gst-plugins-good-0.10.31/0000755000175000017500000000000011720565300012056 500000000000000gst-plugins-good-0.10.31/NEWS0000644000175000017500000042101111720564543012504 00000000000000This is GStreamer Good Plug-ins 0.10.31, "Faster" Changes since 0.10.30: * audioparsers: propagate downstream caps constraints upstream * ac3parse: add support for IEC 61937 alignment and conversion/switching between alignments * ac3parse: let bsid 9 and 10 through * auparse: implement seeking * avidemux: fix wrong stride when inverting uncompressed video * cairotextoverlay: add a "silent" property to skip rendering; forward new segment events * deinterlace: add support for deinterlacing using buffer caps/flags (as set by e.g. fieldanalysis) * deinterlace: new fieldanalysis-related properties: "locking" and "ignore-obscure" * directsoundsink: fix negotiation/device setup: 16-bit audio is signed, 8-bit is unsigned * effecttv: fix reverse negotiation; repair color modes in radioactv by taking rgb,bgr into account * equalizer: also sync the parameters for the filter bands * flacdec: better timestamp/offset handling; try upstream first for duration queries * flacdec: send EOS when seeking after the end of file instead of failing * flacenc: do not drop the first data buffer on the floor * flacparse: detect when a file lies about fixed block size; ignore invalid minimum_blocksize * flacparse: more accurate/better duration/timestamp handling * flvdemux: better timestamp handling (negative cts, detect large pts gaps; fix discontinuity threshold check when timestamps go backwards) * flvmux: properly determine final duration; metadata/header writing fixes * gdkpixbufsink: fix inverted pixel-aspect-ratio info on pixbufs * jack: add "client-name" property to jackaudiosink and jackaudiosrc * jpegdec: add sof-marker to template caps, so we don't get plugged for lossless jpeg * jpegdec: Implement upstream negotiation * matroskademux: seeking fixes; better handling of non-finalized files * matroskademux: better timestamp/duration handling, fix some stuttering A/V * matroskademux: add "max-gap-time" property to make gap handling configurable * matroskademux: UTF-8 subtitles may have markup * matroskamux: do not use unoffical V_MJPEG codec id * matroskamux: fix segment handling, so we actually use running time * matroskamux: for streaming files, push tags first * matroskamux: handle GstForceKeyUnit event * multifile: new splitfilesrc element to read multiple files as if they were one single file * multifilesrc: add "loop" property * multifilesink: handle buffer lists, useful to keep groups of buffers (GOPs) in the same file * multifilesink: add flag to cut after a force key unit event * multifilesink: add "max-files" property * multifilesink: add new 'max-size' mode and "max-file-size" property for switching to the next file based on size * multifilesink: write stream-headers when switching to the next file in max-size mode * multipartdemux: Add property to assume a single stream and emit no-more-pads * multipartmux: Add \r\n to tail of pushed buffers * navseek: toggle pause/play on space bar * osxvideo: Fix leak of NSOpenGLPixelFormat object * pcmadepay,pcmudepay: allow variable sample rate * pngenc: increase arbitrary resolution limits * pulse: Drop support for PA versions before 0.9.16 (1.x is recommended) * pulse: new pulseaudiosink element to handle format changes (not autoplugged yet) * pulsesink: add support for compressed audio format passthrough (S/PDIF, mp3-over-bluetooth) * pulsesink: Allow writes in bigger chunks * pulsesink: Use the extended stream API if available * pulsesrc: add a "source-output-index" property; implement GstStreamVolume interface * qtdemux: better fragmented support (avoid adjustment for keyframe seek; mark all audio track samples as keyframe) * qtdemux: parse embedded ID32 tags; improve bitrate guessing/extraction * qtdemux: push mode fixes, fix buffered streaming * qtmux: add direct dirac mapping * qtmux: calculate average bitrate for streams * qtmux: fix ctts generation for streams that don't start at 0 timestamps * qtmux: use GST_TAG_IMAGE for coverart too * ismlmux: Use iso-fragmented as variant type (useful in connection with encodebin) * rtph263ppay: implement getcaps following RFC 4629, picks the right annexes * rtph263ppay: set H263-2000 if thats what the other side wants * rtph264depay: complete merged AU on marker bit (thus reducing latency) * rtph264depay: cope with FU-A E bit not being set (caused by buggy payloaders) * rtph264depay: exclude NALu size from payload length on truncated packets * rtph264pay: proxy downstream caps restrictions (converting profile-level-id from RTP caps into video/x-h264 style caps) * rtph264pay: only set the marker bit on the last NALU of a multi-NALU access unit * rtpjpegpay: add support for H.264 payload in MJPEG container * rtpjpegpay: fix for "odd" resolutions not a multiple of DCTSIZE * rtpmp4adepay: fix output buffer timestamps in case of multiple frames * rtpmp4gdepay: improve bogus interleaved index compensating * rtpmp4vpay: deprecated send-config property and replace by config-interval * rtppcmapay/depay: static clock rates on static payloads, dynamic on dynamic * rtpvrawpay,-depay: RGB video payloading/depayloading fixes * rtpg722pay: Compensate for clockrate vs. samplerate difference * rtpbin: allow configurable rtcp stream syncing interval * rtpbin: new "rtcp-sync" property, alternative inter-stream syncing methods * rtpjitterbuffer/rtpbin: relax dropping rtcp packets; misc other fixes * rtpmanager: don't reveal the user's username, hostname or real name by default * rtpsession: process received Full Intra Requests (FIR) * rtpsession: add special mode to use FIR as repair as Google does * rtpsession: send FIR requests in response to key unit requests with all-headers=TRUE * rtpsession: always send application requested feedback in immediate mode * rtpsession: put the PLI requests in each RTPSource * rtpsession: wait longer to timeout SSRC collision * rtspsrc: implement async network I/O * rtspsrc: allow sending short RTSP requests to a server * rtspsrc: configure rtcp interval if provided * rtspsrc: open on play and pause when not done yet * shout2send: send video/webm through libshout * soup: new souphttpclientsink element * udpsrc: drop dataless UDP packets * v4l2: take care not to change the current format where appropriate * v4l2src, v4l2sink: add "norm" property; default to a pixel-aspect-ratio of 1/1 * v4l2src: do not ignore the highest frame interval or the largest resolution * v4l2src: handle some feature query failures more gracefully * videobox: avoid wrapping opaque to transparent * wavenc: Allow setcaps to be called after a format was negotiated if it's compatible * ximagesrc: add "xid" and "xname" properties to allow capturing a particular window * ximagesrc: fallback to non-XShm mode if allocating the XShm image failed * ximagesrc: clear flags on buffer reuse, so that flags like DISCONT aren't set accidentally Bugs fixed since 0.10.30: * 668320 : rtpmanager: RTCP receiver reports reveal full user name * 652727 : multifilesrc: add ability to loop * 657422 : [souphttpsrc] The souphttpsrc plugin doesn't work behind a proxy that requires authentication * 432612 : [matroskamux] doesn't handle segments correctly * 541215 : [avimux] Dirac muxing is broken and results in A/V sync issues * 546932 : [ximagesrc] allow recording of specific window only * 571400 : RTSP blocks in gst_element_set_state( GST_STATE_PAUSED ) and incorrect url * 576524 : rtpbin, jitterbuffer: add mode to support for recording RTP streams * 586450 : [cairotextoverlay] Forward upstream events to both sinkpads * 595055 : [pulsesrc] Should implement GstStreamVolume interface * 605834 : directsoundsink: 16-bit audio is always signed while 8-bit is always unsigned * 610916 : rtspsrc dosen't work under windows * 614803 : v4l2: add tv-norm property * 616686 : multipartdemux: add " single-stream " property to emit no-more-pads earlier * 616936 : [matroskademux] Incorrect display of subtitles with markup * 619548 : qtdemux: Guess bitrate if only one stream's bitrate is unknown * 619590 : [matroskademux] Doesn't protect segment and other fields from concurrent changes from different threads * 620186 : qtdemux: Export max bitrate for AMR-NB/-WB streams * 622412 : [rtpmp4vpay] remove send-config parameter; obsoleted by config-interval * 624887 : pitivi playback hangs / errors while playing mov clips on clip change * 630456 : [ximagesrc] Fallback to non-XShm mode if image allocation fails * 631430 : [flvdemux] Cannot play .flv to the end * 632504 : [rtspsrc] reduce or avoid (network) hang during shutdown * 634093 : RTSP client asks for unicast from multicast only server * 638300 : v4l2src: make this work more than once in a row * 639217 : udpsrc: allow skip-first-bytes of full buffer size * 640323 : [cairotextoverlay] forward new segment events from the sink to the source * 643847 : deinterlace: Add support for deinterlacing using buffer caps/flags * 644151 : [multifilesink] Add option to create a new file after each GstForceKeyUnit event * 644154 : [matroskamux] Force a new cluster after each GstForceKeyUnit event * 644512 : [auparse] Add seeking * 647540 : autoaudiosink picks element to use by rank, but pulsesink/alsasink/jackaudiosink are all PRIMARY * 648312 : [v4l2sink] Unconditionally accepts video/mpegts * 648642 : rtpsession: Ensure ssrc collisions aren't timed out immediately * 648937 : matroskademux: avoid building index when streamable * 649067 : v4l2src: got unexpected frame size of 262254 instead of 614400 * 649617 : [rtp] Deadlock and other fixes for rtpssrcdemux * 649780 : flac: seek beyond end fails instead of EOSing immediately * 649955 : flvmux: add support for mpegversion 2, which is also AAC * 650258 : matroskademux/matroskaparse: gst_element_query_duration returns wrong value for Matroska files * 650313 : ac3parse: Add support for iec61937 alignment * 650503 : [dvdemux] Broken DURATION query handling * 650555 : [aacparse] AAC profiles needed in caps * 650691 : [flacparse] regression playing some flac files * 650714 : [amrparse] skips first few frames (problem in checking sync) * 650785 : [flacparse] duration query in DEFAULT format failing with flacparse in pipeline (regression) * 650877 : matroska: refactor code common to matroskademux and matroskaparse * 650912 : Rare leak in qtdemux * 650916 : REGRESSION: ssrcdemux causing FLOW_NOT_LINKED * 650937 : deinterlace: fix parameter type in trace * 651059 : rtspsrc: uniform unknown message handling * 651443 : multifilesink: add next-file=max-size mode and max-file-size property * 652195 : matroskademux: seeking in non-finalized matroska files does not work correctly * 652286 : matroskaparse: Gstreamer-CRITICAL when changing state from PAUSED to READY * 652467 : matroska: missing < stdio.h > include for sscanf * 653080 : matroskamux: make check for block_duration less sensitive * 653091 : [dv1394src] Make the internal clock thread-safe * 653327 : configure script for gst-plugins-good selects shout2 when it's not present * 653559 : aacparse: too greedy minimum frame size * 653709 : [ximagesrc] sets DISCONT on half the buffers * 654175 : matroskademux: handle blocks with duration=0 * 654379 : matroskamux: make default framerate optional per stream * 654583 : Immediate RTCP in rtpsession * 654585 : rtpmp4gdepay choppy sound * 654744 : matroskademux: fix aspect ratio if header has only onle display variable set * 654749 : goom: unbreak build on PPC on openbsd * 654816 : [rtspsrc] rtspsrc doesn't get eos if it's wrapped into a bin * 655530 : Logitech B990 HD Webcam yields poor video in MJPEG mode. * 655570 : qtdemux: assertion error when playing Apple Trailers * 655805 : Make the extended RTSP headers optional * 655866 : jackaudiosink: Don't call g_alloca in jack_process_cb * 655918 : qtdemux : qtdemux_add_fragmented_samples return error. * 656104 : v4l2src fails to correctly configure the framerate * 656606 : crash in gst_spectrum_reset_message_data() * 656649 : flacparse: fix off by one in frame size check * 656734 : [aacparse] Assumes 1024 samples per frame * 657080 : aacparse: failing test due to two buffers being dropped for one sync loss * 657179 : pulse: New pulseaudiosink element to handle format changes * 657376 : rtspsrc regression * 657830 : multiudpsink: make add/remove/clear/get-stats action signals * 658178 : udpsrc: rough error reporting when using an invalid URI * 658305 : [souphttpsrc] can’t seek during double speed playback * 658419 : Add FIR support to rtpsession * 658543 : [v4l2src] Use GST_RESOURCE_ERROR_BUSY if webcam is already used * 658546 : ac3parse: RealAudio file with AC-3 audio no longer plays * 659009 : [matroskademux] property for configuring gap handling * 659065 : navseek: toggle pause/play on space bar * 659153 : matroskademux: fix stuttering A/V * 659237 : [gstrtpbin] clock is not unreffed after finish using it * 659242 : [matroskademux] Unexpected EOS when seeking on paused matroska file * 659798 : Segfault when you convert with audioconvert from audio file mkv to audio file avi * 659808 : matroskademux: misc fixes * 659837 : matroskamux: unable to mux audio/x-raw-int,rate=8000,channels=1,endianness=1234,width=16,depth=16,signed=true * 659943 : [ac3parse] it does not correcly check for ac3/e-ac3 switch * 660249 : won't play wav file: invalid WAV header (no fmt at start): ID32 * 660275 : jpegdec doesn't implement upstream negotiation * 660294 : goom2k1: Fix mingw compiler warnings * 660448 : videomixer2: memory leak * 660468 : speexenc: fix calculation of filler data size * 660481 : v4l, ximagesrc: printf format warnings * 660969 : qtmux memleak * 661049 : matroskademux: support seek with start_type NONE * 661215 : flacparse: fix last frame timestamp in fixed block size mode * 661400 : rtpg722pay: G722 rtptime too fast * 661477 : flvdemux: negative cts causes uint overflow, resulting in sinks waiting forever * 661841 : [edgetv] video artifacts if videorate placed after edgetv * 661874 : aacparse fails to forward caps to encoder * 662856 : cairotextoverlay: add a 'silent' property to skip rendering * 663186 : taginject is not gap aware * 663334 : gst/flv/: add amfdefs.h to noinst_HEADERS * 663580 : v4l2src negotiation failure with weird pixel-aspect-ratios * 664548 : matroskaparse: memleak * 664792 : Staircase effect in M-JPEG over RTP with unaligned image dimensions.. * 664892 : [matroskademux] Doesn't set caps properly * 665387 : v4l2src: fix stepwise enumeration ignoring the highest values * 665412 : matroskamux: jpeg muxing regression * 665502 : [flvdemux] broken a/v sync for some files * 665666 : multifilesink: GstMultiFileSinkNext not documented * 665872 : jackaudiosink, jackaudiosrc: add " client-name " property * 665882 : gdkpixbufsink: " pixel-aspect-ratio " is the inverse of what it should be * 665911 : Ability to specify ignore-length in wavparse * 666361 : playbin2: regression: visualisations don't work with pulseaudiosink * 666583 : matroskademux: too many bus messages in streamable mode * 666602 : ac3parse: no valid frames found before end of stream (unexpected bsid=10) * 666644 : udpsrc: infinite loop on dataless UDP packets * 666688 : jpedec: peer_caps leak * 666711 : rtspsrc: hostname lookup is not thread safe * 667419 : matroskamux memleaks * 667818 : osxvideo: Fix leak of NSOpenGLPixelFormat object * 667820 : rtpptdemux: Plug potential pad leak. * 667846 : rtph264depay: Exclude NALu size from payload length on truncated packets. * 668648 : gst-plugins-good does not compile: cairo cannot find libgstvideo-0.10 * 669455 : V4l2src can't open webcamstudio new vloopback * 669590 : [shout2send] support webm streaming * 670197 : v4l2src: webcam doesn't work due to fatal error when querying color balance attributes * 650960 : flacparse makes decoded flac files start at sample offset 9215 * 659947 : souphttpsink: rename to souphttpclientsink? * 658659 : qtmux: Fix ctts entries for streams that don't start with timestamps from 0 Changes since 0.10.29: * work around GLib atomic ops API change * better handling of malformed buffers in RTP depayloders * some minor compilation fixes Bugs fixed since 0.10.29: * 650470 : rtp: some depayloaders break with malformed rtp packets * 652144 : udp: fix compiler warning on mingw-w64 Changes since 0.10.28: * audioparser: new amrparse, aacparse, ac3parse, flacparse, mpegaudioparse, dcaparse elements * audiowsincband: Add new windowing functions: gaussian, cos and hann * audiowsincband: Fix range of kernel elements (lim -> lim-1) * audiowsinclimimt: Add new windows to high/low-pass filters: gaussian, cosine, hann * audiowsinclimit: Fix range of kernel elements (lim -> lim-1) in high/low-pass filters * avidemux: also add the frame-type for the stream index. * avidemux, flvdemux: mark delta-units in the index * avidemux: stream->current_total is accumulated byte size and not time * avimux: add stream-format field to h264 pad template caps * avimux: rework _request_new_pad to handle explict req-pad-names * avimux: use running time for synchronization * cairooverlay: Add generic Cairo overlay video element. * debugutils: remove bitrotten negotiation element * deinterlace: add support for NV12 and NV21 formats; fix greedyl method * dvdemux: first try if upstream handles TIME seeks before handling them here and other event handling fixes * flacdec: fix issues with large metadata blocks when streaming unframed flac * flacenc: Add support for writing METADATA_BLOCK_PICTURE blocks for GST_TAG_IMAGE and GST_TAG_PREVIEW_IMAGE * flacenc: Don't store image tags inside the vorbiscomments and the flac metadata * flvdemux: add width, height and framerate to caps when present on onMetaData * flvdemux: Do not build an index if upstream is not seekable * flvdemux: fix deadlock on setting index on flvdemux * flvmux: don't overwrite metadata tag with duration in streaming mode * flvmux: don't set duration for live stream * flvmux: use running time for synchronization * flv: specify stream-format for h264 in the pad template caps * icydemux: fix tag list handling issues that might have caused crashes * j2kpay: skip EPH packets * jitterbuffer: also estimate eos if very near eos * jitterbuffer: avoid trying to buffer more than is available * jitterbuffer: handle position query * matroskademux: better calculation of output framerate * matroskademux: properly resume cluster scanning * matroskademux: pull mode should always report seekable * matroskademux: set stream-format=byte-stream on h264 caps if there's no codec data * matroskademux: store cluster positions provided by SeekHead * matroskamux: add support for A-Law and µ-Law * matroskamux: avoid building index when streamable * matroskamux: use running time for stream synchronization * matroskamux: add stream-format field to h264 pad template caps * matroska: Use ARTIST Matroska tag instead of AUTHOR for GST_TAG_ARTIST * matroskaparse: new element * monoscope: stability (off-by-one) and memory leak fixes * pngdec: handle 16-bit-per-channel images * pulsesink: also uncork during EOS waiting (and after EOS is rendered) * pulsesink: fix deadlock if connecting to PA fails * pulsesink: release pa_shared_resource_mutex before pa_threaded_mainloop_wait * qtdemux: Adds more h264 fields to its caps * qtdemux: Add support for 2Vuy and r210 * qtdemux: don't error out when there's a problem parsing non-vital headers * qtdemux: avoid skipping exposing a stream following a removed stream * qtdemux: Check for invalid (empty) classification info entity strings * qtdemux: extract MusicBrainz tags * qtdemux: mind rounding issues when converting from global time to mov time * qtdemux: propagate error during expose_streams * qtdemux: support some more mpeg-4 fourcc variants * qtdemux: take configured start time into account * isomp4: move mp4mux/3gppmux/qtmux from -bad to -good, rename qtdemux plugin to isomp4 * rtpbin: Don't try to request the same request pad twice * rtpbin: fix setting the SDES property * rtpbin: Get and use the NTP time when receiving RTCP * rtpmanager: ignore a BYE if it is sent with our internal SSRC * rtpptdemux: Tag upstream custom events with payload type * rtpsession: add action signal to request early RTCP * rtpsession: add "rtcp-min-interval" property for minimum interval between Regular RTCP messages * rtpsession: Don't relay more than one PLI request per RTT * rtpsession: Emit "on-ssrc-validated" when validating by RTCP * rtpsession: Emit signal on incoming RTCP feedback packet * rtpsession: Emit signal when sending a compound RTCP packet * rtpsession: Implement sending PLI packets in response to GstForceKeyUnit * rtpsession: Number of active sources should be updated whenever the status of the source changes to active * rtpsession: Send GstForceKeyUnit event in response to received RTCP PLI * rtpsource: Retain RTCP Feedback packets for a specified amount of time * rtpssrcdemux: Tag upstream custom events with SSRC * rtpssrcdemux: Unknown SSRC is not fatal * rtpspeexpay: Do not transmit samples with GAP flag * rtptheoradepay: Request new keyframe on lost packets * rtpvrawpay: add support for interlaced video * rtspsrc: distribute new base_time to manager children following flush seek * rtspsrc: handle * control correctly * rtspsrc: improve recovery from failed seek * spectrum: miscellaneous optimisations, add multi-channel support * speexdec: Always process the number of frames per packet as specified in the header * speexdec: get and use streamheader from the caps if possible * speexenc: Use speex intern silence detection * theorapay: handle 0-sized packets (which are repeat frames) * udpsink: warn when packet is too large * v4l2: Add PJPG mapping * v4l2: fix interlaced set_format configuration * v4l2: new v4l2radio element to control analog radio devices * videobalance: fix handling of YUV images with 'odd' widths * videoflip: add support for YUY2, UVYV and YVYU * videoflip: fix invalid memory access for odd resolutions and Y422 * videomixer2: Add transparent background option for alpha channel formats * videomixer: Add transparent background option for alpha channel formats * videomixer: Fix argb/rgba overlay orc code * wavparse: tune output max buffer size to material Bugs fixed since 0.10.28: * 564122 : Crash in monoscope_update * 432612 : [matroskamux] doesn't handle segments correctly * 593482 : Spectrum: Multi-Channel support and Stereo to Mono compat report(cross-correlation) * 595520 : Implement a generic cairo overlay * 622553 : rtpmanager: Implement RFC 4585 (AVPF / early feedback) * 636699 : [PLUGIN-MOVE] qtmux: move to -good * 639994 : videomixer2: added 'transparent' background option * 640118 : v4l2: add element to control radio devices * 640163 : rtspsrc: minor leak * 640249 : [taginject] Taginject does not allow to change tags after init * 640483 : flvdemux: Video's width, height and/or framerate src caps added when present on onMetaData * 640542 : matroskamux leaks memory after reset * 641330 : icydemux: crash while playing MP3 stream in amarok * 641332 : can't connect vorbisenc ! queue ! matroskamux * 641400 : [deinterlace] Handle image caps without asserting * 641827 : rtptheorapay: doesn't handle 0-size packets * 642205 : qtdemux: extract MusicBrainz tags * 642337 : [souphttpsrc] Add support for URI queries * 642412 : gstrtpbin with ignore-pt tries to use NULL stream- > demux during uninitialization * 642691 : deinterlace: Miscellaneous cleanup * 642879 : qtmux: add a 'variant' with the bare video/quicktime media type * 642961 : NV12 colorspace support for deinterlace plugin * 642963 : [dvdemux] time based upstream seek * 643087 : pulsesink: deadlock in gst_pulseringbuffer_open_device * 643981 : [cairooverlay] example uses gtk/gtk-x11 unnecessarily * 644288 : generic/states check fails * 644477 : [jack] doesn't build with jack > = 0.120.2 * 644510 : pulsesink: deadlock when create/connect fails * 644669 : gstspeexdec causes 'Conditional jump depends on uninitialised value' * 644773 : Add support for Y422 colorspaces in videoflip element * 644849 : [speexdec] Remove warning message when it is inappropriate * 644875 : [matroskademux] can't read the ARTIST tag in a Matroska file * 645858 : [flvdemux] memory leak when demuxing infinite FLV files * 645961 : [pulsesink] hangs when going from paused to playing near EOS * 646397 : rtpjitterbuffer base_time broken by commit f84b8a69 * 646474 : rtpspeexpay should drop empty samples * 646567 : [matroska] Add alaw/mulaw audio support * 646800 : rtspsrc: control attribute on the session and not on the media * 646954 : rtpgstpay: declare frag_offset to hold 32 bits * 646964 : rtpmanager: ignore a BYE if it is sent with our internal SSRC * 646965 : rtpmanager: Number of active sources should be updated whenever the status of the source changes to active * 646966 : rtpssrcdemux: Unknown SSRC is not fatal * 646967 : rtpsession: make iterate_internal_links MT-safe * 646999 : [regression] pulsesink: underruns while playing WMA * 647263 : REGRESSION: rtpsession: fix wrongly applied patch * 647510 : audiowsinclimit uses the wrong limits for the range of the kernel elements * 647511 : add other common windows to low/high-pass filters in audiowsinclimit.c * 647659 : mp3parse / mpegaudioparse fails to detect VBRI header in mpeg1 mono and mpeg2 files * 647833 : matroskademux: bad at guessing the framerate * 647848 : Failure to compile with GCC 4.6.x due to variable unused but set warnings being treated as errors * 647919 : qtmux: silently corrupts h264 streams with legacy caps * 648004 : [quicktime] Rename plugin library to quicktime too * 648160 : Remove half-complete bits of RTCP FIR support * 648589 : jpegdec: documentation typo " jpegddec " * 649060 : flvmux: overwrites metadata tags with duration in streamable=false mode * 649449 : [gppmux] Failure to write location * 566769 : [flacdec] crash in push mode with large header packet (image) * 644730 : [matroskamux] Should return TRUE in the event function when the event is handled Changes since 0.10.27: * Fix build issue with new kernels (with the old video4linux1 interface header removed) Bugs fixed since 0.10.27: * 643716 : v4l2src: fails to build with newer kernels: ./v4l2_calls.h:33: fatal error: linux/videodev.h: No such file or directory 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: * 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 Bugs fixed since 0.10.25: * 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 Changes since 0.10.24: * v4l2src: massive performance improvement in many cases * streaming mode fixes for avi and matroska/webm * seeking in matroska and webm files that don't have an index * new cpureport element for debugging * avidemux: improve VBR audio stream handling * avidemux: streaming mode fixes: use proper offset for movi-based index, handle 0-size data chunks * debugutils: new element cpureport, posts "cpu-report" element messages on bus * flacdec, rtspsrc, rtph264pay, rtpmp4vdepay: memory leak fixes * gconfvideosrc: use correct GConf key (ie. not the audiosrc key) * gdkpixbuf: remove gdkpixbuf3 plugin again, gdk-pixbuf was split out of gtk+ and will stay at 2.x * id3v2mux: write beats-per-minute tag using TBPM frame * jpegdec: fix markers parsing regression * matroskademux: do not error out on a block with unknown tracknumber * matroskademux: fix streaming in case where the size in bytes is unknown * matroskademux: handle bogus files storing ADTS AAC data * matroskademux: support seeking in local files even if they don't have an index * matroskamux: don't try to seek back and fix up headers if streamable=TRUE * pulsesink: fix race when creating multiple pulsesinks at the same time * qtdemux: also calculate PAR using track width and height for QT files * qtdemux: fix the max/avg in btrt atom reading * qtdemux: improve reverse playback * qtdemux: parse 64-bit version of mvhd atom as well instead of erroring out * qtdemux: prevent reading past avc1 atom when parsing * rtpg729pay: avoid basertppayload perfect-rtptime mode * rtph263pdepay: allow more clock-rates as input * rtpL16depay: also parse encoding-params for the number of channels * rtpL16depay: default to 1 channel if number of channels not specified * rtpmp4gpay: implement perfect timestamps * rtspsrc: add "port-range" property, useful for setups with firewall/ipsec * rtspsrc: don't reuse udp sockets (avoids odd errors when data from previous streams is received) * udpsrc: add "reuse" property to enable or disable port reuse (enabled by default, but disabled in rtspsrc) * v4l2: sort formats in the right order so that non-emulated formats are prefered * videobalance: fix wrong locking order that could lead to a deadlock * videomixer: only reset QoS information and send a NEWSEGMENT event downstream for NEWSEGMENT events on the master pad Bugs fixed since 0.10.24: * 626463 : [matroskademux] " reading large block of size 14688496 not supported " * 593117 : [avidemux] Support AVF files * 618535 : [avidemux] fails to stream eva_2010_2.22_promo1.avi * 621520 : [id3v2mux] write beats-per-minute tag * 622017 : [GstRtpMP4GDepay] Packet payload was too short. * 622577 : rtspsrc has confusing error messages * 623209 : bug in rtpL16depay * 623357 : avidemux: push mode doesn't work for some http streaming avi files * 623629 : Reverse Playback Issue in QtDemux * 624173 : [qtdemux] qt file with dimension data in tkhd does not get pixel-aspect-ratio in caps * 624331 : videobalance: deadlocks/freezes when changing " brightness " property * 624455 : The matroska muxer seeks even when used with streamable=TRUE * 624770 : rtspsrc: memory leak in gst_rtspsrc_handle_request * 625002 : [examples] Don't use GdkDraw * 625153 : rtspsrc: add property to set client port range * 625302 : [qtdemux] Set the pixel-aspect-ratio field also for par=1/1 * 625371 : [matroskademux] critical warnings when playing live webm with progressive download enabled * 625442 : pulsesink: crash - pa_threaded_mainloop_stop is called from the pa thread * 625452 : [videomixer] Pipeline from the docs doesn't work anymore * 626467 : matroskademux: CRITICAL **: file matroska-demux.c: line 578 (gst_matroska_demux_get_length): should not be reached * 626609 : [qtdemux] segfault when parsing avc1 atom * 626619 : [imagefreeze] Incorrect seek behaviour * 627689 : [deinterlace] Broken timestamps * 617368 : [matroska] Implement push-mode seeking and non-cue seeking Changes since 0.10.23: * Use Orc (Optimized Inner Loops Runtime Compiler) for SIMD and other optimisations, and remove liboil dependency. The main goal for this release was to make the transition from liboil to liborc. Performance improvements should not be expected and will be the focus of future versions. liborc is an optional dependency for the time being, to make it possible to test and develop the very latest GStreamer versions on systems that don't have orc yet. However, without orc slow unoptimised backup code will be used for many performance critical code paths. Distributors are urged to package and ship the latest version of liborc and compile GStreamer modules with --enable-orc. Please do not distribute GStreamer packages that are not orc enabled. More information on the orc integration can be found in the docs/design/ directory. * alpha: add "prefer-passthrough" property to allow passthrough mode * avidemux: improve audio vbr detection * cmmlenc: Remove hack to let oggmux start a new page for every CMML buffer * deinterlace: add mmx implementations of greedyh for UYVY; orcify some deinterlacing methods * dv1394: fix the internal clock even more * flvmux: add "streamable" property * flvmux: write duration at the correct position * gdkpixbuf: Add a gdkpixbuf3 plugin that uses gdkpixbuf3 * jpegdec: improved parsing, and better buffer handling that minimises memcpys * jpegdec, jpegenc: add grayscale support * matroskademux: QoS fixes and improvements; reverse playback improvements * matroskademux: handle zero-sized numbers correctly * matroskamux: add "streamable" property; set streamheaders on output caps * matroskamux: try harder to make sure clusters start with a key frame * matroskamux: mark output buffers properly as keyframe or delta unit * matroskamux: do some write caching to avoid newsegment events before each output buffer * matroskamux: fix some timestamp drift caused by rounding errors * pngenc: Support 8 bit grayscale * pulsesink: optimize communication with PulseAudio using pa_stream_begin_write * pulsesink: Post provide-clock message on the bus if the clock appears/disappears * rtph264depay: consider SPS, PPS and IDR as keyframe, all others as DELTA_UNIT * rtph264pay: handle short startcodes in the h264 bytestream * rtpjitterbuffer: stop buffering and emit EOS at the end of a stream * rtpmparobustdepay: add mpa-robust depayloader * rtpmp4gdepay: calculate the frame duration correctly * rtptheorapay: keep announcing the delivery-method in the capabilities, restores compatibility with older farsight versions again * rtspsrc: respect aggregate control attributes; try all ranges from the sdp * spectrum: support 24-bit width and arbitrary bit depth * udp: make url parsing compatible with VLC syntax * udpsrc: fix multicast support on windows * v4l2sink: destroy buffer pool when changing state to NULL * videobox: fix negotiation for I420/YV12 * videomixer: don't mix input with different pixel aspect ratios; negotiation fixes * wavparse: proper closing segment construction when doing non-flushing seeks * wavparse: use typefind functions to check if PCM data contains dts stream Bugs fixed since 0.10.23: * 619045 : [spectrum] Add support for 24-bit width and all depth combinations * 555967 : [oss4] clarify some translation strings * 570761 : [goom] crash in plugin_info_init allocating 260kB struct on stack * 583047 : [jpegdec] optimise buffer handling when parsing frames * 589997 : [rtp] need mpa-robust depayloader for helix-style MP3-DRAFT-00 * 595978 : [udpsrc] failed to play a multicast stream * 597695 : [udpsrc] support VLC-style udp://239.255.11.11:1234 uri with bind address * 611117 : [matroskademux] can't handle unknown cluster sizes * 613066 : [flvmux] re-enable renamed/fixed is-live property * 615461 : dv1394src clock continues to be broken * 617339 : pulsesink doesn't make use of pa_stream_begin_write * 618530 : [videomixer] Doesn't handle pixel-aspect-ratio correctly * 618871 : 1394: remove useless last_time * 618982 : [wavparse] wrong closing segment when doing non-flushing seek * 619198 : [matroskademux] GstEbmlRead cleanup * 619273 : [matroskamux] reduce downstream spam * 619293 : [avimux] clean up avi header creation code * 619531 : [rtspsrc] embedded asx streams' rtsp server doesn't like gstreamer request * 619717 : unit tests fail if older -good plugins are present in system plugin directory * 619824 : Use glib for checksumming * 619848 : [deinterlace] can't switch properties on running pipeline * 620148 : [videomixer] Doesn't negotiate format with downstream * 620154 : [rtph264depay] Seeking with RTP payloaders corrupts images sometimes * 620162 : [gdkpixbufdec] Bump rank to SECONDARY * 620277 : [pulsesink] custom clock is still used after NULL state change * 620358 : [matroskademux] Sorenson Squish WebM output seeking issues * 620390 : rtph264pay doesn't understand short startcodes * 620494 : [rtsp] stuttery audio with some h264/aac streams * 620540 : [pulsesink] pa_stream_write() failed: Invalid argument * 620591 : rtpceltpay doesn't handle stereo celt audio * 620743 : matroskademux: refactor delta unit handling * 620929 : Required libraw1394 version is not high enough * 621510 : GNOME Goal: Remove deprecated glib symbols * 621566 : [pulsesink] since upgrading plugins sound is garbled via Amarok * 621723 : v4l2src crashes on PLAYING- > READY- > PLAYING * 622498 : [avidemux] Doesn't reset all state when going back to READY * 622500 : [v4l2sink] destroy open buffers when changing to NULL * 622501 : [videobox] may negotiate input/output format combinations it can't actually handle * 622816 : Make demos -DSEAL safe * 623103 : matroskamux dispose error * 623172 : [jpegdec] leak in unit test * 623196 : rtpptdemux: don't send custom downstream event twice * 623366 : [qtdemux] strip out bogus tags from XMP * 623379 : [flvmux] Writing duration outside the allocated memory area in streaming mode * 623585 : jpegdec: fails to skip extra 0xff markers at start * 623654 : qtdemux: Fix order of bitrates in 'btrt' atom * 619817 : [matroskademux] Reverse playback doesn't work * 617512 : [alpha] should work in passthrough in all formats if alpha == 1.0 * 619485 : matroskademux: skip buffers before a late keyframe (QoS) * 413942 : [wavparse] undetected dts-in-wav Changes since 0.10.22: * alpha: add support for YUY2, YVYU, UYVY and YV12; YUV->RGB conversion fixes * avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time * avimux, matroskamux: add support for On2 VP8 * capssetter: element moved from gst-plugins-bad * deinterlace: add support for most YUV and RGB formats for some methods * deinterlace: make automatic detection of interlacing the default * gamma: add support for more YUV/RGB formats, make gamma property controllable * jpegdec, jpegenc: support more colour spaces and pixel formats * matroskademux: implement push mode seeking * matroskademux: add support for WebM * imagefreeze: plugin moved from gst-plugins-bad * oss4: plugin moved from gst-plugins-bad * osxvideosink: implement the xoverlay interface, allow switching views at runtime * qcelpdepay: add a QCELP depayloader * qtdemux: add support for VP8; push-mode seeking and ctts table parsing fixes * rtph263depay: use Picture Start Code to detect packet loss and frame start * rtph263pay: use found GOBs to apply Mode A payloading * rtph264depay: DELTA_UNIT marking of output buffers * rtph264pay: extract SPS and PPS from property provided parameter set * rtph264pay: add config-interval property to re-send SPS/PPS in stream * rtpmp4vpay: add config-interval property to re-insert config in stream * rtptheoradepay: fix in-band configuration parsing * rtptheorapay: add config-interval parameter to re-insert config in stream * rtpvorbisdepay, rtptheoradepay: also accept in-line configuration * rtsp: configure bandwidth properties in the session * rtspsrc: fall back to SDP ports instead of server_port * rtspsrc: use the SDP connection info in multicast * rtspsrc: handle SEEKING queries * smptealpha: add support for all 4 ARGB formats and YV12 (converted to AYUV) * videobalance: add support for all RGB formats, Y41B, Y42B and Y444, YUY2, UYVY, AYUV and YVYU * videobox: add support for Y444, Y42B, Y41B, YUY2, UYUV, and YVYU * videobox: fix floating point to integer conversion for the alpha values * videobox: handle ranges/lists of width or height when transforming caps * videobox: translate navigation events to make sense again upstream * videofilter: merge gamma, videobalance, and videoflip plugin into single plu * videoflip: add support for all RGB formats and AYUV, Y41B, Y42B and Y444 * videoflip: also flip the pixel-aspect-ratio if width/height are exchanged * videomixer: add support for Y444, Y42B, Y41B, YV12, YUY2, YVYU, UYVY * webmmux: Add new webmmux element that only supports muxing of WebM * y4menc: add 4:2:2, 4:1:1, and 4:4:4 output support Bugs fixed since 0.10.22: * 619485 : matroskademux: skip buffers before a late keyframe (QoS) * 576286 : [videomixer] Should accept/output non-alpha streams * 618349 : osxvideosink: implement the XOverlay interface * 574416 : rtp{theora,vorbis}depay should accept in-line configuration (too) * 590662 : [pulse] Allocates and starts pulse main loops in instance_init * 592270 : Cannot catch 'have-ns-view' on pipeline for playbin and playbin2 * 599585 : gstrtph263pay does not fragment frame with limited GOBs * 600553 : [jpegdec] crashes on a fuzzed jpeg * 606689 : Re-send codec data on GstForceKeyUnit * 607452 : Failure to sync on rtpmp4vpay stream; sender;receiver mismatch * 609405 : [qtdemux] Issues when seeking with file with lots of tracks and edit lists * 609658 : [rtph264depay] doesn't mark output frames as keyframes correctly * 610172 : inconsistent h263pay/h263depay behaviour * 610902 : y4menc only supports 4:2:0 * 613786 : [PLUGIN-MOVE] Move imagefreeze to gst-plugins-good * 614305 : [PLUGIN-MOVE] oss4 should be moved to good * 614765 : racy stream status leave implementation * 615798 : [smptealpha] Need ability to reverse transition direction * 616516 : [qtdemux] h264 playback gets skippy after a seek * 616700 : [rtspsrc] gst_query_new_seeking() fails on rtspsrc * 617164 : [rtph264pay] SPS/PPS in provided sprop-parameter-sets never sent on timeout * 617537 : rtspsrc always falls back to unicast instead of using the announced multicast * 617733 : [wavparse] handle gst_pad_pull_range() returning less data than requested * 617739 : [PLUGIN-MOVE] Move capssetter to gst-plugins-good * 618305 : [flvmux] last timestamp is stored even if it's invalid * 618351 : avimux crashes when fed from filesrc * 618386 : rtptheoradepay: make delivery-method parameter optional * 618419 : gstrtpbin-Description maybe exist error * 618733 : [efence] Configure check is broken * 618874 : [pulse] regression: broken mainloop locking * 618940 : rtptheorapay/depay wrongly claims to do delivery-method=inline * 619018 : Speex encoder latency should depend on rate * 619103 : WebM demuxer * 619105 : [qtdemux] misalignment between index and sample while looking for frame * 619219 : [matroska] Move webm muxer into a separate element with restrictions * 619835 : [videobox] Either makes video completely opaque or completely transparent * 619943 : [jpegenc] Crash if playing - > setcaps - > ready - > setcaps * 620002 : [flvdemux] Typo in position query handling makes all position queries fail * 605231 : [deinterlace] Support AYUV, RGB colorspaces * 619533 : [avimux, matroskamux, flvmux] crash when receiving tags on multiple pads at the same time Changes since 0.10.21: * alpha: add support for different color matrixes * alpha: add support for generating ARGB output * alpha: add support for ARGB, RGB and xRGB input * alphacolor: support inplace and on-the-fly conversions from AYUV to ARGB * alphacolor: Implement color-matrix support and use integer arithmetic only * videobox: add support for most common RGB(A), (A)YUV, and grayscale formats * videobox: add support for on-the-fly conversions for some formats * videobox: add support for filling the background with red, yellow and white * videobox: add support for YV12, including conversion support for I420/AYUV * videomixer: add support for ABGR and RGBA * shapewipe: add support for the remaining ARGB formats * qtdemux, matroska: export h.264 profile and level in caps * multifilesink: Add key-frame option to next-file * directsoundsink: Implement SPDIF support for AC3 * h264depay: handle STAPs properly * speexdec: adapt to new oggdemux * flvdemux: mark delta frames properly * flvdemux: improve index building and scaning in pull mode * flvdemux: add support for backwards playback (when operating in pull mode) * avidemux: fix offset handling in push mode seeking * matroskademux: prefer index of video track to perform seeking * matroskademux: add support for backwards playback (when operating in pull mode) * matroskademux: push correctly sized flac header buffers * matroskademux: restrict resyncing to subtitle tracks * rtpsession: Make it possible to favor new sources in case of SSRC conflict * rtspsrc: send keep alive when paused * rtspsrc: handle ipv6 listening ports when needed * rtspsrc: require a destination for multicast * rtspsrc: parse connection information * qtdemux: Set stream-format=raw on AAC caps * qtdemux: add XMP parsing support * qtdemux: Read replaygain peak/gain tags * qtdemux: extract stream language in more cases * id3demux: fix parsing of unsynced frames with data length indicator * jpegdec: don't crash if jpeg image contains more than three components * ximagesrc: send new segment event in TIME format * mp4gdepay: improve constantDuration guessing * h264pay: fix config-interval property * rtspsrc: add property to control the buffering method * png: make work with libpng 1.4 Bugs fixed since 0.10.21: * 517588 : [avidemux] Allow seeking in push mode * 593910 : [dv1394src] live streaming / clock issues * 597739 : Test suite not slow-machine-safe(?) * 601236 : [flvmux] script tag with index gets written at end of file, contains all tags * 601617 : matroska-demuxer triggers an assert in gststructure.c * 604870 : [udpsink] Can't set TTL socket option * 607615 : Make it possible to favor new sources in case of SSRC conflict * 610447 : [flvdemux] Be more flexible in script tag (metadata) parsing * 611659 : [ximagesrc] should send new_segment with GST_FORMAT_TIME format * 612397 : [multiudpsink] [PATCH] Fix print of socket's error code on Windows * 612411 : [rtspsrc] lock/performance problem * 612553 : Segfault in rtspsrc (tcp interleaved and local gst-rtsp-server) * 612657 : [rtph264depay] refuse caps without profile-level-id when byte-stream is unset * 612696 : rtspsrc with tcp timeouts after recent commit * 612700 : pngenc can't be built against libpng 1.4.x anymore * 612751 : [udpsink] regression when external sockfd is used * 612777 : Deprecated macro in gstspeexdec.c causes compile error in MSVC * 613002 : [flvmux] always put duration in metadata tag * 613003 : [flvmux] EOS after supposedly reaching FLV timestamp limit, but real limit is lower * 613013 : rtph264pay does not insert config parameters anymore in the stream * 613094 : [flvmux] put more info (like width and height) in the metadata * 613206 : [rtph264depay] wrong timestamp for gst_base_rtp_depayload_push_ts? * 613663 : New warnings in osx plugins * 613789 : [jpegenc] Updating caps is not supported * 614158 : [id3demux] doesn't read tags from file correctly (tag with unsynced frames, data length indicator) * 614353 : matroskademux: can't correctly demux flac-in-MKV * 614354 : fix small compile break if $(top_srcdir) != $(top_builddir) * 614460 : matroskademux: wrong H.264 demux in some file * 614466 : videomixer makes some formats grayscale * 614471 : [qtdemux] Gstreamer not reading replaygain tags from m4a files * 614651 : Export h.264 profile and level in caps * 614765 : racy stream status leave implementation * 614842 : [jpegenc] sink pad returns ANY (not subset of its template) when connected to a filesink * 614843 : [alphacolor] unneeded variable * 614927 : qtdemux: Post avg/max bitrate tags for H.264 * 615051 : h264depay: STAP are handled the wrong way * 615143 : [videobox] I420- > AYUV conversion broken * 615161 : Remove -Wundef from CFLAGS * 615460 : [deinterlace] broken ... * 615996 : doesn't detect HAVE_CPU_I386 or HAVE_CPU_X86_64 properly on Solaris * 615998 : GOOM plugin crashes on Solaris when built with MMX code enabled * 616166 : [videobox] Use correct order for RGB filling * 616409 : [videomixer] AYUV blending broken * 611986 : [cairotextoverlay] Out-of-range deltas give SIGSEGV or other funkyness * 604106 : [jpegdec] Crash in jpeg_idct_ifast if more than 3 components * 614001 : [qtdemux] parse Macintosh language codes * 615793 : [flactag] when used after flacenc: gst_adapter_take_buffer: assertion `nbytes > 0' Changes since 0.10.20: * y4menc commit reverted, since it broke make check (new release since this was only discovered after the 0.10.20 tarball had already been uploaded). Changes since 0.10.19: * Fixes for RTP h263 depayloader timestamping regressions that broke video calls * Fixes for FLAC decoder when FLAC is embedded in a container such as Ogg or Matroska * y4menc now supports more YUV pixel layouts * rtpsource: bitrate estimation improvements * rtspsrc, udp: multicast fixes Bugs fixed since 0.10.19: * 532117 : [matroskamux] Doesn't update the track duration * 610959 : [flacdec] certain flac-in-ogg file only plays after long delay * 611213 : [rtpsource] estimate bitrate on receiver side * 612154 : rtph263depay removes all timestamps from outgoing buffers Changes since 0.10.18: * shapewipe: moved from -bad to -good * avidemux: push mode seeking support * avidemux: drop video frames up to the desired keyframe after a seek * configure: cross-compilation fixes (use $PKG_CONFIG instead of pkg-config) * dvdepay: don't output frames until we have a header, fixes crash * flacdec: fix tag extraction in push mode * flvdemux: obtain the index from the end of an flv file in push mode * flvdemux: audio tags without any content are valid; indexing improvements * jpegdec: fix invalid memory access in parser * jitterbuffer: new buffering modes: low/high watermark buffering, rtp timestamps * matroskademux: seeking/segment fixes (esp. regression with gnonlin) * matroskademux: subtitle stream improvements (advance sparse streams in smaller steps) * multipartdemux: improve header mime-type parsing * qtdemux: fix ALAC codec-data handling; handle signed values in 3GPP location tag * qtdemux: fix frame rate cap regression; fix sample durations corner-case * qtdemux: Use the correct duration when comparing segments * pulsesink: avoid segfault when shutting down * pulsesink: return previous mute state if sink is not active at the moment * rtpbin: change how NTP time is calculated in RTCP, generating more accurate NTP timestamps if the system clock is synchronised with NTP or similar * rtpmp4gdepay: avoid division by 0 in corner case * v4l2sink: change rank to NONE so we don't try to autoplug it * videomixer: fix timestamping problems for input streams with different lengths * videomixer: fix problem when used with gnonlin (always send FLUSH_STOP) Bugs fixed since 0.10.18: * 584536 : [PLUGIN-MOVE] Move shapewipe to -good * 587304 : [jitterbuffer] don't handle correctly data burst from udpsrc * 599292 : Synchronizing two RTP streams from different devices using RTCP is inaccurate. * 604711 : Handling of mime type in multipartdemux * 608026 : [videomixer] timestamping problems * 608843 : [flacdec] Can't read tags in push mode * 610004 : GST_CXXFLAGS should contain GST_CFLAGS * 610053 : matroska fails to build with Sun Studio * 610238 : Avoid an assertion in the rtspsrc element which abort the client application * 610265 : gstrtpmp4gdepay issuing a SIGFPE crashing an application * 610280 : [qtdemux] issue with corrupted 3gp file * 610296 : [qtdemux] Confusion with gst/qt segments * 610337 : pulsesink: gst_pulsesink_get_mute: set result earlier. * 610483 : [jpegdec] invalid memory access * 610556 : Memory violation when starting to decode a running DV PAL RTP stream * 610839 : Unable to cross compile gst-plugins-good * 610894 : send FLUSH_STOP after FLUSH_START in videomixer * 611501 : [regression] matroskademux fails to output anything on some seeks * 609724 : Add translator comment for %s in pulsesink Changes since 0.10.17: * v4l2src: implement GstURIHandler interface * matroskamux: make index size configurable * matroskademux: support push based mode * matroskademux: improve stream synchronization * flacdec: fix possible hanging in pull mode seeking * flacdec: use a single decoder field for both push and pull mode * flacenc: optionally add a seek table * rtp: add BroadcomVoice payloader and depayloader * rtp: add G.723 payloader and depayloader * rtph264pay: add option to insert PPS/SPS in streams * rtph264depay: optionally merge NALUs into Access Units * rtspsrc: add user-id and user-pw properties; fix major memory leak * avimux: many fixes, also better compatibility with Windows Media Player * avidemux: per-stream index parsing (= much faster startup) * qtdemux: progressive download support / seeking in push mode * qtdemux: per sample parsing (= much faster start up) * wavenc: Post warning if file hasn't been finalised properly * videomixer: MMX optimisations and other improvements; implement basic QoS * matroska, qtdemux, id3demux: fix language code writing and extraction Bugs fixed since 0.10.17: * 609405 : [qtdemux] Issues when seeking with file with lots of tracks and edit lists * 503582 : [avidemux] Extract date tag (contained in the IDIT chunk) * 351595 : [flacenc] write seek tables * 505823 : [matroskademux] language tags have wrong iso code * 515073 : [goom] Update to goom2k4 * 539858 : not enough NEWSEGMENT events from matroskademux * 554839 : [rtpbin] Automaticaly remove pads * 582575 : [rtph263depay] dropping only part of key frames on lost fragmets * 583367 : gstrtpL16pay ignores max-ptime property * 583985 : [matroskamux] make index size configurable * 587323 : rtpmp4vpay does not payload mp4v stream depayloaded with rtpmp4vdepay * 593354 : rtpjitterbuffer sometimes outputs packets with timestamps in the past * 595265 : SDES handling in RTPSource * 597497 : can't play a redirecting .mov file via playbin * 597823 : Add rtpg723pay plugin * 599300 : [qtdemux] Doesn't populate video bitrate field * 601143 : v4l2src: add GstURIHandler interface * 601242 : [flvmux] ECMA array with file index lacks final 0x09 byte * 601728 : [rtspsrc] Add username/password properties * 602231 : Deadlock between rtpjitterbuffer and gstrtpbin * 602508 : qtdemux: Parse stbl atom per sample instead of all at once * 602887 : shout2send element won't change from PLAYING state to NULL * 602940 : jitterbuffer is racy determining basetime * 603376 : rtpsession : g_type_create_instance performance issue : avoid buffer ref * 603471 : [flacdec] not timestamping output buffers * 603547 : shout2send plugin sends data too fast * 603779 : [ladspa] Remove ladspa plugin code * 604352 : [rganalysis] miscomputes timestamps * 604611 : [qtdemux] Provides invalid ALAC codec data * 604679 : videomixer MMX code doesn't build on fedora12 * 604814 : videomixer make error * 604872 : [udpsink] Add missing 'gssize len' parameter to g_convert() * 604913 : rtph264pay/NALU/rtph264depay * 605222 : Mobile Youtube RTSP streams time out at EOS * 605269 : [shout2][patch] Setting public flag * 605447 : Unable to play Real Audio stream for radioBERLIN. * 605882 : rtpg723pay is incorrect * 606198 : rtph264pay is causing alignment trap on ARM arch * 606438 : multiudpsink: warningfixes for windows * 606692 : Incorrect Center Frequency For Band3 * 606807 : audioamplify: allow negative amplifications * 607353 : rtph264pay & base: Don't crash if the other side specifies the profile-level-id * 607440 : [wavenc] should post warning if the file isn't finished properly on pipeline shutting down * 607718 : [qtdemux] Infinite loop doing negative rate playback for single audio stream * 607949 : [avidemux] regression in stop position for mp3 streams * 608209 : [videomixer] blend_mmx.h:173: Error: can't encode register '%ah' in an instruction requiring REX prefix * 608255 : [speex] speexenc crash and leaks in rtpspeexpay and speexdec * 608268 : [flvmux] index timestamps should be in seconds, not milliseconds * 608629 : [pngdec] png_set_gray_1_2_4_to_8() removed in libpng > = 1.4.0 * 608671 : [mkv] issues when seeking * 608990 : [qtdemux] Segment start timestamps can be broken * 609107 : [qtdemux] Unknown atoms should also be skipped when looking for moov * 598610 : [matroskademux] Support push mode operation * 594381 : audiofirfilter: Implement FFT convolution Changes since 0.10.16: * RTP improvements * Support automatic cropping in videobox * Add TTL multicast UDP property * AVI demux push mode fixes and performance improvements * Support large and unusual chunks sizes in wav * Quicktime demuxer improvements * JPEG decode fixes and speedups * Support interlaced Y4M file output * DV demuxer improvements * Pulseaudio fixes and improvements * Support Pulseaudio PLAY/PAUSE requests * speexdec improvements * FLV demuxer improvements * Fix audio noise in the Equalizer plugin, and other improvements * Fix compilation on OS/X Snow Leopard * AVI muxer fixes * Support MPEG V4L2 devices and improve timestamping * Better jpeg2k support * Many other bug fixes and improvements Bugs fixed since 0.10.16: * 597848 : " Media Player Classic " won't play certain files produced by avimux. * 588245 : TTL is never applied with udpsink/udpmultisink * 368681 : avimux + vbr lame always out of sync * 458629 : [avidemux] high memory usage for many index entries * 561825 : Problem with RTCP thread using freed objects * 581334 : [qtdemux] Add support for embedded subtitles * 582238 : [videobox] Add support for autocrop to caps * 590362 : [v4l2src] x264enc ! qtmux fails because of missing frame duration * 591713 : [y4menc] interlaced support * 593354 : rtpjitterbuffer sometimes outputs packets with timestamps in the past * 593391 : [rtpsession] : rtp_session_on_timeout : Invalid read of size 4 * 593688 : effectv can no longer be compiled with gcc 3 * 593757 : [qtdemux] Lack of support for QualComm PureVoice * 593764 : [v4l2src] format ordering: put emulated formats behind native formats * 593955 : rtpjitterbuffer: clock_rate can change between its check and its use * 594039 : missing unref in rtpsource / leak * 594133 : [rtspsrc] leaks authentication info * 594247 : missing math.h include in rtpjpegdepay * 594248 : Use locked-state on internal rtp-bin to avoid shutdown-state-race * 594251 : Avoid throwing out reordered packets with the same timestamp * 594253 : jitterbuf: Only post a warning of clock-rate changed if it is changed from something initialized * 594254 : propagate the pt-type-changed signal * 594283 : rtpbin: make free_session() remove dangling stream references * 594298 : Check if libsoup has SSL support before running HTTPS test in souphttpsrc testsuite * 594490 : gstrtpbin always uses pt to demux * 594520 : multipartmux: mark data buffer as delta-unit * 594599 : videobox: converts AYUV to I420 incorrectly * 594663 : Patch for multifilesink * 594691 : rtph263pay: leak * 595029 : pulse elements fail to connect to pulse 0.9.9 * 595220 : gstreamer crashes on pulseaudio latency change * 595231 : [pulsesink] Lowers volume after every new track * 595888 : qtdemux plugin should not return value from void function * 595897 : Problem linking videomixer * 595942 : [qtdemux] issue with corrupted 3gp file * 596319 : [qtdemux] fails to parse pixel aspect ratio data * 597091 : [flvdemux] not outputting no-more-pads causes playbin2 to fail badly on streamed single-stream flv * 597214 : [avidemux] Fix printf formats to avoid warnings in avidemux * 597348 : [qtdemux] Cast variables passed to printf to avoid warnings about incorrect formats * 597351 : [jpegdec] segfaults on a specific picture * 597397 : equalizer is non deterministic * 597463 : [pulsesrc] has no lower bound for fragment size * 597601 : [pulsesink] needs to take control of minreq value * 597730 : osssrc rank should be secondary, just like osssink * 597847 : Windows Media Player won't play large files produced by avimux * 597867 : Plugins good do not build on Ubuntu Hardy (kernel 2.6.24) * 598377 : rtpmanager: only forward the lost event to the last seen payloadnumber * 598517 : [jpegdec] Regression supporting 4:2:2 jpeg videos * 598810 : wavenc: Fix buffer offset by moving length incrementation * 598933 : [pulse] Fix the StreamVolume interface not being advertised * 601381 : v4l2: Make sure to initialize variables before using them Changes since 0.10.15: * Moved rtpmanager from -bad to -good * Implement SEEKING query in more demuxers and decoders (notably mkv, flv, flac) * avimux: adds support to WMA/WMV * cairo: Add cairo-based PDF/PS/SVG encoder element (cairorender) * dv1394src: fix element for live usage * effectv: new elements: rippletv, streaktv, radioactv, optv * flacdec: fix intermittent FLAC__STREAM_DECODER_ABORTED errors when seeking * flacenc: fix issue with broken duration / sample count into flac header in some cases * flvmux: lots of fixes and improvements * id3demux: fix parsing of unsync'ed ID3 v2.4 tags and frames * matroska: add kate subtitle support, add/improve WMA/WMV handling and read bluray PGS subpicture streams * multipartdemux: support more mime types, do proper flow aggregation * pulsesrc: cleanups, report real latency, set the default slave method to skew * qtdemux: support for agsm, misc. tag reading fixes * rtp: new QDM2 and CELT depayloaders; fix SVQ3 depayloader and make it autopluggable * souphttpsrc: Only assume seekability if the server provides Content-Length * v4l2: add v4l2sink element, open device in NULL->READY, optional gudev support * v4l2src: fix 'hang' with some cameras caused by bad timestamping if no framerate is available * videomixer: add RGB format support; fix I420 blending Bugs fixed since 0.10.15: * 331420 : No PDF/PostScript/SVG encoder in GStreamer yet. * 499242 : [patch] workaround the broken tags encoding for mp3 files * 521625 : [plugin-move] move rtpmanager from -bad to -good * 560033 : [v4l2src] returns caps with a range where max == min * 564100 : [avidemux] premature EOS streaming mjpeg file with JUNK tags * 564501 : [rtph264pay] bytestream scan mode operation is not reliable * 567983 : [avidemux] SAMPLE.AVI fails to play in push mode * 577017 : Videomixer blend bgra and ayuv * 577318 : rtspsrc appears to be leaking memory * 578052 : gstavidemux: support seeking and duration query in default format * 578166 : libgstwaveform, gstwaveformsink.c " BYTE " instead of " byte " * 578612 : [flacdec] seek on flac file sometimes triggers flac decoder ABORT * 580214 : Equalizer starts distorting the sound after a while. * 580732 : AVIMUX needs mappings for Windows Media codecs * 582153 : rtpmp4vpay does not payload mp4v stream depayloaded with rtpmp4vdepay * 582169 : [multipartdemux] Segmentation fault on empty content * 582462 : souphttpsrc should set caps for " audio/L16 " mime_type * 583593 : Updates for SunAudio plugin * 583640 : [v4lsrc/v4l2src] add support for better device detection with libgudev * 584455 : [flacenc] sometimes writes broken flac files * 584613 : rtpvrawpay seems to produce fixed-length packets padded with random data * 585205 : [rtpmp4gdepay?] Unable to play audio from one specific radio station stream * 585361 : [gstwaveformsink.c] 'byte' is not defined in MSVCRT * 585559 : buffer-list support for rtph264pay, rtpjpegpay and rtpmp4vpay * 585576 : [souphttpsrc] initially reports all servers as seekable * 585630 : [PATCH] Don't try to test flacdec if it's not build * 585699 : GNOME Goal: Remove deprecated glib symbols * 585757 : Remove deprecated GTK+ symbols from unused code * 585828 : audioamplify should support more formats * 585831 : audioamplify should support no clipping * 586397 : gstudpnetutils.h fails to build on FreeBSD * 587426 : non fast-start mov files fail to play from http locations * 587680 : rtp/ts does not repackage cleanly to rtp; mpegvideoparse/rtpmpvpay: timing issues * 587826 : gstavidemux.c: s/GST_DISABLE_DEBUG/GST_DISABLE_GST_DEBUG * 587982 : [udp] uninitialized variable in gst_udp_get_addr function * 587983 : [avidemux] assert format failed * 588148 : [id3demux] APIC tag not found mp3 file * 588349 : [effectv] Add new optv effect filter * 588359 : [effectv] Add radioactv effect filter * 588368 : [effectv] Add streaktv effect filter * 588483 : [flacenc] write padding metadata block * 588695 : [effectv] Add rippletv effect filter * 588777 : [souphttpsrc] don't try to authenticate if no username/password is set * 589056 : [qtdemux] no audio in videos from Aiptek camera * 589365 : [pulsesink] pa_stream_get_sink_input_info() failed: Invalid argument * 589423 : [flacdec] Implement SEEKING query * 589424 : [flvdemux] Implement SEEKING query * 589459 : [pulsesink] Fix a couple error messages that mentioned incorrect function names. * 590038 : pulsesink: pa_timing_info- > configured_sink_usec requires pulse 0.9.11 * 590280 : [v4l2] add v4l2sink * 590401 : GstPulseSrc's pulse probe is not initialized correctly * 590447 : [flvmux] crashes when writing index with < = 128 entries * 590970 : [souphttpsrc] better fix for compiler warning fix * 591451 : [v4l2] causes hanging stream when VIDIOC_G_PARM is not supported * 591476 : Possible leak in rtpbin * 591712 : [dvdec] sets top field first not bottom field first on pal interlaced content * 591747 : [v4l2src] should clear formats list when it closes the device * 591951 : pipelines/simple-launch-lines check segfaults with libjpeg 7 * 592232 : [qtdemux] QT style string tag extraction fails * 592530 : Get only glitches and noise trying to play a gsm file * 593015 : pa_stream_flush() seems to cause sync issues * 585911 : matroskademux seems to leak large amounts of memory when seeking (skipping) * 576378 : [matroskamux] add support for WMA2 and WMV2 * 564437 : rtpjpegdepay was unable to handle frame dimensions greater than 2040 * 582515 : Quicktime file with PCM audio does not play correctly * 583048 : [patch] jpegdec: support for larger pictures * 583371 : pulsesink: Print message on underflows * 583803 : pngdec: mismatched g_malloc/free * 584981 : Gstreamer wavparse Could not demultiplex stream * 585056 : regression: no more sound in my H.264+AAC clips * 585549 : Add RTP blocksize functionality to rtspsrc element * 585842 : Support for GstBufferList in gstmultiudpsink Changes since 0.10.14: * Some fixes for seeking in wav and FLAC files * Faster seeking in Matroska and AVI files * RTSP and RTP improvements * directdrawsink moved to Bad * y4menc and flvmux/flvdemux moved from Bad * deinterlace2 moved from Bad, replacing deinterlace * Many bug fixes and improvements * Pulseaudio sink completely overhauled Bugs fixed since 0.10.14: * 572551 : mpeg4videoparse fails to extract codec_data from this net... * 577318 : rtspsrc appears to be leaking memory * 576286 : [videomixer] Should accept/output non-alpha streams * 581333 : rtspsrc: request_pt_map in gstrtspsrc.c fails to return c... * 478092 : gstid3v2mux.cc:deprecated conversion from string constant... * 486915 : [videomixer] segmentation fault on gst-inspect * 509311 : [rtph263pay] rtph263pay does not follow rfc2190 * 516031 : flac within ogg container can't be played on Jokosher * 537537 : [pulse] Latency issues * 537609 : RTSP - rtspsrc module support for Scale header * 552650 : [rtspsrc] (partially) fails SETUP with MS RTSP servers * 562168 : Good plugins' configury overloads --disable-debug * 563574 : v4l2src should capture in non-blocking mode * 567140 : G726 Packetizer issue for 24kbps & 40 kbps datarate * 567857 : [udpsrc] loop on gst_poll_wait when POLLERR because of icmp * 570781 : [alawdec] spews ERROR debug messages on shutdown/seek/not... * 571153 : [pulsemixer] compiler warnings (on ARM) * 571321 : gconfvideo{src,sink} don't disconnect gconf notifications * 572256 : gst/avi/gstavidemux.c: Alignment trap in gst_avi_demux_pa... * 572358 : law encoders _getcaps ignore rate/channel if not both are... * 572413 : [jpegenc] crashes if no input format has been set * 573173 : Added Quicktime HTTP tunneling to the RTSP src element * 573342 : Unconditioned EAFNOSUPPORT in gstudpnetutils.c * 573343 : Type mismatches in gstdirectdrawsink.c * 573721 : [PLUGIN-MOVE] move directdrawsink back to -bad * 573737 : [PLUGIN-MOVE] Move FLV to -good * 574270 : [rtspsrc] Range request is wrong (should say: npt=now-) * 574275 : flacdec ! appsink with a seek seems to drop the first buffer * 577468 : [id3demux] Frames not extracted if tag is unsynchronised * 577609 : [id3v2mux] write RVA2 frames for peak/gain volume data * 577671 : [rtspsrc] deadlock on shutdown (locking order problem?) * 578052 : gstavidemux: support seeking and duration query in defaul... * 578135 : [qtdemux] missing 3gpp Asset metadata handling * 578310 : [matroskamux] - Should suppport speex * 579070 : [sunaudio] fix compiler warnings * 579422 : flacdec can block allocating before it sent a new-segment * 579808 : [jpegdec] Doesn't support additional 0xff before end marker * 580746 : [qtdemux] 3GPP classification entity byte order reversed * 580783 : [PLUGIN-MOVE] Move y4menc to -good * 580851 : rtspsrc: various; sanity of ranges, setting of base_time ... * 580880 : gstrtpjpegpay is not functioning properly; rtp jpeg paylo... * 581329 : rtspsrc: NAT dummy packets not being sent * 581568 : ability for replaygain plugin to post level messages * 581806 : [souphttpsrc] Should allow overriding the referer * 581884 : [PLUGIN-MOVE] Move deinterlace2 to gst-plugins-good * 582252 : rganalysis test broken by recent commit * 582281 : [rtp] Forgets to link to $(LIBM) * 582387 : [avidemux] Seeking regression * 582420 : flacdec unit test broken on PPC * 582661 : [deinterlace] Fix latency query to return unbound max lat... * 582715 : gcc warnings about unitialized * 582753 : flacdec check fails * 582794 : rganalysis unit test fails with git core * 568278 : [qtdemux] add support for vob subtitle streams * 569611 : GStreamer videobox element draws thin green lines on edge... * 571294 : [matroskamux] Should ignore framerate of 0/1 * 574169 : avidemux/theoradec don't work well together * 575234 : Network interface selection for multicasting with the udp... * 576729 : [rtspsrc] perform EOS handling earlier * 578257 : Image problems using rtpjpeg(de)pay * 579069 : rtp h263pay build fixes * 580554 : PATCH: qtdemux: fix demuxing of m4v streams with ac-3 audio * 581432 : [multipartdemux] source pads are leaked * 581444 : [multipartdemux] free memory read of buffer timestamp * 582218 : Uninitialized variable may be used in gstavidemux.c * 575937 : udp/gstudpnetutils.c: ip_mreqn unavailable on Solaris (an... Changes since 0.10.13: * Add autodetect source elements * Improvements in RTP payload/depayload and RTSP * Support float input in wav, and require depth == width * Support inverted RGB video in avi * Compilation fixes and smarter format selection in V4L2 support * Use libv4l when available * Don't install static plugin libraries any more * Matroska muxing: Add Dirac, fix AAC * Improve qtdemux segment handling * Add presets to equalizer * OS/X video and audio output improvements * Rework Pulseaudio audio output * Support basic and digest auth in souphttpsrc * Use libsoup-gnome instead of libsoup when available * DV demuxer fixes * New IIR and FIR base classes and echo filter in audiofx plugin * Improved spectrum analysis plugin * 8 bit greyscale support in v4l2src and videocrop * New aspectratiocrop element * Many other bug fixes and improvements Bugs fixed since 0.10.13: * 561502 : Not-negociated error in udpsrc * 522183 : add preset suport to gstequalizer * 523813 : [autodetect] add autovideosrc and autoaudiosrc * 557709 : goom should have license headers in all source files * 560155 : segfault when trying to set tag to NULL with avimux * 527951 : [new element] aspectratiocrop * 529379 : RTSP seeks when pipeline is in STATE_PAUSED * 532409 : RTP payload/depayloader for G.729 * 537539 : [pulse] Rhythmbox starts using 100% of CPU time when puls... * 537540 : [pulse] Causes a deadlock when the pulseserver dies * 537543 : [pulse] sink/src should have " volume " property (was GstMi... * 545033 : [v4l2src] Add support for camera specific formats * 552140 : [soup] use libsoup-gnome for proxy configuration if avail... * 556019 : Add the ability to make souphttpsrc act as a live source * 556484 : Implement getcaps in rtpL16pay * 556641 : rtpL16depay doesn't support multichannel audio * 556802 : Misspelled messages * 556955 : [videocrop] fails to renegotiate * 556986 : pulsesink deadlocks when raising an error * 557260 : [equalizer] Calculates coefficients for every buffer * 557293 : Argument type mismatch on Windows * 557294 : cross mingw32 gcc: getaddrinfo is not in ws2_32.dll befor... * 557710 : Memory leak related to matroskamux's request pads * 558427 : rtpmpapay/depay are too wide * 558638 : Compiler error on v4l2 * 558711 : gst-plugins-good-0.10.11 compile fails * 559288 : [qtdemux] deadly embrace! * 559545 : rtspsrc could not receive data from RTSP server because o... * 559547 : Seek bugs when playing rtsp video in m.youtube.com * 560641 : rtp mp4 payloader doesn't flush the last frame upon EOS * 560756 : New Plugin: JPEG RTP Payloader * 561625 : Rtspsrc set segment's last_stop incorrectly * 561775 : souphttpsrc patch to support basic and digest authentication * 561802 : DLNA specific HTTP header missing * 561990 : qtdemux build fails on mingw due to missing definition of... * 562434 : [wavenc] Add support for a-law and mu-law encoded wav files * 562572 : multiudpsink handles errors in _render() too aggressively * 563414 : Fix for SunAudioMixer plugin * 563504 : add libv4l2 support to v4l2 gst plugin - required for mos... * 563509 : [rtp_data_test] Complains about negotiation errors with m... * 563510 : [videocrop] 1x1 unit test fails * 564437 : rtpjpegdepay was unable to handle frame dimensions greate... * 564948 : Fix and clean up osxaudio * 565850 : mov files can contain xvid, fmp4 and ac3 tracks * 566616 : v4l2src: b/w support * 566843 : [pulse] Terminating an audio stream hangs the application * 567577 : [audiofx] Add generic IIR/FIR audio filter elements * 567642 : spectrum element has undocumented arbitrary limitation on... * 567746 : fix for 547227 created a ref loop * 567794 : [PATCH] Rework pulse plugin * 567800 : Mp4 created by Avidemux don't play. * 567853 : osxaudiosrc does not build on 10.4 * 567874 : [audiofx] Echo/Reverb filter * 567955 : [spectrum] Need compensation for rounding errors * 567992 : [videocrop] wrong mouse navigation commands while cropping * 568395 : [audiofx] Rename audioreverb to audioecho * 568780 : elements/videocrop check fails * 568809 : Patch needed for building gst-plugins-good 0.10.13 on Sol... * 569820 : In some cases v4l2src element does not return correct norm * 570343 : equalizer bands != specified parameters * 570435 : Read Title element of Matroska files * 571038 : [osxvideosink] build fail * 571150 : aspectratiocrop : Memory leak * 571153 : [pulsemixer] compiler warnings (on ARM) * 571204 : [pulsesink] PA assertion failure triggers abort * 570581 : osxvideosink: non-embedded mode is badly broken and shoul... * 341752 : [rtspsrc] 500 Internal Server Error response with tagessc... * 420658 : gconfaudiosink is not behaving normally * 558554 : [avidemux] avidemux not recognizing certain uncompressed ... * 561580 : GStreamer does not play a specific WAV file * 563056 : " rtpjpegdepay ! jpegdec " doesnt works * 565441 : Smoke encoder doesn't set caps correctly * 567952 : videocrop: add b/w support Changes since 0.10.12: * Fix bad autopoint substitution in the po subdir Changes since 0.10.11: * Fix for security advisory TKADV2009-0xx Changes since 0.10.10: * HDV capture support * Port flactag element to 0.10 * Support FLAC in alternate bit-depths and more samplerates * Matroska muxing improvements * Support Google RTSP variant * Many other bug-fixes and improvements Bugs fixed since 0.10.10: * 545433 : [wavparse] support tempo tag * 311586 : Matroska mux/demux don't support flac * 350830 : [raw1394] Add HDV support * 413841 : [flactag] needs porting to 0.10.x * 536067 : [matroska] Add support for real audio/video * 537361 : videomixer segment handler fail * 543101 : The udpsrc/udpsink/multiudpsink/dynudpsink elements may l... * 544956 : [videobox] segfault when changing properties at running p... * 545463 : autodetect plugin links to gconf, unnecessarily * 545710 : [rtspsrc] : create rtp/rtcp socket pair + same port for d... * 546465 : can't play m.youtube.com rtsp streams * 547075 : [speex] Encoder doesn't handle non-zero start timestamps ... * 547217 : Implement GstPropertyProbe interface on pulsesrc for dete... * 547227 : Implement GstPropertyProbe interface on pulsesink for det... * 547518 : pulsemixer probe fails after device property is set * 547519 : Add device-name property to pulsesrc * 548530 : wavenc allows audio depth of 25 * 548831 : matroska demuxer setting incorrect timestamps * 549073 : buffer_alloc function from new basetransform sometimes fa... * 549090 : v4l2src has no property named norm but notifies it * 549551 : conversion of gst structure names to mime types in multip... * 549784 : Memory Corruption Probing v4l2src with Video4Linux1 device * 550015 : build failure: gstcmmlparser.c:115: error: format not a s... * 550791 : [flacenc] files are too big, mid-side-stereo=true should ... * 551048 : rtsp implementation sends PAUSE even when server doesn't ... * 551570 : plugin ximagesrc is memory leaking... * 551584 : Crash when modifying the videobox " top " and " left " live w... * 552213 : [qtdemux] map tiff fourcc to image/tiff caps * 553191 : udpsrc: bind() fails on OS X * 554771 : totem spins CPU 100% while allocating (infinitely) becaus... * 556010 : AVI muxer segfault * 556381 : [icydemux] test fails with latest core * 556424 : [avidemux] segmentation fault when creating indexes * 557085 : [videobox] support dynamically changing properties * 557610 : udpsrc fails to bind() on Mac OS X (IPv4 vs. IPv6 problem) * 547842 : Vorbis RTP RFC 5215 is out * 550288 : Sound not played - a quicktime file Changes since 0.10.9: * Move the libcdio cddasrc element to -ugly, because of the GPL license Bugs fixed since 0.10.9: * 413705 : [PLUGINS MOVE] gst-plugins-good contails GPL'ed libcdio p... Changes since 0.10.8: * Replaygain elements moved from Bad * Interleave/Deinterleave elements moved from Bad * Pulseaudio plugin http://pulseaudio.org is now integrated * New simple Karaoke audio effect plugin * Improvements in v4l2src * Multi-channel FLAC file fixes * AVI and Quicktime reverse playback support * AVI and Matroska muxing improvements * New element for rendering SMPTE transitions into alpha channels * Many improvements in the Win32 directdraw elements * Error out cleanly for encrypted streams * RTP/UDP handling improvements * RTSP digest authentatication implemented. * New RTP Pay/Depay-loaders for Speex, G.729, DV & raw video/audio * Error concealment for Speex * Many other bug-fixes and enhancements Bugs fixed since 0.10.8: * 541787 : incorrect timestamp * 413705 : [PLUGINS MOVE] gst-plugins-good contails GPL'ed libcdio p... * 345393 : Missing documentation * 400679 : [PLUGIN-MOVE] pulse-gst to -good * 422917 : G729 payloader/depayloader * 429322 : [matroska-demux] hangs if file starts at non-zero timestamp * 465146 : Add more complete negotiation to gstrtpbasepayload * 469917 : multiudpsink IPv6 and diffserv TOS/TC markup * 499318 : [osxvideosink] warnings on build (ppc, 64bit, 10.4) * 503288 : rtph264pay does not split multiple NAL units in incoming ... * 511489 : avimux muxed audio and video out of sync * 512345 : gstalpha: chroma-key should not set alpha to 0 if brightn... * 515962 : [udp] add ipv6 support to multiudpsink and udpsrc, add mu... * 516509 : gstid3v2mux.cc build failure on Solaris, CFLAGS not valid... * 519301 : avimux fails when going from NULL to playing a second time * 519460 : 8 bytes missing in AVI streamheader * 520092 : v4l2src proposed patches * 520885 : directdrawsink has some issues * 527865 : [PATCH] [matroskademux] uses wrong colourspace for palett... * 529454 : [udpsrc] generates false error on win32 due to ICMP dest-... * 529692 : [goom] fails to build on Windows with mingw32 * 529707 : [rtp] fails to build on Windows with mingw32 * 530886 : Support more mpeg2 variants in .mov files * 531532 : rtspsrc leaks filedescriptors when gst_rtspsrc_open fails * 531672 : [qtdemux] does not handle files with edit lists correctly... * 532295 : gconf setting default audio sink to video default visualizer * 532393 : [dvdec] Shouldn't be GST_RANK_PRIMARY * 532409 : RTP payload/depayloader for G.729 * 532423 : RTP payload/depayloader for DV * 533264 : Make v4l2 compile without X * 533619 : udpsink dies when Linux fails (for no reason) sendto() wi... * 535121 : [videomixer] proper seek/segment handling * 535300 : [avidemux] missing support for reverse playback. * 535935 : [qtdemux] Missing metadata * 536228 : [PLUGIN-MOVE] Move interleave/deinterleave to gst-plugins... * 536317 : [v4l2src] Doesn't compile with latest git kernel * 536646 : v4l2src doesn't pick the optimal resolution * 536831 : v4l2src == non-experimental * 536903 : udpsrc now assumes one is using multicast * 537021 : [cdio] does not extract album title from CD-TEXT * 537031 : Enhancement to SunAudio mixer plugin * 537361 : videomixer segment handler fail * 537377 : Gstreamer avidemux fails on avi files with non-AV data st... * 537622 : [matroskademux] Doesn't export covers (file attachments) * 537675 : rtp vorbis/theora payloader static caps don't specify del... * 537832 : rtsp is broken * 539372 : udpsrc do not set port properly on anonymous binding * 539548 : [udpsrc] Fails to bind with permission denied when trying... * 540067 : souphttpsrc does not support http authentication * 540300 : [souphttpsrc] souphttpsrc does not seek ahead in http stream * 540940 : Quicktime demuxer does not handle dirac in QT files * 541081 : [v4l2src] Doesn't compile with on old kernel * 541384 : cross mingw32 gcc: making goom compile * 541412 : cross mingw32 gcc: making libgstrtp plugin compile * 541650 : udpsrc fails to parse URI with IPv6 address * 541956 : v4l2src only requests interlaced video * 542410 : qtdemux not recognizing pcm 8bit streams correctly * 543054 : [osxvideosink] minor build issue * 543255 : -Wno-attributes does not exist in every gcc version * 543259 : warning in gstv4l2src.c due to an uninitialized variable * 543300 : [qtdemux] [PATCH] wrong depth in RLE video caps and wrong... * 544509 : [qtdemux] Regression in segment.stop * 539482 : [avidemux] Doesn't parse vprp ODML header * 544433 : Some -good plugins aren't buildable with MSVC * 536994 : Improve v4l2src negotiation a bit more * 329198 : GStreamer-CRITICAL: gst_pad_activate_pull: assertion `old... * 532065 : Implement RTSP Digest authentication * 533287 : Mapping of mime types to gst names in multipartdemux * 538891 : G.726 pay/depayloader is missing Changes since 0.10.7: * The libsoup based http source moved from the -bad module and was raised to primary rank * GOOM visualisation plugin updated to Goom2k4 * Fixes in UDP, RTSP, matroska, QT/mov, AVI, v4l2, OS/X, SunAudio, mulaw and wavpack * New gdkpixbuf output for snapshotting * Various other bug-fixes Bugs fixed since 0.10.7: * 516509 : gstid3v2mux.cc build failure on Solaris, CFLAGS not valid... * 515978 : [ladspa] Should be removed from -good until it's ready to... * 516649 : [v4l2src] tries to VIDIOC_S_PARM without checking capabil... * 517237 : [rtspsrc] Better error when bandwidth is too small * 517933 : [tests] trivial C89 fix * 518188 : [spectrum] " message " property documentation unclear * 518213 : [goom2k4] artefacts on x86-64 * 518564 : goom dies with illegal instruction * 519088 : gst_mulawdec_chain() may call gst_util_uint64_scale_int()... * 519417 : Unable to modify DEFAULT_VIDEOSRC in configure * 520073 : [goom] (goom2k4) shows mostly black frames * 520764 : double buffer unref in speexenc error handling * 520880 : audiofx doesn't build on Windows/MSVC * 520888 : udpsrc has some issues on Windows * 521102 : h.263+ rtp depayloader crashes on short payloads * 521875 : [osssrc] recording corrupts upon _get_caps * 522278 : Problem with " movq " at file gst-plugins-good/gst/goom/xmmx.c * 522767 : [goom] does not build on ppc * 523124 : [PLUGIN-MOVE] move souphttpsrc from -bad to -good * 523134 : osxvideosink does not stop when you control-C * 524593 : [sunaudio] fix mixer track range * 525359 : [alaw] [mulaw] Use gst_pad_alloc_buffer_and_set_caps to c... * 525833 : [halaudiosrc] unable to get mic USB working with gnome-so... * 525860 : [sunaudio] copyright fixes * 525946 : [gdkpixbuf] add gdkpixbufsink element * 526557 : [matroskademux] seeking regression in CVS * 527848 : [souphttpsrc] Give souphttpsrc PRIMARY rank * 527984 : Doesn't dist all m4 files needed by configure.ac * 527999 : [goom] Doesn't dist goomsl.h * 528143 : [goom] fails to build on 32-bit ppc * 528615 : Hide goom2k4 logo * 529268 : [goom] States unit test exposes some memory leaks Changes since 0.10.6: * 8 months of frenetic development * Massive RTSP/RTP improvements * Fixes in pngdec, gdkpixbufdec, wavpackparse, wavpackdec, smokeenc, mulawdec, alwdec, id3demux * More Fixes in matroskademux, udpsrc, apedemux, flacenc, avimux, dv1394src * V4L2 support improved * Fixes for OS/X and Windows video/audio sources and sinks * Support more formats in QT files * Elements moved from gst-plugins-bad: equalizer, lpwsinc (now audiowsinclimit), bpwsinc (now audiowsincband), spectrum, multifilesrc/sink * New audio effects: High/Low/Band-pass filters * Many, many other fixes Bugs fixed since 0.10.6: * 415627 : [PLUGIN-MOVE] move equalizer to good * 463624 : [PATCH] avimux: mismatch in ODML tag numbering * 347848 : [id3v2mux] add support for DiscID tags * 348085 : [PLUGIN-MOVE] move spectrum to good * 351726 : [rtspsrc] Force to send on periodic time new rtsp play co... * 358841 : [dv1394src] should have property probe * 417420 : [autoaudiosink] add " caps " property to filter sinks by caps * 427573 : [osxaudiosrc] segmentation fault * 435435 : [alaw] use tables for ALAW (G.711) encoding and decoding * 442034 : [avi] add support for subtitle streams (GAB2) * 447000 : [id3demux] add support for reading license URL from WCOP tag * 448278 : [v4l2src] several issues in cvs * 449747 : Function parameter mismatch breaks build on Solaris. * 450190 : [PATCH] v4l2src set_capture (parameters) fails * 450878 : Missing files in po/POTFILES.in * 451249 : Integer type mismatch in gstrtspsrc.c * 451388 : [v4l2src] Could not negotiate format * 453037 : rtpilbcpayloader encoding-name field mismatch * 453417 : [matroskademux] support palette info for VobSub stream * 453630 : Rtspsrc invokes GST_ELEMENT_ERROR in eos when streaming o... * 455086 : [cairotextoverlay] ignores the size in font-desc property * 455808 : rtspsrc deadlocks on pause * 457097 : [faad] " setting caps on pad failed " with BMJ113 mov * 461600 : Some files missing from POTFILES.in * 464475 : the mode property if the caps of rtpilbc*pay should be of... * 464800 : [audiofx] New elements: chebyshev low/highpass and bandpa... * 465040 : [RTP] h263ppay should allow h263 caps on sink * 465774 : qt video does not play, but can be seeked * 467214 : Could not get buffers from device '/dev/video0' * 467666 : [ELEMENT-MOVE] Move lpwsinc and bpwsinc to gst-plugins-good * 470502 : Ricoh Webcam not working * 471364 : [gconf] Internal GStreamer error: state change failed on ... * 471823 : [v4l2src] Fails to negotiate capabilities with Macbook Pr... * 473670 : [qtdemux] invalid utf8 in tags causes warnings * 474616 : [rtph263pay] RTP headers are wrong for win32 * 475424 : [v4l2] uvcvideo Macbook iSight webcam not working (regres... * 477199 : Linux-UVC webcams not working * 477456 : [v4l2src] my webcam is not working anymore * 479960 : qtdemux is missing fourcc for mpeg2 HDV streams (HDV2. HDV3) * 480557 : [v4l2src] Nasty segfault (with broken driver?) * 482495 : avimux does not accept audio/aac * 484998 : [mulawdec] not-negotiated error playing a sun audio (au) ... * 485828 : [v4l2src] Fixates to lowest resolution on new kernels * 487488 : udpsrc errors * 487563 : Payloader for H264 not marking packets * 488112 : [id3demux] extract ID3v2 WOAF frame * 488844 : Free GstBuffer with gst_buffer_unref() in gst_rtp_mp4v_pa... * 488879 : [videomixer] implement GstChildProxy interface * 489940 : [gdkpixbufdec] gst_value_set_fraction: assertion 'denomin... * 490034 : [v4l2src] " could not get buffers from device " * 490283 : [multifilsrc] move to -good * 491323 : Extend RTP MPEG-TS payloader to handle large RTP payload ... * 492388 : Build issues on Windows/MSVC * 496752 : [rtspsrc] leaks memory * 496773 : [rtspsrc] leaks SDP messages * 496983 : [PATCH] rtspsrc leaks pads * 497007 : [PATCH] rtspsrc leaks RTSP messages in SETUP * 497017 : [PATCH] H.264 RTP depayloader leaks memory in setcaps * 497292 : gsttextoverlay compile problem in MSVC * 497293 : gsttimeoverlay compile error in win32 * 498181 : Recent change to gst-plugins-base breaks gst-plugins-good * 498297 : [v4l2src] put real supported resolutions in caps instead ... * 498395 : [pngenc] leaks buffer data memory * 498715 : GStreamer fails to decode MPEG1 Video RTP streams when gs... * 499178 : unexpected not negotiated and other weird beharviours * 499239 : gstrtpmp4adepay * 499383 : [rtph263depay] Doesn't read I-frame information from rtp ... * 500403 : [PATCH] videobox element doesn't init liboil * 501775 : [wavparse] regression in CVS: seeking is broken * 502655 : [avimux] creates corrupt avi files (wrong stream numbering) * 502814 : Adds profile (hex string), sps and pps (base64 encoded) i... * 502966 : GStreamer segfaults when videobox is introduced into a sp... * 503023 : Let multipartdemux work in live mode. * 504018 : flacdec emits newsegment before being able to respond to ... * 504081 : [matroskamux] support for live sources (calculate duratio... * 504895 : Build fails: gst/check/gstcheck.h: No such file or direc... * 505745 : [avidemux] warning: 'res' may be used uninitialized in th... * 506025 : RTSPsrc doesn't handle redirects. * 506715 : [PATCH] [flacdec] PICTURE blocks should be retrieved as m... * 507642 : v4l2src Crash - Size 4156 is not a multiple of unit size ... * 508644 : The clockrate for theora payloading should always be 90000 * 509298 : Compilation errors in gstavisubtitle.c and gstrtspsrc.c w... * 509301 : [flacdec] CVS does not compile against flac-1.1.2 * 509531 : Make the auto-join/auto-leaving of a multicast group opti... * 510505 : changes to make v4l plugin build on solaris * 510592 : Race condition in WAVE parser * 513628 : [flacdec] Decoding of PICTURE blocks is always disabled b... * 514397 : matroskademux does not mark delta units * 514573 : multipartmux memory leak * 514889 : Bogus output from RTP data test * 514965 : Possible buffer leaks if last_write_result != GST_FLOW_OK... * 515457 : [audiofx] Element long descriptions are broken * 515562 : [avidemux] Seeking broken in 0.10.6.2 * 515697 : [multifile] Several memory leaks exposed by unit test * 515701 : [smoke] Several valgrind warnings exposed by unit test * 515703 : [avisubtitle] Several valgrind warnings with unit test (g... * 515704 : [gconf] Memory leak when creation of pipeline fails * 515706 : [ximagesrc] Memory leak when XDamage support is available * 515905 : gst-error.m4 needs no%E_MACRO_REDEFINED on Solaris * 515979 : [efence] Doesn't chain up finalize properly * 515980 : [directdraw] Does not chain up finalize functions properly * 515984 : [v4l] Does not chain up finalize functions properly * 515985 : [ximagesrc] regression when using damage * 516371 : does not build without xml usage * 516524 : uninitialized variables * 517386 : [alpha] Doesn't link with libgstbase * 508291 : [id3demux] must check if language code in id3v2 COMM fram... * 491811 : Rename audiochebyshevfreq* to audiocheb* * 447961 : [rtsp] do not store a reference to the result from inet_n... * 475784 : rtspsrc has race condition between loop_interleaved() and... * 478244 : rtpamrdepay make no playable stream * 480707 : Memory leak : gstrtpmp4vpay : config buffer is leaked * 502187 : flacdec doesn't send newsegment from the streaming thread * 509329 : [rtspsrc] use atoll when parsing rtptime * 512544 : preallocate output buffer in pngenc Changes since 0.10.5: * Much improved RTSP/RTP and V4l2 support * New plugins - audiopanorama, audioinvert, audiodynamic, audioamplify * OSX and Windows video/audio support elements moved from Bad Plugins * qtdemux, videocrop and wavpack elements moved from Bad Plugins * Fixes in avi and matroska muxing * Fixes in wavparse, sunaudio, AVI demuxing, ID3 tag handling * gamma element ported to 0.10 * Parallel installability with 0.8.x series * Threadsafe design and API Bugs fixed since 0.10.5: * 392189 : [esdsink] pipeline hung in state change from PAUSED to PL... * 407590 : crash using gconfaudiosink * 439255 : [rtspsrc] crash on unsupported transport * 441118 : Incorrect caps in G.711 RTP depayloaders * 323471 : [PLUGIN-MOVE] osxaudio * 407780 : avimux does not handle video/x-h264 * 316203 : MinGW: udp and rtsp plugin should be disabled on windows * 340362 : [PATCH] new plugin - hardlimiter * 342463 : [ximagesrc] performance improvement * 347806 : [v4l2src] try_capture(): Error getting buffer information... * 350296 : [udpsrc] add property to remove extra headers from buffers * 354007 : [PLUGIN-MOVE] videocrop should be moved to -good * 356692 : wavparse drops final sample in most files * 358040 : Fix speex rtp (de)payloader * 362566 : [dv1394src] Random segfault and kernel oopses * 374489 : rtspdec never sends out RTCP Receiver reports * 377306 : [sunaudiomixer] mixer track labels not localized * 379298 : [avimux] allow multiple audio streams * 392620 : gnome-sound-record can not be started on sunray client on... * 393427 : error/warnings when compiling with mingw * 395688 : playbin is unable to play rtsp stream for 3gp from Darwin... * 396057 : [audiofx] New audioinvert element * 397162 : [audiofx] New element audioamplify * 397946 : [audiopanorama] another trivial docs fix * 398299 : [smpte] crashes if fed empty buffers from fakesrc * 398325 : [smpte] Segfaults with big width/height * 399338 : Hang in PREROLLING when trying to play a specially crafte... * 399825 : Tags don't work properly for shout2send plugin * 406042 : [v4l2src] fails with radio chips * 407369 : [v4l2src] Wrong way of EIO error handling * 407793 : memory leaks of sdpmessage.c * 407797 : bug of rtsp_url_parse() in gst/rtsp/rtspurl.c * 408544 : totem crashed with SIGSEGV to rtsp_ext_wms_configure_stre... * 410997 : Fails to build with -z defs * 412597 : Simplify GstSunAudioSrc * 412608 : [avidemux] flow return aggregation can ignore errors * 414168 : Mixes spaces and tabs in Makefile.am defs * 416445 : [avidemux] seeking regressions * 416727 : [v4l2src] typo in printf format string * 416728 : [v4l2src] typo in translated strings * 417729 : [autoaudiosink] plugs alsaspdifsink, breaking playbin * 419338 : [wavparse] critical warning from plugin viewer * 420208 : Probably typo * 426044 : [flacenc] broken files when used with oggmux * 427990 : [rtph264depay] sprop-parameter-set erros * 428611 : [ximagesrc] segfaults when used from a non-X terminal * 428901 : [icydemux] broken tags for non-UTF-8/ISO-8859-1-using ra... * 429319 : [alphacolor] distorts png images without alpha channel * 429666 : [goom] totem skips mp3 (while Rhythmbox doesn't) * 430228 : [sunaudio] copyright bug * 430632 : memory problem * 430804 : [PATCH] navseek only seeks (sort-of) partially * 431282 : broken RTP depayloaders * 433119 : wavparse causes skipping for MPEG-encoded RIFF Wav files ... * 433135 : [wavparse] regression in CVS with mp3-in-wav * 433530 : udpsrc read of size 0 * 434824 : rtp mp4 payloader doesn't handle newsegments and flush ev... * 436910 : [videomixer] wrong strides with odd input width * 437499 : [wavparse] can't handle WAV file with 'LIST' header chunk * 437670 : Improvements for rtsptransport.[ch] * 437692 : Some more fixes for the RTSP support * 438926 : invalid comparison of pointer with string literal * 438940 : [rtph263ppay] Support for Segment Fragmentation based on ... * 440127 : Autoaudiosink does extra switching between null and ready... * 440203 : Support multiple RTSP headers of the same type * 440928 : Improved RTSP version support, and added Date header * 441408 : speexdec plays incorrectly files made with nframes=4 * 442535 : [wavenc] Doesn't handle width!=depth files with audio/x-r... * 442677 : WideBand AMR payloaders * 443081 : [wavparse] fails to post error on FLOW_NOT_LINKED * 445905 : ximagesrc disregards display_name property * 446981 : error during the compilation of rtspconnection.c * 447210 : wrong length calculation for codec_data * 447458 : [qtdemux] export AMRSpecificBox as codec_data * 385887 : [flac] make work with libflac-1.1.3 * 404646 : [audiofx] Compressor/Expander element * 424527 : [auparse] don't convert non-native endianness floats in t... * 387121 : [matroskamux] Can't mux raw audio * 392855 : [matroska] plugin must link against zlib (error with MinGW) * 394851 : [audiopanorama] Some trivial docs fixes * 394859 : [audiopanorama] New simple method for adjusting the panorama * 398086 : [smpte] crashes if input dimensions differ * 406018 : 64bit uncleanness in gstavimux.c * 407057 : [wavparse] leaks contents of every buffer pushed when in ... * 407349 : [id3demux] wrongly interprets TDAT as year * 350278 : [rtpmp2tdepay] Add support for proprietary headers * 380895 : A couple of corrections and improvements for the RTSP sup... * 380944 : [dvdec] Doesn't set pixel-aspect-ratio * 394977 : multipartmux not honoring flow return * 403956 : Add float32 support for " level " element * 405213 : mp3 plays too fast in totem or rhythmbox * 407006 : [goom] odd adapter behaviour * 412704 : [PATCH] gamma filter ported to 0.10 * 414887 : [gconf] gconfaudiosink doesn't set GST_ELEMENT_IS_SINK un... * 415446 : [avidemux] fails parsing mjpeg file from digital camera * 417792 : rtp depayloader for AAC * 423304 : file descriptor closed in udpsrc and dynudpsink * 423782 : Code for H264 payloader * 428182 : Current CVS generates compiler warnings * 429329 : [videobox] add support for AYUV input * 442874 : Multipartmux assumes caps == mime Changes since 0.10.4: * Parallel installability with 0.8.x series * Threadsafe design and API * RTP/RTSP improvements * Fixes in OSS support * Addition of the audiopanorama element * Improvements in AVI playback * Annodex playback fixes * Support FLAC in OGG and Matroska * Fixes in the Speex decoder * V4L2 source moved from Bad Plugins * SMPTE element ported to 0.10 * GStreamer Data Protocol (GDP) Payloader and Depayloader elements added * Many other bug-fixes Bugs fixed since 0.10.4: * 336465 : [patch] Streaming support for avidemuxer * 349207 : [PLUGIN-ADD] audiopanorama * 341278 : [autoaudiosink] should fallback to fakesink * 342950 : Implement device profiles in autoaudiosink/autoaudiosrc * 348233 : dv1394src crashes with libavc1394 0.5.3 - cause known * 349015 : [sunaudio] open source with O_NONBLOCK * 349894 : RTSP Multicast * 351347 : --disable-schemas-install now works too well * 351794 : [id3demux] try harder to extract wrongly marked strings * 352577 : [avidemux] regression in CVS with Elephant's Dream * 355210 : Sample pipeline from the documentation doesn't work properly * 356142 : GST Sun Audio Mixer doesn't set only Output Track as Mast... * 356147 : [avimux] duration in header not correct for big avi ( > 2 ... * 357592 : Avoid compiler warnings with uClibc and -Werror * 361637 : h263 variant missing from RTP (de)payloaders' caps * 361639 : MPA payloader's payload number is incorrect * 362603 : Fixes compiling with forte: warning clean up (part 4) * 362673 : Playback with 4Front OSS driver not working due to blocki... * 366492 : add windows vs8 project files * 369621 : [avidemux] Out-of-sync playback with VBR MP3 audio * 372021 : flxdec has wrong classification * 374213 : Seeking with LADSPA plug-ins fails * 374479 : [PATCH] videomixer memleak fix and enhancement * 374737 : [matroskademux] doesn't recognise opaque " A_AAC " codec ID * 376594 : id3demux crashes when reading compressed ID3 frames * 379433 : [PATCH] avidemux audio pad reports wrong position upon query * 379792 : Remove memcpy in multipartmux and fix RFC compliance * 379918 : Doesn't compile with newer libcaca versions (0.99.beta4+) * 380199 : [matroskademux] Wrong framerate conversion * 380825 : make avimux accept video/mpeg in versions 1, 2 and 4 * 381857 : [id3v2mux] crashes trying to write empty frames * 382179 : Videomixer shouldn't reset position to 0 when the caps ar... * 382277 : multipartmux modifies buffer timestamp * 382982 : [apedemux] Fails to read track gain or other doubles * 383001 : [PATCH] if using multicast in udpsrc, bind to the multica... * 383043 : Videomixer can crash when adding/removing pads while pla... * 383596 : mixer doesnot work if set AUDIODEV on solaris * 384587 : libcaca check breaks cross-compile * 385031 : [id3demux] autoplug loop if first buffer has nonzero offs... * 385623 : [quarktv] crash when plugged dynamically into a pipeline * 343348 : [matroska] add support for vobsub subtitles * 345449 : [icydemux] Internet radio hangs when connecting to radio.... * 348762 : [ID3v2] comment frame extraction/writing doesn't retain d... * 351116 : 'make check' tries to run annodex unit tests even if anno... * 352110 : [flacdec] no support for ogg flac * 366155 : [matroskademux] Several problems in encoding handling code * 374658 : [matroskamux] add tag writing support and implement relea... * 378184 : g-s-p crash due to incorrect free from do_toggle_element * 360673 : [PATCH] Stuttering with SunAudio Sink * 349068 : multipart demuxer improvements * 350006 : [LADSPA] after changing state from PLAYING to READY/NULL,... * 350340 : CMML test cases and small fixes * 350785 : [ossmixer] provides no way to set mixer device * 353908 : Error seeking at the beginning of a CMML file * 356596 : [wavparse] Does not support GSM encoded audio * 358156 : in udpsrc.c gst_udpsrc_create function read command could... * 361252 : Memory leak in udpsrc * 364958 : [avidemux] broken timestamping in streaming mode * 367221 : [PATCH] videomixer does not mix for some framerate combin... * 368162 : iLBc rtp payloaders and depayloaders not compiled * 377792 : rtspsrc tries to stream application/x-wms-rtx * 383323 : smpte doesn't handle sink1 and sink2 correctly * 383726 : [audiopanorama] only transforms half of the samples in fl... * 349901 : [LADSPA] gst_element_class_add_pad_template: assertion `g... * 375476 : v4l2src cannot close /dev/video0 Changes since 0.10.3: * added apev2mux element * use libiec61883 for Firewire Bugs fixed since 0.10.3: * 345930 : [id3demux] segfaults with file containing only ID3v1 tag * 347529 : wavparse error * 321191 : rtpamrdec isn't a subclass of GstBaseRtpDepayload * 340027 : [patch] wavparse fails for several files * 318563 : offer support for new raw1394_iso api in dv1394src * 330623 : [avidemux] only the beginning of big avi files gets played * 334375 : [id3demux] [id3v2mux] ID3 tag rewriting is lossy * 337076 : Problem with broken matroska files containing non-UTF8 su... * 339704 : [id3demux] read images from ID3 tags * 340282 : Goom visualization is unusable at 'Normal' size and higher * 340623 : [matroskademux] small memory leak * 340699 : [flacdec] should not send EOS when doing segment seeking * 340859 : [avimux] produces index with all frames marked as keyframes * 340946 : raw1394 plugin uses deprecated functions * 340979 : [id3demux] mp3 id3v2 TCON tag possible bug? * 341489 : gst-plugins-good wavparse Cygwin fix * 341774 : Fails to read tags in file * 341818 : [matroskademux] poor concurrent performance * 342029 : [id3demux] overflow of titlenumbers * 342097 : [jpegdec] crash with attached JPEG file * 342448 : [matroska] support for muxing/demuxing Theora video * 342526 : [avimux] dml index support, codec_data support, cleanups * 342592 : dvdemux doesn't post segment-done right * 342734 : [matroskamux] might block on state-change * 343051 : [autoaudiosink] doesn't try esdsink * 343055 : README mentions 0.9.6 * 343117 : jpegdec, mjpeg avi's and flush seeks * 343122 : [taglib] new apev2mux element * 343123 : [apedemux] add support for GST_TAG_LOCATION * 343127 : [apedemux] extract track count, clean up parsing * 343602 : configure --disable-external fails * 343603 : need to add -lm to build tests/examples/level * 343678 : configure.ac incorrectly uses $(SED) rather than $SED * 343837 : [wavparse] can't handle WAV file with 'bext' header chunk * 344100 : --disable-schemas-install not honored * 344101 : SunAudio mixer fixes * 344120 : dv1394src should now require libraw1394 > = 1.1.0 * 344605 : [id3demux] set picture type on image buffers * 345232 : [wavparse] reads beyond end-of-file (in pull mode) * 345288 : [udp] make work on Windows * 345713 : ximagesrc uses XFixesCursorImage incorrectly and will seg... * 346066 : [sunaudiosink] don't override user setting and switch on ... * 346259 : [sunaudio] move monitor to input tab in mixer * 347234 : streaming UDP (MPEGTS) shows only one frame of video * 347258 : [wavparse] internal stream error reading gnome-game gnibb... * 347898 : [id3v2mux] write GST_TAG_ENCODER and GST_TAG_ENCODER_VERSION * 347972 : [cdiocddasrc] core dumps if device is not found * 348644 : [id3demux] Gets the wrong part of binary blob for ID3 v2.... * 348752 : [udpsrc] add property to set buffer size for udp socket * 348913 : [id3v2mux] tagging utf-8 text may be converted to iso-8869-1 * 349155 : [smokeenc] does not set caps on it's buffers * 349189 : LADSPA gstsignalprocessor.c: line 408: assertion failed: ... * 349907 : multiudpsink messes up multicast addresses * 350433 : [rtph263pdepay] h.263plus depayloader does not work * 340492 : [flacdec] support push-based operation (and thus flac-ove... * 345679 : fix to avoid goom core dumping * 317470 : [GstCheck] gst_check_teardown_element asserts wrong refcount * 340980 : [pixbuf,wavparse] fix build with gcc 2.95 * 343661 : Jpeg image crashes gstreamer * 344923 : New SunAudio source plugin, and mixer now supports stereo... * 345301 : [PATCH] gst-plugins-good rtsp for Windows * 346921 : gstmultiudpsink multicast support is broken * 344136 : More accurate list of plugins which will/will not be buil... Changes since 0.10.2: * Annodex/CMML support * RTSP and RTP enhancements * HAL configured audio device support * FLAC, Matroska, AVI, WAV, ID3, APE, DV and JPEG plugin improvements * Recognise SSA/ASS and USF subtitles in Matroska files * Fixes for ESD and SunAudio output plugins * More uniform plugin descriptions * IceCast metadata reading plugin added * New plugins ported from 0.8: OSX audio, AVI muxer, X-Windows input, WAV encoder, Gdk-Pixbuf image decoder, Smoke decoder, Video colour balance * Lots of bug fixes Bugs fixed since 0.10.2: * 335067 : RTSP src not working with WMServer servers * 333657 : Replacing icy demuxing in gnomevfssrc * 329106 : HAL sound device wrapper plugins * 337749 : totem (gstreamer) crashes when playing an avi file * 330885 : avidemux does not handle eos at end of seek-region * 337364 : faulty GObject macros * 337625 : [patch] Streaming support for wavparse * 150363 : [pngdec] doesn't handle grayscale or paletted * 154744 : Time slider does not work with avi videos from Cannon SD100 * 161712 : [auparse] .au files don't play in playbin * 313266 : [wavparse] will not play DTS stream in malformed WAV * 319183 : rtspsrc filter sometimes uses an odd port for rtp * 319986 : annodex decoding and encoding support * 323721 : [id3demux] read in replaygain information from RVA2 frame... * 323880 : " Seek in ready " for dvdemux * 325191 : problem with auparse or mulawdec, choppy esd playback * 326160 : videobalance not ported to new GstVideoFilter * 327658 : " Seek in ready " support for wavparse plugin * 328327 : gst-plugins-good fail to compile with gcc 4.1 * 329107 : Profile support for gconfaudiosink * 330239 : Crash playing any song from a particular album over rhyth... * 330678 : Unable to play .fli files * 331253 : Critical warnings when using cddacdiosrc * 331368 : Gstreamer doesn't recognise tags * 331385 : [alpha] state change function returns a constant * 331672 : Another file that gstreamer can't read the tags on * 331905 : [jpeg] smokedec not ported * 331917 : [pngdec] does not support files with png streams * 332031 : [PATCH] avimux ported to 0.10 * 332547 : [wavparse] does not support multichannel wavs * 333070 : [id3demux] reads unicode tags incorrectly where .8 did it... * 333302 : [apedemux] some WavPack files with APE tags fail to play ... * 333392 : [sunaudio] unused variables break CVS build with -Werror * 333512 : [PATCH] Fix gst_pad_new_from_template (gst_static_pad_tem... * 333624 : invalid get_times implementation in gstdynudpsink * 333784 : [patch] unref the result of gst_pad_get_parent * 334083 : [jpegdec] wrong durations set on buffers after seeking in... * 334522 : avi of mpeg4 video and adpcm audio from digital camera re... * 334732 : [id3demux] mp3 fails to play because typefinding thinks i... * 334995 : [goom] zoom filter leaked * 335231 : [wavparse] incorrect way to calculate seek position with ... * 335755 : rhythmbox import crasher - png? * 335858 : Video playback out of sync * 335958 : [speexenc] doesn't work * 336110 : move taglib-based ID3 muxer to -good * 336602 : plugins need better/univied descriptions * 336756 : move ximagesrc to gst-plugins-good * 336889 : [avidemux] index creation might fail with some non-indexe... * 336904 : Problem playing some AVI file when splitting large chunks... * 337033 : [speex] can't seek in speex-encoded audio * 337183 : [matroska] " caps not real subset " when playing audio files * 337294 : AVI files downloaded from vidoe.google.com won't play * 337421 : [sunaudiosink] some fixes * 337609 : [flacdec] can't play .flac files where header says total_... * 338290 : [flacdec] segment seek not supported * 338713 : [id3demux] TCO genre tags (id3v2.2) don't get read by gst... * 338715 : [shout2send] fix crash on error and tags received before ... * 338716 : [wavenc] " not negotiated " error with CVS core * 338810 : [matroskademux] blocks on segmenting seek (and other seek... * 339446 : [matroska] can't play file if details come before type in... * 339451 : [matroska] enhancement for VfW compatibility cases * 339678 : [matroskamux] wrong timestamps of B-frames * 340346 : [matroskamux] blocks upon muxing video and vorbis-audio * 319884 : rtpamrdec discards non-transmitted frames Changes since 0.10.1: * New libcdio based CDDA reading element * APE tag reader ported * ID3 tag reading fixes * Sun Audio Sink fixes * GOOM and gconf element fixes * lots of bug and leak fixes Bugs fixed since 0.10.1: * 328336 : silence warings which make dvdec / dvdemux unusable * 315557 : Internal event problem with MP3s from vgmix.com * 323327 : [cdio] port cddasrc to 0.10 * 325148 : Bugs in G711 RTP packetization logic * 325649 : apetag plugin needs porting to 0.10 * 326446 : check that all elements in -good pass queries they can't ... * 326602 : id3demux is not compiling without ZLIB * 326683 : build problem caused by AS_LIBTOOL_TAGS([CXX]) * 326736 : gconf(audio|video)sink response to key changes * 326864 : [wavparse] time to bytes format conversion broken * 327009 : [esdsink] won't compile with includes in non-standard prefix * 327765 : [sunaudio] fixes for mixer and stuttering mp3 playback * 327825 : [matroskamux] Matroska muxer deadlock * 327871 : [videobox] crash when cropping * 328241 : id3demux emits NULL date for year tags * 328264 : Fix build with gcc 2.95 * 328531 : [matroskamux] doesn't send newsegment event, critical war... * 329181 : totem crash when using goom effect * 329810 : Fails to read ID3 tag * 330005 : Please use the autodetect sinks by default * 317658 : [cdio] support for cd-text and cd-g Changes since 0.10.0: * new id3 demuxer (replaces the mad one in gst-plugins-ugly) * memleak fixes in avidemux, wavparse, level, smoke * ports of multipart, * fixes in flacdec, flxdec, rtp * documentation updates on videomixer * added new sunaudiosink, gconfaudiosrc and gconfvideosrc elements Bugs fixed since 0.10.0: * 321269 : add sunaudio to 0.9 * 322769 : The ID3 tag of this file is a segfaulter * 323021 : sockfd property to udpsrc/dynudpsink elements * 322975 : erroneous audio specs in flac plugin * 323226 : block/crash on id3 v2 tags when using big blocksize * 323717 : < netinet/in.h > inclusion necessary on some systems * 323718 : [oss] does not build on OpenBSD 3.8 because of hardcoded ... * 323896 : pngdec/videomixer negotation problem in 0.10 * 324011 : Invalid payload type definition for some rtp payloaders * 324012 : Invalid caps on rtpspeexpay element * 325504 : [flacdec] gst_flac_dec_convert_src [mis]uses g_assert * 325974 : [gst0.10] doesn't correctly gets the tags on a mp3 * 326612 : Serious memory leak in level plugin * 326618 : memleak fix in smokeenc API added since 0.10.0: * device-name property on ossmixer subclasses * GstUDPSrc::sockfd property Changes since 0.9.6: * Parallel installability with 0.8.x series * Threadsafe design and API * effectv elements ported * videoflip updated * multipart ported * dv seeking fixed * rtp elements renamed Bugs fixed since 0.9.6: * 322377 : udpsrc leaks sockets * 322643 : Incorrect matroska frame default duration * 322645 : Matroska muxer: wrong pixel aspect ratio * 322667 : [jpegenc] leaks input buffer * 322794 : udp plugin linked against gstnet instead of gstnetbuffer Changes since 0.9.5: * added speex RTP payloader/depayloader * ported cutter * fractional framerates * more video filters now use BaseTransform Bugs fixed since 0.9.5: * 319184 : rtspsrc: invalid read in sdp_message_parse_buffer () * 321001 : [matroskademux] should seek to nearest preceding index en... * 321430 : goom fails to register on amd64 Changes since 0.9.4: * matroskamux fixes * wavenc fixes * cairotextoverlay ported Bugs fixed since 0.9.4: * 315194 : Licence information inconsistency of gst-plugins-good/gst... * 319731 : [matroska] SimpleBlock support for muxer and demuxer * 320308 : [matroska] set timestamps for buffers with ebml elements * 320920 : [osssink] tries to reuse a bad file descriptor * 321136 : [matroska-mux] avoid reading from unref'ed buffer Changes since 0.9.3: * DV/Firewire fixes * speexenc, cairotimeoverlay, matroska, pngdec, flxdec, videomixer, alphacolor ported Bugs fixed since 0.9.3: * 316204 : MinGW compilation: smtpe plugin has undefined symbols fro... * 316205 : Debug category for wavenc is not defined * 318847 : Matroska muxer port to 0.9 Changes since 0.9.1: * Parallel installability with 0.8.x series * Threadsafe design and API Bugs fixed since 0.9.1: * 316202 : MinGW compilation: undefined autoconf macro GST_DOC * 317338 : [osssink] can't handle mono gst-plugins-good-0.10.31/gst-libs/0000755000175000017500000000000011720565277013617 500000000000000gst-plugins-good-0.10.31/gst-libs/gst/0000755000175000017500000000000011720565277014414 500000000000000gst-plugins-good-0.10.31/gst-libs/gst/glib-compat-private.h0000644000175000017500000000700311677341654020355 00000000000000/* * glib-compat.c * Functions copied from glib 2.10 * * Copyright 2005 David Schleef * * 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 __GLIB_COMPAT_PRIVATE_H__ #define __GLIB_COMPAT_PRIVATE_H__ #include G_BEGIN_DECLS #if !GLIB_CHECK_VERSION(2,25,0) #if defined (_MSC_VER) && !defined(_WIN64) typedef struct _stat32 GStatBuf; #else typedef struct stat GStatBuf; #endif #endif #if GLIB_CHECK_VERSION(2,26,0) #define GLIB_HAS_GDATETIME #endif /* See bug #651514 */ #if GLIB_CHECK_VERSION(2,29,5) #define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \ g_atomic_pointer_compare_and_exchange ((a),(b),(c)) #define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \ g_atomic_int_compare_and_exchange ((a),(b),(c)) #else #define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \ g_atomic_pointer_compare_and_exchange ((volatile gpointer *)(a),(b),(c)) #define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \ g_atomic_int_compare_and_exchange ((volatile int *)(a),(b),(c)) #endif /* See bug #651514 */ #if GLIB_CHECK_VERSION(2,29,5) #define G_ATOMIC_INT_ADD(a,b) g_atomic_int_add ((a),(b)) #else #define G_ATOMIC_INT_ADD(a,b) g_atomic_int_exchange_and_add ((a),(b)) #endif /* copies */ #if GLIB_CHECK_VERSION (2, 31, 0) #define g_mutex_new gst_g_mutex_new static inline GMutex * gst_g_mutex_new (void) { GMutex *mutex = g_slice_new (GMutex); g_mutex_init (mutex); return mutex; } #define g_mutex_free gst_g_mutex_free static inline void gst_g_mutex_free (GMutex *mutex) { g_mutex_clear (mutex); g_slice_free (GMutex, mutex); } #define g_static_rec_mutex_init gst_g_static_rec_mutex_init static inline void gst_g_static_rec_mutex_init (GStaticRecMutex *mutex) { static const GStaticRecMutex init_mutex = G_STATIC_REC_MUTEX_INIT; *mutex = init_mutex; } #define g_cond_new gst_g_cond_new static inline GCond * gst_g_cond_new (void) { GCond *cond = g_slice_new (GCond); g_cond_init (cond); return cond; } #define g_cond_free gst_g_cond_free static inline void gst_g_cond_free (GCond *cond) { g_cond_clear (cond); g_slice_free (GCond, cond); } #define g_cond_timed_wait gst_g_cond_timed_wait static inline gboolean gst_g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *abs_time) { gint64 end_time; if (abs_time == NULL) { g_cond_wait (cond, mutex); return TRUE; } end_time = abs_time->tv_sec; end_time *= 1000000; end_time += abs_time->tv_usec; /* would be nice if we had clock_rtoffset, but that didn't seem to * make it into the kernel yet... */ /* if CLOCK_MONOTONIC is not defined then g_get_montonic_time() and * g_get_real_time() are returning the same clock and we'd add ~0 */ end_time += g_get_monotonic_time () - g_get_real_time (); return g_cond_wait_until (cond, mutex, end_time); } #endif /* GLIB_CHECK_VERSION (2, 31, 0) */ /* adaptations */ G_END_DECLS #endif gst-plugins-good-0.10.31/gst-libs/gst/gettext.h0000644000175000017500000000575411671175352016200 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. This program 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, or (at your option) any later version. This program 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 program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #ifdef ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ gst-plugins-good-0.10.31/gst-libs/gst/gst-i18n-plugin.h0000644000175000017500000000306211671175352017350 00000000000000/* GStreamer * Copyright (C) 2004 Thomas Vander Stichele * * gst-i18n-plugins.h: internationalization macros for the GStreamer plugins * * 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_I18N_PLUGIN_H__ #define __GST_I18N_PLUGIN_H__ #ifndef GETTEXT_PACKAGE #error You must define GETTEXT_PACKAGE before including this header. #endif #ifdef ENABLE_NLS #include #include "gettext.h" /* included with gettext distribution and copied */ /* we want to use shorthand _() for translating and N_() for marking */ #define _(String) dgettext (GETTEXT_PACKAGE, String) #define N_(String) gettext_noop (String) /* FIXME: if we need it, we can add Q_ as well, like in glib */ #else #define _(String) String #define N_(String) String #define ngettext(Singular,Plural,Count) ((Count>1)?Plural:Singular) #endif #endif /* __GST_I18N_PLUGIN_H__ */ gst-plugins-good-0.10.31/gst-plugins-good.spec.in0000644000175000017500000001706611671175352016504 00000000000000%define majorminor @GST_MAJORMINOR@ %define gstreamer gstreamer %define gst_minver 0.10.0 Name: %{gstreamer}-plugins-good Version: @VERSION@ Release: @PACKAGE_VERSION_RELEASE@.gst Summary: GStreamer plug-ins with good code and licensing Group: Applications/Multimedia License: LGPL URL: http://gstreamer.freedesktop.org/ Vendor: GStreamer Backpackers Team Source: http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: %{gstreamer} >= %{gst_minver} BuildRequires: %{gstreamer}-devel >= %{gst_minver} BuildRequires: gcc-c++ @USE_ESD_TRUE@BuildRequires: esound-devel >= 0.2.8 @USE_ESD_TRUE@Obsoletes: gstreamer-esd @USE_ESD_TRUE@ @USE_ESD_TRUE@Provides: gstreamer-audiosrc @USE_ESD_TRUE@Provides: gstreamer-audiosink @USE_FLAC_TRUE@BuildRequires: flac-devel >= 1.0.3 @USE_GCONF_TRUE@BuildRequires: GConf2-devel @USE_JPEG_TRUE@BuildRequires: libjpeg-devel @USE_LIBCACA_TRUE@BuildRequires: libcaca-devel @USE_LIBDV_TRUE@BuildRequires: libdv-devel @USE_LIBPNG_TRUE@BuildRequires: libpng-devel >= 1.2.0 @USE_OSS_TRUE@BuildRequires: glibc-devel @USE_SPEEX_TRUE@BuildRequires: speex-devel @USE_HAL_TRUE@BuildRequires: hal-devel @USE_SHOUT2_TRUE@BuildRequires: libshout-devel >= 2.0 @USE_AALIB_TRUE@BuildRequires: aalib-devel >= 1.3 @USE_AALIB_TRUE@Provides: gstreamer-aasink = %{version}-%{release} @USE_PULSE_TRUE@BuildRequires: pulseaudio-libs-devel @USE_DV1394_TRUE@BuildRequires: libavc1394-devel @USE_DV1394_TRUE@BuildRequires: libdc1394-devel @USE_DV1394_TRUE@BuildRequires: libiec61883-devel @USE_DV1394_TRUE@BuildRequires: libraw1394-devel %description GStreamer is a streaming media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plugin-based architecture means that new data types or processing capabilities can be added simply by installing new plug-ins. %prep %setup -q -n gst-plugins-good-%{version} %build %configure \ --enable-debug \ --enable-DEBUG make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 %makeinstall unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL # Clean out files that should not be part of the rpm. rm -f $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.a rm -f $RPM_BUILD_ROOT%{_libdir}/*.a rm -f $RPM_BUILD_ROOT%{_libdir}/*.la %find_lang gst-plugins-good-%{majorminor} %clean rm -rf $RPM_BUILD_ROOT %post @USE_GCONF_TRUE@export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` @USE_GCONF_TRUE@gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas > /dev/null %files -f gst-plugins-good-%{majorminor}.lang %defattr(-, root, root) %doc AUTHORS COPYING README REQUIREMENTS gst-plugins-good.doap %{_datadir}/gstreamer-%{majorminor}/presets/GstIirEqualizer10Bands.prs %{_datadir}/gstreamer-%{majorminor}/presets/GstIirEqualizer3Bands.prs # non-core plugins without external dependencies %{_libdir}/gstreamer-%{majorminor}/libgstalaw.so %{_libdir}/gstreamer-%{majorminor}/libgstalpha.so %{_libdir}/gstreamer-%{majorminor}/libgstautodetect.so %{_libdir}/gstreamer-%{majorminor}/libgstavi.so %{_libdir}/gstreamer-%{majorminor}/libgsteffectv.so %{_libdir}/gstreamer-%{majorminor}/libgstgoom.so %{_libdir}/gstreamer-%{majorminor}/libgstlevel.so %{_libdir}/gstreamer-%{majorminor}/libgstefence.so %{_libdir}/gstreamer-%{majorminor}/libgstmulaw.so %{_libdir}/gstreamer-%{majorminor}/libgstisomp4.so %{_libdir}/gstreamer-%{majorminor}/libgstrtp.so %{_libdir}/gstreamer-%{majorminor}/libgstrtpmanager.so %{_libdir}/gstreamer-%{majorminor}/libgstrtsp.so %{_libdir}/gstreamer-%{majorminor}/libgstsmpte.so %{_libdir}/gstreamer-%{majorminor}/libgstudp.so %{_libdir}/gstreamer-%{majorminor}/libgstvideobox.so %{_libdir}/gstreamer-%{majorminor}/libgstwavenc.so %{_libdir}/gstreamer-%{majorminor}/libgstwavparse.so %{_libdir}/gstreamer-%{majorminor}/libgstauparse.so %{_libdir}/gstreamer-%{majorminor}/libgstdebug.so %{_libdir}/gstreamer-%{majorminor}/libgstnavigationtest.so %{_libdir}/gstreamer-%{majorminor}/libgstalphacolor.so @USE_CAIRO_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcairo.so %{_libdir}/gstreamer-%{majorminor}/libgstflxdec.so %{_libdir}/gstreamer-%{majorminor}/libgstmatroska.so %{_libdir}/gstreamer-%{majorminor}/libgstvideomixer.so %{_libdir}/gstreamer-%{majorminor}/libgstcutter.so %{_libdir}/gstreamer-%{majorminor}/libgstmultipart.so %{_libdir}/gstreamer-%{majorminor}/libgstid3demux.so @USE_GDK_PIXBUF_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstgdkpixbuf.so %{_libdir}/gstreamer-%{majorminor}/libgstapetag.so %{_libdir}/gstreamer-%{majorminor}/libgstannodex.so %{_libdir}/gstreamer-%{majorminor}/libgstvideocrop.so %{_libdir}/gstreamer-%{majorminor}/libgsticydemux.so %{_libdir}/gstreamer-%{majorminor}/libgsttaglib.so %{_libdir}/gstreamer-%{majorminor}/libgstximagesrc.so %{_libdir}/gstreamer-%{majorminor}/libgstaudiofx.so %{_libdir}/gstreamer-%{majorminor}/libgstequalizer.so %{_libdir}/gstreamer-%{majorminor}/libgstmultifile.so %{_libdir}/gstreamer-%{majorminor}/libgstspectrum.so %{_libdir}/gstreamer-%{majorminor}/libgstgoom2k1.so %{_libdir}/gstreamer-%{majorminor}/libgstinterleave.so %{_libdir}/gstreamer-%{majorminor}/libgstreplaygain.so %{_libdir}/gstreamer-%{majorminor}/libgstdeinterlace.so %{_libdir}/gstreamer-%{majorminor}/libgstflv.so %{_libdir}/gstreamer-%{majorminor}/libgsty4menc.so %{_libdir}/gstreamer-%{majorminor}/libgstoss4audio.so %{_libdir}/gstreamer-%{majorminor}/libgstimagefreeze.so %{_libdir}/gstreamer-%{majorminor}/libgstshapewipe.so %{_libdir}/gstreamer-%{majorminor}/libgstvideofilter.so %{_libdir}/gstreamer-%{majorminor}/libgstaudioparsers.so # sys plugins @USE_GST_V4L2_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstvideo4linux2.so # gstreamer-plugins with external dependencies but in the main package @USE_LIBCACA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcacasink.so @USE_ESD_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstesd.so @USE_FLAC_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstflac.so @USE_JACK_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstjack.so @USE_JPEG_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstjpeg.so @USE_LIBPNG_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstpng.so @USE_OSS_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstossaudio.so @USE_SPEEX_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstspeex.so @USE_GCONF_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstgconfelements.so @USE_HAL_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgsthalelements.so @USE_SHOUT2_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstshout2.so @USE_AALIB_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstaasink.so @USE_LIBDV_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstdv.so @USE_DV1394_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgst1394.so @USE_WAVPACK_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstwavpack.so @USE_SOUP_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstsouphttpsrc.so @USE_PULSE_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstpulse.so # schema files @USE_GCONF_TRUE@%{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas %changelog * Tue Jun 12 2007 Jan Schmidt - wavpack and qtdemux have moved from bad * Fri Sep 02 2005 Thomas Vander Stichele - clean up for splitup gst-plugins-good-0.10.31/config.guess0000755000175000017500000012673011720560223014326 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011 Free Software Foundation, Inc. timestamp='2011-05-11' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-tilera-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gst-plugins-good-0.10.31/ABOUT-NLS0000644000175000017500000022532611720560207013240 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of November 2007. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ Compendium | [] [] [] [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] | bison-runtime | [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | dialog | | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | fetchmail | [] [] () [] [] | findutils | [] | findutils_stable | [] [] [] | flex | [] [] [] | fslint | | gas | | gawk | [] [] [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gip | [] | gliv | [] [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | [] [] () () [] | gnuedu | | gnulib | [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | | gramadoir | [] [] | grep | [] [] | gretl | () | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gst-plugins-ugly | [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] | indent | [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | [] [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] | man-db | [] [] [] | minicom | [] [] [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] | pwdutils | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | shared-mime-info | [] [] [] [] () [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | skencil | [] () | solfege | | soundtracker | [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] | texinfo | [] [] [] | tin | () () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] | bfd | [] [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | dialog | [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | fetchmail | [] | findutils | [] [] [] | findutils_stable | [] [] [] [] | flex | [] [] [] | fslint | | gas | [] [] | gawk | [] [] [] [] () | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnuedu | [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] [] | gpsdrive | [] | gramadoir | [] [] | grep | [] [] [] | gretl | [] [] [] () | gsasl | [] [] | gss | [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] | keytouch-editor | [] | keytouch-keyboa... | [] [] | latrine | [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] [] | libidn | [] [] | lifelines | () | lilypond | [] [] [] | lingoteach | [] [] [] | lprng | | lynx | [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] | minicom | [] [] [] [] | nano | [] [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] () | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | util-linux-ng | [] [] [] [] [] [] [] | vorbis-tools | | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn +--------------------------------------------------+ Compendium | [] | a2ps | () [] [] | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | [] | cpplib | [] | cryptonit | [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | fetchmail | [] [] | findutils | [] | findutils_stable | [] | flex | [] [] | fslint | | gas | | gawk | [] [] | gcal | | gcc | | gettext-examples | [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] [] | gnubiff | | gnucash | () () () | gnuedu | | gnulib | [] [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | [] | gpsdrive | [] | gramadoir | () | grep | [] [] | gretl | | gsasl | [] | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] | gtick | [] | gtkam | [] [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] | indent | [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | [] | libidn | [] [] | lifelines | [] | lilypond | [] | lingoteach | [] | lprng | | lynx | [] [] | m4 | [] [] | mailfromd | | mailutils | | make | [] [] [] | man-db | | minicom | [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] [] [] | pwdutils | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | shared-mime-info | [] [] [] [] [] [] [] | sharutils | [] [] | shishi | | skencil | | solfege | () () | soundtracker | | sp | () | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] | tin | | tuxpaint | () [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | util-linux-ng | [] [] | vorbis-tools | | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] [] | bash | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | dialog | [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] | findutils_stable | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] | gas | | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gip | [] [] [] [] | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () [] | gnucash | () [] | gnuedu | | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | gretl | [] [] [] | gsasl | [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] | gstreamer | [] [] [] [] | gtick | [] | gtkam | [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | herrie | [] [] [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] [] | libgpg-error | [] [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] [] [] [] | minicom | [] [] [] [] [] | nano | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | [] [] | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ Compendium | [] [] [] [] | 19 a2ps | [] [] [] | 19 aegis | [] | 1 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 16 bash | [] | 6 bfd | | 2 bibshelf | [] | 7 binutils | [] [] [] [] | 9 bison | [] [] [] [] | 20 bison-runtime | [] [] [] [] | 18 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 9 console-tools | [] [] | 5 coreutils | [] [] [] | 18 cpio | [] [] [] [] | 11 cpplib | [] [] [] [] [] | 12 cryptonit | [] | 6 dialog | [] [] [] | 9 diffutils | [] [] [] [] [] | 29 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 fetchmail | [] [] | 12 findutils | [] [] [] | 11 findutils_stable | [] [] [] [] | 18 flex | [] [] | 15 fslint | [] | 2 gas | [] | 3 gawk | [] [] [] | 16 gcal | [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] | 29 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 20 gip | [] [] | 13 gliv | [] [] | 11 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 16 gnubiff | [] | 2 gnucash | () [] | 5 gnuedu | [] | 2 gnulib | [] | 10 gnunet | | 0 gnunet-gtk | [] [] | 3 gnutls | | 4 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] [] | 7 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] [] | 16 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] [] | 22 gpe-filemanager | [] [] | 7 gpe-go | [] [] [] [] | 19 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] [] | 21 gpe-taskmanager | [] [] [] [] | 21 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] [] | 8 gphoto2 | [] [] [] [] | 21 gprof | [] [] | 13 gpsdrive | [] | 5 gramadoir | [] | 7 grep | [] | 12 gretl | | 6 gsasl | [] [] [] | 9 gss | [] | 7 gst-plugins-bad | [] [] [] | 13 gst-plugins-base | [] [] | 11 gst-plugins-good | [] [] [] [] [] | 16 gst-plugins-ugly | [] [] [] | 13 gstreamer | [] [] [] | 18 gtick | [] [] | 7 gtkam | [] | 16 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 27 gutenprint | | 4 hello | [] [] [] [] [] | 38 herrie | [] [] | 8 hylafax | | 0 idutils | [] [] | 15 indent | [] [] [] [] [] | 28 iso_15924 | [] [] | 4 iso_3166 | [] [] [] [] [] [] [] [] [] | 54 iso_3166_2 | [] [] | 4 iso_4217 | [] [] [] [] [] | 24 iso_639 | [] [] [] [] [] | 26 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] [] | 13 keytouch | [] | 8 keytouch-editor | [] | 5 keytouch-keyboa... | [] | 5 latrine | [] [] | 5 ld | [] [] [] [] | 10 leafpad | [] [] [] [] [] | 24 libc | [] [] [] | 19 libexif | [] | 5 libextractor | [] | 5 libgpewidget | [] [] [] | 20 libgpg-error | [] | 6 libgphoto2 | [] [] | 9 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] [] | 11 libidn | [] [] | 11 lifelines | | 4 lilypond | [] | 6 lingoteach | [] | 6 lprng | [] | 2 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailfromd | [] [] | 3 mailutils | [] [] | 8 make | [] [] [] | 20 man-db | [] | 9 minicom | [] | 14 nano | [] [] [] | 20 opcodes | [] [] | 10 parted | [] [] [] | 11 pilot-qof | [] | 1 popt | [] [] [] [] | 18 psmisc | [] [] | 10 pwdutils | [] | 3 qof | [] | 4 radius | [] [] | 7 recode | [] [] [] | 25 rpm | [] [] [] [] | 13 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] [] | 23 shared-mime-info | [] [] [] | 29 sharutils | [] [] [] | 23 shishi | [] | 3 skencil | [] | 7 solfege | [] | 3 soundtracker | [] [] | 9 sp | [] | 3 system-tools-ba... | [] [] [] [] [] [] [] | 38 tar | [] [] [] | 17 texinfo | [] [] [] | 15 tin | | 1 tuxpaint | [] [] [] | 19 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 util-linux-ng | [] [] [] | 20 vorbis-tools | [] [] | 4 wastesedge | | 1 wdiff | [] [] | 23 wget | [] [] [] | 20 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] | 14 xpad | [] [] [] | 15 +---------------------------------------------------+ 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If November 2007 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. gst-plugins-good-0.10.31/config.h.in0000644000175000017500000002503711720560221014025 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Default audio sink */ #undef DEFAULT_AUDIOSINK /* Default audio source */ #undef DEFAULT_AUDIOSRC /* Default video sink */ #undef DEFAULT_VIDEOSINK /* Default video source */ #undef DEFAULT_VIDEOSRC /* Default visualizer */ #undef DEFAULT_VISUALIZER /* Disable Orc */ #undef DISABLE_ORC /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* gettext package name */ #undef GETTEXT_PACKAGE /* Defined if gcov is enabled to force a rebuild due to config.h changing */ #undef GST_GCOV_ENABLED /* Default errorlevel to use */ #undef GST_LEVEL_DEFAULT /* GStreamer license */ #undef GST_LICENSE /* package name in plugins */ #undef GST_PACKAGE_NAME /* package origin */ #undef GST_PACKAGE_ORIGIN /* GStreamer package release date/time for plugins as YYYY-MM-DD */ #undef GST_PACKAGE_RELEASE_DATETIME /* struct v4l2_buffer missing */ #undef GST_V4L2_MISSING_BUFDECL /* I know the API is subject to change. */ #undef G_UDEV_API_IS_SUBJECT_TO_CHANGE /* Define to enable aalib ASCII Art library (used by aasink). */ #undef HAVE_AALIB /* Define to enable XML library (used by annodex). */ #undef HAVE_ANNODEX /* Define to 1 if you have the `asinh' function. */ #undef HAVE_ASINH /* Define to enable bz2 library for matroska . */ #undef HAVE_BZ2 /* Define to enable Cairo graphics rendering (used by cairo). */ #undef HAVE_CAIRO /* Define to enable Cairo graphics rendering gobject bindings (used by cairooverlay). */ #undef HAVE_CAIRO_GOBJECT /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if you have the `cosh' function. */ #undef HAVE_COSH /* Define if the host CPU is an Alpha */ #undef HAVE_CPU_ALPHA /* Define if the host CPU is an ARM */ #undef HAVE_CPU_ARM /* Define if the host CPU is a CRIS */ #undef HAVE_CPU_CRIS /* Define if the host CPU is a CRISv32 */ #undef HAVE_CPU_CRISV32 /* Define if the host CPU is a HPPA */ #undef HAVE_CPU_HPPA /* Define if the host CPU is an x86 */ #undef HAVE_CPU_I386 /* Define if the host CPU is a IA64 */ #undef HAVE_CPU_IA64 /* Define if the host CPU is a M68K */ #undef HAVE_CPU_M68K /* Define if the host CPU is a MIPS */ #undef HAVE_CPU_MIPS /* Define if the host CPU is a PowerPC */ #undef HAVE_CPU_PPC /* Define if the host CPU is a 64 bit PowerPC */ #undef HAVE_CPU_PPC64 /* Define if the host CPU is a S390 */ #undef HAVE_CPU_S390 /* Define if the host CPU is a SPARC */ #undef HAVE_CPU_SPARC /* Define if the host CPU is a x86_64 */ #undef HAVE_CPU_X86_64 /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to enable DirectSound plug-in (used by directsoundsink). */ #undef HAVE_DIRECTSOUND /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* define for working do while(0) macros */ #undef HAVE_DOWHILE_MACROS /* Define to enable raw1394 and avc1394 library (used by 1394). */ #undef HAVE_DV1394 /* Define to enable ESounD sound daemon (used by esdsink). */ #undef HAVE_ESD /* Define to enable building of experimental plug-ins. */ #undef HAVE_EXPERIMENTAL /* Define to enable building of plug-ins with external deps. */ #undef HAVE_EXTERNAL /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* FIONREAD ioctl found in sys/filio.h */ #undef HAVE_FIONREAD_IN_SYS_FILIO /* FIONREAD ioctl found in sys/ioclt.h */ #undef HAVE_FIONREAD_IN_SYS_IOCTL /* Define to enable FLAC lossless audio (used by flac). */ #undef HAVE_FLAC /* Define to 1 if you have the `fpclass' function. */ #undef HAVE_FPCLASS /* Define if compiler supports gcc inline assembly */ #undef HAVE_GCC_ASM /* Define to enable GConf libraries (used by gconfelements). */ #undef HAVE_GCONF /* Define to enable GConf schemas. */ #undef HAVE_GCONFTOOL /* Define to enable GDK pixbuf (used by gdkpixbuf). */ #undef HAVE_GDK_PIXBUF /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to enable Video 4 Linux 2 (used by v4l2src). */ #undef HAVE_GST_V4L2 /* Whether gudev is available for device detection */ #undef HAVE_GUDEV /* Define to enable HAL libraries (used by halelements). */ #undef HAVE_HAL /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if we have struct ip_mreqn */ #undef HAVE_IP_MREQN /* Define to 1 if you have the `isinf' function. */ #undef HAVE_ISINF /* Define to enable Jack (used by jack). */ #undef HAVE_JACK /* defined if jack >= 0.120.1 is available */ #undef HAVE_JACK_0_120_1 /* defined if jack >= 1.9.7 is available */ #undef HAVE_JACK_1_9_7 /* Define to enable jpeg library (used by jpeg). */ #undef HAVE_JPEG /* Define to enable libcaca coloured ASCII art (used by cacasink). */ #undef HAVE_LIBCACA /* Define to enable libdv DV demuxer/decoder (used by dv). */ #undef HAVE_LIBDV /* Define to enable Portable Network Graphics library (used by png). */ #undef HAVE_LIBPNG /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* soup gnome integration */ #undef HAVE_LIBSOUP_GNOME /* Whether libv4l2 is available for video buffer conversion */ #undef HAVE_LIBV4L2 /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Use Orc */ #undef HAVE_ORC /* Define to enable OSS audio (used by ossaudio). */ #undef HAVE_OSS /* Define to enable Open Sound System 4 (used by oss4). */ #undef HAVE_OSS4 /* Define if OSS includes are in /machine/ */ #undef HAVE_OSS_INCLUDE_IN_MACHINE /* Define if OSS includes are in / */ #undef HAVE_OSS_INCLUDE_IN_ROOT /* Define if OSS includes are in /sys/ */ #undef HAVE_OSS_INCLUDE_IN_SYS /* Define to enable OSX audio (used by osxaudio). */ #undef HAVE_OSX_AUDIO /* Define to enable OSX video (used by osxvideosink). */ #undef HAVE_OSX_VIDEO /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H /* Define to enable pulseaudio plug-in (used by pulseaudio). */ #undef HAVE_PULSE /* defined if pulseaudio >= 0.9.20 is available */ #undef HAVE_PULSE_0_9_20 /* defined if pulseaudio >= 1.0 is available */ #undef HAVE_PULSE_1_0 /* Define if RDTSC is available */ #undef HAVE_RDTSC /* Define to 1 if you have the `rint' function. */ #undef HAVE_RINT /* Define to enable Shoutcast/Icecast client library (used by shout2). */ #undef HAVE_SHOUT2 /* Define to 1 if you have the `sinh' function. */ #undef HAVE_SINH /* Define to enable soup http client plugin (2.4) (used by souphttpsrc). */ #undef HAVE_SOUP /* Define to enable speex speech codec (used by speex). */ #undef HAVE_SPEEX /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to enable Sun Audio (used by sunaudio). */ #undef HAVE_SUNAUDIO /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to enable taglib tagging library (used by taglib). */ #undef HAVE_TAGLIB /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if valgrind should be used */ #undef HAVE_VALGRIND /* Define to enable wavpack plug-in (used by wavpack). */ #undef HAVE_WAVPACK /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define to enable X libraries and plugins (used by ximagesrc). */ #undef HAVE_X /* Define to enable X Shared Memory extension. */ #undef HAVE_XSHM /* Define to enable X11 XVideo extensions. */ #undef HAVE_XVIDEO /* Define to enable zlib support for qtdemux/matroska. */ #undef HAVE_ZLIB /* the host CPU */ #undef HOST_CPU /* gettext locale dir */ #undef LOCALEDIR /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* directory where plugins are located */ #undef PLUGINDIR /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* defined if speex 1.0.x API detected */ #undef SPEEX_1_0 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* old wavpack API */ #undef WAVPACK_OLD_API /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING gst-plugins-good-0.10.31/po/0000755000175000017500000000000011720565344012504 500000000000000gst-plugins-good-0.10.31/po/hu.gmo0000644000175000017500000003560311720565343013552 00000000000000     JZ cm v  <[ b4o)).'C&k7)JVtqW=*X3M$l#      a(_&"228GT61.243g$)@$+#P5t3)@.Et    /K P^bjsz    &/ 46@wr  /, \gmr y 0   @V[ks   D0 '@ :h * - * '!A! H!R![!a!9j!!!!!!!"("7E"}$ $$ $$ $R$ )% 3% =% G%Q%X%_%v%~%%%%%%&)&%2& X&c&?t&'&<&0'3J'4~'2'?'}&(/(Z(m/)^)-)\**C***,*+#+ O+ \+ j+ x+ + + +}+?+,?k,*,<,I-&]-i-X-QG.B.T.J1/<|/</a/DX0;0[0@51v1|11111 1012+2J2\2y2 ~2 2 22222 22233)3 -3 :3G3P3Y3 b3o33 333 3 3333334 44 -484DO44o05555555556 666#6";6^6/r6666 666-67,7K7T73]7*7)777888-868 H8U8g8p8\x8J83 9OT9(9*9.9':E: K:X:h:n:Ow::::;!;4;R;e;>Z*Jr`xgF8 I#wbi-?^U@ca'ze]=_%WXnov5M&GNH.\~7V$t9)}D"Q,|El:s ;yTqPKfSh!/j RkB m0<[ dLu1+O(6{ApY234C%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.25.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-11-04 01:21+0100 Last-Translator: Gabor Kelemen Language-Team: Hungarian Language: hu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rosetta-Export-Date: 2007-07-27 19:18:15+0000 X-Generator: KBabel 1.11.4 X-Rosetta-Export-Date: 2007-07-27 19:18:15+0000 Plural-Forms: nplurals=2; plural=(n != 1); %s %d funkció%s funkció„%s” ettől: „%s”3D középső3D mély3D javításHálózati hiba történt, vagy a kiszolgáló váratlanul lezárta a kapcsolatot.1. AUX be1. AUX ki2. AUX be2. AUX kiAUX beAUX kiHanglejátszási hiba.BasszusBasszuskiemelésFekete csatlakozóFekete előoldali csatlakozóKék csatlakozóKék előoldali csatlakozóBeépített hangszóróCDNem azonosítható a(z) „%s” eszköz.Óra nélkül lehetetlen a működésKözépsőKözépső / LFEA felbontás módosítása futás közben még nem támogatott.Nem lehet csatlakozni a kiszolgálóhozNem állíthatók sorba a pufferek a(z) „%s” eszközben.Nem hozható létre kapcsolat a kiszolgálóhoz.Nem hozható létre kapcsolat a hangkiszolgálóhozNem kérhetők le a(z) „%s” eszköz paramétereiNem képezhetők le a(z) „%s” eszköz puffereiNem nyitható meg hangeszköz a keverővezérlő kezeléséhez.Nem nyitható meg hangeszköz a keverővezérlő kezeléséhez. Az Open Sound System ezen verzióját az elem nem támogatja.Nem nyitható meg hangeszköz a lejátszáshoz.Nem nyitható meg hangeszköz a lejátszáshoz. Az eszközt másik alkalmazás használja.Nem nyitható meg hangeszköz a lejátszáshoz. Az Open Sound System ezen verzióját az elem nem támogatja.Nem nyitható meg hangeszköz a lejátszáshoz. Nincs jogosultsága az eszköz megnyitására.Nem nyitható meg hangeszköz a felvételhez.Nem nyitható meg hangeszköz a felvételhez. Nincs jogosultsága az eszköz megnyitására.Nem lehet olvasásra és írásra megnyitni a(z) „%s” eszközt.Nem lehet feloldani a kiszolgáló nevét.A(z) „%s” eszköz nem rögzítőeszköz.A(z) „%s” eszköz nem kimeneti eszköz.DiagnosztikaDigitális beDigitális ki1. digitális2. digitális3. digitálisLekeveréshiba a(z) „%s” eszköz képességeinek lekérésekor. Ez nem egy v4l2 meghajtó. Ellenőrizze, hogy nem v4l1 meghajtó-e.Hiba %d bájt olvasásakor a következő eszközről: „%s”.Hiba %d bájt olvasásakor a következő eszközről: „%s”.Hiba a hangeszközről való felvételkor.Hiba %d próbálkozás után. Eszköz: %s. Rendszerhiba: %s.A vezérlőattribútumok lekérése meghiúsult a(z) „%s” eszközön.A JPEG kép visszafejtése meghiúsultAz aktuális bemenet lekérése meghiúsult a(z) „%s” eszközről. Lehet, hogy ez egy rádióeszköz.A tuner aktuális frekvenciájának lekérdezése meghiúsult a(z) „%s” eszköztől.A(z) %d. tuner beállításának lekérése a(z) „%s” eszközön meghiúsult.A jelerősség lekérdezése meghiúsult a(z) „%s” eszközön.A(z) %d. vezérlőelem értékének lekérése meghiúsult a(z) „%s” eszközön.A(z) %d bemenet attribútumainak lekérése meghiúsult a(z) %s eszközönA norma lekérdezése meghiúsult a(z) „%s” eszköztől.A hangkiszolgáló képességeinek lekérdezése meghiúsultA tuner aktuális frekvenciájának beállítása meghiúsult a(z) „%s” eszközön %lu Hz-re.A(z) %d. bemenet beállítása meghiúsult a(z) „%s” eszközön.A norma beállítása meghiúsult a(z) „%s” eszközön.A(z) $%2d érték beállítása $%1d vezérlőelemhez meghiúsult a(z) „%s” eszközön.Nem sikerült videokockákat lekérni a(z) „%s” eszköztől.GyorsElülsőElőlapi fülhallgatóElőlapi vonalbemenetElőlapi vonalkimenetElőlapi mikrofonErősítésVáratlan keretméret (%u) érkezett %u helyett.Szürke csatlakozóSzürke előoldali csatlakozóZöld csatlakozóZöld előoldali csatlakozóHDMIMobiltelefonFejhallgatóFülhallgatóMagasBe-erősítésBemenetBemeneti keverésBelső CDBelső adatfolyam-hiba.Belső adatfolyam-hiba.JackBillentyűzetcsengőLFEVonalbemenetVonalkimenet1. vonal2. vonal3. vonalVonalbemenetVisszacsatolásAlacsonyFő hangerőKözepesMikrofon1. mikrofon2. mikrofonMikrofonerősítésMikrofonerősítésMikrofonforrásKeverőModemMonitorMonitor forrásaMonó keverésNémításNincs beállítva URL.Nincs vagy érvénytelen bemeneti hang, az AVI-folyam sérült lesz.Nem található támogatott adatfolyam. Lehet, hogy több átviteli protokollt kell engedélyezni, vagy hiányzik a megfelelő GStreamer RTSP bővítmény.Nem található támogatott adatfolyam. Telepítse a GStreamer RTSP bővítményt a Real media adatfolyamokhoz.NincsKiBeNarancs csatlakozóNarancs előoldali csatlakozóEgyébKi-erősítésKimeneterősítésPCM2. PCMHang-beHang-kiRózsaszín csatlakozóRózsaszín előoldali csatlakozóLejátszási portokEz a hangeszköz nem támogatja a lejátszást.ÉlesRádióHátsóFelvételFelvételerősítésFelvétel forrásaEz a hangeszköz nem támogatja a felvételt.Vörös csatlakozóVörös előoldali csatlakozóSPDIF beSPDIF kiA biztonságos kapcsolat kialakítása meghiúsult.A kiszolgáló nem támogatja a tekerést.A kiszolgáló hibás adatokat küldött.OldalsóSztereó szimulálásaHangfalHangfalforrásSzóráskimenetSztereóSztereó keverésTérhatásúTérhatású hangSzintet.TelefonA(z) „%s” eszköz illesztőprogramja nem támogat egyetlen ismert felvételi módot sem.A fájlban található videó lehet, hogy nem játszható le megfelelően.A fájl nem tartalmaz lejátszható adatfolyamokat.A fájl túl sok adatfolyamot tartalmaz. Csak az első %d kerül lejátszásra.A fájl sérült és nem játszható le.A fájl nem teljes és nem játszható le.A fájl nem érvényes és nem játszható le.Ez nem egy eszköz: „%s”.MagasNagyon magasNagyon alacsonyVideoVideo beA videobemeneti eszköz nem fogadta el az új képkockasebesség-beállítást.Virtuális keverőcsatornákVirtuális keverőbemenetVirtuális keverőkimenetHangerőFehér csatlakozóFehér előoldali csatlakozóSárga csatlakozóSárga előoldali csatlakozógst-plugins-good-0.10.31/po/pl.gmo0000644000175000017500000003656211720565343013556 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""# $ $$ $ $$L$@%O%^%m% |% %%%%%"%%&&9&P&,S&&& &I&&'7''3_'<'5'7(K>((C)u_))l^*B*k+?z+*+8+3, R,^,o, , , ,,v,-(--V-.-B-B-'9.Ma.M.P.>N/=/C/>07N090Z041;P141K1: 2H2O2V2!t2"22 2523!&3H3#Y3}33 3 333333%3%494 Q4^4t4x44444444444 4 445&5:5A5G5O5b5 r5}5J5567 7 )747)K7u7z77777 77$77C8 I8S8Y8 ^8i88B88$899:-9"h9 999 9999:: : 2:=:PE:8:?:F;5V;7;3;;< < +<8<><WM<<<< <="=;=$M=v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-07 21:53+0100 Last-Translator: Jakub Bogusz Language-Team: Polish Language: pl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funkcja %s %dFunkcja %s'%s' autorstwa '%s'Środek 3DGłębia 3DRozszerzenie 3DWystąpił błąd sieciowy lub serwer nieoczekiwanie zamknął połączenie.Wejście AUX 1Wyjście AUX 1Wejście AUX 2Wyjście AUX 2Wejście AUXWyjście AUXBłąd odtwarzania dźwięku.NiskiePodbicie basówZłącze czarneZłącze czarne na panelu przednimZłącze niebieskieZłącze niebieskie na panelu przednimWbudowany głośniczekCDNie można zidentyfikować urządzenia '%s'.Nie można pracować bez zegaraŚrodekŚrodek / LFEZmiana rozdzielczości w czasie działania nie jest jeszcze obsługiwana.Nie udało się połączyć z serweremNie udało się skolejkować buforów urządzenia '%s'.Nie udało się nawiązać połączenia z serwerem.Nie udało się nawiązać połączenia z serwerem dźwiękuNie udało się uzyskać parametrów urządzenia '%s'Nie udało się odwzorować buforów z urządzenia '%s'Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem.Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem. Ta wersja Open Sound System nie jest obsługiwana przez ten element.Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania.Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Urządzenie jest używane przez inną aplikację.Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Ta wersja Open Sound System nie jest obsługiwana przez ten element.Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Brak uprawnień do otwarcia urządzenia.Nie udało się otworzyć urządzenia dźwiękowego do nagrywania.Nie udało się otworzyć urządzenia dźwiękowego do nagrywania. Brak uprawnień do otwarcia urządzenia.Nie udało się otworzyć urządzenia '%s' do odczytu i zapisu.Nie udało się rozwiązać nazwy serwera.Urządzenie '%s' nie jest urządzeniem przechwytującym.Urządzenie '%s' nie jest urządzeniem wyjściowym.DiagnostykaWejście cyfroweWyjście cyfroweCyfrowe 1Cyfrowe 2Cyfrowe 3Miksowanie w dółBłąd pobierania możliwości urządzenia '%s': to nie jest sterownik v4l2. Proszę sprawdzić czy to sterownik v4l1.Błąd odczytu %d bajtów z urządzenia '%s'.Błąd odczytu %d bajtów z urządzenia '%s'.Błąd nagrywania z urządzenia dźwiękowego.Niepowodzenie po %d próbach. Urządzenie %s. Błąd systemowy: %sNie udało się uzyskać atrybutów sterujących urządzenia '%s'.Nie udało się zdekodować obrazu JPEGNie udało się uzyskać aktualnego wejścia urządzenia '%s'. Może to radioNie udało się uzyskać aktualnego wyjścia urządzenia '%s'. Może to radioNie udało się uzyskać aktualnej częstotliwości tunera dla urządzenia '%s'.Nie udało się uzyskać ustawień tunera %d urządzenia '%s'.Nie udało się uzyskać siły sygnału dla urządzenia '%s'.Nie udało się uzyskać wartości sterującej %d urządzenia '%s'.Nie udało się odpytać o atrybuty wejścia %d urządzenia %sNie udało się odpytać normalizacji urządzenia '%s'.Nie udało się odpytać o możliwości serwera dźwiękuNie udało się ustawić aktualnej częstotliwości tunera dla urządzenia '%s' na %lu Hz.Nie udało się ustawić wejścia %d urządzenia %s.Nie udało się ustawić normalizacji dla urządzenia '%s'.Nie udało się ustawić wyjścia %d urządzenia %s.Nie udało się ustawić %d jako wartości sterującej %d urządzenia '%s'.Nie udało się uzyskać klatek obrazu z urządzenia '%s'.SzybkoPrzódSłuchawki na panelu przednimWejście linii na panelu przednimWyjśćie linii na panelu przednimMikrofon na panelu przednimWzmocnienieOtrzymano nieoczekiwany rozmiar klatki %u zamiast %u.Złącze szareZłącze szare na panelu przednimZłącze zieloneZłącze zielone na panelu przednimHDMIZestaw słuchawkowySłuchawkiSłuchawkiDużeWzmocnienie weWejścieMiksowanie wejściaWewnętrzny CDBłąd wewnętrzny przepływu danych.Błąd wewnętrzny strumienia danych.Błędny rozmiar atomu.Gniazdo jackPiszczenie klawiaturyLFEWejście liniiWyjście liniiLinia 1Linia 2Linia 3WejściePętla zwrotnaMałeGłównaŚrednieMikrofonMikrofon 1Mikrofon 2Podbicie mikrofonuWzmocnienie mikrofonuŹródło mikrofonuMikserModemMonitorŹródło monitoraMiksowanie monoWyciszenieNie ustawiono URL-a.Brak lub niepoprawne wejście dźwięku, strumień AVI będzie uszkodzony.Nie znaleziono obsługiwanego strumienia. Być może trzeba zezwolić na więcej protokołów transportu, albo może brakować właściwej wtyczki rozszerzenia RTSP GStreamera.Nie znaleziono obsługiwanego strumienia. Być może trzeba zainstalować wtyczkę rozszerzenia GStreamera RTSP dla strumieni Real media.BrakWyłączoneWłączoneZłącze pomarańczoweZłącze pomarańczowe na panelu przednimInneWzmocnienie wyWzmocnienie wyjściaPCMPCM-2MikrofonSłuchawkiZłącze różoweZłącze różowe na panelu przednimPorty odtwarzaniaOdtwarzanie nie jest obsługiwane przez to urządzenie dźwiękowe.ProdukcjaRadioTyłNagrywanieWzmocnienie nagrywaniaŹródło nagrywaniaNagrywanie nie jest obsługiwane przez to urządzenie dźwiękowe.Złącze czerwoneZłącze czerwone na panelu przednimWejście SPDIFWyjście SPDIFUstanowienie bezpiecznego połączenia nie powiodło się.Serwer nie obsługuje przewijania.Serwer przysłał błędne dane.BokiSymulacja stereoGłośniczekŹródło głośniczkaRozprowadzenie wyjściaStereoMiksowanie stereoSurroundDźwięk surroundSyntezatorTelefonSterownik urządzenia '%s' nie obsługuje żadnej znanej metody przechwytywania.Obraz w tym pliku może nie być odtwarzany prawidłowo.Ten plik nie zawiera strumieni nadających się do odtworzenia.Ten plik zawiera zbyt dużo strumieni. Odtwarzanie tylko %d pierwszychTen plik jest uszkodzony i nie może być odtworzony.Ten plik jest niekompletny i nie może być odtworzony.Ten plik jest błędny i nie może być odtworzony.To nie jest urządzenie '%s'.WysokieBardzo dużeBardzo małeObrazWejście videoUrządzenie wejściowe obrazu nie przyjęło nowego ustawienia częstotliwości klatek.Kanały miksera wirtualnegoWejście miksera wirtualnegoWyjście miksera wirtualnegoGłośnośćZłącze białeZłącze białe na panelu przednimZłącze żółteZłącze żółte na panelu przednimgst-plugins-good-0.10.31/po/boldquot.sed0000644000175000017500000000033111720560210014732 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g gst-plugins-good-0.10.31/po/ja.gmo0000644000175000017500000003577711720565343013544 00000000000000$, J   $+3I NYix 4).:'i&7)pVqWc*X3?s$#      a#(&"22+^GzH6 1B2t3)@%F5l33.8gv     (,4=DKRZc j u  66r@EIL]c lx| /  0 @N Wa   D0='n:*-**Uov|9' f y '    !%!A!0D! u!!B!$!3!91"Bk"B"Z"L#H$$m$ %%Bc&&W4'*'E'<':(A(T(g(v((((\k)_)Q(*az*K*.(+rW+r+W=,Y,Y,QI-T-\-?M.n.N. K/*X/'/'/-/ 0V 0b0{000000000$0'$1L1 h1u1111 1 1 111 12232!J2l22 2 2 222 2$ 3g/334j5q5x55 555555556T$6 y66666Z6 7 7 +7?77<w7 7 77 7788 38=8xD8T8Q9vd9N9T*:H:0:: ; ;c;!~;;;;;; <z \v>B4TeWE ;[pwq0~|=F6'{"]@V.xy:j$gL i M#noPkDJHG-a5/Ur?A,Ost^K_`b1hS 8fmN7IlQ2C9XYZRdu&+})*%(3!c3D CenterA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlue ConnectorBuilt-in SpeakerCDCannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGreen ConnectorHDMIHandsetHeadphoneHeadphonesIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackMasterMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPlayback PortsPlayback is not supported by this audio device.RadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.SideSpeakerSpeaker SourceStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorYellow ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-08-28 23:59+0900 Last-Translator: Takeshi Hamasaki Language-Team: Japanese Language: ja MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 0.3 Plural-Forms: nplurals=1; plural=0; 3Dセンターネットワークエラーが発生したか、サーバーが予期せず接続を閉じました。AUX 1入力AUX 1出力AUX 2入力AUX 2出力AUX入力AUX出力オーディオ再生エラーです。低音低音ブースト黒色コネクタ青色コネクタビルトインスピーカCDクロックなしでは動作できません。センターセンター / LFE実行時の解像度変更はサポートされていません。サーバーへ接続できませんサーバーへの接続を確立できません。サウンドサーバーへの接続に失敗しましたデバイス '%s' 上のパラメータを取得できません。デバイス '%s' からバッファをマップできません。音声デバイスをミキサーコントロール用に開くことができません。ミキサーコントロール用にオーディオデバイスを開くことができませんでした。Open Sound Systemのこのバージョンではこの要素によってサポートされていません。音声デバイスを読み取り用に開くことができません。再生用にオーディオデバイスを開くことができませんでした。デバイスが他のアプリケーションで利用されています再生用にオーディオデバイスを開くことができませんでした。このバージョンの Open Sound System は、このエレメントによってサポートされていません。再生用にオーディオデバイスを開くことができませんでした。デバイスを開くための権限がありません。音声デバイスを録音用に開くことができません。録音用にオーディオデバイスを開くことができませんでした。デバイスを開くための権限がありません。デバイス '%s' を読み取り用と書き込み用に開くことができませんサーバー名を解決できません。デバイス '%s' はキャプチャデバイスではありませんデバイス '%s' は出力デバイスではありません診断デジタル入力デジタル出力デジタル 1デジタル 2デジタル 3ダウンミックスデバイス '%s' ケイパビリティの取得時にエラーが発生しました: v4l2 ドライバではありません。v4l1 ドライバでないか、チェックしてください。デバイス %2$s から %1$d バイト読み込み時にエラーが発生しました。デバイス '%2$s' 上で %1$d バイトの読み込み時にエラーが発生しました。オーディオデバイスからの録音時にエラーが発生しました。%d 回リトライしましたが失敗しました。デバイス %s。システムエラー: %sデバイス '%s' のコントロール属性の取得に失敗しましたJPEG画像のデコードに失敗しましたデバイス '%s' 上の現在の入力の取得に失敗しました。ラジオデバイスかもしれませんデバイス '%s' 上の現在の出力の取得に失敗しました。ラジオデバイスかもしれませんデバイス '%s' の現在のチューナーの周波数の取得に失敗しましたデバイス '%2$s' 上のチューナー %1$d の設定の取得に失敗しました。デバイス '%2$s' 上のコントロール %1$d の値の取得に失敗しました。デバイス %2$s 内の入力 %1$d の属性のクエリーに失敗しましたサウンドサーバーのケイパビリティのクエリーに失敗しましたデバイス '%s' のチューナーの周波数の %lu Hz への設定に失敗しました出力%dをデバイス %s に設定できませんでした。デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しました。デバイス '%s' からビデオフレームの取得に失敗しました。フロントフロントパネルのヘッドフォンフロントパネルのライン入力フロントパネルのライン出力フロントパネルのマイクロフォンゲイン予期しないフレームサイズ (%2$u ではなく %1$u) を取得しました。グレー色コネクタ緑色コネクタHDMIヘッドセットヘッドフォンヘッドフォン入力ゲイン入力入力ミックス内蔵CD内部データフローエラー。内部データストリームエラー不正なアトムサイズジャックキーボードビープ音LFEライン入力ライン出力ライン 1ライン 2ライン 3ライン入力ループバックマスタマイクロフォンマイクロフォン1マイクロフォン2マイクロフォンブーストマイクロフォンゲインマイクロフォンソースミキサーモデムモニターモニターソースモノラルミックスミュートURLが指定されていません。入力オーディオが存在しないか無効であるため、AVI ストリームは壊れます。サポートしているストリームが見つかりません。別の転送プロトコルをインストールする必要があるかもしれません。または、正しい GStreamer RTSP 拡張プラグインがないのかもしれません。サポートしているストリームが見つかりません。Real メディアストリームのためのGStreamer RTSP 拡張プラグインをインストールする必要があるかもしれません。なしオフオンオレンジ色コネクタその他出力ゲイン出力ゲインPCMPCM-2フォン入力フォン出力ピンク色コネクタプレイバックポート再生はこのオーディオデバイスではサポートされていません。ラジオリア録音録音ゲイン録音ソースこのオーディオデバイスによって録音はサポートされていません。赤色コネクタSPDIF入力SPDIF出力セキュア接続のセットアップに失敗しました。サーバーはシークをサポートしていません。サイドスピーカスピーカソースステレオステレオミックスサラウンドサラウンドサウンドシンセ電話デバイス '%s' のドライバーはよく知られたキャプチャーメソッドをサポートしていませんこのファイルの中の動画は正しく再生できないかもしれませんこのファイルには再生不可能なストリームが含まれていますこのファイルには多くのストリームが格納されているため、最初の %d 個のみ再生しますこのファイルは壊れているため再生することができませんこのファイルは正常ではないため、再生することができませんこのファイルは不正なため再生することができませんこれはデバイス '%s' ではありません高音ビデオビデオ入力ビデオ入力デバイスは新しいフレームレート設定にすることができません仮想ミキサーチャンネル仮想ミキサー入力仮想ミキサー出力音量白色コネクタ黄色コネクタgst-plugins-good-0.10.31/po/af.po0000644000175000017500000003351111720565341013352 00000000000000# Translation of gstreamer plugin messages to Afrikaans. # Copyright (C) 2004 Free Software Foundation, Inc. # This file is put in the public domain. # Petri Jooste , 2004. # msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.7.6\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2004-03-18 14:16+0200\n" "Last-Translator: Petri Jooste \n" "Language-Team: Afrikaans \n" "Language: af\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "" msgid "Failed to decode JPEG image" msgstr "" #, fuzzy msgid "Could not connect to server" msgstr "Kon nie beheertoestel \"%s\" toemaak nie." msgid "Server does not support seeking." msgstr "" #, fuzzy msgid "Could not resolve server name." msgstr "Kon nie beheertoestel \"%s\" toemaak nie." #, fuzzy msgid "Could not establish connection to server." msgstr "Kon nie beheertoestel \"%s\" toemaak nie." msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Geen of ongeldige klanktoevoer, AVI-stroom sal korrup wees." msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Treble" msgid "Synth" msgstr "Sintetiseerder" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Luidspreker" msgid "Line-in" msgstr "Lyn-in" msgid "Microphone" msgstr "Mikrofoon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Menger" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Neem op" msgid "In-gain" msgstr "In-versterking" msgid "Out-gain" msgstr "Uit-versterking" msgid "Line-1" msgstr "Lyn-1" msgid "Line-2" msgstr "Lyn-2" msgid "Line-3" msgstr "Lyn-3" msgid "Digital-1" msgstr "Digitaal-1" msgid "Digital-2" msgstr "Digitaal-2" msgid "Digital-3" msgstr "Digitaal-3" msgid "Phone-in" msgstr "Telefoon-in" msgid "Phone-out" msgstr "Telefoon-uit" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for playback." msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for recording." msgstr "Kon nie CD-toestel oopmaak om te lees nie." #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "Kon nie oudio-toestel \"%s\" oopmaak vir skryf nie." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" msgid "Master" msgstr "" msgid "Front" msgstr "" #, fuzzy msgid "Rear" msgstr "Neem op" msgid "Headphones" msgstr "" msgid "Center" msgstr "" msgid "LFE" msgstr "" msgid "Surround" msgstr "" #, fuzzy msgid "Side" msgstr "Video" #, fuzzy msgid "Built-in Speaker" msgstr "Luidspreker" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "" msgid "Line Out" msgstr "" #, fuzzy msgid "Line In" msgstr "Lyn-in" msgid "Internal CD" msgstr "" #, fuzzy msgid "Video In" msgstr "Video" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" #, fuzzy msgid "Record Gain" msgstr "Neem op" #, fuzzy msgid "Output Gain" msgstr "Uit-versterking" #, fuzzy msgid "Microphone Boost" msgstr "Mikrofoon" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" #, fuzzy msgid "Record Source" msgstr "Neem op" #, fuzzy msgid "Monitor Source" msgstr "Monitor" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "" msgid "Surround Sound" msgstr "" #, fuzzy msgid "Microphone Gain" msgstr "Mikrofoon" #, fuzzy msgid "Speaker Source" msgstr "Luidspreker" #, fuzzy msgid "Microphone Source" msgstr "Mikrofoon" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" #, fuzzy msgid "Microphone 1" msgstr "Mikrofoon" #, fuzzy msgid "Microphone 2" msgstr "Mikrofoon" #, fuzzy msgid "Digital Out" msgstr "Digitaal-1" #, fuzzy msgid "Digital In" msgstr "Digitaal-1" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Mute" msgstr "" msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" #, fuzzy msgid "Front Panel Microphone" msgstr "Mikrofoon" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, fuzzy, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, fuzzy, c-format msgid "Cannot identify device '%s'." msgstr "Kon nie skryf na toestel \"%s\" nie." #, c-format msgid "This isn't a device '%s'." msgstr "" #, fuzzy, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Kon nie toestel \"%s\" oopmaak vir lees en skryf nie." #, fuzzy, c-format msgid "Device '%s' is not a capture device." msgstr "Toestel \"%s\" is nie 'n vasleggingtoestel nie." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "Toestel \"%s\" is nie 'n vasleggingtoestel nie." #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." #, fuzzy, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, fuzzy, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Kon nie beheertoestel \"%s\" toemaak nie." #, fuzzy, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Kon nie beheertoestel \"%s\" toemaak nie." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, fuzzy, c-format msgid "Failed to set input %d on device %s." msgstr "Kon nie oudio-toestel \"%s\" toemaak nie." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Kon nie oudio-toestel \"%s\" toemaak nie." #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." #, fuzzy, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, fuzzy, c-format msgid "Could not get parameters on device '%s'" msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." msgid "Video input device did not accept new frame rate setting." msgstr "" #, fuzzy, c-format msgid "Could not map buffers from device '%s'" msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie." #~ msgid "Error closing file \"%s\"." #~ msgstr "Fout tydens toemaak van lêer \"%s\"." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "Kon nie lêer \"%s\" oopmaak om te lees nie." #~ msgid "No filename specified." #~ msgstr "Geen lêernaam gespesifiseer." #~ msgid "Could not write to file \"%s\"." #~ msgstr "Kon nie skryf na lêer \"%s\" nie." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "Kon nie beheertoestel \"%s\" oopmaak vir skryf nie." #~ msgid "Could not configure audio device \"%s\"." #~ msgstr "Kon nie oudio-toestel \"%s\" konfigureer nie." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "Kon nie klanktoestel \"%s\" verstel na %d Hz nie." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "Kon nie video-toestel \"%s\" oopmaak vir skryf nie." #~ msgid "Could not close video device \"%s\"." #~ msgstr "Kon nie video-toestel \"%s\" toemaak nie." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "OSS-toestel \"%s\" is reeds in gebruik deur 'n ander program." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "Kon nie toegang kry tot toestel \"%s\" nie, kyk na toegangsregte." #~ msgid "Device \"%s\" does not exist." #~ msgstr "Toestel \"%s\" bestaan nie." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "Kon nie toestel \"%s\" oopmaak vir skryf nie." #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "Kon nie toestel \"%s\" oopmaak vir lees nie." #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "Kon nie vfs-lêer \"%s\" oopmaak vir lees nie." #, fuzzy #~ msgid "No filename given." #~ msgstr "Geen lêernaam gespesifiseer." #, fuzzy #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "Kon nie vfs-lêer \"%s\" oopmaak vir skryf nie." #, fuzzy #~ msgid "No filename given" #~ msgstr "Geen lêernaam gespesifiseer." #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "Kon nie vfs-lêer \"%s\" toemaak nie." #~ msgid "No device specified." #~ msgstr "Geen toestel gespesifiseer" #~ msgid "Device is not open." #~ msgstr "Toestel is nie oop nie." #~ msgid "Device is open." #~ msgstr "Toestel is oop." gst-plugins-good-0.10.31/po/af.gmo0000644000175000017500000000272111720565342013516 00000000000000%`af i s } 6  "(/7=DJjQ    ;%aqu {      BassCDDigital-1Digital-2Digital-3In-gainLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSpeakerSynthTrebleVideoVolumeProject-Id-Version: gst-plugins 0.7.6 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2004-03-18 14:16+0200 Last-Translator: Petri Jooste Language-Team: Afrikaans Language: af MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BasCDDigitaal-1Digitaal-2Digitaal-3In-versterkingLyn-1Lyn-2Lyn-3Lyn-inMikrofoonMengerMonitorGeen of ongeldige klanktoevoer, AVI-stroom sal korrup wees.Uit-versterkingPCMPCM-2Telefoon-inTelefoon-uitRadioNeem opLuidsprekerSintetiseerderTrebleVideoVolumegst-plugins-good-0.10.31/po/es.gmo0000644000175000017500000003670511720565343013551 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$ $$ $% %O % p% ~% % % % %!%%%% & %&3&S&e&.h&&&&J&#';9'3u'<'A'9((Vb((0\)^))g*,*c$+@+++6+5,, b,p,, , , ,,,.F-.u-*-E-D.$Z.a.`.SB/L/F/E*0Gp08090_+1819171L62D222223)3G3<P3 333 33 3 3 444-454 J4#U4 y444444445 55 $50555=5 C5 N5 [5h555 55555 55B6S6777 77"77777888 /8=8]87v8 888 88849 79E9e9 t909$9#99:::/: ?:I: \:g: y: :U:I:.1;K`;5;7;4<!O<q<x<<<<X<<=8=U=]=!m==#=v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-02-12 18:30+0100 Last-Translator: Jorge González González Language-Team: Spanish Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.11.4 Plural-Forms: nplurals=2; plural=(n != 1); Función %s %dFunción %s«%s» por «%s»Centro 3DProfundidad 3DMejora 3DOcurrió un error de red o el servidor cerró la conexión de forma inesperada.Entrada AUX 1Salida AUX 1Entrada AUX 2Salida AUX 2Entrada AUXSalida AUXError de reproducción de sonido.BassAumento de bajosConector negroConector negro del panel frontalConector azulConector azul del panel frontalAltavoz integradoCDNo se puede identificar el dispositivo «%s».No se puede operar sin relojCentroCentrado / LFEEl cambio de resolución durante la reproducción aún no está soportado.No se pudo conectar con el servidorNo se pueden encolar los búferes en el dispositivo «%s».No se pudo establecer la conexión con el servidor.No se pudo establecer la conexión con el servidor de sonidoNo se pudieron obtener los parámetros para el dispositivo «%s»No se pudieron mapear los búferes del dispositivo «%s»No se pudo abrir el dispositivo de sonido para su gestión por el control de mezclado.No se pudo abrir el dispositivo de sonido para su gestión por el control de mezclado. Este elemento no soporta esta versión del Sistema de sonido abierto (OSS).No se pudo abrir el dispositivo para reproducir.No se pudo abrir el dispositivo para reproducir. Otra aplicación está usando el dispositivo.No se pudo abrir el dispositivo de sonido para su gestión por el control de mezclado. Este elemento no soporta esta versión del Sistema de sonido abierto (OSS).No se pudo abrir el dispositivo de sonido para reproducir. No tiene permisos para abrir el dispositivo.No se pudo abrir el dispositivo para grabar.No se pudo abrir el dispositivo de sonido para grabar. No tiene permisos para abrir el dispositivo.No se pudo abrir el dispositivo «%s» para lectura y escritura.No se pudo resolver el nombre del servidor.El dispositivo «%s» no es un dispositivo de captura.El dispositivo «%s» no es un dispositivo de salida.DiagnósticoEntrada digitalSalida digitalDigital-1Digital-2Digital-3Reducción de canalesError al obtener las capacidades del dispositivo «%s»: No es un controlador para v4l2. Compruebe si es un controlador para v4l1.Error al leer %d bytes del dispositivo «%s».Error al leer %d bytes del dispositivo «%s».Error al grabar del dispositivo de sonido.Falló después de %d intentos. Dispositivo %s. Error del sistema: %sFalló al obtener los atributos de control en el dispositivo «%s».Falló al decodificar la imagen JPEGFalló al obtener la entrada actual en el dispositivo «%s». Quizá sea un dispositivo de radio.Falló al obtener la salida actual en el dispositivo «%s». Quizá sea un dispositivo de radio.Falló al obtener la frecuencia actual del sintonizador para el dispositivo «%s».Falló al obtener la posición del sintonizador %d en el dispositivo «%s».Falló al obtener la potencia de la señal para el dispositivo «%s».Falló al obtener el valor para el control %d del dispositivo «%s».Falló al consultar los atributos de la entrada %d en el dispositivo %sFalló al consultar la norma para el dispositivo «%s».Falló al preguntar al servidor de sonido sus capacidadesFalló al establecer la frecuencia actual del sintonizador para el dispositivo «%s» a %lu Hz.Falló al establecer la entrada %d en el dispositivo %s.Falló al establecer la norma para el dispositivo «%s».Falló al establecer la salida %d en el dispositivo %s.Falló al establecer el valor %ds para el control %d del dispositivo «%s».Falló al intentar obtener cuadros de vídeo del dispositivo «%s».RápidoFrontalAuriculares del panel frontalEntrada del panel frontalSalida del panel frontalMicrófono del panel frontalGananciaSe obtuvo un tamaño de cuadro inesperado %u en lugar de %u.Conector grisConector gris del panel frontalConector verdeConector verde del panel frontalHDMIAuricularesAuricularesAuricularesAltoGanancia de entradaEntradaMezclador de entradaCD internoError en el flujo de datos interno.Error interno de flujo de datos.El tamaño atom no es válido.JackPitido de tecladoLFELínea de entradaLínea de salidaLínea-1Línea-2Línea-3Línea de entradaBucle localBajoMaestroMedioMicrófonoMicrófono 1Micrófono 2Aumento del micrófonoGanancia del micrófonoMicrófono de origenMezcladorMódemMonitorMonitor de origenMezclador monoSilenciarNo existe un URL establecido.El audio no existe o no es válido, el flujo AVI estará corrupto.No se encontró un flujo soportado. Puede que necesite permitir más protocolos de transporte o de otra forma puede que le falte la extensión correcta de RTSP de GStreamer.No se encontró un flujo soportado. Puede que necesite instalar una extensión RTSP de GStreamer para los formatos de flujo Real.NingunoApagadoEncendidoConector naranjaConector naranja del panel frontalOtroGanancia de salidaGanancia de salidaPCMPCM-2Entrada de teléfonoSalida de teléfonoConector rosaConector rosa del panel frontalPuertos de reproducciónEste dispositivo de sonido no soporta la reproducción.ProducciónRadioTraseroGrabaciónGanancia de grabaciónOrigen de la grabaciónEste dispositivo de sonido no soporta la grabación.Conector rojoConector rojo del panel frontalEntrada S/PDIFSalida S/PDIFFalló la configuración de la conexión segura.El servidor no soporta la búsqueda.El servidor envió datos erróneos.LateralSimular estéreoAltavozAltavoz de origenExpandir salidaEstéreoMezclador estéreoEnvolventeSonido envolventeSintetizadorTeléfonoEl controlador del dispositivo «%s» no soporta ningún método de captura conocido.Puede que el vídeo en este archivo no se pueda reproducir correctamente.Este archivo no contiene flujos reproducibles.Este archivo contiene demasiados flujos. Sólo se reproducirá el primer %dEste archivo está corrupto y no se puede reproducir.Este archivo está incompleto y no se puede reproducir.Este archivo no es válido y no se puede reproducir.Esto no es un dispositivo «%s».AgudosMuy altoMuy bajoVídeoEntrada de vídeoEl dispositivo de entrada de vídeo no aceptó el ajuste de la nueva tasa de fotogramas.Canales del mezclador virtualEntrada del mezclador virtualSalida del mezclador virtualVolumenConector blancoConector blanco del panel frontalConector amarilloConector amarillo del panel frontalgst-plugins-good-0.10.31/po/nl.gmo0000644000175000017500000003533011720565343013544 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""# $ $$ $ % %R!%t% }%% %%%% % %%%&&9&P&%S& y&& &?&$&,''@'.h'2','B':(1(c(^)d)0D*cu*6* +%1+&W+~+ + + + + +++2X,2,&,1,:-%R-Xx-O-9!.@[.8.<.=/+P/7|/K/.0+/0-[0>02001 1'1>1V1 o1.{11111 22 2'262;2N2 U2 `2$k22222222223 3333&3 -3 73 C3O3_3 t3333 3333:344+5054585I5i5p55555555575 56?6 E6Q6X6 j66u6666 6*6-7$E7j7r7 7777 77777M7D88+}8I8888,96e99 9 9 999K91:H:^:u:|::::v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-04-27 00:05+0200 Last-Translator: Freek de Kruijf Language-Team: Dutch Language: nl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 1.1 Plural-Forms: nplurals=2; plural=n != 1; %s %d functie%s-function'%s' door '%s'3D-centrum3D-diepte3D-verbeterenEr trad een netwerkfout op of de server heeft de verbinding onverwacht afgesloten.AUX 1-inAUX 1-outAUX 2-inAUX 2-outAUX-inAUX-uitFout in geluid afspelen.Lage tonenBas-boostZwarte connectorZwarte connector in frontpaneelBlauwe connectorBlauwe connector in frontpaneelIngebouwde luidsprekerCDKan apparaat '%s' niet identificeren.Kan niet werken zonder een klok.MiddenMidden / LFETijdens het draaien kan de resolutie nog niet gewijzigd worden.Kan geen verbinding maken met serverKan geen buffers toekennen in apparaat '%s'.Kan geen verbinding maken met de serverKan geen verbinding maken met de geluidsserverKan de parameters op apparaat '%s' niet verkrijgenKan de buffers van apparaat '%s' niet vindenKan het audio-apparaat niet openen voor het besturen van de mixer.Kan het audio-apparaat niet openen voor besturen van de mixer. Deze versie van het Open Sound System wordt niet ondersteunt door dit element.Kan het audio-apparaat niet openen voor afspelen.Kan het audio-apparaat niet openen voor afspelen. Apparaat is in gebruik bij een andere applicatie.Kan het audio-apparaat niet openen voor afspelen. Deze versie van het Open Sound System wordt niet ondersteunt door dit element.Kan het audio-apparaat niet openen voor afspelen. U hebt geen toestemming om het apparaat te openen.Kan het audio-apparaat niet openen voor opnemen.Kan het audio-apparaat niet openen voor opnemen. U hebt geen toestemming om het apparaat te openen.Kan apparaat '%s' niet openen voor lezen en schrijven.Kan de servernaam niet opzoeken.Apparaat '%s' is geen opnameapparaat.Apparaat '%s' is geen uitvoerapparaat.DiagnoseDigitaal-inDigitaal-uitDigitaal-1Digitaal-2Digitaal-3DownmixFout bij het verkrijgen van de eigenschappen van apparaat '%s': het is geen v4l2-stuurprogramma. Controleer of het een v4l1-stuurprogramma is.Fout bij het lezen van %d bytes van apparaat '%s'.Fout bij het lezen van %d bytes van apparaat '%s'.Fout bij opnemen vanaf audio-apparaat.Fout na %d pogingen. Apparaat %s. Systeemfout: %sKan de knopeigenschappen op apparaat '%s' niet verkrijgen.Kan de JPEG-afbeelding niet decoderenKan de huidige instellingen van apparaat '%s' niet verkrijgen. Het is mogelijk een radioKan de huidige uitvoer niet op apparaat '%s' krijgen. Het is mogelijk een radioKan de tunerfrequentie van apparaat '%s' niet verkrijgen.Kan de instelling van tuner %d op apparaat '%s' niet verkrijgen.Kan de signaalsterkte van apparaat '%s' niet verkrijgen.Kan de waarde voor knop %d op apparaat '%s' niet verkrijgen.Kan eigenschappen van invoer %d op apparaat %s niet opvragen.Kan de norm op apparaat '%s' niet opvragen.Kan de eigenschappen van de geluidsserver niet opvragenKan de huidige tunerfrequentie voor apparaat '%s' niet instellen op %lu Hz.Kan invoer %d op apparaat '%s' niet instellen.Kan norm niet instellen voor apparaat '%s'.Kan uitvoer %d op apparaat %s niet instellen.Kan de waarde %d voor knop %d op apparaat '%s' niet instellen.Kan geen videoframes verkrijgen van apparaat '%s'.SnelVoorkantHoofdtelefoons in frontpaneelLijn-in in frontpaneelLijn-uit in frontpaneelMicrofoon in frontpaneelVersterkingOnverwachte framegrootte, %u in plaats van %u.Grijze connectorGrijze connector in frontpaneelGroene connectorGroene connector in frontpaneelHDMIHandsetHoofdtelefoonHoofdtelefoonsHoogIngangsversterkingInvoerInvoer-mixInterne cdInterne fout in de gegevensdoorvoer.Interne fout in gegevensstroom.Ongeldige "atom"-grootte.PlugToetsenbordpiepLFELijn-inLine-outLijn-1Lijn-2Lijn-3Lijn-inLoopbackLaagMasterMiddelMicrofoonMicrofoon-1Microfoon-2Microfoon-boostMicrofoonversterkingMicrofoonbronMixerModemMonitorMonitorbronMono-mixDempenGeen URL ingesteld.Geen of ongeldig invoergeluid, AVI-stroom zal slecht zijn.Er is geen ondersteunde stroom gevonden. Misschien moet u meer overdrachtsprotocollen toestaan of anders ontbreekt de juiste GStreamer RTSP extensie-plugin.Er is geen ondersteunde stroom gevonden. Misschien moet er een GStreamer RTSP extensie-plugin voor Real-media-streams geïnstalleerd worden.GeenUitAanOranje connectorOranje connector in frontpaneelOverigUitgangsversterkingUitgangsversterkingPCMPCM-2TelefooningangTelefoonuitgangRoze connectorRoze connector in frontpaneelAfspeelpoortenAfspelen wordt niet ondersteund door dit audio-apparaatProductieRadioAchterzijdeOpnameOpnameversterkingOpnamebronOpnemen wordt niet ondersteund door dit audio-apparaatRode connectorRode connector in frontpaneelSPDIF-inSPDIF-outBeveiligde verbinding opzetten is mislukt.Zoeken wordt door de server niet ondersteund.De server stuurde onjuiste gegevens.ZijkantStereo simulerenLuidsprekerLuidsprekerbronUitvoer spreidenStereoStereo-mixSurroundSurround-geluidSynthTelefoonHet stuurprogramma van apparaat '%s' ondersteunt geen bekende opnamemethode.De video in dit bestand zal mogelijk niet correct afgespeeld worden.Dit bestand bevat geen afspeelbare stromen.Dit bestand bevat te veel stromen. Alleen de eerste %d worden afgespeeld.Dit bestand is beschadigd en kan niet afgespeeld worden.Dit bestand is incompleet en kan niet afgespeeld worden.Dit bestand is ongeldig en kan niet afgespeeld worden.Dit is geen apparaat '%s'.Hoge tonenZeer hoogZeer laagVideoVideo-inInvoerapparaat voor video heeft de nieuwe frame-snelheid niet geaccepteerd.Virtuele mixer-kanalenVirtuele mixer-invoerVirtuele mixer-uitvoerVolumeWitte connectorWitte connector in frontpaneelGele connectorGele connector in frontpaneelgst-plugins-good-0.10.31/po/ru.po0000644000175000017500000005634211720565342013422 00000000000000# Translation for gst-plugins-good messages to Russian # This file is put in the public domain. # # Артём Попов , 2009. # Pavel Maryanov , 2009. # Yuri Kozlov , 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-04-26 21:13+0400\n" "Last-Translator: Yuri Kozlov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgid "Could not establish connection to sound server" msgstr "Не удалось установить соединение с сервером звука" msgid "Failed to query sound server capabilities" msgstr "Ошибка при запросе возможностей сервера звука" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» исполняет «%s»" msgid "Internal data stream error." msgstr "Внутренняя ошибка потока данных." msgid "Failed to decode JPEG image" msgstr "Не удалось декодировать JPEG-изображение" msgid "Could not connect to server" msgstr "Не удалось соединиться с сервером" msgid "Server does not support seeking." msgstr "Сервер не поддерживает поиск." msgid "Could not resolve server name." msgstr "Не удалось определить имя сервера." msgid "Could not establish connection to server." msgstr "Не удалось установить соединение с сервером." msgid "Secure connection setup failed." msgstr "Не удалось настроить защищённое соединение." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Произошла сетевая ошибка или сервер неожиданно закрыл соединение." msgid "Server sent bad data." msgstr "Сервер прислал некорректные данные." msgid "No URL set." msgstr "URL не задан." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Входящие аудио-данные отсутствуют или недействительны, поток AVI будет " "повреждён." msgid "This file contains no playable streams." msgstr "Файл не содержит воспроизводимых потоков." msgid "This file is invalid and cannot be played." msgstr "Файл некорректен и не может быть воспроизведён." msgid "This file is corrupt and cannot be played." msgstr "Файл повреждён и не может быть воспроизведён." msgid "Invalid atom size." msgstr "Неверный атомарный размер." msgid "This file is incomplete and cannot be played." msgstr "Файл не полон и не может быть воспроизведён." msgid "The video in this file might not play correctly." msgstr "Видео из этого файла может быть воспроизведено некорректно." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Файл содержит слишком много потоков. Будет воспроизведёно только первых %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Ни один поток не поддерживается. Возможно требуется установка " "дополнительного модуля GStreamer RTSP для потоков Real media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Ни один поток не поддерживается. Возможно требуется разрешить дополнительные " "протоколы передачи или же отсутствует правильный модуль GStreamer RTSP." msgid "Internal data flow error." msgstr "Внутренняя ошибка потока данных." msgid "Volume" msgstr "Уровень" msgid "Bass" msgstr "Низкие" msgid "Treble" msgstr "Высокие" msgid "Synth" msgstr "Синтезатор" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Внутренний динамик" msgid "Line-in" msgstr "Линейный вход" msgid "Microphone" msgstr "Микрофон" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Микшер" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Запись" msgid "In-gain" msgstr "Усиление на входе" msgid "Out-gain" msgstr "Усиление на выходе" msgid "Line-1" msgstr "Линейный-1" msgid "Line-2" msgstr "Линейный-2" msgid "Line-3" msgstr "Линейный-3" msgid "Digital-1" msgstr "Цифровой-1" msgid "Digital-2" msgstr "Цифровой-2" msgid "Digital-3" msgstr "Цифровой-3" msgid "Phone-in" msgstr "Тел. вход" msgid "Phone-out" msgstr "Тел. выход" msgid "Video" msgstr "Видео" msgid "Radio" msgstr "Радио" msgid "Monitor" msgstr "Мониторинг" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Не удалось открыть аудио-устройство для воспроизведения. Устройство " "используется другим приложением." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Не удалось открыть аудио-устройство для воспроизведения. Отсутствуют права " "доступа к устройству." msgid "Could not open audio device for playback." msgstr "Не удалось открыть аудио-устройство для воспроизведения." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Не удалось открыть аудио-устройство для записи. Отсутствуют права доступа к " "устройству." msgid "Could not open audio device for recording." msgstr "Не удалось открыть аудио-устройство для записи." msgid "Could not open audio device for mixer control handling." msgstr "Не удалось открыть аудио-устройство для обработки параметров микшера." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Не удалось открыть аудио-устройство для обработки параметров микшера. Данная " "версия Open Sound System не поддерживается этим элементом." msgid "Master" msgstr "Общий" msgid "Front" msgstr "Фронтальные" msgid "Rear" msgstr "Тыловые" msgid "Headphones" msgstr "Наушники" msgid "Center" msgstr "Центр" msgid "LFE" msgstr "Сабвуфер" msgid "Surround" msgstr "Объёмный звук" msgid "Side" msgstr "Боковые" msgid "Built-in Speaker" msgstr "Внутренний динамик" msgid "AUX 1 Out" msgstr "Выход AUX 1" msgid "AUX 2 Out" msgstr "Выход AUX 2" msgid "AUX Out" msgstr "Выход AUX" msgid "3D Depth" msgstr "3D глубина" msgid "3D Center" msgstr "3D центр" msgid "3D Enhance" msgstr "3D улучшение" msgid "Telephone" msgstr "Телефон" msgid "Line Out" msgstr "Линейный выход" msgid "Line In" msgstr "Линейный вход" msgid "Internal CD" msgstr "Внутренний CD" msgid "Video In" msgstr "Видео вход" msgid "AUX 1 In" msgstr "Вход AUX 1" msgid "AUX 2 In" msgstr "Вход AUX 2" msgid "AUX In" msgstr "Вход AUX" msgid "Record Gain" msgstr "Уровень записи" msgid "Output Gain" msgstr "Выходной уровень" msgid "Microphone Boost" msgstr "Микрофонный усилитель" msgid "Loopback" msgstr "Петля" msgid "Diagnostic" msgstr "Диагностика" msgid "Bass Boost" msgstr "Усиление баса" msgid "Playback Ports" msgstr "Порты воспроизведения" msgid "Input" msgstr "Вход" msgid "Record Source" msgstr "Устройство записи" msgid "Monitor Source" msgstr "Устройство вывода" msgid "Keyboard Beep" msgstr "Озвучка клавиатуры" msgid "Simulate Stereo" msgstr "Имитация стерео" msgid "Stereo" msgstr "Стерео" msgid "Surround Sound" msgstr "Объёмный звук" msgid "Microphone Gain" msgstr "Уровень микрофона" msgid "Speaker Source" msgstr "Устройство динамика" msgid "Microphone Source" msgstr "Устройство микрофона" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Центр / Сабвуфер" msgid "Stereo Mix" msgstr "Стерео микширование" msgid "Mono Mix" msgstr "Моно микширование" msgid "Input Mix" msgstr "Микширование входа" msgid "SPDIF In" msgstr "Вход SPDIF" msgid "SPDIF Out" msgstr "Выход SPDIF" msgid "Microphone 1" msgstr "Микрофон 1" msgid "Microphone 2" msgstr "Микрофон 2" msgid "Digital Out" msgstr "Цифровой выход" msgid "Digital In" msgstr "Цифровой вход" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Модем" msgid "Handset" msgstr "Гарнитура" msgid "Other" msgstr "Другой" msgid "None" msgstr "Ничего" msgid "On" msgstr "Вкл" msgid "Off" msgstr "Выкл" msgid "Mute" msgstr "Заглушить" msgid "Fast" msgstr "Скорость" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Очень низкое" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Низкое" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Среднее" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Высокое" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Очень высокое" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Выдача" msgid "Front Panel Microphone" msgstr "Микрофон на передней панели" msgid "Front Panel Line In" msgstr "Линейный вход на передней панели" msgid "Front Panel Headphones" msgstr "Наушники на передней панели" msgid "Front Panel Line Out" msgstr "Линейный выход на передней панели" msgid "Green Connector" msgstr "Зелёный разъём" msgid "Pink Connector" msgstr "Розовый разъём" msgid "Blue Connector" msgstr "Синий разъём" msgid "White Connector" msgstr "Белый разъём" msgid "Black Connector" msgstr "Чёрный разъём" msgid "Gray Connector" msgstr "Серый разъём" msgid "Orange Connector" msgstr "Оранжевый разъём" msgid "Red Connector" msgstr "Красный разъём" msgid "Yellow Connector" msgstr "Жёлтый разъём" msgid "Green Front Panel Connector" msgstr "Зелёный разъём на передней панели" msgid "Pink Front Panel Connector" msgstr "Розовый разъём на передней панели" msgid "Blue Front Panel Connector" msgstr "Синий разъём на передней панели" msgid "White Front Panel Connector" msgstr "Белый разъём на передней панели" msgid "Black Front Panel Connector" msgstr "Чёрный разъём на передней панели" msgid "Gray Front Panel Connector" msgstr "Серый разъём на передней панели" msgid "Orange Front Panel Connector" msgstr "Оранжевый разъём на передней панели" msgid "Red Front Panel Connector" msgstr "Красный разъём на передней панели" msgid "Yellow Front Panel Connector" msgstr "Жёлтый разъём на передней панели" msgid "Spread Output" msgstr "Развёрнутый вывод" msgid "Downmix" msgstr "Низведение" msgid "Virtual Mixer Input" msgstr "Вход виртуального микшера" msgid "Virtual Mixer Output" msgstr "Выход виртуального микшера" msgid "Virtual Mixer Channels" msgstr "Каналы виртуального микшера" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Функция %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Функция %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Не удалось открыть аудио-устройство для воспроизведения. Данная версия Open " "Sound System не поддерживается этим элементом." msgid "Playback is not supported by this audio device." msgstr "Воспроизведение не поддерживается данным аудио-устройством." msgid "Audio playback error." msgstr "Ошибка воспроизведения аудио." msgid "Recording is not supported by this audio device." msgstr "Запись не поддерживается данным аудио-устройством." msgid "Error recording from audio device." msgstr "Ошибка записи с аудио-устройства." msgid "Gain" msgstr "Уровень" msgid "Headphone" msgstr "Наушник" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Ошибка чтения %d байт из устройства «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Получен неожиданный размер кадра: %u вместо %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Ошибка чтения %d байт из устройства «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Ошибка получения возможностей устройства «%s»: драйвер устройства " "несовместим с v4l2. Проверьте, не использует ли устройство драйвер v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Ошибка запроса атрибутов входа %d устройства %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Ошибка получения установок тюнера %d устройства «%s»." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Ошибка запроса стандарта устройства «%s»." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Ошибка получения атрибутов управления устройства «%s»." #, c-format msgid "Cannot identify device '%s'." msgstr "Не удаётся распознать устройство «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "«%s» не является устройством." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Не удалось открыть устройство «%s» для чтения и записи." #, c-format msgid "Device '%s' is not a capture device." msgstr "Устройство «%s» не является устройством захвата." #, c-format msgid "Device '%s' is not a output device." msgstr "Устройство «%s» не является устройством вывода." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Ошибка установки стандарта устройства «%s»." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Ошибка получения текущей частоты тюнера устройства «%s»." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Ошибка установки текущей частоты тюнера устройства «%s» в %lu Гц." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Ошибка получения мощности сигнала для устройства «%s»." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Ошибка получения значения управляющего параметра %d устройства «%s»." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Ошибка установки значения %d для управляющего параметра %d устройства «%s»." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Не удалось определить активный вход устройства «%s». Возможно, это радио-" "устройство" #, c-format msgid "Failed to set input %d on device %s." msgstr "Не удалось выбрать вход %d для устройства %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Не удалось определить активный выход устройства «%s». Возможно, это радио-" "устройство" #, c-format msgid "Failed to set output %d on device %s." msgstr "Не удалось выбрать выход %d для устройства %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Не удалось добавить в очередь буферы устройства «%s»" #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Ошибка при попытке получения кадров видео с устройства «%s»." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Ошибка после %d попыток. Устройство: %s. Системная ошибка: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Не удалось получить параметры устройства «%s»" msgid "Video input device did not accept new frame rate setting." msgstr "Устройство видео-захвата не приняло новый параметр кадровой частоты." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Не удалось распределить буферы устройства «%s»" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Драйвер устройства «%s» не поддерживает ни один из известных методов захвата." msgid "Changing resolution at runtime is not yet supported." msgstr "" "Изменение разрешения видео во время выполнения не поддерживается в настоящий " "момент." msgid "Cannot operate without a clock" msgstr "Операция невозможна без часов" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Не удалось создать список видео-форматов, с которыми может работать " #~ "устройство «%s»" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Неподдерживаемый тип буфера, либо индекс вне диапазона, либо буферы не " #~ "были распределены, либо неверные значения длины или userptr (устройство " #~ "%s)" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Ошибка при попытке получения кадров видео с устройства «%s». Не хватает " #~ "памяти." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "не хватает памяти для постановки в очередь буфера пользовательского " #~ "указателя (устройство %s)" #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "В пуле не найдено свободных буферов для индекса %d." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Устройство «%s» не может осуществлять захват в разрешении %dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Устройство «%s» не может осуществлять захват в указанном формате" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Не удалось получить буферы устройства «%s»" #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "Не удалось получить необходимое количество буферов устройства «%s»" #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Ошибка при запуске потокового захвата с устройства «%s»." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Ошибка при остановке потокового захвата с устройства «%s»." #~ msgid "Could not read from CD." #~ msgstr "Не удалось прочитать CD." #~ msgid "Disc is not an Audio CD." #~ msgstr "Диск не является аудио-CD." #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Файл зашифрован и не может быть воспроизведён." #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "Ошибка получения атрибутов управления устройства «%s»." #~ msgid "Could not set parameters on device '%s'" #~ msgstr "Не удалось установить параметры устройства «%s»" #~ msgid "Device '%s' cannot capture at %d/%d frames per second" #~ msgstr "" #~ "Устройство «%s» не может осуществить захват при %d/%d кадрах в секунду" gst-plugins-good-0.10.31/po/cs.gmo0000644000175000017500000003676611720565342013555 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$ % %%9%U%Ho% % % % % % %&&#&4&$E&j&#z&&&!& & &'7'"P'Cs'/'8'8 (BY(U((0)c)"*e*4+cF+8+%+1 ,0;, l,x,, , , ,,,1-1-2-?.NW.).g.h8/I/=/<)0Pf0C060321Rf191117%2T]2B2223"%3$H3m3 3933#34$494>4 T4 _4j4r444 44!44 55,505?5P5X5`5h5w555 55 5 5555 56 66#646<6AM66G77777'868<8R8h8l8r888&88@8&9.959 <9I9]93l99&9 9 9"9:5:R:Z: k:w:::::: ::J:59;)o;M;0;1<0J<{<< < << <L<"= >="_= ==#==$=v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good-0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-12 23:07+0100 Last-Translator: Petr Kovar Language-Team: Czech Language: cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; X-Generator: Lokalize 1.1 %s %d (funkce)%s (funkce)"%s" od "%s"Střed prostorového zvukuHloubka prostorového zvukuProstorové rozšířeníDošlo k síťové chybě, nebo server neočekávaně ukončil spojení.Vstup AUX 1Výstup AUX 1Vstup AUX 2Výstup AUX 2Vstup AUXVýstup AUXChyba přehrávání zvuku.BasyZesílení basůČerný konektorČerný konektor na předním paneluModrý konektorModrý konektor na předním paneluZabudovaný reproduktorCDNelze rozpoznat zařízení "%s".Není možné fungovat bez hodinStředovýStředový / LFEZměna rozlišení za běhu doposud není podporována.Nezdařilo se spojení se serveremNezdařilo se zařazení vyrovnávací paměti na zařízení "%s".Nezdařilo se navázání spojení se serverem.Nezdařilo se navázání spojení se zvukovým serveremNezdařilo se zjištění parametrů na zařízení "%s"Nezdařilo se mapování vyrovnávací paměti ze zařízení "%s"Nezdařilo se otevření zvukového zařízení pro obsluhu ovládání směšovače.Nezdařilo se otevření zvukového zařízení k obsluze ovládání směšovače. Tato verze Open Sound System není příslušným prvkem podporována.Zvukové zařízení nelze otevřít ke čtení.Zvukové zařízení nelze otevřít k přehrávání. Zařízení je používáno jinou aplikací.Nezdařilo se otevření zvukového zařízení k přehrávání. Tato verze Open Sound System není příslušným prvkem podporována.Zvukové zařízení nelze otevřít k přehrávání. Nemáte oprávnění k otevření zařízení.Zvukové zařízení nelze otevřít k nahrávání.Zvukové zařízení nelze otevřít k nahrávání. Nemáte oprávnění k otevření zařízení.Nelze otevřít zařízení "%s" ke čtení a k zápisu.Nezdařil se překlad názvu serveru.Zařízení "%s" není záznamovým zařízením.Zařízení "%s" není výstupním zařízením.DiagnostikaDigitální vstupDigitální výstupDigitální 1Digitální 2Digitální 3Snížení počtu kanálůChyba při získávání informací o schopnostech u zařízení "%s": Nejedná se o ovladač v4l2. Je nutné zkontrolovat, zda se nejedná o ovladač v4l1.Chyba při čtení %d bajtů na zařízení "%s".Chyba při čtení %d bajtů na zařízení "%s".Chyba při nahrávání ze zvukového zařízení.Selhání po %d pokusech. Zařízení %s. Systémová chyba: %sNezdařilo se zjištění vlastností ovládacích prvků na zařízení "%s".Nezdařilo se dekódování obrázku JPEGNezdařilo se získání aktuálního vstupu na zařízení "%s". Možná se jedná o radiopřijímač.Nezdařilo se získání aktuálního výstupu na zařízení "%s". Možná se jedná o radiopřijímačNezdařilo se zjištění aktuální frekvence tuneru u zařízení "%s".Selhalo zjištění nastavení tuneru %d na zařízení "%s".Nezdařilo se zjištění síly signálu u zařízení "%s".Nezdařilo se zjištění hodnoty u ovládacího prvku "%d" na zařízení "%s".Nezdařilo se dotázání na vlastnosti vstupu %d na zařízení %sNezdařilo se dotázání na norm na zařízení "%s".Nezdařil se dotaz na schopnosti zvukového serveruNezdařilo se nastavení aktuální frekvence tuneru u zařízení "%s" na %lu Hz.Nezdařilo se nastavení vstupu "%d" na zařízení "%s".Nezdařilo se nastavení norm u zařízení "%s".Nezdařilo se nastavení výstupu %d na zařízení %s.Nezdařilo se nastavení hodnoty "%d" u ovládacího prvku "%d" na zařízení "%s".Nezdařil se pokus o získání videosnímků ze zařízení "%s".RychléPředníSluchátka na předním paneluLinkový vstup na předním paneluLinkový výstup na předním paneluMikrofon na předním paneluZesíleníZískána neočekávaná velikost snímku %u namísto %u.Šedý konektorŠedý konektor na předním paneluZelený konektorZelený konektor na předním paneluHDMITelefonní sluchátkoSluchátkoSluchátkaVysokéVstupní zesíleníVstupSměšovač vstupuVnitřní CDVnitřní chyba datového toku.Vnitřní chyba datového proudu.Atom - neplatná velikost.JackZvukové znamení klávesniceLFELinkový vstupLinkový výstupLinka 1Linka 2Linka 3Linkový vstupZpětná smyčkaNízkéMasterStředníMikrofonMikrofon 1Mikrofon 2Zesílení mikrofonuZesílení mikrofonuZdroj mikrofonuSměšovačModemMonitorZdroj monitoruSměšovač monoZtlumitNenastaveno URL.Žádný nebo neplatný zvukový vstup, proud AVI bude poškozen.Nebyl nalezen žádný podporovaný proud. Patrně bude nutné povolit více přenosových protokolů, jinak asi bude scházet potřebný zásuvný modul rozšíření GStreamer RTSP.Nebyl nalezen žádný podporovaný proud. Bude patrně nutné nainstalovat zásuvný modul rozšíření GStreamer RTSP pro multimediální proudy Real.ŽádnéVypnutoZapnutoOranžový konektorOranžový konektor na předním paneluJinéVýstupní zesíleníVýstupní zesíleníPCMPCM 2Telefonní vstupTelefonní výstupRůžový konektorRůžový konektor na předním paneluPorty přehráváníPřehrávání není tímto zvukovým zařízením podporováno.VýrobaRádioZadníNahráváníZesílení záznamuZdroj záznamuToto zvukové zařízení nepodporuje nahrávání.Červený konektorČervený konektor na předním paneluVstup SPDIFVýstup SPDIFZabezpečené připojení selhalo.Server nepodporuje hledání.Server odeslal chybná data.BočníNapodobit stereoReproduktorZdroj reproduktoruRozložený výstupStereoSměšovač stereoProstorový zvukProstorový zvukSyntezátorTelefonOvladač zařízení "%s" nepodporuje žádnou známou záznamovou metodu.Video v tomto souboru se nemusí přehrát správně.Tento soubor neobsahuje hratelné proudy.Tento soubor obsahuje příliš mnoho proudů. Přehrává se pouze první %dTento soubor je poškozen a nelze jej přehrát.Tento soubor není úplný a nelze jej přehrát.Tento soubor je neplatný a nelze jej přehrát.Toto není zařízení "%s".VýškyVelmi vysokéVelmi nízkéVideoVstup videaVstupní videozařízení nepřijalo nové nastavení vzorkovací frekvence.Kanály virtuálního směšovačeVstup virtuálního směšovačeVýstup virtuálního směšovačeHlasitostBílý konektorBílý konektor na předním paneluŽlutý konektorŽlutý konektor na předním panelugst-plugins-good-0.10.31/po/zh_TW.gmo0000644000175000017500000001113711720565343014165 00000000000000Ok     % ,79qq c nz"    $ * 4 @ \ a o s {           6 = B F I O [ /j  0     " 0 7 B K Z d n w    ; E O X c p }    3 hYj  ' 5H[ k x !       ' 3?O_ou V   '  H R _ l!y     % ,9LK7 / 8:! .>=6AI#,GOL&;B"<4DJ(9*N +2'EC1$ M3)5-?@0 %FH%s Function3D Center3D Depth3D EnhanceAUX 1 InAUX 2 InAUX InAUX OutAudio playback error.Bass BoostCenterCenter / LFECould not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Digital InDigital OutDownmixError recording from audio device.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneHDMIHandsetHeadphonesHighInputInput MixInternal CDInternal data stream error.JackKeyboard BeepLFELine InLoopbackLowMasterMediumMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceModemMonitor SourceMono MixMuteNo or invalid input audio, AVI stream will be corrupt.NoneOffOnOtherOutput GainPlayback PortsPlayback is not supported by this audio device.ProductionRearRecord GainRecord SourceRecording is not supported by this audio device.SPDIF InSideSimulate StereoSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundTelephoneVery HighVery LowVideo InVirtual Mixer ChannelsVirtual Mixer InputProject-Id-Version: gst-plugins-good-0.10.2 0.10.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2006-08-29 01:08+0800 Last-Translator: Abel Cheung Language-Team: Chinese (traditional) Language: zh_TW MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s 功能3D Center3D Depth3D EnhanceAUX 1 输入AUX 2 输入AUX 输入AUX 输出音频播放错误。Bass 增益中置中置/低音炮无法打开音频文件进行混音控制操作。无法打开音频设备进行音量控制操作。此部件不支持开放声音系统(OSS)的版本。无法打开音频设备播放音频。此组件不支持开放声音系统(OSS)版本。数字输入数字输出Downmix从音频设备录音时发生错误。快前置声道头戴式耳机面板线路输入面板线路输出面板麦克风面板HDMI(高清)手持设备头戴式耳机高输入混音输入内部 CD 音频內部資料串流發生錯誤。Jack按键声音低音炮线路输入Loopback慢主声道中等麦克风 1麦克风 2麦克风增益麦克风增益麦克风音源Modem监视器来源单声道静音沒有任何輸入的音效資料或者資料無效,表示 AVI 串流出現錯誤。无关开其它设备输出增益回放端口此音频设备不支持音频播放。生产商后置声道录音增益录音来源此音频设备不支持录音。SPDIF 输入左右声道模拟立体声扬声器音源Spread 输出立体声立体声立体声环绕立体声环绕话筒很高很慢视频输入模拟混音输入模拟混音输入gst-plugins-good-0.10.31/po/bg.po0000644000175000017500000004742411720565341013364 00000000000000# Bulgarian translation of gst-plugins-good. # Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # Alexander Shopov , 2007, 2008, 2009, 2010, 2011. # # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-04-26 22:35+0300\n" "Last-Translator: Alexander Shopov \n" "Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgid "Could not establish connection to sound server" msgstr "Не може да се осъществи връзка към звуковия сървър." msgid "Failed to query sound server capabilities" msgstr "Неуспешно запитване за възможностите на звуковия сървър." #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "„%s“ от „%s“" msgid "Internal data stream error." msgstr "Вътрешна грешка на потока от данни." msgid "Failed to decode JPEG image" msgstr "Неуспешно декодиране на изображение, формат JPEG." msgid "Could not connect to server" msgstr "Не може да се осъществи връзка към сървър." msgid "Server does not support seeking." msgstr "Сървърът не поддържа търсене." msgid "Could not resolve server name." msgstr "Сървърът не може да се открие по име." msgid "Could not establish connection to server." msgstr "Не може да се осъществи връзка към сървъра." msgid "Secure connection setup failed." msgstr "Неуспешно осъществяване на шифрирана връзка." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Възникна мрежова грешка или сървърът неочаквано прекъсна връзката." msgid "Server sent bad data." msgstr "Сървърът изпрати лоши данни." msgid "No URL set." msgstr "Не е зададен адрес." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Аудио входът липсва или е грешен. Потокът с AVI ще бъде повреден." msgid "This file contains no playable streams." msgstr "Този файл не съдържа изпълними потоци." msgid "This file is invalid and cannot be played." msgstr "Този файл е повреден и не може да бъде изпълнен." msgid "This file is corrupt and cannot be played." msgstr "Този файл е повреден и не може да бъде изпълнен." msgid "Invalid atom size." msgstr "Неправилен размер на атом." msgid "This file is incomplete and cannot be played." msgstr "Този файл е непълен и не може да бъде изпълнен." msgid "The video in this file might not play correctly." msgstr "Видео потокът в този файл може да не се покаже правилно." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Този файл съдържа прекалено много потоци. Изпълняват се само първите %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Не е открит поддържан поток. Може да трябва да инсталирате приставката на " "GStreamer — RTSP, който поддържа потоци на Real." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Не е открит поддържан поток. Може би трябва да разрешите повече транспортни " "протоколи или ви липсва правилната приставка на GStreamer за RTSP." msgid "Internal data flow error." msgstr "Вътрешна грешка в потока с данни." msgid "Volume" msgstr "Сила на звука" msgid "Bass" msgstr "Баси" msgid "Treble" msgstr "Високи" msgid "Synth" msgstr "Синтезатор" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Високоговорител" msgid "Line-in" msgstr "Вход" msgid "Microphone" msgstr "Микрофон" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Смесител" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Запис" msgid "In-gain" msgstr "Входно усилване" msgid "Out-gain" msgstr "Изходно усилване" msgid "Line-1" msgstr "Вход-1" msgid "Line-2" msgstr "Вход-2" msgid "Line-3" msgstr "Вход-3" msgid "Digital-1" msgstr "Цифрова-1" msgid "Digital-2" msgstr "Цифрова-2" msgid "Digital-3" msgstr "Цифрова-3" msgid "Phone-in" msgstr "Вход за слушалки" msgid "Phone-out" msgstr "Изход за слушалки" msgid "Video" msgstr "Видео" msgid "Radio" msgstr "Радио" msgid "Monitor" msgstr "Монитор" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Аудио устройството не може да се отвори за изпълнение, използва се от друго " "приложение." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Аудио устройството не може да се отвори за изпълнение, нямате права за това." msgid "Could not open audio device for playback." msgstr "Устройството не може да се отвори за изпълнение." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Аудио устройството не може да се отвори за запис, нямате права за това." msgid "Could not open audio device for recording." msgstr "Аудио устройството не може да се отвори за запис." msgid "Could not open audio device for mixer control handling." msgstr "Аудио устройството не може да се отвори за управление на смесването." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Аудио устройството не може да се отвори за управление на смесването. " "Елементът не поддържа тази версия на OSS." msgid "Master" msgstr "Основна" msgid "Front" msgstr "Отпред" msgid "Rear" msgstr "Отзад" msgid "Headphones" msgstr "Слушалки" msgid "Center" msgstr "Център" msgid "LFE" msgstr "Баси" msgid "Surround" msgstr "Съраунд" msgid "Side" msgstr "Отстрани" msgid "Built-in Speaker" msgstr "Вграден високоговорител" msgid "AUX 1 Out" msgstr "Изход AUX 1" msgid "AUX 2 Out" msgstr "Изход AUX 2" msgid "AUX Out" msgstr "Изход AUX" msgid "3D Depth" msgstr "3D — дълбочина" msgid "3D Center" msgstr "3D — център" msgid "3D Enhance" msgstr "3D — подобрения" msgid "Telephone" msgstr "Телефон" msgid "Line Out" msgstr "Изход" msgid "Line In" msgstr "Вход" msgid "Internal CD" msgstr "Вътрешно CD" msgid "Video In" msgstr "Видео вход" msgid "AUX 1 In" msgstr "Вход AUX 1" msgid "AUX 2 In" msgstr "Вход AUX 2" msgid "AUX In" msgstr "Вход AUX" msgid "Record Gain" msgstr "Усилване на записа" msgid "Output Gain" msgstr "Усилване на изхода" msgid "Microphone Boost" msgstr "Усилване на микрофона" msgid "Loopback" msgstr "Обратна връзка" msgid "Diagnostic" msgstr "Диагностика" msgid "Bass Boost" msgstr "Усилване на баситe" msgid "Playback Ports" msgstr "Изходни гнезда" msgid "Input" msgstr "Вход" msgid "Record Source" msgstr "Източник за запис" msgid "Monitor Source" msgstr "Източник за звуков монитор" msgid "Keyboard Beep" msgstr "Клавиатурен звънец" msgid "Simulate Stereo" msgstr "Симулирано стерео" msgid "Stereo" msgstr "Стерео" msgid "Surround Sound" msgstr "Стерео и съраунд" msgid "Microphone Gain" msgstr "Усилване на микрофона" msgid "Speaker Source" msgstr "Източник за високоговорител" msgid "Microphone Source" msgstr "Източник за микрофон" msgid "Jack" msgstr "Жак" msgid "Center / LFE" msgstr "Център/баси" msgid "Stereo Mix" msgstr "Смесител на стерео" msgid "Mono Mix" msgstr "Смесител на моно" msgid "Input Mix" msgstr "Смесител на входа" msgid "SPDIF In" msgstr "Вход SPDIF" msgid "SPDIF Out" msgstr "Изход SPDIF" msgid "Microphone 1" msgstr "Микрофон 1" msgid "Microphone 2" msgstr "Микрофон 2" msgid "Digital Out" msgstr "Цифров изход" msgid "Digital In" msgstr "Цифров вход" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Модем" msgid "Handset" msgstr "Слушалка" msgid "Other" msgstr "Друго" msgid "None" msgstr "Няма" msgid "On" msgstr "Включено" msgid "Off" msgstr "Изключено" msgid "Mute" msgstr "Заглушаване" msgid "Fast" msgstr "Бързо" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Много ниско" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Ниско" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Средно" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Високо" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Много високо" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Професионално" msgid "Front Panel Microphone" msgstr "Микрофон на предния панел" msgid "Front Panel Line In" msgstr "Вход на предния панел" msgid "Front Panel Headphones" msgstr "Слушалки на предния панел" msgid "Front Panel Line Out" msgstr "Изход на предния панел" msgid "Green Connector" msgstr "Зелено гнездо" msgid "Pink Connector" msgstr "Розово гнездо" msgid "Blue Connector" msgstr "Синьо гнездо" msgid "White Connector" msgstr "Бяло гнездо" msgid "Black Connector" msgstr "Черно гнездо" msgid "Gray Connector" msgstr "Сиво гнездо" msgid "Orange Connector" msgstr "Оранжево гнездо" msgid "Red Connector" msgstr "Червено гнездо" msgid "Yellow Connector" msgstr "Жълто гнездо" msgid "Green Front Panel Connector" msgstr "Зелено гнездо на предния панел" msgid "Pink Front Panel Connector" msgstr "Розово гнездо на предния панел" msgid "Blue Front Panel Connector" msgstr "Синьо гнездо на предния панел" msgid "White Front Panel Connector" msgstr "Бяло гнездо на предния панел" msgid "Black Front Panel Connector" msgstr "Черно гнездо на предния панел" msgid "Gray Front Panel Connector" msgstr "Сиво гнездо на предния панел" msgid "Orange Front Panel Connector" msgstr "Оранжево гнездо на предния панел" msgid "Red Front Panel Connector" msgstr "Червено гнездо на предния панел" msgid "Yellow Front Panel Connector" msgstr "Жълто гнездо на предния панел" msgid "Spread Output" msgstr "Към повече изходи" msgid "Downmix" msgstr "Към по-малко изходи" msgid "Virtual Mixer Input" msgstr "Вход на виртуален смесител" msgid "Virtual Mixer Output" msgstr "Изход на виртуален смесител" msgid "Virtual Mixer Channels" msgstr "Канали на виртуален смесител" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Функция на %s № %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Функция на %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Аудио устройството не може да се отвори за изпълнение. Елементът не поддържа " "тази версия на OSS." msgid "Playback is not supported by this audio device." msgstr "Това аудио устройство не поддържа изпълнение." msgid "Audio playback error." msgstr "Грешка при изпълнение на аудиото." msgid "Recording is not supported by this audio device." msgstr "Това аудио устройство не поддържа запис." msgid "Error recording from audio device." msgstr "Грешка при записа от аудио устройството." msgid "Gain" msgstr "Усилване" msgid "Headphone" msgstr "Слушалки" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Грешка при прочитане %d байта от устройство „%s“." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Получена е рамка с размер %u вместо очаквания %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Грешка при прочитане на %d байта на устройство „%s“." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Грешка при получаването на възможностите на устройството „%s“: не е драйвер " "v4l2. Проверете дали всъщност не е драйвер v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Неуспешно запитване за атрибутите за вход %d на устройство „%s“." #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Неуспешно получаване на настройките на тунер %d на устройство „%s“." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Неуспешно запитване за нормата на устройство „%s“." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Неуспешно получаване на контролните атрибути на устройството „%s“." #, c-format msgid "Cannot identify device '%s'." msgstr "Устройството „%s“ не може да се идентифицира." #, c-format msgid "This isn't a device '%s'." msgstr "„%s“ не е устройство." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Устройството „%s“ не може да се отвори за четене и запис." #, c-format msgid "Device '%s' is not a capture device." msgstr "Устройството „%s“ не е устройство за запис." #, c-format msgid "Device '%s' is not a output device." msgstr "Устройството „%s“ не е изходно устройство." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Неуспешно задаване на нормата на устройство „%s“." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Неуспешно получаване на текущата настройка на честотата за устройство „%s“." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Неуспешно задаване на текущата настройка на честотата на устройство „%s“ да " "е %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Неуспешно получаване на силата на сигнала на устройство „%s“." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Неуспешно получаване на стойността на контрол %d на устройство „%s“." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Неуспешно задаване на стойността %d на контрол %d на устройство „%s“." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Неуспешно получаване на текущия вход на устройство „%s“. Може би е радио." #, c-format msgid "Failed to set input %d on device %s." msgstr "Неуспешно задаване на вход %d на устройство „%s“." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Неуспешно получаване на текущия изход на устройство „%s“. Може би е радио." #, c-format msgid "Failed to set output %d on device %s." msgstr "Неуспешно задаване на изход %d на устройство „%s“." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Буферите в устройство „%s“ не могат да се подредят в опашка." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Неуспешен опит за получаване на видео кадрите от устройство „%s“." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Неуспех след %d опита. Устройство „%s“. Системна грешка: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Не могат да се получат параметрите на устройството „%s“." msgid "Video input device did not accept new frame rate setting." msgstr "" "Устройството за видео вход не приема новите настройки за честотата на кадри." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Не могат да се получат буферите от устройството „%s“." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Драйверът за устройството „%s“ не поддържа познати методи за запис." msgid "Changing resolution at runtime is not yet supported." msgstr "" "Промяната на разделителната способност по време на работа все още не се " "поддържа." msgid "Cannot operate without a clock" msgstr "Работата без часовник е невъзможна." gst-plugins-good-0.10.31/po/sv.gmo0000644000175000017500000003477711720565343013601 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$ $ $ $$ $I$%'%0%9%B%I%P%i% n% y%% %%%%$%& & '&44&i&.&,&2&0'.I'>x'v'/.(V^(p([&).)Z); *!H*$j*%* * * * * * * *{*/{+-+%+7+E7,%},Y,Y,LW-Q-@-M7.G.8.6/W=/0/7/:/E90;0000001 15&1 \1i1 111 11 1111 112!2;2P2U2e2i2r2{222222 222 2 2 223333 %333;3@3;U33-444444444 5555 %525J5+]5 555555*5 5 6#6,656,U6 666 6666 66 6 77J7;a7;7Q72+8=^838 88 8 999H 9i9999 99 99v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-09 19:36+0100 Last-Translator: Daniel Nylander Language-Team: Swedish Language: sv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s %d-funktion%s-funktion"%s" av "%s"3D-center3D-djup3D EnhanceEtt nätverksfel inträfade eller servern stängde anslutningen oväntat.AUX 1 inAUX 1 utAUX 2 inAUX 2 utAUX inAUX utFel vid ljuduppspelning.BassBass BoostSvart kontaktSvart kontakt frontpanelBlå kontaktBlå kontakt frontpanelInbyggd högtalareCdKunde inte identifiera enheten "%s".Kan inte fungera utan en klockaCenterCenter / LFEÄndring av upplösning vid körtid stöds inte än.Kunde inte ansluta till servernKunde inte kölägga buffertar i enheten "%s".Kunde inte etablera anslutning till servern.Kunde inte etablera en anslutning till ljudservernKunde inte få tag i parametrar på enheten "%s"Kunde inte mappa buffertar från enheten "%s".Kunde inte öppna ljudenheten för hantering av mixerstyrning.Kunde inte öppna ljudenheten för mixerhantering. Denna version av Open Sound System saknar stöd för detta element.Kunde inte öppna ljudenheten för uppspelning.Kunde inte öppna ljudenheten för uppspelning. Enheten används av ett annat program.Kunde inte öppna ljudenheten för uppspelning. Denna version av Open Sound System stöds inte av detta element.Kunde inte öppna ljudenheten för uppspelning. Du har inte behörighet att öppna enheten.Kunde inte öppna ljudenheten för inspelning.Kunde inte öppna ljudenheten för inspelning. Du har inte behörighet att öppna enheten.Kunde inte öppna enheten "%s" för läsning och skrivning.Kunde inte slå upp servernamnet.Enheten "%s" är ingen fångstenhet.Enheten "%s" är ingen utgångsenhet.DiagnostikDigital-inDigital-utDigital-1Digital-2Digital-3NermixningFel vid läsning av förmågor för enheten "%s": Det är inte en v4l2-drivrutin. Kontrollera om det är en v4l1-drivrutin.Fel vid läsning av %d byte från enheten "%s".Fel vid läsning av %d byte på enheten "%s".Fel vid inspelning från ljudenheten.Misslyckades efter %d försök. enhet %s. systemfel: %sMisslyckades med att få tag på kontrollattributen på enheten "%s".Misslyckades med att avkoda JPEG-bildMisslyckades med att få tag på aktuell ingång på enheten "%s". Kan vara en radioenhetMisslyckades med att få tag på aktuell utgång på enheten "%s". Kan vara en radioenhetMisslyckades med att gå tag på aktuell mottagarfrekvens för enheten "%s".Misslyckades med att få tag i inställningen för mottagare %d på enheten "%s".Misslyckades med att få tag på signalstyrka för enheten "%s".Misslyckades med att få tag på värdet för kontrollen %d på enheten "%s".Misslyckades med att fråga efter attribut för ingång %d i enheten %sMisslyckades med att fråga efter norm på enheten "%s".Misslyckades med att fråga efter ljudserverförmågorMisslyckades med att ställa in aktuell mottagarfrekvens för enheten "%s" till %lu Hz.Kunde inte ställa in ingång %d på enheten %s.Misslyckades med att ställa in norm för enheten "%s".Misslyckades med att ställa in utgång %d på enheten %s.Kunde inte ställa in värdet %d för kontrollen %d på enheten "%s".Misslyckades med att få videobildrutor från enheten "%s".SnabbFramHörlurar frontpanelLinje-in frontpanelLinje-ut frontpanelMikrofon på frontpanelFörstärkFick oväntade bildrutstorleken %u istället för %u.Grå kontaktGrå kontakt frontpanelGrön kontaktGrön kontakt frontpanelHDMIHandhållenHörlurHörlurarHögInförstärkningIngångIngångsmixIntern cd-spelareInternt fel i dataflöde.Internt fel i dataström.Ogiltig atomstorlek.JackTangentbordspipLFELinje-inLinje utLinje-1Linje-2Linje-3Linje-inLoopbackLågÖvergripandeMedelMikrofonMikrofon 1Mikrofon 2MikrofonboostMikrofonförstärkningMikrofonkällaMixerModemMonitorMonitorkällaMonomixTystIngen URL inställd.Inget eller ogiltigt inljud. AVI-flödet kommer att skadas.Ingen ström som stöds hittades. Du kanske behöver tillåta fler transportprotokoll eller så saknar du kanske det rätta GStreamer-tillägget för RTSP.Ingen ström som stöds hittades. Du kanske behöver installera en GStreamer-insticksmodul för RTSP för Real Media-strömmar.IngenAvPåOrange kontaktOrange kontakt frontpanelAnnatUtförstärkningUtförstärkningPCMPCM-2Tele-inTele-utRosa kontaktRosa kontakt frontpanelUppspelningsportarUppspelning stöds inte av denna ljudenhet.ProduktionRadioBakSpela inInspelningsförstärkningInspelningskällaInspelning stöds inte av denna ljudenhet.Röd kontaktRöd kontakt frontpanelSPDIF inSPDIF utSäker anslutning misslyckades.Servern saknar stöd för sökning/spolning.Servern skickade felaktigt data.SidaSimulera stereoHögtalareHögtalarkällaSpridd utgångStereoStereomixSurroundSurroundljudSyntTelefonDrivrutinen för enheten "%s" saknar stöd för någon känd fångstmetod.Videon i den här filen kanske inte kan spelas upp korrekt.Den här filen innehåller inga uppspelningsbara strömmar.Den här filen innehåller för många strömmar. Spelar endast upp de första %dDen här filen är skadad och kan inte spelas upp.Den här filen är inte fullständig och kan inte spelas upp.Den här filen är ogiltig och kan inte spelas upp.Det här är inte en enhet "%s".DiskantMycket högMycket lågVideoVideo-inVideoingångsenheten accepterade inte ny inställning för bildfrekvens.Kanaler för virtuell mixerVirtuell mixer ingångVirtuell mixer utgångVolymVit kontaktVit kontakt frontpanelGul kontaktGul kontakt frontpanelgst-plugins-good-0.10.31/po/or.gmo0000644000175000017500000000401211720565343013544 00000000000000%`af i s } 6  "(/7=DJxQ3"Ps!%!% 'DT4s!    BassCDDigital-1Digital-2Digital-3In-gainLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSpeakerSynthTrebleVideoVolumeProject-Id-Version: gst-plugins-0.8.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2004-09-27 13:32+0530 Last-Translator: Gora Mohanty Language-Team: Oriya Language: or MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ଅନୁଚ୍ଚ ସ୍ବରସି.ଡି.ସାଂଖ୍ଯିକ-୧ସାଂଖ୍ଯିକ-୨ସାଂଖ୍ଯିକ-୩ନିବେଶ-ବୃଦ୍ଧିଲାଇନ-୧ଲାଇନ-୨ଲାଇନ-୩ଲାଇନ-ଇନମାଇକ୍ରୋଫୋନ୍ମିଶ୍ରଣ ଯନ୍ତ୍ରପ୍ରଦର୍ଶିକାନିବେଶ ଧ୍ବନି ନାହିଁ ବା ଅବୈଧ ଅଛି. ଏ.ଭି.ଆଇ. ଧାରା ଭ୍ରଷ୍ଟ ହୋଇଯିବ.ନିର୍ଗମ-ବୃଦ୍ଧିପି.ସି.ଏମ.ପି.ସି.ଏମ.-୨ଫୋନ-ନିବେଶଫୋନ-ନିର୍ଗମରେଡିଓଅନୁଲିପିକରଣସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ରସିନ୍ଥେସାଇଜରଉଚ୍ଚ ସ୍ବରଭିଡିଓପ୍ରବଳତାgst-plugins-good-0.10.31/po/quot.sed0000644000175000017500000000023111720560211014071 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g gst-plugins-good-0.10.31/po/zh_HK.po0000644000175000017500000002706311720565342013775 00000000000000# Chinese (Hong Kong) translation of gst-plugins-good-0.10.2. # This file is put in the public domain. # Abel Cheung , 2006. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.2 0.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2006-08-29 01:08+0800\n" "Last-Translator: Abel Cheung \n" "Language-Team: Chinese (Hong Kong) \n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "內部資料串流發生錯誤。" msgid "Failed to decode JPEG image" msgstr "" msgid "Could not connect to server" msgstr "" msgid "Server does not support seeking." msgstr "" msgid "Could not resolve server name." msgstr "" msgid "Could not establish connection to server." msgstr "" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "沒有任何輸入的音效資料或者資料無效,表示 AVI 串流出現錯誤。" msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" #, fuzzy msgid "Internal data flow error." msgstr "內部資料串流發生錯誤。" msgid "Volume" msgstr "" msgid "Bass" msgstr "" msgid "Treble" msgstr "" msgid "Synth" msgstr "" msgid "PCM" msgstr "" msgid "Speaker" msgstr "" msgid "Line-in" msgstr "" msgid "Microphone" msgstr "" msgid "CD" msgstr "" msgid "Mixer" msgstr "" msgid "PCM-2" msgstr "" msgid "Record" msgstr "" msgid "In-gain" msgstr "" msgid "Out-gain" msgstr "" msgid "Line-1" msgstr "" msgid "Line-2" msgstr "" msgid "Line-3" msgstr "" msgid "Digital-1" msgstr "" msgid "Digital-2" msgstr "" msgid "Digital-3" msgstr "" msgid "Phone-in" msgstr "" msgid "Phone-out" msgstr "" msgid "Video" msgstr "" msgid "Radio" msgstr "" msgid "Monitor" msgstr "" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for playback." msgstr "" msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for recording." msgstr "" msgid "Could not open audio device for mixer control handling." msgstr "无法打开音频文件进行混音控制操作。" msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "无法打开音频设备进行音量控制操作。此部件不支持开放声音系统(OSS)的版本。" msgid "Master" msgstr "主声道" msgid "Front" msgstr "前置声道" msgid "Rear" msgstr "后置声道" msgid "Headphones" msgstr "头戴式耳机" msgid "Center" msgstr "中置" msgid "LFE" msgstr "低音炮" msgid "Surround" msgstr "立体声环绕" msgid "Side" msgstr "左右声道" msgid "Built-in Speaker" msgstr "" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "AUX 输出" msgid "3D Depth" msgstr "3D Depth" msgid "3D Center" msgstr "3D Center" msgid "3D Enhance" msgstr "3D Enhance" msgid "Telephone" msgstr "话筒" msgid "Line Out" msgstr "" msgid "Line In" msgstr "线路输入" msgid "Internal CD" msgstr "内部 CD 音频" msgid "Video In" msgstr "视频输入" msgid "AUX 1 In" msgstr "AUX 1 输入" msgid "AUX 2 In" msgstr "AUX 2 输入" msgid "AUX In" msgstr "AUX 输入" msgid "Record Gain" msgstr "录音增益" msgid "Output Gain" msgstr "输出增益" msgid "Microphone Boost" msgstr "麦克风增益" msgid "Loopback" msgstr "Loopback" #, fuzzy msgid "Diagnostic" msgstr "采样分析" msgid "Bass Boost" msgstr "Bass 增益" msgid "Playback Ports" msgstr "回放端口" msgid "Input" msgstr "输入" msgid "Record Source" msgstr "录音来源" msgid "Monitor Source" msgstr "监视器来源" msgid "Keyboard Beep" msgstr "按键声音" msgid "Simulate Stereo" msgstr "模拟立体声" msgid "Stereo" msgstr "立体声" msgid "Surround Sound" msgstr "立体声环绕" msgid "Microphone Gain" msgstr "麦克风增益" msgid "Speaker Source" msgstr "扬声器音源" msgid "Microphone Source" msgstr "麦克风音源" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "中置/低音炮" msgid "Stereo Mix" msgstr "立体声" msgid "Mono Mix" msgstr "单声道" msgid "Input Mix" msgstr "混音输入" msgid "SPDIF In" msgstr "SPDIF 输入" msgid "SPDIF Out" msgstr "" msgid "Microphone 1" msgstr "麦克风 1" msgid "Microphone 2" msgstr "麦克风 2" msgid "Digital Out" msgstr "数字输出" msgid "Digital In" msgstr "数字输入" msgid "HDMI" msgstr "HDMI(高清)" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "手持设备" msgid "Other" msgstr "其它设备" msgid "None" msgstr "无" msgid "On" msgstr "开" msgid "Off" msgstr "关" msgid "Mute" msgstr "静音" msgid "Fast" msgstr "快" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "很慢" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "慢" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "中等" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "高" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "很高" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "生产商" msgid "Front Panel Microphone" msgstr "麦克风面板" msgid "Front Panel Line In" msgstr "线路输入面板" msgid "Front Panel Headphones" msgstr "头戴式耳机面板" msgid "Front Panel Line Out" msgstr "线路输出面板" #, fuzzy msgid "Green Connector" msgstr "线路输出" #, fuzzy msgid "Pink Connector" msgstr "话筒输出" #, fuzzy msgid "Blue Connector" msgstr "立体声输入" #, fuzzy msgid "White Connector" msgstr "左/单声道" #, fuzzy msgid "Black Connector" msgstr "后置声道输出" #, fuzzy msgid "Gray Connector" msgstr "中置声道输出" #, fuzzy msgid "Orange Connector" msgstr "低音炮输出" #, fuzzy msgid "Red Connector" msgstr "右声道" #, fuzzy msgid "Yellow Connector" msgstr "Midi 输出/游戏摇杆" #, fuzzy msgid "Green Front Panel Connector" msgstr "线路输出面板" #, fuzzy msgid "Pink Front Panel Connector" msgstr "话筒输出面板" #, fuzzy msgid "Blue Front Panel Connector" msgstr "立体声输入面板" #, fuzzy msgid "White Front Panel Connector" msgstr "左/单声道面板" #, fuzzy msgid "Black Front Panel Connector" msgstr "后置声道输出面板" #, fuzzy msgid "Gray Front Panel Connector" msgstr "中置声道输出面板" #, fuzzy msgid "Orange Front Panel Connector" msgstr "低音炮输出面板" #, fuzzy msgid "Red Front Panel Connector" msgstr "右声道面板" #, fuzzy msgid "Yellow Front Panel Connector" msgstr "Midi 输出/游戏摇杆面板" msgid "Spread Output" msgstr "Spread 输出" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "模拟混音输入" #, fuzzy msgid "Virtual Mixer Output" msgstr "模拟混音输出" msgid "Virtual Mixer Channels" msgstr "模拟混音输入" #. TRANSLATORS: name + number of a volume mixer control #, fuzzy, c-format msgid "%s %d Function" msgstr "%s 功能" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s 功能" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "无法打开音频设备播放音频。此组件不支持开放声音系统(OSS)版本。" msgid "Playback is not supported by this audio device." msgstr "此音频设备不支持音频播放。" msgid "Audio playback error." msgstr "音频播放错误。" msgid "Recording is not supported by this audio device." msgstr "此音频设备不支持录音。" msgid "Error recording from audio device." msgstr "从音频设备录音时发生错误。" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "" #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, c-format msgid "Cannot identify device '%s'." msgstr "" #, c-format msgid "This isn't a device '%s'." msgstr "" #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "" #, c-format msgid "Device '%s' is not a capture device." msgstr "" #, c-format msgid "Device '%s' is not a output device." msgstr "" #, c-format msgid "Failed to set norm for device '%s'." msgstr "" #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set input %d on device %s." msgstr "" #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set output %d on device %s." msgstr "" #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "" #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, c-format msgid "Could not get parameters on device '%s'" msgstr "" msgid "Video input device did not accept new frame rate setting." msgstr "" #, c-format msgid "Could not map buffers from device '%s'" msgstr "" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" gst-plugins-good-0.10.31/po/gl.po0000644000175000017500000005100011720565342013360 00000000000000# Galician translation of gst-plugins-good. # Copyright (C) 2009 gst-plugins-good's COPYRIGHT HOLDER # This file is distributed under the same license as the gst-plugins-good package. # Fran Diéguez , 2009, 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-09 21:20+0100\n" "Last-Translator: Fran Diéguez \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" msgid "Could not establish connection to sound server" msgstr "Non foi posíbel estabelecer a conexión co servidor de son" msgid "Failed to query sound server capabilities" msgstr "Produciuse un erro ao consultar as capacidades do servidor de son" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» por «%s»" msgid "Internal data stream error." msgstr "Produciuse un erro no fluxo de datos interno." msgid "Failed to decode JPEG image" msgstr "Produciuse un erro ao descodificar a imaxe JPEG" msgid "Could not connect to server" msgstr "Non foi posíbel conectarse ao servidor" msgid "Server does not support seeking." msgstr "O servidor non admite a busca." msgid "Could not resolve server name." msgstr "Non foi posíbel resolver o nome do servidor." msgid "Could not establish connection to server." msgstr "Non foi posíbel estabelecer a conexión co servidor." msgid "Secure connection setup failed." msgstr "Produciuse un fallo de configuración da conexión segura." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Produciuse un erro de rede ou o servidor pechou a conexión de forma " "inesperada." msgid "Server sent bad data." msgstr "O servidor enviou datos erróneos." msgid "No URL set." msgstr "No existe un URL estabelecido." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "O audio non existe ou non é válido, o fluxo AVI está corrompido." msgid "This file contains no playable streams." msgstr "Este ficheiro non contén ningún fluxo reproducíbel." msgid "This file is invalid and cannot be played." msgstr "Este ficheiro é incorrecto e non pode reproducirse." msgid "This file is corrupt and cannot be played." msgstr "Este ficheiro está danado e non pode reproducirse." msgid "Invalid atom size." msgstr "Tamaño atom non válido." msgid "This file is incomplete and cannot be played." msgstr "Este ficheiro está incompleto e non pode reproducirse." msgid "The video in this file might not play correctly." msgstr "Este vídeo neste ficheiro podería non reproducirse correctamente." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Este ficheiro contén demasiados fluxos. Só se reproducirá o primeiro %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Non se encontrou un fluxo compatíbel. Pode que necesite instalar unha " "extensión RTSP de GStreamer para os formatos de fluxo Real." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Non se encontrou un fluxo compatíbel. Pode que necesite permitir máis " "protocolos de transporte ou de outra forma pode que lle falte a extensión " "correcta de RTSP de GStreamer." msgid "Internal data flow error." msgstr "Produciuse un erro interno no fluxo de datos." msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Baixos" msgid "Treble" msgstr "Agudos" msgid "Synth" msgstr "Sintetizador" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Altofalante" msgid "Line-in" msgstr "Liña de entrada" msgid "Microphone" msgstr "Micrófono" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Misturador" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Gravar" msgid "In-gain" msgstr "Ganancia de entrada" msgid "Out-gain" msgstr "Ganancia de saída" msgid "Line-1" msgstr "Liña 1" msgid "Line-2" msgstr "Liña 2" msgid "Line-3" msgstr "Liña 3" msgid "Digital-1" msgstr "Dixital 1" msgid "Digital-2" msgstr "Dixital 2" msgid "Digital-3" msgstr "Dixital 3" msgid "Phone-in" msgstr "Entrada teléfono" msgid "Phone-out" msgstr "Saída teléfono" msgid "Video" msgstr "Vídeo" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Non foi posíbel abrir o dispositivo de son para a reprodución. O dispositivo " "está sendo empregado por outro aplicativo." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Non foi posíbel abrir o dispositivo de son. Vostede non ten permisos para " "abrir o dispositivo." msgid "Could not open audio device for playback." msgstr "Non foi posíbel abrir o dispositivo de son para a reprodución." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Non foi posíbel abrir o dispositivo de son para a gravación. Vostede non ten " "permisos para abrir o dispositivo." msgid "Could not open audio device for recording." msgstr "Non foi posíbel abrir o dispositivo de son para a gravación." msgid "Could not open audio device for mixer control handling." msgstr "" "Non foi posíbel abrir o dispositivo de son para a súa xestión polo control " "de misturado." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Non foi posíbel abrir o dispositivo de son para a súa xestión polo control " "de misturado. Este elemento non admite esta versión do Open Sound System." msgid "Master" msgstr "Mestre" msgid "Front" msgstr "Frontal" msgid "Rear" msgstr "Treseiro" msgid "Headphones" msgstr "Auriculares" msgid "Center" msgstr "Centro" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Envolvente" msgid "Side" msgstr "Lateral" msgid "Built-in Speaker" msgstr "Altofalante interno" msgid "AUX 1 Out" msgstr "Saída AUX 1" msgid "AUX 2 Out" msgstr "Saída AUX 2" msgid "AUX Out" msgstr "Saída AUX" msgid "3D Depth" msgstr "Profundidade 3D" msgid "3D Center" msgstr "Centro 3D" msgid "3D Enhance" msgstr "Mellora 3D" msgid "Telephone" msgstr "Teléfono" msgid "Line Out" msgstr "Liña de saída" msgid "Line In" msgstr "Liña de entrada" msgid "Internal CD" msgstr "CD interno" msgid "Video In" msgstr "Entrada de vídeo" msgid "AUX 1 In" msgstr "Entrada AUX 1" msgid "AUX 2 In" msgstr "Entrada AUX 2" msgid "AUX In" msgstr "Entrada AUX" msgid "Record Gain" msgstr "Ganancia de gravación" msgid "Output Gain" msgstr "Ganancia de saída" msgid "Microphone Boost" msgstr "Aumento do micrófono" msgid "Loopback" msgstr "Bucle local" msgid "Diagnostic" msgstr "Diagnóstico" msgid "Bass Boost" msgstr "Aumento de baixos" msgid "Playback Ports" msgstr "Portos de reprodución" msgid "Input" msgstr "Entrada" msgid "Record Source" msgstr "Orixe da gravación" msgid "Monitor Source" msgstr "Monitor de orixe" msgid "Keyboard Beep" msgstr "Pitido de teclado" msgid "Simulate Stereo" msgstr "Simular estéreo" msgid "Stereo" msgstr "Estéreo" msgid "Surround Sound" msgstr "Son envolvente" msgid "Microphone Gain" msgstr "Ganancia do micrófono" msgid "Speaker Source" msgstr "Altofalante de orixe" msgid "Microphone Source" msgstr "Micrófono de orixe" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Centro / LFE" msgid "Stereo Mix" msgstr "Misturador estéreo" msgid "Mono Mix" msgstr "Misturador mono" msgid "Input Mix" msgstr "Misturador de entrada" msgid "SPDIF In" msgstr "Entrada SPDIF" msgid "SPDIF Out" msgstr "Saída SPDIF" msgid "Microphone 1" msgstr "Micrófono 1" msgid "Microphone 2" msgstr "Micrófono 2" msgid "Digital Out" msgstr "Saída dixital" msgid "Digital In" msgstr "Entrada dixital" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Módem" msgid "Handset" msgstr "Auriculares" msgid "Other" msgstr "Outro" msgid "None" msgstr "Ningún" msgid "On" msgstr "Acendido" msgid "Off" msgstr "Apagado" msgid "Mute" msgstr "Silenciar" msgid "Fast" msgstr "Rápido" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Moi baixo" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Baixo" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medio" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Alto" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Moi alto" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produción" msgid "Front Panel Microphone" msgstr "Micrófono do panel frontal" msgid "Front Panel Line In" msgstr "Entrada do panel frontal" msgid "Front Panel Headphones" msgstr "Auriculares do panel frontal" msgid "Front Panel Line Out" msgstr "Saída do panel frontal" msgid "Green Connector" msgstr "Conectador verde" msgid "Pink Connector" msgstr "Conectador rosa" msgid "Blue Connector" msgstr "Conectador azul" msgid "White Connector" msgstr "Conectador branco" msgid "Black Connector" msgstr "Conectador negro" msgid "Gray Connector" msgstr "Conectador gris" msgid "Orange Connector" msgstr "Conectador laranxa" msgid "Red Connector" msgstr "Conectador vermello" msgid "Yellow Connector" msgstr "Conectador amarelo" msgid "Green Front Panel Connector" msgstr "Conectador verde do panel frontal" msgid "Pink Front Panel Connector" msgstr "Conectador rosa do panel frontal" msgid "Blue Front Panel Connector" msgstr "Conectador azul do panel frontal" msgid "White Front Panel Connector" msgstr "Conectador branco do panel frontal" msgid "Black Front Panel Connector" msgstr "Conectador negro do panel frontal" msgid "Gray Front Panel Connector" msgstr "Conectador gris do panel frontal" msgid "Orange Front Panel Connector" msgstr "Conectador laranxado panel frontal" msgid "Red Front Panel Connector" msgstr "Conectador vermello do panel frontal" msgid "Yellow Front Panel Connector" msgstr "Conectador amarelo do panel frontal" msgid "Spread Output" msgstr "Expandir saída" msgid "Downmix" msgstr "Redución de canles" msgid "Virtual Mixer Input" msgstr "Entrada do misturador virtual" msgid "Virtual Mixer Output" msgstr "Saída do misturador virtual" msgid "Virtual Mixer Channels" msgstr "Canles do misturador virtual" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Función %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Función %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Non foi posíbel abrir o dispositivo de son para a reprodución. Esta versión " "do Open Sound System non está admitida por este elemento." msgid "Playback is not supported by this audio device." msgstr "Este dispositivo de son non admite a reprodución." msgid "Audio playback error." msgstr "Erro de reprodución de son." msgid "Recording is not supported by this audio device." msgstr "Este dispositivo de son non admite a gravación." msgid "Error recording from audio device." msgstr "Erro ao gravar do dispositivo de son." msgid "Gain" msgstr "Ganancia" msgid "Headphone" msgstr "Cascos" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Produciuse un erro ao ler %d bytes desde o dispositivo «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Obtívose un tamaño de marco de %u non esperado no lugar de %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Produciuse un erro ao ler %d bytes do dispositivo «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Produciuse un erro ao obter as capacidades do dispositivo «%s»: Non é un " "controlador v4l2. Comprobe se é un controlador v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" "Produciuse un erro ao consultar os atributos de entrada %d no dispositivo %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Produciuse un erro ao configurar o sintonizador %d no dispositivo «%s»." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Produciuse un erro ao consultar a norma no dispositivo «%s»." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" "Produciuse un erro ao obter os atributos de control do dispositivo «%s»." #, c-format msgid "Cannot identify device '%s'." msgstr "Non foi posíbel identificar o dispositivo «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "Este non é un dispositivo «%s»." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Non foi posíbel abrir o dispositivo «%s» para lectura e escritura." #, c-format msgid "Device '%s' is not a capture device." msgstr "O dispositivo «%s» non é un dispositivo de captura." #, c-format msgid "Device '%s' is not a output device." msgstr "O dispositivo «%s» non é un dispositivo de captura." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Produciuse un fallo ao estabelecer a norma no dispositivo «%s»." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Produciuse un fallo ao obter a frecuencia actual do sintonizador para o " "dispositivo «%s»." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Produciuse un erro ao estabelecer a frecuencia actual do sintonizador para o " "dispositivo «%s» a %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" "Produciuse un erro ao obter a potencia do sinal para o dispositivo «%s»." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" "Produciuse un erro ao obter o valor para o control %d do dispositivo «%s»." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Produciuse un fallo ao estabelecer o valor %ds para o control %d do " "dispositivo «%s»." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Produciuse un fallo ao obter a entrada actual no dispositivo «%s». Cicáis " "sexa un dispositivo de radio." #, c-format msgid "Failed to set input %d on device %s." msgstr "Produciuse un fallo ao estabelecer a entrada %d no dispositivo %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Produciuse un fallo ao obter a entrada actual no dispositivo «%s». Quizais " "sexa un dispositivo de radio" #, c-format msgid "Failed to set output %d on device %s." msgstr "Produciuse un fallo ao estabelecer a saída %d no dispositivo %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Non é posíbel meter na cola os búferes no dispositivo «%s»." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" "Produciuse un fallo ao tentar obter cadros de vídeo do dispositivo «%s»." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" "Prouciuse un fallo despois de %d intentos. Dispositivo %s. Error do sistema: " "%s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Non foi posíbel obter os parámetros para o dispositivo «%s»" msgid "Video input device did not accept new frame rate setting." msgstr "" "O dispositivo de entrada de vídeo non aceptou o axuste da nova taxa de " "fotogramas." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Non foi posíbel mapear os búferes do dispositivo «%s»" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "O controlador do dispositivo «%s» non admite ningún método de captura " "coñecido." msgid "Changing resolution at runtime is not yet supported." msgstr "Aínda non se admite o cambio de resolución durante a reprodución." msgid "Cannot operate without a clock" msgstr "Non é posíbel operar sen reloxo" #~ msgid "Describes the selected input element." #~ msgstr "Describe o elemento de entrada seleccionado." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "" #~ "Describe o elemento de saída seleccionado para a Conferencia de Audio/" #~ "Vídeo." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "" #~ "Describe o elemento de saída seleccionado para a Música e Películas." #~ msgid "Describes the selected output element." #~ msgstr "Describe o elemento de saída seleccionado." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "GStreamer audiosink para a Conferencia de Audio/Video" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "GStreamer audiosink para Música e Filmes" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer pode reproducir audio empregando calquera número de elementos " #~ "de saída. Algunha elección posíbel é ossink, esdsink e alsasink. O " #~ "audiosink pode ser un pipeline parcial no cando de só un elemento único." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer pode reproducir vídeo usando calquera número de elementos de " #~ "saída. As posíbeis eleccións son xvimagesink, ximagesink, sdlvideosink e " #~ "aasink. O videosink pode ser un pipeline parcial no lugar de un elemento " #~ "único." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "GStreamer pode poñer engadidos de visualización nun pipeline para " #~ "transformar un fluxo de audio en marcos de vídeo. Por omisión é goom pero " #~ "pronto convertiránse máis visualizacións. O engadido de visualización " #~ "pode ser un pipeline parcial no lugar de só un elemento." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer pode gravar audio usando calquera número de elementos de " #~ "entrada. Algunhas das posíbeis eleccións son osssrc, esdsrc e alsasrc. A " #~ "orixe do audio pode ser un pipeline parcial no lugar de un só elemento." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer pode gravar audio usando calquera número de elementos de " #~ "entrada. Algunhas das posíbeis eleccións son v4lsrc e videotestsrc. A " #~ "orixe do audio pode ser un pipeline parcial no lugar de un só elemento." #~ msgid "default GStreamer audio source" #~ msgstr "orixe de son de GStreamer predefinida" #~ msgid "default GStreamer audiosink" #~ msgstr "orixe do audiosink GStreamer predefinida" #~ msgid "default GStreamer video source" #~ msgstr "orixe do vídeo de GStreamer predefinido" #~ msgid "default GStreamer videosink" #~ msgstr "videosink de GStreamer predefinido" #~ msgid "default GStreamer visualization plugin" #~ msgstr "engadido de visualización GStreamer predefinido" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "" #~ "descrición para o audiosink GStreamer para a conferencia de audio/vídeo" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "descrición para o audiosink de GStreamer para Música e Filmes" #~ msgid "description for default GStreamer audiosink" #~ msgstr "descrición para o audiosink de GStreamer predefinido" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "descrición para o audiosrc de GStreamer predefinido" gst-plugins-good-0.10.31/po/insert-header.sin0000644000175000017500000000124011720560211015652 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } gst-plugins-good-0.10.31/po/tr.gmo0000644000175000017500000003461611720565343013566 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""# $ $$ $ $ $X$ B%O% _%l% |% %%%%%%%%&)&,&J&d& k&Fx&&.&!'&('+O'%{'1'o')C(`m(g(L6)!)E)2)*)=**g**** * * * **/v+)+"+E+69,&p,P,P,39-Hm-;-8-A+.-m.'.<.:/0;/;l/;/6/0#0'0>0T0n00F0000 1'1,1 21 <1I1M1]1 d1 o1y111111 11112 2 2"2$2+202 92 D2O2j2|222 222 22=253v3E4N4V4]4q444444 44445(5H5O5U5Z5a5q5)555 55(6)6H6h6l6 6666 66 6 66i6.Y7)7B778#28V8p8t8 }88 8F8889 *969G9b9s9v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-08 00:03+0200 Last-Translator: Server Acim Language-Team: Turkish Language: tr MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit %s %d İşlev%s İşlev'%s' tarafından '%s'3D Merkez3D Derinlik3D GenişlikBir ağ hatası meydana geldi, veya sunucu bağlantıyı beklenmeyen bir şekilde kesti.AUX 1 GirişAUX 1 ÇıkışAUX 2 GirişAUX 2 ÇıkışAUX GirişAUX ÇıkışSes çalma hatası.BasBass ArttırımSiyah KonnektörSiyah Ön Panel KonnektörMavi KonnektörMavi Ön Panel KonnektörVarsayılan HoparlörCDAygıt tanımlanamıyor '%s'.Saat olmadan çalışamazMerkezMerkez / LFEÇalışırken çözünürlüğü değiştirmek henüz desteklenmiyor.Sunucuya bağlanamıyorAygıtta '%s' arabellek kuyruğa sokulamıyor.Sunucuyla bağlantı kurulumayor.Ses sunucusuyla bağlantı kurulumayorDeğiştirgeler aygıttan '%s' alınamıyorAygıttan '%s' bellekler eşlenemiyorMikser denetimi için ses aygıtı açılamıyor.Mikser denetimi için ses aygıtı açılamıyor. Açık Ses Sisteminin bu sürümü, bu öğeyi desteklemiyor.Çalmak için ses aygıtı açılamıyor.Çalmak için ses aygıtı açılamıyor. Aygıt başka bir uygulama tarafından kullanılıyor.Çalma için ses aygıtı açılamıyor. Açık Ses Sistemi'nin bu sürümü, bu öğeyi desteklemiyor.Çalmak için ses aygıtı açılamıyor. Aygıtı açma izniniz bulunmuyor.Aygıtı kayıt için açamıyor.Kayıt için aygıtı açamıyor. Aygıtı açmak için yetkiniz yok.Şu aygıtı '%s' okuma ve yazma için açamıyor.Sunucu adı çözümlenemiyor.Aygıt '%s' bir yakalama aygıtı değil.Aygıt '%s' bir çıkış aygıtı değil.AyarlarSayısal GirişSayısal ÇıkışSayısal-1Sayısal-2Sayısal-3Miks EdilmişŞu aygıtın '%s' özelliklerini almada hata: O bir v4l2 sürücüsü değil. Onun bir v4l1 sürücüsü olup olmadığını denetleyin.%d bayt bilgili '%s' aygıtından okumada hata.%d baytı şu aygıtta '%s' okumada hata.Ses aygıtından kaydetmekte hata.Şu denemeden sonra %d başarılamadı. aygıt %s. sistem hatası: %sDenetim davranışları şu aygıtta '%s' bulunamadı.JPEG görüntüsünü çözümlenemediŞu aygıtta '%s' geçerli giriş elde edilemedi. O bir radyo aygıtı olabilir.Şu aygıtta '%s' geçerli giriş elde edilemedi. O bir radyo aygıtı olabilir.Aygıt için '%s' radyo frekansları ayarlanamadı.Radyo istasyonu ayarlarını bulma %d şu aygıtta '%s' başarılamadı.Aygıt için '%s' güçlü sinyal alımı gerçekleşemedi.Denetim değeri şuna %d bu aygıtta '%s' ayarlanamadı.Giriş davranışları sorgusu %d şu aygıtta %s başarılamadıŞu aygıtta '%s' sorgu normuna erişilemedi.Ses sunucusu olanakları sorgulanamadıAygıt için '%s' radyo frekansı %lu Hz için yapılamadı.Giriş değeri olarak bu %d şu aygıtta %s ayarlanamadı.Aygıt için '%s' norm değerleri ayarlanamadı.Çıkış değeri olarak %d şu aygıtta %s elde edilemedi.Değer %d denetim için %d şu aygıtta '%s' ayarlanamadı.Aygıttan device '%s' vidyo çerçeveleri alınamadı.HızlıÖnÖn Panel KulaklıklarÖn Panel Hat GirişiÖn Panel Hat ÇıkışıÖn Panel MikrofonuKazançBeklenmeyen bir çerçevece boyutu %u bunun yerine %u görüntülendi.Gri KonnektörGri Ön Panel KonnektörYeşil KonnektörYeşil Ön Panel KonnektörHDMIAhizeKulaklıkKulaklıklarTizKazanç-girişiGirişGiriş MixDahili CDİç veri akış hatası.İç veri akım hatası.Geçersiz atom boyutuJackKlavye BiplemesiLFEHat GirişiHat ÇıkışıHat-1Hat-2Hat-3Hat girişiGeridönümDMasterOrtaMikrofonMikrofon 1Mikrofon 2Mikrofon Seviye YükseltmeMikrofon KazancıMikrofon KaynağıKarıştırıcıModemHoparlörHoparlör KaynağıMono MixSustulurmuşHiç bir URL ayarlanmamış.Geçerli bir ses girişi bulunamadı. AVI akışı kesilecek.Desteklenen akış bulunamadı. Daha fazla aktarım protokolüne izin vermeniz veya doğru GStreamer RTSP uzantı eklentisine onay vermeniz gerekebilir.Desteklenen bir akış bulunamadı. Real Media akışları için bir GStreamer RTSP uzantı eklentisi kurmalısınız.HiçbiriKapalıAçıkPortakal KonnektörPortakal Ön Panel KonnektörDiğerKazanç-çıkışıÇıkış KazancıPCMPCM-2Fono-girişFono-çıkışPembe KonnektörPembe Ön Panel KonnektörÇalma PortlarıBu ses aygıtı çalmayı desteklemiyor.YapımRadyoArkaKayıtKayıt KazancıKayıt KaynağıBu ses aygıtı kaydetmeyi desteklemiyor.Kırmızı KonnektörKırmızı Ön Panel KonnektörSPDIF GirişiSPDIF ÇıkışGüvenli bağlantı ayarı yapılamadı.Sunucu aramayı desteklemiyor.Sunucu yetersiz veri gönderdi.YanStereo SimülasyonuHoparlörHoparlör KaynağıÇıkışı DağıtStereoStereo MixSurroundSurround SesiSynthisizerTelefonBu aygıtın sürücüsü '%s' bilinen görüntü yakalama yöntemlerinden herhangi birisi desteklemiyor.Bu dosyadaki vidyo doğru oynatılamıyabilir.Dosya çalınabilir akışlar içermiyor.Bu dosya çok fazla akış içeriyor. Sadece ilki oynatılıyor %dBu dosya bozuk ve oynatılamaz.Dosya eksik ve oynatılamaz.Bu dosya geçersiz ve oynatılamaz.Bu bir aygıt değil'%s'.TizÇok TizÇok KalınVidyoVidyo GirişiVidyo giriş aygıtı yeni çerçeve oranı ayarlarını kabul etmedi.Sanal Mikser KanallarıSanal Mikser GirişiSanal Mikser ÇıkışıSes GirişiBeyaz KonnektörBeyaz Ön Panel KonnektörSarı KonnektörSarı Ön Panel Konnektörgst-plugins-good-0.10.31/po/de.gmo0000644000175000017500000003675411720565342013535 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#% %*%>%G%P%V_% % % % % % %&#&(&9&"K&n&}&&&.&5&' #'E/'5u'9'9'>(;^(;(B()?)u)U*{*=f+y+E,*d,,!, ,,, , - --,-1-1-'.@D.<.&.c.aM/D/O/DD0J0E001=K1P1<112=I2R2A23$3*3F3d333;333 4 4>4C4 J4 U4`4 e4s4{4 4444445 5 5 5 )5 35 =5J5S5 [5g5n5 w5 55 555555555E6^677 7 77 77 7 888%858 E8R8p8;8 8888 8899 A9O9 n9 |909,9&9:: ':4:G:Z:a:r:{:::P:F:00;Pa;@;C;>7<v<< < << <Y<!=!<=!^= == ===v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-21 22:36+0100 Last-Translator: Christian Kirbach Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: German X-Poedit-Country: GERMANY Plural-Forms: nplurals=2; plural=(n != 1); %s %d Function%s-Funktion»%s« durch »%s«3D-Mitte3D-TiefeErweitertes 3DEin Netzwerkfehler ist aufgetreten, oder der Server schloss die Verbindung unerwartet.AUX-Eingang 1AUX-Ausgang 1AUX-Eingang 2AUX-Ausgang 2AUX-EingangAUX-AusgangFehler bei Audio-Wiedergabe.BassBassverstärkungSchwarzer SteckerSchwarzer Stecker am VordereingangBlauer SteckerBlauer Stecker am VordereingangEingebaute LautsprecherCDGerät »%s« kann nicht identifiziert werden.Es kann nicht ohne einen Taktgeber gearbeitet werden.MitteMitte / LFEEin Wechsel der Auflösung zur Laufzeit wird noch nicht unterstützt.Verbindung zum Server konnte nicht hergestellt werdenAuf Gerät »%s« konnten keine Puffer eingereiht werden.Es konnte keine Verbindung zum Server hergestellt werden.Es konnte keine Verbindung zum Audio-Server hergestellt werdenParameter konnten nicht von Gerät »%s« ausgelesen werdenDie Puffer des Gerätes »%s« konnten nicht geholt werden.Das Audio-Gerät konnte nicht für das Mischpult geöffnet werden.Das Audio-Gerät konnte nicht für das Mischpult geöffnet werden. Diese Version des Open Sound System (OSS) wird nicht unterstützt.Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Das Gerät wird von einer anderen Anwendung verwendet.Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Diese Version des Open Sound System (OSS) wird nicht von diesem Element unterstützt.Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Sie haben nicht die Berechtigungen zum Öffnen des Gerätes.Das Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. Das Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. Sie haben nicht die Berechtigungen zum Öffnen des Gerätes.Gerät »%s« konnte nicht zum Lesen oder Schreiben geöffnet werden.Servername konnte nicht aufgelöst werden.»%s« ist kein Aufnahmegerät.»%s« ist kein Wiedergabegerät.Zur DiagnoseDigital-EingangDigital-AusgangDigital-1Digital-2Digital-3HeruntermischenFehler beim Bestimmen der Fähigkeiten des Gerätes »%s«: Es ist kein »v4l2«-Treiber. Überprüfen Sie, ob es ein »v4l1«-Treiber ist.Fehler beim Lesen von %d Bytes von Gerät »%s«.Fehler beim Lesen von %d Bytes auf Gerät »%s«.Fehler beim Aufnehmen vom Audio-Gerät.%d Versuche sind fehlgeschlagen. Gerät »%s«. Systemfehler: %sAbfrage der Kontrollattribute auf Gerät »%s« schlug fehl.Dekodieren des JPEG-Bildes schlug fehlAuslesen der aktuellen Eingabe auf dem Gerät »%s« schlug fehl. Vielleicht ist es ein Funkgerät.Auslesen der aktuellen Ausgabe des Geräts »%s« schlug fehl. Vielleicht ist es ein Funkgerät.Auslesen der aktuellen Sendefrequenz des Geräts »%s« schlug fehl.Auslesen der Einstellungen der Senderwahl »%d« auf Gerät »%s« schlug fehl.Auslesen der aktuellen Signalstärke des Geräts »%s« schlug fehl.Auslesen des Wertes der Einstellung »%d« des Geräts »%s« schlug fehl.Abfrage der Attribute der Eingabe »%d« im Gerät »%s« schlug fehlAbfragen der Norm auf Gerät »%s« schlug fehl.Abfrage der Fähigkeiten des Audio-Servers ist fehlgeschlagenFestlegen der aktuellen Sendefrequenz des Geräts »%s« auf %lu Hz schlug fehl.Festlegen der Eingabe »%d« des Geräts »%s« schlug fehl.Festlegen der Norm auf Gerät »%s« schlug fehl.Festlegen der Ausgabe »%d« des Geräts »%s« schlug fehl.Festlegen des Wertes »%d« der Einstellung »%d« des Geräts »%s« schlug fehl.Der Versuch Videobilder von Gerät »%s« auszulesen schlug fehl.SchnellFrontKopfhörer am VordereingangLine-Eingang am VordereingangLine-Ausgang am VordereingangMikrofon am VordereingangPegelUnerwartete Frame-Größe von %u anstatt %u wurde erhalten.Grauer SteckerGrauer Stecker am VordereingangGrüner SteckerGrüner Stecker am VordereingangHDMIHörerKopfhörerKopfhörerHochEingangspegelEingangEingangs-MischpultInterne CDInterner Datenstromfehler.Interner Datenstromfehler.Ungültige Atom-Größe.SteckerTastatur-PiepsenLFELine-EingangLine-AusgangEingang-1Eingang-2Eingang-3Line-EingangSchleifeNiedrigHauptreglerMediumMikrofonMikrofon 1Mikrofon 2MikrofonverstärkungMikrofonpegelMikrofonquelleMischerModemMonitorÜberwachungsquelleMono-MischpultStummKeine Adresse festgelegt.Kein oder ungültiger Eingabeton, der AVI-Strom wird fehlerhaft sein.Es wurde kein unterstützter Strom gefunden. Sie müssen eventuell zusätzliche Transport-Protokolle erlauben oder es fehlt vielleicht das richtige Plugin zur RTSP-Erweiterung.Es wurde kein unterstützter Strom gefunden. Sie müssen vielleicht ein Plugin zur RTSP-Erweiterung von GStreamer für »Real«-Medienströme installieren.KeinDeaktiviertAktiviertOranger SteckerOranger Stecker am VordereingangAnderesAusgangspegelAusgangspegelPCMPCM 2MikrofoneingangMikrofonausgangRosa SteckerRosa Stecker am VordereingangWiedergabe-PortsWiedergabe wird von diesem Audio-Gerät nicht unterstützt.ProduktionRadioAufnahmeRückseiteAufnahmeAufnahmepegelAufnahmequelleAufnahme wird von diesem Audio-Gerät nicht unterstützt.Roter SteckerRoter Stecker am VordereingangSPDIF-EingangSPDIF-AusgangAufbau einer sichern Verbindung ist gescheitert.Suchlauf wird nicht vom Server unterstützt.Server gab unerwartete Daten zurück.SeiteStereo simulierenLautsprecherLautsprecherquelleAusgabe verstreuenStereoStereo-MischpultSurroundSurround-AudioSynthTelefonDer Treiber von Gerät »%s« unterstützt keine der bekannten Aufnahmemethoden.Das Video in dieser Datei wird vielleicht nicht korrekt wiedergegeben.Diese Datei enthält keine abspielbaren Ströme.Diese Datei enthält zu viele Ströme. Es werden nur die ersten %d wiedergegebenDiese Datei ist beschädigt und kann nicht wiedergegeben werden.Diese Datei ist unvollständig und kann nicht wiedergegeben werden.Diese Datei ist ungültig und kann nicht wiedergegeben werden.»%s« ist kein Gerät.HöhenSehr hochSehr niedrigVideoVideo-EingangVom Video-Eingabegerät wurde die Einstellung zur Bildwiederholungsrate nicht akzeptiert.Kanäle des virtuellen MischpultsEingang des virtuellen MischpultsAusgang des virtuellen MischpultsLautstärkeWeißer SteckerWeißer Stecker am VordereingangGelber SteckerGelber Stecker am Vordereinganggst-plugins-good-0.10.31/po/eu.gmo0000644000175000017500000003425211720565343013546 00000000000000\  ! - :D MX ak t~  :Y `4m).'&?7f)VHqW*iX3$!#F j u    a(&="d22G 6Q1.23$P)u@$#5)3_.)8Sc     (/6=ENRY ` k x6 r*/36Gdj s /  " .0< m{     D0a':*- *Ny 9 ! 6 = M i z  z" " " " """""#$# 8#Y#_#q#%##%###!#"$<$D$AT$'$3$3$2&%/Y%E%%5U&[&u&Y]'/'S'8;($t(&( ((( ( ( ))|%)8)8)$*=9*<w*%*Z*G5+J}+<+A,DG,1,9,P,4I-,~-G-A-5. >.!K.$m.$...4./$%/J/%[/// / ///// // 050:0M0Q0a0q0z00 00000 0 0 0001 -191 @1J1a1s1Nz11wN2 2222&2 3"353I3M3S3h3}3%3313 3 4 4 4'4=4+T44%4 4 444 445"5+5 @5N5b5 q5G{5G5= 6JI676:687@7Z7 `7 j7u7 |7O777878@8$P8u8$8 7?;j_f&sZ3h8z"]Lm{ruN< p4b1id%yIKc>RwSt:O#5a+[@Y6VEP,lUGCgF^eo* T9= `./0x'\(Bk2vq) W- DnQ|XM~$}AH!J%s Function'%s' by '%s'3D Center3D Depth3D EnhanceAUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good-0.10.18.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-03-25 12:37+0100 Last-Translator: Mikel Olasagasti Uranga Language-Team: Basque Language: eu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.11.4 Plural-Forms: nplurals=2; plural=(n != 1); %s funtzioa'%s' - '%s'3D zentrua3D sakonera3D hobetua1. sarrera lagungarria1. irteera lagungarria2. sarrera lagungarria2. irteera lagungarriaSarrera lagungarriaIrteera lagungarriaErrorea audioa erreproduzitzean.BaxuaBaxuaren bultzadaKonektore beltzaAurrealdeko paneleko konektore beltzaKonektore urdinaAurrealdeko paneleko konektore urdinaBarneko bozgorailuaCDaEzin da '%s' gailua identifikatu.Ezin du funtzionatu erlojurik gabeErdikoaZentratua / LFEOraindik ez dago onartua exekutatu bitartean bereizmena aldatzea.Ezin izan da konektatu zerbitzariarekinEzin izan dira bufferrak ilaran jarri '%s' gailuan.Ezin izan da konexioa ezarri soinu-zerbitzariarekinEzin izan dira '%s' gailuaren parametroak eskuratuEzin izan dira '%s' gailuaren bufferrak mapatu.Ezin izan da audioko gailua ireki nahastailearen kontrola kudeatzeko.Ezin izan da audioko gailua ireki nahastailearen kontrola kudeatzeko. Elementu honek ez du onartzen Open Sound System-en bertsio hau.Ezin izan da audioaren gailua ireki erreproduzitzeko.Ezin izan da audioaren gailua ireki erreproduzitzeko. Beste aplikazio batek darabil gailua.Ezin izan da audioaren gailua ireki erreproduzitzeko. Elementu honek ez du onartzen Open Sound System-en bertsio hau.Ezin izan da audioaren gailua ireki erreproduzitzeko. Ez duzu baimenik gailua irekitzeko.Ezin izan da audioaren gailua ireki grabatzeko.Ezin izan da audioaren gailua ireki grabatzeko. Ez duzu baimenik gailua irekitzeko.Ezin izan da '%s' gailua ireki irakurtzeko eta idazteko.'%s' gailua ez da kaptura-gailu bat.'%s' gailua ez da irteerako gailu bat.DiagnostikoaSarrera digitalaIrteera digitala1. digitala2. digitala3. digitalaTolestu nahasketaErrorea gertatu da '%s' gailuaren ahalmena eskuratzean: Ez da v4l2 kontrolatzaile bat. Begiratu v4l1 kontrolatzaile bat den.Errorea gertatu da '%2$s' gailuan %1$d byte irakurtzean.Errorea gertatu da '%2$s' gailuan %1$d byte irakurtzean.Errorea audioko gailutik grabatzean.Huts egin du %d saio eta gero. %s gailua. Sistema-errorea: %sHuts egin dut '%s' gailuaren kontrol-atributuak eskuratzean.Huts egin du JPEG irudia deskodetzeanHuts egin du '%s' gailuko uneko sarrera eskuratzean. Litekeena da irrati-gailu bat izatea.Huts egin du '%s' gailuaren uneko sintonizazio-frekuentzia eskuratzean.Huts egin du '%2$s' gailuko %1$d. sintonizadorearen ezarpenak eskuratzean.Huts egin du '%s' gailuaren seinalearen indarra eskuratzean.Huts egin du '%2$s' gailuko %1$d. kontrolaren balioa eskuratzean.Huts egin du %2$s gailuko %1$d. sarreraren atributuak kontsultatzeanHuts egin du '%s' gailuaren araua kontsultatzean.Huts egin du soinu-zerbitzariaren ahalmena kontsultatzeanHuts egin du '%s' gailuaren uneko sintonizazio-frekuentzia %lu Hz-tan ezartzean.Huts egin du '%2$s' gailuko %1$d. sarrera ezartzean.Huts egin du '%s' gailuaren araua ezartzean.Huts egin du '%3$s' gailuko %2$d. kontrolaren %1$d. balioa eskuratzean.Huts egin du '%s' gailutik bideo-fotogramak eskuratzen saiatzean.BizkorraAurrealdekoaAurrealdeko paneleko aurikularrakAurrealdeko paneleko sarrerako lineaAurrealdeko paneleko irteerako lineaAurrealdeko paneleko mikrofonoaIrabaziaUstekabeko fotograma-tamaina jaso da (%u), %u ordez.Konektore grisaAurrealdeko paneleko konektore grisaKonektore berdeaAurrealdeko paneleko konektore berdeaHDMIAurikular+mikrofonoaEntzungailuaAurikularrakAltuaSarrerako irabaziaSarreraSarrerako nahasketaBarneko CDaDatu-fluxuaren barne-errorea.Datu-korrontearen barne-errorea.JackTeklatuaren soinuaLFESarrerako lineaIrteerako linea1. linea2. linea3. lineaLinea-sarreraAtzera-begiztaMotelaMaisuaTartekoaMikrofonoa1. mikrofonoa2. mikrofonoaMikrofonoaren bultzadaMikrofonoaren irabaziaMikrofonoaren iturburuaNahastaileaModemaMonitoreaMonitorearen iturburuaMonozko nahasketaMututuEz dago audio-sarrerarik, edo baliogabea da. AVI korrontea hondatua egongo da.Ez da onartutako korronterik aurkitu. Garraioko protokolo gehiago baimentzea behar da edo GStreamer RTSP hedapen egokia falta zaizu.Ez da onartutako korronterik aurkitu. GStreamer RTSP hedapena instalatu beharko duzu Real multimediako korronteentzako.Bat ere ezItzaliPiztuKonektore laranjaAurrealdeko paneleko konektore laranjaBestelakoaIrteerako irabaziaIrteeraren irabaziaPCMPCM-2Aurikularren sarreraAurikularren irteeraKonektore arrosaAurrealdeko paneleko konektore arrosaErreprodukzioaren atakakAudio gailu honek ez du erreproduzitzea onartzen.EkoizpenaIrratiaAtzealdekoaGrabazioaGrabazioaren irabaziaGrabazioaren iturburuaAudio gailu honek ez du grabatzea onartzen.Konektore gorriaAurrealdeko paneleko konektore gorriaSPDIF sarreraSPDIF irteeraAlbokoaSimulatu estereoaBozgorailuaBozgorailuaren iturburuaZabaldu irteeraEstereoaEstereozko nahasketaInguratzaileaSoinu inguratzaileaSintetizadoreaTelefonoa'%s' gailuaren kontrolatzaileak ez du onartzen kaptura-metodo ezagunik.Litekeena da fitxategi honetako bideoa ez behar bezala erreproduzitzea.Fitxategi horretan ez dago erreproduzi daitekeen korronterik.Fitxategi horrek korronte gehiegi ditu. Erreproduzitu soilik lehen %d(r)akFitxategi hau hondatua dago, eta ezin da erreproduzitu.Fitxategi hau osatu gabea dago, eta ezin da erreproduzitu.Fitxategi hau ez da baliozkoa eta ezin da erreproduzitu.Hau ez da '%s' gailu bat.AltuaOso altuaOso motelaBideoaBideo-sarreraBideoaren sarrerako gailuak ez du fotograma-tamainaren ezarpen berria onartzen.Nahastaile birtualaren kanalakNahastaile birtualaren sarreraNahastaile birtualaren irteeraBolumenaKonektore zuriaAurrealdeko paneleko konektore zuriaKonektore horiaAurrealdeko paneleko konektore horiagst-plugins-good-0.10.31/po/az.gmo0000644000175000017500000000301011720565342013532 00000000000000%`af i s } 6  "(/7=DJQ    &.6 >KT[>c    BassCDDigital-1Digital-2Digital-3In-gainLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSpeakerSynthTrebleVideoVolumeProject-Id-Version: gst-plugins-0.8.0 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2004-03-19 18:29+0200 Last-Translator: Metin Amiroff Language-Team: Azerbaijani Language: az MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.0.2 BasCDDijital-1Dijital-2Dijital-3Giriş-gainXətd-1Xətd-2Xətd-3Xətd-girişMikrofonMikserMonitorSəhv ya da olmayan audio girişi, AVI yayımı pozulacaqdır.Çıxış-gainPCMPCM-2Telefon-girişiTelefon-çıxışıRadioQeydSpikerSintİncəVideoSəsgst-plugins-good-0.10.31/po/stamp-po0000644000175000017500000000001211720561331014070 00000000000000timestamp gst-plugins-good-0.10.31/po/sr.gmo0000644000175000017500000004622311720565343013562 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""9#I%`%t%%%%}%N&`&t&&&&8&&&'<2'o'>'''<'-.(\(k(t(<(Y7)G)Q)Q+*^}*v*S+VB,,6-.V..^/8/@.0;o000001(1=1W1ZA2Z2P2jH3i3A4_44vy5n5a_6q6_37T7X7A8M8P9Oc9t9a(:: :,:3:5;*7;b;Rs;;<;<@?<<<<< <<<< =?"=:b=1====>>9>H>W>f>> > > >>>>#>#?@? ^? i?t????'?p?<Z@A B BB'BHB C$CDCbCiCrCC#CFCDb9DD D DDDDbEsE@EEEEE>DF7FFFFFG (G5GKG\GvGGGc'HKHcHW;IYI[I&IJpJJJ JJsJ.BK*qK,KKK<K:L<VLv` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good-0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-12-04 16:44+0200 Last-Translator: Мирослав Николић Language-Team: Serbian Language: sr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); X-Generator: Virtaal 0.7.0 X-Project-Style: gnome %s %d функција%s функција„%s“ изводи „%s“3Д средиште3Д дубина3Д побољшањеДошло је до грешке на мрежи, или је сервер неочекивано затворио везу.АУХ 1 улазАУХ 1 излазАУХ 2 улазАУХ 2 излазАУХ улазАУХ излазГрешка приликом пуштања звука.БасПојачање басаЦрни прикључакЦрни прикључак на предњој површиПлави прикључакПлави прикључак на предњој површиУграђени звучникЦДНе могу да распознам уређај „%s“.Не могу да радим без сатаСредињиСредиште / ЛФЕПромена резолуције приликом извршавања још увек није подржана.Не могу да се повежем са серверомНе могу да додам помоћне меморије у уређају „%s“.Не могу да успоставим везу са сервером.Не могу да успоставим везу са сервером звукаНе могу да добавим параметре на уређају „%s“Не могу да мапирам помоћне меморије са уређаја „%s“Не могу да покренем звучни уређај за руковање управљањем мешача.Не могу да покренем звучни уређај за руковање управљањем мешача. Ово издање система отвореног звука није подржано овим елементом.Не могу да покренем звучни уређај ради пуштања.Не могу да покренем звучни уређај ради пуштања. Уређај користи нека друга апликација.Не могу да покренем звучни уређај ради пуштања. Ово издање система отвореног звука није подржано овим елементом.Не могу да покренем аудио уређај ради пуштања. Немате овлашћење за покретање уређаја.Не могу да покренем звучни уређај ради снимања.Не могу да покренем аудио уређај ради снимања. Немате овлашћење за покретање уређаја.Не могу да покренем уређај „%s“ ради читања и уписа.Не могу да решим назив сервера.Уређај „%s“ није уређај за снимање.Уређај „%s“ није излазни уређај.ДијагностикаДигитални улазДигитални излазДигитални 1Дигитални 2Дигитални 3Сабирни мешачГрешка приликом добављања могућности за уређај „%s“: Није в4л2 управљачки програм. Проверите да ли је то в4л1 управљачки програм.Грешка приликом читања %d бајтова са уређаја „%s“.Грешка приликом читања %d бајтова на уређају „%s“.Грешка приликом снимања са звучног уређаја.Нисам успео након %d покушаја. уређај %s. системска грешка: %sНисам успео да добавим својства контрола на уређају „%s“.Нисам успео да декодирам ЈПЕГ сликуНисам успео да добавим текући улаз на уређају „%s“. Можда је то радио уређај.Нисам успео да добавим текући излаз на уређају „%s“. Можда је то радио уређај.Нисам успео да добавим текућу учестаност тјунера за уређај „%s“.Нисам успео да добавим подешавања тјунера %d на уређају „%s“.Нисам успео да добавим јачину сигнала за уређај „%s“.Нисам успео да добавим вредност за контролу %d на уређају „%s“.Нисам успео да пропитам својства уноса %d у уређају %sНисам успео да пропитам норму на уређају „%s“.Нисам успео да испитам могућности сервера звукаНисам успео да подесим текућу учестаност тјунера за уређај „%s“ на %lu Hz.Нисам успео да подесим улаз %d на уређају %s.Нисам успео да подесим норму за уређај „%s“.Нисам успео да подесим излаз %d на уређају %s.Нисам успео да подесим вредност %d за контролу %d на уређају „%s“.Нисам успео да добавим видео кадрове са уређаја „%s“.БрзоПредњиСлушалице предње површиЛинијски улаз предње површиЛинијски излаз предње површиМикрофон предње површиПојачањеДобих неочекивану величину кадра, %u уместо %u.Сиви прикључакСиви прикључак на предњој површиЗелени прикључакЗелени прикључак на предњој површиХДМИСлушалицаСлушалицеСлушалицеВисокУлазно појачањеУлазУлазни миксУнутрашњи ЦДУнутрaшња грешка протока података.Унутрашња грешка тока података.Неисправна величина атома.УтичницаЗвук тастатуреЛФЕЛинијски улазЛинијски излазЛинија 1Линија 2Линија 3Линијски улазПовратна петљаНизакГлавниСредњиМикрофонМикрофон 1Микрофон 2Појачање микрофонаПојачање микрофонаИзвор микрофонаМешачМодемПраћењеИзвор праћењаМоно миксБез звукаНије подешена адреса.Улазног звука нема или је неисправан, АВИ ток ће бити оштећен.Није пронађен ниједан подржани ток. Можда ћете морати да омогућите више протокола преноса или можда на неки други начин недостаје прави прикључак РТСП проширења ГСтримера.Није пронађен ниједан подржани ток. Можда ћете морати да инсталирате прикључак РТСП проширења Гстримера за токове Стварног медија.НиштаИскљ.Укљ.Наранџасти прикључакНаранџасти прикључак на предњој површиОсталоИзлазно појачањеПојачање излазаПЦМПЦМ-2Телефонски улазТелефонски излазРужичаст прикључакРужичасти прикључак на предњој површиПортови пуштањаПуштање није подржано од стране овог звучног уређаја.ПроизводниРадиоЗадњиСнимањеПојачање снимањаИзвор снимањаСнимање није подржано од стране овог звучног уређаја.Црвени прикључакЦрвени прикључак на предњој површиСПДИФ улазСПДИФ излазПодешавање безбедне везе није успело.Сервер не подржава позиционирање.Сервер је послао лоше податке.Са странеЛажни стереоЗвучникИзвор звучникаИзлаз ширењаСтереоСтерео миксОкружењеЗвук окружењаСинтисајзерТелефонУправљачки програм уређаја „%s“ не подржава ниједан познати начин снимања.Видео у овој датотеци можда неће бити пуштен исправно.Ова датотека не садржи токове за пуштање.Ова датотека садржи превише токова. Пуштам само први %dОва датотека је оштећена и не може бити пуштена.Ова датотека је непотпуна и не може бити пуштена.Ова датотека је неисправна и не може бити пуштена.Ово није уређај „%s“.ВисокотонацВрло високВрло низакВидеоВидео улазУлазни видео уређај не прихвата нове поставке протока кадрова.Канали виртуелног мешачаУлаз виртуелног мешачаИзлаз виртуелног мешачаЈачина звукаБели прикључакБели прикључак на предњој површиЖути прикључакЖути прикључак на предњој површиgst-plugins-good-0.10.31/po/sr.po0000644000175000017500000005536711720565342013426 00000000000000# Serbian translation of gst-plugins # Copyright (C) 2004 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # Danilo Segan , 2004. # Мирослав Николић , 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-12-04 16:44+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Virtaal 0.7.0\n" "X-Project-Style: gnome\n" msgid "Could not establish connection to sound server" msgstr "Не могу да успоставим везу са сервером звука" msgid "Failed to query sound server capabilities" msgstr "Нисам успео да испитам могућности сервера звука" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "„%s“ изводи „%s“" msgid "Internal data stream error." msgstr "Унутрашња грешка тока података." msgid "Failed to decode JPEG image" msgstr "Нисам успео да декодирам ЈПЕГ слику" msgid "Could not connect to server" msgstr "Не могу да се повежем са сервером" msgid "Server does not support seeking." msgstr "Сервер не подржава позиционирање." msgid "Could not resolve server name." msgstr "Не могу да решим назив сервера." msgid "Could not establish connection to server." msgstr "Не могу да успоставим везу са сервером." msgid "Secure connection setup failed." msgstr "Подешавање безбедне везе није успело." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Дошло је до грешке на мрежи, или је сервер неочекивано затворио везу." msgid "Server sent bad data." msgstr "Сервер је послао лоше податке." msgid "No URL set." msgstr "Није подешена адреса." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Улазног звука нема или је неисправан, АВИ ток ће бити оштећен." msgid "This file contains no playable streams." msgstr "Ова датотека не садржи токове за пуштање." msgid "This file is invalid and cannot be played." msgstr "Ова датотека је неисправна и не може бити пуштена." msgid "This file is corrupt and cannot be played." msgstr "Ова датотека је оштећена и не може бити пуштена." msgid "Invalid atom size." msgstr "Неисправна величина атома." msgid "This file is incomplete and cannot be played." msgstr "Ова датотека је непотпуна и не може бити пуштена." msgid "The video in this file might not play correctly." msgstr "Видео у овој датотеци можда неће бити пуштен исправно." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Ова датотека садржи превише токова. Пуштам само први %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Није пронађен ниједан подржани ток. Можда ћете морати да инсталирате " "прикључак РТСП проширења Гстримера за токове Стварног медија." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Није пронађен ниједан подржани ток. Можда ћете морати да омогућите више " "протокола преноса или можда на неки други начин недостаје прави прикључак " "РТСП проширења ГСтримера." msgid "Internal data flow error." msgstr "Унутрaшња грешка протока података." msgid "Volume" msgstr "Јачина звука" msgid "Bass" msgstr "Бас" msgid "Treble" msgstr "Високотонац" msgid "Synth" msgstr "Синтисајзер" msgid "PCM" msgstr "ПЦМ" msgid "Speaker" msgstr "Звучник" msgid "Line-in" msgstr "Линијски улаз" msgid "Microphone" msgstr "Микрофон" msgid "CD" msgstr "ЦД" msgid "Mixer" msgstr "Мешач" msgid "PCM-2" msgstr "ПЦМ-2" msgid "Record" msgstr "Снимање" msgid "In-gain" msgstr "Улазно појачање" msgid "Out-gain" msgstr "Излазно појачање" msgid "Line-1" msgstr "Линија 1" msgid "Line-2" msgstr "Линија 2" msgid "Line-3" msgstr "Линија 3" msgid "Digital-1" msgstr "Дигитални 1" msgid "Digital-2" msgstr "Дигитални 2" msgid "Digital-3" msgstr "Дигитални 3" msgid "Phone-in" msgstr "Телефонски улаз" msgid "Phone-out" msgstr "Телефонски излаз" msgid "Video" msgstr "Видео" msgid "Radio" msgstr "Радио" msgid "Monitor" msgstr "Праћење" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Не могу да покренем звучни уређај ради пуштања. Уређај користи нека друга " "апликација." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Не могу да покренем аудио уређај ради пуштања. Немате овлашћење за покретање " "уређаја." msgid "Could not open audio device for playback." msgstr "Не могу да покренем звучни уређај ради пуштања." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Не могу да покренем аудио уређај ради снимања. Немате овлашћење за покретање " "уређаја." msgid "Could not open audio device for recording." msgstr "Не могу да покренем звучни уређај ради снимања." msgid "Could not open audio device for mixer control handling." msgstr "Не могу да покренем звучни уређај за руковање управљањем мешача." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Не могу да покренем звучни уређај за руковање управљањем мешача. Ово издање " "система отвореног звука није подржано овим елементом." msgid "Master" msgstr "Главни" msgid "Front" msgstr "Предњи" msgid "Rear" msgstr "Задњи" msgid "Headphones" msgstr "Слушалице" msgid "Center" msgstr "Средињи" msgid "LFE" msgstr "ЛФЕ" msgid "Surround" msgstr "Окружење" msgid "Side" msgstr "Са стране" msgid "Built-in Speaker" msgstr "Уграђени звучник" msgid "AUX 1 Out" msgstr "АУХ 1 излаз" msgid "AUX 2 Out" msgstr "АУХ 2 излаз" msgid "AUX Out" msgstr "АУХ излаз" msgid "3D Depth" msgstr "3Д дубина" msgid "3D Center" msgstr "3Д средиште" msgid "3D Enhance" msgstr "3Д побољшање" msgid "Telephone" msgstr "Телефон" msgid "Line Out" msgstr "Линијски излаз" msgid "Line In" msgstr "Линијски улаз" msgid "Internal CD" msgstr "Унутрашњи ЦД" msgid "Video In" msgstr "Видео улаз" msgid "AUX 1 In" msgstr "АУХ 1 улаз" msgid "AUX 2 In" msgstr "АУХ 2 улаз" msgid "AUX In" msgstr "АУХ улаз" msgid "Record Gain" msgstr "Појачање снимања" msgid "Output Gain" msgstr "Појачање излаза" msgid "Microphone Boost" msgstr "Појачање микрофона" msgid "Loopback" msgstr "Повратна петља" msgid "Diagnostic" msgstr "Дијагностика" msgid "Bass Boost" msgstr "Појачање баса" msgid "Playback Ports" msgstr "Портови пуштања" msgid "Input" msgstr "Улаз" msgid "Record Source" msgstr "Извор снимања" msgid "Monitor Source" msgstr "Извор праћења" msgid "Keyboard Beep" msgstr "Звук тастатуре" msgid "Simulate Stereo" msgstr "Лажни стерео" msgid "Stereo" msgstr "Стерео" msgid "Surround Sound" msgstr "Звук окружења" msgid "Microphone Gain" msgstr "Појачање микрофона" msgid "Speaker Source" msgstr "Извор звучника" msgid "Microphone Source" msgstr "Извор микрофона" msgid "Jack" msgstr "Утичница" msgid "Center / LFE" msgstr "Средиште / ЛФЕ" msgid "Stereo Mix" msgstr "Стерео микс" msgid "Mono Mix" msgstr "Моно микс" msgid "Input Mix" msgstr "Улазни микс" msgid "SPDIF In" msgstr "СПДИФ улаз" msgid "SPDIF Out" msgstr "СПДИФ излаз" msgid "Microphone 1" msgstr "Микрофон 1" msgid "Microphone 2" msgstr "Микрофон 2" msgid "Digital Out" msgstr "Дигитални излаз" msgid "Digital In" msgstr "Дигитални улаз" msgid "HDMI" msgstr "ХДМИ" msgid "Modem" msgstr "Модем" msgid "Handset" msgstr "Слушалица" msgid "Other" msgstr "Остало" msgid "None" msgstr "Ништа" msgid "On" msgstr "Укљ." msgid "Off" msgstr "Искљ." msgid "Mute" msgstr "Без звука" msgid "Fast" msgstr "Брзо" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Врло низак" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Низак" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Средњи" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Висок" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Врло висок" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Производни" msgid "Front Panel Microphone" msgstr "Микрофон предње површи" msgid "Front Panel Line In" msgstr "Линијски улаз предње површи" msgid "Front Panel Headphones" msgstr "Слушалице предње површи" msgid "Front Panel Line Out" msgstr "Линијски излаз предње површи" msgid "Green Connector" msgstr "Зелени прикључак" msgid "Pink Connector" msgstr "Ружичаст прикључак" msgid "Blue Connector" msgstr "Плави прикључак" msgid "White Connector" msgstr "Бели прикључак" msgid "Black Connector" msgstr "Црни прикључак" msgid "Gray Connector" msgstr "Сиви прикључак" msgid "Orange Connector" msgstr "Наранџасти прикључак" msgid "Red Connector" msgstr "Црвени прикључак" msgid "Yellow Connector" msgstr "Жути прикључак" msgid "Green Front Panel Connector" msgstr "Зелени прикључак на предњој површи" msgid "Pink Front Panel Connector" msgstr "Ружичасти прикључак на предњој површи" msgid "Blue Front Panel Connector" msgstr "Плави прикључак на предњој површи" msgid "White Front Panel Connector" msgstr "Бели прикључак на предњој површи" msgid "Black Front Panel Connector" msgstr "Црни прикључак на предњој површи" msgid "Gray Front Panel Connector" msgstr "Сиви прикључак на предњој површи" msgid "Orange Front Panel Connector" msgstr "Наранџасти прикључак на предњој површи" msgid "Red Front Panel Connector" msgstr "Црвени прикључак на предњој површи" msgid "Yellow Front Panel Connector" msgstr "Жути прикључак на предњој површи" msgid "Spread Output" msgstr "Излаз ширења" msgid "Downmix" msgstr "Сабирни мешач" msgid "Virtual Mixer Input" msgstr "Улаз виртуелног мешача" msgid "Virtual Mixer Output" msgstr "Излаз виртуелног мешача" msgid "Virtual Mixer Channels" msgstr "Канали виртуелног мешача" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d функција" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s функција" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Не могу да покренем звучни уређај ради пуштања. Ово издање система отвореног " "звука није подржано овим елементом." msgid "Playback is not supported by this audio device." msgstr "Пуштање није подржано од стране овог звучног уређаја." msgid "Audio playback error." msgstr "Грешка приликом пуштања звука." msgid "Recording is not supported by this audio device." msgstr "Снимање није подржано од стране овог звучног уређаја." msgid "Error recording from audio device." msgstr "Грешка приликом снимања са звучног уређаја." msgid "Gain" msgstr "Појачање" msgid "Headphone" msgstr "Слушалице" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Грешка приликом читања %d бајтова са уређаја „%s“." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Добих неочекивану величину кадра, %u уместо %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Грешка приликом читања %d бајтова на уређају „%s“." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Грешка приликом добављања могућности за уређај „%s“: Није в4л2 управљачки " "програм. Проверите да ли је то в4л1 управљачки програм." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Нисам успео да пропитам својства уноса %d у уређају %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Нисам успео да добавим подешавања тјунера %d на уређају „%s“." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Нисам успео да пропитам норму на уређају „%s“." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Нисам успео да добавим својства контрола на уређају „%s“." #, c-format msgid "Cannot identify device '%s'." msgstr "Не могу да распознам уређај „%s“." #, c-format msgid "This isn't a device '%s'." msgstr "Ово није уређај „%s“." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Не могу да покренем уређај „%s“ ради читања и уписа." #, c-format msgid "Device '%s' is not a capture device." msgstr "Уређај „%s“ није уређај за снимање." #, c-format msgid "Device '%s' is not a output device." msgstr "Уређај „%s“ није излазни уређај." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Нисам успео да подесим норму за уређај „%s“." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Нисам успео да добавим текућу учестаност тјунера за уређај „%s“." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Нисам успео да подесим текућу учестаност тјунера за уређај „%s“ на %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Нисам успео да добавим јачину сигнала за уређај „%s“." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Нисам успео да добавим вредност за контролу %d на уређају „%s“." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Нисам успео да подесим вредност %d за контролу %d на уређају „%s“." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Нисам успео да добавим текући улаз на уређају „%s“. Можда је то радио уређај." #, c-format msgid "Failed to set input %d on device %s." msgstr "Нисам успео да подесим улаз %d на уређају %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Нисам успео да добавим текући излаз на уређају „%s“. Можда је то радио " "уређај." #, c-format msgid "Failed to set output %d on device %s." msgstr "Нисам успео да подесим излаз %d на уређају %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Не могу да додам помоћне меморије у уређају „%s“." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Нисам успео да добавим видео кадрове са уређаја „%s“." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Нисам успео након %d покушаја. уређај %s. системска грешка: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Не могу да добавим параметре на уређају „%s“" msgid "Video input device did not accept new frame rate setting." msgstr "Улазни видео уређај не прихвата нове поставке протока кадрова." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Не могу да мапирам помоћне меморије са уређаја „%s“" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Управљачки програм уређаја „%s“ не подржава ниједан познати начин снимања." msgid "Changing resolution at runtime is not yet supported." msgstr "Промена резолуције приликом извршавања још увек није подржана." msgid "Cannot operate without a clock" msgstr "Не могу да радим без сата" #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "Не могу да отворим датотеку „%s“ ради уписа." #~ msgid "Error closing file \"%s\"." #~ msgstr "Грешка при затварању датотеке „%s“." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "Не могу да отворим датотеку „%s“ ради читања." #~ msgid "No filename specified." #~ msgstr "Име датотеке није задато." #~ msgid "Could not write to file \"%s\"." #~ msgstr "Не могу да пишем у датотеку „%s“." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "Не могу да отворим управљачки уређај „%s“ ради уписа." #~ msgid "Could not configure audio device \"%s\"." #~ msgstr "Не могу да подесим звучни уређај „%s“." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "Не могу да поставим звучни уређај „%s“ на %d Hz." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "Не могу да отворим видео уређај „%s“ ради уписа." #~ msgid "Could not close video device \"%s\"." #~ msgstr "Не могу да затворим видео уређај „%s“." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "OSS уређај „%s“ већ користи неки програм." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "Не могу да приступим уређају „%s“, проверите његова овлашћења." #~ msgid "Device \"%s\" does not exist." #~ msgstr "Не постоји уређај „%s“." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "Не могу да отворим уређај „%s“ ради уписа." #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "Не могу да отворим уређај „%s“ ради читања." # Виртуелни Систем Датотека #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "Не могу да отворим ВСД датотеку „%s“ ради читања." #, fuzzy #~ msgid "No filename given." #~ msgstr "Име датотеке није задато." #, fuzzy #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "Не могу да отворим ВСД датотеку „%s“ ради уписа." #, fuzzy #~ msgid "No filename given" #~ msgstr "Име датотеке није задато." #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "Не могу да затворим ВСД датотеку „%s“." #~ msgid "No device specified." #~ msgstr "Уређај није наведен." #~ msgid "Device is not open." #~ msgstr "Уређај није отворен." #~ msgid "Device is open." #~ msgstr "Уређај је отворен." gst-plugins-good-0.10.31/po/mt.gmo0000644000175000017500000002021211720565343013544 00000000000000[ #40e).'& 7) a ) V qb * 3 $3 X b l av " 2 2. a G} 6 1 .. 2] 3 $ ) @$T#y53 . FQV^d~ 6"&, 5/? oz0D0'M:u*-* 4NU9[h% , )*+T.,A C15   % /j9-E3%LZrE<8P=C' ;3To0)B4b=  $ELSZbf mw}E 7 0;AF;MH9/'?W+)' ) 0 M6  -:JSR9/#M;GKFO30 *NA1) <YH[B%> 'I, (+ V!EX C8W=TU@PQ4&D$."?6ZL572Audio playback error.BassCDCannot identify device '%s'.Cannot operate without a clockCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for recording.Could not open device '%s' for reading and writing.Device '%s' is not a capture device.Digital-1Digital-2Digital-3Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontGainGot unexpected frame size of %u instead of %u.HeadphonesHighIn-gainInputInternal data flow error.Internal data stream error.Line-1Line-2Line-3Line-inLowMediumMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.OffOnOut-gainPCMPCM-2Phone-inPhone-outPlayback is not supported by this audio device.ProductionRadioRearRecordRecording is not supported by this audio device.SideSpeakerStereoSynthThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVideoVideo input device did not accept new frame rate setting.VolumeProject-Id-Version: gst-plugins-good-0.10.10.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2008-10-26 19:09+0100 Last-Translator: Michel Bugeja Language-Team: Maltese Language: mt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Maltese X-Poedit-Country: MALTA Żball fiid-daqq tal-awdjo.BassCDDevice '%s' mhux identifikat.Ma nistax nħaddem mingħajr arloġġCenter / LFEMa tistax tibdel ir-resolution waqt runtime.Mhux possibli naqbad mas-serverCould not enqueue buffers in device '%s'.Kuntatt mas-sound server ma ġiex stabbilitMhux possibli nġib parametri tal-apparat '%s'Ma nistax nqabbel buffers mill-apparat '%s'.Ma nistax niftaħ apparat tal-awdjo għal mixer control handling.Ma nistax niftaħ apparat tal-awdjo għal mixer control handling. Din il-verzjoni ta' Open Sound System mhux issapportjata minn din l-element.Audio device ma jistax jintuża.Audio device ma jistax jintuża. Qed jintuża minn programm ieħor.Ma nistax niftaħ apparat tal-awdjo biex indoqq. Dil il-verżjoni ta' Open Sound System mhux issapportjatha minn dan l-element.Audio device ma jistax jintuża biex tirrekordja.Device '%s' ma nistax niftaħu biex naqra jew nikteb.Device '%s' mhux capture device.Digital-1Digital-2Digital-3Problema biex nġib il-kapaċitajiet tal-apparat '%s': Mhux v4l2 driver. Iċċekkja jekk hux v4l1 driver. Żball fl-irrekordjar mill-apparat tal-awdjo.Problema wara li pruvajt %d drabi. apparat %s. żball fis-sistema: %sL-attributi ta' kontroll ta' device '%s' ma nqrawx.Problem fid-decoding tal-istampa JPEGProblema biex inġib current input fuq apparat '%s'. Jista jkun li huwa apparat tar-radju.Problema biex inġib il-frekwenza li jitrażmetti fuqha apparat '%s'.Problema biex inġib settings tat-tuner %d fuq l-appart '%s'Problema biex inġib signal strength fuq l-apparat '%s'.Problema biex inġib valur ta' control %d fuq l-apparat '%s'.Mhux possibli tfittxja għal attributi ta' input %d ġol-apparat %sMa stajx nfittex norm fuq apparat '%s'.Mhux possibli t-tfittxija għall-kapaċita tas-sound serverProblema biex nissettja l-frekwenza li jitrażmetti fuqha apparat '%s' għal %lu Hz.Problema biex nissettja input %d fuq apparat %s.Ma stajtx nissetja norm fuq apparat '%s'.Problema biex nissetja valur %d lil control %d fuq l-apparat '%s'.Problema biex inġib video frames mill-apparat '%s'.FastQuddiemGainIrċivejt frame size ta' %u minflok kif kien mistenni ta' %u.HeadphonesHighIn-gainInputProblema interna ta' data flowProblema interna fid-data streamLine-1Line-2Line-3Line-inLowMediumMikrofonuMixerMonitorInput audio ma nstabx jew mhux validu. AVI stream jista jkun korrott.OffOnOut-gainPCMPCM-2Phone-inPhone-outId-daqq mhux issappartjat minn dan l-apparat tal-awdjo.ProductionRadjuWaraRecordIrrekordjar mhux issapportjat minn dan l-apparat tal-awdjo.ĠenbSpeakerStereoSynthId-driver tal-apparat '%s' ma jissapportja l-ebda capture method mifhum.Jista jkun illi l-vidjo ġo dan il-fajl ma jidhirx sewwa.Il-fajl ma fiħ l-ebda stream li tista tindaqq.Il-fajl fiħ aktar streams milli suppost. Ser indoqq l-ewwel %dIl-fajl huwa korrott u ma jistax jinfetaħ.Il-fajl mhux komplut u ma jistax jindaqq,Il-fajl mhux validu u ma jistax jindaqqDan mhux device %s.TrebleVidjoApparat li jaqra video input ma aċċettax is-settings ġodda tal-frame rate.Volumgst-plugins-good-0.10.31/po/eo.po0000644000175000017500000002472011720565342013372 00000000000000# Esperanto translation for gst-plugins-good. # Copyright (C) 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # Kristjan SCHMIDT , 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-06-04 21:48+0100\n" "Last-Translator: Kristjan SCHMIDT \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' de '%s'" msgid "Internal data stream error." msgstr "Interna datumflu-eraro." msgid "Failed to decode JPEG image" msgstr "" msgid "Could not connect to server" msgstr "Ne eblis konekti al servilo" msgid "Server does not support seeking." msgstr "" msgid "Could not resolve server name." msgstr "" msgid "Could not establish connection to server." msgstr "" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "Laŭteco" msgid "Bass" msgstr "Baso" msgid "Treble" msgstr "" msgid "Synth" msgstr "Sintezilo" msgid "PCM" msgstr "" msgid "Speaker" msgstr "Parolilo" msgid "Line-in" msgstr "" msgid "Microphone" msgstr "Mikrofono" msgid "CD" msgstr "KD" msgid "Mixer" msgstr "Miksilo" msgid "PCM-2" msgstr "" msgid "Record" msgstr "Registri" msgid "In-gain" msgstr "" msgid "Out-gain" msgstr "" msgid "Line-1" msgstr "" msgid "Line-2" msgstr "" msgid "Line-3" msgstr "" msgid "Digital-1" msgstr "" msgid "Digital-2" msgstr "" msgid "Digital-3" msgstr "" msgid "Phone-in" msgstr "" msgid "Phone-out" msgstr "" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Ekrano" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Ne eblis malfermi la sonaparaton por reproduktado. Ĝi estas uzate de alia " "aplikaĵo." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for playback." msgstr "Ne eblis malfermi la sonaparaton por reproduktado." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for recording." msgstr "Ne eblis malfermi sonaparaton por registrado." msgid "Could not open audio device for mixer control handling." msgstr "" msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" msgid "Master" msgstr "Ĉefe" msgid "Front" msgstr "Antaŭe" msgid "Rear" msgstr "Malantaŭe" msgid "Headphones" msgstr "Kaptelefono" msgid "Center" msgstr "Centre" msgid "LFE" msgstr "" msgid "Surround" msgstr "Ĉirkaŭe" msgid "Side" msgstr "Flanke" msgid "Built-in Speaker" msgstr "" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "" msgid "Line Out" msgstr "" msgid "Line In" msgstr "" msgid "Internal CD" msgstr "" msgid "Video In" msgstr "" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" msgid "Record Gain" msgstr "" msgid "Output Gain" msgstr "" msgid "Microphone Boost" msgstr "" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "Enigo" msgid "Record Source" msgstr "" msgid "Monitor Source" msgstr "" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "Dukanale" msgid "Surround Sound" msgstr "Ĉirkaŭa sono" msgid "Microphone Gain" msgstr "" msgid "Speaker Source" msgstr "" msgid "Microphone Source" msgstr "" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" msgid "Microphone 1" msgstr "Mikrofono 1" msgid "Microphone 2" msgstr "Mikrofono 2" msgid "Digital Out" msgstr "" msgid "Digital In" msgstr "" msgid "HDMI" msgstr "" msgid "Modem" msgstr "Modemo" msgid "Handset" msgstr "" msgid "Other" msgstr "Alia" msgid "None" msgstr "Neniu" msgid "On" msgstr "Enŝaltite" msgid "Off" msgstr "Elŝaltite" msgid "Mute" msgstr "Silentigi" msgid "Fast" msgstr "Rapide" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Tre malalte" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Malalte" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Meze" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Alte" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Tre alte" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" msgid "Front Panel Microphone" msgstr "" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d funkcio" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funcio" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "" #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, c-format msgid "Cannot identify device '%s'." msgstr "" #, c-format msgid "This isn't a device '%s'." msgstr "Tio ne estas '%s'-aparato." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "" #, c-format msgid "Device '%s' is not a capture device." msgstr "" #, c-format msgid "Device '%s' is not a output device." msgstr "" #, c-format msgid "Failed to set norm for device '%s'." msgstr "" #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set input %d on device %s." msgstr "" #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set output %d on device %s." msgstr "" #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "" #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, c-format msgid "Could not get parameters on device '%s'" msgstr "" msgid "Video input device did not accept new frame rate setting." msgstr "" #, c-format msgid "Could not map buffers from device '%s'" msgstr "" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" gst-plugins-good-0.10.31/po/nl.po0000644000175000017500000003636711720565342013412 00000000000000# translation of gst-plugins-good-0.10.28.2.nl.po to Dutch # This file is put in the public domain. # # Freek de Kruijf , 2007, 2008, 2009, 2010, 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-04-27 00:05+0200\n" "Last-Translator: Freek de Kruijf \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgid "Could not establish connection to sound server" msgstr "Kan geen verbinding maken met de geluidsserver" msgid "Failed to query sound server capabilities" msgstr "Kan de eigenschappen van de geluidsserver niet opvragen" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' door '%s'" msgid "Internal data stream error." msgstr "Interne fout in gegevensstroom." msgid "Failed to decode JPEG image" msgstr "Kan de JPEG-afbeelding niet decoderen" msgid "Could not connect to server" msgstr "Kan geen verbinding maken met server" msgid "Server does not support seeking." msgstr "Zoeken wordt door de server niet ondersteund." msgid "Could not resolve server name." msgstr "Kan de servernaam niet opzoeken." msgid "Could not establish connection to server." msgstr "Kan geen verbinding maken met de server" msgid "Secure connection setup failed." msgstr "Beveiligde verbinding opzetten is mislukt." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Er trad een netwerkfout op of de server heeft de verbinding onverwacht " "afgesloten." msgid "Server sent bad data." msgstr "De server stuurde onjuiste gegevens." msgid "No URL set." msgstr "Geen URL ingesteld." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Geen of ongeldig invoergeluid, AVI-stroom zal slecht zijn." msgid "This file contains no playable streams." msgstr "Dit bestand bevat geen afspeelbare stromen." msgid "This file is invalid and cannot be played." msgstr "Dit bestand is ongeldig en kan niet afgespeeld worden." msgid "This file is corrupt and cannot be played." msgstr "Dit bestand is beschadigd en kan niet afgespeeld worden." msgid "Invalid atom size." msgstr "Ongeldige \"atom\"-grootte." msgid "This file is incomplete and cannot be played." msgstr "Dit bestand is incompleet en kan niet afgespeeld worden." msgid "The video in this file might not play correctly." msgstr "De video in dit bestand zal mogelijk niet correct afgespeeld worden." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Dit bestand bevat te veel stromen. Alleen de eerste %d worden afgespeeld." msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Er is geen ondersteunde stroom gevonden. Misschien moet er een GStreamer " "RTSP extensie-plugin voor Real-media-streams geïnstalleerd worden." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Er is geen ondersteunde stroom gevonden. Misschien moet u meer " "overdrachtsprotocollen toestaan of anders ontbreekt de juiste GStreamer RTSP " "extensie-plugin." msgid "Internal data flow error." msgstr "Interne fout in de gegevensdoorvoer." msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Lage tonen" msgid "Treble" msgstr "Hoge tonen" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Luidspreker" msgid "Line-in" msgstr "Lijn-in" msgid "Microphone" msgstr "Microfoon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Opname" msgid "In-gain" msgstr "Ingangsversterking" msgid "Out-gain" msgstr "Uitgangsversterking" msgid "Line-1" msgstr "Lijn-1" msgid "Line-2" msgstr "Lijn-2" msgid "Line-3" msgstr "Lijn-3" msgid "Digital-1" msgstr "Digitaal-1" msgid "Digital-2" msgstr "Digitaal-2" msgid "Digital-3" msgstr "Digitaal-3" msgid "Phone-in" msgstr "Telefooningang" msgid "Phone-out" msgstr "Telefoonuitgang" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Kan het audio-apparaat niet openen voor afspelen. Apparaat is in gebruik bij " "een andere applicatie." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Kan het audio-apparaat niet openen voor afspelen. U hebt geen toestemming om " "het apparaat te openen." msgid "Could not open audio device for playback." msgstr "Kan het audio-apparaat niet openen voor afspelen." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Kan het audio-apparaat niet openen voor opnemen. U hebt geen toestemming om " "het apparaat te openen." msgid "Could not open audio device for recording." msgstr "Kan het audio-apparaat niet openen voor opnemen." msgid "Could not open audio device for mixer control handling." msgstr "Kan het audio-apparaat niet openen voor het besturen van de mixer." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Kan het audio-apparaat niet openen voor besturen van de mixer. Deze versie " "van het Open Sound System wordt niet ondersteunt door dit element." msgid "Master" msgstr "Master" msgid "Front" msgstr "Voorkant" msgid "Rear" msgstr "Achterzijde" msgid "Headphones" msgstr "Hoofdtelefoons" msgid "Center" msgstr "Midden" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Zijkant" msgid "Built-in Speaker" msgstr "Ingebouwde luidspreker" msgid "AUX 1 Out" msgstr "AUX 1-out" msgid "AUX 2 Out" msgstr "AUX 2-out" msgid "AUX Out" msgstr "AUX-uit" msgid "3D Depth" msgstr "3D-diepte" msgid "3D Center" msgstr "3D-centrum" msgid "3D Enhance" msgstr "3D-verbeteren" msgid "Telephone" msgstr "Telefoon" msgid "Line Out" msgstr "Line-out" msgid "Line In" msgstr "Lijn-in" msgid "Internal CD" msgstr "Interne cd" msgid "Video In" msgstr "Video-in" msgid "AUX 1 In" msgstr "AUX 1-in" msgid "AUX 2 In" msgstr "AUX 2-in" msgid "AUX In" msgstr "AUX-in" msgid "Record Gain" msgstr "Opnameversterking" msgid "Output Gain" msgstr "Uitgangsversterking" msgid "Microphone Boost" msgstr "Microfoon-boost" msgid "Loopback" msgstr "Loopback" msgid "Diagnostic" msgstr "Diagnose" msgid "Bass Boost" msgstr "Bas-boost" msgid "Playback Ports" msgstr "Afspeelpoorten" msgid "Input" msgstr "Invoer" msgid "Record Source" msgstr "Opnamebron" msgid "Monitor Source" msgstr "Monitorbron" msgid "Keyboard Beep" msgstr "Toetsenbordpiep" msgid "Simulate Stereo" msgstr "Stereo simuleren" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Surround-geluid" msgid "Microphone Gain" msgstr "Microfoonversterking" msgid "Speaker Source" msgstr "Luidsprekerbron" msgid "Microphone Source" msgstr "Microfoonbron" msgid "Jack" msgstr "Plug" msgid "Center / LFE" msgstr "Midden / LFE" msgid "Stereo Mix" msgstr "Stereo-mix" msgid "Mono Mix" msgstr "Mono-mix" msgid "Input Mix" msgstr "Invoer-mix" msgid "SPDIF In" msgstr "SPDIF-in" msgid "SPDIF Out" msgstr "SPDIF-out" msgid "Microphone 1" msgstr "Microfoon-1" msgid "Microphone 2" msgstr "Microfoon-2" msgid "Digital Out" msgstr "Digitaal-uit" msgid "Digital In" msgstr "Digitaal-in" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Handset" msgid "Other" msgstr "Overig" msgid "None" msgstr "Geen" msgid "On" msgstr "Aan" msgid "Off" msgstr "Uit" msgid "Mute" msgstr "Dempen" msgid "Fast" msgstr "Snel" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Zeer laag" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Laag" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Middel" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Hoog" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Zeer hoog" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Productie" msgid "Front Panel Microphone" msgstr "Microfoon in frontpaneel" msgid "Front Panel Line In" msgstr "Lijn-in in frontpaneel" msgid "Front Panel Headphones" msgstr "Hoofdtelefoons in frontpaneel" msgid "Front Panel Line Out" msgstr "Lijn-uit in frontpaneel" msgid "Green Connector" msgstr "Groene connector" msgid "Pink Connector" msgstr "Roze connector" msgid "Blue Connector" msgstr "Blauwe connector" msgid "White Connector" msgstr "Witte connector" msgid "Black Connector" msgstr "Zwarte connector" msgid "Gray Connector" msgstr "Grijze connector" msgid "Orange Connector" msgstr "Oranje connector" msgid "Red Connector" msgstr "Rode connector" msgid "Yellow Connector" msgstr "Gele connector" msgid "Green Front Panel Connector" msgstr "Groene connector in frontpaneel" msgid "Pink Front Panel Connector" msgstr "Roze connector in frontpaneel" msgid "Blue Front Panel Connector" msgstr "Blauwe connector in frontpaneel" msgid "White Front Panel Connector" msgstr "Witte connector in frontpaneel" msgid "Black Front Panel Connector" msgstr "Zwarte connector in frontpaneel" msgid "Gray Front Panel Connector" msgstr "Grijze connector in frontpaneel" msgid "Orange Front Panel Connector" msgstr "Oranje connector in frontpaneel" msgid "Red Front Panel Connector" msgstr "Rode connector in frontpaneel" msgid "Yellow Front Panel Connector" msgstr "Gele connector in frontpaneel" msgid "Spread Output" msgstr "Uitvoer spreiden" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "Virtuele mixer-invoer" msgid "Virtual Mixer Output" msgstr "Virtuele mixer-uitvoer" msgid "Virtual Mixer Channels" msgstr "Virtuele mixer-kanalen" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d functie" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s-function" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Kan het audio-apparaat niet openen voor afspelen. Deze versie van het Open " "Sound System wordt niet ondersteunt door dit element." msgid "Playback is not supported by this audio device." msgstr "Afspelen wordt niet ondersteund door dit audio-apparaat" msgid "Audio playback error." msgstr "Fout in geluid afspelen." msgid "Recording is not supported by this audio device." msgstr "Opnemen wordt niet ondersteund door dit audio-apparaat" msgid "Error recording from audio device." msgstr "Fout bij opnemen vanaf audio-apparaat." msgid "Gain" msgstr "Versterking" msgid "Headphone" msgstr "Hoofdtelefoon" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Fout bij het lezen van %d bytes van apparaat '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Onverwachte framegrootte, %u in plaats van %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Fout bij het lezen van %d bytes van apparaat '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Fout bij het verkrijgen van de eigenschappen van apparaat '%s': het is geen " "v4l2-stuurprogramma. Controleer of het een v4l1-stuurprogramma is." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Kan eigenschappen van invoer %d op apparaat %s niet opvragen." #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Kan de instelling van tuner %d op apparaat '%s' niet verkrijgen." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Kan de norm op apparaat '%s' niet opvragen." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Kan de knopeigenschappen op apparaat '%s' niet verkrijgen." #, c-format msgid "Cannot identify device '%s'." msgstr "Kan apparaat '%s' niet identificeren." #, c-format msgid "This isn't a device '%s'." msgstr "Dit is geen apparaat '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Kan apparaat '%s' niet openen voor lezen en schrijven." #, c-format msgid "Device '%s' is not a capture device." msgstr "Apparaat '%s' is geen opnameapparaat." #, c-format msgid "Device '%s' is not a output device." msgstr "Apparaat '%s' is geen uitvoerapparaat." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Kan norm niet instellen voor apparaat '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Kan de tunerfrequentie van apparaat '%s' niet verkrijgen." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Kan de huidige tunerfrequentie voor apparaat '%s' niet instellen op %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Kan de signaalsterkte van apparaat '%s' niet verkrijgen." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Kan de waarde voor knop %d op apparaat '%s' niet verkrijgen." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Kan de waarde %d voor knop %d op apparaat '%s' niet instellen." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Kan de huidige instellingen van apparaat '%s' niet verkrijgen. Het is " "mogelijk een radio" #, c-format msgid "Failed to set input %d on device %s." msgstr "Kan invoer %d op apparaat '%s' niet instellen." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Kan de huidige uitvoer niet op apparaat '%s' krijgen. Het is mogelijk een " "radio" #, c-format msgid "Failed to set output %d on device %s." msgstr "Kan uitvoer %d op apparaat %s niet instellen." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Kan geen buffers toekennen in apparaat '%s'." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Kan geen videoframes verkrijgen van apparaat '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Fout na %d pogingen. Apparaat %s. Systeemfout: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Kan de parameters op apparaat '%s' niet verkrijgen" msgid "Video input device did not accept new frame rate setting." msgstr "" "Invoerapparaat voor video heeft de nieuwe frame-snelheid niet geaccepteerd." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Kan de buffers van apparaat '%s' niet vinden" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Het stuurprogramma van apparaat '%s' ondersteunt geen bekende opnamemethode." msgid "Changing resolution at runtime is not yet supported." msgstr "Tijdens het draaien kan de resolutie nog niet gewijzigd worden." msgid "Cannot operate without a clock" msgstr "Kan niet werken zonder een klok." gst-plugins-good-0.10.31/po/lt.po0000644000175000017500000004760711720565342013417 00000000000000# Lithuanian translation for gst-plugins-good. # This file is put in the public domain. # Gintautas Miliauskas , 2008. # Aurimas Černius , 2010. # Žygimantas Beručka , 2010. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.23.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-07-16 19:34+0300\n" "Last-Translator: Žygimantas Beručka \n" "Language-Team: Lithuanian \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Virtaal 0.6.1\n" msgid "Could not establish connection to sound server" msgstr "Nepavyko prisijungti prie garso serverio" msgid "Failed to query sound server capabilities" msgstr "Nepavyko užklausti garso serverio galimybių" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "„%s“ atlieka „%s“" msgid "Internal data stream error." msgstr "Vidinė duomenų srauto klaida." msgid "Failed to decode JPEG image" msgstr "Nepavyko dekoduoti JPEG paveikslėlio" msgid "Could not connect to server" msgstr "Nepavyko prisijungti prie serverio" msgid "Server does not support seeking." msgstr "" #, fuzzy msgid "Could not resolve server name." msgstr "Nepavyko prisijungti prie serverio" #, fuzzy msgid "Could not establish connection to server." msgstr "Nepavyko prisijungti prie garso serverio" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Nėra įvesties garso arba jis netinkamas, AVI srautas bus sugadintas." msgid "This file contains no playable streams." msgstr "Šiame faile nėra atkurtinų srautų." msgid "This file is invalid and cannot be played." msgstr "Failas netinkamas ir negali būti atkurtas." msgid "This file is corrupt and cannot be played." msgstr "Failas sugadintas ir negali būti atkurtas." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Failas nebaigtas ir negali būti atkurtas." msgid "The video in this file might not play correctly." msgstr "Šiame faile esantis vaizdo įrašas gali būti atkurtas nekorektiškai." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Šiame faile per daug srautų. Grojami tik pirmieji %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nerasta palaikomų srautų. Jums gali reikėti įdiegti GStreamer RTSP " "papildinio įskiepį Real media srautams." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nerasta palaikomų srautų. Jums gali reikėti leisti daugiau transporto " "protokolų, arba jūs neturite tinkamo GStreamer RTSP papildinio įskiepio." msgid "Internal data flow error." msgstr "Vidinė duomenų srauto klaida." msgid "Volume" msgstr "Garsumas" msgid "Bass" msgstr "Žemi dažniai" msgid "Treble" msgstr "Aukšti dažniai" msgid "Synth" msgstr "Sintezatorius" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Garsiakalbiai" msgid "Line-in" msgstr "Įvedimas" msgid "Microphone" msgstr "Mikrofonas" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Maišiklis" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Įrašymas" msgid "In-gain" msgstr "Garsinimo ribose" msgid "Out-gain" msgstr "Už garsinimo ribų" msgid "Line-1" msgstr "Linija-1" msgid "Line-2" msgstr "Linija-2" msgid "Line-3" msgstr "Linija-3" msgid "Digital-1" msgstr "Skaitmeninis-1" msgid "Digital-2" msgstr "Skaitmeninis-2" msgid "Digital-3" msgstr "Skaitmeninis-3" msgid "Phone-in" msgstr "Telefonas-įv" msgid "Phone-out" msgstr "Telefonas-išv" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radijas" msgid "Monitor" msgstr "Monitorius" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Nepavyko atverti garso įrenginio grojimui. Įrenginį naudoja kita programa." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Nepavyko atverti garso įrenginio grojimui. Jūs neturite leidimo atverti " "įrenginį." msgid "Could not open audio device for playback." msgstr "Nepavyko atverti garso įrenginio grojimui. " msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Nepavyko atverti garso įrenginio įrašymui. Jūs neturite leidimo atverti " "įrenginį." msgid "Could not open audio device for recording." msgstr "Nepavyko atverti garso įrenginio įrašymui." msgid "Could not open audio device for mixer control handling." msgstr "Nepavyko atverti garso įrenginio maišiklio valdymo apdorojimui." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nepavyko atverti garso įrenginio maišiklio valdymo apdorojimui. Šis " "elementas nepalaiko šios Open Sound System versijos." msgid "Master" msgstr "Pagrindinis" msgid "Front" msgstr "Priekinis" msgid "Rear" msgstr "Galinis" msgid "Headphones" msgstr "Ausinės" msgid "Center" msgstr "Vidurinis" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Supantis" msgid "Side" msgstr "Šoninis" msgid "Built-in Speaker" msgstr "Integruotas garsiakalbis" msgid "AUX 1 Out" msgstr "AUX 1 išvestis" msgid "AUX 2 Out" msgstr "AUX 2 išvestis" msgid "AUX Out" msgstr "AUX išvestis" msgid "3D Depth" msgstr "3D giluminis" msgid "3D Center" msgstr "3D vidurinis" msgid "3D Enhance" msgstr "3D pakeltas" msgid "Telephone" msgstr "Telefonas" msgid "Line Out" msgstr "Išeinanti linija" msgid "Line In" msgstr "Įeinanti linija" msgid "Internal CD" msgstr "Vidinis CD" msgid "Video In" msgstr "Vaizdo įvestis" msgid "AUX 1 In" msgstr "AUX 1 įvestis" msgid "AUX 2 In" msgstr "AUX 2 įvestis" msgid "AUX In" msgstr "AUX įvestis" msgid "Record Gain" msgstr "Įrašymo garsinimas" msgid "Output Gain" msgstr "Išvesties garsinimas" msgid "Microphone Boost" msgstr "Mikrofono pagarsinimas" msgid "Loopback" msgstr "Perduoti ratu" msgid "Diagnostic" msgstr "Diagnostika" msgid "Bass Boost" msgstr "Žemųjų dažnių sustiprinimas" msgid "Playback Ports" msgstr "Grojimo prievadai" msgid "Input" msgstr "Įvestis" msgid "Record Source" msgstr "Įrašymo šaltinis" msgid "Monitor Source" msgstr "Monitoriaus šaltinis" msgid "Keyboard Beep" msgstr "Klaviatūros pypsėjimas" msgid "Simulate Stereo" msgstr "Imituoti stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Erdvinis garsas" msgid "Microphone Gain" msgstr "Mikrofono garsinimas" msgid "Speaker Source" msgstr "Garsiakalbio šaltinis" msgid "Microphone Source" msgstr "Mikrofono šaltinis" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Centras / LFE" msgid "Stereo Mix" msgstr "Stereo maiša" msgid "Mono Mix" msgstr "Mono maiša" msgid "Input Mix" msgstr "Įvesties maiša" msgid "SPDIF In" msgstr "SPDIF įvestis" msgid "SPDIF Out" msgstr "SPDIF išvestis" msgid "Microphone 1" msgstr "Mikrofonas 1" msgid "Microphone 2" msgstr "Mikrofonas 2" msgid "Digital Out" msgstr "Skaitmeninė išvestis" msgid "Digital In" msgstr "Skaitmeninė įvestis" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modemas" msgid "Handset" msgstr "Ragelis" msgid "Other" msgstr "Kita" msgid "None" msgstr "Nėra" msgid "On" msgstr "Įjungta" msgid "Off" msgstr "Išjungta" msgid "Mute" msgstr "Nutildyta" msgid "Fast" msgstr "Greitas" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Labai žema" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Žema" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Vidutinė" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Aukšta" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Labai aukšta" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Sukūrimo" msgid "Front Panel Microphone" msgstr "Priekinio skydelio mikrofonas" msgid "Front Panel Line In" msgstr "Priekinio skydelio įeinanti linija" msgid "Front Panel Headphones" msgstr "Priekinio skydelio ausinės" msgid "Front Panel Line Out" msgstr "Priekinio skydelio išeinanti linija" msgid "Green Connector" msgstr "Žalias kištukas" msgid "Pink Connector" msgstr "Rožinis kištukas" msgid "Blue Connector" msgstr "Mėlynas kištukas" msgid "White Connector" msgstr "Baltas kištukas" msgid "Black Connector" msgstr "Juodas kištukas" msgid "Gray Connector" msgstr "Pilkas kištukas" msgid "Orange Connector" msgstr "Oranžinis kištukas" msgid "Red Connector" msgstr "Raudonas kištukas" msgid "Yellow Connector" msgstr "Geltonas kištukas" msgid "Green Front Panel Connector" msgstr "Žalias priekinio skydelio kištukas" msgid "Pink Front Panel Connector" msgstr "Rožinis priekinio skydelio kištukas" msgid "Blue Front Panel Connector" msgstr "Mėlynas priekinio skydelio kištukas" msgid "White Front Panel Connector" msgstr "Baltas priekinio skydelio kištukas" msgid "Black Front Panel Connector" msgstr "Juodas priekinio skydelio kištukas" msgid "Gray Front Panel Connector" msgstr "Pilkas priekinio skydelio kištukas" msgid "Orange Front Panel Connector" msgstr "Oranžinis priekinio skydelio kištukas" msgid "Red Front Panel Connector" msgstr "Raudonas priekinio skydelio kištukas" msgid "Yellow Front Panel Connector" msgstr "Geltonas priekinio skydelio kištukas" msgid "Spread Output" msgstr "Skleisti išvestį" msgid "Downmix" msgstr "Sumaišyti" msgid "Virtual Mixer Input" msgstr "Virtualaus maišiklio įvestis" msgid "Virtual Mixer Output" msgstr "Virtualaus maišiklio išvestis" msgid "Virtual Mixer Channels" msgstr "Virtualaus maišiklio kanalai" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d funkcija" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funkcija" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nepavyko atverti garso įrenginio grojimui. Šis elementas nepalaiko šios Open " "Sound System versijos." msgid "Playback is not supported by this audio device." msgstr "Šis garso įrenginys nepalaiko grojimo." msgid "Audio playback error." msgstr "Garso grojimo klaida." msgid "Recording is not supported by this audio device." msgstr "Šis garso įrenginys nepalaiko grojimo." msgid "Error recording from audio device." msgstr "Klaida įrašant iš garso įrenginio." msgid "Gain" msgstr "Garsinimas" msgid "Headphone" msgstr "Ausinės" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Klaida skaitant %d baitus (-ų) iš įrenginio „%s“." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Gautas netikėtas kadro dydis %u vietoje %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Klaida skaitant %d baitus (-ų) įrenginyje „%s“." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Klaida gaunant įrenginio „%s“ funkcijas: tai nėra v4l2 tvarkyklė. " "Patikrinkite, ar tai v4l1 tvarkyklė." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Nepavyko užklausti įvesties %d įrenginyje %s atributų" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Nepavyko gauti derintuvo %d įrenginyje „%s“ parametrų." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Nepavyko užklausti normalės įrenginyje „%s“." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Nepavyko gauti valdymo atributų įrenginyje „%s“." #, c-format msgid "Cannot identify device '%s'." msgstr "Nepavyko nustatyti įrenginio „%s“." #, c-format msgid "This isn't a device '%s'." msgstr "Tai nėra įrenginys „%s“." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nepavyko atverti įrenginio „%s“ skaitymui ir rašymui." #, c-format msgid "Device '%s' is not a capture device." msgstr "Įrenginys „%s“ nėra įrašymo įrenginys." #, c-format msgid "Device '%s' is not a output device." msgstr "Įrenginys „%s“ nėra išvesties įrenginys." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Nepavyko nustatyti normalės įrenginiui „%s“." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Nepavyko gauti įrenginio „%s“ dabartinio derintuvo dažnio." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Nepavyko nustatyti įrenginio „%s“ derintuvo dažnio į %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Nepavyko gauti įrenginio „%s“ signalo stiprumo." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Nepavyko gauti valdiklio %d reikšmės įrenginyje „%s“." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Nepavyko nustatyti valdiklio %2$d įrenginyje „%3$s“ reikšmės %1$d." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Nepavyko gauti dabartinės įvesties įrenginyje „%s“. Galbūt tai radijo " "įrenginys" #, c-format msgid "Failed to set input %d on device %s." msgstr "Nepavyko nustatyti įvesties %d įrenginyje %s." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Nepavyko gauti dabartinės įvesties įrenginyje „%s“. Galbūt tai radijo " "įrenginys" #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Nepavyko nustatyti įvesties %d įrenginyje %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nepavyko sustatyti į eilė buferių įrenginyje „%s“." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Nepavyko gauti vaizdo kadrų iš įrenginio „%s“." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Nepavyko po %d bandymų. Įrenginys %s. Sistemos klaida: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nepavyko įrenginio „%s“ parametrų" msgid "Video input device did not accept new frame rate setting." msgstr "Vaizdo įvesties įrenginys nepriėmė naujų kadrų dažnio nustatymų." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nepavyko išdėstyti buferių iš įrenginio „%s“" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Įrenginio „%s“ tvarkyklė nepalaiko jokių žinomų įrašymo būdų." msgid "Changing resolution at runtime is not yet supported." msgstr "Galimybės keisti skiriamąją gebą operacijos vykdymo metu dar nėra." msgid "Cannot operate without a clock" msgstr "Negali veikti be laikrodžio" #~ msgid "Describes the selected input element." #~ msgstr "Aprašo pasirinktą įvesties elementą." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "Aprašo pasirinktą išvesties elementą garso/vaizdo konferencijoms." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Aprašo pasirinktą išvesties elementą muzikai ir filmams." #~ msgid "Describes the selected output element." #~ msgstr "Aprašo pasirinktą išvesties elementą." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "GStreamer garso išvesties elementas garso/vaizdo konferencijoms" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "GStreamer garso išvesties elementas muzikai ir filmams" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer gali groti garsą naudodamas bet kokį išvesties elementų kiekį. " #~ "Keletas galimų pasirinkimų: osssink, esdsink ir alsasink. Garso išvesties " #~ "elementą gali sudaryti dalinis konvejeris, ne tik vienas elementas." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer gali groti vaizdo įrašus naudodamas bet kokį išvesties elementų " #~ "kiekį. Keletas galimų pasirinkimų: xvimagesink, ximagesink, sdlvideosink " #~ "ir aasink. Vaizdo išvesties elementą gali sudaryti dalinis konvejeris, ne " #~ "tik vienas elementas." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "GStreamer gali įdėti vaizdo efektų įskiepius į konvejerį, kad " #~ "transformuotų garso srautą vaizdo kadruose. Numatytasis įskiepis yra " #~ "goom, tačiau greitu metu bus realizuota daugiau vaizdo efektų įskiepių. " #~ "Vaizdo efekto įskiepį gali sudaryti dalinis konvejeris, ne tik vienas " #~ "elementas." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer gali įrašyti garsą naudodamas bet kokį įvesties elementų " #~ "skaičių. Keletas galimų pasirinkimų: osssrc, esdsrc ir alsasrc. Garso " #~ "šaltinį gali sudaryti dalinis konvejeris, ne tik vienas elementas." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer gali įrašyti vaizdą iš bet kokio skaičiaus įvesties elementų. " #~ "Keletas galimų pasirinkimų: v4lsrc ir videotestsrc. Vaizdo šaltinį gali " #~ "sudaryti dalinis konvejeris, ne tik vienas elementas." #~ msgid "default GStreamer audio source" #~ msgstr "numatytasis GStreamer garso šaltinis" #~ msgid "default GStreamer audiosink" #~ msgstr "numatytasis GStreamer garso išvesties elementas" #~ msgid "default GStreamer video source" #~ msgstr "numatytasis GStreamer vaizdo šaltinis" #~ msgid "default GStreamer videosink" #~ msgstr "numatytasis GStreamer vaizdo išvesties elementas" #~ msgid "default GStreamer visualization plugin" #~ msgstr "numatytasis GStreamer vaizdo efekto įskiepis" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "" #~ "GStreamer garso išvesties elemento garso/vaizdo konferencijoms aprašymas" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "GStreamer garso išvesties elemento muzikai ir filmams aprašymas" #~ msgid "description for default GStreamer audiosink" #~ msgstr "numatytojo GStreamer garso išvesties elemento aprašymas" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "numatytojo GStreamer garso šaltinio aprašymas" #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Šis failas užšifruotas ir negali būti pagrotas." #~ msgid "Disc is not an Audio CD." #~ msgstr "Diskas nėra Audio CD" #~ msgid "Could not read from CD." #~ msgstr "Nepavyko skaityti iš CD." gst-plugins-good-0.10.31/po/az.po0000644000175000017500000003410711720565341013400 00000000000000# Translation of 'gst-plugins' messages to Azerbaijani. # Copyright (C) 2004 Free Software Foundation, Inc. # This file is put in the public domain. # Mətin Əmirov , 2004. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-0.8.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2004-03-19 18:29+0200\n" "Last-Translator: Metin Amiroff \n" "Language-Team: Azerbaijani \n" "Language: az\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0.2\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "" msgid "Failed to decode JPEG image" msgstr "" #, fuzzy msgid "Could not connect to server" msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." msgid "Server does not support seeking." msgstr "" #, fuzzy msgid "Could not resolve server name." msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." #, fuzzy msgid "Could not establish connection to server." msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Səhv ya da olmayan audio girişi, AVI yayımı pozulacaqdır." msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "Səs" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "İncə" msgid "Synth" msgstr "Sint" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Spiker" msgid "Line-in" msgstr "Xətd-giriş" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mikser" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Qeyd" msgid "In-gain" msgstr "Giriş-gain" msgid "Out-gain" msgstr "Çıxış-gain" msgid "Line-1" msgstr "Xətd-1" msgid "Line-2" msgstr "Xətd-2" msgid "Line-3" msgstr "Xətd-3" msgid "Digital-1" msgstr "Dijital-1" msgid "Digital-2" msgstr "Dijital-2" msgid "Digital-3" msgstr "Dijital-3" msgid "Phone-in" msgstr "Telefon-girişi" msgid "Phone-out" msgstr "Telefon-çıxışı" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for playback." msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for recording." msgstr "CD avadanlığı oxuma üçün açıla bilmədi." #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "\"%s\" audio avadanlığı yazma üçün açıla bilmədi." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" msgid "Master" msgstr "" msgid "Front" msgstr "" #, fuzzy msgid "Rear" msgstr "Qeyd" msgid "Headphones" msgstr "" msgid "Center" msgstr "" msgid "LFE" msgstr "" msgid "Surround" msgstr "" #, fuzzy msgid "Side" msgstr "Video" #, fuzzy msgid "Built-in Speaker" msgstr "Spiker" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "" msgid "Line Out" msgstr "" #, fuzzy msgid "Line In" msgstr "Xətd-giriş" msgid "Internal CD" msgstr "" #, fuzzy msgid "Video In" msgstr "Video" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" #, fuzzy msgid "Record Gain" msgstr "Qeyd" #, fuzzy msgid "Output Gain" msgstr "Çıxış-gain" #, fuzzy msgid "Microphone Boost" msgstr "Mikrofon" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" #, fuzzy msgid "Record Source" msgstr "Qeyd" #, fuzzy msgid "Monitor Source" msgstr "Monitor" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "" msgid "Surround Sound" msgstr "" #, fuzzy msgid "Microphone Gain" msgstr "Mikrofon" #, fuzzy msgid "Speaker Source" msgstr "Spiker" #, fuzzy msgid "Microphone Source" msgstr "Mikrofon" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" #, fuzzy msgid "Microphone 1" msgstr "Mikrofon" #, fuzzy msgid "Microphone 2" msgstr "Mikrofon" #, fuzzy msgid "Digital Out" msgstr "Dijital-1" #, fuzzy msgid "Digital In" msgstr "Dijital-1" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Mute" msgstr "" msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" #, fuzzy msgid "Front Panel Microphone" msgstr "Mikrofon" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, fuzzy, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, fuzzy, c-format msgid "Cannot identify device '%s'." msgstr "\"%s\" avadanlığına yazıla bilmədi." #, c-format msgid "This isn't a device '%s'." msgstr "" #, fuzzy, c-format msgid "Could not open device '%s' for reading and writing." msgstr "\"%s\" avadanlığı oxuma və yazma üçün açıla bilmədi." #, fuzzy, c-format msgid "Device '%s' is not a capture device." msgstr "\"%s\" avadanlığı capture avadanlığı deyil." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "\"%s\" avadanlığı capture avadanlığı deyil." #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." #, fuzzy, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, fuzzy, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." #, fuzzy, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "\"%s\" idarə avadanlığı bağlana bilmədi." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, fuzzy, c-format msgid "Failed to set input %d on device %s." msgstr "\"%s\" audio avadanlığı bağlana bilmədi." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "\"%s\" audio avadanlığı bağlana bilmədi." #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." #, fuzzy, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, fuzzy, c-format msgid "Could not get parameters on device '%s'" msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." msgid "Video input device did not accept new frame rate setting." msgstr "" #, fuzzy, c-format msgid "Could not map buffers from device '%s'" msgstr "\"%s\" avadanlığından bufferlər alına bilmədi." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "\"%s\" faylı yazma üçün açıla bilmədi." #~ msgid "Error closing file \"%s\"." #~ msgstr "\"%s\" faylı bağlana bilmədi." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "\"%s\" faylı oxuma üçün açıla bilmədi." #~ msgid "No filename specified." #~ msgstr "Fayl adı verilməyib." #~ msgid "Could not write to file \"%s\"." #~ msgstr "\"%s\" faylına yazıla bilmədi." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "\"%s\" idarə avadanlığı yazma üçün açıla bilmədi." #~ msgid "Could not configure audio device \"%s\"." #~ msgstr "\"%s\" audio avadanlığı quraşdırıla bilmədi." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "\"%s\" audio avadanlığı %d Hz-ə keçirilə bilmədi." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "\"%s\" video avadanlığı yazma üçün açıla bilmədi." #~ msgid "Could not close video device \"%s\"." #~ msgstr "\"%s\" video avadanlığı bağlana bilmədi." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "\"%s\" OSS avadanlığı başqa bir proqram tərəfindən istifadədədir." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "\"%s\" avadanlığına yetişə bilmədi, səlahiyyətlərini yoxlayın." #~ msgid "Device \"%s\" does not exist." #~ msgstr "\"%s\" avadanlığı mövcud deyil." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "\"%s\" avadanlığı yazma üçün açıla bilmədi." #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "\"%s\" avadanlığı oxuma üçün açıla bilmədi." #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "\"%s\" vfs faylı oxuma üçün açıla bilmədi." #, fuzzy #~ msgid "No filename given." #~ msgstr "Fayl adı verilməyib." #, fuzzy #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "\"%s\" vfs faylı yazma üçün açıla bilmədi." #, fuzzy #~ msgid "No filename given" #~ msgstr "Fayl adı verilməyib." #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "\"%s\" vfs faylı bağlana bilmədi." #~ msgid "No device specified." #~ msgstr "Avadanlıq bildirilməyib." #~ msgid "Device is not open." #~ msgstr "Avadanlıq açıq deyil." #~ msgid "Device is open." #~ msgstr "Avadanlıq açıqdır." gst-plugins-good-0.10.31/po/en_GB.po0000644000175000017500000003323511720565341013741 00000000000000# English (British) translation. # Copyright (C) 2004 Free Software Foundation, Inc. # Gareth Owen , 2004. # msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.8.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2004-04-26 10:41-0400\n" "Last-Translator: Gareth Owen \n" "Language-Team: English (British) \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "" msgid "Failed to decode JPEG image" msgstr "" #, fuzzy msgid "Could not connect to server" msgstr "Could not close control device \"%s\"." #, fuzzy msgid "Server does not support seeking." msgstr "Your oss device could not be probed correctly" #, fuzzy msgid "Could not resolve server name." msgstr "Could not close control device \"%s\"." #, fuzzy msgid "Could not establish connection to server." msgstr "Could not close control device \"%s\"." msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "No or invalid input audio, AVI stream will be corrupt." msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Bass" msgid "Treble" msgstr "Treble" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Speaker" msgid "Line-in" msgstr "Line-in" msgid "Microphone" msgstr "Microphone" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Record" msgid "In-gain" msgstr "In-gain" msgid "Out-gain" msgstr "Out-gain" msgid "Line-1" msgstr "Line-1" msgid "Line-2" msgstr "Line-2" msgid "Line-3" msgstr "Line-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Phone-in" msgid "Phone-out" msgstr "Phone-out" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for playback." msgstr "Could not open audio device \"%s\" for writing." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for recording." msgstr "Could not open CD device for reading." #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "Could not open audio device \"%s\" for writing." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" msgid "Master" msgstr "" msgid "Front" msgstr "" #, fuzzy msgid "Rear" msgstr "Record" msgid "Headphones" msgstr "" msgid "Center" msgstr "" msgid "LFE" msgstr "" msgid "Surround" msgstr "" #, fuzzy msgid "Side" msgstr "Video" #, fuzzy msgid "Built-in Speaker" msgstr "Speaker" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "" msgid "Line Out" msgstr "" #, fuzzy msgid "Line In" msgstr "Line-in" msgid "Internal CD" msgstr "" #, fuzzy msgid "Video In" msgstr "Video" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" #, fuzzy msgid "Record Gain" msgstr "Record" #, fuzzy msgid "Output Gain" msgstr "Out-gain" #, fuzzy msgid "Microphone Boost" msgstr "Microphone" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" #, fuzzy msgid "Record Source" msgstr "Record" #, fuzzy msgid "Monitor Source" msgstr "Monitor" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "" msgid "Surround Sound" msgstr "" #, fuzzy msgid "Microphone Gain" msgstr "Microphone" #, fuzzy msgid "Speaker Source" msgstr "Speaker" #, fuzzy msgid "Microphone Source" msgstr "Microphone" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" #, fuzzy msgid "Microphone 1" msgstr "Microphone" #, fuzzy msgid "Microphone 2" msgstr "Microphone" #, fuzzy msgid "Digital Out" msgstr "Digital-1" #, fuzzy msgid "Digital In" msgstr "Digital-1" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Mute" msgstr "" msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" #, fuzzy msgid "Front Panel Microphone" msgstr "Microphone" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Could not get buffers from device \"%s\"." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, fuzzy, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Could not get enough buffers from device \"%s\"." #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, fuzzy, c-format msgid "Cannot identify device '%s'." msgstr "Could not write to device \"%s\"." #, c-format msgid "This isn't a device '%s'." msgstr "" #, fuzzy, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Could not open device \"%s\" for reading and writing." #, fuzzy, c-format msgid "Device '%s' is not a capture device." msgstr "Device \"%s\" is not a capture device." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "Device \"%s\" is not a capture device." #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "Could not get buffers from device \"%s\"." #, fuzzy, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Could not get enough buffers from device \"%s\"." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, fuzzy, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Could not close control device \"%s\"." #, fuzzy, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Could not close control device \"%s\"." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, fuzzy, c-format msgid "Failed to set input %d on device %s." msgstr "Could not close audio device \"%s\"." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "Could not get enough buffers from device \"%s\"." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Could not close audio device \"%s\"." #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Could not get buffers from device \"%s\"." #, fuzzy, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Could not get enough buffers from device \"%s\"." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, fuzzy, c-format msgid "Could not get parameters on device '%s'" msgstr "Could not get buffers from device \"%s\"." msgid "Video input device did not accept new frame rate setting." msgstr "" #, fuzzy, c-format msgid "Could not map buffers from device '%s'" msgstr "Could not get buffers from device \"%s\"." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "Could not open file \"%s\" for writing." #~ msgid "Error closing file \"%s\"." #~ msgstr "Error closing file \"%s\"." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "Could not open file \"%s\" for reading." #~ msgid "No filename specified." #~ msgstr "No filename specified." #~ msgid "Could not write to file \"%s\"." #~ msgstr "Could not write to file \"%s\"." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "Could not open control device \"%s\" for writing." #~ msgid "Could not configure audio device \"%s\"." #~ msgstr "Could not configure audio device \"%s\"." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "Could not set audio device \"%s\" to %d Hz." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "Could not open video device \"%s\" for writing." #~ msgid "Could not close video device \"%s\"." #~ msgstr "Could not close video device \"%s\"." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "OSS device \"%s\" is already in use by another program." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "Could not access device \"%s\", check its permissions." #~ msgid "Device \"%s\" does not exist." #~ msgstr "Device \"%s\" does not exist." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "Could not open device \"%s\" for writing." #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "Could not open device \"%s\" for reading." #, fuzzy #~ msgid "Your OSS device could not be probed correctly" #~ msgstr "Your oss device could not be probed correctly" #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "Could not open vfs file \"%s\" for reading." #, fuzzy #~ msgid "No filename given." #~ msgstr "No filename given" #, fuzzy #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "Could not open vfs file \"%s\" for writing." #~ msgid "No filename given" #~ msgstr "No filename given" #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "Could not close vfs file \"%s\"." #~ msgid "No device specified." #~ msgstr "No device specified." #~ msgid "Device is not open." #~ msgstr "Device is not open." #~ msgid "Device is open." #~ msgstr "Device is open." gst-plugins-good-0.10.31/po/nb.gmo0000644000175000017500000001055011720565343013527 00000000000000Tq\  ! .8A JT ]gnv{).)G*q3$   + 5 ? I e j p u }             $ * 0 8 = I N R U [ _ e n x             3 : D M S \ c     # - 6 > E J ` #c    * , )#%M5s$!      %FKQ V ` lz      #(8>AEKO U a lw}$ 5 = HR Xb(F%/SP$ '*;#I->=9@7.3KJL1GQT2 MA 4D?08B+,65 HR&)OE": <C!N'%s' by '%s'3D Center3D DepthAUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutBassBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCould not connect to serverCould not establish connection to server.Could not establish connection to sound serverCould not open audio device for playback.Could not open audio device for recording.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Digital InDigital OutDigital-1Digital-2Digital-3Failed to decode JPEG imageFastFrontHDMIHandsetHeadphoneHeadphonesHighInternal CDInternal data stream error.Line InLine OutLine-1Line-2Line-3Line-inLowMasterMediumMicrophoneMicrophone 1Microphone 2MixerModemMonitorMuteNo URL set.NoneOffOnOtherPCMPCM-2Phone-inPhone-outProductionRadioRearRecordSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSpeakerStereoSurroundSynthTelephoneThis isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVolumeProject-Id-Version: gst-plugins-good 0.10.25.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-10-24 21:53+0200 Last-Translator: Kjartan Maraas Language-Team: Norwegian Bokmaal Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit «%s» av «%s»3D senter3D dybdeAUX 1 innAUX 1 utAUX 2 innAUX 2 utAUX innAUX utBassInnebygget høyttalerCDKan ikke identifisere enhet «%s».Kan ikke operere uten en klokkeSenterKunne ikke koble til tjener.Kunne ikke etablere tilkobling til tjener.Kunne ikke etablere tilkobling til lydtjenerKunne ikke åpne lydenhet for avspilling.Kunne ikke åpne lydenhet for opptak.Kunne ikke åpne enhet «%s» for lesing og skriving.Kunne ikke slå opp navn på tjener.Enhet «%s» kan ikke fange data.Digital innDigital utDigital 1Digital 2Digital 3Klarte ikke å dekode JPEG-bildeRaskFrontHDMIHåndsettHodetelefonHodetelefonerHøyIntern CDIntern feil i datastrøm.Linje innLinje utLinje 1Linje 2Linje 3Linje innLavHovedvolumMiddelsMikrofonMikrofon 1Mikrofon 2MikserModemMonitorDempIngen URL satt.IngenAvPåAnnetPCMPCM-2Telefon innTelefon utProduksjonRadioBakOpptakOppsett av sikker tilkobling feilet.Tjener støtter ikke søking.Tjener sendte ugyldige data.SideHøyttalerStereoSurroundSynthTelefonDette er ikke en enhet «%s».DiskantMeget høyMeget lavVideoVideo innVolumgst-plugins-good-0.10.31/po/id.gmo0000644000175000017500000003445411720565343013535 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""# $ $$ $ $$L$ G% S% `% l% y% %%% %%% %% &!&'$&L&k& r&5&&0&&'+*'-V'.'='y'3k(_(o(eo)-)_*7c* *#*"* + ++ *+ 4+ >+H+jP+'+'+ ,7,,1d,#,J,K-BQ-5-4-8-+8.#d.(.C.'.)/(G/8p/?//// 0%0@0U0?Z0000000 0 11 1'1 /1 ;1G1c1}1111 1 1111 111122 2 2'2 62D2T2Z2`2h2w222<22yy3 3344444 <4 J4X4\4 b4p44 44144555 5 5//5_5n5 5 55!55566#696H6 O6 Z6e6v6|6K6;60 7?=7'}7/7+788 8 -8;8 A8@M888888899v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-02-26 18:09+0700 Last-Translator: Andhika Padmawan Language-Team: Indonesian Language: id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fungsi %s %dFungsi %s'%s' oleh '%s'3D TengahKedalaman 3DDipercanggih 3DTerjadi sebuah galat jaringan, atau server menutup koneksi secara tiba-tiba.AUX 1 MasukAUX 1 KeluarAUX 2 MasukAUX 2 KeluarAUX MasukAUX KeluaranGalat putar balik audio.BasBass BoostKonektor HitamKonektor Panel Depan HitamKonektor BiruKonektor Panel Depan BiruPengeras Suara TerbinaCDTak dapat mengidentifikasi divais '%s'.Tak dapat beroperasi tanpa jamTengahTengah / LFEMengubah resolusi saat waktu berjalan belum didukung.Tak dapat menghubungi serverTak dapat mengantrekan penyangga di divais '%s'.Tak dapat membangun koneksi ke server.Tak dapat membangun koneksi ke server suaraTak bisa mendapatkan parameter di divais '%s'Tak dapat memetakan penyangga dari divais '%s'Tak dapat membuka divais audio untuk menangani kontrol mixer.Tak dapat membuka divais audio untuk menangani kontrol mixer. Versi Open Sound System ini tidak didukung oleh elemen ini.Tak dapat membuka divais audio untuk putar kembali.Tak dapat membuka divais audio untuk putar kembali. Divais sedang digunakan oleh aplikasi lain.Tak dapat membuka divais audio untuk putar kembali. Versi Open Sound System ini tidak didukung oleh elemen ini.Tak dapat membuka divais audio untuk putar kembali. Anda tak memiliki hak akses untuk membuka divais.Tak dapat membuka divais audio untuk merekam.Tak dapat membuka divais audio untuk merekam. Anda tak memiliki hak akses untuk membuka divais.Tak dapat membuka divais '%s' untuk dibaca dan ditulis.Tak dapat menemukan nama server.Divais '%s' bukan divais penangkap.Divais '%s' bukan divais keluaran.DiagnosisDigital MasukDigital KeluarDigital-1Digital-2Digital-3DownmixGalat mendapatkan kemampuan untuk divais '%s': Itu bukan diver v4l2. Cek apakah itu merupakan driver v4l1.Galat membaca %d bita dari divais '%s'.Galat membaca %d bita pada divais '%s'.Galat merekam dari divais audio.Gagal setelah %d percobaan. divais %s. galat sistem: %sGagal mendapatkan kendali atribut di divais '%s'.Gagal untuk mengawasandi citra JPEGGagal mendapatkan masukan terkini di divais '%s'. Mungkin itu divais radioGagal mendapatkan keluaran terkini di divais '%s'. Mungkin itu divais radioGagal untuk mendapatkan frekuensi tuner terkini untuk divais '%s'.Gagal mendapatkan pengaturan tuner %d di divais '%s'.Gagal mendapatkan kekuatan sinyal untuk divais '%s'.Gagal mendapatkan nilai untuk kendali %d di divais '%s'.Gagal kueri atribut masukan %d di divais %sGagal kueri standar di divais '%s'.Gagal untuk kueri kemampuan server suaraGagal mengatur frekuensi tuner terkini untuk divais '%s' ke %lu Hz.Gagal mengatur masukan %d di divais %s.Gagal mengatur standar untuk divais '%s'.Gagal mengatur keluaran %d di divais %s.Gagal mengatur nilai %d untuk kendali %d di divais '%s'.Gagal mencoba untuk mendapatkan bingkai video dari divais '%s'.CepatDepanHeadphone Panel DepanMasukan Jalur Panel DepanKeluaran Jalur Panel DepanMikrofon Panel DepanGainMendapatkan ukuran bingkai %u ketimbang %u yang tak diharapkan.Konektor Abu-AbuKonektor Panel Depan Abu-AbuKonektor HijauKonektor Panel Depan HijauHDMIHandsetHeadphoneHeadphoneTinggiMasukan-gainMasukanMix MasukanCD InternalGalat aliran data internal.Galat arus data internal.Ukuran atom tidak sah.JackBip Papan KetikLFEJalur MasukJalur KeluarJalur-1Jalur-2Jalur-3Jalur masukLoopbackRendahMasterSedangMikrofonMikrofon 1Mikrofon 2Mikrofon BoostMikrofon GainSumber MikrofonMixerModemMonitorSumber MonitorMix MonoDiamTak ada URL yang ditentukan.Masukan audio tidak ada atau tidak sah, arus AVI akan rusak.Tak ada arus didukung yang ditemukan. Anda mungkin ingin mengizinkan lebih banyak transportasi atau kehilangan plugin ekstensi GStreamer RTSP yang benar.Tak ada arus didukung yang ditemukan. Anda mungkin perlu menginstal plugin ekstensi GStreamer RTSP untuk arus Real media.Tidak AdaMatiHidupKonektor JinggaKonektor Panel Depan JinggaLainnyaKeluaran-gainKeluaran GainPCMPCM-2Telepon-masukTelepon-keluarKonektor Merah JambuKonektor Panel Depan Merah JambuPangkalan PutarPutar balik tidak didukung oleh divais audio ini.ProduksiRadioBelakangRekamRekam GainSumber RekamanPerekaman tidak didukung oleh divais audio ini.Konektor MerahKonektor Panel Depan MerahSPDIF MasukSPDIF KeluarPengaturan koneksi aman gagal.Server tidak mendukung pencarian.Server mengirim data rusak.SisiSimulasi StereoPengeras SuaraSumber Pengeras SuaraKeluaran SebarStereoMix StereoSekelilingSuara SekelilingSynthTeleponDriver dari divais '%s' tak mendukung metode penangkap apapun yang dikenal.Video di berkas ini mungkin tak dapat diputar dengan benar.Berkas ini tidak berisi arus yang dapat diputar.Berkas ini berisi terlalu banyak arus. Hanya memutar %d pertamaBerkas ini rusak dan tak dapat diputar.Berkas ini tidak lengkap dan tak dapat diputar.Berkas ini tidak sah dan tak dapat diputar.Ini bukan divais '%s'.TrebleSangat TinggiSangat RendahVideoVideo MasukDivais masukan video tak menerima pengaturan rasio bingkai baru.Kanal Mixer VirtualMasukan Mixer VirtualKeluaran Mixer VirtualVolumeKonektor PutihKonektor Panel Depan PutihKonektor KuningKonektor Panel Depan Kuninggst-plugins-good-0.10.31/po/remove-potcdate.sin0000644000175000017500000000066011720560211016223 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } gst-plugins-good-0.10.31/po/uk.po0000644000175000017500000005615311720565342013413 00000000000000# Ukrainian translation to gst-plugins. # Copyright (C) 2004 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # # Maxim V. Dziumanenko , 2004-2007. # Yuri Chornoivan , 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-05-01 11:55+0300\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" "Plural-Forms: nplurals=1; plural=0;\n" msgid "Could not establish connection to sound server" msgstr "Не вдалося встановити з'єднання із звуковим сервером." msgid "Failed to query sound server capabilities" msgstr "Помилка при запиті можливостей звукового сервера" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» виконує %s" msgid "Internal data stream error." msgstr "Внутрішня помилка потоку даних." msgid "Failed to decode JPEG image" msgstr "Помилка при декодуванні зображення JPEG" msgid "Could not connect to server" msgstr "Не вдалося з'єднатись з сервером" msgid "Server does not support seeking." msgstr "Сервером не підтримується позиціювання." msgid "Could not resolve server name." msgstr "Не вдалося визначити адресу сервера за назвою." msgid "Could not establish connection to server." msgstr "Не вдалося встановити з'єднання з сервером." msgid "Secure connection setup failed." msgstr "Помилка під час спроби налаштування безпечного з’єднання." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Сталася помилка роботи з мережею або з’єднання було несподівано розірвано з " "боку сервера." msgid "Server sent bad data." msgstr "Сервером надіслано помилкові дані." msgid "No URL set." msgstr "Не вказано адресу" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Не вказано або вказано некоректний вхід звукових даних, AVI-потік буде " "пошкоджено." msgid "This file contains no playable streams." msgstr "Файл не містить потоків, які можна відтворити." msgid "This file is invalid and cannot be played." msgstr "Файл є некоректним, його не можна відтворити." msgid "This file is corrupt and cannot be played." msgstr "Файл пошкоджено, його не можна відтворити." msgid "Invalid atom size." msgstr "Некоректний розмір елементарного фрагмента." msgid "This file is incomplete and cannot be played." msgstr "Файл неповний, його не можна відтворити." msgid "The video in this file might not play correctly." msgstr "" "Ймовірно, відеодані цього файла не можна буде відтворити належним чином." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Файл містить надто багато потоків. Відтворюються лише перші %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Не знайдено підтримуваних потоків. Ймовірно, вам слід встановити модуль RTSP " "GStreamer для відтворення потоків Real media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Не знайдено підтримуваних потоків. Ймовірно, вам слід увімкнути додаткові " "протоколи передавання даних або встановити додатковий модуль RTSP GStreamer." msgid "Internal data flow error." msgstr "Помилка внутрішнього перенесення даних." msgid "Volume" msgstr "Гучність" msgid "Bass" msgstr "Низькі" msgid "Treble" msgstr "Високі" msgid "Synth" msgstr "Синтезатор" msgid "PCM" msgstr "КІМ" msgid "Speaker" msgstr "Динамік" msgid "Line-in" msgstr "Лінійний вхід" msgid "Microphone" msgstr "Мікрофон" msgid "CD" msgstr "КД" msgid "Mixer" msgstr "Мікшер" msgid "PCM-2" msgstr "КІМ-2" msgid "Record" msgstr "Запис" msgid "In-gain" msgstr "Вх.підсилення" msgid "Out-gain" msgstr "Вих.підсилення" msgid "Line-1" msgstr "Лінійний-1" msgid "Line-2" msgstr "Лінійний-2" msgid "Line-3" msgstr "Лінійний-3" msgid "Digital-1" msgstr "Цифровий-1" msgid "Digital-2" msgstr "Цифровий-2" msgid "Digital-3" msgstr "Цифровий-3" msgid "Phone-in" msgstr "Вх.телефон" msgid "Phone-out" msgstr "Вих.телефон" msgid "Video" msgstr "Відео" msgid "Radio" msgstr "Радіо" msgid "Monitor" msgstr "Монітор" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Не вдалося відкрити пристрій для відтворення. Пристрій використовується " "сторонньою програмою." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Не вдалося відкрити пристрій для відтворення. У вас недостатньо прав для " "відкриття пристрою." msgid "Could not open audio device for playback." msgstr "Не вдалося відкрити пристрій для відтворення." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Не вдалося відкрити пристрій для запису. У вас недостатньо прав для " "відкриття пристрою." msgid "Could not open audio device for recording." msgstr "Не вдалося відкрити пристрій для запису." msgid "Could not open audio device for mixer control handling." msgstr "Не вдалося відкрити пристрій для керування регуляторами мікшера." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Не вдалося відкрити пристрій для керування регуляторами мікшера. Ця версія " "Open Sound System не підтримується цим елементом." msgid "Master" msgstr "Основний" msgid "Front" msgstr "Передній" msgid "Rear" msgstr "Задній" msgid "Headphones" msgstr "Навушники" msgid "Center" msgstr "Центральний" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Об'ємний" msgid "Side" msgstr "Боковий" msgid "Built-in Speaker" msgstr "Вбудований динамік" msgid "AUX 1 Out" msgstr "Вихід AUX 1" msgid "AUX 2 Out" msgstr "Вихід AUX 2" msgid "AUX Out" msgstr "Вихід AUX" msgid "3D Depth" msgstr "Просторова глибина" msgid "3D Center" msgstr "Просторовий центр" msgid "3D Enhance" msgstr "Просторове покращення" msgid "Telephone" msgstr "Телефон" msgid "Line Out" msgstr "Лінійний вихід" msgid "Line In" msgstr "Лінійний вхід" msgid "Internal CD" msgstr "Вбудований КД" msgid "Video In" msgstr "Відеовхід" msgid "AUX 1 In" msgstr "Вхід AUX 1" msgid "AUX 2 In" msgstr "Вхід AUX 2" msgid "AUX In" msgstr "Вхід AUX" msgid "Record Gain" msgstr "Підсилення запису" msgid "Output Gain" msgstr "Підсилення виходу" msgid "Microphone Boost" msgstr "Підсилення мікрофона" msgid "Loopback" msgstr "Заглушка" msgid "Diagnostic" msgstr "Діагностика" msgid "Bass Boost" msgstr "Підсилення басів" msgid "Playback Ports" msgstr "Порти відтворення" msgid "Input" msgstr "Вхід" msgid "Record Source" msgstr "Запис джерела" msgid "Monitor Source" msgstr "Спостереження за джерелом" msgid "Keyboard Beep" msgstr "Гудок клавіатури" msgid "Simulate Stereo" msgstr "Імітація стерео" msgid "Stereo" msgstr "Стерео" msgid "Surround Sound" msgstr "Об'ємний звук" msgid "Microphone Gain" msgstr "Підсилення мікрофона" msgid "Speaker Source" msgstr "Основний динамік" msgid "Microphone Source" msgstr "Основний мікрофон" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Центральний/LFE" msgid "Stereo Mix" msgstr "Стереомікшер" msgid "Mono Mix" msgstr "Мономікшер" msgid "Input Mix" msgstr "Мікшер вх. даних" msgid "SPDIF In" msgstr "Вхід SPDIF" msgid "SPDIF Out" msgstr "Вихід SPDIF" msgid "Microphone 1" msgstr "Мікрофон 1" msgid "Microphone 2" msgstr "Мікрофон 2" msgid "Digital Out" msgstr "Цифровий вихід" msgid "Digital In" msgstr "Цифровий вхід" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Модем" msgid "Handset" msgstr "Гарнітура" msgid "Other" msgstr "Інше" msgid "None" msgstr "Немає" msgid "On" msgstr "Увімкн." msgid "Off" msgstr "Вимкн." msgid "Mute" msgstr "Вимкнути звук" msgid "Fast" msgstr "Швидко" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Дуже низька" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Низька" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Середня" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Висока" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Дуже висока" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Промислова" msgid "Front Panel Microphone" msgstr "Мікрофон передньої панелі" msgid "Front Panel Line In" msgstr "Лінійний вхід передньої панелі" msgid "Front Panel Headphones" msgstr "Вихід навушників передньої панелі" msgid "Front Panel Line Out" msgstr "Лінійний вихід передньої панелі" msgid "Green Connector" msgstr "Зелений рознім" msgid "Pink Connector" msgstr "Рожевий рознім" msgid "Blue Connector" msgstr "Синій рознім" msgid "White Connector" msgstr "Білий рознім" msgid "Black Connector" msgstr "Чорний рознім" msgid "Gray Connector" msgstr "Сірий рознім" msgid "Orange Connector" msgstr "Помаранчевий рознім" msgid "Red Connector" msgstr "Червоний рознім" msgid "Yellow Connector" msgstr "Жовтий рознім" msgid "Green Front Panel Connector" msgstr "Зелений рознім передньої панелі" msgid "Pink Front Panel Connector" msgstr "Рожевий рознім передньої панелі" msgid "Blue Front Panel Connector" msgstr "Синій рознім передньої панелі" msgid "White Front Panel Connector" msgstr "Білий рознім передньої панелі" msgid "Black Front Panel Connector" msgstr "Чорний рознім передньої панелі" msgid "Gray Front Panel Connector" msgstr "Сірий рознім передньої панелі" msgid "Orange Front Panel Connector" msgstr "Помаранчевий рознім передньої панелі" msgid "Red Front Panel Connector" msgstr "Червоний рознім передньої панелі" msgid "Yellow Front Panel Connector" msgstr "Жовтий рознім передньої панелі" msgid "Spread Output" msgstr "Розгорнути вихід" msgid "Downmix" msgstr "Об’єднання каналів" msgid "Virtual Mixer Input" msgstr "Вхід віртуального мікшера" msgid "Virtual Mixer Output" msgstr "Вихід віртуального мікшера" msgid "Virtual Mixer Channels" msgstr "Канали віртуального мікшера" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s, функція %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Функція %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Не вдалося відкрити пристрій для відтворення. Ця версія Open Sound System не " "підтримується цим елементом." msgid "Playback is not supported by this audio device." msgstr "Відтворення не підтримується цим звуковим пристроєм." msgid "Audio playback error." msgstr "Помилка відтворення звуку." msgid "Recording is not supported by this audio device." msgstr "Запис не підтримується цим звуковим пристроєм." msgid "Error recording from audio device." msgstr "Помилка записування зі звукового пристрою." msgid "Gain" msgstr "Підсилення" msgid "Headphone" msgstr "Навушники" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Помилка під час спроби читання %d байтів з пристрою «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Отримано неочікуваний розмір блоку %u замість %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Помилка під час спроби читання %d байтів на пристрої «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Помилка при отриманні можливостей пристрою «%s»: драйвер не є драйвером для " "v4l2. Перевірте, може це драйвер типу v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Помилка при запиті атрибутів вводу %d пристрою %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Помилка при встановленні приймача %d пристрою «%s»." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Помилка при запиті норми пристрою «%s»." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Не вдалося отримати атрибути регуляторів керування пристрою «%s»." #, c-format msgid "Cannot identify device '%s'." msgstr "Не вдалося ідентифікувати пристрій «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "Це не пристрій «%s»." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Не вдалося відкрити пристрій «%s» для читання та запису." #, c-format msgid "Device '%s' is not a capture device." msgstr "Пристрій «%s» не є пристроєм захоплення." #, c-format msgid "Device '%s' is not a output device." msgstr "Пристрій «%s» не є пристроєм виведення даних." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Не вдалося встановити норму пристрою «%s»." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Не вдалося отримати поточну частоту приймача пристрою «%s»." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Не вдалося встановити поточну частоту приймача пристрою «%s» у %lu Гц." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Помилка при отриманні сили сигналу пристрою «%s»." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Не вдалося отримати значення від органу керування %d пристрою «%s»." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Не вдалося встановити значення %d для органу керування %d пристрою «%s»." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Не вдалося отримати поточний ввід пристрою «%s». Можливо цей пристрій — " "радіо." #, c-format msgid "Failed to set input %d on device %s." msgstr "Не вдалося встановити ввід %d пристрою «%s»." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Не вдалося отримати поточний вихід пристрою «%s». Можливо цей пристрій — " "радіо." #, c-format msgid "Failed to set output %d on device %s." msgstr "Не вдалося встановити вихід %d пристрою «%s»." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Не вдалося опитати буфери від пристрою «%s»." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Не вдалося отримати відеокадри з пристрою «%s»." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Помилка після %d спроб. Пристрій %s. Системна помилка: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Не вдалося отримати параметри пристрою «%s»." msgid "Video input device did not accept new frame rate setting." msgstr "" "Пристроєм відеовходу не підтримується нове значення параметра частоти кадрів." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Не вдалося пов’язати буфери з пристрою «%s»." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Драйвер пристрою «%s» не підтримує жоден відомий метод захоплення." msgid "Changing resolution at runtime is not yet supported." msgstr "Зміна роздільної здатності при відтворенні ще не підтримується." msgid "Cannot operate without a clock" msgstr "Робота без годинника неможлива" #~ msgid "Could not read from CD." #~ msgstr "Не вдається прочитати з компакт-диску." #~ msgid "Disc is not an Audio CD." #~ msgstr "Диск не є аудіо компакт-диском." #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Файл зашифрований та не може бути відтворений." #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "Не вдається отримати атрибути органів керування пристрою \"%s\"." #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Не вдається отримати список усіх можливих відеоформатів, які підтримує " #~ "пристрій \"%s\"" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Буфер цього типу не підтримується, або індекс поза межами діапазону, або " #~ "буфери ще не були виділені, або неправильні параметри userptr чи довжина. " #~ "Пристрій %s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Не вдається отримати відеокадри з пристрою \"%s\". Недостатньо пам'яті." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "Недостатньо пам'яті для вставляння у чергу вказівника на буфер " #~ "користувача. Пристрій %s." #~ msgid "Could not exchange data with device '%s'." #~ msgstr "Помилка при обміні даними з пристроєм \"%s\"." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Пристрій \"%s\" не здатний захоплювати відео у форматі %dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Пристрій \"%s\" не здатний захоплювати відео у вказаному форматі" #~ msgid "Could not set parameters on device '%s'" #~ msgstr "Не вдається встановити параметри пристрою \"%s\"." #~ msgid "Device '%s' cannot capture at %d/%d frames per second" #~ msgstr "Пристрій \"%s\" не здатний захоплювати %d/%d кадрів за секунду" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Не вдається отримати буфери від пристрою \"%s\"." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "Не вдається отримати достатньо буферів від пристрою \"%s\"." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Не вдається розпочати захоплення кадрів з пристрою \"%s\"." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Помилка при зупиненні захоплення кадрів з пристрою \"%s\"." gst-plugins-good-0.10.31/po/fi.gmo0000644000175000017500000003430611720565343013533 00000000000000     JZ cm v  <[ b4o)).'C&k7)JVtqW=*X3M$l#      a(_&"228GT61.243g$)@$+#P5t3)@.Et    /K P^bjsz    &/ 46@wr  /, \gmr y 0   @V[ks   D0 '@ :h * - * '!A! H!R![!a!9j!!!!!!!"("E" $ $'$D$ M$ W$=c$$ $$ $ $$$$ % % %7%F%_%z%#}%%% %=%&7-&%e&*&.&2&7'wP'-'V'qM(W(1)WI)A)()# *$0* U*b*x**** *d*.(+.W+"+D+5+$,[B,=,;,3-1L-7~-2-3-E.0c.3.<.:/@/F/J/a/w///9/ // 0050 :0 E0 P0[0 b0p0 y0 000000 0 01 11 1'191@1F1 M1 W1 c1o11111 111 11T1L2y2 y33 3333 3 333334 4 94&F4m4v4|4 4 44&4444 5(5=5&V5}555 555 55555@5<26*o6C646.75B7x7 7777 777 8)8B8\8n8888>Z*Jr`xgF8 I#wbi-?^U@ca'ze]=_%WXnov5M&GNH.\~7V$t9)}D"Q,|El:s ;yTqPKfSh!/j RkB m0<[ dLu1+O(6{ApY234C%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.25.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-11-17 23:03+0200 Last-Translator: Tommi Vainikainen Language-Team: Finnish Language: fi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); %s %d -toiminto%s -toiminto”%s” artistilta ”%s”3D-keski3D-syvyys3D-tehostusTapahtui verkkovirhe tai palvelin sulki yhteyden yllättäen.AUX 1 sisäänAUX 1 ulosAUX 2 sisäänAUX 2 ulosAUX sisäänAUX ulosÄänentoistovirhe.BassoBassotehostinMusta liitinMusta etupaneeliliitinSininen liitinSininen etupaneeliliitinSisäänrakennettu kaiutinCDLaitetta ”%s” ei voi tunnistaa.Ei voitu toimia ilman kelloaKeskiKeski / LFEResoluution vaihto käytön aikana ei ole vielä mahdollista.Palvelimeen ei saatu yhteyttäPuskureita ei voitu laittaa jonoon laitteella ”%s”.Yhteyttä palvelimeen ei voitu avata.Yhteyttä äänipalvelimeen ei voitu avataLaitteelta ”%s” ei voitu saada parametrejaPuskereita laitteelta ”%s” ei voitu kartoittaaÄänilaitetta ei voitu avata mikserinhallintaa varten.Äänilaitetta ei voitu avata mikserinhallintaa varten. Tämä elementti ei tue tätä versiota Open Sound Systemistä.Äänilaitetta ei voitu avata toistettavaksi.Äänilaitetta ei voitu avata toistettavaksi. Laite on toisen sovelluksen käytössä.Äänilaitetta ei voitu avata toistamista varten. Tämä elementti ei tue tätä versiota Open Sound Systemistä.Äänilaitetta ei voitu avata toistamista varten. Laitteen avaamiseen ei ole oikeuksia.Äänilaitetta ei voitu avata nauhoitusta varten.Äänilaitetta ei voitu avata nauhoitusta varten. Laitteen avaamiseen ei ole oikeuksia.Laitetta ”%s” ei voitu avata luettavaksi ja kirjoitettavaksi.Palvelimen nimeä ei saatu selvitettyä.Laitteelta ”%s” ei voi kaapata.Laite ”%s” ei ole ulostulolaite.DiagnosointiDigitaalinen sisäänDigitaalinen ulosDigitaalinen-1Digitaalinen-2Digitaalinen-3AlasmiksausVirhe haettaessa laitteen ”%s” ominaisuuksia: se ei ole v4l2-ajuri.Tarkista, onko se v4l1-ajuri.Virhe luettaessa %d tavua laitteelta ”%s”.Virhe luettaessa %d tavua laitteelta ”%s”.Virhe luettaessa äänilaitteelta.Epäonnistui %d yrityksen jälkeen: laite %s, järjestelmävirhe: %sLaitteen ”%s” ohjainattribuutteja ei voitu lukea.JPEG-kuvan purku epäonnistuiLaitteen ”%s” tämänhetkistä sisääntuloa ei voitu lukea, se ei ehkä ole radiolaiteNyt viritettyä taajuutta ei voitu lukea laitteelta ”%s”.Virittimen %d asetuksia ei voitu lukea laitteelta ”%s”.Laitteelta ”%s” ei saatu signaalinvoimakkuutta.Ohjaimelle %d ei saatu arvoa laitteelta ”%s”.Lähteen %d ominaisuuksia laitteelta %s ei voitu kysyäLaitteen ”%s” videostandardia ei voitu kysyä.Äänipalvelimen ominaisuuksia ei voitu selvittääLaitteen ”%s” virittimen taajutta ei voitu asettaa arvoon %lu Hz.Sisääntuloa %d ei voitu asettaa laitteelle %s.Laitteen ”%s” videostandardia ei voitu asettaa.Arvoa %d ei voitu asettaa ohjaimelle %d laitteella ”%s”.Videoruutujen noutaminen laitteelta ”%s” epäonnistui.NopeaEtuEtupaneelin kuulokkeetEtupaneelin linjatuloEtupaneelin linja ulosEtupaneelin mikrofoniHerkkyysSaatiin odottamaton kehys kooltaan %u odotetun %u sijaan.Harmaa liitinHarmaa etupaneeliliitinVihreä liitinVihreä etupaneeliliitinHDMIKuulokkeetKuulokkeetKuulokkeetKorkeaGain-sisäänSisäänSisään MixSisäinen CDSisäisen tietovirran virhe.Sisäisen tietovirran virhe.PistokeNäppäimistöpiippausLFELinjatuloLinja ulosLinja-1Linja-2Linja-3LinjatuloTakaisinkytkentäMatalaPääMediumMikrofoniMikrofoni 1Mikrofoni 2MikrofonitehostinMikrofoni-gainMikrofonilähdeMikseriModeemiTarkkailuTarkkailulähdeMono MixVaimennettuEi URL:ää asetettuna.Ääntä ei ole tai äänilähde on viallinen, AVI-virta tulee olemaan vaurioitunut.Tuettua virtaa ei löytynyt. Sinun kenties tarvitsee sallia useampia siirtoprotokollia, tai vaihtoehtoisesti sinulta saattaa puuttua oikea GStreamer-RTSP-laajennusliitännäinen.Tuettua virtaa ei löytynyt. Kenties sinun tarvitsee asentaa GStreamer-RTSP-laajennus käyttääksesi Real-media-virtoja.Ei mikäänPoissaPäälläOranssi liitinOranssi etupaneeliliitinMuuGain-ulosGain-ulosPCMPCM-2LevysoitintuloLevysoitinlähtöVaaleanpunainen liitinVaaleanpunainen etupaneeliliitinToistoportitTämä äänilaite ei tue toistamista.TuotantoRadioTakaNauhoitusNauhoitusgainNauhoituslähdeTämä äänilaite ei tue nauhoitusta.Punainen liitinPunainen etupaneeliliitinSPDIF sisäänSPDIF ulosTurvallisen yhteyden avaus epäonnistui.Pavelin ei tue kelausta.Palvelin lähetti virheellistä dataa.SivuSimuloitu stereoKaiutinKaiutinlähdeLevitetty ulosStereoStereo MixSurroundSurround-ääniSynthPuhelinLaitteen ”%s” ajuri ei tue mitään tunnettua kaappaustapaa.Tiedostossa olevaa videota ei ehkä voida näyttää oikein.Tiedosto ei sisällä soitettavia virtoja.Tiedosto sisältää useita virtoja. Soitetaan vain ensimmäiset %dTiedosto on vioittunut eikä sitä voida näyttää.Tiedosto on vajaa eikä sitä voida esittää.Tiedosto on virheellinen eikä sitä voida esittää.Tämä ei ole laite ”%s”.Ylä-äänetErittäin korkeaErittäin matalaVideoVideotuloVideosyötelaite ei hyväksy uutta kehysnopeusasetusta.Virtuaaliset mikserikanavatVirtuaalinen mikserituloVirtuaalinen mikseri ulosÄänenvoimakkuusValkoinen liitinValkoinen etupaneeliliitinKeltainen liitinKeltainen etupaneeliliitingst-plugins-good-0.10.31/po/sk.gmo0000644000175000017500000003545211720565343013555 00000000000000     JJ S] fpw  ,K R4_)).'3&[7):VdqW-*X3 =$\#      a(O&x"22(GD61.2$3W$)@$#@5d30.5ds    3 8FJR[bipx    6(_rinru  / DOUZ a m0{   (>CS[ jx  D0'( :P * - * !)! 0!:!C!I!9R!!!!!!!!"-" ($ 6$ A$N$ W$a$Ip$ $ $ $ $ $ $%%#%6%"G%j%!z%%%&%%% %8 &!B&@d&-&7&0 '><'E{''AI(l((u})>)q2*>*(*2 +,?+ l+x++ + + + +v+1?,1q,,,B,H-'\-O-L-D!.8f.J.8.,#/3P/X/2/+0N<070000 0"151Q18V11!11"11 1 22 2(2 .2 82E2 d2222222222223 3 3 3 *363L3\3m3t3z33333F344;5@5I5R5%f555555555#56=$6 b6l6s6 z6 66966$6 7 !7+/7![7}777 7777 7 78 8#8O,83|8=8M80<9.m9,9999 9 : :J:h::: :: ::!;>Y*Jq_wfF8 I#vah-?]U@b`'yd\=^%Wmnu5M&GNH.[}7V$s9)|D"Q,{Ek:r ;xTpPKeSg!/i RjB l0~<Z cLt1+O(6zAoX234C%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.25.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-11-08 15:48+0100 Last-Translator: Peter Tuhársky Language-Team: Slovak Language: sk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n X-Generator: KBabel 1.11.4 X-Poedit-Country: SLOVAKIA %s %d funkcia%s funkcia'%s' od '%s'3D stred3D hĺbka3D vylepšenieVyskytla sa sieťová chyba, alebo server neočakávane uzavrel spojenie.AUX 1 vstupAUX 1 výstupAUX 2 vstupAUX 2 výstupAUX vstupAUX výstupChyba prehrávania zvuku.BasyZvýraznenie basovČierny konektorČierny konektor na prednom paneliModrý konektorModrý konektor na prednom paneliPC reproduktorCDNeviem identifikovať zariadenie '%s'.Nemôžem fungovať bez hodínStrednýStred / LFEZmena rozlíšenia za chodu nie je zatiaľ podporovaná.Nepodarilo sa pripojiť k serveruNepodarilo sa zaradiť vyrovnávaciu pamäť na zariadení '%s'.Nepodarilo sa nadviazať spojenie so serveromNepodarilo sa nadviazať spojenie so zvukovým serveromNepodarilo sa získať parametre zariadenia '%s'Nepodarilo sa namapovať vyrovnávaciu pamäť zariadenia '%s'Nepodarilo sa otvoriť zvukové zariadenie v režime obsluhy mixéru.Nepodarilo sa otvoriť zvukové zariadenie v režime obsluhy mixéru. Táto verzia Open Sound System nie je podporovaná týmto prvkom.Nepodarilo sa otvoriť zvukové zariadenie vrežime prehrávania.Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Zariadenie už používa iná aplikácia.Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Táto verzia Open Sound System nie je podporovaná týmto prvkom.Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Nemáte oprávnenie na otvorenie tohto zariadenia.Nepodarilo sa otvoriť zvukové zariadenie v režime záznamu.Nepodarilo sa otvoriť zvukové zariadenie v režime záznamu. Nemáte oprávnenie na otvorenie tohto zariadenia.Nepodarilo sa otvoriť zariadenie '%s' pre čítanie a zápis.Nepodarilo sa preložiť názov servera.Zariadenie '%s' nie je určené pre zachytávanie.Zariadenie '%s' nie je určené pre výstup.DiagnostikaDigitálny vstupDigitálny výstupDigitál-1Digitál-2Digitál-3ZmiešanieChyba pri zisťovaní schopností zariadenia '%s': Toto nie je ovládač v4l2. Skontrolujte, či je to ovládač v4l1.Chyba pri čítaní %d bajtov na zariadení '%s'.Chyba pri čítaní %d bajtov na zariadení '%s'.Chyba pri zázname zo zvukového zariadenia.Nepodarilo sa po %d pokusoch. Zariadenie %s. Systémová chyba: %sNepodarilo sa získať atribúty ovládacích prvkov na zariadení '%s'.Nepodarilo sa dekódovať obrázok JPEGNepodarilo sa zistiť súčasný vstup na zariadení '%s'. Možno je to rádio.Nepodarilo sa zistiť súčasnú frekvenciu prijímača pre zariadenie '%s'.Nepodarilo sa získať nastavenie prijímača %d od zariadenia '%s'.Nepodarilo sa zistiť silu signálu pre zariadenie '%s'.Nepodarilo sa zistiť hodnotu pre ovládací prvok %d pre zariadenie '%s'.Nepodarilo sa získať atribúty vstupu %d zariadenia %sZlyhala požiadavka norm na zariadení '%s'.Nepodarilo sa zistiť schopnosti zvukového serveraNepodarilo sa nastaviť súčasnú frekvenciu prijímača pre zariadenie '%s' na %lu Hz.Nepodarilo sa nastaviť vstup %d na zariadení %s.Zlyhalo nastavenie norm na zariadení '%s'.Nepodarilo sa nastaviť hodnotu %d pre ovládací prvok %d na zariadení '%s'.Nepodarilo sa získať videosnímky zo zariadenia '%s'.RýchloPrednýSlúchadlá na prednom paneliLinkový vstup na prednom paneliLinkový výstup na prednom paneliMikrofón na prednom paneliZiskNastala neočakávaná veľkosť snímky %u namiesto %u.Šedý konektorŠedý konektor na prednom paneliZelený konektorZelený konektor na prednom paneliHDMISlúchadláSlúchadláVysokéVstupný ziskVstupVstup MixVnútorne CDVnútorná chyba toku údajov.Vnútorná chyba prúdu údajov.JackPípnutie klávesniceLFELinkový vstupLinkový výstupLinka-1Linka-2Linka-3Linkový vstupSpätná slučkaNízkeHlavnýStrednéMikrofónMikrofón 1Mikrofón 2Zosilnenie mikrofónuZisk mikrofónuZdroj mikrofónuMixérModemMonitorMonitor zdrojaMono MixStlmiťNebolo nastavené URL.Žiadny alebo chybný vstup zvuku, prúd údajov AVI bude poškodený.Nenašiel sa žiaden podporovaný prúd údajov. Možno by ste mali povoliť viacero prenosových protokolov, alebo vám možno chýba správny zásuvný modul GStreamer RTSP.Nenašiel sa žiaden podporovaný prúd údajov. Možno je potrebné nainštalovať zásuvný modul GStreamer RTSP pre prúdy Real media..NičVypnutéZapnutéOranžový konektorOranžový konektor na prednom paneliInéVýstupný ziskVýstupný ziskPCMPCM-2Telefón-vstupTelefón-výstupRužový konektorRužový konektor na prednom paneliPrehrávacie portyPrehrávanie nie je podporované týmto zvukovým zariadenímProdukciaRádioZadnéNahrávanieZisk záznamuZdroj záznamuZáznam nie je podporovaný týmto zvukovým zariadením.Červený konektorČervený konektor na prednom paneliSPDIF vstupSPDIF výstupNastavenie bezpečného pripojenia zlyhalo.Server nepodporuje zmenu pozícieServer odoslal chybné údaje.StranaSimulovať stereoReproduktorZdroj reproduktoraRozdeliť výstupStereoStereo MixPriestorovýPriestorový zvukSyntetizérTelefónTento ovládač zariadenia '%s' nepodporuje žiadnu známu metódu nahrávania.Video v tomto súbore možno nebude hrať korektne.Tento súbor neobsahuje žiadne prehrateľné prúdy údajov.Tento súbor obsahuje príliš mnoho prúdov údajov. Prehrávam iba prvý %dTento súbor je poškodený a nedá sa prehrať.Tento súbor je neúplný a nedá sa prehrať.Tento súbor je chybný a nedá sa prehrať.Toto nie je zariadenie '%s'.VýškyVeľmi vysokéVeľmi nízkeVideoVideo vstupZariadenie video vstupu neakceptovalo nové nastavenie frekvencie snímok.Kanály virtuálneho mixéraVstup virtuálneho mixéraVýstup virtuálneho mixéraHlasitosťBiely konektorBiely konektor na prednom paneliŽltý konektorŽltý konektor na prednom paneligst-plugins-good-0.10.31/po/sl.po0000644000175000017500000004657111720565342013415 00000000000000# Slovenian translation for gst-plugins-good. # Copyright (C) 2005 - 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # Robert Horvat , 2010. # Matej Urbančič , 2010 - 2011. # Klemen Košir , 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-03-12 18:35+0100\n" "Last-Translator: Klemen Košir \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-SourceCharset: utf-8\n" msgid "Could not establish connection to sound server" msgstr "Povezave z zvočnim strežnikom ni mogoče vzpostaviti" msgid "Failed to query sound server capabilities" msgstr "Poizvedba o zmogljivosti zvočnega strežnika je spodletela" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' - '%s'" msgid "Internal data stream error." msgstr "Notranja napaka pretoka podatkov." msgid "Failed to decode JPEG image" msgstr "Odkodiranje slike JPEG je spodletelo" msgid "Could not connect to server" msgstr "S strežnikom se ni mogoče povezati" msgid "Server does not support seeking." msgstr "Strežnik ne podpira iskanja." msgid "Could not resolve server name." msgstr "Imena strežnika ni mogoče razrešiti." msgid "Could not establish connection to server." msgstr "Povezave s strežnikom ni mogoče vzpostaviti" msgid "Secure connection setup failed." msgstr "Nastavitev varne povezave je spodletela." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Prišlo je do omrežne napake ali pa se je povezava nepričakovano prekinila." msgid "Server sent bad data." msgstr "Strežnik je poslal slabe podatke." msgid "No URL set." msgstr "Ni nastavljenega naslova URL." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Napaka vhodnega zvoka, pretok AVI bo pokvarjen." msgid "This file contains no playable streams." msgstr "Datoteka ne vsebuje pretokov za predvajanje." msgid "This file is invalid and cannot be played." msgstr "Datoteka je neveljavna, zato je ni mogoče predvajati." msgid "This file is corrupt and cannot be played." msgstr "Datoteka je pokvarjena, zato je ni mogoče predvajati." msgid "Invalid atom size." msgstr "Neveljavna velikost atoma." msgid "This file is incomplete and cannot be played." msgstr "Datoteka ni popolna, zato je ni mogoče predvajati." msgid "The video in this file might not play correctly." msgstr "Video zapis v tej datoteki morda ne bo predvajan pravilno." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Datoteka vsebuje več pretokov. Predvajano bo le začetnih %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Ni mogoče najti podprtega pretoka. Najverjetneje je treba namestiti vstavek " "GStreamer RTSP za pretoke RealMedia." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Podprtega pretoka ni mogoče najti. Najverjetneje je treba omogočiti več " "protokolov prenosa ali pa manjka ustrezen vstavek GStreamer RTSP." msgid "Internal data flow error." msgstr "Notranja napaka pretočnosti podatkov." msgid "Volume" msgstr "Glasnost" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Visoki toni" msgid "Synth" msgstr "Sintetizator" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Zvočnik" msgid "Line-in" msgstr "Analogni vhod" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mešalnik" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Snemanje" msgid "In-gain" msgstr "Vhodna ojačitev" msgid "Out-gain" msgstr "Izhodna ojačitev" msgid "Line-1" msgstr "Analogni vhod 1" msgid "Line-2" msgstr "Analogni vhod 2" msgid "Line-3" msgstr "Analogni vhod 3" msgid "Digital-1" msgstr "Digitalni vhod 1" msgid "Digital-2" msgstr "Digitalni vhod 2" msgid "Digital-3" msgstr "Digitalni vhod 3" msgid "Phone-in" msgstr "Telefonski vhod" msgid "Phone-out" msgstr "Telefonski izhod" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Zaslon" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Zvočne naprave ni mogoče odpreti za predvajanje. Napravo uporablja drug " "program." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Zvočne naprave ni mogoče odpreti za predvajanje. Nimate dovoljenj za " "odpiranje naprave." msgid "Could not open audio device for playback." msgstr "Zvočne naprave ni mogoče odpreti za predvajanje." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Zvočne naprave ni mogoče odpreti za snemanje. Nimate dovoljenj za odpiranje " "naprave." msgid "Could not open audio device for recording." msgstr "Zvočne naprave ni mogoče odpreti za snemanje." msgid "Could not open audio device for mixer control handling." msgstr "Zvočne naprave ni mogoče odpreti za nadzor mešalnika." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Zvočne naprave ni mogoče odpreti za nadzor mešalnika. Predmet ne podpira " "trenutne različice sistema Open Sound System." msgid "Master" msgstr "Glavni" msgid "Front" msgstr "Sprednji" msgid "Rear" msgstr "Zadnji" msgid "Headphones" msgstr "Slušalke" msgid "Center" msgstr "Sredinski" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Prostorski" msgid "Side" msgstr "Stranski" msgid "Built-in Speaker" msgstr "Vgrajen zvočnik" msgid "AUX 1 Out" msgstr "Izhod AUX 1" msgid "AUX 2 Out" msgstr "Izhod AUX 2" msgid "AUX Out" msgstr "Izhod AUX" msgid "3D Depth" msgstr "3D globina" msgid "3D Center" msgstr "3D sredina" msgid "3D Enhance" msgstr "3D izboljšava" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Analogni izhod" msgid "Line In" msgstr "Analogni vhod" msgid "Internal CD" msgstr "Notranji CD" msgid "Video In" msgstr "Video vhod" msgid "AUX 1 In" msgstr "Vhod AUX 1" msgid "AUX 2 In" msgstr "Vhod AUX 2" msgid "AUX In" msgstr "Vhod AUX" msgid "Record Gain" msgstr "Ojačitev snemanja" msgid "Output Gain" msgstr "Ojačitev izhoda" msgid "Microphone Boost" msgstr "Ojačitev mikrofona" msgid "Loopback" msgstr "Povratna zanka" msgid "Diagnostic" msgstr "Diagnostika" msgid "Bass Boost" msgstr "Ojačitev basov" msgid "Playback Ports" msgstr "Vrata predvajanja" msgid "Input" msgstr "Vhod" msgid "Record Source" msgstr "Snemaj vir" msgid "Monitor Source" msgstr "Nadzoruj vir" msgid "Keyboard Beep" msgstr "Pisk tipkovnice" msgid "Simulate Stereo" msgstr "Simuliran stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Prostorski zvok" msgid "Microphone Gain" msgstr "Ojačitev mikrofona" msgid "Speaker Source" msgstr "Vir zvočnika" msgid "Microphone Source" msgstr "Vir mikrofona" msgid "Jack" msgstr "Priključek" msgid "Center / LFE" msgstr "Srednji / LFE" msgid "Stereo Mix" msgstr "Stereo mešanje" msgid "Mono Mix" msgstr "Mono mešanje" msgid "Input Mix" msgstr "Mešanje vhoda" msgid "SPDIF In" msgstr "Vhod SPDIF" msgid "SPDIF Out" msgstr "Izhod SPDIF" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digitalni izhod" msgid "Digital In" msgstr "Digitalni vhod" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Prostoročna slušalka" msgid "Other" msgstr "Drugo" msgid "None" msgstr "Brez" msgid "On" msgstr "Vključeno" msgid "Off" msgstr "Izključeno" msgid "Mute" msgstr "Nemo" msgid "Fast" msgstr "Hitro" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Zelo nizko" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Nizko" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Srednje" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Visoko" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Zelo visoko" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Proizvodnja" msgid "Front Panel Microphone" msgstr "Mikrofon spredaj" msgid "Front Panel Line In" msgstr "Analogni vhod spredaj" msgid "Front Panel Headphones" msgstr "Slušalke spredaj" msgid "Front Panel Line Out" msgstr "Analogni izhod spredaj" msgid "Green Connector" msgstr "Zeleni priključek" msgid "Pink Connector" msgstr "Roza priključek" msgid "Blue Connector" msgstr "Modri priključek" msgid "White Connector" msgstr "Beli priključek" msgid "Black Connector" msgstr "Črni priključek" msgid "Gray Connector" msgstr "Sivi priključek" msgid "Orange Connector" msgstr "Oranžni priključek" msgid "Red Connector" msgstr "Rdeči priključek" msgid "Yellow Connector" msgstr "Rumeni priključek" msgid "Green Front Panel Connector" msgstr "Zeleni priključek spredaj" msgid "Pink Front Panel Connector" msgstr "Roza priključek spredaj" msgid "Blue Front Panel Connector" msgstr "Modri priključek spredaj" msgid "White Front Panel Connector" msgstr "Beli priključek spredaj" msgid "Black Front Panel Connector" msgstr "Črni priključek spredaj" msgid "Gray Front Panel Connector" msgstr "Sivi priključek spredaj" msgid "Orange Front Panel Connector" msgstr "Oranžni priključek spredaj" msgid "Red Front Panel Connector" msgstr "Rdeči priključek spredaj" msgid "Yellow Front Panel Connector" msgstr "Rumeni priključek spredaj" msgid "Spread Output" msgstr "Razširi izhod" msgid "Downmix" msgstr "Zmanjševanje kanalov" msgid "Virtual Mixer Input" msgstr "Vhod navideznega mešalnika" msgid "Virtual Mixer Output" msgstr "Izhod navideznega mešalnika" msgid "Virtual Mixer Channels" msgstr "Kanali navideznega mešalnika" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Funkcija %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Funkcija %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Zvočne naprave ni mogoče odpreti za predvajanje. Predmet ne podpira trenutne " "različice sistema Open Sound System." msgid "Playback is not supported by this audio device." msgstr "Ta zvočna naprava ne podpira predvajanja." msgid "Audio playback error." msgstr "Napaka med predvajanjem zvoka." msgid "Recording is not supported by this audio device." msgstr "Snemanje s to zvočno napravo ni podprto." msgid "Error recording from audio device." msgstr "Napaka med snemanjem z zvočno napravo." msgid "Gain" msgstr "Ojačitev" msgid "Headphone" msgstr "Slušalke" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Napaka med branjem %d bajtov iz naprave '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" "Nepričakovana vrednost velikosti okvirja (%u). Pričakovana vrednost je %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Napaka med branjem %d bajtov na napravi '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Napaka med pridobivanjem zmožnosti naprave '%s': ni gonilnik v4l2. " "Preverite, če je gonilnik v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Napaka med poizvedovanjem atributov vhoda %d naprave %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Napaka med pridobivanjem nastavitev uglaševalnika %d naprave '%s'." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Napaka med poizvedovanjem uravnanosti naprave '%s'." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Napaka med pridobivanjem atributov nadzora naprave '%s'." #, c-format msgid "Cannot identify device '%s'." msgstr "Naprave '%s' ni mogoče določiti." #, c-format msgid "This isn't a device '%s'." msgstr "To ni naprava '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Naprave '%s' ni mogoče odpreti za branje in pisanje." #, c-format msgid "Device '%s' is not a capture device." msgstr "Naprava '%s' ni naprava za zajemanje." #, c-format msgid "Device '%s' is not a output device." msgstr "Naprava '%s' ni izhodna naprava." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Napaka med nastavljanjem uravnanosti naprave '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Napaka med pridobivanjem trenutne frekvence uglaševalnika naprave '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Napaka med nastavljanjem frekvence uglaševalnika naprave '%s' na %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Napaka med pridobivanjem moči signala za napravo '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Napaka med pridobivanjem vrednosti za nadzor %d na napravi '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Napaka med nastavljanjem vrednosti %d za nadzor %d na napravi '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Napaka med pridobivanjem trenutnega vhoda naprave '%s'. Morda je radijska " "naprava." #, c-format msgid "Failed to set input %d on device %s." msgstr "Napaka med nastavljanjem vhoda %d na napravi %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Napaka med pridobivanjem trenutnega izhoda naprave '%s'. Morda je radijska " "naprava." #, c-format msgid "Failed to set output %d on device %s." msgstr "Napaka med nastavljanjem izhoda %d na napravi %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Medpomnilnika na napravi '%s' ni mogoče uvrstiti." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Napaka med poskusom pridobivanja video sličic z naprave '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" "Neuspešen zagon po %d poskusih na napravi %s. Sporočilo sistemske napake: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Parametrov na napravi '%s' ni mogoče pridobiti." msgid "Video input device did not accept new frame rate setting." msgstr "" "Vhodni video napravi ni mogoče določiti novih nastavitev hitrosti sličic." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Medpomnilnika naprave '%s' ni mogoče preslikati" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Gonilnik naprave '%s' ne podpira nobenega znanega načina zajemanja." msgid "Changing resolution at runtime is not yet supported." msgstr "Spreminjanje ločljivosti med delovanjem še ni podprto." msgid "Cannot operate without a clock" msgstr "Delovanje brez ure ni mogoče" #~ msgid "Describes the selected input element." #~ msgstr "Opisuje izbran vnosni predmet." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "Opisuje izbran izhodni predmet za zvočne/video konference." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Opisuje izbran predmet za glasbo in filme." #~ msgid "Describes the selected output element." #~ msgstr "Opisuje izbran izhodni predmet." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "GStreamer odvod za zvočne/video konference" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "GStreamer odvod glasbe in filmov" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "S programom GStreamer je mogoče predvajati zvok z uporabo več izhodnih " #~ "predmetov. Med razpoložljivi so ossink, edsink in alsasink. Audiosink je " #~ "lahko delni cevovod namesto enega predmeta." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "S programom GStreamer je mogoče predvajati video z uporabo več izhodnih " #~ "predmetov. Med razpoložljivimi so xvimagesink, ximagesink, sdlvideosink " #~ "in aasink. Videosink je lahko delni cevovod namesto enega predmeta." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "S programom GStreamer je mogoče v cevovod vključiti vstavek predočenja za " #~ "pretvorbo zvočnega pretoka v slikovni učinek. Privzeti vstavek je Goom, " #~ "kmalu pa mu bodo sledili še drugi. Vstavek predočenja je lahko delni " #~ "cevovod namesto samo enega predmeta." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "S programom GStreamer je mogoče posneti zvok z uporabo več vhodnih " #~ "predmetov. Med razpoložljivimi so osssrc, esdsrc in alsasrc. Vir zvoka je " #~ "lahko delni cevovod namesto samo enega predmeta." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "S programom GStreamer je mogoče posneti video z uporabo več vhodnih " #~ "predmetov. Med razpoložljivimi sta v4lsrc in videotestsrc. Vir videa je " #~ "lahko delni cevovod namesto samo enega predmeta." #~ msgid "default GStreamer audio source" #~ msgstr "privzeti vir zvoka" #~ msgid "default GStreamer audiosink" #~ msgstr "privzeti zvočni ponor" #~ msgid "default GStreamer video source" #~ msgstr "privzeti vir videa" #~ msgid "default GStreamer videosink" #~ msgstr "privzeti video ponor" #~ msgid "default GStreamer visualization plugin" #~ msgstr "privzeti vstavek predočenja" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "opis GStreamer zvočnega ponora za zvočno/video konferenco" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "opis GStreamer zvočnega ponora za glasbo in filme" #~ msgid "description for default GStreamer audiosink" #~ msgstr "opis za privzeti GStreamer zvočni ponor" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "opis za privzeti GStreamer zvočni vir" gst-plugins-good-0.10.31/po/or.po0000644000175000017500000005042511720565342013410 00000000000000# Oriya translation of gst-plugins-0.8.3.pot. # Copyright (C) 2004, Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-0.8.3 package. # Gora Mohanty , 2004. # $Id: or.po,v 1.30 2008-04-23 23:18:43 thaytan Exp $ # msgid "" msgstr "" "Project-Id-Version: gst-plugins-0.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2004-09-27 13:32+0530\n" "Last-Translator: Gora Mohanty \n" "Language-Team: Oriya \n" "Language: or\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "" msgid "Failed to decode JPEG image" msgstr "" #, fuzzy msgid "Could not connect to server" msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #, fuzzy msgid "Server does not support seeking." msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." #, fuzzy msgid "Could not resolve server name." msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #, fuzzy msgid "Could not establish connection to server." msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "ନିବେଶ ଧ୍ବନି ନାହିଁ ବା ଅବୈଧ ଅଛି. ଏ.ଭି.ଆଇ. ଧାରା ଭ୍ରଷ୍ଟ ହୋଇଯିବ." msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "ପ୍ରବଳତା" msgid "Bass" msgstr "ଅନୁଚ୍ଚ ସ୍ବର" msgid "Treble" msgstr "ଉଚ୍ଚ ସ୍ବର" msgid "Synth" msgstr "ସିନ୍ଥେସାଇଜର" msgid "PCM" msgstr "ପି.ସି.ଏମ." msgid "Speaker" msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" msgid "Line-in" msgstr "ଲାଇନ-ଇନ" msgid "Microphone" msgstr "ମାଇକ୍ରୋଫୋନ୍" msgid "CD" msgstr "ସି.ଡି." msgid "Mixer" msgstr "ମିଶ୍ରଣ ଯନ୍ତ୍ର" msgid "PCM-2" msgstr "ପି.ସି.ଏମ.-୨" msgid "Record" msgstr "ଅନୁଲିପିକରଣ" msgid "In-gain" msgstr "ନିବେଶ-ବୃଦ୍ଧି" msgid "Out-gain" msgstr "ନିର୍ଗମ-ବୃଦ୍ଧି" msgid "Line-1" msgstr "ଲାଇନ-୧" msgid "Line-2" msgstr "ଲାଇନ-୨" msgid "Line-3" msgstr "ଲାଇନ-୩" msgid "Digital-1" msgstr "ସାଂଖ୍ଯିକ-୧" msgid "Digital-2" msgstr "ସାଂଖ୍ଯିକ-୨" msgid "Digital-3" msgstr "ସାଂଖ୍ଯିକ-୩" msgid "Phone-in" msgstr "ଫୋନ-ନିବେଶ" msgid "Phone-out" msgstr "ଫୋନ-ନିର୍ଗମ" msgid "Video" msgstr "ଭିଡିଓ" msgid "Radio" msgstr "ରେଡିଓ" msgid "Monitor" msgstr "ପ୍ରଦର୍ଶିକା" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" #, fuzzy msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy msgid "Could not open audio device for playback." msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy msgid "Could not open audio device for recording." msgstr "ସି.ଡି. ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." msgid "Master" msgstr "" msgid "Front" msgstr "" #, fuzzy msgid "Rear" msgstr "ଅନୁଲିପିକରଣ" msgid "Headphones" msgstr "" msgid "Center" msgstr "" msgid "LFE" msgstr "" msgid "Surround" msgstr "" #, fuzzy msgid "Side" msgstr "ଭିଡିଓ" #, fuzzy msgid "Built-in Speaker" msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "" msgid "Line Out" msgstr "" #, fuzzy msgid "Line In" msgstr "ଲାଇନ-ଇନ" msgid "Internal CD" msgstr "" msgid "Video In" msgstr "" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" msgid "Record Gain" msgstr "" #, fuzzy msgid "Output Gain" msgstr "ନିର୍ଗମ-ବୃଦ୍ଧି" #, fuzzy msgid "Microphone Boost" msgstr "ମାଇକ୍ରୋଫୋନ୍" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" msgid "Record Source" msgstr "" #, fuzzy msgid "Monitor Source" msgstr "ପ୍ରଦର୍ଶିକା" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "" msgid "Surround Sound" msgstr "" #, fuzzy msgid "Microphone Gain" msgstr "ମାଇକ୍ରୋଫୋନ୍" #, fuzzy msgid "Speaker Source" msgstr "ସ୍ବରବର୍ଦ୍ଧକ ୟନ୍ତ୍ର" #, fuzzy msgid "Microphone Source" msgstr "ମାଇକ୍ରୋଫୋନ୍" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" #, fuzzy msgid "Microphone 1" msgstr "ମାଇକ୍ରୋଫୋନ୍" #, fuzzy msgid "Microphone 2" msgstr "ମାଇକ୍ରୋଫୋନ୍" #, fuzzy msgid "Digital Out" msgstr "ସାଂଖ୍ଯିକ-୧" #, fuzzy msgid "Digital In" msgstr "ସାଂଖ୍ଯିକ-୧" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Mute" msgstr "" msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" #, fuzzy msgid "Front Panel Microphone" msgstr "ମାଇକ୍ରୋଫୋନ୍" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, fuzzy, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, fuzzy, c-format msgid "Cannot identify device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରେ ଲେଖିହେଲା ନାହିଁ." #, c-format msgid "This isn't a device '%s'." msgstr "" #, fuzzy, c-format msgid "Could not open device '%s' for reading and writing." msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ଓ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "Device '%s' is not a capture device." msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, fuzzy, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, fuzzy, c-format msgid "Failed to set input %d on device %s." msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, fuzzy, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, fuzzy, c-format msgid "Could not get parameters on device '%s'" msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." msgid "Video input device did not accept new frame rate setting." msgstr "" #, fuzzy, c-format msgid "Could not map buffers from device '%s'" msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" #, fuzzy #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "\"%s\" ଯନ୍ତ୍ର ଗୋଟିଏ ଅନୁଲିପିକାର ନୁହେଁ." #, fuzzy #~ msgid "Could not get buffers from device '%s'." #~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, fuzzy #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #, fuzzy #~ msgid "Could not read from CD." #~ msgstr "\"%s\" ଫାଇଲ ଲେଖିହେଲା ନାହିଁ." #, fuzzy #~ msgid "Disc is not an Audio CD." #~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇ ନାହିଁ." #, fuzzy #~ msgid "Could not set parameters on device '%s'" #~ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ." #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "\"%s\" ଫାଇଲ ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #~ msgid "Error closing file \"%s\"." #~ msgstr "\"%s\" ଫାଇଲ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "\"%s\" ଫାଇଲ ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #~ msgid "No filename specified." #~ msgstr "କୌଣସି ଫାଇଲନାମ ଉଲ୍ଲେଖିତ ହୋଇ ନାହିଁ." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "\"%s\" ନିୟନ୍ତ୍ରଣ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #~ msgid "Could not configure audio device \"%s\"." #~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ର ବିନ୍ଯାସ କରିହେଲା ନାହିଁ." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "\"%s\" ଧ୍ବନି ଯନ୍ତ୍ରକୁ %d ହର୍ଜରେ ବିନ୍ଯାସ କରିହେଲା ନାହିଁ." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #~ msgid "Could not close video device \"%s\"." #~ msgstr "\"%s\" ଭିଡିଓ ଯନ୍ତ୍ର ବନ୍ଦ କରିହେଲା ନାହିଁ." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "\"%s\" ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ର ପୂର୍ବରୁ ଅନ୍ଯ କାରିକା ଦ୍ବାରା ବ୍ଯବହାର କରାଯାଉଛି." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "\"%s\" ଯନ୍ତ୍ର ବ୍ଯବହାର କରିହେଲା ନାହିଁ, ତାହାର ଅନୁମତି ଦେଖନ୍ତୁ." #~ msgid "Device \"%s\" does not exist." #~ msgstr "\"%s\" ଯନ୍ତ୍ର ଅବସ୍ଥିତ ନାହିଁ." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "\"%s\" ଯନ୍ତ୍ର ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "\"%s\" ଯନ୍ତ୍ର ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #~ msgid "Your OSS device could not be probed correctly" #~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ." #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ପଢ଼ିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ." #, fuzzy #~ msgid "No filename given." #~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ" #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ଲେଖିବା ପାଇଁ ଖୋଲିହେଲା ନାହିଁ: %s." #~ msgid "No filename given" #~ msgstr "କୌଣସି ଫାଇଲନାମ ଦିଆଯାଇ ନାହିଁ" #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "ଭି.ଏଫ.ଏସ. ଫାଇଲ \"%s\" ବନ୍ଦ କରିହେଲା ନାହିଁ." #, fuzzy #~ msgid "Your OSS device doesn't support mono or stereo." #~ msgstr "ଆପଣଙ୍କର ଓ.ଏସ.ଏସ. ଯନ୍ତ୍ରର ଠିକ ଭାବରେ ଅନୁସନ୍ଧାନ କରିହେଲା ନାହିଁ." #~ msgid "No device specified." #~ msgstr "କୌଣସି ଯନ୍ତ୍ର ଉଲ୍ଲେଖିତ କରାଯାଇ ନାହିଁ." #~ msgid "Device is open." #~ msgstr "ଯନ୍ତ୍ର ଖୋଲାଯାଇଚ୍ଛି." #~ msgid "" #~ "The %s element could not be found. This element is essential for " #~ "playback. Please install the right plug-in and verify that it works by " #~ "running 'gst-inspect %s'" #~ msgstr "" #~ "%s ଉପାଦାନ ମିଳିଲା ନାହିଁ. ପୁନଃପ୍ରଦର୍ଶନ ପାଇଁ ଏହି ଉପାଦାନଟି ଆବଶ୍ଯକ. ଦୟା କରି ସଠିକ ପ୍ଲଗ୍ଇନ୍ " #~ "ସ୍ଥାପିତ କରନ୍ତୁ, ଓ 'gst-inspect %s' ଚଳାଇ ଯାଞ୍ଚ କରନ୍ତୁ କି ଏହା କାର୍ଯ୍ଯକାରୀ ଅଛି" #~ msgid "" #~ "No usable colorspace element could be found.\n" #~ "Please install one and restart." #~ msgstr "" #~ "କୌଣସି ବ୍ଯବହାରଯୋଗ୍ଯ ରଙ୍ଗକ୍ଷେତ୍ର ଉପାଦାନ ମିଳିଲା ନାହିଁ.\n" #~ "ଦୟା କରି ଗୋଟିଏ ଉପାଦାନ ସ୍ଥାପିତ କରି ପୁନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ." gst-plugins-good-0.10.31/po/lv.po0000644000175000017500000003720311720565342013410 00000000000000# Latvian translation of gst-plugins. # This file is put in the public domain. # # Arvis Lācis , 2009. # Rihards Prieditis , 2010. # Rihards Prieditis , 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-09-02 11:23-0000\n" "Last-Translator: Rihards Priedītis \n" "Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" "X-Generator: Lokalize 1.0\n" msgid "Could not establish connection to sound server" msgstr "Nevar izveidot savienojumu ar skaņas serveri" msgid "Failed to query sound server capabilities" msgstr "Neizdevās noskaidrot skaņas servera iespējas" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "\"%s\"ko \"%s\"" msgid "Internal data stream error." msgstr "Iekšējās datu plūsmas kļūda." msgid "Failed to decode JPEG image" msgstr "Neizdevās atkodēt JPEG attēlu" msgid "Could not connect to server" msgstr "Nevar savienoties ar serveri" msgid "Server does not support seeking." msgstr "Serveris neatbalsta meklēšanu." msgid "Could not resolve server name." msgstr "Nevar atpazīt servera nosaukumu." msgid "Could not establish connection to server." msgstr "Nevar izveidot savienojumu ar serveri." msgid "Secure connection setup failed." msgstr "Drošā savienojuma izveidošana neizdevās." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Notika tīkla kļūda, vai serveris negaidīti aizvēra savienojumu." msgid "Server sent bad data." msgstr "Serveris nosūtija sliktus datus." msgid "No URL set." msgstr "URL nav uzstādīts." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Nav neviena vai nederīgs ievades audio, AVI straume tiks bojāta." msgid "This file contains no playable streams." msgstr "Šis fails nesatur nevienu atskaņojamu straumi." msgid "This file is invalid and cannot be played." msgstr "Šis fails ir nederīgs un nevar tikt atskaņots." msgid "This file is corrupt and cannot be played." msgstr "Šis fails ir bojāts un nevar tikt atskaņots." msgid "Invalid atom size." msgstr "Nederīgs atoma izmērs." msgid "This file is incomplete and cannot be played." msgstr "Šis pails ir nepabeigts un nevar tikt atskaņots." msgid "The video in this file might not play correctly." msgstr "Video šajā failā var tikt atskaņots nepareizi." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Šis fails satur pārāk daudz straumes. Tiek atskaņota tikai pirmā %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Netika atrasta atbalstīta straume. Iespējams jums jāinstalē GStreamer RTSP " "paplašinājuma spraudni priekš Real media straumēm." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Netika atrasta atbalstīta straume. Jums iespējams jāatļauj vairāk transporta " "protokoli vai arī trūkst GStreamer RTSP paplašinājuma spraudnis. " msgid "Internal data flow error." msgstr "Iekšējā datu plūsmas kļūda." msgid "Volume" msgstr "Skaļums" msgid "Bass" msgstr "Basi" msgid "Treble" msgstr "Diskants" msgid "Synth" msgstr "Sintēze" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Skaļrunis" msgid "Line-in" msgstr "Skaņas ieeja" msgid "Microphone" msgstr "Mikrofons" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Jaucējs" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Ierakstīt" msgid "In-gain" msgstr "Ievades pieaugums" msgid "Out-gain" msgstr "Izvades pieaugums" msgid "Line-1" msgstr "Līnija-1" msgid "Line-2" msgstr "Līnija-2" msgid "Line-3" msgstr "Līnija-3" msgid "Digital-1" msgstr "Digitālais-1" msgid "Digital-2" msgstr "Digitālais-2" msgid "Digital-3" msgstr "Digitālais-3" msgid "Phone-in" msgstr "Telefona ievade" msgid "Phone-out" msgstr "Telefona izvade" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitors" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Nav iespējams atvērt audio ierīci atskaņošanai. Ierīci pašlaik izmanto cita " "programma." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Nav iespējams atvērt audio ierīci atskaņošanai. Jums nav nepieciešamās " "atļaujas, lai atvērtu ierīci." msgid "Could not open audio device for playback." msgstr "Nav iespējams atvērt audio ierīci atskaņošanai." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Nevar atvērt audio ierīci ierakstīšanai. Jums nav nepieciešamo piekļuves " "tiesību, lai atvērtu ierīci." msgid "Could not open audio device for recording." msgstr "Nevarēja atvērt audio ierīci ierakstīšanai." msgid "Could not open audio device for mixer control handling." msgstr "Nevarēja atvērt audio ierīci miksera kontroles vadīšanai." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nevar atvērt audio ierīci miksera kontrolas vadīšanai. Šī Atvertās Skaņas " "Sistemas versija neatbalsta šo elementu." msgid "Master" msgstr "Galvenais" msgid "Front" msgstr "Priekšējais" msgid "Rear" msgstr "Sāni" msgid "Headphones" msgstr "Austiņas" msgid "Center" msgstr "Centrs" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Ieskaujošā" msgid "Side" msgstr "Puse" msgid "Built-in Speaker" msgstr "Iebūvētais skaļrunis" msgid "AUX 1 Out" msgstr "AUX 1 izeja" msgid "AUX 2 Out" msgstr "AUX 2 izeja" msgid "AUX Out" msgstr "AUX izeja" msgid "3D Depth" msgstr "3D dziļums" msgid "3D Center" msgstr "3D centrs" msgid "3D Enhance" msgstr "3D uzlabojums" msgid "Telephone" msgstr "Telefons" msgid "Line Out" msgstr "Skaņas izeja" msgid "Line In" msgstr "Līnijas ieeja" msgid "Internal CD" msgstr "Iekšējais CD" msgid "Video In" msgstr "Video ieeja" msgid "AUX 1 In" msgstr "AUX 1 ieeja" msgid "AUX 2 In" msgstr "AUX 2 ieeja" msgid "AUX In" msgstr "AUC ieeja" msgid "Record Gain" msgstr "Ierakstīta pieaugums" msgid "Output Gain" msgstr "Izvada pieaugums" msgid "Microphone Boost" msgstr "Mikrofona pastiprinājums" msgid "Loopback" msgstr "Atpakaļcikls" msgid "Diagnostic" msgstr "Diagnostika" msgid "Bass Boost" msgstr "Bassa pastiprinājums" msgid "Playback Ports" msgstr "Atskaņošanas porti" msgid "Input" msgstr "Ievads" msgid "Record Source" msgstr "Ierakstīšanas avots" msgid "Monitor Source" msgstr "Monitora avots" msgid "Keyboard Beep" msgstr "Klaviatūras pīkstieni" msgid "Simulate Stereo" msgstr "Simulēt stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Ieskaujošā skaņa" msgid "Microphone Gain" msgstr "Mikrofona pieaugums" msgid "Speaker Source" msgstr "Skaļruņa avots" msgid "Microphone Source" msgstr "Mikrofona avots" msgid "Jack" msgstr "Ligzda" msgid "Center / LFE" msgstr "Centrs / LFE" msgid "Stereo Mix" msgstr "Stereo mikseris" msgid "Mono Mix" msgstr "Mono miskeris" msgid "Input Mix" msgstr "Ieejas mikseris" msgid "SPDIF In" msgstr "SPDIF ieeja" msgid "SPDIF Out" msgstr "SPDIF izeja" msgid "Microphone 1" msgstr "Mikrofons 1" msgid "Microphone 2" msgstr "Mikrofons 2" msgid "Digital Out" msgstr "Digitālā izeja" msgid "Digital In" msgstr "Digitālā ieeja" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modēms" msgid "Handset" msgstr "Klausule" msgid "Other" msgstr "Cits" msgid "None" msgstr "Nekas" msgid "On" msgstr "Ieslēgts" msgid "Off" msgstr "Izslēgts" msgid "Mute" msgstr "Klusums" msgid "Fast" msgstr "Ātrs" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Ļoti zems" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Zems" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Vidējs" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Augsts" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Ļoti augsts" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produkcija" msgid "Front Panel Microphone" msgstr "Priekšējā paneļa mikrofons" msgid "Front Panel Line In" msgstr "Priekšējā paneļa ieejas līnija" msgid "Front Panel Headphones" msgstr "Priekšējā paneļa austiņas" msgid "Front Panel Line Out" msgstr "Priekšējā paneļa līnijas izeja" msgid "Green Connector" msgstr "Zaļais savienotājs" msgid "Pink Connector" msgstr "Rozā savienotājs" msgid "Blue Connector" msgstr "Zilais savienotājs" msgid "White Connector" msgstr "Baltais savienotājs" msgid "Black Connector" msgstr "Melnais savienotājs" msgid "Gray Connector" msgstr "Pelākais savienotājs" msgid "Orange Connector" msgstr "Oranžais savienotājs" msgid "Red Connector" msgstr "Sarkanais savienotājs" msgid "Yellow Connector" msgstr "Dzeltains savienotājs" msgid "Green Front Panel Connector" msgstr "Zaļais priekšējā paneļa savienotājs" msgid "Pink Front Panel Connector" msgstr "Rozā priekšējā paneļa savienotājs" msgid "Blue Front Panel Connector" msgstr "Zilais priekšējā paneļa savienotājs" msgid "White Front Panel Connector" msgstr "Baltais priekšējā paneļa savienotājs" msgid "Black Front Panel Connector" msgstr "Melnais priekšējā paneļa savienotājs" msgid "Gray Front Panel Connector" msgstr "Pelēkais priekšējā paneļa savienotājs" msgid "Orange Front Panel Connector" msgstr "Oranžais priekšējā paneļa savienotājs" msgid "Red Front Panel Connector" msgstr "Sarkanais priekšējā paneļa savienotājs" msgid "Yellow Front Panel Connector" msgstr "Dzeltenais priekšējā paneļa savienotājs" msgid "Spread Output" msgstr "Izplest izvadu" msgid "Downmix" msgstr "Lejupmiksēšana" msgid "Virtual Mixer Input" msgstr "Virtuālā miksera ievads" msgid "Virtual Mixer Output" msgstr "Virtuālā miksera izvads" msgid "Virtual Mixer Channels" msgstr "Virtuālā miksera kanāli" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d funkcija" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funkcija" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nav iespējams atvērt audio ierīci atskaņošanai. Šī Atvērtās Skaņas Sistemas " "versija neatbalsta šo elementu." msgid "Playback is not supported by this audio device." msgstr "Šī audio ierīce neatbalsta atskaņošanu." msgid "Audio playback error." msgstr "Audio atskaņošanas kļūda." msgid "Recording is not supported by this audio device." msgstr "Šī audio ierīce neatablsta ierkastīšanu." msgid "Error recording from audio device." msgstr "Kļūda ierakstot no audio iekārtas." msgid "Gain" msgstr "Pieaugums" msgid "Headphone" msgstr "Austiņas" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Radās kļūda nolasot %d baitus no ierīces \"%s\"." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Saņēmu negaidītu kadra izmēru %u, nevis %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Radās kļūda nolasot %d baitus no ierīces \"%s\"." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Radās kļūda saņemot ierīces \"%s\" iespējas: Iespējams tas nav v4I2 " "draiveris. Pārbaudiet vai tas ir v4I1 draiveris." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Neizdevās noteikt atribūtus ievadei %d no ierīces %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Neizdevās saņemt skaņotāja %d uzstādījumus no ierīces \"%s\"." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Neizdevās noskaidrot normu ierīcei \"%s\"." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Neizdevās iegūt kontroles atribūtus ierīcei \"%s\"." #, c-format msgid "Cannot identify device '%s'." msgstr "Nevar atpazīt ierīci \"%s\"" #, c-format msgid "This isn't a device '%s'." msgstr "Šī nav ierīce \"%s\"" #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nevarēja atvērt ierīci \"%s\" lasīšanai vai rakstīšanai." #, c-format msgid "Device '%s' is not a capture device." msgstr "Ierīce \"%s\" nav ierakstīšanas ierīce." #, c-format msgid "Device '%s' is not a output device." msgstr "Ierīce \"%s\" nav izvades ierīce." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Neizdevās uzstādīt normu ierīcei \"%s\"." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Neizdevās saņemt pašreizējo atkaņošanas frekvenci no ierīces \"%s\"." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Neizdevās uzstādīt ierīces \"%s\" pašreizējo atkaļošanas frekvenci uz %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Neizdevās saņemt signāla stiprumu no ierīces \"%s\"." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Neizdevās saņemt kontroles vērtību %d ierīcei \"%s\"." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Neizdevās uzstādīt vērtību %d kontrolei %d no ierīces \"%s\"." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Neizdevās saņemt pašreizējo ievadi no ierīces \"%s\". Iespējams tā ir radio " "ierīce" #, c-format msgid "Failed to set input %d on device %s." msgstr "Neizdevās uzstādīt ievadi %d uz ierīces %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Neizdevās saņemt pašreizējo izvadu no ierīces \"%s\". Iespējams tā ir radio " "ierīce" #, c-format msgid "Failed to set output %d on device %s." msgstr "Neizdevās uzstādīt izvadu %d uz ierīces %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nevar ierindod buferus ierīcē \"%s\"." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Neizdevās saņemt video kadrus no ierīces \"%s\"." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Neveiksme pēc %d mēģinājumiem. ierīce %s. sistēmas kļūda: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nevar nolasīt parametrus no ierīces \"%s\"" msgid "Video input device did not accept new frame rate setting." msgstr "Video ievades ierīce nepieņem jaunos kadra frekvences uzstādījumus." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nevar izvietot buferus no ierīces \"%s\"" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Ierīces \"%s\" draiveris neatbalsta nevienu zināmo ierakstīšanas metodi." msgid "Changing resolution at runtime is not yet supported." msgstr "Izšķirtspējas mainīšana izpildlaikā pašalik netiek atbalstīta." msgid "Cannot operate without a clock" msgstr "Nevar veikt darbības bez pulksteņa" gst-plugins-good-0.10.31/po/vi.gmo0000644000175000017500000003612511720565343013554 00000000000000l 01 @ L Yc lw    (9<Yx 4).'6&^7)=VgqW0*X3 $@#e      a(3&\"22 G(6p1.23;$o)@$#$5H3~.HWr     $26>GNU\dmqx   6?rINRUf  / $/5: A M0[    + 1D;0':*-?*m 9 , @ U \ l    """""" "# ###(#/#L# S#`#&w##&###1#3"$V$ [$Mf$/$X$L=%=%C%\ &i&;"'^''lw(3(d)=})?)?) ;*I*[*k*|****:q+;+0+A,V[,,h,c7-]->-Q8.B.9.=/oE/>/3/U(0J~00000 1#1?1AO11&11'12 22'20242F2K2 d2%q2%2 222 22222 3 33%3+313 83 F3T3f3333 3333y3h45 5555%6)6/6?6R6V6\6q66(66W6 17 >7H7L7P7i7Oz77'7 888#8?8 C8O8h8x888 88k8A395u9K939C+:Bo:(:: : : :;b;z;;; ;;);<'-< 8@<k`g' t[4i9{#^Mn|svO= q5c2je&zJLd?SxTu;P$6b,\AZ7WFQ- mVHDhG_fp+ U:>!a/01y(])Cl3wr*X. EoR}YN%~BI"K%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceAUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.23.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-10-03 18:48+1030 Last-Translator: Clytie Siddall Language-Team: Vietnamese Language: vi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: LocFactoryEditor 1.8 Chức năng %s %dChức năng %s« %s » bởi « %s »Tâm ba chiềuSâu ba chiềuTăng cường ba chiềuAUX 1 VàoAUX 1 RaAUX 2 VàoAUX 2 RaAUX VàoAUX RaLỗi phát lại âm thanh.TrầmTăng trầmĐầu nối màu đenMặt trước: đầu nối màu đenĐầu nối màu xanhMặt trước: đầu nối màu xanhLoa dựng sẵnCDKhông thể nhận diện thiết bị « %s ».Không thể thao tác khi không có đồng hồ.TâmTâm / LFEChưa hỗ trợ khả năng thay đổi độ phân giải trong khi chạy.Không thể kết nối tới máy phục vụKhông thể phụ thêm các bộ đệm vào hàng đợi trên thiết bị « %s ».Không thể thiết lập sự kết nối tới máy phục vụ âm thanhKhông thể lấy các tham số về thiết bị « %s ».Không thể ánh xạ các bộ đệm từ thiết bị « %s ».Không thể mở thiết bị âm thanh để quản lý điều khiển máy hoà tiếng.Không thể mở thiết bị âm thanh để quản lý điều khiển máy hoà tiếng. Phiên bản Hệ thống Âm thanh Mở không phải được yếu tố này hỗ trợ.Không thể mở thiết bị âm thanh để phát lại.Không thể mở thiết bị âm thanh để phát lại. Thiết bị này đang được một ứng dụng khác sử dụng.Không thể mở thiết bị âm thanh để phát lại. Phiên bản Hệ thống Âm thanh Mở này không được yếu tố này hỗ trợ.Không thể mở thiết bị âm thanh để phát lại. Bạn không có quyền mở thiết bị này.Không thể mở thiết bị âm thanh để thu.Không thể mở thiết bị âm thanh để thu. Bạn không có quyền mở thiết bị này.Không thể mở thiết bị « %s » để đọc và ghi.Thiết bị « %s » không phải là thiết bị bắt gì.Thiết bị « %s » không phải là thiết bị xuất ra.Chẩn đoánĐiện số VàoĐiện số RaĐoạn biến-1Đoạn biến-2Đoạn biến-3Hạ hoà tiếngGặp lỗi khi lấy khả năng của thiết bị « %s ». Nó không phải là trình điều khiển phiên bản 4l2. Kiểm tra nó là trình điều khiển phiên bản 4l1 không.Gặp lỗi khi đọc %d byte từ thiết bị « %s ».Gặp lỗi khi đọc %d byte trên thiết bị « %s ».Gặp lỗi khi thu từ thiết bị âm thanh.Lỗi sau %d lần thử. Thiết bị %s. Lỗi hệ thống: %sLỗi lấy các thuộc tính của bộ điều khiển trên thiết bị « %s ».Lỗi giải mã ảnh JPEGLỗi lấy kết nhập hiện thời vào thiết bị « %s ». Có thể là thiết bị thu thanh.Lỗi lấy tần số hiện thời của thiết bị điều hưởng cho thiết bị « %s ».Lỗi lấy thiết lập của thiết bị điều hưởng %d trên thiết bị « %s ».Lỗi lấy biên độ tín hiệu cho thiết bị « %s ».Lỗi lấy giá trị của bộ điều khiển %d trên thiết bị « %s ».Lỗi truy vấn khả năng của %d nhập trong thiết bị %sLỗi truy vấn chỉ tiêu trên thiết bị « %s ».Lỗi truy vấn khả năng của máy phục vụ âm thanhLỗi đặt tần số hiện thời của thiết bị điều hưởng cho thiết bị « %s » là %lu Hz.Lỗi đặt dữ liệu nhập %d vào thiết bị « %s ».Lỗi đặt chỉ tiêu cho thiết bị « %s ».Lỗi đặt giá trị %d của bộ điều khiển %d trên thiết bị « %s ».Lỗi khi thử lấy các khung ảnh động từ thiết bị « %s ».NhanhTrướcMặt trước: Tai ngheMặt trước: Dây VàoMặt trước: Dây RaMặt trước: Máy vi âmKhuếch đạiNhận được kích cỡ khung bất thường %u, thay cho %u.Đầu nối màu xámMặt trước: đầu nối màu xámĐầu nối màu lụcMặt trước: đầu nối màu lụcHDMICầm tayTai ngheTai ngheCaoVào-gia lượngVàoHoà tiếng đầu vàoCD ở trongLỗi luồng dữ liệu nội bộ.Lỗi luồng dữ liệu nội bộ.Ổ cắmBíp bàn phímLFEDây VàoDây RaDây-1Dây-2Dây-3Dây-vàoMạch nội bộThấpChủVừaMicrôMáy vi âm 1Máy vi âm 2Tăng máy vi âmKhuếch đại máy vi âmNguồn máy vi âmTrộnBộ điều giảiMàn hìnhTheo dõi nguồnHoà tiếng đơn nguồnCâmChưa có dữ liệu âm thanh nhập, hoặc dữ liệu âm thanh nhập không hợp lệ. Vì thế luồng AVI hư.Không tìm thấy luồng được hỗ trợ. Người dùng có thể cần cho phép thêm giao thức truyền, hoặc chưa cài đặt phần bổ sung RTSP Gstreamer đúng.Không tìm thấy luồng được hỗ trợ. Người dùng có thể cần phải cài đặt một phần bổ sung RTSP Gstreamer để xử lý luồng nhạc/phim loại Real.Không cóTắtBậtĐầu nối màu camMặt trước: đầu nối màu camKhácRa-gia lượngKhuếch đại RaPCMPCM-2Điện thoại-vàoĐiạn thoại-raĐầu nối màu hồngMặt trước: đầu nối màu hồngCổng phát lạiChức năng phát lại không phải được thiết bị âm thanh này hỗ trợ.Sản xuấtThu thanhSauGhiGhi lưu khuếch đạiGhi lưu nguồnChức năng thu không phải được thiết bị âm thanh này hỗ trợ.Đầu nối màu đỏMặt trước: đầu nối màu đỏSPDIF VàoSPDIF RaBênMô phỏng âm lập thểLoaNguồn loaMở rộng kết xuấtÂm lập thểHoả tiếng âm lập thểVòmÂm thanh vòmTổng hợpĐiện thoạiTrình điều khiển của thiết bị « %s » không hỗ trợ phương pháp bắt đã biết nào.Ảnh động trong tập tin này có thể không phát đúng.Tập tin này không chứa luồng có thể phát.Tập tin này chứa quá nhiều luồng nên chỉ phát %d đầu tiênTập tin này bị hỏng nên không thể phát.Tập tin này chưa hoàn thành nên không thể được phát.Tập tin này không hợp lệ nên không thể phát được.Không phải là thiết bị « %s ».CaoRất caoRất thấpẢnh độngẢnh động VàoThiết bị nhập ảnh động vào không chấp nhận thiết lập tốc độ khung mới.Hoà tiếng ảo : KênhHoà tiếng ảo : VàoHoà tiếng ảo : RaÂm lượngĐầu nối màu trắngMặt trước: đầu nối màu trắngĐầu nối màu vàngMặt trước: đầu nối màu vànggst-plugins-good-0.10.31/po/en_GB.gmo0000644000175000017500000000266511720565342014111 00000000000000%`af i s } 6  "(/7=DJsQ    !6)`ims |    BassCDDigital-1Digital-2Digital-3In-gainLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSpeakerSynthTrebleVideoVolumeProject-Id-Version: gst-plugins 0.8.1 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2004-04-26 10:41-0400 Last-Translator: Gareth Owen Language-Team: English (British) Language: en_GB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BassCDDigital-1Digital-2Digital-3In-gainLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSpeakerSynthTrebleVideoVolumegst-plugins-good-0.10.31/po/pt_BR.po0000644000175000017500000004010611720565342013771 00000000000000# Brazilian Portuguese translation of gst-plugins-good. # This file is distributed under the same license as the gst-plugins-good package. # Copyright (C) 2008-2011 Free Software Foundation, Inc. # Fabrício Godoy , 2008-2011. # # data flow -> fluxo de dados # streaming -> fluxo contínuo # clock -> temporizador # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-08 01:28-0300\n" "Last-Translator: Fabrício Godoy \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "Could not establish connection to sound server" msgstr "Não foi possível estabelecer uma conexão com servidor de som" msgid "Failed to query sound server capabilities" msgstr "Falha ao examinar os recursos do servidor de som" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "\"%s\" por \"%s\"" msgid "Internal data stream error." msgstr "Erro interno no fluxo de dados." msgid "Failed to decode JPEG image" msgstr "Falha ao decodificar a imagem JPEG" msgid "Could not connect to server" msgstr "Não foi possível conectar ao servidor" msgid "Server does not support seeking." msgstr "Nâo há suporte a busca pelo servidor." msgid "Could not resolve server name." msgstr "Não foi possível resolver o nome do servidor." msgid "Could not establish connection to server." msgstr "Não foi possível estabelecer uma conexão com servidor." msgid "Secure connection setup failed." msgstr "Configuração de conexão segura falhou." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Um erro de rede ocorreu, ou o servidor fechou a conexão inesperadamente." msgid "Server sent bad data." msgstr "O servidor enviou dados ruins." msgid "No URL set." msgstr "Nenhum URL definido." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Entrada de áudio nula ou inválida, o fluxo AVI pode estar corrompido." msgid "This file contains no playable streams." msgstr "Este arquivo não contêm fluxos reproduzíveis." msgid "This file is invalid and cannot be played." msgstr "Este arquivo é inválido e não pôde ser reproduzido." msgid "This file is corrupt and cannot be played." msgstr "Este arquivo está corrompido e não pôde ser reproduzido." msgid "Invalid atom size." msgstr "Tamanho de Atom inválido." msgid "This file is incomplete and cannot be played." msgstr "Este arquivo está incompleto e não pôde ser reproduzido." msgid "The video in this file might not play correctly." msgstr "O vídeo neste arquivo pode não ser reproduzido corretamente." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Este arquivo contêm muitos fluxos. Apenas reproduzindo o primeiro %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nenhum fluxo com suporte foi localizado. Você pode precisar instalar um plug-" "in de extensão GStreamer RTSP para fluxos Real media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nenhum fluxo com suporte foi localizado. Talvez haja necessidade de que mais " "protocolos de transporte sejam permitidos ou senão o plug-in de extensão " "GStreamer RTSP pode estar incorreto." msgid "Internal data flow error." msgstr "Erro interno no fluxo de dados." msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Grave" msgid "Treble" msgstr "Agudo" msgid "Synth" msgstr "Sintetizador" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Alto-falante" msgid "Line-in" msgstr "Entrada de linha" msgid "Microphone" msgstr "Microfone" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Gravação" msgid "In-gain" msgstr "Ganho de entrada" msgid "Out-gain" msgstr "Ganho de saída" msgid "Line-1" msgstr "Linha 1" msgid "Line-2" msgstr "Linha 2" msgid "Line-3" msgstr "Linha 3" msgid "Digital-1" msgstr "Digital 1" msgid "Digital-2" msgstr "Digital 2" msgid "Digital-3" msgstr "Digital 3" msgid "Phone-in" msgstr "Entrada de fone" msgid "Phone-out" msgstr "Saída de fone" msgid "Video" msgstr "Vídeo" msgid "Radio" msgstr "Rádio" msgid "Monitor" msgstr "Monitorador" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Não foi possível abrir o dispositivo de áudio para reprodução. O dispositivo " "está sendo usado por outro aplicativo." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Não foi possível abrir o dispositivo de áudio para reprodução. Você não tem " "permissão para abrir o dispositivo." msgid "Could not open audio device for playback." msgstr "Não foi possível abrir o dispositivo de áudio para reprodução." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Não foi possível abrir o dispositivo de áudio para gravação. Você não tem " "permissão para abrir o dispositivo." msgid "Could not open audio device for recording." msgstr "Não foi possível abrir o dispositivo de áudio para gravação." msgid "Could not open audio device for mixer control handling." msgstr "" "Não foi possível abrir o dispositivo de áudio para manipulação do " "controlador do mixer." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Não foi possível abrir o dispositivo de áudio para manipulação do " "controlador do mixer. Não há suporte a este elemento com esta versão do " "Sistema Aberto de Som (OSS)." msgid "Master" msgstr "Principal" msgid "Front" msgstr "Frontal" msgid "Rear" msgstr "Traseira" msgid "Headphones" msgstr "Fones de ouvido" msgid "Center" msgstr "Central" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Lateral" msgid "Built-in Speaker" msgstr "Alto-falante interno" msgid "AUX 1 Out" msgstr "Saída aux. 1" msgid "AUX 2 Out" msgstr "Saída aux. 2" msgid "AUX Out" msgstr "Saída aux." msgid "3D Depth" msgstr "Profundidade 3D" msgid "3D Center" msgstr "3D central" msgid "3D Enhance" msgstr "Realce 3D" msgid "Telephone" msgstr "Telefone" msgid "Line Out" msgstr "Saída de linha" msgid "Line In" msgstr "Entrada de linha" msgid "Internal CD" msgstr "CD interno" msgid "Video In" msgstr "Entrada de vídeo" msgid "AUX 1 In" msgstr "Entrada aux. 1" msgid "AUX 2 In" msgstr "Entrada aux. 2" msgid "AUX In" msgstr "Entrada aux." msgid "Record Gain" msgstr "Ganho de gravação" msgid "Output Gain" msgstr "Ganho de saída" msgid "Microphone Boost" msgstr "Aumento do microfone" msgid "Loopback" msgstr "Loopback" msgid "Diagnostic" msgstr "Diagnóstico" msgid "Bass Boost" msgstr "Aumento de graves" msgid "Playback Ports" msgstr "Portas de reprodução" msgid "Input" msgstr "Entrada" msgid "Record Source" msgstr "Origem de gravação" msgid "Monitor Source" msgstr "Origem de monitoração" msgid "Keyboard Beep" msgstr "Bip do teclado" msgid "Simulate Stereo" msgstr "Simular estéreo" msgid "Stereo" msgstr "Estéreo" msgid "Surround Sound" msgstr "Som surround" msgid "Microphone Gain" msgstr "Ganho do microfone" msgid "Speaker Source" msgstr "Origem do alto-falante" msgid "Microphone Source" msgstr "Origem do microfone" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Central/LFE" msgid "Stereo Mix" msgstr "Mixagem estéreo" msgid "Mono Mix" msgstr "Mixagem mono" msgid "Input Mix" msgstr "Mixagem de entrada" msgid "SPDIF In" msgstr "Entrada SPDIF" msgid "SPDIF Out" msgstr "Saída SPDIF" msgid "Microphone 1" msgstr "Microfone 1" msgid "Microphone 2" msgstr "Microfone 2" msgid "Digital Out" msgstr "Saída digital" msgid "Digital In" msgstr "Entrada digital" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Monofone" msgid "Other" msgstr "Outro" msgid "None" msgstr "Nenhum" msgid "On" msgstr "Ligado" msgid "Off" msgstr "Desligado" msgid "Mute" msgstr "Mudo" msgid "Fast" msgstr "Rápido" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Muito baixa" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Baixa" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Média" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Alta" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Muito alta" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produção" msgid "Front Panel Microphone" msgstr "Microfone do painel frontal" msgid "Front Panel Line In" msgstr "Entrada de linha do painel frontal" msgid "Front Panel Headphones" msgstr "Fones de ouvido do painel frontal" msgid "Front Panel Line Out" msgstr "Saída de linha do painel frontal" msgid "Green Connector" msgstr "Conector verde" msgid "Pink Connector" msgstr "Conector rosa" msgid "Blue Connector" msgstr "Conector azul" msgid "White Connector" msgstr "Conector branco" msgid "Black Connector" msgstr "Conector preto" msgid "Gray Connector" msgstr "Conector cinza" msgid "Orange Connector" msgstr "Conector laranja" msgid "Red Connector" msgstr "Conector vermelho" msgid "Yellow Connector" msgstr "Conector amarelo" msgid "Green Front Panel Connector" msgstr "Conector verde do painel frontal" msgid "Pink Front Panel Connector" msgstr "Conector rosa do painel frontal" msgid "Blue Front Panel Connector" msgstr "Conector azul do painel frontal" msgid "White Front Panel Connector" msgstr "Conector branco do painel frontal" msgid "Black Front Panel Connector" msgstr "Conector preto do painel frontal" msgid "Gray Front Panel Connector" msgstr "Conector cinza do painel frontal" msgid "Orange Front Panel Connector" msgstr "Conector laranja do painel frontal" msgid "Red Front Panel Connector" msgstr "Conector vermelho do painel frontal" msgid "Yellow Front Panel Connector" msgstr "Conector amarelo do painel frontal" msgid "Spread Output" msgstr "Saída comum" msgid "Downmix" msgstr "Mesclar canais" msgid "Virtual Mixer Input" msgstr "Entrada do mixer virtual" msgid "Virtual Mixer Output" msgstr "Saída do mixer virtual" msgid "Virtual Mixer Channels" msgstr "Canais do mixer virtual" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Não foi possível abrir o dispositivo de áudio para reprodução. Não há " "suporte a este elemento nesta versão do Sistema Aberto de Som (OSS)." msgid "Playback is not supported by this audio device." msgstr "Não há suporte a reprodução por este dispositivo de áudio." msgid "Audio playback error." msgstr "Erro de reprodução de áudio." msgid "Recording is not supported by this audio device." msgstr "Não há suporte a gravação por este dispositivo de áudio." msgid "Error recording from audio device." msgstr "Erro ao gravar do dispositivo de áudio." msgid "Gain" msgstr "Ganho" msgid "Headphone" msgstr "Fone de ouvido" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Erro ao ler %d bytes do dispositivo \"%s\"." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Foi obtido um tamanho de quadro inesperado de %u, ao invés de %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Erro ao ler %d bytes no dispositivo \"%s\"." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Erro ao obter recursos do dispositivo \"%s\": Ele não é um driver v4l2. " "Verifique se ele é um driver v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Falha ao examinar os atributos da entrada %d no dispositivo %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Falha ao obter configurações do sintonizador %d no dispositivo \"%s\"." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Falha ao examinar as normas no dispositivo \"%s\"." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Falha ao obter atributos de controle no dispositivo \"%s\"." #, c-format msgid "Cannot identify device '%s'." msgstr "O dispositivo \"%s\" não pôde ser identificado." #, c-format msgid "This isn't a device '%s'." msgstr "\"%s\" não é um dispositivo." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Não foi possível abrir o dispositivo \"%s\" para leitura e gravação." #, c-format msgid "Device '%s' is not a capture device." msgstr "O dispositivo \"%s\" não é um dispositivo de captura." #, c-format msgid "Device '%s' is not a output device." msgstr "O dispositivo \"%s\" não é um dispositivo de saída." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Falha ao definir as normas para o dispositivo \"%s\"." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Falha ao obter a freqüência do sintonizador para o dispositivo \"%s\"." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Falha ao definir a freqüência do sintonizador para o dispositivo \"%s\" à " "%lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Falha ao obter a força do sinal para o dispositivo \"%s\"." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Falha ao obter o valor para o controle %d no dispositivo \"%s\"." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Falha ao definir o valor %d para o controle %d no dispositivo \"%s\"." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Falha ao obter a entrada atual no dispositivo \"%s\". Talvez seja um " "dispositivo de rádio" #, c-format msgid "Failed to set input %d on device %s." msgstr "Falha ao definir a entrada %d no dispositivo %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Falha ao obter a saída atual no dispositivo \"%s\". Talvez seja um " "dispositivo de rádio" #, c-format msgid "Failed to set output %d on device %s." msgstr "Falha ao definir a saída %d no dispositivo %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Não possível adicionar buffers à fila no dispositivo \"%s\"." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Falha ao tentar obter os quadros de vídeo do dispositivo \"%s\"." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Falha após %d tentativas. Dispositivo %s. Erro do sistema: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Não foi possível obter os parâmetros no dispositivo \"%s\"" msgid "Video input device did not accept new frame rate setting." msgstr "" "A entrada do dispositivo de vídeo não aceita definir uma nova taxa de " "quadros." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Não foi possível mapear buffers do dispositivo \"%s\"" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "O driver do dispositivo \"%s\" não tem suporte a nenhum método conhecido de " "captura." msgid "Changing resolution at runtime is not yet supported." msgstr "Ainda não há suporte a mudança de resolução enquanto está executando." msgid "Cannot operate without a clock" msgstr "Não é possível operar sem um temporizador" gst-plugins-good-0.10.31/po/en@boldquot.header0000644000175000017500000000247111720560210016041 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # gst-plugins-good-0.10.31/po/tr.po0000644000175000017500000004105411720565342013413 00000000000000# translation of gst-plugins-good-0.10.26.2.po to Turkish # This file is put in the public domain. # Server Acim , 2010. # Server Acim , 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-08 00:03+0200\n" "Last-Translator: Server Acim \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Ses sunucusuyla bağlantı kurulumayor" msgid "Failed to query sound server capabilities" msgstr "Ses sunucusu olanakları sorgulanamadı" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' tarafından '%s'" msgid "Internal data stream error." msgstr "İç veri akım hatası." msgid "Failed to decode JPEG image" msgstr "JPEG görüntüsünü çözümlenemedi" msgid "Could not connect to server" msgstr "Sunucuya bağlanamıyor" msgid "Server does not support seeking." msgstr "Sunucu aramayı desteklemiyor." msgid "Could not resolve server name." msgstr "Sunucu adı çözümlenemiyor." msgid "Could not establish connection to server." msgstr "Sunucuyla bağlantı kurulumayor." msgid "Secure connection setup failed." msgstr "Güvenli bağlantı ayarı yapılamadı." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Bir ağ hatası meydana geldi, veya sunucu bağlantıyı beklenmeyen bir şekilde " "kesti." msgid "Server sent bad data." msgstr "Sunucu yetersiz veri gönderdi." msgid "No URL set." msgstr "Hiç bir URL ayarlanmamış." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Geçerli bir ses girişi bulunamadı. AVI akışı kesilecek." msgid "This file contains no playable streams." msgstr "Dosya çalınabilir akışlar içermiyor." msgid "This file is invalid and cannot be played." msgstr "Bu dosya geçersiz ve oynatılamaz." msgid "This file is corrupt and cannot be played." msgstr "Bu dosya bozuk ve oynatılamaz." msgid "Invalid atom size." msgstr "Geçersiz atom boyutu" msgid "This file is incomplete and cannot be played." msgstr "Dosya eksik ve oynatılamaz." msgid "The video in this file might not play correctly." msgstr "Bu dosyadaki vidyo doğru oynatılamıyabilir." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Bu dosya çok fazla akış içeriyor. Sadece ilki oynatılıyor %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Desteklenen bir akış bulunamadı. Real Media akışları için bir GStreamer RTSP " "uzantı eklentisi kurmalısınız." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Desteklenen akış bulunamadı. Daha fazla aktarım protokolüne izin vermeniz " "veya doğru GStreamer RTSP uzantı eklentisine onay vermeniz gerekebilir." msgid "Internal data flow error." msgstr "İç veri akış hatası." msgid "Volume" msgstr "Ses Girişi" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Tiz" msgid "Synth" msgstr "Synthisizer" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Hoparlör" msgid "Line-in" msgstr "Hat girişi" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Karıştırıcı" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Kayıt" msgid "In-gain" msgstr "Kazanç-girişi" msgid "Out-gain" msgstr "Kazanç-çıkışı" msgid "Line-1" msgstr "Hat-1" msgid "Line-2" msgstr "Hat-2" msgid "Line-3" msgstr "Hat-3" msgid "Digital-1" msgstr "Sayısal-1" msgid "Digital-2" msgstr "Sayısal-2" msgid "Digital-3" msgstr "Sayısal-3" msgid "Phone-in" msgstr "Fono-giriş" msgid "Phone-out" msgstr "Fono-çıkış" msgid "Video" msgstr "Vidyo" msgid "Radio" msgstr "Radyo" msgid "Monitor" msgstr "Hoparlör" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Çalmak için ses aygıtı açılamıyor. Aygıt başka bir uygulama tarafından " "kullanılıyor." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "Çalmak için ses aygıtı açılamıyor. Aygıtı açma izniniz bulunmuyor." msgid "Could not open audio device for playback." msgstr "Çalmak için ses aygıtı açılamıyor." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "Kayıt için aygıtı açamıyor. Aygıtı açmak için yetkiniz yok." msgid "Could not open audio device for recording." msgstr "Aygıtı kayıt için açamıyor." msgid "Could not open audio device for mixer control handling." msgstr "Mikser denetimi için ses aygıtı açılamıyor." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Mikser denetimi için ses aygıtı açılamıyor. Açık Ses Sisteminin bu sürümü, " "bu öğeyi desteklemiyor." msgid "Master" msgstr "Master" msgid "Front" msgstr "Ön" msgid "Rear" msgstr "Arka" msgid "Headphones" msgstr "Kulaklıklar" msgid "Center" msgstr "Merkez" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Yan" msgid "Built-in Speaker" msgstr "Varsayılan Hoparlör" msgid "AUX 1 Out" msgstr "AUX 1 Çıkış" msgid "AUX 2 Out" msgstr "AUX 2 Çıkış" msgid "AUX Out" msgstr "AUX Çıkış" msgid "3D Depth" msgstr "3D Derinlik" msgid "3D Center" msgstr "3D Merkez" msgid "3D Enhance" msgstr "3D Genişlik" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Hat Çıkışı" msgid "Line In" msgstr "Hat Girişi" msgid "Internal CD" msgstr "Dahili CD" msgid "Video In" msgstr "Vidyo Girişi" msgid "AUX 1 In" msgstr "AUX 1 Giriş" msgid "AUX 2 In" msgstr "AUX 2 Giriş" msgid "AUX In" msgstr "AUX Giriş" msgid "Record Gain" msgstr "Kayıt Kazancı" msgid "Output Gain" msgstr "Çıkış Kazancı" msgid "Microphone Boost" msgstr "Mikrofon Seviye Yükseltme" msgid "Loopback" msgstr "Geridönüm" msgid "Diagnostic" msgstr "Ayarlar" msgid "Bass Boost" msgstr "Bass Arttırım" msgid "Playback Ports" msgstr "Çalma Portları" msgid "Input" msgstr "Giriş" msgid "Record Source" msgstr "Kayıt Kaynağı" msgid "Monitor Source" msgstr "Hoparlör Kaynağı" msgid "Keyboard Beep" msgstr "Klavye Biplemesi" msgid "Simulate Stereo" msgstr "Stereo Simülasyonu" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Surround Sesi" msgid "Microphone Gain" msgstr "Mikrofon Kazancı" msgid "Speaker Source" msgstr "Hoparlör Kaynağı" msgid "Microphone Source" msgstr "Mikrofon Kaynağı" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Merkez / LFE" msgid "Stereo Mix" msgstr "Stereo Mix" msgid "Mono Mix" msgstr "Mono Mix" msgid "Input Mix" msgstr "Giriş Mix" msgid "SPDIF In" msgstr "SPDIF Girişi" msgid "SPDIF Out" msgstr "SPDIF Çıkış" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Sayısal Çıkış" msgid "Digital In" msgstr "Sayısal Giriş" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Ahize" msgid "Other" msgstr "Diğer" msgid "None" msgstr "Hiçbiri" msgid "On" msgstr "Açık" msgid "Off" msgstr "Kapalı" msgid "Mute" msgstr "Sustulurmuş" msgid "Fast" msgstr "Hızlı" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Çok Kalın" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "D" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Orta" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Tiz" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Çok Tiz" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Yapım" msgid "Front Panel Microphone" msgstr "Ön Panel Mikrofonu" msgid "Front Panel Line In" msgstr "Ön Panel Hat Girişi" msgid "Front Panel Headphones" msgstr "Ön Panel Kulaklıklar" msgid "Front Panel Line Out" msgstr "Ön Panel Hat Çıkışı" msgid "Green Connector" msgstr "Yeşil Konnektör" msgid "Pink Connector" msgstr "Pembe Konnektör" msgid "Blue Connector" msgstr "Mavi Konnektör" msgid "White Connector" msgstr "Beyaz Konnektör" msgid "Black Connector" msgstr "Siyah Konnektör" msgid "Gray Connector" msgstr "Gri Konnektör" msgid "Orange Connector" msgstr "Portakal Konnektör" msgid "Red Connector" msgstr "Kırmızı Konnektör" msgid "Yellow Connector" msgstr "Sarı Konnektör" msgid "Green Front Panel Connector" msgstr "Yeşil Ön Panel Konnektör" msgid "Pink Front Panel Connector" msgstr "Pembe Ön Panel Konnektör" msgid "Blue Front Panel Connector" msgstr "Mavi Ön Panel Konnektör" msgid "White Front Panel Connector" msgstr "Beyaz Ön Panel Konnektör" msgid "Black Front Panel Connector" msgstr "Siyah Ön Panel Konnektör" msgid "Gray Front Panel Connector" msgstr "Gri Ön Panel Konnektör" msgid "Orange Front Panel Connector" msgstr "Portakal Ön Panel Konnektör" msgid "Red Front Panel Connector" msgstr "Kırmızı Ön Panel Konnektör" msgid "Yellow Front Panel Connector" msgstr "Sarı Ön Panel Konnektör" msgid "Spread Output" msgstr "Çıkışı Dağıt" msgid "Downmix" msgstr "Miks Edilmiş" msgid "Virtual Mixer Input" msgstr "Sanal Mikser Girişi" msgid "Virtual Mixer Output" msgstr "Sanal Mikser Çıkışı" msgid "Virtual Mixer Channels" msgstr "Sanal Mikser Kanalları" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d İşlev" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s İşlev" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Çalma için ses aygıtı açılamıyor. Açık Ses Sistemi'nin bu sürümü, bu öğeyi " "desteklemiyor." msgid "Playback is not supported by this audio device." msgstr "Bu ses aygıtı çalmayı desteklemiyor." msgid "Audio playback error." msgstr "Ses çalma hatası." msgid "Recording is not supported by this audio device." msgstr "Bu ses aygıtı kaydetmeyi desteklemiyor." msgid "Error recording from audio device." msgstr "Ses aygıtından kaydetmekte hata." msgid "Gain" msgstr "Kazanç" msgid "Headphone" msgstr "Kulaklık" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "%d bayt bilgili '%s' aygıtından okumada hata." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Beklenmeyen bir çerçevece boyutu %u bunun yerine %u görüntülendi." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "%d baytı şu aygıtta '%s' okumada hata." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Şu aygıtın '%s' özelliklerini almada hata: O bir v4l2 sürücüsü değil. Onun " "bir v4l1 sürücüsü olup olmadığını denetleyin." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Giriş davranışları sorgusu %d şu aygıtta %s başarılamadı" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Radyo istasyonu ayarlarını bulma %d şu aygıtta '%s' başarılamadı." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Şu aygıtta '%s' sorgu normuna erişilemedi." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Denetim davranışları şu aygıtta '%s' bulunamadı." #, c-format msgid "Cannot identify device '%s'." msgstr "Aygıt tanımlanamıyor '%s'." #, c-format msgid "This isn't a device '%s'." msgstr "Bu bir aygıt değil'%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Şu aygıtı '%s' okuma ve yazma için açamıyor." #, c-format msgid "Device '%s' is not a capture device." msgstr "Aygıt '%s' bir yakalama aygıtı değil." #, c-format msgid "Device '%s' is not a output device." msgstr "Aygıt '%s' bir çıkış aygıtı değil." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Aygıt için '%s' norm değerleri ayarlanamadı." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Aygıt için '%s' radyo frekansları ayarlanamadı." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Aygıt için '%s' radyo frekansı %lu Hz için yapılamadı." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Aygıt için '%s' güçlü sinyal alımı gerçekleşemedi." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Denetim değeri şuna %d bu aygıtta '%s' ayarlanamadı." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Değer %d denetim için %d şu aygıtta '%s' ayarlanamadı." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Şu aygıtta '%s' geçerli giriş elde edilemedi. O bir radyo aygıtı olabilir." #, c-format msgid "Failed to set input %d on device %s." msgstr "Giriş değeri olarak bu %d şu aygıtta %s ayarlanamadı." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Şu aygıtta '%s' geçerli giriş elde edilemedi. O bir radyo aygıtı olabilir." #, c-format msgid "Failed to set output %d on device %s." msgstr "Çıkış değeri olarak %d şu aygıtta %s elde edilemedi." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Aygıtta '%s' arabellek kuyruğa sokulamıyor." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Aygıttan device '%s' vidyo çerçeveleri alınamadı." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Şu denemeden sonra %d başarılamadı. aygıt %s. sistem hatası: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Değiştirgeler aygıttan '%s' alınamıyor" msgid "Video input device did not accept new frame rate setting." msgstr "Vidyo giriş aygıtı yeni çerçeve oranı ayarlarını kabul etmedi." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Aygıttan '%s' bellekler eşlenemiyor" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Bu aygıtın sürücüsü '%s' bilinen görüntü yakalama yöntemlerinden herhangi " "birisi desteklemiyor." msgid "Changing resolution at runtime is not yet supported." msgstr "Çalışırken çözünürlüğü değiştirmek henüz desteklenmiyor." msgid "Cannot operate without a clock" msgstr "Saat olmadan çalışamaz" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Aygıtın '%s' birlikte çalışabileceği vidyo kiplerini sıralamada hata" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Arabellek türü desteklenmiyor, veya içerik bir yere ait değil, veya " #~ "arabellekler henüz ayrılmamış, veya userptr veya uzunluk geçersiz. aygıt. " #~ "%s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "Vidyo çervevesi aygıttan '%s' alınamadı. Yetersiz bellek." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "kullanıcı arabelleğini kuyruğa sokmak için yetersiz bellek. aygıt %s." #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "Dizindeki %d havuzda boş bellek bulunamadı." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Aygıt '%s' görüntü yakalayamadı%dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Aygıt '%s' belirtilen kipte görüntü yakalayamadı" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Arabellek aygıttan '%s' alınamıyor." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "Yeterli bellek aygıttan '%s' alınamıyor." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Aygıttan '%s' akan görüntü başlatılamadı." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Aygıttan '%s' akan görüntü durdurulamadı." gst-plugins-good-0.10.31/po/sq.po0000644000175000017500000003572711720565342013423 00000000000000# Përkthimi i mesazheve të gst-plugins në shqip. # Copyright (C) 2004 Free Software Foundation, Inc. # Laurent Dhima , 2004. # msgid "" msgstr "" "Project-Id-Version: gst-plugins 0.8.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2004-08-07 20:29+0200\n" "Last-Translator: Laurent Dhima \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "" msgid "Failed to decode JPEG image" msgstr "" #, fuzzy msgid "Could not connect to server" msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." #, fuzzy msgid "Server does not support seeking." msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht" #, fuzzy msgid "Could not resolve server name." msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." #, fuzzy msgid "Could not establish connection to server." msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Input audio i gabuar ose mungon, stream AVI mund të jetë i dëmtuar." msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "Volumi" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Treble" msgid "Synth" msgstr "Sintetizuesi" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Zë folës" msgid "Line-in" msgstr "Linja-hyrje" msgid "Microphone" msgstr "Mikrofoni" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Kontrolli i volumit" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Regjistrimi" msgid "In-gain" msgstr "In-gain" msgid "Out-gain" msgstr "Out-gain" msgid "Line-1" msgstr "Linja-1" msgid "Line-2" msgstr "Linja-2" msgid "Line-3" msgstr "Linja-3" msgid "Digital-1" msgstr "Dixhitale-1" msgid "Digital-2" msgstr "Dixhitale-2" msgid "Digital-3" msgstr "Dixhitale-3" msgid "Phone-in" msgstr "Phone-hyrja" msgid "Phone-out" msgstr "Phone-dalja" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Ekrani" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for playback." msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" #, fuzzy msgid "Could not open audio device for recording." msgstr "I pamundur hapja e dispozitivit CD për lexim." #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "E pamundur hapja e dispozitivit të zërit \"%s\" për shkrim." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" msgid "Master" msgstr "" msgid "Front" msgstr "" #, fuzzy msgid "Rear" msgstr "Regjistrimi" msgid "Headphones" msgstr "" msgid "Center" msgstr "" msgid "LFE" msgstr "" msgid "Surround" msgstr "" #, fuzzy msgid "Side" msgstr "Video" #, fuzzy msgid "Built-in Speaker" msgstr "Zë folës" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "" msgid "Line Out" msgstr "" #, fuzzy msgid "Line In" msgstr "Linja-hyrje" msgid "Internal CD" msgstr "" #, fuzzy msgid "Video In" msgstr "Video" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" #, fuzzy msgid "Record Gain" msgstr "Regjistrimi" #, fuzzy msgid "Output Gain" msgstr "Out-gain" #, fuzzy msgid "Microphone Boost" msgstr "Mikrofoni" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" #, fuzzy msgid "Record Source" msgstr "Regjistrimi" #, fuzzy msgid "Monitor Source" msgstr "Ekrani" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "" msgid "Surround Sound" msgstr "" #, fuzzy msgid "Microphone Gain" msgstr "Mikrofoni" #, fuzzy msgid "Speaker Source" msgstr "Zë folës" #, fuzzy msgid "Microphone Source" msgstr "Mikrofoni" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" #, fuzzy msgid "Microphone 1" msgstr "Mikrofoni" #, fuzzy msgid "Microphone 2" msgstr "Mikrofoni" #, fuzzy msgid "Digital Out" msgstr "Dixhitale-1" #, fuzzy msgid "Digital In" msgstr "Dixhitale-1" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Mute" msgstr "" msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" #, fuzzy msgid "Front Panel Microphone" msgstr "Mikrofoni" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, fuzzy, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, fuzzy, c-format msgid "Cannot identify device '%s'." msgstr "I pamundur shkrimi në dispozitivin \"%s\"." #, c-format msgid "This isn't a device '%s'." msgstr "" #, fuzzy, c-format msgid "Could not open device '%s' for reading and writing." msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim dhe shkrim." #, fuzzy, c-format msgid "Device '%s' is not a capture device." msgstr "Dispozitivi \"%s\" nuk është një dispozitiv marrje." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "Dispozitivi \"%s\" nuk është një dispozitiv marrje." #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." #, fuzzy, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, fuzzy, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." #, fuzzy, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "E pamundur mbyllja e dispozitivit të kontrollit \"%s\"." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, fuzzy, c-format msgid "Failed to set input %d on device %s." msgstr "E pamundur mbyllja e dispozitivit audio \"%s\"." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "E pamundur mbyllja e dispozitivit audio \"%s\"." #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." #, fuzzy, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, fuzzy, c-format msgid "Could not get parameters on device '%s'" msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." msgid "Video input device did not accept new frame rate setting." msgstr "" #, fuzzy, c-format msgid "Could not map buffers from device '%s'" msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" #~ msgid "" #~ "No usable colorspace element could be found.\n" #~ "Please install one and restart." #~ msgstr "" #~ "Nuk arrin të gjehet asnjë element ngjyra e hapësirës.\n" #~ "Ju lutem instaloni një dhe rinisni." #~ msgid "" #~ "The %s element could not be found. This element is essential for " #~ "playback. Please install the right plug-in and verify that it works by " #~ "running 'gst-inspect %s'" #~ msgstr "" #~ "E pamundur gjetja e elementit %s. Ky element është thelbësor për " #~ "playback. Ju lutem instaloni plug-in e duhur dhe kontrollo funksionimin " #~ "duke ekzekutuar 'gst-inspect %s'" #~ msgid "Device is open." #~ msgstr "Dispozitivi është i hapur." #~ msgid "Device is not open." #~ msgstr "Dispozitivi nuk është hapur." #~ msgid "No device specified." #~ msgstr "Nuk është përcaktuar asnjë dispozitiv." #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "E pamundur mbyllja e file vfs \"%s\"." #~ msgid "No filename given" #~ msgstr "Nuk është dhënë asnjë emër file" #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "E pamundur hapja e file vfs \"%s\" për shkrim: %s." #, fuzzy #~ msgid "No filename given." #~ msgstr "Nuk është dhënë asnjë emër file" #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "E pamundur hapja e file vfs \"%s\" për lexim." #~ msgid "Your OSS device could not be probed correctly" #~ msgstr "Dispozitivi juaj OSS mund të mos provohet korrektësisht" #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "E pamundur hapja e dispozitivit \"%s\" për lexim." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "E pamundur hapja e dispozitivit \"%s\" për shkrim." #~ msgid "Device \"%s\" does not exist." #~ msgstr "Dispozitivi \"%s\" nuk ekziston." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "" #~ "E pamundur futja në dispozitivin \"%s\", kontrollo të drejtat e tij." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "" #~ "Dispozitivi OSS \"%s\" është duke u përdorur nga një tjetër program." #~ msgid "Could not close video device \"%s\"." #~ msgstr "E pamundur mbyllja e dispozitivit video \"%s\"." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "E pamundur hapja e dispozitivit video \"%s\" për shkrim." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "I pamundur rregullimi i dispozitivit audio \"%s\" në %d Hz." #~ msgid "Could not configure audio device \"%s\"." #~ msgstr "I pamundur konfigurimi i dispozitivit të zërit \"%s\"." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "E pamundur hapja e dispozitivit të kontrollit \"%s\" për shkrim." #~ msgid "Could not write to file \"%s\"." #~ msgstr "I pamundur shkrimi tek file \"%s\"." #~ msgid "No filename specified." #~ msgstr "Nuk është përcaktuar emri i file." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "E pamundur hapja e file \"%s\" për lexim." #~ msgid "Error closing file \"%s\"." #~ msgstr "Gabim gjatë mbylljes së file \"%s\"." #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "E pamundur hapja e file \"%s\" në shkrim." gst-plugins-good-0.10.31/po/es.po0000644000175000017500000004450211720565341013375 00000000000000# translation of gst-plugins-good-0.10.26.2.po to Español # spanish translation for gst-plugins-good # This file is put in the public domain. # Jorge González González , 2007, 2008, 2009, 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-02-12 18:30+0100\n" "Last-Translator: Jorge González González \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "No se pudo establecer la conexión con el servidor de sonido" msgid "Failed to query sound server capabilities" msgstr "Falló al preguntar al servidor de sonido sus capacidades" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» por «%s»" msgid "Internal data stream error." msgstr "Error interno de flujo de datos." msgid "Failed to decode JPEG image" msgstr "Falló al decodificar la imagen JPEG" msgid "Could not connect to server" msgstr "No se pudo conectar con el servidor" msgid "Server does not support seeking." msgstr "El servidor no soporta la búsqueda." msgid "Could not resolve server name." msgstr "No se pudo resolver el nombre del servidor." msgid "Could not establish connection to server." msgstr "No se pudo establecer la conexión con el servidor." msgid "Secure connection setup failed." msgstr "Falló la configuración de la conexión segura." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Ocurrió un error de red o el servidor cerró la conexión de forma inesperada." msgid "Server sent bad data." msgstr "El servidor envió datos erróneos." msgid "No URL set." msgstr "No existe un URL establecido." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "El audio no existe o no es válido, el flujo AVI estará corrupto." msgid "This file contains no playable streams." msgstr "Este archivo no contiene flujos reproducibles." msgid "This file is invalid and cannot be played." msgstr "Este archivo no es válido y no se puede reproducir." msgid "This file is corrupt and cannot be played." msgstr "Este archivo está corrupto y no se puede reproducir." msgid "Invalid atom size." msgstr "El tamaño atom no es válido." msgid "This file is incomplete and cannot be played." msgstr "Este archivo está incompleto y no se puede reproducir." msgid "The video in this file might not play correctly." msgstr "" "Puede que el vídeo en este archivo no se pueda reproducir correctamente." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Este archivo contiene demasiados flujos. Sólo se reproducirá el primer %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "No se encontró un flujo soportado. Puede que necesite instalar una extensión " "RTSP de GStreamer para los formatos de flujo Real." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "No se encontró un flujo soportado. Puede que necesite permitir más " "protocolos de transporte o de otra forma puede que le falte la extensión " "correcta de RTSP de GStreamer." msgid "Internal data flow error." msgstr "Error en el flujo de datos interno." msgid "Volume" msgstr "Volumen" msgid "Bass" msgstr "Bass" msgid "Treble" msgstr "Agudos" msgid "Synth" msgstr "Sintetizador" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Altavoz" msgid "Line-in" msgstr "Línea de entrada" msgid "Microphone" msgstr "Micrófono" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mezclador" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Grabación" msgid "In-gain" msgstr "Ganancia de entrada" msgid "Out-gain" msgstr "Ganancia de salida" msgid "Line-1" msgstr "Línea-1" msgid "Line-2" msgstr "Línea-2" msgid "Line-3" msgstr "Línea-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Entrada de teléfono" msgid "Phone-out" msgstr "Salida de teléfono" msgid "Video" msgstr "Vídeo" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "No se pudo abrir el dispositivo para reproducir. Otra aplicación está usando " "el dispositivo." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "No se pudo abrir el dispositivo de sonido para reproducir. No tiene permisos " "para abrir el dispositivo." msgid "Could not open audio device for playback." msgstr "No se pudo abrir el dispositivo para reproducir." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "No se pudo abrir el dispositivo de sonido para grabar. No tiene permisos " "para abrir el dispositivo." msgid "Could not open audio device for recording." msgstr "No se pudo abrir el dispositivo para grabar." msgid "Could not open audio device for mixer control handling." msgstr "" "No se pudo abrir el dispositivo de sonido para su gestión por el control de " "mezclado." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "No se pudo abrir el dispositivo de sonido para su gestión por el control de " "mezclado. Este elemento no soporta esta versión del Sistema de sonido " "abierto (OSS)." msgid "Master" msgstr "Maestro" msgid "Front" msgstr "Frontal" msgid "Rear" msgstr "Trasero" msgid "Headphones" msgstr "Auriculares" msgid "Center" msgstr "Centro" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Envolvente" msgid "Side" msgstr "Lateral" msgid "Built-in Speaker" msgstr "Altavoz integrado" msgid "AUX 1 Out" msgstr "Salida AUX 1" msgid "AUX 2 Out" msgstr "Salida AUX 2" msgid "AUX Out" msgstr "Salida AUX" msgid "3D Depth" msgstr "Profundidad 3D" msgid "3D Center" msgstr "Centro 3D" msgid "3D Enhance" msgstr "Mejora 3D" msgid "Telephone" msgstr "Teléfono" msgid "Line Out" msgstr "Línea de salida" msgid "Line In" msgstr "Línea de entrada" msgid "Internal CD" msgstr "CD interno" msgid "Video In" msgstr "Entrada de vídeo" msgid "AUX 1 In" msgstr "Entrada AUX 1" msgid "AUX 2 In" msgstr "Entrada AUX 2" msgid "AUX In" msgstr "Entrada AUX" msgid "Record Gain" msgstr "Ganancia de grabación" msgid "Output Gain" msgstr "Ganancia de salida" msgid "Microphone Boost" msgstr "Aumento del micrófono" msgid "Loopback" msgstr "Bucle local" msgid "Diagnostic" msgstr "Diagnóstico" msgid "Bass Boost" msgstr "Aumento de bajos" msgid "Playback Ports" msgstr "Puertos de reproducción" msgid "Input" msgstr "Entrada" msgid "Record Source" msgstr "Origen de la grabación" msgid "Monitor Source" msgstr "Monitor de origen" msgid "Keyboard Beep" msgstr "Pitido de teclado" msgid "Simulate Stereo" msgstr "Simular estéreo" msgid "Stereo" msgstr "Estéreo" msgid "Surround Sound" msgstr "Sonido envolvente" msgid "Microphone Gain" msgstr "Ganancia del micrófono" msgid "Speaker Source" msgstr "Altavoz de origen" msgid "Microphone Source" msgstr "Micrófono de origen" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Centrado / LFE" msgid "Stereo Mix" msgstr "Mezclador estéreo" msgid "Mono Mix" msgstr "Mezclador mono" msgid "Input Mix" msgstr "Mezclador de entrada" msgid "SPDIF In" msgstr "Entrada S/PDIF" msgid "SPDIF Out" msgstr "Salida S/PDIF" msgid "Microphone 1" msgstr "Micrófono 1" msgid "Microphone 2" msgstr "Micrófono 2" msgid "Digital Out" msgstr "Salida digital" msgid "Digital In" msgstr "Entrada digital" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Módem" msgid "Handset" msgstr "Auriculares" msgid "Other" msgstr "Otro" msgid "None" msgstr "Ninguno" msgid "On" msgstr "Encendido" msgid "Off" msgstr "Apagado" msgid "Mute" msgstr "Silenciar" msgid "Fast" msgstr "Rápido" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Muy bajo" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Bajo" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medio" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Alto" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Muy alto" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Producción" msgid "Front Panel Microphone" msgstr "Micrófono del panel frontal" msgid "Front Panel Line In" msgstr "Entrada del panel frontal" msgid "Front Panel Headphones" msgstr "Auriculares del panel frontal" msgid "Front Panel Line Out" msgstr "Salida del panel frontal" msgid "Green Connector" msgstr "Conector verde" msgid "Pink Connector" msgstr "Conector rosa" msgid "Blue Connector" msgstr "Conector azul" msgid "White Connector" msgstr "Conector blanco" msgid "Black Connector" msgstr "Conector negro" msgid "Gray Connector" msgstr "Conector gris" msgid "Orange Connector" msgstr "Conector naranja" msgid "Red Connector" msgstr "Conector rojo" msgid "Yellow Connector" msgstr "Conector amarillo" msgid "Green Front Panel Connector" msgstr "Conector verde del panel frontal" msgid "Pink Front Panel Connector" msgstr "Conector rosa del panel frontal" msgid "Blue Front Panel Connector" msgstr "Conector azul del panel frontal" msgid "White Front Panel Connector" msgstr "Conector blanco del panel frontal" msgid "Black Front Panel Connector" msgstr "Conector negro del panel frontal" msgid "Gray Front Panel Connector" msgstr "Conector gris del panel frontal" msgid "Orange Front Panel Connector" msgstr "Conector naranja del panel frontal" msgid "Red Front Panel Connector" msgstr "Conector rojo del panel frontal" msgid "Yellow Front Panel Connector" msgstr "Conector amarillo del panel frontal" msgid "Spread Output" msgstr "Expandir salida" msgid "Downmix" msgstr "Reducción de canales" msgid "Virtual Mixer Input" msgstr "Entrada del mezclador virtual" msgid "Virtual Mixer Output" msgstr "Salida del mezclador virtual" msgid "Virtual Mixer Channels" msgstr "Canales del mezclador virtual" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Función %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Función %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "No se pudo abrir el dispositivo de sonido para su gestión por el control de " "mezclado. Este elemento no soporta esta versión del Sistema de sonido " "abierto (OSS)." msgid "Playback is not supported by this audio device." msgstr "Este dispositivo de sonido no soporta la reproducción." msgid "Audio playback error." msgstr "Error de reproducción de sonido." msgid "Recording is not supported by this audio device." msgstr "Este dispositivo de sonido no soporta la grabación." msgid "Error recording from audio device." msgstr "Error al grabar del dispositivo de sonido." msgid "Gain" msgstr "Ganancia" msgid "Headphone" msgstr "Auriculares" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Error al leer %d bytes del dispositivo «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Se obtuvo un tamaño de cuadro inesperado %u en lugar de %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Error al leer %d bytes del dispositivo «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Error al obtener las capacidades del dispositivo «%s»: No es un controlador " "para v4l2. Compruebe si es un controlador para v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Falló al consultar los atributos de la entrada %d en el dispositivo %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Falló al obtener la posición del sintonizador %d en el dispositivo «%s»." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Falló al consultar la norma para el dispositivo «%s»." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Falló al obtener los atributos de control en el dispositivo «%s»." #, c-format msgid "Cannot identify device '%s'." msgstr "No se puede identificar el dispositivo «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "Esto no es un dispositivo «%s»." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "No se pudo abrir el dispositivo «%s» para lectura y escritura." #, c-format msgid "Device '%s' is not a capture device." msgstr "El dispositivo «%s» no es un dispositivo de captura." #, c-format msgid "Device '%s' is not a output device." msgstr "El dispositivo «%s» no es un dispositivo de salida." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Falló al establecer la norma para el dispositivo «%s»." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Falló al obtener la frecuencia actual del sintonizador para el dispositivo " "«%s»." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Falló al establecer la frecuencia actual del sintonizador para el " "dispositivo «%s» a %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Falló al obtener la potencia de la señal para el dispositivo «%s»." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Falló al obtener el valor para el control %d del dispositivo «%s»." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Falló al establecer el valor %ds para el control %d del dispositivo «%s»." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Falló al obtener la entrada actual en el dispositivo «%s». Quizá sea un " "dispositivo de radio." #, c-format msgid "Failed to set input %d on device %s." msgstr "Falló al establecer la entrada %d en el dispositivo %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Falló al obtener la salida actual en el dispositivo «%s». Quizá sea un " "dispositivo de radio." #, c-format msgid "Failed to set output %d on device %s." msgstr "Falló al establecer la salida %d en el dispositivo %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "No se pueden encolar los búferes en el dispositivo «%s»." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Falló al intentar obtener cuadros de vídeo del dispositivo «%s»." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Falló después de %d intentos. Dispositivo %s. Error del sistema: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "No se pudieron obtener los parámetros para el dispositivo «%s»" msgid "Video input device did not accept new frame rate setting." msgstr "" "El dispositivo de entrada de vídeo no aceptó el ajuste de la nueva tasa de " "fotogramas." #, c-format msgid "Could not map buffers from device '%s'" msgstr "No se pudieron mapear los búferes del dispositivo «%s»" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "El controlador del dispositivo «%s» no soporta ningún método de captura " "conocido." msgid "Changing resolution at runtime is not yet supported." msgstr "El cambio de resolución durante la reproducción aún no está soportado." msgid "Cannot operate without a clock" msgstr "No se puede operar sin reloj" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Falló al enumerar los posibles formatos de vídeo con los que el " #~ "dispositivo «%s» puede trabajar" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "El tipo de búfer no está soportado o el índice está fuera de los límites " #~ "o no se han registrado búferes todavía o la longitud o el userptr son " #~ "inválidos. Dispositivo %s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Falló al intentar obtener cuadros de vídeo del dispositivo «%s». No hay " #~ "memoria suficiente." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "Memoria insuficiente para encolar un búfer puntero de usuario. " #~ "Dispositivo %s." #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "No se encontraron búferes libres en el índice %d del «pool»." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "El dispositivo «%s» no puede capturar a %dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "El dispositivo «%s» no puede capturar en el formato especificado" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "No se pudieron obtener búferes del dispositivo «%s»." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "No se pudieron obtener búferes suficientes del dispositivo «%s»." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Error al iniciar el flujo de captura del dispositivo «%s»." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Error al parar el flujo de captura del dispositivo «%s»." #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "Falló al obtener los atributos de control en el dispositivo «%s»." #~ msgid "Could not read from CD." #~ msgstr "No se pudo leer del CD." #~ msgid "Disc is not an Audio CD." #~ msgstr "El disco no es un CD de sonido." #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Este archivo está cifrado y no se puede reproducir." gst-plugins-good-0.10.31/po/it.gmo0000644000175000017500000003554411720565343013556 00000000000000     JZ cm v  <[ b4o)).'C&k7)JVtqW=*X3M$l#      a(_&"228GT61.243g$)@$+#P5t3)@.Et    /K P^bjsz    &/ 46@wr  /, \gmr y 0   @V[ks   D0 '@ :h * - * '!A! H!R![!a!9j!!!!!!!"("yE"# ## ##$_$s$ |$$ $$$$$$$!$% %@%S%*V%"%%%J%!&0)&/Z&4&2&1&O$'t'<(zL((pJ)=)q);k*)*2*1+ 6+B+T+ d+ n+ x++~+- ,-7,,e,;,F,*-\@-U-Q-GE.G.G.6/@T/b/=/760Mn0F01 11*1E1a1}1=11#11" 2.2 32>2E2L2Q2Y2 _2 l2"w2%22 222 2222333 3(3 .3 83 D3P3e3x33333333J3"445555&555556 6 6!6!16S61f6 666666767"/7R7 [73e7)7!77 7788*8 18<8E8T8]8Ff8E858>)95h97979$:3: 9: D:P:V:M_::::::# ;.;#@;>Z*Jr`xgF8 I#wbi-?^U@ca'ze]=_%WXnov5M&GNH.\~7V$t9)}D"Q,|El:s ;yTqPKfSh!/j RkB m0<[ dLu1+O(6{ApY234C%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.25.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-10-25 10:11+0200 Last-Translator: Luca Ferretti Language-Team: Italian Language: it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funzione %s %dFunzione %s«%s» di «%s»Centro 3DProfondità 3DProfondità 3DSi è verificato un errore di rete, oppure il server ha chiuso la connessione in modo inatteso.AUX 1 inAUX 1 outAUX 2 inAUX 2 outAUX inAUX outErrore nel riprodurre l'audio.BassiIncremento bassiConnettore neroConnettore nero pannello frontaleConnettore bluConnettore blu pannello frontaleAltop. incorporatoCDImpossibile identificare il device «%s».Impossibile operare senza un clockCentraleCentrale / LFEIl cambio della risoluzione durante l'esecuzione non è ancora supportato.Impossibile connettersi al serverImpossibile accodare i buffer nel device «%s».Impossibile stabilire la connessione al server.Impossibile stabilire la connessione al server audioImpossibile ottenere i parametri sul device «%s»Impossibile mappare dei buffer dal device «%s».Impossibile aprire il device audio per la gestione della regolazione del mixer.Impossibile aprire il device audio per la gestione della regolazione del mixer. Questa versione di Open Sound System non è supportata da questo elemento.Impossibile aprire il dispositivo audio per la riproduzione.Impossibile aprire il dispositivo audio per la riproduzione. Il dispositivo è attualmente usato da un'altra applicazione.Impossibile aprire il device audio per la riproduzione. Questa versione di Open Sound System non è supportata da questo elemento.Impossibile aprire il dispositivo audio per la riproduzione. Permessi non sufficienti per aprire il dispositivo.Impossibile aprire il dispositivo audio per la registrazione.Impossibile aprire il dispositivo audio per la registrazione. Permessi non sufficienti per aprire il dispositivo.Impossibile aprire il device «%s» in lettura e scrittura.Impossibile risolvere il nome del server.Il device «%s» non è un dispositivo di cattura.Il device «%s» non è un dispositivo di uscita.DiagnosticaIngresso digitaleUscita digitaleDigital 1Digital 2Digital 3DownmixErrore nell'ottenere le funzionalità per il device «%s»: non è un driver v4l2. Controllare se si tratta di un driver v4l1.Errore nel leggere %d byte dal device «%s».Errore nel leggere %d byte sul device «%s».Errore nel registrare dal dispositivo audio.Fallito dopo %d tentativi. Device %s. Errore di sistema: %sRecupero degli attributi dei controlli sul device «%s» non riuscito.Decodifica dell'immagine JPEG non riuscitaRecupero dell'attuale ingresso sul device «%s» non riuscito. Forse è un dispositivo radioRecupero dell'attuale frequenza di sintonizzazione per il device «%s» non riuscita.Recupero delle impostazioni del sintonizzatore %d sul device «%s» non riuscito.Recupero dell'intensità del segnale per il device «%s» non riuscito.Recupero del valore per il controllo %d sul device «%s» non riuscito.Interrogazione degli attributi dell'input %d nel device %s non riuscitaInterrogazione di norm sul device «%s» non riuscita.Interrogazione delle funzionalità del server audio non riuscitaImpostazione dell'attuale frequenza di sintonizzazione per il device «%s» a %lu Hz non riuscita.Impostazione dell'ingresso %d sul device «%s» non riuscita.Impostazione di norm per il device «%s» non riuscita.Impostazione al valore %d per il controllo %d sul device «%s» non riuscito.Tentativo di ottenere fotogrammi video dal device «%s» non riuscito.VeloceFronteCuffie pannello frontaleLinea in pannello frontaleLinea out pannello frontaleMicrofono pannello frontaleGuadagnoOttenuta dimensione inattesa del fotogramma: %u invece di %u.Connettore grigioConnettore grigio pannello frontaleConnettore verdeConnettore verde pannello frontaleHDMIAuricolareCuffiaCuffieAltoGuad inInputMix ingressoCD internoErrore interno nel flusso di dati.Errore interno nello stream dei dati.JackBeep tastieraLFELinea inLinea outCanale 1Canale 2Canale 3Linea inLoopbackLentoPrincipaleMedioMicrofonoMicrofono 1Microfono 2Incremento microfonoGuadagno microfonoSorgente microfonoMixerModemMonitorSorgente monitorMix monoEsclusoNessun URL impostato.Ingresso audio assente o non valido. Lo stream AVI risulterà danneggiato.Non è stato trovato alcuno stream supportato. Potrebbe essere necessario abilitare altri protocolli di trasporto oppure in alternativa potrebbe mancare il corretto plugin GStreamer di tipo estensione RTSP.Non è stato trovato alcuno stream supportato. Potrebbe essere necessario installare un plugin GStreamer di tipo estensione RTSP per gli stream Real media.NessunoSpentoAccesoConnettore arancioneConnettore arancione pannello frontaleAltroGuad outGuadagno uscitaPCMPCM-2Telefono inTelefono outConnettore rosaConnettore rosa pannello frontalePorte riproduzioneQuesto device audio non supporta la riproduzione.ProduzioneRadioDietroRegistrGuadagno registrazioneSorgente registrazioneQuesto dispositivo audio non supporta la registrazione.Connettore rossoConnettore rosso pannello frontaleSPDIF inSPDIF outImpostazione della connessione sicura non riuscita.Il server non supporta il posizionamento.In server ha inviato dati errati.LateraleSimula stereoAltoparlSorgente altoparlanteUscita diffusaStereoMix stereoSurroundSuono surroundSintetizTelefonoIl driver del device «%s» non supporta alcun metodo di cattura noto.Il video in questo file potrebbe non essere riprodotto correttamente.Questo file non contiene alcuno stream riproducibile.Questo file contiene troppi stream. Riprodotti solo i primi %dQuesto file è alterato e non può essere riprodotto.Questo file è incompleto e non può essere riprodotto.Questo file non è valido e non può essere riprodotto.Questo non è un dispositivo «%s».AcutiMolto altoMolto lentoVideoVideo inIl device di ingresso video non accetta la nuova impostazione sul frame rate.Canali mixer virtualeIngresso mixer virtualeUscita mixer virtualeVolumeConnettore biancoConnettore bianco pannello frontaleConnettore gialloConnettore giallo pannello frontalegst-plugins-good-0.10.31/po/cs.po0000644000175000017500000004033311720565341013371 00000000000000# Czech translation of gst-plugins-good. # Copyright (C) 2007, 2008, 2009, 2010, 2011 the author(s) of gst-plugins-good. # Copyright (C) 2004 Miloslav Trmac . # This file is put in the public domain. # Miloslav Trmac , 2004. # Petr Kovar , 2007, 2008, 2009, 2010, 2011. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-12 23:07+0100\n" "Last-Translator: Petr Kovar \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Lokalize 1.1\n" msgid "Could not establish connection to sound server" msgstr "Nezdařilo se navázání spojení se zvukovým serverem" msgid "Failed to query sound server capabilities" msgstr "Nezdařil se dotaz na schopnosti zvukového serveru" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "\"%s\" od \"%s\"" msgid "Internal data stream error." msgstr "Vnitřní chyba datového proudu." msgid "Failed to decode JPEG image" msgstr "Nezdařilo se dekódování obrázku JPEG" msgid "Could not connect to server" msgstr "Nezdařilo se spojení se serverem" msgid "Server does not support seeking." msgstr "Server nepodporuje hledání." msgid "Could not resolve server name." msgstr "Nezdařil se překlad názvu serveru." msgid "Could not establish connection to server." msgstr "Nezdařilo se navázání spojení se serverem." msgid "Secure connection setup failed." msgstr "Zabezpečené připojení selhalo." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Došlo k síťové chybě, nebo server neočekávaně ukončil spojení." msgid "Server sent bad data." msgstr "Server odeslal chybná data." msgid "No URL set." msgstr "Nenastaveno URL." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Žádný nebo neplatný zvukový vstup, proud AVI bude poškozen." msgid "This file contains no playable streams." msgstr "Tento soubor neobsahuje hratelné proudy." msgid "This file is invalid and cannot be played." msgstr "Tento soubor je neplatný a nelze jej přehrát." msgid "This file is corrupt and cannot be played." msgstr "Tento soubor je poškozen a nelze jej přehrát." msgid "Invalid atom size." msgstr "Atom - neplatná velikost." msgid "This file is incomplete and cannot be played." msgstr "Tento soubor není úplný a nelze jej přehrát." msgid "The video in this file might not play correctly." msgstr "Video v tomto souboru se nemusí přehrát správně." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Tento soubor obsahuje příliš mnoho proudů. Přehrává se pouze první %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nebyl nalezen žádný podporovaný proud. Bude patrně nutné nainstalovat " "zásuvný modul rozšíření GStreamer RTSP pro multimediální proudy Real." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nebyl nalezen žádný podporovaný proud. Patrně bude nutné povolit více " "přenosových protokolů, jinak asi bude scházet potřebný zásuvný modul " "rozšíření GStreamer RTSP." msgid "Internal data flow error." msgstr "Vnitřní chyba datového toku." msgid "Volume" msgstr "Hlasitost" msgid "Bass" msgstr "Basy" msgid "Treble" msgstr "Výšky" msgid "Synth" msgstr "Syntezátor" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Reproduktor" msgid "Line-in" msgstr "Linkový vstup" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Směšovač" msgid "PCM-2" msgstr "PCM 2" msgid "Record" msgstr "Nahrávání" msgid "In-gain" msgstr "Vstupní zesílení" msgid "Out-gain" msgstr "Výstupní zesílení" msgid "Line-1" msgstr "Linka 1" msgid "Line-2" msgstr "Linka 2" msgid "Line-3" msgstr "Linka 3" msgid "Digital-1" msgstr "Digitální 1" msgid "Digital-2" msgstr "Digitální 2" msgid "Digital-3" msgstr "Digitální 3" msgid "Phone-in" msgstr "Telefonní vstup" msgid "Phone-out" msgstr "Telefonní výstup" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Rádio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Zvukové zařízení nelze otevřít k přehrávání. Zařízení je používáno jinou " "aplikací." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Zvukové zařízení nelze otevřít k přehrávání. Nemáte oprávnění k otevření " "zařízení." msgid "Could not open audio device for playback." msgstr "Zvukové zařízení nelze otevřít ke čtení." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Zvukové zařízení nelze otevřít k nahrávání. Nemáte oprávnění k otevření " "zařízení." msgid "Could not open audio device for recording." msgstr "Zvukové zařízení nelze otevřít k nahrávání." msgid "Could not open audio device for mixer control handling." msgstr "" "Nezdařilo se otevření zvukového zařízení pro obsluhu ovládání směšovače." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nezdařilo se otevření zvukového zařízení k obsluze ovládání směšovače. Tato " "verze Open Sound System není příslušným prvkem podporována." msgid "Master" msgstr "Master" msgid "Front" msgstr "Přední" msgid "Rear" msgstr "Zadní" msgid "Headphones" msgstr "Sluchátka" msgid "Center" msgstr "Středový" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Prostorový zvuk" msgid "Side" msgstr "Boční" msgid "Built-in Speaker" msgstr "Zabudovaný reproduktor" msgid "AUX 1 Out" msgstr "Výstup AUX 1" msgid "AUX 2 Out" msgstr "Výstup AUX 2" msgid "AUX Out" msgstr "Výstup AUX" msgid "3D Depth" msgstr "Hloubka prostorového zvuku" msgid "3D Center" msgstr "Střed prostorového zvuku" msgid "3D Enhance" msgstr "Prostorové rozšíření" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Linkový výstup" msgid "Line In" msgstr "Linkový vstup" msgid "Internal CD" msgstr "Vnitřní CD" msgid "Video In" msgstr "Vstup videa" msgid "AUX 1 In" msgstr "Vstup AUX 1" msgid "AUX 2 In" msgstr "Vstup AUX 2" msgid "AUX In" msgstr "Vstup AUX" msgid "Record Gain" msgstr "Zesílení záznamu" msgid "Output Gain" msgstr "Výstupní zesílení" msgid "Microphone Boost" msgstr "Zesílení mikrofonu" msgid "Loopback" msgstr "Zpětná smyčka" msgid "Diagnostic" msgstr "Diagnostika" msgid "Bass Boost" msgstr "Zesílení basů" msgid "Playback Ports" msgstr "Porty přehrávání" msgid "Input" msgstr "Vstup" msgid "Record Source" msgstr "Zdroj záznamu" msgid "Monitor Source" msgstr "Zdroj monitoru" msgid "Keyboard Beep" msgstr "Zvukové znamení klávesnice" msgid "Simulate Stereo" msgstr "Napodobit stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Prostorový zvuk" msgid "Microphone Gain" msgstr "Zesílení mikrofonu" msgid "Speaker Source" msgstr "Zdroj reproduktoru" msgid "Microphone Source" msgstr "Zdroj mikrofonu" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Středový / LFE" msgid "Stereo Mix" msgstr "Směšovač stereo" msgid "Mono Mix" msgstr "Směšovač mono" msgid "Input Mix" msgstr "Směšovač vstupu" msgid "SPDIF In" msgstr "Vstup SPDIF" msgid "SPDIF Out" msgstr "Výstup SPDIF" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digitální výstup" msgid "Digital In" msgstr "Digitální vstup" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Telefonní sluchátko" msgid "Other" msgstr "Jiné" msgid "None" msgstr "Žádné" msgid "On" msgstr "Zapnuto" msgid "Off" msgstr "Vypnuto" msgid "Mute" msgstr "Ztlumit" msgid "Fast" msgstr "Rychlé" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Velmi nízké" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Nízké" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Střední" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Vysoké" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Velmi vysoké" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Výroba" msgid "Front Panel Microphone" msgstr "Mikrofon na předním panelu" msgid "Front Panel Line In" msgstr "Linkový vstup na předním panelu" msgid "Front Panel Headphones" msgstr "Sluchátka na předním panelu" msgid "Front Panel Line Out" msgstr "Linkový výstup na předním panelu" msgid "Green Connector" msgstr "Zelený konektor" msgid "Pink Connector" msgstr "Růžový konektor" msgid "Blue Connector" msgstr "Modrý konektor" msgid "White Connector" msgstr "Bílý konektor" msgid "Black Connector" msgstr "Černý konektor" msgid "Gray Connector" msgstr "Šedý konektor" msgid "Orange Connector" msgstr "Oranžový konektor" msgid "Red Connector" msgstr "Červený konektor" msgid "Yellow Connector" msgstr "Žlutý konektor" msgid "Green Front Panel Connector" msgstr "Zelený konektor na předním panelu" msgid "Pink Front Panel Connector" msgstr "Růžový konektor na předním panelu" msgid "Blue Front Panel Connector" msgstr "Modrý konektor na předním panelu" msgid "White Front Panel Connector" msgstr "Bílý konektor na předním panelu" msgid "Black Front Panel Connector" msgstr "Černý konektor na předním panelu" msgid "Gray Front Panel Connector" msgstr "Šedý konektor na předním panelu" msgid "Orange Front Panel Connector" msgstr "Oranžový konektor na předním panelu" msgid "Red Front Panel Connector" msgstr "Červený konektor na předním panelu" msgid "Yellow Front Panel Connector" msgstr "Žlutý konektor na předním panelu" msgid "Spread Output" msgstr "Rozložený výstup" msgid "Downmix" msgstr "Snížení počtu kanálů" msgid "Virtual Mixer Input" msgstr "Vstup virtuálního směšovače" msgid "Virtual Mixer Output" msgstr "Výstup virtuálního směšovače" msgid "Virtual Mixer Channels" msgstr "Kanály virtuálního směšovače" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d (funkce)" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s (funkce)" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nezdařilo se otevření zvukového zařízení k přehrávání. Tato verze Open Sound " "System není příslušným prvkem podporována." msgid "Playback is not supported by this audio device." msgstr "Přehrávání není tímto zvukovým zařízením podporováno." msgid "Audio playback error." msgstr "Chyba přehrávání zvuku." msgid "Recording is not supported by this audio device." msgstr "Toto zvukové zařízení nepodporuje nahrávání." msgid "Error recording from audio device." msgstr "Chyba při nahrávání ze zvukového zařízení." msgid "Gain" msgstr "Zesílení" msgid "Headphone" msgstr "Sluchátko" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Chyba při čtení %d bajtů na zařízení \"%s\"." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Získána neočekávaná velikost snímku %u namísto %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Chyba při čtení %d bajtů na zařízení \"%s\"." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Chyba při získávání informací o schopnostech u zařízení \"%s\": Nejedná se o " "ovladač v4l2. Je nutné zkontrolovat, zda se nejedná o ovladač v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Nezdařilo se dotázání na vlastnosti vstupu %d na zařízení %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Selhalo zjištění nastavení tuneru %d na zařízení \"%s\"." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Nezdařilo se dotázání na norm na zařízení \"%s\"." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Nezdařilo se zjištění vlastností ovládacích prvků na zařízení \"%s\"." #, c-format msgid "Cannot identify device '%s'." msgstr "Nelze rozpoznat zařízení \"%s\"." #, c-format msgid "This isn't a device '%s'." msgstr "Toto není zařízení \"%s\"." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nelze otevřít zařízení \"%s\" ke čtení a k zápisu." #, c-format msgid "Device '%s' is not a capture device." msgstr "Zařízení \"%s\" není záznamovým zařízením." #, c-format msgid "Device '%s' is not a output device." msgstr "Zařízení \"%s\" není výstupním zařízením." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Nezdařilo se nastavení norm u zařízení \"%s\"." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Nezdařilo se zjištění aktuální frekvence tuneru u zařízení \"%s\"." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Nezdařilo se nastavení aktuální frekvence tuneru u zařízení \"%s\" na %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Nezdařilo se zjištění síly signálu u zařízení \"%s\"." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" "Nezdařilo se zjištění hodnoty u ovládacího prvku \"%d\" na zařízení \"%s\"." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Nezdařilo se nastavení hodnoty \"%d\" u ovládacího prvku \"%d\" na zařízení " "\"%s\"." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Nezdařilo se získání aktuálního vstupu na zařízení \"%s\". Možná se jedná o " "radiopřijímač." #, c-format msgid "Failed to set input %d on device %s." msgstr "Nezdařilo se nastavení vstupu \"%d\" na zařízení \"%s\"." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Nezdařilo se získání aktuálního výstupu na zařízení \"%s\". Možná se jedná o " "radiopřijímač" #, c-format msgid "Failed to set output %d on device %s." msgstr "Nezdařilo se nastavení výstupu %d na zařízení %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nezdařilo se zařazení vyrovnávací paměti na zařízení \"%s\"." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Nezdařil se pokus o získání videosnímků ze zařízení \"%s\"." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Selhání po %d pokusech. Zařízení %s. Systémová chyba: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nezdařilo se zjištění parametrů na zařízení \"%s\"" msgid "Video input device did not accept new frame rate setting." msgstr "Vstupní videozařízení nepřijalo nové nastavení vzorkovací frekvence." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nezdařilo se mapování vyrovnávací paměti ze zařízení \"%s\"" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Ovladač zařízení \"%s\" nepodporuje žádnou známou záznamovou metodu." msgid "Changing resolution at runtime is not yet supported." msgstr "Změna rozlišení za běhu doposud není podporována." msgid "Cannot operate without a clock" msgstr "Není možné fungovat bez hodin" gst-plugins-good-0.10.31/po/pl.po0000644000175000017500000003760411720565342013407 00000000000000# Polish translation for gst-plugins-good. # This file is distributed under the same license as the gst-plugins-good package. # Jakub Bogusz , 2007-2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-07 21:53+0100\n" "Last-Translator: Jakub Bogusz \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Nie udało się nawiązać połączenia z serwerem dźwięku" msgid "Failed to query sound server capabilities" msgstr "Nie udało się odpytać o możliwości serwera dźwięku" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' autorstwa '%s'" msgid "Internal data stream error." msgstr "Błąd wewnętrzny strumienia danych." msgid "Failed to decode JPEG image" msgstr "Nie udało się zdekodować obrazu JPEG" msgid "Could not connect to server" msgstr "Nie udało się połączyć z serwerem" msgid "Server does not support seeking." msgstr "Serwer nie obsługuje przewijania." msgid "Could not resolve server name." msgstr "Nie udało się rozwiązać nazwy serwera." msgid "Could not establish connection to server." msgstr "Nie udało się nawiązać połączenia z serwerem." msgid "Secure connection setup failed." msgstr "Ustanowienie bezpiecznego połączenia nie powiodło się." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Wystąpił błąd sieciowy lub serwer nieoczekiwanie zamknął połączenie." msgid "Server sent bad data." msgstr "Serwer przysłał błędne dane." msgid "No URL set." msgstr "Nie ustawiono URL-a." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Brak lub niepoprawne wejście dźwięku, strumień AVI będzie uszkodzony." msgid "This file contains no playable streams." msgstr "Ten plik nie zawiera strumieni nadających się do odtworzenia." msgid "This file is invalid and cannot be played." msgstr "Ten plik jest błędny i nie może być odtworzony." msgid "This file is corrupt and cannot be played." msgstr "Ten plik jest uszkodzony i nie może być odtworzony." msgid "Invalid atom size." msgstr "Błędny rozmiar atomu." msgid "This file is incomplete and cannot be played." msgstr "Ten plik jest niekompletny i nie może być odtworzony." msgid "The video in this file might not play correctly." msgstr "Obraz w tym pliku może nie być odtwarzany prawidłowo." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Ten plik zawiera zbyt dużo strumieni. Odtwarzanie tylko %d pierwszych" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nie znaleziono obsługiwanego strumienia. Być może trzeba zainstalować " "wtyczkę rozszerzenia GStreamera RTSP dla strumieni Real media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nie znaleziono obsługiwanego strumienia. Być może trzeba zezwolić na więcej " "protokołów transportu, albo może brakować właściwej wtyczki rozszerzenia " "RTSP GStreamera." msgid "Internal data flow error." msgstr "Błąd wewnętrzny przepływu danych." msgid "Volume" msgstr "Głośność" msgid "Bass" msgstr "Niskie" msgid "Treble" msgstr "Wysokie" msgid "Synth" msgstr "Syntezator" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Głośniczek" msgid "Line-in" msgstr "Wejście" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mikser" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Nagrywanie" msgid "In-gain" msgstr "Wzmocnienie we" msgid "Out-gain" msgstr "Wzmocnienie wy" msgid "Line-1" msgstr "Linia 1" msgid "Line-2" msgstr "Linia 2" msgid "Line-3" msgstr "Linia 3" msgid "Digital-1" msgstr "Cyfrowe 1" msgid "Digital-2" msgstr "Cyfrowe 2" msgid "Digital-3" msgstr "Cyfrowe 3" msgid "Phone-in" msgstr "Mikrofon" msgid "Phone-out" msgstr "Słuchawki" msgid "Video" msgstr "Obraz" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Urządzenie " "jest używane przez inną aplikację." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Brak uprawnień " "do otwarcia urządzenia." msgid "Could not open audio device for playback." msgstr "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Nie udało się otworzyć urządzenia dźwiękowego do nagrywania. Brak uprawnień " "do otwarcia urządzenia." msgid "Could not open audio device for recording." msgstr "Nie udało się otworzyć urządzenia dźwiękowego do nagrywania." msgid "Could not open audio device for mixer control handling." msgstr "Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nie udało się otworzyć urządzenia dźwiękowego do sterowania mikserem. Ta " "wersja Open Sound System nie jest obsługiwana przez ten element." msgid "Master" msgstr "Główna" msgid "Front" msgstr "Przód" msgid "Rear" msgstr "Tył" msgid "Headphones" msgstr "Słuchawki" msgid "Center" msgstr "Środek" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Boki" msgid "Built-in Speaker" msgstr "Wbudowany głośniczek" msgid "AUX 1 Out" msgstr "Wyjście AUX 1" msgid "AUX 2 Out" msgstr "Wyjście AUX 2" msgid "AUX Out" msgstr "Wyjście AUX" msgid "3D Depth" msgstr "Głębia 3D" msgid "3D Center" msgstr "Środek 3D" msgid "3D Enhance" msgstr "Rozszerzenie 3D" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Wyjście linii" msgid "Line In" msgstr "Wejście linii" msgid "Internal CD" msgstr "Wewnętrzny CD" msgid "Video In" msgstr "Wejście video" msgid "AUX 1 In" msgstr "Wejście AUX 1" msgid "AUX 2 In" msgstr "Wejście AUX 2" msgid "AUX In" msgstr "Wejście AUX" msgid "Record Gain" msgstr "Wzmocnienie nagrywania" msgid "Output Gain" msgstr "Wzmocnienie wyjścia" msgid "Microphone Boost" msgstr "Podbicie mikrofonu" msgid "Loopback" msgstr "Pętla zwrotna" msgid "Diagnostic" msgstr "Diagnostyka" msgid "Bass Boost" msgstr "Podbicie basów" msgid "Playback Ports" msgstr "Porty odtwarzania" msgid "Input" msgstr "Wejście" msgid "Record Source" msgstr "Źródło nagrywania" msgid "Monitor Source" msgstr "Źródło monitora" msgid "Keyboard Beep" msgstr "Piszczenie klawiatury" msgid "Simulate Stereo" msgstr "Symulacja stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Dźwięk surround" msgid "Microphone Gain" msgstr "Wzmocnienie mikrofonu" msgid "Speaker Source" msgstr "Źródło głośniczka" msgid "Microphone Source" msgstr "Źródło mikrofonu" msgid "Jack" msgstr "Gniazdo jack" msgid "Center / LFE" msgstr "Środek / LFE" msgid "Stereo Mix" msgstr "Miksowanie stereo" msgid "Mono Mix" msgstr "Miksowanie mono" msgid "Input Mix" msgstr "Miksowanie wejścia" msgid "SPDIF In" msgstr "Wejście SPDIF" msgid "SPDIF Out" msgstr "Wyjście SPDIF" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Wyjście cyfrowe" msgid "Digital In" msgstr "Wejście cyfrowe" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Zestaw słuchawkowy" msgid "Other" msgstr "Inne" msgid "None" msgstr "Brak" msgid "On" msgstr "Włączone" msgid "Off" msgstr "Wyłączone" msgid "Mute" msgstr "Wyciszenie" msgid "Fast" msgstr "Szybko" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Bardzo małe" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Małe" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Średnie" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Duże" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Bardzo duże" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produkcja" msgid "Front Panel Microphone" msgstr "Mikrofon na panelu przednim" msgid "Front Panel Line In" msgstr "Wejście linii na panelu przednim" msgid "Front Panel Headphones" msgstr "Słuchawki na panelu przednim" msgid "Front Panel Line Out" msgstr "Wyjśćie linii na panelu przednim" msgid "Green Connector" msgstr "Złącze zielone" msgid "Pink Connector" msgstr "Złącze różowe" msgid "Blue Connector" msgstr "Złącze niebieskie" msgid "White Connector" msgstr "Złącze białe" msgid "Black Connector" msgstr "Złącze czarne" msgid "Gray Connector" msgstr "Złącze szare" msgid "Orange Connector" msgstr "Złącze pomarańczowe" msgid "Red Connector" msgstr "Złącze czerwone" msgid "Yellow Connector" msgstr "Złącze żółte" msgid "Green Front Panel Connector" msgstr "Złącze zielone na panelu przednim" msgid "Pink Front Panel Connector" msgstr "Złącze różowe na panelu przednim" msgid "Blue Front Panel Connector" msgstr "Złącze niebieskie na panelu przednim" msgid "White Front Panel Connector" msgstr "Złącze białe na panelu przednim" msgid "Black Front Panel Connector" msgstr "Złącze czarne na panelu przednim" msgid "Gray Front Panel Connector" msgstr "Złącze szare na panelu przednim" msgid "Orange Front Panel Connector" msgstr "Złącze pomarańczowe na panelu przednim" msgid "Red Front Panel Connector" msgstr "Złącze czerwone na panelu przednim" msgid "Yellow Front Panel Connector" msgstr "Złącze żółte na panelu przednim" msgid "Spread Output" msgstr "Rozprowadzenie wyjścia" msgid "Downmix" msgstr "Miksowanie w dół" msgid "Virtual Mixer Input" msgstr "Wejście miksera wirtualnego" msgid "Virtual Mixer Output" msgstr "Wyjście miksera wirtualnego" msgid "Virtual Mixer Channels" msgstr "Kanały miksera wirtualnego" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Funkcja %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Funkcja %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nie udało się otworzyć urządzenia dźwiękowego do odtwarzania. Ta wersja Open " "Sound System nie jest obsługiwana przez ten element." msgid "Playback is not supported by this audio device." msgstr "Odtwarzanie nie jest obsługiwane przez to urządzenie dźwiękowe." msgid "Audio playback error." msgstr "Błąd odtwarzania dźwięku." msgid "Recording is not supported by this audio device." msgstr "Nagrywanie nie jest obsługiwane przez to urządzenie dźwiękowe." msgid "Error recording from audio device." msgstr "Błąd nagrywania z urządzenia dźwiękowego." msgid "Gain" msgstr "Wzmocnienie" msgid "Headphone" msgstr "Słuchawki" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Błąd odczytu %d bajtów z urządzenia '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Otrzymano nieoczekiwany rozmiar klatki %u zamiast %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Błąd odczytu %d bajtów z urządzenia '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Błąd pobierania możliwości urządzenia '%s': to nie jest sterownik v4l2. " "Proszę sprawdzić czy to sterownik v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Nie udało się odpytać o atrybuty wejścia %d urządzenia %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Nie udało się uzyskać ustawień tunera %d urządzenia '%s'." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Nie udało się odpytać normalizacji urządzenia '%s'." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Nie udało się uzyskać atrybutów sterujących urządzenia '%s'." #, c-format msgid "Cannot identify device '%s'." msgstr "Nie można zidentyfikować urządzenia '%s'." #, c-format msgid "This isn't a device '%s'." msgstr "To nie jest urządzenie '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nie udało się otworzyć urządzenia '%s' do odczytu i zapisu." #, c-format msgid "Device '%s' is not a capture device." msgstr "Urządzenie '%s' nie jest urządzeniem przechwytującym." #, c-format msgid "Device '%s' is not a output device." msgstr "Urządzenie '%s' nie jest urządzeniem wyjściowym." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Nie udało się ustawić normalizacji dla urządzenia '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Nie udało się uzyskać aktualnej częstotliwości tunera dla urządzenia '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Nie udało się ustawić aktualnej częstotliwości tunera dla urządzenia '%s' na " "%lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Nie udało się uzyskać siły sygnału dla urządzenia '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Nie udało się uzyskać wartości sterującej %d urządzenia '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Nie udało się ustawić %d jako wartości sterującej %d urządzenia '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Nie udało się uzyskać aktualnego wejścia urządzenia '%s'. Może to radio" #, c-format msgid "Failed to set input %d on device %s." msgstr "Nie udało się ustawić wejścia %d urządzenia %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Nie udało się uzyskać aktualnego wyjścia urządzenia '%s'. Może to radio" #, c-format msgid "Failed to set output %d on device %s." msgstr "Nie udało się ustawić wyjścia %d urządzenia %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nie udało się skolejkować buforów urządzenia '%s'." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Nie udało się uzyskać klatek obrazu z urządzenia '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Niepowodzenie po %d próbach. Urządzenie %s. Błąd systemowy: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nie udało się uzyskać parametrów urządzenia '%s'" msgid "Video input device did not accept new frame rate setting." msgstr "" "Urządzenie wejściowe obrazu nie przyjęło nowego ustawienia częstotliwości " "klatek." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nie udało się odwzorować buforów z urządzenia '%s'" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Sterownik urządzenia '%s' nie obsługuje żadnej znanej metody przechwytywania." msgid "Changing resolution at runtime is not yet supported." msgstr "Zmiana rozdzielczości w czasie działania nie jest jeszcze obsługiwana." msgid "Cannot operate without a clock" msgstr "Nie można pracować bez zegara" gst-plugins-good-0.10.31/po/ca.gmo0000644000175000017500000003743211720560373013521 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""# $ $$ $$ $U$ N% \% j% x% % %-%%%%"% &!/&Q&d&+g&"&&,&C&#/'RS'0'5'< (GJ(V((B)v)G*k*CE+n+F++?,5k,5, ,,, - - -!-)-D-C-C<.E.I.(/b9/c/X0TY0H0I0TA1E181b28x29292M%3Zs3333#3$4D4a4Cg44!44!4 55 +5 65A5F5V5^5 o5/y5/5"55 6#636D6V6_6h6q6 6666 6 6 6666 777!7 27>7F7G_77M88888$9(9/9@9Q9U9[9p99!9959 : : ::-:D:6Z::$: : :/:";&7;^;f;w;;;;; ; ; ;;Z;?M<.<K<2=5;=2q="== = ===[=W>t>>>>">>!>v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2012-01-01 14:19+0100 Last-Translator: Gil Forcada Language-Team: Catalan Language: ca MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; Funció %s %dFunció %s«%s» per «%s»Centre 3DProfunditat 3DMillora 3DS'ha produït un error de xarxa, o el servidor ha tancat la connexió inesperadament.Entrada AUX 1Sortida AUX 1Entrada AUX 2Sortida AUX 2Entrada AUXSortida AUXS'ha produït un error al reproduir l'àudio.BaixosAmplificació dels baixosConnector negreConnector negre del quadre frontalConnector blauConnector blau del quadre frontalAltaveu incorporatCDNo es pot identificar el dispositiu «%s».No es pot operar sense un rellotgeCentralCentre / LFE (efectes de baixa freqüència)Encara no es permet el canvi de la resolució en temps d'execució.No s'ha pogut connectar al servidorNo s'han pogut enviar a la cua les memòries intermèdies en el dispositiu «%s».No s'ha pogut establir la connexió al servidor.No s'ha pogut establir la connexió al servidor de soNo s'han pogut obtenir els paràmetres del dispositiu «%s»No s'han pogut mapejar les memòries intermèdies del dispositiu «%s»No s'ha pogut obrir el dispositiu d'àudio per a la gestió del control del mesclador.No s'ha pogut obrir el dispositiu d'àudio per a la gestió del control del mesclador. Aquesta versió de l'Open Sound System no és compatible amb aquest element.No s'ha pogut obrir el dispositiu d'àudio per a la reproducció.No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. Una altra aplicació està utilitzant el dispositiu.No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. Aquesta versió de l'Open Sound System no és compatible amb aquest element.No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. No teniu permís per obrir el dispositiu.No s'ha pogut obrir el dispositiu d'àudio per a l'enregistrament.No s'ha pogut obrir el dispositiu d'àudio per a l'enregistrament. No teniu permís per obrir el dispositiu.No s'ha pogut obrir el dispositiu «%s» per a lectura i l'escriptura.No s'ha pogut resoldre el nom del servidor.El dispositiu «%s» no és un dispositiu de captura.El dispositiu «%s» no és un dispositiu de sortida.DiagnòsticEntrada digitalSortida digitalDigital-1Digital-2Digital-3DownmixS'ha produït un error en obtenir les capacitats del dispositiu «%s»: no és un controlador v4l2. Comproveu si és un controlador v4l1.S'ha produït un error al llegir %d bytes des del dispositiu «%s».S'ha produït un error al llegir %d bytes en el dispositiu «%s».S'ha produït un error a l'enregistrar des del dispositiu d'àudio.Ha fallat després de %d intents. Dispositiu %s. Error de sistema: %sNo s'ha pogut obtenir els atributs dels controls en el dispositiu «%s».Ha fallat en descodificar la imatge JPEGNo s'ha pogut obtenir l'entrada actual en el dispositiu «%s». Potser és un dispositiu de ràdioNo s'ha pogut obtenir la sortida actual en el dispositiu «%s». Potser és un dispositiu de ràdioNo s'ha pogut obtenir la freqüència actual del sintonitzador per al dispositiu «%s».No s'han pogut obtenir els paràmetres del sintonitzador %d en el dispositiu «%s».No s'ha pogut obtenir la intensitat del senyal per al dispositiu «%s».No s'ha pogut obtenir el valor per al control %d en el dispositiu «%s».S'ha produït un error en consultar els atributs de l'entrada %d en el dispositiu %sS'ha produït un error en consultar la norma en el dispositiu «%s».Ha fallat en consultar les capacitats del servidor de soNo s'ha pogut establir la freqüència actual del sintonitzador per al dispositiu «%s» a %lu Hz.No s'ha pogut establir l'entrada %d en el dispositiu %s.No s'ha pogut establir la norma per al dispositiu «%s».No s'ha pogut establir la sortida %d en el dispositiu %s.No s'ha pogut establir el valor %d per al control %d en el dispositiu «%s».S'ha produït un error en provar d'obtenir fotogrames de vídeo des del dispositiu «%s».RàpidFrontalAuriculars del quadre frontalLínia d'entrada del quadre frontalLínia de sortida del quadre frontalMicròfon del quadre frontalGuanyS'ha obtingut una mida de fotograma inesperada de %u en lloc de %u.Connector grisConnector gris del quadre frontalConnector verdConnector verd del quadre frontalHDMIComandament a distànciaAuricularsAuricularsAltaGuany d'entradaEntradaMescla d'entradaCD internS'ha produït un error intern de flux de dades.S'ha produït un error intern de flux de dades.La mida de l'àtom no és vàlida.JackSo del teclatLFE (efectes de baixa freqüència)Línia d'entradaLínia de sortidaLínia-1Línia-2Línia-3Línia d'entradaBucle localBaixaMestreMitjanaMicròfonMicròfon 1Micròfon 2Amplificació del micròfonGuany del micròfonFont del micròfonMescladorMòdemMonitorFont del monitorMescla monoSilenciNo s'ha indicat cap URL.Manca o no és vàlida l'entrada d'àudio, el flux AVI estarà malmès.No s'ha trobat cap flux compatible. Podríeu necessitar permetre més protocols de transport o bé potser manca el connector d'extensió RTSP del GStreamer correcte.No s'ha trobat cap flux compatible. Podríeu necessitar instal·lar un connector d'extensió RTSP del GStreamer per a fluxos de multimèdia Real.CapApagatEncèsConnector taronjaConnector taronja del quadre frontalAltresGuany de sortidaGuany de sortidaPCMPCM-2Entrada del telèfonSortida del telèfonConnector rosaConnector rosa del quadre frontalPorts de reproduccióAquest dispositiu d'àudio no permet la reproducció.ProduccióRàdioPosteriorEnregistramentGuany d'enregistramentFont d'enregistramentAquest dispositiu d'àudio no permet l'enregistrament.Connector vermellConnector vermell del quadre frontalEntrada SPDIFSortida SPDIFHa fallat la configuració de connexió segura.El servidor no ademet les cerques.El servidor ha enviat dades errònies.LateralEstèreo simulatAltaveuFont de l'altaveuSortida de propagacióEstèreoMescla estèreoSo envoltantSo envoltantSintetitzadorTelèfonEl controlador del dispositiu «%s» no és compatible amb cap mètode de captura conegut.El vídeo en aquest fitxer podria no reproduir-se correctament.Aquest fitxer no conté cap flux reproduïble.Aquest fitxer conté massa fluxos. Només s'estan reproduint els primers %dAquest fitxer està malmès i no es pot reproduir.Aquest fitxer no està complet i no es pot reproduir.Aquest fitxer no és vàlid i no es pot reproduir.Això no és un dispositiu «%s».AgutsMolt altaMolt baixaVídeoEntrada de vídeoEl dispositiu d'entrada de vídeo no ha acceptat el paràmetre nou de fotogrames per segon.Canals del mesclador virtualEntrada del mesclador virtualSortida del mesclador virtualVolumConnector blancConnector blanc del quadre frontalConnector grocConnector groc del quadre frontalgst-plugins-good-0.10.31/po/ca.po0000644000175000017500000005150011720560372013344 00000000000000# Catalan translation of gst-plugins-good # Copyright © 2005 Free Software Foundation, Inc. # This file is put in the public domain. # Jordi Mallach , 2005. # Jordi Estrada , 2011. # Gil Forcada , 2012. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2012-01-01 14:19+0100\n" "Last-Translator: Gil Forcada \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgid "Could not establish connection to sound server" msgstr "No s'ha pogut establir la connexió al servidor de so" msgid "Failed to query sound server capabilities" msgstr "Ha fallat en consultar les capacitats del servidor de so" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» per «%s»" msgid "Internal data stream error." msgstr "S'ha produït un error intern de flux de dades." msgid "Failed to decode JPEG image" msgstr "Ha fallat en descodificar la imatge JPEG" msgid "Could not connect to server" msgstr "No s'ha pogut connectar al servidor" msgid "Server does not support seeking." msgstr "El servidor no ademet les cerques." msgid "Could not resolve server name." msgstr "No s'ha pogut resoldre el nom del servidor." msgid "Could not establish connection to server." msgstr "No s'ha pogut establir la connexió al servidor." msgid "Secure connection setup failed." msgstr "Ha fallat la configuració de connexió segura." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "S'ha produït un error de xarxa, o el servidor ha tancat la connexió " "inesperadament." msgid "Server sent bad data." msgstr "El servidor ha enviat dades errònies." msgid "No URL set." msgstr "No s'ha indicat cap URL." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Manca o no és vàlida l'entrada d'àudio, el flux AVI estarà malmès." msgid "This file contains no playable streams." msgstr "Aquest fitxer no conté cap flux reproduïble." msgid "This file is invalid and cannot be played." msgstr "Aquest fitxer no és vàlid i no es pot reproduir." msgid "This file is corrupt and cannot be played." msgstr "Aquest fitxer està malmès i no es pot reproduir." msgid "Invalid atom size." msgstr "La mida de l'àtom no és vàlida." msgid "This file is incomplete and cannot be played." msgstr "Aquest fitxer no està complet i no es pot reproduir." msgid "The video in this file might not play correctly." msgstr "El vídeo en aquest fitxer podria no reproduir-se correctament." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Aquest fitxer conté massa fluxos. Només s'estan reproduint els primers %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "No s'ha trobat cap flux compatible. Podríeu necessitar instal·lar un " "connector d'extensió RTSP del GStreamer per a fluxos de multimèdia Real." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "No s'ha trobat cap flux compatible. Podríeu necessitar permetre més " "protocols de transport o bé potser manca el connector d'extensió RTSP del " "GStreamer correcte." msgid "Internal data flow error." msgstr "S'ha produït un error intern de flux de dades." msgid "Volume" msgstr "Volum" msgid "Bass" msgstr "Baixos" msgid "Treble" msgstr "Aguts" msgid "Synth" msgstr "Sintetitzador" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Altaveu" msgid "Line-in" msgstr "Línia d'entrada" msgid "Microphone" msgstr "Micròfon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mesclador" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Enregistrament" msgid "In-gain" msgstr "Guany d'entrada" msgid "Out-gain" msgstr "Guany de sortida" msgid "Line-1" msgstr "Línia-1" msgid "Line-2" msgstr "Línia-2" msgid "Line-3" msgstr "Línia-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Entrada del telèfon" msgid "Phone-out" msgstr "Sortida del telèfon" msgid "Video" msgstr "Vídeo" msgid "Radio" msgstr "Ràdio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. Una altra " "aplicació està utilitzant el dispositiu." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. No teniu " "permís per obrir el dispositiu." msgid "Could not open audio device for playback." msgstr "No s'ha pogut obrir el dispositiu d'àudio per a la reproducció." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "No s'ha pogut obrir el dispositiu d'àudio per a l'enregistrament. No teniu " "permís per obrir el dispositiu." msgid "Could not open audio device for recording." msgstr "No s'ha pogut obrir el dispositiu d'àudio per a l'enregistrament." msgid "Could not open audio device for mixer control handling." msgstr "" "No s'ha pogut obrir el dispositiu d'àudio per a la gestió del control del " "mesclador." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "No s'ha pogut obrir el dispositiu d'àudio per a la gestió del control del " "mesclador. Aquesta versió de l'Open Sound System no és compatible amb aquest " "element." msgid "Master" msgstr "Mestre" msgid "Front" msgstr "Frontal" msgid "Rear" msgstr "Posterior" msgid "Headphones" msgstr "Auriculars" msgid "Center" msgstr "Central" msgid "LFE" msgstr "LFE (efectes de baixa freqüència)" msgid "Surround" msgstr "So envoltant" msgid "Side" msgstr "Lateral" msgid "Built-in Speaker" msgstr "Altaveu incorporat" msgid "AUX 1 Out" msgstr "Sortida AUX 1" msgid "AUX 2 Out" msgstr "Sortida AUX 2" msgid "AUX Out" msgstr "Sortida AUX" msgid "3D Depth" msgstr "Profunditat 3D" msgid "3D Center" msgstr "Centre 3D" msgid "3D Enhance" msgstr "Millora 3D" msgid "Telephone" msgstr "Telèfon" msgid "Line Out" msgstr "Línia de sortida" msgid "Line In" msgstr "Línia d'entrada" msgid "Internal CD" msgstr "CD intern" msgid "Video In" msgstr "Entrada de vídeo" msgid "AUX 1 In" msgstr "Entrada AUX 1" msgid "AUX 2 In" msgstr "Entrada AUX 2" msgid "AUX In" msgstr "Entrada AUX" msgid "Record Gain" msgstr "Guany d'enregistrament" msgid "Output Gain" msgstr "Guany de sortida" msgid "Microphone Boost" msgstr "Amplificació del micròfon" msgid "Loopback" msgstr "Bucle local" msgid "Diagnostic" msgstr "Diagnòstic" msgid "Bass Boost" msgstr "Amplificació dels baixos" msgid "Playback Ports" msgstr "Ports de reproducció" msgid "Input" msgstr "Entrada" msgid "Record Source" msgstr "Font d'enregistrament" msgid "Monitor Source" msgstr "Font del monitor" msgid "Keyboard Beep" msgstr "So del teclat" msgid "Simulate Stereo" msgstr "Estèreo simulat" msgid "Stereo" msgstr "Estèreo" msgid "Surround Sound" msgstr "So envoltant" msgid "Microphone Gain" msgstr "Guany del micròfon" msgid "Speaker Source" msgstr "Font de l'altaveu" msgid "Microphone Source" msgstr "Font del micròfon" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Centre / LFE (efectes de baixa freqüència)" msgid "Stereo Mix" msgstr "Mescla estèreo" msgid "Mono Mix" msgstr "Mescla mono" msgid "Input Mix" msgstr "Mescla d'entrada" msgid "SPDIF In" msgstr "Entrada SPDIF" msgid "SPDIF Out" msgstr "Sortida SPDIF" msgid "Microphone 1" msgstr "Micròfon 1" msgid "Microphone 2" msgstr "Micròfon 2" msgid "Digital Out" msgstr "Sortida digital" msgid "Digital In" msgstr "Entrada digital" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Mòdem" msgid "Handset" msgstr "Comandament a distància" msgid "Other" msgstr "Altres" msgid "None" msgstr "Cap" msgid "On" msgstr "Encès" msgid "Off" msgstr "Apagat" msgid "Mute" msgstr "Silenci" msgid "Fast" msgstr "Ràpid" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Molt baixa" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Baixa" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Mitjana" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Alta" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Molt alta" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Producció" msgid "Front Panel Microphone" msgstr "Micròfon del quadre frontal" msgid "Front Panel Line In" msgstr "Línia d'entrada del quadre frontal" msgid "Front Panel Headphones" msgstr "Auriculars del quadre frontal" msgid "Front Panel Line Out" msgstr "Línia de sortida del quadre frontal" msgid "Green Connector" msgstr "Connector verd" msgid "Pink Connector" msgstr "Connector rosa" msgid "Blue Connector" msgstr "Connector blau" msgid "White Connector" msgstr "Connector blanc" msgid "Black Connector" msgstr "Connector negre" msgid "Gray Connector" msgstr "Connector gris" msgid "Orange Connector" msgstr "Connector taronja" msgid "Red Connector" msgstr "Connector vermell" msgid "Yellow Connector" msgstr "Connector groc" msgid "Green Front Panel Connector" msgstr "Connector verd del quadre frontal" msgid "Pink Front Panel Connector" msgstr "Connector rosa del quadre frontal" msgid "Blue Front Panel Connector" msgstr "Connector blau del quadre frontal" msgid "White Front Panel Connector" msgstr "Connector blanc del quadre frontal" msgid "Black Front Panel Connector" msgstr "Connector negre del quadre frontal" msgid "Gray Front Panel Connector" msgstr "Connector gris del quadre frontal" msgid "Orange Front Panel Connector" msgstr "Connector taronja del quadre frontal" msgid "Red Front Panel Connector" msgstr "Connector vermell del quadre frontal" msgid "Yellow Front Panel Connector" msgstr "Connector groc del quadre frontal" msgid "Spread Output" msgstr "Sortida de propagació" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "Entrada del mesclador virtual" msgid "Virtual Mixer Output" msgstr "Sortida del mesclador virtual" msgid "Virtual Mixer Channels" msgstr "Canals del mesclador virtual" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Funció %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Funció %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "No s'ha pogut obrir el dispositiu d'àudio per a la reproducció. Aquesta " "versió de l'Open Sound System no és compatible amb aquest element." msgid "Playback is not supported by this audio device." msgstr "Aquest dispositiu d'àudio no permet la reproducció." msgid "Audio playback error." msgstr "S'ha produït un error al reproduir l'àudio." msgid "Recording is not supported by this audio device." msgstr "Aquest dispositiu d'àudio no permet l'enregistrament." msgid "Error recording from audio device." msgstr "S'ha produït un error a l'enregistrar des del dispositiu d'àudio." msgid "Gain" msgstr "Guany" msgid "Headphone" msgstr "Auriculars" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "S'ha produït un error al llegir %d bytes des del dispositiu «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "S'ha obtingut una mida de fotograma inesperada de %u en lloc de %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "S'ha produït un error al llegir %d bytes en el dispositiu «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "S'ha produït un error en obtenir les capacitats del dispositiu «%s»: no és " "un controlador v4l2. Comproveu si és un controlador v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" "S'ha produït un error en consultar els atributs de l'entrada %d en el " "dispositiu %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "No s'han pogut obtenir els paràmetres del sintonitzador %d en el dispositiu " "«%s»." #, c-format msgid "Failed to query norm on device '%s'." msgstr "S'ha produït un error en consultar la norma en el dispositiu «%s»." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" "No s'ha pogut obtenir els atributs dels controls en el dispositiu «%s»." #, c-format msgid "Cannot identify device '%s'." msgstr "No es pot identificar el dispositiu «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "Això no és un dispositiu «%s»." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "No s'ha pogut obrir el dispositiu «%s» per a lectura i l'escriptura." #, c-format msgid "Device '%s' is not a capture device." msgstr "El dispositiu «%s» no és un dispositiu de captura." #, c-format msgid "Device '%s' is not a output device." msgstr "El dispositiu «%s» no és un dispositiu de sortida." #, c-format msgid "Failed to set norm for device '%s'." msgstr "No s'ha pogut establir la norma per al dispositiu «%s»." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "No s'ha pogut obtenir la freqüència actual del sintonitzador per al " "dispositiu «%s»." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "No s'ha pogut establir la freqüència actual del sintonitzador per al " "dispositiu «%s» a %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "No s'ha pogut obtenir la intensitat del senyal per al dispositiu «%s»." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" "No s'ha pogut obtenir el valor per al control %d en el dispositiu «%s»." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "No s'ha pogut establir el valor %d per al control %d en el dispositiu «%s»." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "No s'ha pogut obtenir l'entrada actual en el dispositiu «%s». Potser és un " "dispositiu de ràdio" #, c-format msgid "Failed to set input %d on device %s." msgstr "No s'ha pogut establir l'entrada %d en el dispositiu %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "No s'ha pogut obtenir la sortida actual en el dispositiu «%s». Potser és un " "dispositiu de ràdio" #, c-format msgid "Failed to set output %d on device %s." msgstr "No s'ha pogut establir la sortida %d en el dispositiu %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "" "No s'han pogut enviar a la cua les memòries intermèdies en el dispositiu " "«%s»." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" "S'ha produït un error en provar d'obtenir fotogrames de vídeo des del " "dispositiu «%s»." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Ha fallat després de %d intents. Dispositiu %s. Error de sistema: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "No s'han pogut obtenir els paràmetres del dispositiu «%s»" msgid "Video input device did not accept new frame rate setting." msgstr "" "El dispositiu d'entrada de vídeo no ha acceptat el paràmetre nou de " "fotogrames per segon." #, c-format msgid "Could not map buffers from device '%s'" msgstr "No s'han pogut mapejar les memòries intermèdies del dispositiu «%s»" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "El controlador del dispositiu «%s» no és compatible amb cap mètode de " "captura conegut." msgid "Changing resolution at runtime is not yet supported." msgstr "Encara no es permet el canvi de la resolució en temps d'execució." msgid "Cannot operate without a clock" msgstr "No es pot operar sense un rellotge" #~ msgid "Describes the selected input element." #~ msgstr "Descriu l'element d'entrada seleccionat." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "" #~ "Descriu l'element de sortida seleccionat per a les conferències d'àudio/" #~ "vídeo." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "" #~ "Descriu l'element de sortida seleccionat per a la música i les " #~ "pel·lícules." #~ msgid "Describes the selected output element." #~ msgstr "Descriu l'element de sortida seleccionat." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "L'audiosink del GStreamer per a les conferències d'àudio/vídeo" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "L'audiosink del GStreamer per a la música i les pel·lícules" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "El GStreamer pot reproduir l'àudio utilitzant qualsevol nombre d'elements " #~ "de sortida. Algunes opcions possibles són l'osssink, l'esdsink i " #~ "l'alsasink. L'audiosink pot ser un conducte parcial en lloc d'un sol " #~ "element." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "El GStreamer pot reproduir el vídeo utilitzant qualsevol nombre " #~ "d'elements de sortida. Algunes opcions possibles són el xvimagesink, el " #~ "ximagesink, el sdlvideosink i l'aasink. El videosink pot ser un conducte " #~ "parcial en lloc d'un sol element." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "El GStreamer pot posar els connectors de visualització en un conducte per " #~ "transformar el flux d'àudio en els fotogrames del vídeo. Per defecte és " #~ "el goom però aviat s'importaran més connectors de visualització. El " #~ "connector de visualització pot ser un conducte parcial en lloc d'un sol " #~ "element." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "El GStreamer pot enregistrar l'àudio utilitzant qualsevol nombre " #~ "d'elements d'entrada. Algunes opcions possibles són l'osssrc, l'esdsrc i " #~ "l'alsasrc. La font d'àudio pot ser un conducte parcial en lloc d'un sol " #~ "element." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "El GStreamer pot enregistrar el vídeo de qualsevol nombre d'elements " #~ "d'entrada. Algunes opcions possibles són el v4lsrc i el videotestsrc. La " #~ "font del vídeo pot ser un conducte parcial en lloc d'un sol element." #~ msgid "default GStreamer audio source" #~ msgstr "font d'àudio del GStreamer per defecte" #~ msgid "default GStreamer audiosink" #~ msgstr "audiosink del GStreamer per defecte" #~ msgid "default GStreamer video source" #~ msgstr "font de vídeo del GStreamer per defecte" #~ msgid "default GStreamer videosink" #~ msgstr "videosink del GStreamer per defecte" #~ msgid "default GStreamer visualization plugin" #~ msgstr "connector de visualització del GStreamer per defecte" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "" #~ "descripció de l'audiosink del GStreamer per a les conferències d'àudio/" #~ "vídeo" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "" #~ "descripció de l'audiosink del GStreamer per a la música i les pel·lícules" #~ msgid "description for default GStreamer audiosink" #~ msgstr "descripció de l'audiosink del GStreamer per defecte" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "descripció de l'audiosrc del GStreamer per defecte" gst-plugins-good-0.10.31/po/zh_CN.gmo0000644000175000017500000001721611720565343014137 00000000000000Rm<   (+H4g).'&9)`VW*9 Xd 3 $ # : D N aX ( & 2 2= p G 6 1 .= 2l 3 ) @ $> 5c 3  .  -IRY`g oz6rV  D0Y':*-*Fq9f |   *%5>'t#,'NEd!?# #0T r  b7478l2M8?9x/76$QCv0C5/e7l  . 5 ?4I~p  ~     >0.$_7$$!(@O0V"!R*D145 2N G.&7, L:F<I($> ?896)E= -C +;BPQ3#/MH@'AK%0JO'%s' by '%s'AUX 1 OutAUX 2 OutBassBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Device '%s' is not a capture device.Device '%s' is not a output device.Digital-1Digital-2Digital-3Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.GainGot unexpected frame size of %u instead of %u.HeadphoneIn-gainInternal data flow error.Internal data stream error.Line OutLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSPDIF OutSpeakerSynthThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVideoVideo input device did not accept new frame rate setting.VolumeProject-Id-Version: gst-plugins-good 0.10.16.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2009-11-13 22:20+0800 Last-Translator: Ji ZhengYu Language-Team: Chinese (simplified) Language: zh_CN MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit ‘%s’ 由 ‘%s’AUX 1 输出AUX 2 输出低音(Bass)内建扬声器CD 音频无法确认设备‘%s’。没有时钟的话无法操作尚不支持在运行时更改分辨率。无法连接至服务器无法对设备‘%s’中的缓冲区进行排序。无法建立与音频服务器的连接无法获取设备‘%s’的参数无法从设备‘%s’中映射出缓冲区无法打开音频设备播放音频。无法打开音频设备播放音频。设备当前由另一个程序使用。无法打开音频设备播放音频。您无权使用这一设备。无法打开音频设备录音。无法打开音频设备录音。您无权使用这一设备。无法打开设备‘%s’读写。‘%s’不是一个捕获设备。‘%s’不是输出设备。数字线路1数字线路2数字线路3获取设备‘%s’的信息时出错:它不是一个 v4l2 驱动器,请检查是否为 v4l1。从设备‘%2$s’中读取 %1$d 个字节时出错。读取设备‘%2$s’中的 %1$d 字节时出错。在 %d 次尝试后失败。设备 %s。系统错误: %s获取设备‘%s’上的控制属性时出错。解码 JPEG 图像出错获取设备‘%s’上的当前输入出错。也许它是一个广播设备获取设备‘%s’的当前微调钮频率时出错。获取设备 %2$s 上的微调钮 %1$d 的设置时出错获取设备‘%s’的信号长度时出错。获取设备‘%2$s’的控制器 %1$d 的值出错。查寻设备 %2$s 中的输入 %1$d 的属性时出错查寻音频服务器的服务失败设置设备‘%s’的当前微调钮频率为 %lu Hz 时出错。设置设备 %2$s 上的输入 %1$d 时出错。设置设备‘%3$s’的控制器 %2$d 的值为 %1$d 时出错。从设备‘%s’上获取视频的尝试失败了。增益取得了 %u 的不需要的帧大小,而不是 %u。头戴式耳机输入增益内部数据流错误。内部数据流错误。线路输出线路1线路2线路3线路输入(Line-in)话筒混音器监控器没有或无效的输入音频,AVI 流将损坏。未找到支持的流媒体。您可能需要启用更多的传送协议,或者也有可能是缺少正确的 GStreamer RTSP 扩展插件。未找到支持的流媒体。您可能需要安装一个 GStreamer RTSP 扩展插件来播放 Real 媒体流。输出增益波形(PCM)PCM-2话筒输入话筒输出广播录音SPDIF 输出扬声器(Speaker)合成器设备‘%s’的驱动不支持任何已知的捕获方式。此文件中的视频可能无法正确播放。此文件不包含可播放的流。此文件包含了太多的流。只播放前面 %d 个此文件已损坏,无法播放。此文件不完整且无法播放。此文件无效,无法播放。不是设备‘%s’。高音(Treble)视频视频输入设备不接受新的帧率设置。音量gst-plugins-good-0.10.31/po/en@quot.header0000644000175000017500000000226311720560211015200 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # gst-plugins-good-0.10.31/po/vi.po0000644000175000017500000004111111720565342013376 00000000000000# Vietnamese Translation for GST Plugins Good. # Copyright © 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # Clytie Siddall , 2005-2010. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.23.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-10-03 18:48+1030\n" "Last-Translator: Clytie Siddall \n" "Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: LocFactoryEditor 1.8\n" msgid "Could not establish connection to sound server" msgstr "Không thể thiết lập sự kết nối tới máy phục vụ âm thanh" msgid "Failed to query sound server capabilities" msgstr "Lỗi truy vấn khả năng của máy phục vụ âm thanh" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "« %s » bởi « %s »" msgid "Internal data stream error." msgstr "Lỗi luồng dữ liệu nội bộ." msgid "Failed to decode JPEG image" msgstr "Lỗi giải mã ảnh JPEG" msgid "Could not connect to server" msgstr "Không thể kết nối tới máy phục vụ" msgid "Server does not support seeking." msgstr "" #, fuzzy msgid "Could not resolve server name." msgstr "Không thể kết nối tới máy phục vụ" #, fuzzy msgid "Could not establish connection to server." msgstr "Không thể thiết lập sự kết nối tới máy phục vụ âm thanh" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Chưa có dữ liệu âm thanh nhập, hoặc dữ liệu âm thanh nhập không hợp lệ. Vì " "thế luồng AVI hư." msgid "This file contains no playable streams." msgstr "Tập tin này không chứa luồng có thể phát." msgid "This file is invalid and cannot be played." msgstr "Tập tin này không hợp lệ nên không thể phát được." msgid "This file is corrupt and cannot be played." msgstr "Tập tin này bị hỏng nên không thể phát." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Tập tin này chưa hoàn thành nên không thể được phát." msgid "The video in this file might not play correctly." msgstr "Ảnh động trong tập tin này có thể không phát đúng." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Tập tin này chứa quá nhiều luồng nên chỉ phát %d đầu tiên" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Không tìm thấy luồng được hỗ trợ. Người dùng có thể cần phải cài đặt một " "phần bổ sung RTSP Gstreamer để xử lý luồng nhạc/phim loại Real." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Không tìm thấy luồng được hỗ trợ. Người dùng có thể cần cho phép thêm giao " "thức truyền, hoặc chưa cài đặt phần bổ sung RTSP Gstreamer đúng." msgid "Internal data flow error." msgstr "Lỗi luồng dữ liệu nội bộ." msgid "Volume" msgstr "Âm lượng" msgid "Bass" msgstr "Trầm" msgid "Treble" msgstr "Cao" msgid "Synth" msgstr "Tổng hợp" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Loa" msgid "Line-in" msgstr "Dây-vào" msgid "Microphone" msgstr "Micrô" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Trộn" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Ghi" msgid "In-gain" msgstr "Vào-gia lượng" msgid "Out-gain" msgstr "Ra-gia lượng" msgid "Line-1" msgstr "Dây-1" msgid "Line-2" msgstr "Dây-2" msgid "Line-3" msgstr "Dây-3" msgid "Digital-1" msgstr "Đoạn biến-1" msgid "Digital-2" msgstr "Đoạn biến-2" msgid "Digital-3" msgstr "Đoạn biến-3" msgid "Phone-in" msgstr "Điện thoại-vào" msgid "Phone-out" msgstr "Điạn thoại-ra" msgid "Video" msgstr "Ảnh động" msgid "Radio" msgstr "Thu thanh" msgid "Monitor" msgstr "Màn hình" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Không thể mở thiết bị âm thanh để phát lại. Thiết bị này đang được một ứng " "dụng khác sử dụng." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Không thể mở thiết bị âm thanh để phát lại. Bạn không có quyền mở thiết bị " "này." msgid "Could not open audio device for playback." msgstr "Không thể mở thiết bị âm thanh để phát lại." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Không thể mở thiết bị âm thanh để thu. Bạn không có quyền mở thiết bị này." msgid "Could not open audio device for recording." msgstr "Không thể mở thiết bị âm thanh để thu." msgid "Could not open audio device for mixer control handling." msgstr "Không thể mở thiết bị âm thanh để quản lý điều khiển máy hoà tiếng." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Không thể mở thiết bị âm thanh để quản lý điều khiển máy hoà tiếng. Phiên " "bản Hệ thống Âm thanh Mở không phải được yếu tố này hỗ trợ." msgid "Master" msgstr "Chủ" msgid "Front" msgstr "Trước" msgid "Rear" msgstr "Sau" msgid "Headphones" msgstr "Tai nghe" msgid "Center" msgstr "Tâm" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Vòm" msgid "Side" msgstr "Bên" msgid "Built-in Speaker" msgstr "Loa dựng sẵn" msgid "AUX 1 Out" msgstr "AUX 1 Ra" msgid "AUX 2 Out" msgstr "AUX 2 Ra" msgid "AUX Out" msgstr "AUX Ra" msgid "3D Depth" msgstr "Sâu ba chiều" msgid "3D Center" msgstr "Tâm ba chiều" msgid "3D Enhance" msgstr "Tăng cường ba chiều" msgid "Telephone" msgstr "Điện thoại" msgid "Line Out" msgstr "Dây Ra" msgid "Line In" msgstr "Dây Vào" msgid "Internal CD" msgstr "CD ở trong" msgid "Video In" msgstr "Ảnh động Vào" msgid "AUX 1 In" msgstr "AUX 1 Vào" msgid "AUX 2 In" msgstr "AUX 2 Vào" msgid "AUX In" msgstr "AUX Vào" msgid "Record Gain" msgstr "Ghi lưu khuếch đại" msgid "Output Gain" msgstr "Khuếch đại Ra" msgid "Microphone Boost" msgstr "Tăng máy vi âm" msgid "Loopback" msgstr "Mạch nội bộ" msgid "Diagnostic" msgstr "Chẩn đoán" msgid "Bass Boost" msgstr "Tăng trầm" msgid "Playback Ports" msgstr "Cổng phát lại" msgid "Input" msgstr "Vào" msgid "Record Source" msgstr "Ghi lưu nguồn" msgid "Monitor Source" msgstr "Theo dõi nguồn" msgid "Keyboard Beep" msgstr "Bíp bàn phím" msgid "Simulate Stereo" msgstr "Mô phỏng âm lập thể" msgid "Stereo" msgstr "Âm lập thể" msgid "Surround Sound" msgstr "Âm thanh vòm" msgid "Microphone Gain" msgstr "Khuếch đại máy vi âm" msgid "Speaker Source" msgstr "Nguồn loa" msgid "Microphone Source" msgstr "Nguồn máy vi âm" msgid "Jack" msgstr "Ổ cắm" msgid "Center / LFE" msgstr "Tâm / LFE" msgid "Stereo Mix" msgstr "Hoả tiếng âm lập thể" msgid "Mono Mix" msgstr "Hoà tiếng đơn nguồn" msgid "Input Mix" msgstr "Hoà tiếng đầu vào" msgid "SPDIF In" msgstr "SPDIF Vào" msgid "SPDIF Out" msgstr "SPDIF Ra" msgid "Microphone 1" msgstr "Máy vi âm 1" msgid "Microphone 2" msgstr "Máy vi âm 2" msgid "Digital Out" msgstr "Điện số Ra" msgid "Digital In" msgstr "Điện số Vào" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Bộ điều giải" msgid "Handset" msgstr "Cầm tay" msgid "Other" msgstr "Khác" msgid "None" msgstr "Không có" msgid "On" msgstr "Bật" msgid "Off" msgstr "Tắt" msgid "Mute" msgstr "Câm" msgid "Fast" msgstr "Nhanh" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Rất thấp" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Thấp" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Vừa" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Cao" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Rất cao" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Sản xuất" msgid "Front Panel Microphone" msgstr "Mặt trước: Máy vi âm" msgid "Front Panel Line In" msgstr "Mặt trước: Dây Vào" msgid "Front Panel Headphones" msgstr "Mặt trước: Tai nghe" msgid "Front Panel Line Out" msgstr "Mặt trước: Dây Ra" msgid "Green Connector" msgstr "Đầu nối màu lục" msgid "Pink Connector" msgstr "Đầu nối màu hồng" msgid "Blue Connector" msgstr "Đầu nối màu xanh" msgid "White Connector" msgstr "Đầu nối màu trắng" msgid "Black Connector" msgstr "Đầu nối màu đen" msgid "Gray Connector" msgstr "Đầu nối màu xám" msgid "Orange Connector" msgstr "Đầu nối màu cam" msgid "Red Connector" msgstr "Đầu nối màu đỏ" msgid "Yellow Connector" msgstr "Đầu nối màu vàng" msgid "Green Front Panel Connector" msgstr "Mặt trước: đầu nối màu lục" msgid "Pink Front Panel Connector" msgstr "Mặt trước: đầu nối màu hồng" msgid "Blue Front Panel Connector" msgstr "Mặt trước: đầu nối màu xanh" msgid "White Front Panel Connector" msgstr "Mặt trước: đầu nối màu trắng" msgid "Black Front Panel Connector" msgstr "Mặt trước: đầu nối màu đen" msgid "Gray Front Panel Connector" msgstr "Mặt trước: đầu nối màu xám" msgid "Orange Front Panel Connector" msgstr "Mặt trước: đầu nối màu cam" msgid "Red Front Panel Connector" msgstr "Mặt trước: đầu nối màu đỏ" msgid "Yellow Front Panel Connector" msgstr "Mặt trước: đầu nối màu vàng" msgid "Spread Output" msgstr "Mở rộng kết xuất" msgid "Downmix" msgstr "Hạ hoà tiếng" msgid "Virtual Mixer Input" msgstr "Hoà tiếng ảo : Vào" msgid "Virtual Mixer Output" msgstr "Hoà tiếng ảo : Ra" msgid "Virtual Mixer Channels" msgstr "Hoà tiếng ảo : Kênh" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Chức năng %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Chức năng %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Không thể mở thiết bị âm thanh để phát lại. Phiên bản Hệ thống Âm thanh Mở " "này không được yếu tố này hỗ trợ." msgid "Playback is not supported by this audio device." msgstr "Chức năng phát lại không phải được thiết bị âm thanh này hỗ trợ." msgid "Audio playback error." msgstr "Lỗi phát lại âm thanh." msgid "Recording is not supported by this audio device." msgstr "Chức năng thu không phải được thiết bị âm thanh này hỗ trợ." msgid "Error recording from audio device." msgstr "Gặp lỗi khi thu từ thiết bị âm thanh." msgid "Gain" msgstr "Khuếch đại" msgid "Headphone" msgstr "Tai nghe" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Gặp lỗi khi đọc %d byte từ thiết bị « %s »." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Nhận được kích cỡ khung bất thường %u, thay cho %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Gặp lỗi khi đọc %d byte trên thiết bị « %s »." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Gặp lỗi khi lấy khả năng của thiết bị « %s ». Nó không phải là trình điều " "khiển phiên bản 4l2. Kiểm tra nó là trình điều khiển phiên bản 4l1 không." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Lỗi truy vấn khả năng của %d nhập trong thiết bị %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Lỗi lấy thiết lập của thiết bị điều hưởng %d trên thiết bị « %s »." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Lỗi truy vấn chỉ tiêu trên thiết bị « %s »." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Lỗi lấy các thuộc tính của bộ điều khiển trên thiết bị « %s »." #, c-format msgid "Cannot identify device '%s'." msgstr "Không thể nhận diện thiết bị « %s »." #, c-format msgid "This isn't a device '%s'." msgstr "Không phải là thiết bị « %s »." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Không thể mở thiết bị « %s » để đọc và ghi." #, c-format msgid "Device '%s' is not a capture device." msgstr "Thiết bị « %s » không phải là thiết bị bắt gì." #, c-format msgid "Device '%s' is not a output device." msgstr "Thiết bị « %s » không phải là thiết bị xuất ra." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Lỗi đặt chỉ tiêu cho thiết bị « %s »." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Lỗi lấy tần số hiện thời của thiết bị điều hưởng cho thiết bị « %s »." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Lỗi đặt tần số hiện thời của thiết bị điều hưởng cho thiết bị « %s » là %lu " "Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Lỗi lấy biên độ tín hiệu cho thiết bị « %s »." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Lỗi lấy giá trị của bộ điều khiển %d trên thiết bị « %s »." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Lỗi đặt giá trị %d của bộ điều khiển %d trên thiết bị « %s »." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Lỗi lấy kết nhập hiện thời vào thiết bị « %s ». Có thể là thiết bị thu thanh." #, c-format msgid "Failed to set input %d on device %s." msgstr "Lỗi đặt dữ liệu nhập %d vào thiết bị « %s »." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Lỗi lấy kết nhập hiện thời vào thiết bị « %s ». Có thể là thiết bị thu thanh." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Lỗi đặt dữ liệu nhập %d vào thiết bị « %s »." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Không thể phụ thêm các bộ đệm vào hàng đợi trên thiết bị « %s »." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Lỗi khi thử lấy các khung ảnh động từ thiết bị « %s »." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Lỗi sau %d lần thử. Thiết bị %s. Lỗi hệ thống: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Không thể lấy các tham số về thiết bị « %s »." msgid "Video input device did not accept new frame rate setting." msgstr "Thiết bị nhập ảnh động vào không chấp nhận thiết lập tốc độ khung mới." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Không thể ánh xạ các bộ đệm từ thiết bị « %s »." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Trình điều khiển của thiết bị « %s » không hỗ trợ phương pháp bắt đã biết " "nào." msgid "Changing resolution at runtime is not yet supported." msgstr "Chưa hỗ trợ khả năng thay đổi độ phân giải trong khi chạy." msgid "Cannot operate without a clock" msgstr "Không thể thao tác khi không có đồng hồ." gst-plugins-good-0.10.31/po/fr.gmo0000644000175000017500000003745711720565343013556 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""u#$ $$ $ $$R$ 6% D% Q% _% l% x%%%%% %% %&/&52&&h&& &V&%&T '4u':'A'>'(Uf((<h)v)**B3+v+I,*J,Ju,C, --"- 4- A- N-[-l-@-@4.Bu.E.M.#L/np/n/ZN0T0E0LD1G1;1K2^a292C29>3Qx3E344494X4v44244 44 5'5,5 55 @5K5S5b5j5 5#5#55556 6 6 6(606 86F6U6Y6j6p6 v6 6666 66666 77?'7g788 888"888999 9 /9=9 M9n9A9 99999:F:_:!p: : :8:*:+;=;D; V;c;z;;; ;;; ;b;Q;<.<C<0=:1=9l=,== = ===` >j>>>>>!>>! ?v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-04-28 09:22+0200 Last-Translator: Claude Paroz Language-Team: French Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fonction %s %dFonction %s« %s » par « %s »Centre 3DProfondeur 3DAmélioration 3DUne erreur réseau s'est produite ou le serveur a fermé abruptement la connexion.Entrée AUX 1Sortie AUX 1Entrée AUX 2Sortie AUX 2Entrée AUXSortie AUXErreur de lecture audio.BassesAmplification bassesConnecteur noirConnecteur noir du panneau avantConnecteur bleuConnecteur bleu du panneau avantHaut-parleur interneCDImpossible d'identifier le périphérique « %s ».Impossible de fonctionner sans horlogeCentreCentre / LFELa modification de résolution en cours d'exécution n'est pas encore prise en charge.Impossible de se connecter au serveurImpossible de mettre les tampons en file d'attente sur le périphérique « %s ».Impossible d'établir une connexion vers le serveur.Impossible d'établir une connexion vers le serveur de sonImpossible d'obtenir les paramètres du périphérique « %s »Impossible de mapper les tampons du périphérique « %s ».Impossible d'ouvrir le périphérique audio pour la gestion des contrôles de mixage.Impossible d'ouvrir le périphérique audio pour la gestion des contrôles de mixage. Cette version de OSS (Open Sound System) n'est pas prise en charge par cet élément.Impossible d'ouvrir le périphérique audio pour la lecture.Impossible d'ouvrir le périphérique audio pour la lecture. Le périphérique est utilisé par une autre application.Impossible d'ouvrir le périphérique audio pour la lecture. Cette version de OSS (Open Sound System) n'est pas prise en charge par cet élément.Impossible d'ouvrir le périphérique audio pour la lecture. Vous n'avez pas les droits nécessaires pour ouvrir le périphérique.Impossible d'ouvrir le périphérique audio pour l'enregistrement.Impossible d'ouvrir le périphérique audio pour l'enregistrement. Vous n'avez pas les droits nécessaires pour ouvrir le périphérique.Impossible d'ouvrir le périphérique « %s » en lecture et écriture.Impossible de résoudre le nom du serveur.Le périphérique « %s » n'est pas un périphérique d'enregistrement.Le périphérique « %s » n'est pas un périphérique de sortie.DiagnosticEntrée numériqueSortie numériqueNumérique 1Numérique 2Numérique 3Mélange réduitErreur d'obtention des capacités pour le périphérique « %s » : ce n'est pas un pilote v4l2. Vérifiez si c'est un pilote v4l1.Erreur de lecture de %d octets sur le périphérique « %s ».Erreur de lecture de %d octets sur le périphérique « %s ».Erreur lors de l'enregistrement à partir du périphérique audio.Échec après %d tentatives. périphérique %s. erreur système : %sImpossible d'obtenir les attributs de contrôle du périphérique « %s ».Échec de décodage de l'image JPEGImpossible d'obtenir l'entrée actuelle du périphérique « %s ». C'est peut-être un périphérique radioImpossible d'obtenir la sortie actuelle du périphérique « %s ». C'est peut-être un périphérique radioImpossible d'obtenir la fréquence actuelle de syntonisation du périphérique « %s ».Impossible d'obtenir les paramètres du syntoniseur %d du périphérique « %s ».Impossible d'obtenir la force du signal du périphérique « %s ».Impossible d'obtenir la valeur du contrôle %d du périphérique « %s ».Impossible d'obtenir les attributs de l'entrée %d du périphérique %sImpossible d'obtenir la norme du périphérique « %s ».Échec lors de l'interrogation du serveur de son au sujet de ses capacitésImpossible de définir la fréquence de syntonisation du périphérique « %s » à %lu Hz.Impossible de définir l'entrée %d du périphérique %s.La définition de la norme du périphérique « %s » a échoué.Impossible de définir la sortie %d du périphérique %s.Impossible de définir la valeur %d du contrôle %d du périphérique « %s ».L'obtention de trames vidéo du périphérique « %s » a échoué.RapideAvantÉcouteurs du panneau avantEntrée ligne du panneau avantSortie ligne du panneau avantMicro du panneau avantGainTaille de trame imprévue de %u à la place de %u.Connecteur grisConnecteur gris du panneau avantConnecteur vertConnecteur vert du panneau avantHDMICombinéÉcouteursÉcouteursÉlevéGain d'entréeEntréeMélangeur d'entréeCD interneErreur interne de flux de données.Erreur interne de flux de données.Taille d'atome non valide.JackBip de clavierLFEEntrée ligneSortie ligneLigne 1Ligne 2Ligne 3Entrée ligneBoucle interneBasVolume généralMoyenMicroMicrophone 1Microphone 2Amplification microGain de microphoneSource de microphoneMélangeurModemMoniteurSource de moniteurMélangeur monoSon coupéAucun URL défini.Entrée audio absente ou non valide, le flux AVI sera corrompu.Aucun flux pris en charge n'a été trouvé. Il faut peut-être autoriser davantage de protocoles de transport ou il manque peut-être le bon greffon d'extension GStreamer RTSP.Aucun flux pris en charge n'a été trouvé. Il faut peut-être installer un greffon d'extension GStreamer RTSP pour les flux Real media.AucunDésactivéActivéConnecteur orangeConnecteur orange du panneau avantAutreGain de sortieGain de sortiePCMPCM-2Entrée casqueSortie casqueConnecteur roseConnecteur rose du panneau avantPorts de lectureLa lecture n'est pas prise en charge par ce périphérique audio.ProductionRadioArrièreEnregistrementGain d'enregistrementSource d'enregistrementL'enregistrement n'est pas pris en charge par ce périphérique audio.Connecteur rougeConnecteur rouge du panneau avantEntrée SPDIFSortie SPDIFLa configuration d'une connexion sécurisée a échoué.Le serveur ne gère pas le positionnement.Le serveur a envoyé de mauvaises données.CôtéStéréo simuléeHaut-parleurSource de haut-parleurSortie partagéeStéréoMélangeur stéréoAmbiophonieSon ambiophoniqueSynthTéléphoneLe pilote du périphérique « %s » ne prend en charge aucune méthode d'enregistrement connue.Il est possible que la vidéo de ce fichier ne puisse pas être lue correctement.Ce fichier ne contient aucun flux exploitable.Ce fichier contient trop de flux. Seuls les %d premiers seront lus.Ce fichier est corrompu et ne peut pas être lu.Ce fichier n'est pas complet et ne peut donc pas être lu.Ce fichier n'est pas valide et ne peut donc pas être lu.Ceci n'est pas un périphérique « %s ».AiguësTrès élevéTrès basVidéoEntrée vidéoLe périphérique d'entrée vidéo n'a pas accepté le nouveau paramètre de fréquence d'image.Canaux de mélangeur virtuelEntrée de mélangeur virtuelSortie de mélangeur virtuelVolumeConnecteur blancConnecteur blanc du panneau avantConnecteur jauneConnecteur jaune du panneau avantgst-plugins-good-0.10.31/po/lt.gmo0000644000175000017500000003373611720565343013562 00000000000000l 01 @ L Yc lw    (9<Yx 4).'6&^7)=VgqW0*X3 $@#e      a(3&\"22 G(6p1.23;$o)@$#$5H3~.HWr     $26>GNU\dmqx   6?rINRUf  / $/5: A M0[    + 1D;0':*-?*m 9 , @ U \ l    " "" " " ##'#7#F# V# c#q## #####%#%$>$'A$i$ $ $G$"$: %(D%'m%5%A%| &,&M&f'Ul'-'W';H(/(0( (())-)<) K)nV)8)5)&4*;[*6*%*X*@M+<+4+<,9=,3w,-,C,/-2M-I-5-. ..#..$R.w. .,..#./$/9/>/F/O/X/`/q/z/ /////// 00$0-0 60 @0N0 T0 `0 j0 u0 0000 00 00 1 1F1`1p1f2 l2v22'222222 233%%3K3(]3 333 333(33%464E4U4^4 n4|444 444 4 4J4H75&565+5* 6+56a66 6 666H6 7(7G7g7p7#77%7 8@<k`g' t[4i9{#^Mn|svO= q5c2je&zJLd?SxTu;P$6b,\AZ7WFQ- mVHDhG_fp+ U:>!a/01y(])Cl3wr*X. EoR}YN%~BI"K%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceAUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.23.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-07-16 19:34+0300 Last-Translator: Žygimantas Beručka Language-Team: Lithuanian Language: lt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); X-Generator: Virtaal 0.6.1 %s %d funkcija%s funkcija„%s“ atlieka „%s“3D vidurinis3D giluminis3D pakeltasAUX 1 įvestisAUX 1 išvestisAUX 2 įvestisAUX 2 išvestisAUX įvestisAUX išvestisGarso grojimo klaida.Žemi dažniaiŽemųjų dažnių sustiprinimasJuodas kištukasJuodas priekinio skydelio kištukasMėlynas kištukasMėlynas priekinio skydelio kištukasIntegruotas garsiakalbisCDNepavyko nustatyti įrenginio „%s“.Negali veikti be laikrodžioVidurinisCentras / LFEGalimybės keisti skiriamąją gebą operacijos vykdymo metu dar nėra.Nepavyko prisijungti prie serverioNepavyko sustatyti į eilė buferių įrenginyje „%s“.Nepavyko prisijungti prie garso serverioNepavyko įrenginio „%s“ parametrųNepavyko išdėstyti buferių iš įrenginio „%s“Nepavyko atverti garso įrenginio maišiklio valdymo apdorojimui.Nepavyko atverti garso įrenginio maišiklio valdymo apdorojimui. Šis elementas nepalaiko šios Open Sound System versijos.Nepavyko atverti garso įrenginio grojimui. Nepavyko atverti garso įrenginio grojimui. Įrenginį naudoja kita programa.Nepavyko atverti garso įrenginio grojimui. Šis elementas nepalaiko šios Open Sound System versijos.Nepavyko atverti garso įrenginio grojimui. Jūs neturite leidimo atverti įrenginį.Nepavyko atverti garso įrenginio įrašymui.Nepavyko atverti garso įrenginio įrašymui. Jūs neturite leidimo atverti įrenginį.Nepavyko atverti įrenginio „%s“ skaitymui ir rašymui.Įrenginys „%s“ nėra įrašymo įrenginys.Įrenginys „%s“ nėra išvesties įrenginys.DiagnostikaSkaitmeninė įvestisSkaitmeninė išvestisSkaitmeninis-1Skaitmeninis-2Skaitmeninis-3SumaišytiKlaida gaunant įrenginio „%s“ funkcijas: tai nėra v4l2 tvarkyklė. Patikrinkite, ar tai v4l1 tvarkyklė.Klaida skaitant %d baitus (-ų) iš įrenginio „%s“.Klaida skaitant %d baitus (-ų) įrenginyje „%s“.Klaida įrašant iš garso įrenginio.Nepavyko po %d bandymų. Įrenginys %s. Sistemos klaida: %sNepavyko gauti valdymo atributų įrenginyje „%s“.Nepavyko dekoduoti JPEG paveikslėlioNepavyko gauti dabartinės įvesties įrenginyje „%s“. Galbūt tai radijo įrenginysNepavyko gauti įrenginio „%s“ dabartinio derintuvo dažnio.Nepavyko gauti derintuvo %d įrenginyje „%s“ parametrų.Nepavyko gauti įrenginio „%s“ signalo stiprumo.Nepavyko gauti valdiklio %d reikšmės įrenginyje „%s“.Nepavyko užklausti įvesties %d įrenginyje %s atributųNepavyko užklausti normalės įrenginyje „%s“.Nepavyko užklausti garso serverio galimybiųNepavyko nustatyti įrenginio „%s“ derintuvo dažnio į %lu Hz.Nepavyko nustatyti įvesties %d įrenginyje %s.Nepavyko nustatyti normalės įrenginiui „%s“.Nepavyko nustatyti valdiklio %2$d įrenginyje „%3$s“ reikšmės %1$d.Nepavyko gauti vaizdo kadrų iš įrenginio „%s“.GreitasPriekinisPriekinio skydelio ausinėsPriekinio skydelio įeinanti linijaPriekinio skydelio išeinanti linijaPriekinio skydelio mikrofonasGarsinimasGautas netikėtas kadro dydis %u vietoje %u.Pilkas kištukasPilkas priekinio skydelio kištukasŽalias kištukasŽalias priekinio skydelio kištukasHDMIRagelisAusinėsAusinėsAukštaGarsinimo riboseĮvestisĮvesties maišaVidinis CDVidinė duomenų srauto klaida.Vidinė duomenų srauto klaida.JackKlaviatūros pypsėjimasLFEĮeinanti linijaIšeinanti linijaLinija-1Linija-2Linija-3ĮvedimasPerduoti ratuŽemaPagrindinisVidutinėMikrofonasMikrofonas 1Mikrofonas 2Mikrofono pagarsinimasMikrofono garsinimasMikrofono šaltinisMaišiklisModemasMonitoriusMonitoriaus šaltinisMono maišaNutildytaNėra įvesties garso arba jis netinkamas, AVI srautas bus sugadintas.Nerasta palaikomų srautų. Jums gali reikėti leisti daugiau transporto protokolų, arba jūs neturite tinkamo GStreamer RTSP papildinio įskiepio.Nerasta palaikomų srautų. Jums gali reikėti įdiegti GStreamer RTSP papildinio įskiepį Real media srautams.NėraIšjungtaĮjungtaOranžinis kištukasOranžinis priekinio skydelio kištukasKitaUž garsinimo ribųIšvesties garsinimasPCMPCM-2Telefonas-įvTelefonas-išvRožinis kištukasRožinis priekinio skydelio kištukasGrojimo prievadaiŠis garso įrenginys nepalaiko grojimo.SukūrimoRadijasGalinisĮrašymasĮrašymo garsinimasĮrašymo šaltinisŠis garso įrenginys nepalaiko grojimo.Raudonas kištukasRaudonas priekinio skydelio kištukasSPDIF įvestisSPDIF išvestisŠoninisImituoti stereoGarsiakalbiaiGarsiakalbio šaltinisSkleisti išvestįStereoStereo maišaSupantisErdvinis garsasSintezatoriusTelefonasĮrenginio „%s“ tvarkyklė nepalaiko jokių žinomų įrašymo būdų.Šiame faile esantis vaizdo įrašas gali būti atkurtas nekorektiškai.Šiame faile nėra atkurtinų srautų.Šiame faile per daug srautų. Grojami tik pirmieji %dFailas sugadintas ir negali būti atkurtas.Failas nebaigtas ir negali būti atkurtas.Failas netinkamas ir negali būti atkurtas.Tai nėra įrenginys „%s“.Aukšti dažniaiLabai aukštaLabai žemaVideoVaizdo įvestisVaizdo įvesties įrenginys nepriėmė naujų kadrų dažnio nustatymų.Virtualaus maišiklio kanalaiVirtualaus maišiklio įvestisVirtualaus maišiklio išvestisGarsumasBaltas kištukasBaltas priekinio skydelio kištukasGeltonas kištukasGeltonas priekinio skydelio kištukasgst-plugins-good-0.10.31/po/fi.po0000644000175000017500000005013311720565342013362 00000000000000# This file is distributed under the same license as the gst-plugins-good package. # Finnish messages for gst-plugins-good. # Copyright (C) 2009-2010 Tommi Vainikainen. # Copyright (C) 2007 Ilkka Tuohela. # Suomennos: http://gnome.fi/ # # Tommi Vainikainen , 2009-2010. # Ilkka Tuohela , 2007. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.25.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-11-17 23:03+0200\n" "Last-Translator: Tommi Vainikainen \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "Yhteyttä äänipalvelimeen ei voitu avata" msgid "Failed to query sound server capabilities" msgstr "Äänipalvelimen ominaisuuksia ei voitu selvittää" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "”%s” artistilta ”%s”" msgid "Internal data stream error." msgstr "Sisäisen tietovirran virhe." msgid "Failed to decode JPEG image" msgstr "JPEG-kuvan purku epäonnistui" msgid "Could not connect to server" msgstr "Palvelimeen ei saatu yhteyttä" msgid "Server does not support seeking." msgstr "Pavelin ei tue kelausta." msgid "Could not resolve server name." msgstr "Palvelimen nimeä ei saatu selvitettyä." msgid "Could not establish connection to server." msgstr "Yhteyttä palvelimeen ei voitu avata." msgid "Secure connection setup failed." msgstr "Turvallisen yhteyden avaus epäonnistui." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Tapahtui verkkovirhe tai palvelin sulki yhteyden yllättäen." msgid "Server sent bad data." msgstr "Palvelin lähetti virheellistä dataa." msgid "No URL set." msgstr "Ei URL:ää asetettuna." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Ääntä ei ole tai äänilähde on viallinen, AVI-virta tulee olemaan " "vaurioitunut." msgid "This file contains no playable streams." msgstr "Tiedosto ei sisällä soitettavia virtoja." msgid "This file is invalid and cannot be played." msgstr "Tiedosto on virheellinen eikä sitä voida esittää." msgid "This file is corrupt and cannot be played." msgstr "Tiedosto on vioittunut eikä sitä voida näyttää." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Tiedosto on vajaa eikä sitä voida esittää." msgid "The video in this file might not play correctly." msgstr "Tiedostossa olevaa videota ei ehkä voida näyttää oikein." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Tiedosto sisältää useita virtoja. Soitetaan vain ensimmäiset %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Tuettua virtaa ei löytynyt. Kenties sinun tarvitsee asentaa GStreamer-RTSP-" "laajennus käyttääksesi Real-media-virtoja." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Tuettua virtaa ei löytynyt. Sinun kenties tarvitsee sallia useampia " "siirtoprotokollia, tai vaihtoehtoisesti sinulta saattaa puuttua oikea " "GStreamer-RTSP-laajennusliitännäinen." msgid "Internal data flow error." msgstr "Sisäisen tietovirran virhe." msgid "Volume" msgstr "Äänenvoimakkuus" msgid "Bass" msgstr "Basso" msgid "Treble" msgstr "Ylä-äänet" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Kaiutin" msgid "Line-in" msgstr "Linjatulo" msgid "Microphone" msgstr "Mikrofoni" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mikseri" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Nauhoitus" msgid "In-gain" msgstr "Gain-sisään" msgid "Out-gain" msgstr "Gain-ulos" msgid "Line-1" msgstr "Linja-1" msgid "Line-2" msgstr "Linja-2" msgid "Line-3" msgstr "Linja-3" msgid "Digital-1" msgstr "Digitaalinen-1" msgid "Digital-2" msgstr "Digitaalinen-2" msgid "Digital-3" msgstr "Digitaalinen-3" msgid "Phone-in" msgstr "Levysoitintulo" msgid "Phone-out" msgstr "Levysoitinlähtö" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Tarkkailu" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Äänilaitetta ei voitu avata toistettavaksi. Laite on toisen sovelluksen " "käytössä." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Äänilaitetta ei voitu avata toistamista varten. Laitteen avaamiseen ei ole " "oikeuksia." msgid "Could not open audio device for playback." msgstr "Äänilaitetta ei voitu avata toistettavaksi." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Äänilaitetta ei voitu avata nauhoitusta varten. Laitteen avaamiseen ei ole " "oikeuksia." msgid "Could not open audio device for recording." msgstr "Äänilaitetta ei voitu avata nauhoitusta varten." msgid "Could not open audio device for mixer control handling." msgstr "Äänilaitetta ei voitu avata mikserinhallintaa varten." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Äänilaitetta ei voitu avata mikserinhallintaa varten. Tämä elementti ei tue " "tätä versiota Open Sound Systemistä." msgid "Master" msgstr "Pää" msgid "Front" msgstr "Etu" msgid "Rear" msgstr "Taka" msgid "Headphones" msgstr "Kuulokkeet" msgid "Center" msgstr "Keski" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Sivu" msgid "Built-in Speaker" msgstr "Sisäänrakennettu kaiutin" msgid "AUX 1 Out" msgstr "AUX 1 ulos" msgid "AUX 2 Out" msgstr "AUX 2 ulos" msgid "AUX Out" msgstr "AUX ulos" msgid "3D Depth" msgstr "3D-syvyys" msgid "3D Center" msgstr "3D-keski" msgid "3D Enhance" msgstr "3D-tehostus" msgid "Telephone" msgstr "Puhelin" msgid "Line Out" msgstr "Linja ulos" msgid "Line In" msgstr "Linjatulo" msgid "Internal CD" msgstr "Sisäinen CD" msgid "Video In" msgstr "Videotulo" msgid "AUX 1 In" msgstr "AUX 1 sisään" msgid "AUX 2 In" msgstr "AUX 2 sisään" msgid "AUX In" msgstr "AUX sisään" msgid "Record Gain" msgstr "Nauhoitusgain" msgid "Output Gain" msgstr "Gain-ulos" msgid "Microphone Boost" msgstr "Mikrofonitehostin" msgid "Loopback" msgstr "Takaisinkytkentä" msgid "Diagnostic" msgstr "Diagnosointi" msgid "Bass Boost" msgstr "Bassotehostin" msgid "Playback Ports" msgstr "Toistoportit" msgid "Input" msgstr "Sisään" msgid "Record Source" msgstr "Nauhoituslähde" msgid "Monitor Source" msgstr "Tarkkailulähde" msgid "Keyboard Beep" msgstr "Näppäimistöpiippaus" msgid "Simulate Stereo" msgstr "Simuloitu stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Surround-ääni" msgid "Microphone Gain" msgstr "Mikrofoni-gain" msgid "Speaker Source" msgstr "Kaiutinlähde" msgid "Microphone Source" msgstr "Mikrofonilähde" msgid "Jack" msgstr "Pistoke" msgid "Center / LFE" msgstr "Keski / LFE" msgid "Stereo Mix" msgstr "Stereo Mix" msgid "Mono Mix" msgstr "Mono Mix" msgid "Input Mix" msgstr "Sisään Mix" msgid "SPDIF In" msgstr "SPDIF sisään" msgid "SPDIF Out" msgstr "SPDIF ulos" msgid "Microphone 1" msgstr "Mikrofoni 1" msgid "Microphone 2" msgstr "Mikrofoni 2" msgid "Digital Out" msgstr "Digitaalinen ulos" msgid "Digital In" msgstr "Digitaalinen sisään" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modeemi" msgid "Handset" msgstr "Kuulokkeet" msgid "Other" msgstr "Muu" msgid "None" msgstr "Ei mikään" msgid "On" msgstr "Päällä" msgid "Off" msgstr "Poissa" msgid "Mute" msgstr "Vaimennettu" msgid "Fast" msgstr "Nopea" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Erittäin matala" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Matala" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medium" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Korkea" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Erittäin korkea" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Tuotanto" msgid "Front Panel Microphone" msgstr "Etupaneelin mikrofoni" msgid "Front Panel Line In" msgstr "Etupaneelin linjatulo" msgid "Front Panel Headphones" msgstr "Etupaneelin kuulokkeet" msgid "Front Panel Line Out" msgstr "Etupaneelin linja ulos" msgid "Green Connector" msgstr "Vihreä liitin" msgid "Pink Connector" msgstr "Vaaleanpunainen liitin" msgid "Blue Connector" msgstr "Sininen liitin" msgid "White Connector" msgstr "Valkoinen liitin" msgid "Black Connector" msgstr "Musta liitin" msgid "Gray Connector" msgstr "Harmaa liitin" msgid "Orange Connector" msgstr "Oranssi liitin" msgid "Red Connector" msgstr "Punainen liitin" msgid "Yellow Connector" msgstr "Keltainen liitin" msgid "Green Front Panel Connector" msgstr "Vihreä etupaneeliliitin" msgid "Pink Front Panel Connector" msgstr "Vaaleanpunainen etupaneeliliitin" msgid "Blue Front Panel Connector" msgstr "Sininen etupaneeliliitin" msgid "White Front Panel Connector" msgstr "Valkoinen etupaneeliliitin" msgid "Black Front Panel Connector" msgstr "Musta etupaneeliliitin" msgid "Gray Front Panel Connector" msgstr "Harmaa etupaneeliliitin" msgid "Orange Front Panel Connector" msgstr "Oranssi etupaneeliliitin" msgid "Red Front Panel Connector" msgstr "Punainen etupaneeliliitin" msgid "Yellow Front Panel Connector" msgstr "Keltainen etupaneeliliitin" msgid "Spread Output" msgstr "Levitetty ulos" msgid "Downmix" msgstr "Alasmiksaus" msgid "Virtual Mixer Input" msgstr "Virtuaalinen mikseritulo" msgid "Virtual Mixer Output" msgstr "Virtuaalinen mikseri ulos" msgid "Virtual Mixer Channels" msgstr "Virtuaaliset mikserikanavat" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d -toiminto" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s -toiminto" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Äänilaitetta ei voitu avata toistamista varten. Tämä elementti ei tue tätä " "versiota Open Sound Systemistä." msgid "Playback is not supported by this audio device." msgstr "Tämä äänilaite ei tue toistamista." msgid "Audio playback error." msgstr "Äänentoistovirhe." msgid "Recording is not supported by this audio device." msgstr "Tämä äänilaite ei tue nauhoitusta." msgid "Error recording from audio device." msgstr "Virhe luettaessa äänilaitteelta." msgid "Gain" msgstr "Herkkyys" msgid "Headphone" msgstr "Kuulokkeet" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Virhe luettaessa %d tavua laitteelta ”%s”." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Saatiin odottamaton kehys kooltaan %u odotetun %u sijaan." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Virhe luettaessa %d tavua laitteelta ”%s”." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Virhe haettaessa laitteen ”%s” ominaisuuksia: se ei ole v4l2-ajuri.Tarkista, " "onko se v4l1-ajuri." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Lähteen %d ominaisuuksia laitteelta %s ei voitu kysyä" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Virittimen %d asetuksia ei voitu lukea laitteelta ”%s”." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Laitteen ”%s” videostandardia ei voitu kysyä." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Laitteen ”%s” ohjainattribuutteja ei voitu lukea." #, c-format msgid "Cannot identify device '%s'." msgstr "Laitetta ”%s” ei voi tunnistaa." #, c-format msgid "This isn't a device '%s'." msgstr "Tämä ei ole laite ”%s”." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Laitetta ”%s” ei voitu avata luettavaksi ja kirjoitettavaksi." #, c-format msgid "Device '%s' is not a capture device." msgstr "Laitteelta ”%s” ei voi kaapata." #, c-format msgid "Device '%s' is not a output device." msgstr "Laite ”%s” ei ole ulostulolaite." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Laitteen ”%s” videostandardia ei voitu asettaa." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Nyt viritettyä taajuutta ei voitu lukea laitteelta ”%s”." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Laitteen ”%s” virittimen taajutta ei voitu asettaa arvoon %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Laitteelta ”%s” ei saatu signaalinvoimakkuutta." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Ohjaimelle %d ei saatu arvoa laitteelta ”%s”." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Arvoa %d ei voitu asettaa ohjaimelle %d laitteella ”%s”." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Laitteen ”%s” tämänhetkistä sisääntuloa ei voitu lukea, se ei ehkä ole " "radiolaite" #, c-format msgid "Failed to set input %d on device %s." msgstr "Sisääntuloa %d ei voitu asettaa laitteelle %s." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Laitteen ”%s” tämänhetkistä sisääntuloa ei voitu lukea, se ei ehkä ole " "radiolaite" #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Sisääntuloa %d ei voitu asettaa laitteelle %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Puskureita ei voitu laittaa jonoon laitteella ”%s”." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Videoruutujen noutaminen laitteelta ”%s” epäonnistui." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Epäonnistui %d yrityksen jälkeen: laite %s, järjestelmävirhe: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Laitteelta ”%s” ei voitu saada parametreja" msgid "Video input device did not accept new frame rate setting." msgstr "Videosyötelaite ei hyväksy uutta kehysnopeusasetusta." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Puskereita laitteelta ”%s” ei voitu kartoittaa" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Laitteen ”%s” ajuri ei tue mitään tunnettua kaappaustapaa." msgid "Changing resolution at runtime is not yet supported." msgstr "Resoluution vaihto käytön aikana ei ole vielä mahdollista." msgid "Cannot operate without a clock" msgstr "Ei voitu toimia ilman kelloa" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Puskurityyppi ei ole tuettu, indeksi on rajojen ulkopuolella, puskureita " #~ "ei ole vielä varattu tai käyttäjän osoitin tai pituus ovat virheelliset. " #~ "laite %s" #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "muisti ei riitä käyttäjän osoitinpuskurin jonoon lisäämiseen. laite %s" #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "Vapaita puskureita ei löytynyt indeksillä %d." #~ msgid "Could not read from CD." #~ msgstr "CD-levyltä ei voitu lukea." #~ msgid "Disc is not an Audio CD." #~ msgstr "Levy ei ole ääni-CD." #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Tiedosto on salattu eikä sitä voida näyttää." #~ msgid "Describes the selected input element." #~ msgstr "Kuvaa valitun lähde-elementin." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "Kuvaa ääni- ja videoneuvotteluille valitun ulostuloelementin." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Kuvaa musiikille ja elokuville valitun ulostuloelementin." #~ msgid "Describes the selected output element." #~ msgstr "Kuvaa valitun ulostuloelementin." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "GStreamer-ääninielu ääni- ja videoneuvotteluille" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "GStreamer-ääninielu äänelle ja elokuville" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer voi soittaa ääntä käyttäen useita eri nieluelementtejä. " #~ "Muutamia vaihtoehtoja ovat osssink, esdsink ja alsasink. Ääninielu voi " #~ "olla myös liukuhihnan osa eikä vain yksi elementti." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer voi toistaa videota käyttäen useita eri nieluelementtejä. " #~ "Muutamia vaihtoehtoja ovat xvimagesink, ximagesink, sdlvideosink ja " #~ "aasink. Videonielu voi olla myös liukuhihnan osa eikä vain yksi elementti." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "Gstreamer voi laittaa visualisointiliitännäisiä liukuhihnalle, jolle se " #~ "muuntaa äänivirran videoruuduiksi. Oletusliitännäinen on goom, mutta " #~ "muita ollaan lisäämässä pian. Visualisoinnin liitännäinen voi olla myös " #~ "liukuhihnan osa eikä vain yksi elementti." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer voi nauhoittaa ääntä käyttäen useita eri lähde-elementtejä. " #~ "Muutamia vaihtoehtoja ovat osssrc, esdsrc ja alsasrc. Äänilähde voi olla " #~ "myös liukuhihnan osa eikä vain yksi elementti." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer voi nauhoittaa videota käyttäen useita eri lähde-elementtejä. " #~ "Muutamia vaihtoehtoja ovat v4lsrc ja videotestsrc.. Videolähde voi olla " #~ "myös liukuhihnan osa eikä vain yksi elementti." #~ msgid "default GStreamer audio source" #~ msgstr "GStreamerin oletusäänilähde" #~ msgid "default GStreamer audiosink" #~ msgstr "GStreamerin oletusääninielu" #~ msgid "default GStreamer video source" #~ msgstr "GStreamerin oletusvideolähde" #~ msgid "default GStreamer videosink" #~ msgstr "GStreamerin oletusvideonielu" #~ msgid "default GStreamer visualization plugin" #~ msgstr "Gstreamerin visualisointien oletusliitännäinen" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "kuvaus ääni- ja videoneuvottelun GStreamer-ääninielulle" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "kuvaus musiikin ja elokuvien GStreamer-ääninielulle" #~ msgid "description for default GStreamer audiosink" #~ msgstr "GStreamerin oletusääninielun kuvaus" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "GStreamerin oletusäänilähteen kuvaus" gst-plugins-good-0.10.31/po/ja.po0000644000175000017500000005675711720565342013400 00000000000000# Japanese translation for gst-plugins-good. # This file is put in the public domain. # # Takao Fujiwara , 2006. # Makoto Kato , 2009-2011. # Takeshi Hamasaki , 2011 msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-08-28 23:59+0900\n" "Last-Translator: Takeshi Hamasaki \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=1; plural=0;\n" msgid "Could not establish connection to sound server" msgstr "サウンドサーバーへの接続に失敗しました" msgid "Failed to query sound server capabilities" msgstr "サウンドサーバーのケイパビリティのクエリーに失敗しました" #. TRANSLATORS: 'song title' by 'artist name' #, fuzzy, c-format msgid "'%s' by '%s'" msgstr "対" msgid "Internal data stream error." msgstr "内部データストリームエラー" msgid "Failed to decode JPEG image" msgstr "JPEG画像のデコードに失敗しました" msgid "Could not connect to server" msgstr "サーバーへ接続できません" msgid "Server does not support seeking." msgstr "サーバーはシークをサポートしていません。" msgid "Could not resolve server name." msgstr "サーバー名を解決できません。" msgid "Could not establish connection to server." msgstr "サーバーへの接続を確立できません。" msgid "Secure connection setup failed." msgstr "セキュア接続のセットアップに失敗しました。" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "ネットワークエラーが発生したか、サーバーが予期せず接続を閉じました。" #, fuzzy msgid "Server sent bad data." msgstr "データストリーム (サーバープッシュ型)" msgid "No URL set." msgstr "URLが指定されていません。" # SUN REVIEWED msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "入力オーディオが存在しないか無効であるため、AVI ストリームは壊れます。" msgid "This file contains no playable streams." msgstr "このファイルには再生不可能なストリームが含まれています" msgid "This file is invalid and cannot be played." msgstr "このファイルは不正なため再生することができません" msgid "This file is corrupt and cannot be played." msgstr "このファイルは壊れているため再生することができません" msgid "Invalid atom size." msgstr "不正なアトムサイズ" msgid "This file is incomplete and cannot be played." msgstr "このファイルは正常ではないため、再生することができません" msgid "The video in this file might not play correctly." msgstr "このファイルの中の動画は正しく再生できないかもしれません" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "このファイルには多くのストリームが格納されているため、最初の %d 個のみ再生し" "ます" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "サポートしているストリームが見つかりません。Real メディアストリームのための" "GStreamer RTSP 拡張プラグインをインストールする必要があるかもしれません。" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "サポートしているストリームが見つかりません。別の転送プロトコルをインストール" "する必要があるかもしれません。または、正しい GStreamer RTSP 拡張プラグインが" "ないのかもしれません。" msgid "Internal data flow error." msgstr "内部データフローエラー。" # SUN REVIEWED msgid "Volume" msgstr "音量" # SUN REVIEWED msgid "Bass" msgstr "低音" # SUN REVIEWED msgid "Treble" msgstr "高音" # SUN REVIEWED msgid "Synth" msgstr "シンセ" # SUN REVIEWED msgid "PCM" msgstr "PCM" # SUN REVIEWED msgid "Speaker" msgstr "スピーカ" msgid "Line-in" msgstr "ライン入力" # SUN REVIEWED msgid "Microphone" msgstr "マイクロフォン" # SUN REVIEWED msgid "CD" msgstr "CD" # SUN REVIEWED msgid "Mixer" msgstr "ミキサー" # SUN REVIEWED msgid "PCM-2" msgstr "PCM-2" # SUN REVIEWED msgid "Record" msgstr "録音" # SUN REVIEWED msgid "In-gain" msgstr "入力ゲイン" # SUN REVIEWED msgid "Out-gain" msgstr "出力ゲイン" # SUN REVIEWED msgid "Line-1" msgstr "ライン 1" # SUN REVIEWED msgid "Line-2" msgstr "ライン 2" # SUN REVIEWED msgid "Line-3" msgstr "ライン 3" # SUN REVIEWED msgid "Digital-1" msgstr "デジタル 1" # SUN REVIEWED msgid "Digital-2" msgstr "デジタル 2" # SUN REVIEWED msgid "Digital-3" msgstr "デジタル 3" # SUN REVIEWED msgid "Phone-in" msgstr "フォン入力" # SUN REVIEWED msgid "Phone-out" msgstr "フォン出力" # SUN REVIEWED msgid "Video" msgstr "ビデオ" # SUN REVIEWED msgid "Radio" msgstr "ラジオ" # SUN REVIEWED msgid "Monitor" msgstr "モニター" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "再生用にオーディオデバイスを開くことができませんでした。デバイスが他のアプリ" "ケーションで利用されています" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "再生用にオーディオデバイスを開くことができませんでした。デバイスを開くための" "権限がありません。" # SUN REVIEWED msgid "Could not open audio device for playback." msgstr "音声デバイスを読み取り用に開くことができません。" msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "録音用にオーディオデバイスを開くことができませんでした。デバイスを開くための" "権限がありません。" # SUN REVIEWED msgid "Could not open audio device for recording." msgstr "音声デバイスを録音用に開くことができません。" # SUN REVIEWED msgid "Could not open audio device for mixer control handling." msgstr "音声デバイスをミキサーコントロール用に開くことができません。" msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "ミキサーコントロール用にオーディオデバイスを開くことができませんでした。Open " "Sound Systemのこのバージョンではこの要素によってサポートされていません。" msgid "Master" msgstr "マスタ" msgid "Front" msgstr "フロント" msgid "Rear" msgstr "リア" msgid "Headphones" msgstr "ヘッドフォン" msgid "Center" msgstr "センター" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "サラウンド" msgid "Side" msgstr "サイド" msgid "Built-in Speaker" msgstr "ビルトインスピーカ" msgid "AUX 1 Out" msgstr "AUX 1出力" msgid "AUX 2 Out" msgstr "AUX 2出力" msgid "AUX Out" msgstr "AUX出力" #, fuzzy msgid "3D Depth" msgstr "最大深度: " msgid "3D Center" msgstr "3Dセンター" #, fuzzy msgid "3D Enhance" msgstr "色を強調しています" msgid "Telephone" msgstr "電話" msgid "Line Out" msgstr "ライン出力" msgid "Line In" msgstr "ライン入力" msgid "Internal CD" msgstr "内蔵CD" msgid "Video In" msgstr "ビデオ入力" msgid "AUX 1 In" msgstr "AUX 1入力" msgid "AUX 2 In" msgstr "AUX 2入力" msgid "AUX In" msgstr "AUX入力" msgid "Record Gain" msgstr "録音ゲイン" msgid "Output Gain" msgstr "出力ゲイン" msgid "Microphone Boost" msgstr "マイクロフォンブースト" msgid "Loopback" msgstr "ループバック" msgid "Diagnostic" msgstr "診断" msgid "Bass Boost" msgstr "低音ブースト" msgid "Playback Ports" msgstr "プレイバックポート" msgid "Input" msgstr "入力" msgid "Record Source" msgstr "録音ソース" msgid "Monitor Source" msgstr "モニターソース" msgid "Keyboard Beep" msgstr "キーボードビープ音" #, fuzzy msgid "Simulate Stereo" msgstr "彫金を表現します" msgid "Stereo" msgstr "ステレオ" msgid "Surround Sound" msgstr "サラウンドサウンド" msgid "Microphone Gain" msgstr "マイクロフォンゲイン" msgid "Speaker Source" msgstr "スピーカソース" msgid "Microphone Source" msgstr "マイクロフォンソース" msgid "Jack" msgstr "ジャック" msgid "Center / LFE" msgstr "センター / LFE" msgid "Stereo Mix" msgstr "ステレオミックス" msgid "Mono Mix" msgstr "モノラルミックス" msgid "Input Mix" msgstr "入力ミックス" msgid "SPDIF In" msgstr "SPDIF入力" msgid "SPDIF Out" msgstr "SPDIF出力" msgid "Microphone 1" msgstr "マイクロフォン1" msgid "Microphone 2" msgstr "マイクロフォン2" msgid "Digital Out" msgstr "デジタル出力" msgid "Digital In" msgstr "デジタル入力" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "モデム" msgid "Handset" msgstr "ヘッドセット" msgid "Other" msgstr "その他" msgid "None" msgstr "なし" msgid "On" msgstr "オン" msgid "Off" msgstr "オフ" msgid "Mute" msgstr "ミュート" #, fuzzy msgid "Fast" msgstr "速い" #. TRANSLATORS: "Very Low" is a quality setting here #, fuzzy msgid "Very Low" msgstr "低品位" #. TRANSLATORS: "Low" is a quality setting here #, fuzzy msgid "Low" msgstr "低音" #. TRANSLATORS: "Medium" is a quality setting here #, fuzzy msgid "Medium" msgstr "中音" #. TRANSLATORS: "High" is a quality setting here #, fuzzy msgid "High" msgstr "高音" #. TRANSLATORS: "Very High" is a quality setting here #, fuzzy msgid "Very High" msgstr "高品位" #. TRANSLATORS: "Production" is a quality setting here #, fuzzy msgid "Production" msgstr "プロダクション" msgid "Front Panel Microphone" msgstr "フロントパネルのマイクロフォン" msgid "Front Panel Line In" msgstr "フロントパネルのライン入力" msgid "Front Panel Headphones" msgstr "フロントパネルのヘッドフォン" msgid "Front Panel Line Out" msgstr "フロントパネルのライン出力" msgid "Green Connector" msgstr "緑色コネクタ" msgid "Pink Connector" msgstr "ピンク色コネクタ" msgid "Blue Connector" msgstr "青色コネクタ" msgid "White Connector" msgstr "白色コネクタ" msgid "Black Connector" msgstr "黒色コネクタ" msgid "Gray Connector" msgstr "グレー色コネクタ" msgid "Orange Connector" msgstr "オレンジ色コネクタ" msgid "Red Connector" msgstr "赤色コネクタ" msgid "Yellow Connector" msgstr "黄色コネクタ" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" #, fuzzy msgid "Spread Output" msgstr "情報出力:\n" msgid "Downmix" msgstr "ダウンミックス" msgid "Virtual Mixer Input" msgstr "仮想ミキサー入力" msgid "Virtual Mixer Output" msgstr "仮想ミキサー出力" msgid "Virtual Mixer Channels" msgstr "仮想ミキサーチャンネル" #. TRANSLATORS: name + number of a volume mixer control #, fuzzy, c-format msgid "%s %d Function" msgstr "機能" #. TRANSLATORS: name of a volume mixer control #, fuzzy, c-format msgid "%s Function" msgstr "機能" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "再生用にオーディオデバイスを開くことができませんでした。このバージョンの " "Open Sound System は、このエレメントによってサポートされていません。" msgid "Playback is not supported by this audio device." msgstr "再生はこのオーディオデバイスではサポートされていません。" msgid "Audio playback error." msgstr "オーディオ再生エラーです。" msgid "Recording is not supported by this audio device." msgstr "このオーディオデバイスによって録音はサポートされていません。" msgid "Error recording from audio device." msgstr "オーディオデバイスからの録音時にエラーが発生しました。" # SUN REVIEWED msgid "Gain" msgstr "ゲイン" msgid "Headphone" msgstr "ヘッドフォン" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "デバイス %2$s から %1$d バイト読み込み時にエラーが発生しました。" #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "予期しないフレームサイズ (%2$u ではなく %1$u) を取得しました。" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "デバイス '%2$s' 上で %1$d バイトの読み込み時にエラーが発生しました。" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "デバイス '%s' ケイパビリティの取得時にエラーが発生しました: v4l2 ドライバでは" "ありません。v4l1 ドライバでないか、チェックしてください。" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "デバイス %2$s 内の入力 %1$d の属性のクエリーに失敗しました" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "デバイス '%2$s' 上のチューナー %1$d の設定の取得に失敗しました。" #, fuzzy, c-format msgid "Failed to query norm on device '%s'." msgstr "デバイス '%2$s' 上のチューナー %1$d の設定の取得に失敗しました。" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "デバイス '%s' のコントロール属性の取得に失敗しました" #, fuzzy, c-format msgid "Cannot identify device '%s'." msgstr "ミキサーデバイス'%s'を開けません" #, c-format msgid "This isn't a device '%s'." msgstr "これはデバイス '%s' ではありません" # SUN REVIEWED #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "デバイス '%s' を読み取り用と書き込み用に開くことができません" #, c-format msgid "Device '%s' is not a capture device." msgstr "デバイス '%s' はキャプチャデバイスではありません" #, c-format msgid "Device '%s' is not a output device." msgstr "デバイス '%s' は出力デバイスではありません" #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "" "デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しまし" "た。" #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "デバイス '%s' の現在のチューナーの周波数の取得に失敗しました" #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "デバイス '%s' のチューナーの周波数の %lu Hz への設定に失敗しました" #, fuzzy, c-format msgid "Failed to get signal strength for device '%s'." msgstr "デバイス '%s' の現在のチューナーの周波数の取得に失敗しました" #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "デバイス '%2$s' 上のコントロール %1$d の値の取得に失敗しました。" #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しまし" "た。" #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "デバイス '%s' 上の現在の入力の取得に失敗しました。ラジオデバイスかもしれませ" "ん" #, fuzzy, c-format msgid "Failed to set input %d on device %s." msgstr "" "デバイス '%3$s' 上のコントロール %2$d の値を %1$d へ設定することに失敗しまし" "た。" #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "デバイス '%s' 上の現在の出力の取得に失敗しました。ラジオデバイスかもしれませ" "ん" #, c-format msgid "Failed to set output %d on device %s." msgstr "出力%dをデバイス %s に設定できませんでした。" #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "デバイス '%s' からバッファをマップできません。" #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "デバイス '%s' からビデオフレームの取得に失敗しました。" #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "%d 回リトライしましたが失敗しました。デバイス %s。システムエラー: %s" # SUN REVIEWED #, c-format msgid "Could not get parameters on device '%s'" msgstr "デバイス '%s' 上のパラメータを取得できません。" msgid "Video input device did not accept new frame rate setting." msgstr "ビデオ入力デバイスは新しいフレームレート設定にすることができません" #, c-format msgid "Could not map buffers from device '%s'" msgstr "デバイス '%s' からバッファをマップできません。" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "デバイス '%s' のドライバーはよく知られたキャプチャーメソッドをサポートしてい" "ません" msgid "Changing resolution at runtime is not yet supported." msgstr "実行時の解像度変更はサポートされていません。" msgid "Cannot operate without a clock" msgstr "クロックなしでは動作できません。" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "デバイス '%s' からビデオフレームを取得しようとしましたが失敗しました。メモ" #~ "リが十分にありません。" #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "インデックス %d でプール内に空きバッファがありません。" #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "デバイス '%s' は %dx%d でキャプチャできません" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "デバイス '%s' は指定されたフォーマットでキャプチャできません" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "デバイス '%s' からバッファを取得できませんでした。" #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "" #~ "デバイス '%s' から十分なバッファー領域を取得することができませんでした" # SUN REVIEWED #, fuzzy #~ msgid "Could not read from CD." #~ msgstr "ファイル \"%s\" に書き込むことができません。" # SUN REVIEWED #, fuzzy #~ msgid "Disc is not an Audio CD." #~ msgstr "デバイスが開いていません。" # SUN REVIEWED #, fuzzy #~ msgid "Could not set parameters on device '%s'" #~ msgstr "CD デバイスを読み取り用に開くことができません。" # SUN REVIEWED #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "オーディオを再生するとき、GStreamer は任意の数の出力要素を使用できます。使" #~ "用できる出力要素は、osssink、esdsink、および alsasink です。audiosink は単" #~ "なる 1 つの要素ではなく、パイプラインの一部になることができます。" # SUN REVIEWED #, fuzzy #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "ビデオを再生するとき、GStreamer は任意の数の出力要素を使用できます。使用で" #~ "きる出力要素は、xvideosink、sdlvideosink、および aasink です。videosink は" #~ "単なる 1 つの要素ではなく、パイプラインの一部になることができます。" # SUN REVIEWED #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "GStreamer は視覚化プラグインをパイプラインに設定して、オーディオストリーム" #~ "をビデオフレームに変換できます。デフォルトは goom ですが、より多くの視覚化" #~ "プラグインがすぐに移植される予定です。視覚化プラグインは単なる 1 つの要素" #~ "ではなく、パイプラインの一部になることができます。" # SUN REVIEWED #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "オーディオを記録するとき、GStreamer は任意の数の入力要素を使用できます。使" #~ "用できる入力要素は、osssrc、esdsrc、および alsasrc です。オーディオソース" #~ "は単なる 1 つの要素ではなく、パイプラインの一部になることができます。" # SUN REVIEWED #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "ビデオを記録するとき、GStreamer は任意の数の入力要素を使用できます。使用で" #~ "きる入力要素は、v4lsrc および videotestsrc です。ビデオソースは単なる 1 つ" #~ "の要素ではなく、パイプラインの一部になることができます。" # SUN REVIEWED #~ msgid "default GStreamer audio source" #~ msgstr "デフォルトの GStreamer オーディオソース" # SUN REVIEWED #~ msgid "default GStreamer audiosink" #~ msgstr "デフォルトの GStreamer audiosink" # SUN REVIEWED #~ msgid "default GStreamer video source" #~ msgstr "デフォルトの GStreamer ビデオソース" # SUN REVIEWED #~ msgid "default GStreamer videosink" #~ msgstr "デフォルトの GStreamer videosink" # SUN REVIEWED #~ msgid "default GStreamer visualization plugin" #~ msgstr "デフォルトの GStreamer 視覚化プラグイン" # SUN REVIEWED #, fuzzy #~ msgid "description for default GStreamer audiosink" #~ msgstr "デフォルトの GStreamer audiosink" # SUN REVIEWED #, fuzzy #~ msgid "description for default GStreamer audiosrc" #~ msgstr "デフォルトの GStreamer オーディオソース" #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "デバイス '%s' のコントロール属性の取得に失敗しました" gst-plugins-good-0.10.31/po/ro.gmo0000644000175000017500000003451011720565343013552 00000000000000l 01 @ L Yc lw    (9<Yx 4).'6&^7)=VgqW0*X3 $@#e      a(3&\"22 G(6p1.23;$o)@$#$5H3~.HWr     $26>GNU\dmqx   6?rINRUf  / $/5: A M0[    + 1D;0':*-?*m 9 , @ U \ l   F " ## -# 7#D# X# f# t# # # #######$/$>$.A$ p$$ $C$)$?%4S%=%:%Q&S&7&h-''i(>(o(E8)8~)7) )) * * (* 2* <*H*5*2+25+?h+H+!+g,S{,O,F-<f-E-9-:#.\^.;.7.K//@{//////0 .0G:0 00000000 001 1 "1#,1#P1t1y11 1 1111 11 1 111 1 22#252E2K2Q2Y2h2q2Nu2234 44!4!54W4]4n44444 44454 5!5'5 -5;5R5<g555 5 555666/6 66A6J6Y6_6Vg68636?+70k747.7&8'8/8@8Q8 W8Ke88888 889*9 8@<k`g' t[4i9{#^Mn|svO= q5c2je&zJLd?SxTu;P$6b,\AZ7WFQ- mVHDhG_fp+ U:>!a/01y(])Cl3wr*X. EoR}YN%~BI"K%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceAUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.23.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-08-16 03:22+0300 Last-Translator: Lucian Adrian Grijincu Language-Team: Romanian Language: ro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);; X-Generator: Virtaal 0.6.1 X-Launchpad-Export-Date: 2010-08-16 00:08+0000 Funcție %s %dFuncție %s„%s” de „%s”Centru 3DAdâncime 3DÎmbunătățire 3DIntrare AUX 1Ieșire AUX 1Intrare AUX 2Ieșire AUX 2Intrare AUXIeșire AUXEroare redare audio.BasAmplificare basConector negruConector negru panou frontalConector albastruConector albastru panou frontalBoxe integrateCDDispozitivul „%s” nu poate fi identificat.Nu se poate opera fără un ceasCentruCentru / LFESchimbarea rezoluției pe durata rulării nu este incă suportată.Nu se poate stabili o conexiune la serverNu s-a putut programa memoria tampon în dispozitivul „%s”.Nu se poate stabili o conexiune la serverul de sunetNu s-au putut obține parametrii pentru dispozitivul „%s”Nu s-a putut mapa memoria tampon din dispozitivul „%s”Nu s-a putut deschide dispozitivul audio pentru gestionarea controlului de mixaj.Nu s-a putut deschide dispozitivul audio pentru gestionarea controlului de mixaj. Această versiune a OSS (Open Sound System) nu este suportată de acest elementNu s-a putut deschide dispozitivul audio pentru redare.Nu s-a putut deschide dispozitivul audio pentru redare. Dispozitivul este folosit de o altă aplicație.Nu s-a putut deschide dispozitivul audio pentru redare. Versiunea aceasta a OSS (Open Sound System) nu este suportată de acest element.Nu s-a putut deschide dispozitivul audio pentru redare. Nu aveți permisiunea de a deschide dispozitivul.Nu s-a putut deschide dispozitivul audio pentru înregistrare.Nu s-a putut deschide dispozitivul audio pentru înregistrare Nu aveți permisiunea de a deschide dispozitivul.Nu se poate deschide dispozitivul „%s” pentru citire și scriere.Dispozitivul „%s” nu este un dispozitiv de captură.Dispozitivul „%s” nu este un dispozitiv de ieșire.DiagnosticIntrare digitalăIeșire digitalăDigital-1Digital-2Digital-3Mixaj redusEroare la obținerea capabilităților pentru dispozitivul „%s”: Nu este un driver v4l2. Verificați dacă este un driver v4l1.Eroare citire %d octeți de la dispozitivul „%s”.Eroare citire %d octeți pe dispozitivul „%s”.Eroare la înregistrarea de la dispozitivul audio.A eșuat după %d încercări. dispozitiv %s. eroare sistem: %sObținerea atributelor de control pentru dispozitivul „%s” a eșuat.Nu s-a putut decoda imaginea JPEGObținerea intrări curente pentru dispozitivul „%s” a eșuat. Posibil să fie un dispozitiv radio.Obținerea frecvenței curent a receptorului pentru dispozitivul „%s” a eșuat.A eșuat obținerea configurării receptorului %d pentru dispozitivul „%s”.Obținerea nivelului semnalului pentru dispozitivul „%s” a eșuat.Obținerea valorii %d pentru dispozitivul „%s” a eșuat.Interogarea atributelor de intrare %d pentru dispozitivul %s a eșuatInterogarea normei pentru dispozitivul „%s” a eșuat.Interogarea capabilităților serverului de sunet a eșuatDefinirea frecvenței curent a receptorului pentru dispozitivul „%s” la %lu Hz a eșuat.Definirea valorii %d pentru dispozitivul „%s” a eșuat.Definirea normei pentru dispozitivul „%s” a eșuat.Definirii valorii %d pentru controlul %d al dispozitivul „%s” a eșuat.Obținerea cadrelor video pentru dispozitivul „%s” a eșuat.RapidFațăCăști panou frontalLinie intrare panou frontalLinie ieșire panou frontalMicrofon panou frontalAmplificareS-a obținut o dimensiune neașteptată pentru cadru, %u în loc de %u.Conector griConector gri panou frontalConector verdeConector verde panou frontalHDMICăștiCăștiCăștiRidicatăCâștig intrareIntrareMix intrareCD internEroare internă a fluxului de date.Eroare internă a fluxului de date.JackBip tastaturăLFELinie intrareLinie ieșireLinia-1Linia-2Linia-3Linie intrareBuclăScăzutăPrincipalMedieMicrofonMicrofon 1Microfon 2Amplificare microfonCâștig microfonSursă microfonMixerModemMonitorSursă monitorMono MixMutIntrarea audio nu există sau este nevalidă, fluxul de date AVI va fi corupt.Nu a fost găsit niciun flux suportat. S-ar putea să necesite permiterea mai multor protocoale de transport sau de altfel s-ar putea să lipsească modulul corect de extensie GStreamer RTSP.Nu s-a găsit nici un flux suportat. Pentru fluxuri Real media s-ar putea să fie nevoie să instalați extensia GStreamer RTSP.NiciunulDezactivatActivatConector portocaliuConector portocaliu panou frontalAltulCâștig ieșireCâștig ieșirePCMPCM-2Intrare telefonIeșire telefonConector rozConector roz panou frontalPorturi redareRedarea nu este suportată de acest dispozitiv audio.ProducțieRadioSpateÎnregistrareCâștig înregistrareSursă înregistrareÎnregistrarea nu este suportată de acest dispozitiv audio.Conector roșuConector roșu panou frontalIntrare SPDIFIeșire SPDIFLateralSimulează stereoDifuzorSursă difuzorÎmparte ieșireaStereoStereo MixSurroundSunet surroundSynthTelefonDriverul pentru dispozitivul „%s” nu suport nici o metodă de captură cunoscută.Este posibil ca fișierul video să nu fie redat corect.Acest fișier nu conține fluxuri ce pot fi redate.Fișierul conține prea multe fluxuri. Se redau doar primele %dAcest fișier este corupt și nu poate fi redat.Acest fișier nu este complet și nu poate fi redat.Fișierul nu este valid și nu poate fi redat.Acesta nu este un dispozitiv „%s”.ÎnalteFoarte ridicatăFoarte scăzutăVideoIntrare videoDispozitivul de intrare video nu a acceptat noua configurare de rate cadre.Canale mixer videoIntrare mixer videoIeșire mixer videoVolumConector albConector alb panou frontalConector galbenConector galben panou frontalgst-plugins-good-0.10.31/po/POTFILES.in0000644000175000017500000000114511671175354014205 00000000000000ext/esd/esdsink.c ext/pulse/pulsesink.c ext/flac/gstflacdec.c ext/jpeg/gstjpegdec.c ext/libpng/gstpngdec.c ext/shout2/gstshout2.c ext/soup/gstsouphttpsrc.c ext/wavpack/gstwavpackparse.c gconf/gstreamer.schemas.in gst/avi/gstavidemux.c gst/avi/gstavimux.c gst/isomp4/qtdemux.c gst/rtsp/gstrtspsrc.c gst/wavparse/gstwavparse.c sys/oss/gstossmixer.c sys/oss/gstossmixertrack.c sys/oss/gstosssink.c sys/oss/gstosssrc.c sys/oss4/oss4-mixer.c sys/oss4/oss4-sink.c sys/oss4/oss4-source.c sys/sunaudio/gstsunaudiomixertrack.c sys/v4l2/gstv4l2src.c sys/v4l2/v4l2_calls.c sys/v4l2/v4l2src_calls.c sys/ximage/gstximagesrc.c gst-plugins-good-0.10.31/po/gst-plugins-good-0.10.pot0000644000175000017500000004077311720560371016734 00000000000000# SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.31\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ext/esd/esdsink.c:252 ext/esd/esdsink.c:357 msgid "Could not establish connection to sound server" msgstr "" #: ext/esd/esdsink.c:259 msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #: ext/pulse/pulsesink.c:2889 #, c-format msgid "'%s' by '%s'" msgstr "" #: ext/flac/gstflacdec.c:1150 ext/libpng/gstpngdec.c:343 #: ext/libpng/gstpngdec.c:354 ext/libpng/gstpngdec.c:553 #: ext/wavpack/gstwavpackparse.c:1173 gst/avi/gstavidemux.c:5211 msgid "Internal data stream error." msgstr "" #: ext/jpeg/gstjpegdec.c:289 msgid "Failed to decode JPEG image" msgstr "" #: ext/shout2/gstshout2.c:588 msgid "Could not connect to server" msgstr "" #: ext/soup/gstsouphttpsrc.c:873 msgid "Server does not support seeking." msgstr "" #: ext/soup/gstsouphttpsrc.c:1080 msgid "Could not resolve server name." msgstr "" #: ext/soup/gstsouphttpsrc.c:1086 msgid "Could not establish connection to server." msgstr "" #: ext/soup/gstsouphttpsrc.c:1091 msgid "Secure connection setup failed." msgstr "" #: ext/soup/gstsouphttpsrc.c:1096 msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" #: ext/soup/gstsouphttpsrc.c:1102 msgid "Server sent bad data." msgstr "" #: ext/soup/gstsouphttpsrc.c:1251 msgid "No URL set." msgstr "" #: gst/avi/gstavimux.c:1806 msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" #: gst/isomp4/qtdemux.c:522 gst/isomp4/qtdemux.c:526 msgid "This file contains no playable streams." msgstr "" #: gst/isomp4/qtdemux.c:561 gst/isomp4/qtdemux.c:4080 #: gst/isomp4/qtdemux.c:4150 gst/isomp4/qtdemux.c:4299 msgid "This file is invalid and cannot be played." msgstr "" #: gst/isomp4/qtdemux.c:2464 gst/isomp4/qtdemux.c:2540 #: gst/isomp4/qtdemux.c:2583 gst/isomp4/qtdemux.c:4881 #: gst/isomp4/qtdemux.c:4888 gst/isomp4/qtdemux.c:5479 #: gst/isomp4/qtdemux.c:5907 gst/isomp4/qtdemux.c:5914 #: gst/isomp4/qtdemux.c:7477 msgid "This file is corrupt and cannot be played." msgstr "" #: gst/isomp4/qtdemux.c:2672 msgid "Invalid atom size." msgstr "" #: gst/isomp4/qtdemux.c:2741 msgid "This file is incomplete and cannot be played." msgstr "" #: gst/isomp4/qtdemux.c:5077 msgid "The video in this file might not play correctly." msgstr "" #: gst/isomp4/qtdemux.c:7506 #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" #: gst/rtsp/gstrtspsrc.c:5380 msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" #: gst/rtsp/gstrtspsrc.c:5385 msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" #: gst/wavparse/gstwavparse.c:2109 msgid "Internal data flow error." msgstr "" #: sys/oss/gstossmixertrack.c:98 sys/oss4/oss4-mixer.c:728 #: sys/sunaudio/gstsunaudiomixertrack.c:69 msgid "Volume" msgstr "" #: sys/oss/gstossmixertrack.c:99 sys/oss4/oss4-mixer.c:741 msgid "Bass" msgstr "" #: sys/oss/gstossmixertrack.c:100 sys/oss4/oss4-mixer.c:742 msgid "Treble" msgstr "" #: sys/oss/gstossmixertrack.c:101 msgid "Synth" msgstr "" #: sys/oss/gstossmixertrack.c:102 sys/oss4/oss4-mixer.c:756 msgid "PCM" msgstr "" #: sys/oss/gstossmixertrack.c:103 msgid "Speaker" msgstr "" #: sys/oss/gstossmixertrack.c:104 msgid "Line-in" msgstr "" #: sys/oss/gstossmixertrack.c:105 sys/oss4/oss4-mixer.c:747 msgid "Microphone" msgstr "" #: sys/oss/gstossmixertrack.c:106 msgid "CD" msgstr "" #: sys/oss/gstossmixertrack.c:107 msgid "Mixer" msgstr "" #: sys/oss/gstossmixertrack.c:108 msgid "PCM-2" msgstr "" #: sys/oss/gstossmixertrack.c:109 msgid "Record" msgstr "" #: sys/oss/gstossmixertrack.c:110 msgid "In-gain" msgstr "" #: sys/oss/gstossmixertrack.c:111 msgid "Out-gain" msgstr "" #: sys/oss/gstossmixertrack.c:112 msgid "Line-1" msgstr "" #: sys/oss/gstossmixertrack.c:113 msgid "Line-2" msgstr "" #: sys/oss/gstossmixertrack.c:114 msgid "Line-3" msgstr "" #: sys/oss/gstossmixertrack.c:115 msgid "Digital-1" msgstr "" #: sys/oss/gstossmixertrack.c:116 msgid "Digital-2" msgstr "" #: sys/oss/gstossmixertrack.c:117 msgid "Digital-3" msgstr "" #: sys/oss/gstossmixertrack.c:118 msgid "Phone-in" msgstr "" #: sys/oss/gstossmixertrack.c:119 msgid "Phone-out" msgstr "" #: sys/oss/gstossmixertrack.c:120 msgid "Video" msgstr "" #: sys/oss/gstossmixertrack.c:121 msgid "Radio" msgstr "" #: sys/oss/gstossmixertrack.c:122 sys/oss4/oss4-mixer.c:770 #: sys/sunaudio/gstsunaudiomixertrack.c:71 msgid "Monitor" msgstr "" #: sys/oss/gstosssink.c:399 sys/oss4/oss4-sink.c:495 #: sys/oss4/oss4-source.c:362 msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" #: sys/oss/gstosssink.c:406 sys/oss4/oss4-sink.c:505 #: sys/oss4/oss4-source.c:372 msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" #: sys/oss/gstosssink.c:414 sys/oss4/oss4-sink.c:516 #: sys/oss4/oss4-source.c:383 msgid "Could not open audio device for playback." msgstr "" #: sys/oss/gstosssrc.c:370 msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" #: sys/oss/gstosssrc.c:378 msgid "Could not open audio device for recording." msgstr "" #: sys/oss4/oss4-mixer.c:303 msgid "Could not open audio device for mixer control handling." msgstr "" #: sys/oss4/oss4-mixer.c:317 msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" #: sys/oss4/oss4-mixer.c:729 msgid "Master" msgstr "" #: sys/oss4/oss4-mixer.c:730 msgid "Front" msgstr "" #: sys/oss4/oss4-mixer.c:731 msgid "Rear" msgstr "" #: sys/oss4/oss4-mixer.c:732 msgid "Headphones" msgstr "" #: sys/oss4/oss4-mixer.c:733 msgid "Center" msgstr "" #: sys/oss4/oss4-mixer.c:734 msgid "LFE" msgstr "" #: sys/oss4/oss4-mixer.c:735 msgid "Surround" msgstr "" #: sys/oss4/oss4-mixer.c:736 msgid "Side" msgstr "" #: sys/oss4/oss4-mixer.c:737 sys/sunaudio/gstsunaudiomixertrack.c:72 msgid "Built-in Speaker" msgstr "" #: sys/oss4/oss4-mixer.c:738 sys/sunaudio/gstsunaudiomixertrack.c:76 msgid "AUX 1 Out" msgstr "" #: sys/oss4/oss4-mixer.c:739 sys/sunaudio/gstsunaudiomixertrack.c:77 msgid "AUX 2 Out" msgstr "" #: sys/oss4/oss4-mixer.c:740 msgid "AUX Out" msgstr "" #: sys/oss4/oss4-mixer.c:743 msgid "3D Depth" msgstr "" #: sys/oss4/oss4-mixer.c:744 msgid "3D Center" msgstr "" #: sys/oss4/oss4-mixer.c:745 msgid "3D Enhance" msgstr "" #: sys/oss4/oss4-mixer.c:746 msgid "Telephone" msgstr "" #: sys/oss4/oss4-mixer.c:748 sys/sunaudio/gstsunaudiomixertrack.c:74 msgid "Line Out" msgstr "" #: sys/oss4/oss4-mixer.c:749 sys/oss4/oss4-mixer.c:750 msgid "Line In" msgstr "" #: sys/oss4/oss4-mixer.c:751 msgid "Internal CD" msgstr "" #: sys/oss4/oss4-mixer.c:752 msgid "Video In" msgstr "" #: sys/oss4/oss4-mixer.c:753 msgid "AUX 1 In" msgstr "" #: sys/oss4/oss4-mixer.c:754 msgid "AUX 2 In" msgstr "" #: sys/oss4/oss4-mixer.c:755 msgid "AUX In" msgstr "" #: sys/oss4/oss4-mixer.c:757 sys/oss4/oss4-mixer.c:758 msgid "Record Gain" msgstr "" #: sys/oss4/oss4-mixer.c:759 msgid "Output Gain" msgstr "" #: sys/oss4/oss4-mixer.c:760 msgid "Microphone Boost" msgstr "" #: sys/oss4/oss4-mixer.c:761 msgid "Loopback" msgstr "" #: sys/oss4/oss4-mixer.c:762 msgid "Diagnostic" msgstr "" #: sys/oss4/oss4-mixer.c:763 msgid "Bass Boost" msgstr "" #: sys/oss4/oss4-mixer.c:764 msgid "Playback Ports" msgstr "" #: sys/oss4/oss4-mixer.c:765 msgid "Input" msgstr "" #: sys/oss4/oss4-mixer.c:766 sys/oss4/oss4-mixer.c:767 msgid "Record Source" msgstr "" #: sys/oss4/oss4-mixer.c:768 msgid "Monitor Source" msgstr "" #: sys/oss4/oss4-mixer.c:769 msgid "Keyboard Beep" msgstr "" #: sys/oss4/oss4-mixer.c:771 msgid "Simulate Stereo" msgstr "" #: sys/oss4/oss4-mixer.c:772 sys/oss4/oss4-mixer.c:792 msgid "Stereo" msgstr "" #: sys/oss4/oss4-mixer.c:773 msgid "Surround Sound" msgstr "" #: sys/oss4/oss4-mixer.c:774 msgid "Microphone Gain" msgstr "" #: sys/oss4/oss4-mixer.c:775 msgid "Speaker Source" msgstr "" #: sys/oss4/oss4-mixer.c:776 msgid "Microphone Source" msgstr "" #: sys/oss4/oss4-mixer.c:777 msgid "Jack" msgstr "" #: sys/oss4/oss4-mixer.c:778 msgid "Center / LFE" msgstr "" #: sys/oss4/oss4-mixer.c:779 msgid "Stereo Mix" msgstr "" #: sys/oss4/oss4-mixer.c:780 msgid "Mono Mix" msgstr "" #: sys/oss4/oss4-mixer.c:781 msgid "Input Mix" msgstr "" #: sys/oss4/oss4-mixer.c:782 msgid "SPDIF In" msgstr "" #: sys/oss4/oss4-mixer.c:783 sys/sunaudio/gstsunaudiomixertrack.c:75 msgid "SPDIF Out" msgstr "" #: sys/oss4/oss4-mixer.c:784 msgid "Microphone 1" msgstr "" #: sys/oss4/oss4-mixer.c:785 msgid "Microphone 2" msgstr "" #: sys/oss4/oss4-mixer.c:786 msgid "Digital Out" msgstr "" #: sys/oss4/oss4-mixer.c:787 msgid "Digital In" msgstr "" #: sys/oss4/oss4-mixer.c:788 msgid "HDMI" msgstr "" #: sys/oss4/oss4-mixer.c:789 msgid "Modem" msgstr "" #: sys/oss4/oss4-mixer.c:790 msgid "Handset" msgstr "" #: sys/oss4/oss4-mixer.c:791 msgid "Other" msgstr "" #: sys/oss4/oss4-mixer.c:793 msgid "None" msgstr "" #: sys/oss4/oss4-mixer.c:794 msgid "On" msgstr "" #: sys/oss4/oss4-mixer.c:795 msgid "Off" msgstr "" #: sys/oss4/oss4-mixer.c:796 msgid "Mute" msgstr "" #: sys/oss4/oss4-mixer.c:797 msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here #: sys/oss4/oss4-mixer.c:799 msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here #: sys/oss4/oss4-mixer.c:801 msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here #: sys/oss4/oss4-mixer.c:803 msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here #: sys/oss4/oss4-mixer.c:805 msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here #: sys/oss4/oss4-mixer.c:807 sys/oss4/oss4-mixer.c:808 msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here #: sys/oss4/oss4-mixer.c:810 msgid "Production" msgstr "" #: sys/oss4/oss4-mixer.c:811 msgid "Front Panel Microphone" msgstr "" #: sys/oss4/oss4-mixer.c:812 msgid "Front Panel Line In" msgstr "" #: sys/oss4/oss4-mixer.c:813 msgid "Front Panel Headphones" msgstr "" #: sys/oss4/oss4-mixer.c:814 msgid "Front Panel Line Out" msgstr "" #: sys/oss4/oss4-mixer.c:815 msgid "Green Connector" msgstr "" #: sys/oss4/oss4-mixer.c:816 msgid "Pink Connector" msgstr "" #: sys/oss4/oss4-mixer.c:817 msgid "Blue Connector" msgstr "" #: sys/oss4/oss4-mixer.c:818 msgid "White Connector" msgstr "" #: sys/oss4/oss4-mixer.c:819 msgid "Black Connector" msgstr "" #: sys/oss4/oss4-mixer.c:820 msgid "Gray Connector" msgstr "" #: sys/oss4/oss4-mixer.c:821 msgid "Orange Connector" msgstr "" #: sys/oss4/oss4-mixer.c:822 msgid "Red Connector" msgstr "" #: sys/oss4/oss4-mixer.c:823 msgid "Yellow Connector" msgstr "" #: sys/oss4/oss4-mixer.c:824 msgid "Green Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:825 msgid "Pink Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:826 msgid "Blue Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:827 msgid "White Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:828 msgid "Black Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:829 msgid "Gray Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:830 msgid "Orange Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:831 msgid "Red Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:832 msgid "Yellow Front Panel Connector" msgstr "" #: sys/oss4/oss4-mixer.c:833 msgid "Spread Output" msgstr "" #: sys/oss4/oss4-mixer.c:834 msgid "Downmix" msgstr "" #: sys/oss4/oss4-mixer.c:878 msgid "Virtual Mixer Input" msgstr "" #: sys/oss4/oss4-mixer.c:880 msgid "Virtual Mixer Output" msgstr "" #: sys/oss4/oss4-mixer.c:882 msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #: sys/oss4/oss4-mixer.c:933 #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #: sys/oss4/oss4-mixer.c:940 #, c-format msgid "%s Function" msgstr "" #: sys/oss4/oss4-sink.c:525 sys/oss4/oss4-source.c:393 msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" #: sys/oss4/oss4-sink.c:641 msgid "Playback is not supported by this audio device." msgstr "" #: sys/oss4/oss4-sink.c:648 msgid "Audio playback error." msgstr "" #: sys/oss4/oss4-source.c:515 msgid "Recording is not supported by this audio device." msgstr "" #: sys/oss4/oss4-source.c:522 msgid "Error recording from audio device." msgstr "" #: sys/sunaudio/gstsunaudiomixertrack.c:70 msgid "Gain" msgstr "" #: sys/sunaudio/gstsunaudiomixertrack.c:73 msgid "Headphone" msgstr "" #: sys/v4l2/gstv4l2src.c:892 #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "" #: sys/v4l2/gstv4l2src.c:918 #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #: sys/v4l2/gstv4l2src.c:936 #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:99 #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #: sys/v4l2/v4l2_calls.c:139 #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #: sys/v4l2/v4l2_calls.c:169 #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:213 #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:347 #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:492 #, c-format msgid "Cannot identify device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:499 #, c-format msgid "This isn't a device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:506 #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "" #: sys/v4l2/v4l2_calls.c:513 #, c-format msgid "Device '%s' is not a capture device." msgstr "" #: sys/v4l2/v4l2_calls.c:522 #, c-format msgid "Device '%s' is not a output device." msgstr "" #: sys/v4l2/v4l2_calls.c:622 #, c-format msgid "Failed to set norm for device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:660 #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:702 #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #: sys/v4l2/v4l2_calls.c:736 #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:772 #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:807 #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" #: sys/v4l2/v4l2_calls.c:839 #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #: sys/v4l2/v4l2_calls.c:864 #, c-format msgid "Failed to set input %d on device %s." msgstr "" #: sys/v4l2/v4l2_calls.c:896 #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" #: sys/v4l2/v4l2_calls.c:921 #, c-format msgid "Failed to set output %d on device %s." msgstr "" #: sys/v4l2/v4l2src_calls.c:81 #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "" #: sys/v4l2/v4l2src_calls.c:197 #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" #: sys/v4l2/v4l2src_calls.c:199 #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #: sys/v4l2/v4l2src_calls.c:234 #, c-format msgid "Could not get parameters on device '%s'" msgstr "" #: sys/v4l2/v4l2src_calls.c:261 msgid "Video input device did not accept new frame rate setting." msgstr "" #: sys/v4l2/v4l2src_calls.c:331 #, c-format msgid "Could not map buffers from device '%s'" msgstr "" #: sys/v4l2/v4l2src_calls.c:339 #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" #: sys/ximage/gstximagesrc.c:796 msgid "Changing resolution at runtime is not yet supported." msgstr "" #: sys/ximage/gstximagesrc.c:810 msgid "Cannot operate without a clock" msgstr "" gst-plugins-good-0.10.31/po/sv.po0000644000175000017500000011016311720565342013414 00000000000000# Swedish messages for gst-plugins-good. # Copyright (C) 2007-2011 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # Christian Rose , 2004. # Daniel Nylander , 2007, 2008, 2009, 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-09 19:36+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Kunde inte etablera en anslutning till ljudservern" msgid "Failed to query sound server capabilities" msgstr "Misslyckades med att fråga efter ljudserverförmågor" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "\"%s\" av \"%s\"" msgid "Internal data stream error." msgstr "Internt fel i dataström." msgid "Failed to decode JPEG image" msgstr "Misslyckades med att avkoda JPEG-bild" msgid "Could not connect to server" msgstr "Kunde inte ansluta till servern" msgid "Server does not support seeking." msgstr "Servern saknar stöd för sökning/spolning." msgid "Could not resolve server name." msgstr "Kunde inte slå upp servernamnet." msgid "Could not establish connection to server." msgstr "Kunde inte etablera anslutning till servern." msgid "Secure connection setup failed." msgstr "Säker anslutning misslyckades." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Ett nätverksfel inträfade eller servern stängde anslutningen oväntat." msgid "Server sent bad data." msgstr "Servern skickade felaktigt data." msgid "No URL set." msgstr "Ingen URL inställd." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Inget eller ogiltigt inljud. AVI-flödet kommer att skadas." msgid "This file contains no playable streams." msgstr "Den här filen innehåller inga uppspelningsbara strömmar." msgid "This file is invalid and cannot be played." msgstr "Den här filen är ogiltig och kan inte spelas upp." msgid "This file is corrupt and cannot be played." msgstr "Den här filen är skadad och kan inte spelas upp." msgid "Invalid atom size." msgstr "Ogiltig atomstorlek." msgid "This file is incomplete and cannot be played." msgstr "Den här filen är inte fullständig och kan inte spelas upp." msgid "The video in this file might not play correctly." msgstr "Videon i den här filen kanske inte kan spelas upp korrekt." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Den här filen innehåller för många strömmar. Spelar endast upp de första %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Ingen ström som stöds hittades. Du kanske behöver installera en GStreamer-" "insticksmodul för RTSP för Real Media-strömmar." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Ingen ström som stöds hittades. Du kanske behöver tillåta fler " "transportprotokoll eller så saknar du kanske det rätta GStreamer-tillägget " "för RTSP." msgid "Internal data flow error." msgstr "Internt fel i dataflöde." msgid "Volume" msgstr "Volym" msgid "Bass" msgstr "Bass" msgid "Treble" msgstr "Diskant" msgid "Synth" msgstr "Synt" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Högtalare" msgid "Line-in" msgstr "Linje-in" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "Cd" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Spela in" msgid "In-gain" msgstr "Införstärkning" msgid "Out-gain" msgstr "Utförstärkning" msgid "Line-1" msgstr "Linje-1" msgid "Line-2" msgstr "Linje-2" msgid "Line-3" msgstr "Linje-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Tele-in" msgid "Phone-out" msgstr "Tele-ut" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Kunde inte öppna ljudenheten för uppspelning. Enheten används av ett annat " "program." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Kunde inte öppna ljudenheten för uppspelning. Du har inte behörighet att " "öppna enheten." msgid "Could not open audio device for playback." msgstr "Kunde inte öppna ljudenheten för uppspelning." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Kunde inte öppna ljudenheten för inspelning. Du har inte behörighet att " "öppna enheten." msgid "Could not open audio device for recording." msgstr "Kunde inte öppna ljudenheten för inspelning." msgid "Could not open audio device for mixer control handling." msgstr "Kunde inte öppna ljudenheten för hantering av mixerstyrning." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Kunde inte öppna ljudenheten för mixerhantering. Denna version av Open Sound " "System saknar stöd för detta element." msgid "Master" msgstr "Övergripande" msgid "Front" msgstr "Fram" msgid "Rear" msgstr "Bak" msgid "Headphones" msgstr "Hörlurar" msgid "Center" msgstr "Center" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Sida" msgid "Built-in Speaker" msgstr "Inbyggd högtalare" msgid "AUX 1 Out" msgstr "AUX 1 ut" msgid "AUX 2 Out" msgstr "AUX 2 ut" msgid "AUX Out" msgstr "AUX ut" msgid "3D Depth" msgstr "3D-djup" msgid "3D Center" msgstr "3D-center" msgid "3D Enhance" msgstr "3D Enhance" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Linje ut" msgid "Line In" msgstr "Linje-in" msgid "Internal CD" msgstr "Intern cd-spelare" msgid "Video In" msgstr "Video-in" msgid "AUX 1 In" msgstr "AUX 1 in" msgid "AUX 2 In" msgstr "AUX 2 in" msgid "AUX In" msgstr "AUX in" msgid "Record Gain" msgstr "Inspelningsförstärkning" msgid "Output Gain" msgstr "Utförstärkning" msgid "Microphone Boost" msgstr "Mikrofonboost" msgid "Loopback" msgstr "Loopback" msgid "Diagnostic" msgstr "Diagnostik" msgid "Bass Boost" msgstr "Bass Boost" msgid "Playback Ports" msgstr "Uppspelningsportar" msgid "Input" msgstr "Ingång" msgid "Record Source" msgstr "Inspelningskälla" msgid "Monitor Source" msgstr "Monitorkälla" msgid "Keyboard Beep" msgstr "Tangentbordspip" msgid "Simulate Stereo" msgstr "Simulera stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Surroundljud" msgid "Microphone Gain" msgstr "Mikrofonförstärkning" msgid "Speaker Source" msgstr "Högtalarkälla" msgid "Microphone Source" msgstr "Mikrofonkälla" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Center / LFE" msgid "Stereo Mix" msgstr "Stereomix" msgid "Mono Mix" msgstr "Monomix" msgid "Input Mix" msgstr "Ingångsmix" msgid "SPDIF In" msgstr "SPDIF in" msgid "SPDIF Out" msgstr "SPDIF ut" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digital-ut" msgid "Digital In" msgstr "Digital-in" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" # Telefon? msgid "Handset" msgstr "Handhållen" msgid "Other" msgstr "Annat" msgid "None" msgstr "Ingen" msgid "On" msgstr "På" msgid "Off" msgstr "Av" msgid "Mute" msgstr "Tyst" msgid "Fast" msgstr "Snabb" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Mycket låg" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Låg" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medel" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Hög" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Mycket hög" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produktion" msgid "Front Panel Microphone" msgstr "Mikrofon på frontpanel" msgid "Front Panel Line In" msgstr "Linje-in frontpanel" msgid "Front Panel Headphones" msgstr "Hörlurar frontpanel" msgid "Front Panel Line Out" msgstr "Linje-ut frontpanel" msgid "Green Connector" msgstr "Grön kontakt" msgid "Pink Connector" msgstr "Rosa kontakt" msgid "Blue Connector" msgstr "Blå kontakt" msgid "White Connector" msgstr "Vit kontakt" msgid "Black Connector" msgstr "Svart kontakt" msgid "Gray Connector" msgstr "Grå kontakt" msgid "Orange Connector" msgstr "Orange kontakt" msgid "Red Connector" msgstr "Röd kontakt" msgid "Yellow Connector" msgstr "Gul kontakt" msgid "Green Front Panel Connector" msgstr "Grön kontakt frontpanel" msgid "Pink Front Panel Connector" msgstr "Rosa kontakt frontpanel" msgid "Blue Front Panel Connector" msgstr "Blå kontakt frontpanel" msgid "White Front Panel Connector" msgstr "Vit kontakt frontpanel" msgid "Black Front Panel Connector" msgstr "Svart kontakt frontpanel" msgid "Gray Front Panel Connector" msgstr "Grå kontakt frontpanel" msgid "Orange Front Panel Connector" msgstr "Orange kontakt frontpanel" msgid "Red Front Panel Connector" msgstr "Röd kontakt frontpanel" msgid "Yellow Front Panel Connector" msgstr "Gul kontakt frontpanel" msgid "Spread Output" msgstr "Spridd utgång" msgid "Downmix" msgstr "Nermixning" msgid "Virtual Mixer Input" msgstr "Virtuell mixer ingång" msgid "Virtual Mixer Output" msgstr "Virtuell mixer utgång" msgid "Virtual Mixer Channels" msgstr "Kanaler för virtuell mixer" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d-funktion" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s-funktion" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Kunde inte öppna ljudenheten för uppspelning. Denna version av Open Sound " "System stöds inte av detta element." msgid "Playback is not supported by this audio device." msgstr "Uppspelning stöds inte av denna ljudenhet." msgid "Audio playback error." msgstr "Fel vid ljuduppspelning." msgid "Recording is not supported by this audio device." msgstr "Inspelning stöds inte av denna ljudenhet." msgid "Error recording from audio device." msgstr "Fel vid inspelning från ljudenheten." msgid "Gain" msgstr "Förstärk" msgid "Headphone" msgstr "Hörlur" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Fel vid läsning av %d byte från enheten \"%s\"." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Fick oväntade bildrutstorleken %u istället för %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Fel vid läsning av %d byte på enheten \"%s\"." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Fel vid läsning av förmågor för enheten \"%s\": Det är inte en v4l2-" "drivrutin. Kontrollera om det är en v4l1-drivrutin." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Misslyckades med att fråga efter attribut för ingång %d i enheten %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Misslyckades med att få tag i inställningen för mottagare %d på enheten \"%s" "\"." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Misslyckades med att fråga efter norm på enheten \"%s\"." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Misslyckades med att få tag på kontrollattributen på enheten \"%s\"." #, c-format msgid "Cannot identify device '%s'." msgstr "Kunde inte identifiera enheten \"%s\"." #, c-format msgid "This isn't a device '%s'." msgstr "Det här är inte en enhet \"%s\"." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Kunde inte öppna enheten \"%s\" för läsning och skrivning." #, c-format msgid "Device '%s' is not a capture device." msgstr "Enheten \"%s\" är ingen fångstenhet." #, c-format msgid "Device '%s' is not a output device." msgstr "Enheten \"%s\" är ingen utgångsenhet." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Misslyckades med att ställa in norm för enheten \"%s\"." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Misslyckades med att gå tag på aktuell mottagarfrekvens för enheten \"%s\"." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Misslyckades med att ställa in aktuell mottagarfrekvens för enheten \"%s\" " "till %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Misslyckades med att få tag på signalstyrka för enheten \"%s\"." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" "Misslyckades med att få tag på värdet för kontrollen %d på enheten \"%s\"." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Kunde inte ställa in värdet %d för kontrollen %d på enheten \"%s\"." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Misslyckades med att få tag på aktuell ingång på enheten \"%s\". Kan vara en " "radioenhet" #, c-format msgid "Failed to set input %d on device %s." msgstr "Kunde inte ställa in ingång %d på enheten %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Misslyckades med att få tag på aktuell utgång på enheten \"%s\". Kan vara en " "radioenhet" #, c-format msgid "Failed to set output %d on device %s." msgstr "Misslyckades med att ställa in utgång %d på enheten %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Kunde inte kölägga buffertar i enheten \"%s\"." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Misslyckades med att få videobildrutor från enheten \"%s\"." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Misslyckades efter %d försök. enhet %s. systemfel: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Kunde inte få tag i parametrar på enheten \"%s\"" msgid "Video input device did not accept new frame rate setting." msgstr "Videoingångsenheten accepterade inte ny inställning för bildfrekvens." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Kunde inte mappa buffertar från enheten \"%s\"." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Drivrutinen för enheten \"%s\" saknar stöd för någon känd fångstmetod." msgid "Changing resolution at runtime is not yet supported." msgstr "Ändring av upplösning vid körtid stöds inte än." msgid "Cannot operate without a clock" msgstr "Kan inte fungera utan en klocka" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Misslyckades med att räkna upp möjliga videoformat som enheten \"%s\" kan " #~ "arbeta med" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Bufferttypen stöds inte, indexet är utanför intervallet, inga buffertar " #~ "har allokerats än eller att userptr eller längden är ogiltig. enhet %s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Misslyckades med att försöka få tag på videobildrutor från enheten \"%s" #~ "\". Inte tillräckligt mycket minne." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "Otillräckligt minne för att kölägga en användarpekarbuffert. enhet %s." #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "Inga lediga buffertar hittades i poolen på index %d." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Enheten \"%s\" kan inte fånga i %dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Enheten \"%s\" kan inte fånga i det angivna formatet" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Kunde inte få tag i buffertar från enheten \"%s\"." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "" #~ "Kunde inte få tag i tillräckligt många buffertar från enheten \"%s\"." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Fel vid start av strömfångst från enheten \"%s\"." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Fel vid stopp av strömfångst från enheten \"%s\"." #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "" #~ "Misslyckades med att få tag på kontrollattributen på enheten \"%s\"." #~ msgid "Could not read from CD." #~ msgstr "Kunde inte läsa från cd-skiva." #~ msgid "Disc is not an Audio CD." #~ msgstr "Skivan är inte en ljud-cd." #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Den här filen är krypterad och kan inte spelas upp." #~ msgid "Could not set parameters on device '%s'" #~ msgstr "Kunde inte ställa in parametrar på enheten \"%s\"" #~ msgid "Device '%s' cannot capture at %d/%d frames per second" #~ msgstr "Enheten \"%s\" kan inte fånga i %d/%d bildrutor per sekund" #~ msgid "Could not exchange data with device '%s'." #~ msgstr "Kunde inte utväxla data med enheten \"%s\"." #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "Kunde inte öppna filen \"%s\" för skrivning." #~ msgid "Error closing file \"%s\"." #~ msgstr "Fel vid stängning av filen \"%s\"." #~ msgid "Could not open file \"%s\" for reading." #~ msgstr "Kunde inte öppna filen \"%s\" för läsning." #~ msgid "No filename specified." #~ msgstr "Inget filnamn angivet." #~ msgid "Could not open control device \"%s\" for writing." #~ msgstr "Kunde inte öppna styrenheten \"%s\" för skrivning." #~ msgid "Could not set audio device \"%s\" to %d Hz." #~ msgstr "Kan inte ställa in ljudenheten \"%s\" till %d Hz." #~ msgid "Could not close audio device \"%s\"." #~ msgstr "Kunde inte stänga ljudenheten \"%s\"." #~ msgid "Could not open video device \"%s\" for writing." #~ msgstr "Kunde inte öppna videoenheten \"%s\" för skrivning." #~ msgid "OSS device \"%s\" is already in use by another program." #~ msgstr "OSS-enheten \"%s\" används redan av ett annat program." #~ msgid "Could not access device \"%s\", check its permissions." #~ msgstr "Kunde inte komma åt enheten \"%s\". Kontrollera dess rättigheter." #~ msgid "Device \"%s\" does not exist." #~ msgstr "Enheten \"%s\" finns inte." #~ msgid "Could not open device \"%s\" for writing." #~ msgstr "Kunde inte öppna enheten \"%s\" för skrivning." #~ msgid "Could not open device \"%s\" for reading." #~ msgstr "Kunde inte öppna enheten \"%s\" för läsning." #~ msgid "Your OSS device could not be probed correctly" #~ msgstr "Din OSS-enhet kunde inte undersökas korrekt" #, fuzzy #~ msgid "Capture" #~ msgstr "Satir" #, fuzzy #~ msgid "discid" #~ msgstr "Ingen skiva" #~ msgid "Could not open vfs file \"%s\" for reading." #~ msgstr "Kunde inte öppna vfs-filen \"%s\" för läsning." #, fuzzy #~ msgid "No filename given." #~ msgstr "Inget filnamn angivet" #~ msgid "Could not open vfs file \"%s\" for writing: %s." #~ msgstr "Kunde inte öppna vfs-filen \"%s\" för skrivning: %s." #~ msgid "No filename given" #~ msgstr "Inget filnamn angivet" #~ msgid "Could not close vfs file \"%s\"." #~ msgstr "Kunde inte stänga vfs-filen \"%s\"." #, fuzzy #~ msgid "Your OSS device doesn't support mono or stereo." #~ msgstr "Din OSS-enhet kunde inte undersökas korrekt" #~ msgid "No device specified." #~ msgstr "Ingen enheten angiven." #~ msgid "Device is open." #~ msgstr "Enheten är öppen." #~ msgid "" #~ "The %s element could not be found. This element is essential for " #~ "playback. Please install the right plug-in and verify that it works by " #~ "running 'gst-inspect %s'" #~ msgstr "" #~ "Elementet %s kunde inte hittas. Detta element är nödvändigt för " #~ "uppspelning. Installera rätt insticksmodul och verifiera att den fungerar " #~ "genom att köra \"gst-inspect %s\"" #~ msgid "" #~ "No usable colorspace element could be found.\n" #~ "Please install one and restart." #~ msgstr "" #~ "Inget användbart namnrymdselement kunde hittas.\n" #~ "Installera ett och starta om." #~ msgid "Phone in" #~ msgstr "Tele in" #~ msgid "Phone out" #~ msgstr "Tele ut" #~ msgid "Address of the server to contact for CD queries" #~ msgstr "Adress till servern som ska kontaktas för cd-frågor" #~ msgid "Information to send to server" #~ msgstr "Information att skicka till server" #~ msgid "Port" #~ msgstr "Port" #~ msgid "Server name" #~ msgstr "Servernamn" #~ msgid "Server type" #~ msgstr "Servertyp" #~ msgid "The hostname that will be sent with all queries" #~ msgstr "Värdnamnet som kommer att skickas med alla frågor" #~ msgid "The port that the server is running the database on" #~ msgstr "Porten som servern kör databasen på" #~ msgid "" #~ "There was an error displaying help: \n" #~ "%s" #~ msgstr "" #~ "Det uppstod ett fel vid visning av hjälp: \n" #~ "%s" #~ msgid "Login Information" #~ msgstr "Inloggningsinformation" #~ msgid "Sen_d no information" #~ msgstr "Ski_cka ingen information" #~ msgid "Send real _information" #~ msgstr "Skicka verklig _information" #~ msgid "Send _other information:" #~ msgstr "Skicka _annan information:" #~ msgid "_Name:" #~ msgstr "_Namn:" #~ msgid "Hostna_me:" #~ msgstr "Värdna_mn:" #~ msgid "_Update Server List" #~ msgstr "_Uppdatera serverlistan" #~ msgid "Other _server:" #~ msgstr "Annan _server:" #~ msgid "Hos_tname:" #~ msgstr "Vä_rdnamn:" #~ msgid "_Port:" #~ msgstr "_Port:" #~ msgid "CD Database Preferences" #~ msgstr "Inställningar för cd-databas" #~ msgid "Unknown / Unknown" #~ msgstr "Okänd / Okänd" #~ msgid "Unknown" #~ msgstr "Okänd" #~ msgid "Multiple matches..." #~ msgstr "Flera träffar..." #~ msgid "Category" #~ msgstr "Kategori" #~ msgid "Disc ID" #~ msgstr "Skiv-ID" #~ msgid "Artist and Title" #~ msgstr "Artist och titel" #~ msgid "Unknown track" #~ msgstr "Okänt spår" #~ msgid "CD Database" #~ msgstr "Cd-databas" #~ msgid "Modify your CD database preferences" #~ msgstr "Ändra dina inställningar för cd-databas" #~ msgid "Blues" #~ msgstr "Blues" #~ msgid "Classical Rock" #~ msgstr "Klassisk rock" #~ msgid "Disco" #~ msgstr "Disco" #~ msgid "Funk" #~ msgstr "Funk" #~ msgid "Grunge" #~ msgstr "Grunge" #~ msgid "Hip-Hop" #~ msgstr "Hip-Hop" #~ msgid "Jazz" #~ msgstr "Jazz" #~ msgid "Metal" #~ msgstr "Metal" #~ msgid "New Age" #~ msgstr "New Age" #~ msgid "Oldies" #~ msgstr "Gamla godingar" #~ msgid "Pop" #~ msgstr "Pop" #~ msgid "R&B" #~ msgstr "R&B" #~ msgid "Rap" #~ msgstr "Rap" #~ msgid "Reggae" #~ msgstr "Reggae" #~ msgid "Rock" #~ msgstr "Rock" #~ msgid "Techno" #~ msgstr "Techno" #~ msgid "Industrial" #~ msgstr "Industrial" #~ msgid "Alternative" #~ msgstr "Alternativmusik" #~ msgid "Ska" #~ msgstr "Ska" #~ msgid "Death Metal" #~ msgstr "Death Metal" #~ msgid "Pranks" #~ msgstr "Pranks" #~ msgid "Soundtrack" #~ msgstr "Filmmusik" #~ msgid "Euro-Techno" #~ msgstr "Euro-Techno" #~ msgid "Ambient" #~ msgstr "Ambient" #~ msgid "Trip-Hop" #~ msgstr "Trip-Hop" #~ msgid "Vocal" #~ msgstr "Vocal" #~ msgid "Jazz+Funk" #~ msgstr "Jazz+Funk" #~ msgid "Fusion" #~ msgstr "Fusion" #~ msgid "Trance" #~ msgstr "Trance" #~ msgid "Classical" #~ msgstr "Klassiskt" #~ msgid "Acid" #~ msgstr "Acid" #~ msgid "House" #~ msgstr "House" #~ msgid "Game" #~ msgstr "Spel" #~ msgid "Sound Clip" #~ msgstr "Ljudklipp" #~ msgid "Gospel" #~ msgstr "Gospel" #~ msgid "Alt" #~ msgstr "Alt" #~ msgid "Soul" #~ msgstr "Soul" #~ msgid "Punk" #~ msgstr "Punk" #~ msgid "Space" #~ msgstr "Space" #~ msgid "Meditative" #~ msgstr "Meditativt" #~ msgid "Instrumental Pop" #~ msgstr "Instrumentell pop" #~ msgid "Instrumental Rock" #~ msgstr "Instrumentell rock" #~ msgid "Ethnic" #~ msgstr "Folkmusik" #~ msgid "Gothic" #~ msgstr "Gotiskt" #~ msgid "Darkwave" #~ msgstr "Darkwave" #~ msgid "Techno-Industrial" #~ msgstr "Techno-Industrial" #~ msgid "Electronic" #~ msgstr "Electroniskt" #~ msgid "Pop-Folk" #~ msgstr "Pop-Folk" #~ msgid "Eurodance" #~ msgstr "Eurodance" #~ msgid "Dream" #~ msgstr "Dream" #~ msgid "Southern Rock" #~ msgstr "Southern Rock" #~ msgid "Comedy" #~ msgstr "Komedi" #~ msgid "Cult" #~ msgstr "Kult" #~ msgid "Gangsta Rap" #~ msgstr "Gangsta Rap" #~ msgid "Top 40" #~ msgstr "Topp 40" #~ msgid "Christian Rap" #~ msgstr "Kristen rap" #~ msgid "Pop/Funk" #~ msgstr "Pop/Funk" #~ msgid "Jungle" #~ msgstr "Jungle" #~ msgid "Native American" #~ msgstr "Amerikansk urbefolkning" #~ msgid "Cabaret" #~ msgstr "Kabaré" #~ msgid "New Wave" #~ msgstr "New Wave" #~ msgid "Psychedelic" #~ msgstr "Psykedeliskt" #~ msgid "Rave" #~ msgstr "Rejv" #~ msgid "Showtunes" #~ msgstr "Showtunes" #~ msgid "Trailer" #~ msgstr "Trailer" #~ msgid "Lo-Fi" #~ msgstr "Lo-Fi" #~ msgid "Tribal" #~ msgstr "Tribal" #~ msgid "Acid Punk" #~ msgstr "Acid Punk" #~ msgid "Acid Jazz" #~ msgstr "Acid Jazz" #~ msgid "Polka" #~ msgstr "Polka" #~ msgid "Musical" #~ msgstr "Musikal" #~ msgid "Rock & Roll" #~ msgstr "Rock & Roll" #~ msgid "Hard Rock" #~ msgstr "Hårdrock" #~ msgid "Folk" #~ msgstr "Folk" #~ msgid "Folk/Rock" #~ msgstr "Folk/Rock" #~ msgid "National Folk" #~ msgstr "Nationell Folk" #~ msgid "Swing" #~ msgstr "Swing" #~ msgid "Fast-Fusion" #~ msgstr "Fast-Fusion" #~ msgid "Bebop" #~ msgstr "Bebop" #~ msgid "Latin" #~ msgstr "Latinskt" #~ msgid "Revival" #~ msgstr "Uppväckelse" #~ msgid "Celtic" #~ msgstr "Keltiskt" #~ msgid "Bluegrass" #~ msgstr "Bluegrass" #~ msgid "Avantgarde" #~ msgstr "Avantgarde" #~ msgid "Gothic Rock" #~ msgstr "Gotisk rock" #~ msgid "Progressive Rock" #~ msgstr "Progressiv rock" #~ msgid "Psychedelic Rock" #~ msgstr "Psykedelisk rock" #~ msgid "Symphonic Rock" #~ msgstr "Symfonisk rock" #~ msgid "Slow Rock" #~ msgstr "Slow Rock" #~ msgid "Big Band" #~ msgstr "Big Band" #~ msgid "Chorus" #~ msgstr "Kör" #~ msgid "Easy Listening" #~ msgstr "Lättlyssnat" #~ msgid "Acoustic" #~ msgstr "Akustiskt" #~ msgid "Humour" #~ msgstr "Humor" #~ msgid "Speech" #~ msgstr "Tal" #~ msgid "Chanson" #~ msgstr "Chanson" #~ msgid "Opera" #~ msgstr "Opera" #~ msgid "Chamber Music" #~ msgstr "Kammarmusik" #~ msgid "Sonata" #~ msgstr "Sonat" #~ msgid "Symphony" #~ msgstr "Symfoni" #~ msgid "Booty Bass" #~ msgstr "Booty Bass" #~ msgid "Primus" #~ msgstr "Primus" #~ msgid "Porn Groove" #~ msgstr "Porn Groove" #~ msgid "Slow Jam" #~ msgstr "Slow Jam" #~ msgid "Club" #~ msgstr "Klubb" #~ msgid "Tango" #~ msgstr "Tango" #~ msgid "Samba" #~ msgstr "Samba" #~ msgid "Folklore" #~ msgstr "Folklore" #~ msgid "Ballad" #~ msgstr "Ballad" #~ msgid "Power Ballad" #~ msgstr "Power Ballad" #~ msgid "Rhythmic Soul" #~ msgstr "Rhythmic Soul" #~ msgid "Freestyle" #~ msgstr "Freestyle" #~ msgid "Duet" #~ msgstr "Duett" #~ msgid "Punk Rock" #~ msgstr "Punkrock" #~ msgid "Drum Solo" #~ msgstr "Trumsolo" #~ msgid "A Cappella" #~ msgstr "A cappella" #~ msgid "Euro-House" #~ msgstr "Euro-House" #~ msgid "Dance Hall" #~ msgstr "Dance Hall" #~ msgid "Goa" #~ msgstr "Goa" #~ msgid "Drum & Bass" #~ msgstr "Drum & Bass" #~ msgid "Club-House" #~ msgstr "Club-House" #~ msgid "Hardcore" #~ msgstr "Hardcore" #~ msgid "Terror" #~ msgstr "Terror" #~ msgid "Indie" #~ msgstr "Indie" #~ msgid "BritPop" #~ msgstr "BritPop" #~ msgid "Negerpunk" #~ msgstr "Negerpunk" #~ msgid "Polsk Punk" #~ msgstr "Polsk Punk" #~ msgid "Beat" #~ msgstr "Beat" #~ msgid "Christian Gangsta Rap" #~ msgstr "Kristen gangsta rap" #~ msgid "Heavy Metal" #~ msgstr "Heavy Metal" #~ msgid "Crossover" #~ msgstr "Crossover" #~ msgid "Contemporary Christian" #~ msgstr "Modern kristen" #~ msgid "Christian Rock" #~ msgstr "Kristen rock" #~ msgid "Merengue" #~ msgstr "Merengue" #~ msgid "Salsa" #~ msgstr "Salsa" #~ msgid "Thrash Metal" #~ msgstr "Thrash Metal" #~ msgid "Anime" #~ msgstr "Anime" #~ msgid "JPop" #~ msgstr "JPop" #~ msgid "Synthpop" #~ msgstr "Synthpop" #~ msgid "Nu-Metal" #~ msgstr "Nu-Metal" #~ msgid "Art Rock" #~ msgstr "Art rock" #~ msgid "Editing Disc ID: %s" #~ msgstr "Redigerar skivid: %s" #~ msgid "Editing Disc ID: " #~ msgstr "Redigerar skivid: " #~ msgid "_Artist:" #~ msgstr "_Artist:" #~ msgid "Disc _Title:" #~ msgstr "Skiv_titel:" #~ msgid "Show advanced disc options" #~ msgstr "Visa avancerade skivalternativ" #~ msgid "Hide advanced disc options" #~ msgstr "Dölj avancerade skivalternativ" #~ msgid "_Disc comments:" #~ msgstr "_Skivkommentarer:" #~ msgid "_Genre:" #~ msgstr "_Genre:" #~ msgid "_Year:" #~ msgstr "_År:" #~ msgid "Title" #~ msgstr "Titel" #~ msgid "Length" #~ msgstr "Längd" #~ msgid "Show advanced track options" #~ msgstr "Visa avancerade spåralternativ" #~ msgid "Hide advanced track options" #~ msgstr "Dölj avancerade spåralternativ" #~ msgid "_Extra track data:" #~ msgstr "_Extra spårdata:" #~ msgid "Time Line" #~ msgstr "Tidslinje" #~ msgid "Line for displaying the time elapsed for the current track" #~ msgstr "Linje för visning av den tid som gått tid för aktuellt spår" #~ msgid "Info Line" #~ msgstr "Informationsrad" #~ msgid "Line for displaying information" #~ msgstr "Rad för visning av information" #~ msgid "Artist Line" #~ msgstr "Artistrad" #~ msgid "Line for displaying the name of the artist" #~ msgstr "Rad för visning av namnet på artisten" #~ msgid "Album Line" #~ msgstr "Albumrad" #~ msgid "Line for displaying the name of the album" #~ msgstr "Rad för visning av namnet på albumet" #~ msgid "Pause" #~ msgstr "Paus" #~ msgid "Playing %s - %s" #~ msgstr "Spelar %s - %s" #~ msgid "Unknown Artist" #~ msgstr "Okänd artist" #~ msgid "Unknown Album" #~ msgstr "Okänt album" #~ msgid "Playing" #~ msgstr "Spelar" #~ msgid "Paused" #~ msgstr "Gör paus" #~ msgid "CD Player" #~ msgstr "Cd-spelare" #~ msgid "Stopped" #~ msgstr "Stoppad" #~ msgid "Disc error" #~ msgstr "Skivfel" #~ msgid "Data CD" #~ msgstr "Data-cd" #~ msgid "No Cdrom" #~ msgstr "Ingen cd-rom" #~ msgid "Drive Error" #~ msgstr "Enhetsfel" #~ msgid "You do not seem to have permission to access %s." #~ msgstr "Du verkar inte ha rättighet att komma åt %s." #~ msgid "Unknown artist" #~ msgstr "Okänd artist" #~ msgid "Unknown disc" #~ msgstr "Okänd skiva" #~ msgid "%d - Unknown" #~ msgstr "%d - okänd" #~ msgid "P_revious track" #~ msgstr "F_öregående spår" #~ msgid "_Stop" #~ msgstr "_Stopp" #~ msgid "_Play / Pause" #~ msgstr "S_pela/Paus" #~ msgid "_Next track" #~ msgstr "_Nästa spår" #~ msgid "_Eject disc" #~ msgstr "_Mata ut skiva" #~ msgid "_Help" #~ msgstr "_Hjälp" #~ msgid "_About CD player" #~ msgstr "_Om cd-spelare" #~ msgid "Set device" #~ msgstr "Ställ in enhet" #~ msgid "No CD device" #~ msgstr "Ingen cd-enhet" #~ msgid "_Details" #~ msgstr "_Detaljer" #~ msgid "_Set device" #~ msgstr "_Ställ in enhet" #~ msgid "Volume control" #~ msgstr "Volymkontroll" #~ msgid "Position" #~ msgstr "Position" #~ msgid "Open track editor" #~ msgstr "Öppna spårredigerare" #~ msgid "Track editor" #~ msgstr "Spårredigerare" #~ msgid "Open preferences" #~ msgstr "Öppna inställningar" #~ msgid "Preferences" #~ msgstr "Inställningar" #~ msgid "Track List" #~ msgstr "Spårlista" #~ msgid "Previous track" #~ msgstr "Föregående spår" #~ msgid "Previous" #~ msgstr "Föregående" #~ msgid "Rewind" #~ msgstr "Spola tillbaka" #~ msgid "Play / Pause" #~ msgstr "Spela/Paus" #~ msgid "Stop" #~ msgstr "Stopp" #~ msgid "Fast forward" #~ msgstr "Snabbspola" #~ msgid "Next track" #~ msgstr "Nästa spår" #~ msgid "Eject CD" #~ msgstr "Mata ut cd" #~ msgid "Eject" #~ msgstr "Mata ut" #~ msgid "CD device to use" #~ msgstr "Cd-enhet att använda" #~ msgid "Only start if there isn't already a CD player application running" #~ msgstr "Starta endast om det inte finns ett annat cd-spelarprogram som kör" #~ msgid "Play the CD on startup" #~ msgstr "Spela cd-skivan vid uppstart" #~ msgid "Cannot create player" #~ msgstr "Kan inte skapa spelare" #~ msgid "Play audio CDs" #~ msgstr "Spela ljud-cd" #~ msgid "CD player theme" #~ msgstr "Cd-spelartema" #~ msgid "Device path" #~ msgstr "Enhetssökväg" #~ msgid "Record sound clips" #~ msgstr "Spela in ljudklipp" #~ msgid "Sound Recorder" #~ msgstr "Ljudinspelare" #~ msgid "About" #~ msgstr "Om" #~ msgid "Close" #~ msgstr "Stäng" #~ msgid "Close this window" #~ msgstr "Stäng detta fönster" #~ msgid "Contents" #~ msgstr "Innehåll" #~ msgid "Create a new sample" #~ msgstr "Skapa ett nytt ljudklipp" #~ msgid "File Information" #~ msgstr "Filinformation" #~ msgid "File _Information" #~ msgstr "Fil_information" #~ msgid "Main toolbar" #~ msgstr "Huvudverktygsrad" #~ msgid "New" #~ msgstr "Nytt" #~ msgid "Open a file" #~ msgstr "Öppna en fil" #~ msgid "Play sound" #~ msgstr "Spela ljud" #~ msgid "Quit" #~ msgstr "Avsluta" #~ msgid "Quit the application" #~ msgstr "Avsluta programmet" #~ msgid "Recent _Files" #~ msgstr "Senaste _filer" #~ msgid "Run Mixer" #~ msgstr "Kör mixer" #~ msgid "Run _Mixer" #~ msgstr "Kör _mixer" #~ msgid "Run the audio mixer" #~ msgstr "Kör ljudmixern" #~ msgid "Save" #~ msgstr "Spara" #~ msgid "Save As" #~ msgstr "Spara som" #~ msgid "Save _As..." #~ msgstr "Spara so_m..." #~ msgid "Save the current file" #~ msgstr "Spara den aktuella filen" #~ msgid "Save the current file with a different name" #~ msgstr "Spara den aktuella filen med ett annat namn" #~ msgid "Show information about the current file" #~ msgstr "Visa information om den aktuella filen" #~ msgid "Show information for Sound Recorder" #~ msgstr "Visa information för ljudinspelaren" #~ msgid "Stop sound" #~ msgstr "Stoppa ljud" #~ msgid "_About" #~ msgstr "_Om" #~ msgid "_Close Window" #~ msgstr "S_täng fönster" #~ msgid "_Contents" #~ msgstr "_Innehåll" #~ msgid "_Control" #~ msgstr "_Kontroll" #~ msgid "_File" #~ msgstr "_Fil" #~ msgid "_New" #~ msgstr "_Nytt" #~ msgid "_Open..." #~ msgstr "_Öppna..." #~ msgid "_Play" #~ msgstr "_Spela" #~ msgid "_Quit" #~ msgstr "_Avsluta" #~ msgid "_Record" #~ msgstr "Spela _in" #~ msgid "_Save" #~ msgstr "_Spara" #~ msgid "hours" #~ msgstr "timmar" #~ msgid "hour" #~ msgstr "timme" #~ msgid "minutes" #~ msgstr "minuter" #~ msgid "minute" #~ msgstr "minut" #~ msgid "seconds" #~ msgstr "sekunder" #~ msgid "second" #~ msgstr "sekund" #~ msgid "Ready" #~ msgstr "Klar" #~ msgid "Save file as" #~ msgstr "Spara fil som" #~ msgid "%s is not installed in the path." #~ msgstr "%s är inte installerad i sökvägen." #~ msgid "There was an error starting %s: %s" #~ msgstr "Det uppstod ett fel vid start av %s: %s" #~ msgid "%s (Has not been saved)" #~ msgstr "%s (Har inte sparats)" #~ msgid "Unknown size" #~ msgstr "Okänd storlek" #~ msgid "%.1f kHz" #~ msgstr "%.1f kHz" #~ msgid "%.0f kb/s" #~ msgstr "%.0f kb/s" #~ msgid "1 (mono)" #~ msgstr "1 (mono)" #~ msgid "2 (stereo)" #~ msgstr "2 (stereo)" #~ msgid "Folder:" #~ msgstr "Mapp:" #~ msgid "Filename:" #~ msgstr "Filnamn:" #~ msgid "File size:" #~ msgstr "Filstorlek:" #~ msgid "Audio Information" #~ msgstr "Ljudinformation" #~ msgid "Song length:" #~ msgstr "Låtlängd:" #~ msgid "Number of channels:" #~ msgstr "Antal kanaler:" #~ msgid "Sample rate:" #~ msgstr "Samplingsfrekvens:" #~ msgid "Bit rate:" #~ msgstr "Bithastighet:" #~ msgid "Playing..." #~ msgstr "Spelar upp..." #~ msgid "%s.%s - Sound Recorder" #~ msgstr "%s.%s - Ljudinspelare" #~ msgid "Recording..." #~ msgstr "Spelar in..." #~ msgid "File information" #~ msgstr "Filinformation" #~ msgid "" #~ msgstr "" #~ msgid "Length:" #~ msgstr "Längd:" #~ msgid "Adjust the volume level" #~ msgstr "Justera nivån på volymen" #~ msgid "%s Slider" #~ msgstr "%s-skjutreglage" #~ msgid "Channel %d of %s Slider" #~ msgstr "Kanal %d för %s-skjutreglage" #~ msgid "%s Slider %d" #~ msgstr "%s-skjutreglage %d" #~ msgid "%s Lock" #~ msgstr "%s-lås" gst-plugins-good-0.10.31/po/ru.gmo0000644000175000017500000004654411720565343013572 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""# %!% 3% T%b%t%z%&&%&4& E&R&7a& &&&<&':/'#j''E'7' ((8(>(_)Ru)\)S%*Uy**Q+i>,,e-:.W.F/c/?L0X0V0<1S1m111111G2G3=^3h3d4Hj44L5g5_O6c6|7T7K7U18s8N8OJ9P99mr:::3;<<;>y;3;;R;N<:f<<><<==#=4= C=d=#m==<=<=1#>U>#Z>~>>>>>>> ? #? 0?;?J?[?n?)?!?'? ? @ @!"@!D@f@y@@#A,B B CCCB9C |C"CCCCCCC>D)UDpD D DE E$E!@E^bEE>EF+FQ9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-04-26 21:13+0400 Last-Translator: Yuri Kozlov Language-Team: Russian Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 1.0 Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Функция %s %dФункция %s«%s» исполняет «%s»3D центр3D глубина3D улучшениеПроизошла сетевая ошибка или сервер неожиданно закрыл соединение.Вход AUX 1Выход AUX 1Вход AUX 2Выход AUX 2Вход AUXВыход AUXОшибка воспроизведения аудио.НизкиеУсиление басаЧёрный разъёмЧёрный разъём на передней панелиСиний разъёмСиний разъём на передней панелиВнутренний динамикCDНе удаётся распознать устройство «%s».Операция невозможна без часовЦентрЦентр / СабвуферИзменение разрешения видео во время выполнения не поддерживается в настоящий момент.Не удалось соединиться с серверомНе удалось добавить в очередь буферы устройства «%s»Не удалось установить соединение с сервером.Не удалось установить соединение с сервером звукаНе удалось получить параметры устройства «%s»Не удалось распределить буферы устройства «%s»Не удалось открыть аудио-устройство для обработки параметров микшера.Не удалось открыть аудио-устройство для обработки параметров микшера. Данная версия Open Sound System не поддерживается этим элементом.Не удалось открыть аудио-устройство для воспроизведения.Не удалось открыть аудио-устройство для воспроизведения. Устройство используется другим приложением.Не удалось открыть аудио-устройство для воспроизведения. Данная версия Open Sound System не поддерживается этим элементом.Не удалось открыть аудио-устройство для воспроизведения. Отсутствуют права доступа к устройству.Не удалось открыть аудио-устройство для записи.Не удалось открыть аудио-устройство для записи. Отсутствуют права доступа к устройству.Не удалось открыть устройство «%s» для чтения и записи.Не удалось определить имя сервера.Устройство «%s» не является устройством захвата.Устройство «%s» не является устройством вывода.ДиагностикаЦифровой входЦифровой выходЦифровой-1Цифровой-2Цифровой-3НизведениеОшибка получения возможностей устройства «%s»: драйвер устройства несовместим с v4l2. Проверьте, не использует ли устройство драйвер v4l1.Ошибка чтения %d байт из устройства «%s».Ошибка чтения %d байт из устройства «%s».Ошибка записи с аудио-устройства.Ошибка после %d попыток. Устройство: %s. Системная ошибка: %sОшибка получения атрибутов управления устройства «%s».Не удалось декодировать JPEG-изображениеНе удалось определить активный вход устройства «%s». Возможно, это радио-устройствоНе удалось определить активный выход устройства «%s». Возможно, это радио-устройствоОшибка получения текущей частоты тюнера устройства «%s».Ошибка получения установок тюнера %d устройства «%s».Ошибка получения мощности сигнала для устройства «%s».Ошибка получения значения управляющего параметра %d устройства «%s».Ошибка запроса атрибутов входа %d устройства %sОшибка запроса стандарта устройства «%s».Ошибка при запросе возможностей сервера звукаОшибка установки текущей частоты тюнера устройства «%s» в %lu Гц.Не удалось выбрать вход %d для устройства %s.Ошибка установки стандарта устройства «%s».Не удалось выбрать выход %d для устройства %s.Ошибка установки значения %d для управляющего параметра %d устройства «%s».Ошибка при попытке получения кадров видео с устройства «%s».СкоростьФронтальныеНаушники на передней панелиЛинейный вход на передней панелиЛинейный выход на передней панелиМикрофон на передней панелиУровеньПолучен неожиданный размер кадра: %u вместо %u.Серый разъёмСерый разъём на передней панелиЗелёный разъёмЗелёный разъём на передней панелиHDMIГарнитураНаушникНаушникиВысокоеУсиление на входеВходМикширование входаВнутренний CDВнутренняя ошибка потока данных.Внутренняя ошибка потока данных.Неверный атомарный размер.JackОзвучка клавиатурыСабвуферЛинейный входЛинейный выходЛинейный-1Линейный-2Линейный-3Линейный входПетляНизкоеОбщийСреднееМикрофонМикрофон 1Микрофон 2Микрофонный усилительУровень микрофонаУстройство микрофонаМикшерМодемМониторингУстройство выводаМоно микшированиеЗаглушитьURL не задан.Входящие аудио-данные отсутствуют или недействительны, поток AVI будет повреждён.Ни один поток не поддерживается. Возможно требуется разрешить дополнительные протоколы передачи или же отсутствует правильный модуль GStreamer RTSP.Ни один поток не поддерживается. Возможно требуется установка дополнительного модуля GStreamer RTSP для потоков Real media.НичегоВыклВклОранжевый разъёмОранжевый разъём на передней панелиДругойУсиление на выходеВыходной уровеньPCMPCM-2Тел. входТел. выходРозовый разъёмРозовый разъём на передней панелиПорты воспроизведенияВоспроизведение не поддерживается данным аудио-устройством.ВыдачаРадиоТыловыеЗаписьУровень записиУстройство записиЗапись не поддерживается данным аудио-устройством.Красный разъёмКрасный разъём на передней панелиВход SPDIFВыход SPDIFНе удалось настроить защищённое соединение.Сервер не поддерживает поиск.Сервер прислал некорректные данные.БоковыеИмитация стереоВнутренний динамикУстройство динамикаРазвёрнутый выводСтереоСтерео микшированиеОбъёмный звукОбъёмный звукСинтезаторТелефонДрайвер устройства «%s» не поддерживает ни один из известных методов захвата.Видео из этого файла может быть воспроизведено некорректно.Файл не содержит воспроизводимых потоков.Файл содержит слишком много потоков. Будет воспроизведёно только первых %dФайл повреждён и не может быть воспроизведён.Файл не полон и не может быть воспроизведён.Файл некорректен и не может быть воспроизведён.«%s» не является устройством.ВысокиеОчень высокоеОчень низкоеВидеоВидео входУстройство видео-захвата не приняло новый параметр кадровой частоты.Каналы виртуального микшераВход виртуального микшераВыход виртуального микшераУровеньБелый разъёмБелый разъём на передней панелиЖёлтый разъёмЖёлтый разъём на передней панелиgst-plugins-good-0.10.31/po/bg.gmo0000644000175000017500000004623711720565342013532 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$$$%%/%|K%%%%% &&=$&b&!k&&6&&6&-+'Y'S\'A' ''(L(m(Nf)])g*a{*}*[+X",{,--YS..g./B/O/N)0x000000#01X1]I2J2g2|Z3W3/44=5z5qE6|6t47]7i8q8X 9[b9Z9{:x: ; ;/&;'V;)~;/;;U;?<4U<<8<<<<= ="=@= I=j=<~=@=0=->#4>X>a> j> u> > >>> >> >>>?(?(B?&k?? ??1??@"%@rH@@ABBBB<B CC"6CYC]CcC CC8CCTDgD D D D"D DJD2E:NEEESE6E44FiF!zFF4F F G"GAGPGoGG|GeHFvHHV?ITIVI&BJ iJvJJ JJJ5PK1K3KKL4LPL6hLv` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-04-26 22:35+0300 Last-Translator: Alexander Shopov Language-Team: Bulgarian Language: bg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; Функция на %s № %dФункция на %s„%s“ от „%s“3D — център3D — дълбочина3D — подобренияВъзникна мрежова грешка или сървърът неочаквано прекъсна връзката.Вход AUX 1Изход AUX 1Вход AUX 2Изход AUX 2Вход AUXИзход AUXГрешка при изпълнение на аудиото.БасиУсилване на баситeЧерно гнездоЧерно гнездо на предния панелСиньо гнездоСиньо гнездо на предния панелВграден високоговорителCDУстройството „%s“ не може да се идентифицира.Работата без часовник е невъзможна.ЦентърЦентър/басиПромяната на разделителната способност по време на работа все още не се поддържа.Не може да се осъществи връзка към сървър.Буферите в устройство „%s“ не могат да се подредят в опашка.Не може да се осъществи връзка към сървъра.Не може да се осъществи връзка към звуковия сървър.Не могат да се получат параметрите на устройството „%s“.Не могат да се получат буферите от устройството „%s“.Аудио устройството не може да се отвори за управление на смесването.Аудио устройството не може да се отвори за управление на смесването. Елементът не поддържа тази версия на OSS.Устройството не може да се отвори за изпълнение.Аудио устройството не може да се отвори за изпълнение, използва се от друго приложение.Аудио устройството не може да се отвори за изпълнение. Елементът не поддържа тази версия на OSS.Аудио устройството не може да се отвори за изпълнение, нямате права за това.Аудио устройството не може да се отвори за запис.Аудио устройството не може да се отвори за запис, нямате права за това.Устройството „%s“ не може да се отвори за четене и запис.Сървърът не може да се открие по име.Устройството „%s“ не е устройство за запис.Устройството „%s“ не е изходно устройство.ДиагностикаЦифров входЦифров изходЦифрова-1Цифрова-2Цифрова-3Към по-малко изходиГрешка при получаването на възможностите на устройството „%s“: не е драйвер v4l2. Проверете дали всъщност не е драйвер v4l1.Грешка при прочитане %d байта от устройство „%s“.Грешка при прочитане на %d байта на устройство „%s“.Грешка при записа от аудио устройството.Неуспех след %d опита. Устройство „%s“. Системна грешка: %sНеуспешно получаване на контролните атрибути на устройството „%s“.Неуспешно декодиране на изображение, формат JPEG.Неуспешно получаване на текущия вход на устройство „%s“. Може би е радио.Неуспешно получаване на текущия изход на устройство „%s“. Може би е радио.Неуспешно получаване на текущата настройка на честотата за устройство „%s“.Неуспешно получаване на настройките на тунер %d на устройство „%s“.Неуспешно получаване на силата на сигнала на устройство „%s“.Неуспешно получаване на стойността на контрол %d на устройство „%s“.Неуспешно запитване за атрибутите за вход %d на устройство „%s“.Неуспешно запитване за нормата на устройство „%s“.Неуспешно запитване за възможностите на звуковия сървър.Неуспешно задаване на текущата настройка на честотата на устройство „%s“ да е %lu Hz.Неуспешно задаване на вход %d на устройство „%s“.Неуспешно задаване на нормата на устройство „%s“.Неуспешно задаване на изход %d на устройство „%s“.Неуспешно задаване на стойността %d на контрол %d на устройство „%s“.Неуспешен опит за получаване на видео кадрите от устройство „%s“.БързоОтпредСлушалки на предния панелВход на предния панелИзход на предния панелМикрофон на предния панелУсилванеПолучена е рамка с размер %u вместо очаквания %u.Сиво гнездоСиво гнездо на предния панелЗелено гнездоЗелено гнездо на предния панелHDMIСлушалкаСлушалкиСлушалкиВисокоВходно усилванеВходСмесител на входаВътрешно CDВътрешна грешка в потока с данни.Вътрешна грешка на потока от данни.Неправилен размер на атом.ЖакКлавиатурен звънецБасиВходИзходВход-1Вход-2Вход-3ВходОбратна връзкаНискоОсновнаСредноМикрофонМикрофон 1Микрофон 2Усилване на микрофонаУсилване на микрофонаИзточник за микрофонСмесителМодемМониторИзточник за звуков мониторСмесител на моноЗаглушаванеНе е зададен адрес.Аудио входът липсва или е грешен. Потокът с AVI ще бъде повреден.Не е открит поддържан поток. Може би трябва да разрешите повече транспортни протоколи или ви липсва правилната приставка на GStreamer за RTSP.Не е открит поддържан поток. Може да трябва да инсталирате приставката на GStreamer — RTSP, който поддържа потоци на Real.НямаИзключеноВключеноОранжево гнездоОранжево гнездо на предния панелДругоИзходно усилванеУсилване на изходаPCMPCM-2Вход за слушалкиИзход за слушалкиРозово гнездоРозово гнездо на предния панелИзходни гнездаТова аудио устройство не поддържа изпълнение.ПрофесионалноРадиоОтзадЗаписУсилване на записаИзточник за записТова аудио устройство не поддържа запис.Червено гнездоЧервено гнездо на предния панелВход SPDIFИзход SPDIFНеуспешно осъществяване на шифрирана връзка.Сървърът не поддържа търсене.Сървърът изпрати лоши данни.ОтстраниСимулирано стереоВисокоговорителИзточник за високоговорителКъм повече изходиСтереоСмесител на стереоСъраундСтерео и съраундСинтезаторТелефонДрайверът за устройството „%s“ не поддържа познати методи за запис.Видео потокът в този файл може да не се покаже правилно.Този файл не съдържа изпълними потоци.Този файл съдържа прекалено много потоци. Изпълняват се само първите %dТози файл е повреден и не може да бъде изпълнен.Този файл е непълен и не може да бъде изпълнен.Този файл е повреден и не може да бъде изпълнен.„%s“ не е устройство.ВисокиМного високоМного нискоВидеоВидео входУстройството за видео вход не приема новите настройки за честотата на кадри.Канали на виртуален смесителВход на виртуален смесителИзход на виртуален смесителСила на звукаБяло гнездоБяло гнездо на предния панелЖълто гнездоЖълто гнездо на предния панелgst-plugins-good-0.10.31/po/lv.gmo0000644000175000017500000003601311720565343013553 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#% % )% 5% ?% K%DY% % % % % % %%&&&)0&Z&(n&&&&$&& &F'N'%k'&'-'*''(>9({x(4(]))v)n)0m*n*= +!K+)m+!+ +++ + + ,,z",2,2,%-D)-5n- -X-X.Iw.B.6/8;/7t/*///S0/[0*0/0A01(1Z1 `1n1#1#11 1/1.2+E2q2)222 2 222223!3"33V3o3v333 3 3 3 3 3 33 33 4 4 4"4<4P4`4i4q4z4 444B4456 6 %6/6+F6r6w6666666'66,7 A7L7R7 X7c7y7-77+7 8 8,8 E8!f888 88888 889 9J92]909H9/ :2::1m::: : :: :G:0;K;e;;;);;,;v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-09-02 11:23-0000 Last-Translator: Rihards Priedītis Language-Team: Latvian Language: lv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2); X-Generator: Lokalize 1.0 %s %d funkcija%s funkcija"%s"ko "%s"3D centrs3D dziļums3D uzlabojumsNotika tīkla kļūda, vai serveris negaidīti aizvēra savienojumu.AUX 1 ieejaAUX 1 izejaAUX 2 ieejaAUX 2 izejaAUC ieejaAUX izejaAudio atskaņošanas kļūda.BasiBassa pastiprinājumsMelnais savienotājsMelnais priekšējā paneļa savienotājsZilais savienotājsZilais priekšējā paneļa savienotājsIebūvētais skaļrunisCDNevar atpazīt ierīci "%s"Nevar veikt darbības bez pulksteņaCentrsCentrs / LFEIzšķirtspējas mainīšana izpildlaikā pašalik netiek atbalstīta.Nevar savienoties ar serveriNevar ierindod buferus ierīcē "%s".Nevar izveidot savienojumu ar serveri.Nevar izveidot savienojumu ar skaņas serveriNevar nolasīt parametrus no ierīces "%s"Nevar izvietot buferus no ierīces "%s"Nevarēja atvērt audio ierīci miksera kontroles vadīšanai.Nevar atvērt audio ierīci miksera kontrolas vadīšanai. Šī Atvertās Skaņas Sistemas versija neatbalsta šo elementu.Nav iespējams atvērt audio ierīci atskaņošanai.Nav iespējams atvērt audio ierīci atskaņošanai. Ierīci pašlaik izmanto cita programma.Nav iespējams atvērt audio ierīci atskaņošanai. Šī Atvērtās Skaņas Sistemas versija neatbalsta šo elementu.Nav iespējams atvērt audio ierīci atskaņošanai. Jums nav nepieciešamās atļaujas, lai atvērtu ierīci.Nevarēja atvērt audio ierīci ierakstīšanai.Nevar atvērt audio ierīci ierakstīšanai. Jums nav nepieciešamo piekļuves tiesību, lai atvērtu ierīci.Nevarēja atvērt ierīci "%s" lasīšanai vai rakstīšanai.Nevar atpazīt servera nosaukumu.Ierīce "%s" nav ierakstīšanas ierīce.Ierīce "%s" nav izvades ierīce.DiagnostikaDigitālā ieejaDigitālā izejaDigitālais-1Digitālais-2Digitālais-3LejupmiksēšanaRadās kļūda saņemot ierīces "%s" iespējas: Iespējams tas nav v4I2 draiveris. Pārbaudiet vai tas ir v4I1 draiveris.Radās kļūda nolasot %d baitus no ierīces "%s".Radās kļūda nolasot %d baitus no ierīces "%s".Kļūda ierakstot no audio iekārtas.Neveiksme pēc %d mēģinājumiem. ierīce %s. sistēmas kļūda: %sNeizdevās iegūt kontroles atribūtus ierīcei "%s".Neizdevās atkodēt JPEG attēluNeizdevās saņemt pašreizējo ievadi no ierīces "%s". Iespējams tā ir radio ierīceNeizdevās saņemt pašreizējo izvadu no ierīces "%s". Iespējams tā ir radio ierīceNeizdevās saņemt pašreizējo atkaņošanas frekvenci no ierīces "%s".Neizdevās saņemt skaņotāja %d uzstādījumus no ierīces "%s".Neizdevās saņemt signāla stiprumu no ierīces "%s".Neizdevās saņemt kontroles vērtību %d ierīcei "%s".Neizdevās noteikt atribūtus ievadei %d no ierīces %sNeizdevās noskaidrot normu ierīcei "%s".Neizdevās noskaidrot skaņas servera iespējasNeizdevās uzstādīt ierīces "%s" pašreizējo atkaļošanas frekvenci uz %lu Hz.Neizdevās uzstādīt ievadi %d uz ierīces %s.Neizdevās uzstādīt normu ierīcei "%s".Neizdevās uzstādīt izvadu %d uz ierīces %s.Neizdevās uzstādīt vērtību %d kontrolei %d no ierīces "%s".Neizdevās saņemt video kadrus no ierīces "%s".ĀtrsPriekšējaisPriekšējā paneļa austiņasPriekšējā paneļa ieejas līnijaPriekšējā paneļa līnijas izejaPriekšējā paneļa mikrofonsPieaugumsSaņēmu negaidītu kadra izmēru %u, nevis %u.Pelākais savienotājsPelēkais priekšējā paneļa savienotājsZaļais savienotājsZaļais priekšējā paneļa savienotājsHDMIKlausuleAustiņasAustiņasAugstsIevades pieaugumsIevadsIeejas mikserisIekšējais CDIekšējā datu plūsmas kļūda.Iekšējās datu plūsmas kļūda.Nederīgs atoma izmērs.LigzdaKlaviatūras pīkstieniLFELīnijas ieejaSkaņas izejaLīnija-1Līnija-2Līnija-3Skaņas ieejaAtpakaļciklsZemsGalvenaisVidējsMikrofonsMikrofons 1Mikrofons 2Mikrofona pastiprinājumsMikrofona pieaugumsMikrofona avotsJaucējsModēmsMonitorsMonitora avotsMono miskerisKlusumsURL nav uzstādīts.Nav neviena vai nederīgs ievades audio, AVI straume tiks bojāta.Netika atrasta atbalstīta straume. Jums iespējams jāatļauj vairāk transporta protokoli vai arī trūkst GStreamer RTSP paplašinājuma spraudnis. Netika atrasta atbalstīta straume. Iespējams jums jāinstalē GStreamer RTSP paplašinājuma spraudni priekš Real media straumēm.NekasIzslēgtsIeslēgtsOranžais savienotājsOranžais priekšējā paneļa savienotājsCitsIzvades pieaugumsIzvada pieaugumsPCMPCM-2Telefona ievadeTelefona izvadeRozā savienotājsRozā priekšējā paneļa savienotājsAtskaņošanas portiŠī audio ierīce neatbalsta atskaņošanu.ProdukcijaRadioSāniIerakstītIerakstīta pieaugumsIerakstīšanas avotsŠī audio ierīce neatablsta ierkastīšanu.Sarkanais savienotājsSarkanais priekšējā paneļa savienotājsSPDIF ieejaSPDIF izejaDrošā savienojuma izveidošana neizdevās.Serveris neatbalsta meklēšanu.Serveris nosūtija sliktus datus.PuseSimulēt stereoSkaļrunisSkaļruņa avotsIzplest izvaduStereoStereo mikserisIeskaujošāIeskaujošā skaņaSintēzeTelefonsIerīces "%s" draiveris neatbalsta nevienu zināmo ierakstīšanas metodi.Video šajā failā var tikt atskaņots nepareizi.Šis fails nesatur nevienu atskaņojamu straumi.Šis fails satur pārāk daudz straumes. Tiek atskaņota tikai pirmā %dŠis fails ir bojāts un nevar tikt atskaņots.Šis pails ir nepabeigts un nevar tikt atskaņots.Šis fails ir nederīgs un nevar tikt atskaņots.Šī nav ierīce "%s"DiskantsĻoti augstsĻoti zemsVideoVideo ieejaVideo ievades ierīce nepieņem jaunos kadra frekvences uzstādījumus.Virtuālā miksera kanāliVirtuālā miksera ievadsVirtuālā miksera izvadsSkaļumsBaltais savienotājsBaltais priekšējā paneļa savienotājsDzeltains savienotājsDzeltenais priekšējā paneļa savienotājsgst-plugins-good-0.10.31/po/pt_BR.gmo0000644000175000017500000003651411720565343014146 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$$ $ $$ %I %U% d%r% % % %%%%% % &&>&S&/V&,&& &K&''=;'9y'?';'5/(\e((Cq)y)/*w*A:+u|+F+/9,5i,4, ,,, - - --k--)-)-(->.9U.".X.W /Fc/F/9/>+0>j00000R 10^131/1C1?72w22!2"2!22 3B3S3 b33 333333333 44<4\4w4|4444444444 44 4 5 5505C5W5]5 c5o5 555G55687 ?7I7P7"a77777777 778?8 X8c8j8 s8~88=88#8 9 )9)69'`9999 99 999 : : !:.:T7:>:0:E:;B;;~;7;;< < <,<3<PE<<<<<<!<=")=v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-08 01:28-0300 Last-Translator: Fabrício Godoy Language-Team: Brazilian Portuguese Language: pt_BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); %s %d%s"%s" por "%s"3D centralProfundidade 3DRealce 3DUm erro de rede ocorreu, ou o servidor fechou a conexão inesperadamente.Entrada aux. 1Saída aux. 1Entrada aux. 2Saída aux. 2Entrada aux.Saída aux.Erro de reprodução de áudio.GraveAumento de gravesConector pretoConector preto do painel frontalConector azulConector azul do painel frontalAlto-falante internoCDO dispositivo "%s" não pôde ser identificado.Não é possível operar sem um temporizadorCentralCentral/LFEAinda não há suporte a mudança de resolução enquanto está executando.Não foi possível conectar ao servidorNão possível adicionar buffers à fila no dispositivo "%s".Não foi possível estabelecer uma conexão com servidor.Não foi possível estabelecer uma conexão com servidor de somNão foi possível obter os parâmetros no dispositivo "%s"Não foi possível mapear buffers do dispositivo "%s"Não foi possível abrir o dispositivo de áudio para manipulação do controlador do mixer.Não foi possível abrir o dispositivo de áudio para manipulação do controlador do mixer. Não há suporte a este elemento com esta versão do Sistema Aberto de Som (OSS).Não foi possível abrir o dispositivo de áudio para reprodução.Não foi possível abrir o dispositivo de áudio para reprodução. O dispositivo está sendo usado por outro aplicativo.Não foi possível abrir o dispositivo de áudio para reprodução. Não há suporte a este elemento nesta versão do Sistema Aberto de Som (OSS).Não foi possível abrir o dispositivo de áudio para reprodução. Você não tem permissão para abrir o dispositivo.Não foi possível abrir o dispositivo de áudio para gravação.Não foi possível abrir o dispositivo de áudio para gravação. Você não tem permissão para abrir o dispositivo.Não foi possível abrir o dispositivo "%s" para leitura e gravação.Não foi possível resolver o nome do servidor.O dispositivo "%s" não é um dispositivo de captura.O dispositivo "%s" não é um dispositivo de saída.DiagnósticoEntrada digitalSaída digitalDigital 1Digital 2Digital 3Mesclar canaisErro ao obter recursos do dispositivo "%s": Ele não é um driver v4l2. Verifique se ele é um driver v4l1.Erro ao ler %d bytes do dispositivo "%s".Erro ao ler %d bytes no dispositivo "%s".Erro ao gravar do dispositivo de áudio.Falha após %d tentativas. Dispositivo %s. Erro do sistema: %sFalha ao obter atributos de controle no dispositivo "%s".Falha ao decodificar a imagem JPEGFalha ao obter a entrada atual no dispositivo "%s". Talvez seja um dispositivo de rádioFalha ao obter a saída atual no dispositivo "%s". Talvez seja um dispositivo de rádioFalha ao obter a freqüência do sintonizador para o dispositivo "%s".Falha ao obter configurações do sintonizador %d no dispositivo "%s".Falha ao obter a força do sinal para o dispositivo "%s".Falha ao obter o valor para o controle %d no dispositivo "%s".Falha ao examinar os atributos da entrada %d no dispositivo %sFalha ao examinar as normas no dispositivo "%s".Falha ao examinar os recursos do servidor de somFalha ao definir a freqüência do sintonizador para o dispositivo "%s" à %lu Hz.Falha ao definir a entrada %d no dispositivo %s.Falha ao definir as normas para o dispositivo "%s".Falha ao definir a saída %d no dispositivo %s.Falha ao definir o valor %d para o controle %d no dispositivo "%s".Falha ao tentar obter os quadros de vídeo do dispositivo "%s".RápidoFrontalFones de ouvido do painel frontalEntrada de linha do painel frontalSaída de linha do painel frontalMicrofone do painel frontalGanhoFoi obtido um tamanho de quadro inesperado de %u, ao invés de %u.Conector cinzaConector cinza do painel frontalConector verdeConector verde do painel frontalHDMIMonofoneFone de ouvidoFones de ouvidoAltaGanho de entradaEntradaMixagem de entradaCD internoErro interno no fluxo de dados.Erro interno no fluxo de dados.Tamanho de Atom inválido.JackBip do tecladoLFEEntrada de linhaSaída de linhaLinha 1Linha 2Linha 3Entrada de linhaLoopbackBaixaPrincipalMédiaMicrofoneMicrofone 1Microfone 2Aumento do microfoneGanho do microfoneOrigem do microfoneMixerModemMonitoradorOrigem de monitoraçãoMixagem monoMudoNenhum URL definido.Entrada de áudio nula ou inválida, o fluxo AVI pode estar corrompido.Nenhum fluxo com suporte foi localizado. Talvez haja necessidade de que mais protocolos de transporte sejam permitidos ou senão o plug-in de extensão GStreamer RTSP pode estar incorreto.Nenhum fluxo com suporte foi localizado. Você pode precisar instalar um plug-in de extensão GStreamer RTSP para fluxos Real media.NenhumDesligadoLigadoConector laranjaConector laranja do painel frontalOutroGanho de saídaGanho de saídaPCMPCM-2Entrada de foneSaída de foneConector rosaConector rosa do painel frontalPortas de reproduçãoNão há suporte a reprodução por este dispositivo de áudio.ProduçãoRádioTraseiraGravaçãoGanho de gravaçãoOrigem de gravaçãoNão há suporte a gravação por este dispositivo de áudio.Conector vermelhoConector vermelho do painel frontalEntrada SPDIFSaída SPDIFConfiguração de conexão segura falhou.Nâo há suporte a busca pelo servidor.O servidor enviou dados ruins.LateralSimular estéreoAlto-falanteOrigem do alto-falanteSaída comumEstéreoMixagem estéreoSurroundSom surroundSintetizadorTelefoneO driver do dispositivo "%s" não tem suporte a nenhum método conhecido de captura.O vídeo neste arquivo pode não ser reproduzido corretamente.Este arquivo não contêm fluxos reproduzíveis.Este arquivo contêm muitos fluxos. Apenas reproduzindo o primeiro %dEste arquivo está corrompido e não pôde ser reproduzido.Este arquivo está incompleto e não pôde ser reproduzido.Este arquivo é inválido e não pôde ser reproduzido."%s" não é um dispositivo.AgudoMuito altaMuito baixaVídeoEntrada de vídeoA entrada do dispositivo de vídeo não aceita definir uma nova taxa de quadros.Canais do mixer virtualEntrada do mixer virtualSaída do mixer virtualVolumeConector brancoConector branco do painel frontalConector amareloConector amarelo do painel frontalgst-plugins-good-0.10.31/po/zh_TW.po0000644000175000017500000002706411720565342014026 00000000000000# Chinese (traditional) translation of gst-plugins-good-0.10.2. # This file is put in the public domain. # Abel Cheung , 2006. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.2 0.10.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2006-08-29 01:08+0800\n" "Last-Translator: Abel Cheung \n" "Language-Team: Chinese (traditional) \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "內部資料串流發生錯誤。" msgid "Failed to decode JPEG image" msgstr "" msgid "Could not connect to server" msgstr "" msgid "Server does not support seeking." msgstr "" msgid "Could not resolve server name." msgstr "" msgid "Could not establish connection to server." msgstr "" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "沒有任何輸入的音效資料或者資料無效,表示 AVI 串流出現錯誤。" msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" #, fuzzy msgid "Internal data flow error." msgstr "內部資料串流發生錯誤。" msgid "Volume" msgstr "" msgid "Bass" msgstr "" msgid "Treble" msgstr "" msgid "Synth" msgstr "" msgid "PCM" msgstr "" msgid "Speaker" msgstr "" msgid "Line-in" msgstr "" msgid "Microphone" msgstr "" msgid "CD" msgstr "" msgid "Mixer" msgstr "" msgid "PCM-2" msgstr "" msgid "Record" msgstr "" msgid "In-gain" msgstr "" msgid "Out-gain" msgstr "" msgid "Line-1" msgstr "" msgid "Line-2" msgstr "" msgid "Line-3" msgstr "" msgid "Digital-1" msgstr "" msgid "Digital-2" msgstr "" msgid "Digital-3" msgstr "" msgid "Phone-in" msgstr "" msgid "Phone-out" msgstr "" msgid "Video" msgstr "" msgid "Radio" msgstr "" msgid "Monitor" msgstr "" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for playback." msgstr "" msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for recording." msgstr "" msgid "Could not open audio device for mixer control handling." msgstr "无法打开音频文件进行混音控制操作。" msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "无法打开音频设备进行音量控制操作。此部件不支持开放声音系统(OSS)的版本。" msgid "Master" msgstr "主声道" msgid "Front" msgstr "前置声道" msgid "Rear" msgstr "后置声道" msgid "Headphones" msgstr "头戴式耳机" msgid "Center" msgstr "中置" msgid "LFE" msgstr "低音炮" msgid "Surround" msgstr "立体声环绕" msgid "Side" msgstr "左右声道" msgid "Built-in Speaker" msgstr "" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "AUX 输出" msgid "3D Depth" msgstr "3D Depth" msgid "3D Center" msgstr "3D Center" msgid "3D Enhance" msgstr "3D Enhance" msgid "Telephone" msgstr "话筒" msgid "Line Out" msgstr "" msgid "Line In" msgstr "线路输入" msgid "Internal CD" msgstr "内部 CD 音频" msgid "Video In" msgstr "视频输入" msgid "AUX 1 In" msgstr "AUX 1 输入" msgid "AUX 2 In" msgstr "AUX 2 输入" msgid "AUX In" msgstr "AUX 输入" msgid "Record Gain" msgstr "录音增益" msgid "Output Gain" msgstr "输出增益" msgid "Microphone Boost" msgstr "麦克风增益" msgid "Loopback" msgstr "Loopback" #, fuzzy msgid "Diagnostic" msgstr "采样分析" msgid "Bass Boost" msgstr "Bass 增益" msgid "Playback Ports" msgstr "回放端口" msgid "Input" msgstr "输入" msgid "Record Source" msgstr "录音来源" msgid "Monitor Source" msgstr "监视器来源" msgid "Keyboard Beep" msgstr "按键声音" msgid "Simulate Stereo" msgstr "模拟立体声" msgid "Stereo" msgstr "立体声" msgid "Surround Sound" msgstr "立体声环绕" msgid "Microphone Gain" msgstr "麦克风增益" msgid "Speaker Source" msgstr "扬声器音源" msgid "Microphone Source" msgstr "麦克风音源" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "中置/低音炮" msgid "Stereo Mix" msgstr "立体声" msgid "Mono Mix" msgstr "单声道" msgid "Input Mix" msgstr "混音输入" msgid "SPDIF In" msgstr "SPDIF 输入" msgid "SPDIF Out" msgstr "" msgid "Microphone 1" msgstr "麦克风 1" msgid "Microphone 2" msgstr "麦克风 2" msgid "Digital Out" msgstr "数字输出" msgid "Digital In" msgstr "数字输入" msgid "HDMI" msgstr "HDMI(高清)" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "手持设备" msgid "Other" msgstr "其它设备" msgid "None" msgstr "无" msgid "On" msgstr "开" msgid "Off" msgstr "关" msgid "Mute" msgstr "静音" msgid "Fast" msgstr "快" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "很慢" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "慢" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "中等" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "高" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "很高" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "生产商" msgid "Front Panel Microphone" msgstr "麦克风面板" msgid "Front Panel Line In" msgstr "线路输入面板" msgid "Front Panel Headphones" msgstr "头戴式耳机面板" msgid "Front Panel Line Out" msgstr "线路输出面板" #, fuzzy msgid "Green Connector" msgstr "线路输出" #, fuzzy msgid "Pink Connector" msgstr "话筒输出" #, fuzzy msgid "Blue Connector" msgstr "立体声输入" #, fuzzy msgid "White Connector" msgstr "左/单声道" #, fuzzy msgid "Black Connector" msgstr "后置声道输出" #, fuzzy msgid "Gray Connector" msgstr "中置声道输出" #, fuzzy msgid "Orange Connector" msgstr "低音炮输出" #, fuzzy msgid "Red Connector" msgstr "右声道" #, fuzzy msgid "Yellow Connector" msgstr "Midi 输出/游戏摇杆" #, fuzzy msgid "Green Front Panel Connector" msgstr "线路输出面板" #, fuzzy msgid "Pink Front Panel Connector" msgstr "话筒输出面板" #, fuzzy msgid "Blue Front Panel Connector" msgstr "立体声输入面板" #, fuzzy msgid "White Front Panel Connector" msgstr "左/单声道面板" #, fuzzy msgid "Black Front Panel Connector" msgstr "后置声道输出面板" #, fuzzy msgid "Gray Front Panel Connector" msgstr "中置声道输出面板" #, fuzzy msgid "Orange Front Panel Connector" msgstr "低音炮输出面板" #, fuzzy msgid "Red Front Panel Connector" msgstr "右声道面板" #, fuzzy msgid "Yellow Front Panel Connector" msgstr "Midi 输出/游戏摇杆面板" msgid "Spread Output" msgstr "Spread 输出" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "模拟混音输入" #, fuzzy msgid "Virtual Mixer Output" msgstr "模拟混音输出" msgid "Virtual Mixer Channels" msgstr "模拟混音输入" #. TRANSLATORS: name + number of a volume mixer control #, fuzzy, c-format msgid "%s %d Function" msgstr "%s 功能" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s 功能" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "无法打开音频设备播放音频。此组件不支持开放声音系统(OSS)版本。" msgid "Playback is not supported by this audio device." msgstr "此音频设备不支持音频播放。" msgid "Audio playback error." msgstr "音频播放错误。" msgid "Recording is not supported by this audio device." msgstr "此音频设备不支持录音。" msgid "Error recording from audio device." msgstr "从音频设备录音时发生错误。" msgid "Gain" msgstr "" msgid "Headphone" msgstr "" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "" #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" #, c-format msgid "Cannot identify device '%s'." msgstr "" #, c-format msgid "This isn't a device '%s'." msgstr "" #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "" #, c-format msgid "Device '%s' is not a capture device." msgstr "" #, c-format msgid "Device '%s' is not a output device." msgstr "" #, c-format msgid "Failed to set norm for device '%s'." msgstr "" #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set input %d on device %s." msgstr "" #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set output %d on device %s." msgstr "" #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "" #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, c-format msgid "Could not get parameters on device '%s'" msgstr "" msgid "Video input device did not accept new frame rate setting." msgstr "" #, c-format msgid "Could not map buffers from device '%s'" msgstr "" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "" gst-plugins-good-0.10.31/po/Makevars0000644000175000017500000000371611671175354014132 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(GETTEXT_PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = http://bugzilla.gnome.org/ # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = # Avoid line numbers in *.po, but keep them in *.pot. MSGMERGE = msgmerge --no-location MSGMERGE_UPDATE = msgmerge --no-location --update --backup=off MSGFILTER = msgfilter --no-location gst-plugins-good-0.10.31/po/nb.po0000644000175000017500000002641611720565342013372 00000000000000# Norwegian bokmaal translation of gst-utils. # This file is put in the public domain. # Kjartan Maraas , 2004-2010. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.25.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-10-24 21:53+0200\n" "Last-Translator: Kjartan Maraas \n" "Language-Team: Norwegian Bokmaal \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Kunne ikke etablere tilkobling til lydtjener" msgid "Failed to query sound server capabilities" msgstr "" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» av «%s»" msgid "Internal data stream error." msgstr "Intern feil i datastrøm." msgid "Failed to decode JPEG image" msgstr "Klarte ikke å dekode JPEG-bilde" msgid "Could not connect to server" msgstr "Kunne ikke koble til tjener." msgid "Server does not support seeking." msgstr "Tjener støtter ikke søking." msgid "Could not resolve server name." msgstr "Kunne ikke slå opp navn på tjener." msgid "Could not establish connection to server." msgstr "Kunne ikke etablere tilkobling til tjener." msgid "Secure connection setup failed." msgstr "Oppsett av sikker tilkobling feilet." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "Tjener sendte ugyldige data." msgid "No URL set." msgstr "Ingen URL satt." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" msgid "This file contains no playable streams." msgstr "" msgid "This file is invalid and cannot be played." msgstr "" msgid "This file is corrupt and cannot be played." msgstr "" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "" msgid "The video in this file might not play correctly." msgstr "" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "" msgid "Volume" msgstr "Volum" msgid "Bass" msgstr "Bass" msgid "Treble" msgstr "Diskant" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Høyttaler" msgid "Line-in" msgstr "Linje inn" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mikser" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Opptak" msgid "In-gain" msgstr "" msgid "Out-gain" msgstr "" msgid "Line-1" msgstr "Linje 1" msgid "Line-2" msgstr "Linje 2" msgid "Line-3" msgstr "Linje 3" msgid "Digital-1" msgstr "Digital 1" msgid "Digital-2" msgstr "Digital 2" msgid "Digital-3" msgstr "Digital 3" msgid "Phone-in" msgstr "Telefon inn" msgid "Phone-out" msgstr "Telefon ut" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for playback." msgstr "Kunne ikke åpne lydenhet for avspilling." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" msgid "Could not open audio device for recording." msgstr "Kunne ikke åpne lydenhet for opptak." #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "Kunne ikke åpne filen «%s» for lesing." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" msgid "Master" msgstr "Hovedvolum" msgid "Front" msgstr "Front" msgid "Rear" msgstr "Bak" msgid "Headphones" msgstr "Hodetelefoner" msgid "Center" msgstr "Senter" msgid "LFE" msgstr "" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Side" msgid "Built-in Speaker" msgstr "Innebygget høyttaler" msgid "AUX 1 Out" msgstr "AUX 1 ut" msgid "AUX 2 Out" msgstr "AUX 2 ut" msgid "AUX Out" msgstr "AUX ut" msgid "3D Depth" msgstr "3D dybde" msgid "3D Center" msgstr "3D senter" msgid "3D Enhance" msgstr "" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Linje ut" msgid "Line In" msgstr "Linje inn" msgid "Internal CD" msgstr "Intern CD" msgid "Video In" msgstr "Video inn" msgid "AUX 1 In" msgstr "AUX 1 inn" msgid "AUX 2 In" msgstr "AUX 2 inn" msgid "AUX In" msgstr "AUX inn" msgid "Record Gain" msgstr "" msgid "Output Gain" msgstr "" msgid "Microphone Boost" msgstr "" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" msgid "Record Source" msgstr "" msgid "Monitor Source" msgstr "" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "" msgid "Microphone Gain" msgstr "" msgid "Speaker Source" msgstr "" msgid "Microphone Source" msgstr "" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digital ut" msgid "Digital In" msgstr "Digital inn" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Håndsett" msgid "Other" msgstr "Annet" msgid "None" msgstr "Ingen" msgid "On" msgstr "På" msgid "Off" msgstr "Av" msgid "Mute" msgstr "Demp" msgid "Fast" msgstr "Rask" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Meget lav" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Lav" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Middels" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Høy" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Meget høy" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produksjon" msgid "Front Panel Microphone" msgstr "" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" msgid "Error recording from audio device." msgstr "" msgid "Gain" msgstr "" msgid "Headphone" msgstr "Hodetelefon" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Kunne ikke lukke VFS-fil «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Kunne ikke lukke VFS-fil «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" #, fuzzy, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Kunne ikke lukke VFS-fil «%s»." #, c-format msgid "Failed to query norm on device '%s'." msgstr "" #, fuzzy, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Kunne ikke lukke VFS-fil «%s»." #, c-format msgid "Cannot identify device '%s'." msgstr "Kan ikke identifisere enhet «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "Dette er ikke en enhet «%s»." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Kunne ikke åpne enhet «%s» for lesing og skriving." #, c-format msgid "Device '%s' is not a capture device." msgstr "Enhet «%s» kan ikke fange data." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "Enhet «%s» kan ikke fange data." #, c-format msgid "Failed to set norm for device '%s'." msgstr "" #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "" #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" #, c-format msgid "Failed to set input %d on device %s." msgstr "" #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Kunne ikke lukke VFS-fil «%s»." #, fuzzy, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Kunne ikke lukke VFS-fil «%s»." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "" #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "" #, fuzzy, c-format msgid "Could not get parameters on device '%s'" msgstr "Kunne ikke lukke VFS-fil «%s»." msgid "Video input device did not accept new frame rate setting." msgstr "" #, fuzzy, c-format msgid "Could not map buffers from device '%s'" msgstr "Kunne ikke lukke VFS-fil «%s»." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" msgid "Changing resolution at runtime is not yet supported." msgstr "" msgid "Cannot operate without a clock" msgstr "Kan ikke operere uten en klokke" #~ msgid "Describes the selected input element." #~ msgstr "Beskriver valgt inndataelement." gst-plugins-good-0.10.31/po/zh_HK.gmo0000644000175000017500000001114011720565343014127 00000000000000Ok     % ,79qq c nz"    $ * 4 @ \ a o s {           6 = B F I O [ /j  0     " 0 7 B K Z d n w    < F P Y d q ~    3 hYk  '  6I\ l y !     ! ( 4@P`pv V   '! I S ` m!z     & -:MK7 / 8:! .>=6AI#,GOL&;B"<4DJ(9*N +2'EC1$ M3)5-?@0 %FH%s Function3D Center3D Depth3D EnhanceAUX 1 InAUX 2 InAUX InAUX OutAudio playback error.Bass BoostCenterCenter / LFECould not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Digital InDigital OutDownmixError recording from audio device.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneHDMIHandsetHeadphonesHighInputInput MixInternal CDInternal data stream error.JackKeyboard BeepLFELine InLoopbackLowMasterMediumMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceModemMonitor SourceMono MixMuteNo or invalid input audio, AVI stream will be corrupt.NoneOffOnOtherOutput GainPlayback PortsPlayback is not supported by this audio device.ProductionRearRecord GainRecord SourceRecording is not supported by this audio device.SPDIF InSideSimulate StereoSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundTelephoneVery HighVery LowVideo InVirtual Mixer ChannelsVirtual Mixer InputProject-Id-Version: gst-plugins-good-0.10.2 0.10.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2006-08-29 01:08+0800 Last-Translator: Abel Cheung Language-Team: Chinese (Hong Kong) Language: zh_HK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s 功能3D Center3D Depth3D EnhanceAUX 1 输入AUX 2 输入AUX 输入AUX 输出音频播放错误。Bass 增益中置中置/低音炮无法打开音频文件进行混音控制操作。无法打开音频设备进行音量控制操作。此部件不支持开放声音系统(OSS)的版本。无法打开音频设备播放音频。此组件不支持开放声音系统(OSS)版本。数字输入数字输出Downmix从音频设备录音时发生错误。快前置声道头戴式耳机面板线路输入面板线路输出面板麦克风面板HDMI(高清)手持设备头戴式耳机高输入混音输入内部 CD 音频內部資料串流發生錯誤。Jack按键声音低音炮线路输入Loopback慢主声道中等麦克风 1麦克风 2麦克风增益麦克风增益麦克风音源Modem监视器来源单声道静音沒有任何輸入的音效資料或者資料無效,表示 AVI 串流出現錯誤。无关开其它设备输出增益回放端口此音频设备不支持音频播放。生产商后置声道录音增益录音来源此音频设备不支持录音。SPDIF 输入左右声道模拟立体声扬声器音源Spread 输出立体声立体声立体声环绕立体声环绕话筒很高很慢视频输入模拟混音输入模拟混音输入gst-plugins-good-0.10.31/po/de.po0000644000175000017500000005621211720565341013357 00000000000000# German translations for gst-plugins-bad # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # # PCM = PCM # Line-in = Line-Eingang # Line-out = Line-Ausgang # Pipeline = Weiterleitung # Stream = Strom # mixer = # Christian Kirbach , 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-21 22:36+0100\n" "Last-Translator: Christian Kirbach \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "Es konnte keine Verbindung zum Audio-Server hergestellt werden" msgid "Failed to query sound server capabilities" msgstr "Abfrage der Fähigkeiten des Audio-Servers ist fehlgeschlagen" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "»%s« durch »%s«" msgid "Internal data stream error." msgstr "Interner Datenstromfehler." msgid "Failed to decode JPEG image" msgstr "Dekodieren des JPEG-Bildes schlug fehl" msgid "Could not connect to server" msgstr "Verbindung zum Server konnte nicht hergestellt werden" msgid "Server does not support seeking." msgstr "Suchlauf wird nicht vom Server unterstützt." msgid "Could not resolve server name." msgstr "Servername konnte nicht aufgelöst werden." msgid "Could not establish connection to server." msgstr "Es konnte keine Verbindung zum Server hergestellt werden." msgid "Secure connection setup failed." msgstr "Aufbau einer sichern Verbindung ist gescheitert." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Ein Netzwerkfehler ist aufgetreten, oder der Server schloss die Verbindung " "unerwartet." msgid "Server sent bad data." msgstr "Server gab unerwartete Daten zurück." msgid "No URL set." msgstr "Keine Adresse festgelegt." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Kein oder ungültiger Eingabeton, der AVI-Strom wird fehlerhaft sein." msgid "This file contains no playable streams." msgstr "Diese Datei enthält keine abspielbaren Ströme." msgid "This file is invalid and cannot be played." msgstr "Diese Datei ist ungültig und kann nicht wiedergegeben werden." msgid "This file is corrupt and cannot be played." msgstr "Diese Datei ist beschädigt und kann nicht wiedergegeben werden." msgid "Invalid atom size." msgstr "Ungültige Atom-Größe." msgid "This file is incomplete and cannot be played." msgstr "Diese Datei ist unvollständig und kann nicht wiedergegeben werden." msgid "The video in this file might not play correctly." msgstr "Das Video in dieser Datei wird vielleicht nicht korrekt wiedergegeben." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Diese Datei enthält zu viele Ströme. Es werden nur die ersten %d " "wiedergegeben" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Es wurde kein unterstützter Strom gefunden. Sie müssen vielleicht ein Plugin " "zur RTSP-Erweiterung von GStreamer für »Real«-Medienströme installieren." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Es wurde kein unterstützter Strom gefunden. Sie müssen eventuell zusätzliche " "Transport-Protokolle erlauben oder es fehlt vielleicht das richtige Plugin " "zur RTSP-Erweiterung." msgid "Internal data flow error." msgstr "Interner Datenstromfehler." msgid "Volume" msgstr "Lautstärke" msgid "Bass" msgstr "Bass" msgid "Treble" msgstr "Höhen" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Lautsprecher" msgid "Line-in" msgstr "Line-Eingang" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mischer" msgid "PCM-2" msgstr "PCM 2" msgid "Record" msgstr "Aufnahme" msgid "In-gain" msgstr "Eingangspegel" msgid "Out-gain" msgstr "Ausgangspegel" msgid "Line-1" msgstr "Eingang-1" msgid "Line-2" msgstr "Eingang-2" msgid "Line-3" msgstr "Eingang-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" # Mikrofon? Zweifelhaft. Eher Kopfhörer oder Telefon. msgid "Phone-in" msgstr "Mikrofoneingang" # Ist hier Kopfhörer oder Telefon gemeint? msgid "Phone-out" msgstr "Mikrofonausgang" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Das Gerät wird " "von einer anderen Anwendung verwendet." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Sie haben nicht " "die Berechtigungen zum Öffnen des Gerätes." msgid "Could not open audio device for playback." msgstr "Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. " msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Das Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. Sie haben nicht " "die Berechtigungen zum Öffnen des Gerätes." msgid "Could not open audio device for recording." msgstr "Das Audio-Gerät konnte nicht zur Aufnahme geöffnet werden. " msgid "Could not open audio device for mixer control handling." msgstr "Das Audio-Gerät konnte nicht für das Mischpult geöffnet werden." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Das Audio-Gerät konnte nicht für das Mischpult geöffnet werden. Diese " "Version des Open Sound System (OSS) wird nicht unterstützt." msgid "Master" msgstr "Hauptregler" msgid "Front" msgstr "Front" msgid "Rear" msgstr "AufnahmeRückseite" msgid "Headphones" msgstr "Kopfhörer" msgid "Center" msgstr "Mitte" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Seite" msgid "Built-in Speaker" msgstr "Eingebaute Lautsprecher" msgid "AUX 1 Out" msgstr "AUX-Ausgang 1" msgid "AUX 2 Out" msgstr "AUX-Ausgang 2" msgid "AUX Out" msgstr "AUX-Ausgang" msgid "3D Depth" msgstr "3D-Tiefe" msgid "3D Center" msgstr "3D-Mitte" msgid "3D Enhance" msgstr "Erweitertes 3D" msgid "Telephone" msgstr "Telefon" # Hier ist mir noch nichts Besseres eingefallen. msgid "Line Out" msgstr "Line-Ausgang" msgid "Line In" msgstr "Line-Eingang" msgid "Internal CD" msgstr "Interne CD" msgid "Video In" msgstr "Video-Eingang" msgid "AUX 1 In" msgstr "AUX-Eingang 1" msgid "AUX 2 In" msgstr "AUX-Eingang 2" msgid "AUX In" msgstr "AUX-Eingang" msgid "Record Gain" msgstr "Aufnahmepegel" msgid "Output Gain" msgstr "Ausgangspegel" msgid "Microphone Boost" msgstr "Mikrofonverstärkung" msgid "Loopback" msgstr "Schleife" msgid "Diagnostic" msgstr "Zur Diagnose" msgid "Bass Boost" msgstr "Bassverstärkung" msgid "Playback Ports" msgstr "Wiedergabe-Ports" msgid "Input" msgstr "Eingang" msgid "Record Source" msgstr "Aufnahmequelle" msgid "Monitor Source" msgstr "Überwachungsquelle" msgid "Keyboard Beep" msgstr "Tastatur-Piepsen" msgid "Simulate Stereo" msgstr "Stereo simulieren" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Surround-Audio" msgid "Microphone Gain" msgstr "Mikrofonpegel" msgid "Speaker Source" msgstr "Lautsprecherquelle" msgid "Microphone Source" msgstr "Mikrofonquelle" msgid "Jack" msgstr "Stecker" msgid "Center / LFE" msgstr "Mitte / LFE" msgid "Stereo Mix" msgstr "Stereo-Mischpult" msgid "Mono Mix" msgstr "Mono-Mischpult" msgid "Input Mix" msgstr "Eingangs-Mischpult" msgid "SPDIF In" msgstr "SPDIF-Eingang" msgid "SPDIF Out" msgstr "SPDIF-Ausgang" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digital-Ausgang" msgid "Digital In" msgstr "Digital-Eingang" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Hörer" msgid "Other" msgstr "Anderes" msgid "None" msgstr "Kein" msgid "On" msgstr "Aktiviert" msgid "Off" msgstr "Deaktiviert" msgid "Mute" msgstr "Stumm" msgid "Fast" msgstr "Schnell" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Sehr niedrig" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Niedrig" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medium" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Hoch" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Sehr hoch" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produktion" msgid "Front Panel Microphone" msgstr "Mikrofon am Vordereingang" msgid "Front Panel Line In" msgstr "Line-Eingang am Vordereingang" msgid "Front Panel Headphones" msgstr "Kopfhörer am Vordereingang" msgid "Front Panel Line Out" msgstr "Line-Ausgang am Vordereingang" msgid "Green Connector" msgstr "Grüner Stecker" msgid "Pink Connector" msgstr "Rosa Stecker" msgid "Blue Connector" msgstr "Blauer Stecker" msgid "White Connector" msgstr "Weißer Stecker" msgid "Black Connector" msgstr "Schwarzer Stecker" msgid "Gray Connector" msgstr "Grauer Stecker" msgid "Orange Connector" msgstr "Oranger Stecker" msgid "Red Connector" msgstr "Roter Stecker" msgid "Yellow Connector" msgstr "Gelber Stecker" msgid "Green Front Panel Connector" msgstr "Grüner Stecker am Vordereingang" msgid "Pink Front Panel Connector" msgstr "Rosa Stecker am Vordereingang" msgid "Blue Front Panel Connector" msgstr "Blauer Stecker am Vordereingang" msgid "White Front Panel Connector" msgstr "Weißer Stecker am Vordereingang" msgid "Black Front Panel Connector" msgstr "Schwarzer Stecker am Vordereingang" msgid "Gray Front Panel Connector" msgstr "Grauer Stecker am Vordereingang" msgid "Orange Front Panel Connector" msgstr "Oranger Stecker am Vordereingang" msgid "Red Front Panel Connector" msgstr "Roter Stecker am Vordereingang" msgid "Yellow Front Panel Connector" msgstr "Gelber Stecker am Vordereingang" msgid "Spread Output" msgstr "Ausgabe verstreuen" msgid "Downmix" msgstr "Heruntermischen" msgid "Virtual Mixer Input" msgstr "Eingang des virtuellen Mischpults" msgid "Virtual Mixer Output" msgstr "Ausgang des virtuellen Mischpults" msgid "Virtual Mixer Channels" msgstr "Kanäle des virtuellen Mischpults" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d Function" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s-Funktion" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Das Audio-Gerät konnte nicht zur Wiedergabe geöffnet werden. Diese Version " "des Open Sound System (OSS) wird nicht von diesem Element unterstützt." msgid "Playback is not supported by this audio device." msgstr "Wiedergabe wird von diesem Audio-Gerät nicht unterstützt." msgid "Audio playback error." msgstr "Fehler bei Audio-Wiedergabe." msgid "Recording is not supported by this audio device." msgstr "Aufnahme wird von diesem Audio-Gerät nicht unterstützt." msgid "Error recording from audio device." msgstr "Fehler beim Aufnehmen vom Audio-Gerät." msgid "Gain" msgstr "Pegel" msgid "Headphone" msgstr "Kopfhörer" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Fehler beim Lesen von %d Bytes von Gerät »%s«." # »Frame« sollten wir im Zusammenhang mit Videos vielleicht besser so belassen. Habe ich in gnome-subtitles auch so gemacht. #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Unerwartete Frame-Größe von %u anstatt %u wurde erhalten." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Fehler beim Lesen von %d Bytes auf Gerät »%s«." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Fehler beim Bestimmen der Fähigkeiten des Gerätes »%s«: Es ist kein »v4l2«-" "Treiber. Überprüfen Sie, ob es ein »v4l1«-Treiber ist." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Abfrage der Attribute der Eingabe »%d« im Gerät »%s« schlug fehl" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Auslesen der Einstellungen der Senderwahl »%d« auf Gerät »%s« schlug fehl." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Abfragen der Norm auf Gerät »%s« schlug fehl." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Abfrage der Kontrollattribute auf Gerät »%s« schlug fehl." #, c-format msgid "Cannot identify device '%s'." msgstr "Gerät »%s« kann nicht identifiziert werden." #, c-format msgid "This isn't a device '%s'." msgstr "»%s« ist kein Gerät." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Gerät »%s« konnte nicht zum Lesen oder Schreiben geöffnet werden." #, c-format msgid "Device '%s' is not a capture device." msgstr "»%s« ist kein Aufnahmegerät." #, c-format msgid "Device '%s' is not a output device." msgstr "»%s« ist kein Wiedergabegerät." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Festlegen der Norm auf Gerät »%s« schlug fehl." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Auslesen der aktuellen Sendefrequenz des Geräts »%s« schlug fehl." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Festlegen der aktuellen Sendefrequenz des Geräts »%s« auf %lu Hz schlug fehl." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Auslesen der aktuellen Signalstärke des Geräts »%s« schlug fehl." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Auslesen des Wertes der Einstellung »%d« des Geräts »%s« schlug fehl." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Festlegen des Wertes »%d« der Einstellung »%d« des Geräts »%s« schlug fehl." # Sendegerät sicherlich nicht, eben eher ein Radio. Warum diese Fehlermeldung beie einem Radiogerät kommen könnte, weiß ich allerdings auch nicht. #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Auslesen der aktuellen Eingabe auf dem Gerät »%s« schlug fehl. Vielleicht " "ist es ein Funkgerät." #, c-format msgid "Failed to set input %d on device %s." msgstr "Festlegen der Eingabe »%d« des Geräts »%s« schlug fehl." # Sendegerät sicherlich nicht, eben eher ein Radio. Warum diese Fehlermeldung beie einem Radiogerät kommen könnte, weiß ich allerdings auch nicht. #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Auslesen der aktuellen Ausgabe des Geräts »%s« schlug fehl. Vielleicht ist " "es ein Funkgerät." #, c-format msgid "Failed to set output %d on device %s." msgstr "Festlegen der Ausgabe »%d« des Geräts »%s« schlug fehl." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Auf Gerät »%s« konnten keine Puffer eingereiht werden." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Der Versuch Videobilder von Gerät »%s« auszulesen schlug fehl." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "%d Versuche sind fehlgeschlagen. Gerät »%s«. Systemfehler: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Parameter konnten nicht von Gerät »%s« ausgelesen werden" msgid "Video input device did not accept new frame rate setting." msgstr "" "Vom Video-Eingabegerät wurde die Einstellung zur Bildwiederholungsrate nicht " "akzeptiert." # »Geholt« ist auch noch nicht optimal, aber »abgebildet« geht auch nicht wirklich. #, c-format msgid "Could not map buffers from device '%s'" msgstr "Die Puffer des Gerätes »%s« konnten nicht geholt werden." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Der Treiber von Gerät »%s« unterstützt keine der bekannten Aufnahmemethoden." msgid "Changing resolution at runtime is not yet supported." msgstr "Ein Wechsel der Auflösung zur Laufzeit wird noch nicht unterstützt." # Taktgeber klingt gut. msgid "Cannot operate without a clock" msgstr "Es kann nicht ohne einen Taktgeber gearbeitet werden." #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Aufzählen möglicher Videoformate, mit denen Gerät »%s« arbeiten kann, " #~ "schlug fehl" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Der Puffertyp wird nicht unterstützt, der Index ist außerhalb seiner " #~ "Grenzwerte, es sind bisher noch keine Puffer angefordert worden oder " #~ "»userptr« oder die Länge sind ungültig. Gerät »%s«" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Der Versuch Videobilder von Gerät »%s« auszulesen schlug fehl. Nicht " #~ "genug Arbeitsspeicher." # Was ist ein Zeigerpuffer? #, fuzzy #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "Ungenügend Arbeitsspeicher, um einen Zeigerpuffer eines Benutzers " #~ "einzureihen. Gerät »%s«." #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "Es wurden keine freien Puffer im Vorrat bei Index %d gefunden." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Das Gerät »%s« kann nicht bei %dx%d aufnehmen" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Das angegebene Format kann nicht vom Gerät »%s« ausgelesen werden" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Die Puffer konnten nicht von Gerät »%s« ausgelesen werden." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "Es konnten nicht genug Puffer von Gerät »%s« ausgelesen werden." # »Stromaufnahme« klingt nach Energieverbrauch. #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Fehler beim Start der Aufzeichnung des Stroms von Gerät »%s«." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Fehler beim Stoppen der Aufzeichnung des Stroms von Gerät »%s«." #~ msgid "Describes the selected input element." #~ msgstr "Beschreibt das ausgewählte Eingabeelement." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "" #~ "Beschreibt das ausgewählte Ausgabeelement für Audio/Video-Konferenzen." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Beschreibt das ausgewählte Ausgabeelement für Musik und Videos." #~ msgid "Describes the selected output element." #~ msgstr "Beschreibt das ausgewählte Ausgabeelement." # »sink« hatte ich z.B. in Conduit auch mit Ziel übersetzt. #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "Gstreamer-Audioziel für Audio/Video-Konferenzen." #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "Gstreamer-Audioziel für Musik und Videos" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer kann Klänge mittels einer beliebigen Anzahl von " #~ "Ausgabeelementen wiedergeben. Einige mögliche Werte sind osssink, esdsink " #~ "und alsasink. Das Audioziel kann eine teilweise Weiterleitung anstelle " #~ "eines Elementes sein." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer kann Videos mittels einer beliebigen Anzahl von " #~ "Ausgabeelementen wiedergeben. Einige mögliche Werte sind xvimagesink, " #~ "ximagesink, sdlvideosink und aasink. Das Videoziel kann eine teilweise " #~ "Weiterleitung anstelle eines Elementes sein." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "GStreamer kann Visualisierungs-Plugins in eine Weiterleitung setzen, um " #~ "Audioströme in Videobilder umzuwandeln. Das Standard-Plugin ist »goom«. " #~ "Weitere Plugins werden demnächst portiert. Das Visualisierungs-Plugin " #~ "kann eine teilweise Weiterleitung anstelle eines Elementes sein." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer kann Klänge mittels einer beliebigen Anzahl von " #~ "Eingabeelementen aufzeichnen. Einige mögliche Werte sind osssrc, esdsrc " #~ "und alsasrc. Die Audioquelle kann eine teilweise Weiterleitung anstelle " #~ "eines Elementes sein." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer kann Videos mittels einer beliebigen Anzahl von " #~ "Eingabeelementen aufzeichnen. Einige mögliche Werte sind v4lsrc und " #~ "videotestsrc. Die Videoquelle kann eine teilweise Weiterleitung anstelle " #~ "eines Elementes sein." #~ msgid "default GStreamer audio source" #~ msgstr "Vorgegebene GStreamer-Audioquelle" #~ msgid "default GStreamer audiosink" #~ msgstr "Vorgegebenes GStreamer-Audioziel" #~ msgid "default GStreamer video source" #~ msgstr "Vorgegebene GStreamer-Videoquelle" #~ msgid "default GStreamer videosink" #~ msgstr "Vorgegebenes GStreamer-Videoziel" #~ msgid "default GStreamer visualization plugin" #~ msgstr "Vorgegebenes GStreamer-Visualisierungs-Plugin" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "Beschreibung der GStreamer-Audioquelle für Audio/Video-Konferenzen" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "Beschreibung der GStreamer-Audioquelle für Musik und Videos" #~ msgid "description for default GStreamer audiosink" #~ msgstr "Beschreibung des vorgegebenen GStreamer-Audioziels" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "Beschreibung der vorgegebenen GStreamer-Audioquelle" gst-plugins-good-0.10.31/po/uk.gmo0000644000175000017500000004634411720565343013561 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$$%!%#A%)e%%6&E&V&e& v&&1& &&&9 'E'7]'#''I'9(B(Y(vt(;(O')Ow)b)P**P{*x*E+T,r,"--J..em/U/H)0Qr00001$171$J1o1d?2f2O 3a[3x3F64}4 5l5[ 6Yf6x6W97F7[7|48M8L8OL99U: r::?:9:; ;0F;w;W;;7;4<;P<<<<< <<<<=J2=:}=R= >>0>4>N>j>}>>>> >>>> ??'2?'Z?!? ? ??0??@ +@L@ @A B B B%BECKCTC!pCCCCCC;C!$DbFDD D D D!DEVEtE=EEElEJ]F@FFFG%GEG eGrGGGGGyGRHTHq-IMIIIR7J"J JJJ JJK4K0K2K/L@L7XLL9Lv` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-05-01 11:55+0300 Last-Translator: Yuri Chornoivan Language-Team: Ukrainian Language: uk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 1.2 Plural-Forms: nplurals=1; plural=0; %s, функція %dФункція %s«%s» виконує %sПросторовий центрПросторова глибинаПросторове покращенняСталася помилка роботи з мережею або з’єднання було несподівано розірвано з боку сервера.Вхід AUX 1Вихід AUX 1Вхід AUX 2Вихід AUX 2Вхід AUXВихід AUXПомилка відтворення звуку.НизькіПідсилення басівЧорний рознімЧорний рознім передньої панеліСиній рознімСиній рознім передньої панеліВбудований динамікКДНе вдалося ідентифікувати пристрій «%s».Робота без годинника неможливаЦентральнийЦентральний/LFEЗміна роздільної здатності при відтворенні ще не підтримується.Не вдалося з'єднатись з серверомНе вдалося опитати буфери від пристрою «%s».Не вдалося встановити з'єднання з сервером.Не вдалося встановити з'єднання із звуковим сервером.Не вдалося отримати параметри пристрою «%s».Не вдалося пов’язати буфери з пристрою «%s».Не вдалося відкрити пристрій для керування регуляторами мікшера.Не вдалося відкрити пристрій для керування регуляторами мікшера. Ця версія Open Sound System не підтримується цим елементом.Не вдалося відкрити пристрій для відтворення.Не вдалося відкрити пристрій для відтворення. Пристрій використовується сторонньою програмою.Не вдалося відкрити пристрій для відтворення. Ця версія Open Sound System не підтримується цим елементом.Не вдалося відкрити пристрій для відтворення. У вас недостатньо прав для відкриття пристрою.Не вдалося відкрити пристрій для запису.Не вдалося відкрити пристрій для запису. У вас недостатньо прав для відкриття пристрою.Не вдалося відкрити пристрій «%s» для читання та запису.Не вдалося визначити адресу сервера за назвою.Пристрій «%s» не є пристроєм захоплення.Пристрій «%s» не є пристроєм виведення даних.ДіагностикаЦифровий вхідЦифровий вихідЦифровий-1Цифровий-2Цифровий-3Об’єднання каналівПомилка при отриманні можливостей пристрою «%s»: драйвер не є драйвером для v4l2. Перевірте, може це драйвер типу v4l1.Помилка під час спроби читання %d байтів з пристрою «%s».Помилка під час спроби читання %d байтів на пристрої «%s».Помилка записування зі звукового пристрою.Помилка після %d спроб. Пристрій %s. Системна помилка: %sНе вдалося отримати атрибути регуляторів керування пристрою «%s».Помилка при декодуванні зображення JPEGНе вдалося отримати поточний ввід пристрою «%s». Можливо цей пристрій — радіо.Не вдалося отримати поточний вихід пристрою «%s». Можливо цей пристрій — радіо.Не вдалося отримати поточну частоту приймача пристрою «%s».Помилка при встановленні приймача %d пристрою «%s».Помилка при отриманні сили сигналу пристрою «%s».Не вдалося отримати значення від органу керування %d пристрою «%s».Помилка при запиті атрибутів вводу %d пристрою %sПомилка при запиті норми пристрою «%s».Помилка при запиті можливостей звукового сервераНе вдалося встановити поточну частоту приймача пристрою «%s» у %lu Гц.Не вдалося встановити ввід %d пристрою «%s».Не вдалося встановити норму пристрою «%s».Не вдалося встановити вихід %d пристрою «%s».Не вдалося встановити значення %d для органу керування %d пристрою «%s».Не вдалося отримати відеокадри з пристрою «%s».ШвидкоПереднійВихід навушників передньої панеліЛінійний вхід передньої панеліЛінійний вихід передньої панеліМікрофон передньої панеліПідсиленняОтримано неочікуваний розмір блоку %u замість %u.Сірий рознімСірий рознім передньої панеліЗелений рознімЗелений рознім передньої панеліHDMIГарнітураНавушникиНавушникиВисокаВх.підсиленняВхідМікшер вх. данихВбудований КДПомилка внутрішнього перенесення даних.Внутрішня помилка потоку даних.Некоректний розмір елементарного фрагмента.JackГудок клавіатуриLFEЛінійний вхідЛінійний вихідЛінійний-1Лінійний-2Лінійний-3Лінійний вхідЗаглушкаНизькаОсновнийСередняМікрофонМікрофон 1Мікрофон 2Підсилення мікрофонаПідсилення мікрофонаОсновний мікрофонМікшерМодемМоніторСпостереження за джереломМономікшерВимкнути звукНе вказано адресуНе вказано або вказано некоректний вхід звукових даних, AVI-потік буде пошкоджено.Не знайдено підтримуваних потоків. Ймовірно, вам слід увімкнути додаткові протоколи передавання даних або встановити додатковий модуль RTSP GStreamer.Не знайдено підтримуваних потоків. Ймовірно, вам слід встановити модуль RTSP GStreamer для відтворення потоків Real media.НемаєВимкн.Увімкн.Помаранчевий рознімПомаранчевий рознім передньої панеліІншеВих.підсиленняПідсилення виходуКІМКІМ-2Вх.телефонВих.телефонРожевий рознімРожевий рознім передньої панеліПорти відтворенняВідтворення не підтримується цим звуковим пристроєм.ПромисловаРадіоЗаднійЗаписПідсилення записуЗапис джерелаЗапис не підтримується цим звуковим пристроєм.Червоний рознімЧервоний рознім передньої панеліВхід SPDIFВихід SPDIFПомилка під час спроби налаштування безпечного з’єднання.Сервером не підтримується позиціювання.Сервером надіслано помилкові дані.БоковийІмітація стереоДинамікОсновний динамікРозгорнути вихідСтереоСтереомікшерОб'ємнийОб'ємний звукСинтезаторТелефонДрайвер пристрою «%s» не підтримує жоден відомий метод захоплення.Ймовірно, відеодані цього файла не можна буде відтворити належним чином.Файл не містить потоків, які можна відтворити.Файл містить надто багато потоків. Відтворюються лише перші %dФайл пошкоджено, його не можна відтворити.Файл неповний, його не можна відтворити.Файл є некоректним, його не можна відтворити.Це не пристрій «%s».ВисокіДуже високаДуже низькаВідеоВідеовхідПристроєм відеовходу не підтримується нове значення параметра частоти кадрів.Канали віртуального мікшераВхід віртуального мікшераВихід віртуального мікшераГучністьБілий рознімБілий рознім передньої панеліЖовтий рознімЖовтий рознім передньої панеліgst-plugins-good-0.10.31/po/Makefile.in.in0000644000175000017500000003567011720560211015075 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ # thomas: add GETTEXT_PACKAGE substitution as used in Makevars GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/po/el.gmo0000644000175000017500000004635511720565342013543 00000000000000     JZ cm v  <[ b4o)).'C&k7)JVtqW=*X3M$l#      a(_&"228GT61.243g$)@$+#P5t3)@.Et    /K P^bjsz    &/ 46@wr  /, \gmr y 0   @V[ks   D0 '@ :h * - * '!A! H!R![!a!9j!!!!!!!"("E"$!$9$J$ Z$h$|$% %% 4%>%Q%.b% %%%9%&7(&)`&&T&M& 0'6='t'O(UP(P(X(iP)R) * *q+!,,-i. /}/qL0J0E 1O1f11111)11Y2T3P\3x3&4L445i(6`6j6j^7`7h*88S9Ql9k9d*:::2:=:;;2Z; ;S;;7<><=\<<#<<< <<==7=<M=<= =#=)= >>>X>g>v>>> >> >>??%-?!S?u??? ?%?? ?@^!@1@A BBB!BABCC8CRCVC!\C~CC5C#CYDhD {DDDDDQD(E=FEE EFEKEE4FzF#FFFF F!G%GEGWG]G}nGmGYZHuHy*IvIqJ4JJJJ K K)K,K,K*L 0L=L9WLL=L>Z*Jr`xgF8 I#wbi-?^U@ca'ze]=_%WXnov5M&GNH.\~7V$t9)}D"Q,|El:s ;yTqPKfSh!/j RkB m0<[ dLu1+O(6{ApY234C%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.25.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2010-10-27 12:16+0200 Last-Translator: Michael Kotsarinis Language-Team: Greek Language: el MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 0.3 Plural-Forms: nplurals=2; plural=(n != 1); Λειτουργία %s %dΛειτουργία %s'%s' από '%s'Κέντρο 3DΒάθος 3DΕνίσχυση 3DΠροέκυψε ένα σφάλμα δικτύου ή ο διακομιστής έκλεισε ξαφνικά τη σύνδεση.Είσοδις AUX 1AUX 1 OutΕίσοδος AUX 2AUX 2 OutΕίσοδος AUXΈξοδος AUXΣφάλμα αναπαραγωγής ήχουΜπάσαΕνίσχυση χαμηλώνΜαύρη υποδοχήΜαύρη υποδοχή μπροστινού πάνελΜπλε υποδοχήΜπλε υποδοχή μπροστινού πάνελΕνσωματωμένο μεγάφωνοCDΔεν ήταν δυνατή η ταυτοποίηση της συσκευής '%s'.Δεν είναι δυνατή η λειτουργία χωρίς ρολόι ΚέντροΚεντρικό / Χαμηλών συχνοτήτωνΗ αλλαγή της ανάλυσης κατά τη διάρκεια λειτουργίας δεν υποστηρίζεται ακόμα.Δεν ήταν δυνατή η σύνδεση με τον διακομιστήΑδυναμία θέσης σε σειρά των buffer στη συσκευή '%s'.Δεν ήταν δυνατή η σύνδεση με τον διακομιστή.Δεν ήταν δυνατή η σύνδεση με τον διακομιστή ήχουΔεν ήταν δυνατή η ανάγνωση των παραμέτρων στην συσκευή '%s'Αδυναμία χαρτογράφησης buffer για τη συσκευή '%s'Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για χειρισμό του ελέγχου του μίκτη. Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για χειρισμό του ελέγχου του μίκτη. Αυτή η έκδοση του Open Sound System δεν υποστηρίζεται από αυτό οτ στοιχείο.Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Η συσκευή χρησιμοποιείται από μια άλλη εφαρμογή.Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Αυτή η έκδοση του Open Sound System δεν υποστηρίζεται από αυτό το στοιχείο.Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Δεν έχετε τα δικαιώματα να ανοίξετε την συσκευή.Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για εγγραφή. Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για εγγραφή. Δεν έχετε τα δικαιώματα να ανοίξετε την συσκευή.Δεν ήταν δυνατό το άνοιγμα της συσκευής '%s' για ανάγνωση και γράψιμο. Δεν ήταν δυνατός ο προσδιορισμός του ονόματος του διακομιστή.Η συσκευή '%s' δεν είναι μια συσκευή λήψης.Η συσκευή '%s' δεν είναι συσκευή εξόδου.ΔιαγνωστικόΨηφιακή είσοδοςΨηφιακή έξοδοςΨηφιακό-1Ψηφιακό-2Ψηφιακό-3Μίξη συγχώνευσης (Downmix)Σφάλμα κατά τη λήψη δυνατοτήτων της συσκευής '%s': Δεν είναι οδηγός v4l2. Ελέγξτε αν είναι οδηγός v4l2.Σφάλμα κατά την ανάγνωση %d bytes απο την συσκευή '%s'.Σφάλμα κατά την ανάγνωση %d bytes στην συσκευή '%s'.Σφάλμα κατά την εγγραφή από τη συσκευή ήχου.Αποτυχία έπειτα από %d προσπάθειες. συσκευή %s. σφάλμα συστήματος: %sΑποτυχία κατά την ανάγνωση των χαρακτηριστικών ελέγχου στην συσκευή '%s'.Αποτυχία αποκωδικοποίησης της εικόνας JPEGΑποτυχία ανάγνωσης της τρέχουσας εισαγωγής στην συσκευή '%s'. Πιθανόν να είναι μια συσκευή ράδιοΑποτυχία ανάγνωσης της τρέχουσας συχνότητας δέκτη για την συσκευή '%s'.Αποτυχία ανάγνωσης των ρυθμίσεων δέκτη %d στην συσκευή '%s'.Αποτυχία ανάγνωσης ισχύς σήματος για την συσκευή '%s'.Αποτυχία ανάγνωσης τιμής για τον έλεγχο %d στην συσκευή '%s'.Αποτυχία ανίχνευσης ιδιοτήτων της εισόδου %d στη συσκευή %sΑποτυχία ανίχνευσης κανονικοποίησης στη συσκευή '%s'.Αποτυχία αναζήτησης των δυνατοτήτων του διακομιστή ήχουΑποτυχία ρύθμισης τρέχουσας συχνότητας δέκτη για την συσκευή '%s' στα %lu HzΑποτυχία ρύθμισης εισαγωγής %d στην συσκευή %s.Αποτυχία ρύθμισης κανόνα για την συσκευή '%s'.Αποτυχία ρύθμισης τιμής %d για τον έλεγχο %d στην συσκευή '%s'.Αποτυχία ανάγνωσης πλαισίων βίντεο από την συσκευή '%s'.ΓρήγοραΜπροστάΑκουστικά μπροστινού πάνελΕίσοδος γραμμής μπροστινού πάνελΈξοδος γραμμής μπροστινού πάνελΜικρόφωνο μπροστινού πάνελΚέρδοςΑπροσδόκητο μέγεθος πλαισίου από %u αντί του %uΓκρι υποδοχήΓκρι υποδοχή μπροστινού πάνελΠράσινη υποδοχήΠράσινη υποδοχή μπροστινού πάνελHDMIΤηλεφωνική συσκευήΑκουστικόΑκουστικάΥψηλήΚέρδος εισόδουΕίσοδοςΜίξη εισόδουΕσωτερικό CDΕσωτερικό σφάλμα ροής δεδομένων.Εσωτερικό σφάλμα ροής δεδομένων.ΒύσμαΉχος πληκτρολογίουΧαμηλών συχνοτήτων (LFE)Είσοδος γραμμήςΓραμμή εξόδουΓραμμή-1Γραμμή-2Γραμμή-3Γραμμή-εισόδουΑνατροφοδότησηΧαμηλήΓενικός (Master)ΜεσαίαΜικρόφωνοΜικρόφωνο 1Μικρόφωνο 2Ενίσχυση μικροφώνουΚέρδος μικροφώνουΠηγή μικροφώνουΜείκτηςModemΟθόνηΠαρακολούθηση πηγήςΜονοφωνική μίξηΣίγασηΔεν ορίσθηκε URL.Καμία ή άκυρη εισαγωγή ήχου, η AVI ροή θα καταρρεύσει.Δεν βρέθηκε καμία υποστηριζόμενη ροή. Είναι πιθανόν να χρειασθεί να επιτρέψετε περισσότερα πρωτόκολλα μεταγωγής ή αλλιώς να σας λείπει το σωστό πρόσθετο RTSP του GStreamer.Δεν βρέθηκε καμία υποστηριζόμενη ροή. Είναι πιθανόν να πρέπει να κάνετε εγκατάσταση ένα πρόσθετο GStreamer RTSP για τις ροές Real μέσων. ΚανέναOffOnΠορτοκαλί υποδοχήΠορτοκαλί υποδοχή μπροστινού πάνελΆλλοΚέρδος εξόδουΚέρδος εξόδουPCMPCM-2Είσοδος τηλεφώνουΈξοδος τηλεφώνουΡοζ υποδοχήΡοζ υποδοχή μπροστινού πάνελΘύρες ΑναπαραγωγήςΑυτή η συσκευή ήχου δεν υποστηρίζει αναπαραγωγή.ΠαραγωγήςΡάδιοΠίσωΕγγραφήΚέρδος ΕγγραφήςΠηγή εγγραφήςΑυτή η συσκευή ήχου δεν υποστηρίζει εγγραφή.Κόκκινη υποδοχήΚόκκινη υποδοχή μπροστινού πάνελΕίσδος SPDIFSPDIF OutΑποτυχία εκκίνησης ασφαλούς σύνδεσης.Ο διακομιστής δεν υποστηρίζει αναζήτηση.Ο διακομιστής έστειλε λάθος δεδομένα.ΠλευρικόΠροσομοίωση στέρεοΜεγάφωνοΠηγή μεγαφώνουΕυρεία έξοδοςΣτέρεοΣτερεοφωνική μίξηΠεριβάλλων (Surround)Ήχος SurroundSynthΤηλέφωνοΟ οδηγός της συσκευής '%s' δεν υποστηρίζει κάποια γνωστή μέθοδο λήψης.Το βίντεο σε αυτό το αρχείο μπορεί να μην αναπαραχθεί σωστά.Αυτό το αρχείο δεν περιέχει αναπαραγώγιμες ροές.Αυτό το αρχείο περιέχει πολλές ροές. Αναπαράγεται μόνο η πρώτη %dΤο αρχείο αυτό είναι κατεστραμμένο και δεν μπορεί να αναπαραχθεί. Το αρχείο αυτό είναι ανολοκλήρωτο και δεν μπορεί να αναπαραχθεί.Το αρχείο αυτό δεν είναι έγκυρο και δεν μπορεί να αναπαραχθεί.Αυτή δεν είναι μια συκευή '%s'.Πρίμα (treble)Πολύ υψηλήΠολύ χαμηλήΒίντεοΕίσοδος βίντεοΗ συσκευή εισόδου βίντεο δεν αποδέχθηκε τη νέα ρύθμιση ταχύτητας καρέ.Κανάλια εικονικού μίκτηΕίσοδος εικονικού μίκτηΈξοδος εικονικού μίκτηΈντασηΛευκή υποδοχήΛευκή υποδοχή μπροστινού πάνελΚίτρινη υποδοχήΚίτρινη υποδοχή μπροστινού πάνελgst-plugins-good-0.10.31/po/da.gmo0000644000175000017500000003433111720565342013516 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""y#$ $ $ $$$I$ %*% 3%=%F%N%U%m% q%}%%%%%%!%&*& 2&A?&&3&&&)&)%'-O';}''&@(Og(t(U,)()T)**"=*"`* * * * * * **p*,<+,i+ +2+6+$!,OF,N,:,> --_-5-9-,-)*.FT.*./.).: /<[/////// /4 0?0P0k0~00 0 00000 0 001(1@1 E1R1 V1`1i1q1y1 111111 1 111 1112 22!2)2>@22*33333333444 4(4/4D4c43t4 44444 4245+5 F5P5-Y5#5555 55 56 66 6)6/6?762w6*6=6,71@71r777 7 77 7H788N8d8 y88888v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good-0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-07 23:54+0200 Last-Translator: Joe Hansen Language-Team: Danish Language: da MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s %d funktion%s funktion'%s' af '%s'3D-centrum3D-dybde3D-forstærkningDer opstod en netværksfejl, eller serveren lukkede uventet forbindelsen.AUX 1 indAUX 1 udAUX 2 indAUX 2 udAUX indAUX udFejl ved lydafspilning.BasBas-øgningSort forbindelseSort frontpanelforbindelseBlå forbindelseBlå frontpanelforbindelseIndbygget højtalerCdKan ikke identificere enhed '%s'.Kan ikke fungere uden et urCentrumCenter / LFEÆndring af opløsning under kørsel er endnu ikke understøttet.Kunne ikke forbinde til serverKunne ikke sætte mellemlager fra enhed '%s' i kø.Kunne ikke skabe kontakt til serveren.Kunne ikke skabe kontakt til lyd-serverenKunne ikke hente parametre fra enhed '%s'Kunne ikke afbilde mellemlager fra enhed '%s'Kunne ikke åbne lydenhed til håndtering af mikserkontrol.Kunne ikke åbne lydenhed til håndtering af mikserkontrol. Denne version af Open Sound System er ikke understøttet af dette element.Kunne ikke åbne enhed til afspilning.Kunne ikke åbne lydenhed til afspilning. Enheden anvendes af et andet program.Kunne ikke åbne lydenhed til afspilning. Denne version af Open Sound System er ikke understøttet af dette element.Kunne ikke åbne lydenhed til afspilning. Du har ikke rettighed til at åbne enheden.Kunne ikke åbne lydenhed til optagelse.Kunne ikke åbne lydenhed til optagelse. Du har ikke rettighed til at åbne enheden.Kunne ikke tilgå enhed '%s'.Kunne ikke slå servernavn op.Enhed '%s' er ikke en optageenhed.Enhed '%s' er ikke en uddataenhed.DiagnostikDigital indDigital udDigital-1Digital-2Digital-3DownmixFejl ved hentning af egenskaber for enhed '%s': Det er ikke en v412 driver. Kontroller om det er en v411 driver.Fejl ved læsning af %d byte på enhed '%s'.Fejl ved læsning af %d byte på enhed '%s'.Fejl ved optagelse fra lydenhed.Fejlede efter %d forsøg. enhed %s. systemfejl: %sHentning af kontrolattributter for enhed '%s' fejlede.Mislykkedes i at afkode JPEG-billedeKunne ikke hente nuværende inddata for enhed '%s'. Måske er det en radioenhedKunne ikke hente nuværende uddata for enhed '%s'. Måske er det en radioenhedKunne ikke hente nuværende tuner-frekvens for enhed '%s'.Hentning af indstillinger for tuner %d på enhed '%s' fejlede.Kunne ikke hente signalstyrke for enhed '%s'.Kunne ikke hente værdi af kontrol %d for enhed '%s'.Listning af inddata-attributter for %d i enhed %s fejledeListning af standard på enhed '%s' fejlede.Listning af lydservers egenskaber fejledeKunne ikke sætte nuværende tuner-frekvens for enhed '%s' til %lu Hz.Kunne ikke sætte inddata %d for enhed %s.Indstilling af standard for enhed '%s' fejlede.Kunne ikke sætte uddata %d for enhed %s.Kunne ikke sætte værdi %d på kontrol %d for enhed '%s'.Forsøg på at hente videorammer fra enhed '%s' mislykkedes.HurtigFrontFrontpanels hovedtelefonerFrontpanels linje indFrontpanels linje udFrontpanelmikrofonForhøjelseFik uventet billedstørrelse på %u i steden for %u.Grå forbindelseGrå frontpanelforbindelseGrøn forbindelse Grøn frontpanelforbindelseHDMIHåndsætHovedtelefonHovedtelefonerHøjInd-forhøjelseInddataInddatamiksIntern cdIntern datastrømsfejl.Intern datastrømsfejl.Ugyldig atomstørrelse.JackTastaturbeepLFELinje indLinje udLinje-1Linje-2Linje-3Linje-indLoopbackLavMasterMellemMikrofonMikrofon 1Mikrofon 2MikrofonøgningMikrofonforhøjelseMikrofonkildeMikserModemMonitorSkærmkildeMonomiksSlukketIngen adresse angivet.Ingen eller defekt inddatalyd, AVI-sekvens vil blive ødelagt.Ingen understøttet strøm blev fundet. Du mangler måske at tillade yderligere transportprotokoller eller mangler måske det korrekte udvidelsesmodul til GStreamer RTSP.Ingen understøttet strøm blev fundet. Du skal måske installere et udvidelsesmodul for GStreamer RTSP til Real media-strømme.IngenSlukTændOrange forbindelseOrange frontpanelforbindelseAndetUd-forhøjelseUddata - forhøjelsePCMPCM-2Lyd-indLyd-udLyserød forbindelseLyserød frontpanelforbindelseAfspilningsporteAfspilning er ikke understøttet af denne lydenhed.ProduktionRadioBagendeOptagOptag - forhøjelseOptag kildeOptagelse er ikke understøttet af denne lydenhed.Rød forbindelseRød frontpanelforbindelseSPDIF indSPDIF udOpsætning af sikker forbindelse mislykkedes.Server understøtter ikke søgning.Server sendte ugyldige data.SideSimuler stereoHøjtalerHøjtalerkildeSpred uddataStereoStereomiksSurroundSurroundlydSynthTelefonDriveren til enhed '%s' understøtter ingen kendt optagemetode.Videoen i denne fil afspilles måske ikke korrekt.Denne fil indeholder ingen spilbar strøm.Denne fil indeholder for mange strømme. Afspil først kun %dDenne fil er ødelagt og kan ikke afspilles.Denne fil er ufuldstændig og kan ikke afspilles.Denne fil er ufuldstændig og kan ikke afspilles.Dette er ikke en enheds '%s'.DiskantMeget højMeget lavVideoVideo indEnheden til videoinddata accepterede ikke ny indstilling for billedrate.Virtuel mikserkanalerVirtuel mikserinddataVirtuel mikseruddataLydstyrkeHvid forbindelseHvid frontpanelforbindelseGul forbindelseGul frontpanelforbindelsegst-plugins-good-0.10.31/po/id.po0000644000175000017500000004122611720565342013363 00000000000000# Indonesian translations for gst-plugins-good package. # This file is put in the public domain. # # Andhika Padmawan , 2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-02-26 18:09+0700\n" "Last-Translator: Andhika Padmawan \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Tak dapat membangun koneksi ke server suara" msgid "Failed to query sound server capabilities" msgstr "Gagal untuk kueri kemampuan server suara" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' oleh '%s'" msgid "Internal data stream error." msgstr "Galat arus data internal." msgid "Failed to decode JPEG image" msgstr "Gagal untuk mengawasandi citra JPEG" msgid "Could not connect to server" msgstr "Tak dapat menghubungi server" msgid "Server does not support seeking." msgstr "Server tidak mendukung pencarian." msgid "Could not resolve server name." msgstr "Tak dapat menemukan nama server." msgid "Could not establish connection to server." msgstr "Tak dapat membangun koneksi ke server." msgid "Secure connection setup failed." msgstr "Pengaturan koneksi aman gagal." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Terjadi sebuah galat jaringan, atau server menutup koneksi secara tiba-tiba." msgid "Server sent bad data." msgstr "Server mengirim data rusak." msgid "No URL set." msgstr "Tak ada URL yang ditentukan." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Masukan audio tidak ada atau tidak sah, arus AVI akan rusak." msgid "This file contains no playable streams." msgstr "Berkas ini tidak berisi arus yang dapat diputar." msgid "This file is invalid and cannot be played." msgstr "Berkas ini tidak sah dan tak dapat diputar." msgid "This file is corrupt and cannot be played." msgstr "Berkas ini rusak dan tak dapat diputar." msgid "Invalid atom size." msgstr "Ukuran atom tidak sah." msgid "This file is incomplete and cannot be played." msgstr "Berkas ini tidak lengkap dan tak dapat diputar." msgid "The video in this file might not play correctly." msgstr "Video di berkas ini mungkin tak dapat diputar dengan benar." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Berkas ini berisi terlalu banyak arus. Hanya memutar %d pertama" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Tak ada arus didukung yang ditemukan. Anda mungkin perlu menginstal plugin " "ekstensi GStreamer RTSP untuk arus Real media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Tak ada arus didukung yang ditemukan. Anda mungkin ingin mengizinkan lebih " "banyak transportasi atau kehilangan plugin ekstensi GStreamer RTSP yang " "benar." msgid "Internal data flow error." msgstr "Galat aliran data internal." msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Treble" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Pengeras Suara" msgid "Line-in" msgstr "Jalur masuk" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Rekam" msgid "In-gain" msgstr "Masukan-gain" msgid "Out-gain" msgstr "Keluaran-gain" msgid "Line-1" msgstr "Jalur-1" msgid "Line-2" msgstr "Jalur-2" msgid "Line-3" msgstr "Jalur-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Telepon-masuk" msgid "Phone-out" msgstr "Telepon-keluar" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Tak dapat membuka divais audio untuk putar kembali. Divais sedang digunakan " "oleh aplikasi lain." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Tak dapat membuka divais audio untuk putar kembali. Anda tak memiliki hak " "akses untuk membuka divais." msgid "Could not open audio device for playback." msgstr "Tak dapat membuka divais audio untuk putar kembali." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Tak dapat membuka divais audio untuk merekam. Anda tak memiliki hak akses " "untuk membuka divais." msgid "Could not open audio device for recording." msgstr "Tak dapat membuka divais audio untuk merekam." msgid "Could not open audio device for mixer control handling." msgstr "Tak dapat membuka divais audio untuk menangani kontrol mixer." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Tak dapat membuka divais audio untuk menangani kontrol mixer. Versi Open " "Sound System ini tidak didukung oleh elemen ini." msgid "Master" msgstr "Master" msgid "Front" msgstr "Depan" msgid "Rear" msgstr "Belakang" msgid "Headphones" msgstr "Headphone" msgid "Center" msgstr "Tengah" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Sekeliling" msgid "Side" msgstr "Sisi" msgid "Built-in Speaker" msgstr "Pengeras Suara Terbina" msgid "AUX 1 Out" msgstr "AUX 1 Keluar" msgid "AUX 2 Out" msgstr "AUX 2 Keluar" msgid "AUX Out" msgstr "AUX Keluaran" msgid "3D Depth" msgstr "Kedalaman 3D" msgid "3D Center" msgstr "3D Tengah" msgid "3D Enhance" msgstr "Dipercanggih 3D" msgid "Telephone" msgstr "Telepon" msgid "Line Out" msgstr "Jalur Keluar" msgid "Line In" msgstr "Jalur Masuk" msgid "Internal CD" msgstr "CD Internal" msgid "Video In" msgstr "Video Masuk" msgid "AUX 1 In" msgstr "AUX 1 Masuk" msgid "AUX 2 In" msgstr "AUX 2 Masuk" msgid "AUX In" msgstr "AUX Masuk" msgid "Record Gain" msgstr "Rekam Gain" msgid "Output Gain" msgstr "Keluaran Gain" msgid "Microphone Boost" msgstr "Mikrofon Boost" msgid "Loopback" msgstr "Loopback" msgid "Diagnostic" msgstr "Diagnosis" msgid "Bass Boost" msgstr "Bass Boost" msgid "Playback Ports" msgstr "Pangkalan Putar" msgid "Input" msgstr "Masukan" msgid "Record Source" msgstr "Sumber Rekaman" msgid "Monitor Source" msgstr "Sumber Monitor" msgid "Keyboard Beep" msgstr "Bip Papan Ketik" msgid "Simulate Stereo" msgstr "Simulasi Stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Suara Sekeliling" msgid "Microphone Gain" msgstr "Mikrofon Gain" msgid "Speaker Source" msgstr "Sumber Pengeras Suara" msgid "Microphone Source" msgstr "Sumber Mikrofon" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Tengah / LFE" msgid "Stereo Mix" msgstr "Mix Stereo" msgid "Mono Mix" msgstr "Mix Mono" msgid "Input Mix" msgstr "Mix Masukan" msgid "SPDIF In" msgstr "SPDIF Masuk" msgid "SPDIF Out" msgstr "SPDIF Keluar" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digital Keluar" msgid "Digital In" msgstr "Digital Masuk" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Handset" msgid "Other" msgstr "Lainnya" msgid "None" msgstr "Tidak Ada" msgid "On" msgstr "Hidup" msgid "Off" msgstr "Mati" msgid "Mute" msgstr "Diam" msgid "Fast" msgstr "Cepat" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Sangat Rendah" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Rendah" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Sedang" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Tinggi" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Sangat Tinggi" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produksi" msgid "Front Panel Microphone" msgstr "Mikrofon Panel Depan" msgid "Front Panel Line In" msgstr "Masukan Jalur Panel Depan" msgid "Front Panel Headphones" msgstr "Headphone Panel Depan" msgid "Front Panel Line Out" msgstr "Keluaran Jalur Panel Depan" msgid "Green Connector" msgstr "Konektor Hijau" msgid "Pink Connector" msgstr "Konektor Merah Jambu" msgid "Blue Connector" msgstr "Konektor Biru" msgid "White Connector" msgstr "Konektor Putih" msgid "Black Connector" msgstr "Konektor Hitam" msgid "Gray Connector" msgstr "Konektor Abu-Abu" msgid "Orange Connector" msgstr "Konektor Jingga" msgid "Red Connector" msgstr "Konektor Merah" msgid "Yellow Connector" msgstr "Konektor Kuning" msgid "Green Front Panel Connector" msgstr "Konektor Panel Depan Hijau" msgid "Pink Front Panel Connector" msgstr "Konektor Panel Depan Merah Jambu" msgid "Blue Front Panel Connector" msgstr "Konektor Panel Depan Biru" msgid "White Front Panel Connector" msgstr "Konektor Panel Depan Putih" msgid "Black Front Panel Connector" msgstr "Konektor Panel Depan Hitam" msgid "Gray Front Panel Connector" msgstr "Konektor Panel Depan Abu-Abu" msgid "Orange Front Panel Connector" msgstr "Konektor Panel Depan Jingga" msgid "Red Front Panel Connector" msgstr "Konektor Panel Depan Merah" msgid "Yellow Front Panel Connector" msgstr "Konektor Panel Depan Kuning" msgid "Spread Output" msgstr "Keluaran Sebar" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "Masukan Mixer Virtual" msgid "Virtual Mixer Output" msgstr "Keluaran Mixer Virtual" msgid "Virtual Mixer Channels" msgstr "Kanal Mixer Virtual" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Fungsi %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Fungsi %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Tak dapat membuka divais audio untuk putar kembali. Versi Open Sound System " "ini tidak didukung oleh elemen ini." msgid "Playback is not supported by this audio device." msgstr "Putar balik tidak didukung oleh divais audio ini." msgid "Audio playback error." msgstr "Galat putar balik audio." msgid "Recording is not supported by this audio device." msgstr "Perekaman tidak didukung oleh divais audio ini." msgid "Error recording from audio device." msgstr "Galat merekam dari divais audio." msgid "Gain" msgstr "Gain" msgid "Headphone" msgstr "Headphone" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Galat membaca %d bita dari divais '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Mendapatkan ukuran bingkai %u ketimbang %u yang tak diharapkan." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Galat membaca %d bita pada divais '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Galat mendapatkan kemampuan untuk divais '%s': Itu bukan diver v4l2. Cek " "apakah itu merupakan driver v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Gagal kueri atribut masukan %d di divais %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Gagal mendapatkan pengaturan tuner %d di divais '%s'." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Gagal kueri standar di divais '%s'." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Gagal mendapatkan kendali atribut di divais '%s'." #, c-format msgid "Cannot identify device '%s'." msgstr "Tak dapat mengidentifikasi divais '%s'." #, c-format msgid "This isn't a device '%s'." msgstr "Ini bukan divais '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Tak dapat membuka divais '%s' untuk dibaca dan ditulis." #, c-format msgid "Device '%s' is not a capture device." msgstr "Divais '%s' bukan divais penangkap." #, c-format msgid "Device '%s' is not a output device." msgstr "Divais '%s' bukan divais keluaran." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Gagal mengatur standar untuk divais '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Gagal untuk mendapatkan frekuensi tuner terkini untuk divais '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Gagal mengatur frekuensi tuner terkini untuk divais '%s' ke %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Gagal mendapatkan kekuatan sinyal untuk divais '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Gagal mendapatkan nilai untuk kendali %d di divais '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Gagal mengatur nilai %d untuk kendali %d di divais '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Gagal mendapatkan masukan terkini di divais '%s'. Mungkin itu divais radio" #, c-format msgid "Failed to set input %d on device %s." msgstr "Gagal mengatur masukan %d di divais %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Gagal mendapatkan keluaran terkini di divais '%s'. Mungkin itu divais radio" #, c-format msgid "Failed to set output %d on device %s." msgstr "Gagal mengatur keluaran %d di divais %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Tak dapat mengantrekan penyangga di divais '%s'." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Gagal mencoba untuk mendapatkan bingkai video dari divais '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Gagal setelah %d percobaan. divais %s. galat sistem: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Tak bisa mendapatkan parameter di divais '%s'" msgid "Video input device did not accept new frame rate setting." msgstr "Divais masukan video tak menerima pengaturan rasio bingkai baru." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Tak dapat memetakan penyangga dari divais '%s'" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Driver dari divais '%s' tak mendukung metode penangkap apapun yang dikenal." msgid "Changing resolution at runtime is not yet supported." msgstr "Mengubah resolusi saat waktu berjalan belum didukung." msgid "Cannot operate without a clock" msgstr "Tak dapat beroperasi tanpa jam" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Gagal menyebutkan kemungkinan format video yang dapat bekerja dengan " #~ "divais '%s'." #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Tipe penyangga tidak didukung, atau indeks di luar batas, atau tak ada " #~ "penyangga yang telah dialokasikan, atau userptr atau panjang tidak sah. " #~ "divais %s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Gagal mencoba untuk mendapatkan bingkai video dari divais '%s'. Tak cukup " #~ "memori." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "kekurangan memori untuk mengantrekan penyangga penunjuk pengguna. divais " #~ "%s." #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "Tak ada penyangga bebas ditemukan di lubuk pada indeks %d." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Divais '%s' tak dapat menangkap di %dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Divais '%s' tak dapat menangkap dalam format yang ditentukan" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Tak bisa mendapatkan penyangga dari divais '%s'." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "Tak bisa mendapatkan penyangga yang cukup dari divais '%s'." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Galat memulai penangkapan arus dari divais '%s'." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Galat menghentikan penangkapan arus dari divais '%s'." #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "Gagal mendapatkan kendali atribut di divais '%s.'" gst-plugins-good-0.10.31/po/LINGUAS0000644000175000017500000000020711677341660013454 00000000000000af az bg ca cs da de el en_GB eo es eu fi fr gl hu id it ja lt lv mt nb nl or pl pt_BR ro ru sk sl sq sr sv tr uk vi zh_CN zh_HK zh_TW gst-plugins-good-0.10.31/po/mt.po0000644000175000017500000004042611720565342013410 00000000000000# Maltese translation for gst-plugins-good. # This file is distributed under the same license as the gst-plugins-good package. # NAME OF AUTHOR , 2008. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.10.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2008-10-26 19:09+0100\n" "Last-Translator: Michel Bugeja \n" "Language-Team: Maltese \n" "Language: mt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Maltese\n" "X-Poedit-Country: MALTA\n" msgid "Could not establish connection to sound server" msgstr "Kuntatt mas-sound server ma ġiex stabbilit" msgid "Failed to query sound server capabilities" msgstr "Mhux possibli t-tfittxija għall-kapaċita tas-sound server" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "" msgid "Internal data stream error." msgstr "Problema interna fid-data stream" msgid "Failed to decode JPEG image" msgstr "Problem fid-decoding tal-istampa JPEG" msgid "Could not connect to server" msgstr "Mhux possibli naqbad mas-server" #, fuzzy msgid "Server does not support seeking." msgstr "Appart '%s' ma jagħmilx video capture" #, fuzzy msgid "Could not resolve server name." msgstr "Mhux possibli naqbad mas-server" #, fuzzy msgid "Could not establish connection to server." msgstr "Kuntatt mas-sound server ma ġiex stabbilit" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Input audio ma nstabx jew mhux validu. AVI stream jista jkun korrott." msgid "This file contains no playable streams." msgstr "Il-fajl ma fiħ l-ebda stream li tista tindaqq." msgid "This file is invalid and cannot be played." msgstr "Il-fajl mhux validu u ma jistax jindaqq" msgid "This file is corrupt and cannot be played." msgstr "Il-fajl huwa korrott u ma jistax jinfetaħ." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Il-fajl mhux komplut u ma jistax jindaqq," msgid "The video in this file might not play correctly." msgstr "Jista jkun illi l-vidjo ġo dan il-fajl ma jidhirx sewwa." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Il-fajl fiħ aktar streams milli suppost. Ser indoqq l-ewwel %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" msgid "Internal data flow error." msgstr "Problema interna ta' data flow" msgid "Volume" msgstr "Volum" msgid "Bass" msgstr "Bass" msgid "Treble" msgstr "Treble" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Speaker" msgid "Line-in" msgstr "Line-in" msgid "Microphone" msgstr "Mikrofonu" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Record" msgid "In-gain" msgstr "In-gain" msgid "Out-gain" msgstr "Out-gain" msgid "Line-1" msgstr "Line-1" msgid "Line-2" msgstr "Line-2" msgid "Line-3" msgstr "Line-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Phone-in" msgid "Phone-out" msgstr "Phone-out" msgid "Video" msgstr "Vidjo" msgid "Radio" msgstr "Radju" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "Audio device ma jistax jintuża. Qed jintuża minn programm ieħor." #, fuzzy msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "Audio device ma jistax jintuża. M'għandex aċċess għalih." msgid "Could not open audio device for playback." msgstr "Audio device ma jistax jintuża." #, fuzzy msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Audio device ma jistax jintuża biex tirrekordja. M'għandex aċċess għalih." msgid "Could not open audio device for recording." msgstr "Audio device ma jistax jintuża biex tirrekordja." msgid "Could not open audio device for mixer control handling." msgstr "Ma nistax niftaħ apparat tal-awdjo għal mixer control handling." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Ma nistax niftaħ apparat tal-awdjo għal mixer control handling. Din il-" "verzjoni ta' Open Sound System mhux issapportjata minn din l-element." #, fuzzy msgid "Master" msgstr "Fast" msgid "Front" msgstr "Quddiem" msgid "Rear" msgstr "Wara" msgid "Headphones" msgstr "Headphones" #, fuzzy msgid "Center" msgstr "Center / LFE" msgid "LFE" msgstr "" #, fuzzy msgid "Surround" msgstr "Surround sound" msgid "Side" msgstr "Ġenb" #, fuzzy msgid "Built-in Speaker" msgstr "Speaker" msgid "AUX 1 Out" msgstr "" msgid "AUX 2 Out" msgstr "" msgid "AUX Out" msgstr "" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" #, fuzzy msgid "Telephone" msgstr "Headphones" msgid "Line Out" msgstr "" #, fuzzy msgid "Line In" msgstr "Line-in" msgid "Internal CD" msgstr "" msgid "Video In" msgstr "" msgid "AUX 1 In" msgstr "" msgid "AUX 2 In" msgstr "" msgid "AUX In" msgstr "" msgid "Record Gain" msgstr "" msgid "Output Gain" msgstr "" #, fuzzy msgid "Microphone Boost" msgstr "Mikrofonu" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "Input" msgid "Record Source" msgstr "" msgid "Monitor Source" msgstr "" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "Stereo" #, fuzzy msgid "Surround Sound" msgstr "Surround sound" #, fuzzy msgid "Microphone Gain" msgstr "Mikrofonu" msgid "Speaker Source" msgstr "" #, fuzzy msgid "Microphone Source" msgstr "Mikrofonu" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "Center / LFE" #, fuzzy msgid "Stereo Mix" msgstr "Stereo" msgid "Mono Mix" msgstr "" #, fuzzy msgid "Input Mix" msgstr "Input mix" msgid "SPDIF In" msgstr "" msgid "SPDIF Out" msgstr "" #, fuzzy msgid "Microphone 1" msgstr "Mikrofonu" #, fuzzy msgid "Microphone 2" msgstr "Mikrofonu" msgid "Digital Out" msgstr "" msgid "Digital In" msgstr "" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "On" msgid "Off" msgstr "Off" msgid "Mute" msgstr "" msgid "Fast" msgstr "Fast" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Low" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medium" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "High" #. TRANSLATORS: "Very High" is a quality setting here #, fuzzy msgid "Very High" msgstr "Very high" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Production" #, fuzzy msgid "Front Panel Microphone" msgstr "Mikrofonu tal-panella ta' quddiem" #, fuzzy msgid "Front Panel Line In" msgstr "Front panel line-in" #, fuzzy msgid "Front Panel Headphones" msgstr "Front panel headphones" #, fuzzy msgid "Front Panel Line Out" msgstr "Front panel line-in" #, fuzzy msgid "Green Connector" msgstr "Connector aħdar" #, fuzzy msgid "Pink Connector" msgstr "Connector roża" #, fuzzy msgid "Blue Connector" msgstr "Connector Blu" #, fuzzy msgid "White Connector" msgstr "Connector abjad" #, fuzzy msgid "Black Connector" msgstr "Connector iswed" #, fuzzy msgid "Gray Connector" msgstr "Connector Griż" #, fuzzy msgid "Orange Connector" msgstr "Connector oranġjo" #, fuzzy msgid "Red Connector" msgstr "Connector aħmar" #, fuzzy msgid "Yellow Connector" msgstr "Connector isfar" #, fuzzy msgid "Green Front Panel Connector" msgstr "Front panel connector aħdar" #, fuzzy msgid "Pink Front Panel Connector" msgstr "Front panel connector roża" #, fuzzy msgid "Blue Front Panel Connector" msgstr "Front panel connector blu" #, fuzzy msgid "White Front Panel Connector" msgstr "Front panel connector abjad" #, fuzzy msgid "Black Front Panel Connector" msgstr "Front panel connector iswed" #, fuzzy msgid "Gray Front Panel Connector" msgstr "Front panel connector Griż" #, fuzzy msgid "Orange Front Panel Connector" msgstr "Front Panel connector oranġjo" #, fuzzy msgid "Red Front Panel Connector" msgstr "Front panel connector aħmar" #, fuzzy msgid "Yellow Front Panel Connector" msgstr "Front panel connector isfar" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" #, fuzzy msgid "Virtual Mixer Input" msgstr "Virtual mixer input" #, fuzzy msgid "Virtual Mixer Output" msgstr "Virtual mixer output" #, fuzzy msgid "Virtual Mixer Channels" msgstr "Virtual mixer input" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Ma nistax niftaħ apparat tal-awdjo biex indoqq. Dil il-verżjoni ta' Open " "Sound System mhux issapportjatha minn dan l-element." msgid "Playback is not supported by this audio device." msgstr "Id-daqq mhux issappartjat minn dan l-apparat tal-awdjo." msgid "Audio playback error." msgstr "Żball fiid-daqq tal-awdjo." msgid "Recording is not supported by this audio device." msgstr "Irrekordjar mhux issapportjat minn dan l-apparat tal-awdjo." msgid "Error recording from audio device." msgstr "Żball fl-irrekordjar mill-apparat tal-awdjo." msgid "Gain" msgstr "Gain" msgid "Headphone" msgstr "" #, fuzzy, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Problema fil-qar()i %d bytes fid-device '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Irċivejt frame size ta' %u minflok kif kien mistenni ta' %u." #, fuzzy, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Problema fil-qar()i %d bytes fid-device '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Problema biex nġib il-kapaċitajiet tal-apparat '%s': Mhux v4l2 driver. " "Iċċekkja jekk hux v4l1 driver. " #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Mhux possibli tfittxja għal attributi ta' input %d ġol-apparat %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Problema biex inġib settings tat-tuner %d fuq l-appart '%s'" #, c-format msgid "Failed to query norm on device '%s'." msgstr "Ma stajx nfittex norm fuq apparat '%s'." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "L-attributi ta' kontroll ta' device '%s' ma nqrawx." #, c-format msgid "Cannot identify device '%s'." msgstr "Device '%s' mhux identifikat." #, c-format msgid "This isn't a device '%s'." msgstr "Dan mhux device %s." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Device '%s' ma nistax niftaħu biex naqra jew nikteb." #, c-format msgid "Device '%s' is not a capture device." msgstr "Device '%s' mhux capture device." #, fuzzy, c-format msgid "Device '%s' is not a output device." msgstr "Device '%s' mhux capture device." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Ma stajtx nissetja norm fuq apparat '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Problema biex inġib il-frekwenza li jitrażmetti fuqha apparat '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Problema biex nissettja l-frekwenza li jitrażmetti fuqha apparat '%s' għal " "%lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Problema biex inġib signal strength fuq l-apparat '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Problema biex inġib valur ta' control %d fuq l-apparat '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Problema biex nissetja valur %d lil control %d fuq l-apparat '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Problema biex inġib current input fuq apparat '%s'. Jista jkun li huwa " "apparat tar-radju." #, c-format msgid "Failed to set input %d on device %s." msgstr "Problema biex nissettja input %d fuq apparat %s." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Problema biex inġib current input fuq apparat '%s'. Jista jkun li huwa " "apparat tar-radju." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Problema biex nissettja input %d fuq apparat %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Could not enqueue buffers in device '%s'." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Problema biex inġib video frames mill-apparat '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Problema wara li pruvajt %d drabi. apparat %s. żball fis-sistema: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Mhux possibli nġib parametri tal-apparat '%s'" msgid "Video input device did not accept new frame rate setting." msgstr "" "Apparat li jaqra video input ma aċċettax is-settings ġodda tal-frame rate." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Ma nistax nqabbel buffers mill-apparat '%s'." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Id-driver tal-apparat '%s' ma jissapportja l-ebda capture method mifhum." msgid "Changing resolution at runtime is not yet supported." msgstr "Ma tistax tibdel ir-resolution waqt runtime." msgid "Cannot operate without a clock" msgstr "Ma nistax nħaddem mingħajr arloġġ" #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Problem biex inwaqqaf streaming capture mill-apparat '%s'." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Problem biex nibda streaming capture mill-apparat '%s'." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "Ma nistax nirċievi biżżejjed buffers mill-apparat '%s'." #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Ma nistax nirċievi buffers mill-apparat '%s'." #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Appart '%s' ma jistax jagħmel capture f'dan il-format" #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Appart '%s' ma jistax jagħmel capture bi %dx%d" #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "Ma nstab l-ebda buffer free fl-indiċi %d tal-pool." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Problema biex inġib video frames mill-apparat '%s'. Il-memorja allokata " #~ "mhijiex biżżejjed." #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Failed to enumerate possible video formats device '%s' can work with" #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "L-attributi ta' kontroll ta' device '%s' ma nqrawx." gst-plugins-good-0.10.31/po/sq.gmo0000644000175000017500000000276111720565343013560 00000000000000%`af i s } 6  "(/7=DJsQ     &:FA         BassCDDigital-1Digital-2Digital-3In-gainLine-1Line-2Line-3Line-inMicrophoneMixerMonitorNo or invalid input audio, AVI stream will be corrupt.Out-gainPCMPCM-2Phone-inPhone-outRadioRecordSpeakerSynthTrebleVideoVolumeProject-Id-Version: gst-plugins 0.8.3 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2004-08-07 20:29+0200 Last-Translator: Laurent Dhima Language-Team: Albanian Language: sq MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BasCDDixhitale-1Dixhitale-2Dixhitale-3In-gainLinja-1Linja-2Linja-3Linja-hyrjeMikrofoniKontrolli i volumitEkraniInput audio i gabuar ose mungon, stream AVI mund të jetë i dëmtuar.Out-gainPCMPCM-2Phone-hyrjaPhone-daljaRadioRegjistrimiZë folësSintetizuesiTrebleVideoVolumigst-plugins-good-0.10.31/po/ro.po0000644000175000017500000003741111720565342013410 00000000000000# Romanian translation for gst-plugins-good # This file is distributed under the same license as the gst-plugins-good package. # Lucian Adrian Grijincu , 2010. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.23.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-08-16 03:22+0300\n" "Last-Translator: Lucian Adrian Grijincu \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Virtaal 0.6.1\n" "X-Launchpad-Export-Date: 2010-08-16 00:08+0000\n" msgid "Could not establish connection to sound server" msgstr "Nu se poate stabili o conexiune la serverul de sunet" msgid "Failed to query sound server capabilities" msgstr "Interogarea capabilităților serverului de sunet a eșuat" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "„%s” de „%s”" msgid "Internal data stream error." msgstr "Eroare internă a fluxului de date." msgid "Failed to decode JPEG image" msgstr "Nu s-a putut decoda imaginea JPEG" msgid "Could not connect to server" msgstr "Nu se poate stabili o conexiune la server" msgid "Server does not support seeking." msgstr "" #, fuzzy msgid "Could not resolve server name." msgstr "Nu se poate stabili o conexiune la server" #, fuzzy msgid "Could not establish connection to server." msgstr "Nu se poate stabili o conexiune la serverul de sunet" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Intrarea audio nu există sau este nevalidă, fluxul de date AVI va fi corupt." msgid "This file contains no playable streams." msgstr "Acest fișier nu conține fluxuri ce pot fi redate." msgid "This file is invalid and cannot be played." msgstr "Fișierul nu este valid și nu poate fi redat." msgid "This file is corrupt and cannot be played." msgstr "Acest fișier este corupt și nu poate fi redat." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Acest fișier nu este complet și nu poate fi redat." msgid "The video in this file might not play correctly." msgstr "Este posibil ca fișierul video să nu fie redat corect." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Fișierul conține prea multe fluxuri. Se redau doar primele %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nu s-a găsit nici un flux suportat. Pentru fluxuri Real media s-ar putea să " "fie nevoie să instalați extensia GStreamer RTSP." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nu a fost găsit niciun flux suportat. S-ar putea să necesite permiterea mai " "multor protocoale de transport sau de altfel s-ar putea să lipsească modulul " "corect de extensie GStreamer RTSP." msgid "Internal data flow error." msgstr "Eroare internă a fluxului de date." msgid "Volume" msgstr "Volum" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Înalte" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Difuzor" msgid "Line-in" msgstr "Linie intrare" msgid "Microphone" msgstr "Microfon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Înregistrare" msgid "In-gain" msgstr "Câștig intrare" msgid "Out-gain" msgstr "Câștig ieșire" msgid "Line-1" msgstr "Linia-1" msgid "Line-2" msgstr "Linia-2" msgid "Line-3" msgstr "Linia-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" msgid "Phone-in" msgstr "Intrare telefon" msgid "Phone-out" msgstr "Ieșire telefon" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Nu s-a putut deschide dispozitivul audio pentru redare. Dispozitivul este " "folosit de o altă aplicație." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Nu s-a putut deschide dispozitivul audio pentru redare. Nu aveți permisiunea " "de a deschide dispozitivul." msgid "Could not open audio device for playback." msgstr "Nu s-a putut deschide dispozitivul audio pentru redare." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Nu s-a putut deschide dispozitivul audio pentru înregistrare Nu aveți " "permisiunea de a deschide dispozitivul." msgid "Could not open audio device for recording." msgstr "Nu s-a putut deschide dispozitivul audio pentru înregistrare." msgid "Could not open audio device for mixer control handling." msgstr "" "Nu s-a putut deschide dispozitivul audio pentru gestionarea controlului de " "mixaj." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nu s-a putut deschide dispozitivul audio pentru gestionarea controlului de " "mixaj. Această versiune a OSS (Open Sound System) nu este suportată de acest " "element" msgid "Master" msgstr "Principal" msgid "Front" msgstr "Față" msgid "Rear" msgstr "Spate" msgid "Headphones" msgstr "Căști" msgid "Center" msgstr "Centru" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Lateral" msgid "Built-in Speaker" msgstr "Boxe integrate" msgid "AUX 1 Out" msgstr "Ieșire AUX 1" msgid "AUX 2 Out" msgstr "Ieșire AUX 2" msgid "AUX Out" msgstr "Ieșire AUX" msgid "3D Depth" msgstr "Adâncime 3D" msgid "3D Center" msgstr "Centru 3D" msgid "3D Enhance" msgstr "Îmbunătățire 3D" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Linie ieșire" msgid "Line In" msgstr "Linie intrare" msgid "Internal CD" msgstr "CD intern" msgid "Video In" msgstr "Intrare video" msgid "AUX 1 In" msgstr "Intrare AUX 1" msgid "AUX 2 In" msgstr "Intrare AUX 2" msgid "AUX In" msgstr "Intrare AUX" msgid "Record Gain" msgstr "Câștig înregistrare" msgid "Output Gain" msgstr "Câștig ieșire" msgid "Microphone Boost" msgstr "Amplificare microfon" msgid "Loopback" msgstr "Buclă" msgid "Diagnostic" msgstr "Diagnostic" msgid "Bass Boost" msgstr "Amplificare bas" msgid "Playback Ports" msgstr "Porturi redare" msgid "Input" msgstr "Intrare" msgid "Record Source" msgstr "Sursă înregistrare" msgid "Monitor Source" msgstr "Sursă monitor" msgid "Keyboard Beep" msgstr "Bip tastatură" msgid "Simulate Stereo" msgstr "Simulează stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Sunet surround" msgid "Microphone Gain" msgstr "Câștig microfon" msgid "Speaker Source" msgstr "Sursă difuzor" msgid "Microphone Source" msgstr "Sursă microfon" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Centru / LFE" msgid "Stereo Mix" msgstr "Stereo Mix" msgid "Mono Mix" msgstr "Mono Mix" msgid "Input Mix" msgstr "Mix intrare" msgid "SPDIF In" msgstr "Intrare SPDIF" msgid "SPDIF Out" msgstr "Ieșire SPDIF" msgid "Microphone 1" msgstr "Microfon 1" msgid "Microphone 2" msgstr "Microfon 2" msgid "Digital Out" msgstr "Ieșire digitală" msgid "Digital In" msgstr "Intrare digitală" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Căști" msgid "Other" msgstr "Altul" msgid "None" msgstr "Niciunul" msgid "On" msgstr "Activat" msgid "Off" msgstr "Dezactivat" msgid "Mute" msgstr "Mut" msgid "Fast" msgstr "Rapid" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Foarte scăzută" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Scăzută" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medie" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Ridicată" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Foarte ridicată" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Producție" msgid "Front Panel Microphone" msgstr "Microfon panou frontal" msgid "Front Panel Line In" msgstr "Linie intrare panou frontal" msgid "Front Panel Headphones" msgstr "Căști panou frontal" msgid "Front Panel Line Out" msgstr "Linie ieșire panou frontal" msgid "Green Connector" msgstr "Conector verde" msgid "Pink Connector" msgstr "Conector roz" msgid "Blue Connector" msgstr "Conector albastru" msgid "White Connector" msgstr "Conector alb" msgid "Black Connector" msgstr "Conector negru" msgid "Gray Connector" msgstr "Conector gri" msgid "Orange Connector" msgstr "Conector portocaliu" msgid "Red Connector" msgstr "Conector roșu" msgid "Yellow Connector" msgstr "Conector galben" msgid "Green Front Panel Connector" msgstr "Conector verde panou frontal" msgid "Pink Front Panel Connector" msgstr "Conector roz panou frontal" msgid "Blue Front Panel Connector" msgstr "Conector albastru panou frontal" msgid "White Front Panel Connector" msgstr "Conector alb panou frontal" msgid "Black Front Panel Connector" msgstr "Conector negru panou frontal" msgid "Gray Front Panel Connector" msgstr "Conector gri panou frontal" msgid "Orange Front Panel Connector" msgstr "Conector portocaliu panou frontal" msgid "Red Front Panel Connector" msgstr "Conector roșu panou frontal" msgid "Yellow Front Panel Connector" msgstr "Conector galben panou frontal" msgid "Spread Output" msgstr "Împarte ieșirea" msgid "Downmix" msgstr "Mixaj redus" msgid "Virtual Mixer Input" msgstr "Intrare mixer video" msgid "Virtual Mixer Output" msgstr "Ieșire mixer video" msgid "Virtual Mixer Channels" msgstr "Canale mixer video" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Funcție %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Funcție %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nu s-a putut deschide dispozitivul audio pentru redare. Versiunea aceasta a " "OSS (Open Sound System) nu este suportată de acest element." msgid "Playback is not supported by this audio device." msgstr "Redarea nu este suportată de acest dispozitiv audio." msgid "Audio playback error." msgstr "Eroare redare audio." msgid "Recording is not supported by this audio device." msgstr "Înregistrarea nu este suportată de acest dispozitiv audio." msgid "Error recording from audio device." msgstr "Eroare la înregistrarea de la dispozitivul audio." msgid "Gain" msgstr "Amplificare" msgid "Headphone" msgstr "Căști" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Eroare citire %d octeți de la dispozitivul „%s”." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "S-a obținut o dimensiune neașteptată pentru cadru, %u în loc de %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Eroare citire %d octeți pe dispozitivul „%s”." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Eroare la obținerea capabilităților pentru dispozitivul „%s”: Nu este un " "driver v4l2. Verificați dacă este un driver v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Interogarea atributelor de intrare %d pentru dispozitivul %s a eșuat" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "A eșuat obținerea configurării receptorului %d pentru dispozitivul „%s”." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Interogarea normei pentru dispozitivul „%s” a eșuat." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Obținerea atributelor de control pentru dispozitivul „%s” a eșuat." #, c-format msgid "Cannot identify device '%s'." msgstr "Dispozitivul „%s” nu poate fi identificat." #, c-format msgid "This isn't a device '%s'." msgstr "Acesta nu este un dispozitiv „%s”." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nu se poate deschide dispozitivul „%s” pentru citire și scriere." #, c-format msgid "Device '%s' is not a capture device." msgstr "Dispozitivul „%s” nu este un dispozitiv de captură." #, c-format msgid "Device '%s' is not a output device." msgstr "Dispozitivul „%s” nu este un dispozitiv de ieșire." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Definirea normei pentru dispozitivul „%s” a eșuat." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Obținerea frecvenței curent a receptorului pentru dispozitivul „%s” a eșuat." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Definirea frecvenței curent a receptorului pentru dispozitivul „%s” la %lu " "Hz a eșuat." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Obținerea nivelului semnalului pentru dispozitivul „%s” a eșuat." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Obținerea valorii %d pentru dispozitivul „%s” a eșuat." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Definirii valorii %d pentru controlul %d al dispozitivul „%s” a eșuat." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Obținerea intrări curente pentru dispozitivul „%s” a eșuat. Posibil să fie " "un dispozitiv radio." #, c-format msgid "Failed to set input %d on device %s." msgstr "Definirea valorii %d pentru dispozitivul „%s” a eșuat." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Obținerea intrări curente pentru dispozitivul „%s” a eșuat. Posibil să fie " "un dispozitiv radio." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Definirea valorii %d pentru dispozitivul „%s” a eșuat." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nu s-a putut programa memoria tampon în dispozitivul „%s”." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Obținerea cadrelor video pentru dispozitivul „%s” a eșuat." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "A eșuat după %d încercări. dispozitiv %s. eroare sistem: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nu s-au putut obține parametrii pentru dispozitivul „%s”" msgid "Video input device did not accept new frame rate setting." msgstr "" "Dispozitivul de intrare video nu a acceptat noua configurare de rate cadre." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nu s-a putut mapa memoria tampon din dispozitivul „%s”" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Driverul pentru dispozitivul „%s” nu suport nici o metodă de captură " "cunoscută." msgid "Changing resolution at runtime is not yet supported." msgstr "Schimbarea rezoluției pe durata rulării nu este incă suportată." msgid "Cannot operate without a clock" msgstr "Nu se poate opera fără un ceas" gst-plugins-good-0.10.31/po/hu.po0000644000175000017500000003767611720565342013421 00000000000000# Hungarian translation of gst-plugins-good # This file is distributed under the same license as the gst-plugins-good package. # Copyright (C) 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. # # Laszlo Dvornik , 2004. # Gabor Kelemen , 2007, 2008, 2009, 2010. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.25.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-11-04 01:21+0100\n" "Last-Translator: Gabor Kelemen \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Rosetta-Export-Date: 2007-07-27 19:18:15+0000\n" "X-Generator: KBabel 1.11.4\n" "X-Rosetta-Export-Date: 2007-07-27 19:18:15+0000\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "Nem hozható létre kapcsolat a hangkiszolgálóhoz" msgid "Failed to query sound server capabilities" msgstr "A hangkiszolgáló képességeinek lekérdezése meghiúsult" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "„%s” ettől: „%s”" msgid "Internal data stream error." msgstr "Belső adatfolyam-hiba." msgid "Failed to decode JPEG image" msgstr "A JPEG kép visszafejtése meghiúsult" msgid "Could not connect to server" msgstr "Nem lehet csatlakozni a kiszolgálóhoz" msgid "Server does not support seeking." msgstr "A kiszolgáló nem támogatja a tekerést." msgid "Could not resolve server name." msgstr "Nem lehet feloldani a kiszolgáló nevét." msgid "Could not establish connection to server." msgstr "Nem hozható létre kapcsolat a kiszolgálóhoz." msgid "Secure connection setup failed." msgstr "A biztonságos kapcsolat kialakítása meghiúsult." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Hálózati hiba történt, vagy a kiszolgáló váratlanul lezárta a kapcsolatot." msgid "Server sent bad data." msgstr "A kiszolgáló hibás adatokat küldött." msgid "No URL set." msgstr "Nincs beállítva URL." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Nincs vagy érvénytelen bemeneti hang, az AVI-folyam sérült lesz." msgid "This file contains no playable streams." msgstr "A fájl nem tartalmaz lejátszható adatfolyamokat." msgid "This file is invalid and cannot be played." msgstr "A fájl nem érvényes és nem játszható le." msgid "This file is corrupt and cannot be played." msgstr "A fájl sérült és nem játszható le." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "A fájl nem teljes és nem játszható le." msgid "The video in this file might not play correctly." msgstr "A fájlban található videó lehet, hogy nem játszható le megfelelően." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "A fájl túl sok adatfolyamot tartalmaz. Csak az első %d kerül lejátszásra." msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nem található támogatott adatfolyam. Telepítse a GStreamer RTSP bővítményt a " "Real media adatfolyamokhoz." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nem található támogatott adatfolyam. Lehet, hogy több átviteli protokollt " "kell engedélyezni, vagy hiányzik a megfelelő GStreamer RTSP bővítmény." msgid "Internal data flow error." msgstr "Belső adatfolyam-hiba." msgid "Volume" msgstr "Hangerő" msgid "Bass" msgstr "Basszus" msgid "Treble" msgstr "Magas" msgid "Synth" msgstr "Szintet." msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Hangfal" msgid "Line-in" msgstr "Vonalbemenet" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Keverő" msgid "PCM-2" msgstr "2. PCM" msgid "Record" msgstr "Felvétel" msgid "In-gain" msgstr "Be-erősítés" msgid "Out-gain" msgstr "Ki-erősítés" msgid "Line-1" msgstr "1. vonal" msgid "Line-2" msgstr "2. vonal" msgid "Line-3" msgstr "3. vonal" msgid "Digital-1" msgstr "1. digitális" msgid "Digital-2" msgstr "2. digitális" msgid "Digital-3" msgstr "3. digitális" msgid "Phone-in" msgstr "Hang-be" msgid "Phone-out" msgstr "Hang-ki" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Rádió" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Nem nyitható meg hangeszköz a lejátszáshoz. Az eszközt másik alkalmazás " "használja." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Nem nyitható meg hangeszköz a lejátszáshoz. Nincs jogosultsága az eszköz " "megnyitására." msgid "Could not open audio device for playback." msgstr "Nem nyitható meg hangeszköz a lejátszáshoz." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Nem nyitható meg hangeszköz a felvételhez. Nincs jogosultsága az eszköz " "megnyitására." msgid "Could not open audio device for recording." msgstr "Nem nyitható meg hangeszköz a felvételhez." msgid "Could not open audio device for mixer control handling." msgstr "Nem nyitható meg hangeszköz a keverővezérlő kezeléséhez." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nem nyitható meg hangeszköz a keverővezérlő kezeléséhez. Az Open Sound " "System ezen verzióját az elem nem támogatja." msgid "Master" msgstr "Fő hangerő" msgid "Front" msgstr "Elülső" msgid "Rear" msgstr "Hátsó" msgid "Headphones" msgstr "Fülhallgató" msgid "Center" msgstr "Középső" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Térhatású" msgid "Side" msgstr "Oldalsó" msgid "Built-in Speaker" msgstr "Beépített hangszóró" msgid "AUX 1 Out" msgstr "1. AUX ki" msgid "AUX 2 Out" msgstr "2. AUX ki" msgid "AUX Out" msgstr "AUX ki" msgid "3D Depth" msgstr "3D mély" msgid "3D Center" msgstr "3D középső" msgid "3D Enhance" msgstr "3D javítás" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Vonalkimenet" msgid "Line In" msgstr "Vonalbemenet" msgid "Internal CD" msgstr "Belső CD" msgid "Video In" msgstr "Video be" msgid "AUX 1 In" msgstr "1. AUX be" msgid "AUX 2 In" msgstr "2. AUX be" msgid "AUX In" msgstr "AUX be" msgid "Record Gain" msgstr "Felvételerősítés" msgid "Output Gain" msgstr "Kimeneterősítés" msgid "Microphone Boost" msgstr "Mikrofonerősítés" msgid "Loopback" msgstr "Visszacsatolás" msgid "Diagnostic" msgstr "Diagnosztika" msgid "Bass Boost" msgstr "Basszuskiemelés" msgid "Playback Ports" msgstr "Lejátszási portok" msgid "Input" msgstr "Bemenet" msgid "Record Source" msgstr "Felvétel forrása" msgid "Monitor Source" msgstr "Monitor forrása" msgid "Keyboard Beep" msgstr "Billentyűzetcsengő" msgid "Simulate Stereo" msgstr "Sztereó szimulálása" msgid "Stereo" msgstr "Sztereó" msgid "Surround Sound" msgstr "Térhatású hang" msgid "Microphone Gain" msgstr "Mikrofonerősítés" msgid "Speaker Source" msgstr "Hangfalforrás" msgid "Microphone Source" msgstr "Mikrofonforrás" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Középső / LFE" msgid "Stereo Mix" msgstr "Sztereó keverés" msgid "Mono Mix" msgstr "Monó keverés" msgid "Input Mix" msgstr "Bemeneti keverés" msgid "SPDIF In" msgstr "SPDIF be" msgid "SPDIF Out" msgstr "SPDIF ki" msgid "Microphone 1" msgstr "1. mikrofon" msgid "Microphone 2" msgstr "2. mikrofon" msgid "Digital Out" msgstr "Digitális ki" msgid "Digital In" msgstr "Digitális be" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Mobiltelefon" msgid "Other" msgstr "Egyéb" msgid "None" msgstr "Nincs" msgid "On" msgstr "Be" msgid "Off" msgstr "Ki" msgid "Mute" msgstr "Némítás" msgid "Fast" msgstr "Gyors" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Nagyon alacsony" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Alacsony" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Közepes" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Magas" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Nagyon magas" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Éles" msgid "Front Panel Microphone" msgstr "Előlapi mikrofon" msgid "Front Panel Line In" msgstr "Előlapi vonalbemenet" msgid "Front Panel Headphones" msgstr "Előlapi fülhallgató" msgid "Front Panel Line Out" msgstr "Előlapi vonalkimenet" msgid "Green Connector" msgstr "Zöld csatlakozó" msgid "Pink Connector" msgstr "Rózsaszín csatlakozó" msgid "Blue Connector" msgstr "Kék csatlakozó" msgid "White Connector" msgstr "Fehér csatlakozó" msgid "Black Connector" msgstr "Fekete csatlakozó" msgid "Gray Connector" msgstr "Szürke csatlakozó" msgid "Orange Connector" msgstr "Narancs csatlakozó" msgid "Red Connector" msgstr "Vörös csatlakozó" msgid "Yellow Connector" msgstr "Sárga csatlakozó" msgid "Green Front Panel Connector" msgstr "Zöld előoldali csatlakozó" msgid "Pink Front Panel Connector" msgstr "Rózsaszín előoldali csatlakozó" msgid "Blue Front Panel Connector" msgstr "Kék előoldali csatlakozó" msgid "White Front Panel Connector" msgstr "Fehér előoldali csatlakozó" msgid "Black Front Panel Connector" msgstr "Fekete előoldali csatlakozó" msgid "Gray Front Panel Connector" msgstr "Szürke előoldali csatlakozó" msgid "Orange Front Panel Connector" msgstr "Narancs előoldali csatlakozó" msgid "Red Front Panel Connector" msgstr "Vörös előoldali csatlakozó" msgid "Yellow Front Panel Connector" msgstr "Sárga előoldali csatlakozó" msgid "Spread Output" msgstr "Szóráskimenet" msgid "Downmix" msgstr "Lekeverés" msgid "Virtual Mixer Input" msgstr "Virtuális keverőbemenet" msgid "Virtual Mixer Output" msgstr "Virtuális keverőkimenet" msgid "Virtual Mixer Channels" msgstr "Virtuális keverőcsatornák" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d funkció" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funkció" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nem nyitható meg hangeszköz a lejátszáshoz. Az Open Sound System ezen " "verzióját az elem nem támogatja." msgid "Playback is not supported by this audio device." msgstr "Ez a hangeszköz nem támogatja a lejátszást." msgid "Audio playback error." msgstr "Hanglejátszási hiba." msgid "Recording is not supported by this audio device." msgstr "Ez a hangeszköz nem támogatja a felvételt." msgid "Error recording from audio device." msgstr "Hiba a hangeszközről való felvételkor." msgid "Gain" msgstr "Erősítés" msgid "Headphone" msgstr "Fejhallgató" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Hiba %d bájt olvasásakor a következő eszközről: „%s”." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Váratlan keretméret (%u) érkezett %u helyett." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Hiba %d bájt olvasásakor a következő eszközről: „%s”." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "hiba a(z) „%s” eszköz képességeinek lekérésekor. Ez nem egy v4l2 meghajtó. " "Ellenőrizze, hogy nem v4l1 meghajtó-e." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "A(z) %d bemenet attribútumainak lekérése meghiúsult a(z) %s eszközön" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "A(z) %d. tuner beállításának lekérése a(z) „%s” eszközön meghiúsult." #, c-format msgid "Failed to query norm on device '%s'." msgstr "A norma lekérdezése meghiúsult a(z) „%s” eszköztől." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "A vezérlőattribútumok lekérése meghiúsult a(z) „%s” eszközön." #, c-format msgid "Cannot identify device '%s'." msgstr "Nem azonosítható a(z) „%s” eszköz." #, c-format msgid "This isn't a device '%s'." msgstr "Ez nem egy eszköz: „%s”." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nem lehet olvasásra és írásra megnyitni a(z) „%s” eszközt." #, c-format msgid "Device '%s' is not a capture device." msgstr "A(z) „%s” eszköz nem rögzítőeszköz." #, c-format msgid "Device '%s' is not a output device." msgstr "A(z) „%s” eszköz nem kimeneti eszköz." #, c-format msgid "Failed to set norm for device '%s'." msgstr "A norma beállítása meghiúsult a(z) „%s” eszközön." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "A tuner aktuális frekvenciájának lekérdezése meghiúsult a(z) „%s” eszköztől." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "A tuner aktuális frekvenciájának beállítása meghiúsult a(z) „%s” eszközön " "%lu Hz-re." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "A jelerősség lekérdezése meghiúsult a(z) „%s” eszközön." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "A(z) %d. vezérlőelem értékének lekérése meghiúsult a(z) „%s” eszközön." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "A(z) $%2d érték beállítása $%1d vezérlőelemhez meghiúsult a(z) „%s” eszközön." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Az aktuális bemenet lekérése meghiúsult a(z) „%s” eszközről. Lehet, hogy ez " "egy rádióeszköz." #, c-format msgid "Failed to set input %d on device %s." msgstr "A(z) %d. bemenet beállítása meghiúsult a(z) „%s” eszközön." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Az aktuális bemenet lekérése meghiúsult a(z) „%s” eszközről. Lehet, hogy ez " "egy rádióeszköz." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "A(z) %d. bemenet beállítása meghiúsult a(z) „%s” eszközön." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nem állíthatók sorba a pufferek a(z) „%s” eszközben." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Nem sikerült videokockákat lekérni a(z) „%s” eszköztől." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Hiba %d próbálkozás után. Eszköz: %s. Rendszerhiba: %s." #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nem kérhetők le a(z) „%s” eszköz paraméterei" msgid "Video input device did not accept new frame rate setting." msgstr "" "A videobemeneti eszköz nem fogadta el az új képkockasebesség-beállítást." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nem képezhetők le a(z) „%s” eszköz pufferei" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "A(z) „%s” eszköz illesztőprogramja nem támogat egyetlen ismert felvételi " "módot sem." msgid "Changing resolution at runtime is not yet supported." msgstr "A felbontás módosítása futás közben még nem támogatott." msgid "Cannot operate without a clock" msgstr "Óra nélkül lehetetlen a működés" gst-plugins-good-0.10.31/po/Rules-quot0000644000175000017500000000337611720560210014423 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header gst-plugins-good-0.10.31/po/zh_CN.po0000644000175000017500000003675411720565342014002 00000000000000# Chinese (simplified) translation about gst-plugins-good. # This file is put in the public domain. # Funda Wang , 2005. # Ji ZhengYu , 2008, 2009 # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.16.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2009-11-13 22:20+0800\n" "Last-Translator: Ji ZhengYu \n" "Language-Team: Chinese (simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "无法建立与音频服务器的连接" msgid "Failed to query sound server capabilities" msgstr "查寻音频服务器的服务失败" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "‘%s’ 由 ‘%s’" msgid "Internal data stream error." msgstr "内部数据流错误。" msgid "Failed to decode JPEG image" msgstr "解码 JPEG 图像出错" msgid "Could not connect to server" msgstr "无法连接至服务器" #, fuzzy msgid "Server does not support seeking." msgstr "设备‘%s’不支持视频捕获" #, fuzzy msgid "Could not resolve server name." msgstr "无法连接至服务器" #, fuzzy msgid "Could not establish connection to server." msgstr "无法建立与音频服务器的连接" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "没有或无效的输入音频,AVI 流将损坏。" msgid "This file contains no playable streams." msgstr "此文件不包含可播放的流。" msgid "This file is invalid and cannot be played." msgstr "此文件无效,无法播放。" msgid "This file is corrupt and cannot be played." msgstr "此文件已损坏,无法播放。" msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "此文件不完整且无法播放。" msgid "The video in this file might not play correctly." msgstr "此文件中的视频可能无法正确播放。" #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "此文件包含了太多的流。只播放前面 %d 个" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "未找到支持的流媒体。您可能需要安装一个 GStreamer RTSP 扩展插件来播放 Real 媒" "体流。" msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "未找到支持的流媒体。您可能需要启用更多的传送协议,或者也有可能是缺少正确的 " "GStreamer RTSP 扩展插件。" msgid "Internal data flow error." msgstr "内部数据流错误。" msgid "Volume" msgstr "音量" msgid "Bass" msgstr "低音(Bass)" msgid "Treble" msgstr "高音(Treble)" msgid "Synth" msgstr "合成器" msgid "PCM" msgstr "波形(PCM)" msgid "Speaker" msgstr "扬声器(Speaker)" msgid "Line-in" msgstr "线路输入(Line-in)" msgid "Microphone" msgstr "话筒" msgid "CD" msgstr "CD 音频" msgid "Mixer" msgstr "混音器" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "录音" msgid "In-gain" msgstr "输入增益" msgid "Out-gain" msgstr "输出增益" msgid "Line-1" msgstr "线路1" msgid "Line-2" msgstr "线路2" msgid "Line-3" msgstr "线路3" msgid "Digital-1" msgstr "数字线路1" msgid "Digital-2" msgstr "数字线路2" msgid "Digital-3" msgstr "数字线路3" msgid "Phone-in" msgstr "话筒输入" msgid "Phone-out" msgstr "话筒输出" msgid "Video" msgstr "视频" msgid "Radio" msgstr "广播" msgid "Monitor" msgstr "监控器" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "无法打开音频设备播放音频。设备当前由另一个程序使用。" msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "无法打开音频设备播放音频。您无权使用这一设备。" msgid "Could not open audio device for playback." msgstr "无法打开音频设备播放音频。" msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "无法打开音频设备录音。您无权使用这一设备。" msgid "Could not open audio device for recording." msgstr "无法打开音频设备录音。" #, fuzzy msgid "Could not open audio device for mixer control handling." msgstr "无法打开音频设备录音。" #, fuzzy msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "无法打开音频设备录音。您无权使用这一设备。" msgid "Master" msgstr "" msgid "Front" msgstr "" msgid "Rear" msgstr "" #, fuzzy msgid "Headphones" msgstr "头戴式耳机" msgid "Center" msgstr "" msgid "LFE" msgstr "" msgid "Surround" msgstr "" msgid "Side" msgstr "" msgid "Built-in Speaker" msgstr "内建扬声器" msgid "AUX 1 Out" msgstr "AUX 1 输出" msgid "AUX 2 Out" msgstr "AUX 2 输出" #, fuzzy msgid "AUX Out" msgstr "AUX 1 输出" msgid "3D Depth" msgstr "" msgid "3D Center" msgstr "" msgid "3D Enhance" msgstr "" #, fuzzy msgid "Telephone" msgstr "头戴式耳机" msgid "Line Out" msgstr "线路输出" #, fuzzy msgid "Line In" msgstr "线路输入(Line-in)" msgid "Internal CD" msgstr "" #, fuzzy msgid "Video In" msgstr "视频" #, fuzzy msgid "AUX 1 In" msgstr "AUX 1 输出" #, fuzzy msgid "AUX 2 In" msgstr "AUX 2 输出" msgid "AUX In" msgstr "" #, fuzzy msgid "Record Gain" msgstr "录音" msgid "Output Gain" msgstr "" #, fuzzy msgid "Microphone Boost" msgstr "话筒" msgid "Loopback" msgstr "" msgid "Diagnostic" msgstr "" msgid "Bass Boost" msgstr "" msgid "Playback Ports" msgstr "" msgid "Input" msgstr "" #, fuzzy msgid "Record Source" msgstr "录音" #, fuzzy msgid "Monitor Source" msgstr "监控器" msgid "Keyboard Beep" msgstr "" msgid "Simulate Stereo" msgstr "" msgid "Stereo" msgstr "" msgid "Surround Sound" msgstr "" #, fuzzy msgid "Microphone Gain" msgstr "话筒" #, fuzzy msgid "Speaker Source" msgstr "扬声器(Speaker)" #, fuzzy msgid "Microphone Source" msgstr "话筒" msgid "Jack" msgstr "" msgid "Center / LFE" msgstr "" msgid "Stereo Mix" msgstr "" msgid "Mono Mix" msgstr "" msgid "Input Mix" msgstr "" #, fuzzy msgid "SPDIF In" msgstr "SPDIF 输出" msgid "SPDIF Out" msgstr "SPDIF 输出" #, fuzzy msgid "Microphone 1" msgstr "话筒" #, fuzzy msgid "Microphone 2" msgstr "话筒" #, fuzzy msgid "Digital Out" msgstr "数字线路1" #, fuzzy msgid "Digital In" msgstr "数字线路1" msgid "HDMI" msgstr "" msgid "Modem" msgstr "" msgid "Handset" msgstr "" msgid "Other" msgstr "" msgid "None" msgstr "" msgid "On" msgstr "" msgid "Off" msgstr "" msgid "Mute" msgstr "" msgid "Fast" msgstr "" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "" #, fuzzy msgid "Front Panel Microphone" msgstr "话筒" msgid "Front Panel Line In" msgstr "" msgid "Front Panel Headphones" msgstr "" msgid "Front Panel Line Out" msgstr "" msgid "Green Connector" msgstr "" msgid "Pink Connector" msgstr "" msgid "Blue Connector" msgstr "" msgid "White Connector" msgstr "" msgid "Black Connector" msgstr "" msgid "Gray Connector" msgstr "" msgid "Orange Connector" msgstr "" msgid "Red Connector" msgstr "" msgid "Yellow Connector" msgstr "" msgid "Green Front Panel Connector" msgstr "" msgid "Pink Front Panel Connector" msgstr "" msgid "Blue Front Panel Connector" msgstr "" msgid "White Front Panel Connector" msgstr "" msgid "Black Front Panel Connector" msgstr "" msgid "Gray Front Panel Connector" msgstr "" msgid "Orange Front Panel Connector" msgstr "" msgid "Red Front Panel Connector" msgstr "" msgid "Yellow Front Panel Connector" msgstr "" msgid "Spread Output" msgstr "" msgid "Downmix" msgstr "" msgid "Virtual Mixer Input" msgstr "" msgid "Virtual Mixer Output" msgstr "" msgid "Virtual Mixer Channels" msgstr "" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "" #, fuzzy msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "无法打开音频设备播放音频。您无权使用这一设备。" msgid "Playback is not supported by this audio device." msgstr "" msgid "Audio playback error." msgstr "" msgid "Recording is not supported by this audio device." msgstr "" #, fuzzy msgid "Error recording from audio device." msgstr "从设备‘%2$s’中读取 %1$d 个字节时出错。" msgid "Gain" msgstr "增益" msgid "Headphone" msgstr "头戴式耳机" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "从设备‘%2$s’中读取 %1$d 个字节时出错。" #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "取得了 %u 的不需要的帧大小,而不是 %u。" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "读取设备‘%2$s’中的 %1$d 字节时出错。" #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "获取设备‘%s’的信息时出错:它不是一个 v4l2 驱动器,请检查是否为 v4l1。" #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "查寻设备 %2$s 中的输入 %1$d 的属性时出错" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "获取设备 %2$s 上的微调钮 %1$d 的设置时出错" #, fuzzy, c-format msgid "Failed to query norm on device '%s'." msgstr "查寻设备 ‘%s’上的基准时出错。" #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "获取设备‘%s’上的控制属性时出错。" #, c-format msgid "Cannot identify device '%s'." msgstr "无法确认设备‘%s’。" #, c-format msgid "This isn't a device '%s'." msgstr "不是设备‘%s’。" #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "无法打开设备‘%s’读写。" #, c-format msgid "Device '%s' is not a capture device." msgstr "‘%s’不是一个捕获设备。" #, c-format msgid "Device '%s' is not a output device." msgstr "‘%s’不是输出设备。" #, fuzzy, c-format msgid "Failed to set norm for device '%s'." msgstr "设置设备‘%s’的基准时出错。" #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "获取设备‘%s’的当前微调钮频率时出错。" #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "设置设备‘%s’的当前微调钮频率为 %lu Hz 时出错。" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "获取设备‘%s’的信号长度时出错。" #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "获取设备‘%2$s’的控制器 %1$d 的值出错。" #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "设置设备‘%3$s’的控制器 %2$d 的值为 %1$d 时出错。" #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "获取设备‘%s’上的当前输入出错。也许它是一个广播设备" #, c-format msgid "Failed to set input %d on device %s." msgstr "设置设备 %2$s 上的输入 %1$d 时出错。" #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "获取设备‘%s’上的当前输入出错。也许它是一个广播设备" #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "设置设备 %2$s 上的输入 %1$d 时出错。" #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "无法对设备‘%s’中的缓冲区进行排序。" #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "从设备‘%s’上获取视频的尝试失败了。" #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "在 %d 次尝试后失败。设备 %s。系统错误: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "无法获取设备‘%s’的参数" msgid "Video input device did not accept new frame rate setting." msgstr "视频输入设备不接受新的帧率设置。" #, c-format msgid "Could not map buffers from device '%s'" msgstr "无法从设备‘%s’中映射出缓冲区" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "设备‘%s’的驱动不支持任何已知的捕获方式。" msgid "Changing resolution at runtime is not yet supported." msgstr "尚不支持在运行时更改分辨率。" msgid "Cannot operate without a clock" msgstr "没有时钟的话无法操作" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "枚举设备‘%s’可能支持的视频格式时出错" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "不支持的缓冲区类型,或者索引超出范围了,或是还未分配缓冲区,或非法的用户指" #~ "针或长度。设备 %s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "从设备‘%s’上获取视频的尝试失败了。没有足够的内存。" #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "内存不足无法对用户指针缓冲区进行排序。设备 %s。" #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "在内存池中 %d 处没有可分配的缓冲区。" #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "设备‘%s’不能在 %dx%d 处捕获" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "设备‘%s’无法以指定格式捕获" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "无法从设备‘%s’中获取缓冲区。" #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "无法从设备‘%s’中获取足够的缓冲区。" #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "从设备‘%s’中启用流捕获时出错。" #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "从设备‘%s’中停止流捕获时出错。" #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "获取设备‘%s’上的控制属性时出错。" #~ msgid "Could not read from CD." #~ msgstr "无法从 CD 中读取。" #~ msgid "Disc is not an Audio CD." #~ msgstr "非音频 CD 盘。" #~ msgid "This file is encrypted and cannot be played." #~ msgstr "此文件已加密,无法播放。" gst-plugins-good-0.10.31/po/sk.po0000644000175000017500000005474611720565342013417 00000000000000# Slovak translations for gst-plugins-good. # This file is put in the public domain. # # Peter Tuhársky , 2007, 2008, 2009. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.25.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-11-08 15:48+0100\n" "Last-Translator: Peter Tuhársky \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\\n\n" "X-Generator: KBabel 1.11.4\n" "X-Poedit-Country: SLOVAKIA\n" msgid "Could not establish connection to sound server" msgstr "Nepodarilo sa nadviazať spojenie so zvukovým serverom" msgid "Failed to query sound server capabilities" msgstr "Nepodarilo sa zistiť schopnosti zvukového servera" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' od '%s'" msgid "Internal data stream error." msgstr "Vnútorná chyba prúdu údajov." msgid "Failed to decode JPEG image" msgstr "Nepodarilo sa dekódovať obrázok JPEG" msgid "Could not connect to server" msgstr "Nepodarilo sa pripojiť k serveru" msgid "Server does not support seeking." msgstr "Server nepodporuje zmenu pozície" msgid "Could not resolve server name." msgstr "Nepodarilo sa preložiť názov servera." msgid "Could not establish connection to server." msgstr "Nepodarilo sa nadviazať spojenie so serverom" msgid "Secure connection setup failed." msgstr "Nastavenie bezpečného pripojenia zlyhalo." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "Vyskytla sa sieťová chyba, alebo server neočakávane uzavrel spojenie." msgid "Server sent bad data." msgstr "Server odoslal chybné údaje." msgid "No URL set." msgstr "Nebolo nastavené URL." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Žiadny alebo chybný vstup zvuku, prúd údajov AVI bude poškodený." msgid "This file contains no playable streams." msgstr "Tento súbor neobsahuje žiadne prehrateľné prúdy údajov." msgid "This file is invalid and cannot be played." msgstr "Tento súbor je chybný a nedá sa prehrať." msgid "This file is corrupt and cannot be played." msgstr "Tento súbor je poškodený a nedá sa prehrať." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Tento súbor je neúplný a nedá sa prehrať." msgid "The video in this file might not play correctly." msgstr "Video v tomto súbore možno nebude hrať korektne." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Tento súbor obsahuje príliš mnoho prúdov údajov. Prehrávam iba prvý %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Nenašiel sa žiaden podporovaný prúd údajov. Možno je potrebné nainštalovať " "zásuvný modul GStreamer RTSP pre prúdy Real media.." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Nenašiel sa žiaden podporovaný prúd údajov. Možno by ste mali povoliť " "viacero prenosových protokolov, alebo vám možno chýba správny zásuvný modul " "GStreamer RTSP." msgid "Internal data flow error." msgstr "Vnútorná chyba toku údajov." msgid "Volume" msgstr "Hlasitosť" msgid "Bass" msgstr "Basy" msgid "Treble" msgstr "Výšky" msgid "Synth" msgstr "Syntetizér" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Reproduktor" msgid "Line-in" msgstr "Linkový vstup" msgid "Microphone" msgstr "Mikrofón" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixér" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Nahrávanie" msgid "In-gain" msgstr "Vstupný zisk" msgid "Out-gain" msgstr "Výstupný zisk" msgid "Line-1" msgstr "Linka-1" msgid "Line-2" msgstr "Linka-2" msgid "Line-3" msgstr "Linka-3" msgid "Digital-1" msgstr "Digitál-1" msgid "Digital-2" msgstr "Digitál-2" msgid "Digital-3" msgstr "Digitál-3" msgid "Phone-in" msgstr "Telefón-vstup" msgid "Phone-out" msgstr "Telefón-výstup" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Rádio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Zariadenie už " "používa iná aplikácia." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Nemáte " "oprávnenie na otvorenie tohto zariadenia." msgid "Could not open audio device for playback." msgstr "Nepodarilo sa otvoriť zvukové zariadenie vrežime prehrávania." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Nepodarilo sa otvoriť zvukové zariadenie v režime záznamu. Nemáte oprávnenie " "na otvorenie tohto zariadenia." msgid "Could not open audio device for recording." msgstr "Nepodarilo sa otvoriť zvukové zariadenie v režime záznamu." msgid "Could not open audio device for mixer control handling." msgstr "Nepodarilo sa otvoriť zvukové zariadenie v režime obsluhy mixéru." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Nepodarilo sa otvoriť zvukové zariadenie v režime obsluhy mixéru. Táto " "verzia Open Sound System nie je podporovaná týmto prvkom." msgid "Master" msgstr "Hlavný" msgid "Front" msgstr "Predný" msgid "Rear" msgstr "Zadné" msgid "Headphones" msgstr "Slúchadlá" msgid "Center" msgstr "Stredný" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Priestorový" msgid "Side" msgstr "Strana" msgid "Built-in Speaker" msgstr "PC reproduktor" msgid "AUX 1 Out" msgstr "AUX 1 výstup" msgid "AUX 2 Out" msgstr "AUX 2 výstup" msgid "AUX Out" msgstr "AUX výstup" msgid "3D Depth" msgstr "3D hĺbka" msgid "3D Center" msgstr "3D stred" msgid "3D Enhance" msgstr "3D vylepšenie" msgid "Telephone" msgstr "Telefón" msgid "Line Out" msgstr "Linkový výstup" msgid "Line In" msgstr "Linkový vstup" msgid "Internal CD" msgstr "Vnútorne CD" msgid "Video In" msgstr "Video vstup" msgid "AUX 1 In" msgstr "AUX 1 vstup" msgid "AUX 2 In" msgstr "AUX 2 vstup" msgid "AUX In" msgstr "AUX vstup" msgid "Record Gain" msgstr "Zisk záznamu" msgid "Output Gain" msgstr "Výstupný zisk" msgid "Microphone Boost" msgstr "Zosilnenie mikrofónu" msgid "Loopback" msgstr "Spätná slučka" msgid "Diagnostic" msgstr "Diagnostika" msgid "Bass Boost" msgstr "Zvýraznenie basov" msgid "Playback Ports" msgstr "Prehrávacie porty" msgid "Input" msgstr "Vstup" msgid "Record Source" msgstr "Zdroj záznamu" msgid "Monitor Source" msgstr "Monitor zdroja" msgid "Keyboard Beep" msgstr "Pípnutie klávesnice" msgid "Simulate Stereo" msgstr "Simulovať stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Priestorový zvuk" msgid "Microphone Gain" msgstr "Zisk mikrofónu" msgid "Speaker Source" msgstr "Zdroj reproduktora" msgid "Microphone Source" msgstr "Zdroj mikrofónu" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Stred / LFE" msgid "Stereo Mix" msgstr "Stereo Mix" msgid "Mono Mix" msgstr "Mono Mix" msgid "Input Mix" msgstr "Vstup Mix" msgid "SPDIF In" msgstr "SPDIF vstup" msgid "SPDIF Out" msgstr "SPDIF výstup" msgid "Microphone 1" msgstr "Mikrofón 1" msgid "Microphone 2" msgstr "Mikrofón 2" msgid "Digital Out" msgstr "Digitálny výstup" msgid "Digital In" msgstr "Digitálny vstup" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "" msgid "Other" msgstr "Iné" msgid "None" msgstr "Nič" msgid "On" msgstr "Zapnuté" msgid "Off" msgstr "Vypnuté" msgid "Mute" msgstr "Stlmiť" msgid "Fast" msgstr "Rýchlo" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Veľmi nízke" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Nízke" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Stredné" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Vysoké" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Veľmi vysoké" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produkcia" msgid "Front Panel Microphone" msgstr "Mikrofón na prednom paneli" msgid "Front Panel Line In" msgstr "Linkový vstup na prednom paneli" msgid "Front Panel Headphones" msgstr "Slúchadlá na prednom paneli" msgid "Front Panel Line Out" msgstr "Linkový výstup na prednom paneli" msgid "Green Connector" msgstr "Zelený konektor" msgid "Pink Connector" msgstr "Ružový konektor" msgid "Blue Connector" msgstr "Modrý konektor" msgid "White Connector" msgstr "Biely konektor" msgid "Black Connector" msgstr "Čierny konektor" msgid "Gray Connector" msgstr "Šedý konektor" msgid "Orange Connector" msgstr "Oranžový konektor" msgid "Red Connector" msgstr "Červený konektor" msgid "Yellow Connector" msgstr "Žltý konektor" msgid "Green Front Panel Connector" msgstr "Zelený konektor na prednom paneli" msgid "Pink Front Panel Connector" msgstr "Ružový konektor na prednom paneli" msgid "Blue Front Panel Connector" msgstr "Modrý konektor na prednom paneli" msgid "White Front Panel Connector" msgstr "Biely konektor na prednom paneli" msgid "Black Front Panel Connector" msgstr "Čierny konektor na prednom paneli" msgid "Gray Front Panel Connector" msgstr "Šedý konektor na prednom paneli" msgid "Orange Front Panel Connector" msgstr "Oranžový konektor na prednom paneli" msgid "Red Front Panel Connector" msgstr "Červený konektor na prednom paneli" msgid "Yellow Front Panel Connector" msgstr "Žltý konektor na prednom paneli" msgid "Spread Output" msgstr "Rozdeliť výstup" msgid "Downmix" msgstr "Zmiešanie" msgid "Virtual Mixer Input" msgstr "Vstup virtuálneho mixéra" msgid "Virtual Mixer Output" msgstr "Výstup virtuálneho mixéra" msgid "Virtual Mixer Channels" msgstr "Kanály virtuálneho mixéra" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d funkcia" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funkcia" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Nepodarilo sa otvoriť zvukové zariadenie v režime prehrávania. Táto verzia " "Open Sound System nie je podporovaná týmto prvkom." msgid "Playback is not supported by this audio device." msgstr "Prehrávanie nie je podporované týmto zvukovým zariadením" msgid "Audio playback error." msgstr "Chyba prehrávania zvuku." msgid "Recording is not supported by this audio device." msgstr "Záznam nie je podporovaný týmto zvukovým zariadením." msgid "Error recording from audio device." msgstr "Chyba pri zázname zo zvukového zariadenia." msgid "Gain" msgstr "Zisk" msgid "Headphone" msgstr "Slúchadlá" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Chyba pri čítaní %d bajtov na zariadení '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Nastala neočakávaná veľkosť snímky %u namiesto %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Chyba pri čítaní %d bajtov na zariadení '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Chyba pri zisťovaní schopností zariadenia '%s': Toto nie je ovládač v4l2. " "Skontrolujte, či je to ovládač v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Nepodarilo sa získať atribúty vstupu %d zariadenia %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Nepodarilo sa získať nastavenie prijímača %d od zariadenia '%s'." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Zlyhala požiadavka norm na zariadení '%s'." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Nepodarilo sa získať atribúty ovládacích prvkov na zariadení '%s'." #, c-format msgid "Cannot identify device '%s'." msgstr "Neviem identifikovať zariadenie '%s'." #, c-format msgid "This isn't a device '%s'." msgstr "Toto nie je zariadenie '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Nepodarilo sa otvoriť zariadenie '%s' pre čítanie a zápis." #, c-format msgid "Device '%s' is not a capture device." msgstr "Zariadenie '%s' nie je určené pre zachytávanie." #, c-format msgid "Device '%s' is not a output device." msgstr "Zariadenie '%s' nie je určené pre výstup." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Zlyhalo nastavenie norm na zariadení '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Nepodarilo sa zistiť súčasnú frekvenciu prijímača pre zariadenie '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Nepodarilo sa nastaviť súčasnú frekvenciu prijímača pre zariadenie '%s' na " "%lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Nepodarilo sa zistiť silu signálu pre zariadenie '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "" "Nepodarilo sa zistiť hodnotu pre ovládací prvok %d pre zariadenie '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Nepodarilo sa nastaviť hodnotu %d pre ovládací prvok %d na zariadení '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Nepodarilo sa zistiť súčasný vstup na zariadení '%s'. Možno je to rádio." #, c-format msgid "Failed to set input %d on device %s." msgstr "Nepodarilo sa nastaviť vstup %d na zariadení %s." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Nepodarilo sa zistiť súčasný vstup na zariadení '%s'. Možno je to rádio." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Nepodarilo sa nastaviť vstup %d na zariadení %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Nepodarilo sa zaradiť vyrovnávaciu pamäť na zariadení '%s'." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Nepodarilo sa získať videosnímky zo zariadenia '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Nepodarilo sa po %d pokusoch. Zariadenie %s. Systémová chyba: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Nepodarilo sa získať parametre zariadenia '%s'" msgid "Video input device did not accept new frame rate setting." msgstr "" "Zariadenie video vstupu neakceptovalo nové nastavenie frekvencie snímok." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Nepodarilo sa namapovať vyrovnávaciu pamäť zariadenia '%s'" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Tento ovládač zariadenia '%s' nepodporuje žiadnu známu metódu nahrávania." msgid "Changing resolution at runtime is not yet supported." msgstr "Zmena rozlíšenia za chodu nie je zatiaľ podporovaná." msgid "Cannot operate without a clock" msgstr "Nemôžem fungovať bez hodín" #~ msgid "Failed getting controls attributes on device '%s.'" #~ msgstr "Nepodarilo sa získať atribúty ovládacích prvkov na zariadení '%s.'" #~ msgid "Failed to enumerate possible video formats device '%s' can work with" #~ msgstr "" #~ "Nepodarilo sa zistiť možné video formáty, '%s' s ktorými vie zariadenie " #~ "pracovať" #~ msgid "" #~ "The buffer type is not supported, or the index is out of bounds, or no " #~ "buffers have been allocated yet, or the userptr or length are invalid. " #~ "device %s" #~ msgstr "" #~ "Tento typ vyrovnávacej pamäte nie je podporovaný, alebo je tento index " #~ "mimo medzí, alebo zatiaľ nebola alokovaná žiadna vyrovnávacia pamäť, " #~ "alebo userptr alebo dĺžka sú chybné. Zariadenie %s" #~ msgid "" #~ "Failed trying to get video frames from device '%s'. Not enough memory." #~ msgstr "" #~ "Nepodarilo sa získať videosnímky zo zariadenia '%s'. Nedostatok pamäte." #~ msgid "insufficient memory to enqueue a user pointer buffer. device %s." #~ msgstr "" #~ "nedostatok pamäte pre zaradenie požiadavky na používateľskú vyrovnávaciu " #~ "pamäť ukazovateľa. zariadenie %s." #~ msgid "No free buffers found in the pool at index %d." #~ msgstr "" #~ "Nenašli sa žiadne voľné oblasti vyrovnávacei pamäte v bloku na indexe %d." #~ msgid "Device '%s' cannot capture at %dx%d" #~ msgstr "Zariadenie '%s' nevie zachytávať na %dx%d" #~ msgid "Device '%s' cannot capture in the specified format" #~ msgstr "Zariadenie '%s' nedokáže zachytávať v uvedenom formáte" #~ msgid "Could not get buffers from device '%s'." #~ msgstr "Nepodarilo sa získať vyrovnávaciu pamäť od zariadenia '%s'." #~ msgid "Could not get enough buffers from device '%s'." #~ msgstr "" #~ "Nepodarilo sa získať dostatok vyrovnávacej pamäte od zariadenia '%s'." #~ msgid "Error starting streaming capture from device '%s'." #~ msgstr "Chyba pri štartovaní zachytávania prúdu údajov zo zariadenia '%s'." #~ msgid "Error stopping streaming capture from device '%s'." #~ msgstr "Chyba pri zastavovaní zachytávania prúdu údajov zo zariadenia '%s'." #~ msgid "Could not read from CD." #~ msgstr "Nepodarilo sa čítať z CD." #~ msgid "Disc is not an Audio CD." #~ msgstr "Tento disk nie je zvukové CD." #~ msgid "This file is encrypted and cannot be played." #~ msgstr "Tento súbor je zašifrovaný a nedá sa prehrať." #~ msgid "Could not set parameters on device '%s'" #~ msgstr "Nepodarilo sa nastaviť parametre zariadeniu '%s'" #~ msgid "Device '%s' cannot capture at %d/%d frames per second" #~ msgstr "Zariadenie '%s' nedokáže zachytávať pri %d/%d snímkach za sekundu" #~ msgid "Could not exchange data with device '%s'." #~ msgstr "Nepodarila sa výmena údajov so zariadením '%s'." #~ msgid "Describes the selected input element." #~ msgstr "Opisuje vybraný vstupný prvok." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "Opisuje vybraný výstupný prvok pre hlasové/video konferencie." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Opisuje vybraný výstupný prvok pre hudbu a filmy." #~ msgid "Describes the selected output element." #~ msgstr "Opisuje vybraný výstupný prvok." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "GStreamer audiosink pre hlasové/video konferencie" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "GStreamer audiosink pre hudbu a filmy" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer dokáže prehrávať zvuk pomocou ľubovoľného počtu výstupných " #~ "prvkov. Možnosťami sú napríklad osssink, esdsink a alsasink. Audiosink " #~ "môže byť čiastočne rúrou, nielen jediným prvkom." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer dokáže prehrávať video pomocou ľubovoľného počtu výstupných " #~ "prvkov. Možnosťami sú napríklad xvimagesink, ximagesink, sdlvideosink a " #~ "aasink. Videosink môže byť čiastočne rúrou, nielen jediným prvkom." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "GStreamer dokáže vsunúť vizualizačné zásuvné moduly do rúry a " #~ "transformovať zvukový prúd údajov na videosnímky. Predvolený je goom, ale " #~ "čoskoro bude dostupných viacero vizualizačných zásuvných modulov. " #~ "Vizualizačný zásuvný modul môže byť čiastočne rúrou, nielen jediným " #~ "prvkom." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer dokáže nahrávať zvuk pomocou ľubovoľného počtu vstupných " #~ "prvkov. Možnosťami sú napríklad osssrc, esdsrc, alsasrc. Zvukový zdroj " #~ "môže byť čiastočne rúrou, nielen jediným prvkom." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "GStreamer dokáže nahrať video pomocou ľubovoľného počtu vstupných prvkov. " #~ "Možnosťami sú napríklad v4lsrc a videotestsrc. Video zdroj môže byť " #~ "čiastočne rúrou, nielen jediným prvkom." #~ msgid "default GStreamer audio source" #~ msgstr "predvolený zdroj zvuku pre GStreamer" #~ msgid "default GStreamer audiosink" #~ msgstr "predvolený audiosink pre GStreamer" #~ msgid "default GStreamer video source" #~ msgstr "predvolený zdroj videa pre GStreamer" #~ msgid "default GStreamer videosink" #~ msgstr "predvolený videosink pre GStreamer" #~ msgid "default GStreamer visualization plugin" #~ msgstr "predvolený vizualizačný zásuvný modul pre GStreamer" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "popis pre audiosink pre GStreamer pre hlasové/video konferencie" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "popis pre audiosink pre GStreamer pre hudbu a filmy" #~ msgid "description for default GStreamer audiosink" #~ msgstr "popis pre predvolený audiosink pre GStreamer" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "popis pre predvolený audiosrc pre GStreamer" gst-plugins-good-0.10.31/po/el.po0000644000175000017500000005211511720565341013365 00000000000000# Greek translation for gst-plugins-good package of GStreamer project. # Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 GStreamer core team # This file is distributed under the same license as the gst-plugins-good package. # Simos Xenitellis , 2009. # Michael Kotsarinis , 2010 msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.25.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-10-27 12:16+0200\n" "Last-Translator: Michael Kotsarinis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή ήχου" msgid "Failed to query sound server capabilities" msgstr "Αποτυχία αναζήτησης των δυνατοτήτων του διακομιστή ήχου" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' από '%s'" msgid "Internal data stream error." msgstr "Εσωτερικό σφάλμα ροής δεδομένων." msgid "Failed to decode JPEG image" msgstr "Αποτυχία αποκωδικοποίησης της εικόνας JPEG" msgid "Could not connect to server" msgstr "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή" msgid "Server does not support seeking." msgstr "Ο διακομιστής δεν υποστηρίζει αναζήτηση." msgid "Could not resolve server name." msgstr "Δεν ήταν δυνατός ο προσδιορισμός του ονόματος του διακομιστή." msgid "Could not establish connection to server." msgstr "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή." msgid "Secure connection setup failed." msgstr "Αποτυχία εκκίνησης ασφαλούς σύνδεσης." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Προέκυψε ένα σφάλμα δικτύου ή ο διακομιστής έκλεισε ξαφνικά τη σύνδεση." msgid "Server sent bad data." msgstr "Ο διακομιστής έστειλε λάθος δεδομένα." msgid "No URL set." msgstr "Δεν ορίσθηκε URL." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Καμία ή άκυρη εισαγωγή ήχου, η AVI ροή θα καταρρεύσει." msgid "This file contains no playable streams." msgstr "Αυτό το αρχείο δεν περιέχει αναπαραγώγιμες ροές." msgid "This file is invalid and cannot be played." msgstr "Το αρχείο αυτό δεν είναι έγκυρο και δεν μπορεί να αναπαραχθεί." msgid "This file is corrupt and cannot be played." msgstr "Το αρχείο αυτό είναι κατεστραμμένο και δεν μπορεί να αναπαραχθεί. " msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Το αρχείο αυτό είναι ανολοκλήρωτο και δεν μπορεί να αναπαραχθεί." msgid "The video in this file might not play correctly." msgstr "Το βίντεο σε αυτό το αρχείο μπορεί να μην αναπαραχθεί σωστά." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Αυτό το αρχείο περιέχει πολλές ροές. Αναπαράγεται μόνο η πρώτη %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Δεν βρέθηκε καμία υποστηριζόμενη ροή. Είναι πιθανόν να πρέπει να κάνετε " "εγκατάσταση ένα πρόσθετο GStreamer RTSP για τις ροές Real μέσων. " msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Δεν βρέθηκε καμία υποστηριζόμενη ροή. Είναι πιθανόν να χρειασθεί να " "επιτρέψετε περισσότερα πρωτόκολλα μεταγωγής ή αλλιώς να σας λείπει το σωστό " "πρόσθετο RTSP του GStreamer." msgid "Internal data flow error." msgstr "Εσωτερικό σφάλμα ροής δεδομένων." msgid "Volume" msgstr "Ένταση" msgid "Bass" msgstr "Μπάσα" msgid "Treble" msgstr "Πρίμα (treble)" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Μεγάφωνο" msgid "Line-in" msgstr "Γραμμή-εισόδου" msgid "Microphone" msgstr "Μικρόφωνο" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Μείκτης" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Εγγραφή" msgid "In-gain" msgstr "Κέρδος εισόδου" msgid "Out-gain" msgstr "Κέρδος εξόδου" msgid "Line-1" msgstr "Γραμμή-1" msgid "Line-2" msgstr "Γραμμή-2" msgid "Line-3" msgstr "Γραμμή-3" msgid "Digital-1" msgstr "Ψηφιακό-1" msgid "Digital-2" msgstr "Ψηφιακό-2" msgid "Digital-3" msgstr "Ψηφιακό-3" msgid "Phone-in" msgstr "Είσοδος τηλεφώνου" msgid "Phone-out" msgstr "Έξοδος τηλεφώνου" msgid "Video" msgstr "Βίντεο" msgid "Radio" msgstr "Ράδιο" msgid "Monitor" msgstr "Οθόνη" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Η συσκευή " "χρησιμοποιείται από μια άλλη εφαρμογή." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Δεν έχετε τα " "δικαιώματα να ανοίξετε την συσκευή." msgid "Could not open audio device for playback." msgstr "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. " msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για εγγραφή. Δεν έχετε τα " "δικαιώματα να ανοίξετε την συσκευή." msgid "Could not open audio device for recording." msgstr "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για εγγραφή. " msgid "Could not open audio device for mixer control handling." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για χειρισμό του ελέγχου του " "μίκτη. " msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για χειρισμό του ελέγχου του " "μίκτη. Αυτή η έκδοση του Open Sound System δεν υποστηρίζεται από αυτό οτ " "στοιχείο." msgid "Master" msgstr "Γενικός (Master)" msgid "Front" msgstr "Μπροστά" msgid "Rear" msgstr "Πίσω" msgid "Headphones" msgstr "Ακουστικά" msgid "Center" msgstr "Κέντρο" msgid "LFE" msgstr "Χαμηλών συχνοτήτων (LFE)" msgid "Surround" msgstr "Περιβάλλων (Surround)" msgid "Side" msgstr "Πλευρικό" msgid "Built-in Speaker" msgstr "Ενσωματωμένο μεγάφωνο" msgid "AUX 1 Out" msgstr "AUX 1 Out" msgid "AUX 2 Out" msgstr "AUX 2 Out" msgid "AUX Out" msgstr "Έξοδος AUX" msgid "3D Depth" msgstr "Βάθος 3D" msgid "3D Center" msgstr "Κέντρο 3D" msgid "3D Enhance" msgstr "Ενίσχυση 3D" msgid "Telephone" msgstr "Τηλέφωνο" msgid "Line Out" msgstr "Γραμμή εξόδου" msgid "Line In" msgstr "Είσοδος γραμμής" msgid "Internal CD" msgstr "Εσωτερικό CD" msgid "Video In" msgstr "Είσοδος βίντεο" msgid "AUX 1 In" msgstr "Είσοδις AUX 1" msgid "AUX 2 In" msgstr "Είσοδος AUX 2" msgid "AUX In" msgstr "Είσοδος AUX" msgid "Record Gain" msgstr "Κέρδος Εγγραφής" msgid "Output Gain" msgstr "Κέρδος εξόδου" msgid "Microphone Boost" msgstr "Ενίσχυση μικροφώνου" msgid "Loopback" msgstr "Ανατροφοδότηση" msgid "Diagnostic" msgstr "Διαγνωστικό" msgid "Bass Boost" msgstr "Ενίσχυση χαμηλών" msgid "Playback Ports" msgstr "Θύρες Αναπαραγωγής" msgid "Input" msgstr "Είσοδος" msgid "Record Source" msgstr "Πηγή εγγραφής" msgid "Monitor Source" msgstr "Παρακολούθηση πηγής" msgid "Keyboard Beep" msgstr "Ήχος πληκτρολογίου" msgid "Simulate Stereo" msgstr "Προσομοίωση στέρεο" msgid "Stereo" msgstr "Στέρεο" msgid "Surround Sound" msgstr "Ήχος Surround" msgid "Microphone Gain" msgstr "Κέρδος μικροφώνου" msgid "Speaker Source" msgstr "Πηγή μεγαφώνου" msgid "Microphone Source" msgstr "Πηγή μικροφώνου" msgid "Jack" msgstr "Βύσμα" msgid "Center / LFE" msgstr "Κεντρικό / Χαμηλών συχνοτήτων" msgid "Stereo Mix" msgstr "Στερεοφωνική μίξη" msgid "Mono Mix" msgstr "Μονοφωνική μίξη" msgid "Input Mix" msgstr "Μίξη εισόδου" msgid "SPDIF In" msgstr "Είσδος SPDIF" msgid "SPDIF Out" msgstr "SPDIF Out" msgid "Microphone 1" msgstr "Μικρόφωνο 1" msgid "Microphone 2" msgstr "Μικρόφωνο 2" msgid "Digital Out" msgstr "Ψηφιακή έξοδος" msgid "Digital In" msgstr "Ψηφιακή είσοδος" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Τηλεφωνική συσκευή" msgid "Other" msgstr "Άλλο" msgid "None" msgstr "Κανένα" msgid "On" msgstr "On" msgid "Off" msgstr "Off" msgid "Mute" msgstr "Σίγαση" msgid "Fast" msgstr "Γρήγορα" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Πολύ χαμηλή" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Χαμηλή" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Μεσαία" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Υψηλή" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Πολύ υψηλή" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Παραγωγής" msgid "Front Panel Microphone" msgstr "Μικρόφωνο μπροστινού πάνελ" msgid "Front Panel Line In" msgstr "Είσοδος γραμμής μπροστινού πάνελ" msgid "Front Panel Headphones" msgstr "Ακουστικά μπροστινού πάνελ" msgid "Front Panel Line Out" msgstr "Έξοδος γραμμής μπροστινού πάνελ" msgid "Green Connector" msgstr "Πράσινη υποδοχή" msgid "Pink Connector" msgstr "Ροζ υποδοχή" msgid "Blue Connector" msgstr "Μπλε υποδοχή" msgid "White Connector" msgstr "Λευκή υποδοχή" msgid "Black Connector" msgstr "Μαύρη υποδοχή" msgid "Gray Connector" msgstr "Γκρι υποδοχή" msgid "Orange Connector" msgstr "Πορτοκαλί υποδοχή" msgid "Red Connector" msgstr "Κόκκινη υποδοχή" msgid "Yellow Connector" msgstr "Κίτρινη υποδοχή" msgid "Green Front Panel Connector" msgstr "Πράσινη υποδοχή μπροστινού πάνελ" msgid "Pink Front Panel Connector" msgstr "Ροζ υποδοχή μπροστινού πάνελ" msgid "Blue Front Panel Connector" msgstr "Μπλε υποδοχή μπροστινού πάνελ" msgid "White Front Panel Connector" msgstr "Λευκή υποδοχή μπροστινού πάνελ" msgid "Black Front Panel Connector" msgstr "Μαύρη υποδοχή μπροστινού πάνελ" msgid "Gray Front Panel Connector" msgstr "Γκρι υποδοχή μπροστινού πάνελ" msgid "Orange Front Panel Connector" msgstr "Πορτοκαλί υποδοχή μπροστινού πάνελ" msgid "Red Front Panel Connector" msgstr "Κόκκινη υποδοχή μπροστινού πάνελ" msgid "Yellow Front Panel Connector" msgstr "Κίτρινη υποδοχή μπροστινού πάνελ" msgid "Spread Output" msgstr "Ευρεία έξοδος" msgid "Downmix" msgstr "Μίξη συγχώνευσης (Downmix)" msgid "Virtual Mixer Input" msgstr "Είσοδος εικονικού μίκτη" msgid "Virtual Mixer Output" msgstr "Έξοδος εικονικού μίκτη" msgid "Virtual Mixer Channels" msgstr "Κανάλια εικονικού μίκτη" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Λειτουργία %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Λειτουργία %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής ήχου για αναπαραγωγή. Αυτή η έκδοση " "του Open Sound System δεν υποστηρίζεται από αυτό το στοιχείο." msgid "Playback is not supported by this audio device." msgstr "Αυτή η συσκευή ήχου δεν υποστηρίζει αναπαραγωγή." msgid "Audio playback error." msgstr "Σφάλμα αναπαραγωγής ήχου" msgid "Recording is not supported by this audio device." msgstr "Αυτή η συσκευή ήχου δεν υποστηρίζει εγγραφή." msgid "Error recording from audio device." msgstr "Σφάλμα κατά την εγγραφή από τη συσκευή ήχου." msgid "Gain" msgstr "Κέρδος" msgid "Headphone" msgstr "Ακουστικό" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Σφάλμα κατά την ανάγνωση %d bytes απο την συσκευή '%s'." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Απροσδόκητο μέγεθος πλαισίου από %u αντί του %u" #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Σφάλμα κατά την ανάγνωση %d bytes στην συσκευή '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Σφάλμα κατά τη λήψη δυνατοτήτων της συσκευής '%s': Δεν είναι οδηγός v4l2. " "Ελέγξτε αν είναι οδηγός v4l2." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Αποτυχία ανίχνευσης ιδιοτήτων της εισόδου %d στη συσκευή %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Αποτυχία ανάγνωσης των ρυθμίσεων δέκτη %d στην συσκευή '%s'." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Αποτυχία ανίχνευσης κανονικοποίησης στη συσκευή '%s'." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "" "Αποτυχία κατά την ανάγνωση των χαρακτηριστικών ελέγχου στην συσκευή '%s'." #, c-format msgid "Cannot identify device '%s'." msgstr "Δεν ήταν δυνατή η ταυτοποίηση της συσκευής '%s'." #, c-format msgid "This isn't a device '%s'." msgstr "Αυτή δεν είναι μια συκευή '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "" "Δεν ήταν δυνατό το άνοιγμα της συσκευής '%s' για ανάγνωση και γράψιμο. " #, c-format msgid "Device '%s' is not a capture device." msgstr "Η συσκευή '%s' δεν είναι μια συσκευή λήψης." #, c-format msgid "Device '%s' is not a output device." msgstr "Η συσκευή '%s' δεν είναι συσκευή εξόδου." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Αποτυχία ρύθμισης κανόνα για την συσκευή '%s'." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Αποτυχία ανάγνωσης της τρέχουσας συχνότητας δέκτη για την συσκευή '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Αποτυχία ρύθμισης τρέχουσας συχνότητας δέκτη για την συσκευή '%s' στα %lu Hz" #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Αποτυχία ανάγνωσης ισχύς σήματος για την συσκευή '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Αποτυχία ανάγνωσης τιμής για τον έλεγχο %d στην συσκευή '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Αποτυχία ρύθμισης τιμής %d για τον έλεγχο %d στην συσκευή '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Αποτυχία ανάγνωσης της τρέχουσας εισαγωγής στην συσκευή '%s'. Πιθανόν να " "είναι μια συσκευή ράδιο" #, c-format msgid "Failed to set input %d on device %s." msgstr "Αποτυχία ρύθμισης εισαγωγής %d στην συσκευή %s." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Αποτυχία ανάγνωσης της τρέχουσας εισαγωγής στην συσκευή '%s'. Πιθανόν να " "είναι μια συσκευή ράδιο" #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Αποτυχία ρύθμισης εισαγωγής %d στην συσκευή %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Αδυναμία θέσης σε σειρά των buffer στη συσκευή '%s'." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Αποτυχία ανάγνωσης πλαισίων βίντεο από την συσκευή '%s'." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Αποτυχία έπειτα από %d προσπάθειες. συσκευή %s. σφάλμα συστήματος: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Δεν ήταν δυνατή η ανάγνωση των παραμέτρων στην συσκευή '%s'" msgid "Video input device did not accept new frame rate setting." msgstr "Η συσκευή εισόδου βίντεο δεν αποδέχθηκε τη νέα ρύθμιση ταχύτητας καρέ." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Αδυναμία χαρτογράφησης buffer για τη συσκευή '%s'" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Ο οδηγός της συσκευής '%s' δεν υποστηρίζει κάποια γνωστή μέθοδο λήψης." msgid "Changing resolution at runtime is not yet supported." msgstr "" "Η αλλαγή της ανάλυσης κατά τη διάρκεια λειτουργίας δεν υποστηρίζεται ακόμα." msgid "Cannot operate without a clock" msgstr "Δεν είναι δυνατή η λειτουργία χωρίς ρολόι " #~ msgid "Describes the selected input element." #~ msgstr "Περιγράφει το επιλεγμένο στοιχείο εισαγωγής." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "" #~ "Περιγράφει το επιλεγμένο στοιχείο εξόδου για το Audio/Video Conferencing." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Περιγράφει το επιλεγμένο στοιχείο εξόδου για μουσική και ταινίες." #~ msgid "Describes the selected output element." #~ msgstr "Περιγράφει το επιλεγμένο στοιχείο εξαγωγής." gst-plugins-good-0.10.31/po/it.po0000644000175000017500000004063411720565342013405 00000000000000# Italian translation for gst-plugins-good package of GStreamer project. # Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 GStreamer core team # This file is distributed under the same license as the gst-plugins-good package. # # Luca Ferretti , 2004, 2005, 2006, 2007, 2008, 2009, 2010. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.25.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-10-25 10:11+0200\n" "Last-Translator: Luca Ferretti \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Impossibile stabilire la connessione al server audio" msgid "Failed to query sound server capabilities" msgstr "Interrogazione delle funzionalità del server audio non riuscita" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "«%s» di «%s»" msgid "Internal data stream error." msgstr "Errore interno nello stream dei dati." msgid "Failed to decode JPEG image" msgstr "Decodifica dell'immagine JPEG non riuscita" msgid "Could not connect to server" msgstr "Impossibile connettersi al server" msgid "Server does not support seeking." msgstr "Il server non supporta il posizionamento." msgid "Could not resolve server name." msgstr "Impossibile risolvere il nome del server." msgid "Could not establish connection to server." msgstr "Impossibile stabilire la connessione al server." msgid "Secure connection setup failed." msgstr "Impostazione della connessione sicura non riuscita." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Si è verificato un errore di rete, oppure il server ha chiuso la connessione " "in modo inatteso." msgid "Server sent bad data." msgstr "In server ha inviato dati errati." msgid "No URL set." msgstr "Nessun URL impostato." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Ingresso audio assente o non valido. Lo stream AVI risulterà danneggiato." msgid "This file contains no playable streams." msgstr "Questo file non contiene alcuno stream riproducibile." msgid "This file is invalid and cannot be played." msgstr "Questo file non è valido e non può essere riprodotto." msgid "This file is corrupt and cannot be played." msgstr "Questo file è alterato e non può essere riprodotto." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Questo file è incompleto e non può essere riprodotto." msgid "The video in this file might not play correctly." msgstr "Il video in questo file potrebbe non essere riprodotto correttamente." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Questo file contiene troppi stream. Riprodotti solo i primi %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Non è stato trovato alcuno stream supportato. Potrebbe essere necessario " "installare un plugin GStreamer di tipo estensione RTSP per gli stream Real " "media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Non è stato trovato alcuno stream supportato. Potrebbe essere necessario " "abilitare altri protocolli di trasporto oppure in alternativa potrebbe " "mancare il corretto plugin GStreamer di tipo estensione RTSP." msgid "Internal data flow error." msgstr "Errore interno nel flusso di dati." msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Bassi" msgid "Treble" msgstr "Acuti" msgid "Synth" msgstr "Sintetiz" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Altoparl" msgid "Line-in" msgstr "Linea in" msgid "Microphone" msgstr "Microfono" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mixer" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Registr" msgid "In-gain" msgstr "Guad in" msgid "Out-gain" msgstr "Guad out" msgid "Line-1" msgstr "Canale 1" msgid "Line-2" msgstr "Canale 2" msgid "Line-3" msgstr "Canale 3" msgid "Digital-1" msgstr "Digital 1" msgid "Digital-2" msgstr "Digital 2" msgid "Digital-3" msgstr "Digital 3" msgid "Phone-in" msgstr "Telefono in" msgid "Phone-out" msgstr "Telefono out" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Impossibile aprire il dispositivo audio per la riproduzione. Il dispositivo " "è attualmente usato da un'altra applicazione." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Impossibile aprire il dispositivo audio per la riproduzione. Permessi non " "sufficienti per aprire il dispositivo." msgid "Could not open audio device for playback." msgstr "Impossibile aprire il dispositivo audio per la riproduzione." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Impossibile aprire il dispositivo audio per la registrazione. Permessi non " "sufficienti per aprire il dispositivo." msgid "Could not open audio device for recording." msgstr "Impossibile aprire il dispositivo audio per la registrazione." msgid "Could not open audio device for mixer control handling." msgstr "" "Impossibile aprire il device audio per la gestione della regolazione del " "mixer." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Impossibile aprire il device audio per la gestione della regolazione del " "mixer. Questa versione di Open Sound System non è supportata da questo " "elemento." msgid "Master" msgstr "Principale" msgid "Front" msgstr "Fronte" msgid "Rear" msgstr "Dietro" msgid "Headphones" msgstr "Cuffie" msgid "Center" msgstr "Centrale" # NdT: lfe andrebbe tradotto come effetti a bassa frequenza e andrebbe aperto un bug per low frequency emitter che al limite è la cassa ma non il canale msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Laterale" msgid "Built-in Speaker" msgstr "Altop. incorporato" msgid "AUX 1 Out" msgstr "AUX 1 out" msgid "AUX 2 Out" msgstr "AUX 2 out" msgid "AUX Out" msgstr "AUX out" msgid "3D Depth" msgstr "Profondità 3D" msgid "3D Center" msgstr "Centro 3D" msgid "3D Enhance" msgstr "Profondità 3D" msgid "Telephone" msgstr "Telefono" msgid "Line Out" msgstr "Linea out" msgid "Line In" msgstr "Linea in" msgid "Internal CD" msgstr "CD interno" msgid "Video In" msgstr "Video in" msgid "AUX 1 In" msgstr "AUX 1 in" msgid "AUX 2 In" msgstr "AUX 2 in" msgid "AUX In" msgstr "AUX in" msgid "Record Gain" msgstr "Guadagno registrazione" msgid "Output Gain" msgstr "Guadagno uscita" msgid "Microphone Boost" msgstr "Incremento microfono" msgid "Loopback" msgstr "Loopback" msgid "Diagnostic" msgstr "Diagnostica" msgid "Bass Boost" msgstr "Incremento bassi" msgid "Playback Ports" msgstr "Porte riproduzione" msgid "Input" msgstr "Input" msgid "Record Source" msgstr "Sorgente registrazione" msgid "Monitor Source" msgstr "Sorgente monitor" msgid "Keyboard Beep" msgstr "Beep tastiera" msgid "Simulate Stereo" msgstr "Simula stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Suono surround" msgid "Microphone Gain" msgstr "Guadagno microfono" msgid "Speaker Source" msgstr "Sorgente altoparlante" msgid "Microphone Source" msgstr "Sorgente microfono" msgid "Jack" msgstr "Jack" # vedi prima per LFE msgid "Center / LFE" msgstr "Centrale / LFE" msgid "Stereo Mix" msgstr "Mix stereo" msgid "Mono Mix" msgstr "Mix mono" msgid "Input Mix" msgstr "Mix ingresso" msgid "SPDIF In" msgstr "SPDIF in" msgid "SPDIF Out" msgstr "SPDIF out" msgid "Microphone 1" msgstr "Microfono 1" msgid "Microphone 2" msgstr "Microfono 2" msgid "Digital Out" msgstr "Uscita digitale" msgid "Digital In" msgstr "Ingresso digitale" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Auricolare" msgid "Other" msgstr "Altro" msgid "None" msgstr "Nessuno" msgid "On" msgstr "Acceso" msgid "Off" msgstr "Spento" msgid "Mute" msgstr "Escluso" msgid "Fast" msgstr "Veloce" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Molto lento" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Lento" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Medio" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Alto" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Molto alto" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produzione" msgid "Front Panel Microphone" msgstr "Microfono pannello frontale" msgid "Front Panel Line In" msgstr "Linea in pannello frontale" msgid "Front Panel Headphones" msgstr "Cuffie pannello frontale" msgid "Front Panel Line Out" msgstr "Linea out pannello frontale" msgid "Green Connector" msgstr "Connettore verde" msgid "Pink Connector" msgstr "Connettore rosa" msgid "Blue Connector" msgstr "Connettore blu" msgid "White Connector" msgstr "Connettore bianco" msgid "Black Connector" msgstr "Connettore nero" msgid "Gray Connector" msgstr "Connettore grigio" msgid "Orange Connector" msgstr "Connettore arancione" msgid "Red Connector" msgstr "Connettore rosso" msgid "Yellow Connector" msgstr "Connettore giallo" msgid "Green Front Panel Connector" msgstr "Connettore verde pannello frontale" msgid "Pink Front Panel Connector" msgstr "Connettore rosa pannello frontale" msgid "Blue Front Panel Connector" msgstr "Connettore blu pannello frontale" msgid "White Front Panel Connector" msgstr "Connettore bianco pannello frontale" msgid "Black Front Panel Connector" msgstr "Connettore nero pannello frontale" msgid "Gray Front Panel Connector" msgstr "Connettore grigio pannello frontale" msgid "Orange Front Panel Connector" msgstr "Connettore arancione pannello frontale" msgid "Red Front Panel Connector" msgstr "Connettore rosso pannello frontale" msgid "Yellow Front Panel Connector" msgstr "Connettore giallo pannello frontale" # int spread; /* copy front to surr/center channels */ msgid "Spread Output" msgstr "Uscita diffusa" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "Ingresso mixer virtuale" msgid "Virtual Mixer Output" msgstr "Uscita mixer virtuale" msgid "Virtual Mixer Channels" msgstr "Canali mixer virtuale" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Funzione %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Funzione %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Impossibile aprire il device audio per la riproduzione. Questa versione di " "Open Sound System non è supportata da questo elemento." msgid "Playback is not supported by this audio device." msgstr "Questo device audio non supporta la riproduzione." msgid "Audio playback error." msgstr "Errore nel riprodurre l'audio." msgid "Recording is not supported by this audio device." msgstr "Questo dispositivo audio non supporta la registrazione." msgid "Error recording from audio device." msgstr "Errore nel registrare dal dispositivo audio." msgid "Gain" msgstr "Guadagno" msgid "Headphone" msgstr "Cuffia" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Errore nel leggere %d byte dal device «%s»." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Ottenuta dimensione inattesa del fotogramma: %u invece di %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Errore nel leggere %d byte sul device «%s»." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Errore nell'ottenere le funzionalità per il device «%s»: non è un driver " "v4l2. Controllare se si tratta di un driver v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "" "Interrogazione degli attributi dell'input %d nel device %s non riuscita" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Recupero delle impostazioni del sintonizzatore %d sul device «%s» non " "riuscito." # norm è un paramentro pari a ntsc o pal (e forse altro. Si evince ad esempio # dal comando di Video Lan Clien # # vlc --color # v4l:/dev/video2:norm=ntsc:frequency=77250:size=640x480:# adev=/dev/dsp2:audio=0 (...) # # Qualche idea diversa da norma? -Luca #, c-format msgid "Failed to query norm on device '%s'." msgstr "Interrogazione di norm sul device «%s» non riuscita." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Recupero degli attributi dei controlli sul device «%s» non riuscito." #, c-format msgid "Cannot identify device '%s'." msgstr "Impossibile identificare il device «%s»." #, c-format msgid "This isn't a device '%s'." msgstr "Questo non è un dispositivo «%s»." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Impossibile aprire il device «%s» in lettura e scrittura." #, c-format msgid "Device '%s' is not a capture device." msgstr "Il device «%s» non è un dispositivo di cattura." #, c-format msgid "Device '%s' is not a output device." msgstr "Il device «%s» non è un dispositivo di uscita." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Impostazione di norm per il device «%s» non riuscita." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Recupero dell'attuale frequenza di sintonizzazione per il device «%s» non " "riuscita." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Impostazione dell'attuale frequenza di sintonizzazione per il device «%s» a " "%lu Hz non riuscita." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Recupero dell'intensità del segnale per il device «%s» non riuscito." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Recupero del valore per il controllo %d sul device «%s» non riuscito." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Impostazione al valore %d per il controllo %d sul device «%s» non riuscito." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Recupero dell'attuale ingresso sul device «%s» non riuscito. Forse è un " "dispositivo radio" #, c-format msgid "Failed to set input %d on device %s." msgstr "Impostazione dell'ingresso %d sul device «%s» non riuscita." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Recupero dell'attuale ingresso sul device «%s» non riuscito. Forse è un " "dispositivo radio" #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Impostazione dell'ingresso %d sul device «%s» non riuscita." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Impossibile accodare i buffer nel device «%s»." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Tentativo di ottenere fotogrammi video dal device «%s» non riuscito." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Fallito dopo %d tentativi. Device %s. Errore di sistema: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Impossibile ottenere i parametri sul device «%s»" msgid "Video input device did not accept new frame rate setting." msgstr "" "Il device di ingresso video non accetta la nuova impostazione sul frame rate." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Impossibile mappare dei buffer dal device «%s»." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Il driver del device «%s» non supporta alcun metodo di cattura noto." msgid "Changing resolution at runtime is not yet supported." msgstr "" "Il cambio della risoluzione durante l'esecuzione non è ancora supportato." msgid "Cannot operate without a clock" msgstr "Impossibile operare senza un clock" gst-plugins-good-0.10.31/po/da.po0000644000175000017500000003621511720565341013354 00000000000000# Danish translation of gst-plugins-good. # Copyright (C) 2010 gst. # This file is distributed under the same license as the gst-plugins-good package. # # Mogens Jaeger , 2007. # Joe Hansen , 2008, 2009, 2010, 2011. # # gain -> forhøjelse # boost -> øgning? # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-01-07 23:54+0200\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Kunne ikke skabe kontakt til lyd-serveren" msgid "Failed to query sound server capabilities" msgstr "Listning af lydservers egenskaber fejlede" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' af '%s'" msgid "Internal data stream error." msgstr "Intern datastrømsfejl." msgid "Failed to decode JPEG image" msgstr "Mislykkedes i at afkode JPEG-billede" msgid "Could not connect to server" msgstr "Kunne ikke forbinde til server" msgid "Server does not support seeking." msgstr "Server understøtter ikke søgning." msgid "Could not resolve server name." msgstr "Kunne ikke slå servernavn op." msgid "Could not establish connection to server." msgstr "Kunne ikke skabe kontakt til serveren." msgid "Secure connection setup failed." msgstr "Opsætning af sikker forbindelse mislykkedes." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Der opstod en netværksfejl, eller serveren lukkede uventet forbindelsen." msgid "Server sent bad data." msgstr "Server sendte ugyldige data." msgid "No URL set." msgstr "Ingen adresse angivet." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Ingen eller defekt inddatalyd, AVI-sekvens vil blive ødelagt." msgid "This file contains no playable streams." msgstr "Denne fil indeholder ingen spilbar strøm." msgid "This file is invalid and cannot be played." msgstr "Denne fil er ufuldstændig og kan ikke afspilles." msgid "This file is corrupt and cannot be played." msgstr "Denne fil er ødelagt og kan ikke afspilles." msgid "Invalid atom size." msgstr "Ugyldig atomstørrelse." msgid "This file is incomplete and cannot be played." msgstr "Denne fil er ufuldstændig og kan ikke afspilles." msgid "The video in this file might not play correctly." msgstr "Videoen i denne fil afspilles måske ikke korrekt." # hvad er %d i dette program? Umiddelbart ville jeg tro det skulle # hedde, "Afpiller kun første %d" men det kommer selvfølgelig an på # sammenhængen. #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Denne fil indeholder for mange strømme. Afspil først kun %d" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Ingen understøttet strøm blev fundet. Du skal måske installere et " "udvidelsesmodul for GStreamer RTSP til Real media-strømme." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Ingen understøttet strøm blev fundet. Du mangler måske at tillade yderligere " "transportprotokoller eller mangler måske det korrekte udvidelsesmodul til " "GStreamer RTSP." msgid "Internal data flow error." msgstr "Intern datastrømsfejl." msgid "Volume" msgstr "Lydstyrke" msgid "Bass" msgstr "Bas" msgid "Treble" msgstr "Diskant" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Højtaler" msgid "Line-in" msgstr "Linje-ind" msgid "Microphone" msgstr "Mikrofon" msgid "CD" msgstr "Cd" msgid "Mixer" msgstr "Mikser" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Optag" msgid "In-gain" msgstr "Ind-forhøjelse" msgid "Out-gain" msgstr "Ud-forhøjelse" msgid "Line-1" msgstr "Linje-1" msgid "Line-2" msgstr "Linje-2" msgid "Line-3" msgstr "Linje-3" msgid "Digital-1" msgstr "Digital-1" msgid "Digital-2" msgstr "Digital-2" msgid "Digital-3" msgstr "Digital-3" # Eller Phono-ind msgid "Phone-in" msgstr "Lyd-ind" # Eller Phono-ud msgid "Phone-out" msgstr "Lyd-ud" msgid "Video" msgstr "Video" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Monitor" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Kunne ikke åbne lydenhed til afspilning. Enheden anvendes af et andet " "program." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Kunne ikke åbne lydenhed til afspilning. Du har ikke rettighed til at åbne " "enheden." msgid "Could not open audio device for playback." msgstr "Kunne ikke åbne enhed til afspilning." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Kunne ikke åbne lydenhed til optagelse. Du har ikke rettighed til at åbne " "enheden." msgid "Could not open audio device for recording." msgstr "Kunne ikke åbne lydenhed til optagelse." msgid "Could not open audio device for mixer control handling." msgstr "Kunne ikke åbne lydenhed til håndtering af mikserkontrol." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Kunne ikke åbne lydenhed til håndtering af mikserkontrol. Denne version af " "Open Sound System er ikke understøttet af dette element." msgid "Master" msgstr "Master" msgid "Front" msgstr "Front" msgid "Rear" msgstr "Bagende" msgid "Headphones" msgstr "Hovedtelefoner" msgid "Center" msgstr "Centrum" # Low-frequency effect msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Surround" msgid "Side" msgstr "Side" msgid "Built-in Speaker" msgstr "Indbygget højtaler" msgid "AUX 1 Out" msgstr "AUX 1 ud" msgid "AUX 2 Out" msgstr "AUX 2 ud" msgid "AUX Out" msgstr "AUX ud" msgid "3D Depth" msgstr "3D-dybde" msgid "3D Center" msgstr "3D-centrum" msgid "3D Enhance" msgstr "3D-forstærkning" msgid "Telephone" msgstr "Telefon" msgid "Line Out" msgstr "Linje ud" msgid "Line In" msgstr "Linje ind" msgid "Internal CD" msgstr "Intern cd" msgid "Video In" msgstr "Video ind" msgid "AUX 1 In" msgstr "AUX 1 ind" msgid "AUX 2 In" msgstr "AUX 2 ind" msgid "AUX In" msgstr "AUX ind" msgid "Record Gain" msgstr "Optag - forhøjelse" msgid "Output Gain" msgstr "Uddata - forhøjelse" msgid "Microphone Boost" msgstr "Mikrofonøgning" msgid "Loopback" msgstr "Loopback" msgid "Diagnostic" msgstr "Diagnostik" msgid "Bass Boost" msgstr "Bas-øgning" msgid "Playback Ports" msgstr "Afspilningsporte" msgid "Input" msgstr "Inddata" msgid "Record Source" msgstr "Optag kilde" msgid "Monitor Source" msgstr "Skærmkilde" msgid "Keyboard Beep" msgstr "Tastaturbeep" msgid "Simulate Stereo" msgstr "Simuler stereo" msgid "Stereo" msgstr "Stereo" msgid "Surround Sound" msgstr "Surroundlyd" msgid "Microphone Gain" msgstr "Mikrofonforhøjelse" msgid "Speaker Source" msgstr "Højtalerkilde" msgid "Microphone Source" msgstr "Mikrofonkilde" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Center / LFE" msgid "Stereo Mix" msgstr "Stereomiks" msgid "Mono Mix" msgstr "Monomiks" msgid "Input Mix" msgstr "Inddatamiks" msgid "SPDIF In" msgstr "SPDIF ind" msgid "SPDIF Out" msgstr "SPDIF ud" msgid "Microphone 1" msgstr "Mikrofon 1" msgid "Microphone 2" msgstr "Mikrofon 2" msgid "Digital Out" msgstr "Digital ud" msgid "Digital In" msgstr "Digital ind" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Håndsæt" msgid "Other" msgstr "Andet" msgid "None" msgstr "Ingen" msgid "On" msgstr "Tænd" msgid "Off" msgstr "Sluk" msgid "Mute" msgstr "Slukket" msgid "Fast" msgstr "Hurtig" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Meget lav" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Lav" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Mellem" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Høj" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Meget høj" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Produktion" msgid "Front Panel Microphone" msgstr "Frontpanelmikrofon" msgid "Front Panel Line In" msgstr "Frontpanels linje ind" msgid "Front Panel Headphones" msgstr "Frontpanels hovedtelefoner" msgid "Front Panel Line Out" msgstr "Frontpanels linje ud" msgid "Green Connector" msgstr "Grøn forbindelse " msgid "Pink Connector" msgstr "Lyserød forbindelse" msgid "Blue Connector" msgstr "Blå forbindelse" msgid "White Connector" msgstr "Hvid forbindelse" msgid "Black Connector" msgstr "Sort forbindelse" msgid "Gray Connector" msgstr "Grå forbindelse" msgid "Orange Connector" msgstr "Orange forbindelse" msgid "Red Connector" msgstr "Rød forbindelse" msgid "Yellow Connector" msgstr "Gul forbindelse" msgid "Green Front Panel Connector" msgstr "Grøn frontpanelforbindelse" msgid "Pink Front Panel Connector" msgstr "Lyserød frontpanelforbindelse" msgid "Blue Front Panel Connector" msgstr "Blå frontpanelforbindelse" msgid "White Front Panel Connector" msgstr "Hvid frontpanelforbindelse" msgid "Black Front Panel Connector" msgstr "Sort frontpanelforbindelse" msgid "Gray Front Panel Connector" msgstr "Grå frontpanelforbindelse" msgid "Orange Front Panel Connector" msgstr "Orange frontpanelforbindelse" msgid "Red Front Panel Connector" msgstr "Rød frontpanelforbindelse" msgid "Yellow Front Panel Connector" msgstr "Gul frontpanelforbindelse" msgid "Spread Output" msgstr "Spred uddata" msgid "Downmix" msgstr "Downmix" msgid "Virtual Mixer Input" msgstr "Virtuel mikserinddata" msgid "Virtual Mixer Output" msgstr "Virtuel mikseruddata" msgid "Virtual Mixer Channels" msgstr "Virtuel mikserkanaler" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "%s %d funktion" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funktion" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Kunne ikke åbne lydenhed til afspilning. Denne version af Open Sound System " "er ikke understøttet af dette element." msgid "Playback is not supported by this audio device." msgstr "Afspilning er ikke understøttet af denne lydenhed." msgid "Audio playback error." msgstr "Fejl ved lydafspilning." msgid "Recording is not supported by this audio device." msgstr "Optagelse er ikke understøttet af denne lydenhed." msgid "Error recording from audio device." msgstr "Fejl ved optagelse fra lydenhed." msgid "Gain" msgstr "Forhøjelse" msgid "Headphone" msgstr "Hovedtelefon" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Fejl ved læsning af %d byte på enhed '%s'." # Er rammestørrelse ikke mere passende? Jeg er dog ikke helt sikker på # konteksten her. #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Fik uventet billedstørrelse på %u i steden for %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Fejl ved læsning af %d byte på enhed '%s'." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Fejl ved hentning af egenskaber for enhed '%s': Det er ikke en v412 driver. " "Kontroller om det er en v411 driver." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Listning af inddata-attributter for %d i enhed %s fejlede" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "Hentning af indstillinger for tuner %d på enhed '%s' fejlede." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Listning af standard på enhed '%s' fejlede." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Hentning af kontrolattributter for enhed '%s' fejlede." #, c-format msgid "Cannot identify device '%s'." msgstr "Kan ikke identificere enhed '%s'." #, c-format msgid "This isn't a device '%s'." msgstr "Dette er ikke en enheds '%s'." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Kunne ikke tilgå enhed '%s'." #, c-format msgid "Device '%s' is not a capture device." msgstr "Enhed '%s' er ikke en optageenhed." #, c-format msgid "Device '%s' is not a output device." msgstr "Enhed '%s' er ikke en uddataenhed." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Indstilling af standard for enhed '%s' fejlede." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "Kunne ikke hente nuværende tuner-frekvens for enhed '%s'." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "Kunne ikke sætte nuværende tuner-frekvens for enhed '%s' til %lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Kunne ikke hente signalstyrke for enhed '%s'." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Kunne ikke hente værdi af kontrol %d for enhed '%s'." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "Kunne ikke sætte værdi %d på kontrol %d for enhed '%s'." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Kunne ikke hente nuværende inddata for enhed '%s'. Måske er det en radioenhed" #, c-format msgid "Failed to set input %d on device %s." msgstr "Kunne ikke sætte inddata %d for enhed %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Kunne ikke hente nuværende uddata for enhed '%s'. Måske er det en radioenhed" #, c-format msgid "Failed to set output %d on device %s." msgstr "Kunne ikke sætte uddata %d for enhed %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Kunne ikke sætte mellemlager fra enhed '%s' i kø." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Forsøg på at hente videorammer fra enhed '%s' mislykkedes." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Fejlede efter %d forsøg. enhed %s. systemfejl: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Kunne ikke hente parametre fra enhed '%s'" msgid "Video input device did not accept new frame rate setting." msgstr "" "Enheden til videoinddata accepterede ikke ny indstilling for billedrate." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Kunne ikke afbilde mellemlager fra enhed '%s'" #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "Driveren til enhed '%s' understøtter ingen kendt optagemetode." msgid "Changing resolution at runtime is not yet supported." msgstr "Ændring af opløsning under kørsel er endnu ikke understøttet." msgid "Cannot operate without a clock" msgstr "Kan ikke fungere uden et ur" gst-plugins-good-0.10.31/po/eu.po0000644000175000017500000004764411720565342013412 00000000000000# translation of gst-plugins-good.master.po to Basque # Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the gst-plugins-good package. # # Iñaki Larrañaga Murgoitio , 2009, 2010. # Mikel Olasagasti Uranga , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: gst-plugins-good-0.10.18.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2010-03-25 12:37+0100\n" "Last-Translator: Mikel Olasagasti Uranga \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Could not establish connection to sound server" msgstr "Ezin izan da konexioa ezarri soinu-zerbitzariarekin" msgid "Failed to query sound server capabilities" msgstr "Huts egin du soinu-zerbitzariaren ahalmena kontsultatzean" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "'%s' - '%s'" msgid "Internal data stream error." msgstr "Datu-korrontearen barne-errorea." msgid "Failed to decode JPEG image" msgstr "Huts egin du JPEG irudia deskodetzean" msgid "Could not connect to server" msgstr "Ezin izan da konektatu zerbitzariarekin" msgid "Server does not support seeking." msgstr "" #, fuzzy msgid "Could not resolve server name." msgstr "Ezin izan da konektatu zerbitzariarekin" #, fuzzy msgid "Could not establish connection to server." msgstr "Ezin izan da konexioa ezarri soinu-zerbitzariarekin" msgid "Secure connection setup failed." msgstr "" msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" msgid "Server sent bad data." msgstr "" msgid "No URL set." msgstr "" msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "" "Ez dago audio-sarrerarik, edo baliogabea da. AVI korrontea hondatua egongo " "da." msgid "This file contains no playable streams." msgstr "Fitxategi horretan ez dago erreproduzi daitekeen korronterik." msgid "This file is invalid and cannot be played." msgstr "Fitxategi hau ez da baliozkoa eta ezin da erreproduzitu." msgid "This file is corrupt and cannot be played." msgstr "Fitxategi hau hondatua dago, eta ezin da erreproduzitu." msgid "Invalid atom size." msgstr "" msgid "This file is incomplete and cannot be played." msgstr "Fitxategi hau osatu gabea dago, eta ezin da erreproduzitu." msgid "The video in this file might not play correctly." msgstr "" "Litekeena da fitxategi honetako bideoa ez behar bezala erreproduzitzea." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "" "Fitxategi horrek korronte gehiegi ditu. Erreproduzitu soilik lehen %d(r)ak" msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Ez da onartutako korronterik aurkitu. GStreamer RTSP hedapena instalatu " "beharko duzu Real multimediako korronteentzako." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Ez da onartutako korronterik aurkitu. Garraioko protokolo gehiago baimentzea " "behar da edo GStreamer RTSP hedapen egokia falta zaizu." msgid "Internal data flow error." msgstr "Datu-fluxuaren barne-errorea." msgid "Volume" msgstr "Bolumena" msgid "Bass" msgstr "Baxua" msgid "Treble" msgstr "Altua" msgid "Synth" msgstr "Sintetizadorea" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Bozgorailua" msgid "Line-in" msgstr "Linea-sarrera" msgid "Microphone" msgstr "Mikrofonoa" msgid "CD" msgstr "CDa" msgid "Mixer" msgstr "Nahastailea" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Grabazioa" msgid "In-gain" msgstr "Sarrerako irabazia" msgid "Out-gain" msgstr "Irteerako irabazia" msgid "Line-1" msgstr "1. linea" msgid "Line-2" msgstr "2. linea" msgid "Line-3" msgstr "3. linea" msgid "Digital-1" msgstr "1. digitala" msgid "Digital-2" msgstr "2. digitala" msgid "Digital-3" msgstr "3. digitala" msgid "Phone-in" msgstr "Aurikularren sarrera" msgid "Phone-out" msgstr "Aurikularren irteera" msgid "Video" msgstr "Bideoa" msgid "Radio" msgstr "Irratia" msgid "Monitor" msgstr "Monitorea" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Ezin izan da audioaren gailua ireki erreproduzitzeko. Beste aplikazio batek " "darabil gailua." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Ezin izan da audioaren gailua ireki erreproduzitzeko. Ez duzu baimenik " "gailua irekitzeko." msgid "Could not open audio device for playback." msgstr "Ezin izan da audioaren gailua ireki erreproduzitzeko." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Ezin izan da audioaren gailua ireki grabatzeko. Ez duzu baimenik gailua " "irekitzeko." msgid "Could not open audio device for recording." msgstr "Ezin izan da audioaren gailua ireki grabatzeko." msgid "Could not open audio device for mixer control handling." msgstr "Ezin izan da audioko gailua ireki nahastailearen kontrola kudeatzeko." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Ezin izan da audioko gailua ireki nahastailearen kontrola kudeatzeko. " "Elementu honek ez du onartzen Open Sound System-en bertsio hau." msgid "Master" msgstr "Maisua" msgid "Front" msgstr "Aurrealdekoa" msgid "Rear" msgstr "Atzealdekoa" msgid "Headphones" msgstr "Aurikularrak" msgid "Center" msgstr "Erdikoa" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Inguratzailea" msgid "Side" msgstr "Albokoa" msgid "Built-in Speaker" msgstr "Barneko bozgorailua" msgid "AUX 1 Out" msgstr "1. irteera lagungarria" msgid "AUX 2 Out" msgstr "2. irteera lagungarria" msgid "AUX Out" msgstr "Irteera lagungarria" msgid "3D Depth" msgstr "3D sakonera" msgid "3D Center" msgstr "3D zentrua" msgid "3D Enhance" msgstr "3D hobetua" msgid "Telephone" msgstr "Telefonoa" msgid "Line Out" msgstr "Irteerako linea" msgid "Line In" msgstr "Sarrerako linea" msgid "Internal CD" msgstr "Barneko CDa" msgid "Video In" msgstr "Bideo-sarrera" msgid "AUX 1 In" msgstr "1. sarrera lagungarria" msgid "AUX 2 In" msgstr "2. sarrera lagungarria" msgid "AUX In" msgstr "Sarrera lagungarria" msgid "Record Gain" msgstr "Grabazioaren irabazia" msgid "Output Gain" msgstr "Irteeraren irabazia" msgid "Microphone Boost" msgstr "Mikrofonoaren bultzada" msgid "Loopback" msgstr "Atzera-begizta" msgid "Diagnostic" msgstr "Diagnostikoa" msgid "Bass Boost" msgstr "Baxuaren bultzada" msgid "Playback Ports" msgstr "Erreprodukzioaren atakak" msgid "Input" msgstr "Sarrera" msgid "Record Source" msgstr "Grabazioaren iturburua" msgid "Monitor Source" msgstr "Monitorearen iturburua" msgid "Keyboard Beep" msgstr "Teklatuaren soinua" msgid "Simulate Stereo" msgstr "Simulatu estereoa" msgid "Stereo" msgstr "Estereoa" msgid "Surround Sound" msgstr "Soinu inguratzailea" msgid "Microphone Gain" msgstr "Mikrofonoaren irabazia" msgid "Speaker Source" msgstr "Bozgorailuaren iturburua" msgid "Microphone Source" msgstr "Mikrofonoaren iturburua" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Zentratua / LFE" msgid "Stereo Mix" msgstr "Estereozko nahasketa" msgid "Mono Mix" msgstr "Monozko nahasketa" msgid "Input Mix" msgstr "Sarrerako nahasketa" msgid "SPDIF In" msgstr "SPDIF sarrera" msgid "SPDIF Out" msgstr "SPDIF irteera" msgid "Microphone 1" msgstr "1. mikrofonoa" msgid "Microphone 2" msgstr "2. mikrofonoa" msgid "Digital Out" msgstr "Irteera digitala" msgid "Digital In" msgstr "Sarrera digitala" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modema" msgid "Handset" msgstr "Aurikular+mikrofonoa" msgid "Other" msgstr "Bestelakoa" msgid "None" msgstr "Bat ere ez" msgid "On" msgstr "Piztu" msgid "Off" msgstr "Itzali" msgid "Mute" msgstr "Mututu" msgid "Fast" msgstr "Bizkorra" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Oso motela" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Motela" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Tartekoa" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Altua" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Oso altua" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Ekoizpena" msgid "Front Panel Microphone" msgstr "Aurrealdeko paneleko mikrofonoa" msgid "Front Panel Line In" msgstr "Aurrealdeko paneleko sarrerako linea" msgid "Front Panel Headphones" msgstr "Aurrealdeko paneleko aurikularrak" msgid "Front Panel Line Out" msgstr "Aurrealdeko paneleko irteerako linea" msgid "Green Connector" msgstr "Konektore berdea" msgid "Pink Connector" msgstr "Konektore arrosa" msgid "Blue Connector" msgstr "Konektore urdina" msgid "White Connector" msgstr "Konektore zuria" msgid "Black Connector" msgstr "Konektore beltza" msgid "Gray Connector" msgstr "Konektore grisa" msgid "Orange Connector" msgstr "Konektore laranja" msgid "Red Connector" msgstr "Konektore gorria" msgid "Yellow Connector" msgstr "Konektore horia" msgid "Green Front Panel Connector" msgstr "Aurrealdeko paneleko konektore berdea" msgid "Pink Front Panel Connector" msgstr "Aurrealdeko paneleko konektore arrosa" msgid "Blue Front Panel Connector" msgstr "Aurrealdeko paneleko konektore urdina" msgid "White Front Panel Connector" msgstr "Aurrealdeko paneleko konektore zuria" msgid "Black Front Panel Connector" msgstr "Aurrealdeko paneleko konektore beltza" msgid "Gray Front Panel Connector" msgstr "Aurrealdeko paneleko konektore grisa" msgid "Orange Front Panel Connector" msgstr "Aurrealdeko paneleko konektore laranja" msgid "Red Front Panel Connector" msgstr "Aurrealdeko paneleko konektore gorria" msgid "Yellow Front Panel Connector" msgstr "Aurrealdeko paneleko konektore horia" msgid "Spread Output" msgstr "Zabaldu irteera" msgid "Downmix" msgstr "Tolestu nahasketa" msgid "Virtual Mixer Input" msgstr "Nahastaile birtualaren sarrera" msgid "Virtual Mixer Output" msgstr "Nahastaile birtualaren irteera" msgid "Virtual Mixer Channels" msgstr "Nahastaile birtualaren kanalak" #. TRANSLATORS: name + number of a volume mixer control #, fuzzy, c-format msgid "%s %d Function" msgstr "%s funtzioa" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "%s funtzioa" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Ezin izan da audioaren gailua ireki erreproduzitzeko. Elementu honek ez du " "onartzen Open Sound System-en bertsio hau." msgid "Playback is not supported by this audio device." msgstr "Audio gailu honek ez du erreproduzitzea onartzen." msgid "Audio playback error." msgstr "Errorea audioa erreproduzitzean." msgid "Recording is not supported by this audio device." msgstr "Audio gailu honek ez du grabatzea onartzen." msgid "Error recording from audio device." msgstr "Errorea audioko gailutik grabatzean." msgid "Gain" msgstr "Irabazia" msgid "Headphone" msgstr "Entzungailua" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Errorea gertatu da '%2$s' gailuan %1$d byte irakurtzean." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Ustekabeko fotograma-tamaina jaso da (%u), %u ordez." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Errorea gertatu da '%2$s' gailuan %1$d byte irakurtzean." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Errorea gertatu da '%s' gailuaren ahalmena eskuratzean: Ez da v4l2 " "kontrolatzaile bat. Begiratu v4l1 kontrolatzaile bat den." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Huts egin du %2$s gailuko %1$d. sarreraren atributuak kontsultatzean" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Huts egin du '%2$s' gailuko %1$d. sintonizadorearen ezarpenak eskuratzean." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Huts egin du '%s' gailuaren araua kontsultatzean." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Huts egin dut '%s' gailuaren kontrol-atributuak eskuratzean." #, c-format msgid "Cannot identify device '%s'." msgstr "Ezin da '%s' gailua identifikatu." #, c-format msgid "This isn't a device '%s'." msgstr "Hau ez da '%s' gailu bat." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Ezin izan da '%s' gailua ireki irakurtzeko eta idazteko." #, c-format msgid "Device '%s' is not a capture device." msgstr "'%s' gailua ez da kaptura-gailu bat." #, c-format msgid "Device '%s' is not a output device." msgstr "'%s' gailua ez da irteerako gailu bat." #, c-format msgid "Failed to set norm for device '%s'." msgstr "Huts egin du '%s' gailuaren araua ezartzean." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Huts egin du '%s' gailuaren uneko sintonizazio-frekuentzia eskuratzean." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Huts egin du '%s' gailuaren uneko sintonizazio-frekuentzia %lu Hz-tan " "ezartzean." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Huts egin du '%s' gailuaren seinalearen indarra eskuratzean." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Huts egin du '%2$s' gailuko %1$d. kontrolaren balioa eskuratzean." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Huts egin du '%3$s' gailuko %2$d. kontrolaren %1$d. balioa eskuratzean." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Huts egin du '%s' gailuko uneko sarrera eskuratzean. Litekeena da irrati-" "gailu bat izatea." #, c-format msgid "Failed to set input %d on device %s." msgstr "Huts egin du '%2$s' gailuko %1$d. sarrera ezartzean." #, fuzzy, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Huts egin du '%s' gailuko uneko sarrera eskuratzean. Litekeena da irrati-" "gailu bat izatea." #, fuzzy, c-format msgid "Failed to set output %d on device %s." msgstr "Huts egin du '%2$s' gailuko %1$d. sarrera ezartzean." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "Ezin izan dira bufferrak ilaran jarri '%s' gailuan." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "Huts egin du '%s' gailutik bideo-fotogramak eskuratzen saiatzean." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Huts egin du %d saio eta gero. %s gailua. Sistema-errorea: %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Ezin izan dira '%s' gailuaren parametroak eskuratu" msgid "Video input device did not accept new frame rate setting." msgstr "" "Bideoaren sarrerako gailuak ez du fotograma-tamainaren ezarpen berria " "onartzen." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Ezin izan dira '%s' gailuaren bufferrak mapatu." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "'%s' gailuaren kontrolatzaileak ez du onartzen kaptura-metodo ezagunik." msgid "Changing resolution at runtime is not yet supported." msgstr "Oraindik ez dago onartua exekutatu bitartean bereizmena aldatzea." msgid "Cannot operate without a clock" msgstr "Ezin du funtzionatu erlojurik gabe" #~ msgid "Describes the selected input element." #~ msgstr "Sarrerako elementu hautatua deskribatzen du." #~ msgid "Describes the selected output element for Audio/Video Conferencing." #~ msgstr "" #~ "Audio-/Bideo-konferentziak egiteko irteerako elementu hautatua " #~ "deskribatzen du." #~ msgid "Describes the selected output element for Music and Movies." #~ msgstr "Musikaren eta filmen irteerako elementu hautatua deskribatzen du." #~ msgid "Describes the selected output element." #~ msgstr "Irteerako elementu hautatua deskribatzen du." #~ msgid "GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "Audio-/Bideo-konferentziak egiteko GStreamen audio-kolektorea" #~ msgid "GStreamer audiosink for Music and Movies" #~ msgstr "Musikaren eta filmen GStreamer audio-kolektorea" #~ msgid "" #~ "GStreamer can play audio using any number of output elements. Some " #~ "possible choices are osssink, esdsink and alsasink. The audiosink can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "Hainbat irteerako elementu erabiliz erreproduzi dezake audioa GStreamer-" #~ "ek. Hala nola osssink, esdsink eta alsasink. Audio-kolektorea kanalizazio " #~ "partzial bat izan daiteke, elementu bat izan beharrean." #~ msgid "" #~ "GStreamer can play video using any number of output elements. Some " #~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " #~ "The videosink can be a partial pipeline instead of just one element." #~ msgstr "" #~ "Hainbat irteerako elementu erabiliz erreproduzi dezake bideoa GStreamer-" #~ "ek. Hala nola xvimagesink, ximagesink, sdlvideosink eta aasink. Bideo-" #~ "kolektorea kanalizazio partzial bat izan daiteke, elementu bat izan " #~ "beharrean." #~ msgid "" #~ "GStreamer can put visualization plugins in a pipeline to transform audio " #~ "stream in video frames. Default is goom but more visualization plugins " #~ "will be ported soon. The visualization plugin can be a partial pipeline " #~ "instead of just one element." #~ msgstr "" #~ "Kanalizazioetan bistaratzeko pluginak jar ditzake GStreamer-ek, audio-" #~ "korronteak bideo-fotograma bihurtzeko. Goom da lehenetsia, baina laster " #~ "izango da bistaratzeko plugin gehiago. Bistaratzeko plugina kanalizazio " #~ "partzial bat izan daiteke, elementu bat izan beharrean." #~ msgid "" #~ "GStreamer can record audio using any number of input elements. Some " #~ "possible choices are osssrc, esdsrc and alsasrc. The audio source can be " #~ "a partial pipeline instead of just one element." #~ msgstr "" #~ "Hainbat sarrerako elementu erabiliz graba dezake audioa GStreamer-ek. " #~ "Hala nola osssrc, esdsrc eta alsasrc. Audio-iturburua kanalizazio " #~ "partzial bat izan daiteke, elementu bat izan beharrean." #~ msgid "" #~ "GStreamer can record video from any number of input elements. Some " #~ "possible choices are v4lsrc and videotestsrc. The video source can be a " #~ "partial pipeline instead of just one element." #~ msgstr "" #~ "Hainbat sarrerako elementu erabiliz graba dezake bideoa GStreamer-ek. " #~ "Hala nola v4lsrc eta videotestsrc. Bideo-iturburua kanalizazio partzial " #~ "bat izan daiteke, elementu bat izan beharrean." #~ msgid "default GStreamer audio source" #~ msgstr "GStreamer audio-iturburu lehenetsia" #~ msgid "default GStreamer audiosink" #~ msgstr "GStreamer audio-kolektore lehenetsia" #~ msgid "default GStreamer video source" #~ msgstr "GStreamer bideo-iturburu lehenetsia" #~ msgid "default GStreamer videosink" #~ msgstr "GStreamer bideo-kolektore lehenetsia" #~ msgid "default GStreamer visualization plugin" #~ msgstr "GStreamer bistaratzeko plugin lehenetsia" #~ msgid "description for GStreamer audiosink for Audio/Video Conferencing" #~ msgstr "" #~ "Audio-/Bideo-konferentziak egiteko GStreamen audio-kolektorearen " #~ "deskribapena" #~ msgid "description for GStreamer audiosink for Music and Movies" #~ msgstr "Musikaren eta filmen GStreamer audio-kolektorearen deskribapena" #~ msgid "description for default GStreamer audiosink" #~ msgstr "GStreamer audio-kolektore lehenetsiaren deskribapena" #~ msgid "description for default GStreamer audiosrc" #~ msgstr "GStreamer audiosrc lehenetsiaren deskribapena" gst-plugins-good-0.10.31/po/sl.gmo0000644000175000017500000003551711720565343013560 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""H#X% g% s% % %%M% % % & & & )&3&R&V&f&x&&&&&"&& ' '8+'$d'2'-'6'0!(0R(8(z(27)Rj)t)Y2*/*V*5+'I+%q+ + +++++,,d,,-,-,',N-8d-$-R-S.Hi.C.7.@./7o/3/;/I00a02010C0>;1z111111 1L102A2Z2m222 2 22222 2&2!393 T3`3p3 t33333 333333 3 44&4 :4 H4R4X4 _4 l4z44/44qZ55 5 5556 626C6G6M6]6n666*6 66666 7)7?7R7 m7 x7(77"7778 88.858 E8P8 `8m8Du8:8,8="96`93969: : ": .:9: ?:LJ::::::;!;4;v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-03-12 18:35+0100 Last-Translator: Klemen Košir Language-Team: Slovenian Language: sl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); X-Poedit-Language: Slovenian X-Poedit-Country: SLOVENIA X-Poedit-SourceCharset: utf-8 Funkcija %s %dFunkcija %s'%s' - '%s'3D sredina3D globina3D izboljšavaPrišlo je do omrežne napake ali pa se je povezava nepričakovano prekinila.Vhod AUX 1Izhod AUX 1Vhod AUX 2Izhod AUX 2Vhod AUXIzhod AUXNapaka med predvajanjem zvoka.BasOjačitev basovČrni priključekČrni priključek spredajModri priključekModri priključek spredajVgrajen zvočnikCDNaprave '%s' ni mogoče določiti.Delovanje brez ure ni mogočeSredinskiSrednji / LFESpreminjanje ločljivosti med delovanjem še ni podprto.S strežnikom se ni mogoče povezatiMedpomnilnika na napravi '%s' ni mogoče uvrstiti.Povezave s strežnikom ni mogoče vzpostavitiPovezave z zvočnim strežnikom ni mogoče vzpostavitiParametrov na napravi '%s' ni mogoče pridobiti.Medpomnilnika naprave '%s' ni mogoče preslikatiZvočne naprave ni mogoče odpreti za nadzor mešalnika.Zvočne naprave ni mogoče odpreti za nadzor mešalnika. Predmet ne podpira trenutne različice sistema Open Sound System.Zvočne naprave ni mogoče odpreti za predvajanje.Zvočne naprave ni mogoče odpreti za predvajanje. Napravo uporablja drug program.Zvočne naprave ni mogoče odpreti za predvajanje. Predmet ne podpira trenutne različice sistema Open Sound System.Zvočne naprave ni mogoče odpreti za predvajanje. Nimate dovoljenj za odpiranje naprave.Zvočne naprave ni mogoče odpreti za snemanje.Zvočne naprave ni mogoče odpreti za snemanje. Nimate dovoljenj za odpiranje naprave.Naprave '%s' ni mogoče odpreti za branje in pisanje.Imena strežnika ni mogoče razrešiti.Naprava '%s' ni naprava za zajemanje.Naprava '%s' ni izhodna naprava.DiagnostikaDigitalni vhodDigitalni izhodDigitalni vhod 1Digitalni vhod 2Digitalni vhod 3Zmanjševanje kanalovNapaka med pridobivanjem zmožnosti naprave '%s': ni gonilnik v4l2. Preverite, če je gonilnik v4l1.Napaka med branjem %d bajtov iz naprave '%s'.Napaka med branjem %d bajtov na napravi '%s'.Napaka med snemanjem z zvočno napravo.Neuspešen zagon po %d poskusih na napravi %s. Sporočilo sistemske napake: %sNapaka med pridobivanjem atributov nadzora naprave '%s'.Odkodiranje slike JPEG je spodleteloNapaka med pridobivanjem trenutnega vhoda naprave '%s'. Morda je radijska naprava.Napaka med pridobivanjem trenutnega izhoda naprave '%s'. Morda je radijska naprava.Napaka med pridobivanjem trenutne frekvence uglaševalnika naprave '%s'.Napaka med pridobivanjem nastavitev uglaševalnika %d naprave '%s'.Napaka med pridobivanjem moči signala za napravo '%s'.Napaka med pridobivanjem vrednosti za nadzor %d na napravi '%s'.Napaka med poizvedovanjem atributov vhoda %d naprave %sNapaka med poizvedovanjem uravnanosti naprave '%s'.Poizvedba o zmogljivosti zvočnega strežnika je spodletelaNapaka med nastavljanjem frekvence uglaševalnika naprave '%s' na %lu Hz.Napaka med nastavljanjem vhoda %d na napravi %s.Napaka med nastavljanjem uravnanosti naprave '%s'.Napaka med nastavljanjem izhoda %d na napravi %s.Napaka med nastavljanjem vrednosti %d za nadzor %d na napravi '%s'.Napaka med poskusom pridobivanja video sličic z naprave '%s'.HitroSprednjiSlušalke spredajAnalogni vhod spredajAnalogni izhod spredajMikrofon spredajOjačitevNepričakovana vrednost velikosti okvirja (%u). Pričakovana vrednost je %u.Sivi priključekSivi priključek spredajZeleni priključekZeleni priključek spredajHDMIProstoročna slušalkaSlušalkeSlušalkeVisokoVhodna ojačitevVhodMešanje vhodaNotranji CDNotranja napaka pretočnosti podatkov.Notranja napaka pretoka podatkov.Neveljavna velikost atoma.PriključekPisk tipkovniceLFEAnalogni vhodAnalogni izhodAnalogni vhod 1Analogni vhod 2Analogni vhod 3Analogni vhodPovratna zankaNizkoGlavniSrednjeMikrofonMikrofon 1Mikrofon 2Ojačitev mikrofonaOjačitev mikrofonaVir mikrofonaMešalnikModemZaslonNadzoruj virMono mešanjeNemoNi nastavljenega naslova URL.Napaka vhodnega zvoka, pretok AVI bo pokvarjen.Podprtega pretoka ni mogoče najti. Najverjetneje je treba omogočiti več protokolov prenosa ali pa manjka ustrezen vstavek GStreamer RTSP.Ni mogoče najti podprtega pretoka. Najverjetneje je treba namestiti vstavek GStreamer RTSP za pretoke RealMedia.BrezIzključenoVključenoOranžni priključekOranžni priključek spredajDrugoIzhodna ojačitevOjačitev izhodaPCMPCM-2Telefonski vhodTelefonski izhodRoza priključekRoza priključek spredajVrata predvajanjaTa zvočna naprava ne podpira predvajanja.ProizvodnjaRadioZadnjiSnemanjeOjačitev snemanjaSnemaj virSnemanje s to zvočno napravo ni podprto.Rdeči priključekRdeči priključek spredajVhod SPDIFIzhod SPDIFNastavitev varne povezave je spodletela.Strežnik ne podpira iskanja.Strežnik je poslal slabe podatke.StranskiSimuliran stereoZvočnikVir zvočnikaRazširi izhodStereoStereo mešanjeProstorskiProstorski zvokSintetizatorTelefonGonilnik naprave '%s' ne podpira nobenega znanega načina zajemanja.Video zapis v tej datoteki morda ne bo predvajan pravilno.Datoteka ne vsebuje pretokov za predvajanje.Datoteka vsebuje več pretokov. Predvajano bo le začetnih %dDatoteka je pokvarjena, zato je ni mogoče predvajati.Datoteka ni popolna, zato je ni mogoče predvajati.Datoteka je neveljavna, zato je ni mogoče predvajati.To ni naprava '%s'.Visoki toniZelo visokoZelo nizkoVideoVideo vhodVhodni video napravi ni mogoče določiti novih nastavitev hitrosti sličic.Kanali navideznega mešalnikaVhod navideznega mešalnikaIzhod navideznega mešalnikaGlasnostBeli priključekBeli priključek spredajRumeni priključekRumeni priključek spredajgst-plugins-good-0.10.31/po/gl.gmo0000644000175000017500000003722011720565343013535 00000000000000   , 9C LJW    )8Sdg 4))2.\'&7)VqW*X3a$#     ) 3=aE(&"22MGH6-1d.23$,)Q@{$#%5+3a.+:Ue     (,4=DKRZcgn u   6 ArKPTWh  / &17< C O0]     % 5 = L Z a l u  D 0 ' !:2!*m!-!*!! " ""%"+"94"n""""""""#$ $$ $$ $P % Z% h% u% % % %%%%%!%& &A&U&2X&!&& &D&''@.'5o';'?'9!([[((@P)z) *_*>*q5+E+-+6,6R, ,,, , , ,,,>i-9-%-O.JX./.j.i>/\/I0JO0L0L0>41As1i1B2Ab2A2W2K>33333334@ 4N4 ^44!44 44 44444 5-5-F5t5555555555 556 6 6 6 *676M6d6 x66666 66C6 77V8^8f8o8"888888888 9/92F9 y999999099$ : /: =::J::"::: ::;;; .;9; H; U;T_;C;6;J/<3z<7<4<"=>=E= N=X=_=Sq===>>$>"6>Y>#l>v` M%$BnJD-8+bh1@Rlw<:G H&g{Y7p[fWQ"UcqX*?|u'N50IVrP m#eCd,(~a/zsAx24=^! )6OTSFy>9LtijkZ]\}_Ko. ;3E%s %d Function%s Function'%s' by '%s'3D Center3D Depth3D EnhanceA network error occured, or the server closed the connection unexpectedly.AUX 1 InAUX 1 OutAUX 2 InAUX 2 OutAUX InAUX OutAudio playback error.BassBass BoostBlack ConnectorBlack Front Panel ConnectorBlue ConnectorBlue Front Panel ConnectorBuilt-in SpeakerCDCannot identify device '%s'.Cannot operate without a clockCenterCenter / LFEChanging resolution at runtime is not yet supported.Could not connect to serverCould not enqueue buffers in device '%s'.Could not establish connection to server.Could not establish connection to sound serverCould not get parameters on device '%s'Could not map buffers from device '%s'Could not open audio device for mixer control handling.Could not open audio device for mixer control handling. This version of the Open Sound System is not supported by this element.Could not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for playback. This version of the Open Sound System is not supported by this element.Could not open audio device for playback. You don't have permission to open the device.Could not open audio device for recording.Could not open audio device for recording. You don't have permission to open the device.Could not open device '%s' for reading and writing.Could not resolve server name.Device '%s' is not a capture device.Device '%s' is not a output device.DiagnosticDigital InDigital OutDigital-1Digital-2Digital-3DownmixError getting capabilities for device '%s': It isn't a v4l2 driver. Check if it is a v4l1 driver.Error reading %d bytes from device '%s'.Error reading %d bytes on device '%s'.Error recording from audio device.Failed after %d tries. device %s. system error: %sFailed getting controls attributes on device '%s'.Failed to decode JPEG imageFailed to get current input on device '%s'. May be it is a radio deviceFailed to get current output on device '%s'. May be it is a radio deviceFailed to get current tuner frequency for device '%s'.Failed to get setting of tuner %d on device '%s'.Failed to get signal strength for device '%s'.Failed to get value for control %d on device '%s'.Failed to query attributes of input %d in device %sFailed to query norm on device '%s'.Failed to query sound server capabilitiesFailed to set current tuner frequency for device '%s' to %lu Hz.Failed to set input %d on device %s.Failed to set norm for device '%s'.Failed to set output %d on device %s.Failed to set value %d for control %d on device '%s'.Failed trying to get video frames from device '%s'.FastFrontFront Panel HeadphonesFront Panel Line InFront Panel Line OutFront Panel MicrophoneGainGot unexpected frame size of %u instead of %u.Gray ConnectorGray Front Panel ConnectorGreen ConnectorGreen Front Panel ConnectorHDMIHandsetHeadphoneHeadphonesHighIn-gainInputInput MixInternal CDInternal data flow error.Internal data stream error.Invalid atom size.JackKeyboard BeepLFELine InLine OutLine-1Line-2Line-3Line-inLoopbackLowMasterMediumMicrophoneMicrophone 1Microphone 2Microphone BoostMicrophone GainMicrophone SourceMixerModemMonitorMonitor SourceMono MixMuteNo URL set.No or invalid input audio, AVI stream will be corrupt.No supported stream was found. You might need to allow more transport protocols or may otherwise be missing the right GStreamer RTSP extension plugin.No supported stream was found. You might need to install a GStreamer RTSP extension plugin for Real media streams.NoneOffOnOrange ConnectorOrange Front Panel ConnectorOtherOut-gainOutput GainPCMPCM-2Phone-inPhone-outPink ConnectorPink Front Panel ConnectorPlayback PortsPlayback is not supported by this audio device.ProductionRadioRearRecordRecord GainRecord SourceRecording is not supported by this audio device.Red ConnectorRed Front Panel ConnectorSPDIF InSPDIF OutSecure connection setup failed.Server does not support seeking.Server sent bad data.SideSimulate StereoSpeakerSpeaker SourceSpread OutputStereoStereo MixSurroundSurround SoundSynthTelephoneThe driver of device '%s' does not support any known capture method.The video in this file might not play correctly.This file contains no playable streams.This file contains too many streams. Only playing first %dThis file is corrupt and cannot be played.This file is incomplete and cannot be played.This file is invalid and cannot be played.This isn't a device '%s'.TrebleVery HighVery LowVideoVideo InVideo input device did not accept new frame rate setting.Virtual Mixer ChannelsVirtual Mixer InputVirtual Mixer OutputVolumeWhite ConnectorWhite Front Panel ConnectorYellow ConnectorYellow Front Panel ConnectorProject-Id-Version: gst-plugins-good 0.10.26.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-01-09 21:20+0100 Last-Translator: Fran Diéguez Language-Team: Galician Language: gl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n!=1); Función %s %dFunción %s«%s» por «%s»Centro 3DProfundidade 3DMellora 3DProduciuse un erro de rede ou o servidor pechou a conexión de forma inesperada.Entrada AUX 1Saída AUX 1Entrada AUX 2Saída AUX 2Entrada AUXSaída AUXErro de reprodución de son.BaixosAumento de baixosConectador negroConectador negro do panel frontalConectador azulConectador azul do panel frontalAltofalante internoCDNon foi posíbel identificar o dispositivo «%s».Non é posíbel operar sen reloxoCentroCentro / LFEAínda non se admite o cambio de resolución durante a reprodución.Non foi posíbel conectarse ao servidorNon é posíbel meter na cola os búferes no dispositivo «%s».Non foi posíbel estabelecer a conexión co servidor.Non foi posíbel estabelecer a conexión co servidor de sonNon foi posíbel obter os parámetros para o dispositivo «%s»Non foi posíbel mapear os búferes do dispositivo «%s»Non foi posíbel abrir o dispositivo de son para a súa xestión polo control de misturado.Non foi posíbel abrir o dispositivo de son para a súa xestión polo control de misturado. Este elemento non admite esta versión do Open Sound System.Non foi posíbel abrir o dispositivo de son para a reprodución.Non foi posíbel abrir o dispositivo de son para a reprodución. O dispositivo está sendo empregado por outro aplicativo.Non foi posíbel abrir o dispositivo de son para a reprodución. Esta versión do Open Sound System non está admitida por este elemento.Non foi posíbel abrir o dispositivo de son. Vostede non ten permisos para abrir o dispositivo.Non foi posíbel abrir o dispositivo de son para a gravación.Non foi posíbel abrir o dispositivo de son para a gravación. Vostede non ten permisos para abrir o dispositivo.Non foi posíbel abrir o dispositivo «%s» para lectura e escritura.Non foi posíbel resolver o nome do servidor.O dispositivo «%s» non é un dispositivo de captura.O dispositivo «%s» non é un dispositivo de captura.DiagnósticoEntrada dixitalSaída dixitalDixital 1Dixital 2Dixital 3Redución de canlesProduciuse un erro ao obter as capacidades do dispositivo «%s»: Non é un controlador v4l2. Comprobe se é un controlador v4l1.Produciuse un erro ao ler %d bytes desde o dispositivo «%s».Produciuse un erro ao ler %d bytes do dispositivo «%s».Erro ao gravar do dispositivo de son.Prouciuse un fallo despois de %d intentos. Dispositivo %s. Error do sistema: %sProduciuse un erro ao obter os atributos de control do dispositivo «%s».Produciuse un erro ao descodificar a imaxe JPEGProduciuse un fallo ao obter a entrada actual no dispositivo «%s». Cicáis sexa un dispositivo de radio.Produciuse un fallo ao obter a entrada actual no dispositivo «%s». Quizais sexa un dispositivo de radioProduciuse un fallo ao obter a frecuencia actual do sintonizador para o dispositivo «%s».Produciuse un erro ao configurar o sintonizador %d no dispositivo «%s».Produciuse un erro ao obter a potencia do sinal para o dispositivo «%s».Produciuse un erro ao obter o valor para o control %d do dispositivo «%s».Produciuse un erro ao consultar os atributos de entrada %d no dispositivo %sProduciuse un erro ao consultar a norma no dispositivo «%s».Produciuse un erro ao consultar as capacidades do servidor de sonProduciuse un erro ao estabelecer a frecuencia actual do sintonizador para o dispositivo «%s» a %lu Hz.Produciuse un fallo ao estabelecer a entrada %d no dispositivo %s.Produciuse un fallo ao estabelecer a norma no dispositivo «%s».Produciuse un fallo ao estabelecer a saída %d no dispositivo %s.Produciuse un fallo ao estabelecer o valor %ds para o control %d do dispositivo «%s».Produciuse un fallo ao tentar obter cadros de vídeo do dispositivo «%s».RápidoFrontalAuriculares do panel frontalEntrada do panel frontalSaída do panel frontalMicrófono do panel frontalGananciaObtívose un tamaño de marco de %u non esperado no lugar de %u.Conectador grisConectador gris do panel frontalConectador verdeConectador verde do panel frontalHDMIAuricularesCascosAuricularesAltoGanancia de entradaEntradaMisturador de entradaCD internoProduciuse un erro interno no fluxo de datos.Produciuse un erro no fluxo de datos interno.Tamaño atom non válido.JackPitido de tecladoLFELiña de entradaLiña de saídaLiña 1Liña 2Liña 3Liña de entradaBucle localBaixoMestreMedioMicrófonoMicrófono 1Micrófono 2Aumento do micrófonoGanancia do micrófonoMicrófono de orixeMisturadorMódemMonitorMonitor de orixeMisturador monoSilenciarNo existe un URL estabelecido.O audio non existe ou non é válido, o fluxo AVI está corrompido.Non se encontrou un fluxo compatíbel. Pode que necesite permitir máis protocolos de transporte ou de outra forma pode que lle falte a extensión correcta de RTSP de GStreamer.Non se encontrou un fluxo compatíbel. Pode que necesite instalar unha extensión RTSP de GStreamer para os formatos de fluxo Real.NingúnApagadoAcendidoConectador laranxaConectador laranxado panel frontalOutroGanancia de saídaGanancia de saídaPCMPCM-2Entrada teléfonoSaída teléfonoConectador rosaConectador rosa do panel frontalPortos de reproduciónEste dispositivo de son non admite a reprodución.ProduciónRadioTreseiroGravarGanancia de gravaciónOrixe da gravaciónEste dispositivo de son non admite a gravación.Conectador vermelloConectador vermello do panel frontalEntrada SPDIFSaída SPDIFProduciuse un fallo de configuración da conexión segura.O servidor non admite a busca.O servidor enviou datos erróneos.LateralSimular estéreoAltofalanteAltofalante de orixeExpandir saídaEstéreoMisturador estéreoEnvolventeSon envolventeSintetizadorTeléfonoO controlador do dispositivo «%s» non admite ningún método de captura coñecido.Este vídeo neste ficheiro podería non reproducirse correctamente.Este ficheiro non contén ningún fluxo reproducíbel.Este ficheiro contén demasiados fluxos. Só se reproducirá o primeiro %dEste ficheiro está danado e non pode reproducirse.Este ficheiro está incompleto e non pode reproducirse.Este ficheiro é incorrecto e non pode reproducirse.Este non é un dispositivo «%s».AgudosMoi altoMoi baixoVídeoEntrada de vídeoO dispositivo de entrada de vídeo non aceptou o axuste da nova taxa de fotogramas.Canles do misturador virtualEntrada do misturador virtualSaída do misturador virtualVolumeConectador brancoConectador branco do panel frontalConectador amareloConectador amarelo do panel frontalgst-plugins-good-0.10.31/po/eo.gmo0000644000175000017500000000503211720565342013531 00000000000000-=   )4V^* !( / : GTZ`hmrvy    2UM-    " , 8 D L S Z d j u            (%)$ !'  #&", +- *%s %d Function%s Function'%s' by '%s'BassCDCenterCould not connect to serverCould not open audio device for playback.Could not open audio device for playback. Device is being used by another application.Could not open audio device for recording.FastFrontHeadphonesHighInputInternal data stream error.LowMasterMediumMicrophoneMicrophone 1Microphone 2MixerModemMonitorMuteNoneOffOnOtherRadioRearRecordSideSpeakerStereoSurroundSurround SoundSynthThis isn't a device '%s'.Very HighVery LowVideoVolumeProject-Id-Version: gst-plugins-good 0.10.28.2 Report-Msgid-Bugs-To: http://bugzilla.gnome.org/ POT-Creation-Date: 2012-02-21 00:10+0000 PO-Revision-Date: 2011-06-04 21:48+0100 Last-Translator: Kristjan SCHMIDT Language-Team: Esperanto Language: eo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); %s %d funkcio%s funcio'%s' de '%s'BasoKDCentreNe eblis konekti al serviloNe eblis malfermi la sonaparaton por reproduktado.Ne eblis malfermi la sonaparaton por reproduktado. Ĝi estas uzate de alia aplikaĵo.Ne eblis malfermi sonaparaton por registrado.RapideAntaŭeKaptelefonoAlteEnigoInterna datumflu-eraro.MalalteĈefeMezeMikrofonoMikrofono 1Mikrofono 2MiksiloModemoEkranoSilentigiNeniuElŝaltiteEnŝaltiteAliaRadioMalantaŭeRegistriFlankeParoliloDukanaleĈirkaŭeĈirkaŭa sonoSinteziloTio ne estas '%s'-aparato.Tre alteTre malalteVideoLaŭtecogst-plugins-good-0.10.31/po/fr.po0000644000175000017500000004072011720565342013374 00000000000000# Translation of gst-plugins-good to French # Copyright (C) 2003-2011 GStreamer core team # This file is distributed under the same license as the gst-plugins-good package. # # Nicolas Velin , 2008. # Claude Paroz , 2008-2011. # msgid "" msgstr "" "Project-Id-Version: gst-plugins-good 0.10.28.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" "POT-Creation-Date: 2012-02-21 00:10+0000\n" "PO-Revision-Date: 2011-04-28 09:22+0200\n" "Last-Translator: Claude Paroz \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Could not establish connection to sound server" msgstr "Impossible d'établir une connexion vers le serveur de son" msgid "Failed to query sound server capabilities" msgstr "" "Échec lors de l'interrogation du serveur de son au sujet de ses capacités" #. TRANSLATORS: 'song title' by 'artist name' #, c-format msgid "'%s' by '%s'" msgstr "« %s » par « %s »" msgid "Internal data stream error." msgstr "Erreur interne de flux de données." msgid "Failed to decode JPEG image" msgstr "Échec de décodage de l'image JPEG" msgid "Could not connect to server" msgstr "Impossible de se connecter au serveur" msgid "Server does not support seeking." msgstr "Le serveur ne gère pas le positionnement." msgid "Could not resolve server name." msgstr "Impossible de résoudre le nom du serveur." msgid "Could not establish connection to server." msgstr "Impossible d'établir une connexion vers le serveur." msgid "Secure connection setup failed." msgstr "La configuration d'une connexion sécurisée a échoué." msgid "" "A network error occured, or the server closed the connection unexpectedly." msgstr "" "Une erreur réseau s'est produite ou le serveur a fermé abruptement la " "connexion." msgid "Server sent bad data." msgstr "Le serveur a envoyé de mauvaises données." msgid "No URL set." msgstr "Aucun URL défini." msgid "No or invalid input audio, AVI stream will be corrupt." msgstr "Entrée audio absente ou non valide, le flux AVI sera corrompu." msgid "This file contains no playable streams." msgstr "Ce fichier ne contient aucun flux exploitable." msgid "This file is invalid and cannot be played." msgstr "Ce fichier n'est pas valide et ne peut donc pas être lu." msgid "This file is corrupt and cannot be played." msgstr "Ce fichier est corrompu et ne peut pas être lu." msgid "Invalid atom size." msgstr "Taille d'atome non valide." msgid "This file is incomplete and cannot be played." msgstr "Ce fichier n'est pas complet et ne peut donc pas être lu." msgid "The video in this file might not play correctly." msgstr "" "Il est possible que la vidéo de ce fichier ne puisse pas être lue " "correctement." #, c-format msgid "This file contains too many streams. Only playing first %d" msgstr "Ce fichier contient trop de flux. Seuls les %d premiers seront lus." msgid "" "No supported stream was found. You might need to install a GStreamer RTSP " "extension plugin for Real media streams." msgstr "" "Aucun flux pris en charge n'a été trouvé. Il faut peut-être installer un " "greffon d'extension GStreamer RTSP pour les flux Real media." msgid "" "No supported stream was found. You might need to allow more transport " "protocols or may otherwise be missing the right GStreamer RTSP extension " "plugin." msgstr "" "Aucun flux pris en charge n'a été trouvé. Il faut peut-être autoriser " "davantage de protocoles de transport ou il manque peut-être le bon greffon " "d'extension GStreamer RTSP." msgid "Internal data flow error." msgstr "Erreur interne de flux de données." msgid "Volume" msgstr "Volume" msgid "Bass" msgstr "Basses" msgid "Treble" msgstr "Aiguës" msgid "Synth" msgstr "Synth" msgid "PCM" msgstr "PCM" msgid "Speaker" msgstr "Haut-parleur" msgid "Line-in" msgstr "Entrée ligne" msgid "Microphone" msgstr "Micro" msgid "CD" msgstr "CD" msgid "Mixer" msgstr "Mélangeur" msgid "PCM-2" msgstr "PCM-2" msgid "Record" msgstr "Enregistrement" msgid "In-gain" msgstr "Gain d'entrée" msgid "Out-gain" msgstr "Gain de sortie" msgid "Line-1" msgstr "Ligne 1" msgid "Line-2" msgstr "Ligne 2" msgid "Line-3" msgstr "Ligne 3" msgid "Digital-1" msgstr "Numérique 1" msgid "Digital-2" msgstr "Numérique 2" msgid "Digital-3" msgstr "Numérique 3" msgid "Phone-in" msgstr "Entrée casque" msgid "Phone-out" msgstr "Sortie casque" msgid "Video" msgstr "Vidéo" msgid "Radio" msgstr "Radio" msgid "Monitor" msgstr "Moniteur" msgid "" "Could not open audio device for playback. Device is being used by another " "application." msgstr "" "Impossible d'ouvrir le périphérique audio pour la lecture. Le périphérique " "est utilisé par une autre application." msgid "" "Could not open audio device for playback. You don't have permission to open " "the device." msgstr "" "Impossible d'ouvrir le périphérique audio pour la lecture. Vous n'avez pas " "les droits nécessaires pour ouvrir le périphérique." msgid "Could not open audio device for playback." msgstr "Impossible d'ouvrir le périphérique audio pour la lecture." msgid "" "Could not open audio device for recording. You don't have permission to open " "the device." msgstr "" "Impossible d'ouvrir le périphérique audio pour l'enregistrement. Vous n'avez " "pas les droits nécessaires pour ouvrir le périphérique." msgid "Could not open audio device for recording." msgstr "Impossible d'ouvrir le périphérique audio pour l'enregistrement." msgid "Could not open audio device for mixer control handling." msgstr "" "Impossible d'ouvrir le périphérique audio pour la gestion des contrôles de " "mixage." msgid "" "Could not open audio device for mixer control handling. This version of the " "Open Sound System is not supported by this element." msgstr "" "Impossible d'ouvrir le périphérique audio pour la gestion des contrôles de " "mixage. Cette version de OSS (Open Sound System) n'est pas prise en charge " "par cet élément." msgid "Master" msgstr "Volume général" msgid "Front" msgstr "Avant" msgid "Rear" msgstr "Arrière" msgid "Headphones" msgstr "Écouteurs" msgid "Center" msgstr "Centre" msgid "LFE" msgstr "LFE" msgid "Surround" msgstr "Ambiophonie" msgid "Side" msgstr "Côté" msgid "Built-in Speaker" msgstr "Haut-parleur interne" msgid "AUX 1 Out" msgstr "Sortie AUX 1" msgid "AUX 2 Out" msgstr "Sortie AUX 2" msgid "AUX Out" msgstr "Sortie AUX" msgid "3D Depth" msgstr "Profondeur 3D" msgid "3D Center" msgstr "Centre 3D" msgid "3D Enhance" msgstr "Amélioration 3D" msgid "Telephone" msgstr "Téléphone" msgid "Line Out" msgstr "Sortie ligne" msgid "Line In" msgstr "Entrée ligne" msgid "Internal CD" msgstr "CD interne" msgid "Video In" msgstr "Entrée vidéo" msgid "AUX 1 In" msgstr "Entrée AUX 1" msgid "AUX 2 In" msgstr "Entrée AUX 2" msgid "AUX In" msgstr "Entrée AUX" msgid "Record Gain" msgstr "Gain d'enregistrement" msgid "Output Gain" msgstr "Gain de sortie" msgid "Microphone Boost" msgstr "Amplification micro" msgid "Loopback" msgstr "Boucle interne" msgid "Diagnostic" msgstr "Diagnostic" msgid "Bass Boost" msgstr "Amplification basses" msgid "Playback Ports" msgstr "Ports de lecture" msgid "Input" msgstr "Entrée" msgid "Record Source" msgstr "Source d'enregistrement" msgid "Monitor Source" msgstr "Source de moniteur" msgid "Keyboard Beep" msgstr "Bip de clavier" msgid "Simulate Stereo" msgstr "Stéréo simulée" msgid "Stereo" msgstr "Stéréo" msgid "Surround Sound" msgstr "Son ambiophonique" msgid "Microphone Gain" msgstr "Gain de microphone" msgid "Speaker Source" msgstr "Source de haut-parleur" msgid "Microphone Source" msgstr "Source de microphone" msgid "Jack" msgstr "Jack" msgid "Center / LFE" msgstr "Centre / LFE" msgid "Stereo Mix" msgstr "Mélangeur stéréo" msgid "Mono Mix" msgstr "Mélangeur mono" msgid "Input Mix" msgstr "Mélangeur d'entrée" msgid "SPDIF In" msgstr "Entrée SPDIF" msgid "SPDIF Out" msgstr "Sortie SPDIF" msgid "Microphone 1" msgstr "Microphone 1" msgid "Microphone 2" msgstr "Microphone 2" msgid "Digital Out" msgstr "Sortie numérique" msgid "Digital In" msgstr "Entrée numérique" msgid "HDMI" msgstr "HDMI" msgid "Modem" msgstr "Modem" msgid "Handset" msgstr "Combiné" msgid "Other" msgstr "Autre" msgid "None" msgstr "Aucun" msgid "On" msgstr "Activé" msgid "Off" msgstr "Désactivé" msgid "Mute" msgstr "Son coupé" msgid "Fast" msgstr "Rapide" #. TRANSLATORS: "Very Low" is a quality setting here msgid "Very Low" msgstr "Très bas" #. TRANSLATORS: "Low" is a quality setting here msgid "Low" msgstr "Bas" #. TRANSLATORS: "Medium" is a quality setting here msgid "Medium" msgstr "Moyen" #. TRANSLATORS: "High" is a quality setting here msgid "High" msgstr "Élevé" #. TRANSLATORS: "Very High" is a quality setting here msgid "Very High" msgstr "Très élevé" #. TRANSLATORS: "Production" is a quality setting here msgid "Production" msgstr "Production" msgid "Front Panel Microphone" msgstr "Micro du panneau avant" msgid "Front Panel Line In" msgstr "Entrée ligne du panneau avant" msgid "Front Panel Headphones" msgstr "Écouteurs du panneau avant" msgid "Front Panel Line Out" msgstr "Sortie ligne du panneau avant" msgid "Green Connector" msgstr "Connecteur vert" msgid "Pink Connector" msgstr "Connecteur rose" msgid "Blue Connector" msgstr "Connecteur bleu" msgid "White Connector" msgstr "Connecteur blanc" msgid "Black Connector" msgstr "Connecteur noir" msgid "Gray Connector" msgstr "Connecteur gris" msgid "Orange Connector" msgstr "Connecteur orange" msgid "Red Connector" msgstr "Connecteur rouge" msgid "Yellow Connector" msgstr "Connecteur jaune" msgid "Green Front Panel Connector" msgstr "Connecteur vert du panneau avant" msgid "Pink Front Panel Connector" msgstr "Connecteur rose du panneau avant" msgid "Blue Front Panel Connector" msgstr "Connecteur bleu du panneau avant" msgid "White Front Panel Connector" msgstr "Connecteur blanc du panneau avant" msgid "Black Front Panel Connector" msgstr "Connecteur noir du panneau avant" msgid "Gray Front Panel Connector" msgstr "Connecteur gris du panneau avant" msgid "Orange Front Panel Connector" msgstr "Connecteur orange du panneau avant" msgid "Red Front Panel Connector" msgstr "Connecteur rouge du panneau avant" msgid "Yellow Front Panel Connector" msgstr "Connecteur jaune du panneau avant" msgid "Spread Output" msgstr "Sortie partagée" msgid "Downmix" msgstr "Mélange réduit" msgid "Virtual Mixer Input" msgstr "Entrée de mélangeur virtuel" msgid "Virtual Mixer Output" msgstr "Sortie de mélangeur virtuel" msgid "Virtual Mixer Channels" msgstr "Canaux de mélangeur virtuel" #. TRANSLATORS: name + number of a volume mixer control #, c-format msgid "%s %d Function" msgstr "Fonction %s %d" #. TRANSLATORS: name of a volume mixer control #, c-format msgid "%s Function" msgstr "Fonction %s" msgid "" "Could not open audio device for playback. This version of the Open Sound " "System is not supported by this element." msgstr "" "Impossible d'ouvrir le périphérique audio pour la lecture. Cette version de " "OSS (Open Sound System) n'est pas prise en charge par cet élément." msgid "Playback is not supported by this audio device." msgstr "La lecture n'est pas prise en charge par ce périphérique audio." msgid "Audio playback error." msgstr "Erreur de lecture audio." msgid "Recording is not supported by this audio device." msgstr "L'enregistrement n'est pas pris en charge par ce périphérique audio." msgid "Error recording from audio device." msgstr "Erreur lors de l'enregistrement à partir du périphérique audio." msgid "Gain" msgstr "Gain" msgid "Headphone" msgstr "Écouteurs" #, c-format msgid "Error reading %d bytes from device '%s'." msgstr "Erreur de lecture de %d octets sur le périphérique « %s »." #, c-format msgid "Got unexpected frame size of %u instead of %u." msgstr "Taille de trame imprévue de %u à la place de %u." #, c-format msgid "Error reading %d bytes on device '%s'." msgstr "Erreur de lecture de %d octets sur le périphérique « %s »." #, c-format msgid "" "Error getting capabilities for device '%s': It isn't a v4l2 driver. Check if " "it is a v4l1 driver." msgstr "" "Erreur d'obtention des capacités pour le périphérique « %s » : ce n'est pas " "un pilote v4l2. Vérifiez si c'est un pilote v4l1." #, c-format msgid "Failed to query attributes of input %d in device %s" msgstr "Impossible d'obtenir les attributs de l'entrée %d du périphérique %s" #, c-format msgid "Failed to get setting of tuner %d on device '%s'." msgstr "" "Impossible d'obtenir les paramètres du syntoniseur %d du périphérique « %s »." #, c-format msgid "Failed to query norm on device '%s'." msgstr "Impossible d'obtenir la norme du périphérique « %s »." #, c-format msgid "Failed getting controls attributes on device '%s'." msgstr "Impossible d'obtenir les attributs de contrôle du périphérique « %s »." #, c-format msgid "Cannot identify device '%s'." msgstr "Impossible d'identifier le périphérique « %s »." #, c-format msgid "This isn't a device '%s'." msgstr "Ceci n'est pas un périphérique « %s »." #, c-format msgid "Could not open device '%s' for reading and writing." msgstr "Impossible d'ouvrir le périphérique « %s » en lecture et écriture." #, c-format msgid "Device '%s' is not a capture device." msgstr "Le périphérique « %s » n'est pas un périphérique d'enregistrement." #, c-format msgid "Device '%s' is not a output device." msgstr "Le périphérique « %s » n'est pas un périphérique de sortie." #, c-format msgid "Failed to set norm for device '%s'." msgstr "La définition de la norme du périphérique « %s » a échoué." #, c-format msgid "Failed to get current tuner frequency for device '%s'." msgstr "" "Impossible d'obtenir la fréquence actuelle de syntonisation du périphérique " "« %s »." #, c-format msgid "Failed to set current tuner frequency for device '%s' to %lu Hz." msgstr "" "Impossible de définir la fréquence de syntonisation du périphérique « %s » à " "%lu Hz." #, c-format msgid "Failed to get signal strength for device '%s'." msgstr "Impossible d'obtenir la force du signal du périphérique « %s »." #, c-format msgid "Failed to get value for control %d on device '%s'." msgstr "Impossible d'obtenir la valeur du contrôle %d du périphérique « %s »." #, c-format msgid "Failed to set value %d for control %d on device '%s'." msgstr "" "Impossible de définir la valeur %d du contrôle %d du périphérique « %s »." #, c-format msgid "Failed to get current input on device '%s'. May be it is a radio device" msgstr "" "Impossible d'obtenir l'entrée actuelle du périphérique « %s ». C'est peut-" "être un périphérique radio" #, c-format msgid "Failed to set input %d on device %s." msgstr "Impossible de définir l'entrée %d du périphérique %s." #, c-format msgid "" "Failed to get current output on device '%s'. May be it is a radio device" msgstr "" "Impossible d'obtenir la sortie actuelle du périphérique « %s ». C'est peut-" "être un périphérique radio" #, c-format msgid "Failed to set output %d on device %s." msgstr "Impossible de définir la sortie %d du périphérique %s." #, c-format msgid "Could not enqueue buffers in device '%s'." msgstr "" "Impossible de mettre les tampons en file d'attente sur le périphérique " "« %s »." #, c-format msgid "Failed trying to get video frames from device '%s'." msgstr "L'obtention de trames vidéo du périphérique « %s » a échoué." #, c-format msgid "Failed after %d tries. device %s. system error: %s" msgstr "Échec après %d tentatives. périphérique %s. erreur système : %s" #, c-format msgid "Could not get parameters on device '%s'" msgstr "Impossible d'obtenir les paramètres du périphérique « %s »" msgid "Video input device did not accept new frame rate setting." msgstr "" "Le périphérique d'entrée vidéo n'a pas accepté le nouveau paramètre de " "fréquence d'image." #, c-format msgid "Could not map buffers from device '%s'" msgstr "Impossible de mapper les tampons du périphérique « %s »." #, c-format msgid "The driver of device '%s' does not support any known capture method." msgstr "" "Le pilote du périphérique « %s » ne prend en charge aucune méthode " "d'enregistrement connue." msgid "Changing resolution at runtime is not yet supported." msgstr "" "La modification de résolution en cours d'exécution n'est pas encore prise en " "charge." msgid "Cannot operate without a clock" msgstr "Impossible de fonctionner sans horloge" gst-plugins-good-0.10.31/configure.ac0000644000175000017500000011507211720553250014273 00000000000000AC_PREREQ(2.60) dnl please read gstreamer/docs/random/autotools before changing this file dnl initialize autoconf dnl releases only do -Wall, git and prerelease does -Werror too dnl use a three digit version number for releases, and four for git/pre AC_INIT(GStreamer Good Plug-ins, 0.10.31, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gst-plugins-good) AG_GST_INIT dnl initialize automake AM_INIT_AUTOMAKE([-Wno-portability 1.10]) dnl define PACKAGE_VERSION_* variables AS_VERSION dnl check if this is a release version AS_NANO(GST_GIT="no", GST_GIT="yes") dnl can autoconf find the source ? AC_CONFIG_SRCDIR([gst/law/alaw.c]) dnl define the output header for config AM_CONFIG_HEADER([config.h]) dnl AM_MAINTAINER_MODE only provides the option to configure to enable it AM_MAINTAINER_MODE dnl sets host_* variables AC_CANONICAL_HOST dnl use pretty build output with automake >= 1.11 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])], [AM_DEFAULT_VERBOSITY=1 AC_SUBST(AM_DEFAULT_VERBOSITY)]) dnl our libraries and install dirs use major.minor as a version GST_MAJORMINOR=$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR dnl we override it here if we need to for the release candidate of new series GST_MAJORMINOR=0.10 AC_SUBST(GST_MAJORMINOR) AG_GST_LIBTOOL_PREPARE dnl FIXME: this macro doesn't actually work; dnl the generated libtool script has no support for the listed tags. dnl So this needs to be fixed first if we want to use this dnl AS_LIBTOOL_TAGS AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL dnl *** required versions of GStreamer stuff *** GST_REQ=0.10.36 GSTPB_REQ=0.10.36 dnl *** autotools stuff **** dnl allow for different autotools AS_AUTOTOOLS_ALTERNATE dnl Add parameters for aclocal AC_SUBST(ACLOCAL_AMFLAGS, "-I m4 -I common/m4") dnl set up gettext dnl the version check needs to stay here because autopoint greps for it AM_GNU_GETTEXT_VERSION([0.17]) AM_GNU_GETTEXT([external]) AG_GST_GETTEXT([gst-plugins-good-$GST_MAJORMINOR]) dnl *** check for arguments to configure *** AG_GST_ARG_DEBUG AG_GST_ARG_PROFILING AG_GST_ARG_VALGRIND AG_GST_ARG_GCOV AG_GST_ARG_EXAMPLES AG_GST_ARG_WITH_PKG_CONFIG_PATH AG_GST_ARG_WITH_PACKAGE_NAME AG_GST_ARG_WITH_PACKAGE_ORIGIN AG_GST_ARG_WITH_PLUGINS AG_GST_ARG_ENABLE_EXTERNAL AG_GST_ARG_ENABLE_EXPERIMENTAL dnl *** checks for platform *** dnl * hardware/architecture * dnl common/m4/gst-arch.m4 dnl check CPU type AG_GST_ARCH dnl Determine endianness AC_C_BIGENDIAN dnl *** checks for programs *** dnl find a compiler AC_PROG_CC AC_PROG_CC_STDC dnl determine c++ compiler AC_PROG_CXX dnl determine if c++ is available on this system AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) dnl determine c++ preprocessor dnl FIXME: do we need this ? AC_PROG_CXXCPP AS_PROG_OBJC dnl check if the compiler supports '-c' and '-o' options AM_PROG_CC_C_O dnl find an assembler AM_PROG_AS dnl check if the compiler supports do while(0) macros AG_GST_CHECK_DOWHILE_MACROS AC_PATH_PROG(VALGRIND_PATH, valgrind, no) AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") dnl check for gconftool-2 dnl this macro defines an am conditional, so it needs to be run always AM_GCONF_SOURCE_2 dnl check for documentation tools GTK_DOC_CHECK([1.3]) AS_PATH_PYTHON([2.1]) AG_GST_PLUGIN_DOCS([1.3],[2.1]) dnl *** checks for libraries *** dnl check for libm, for sin() AC_CHECK_LIBM AC_SUBST(LIBM) dnl *** checks for header files *** dnl check if we have ANSI C header files AC_HEADER_STDC dnl used by ext/wavpack AX_CREATE_STDINT_H dnl used in gst/rtp/gstasteriskh263.c AC_CHECK_HEADERS([netinet/in.h]) AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes) AM_CONDITIONAL(HAVE_WINSOCK2_H, test "x$HAVE_WINSOCK2_H" = "xyes") dnl used in gst/udp AC_CHECK_HEADERS([sys/time.h]) dnl *** checks for types/defines *** dnl Check for FIONREAD ioctl declaration. This check is needed dnl for the UDP plugin to build on Solaris GST_CHECK_FIONREAD dnl *** checks for structures *** dnl *** checks for compiler characteristics *** dnl check if we have GCC inline-asm AS_GCC_INLINE_ASSEMBLY([HAVE_GCC_ASM=yes], [HAVE_GCC_ASM=no]) if test x$HAVE_GCC_ASM = xyes ; then AC_DEFINE(HAVE_GCC_ASM, 1, [Define if compiler supports gcc inline assembly]) fi AM_CONDITIONAL(HAVE_GCC_ASM, test "x$HAVE_GCC_ASM" = "xyes") dnl *** checks for library functions *** LIBS_SAVE=$LIBS LIBS="$LIBS $LIBM" AC_CHECK_FUNCS(rint sinh cosh asinh fpclass) LIBS=$LIBS_SAVE dnl Check whether isinf() is defined by math.h AC_CACHE_CHECK([for isinf], ac_cv_have_isinf, AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[float f = 0.0; int i=isinf(f)]])],[ac_cv_have_isinf="yes"],[ac_cv_have_isinf="no"])) if test "$ac_cv_have_isinf" = "yes" then AC_DEFINE(HAVE_ISINF, 1, [Define to 1 if you have the `isinf' function.]) fi dnl Check for mmap (needed by electricfence plugin) AC_FUNC_MMAP AM_CONDITIONAL(GST_HAVE_MMAP, test "x$ac_cv_func_mmap_fixed_mapped" = "xyes") dnl Check for mmap (needed by electricfence plugin) AC_CHECK_TYPE([struct ip_mreqn], [ AC_DEFINE(HAVE_IP_MREQN,, [Define if we have struct ip_mreqn])],, [#include ]) dnl *** checks for dependency libraries *** dnl GLib is required AG_GST_GLIB_CHECK([2.24]) PKG_CHECK_MODULES(GIO, [ gio-2.0 >= 2.20 ], , AC_MSG_ERROR([gio is required])) dnl Orc ORC_CHECK([0.4.11]) dnl checks for gstreamer dnl uninstalled is selected preferentially -- see pkg-config(1) AG_GST_CHECK_GST($GST_MAJORMINOR, [$GST_REQ], yes) AG_GST_CHECK_GST_BASE($GST_MAJORMINOR, [$GST_REQ], yes) AG_GST_CHECK_GST_GDP($GST_MAJORMINOR, [$GST_REQ], yes) AG_GST_CHECK_GST_CONTROLLER($GST_MAJORMINOR, [$GST_REQ], yes) AG_GST_CHECK_GST_CHECK($GST_MAJORMINOR, [$GST_REQ], no) AG_GST_CHECK_GST_PLUGINS_BASE($GST_MAJORMINOR, [$GSTPB_REQ], yes) GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_MAJORMINOR` if test -z $GST_TOOLS_DIR; then AC_MSG_ERROR([no tools dir defined in GStreamer pkg-config file; core upgrade needed.]) fi AC_SUBST(GST_TOOLS_DIR) AC_MSG_NOTICE(Using GStreamer Core Plugins in $GST_PLUGINS_DIR) AC_MSG_NOTICE(Using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR) AM_CONDITIONAL(HAVE_GST_CHECK, test "x$HAVE_GST_CHECK" = "xyes") dnl Check for documentation xrefs GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-$GST_MAJORMINOR`" GSTPB_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-plugins-base-$GST_MAJORMINOR`" AC_SUBST(GLIB_PREFIX) AC_SUBST(GST_PREFIX) AC_SUBST(GSTPB_PREFIX) dnl GTK is optional and used in examples HAVE_GTK=no GTK2_REQ=2.14.0 GTK3_REQ=2.91.3 if test "x$BUILD_EXAMPLES" = "xyes"; then AC_MSG_CHECKING([which gtk+ version to compile examples against (optional)]) AC_ARG_WITH([gtk], AC_HELP_STRING([--with-gtk=3.0|2.0], [which gtk+ version to compile against (default: 2.0)]), [case "$with_gtk" in 2.0) GTK_REQ=$GTK2_REQ ;; 3.0) GTK_REQ=$GTK3_REQ ;; *) AC_MSG_ERROR([invalid gtk+ version specified]);; esac], [with_gtk=2.0 GTK_REQ=$GTK2_REQ]) AC_MSG_RESULT([$with_gtk (>= $GTK_REQ)]) PKG_CHECK_MODULES(GTK, gtk+-$with_gtk >= $GTK_REQ, HAVE_GTK=yes, HAVE_GTK=no) dnl some examples need gtk+-x11 PKG_CHECK_MODULES(GTK_X11, gtk+-x11-$with_gtk >= $GTK_REQ, HAVE_GTK_X11=yes, HAVE_GTK_X11=no) AC_SUBST(GTK_LIBS) AC_SUBST(GTK_CFLAGS) fi AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes") AM_CONDITIONAL(HAVE_GTK_X11, test "x$HAVE_GTK_X11" = "xyes") dnl should we install schemas ? translit(dnm, m, l) AM_CONDITIONAL(USE_GCONFTOOL, true) AG_GST_CHECK_FEATURE(GCONFTOOL, [GConf schemas], , [ AC_PATH_PROG(GCONFTOOL, gconftool-2, no) if test x$GCONFTOOL = xno; then AC_MSG_WARN(Not installing GConf schemas) HAVE_GCONFTOOL="no" else HAVE_GCONFTOOL="yes" fi AC_SUBST(HAVE_GCONFTOOL) ]) dnl *** set variables based on configure arguments *** dnl set license and copyright notice GST_LICENSE="LGPL" AC_DEFINE_UNQUOTED(GST_LICENSE, "$GST_LICENSE", [GStreamer license]) AC_SUBST(GST_LICENSE) dnl set location of plugin directory AG_GST_SET_PLUGINDIR dnl set release date/time AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO([$PACKAGE_VERSION_NANO], ["${srcdir}/gst-plugins-good.doap"], [$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO]) dnl define an ERROR_CFLAGS Makefile variable dnl -Wundef: too many broken headers if test "x$HAVE_OSX_VIDEO" != "xyes"; then AG_GST_SET_ERROR_CFLAGS($GST_GIT, [ -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wwrite-strings -Wold-style-definition -Waggregate-return -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar -Wnested-externs ]) else dnl work-around for us passing GST_CFLAGS to the ObjC-compiler, which dnl doesn't understand all warning flags that the C compiler knows about dnl (e.g. -Waddress) or causes problems with some flags (-Waggregate-return) AG_GST_SET_ERROR_CFLAGS($GST_GIT, [ -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wwrite-strings -Wold-style-definition -Winit-self -Wmissing-include-dirs -Wno-multichar -Wnested-externs ]) fi dnl define an ERROR_CXXFLAGS Makefile variable AG_GST_SET_ERROR_CXXFLAGS($GST_GIT, [ -Wmissing-declarations -Wredundant-decls -Wwrite-strings -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar ]) dnl define correct level for debugging messages AG_GST_SET_LEVEL_DEFAULT($GST_GIT) dnl used in examples AG_GST_DEFAULT_ELEMENTS dnl *** plug-ins to include *** dnl these are all the gst plug-ins, compilable without additional libs dnl videofilter is at the top because others depend on it AG_GST_CHECK_PLUGIN(videofilter) AG_GST_CHECK_PLUGIN(alpha) AG_GST_CHECK_PLUGIN(apetag) AG_GST_CHECK_PLUGIN(audiofx) AG_GST_CHECK_PLUGIN(audioparsers) AG_GST_CHECK_PLUGIN(auparse) AG_GST_CHECK_PLUGIN(autodetect) AG_GST_CHECK_PLUGIN(avi) AG_GST_CHECK_PLUGIN(cutter) AG_GST_CHECK_PLUGIN(debugutils) AG_GST_CHECK_PLUGIN(deinterlace) AG_GST_CHECK_PLUGIN(effectv) AG_GST_CHECK_PLUGIN(equalizer) AG_GST_CHECK_PLUGIN(flv) AG_GST_CHECK_PLUGIN(id3demux) AG_GST_CHECK_PLUGIN(icydemux) AG_GST_CHECK_PLUGIN(interleave) AG_GST_CHECK_PLUGIN(flx) AG_GST_CHECK_PLUGIN(goom) AG_GST_CHECK_PLUGIN(goom2k1) AG_GST_CHECK_PLUGIN(imagefreeze) AG_GST_CHECK_PLUGIN(isomp4) AG_GST_CHECK_PLUGIN(law) AG_GST_CHECK_PLUGIN(level) AG_GST_CHECK_PLUGIN(matroska) AG_GST_CHECK_PLUGIN(monoscope) AG_GST_CHECK_PLUGIN(multifile) AG_GST_CHECK_PLUGIN(multipart) AG_GST_CHECK_PLUGIN(replaygain) AG_GST_CHECK_PLUGIN(rtp) AG_GST_CHECK_PLUGIN(rtpmanager) AG_GST_CHECK_PLUGIN(rtsp) AG_GST_CHECK_PLUGIN(shapewipe) AG_GST_CHECK_PLUGIN(smpte) AG_GST_CHECK_PLUGIN(spectrum) AG_GST_CHECK_PLUGIN(udp) AG_GST_CHECK_PLUGIN(videobox) AG_GST_CHECK_PLUGIN(videocrop) AG_GST_CHECK_PLUGIN(videomixer) AG_GST_CHECK_PLUGIN(wavenc) AG_GST_CHECK_PLUGIN(wavparse) AG_GST_CHECK_PLUGIN(y4m) dnl *** checks for socket and nsl libraries *** AC_CHECK_FUNC(socket,,[AC_CHECK_LIB(socket,socket)]) dnl disable gst plugins we might not be able to build on this dnl platform: udp and rtsp (ugly but minimally invasive) dnl FIXME: maybe move to sys AC_CHECK_HEADERS([sys/socket.h], HAVE_SYS_SOCKET_H=yes) AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes) if test "x$HAVE_SYS_SOCKET_H" != "xyes" -a "x$HAVE_WINSOCK2_H" != "xyes"; then AG_GST_DISABLE_PLUGIN(udp) AG_GST_DISABLE_PLUGIN(rtsp) fi if test "x$HAVE_WINSOCK2_H" = "xyes"; then WIN32_LIBS="-lws2_32" AC_SUBST(WIN32_LIBS) fi dnl disable experimental plug-ins if test "x$BUILD_EXPERIMENTAL" != "xyes"; then AG_GST_DISABLE_PLUGIN(monoscope) fi dnl *** sys plug-ins *** echo AC_MSG_NOTICE([Checking libraries for plugins in sys/]) echo dnl DirectSound translit(dnm, m, l) AM_CONDITIONAL(USE_DIRECTSOUND, true) AG_GST_CHECK_FEATURE(DIRECTSOUND, [DirectSound plug-in], directsoundsink, [ HAVE_DIRECTSOUND="no" save_CFLAGS="$CFLAGS" save_LDFLAGS="$LDFLAGS" save_LIBS="$LIBS" CFLAGS="$CFLAGS $DIRECTSOUND_CFLAGS" LDFLAGS="$LDFLAGS $DIRECTSOUND_LDFLAGS" LIBS="$LIBS -ldsound -ldxerr9 -luser32" AC_MSG_CHECKING(for DirectSound LDFLAGS) AC_LINK_IFELSE([ #include #include #include int main () { DXGetErrorString9 (0); DirectSoundCreate(NULL, NULL, NULL); return 0; } ], [HAVE_DIRECTSOUND="yes"], [HAVE_DIRECTSOUND="no"]) AC_MSG_RESULT($HAVE_DIRECTSOUND) CFLAGS=$save_CFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS if test "x$HAVE_DIRECTSOUND" = "xyes"; then dnl this is much more than we want DIRECTSOUND_LIBS="-ldsound -ldxerr9 -luser32" AC_SUBST(DIRECTSOUND_CFLAGS) AC_SUBST(DIRECTSOUND_LDFLAGS) AC_SUBST(DIRECTSOUND_LIBS) fi AC_SUBST(HAVE_DIRECTSOUND) ]) dnl *** OSS audio *** (Linux, *BSD) translit(dnm, m, l) AM_CONDITIONAL(USE_OSS, true) AG_GST_CHECK_FEATURE(OSS, [OSS audio], ossaudio, [ HAVE_OSS="yes" dnl Linux and newer BSD versions : AC_CHECK_HEADER(sys/soundcard.h, [ AC_DEFINE(HAVE_OSS_INCLUDE_IN_SYS,, [Define if OSS includes are in /sys/]) ] , [ dnl Some old BSD versions and also newer OpenBSD versions : AC_CHECK_HEADER(soundcard.h, [ AC_DEFINE(HAVE_OSS_INCLUDE_IN_ROOT,, [Define if OSS includes are in /]) ], [ dnl Some old BSD versions : AC_CHECK_HEADER(machine/soundcard.h, [ AC_DEFINE(HAVE_OSS_INCLUDE_IN_MACHINE,, [Define if OSS includes are in /machine/]) ], [ HAVE_OSS="no" ]) ]) ]) ]) dnl *** oss4 *** translit(dnm, m, l) AM_CONDITIONAL(USE_OSS4, true) AG_GST_CHECK_FEATURE(OSS4, [Open Sound System 4], oss4, [ AC_MSG_CHECKING([Checking if we can build the OSS4 elements]) AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/stat.h sys/types.h], [test -z "$OSS4_MISSING_HEADER" && HAVE_OSS4="yes"], [OSS4_MISSING_HEADER="yes";HAVE_OSS4="no"]) ]) dnl *** Sun Audio *** translit(dnm, m, l) AM_CONDITIONAL(USE_SUNAUDIO, true) AG_GST_CHECK_FEATURE(SUNAUDIO, [Sun Audio], sunaudio, [ AC_CHECK_HEADER(sys/audioio.h, HAVE_SUNAUDIO="yes", HAVE_SUNAUDIO="no") ]) dnl *** OSX Audio *** translit(dnm, m, l) AM_CONDITIONAL(USE_OSX_AUDIO, true) AG_GST_CHECK_FEATURE(OSX_AUDIO, [OSX audio], osxaudio, [ AC_CHECK_HEADER(CoreAudio/CoreAudio.h, HAVE_OSX_AUDIO="yes", HAVE_OSX_AUDIO="no") ]) dnl *** OS X video *** translit(dnm, m, l) AM_CONDITIONAL(USE_OSX_VIDEO, true) HAVE_OSX_VIDEO="no" AG_GST_CHECK_FEATURE(OSX_VIDEO, [OSX video], osxvideosink, [ AC_CHECK_HEADER(OpenGL/gl.h, HAVE_OSX_VIDEO="yes", HAVE_OSX_VIDEO="no") ]) dnl in case header OpenGL/gl.h is found on other platforms case "$host" in *-*darwin*) dnl do nothing ;; *) HAVE_OSX_VIDEO="no" ;; esac dnl *** Video 4 Linux 2 *** dnl for information about the header/define, see sys/v4l2/gstv4l2element.h dnl renamed to GST_V4L2 because of some conflict with kernel headers translit(dnm, m, l) AM_CONDITIONAL(USE_GST_V4L2, true) AG_GST_CHECK_FEATURE(GST_V4L2, [Video 4 Linux 2], v4l2src, [ AC_MSG_CHECKING([Checking for up to date v4l2 installation]) AC_TRY_COMPILE([ #include #ifdef __sun /* Solaris */ #include #include #else /* Linux */ #include #define _LINUX_TIME_H #define __user #include #endif #if defined(V4L2_MAJOR_VERSION) || defined(V4L2_MINOR_VERSION) #error too early v4l2 version or no v4l2 at all #endif ], [ return 0; ], [ HAVE_GST_V4L2="yes" AC_MSG_RESULT(yes) ], [ HAVE_GST_V4L2="no" AC_MSG_RESULT(no) HAVE_VIDEODEV=no AC_CHECK_HEADER(linux/videodev2.h, [ HAVE_VIDEODEV=yes ], [ AC_CHECK_HEADER(sys/videodev2.h, [ HAVE_VIDEODEV=yes ]) ]) if test "x$HAVE_VIDEODEV" = "xyes"; then AC_MSG_WARN([video4linux2 headers were found, but they're old.]) AC_MSG_WARN([Please update v4l2 to compile the v4l2 plugins]) else AC_MSG_WARN([video4linux2 was not found]) fi ]) if [ test x$HAVE_GST_V4L2 = xyes ]; then dnl check for missing v4l2_buffer declaration (see #135919) MISSING_DECL=0 AC_MSG_CHECKING(struct v4l2_buffer declaration) AC_TRY_COMPILE([ #include #ifdef __sun /* Solaris */ #include #include #else /* Linux */ #include #define _LINUX_TIME_H #define __user #include #endif ],[ struct v4l2_buffer buf; buf.index = 0; return 0; ], [ AC_MSG_RESULT(yes) ], [ MISSING_DECL=1 && AC_MSG_RESULT(no) ]) if [ test x$MISSING_DECL = x1 ]; then AC_DEFINE(GST_V4L2_MISSING_BUFDECL, 1, [struct v4l2_buffer missing]) fi dnl check for XOverlay libraries AG_GST_CHECK_XV fi ]) # Optional gudev for device probing AC_ARG_WITH([gudev], AC_HELP_STRING([--with-gudev], [device detection with gudev]), [], [with_gudev=check]) if test x$HAVE_GST_V4L2 = xyes; then if test x$with_gudev != xno; then PKG_CHECK_MODULES(GUDEV, [ gudev-1.0 >= 143 ], [ have_gudev=yes AC_DEFINE(HAVE_GUDEV, 1, [Whether gudev is available for device detection]) AC_DEFINE([G_UDEV_API_IS_SUBJECT_TO_CHANGE], 1, [I know the API is subject to change.]) ], [ have_gudev=no ]) else have_gudev=no fi fi AC_SUBST(GUDEV_CFLAGS) AC_SUBST(GUDEV_LIBS) # Make libv4l2 non-automagic AC_ARG_WITH([libv4l2], AC_HELP_STRING([--with-libv4l2], [support video buffer conversion using libv4l2]), [], [with_libv4l2=check]) if test x$HAVE_GST_V4L2 = xyes; then if test x$with_libv4l2 != xno; then PKG_CHECK_MODULES(LIBV4L2, libv4l2, [ have_libv4l2=yes AC_DEFINE(HAVE_LIBV4L2, 1, [Whether libv4l2 is available for video buffer conversion]) ], [ have_libv4l2=no ]) else have_libv4l2=no fi fi dnl Check for X11 translit(dnm, m, l) AM_CONDITIONAL(USE_X, true) AG_GST_CHECK_FEATURE(X, [X libraries and plugins], [ximagesrc], [ AC_PATH_XTRA dnl now try to find the HEADER ac_cflags_save="$CFLAGS" ac_cppflags_save="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no") if test "x$HAVE_X" = "xno" then AC_MSG_NOTICE([cannot find X11 development files]) else dnl this is much more than we want X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" dnl AC_PATH_XTRA only defines the path needed to find the X libs, dnl it does not add the libs; therefore we add them here X_LIBS="$X_LIBS -lX11" AC_SUBST(X_CFLAGS) AC_SUBST(X_LIBS) dnl check for Xfixes PKG_CHECK_MODULES(XFIXES, xfixes, HAVE_XFIXES="yes", HAVE_XFIXES="no") if test "x$HAVE_XFIXES" = "xyes" then XFIXES_CFLAGS="-DHAVE_XFIXES $XFIXES_CFLAGS" fi AC_SUBST(XFIXES_LIBS) AC_SUBST(XFIXES_CFLAGS) dnl check for Xdamage PKG_CHECK_MODULES(XDAMAGE, xdamage, HAVE_XDAMAGE="yes", HAVE_XDAMAGE="no") if test "x$HAVE_XDAMAGE" = "xyes" then XDAMAGE_CFLAGS="-DHAVE_XDAMAGE $XDAMAGE_CFLAGS" fi AC_SUBST(XDAMAGE_LIBS) AC_SUBST(XDAMAGE_CFLAGS) fi AC_SUBST(HAVE_X) CFLAGS="$ac_cflags_save" CPPFLAGS="$ac_cppflags_save" ]) dnl FIXME: this should be rolled into the test above, it's just an additional dnl feature of the ximagesrc plug-in dnl This is the same as in gst-plugins-base dnl check for X Shm translit(dnm, m, l) AM_CONDITIONAL(USE_XSHM, true) AG_GST_CHECK_FEATURE(XSHM, [X Shared Memory extension], , [ if test x$HAVE_X = xyes; then AC_CHECK_LIB(Xext, XShmAttach, HAVE_XSHM="yes", HAVE_XSHM="no", $X_LIBS) if test "x$HAVE_XSHM" = "xyes"; then XSHM_LIBS="-lXext" else dnl On AIX, it is in XextSam instead, but we still need -lXext AC_CHECK_LIB(XextSam, XShmAttach, HAVE_XSHM="yes", HAVE_XSHM="no", $X_LIBS) if test "x$HAVE_XSHM" = "xyes"; then XSHM_LIBS="-lXext -lXextSam" fi fi fi ], ,[ AC_SUBST(HAVE_XSHM) AC_SUBST(XSHM_LIBS) ]) dnl for V4L2, we also need to know if we have XVIDEO translit(dnm, m, l) AM_CONDITIONAL(USE_XVIDEO, true) AG_GST_CHECK_FEATURE(XVIDEO, [X11 XVideo extensions], [], [ AG_GST_CHECK_XV ]) dnl *** ext plug-ins *** dnl keep this list sorted alphabetically ! if test "x$BUILD_EXTERNAL" = "xyes"; then echo AC_MSG_NOTICE([Checking libraries for plugins in ext/]) echo dnl *** aalib *** translit(dnm, m, l) AM_CONDITIONAL(USE_AALIB, true) AG_GST_CHECK_FEATURE(AALIB, [aalib ASCII Art library], aasink, [ AM_PATH_AALIB(, HAVE_AALIB=yes, HAVE_AALIB=no) AS_SCRUB_INCLUDE(AALIB_CFLAGS) ]) dnl *** annodex *** translit(dnm, m, l) AM_CONDITIONAL(USE_ANNODEX, true) AG_GST_CHECK_FEATURE(ANNODEX, [XML library], annodex, [ AG_GST_PKG_CHECK_MODULES(ANNODEX, libxml-2.0 >= 2.4.9) ]) dnl *** cairo *** translit(dnm, m, l) AM_CONDITIONAL(USE_CAIRO, true) AG_GST_CHECK_FEATURE(CAIRO, [Cairo graphics rendering], cairo, [ AG_GST_PKG_CHECK_MODULES(CAIRO, cairo >= 1.0.0) ]) dnl *** cairo-gobject *** translit(dnm, m, l) AM_CONDITIONAL(USE_CAIRO_GOBJECT, true) AG_GST_CHECK_FEATURE(CAIRO_GOBJECT, [Cairo graphics rendering gobject bindings], cairooverlay, [ AG_GST_PKG_CHECK_MODULES(CAIRO_GOBJECT, cairo-gobject >= 1.10.0) ]) dnl **** ESound **** translit(dnm, m, l) AM_CONDITIONAL(USE_ESD, true) AG_GST_CHECK_FEATURE(ESD, [ESounD sound daemon], esdsink, [ AG_GST_PKG_CHECK_MODULES(ESD, esound >= 0.2.12) if test $HAVE_ESD = no then AM_PATH_ESD(0.2.12, HAVE_ESD="yes") AS_SCRUB_INCLUDE(ESD_CFLAGS) fi ]) dnl *** FLAC *** translit(dnm, m, l) AM_CONDITIONAL(USE_FLAC, true) AG_GST_CHECK_FEATURE(FLAC, [FLAC lossless audio], flac, [ AG_GST_PKG_CHECK_MODULES(FLAC, flac >= 1.1.4) ]) dnl *** GConf *** translit(dnm, m, l) AM_CONDITIONAL(USE_GCONF, true) AG_GST_CHECK_FEATURE(GCONF, [GConf libraries], gconfelements, [ AG_GST_PKG_CHECK_MODULES(GCONF, gconf-2.0) ]) dnl *** GDK pixbuf *** translit(dnm, m, l) AM_CONDITIONAL(USE_GDK_PIXBUF, true) AG_GST_CHECK_FEATURE(GDK_PIXBUF, [GDK pixbuf], gdkpixbuf, [ AG_GST_PKG_CHECK_MODULES(GDK_PIXBUF, gdk-pixbuf-2.0 >= 2.8.0) ]) dnl *** HAL *** translit(dnm, m, l) AM_CONDITIONAL(USE_HAL, true) 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) AG_GST_PKG_CHECK_MODULES(JACK_0_120_1, jack >= 0.120.1 jack < 1.0) if test x$HAVE_JACK_0_120_1 = xyes; then AC_DEFINE(HAVE_JACK_0_120_1, 1, [defined if jack >= 0.120.1 is available]) fi AG_GST_PKG_CHECK_MODULES(JACK_1_9_7, jack >= 1.9.7) if test x$HAVE_JACK_1_9_7 = xyes; then AC_DEFINE(HAVE_JACK_1_9_7, 1, [defined if jack >= 1.9.7 is available]) fi ]) dnl *** jpeg *** dnl FIXME: we could use header checks here as well IMO translit(dnm, m, l) AM_CONDITIONAL(USE_JPEG, true) AG_GST_CHECK_FEATURE(JPEG, [jpeg library], jpeg, [ AC_ARG_WITH(jpeg-mmx, [ --with-jpeg-mmx, path to MMX'ified JPEG library]) OLD_LIBS="$LIBS" if test x$with_jpeg_mmx != x; then LIBS="$LIBS -L$with_jpeg_mmx" fi AC_CHECK_LIB(jpeg-mmx, jpeg_set_defaults, HAVE_JPEG="yes", HAVE_JPEG="no") JPEG_LIBS="$LIBS -ljpeg-mmx" LIBS="$OLD_LIBS" if test x$HAVE_JPEG != xyes; then AC_CHECK_LIB(jpeg, jpeg_set_defaults, HAVE_JPEG="yes", HAVE_JPEG="no") JPEG_LIBS="-ljpeg" fi AC_SUBST(JPEG_LIBS) ]) dnl *** libcaca *** translit(dnm, m, l) AM_CONDITIONAL(USE_LIBCACA, true) AG_GST_CHECK_FEATURE(LIBCACA, [libcaca coloured ASCII art], cacasink, [ AG_GST_PKG_CHECK_MODULES(LIBCACA, caca) ]) dnl *** libdv *** translit(dnm, m, l) AM_CONDITIONAL(USE_LIBDV, true) AG_GST_CHECK_FEATURE(LIBDV, [libdv DV demuxer/decoder], dv, [ AG_GST_PKG_CHECK_MODULES(LIBDV, libdv >= 0.100) ]) dnl *** libpng *** translit(dnm, m, l) AM_CONDITIONAL(USE_LIBPNG, true) AG_GST_CHECK_FEATURE(LIBPNG, [Portable Network Graphics library], png, [ AG_GST_PKG_CHECK_MODULES(LIBPNG, libpng >= 1.2) ]) dnl *** pulseaudio *** translit(dnm, m, l) AM_CONDITIONAL(USE_PULSE, true) AG_GST_CHECK_FEATURE(PULSE, [pulseaudio plug-in], pulseaudio, [ dnl used in ext/pulse/pulseutil.c AC_CHECK_HEADERS([process.h]) AG_GST_PKG_CHECK_MODULES(PULSE, libpulse >= 0.9.16) AG_GST_PKG_CHECK_MODULES(PULSE_0_9_20, libpulse >= 0.9.20) if test x$HAVE_PULSE_0_9_20 = xyes; then AC_DEFINE(HAVE_PULSE_0_9_20, 1, [defined if pulseaudio >= 0.9.20 is available]) fi AG_GST_PKG_CHECK_MODULES(PULSE_1_0, libpulse >= 0.98) if test x$HAVE_PULSE_1_0 = xyes; then AC_DEFINE(HAVE_PULSE_1_0, 1, [defined if pulseaudio >= 1.0 is available]) fi ]) dnl *** dv1394 *** translit(dnm, m, l) AM_CONDITIONAL(USE_DV1394, true) AG_GST_CHECK_FEATURE(DV1394, [raw1394 and avc1394 library], 1394, [ dnl first test for libraw1394 >= 2.0.0 AG_GST_PKG_CHECK_MODULES(RAW1394, libraw1394 >= 2.0.0) AG_GST_PKG_CHECK_MODULES(LIBIEC61883, libiec61883 >= 1.0.0) dnl now see how far we got if test x$HAVE_RAW1394 = xyes && \ test x$HAVE_LIBIEC61883 = xyes; then AG_GST_CHECK_LIBHEADER(AVC1394, avc1394, avc1394_send_command, $RAW1394_LIBS, libavc1394/avc1394.h, AVC1394_LIBS="-lavc1394") AG_GST_CHECK_LIBHEADER(ROM1394, rom1394, rom1394_free_directory, $RAW1394_LIBS, libavc1394/rom1394.h, ROM1394_LIBS="-lrom1394") if test x$HAVE_AVC1394 = xyes && \ test x$HAVE_AVC1394 = xyes && \ test x$HAVE_ROM1394 = xyes; then HAVE_DV1394=yes DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS $LIBIEC61883_LIBS" DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" AC_SUBST(DV1394_CFLAGS) AC_SUBST(DV1394_LIBS) fi else if test x$HAVE_RAW1394 = xno; then AG_GST_PKG_CHECK_MODULES(RAW1394, libraw1394 >= 1.1.0) AG_GST_CHECK_LIBHEADER(AVC1394, avc1394, avc1394_send_command, $RAW1394_LIBS, libavc1394/avc1394.h, AVC1394_LIBS="-lavc1394") AG_GST_CHECK_LIBHEADER(ROM1394, rom1394, rom1394_free_directory, $RAW1394_LIBS, libavc1394/rom1394.h, ROM1394_LIBS="-lrom1394") if test x$HAVE_RAW1394 = xyes && \ test x$HAVE_AVC1394 = xyes && \ test x$HAVE_ROM1394 = xyes; then HAVE_DV1394=yes DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS" DV1394_CFLAGS="$RAW1394_CFLAGS" if test x$HAVE_LIBIEC61883 = xyes; then DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" DV1394_LIBS="$DV1394_LIBS $LIBIEC61883_LIBS" fi AC_SUBST(DV1394_CFLAGS) AC_SUBST(DV1394_LIBS) fi fi fi ]) AM_CONDITIONAL(USE_LIBIEC61883, [ test "x${HAVE_LIBIEC61883}" = xyes ] ) dnl *** shout2 *** translit(dnm, m, l) AM_CONDITIONAL(USE_SHOUT2, true) AG_GST_CHECK_FEATURE(SHOUT2, [Shoutcast/Icecast client library], shout2, [ AG_GST_PKG_CHECK_MODULES(SHOUT2, shout >= 2.0) ]) dnl *** soup *** translit(dnm, m, l) AM_CONDITIONAL(USE_SOUP, true) AG_GST_CHECK_FEATURE(SOUP, [soup http client plugin (2.4)], souphttpsrc, [ PKG_CHECK_MODULES(SOUP, libsoup-gnome-2.4 >= 2.3.2, [ HAVE_SOUP="yes" AC_DEFINE(HAVE_LIBSOUP_GNOME, 1, [soup gnome integration]) ],[ PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.26, HAVE_SOUP="yes", [ HAVE_SOUP="no" ]) ]) AC_SUBST(SOUP_CFLAGS) AC_SUBST(SOUP_LIBS) ]) dnl *** speex >= 1.0.4 or >= 1.1.5 *** dnl 1.1.4 and earlier were not API/ABI compatible with 1.0 dnl 1.1.6 is the first to use a .pc/pkg-config file *** dnl speex_jitter.h is 1.1.x only translit(dnm, m, l) AM_CONDITIONAL(USE_SPEEX, true) AG_GST_CHECK_FEATURE(SPEEX, [speex speech codec], speex, [ AG_GST_PKG_CHECK_MODULES(SPEEX, speex >= 1.1.6) if test $HAVE_SPEEX = no then AG_GST_CHECK_LIBHEADER(SPEEX, speex, speex_bits_init, , speex/speex.h, [ AC_CHECK_HEADER(speex/speex_jitter.h, [ dnl speex 1.1.x : AG_GST_CHECK_LIBHEADER(SPEEX, speex, speex_encode_int, , speex/speex.h, [ dnl speex 1.1.5 or + : HAVE_SPEEX="yes" SPEEX_LIBS="-lspeex" AC_SUBST(SPEEX_CFLAGS) AC_SUBST(SPEEX_LIBS) ],[ HAVE_SPEEX="no" ]) ],[ dnl speex 1.0.x : AC_CHECK_DECL(SPEEX_GET_LOOKAHEAD, [ dnl speex 1.0.4 HAVE_SPEEX="yes" SPEEX_LIBS="-lspeex" AC_SUBST(SPEEX_CFLAGS) AC_SUBST(SPEEX_LIBS) AC_DEFINE_UNQUOTED(SPEEX_1_0, 1, [defined if speex 1.0.x API detected]) ],[ HAVE_SPEEX="no" AC_MSG_NOTICE(You need at least 1.0.4 to compile the speex plugin) ], [ #include ]) ]) ]) fi ]) dnl *** taglib *** translit(dnm, m, l) AM_CONDITIONAL(USE_TAGLIB, true) AG_GST_CHECK_FEATURE(TAGLIB, [taglib tagging library], taglib, [ AG_GST_PKG_CHECK_MODULES(TAGLIB, taglib >= 1.5) if test "x$HAVE_CXX" != "xyes"; then USE_TAGLIB=false AC_MSG_NOTICE([Not building taglib plugin: no C++ compiler found]) else dnl work around bug in taglib 1.5 headers, remove once there is a 1.6 AS_CXX_COMPILER_FLAG([-Wno-attributes], [ TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS -Wno-attributes" ], [ TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS" ]) AC_SUBST(TAGLIB_CXXFLAGS) fi ]) dnl *** wavpack *** translit(dnm, m, l) AM_CONDITIONAL(USE_WAVPACK, true) AG_GST_CHECK_FEATURE(WAVPACK, [wavpack plug-in], wavpack, [ PKG_CHECK_MODULES(WAVPACK, wavpack >= 4.40.0, HAVE_WAVPACK=yes, [ PKG_CHECK_MODULES(WAVPACK, wavpack >= 4.20, [ HAVE_WAVPACK=yes AC_DEFINE(WAVPACK_OLD_API, 1, [old wavpack API]) ],[ HAVE_WAVPACK=no ]) ]) AC_SUBST(WAVPACK_CFLAGS) AC_SUBST(WAVPACK_LIBS) ]) dnl *** qtdemux & matroska prefer to have zlib *** translit(dnm, m, l) AM_CONDITIONAL(USE_ZLIB, true) AG_GST_CHECK_FEATURE(ZLIB, [zlib support for qtdemux/matroska],, [ AG_GST_CHECK_LIBHEADER(ZLIB, z, uncompress,, zlib.h, [ HAVE_ZLIB="yes" ZLIB_LIBS="-lz" AC_SUBST(ZLIB_LIBS) ]) ]) dnl *** matroska prefers to have bz2 *** translit(dnm, m, l) AM_CONDITIONAL(USE_BZ2, true) AG_GST_CHECK_FEATURE(BZ2, [bz2 library for matroska ],, [ AG_GST_CHECK_LIBHEADER(BZ2, bz2, BZ2_bzCompress, ,bzlib.h, BZ2_LIBS="-lbz2") AC_SUBST(BZ2_LIBS) ]) else dnl not building plugins with external dependencies, dnl but we still need to set the conditionals AM_CONDITIONAL(USE_AALIB, false) AM_CONDITIONAL(USE_ANNODEX, false) AM_CONDITIONAL(USE_BZ2, false) AM_CONDITIONAL(USE_CAIRO, false) AM_CONDITIONAL(USE_CAIRO_GOBJECT, false) AM_CONDITIONAL(USE_DIRECTSOUND, false) AM_CONDITIONAL(USE_DV1394, false) AM_CONDITIONAL(USE_ESD, false) AM_CONDITIONAL(USE_FLAC, false) AM_CONDITIONAL(USE_GCONF, false) 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) AM_CONDITIONAL(USE_LIBIEC61883, false) AM_CONDITIONAL(USE_LIBPNG, false) AM_CONDITIONAL(USE_OSS, false) AM_CONDITIONAL(USE_OSS4, false) AM_CONDITIONAL(USE_OSX_AUDIO, false) AM_CONDITIONAL(USE_OSX_VIDEO, false) AM_CONDITIONAL(USE_PULSE, false) AM_CONDITIONAL(USE_SHOUT2, false) AM_CONDITIONAL(USE_SOUP, false) AM_CONDITIONAL(USE_SPEEX, false) AM_CONDITIONAL(USE_SUNAUDIO, false) AM_CONDITIONAL(USE_TAGLIB, false) AM_CONDITIONAL(USE_WAVPACK, false) AM_CONDITIONAL(USE_X, false) AM_CONDITIONAL(USE_XSHM, false) AM_CONDITIONAL(USE_XVIDEO, false) AM_CONDITIONAL(USE_ZLIB, false) fi dnl of EXT plugins dnl *** finalize CFLAGS, LDFLAGS, LIBS dnl Overview: dnl GST_OPTION_CFLAGS: common flags for profiling, debugging, errors, ... dnl GST_*: flags shared by all built objects dnl GST_ALL_LDFLAGS: linker flags shared by all dnl GST_LIB_LDFLAGS: not needed, we don't install libraries dnl GST_LT_LDFLAGS: library versioning of our libraries dnl GST_PLUGIN_LDFLAGS: flags to be used for all plugins dnl GST_OPTION_CFLAGS if test "x$USE_DEBUG" = xyes; then PROFILE_CFLAGS="-g" fi AC_SUBST(PROFILE_CFLAGS) if test "x$PACKAGE_VERSION_NANO" = "x1"; then dnl Define _only_ for git (not pre-releases or releases) DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED" else DEPRECATED_CFLAGS="" fi AC_SUBST(DEPRECATED_CFLAGS) dnl every flag in GST_OPTION_CFLAGS and GST_OPTION_CXXFLAGS can be overridden dnl at make time with e.g. make ERROR_CFLAGS="" GST_OPTION_CFLAGS="\$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" GST_OPTION_CXXFLAGS="\$(WARNING_CXXFLAGS) \$(ERROR_CXXFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" AC_SUBST(GST_OPTION_CFLAGS) AC_SUBST(GST_OPTION_CXXFLAGS) dnl our libraries need to be versioned correctly AC_SUBST(GST_LT_LDFLAGS) dnl FIXME: do we want to rename to GST_ALL_* ? dnl prefer internal headers to already installed ones dnl also add builddir include for enumtypes and marshal dnl add ERROR_CFLAGS, but overridable GST_CXXFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)" GST_CFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)" AC_SUBST(GST_CFLAGS) AC_SUBST(GST_CXXFLAGS) AC_SUBST(GST_LIBS) dnl LDFLAGS really should only contain flags, not libs - they get added before dnl whatevertarget_LIBS and -L flags here affect the rest of the linking GST_ALL_LDFLAGS="-no-undefined" AC_SUBST(GST_ALL_LDFLAGS) dnl this really should only contain flags, not libs - they get added before dnl whatevertarget_LIBS and -L flags here affect the rest of the linking GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^[_]*gst_plugin_desc.*' $GST_ALL_LDFLAGS" AC_SUBST(GST_PLUGIN_LDFLAGS) dnl *** output files *** dnl keep this alphabetic per directory, please AC_CONFIG_FILES( Makefile gst/Makefile gst/alpha/Makefile gst/apetag/Makefile gst/audiofx/Makefile gst/audioparsers/Makefile gst/auparse/Makefile gst/autodetect/Makefile gst/avi/Makefile gst/cutter/Makefile gst/deinterlace/Makefile gst/debugutils/Makefile gst/effectv/Makefile gst/equalizer/Makefile gst/flv/Makefile gst/goom/Makefile gst/goom2k1/Makefile gst/id3demux/Makefile gst/icydemux/Makefile gst/imagefreeze/Makefile gst/interleave/Makefile gst/isomp4/Makefile gst/law/Makefile gst/level/Makefile gst/matroska/Makefile gst/monoscope/Makefile gst/multifile/Makefile gst/multipart/Makefile gst/replaygain/Makefile gst/rtp/Makefile gst/rtpmanager/Makefile gst/rtsp/Makefile gst/shapewipe/Makefile gst/smpte/Makefile gst/spectrum/Makefile gst/udp/Makefile gst/videobox/Makefile gst/videocrop/Makefile gst/videofilter/Makefile gst/videomixer/Makefile gst/wavenc/Makefile gst/wavparse/Makefile gst/flx/Makefile gst/y4m/Makefile ext/Makefile ext/aalib/Makefile ext/annodex/Makefile ext/cairo/Makefile ext/dv/Makefile ext/esd/Makefile 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 ext/raw1394/Makefile ext/shout2/Makefile ext/soup/Makefile ext/speex/Makefile ext/taglib/Makefile ext/wavpack/Makefile sys/Makefile sys/directsound/Makefile sys/oss/Makefile sys/oss4/Makefile sys/osxaudio/Makefile sys/osxvideo/Makefile sys/sunaudio/Makefile sys/v4l2/Makefile sys/waveform/Makefile sys/ximage/Makefile po/Makefile.in tests/Makefile tests/check/Makefile tests/examples/Makefile tests/examples/audiofx/Makefile tests/examples/cairo/Makefile tests/examples/equalizer/Makefile tests/examples/jack/Makefile tests/examples/level/Makefile tests/examples/pulse/Makefile tests/examples/rtp/Makefile tests/examples/shapewipe/Makefile tests/examples/spectrum/Makefile tests/examples/v4l2/Makefile tests/files/Makefile tests/icles/Makefile gconf/Makefile gconf/gstreamer.schemas common/Makefile common/m4/Makefile m4/Makefile docs/Makefile docs/plugins/Makefile docs/version.entities pkgconfig/Makefile pkgconfig/gstreamer-plugins-good-uninstalled.pc gst-plugins-good.spec ) dnl Create the config.h file for Visual Studio builds dnl Beware of spaces and /'s in some of the shell variable contents. sed \ -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"\n\n#define GST_INSTALL_PLUGINS_HELPER PREFIX "\\\\libexec\\\\gst-install-plugins-helper.exe"/' \ -e 's/.* GETTEXT_PACKAGE$/#define GETTEXT_PACKAGE "'$GETTEXT_PACKAGE'"/' \ -e 's/.* GST_DATADIR$/#define GST_DATADIR PREFIX "\\\\share"/' \ -e 's/.* GST_LEVEL_DEFAULT$/#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR/' \ -e 's/.* GST_LICENSE$/#define GST_LICENSE "'$GST_LICENSE'"/' \ -e 's/.* GST_MAJORMINOR$/#define GST_MAJORMINOR "'$GST_MAJORMINOR'"/' \ -e "s,.* GST_PACKAGE_NAME$,#define GST_PACKAGE_NAME \"${GST_PACKAGE_NAME}\"," \ -e 's/.* GST_PACKAGE_ORIGIN$/#define GST_PACKAGE_ORIGIN "Unknown package origin"/' \ -e "s,.* GST_PACKAGE_RELEASE_DATETIME$,#define GST_PACKAGE_RELEASE_DATETIME \"${GST_PACKAGE_RELEASE_DATETIME}\"," \ -e 's/.* HAVE_CPU_I386$/#define HAVE_CPU_I386 1/' \ -e 's/.* HAVE_FGETPOS$/#define HAVE_FGETPOS 1/' \ -e 's/.* HAVE_FSETPOS$/#define HAVE_FSETPOS 1/' \ -e 's/.* HAVE_LIBXML2$/#define HAVE_LIBXML2 1/' \ -e 's/.* HAVE_PROCESS_H$/#define HAVE_PROCESS_H 1/' \ -e 's/.* HAVE_STDLIB_H$/#define HAVE_STDLIB_H 1/' \ -e 's/.* HAVE_STRING_H$/#define HAVE_STRING_H 1/' \ -e 's/.* HAVE_SYS_STAT_H$/#define HAVE_SYS_STAT_H 1/' \ -e 's/.* HAVE_SYS_TYPES_H$/#define HAVE_SYS_TYPES_H 1/' \ -e 's/.* HAVE_WIN32$/#define HAVE_WIN32 1/' \ -e 's/.* HAVE_WINSOCK2_H$/#define HAVE_WINSOCK2_H 1/' \ -e 's/.* HOST_CPU$/#define HOST_CPU "i686"/' \ -e 's/.* LIBDIR$/#ifdef _DEBUG\n# define LIBDIR PREFIX "\\\\debug\\\\lib"\n#else\n# define LIBDIR PREFIX "\\\\lib"\n#endif/' \ -e 's/.* LOCALEDIR$/#define LOCALEDIR PREFIX "\\\\share\\\\locale"/' \ -e "s/.* PACKAGE$/#define PACKAGE \"$PACKAGE\"/" \ -e 's/.* PACKAGE_BUGREPORT$/#define PACKAGE_BUGREPORT "http:\/\/bugzilla.gnome.org\/enter_bug.cgi?product=GStreamer"/' \ -e "s/.* PACKAGE_NAME$/#define PACKAGE_NAME \"$PACKAGE_NAME\"/" \ -e "s/.* PACKAGE_STRING$/#define PACKAGE_STRING \"$PACKAGE_STRING\"/" \ -e 's/.* PACKAGE_TARNAME$/#define PACKAGE_TARNAME "'$PACKAGE_TARNAME'"/' \ -e 's/.* PACKAGE_VERSION$/#define PACKAGE_VERSION "'$PACKAGE_VERSION'"/' \ -e 's/.* PLUGINDIR$/#ifdef _DEBUG\n# define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.10"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.10"\n#endif/' \ -e 's/.* USE_BINARY_REGISTRY$/#define USE_BINARY_REGISTRY/' \ -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \ -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\"/" \ config.h.in >win32/common/config.h-new AC_OUTPUT AG_GST_OUTPUT_PLUGINS ORC_OUTPUT gst-plugins-good-0.10.31/gst-plugins-good.spec0000644000175000017500000001550311720560274016065 00000000000000%define majorminor 0.10 %define gstreamer gstreamer %define gst_minver 0.10.0 Name: %{gstreamer}-plugins-good Version: 0.10.31 Release: 1.gst Summary: GStreamer plug-ins with good code and licensing Group: Applications/Multimedia License: LGPL URL: http://gstreamer.freedesktop.org/ Vendor: GStreamer Backpackers Team Source: http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: %{gstreamer} >= %{gst_minver} BuildRequires: %{gstreamer}-devel >= %{gst_minver} BuildRequires: gcc-c++ BuildRequires: esound-devel >= 0.2.8 Obsoletes: gstreamer-esd Provides: gstreamer-audiosrc Provides: gstreamer-audiosink BuildRequires: flac-devel >= 1.0.3 BuildRequires: GConf2-devel BuildRequires: libjpeg-devel BuildRequires: libcaca-devel BuildRequires: libdv-devel BuildRequires: libpng-devel >= 1.2.0 BuildRequires: glibc-devel BuildRequires: speex-devel BuildRequires: hal-devel BuildRequires: libshout-devel >= 2.0 BuildRequires: aalib-devel >= 1.3 Provides: gstreamer-aasink = %{version}-%{release} BuildRequires: pulseaudio-libs-devel BuildRequires: libavc1394-devel BuildRequires: libdc1394-devel BuildRequires: libiec61883-devel BuildRequires: libraw1394-devel %description GStreamer is a streaming media framework, based on graphs of filters which operate on media data. Applications using this library can do anything from real-time sound processing to playing videos, and just about anything else media-related. Its plugin-based architecture means that new data types or processing capabilities can be added simply by installing new plug-ins. %prep %setup -q -n gst-plugins-good-%{version} %build %configure \ --enable-debug \ --enable-DEBUG make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 %makeinstall unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL # Clean out files that should not be part of the rpm. rm -f $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.a rm -f $RPM_BUILD_ROOT%{_libdir}/*.a rm -f $RPM_BUILD_ROOT%{_libdir}/*.la %find_lang gst-plugins-good-%{majorminor} %clean rm -rf $RPM_BUILD_ROOT %post export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas > /dev/null %files -f gst-plugins-good-%{majorminor}.lang %defattr(-, root, root) %doc AUTHORS COPYING README REQUIREMENTS gst-plugins-good.doap %{_datadir}/gstreamer-%{majorminor}/presets/GstIirEqualizer10Bands.prs %{_datadir}/gstreamer-%{majorminor}/presets/GstIirEqualizer3Bands.prs # non-core plugins without external dependencies %{_libdir}/gstreamer-%{majorminor}/libgstalaw.so %{_libdir}/gstreamer-%{majorminor}/libgstalpha.so %{_libdir}/gstreamer-%{majorminor}/libgstautodetect.so %{_libdir}/gstreamer-%{majorminor}/libgstavi.so %{_libdir}/gstreamer-%{majorminor}/libgsteffectv.so %{_libdir}/gstreamer-%{majorminor}/libgstgoom.so %{_libdir}/gstreamer-%{majorminor}/libgstlevel.so %{_libdir}/gstreamer-%{majorminor}/libgstefence.so %{_libdir}/gstreamer-%{majorminor}/libgstmulaw.so %{_libdir}/gstreamer-%{majorminor}/libgstisomp4.so %{_libdir}/gstreamer-%{majorminor}/libgstrtp.so %{_libdir}/gstreamer-%{majorminor}/libgstrtpmanager.so %{_libdir}/gstreamer-%{majorminor}/libgstrtsp.so %{_libdir}/gstreamer-%{majorminor}/libgstsmpte.so %{_libdir}/gstreamer-%{majorminor}/libgstudp.so %{_libdir}/gstreamer-%{majorminor}/libgstvideobox.so %{_libdir}/gstreamer-%{majorminor}/libgstwavenc.so %{_libdir}/gstreamer-%{majorminor}/libgstwavparse.so %{_libdir}/gstreamer-%{majorminor}/libgstauparse.so %{_libdir}/gstreamer-%{majorminor}/libgstdebug.so %{_libdir}/gstreamer-%{majorminor}/libgstnavigationtest.so %{_libdir}/gstreamer-%{majorminor}/libgstalphacolor.so %{_libdir}/gstreamer-%{majorminor}/libgstcairo.so %{_libdir}/gstreamer-%{majorminor}/libgstflxdec.so %{_libdir}/gstreamer-%{majorminor}/libgstmatroska.so %{_libdir}/gstreamer-%{majorminor}/libgstvideomixer.so %{_libdir}/gstreamer-%{majorminor}/libgstcutter.so %{_libdir}/gstreamer-%{majorminor}/libgstmultipart.so %{_libdir}/gstreamer-%{majorminor}/libgstid3demux.so %{_libdir}/gstreamer-%{majorminor}/libgstgdkpixbuf.so %{_libdir}/gstreamer-%{majorminor}/libgstapetag.so %{_libdir}/gstreamer-%{majorminor}/libgstannodex.so %{_libdir}/gstreamer-%{majorminor}/libgstvideocrop.so %{_libdir}/gstreamer-%{majorminor}/libgsticydemux.so %{_libdir}/gstreamer-%{majorminor}/libgsttaglib.so %{_libdir}/gstreamer-%{majorminor}/libgstximagesrc.so %{_libdir}/gstreamer-%{majorminor}/libgstaudiofx.so %{_libdir}/gstreamer-%{majorminor}/libgstequalizer.so %{_libdir}/gstreamer-%{majorminor}/libgstmultifile.so %{_libdir}/gstreamer-%{majorminor}/libgstspectrum.so %{_libdir}/gstreamer-%{majorminor}/libgstgoom2k1.so %{_libdir}/gstreamer-%{majorminor}/libgstinterleave.so %{_libdir}/gstreamer-%{majorminor}/libgstreplaygain.so %{_libdir}/gstreamer-%{majorminor}/libgstdeinterlace.so %{_libdir}/gstreamer-%{majorminor}/libgstflv.so %{_libdir}/gstreamer-%{majorminor}/libgsty4menc.so %{_libdir}/gstreamer-%{majorminor}/libgstoss4audio.so %{_libdir}/gstreamer-%{majorminor}/libgstimagefreeze.so %{_libdir}/gstreamer-%{majorminor}/libgstshapewipe.so %{_libdir}/gstreamer-%{majorminor}/libgstvideofilter.so %{_libdir}/gstreamer-%{majorminor}/libgstaudioparsers.so # sys plugins %{_libdir}/gstreamer-%{majorminor}/libgstvideo4linux2.so # gstreamer-plugins with external dependencies but in the main package %{_libdir}/gstreamer-%{majorminor}/libgstcacasink.so %{_libdir}/gstreamer-%{majorminor}/libgstesd.so %{_libdir}/gstreamer-%{majorminor}/libgstflac.so %{_libdir}/gstreamer-%{majorminor}/libgstjack.so %{_libdir}/gstreamer-%{majorminor}/libgstjpeg.so %{_libdir}/gstreamer-%{majorminor}/libgstpng.so %{_libdir}/gstreamer-%{majorminor}/libgstossaudio.so %{_libdir}/gstreamer-%{majorminor}/libgstspeex.so %{_libdir}/gstreamer-%{majorminor}/libgstgconfelements.so %{_libdir}/gstreamer-%{majorminor}/libgsthalelements.so %{_libdir}/gstreamer-%{majorminor}/libgstshout2.so %{_libdir}/gstreamer-%{majorminor}/libgstaasink.so %{_libdir}/gstreamer-%{majorminor}/libgstdv.so %{_libdir}/gstreamer-%{majorminor}/libgst1394.so %{_libdir}/gstreamer-%{majorminor}/libgstwavpack.so %{_libdir}/gstreamer-%{majorminor}/libgstsouphttpsrc.so %{_libdir}/gstreamer-%{majorminor}/libgstpulse.so # schema files %{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas %changelog * Tue Jun 12 2007 Jan Schmidt - wavpack and qtdemux have moved from bad * Fri Sep 02 2005 Thomas Vander Stichele - clean up for splitup gst-plugins-good-0.10.31/COPYING0000644000175000017500000006350011671175352013046 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! gst-plugins-good-0.10.31/Makefile.am0000644000175000017500000000451411677341654014055 00000000000000DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc if USE_GCONFTOOL GCONF_DIR = gconf else GCONF_DIR = endif ALWAYS_SUBDIRS = \ gst sys ext \ tests \ docs \ po \ common \ m4 \ pkgconfig SUBDIRS = \ $(ALWAYS_SUBDIRS) \ $(GCONF_DIR) DIST_SUBDIRS = \ $(ALWAYS_SUBDIRS) \ gconf # include before EXTRA_DIST for win32 assignment include $(top_srcdir)/common/win32.mak EXTRA_DIST = \ gst-plugins-good.spec depcomp \ AUTHORS COPYING NEWS README RELEASE REQUIREMENTS \ ChangeLog gst-plugins-good.doap autogen.sh \ $(win32) DISTCLEANFILES = _stdint.h noinst_HEADERS = \ gst-libs/gst/gettext.h \ gst-libs/gst/gst-i18n-plugin.h \ gst-libs/gst/glib-compat-private.h ACLOCAL_AMFLAGS = -I m4 -I common/m4 include $(top_srcdir)/common/release.mak include $(top_srcdir)/common/po.mak check-valgrind: cd tests/check && make check-valgrind if HAVE_GST_CHECK check-torture: cd tests/check && make torture else check-torture: true endif win32-update: for f in gst/udp/gstudp-marshal.c \ gst/udp/gstudp-marshal.h \ gst/udp/gstudp-enumtypes.c \ gst/udp/gstudp-enumtypes.h \ gst/rtpmanager/gstrtpbin-marshal.c \ gst/rtpmanager/gstrtpbin-marshal.h ; do \ cp $(top_builddir)/$$f win32/common; done $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c cp $(top_builddir)/win32/common/config.h-new \ $(top_srcdir)/win32/common/config.h include $(top_srcdir)/common/coverage/lcov.mak # cruft: plugins that have been merged or moved or renamed CRUFT_FILES = \ $(top_builddir)/common/shave \ $(top_builddir)/common/shave-libtool \ $(top_builddir)/gst/qtdemux/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/quicktime/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/videofilter/.libs/*videoflip.{so,dll,DLL,dylib} \ $(top_builddir)/gst/videofilter/.libs/*videobalance.{so,dll,DLL,dylib} \ $(top_builddir)/gst/videofilter/.libs/*gamma.{so,dll,DLL,dylib} CRUFT_DIRS = \ $(top_srcdir)/gst/qtdemux \ $(top_srcdir)/gst/quicktime include $(top_srcdir)/common/cruft.mak all-local: check-cruft gst-plugins-good-0.10.31/aclocal.m40000644000175000017500000012302511720560220013635 00000000000000# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Figure out how to run the assembler. -*- Autoconf -*- # Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_PROG_AS # ---------- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code. AC_REQUIRE([AC_PROG_CC]) test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2009, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # (`yes' being less verbose, `no' or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([common/m4/as-ac-expand.m4]) m4_include([common/m4/as-auto-alt.m4]) m4_include([common/m4/as-compiler-flag.m4]) m4_include([common/m4/as-gcc-inline-assembly.m4]) m4_include([common/m4/as-objc.m4]) m4_include([common/m4/as-python.m4]) m4_include([common/m4/as-scrub-include.m4]) m4_include([common/m4/as-version.m4]) m4_include([common/m4/ax_create_stdint_h.m4]) m4_include([common/m4/gst-arch.m4]) m4_include([common/m4/gst-args.m4]) m4_include([common/m4/gst-check.m4]) m4_include([common/m4/gst-default.m4]) m4_include([common/m4/gst-dowhile.m4]) m4_include([common/m4/gst-error.m4]) m4_include([common/m4/gst-feature.m4]) m4_include([common/m4/gst-gettext.m4]) m4_include([common/m4/gst-glib2.m4]) m4_include([common/m4/gst-package-release-datetime.m4]) m4_include([common/m4/gst-platform.m4]) m4_include([common/m4/gst-plugin-docs.m4]) m4_include([common/m4/gst-plugindir.m4]) m4_include([common/m4/gst-x11.m4]) m4_include([common/m4/gst.m4]) m4_include([common/m4/gtk-doc.m4]) m4_include([common/m4/orc.m4]) m4_include([common/m4/pkg.m4]) m4_include([m4/aalib.m4]) m4_include([m4/esd.m4]) m4_include([m4/gconf-2.m4]) m4_include([m4/gettext.m4]) m4_include([m4/gst-fionread.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intlmacosx.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/nls.m4]) m4_include([m4/po.m4]) m4_include([m4/progtest.m4]) gst-plugins-good-0.10.31/win32/0000755000175000017500000000000011720565300013020 500000000000000gst-plugins-good-0.10.31/win32/vs8/0000755000175000017500000000000011720565300013540 500000000000000gst-plugins-good-0.10.31/win32/vs8/libgstmonoscope.vcproj0000644000175000017500000001212011671175355020124 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstflac.vcproj0000644000175000017500000001216311671175355017036 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstcacasink.vcproj0000644000175000017500000001166211671175355017710 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstavi.vcproj0000644000175000017500000001212711671175355016710 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstshout2.vcproj0000644000175000017500000001165311671175355017360 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstalpha.vcproj0000644000175000017500000001164711671175355017224 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstmulaw.vcproj0000644000175000017500000001220411671175355017252 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstaasink.vcproj0000644000175000017500000001165211671175355017401 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstudp.vcproj0000644000175000017500000001226311671175355016722 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstdv.vcproj0000644000175000017500000001204711671175355016543 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstvideobox.vcproj0000644000175000017500000001172511671175355017753 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstwavparse.vcproj0000644000175000017500000001173311671175355017763 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstmatroska.vcproj0000644000175000017500000001254011671175355017751 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstsmpte.vcproj0000644000175000017500000001217611671175355017265 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgst1394.vcproj0000644000175000017500000001176411671175355016537 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstjpeg.vcproj0000644000175000017500000001242211671175355017054 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstmikmod.vcproj0000644000175000017500000001210111671175355017401 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstcdio.vcproj0000644000175000017500000001176011671175355017051 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstvideomixer.vcproj0000644000175000017500000001167011671175355020306 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstlevel.vcproj0000644000175000017500000001164711671175355017246 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstaudiofx.vcproj0000644000175000017500000001205711671175355017572 00000000000000 gst-plugins-good-0.10.31/win32/vs8/gst-plugins-good.sln0000644000175000017500000004516511671175355017427 00000000000000 Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstautodetect", "libgstautodetect.vcproj", "{B6669382-7F21-42E4-9023-462F9018F865}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstid3demux", "libgstid3demux.vcproj", "{B6591AC3-BD2F-4C79-87C9-7F42E21251C2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstavi", "libgstavi.vcproj", "{381D20B2-92DB-4205-AC64-C33A0AC40D5E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstudp", "libgstudp.vcproj", "{25B084CE-AC6C-4414-B9B0-41004371934A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstalaw", "libgstalaw.vcproj", "{92CBE678-6C17-11DB-9733-DDB456D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstalpha", "libgstalpha.vcproj", "{9CC6D4D0-6C17-11DB-89C9-E3B456D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstalphacolor", "libgstalphacolor.vcproj", "{AA003CFE-6C17-11DB-9B55-E6B456D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstapetag", "libgstapetag.vcproj", "{B3B897FA-6C17-11DB-8D14-EFB456D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaudiofx", "libgstaudiofx.vcproj", "{BB0FABB0-6C17-11DB-A701-F5B456D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstauparse", "libgstauparse.vcproj", "{C276F778-6C17-11DB-B896-00B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcutter", "libgstcutter.vcproj", "{CBF1FBE0-6C17-11DB-99AF-05B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsteffectv", "libgsteffectv.vcproj", "{D103C582-6C17-11DB-8273-09B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstflxdec", "libgstflxdec.vcproj", "{D778BBE8-6C17-11DB-AFE1-0DB556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstgoom", "libgstgoom.vcproj", "{F41C2640-6C17-11DB-9510-3DB556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsticydemux", "libgsticydemux.vcproj", "{FD69ECA0-6C17-11DB-BF73-62B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstlevel", "libgstlevel.vcproj", "{0780A724-6C18-11DB-ACF2-70B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmatroska", "libgstmatroska.vcproj", "{0CE09E18-6C18-11DB-8579-83B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmonoscope", "libgstmonoscope.vcproj", "{16142432-6C18-11DB-A314-93B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmulaw", "libgstmulaw.vcproj", "{1B53F562-6C18-11DB-AFE1-94B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmultipart", "libgstmultipart.vcproj", "{2386631E-6C18-11DB-B2CD-9EB556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstrtp", "libgstrtp.vcproj", "{29E030BE-6C18-11DB-8859-A0B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstrtsp", "libgstrtsp.vcproj", "{3904C230-6C18-11DB-A868-A9B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstsmpte", "libgstsmpte.vcproj", "{423C0CDC-6C18-11DB-9704-AAB556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideobalance", "libgstvideobalance.vcproj", "{4B12161C-6C18-11DB-BC6F-B3B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideobox", "libgstvideobox.vcproj", "{5330421A-6C18-11DB-A88B-BEB556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideoflip", "libgstvideoflip.vcproj", "{5A6F5C14-6C18-11DB-B1F3-D9B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstvideomixer", "libgstvideomixer.vcproj", "{651409EE-6C18-11DB-AEAF-E4B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstwavenc", "libgstwavenc.vcproj", "{6C6FD66E-6C18-11DB-AA23-F0B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstwavparse", "libgstwavparse.vcproj", "{739D73A6-6C18-11DB-B933-F3B556D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstflac", "libgstflac.vcproj", "{9986EFCA-6EA2-11DB-B620-FCFA55D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstaasink", "libgstaasink.vcproj", "{A6BD695A-6EA5-11DB-BB0B-4B0156D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstannodex", "libgstannodex.vcproj", "{D591C19A-6EA5-11DB-AF77-BD0156D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcdio", "libgstcdio.vcproj", "{39672A0C-6EA6-11DB-9C0E-170256D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdv", "libgstdv.vcproj", "{7B605CA8-6EA6-11DB-AA13-7B0256D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstjpeg", "libgstjpeg.vcproj", "{C85765CE-6EA6-11DB-AF57-DC0256D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstladspa", "libgstladspa.vcproj", "{248366D6-6EA7-11DB-B463-360356D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcacasink", "libgstcacasink.vcproj", "{6BA664FA-6EA7-11DB-BD2C-9D0356D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmng", "libgstmng.vcproj", "{A540149A-6EA7-11DB-8FF8-E10356D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstpng", "libgstpng.vcproj", "{D5152638-6EA7-11DB-8D6A-1E0456D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstmikmod", "libgstmikmod.vcproj", "{A97137F2-7036-11DB-9E40-0D7555D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgst1394", "libgst1394.vcproj", "{E7E9BA40-7036-11DB-8128-867555D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstshout2", "libgstshout2.vcproj", "{1EACDB66-7037-11DB-B4B7-B17655D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstspeex", "libgstspeex.vcproj", "{CDC7BC24-7037-11DB-AC6C-7F7755D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgsttaglib", "libgsttaglib.vcproj", "{0AEC363E-7038-11DB-9B86-957755D89593}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectdraw", "libgstdirectdraw.vcproj", "{1594A623-5529-4B86-BD4A-694CF0BDB5C4}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstdirectsound", "libgstdirectsound.vcproj", "{566A2EB9-984C-4027-86DD-EDC7B390C679}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B6669382-7F21-42E4-9023-462F9018F865}.Debug|Win32.ActiveCfg = Debug|Win32 {B6669382-7F21-42E4-9023-462F9018F865}.Debug|Win32.Build.0 = Debug|Win32 {B6669382-7F21-42E4-9023-462F9018F865}.Release|Win32.ActiveCfg = Release|Win32 {B6669382-7F21-42E4-9023-462F9018F865}.Release|Win32.Build.0 = Release|Win32 {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Debug|Win32.ActiveCfg = Debug|Win32 {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Debug|Win32.Build.0 = Debug|Win32 {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Release|Win32.ActiveCfg = Release|Win32 {B6591AC3-BD2F-4C79-87C9-7F42E21251C2}.Release|Win32.Build.0 = Release|Win32 {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Debug|Win32.ActiveCfg = Debug|Win32 {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Debug|Win32.Build.0 = Debug|Win32 {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Release|Win32.ActiveCfg = Release|Win32 {381D20B2-92DB-4205-AC64-C33A0AC40D5E}.Release|Win32.Build.0 = Release|Win32 {25B084CE-AC6C-4414-B9B0-41004371934A}.Debug|Win32.ActiveCfg = Debug|Win32 {25B084CE-AC6C-4414-B9B0-41004371934A}.Release|Win32.ActiveCfg = Release|Win32 {92CBE678-6C17-11DB-9733-DDB456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {92CBE678-6C17-11DB-9733-DDB456D89593}.Debug|Win32.Build.0 = Debug|Win32 {92CBE678-6C17-11DB-9733-DDB456D89593}.Release|Win32.ActiveCfg = Release|Win32 {92CBE678-6C17-11DB-9733-DDB456D89593}.Release|Win32.Build.0 = Release|Win32 {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Debug|Win32.Build.0 = Debug|Win32 {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Release|Win32.ActiveCfg = Release|Win32 {9CC6D4D0-6C17-11DB-89C9-E3B456D89593}.Release|Win32.Build.0 = Release|Win32 {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Debug|Win32.Build.0 = Debug|Win32 {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Release|Win32.ActiveCfg = Release|Win32 {AA003CFE-6C17-11DB-9B55-E6B456D89593}.Release|Win32.Build.0 = Release|Win32 {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Debug|Win32.Build.0 = Debug|Win32 {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Release|Win32.ActiveCfg = Release|Win32 {B3B897FA-6C17-11DB-8D14-EFB456D89593}.Release|Win32.Build.0 = Release|Win32 {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Debug|Win32.Build.0 = Debug|Win32 {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Release|Win32.ActiveCfg = Release|Win32 {BB0FABB0-6C17-11DB-A701-F5B456D89593}.Release|Win32.Build.0 = Release|Win32 {C276F778-6C17-11DB-B896-00B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {C276F778-6C17-11DB-B896-00B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {C276F778-6C17-11DB-B896-00B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {C276F778-6C17-11DB-B896-00B556D89593}.Release|Win32.Build.0 = Release|Win32 {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {CBF1FBE0-6C17-11DB-99AF-05B556D89593}.Release|Win32.Build.0 = Release|Win32 {D103C582-6C17-11DB-8273-09B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {D103C582-6C17-11DB-8273-09B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {D103C582-6C17-11DB-8273-09B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {D103C582-6C17-11DB-8273-09B556D89593}.Release|Win32.Build.0 = Release|Win32 {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Debug|Win32.Build.0 = Debug|Win32 {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Release|Win32.ActiveCfg = Release|Win32 {D778BBE8-6C17-11DB-AFE1-0DB556D89593}.Release|Win32.Build.0 = Release|Win32 {F41C2640-6C17-11DB-9510-3DB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {F41C2640-6C17-11DB-9510-3DB556D89593}.Debug|Win32.Build.0 = Debug|Win32 {F41C2640-6C17-11DB-9510-3DB556D89593}.Release|Win32.ActiveCfg = Release|Win32 {F41C2640-6C17-11DB-9510-3DB556D89593}.Release|Win32.Build.0 = Release|Win32 {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {FD69ECA0-6C17-11DB-BF73-62B556D89593}.Release|Win32.Build.0 = Release|Win32 {0780A724-6C18-11DB-ACF2-70B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {0780A724-6C18-11DB-ACF2-70B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {0780A724-6C18-11DB-ACF2-70B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {0780A724-6C18-11DB-ACF2-70B556D89593}.Release|Win32.Build.0 = Release|Win32 {0CE09E18-6C18-11DB-8579-83B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {0CE09E18-6C18-11DB-8579-83B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {0CE09E18-6C18-11DB-8579-83B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {0CE09E18-6C18-11DB-8579-83B556D89593}.Release|Win32.Build.0 = Release|Win32 {16142432-6C18-11DB-A314-93B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {16142432-6C18-11DB-A314-93B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {16142432-6C18-11DB-A314-93B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {16142432-6C18-11DB-A314-93B556D89593}.Release|Win32.Build.0 = Release|Win32 {1B53F562-6C18-11DB-AFE1-94B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {1B53F562-6C18-11DB-AFE1-94B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {1B53F562-6C18-11DB-AFE1-94B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {1B53F562-6C18-11DB-AFE1-94B556D89593}.Release|Win32.Build.0 = Release|Win32 {2386631E-6C18-11DB-B2CD-9EB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {2386631E-6C18-11DB-B2CD-9EB556D89593}.Debug|Win32.Build.0 = Debug|Win32 {2386631E-6C18-11DB-B2CD-9EB556D89593}.Release|Win32.ActiveCfg = Release|Win32 {2386631E-6C18-11DB-B2CD-9EB556D89593}.Release|Win32.Build.0 = Release|Win32 {29E030BE-6C18-11DB-8859-A0B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {29E030BE-6C18-11DB-8859-A0B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {3904C230-6C18-11DB-A868-A9B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {3904C230-6C18-11DB-A868-A9B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {423C0CDC-6C18-11DB-9704-AAB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {423C0CDC-6C18-11DB-9704-AAB556D89593}.Debug|Win32.Build.0 = Debug|Win32 {423C0CDC-6C18-11DB-9704-AAB556D89593}.Release|Win32.ActiveCfg = Release|Win32 {423C0CDC-6C18-11DB-9704-AAB556D89593}.Release|Win32.Build.0 = Release|Win32 {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {4B12161C-6C18-11DB-BC6F-B3B556D89593}.Release|Win32.Build.0 = Release|Win32 {5330421A-6C18-11DB-A88B-BEB556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {5330421A-6C18-11DB-A88B-BEB556D89593}.Debug|Win32.Build.0 = Debug|Win32 {5330421A-6C18-11DB-A88B-BEB556D89593}.Release|Win32.ActiveCfg = Release|Win32 {5330421A-6C18-11DB-A88B-BEB556D89593}.Release|Win32.Build.0 = Release|Win32 {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {5A6F5C14-6C18-11DB-B1F3-D9B556D89593}.Release|Win32.Build.0 = Release|Win32 {651409EE-6C18-11DB-AEAF-E4B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {651409EE-6C18-11DB-AEAF-E4B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {651409EE-6C18-11DB-AEAF-E4B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {651409EE-6C18-11DB-AEAF-E4B556D89593}.Release|Win32.Build.0 = Release|Win32 {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {6C6FD66E-6C18-11DB-AA23-F0B556D89593}.Release|Win32.Build.0 = Release|Win32 {739D73A6-6C18-11DB-B933-F3B556D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {739D73A6-6C18-11DB-B933-F3B556D89593}.Debug|Win32.Build.0 = Debug|Win32 {739D73A6-6C18-11DB-B933-F3B556D89593}.Release|Win32.ActiveCfg = Release|Win32 {739D73A6-6C18-11DB-B933-F3B556D89593}.Release|Win32.Build.0 = Release|Win32 {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Debug|Win32.Build.0 = Debug|Win32 {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Release|Win32.ActiveCfg = Release|Win32 {9986EFCA-6EA2-11DB-B620-FCFA55D89593}.Release|Win32.Build.0 = Release|Win32 {A6BD695A-6EA5-11DB-BB0B-4B0156D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {A6BD695A-6EA5-11DB-BB0B-4B0156D89593}.Release|Win32.ActiveCfg = Release|Win32 {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Debug|Win32.Build.0 = Debug|Win32 {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Release|Win32.ActiveCfg = Release|Win32 {D591C19A-6EA5-11DB-AF77-BD0156D89593}.Release|Win32.Build.0 = Release|Win32 {39672A0C-6EA6-11DB-9C0E-170256D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {39672A0C-6EA6-11DB-9C0E-170256D89593}.Release|Win32.ActiveCfg = Release|Win32 {7B605CA8-6EA6-11DB-AA13-7B0256D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {7B605CA8-6EA6-11DB-AA13-7B0256D89593}.Release|Win32.ActiveCfg = Release|Win32 {C85765CE-6EA6-11DB-AF57-DC0256D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {C85765CE-6EA6-11DB-AF57-DC0256D89593}.Release|Win32.ActiveCfg = Release|Win32 {248366D6-6EA7-11DB-B463-360356D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {248366D6-6EA7-11DB-B463-360356D89593}.Release|Win32.ActiveCfg = Release|Win32 {6BA664FA-6EA7-11DB-BD2C-9D0356D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {6BA664FA-6EA7-11DB-BD2C-9D0356D89593}.Release|Win32.ActiveCfg = Release|Win32 {A540149A-6EA7-11DB-8FF8-E10356D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {A540149A-6EA7-11DB-8FF8-E10356D89593}.Release|Win32.ActiveCfg = Release|Win32 {D5152638-6EA7-11DB-8D6A-1E0456D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {D5152638-6EA7-11DB-8D6A-1E0456D89593}.Release|Win32.ActiveCfg = Release|Win32 {A97137F2-7036-11DB-9E40-0D7555D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {A97137F2-7036-11DB-9E40-0D7555D89593}.Release|Win32.ActiveCfg = Release|Win32 {E7E9BA40-7036-11DB-8128-867555D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {E7E9BA40-7036-11DB-8128-867555D89593}.Release|Win32.ActiveCfg = Release|Win32 {1EACDB66-7037-11DB-B4B7-B17655D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {1EACDB66-7037-11DB-B4B7-B17655D89593}.Release|Win32.ActiveCfg = Release|Win32 {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Debug|Win32.Build.0 = Debug|Win32 {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Release|Win32.ActiveCfg = Release|Win32 {CDC7BC24-7037-11DB-AC6C-7F7755D89593}.Release|Win32.Build.0 = Release|Win32 {0AEC363E-7038-11DB-9B86-957755D89593}.Debug|Win32.ActiveCfg = Debug|Win32 {0AEC363E-7038-11DB-9B86-957755D89593}.Release|Win32.ActiveCfg = Release|Win32 {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.ActiveCfg = Debug|Win32 {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Debug|Win32.Build.0 = Debug|Win32 {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.ActiveCfg = Release|Win32 {1594A623-5529-4B86-BD4A-694CF0BDB5C4}.Release|Win32.Build.0 = Release|Win32 {566A2EB9-984C-4027-86DD-EDC7B390C679}.Debug|Win32.ActiveCfg = Debug|Win32 {566A2EB9-984C-4027-86DD-EDC7B390C679}.Debug|Win32.Build.0 = Debug|Win32 {566A2EB9-984C-4027-86DD-EDC7B390C679}.Release|Win32.ActiveCfg = Release|Win32 {566A2EB9-984C-4027-86DD-EDC7B390C679}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal gst-plugins-good-0.10.31/win32/vs8/libgstspeex.vcproj0000644000175000017500000001217511671175355017260 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstpng.vcproj0000644000175000017500000001206611671175355016717 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstapetag.vcproj0000644000175000017500000001177111671175355017376 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstrtp.vcproj0000644000175000017500000001576111671175355016745 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstalaw.vcproj0000644000175000017500000001206111671175355017052 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstalphacolor.vcproj0000644000175000017500000001166611671175355020264 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgsttaglib.vcproj0000644000175000017500000001211011671175355017363 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstgoom.vcproj0000644000175000017500000001227311671175355017074 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstflxdec.vcproj0000644000175000017500000001175711671175355017406 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstvideoflip.vcproj0000644000175000017500000001174311671175355020115 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstmultipart.vcproj0000644000175000017500000001212611671175355020151 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstvideobalance.vcproj0000644000175000017500000001204011671175355020537 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgsticydemux.vcproj0000644000175000017500000001166311671175355017764 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstannodex.vcproj0000644000175000017500000001251011671175355017561 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstdirectsound.vcproj0000644000175000017500000001234611671175355020457 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgsteffectv.vcproj0000644000175000017500000001305311671175355017552 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstladspa.vcproj0000644000175000017500000001221211671175355017370 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstcutter.vcproj0000644000175000017500000001172511671175355017442 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstmng.vcproj0000644000175000017500000001205511671175355016712 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstautodetect.vcproj0000644000175000017500000001154311671175355020273 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstwavenc.vcproj0000644000175000017500000001165311671175355017417 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstrtsp.vcproj0000644000175000017500000001311411671175355017116 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstid3demux.vcproj0000644000175000017500000001231311671175355017650 00000000000000 gst-plugins-good-0.10.31/win32/vs8/libgstauparse.vcproj0000644000175000017500000001165711671175355017600 00000000000000 gst-plugins-good-0.10.31/win32/vs7/0000755000175000017500000000000011720565300013537 500000000000000gst-plugins-good-0.10.31/win32/vs7/libgstdirectsound.vcproj0000644000175000017500000001076211671175355020456 00000000000000 gst-plugins-good-0.10.31/win32/MANIFEST0000644000175000017500000000511111671175355014103 00000000000000win32/MANIFEST win32/common/config.h win32/common/gstudp-enumtypes.c win32/common/gstudp-enumtypes.h win32/vs6/gst_plugins_good.dsw win32/vs6/autogen.dsp win32/vs6/libgstalaw.dsp win32/vs6/libgstalpha.dsp win32/vs6/libgstalphacolor.dsp win32/vs6/libgstapetag.dsp win32/vs6/libgstaudiofx.dsp win32/vs6/libgstauparse.dsp win32/vs6/libgstautodetect.dsp win32/vs6/libgstavi.dsp win32/vs6/libgstcutter.dsp win32/vs6/libgstdirectsound.dsp win32/vs6/libgsteffectv.dsp win32/vs6/libgstflx.dsp win32/vs6/libgstgoom.dsp win32/vs6/libgsticydemux.dsp win32/vs6/libgstid3demux.dsp win32/vs6/libgstinterleave.dsp win32/vs6/libgstjpeg.dsp win32/vs6/libgstlevel.dsp win32/vs6/libgstmatroska.dsp win32/vs6/libgstmedian.dsp win32/vs6/libgstmonoscope.dsp win32/vs6/libgstmulaw.dsp win32/vs6/libgstmultipart.dsp win32/vs6/libgstpng.dsp win32/vs6/libgstqtdemux.dsp win32/vs6/libgstrtp.dsp win32/vs6/libgstrtsp.dsp win32/vs6/libgstsmpte.dsp win32/vs6/libgstspeex.dsp win32/vs6/libgstudp.dsp win32/vs6/libgstvideobalance.dsp win32/vs6/libgstvideobox.dsp win32/vs6/libgstvideocrop.dsp win32/vs6/libgstvideoflip.dsp win32/vs6/libgstvideomixer.dsp win32/vs6/libgstwaveform.dsp win32/vs6/libgstwavenc.dsp win32/vs6/libgstwavparse.dsp win32/vs7/libgstdirectsound.vcproj win32/vs8/gst-plugins-good.sln win32/vs8/libgst1394.vcproj win32/vs8/libgstaasink.vcproj win32/vs8/libgstalaw.vcproj win32/vs8/libgstalpha.vcproj win32/vs8/libgstalphacolor.vcproj win32/vs8/libgstannodex.vcproj win32/vs8/libgstapetag.vcproj win32/vs8/libgstaudiofx.vcproj win32/vs8/libgstauparse.vcproj win32/vs8/libgstautodetect.vcproj win32/vs8/libgstavi.vcproj win32/vs8/libgstcacasink.vcproj win32/vs8/libgstcdio.vcproj win32/vs8/libgstcutter.vcproj win32/vs8/libgstdirectsound.vcproj win32/vs8/libgstdv.vcproj win32/vs8/libgsteffectv.vcproj win32/vs8/libgstflac.vcproj win32/vs8/libgstflxdec.vcproj win32/vs8/libgstgoom.vcproj win32/vs8/libgsticydemux.vcproj win32/vs8/libgstid3demux.vcproj win32/vs8/libgstjpeg.vcproj win32/vs8/libgstladspa.vcproj win32/vs8/libgstlevel.vcproj win32/vs8/libgstmatroska.vcproj win32/vs8/libgstmikmod.vcproj win32/vs8/libgstmng.vcproj win32/vs8/libgstmonoscope.vcproj win32/vs8/libgstmulaw.vcproj win32/vs8/libgstmultipart.vcproj win32/vs8/libgstpng.vcproj win32/vs8/libgstrtp.vcproj win32/vs8/libgstrtsp.vcproj win32/vs8/libgstshout2.vcproj win32/vs8/libgstsmpte.vcproj win32/vs8/libgstspeex.vcproj win32/vs8/libgsttaglib.vcproj win32/vs8/libgstudp.vcproj win32/vs8/libgstvideobalance.vcproj win32/vs8/libgstvideobox.vcproj win32/vs8/libgstvideoflip.vcproj win32/vs8/libgstvideomixer.vcproj win32/vs8/libgstwavenc.vcproj win32/vs8/libgstwavparse.vcproj gst-plugins-good-0.10.31/win32/common/0000755000175000017500000000000011720565300014310 500000000000000gst-plugins-good-0.10.31/win32/common/gstudp-enumtypes.h0000644000175000017500000000045111720563175017746 00000000000000 #ifndef __GST_UDP_ENUM_TYPES_H__ #define __GST_UDP_ENUM_TYPES_H__ #include G_BEGIN_DECLS /* enumerations from "gstudp.h" */ GType gst_udp_control_get_type (void); #define GST_TYPE_UDP_CONTROL (gst_udp_control_get_type()) G_END_DECLS #endif /* __GST_UDP_ENUM_TYPES_H__ */ gst-plugins-good-0.10.31/win32/common/config.h0000644000175000017500000002640111720563176015662 00000000000000/* Autogenerated config.h created for win32 Visual Studio builds */ /* PREFIX -- specifically added for Windows for easier moving */ #define PREFIX "C:\\gstreamer" #define GST_INSTALL_PLUGINS_HELPER PREFIX "\\libexec\\gst-install-plugins-helper.exe" /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Default audio sink */ #define DEFAULT_AUDIOSINK "directsoundsink" /* Default audio source */ #define DEFAULT_AUDIOSRC "audiotestsrc" /* Default video sink */ #undef DEFAULT_VIDEOSINK /* Default video source */ #define DEFAULT_VIDEOSRC "videotestsrc" /* Default visualizer */ #define DEFAULT_VISUALIZER "goom" /* Disable Orc */ #undef DISABLE_ORC /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* gettext package name */ #define GETTEXT_PACKAGE "gst-plugins-good-0.10" /* Defined if gcov is enabled to force a rebuild due to config.h changing */ #undef GST_GCOV_ENABLED /* Default errorlevel to use */ #define GST_LEVEL_DEFAULT GST_LEVEL_ERROR /* GStreamer license */ #define GST_LICENSE "LGPL" /* package name in plugins */ #define GST_PACKAGE_NAME "GStreamer Good Plug-ins source release" /* package origin */ #define GST_PACKAGE_ORIGIN "Unknown package origin" /* GStreamer package release date/time for plugins as YYYY-MM-DD */ #define GST_PACKAGE_RELEASE_DATETIME "2012-02-20" /* struct v4l2_buffer missing */ #undef GST_V4L2_MISSING_BUFDECL /* I know the API is subject to change. */ #undef G_UDEV_API_IS_SUBJECT_TO_CHANGE /* Define to enable aalib ASCII Art library (used by aasink). */ #undef HAVE_AALIB /* Define to enable XML library (used by annodex). */ #undef HAVE_ANNODEX /* Define to 1 if you have the `asinh' function. */ #undef HAVE_ASINH /* Define to enable bz2 library for matroska . */ #undef HAVE_BZ2 /* Define to enable Cairo graphics rendering (used by cairo). */ #undef HAVE_CAIRO /* Define to enable Cairo graphics rendering gobject bindings (used by cairooverlay). */ #undef HAVE_CAIRO_GOBJECT /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if you have the `cosh' function. */ #undef HAVE_COSH /* Define if the host CPU is an Alpha */ #undef HAVE_CPU_ALPHA /* Define if the host CPU is an ARM */ #undef HAVE_CPU_ARM /* Define if the host CPU is a CRIS */ #undef HAVE_CPU_CRIS /* Define if the host CPU is a CRISv32 */ #undef HAVE_CPU_CRISV32 /* Define if the host CPU is a HPPA */ #undef HAVE_CPU_HPPA /* Define if the host CPU is an x86 */ #define HAVE_CPU_I386 1 /* Define if the host CPU is a IA64 */ #undef HAVE_CPU_IA64 /* Define if the host CPU is a M68K */ #undef HAVE_CPU_M68K /* Define if the host CPU is a MIPS */ #undef HAVE_CPU_MIPS /* Define if the host CPU is a PowerPC */ #undef HAVE_CPU_PPC /* Define if the host CPU is a 64 bit PowerPC */ #undef HAVE_CPU_PPC64 /* Define if the host CPU is a S390 */ #undef HAVE_CPU_S390 /* Define if the host CPU is a SPARC */ #undef HAVE_CPU_SPARC /* Define if the host CPU is a x86_64 */ #undef HAVE_CPU_X86_64 /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to enable DirectSound plug-in (used by directsoundsink). */ #undef HAVE_DIRECTSOUND /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* define for working do while(0) macros */ #undef HAVE_DOWHILE_MACROS /* Define to enable raw1394 and avc1394 library (used by 1394). */ #undef HAVE_DV1394 /* Define to enable ESounD sound daemon (used by esdsink). */ #undef HAVE_ESD /* Define to enable building of experimental plug-ins. */ #undef HAVE_EXPERIMENTAL /* Define to enable building of plug-ins with external deps. */ #undef HAVE_EXTERNAL /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* FIONREAD ioctl found in sys/filio.h */ #undef HAVE_FIONREAD_IN_SYS_FILIO /* FIONREAD ioctl found in sys/ioclt.h */ #undef HAVE_FIONREAD_IN_SYS_IOCTL /* Define to enable FLAC lossless audio (used by flac). */ #undef HAVE_FLAC /* Define to 1 if you have the `fpclass' function. */ #undef HAVE_FPCLASS /* Define if compiler supports gcc inline assembly */ #undef HAVE_GCC_ASM /* Define to enable GConf libraries (used by gconfelements). */ #undef HAVE_GCONF /* Define to enable GConf schemas. */ #undef HAVE_GCONFTOOL /* Define to enable GDK pixbuf (used by gdkpixbuf). */ #undef HAVE_GDK_PIXBUF /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to enable Video 4 Linux 2 (used by v4l2src). */ #undef HAVE_GST_V4L2 /* Whether gudev is available for device detection */ #undef HAVE_GUDEV /* Define to enable HAL libraries (used by halelements). */ #undef HAVE_HAL /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if we have struct ip_mreqn */ #undef HAVE_IP_MREQN /* Define to 1 if you have the `isinf' function. */ #undef HAVE_ISINF /* Define to enable Jack (used by jack). */ #undef HAVE_JACK /* defined if jack >= 0.120.1 is available */ #undef HAVE_JACK_0_120_1 /* defined if jack >= 1.9.7 is available */ #undef HAVE_JACK_1_9_7 /* Define to enable jpeg library (used by jpeg). */ #undef HAVE_JPEG /* Define to enable libcaca coloured ASCII art (used by cacasink). */ #undef HAVE_LIBCACA /* Define to enable libdv DV demuxer/decoder (used by dv). */ #undef HAVE_LIBDV /* Define to enable Portable Network Graphics library (used by png). */ #undef HAVE_LIBPNG /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* soup gnome integration */ #undef HAVE_LIBSOUP_GNOME /* Whether libv4l2 is available for video buffer conversion */ #undef HAVE_LIBV4L2 /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Use Orc */ #undef HAVE_ORC /* Define to enable OSS audio (used by ossaudio). */ #undef HAVE_OSS /* Define to enable Open Sound System 4 (used by oss4). */ #undef HAVE_OSS4 /* Define if OSS includes are in /machine/ */ #undef HAVE_OSS_INCLUDE_IN_MACHINE /* Define if OSS includes are in / */ #undef HAVE_OSS_INCLUDE_IN_ROOT /* Define if OSS includes are in /sys/ */ #undef HAVE_OSS_INCLUDE_IN_SYS /* Define to enable OSX audio (used by osxaudio). */ #undef HAVE_OSX_AUDIO /* Define to enable OSX video (used by osxvideosink). */ #undef HAVE_OSX_VIDEO /* Define to 1 if you have the header file. */ #define HAVE_PROCESS_H 1 /* Define to enable pulseaudio plug-in (used by pulseaudio). */ #undef HAVE_PULSE /* defined if pulseaudio >= 0.9.20 is available */ #undef HAVE_PULSE_0_9_20 /* defined if pulseaudio >= 1.0 is available */ #undef HAVE_PULSE_1_0 /* Define if RDTSC is available */ #undef HAVE_RDTSC /* Define to 1 if you have the `rint' function. */ #undef HAVE_RINT /* Define to enable Shoutcast/Icecast client library (used by shout2). */ #undef HAVE_SHOUT2 /* Define to 1 if you have the `sinh' function. */ #undef HAVE_SINH /* Define to enable soup http client plugin (2.4) (used by souphttpsrc). */ #undef HAVE_SOUP /* Define to enable speex speech codec (used by speex). */ #undef HAVE_SPEEX /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to enable Sun Audio (used by sunaudio). */ #undef HAVE_SUNAUDIO /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to enable taglib tagging library (used by taglib). */ #undef HAVE_TAGLIB /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if valgrind should be used */ #undef HAVE_VALGRIND /* Define to enable wavpack plug-in (used by wavpack). */ #undef HAVE_WAVPACK /* Define to 1 if you have the header file. */ #define HAVE_WINSOCK2_H 1 /* Define to enable X libraries and plugins (used by ximagesrc). */ #undef HAVE_X /* Define to enable X Shared Memory extension. */ #undef HAVE_XSHM /* Define to enable X11 XVideo extensions. */ #undef HAVE_XVIDEO /* Define to enable zlib support for qtdemux/matroska. */ #undef HAVE_ZLIB /* the host CPU */ #define HOST_CPU "i686" /* gettext locale dir */ #define LOCALEDIR PREFIX "\\share\\locale" /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #define PACKAGE "gst-plugins-good" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer" /* Define to the full name of this package. */ #define PACKAGE_NAME "GStreamer Good Plug-ins" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "GStreamer Good Plug-ins 0.10.31" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gst-plugins-good" /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #define PACKAGE_VERSION "0.10.31" /* directory where plugins are located */ #ifdef _DEBUG # define PLUGINDIR PREFIX "\\debug\\lib\\gstreamer-0.10" #else # define PLUGINDIR PREFIX "\\lib\\gstreamer-0.10" #endif /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* defined if speex 1.0.x API detected */ #undef SPEEX_1_0 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #define VERSION "0.10.31" /* old wavpack API */ #undef WAVPACK_OLD_API /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING gst-plugins-good-0.10.31/win32/common/gstudp-enumtypes.c0000644000175000017500000000125411720563176017744 00000000000000 #include "gstudp-enumtypes.h" #include "gstudp.h" /* enumerations from "gstudp.h" */ GType gst_udp_control_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if (g_once_init_enter (&g_define_type_id__volatile)) { static const GEnumValue values[] = { {CONTROL_ZERO, "CONTROL_ZERO", "zero"}, {CONTROL_NONE, "CONTROL_NONE", "none"}, {CONTROL_UDP, "CONTROL_UDP", "udp"}, {CONTROL_TCP, "CONTROL_TCP", "tcp"}, {0, NULL, NULL} }; GType g_define_type_id = g_enum_register_static ("GstUDPControl", values); g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); } return g_define_type_id__volatile; } gst-plugins-good-0.10.31/win32/vs6/0000755000175000017500000000000011720565300013536 500000000000000gst-plugins-good-0.10.31/win32/vs6/libgstapetag.dsp0000644000175000017500000001201011671175355016642 00000000000000# Microsoft Developer Studio Project File - Name="libgstapetag" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstapetag - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstapetag.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstapetag.mak" CFG="libgstapetag - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstapetag - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstapetag - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstapetag - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAPETAG_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAPETAG_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstapetag.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstapetag - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAPETAG_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAPETAG_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstapetag.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstapetag - Win32 Release" # Name "libgstapetag - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\apetag\gstapedemux.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\apetag\gstapedemux.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstauparse.dsp0000644000175000017500000001160711671175355017054 00000000000000# Microsoft Developer Studio Project File - Name="libgstauparse" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstauparse - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstauparse.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstauparse.mak" CFG="libgstauparse - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstauparse - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstauparse - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstauparse - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUPARSE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstauparse.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstauparse - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUPARSE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" # Begin Special Build Tool TargetPath=.\Debug\libgstauparse.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstauparse - Win32 Release" # Name "libgstauparse - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\auparse\gstauparse.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\auparse\gstauparse.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstvideocrop.dsp0000644000175000017500000001203511671175355017402 00000000000000# Microsoft Developer Studio Project File - Name="libgstvideocrop" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstvideocrop - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstvideocrop.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstvideocrop.mak" CFG="libgstvideocrop - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstvideocrop - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstvideocrop - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstvideocrop - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOCROP_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOCROP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstvideocrop.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstvideocrop - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOCROP_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOCROP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstvideocrop.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstvideocrop - Win32 Release" # Name "libgstvideocrop - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\videocrop\gstvideocrop.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\videocrop\gstvideocrop.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstalphacolor.dsp0000644000175000017500000001155211671175355017537 00000000000000# Microsoft Developer Studio Project File - Name="libgstalphacolor" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstalphacolor - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstalphacolor.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstalphacolor.mak" CFG="libgstalphacolor - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstalphacolor - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstalphacolor - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstalphacolor - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHACOLOR_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHACOLOR_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstalphacolor.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstalphacolor - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHACOLOR_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHACOLOR_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" # Begin Special Build Tool TargetPath=.\Debug\libgstalphacolor.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstalphacolor - Win32 Release" # Name "libgstalphacolor - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\alpha\gstalphacolor.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstvideobalance.dsp0000644000175000017500000001227011671175355020025 00000000000000# Microsoft Developer Studio Project File - Name="libgstvideobalance" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstvideobalance - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstvideobalance.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstvideobalance.mak" CFG="libgstvideobalance - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstvideobalance - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstvideobalance - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstvideobalance - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBALANCE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBALANCE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstinterfaces-0.10.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstvideobalance.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstvideobalance - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBALANCE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBALANCE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstinterfaces-0.10.lib libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstvideobalance.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstvideobalance - Win32 Release" # Name "libgstvideobalance - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\videofilter\gstvideobalance.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\videofilter\gstvideobalance.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstvideoflip.dsp0000644000175000017500000001211311671175355017366 00000000000000# Microsoft Developer Studio Project File - Name="libgstvideoflip" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstvideoflip - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstvideoflip.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstvideoflip.mak" CFG="libgstvideoflip - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstvideoflip - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstvideoflip - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstvideoflip - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOFLIP_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOFLIP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstvideoflip.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstvideoflip - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOFLIP_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOFLIP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstvideoflip.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstvideoflip - Win32 Release" # Name "libgstvideoflip - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\videofilter\gstvideoflip.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\videofilter\gstvideoflip.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstdirectsound.dsp0000644000175000017500000001253011671175355017733 00000000000000# Microsoft Developer Studio Project File - Name="libgstdirectsound" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstdirectsound - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstdirectsound.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstdirectsound.mak" CFG="libgstdirectsound - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstdirectsound - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstdirectsound - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstdirectsound - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTSOUND_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTSOUND_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstinterfaces-0.10.lib dsound.lib dxerr9.lib user32.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"../../../gst-plugins-base/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstdirectsound.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstdirectsound - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTSOUND_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDIRECTSOUND_EXPORTS" /D "HAVE_CONFIG_H" /FR /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstinterfaces-0.10.lib dsound.lib dxerr9.lib user32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug" # SUBTRACT LINK32 /incremental:no # Begin Special Build Tool TargetPath=.\Debug\libgstdirectsound.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstdirectsound - Win32 Release" # Name "libgstdirectsound - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\sys\directsound\gstdirectsoundplugin.c # End Source File # Begin Source File SOURCE=..\..\sys\directsound\gstdirectsoundsink.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\sys\directsound\gstdirectsoundsink.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstalpha.dsp0000644000175000017500000001173211671175355016500 00000000000000# Microsoft Developer Studio Project File - Name="libgstalpha" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstalpha - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstalpha.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstalpha.mak" CFG="libgstalpha - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstalpha - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstalpha - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstalpha - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHA_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHA_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstvideo-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"../../../gst-plugins-base/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstalpha.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstalpha - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHA_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALPHA_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstvideo-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug" # Begin Special Build Tool TargetPath=.\Debug\libgstalpha.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstalpha - Win32 Release" # Name "libgstalpha - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\alpha\gstalpha.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstvideobox.dsp0000644000175000017500000001172711671175355017236 00000000000000# Microsoft Developer Studio Project File - Name="libgstvideobox" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstvideobox - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstvideobox.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstvideobox.mak" CFG="libgstvideobox - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstvideobox - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstvideobox - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstvideobox - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBOX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBOX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstvideobox.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstvideobox - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBOX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOBOX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 liboil-0.3-0.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstvideobox.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstvideobox - Win32 Release" # Name "libgstvideobox - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\videobox\gstvideobox.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstspeex.dsp0000644000175000017500000001237411671175355016542 00000000000000# Microsoft Developer Studio Project File - Name="libgstspeex" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstspeex - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstspeex.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstspeex.mak" CFG="libgstspeex - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstspeex - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstspeex - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstspeex - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSPEEX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSPEEX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgsttag-0.10.lib libspeex.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstspeex.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstspeex - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSPEEX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSPEEX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgsttag-0.10.lib libspeex.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstspeex.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstspeex - Win32 Release" # Name "libgstspeex - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\ext\speex\gstspeex.c # End Source File # Begin Source File SOURCE=..\..\ext\speex\gstspeexdec.c # End Source File # Begin Source File SOURCE=..\..\ext\speex\gstspeexenc.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\ext\speex\gstspeexdec.h # End Source File # Begin Source File SOURCE=..\..\ext\speex\gstspeexenc.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstautodetect.dsp0000644000175000017500000001243211671175355017552 00000000000000# Microsoft Developer Studio Project File - Name="libgstautodetect" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstautodetect - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstautodetect.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstautodetect.mak" CFG="libgstautodetect - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstautodetect - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstautodetect - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstautodetect - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUTODETECT_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/audio" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUTODETECT_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstautodetect.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstautodetect - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUTODETECT_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../gst-libs/gst/audio" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUTODETECT_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" # Begin Special Build Tool TargetPath=.\Debug\libgstautodetect.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstautodetect - Win32 Release" # Name "libgstautodetect - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\autodetect\gstautoaudiosink.c # End Source File # Begin Source File SOURCE=..\..\gst\autodetect\gstautodetect.c # End Source File # Begin Source File SOURCE=..\..\gst\autodetect\gstautovideosink.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\autodetect\gstautoaudiosink.h # End Source File # Begin Source File SOURCE=..\..\gst\autodetect\gstautodetect.h # End Source File # Begin Source File SOURCE=..\..\gst\autodetect\gstautovideosink.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstflx.dsp0000644000175000017500000001220711671175355016202 00000000000000# Microsoft Developer Studio Project File - Name="libgstflx" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstflx - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstflx.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstflx.mak" CFG="libgstflx - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstflx - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstflx - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstflx - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTFLX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTFLX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstflx.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstflx - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTFLX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTFLX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstflx.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstflx - Win32 Release" # Name "libgstflx - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\flx\flx_color.c # End Source File # Begin Source File SOURCE=..\..\gst\flx\gstflxdec.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\flx\flx_color.h # End Source File # Begin Source File SOURCE=..\..\gst\flx\flx_fmt.h # End Source File # Begin Source File SOURCE=..\..\gst\flx\gstflxdec.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstwavenc.dsp0000644000175000017500000001212011671175355016666 00000000000000# Microsoft Developer Studio Project File - Name="libgstwavenc" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstwavenc - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstwavenc.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstwavenc.mak" CFG="libgstwavenc - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstwavenc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstwavenc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstwavenc - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVENC_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVENC_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstwavenc.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstwavenc - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVENC_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVENC_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstwavenc.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstwavenc - Win32 Release" # Name "libgstwavenc - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\wavenc\gstwavenc.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\wavenc\gstwavenc.h # End Source File # Begin Source File SOURCE=..\..\gst\wavenc\riff.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstrtsp.dsp0000644000175000017500000001417011671175355016402 00000000000000# Microsoft Developer Studio Project File - Name="libgstrtsp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstrtsp - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstrtsp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstrtsp.mak" CFG="libgstrtsp - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstrtsp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstrtsp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstrtsp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTSP_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/rtsp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTSP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib ws2_32.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgstrtsp-0.10.lib libgstsdp-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstrtsp.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstrtsp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTSP_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/rtsp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTSP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib ws2_32.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgstrtsp-0.10.lib libgstsdp-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstrtsp.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstrtsp - Win32 Release" # Name "libgstrtsp - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\rtsp\gstrtpdec.c # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\gstrtsp.c # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\gstrtspext.c # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\gstrtspsrc.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\rtsp\gstrtpdec.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\gstrtsp.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\gstrtspsrc.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\rtsp.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\rtspconnection.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\rtspdefs.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\rtspmessage.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\rtsptransport.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\rtspurl.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\sdp.h # End Source File # Begin Source File SOURCE=..\..\gst\rtsp\sdpmessage.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstaudiofx.dsp0000644000175000017500000001323511671175355017052 00000000000000# Microsoft Developer Studio Project File - Name="libgstaudiofx" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstaudiofx - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstaudiofx.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstaudiofx.mak" CFG="libgstaudiofx - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstaudiofx - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstaudiofx - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstaudiofx - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOFX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOFX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstaudio-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstaudiofx.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstaudiofx - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOFX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAUDIOFX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib libgstaudio-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstaudiofx.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstaudiofx - Win32 Release" # Name "libgstaudiofx - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\audiofx\audioamplify.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiochebband.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiocheblimit.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiodynamic.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiofx.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audioinvert.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiopanorama.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiowsincband.c # End Source File # Begin Source File SOURCE=..\..\gst\audiofx\audiowsinclimit.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstavi.dsp0000644000175000017500000001244711671175355016176 00000000000000# Microsoft Developer Studio Project File - Name="libgstavi" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstavi - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstavi.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstavi.mak" CFG="libgstavi - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstavi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstavi - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstavi - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAVI_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAVI_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # SUBTRACT LINK32 /incremental:yes # Begin Special Build Tool TargetPath=.\Release\libgstavi.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstavi - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAVI_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTAVI_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstavi.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstavi - Win32 Release" # Name "libgstavi - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\avi\gstavi.c # End Source File # Begin Source File SOURCE=..\..\gst\avi\gstavidemux.c # End Source File # Begin Source File SOURCE=..\..\gst\avi\gstavimux.c # End Source File # Begin Source File SOURCE=..\..\gst\avi\gstavisubtitle.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\gst\avi\avi-ids.h" # End Source File # Begin Source File SOURCE=..\..\gst\avi\gstavidemux.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgsticydemux.dsp0000644000175000017500000001205611671175355017242 00000000000000# Microsoft Developer Studio Project File - Name="libgsticydemux" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgsticydemux - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgsticydemux.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgsticydemux.mak" CFG="libgsticydemux - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgsticydemux - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgsticydemux - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgsticydemux - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTICYDEMUX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTICYDEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgsticydemux.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgsticydemux - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTICYDEMUX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTICYDEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgsticydemux.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgsticydemux - Win32 Release" # Name "libgsticydemux - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\icydemux\gsticydemux.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\icydemux\gsticydemux.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstmultipart.dsp0000644000175000017500000001216111671175355017431 00000000000000# Microsoft Developer Studio Project File - Name="libgstmultipart" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstmultipart - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstmultipart.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstmultipart.mak" CFG="libgstmultipart - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstmultipart - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstmultipart - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstmultipart - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULTIPART_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULTIPART_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstmultipart.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstmultipart - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULTIPART_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULTIPART_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstmultipart.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstmultipart - Win32 Release" # Name "libgstmultipart - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\multipart\multipart.c # End Source File # Begin Source File SOURCE=..\..\gst\multipart\multipartdemux.c # End Source File # Begin Source File SOURCE=..\..\gst\multipart\multipartmux.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstmedian.dsp0000644000175000017500000001173611671175355016654 00000000000000# Microsoft Developer Studio Project File - Name="libgstmedian" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstmedian - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstmedian.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstmedian.mak" CFG="libgstmedian - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstmedian - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstmedian - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstmedian - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMEDIAN_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMEDIAN_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstmedian.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstmedian - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMEDIAN_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMEDIAN_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstmedian.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstmedian - Win32 Release" # Name "libgstmedian - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\median\gstmedian.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\median\gstmedian.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstvideomixer.dsp0000644000175000017500000001201411671175355017560 00000000000000# Microsoft Developer Studio Project File - Name="libgstvideomixer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstvideomixer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstvideomixer.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstvideomixer.mak" CFG="libgstvideomixer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstvideomixer - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstvideomixer - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstvideomixer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOMIXER_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOMIXER_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstvideomixer.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstvideomixer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOMIXER_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTVIDEOMIXER_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstcontroller-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstvideomixer.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstvideomixer - Win32 Release" # Name "libgstvideomixer - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\videomixer\videomixer.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgsteffectv.dsp0000644000175000017500000001322711671175355017036 00000000000000# Microsoft Developer Studio Project File - Name="libgsteffectv" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgsteffectv - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgsteffectv.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgsteffectv.mak" CFG="libgsteffectv - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgsteffectv - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgsteffectv - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgsteffectv - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTEFFECTV_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTEFFECTV_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgsteffectv.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgsteffectv - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTEFFECTV_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTEFFECTV_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgsteffectv.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgsteffectv - Win32 Release" # Name "libgsteffectv - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\effectv\gstaging.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstdice.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstedge.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gsteffectv.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstquark.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstrev.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstshagadelic.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstvertigo.c # End Source File # Begin Source File SOURCE=..\..\gst\effectv\gstwarp.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\effectv\gsteffectv.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstwaveform.dsp0000644000175000017500000001226111671175355017237 00000000000000# Microsoft Developer Studio Project File - Name="libgstwaveform" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstwaveform - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstwaveform.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstwaveform.mak" CFG="libgstwaveform - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstwaveform - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstwaveform - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstwaveform - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVEFORM_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "../.." /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVEFORM_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib Winmm.lib libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"../../../gst-plugins-base/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstwaveform.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstwaveform - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVEFORM_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVEFORM_EXPORTS" /D "HAVE_CONFIG_H" /FR /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib Winmm.lib libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug" # SUBTRACT LINK32 /incremental:no # Begin Special Build Tool TargetPath=.\Debug\libgstwaveform.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstwaveform - Win32 Release" # Name "libgstwaveform - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\sys\waveform\gstwaveformplugin.c # End Source File # Begin Source File SOURCE=..\..\sys\waveform\gstwaveformsink.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\sys\waveform\gstwaveformsink.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstmatroska.dsp0000644000175000017500000001362411671175355017236 00000000000000# Microsoft Developer Studio Project File - Name="libgstmatroska" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstmatroska - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstmatroska.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstmatroska.mak" CFG="libgstmatroska - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstmatroska - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstmatroska - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstmatroska - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMATROSKA_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMATROSKA_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib zlib.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstmatroska.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstmatroska - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMATROSKA_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMATROSKA_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib zlib.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstmatroska.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstmatroska - Win32 Release" # Name "libgstmatroska - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\gst\matroska\ebml-read.c" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\ebml-write.c" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\matroska-demux.c" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\matroska-ids.c" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\matroska-mux.c" # End Source File # Begin Source File SOURCE=..\..\gst\matroska\matroska.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\gst\matroska\ebml-ids.h" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\ebml-read.h" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\ebml-write.h" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\matroska-demux.h" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\matroska-ids.h" # End Source File # Begin Source File SOURCE="..\..\gst\matroska\matroska-mux.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstmonoscope.dsp0000644000175000017500000001241611671175355017415 00000000000000# Microsoft Developer Studio Project File - Name="libgstmonoscope" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstmonoscope - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstmonoscope.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstmonoscope.mak" CFG="libgstmonoscope - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstmonoscope - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstmonoscope - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstmonoscope - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMONOSCOPE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMONOSCOPE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstmonoscope.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstmonoscope - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMONOSCOPE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMONOSCOPE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstmonoscope.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstmonoscope - Win32 Release" # Name "libgstmonoscope - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\monoscope\convolve.c # End Source File # Begin Source File SOURCE=..\..\gst\monoscope\gstmonoscope.c # End Source File # Begin Source File SOURCE=..\..\gst\monoscope\monoscope.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\monoscope\convolve.h # End Source File # Begin Source File SOURCE=..\..\gst\monoscope\monoscope.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstcutter.dsp0000644000175000017500000001201011671175355016707 00000000000000# Microsoft Developer Studio Project File - Name="libgstcutter" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstcutter - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstcutter.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstcutter.mak" CFG="libgstcutter - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstcutter - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstcutter - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstcutter - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCUTTER_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCUTTER_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstcutter.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstcutter - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCUTTER_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCUTTER_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstaudio-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstcutter.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstcutter - Win32 Release" # Name "libgstcutter - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\cutter\gstcutter.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\cutter\gstcutter.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstudp.dsp0000644000175000017500000001423511671175355016204 00000000000000# Microsoft Developer Studio Project File - Name="libgstudp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstudp - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstudp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstudp.mak" CFG="libgstudp - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstudp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstudp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstudp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTUDP_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/udp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTUDP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstnetbuffer-0.10.lib Ws2_32.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstudp.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstudp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTUDP_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/udp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTUDP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstnetbuffer-0.10.lib Ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstudp.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstudp - Win32 Release" # Name "libgstudp - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\udp\gstdynudpsink.c # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstmultiudpsink.c # End Source File # Begin Source File SOURCE="..\..\gst\udp\gstudp-enumtypes.c" # End Source File # Begin Source File SOURCE="..\..\gst\udp\gstudp-marshal.c" # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudp.c # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudpnetutils.c # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudpsink.c # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudpsrc.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\udp\gstdynudpsink.h # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstmultiudpsink.h # End Source File # Begin Source File SOURCE="..\..\gst\udp\gstudp-enumtypes.h" # End Source File # Begin Source File SOURCE="..\..\gst\udp\gstudp-marshal.h" # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudp.h # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudpnetutils.h # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudpsink.h # End Source File # Begin Source File SOURCE=..\..\gst\udp\gstudpsrc.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstinterleave.dsp0000644000175000017500000001236411671175355017553 00000000000000# Microsoft Developer Studio Project File - Name="libgstinterleave" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstinterleave - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstinterleave.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstinterleave.mak" CFG="libgstinterleave - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstinterleave - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstinterleave - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstinterleave - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTINTERLEAVE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTINTERLEAVE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstinterleave.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstinterleave - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTINTERLEAVE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTINTERLEAVE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstinterleave.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstinterleave - Win32 Release" # Name "libgstinterleave - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\interleave\deinterleave.c # End Source File # Begin Source File SOURCE=..\..\gst\interleave\interleave.c # End Source File # Begin Source File SOURCE=..\..\gst\interleave\plugin.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\interleave\plugin.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstrtp.dsp0000644000175000017500000002332211671175355016216 00000000000000# Microsoft Developer Studio Project File - Name="libgstrtp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstrtp - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstrtp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstrtp.mak" CFG="libgstrtp - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstrtp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstrtp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstrtp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTP_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../gst/rtsp" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTP_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib Ws2_32.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstrtp.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstrtp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTP_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../gst/rtsp" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTRTP_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib Ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstrtp.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstrtp - Win32 Release" # Name "libgstrtp - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\rtp\fnv1hash.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstasteriskh263.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtp.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpac3depay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpamrdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpamrpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpgsmdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpgsmpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263depay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263pay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263pdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263ppay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph264depay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph264pay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpilbcdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpilbcpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpL16depay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpL16pay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp2tdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp2tpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4adepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4gdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4gpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4vdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4vpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmpadepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmpapay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmpvdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmpvpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmadepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmapay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmudepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmupay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpspeexdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpspeexpay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpsv3vdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtptheoradepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtptheorapay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpvorbisdepay.c # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpvorbispay.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\rtp\gstasteriskh263.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpamrdepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpamrpay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpdepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpgsmdepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpgsmpay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263pay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263pdepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtph263ppay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4gpay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4vdepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmp4vpay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmpadepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpmpapay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmadepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmapay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmudepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtppcmupay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpspeexdepay.h # End Source File # Begin Source File SOURCE=..\..\gst\rtp\gstrtpspeexpay.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstsmpte.dsp0000644000175000017500000001250511671175355016542 00000000000000# Microsoft Developer Studio Project File - Name="libgstsmpte" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstsmpte - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstsmpte.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstsmpte.mak" CFG="libgstsmpte - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstsmpte - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstsmpte - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstsmpte - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSMPTE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSMPTE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstsmpte.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstsmpte - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSMPTE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTSMPTE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstsmpte.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstsmpte - Win32 Release" # Name "libgstsmpte - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\smpte\barboxwipes.c # End Source File # Begin Source File SOURCE=..\..\gst\smpte\gstmask.c # End Source File # Begin Source File SOURCE=..\..\gst\smpte\gstsmpte.c # End Source File # Begin Source File SOURCE=..\..\gst\smpte\paint.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\smpte\gstmask.h # End Source File # Begin Source File SOURCE=..\..\gst\smpte\gstsmpte.h # End Source File # Begin Source File SOURCE=..\..\gst\smpte\paint.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstalaw.dsp0000644000175000017500000001231311671175355016333 00000000000000# Microsoft Developer Studio Project File - Name="libgstalaw" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstalaw - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstalaw.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstalaw.mak" CFG="libgstalaw - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstalaw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstalaw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstalaw - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALAW_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstalaw.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstalaw - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALAW_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTALAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstalaw.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstalaw - Win32 Release" # Name "libgstalaw - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\gst\law\alaw-decode.c" # End Source File # Begin Source File SOURCE="..\..\gst\law\alaw-encode.c" # End Source File # Begin Source File SOURCE=..\..\gst\law\alaw.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\gst\law\alaw-decode.h" # End Source File # Begin Source File SOURCE="..\..\gst\law\alaw-encode.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstmulaw.dsp0000644000175000017500000001261311671175355016537 00000000000000# Microsoft Developer Studio Project File - Name="libgstmulaw" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstmulaw - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstmulaw.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstmulaw.mak" CFG="libgstmulaw - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstmulaw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstmulaw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstmulaw - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULAW_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstmulaw.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstmulaw - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULAW_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTMULAW_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstmulaw.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstmulaw - Win32 Release" # Name "libgstmulaw - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\gst\law\mulaw-conversion.c" # End Source File # Begin Source File SOURCE="..\..\gst\law\mulaw-decode.c" # End Source File # Begin Source File SOURCE="..\..\gst\law\mulaw-encode.c" # End Source File # Begin Source File SOURCE=..\..\gst\law\mulaw.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\gst\law\mulaw-conversion.h" # End Source File # Begin Source File SOURCE="..\..\gst\law\mulaw-decode.h" # End Source File # Begin Source File SOURCE="..\..\gst\law\mulaw-encode.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstwavparse.dsp0000644000175000017500000001206011671175355017236 00000000000000# Microsoft Developer Studio Project File - Name="libgstwavparse" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstwavparse - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstwavparse.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstwavparse.mak" CFG="libgstwavparse - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstwavparse - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstwavparse - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstwavparse - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVPARSE_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstwavparse.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstwavparse - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVPARSE_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTWAVPARSE_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstriff-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstwavparse.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstwavparse - Win32 Release" # Name "libgstwavparse - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\wavparse\gstwavparse.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\wavparse\gstwavparse.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstpng.dsp0000644000175000017500000001236711671175355016204 00000000000000# Microsoft Developer Studio Project File - Name="libgstpng" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstpng - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstpng.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstpng.mak" CFG="libgstpng - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstpng - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstpng - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstpng - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPNG_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPNG_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libpng.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstpng.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstpng - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPNG_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTPNG_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libpng.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstpng.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstpng - Win32 Release" # Name "libgstpng - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\ext\libpng\gstpng.c # End Source File # Begin Source File SOURCE=..\..\ext\libpng\gstpngdec.c # End Source File # Begin Source File SOURCE=..\..\ext\libpng\gstpngenc.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\ext\libpng\gstpng.h # End Source File # Begin Source File SOURCE=..\..\ext\libpng\gstpngdec.h # End Source File # Begin Source File SOURCE=..\..\ext\libpng\gstpngenc.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstid3demux.dsp0000644000175000017500000001252711671175355017140 00000000000000# Microsoft Developer Studio Project File - Name="libgstid3demux" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstid3demux - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstid3demux.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstid3demux.mak" CFG="libgstid3demux - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstid3demux - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstid3demux - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstid3demux - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTID3DEMUX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTID3DEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib glib-2.0.lib gobject-2.0.lib zlib.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstid3demux.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstid3demux - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTID3DEMUX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTID3DEMUX_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgsttag-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgsttag-0.10.lib glib-2.0D.lib gobject-2.0D.lib zlib.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstid3demux.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstid3demux - Win32 Release" # Name "libgstid3demux - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\id3demux\gstid3demux.c # End Source File # Begin Source File SOURCE=..\..\gst\id3demux\id3tags.c # End Source File # Begin Source File SOURCE=..\..\gst\id3demux\id3v2frames.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\id3demux\gstid3demux.h # End Source File # Begin Source File SOURCE=..\..\gst\id3demux\id3tags.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstgoom.dsp0000644000175000017500000001320411671175355016350 00000000000000# Microsoft Developer Studio Project File - Name="libgstgoom" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstgoom - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstgoom.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstgoom.mak" CFG="libgstgoom - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstgoom - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstgoom - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstgoom - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTGOOM_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTGOOM_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstgoom.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstgoom - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTGOOM_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTGOOM_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstvideo-0.10.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstgoom.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstgoom - Win32 Release" # Name "libgstgoom - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\goom\filters.c # End Source File # Begin Source File SOURCE=..\..\gst\goom\goom_core.c # End Source File # Begin Source File SOURCE=..\..\gst\goom\graphic.c # End Source File # Begin Source File SOURCE=..\..\gst\goom\gstgoom.c # End Source File # Begin Source File SOURCE=..\..\gst\goom\lines.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\goom\filters.h # End Source File # Begin Source File SOURCE=..\..\gst\goom\goom_core.h # End Source File # Begin Source File SOURCE=..\..\gst\goom\goom_tools.h # End Source File # Begin Source File SOURCE=..\..\gst\goom\graphic.h # End Source File # Begin Source File SOURCE=..\..\gst\goom\gstgoom.h # End Source File # Begin Source File SOURCE=..\..\gst\goom\lines.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/autogen.dsp0000644000175000017500000001071211671175355015645 00000000000000# Microsoft Developer Studio Project File - Name="autogen" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Generic Project" 0x010a CFG=autogen - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "autogen.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "autogen.mak" CFG="autogen - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "autogen - Win32 Release" (based on "Win32 (x86) Generic Project") !MESSAGE "autogen - Win32 Debug" (based on "Win32 (x86) Generic Project") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" MTL=midl.exe !IF "$(CFG)" == "autogen - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "autogen - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" !ENDIF # Begin Target # Name "autogen - Win32 Release" # Name "autogen - Win32 Debug" # Begin Source File SOURCE="..\..\gst\playback\gstplay-marshal.list" !IF "$(CFG)" == "autogen - Win32 Release" # Begin Custom Build InputPath="..\..\gst\playback\gstplay-marshal.list" BuildCmds= \ echo #include "glib-object.h" > gstudp-marshal.c.tmp \ echo #include "gstudp-marshal.h" >> gstudp-marshal.c.tmp \ glib-genmarshal --body --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.c.tmp \ move gstudp-marshal.c.tmp ..\..\gst\udp\gstudp-marshal.c \ echo #include "gst/gstconfig.h" > gstudp-marshal.h.tmp \ glib-genmarshal --header --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.h.tmp \ move gstudp-marshal.h.tmp ..\..\gst\udp\gstudp-marshal.h \ "..\..\gst\udp\gstudp-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "..\..\gst\udp\gstudp-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "autogen - Win32 Debug" # Begin Custom Build InputPath="..\..\gst\playback\gstplay-marshal.list" BuildCmds= \ echo #include "glib-object.h" > gstudp-marshal.c.tmp \ echo #include "gstudp-marshal.h" >> gstudp-marshal.c.tmp \ glib-genmarshal --body --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.c.tmp \ move gstudp-marshal.c.tmp ..\..\gst\udp\gstudp-marshal.c \ echo #include "gst/gstconfig.h" > gstudp-marshal.h.tmp \ glib-genmarshal --header --prefix=gst_udp_marshal ..\..\gst\udp\gstudp-marshal.list >> gstudp-marshal.h.tmp \ move gstudp-marshal.h.tmp ..\..\gst\udp\gstudp-marshal.h \ "..\..\gst\udp\gstudp-marshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "..\..\gst\udp\gstudp-marshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE="..\common\gstudp-enumtypes.c" !IF "$(CFG)" == "autogen - Win32 Release" # Begin Custom Build InputPath="..\common\gstudp-enumtypes.c" BuildCmds= \ copy /y ..\common\gstudp-enumtypes.c ..\..\gst\udp\gstudp-enumtypes.c \ copy /y ..\common\gstudp-enumtypes.h ..\..\gst\udp\gstudp-enumtypes.h \ "..\..\gst\udp\gstudp-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "..\..\gst\udp\gstudp-enumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "autogen - Win32 Debug" # Begin Custom Build InputPath="..\common\gstudp-enumtypes.c" "..\..\gst\udp\gstudp-enumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" copy /y ..\common\gstudp-enumtypes.c ..\..\gst\udp\gstudp-enumtypes.c copy /y ..\common\gstudp-enumtypes.h ..\..\gst\udp\gstudp-enumtypes.h # End Custom Build !ENDIF # End Source File # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/gst_plugins_good.dsw0000644000175000017500000002134211671175355017561 00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "autogen"=".\autogen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstalaw"=".\libgstalaw.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstalpha"=".\libgstalpha.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstalphacolor"=".\libgstalphacolor.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstapetag"=".\libgstapetag.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstaudiofx"=".\libgstaudiofx.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstauparse"=".\libgstauparse.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstautodetect"=".\libgstautodetect.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstavi"=".\libgstavi.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstcutter"=".\libgstcutter.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstdebug"=".\libgstdebug.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstdirectdraw"=".\libgstdirectdraw.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstdirectsound"=".\libgstdirectsound.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstdvdemux"=".\libgstdvdemux.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgsteffectv"=".\libgsteffectv.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstflx"=".\libgstflx.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstgoom"=".\libgstgoom.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgsticydemux"=".\libgsticydemux.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstid3demux"=".\libgstid3demux.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstinterleave"=".\libgstinterleave.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstjpeg"=".\libgstjpeg.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstlevel"=".\libgstlevel.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstmatroska"=".\libgstmatroska.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstmedian"=".\libgstmedian.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstmonoscope"=".\libgstmonoscope.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstmulaw"=".\libgstmulaw.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstmultipart"=".\libgstmultipart.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstpng"=".\libgstpng.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstqtdemux"=".\libgstqtdemux.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstrtp"=".\libgstrtp.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstrtsp"=".\libgstrtsp.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstsmpte"=".\libgstsmpte.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstspeex"=".\libgstspeex.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstudp"=".\libgstudp.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name autogen End Project Dependency }}} ############################################################################### Project: "libgstvideobalance"=".\libgstvideobalance.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstvideobox"=".\libgstvideobox.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstvideocrop"=".\libgstvideocrop.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstvideoflip"=".\libgstvideoflip.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstvideomixer"=".\libgstvideomixer.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstwaveform"=".\libgstwaveform.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstwavenc"=".\libgstwavenc.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libgstwavparse"=".\libgstwavparse.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gst-plugins-good-0.10.31/win32/vs6/libgstjpeg.dsp0000644000175000017500000001334011671175355016335 00000000000000# Microsoft Developer Studio Project File - Name="libgstjpeg" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstjpeg - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstjpeg.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstjpeg.mak" CFG="libgstjpeg - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstjpeg - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstjpeg - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstjpeg - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTJPEG_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTJPEG_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libjpeg.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstjpeg.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstjpeg - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTJPEG_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTJPEG_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libjpeg.lib libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstjpeg.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstjpeg - Win32 Release" # Name "libgstjpeg - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\ext\jpeg\gstjpeg.c # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstjpegdec.c # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstjpegenc.c # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstsmokedec.c # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstsmokeenc.c # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\smokecodec.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\ext\jpeg\gstjpegdec.h # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstjpegenc.h # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstsmokedec.h # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\gstsmokeenc.h # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\smokecodec.h # End Source File # Begin Source File SOURCE=..\..\ext\jpeg\smokeformat.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstlevel.dsp0000644000175000017500000001171111671175355016517 00000000000000# Microsoft Developer Studio Project File - Name="libgstlevel" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstlevel - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstlevel.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstlevel.mak" CFG="libgstlevel - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstlevel - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstlevel - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstlevel - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTLEVEL_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "./" /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTLEVEL_EXPORTS" /D "HAVE_CONFIG_H" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0.lib gobject-2.0.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"./release" /libpath:"../../../gst-plugins-base/win32/vs6/release" # Begin Special Build Tool TargetPath=.\Release\libgstlevel.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstlevel - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTLEVEL_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTLEVEL_EXPORTS" /D "HAVE_CONFIG_H" /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 libgstreamer-0.10.lib libgstbase-0.10.lib glib-2.0D.lib gobject-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"./debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" # Begin Special Build Tool TargetPath=.\Debug\libgstlevel.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstlevel - Win32 Release" # Name "libgstlevel - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\level\gstlevel.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\level\gstlevel.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/win32/vs6/libgstqtdemux.dsp0000644000175000017500000001306111671175355017077 00000000000000# Microsoft Developer Studio Project File - Name="libgstqtdemux" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libgstqtdemux - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "libgstqtdemux.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "libgstqtdemux.mak" CFG="libgstqtdemux - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "libgstqtdemux - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "libgstqtdemux - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libgstqtdemux - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTQTDEMUX_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/qtdemux" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTQTDEMUX_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 glib-2.0.lib gobject-2.0.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib zlib.lib /nologo /dll /machine:I386 /libpath:"../../../gstreamer/win32/vs6/release" /libpath:"../../../gst-plugins-base/win32/vs6/release" /libpath:"./release" # Begin Special Build Tool TargetPath=.\Release\libgstqtdemux.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10 # End Special Build Tool !ELSEIF "$(CFG)" == "libgstqtdemux - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTQTDEMUX_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../gst-libs" /I "../../../gstreamer" /I "../common" /I "../../../gstreamer/libs" /I "../../../gst-plugins-base/gst-libs" /I "../../../gst-plugins-good/gst/qtdemux" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTQTDEMUX_EXPORTS" /D "HAVE_CONFIG_H" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 glib-2.0D.lib gobject-2.0D.lib libgstreamer-0.10.lib libgstbase-0.10.lib libgstrtp-0.10.lib libgsttag-0.10.lib zlib.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"../../../gstreamer/win32/vs6/debug" /libpath:"../../../gst-plugins-base/win32/vs6/debug" /libpath:"./debug" # Begin Special Build Tool TargetPath=.\Debug\libgstqtdemux.dll SOURCE="$(InputPath)" PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10 # End Special Build Tool !ENDIF # Begin Target # Name "libgstqtdemux - Win32 Release" # Name "libgstqtdemux - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\gst\qtdemux\gstrtpxqtdepay.c # SUBTRACT CPP /YX # End Source File # Begin Source File SOURCE=..\..\gst\qtdemux\qtdemux.c # SUBTRACT CPP /YX # End Source File # Begin Source File SOURCE=..\..\gst\qtdemux\qtdemux_dump.c # SUBTRACT CPP /YX # End Source File # Begin Source File SOURCE=..\..\gst\qtdemux\qtdemux_types.c # SUBTRACT CPP /YX # End Source File # Begin Source File SOURCE=..\..\gst\qtdemux\quicktime.c # SUBTRACT CPP /YX # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\gst\qtdemux\qtdemux.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gst-plugins-good-0.10.31/missing0000755000175000017500000002415211720560223013400 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gst-plugins-good-0.10.31/docs/0000755000175000017500000000000011720565324013014 500000000000000gst-plugins-good-0.10.31/docs/version.entities.in0000644000175000017500000000011611671175352016575 00000000000000 gst-plugins-good-0.10.31/docs/Makefile.am0000644000175000017500000000047111671175352014775 00000000000000if ENABLE_PLUGIN_DOCS PLUGIN_DOCS_DIRS = plugins else PLUGIN_DOCS_DIRS = endif SUBDIRS = $(PLUGIN_DOCS_DIRS) DIST_SUBDIRS = plugins EXTRA_DIST = \ random/ChangeLog-0.8 \ version.entities.in upload: @if test "x$(SUBDIRS)" != x; then for a in $(SUBDIRS); do cd $$a; make upload; cd ..; done; fi gst-plugins-good-0.10.31/docs/random/0000755000175000017500000000000011720565324014274 500000000000000gst-plugins-good-0.10.31/docs/random/ChangeLog-0.80000644000175000017500000237302311671175352016306 000000000000002005-08-28 Andy Wingo * Updates for two-arg init from GST_BOILERPLATE. * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): Use the second arg for the class, because G_OBJECT_GET_CLASS (self) returns the wrong thing. (gst_signal_processor_add_pad_from_template): Make pads of the right type. * ext/ladspa/gstladspa.c (gst_ladspa_class_get_param_spec): Make writable param specs G_PARAM_CONSTRUCT so default values work. (gst_ladspa_init): Use the second arg for the class. 2005-08-26 Andy Wingo * ext/ladspa/gstladspa.c: * ext/ladspa/gstladspa.h: Finish porting, still doesn't work but it does compile and register. I have more features than you. * ext/ladspa/gstsignalprocessor.h: * ext/ladspa/gstsignalprocessor.c: Updates, bug fixen. 2005-08-26 Thomas Vander Stichele * gst/effectv/gstquark.c: (gst_quarktv_init), (gst_quarktv_change_state): do proper cleanup/creation, fixes state changes 2005-08-25 Jan Schmidt * gst/level/gstlevel.c: (gst_level_message_new): Revert unpopular change for GST_MESSAGE_SRC to GObject. 2005-08-25 Andy Wingo * ext/ladspa/gstladspa.h: * ext/ladspa/gstladspa.c: Halfway-ported. Doesn't compile yet. * ext/ladspa/gstsignalprocessor.h: * ext/ladspa/gstsignalprocessor.c: New files, the start of a base class for DSP elements. * configure.ac: Sort the external libs checks, add a ladspa check, output the ladspa makefile. 2005-08-25 Owen Fraser-Green * gst/realmedia/rmdemux.c (gst_rmdemux_loop, gst_rmdemux_chain): Fixed EOS. (gst_rmdemux_parse_indx_data, gst_rmdemux_parse_indx): Handle malformed index headers where the packet size is incorrect. 2005-08-24 Andy Wingo * ext/dv/gstdvdemux.c (gst_dvdemux_demux_frame): Send out valid segment end timestamps. 2005-08-24 Thomas Vander Stichele * configure.ac: * ext/Makefile.am: lame and mpegaudioparse seem to work * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_transform_caps), (gst_video_box_get_unit_size): update for basetransform changes 2005-08-24 Jan Schmidt * gst/level/gstlevel.c: (gst_level_message_new): GST_MESSAGE_SRC became a GObject 2005-08-23 Stefan Kost * ext/speex/gstspeexenc.h: Fixed include path of adapter 2005-08-23 Wim Taymans * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): Fix property warning. 2005-08-23 Wim Taymans * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), (gst_rtpamrenc_init), (gst_rtpamrenc_chain): * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), (gst_rtph263penc_flush), (gst_rtph263penc_chain): Small updates, RFC reference to payload encoders. 2005-08-23 Ronald S. Bultje * configure.ac: * ext/Makefile.am: * ext/speex/Makefile.am: * ext/speex/gstspeex.c: (plugin_init): * ext/speex/gstspeexdec.c: (speex_get_query_types), (gst_speex_dec_init), (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), (speex_dec_chain): Port speexdec. Leads to some unfamiliar warnings on console, but works otherwise. 2005-08-23 Andy Wingo * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name property after opening the mixer. * sys/oss/gstosssrc.c: * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... * sys/oss/gstossmixerelement.h: * sys/oss/gstossmixerelement.c: Added mixer element like alsamixer. * sys/oss/Makefile.am: * sys/oss/gstossaudio.c: Register the ossmixer element. * sys/oss/gstossmixer.h: * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. * sys/oss/gstossmixertrack.h: * sys/oss/gstossmixertrack.c: Split out from gstossmixer.[ch], like gstalsamixer. * sys/oss/gstosssrc.c: * sys/oss/gstosssink.c: Where before we used a gstosselement object as a helper library, now just call functions from gstosshelper. * sys/oss/gstosshelper.h: * sys/oss/gstosshelper.c: Made a real library. Removed propertyprobe for now, should add it back later. * sys/oss/gstosselement.h: * sys/oss/gstosselement.c: Removed, we don't have a shared base class. * sys/oss/gstosshelper.c (gst_oss_helper_probe_caps): Search higher-to-lower, makes 16 bit appear earlier in the caps, which makes it preferred. * sys/oss/gstosssrc.h: * sys/oss/gstosssrc.c: Totally ported, dude. * sys/oss/Makefile.am: * sys/oss/gstossaudio.c: Add osssrc. * sys/oss/gstosssink.c: We do native byte order. 2005-08-23 Owen Fraser-Green * gst/realmedia/rmdemux.c (gst_rmdemux_src_event): Fixed bug causing events to be passed wrong way. (gst_rmdemux_parse_packet): Avoid accidentally skipping audio. 2005-08-22 Jan Schmidt * ext/mad/gstid3tag.c: (gst_id3_tag_init), (gst_id3_tag_sink_event), (gst_id3_tag_do_caps_nego), (gst_id3_tag_chain), (gst_id3_tag_change_state), (plugin_init): Works a bit better now, but still needs a rewrite to use get_range instead of this seeking nastiness. 2005-08-22 Ronald S. Bultje * configure.ac: * ext/Makefile.am: * ext/flac/Makefile.am: * ext/flac/gstflac.c: (plugin_init): * ext/flac/gstflacdec.c: (flacdec_get_type), (gst_flacdec_init), (gst_flacdec_update_metadata), (gst_flacdec_seek), (gst_flacdec_tell), (gst_flacdec_length), (gst_flacdec_read), (gst_flacdec_write), (gst_flacdec_loop), (gst_flacdec_get_src_query_types), (gst_flacdec_src_query), (gst_flacdec_src_event), (gst_flacdec_sink_activate), (gst_flacdec_sink_activate_pull), (gst_flacdec_change_state): * ext/flac/gstflacdec.h: Port flacdec (seeking is still slow'ish). 2005-08-22 Owen Fraser-Green * gst/realmedia/rmdemux.c: (gst_rmdemux_perform_seek, gst_rmdemux_parse_packet): Seeking improvements. 2005-08-19 Wim Taymans * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init): Remove get_time code that is both wrong and unneeded. 2005-08-19 Wim Taymans * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), (gst_rtph263penc_flush), (gst_rtph263penc_chain), (gst_rtph263penc_set_property), (gst_rtph263penc_get_property): * gst/rtp/gstrtph263penc.h: Added configurable pt and ssrc, to be merged in the caps or a base class... 2005-08-19 Wim Taymans * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_init), (gst_rtph263pdec_chain): * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), (gst_rtph263penc_flush), (gst_rtph263penc_chain): Some cleanups in the h263p (de)payloaders. 2005-08-19 Wim Taymans * ext/amrnb/amrnbdec.c: * ext/amrnb/amrnbenc.c: (gst_amrnbenc_setcaps): * ext/amrnb/amrnbparse.c: Update caps with audio/AMR. * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain), (gst_rtpamrdec_change_state): * gst/rtp/gstrtpamrdec.h: * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), (gst_rtpamrenc_init), (gst_rtpamrenc_chain): Dont set FT headers twice, it was already in the encoded bitstream. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play): * gst/rtsp/rtspconnection.c: (parse_line): Cleanups * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property): * gst/udp/gstudpsrc.h: Added caps property, we need this soon to type the buffers. 2005-08-18 Wim Taymans * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), (gst_rtpamrdec_chain): Fix up amr depayloader a bit. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play): Look for options result in Public and Allow header fields.. spec says Allow but some servers return Public... 2005-08-18 Wim Taymans * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), (gst_rtpamrenc_init), (gst_rtpamrenc_chain), (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property): * gst/rtp/gstrtpamrenc.h: Added payload_type and ssrc properties to the payloader. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play): Options need to be stripped and are in the Public header field. * gst/rtsp/rtspurl.c: (rtsp_url_parse): Fix url / parsing... 2005-08-18 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_get_type), (gst_rtpamrdec_base_init), (gst_rtpamrdec_class_init), (gst_rtpamrdec_init), (gst_rtpamrdec_chain), (gst_rtpamrdec_set_property), (gst_rtpamrdec_get_property), (gst_rtpamrdec_change_state), (gst_rtpamrdec_plugin_init): * gst/rtp/gstrtpamrdec.h: * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_get_type), (gst_rtpamrenc_base_init), (gst_rtpamrenc_class_init), (gst_rtpamrenc_init), (gst_rtpamrenc_chain), (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property), (gst_rtpamrenc_change_state), (gst_rtpamrenc_plugin_init): * gst/rtp/gstrtpamrenc.h: * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_class_init), (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain): Added very simplistic amr payloader. depayloader does not work yet. 2005-08-18 Wim Taymans * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspdefs.c: (rtsp_method_as_text), (rtsp_find_method): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtsptransport.c: (rtsp_transport_parse): Handle RTSP defaults better. Issue OPTIONS request to figure out what we are allowed to do. Make the methods a bitfield so we can easily collect supported options. Fix rtsp_find_method. Do proper RTSP connection shutdown. 2005-08-18 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp-common.h: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpL16enc.h: * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), (gst_rtpdec_class_init), (gst_rtpdec_chain_rtp), (gst_rtpdec_chain_rtcp), (gst_rtpdec_change_state), (gst_rtpdec_plugin_init): * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_get_type), (gst_rtph263pdec_base_init), (gst_rtph263pdec_class_init), (gst_rtph263pdec_init), (gst_rtph263pdec_chain), (gst_rtph263pdec_set_property), (gst_rtph263pdec_get_property), (gst_rtph263pdec_change_state), (gst_rtph263pdec_plugin_init): * gst/rtp/gstrtph263pdec.h: * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_get_type), (gst_rtph263penc_base_init), (gst_rtph263penc_class_init), (gst_rtph263penc_init), (gst_rtph263penc_flush), (gst_rtph263penc_chain), (gst_rtph263penc_set_property), (gst_rtph263penc_get_property), (gst_rtph263penc_change_state), (gst_rtph263penc_plugin_init): * gst/rtp/gstrtph263penc.h: * gst/rtp/gstrtpmpadec.c: (gst_rtpmpadec_get_type), (gst_rtpmpadec_base_init), (gst_rtpmpadec_class_init), (gst_rtpmpadec_init), (gst_rtpmpadec_chain), (gst_rtpmpadec_set_property), (gst_rtpmpadec_get_property), (gst_rtpmpadec_change_state), (gst_rtpmpadec_plugin_init): * gst/rtp/gstrtpmpadec.h: * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_get_type), (gst_rtpmpaenc_base_init), (gst_rtpmpaenc_class_init), (gst_rtpmpaenc_init), (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain), (gst_rtpmpaenc_set_property), (gst_rtpmpaenc_get_property), (gst_rtpmpaenc_change_state), (gst_rtpmpaenc_plugin_init): * gst/rtp/gstrtpmpaenc.h: * gst/rtp/rtp-packet.c: * gst/rtp/rtp-packet.h: Remove old code that is now in gst-libs/gst/rtp/. Added some payload/depayloaders. * gst/udp/gstudpsink.c: (gst_udpsink_class_init): Fix port number range. 2005-08-17 Wim Taymans * configure.ac: Added mpegaudioparse * ext/lame/gstlame.c: (gst_lame_src_getcaps), (gst_lame_src_setcaps), (gst_lame_sink_setcaps), (gst_lame_sink_event), (gst_lame_chain): Some cleanups. Fix memleak. * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_class_init), (gst_mp3parse_init), (gst_mp3parse_chain), (gst_mp3parse_change_state): * gst/mpegaudioparse/gstmpegaudioparse.h: Ported mpegaudioparse 2005-08-17 Wim Taymans * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open), (gst_rtspsrc_play): Support absolute control urls too. 2005-08-16 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_stream_header): * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_add_stream), (qtdemux_parse_tree): Uncomment metadata and codec-name handling. 2005-08-16 Wim Taymans * configure.ac: * ext/amrnb/amrnbparse.c: (gst_amrnbparse_read_header): Fix compile warning. * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_src_getcaps), (gst_lame_src_setcaps), (gst_lame_sink_setcaps), (gst_lame_init), (gst_lame_sink_event), (gst_lame_chain), (gst_lame_change_state): * ext/lame/gstlame.h: Port lame plugin 2005-08-16 Andy Wingo * ext/dv/gstdvdemux.c (gst_dvdemux_flush): Use gst_adapter_take so we have our own copy of the data. (gst_dvdemux_demux_video): Set the take() data as malloc_data so it will get freed later. * ext/raw1394/gstdv1394src.c (gst_dv1394src_iso_receive): Note license info in the source code -- was only in the commit log before. * ext/dv/gstdvdec.h: * ext/dv/gstdvdec.c: Only decodes systemstream=FALSE dv video -- old pipelines using dvdec should probably have a dvdemux first. * ext/dv/gstdvdemux.h: * ext/dv/gstdvdemux.c: Split out from dvdec, chunks the incoming systemstream=TRUE data into frames, sets caps data, and spits out PCM audio in addition to systemstream=FALSE video frames. Operates in chain mode only for now; should make a getrange version as well. * ext/dv/gstdv.c: New file, registers the libgstdv plugin. * ext/dv/Makefile.am: Library name changed to libgstdv. Split dvdec into dvdemux and dvdec. 2005-08-16 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_event), (gst_faad_chain): * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): Handle _push() return values. 2005-08-15 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_event): * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): Fix debug. 2005-08-15 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (qtdemux_video_caps): Forwardport from 0.8 to implement RLE. 2005-08-15 Wim Taymans * gst/rtsp/README: Added rtsp server implementation docs. 2005-08-14 Thomas Vander Stichele * ext/aalib/gstaasink.c: aalib is LGPL, so this plugin can be LGPL * ext/arts/gst_arts.c: (plugin_init): rename, we don't like underscores * ext/audiofile/gstaf.c: * ext/sndfile/gstsf.c: rename, we like a descriptive plugin name * ext/gconf/gstgconfelements.c: change description a little * ext/musicbrainz/gsttrm.c: musicbrainz is LGPL, so plugin can be LGPL * ext/raw1394/gst1394.c: rename, we like all-digit names * gst/equalizer/gstiirequalizer.c: * gst/fdsrc/gstfdsrc.c: * gst/multifilesink/gstmultifilesink.c: rename * gst/virtualdub/gstvirtualdub.c: use GST_PLUGIN_DEFINE * sys/dxr3/dxr3init.c: only uses system headers, and code is LGPL, so plugin is LGPL 2005-08-13 Tim-Philipp Müller * ext/mad/Makefile.am: * gst/avi/Makefile.am: * gst/effectv/Makefile.am: * gst/udp/Makefile.am: * gst/wavparse/Makefile.am: Use -lgstfoo-@GST_MAJORMINOR@ instead of -lgstfoo-0.9 2005-08-12 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_decode_indirect), (gst_jpeg_dec_decode_direct), (gst_jpeg_dec_chain): Fix decoding of pictures with certain uneven or unaligned widths where jpeglib needs more horizontal padding than our I420 buffers provide, resulting in blocky artifacts at the left side of the picture (#164176). Also make use of our shiny new GST_ROUND_N() macros. 2005-08-11 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: Fix crashes/invalid memory access for pictures that have a height that is not a multiple of 16 (or rather: v_samp_factor * DCTSIZE). Also fix the state change function for downwards state changes (need to chain up to parent before destroying our resources, to make sure pads get deactivated and our chain function isn't running and using those very same resources in another thread). The jpeg line buffer only needs to be v_samp_factor*DCTSIZE lines per plane, not picture_height lines; allocate that on the stack. 2005-08-10 Tim-Philipp Müller * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), (gst_wavparse_stream_data): Add some fixes from 0.8 branch: allow 24/32bps songs and blockalign samples to the header-specified size, if any (#311070); error out on channels==0 or bitrate==0 (#309043, #304588). 2005-08-10 Thomas Vander Stichele * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), (gst_level_transform): * gst/level/gstlevel.h: remove unused MS struct member don't reset the CS values for channels on every _chain, so that level actually correctly calculates the RMS value. sigh. calculate RMS values correctly for peak and decay peak sums; before we were signalling them as if they already were amplitude and not power values. sigh. Remind me to not try and pretend I'm writing DSP code. 2005-08-10 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_class_init), (gst_faad_setcaps): Add debug category, remove Close() call that made it crash whenever reusing, renegotiating or anything; Close() actually free()s the handle and should only be called on READY->NULL. * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): Actually set caps on buffer (in addition to pad), also. 2005-08-10 Owen Fraser-Green * gst/realmedia/rmdemux.c (gst_rmdemux_sink_activate) (gst_rmdemux_sink_activate_push, gst_rmdemux_sink_activate_pull) (gst_rmdemux_loop, gst_rmdemux_src_event) (gst_rmdemux_perform_seek, gst_rmdemux_src_query): Implemented push-pull and seeking. 2005-08-09 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_event): Sign/unsign mismatch. * configure.ac: * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), (gst_qtdemux_init), (gst_qtdemux_get_src_query_types), (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), (plugin_init), (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), (gst_qtdemux_loop_header), (qtdemux_sink_activate), (qtdemux_sink_activate_pull), (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): * gst/qtdemux/qtdemux.h: Half-assed port (hey, it works). 2005-08-09 Tim-Philipp Müller * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): Fix AVI header parsing: add missing break statement after GST_RIFF_INFO_LIST parsing code; gst_riff_read_chunk() has already advanced the avi->offset, no need to do it twice (fixes MovieOfMovies.avi). 2005-08-09 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: Make mjpeg actually work and skip jpeg data parsing if we know that the input is packetized (ie. each input buffer is exactly one jpeg frame). 2005-08-09 Ronald S. Bultje * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): It'd be nice if I could listen to my mp3 files, so send out an initial discont, as the sink apparently wants. 2005-08-09 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), (gst_avi_demux_handle_seek): Fix seeking (or, well, fix threading issue where a variable was set before a lock was taken and was already unset before that same lock was taken and was thus no longer in existance when it actually had to be used). 2005-08-09 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Mixing binary and logical operators is not going to work; fix position-querying in Totem. 2005-08-08 Tim-Philipp Müller * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_class_init), (gst_faad_init), (gst_faad_setcaps), (gst_faad_srcgetcaps), (gst_faad_event), (gst_faad_update_caps), (gst_faad_chain), (gst_faad_change_state): * ext/faad/gstfaad.h: Fix negotiation (#310932) and miscellaneous other stuff. Probably still needs some more work. 2005-08-08 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain): Add setcaps() function (for mjpeg). 2005-08-08 Andy Wingo * ext/esd/esdsink.c (gst_esdsink_getcaps): Seems that wierd va_list caps setting function was borked. Fixed esdsink. * sys/oss/gstosssink.c (gst_oss_sink_open, gst_oss_sink_close) (gst_oss_sink_prepare, gst_oss_sink_unprepare): Update for newer audiosink api. * ext/raw1394/gstdv1394src.c (gst_dv1394src_get_property) (gst_dv1394src_set_property): Style. All about the style. * ext/esd/esdsink.c (gst_esdsink_getcaps): Return specific caps only if in READY or higher (i.e., if _open() has been called.) (gst_esdsink_open, gst_esdsink_close, gst_esdsink_prepare) (gst_esdsink_unprepare): Update for audiosink changes. (gst_esdsink_change_state): Die! 2005-08-08 Ronald S. Bultje * ext/jpeg/Makefile.am: Fix compile. 2005-08-08 Tim-Philipp Müller * configure.ac: * ext/Makefile.am: * ext/jpeg/Makefile.am: * ext/jpeg/gstjpeg.c: (plugin_init): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_get_type), (gst_jpeg_dec_finalize), (gst_jpeg_dec_base_init), (gst_jpeg_dec_class_init), (gst_jpeg_dec_fill_input_buffer), (gst_jpeg_dec_init_source), (gst_jpeg_dec_skip_input_data), (gst_jpeg_dec_resync_to_restart), (gst_jpeg_dec_term_source), (gst_jpeg_dec_my_output_message), (gst_jpeg_dec_my_emit_message), (gst_jpeg_dec_my_error_exit), (gst_jpeg_dec_init), (is_jpeg_start_marker), (is_jpeg_end_marker), (gst_jpeg_dec_find_jpeg_header), (gst_jpeg_dec_ensure_header), (gst_jpeg_dec_have_end_marker), (gst_jpeg_dec_parse_tag_has_entropy_segment), (gst_jpeg_dec_parse_image_data), (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: Port jpegdec to 0.9; handles 'progressive loading' now, ie. input does no longer need to be one single buffer. 2005-08-04 Andy Wingo * sys/oss/gstossaudio.c (plugin_init): Second-class citizen. * gst/videobox/gstvideobox.c (gst_video_box_get_size): Update for API changes. * configure.ac (DEFAULT_AUDIOSINK, DEFAULT_VIDEOSINK): Set to autoaudiosink and autovideosink. 2005-08-04 Edward Hervey * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_parse_stream), (gst_avi_demux_process_next_entry): You need to allocatate (len+1) characters to store a len size string. Also don't stop the processing task if the output pad is not linked. 2005-08-03 Ronald S. Bultje * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), (gst_gconf_audio_sink_init), (do_toggle_element), (cb_toggle_element), (gst_gconf_audio_sink_change_state): * ext/gconf/gstgconfaudiosink.h: * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), (gst_gconf_video_sink_init), (do_toggle_element), (cb_toggle_element), (gst_gconf_video_sink_change_state): * ext/gconf/gstgconfvideosink.h: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), (gst_auto_audio_sink_init), (gst_auto_audio_sink_detect), (gst_auto_audio_sink_change_state): * gst/autodetect/gstautoaudiosink.h: * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), (gst_auto_video_sink_init), (gst_auto_video_sink_detect), (gst_auto_video_sink_change_state): * gst/autodetect/gstautovideosink.h: Use new ghostpad API; now they actually work in Totem, also. 2005-08-03 Ronald S. Bultje * ext/libpng/Makefile.am: Fix uninstalled build. 2005-08-02 Edward Hervey * configure.ac: * ext/Makefile.am: * ext/libpng/Makefile.am: * ext/libpng/gstpng.c: * ext/libpng/gstpngenc.c: Ported pngenc , still have to port pngdec... 2005-08-01 Stefan Kost reviewed by: * configure.ac: * ext/ladspa/Makefile.am: * ext/ladspa/gstladspa.c: (gst_ladspa_init), (gst_ladspa_loop), (gst_ladspa_chain), (gst_ladspa_get), (plugin_init): * ext/ladspa/gstladspa.h: deactivate and remove dparams (libgstcontrol) 2005-07-27 Wim Taymans * ext/faad/gstfaad.c: (gst_faad_event): Compile fixes. 2005-07-27 Wim Taymans * ext/amrnb/amrnbparse.c: (gst_amrnbparse_event), (gst_amrnbparse_loop): * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), (gst_dvdec_decode_frame): * ext/mad/gstid3tag.c: (gst_id3_tag_src_event), (gst_id3_tag_sink_event), (gst_id3_tag_chain): * ext/mad/gstmad.c: (gst_mad_src_query), (index_seek), (normal_seek), (gst_mad_sink_event), (gst_mad_chain): * ext/mpeg2dec/gstmpeg2dec.c: * ext/shout2/gstshout2.c: (gst_shout2send_event): * ext/sidplay/gstsiddec.cc: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), (gst_avi_demux_send_event), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): * gst/goom/gstgoom.c: (gst_goom_event): * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), (gst_rmdemux_chain), (gst_rmdemux_send_event), (gst_rmdemux_add_stream): * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_srcpad_event): Various event updates and cleanups. 2005-07-25 Christian Schaller * gst-plugins.spec.in: add silence and videoflip * gst/videofilter/Makefile.am: add missing header to noinst 2005-07-25 Thomas Vander Stichele * gst/videofilter/Makefile.am: * gst/videofilter/gstgamma.c: (gst_gamma_setup): * gst/videofilter/gstvideobalance.c: (gst_videobalance_setup): * gst/videofilter/gstvideofilter.c: (gst_videofilter_class_init), (gst_videofilter_getcaps), (gst_videofilter_setcaps), (gst_videofilter_init), (gst_videofilter_chain), (gst_videofilter_set_property), (gst_videofilter_get_property), (gst_videofilter_setup), (gst_videofilter_class_add_pad_templates): * gst/videofilter/gstvideofilter.h: * gst/videofilter/gstvideoflip.c: (gst_videoflip_init), (gst_videoflip_set_property), (gst_videoflip_get_property), (plugin_init), (gst_videoflip_setup), (gst_videoflip_planar411): forward port from 0.9 and enable videoflip now that it works 2005-07-23 Edward Hervey * configure.ac: * gst/silence/Makefile.am: * gst/silence/gstsilence.h: * gst/silence/gstsilence.c: Ported silence to 0.9 using GstBaseSrc ... 180 lines :) 2005-07-22 Ronald S. Bultje * ext/mad/gstmad.c: (gst_mad_src_event): First try forwarding events, makes seeking in AVI files with mp3 audio work again. 2005-07-20 Andy Wingo * ext/mpeg2dec/gstmpeg2dec.c (gst_mpeg2dec_sink_event): Signedness fix. 2005-07-20 Edward Hervey * configure.ac: * gst/wavparse/gstwavparse.c: * gst/wavparse/gstwavparse.h: * gst/wavparse/Makefile.am: Ported wavparse to 0.9 . Playing, seeking and state changes work. Could need more loving on the headers though. 2005-07-20 Ronald S. Bultje * configure.ac: * ext/Makefile.am: * ext/gconf/Makefile.am: * ext/gconf/gconf.c: (gst_bin_find_unconnected_pad), (gst_gconf_render_bin_from_description), (gst_gconf_get_default_video_sink): * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init), (gst_gconf_audio_sink_class_init), (gst_gconf_audio_sink_dispose), (cb_toggle_element), (gst_gconf_audio_sink_change_state): * ext/gconf/gstgconfelements.h: * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init), (gst_gconf_video_sink_class_init), (gst_gconf_video_sink_dispose), (cb_toggle_element), (gst_gconf_video_sink_change_state): * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_base_init), (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_detect), (gst_auto_audio_sink_change_state): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_base_init), (gst_auto_video_sink_class_init), (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): Port auto/gconfsinks to 0.9. They actually appear to work here in Totem as well, making them actually useful. 2005-07-20 Ronald S. Bultje * ext/faad/Makefile.am: Fix uninstalled build. 2005-07-19 Wim Taymans * sys/oss/gstosssink.c: (gst_oss_sink_get_format), (gst_oss_sink_open): Parse spec to set correct oss values. 2005-07-19 Edgard N. A. G. Lima * configure.ac * ext/Makefile.am * ext/amrnb/amrnbdec.c * ext/amrnb/amrnbenc.c * ext/amrnb/amrnbparse.c * ext/faad/gstfaad.c * ext/mpeg2dec/gstmpeg2dec.c Ported amrnb, faad, mpeg2dec to 0.9 2005-07-19 Andy Wingo * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Set the proper framerate on the outbound buffer. * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Don't clobber alloc_buffer's return value. (gst_dvdec_decode_frame): Handle unlinked pads with grace and agility. * ext/dv/gstdvdec.h: Fix signedness error. 2005-07-19 Wim Taymans * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), (gst_dvdec_sink_convert), (gst_dvdec_get_src_query_types), (gst_dvdec_src_query), (gst_dvdec_get_sink_query_types), (gst_dvdec_sink_query), (gst_dvdec_send_event), (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), (gst_dvdec_decode_audio), (gst_dvdec_decode_video), (gst_dvdec_decode_frame), (gst_dvdec_flush), (gst_dvdec_chain): * ext/dv/gstdvdec.h: Implemented seeking in dvdec. 2005-07-19 Andy Wingo * ext/Makefile.am: Enable dvdev and raw1394src. 2005-07-18 Andy Wingo * configure.ac: Use AS_LIBTOOL_TAGS. Fix crap gettext commit comment. 2005-07-18 Wim Taymans * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_add_element), (gst_rtspsrc_play): Fix for core changes. 2005-07-18 Jan Schmidt * ext/mad/gstid3tag.c: (gst_id3_tag_sink_event): When returning to NORMAL state after reading tags, pass on the discont event. 2005-07-18 Wim Taymans * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), (gst_rmdemux_change_state), (gst_rmdemux_chain), (gst_rmdemux_get_stream_by_id), (gst_rmdemux_send_event), (gst_rmdemux_add_stream): Send discont event before pushing first buffer. 2005-07-17 Philippe Khalaf * gst/fdsrc/gstfdsrc.c: Removed #include 2005-07-16 Philippe Khalaf * gst/fdsrc/gstfdsrc.c: * gst/fdsrc/gstfdsrc.h: * gst/fdsrc/Makefile.am: Moved fdsrc 0.9 port from gstreamer/gst/elements to here. 2005-07-16 Wim Taymans * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event), (gst_mad_chain): Add convert function for proper timestamp calculations. * gst/avi/gstavidemux.c: (gst_avi_demux_send_event), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): Send out initial discont. 2005-07-15 Wim Taymans * gst/level/gstlevel.c: (gst_level_transform): * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_get_size), (gst_video_box_transform): Port to new base class. 2005-07-14 Wim Taymans * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), (gst_dv1394src_class_init), (gst_dv1394src_init), (gst_dv1394src_iso_receive), (gst_dv1394src_create), (gst_dv1394src_change_state), (gst_dv1394src_query): It's PUSH_SRC now. 2005-07-14 Thomas Vander Stichele * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), (gst_udpsrc_class_init): more autistic cleanliness in functions/names/defines 2005-07-10 Thomas Vander Stichele * ext/aalib/gstaasink.c: (gst_aasink_get_type), (gst_aasink_class_init), (gst_aasink_init): * ext/esd/esdsink.c: (gst_esdsink_get_type), (gst_esdsink_class_init): * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), (gst_cacasink_class_init), (gst_cacasink_init): * ext/shout2/gstshout2.c: (gst_shout2send_get_type), (gst_shout2send_class_init), (gst_shout2send_init): * gst/udp/gstdynudpsink.c: (gst_dynudpsink_get_type), (gst_dynudpsink_class_init): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), (gst_multiudpsink_class_init): more macro splitting 2005-07-08 Andy Wingo * sys/oss/: Port from THREADED+wim's fixes. * gst/avi/Makefile.am (libgstavi_la_CFLAGS): No gettext hacks, the defines come from config.h. * autogen.sh: Run autopoint, etc. * Makefile.am (DIST_SUBDIRS, SUBDIRS): Go into po/. * configure.ac: Add gettext stuff. 2005-07-07 Wim Taymans * gst/videobox/gstvideobox.c: (gst_video_box_init), (gst_video_box_transform_caps), (gst_video_box_set_caps): Logic was reversed. Needs some more fixes in the transform function to include AYUV output. Moved AYUV as prefered format. 2005-07-07 Wim Taymans * configure.ac: * ext/dv/Makefile.am: * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), (gst_dvdec_get_src_query_types), (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), (gst_dvdec_video_getcaps), (gst_dvdec_video_setcaps), (gst_dvdec_decode_audio), (gst_dvdec_decode_video), (gst_dvdec_decode_frame), (gst_dvdec_chain), (gst_dvdec_change_state), (gst_dvdec_set_property), (gst_dvdec_get_property), (plugin_init): * ext/dv/gstdvdec.h: * ext/esd/esdsink.c: (gst_esdsink_class_init): Ported DVdec to 0.9. Parent of esdsink is GstAudioSink. 2005-07-07 Wim Taymans * configure.ac: * ext/raw1394/Makefile.am: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), (gst_dv1394src_class_init), (gst_dv1394src_init), (gst_dv1394src_iso_receive), (gst_dv1394src_create), (gst_dv1394src_change_state), (gst_dv1394src_convert), (gst_dv1394src_get_query_types), (gst_dv1394src_query): * ext/raw1394/gstdv1394src.h: Ported the 1394 source to 0.9. 2005-07-07 Wim Taymans * ext/mad/gstid3tag.c: (gst_id3_tag_get_query_types): * ext/mad/gstmad.c: (gst_mad_get_query_types), (gst_mad_src_query): * gst/avi/gstavidemux.c: (gst_avi_demux_get_src_query_types): Remove deprecated/unsed code. 2005-07-06 Edward Hervey * gst/udp/gstudpsrc.c: (gst_udpsrc_init): GST_BASESRC --> GST_BASE_SRC 2005-07-05 Andy Wingo * gst/oneton: Removed (replaced by deinterleave). * gst/adder: * gst/audioconvert: * gst/audiorate: * gst/audioscale: * gst/ffmpegcolorspace: * gst/playback: * gst/sine: * gst/subparse: * gst/tags: * gst/tcp: * gst/videoscale: * gst/volume: Removed dirs that are now in gst-plugins-base. 2005-07-05 Edward Hervey * configure.ac: (GST_PLUGINS_ALL): videofilter must be compiled first, since other plugins depend ont it. 2005-07-05 Andy Wingo * Way, way, way too many files: Remove crack comment from the 2000 era. 2005-07-05 Andy Wingo * gst/videobox/gstvideobox.c: Clean up, port to 0.9, use BaseTransform. * gst/videobox/Makefile.am: Link to base libs, include plugins-base cflags, dist the README. * configure.ac (GST_PLUGIN_ALL, AC_CONFIG_FILES): Add videobox to the build. 2005-07-04 Wim Taymans * gst/realmedia/rmdemux.c: I don't think that piece of changelog should go there. 2005-07-04 Andy Wingo * examples/level/: * examples/level/Makefile.am: * examples/level/README: * examples/level/demo.c: * examples/level/plot.c: Examples moved out of the source dir. Not updated tho. * configure.ac: Add level to the build. * gst/level/Makefile.am: * gst/level/gstlevel.h: * gst/level/gstlevel.c: Cleaned up, ported to 0.9. * ext/aalib/gstaasink.c (gst_aasink_fixate): Update for newer fixate prototype. 2005-07-03 Owen Fraser-Green * gst/realmedia/rmdemux.c (gst_rmdemux_add_stream), (gst_rmdemux_src_getcaps), (gst_rmdemux_chain): Added getcaps function no_more_pads call 2005-07-01 Philippe Khalaf * gst/udp/Makefile.am: * gst/udp/gstudp.c: * gst/udp/gstdynudpsink.c: (new) * gst/udp/gstdynudpsink.h: (new) Added new element (udpdynsink) that receives GstNetBuffers and sends the udp packets to the source given in the buffer. It's used by rtpsession element for now. * gst/udp/gstudpsrc.c: Fixed memory leak. 2005-07-01 Jan Schmidt * configure.ac: * ext/mad/Makefile.am: * sys/oss/Makefile.am: Roll gstreamer-interfaces-0.9.pc into gstreamer-plugins-base-0.9.pc 2005-07-01 Jan Schmidt * ext/libcaca/Makefile.am: * ext/mad/Makefile.am: * gst/effectv/Makefile.am: * gst/udp/Makefile.am: Replace GST_PLUGINS_LIBS_* with GST_PLUGINS_BASE_* * ext/mad/gstid3tag.c: (gst_id3_tag_src_query), (gst_id3_tag_src_event), (gst_id3_tag_sink_event), (gst_id3_tag_chain), (plugin_init): * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_chain): Signedness warning fix, use gst_pad_get_peer instead of GST_PAD_PEER in querying and event handling, because we're not holding the pad lock and the peer may disappear. * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_index), (gst_avi_demux_massage_index): Signedness warning fixes. * gst/videofilter/gstvideotemplate.c: (plugin_init): Remove gst_library_load 2005-06-30 Edward Hervey * gst/avi/Makefile.am: (libgstavi_la_LIBADD): Added linking to libgstriff-0.9 * ext/mad/gstmad.c: (gst_mad_src_query): check the format of the upstream query and return query if it's the same format as the requested one. 2005-06-30 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): Compiler pains. 2005-06-30 Ronald S. Bultje * configure.ac: * gst/avi/Makefile.am: * gst/avi/gstavi.c: (plugin_init): * gst/avi/gstavidemux.c: (gst_avi_demux_get_type), (gst_avi_demux_class_init), (gst_avi_demux_init), (gst_avi_demux_reset), (gst_avi_demux_index_next), (gst_avi_demux_index_entry_for_time), (gst_avi_demux_index_entry_for_byte), (gst_avi_demux_index_entry_for_frame), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init), (gst_avi_demux_parse_avih), (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_subindex), (gst_avi_demux_read_subindexes), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop), (gst_avi_demux_sink_activate), (gst_avi_demux_sink_activate_pull): * gst/avi/gstavidemux.h: Port from -THREADED to HEAD, and fix for latest API changes of the day. Keep avimux dead for now. 2005-06-29 Wim Taymans * ext/shout2/gstshout2.c: (gst_shout2send_render): Fix build. 2005-06-29 Andy Wingo * gst/videofilter/gstvideoexample.c: Removed gst_library_load, I think. Whatever this plugin actually does, that I don't know. 2005-06-29 Andy Wingo * ext/mad/gstid3tag.c (gst_id3_tag_get_event_masks): Reschmoove. * ext/mad/gstmad.c (gst_mad_get_event_masks): Remove. (gst_mad_chain): Appease GCC. * ext/libcaca/gstcacasink.c (gst_cacasink_setcaps): Signedness. * ext/aalib/gstaasink.c (gst_aasink_fixate): Unref caps, not free. (gst_aasink_scale): Signedness. * gst/udp/gstudpsink.c (gst_udpsink_get_type): Actually add the URI handler. * gst/udp/gstudpsrc.c (gst_udpsrc_start): (gst_udpsrc_create): Signedness. * gst/rtsp/sdpmessage.c (sdp_message_parse_buffer): Thanks compiler! (sdp_parse_line): Signedness fix. * configure.ac (GST_CFLAGS): GCC strikes back!!! Let the build breakage ensue!!! * gst/rtsp/gstrtspsrc.c (gst_rtspsrc_loop, gst_rtspsrc_open): Signedness, unused var fixes. (gst_rtspsrc_close): Unused? * gst/realmedia/rmdemux.c (re_hexdump_bytes): Unused. * gst/law/mulaw-encode.c (gst_mulawenc_chain): Signeness fix. * gst/law/alaw-encode.c (alawenc_getcaps): Remove unneeded declarations. Typo (probably crasher) fix. * gst/law/mulaw-encode.c (mulawdec_getcaps): * gst/law/mulaw-encode.c (mulawenc_getcaps): * gst/law/alaw-decode.c (alawdec_getcaps): Same crasher fix. * gst/goom/gstgoom.c (gst_goom_init): Hook up the event function. * gst/effectv/gstwarp.c (gst_warptv_setup): Signedness fix. * gst/effectv/gstdice.c (gst_dicetv_draw): Um, deferencing uninitialized pointer not good. * gst/videofilter/gstvideoexample.c (plugin_init): * gst/videofilter/Makefile.am (libgstvideoexample_la_LIBADD): Link to libgstvideofilter instead of gst_library_load. * gst/alpha/gstalpha.c (gst_alpha_chroma_key_i420) (gst_alpha_chroma_key_ayuv): Signedness fixen. 2005-06-29 Wim Taymans * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_change_state): Fix case where outpad could not be decided. 2005-06-29 Andy Wingo * ext/Makefile.am (MAD_DIR): Add mad to the build. 2005-06-28 Wim Taymans * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): * gst/udp/gstudpsrc.c: (gst_udpsrc_init): Fix old RPAD macro. basesrc -> base_src 2005-06-27 Wim Taymans * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): * ext/mad/gstmad.c: (gst_mad_chain): RPAD_ -> PAD Fix args in bufferalloc function call. Makes the mad plugin compile again 2005-06-27 Owen Fraser-Green * gst/realmedia/rmdemux.c: Rewrote to use gstadapter. Also parses audio and video header packets for known properties. 2005-06-23 Wim Taymans * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_change_state): * gst/rtsp/rtspurl.c: (rtsp_url_parse): Make rtspsrc a live source. Don't try to parse NULL urls. 2005-06-23 Wim Taymans * gst/udp/gstudpsrc.c: (gst_udpsrc_init): Make udpsrc a live source. 2005-06-02 Wim Taymans * gst/udp/Makefile.am: Use versioned net lib. 2005-06-02 Wim Taymans * gst/udp/Makefile.am: Fix hack in makefile. 2005-06-02 Andy Wingo * ext/mad/gstid3tag.c: Finish porting to 0.9: no more gstdata, check for link functions before calling them, give gst_message_new_tag its own copy of the tag list, set the parser state before sending the event (because in 0.9 events are processed immediately), casting fixes. * ext/mad/Makefile.am (libgstmad_la_LDFLAGS): Link with gsttagedit. 2005-06-02 Wim Taymans * gst/udp/Makefile.am: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_finalize), (gst_multiudpsink_get_times), (gst_multiudpsink_render), (gst_multiudpsink_set_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add), (client_compare), (free_client), (gst_multiudpsink_remove), (gst_multiudpsink_clear), (gst_multiudpsink_get_stats): * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), (gst_udpsrc_unlock), (gst_udpsrc_stop): Use NetBuffer and small cleanups. Implement client removal in multiudpsink. 2005-06-02 Wim Taymans * gst/rtsp/README: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_change_state): * gst/rtsp/rtsptransport.c: (rtsp_transport_new), (rtsp_transport_init), (parse_mode), (parse_range), (rtsp_transport_parse), (rtsp_transport_free): RTSP cleanups. 2005-06-02 Wim Taymans * gst/effectv/gstquark.c: (gst_quarktv_chain): * gst/goom/gstgoom.c: (gst_goom_chain): * gst/videobox/Makefile.am: * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_init), (gst_video_box_sink_setcaps), (gst_video_box_chain): * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): * gst/videorate/gstvideorate.c: (gst_videorate_class_init), (gst_videorate_getcaps), (gst_videorate_setcaps), (gst_videorate_init), (gst_videorate_event), (gst_videorate_chain), (gst_videorate_change_state): Bufferalloc changes. 2005-05-25 Wim Taymans * ext/mad/gstmad.c: (gst_mad_chain), (gst_mad_change_state): * ext/sidplay/gstsiddec.cc: * gst/alpha/gstalpha.c: (gst_alpha_chain): * gst/goom/gstgoom.c: (gst_goom_chain): No need to take the lock anymore, core already did that before calling us. 2005-05-25 Wim Taymans * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), (gst_amrnbdec_chain), (gst_amrnbdec_state_change): * ext/amrnb/amrnbenc.c: (gst_amrnbenc_base_init), (gst_amrnbenc_finalize), (gst_amrnbenc_chain), (gst_amrnbenc_state_change): * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), (gst_amrnbparse_query), (gst_amrnbparse_chain), (gst_amrnbparse_read_header), (gst_amrnbparse_loop), (gst_amrnbparse_sink_activate), (gst_amrnbparse_state_change): Core already took the lock. 2005-05-19 Ronald S. Bultje * configure.ac: * ext/esd/Makefile.am: Disable tcp elements and esdmon (they don't compile). 2005-05-19 Jan Schmidt * Makefile.am: * ext/Makefile.am: * sys/Makefile.am: Make my automake version shut up about undefined variables * gst/goom/gstgoom.c: GstAdapter moved to base objects. 2005-05-18 Wim Taymans * ext/amrnb/Makefile.am: * ext/amrnb/amrnb.c: (plugin_init): * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), (gst_amrnbdec_setcaps), (gst_amrnbdec_chain), (gst_amrnbdec_state_change): * ext/amrnb/amrnbdec.h: * ext/amrnb/amrnbenc.c: (gst_amrnbenc_get_type), (gst_amrnbenc_base_init), (gst_amrnbenc_class_init), (gst_amrnbenc_init), (gst_amrnbenc_finalize), (gst_amrnbenc_setcaps), (gst_amrnbenc_chain), (gst_amrnbenc_state_change): * ext/amrnb/amrnbenc.h: * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), (gst_amrnbparse_query), (gst_amrnbparse_event), (gst_amrnbparse_chain), (gst_amrnbparse_read_header), (gst_amrnbparse_loop), (gst_amrnbparse_sink_activate), (gst_amrnbparse_state_change): * ext/amrnb/amrnbparse.h: Ported AMR decoder/parse. Added AMR encoder. 2005-05-18 Wim Taymans * configure.ac: * gst/goom/Makefile.am: * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_sink_setcaps), (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_event), (gst_goom_chain), (gst_goom_change_state), (plugin_init): Ported goom. Added goom and alpha to build. 2005-05-17 Wim Taymans * configure.ac: * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_sink_setcaps), (gst_alpha_chain): Ported alpha, remove alphacolor as functionality is in ffmpegcolorspace. 2005-05-17 Wim Taymans * ext/libcaca/gstcacasink.c: (gst_cacasink_setcaps), (gst_cacasink_render), (gst_cacasink_open), (gst_cacasink_close), (gst_cacasink_change_state): * ext/libcaca/gstcacasink.h: Cleanups. 2005-05-15 David Schleef Move core plugins out of core. I don't mind fdsrc/fdsink going back into the core; they were just disabled there, so I moved them. Some of this stuff could (should) be deleted. * gst/oldcore/Makefile.am: * gst/oldcore/gstaggregator.c: * gst/oldcore/gstaggregator.h: * gst/oldcore/gstelements.c: * gst/oldcore/gstfdsink.c: * gst/oldcore/gstfdsink.h: * gst/oldcore/gstfdsrc.c: * gst/oldcore/gstfdsrc.h: * gst/oldcore/gstmd5sink.c: * gst/oldcore/gstmd5sink.h: * gst/oldcore/gstmultifilesrc.c: * gst/oldcore/gstmultifilesrc.h: * gst/oldcore/gstpipefilter.c: * gst/oldcore/gstpipefilter.h: * gst/oldcore/gstshaper.c: * gst/oldcore/gstshaper.h: * gst/oldcore/gststatistics.c: * gst/oldcore/gststatistics.h: 2005-05-13 Christian Schaller * ext/Makefile.am: dist esd directory * gst-plugins.spec.in: add rtp plugins and esd plugin * gst/effectv/Makefile.am: fix videofilter linking * gst/rtp/Makefile.am: add missing headers * gst/rtsp/Makefile.am: add missing headers 2005-05-12 Wim Taymans * configure.ac: * ext/sidplay/gstsiddec.cc: Add working plugins to build. Make sidplay compile again. 2005-05-12 Wim Taymans * ext/mad/gstid3tag.c: (gst_id3_tag_src_query): * ext/mad/gstmad.c: (gst_mad_chain): Fix mad and id3tag compilation again. 2005-05-12 Wim Taymans * gst/udp/.cvsignore: * gst/udp/Makefile.am: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_finalize), (gst_multiudpsink_get_times), (gst_multiudpsink_render), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_close), (gst_multiudpsink_add), (gst_multiudpsink_remove), (gst_multiudpsink_clear), (gst_multiudpsink_get_stats), (gst_multiudpsink_change_state): * gst/udp/gstmultiudpsink.h: * gst/udp/gstudp-marshal.list: * gst/udp/gstudp.c: (plugin_init): * gst/udp/gstudp.h: * gst/udp/gstudpsink.c: (gst_udpsink_get_type), (gst_udpsink_base_init), (gst_udpsink_class_init), (gst_udpsink_init), (gst_udpsink_set_uri), (gst_udpsink_set_property), (gst_udpsink_get_property), (gst_udpsink_uri_get_type), (gst_udpsink_uri_get_protocols), (gst_udpsink_uri_get_uri), (gst_udpsink_uri_set_uri), (gst_udpsink_uri_handler_init): * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), (gst_udpsrc_unlock), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Added multifdsink to send UDP to multiple addresses. Cleaned up UDP source/sink elements some more. Make UDP sink extends from multiudpsink. 2005-05-12 Tim-Philipp Müller * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event): Make queries actually work (update core first). 2005-05-12 Wim Taymans * gst/rtsp/README: * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get_type), (gst_tcpclientsrc_base_init), (gst_tcpclientsrc_class_init), (gst_tcpclientsrc_init), (gst_tcpclientsrc_getcaps), (gst_tcpclientsrc_stop), (gst_tcpclientsrc_eos), (gst_tcpclientsrc_create), (gst_tcpclientsrc_start): * gst/tcp/gsttcpclientsrc.h: * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get_type), (gst_tcpserversrc_base_init), (gst_tcpserversrc_class_init), (gst_tcpserversrc_init), (gst_tcpserversrc_create), (gst_tcpserversrc_start), (gst_tcpserversrc_stop): * gst/tcp/gsttcpserversrc.h: * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get_type), (gst_tcpsrc_base_init), (gst_tcpsrc_class_init), (gst_tcpsrc_init), (gst_tcpsrc_create), (gst_tcpsrc_start), (gst_tcpsrc_stop): * gst/tcp/gsttcpsrc.h: * gst/udp/gstudpsink.c: (gst_udpsink_base_init), (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), (gst_udpsink_set_property), (gst_udpsink_get_property), (gst_udpsink_change_state): * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Make UDP and TCP elements use PushSrc. 2005-05-11 Tim-Philipp Müller * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_src_query), (index_seek), (normal_seek), (gst_mad_sink_event): Port to new query API and replace gst_pad_convert() and gst_pad_get_formats() usage. gstid3tag looks like it needs some more love before it will work again, if not a rewrite. 2005-05-12 Zeeshan Ali * gst/effectv/Makefile.am: Fixed the effectv build again. 2005-05-11 Wim Taymans * gst/tcp/Makefile.am: * gst/tcp/gstmultifdsink.c: (gst_multifdsink_get_type), (gst_multifdsink_base_init), (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer), (gst_multifdsink_render), (gst_multifdsink_change_state): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcp.c: * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), (gst_tcpclientsink_base_init), (gst_tcpclientsink_class_init), (gst_tcpclientsink_init), (gst_tcpclientsink_render), (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property), (gst_tcpclientsink_change_state): * gst/tcp/gsttcpclientsink.h: * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), (gst_tcpclientsrc_init_receive): * gst/tcp/gsttcpplugin.c: (plugin_init): * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init): * gst/tcp/gsttcpserversink.h: * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init): * gst/tcp/gsttcpsink.c: (gst_tcpsink_get_type), (gst_tcpsink_base_init), (gst_tcpsink_class_init), (gst_tcpsink_setcaps), (gst_tcpsink_init), (gst_tcpsink_get_times), (gst_tcpsink_render), (gst_tcpsink_set_property), (gst_tcpsink_get_property): * gst/tcp/gsttcpsink.h: * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_class_init), (gst_tcpsrc_get): Ported over some sink elements. Sources not ported yet as they require a PushSource base class. 2005-05-11 Tim-Philipp Müller * gst/effectv/Makefile.am: * gst/videofilter/Makefile.am: Turn videofilter into a library (private for now) 2005-05-11 Wim Taymans * gst/rtsp/README: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play): * gst/rtsp/rtsp.h: * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_send), (read_line), (parse_request_line), (parse_line), (read_body), (rtsp_connection_receive), (rtsp_connection_free): * gst/rtsp/rtspconnection.h: * gst/rtsp/rtspdefs.c: (rtsp_find_method): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspmessage.c: (rtsp_message_set_body), (rtsp_message_take_body): * gst/rtsp/rtspmessage.h: * gst/rtsp/rtspstream.h: * gst/rtsp/sdpmessage.c: (sdp_parse_line): Added README Some cleanups. 2005-05-11 Wim Taymans * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Setup UDP sources correctly, receives raw data from RTSP compliant servers now. 2005-05-11 Wim Taymans * gst/rtsp/.cvsignore: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtsp.c: (plugin_init): * gst/rtsp/gstrtsp.h: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_get_type), (gst_rtspsrc_base_init), (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (gst_rtspsrc_create_stream), (rtspsrc_add_element), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_activate), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtsp.h: * gst/rtsp/rtspconnection.c: (rtsp_connection_open), (rtsp_connection_create), (append_header), (rtsp_connection_send), (read_line), (read_string), (read_key), (parse_response_status), (parse_line), (read_body), (rtsp_connection_receive), (rtsp_connection_close): * gst/rtsp/rtspconnection.h: * gst/rtsp/rtspdefs.c: (rtsp_init_status), (rtsp_method_as_text), (rtsp_header_as_text), (rtsp_status_as_text), (rtsp_status_to_string), (rtsp_find_header_field): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspmessage.c: (rtsp_message_new_request), (rtsp_message_init_request), (rtsp_message_new_response), (rtsp_message_init_response), (rtsp_message_init_data), (rtsp_message_add_header), (rtsp_message_remove_header), (rtsp_message_get_header), (rtsp_message_get_header_copy), (rtsp_message_set_body), (rtsp_message_set_body_copy), (rtsp_message_get_body), (rtsp_message_get_body_copy), (dump_mem), (dump_key_value), (rtsp_message_dump): * gst/rtsp/rtspmessage.h: * gst/rtsp/rtspstream.h: * gst/rtsp/rtsptransport.c: (rtsp_transport_new), (rtsp_transport_init), (parse_mode), (parse_range), (rtsp_transport_parse), (rtsp_transport_free): * gst/rtsp/rtsptransport.h: * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free): * gst/rtsp/rtspurl.h: * gst/rtsp/sdp.h: * gst/rtsp/sdpmessage.c: (sdp_message_new), (sdp_message_init), (sdp_message_clean), (sdp_message_free), (sdp_media_new), (sdp_media_init), (sdp_message_set_origin), (sdp_message_get_origin), (sdp_message_set_connection), (sdp_message_get_connection), (sdp_message_add_bandwidth), (sdp_message_add_time), (sdp_message_add_zone), (sdp_message_set_key), (sdp_message_get_key), (sdp_message_get_attribute_val), (sdp_message_add_attribute), (sdp_message_add_media), (sdp_media_add_attribute), (sdp_media_add_bandwidth), (sdp_media_add_format), (sdp_media_get_attribute_val), (read_string), (read_string_del), (sdp_parse_line), (sdp_message_parse_buffer), (print_media), (sdp_message_dump): * gst/rtsp/sdpmessage.h: * gst/rtsp/test.c: (main): Ported to 0.9. Set up transports, init UDP ports, init RTP session managers. 2005-05-11 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), (gst_rtpdec_class_init), (gst_rtpdec_init), (gst_rtpdec_chain_rtp), (gst_rtpdec_chain_rtcp), (gst_rtpdec_set_property), (gst_rtpdec_get_property), (gst_rtpdec_change_state), (gst_rtpdec_plugin_init): * gst/rtp/gstrtpdec.h: * gst/udp/gstudpsink.c: (gst_udpsink_base_init), (gst_udpsink_get_times), (gst_udpsink_render), (gst_udpsink_change_state): * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_loop), (gst_udpsrc_set_uri), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_init_receive), (gst_udpsrc_activate), (gst_udpsrc_change_state), (gst_udpsrc_uri_get_type), (gst_udpsrc_uri_get_protocols), (gst_udpsrc_uri_get_uri), (gst_udpsrc_uri_set_uri), (gst_udpsrc_uri_handler_init): * gst/udp/gstudpsrc.h: UDP fixes, added uri handler. Added rtpdec that will manage the RTP session in the future. 2005-05-10 Arwed v. Merkatz * PORTED_09: * configure.ac: * ext/Makefile.am: * ext/esd/Makefile.am: * ext/esd/esdsink.c: (gst_esdsink_get_type), (gst_esdsink_class_init), (gst_esdsink_init), (gst_esdsink_dispose), (gst_esdsink_change_state), (gst_caps_set_each), (gst_esdsink_getcaps), (gst_esdsink_open), (gst_esdsink_close), (gst_esdsink_write), (gst_esdsink_delay), (gst_esdsink_reset), (gst_esdsink_set_property), (gst_esdsink_get_property), (gst_esdsink_factory_init): * ext/esd/esdsink.h: * ext/esd/gstesd.c: (plugin_init): Ported esdsink plugin 2005-05-10 Wim Taymans * gst/udp/Makefile.am: * gst/udp/gstudpsink.c: (gst_udpsink_get_type), (gst_udpsink_base_init), (gst_udpsink_class_init), (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), (gst_udpsink_set_property), (gst_udpsink_get_property), (gst_udpsink_init_send), (gst_udpsink_close), (gst_udpsink_change_state): * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_loop), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_init_receive), (gst_udpsrc_close), (gst_udpsrc_activate), (gst_udpsrc_change_state): * gst/udp/gstudpsrc.h: Ported udp src/sink. 2005-05-09 Zaheer Abbas Merali * PORTED_09: * configure.ac: * ext/Makefile.am: * ext/shout2/Makefile.am: * ext/shout2/gstshout2.c: (gst_shout2send_get_type), (gst_shout2send_base_init), (gst_shout2send_class_init), (gst_shout2send_init), (gst_shout2send_event), (gst_shout2send_render), (gst_shout2send_set_property), (gst_shout2send_get_property), (gst_shout2send_setcaps), (gst_shout2send_change_state): * ext/shout2/gstshout2.h: Port shout2 plugin 2005-05-08 Zeeshan Ali * configure.ac: * ext/Makefile.am: * ext/libcaca/Makefile.am: * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), (gst_cacasink_class_init), (gst_cacasink_get_times), (gst_cacasink_setcaps), (gst_cacasink_init), (gst_cacasink_render), (plugin_init): * ext/libcaca/gstcacasink.h: Ported the libcaca plugin. 2005-05-08 Zeeshan Ali * configure.ac: * ext/mad/Makefile.am: * effectv/Makefile.am: Fixed a few things to enable the mad and effectv to be able to find the headers in the gst-plugins-base/gst-libs and to link against the libs in there. 2005-05-07 Zeeshan Ali * configure.ac: Fixed the build by fixing a small mistake of Wim. 2005-05-06 Wim Taymans * configure.ac: * ext/aalib/Makefile.am: * ext/aalib/gstaasink.c: (gst_aasink_get_type), (gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps), (gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render), (gst_aasink_set_property), (gst_aasink_get_property), (gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state): * ext/aalib/gstaasink.h: * gst/smpte/Makefile.am: * gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init), (gst_smpte_collected): * gst/smpte/gstsmpte.h: Ported 2 more plugins. usgly hack in the Makefile.am though, I'm sure someone will fix it. 2005-05-06 Christian Schaller * configure.ac: add sidplay * ext/Makefile.am: add sidplay * ext/sidplay/Makefile.am: add GST_PLUGINS_CFLAGS * ext/sidplay/gstsiddec.cc: remove bytestream.h 2005-05-06 Christian Schaller * configure.ac: add gst-plugins-libs 2005-05-06 Wim Taymans * configure.ac: * ext/sidplay/gstsiddec.cc: * ext/sidplay/gstsiddec.h: Ported sidplay. 2005-05-06 Christian Schaller * configure.ac: * ext/mad/Makefile.am: add linking of gstinterfaces * ext/mad/gstid3tag.c: (plugin_init): remove library_load * gst-plugins.spec.in: * gst/effectv/Makefile.am: link to libgstvideofilter * gst/effectv/gsteffectv.c: (plugin_init): same as for mad * gst/videofilter/Makefile.am: make sure videoflip is not built 2005-05-06 Wim Taymans * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_setcaps), (gst_alawdec_init), (gst_alawdec_chain): * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_setcaps), (gst_alawenc_init), (gst_alawenc_chain): * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_setcaps), (gst_mulawdec_init), (gst_mulawdec_chain): * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_setcaps), (gst_mulawenc_init), (gst_mulawenc_chain): Ported alaw and mulaw plugins to 0.9, fixed the negotiation as well. 2005-05-06 Christian Schaller * ext/alsa: removed plugins that are now in gst-plugins-base * ext/gnomevfs: * ext/theora: * ext/vorbis: * gst/adder: * gst/audioconvert: * gst/ffmpegcolorspace: * gst/typefind: * gst/videofilter: comment out videoflip and gamma plugins 2005-05-06 Christian Schaller * gst-libs: Remove all files as this is in gst-plugins-base now * gst-libs/README: add a remove informing of this move 2005-05-06 Christian Schaller * PORTED_09: update to add videofilter * configure.ac: re-add videofilter * gst/videofilter/Makefile.am: remove videobalance (not ported yet) * gst/videofilter/gstgamma.c: (gst_gamma_class_init): * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init): * gst/videofilter/gstvideofilter.c: (gst_videofilter_getcaps), (gst_videofilter_setcaps), (gst_videofilter_init), (gst_videofilter_chain), (gst_videofilter_set_output_size): * gst/videofilter/gstvideoflip.c: (gst_videoflip_class_init): 2005-05-06 Christian Schaller * ext/mad: ported plugin from threaded branch * gst/effectv: ported plugins from threaded branch * gst/law: enable law plugin as it compiles (Wim will fixor) 2005-05-06 Zaheer Abbas Merali * configure.ac: fix typo 2005-05-05 Christian Schaller * Update configure.ac and Makefiles to only build what is actually ported and not moved into gst-plugins-base 2005-02-22 Thomas Vander Stichele * configure.ac: hunting season on 0.9 is now OPEN 2005-02-22 Ronald S. Bultje * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): Kick the hell out of gcc for not warning me about a symbol conflict. 2005-02-22 Luca Ognibene Reviewed by: Tim-Philipp Müller * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link): Don't leak caps string (fixes #168134) * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init), (gst_jpegenc_init), (gst_jpegenc_finalize), (gst_jpegenc_change_state): Don't leak line buffers and context struct (fixes #168133). 2005-02-21 Tim-Philipp Müller * configure.ac: * ext/dirac/gstdiracdec.cc: (gst_diracdec_chain): Since dirac 0.5.0 the framerate in dirac is expressed as a rational number. Fix build and up requirement to 0.5.0, and also pass parameters to gst_diracdec_link in the right order (fixes #167959). 2005-02-21 Maciej Katafiasz * ext/faad/gstfaad.c: (gst_faad_sinkconnect), (gst_faad_chain): * ext/faad/gstfaad.h: TEH LONGEST DEBUGGING SESSION EVAR is over. Fix interaction with certain invalid muxed streams, where some packets will contain junk after decoder data. Partially fixes #149158. 2005-02-21 Jan Schmidt * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain): Make sure we only write to writable buffers 2005-02-20 Tim-Philipp Müller * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data): Do actually fix invalid RIFF fmt header values for alaw and mulaw audio instead of just saying so. * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): Give gst_riff_create_audio_caps_with_data() a chance to fix up broken format header fields before extracting any parameters from the header. (fixes #167633) 2005-02-19 Martin Holters Reviewed by: Tim-Philipp Müller * gst/audioconvert/bufferframesconvert.c: (buffer_frames_convert_link): Don't leak othercaps. (fixes #167878) 2005-02-19 Arwed v. Merkatz > * configure.ac: * ext/libvisual/visual.c: (gst_visual_srclink), (gst_visual_change_state): Support libvisual 0.2.0. 2005-02-18 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: (gst_jpegdec_chain): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_resync), (gst_jpegenc_chain): Use same rowstrides for I420 as used everywhere else. 2005-02-17 Tim-Philipp Müller * gst/avi/gstavidemux.c: (gst_avi_demux_invert): Declare variables at beginning of block and make gcc-2.95 happy (fixes # 167482, patch by Gergely Nagy). * gst/tcp/gsttcpclientsrc.c: * gst/tcp/gsttcpclientsrc.h: Move some includes into the header, so that struct sockaddr_in is defined when it should be defined on FreeBSD as well (fixes #167483). * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): Don't pass uninitialised values to setsockopt() here either. 2005-02-17 Luca Ognibene Reviewed by: Tim-Philipp Müller * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send): Don't pass uninitialised values to setsockopt(). (fixes #167704) 2005-02-16 Ronald S. Bultje * gst/playback/gstplaybin.c: (add_sink): Invert bin_add/link order to workaround deadlock in opt. 2005-02-15 Ronald S. Bultje * gst/modplug/gstmodplug.cc: Add missing break causing position queries to fail. 2005-02-15 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_pad_populate): Granpos can apparently be -1, which screws up calculations... 2005-02-16 Jan Schmidt * sys/ximage/ximagesink.c: (gst_ximagesink_chain), (gst_ximagesink_send_pending_navigation), (gst_ximagesink_navigation_send_event), (gst_ximagesink_finalize), (gst_ximagesink_init): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), (gst_xvimagesink_send_pending_navigation), (gst_xvimagesink_navigation_send_event), (gst_xvimagesink_finalize), (gst_xvimagesink_init): * sys/xvimage/xvimagesink.h: Use a mutex protected list to marshal navigation events into the stream thread from whichever thread sends them. 2005-02-15 Tim-Philipp Müller * gst/speed/demo-mp3.c: (time_tick_cb), (main): Display current position and track length; misc. clean-ups. * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query), (speed_init), (speed_chain): Add query function, so that the stream length and current position get adjusted when queried (note that current position queries may still be wrong if the audio sink returns values based on buffer timestamps instead of passing on the query). 2005-02-13 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), (gst_audio_convert_channels): create channel conversion matrix when linking * gst/audioconvert/.cvsignore: * gst/audioconvert/Makefile.am: * gst/audioconvert/channelmixtest.c: (main): add (ugly) test that ensures stereo <=> mono conversion works correctly 2005-02-13 Benjamin Otte * gst/audioconvert/gstchannelmix.h: include missing header file * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_fill_compatible): use same sign for both channels when converting to/from compatible channel. Previously used different signs made the signals cancel each other out and appear like silence. (fixes #167269) 2005-02-12 Tim-Philipp Müller * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/imgconvert.c: Convert to and from YV12 (fixes #156379). 2005-02-12 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), (gst_ximagesink_sink_link), (gst_ximagesink_change_state), (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_expose), (gst_ximagesink_set_property), (gst_ximagesink_finalize), (gst_ximagesink_init): Protect interface methods from chain and negotiation and vice versa (Fixes #166142). * sys/ximage/ximagesink.h: Add stream_lock. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_expose): Check for xcontext before trying to link. 2005-02-12 Tim-Philipp Müller * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_open): Don't send "Hey! You gave me a NULL pointer you naughty person" as error message when we can't open the DVD device (when dvdnav_open() fails, src->dvdnav is NULL, so dvdnav_err_to_string() will return the above). Send something more useful instead (fixes #167117). 2005-02-11 Julien MOUTTE * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put), (gst_xvimagesink_sink_link), (gst_xvimagesink_change_state), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_expose), (gst_xvimagesink_set_property), (gst_xvimagesink_finalize), (gst_xvimagesink_init): Protect interface methods from chain and negotiation and vice versa (Fixes #166142). Fix a possible bug of images in the buffer pool being discarded because we are looking at the wrong geometry. * sys/xvimage/xvimagesink.h: Add stream_lock. 2005-02-11 David Schleef * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer): Change uint to unsigned int. (fixes #167128) 2005-02-11 David Schleef * gst/librfb/Makefile.am: Testing stuff before committing is for wimps... and people with fast machines. Fix stupid mistake. 2005-02-11 David Schleef * configure.ac: Pull in librfb from my CVS tree, because it is too small and annoying to be separate. Move rfbsrc plugin to gst/. * ext/Makefile.am: * ext/librfb/Makefile.am: * ext/librfb/gstrfbsrc.c: * gst/librfb/Makefile.am: * gst/librfb/gstrfbsrc.c: * gst/librfb/rfb.c: * gst/librfb/rfb.h: * gst/librfb/rfbbuffer.c: * gst/librfb/rfbbuffer.h: * gst/librfb/rfbbytestream.c: * gst/librfb/rfbbytestream.h: * gst/librfb/rfbcontext.h: * gst/librfb/rfbdecoder.c: * gst/librfb/rfbdecoder.h: * gst/librfb/rfbutil.h: 2005-02-10 Tim-Philipp Müller * gst/speed/Makefile.am: * gst/speed/demo-mp3.c: (main): * gst/speed/filter.func: * gst/speed/gstspeed.c: (speed_link), (speed_parse_caps), (speed_class_init), (speed_init), (speed_chain_int16), (speed_chain_float32), (speed_chain), (speed_set_property), (speed_get_property), (speed_change_state): * gst/speed/gstspeed.h: Fix speed element and make it chain-based (fixes #156467), and make it handle more than one channel. 2005-02-10 Jan Schmidt * ext/dts/gstdtsdec.c: (gst_dtsdec_init), (gst_dtsdec_channels), (gst_dtsdec_handle_event), (gst_dtsdec_handle_frame), (gst_dtsdec_chain), (gst_dtsdec_change_state): * ext/dts/gstdtsdec.h: Don't clobber the stack constructing the channels array. Make the element chain-based. DTS tracks can now be played. 2005-02-09 Tim-Philipp Müller * gst-libs/gst/audio/multichannel.h: * gst-libs/gst/gconf/gconf.h: * gst-libs/gst/idct/idct.h: * gst-libs/gst/media-info/media-info-priv.h: * gst-libs/gst/play/play.h: * gst-libs/gst/resample/private.h: * gst-libs/gst/resample/resample.h: * gst-libs/gst/riff/riff-ids.h: * gst-libs/gst/video/video.h: * gst-libs/gst/video/videosink.h: Add G_BEGIN_DECLS and G_END_DECLS around headers where missing, so that they work when included from C++ code. 2005-02-09 David Schleef * testsuite/gst-lint: Check for non-statically scoped parent_class variables. This won't be a problem once plugins are loaded with RTLD_LOCAL. 2005-02-09 Ronald S. Bultje * ext/mplex/gstmplexibitstream.cc: gcc madness. 2005-02-09 Ronald S. Bultje * ext/ogg/gstogmparse.c: * gst/debug/gstnavigationtest.c: Die, thou faulty symbol pollutors (non-static parent_class). 2005-02-08 Ronald S. Bultje * ext/mplex/gstmplexibitstream.cc: Fix event handling (#165525). 2005-02-08 Ronald S. Bultje * ext/mikmod/gstmikmod.c: * gst/modplug/gstmodplug.cc: Add missing endianness to template (fixes #165509). 2005-02-08 Ronald S. Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_data): Fix wrong order of reading of optional bytes (#165290). 2005-02-08 Ronald S. Bultje * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): Implement FILLER event awareness. 2005-02-08 Ronald S. Bultje * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_convert): Fix track calculations (#166208). 2005-02-08 Gergely Nagy Reviewed by: Ronald S. Bultje * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_chain): * ext/libpng/gstpngenc.c: Fix byte-order, use proper fixed caps. Fixes #164197. 2005-02-08 Jan Schmidt * configure.ac: Add dvdlpcmdec * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_reset), (free_all_buffers), (gst_mpeg2dec_alloc_buffer): Don't push buffers if the src pad isn't negotiated yet. * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_buffer_to_default_format), (gst_audio_convert_buffer_from_default_format): Add support for 24-bit width. * gst/dvdlpcmdec/.cvsignore: * gst/dvdlpcmdec/Makefile.am: * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_get_type), (gst_dvdlpcmdec_base_init), (gst_dvdlpcmdec_class_init), (gst_dvdlpcm_reset), (gst_dvdlpcmdec_init), (gst_dvdlpcmdec_link), (gst_dvdlpcmdec_chain), (gst_dvdlpcmdec_change_state), (plugin_init): * gst/dvdlpcmdec/gstdvdlpcmdec.h: New decoder for rearranging DVD LPCM into our audio/x-raw-int format. Needs support for the channels maps if someone can find a DVD LPCM track with > 2 channels. * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont), (gst_dvd_demux_handle_discont), (gst_dvd_demux_get_audio_stream), (gst_dvd_demux_process_private): * gst/mpegstream/gstdvddemux.h: * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_init_stream), (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_handle_src_query): * gst/mpegstream/gstmpegdemux.h: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_reset), (gst_mpeg_parse_parse_packhead), (gst_mpeg_parse_loop), (gst_mpeg_parse_get_rate), (gst_mpeg_parse_convert_src), (gst_mpeg_parse_handle_src_query), (gst_mpeg_parse_handle_src_event): Use audio/x-dvd-lpcm for LPCM output. Add DTS output. 2005-02-08 Gergely Nagy Reviewed by: Ronald S. Bultje * gst/alpha/gstalphacolor.c: (gst_alpha_color_sink_link), (transform_rgb), (transform_bgr), (gst_alpha_color_chain): Add BGRA handling (#165736). 2005-02-08 Francis Labonte Reviewed by: Ronald S. Bultje * gst/law/alaw-decode.c: (alawdec_link): * gst/law/alaw-encode.c: (alawenc_link): * gst/law/mulaw-decode.c: (mulawdec_link): * gst/law/mulaw-encode.c: (mulawenc_link): Fix caps memleaks (#166600). 2005-02-08 Tim-Philipp Müller * ext/tarkin/mem.h: * ext/tarkin/wavelet.h: * ext/tarkin/yuv.h: * gst/ffmpegcolorspace/avcodec.h: Include "_stdint.h" instead of . Fixes build on systems that don't have stdint.h, like Solaris9 (fixes #166631). 2005-02-05 Ronald S. Bultje * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_clear), (gst_xvimagesink_change_state): Clear window on PAUSED->READY instead of READY->PAUSED. Stop Xv video (and thereby regenerate Xv colourkey) in clear() so that PLAY -> READY -> PLAY works (fixes #162504). 2005-02-05 Ronald S. Bultje * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_getcaps): Switch to list instead of range, since MJPEG-devices really just support decimations, not any size. 2005-02-05 Jan Schmidt * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_open_decoder), (gst_mpeg2dec_reset), (free_all_buffers), (gst_mpeg2dec_alloc_buffer), (handle_sequence): * ext/mpeg2dec/gstmpeg2dec.h: The libmpeg2 user-allocated buffer management is awkward, to say the least. Hopefully this fixes things. 2005-02-04 Andy Wingo * gst/audioconvert/bufferframesconvert.c (buffer_frames_convert_fixate): New function, fixates to 256 frames per buffer by default. (Much better than 1.) (buffer_frames_convert_init): Set the fixate function for both src and sink pad. (buffer_frames_convert_link): After success setting nonfixed caps, get the negotiated caps so we can know how many buffer-frames it will be. No idea how this worked at all before. 2005-02-05 Jan Schmidt * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), (gst_mpeg2dec_close_decoder), (put_buffer), (check_buffer), (free_buffer), (free_all_buffers), (gst_mpeg2dec_alloc_buffer), (handle_sequence), (handle_picture): * ext/mpeg2dec/gstmpeg2dec.h: Rearrange buffer tracking and refcounting and refactor a little for readability. 2005-02-04 Jan Schmidt * sys/v4l/gstv4l.c: (plugin_init): * sys/v4l/gstv4ljpegsrc.c: (gst_v4ljpegsrc_get_type), (gst_v4ljpegsrc_base_init), (gst_v4ljpegsrc_class_init), (gst_v4ljpegsrc_init), (gst_v4ljpegsrc_src_link), (gst_v4ljpegsrc_getcaps), (gst_v4ljpegsrc_get): * sys/v4l/gstv4ljpegsrc.h: * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_open), (gst_v4lsrc_src_link): * sys/v4l/v4l_calls.h: * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_palette_name), (gst_v4lsrc_get_fps): * sys/v4l/v4lsrc_calls.h: Add new v4ljpegsrc for handling the ov51x hacky "I'll give you jpeg inside rgb frames" driver. Don't error in the v4lsrc link function, just return REFUSED. 2005-02-03 Ronald S. Bultje * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), (gst_qcamsrc_open): Use GST_ELEMENT_ERROR, not g_warning, if open failed. 2005-02-02 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Change caps on MJPEG-B so it doesn't interfere with MJPEG/JPEG. 2005-02-02 Ronald S. Bultje * ext/raw1394/gstdv1394src.c: (gst_dv1394src_change_state): Reset negotiated state on PAUSED->READY. 2005-02-02 David Schleef * configure.ac: Put DEFAULT_AUDIOSINK in config.h and use whereever possible. (Fixes #165997) * examples/capsfilter/capsfilter1.c: (main): * examples/dynparams/filter.c: (create_ui): * examples/seeking/cdparanoia.c: (get_track_info), (main): * examples/seeking/chained.c: (main): * examples/seeking/seek.c: (make_mod_pipeline), (make_dv_pipeline), (make_wav_pipeline), (make_flac_pipeline), (make_sid_pipeline), (make_vorbis_pipeline), (make_mp3_pipeline), (make_avi_pipeline), (make_mpeg_pipeline), (make_mpegnt_pipeline): * examples/seeking/spider_seek.c: (make_spider_pipeline): * examples/switch/switcher.c: (main): * ext/dv/demo-play.c: (main): * ext/faad/gstfaad.c: (gst_faad_change_state): * ext/mad/gstmad.c: (gst_mad_chain): * ext/smoothwave/demo-osssrc.c: (main): * gst-libs/gst/gconf/gconf.c: (gst_gconf_set_string), (gst_gconf_render_bin_from_description), (gst_gconf_get_default_audio_sink), (gst_gconf_get_default_video_sink), (gst_gconf_get_default_audio_src), (gst_gconf_get_default_video_src), (gst_gconf_get_default_visualization_element): * gst/level/demo.c: (main): * gst/level/plot.c: (main): * gst/playback/gstplaybin.c: (gen_video_element), (gen_audio_element): * gst/playback/test.c: (gen_video_element), (gen_audio_element): * gst/playondemand/demo-mp3.c: (setup_pipeline): * gst/sine/demo-dparams.c: (main): * gst/spectrum/demo-osssrc.c: (main): * gst/speed/demo-mp3.c: (main): * gst/volume/demo.c: (main): * testsuite/embed/embed.c: (main): 2005-02-02 Jan Schmidt * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_class_init), (gst_tcpclientsink_finalize): * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), (gst_tcpclientsrc_finalize): * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), (gst_tcpserversink_init), (gst_tcpserversink_finalize): * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), (gst_tcpserversrc_init), (gst_tcpserversrc_finalize): Don't leak the hostname when shutting down. In tcpserversrc, take a copy of the default hostname. 2005-02-01 Ronald S. Bultje * ext/raw1394/gstdv1394src.c: (gst_dv1394src_iso_receive): Set caps to systemstream=TRUE. 2005-02-01 Ronald S. Bultje * testsuite/Makefile.am: Fix more OSX buildbots. 2005-02-02 Jan Schmidt * ext/mpeg2dec/gstmpeg2dec.c: Don't send things to NULL PAD_PEERs * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_chain): Copy-on-write the incoming buffer. * gst/mpegstream/gstdvddemux.h: * gst/mpegstream/gstmpegclock.h: * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), (normal_seek), (gst_mpeg_demux_handle_src_event): * gst/mpegstream/gstmpegdemux.h: * gst/mpegstream/gstmpegpacketize.h: * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_update_streaminfo), (gst_mpeg_parse_reset), (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead), (gst_mpeg_parse_loop), (gst_mpeg_parse_get_rate), (gst_mpeg_parse_convert_src), (gst_mpeg_parse_handle_src_query), (gst_mpeg_parse_handle_src_event), (gst_mpeg_parse_change_state): * gst/mpegstream/gstmpegparse.h: * gst/mpegstream/gstrfc2250enc.h: Various changes to the way time is computed that make seeking and total time estimation much better here. Use G_BEGIN/END_DECLS instead of __cplusplus * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): Use gst_buffer_stamp instead of only copying the TIMESTAMP 2005-02-01 Ronald S. Bultje * gst/subparse/gstsubparse.c: Fix OSX buildbot. 2005-01-31 Tim-Philipp Müller * ext/theora/theoraenc.c: (theora_buffer_from_packet), (theora_enc_chain), (theora_enc_change_state): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_chain), (gst_vorbisenc_change_state): * ext/vorbis/vorbisenc.h: Set granulepos and timestamp correctly for streams not starting at 0, taking into account the initial delay. 2005-01-31 Tim-Philipp Müller * gst/mpegstream/gstdvddemux.c: Add audio/x-dts to audio pad template caps 2005-01-30 David Schleef * ext/polyp/polypsink.c: (gst_polypsink_base_init), (create_context), (gst_polypsink_link): Fix silly endianness bug. Add some debugging. Remove float from caps; it doesn't work. Attempt to get remote audio working. 2005-01-29 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add 3IV2 fourcc. 2005-01-29 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream), (swap_line), (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): * gst/avi/gstavidemux.h: Invert DIB images. Fixes #132341. 2005-01-29 Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): D'oh, reference the palette data, not the palette structure. Fixes color distortion in #132341. 2005-01-29 Ronald S. Bultje * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): PAR can be non-fixed when not provided as argument (#162626). 2005-01-29 David Moore Reviewed by: Ronald S. Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_loop_header): Re-apply patch from #142272 that allows non-seekable sources, re-proposed by Daniel Drake . 2005-01-29 Ronald S. Bultje * gst/rtp/gstrtpgsmenc.c: (gst_rtpgsmenc_init): Use the src template for creating the src pad (#162330). 2005-01-29 Ronald S. Bultje * configure.ac: * ext/musepack/Makefile.am: * ext/musepack/gstmusepackdec.c: (gst_musepackdec_class_init), (gst_musepackdec_init), (gst_musepackdec_dispose), (gst_musepackdec_src_query), (gst_musepackdec_src_convert), (gst_musepack_stream_init), (gst_musepackdec_loop), (gst_musepackdec_change_state): * ext/musepack/gstmusepackdec.cpp: * ext/musepack/gstmusepackdec.h: * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek), (gst_musepack_reader_read), (gst_musepack_reader_seek), (gst_musepack_reader_tell), (gst_musepack_reader_get_size), (gst_musepack_reader_canseek), (gst_musepack_init_reader): * ext/musepack/gstmusepackreader.cpp: * ext/musepack/gstmusepackreader.h: Update to 1.1 API (#165446). 2005-01-28 Ronald S. Bultje * ext/Makefile.am: Unbreak buildbot. 2005-01-28 Andy Wingo * ext/dv/gstdvdec.c: Change the pixel aspect ratio of dvdec output to reflect a different dubious internet source. Add a reference and some commentary. 2005-01-28 Ronald S. Bultje * gst/playback/gststreamselector.c: (gst_stream_selector_init), (gst_stream_selector_get_caps), (gst_stream_selector_chain): * gst/playback/gststreamselector.h: Be more selective when we're redoing caps negotiation from within the chain function on a stream change. 2005-01-28 Ronald S. Bultje * configure.ac: * ext/Makefile.am: * ext/amrnb/Makefile.am: * ext/amrnb/amrnb.c: (plugin_init): * ext/amrnb/amrnbdec.c: (gst_amrnbdec_get_type), (gst_amrnbdec_base_init), (gst_amrnbdec_class_init), (gst_amrnbdec_init), (gst_amrnbdec_link), (gst_amrnbdec_chain), (gst_amrnbdec_state_change): * ext/amrnb/amrnbdec.h: * ext/amrnb/amrnbparse.c: (gst_amrnbparse_get_type), (gst_amrnbparse_base_init), (gst_amrnbparse_class_init), (gst_amrnbparse_init), (gst_amrnbparse_formats), (gst_amrnbparse_querytypes), (gst_amrnbparse_query), (gst_amrnbparse_handle_event), (gst_amrnbparse_reserve), (gst_amrnbparse_loop), (gst_amrnbparse_state_change): * ext/amrnb/amrnbparse.h: Add support for AMR-NB (mobile phone audio format; #155163, #163286). * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add AMR-NB/-WB raw formats. * ext/alsa/gstalsa.c: (gst_alsa_link): Keep valid time when changing format. * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse_trak): Add some more format-specific options (#140141, #143555, #155163). 2005-01-28 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup): Fix logic error in timing of subtitle stream synchronization. * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add skip-chunk, which is found in kodak-camera streams. 2005-01-27 Thomas Vander Stichele * po/LINGUAS: * po/vi.po: Adding Vietnamese translation (submitted by Clytie Siddall) 2005-01-27 Ronald S. Bultje * gst/playback/gstdecodebin.c: (try_to_link_1): Use realpad for signal. 2005-01-27 Ronald S. Bultje * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_base_init): Fix category so decodebin picks it up. 2005-01-27 Ronald S. Bultje * ext/mad/Makefile.am: * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_get_type), (gst_id3demux_bin_base_init), (gst_id3demux_bin_class_init), (gst_id3demux_bin_init), (gst_id3demux_bin_remove_pad), (found_type), (gst_id3demux_bin_change_state): * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), (gst_id3_tag_init), (gst_id3_tag_handle_event), (gst_id3_tag_src_link), (gst_id3_tag_chain), (gst_id3_tag_change_state), (plugin_init): * ext/mad/gstmad.h: Add id3demuxbin (which is a simple bin consisting of id3demux and typefind), take over rank from id3demux, remove typefind code from id3demux. Makes all broken mp3s that I know of work, and thereby fixes #152688. 2005-01-27 Edward Hervey Reviewed by: Ronald S. Bultje * ext/mad/gstmad.c: (gst_mad_src_event): * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): Allow seeks on audio pad, make mad forward those (#164826). * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): Set duration (#165335). 2005-01-27 Ronald S. Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), (gst_asf_demux_commit_taglist), (gst_asf_demux_process_comment), (gst_asf_demux_process_ext_content_desc), (gst_asf_demux_change_state), (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream), (gst_asf_demux_setup_pad): * gst/asfdemux/gstasfdemux.h: Improve metadata display, e.g. if the metadata comes before the streams are loaded (which is perfectly valid). 2005-01-27 Ronald S. Bultje * tools/gst-launch-ext-m.m: Fix AVI/ASF pipelines (#165340). 2005-01-26 Amaury Jacquot * ext/cairo/gsttextoverlay.c: include string.h and strings.h to fix build failure on amd64 2005-01-26 Tim-Philipp Müller * ext/mad/gstid3tag.c: (mad_id3_parse_latin1_string), (mad_id3_parse_comment_frame), (gst_mad_id3_to_tag_list): Check environment variables GST_ID3V2_TAG_ENCODING, GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated list of character encodings to force interpretation of non-unicode strings stored in an ID3v2 tag to a particular encoding. If none is specified, try to use current locale's encoding, then fall back to ISO-8859-1 (which will always succeed). (Resolves #149274) * gst/tags/gstid3tag.c: (gst_tag_from_id3_tag), (gst_tag_extract_id3v1_string), (gst_tag_list_new_from_id3v1): Check environment variables GST_ID3V1_TAG_ENCODING, GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated list of character encodings to use in case a string encountered in an ID3v1 tag is not valid UTF-8 already. If no encoding is specified, try to use the current locale's encoding, then fall back to ISO-8859-1 (which will always succeed). 2005-01-25 Benjamin Otte * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): - on half framerate, compute the rate in advance so the comparisons don't compare wrong values - don't use mad_synth/frame_mute anymore, this mirrors mad_decoder behaviour - don't use mad_header_decode anymore, mad_frame_decode does that automatically - when getting rid of consumed bytes, reset the stream's skiplen (fixes #163867) 2005-01-26 Jan Schmidt * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init) Use 1/2 a second for default max_discont, as PES streams from DVB seem to have larger spacings in the SCR. Fix a typo. 2005-01-25 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (group_commit): Notify delayed stream-info availability. 2005-01-26 Jan Schmidt * ext/a52dec/gsta52dec.c: (gst_a52dec_push), (gst_a52dec_handle_event), (gst_a52dec_chain): Add some debug output. Check that a discont has a valid time associated. * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), (gst_alsa_sink_loop): Ignore TAG events. A little extra debug for broken timestamps. * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop), (dvdnavsrc_change_state): Ensure we send a discont to engage the link before we send any other events. * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init), (dvdreadsrc_finalize), (_close), (_open), (_seek_title), (_seek_chapter), (seek_sector), (dvdreadsrc_get), (dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri): Handle URI of the form dvd://title[,chapter[,angle]]. Currently only dvd://title works in totem because typefinding sends a seek that ends up going back to chapter 1 regardless. * ext/mpeg2dec/gstmpeg2dec.c: * ext/mpeg2dec/gstmpeg2dec.h: Output correct timestamps and handle disconts. * ext/ogg/gstoggdemux.c: (get_relative): Small guard against a null dereference. * ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize), (gst_textoverlay_set_property): Free memory when done. Don't call gst_event_filler_get_duration on EOS events. Use GST_LOG and GST_WARNING instead of g_message and g_warning. * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init), (draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink), (gst_sw_srclink), (gst_smoothwave_chain): Draw solid lines, prettier colours. * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): Add a default palette that'll work for some movies. * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init), (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont), (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset): * gst/mpegstream/gstdvddemux.h: * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead): * gst/mpegstream/gstmpegparse.h: Use PTM/NAV events when for timestamp adjustment when connected to dvdnavsrc. Don't use many discont events where one suffices. * gst/playback/gstplaybasebin.c: (group_destroy), (gen_preroll_element), (gst_play_base_bin_add_element): * gst/playback/gstplaybasebin.h: Make sure we remove subtitles from the same bin we put them in. * gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip), (gst_subparse_buffer_format_autodetect), (gst_subparse_change_state): Fix some memleaks and invalid accesses. * gst/typefind/gsttypefindfunctions.c: (ogganx_type_find), (oggskel_type_find), (cmml_type_find), (plugin_init): Some typefind functions for Annodex v3.0 files * gst/wavparse/gstwavparse.h: GstRiffReadClass is the correct parent class. 2005-01-25 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data): Add extradata to huffyuv (fixes #165013). * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_vids_with_data): Fix extradata extraction if it is in the chunk size. 2005-01-25 Edward Hervey Reviewed by: Ronald S. Bultje * gst/effectv/gstquark.c: (gst_quarktv_class_init), (gst_quarktv_change_state), (gst_quarktv_dispose): Memory free'ing location fix (#164708). 2005-01-25 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (group_commit), (gen_preroll_element), (probe_triggered), (gen_source_element), (setup_source), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element): Don't block for streams. * gst/playback/gststreaminfo.c: (stream_info_change_state), (gst_stream_info_set_mute): Use gst_pad_set_active_recursive. 2005-01-25 Andy Wingo * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Fix compile for #ifndef HAVE_XVIDEO. 2005-01-24 Jeffrey C. Ollie reviewed by: Maciej Katafiasz * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_chain): * ext/gsm/gstgsmdec.h: * ext/gsm/gstgsmenc.c: (gst_gsmenc_init), (gst_gsmenc_chain): * ext/gsm/gstgsmenc.h: Fix rate to 8kHz as per spec, removes obscure errors when no rate was given by property. Add proper buffer timestamps and offsets. 2005-01-24 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data): Audio can be <8000Hz. 2005-01-22 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): Explicit state change to workaround refcount bugs. 2005-01-22 Ronald S. Bultje * gst/avi/gstavimux.c: (gst_avimux_write_tag), (gst_avimux_riff_get_avi_header): Fix... 2005-01-19 Ronald S. Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_element_data), (gst_riff_read_element_data): * gst-libs/gst/riff/riff-read.h: Add _peek version (req'ed in CDXA). * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init), (gst_cdxaparse_loop): Fix parsing in playbin. * gst/playback/gstdecodebin.c: (close_pad_link): Ignore current_ pads, they cause major annoyance. 2005-01-19 Ronald S. Bultje * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): Safety guard. 2005-01-19 Ronald S. Bultje * gst/avi/gstavimux.c: (gst_avimux_write_tag): Fix padding... 2005-01-19 Ronald S. Bultje * gst/matroska/ebml-read.c: (gst_ebml_read_buffer): Allow for 0-sized buffers. Fixes length query problems in starwars.mkv from the testsuite. 2005-01-19 Tim-Philipp Müller * gst/videobox/gstvideobox.c: (gst_video_box_copy_plane_i420), (gst_video_box_i420), (gst_video_box_chain): Fix row strides for I420 (fixes #163159) 2005-01-19 Ronald S. Bultje * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): MPEG2 has a useful rate property, so we can actually use that. For MPEG-1, continue using the bytes/time properties. 2005-01-19 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_template_caps): Add intel-h263. 2005-01-19 Ronald S. Bultje * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): Fail if caps negotiation fails. Should fix #162184, and should definately be in there regardless of it fixing the actual bug. * gst/avi/gstavimux.c: (gst_avimux_get_type), (gst_avimux_init), (gst_avimux_write_tag), (gst_avimux_riff_get_avi_header), (gst_avimux_riff_get_avix_header), (gst_avimux_riff_get_video_header), (gst_avimux_riff_get_audio_header), (gst_avimux_write_index), (gst_avimux_start_file), (gst_avimux_handle_event), (gst_avimux_change_state): * gst/avi/gstavimux.h: Refactor structure writing to use GST_WRITE_UINT macros, add metadata writing support. 2005-01-18 Ronald S. Bultje * gst/playback/gststreaminfo.c: (gst_stream_info_dispose): Elements may already be destroyed when this function is called. 2005-01-18 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_loop_header), (gst_qtdemux_handle_esds): More memory leak fixes (#149162). 2005-01-18 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_add_stream): Fix two memleaks. 2005-01-18 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): Argh... 2005-01-17 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): Fix off-by-one bug. Fixes warnings during playback of sincity.mp4 when fixating to six channels in Totem. 2005-01-17 Tim-Philipp Müller * ext/dvdread/dvdreadsrc.c: (get_next_cell_for): Fix compile warnings on Solaris 10 buildbot 2005-01-17 Tim-Philipp Müller * ext/dvdread/dvdreadsrc.c: (_read): Don't read beyond the last cell in a chapter (fixes invalid memory access) 2005-01-17 Tim-Philipp Müller * ext/dvdread/stream_labels.c: (dvdreadsrc_get_audio_stream_labels): Use NULL for an empty GList instead of g_list_alloc(); fix memory leaks; s/LCPM/LPCM/; use g_strdup_printf() instead of GString (easier to bulk free later) 2005-01-17 Gergely Nagy Reviewed by: Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps): Fix BGRA32 caps (#164209). 2005-01-17 Gergely Nagy Reviewed by: Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_pixfmt): alpha_mask can be RGBA/ABGR. Fixes #164265. 2005-01-17 Francis Labonte Reviewed by: Ronald S. Bultje * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer), (gst_mpeg2dec_alloc_buffer): * ext/mpeg2dec/gstmpeg2dec.h: Crop if decoding size is not the actual image size (#163676). 2005-01-17 Steve Baker Reviewed by: Ronald S. Bultje * gst/typefind/gsttypefindfunctions.c: (aiff_type_find), (svx_type_find), (sds_type_find), (ircam_type_find), (plugin_init): Add libsndfile typefind functions (#163309). 2005-01-17 Ronald S. Bultje * tools/gst-launch-ext-m.m: Add .aac, fix .m1v/.m2v (#163891). 2005-01-17 Ronald S. Bultje * ext/alsa/gstalsaclock.c: (gst_alsa_clock_wait): Sanity check, don't wait endlessly since the clock might not actually run at this point (which is a deadlock). Fixes #164069. 2005-01-16 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (probe_triggered): Of course, only pause if group is done... 2005-01-16 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (probe_triggered): Thread safety. 2005-01-16 Jan Schmidt * ext/swfdec/gstswfdec.c: (gst_swfdec_change_state): Don't return state change success when the parent failed. 2005-01-16 Ronald S. Bultje * gst/avi/gstavimux.c: (gst_avimux_handle_event): Free events (fix memleak in #162905). 2005-01-15 Gergely Nagy Reviewed by: Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_pixfmt): Fix for depth = 15. Fixes #161675. 2005-01-14 Ronald S. Bultje * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): Set FPS correctly, even for webcams and the like. * sys/v4l/v4l_calls.c: (gst_v4l_set_chan_norm): Don error on setting while capturing. 2005-01-14 Stephane LOEUILLET * ext/dv/gstdvdec.c: * gst/subparse/gstsubparse.c: (parse_mdvdsub): * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): I'm a bad boy. using /1001. to force C to do float division and not integer division (as it did in my last commit) Thanks to David I. Lehn for pointing this mistake. 2005-01-14 Ronald S. Bultje * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): Revert Johan´s 1.35->1.36 since it breaks compat. 2005-01-14 Stephane LOEUILLET * ext/dv/gstdvdec.c: * ext/libfame/gstlibfame.c: * gst/subparse/gstsubparse.c: (parse_mdvdsub): * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): replace framerate aproximations by their real value (24000/1001, 30000/1001, 60000/1001) Finish fixing bug #164049 2005-01-13 Thomas Vander Stichele * ext/ogg/gstoggmux.c: eos/bos debugging * gst/tcp/gstmultifdsink.c: * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcp.c: * gst/tcp/gsttcp.h: * gst/tcp/gsttcpclientsink.c: * gst/tcp/gsttcpclientsrc.c: * gst/tcp/gsttcpserversink.c: * gst/tcp/gsttcpserversrc.c: improve reusability of elements after state changes and errors make multifdsink throw away streamheaders when receiving new ones 2005-01-13 Ronald S. Bultje * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): Fix for if items are already in list... 2005-01-12 Benjamin Otte * gst/adder/gstadder.c: (gst_adder_loop): fix adder a bit so it doesn't screw up with events as much anymore 2005-01-12 Jan Schmidt * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link), (pixbufscale_scale), (gst_pixbufscale_chain): * ext/gdk_pixbuf/pixbufscale.h: Incorporate changes from Tim-Philipp Mueller to ensure rowstrides are calculated the same way as ffmpegcolorspace Use gst_buffer_stamp instead of copying TIMESTAMP manually, so that we pick up duration and offset also. 2005-01-11 Ronald S. Bultje * gst/avi/gstavimux.c: (gst_avimux_class_init), (gst_avimux_pad_unlink), (gst_avimux_release_pad): Reusability fixes. 2005-01-11 Ronald S. Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): Update flags when requested. 2005-01-11 Ronald S. Bultje * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): Fix dmix. 2005-01-11 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (gst_play_base_bin_init), (gst_play_base_bin_dispose), (probe_triggered), (new_decoded_pad), (gen_source_element), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init), (group_switch), (remove_sinks), (setup_sinks), (gst_play_bin_change_state): Implement group-switch signal for use in apps to clear metadata cache, clean up subtitle, add suburi property instead of # hack, some error-out fixes. 2005-01-11 Ronald S. Bultje * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): Debug. * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame): If we got a state change in the _get handler, don't return success. 2005-01-10 Stephane LOEUILLET * ext/jpeg/gstjpegdec.c: (gst_jpegdec_my_output_message), (gst_jpegdec_my_emit_message), (gst_jpegdec_init): Make jpegdec quiet on MJPEG decoding * gst/asfdemux/README: Fix mimetypes for MJPEG and H263 2005-01-10 Ronald S. Bultje * ext/theora/theoradec.c: (theora_dec_chain): Fix broken code generation by gcc by swapping arguments. * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): Fix \n in debug. 2005-01-10 Stephane LOEUILLET * TODO: delete this file, it is by far outdated * ext/alsa/gstalsa.1: remove * ext/alsa/gstalsa.c: (add_rates), (add_channels), (gst_alsa_caps), (gst_alsa_check_sample_rates), (gst_alsa_rates_probe), (gst_alsa_get_caps): Add HW probing for supported sample rates. Fixes #161704 2005-01-10 Ronald S. Bultje * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): Don't crash, biatch! :). 2005-01-10 Ronald S. Bultje * ext/musepack/gstmusepackreader.cpp: * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): Some work on tags - still doesn't work in playbin... * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): Handle events... 2005-01-10 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): Also shove tags on kid pads. 2005-01-10 Ronald S. Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): Don't bail on unknown events. * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): Don't crash on events before negotiation. * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): Send tags on pads, too. * gst/playback/gststreamselector.c: (gst_stream_selector_request_new_pad): Forward events on first pad if no input was selected yet. 2005-01-10 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (setup_substreams): Don't disable streamtype if the stream doesn't exist, since then playing a video after audio will disable both and nothing will happen. Fixes the testsuite. 2005-01-10 Ronald S. Bultje * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_interface_init), (gst_v4l_xoverlay_set_xwindow_id): * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_interface_init), (gst_v4l2_xoverlay_set_xwindow_id): Add debug categories, fix overlay disabling. 2005-01-10 Stephane LOEUILLET * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_get_caps): * ext/alsa/gstalsa.h: Add HW probing for period_count/size and buffer_size MIX/MAX Adjust default/user defined value if out of bounds Should fix bug #162024 2005-01-09 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event): Fix warning (#161191). 2005-01-09 Stephane LOEUILLET * ext/dvdread/stream_labels.c: (dvdreadsrc_get_audio_stream_labels): Fix warning (init the good variable in switch default) 2005-01-09 Koop Mast Reviewed by: Ronald S. Bultje * gst/tta/gstttaparse.c: (gst_tta_src_event): Fix gcc-2.95 compile (#163485). 2005-01-09 Ronald S. Bultje * configure.ac: * ext/flac/gstflacenc.c: (gst_flacenc_init), (gst_flacenc_seek_callback), (gst_flacenc_write_callback), (gst_flacenc_tell_callback), (gst_flacenc_chain), (gst_flacenc_change_state): * ext/flac/gstflacenc.h: Update for API change in flac-1.1.1. Update requirement in configure.ac. Fixes #162974. 2005-01-09 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (group_destroy): Remove hack to get rid of assert and get rid of unlinked signals properly. 2005-01-09 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (setup_source): Set source to NULL so that resources are free'ed. Fixes issues with playback of CDDA and similar device-accessing things. 2005-01-09 Ronald S. Bultje * testsuite/embed/Makefile.am: test->noinst, fix make test in buildbot. 2005-01-09 Stephane LOEUILLET * ext/dvdread/stream_labels.c: new file * ext/dvdread/stream_labels.h: new file * ext/dvdread/Makefile.am: * ext/dvdread/dvdreadsrc.c: (_seek_title): Extract audio stream label from DVD IFO files. It only dump them on the console for now, still have to make playbin aware of them. 2005-01-09 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (setup_source): Fix hanging subs. 2005-01-09 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), (gen_preroll_element), (remove_groups), (setup_subtitle), (gen_source_element), (setup_source): * gst/playback/gstplaybasebin.h: Multiple .sub files is just a stupid idea... Fix some threading mistakes. Interestingly, external .sub files cause playbin to hang, I don't know why... Parsing fixes contributed by François Kooman . 2005-01-09 Ronald S. Bultje * testsuite/embed/Makefile.am: Fix buildbot. 2005-01-09 Gergely Nagy Reviewed by: Ronald S. Bultje * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), (gst_pngenc_set_property): * ext/libpng/gstpngenc.h: Add compression level property (#163323). 2005-01-09 Ronald S. Bultje * configure.ac: * examples/capsfilter/capsfilter1.c: (main): * examples/seeking/spider_seek.c: (make_spider_pipeline): * ext/dvdread/Makefile.am: * ext/dvdread/demo-play: * ext/dvdread/demo-play.c: * gconf/gstreamer.schemas.in: * gst-libs/gst/gconf/gconf.c: * sys/v4l/TODO: * testsuite/Makefile.am: * testsuite/embed/Makefile.am: * testsuite/embed/embed.c: (cb_expose), (main): Remove all references to xvideosink, fix examples (#140845). * gst/playback/gstplaybasebin.c: (group_destroy): Apparently, disposal does not unlink - so do explicitely. * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): Add debug. 2005-01-09 Maciej Katafiasz * README: fix PKG_CONFIG_PATH instructions, what was there previously was breaking default search path, not nice. Fixes #163358 2005-01-09 Ronald S. Bultje * gst/audioscale/gstaudioscale.c: (gst_audioscale_init), (gst_audioscale_chain): %#^@^#@^@#^#@^#@^@#^@#^@#^@#^#@^#@^#@^@#^#@ fix seeking when resampling - how the ^@$^!@^! is this possible?!? 2005-01-09 Ronald S. Bultje * ext/alsa/gstalsa.c: (gst_alsa_change_state): Reset variables on READY. * gst/matroska/matroska-mux.c: (gst_matroska_mux_request_new_pad), (gst_matroska_mux_loop): Require data before writing header. 2005-01-09 Francis Labonte Reviewed by: Ronald S. Bultje * ext/mad/gstmad.c: (gst_mad_chain): Don't call mad_stream_sync() directly after recovering sync. Fixes #151661. 2005-01-09 Martin Eikermann Reviewed by: Ronald S. Bultje * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init), (snapshot_handler), (gst_snapshot_sinkconnect), (gst_snapshot_chain): Allocate resources when required, fix recursive signal emission and fix caps. Fixes #161667. 2005-01-09 Gergely Nagy Reviewed by: Ronald S. Bultje * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps), (gst_pngdec_chain): Handle only 8-bppc (bits-per-pixel-component) images, better error handling and correct strides. Fixes #163177. * ext/libpng/gstpngenc.c: (gst_pngenc_sinklink), (gst_pngenc_chain): Better error handling. Fixes #163348. 2005-01-09 Ronald S. Bultje * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_get_type), (dvdnavsrc_uri_get_type), (dvdnavsrc_uri_get_protocols), (dvdnavsrc_uri_get_uri), (dvdnavsrc_uri_set_uri), (dvdnavsrc_uri_handler_init): Add DVD-nav URI (dvdnav://) for Totem testing purposes. * gst/playback/gstplaybasebin.c: (gen_source_element): Add MMS to streaming URIs. 2005-01-09 Ronald S. Bultje * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_navigation_send_event): Check for pad availability before sending event. 2005-01-08 Ronald S. Bultje * gst-plugins.spec.in: Add subparse. 2005-01-08 Ronald S. Bultje * configure.ac: Since we use functions from CVS, up requirement. 2005-01-08 Ronald S. Bultje * gst/playback/Makefile.am: * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (group_destroy), (group_commit), (group_is_muted), (gen_preroll_element), (add_stream), (unknown_type), (probe_triggered), (preroll_unlinked), (mute_stream), (silence_stream), (new_decoded_pad), (setup_substreams), (setup_source), (get_active_source), (mute_group_type), (muted_group_change_state), (set_active_source), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), (play_base_eos), (gst_play_base_bin_change_state): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (add_sink), (setup_sinks): * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), (gst_stream_info_dispose), (stream_info_mute_pad), (stream_info_change_state), (gst_stream_info_set_mute): * gst/playback/gststreamselector.c: (gst_stream_selector_get_type), (gst_stream_selector_base_init), (gst_stream_selector_class_init), (gst_stream_selector_init), (gst_stream_selector_dispose), (gst_stream_selector_get_linked_pad), (gst_stream_selector_get_caps), (gst_stream_selector_link), (gst_stream_selector_get_linked_pads), (gst_stream_selector_request_new_pad), (gst_stream_selector_chain): * gst/playback/gststreamselector.h: Adding stream selection support plus required properties for applications to use this. Fully fixes #100931. 2005-01-08 Benjamin Otte * gst/games/gstpuzzle.c: (nav_event_handler): - handle nav events differently: forward every event no matter if it was handled or not. - translate events You can now cheat by using navigationtest ! puzzle and moving the mouse close to the edge of a tile. ;) 2005-01-08 Ronald S. Bultje * configure.ac: * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): * ext/ogg/gstogmparse.c: (gst_ogm_text_parse_get_type), (gst_ogm_text_parse_base_init), (gst_ogm_text_parse_init), (gst_ogm_parse_get_sink_querytypes), (gst_ogm_parse_sink_convert), (gst_ogm_parse_sink_query), (gst_ogm_parse_chain), (gst_ogm_parse_plugin_init): * ext/pango/gsttextoverlay.c: (gst_textoverlay_linkedpads), (gst_textoverlay_link), (gst_textoverlay_getcaps), (gst_textoverlay_event), (gst_textoverlay_video_chain), (gst_textoverlay_loop), (gst_textoverlay_init), (plugin_init): * ext/pango/gsttextoverlay.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_sync_streams), (gst_matroska_demux_parse_blockgroup), (gst_matroska_demux_subtitle_caps), (gst_matroska_demux_plugin_init): * gst/matroska/matroska-ids.h: * gst/playback/gstdecodebin.c: (close_pad_link): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), (gen_preroll_element), (remove_groups), (add_stream), (new_decoded_pad), (setup_subtitles), (gen_source_element), (setup_source): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gen_text_element), (setup_sinks): * gst/subparse/Makefile.am: * gst/subparse/gstsubparse.c: (gst_subparse_get_type), (gst_subparse_base_init), (gst_subparse_class_init), (gst_subparse_init), (gst_subparse_formats), (gst_subparse_eventmask), (gst_subparse_event), (gst_subparse_handle_event), (convert_encoding), (get_next_line), (parse_mdvdsub), (parse_mdvdsub_init), (parse_subrip), (parse_subrip_deinit), (parse_subrip_init), (parse_mpsub), (parse_mpsub_deinit), (parse_mpsub_init), (gst_subparse_buffer_format_autodetect), (gst_subparse_format_autodetect), (gst_subparse_loop), (gst_subparse_change_state), (gst_subparse_type_find), (plugin_init): * gst/subparse/gstsubparse.h: * gst/typefind/gsttypefindfunctions.c: (ogmtext_type_find), (plugin_init): Add subtitle support, .sub parser (supports SRT and MPsub), OGM text support, Matroska UTF-8 text support, deadlock fixes all over the place, subtitle awareness in decodebin/playbin and some fixes to textoverlay to handle subtitles in a stream correctly. Fixes #100931. 2005-01-08 Ronald S. Bultje * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): Check for pad availability before doing a query on it. 2005-01-08 Stephane LOEUILLET * ext/dv/gstdvdec.c: really fix bpp24/32 dvdec caps (classic rgba indeed) * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc): don't send text tags if they are empty (bis repetita) 2005-01-08 Stephane LOEUILLET * ext/dv/gstdvdec.c: remove unneeded comment from dvdec (related to DV 4CC codes in AVI files) moved them in gstreamer/docs/random/mimetypes * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc): don't send text tags if they are empty fix mem leak on error path * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/imgconvert.c: (img_get_alpha_info): * gst/ffmpegcolorspace/imgconvert_template.h: adds BGR32 and BGRA32 to ffmpegcolorspace (still bad colors, fixing it on next commit) helps with dvdec outputing BGR32 2005-01-08 Stephane LOEUILLET * ext/dv/gstdvdec.c: Fix audio caps i just broke (missing ',') * gst/matroska/matroska-mux.c: (gst_matroska_mux_get_type), (gst_matroska_mux_reset): Fix typo + add FIXME about old "x-gst-metadata" crap 2005-01-07 Stephane LOEUILLET * ext/dv/demo-play.c: (main): xvideosink -> xvimagesink * ext/dv/gstdvdec.c: change rgb 32/32 caps to 24/32 (no alpha) change nb of channels to be a list (2 or 4, not 2) change sample rate to be a list (32, 44.1, 48 kHz) not a range * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc): Add 'date/year' to extracted metadata list 2005-01-07 Ronald S. Bultje * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): The return value of fixate_to does not imply that the requested value was set, so don't assume. 2005-01-07 Gergely Nagy Reviewed by: Ronald S. Bultje * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: (gst_pngenc_base_init), (gst_pngenc_sinklink), (gst_pngenc_init), (gst_pngenc_chain): * ext/libpng/gstpngenc.h: Alpha support (encoder; #163161), mime fixage. 2005-01-07 Sebastien Cote Reviewed by: Ronald S. Bultje * ext/faac/gstfaac.c: (gst_faac_outputformat_get_type), (gst_faac_class_init), (gst_faac_init), (gst_faac_srcconnect), (gst_faac_set_property), (gst_faac_get_property): * ext/faac/gstfaac.h: Allow for ADTS output (#153434). 2005-01-07 Ronald S. Bultje * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): Fix against template (#150576). 2005-01-06 Benjamin Otte * gst/games/gstpuzzle.c: (draw_puzzle): don't draw a puzzle if either width or height of tiles would be 0. 2005-01-06 Benjamin Otte * gst/games/gstpuzzle.c: (gst_puzzle_get_type), (gst_puzzle_class_init), (gst_puzzle_finalize): no memleaks, please (gst_puzzle_create), (gst_puzzle_init), (gst_puzzle_set_property), (gst_puzzle_setup): change initialization code around so we don't reshuffle on resize (draw_puzzle): fix another stupid typo 2005-01-06 Benjamin Otte * gst/games/gstvideoimage.c: (copy_hline_YUY2): fix stupid typo that borked copying on YUY2 2005-01-06 Benjamin Otte * gst/games/gstpuzzle.c: (draw_puzzle): fix edges when image sizes aren't multiples of tile sizes 2005-01-06 Benjamin Otte * gst/games/gstpuzzle.c: (gst_puzzle_base_init): make RGB endianness work correctly (gst_puzzle_show), (gst_puzzle_swap), (gst_puzzle_move): refactor and fix race with initial shuffling (nav_event_handler): allow using the mouse to puzzle (draw_puzzle): insist on tiles having width and height as multiples of 4 to get clean YUV image handling * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), (gst_xvimagesink_handle_xevents), (gst_xvimagesink_buffer_alloc): s/DEBUG/LOG/ for common messages (gst_xvimagesink_navigation_send_event): fix mouse event translation to not include screen PAR * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): fix mouse event translation to actually work 2005-01-06 Stephane LOEUILLET * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc): Extract TrackNumber metadata + clean up code * gst/games/gstvideoimage.c: (gst_video_image_draw_rectangle): Hope this is the good fix (var used unitialised) 2005-01-06 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_chain): Only increment timestamp if it's valid. Fixes raw AAC streams. 2005-01-06 Benjamin Otte * configure.ac: * gst/games/Makefile.am: * gst/games/gstpuzzle.c: add a puzzle game with... * gst/games/gstvideoimage.c: * gst/games/gstvideoimage.h: ... full colorspace support (that includes YUV9 and RGB16)) stolen from videotestsrc and made into something that would be a nice library for a lot of other plugins. 2005-01-06 Stephane LOEUILLET * configure.ac: don't compile faad plugin if a RC of 2.0 is found Fixes #155346 (and FC1 buildbot) * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc): try to make Solaris compiler happier 2005-01-06 Paul Jack Reviewed by: Ronald S. Bultje * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): Fix segfault (#161667). 2005-01-05 Ronald S. Bultje * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): Fix framerate reporting. 2005-01-05 Stephane LOEUILLET * gst-libs/gst/riff/riff-ids.h: * gst/wavenc/riff.h: Add AMR (VBR and CBR) ids to riff.h audio codec list * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_ext_content_desc), (gst_asf_demux_process_object): Retrieve more tags from ASF files (Genre, AlbumTitle, Artist) 2005-01-05 Martin Eikermann Reviewed by: Ronald S. Bultje * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), (gst_dvd_demux_handle_discont): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), (gst_mpeg_demux_handle_discont): Recreate pads on new-media (#160730). * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_new_pad): Send discont even if manager changes timestamps (#161929). 2005-01-05 Sebastien Cote Reviewed by: Ronald S. Bultje * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16): Fix invalid memory access (#159211). 2005-01-05 Ronald S. Bultje * examples/gstplay/player.c: (main): Don't iterate. * examples/seeking/seek.c: (fixate), (make_playerbin_pipeline): Add visualizations. * ext/a52dec/gsta52dec.c: (gst_a52dec_push), (gst_a52dec_handle_frame): Set duration. * ext/dvdnav/gst-dvd: Add audioconvert. Fixes #161325. * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get): Explicitely case to gint64. Possible valgrind error. * gst-libs/gst/play/play.c: (caps_set), (setup_size), (gst_play_tick_callback), (gst_play_change_state), (gst_play_dispose), (gst_play_init), (gst_play_class_init), (gst_play_set_location), (gst_play_get_location), (gst_play_seek_to_time), (gst_play_set_data_src), (gst_play_set_video_sink), (gst_play_set_audio_sink), (gst_play_set_visualization), (gst_play_connect_visualization), (gst_play_get_framerate), (gst_play_get_all_by_interface), (gst_play_new): Use playbin. Fixes #139749 and #147744. * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags): Add genre tag. * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), (audioscale_get_type), (gst_audioscale_base_init), (gst_audioscale_class_init), (gst_audioscale_expand_caps), (gst_audioscale_getcaps), (gst_audioscale_fixate), (gst_audioscale_link), (gst_audioscale_get_buffer), (gst_audioscale_decrease_rate), (gst_audioscale_increase_rate), (gst_audioscale_init), (gst_audioscale_dispose), (gst_audioscale_chain), (gst_audioscale_set_property), (gst_audioscale_get_property), (plugin_init): Indent properly. * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): Fix LPCM. * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), (qtdemux_tag_add_gnre), (qtdemux_video_caps): Add more metadata (fixes #162656). 2005-01-05 Thomas Vander Stichele * configure.ac: back to cvs === release 0.8.7 === 2005-01-05 Thomas Vander Stichele * NEWS: * RELEASE: * configure.ac: releasing 0.8.7, "Hyperspace" 2005-01-05 Thomas Vander Stichele patch by: Tim-Philipp Müller * gst/playback/gstplaybasebin.c: Fix for #162924 - free caps after use, not before 2005-01-04 Thomas Vander Stichele patch by: Ronald Bultje * gst/playback/gstplaybasebin.c: * gst/wavparse/gstwavparse.c: Fix for #154773 - fixes playback of small .wav files 2005-01-03 Thomas Vander Stichele patch by: Ronald Bultje * gst/audioscale/gstaudioscale.c: Fix for #162819 - make audioscale reusable Fixes playback of more than one file with playbin/totem 2004-12-29 Thomas Vander Stichele * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/gstffmpegcodecmap.c: * gst/ffmpegcolorspace/imgconvert.c: clean up the mess that made me cry and avoid needless duplication 2004-12-29 Thomas Vander Stichele * gst/ffmpegcolorspace/imgconvert.c: give some indication of why we're segfaulting 2004-12-29 Ronald S. Bultje * configure.ac: Fix indentation, fix v4l2 plugin detection. * ext/Makefile.am: Fix libmms location (Maciej, use diff -u!). * ext/alsa/gstalsa.c: (gst_alsa_init): Initialize caps cache to NULL. * gst/playback/gstplaybin.c: (gst_play_bin_change_state): Only change state on audiosink if it exists. 2004-12-28 Maciej Katafiasz * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-demux.h: Fix Vorbis streams failing to decode in some files, where cluster_time isn't 0, because then it doesn't send codec_priv before actual data. Remove time-based test and replace it with marker set on beginning of new stream 2004-12-28 David Schleef Merge patch from Ronald fixing problems with streaming text. * ext/cairo/gstcairo.c: (plugin_init): * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), (gst_textoverlay_video_chain), (gst_textoverlay_loop), (gst_textoverlay_font_init), (gst_textoverlay_init), (gst_textoverlay_set_property): * ext/cairo/gsttextoverlay.h: 2004-12-27 David Schleef * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), (gst_textoverlay_video_chain), (gst_textoverlay_loop), (gst_textoverlay_font_init), (gst_textoverlay_init), (gst_textoverlay_set_property): Improvements to actually render text as white on black outline on video, including font selection and horizontal/vertical alignment. (Ronald's christmas present) * ext/cairo/gsttextoverlay.h: 2004-12-26 Stephane Loeuillet * ext/ogg/gstogg.c: * ext/ogg/gstogmparse.c: fix ogm[audio/video]parse plugin registration (riff won't load if bytestream is already loaded) 2004-12-24 Thomas Vander Stichele * gst/audioconvert/gstchannelmix.c: fix for GLIB < 2.4 2004-12-24 Thomas Vander Stichele * Makefile.am: * configure.ac: disable docs again until it actually passes make distcheck. 2004-12-24 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (qtdemux_type_get), (qtdemux_audio_caps): * gst/typefind/gsttypefindfunctions.c: (q3gp_type_find), (plugin_init): Add 3GP (variables name Q3GP because they can't start with a number). Add samr audio fourcc (used in .3gp files), decoder is work in progress. Also do a GST_WARNING instead of ERROR in case of unknown nodes, to decrease output. 2004-12-24 Thomas Vander Stichele * Makefile.am: really fix dist 2004-12-23 Thomas Vander Stichele * configure.ac: * ext/speex/gstspeexdec.h: * ext/speex/gstspeexenc.h: Fixes #158382. Make speex plugin compatible with both 1.0 and 1.1. Fix detection code in configure.ac 2004-12-23 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup): Save position, so that queries give proper return values. Don't know how this could ever have worked before... 2004-12-23 Thomas Vander Stichele * configure.ac: Put additional LAME check inside the conditional. Fixes #152339 2004-12-23 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan): Add some more debug. Fix logic error when setting movi offset while reading index. 2004-12-23 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): Add some debugging. Better detection of broken indexes and the accompanying index recovery. No infinite loops on state changes when we're still in our loopfunction. 2004-12-22 Ronald S. Bultje * configure.ac: Fix up. 2004-12-22 Archana Shah Reviewed by: Ronald S. Bultje * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_volume): Normalizing the value before setting (gst_sunaudiomixer_get_volume): Normalizing the value after getting. Fixes bug# 161980 2004-12-22 Christian Fredrik Kalager Schaller * Makefile.am: Make sure docs gets disted * docs/Makefile.am: Make sure all needed files get disted * gst-plugins.spec.in: latest updates 2004-12-22 Wim Taymans * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): Revert patch 1.38 as clock distribution over schedulers does not work correcly in the core yet. 2004-12-21 Stephane Loeuillet * sys/oss/README: remove this file, which predates my birth (and which content is by far outdated) 2004-12-20 Stefan Kost * Makefile.am: * configure.ac: * docs/Makefile.am: * docs/libs/Makefile.am: * docs/libs/gst-plugins-libs-docs.sgml: * docs/libs/gst-plugins-libs-sections.txt: * docs/libs/tmpl/gstgconf.sgml: * docs/upload.mak: * docs/version.entities.in: Added boilerplate gtk-doc files for plugin-libs documentation. 2004-12-19 Stephane Loeuillet * gst/auparse/gstauparse.c: fix int and float audio caps 2004-12-19 Ronald S. Bultje * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): g_assert() can be a macro, don't use #ifdef inside it. 2004-12-19 Edward Hervey Reviewed by: Ronald S. Bultje * gst/videorate/gstvideorate.c: (gst_videorate_blank_data), (gst_videorate_init), (gst_videorate_chain), (gst_videorate_change_state): Event handling (fixes #159986). 2004-12-19 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data): Add BLZ0 (Blizzard's version of DivX) fourcc. 2004-12-18 David Schleef * gst/tta/gstttadec.c: (gst_tta_dec_link): And yet another portability fix. 2004-12-18 David Schleef * gst/tta/ttadec.h: Disable some header code that isn't used and clearly isn't portable. 2004-12-18 David Schleef * gst/ffmpegcolorspace/imgconvert.c: (get_pix_fmt_info), (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), (avcodec_get_pix_fmt), (avpicture_layout), (avcodec_get_pix_fmt_loss), (avg_bits_per_pixel), (img_copy), (get_convert_table_entry), (img_convert), (img_get_alpha_info): Fix code to not use GCC extensions (and c99 extensions that Forte does not like.) 2004-12-19 Tim-Philipp Müller Reviewed by: Ronald S. Bultje * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), (gst_deinterlace_chain): Rowstride fixes. Fixes #161039. * gst/videocrop/gstvideocrop.c: (gst_video_crop_init), (gst_video_crop_get_property), (gst_video_crop_add_to_struct_val), (gst_video_crop_getcaps), (gst_video_crop_link), (gst_video_crop_i420), (gst_video_crop_chain), (gst_video_crop_change_state): Rework of negotiation. Actually works now. Fixes #158650. 2004-12-18 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_sint): That was very stupid. 2004-12-18 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup): Fix possible crasher. 2004-12-18 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_uint), (gst_matroska_ebmlnum_sint), (gst_matroska_demux_parse_blockgroup): Lace sizes can be zero. 2004-12-18 Ronald S. Bultje * ext/musepack/gstmusepackdec.cpp: Fetch error return values. Fixes #161624. * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): Really EOS. 2004-12-18 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index): Work for truncated (unfinished download etc.) files. Fixes #160514. 2004-12-18 Ronald S. Bultje * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): Fix for integer overflow. Makes #156001 not crash. Probably masks the real bug. 2004-12-17 Ronald S. Bultje * gst/ac3parse/gstac3parse.c: (plugin_init): Parsers never have ranks. Fixes #159651. 2004-12-17 Benjamin Otte * gst/playback/gstdecodebin.c: (compare_ranks): make sure the facotries are ordered the same every time even if they have the same rank by using the name * gst/playback/gstdecodebin.c: (find_compatibles): make sure we don't add factories to the list twice 2004-12-16 David Schleef * configure.ac: look for musepack headers as musepack/*.h (fixes #159847) * ext/musepack/gstmusepackdec.h: use * ext/musepack/gstmusepackreader.h: same 2004-12-17 Ronald S. Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_auds_with_data): Read extradata correctly (fixes #155879). 2004-12-16 David Schleef * gst/audioscale/gstaudioscale.c: allow passthru of >2 channel audio. does _not_ attempt or allow conversion unless channels is 1 or 2. 2004-12-16 Christian Fredrik Kalager Schaller * tools/gst-launch-ext-m.m: fix mpeg and vob pipelines 2004-12-16 David Schleef * gst/audioscale/gstaudioscale.c: the resample library only handles 1 or 2 channels. Change caps to compensate. 2004-12-16 Ronald S. Bultje * gst/matroska/matroska-demux.c: (aac_rate_idx), (aac_profile_idx), (gst_matroska_demux_audio_caps): Some MPEG-AAC hacks, because else it doesn't work... 2004-12-16 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_template_caps): Add h264. 2004-12-16 Ronald S. Bultje * gst-libs/gst/audio/Makefile.am: Try to fix buildbot. 2004-12-16 Thomas Vander Stichele * gst/tcp/gstmultifdsink.c: Clean up and uniformize debugging. 2004-12-16 Edward Hervey Reviewed by: Ronald S. Bultje * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), (gst_dvd_demux_reset), (gst_dvd_demux_change_state): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset), (gst_mpeg_demux_change_state): Reset on ready. Fixes 160276. 2004-12-16 Sebastien Cote Reviewed by: Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link): Fix memleak (#154815). 2004-12-16 James Bowes Reviewed by: Ronald S. Bultje * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init), (gst_musicbrainz_init), (gst_musicbrainz_chain), (gst_musicbrainz_set_property), (gst_musicbrainz_get_property): * ext/musicbrainz/gsttrm.h: Add support for using a proxy server when getting a trm id from the MusicBrainz database (#149613). 2004-12-16 Christophe Fergeau Reviewed by: Ronald S. Bultje * gst/playback/gstdecodebin.c: (new_pad), (close_link): * gst/playback/gstplaybasebin.c: (new_decoded_pad): Fix memleaks (#157233). 2004-12-16 Sebastien Cote Reviewed by: Ronald S. Bultje * gst-libs/gst/resample/resample.c: (gst_resample_close): * gst-libs/gst/resample/resample.h: * gst/audioscale/gstaudioscale.c: Fix memleak (#159215). 2004-12-16 Toni Willberg Reviewed by: Ronald S. Bultje * sys/oss/gstosselement.c: (gst_osselement_probe_caps): * sys/oss/oss_probe.c: (main): Check for mono/stereo support (similar to samplerate probing), fixes #159433. Also add missing copyright header to oss_probe.c. 2004-12-15 David Schleef * configure.ac: add audioresample and cairo plugins. Remove HAVE_MMX stuff, because it's not used. * ext/Makefile.am: same * ext/audioresample/Makefile.am: You are not ready for an audio resampling element based on audioresample. * ext/audioresample/gstaudioresample.c: * ext/audioresample/gstaudioresample.h: * ext/cairo/Makefile.am: You are not ready for overlay elements based on cairo. Don't look too closely, these elements kinda suck right now. * ext/cairo/gstcairo.c: new * ext/cairo/gsttextoverlay.c: new * ext/cairo/gsttextoverlay.h: new * ext/cairo/gsttimeoverlay.c: new * ext/cairo/gsttimeoverlay.h: new * gst-libs/gst/media-info/media-info-priv.h: fix compile problem with compilers that don't support variadic macros. 2004-12-15 Balamurali Viswanathan Reviewed by: David Schleef * sys/sunaudio/gstsunaudio.c: (plugin_init): Apply patch from Bala, registering sunaudiosrc (oops!), and cleaning up code a bit. Also ran indent-gst. * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_init), (gst_sunaudiosrc_change_state), (gst_sunaudiosrc_get), (gst_sunaudiosrc_setparams): 2004-12-14 David Schleef * gst/festival/gstfestival.c: (gst_festival_chain): Set the output rate to 16000. Should fix #160235. 2004-12-14 Zaheer Abbas Merali * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): Add typefinding for mpeg2 pes streams 2004-12-13 David Schleef * configure.ac: Applied patch from bug #143659, making default sources and sinks OS-dependent (for Solaris), and added code for OS/X. * gconf/gstreamer.schemas.in: use OS-dependent sinks in gconf. 2004-12-13 Stephane Loeuillet * gst-libs/gst/riff/riff-media.c: forgot to add h2.64 to avidemux template caps 2004-12-13 Stephane Loeuillet * gst/wavenc/riff.h: * gst-libs/gst/riff/riff-media.c: * gst-libs/gst/riff/riff-ids.h: * gst/avi/gstavimux.c add 4CC code for VideoSoft h264 in AVI (VSSH) fixes bug #160655 remove s323 from riff, it's quicktime specific :( 2004-12-13 Stephane Loeuillet * gst/asfdemux/README * gst/wavenc/riff.h * gst-libs/gst/riff/riff-ids.h * gst-libs/gst/riff/riff-media.c * gst/qtdemux/qtdemux.c: add new 4CC codes for h263 related codecs fixes partially bug #155163 2004-12-12 Christian Fredrik Kalager Schaller * configure.ac: Update polyaudio requirement to 0.7 * ext/polyp/polypsink.c: (create_stream): add patch from iain (158258) 2004-12-11 Zaheer Abbas Merali * gst/interleave/deinterleave.c: fix my name's spelling! :) 2004-12-11 Stephane Loeuillet * AUTHORS ChangeLog * gst/auparse/gstauparse.c * gst/interleave/deinterleave.c * gst/law/: alaw-decode.c alaw-encode.c mulaw-decode.c mulaw-encode.c * gst/oneton/gstoneton.c * sys/osxaudio/: gstosxaudioelement.c gstosxaudiosink.c gstosxaudiosrc.c * sys/osxvideo/: cocoawindow.h cocoawindow.m osxvideosink.h osxvideosink.m put the same mail address for Zaheer Abbas Merali everywhere 2004-12-10 Ronald S. Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_loop): Align by packetsize, and assert that we a packet available before playing. The first makes webstreams work (they often include trailing padding data in a packet), the second allows pausing a ASF stream in totem without getting demux errors afterwards. 2004-12-09 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (get_relative): Check for non-NULL before accessing member (end-of-chain). 2004-12-09 Ronald S. Bultje * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), (cdparanoia_set_property), (cdparanoia_get_property): * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), (dvdnavsrc_set_property), (dvdnavsrc_get_property): * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), (dvdreadsrc_init), (dvdreadsrc_set_property), (dvdreadsrc_get_property): * sys/vcd/vcdsrc.c: (gst_vcdsrc_class_init), (gst_vcdsrc_set_property), (gst_vcdsrc_get_property): Synchronize property names where not yet the case. Devices are now device=X, other versions are deprecated (but still exist). Also use g_free() unconditionally. * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (setup_source), (gst_play_base_bin_get_property): Expose source. 2004-12-09 Thomas Vander Stichele * configure.ac: move GCONF macro outside conditional for the am conditional. Fixes #160439 2004-12-08 David Schleef * tools/gst-visualise-m.m: Switch to elements that currently exist. 2004-12-08 Ronald S. Bultje * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain): We love wrong commas. 2004-12-08 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_src_query): Don't set DEFAULT, unsupported - makes length display incorrectly in some cases. 2004-12-07 Christian Fredrik Kalager Schaller * gst/monoscope/README: remove blurb about files being GPL * gst/monoscope/gstmonoscope.c: Change license field to LGPL * gst/monoscope/monoscope.c: Change license to BSD with explanation monoscope is now effectively LGPL licensed 2004-12-07 Christian Fredrik Kalager Schaller * gst/monoscope/README: Update information to be more correct * gst/monoscope/convolve.c: Relicense to LGPL * gst/monoscope/convolve.h: Relicense to LGPL 2004-12-06 Arwed v. Merkatz * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): set BUFFER_DURATION to correct values (mpeg1 audio frame length is fixed) * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link): set default_duration for mpeg1 audio 2004-12-06 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_close_audio): * ext/alsa/gstalsa.h: refactor big chunks of the core caps negotiation code to make it a lot faster, because people claim it's really slow (actually, just cache the getcaps when the device is opened) 2004-12-06 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_handle_event), (gst_a52dec_update_streaminfo), (gst_a52dec_handle_frame), (gst_a52dec_chain), (gst_a52dec_change_state), (plugin_init): * ext/a52dec/gsta52dec.h: Do something useful with timestamps. Make chain-based (since there's really no reason to be loopbased). * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Update current_byte/frame correctly. 2004-12-04 Ronald S. Bultje * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags), (gst_ape_demux_stream_init): Forward tags, too. 2004-12-04 Ronald S. Bultje * gst/apetag/apedemux.c: (gst_ape_demux_stream_init): Let's make sure we're done typefinding when detecting tags. 2004-12-03 Ronald S. Bultje * gst/matroska/ebml-read.c: (gst_ebml_read_class_init), (gst_ebml_read_init), (gst_ebml_read_use_event), (gst_ebml_read_element_id), (gst_ebml_peek_id), (gst_ebml_read_seek), (gst_ebml_read_skip), (gst_ebml_read_reserve), (gst_ebml_read_buffer), (gst_ebml_read_master): * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_contents), (gst_matroska_demux_loop_stream), (gst_matroska_demux_audio_caps): Disgustingly evil hack for working around INTERRUPT events and their extremely annoying habit of being a pain in the ass. We simply peek a cluster before reading any of it. 2004-12-03 Ronald S. Bultje * ext/musepack/gstmusepackdec.cpp: There's also floating point libmusepacks. 2004-12-03 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_chanpos_from_gst), (gst_faad_chanpos_to_gst), (gst_faad_chain): Set DURATION even if source buffer didn't. Also use increasing timestamps. * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data): Block_align can have larger values than 8192. 2004-12-02 Ronald S. Bultje * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link): * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link): * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link): * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link): Fix caps. 2004-12-01 Ronald S. Bultje * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): Fix logic bug. 2004-12-01 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_type_find): Yay, another one. 2004-12-01 Ronald S. Bultje * ext/esd/esdsink.c: (gst_esdsink_chain): Make error actually say something useful (fixes #156798). * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_template_caps): Add Intel Video 5.0 fourcc (IV50). 2004-12-01 Christophe Fergeau * ext/mad/gstmad.c: (mpg123_parse_xing_header): fix xing header detection on mono and stereo mp3 files. 2004-12-01 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): Don't crash on EMPTY caps (e.g. when the demuxer didn't recognize the contained stream). 2004-12-01 Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_srcconnect), (gst_faad_chain): Oops, remove debug. 2004-12-01 Sebastien Cote Reviewed by: Ronald S. Bultje * gst/law/alaw-decode.c: (alawdec_getcaps): * gst/law/mulaw-decode.c: (mulawdec_getcaps): Prevent warnings when negotiating caps (fixes #159338). 2004-12-01 Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Remove old leftover that shouldn't be there... 2004-12-01 Sebastien Cote Reviewed by: Ronald S. Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): Don't forward DISCONT events (fixes #159684). 2004-12-01 Ronald S. Bultje * gst/playback/gstplaybin.c: (remove_sinks), (setup_sinks): Unlink manually since sometimes bin disposal (and therefore pad unlinking) is delayed, which will cause a new media file to not be able to start playing instantly. 2004-11-29 Ronald S. Bultje * gst/playback/gststreaminfo.c: (stream_info_mute_pad): On mute of an unlinked stream, check for pad availability so we don't crash on unlinked pad. 2004-11-29 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), (gst_avi_demux_massage_index): Fix quite humiliating bug in omitting 0-sized index chunks but forgetting to count them for timestamps. 2004-11-29 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): Actually leave the loop if we failed to sync. Don't crash. 2004-11-28 Ronald S. Bultje * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream), (gst_dvd_demux_process_private): * gst/mpegstream/gstdvddemux.h: Fix crash (#159759). Doesn't work, though. :-(. 2004-11-28 Benjamin Otte * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): more overwriting protection due to modifying channels one by one instead of all at once 2004-11-28 Ronald S. Bultje * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_fill_normalize): Normalize using absolute values. 2004-11-28 Julien MOUTTE * configure.ac: * ext/Makefile.am: * ext/directfb/Makefile.am: * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_create), (gst_directfbvideosink_get_pixel_format), (gst_directfbvideosink_get_format_from_fourcc), (gst_directfbvideosink_fixate), (gst_directfbvideosink_getcaps), (gst_directfbvideosink_sink_link), (gst_directfbvideosink_change_state), (gst_directfbvideosink_chain), (gst_directfbvideosink_buffer_free), (gst_directfbvideosink_buffer_alloc), (gst_directfbvideosink_interface_supported), (gst_directfbvideosink_interface_init), (gst_directfbvideosink_navigation_send_event), (gst_directfbvideosink_navigation_init), (gst_directfbvideosink_set_property), (gst_directfbvideosink_get_property), (gst_directfbvideosink_finalize), (gst_directfbvideosink_init), (gst_directfbvideosink_base_init), (gst_directfbvideosink_class_init), (gst_directfbvideosink_get_type), (plugin_init): * ext/directfb/directfbvideosink.h: Adding a first version of directfbvideosink. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): Initializing some more. 2004-11-28 Benjamin Otte * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): walk the samples backwards if out_channels > in_channels so we don't overwrite data 2004-11-28 Ronald S. Bultje * gst/audioconvert/Makefile.am: * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), (gst_audio_convert_link), (gst_audio_convert_change_state), (gst_audio_convert_channels): * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_unset_matrix), (gst_audio_convert_fill_identical), (gst_audio_convert_fill_compatible), (gst_audio_convert_detect_pos), (gst_audio_convert_fill_one_other), (gst_audio_convert_fill_others), (gst_audio_convert_fill_normalize), (gst_audio_convert_fill_matrix), (gst_audio_convert_setup_matrix), (gst_audio_convert_passthrough), (gst_audio_convert_mix): * gst/audioconvert/gstchannelmix.h: Implement a channel mixer. 2004-11-28 Martin Soto * ext/alsa/gstalsasink.c (gst_alsa_sink_loop): * ext/alsa/gstalsa.h: * ext/alsa/gstalsa.c (gst_alsa_set_clock): Make alsasink actually honor gst_element_set_clock and use that clock instead of its internal one. 2004-11-27 Christophe Fergeau * gst/playback/gstplaybasebin.c: (setup_source): fixed a caps leak (gst_play_base_bin_change_state): nullify source and decoder when going from READY to NULL so that we don't try to do weird stuff with them when going from NULL to READY * gst/playback/gstplaybin.c: (gst_play_bin_init): use gst_object_unref instead of g_object_unref (gen_video_element), (gen_audio_element): more refcounting fixes, now it should be correct (gst_play_bin_change_state): don't call remove_sinks if we are currently disposing the object 2004-11-27 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): Don't forget bass if it's there. Else left channel is silent... 2004-11-27 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_loop), (gst_a52dec_change_state): Don't do sample adjusting anymore, we use float audio now. * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): Don't fixate to non-existing properties. 2004-11-27 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_change_state): Advertise that we can do surround sound. 2004-11-27 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_reneg): Add buffer-frames=0. * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get_type), (dvdreadsrc_init), (dvdreadsrc_get_event_mask), (dvdreadsrc_get_query_types), (dvdreadsrc_get_formats), (dvdreadsrc_srcpad_event), (dvdreadsrc_srcpad_query), (_seek_title), (_seek_chapter), (get_next_cell_for), (_read), (seek_sector), (dvdreadsrc_get), (dvdreadsrc_open_file), (dvdreadsrc_change_state), (dvdreadsrc_uri_get_type), (dvdreadsrc_uri_get_protocols), (dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri), (dvdreadsrc_uri_handler_init): * ext/dvdread/dvdreadsrc.h: Add seeking, querying for bytes, sectors, title, angle and chapter. Handle multiple chapters. Relicense to LGPL because Billy agreed on that (thanks Billy!). 2004-11-27 Christophe Fergeau * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_dispose): call parent dispose method 2004-11-27 Martin Soto * gst-libs/gst/audio/audioclock.c (gst_audio_clock_set_active) (gst_audio_clock_get_internal_time): Fix active <-> inactive transitions: ensure time value always grows and avoid abrupt value changes. 2004-11-27 Arwed v. Merkatz * configure.ac: * gst/tta/Makefile.am: * gst/tta/crc32.h: * gst/tta/filters.h: * gst/tta/gsttta.c: * gst/tta/gstttadec.c: * gst/tta/gstttadec.h: * gst/tta/gstttaparse.c: * gst/tta/gstttaparse.h: * gst/tta/ttadec.h: added TTA parser and decoder 2004-11-26 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (probe_triggered), (check_queue), (buffer_underrun), (buffer_running), (buffer_overrun), (gen_source_element), (setup_source): * gst/playback/gstplaybasebin.h: Implement buffering. Needs some more work. 2004-11-26 Ronald S. Bultje * ext/theora/theoradec.c: (theora_dec_chain): Fix ilog mask range overflow. 2004-11-26 Ronald S. Bultje * ext/alsa/gstalsa.c: (gst_alsa_get_caps): Don't omit the last (which in case of dmix is the only :) ) channel count. Don't set channels if <= 2. 2004-11-26 Christophe Fergeau * gst/playback/gstplaybin.c: (gen_video_element), (gen_audio_element): Removed 2 obsolete comments 2004-11-26 Stephane Loeuillet * ext/vorbis/oggvorbisenc.c * ext/vorbis/vorbisenc.c : change description fields of those plugins to differentiate them (pitivi show Encoders by description, they had the same one) 2004-11-25 Christophe Fergeau Reviewed by: Ronald S. Bultje * gst/playback/gstplaybin.c: (gst_play_bin_dispose), (gst_play_bin_set_property), (gen_video_element), (gen_audio_element): Refcounting fixes for provided audio-/videosinks. 2004-11-25 Ronald S. Bultje * gst/playback/gstplaybin.c: (gen_video_element), (gen_audio_element), (setup_sinks), (gst_play_bin_change_state): Don't reference all sinks, but only the video- and audiosinks. The vis. element should be disposed when we're done with it. We don't have any reason to keep it around. This fixes warnings when reusing playbin for playing multiple audio files with vis. enabled. Also release audio device on pause - idea stolen from Rhythmbox. 2004-11-25 Ronald S. Bultje * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push), (gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init): * ext/alsa/gstalsa.c: (gst_alsa_get_caps): * ext/alsa/gstalsaplugin.c: (plugin_init): * ext/dts/gstdtsdec.c: (gst_dtsdec_channels), (gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init): * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst), (gst_faad_chanpos_to_gst), (gst_faad_sinkconnect), (gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain), (gst_faad_change_state), (plugin_init): * ext/faad/gstfaad.h: * ext/vorbis/vorbis.c: (plugin_init): * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): * gst-libs/gst/audio/Makefile.am: * gst-libs/gst/audio/audio.c: (plugin_init): * gst-libs/gst/audio/multichannel.c: (gst_audio_check_channel_positions), (gst_audio_get_channel_positions), (gst_audio_set_channel_positions), (gst_audio_set_structure_channel_positions_list), (add_list_to_struct), (gst_audio_set_caps_channel_positions_list), (gst_audio_fixate_channel_positions): * gst-libs/gst/audio/multichannel.h: * gst-libs/gst/audio/testchannels.c: (main): * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_class_init), (gst_audio_convert_init), (gst_audio_convert_dispose), (gst_audio_convert_getcaps), (gst_audio_convert_parse_caps), (gst_audio_convert_link), (gst_audio_convert_fixate), (gst_audio_convert_channels): * gst/audioconvert/plugin.c: (plugin_init): Surround sound support. 2004-11-25 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): Fix position for discont if we're close as well. Nitpicking, but saves a few milliseconds of extra waiting or skipping. 2004-11-25 Ronald S. Bultje * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter): We sometimes need parsers for playback, so add those too. 2004-11-25 Ronald S. Bultje * configure.ac: * gst/apetag/Makefile.am: * gst/apetag/apedemux.c: (gst_ape_demux_get_type), (gst_ape_demux_base_init), (gst_ape_demux_class_init), (gst_ape_demux_init), (gst_ape_demux_get_src_formats), (gst_ape_demux_get_src_query_types), (gst_ape_demux_handle_src_query), (gst_ape_demux_get_event_mask), (gst_ape_demux_handle_src_event), (gst_ape_demux_handle_event), (gst_ape_demux_typefind_peek), (gst_ape_demux_typefind_get_length), (gst_ape_demux_typefind_suggest), (gst_ape_demux_typefind), (gst_ape_demux_parse_tags), (gst_ape_demux_stream_init), (gst_ape_demux_stream_data), (gst_ape_demux_loop), (gst_ape_demux_change_state): * gst/apetag/apedemux.h: * gst/apetag/apetag.c: (plugin_init): * gst/typefind/gsttypefindfunctions.c: (apetag_type_find), (plugin_init): APE v1/2 tag reader plus typefind function. 2004-11-25 Ronald S. Bultje * configure.ac: * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): Remove hacks for older core. Require newer core version accordingly. 2004-11-25 Ronald S. Bultje * gst/cdxaparse/Makefile.am: * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_get_type), (gst_cdxaparse_class_init), (gst_cdxaparse_init), (gst_cdxaparse_loop), (gst_cdxaparse_change_state), (plugin_init): * gst/cdxaparse/gstcdxaparse.h: * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_get_type), (gst_cdxastrip_base_init), (gst_cdxastrip_class_init), (gst_cdxastrip_init), (gst_cdxastrip_get_src_formats), (gst_cdxastrip_get_src_query_types), (gst_cdxastrip_handle_src_query), (gst_cdxastrip_get_event_mask), (gst_cdxastrip_handle_src_event), (gst_cdxastrip_strip), (gst_cdxastrip_sync), (gst_cdxastrip_handle_event), (gst_cdxastrip_chain), (gst_cdxastrip_change_state): * gst/cdxaparse/gstcdxastrip.h: SVCD/VCD header stripping separated from CDXA image parsing. * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), (plugin_init): Add VCD/SVCD header typefinding for VCD/SVCD. * sys/vcd/vcdsrc.c: (gst_vcdsrc_get_type), (gst_vcdsrc_base_init), (gst_vcdsrc_class_init), (gst_vcdsrc_init), (gst_vcdsrc_set_property), (gst_vcdsrc_get_property), (gst_vcdsrc_get_event_mask), (gst_vcdsrc_get_query_types), (gst_vcdsrc_get_formats), (gst_vcdsrc_srcpad_event), (gst_vcdsrc_srcpad_query), (gst_vcdsrc_get), (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), (gst_vcdsrc_change_state), (gst_vcdsrc_msf), (gst_vcdsrc_recalculate), (gst_vcdsrc_uri_get_type), (gst_vcdsrc_uri_get_protocols), (gst_vcdsrc_uri_get_uri), (gst_vcdsrc_uri_set_uri), (gst_vcdsrc_uri_handler_init): * sys/vcd/vcdsrc.h: Fix up, add seeking, querying, URI interface. Works in totem now. 2004-11-25 Thomas Vander Stichele * configure.ac: back to CVS === release 0.8.6 === 2004-11-25 Thomas Vander Stichele * NEWS: * RELEASE: * configure.ac: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: releasing 0.8.6, "IOU Love" 2004-11-23 Thomas Vander Stichele patch by: Ronald Bultje * gst/playback/gstplaybasebin.c: Fix unplayable files error handling. Fixes #158365 2004-11-23 Thomas Vander Stichele patch by: Ronald Bultje * gst/typefind/gsttypefindfunctions.c: Fix broken mp3 typefinding. Fixes #158375 2004-11-23 Thomas Vander Stichele patch by: Ronald Bultje * ext/ogg/gstoggdemux.c: Fix sync on broken files. Fixes #158976 2004-11-23 Thomas Vander Stichele patch by: Edward Hervey * ext/libpng/gstpngenc.c: Copy over buffer properties. Fixes #158832 2004-11-23 Thomas Vander Stichele patch by: Tim-Philipp Müller * ext/dvdread/dvdreadsrc.c: Fixes invalid reads (#158462) 2004-11-23 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: * sys/v4l/gstv4lsrc.h: * sys/v4l/v4lsrc_calls.c: Probe less and cache it. Fixes #159187. 2004-11-23 Thomas Vander Stichele * gst/videorate/gstvideorate.c: Handle all video formats. Fixes #159186. 2004-11-16 Jan Schmidt * gst/synaesthesia/gstsynaesthesia.c: (gst_synaesthesia_class_init), (gst_synaesthesia_init), (gst_synaesthesia_dispose), (gst_synaesthesia_finalize), (gst_synaesthesia_sink_link), (gst_synaesthesia_src_getcaps), (gst_synaesthesia_src_link), (gst_synaesthesia_chain), (gst_synaesthesia_change_state), (plugin_init): Fix up synaesthesia to work under different samplerates/ buffer sizes. Force 320x200 output, as that's the only thing the underlying synaesthesia implementation supports. Still needs to be made re-entrant. 2004-11-14 Ronald S. Bultje * configure.ac: Fix mpeg2enc configure check (similar to mplex check below). 2004-11-14 Koop Mast reviewed by: Ronald S. Bultje * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Fix for gcc-2.95 (fixes #158221). 2004-11-13 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): Re-add clock distribution hack (until new core is released). Fixes #158125. 2004-11-13 Arwed v. Merkatz * configure.ac: fix mplex configure check segfaulting on some systems (bug #140994) 2004-11-13 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait): add debugging * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): do a wait when we enter the loop func with no data available to write instead of getting into an 100% CPU loop by just returning and being called again by the scheduler 2004-11-13 Jan Schmidt * configure.ac: * ext/libvisual/visual.c: (gst_visual_get_type), (libvisual_log_handler), (gst_visual_getcaps), (gst_visual_srclink), (gst_visual_change_state), (make_valid_name), (plugin_init): Update libvisual to 0.1.7. Link in the debug handling to gstreamer * ext/smoothwave/Makefile.am: * ext/smoothwave/demo-osssrc.c: (main): * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init), (gst_smoothwave_init), (gst_smoothwave_dispose), (gst_sw_sinklink), (gst_sw_srclink), (gst_smoothwave_chain), (gst_sw_change_state), (plugin_init): * ext/smoothwave/gstsmoothwave.h: Make gstsmoothwave a working element in the 20th century. * gst/chart/gstchart.c: (gst_chart_init), (gst_chart_srcconnect): Fix incorrect link function 2004-11-12 Ronald S. Bultje * gst/volume/gstvolume.c: Allow buffer-frames=0. 2004-11-12 Iain * configure.ac: Check for polypaudio * ext/Makefile.am: Build the polyp dir * ext/polyp: The polypsink sources. 2004-10-30 Iain * gst/interleave/interleave.c (interleave_unlink): Change the src pads caps to reflect the new number of channels. 2004-11-12 Ronald S. Bultje * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): Fix for negotiation order problem. This would show when the ALSA loopfuction was called before any other function. ALSA wouldn't do anything because we're not negotiated yet, leading to an infinite loop. Showed in e.g. Rhythmbox. Fixes #158006. 2004-11-11 Tim-Philipp Müller reviewed by: Ronald S. Bultje * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): No warnings (#157986). 2004-11-11 Ronald S. Bultje * gst/typefind/gsttypefindfunctions.c: (plugin_init): Prefer apev1/2 and id3v1 (at end of file) over musepack. 2004-11-11 Ronald S. Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_loop_stream): Signal no-more-pads (so it works in playbin). 2004-11-11 Ronald S. Bultje * ext/musepack/gstmusepackreader.cpp: Workaround for older core. 2004-11-11 Ronald S. Bultje * gst/ffmpegcolorspace/imgconvert.c: (yuv420p_to_yuv422): Actually test for odd width/height rather than testing whether a temporary variable that was 0 before we subtracted 1 is now not equal to zero (which it always is). 2004-11-11 Zaheer Abbas Merali * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): Fix compilation if HAVE_XVIDEO is not defined 2004-11-11 Zaheer Abbas Merali * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): Fix compilation if HAVE_XVIDEO is not defined 2004-11-11 Jan Schmidt * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), (gst_goom_dispose), (gst_goom_sinkconnect), (gst_goom_chain), (gst_goom_change_state), (plugin_init): Use the bytestream adapter so goom doesn't depend on the input buffer size. Add a debug category 2004-11-11 Ronald S. Bultje * ext/alsa/gstalsa.c: (gst_alsa_change_state): Only set hardware parameters *after* negotiation. Before negotiation, it will set ANY and that seems to cause crashes (see e.g. #151288, #153227). 2004-11-10 Ronald S. Bultje * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): This seems to be antique leftover. It needs to pass error checking. * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), (gst_sdlvideosink_deinitsdl), (gst_sdlvideosink_initsdl), (gst_sdlvideosink_destroy), (gst_sdlvideosink_create), (gst_sdlvideosink_sinkconnect), (gst_sdlvideosink_chain): Fix GstXOverlay implementation (#151059). 2004-11-10 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): Don't assert (#157853). 2004-11-10 Ronald S. Bultje * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), Fix bytes/samples confustion. (gst_alsa_sink_mmap), (gst_alsa_sink_loop): Fix for underrun (#144389). 2004-11-09 Ronald S. Bultje * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): Disable halfway-seek for pending release (since it needs a new core release). 2004-11-09 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: * sys/v4l/gstv4lsrc.h: * sys/v4l/v4lsrc_calls.c: add autoprobe-fps property so we can separate autoprobing parts 2004-11-09 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: * sys/v4l/v4lsrc_calls.c: initialise fourcc to catch unset fourcc's, and debug 2004-11-09 Wim Taymans * gst/playback/README: * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): * gst/playback/gstplaybin.c: (gst_play_bin_init), (gst_play_bin_dispose), (gst_play_bin_set_property), (remove_sinks), (setup_sinks), (gst_play_bin_change_state), (gst_play_bin_get_event_masks), (gst_play_bin_send_event), (gst_play_bin_get_formats), (gst_play_bin_convert), (gst_play_bin_get_query_types), (gst_play_bin_query): Cleanups and some more documentation. 2004-11-09 Jan Schmidt * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), (gst_cacasink_init), (gst_cacasink_chain): * ext/libcaca/gstcacasink.h: Cacasink inherits from VideoSink, so let that store the clock. 2004-11-09 Wim Taymans * gst/playback/README: * gst/playback/gstplaybasebin.c: (group_destroy), (group_is_muted), (add_stream), (unknown_type), (add_element_stream), (no_more_pads), (probe_triggered), (preroll_unlinked), (new_decoded_pad), (gst_play_base_bin_change_state), (gst_play_base_bin_found_tag): * gst/playback/gstplaybin.c: (gen_vis_element), (remove_sinks), (setup_sinks): * gst/playback/gststreaminfo.c: (gst_stream_info_set_mute), (gst_stream_info_is_mute), (gst_stream_info_set_property): * gst/playback/gststreaminfo.h: Updated README. Only switch groups if all streams have muted (EOSed). Send Tags in sync with the stream playback instead of in the playback/preroll phase. Some cleanups, free the fakesrc elements. 2004-11-09 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_get_caps_internal): buffer-frames property was missing * ext/arts/gst_arts.c: rate missing from sinkcaps * ext/audiofile/gstafparse.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/swfdec/gstswfdec.c: int audio doesn't know buffer-frames * ext/cdparanoia/gstcdparanoia.c: int audio doesn't know chunksize either * ext/nas/nassink.c: it's endianness, not endianess * gst-libs/gst/audio/audio.h: make float standard pad template caps really describe float * gst/law/mulaw.c: (linear_factory): signed only, please * gst/mpegstream/gstdvddemux.c: widths of 20 are not valid 2004-11-08 Thomas Vander Stichele Submitted by: Luca Ferretti * po/LINGUAS: * po/it.po: Add Italian 2004-11-08 Wim Taymans * gst/playback/README: * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): * gst/playback/gstplaybasebin.c: (probe_triggered), (gst_play_base_bin_change_state): Updated README, added more comments for fixmes etc.. 2004-11-08 Wim Taymans * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): We can remove this hack now. 2004-11-08 Wim Taymans * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_ayuv), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_blend_buffers), (gst_videomixer_loop): Only mix AYUV for maximum quality. 2004-11-08 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (get_relative), (gst_ogg_demux_src_query), (gst_ogg_demux_push), (gst_ogg_pad_push): Let's act as if we're synchronized now! :). * ext/theora/theoradec.c: (theora_dec_chain): Add some debug. 2004-11-08 Wim Taymans * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), (gst_alpha_set_property), (gst_alpha_sink_link), (gst_alpha_set_ayuv), (gst_alpha_set_i420), (gst_alpha_chroma_key_ayuv), (gst_alpha_chroma_key_i420), (gst_alpha_init_params), (gst_alpha_chain): Implement alpha functions for AYUV too, this increases accuracy quite a bit. 2004-11-08 Wim Taymans * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_caps_remove_format_info): * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), (shrink12), (img_get_alpha_info), (deinterlace_line), (deinterlace_line_inplace): * gst/ffmpegcolorspace/imgconvert_template.h: Added AYUV colorspace and handle RGBA a bit more respectful. 2004-11-08 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): Actually always send a discont (cornercase when resending the same serial-tagged chain twice). 2004-11-08 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear), (gst_ximagesink_finalize): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_finalize): Some more cleanups, leaks fixed and checks. 2004-11-08 Wim Taymans * gst/typefind/gsttypefindfunctions.c: (aac_type_find): Don't segfault on NULL data. 2004-11-08 Wim Taymans * gst/playback/gstdecodebin.c: (unlinked): * gst/playback/gstplay-marshal.list: * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (gst_play_base_bin_init), (group_create), (get_active_group), (get_building_group), (group_destroy), (group_commit), (queue_overrun), (remove_groups), (add_stream), (unknown_type), (add_element_stream), (no_more_pads), (probe_triggered), (preroll_unlinked), (new_decoded_pad), (removed_decoded_pad), (state_change), (setup_source), (gst_play_base_bin_get_property), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), (gst_play_base_bin_link_stream), (gst_play_base_bin_get_streaminfo): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gst_play_bin_class_init), (remove_sinks), (setup_sinks), (gst_play_bin_change_state): Add support for chained ogg files. Prepare for playlist support. This patch introduces the concept of pad groups, which together compose one playable media file. 2004-11-07 David Schleef * testsuite/gst-lint: Check for pad templates that aren't statically scoped. 2004-11-07 Ronald S. Bultje * configure.ac: * ext/Makefile.am: * ext/musepack/Makefile.am: * ext/musepack/gstmusepackdec.cpp: * ext/musepack/gstmusepackdec.h: * ext/musepack/gstmusepackreader.cpp: * ext/musepack/gstmusepackreader.h: Add musepack decoder. * ext/faad/gstfaad.c: (gst_faad_base_init): Make pad templates static. * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), (plugin_init): Add musepack typefinder, make mp3 typefinding work halfway stream, which doesn't actually work yet because id3demux doesn't implement _get_length(). 2004-11-07 Ronald S. Bultje * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop): Fix interrupt event handling (#144436). 2004-11-07 Ronald S. Bultje * ext/mad/gstid3tag.c: (gst_id3_tag_do_typefind): Hide unused glory. 2004-11-06 Tim-Philipp Müller reviewed by: Ronald S. Bultje * ext/vorbis/vorbisenc.c: (raw_caps_factory): Fix weird caps (#157548). 2004-11-06 Tim-Philipp Müller Reviewed by: Ronald S. Bultje * gst/rtp/gstrtpgsmparse.c: (gst_rtpgsm_caps_nego): Add missing NULL terminator (#157543). 2004-11-05 Thomas Vander Stichele * gst/tcp/gsttcp.h: * gst/tcp/gsttcpclientsink.c: * gst/tcp/gsttcpclientsrc.c: * gst/tcp/gsttcpserversink.c: * gst/tcp/gsttcpserversrc.c: ports can go up to 65535. Move common defines to gsttcp.h 2004-11-05 Wim Taymans * gst/videotestsrc/videotestsrc.c: (paint_setup_Y41B), (paint_hline_Y41B), (paint_setup_Y42B), (paint_hline_Y42B): Added two more colorspaces. 2004-11-05 Wim Taymans * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), (yuv422p_to_yuv422), (yuv420p_to_yuv422), (shrink12), (img_convert), (deinterlace_line), (deinterlace_line_inplace): More stride fixes. 2004-11-05 Wim Taymans * gst/alpha/gstalpha.c: (gst_alpha_set_property), (gst_alpha_add), (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain): * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), (gst_videomixer_blend_buffers), (gst_videomixer_loop): More stride fixes. 2004-11-05 Benjamin Otte * ext/mad/gstmad.c: (gst_mad_chain): don't overflow data buffer. Flush not needed sync data when syncing failed. 2004-11-04 Wim Taymans * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), (gst_alpha_get_property), (gst_alpha_add), (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain), (gst_alpha_change_state): Updated the chroma keying algorithm with something more sophisticated. 2004-11-03 Wim Taymans * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_blend_buffers), (gst_videomixer_loop): Fix stride issues. Does not completely work for odd heights. 2004-11-03 Wim Taymans * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), (gst_alpha_chroma_key), (gst_alpha_chain): Fix stride issues. Does not completely work for odd heights. 2004-11-03 Christophe Fergeau * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): * gst/videoscale/videoscale.c: (videoscale_find_by_structure): leak fixes 2004-11-03 Wim Taymans * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), (avpicture_alloc): * gst/ffmpegcolorspace/imgconvert_template.h: Use correct _fill function to get correct strides. 2004-11-02 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), (qtdemux_parse_udta), (qtdemux_tag_add), (gst_qtdemux_handle_esds): Change all g_print()s to debugging. Add a bunch of consistency checks. 2004-11-02 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), (try_to_link_1), (get_our_ghost_pad), (remove_element_chain), (unlinked), (no_more_pads), (close_link): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), (unknown_type), (add_element_stream), (new_decoded_pad), (removed_decoded_pad), (setup_source): * gst/playback/gststreaminfo.c: (gst_stream_info_get_type), (gst_stream_info_class_init), (gst_stream_info_init), (gst_stream_info_new), (gst_stream_info_dispose), (stream_info_mute_pad), (gst_stream_info_set_property), (gst_stream_info_get_property): * gst/playback/gststreaminfo.h: Fix playback of multiple files. a slightly different approach to handling dynamic pad removals. This one only looks at pads that we have linked. 2004-11-01 Christophe Fergeau * ext/ogg/gstoggdemux.c: (gst_ogg_demux_finalize): fix an "invalid free" warning from libc. 2004-11-01 Ronald S. Bultje * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), (get_unconnected_element), (remove_starting_from), (pad_removed), (close_link): Implement support for dynamic pad changing. We listen to "live" pad removals (i.e. while playing) and re-setup autoplugging after that. Playbasebin/playbin need some more work for this to finally work, but decodebin supports (and replugs) chained ogg now. 2004-11-02 Jan Schmidt * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_dispose), (gst_alsa_finalize): * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init), (gst_cdaudio_finalize): * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), (cdparanoia_finalize): * ext/divx/gstdivxdec.c: (gst_divxdec_dispose): * ext/divx/gstdivxenc.c: (gst_divxenc_dispose): * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), (dvdreadsrc_finalize): * ext/flac/gstflacdec.c: (gst_flacdec_class_init), (gst_flacdec_finalize): * ext/flac/gstflacenc.c: (gst_flacenc_class_init), (gst_flacenc_finalize): * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_class_init), (gst_gnomevfssink_finalize): * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_class_init), (gst_gnomevfssrc_finalize): * ext/libfame/gstlibfame.c: (gst_fameenc_class_init), (gst_fameenc_finalize): * ext/nas/nassink.c: (gst_nassink_class_init), (gst_nassink_finalize): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), (gst_sdlvideosink_class_init): * ext/sndfile/gstsf.c: (gst_sf_dispose): * gst-libs/gst/mixer/mixertrack.c: (gst_mixer_track_dispose): * gst-libs/gst/tuner/tunerchannel.c: (gst_tuner_channel_dispose): * gst-libs/gst/tuner/tunernorm.c: (gst_tuner_norm_dispose): * gst-libs/gst/xwindowlistener/xwindowlistener.c: (gst_x_window_listener_dispose): * gst/audioscale/gstaudioscale.c: * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init), (play_on_demand_finalize): * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose): * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): * sys/cdrom/gstcdplayer.c: (cdplayer_class_init), (cdplayer_finalize): * sys/glsink/glimagesink.c: (gst_glimagesink_finalize), (gst_glimagesink_class_init): * sys/oss/gstosselement.c: (gst_osselement_class_init), (gst_osselement_finalize): * sys/oss/gstosssink.c: (gst_osssink_dispose): * sys/oss/gstosssrc.c: (gst_osssrc_dispose): * sys/v4l/gstv4lelement.c: (gst_v4lelement_dispose): Fixes a bunch of problems with finalize and dispose functions, either assumptions that dispose is only called once, or not calling the parent class dispose/finalize function 2004-11-01 Stefan Kost * ext/esd/esdsink.c: (gst_esdsink_init), (gst_esdsink_link): added two api precondition guards use g_strdup with getenv to fix crash when using ENVVAR 2004-11-01 Jan Schmidt * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_finalize): Use a finalize function, not dispose, and more importantly, call the parent class finalize function too 2004-11-01 Johan Dahlin * ext/ogg/gstoggdemux.c: * gst/tags/gstvorbistag.c: Plug leaks. 2004-10-31 Benjamin Otte * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): lotsa memleaks today. But they're all small... 2004-10-31 Benjamin Otte * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): another memleak crushed 2004-10-31 Benjamin Otte * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): fix memleak 2004-10-31 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): Hack to prevent crash when going to READY inside signal handler while this function is active. 2004-10-31 Ronald S. Bultje * gst/ffmpegcolorspace/Makefile.am: * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/common.h: * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): * gst/ffmpegcolorspace/dsputil.h: * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_get_palette), (gst_ffmpeg_set_palette), (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_smpfmt_to_caps), (gst_ffmpegcsp_codectype_to_caps), (gst_ffmpeg_caps_to_smpfmt), (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_caps_with_codectype), (gst_ffmpegcsp_avpicture_fill): * gst/ffmpegcolorspace/gstffmpegcodecmap.h: * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_get_type), (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), (gst_ffmpegcsp_get_property), (gst_ffmpegcolorspace_register): * gst/ffmpegcolorspace/imgconvert.c: (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), (avpicture_get_size), (avcodec_get_pix_fmt_loss), (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), (yuv422_to_yuv420p), (uyvy422_to_yuv420p), (uyvy422_to_yuv422p), (yuv422_to_yuv422p), (yuv422p_to_yuv422), (yuv422p_to_uyvy422), (uyvy411_to_yuv411p), (yuv420p_to_yuv422), (C_JPEG_TO_CCIR), (img_convert_init), (img_apply_table), (shrink41), (shrink21), (shrink12), (shrink22), (shrink44), (grow21_line), (grow41_line), (grow21), (grow22), (grow41), (grow44), (conv411), (gif_clut_index), (build_rgb_palette), (bitcopy_n), (mono_to_gray), (monowhite_to_gray), (monoblack_to_gray), (gray_to_mono), (gray_to_monowhite), (gray_to_monoblack), (avpicture_alloc), (avpicture_free), (is_yuv_planar), (img_convert), (get_alpha_info_pal8), (img_get_alpha_info), (deinterlace_line), (deinterlace_line_inplace), (deinterlace_bottom_field), (deinterlace_bottom_field_inplace), (avpicture_deinterlace): * gst/ffmpegcolorspace/imgconvert_template.h: * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): * gst/ffmpegcolorspace/mmx.h: * gst/ffmpegcolorspace/utils.c: (av_mallocz), (av_strdup), (av_fast_realloc), (av_mallocz_static), (av_free_static), (av_freep), (avcodec_get_context_defaults), (avcodec_alloc_context), (avcodec_init): Sync back from gst-ffmpeg. Deprecates ffcolorspace. Adds palette handling plus update from ffmpeg CVS. Large clean-up. 2004-10-31 Ronald S. Bultje * gst/playback/Makefile.am: We need the marshallers for decodebin, too. 2004-10-30 David Schleef * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Make quicktime typefinding work with 64-bit offsets. 2004-10-30 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event): Set EOS on the element when processing an EOS event. * ext/speex/gstspeexdec.h: * ext/speex/gstspeexenc.h: Only keep a const ptr to the mode * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data), (gst_riff_create_audio_template_caps): Allow WMAV3, with up to 6 channels. * gst/asfdemux/gstasfmux.c: (gst_asfmux_request_new_pad): Don't call gst_pad_set_event_function on a sink pad. * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_set_cur_audio), (gst_dvd_demux_set_cur_subpicture): Copy the explicit caps that were set across to the cur_* pads, instead of trying to use a possibly non-existent negotiated caps. Reset the type of subpicture pads to UNKNOWN after calling init_stream, so that the caps get set. 2004-10-29 Martin Pitt Reviewed by: Ronald S. Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): Don't touch buffer if it is of size 0 (fixes #151064). 2004-10-29 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push), (gst_ogg_pad_push): Synchronized discont handling. 2004-10-29 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), (gst_ogg_demux_push): Make seeking sort-of exact again (fixes #156387). 2004-10-29 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (unknown_type), (add_element_stream), (new_decoded_pad), (gst_play_base_bin_change_state): * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), (gst_stream_info_init), (gst_stream_info_new), (gst_stream_info_dispose), (gst_stream_info_get_property): * gst/playback/gststreaminfo.h: Make caps explicitely available. Makes testing for unsupported types possible. Improves error reporting. 2004-10-29 Ronald S. Bultje * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_buffer_to_default_format): Really don't touch read-only buffers (#156563). 2004-10-29 Sebastien Cote Reviewd by: Ronald S. Bultje * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): Fix memleak (#155223). 2004-10-29 Wim Taymans * gst/tcp/.cvsignore: * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type), (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), (is_sync_frame), (gst_multifdsink_new_client), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), (gst_multifdsink_get_property): * gst/tcp/gstmultifdsink.h: Added burst on connect sync_method, deprecated sync_clients, streamlined the sync code some more. 2004-10-29 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (thread_error), (setup_source), (gst_play_base_bin_change_state): Improve error reporting. 2004-10-28 Wim Taymans * gst/tcp/Makefile.am: * gst/tcp/fdsetstress.c: (mess_some_more), (run_test), (main): * gst/tcp/gstfdset.c: (nearest_pow), (resize), (ensure_size), (gst_fdset_new), (gst_fdset_free), (gst_fdset_set_mode), (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), (gst_fdset_wait): Added more locks around fdset structures. Fixed/reworked the poll array resizing code. Added stress test for fdset. 2004-10-28 Zaheer Abbas Merali * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): fix build 2004-10-28 Benjamin Otte * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): fix link function to always query channels and query width for floats * configure.ac: add equalizer dir * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), (gst_iir_equalizer_init), (gst_iir_equalizer_finalize), (arg_to_scale), (setup_filter), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), (plugin_init): add an equalizer 2004-10-27 Thomas Vander Stichele Submitted by: Kjartan Maraas * po/LINGUAS: * po/nb.po: Added Norwegian Bokmaal translation 2004-10-27 Ronald S. Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): Don't break on options (fixes #156488). 2004-10-27 Thomas Vander Stichele * configure.ac: * ext/cdaudio/Makefile.am: * sys/Makefile.am: fix build on older automake 2004-10-26 Wim Taymans * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): Allow a little margin when negotiating the framerate. 2004-10-26 Stefan Kost * gst/level/gstlevel.c: synchonised naming of pads and pad-templates 2004-10-26 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), (gst_ogg_demux_handle_event), (_find_chain_get_unknown_part), (_find_streams_check), (gst_ogg_demux_push): Fix EOS again. Needs to be done in a better way. We should not remove the pad if there is no new chained stream. 2004-10-26 Iain * ext/ogg/gstoggdemux.c (gst_ogg_pad_new): Free the tag list. * gst/audioscale/gstaudioscale.c (gst_audioscale_link): Free the copy of the caps. * gst/interleave/interleave.c (interleave_class_init): Hook up release pad. (interleave_release_pad): Remove the pad. * gst/level/gstlevel.c: Allow the level to take 1 or 2 channels. * sys/sunaudio/gstsunaudio.c (gst_sunaudio_setparams): Pay attention to the set device. * sys/xvimage/xvimagesink.c (gst_xvimagesink_get_xv_support): Free the attrs (gst_xvimagesink_xcontext_clear): Free the xcontext. (gst_xvimagesink_finalize): Free the par. 2004-10-26 Ronald S. Bultje * gst/avi/gstavimux.c: (gst_avimux_audsinkconnect), (gst_avimux_stop_file): First calculate the rate, and only then use it. Hdr.rate is a multiple and not a derivative of hdr.scale. Scale is not the same as blockalign but is solely related to rate. 2004-10-26 Ronald S. Bultje * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_init), (gst_gnomevfssink_handle_event), (gst_gnomevfssink_chain): Implement seeking. 2004-10-25 James Henstridge Reviewed by: David Schleef * examples/gstplay/player.c: (got_stream_length), (main): * examples/seeking/cdplayer.c: (update_scale): * examples/seeking/seek.c: (format_value), (update_scale): * examples/seeking/spider_seek.c: (format_value), (update_scale), (stop_seek): Build fixes on AMD64. 2004-10-25 Zaheer Abbas Merali reviewed by: Ronald Bultje * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): Fix for some v4l cards which hang in v4lsrc 2004-10-25 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_pad_remove), (gst_ogg_demux_push), (gst_ogg_chains_clear): Make sure to remove the pad when a new chain is encountered. Set some vars to NULL so we don't try to reference freed memory. 2004-10-25 Wim Taymans * examples/seeking/Makefile.am: * examples/seeking/cdplayer.c: (update_scale): * examples/seeking/chained.c: (unlinked), (new_pad), (main): * examples/seeking/playbin.c: (make_playerbin_pipeline), (format_value), (update_scale), (iterate), (start_seek), (stop_seek), (print_media_info), (play_cb), (pause_cb), (stop_cb), (print_usage), (main): Added some more examples, update others. 2004-10-25 Ronald S. Bultje * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): * ext/speex/gstspeexdec.c: (speex_dec_chain): * ext/theora/theoradec.c: (theora_dec_chain): * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): Add codec-name metadata. 2004-10-25 Takao Fujiwara Reviewd by: Ronald S. Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): * ext/alsa/gstalsamixertrack.h: * po/POTFILES.in: ALSA mixer track label internationalization (#154054). 2004-10-25 Ronald S. Bultje * ext/theora/theoradec.c: (theora_dec_chain): Export bitrate as metadata. 2004-10-25 Ronald S. Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): * ext/alsa/gstalsamixertrack.h: Fix names, fix loop. 2004-10-25 Ronald S. Bultje * ext/speex/gstspeexdec.c: (gst_speex_dec_init), (speex_dec_convert): sinkconvert function so oggdemux can get the file length (totem). 2004-10-25 James Morrison Reviewed by: Ronald S. Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): Don't push incomplete packets. * gst/typefind/gsttypefindfunctions.c: (m4a_type_find): Fix MPEG-4 audio typefinding. 2004-10-25 Ronald S. Bultje * sys/v4l/Makefile.am: * sys/v4l/gstv4l.c: (plugin_init): * sys/v4l/gstv4lelement.c: (gst_v4lelement_get_type), (gst_v4lelement_init), (gst_v4lelement_dispose), (gst_v4lelement_change_state): * sys/v4l/gstv4lelement.h: * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_open), (gst_v4l_xoverlay_close), (idle_refresh), (gst_v4l_xoverlay_set_xwindow_id): * sys/v4l/gstv4lxoverlay.h: * sys/v4l/v4l-overlay_calls.c: * sys/v4l/v4l_calls.h: * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: (plugin_init): * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_type), (gst_v4l2element_init), (gst_v4l2element_dispose), (gst_v4l2element_change_state): * sys/v4l2/gstv4l2element.h: * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open), (gst_v4l2_xoverlay_close), (idle_refresh), (gst_v4l2_xoverlay_set_xwindow_id): * sys/v4l2/gstv4l2xoverlay.h: * sys/v4l2/v4l2-overlay_calls.c: * sys/v4l2/v4l2_calls.h: Remove client-side overlay handling, use the X-server v4l plugin for that. Nicer overlay, less code. Also make the plugin compileable without X (but then without overlay, obviously). Makes xwindowlistener obsolete, should we remove that? 2004-10-25 Ronald S. Bultje * sys/oss/gstosssrc.c: (gst_osssrc_get_time), (gst_osssrc_get), (gst_osssrc_src_query): * sys/oss/gstosssrc.h: OK, so people want offset in DEFAULT. This time, actually fix all cases. * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): Add FPS properly. 2004-10-24 Ronald S. Bultje * gst/asfdemux/gstasfmux.c: * gst/avi/gstavimux.c: Framerate. 2004-10-24 Ronald S. Bultje * sys/v4l2/gstv4l2element.c: (gst_v4l2element_set_property): Fix properties (channel, norm, frequency). 2004-10-24 Ronald S. Bultje * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_property): Flag typo. * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults): No warnings. 2004-10-24 Ronald S. Bultje * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_clear_format_list): Fix hang. 2004-10-24 Ronald S. Bultje * sys/v4l2/gstv4l2element.h: Yet Another Hack (tm) for kernel header borkedness. * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), (gst_v4l2src_v4l2fourcc_to_caps), (gst_v4l2_fourcc_from_structure), (gst_v4l2src_link), (gst_v4l2src_getcaps), (gst_v4l2src_change_state): * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop): Fix caps, keep track of state, work. 2004-10-24 Ronald S. Bultje * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): Quiet. 2004-10-24 Ronald S. Bultje * sys/oss/gstosssrc.c: (gst_osssrc_get): Don't mix bytes and samples. 2004-10-24 Ronald S. Bultje * ext/ogg/gstoggmux.c: Basic pad template which accepts OGM tracks, speex, flac, vorbis and theora. Any is incorrect. * gst/asfdemux/gstasfmux.c: (gst_asfmux_vidsink_link): Fix caps. * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_base_init): * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_base_init), (gst_v4lmjpegsrc_init), (gst_v4lmjpegsrc_srcconnect), (gst_v4lmjpegsrc_getcaps), (gst_v4lmjpegsrc_change_state): * sys/v4l/gstv4lmjpegsrc.h: * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), (gst_v4lsrc_change_state): * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_start), (gst_v4lmjpegsrc_capture_stop): Fix caps. Keep track of internal state. Work. 2004-10-23 Ronald S. Bultje * ext/Makefile.am: Fix the build fixes. 2004-10-23 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), (gst_ogg_demux_src_event), (_find_chain_seek), (gst_ogg_pad_push): Check for pad availability before using it. * ext/ogg/gstoggdemux.c: (_find_chain_process): Fix parsing of chained ogg. Needs more work on the decoder side. 2004-10-22 Benjamin Otte * gst/spectrum/Makefile.am: * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main), (idle_func): Fix demo and reenable it. Yes, I'm currently playing with audio analysis tools 2004-10-22 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): We love it if files that start at zero work too... 2004-10-22 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): Handle files with missing EOS headers. 2004-10-21 Zaheer Abbas Merali * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_handle_server_read), (gst_tcpserversink_init_send): Zero some variables first (need for accept not to return EINVAL) 2004-10-20 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), (gst_ogg_demux_src_event), (gst_ogg_pad_push): * ext/theora/theoradec.c: (theora_dec_sink_convert), (theora_dec_chain): * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), (gst_vorbis_dec_init), (vorbis_dec_convert), (vorbis_dec_chain): Seeking and querying finetune. 2004-10-20 Thomas Vander Stichele * configure.ac: * ext/Makefile.am: * ext/raw1394/Makefile.am: fix the build 2004-10-20 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): Wrong return. * gst/playback/Makefile.am: * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init): * gst/playback/gstplay-marshal.list: * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init): Fix marshallers. 2004-10-18 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event): Silence. 2004-10-18 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), (gst_ogg_demux_src_event), (gst_ogg_pad_populate), (gst_ogg_pad_push): Yay for non-lineair granulepos in theora. 2004-10-18 Wim Taymans * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): * ext/dv/gstdvdec.h: Make sure we renegotiate aspect ratio when the camera switches. 2004-10-18 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), (gst_ogg_demux_src_event), (gst_ogg_pad_push): Start at zero. * ext/theora/theoradec.c: (theora_dec_chain): Skip headers. Bad idea for chained ogg, but fixes seeking. 2004-10-18 Wim Taymans * configure.ac: I swear, this is the last time I touch this. 2004-10-18 Ronald S. Bultje * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), (gst_ogg_demux_src_event), (gst_ogg_pad_populate), (_read_bos_process), (gst_ogg_demux_iterate), (gst_ogg_pad_new): Faster seeking. * ext/theora/theoradec.c: (theora_dec_sink_convert): Time-to-default conversion. * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): Don't error on unknown packets, just skip. We should probably read them if we want to support chained ogg. 2004-10-18 Wim Taymans * configure.ac: Added cdaudio to wrong list. 2004-10-18 Wim Taymans * configure.ac: Revive cdaudio. 2004-10-18 Wim Taymans * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), (gst_dvdec_video_link), (gst_dvdec_push): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), (gst_smokeenc_resync), (gst_smokeenc_chain): Fix mimetype on smoke encoder. Add aspect ratio to dvdec. Not sure if these values are correct though.... 2004-10-18 Wim Taymans * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init): Fix vorbis property descriptions and ranges. 2004-10-18 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): Really do nothing when no data is available. Go to the playing state when the stream is not seekable instead of failing. 2004-10-18 Wim Taymans * ext/cdaudio/gstcdaudio.c: (_do_init), (gst_cdaudio_base_init), (gst_cdaudio_get_event_masks), (gst_cdaudio_send_event), (gst_cdaudio_query), (plugin_init), (cdaudio_uri_get_type), (cdaudio_uri_get_protocols), (cdaudio_uri_get_uri), (cdaudio_uri_set_uri), (cdaudio_uri_handler_init): Added uri handler for cd:// Port to new API. 2004-10-18 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), (gst_decode_bin_init), (find_compatibles), (close_pad_link), (try_to_link_1), (no_more_pads), (close_link), (type_found): * gst/playback/gstplaybasebin.c: (gen_preroll_element), (remove_prerolls), (unknown_type), (add_element_stream), (new_decoded_pad), (setup_source), (gst_play_base_bin_add_element), (gst_play_base_bin_remove_element), (gst_play_base_bin_link_stream): * gst/playback/gstplaybin.c: (gen_video_element), (gen_vis_element), (remove_sinks), (setup_sinks): * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), (gst_stream_info_get_type), (gst_stream_info_class_init), (gst_stream_info_init), (gst_stream_info_new), (gst_stream_info_dispose), (stream_info_mute_pad), (gst_stream_info_set_property), (gst_stream_info_get_property): * gst/playback/gststreaminfo.h: Add sink padtemplate to decodebin. Added some more comments. Make queue size configurable in playbasebin. Added possibility to use elements as sinks (ex cdaudio). 2004-10-15 Wim Taymans * ext/speex/gstspeexenc.c: (gst_speexenc_class_init), (gst_speexenc_chain): Fix speex timestamps so that it gets muxed properly. 2004-10-15 Wim Taymans * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), (gst_dv1394src_base_init), (gst_dv1394src_class_init), (gst_dv1394src_init), (gst_dv1394src_dispose), (gst_dv1394src_iso_receive), (gst_dv1394src_discover_avc_node), (gst_dv1394src_change_state), (gst_dv1394src_get_event_mask), (gst_dv1394src_event), (gst_dv1394src_get_formats), (gst_dv1394src_convert), (gst_dv1394src_get_query_types), (gst_dv1394src_query), (gst_dv1394src_uri_get_type), (gst_dv1394src_uri_get_protocols), (gst_dv1394src_uri_get_uri), (gst_dv1394src_uri_set_uri), (gst_dv1394src_uri_handler_init): * ext/raw1394/gstdv1394src.h: Added conversion/query functions. Update buffer timestamps, Added signals. Added uri dv:// so it might play from the firewire in playbin. Fix a possible leak. Added debugging. 2004-10-15 Wim Taymans * ext/raw1394/gstdv1394src.c: (gst_dv1394src_class_init), (gst_dv1394src_init), (gst_dv1394src_set_property), (gst_dv1394src_get_property), (gst_dv1394src_iso_receive), (gst_dv1394src_discover_avc_node), (gst_dv1394src_change_state): * ext/raw1394/gstdv1394src.h: Added AV/C VTR control support needed for some cameras. Added automatic port detection. Added properties for selecting the channel. The configure.ac script is not yet updated to reflect the new libavc1394 and librom1394 dependencies. 2004-10-15 Wim Taymans * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse), (gst_qtdemux_handle_esds): An esds box is not a container. Fix parsing of mp4v boxes. Do not try to renegotiate fps for each frame. Need to find a better method. This should fix mp4 playback. 2004-10-14 David Schleef * configure.ac: update for swfdec-0.3 and liboil-0.2 * ext/swfdec/gstswfdec.c: update for swfdec-0.3 * ext/swfdec/gstswfdec.h: same * gst/videofilter/gstvideobalance.c: update for liboil-0.2 * gst/videotestsrc/videotestsrc.c: same 2004-10-14 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), (is_sync_frame), (gst_multifdsink_new_client), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): Turn warnings into info. Don't allow a state change in the streaming thread. 2004-10-14 Thomas Vander Stichele * ext/vorbis/oggvorbisenc.c: * ext/vorbis/vorbisdec.c: fix template sample rate 2004-10-13 Wim Taymans * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): Decoding the header first fixes some problems in resyncing in more mp3s. 2004-10-12 Wim Taymans * gst/playback/gstplaybin.c: (gen_video_element), (gen_vis_element), (remove_sinks), (setup_sinks): Added vis plugin support, need to configure the vis element to activate it. 2004-10-12 Ronald S. Bultje * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get), (gst_gnomevfssrc_srcpad_query), (gst_gnomevfssrc_srcpad_event): Some debug. * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_handle_src_event), (gst_avi_demux_read_superindex), (gst_avi_demux_read_subindexes), (gst_avi_demux_add_stream), (gst_avi_demux_stream_index), (gst_avi_demux_skip), (gst_avi_demux_sync), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_stream_header): * gst/avi/gstavidemux.h: Support for openDML-2.0 indx/ix## chunks. Support for broken index recovery (where, if part of the index is broken, we will still read the rest of the index and recover the broken part by stream scanning). More broken media support. EOS workarounds. General AVI braindamage headache recovery. Aspirin included. 2004-10-11 Ronald S. Bultje * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_open), (cdparanoia_event), (cdparanoia_query): Get rid of hideous lead-in. 2004-10-11 Wim Taymans * gst/playback/gstplaybasebin.c: (setup_source): Wrong var used to get g_list_next. 2004-10-11 Ronald S. Bultje * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), (cdparanoia_get), (cdparanoia_open): Report discid as metadata, add duration. 2004-10-11 Wim Taymans * gst/playback/gstplaybasebin.c: (setup_source): Cleanup the previous pipeline a little earlier for the case that a source element provides raw data. 2004-10-11 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_chain): reset v1 tag offset when there is no v1 tag. Fixes id3demux always consuming the last 128 bytes, even though it was valid mp3 data. 2004-10-10 Zaheer Abbas Merali * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), (gst_v4lsrc_getcaps), (gst_v4lsrc_get): * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): Change g_warnings to GST_WARNING_OBJECT and fix colourspace issue 2004-10-10 Zaheer Abbas Merali * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps): Fix for webcams that support only specific width or height 2004-10-09 Tim-Philipp Müller Reviewed by: Ronald S. Bultje * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file): Fix wrong discont event setup (fixes #154967). 2004-10-09 Sebastien Cote Reviewed by: Ronald S. Bultje * gst/auparse/gstauparse.c: (gst_auparse_chain): Error out on invalid data (fixes #154807). 2004-10-09 Tim-Philipp Müller Reviewed by: Ronald S. Bultje * ext/dvdread/dvdreadsrc.c: (_read): Make titles > 0 work again (fixes #154834). 2004-10-09 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_template_caps): WMV3 missing in template caps. 2004-10-09 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): OK, so the original code was too strict. It makes random AVI files hang for seconds upon opening, which is unacceptable and is far beyond the original goal of getting multiple chunks for one-chunk sounc stream files. So now do just that. 2004-10-09 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (setup_source), (gst_play_base_bin_change_state): Actually clean up streaminfo if output fails. This would trigger if, for example, there was no CD in the drive. No preroll, so a streaminfo structure is created, but the subsequent state change of the thread fails. * gst/playback/gstplaybin.c: (gst_play_bin_change_state): Don't change state if parent failed. 2004-10-08 Ronald S. Bultje * gst/playback/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_get_property), (handoff), (gen_video_element), (remove_sinks): Add small bits of code for screenshot handling. 2004-10-08 Wim Taymans * gst/playback/gstplaybin.c: (gst_play_bin_set_property), (gen_video_element), (gen_audio_element), (setup_sinks): Don't assume the user provided sinks are named "sink"... 2004-10-08 Wim Taymans * gst/playback/gstplaybasebin.c: (gen_preroll_element), (unknown_type), (setup_source), (gst_play_base_bin_remove_element), (gst_play_base_bin_link_stream): Do not try to autoplug sources that generate raw streams like cdparanoia. disconnect the preroll overrun signal when we don't need it anymore. 2004-10-08 Milosz Derezynski * ext/cdparanoia/gstcdparanoia.c: (_do_init), Added reworked patch from #154903 from milosz derezynski (deadchip). 2004-10-08 Wim Taymans * ext/cdparanoia/gstcdparanoia.c: (_do_init), (cdparanoia_base_init), (cdparanoia_class_init), (cdparanoia_init), (cdparanoia_dispose), (cdparanoia_get), (cdparanoia_change_state), (cdparanoia_convert), (cdparanoia_uri_get_type), (cdparanoia_uri_get_protocols), (cdparanoia_uri_get_uri), (cdparanoia_uri_set_uri), (cdparanoia_uri_handler_init): * ext/cdparanoia/gstcdparanoia.h: This adds the cdda:// uri. 2004-10-08 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), (gst_decode_bin_init), (find_compatibles), (close_pad_link), (try_to_link_1), (no_more_pads), (close_link), (type_found): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (unknown_type), (gst_play_base_bin_remove_element), (gst_play_base_bin_link_stream): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gst_play_bin_init), (gst_play_bin_set_property), (gen_video_element), (gen_audio_element), (setup_sinks): * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), (gst_stream_info_get_type), (gst_stream_info_class_init), (gst_stream_info_init), (gst_stream_info_new), (gst_stream_info_dispose), (stream_info_mute_pad), (gst_stream_info_set_property), (gst_stream_info_get_property): * gst/playback/gststreaminfo.h: Reuse the audio and video bins. Some internal cleanups in the stream selection code. 2004-10-08 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): * sys/xvimage/xvimagesink.h: Reverting Ronald's changes as the issue is not coming from those elements. Moreover these elements should not keep the xid they have been given when in NULL state. 2004-10-07 Ronald S. Bultje * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): * sys/xvimage/xvimagesink.h: Actually only create a new toplevel window if we're not gonna embed it right after. 2004-10-07 Wim Taymans * gst/playback/gstplaybasebin.c: (play_base_bin_mute_pad), (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream): * gst/playback/gstplaybin.c: (setup_sinks): Implement muting/unmuting of streams, mute streams that are not used. 2004-10-07 Wim Taymans * gst/typefind/gsttypefindfunctions.c: (ac3_type_find), (plugin_init): Added lame audio/x-ac3 typefind function. 2004-10-06 Thomas Vander Stichele * configure.ac: bump nano to cvs === release 0.8.5 === 2004-10-06 Thomas Vander Stichele * NEWS: * RELEASE: * configure.ac: releasing 0.8.5, "Take You On" 2004-10-06 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_init), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (no_more_pads), (close_link), (type_found): * gst/playback/gstplaybasebin.c: (new_decoded_pad): * gst/playback/gstplaybin.c: (gen_video_element): Do not signal the no_more_pads after the first pad when we are plugging a non dynamic element with multiple output pads (like swfdec, dvdec, ...). 2004-10-06 Thomas Vander Stichele * configure.ac: bump for prerelease 2004-10-06 Stephane Loeuillet * gst/wavparse/gstwavparse.c: add ATRAC3 to STATIC CAPS to fix a warning * gst/matroska/ebml-read.c: * gst-libs/gst/riff/riff-read.c: fix typos 2004-10-06 Stephane Loeuillet * gst-libs/gst/riff/riff-media.c: generate caps for ATRAC3 audio streams * gst/realmedia/rmdemux.c: generate caps for ATRAC3 audio streams 2004-10-06 Stephane Loeuillet * gst/wavparse/Makefile.am * gst/wavparse/riff.h * gst/wavparse/wavparse.vcproj riff.h removal (unused and duplication with riff-ids.h) 2004-10-06 Stephane Loeuillet * gst/wavparse/gstwavparse.h remove duplicated defines for audio codec codes * gst-libs/gst/riff/riff-ids.h * gst/wavenc/riff.h: add "4CC" code for ATRAC3 audio streams add "4CC" code for ITU_G721_ADPCM (unused for now) 2004-10-06 Wim Taymans * gst/flx/gstflxdec.c: (gst_flxdec_init), (gst_flxdec_loop): Actually _do_ negotiation. Pass gdouble as arg instead of guint64 for the framerate. 2004-10-06 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_init), (find_compatibles), (close_pad_link), (try_to_link_1), (no_more_pads), (close_link), (type_found): * gst/playback/gstplaybasebin.c: (new_decoded_pad): * gst/playback/gstplaybin.c: (gen_video_element), (gen_audio_element): Set state on newly added element to READY so that negotiation can happen ASAP. Addes some more debug info. Do not try to plug pads with multiple caps structures or ANY because it is too dangerous since we do not do dynamic replugging. 2004-10-06 Thomas Vander Stichele written by: Gora Mohanty * po/LINGUAS: * po/or.po: add Oriya translation 2004-10-05 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): Prevent overwrite of size member. Makes audio sound crappy. 2004-10-05 Stephane Loeuillet * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add rmvb to the list of known RealMedia extensions 2004-10-05 Wim Taymans * ext/libmng/gstmngdec.c: (gst_mngdec_loop), (mngdec_error), (mngdec_openstream), (mngdec_closestream), (mngdec_handle_sink_event), (mngdec_readdata), (mngdec_gettickcount), (mngdec_settimer), (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), (gst_mngdec_change_state): Set the framerate correctly. 2004-10-04 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): There was something wrong with the index massaging. 2004-10-04 Wim Taymans * ext/jpeg/gstjpeg.c: (smoke_type_find), (plugin_init): * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), (gst_smokedec_chain): * ext/jpeg/gstsmokedec.h: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), (gst_smokeenc_init), (gst_smokeenc_resync), (gst_smokeenc_chain): * ext/jpeg/gstsmokeenc.h: * ext/jpeg/smokecodec.c: (smokecodec_encode_new), (smokecodec_decode_new), (smokecodec_info_free), (smokecodec_set_quality), (smokecodec_get_quality), (smokecodec_set_threshold), (smokecodec_get_threshold), (smokecodec_set_bitrate), (smokecodec_get_bitrate), (find_best_size), (abs_diff), (put), (smokecodec_encode_id), (smokecodec_encode), (smokecodec_parse_id), (smokecodec_parse_header), (smokecodec_decode): * ext/jpeg/smokecodec.h: * ext/jpeg/smokeformat.h: Updated smoke, new bitstream, allows embedding in ogg. 2004-10-04 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): Fix seeking in some files. All this code is no longer needed (and actually breaks stuff) because we now synchronize the full index right when reading the header. 2004-10-04 Wim Taymans * configure.ac: configure update for libmng. 2004-10-04 Wim Taymans * ext/libmng/Makefile.am: * ext/libmng/gstmng.c: (plugin_init): * ext/libmng/gstmng.h: * ext/libmng/gstmngdec.c: (gst_mngdec_get_type), (gst_mngdec_base_init), (gst_mngdec_class_init), (gst_mngdec_sinklink), (gst_mngdec_init), (gst_mngdec_src_getcaps), (gst_mngdec_loop), (gst_mngdec_get_property), (gst_mngdec_set_property), (mngdec_error), (mngdec_openstream), (mngdec_closestream), (mngdec_handle_sink_event), (mngdec_readdata), (mngdec_gettickcount), (mngdec_settimer), (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), (gst_mngdec_change_state): * ext/libmng/gstmngdec.h: * ext/libmng/gstmngenc.c: (gst_mngenc_get_type), (mng_caps_factory), (raw_caps_factory), (gst_mngenc_base_init), (gst_mngenc_class_init), (gst_mngenc_sinklink), (gst_mngenc_init), (gst_mngenc_chain), (gst_mngenc_get_property), (gst_mngenc_set_property): * ext/libmng/gstmngenc.h: Added basic MNG decoder. Needs more work. The encoder does not work yet. 2004-10-04 Ronald S. Bultje * gst/realmedia/rmdemux.c: (gst_rmdemux_handle_sink_event), (gst_rmdemux_loop), (gst_rmdemux_add_stream), (gst_rmdemux_parse_mdpr), (gst_rmdemux_dump_mdpr): Don't hang on length=0 chunks. Some negotiation fixes. Signal no-more-pads. 2004-10-04 Thomas Vander Stichele * configure.ac: you need at least 1.0.4 of speex 2004-10-04 Iain * ext/speex/gstspeexdec.h: Revert the includes changes. * ext/speex/gstspeexenc.[ch]: Revert the includes changes. 2004-09-30 Iain * sys/sunaudio/gstsunaudio.c (gst_sunaudiosink_open): Use the device found during init or set as a property instead of hardcoding /dev/audio 2004-10-04 Ronald S. Bultje * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init), (gst_rmdemux_init), (gst_rmdemux_handle_sink_event), (gst_rmdemux_loop), (gst_rmdemux_add_stream), (re_hexdump_bytes), (re_dump_pascal_string), (gst_rmdemux_dump__rmf), (gst_rmdemux_dump_prop), (gst_rmdemux_parse_mdpr), (gst_rmdemux_dump_mdpr), (gst_rmdemux_dump_indx), (gst_rmdemux_dump_data): Use debug category, fix EOS handling. filesrc ! rmdemux now works. 2004-10-04 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), (sort), (gst_avi_demux_massage_index), (gst_avi_demux_stream_header), (gst_avi_demux_stream_data): Improve allocation, cutting and sorting of the index. How takes a few seconds instead of minutes. 2004-10-03 Christophe Fergeau * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr): fixed compilation 2004-10-02 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_template_caps): Add wing commander format mimetype/fourccs. * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): Don't crash if some value is 0. 2004-10-02 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_template_caps): Add DIB fourcc (raw, palettized 8-bit RGB). * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_vids_with_data): Oops, fix strf_data reading bug. * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): Use a non-NULL tag. * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Time for hacks. Sorry Dave. At least one quicktime movie (a trailer) that I've encountered contains multiple video tracks. One of those is the actual video track, the other are one-frame tracks (images). Unfortunately, the number of frames according to the trak header is 1 for each, so that doesn't help. So instead, I look at the duration and discard tracks with a duration shorter than 20% of the length of the stream. Better than nothing. 2004-10-01 Christian Schaller * ext/ivorbis/vorbis.c: Patch from Phil Blundell (Bug 152341) 2004-10-01 Wim Taymans * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init), (speex_dec_get_formats), (speex_dec_convert), (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), (speex_dec_chain), (gst_speexdec_get_property), (gst_speexdec_set_property): Small cleanups. 2004-10-01 Wim Taymans * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), (gst_wavparse_stream_init), (gst_wavparse_fmt), (gst_wavparse_other), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event): * gst/wavparse/gstwavparse.h: Added some more debugging info. Fix the case where the length of the file is 0. Make sure we seek to sample borders. 2004-10-01 Wim Taymans * gst/playback/README: * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter), (gst_decode_bin_init), (find_compatibles), (close_pad_link), (try_to_link_1), (no_more_pads), (close_link), (type_found): Add some debug info to decodebin, update README 2004-10-01 Ronald S. Bultje * ext/dvdnav/dvdnavsrc.c: (dvdnav_handle_navigation_event): Don't use g_print(); use GST_DEBUG(). 2004-10-01 Ronald S. Bultje * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), (gst_ogg_mux_queue_pads): Handle EOS properly. 2004-10-01 Sebastien Cote Reviewed by: Ronald S. Bultje * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_sinkconnect), (gst_faad_chain), (gst_faad_change_state): * ext/faad/gstfaad.h: Allow playback of raw (unframed) MPEG AAC files (#148993). 2004-10-01 Sebastien Cote Reviewed by: Ronald S. Bultje * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): Throw error if we didn't recognize the stream. Fixes #152289. 2004-10-01 Ronald S. Bultje * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): Fix negotiation. 2004-10-01 Francis Labonte Reviewed by: Ronald S. Bultje * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): Fix memleak. 2004-10-01 Balamurali Viswanathan Reviewed by: Ronald S. Bultje * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_setparams): Solve #152805. * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_mute): Solve 152806. 2004-10-01 Ronald S. Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_audio_caps_with_data): Add codec_data handling (like asfdemux used to do). * gst/asfdemux/gstasf.c: (plugin_init): * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream): Use riff-media for caps creation instead of our own (mostly broken) copy of its functions. 2004-10-01 Ronald S. Bultje * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_capture): Don't actually error out if we get another return value than -EINVAL. Opposite to what I first thought, drivers have random return values for this, although -EINVAL is the expected return value. Since this is not fatal, we shouldn't use GST_ELEMENT_ERROR() but just GST_ERROR_OBJECT(). 2004-10-01 Ronald S. Bultje * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), (dvdreadsrc_init), (dvdreadsrc_dispose), (dvdreadsrc_set_property), (dvdreadsrc_get_property), (_open), (_seek), (_read), (dvdreadsrc_get), (dvdreadsrc_open_file), (dvdreadsrc_change_state): Fix. Don't do one big huge loop around the whole DVD, that will cache all data and thus eat sizeof(dvd) (several GB) before we see something. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Actually NULL'ify event after using it. * gst/matroska/ebml-read.c: (gst_ebml_read_use_event), (gst_ebml_read_handle_event), (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_read_element_data), (gst_ebml_read_seek), (gst_ebml_read_skip): Handle events. * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), (gst_dvd_demux_init), (gst_dvd_demux_get_audio_stream), (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_plugin_init): Fix timing (this will probably break if I seek using menus, but I didn't get there yet). VOBs and normal DVDs should now work. Add a mpeg2-only pad with high rank so this get autoplugged for MPEG-2 movies. * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_base_init), (gst_mpeg_demux_class_init), (gst_mpeg_demux_init), (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_get_video_stream), (gst_mpeg_demux_get_audio_stream), (gst_mpeg_demux_get_private_stream), (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_plugin_init): Use this as second rank for MPEG-1 and MPEG-2. Still use this for MPEG-1 but use dvddemux for MPEG-2. * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), (gst_mpeg_parse_init), (gst_mpeg_parse_new_pad), (gst_mpeg_parse_parse_packhead): Timing. Only add pad template if it exists. Add sink template from class and not from ourselves. This means we will always use the correct sink template even if it is not the one defined in this file. 2004-09-29 Wim Taymans * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): Fix playback of mpeg again, timestamps where screwed up by patch 1.61. 2004-09-29 Ronald S. Bultje * ext/flac/gstflacdec.c: (gst_flacdec_src_query): Only return true if we actually filled something in. Prevents player applications from showing a random length for flac files. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), (gst_riff_read_use_event), (gst_riff_read_handle_event), (gst_riff_read_seek), (gst_riff_read_skip), (gst_riff_read_strh), (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_iavs): OK, ok, so I implemented event handling. Apparently it's normal that we receive random events at random points without asking for it. * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): * gst/avi/gstavidemux.h: Implement non-lineair chunk handling and subchunk processing. The first solves playback of AVI files where the audio and video data of individual buffers that we read are not synchronized. This should not happen according to the wonderful AVI specs, but of course it does happen in reality. It is also a prerequisite for the second. Subchunk processing allows us to cut chunks in small pieces and process each of these pieces separately. This is required because I've seen several AVI files with incredibly large audio chunks, even some files with only one audio chunk for the whole file. This allows for proper playback including seeking. This patch is supposed to fix all AVI A/V sync issues. * gst/flx/gstflxdec.c: (gst_flxdec_class_init), (flx_decode_chunks), (flx_decode_color), (gst_flxdec_loop): Work. * gst/modplug/gstmodplug.cc: Proper return value setting for the query() function. * gst/playback/gstplaybasebin.c: (setup_source): Being in non-playing state (after, e.g., EOS) is not necessarily a bad thing. Allow for that. This fixes playback of short files. They don't actually playback fully now, because the clock already runs. This means that small files (<500kB) with a small length (<2sec) will still not or barely play. Other files, such as mod or flx, will work correctly, however. 2004-09-28 Wim Taymans * ext/speex/gstspeex.c: (plugin_init): * ext/speex/gstspeexdec.c: (gst_speex_dec_base_init), (gst_speex_dec_class_init), (speex_dec_get_formats), (speex_get_event_masks), (speex_get_query_types), (gst_speex_dec_init), (speex_dec_convert), (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), (speex_dec_chain), (gst_speexdec_get_property), (gst_speexdec_set_property), (speex_dec_change_state): * ext/speex/gstspeexdec.h: * ext/speex/gstspeexenc.c: (gst_speexenc_get_formats), (gst_speexenc_get_type), (speex_caps_factory), (raw_caps_factory), (gst_speexenc_base_init), (gst_speexenc_class_init), (gst_speexenc_sinkconnect), (gst_speexenc_convert_src), (gst_speexenc_convert_sink), (gst_speexenc_get_query_types), (gst_speexenc_src_query), (gst_speexenc_init), (gst_speexenc_get_tag_value), (comment_init), (comment_add), (gst_speexenc_metadata_set1), (gst_speexenc_set_metadata), (gst_speexenc_setup), (gst_speexenc_buffer_from_data), (gst_speexenc_push_buffer), (gst_speexenc_set_header_on_caps), (gst_speexenc_chain), (gst_speexenc_get_property), (gst_speexenc_set_property), (gst_speexenc_change_state): * ext/speex/gstspeexenc.h: Rewrote speex encoder, make sure it can be embedded in ogg. Implemented speex decoder. 2004-09-28 Christian Schaller * configure.ac: Remove kioslave plugin. Markey is brewing a new working one * ext/Makefile.am: Remove kioslave plugin * ext/kio: remove * gst-plugins.spec.in: remove kio plugin from spec 2004-09-27 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), (is_sync_frame), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_new_client), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): * gst/tcp/gstmultifdsink.h: Make syncing to keyframes actually work for new clients and lagging clients. 2004-09-26 Benjamin Otte * gst/debug/gstnavigationtest.c: (gst_navigationtest_class_init), (gst_navigationtest_handle_src_event), (draw_box_planar411), (gst_navigationtest_planar411), (gst_navigationtest_change_state): * gst/debug/gstnavigationtest.h: make navigationtest display button-press and button-release events 2004-09-26 Iain * gst/interleave/interleave.c (all_channels_new_media): Checks if all the channels have received a new media event. (interleave_buffered_loop): Compresses a new media event on all channels into one. 2004-09-26 Iain * gst/wavenc/gstwavenc.c (gst_wavenc_chain): Company says we need to call the sinkpad's default event handler and not the srcpads. He also says this is confusing :) (gst_wavenc_stop_file): Company says that seek events only go upstream we should send a discontinuous downstream instead. 2004-09-25 Christian Schaller * Update SPEC file to be usable in conjunction with Fedora Core, Fedora.us and freshrpms packages * Fix typo in multifilesrc test Makefile 2004-09-24 Wim Taymans * gst/playback/gstplaybasebin.c: (new_decoded_pad): Only signal the no_more_pads signal when we have added the stream to our list. 2004-09-24 Wim Taymans * gst/playback/gstplaybasebin.c: (remove_prerolls), (new_decoded_pad): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (setup_sinks): Don't try to preroll or decode more than one audio/video track. 2004-09-24 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): Throw error if we failed to find a suitable output. This should throw an error if we successfully set up a pipeline (e.g. because we recognized a media file) but found no decodable streams in it (e.g. because it contains only media stream types for which we have no decoders, or because it's not a media type). 2004-09-23 Ronald S. Bultje * ext/dirac/Makefile.am: * ext/dirac/gstdirac.cc: * ext/dirac/gstdiracdec.cc: * ext/dirac/gstdiracdec.h: Do something. Don't actually know if this works because I don't have a demuxer yet. * ext/gsm/gstgsmdec.c: (gst_gsmdec_getcaps): Add channels=1 to caps returned from _getcaps(). * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_get_type), (gst_ogm_video_parse_get_type), (gst_ogm_audio_parse_base_init), (gst_ogm_video_parse_base_init), (gst_ogm_parse_init), (gst_ogm_audio_parse_init), (gst_ogm_video_parse_init), (gst_ogm_parse_sink_convert), (gst_ogm_parse_chain), (gst_ogm_parse_change_state): Separate between audio/video so ogmaudioparse actually uses the audio pad templates. Both audio and video work now, including autoplugging. Also use sometimes-srcpad hack. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Handle events better. Don't hang on infinite loops. * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), (gst_avi_demux_init), (gst_avi_demux_reset), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_stream_header), (gst_avi_demux_stream_data), (gst_avi_demux_change_state): * gst/avi/gstavidemux.h: Improve A/V sync. Still not perfect. * gst/matroska/ebml-read.c: (gst_ebml_read_seek), (gst_ebml_read_skip): Handle events better. * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), (gst_qtdemux_loop_header), (qtdemux_parse_trak), (qtdemux_audio_caps): Add IMA4. Improve event handling. Save offset after a seek when the headers are at the end of the file so that we don't end up in an infinite loop. * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add low-priority typefind support for files with no length. 2004-09-23 Zaheer Abbas Merali * testsuite/multifilesink/Makefile.am: fix typo 2004-09-22 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls): Fix mistakes from thaytan's patches. 2004-09-23 Jan Schmidt * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): For completeness, XSync in the destroy function as xvimage does. 2004-09-23 Jan Schmidt * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): Correct caps negotiation * gst/volume/gstvolume.c: (volume_chain_float), (volume_chain_int16): Modify debug output to be little more informative * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_destroy): Add XSync calls after detaching from the shared memory segment to avoid a crash. 2004-09-22 Zaheer Abbas Merali * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), (gst_ogg_mux_loop): * ext/vorbis/vorbis.c: (plugin_init): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), (gst_vorbisenc_chain): * ext/vorbis/vorbisenc.h: remove explicit newmedia support from oggmux and vorbisenc add debug category to vorbisenc * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_class_init), (gst_multifilesink_init), (gst_multifilesink_dispose), (gst_multifilesink_set_location), (gst_multifilesink_set_property), (gst_multifilesink_next_file), (gst_multifilesink_handle_event), (gst_multifilesink_chain), (plugin_init): * gst/multifilesink/gstmultifilesink.h: add support for streamheader in multifilesink 2004-09-22 Ronald S. Bultje * gst/asfdemux/gstasfdemux.c: (_read_var_length), (_read_guid), (gst_asf_demux_process_segment), (gst_asf_demux_handle_data), (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event): Prevent infinite loops. More correct error reporting. * gst/auparse/gstauparse.c: (gst_auparse_chain): Error out if negotiation fails. * gst/playback/gstplaybasebin.c: (setup_source), (gst_play_base_bin_change_state), (gst_play_base_bin_error), (gst_play_base_bin_found_tag): Error/tag forwarding. Pre-roll fixes for source errors on state changes (e.g. "file does not exist") to prevent hangs. 2004-09-21 Zaheer Abbas Merali * testsuite/multifilesink/Makefile.am: * testsuite/multifilesink/lame_test.c: (gst_newmedia_base_init), (gst_newmedia_class_init), (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), (newfile_signal), (test_signal), (main): * testsuite/multifilesink/multifilesrc_test.c: (main): * testsuite/multifilesink/oggtheora_test.c: (gst_newmedia_base_init), (gst_newmedia_class_init), (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), (newfile_signal), (test_signal), (main): * testsuite/multifilesink/oggvorbis_test.c: (gst_newmedia_base_init), (gst_newmedia_class_init), (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), (newfile_signal), (test_signal), (main): * testsuite/multifilesink/wavenc_test.c: (gst_newmedia_base_init), (gst_newmedia_class_init), (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), (newfile_signal), (test_signal), (main): New media tests 2004-09-20 Christian Schaller * Fix mikmod license to LGPL as they have relicensed * Move Dirac and Effectv into LGPL section of README_license 2004-09-20 Ronald S. Bultje * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_change_state): Allow for mp3 rate/channels changes. However, only very conservatively. Reason that we *have* to enable this is smiply because the mad find_sync() function is not good enough, it will regularly sync on random data as valid frames and therefore make us provide random caps as *final* caps of the stream. The best fix I could think of is to simply require several of the same stream changes in a row before we change caps. The actual testcase that works now is # * ext/ogg/Makefile.am: * ext/ogg/gstogg.c: (plugin_init): * ext/ogg/gstogmparse.c: OGM support (video only for now; I need an audio sample file). * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), (gst_asf_demux_process_stream), (gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream): WMV extradata. * gst/playback/gstplaybasebin.c: (unknown_type): Don't error out on single unknown-types after all. It's wrong. If we found type of video and audio but not of a subtitle stream, it will still error out (which is unwanted). Will find a better fix later on. * gst/typefind/gsttypefindfunctions.c: (ogmvideo_type_find), (ogmaudio_type_find), (plugin_init): OGM support. 2004-09-20 Johan Dahlin * ext/jpeg/gstjpegdec.c (gst_jpegdec_chain): Allocate the buffer after setting caps. 2004-09-19 Zaheer Abbas Merali * gst/wavenc/gstwavenc.c: (gst_wavenc_init), (gst_wavenc_chain): * gst/wavenc/gstwavenc.h: Added newmedia support to wavenc 2004-09-17 Wim Taymans * gst/tcp/gstfdset.c: (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), (gst_fdset_wait): * gst/tcp/gstmultifdsink.c: (gst_client_status_get_type), (gst_multifdsink_init), (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_get_stats), (gst_multifdsink_remove_client_link), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_handle_clients), (gst_multifdsink_close), (gst_multifdsink_change_state): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), (gst_tcpserversink_removed): Small cleanups in fdset.c Use a hastable to map fd to the client structure for faster lookup in _remove and get_stats. Added virtual function to close the fds. Handle clients even when the select/poll call was unblocked because of a command. Implement syncing to keyframe in the recovery procedure. 2004-09-16 Iain * gst/audioconvert/gstaudioconvert.c (_fixate_caps_to_int): Free the try caps. 2004-09-15 Ronald S. Bultje * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream): Caps are only set if the type of the stream is unknown, but this is initialized in ->init_stream(), so set to UNKNOWN after calling ->init_stream() so that capsnego starts. 2004-09-15 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_stream_data): Just hardcode for raw audio then. AVI audio sucks. 2004-09-15 Arwed v. Merkatz * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): * gst/matroska/matroska-mux.c: (audiosink_templ), (gst_matroska_mux_audio_pad_link): * gst/typefind/gsttypefindfunctions.c: (tta_caps), (plugin_init): Use audio/x-ttafile for tta files and audio/x-tta for raw tta frames. 2004-09-15 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_stream_data): Try to fix a/v sync issues. 2004-09-15 David Schleef * configure.ac: remove NASM check, since we don't use it. Update dirac check to 0.4 * ext/dirac/gstdiracdec.cc: update to current 0.4 API * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): Initialized variables. * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_loop_header), (qtdemux_parse), (qtdemux_parse_trak), (gst_qtdemux_handle_esds), (qtdemux_audio_caps): Fix seeking, add SVQ3 format 2004-09-15 Ronald S. Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_add_stream), (gst_avi_demux_stream_data): * gst/avi/gstavidemux.h: Fix for compressed audio (mp3) timestamp generation. How did this ever work? 2004-09-15 Ronald S. Bultje * gst/playback/gstplaybin.c: (gst_play_bin_get_property): Volume is a double not a float. 2004-09-15 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_remove_client_link), (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): Don't close the fd in multifdsink as we didn't open it in the first place. Some cleanups. 2004-09-15 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): Fix the case where the muxer would mark pages as delta frames when they are not (vorbis only ogg). 2004-09-15 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (state_change), (setup_source), (gst_play_base_bin_change_state): Handle the case where we failed to setup a clear pipeline. This will throw an error (or EOS, another nice case) and if you don't catch that, the app will wait for the signal forever (and thus hang). 2004-09-15 Ronald S. Bultje * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_uri_get_protocols): * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_uri_get_protocols): * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): * ext/gnomevfs/gstgnomevfsuri.h: Use _uri_new() instead of _open(), so it doesn't take as long and Christophe's computer won't hang. * gst/playback/gstplaybasebin.c: (unknown_type): Throw error on unknown media type, so apps actually display it. 2004-09-14 Brian Cameron * gst/playback/gstplaybasebin.c: (queue_overrun), (no_more_pads), (setup_source), (gst_play_base_bin_set_property), (gst_play_base_bin_add_element): * gst/playback/gstplaybin.c: (gst_play_bin_send_event): Some more work on making sure seeking pauses the pipeline and that changing the uri actually does something. 2004-09-17 Wim Taymans * gst/tcp/gstfdset.c: (gst_fdset_wait): * gst/tcp/gstmultifdsink.c: (gst_multifdsink_close): * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send), (gst_tcpserversink_close): Be a bit more paranoid when freeing memory. 2004-09-13 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse_trak): Don't crash by dividing by zero (see sample movie in #126922). 2004-09-13 Ronald S. Bultje * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): Don't touch non-existing data (fixes crash on file in #140147). 2004-09-13 Ronald S. Bultje * gst/playback/gstplaybasebin.c: (gst_play_base_bin_dispose), (gst_play_base_bin_set_property): Handle double disposals, and proper change of URIs. 2004-09-13 Martin Eikermann * gst/mpegstream/gstmpegparse.c: fix synchronistation for streams recorded from digital PCR fixes bug #119376 2004-09-13 Ronald S. Bultje * ext/gnomevfs/Makefile.am: * ext/gnomevfs/gstgnomevfs.c: (plugin_init): * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_get_type), (gst_gnomevfssink_dispose), (gst_gnomevfssink_init), (gst_gnomevfssink_uri_get_type), (gst_gnomevfssink_uri_get_protocols), (gst_gnomevfssink_uri_get_uri), (gst_gnomevfssink_uri_set_uri), (gst_gnomevfssink_uri_handler_init), (gst_gnomevfssink_set_property), (gst_gnomevfssink_get_property), (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_type), (gst_gnomevfssrc_init), (gst_gnomevfssrc_dispose), (gst_gnomevfssrc_uri_get_type), (gst_gnomevfssrc_uri_get_protocols), (gst_gnomevfssrc_uri_get_uri), (gst_gnomevfssrc_uri_set_uri), (gst_gnomevfssrc_uri_handler_init), (gst_gnomevfssrc_set_property), (gst_gnomevfssrc_get_property), (gst_gnomevfssrc_open_file), (gst_gnomevfssrc_close_file): * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): * ext/gnomevfs/gstgnomevfsuri.h: Add URI support to Gnome-VFS plugins. Tries to load a fixed list of fake URIs to see which this version of Gnome-VFS likes, and uses that for the Gst-URI interface. Makes playbin support http:// streams. Also fix up some stupid behaviour in gnomevfssrc. 2004-09-13 Ronald S. Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): Update mixer (to sync with other sessions) if we try to obtain a new value. This makes alsamixer work accross applications. * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): Only call sync functions if we're running, else alsalib asserts. * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): Sometimes fails to compile. Possibly a gcc bug. * gst/playback/gstplaybin.c: (gen_video_element), (gen_audio_element): Add a reference to an application-provided object, because we lose this same reference if we add it to the bin. If we don't do this, we can only use this object once and thus crash if we go from ready to playing, back to ready and back to playing again. Also add an audioscale element because several cheap soundcards - like mine - don't support all samplerates. * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), (gst_ximagesink_xcontext_clear), (gst_ximagesink_change_state): Fix wrong order or PAR calls. Makes automatically obtained PAR from the X server atually being used. 2004-09-12 David Schleef Fixes: #151879, #151881, #151882, #151883, #151884, #151886, #151887, #152102, #152247. * examples/indexing/indexmpeg.c: 64-bit warning fixes. * examples/seeking/cdparanoia.c: same * examples/seeking/cdplayer.c: same * examples/seeking/seek.c: same * examples/seeking/spider_seek.c: same * examples/seeking/vorbisfile.c: same * examples/stats/mp2ogg.c: same * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_dispose): Dispose of element properly. * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_seek): 64-bit warning fixes. * ext/nas/nassink.c: (gst_nassink_class_init), (gst_nassink_dispose): Dispose of element correctly. * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Fix leak. * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): Fix 64-bit warning. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): Fix 64-bit warning. 2004-09-12 Stephane Loeuillet * configure.ac : change speex detection as 1.1.6 now uses .pc/pkg-config and they changed their headers location. 2004-09-09 Arwed v. Merkatz * gst/matroska/matroska-mux.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), (gst_matroska_mux_start), (gst_matroska_mux_finish), (gst_matroska_mux_write_data): Write multiple blocks/frames per cluster. Write meta-seek information (seek heads). 2004-09-09 Scott Wheeler * gst/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_set_property), (gst_play_bin_get_property), (gen_audio_element), (gen_audio_element): Add a volume element / property to the pipeline. 2004-09-07 Wim Taymans * gst/videomixer/videomixer.c: (gst_videomixer_blend_buffers): Copy timestamps from the master pad to the output buffers. 2004-09-03 Thomas Vander Stichele * ext/raw1394/gstdv1394src.c: throw errors when applicable 2004-09-01 Arwed v. Merkatz * gst/matroska/ebml-ids.h: * gst/matroska/ebml-read.c: (gst_ebml_read_date): * gst/matroska/ebml-write.c: (gst_ebml_write_date): * gst/matroska/matroska-mux.c: (gst_matroska_mux_finish): automatically convert unix time <-> ebml time when reading/writing a date, use gst_ebml_write_uint to write CUETIME, not gst_ebml_write_date. * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_uid), (gst_matroska_mux_reset), (gst_matroska_mux_audio_pad_link), (gst_matroska_mux_track_header), (gst_matroska_mux_start), (gst_matroska_mux_write_data): Write track and segment UIDs, write muxing date, write TRACKDEFAULTDURATION for TTA audio, write BLOCKDURATION if known. Create cues for audio only files. 2004-08-31 Ronald S. Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): Re-commit ALSA switches. * gst/adder/gstadder.c: (gst_adder_loop): 64-bit fix (#151416). * gst/debug/progressreport.c: (gst_progressreport_report): 64-bit fix (#151419). * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_contents): 64-bit fix (#151420). * gst/playback/test3.c: (update_scale): 64-bit fix (#151421). 2004-08-31 Thomas Vander Stichele * configure.ac: bump nano to cvs === release 0.8.4 === 2004-08-02 Thomas Vander Stichele * configure.ac: releasing 0.8.4, "Alias" 2004-08-31 Thomas Vander Stichele * ext/theora/Makefile.am: fix makefile. Fixes #151462. 2004-08-30 Wim Taymans * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_wait): * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), (gst_multifdsink_remove_client_link), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write): * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): Fix some memory leaks. 2004-08-30 Thomas Vander Stichele Patch by: David Schleef * configure.ac: * sys/Makefile.am: rename our detection macro for V4L2. Fixes #151236. 2004-08-30 Thomas Vander Stichele Patch by: David Schleef * configure.ac: check to define LAMEPRESET. Fixes #151232. 2004-08-27 David Schleef * sys/glsink/glimagesink.c: (gst_glimagesink_ximage_put), (gst_glimagesink_xwindow_new), (gst_glimagesink_xcontext_get), (gst_glimagesink_fixate): Move local variable declarations to make gcc-2.95 happy. 2004-08-27 Thomas Vander Stichele * configure.ac: bump nano for prerelease 2004-08-27 David Schleef * sys/sunaudio/Makefile.am: Add sunaudiosrc patch from Bala * sys/sunaudio/gstsunaudiosrc.c: * sys/sunaudio/gstsunaudiosrc.h: 2004-08-27 Arwed v. Merkatz * gst/matroska/ebml-read.c: (gst_ebml_peed_id), (gst_ebml_read_element_id), handle EOS correctly * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_link): * gst/matroska/matroska-mux.h: added BITMAPINFOHEADER structure, mux video/x-divx and video/x-xvid in VFW compatibility mode 2004-08-27 Thomas Vander Stichele patch by: Zaheer Abbas Merali * ext/ogg/gstoggmux.c: * ext/vorbis/vorbisenc.c: * ext/vorbis/vorbisenc.h: handle NEWMEDIA 2004-08-26 Arwed v. Merkatz * gst/matroska/ebml-write.c: (gst_ebml_write_float), fix byte order reversion on little endian machines. * gst/matroska/matroska-mux.c: (audiosink_templ), (gst_matroska_mux_audio_pad_link): add TTA codec to the list of supported codecs. * gst/matroska/matroska-mux.c: (gst_matroska_mux_init), (gst_matroska_mux_start), (gst_matroska_mux_finish), (gst_matroska_mux_write_data): * gst/matroska/matroska-mux.h: write segment duration correctly, write muxing app string, fixes bugs #140897 and #140898. * gst/matroska/matroska-mux.c: (gst_matroska_mux_loop), wait for all pads to be negotiated before starting to mux. 2004-08-26 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain): * ext/lame/gstlame.h: Added new media support to lame 2004-08-25 Arwed v. Merkatz * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup), send vorbis headers at the beginning of a stream, fixes bug #141554. Interpret BLOCKDURATION and set buffer duration accordingly, fixes bug #148950. * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps), (gst_matroska_demux_plugin_init): * gst/matroska/matroska-ids.h: enable demuxing of TTA audio streams, fixes bug #148951. * gst/typefind/gsttypefindfunctions.c: (tta_type_find), (plugin_init), enable typefinding for TTA audio files, fixes bug #148711. * ext/xvid/gstxviddec.c: (gst_xviddec_chain), set XVID_LOWDELAY flag for decoding so xvid always returns an image, fixes playback of packed bitstream and xvid with bframes, bug #135407. 2004-08-24 Sebastien Cote * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), (gst_riff_read_element_data), (gst_riff_read_seek), (gst_riff_read_skip): fix infinite loop in wavparse, fixes bug #144616, patch reviewed by Ronald and committed by Christophe Fergeau 2004-08-23 Iain * ext/mad/gstid3tag.c (gst_mad_id3_to_tag_list): Special case COMM tags. They appear to be handled differently to normal. (tag_list_to_id3_tag_foreach): Ditto. 2004-08-22 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): Make sure we never send -1 granulepos. 2004-08-20 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), (gst_ogg_mux_loop): I will accept bitchslappings with non sharp objects. 2004-08-20 Zaheer Abbas Merali * configure.ac: Clean up the test for lame presets 2004-08-19 Zaheer Abbas Merali * configure.ac: * ext/lame/Makefile.am: * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): Only enable lame presets if version of lame has presets in API 2004-08-19 Jan Schmidt * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_get): * gst/udp/gstudpsrc.h: Don't call gst_pad_push in a get function. Fixes #150449 2004-08-18 Wim Taymans * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_set_mode), (gst_fdset_get_mode), (gst_fdset_add_fd), (gst_fdset_remove_fd), (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), (gst_fdset_wait): * gst/tcp/gstfdset.h: * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write): * gst/tcp/gstmultifdsink.h: Some extra checks in gstfdset. Only use send() when the fd is a socket. Don't try to read from write only fds. 2004-08-18 Wim Taymans * gst/tcp/gstfdset.c: (gst_fdset_add_fd), (gst_fdset_remove_fd), (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), (gst_fdset_wait): Add more locking and bounds checking. 2004-08-18 Wim Taymans * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_wait): Realloc test fdset in the lock and right before starting the poll call. Bump the limit to 4096. 2004-08-17 David Schleef * sys/sunaudio/Makefile.am: * sys/sunaudio/gstsunaudio.c: Fix caps to handle full range of rates and channels. Make debugging less obnoxious. Patch from Balamurali Viswanathan implementing a mixer for Sun audio. (bug #144091): * sys/sunaudio/gstsunelement.c: * sys/sunaudio/gstsunelement.h: * sys/sunaudio/gstsunmixer.c: * sys/sunaudio/gstsunmixer.h: 2004-08-17 Zaheer Abbas Merali * gst/audioscale/gstaudioscale.c: * gst/audioscale/gstaudioscale.h: made audioscale resample from any sample rate to any sample rate 2004-08-17 Thomas Vander Stichele * ext/libpng/gstpngdec.c: error out on unsupported types 2004-08-17 Iain * ext/flac/gstflacenc.c (gst_flacenc_update_quality): Only set the mid_side and loose_mid_side properties if its a stereo stream. 2004-08-17 Wim Taymans * ext/theora/theoradec.c: (gst_theora_dec_class_init), (theora_get_formats), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): Add a debug line. 2004-08-17 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate), (gst_ogg_pad_push): * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), (gst_ogg_mux_request_new_pad), (gst_ogg_mux_next_buffer), (gst_ogg_mux_buffer_from_page), (gst_ogg_mux_push_page), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): Mark delta units in the muxer. Try to decode the packet after an out-of-sync error from libogg. 2004-08-17 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_add), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_set_property), (gst_multifdsink_get_property): * gst/tcp/gstmultifdsink.h: Added option to send a keyframe to clients as the first buffer. Make timeout property writable. 2004-08-17 Thomas Vander Stichele patch by: Wim Taymans * gst/tcp/gstfdset.c: * gst/tcp/gstmultifdsink.c: fix index comparison, should include 0 2004-08-16 Wim Taymans * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_new), (gst_fdset_add_fd), (gst_fdset_remove_fd), (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), (gst_fdset_wait): copy when reallocing for poll so the select arguments don't get changed during the call 2004-08-16 Wim Taymans * ext/theora/theoraenc.c: (gst_border_mode_get_type), (gst_theora_enc_class_init), (theora_enc_sink_link), (theora_buffer_from_packet), (theora_enc_chain): Fix bug where buffers were not marked as keyframes correctly. 2004-08-15 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), (gst_lame_preset_get_type), (gst_lame_class_init): describe the enum values for vbr mode and presets more verbosely 2004-08-13 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_mode_get_type), (gst_lame_quality_get_type), (gst_lame_padding_get_type), (gst_lame_preset_get_type), (gst_lame_class_init), (gst_lame_init), (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): * ext/lame/gstlame.h: add preset property to lame so it can use lame presets 2004-08-13 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_get_property): whoops forgot break, thanks teuf 2004-08-13 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), (gst_lame_class_init), (gst_lame_src_getcaps), (gst_lame_sink_link), (gst_lame_init), (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): * ext/lame/gstlame.h: fix lame's broken vbr stuff, allow it to resample if need be, and also make xing header optional 2004-08-12 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_src_getcaps), (gst_lame_init): added getcaps function so samplerate doesnt get fixated to silly values 2004-08-12 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_src_link): revert previous fix 2004-08-12 Johan Dahlin * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Remove bogus checks. Doesn't matter what state we are in. Interfaces are a compile time thing, not runtime. It also broke the python bindings. 2004-08-12 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_src_link): made source pad link function check if sinkpad is ok..fixes the problem where core fixates the output rate of lame stupidly 2004-08-12 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_fixate): * sys/v4l/v4l_calls.c: * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_set_capture): fix fixate function to handle nonsimple caps. remove bogus check in _link cleanups 2004-08-12 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init): set default compression ratio parameter to 0.0 so bitrate parameter works :) 2004-08-11 David Schleef * gst/tcp/gstfdset.c: Fix compile problem on OS/X. 2004-08-11 David Schleef * gst/mpeg1sys/gstmpeg1systemencode.c: Oops, this was correct before. 2004-08-11 David Schleef * gst-libs/gst/video/videosink.h: Change copyright block to LGPL. 2004-08-11 David Schleef * ext/pango/gsttextoverlay.c: Add copyright block and fix plugin license field * gst-libs/gst/idct/Makefile.am: Remove mmx/sse code * gst-libs/gst/video/gstvideosink.c: Change copyright block to LGPL. * gst/auparse/gstauparse.c: Fix plugin license field. * gst/monoscope/gstmonoscope.c: Fix plugin license field. * gst/mpeg1sys/gstmpeg1systemencode.c: Fix plugin license field. * gst/rtp/gstrtp.c: Fix plugin license field. 2004-08-11 Wim Taymans * gst/tcp/Makefile.am: * gst/tcp/gstfdset.c: (gst_fdset_mode_get_type), (nearest_pow), (ensure_size), (gst_fdset_new), (gst_fdset_free), (gst_fdset_set_mode), (gst_fdset_get_mode), (gst_fdset_add_fd), (gst_fdset_remove_fd), (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), (gst_fdset_wait): * gst/tcp/gstfdset.h: * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_clear), (gst_multifdsink_get_stats), (gst_multifdsink_remove_client_link), (gst_multifdsink_handle_client_read), (gst_multifdsink_client_queue_data), (gst_multifdsink_client_queue_caps), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), (gst_multifdsink_get_property), (gst_multifdsink_init_send), (gst_multifdsink_close): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), (gst_tcpserversink_handle_wait), (gst_tcpserversink_init_send), (gst_tcpserversink_close): * gst/tcp/gsttcpserversink.h: Abstracted away the select call, implemented poll (yes we ran into the 1024 limit in production). 2004-08-11 Thomas Vander Stichele * gst/tcp/gsttcp.c: * gst/tcp/gsttcpplugin.c: improve debuggging, remove assert 2004-08-10 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), (gst_client_status_get_type), (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_remove_client_link), (gst_multifdsink_handle_client_read), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), (gst_multifdsink_get_property): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcp-marshal.list: Starting to prepare for specifying buffer time in other units than buffers. Expose remove reason in signal. 2004-08-10 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_clear), (gst_multifdsink_remove_client_link), (gst_multifdsink_handle_client_read), (gst_multifdsink_client_queue_data), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_chain), (gst_multifdsink_close): * gst/tcp/gstmultifdsink.h: Added more debugging info. Changed the way clients are removed from the lists. Fixed a bug where a bad file descriptor could cause many clients to be removed. 2004-08-06 Benjamin Otte * gst/videotestsrc/gstvideotestsrc.c: (generate_capslist): allow all pixel-aspect-ratios, not just 1:1 2004-08-09 David Schleef * sys/glsink/ARB_multitexture.h: Remove old files. * sys/glsink/EXT_paletted_texture.h: * sys/glsink/NV_register_combiners.h: * sys/glsink/gstgl_nvimage.c: * sys/glsink/gstgl_pdrimage.c: * sys/glsink/gstgl_rgbimage.c: * sys/glsink/gstglsink.c: * sys/glsink/gstglsink.h: * sys/glsink/gstglxwindow.c: * sys/glsink/regcomb_yuvrgb.c: 2004-08-09 David Schleef Patch from Gernot Ziegler rewriting the GL sink plugin. (Bug #147302) * configure.ac: Test for OpenGL * sys/Makefile.am: Use test for OpenGL * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: rewrite * sys/glsink/glimagesink.h: rewrite 2004-08-09 David Schleef * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init): Only allow sane framerates. * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): same * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): same * testsuite/gst-lint: Test for G_GUINT64_FORMAT usage near gettext. 2004-08-09 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_get_stats), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_read), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): Do a bit more logging, make the client_read code more robust. 2004-08-09 Thomas Vander Stichele * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init_source), (gst_jpegdec_fill_input_buffer), (gst_jpegdec_skip_input_data), (gst_jpegdec_resync_to_restart), (gst_jpegdec_term_source), (gst_jpegdec_init), (gst_jpegdec_chain): * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), (gst_multipart_demux_chain), (gst_multipart_demux_change_state): cleanups, debugging fixes and memleak plugging 2004-08-09 Wim Taymans * ext/theora/theoradec.c: (gst_theora_dec_class_init), (theora_get_formats), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain), (theora_dec_change_state): Don't crash on missing header packets. 2004-08-09 Thomas Vander Stichele * po/LINGUAS: * po/sq.po: Added Albanian translation (Laurent Dhima) * po/cs.po: updated 2004-08-09 Thomas Vander Stichele * ext/lame/gstlame.c: fix/add debugging 2004-08-09 Thomas Vander Stichele * sys/ximage/ximagesink.c: * sys/xvimage/xvimagesink.c: assign all TOO_LAZY's to a real category. Thanks to Warthy Warthog. 2004-08-06 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_get_stats), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_read), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): Make sure we don't try to read more from a client that what ioctl says us or we deadlock. 2004-08-05 Thomas Vander Stichele * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_src_link), (gst_videotestsrc_change_state), (gst_videotestsrc_src_query), (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): decouple running_time and n_frames so it can handle changing framerate while running 2004-08-05 Thomas Vander Stichele * po/nl.po: * po/sv.po: updated translations 2004-08-04 Benjamin Otte * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get_capslist), (generate_capslist), (plugin_init): generate the list of supported caps at startup and reuse it instead of always generating it 2004-07-30 Benjamin Otte * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link): whoops, last checkin broke normal build 2004-08-03 Benjamin Otte * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): * ext/dvdnav/dvdnavsrc.c: (dvdnav_get_event_name), (dvdnavsrc_print_event): * ext/ogg/gstoggdemux.c: (_find_chain_process), (gst_ogg_print): * ext/ogg/gstoggmux.c: (gst_ogg_mux_pad_link), (gst_ogg_mux_pad_unlink): * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link), (gst_multipart_mux_pad_unlink): * gst/videofilter/gstvideobalance.c: (gst_videobalance_colorbalance_set_value): * gst/videomixer/videomixer.c: (gst_videomixer_pad_link), (gst_videomixer_pad_unlink): * po/uk.po: * sys/oss/gstossmixer.c: * sys/v4l/gstv4lcolorbalance.c: * sys/v4l/gstv4ltuner.c: * sys/v4l/v4lsrc_calls.c: * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2tuner.c: compile fixes for --disable-gst-debug, G_DISABLE_ASSERT and friends 2004-08-03 Benjamin Otte * examples/dynparams/filter.c: (ui_control_create): * examples/gstplay/player.c: (print_tag): * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad): * ext/gdk_pixbuf/gstgdkanimation.c: (gst_gdk_animation_iter_may_advance): * ext/jack/gstjack.c: (gst_jack_request_new_pad): * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), (tag_list_to_id3_tag_foreach), (gst_id3_tag_handle_event): * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_tag_value): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value): * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): * gst-libs/gst/media-info/media-info-test.c: (print_tag): * gst/sine/demo-dparams.c: (main): * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): * testsuite/alsa/formats.c: (create_pipeline): * testsuite/alsa/sinesrc.c: (sinesrc_force_caps), (sinesrc_get): fixes for G_DISABLE_ASSERT and friends * gst/typefind/gsttypefindfunctions.c: (aac_type_find), (mp3_type_frame_length_from_header), (mp3_type_find), (plugin_init): require mp3 typefinding to have at least MIN_HEADERS valid headers add typefinding for AAC adts files 2004-08-04 Jan Schmidt * sys/ximage/ximagesink.c: (gst_ximagesink_calculate_pixel_aspect_ratio): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_calculate_pixel_aspect_ratio): Make sure we calculate pixel-aspect-ratio using floating point maths 2004-08-03 Thomas Vander Stichele * po/uk.po: updated translation 2004-08-03 Thomas Vander Stichele * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get): add debugging for display PAR calculation 2004-08-02 David Schleef * configure.ac: Fix mikmod CFLAGS. 2004-07-27 Benjamin Otte * gst/audioscale/gstaudioscale.c: - fix templates to only support S16, it's the only format that works - make caps nego code use try_set_caps_nonfixed and fixation instead of try_set_caps twice, which is not nice for autopluggers - change rank to secondary, so autopluggers can pick it up after audioconvert 2004-08-02 Iain * gst/interleave/interleave.c (interleave_init), (interleave_request_new_pad), (interleave_pad_removed), (interleave_buffered_loop): Use the real pad count, not the artificial one. 2004-08-02 Thomas Vander Stichele * configure.ac: bump nano back to development === release 0.8.3 === 2004-08-02 Thomas Vander Stichele * configure.ac: releasing 0.8.3, "Water" 2004-08-02 Thomas Vander Stichele * sys/xvimage/xvimagesink.c: (gst_xvimagesink_calculate_pixel_aspect_ratio), (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_sink_link), (gst_xvimagesink_change_state), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), (gst_xvimagesink_init), (gst_xvimagesink_class_init): * sys/xvimage/xvimagesink.h: apply similar PAR fixes as to ximagesink 2004-08-02 Thomas Vander Stichele patch from: Benjamin Otte * ext/lame/gstlame.c: (gst_lame_src_link), (gst_lame_init): add link function to lame. Fixes #148986. 2004-08-02 Johan Dahlin * gst/multipart/multipartmux.c (gst_multipart_mux_next_buffer): fix debugging log 2004-07-30 David Schleef * gst/videomixer/Makefile.am: Fix things that should have been fixed in the last checkin. 2004-07-30 David Schleef * gst/multipart/Makefile.am: Fix things that should have been fixed in the last checkin. 2004-07-30 David Schleef * testsuite/multifilesink/Makefile.am: Fix unused variable. 2004-07-30 Thomas Vander Stichele * configure.ac: bump nano for prerelease * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/nl.po: * po/sr.po: * po/sv.po: * po/uk.po: updates 2004-07-30 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_clear), (gst_multifdsink_get_stats), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): * gst/tcp/gstmultifdsink.h: Recover from a select with a bad file descriptor by removing the client. 2004-07-30 Thomas Vander Stichele * configure.ac: fix requirement of core * gst-libs/gst/play/play.c: (gst_play_error_plugin), (gst_play_pipeline_setup): don't use colorspace element. do use hermescolorspace element. make macro to get a colorspace element. mark strings for translation. * po/POTFILES.in: add play.c * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/nl.po: * po/sr.po: * po/sv.po: * po/uk.po: update translations 2004-07-30 Zaheer Abbas Merali * ext/libpng/gstpngenc.c: (gst_pngenc_class_init): fix default for newmedia flag 2004-07-30 Wim Taymans * ext/theora/theoradec.c: (gst_theora_dec_class_init), (gst_theora_dec_init), (theora_get_formats), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain), (theora_dec_set_property), (theora_dec_get_property): * ext/theora/theoraenc.c: (gst_border_mode_get_type), (gst_theora_enc_class_init), (gst_theora_enc_init), (theora_enc_sink_link), (theora_enc_chain), (theora_enc_set_property), (theora_enc_get_property): Added cropping option to theora decoder. Added border option to theora encoder. 2004-07-30 Zaheer Abbas Merali * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), (gst_pngenc_set_property): * ext/libpng/gstpngenc.h: Added newmedia support to pngenc so now gst-launch-0.8 videotestsrc ! ffmpegcolorspace ! pngenc snapshot=false newmedia=true ! multifilesink location=blah%d.png works as expected 2004-07-30 Wim Taymans * ext/theora/theoraenc.c: (gst_theora_enc_class_init), (theora_enc_sink_link), (theora_enc_chain), (theora_enc_set_property), (theora_enc_get_property): Fix encoding of non-multiple-of-16 video. 2004-07-29 David Schleef * configure.ac: make test for audiofile more strict 2004-07-25 Benjamin Otte * gst/typefind/gsttypefindfunctions.c: (plugin_init): give different names to typefind functions 2004-07-28 Thomas Vander Stichele * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_calculate_pixel_aspect_ratio), (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), (gst_ximagesink_sink_link), (gst_ximagesink_change_state), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_set_property), (gst_ximagesink_get_property), (gst_ximagesink_init): * sys/ximage/ximagesink.h: allocate PAR's dynamically. use autodetected PAR if no object-set PAR is given. add workaround for directfb's X not setting physical size. fix to xvimagesink will follow tomorrow. 2004-07-28 Zaheer Abbas Merali * ext/lame/gstlame.c: (gst_lame_chain): send tag events downstream * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), (gst_shout2send_get_type), (gst_shout2send_set_clock), (gst_shout2send_class_init), (gst_shout2send_init), (set_shout_metadata), (gst_shout2send_set_metadata), (gst_shout2send_chain), (gst_shout2send_set_property), (gst_shout2send_get_property), (gst_shout2send_connect), (gst_shout2send_change_state): * ext/shout2/gstshout2.h: - fix for sending mp3 audio to icecast2 server, if pad link function not called before PAUSED state - added option to use GStreamer clock sync (as opposed to libshout's own sync) - added tagging support for mp3 audio broadcasted * gst/monoscope/gstmonoscope.c: (gst_monoscope_class_init): debug info 2004-07-28 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), (gst_ogg_demux_push): Return query failure when we don't know the length of an ogg stream insteda of returning TRUE with a bogus value. 2004-07-28 Wim Taymans * ext/theora/theoradec.c: (theora_get_formats), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): Don't screw up the 1 Chroma for 1 luma sample situation when we have an odd offset/width by adding a black border in those cases. 2004-07-28 Wim Taymans * ext/theora/theoradec.c: (theora_get_formats), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): * ext/theora/theoraenc.c: (theora_enc_sink_link): Added first attempt at cropping of the image as required by the theora spec. We need more properties in the caps (offset_x, offset_y,stride) to implement this correctly. 2004-07-28 Jan Schmidt * ext/dvdnav/README: Update the README to use dvddemux * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): Ensure getcaps returns a subset of the template caps * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_base_init), (gst_mpeg2subt_init): Ensure getcaps returns a subset of the template caps * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), (gst_dvd_demux_init), (gst_dvd_demux_get_video_stream), (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_set_cur_subpicture): * gst/mpegstream/gstdvddemux.h: Set the explicit caps on the current_video pad before pushing anything * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), (gst_mpeg_demux_get_audio_stream): Free caps used to gst_pad_set_explicit_caps, which takes a const GstCaps * 2004-07-28 Thomas Vander Stichele * configure.ac: update GStreamer requirement to 0.8.4 because of GstFraction. 2004-07-28 Wim Taymans * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt), (gst_wavparse_handle_seek), (gst_wavparse_srcpad_event): Add the pad to the element after setting up the caps. This makes it a lot easier to autoplug. 2004-07-27 Steve Lhomme * gst/median/gstmedian.c: * gst/mpeg2subt/gstmpeg2subt.c: * gst/mpegaudioparse/gstmpegaudioparse.c: * gst/mpegstream/gstdvddemux.c: * gst/mpegstream/gstmpegdemux.c: * gst/mpegstream/gstmpegpacketize.c: * gst/rtjpeg/gstrtjpeg.c: * gst/rtjpeg/gstrtjpegdec.c: * gst/rtjpeg/gstrtjpegenc.c: * gst/sine/gstsinesrc.c: * gst/smooth/gstsmooth.c: * gst/smpte/gstsmpte.c: * gst/smpte/gstsmpte.h: * gst/stereo/gststereo.c: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideofilter.c: * gst/videofilter/gstvideoflip.c: * gst/videoscale/gstvideoscale.c: * gst/videoscale/videoscale.c: * gst/videotestsrc/gstvideotestsrc.c: * gst/videotestsrc/videotestsrc.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: fix local includes and 64 bits constants 2004-07-27 Steve Lhomme * win32/gst.sln: * gst-libs/gst/*/*.vcproj: * gst/*/*.vcproj: more working plugins 2004-07-27 Zaheer Abbas Merali * testsuite/alsa/Makefile.am: * testsuite/alsa/srcstate.c: add test for alsasrc changing state 2004-07-27 Zaheer Abbas Merali * gst/silence/gstsilence.c: (gst_silence_init), (gst_silence_link), (gst_silence_get): * gst/silence/gstsilence.h: fix silence generation for 16bit raw audio 2004-07-27 Thomas Vander Stichele * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_metadata), (gst_matroska_demux_video_caps), (gst_matroska_demux_plugin_init): * gst/mpegaudio/common.c: * gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init), (gst_videoscale_getcaps), (gst_videoscale_link), (gst_videoscale_src_fixate), (gst_videoscale_init), (gst_videoscale_finalize): * gst/videoscale/gstvideoscale.h: * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get_capslist): * gst/wavenc/gstwavenc.c: * sys/oss/gstossmixer.c: (fill_labels): * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), (gst_ximagesink_calculate_pixel_aspect_ratio), (gst_ximagesink_xcontext_get), (gst_ximagesink_fixate), (gst_ximagesink_getcaps), (gst_ximagesink_sink_link), (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_set_property), (gst_ximagesink_get_property), (gst_ximagesink_init), (gst_ximagesink_class_init): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_calculate_pixel_aspect_ratio), (gst_xvimagesink_xcontext_get), (gst_xvimagesink_sink_link), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), (gst_xvimagesink_init), (gst_xvimagesink_class_init): * sys/xvimage/xvimagesink.h: first batch of pixel aspect ratio commits. 2004-07-27 Thomas Vander Stichele * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_chain): * gst/ffmpegcolorspace/imgconvert.c: (avpicture_fill): handle stride, needs work if we want to move stride handling upstream, but works correctly for our purposes. 2004-07-27 Thomas Vander Stichele * gst/videoscale/README: add testing examples * gst/videoscale/gstvideoscale.c: (gst_videoscale_link), (gst_videoscale_chain): * gst/videoscale/videoscale.c: (gst_videoscale_setup), (gst_videoscale_get_size): add get_size function that handles stride like videotestsrc. fixes conversion for YUV formats for as much as I can test them. 2004-07-27 Thomas Vander Stichele * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xvimage_put): further cleanups, logging, error handling and synchronizing 2004-07-27 Wim Taymans * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), (gst_videomixer_pad_set_property), (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), (gst_video_mixer_background_get_type), (gst_videomixer_get_type), (gst_videomixer_class_init), (gst_videomixer_init), (gst_videomixer_getcaps), (gst_videomixer_request_new_pad), (gst_videomixer_blend_ayuv_i420), (pad_zorder_compare), (gst_videomixer_sort_pads), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), (gst_videomixer_loop), (plugin_init): Be a nicer negotiation citizen and provide a getcaps function on the srcpad. This also fixes a crash when resizing. 2004-07-27 Julien MOUTTE * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new): Some fixes to image size calculation. 2004-07-27 Wim Taymans * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps): * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), (gst_pngenc_set_property): * ext/libpng/gstpngenc.h: Added snapshot property to pngenc. removed g_print from pngdec 2004-07-27 Steve Lhomme * gst/ac3parse/ac3parse.vcproj * gst/adder/adder.vcproj * gst/alpha/alpha.vcproj * gst/alpha/alphacolor.vcproj * gst/asfdemux/asf.vcproj * gst/audioconvert/audioconvert.vcproj * gst/audiorate/audiorate.vcproj * gst/audioscale/audioscale.vcproj * gst/auparse/auparse.vcproj * gst/avi/avi.vcproj * gst/cdxaparse/cdxaparse.vcproj * gst/chart/chart.vcproj * gst/colorspace/colorspace.vcproj * gst/cutter/cutter.vcproj * gst/debug/debug.vcproj * gst/debug/efence.vcproj * gst/debug/navigationtest.vcproj * gst/deinterlace/deinterlace.vcproj * gst/effectv/effectv.vcproj * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj * gst/filter/filter.vcproj * gst/flx/flxdec.vcproj * gst/goom/goom.vcproj * gst/interleave/interleave.vcproj * gst/law/alaw.vcproj * gst/law/mulaw.vcproj * gst/matroska/matroska.vcproj * gst/median/median.vcproj * gst/mixmatrix/mixmatrix.vcproj * gst/mpeg1sys/mpeg1systemencode.vcproj * gst/mpeg1videoparse/mp1videoparse.vcproj * gst/mpeg2sub/mpeg2subt.vcproj * gst/mpegaudio/mpegaudio.vcproj * gst/mpegaudioparse/mpegaudioparse.vcproj * gst/mpegstream/mpegstream.vcproj * gst/multifilesink/multifilesink.vcproj * gst/multipart/multipart.vcproj * gst/oneton/oneton.vcproj * gst/overlay/overlay.vcproj * gst/passthrough/passthrough.vcproj * gst/qtdemux/qtdemux.vcproj * gst/realmedia/rmdemux.vcproj * gst/rtjpeg/rtjpeg.vcproj * gst/rtp/rtp.vcproj * gst/silence/silence.vcproj * gst/sine/sinesrc.vcproj * gst/smooth/smooth.vcproj * gst/smpte/smpte.vcproj * gst/spectrum/spectrum.vcproj * gst/speed/speed.vcproj * gst/stereo/stereo.vcproj * gst/switch/switch.vcproj * gst/tags/tagedit.vcproj * gst/tcp/tcp.vcproj * gst/typefind/typefindfunctions.vcproj * gst/udp/udp.vcproj * gst/videobox/videobox.vcproj * gst/videocrop/videocrop.vcproj * gst/videodrop/videodrop.vcproj * gst/videofilter/gamma.vcproj * gst/videofilter/videobalance.vcproj * gst/videofilter/videofilter.vcproj * gst/videofilter/videoflip.vcproj * gst/videoflip/videoflip.vcproj * gst/videomixer/videomixer.vcproj * gst/videorate/videorate.vcproj * gst/videoscale/videoscale.vcproj * gst/videotestsrc/videotestsrc.vcproj * gst/virtualdub/virtualdub.vcproj * gst/volenv/volenv.vcproj * gst/volume/volume.vcproj * gst/wavenc/wavenc.vcproj * gst/wavparse/wavparse.vcproj * gst/y4m/y4menc.vcproj * gst-libs/gst/audio/audio.vcproj * gst-libs/gst/audio/audiofilter.vcproj * gst-libs/gst/colorbalance/colorbalance.vcproj * gst-libs/gst/idct/idtc.vcproj * gst-libs/gst/media-info/media-info.vcproj * gst-libs/gst/mixer/mixer.vcproj * gst-libs/gst/navigation/navigation.vcproj * gst-libs/gst/play/play.vcproj * gst-libs/gst/propertyprobe/propertyprobe.vcproj * gst-libs/gst/resample/resample.vcproj * gst-libs/gst/riff/riff.vcproj * gst-libs/gst/tuner/tuner.vcproj * gst-libs/gst/video/video.vcproj * gst-libs/gst/xoverlay/xoverlay.vcproj avoid problems with math.h, fix release dependancy rename GStreamer-0.8.lib to libgstreamer.lib 2004-07-27 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate): When the atom is not available we have to unlock the mutex. Fixes #148023 2004-07-26 Steve Lhomme * gst-libs/gst/media-info/media-info.h: issue for a vararg macro with MSVC 2004-07-26 Steve Lhomme * gst/effectv/effectv.vcproj * gst-libs/gst/idct/idct.vcproj: * gst-libs/gst/media-info/media-info.vcproj: * gst-libs/gst/navigation/navigation.vcproj: * gst-libs/gst/propertyprobe/propertyprobe.vcproj: * gst-libs/gst/video/video.vcproj: * gst-libs/gst/xoverlay/xoverlay.vcproj: fixes for build problems 2004-07-26 Steve Lhomme * gst-libs/gst/audio/audio.def: * gst-libs/gst/audio/riff.def: add some definitions needed by plugins 2004-07-26 Steve Lhomme * gst/asfdemux/gstasfmux.c Fix some 64 bits constants to be glib friendly 2004-07-26 Steve Lhomme * gst/ac3parse/gstac3parse.c * gst/audioscale/gstaudioscale.c * gst/auparse/gstauparse.c * gst/colorspace/gstcolorspace.c * gst/colorspace/yuv2rgb.h local include fixes 2004-07-26 Steve Lhomme * win32/gst.sln add more plugins to the build 2004-07-26 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new): Some more fixes to image size calculation. 2004-07-26 Thomas Vander Stichele * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), (gst_level_set_property), (gst_level_get_property), (gst_level_base_init), (gst_level_class_init): add debugging categories. cleanups. 2004-07-26 Thomas Vander Stichele * gst/videoscale/videoscale.c: (gst_videoscale_setup), (gst_videoscale_planar411), (gst_videoscale_planar400), (gst_videoscale_packed422), (gst_videoscale_packed422rev), (gst_videoscale_scale_nearest_str1), (gst_videoscale_scale_nearest_str2), (gst_videoscale_scale_nearest_str4), (gst_videoscale_scale_nearest_16bit), (gst_videoscale_scale_nearest_24bit): fixed stride issues tested with 320x240 -> 321, 322, 324 x240 tested with YV12, I420, YUY2, UYVY fixed packed422rev (don't think it could have worked before) by testing with UYVY 2004-07-26 Benjamin Otte * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_init), (gst_lame_chain), (gst_lame_setup), (gst_lame_change_state), (plugin_init): add debugging category, add error checks like checking return values of setup calls, make sure it still works after PLAYING=>NULL=>PLAYING, fix encoding of mono streams 2004-07-26 Wim Taymans * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), (gst_mpeg_demux_get_audio_stream), (gst_mpeg_demux_process_private): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_send_data): Check for error codes from the negotiation functions. Make sure we really set the pad caps when a new pad is created. 2004-07-26 Thomas Vander Stichele * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_pix_fmt): * gst/ffmpegcolorspace/gstffmpegcodecmap.h: * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_pad_link): don't make function do two things at the same time without reason. 2004-07-26 Steve Lhomme * gst/ac3parse/ac3parse.vcproj * gst/adder/adder.vcproj * gst/alpha/alpha.vcproj * gst/alpha/alphacolor.vcproj * gst/asfdemux/asf.vcproj * gst/audioconvert/audioconvert.vcproj * gst/audiorate/audiorate.vcproj * gst/audioscale/audioscale.vcproj * gst/auparse/auparse.vcproj * gst/avi/avi.vcproj * gst/cdxaparse/cdxaparse.vcproj * gst/chart/chart.vcproj * gst/colorspace/colorspace.vcproj * gst/cutter/cutter.vcproj * gst/debug/debug.vcproj * gst/debug/efence.vcproj * gst/debug/navigationtest.vcproj * gst/deinterlace/deinterlace.vcproj * gst/effectv/effectv.vcproj * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj * gst/filter/filter.vcproj * gst/flx/flxdec.vcproj * gst/goom/goom.vcproj * gst/interleave/interleave.vcproj * gst/law/alaw.vcproj * gst/law/mulaw.vcproj * gst/matroska/matroska.vcproj * gst/median/median.vcproj * gst/mixmatrix/mixmatrix.vcproj * gst/mpeg1sys/mpeg1systemencode.vcproj * gst/mpeg1videoparse/mp1videoparse.vcproj * gst/mpeg2sub/mpeg2subt.vcproj * gst/mpegaudio/mpegaudio.vcproj * gst/mpegaudioparse/mpegaudioparse.vcproj * gst/mpegstream/mpegstream.vcproj * gst/multifilesink/multifilesink.vcproj * gst/multipart/multipart.vcproj * gst/oneton/oneton.vcproj * gst/overlay/overlay.vcproj * gst/passthrough/passthrough.vcproj * gst/qtdemux/qtdemux.vcproj * gst/realmedia/rmdemux.vcproj * gst/rtjpeg/rtjpeg.vcproj * gst/rtp/rtp.vcproj * gst/silence/silence.vcproj * gst/sine/sinesrc.vcproj * gst/smooth/smooth.vcproj * gst/smpte/smpte.vcproj * gst/spectrum/spectrum.vcproj * gst/speed/speed.vcproj * gst/stereo/stereo.vcproj * gst/switch/switch.vcproj * gst/tags/tagedit.vcproj * gst/tcp/tcp.vcproj * gst/typefind/typefindfunctions.vcproj * gst/udp/udp.vcproj * gst/videobox/videobox.vcproj * gst/videocrop/videocrop.vcproj * gst/videodrop/videodrop.vcproj * gst/videofilter/gamma.vcproj * gst/videofilter/videobalance.vcproj * gst/videofilter/videofilter.vcproj * gst/videofilter/videoflip.vcproj * gst/videoflip/videoflip.vcproj * gst/videomixer/videomixer.vcproj * gst/videorate/videorate.vcproj * gst/videoscale/videoscale.vcproj * gst/videotestsrc/videotestsrc.vcproj * gst/virtualdub/virtualdub.vcproj * gst/volenv/volenv.vcproj * gst/volume/volume.vcproj * gst/wavenc/wavenc.vcproj * gst/wavparse/wavparse.vcproj * gst/y4m/y4menc.vcproj more plugins supported under windows 2004-07-26 Thomas Vander Stichele * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_put), (gst_ximagesink_renegotiate_size), (gst_ximagesink_chain), (gst_ximagesink_buffer_alloc): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc): Add debugging statements. Use the sizes as returned by the *CreateImage calls. 2004-07-26 Johan Dahlin * gst/tcp/gsttcpclientsrc.c (gst_tcpclientsrc_get): Make sure that the pad is negotiated. * gst/ffmpegcolorspace/gstffmpegcolorspace.c (gst_ffmpegcolorspace_chain): Ditto 2004-07-26 Steve Lhomme * gst-libs/gst/colorbalance/colorbalance.vcproj: * gst-libs/gst/idct/idct.vcproj: * gst-libs/gst/media-info/media-info.vcproj: * gst-libs/gst/mixer/mixer.vcproj: * gst-libs/gst/navigation/navigation.vcproj: * gst-libs/gst/play/play.vcproj: * gst-libs/gst/propertyprobe/propertyprobe.vcproj: * gst-libs/gst/resample/resample.vcproj: * gst-libs/gst/tuner/tuner.vcproj: * gst-libs/gst/video/video.vcproj: * gst-libs/gst/xoverlay/xoverlay.vcproj: more plugins supported under windows 2004-07-25 Iain * gst/wavparse/gstwavparse.c (gst_wavparse_fmt): Set the caps on the pad now rather than when the pad is created because state changes wipe explicit caps (fixes #148043). 2004-07-25 Sebastien Cote reviewed by Benjamin Otte * ext/mad/gstmad.c: fix mad plugin crashing on Sun (fixes #148289) 2004-07-25 Steve Lhomme * gst/avi/avi.def: * gst/avi/avi.vcproj: * gst/matroska/matroska.def: * gst/matroska/matroska.vcproj: remove unused .def files 2004-07-25 Steve Lhomme * gst-libs/gst/audio/gstaudiofilter.c: Clean the local include 2004-07-25 Steve Lhomme * win32/gst.sln: * gst-libs/gst/audio/audio.def: * gst-libs/gst/audio/audio.vcproj: * gst-libs/gst/audio/audiofilter.vcproj: * gst-libs/gst/audio/riff.def: * gst-libs/gst/audio/riff.vcproj: * gst-libs/gst/gst-libs.def: * gst-libs/gst/gst-libs.vcproj: * gst/avi/avi.vcproj: * gst/avi/avi.vcproj: Copy the files where needed after building, cleaner projects 2004-07-25 Steve Lhomme * gst/matroska/ebml-write.c: Fix some 64 bits constants to be glib friendly 2004-07-24 Steve Lhomme * win32/gst.sln: * gst-libs/gst/gst-libs.def: * gst-libs/gst/gst-libs.vcproj: * gst/matroska/matroska.def: * gst/matroska/matroska.vcproj: Add the preliminary canvas to build plugins on Win32 2004-07-23 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): don't enfore negotiation from source side, it breaks sinesrc ! audioconvert ! osssink 2004-07-22 David Schleef * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add typefind for ELF files, since they can easily be recognized as audio/mpeg. (bug #147441) 2004-07-22 Thomas Vander Stichele * gst/videoscale/videoscale.c: (gst_videoscale_setup), (gst_videoscale_planar411), (gst_videoscale_scale_nearest_32bit), (gst_videoscale_scale_nearest_24bit), (gst_videoscale_scale_nearest_16bit): fix 16bit and 24bit for stride (24bit might need testing) don't pretend we do more than one algorithm 2004-07-22 Zaheer Abbas Merali * configure.ac: * gst/Makefile.am: * gst/multifilesink/Makefile.am: * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_get_formats), (gst_multifilesink_get_query_types), (_do_init), (gst_multifilesink_base_init), (gst_multifilesink_class_init), (gst_multifilesink_init), (gst_multifilesink_dispose), (gst_multifilesink_set_location), (gst_multifilesink_set_property), (gst_multifilesink_get_property), (gst_multifilesink_open_file), (gst_multifilesink_close_file), (gst_multifilesink_next_file), (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), (gst_multifilesink_chain), (gst_multifilesink_change_state), (gst_multifilesink_uri_get_type), (gst_multifilesink_uri_get_protocols), (gst_multifilesink_uri_get_uri), (gst_multifilesink_uri_set_uri), (gst_multifilesink_uri_handler_init), (plugin_init): * gst/multifilesink/gstmultifilesink.h: * testsuite/Makefile.am: * testsuite/multifilesink/Makefile.am: * testsuite/multifilesink/fakesrc_test.c: (gst_newmedia_base_init), (gst_newmedia_class_init), (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), (newfile_signal), (test_signal), (main): multifilesink plugin for creating new files every time a new media discontinuity event occurs 2004-07-22 Wim Taymans * gst/alpha/Makefile.am: * gst/alpha/gstalphacolor.c: (gst_alpha_color_get_type), (gst_alpha_color_base_init), (gst_alpha_color_class_init), (gst_alpha_color_init), (gst_alpha_color_set_property), (gst_alpha_color_get_property), (gst_alpha_color_sink_link), (transform), (gst_alpha_color_chain), (gst_alpha_color_change_state), (plugin_init): Stupid plugin to to RGBA to AYUV conversion because none of the colorspace plugins can handle that yet. 2004-07-22 Wim Taymans * examples/seeking/seek.c: (update_scale), (main): * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (no_more_pads), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (plugin_init): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), (gst_play_base_bin_class_init), (gst_play_base_bin_init), (gst_play_base_bin_dispose), (queue_overrun), (gen_preroll_element), (remove_prerolls), (unknown_type), (no_more_pads), (new_stream), (setup_source), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), (play_base_eos), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), (gst_play_base_bin_remove_element), (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), (gst_play_base_bin_unlink_stream), (gst_play_base_bin_get_streaminfo): * gst/playback/gstplaybin.c: (gen_video_element), (gen_audio_element): * gst/playback/gststreaminfo.h: More playback updates, attempt to fix things after the state change breakage. 2004-07-22 Thomas Vander Stichele * gst/videoscale/videoscale.c: (gst_videoscale_planar411), (gst_videoscale_scale_nearest_16bit): comment algorithm 2004-07-22 Thomas Vander Stichele * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_class_init), (gst_videotestsrc_src_link), (gst_videotestsrc_init), (gst_videotestsrc_get), (gst_videotestsrc_set_pattern), (gst_videotestsrc_set_property), (gst_videotestsrc_get_property): * gst/videotestsrc/gstvideotestsrc.h: * gst/videotestsrc/videotestsrc.c: * gst/videotestsrc/videotestsrc.h: cleanup and commenting 2004-07-21 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init), (gst_ogg_demux_get_formats), (gst_ogg_demux_src_query), (gst_ogg_demux_src_event), (gst_ogg_demux_src_convert), (gst_ogg_demux_handle_event), (gst_ogg_demux_seek_before), (_find_chain_get_unknown_part), (_find_streams_check), (gst_ogg_demux_push), (gst_ogg_pad_push): * ext/theora/theoradec.c: (theora_get_formats), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), (vorbis_dec_convert), (vorbis_dec_src_query), (vorbis_dec_src_event), (vorbis_dec_event): More seeking fixes, oggdemux now supports seeking to time and uses the downstream element to convert granulepos to time. Seeking in theora-only ogg files now works. 2004-07-21 Wim Taymans * ext/theora/theoradec.c: (gst_theora_dec_init), (theora_get_formats), (theora_get_event_masks), (theora_get_query_types), (theora_dec_src_convert), (theora_dec_sink_convert), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), (vorbis_get_event_masks), (vorbis_get_query_types), (gst_vorbis_dec_init), (vorbis_dec_convert), (vorbis_dec_src_query), (vorbis_dec_src_event), (vorbis_dec_event): Added query/convert/formats functions to vorbis and theora decoders so that the outside world can use them too. Fixed seeking on an ogg/theora/vorbis file by disabling the seeking seeking on the theora srcpad. 2004-07-21 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), (gst_ximagesink_renegotiate_size), (gst_ximagesink_sink_link), (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Optimize images creation for both elements. We don't create the image on caps nego or renego, we just destroy the internal one if present if it does not match the needs. The chain function takes care of creating a new image when needed. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_sink_link), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id): Additionally xvimage now contains the image format information. The buffer pool checks for the context image format and discard images with different formats. * sys/xvimage/xvimagesink.h: Adding im_format in the xvimage structure. 2004-07-21 Thomas Vander Stichele * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_chain): no point in doing any chaining if the pad we want to push from isn't usable. 2004-07-20 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data): Fix double end-to-native symbol conversion (#148021). 2004-07-20 David Schleef * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): Don't use an Atom that doesn't exist. 2004-07-20 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_get_stats), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer): * gst/tcp/gstmultifdsink.h: More multifdsink stats. Avoid deadlock by releasing locks before sending out a signal. 2004-07-20 Thomas Vander Stichele * po/LINGUAS: * po/hu.po: added Hungarian translation (Laszlo Dvornik) 2004-07-20 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer): * gst/tcp/gsttcp-marshal.list: Fixed the stupid marshal definition. 2004-07-20 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_add), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_write), (gst_multifdsink_queue_buffer), (gst_multifdsink_chain), (gst_multifdsink_set_property), (gst_multifdsink_get_property), (gst_multifdsink_init_send): * gst/tcp/gstmultifdsink.h: Added more stats, added timeout for a client, fixed some typos and added some comments. 2004-07-20 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_get_stats), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_write): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcp-marshal.list: Added get_stats method that returns a GValueArray of stats values. 2004-07-19 Benjamin Otte * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): make sure longname, description and author are valid UTF-8 2004-07-19 Thomas Vander Stichele * sys/ximage/ximagesink.c: (gst_ximagesink_change_state), (gst_ximagesink_set_property): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state), (gst_xvimagesink_set_property): make sure SYNCHRONOUS is respected after getting the X context 2004-07-18 Thomas Vander Stichele * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_src_event), (gst_matroska_demux_parse_blockgroup): * gst/matroska/matroska-ids.h: add BlockReference tag and ignore it to clear out log. ignore NAVIGATION events to clear out log. 2004-07-18 Thomas Vander Stichele * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), (gst_matroska_demux_add_stream): * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init): add debug categories 2004-07-16 Wim Taymans * ext/libpng/Makefile.am: * ext/libpng/gstpng.c: (plugin_init): * ext/libpng/gstpngdec.c: (user_error_fn), (user_warning_fn), (gst_pngdec_get_type), (gst_pngdec_base_init), (gst_pngdec_class_init), (gst_pngdec_sinklink), (gst_pngdec_init), (gst_pngdec_src_getcaps), (user_read_data), (gst_pngdec_chain): * ext/libpng/gstpngdec.h: Added png decoder. 2004-07-16 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), (gst_ximagesink_sink_link), (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): * sys/xvimage/xvimagesink.h: Getting the 2 video sinks synchronized again. Using internal data pointer of the x(v)image to store image's data to be coherent with the buffer alloc mechanism. Investigated the image destruction code to be sure that everything gets freed correctly. 2004-07-16 Wim Taymans * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_auds_with_data): * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): Make sure we don't create 0 sized subbuffers in riff-read. Signal the no more pads signal after reading the avi header. 2004-07-16 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (no_more_pads), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (gst_decode_bin_change_state), (plugin_init): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), (gst_play_base_bin_class_init), (gst_play_base_bin_init), (gst_play_base_bin_dispose), (queue_overrun), (gen_preroll_element), (remove_prerolls), (unknown_type), (no_more_pads), (new_stream), (setup_source), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), (play_base_eos), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), (gst_play_base_bin_remove_element), (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), (gst_play_base_bin_unlink_stream), (gst_play_base_bin_get_streaminfo): * gst/playback/gstplaybasebin.h: Better error recovery. Added configurable preroll queue size. Faster detection of no-more-pads. 2004-07-16 Wim Taymans * gst-libs/gst/video/video.h: Added 32 bits RGBA. Not sure if we should use another mime-type for alpha rgb. Currently the presence of the alpha_mask property signals an alpha channel. 2004-07-16 Wim Taymans * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): FPS seems to be 0.0 to MAX everywhere else. 2004-07-15 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data): mp42/mp43 (no caps) exist too. * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): Set pixel_width/height; we've got them in-caps. * gst/typefind/gsttypefindfunctions.c: (plugin_init): * gst/wavparse/gstwavparse.c: (plugin_init): Both are valid primary. * sys/oss/gstossmixer.c: Remove i18n hack and enable translations. 2004-07-15 Benjamin Otte * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): fix for non-shm xv. Original patch by Tim Ringenbach (fixes #147248) 2004-07-15 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_open_audio), (gst_alsa_sw_params_dump), (gst_alsa_hw_params_dump), (gst_alsa_close_audio): disable some of the debugging code for now. Writing debugging to a buffer is broken in current alsalib releases. 2004-07-12 Benjamin Otte * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer): use bufferpools 2004-07-14 Thomas Vander Stichele * ext/theora/theoradec.c: (gst_theora_dec_class_init), (theora_dec_src_query), (theora_dec_event): * ext/theora/theoraenc.c: (gst_theora_enc_class_init): add debugging categories. Remove \n's. 2004-07-13 Johan Dahlin * gst/playback/gstplaybin.c (gst_play_bin_set_property) (gst_play_bin_get_property): Impl. 2004-07-13 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_demux_seek_before): When trying to find the stream length, seek back N pages instead of just one, where N is the number of streams in the current chain. 2004-07-13 Wim Taymans * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data), (gst_riff_create_audio_caps), (gst_riff_create_audio_template_caps): * gst-libs/gst/riff/riff-media.h: * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_auds): * gst-libs/gst/riff/riff-read.h: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_add_stream): Set codec_data on caps for avidemuxer. 2004-07-12 David Schleef * configure.ac: Fix test for Objective C 2004-07-12 Jan Schmidt * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_get_capslist), (gst_gdk_pixbuf_chain): Add svg and pcx to template caps, and ensure that getcaps returns a subset of the template caps. Copy each row manually for output, as gdkpixbuf may pad the rowstride to a 32-bit word boundary. 2004-07-12 Wim Taymans * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps), (gst_riff_create_video_template_caps): Fix the template caps to include some more media types. 2004-07-12 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (gst_decode_bin_change_state), (plugin_init): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), (gst_play_base_bin_class_init), (gst_play_base_bin_init), (gst_play_base_bin_dispose), (queue_overrun), (gen_preroll_element), (remove_prerolls), (no_more_pads), (new_stream), (setup_source), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), (play_base_eos), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), (gst_play_base_bin_remove_element), (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), (gst_play_base_bin_unlink_stream), (gst_play_base_bin_get_streaminfo): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gst_play_bin_get_type), (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_dispose), (gst_play_bin_set_property), (gst_play_bin_get_property), (gen_video_element), (gen_audio_element), (remove_sinks), (setup_sinks), (gst_play_bin_change_state), (gst_play_bin_get_event_masks), (gst_play_bin_send_event), (gst_play_bin_get_formats), (gst_play_bin_convert), (gst_play_bin_get_query_types), (gst_play_bin_query), (plugin_init): * gst/playback/test4.c: (main): More fixes on reusing of the element. 2004-07-11 Benjamin Otte * ext/mad/gstmad.c: (normal_seek): allow seeking for other methods than just SET 2004-07-11 Andy Wingo * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_link): For float, "any" caps -> buffer_frames=[0,MAX]. * gst/interleave/interleave.c (interleave_getcaps): Seems the core doesn't intersect our caps with the template any more. Do it ourselves. (interleave_buffered_loop): Use g_newa instead of malloc/free. 2004-07-09 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (gst_decode_bin_change_state), (plugin_init): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), (gst_play_base_bin_class_init), (gst_play_base_bin_init), (gst_play_base_bin_dispose), (queue_overrun), (gen_preroll_element), (remove_prerolls), (no_more_pads), (new_stream), (setup_source), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), (play_base_eos), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), (gst_play_base_bin_remove_element), (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), (gst_play_base_bin_unlink_stream), (gst_play_base_bin_get_streaminfo): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gst_play_bin_get_type), (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_dispose), (gst_play_bin_set_property), (gst_play_bin_get_property), (gen_video_element), (gen_audio_element), (remove_sinks), (setup_sinks), (gst_play_bin_change_state), (gst_play_bin_get_event_masks), (gst_play_bin_send_event), (gst_play_bin_get_formats), (gst_play_bin_convert), (gst_play_bin_get_query_types), (gst_play_bin_query), (plugin_init): * gst/playback/test4.c: (main): Work on object reuse and seeking. 2004-07-09 Wim Taymans * examples/seeking/seek.c: (iterate): Don't consume all CPU in the idle loop. 2004-07-09 Wim Taymans * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_process_private): Add pad to element *after* setting the pad functions so that the scheduler can use the correct ones. 2004-07-09 Wim Taymans * ext/theora/theoradec.c: (theora_dec_from_granulepos), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_chain): Sync to keyframe after seek 2004-07-09 Thomas Vander Stichele * ext/alsa/gstalsa.c: (gst_alsa_change_state): * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), (gst_alsa_sink_loop), (gst_alsa_sink_change_state): * ext/alsa/gstalsasrc.c: (gst_alsa_src_change_state): * ext/libvisual/visual.c: (gst_visual_change_state): * ext/ogg/gstoggdemux.c: (gst_ogg_demux_change_state): * ext/theora/theoradec.c: (theora_dec_change_state): * ext/theora/theoraenc.c: (theora_enc_change_state): * ext/vorbis/vorbisdec.c: (vorbis_dec_change_state): * gst-libs/gst/navigation/navigation.c: * gst/adder/gstadder.c: (gst_adder_change_state): * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), (gst_audio_convert_get_buffer): * gst/multipart/multipartdemux.c: (gst_multipart_demux_change_state): * gst/playback/gstdecodebin.c: (gst_decode_bin_change_state): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): * gst/playback/gstplaybin.c: (gst_play_bin_change_state): * gst/videoscale/gstvideoscale.c: (gst_videoscale_handle_src_event): * gst/volume/gstvolume.c: (volume_chain_int16): don't assert in state change, this should be done by the base GstElement class. various debugging fixes. 2004-07-08 Thomas Vander Stichele * configure.ac: * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), (gst_play_dispose), (gst_play_set_location), (gst_play_set_data_src), (gst_play_set_video_sink), (gst_play_set_audio_sink), (gst_play_set_visualization), (gst_play_connect_visualization), (gst_play_get_sink_element), (gst_play_get_all_by_interface): * gst-libs/gst/play/play.h: add new method to get elements implementing an interface. add various error logging 2004-07-08 Wim Taymans * examples/seeking/seek.c: (make_dv_pipeline), (make_avi_pipeline), (make_mpeg_pipeline), (make_mpegnt_pipeline), (make_playerbin_pipeline), (query_durations_elems), (query_durations_pads), (query_positions_elems), (query_positions_pads), (update_scale), (iterate), (stop_seek), (main): Added playbin seeking example. 2004-07-08 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_set_location), (gst_play_set_data_src), (gst_play_set_video_sink), (gst_play_set_audio_sink), (gst_play_set_visualization), (gst_play_connect_visualization), (gst_play_get_framerate): use a macro to look up elements from hash table 2004-07-08 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), (gst_play_get_length_callback), (gst_play_set_location), (gst_play_seek_to_time), (gst_play_set_data_src), (gst_play_set_video_sink), (gst_play_set_audio_sink), (gst_play_set_visualization), (gst_play_connect_visualization), (gst_play_get_sink_element): - add debugging info - fix looking up sink elements by iterating over complete caps - put everything except for source and autoplugger in a complete bin 2004-07-08 Thomas Vander Stichele * ext/alsa/gstalsa.c: (gst_alsa_drain_audio): * ext/alsa/gstalsasink.c: (gst_alsa_sink_flush_one_pad), (gst_alsa_sink_check_event), (gst_alsa_sink_mmap), (gst_alsa_sink_write), (gst_alsa_sink_loop): * ext/alsa/gstalsasink.h: - add debugging info - clean up schizophrenia of data/buffer/event - fix double event unref error 2004-07-08 Wim Taymans * gst/playback/Makefile.am: Add headers to noinst 2004-07-08 Thomas Vander Stichele * tools/gst-launch-ext-m.m: * tools/gst-launch-ext.1.in: convert to the third millenium 2004-07-07 David Schleef * sys/dxr3/Makefile.am: noinst_SOURCES should be nodist_SOURCES 2004-07-07 Wim Taymans * gst/playback/Makefile.am: * gst/playback/README: * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (plugin_init): * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), (gst_play_base_bin_class_init), (gst_play_base_bin_init), (gst_play_base_bin_dispose), (rebuild_pipeline), (queue_overrun), (gen_preroll_element), (no_more_pads), (new_stream), (setup_source), (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), (gst_play_base_bin_remove_element), (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), (gst_play_base_bin_unlink_stream), (gst_play_base_bin_get_streaminfo): * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: (gst_play_bin_get_type), (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_dispose), (gst_play_bin_set_property), (gst_play_bin_get_property), (gen_video_element), (gen_audio_element), (setup_sinks), (gst_play_bin_change_state), (gst_play_bin_get_event_masks), (gst_play_bin_send_event), (gst_play_bin_get_formats), (gst_play_bin_convert), (gst_play_bin_get_query_types), (gst_play_bin_query), (plugin_init): * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), (gst_stream_info_get_type), (gst_stream_info_class_init), (gst_stream_info_init), (gst_stream_info_new), (gst_stream_info_dispose), (gst_stream_info_set_property), (gst_stream_info_get_property): * gst/playback/gststreaminfo.h: * gst/playback/test.c: (gen_video_element), (gen_audio_element), (main): * gst/playback/test2.c: (main): * gst/playback/test3.c: (update_scale), (main): More playbin fixes. Added README. Do better element filtering. Added base class to preroll media. Added test apps. 2004-07-07 Thomas Vander Stichele * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_flush_decoder): * ext/mpeg2dec/gstmpeg2dec.h: various debugging improvements. Reset stream to next picture instead of sequence header, otherwise seeks cannot work. 2004-07-07 Wim Taymans * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), (gst_video_box_class_init), (gst_video_box_set_property), (gst_video_box_i420), (gst_video_box_ayuv), (gst_video_box_chain): Use pad_alloc where possible. 2004-07-07 Wim Taymans * sys/oss/gstosselement.c: (gst_osselement_reset), (gst_osselement_parse_caps): * sys/oss/gstosselement.h: * sys/oss/gstosssrc.c: (gst_osssrc_get): Fix offset on osssrc. 2004-07-07 Wim Taymans * ext/theora/theora.c: (plugin_init): * ext/theora/theoradec.c: (theora_dec_from_granulepos), (theora_dec_src_query), (theora_dec_chain): * ext/theora/theoraenc.c: (gst_theora_enc_class_init), (theora_enc_sink_link), (theora_buffer_from_packet), (theora_push_packet), (theora_enc_chain): Fix theora granulepos calculation. Fix overflow in duration/position calculation. Bump rank to PRIMARY for theoradec. Use granulepos of last packet to calculate position. Set keyframe flag on buffers when needed. 2004-07-06 David Schleef * gst/playback/Makefile.am: 'test' in bin_PROGRAMS? Are you serious? (Fixed, obviously.) 2004-07-06 Thomas Vander Stichele * po/LINGUAS: * po/cs.po: added Czech translation (Miloslav Trmac) 2004-07-05 Wim Taymans * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (gst_decode_bin_get_event_masks), (gst_decode_bin_send_event), (gst_decode_bin_get_formats), (gst_decode_bin_convert), (gst_decode_bin_get_query_types), (gst_decode_bin_query), (plugin_init): * gst/playback/gstplaybin.c: (gst_play_bin_get_type), (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_dispose), (rebuild_pipeline), (get_audio_element), (get_video_element), (new_pad), (setup_source), (gst_play_bin_set_property), (gst_play_bin_get_property), (gst_play_bin_change_state), (gst_play_bin_add_element), (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), (gst_play_bin_send_event), (gst_play_bin_get_formats), (gst_play_bin_convert), (gst_play_bin_get_query_types), (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): * gst/playback/test.c: (main): More fixes, cleaned up playbin, make it use decodebin. Added threaded property to playbin. 2004-07-05 Wim Taymans * configure.ac: * gst/playback/Makefile.am: * gst/playback/decodetest.c: (main): * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (close_link), (type_found), (gst_decode_bin_set_property), (gst_decode_bin_get_property), (gst_decode_bin_change_state), (gst_decode_bin_get_event_masks), (gst_decode_bin_send_event), (gst_decode_bin_get_formats), (gst_decode_bin_convert), (gst_decode_bin_get_query_types), (gst_decode_bin_query), (plugin_init): * gst/playback/gstplaybin.c: (gst_play_bin_get_type), (gst_play_bin_class_init), (gst_play_bin_init), (gst_play_bin_dispose), (gen_default_output), (rebuild_pipeline), (collect_sink_pads), (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), (close_link), (type_found), (setup_source), (gst_play_bin_set_property), (gst_play_bin_get_property), (gst_play_bin_factory_filter), (compare_ranks), (gst_play_bin_collect_factories), (gst_play_bin_change_state), (gst_play_bin_add_element), (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), (gst_play_bin_send_event), (gst_play_bin_get_formats), (gst_play_bin_convert), (gst_play_bin_get_query_types), (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): * gst/playback/test.c: (main): Added some playback helper elements and some test apps, very alpha still. 2004-07-04 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): only restart audio when we indeed have an xrun to fix repeated xruns. Fix suggested by Giuliano Pochini. 2004-07-03 David Schleef * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper): Disable call to gst_debug_log() if debugging is disabled (bug #145118) 2004-07-03 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): use our own functions for restarting the alsa device. * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): I should apply patches myself - use MIN for the third argument, not the second, this fixes seeking 2004-07-02 David Schleef * ext/flac/gstflacdec.c: (gst_flacdec_class_init), (gst_flacdec_write): Actually, GST_PAD_CAPS() has nothing to do with the logic. 2004-07-02 David Schleef * ext/flac/gstflacdec.c: (gst_flacdec_write): Set duration on output buffers. Fix logic mistake. (bug #144866) 2004-07-02 David Schleef * gst-libs/gst/xoverlay/Makefile.am: xoverlay no longer depends on X. (bug #144753) 2004-07-02 David Schleef * gst/wavenc/gstwavenc.c: (gst_wavenc_setup), (gst_wavenc_stop_file): Switch to GST_WRITE_UINT32_LE macros (bug #144624) * sys/oss/gstosselement.c: (gst_osselement_probe_caps), (gst_osselement_rate_probe_check): Add another workaround for buggy drivers (bug #145336) 2004-07-02 David Schleef * gst/tcp/gstmultifdsink.c: (gst_multifdsink_handle_client_write): Most systems don't have MSG_NOSIGNAL. 2004-07-02 Thomas Vander Stichele * Makefile.am: * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/play/Makefile.am: * gst-libs/gst/tuner/Makefile.am: (hopefully) fix both install and dist and make error message useful. needs testing across automakes. 2004-07-02 Benjamin Otte * ext/ogg/gstogg.c: (plugin_init): we require bytestream now * ext/ogg/gstoggdemux.c: huge diff to implement chain setup in a fast and generic way. This improves tag reading and startup of huge files (read: Theora videos) quite a bit. It probably contains bugs, too, so please test. Seeking is not improved to the fast method. 2004-06-29 Wim Taymans * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): * ext/ogg/gstoggmux.c: Fix memleak in oggdemux when running unconnected pads. doc update in mux, start working on keyframe mode. 2004-06-29 Benjamin Otte * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: advertise correct template caps - we indeed do non-native endianness and 8bit audio has no endianness * sys/ximage/ximagesink.c: (gst_ximagesink_getcaps): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_getcaps): avoid (wrong) duplications in getcaps function and return template caps 2004-06-29 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_clear), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_read), (gst_multifdsink_client_queue_data), (gst_multifdsink_client_queue_caps), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_thread), (gst_multifdsink_init_send), (gst_multifdsink_close): Fix wrong GList iteration that could crash the server when more then 2 clients disconnect at the same time. Read all the pending commands in one batch to recover from command storms under very heavy load. 2004-06-28 Wim Taymans * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), (gst_videomixer_pad_set_property), (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), (gst_video_mixer_background_get_type), (gst_videomixer_get_type), (gst_videomixer_class_init), (gst_videomixer_init), (gst_videomixer_request_new_pad), (gst_videomixer_blend_ayuv_i420), (pad_zorder_compare), (gst_videomixer_sort_pads), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), (gst_videomixer_loop), (plugin_init): Avoid divide by zero, choose masterpad as the pad with the highest framerate. 2004-06-27 Julien Moutte * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_xwindow_new): I prefer locking the mutex in the function directly. We might want to call it from somewhere else one day. 2004-06-27 Julien Moutte * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of window decorations. 2004-06-27 Wim Taymans * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), (gst_dvdec_video_getcaps), (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state), (gst_dvdec_set_property), (gst_dvdec_get_property): * ext/dv/gstdvdec.h: Implement drop_factor property to lower the framerate with a factor. 2004-06-27 Thomas Vander Stichele * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/play/Makefile.am: * gst-libs/gst/tuner/Makefile.am: unbreak Company's fix that didn't install the -enum.h files 2004-06-27 Wim Taymans * ext/dv/gstdvdec.c: (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): * ext/dv/gstdvdec.h: Fix timestamp, duration and offset of the buffers. 2004-06-27 Wim Taymans * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), (gst_multifdsink_class_init), (gst_multifdsink_add), (gst_multifdsink_remove), (gst_multifdsink_clear), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_read), (gst_multifdsink_client_queue_data), (gst_multifdsink_client_queue_caps), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_thread), (gst_multifdsink_init_send), (gst_multifdsink_close): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_handle_server_read), (gst_tcpserversink_handle_select), (gst_tcpserversink_close): More multifdsink fixes, more recovery policy fixes. Removed stupid g_print 2004-06-26 Wim Taymans * gst/tcp/Makefile.am: * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), (gst_multifdsink_get_type), (gst_multifdsink_base_init), (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_debug_fdset), (gst_multifdsink_client_remove), (gst_multifdsink_handle_client_read), (gst_multifdsink_client_queue_data), (gst_multifdsink_client_queue_caps), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_handle_client_write), (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), (gst_multifdsink_thread), (gst_multifdsink_chain), (gst_multifdsink_set_property), (gst_multifdsink_get_property), (gst_multifdsink_init_send), (gst_multifdsink_close), (gst_multifdsink_change_state): * gst/tcp/gstmultifdsink.h: * gst/tcp/gsttcpplugin.c: (plugin_init): * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_get_type), (gst_tcpserversink_class_init), (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), (gst_tcpserversink_handle_select), (gst_tcpserversink_set_property), (gst_tcpserversink_get_property), (gst_tcpserversink_init_send), (gst_tcpserversink_close): * gst/tcp/gsttcpserversink.h: Added multifdsink, made tcpserversink a subclass of fdsink, removed one of the locks, added recovery policy to multifdsink. 2004-06-26 Thomas Vander Stichele * gst/videorate/gstvideorate.c: (gst_videorate_chain): fix decision for when getting frames with same timestamp * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get), (gst_v4lsrc_set_property), (gst_v4lsrc_get_property): * sys/v4l/gstv4lsrc.h: add latency offset property 2004-06-26 Thomas Vander Stichele * gst/videorate/gstvideorate.c: (gst_videorate_chain), (plugin_init): fix debugging. add category. 2004-06-25 Thomas Vander Stichele * gst/sine/gstsinesrc.c: (gst_sinesrc_get): fix wrong offsets 2004-06-25 Thomas Vander Stichele * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_get_time), (gst_alsa_src_loop), (gst_alsa_src_change_state): return a time that is in sync with the element's processing 2004-06-25 Wim Taymans * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), (gst_tcpserversink_client_remove), (gst_tcpserversink_handle_client_read), (gst_tcpserversink_client_queue_data), (gst_tcpserversink_client_queue_caps), (gst_tcpserversink_client_queue_buffer), (gst_tcpserversink_handle_client_write), (gst_tcpserversink_queue_buffer), (gst_tcpserversink_handle_clients), (gst_tcpserversink_thread), (gst_tcpserversink_chain), (gst_tcpserversink_set_property), (gst_tcpserversink_get_property), (gst_tcpserversink_init_send), (gst_tcpserversink_close): * gst/tcp/gsttcpserversink.h: Serversink rewrite. Really do non blocking writes to clients and maintain an internal queue to handle slower clients while not disturbing fast clients. 2004-06-25 Thomas Vander Stichele * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): better debug, don't override OFFSET and OFFSET_END 2004-06-25 Iain * gst-libs/gst/media-info/media-info-priv.c (gmi_set_mime): Add name=source for the wavparse pipeline. 2004-06-24 Johan Dahlin * ext/theora/theoraenc.c (theora_enc_chain): Call gst_pad_try_set_caps instead of gst_pad_set_explicit_caps so the streamheader caps are set correctly. 2004-06-24 Thomas Vander Stichele * ext/vorbis/vorbisenc.c: (raw_caps_factory), (gst_vorbisenc_setup), (gst_vorbisenc_set_property): respect minimum bitrate; same could be done for max bitrate 2004-06-24 Thomas Vander Stichele * ext/vorbis/vorbisenc.c: (raw_caps_factory), (gst_vorbisenc_setup): fix sample rate range 2004-06-24 Thomas Vander Stichele * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_class_init), (gst_oggvorbisenc_setup): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init), (gst_vorbisenc_setup): resolve ambiguities in code and description 2004-06-24 Wim Taymans * ext/alsa/gstalsa.c: (gst_alsa_start), (gst_alsa_xrun_recovery): * ext/alsa/gstalsa.h: * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_update_avail), (gst_alsa_src_loop): Use alsa trigger_tstamp to get the timestamp of the first sample in the buffer for more precise sync. Some cleanups. 2004-06-24 Wim Taymans * gst/audiorate/gstaudiorate.c: (gst_audiorate_link), (gst_audiorate_init), (gst_audiorate_chain), (gst_audiorate_set_property), (gst_audiorate_get_property): * gst/videorate/gstvideorate.c: (gst_videorate_class_init), (gst_videorate_chain): Added some logging, fixed an overflow bug in videorate. 2004-06-24 Benjamin Otte * ext/kio/Makefile.am: fix for builddir != srcdir and distcheck 2004-06-24 Benjamin Otte * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/play/Makefile.am: * gst-libs/gst/tuner/Makefile.am: * gst/tcp/Makefile.am: * sys/dxr3/Makefile.am: don't include -enumtypes.[ch] or -marshal.[ch] files in the disted tarball. Also add all *.list files that were missing. * Makefile.am: add a distcheck hook to ensure the above doesn't happen again. 2004-06-23 David I. Lehn * ext/Makefile.am: s/DTS_DIR=dvdread/DTS_DIR=dts/ 2004-06-23 Colin Walters * m4/Makefile.am: Distribute gst-fionread.m4. 2004-06-23 Thomas Vander Stichele * configure.ac: back to dev 2004-06-23 Wim Taymans * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), (gst_alsa_xrun_recovery): * ext/alsa/gstalsa.h: * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), (gst_alsa_sink_loop), (gst_alsa_sink_get_time): * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_get_time), (gst_alsa_src_update_avail), (gst_alsa_src_loop): Add clock to alsasrc. Take new capture timestamp when restarting after an overrun. Split up some functions between alsasrc and alsasink. === release 0.8.2 === 2004-06-23 Thomas Vander Stichele * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), (gst_alsa_change_state), (gst_alsa_update_avail), (gst_alsa_xrun_recovery): * ext/alsa/gstalsa.h: * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): merge back changes from release 2004-06-23 Wim Taymans * gst/audiorate/gstaudiorate.c: (gst_audiorate_class_init), (gst_audiorate_init), (gst_audiorate_chain), (gst_audiorate_set_property), (gst_audiorate_get_property): Implement sample dropping and notify 2004-06-22 Wim Taymans * ext/theora/theoraenc.c: (gst_theora_enc_class_init), (theora_enc_sink_link), (theora_buffer_from_packet), (theora_push_packet), (theora_enc_chain): Some cleanups, make sure the timestamps are correct. 2004-06-22 Wim Taymans * ext/alsa/gstalsa.c: (gst_alsa_get_time), (gst_alsa_clock_update), (gst_alsa_change_state), (gst_alsa_update_avail), (gst_alsa_xrun_recovery): * ext/alsa/gstalsa.h: * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): Cleanups, take queued samples into account when reporting the time. 2004-06-22 Wim Taymans * gst/videorate/gstvideorate.c: (gst_videorate_class_init), (gst_videorate_init): Initialize the property as well. 2004-06-22 Wim Taymans * gst/videorate/gstvideorate.c: (gst_videorate_class_init), (gst_videorate_init), (gst_videorate_chain), (gst_videorate_set_property), (gst_videorate_get_property): Add property to make videorate silent. Add property to prefer new frames over old ones. 2004-06-22 Zaheer Abbas Merali * sys/osxvideo/Makefile.am: Workaround so that the osxvideo .so file gets linked with the Cocoa, OpenGL and QuickTime frameworks 2004-06-22 Zaheer Abbas Merali * sys/osxaudio/Makefile.am: Workaround so that the osxaudio .so file gets linked with the CoreAudio framework 2004-06-22 Zaheer Abbas Merali * configure.ac: Whoops, my fault...fixed build issues 2004-06-22 Zaheer Abbas Merali * configure.ac: Add objective-c support if running in Darwin/Mac OS X * sys/Makefile.am: * sys/osxvideo: * sys/osxvideo/Makefile.am: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: Add osxvideosink, a cocoa-based osx video sink 2004-06-19 Jan Schmidt * ext/dvdnav/gst-dvd: Grab the gconf key from the right spot * gst/debug/gstnavseek.c: (gst_navseek_init), (gst_navseek_segseek), (gst_navseek_handle_src_event), (gst_navseek_chain): * gst/debug/gstnavseek.h: Add 's', 'e' and 'l' keypresses to navseek to define the start,end and loop parameters of a segment seek. * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), (gst_videotestsrc_get_event_masks), (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): * gst/videotestsrc/gstvideotestsrc.h: Add seeking support to videotestsrc Initialise the timestamp_offset variable. 2004-06-18 Wim Taymans * ext/sidplay/gstsiddec.cc: Fix negotiation and set correct end offset. 2004-06-18 Thomas Vander Stichele * configure.ac: branch and prerelease 2004-06-17 Thomas Vander Stichele * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init), (gst_tcpclientsrc_getcaps), (gst_tcpclientsrc_get), (gst_tcpclientsrc_init_receive): * gst/tcp/gsttcpclientsrc.h: read caps when connecting to server for GDP so we set them correctly 2004-06-17 Thomas Vander Stichele * gst/videorate/gstvideorate.c: (gst_videorate_chain): notify drops and duplicates * gst/videoscale/videoscale.c: (videoscale_get_structure): no good reason to limit ourselves to 100x100 2004-06-17 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_open), (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), (gst_v4lsrc_get), (gst_v4lsrc_set_property), (gst_v4lsrc_get_property): * sys/v4l/gstv4lsrc.h: * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame), (gst_v4lsrc_try_capture): * sys/v4l/v4lsrc_calls.h: change try_palette to more general try_capture add autoprobe option so we can turn off autoprobing various fixes 2004-06-17 Thomas Vander Stichele * configure.ac: add videorate * sys/ximage/ximagesink.c: (gst_ximagesink_finalize), (gst_ximagesink_class_init): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_finalize), (gst_xvimagesink_class_init): run them as finalize, not dispose, since dispose can be invoked multiple times 2004-06-17 Wim Taymans * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), (gst_alsa_get_time), (gst_alsa_xrun_recovery): * ext/alsa/gstalsa.h: * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_loop), (gst_alsa_src_change_state): * ext/alsa/gstalsasrc.h: Make the xrun code timestamp and offset the buffers correctly. moved the clock to the base class, use alsa methods to get time. Do correct timestamping on outgoing buffers. 2004-06-17 Wim Taymans * gst/audiorate/Makefile.am: * gst/audiorate/gstaudiorate.c: (gst_audiorate_get_type), (gst_audiorate_base_init), (gst_audiorate_class_init), (gst_audiorate_link), (gst_audiorate_init), (gst_audiorate_chain), (gst_audiorate_set_property), (gst_audiorate_get_property), (gst_audiorate_change_state), (plugin_init): Added an audiorate converter that fills in gaps. 2004-06-17 Johan Dahlin * ext/tcp/*: Revert Zaheer changes, to make things actually work again. 2004-06-16 Wim Taymans * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), (gst_v4lsrc_get), (gst_v4lsrc_set_property), (gst_v4lsrc_get_property): * sys/v4l/gstv4lsrc.h: Added a copy mode to v4lsrc where it will output a copied version of its internal hardware buffer. Fix the wrong FLAG_SET usage. The flags are integers, not bits, you can't | them. 2004-06-16 Wim Taymans * sys/oss/gstosssrc.c: (gst_osssrc_get): Timestamp fixes. 2004-06-16 Wim Taymans * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), (gst_v4lsrc_get), (gst_v4lsrc_set_property), (gst_v4lsrc_get_property): * sys/v4l/gstv4lsrc.h: * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): Added a sync mode enum property to control v4lsrc timestamp method Removed the use-fixed-fps property and moved functionality in the enum. Don't error on an error value from v4l-conf, it might not always be a real error. 2004-06-16 Wim Taymans * gst/videorate/Makefile.am: * gst/videorate/gstvideorate.c: (gst_videorate_get_type), (gst_videorate_base_init), (gst_videorate_class_init), (gst_videorate_getcaps), (gst_videorate_link), (gst_videorate_init), (gst_videorate_chain), (gst_videorate_set_property), (gst_videorate_get_property), (gst_videorate_change_state), (plugin_init): Added a video timestamp corrector. 2004-06-15 Zaheer Abbas Merali fixed a potential leak with previous commit * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): 2004-06-15 Zaheer Abbas Merali * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Added missing refcount, fixes bug #144425 Cheers Tim for finding the bug 2004-06-15 Thomas Vander Stichele * sys/v4l/gstv4l.c: (plugin_init): * sys/v4l/gstv4lcolorbalance.c: * sys/v4l/gstv4lcolorbalance.h: * sys/v4l/gstv4lelement.c: * sys/v4l/gstv4lelement.h: * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): * sys/v4l/gstv4lmjpegsink.h: * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): * sys/v4l/gstv4lmjpegsrc.h: * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps), (gst_v4lsrc_get): * sys/v4l/gstv4lsrc.h: * sys/v4l/gstv4ltuner.c: * sys/v4l/gstv4ltuner.h: * sys/v4l/gstv4lxoverlay.c: * sys/v4l/gstv4lxoverlay.h: * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), (gst_v4l_set_window), (gst_v4l_enable_overlay): * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): * sys/v4l/v4l_calls.h: * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_sync_frame), (gst_v4lmjpegsink_set_buffer), (gst_v4lmjpegsink_set_playback), (gst_v4lmjpegsink_playback_init), (gst_v4lmjpegsink_playback_start), (gst_v4lmjpegsink_get_buffer), (gst_v4lmjpegsink_play_frame), (gst_v4lmjpegsink_wait_frame), (gst_v4lmjpegsink_playback_stop), (gst_v4lmjpegsink_playback_deinit): * sys/v4l/v4lmjpegsink_calls.h: * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_buffer), (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_capture_start), (gst_v4lmjpegsrc_grab_frame), (gst_v4lmjpegsrc_requeue_frame), (gst_v4lmjpegsrc_capture_stop), (gst_v4lmjpegsrc_capture_deinit): * sys/v4l/v4lmjpegsrc_calls.h: * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), (gst_v4lsrc_sync_frame), (gst_v4lsrc_set_capture), (gst_v4lsrc_capture_init), (gst_v4lsrc_capture_start), (gst_v4lsrc_grab_frame), (gst_v4lsrc_requeue_frame), (gst_v4lsrc_capture_stop), (gst_v4lsrc_capture_deinit), (gst_v4lsrc_try_palette): * sys/v4l/v4lsrc_calls.h: bunch of paranoia cleanups 2004-06-14 David Schleef * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_init), (cdparanoia_get), (cdparanoia_open), (cdparanoia_change_state): Send discont events and change timestamps appropriately when we get a seek event. (bug #144240) * ext/cdparanoia/gstcdparanoia.h: 2004-06-14 Benjamin Otte * ext/alsa/gstalsa.c: Use snd_pcm_hw_params_set_rate _near instead of snd_pcm_hw_params_set_rate since the latter fails for no good reason on some setups. 2004-06-14 David Schleef * gst/volume/demo.c: (value_changed_callback): exp10() is not standard. Thank you for playing. 2004-06-14 Wim Taymans * gst/ffmpegcolorspace/imgconvert.c: (img_convert): Patch 1.3 broke the ordering of the colorspace info and made the plugin basically work by coincidence, reordered the info. 2004-06-14 Thomas Vander Stichele * ext/lame/gstlame.c: * ext/mad/gstmad.c: sync caps. Make sure mad can only output a list of rates, not a full range. In the future, have three caps lists for each of the mpeg versions. Change mpegversion to a double as well. 2004-06-14 Thomas Vander Stichele * gst/volume/.cvsignore: * gst/volume/Makefile.am: * gst/volume/demo.c: (value_changed_callback), (idler), (setup_gui), (main): added small demo app 2004-06-13 Jan Schmidt * ext/esd/esdsink.c: (gst_esdsink_change_state): * ext/esd/esdsink.h: Close the esd connection on pause, because esd will just wait - blocking all other esd clients indefinitely. 2004-06-12 Christophe Fergeau * gst/tags/gstvorbistag.c: replaced a g_warning which I added in my previous commit with GST_DEBUG 2004-06-12 Thomas Vander Stichele * configure.ac: add a header check for a dvdread header in dvdnav. Fixes #133002 2004-06-12 Zaheer Abbas Merali * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): * gst/tcp/gsttcpclientsink.h: * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): * gst/tcp/gsttcpclientsrc.h: * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), (gst_tcpserversink_init_send): * gst/tcp/gsttcpserversink.h: * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): * gst/tcp/gsttcpserversrc.h: Modified the tcp plugins so they are portable (IPv4,IPv6, any future version of IP) 2004-06-12 Zaheer Abbas Merali * configure.ac: Added ogg library so that OSX detects libtheora properly 2004-06-11 Wim Taymans * ext/theora/theoradec.c: (theora_dec_chain), (theora_dec_change_state): Don't try to decode frames before we received a keyframe. 2004-06-11 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): Added property to set the maximum delay of a page. 2004-06-10 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): Added max-delay property to control the maximum amount of data to put in one page. 2004-06-10 Wim Taymans * ext/theora/theoraenc.c: (gst_theora_enc_class_init), (gst_theora_enc_init), (theora_enc_sink_link), (theora_buffer_from_packet), (theora_enc_set_property), (theora_enc_get_property): Set duration on encoded buffer, added some more properties 2004-06-10 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): * ext/theora/theoraenc.c: (theora_enc_chain): Fix refcounting bugs 2004-06-10 Ronald Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), (gst_asf_demux_loop), (gst_asf_demux_process_file), (gst_asf_demux_process_data), (gst_asf_demux_handle_data), (gst_asf_demux_process_object), (gst_asf_demux_get_stream), (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event), (gst_asf_demux_handle_src_event), (gst_asf_demux_handle_src_query), (gst_asf_demux_change_state): * gst/asfdemux/gstasfdemux.h: You know Chimaira? "I - HATE - EVERYTHING". Yeah, that's what this feels like. I think we should set a new requirement for demuxers from now on to implement sane loop functions, data loops, query and seek functions before first commit into CVS. And this commit fixes all of the above. 2004-06-10 Christophe Fergeau * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): make sure parsed vorbis comments are properly encoded in UTF-8 before adding them to a GstTagList 2004-06-09 Benjamin Otte * ext/alsa/gstalsa.c: (add_channels): handle min <= max correctly * ext/alsa/gstalsa.c: (gst_alsa_fixate_to_mimetype), (gst_alsa_fixate_field_nearest_int), (gst_alsa_fixate): add fixation functions so we fixate correctly. No preferring of alaw anymore because it's the first structure. * ext/alsa/gstalsa.h: * ext/alsa/gstalsa.c: (gst_alsa_sw_params_dump), (gst_alsa_hw_params_dump): add functions to ease debugging in alsalib * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), (gst_alsa_start_audio): only specify hw params if we really setup a format (fixes #134007 - or at least works around it) 2004-06-09 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), (gst_ogg_mux_buffer_from_page), (gst_ogg_mux_push_page), (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): Use stream caps to setup the initial pages in the ogg stream. Correctly set the streamheader caps on the srcpad. 2004-06-09 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps): * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), (gst_v4l_get_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): add querying of fps lists for webcams. Negotiating to a framerate now works. 2004-06-08 Thomas Vander Stichele * ext/theora/theoraenc.c: (theora_buffer_from_packet), (theora_push_buffer), (theora_push_packet), (theora_set_header_on_caps), (theora_enc_chain): mark buffers and put on streamheader, raw theora streaming now works too, whee 2004-06-08 Thomas Vander Stichele * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), (gst_tcp_gdp_read_caps): do a looping read for caps and GDP headers too 2004-06-08 Thomas Vander Stichele * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get): return EOS instead of NULL in _get 2004-06-08 Wim Taymans * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), (gst_tcp_gdp_read_caps), (gst_tcp_gdp_write_header), (gst_tcp_gdp_write_caps): * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), (gst_tcpserversrc_gdp_read_header), (gst_tcpserversrc_get): Memory leak fixes 2004-06-08 Thomas Vander Stichele * ext/vorbis/Makefile.am: * ext/vorbis/vorbis.c: (plugin_init): * ext/vorbis/vorbisparse.c: (gst_vorbis_parse_base_init), (gst_vorbis_parse_class_init), (gst_vorbis_parse_init), (vorbis_parse_set_header_on_caps), (vorbis_parse_chain), (vorbis_parse_change_state): * ext/vorbis/vorbisparse.h: adding a vorbisparse element that marks the buffers, streaming raw vorbis using GDP now works, whee 2004-06-08 Wim Taymans * ext/jpeg/Makefile.am: * ext/jpeg/README: * ext/jpeg/gstjpeg.c: (plugin_init): * ext/jpeg/gstsmokedec.c: (gst_smokedec_get_type), (gst_smokedec_base_init), (gst_smokedec_class_init), (gst_smokedec_init), (gst_smokedec_link), (gst_smokedec_chain): * ext/jpeg/gstsmokedec.h: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_get_type), (gst_smokeenc_base_init), (gst_smokeenc_class_init), (gst_smokeenc_init), (gst_smokeenc_getcaps), (gst_smokeenc_link), (gst_smokeenc_resync), (gst_smokeenc_chain), (gst_smokeenc_set_property), (gst_smokeenc_get_property): * ext/jpeg/gstsmokeenc.h: * ext/jpeg/smokecodec.c: (smokecodec_init_destination), (smokecodec_flush_destination), (smokecodec_term_destination), (smokecodec_init_source), (smokecodec_fill_input_buffer), (smokecodec_skip_input_data), (smokecodec_resync_to_restart), (smokecodec_term_source), (smokecodec_encode_new), (smokecodec_decode_new), (smokecodec_info_free), (smokecodec_set_quality), (smokecodec_get_quality), (smokecodec_set_threshold), (smokecodec_get_threshold), (smokecodec_set_bitrate), (smokecodec_get_bitrate), (find_best_size), (abs_diff), (put), (smokecodec_encode), (smokecodec_parse_header), (smokecodec_decode): * ext/jpeg/smokecodec.h: Added a new simple jpeg based codec 2004-06-08 Wim Taymans * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), (gst_multipart_mux_loop): Fix memory leak 2004-06-08 Thomas Vander Stichele * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_client_remove), (gst_tcpserversink_handle_client_read), (gst_tcp_buffer_write), (gst_tcpserversink_handle_client_write), (gst_tcpserversink_chain), (gst_tcpserversink_init_send), (gst_tcpserversink_close): * gst/tcp/gsttcpserversink.h: take streamheader into account 2004-06-08 Thomas Vander Stichele * gst/level/Makefile.am: * gst/level/gstlevel.c: (gst_level_class_init): clean up marshal generation 2004-06-08 Thomas Vander Stichele * gst/tcp/Makefile.am: * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), (gst_tcpclientsink_class_init), (gst_tcpclientsink_init), (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property): * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), (gst_tcpclientsrc_init), (gst_tcpclientsrc_set_property), (gst_tcpclientsrc_get_property): * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), (gst_tcpserversink_handle_client_read), (gst_tcpserversink_handle_client_write), (gst_tcpserversink_set_property), (gst_tcpserversink_get_property): * gst/tcp/gsttcpserversink.h: add signals client-added and client-removed * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), (gst_tcpserversrc_init), (gst_tcpserversrc_set_property), (gst_tcpserversrc_get_property): uniformized, change default protocol to NONE * gst/tcp/gsttcp-marshal.list: added 2004-06-07 Benjamin Otte * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): handle discont events if they happen before caps nego 2004-06-07 Wim Taymans * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), (gst_multipart_demux_plugin_init): * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), (gst_multipart_mux_init), (gst_multipart_mux_loop), (gst_multipart_mux_change_state): Small updates, fix a memleak 2004-06-07 Stephane Loeuillet * configure.ac: OSS portability * ext/arts/gst_arts.c: idem * sys/oss/gstosselement.c: idem * sys/oss/gstossmixer.c: idem * sys/oss/gstosssink.c: idem * sys/oss/gstosssrc.c: idem * sys/oss/oss_probe.c: idem - check for soundcard.h in different places for some BSD 2004-06-07 Jan Schmidt * AUTHORS: Add me to the authors file * configure.ac: Increase the libdv requirement to >= version 0.100 * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): * ext/dv/gstdvdec.h: Add support for the new_media flag when sending DISCONT events Make the querying work when video pad is not linked 2004-06-07 Tim-Philipp Müller reviewed by Benjamin Otte * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init): create a NULL-initialized array of pads, so we don't think they exist already. (fixes #143130) 2004-06-07 Benjamin Otte * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init), (mixmatrix_resize), (gst_mixmatrix_set_all_caps), (gst_mixmatrix_request_new_pad), (gst_mixmatrix_loop): don't use // coments 2004-06-07 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_samples_to_timestamp): cast to GstClockTime to get higher granularity * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): use gst_element_set_time_delay to get the exact time * ext/mad/gstmad.c: (gst_mad_chain): use the negotiated rate instead of the current frame's rate which might be wrong because of bit errors. This avoids emitting totally bogus timestamps and screwing sync. (fixes #143454) 2004-06-07 Tim-Philipp Müller reviewed by Benjamin Otte * gst/adder/gstadder.c: (gst_adder_loop): properly error out when no negotiation has happened yet. (fixes #143032) 2004-06-06 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): forward correctly transformed offset in discont events. Based on patch by Arwed v. Merkatz. (fixes #142851) 2004-06-06 David Schleef * gst/ffmpegcolorspace/gstffmpegcodecmap.c: that's G_HAVE_GNUC_VARARGS, not G_HAVE_GNU_VARARGS. Should fix compile problems on several systems. 2004-06-06 Benjamin Otte * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init): use explicit caps on the srcpad * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): properly error out if caps couldn't be set (fixes #142764) 2004-06-06 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), (gst_alsa_start_audio): - don't call set_periods_integer anymore, it breaks the configuration randomly - call snd_pcm_hw_params_set_access directly instead of using masks - don't fail if the sw_params can't be set, just use the default params and hope it works. Alsalib has weird issues when you touch sw_params and does no proper error reporting about what failed. * ext/alsa/gstalsa.c: (gst_alsa_open_audio), (gst_alsa_close_audio): make our alsa debugging go via gst debugging and not conditionally defined * ext/alsa/gstalsa.h: add ALSA_DEBUG_FLUSH macro * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper), (plugin_init): wrap alsa errors to be printed via the gst debugging system and not spammed to stderr 2004-06-04 Ronald Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), (gst_qtdemux_loop_header), (qtdemux_dump_mvhd), (qtdemux_parse_trak): * gst/qtdemux/qtdemux.h: Bitch. Also known as seeking, querying & co. * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), (gst_osssink_change_state): * sys/oss/gstosssink.h: Resyncing is for weenies, this hack is no longer needed and was broken anyway (since it - unintendedly - always leaves resync to TRUE). 2004-06-05 Andrew Turner * gst/tcp/gsttcp.c: portability (Solaris 10/FreeBSD) * gst/tcp/gsttcpclientsrc.h: idem - define MSG_NOSIGNAL if not done - include unistd.h for off_t (fixes #143749) 2004-06-05 Benjamin Otte * configure.ac: * ext/kio/Makefile.am: check for qt's moc preprocessor explicitly and use it 2004-06-03 Thomas Vander Stichele * gst/tcp/gsttcp.c: (gst_tcp_socket_write): don't get a signal for EPIPE on socket writes (somebody check if this works on other platforms) 2004-06-02 Thomas Vander Stichele * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): check error condition on available samples correctly 2004-06-02 Thomas Vander Stichele * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_time): avoid a segfault * gst/tcp/gsttcp.c: (gst_tcp_socket_write), (gst_tcp_socket_read), (gst_tcp_gdp_read_header), (gst_tcp_gdp_read_caps): * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), (gst_tcpserversrc_gdp_read_header): use ssize_t over size_t since the former is signed and thus the check for error codes can work 2004-06-02 Wim Taymans reviewed by: Johan * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), (gst_multipart_mux_loop): Oops 2004-06-02 Wim Taymans * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), (gst_multipart_mux_init), (gst_multipart_mux_loop), (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), (gst_multipart_mux_change_state): Added configurable boundary specifier, added the value as a caps field as well. 2004-06-02 Zaheer Abbas Merali * gst/tcp/gsttcp.c: * gst/tcp/gsttcpclientsrc.c: * gst/tcp/gsttcpclientsrc.h: * gst/tcp/gsttcpserversrc.c: - portability fix, to compile on OSX (fixes #143146) * sys/osxaudio/gstosxaudioelement.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: - compilation warnings on OSX (fixes #143153) 2004-06-02 Stephane Loeuillet * ext/vorbis/vorbisdec.c : sign warning fixes * gst-libs/gst/mixer/mixertrack.c : do no use defines which are glib 2.4 specific 2004-06-01 Christophe Fergeau * ext/flac/gstflactag.c: strip ending framing bit from vorbiscomment buffer since libflac doesn't expect it (reports a sync error when it encounters that) 2004-06-01 Owen Fraser-Green * gst-libs/gst/mixer/mixertrack.h: Changed struct syntax * gst-libs/gst/mixer/mixertrack.c: (gst_mixer_track_get_property), (get_mixer_track_init), (get_mixer_track_get_property): Added property accessors * gst-libs/gst/mixer/mixeroptions.h: Changed struct syntax * gst-libs/gst/mixer/mixeroptions.c: (gst_mixer_options_get_values): Added * gst-libs/gst/mixer/mixer.h: Changed GstMixerClass syntax * gst-libs/gst/mixer/mixer.c: Fixed comment 2004-06-01 Thomas Vander Stichele * ext/alsa/gstalsa.c: (gst_alsa_open_audio): improve error messages on open 2004-06-01 Thomas Vander Stichele * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): check if v4l-conf is in path 2004-06-01 Thomas Vander Stichele * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): change assert to a more readable error message 2004-05-31 Stephane Loeuillet * gst-libs/gst/tuner/tunerchannel.h: - add a freq_multiplicator field to make the conversion between internal frequency unit and Hz * sys/v4l/gstv4lelement.c: * sys/v4l2/gstv4l2element.c: - change default video device to /dev/video0 * sys/v4l/v4l_calls.c: * sys/v4l2/v4l2_calls.c: - we only expose frequency to the user in Hz instead of bastard v4lX unit (either 62.5kHz or 62.5Hz) 2004-05-31 Jan Schmidt * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): Initialise b_o_s and e_o_s variables * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data): Add some unusual fourcc's from mplayer avi's * gst/multipart/multipartmux.c: (gst_multipart_mux_plugin_init): Make the muxer have rank GST_RANK_NONE, so it doesn't mess up autoplugging. 2004-05-28 Wim Taymans * configure.ac: * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), (gst_alpha_get_type), (gst_alpha_base_init), (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), (gst_alpha_get_property), (gst_alpha_sink_link), (gst_alpha_add), (gst_alpha_chroma_key), (gst_alpha_chain), (gst_alpha_change_state), (plugin_init): A plugin to add an alpha channel to I420 video. Can optionally do chroma keying. * gst/multipart/Makefile.am: * gst/multipart/multipart.c: (plugin_init): * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), (gst_multipart_demux_class_init), (gst_multipart_demux_init), (gst_multipart_demux_finalize), (gst_multipart_demux_handle_event), (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), (gst_multipart_demux_change_state), (gst_multipart_demux_plugin_init): * gst/multipart/multipartmux.c: (gst_multipart_mux_get_type), (gst_multipart_mux_base_init), (gst_multipart_mux_class_init), (gst_multipart_mux_get_sink_event_masks), (gst_multipart_mux_init), (gst_multipart_mux_sinkconnect), (gst_multipart_mux_pad_link), (gst_multipart_mux_pad_unlink), (gst_multipart_mux_request_new_pad), (gst_multipart_mux_handle_src_event), (gst_multipart_mux_next_buffer), (gst_multipart_mux_compare_pads), (gst_multipart_mux_queue_pads), (gst_multipart_mux_loop), (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), (gst_multipart_mux_change_state), (gst_multipart_mux_plugin_init): A Multipart demuxer/muxer. Not sure if it violates specs. Used to send multipart jpeg images to a browser. * gst/videobox/Makefile.am: * gst/videobox/README: * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), (gst_video_box_get_type), (gst_video_box_base_init), (gst_video_box_class_init), (gst_video_box_init), (gst_video_box_set_property), (gst_video_box_get_property), (gst_video_box_sink_link), (gst_video_box_i420), (gst_video_box_ayuv), (gst_video_box_chain), (gst_video_box_change_state), (plugin_init): Crops or adds borders around an image. can do alpha channel borders as well. * gst/videomixer/Makefile.am: * gst/videomixer/README: * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), (gst_videomixer_pad_base_init), (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_sink_event_masks), (gst_videomixer_pad_get_property), (gst_videomixer_pad_set_property), (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_link), (gst_videomixer_pad_unlink), (gst_videomixer_pad_init), (gst_video_mixer_background_get_type), (gst_videomixer_get_type), (gst_videomixer_base_init), (gst_videomixer_class_init), (gst_videomixer_init), (gst_videomixer_request_new_pad), (gst_videomixer_handle_src_event), (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), (gst_videomixer_loop), (gst_videomixer_get_property), (gst_videomixer_set_property), (gst_videomixer_change_state), (plugin_init): Generic video mixer plugin, can handle multiple inputs all with different framerates and video sizes. Is fully alpha channel aware. 2004-05-27 Ronald Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): Select first track as master track. Not sure how else to handle that... * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer): Discard discont events. Should fix #142962. 2004-05-26 Ronald Bultje * ext/alsa/Makefile.am: * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init), (gst_alsa_mixer_build_list), (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): * ext/alsa/gstalsamixer.h: * ext/alsa/gstalsamixeroptions.c: (gst_alsa_mixer_options_get_type), (gst_alsa_mixer_options_class_init), (gst_alsa_mixer_options_init), (gst_alsa_mixer_options_new): * ext/alsa/gstalsamixeroptions.h: * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): * ext/alsa/gstalsamixertrack.h: Add enumerations (as GstMixerOptions). Make correct distinction between input/output tracks. Add capture/playback private flag. Use flag to decide on whether to set capture or playback volumes or switches. Use playback and record switches. * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/mixer/mixer-marshal.list: * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init), (gst_mixer_set_option), (gst_mixer_get_option), (gst_mixer_mute_toggled), (gst_mixer_record_toggled), (gst_mixer_volume_changed), (gst_mixer_option_changed): * gst-libs/gst/mixer/mixer.h: * gst-libs/gst/mixer/mixeroptions.c: (gst_mixer_options_get_type), (gst_mixer_options_class_init), (gst_mixer_options_init), (gst_mixer_options_dispose): * gst-libs/gst/mixer/mixeroptions.h: Add GstMixerOptions. * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): Rename Audio Mixer to OSS Mixer (similar to Alsa Mixer). Fix broken device detection on computers with multiple OSS sound cards. 2004-05-26 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): fixate nicely even when the peer is not negotiating 2004-05-25 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_parse_caps): make sure we don't allow depth > width * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): fixate endianness to G_BYTE_ORDER as default * gst/audioscale/gstaudioscale.c: we don't handle another endianness as host-endianness 2004-05-25 David Schleef * gst/ffmpegcolorspace/mem.c: malloc() is in stdlib.h, not malloc.h 2004-05-24 Benjamin Otte * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_sinkconnect), (gst_oggvorbisenc_setup): properly fail when we can't setup the vorbis encoder due to unsupported settings * ext/vorbis/vorbisenc.c: (gst_vorbisenc_sinkconnect), (gst_vorbisenc_setup): same * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): fix case where warnings occured when one pad was unlinked while the other's link function was called 2004-05-24 Thomas Vander Stichele * gst/tcp/Makefile.am: use GST_ENABLE_NEW 2004-05-24 Benjamin Otte * gst-libs/gst/resample/private.h: don't use optimizations that are #if 0'ed 2004-05-24 Wim Taymans * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): Fix potential division by zero error and hopefully get the position query right to get correct timestamps on avi audio. 2004-05-24 Wim Taymans * gst/videoscale/videoscale.c: (gst_videoscale_scale_nearest), (gst_videoscale_scale_nearest_str2), (gst_videoscale_scale_nearest_str4), (gst_videoscale_scale_nearest_32bit), (gst_videoscale_scale_nearest_24bit), (gst_videoscale_scale_nearest_16bit): Fix the scaling algorithm and avoid a buffer overflow. removed the while loop in the scaling function as it was used for point sampling only. 2004-05-24 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), (gst_id3_tag_class_init), (gst_id3_tag_init), (gst_id3_tag_set_property), (gst_id3_tag_get_tag_to_render), (gst_id3_tag_handle_event), (gst_id3_tag_do_caps_nego), (gst_id3_tag_send_tag_event): lots of fixes to make id3mux work and id3demux work correctly 2004-05-24 Stephane Loeuillet * ext/Makefile.am: add rules to build shout2send (was removed by accident when this module was no more marked experimental/broken) 2004-05-24 Zaheer Abbas Merali * ext/shout2/gstshout2.c: * ext/shout2/gstshout2.h: adding a "connection problem" signal to shout2send (fixes #142954) 2004-05-21 Thomas Vander Stichele * ext/kio/kioreceiver.cpp: * ext/kio/kioreceiver.h: fix sign comparison issues 2004-05-21 Stephane Loeuillet * gst/cdxaparse/gstcdxaparse.c: * gst/cdxaparse/gstcdxaparse.h: some renaming add some checks/sanity prepare for seek addition * sys/sunaudio/gstsunaudio.c: remove exported dupe init function 2004-05-21 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_get_formats), (gst_dvdec_src_convert), (gst_dvdec_sink_convert): Fix format conversion and position querying. * gst/debug/progressreport.c: (gst_progressreport_report): Don't output a bogus total value that we didn't query. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): Always set XV_AUTOPAINT_COLORKEY to true. Fixes xvimagesink showing only a blank window after xine has been used. 2004-05-21 Thomas Vander Stichele * m4/as-arts.m4: sync with upstream version to fix test on FC2 readd with -ko to preserve Id header 2004-05-20 Stephane Loeuillet * configure.ac: test for FIONREAD ioctl in sys/filio.h for Solaris compat. * gst/tcp/gsttcpclientsrc.c: idem * gst/tcp/gsttcpserversink.c: idem * gst/tcp/gsttcpserversrc.c: idem * m4/gst-fionread.m4: idem * sys/sunaudio/gstsunaudio.c: change category to Sink/Audio * configure.ac: enable speex plugin for speex 1.1.5+ * ext/speex/gstspeexenc.c: fix cast warning * ext/esd/README: fix typo 2004-05-20 David Schleef * configure.ac: Minor cosmetic change to convince the buildbot to reautogen. * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_class_init), (gst_sunaudiosink_init), (gst_sunaudiosink_getcaps), (gst_sunaudiosink_pad_link), (gst_sunaudiosink_chain), (gst_sunaudiosink_setparams), (gst_sunaudiosink_open), (gst_sunaudiosink_close), (gst_sunaudiosink_change_state), (gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property): More hacking. Plays audio now. 2004-05-20 David Schleef * configure.ac: * sys/Makefile.am: 2004-05-20 David Schleef * sys/osxaudio/Makefile.am: New OS X audio plugin by Zaheer Abbas Merali * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudioelement.c: * sys/osxaudio/gstosxaudioelement.h: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosink.h: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxaudio/gstosxaudiosrc.h: 2004-05-20 Thomas Vander Stichele * ext/vorbis/vorbisenc.c: (gst_vorbisenc_set_header_on_caps), (gst_vorbisenc_chain): put the codec headers on the caps as streamheader as well as pushing them out 2004-05-20 Thomas Vander Stichele * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_push_buffer), (gst_vorbisenc_push_packet), (gst_vorbisenc_chain): split up push_packet into two functions 2004-05-20 Thomas Vander Stichele * gst/tcp/.cvsignore: ignore enums * gst/tcp/Makefile.am: * gst/tcp/README: * gst/tcp/gsttcp.c: * gst/tcp/gsttcp.h: * gst/tcp/gsttcpclientsink.c: * gst/tcp/gsttcpclientsink.h: * gst/tcp/gsttcpclientsrc.c: * gst/tcp/gsttcpclientsrc.h: * gst/tcp/gsttcpplugin.c: * gst/tcp/gsttcpserversink.c: * gst/tcp/gsttcpserversink.h: * gst/tcp/gsttcpserversrc.c: * gst/tcp/gsttcpserversrc.h: add new tcp elements 2004-05-19 Wim Taymans * gst/law/mulaw-conversion.c: (mulaw_encode): Fix overflow bug in ulaw encoding. 2004-05-19 Benjamin Otte * ext/mad/gstmad.c: (gst_mad_handle_event): don't unref the event twice 2004-05-19 Benjamin Otte * configure.ac: remove -Wno-sign-compare 2004-05-19 Benjamin Otte * configure.ac: remove -DG_DISABLE_DEPRECATED. It's not usable without workarounds if you want to work against glib 2.2 and 2.4 2004-05-19 Thomas Vander Stichele * gst/tcp/Makefile.am: * gst/tcp/gsttcp.c: * gst/tcp/gsttcp.h: * gst/tcp/gsttcpsink.h: * gst/tcp/gsttcpsrc.h: gsttcp -> gsttcpplugin + CVS surgery in preparation for tcp merge 2004-05-19 Benjamin Otte * gst/debug/tests.c: (md5_get_value): fix segfault on gst-inspect 2004-05-19 Benjamin Otte * gst/debug/testplugin.c: * gst/debug/tests.c: * gst/debug/tests.h: add new extensible and configurable testing element. Current tests include buffer count, stream length, timestamp/duration matching and md5. * gst/debug/Makefile.am: * gst/debug/gstdebug.c: (plugin_init): add infrastructure for new element 2004-05-19 Johan Dahlin * ext/dv/gstdvdec.c (gst_dvdec_quality_get_type): Add proper ending of the array. Fixes gst-inspect segfault on ppc. 2004-05-19 Stephane Loeuillet * ext/dirac/gstdiracdec.cc : change category to Codec/Decoder/Video * m4/a52.m4 : don't fix a test that should fail with current a52dec lib 2004-05-18 David Schleef * gst/ffmpegcolorspace/imgconvert.c: (img_convert): Fixes for warnings (bugs, actually) noticed by gcc but not forte. 2004-05-18 David Schleef * sys/sunaudio/Makefile.am: * sys/sunaudio/gstsunaudio.c: New sunaudiosink 2004-05-18 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_loop_header): Patch from dcm@acm.org (David Moore) to allow qtdemux to use non-seekable streams. (bug #142272) 2004-05-18 David Schleef * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16), (gst_resample_sinc_ft_float): Remove use of static temporary buffer. This code was obviously not supposed to last long, but it's stuck in our ABI, so it required a little hack to make it ABI-compatible. Fixes #142585. * gst-libs/gst/resample/resample.h: same. 2004-05-18 David Schleef * configure.ac: Add sunaudio * examples/Makefile.am: make gstplay depend on gconf * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Remove c99-isms * gst/ffmpegcolorspace/imgconvert.c: (build_rgb_palette), (convert_table_lookup), (img_convert): remove c99-isms * gst/ffmpegcolorspace/imgconvert_template.h: make a constant unsigned, to fix a warning on Solaris * gst/mpeg1sys/systems.c: bcopy->memcpy * gst/rtjpeg/RTjpeg.c: (RTjpeg_yuvrgb8): bcopy->memcpy * sys/Makefile.am: Add sunaudio 2004-05-18 Wim Taymans * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_init), (gst_ogg_mux_sinkconnect), (gst_ogg_mux_request_new_pad), (gst_ogg_mux_next_buffer), (gst_ogg_mux_push_page), (gst_ogg_mux_compare_pads), (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop): Fix an ugly memleak where the muxer didn't flush enough ogg pages. This also resulted in badly muxed ogg files. 2004-05-18 Stephane Loeuillet * gst/asfdemux/asfheaders.c : * gst/asfdemux/asfheaders.h : * gst/asfdemux/gstasfdemux.c : - fix ASF_OBJ_PADDING guid - add 3 new object guids (language list, metadata, extended stream properties) - add a function to parse extended header objects 2004-05-18 Benjamin Otte * sys/oss/gstosselement.c: (gst_osselement_sync_parms): remove leftover debugging g_print 2004-05-17 Ronald Bultje * ext/mad/gstmad.c: (gst_mad_handle_event): Fix for when the first format in a discont event is not a byte-based one. Should fix #137710. 2004-05-18 Stephane Loeuillet * m4/a52.m4 : fix compilation with -Wall -Werror * m4/libfame.m4 : idem * m4/libmikmod.m4 : idem 2004-05-17 Benjamin Otte * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): signal the new tags before giving up the reference 2004-05-17 Benjamin Otte * ext/shout2/gstshout2.c: use application/ogg instead of application/x-ogg (patch by Patrick Guimond, fixes #142432) * sys/oss/gstosselement.c: (gst_osselement_reset), (gst_osselement_sync_parms): don't set fragment size unless specified (fixes #142493) 2004-05-17 Stephane Loeuillet * configure.ac : fix compilation of v4l2src with "-Wall -Werror" fixes #142664 2004-05-17 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_chain): compute offsets correctly for internal buffers so timestamps are set correctly when we can't seek. Also handle cases where there are no offsets. (based on a patch by David Moore, fixes #142507) 2004-05-17 Benjamin Otte * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): use correct variable when determining amount of data to skip so we don't skip into the void and segfault 2004-05-16 Benjamin Otte * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): Hi, I'm a memleak 2004-05-16 Stephane Loeuillet * gst/asfdemux/gstasfdemux.c: - fix a mem leak and always propagate tags - add WMV3 to known video codecs (but no decoder yet) - replace "surplus data" at end of audio header for what it is : codec specific data - fix a typo 2004-05-16 Arwed v. Merkatz reviewed by: Ronald Bultje * gst-libs/gst/audio/audioclock.c: Fix wrong return type (#142205). 2004-05-16 Ronald Bultje * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_init): Ignore CRCs by default (fixes #142566). 2004-05-16 Ronald Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open), (gst_alsa_mixer_close), (gst_alsa_mixer_supported), (gst_alsa_mixer_build_list), (gst_alsa_mixer_free_list), (gst_alsa_mixer_change_state), (gst_alsa_mixer_list_tracks), (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record): Fix for cases where we fail to attach to a mixer. 2004-05-16 Ronald Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Don't touch events after not owning them anymore. * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_fmt), (gst_wavparse_other), (gst_wavparse_handle_seek), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event): * gst/wavparse/gstwavparse.h: Add seeking, fix querying. 2004-05-16 Stephane Loeuillet * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): - process comments even if they don't end with \0\0 g_convert would ignore them if present and works well without them 2004-05-16 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_caps), (gst_alsa_get_caps): simplify caps 2004-05-16 Benjamin Otte * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): don't write to memory we might not write to - g_convert does that for us anyway (fixes #142613) (gst_asf_demux_audio_caps): comment out gst_util_dump_mem 2004-05-16 Benjamin Otte * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): compute correct expected timestamps after seek (broken since last commit) * ext/gdk_pixbuf/pixbufscale.c: (pixbufscale_init): rename element and debugging category to gdkpixbufscale 2004-05-16 Benjamin Otte * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): add error checking to snd_pcm_delay and remove duplicate call to snd_pcm_delay that caused issues (see inline code comments) * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): make more readable and fix return value when snd_pcm_delay fails (fixes #142586) 2004-05-15 Jan Schmidt * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_method_get_type), (gst_pixbufscale_get_type), (gst_pixbufscale_base_init), (gst_pixbufscale_class_init), (gst_pixbufscale_getcaps), (gst_pixbufscale_link), (gst_pixbufscale_init), (gst_pixbufscale_handle_src_event), (pixbufscale_scale), (gst_pixbufscale_chain), (gst_pixbufscale_set_property), (gst_pixbufscale_get_property), (pixbufscale_init): * ext/gdk_pixbuf/pixbufscale.h: Add these files I forgot earlier 2004-05-15 Jan Schmidt * ext/gdk_pixbuf/Makefile.am: * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): * ext/gdk_pixbuf/gstgdkpixbuf.h: Add new pixbufscale element to scale RGB video using gdk_pixbuf, because gdk_pixbuf does BILINEAR and HYPER interpolation correctly. * ext/theora/theoraenc.c: (theora_enc_chain), Discard buffer and return if explicit caps could not be set (theora_enc_get_property): Make _get return kbps for the bitrate consistent with the _set function. 2004-05-14 Benjamin Otte * ext/libvisual/visual.c: (gst_visual_chain): add missing visual_audio_analyze 2004-05-14 David Schleef * ext/esd/esdsink.c: (gst_esdsink_chain): Fix crash when ESD is killed while we're playing. * gst/qtdemux/qtdemux.c: (qtdemux_parse): call gst_element_no_more_pads(). 2004-05-14 Stephane Loeuillet * gst-libs/gst/riff/riff-read.c : - fix INFO tag extraction in RIFF/AVI files because gst_event_unref (event) also freed taglist - avoid a mem leak 2004-05-13 Stephane Loeuillet * ext/mad/gstid3tag.c : move from "Codec/(Dem/M)uxer" to "Codec/(Dem/M)uxer/Audio" * gst/wavenc/gstwavenc.c : move from "Codec/Encoder/Audio" to "Codec/Muxer/Audio" * gst/auparse/gstauparse.c : - add code (commented for now) to support audio/x-adpcm on src pad (we have no decoder for those layout yet) * gst/cdxaparse/gstcdxaparse.c : * gst/cdxaparse/gstcdxaparse.h : - partial rewrite using RiffRead (ripped iain's wavparse code) * gst/rtp/gstrtpL16enc.c : typo * gst/rtp/gstrtpgsmenc.c : typo 2004-05-13 Benjamin Otte * configure.ac: check for exact version of libvisual, it's not supposed to be API/ABI stable yet 2004-05-13 Benjamin Otte * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): signal no-more-pads 2004-05-13 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_src_convert) Report which format was used for GST_FORMAT_DEFAULT * gst/debug/Makefile.am: * gst/debug/gstdebug.c: (plugin_init): * gst/debug/progressreport.c: (gst_progressreport_base_init), (gst_progressreport_class_init), (gst_progressreport_init), (gst_progressreport_report), (gst_progressreport_set_property), (gst_progressreport_get_property), (gst_progressreport_chain), (gst_progressreport_plugin_init): Add progressreport element for testing. 2004-05-13 Thomas Vander Stichele * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_change_state): * sys/v4l/gstv4lsrc.h: * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init), (gst_v4lsrc_grab_frame): add more debugging send a discont at start 2004-05-12 Colin Walters * gst/asfdemux/gstasfdemux.c (gst_asf_demux_process_segment): Avoid inflooping if we can't find a chunk. Or in other words, don't blow chunks if we don't have a chunk to blow. 2004-05-13 Jan Schmidt * ext/audiofile/gstafsrc.c: (gst_afsrc_get): Remove old debug output * ext/dv/gstdvdec.c: (gst_dvdec_quality_get_type), (gst_dvdec_class_init), (gst_dvdec_loop), (gst_dvdec_change_state), (gst_dvdec_set_property), (gst_dvdec_get_property): Change the quality setting to an enum, so it works from gst-launch Don't renegotiate a non-linked pad. Allows audio only decoding. * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_getcaps), (gst_deinterlace_link), (gst_deinterlace_init): * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), (gst_videodrop_link): Some caps negotiation fixes 2004-05-12 Stephane Loeuillet * ext/tarkin/gsttarkin.c : - Change RANK from NONE to PRIMARY * ext/gdk_pixbuf/gstgdkpixbuf.c : - Change RANK from NONE to MARGINAL * ext/divx/gstdivxenc.c : - Change RANK from PRIMARY to NONE (encoder/spider issue) 2004-05-12 Thomas Vander Stichele * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), (gst_vorbisenc_push_packet): copy a function that was added between 1.0 and 1.0.1 until we depend on worthwhile features of post-1.0 2004-05-12 Benjamin Otte * configure.ac: enable shout2 by default * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), (gst_shout2send_base_init), (gst_shout2send_init), (gst_shout2send_connect), (gst_shout2send_change_state): * ext/shout2/gstshout2.h: make this work again. Based on a patch by Zaheer Abbas Merali (fixes #142262) * ext/theora/theora.c: (plugin_init): don't set rank on encoders 2004-05-11 Jeremy Simon * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): Use codec_data property instead of flag1 and flag2 for wma 2004-05-11 Stephane Loeuillet * gst/cdxaparse/gstcdxaparse.c : - Add mpegversion to CAPS to make it link - Rank is as GST_RANK_SECONDARY instead of NONE * gst/auparse/gstauparse.c : - Document all audio encoding we can encounter from Solaris 9 headers and libsndfile information. - Increase max. rate from 48000 to 192000 (to match other elements) - Don't try to play junk data between header and samples 2004-05-11 Benjamin Otte * ext/libvisual/visual.c: (gst_visual_getcaps): use the right caps depending on endianness (I hope) * ext/ogg/gstoggmux.c: (gst_ogg_mux_plugin_init): use GST_RANK_NONE for all non-decoding elements or spider gets mighty confused 2004-05-11 Ronald Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): Fix some odd cases and fix BE metadata parsing of unicode16 text. 2004-05-11 Benjamin Otte * gst/switch/gstswitch.c: (gst_switch_release_pad), (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), (gst_switch_loop), (gst_switch_get_type): whoever that was: DO NOT IMPORT PRIVATE SYMBOLS THAT ARE NOT IN HEADERS. Had to be said. 2004-05-10 David Schleef * configure.ac: Add prototype Dirac support. * ext/Makefile.am: * ext/dirac/Makefile.am: * ext/dirac/gstdirac.cc: * ext/dirac/gstdiracdec.cc: 2004-05-10 Ronald Bultje * gst/auparse/gstauparse.c: (gst_auparse_class_init), (gst_auparse_init), (gst_auparse_chain), (gst_auparse_change_state): Hack around spider. Remove me some day please. 2004-05-10 Ronald Bultje * gst/auparse/gstauparse.c: (gst_auparse_chain): Fix for some uninitialized variables in previous patch, also makes it work. Fixes #142286 while we're at it. 2004-05-11 Stephane Loeuillet * gst/auparse/gstauparse.c: fixes a-law, adds mu-law, linear pcm (8,16,24,32), ieee (32, 64) only unsupported formats are ADPCM/CCITT G.72x reviewed by Ronald * gst-libs/gst/audio/audio.h: adds 24bit depth to PCM (x-raw-int) 2004-05-10 Wim Taymans * ext/vorbis/Makefile.am: * ext/vorbis/README: * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_formats), (oggvorbisenc_get_type), (vorbis_caps_factory), (raw_caps_factory), (gst_oggvorbisenc_base_init), (gst_oggvorbisenc_class_init), (gst_oggvorbisenc_sinkconnect), (gst_oggvorbisenc_convert_src), (gst_oggvorbisenc_convert_sink), (gst_oggvorbisenc_get_query_types), (gst_oggvorbisenc_src_query), (gst_oggvorbisenc_init), (gst_oggvorbisenc_get_tag_value), (gst_oggvorbisenc_metadata_set1), (gst_oggvorbisenc_set_metadata), (get_constraints_string), (update_start_message), (gst_oggvorbisenc_setup), (gst_oggvorbisenc_write_page), (gst_oggvorbisenc_chain), (gst_oggvorbisenc_get_property), (gst_oggvorbisenc_set_property), (gst_oggvorbisenc_change_state): * ext/vorbis/oggvorbisenc.h: * ext/vorbis/vorbis.c: (plugin_init): * ext/vorbis/vorbisenc.c: (vorbis_caps_factory), (raw_caps_factory), (gst_vorbisenc_class_init), (gst_vorbisenc_init), (gst_vorbisenc_setup), (gst_vorbisenc_push_packet), (gst_vorbisenc_chain), (gst_vorbisenc_get_property), (gst_vorbisenc_set_property): * ext/vorbis/vorbisenc.h: Added a raw vorbis encoder to be used with the oggmuxer. We still need the old encoder for some gnome applications, read the README to find out how that works. The raw encoder is called "rawvorbisenc" until 0.9. 2004-05-10 Wim Taymans * ext/ogg/gstogg.c: (plugin_init): * ext/ogg/gstoggdemux.c: (gst_ogg_demux_plugin_init), (gst_ogg_print): * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_base_init), (gst_ogg_mux_class_init), (gst_ogg_mux_get_sink_event_masks), (gst_ogg_mux_init), (gst_ogg_mux_sinkconnect), (gst_ogg_mux_pad_link), (gst_ogg_mux_pad_unlink), (gst_ogg_mux_request_new_pad), (gst_ogg_mux_handle_src_event), (gst_ogg_mux_next_buffer), (gst_ogg_mux_push_page), (gst_ogg_mux_compare_pads), (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop), (gst_ogg_mux_get_property), (gst_ogg_mux_set_property), (gst_ogg_mux_change_state), (gst_ogg_mux_plugin_init): Added an ogg muxer. Small typo fixes in the demuxer. 2004-05-10 Wim Taymans * ext/theora/theoraenc.c: (gst_theora_enc_class_init), (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), (theora_enc_change_state), (theora_enc_set_property), (theora_enc_get_property): Mark the last packet with an EOS flag which is not really needed in gstreamer. Do some better video framerate initialisation. Update the buffer timestamp. 2004-05-10 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_change_state): Return the result of the parent state change call 2004-05-10 Stephane Loeuillet * gst/law/alaw.c : alawdec should be registered with type ALAWDEC, not ALAWENC * gst/law/alaw-decode.c : put audio/x-alaw on pads, instead of audio/x-mulaw * gst/law/alaw-encode.c : (idem) * ext/a52dec/gsta52dec.c : mark audio/a52, audio/ac3 as deprecated in a comment * gst/ac3parse/gstac3parse.c : audio/ac3 => audio/x-ac3 * gst/realmedia/rmdemux.c : audio/a52 => audio/x-ac3 2004-05-09 Benjamin Otte * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): don't use a fixed buffer size when writing variable length data to it. Fixes memory corruption and makes alsasrc work 2004-05-09 Ronald Bultje * ext/gnomevfs/gstgnomevfssink.c: (_gst_boolean_allow_overwrite_accumulator), (gst_gnomevfssink_class_init), (gst_gnomevfssink_open_file): Run glib's default signal handler (??) in RUN_CLEANUP rather than RUN_LAST, and don't use that to set the accumulator value because then it's always FALSE. 2004-05-09 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_audio_caps), (gst_riff_create_audio_template_caps): * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Fix for unaligned RIFF files (i.e. where all the chunks together in a LIST chunk are not of the same size as the size given in the LIST chunk header). Fixes several odd WAVE files. Also fix ADPCM (block_align property) in audio, so that wavparse based on this works now as it used to stand-alone. 2004-05-09 Edward Hervey reviewed by Benjamin Otte * ext/a52dec/gsta52dec.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): * ext/faac/gstfaac.c: (gst_faac_base_init): * ext/faad/gstfaad.c: (gst_faad_base_init): * ext/ivorbis/vorbisfile.c: * ext/lame/gstlame.c: * ext/libfame/gstlibfame.c: * ext/mpeg2enc/gstmpeg2enc.cc: * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): * ext/sidplay/gstsiddec.cc: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: correct klasses. Mostly s,Codec/(Audio|Video),\1/Codec, (fixes #142193) 2004-05-08 Ronald Bultje * ext/alsa/gstalsa.c: (device_list), (gst_alsa_class_probe_devices): * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open): Fix alsa oddness in mixer after the combination of using mixer in source/sink elements and using hw:x,y instead of just hw:x. 2004-05-09 Benjamin Otte * gst/wavparse/gstwavparse.c: (gst_wavparse_destroy_sourcepad), (gst_wavparse_create_sourcepad): make PAUSED=>READY=>PAUSED=READY work by not destroying NULL sourcepads 2004-05-09 Benjamin Otte * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): allow discont events before caps nego 2004-05-08 Benjamin Otte * ext/vorbis/vorbisdec.c: (vorbis_dec_event): don't leak events 2004-05-08 Benjamin Otte * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), (gst_level_change_state), (gst_level_init): * gst/level/gstlevel.h: figure out if we're initialized directly instead of keeping a variable that's wrong in 90% of cases don't initialize pads and then leak them and use a new unitialized pad. (fixes #142084) these were bugs so n00bish I didn't find them for an hour :/ 2004-05-08 Iain * gst/wavparse/gstwavparse.[ch]: Rewrote to use RiffRead instead. * gst-libs/gst/riff/riff-read.c (gst_riff_read_peek_head): Unstatic it (gst_riff_read_element_data): Ditto, and added a got_bytes argument to return the length that was read. (gst_riff_read_strf_auds): Allow fmt tags as well. 2004-05-07 David Schleef * ext/faad/gstfaad.c: (gst_faad_sinkconnect): HACK to correct signed char assumption in faad.h. 2004-05-07 Ronald Bultje * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): Missing break, detected by Daniel Gazard . 2004-05-07 Colin Walters * gst/volume/gstvolume.c (gst_volume_dispose): Unref dpman. * ext/flac/gstflacdec.c (gst_flacdec_dispose): Add dispose function. * gst/audioscale/gstaudioscale.c (gst_audioscale_dispose): Add dispose function. 2004-05-08 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_video_link): Fix caps nego and pad templates. RGB mode caps should work now. * ext/dvdnav/gst-dvd: Move mpeg2dec inside the thread because otherwise the queue rejects cap changes mid-stream * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), (gst_mpeg2dec_flush_decoder): For mpeg2dec > 0.4.0, call the flush function instead of manually extracting all in-flight frames. * ext/raw1394/gstdv1394src.c: (gst_dv1394src_factory), (gst_dv1394src_init), (gst_dv1394src_iso_receive): Change mime type video/dv go video/x-dv to match the rest of gst-plugins 2004-05-07 Ronald Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_type), (gst_alsa_sink_class_init): * ext/alsa/gstalsasink.h: * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_type), (gst_alsa_src_class_init): * ext/alsa/gstalsasrc.h: Make alsasink/src a subclass of alsamixer so that mixer stuff shows up in gst-rec. Needs some finetuning. 2004-05-05 Benjamin Otte * ext/lame/gstlame.c: (gst_lame_chain): simplify * ext/mad/gstmad.c: (gst_mad_handle_event): fix event leak * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): be able to detect mp3 files < 4096 bytes 2004-05-06 Wim Taymans * ext/theora/theoraenc.c: (gst_theora_enc_class_init), (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), (theora_enc_set_property), (theora_enc_get_property): Also encode the first frame, cleanup some code. 2004-05-06 Wim Taymans * ext/mpeg2enc/gstmpeg2enc.cc: Forward events first before deciding that negotiation was not performed. 2004-05-06 Wim Taymans * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): First process the events before deciding that negotiation was not performed. 2004-05-06 Wim Taymans * ext/theora/Makefile.am: * ext/theora/theora.c: (plugin_init): * ext/theora/theoradec.c: (theora_dec_change_state): * ext/theora/theoraenc.c: (gst_theora_enc_base_init), (gst_theora_enc_class_init), (gst_theora_enc_init), (theora_enc_sink_link), (theora_enc_event), (theora_push_packet), (theora_enc_chain), (theora_enc_change_state), (theora_enc_set_property), (theora_enc_get_property): Added a theora encoder, grouped the encoder and decoder into the same plugin. 2004-05-05 Thomas Vander Stichele * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), (gst_jpegenc_chain): fix DURATION on outgoing buffers * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): debug using time formats * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), (gst_xvimagesink_sink_link): windows with width/height 0 generate X errors, so don't allow them 2004-05-05 Wim Taymans * ext/mpeg2dec/gstmpeg2dec.c: (src_templ), (gst_mpeg2dec_base_init), (gst_mpeg2dec_init), (gst_mpeg2dec_negotiate_format): * ext/mpeg2dec/gstmpeg2dec.h: removed the static pad template so that we can add the more accurate framerate value to the caps. 2004-05-04 Benjamin Otte * configure.ac: check for kdemacros.h, too (should fix #141821) * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): don't crash if no header was sent, but nicely error out (fixes part of #141554) 2004-05-04 Wim Taymans * ext/mpeg2enc/gstmpeg2enc.cc: (gst_mpeg2enc_dispose): call the parent dispose function to avoid segfault on destroy. 2004-05-04 Thomas Vander Stichele * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), (plugin_init): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_sink_link): clean up debugging caps also recreate xvimage when format has changed 2004-05-04 Benjamin Otte * ext/libvisual/Makefile.am: * ext/libvisual/visual.c: (gst_visual_class_init), (gst_visual_init), (gst_visual_dispose), (gst_visual_getcaps), (gst_visual_srclink), (gst_visual_chain), (gst_visual_change_state), (plugin_init): use a GstAdapter to correctly adapt buffer sizes - allows using a framerate 2004-05-03 Thomas Vander Stichele * sys/v4l/gstv4lelement.h: * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps), (gst_v4lsrc_getcaps), (gst_v4lsrc_buffer_free): * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities): * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), (gst_v4lsrc_sync_frame), (gst_v4lsrc_grab_frame), (gst_v4lsrc_requeue_frame): move some debugging categories around query for fps index and set accordingly if found 2004-05-03 Stephane Loeuillet * ext/lame/gstlame.c: correct defaults that lame_init puts out of range 2004-05-03 Thomas Vander Stichele * ext/divx/gstdivxenc.c: (gst_divxenc_get_type), (gst_divxenc_class_init): fix range since -1 is the default * gst/mpeg1sys/gstmpeg1systemencode.c: (gst_mpeg1_system_encode_get_type), (gst_system_encode_multiplex): * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_get_type), (gst_rtjpegdec_chain): * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_get_type), (gst_rtjpegenc_chain): * sys/qcam/gstqcamsrc.c: (gst_autoexp_mode_get_type), (gst_qcamsrc_get_type), (gst_qcamsrc_change_state): * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_get_type): * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get_type): * sys/v4l/gstv4lsrc.c: * sys/v4l/v4l_calls.c: (gst_v4l_open): * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init): * sys/vcd/vcdsrc.c: (vcdsrc_get_type), (vcdsrc_get): remove gst_info calls 2004-05-03 Thomas Vander Stichele * Makefile.am: * po/af.po: * po/az.po: * po/en_GB.po: * po/nl.po: * po/sr.po: * po/sv.po: Updated translations 2004-05-03 Thomas Vander Stichele * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): refactor/comment code 2004-05-02 Ronald Bultje * gst/asfdemux/Makefile.am: * gst/asfdemux/asfheaders.c: * gst/asfdemux/asfheaders.h: * gst/asfdemux/gstasf.c: (plugin_init): * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_type), (gst_asf_demux_base_init), (gst_asf_demux_process_comment), (gst_asf_demux_setup_pad): * gst/asfdemux/gstasfdemux.h: * gst/asfdemux/gstasfmux.c: * gst/asfdemux/gstasfmux.h: Add tagging support to demuxer, split out registration in its own file instead of in demux (hacky), and prevent having some tables in our memory multiple times (in asfheaders.h). 2004-05-01 Ronald Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_metadata): * gst/matroska/matroska-ids.h: Basic tag reading support. 2004-04-30 Ronald Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): Really detect ac-3 audio. * gst/typefind/gsttypefindfunctions.c: (matroska_type_find): really detect matroska files (off-by-1). 2004-04-30 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_type_get), (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_unknown), (qtdemux_parse_tree), (qtdemux_parse_udta), (qtdemux_tag_add), (get_size), (gst_qtdemux_handle_esds): More qtdemux hackage -- parse a lot more atoms, extract a few tags. One might even mistake this for tag support. Maybe it is. * gst/qtdemux/qtdemux.h: 2004-04-30 Colin Walters * ext/alsa/gstalsasink.c (gst_alsa_sink_mmap): Plug a memleak. 2004-04-30 Thomas Vander Stichele * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_getcaps): remove broken nego fix 2004-04-30 Benjamin Otte * configure.ac: * ext/Makefile.am: * ext/libvisual/Makefile.am: * ext/libvisual/visual.c: add initial support for libvisual (http://libvisual.sourceforge.net) libvisual is still quite alpha, so expect crashes in there :) 2004-04-29 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_trak), (get_size), (gst_qtdemux_handle_esds): Hacked up qtdemux to make it spit out codec_data. Do _not_ look at this code; you will no longer respect me. 2004-04-29 Stephane Loeuillet * ext/alsa/gstalsa.c : (gst_alsa_class_probe_devices) * ext/alsa/gstalsa.h : change alsa pcm device discovery to find more than 1 device per card. code review by Ronald. 2004-04-29 David Schleef * sys/oss/gstosselement.c: (gst_osselement_rate_probe_check): Add a check for a driver bug on FreeBSD. (bug #140565) 2004-04-29 Thomas Vander Stichele * ext/jpeg/gstjpegdec.c: (gst_jpegdec_get_type): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), (gst_jpegenc_getcaps): move format setting to inner loop * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_getcaps): use GST_PAD_CAPS if available so that we use already negotiated caps * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse_moov), (qtdemux_parse): extra debugging * sys/qcam/qcam-Linux.c: (qc_lock_wait), (qc_unlock): * sys/qcam/qcam-os.c: (qc_lock_wait), (qc_unlock): move hardcoded path to DEFINE 2004-04-28 David Schleef * gst/speed/gstspeed.c: (speed_parse_caps): Fix caps parsing. (bug #140064) 2004-04-28 Ronald Bultje * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): Don't probe for playback device if we're a source element. Fixes #139658. 2004-04-29 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), (gst_id3_tag_chain): rewrite buffer offset 2004-04-28 Ronald Bultje * configure.ac: * ext/Makefile.am: * ext/dts/Makefile.am: * ext/dts/gstdtsdec.c: (gst_dtsdec_get_type), (gst_dtsdec_base_init), (gst_dtsdec_class_init), (gst_dtsdec_init), (gst_dtsdec_channels), (gst_dtsdec_renegotiate), (gst_dtsdec_handle_event), (gst_dtsdec_update_streaminfo), (gst_dtsdec_loop), (gst_dtsdec_change_state), (gst_dtsdec_set_property), (gst_dtsdec_get_property), (plugin_init): * ext/dts/gstdtsdec.h: New DTS decoder. * ext/faad/gstfaad.c: (gst_faad_sinkconnect), (gst_faad_srcconnect): Add ESDS atom handling (.m4a). 2004-04-27 Ronald Bultje * ext/divx/gstdivxdec.c: (plugin_init): Remove comment that makes no sense. * ext/mad/gstid3tag.c: (gst_id3_tag_set_property): Fix for obvious typo that resulted in warnings during gst-register. * ext/xvid/gstxviddec.c: (gst_xviddec_src_link), (gst_xviddec_sink_link): Fix caps negotiation a bit better. * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): We call this 'codec_data', not 'esds'. 2004-04-27 Benjamin Otte * gst/monoscope/gstmonoscope.c: make sure we only provide 256x128 * gst/monoscope/monoscope.c: (monoscope_init): assert size of 256x128 2004-04-27 Thomas Vander Stichele * Makefile.am: * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_fixate), (gst_v4lsrc_getcaps), (gst_v4lsrc_buffer_free): fixate to max width and height of device 2004-04-27 Thomas Vander Stichele * Makefile.am: * sys/v4l/gstv4l.c: * sys/v4l/gstv4lsrc.c: * sys/v4l/v4l_calls.c: * sys/v4l/v4lsrc_calls.c: fix for qc-usb driver which fakes having more than one buffer by handing the same buffer twice, which confused GStreamer's/v4lsrc buffer_free override add debugging 2004-04-27 Thomas Vander Stichele * Makefile.am: * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_class_init), (gst_videotestsrc_change_state), (gst_videotestsrc_init), (gst_videotestsrc_get), (gst_videotestsrc_set_property), (gst_videotestsrc_get_property): * gst/videotestsrc/gstvideotestsrc.h: add num-buffers property 2004-04-26 Benjamin Otte * ext/mad/gstid3tag.c: (plugin_init): set id3mux rank to NONE so it doesn't confuse spider require audio/mpeg,mpegversion=1 in id3mux 2004-04-26 Benjamin Otte * configure.ac: detect faad correctly as non-working if it's indeed non-working 2004-04-26 Thomas Vander Stichele * Makefile.am: * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), (gst_jpegenc_class_init), (gst_jpegenc_getcaps): fix _getcaps so it only negotiates to its supported format 2004-04-25 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): fix memleak 2004-04-23 Benjamin Otte * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): audio/x-raw-int with height rules! not. Now it's depth. 2004-04-22 Ronald Bultje * gst/wavparse/gstwavparse.c: (gst_wavparse_create_sourcepad), (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), (gst_wavparse_loop): Missing variable initialization. Add handling of DVI ADPCM. Fix mis-parsing of LIST chunks. This works around a bug where we mis- parse non-aligning LIST chunks (so LIST chunks where the contents don't align with the actual LIST size). The correct fix is to use rifflib, I'm not going to fix wavparse - too much work. All this fixes #104878. 2004-04-22 Zaheer Abbas Merali reviewed by Benjamin Otte * ext/shout/gstshout.c: (gst_icecastsend_change_state): fix shoutcast not working (fixes #140844) 2004-04-22 Benjamin Otte * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_caps_remove_format_info): * gst/colorspace/gstcolorspace.c: (gst_colorspace_caps_remove_format_info): * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_caps_remove_format_info): s/gst_caps_simplify/gst_caps_do_simplify/ 2004-04-22 Benjamin Otte * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data): mpegversion is an int * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init): don't try to create pad templates with NULL caps, use any caps instead. 2004-04-20 David Schleef * ext/sdl/Makefile.am: Link against libgstinterfaces, not libgstxoverlay. jmmv@menta.net (Julio M. Merino Vidal) (bug #140384) 2004-04-20 Daniel Gazard reviewed by David Schleef * ext/mad/gstid3tag.c: Add stdlib.h * gst/rtp/gstrtpgsmenc.c: same * gst/tags/gstid3tag.c: same * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Fix GST_DISABLE_LOADSAVE * gst/tcp/gsttcpsink.c: (gst_tcpsink_sink_link): Adjust GST_DISABLE_LOADSAVE use. * gst/udp/gstudpsink.c: (gst_udpsink_sink_link): Likewise. * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): Likewise. * ext/gnomevfs/gstgnomevfssrc.c: Include (needed by atol(3)). * sys/oss/gstosselement.h: Include (needed for dev_t). * gst/tags/gstvorbistag.c: Include (needed by strtoul(3)). * gst/rtp/gstrtpL16enc.c: Include (needed by random(3)). * ext/mad/Makefile.am: (libgstmad_la_CFLAGS): Add $(MAD_CFLAGS) $(ID3_CFLAGS). * ext/libfame/Makefile.am: (libgstlibfame_la_CFLAGS): Add $(LIBFAME_CFLAGS). 2004-04-20 David Schleef * gst/realmedia/rmdemux.c: This was supposed to part of the last checkin. Same idea. 2004-04-20 Daniel Gazard reviewed by David Schleef * configure.ac: bump required gstreamer version to 0.8.1.1 because of following changes [--ds] * gst-libs/gst/riff/riff-read.c: Include gst/gstutils.h. (gst_riff_peek_head, gst_riff_peek_list, gst_riff_read_list) (gst_riff_read_header): Use GST_READ_UINT* macros to access possibly unaligned memory. * gst/typefind/gsttypefindfunctions.c: Include gst/gstutils.h. (mp3_type_find): Use GST_READ_UINT* macros to access possibly unaligned memory. (mp3_type_find, mpeg1_parse_header, qt_type_find) (speex_type_find): Likewise * gst/tags/gstvorbistag.c: (ADVANCE): Likewise * gst/qtdemux/qtdemux.c: Include stdlib.h (needed by realloc). (QTDEMUX_GUINT32_GET, QTDEMUX_GUINT16_GET, QTDEMUX_FP32_GET) (QTDEMUX_FP16_GET, QTDEMUX_FOURCC_GET) (gst_qtdemux_loop_header, gst_qtdemux_loop_header) (qtdemux_node_dump_foreach, qtdemux_tree_get_child_by_type) (qtdemux_tree_get_sibling_by_type): Use GST_READ_UINT* macros to access possibly unaligned memory. * gst/mpegstream/gstmpegpacketize.c: (parse_generic, parse_chunk): Likewise. * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead) (gst_mpeg_demux_parse_packet, gst_mpeg_demux_parse_pes): Likewise. * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): Likewise. * gst/mpeg2sub/gstmpeg2subt.c: (GST_BUFFER_DATA) (gst_mpeg2subt_chain_subtitle): Likewise. * gst/mpeg1videoparse/gstmp1videoparse.c: (mp1videoparse_parse_seq) (gst_mp1videoparse_time_code, gst_mp1videoparse_real_chain): Likewise. * gst/mpeg1sys/buffer.c: (mpeg1mux_buffer_update_audio_info): Likewise. * gst/cdxaparse/gstcdxaparse.c: (gst_bytestream_peek_bytes): Likewise. * gst/asfdemux/gstasfdemux.c: (_read_var_length, _read_uint): Likewise. 2004-04-20 Thomas Vander Stichele * configure.ac: update required version of GStreamer because of GST_TIME_FORMAT 2004-04-20 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_init): remove leftover g_print * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): don't try setting only a subset of the caps. We don't want to kill autoplugging on purpose 2004-04-20 Thomas Vander Stichele * sys/ximage/ximagesink.c: (plugin_init): * sys/xvimage/xvimagesink.c: (plugin_init): add debugging categories 2004-04-20 Thomas Vander Stichele * po/en_GB.po: * po/LINGUAS: Adding en_GB translation (Gareth Owen) 2004-04-20 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), (qtdemux_parse), (qtdemux_type_get), (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_stsd), (qtdemux_dump_unknown), (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): A number of new features and hacks to extract the esds atom and put it into the caps. (bug #137724) 2004-04-19 David Schleef * gconf/Makefile.am: Fix for non-GNU make * gst-libs/gst/Makefile.am: Change directory order to handle GstPlay linking with gstinterfaces * gst-libs/gst/audio/make_filter: make use of tr portable * gst-libs/gst/play/Makefile.am: Add intended \ * gst-libs/gst/xwindowlistener/xwindowlistener.c: (gst_xwin_set_clips): Switch to ISO variadic macro. Use a function prototype instead of void *. * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Switch to ISO variadic macro. * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_chain): wrap NULL in GST_ELEMENT_ERROR call * gst/videofilter/make_filter: make use of tr portable * pkgconfig/Makefile.am: Remove GNU extension in Makefile target 2004-04-19 Thomas Vander Stichele * po/LINGUAS: * po/uk.po: Added Ukrainian translation (Maxim V. Dziumanenko) 2004-04-18 Ronald Bultje * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_getcaps), (gst_gsmdec_link), (gst_gsmdec_chain): Fix capsnego, simplify chain function slightly. * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): Add GSM. 2004-04-18 Ronald Bultje * gst/wavparse/gstwavparse.c: (gst_wavparse_init), (gst_wavparse_destroy_sourcepad), (gst_wavparse_create_sourcepad), (gst_wavparse_parse_fmt), (gst_wavparse_change_state): Hack to make wavparse work with spider (always -> sometimes pad). Fixes #135862 && #140411. 2004-04-18 Benjamin Otte * sys/oss/gstosselement.c: (gst_osselement_sync_parms), (gst_osselement_rate_probe_check), (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate): get rid of \n in debug output 2004-04-17 Iain * gst/wavparse/gstwavparse.c (gst_wavparse_loop): Allow all events, not just EOS. 2004-04-17 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), (gst_id3_tag_class_init), (gst_id3_tag_get_caps), (gst_id3_tag_add_src_pad), (gst_id3_tag_init), (gst_id3_tag_set_property), (gst_id3_tag_do_caps_nego), (gst_id3_tag_src_link), (gst_id3_tag_chain), (gst_id3_tag_change_state), (plugin_init): deprecate id3tag element and replace with id3demux/id3mux. great side effect: this ugly file is now even uglier, yay! * ext/mad/gstmad.h: remove non-available function update for new get_type 2004-04-17 Benjamin Otte * configure.ac: require mpeg2dec >= 0.4.0 2004-04-17 Benjamin Otte * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), (gst_xvimagesink_set_xwindow_id): call GST_ELEMENT_ERROR whenever get_xcontext fails. Includes assorted cleanup fixes. 2004-04-16 David Schleef * sys/ximage/ximagesink.h: Compile fix for FreeBSD. (bug #140268) * sys/xvimage/xvimagesink.h: same 2004-04-16 Thomas Vander Stichele * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): Fix GST_ELEMENT_ERROR with (NULL) 2004-04-15 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data): Add div[3456] as fourccs for DivX 3 (fixes #140137). 2004-04-15 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_video_caps), (gst_riff_create_audio_caps), (gst_riff_create_video_template_caps), (gst_riff_create_audio_template_caps): * gst-libs/gst/riff/riff-media.h: * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids): * gst-libs/gst/riff/riff-read.h: * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): Add MS RLE support. I added some functions to read out strf chunks into strf chunks and the data behind it. This is usually color palettes (as in RLE, but also in 8-bit RGB). Also use those during caps creation. Lastly, add ADPCM (similar to wavparse - which should eventually be rifflib based). * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), (gst_matroska_demux_init), (gst_matroska_demux_reset): * gst/matroska/matroska-demux.h: Remove placeholders for some prehistoric tagging system. Didn't add support for any tag system really anyway. * gst/qtdemux/qtdemux.c: Add support for audio/x-m4a (MPEG-4) through spider. * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), (gst_wavparse_loop): ADPCM support (#135862). Increase max. buffer size because we cannot split buffers for ADPCM (screws references) and I've seen files with 2048 byte chunks. 4096 seems safe for now. 2004-04-15 Thomas Vander Stichele * configure.ac: bump nano to 1 === release 0.8.1 === 2004-04-15 Thomas Vander Stichele * configure.ac: releasing 0.8.1, "Comforting Sounds" 2004-04-14 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): Fix typo in divxversion (3 instead of 4 for "DIVX" fourcc). Fixes #140058 2004-04-14 Thomas Vander Stichele * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_plugin_init): lower rank of dvddemux so that it's not used for mpeg playback. 2004-04-14 Benjamin Otte * configure.ac: save libs correctly when checking mad 2004-04-14 Thomas Vander Stichele * ext/mad/gstid3tag.c: (plugin_init): lower rank of id3tag as proposed by Benjamin. Fixes #139926. 2004-04-13 David Schleef * common/m4/gst-feature.m4: Call -config scripts with --plugin-libs if it is supported. * gst/avi/gstavimux.c: (gst_avimux_vidsinkconnect): sequences of JPEG images are image/jpeg. * gst/debug/Makefile.am: * gst/debug/negotiation.c: (gst_negotiation_class_init), (gst_negotiation_getcaps), (gst_negotiation_pad_link), (gst_negotiation_update_caps), (gst_negotiation_get_property), (gst_negotiation_plugin_init): Add a property that acts like filter caps. * testsuite/gst-lint: Move license checking to be a standard test. 2004-04-13 David Schleef * gst/avi/gstavidemux.c: (gst_avi_demux_reset): Fix memleak. patch from Sebastien Cote (bug #139958) 2004-04-13 Thomas Vander Stichele * examples/gstplay/Makefile.am: * examples/gstplay/player.c: (main): make the commandline player example use gconf settings 2004-04-13 Thomas Vander Stichele * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), (gst_cacasink_sinkconnect), (gst_cacasink_init), (gst_cacasink_chain), (gst_cacasink_open), (gst_cacasink_close): init/end library during state transition, not object creation/disposal. get rid of custom dispose handler. 2004-04-12 Christian Schaller * sys/oss/gstosselement.c: s/lstat/stat/ from freeBSD, since it can be a symlink 2004-04-11 Ronald Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_data): Handle JUNK chunks inside data section. Prevents warnings. 2004-04-11 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), (gst_riff_create_video_template_caps): Add MS video v1. * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), (gst_avi_demux_stream_data): Add support for "rec-list" chunks. 2004-04-11 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): Fix another codecname mismatch. 2004-04-11 Ronald Bultje * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): Fix divx caps mismatch and move from video/x-jpeg to image/jpeg so that MJPEG plays back. 2004-04-10 Ronald Bultje * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), (gst_mp1videoparse_real_chain), (gst_mp1videoparse_change_state): * gst/mpeg1videoparse/gstmp1videoparse.h: Fix for some slight mis-cuts in buffer parsing, and for some potential overflows or faults-causers. Adds disconts. Also fixes #139105 while we're at it. 2004-04-10 Ronald Bultje * configure.ac: * sys/v4l2/gstv4l2element.h: Workaround for missing struct v4l2_buffer declaration in Suse 9 and Mandrake 10 linux/videodev2.h header file (#135919). 2004-04-10 Ronald Bultje * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): Bail out if no filename was given. 2004-04-10 Ronald Bultje * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps), (gst_v4l2_fourcc_from_structure): Add Y41B/Y42B YUV formats (see #125732), fix Y41P (was typo'ed to Y41B somewhere). 2004-04-09 Benjamin Otte * ext/gnomevfs/gstgnomevfssink.c: (_gst_boolean_allow_overwrite_accumulator), (gst_gnomevfssink_class_init): fix erase signal - if any handler returns false the file will not be overwritten. If no handler is connected, the file will not be overwritten either. renamed signal to "allow-overwrite" * ext/mad/gstid3tag.c: (tag_list_to_id3_tag_foreach): free string when adding it to ID3 failed * ext/vorbis/vorbisdec.c: (vorbis_dec_event): unref event when done * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): free caps * gst/typefind/gsttypefindfunctions.c: (mpeg_video_stream_type_find): fix invalid read 2004-04-08 David Schleef * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_register): Change rank to PRIMARY. 2004-04-08 David Schleef * gst/colorspace/gstcolorspace.c: Don't advertise a conversion we don't support (bug #139532) 2004-04-07 Thomas Vander Stichele * ext/mad/gstmad.c: (gst_mad_handle_event), (gst_mad_check_caps_reset), (gst_mad_chain), (gst_mad_change_state): only set explicit caps if they haven't been set before for this stream. MPEG-audio sample rate/channels aren't allowed to change in-stream. Fixes #139382 2004-04-06 Ronald Bultje * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_base_init), (_gst_boolean_did_something_accumulator), (gst_gnomevfssink_class_init), (gst_gnomevfssink_dispose), (gst_gnomevfssink_init), (gst_gnomevfssink_set_property), (gst_gnomevfssink_get_property), (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file), (gst_gnomevfssink_chain), (gst_gnomevfssink_change_state): Fix erase signal. Don't erase by default. Remove handoff signal. Remove erase property. Don't segfault. General cleanup. 2004-04-07 Benjamin Otte * gst-libs/gst/gconf/test-gconf.c: (main): add missing gst_init 2004-04-07 Benjamin Otte * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): free the mutexes, too 2004-04-07 Benjamin Otte * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): actually free the URI string * ext/mad/gstid3tag.c: (gst_id3_tag_src_event): compute offset correctly when passing discont events * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): don't leak discont events * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): add some missing breaks so caps aren't copied randomly * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream): if we realloc memory, we better use it 2004-04-06 Benjamin Otte * ext/mad/gstmad.c: (normal_seek): fix GST_FORMAT_TIME usage 2004-04-05 David Schleef * ext/kio/kiosrc.cpp: Undefine KDE_DEPRECATED so we can use a deprecated function (hack!) 2004-04-05 Benjamin Otte * ext/esd/esdmon.c: (gst_esdmon_get): fix nonterminated vararg and memleak 2004-04-05 Benjamin Otte * ext/ladspa/gstladspa.c: (gst_ladspa_class_init), (gst_ladspa_init), (gst_ladspa_force_src_caps), (gst_ladspa_set_property), (gst_ladspa_get_property), (gst_ladspa_instantiate), (gst_ladspa_activate), (gst_ladspa_deactivate), (gst_ladspa_loop), (gst_ladspa_chain): clean up debugging 2004-04-05 Stefan Kost reviewed by Benjamin Otte * ext/ladspa/gstladspa.c: (gst_ladspa_class_init): check for broken LADSPA parameters (fixes #138635) 2004-04-05 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps): advertise buffer-frames correctly on sinkpads 2004-04-05 Thomas Vander Stichele * ext/mad/gstmad.c: (gst_mad_get_type), (gst_mad_layer_get_type), (gst_mad_mode_get_type), (gst_mad_emphasis_get_type), (gst_mad_get_event_masks), (gst_mad_get_query_types), (index_seek), (normal_seek), (gst_mad_src_event), (gst_mad_handle_event), (gst_mad_check_caps_reset), (gst_mad_chain): add more debugging, only reset caps when we're not in error state 2004-04-05 Thomas Vander Stichele * ext/mad/gstmad.c: add debugging category, comment + cleanups 2004-04-05 Julio M. Merino Vidal reviewed by Benjamin Otte * configure.ac: fix == in test(1) operator 2004-04-05 Julio M. Merino Vidal reviewed by Benjamin Otte * configure.ac: fix --export-symblos-regex to a working regex. 2004-04-04 Benjamin Otte * sys/oss/.cvsignore: add for oss_probe 2004-04-03 Tim-Phillip Müller reviewed by Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): add missing 'new_media' argument (fixes #138168) * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_seek_event): add vararg terminator (fixes #138169) 2004-04-02 David Schleef * ext/gdk_pixbuf/Makefile.am: Make sure gstgdkanimation.h is disted (bug #138914) 2004-04-01 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_close_audio): handle case better where a soundcard can't pause * ext/ogg/gstoggdemux.c: don't crash when we get events but don't have pads yet 2004-04-01 Thomas Vander Stichele * sys/oss/gstosselement.c: (gst_osselement_probe_caps): throw an error if we couldn't probe any caps. 2004-04-01 Jan Schmidt * ext/dvdnav/gst-dvd: Add a really simple sample DVD player 2004-04-01 Jan Schmidt * ext/a52dec/gsta52dec.c: (gst_a52dec_get_type), (gst_a52dec_init), (gst_a52dec_push), (gst_a52dec_handle_event), (gst_a52dec_update_streaminfo), (gst_a52dec_loop), (gst_a52dec_change_state): * ext/a52dec/gsta52dec.h: Use a debug category, Output timestamps correctly Emit tag info, Handle events, tell liba52dec about cpu capabilities so it can use MMX etc. * ext/dv/gstdvdec.c: (gst_dvdec_loop), (gst_dvdec_change_state): Fix a crasher accessing invalid memory * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_update_highlight), (dvdnavsrc_loop), (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), (dvdnavsrc_event), (dvdnavsrc_get_formats), (dvdnavsrc_convert), (dvdnavsrc_query): Some support for byte-format seeking. Small fixes for still frames and menu button overlays * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), (gst_mpeg2dec_alloc_buffer): Use a debug category. Adjust the report level of several items to LOG. Call mpeg2_custom_fbuf to mark our buffers as 'custom buffers' so it doesn't lose the GstBuffer pointer * gst/debug/Makefile.am: * gst/debug/gstdebug.c: (plugin_init): * gst/debug/gstnavseek.c: (gst_navseek_get_type), (gst_navseek_base_init), (gst_navseek_class_init), (gst_navseek_init), (gst_navseek_seek), (gst_navseek_handle_src_event), (gst_navseek_set_property), (gst_navseek_get_property), (gst_navseek_chain), (gst_navseek_plugin_init): * gst/debug/gstnavseek.h: Add the navseek debug element for seeking back and forth in a video stream using arrow keys. * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_get_type), (gst_mpeg2subt_base_init), (gst_mpeg2subt_class_init), (gst_mpeg2subt_init), (gst_mpeg2subt_finalize), (gst_mpeg2subt_getcaps_video), (gst_mpeg2subt_link_video), (gst_mpeg2subt_handle_video), (gst_mpeg2subt_src_event), (gst_mpeg2subt_parse_header), (gst_get_nibble), (gst_setup_palette), (gst_get_rle_code), (gst_draw_rle_line), (gst_merge_uv_data), (gst_mpeg2subt_merge_title), (gst_update_still_frame), (gst_mpeg2subt_handle_subtitle), (gst_mpeg2subt_handle_dvd_event), (gst_mpeg2subt_loop): * gst/mpeg2sub/gstmpeg2subt.h: Pretty much a complete rewrite. Now a loopbased element. May still require work to properly synchronise subtitle buffers. * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private), (gst_dvd_demux_send_subbuffer): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): Don't attempt to create subbuffers of size 0 Reduce a couple of error outputs to warnings. * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect), (gst_y4mencode_chain): Output the y4m frame header correctly. 2004-04-01 Thomas Vander Stichele * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): throw errors instead of allowing SIGFPE 2004-04-01 Thomas Vander Stichele * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_string), (gst_gconf_render_bin_from_key): leak plugging and style fixing 2004-03-31 David Schleef * gst/audioscale/gstaudioscale.c: (gst_audioscale_expand_value), (gst_audioscale_getcaps): Fix getcaps to expand and union lists. (bug #138225) * gst/debug/Makefile.am: * gst/debug/breakmydata.c: (gst_break_my_data_plugin_init): * gst/debug/gstdebug.c: (plugin_init): Merge elements into one plugin. * gst/debug/negotiation.c: (gst_gst_negotiation_get_type), (gst_negotiation_base_init), (gst_negotiation_class_init), (gst_negotiation_init), (gst_negotiation_getcaps), (gst_negotiation_pad_link), (gst_negotiation_chain), (gst_negotiation_set_property), (gst_negotiation_get_property), (gst_negotiation_plugin_init): New element to talk about random negotiation things happening in a pipeline. 2004-03-31 Thomas Vander Stichele * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): fix integer addition with help of Stefan Kost 2004-03-31 Thomas Vander Stichele * po/nl.po: updated Dutch translation (Elros Cyriatan) 2004-03-30 David Schleef * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer), (gst_mpeg2dec_negotiate_format): Handle Y42B-format MPEG video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) (bug #137504) * ext/mpeg2dec/gstmpeg2dec.h: 2004-03-30 David Schleef * ext/gdk_pixbuf/Makefile.am: Remove spurious rules. (bug #136527) 2004-03-30 David Schleef * tools/gst-launch-ext-m.m: Applied patch from gnome@flyn.org (W. Michael Petullo) to handle .mov 2004-03-30 Benjamin Otte * sys/oss/gstosselement.c: (gst_osselement_probe_caps), (gst_osselement_rate_check_rate): probe caps correctly for sound cards that only support one format 2004-03-30 Benjamin Otte * ext/kio/kiosrc.cpp: (process_events): update handling event processing if inside KDE - untested 2004-03-29 David Schleef * ext/hermes/gsthermescolorspace.c: (plugin_init): decrease rank by 2 to not interfere with other colorspaces. * ext/pango/gsttextoverlay.c: (plugin_init): change rank to NONE * gst/colorspace/gstcolorspace.c: (plugin_init): decrease rank by one to not interfere with ffmpeg_colorspace. 2004-03-29 David Schleef * ext/alsa/gstalsa.c: (gst_alsa_fixate): Don't fixate fields that aren't in the caps. * gst/sine/gstsinesrc.c: change rate caps to [1,MAX] * gst/videocrop/gstvideocrop.c: (plugin_init): Change rank to NONE. 2004-03-30 Benjamin Otte * gst-libs/gst/riff/riff-media.c: fail on error, don't try to set stuff on NULL caps 2004-03-30 Benjamin Otte * configure.ac: * ext/Makefile.am: * ext/kio/Makefile.am: * ext/kio/kioreceiver.cpp: * ext/kio/kioreceiver.h: * ext/kio/kiosrc.cpp: * ext/kio/kiosrc.h: add experimental kiosrc plugin * ext/alsa/gstalsaplugin.c: (plugin_init): initialize debugging category only when we're sure registering the plugins worked. 2004-03-29 Thomas Vander Stichele * examples/gstplay/player.c: (main): * gst-libs/gst/play/play.c: (gst_play_class_init), (gst_play_set_location), (gst_play_set_data_src), (gst_play_set_video_sink), (gst_play_set_audio_sink), (gst_play_set_visualization), (gst_play_connect_visualization): check return values of element_set_state and return FALSE where failed 2004-03-29 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): try harder to check if an event is really a discont 2004-03-29 Thomas Vander Stichele * po/LINGUAS: adding Azerbaijani (Mətin Əmirov) * po/az.po: 2004-03-28 Benjamin Otte * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): get rid of non-standard "..." ranges in case statements. 2004-03-27 Martin Soto * gst/mpegstream/gstmpegdemux.c: * gst/mpegstream/gstmpegdemux.h: Complete overhaul. All DVD specific functionality split to the new dvddemux element. * gst/mpegstream/gstdvddemux.c: * gst/mpegstream/gstdvddemux.h: New demultiplexer for DVD (VOB) streams, derived from mpegdemux. * gst/mpegstream/gstmpegparse.c: Discontinuity handling cleaned up. SCR based timestamp rewriting can be turned off (will probably completely disappear soon). * ext/dvdnav/dvdnavsrc.c: Changes resulting from a few months hacking. General cleanup. All printf statements replaced by debugging messages. Almost complete libdvdnav support. (dvdnavsrc_class_init): Got rid of unnecessary signals (replaced by events. New properties for audio and subpicture languages. (dvdnavsrc_update_highlight): Now uses events. (dvdnavsrc_user_op): Cleaned up. (dvdnavsrc_get): Renamed to dvdnavsrc_loop (element is now loop based). Lots of cleanup, and propper support for most libdvdnav events. (dvdnavsrc_make_dvd_event): New function. (dvdnavsrc_make_dvd_nav_packet_event): New function. (dvdnavsrc_make_clut_change_event): New function. 2004-03-26 Benjamin Otte * gst/typefind/gsttypefindfunctions.c: (theora_type_find): fix bug where typefinding would claim it's theora whenever less then 7 bytes of data were available 2004-03-25 Ronald Bultje * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link), (gst_alawdec_base_init), (gst_alawdec_class_init), (gst_alawdec_init), (gst_alawdec_chain): * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link), (gst_alawenc_base_init), (gst_alawenc_class_init), (gst_alawenc_init), (gst_alawenc_chain): * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link), (gst_mulawdec_base_init), (gst_mulawdec_class_init), (gst_mulawdec_init), (gst_mulawdec_chain): * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link), (gst_mulawenc_base_init), (gst_mulawenc_class_init), (gst_mulawenc_init), (gst_mulawenc_chain): Fix capsnego in all four, remove the unused property functions and simplify the chain functions slightly. I guess we could use macros or something similar for those, since the code is so similar, but I'm currently too lazy... 2004-03-24 David Schleef * sys/oss/gstosselement.c: (gst_osselement_sync_parms), (gst_osselement_close_audio), (gst_osselement_probe_caps), (gst_osselement_get_format_structure), (gst_osselement_rate_probe_check), (gst_osselement_rate_add_range), (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate), (gst_osselement_rate_int_compare): Add code to handle rate probing (bug #120883) * sys/oss/gstosselement.h: same * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_getcaps): Use rate probing provided by osselement. * sys/oss/gstosssrc.c: (gst_osssrc_init), (gst_osssrc_getcaps): same 2004-03-24 Ronald Bultje * ext/xvid/gstxvidenc.c: (gst_xvidenc_set_property), (gst_xvidenc_get_property): ulong/int mess-up. 2004-03-24 David Schleef * ext/speex/gstspeexdec.c: (gst_speexdec_base_init), (gst_speexdec_init): * ext/speex/gstspeexenc.c: (gst_speexenc_base_init), (gst_speexenc_init): Create the pad template correctly (from the static pad template, not a NULL pointer.) 2004-03-25 Benjamin Otte * gst/debug/Makefile.am: * gst/debug/breakmydata.c: add element that quasi-randomly changes bytes in the stream. Intended use is robustness checking of demuxers and decoders in media tests. 2004-03-24 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_open_audio), (gst_alsa_probe_hw_params): * ext/alsa/gstalsa.h: debugging output fixes 2004-03-24 Benjamin Otte * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_set_property): don't g_return_if_fail if element is PLAYING, fail silently as every other element. * gst/effectv/gstquark.c: (gst_quarktv_chain): only fix needed for cast lvalue issues in gst-plugins * gst/volenv/gstvolenv.c: (gst_volenv_init): add proxy_getcaps 2004-03-24 Benjamin Otte * gst/level/gstlevel.c: (gst_level_init): add proxying getcaps function, so level doesn't advertise impossible caps 2004-03-24 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), (gst_qtdemux_loop_header), (qtdemux_parse_moov), (qtdemux_parse), (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), (qtdemux_parse_tree), (qtdemux_parse_trak): Fix debugging messages. Divide the chunk size by the compression ratio (needed for MACE audio) 2004-03-23 Ronald Bultje * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): Fix buffer overflow read error. 2004-03-23 Ronald Bultje * ext/alsa/gstalsa.h: Remove unused entry. * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): Add cinepak. * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), (gst_videodrop_link), (gst_videodrop_chain): Fix, sort of. Was horribly broken with new capsnego. Bah... 2004-03-23 Jeremy Simon * gst/typefind/gsttypefindfunctions.c: (ape_type_find), (plugin_init): Add a monkeysaudio typefind function 2004-03-23 Johan Dahlin * gst-libs/gst/play/play.c (gst_play_audio_fixate) (gst_play_video_fixate): Check so the structure has the field before trying to fixate them, this makes it possible to have fakesinks for video and audio output without printing errors on the output console. 2004-03-22 David Schleef * sys/oss/Makefile.am: * sys/oss/oss_probe.c: (main), (probe_check), (add_range), (check_rate), (add_rate): Rate probing test app. 2004-03-21 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), (_fixate_caps_to_int), (gst_audio_convert_fixate): add a fixation function that pretty much does the right thing (fixes #137556) 2004-03-20 David I. Lehn * configure.ac: GST_PACKAGE default: s/GStreamer/GStreamer Plugins/ 2004-03-20 Tim-Phillip Müller reviewed by: Benjamin Otte * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): terminate gst_event_new_discontinuous correctly (fixes parts of #137711) 2004-03-19 David Schleef * gst-libs/gst/Makefile.am: Enable xoverlay unconditionally, since it doesn't depend on X, and it's part of our ABI. 2004-03-19 Iain * gst/interleave/deinterleave.c (deinterleave_sink_link): Use the is_int in the structure, not the local variable. 2004-03-19 David Schleef * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_change_state), (gst_rfbsrc_init), (gst_rfbsrc_getcaps), (gst_rfbsrc_fixate), (gst_rfbsrc_link), (gst_rfbsrc_paint_rect), (gst_rfbsrc_get): Improvements in caps negotiation. 2004-03-18 Thomas Vander Stichele * po/LINGUAS: * po/af.po: adding Afrikaans (Petri Jooste) 2004-03-18 Thomas Vander Stichele * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_chain): throw error instead of g_critical (#137588) 2004-03-18 Thomas Vander Stichele * Makefile.am: * configure.ac: dist common and m4 correctly * po/sv.po: 2004-03-17 David Schleef * pkgconfig/gstreamer-media-info.pc.in: Add Version. (bug #137348) 2004-03-17 Thomas Vander Stichele * po/LINGUAS: * po/sv.po: adding Swedish translation (Christian Rose) 2004-03-17 Thomas Vander Stichele * Makefile.am: use release.mak 2004-03-16 Thomas Vander Stichele * common/ChangeLog: * common/gst-autogen.sh: add some explanation about the version detection * configure.ac: fix X check 2004-03-16 Thomas Vander Stichele * configure.ac: bump nano to 1 === release 0.8.0 === 2004-03-16 Thomas Vander Stichele * configure.ac: release 0.8.0, "Pharmaceutical Itch" 2004-03-16 Thomas Vander Stichele * configure.ac: update libtool version * gst-libs/gst/media-info/Makefile.am: actually use libtool version 2004-03-15 Thomas Vander Stichele * configure.ac: fix speex detection to work with 1.0 but not 1.1 2004-03-15 Thomas Vander Stichele * configure.ac: * gst-plugins.spec.in: * pkgconfig/Makefile.am: * pkgconfig/gstreamer-gconf-uninstalled.pc.in: * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: * pkgconfig/gstreamer-libs-uninstalled.pc.in: * pkgconfig/gstreamer-libs.pc.in: * pkgconfig/gstreamer-media-info-uninstalled.pc.in: * pkgconfig/gstreamer-play-uninstalled.pc.in: * pkgconfig/gstreamer-plugins-uninstalled.pc.in: * pkgconfig/gstreamer-plugins.pc.in: remove @VERSION@ from some of the pc files since core and plugins are decoupled. created gstreamer-plugins.pc as it's a better name, but keeping -libs around for now to get fixes upstream done first. 2004-03-15 Julien MOUTTE * gst-libs/gst/play/play.c: (gst_play_get_framerate), (gst_play_get_sink_element): First draft of gst_play_get_framerate. * gst-libs/gst/play/play.h: 2004-03-15 Thomas Vander Stichele * *.c, *.cc: don't mix tabs and spaces 2004-03-15 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): use the new ffmpegcolorspace * gst-plugins.spec.in: package new colorspace and media-info * configure.ac: * pkgconfig/Makefile.am: fix some more disting issues * pkgconfig/gstreamer-media-info-uninstalled.pc.in: * pkgconfig/gstreamer-media-info.pc.in: generate media-info pc files 2004-03-15 Johan Dahlin * *.h: Revert indenting 2004-03-15 Thomas Vander Stichele * configure.ac: adding ffmpegcolorspace element * gst/ffmpegcolorspace/Makefile.am: * gst/ffmpegcolorspace/avcodec.h: * gst/ffmpegcolorspace/common.h: * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): * gst/ffmpegcolorspace/dsputil.h: * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): * gst/ffmpegcolorspace/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_pix_fmt_to_caps), (gst_ffmpeg_caps_to_pix_fmt): * gst/ffmpegcolorspace/gstffmpegcodecmap.h: * gst/ffmpegcolorspace/gstffmpegcolorspace.c: (gst_ffmpegcolorspace_caps_remove_format_info), (gst_ffmpegcolorspace_getcaps), (gst_ffmpegcolorspace_pad_link), (gst_ffmpegcolorspace_get_type), (gst_ffmpegcolorspace_base_init), (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_init), (gst_ffmpegcolorspace_chain), (gst_ffmpegcolorspace_change_state), (gst_ffmpegcolorspace_set_property), (gst_ffmpegcolorspace_get_property), (gst_ffmpegcolorspace_register): * gst/ffmpegcolorspace/imgconvert.c: (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), (avpicture_get_size), (avcodec_get_pix_fmt_loss), (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), (yuv422_to_yuv420p), (yuv422_to_yuv422p), (yuv422p_to_yuv422), (C_JPEG_TO_CCIR), (img_convert_init), (img_apply_table), (shrink41), (shrink21), (shrink12), (shrink22), (shrink44), (grow21_line), (grow41_line), (grow21), (grow22), (grow41), (grow44), (conv411), (gif_clut_index), (build_rgb_palette), (bitcopy_n), (mono_to_gray), (monowhite_to_gray), (monoblack_to_gray), (gray_to_mono), (gray_to_monowhite), (gray_to_monoblack), (avpicture_alloc), (avpicture_free), (is_yuv_planar), (img_convert), (get_alpha_info_pal8), (img_get_alpha_info), (deinterlace_line), (deinterlace_line_inplace), (deinterlace_bottom_field), (deinterlace_bottom_field_inplace), (avpicture_deinterlace): * gst/ffmpegcolorspace/imgconvert_template.h: * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): * gst/ffmpegcolorspace/mmx.h: * gst/ffmpegcolorspace/utils.c: (avcodec_init): adding ffmpegcolorspace element supplied by Ronald after cleaning up and pulling in the right bits of upstream source. I'm sure a better C/compiler wizard could do some cleaning up (for example use GLIB's malloc stuff), but as a first pass this works very well 2004-03-15 Thomas Vander Stichele * ext/alsa/gstalsa.h: I assume Ronald forgot to commit the change to have cardname as a struct member. Expect some public spanking at the next opportunity. 2004-03-15 Ronald Bultje * ext/alsa/gstalsa.c: (gst_alsa_get_property), (gst_alsa_open_audio), (gst_alsa_close_audio): * ext/alsa/gstalsa.c: Don't open the device if we're a mixer (= padless). * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_class_init), (gst_alsa_mixer_init), (gst_alsa_mixer_open), (gst_alsa_mixer_close), (gst_alsa_mixer_change_state): Open mixer during state change rather than during object initialization. Also, get a device name. Currently in a somewhat hackish fashion, but I didn't really find something better. 2004-03-14 Thomas Vander Stichele * *.c, *.h: run gst-indent 2004-03-14 Benjamin Otte * gst/modplug/gstmodplug.cc: * gst/modplug/gstmodplug.h: set correct timestamps on outgoing buffers 2004-03-14 Benjamin Otte * gst/modplug/gstmodplug.cc: handle events - don't do crap when a discont arrives that's not necessary This allows correct loading and playback of mods in Rhythmbox 2004-03-14 Benjamin Otte * configure.ac: * gst-libs/gst/gconf/Makefile.am: * pkgconfig/Makefile.am: move gstreamer-gconf pkgconfig files to pkgconfig/ dir. Make sure they get rebuilt properly * configure.ac: when checking for vorbis, try pkgconfig first. * gst/modplug/gstmodplug.cc: add fixate function 2004-03-14 Ronald Bultje * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Fix for obvious mistake, where we first shift the offset and then read a samplesize element assuming the old offset. Note that this part still has something weird, i.e. my movies containing those don't actually play well, but at least there's something that looks like sound now. 2004-03-14 Jan Schmidt * gst/typefind/gsttypefindfunctions.c: (speex_type_find), (plugin_init): Add a typefind function for speex format 2004-03-13 Ronald Bultje * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps), (gst_asf_demux_setup_pad): Use 25fps as our "fake" fps value (marked for fixage in 0.9.x) instead of 0. Reason is simple: some elements have a fps range of 1-max instead of 0-max. So now ASF video actually works. 2004-03-13 Thomas Vander Stichele * po/LINGUAS: * po/sr.po: adding serbian as a language 2004-03-13 Benjamin Otte * gst/sine/gstsinesrc.c: (gst_sinesrc_get): return taglist correctly from _get function, don't gst_pad_push it. (fixes #137042) 2004-03-13 Jan Schmidt * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): 2004-03-13 Ronald Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_free_list): * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_class_init), (gst_alsa_mixer_track_new): * ext/alsa/gstalsamixertrack.h: Fix ancient leftovers... MixerTrack is a GObject. 2004-03-13 Ronald Bultje * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): Don't block during probing... 2004-03-12 Ronald Bultje * ext/alsa/gstalsa.c: (gst_alsa_get_type), (gst_alsa_class_init), (gst_alsa_get_property), (gst_alsa_probe_get_properties), (gst_alsa_class_probe_devices), (gst_alsa_class_list_devices), (gst_alsa_probe_probe_property), (gst_alsa_probe_needs_probe), (gst_alsa_probe_get_values), (gst_alsa_probe_interface_init), (gst_alsa_open_audio), (gst_alsa_close_audio): * ext/alsa/gstalsa.h: Add propertyprobe interface implementation, add some device-name property, all this so that it looks good in gnome-volume-control. 2004-03-12 David Schleef * configure.ac: the Hermes library controls hermescolorspace, not colorspace. * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), (gst_mpeg2dec_init): minor pet peeve: disable code with #ifdef, not /* */ * ext/sdl/sdlvideosink.c: Change XID to unsigned long. * ext/sdl/sdlvideosink.h: ditto. * gst/colorspace/gstcolorspace.c: Fix old comments about Hermes 2004-03-12 Benjamin Otte * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_set_xwindow_id), (gst_x_overlay_got_xwindow_id): * gst-libs/gst/xoverlay/xoverlay.h: replace XID with unsigned long to get rid of the xlibs dependency in XOverlay (fixes #137004) 2004-03-13 Jan Schmidt * gst/effectv/gstaging.c: (gst_agingtv_base_init), (gst_agingtv_setup): * gst/effectv/gstdice.c: (gst_dicetv_get_type), (gst_dicetv_base_init), (gst_dicetv_class_init), (gst_dicetv_setup), (gst_dicetv_init), (gst_dicetv_draw): * gst/effectv/gstedge.c: (gst_edgetv_get_type), (gst_edgetv_base_init), (gst_edgetv_class_init), (gst_edgetv_init), (gst_edgetv_setup), (gst_edgetv_rgb32): * gst/effectv/gsteffectv.c: * gst/effectv/gstquark.c: (gst_quarktv_link), (gst_quarktv_init), (gst_quarktv_set_property): * gst/effectv/gstrev.c: (gst_revtv_get_type), (gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init), (gst_revtv_setup), (gst_revtv_rgb32): * gst/effectv/gstshagadelic.c: (gst_shagadelictv_get_type), (gst_shagadelictv_base_init), (gst_shagadelictv_class_init), (gst_shagadelictv_init), (gst_shagadelictv_setup), (gst_shagadelictv_rgb32): * gst/effectv/gstvertigo.c: (gst_vertigotv_get_type), (gst_vertigotv_base_init), (gst_vertigotv_class_init), (gst_vertigotv_setup), (gst_vertigotv_init), (gst_vertigotv_rgb32): * gst/effectv/gstwarp.c: Port everything that can be ported to videofilter and fix up the caps. Can someone with a big-endian machine please check these? 2004-03-10 Ronald Bultje * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_get_time), (gst_osssink_chain), (gst_osssink_change_state): Latest fixes for A/V sync, audio playback and such. This is about all... MPEG playback issues are mostly related to the async build- up of MPEG files, I cannot fix that. Use basicgthread to solve it. 2004-03-10 Thomas Vander Stichele patch from: Stephane Loeuillet * configure.ac: use pkg-config for some libraries, falling back to the old .m4 way (fixes #131270) * m4/libdv.m4: removed 2004-03-10 Thomas Vander Stichele * configure.ac: * tools/Makefile.am: * tools/Makefile.in: * tools/gst-launch-ext-m.m: * tools/gst-launch-ext.1.in: * tools/gst-visualise-m.m: * tools/gst-visualise.1: * tools/gst-visualise.1.in: reorganizing generation of script tools 2004-03-10 Ronald Bultje * ext/divx/gstdivxdec.c: Downgrade priority. We prefer ffdec_mpeg4. * ext/faad/gstfaad.c: (gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain), (gst_faad_change_state): Fix capsnego. Doesn't work for some sounds because we don't have a 5:1 to stereo element. * ext/xvid/gstxvid.c: (plugin_init): Add priority. * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), (gst_osssink_change_state): Add discont handling. 2004-03-09 Colin Walters * gst/audioconvert/gstaudioconvert.c: Fix typo in width 8 conversion. 2004-03-09 Benjamin Otte * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): the signals take 2 arguments 2004-03-09 David Schleef * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad), (gst_alsa_fixate): Add fixate function. (bug #136686) * ext/alsa/gstalsa.h: * ext/alsa/gstalsasink.c: (gst_alsa_sink_init): 2004-03-09 Benjamin Otte * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_loop), (gst_mikmod_change_state): * ext/mikmod/gstmikmod.h: make mikmod's loop function not loop infinitely and call gst_element_yield anymore * gst/modplug/gstmodplug.cc: fix pad negotiation (fixes #136590) 2004-03-09 David Schleef * ext/lcs/Makefile.am: Fix so that the lcs colorspace plugin doesn't conflict with the internal colorspace plugin. * gst-libs/gst/audio/make_filter: Use `` instead of $() to satisfy the crappy-ass shell shipped by a certain vendor. * gst/videofilter/make_filter: same (bug #135299) 2004-03-09 Thomas Vander Stichele * configure.ac: bump nano to 1 === release 0.7.6 === 2004-03-09 Thomas Vander Stichele * configure.in: releasing 0.7.6, "There" 2004-03-09 Thomas Vander Stichele * pkgconfig/gstreamer-play-uninstalled.pc.in: * pkgconfig/gstreamer-play.pc.in: synchronize the two 2004-03-09 Thomas Vander Stichele * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_base_init), (cdparanoia_open), (cdparanoia_event): fix/add error handling * po/POTFILES.in: add cdparanoia source * tools/Makefile.am: make scripts executable 2004-03-09 Thomas Vander Stichele * configure.ac: * ext/vorbis/Makefile.am: * sys/Makefile.am: remove id3types, vorbisfile and xvideosink from the build (#133783) 2004-03-08 Ronald Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): Fix metadata read crash (#136537). 2004-03-08 Thomas Vander Stichele * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): * gst-libs/gst/media-info/media-info.c: (gst_media_info_read): adding mime types, fixing the one-stop function 2004-03-08 Christian Schaller * ext/nas/nassink.c and /ext/nas/nassink.h: More NAS love from Arwed von Merkatz So lets all sing 'Can you feel the NAS tonight' 2004-03-08 Christian Schaller * tools/gst-launch-ext.in: Replace vorbisfile with oggdemux/vorbisdec/audioconvert 2004-03-08 Thomas Vander Stichele * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), (gst_mpeg2dec_init): remove the user_data pad for now, because it is being used in fixating causing MPEG playback to fixate on 1000 Hz for playback. If someone knows how to fix this properly, please do. 2004-03-08 Thomas Vander Stichele * sys/oss/gstosssink.c: (gst_osssink_get_delay), (gst_osssink_get_time): add a warning, IMO this won't get triggered anymore, remove later 2004-03-07 David Schleef * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Added Cinepak format (bug #136470) 2004-03-07 Thomas Vander Stichele * gst-libs/Makefile.am: * gst-libs/gst/media-info/Makefile.am: * gst-libs/gst/media-info/media-info-priv.c: (found_tag_callback), (error_callback), (gst_media_info_error_create), (gst_media_info_error_element), (gmip_init), (gmip_reset), (gmi_clear_decoder), (gmip_find_type_pre), (gmip_find_type): * gst-libs/gst/media-info/media-info-priv.h: * gst-libs/gst/media-info/media-info-test.c: (main): * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), (gst_media_info_class_init), (gst_media_info_instance_init), (gst_media_info_set_source), (gst_media_info_read_with_idler), (gst_media_info_read_idler), (gst_media_info_read): * gst-libs/gst/media-info/media-info.h: fixed, should work now 2004-03-07 Christian Schaller * ext/nas/nassink.c: A bunch of NAS fixes from Arwed von Merkatz 2004-03-06 Ronald Bultje * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse_trak): Fix crash (j might be greater than n_samples, in which case we're writing outside the allocated space for the array) and memleak. 2004-03-06 Ronald Bultje * sys/oss/gstosssink.c: (gst_osssink_chain): And another caller that couldn't handle delay < 0 (unsigned integer overflow). Video now continues playing on an audio buffer underrun, and the clock continues working. Audio still stalls. 2004-03-06 Ronald Bultje * sys/oss/gstosssink.c: (gst_osssink_get_delay), (gst_osssink_get_time): get_delay() may return values lower than 0. In those cases, we should not actually cast to *unsigned* int64, that will break stuff horribly. In my case, it screwed up A/V sync in movies in totem rather badly. 2004-03-06 Christophe Fergeau * ext/faac/gstfaac.c: (gst_faac_chain): * ext/flac/gstflactag.c: (gst_flac_tag_chain): * ext/libpng/gstpngenc.c: (user_write_data): * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): Fix several misuse of gst_buffer_merge (it doesn't take ownership of any buffer), should fix some leaks. I hope I didn't unref buffers that shouldn't be... 2004-03-06 Thomas Vander Stichele * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), (deep_notify_callback), (tag_flag_score), (found_tag_callback), (error_callback), (gmi_reset), (gmi_seek_to_track), (gmi_get_decoder), (gmi_set_mime), (gmip_find_type_pre), (gmip_find_type_post), (gmip_find_stream_post), (gmip_find_track_streaminfo_post): * gst-libs/gst/media-info/media-info-priv.h: * gst-libs/gst/media-info/media-info-test.c: (print_tag), (info_print), (main): * gst-libs/gst/media-info/media-info.c: (gst_media_info_error_create), (gst_media_info_error_element), (gst_media_info_instance_init), (gst_media_info_get_property), (gst_media_info_new), (gst_media_info_set_source), (gst_media_info_read_idler), (gst_media_info_read): * gst-libs/gst/media-info/media-info.h: first pass at making this work again. This seems to work on tagged ogg/vorbis and mp3 files. 2004-03-06 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_chain): fix huge leak: gst_buffer_merge doesn't unref the first argument itself. 2004-03-06 Thomas Vander Stichele * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_update_info): report layer/mode/emphasis 2004-03-06 Christophe Fergeau * ext/mad/gstmad.c: (gst_mad_chain): fixed caps leak 2004-03-06 Thomas Vander Stichele * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): signal serial 2004-03-06 Thomas Vander Stichele * ext/vorbis/vorbis.c: (plugin_init): * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), (gst_vorbis_dec_init), (vorbis_dec_event): add debug category make vorbisdec handle _BYTE and _TIME queries 2004-03-06 Christophe Fergeau * ext/mad/gstmad.c: (gst_mad_chain): send the average bitrate read from the xing header 2004-03-06 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps), (gst_audio_convert_link), (gst_audio_convert_change_state), (gst_audio_convert_buffer_from_default_format): do conversions from/to float correctly, fix some caps nego errors, export correct supported caps in template and getcaps, use correct caps in try_set_caps functions 2004-03-06 Christophe Fergeau For some reason, I only committed a ChangeLog entry yesterday and not the corresponding code... * ext/mad/gstmad.c: Fix detection of Xing headers * gst/tags/gstid3tag.c: Changes to support TLEN tags 2004-03-06 Benjamin Otte * ext/ogg/gstoggdemux.c: (gst_ogg_get_pad_by_pad), (gst_ogg_demux_src_query): make sure to handle the case where there's no current chain gracefully. 2004-03-05 David Schleef * ext/aalib/gstaasink.c: (gst_aasink_fixate), (gst_aasink_init): Add fixate function. (bug #131128) * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), (gst_sdlvideosink_fixate): Add fixate function. * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): Fix attempt to print a non-pointer using GST_PTR_FORMAT. * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): Fix missing break that was causing ulaw to be interpreted as raw int. 2004-03-05 David Schleef * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): Fix code that ignores return value of gst_buffer_merge(). (bug #114560) * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_descramble_segment): * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): same * testsuite/gst-lint: Check for above. 2004-03-05 David Schleef * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Check for unfixed caps and throw an element error. (bug #136334) 2004-03-05 David Schleef * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_srcgetcaps), (gst_faad_chain): Fix negotiation. * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_handle_src_event): Add key and button events. * gst-libs/gst/floatcast/floatcast.h: Fix a minor bug in this dung heap of code. * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: gstgconf depends on gconf * gst-libs/gst/gconf/gstreamer-gconf.pc.in: same * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), (gst_play_video_fixate), (gst_play_audio_fixate): Add a fixate function to encourage better negotiation, particularly between audioconvert and osssink. * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Make some debugging more important. * gst/typefind/gsttypefindfunctions.c: Fix mistake in flash typefinding. * gst/vbidec/vbiscreen.c: Add glib header * pkgconfig/gstreamer-play.pc.in: Depends on gst-interfaces. 2004-03-06 Christophe Fergeau * ext/mad/gstmad.c: Fix detection of Xing headers * gst/tags/gstid3tag.c: Changes to support TLEN tags 2004-03-06 Thomas Vander Stichele * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), (gst_wavparse_pad_convert), (gst_wavparse_pad_query): debug updates 2004-03-06 Christophe Fergeau * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): * ext/mad/gstmad.c: (gst_mad_init), (is_xhead), (mpg123_parse_xing_header), (gst_mad_chain): parse Xing header in vbr files, and report the parsed length as a GST_TAG_DURATION tag. * gst/tags/gstid3tag.c: support TLEN (duration) tag 2004-03-05 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_channels): convert channels correctly. convert correctly to unsigned. 2004-03-05 Julien MOUTTE * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state): Check if we have a window before clearing it. 2004-03-05 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): Check if we have a window before clearing it. 2004-03-05 Thomas Vander Stichele * gconf/gstreamer.schemas.in: * gst-libs/gst/gconf/Makefile.am: version installation path the same way as for 0.6 * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: * pkgconfig/gstreamer-libs-uninstalled.pc.in: * pkgconfig/gstreamer-play-uninstalled.pc.in: remove comment that was fixed 2004-03-05 David Schleef * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_formats), (gst_qtdemux_src_convert), (gst_qtdemux_get_src_query_types), (gst_qtdemux_get_event_mask), (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), (gst_qtdemux_add_stream): Add prototype code for handling seeking and querying. 2004-03-04 Ronald Bultje * examples/gstplay/player.c: (main): Initialize variables to NULL. Prevents a segfault because the (uninitialized) variable is not NULL, resulting in a crash on trying to reach error->message. 2004-03-05 Benjamin Otte * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_buffer_to_default_format): make float=>int conversion work correctly even in cornercases. 2004-03-04 David I. Lehn * debian/README.Debian: * debian/build-deps: * debian/changelog: * debian/control: * debian/control.in: * debian/copyright: * debian/gstreamer-a52dec.files: * debian/gstreamer-aa.files: * debian/gstreamer-alsa.files: * debian/gstreamer-alsa.manpages: * debian/gstreamer-arts.files: * debian/gstreamer-artsd.files: * debian/gstreamer-audiofile.files: * debian/gstreamer-avifile.files: * debian/gstreamer-cdparanoia.files: * debian/gstreamer-colorspace.files: * debian/gstreamer-doc.files: * debian/gstreamer-dv.files: * debian/gstreamer-dvd.files: * debian/gstreamer-esd.files: * debian/gstreamer-festival.files: * debian/gstreamer-flac.files: * debian/gstreamer-gconf.conffiles: * debian/gstreamer-gconf.files: * debian/gstreamer-gconf.postinst: * debian/gstreamer-gnomevfs.files: * debian/gstreamer-gsm.files: * debian/gstreamer-http.files: * debian/gstreamer-jack.files: * debian/gstreamer-jpeg.files: * debian/gstreamer-mad.files: * debian/gstreamer-mikmod.files: * debian/gstreamer-misc.files: * debian/gstreamer-mpeg2dec.files: * debian/gstreamer-oss.files: * debian/gstreamer-plugin-apps.files: * debian/gstreamer-plugin-apps.manpages: * debian/gstreamer-plugin-libs-dev.files: * debian/gstreamer-plugin-libs.files: * debian/gstreamer-plugin-template.postinst: * debian/gstreamer-plugin-template.postrm: * debian/gstreamer-sdl.files: * debian/gstreamer-sid.files: * debian/gstreamer-vorbis.files: * debian/gstreamer-x.files: * debian/mk.control: * debian/rules: Debian package info not maintained here. 2004-03-04 Thomas Vander Stichele * ext/aalib/gstaasink.c: (gst_aasink_class_init): * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init): * ext/divx/gstdivxenc.c: (gst_divxenc_class_init): * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init): * ext/gsm/gstgsmenc.c: (gst_gsmenc_class_init): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): * ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init): * gst-libs/gst/colorbalance/colorbalance.c: (gst_color_balance_class_init): * gst-libs/gst/colorbalance/colorbalancechannel.c: (gst_color_balance_channel_class_init): * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): * gst-libs/gst/play/play.c: (gst_play_class_init): * gst-libs/gst/propertyprobe/propertyprobe.c: (gst_property_probe_iface_init): * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init): * gst-libs/gst/tuner/tunerchannel.c: (gst_tuner_channel_class_init): * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init): * gst/cutter/gstcutter.c: (gst_cutter_class_init): * gst/effectv/gstvertigo.c: (gst_vertigotv_class_init): * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): fix signals to use - instead of _ * ext/libcaca/gstcacasink.h: * ext/sdl/sdlvideosink.h: fix header rename 2004-03-04 David Schleef * testsuite/gst-lint: Add a check for bad signal names. 2004-03-04 reviewed by David Schleef * gst/videofilter/gstgamma.c: (gst_gamma_rgb32): Fix typo that modified the alpha channel and caused a warning. (bug #136192) 2004-04-03 Christian Schaller * gst-plugins.spec.in: Change names of plugins to actually be correct. Try to keep things alphabetical to avoid getting beat up by Thomas 2004-03-03 Julien MOUTTE * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_default_video_sink): Using ximagesink as a default if no gconf key found. We should probably consider using alsasink instead of osssink for the audio part. 2004-03-02 Thomas Vander Stichele * configure.ac: fix --with-plugins, don't think it ever worked before * gst-plugins.spec.in: even more updates 2004-03-01 Ronald Bultje * ext/sdl/sdlvideosink.h: * sys/ximage/ximagesink.h: * sys/xvideo/xvideosink.h: * sys/xvimage/xvimagesink.h: Fix for move of gstvideosink.h -> videosink.h. 2004-03-02 Thomas Vander Stichele * gst-libs/gst/xwindowlistener/Makefile.am: this is a plugin library, not a library 2004-03-01 David Schleef * AUTHORS: Added some names. Add yourself if you're still missing. 2004-03-01 David Schleef * MAINTAINERS: Add 2004-03-01 Thomas Vander Stichele * gst-plugins.spec.in: clean up spec file 2004-03-01 Thomas Vander Stichele * gst-libs/gst/video/Makefile.am: * gst-libs/gst/video/gstvideosink.c: * gst-libs/gst/video/gstvideosink.h: rename gstvideosink.h to videosink.h to match other headers * gst/mixmatrix/Makefile.am: fix plugin filename * gst/tags/Makefile.am: fix plugin filename 2004-03-01 Thomas Vander Stichele * gst/tags/Makefile.am: fix plugin filename 2004-03-01 Thomas Vander Stichele * examples/gstplay/player.c: (got_time_tick), (main): add error handler display time_tick more readably * gst/mixmatrix/Makefile.am: fix plugin file name 2004-02-29 Christophe Fergeau * sys/oss/gstosselement.c: (gst_osselement_probe), (device_combination_append), (gst_osselement_class_probe_devices): * sys/oss/gstosselement.h: Reworked enumeration of oss dsps and mixers so that gst-mixer works on my system using alsa oss emulation, fixes bug #135597 2004-02-29 Ronald Bultje * gst/videodrop/gstvideodrop.c: (gst_videodrop_init), (gst_videodrop_chain), (gst_videodrop_change_state): * gst/videodrop/gstvideodrop.h: Work based on timestamp of input data, not based on the expected framerate from the input. The consequence is that this element now not only scales framerates, but also functions as a framerate corrector or framerate stabilizer/constantizer. 2004-02-27 David Schleef patches from jmmv@menta.net (Julio M. Merino Vidal) * gst/interleave/deinterleave.c: (deinterleave_chain): Fix GST_ELEMENT_ERROR call (bug #135634) * gst/interleave/interleave.c: (interleave_buffered_loop), (interleave_bytestream_loop): Don't use alloca() (bug #135640) * sys/cdrom/gstcdplayer_ioctl_bsd.h: Fix ioctls on NetBSD (bug #135645) * sys/oss/gstosssink.c: (gst_osssink_get_delay), (gst_osssink_chain): Fix ioctls on NetBSD. (bug #135644) * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_requeue_frame): Fix GST_ELEMENT_ERROR call. * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_palette): Fix GST_ELEMENT_ERROR call. 2004-02-27 Benjamin Otte * gst-libs/gst/audio/audio.h: add macro to make sure header isn't included twice * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): don't use gst_buffer_free * gst/playondemand/filter.func: don't use gst_data_free. Free data only once. 2004-02-26 David Schleef * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/tuner/Makefile.am: * gst/level/Makefile.am: -marshal.[ch] and -enum.[ch] files should not be disted, -marshal.h files should not be installed, and -enum.h files _should_ be installed. Fix to make this the case. === release 0.7.5 === 2004-02-26 Thomas Vander Stichele * configure.ac: release 0.7.5, "Under The Sea" 2004-02-25 Thomas Vander Stichele * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), (gst_audio_convert_change_state), (gst_audio_convert_get_buffer): * gst/videoscale/gstvideoscale.c: * sys/oss/gstosselement.c: (gst_osselement_sync_parms): assorted debug/warning fixes 2004-02-25 Thomas Vander Stichele * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), (gst_videoscale_init), (gst_videoscale_chain), (gst_videoscale_set_property), (plugin_init): * gst/videoscale/gstvideoscale.h: * gst/videoscale/videoscale.c: (gst_videoscale_setup), (gst_videoscale_scale_rgb), (gst_videoscale_planar411), (gst_videoscale_planar400), (gst_videoscale_packed422), (gst_videoscale_packed422rev), (gst_videoscale_32bit), (gst_videoscale_24bit), (gst_videoscale_16bit), (gst_videoscale_bilinear), (gst_videoscale_bicubic), (gst_videoscale_scale_plane_slow), (gst_videoscale_scale_point_sample), (gst_videoscale_scale_nearest), (gst_videoscale_scale_nearest_str2), (gst_videoscale_scale_nearest_str4), (gst_videoscale_scale_nearest_32bit), (gst_videoscale_scale_nearest_24bit), (gst_videoscale_scale_nearest_16bit): add debugging category and use it properly fix use of GST_PTR_FORMAT 2004-02-25 Andy Wingo * gst/interleave/interleave.c (interleave_buffered_loop): Always push only when channel->buffer is NULL. Prevents segfaults doing the state change after a nonlocal exit, like a scheme exception. * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_getcaps): Handle the case where the intersected caps is empty. 2004-02-25 Thomas Vander Stichele * gst/law/mulaw-decode.c: (mulawdec_link): * gst/law/mulaw.c: (plugin_init): fix mulawdec so it actually works again 2004-02-24 Arwed v. Merkatz reviewed by: David Schleef * gst/videofilter/gstgamma.c: (gst_gamma_class_init), (gst_gamma_init), (gst_gamma_set_property), (gst_gamma_get_property), (gst_gamma_calculate_tables), (gst_gamma_rgb24), (gst_gamma_rgb32): Adds gamma correction for RGB, with separate r g and b correction factors. (#131167) 2004-02-24 Thomas Vander Stichele * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): only signal tags for bitrate if they're > 0 (#134894) 2004-02-24 David Schleef * gst/qtdemux/qtdemux.c: (plugin_init), (gst_qtdemux_loop_header), (qtdemux_parse_moov), (qtdemux_parse), (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), (qtdemux_parse_tree), (qtdemux_parse_trak): Cleanups. Convert g_prints to GST_LOGs. Add qtdemux debug category. Attempt to fix timestamp calculation. 2004-02-24 Johan Dahlin * gst-libs/gst/gconf/gconf.c: Add \n to g_print error messages 2004-02-23 Thomas Vander Stichele * configure.ac: * gconf/Makefile.am: * gconf/gstreamer.schemas: * gst-libs/gst/gconf/Makefile.am: * gst-libs/gst/gconf/gconf.c: version gconf schemas and install locations 2004-02-23 Benjamin Otte * ext/xine/xineinput.c: (gst_xine_input_dispose): (gst_xine_input_subclass_init): call parent dispose. change pad template for CD reader correctly * ext/xine/Makefile.am: * ext/xine/gstxine.h: * ext/xine/xine.c: (plugin_init): * ext/xine/xineaudiosink.c: wrap audio sinks, too * gst-libs/gst/resample/private.h: * gst-libs/gst/resample/resample.c: (gst_resample_init), (gst_resample_reinit), (gst_resample_scale), (gst_resample_nearest_s16), (gst_resample_bilinear_s16), (gst_resample_sinc_slow_s16), (gst_resample_sinc_s16), (gst_resample_sinc_ft_s16), (gst_resample_nearest_float), (gst_resample_bilinear_float), (gst_resample_sinc_slow_float), (gst_resample_sinc_float), (gst_resample_sinc_ft_float): * gst-libs/gst/resample/resample.h: * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), (gst_audioscale_class_init), (gst_audioscale_link), (gst_audioscale_get_buffer), (gst_audioscale_init), (gst_audioscale_chain), (gst_audioscale_set_property), (gst_audioscale_get_property): * gst/audioscale/gstaudioscale.h: s/resample_*/gst_resample_*/i to not clobber namespaces 2004-02-23 Julien MOUTTE * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), (gst_riff_create_audio_caps), (gst_riff_create_iavs_caps), (gst_riff_create_video_template_caps), (gst_riff_create_audio_template_caps), (gst_riff_create_iavs_template_caps): * gst-libs/gst/riff/riff-media.h: * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), (gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream), (gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream): * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), (gst_matroska_demux_plugin_init): First batch implementing audio and video codec tags in demuxers. 2004-02-22 Benjamin Otte * ext/xine/Makefile.am: * ext/xine/gstxine.h: * ext/xine/xine.c: (plugin_init): * ext/xine/xineinput.c: add input plugin wrapper. Playback from files, http, mms and cdda works. * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): remove leftover G_GNUC_UNUSED * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_stream), (gst_asf_demux_identify_guid): improve debugging output 2004-02-22 Benjamin Otte reported by: Padraig O'Briain * autogen.sh: replace test -e with test -x for mkinstalldirs to be more portable. (fixes #134816) 2004-02-22 Benjamin Otte reported by: Stefan Kost * gst/audioconvert/gstaudioconvert.c: (plugin_init): set rank to PRIMARY * gst/volume/gstvolume.c: (plugin_init): set rank to NONE fixes #134960 2004-02-22 Julio M. Merino Vidal reviewed by Benjamin Otte * ext/flac/gstflacenc.c: (gst_flacenc_chain): escape NULL strings in GST_ELEMENT_ERROR properly (fixes #135116) 2004-02-22 Benjamin Otte * configure.ac: export [_]*{gst,Gst,GST}.* symbols from plugins 2004-02-22 Christophe Fergeau reviewed by: Benjamin Otte * ext/lame/gstlame.c: (add_one_tag): * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value), (gst_vorbisenc_metadata_set1): * gst/tags/gstid3tag.c: * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): apply fixes from bugs #135042 (lame can't write tags) and #133817 (add GST_ALBUM_VOLUME_{COUNT,NUMBER} tags) 2004-02-22 Ramon Garcia * configure.ac: Export only gst_plugin_desc from plugins. Note that this change only makes any effect with Linux using libtool 1.5.2 or higher. Otherwise it is silently ignored, but it would build fine. And don't try to have several versions of libtool in different directories. 2004-02-20 Andy Wingo * gst/intfloat/, gst/oneton: Removed, replaced by audioconvert and interleave respectively. * gst/interleave/deinterleave.c: New plugin: deinterleave (replaces on oneton). * gst/interleave/interleave.c: New plugin: interleave. * gst/interleave/plugin.h: Support file. * gst/interleave/plugin.c: Support file. * configure.ac: Remove intfloat and oneton, add interleave. * ext/sndfile/gstsf.c: Handle events better. * gst/audioconvert/gstaudioconvert.c: Change to support int2float and float2int operation. int2float has scheduling problems as noted in in2float_chain. 2004-02-20 Benjamin Otte * ext/xine/Makefile.am: * ext/xine/gstxine.h: * ext/xine/xine.c: * ext/xine/xineaudiodec.c: * ext/xine/xinecaps.c: add first version of xine plugin wrapper. Currently only wraps the QDM2 win32 DLL, and even that only in proof-of-concept quality. * configure.ac: * ext/Makefile.am: add xine plugin wrapper, disabled by default. Use --enable-xine to build. Note that it'll segfault on gst-register if you don't remove the goom and tvtime post plugins from xine. * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), (qtdemux_parse), (qtdemux_parse_trak), (qtdemux_audio_caps): add extradata parsing for QDM2. change around debugging prints. 2004-02-19 Benjamin Otte * ext/lame/gstlame.c: (gst_lame_chain): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): use gst_tag_list_insert when you want to insert tags 2004-02-18 David Schleef * configure.ac: Move massink to gst-rotten * ext/Makefile.am: * ext/mas/Makefile.am: * ext/mas/massink.c: * ext/mas/massink.h: 2004-02-18 David Schleef * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): Disable gdk_pixbuf typefinding, since it seems to be worse than nothing. * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add ftyp atom to recognize .mp4 and .m4a files as video/quicktime. 2004-02-18 David Schleef * gst/sine/demo-dparams.c: (quit_live), (dynparm_log_value_changed), (dynparm_value_changed), (main): Use double dparams, not float. * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), (gst_sinesrc_init): Change sync default to FALSE, since multiple sync'd elements don't really work correctly. * gst/volume/gstvolume.c: (volume_class_init), (volume_init), (volume_update_volume), (volume_get_property): Change dparam to double. 2004-02-18 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_update_geometry), (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), (gst_ximagesink_change_state), (gst_ximagesink_expose), (gst_ximagesink_init): Rework the way software video scaling works. So now we check on each chain call if the video frames are feeling the window. If not we try to renegotiate caps. On failure we memorize that and we won't try again for that PLAYING sessions. * sys/ximage/ximagesink.h: Adding a boolean to store the caps renego failure. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the synchronous flag. 2004-02-18 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): break up _link so we can give a better debug message for errors 2004-02-18 Thomas Vander Stichele * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): set up debug category 2004-02-18 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), (gst_ximagesink_expose): Reorganizing the way renegotiation work. The event handling function is not taking care of external windows and renegotiate method check for pad flags NEGOTIATING. Should fix : #133209 2004-02-17 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_expose): Checking if the pad is negotiating before trying renegotiation. 2004-02-17 Thomas Vander Stichele * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): pass on all possible mime types as typefind hints 2004-02-17 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Fix a possible SHM leak if we crash. All other apps using XShm are doing that. 2004-02-17 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_expose): Renegotiate size on expose. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_expose): Update window size on expose. 2004-02-16 Benjamin Otte * testsuite/alsa/sinesrc.c: cosmetic fix to fix compile issue with gcc 2.95.4 2004-02-16 Julien MOUTTE * ext/alsa/gstalsa.c: (gst_alsa_open_audio), (gst_alsa_timestamp_to_bytes): Alsa should trigger an error if it failed opening the audio device. * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy), (gst_ximagesink_xwindow_resize), (gst_ximagesink_xwindow_clear), (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), (gst_ximagesink_xcontext_get), (gst_ximagesink_xcontext_clear), (gst_ximagesink_change_state), (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Clearing window in READY TO PAUSED. Removing some useless g_return_if_fail like wingo suggested. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xvimage_put), (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_xwindow_clear), (gst_xvimagesink_update_colorbalance), (gst_xvimagesink_handle_xevents), (gst_xvimagesink_xcontext_get), (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_get_fourcc_from_caps), (gst_xvimagesink_change_state), (gst_xvimagesink_chain), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_colorbalance_list_channels), (gst_xvimagesink_colorbalance_set_value), (gst_xvimagesink_colorbalance_get_value): Clearing window in READY TO PAUSED. Removing some useless g_return_if_fail like wingo suggested. 2004-02-16 Thomas Vander Stichele * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): throw error when not negotiated instead of asserting 2004-02-15 Julien MOUTTE * gst/switch/gstswitch.c: (gst_switch_loop): More fixes for correct data refcounting. 2004-02-15 Julien MOUTTE * gst/switch/gstswitch.c: (gst_switch_change_state), (gst_switch_class_init): Cleaning the sinkpads correctly on state change, mostly the EOS flag. 2004-02-15 Julien MOUTTE * examples/gstplay/player.c: (got_eos), (main): Adding some output for debugging. * gst-libs/gst/play/play.c: (gst_play_state_change): Stop our timeouts if we go to any state different from PLAYING. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Fix some more EOS bugs in riff lib. 2004-02-14 Julien MOUTTE * gst-libs/gst/play/play.c: (gst_play_connect_visualization): Disable visualization until i find a way to fix switch correctly. * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Fix a bug when EOS arrives. * gst/switch/gstswitch.c: (gst_switch_release_pad), (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), (gst_switch_loop), (gst_switch_dispose), (gst_switch_class_init): Reworked switch to get a more correct behaviour with events and refing of data stored in sinkpads. * gst/switch/gstswitch.h: Adding an eos flag for every sinkpad so that we don't pull from a pad in EOS. 2004-02-14 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_chain): remove v1 tag even if we can't read it (makes sure we don't detect it again) 2004-02-14 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait), (gst_alsa_xrun_recovery): * ext/alsa/gstalsa.h: try xrun recovery when wait failed. Make xrun recovery function return TRUE/FALSE to indicate success. (might fix #134354) 2004-02-13 David Schleef * gst/sine/demo-dparams.c: (dynparm_log_value_changed), (dynparm_value_changed), (main): Convert from float to double. * gst/sine/gstsinesrc.c: (gst_sinesrc_init): same. 2004-02-13 David Schleef * gst/silence/gstsilence.c: (gst_silence_class_init), (gst_silence_set_clock), (gst_silence_get), (gst_silence_set_property), (gst_silence_get_property): * gst/silence/gstsilence.h: Add sync property. * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), (gst_sinesrc_init), (gst_sinesrc_set_clock), (gst_sinesrc_get), (gst_sinesrc_set_property), (gst_sinesrc_get_property): * gst/sine/gstsinesrc.h: Add sync property. 2004-02-13 David Schleef * gst/intfloat/gstint2float.c: (conv_f32_s16), (gst_int2float_chain_gint16): Change stdint usage to glib types. 2004-02-13 Thomas Vander Stichele * configure.ac: * ext/Makefile.am: * gst-libs/ext/Makefile.am: move ffmpeg plugin to gst-ffmpeg module 2004-02-13 Thomas Vander Stichele * configure.ac: use GST_ARCH to detect architecture 2004-02-12 Julien MOUTTE * gst/vbidec/vbiscreen.c: Fixing thomasvs fixes. Missing header. 2004-02-12 Thomas Vander Stichele * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): classify LADSPA plugins based on number of src/sink pads (#133663, Stefan Kost) * gst/sine/gstsinesrc.c: (gst_sinesrc_init): fix dparams registration (#133528, Stefan Kost) * gst/vbidec/vbiscreen.c: (vbiscreen_set_current_cell): fix use of isprint and use g_ascii_isprint instead (#133316, Stefan Kost) 2004-02-11 David Schleef Convert a few inner loops to use liboil. This is currently optional, and is only enabled if liboil is present (duh!). * configure.ac: Check for liboil-0.1 * gst/intfloat/Makefile.am: * gst/intfloat/gstint2float.c: (conv_f32_s16), (scalarmult_f32), (gst_int2float_chain_gint16): * gst/videofilter/Makefile.am: * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init), (tablelookup_u8), (gst_videobalance_planar411): * gst/videotestsrc/Makefile.am: * gst/videotestsrc/gstvideotestsrc.c: (plugin_init): * gst/videotestsrc/videotestsrc.c: (splat_u8), (paint_hline_YUY2), (paint_hline_IYU2), (paint_hline_str4), (paint_hline_str3), (paint_hline_RGB565), (paint_hline_xRGB1555): 2004-02-11 David Schleef * ext/lcs/gstcolorspace.c: (colorspace_find_lcs_format), (gst_colorspace_caps_get_fourcc), (colorspace_setup_converter), (gst_colorspace_getcaps), (gst_colorspace_link), (gst_colorspace_base_init), (gst_colorspace_init), (gst_colorspace_chain), (gst_colorspace_change_state), (plugin_init): Merge Ronald's patch (bug #117897) and update for new caps and negotiation. Seems to work, although it shows off bugs in lcs. 2004-02-11 David Schleef * ext/alsa/Makefile.am: Fix linking against libgstinterfaces. (bug #133886) Noticed by bugs@leroutier.net (Stephane LOEUILLET) 2004-02-11 David Schleef * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init), (gst_rfbsrc_change_state), (gst_rfbsrc_init), (gst_rfbsrc_set_property), (gst_rfbsrc_get_property): Add server and port properties 2004-02-11 Thomas Vander Stichele * m4/a52.m4: * m4/aalib.m4: * m4/as-ffmpeg.m4: * m4/as-liblame.m4: * m4/as-slurp-ffmpeg.m4: * m4/check-libheader.m4: * m4/esd.m4: * m4/freetype2.m4: * m4/gconf-2.m4: * m4/glib.m4: * m4/gst-alsa.m4: * m4/gst-artsc.m4: * m4/gst-ivorbis.m4: * m4/gst-matroska.m4: * m4/gst-sdl.m4: * m4/gst-shout2.m4: * m4/gst-sid.m4: * m4/gtk.m4: * m4/libdv.m4: * m4/libfame.m4: * m4/libmikmod.m4: * m4/ogg.m4: * m4/vorbis.m4: fix underquotedness of macros (#133800) * m4/as-avifile.m4: * m4/xmms.m4: removed because no longer used 2004-02-11 Thomas Vander Stichele * configure.ac: require gettext 0.11.5 so ulonglong.m4 gets checked out and copied by autopoint (fixes #132996) 2004-02-11 Benjamin Otte * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init): * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_base_init): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init): * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_base_init): fix memleaks 2004-02-11 David Schleef * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), (gst_gdk_pixbuf_chain): Fix logic bug causing spurious errors. * ext/jpeg/gstjpegdec.c: (gst_jpegdec_base_init), (gst_jpegdec_init), (gst_jpegdec_chain): Fix negotiation. * ext/jpeg/gstjpegenc.c: (gst_jpegenc_base_init), (gst_jpegenc_class_init), (gst_jpegenc_init), (gst_jpegenc_getcaps), (gst_jpegenc_link), (gst_jpegenc_resync), (gst_jpegenc_chain), (gst_jpegenc_set_property), (gst_jpegenc_get_property): Fix negotiation. Add some properties. * ext/jpeg/gstjpegenc.h: Fix negotiation. 2004-02-10 Benjamin Otte * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_srcfixate), (gst_mikmod_srclink), (gst_mikmod_loop): * ext/mikmod/gstmikmod.h: fix caps negotiation in mikmod * ext/ogg/gstoggdemux.c: (gst_ogg_print): output debug information 2004-02-08 Benjamin Otte * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/navigation/Makefile.am: * gst-libs/gst/xoverlay/Makefile.am: remove unused GST_OPT_CFLAGS from Makefiles include X_CFLAGS and X_LIBS in xoverlay. (#131948) 2004-02-07 David Schleef * ext/ogg/gstoggdemux.c: (gst_ogg_demux_handle_event): Don't push events to pads that haven't been created (#133508) 2004-02-07 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), (gst_dvdec_sink_convert), (gst_dvdec_handle_sink_event), (gst_dvdec_video_getcaps), (gst_dvdec_video_link), (gst_dvdec_loop), (gst_dvdec_change_state): Second attempt at committing a working dvdec element. 2004-02-06 David Schleef Build fixes for OS X: (see #129600) * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strh), (gst_riff_read_strf_vids), (gst_riff_read_strf_auds), (gst_riff_read_strf_iavs): * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), (gst_avi_demux_stream_odml): * gst/playondemand/Makefile.am: * gst/rtp/rtp-packet.c: 2004-02-05 David Schleef * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_loop): Revert last change, because it Just Doesn't Compile. 2004-02-05 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_chain): skip undecodable id3v2 tag instead of keeping it 2004-02-05 David Schleef * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): Unref leaked buffer. (Noticed by Ronald) 2004-02-05 David I. Lehn * pkgconfig/gstreamer-libs-uninstalled.pc.in: Sync requires with other checks. >= vs =. 2004-02-06 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), (gst_dvdec_video_link), (gst_dvdec_loop): * ext/dv/gstdvdec.h: rework the caps negotiation so that dvdec works again instead of just segfaulting. === release 0.7.4 === 2004-02-06 Thomas Vander Stichele * NEWS: GStreamer Plugins 0.7.4 "For Great Justice" released * configure.ac: changed for release 2004-02-05 Thomas Vander Stichele * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: * pkgconfig/gstreamer-libs-uninstalled.pc.in: * pkgconfig/gstreamer-play-uninstalled.pc.in: reworked patch by David Lehn to fix libdir and includedir for uninstalled libraries removed play and gconf from gstreamer-libs since they have their own pkgconfig files 2004-02-04 David Schleef * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): Fix a caps memleak. 2004-02-05 Benjamin Otte * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): use correct GST_TAG_ENCODER tag 2004-02-05 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_change_state): be sure to stop the clock when going to paused * sys/oss/gstosssink.c: (gst_osssink_change_state): reset number of transmitted when going to ready. fixes #132935 2004-02-05 Charles Schmidt reviewed by Benjamin Otte * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): extract track count (fixes #133410) 2004-02-04 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): that should be !=, not == (fixes #132519) 2004-02-04 David Schleef Make sure set_explicit_caps() is called before adding pad. * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): * gst/id3/gstid3types.c: (gst_id3types_loop): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): 2004-02-04 Thomas Vander Stichele * configure.ac: bump nano to 2, first prerelease put back AM_PROG_LIBTOOL 2004-02-04 Thomas Vander Stichele * testsuite/alsa/Makefile.am: these are user test apps, not automatic testsuite tests 2004-02-04 David Schleef Convert GST_DEBUG_CAPS() to GST_DEBUG(): * gst/mpeg1videoparse/gstmp1videoparse.c: (mp1videoparse_parse_seq): * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): * sys/xvideo/gstxwindow.c: (_gst_xwindow_new): * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), (gst_xvideosink_getcaps): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): * testsuite/gst-lint: more tests 2004-02-04 David Schleef Replace use of GST_PAD_FORMATS_FUNCTION() and similar macros with the code that they would expand to. * ext/flac/gstflacdec.c: (gst_flacdec_get_src_formats), (gst_flacdec_get_src_query_types), (gst_flacdec_get_src_event_masks): * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_formats), (gst_gnomevfssrc_get_query_types), (gst_gnomevfssrc_get_event_mask): 2004-02-04 Benjamin Otte * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), (gst_sinesrc_dispose): fix memleak by properly disposing sinesrc 2004-02-04 Julien MOUTTE * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_expose): * gst-libs/gst/xoverlay/xoverlay.h: Adding the _expose method to tell an overlay to redraw the image because it has been exposed. * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), (gst_ximagesink_expose), (gst_ximagesink_xoverlay_init), (gst_ximagesink_init): * sys/ximage/ximagesink.h: Implement expose method from XOverlay interface * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xvimage_put), (gst_xvimagesink_expose), (gst_xvimagesink_xoverlay_init), (gst_xvimagesink_init): * sys/xvimage/xvimagesink.h: Implement expose method from XOverlay interface 2004-02-03 Benjamin Otte * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): more memleak fixage 2004-02-03 Benjamin Otte * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): * gst/typefind/gsttypefindfunctions.c: fix memleaks shown by gst-typefind 2004-02-03 Thomas Vander Stichele * common/glib-gen.mak: add hack rule to touch .Plo files * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/play/Makefile.am: * gst-libs/gst/tuner/Makefile.am: remove glib_root variable 2004-02-03 Benjamin Otte * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): set explicit caps before adding the element, so the autopluggers can plug correctly. * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), (mpeg2_sys_type_find), (mpeg1_sys_type_find), (mpeg_video_type_find), (mpeg_video_stream_type_find), (dv_type_find): fix memleaks in typefind functions. gst_type_find_suggest takes a const argument. 2004-02-03 Thomas Vander Stichele * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/colorbalance/colorbalance-marshal.list: * gst-libs/gst/colorbalance/colorbalance.c: * gst-libs/gst/colorbalance/colorbalance.h: * gst-libs/gst/colorbalance/colorbalancemarshal.list: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/mixer/mixer-marshal.list: * gst-libs/gst/mixer/mixer.c: * gst-libs/gst/mixer/mixer.h: * gst-libs/gst/mixer/mixermarshal.list: * gst-libs/gst/play/Makefile.am: * gst-libs/gst/play/play.h: * gst-libs/gst/tuner/Makefile.am: * gst-libs/gst/tuner/tuner-marshal.list: * gst-libs/gst/tuner/tuner.c: * gst-libs/gst/tuner/tuner.h: * gst-libs/gst/tuner/tunermarshal.list: use new glib-gen.mak snippet to clean up Makefile.am fix various bugs in Makefile.am's 2004-02-03 Benjamin Otte * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): handle chain parsing correctly in the multichain case * ext/theora/theoradec.c: (gst_theora_dec_init), (_theora_ilog), (theora_dec_from_granulepos), (theora_dec_to_granulepos), (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): handle events and queries correctly 2004-02-03 David I. Lehn * .cvsignore: Ignore generated file _stdint.h. 2004-02-03 David I. Lehn * gst-libs/gst/colorbalance/Makefile.am: * gst-libs/gst/colorbalance/colorbalance.h: * gst-libs/gst/mixer/Makefile.am: * gst-libs/gst/mixer/mixer.h: * gst-libs/gst/play/Makefile.am: * gst-libs/gst/play/play.h: * gst-libs/gst/tuner/Makefile.am: * gst-libs/gst/tuner/tuner.h: Generate enum type code with glib-mkenums. * gst-libs/gst/colorbalance/.cvsignore: * gst-libs/gst/mixer/.cvsignore: * gst-libs/gst/play/.cvsignore: * gst-libs/gst/tuner/.cvsignore: Ignore generated files. 2004-02-03 David I. Lehn * gst-libs/gst/audio/.cvsignore: Ignore generated file. * gst-libs/gst/audio/Makefile.am: Do not install example filter. 2004-02-03 David I. Lehn * examples/switch/.cvsignore: Ignore generated file. 2004-02-03 Benjamin Otte * common/m4/ax_create_stdint_h.m4: * configure.ac: add AX_CREATE_STDINT_H to get correct type definitions for a52dec in _stdint.h. * Makefile.am: remove generated _stdint.h in DISTCLEANFILES * ext/a52dec/gsta52dec.c: include _stdint.h for a52dec. (should fix #133064) 2004-02-02 Jeremy Simon * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add), (gst_tag_to_vorbis_comments): Add replaygain support to vorbistag 2004-02-02 Jeremy Simon * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_to_extradata): Fix SVQ3 caps flag properties Use glib macro for bytes swap 2004-02-02 Thomas Vander Stichele * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): * ext/gnomevfs/gstgnomevfs.c: (plugin_init): * ext/sndfile/gstsf.c: (plugin_init): * gst/avi/gstavi.c: (plugin_init): * sys/dxr3/dxr3init.c: (plugin_init): * sys/oss/gstossaudio.c: (plugin_init): * sys/v4l/gstv4l.c: (plugin_init): * sys/v4l2/gstv4l2.c: (plugin_init): remove textdomain calls * po/nl.po: update Dutch translation 2004-02-02 Julien MOUTTE * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), (gst_play_set_audio_sink): Moving volume in the audio thread for instantaneous volume change. Maybe i will add another volume in front of visualization later, not sure yet though. 2004-02-02 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents): Better X events handling, only take the latest events for configure and motion. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): same. 2004-02-02 Jon Trowbridge reviewed by: David Schleef Fix memory leaks: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_register): 2004-02-02 David Schleef code cleanup. Change bzero() to memset(). Remove duplicate ; at ends of lines. * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_event): * ext/flac/gstflactag.c: (gst_flac_tag_chain): * ext/xvid/gstxviddec.c: (gst_xviddec_src_link): * gst-libs/gst/play/play.c: (gst_play_get_sink_element): * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): * gst/effectv/gstedge.c: (gst_edgetv_sinkconnect): * gst/effectv/gstvertigo.c: (gst_vertigotv_sinkconnect): * gst/intfloat/float22int.c: (gst_float2_2_int_getcaps), (gst_float2_2_int_link): * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): * gst/rtjpeg/RTjpeg.c: (RTjpeg_init_mcompress): * gst/tcp/gsttcpsink.c: (gst_tcpsink_init_send): * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_init_receive): * gst/udp/gstudpsink.c: (gst_udpsink_init_send): * gst/udp/gstudpsrc.c: (gst_udpsrc_init_receive): * sys/v4l/gstv4lelement.c: (gst_v4lelement_init): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): * testsuite/gst-lint: Add tests for bzero and ;; 2004-02-02 David Schleef * gst/debug/efence.c: Add fallback if MAP_ANONYMOUS isn't defined. 2004-02-02 Thomas Vander Stichele * ext/aalib/gstaasink.c: (gst_aasink_open): * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): * ext/audiofile/gstafsink.c: (gst_afsink_open_file), (gst_afsink_close_file): * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), (gst_afsrc_close_file): * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): * ext/dv/gstdvdec.c: (gst_dvdec_loop): * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): * ext/esd/esdmon.c: (gst_esdmon_get): * ext/esd/esdsink.c: (gst_esdsink_chain), (gst_esdsink_open_audio): * ext/faac/gstfaac.c: (gst_faac_chain): * ext/faad/gstfaad.c: (gst_faad_chain): * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), (gst_flacdec_loop): * ext/flac/gstflacenc.c: (gst_flacenc_chain): * ext/flac/gstflactag.c: (gst_flac_tag_chain): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), (gst_gnomevfssrc_open_file): * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), (gst_id3_tag_do_typefind), (gst_id3_tag_chain): * ext/mad/gstmad.c: (gst_mad_chain): * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): * ext/mpeg2dec/gstmpeg2dec.c: * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mplex/gstmplex.cc: * ext/mplex/gstmplexibitstream.cc: * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), (gst_ogg_demux_push): * ext/raw1394/gstdv1394src.c: * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): * ext/speex/gstspeexenc.c: (gst_speexenc_chain): * ext/swfdec/gstswfdec.c: (gst_swfdec_loop): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), (gst_riff_read_element_data), (gst_riff_read_seek), (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): * gst/adder/gstadder.c: (gst_adder_loop): * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): * gst/avi/gstavimux.c: (gst_avimux_stop_file): * gst/flx/gstflxdec.c: (gst_flxdec_loop): * gst/goom/gstgoom.c: (gst_goom_chain): * gst/id3/gstid3types.c: (gst_id3types_loop): * gst/intfloat/float22int.c: (gst_float2_2_int_chain): * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_read_element_data), (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), (gst_ebml_read_float), (gst_ebml_read_header): * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_blockgroup): * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): * gst/oneton/gstoneton.c: (gst_oneton_chain): * gst/silence/gstsilence.c: (gst_silence_get): * gst/sine/gstsinesrc.c: (gst_sinesrc_get): * gst/smpte/gstsmpte.c: (gst_smpte_loop): * gst/speed/gstspeed.c: (speed_loop): * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): * gst/volenv/gstvolenv.c: (gst_volenv_chain): * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), (gst_wavparse_loop): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), (dxr3audiosink_close): * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), (dxr3videosink_close), (dxr3videosink_write_data): * sys/oss/gstosselement.c: (gst_osselement_open_audio): * sys/oss/gstosssink.c: (gst_osssink_chain): * sys/oss/gstosssrc.c: (gst_osssrc_get): * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), (gst_v4l_set_window), (gst_v4l_enable_overlay): * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), (gst_v4l_set_chan_norm), (gst_v4l_get_signal), (gst_v4l_get_frequency), (gst_v4l_set_frequency), (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): * sys/v4l/v4l_calls.h: * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), (gst_v4lmjpegsink_playback_init), (gst_v4lmjpegsink_playback_start): * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame): * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), (gst_v4l2_set_window), (gst_v4l2_enable_overlay): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), (gst_v4l2_get_output), (gst_v4l2_set_output), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute): * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop): * sys/vcd/vcdsrc.c: (vcdsrc_open_file): * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), (gst_ximagesink_chain): * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), (gst_xvideosink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_chain): 2004-02-02 Thomas Vander Stichele * gst/volume/gstvolume.c: (gst_volume_set_volume), (gst_volume_get_volume), (volume_class_init), (volume_init), (volume_chain_int16), (volume_update_volume): * gst/volume/gstvolume.h: make code more readable by removing magic numbers make mixer interface export 0-100 range make it internally map to 0.0-1.0 range so users don't distort output by putting the sliders at full volume 2004-02-02 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_tick_callback), (gst_play_state_change), (gst_play_seek_to_time): block the tick callback for 0.5 secs after doing a seek 2004-02-02 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_new): check for GError 2004-02-01 Julien MOUTTE * gst-libs/gst/play/play.c: (gst_play_seek_to_time), (gst_play_new): Accepting NULL GError, blocking time tick while seeking. * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), (gst_ximagesink_chain), (gst_ximagesink_init): s/sinkconnect/sink_link * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), (gst_xvimagesink_chain), (gst_xvimagesink_init): s/sinkconnect/sink_link 2004-02-01 Thomas Vander Stichele * configure.ac: * ext/vorbis/vorbisdec.c: (vorbis_dec_event): check for a function added in vorbis 1.1 2004-01-31 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), (gst_alsa_drain_audio), (gst_alsa_stop_audio): really start/stop clock only on PLAYING <=> PAUSED * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): remove \n from debugging lines * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): make it work when seeking does not * ext/vorbis/vorbisdec.c: (vorbis_dec_event): reset on DISCONT 2004-01-31 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start): start clock on PAUSED=>PLAYING, not later * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): extract correct time for different discont formats (gst_alsa_sink_get_time): don't segfault when no format is negotiated yet, just return 0 * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), (gst_ogg_demux_handle_event), (gst_ogg_demux_push), (gst_ogg_pad_push): handle flush and discont events correctly * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): handle discont events correctly 2004-01-31 Thomas Vander Stichele * gst-libs/gst/play/play.c: (gst_play_error_quark), (gst_play_error_create), (gst_play_error_plugin), (gst_play_pipeline_setup), (gst_play_init), (gst_play_new): * gst-libs/gst/play/play.h: add error handling during creation * examples/gstplay/player.c: (main): use new gst_play_new 2004-01-31 Benjamin Otte * ext/theora/theoradec.c: (theora_dec_chain): make comments work * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query), (vorbis_dec_src_event), (vorbis_dec_chain): add encoder tag, fix tag reading to be more error tolerant, change BITRATE to NOMINAL_BITRATE, add debugging, don't unref events after gst_pad_event_default. * gst/tags/gstvorbistag.c: (gst_tag_list_from_vorbiscomment_buffer): undefine function specific define at end of function 2004-01-31 Jeremy Simon * ext/flac/gstflac.c: (plugin_init): * ext/flac/gstflacdec.c: (gst_flacdec_class_init): * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.h: Fix typos 2004-01-30 David I. Lehn * examples/gstplay/player.c: s/gstplay.h/play.h/ 2004-01-30 Thomas Vander Stichele * gst-libs/gst/play/Makefile.am: * gst-libs/gst/play/gstplay.c: * gst-libs/gst/play/gstplay.h: * gst-libs/gst/play/play.c: more surgery, operation complete 2004-01-30 Thomas Vander Stichele * gst-libs/gst/play/play.old.c: * gst-libs/gst/play/play.old.h: after CVS surgery by moving, remove * gst-libs/gst/play/playpipelines.c: remove * gst/intfloat/float22int.c: (gst_float2_2_int_chain): add negotiation error 2004-01-30 Thomas Vander Stichele * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), (gst_ogg_demux_push): add some seeking debug info send a flush when seeking 2004-01-30 Benjamin Otte * configure.ac: use AC_C_INLINE * configure.ac: * ext/Makefile.am: * ext/theora/Makefile.am: * ext/theora/theoradec.c: add theora video decoder. Does just do simple decoding for now and has been tested against Theora cvs only. It only works when theora is compiled with --enable-static. * ext/vorbis/vorbisdec.c: (vorbis_dec_event): always reset packetno on DISCONT 2004-01-30 Ronald Bultje * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): Fix audio. 2004-01-30 Ronald Bultje * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_type_frame_length_from_header): Fix header parsing - stolen from ffmpeg (thank you! :) ). 2004-01-30 Ronald Bultje * ext/esd/esdsink.c: (gst_esdsink_init): Since we have static pad template caps, we don't need to negotiate; either the core errors out or we know the format. 2004-01-30 Ronald Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), (gst_riff_read_seek): * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), (gst_ebml_read_seek): Fix event handling. 2004-01-30 Benjamin Otte * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): removee video/x-theora from vp3 decoder, it doesn't handle raw theora streams * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init): fix bug with finalizing element that never went to PAUSED * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): length and position queries were swapped * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init), (vorbis_dec_from_granulepos), (vorbis_dec_src_query), (vorbis_dec_src_event): implement querying time and bytes 2004-01-30 Thomas Vander Stichele * just about every source file: gst_element_error -> GST_ELEMENT_ERROR 2004-01-29 Julien MOUTTE * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get): Fixing seeking emiting FLUSH and even before DISCONT. * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): Fix seeking to get the best instant seeking as possible yay! 2004-01-29 Ronald Bultje * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_real_chain): Committed wrong version last week... Grr... Didn't notice until now. 2004-01-29 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): Emit the have_xwindow_id signal in xwindow_create. 2004-01-29 Benjamin Otte * ext/ogg/gstoggdemux.c: lots of changes - mainly support for chained bitstreams, seeking, querying and bugfixes of course * ext/vorbis/Makefile.am: * ext/vorbis/vorbisdec.c: * ext/vorbis/vorbisdec.h: add vorbisdec raw vorbis decoder * ext/vorbis/vorbis.c: (plugin_init): register vorbisdec as PRIMARY, vorbisfile as SECONDARY * gst/intfloat/Makefile.am: * gst/intfloat/float22int.c: * gst/intfloat/float22int.h: * gst/intfloat/gstintfloatconvert.c: (plugin_init): add float2intnew plugin. It converts multichannel interleaved float to multichannel interleaved int. The name should probably be changed. * gst/typefind/gsttypefindfunctions.c: (theora_type_find), (plugin_init): add typefinding for raw theora video so oggdemux can detect it. 2004-01-28 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): seek on video sink element first. * gst/videoscale/gstvideoscale.c: (gst_videoscale_handle_src_event): Fixing src event handler. 2004-01-28 Ronald Bultje * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_open), (gst_v4lsrc_close), (gst_v4lsrc_palette_to_caps), (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps), (gst_v4lsrc_set_clock): * sys/v4l/gstv4lsrc.h: * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_start), (gst_v4lsrc_grab_frame), (gst_v4lsrc_capture_stop): Implement resizing... Hack. But that's why v4l is b0rked... 2004-01-28 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get): Removing some useless debugs messages, correctly cleaning the image created to check xshm calls on succes, added a lot of XSync calls in X11 functions, and fixed a segfault when no image format was defined before negotiation happened. 2004-01-28 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_query_func): use gst_element_get_time to get correct time 2004-01-28 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_destroy), (gst_ximagesink_xcontext_get), (gst_ximagesink_class_init): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xerror), (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xcontext_get): Our X plugins are now able to detect that XShm calls will fail even if the server claims that it has XShm support (remote displays most of the time). We then log the error as a GST_DEBUG and set use_shm to FALSE so that we use non XShm functions. This feature is almost useless for xvimagesink as Xv is not supported on remote displays anyway, but it might happen than even on the local display XShm calls fail. 2004-01-27 David Schleef * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), (gst_esdsink_link), (gst_esdsink_get_time), (gst_esdsink_chain), (gst_esdsink_change_state): Fix sync issues in esdsink. Also changed esdsink to only use 44100,16,2, since esd sucks at rate conversion and esdsink has had difficulty negotiating. 2004-01-27 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback), (gst_play_seek_to_time): Fixing the way to get current position. 2004-01-27 Benjamin Otte * sys/oss/gstosssink.c: (gst_osssink_sink_query): use gst_element_get_time to get correct time 2004-01-27 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_set_location): The easiest fix ever... Inverting 2 lines of code make spider autoplug correctly tagged mp3 ! 2004-01-27 David Schleef * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): Use gst_pad_try_set_caps_nonfixed(). 2004-01-27 David Schleef * gst/ac3parse/gstac3parse.c: update to checklist 5 * gst/adder/gstadder.c: rewrite negotiation. update to checklist 5 * gst/audioconvert/gstaudioconvert.c: update to checklist 5 * gst/audioscale/gstaudioscale.c: same * gst/auparse/gstauparse.c: same * gst/avi/gstavidemux.c: same 2004-01-27 Benjamin Otte * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): stop processing after EOS 2004-01-27 Benjamin Otte * gst/asfdemux/asfheaders.h: * gst/asfdemux/gstasfdemux.c: * gst/asfdemux/gstasfmux.c: (gst_asfmux_put_guid), (gst_asfmux_put_string), (gst_asfmux_put_wav_header), (gst_asfmux_put_vid_header), (gst_asfmux_put_bmp_header): lot's of fixes to make data extraction simpler and get the code architecture and compiler independant. Add debugging category * gst/goom/gstgoom.c: (gst_goom_change_state): reset channel count on PAUSED=>READY, not READY=>PAUSED 2004-01-26 Colin Walters * ext/gnomevfs/gstgnomevfssrc.c (gst_gnomevfssrc_get): Remove ugly code to pull a bigger buffer in iradio mode. This as a side effect makes typefinding work. 2004-01-26 Jeremy Simon * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): Fix SVQ3 decoding on PPC 2004-01-26 Julien MOUTTE * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Dunno how that one managed to stay there... Fixed. 2004-01-26 Jeremy Simon * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_to_extradata), (gst_ffmpeg_caps_to_pixfmt): * gst/qtdemux/qtdemux.c: (plugin_init), (qtdemux_parse_trak), (qtdemux_video_caps): * gst/qtdemux/qtdemux.h: Add SVQ3 specific flags to qtdemux and ffmpeg 2004-01-26 Benjamin Otte * gst-libs/gst/audio/audio.h: remove buffer-frames from audio caps * gst/audioconvert/gstaudioconvert.c: fix plugin to really work. 2004-01-25 Ronald Bultje * gst-libs/gst/mixer/mixer.c: * gst-libs/gst/propertyprobe/propertyprobe.c: * gst-libs/gst/tuner/tuner.c: (gst_tuner_find_norm_by_name), (gst_tuner_find_channel_by_name): * gst-libs/gst/tuner/tuner.h: Add gtk-doc style comments. Also fix a function name. 2004-01-25 Ronald Bultje * ext/divx/gstdivxdec.c: (gst_divxdec_init), (gst_divxdec_negotiate): Fix for new capsnego - also fixes gst-player with divxdec. 2004-01-25 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), (gst_play_identity_handoff), (gst_play_set_location), (gst_play_set_visualization), (gst_play_connect_visualization): Another try in visualization implementation. Still have an issue with switch blocking when pulling from video_queue and only audio comes out of spider. * gst/switch/gstswitch.c: (gst_switch_release_pad), (gst_switch_poll_sinkpads), (gst_switch_class_init): Implementing pad release method. And check if the pad is usable before pulling. 2004-01-25 Ronald Bultje * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose), (gst_videobalance_init), (gst_videobalance_colorbalance_list_channels), (gst_videobalance_colorbalance_set_value), (gst_videobalance_colorbalance_get_value), (gst_videobalance_update_properties), (gst_videobalance_update_tables_planar411), (gst_videobalance_planar411): * gst/videofilter/gstvideobalance.h: Implement lookup-tables. +/- 10x faster. 2004-01-25 Ronald Bultje * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): The index reading was broken. The rest worked fine, but the whole goal of my rewrite was to make avidemux readable, and this was not at all readable. Please use typed variables. 2004-01-25 Ronald Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): Additional pad usability check. * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), (mp1videoparse_find_next_gop), (gst_mp1videoparse_time_code), (gst_mp1videoparse_real_chain): Fix MPEG video stream parsing. The original plugin had several issues, including not timestamping streams where the source was not timestamped (this happens with PTS values in mpeg system streams, but MPEG video is also a valid stream on its own so that needs timestamps too). We use the display time code for that for now. Also, if one incoming buffer contains multiple valid frames, we push them all on correctly now, including proper EOS handling. Lastly, several potential segfaults were fixed, and we properly sync on new sequence/gop headers to include them in next, not previous frames (since they're header for the next frame, not the previous). Also see #119206. * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain), (bpf_from_header): Move caps setting so we only do it after finding several valid MPEG-1 fraes sequentially, not right after the first one (which might be coincidental). * gst/typefind/gsttypefindfunctions.c: (mpeg1_sys_type_find), (mpeg_video_type_find), (mpeg_video_stream_type_find), (plugin_init): Add unsynced MPEG video stream typefinding, and change some probability values so we detect streams rightly. The idea is as follows: I can have an unsynced system stream which contains video. In the current code, I would randomly get a type for either system or video stream type found, because the probabilities are being calculated rather randomly. I now use fixed values, so we always prefer system stream if that was found (and that is how it should be). If no system stream was found, we can still identity the stream as video-only. 2004-01-23 Benjamin Otte * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): don't write to buffer. Extract data without the need of __attribute__ ((packed)) 2004-01-23 Ronald Bultje * gst/typefind/gsttypefindfunctions.c: (mpeg1_parse_header), (mpeg1_sys_type_find): Fix MPEG-1 stream typefinding. 2004-01-23 Ronald Bultje * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): Fix typefinding for MPEG-1 system streams, similar to MPEG-2. 2004-01-23 Thomas Vander Stichele * ext/esd/esdsink.c: (gst_esdsink_open_audio): * ext/esd/gstesd.c: (plugin_init): private debugging, better error reporting 2004-01-23 Ronald Bultje * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), (gst_riff_read_init), (gst_riff_read_change_state): * gst-libs/gst/riff/riff-read.h: Remove stuff fromold metadata system. 2004-01-23 Ronald Bultje * ext/ogg/gstoggdemux.c: Fix wrong file comment. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): Add metadata reading properly. 2004-01-23 Thomas Vander Stichele * ext/Makefile.am: Fix nas DIST_SUBDIRS Uraeus: Fix bug where make distcheck doesn't get run on adding stuff to the build. 2004-01-23 Ronald Bultje * ext/divx/gstdivxdec.c: (gst_divxdec_init), (gst_divxdec_setup): * ext/divx/gstdivxdec.h: Fix divx3 ("msmpeg4") playback using divxdec. 2004-01-23 Benjamin Otte * gst/typefind/gsttypefindfunctions.c: (mp3_type_frame_length_from_header): fix bug in length computation (mp3_type_find): improve debugging output 2004-01-23 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), (gst_play_set_location), (gst_play_seek_to_time), (gst_play_set_audio_sink), (gst_play_set_visualization), (gst_play_connect_visualization), (gst_play_get_sink_element): Reworked the pipeline from scratch. Visualization is back and switch went out as i realized it was not possible to use the way i wanted. * sys/ximage/ximagesink.c: (gst_ximagesink_imagepool_clear), (gst_ximagesink_change_state), (gst_ximagesink_dispose): Move xcontext clearing in state change from READY to NULL. So that one can clean the X ressources keeping the element. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_imagepool_clear), (gst_xvimagesink_change_state), (gst_xvimagesink_colorbalance_set_value), (gst_xvimagesink_colorbalance_get_value), (gst_xvimagesink_set_property), (gst_xvimagesink_dispose), (gst_xvimagesink_init): Same xcontext cleaning than ximagesink in state change from READY to NULL and fixed some stupid bugs in colorbalance get/set values. Also added the following feature : when nobody tries to set some values to the colorbalance levels before the xcontext is grabbed, then when creating channels list from Xv attributes we set the internal values to the Xv defaults. This way we handle buggy Xv drivers that set default hue values far from the middle of the range (Thanks to Jon Trowbridge for pointing that issue). * sys/xvimage/xvimagesink.h: Adding a cb_changed boolean to know if colorbalance levels have been set before xcontext is grabbed. 2004-01-22 Ronald Bultje * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): Fix the ossmixer case where we shouldn't open /dev/dsp* because it might block operations (which is bad for a mixer). 2004-01-22 Thomas Vander Stichele * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), (deep_notify_callback), (gmi_set_decoder), (gmi_clear_decoder), (gmip_find_type_pre): * gst-libs/gst/media-info/media-info-priv.h: * gst-libs/gst/media-info/media-info.c: (gst_media_info_instance_init), (gst_media_info_read_idler): add fakesink to get caps on decoder src pad again fix callback prototype to match new have_type signal signature 2004-01-22 Thomas Vander Stichele * gst/adder/gstadder.c: (gst_adder_link): fix non-compile and cut-n-paste code 2004-01-21 David Schleef * ext/swfdec/gstswfdec.c: (gst_swfdec_video_getcaps), (gst_swfdec_video_link), (copy_image), (gst_swfdec_loop), (gst_swfdec_init), (gst_swfdec_change_state): * ext/swfdec/gstswfdec.h: Fix negotiation. * gst/adder/gstadder.c: (gst_adder_link), (gst_adder_init), (gst_adder_request_new_pad): Fix negotiation. * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_fixate): Add a fixate function. * gst/intfloat/gstfloat2int.c: * gst/intfloat/gstfloat2int.h: * gst/intfloat/gstint2float.c: * gst/intfloat/gstint2float.h: Completely rewrite the negotiation. Doesn't quite work yet, due to some buffer-frames problem. 2004-01-21 Thomas Vander Stichele * ext/gnomevfs/gstgnomevfssrc.c: * sys/v4l2/v4l2_calls.h: fix includes for distcheck 2004-01-21 Christian Schaller * ext/nas/ Add libnas (network audio system) plugin, patch from Arwed von Merkatz based on earlier patch from Laurent Vivier 2004-01-20 Jeremy Simon * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): Fix wma caps property * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): Fix typo (flags1 and flags2) 2004-01-20 Thomas Vander Stichele * gst-libs/gst/media-info/media-info-priv.c: (deep_notify_callback), (gmi_seek_to_track), (gmi_get_decoder), (gmip_find_type_pre), (gmip_find_type), (gmip_find_stream_post), (gmip_find_stream), (gmip_find_track_metadata), (gmip_find_track_streaminfo_post), (gmip_find_track_streaminfo), (gmip_find_track_format): * gst-libs/gst/media-info/media-info-priv.h: * gst-libs/gst/media-info/media-info-test.c: (main): * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), (gst_media_info_read_idler), (gst_media_info_read): * gst-libs/gst/media-info/media-info.h: register debugging category and use it for debugging 2004-01-20 Thomas Vander Stichele * ext/vorbis/vorbisfile.c: (gst_vorbisfile_update_streaminfo), (gst_vorbisfile_new_link): signal streaminfo through tags 2004-01-20 Ronald Bultje * ext/mplex/gstmplex.cc: * ext/mplex/gstmplexibitstream.cc: g++ doesn't like NULL in our i18n/error macros, should be either (NULL) or (""). 2004-01-20 Ronald Bultje * sys/dxr3/dxr3audiosink.c: * sys/dxr3/dxr3init.c: * sys/dxr3/dxr3spusink.c: (dxr3spusink_close): * sys/dxr3/dxr3videosink.c: (dxr3videosink_close): Fix more error error error errors (missing includes here). 2004-01-20 Ronald Bultje * ext/mpeg2enc/gstmpeg2encpicturereader.cc: fix thomas' error errors. 2004-01-20 Thomas Vander Stichele * ext/mpeg2enc/gstmpeg2enc.cc: fix error errors. 2004-01-20 Ronald Bultje * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): Fix for new error system. 2004-01-20 Thomas Vander Stichele * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): fix for new error reporting 2004-01-20 David Schleef * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), (gst_ximagesink_set_xwindow_id): Change to using a framerate of [1,100] instead of [0,MAX], since 0 isn't handled correctly, and neither is 100+, most likely. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), (gst_xvimagesink_getcaps): same 2004-01-19 Benjamin Otte * configure.ac: Up version requirement to 2.0.3 (not yet released) to avoid symbol clashes with ffmpeg. 2004-01-20 Julien MOUTTE * gst/switch/gstswitch.c: (gst_switch_request_new_pad), (gst_switch_init): Fixed switch element : proxying link and setting caps from src to sink on request. 2004-01-19 Thomas Vander Stichele * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), (gst_v4l2_set_window), (gst_v4l2_enable_overlay): fix element_error 2004-01-19 Thomas Vander Stichele * sys/v4l/v4l_calls.h: * sys/v4l2/v4l2_calls.h: element_error fixes 2004-01-19 Thomas Vander Stichele * gst-libs/gst/gst-i18n-plugin.h: add locale.h remove config.h inclusion 2004-01-19 Thomas Vander Stichele * autogen.sh: adding autopoint invocation * Makefile.am: * configure.ac: * gst-libs/gst/gettext.h: adding gettext bits * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): * ext/gnomevfs/gstgnomevfs.c: (plugin_init): * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_open_file): * ext/sndfile/gstsf.c: (gst_sf_loop), (plugin_init): * gst-libs/gst/gst-i18n-plugin.h: * gst/avi/gstavi.c: (plugin_init): * sys/dxr3/dxr3init.c: (plugin_init): * sys/dxr3/dxr3videosink.c: (dxr3videosink_write_data): * sys/oss/gstossaudio.c: (plugin_init): * sys/oss/gstosselement.c: (gst_osselement_open_audio): * sys/v4l/gstv4l.c: (plugin_init): * sys/v4l/v4l_calls.c: (gst_v4l_open): * sys/v4l2/gstv4l2.c: (plugin_init): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), (gst_v4l2_get_output), (gst_v4l2_set_output), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute): make sure locale and translation domain are set fix translated strings * po/.cvsignore: * po/LINGUAS: * po/Makevars: * po/POTFILES.in: * po/nl.po: put translation files into place * sys/xvideo/imagetest.c: (main): * ext/dv/demo-play.c: (main): fix unnecessary translations 2004-01-19 Thomas Vander Stichele * ext/sndfile/gstsf.c: * gst/avi/gstavimux.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/gnomevfs/gstgnomevfssink.c: * ext/gnomevfs/gstgnomevfssrc.c: * sys/oss/gstosselement.c: * sys/v4l/v4l_calls.h: fix i18n include 2004-01-19 Thomas Vander Stichele * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), (gst_v4l2_get_output), (gst_v4l2_set_output), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute): update to new error handling 2004-01-19 Thomas Vander Stichele * ext/sidplay/gstsiddec.cc: * gst/modplug/gstmodplug.cc: parenthese NULL because C++ seems angry about it 2004-01-19 Thomas Vander Stichele * gst-libs/gst/gst-i18n-plugin.h: add skeleton i18n stuff, but needs to be further implemented 2004-01-18 Thomas Vander Stichele * examples/gstplay/player.c: (main): * ext/aalib/gstaasink.c: (gst_aasink_open): * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): * ext/audiofile/gstafsink.c: (gst_afsink_open_file), (gst_afsink_close_file): * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), (gst_afsrc_close_file): * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): * ext/dv/gstdvdec.c: (gst_dvdec_loop): * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): * ext/esd/esdmon.c: (gst_esdmon_get): * ext/esd/esdsink.c: (gst_esdsink_chain): * ext/faac/gstfaac.c: (gst_faac_chain): * ext/faad/gstfaad.c: (gst_faad_chain): * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), (gst_flacdec_loop): * ext/flac/gstflacenc.c: (gst_flacenc_chain): * ext/flac/gstflactag.c: (gst_flac_tag_chain): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), (gst_gnomevfssrc_open_file): * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), (gst_id3_tag_do_typefind), (gst_id3_tag_chain): * ext/mad/gstmad.c: (gst_mad_chain): * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): * ext/mpeg2dec/gstmpeg2dec.c: * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mpeg2enc/gstmpeg2encpicturereader.cc: * ext/mplex/gstmplex.cc: * ext/mplex/gstmplexibitstream.cc: * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), (gst_ogg_demux_push), (gst_ogg_pad_push): * ext/raw1394/gstdv1394src.c: * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): * ext/sidplay/gstsiddec.cc: * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): * ext/speex/gstspeexenc.c: (gst_speexenc_chain): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): * gst-libs/gst/Makefile.am: * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), (gst_riff_read_element_data), (gst_riff_read_seek), (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): * gst/adder/gstadder.c: (gst_adder_parse_caps), (gst_adder_loop): * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): * gst/avi/gstavimux.c: (gst_avimux_stop_file): * gst/flx/gstflxdec.c: (gst_flxdec_loop): * gst/goom/gstgoom.c: (gst_goom_chain): * gst/id3/gstid3types.c: (gst_id3types_loop): * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_read_element_data), (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), (gst_ebml_read_float), (gst_ebml_read_header): * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_blockgroup): * gst/modplug/gstmodplug.cc: * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): * gst/oneton/gstoneton.c: (gst_oneton_chain): * gst/silence/gstsilence.c: (gst_silence_get): * gst/sine/gstsinesrc.c: (gst_sinesrc_get): * gst/smpte/gstsmpte.c: (gst_smpte_loop): * gst/speed/gstspeed.c: (speed_loop): * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): * gst/volenv/gstvolenv.c: (gst_volenv_chain): * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), (gst_wavparse_loop): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), (dxr3audiosink_close): * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), (dxr3videosink_close), (dxr3videosink_write_data): * sys/oss/gstosselement.c: (gst_osselement_open_audio): * sys/oss/gstosselement.h: * sys/oss/gstosssink.c: (gst_osssink_get_type), (gst_osssink_init), (gst_osssink_chain): * sys/oss/gstosssrc.c: (gst_osssrc_get): * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_window), (gst_v4l_enable_overlay): * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), (gst_v4l_set_chan_norm), (gst_v4l_get_signal), (gst_v4l_get_frequency), (gst_v4l_set_frequency), (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): * sys/v4l/v4l_calls.h: * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), (gst_v4lmjpegsink_playback_init), (gst_v4lmjpegsink_playback_start): * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_requeue_frame): * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop): * sys/vcd/vcdsrc.c: (vcdsrc_open_file): * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), (gst_ximagesink_chain): * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), (gst_xvideosink_xwindow_new): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_chain): use new error signal, function and categories 2004-01-18 Jeremy Simon * configure.ac: * ext/Makefile.am: * ext/musicbrainz/gsttrm.c: * ext/musicbrainz/gsttrm.h: * ext/musicbrainz/Makefile.am: Add a trm plugin 2004-01-18 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_set_property), (gst_ximagesink_get_property), (gst_ximagesink_class_init): Adding synchronous property for debugging. * sys/ximage/ximagesink.h: Adding the synchronous boolean flag. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_set_property): Moving a pointer declaration to a smaller block, fixing indent. 2004-01-16 David Schleef * gst/videofilter/gstvideobalance.c: Fix regression; changing a property affects the video stream. * sys/xvimage/xvimagesink.c: * sys/xvimage/xvimagesink.h: Add synchronous property for debugging. Should probably be disabled in non-CVS builds. Make sure that the Xv attribute exists before we set it (crash!). Fix a silly float bug that caused colorbalance to just not work. 2004-01-17 Christian Schaller * tools/gst-launch-ext.in - update for new plugins 2004-01-16 David Schleef * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Fix use of already-freed caps. 2994-01-16 Christian Schaller * Update spec for new colorspace plugin and libcaca plugin * Fix compilation of libcaca plugin (clock -> id) 2004-01-16 Julien MOUTTE * sys/xvimage/xvimagesink.c: (gst_xvimagesink_update_colorbalance), (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_colorbalance_set_value), (gst_xvimagesink_colorbalance_get_value), (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), (gst_xvimagesink_init), (gst_xvimagesink_class_init): Implementing correct colorbalance properties. They can now be set when the element is still in NULL state. The values will be committed to the Xv Port when xcontext is initialized. * sys/xvimage/xvimagesink.h: Added hue, saturation, contrast, brightness int values in the GstXvImagesink structure. 2004-01-16 Ronald Bultje * gst-libs/gst/Makefile.am: restructure so having local patches works easier. 2004-01-16 Ronald Bultje * ext/mpeg2enc/Makefile.am: * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mpeg2enc/gstmpeg2encpicturereader.cc: Bugfix with respect to EOS handling. 2004-01-16 Ronald Bultje * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Link with right caps (else, it segfaults). * ext/mplex/gstmplexjob.cc: Fix for slight API change in 1.6.1.93 release of mjpegtools. 2004-01-15 David Schleef * gst-libs/gst/audio/Makefile.am: Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c from the template. * gst-libs/gst/audio/gstaudiofilter.c: * gst-libs/gst/audio/gstaudiofilter.h: Add bytes_per_sample and size and n_samples calculation. * gst-libs/gst/audio/gstaudiofilterexample.c: Remove, now autogenerated. * gst-libs/gst/audio/gstaudiofiltertemplate.c: Moved from gstaudiofilterexample, object name changed, code added so that it actually works. * gst-libs/gst/audio/make_filter: Script to build an audiofilter subclass from the template. * gst/colorspace/Makefile.am: * gst/colorspace/yuv2yuv.c: Remove file, since it's GPL, and we don't use it. 2004-01-15 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_chain): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Making both of them use the buffer free function to test how the buffer was allocated. 2004-01-15 David Schleef * ext/esd/esdsink.c: (gst_esdsink_class_init): Remove property that handles osssink fallback. * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), (gst_audio_convert_getcaps): * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): Add audio/x-qdm2 for QDM2 audio. * gst/sine/gstsinesrc.c: (gst_sinesrc_get): * gst/sine/gstsinesrc.h: Add example of how to implement tags. * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): Decrease minimum size to 16x16. * gst/wavparse/gstwavparse.c: Convert disabled pad template caps to new caps. * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_chain): Throw element error when display cannot be opened. Increase minimum framerate to 1.0. Check the data free function on a buffer to make sure it is the type we expect before manipulating it. 2004-01-15 Julien MOUTTE * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), (gst_videobalance_colorbalance_set_value): Implement passthru if settings are in the middle. * tools/gst-launch-ext.in: Stop using xvideosink, use ximagesink. 2004-01-15 Ronald Bultje * gst/videofilter/Makefile.am: * gst/volume/Makefile.am: Since we use videofilter symbols, link to it. 2004-01-15 Julien MOUTTE * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init): Setting mixer interface type to HARDWARE. * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): Adding a default type to SOFTWARE. * gst-libs/gst/mixer/mixer.h: Adding mixer interface type and macro. * gst-libs/gst/mixer/mixertrack.h: Adding mixertrack flag SOFTWARE. * gst/volume/gstvolume.c: (gst_volume_interface_supported), (gst_volume_interface_init), (gst_volume_list_tracks), (gst_volume_set_volume), (gst_volume_get_volume), (gst_volume_set_mute), (gst_volume_mixer_init), (gst_volume_dispose), (gst_volume_get_type), (volume_class_init), (volume_init): Implementing mixer interface. * gst/volume/gstvolume.h: Adding tracklist for mixer interface. * sys/oss/gstosselement.c: (gst_osselement_get_type), (gst_osselement_change_state): Removing some trailing commas in structures. * sys/oss/gstossmixer.c: (gst_ossmixer_interface_init): Setting mixer interface type to HARDWARE. * sys/v4l/gstv4lcolorbalance.c: (gst_v4l_color_balance_interface_init): Setting colorbalance interface type to HARDWARE. * sys/v4l2/gstv4l2colorbalance.c: (gst_v4l2_color_balance_interface_init): Setting colorbalance interface type to HARDWARE. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): use exactly the same code than ximagesink for event handling. 2004-01-15 Ronald Bultje * ext/snapshot/Makefile.am: * ext/snapshot/gstsnapshot.c: (gst_snapshot_sinkconnect), (gst_snapshot_chain): * ext/snapshot/gstsnapshot.h: This has to be a joke... Snapshot should be connected to a tee, colorspace element before it and EOS after that, where the other src of the tee receives normal data. The current way is *wrong*. 2004-01-15 Ronald Bultje * ext/hermes/gsthermescolorspace.c: Fix another compile error. Same as below. 2004-01-15 Ronald Bultje * gst/colorspace/gstcolorspace.c: * gst/colorspace/yuv2yuv.c: (gst_colorspace_yuy2_to_i420), (gst_colorspace_i420_to_yv12): Fix compiling... Didn't test if it actually works. 2004-01-15 David Schleef * configure.ac: * gst/colorspace/Makefile.am: * gst/colorspace/gstcolorspace.c: * gst/colorspace/gstcolorspace.h: * gst/colorspace/yuv2rgb.c: * gst/colorspace/yuv2rgb.h: Duplicate the ext/hermes colorspace plugin, and remove Hermes code and GPL code. Fix for new caps negotiation. Rewrite much of the format handling code, and some of the conversion code. Basically, rewrote almost everything. This element handles I420, YV12 to RGB conversions. * ext/hermes/Makefile.am: * ext/hermes/gsthermescolorspace.c: Rename colorspace to hermescolorspace. Fix negotiation issues. Remove non-Hermes related code. This element handles lots of RGB to RGB conversions, but no YUV. * ext/hermes/gstcolorspace.c: * ext/hermes/gstcolorspace.h: * ext/hermes/rgb2yuv.c: * ext/hermes/yuv2rgb.c: * ext/hermes/yuv2rgb.h: * ext/hermes/yuv2rgb_mmx16.s: * ext/hermes/yuv2yuv.c: * ext/hermes/yuv2yuv.h: Remove old code. 2004-01-14 Colin Walters * ext/mad/gstid3tag.c (gst_id3_tag_chain): Don't nego caps if they've already been. 2004-01-15 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): assume tag mode when pad is not connected 2004-01-15 Benjamin Otte * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): Don't update the time of the clock (gst_alsa_sink_loop): sync to the clock given to alsasink, not the own clock * sys/oss/gstosssink.c: (gst_osssink_chain): sync to the clock (gst_osssink_change_state): activate the clock * sys/ximage/ximagesink.c: (gst_ximagesink_chain): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): remove bogus code that made DISCONT events unhandled * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): explicitly case to double in _set_simple. (fixes 2nd warning in bug #131502) * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_read_object_header), (gst_asf_demux_handle_sink_event), (gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream), (gst_asf_demux_video_caps): convert g_warning because of wrong asf data to GST_WARNINGs (fixes 2nd warning in bug #131502) 2004-01-14 Julien MOUTTE * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), (gst_videobalance_colorbalance_set_value), (gst_videobalance_colorbalance_get_value): Fixing videobalance ranges for colorbalance interface implementation. * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), (gst_ximagesink_set_property), (gst_ximagesink_get_property), (gst_ximagesink_dispose), (gst_ximagesink_init), (gst_ximagesink_class_init): Adding DISPLAY property. * sys/ximage/ximagesink.h: Adding display_name to store display. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), (gst_xvimagesink_dispose), (gst_xvimagesink_init), (gst_xvimagesink_class_init): Adding DISPLAY property and colorbalance properties (they still need polishing though for gst-launch use : no xcontext yet, i ll do that tomorrow). * sys/xvimage/xvimagesink.h: Adding display_name to store display. 2004-01-14 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), (gst_play_set_location), (gst_play_set_visualization): Preparing switch integration, adding videobalance in the pipeline. 2004-01-14 Julien MOUTTE * gst-libs/gst/colorbalance/colorbalance.c: (gst_color_balance_class_init): Adding a default type. * gst-libs/gst/colorbalance/colorbalance.h: Adding a macro to access the type. * gst/videofilter/gstvideobalance.c: (gst_videobalance_get_type), (gst_videobalance_dispose), (gst_videobalance_class_init), (gst_videobalance_init), (gst_videobalance_interface_supported), (gst_videobalance_interface_init), (gst_videobalance_colorbalance_list_channels), (gst_videobalance_colorbalance_set_value), (gst_videobalance_colorbalance_get_value), (gst_videobalance_colorbalance_init): Implementing colorbalance interface. * gst/videofilter/gstvideobalance.h: Adding colorbalance channels list. * sys/ximage/ximagesink.c: (gst_ximagesink_set_xwindow_id): Fixing a bug which was triggering a BadAccess X error when setting an overlay before pad was really negotiated. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_colorbalance_init): Using the colorbalance type macro. 2004-01-14 Benjamin Otte * ext/flac/gstflacenc.c: (gst_flacenc_set_metadata), (gst_flacenc_chain): handle tags correctly * gst/tags/gstid3tag.c: (gst_tag_list_new_from_id3v1): extract ID3v1 tags correctly 2004-01-14 Ronald Bultje * gst/typefind/gsttypefindfunctions.c: (matroska_type_find), (plugin_init): Improve matroska typefinding for odd-typed headers... 2004-01-14 Ronald Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): Fix for using incremental number on padnames. 2004-01-14 Ronald Bultje * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: Set category to divx4linux instead of divx (too generic). * gst/wavparse/gstwavparse.c: (gst_wavparse_init), (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), (gst_wavparse_loop), (gst_wavparse_change_state): * gst/wavparse/gstwavparse.h: fix parsing of WAV files with non-standard fmt-tag size and fix skipping of unrecognized chunks... Someone please fix this thing to use rifflib so all this is automated. * sys/v4l/Makefile.am: * sys/v4l2/Makefile.am: Add X_CFLAGS because we depend on X (for overlay). 2004-01-14 Jan Schmidt * ext/mpeg2dec/gstmpeg2dec.c: Don't issue a timestamp unless we tagged the frame with a PTS. 2004-01-14 Benjamin Otte * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback): Query the audio element to get the time, not the clock. We're interested in the element's time here. 2004-01-14 Benjamin Otte * ext/aalib/gstaasink.c: (gst_aasink_chain): * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): * ext/esd/esdsink.c: (gst_esdsink_chain): * ext/libcaca/gstcacasink.c: (gst_cacasink_chain): * ext/mas/massink.c: (gst_massink_chain): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_chain): * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_metadata): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop), (gst_mpeg_parse_release_locks): * gst/tcp/gsttcpsink.c: (gst_tcpsink_chain): * gst/udp/gstudpsink.c: (gst_udpsink_chain): * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), (gst_osssink_change_state): * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): * sys/ximage/ximagesink.c: (gst_ximagesink_chain): * sys/xvideo/xvideosink.c: (gst_xvideosink_chain), (gst_xvideosink_release_locks): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): use element time. * ext/alsa/gstalsaclock.c: (gst_alsa_clock_start), (gst_alsa_clock_stop): * gst-libs/gst/audio/audioclock.c: (gst_audio_clock_set_active), (gst_audio_clock_get_internal_time): simplify for use with new clocking code. * testsuite/alsa/Makefile.am: * testsuite/alsa/sinesrc.c: (sinesrc_init), (sinesrc_force_caps): fix testsuite for new caps system 2004-01-14 Benjamin Otte * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): * ext/flac/gstflacenc.c: (add_one_tag): length is already host endian, no need to convert. Fixes playback of tagged files on PPC. (bug #128384) 2004-01-13 Julien MOUTTE * gst-libs/gst/colorbalance/colorbalance.h: Adding a type to the colorbalance interface stating if it is hardware based or software based. * gst/videofilter/gstvideobalance.c: (gst_videobalance_planar411): Removing a trailing comma. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_colorbalance_init): Integrating a patch from Jon Trowbridge querying Xv adaptor for min/max value as the documentation seems to be wrong on the -1000 to 1000 interval. 2004-01-12 David Schleef * gst/debug/efence.c: (gst_efence_init), (gst_efence_chain), (gst_efence_buffer_alloc), (gst_fenced_buffer_new), (gst_fenced_buffer_default_free), (gst_fenced_buffer_default_copy): Fix negotiation. Add a bufferalloc function for the sink pad, and generally clean up some of the code. 2004-01-12 Julien MOUTTE * gst-libs/gst/colorbalance/colorbalancechannel.c: (gst_color_balance_channel_dispose): Adding safety check in dispose method. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_interface_supported), (gst_xvimagesink_colorbalance_list_channels), (gst_xvimagesink_colorbalance_set_value), (gst_xvimagesink_colorbalance_get_value), (gst_xvimagesink_colorbalance_init), (gst_xvimagesink_get_type): Adding colorbalance interface support to set XV parameters such as HUE, BRIGHTNESS, CONTRAST, SATURATION. * sys/xvimage/xvimagesink.h: Adding the channels list for colorbalance interface. 2004-01-12 Thomas Vander Stichele * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_get_type), (gst_audio_convert_class_init), (gst_audioconvert_getcaps), (gst_audio_convert_init), (gst_audio_convert_set_property), (gst_audio_convert_get_property), (gst_audio_convert_chain), (gst_audio_convert_link), (gst_audio_convert_buffer_to_default_format), (gst_audio_convert_buffer_from_default_format), (plugin_init): - implement _getcaps and use it - improve linking - remove float caps since no float conversion is actually done - remove properties and arguments that were to be used for rate conversion 2004-01-12 Thomas Vander Stichele * gst-libs/gst/audio/audio.c: (_gst_audio_structure_set_list), (gst_audio_structure_set_int): * gst-libs/gst/audio/audio.h: add helper functions for _getcaps matching the standard audio templates 2004-01-12 David Schleef * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): Test that pad is negotiated before getting its caps. 2004-01-12 Julien MOUTTE * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): When analyzing the pads of an element the bin is mostly in READY state so no caps were negotiated. This helper function needs to work with _get_caps directly then. I was not freeing them though, added that to fix the mem leak. 2004-01-12 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_chain): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Fixing the direct put buffers detection. I prefer checking GST_BUFFER_PRIVATE than the free_func. 2004-01-12 Thomas Vander Stichele * sys/oss/gstossaudio.c: (plugin_init): * sys/oss/gstosselement.c: (gst_osselement_sync_parms): * sys/oss/gstosselement.h: make an oss debugging category make failure more descriptive 2004-01-11 David Schleef * ext/ffmpeg/gstffmpeg.c: * ext/ffmpeg/gstffmpegcodecmap.c: * ext/ffmpeg/gstffmpegdec.c: * ext/ffmpeg/gstffmpegenc.c: * ext/ffmpeg/gstffmpegprotocol.c: * ext/gdk_pixbuf/gstgdkanimation.c: * ext/jpeg/gstjpeg.c: * ext/libpng/gstpng.c: * ext/mpeg2dec/perftest.c: * ext/speex/gstspeex.c: * gst-libs/gst/resample/dtos.c: * gst/intfloat/gstintfloatconvert.c: * gst/oneton/gstoneton.c: * gst/rtjpeg/RTjpeg.c: * gst/rtp/gstrtp.c: * sys/dxr3/dxr3init.c: * sys/glsink/gstgl_nvimage.c: * sys/glsink/gstgl_pdrimage.c: * sys/glsink/gstglsink.c: * testsuite/gst-lint: Make sure everybody wraps #include "config.h" in #ifdef HAVE_CONFIG_H 2004-01-11 David Schleef * ext/alsa/gstalsasrc.c: (gst_alsa_src_set_caps): * ext/faac/gstfaac.c: (gst_faac_sinkconnect): * ext/gdk_pixbuf/gstgdkanimation.c: (gst_gdk_animation_iter_create_pixbuf): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), (gst_gdk_pixbuf_chain): * ext/gdk_pixbuf/gstgdkpixbuf.h: * ext/jack/gstjack.c: (gst_jack_change_state): * ext/xvid/gstxviddec.c: (gst_xviddec_sink_link): * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): * gst-libs/gst/play/play.c: (gst_play_get_sink_element): * gst/videofilter/gstvideofilter.c: (gst_videofilter_set_output_size): Remove all usage of gst_pad_get_caps(), and replace it with gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). 2004-01-11 David Schleef * configure.ac: * ext/Makefile.am: Fixes to make ext/libcaca compile. * ext/divx/gstdivxdec.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_chain): Make gdkpixbufdec handle images that span multiple buffers. Now work with both filesrc ! gdkpixbufdec and qtdemux ! gdkpixbufdec. * ext/gdk_pixbuf/gstgdkpixbuf.h: * ext/libcaca/gstcacasink.h: Fixes needed due to recent video/video.h changes * ext/xvid/gstxvid.c: (gst_xvid_csp_to_caps): same * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), (gst_v4lmjpegsrc_buffer_free): Use buffer free function instead of GstData free function. * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): same. 2004-01-12 Benjamin Otte * sys/v4l2/gstv4l2element.c: (gst_v4l2element_class_init), (gst_v4l2element_dispose), (gst_v4l2element_set_property), (gst_v4l2element_get_property): * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults), (gst_v4l2_open): add norm, channel and frequency properties. * sys/v4l2/gstv4l2tuner.c: fixes for tuner interface changes * sys/v4l2/gstv4l2element.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: rework v4l2src to work with saa1734 cards and allow mmaped buffers. 2004-01-12 Benjamin Otte * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init), (gst_tuner_find_norm_by_name), (gst_v4l2_find_channel_by_name), (gst_tuner_channel_changed), (gst_tuner_norm_changed), (gst_tuner_frequency_changed), (gst_tuner_signal_changed): * gst-libs/gst/tuner/tuner.h: GObjects aren't const. Add find_by_name functions. Add checks to _changed functions. * sys/v4l/gstv4ltuner.c: (gst_v4l_tuner_get_channel), (gst_v4l_tuner_get_norm): Fixes for above. 2004-01-12 Benjamin Otte * gst-libs/gst/video/video.h: Fix caps template names to be understandable. Prefix everything with GST_VIDEO. * ext/aalib/gstaasink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/hermes/gstcolorspace.c: (gst_colorspace_base_init): * ext/jpeg/gstjpegdec.c: (raw_caps_factory): * ext/jpeg/gstjpegenc.c: (raw_caps_factory): * ext/libcaca/gstcacasink.c: * ext/libpng/gstpngenc.c: (raw_caps_factory): * ext/snapshot/gstsnapshot.c: * ext/swfdec/gstswfdec.c: * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/chart/gstchart.c: * gst/deinterlace/gstdeinterlace.c: * gst/effectv/gsteffectv.c: * gst/flx/gstflxdec.c: (gst_flxdec_loop): * gst/goom/gstgoom.c: * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), (gst_monoscope_srcconnect), (gst_monoscope_chain): * gst/overlay/gstoverlay.c: * gst/smooth/gstsmooth.c: * gst/smpte/gstsmpte.c: * gst/synaesthesia/gstsynaesthesia.c: * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/y4m/gsty4mencode.c: * sys/qcam/gstqcamsrc.c: * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps): Make them work with new video.h file. * sys/ximage/ximagesink.c: (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): Make it work with new buffer allocation system. 2004-01-11 Julien MOUTTE * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Fixing the pad_alloc_buffer implementation to use ->srcpad * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): Fixing the pad_alloc_buffer implementation to use ->srcpad * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Fixing the pad_alloc_buffer implementation to use ->srcpad * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep a reference to everything we need. * sys/ximage/ximagesink.h: adding a reference to the sink in the image. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep a reference to everything we need. * sys/xvimage/xvimagesink.h: adding a reference to the sink in the image 2004-01-11 David Schleef * ext/divx/gstdivxenc.c: remove bogus gst_caps_is_fixed() test * gst/debug/efence.c: (gst_efence_chain), (gst_fenced_buffer_new), (gst_fenced_buffer_default_copy): Fix for rename of buffer private structure members. * gst/effectv/gstwarp.c: (gst_warptv_setup): Don't reset the time value during a resize/renegotiation. * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): use gst_pad_alloc_buffer(); * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), (gst_v4lmjpegsrc_buffer_free): Fix for rename of buffer private structure members. * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): Fix for rename of buffer private structure members. * sys/ximage/ximagesink.c: (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): Fix for rename of buffer private structure members. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): Fix for rename of buffer private structure members. 2004-01-11 Arwed v. Merkatz reviewed by: David Schleef * gst/videofilter/Makefile.am: * gst/videofilter/gstgamma.c: Gamma correction filter. Modified from the patch by ds to fit in with recent make_filter changes. 2004-01-11 Julien MOUTTE * configure.ac: Adding examples/switch/Makefile * examples/Makefile.am: Adding examples/switch * examples/switch/Makefile.am: Adding switcher example. * examples/switch/switcher.c: (got_eos), (idle_iterate), (switch_timer), (main): Adding an example demonstrating switch usage with 2 videotestsrc showing different patterns. * gst/switch/gstswitch.c: (gst_switch_request_new_pad), (gst_switch_init): Fixing switch with the new caps system. 2004-01-11 Benjamin Otte * gst-libs/gst/video/video.h: Fix 32bit caps. Issue remaining: The macro names are chosen poorly. They should probably be like GST_VIDEO_PAD_TEMPLATE_CAPS_{RGB,BGR,RGBx,BGRx}. 2004-01-11 Benjamin Otte * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse_trak): fix audio chunk size/timestamp calculation 2004-01-11 Benjamin Otte * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): fix SVQ3 caps 2004-01-11 Steve Baker * gst/effectv/gstaging.c: (gst_agingtv_get_type), (gst_agingtv_base_init), (gst_agingtv_class_init), (gst_agingtv_init), (gst_agingtv_setup), (gst_agingtv_rgb32), (gst_agingtv_set_property), (gst_agingtv_get_property): Port agingTV to videofilter 2004-01-09 Julien MOUTTE * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): Implementing gst_pad_alloc_buffer to use optimized buffer allocation. 2004-01-09 Julien MOUTTE * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Implementing gst_pad_alloc_buffer to use optimized buffer allocation. * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_got_desired_size): Updating doc for the xid being 0. * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Implementing gst_pad_alloc_buffer to use optimized buffer allocation. * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): Implementing gst_pad_alloc_buffer to use optimized buffer allocation. * sys/ximage/ximagesink.c: (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): Implementing the bufferalloc_function to replace bufferpools, fixing the XOverlay interface implementation to handle xid being 0 and fix some bugs triggered by Benjamin's testcase. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): Implementing the bufferalloc_function to replace bufferpools, fixing the XOverlay interface implementation to handle xid being 0 and fix some bugs triggered by Benjamin's testcase. 2004-01-09 David Schleef * ext/librfb/gstrfbsrc.c: Hacking. Added actual decoding and mouse pointer events. It works. 2004-01-09 Ronald Bultje * ext/divx/gstdivxenc.c: (gst_divxenc_init): Use explicit caps - fix capsnego. * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: Remove macro-inside-macro which caused compile errors. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_header): Error out if it's not a RIFF file. Else we error out without gst_element_error() which is not good... 2004-01-08 David Schleef * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Fix pad_link function to handle formats that ffmpeg returns as multiple caps structures. * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): Only complain if source buffer is _smaller_ than expected. * gst/videoscale/gstvideoscale.c: (gst_videoscale_init), (gst_videoscale_handle_src_event): Resize navigation events when passing them upstream. * gst/videotestsrc/gstvideotestsrc.c: * gst/videotestsrc/gstvideotestsrc.h: * gst/videotestsrc/videotestsrc.c: * gst/videotestsrc/videotestsrc.h: Rewrite many of the buffer painting functions to handle odd sizes (for many formats, size%4!=0 or size%8!=0). Most have been verified to work with my video card. * testsuite/gst-lint: Add check for elements calling gst_pad_get_caps() instead of gst_pad_get_allowed_caps(). 2004-01-08 David Schleef * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), (gst_videodrop_link), (gst_videodrop_init): Fix negotiation. 2004-01-08 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): A configure event is not emiting the desired size signal. That fixes aspect ratio issues with gst-player. 2004-01-08 Ronald Bultje * gst/median/gstmedian.c: (gst_median_link), (gst_median_init): Fix capsnego. 2004-01-08 Julien MOUTTE * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): Using XOverlay public method to fire size signal. 2004-01-07 Julien MOUTTE * examples/gstplay/Makefile.am: Adding the interface library. * gst-libs/gst/play/Makefile.am: Adding the interface library. * gst-libs/gst/play/gstplay.c: (gst_play_set_video_sink): Connecting to the XOverlay size signal instead of GstVideoSink. * gst-libs/gst/play/gstplay.h: Including the XOverlay interface to check GST_IS_X_OVERLAY before signal connect. * gst-libs/gst/video/gstvideosink.c: (gst_videosink_class_init): Removing the have_video_size signal. * gst-libs/gst/video/gstvideosink.h: Removing the have_video_size signal and associated public method. * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), (gst_ximagesink_sinkconnect): Using XOverlay public method to fire size signal. * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), (gst_xvideosink_xwindow_new): Using XOverlay public method to fire size signal. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sinkconnect): Using XOverlay public method to fire size signal. 2004-01-07 David Schleef * gst/videofilter/Makefile.am: * gst/videofilter/gstvideotemplate.c: * gst/videofilter/make_filter: Create gstvideoexample.c in a srcdir!=builddir friendly way. Convert make_filter to /bin/sh script. 2004-01-07 Thomas Vander Stichele * gst/modplug/gstmodplug.cc: fix element description 2004-01-07 Julien MOUTTE * examples/gstplay/player.c: (got_time_tick), (got_stream_length), (got_video_size): Adding some new lines in g_print calls. * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy), (gst_ximagesink_xwindow_resize), (gst_ximagesink_handle_xevents), (gst_ximagesink_fixate), (gst_ximagesink_sinkconnect), (gst_ximagesink_change_state), (gst_ximagesink_chain), (gst_ximagesink_buffer_new), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_get_desired_size): Complete code review, reverting some stuff i disagree with, adding some fixes : time synchronization on invalid timestamps, renegotiation of private window. * sys/ximage/ximagesink.h: * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_destroy), (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_handle_xevents), (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get), (gst_xvimagesink_fixate), (gst_xvimagesink_sinkconnect), (gst_xvimagesink_change_state), (gst_xvimagesink_chain), (gst_xvimagesink_buffer_new), (gst_xvimagesink_navigation_send_event), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_get_desired_size), (gst_xvimagesink_xoverlay_init): Complete code review, reverting some stuff i disagree with, adding some fixes : Renegotiation of private window, implementing get_desired_size. 2004-01-07 Ronald Bultje * ext/audiofile/gstafsink.c: (gst_afsink_init), (gst_afsink_chain), (gst_afsink_handle_event): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init): * gst/avi/gstavimux.c: (gst_avimux_request_new_pad): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init): * sys/dxr3/dxr3spusink.c: (dxr3spusink_init): * sys/dxr3/dxr3videosink.c: (dxr3videosink_init): Fix for instantiate-test (see core). Also remove dead code from jpegenc (which still needs fixing, but that's lower on my TODO list...). * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): Never return NULL as caps. 2004-01-07 David Schleef * configure.ac: * ext/Makefile.am: * ext/librfb/Makefile.am: * ext/librfb/gstrfbsrc.c: New source plugin based on librfb-0.1. RFB (remote framebuffer) is the protocol used by VNC. 2004-01-07 David Schleef * gst/videofilter/gstvideotemplate.c: * gst/videofilter/gstvideotemplate.h: * gst/videofilter/make_filter: Merge videotemplate header into source file. * gst/effectv/Makefile.am: * gst/effectv/gsteffectv.c: (plugin_init): * gst/effectv/gstwarp.c: Make warpTV a subclass of videofilter. 2004-01-07 Benjamin Otte * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): Add guard against invalid utf-8 conversions in mad. Just in case. 2004-01-07 Benjamin Otte * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): Fix for bug shown by poisoning 2004-01-06 Ronald Bultje * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), (gst_v4lmjpegsrc_buffer_free): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps), (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): Fix for removed bufferpools. 2004-01-07 Jan Schmidt * ext/dv/gstdvdec.c: (gst_dvdec_loop): Fix caps negotiation. * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), (dvdnavsrc_update_buttoninfo), (dvdnavsrc_get), (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), (dvdnavsrc_event): * ext/mpeg2dec/gstmpeg2dec.c: * gst-libs/gst/navigation/navigation.c: (gst_navigation_send_key_event), (gst_navigation_send_mouse_event): * gst-libs/gst/navigation/navigation.h: * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_handle_src_event): * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): Super-simple first version of mouse and keyboard events. Clicking on a DVD menu now works, although it may not take you where you expected. * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_src_fixate): These fixate functions were broken - they never actually fixated :) 2004-01-06 Ronald Bultje * ext/shout/gstshout.c: (gst_icecastsend_base_init), (gst_icecastsend_init): fix for new caps system. * gst-libs/gst/mixer/mixertrack.h: * sys/oss/gstossmixer.c: (gst_ossmixer_build_list): Add 'master track' flag (for tools like ACME that only want to change the main volume). 2004-01-07 Jan Schmidt * ext/xvid/gstxvid.c: (gst_xvid_structure_to_csp), (gst_xvid_csp_to_caps): * ext/xvid/gstxviddec.c: (gst_xviddec_src_getcaps): * ext/xvid/gstxvidenc.c: ifdef out ARGB type when it isn't available in xvidcore 1.0.0beta2 2004-01-06 Ronald Bultje * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): When we have received a new SCR right in the first buffer after a seek (so in the same cycle that handles the discont), we should handle the buffer instead of unreffing it, else we lose data. 2004-01-06 Iain * gst/intfloat/gstint2float.c (gst_int2float_link): Set the buffer-frames caps too. * gst/oneton/gstoneton.c (gst_oneton_sink_connect): Only create the new caps that we need, don't destroy them all and rebuild them. And when creating src pads, use the src pad template rather than the sink... 2004-01-05 Ronald Bultje * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): Add pad to element *after* setting functions such as event handler. Without this, the scheduler (opt) will link pads, set the event handler from the default event function (dispatcher in gstpad.c) and *after* that, we will set our own event function, which will thus never be used (and thus mpegdemux doesn't handle events). 2004-01-04 David Schleef Fix the fixate functions to handle new prototype: * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_src_fixate): * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): * sys/ximage/ximagesink.c: (gst_ximagesink_fixate): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate): 2004-01-04 Benjamin Otte * sys/ximage/ximagesink.h: * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy), (gst_ximagesink_sinkconnect), (gst_ximagesink_change_state), (gst_ximagesink_set_xwindow_id), (gst_ximagesink_xoverlay_init): assorted fixes to make (re)embedding work * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect), (gst_ximagesink_get_desired_size): implement desired size additions to XOverlay 2004-01-04 Benjamin Otte * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init), (gst_x_overlay_got_xwindow_id), (gst_x_overlay_get_desired_size), (gst_x_overlay_got_desired_size): * gst-libs/gst/xoverlay/xoverlay.h: Add optional "desired size" signal and querying. 2004-01-04 Ronald Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup): Fix EBML-laced block parsing. Diffs are relative to previous lace, not the first lace. Thanks to Mosu from the Matroska team for detecting this. * gst/wavparse/gstwavparse.c: (gst_wavparse_init), (gst_wavparse_parse_fmt), (gst_wavparse_getcaps), (gst_wavparse_handle_sink_event), (gst_wavparse_loop), (gst_wavparse_change_state): * gst/wavparse/gstwavparse.h: Quickfix for capsnego. 2004-01-04 Ronald Bultje * gst/wavenc/gstwavenc.c: (set_property), (gst_wavenc_init): Fix indenting, fix pad creation. 2004-01-04 Ronald Bultje * ext/xvid/gstxviddec.c: (gst_xviddec_init), (gst_xviddec_src_getcaps), (gst_xviddec_src_link), (gst_xviddec_sink_link): Implement src_getcaps() so proper size caps is negotiated. 2004-01-04 Ronald Bultje * ext/flac/gstflacdec.c: (gst_flacdec_loop): Finish flac decoder on EOS. See #116178. 2004-01-04 Ronald Bultje * gst/matroska/matroska-demux.c: (gst_matroska_demux_src_getcaps), (gst_matroska_demux_add_stream): * gst/matroska/matroska-ids.h: Add getcaps() function to fix capsnego... 2004-01-04 Ronald Bultje * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): Fix more integer overflows. Again, see #126967. 2004-01-03 Ronald Bultje * ext/mpeg2dec/gstmpeg2dec.c: Add support for mpeg2dec-0.4.0 (released two weeks ago). See #130416. 2004-01-03 Ronald Bultje * configure.ac: * ext/xvid/gstxvid.c: (gst_xvid_init), (gst_xvid_error), (gst_xvid_structure_to_csp), (gst_xvid_csp_to_caps): * ext/xvid/gstxvid.h: * ext/xvid/gstxviddec.c: (gst_xviddec_class_init), (gst_xviddec_init), (gst_xviddec_setup), (gst_xviddec_chain), (gst_xviddec_src_link), (gst_xviddec_sink_link), (gst_xviddec_change_state): * ext/xvid/gstxviddec.h: * ext/xvid/gstxvidenc.c: (gst_xvidenc_profile_get_type), (gst_xvidenc_base_init), (gst_xvidenc_class_init), (gst_xvidenc_init), (gst_xvidenc_setup), (gst_xvidenc_chain), (gst_xvidenc_link), (gst_xvidenc_set_property), (gst_xvidenc_get_property), (gst_xvidenc_change_state): * ext/xvid/gstxvidenc.h: Update xvid plugin to latest xvid (1.0.0-beta3) API. 2004-01-03 Ronald Bultje * gst/rtp/rtp-packet.c: Add sys/types.h include, since OS X doesn't define in_addr_t in netinet/in.h, like it does on Linux (see #129600). 2004-01-03 Thomas Canty reviewed by: Ronald Bultje * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_dispose): Correct logic of dispose function (see #129306). 2004-01-03 Ronald Bultje * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_pes): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), (gst_mpeg_parse_init): * gst/mpegstream/gstmpegparse.h: Remove clock (which was never provided, i.e. dead code), and also fix integer overflows at high PTS values (see #126967). 2004-01-03 Ronald Bultje * ext/flac/gstflacdec.c: * ext/libpng/gstpngenc.h: * ext/mikmod/gstmikmod.h: OS X fixes (see #126628). 2004-01-02 David Schleef * ext/alsa/gstalsasrc.c: (gst_alsa_src_pad_factory), (gst_alsa_src_base_init): Remove bogus "src" request pad. * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_base_init), (gst_mpeg_parse_class_init): Move pad template registration to class_init, since the derived class (mpegdemux) doesn't want them. 2004-01-03 Ronald Bultje * sys/ximage/Makefile.am: * sys/xvideo/Makefile.am: * sys/xvimage/Makefile.am: Move interface libs from LDFLAGS to LIBADD, fix relocation errors after installation (see #127664). 2004-01-02 David Schleef * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_init), (gst_ffmpegenc_connect): Negotiation fixes. * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): Remove inappropriate gst_caps_free(). * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): Reenable Ronald's internal resize code, since the core handles it correctly now. 2004-01-02 Ronald Bultje * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_init): * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init), (gst_v4lsrc_init): Fix pad template stuff. 2004-01-02 Ronald Bultje * gst/matroska/ebml-read.c: (gst_ebml_read_sint): * gst/matroska/ebml-write.c: (gst_ebml_write_sint): fix signed integer reading/writing. 2004-01-02 Benjamin Otte * ext/alsa/README: Remove outdated document 2004-01-03 Jan Schmidt * gst/cutter/gstcutter.c: (gst_cutter_init): src pad was being created twice - oops. 2004-01-02 Ronald Bultje * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): Comment out internal resize. It doesn't handle the resulting XEvent internally, does another try_set_caps() which leads to a really nice loop. Real fix will come when Julien and Dave are awake. ;). 2004-01-02 Ronald Bultje * ext/mpeg2enc/gstmpeg2enc.cc: fix const/nonconst compile issue. 2004-01-02 David Schleef * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate), (gst_xvimagesink_sinkconnect), (gst_xvimagesink_init): Add fixate function and a check for bad formats. 2004-01-01 David Schleef Negotiation fixes: * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link), (gst_audiofilter_init): * gst/debug/efence.c: (gst_efence_init): * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), (gst_deinterlace_init): * gst/volume/gstvolume.c: (volume_connect): 2004-01-01 David Schleef Convert elements to use gst_pad_use_explicit_caps() where appropriate: * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_reneg): * ext/audiofile/gstafparse.c: (gst_afparse_init), (gst_afparse_open_file): * ext/audiofile/gstafsrc.c: (gst_afsrc_init), (gst_afsrc_open_file): * ext/esd/esdmon.c: (gst_esdmon_init), (gst_esdmon_get): * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_init), (gst_ffmpegdec_chain): * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): * ext/flac/gstflacdec.c: (gst_flacdec_init), (gst_flacdec_write): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_chain): * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init), (gst_jpegdec_link), (gst_jpegdec_chain): * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_negotiate): * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), (gst_mpeg2dec_negotiate_format): * ext/mpeg2enc/gstmpeg2enc.cc: * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): * ext/speex/gstspeexdec.c: (gst_speexdec_init), (gst_speexdec_sinkconnect): * ext/swfdec/gstswfdec.c: (gst_swfdec_loop), (gst_swfdec_init): * ext/vorbis/vorbisfile.c: (gst_vorbisfile_init), (gst_vorbisfile_new_link): * gst/ac3parse/gstac3parse.c: (gst_ac3parse_init), (gst_ac3parse_chain): * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_audio_stream), (gst_asf_demux_setup_pad): * gst/auparse/gstauparse.c: (gst_auparse_init), (gst_auparse_chain): * gst/id3/gstid3types.c: (gst_id3types_loop): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), (mp1videoparse_parse_seq): * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_init), (bpf_from_header): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_lpcm_set_caps): * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), (gst_mpeg_parse_send_data): * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream): * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): * gst/wavparse/gstwavparse.c: (gst_wavparse_init), (gst_wavparse_parse_fmt): 2004-01-01 Ronald Bultje * configure.ac: Fix configure check for mpeg2enc. We need 1.6.1.93 instead of 1.6.1.92, since the pkg-config file of 1.6.1.92 is borked and it therefore uses the wrong include paths. Too bad... Note that 1.6.1.93 is not release yet. ;). Also add a check for mplex, which is now using the lib'ified mplex from mjpegtools, too. * ext/ffmpeg/gstffmpegcodecmap.c: Add codec_tag for 3ivx/xvid. For xvid, this should fix playback issues. I don't think ffmpeg handles 3ivx correctly, so this probably won't work. But it won't hurt either. * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_connect), (gst_ffmpegdec_chain): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect), (gst_ffmpegenc_chain_audio): Fix memleak in audio encoding. Close codec if open fails, this calls the cleanup routines so we can re-use the context. * ext/mpeg2enc/gstmpeg2enc.cc: Fix pad template names/types, fix memory issue with getcaps(). * ext/mpeg2enc/gstmpeg2encoder.cc: * ext/mpeg2enc/gstmpeg2encoder.hh: Fix compile issue with new caps system (const thingy). * ext/mpeg2enc/gstmpeg2encpicturereader.cc: * ext/mpeg2enc/gstmpeg2encpicturereader.hh: We read a first frame right on initing, so that we have a caps when we init the output. This caps is cached in padprivate and read as first frame. * ext/mplex/Makefile.am: * ext/mplex/gstmplex.cc: * ext/mplex/gstmplex.h: * ext/mplex/gstmplex.hh: * ext/mplex/gstmplexibitstream.cc: * ext/mplex/gstmplexibitstream.hh: * ext/mplex/gstmplexjob.cc: * ext/mplex/gstmplexjob.hh: * ext/mplex/gstmplexoutputstream.cc: * ext/mplex/gstmplexoutputstream.hh: We wrap mjpegtools mplex. So I rewrote the plugin. The old plugin had issues, didn't do capsnego, supported only a subset of the mplex features and required a mplex fork in our local CVS. Plus that it worked agaist a very old mplex version. Rewriting was faster than updating it. * gst-libs/ext/Makefile.am: * gst-libs/ext/mplex/INSTRUCT: * gst-libs/ext/mplex/Makefile.am: * gst-libs/ext/mplex/README: * gst-libs/ext/mplex/TODO: * gst-libs/ext/mplex/ac3strm_in.cc: * gst-libs/ext/mplex/audiostrm.hh: * gst-libs/ext/mplex/audiostrm_out.cc: * gst-libs/ext/mplex/aunit.hh: * gst-libs/ext/mplex/bits.cc: * gst-libs/ext/mplex/bits.hh: * gst-libs/ext/mplex/buffer.cc: * gst-libs/ext/mplex/buffer.hh: * gst-libs/ext/mplex/fastintfns.h: * gst-libs/ext/mplex/format_codes.h: * gst-libs/ext/mplex/inputstrm.cc: * gst-libs/ext/mplex/inputstrm.hh: * gst-libs/ext/mplex/lpcmstrm_in.cc: * gst-libs/ext/mplex/mjpeg_logging.cc: * gst-libs/ext/mplex/mjpeg_logging.h: * gst-libs/ext/mplex/mjpeg_types.h: * gst-libs/ext/mplex/mpastrm_in.cc: * gst-libs/ext/mplex/mpegconsts.cc: * gst-libs/ext/mplex/mpegconsts.h: * gst-libs/ext/mplex/mplexconsts.hh: * gst-libs/ext/mplex/multplex.cc: * gst-libs/ext/mplex/outputstream.hh: * gst-libs/ext/mplex/padstrm.cc: * gst-libs/ext/mplex/padstrm.hh: * gst-libs/ext/mplex/stillsstream.cc: * gst-libs/ext/mplex/stillsstream.hh: * gst-libs/ext/mplex/systems.cc: * gst-libs/ext/mplex/systems.hh: * gst-libs/ext/mplex/vector.cc: * gst-libs/ext/mplex/vector.hh: * gst-libs/ext/mplex/videostrm.hh: * gst-libs/ext/mplex/videostrm_in.cc: * gst-libs/ext/mplex/videostrm_out.cc: * gst-libs/ext/mplex/yuv4mpeg.cc: * gst-libs/ext/mplex/yuv4mpeg.h: * gst-libs/ext/mplex/yuv4mpeg_intern.h: * gst-libs/ext/mplex/yuv4mpeg_ratio.cc: We don't fork mjpegtools' mplex in our CVS anymore. * gst/avi/gstavidemux.c: (gst_avi_demux_src_getcaps), (gst_avi_demux_add_stream): * gst/avi/gstavidemux.h: Add getcaps() function for proper caps nego. This makes some parts of AVI playback/reading work. * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): Resize window on new capsnego. This is probably wrong, but I'm still committing it because with current capsnego, the first successfull capsnego is auto-fixated, therefore rounded down to the lowest values in the caps. this results in a 16x16 XWindow that is not reized when real capsnego finishes. Dave, I see more cases of this, do you know a proper solution? * tools/gst-launch-ext.in: Fix MPEG-4 AAC (Apple iPod/iTunes) file commandline. 2003-12-31 David Schleef * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Change gst_pad_proxy_link() to gst_pad_try_set_caps() 2003-12-30 David Schleef * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain): Negotiation fixes * ext/mad/gstmad.c: (gst_mad_chain): Negotiation fixes * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), (gst_audio_convert_link), (gst_audio_convert_channels): * gst/audioscale/gstaudioscale.c: (gst_audioscale_getcaps), (gst_audioscale_link), (gst_audioscale_get_buffer), (gst_audioscale_chain): Negotiation fixes * gst/audioscale/gstaudioscale.h: * gst/videofilter/gstvideofilter.c: (gst_videofilter_format_get_structure), (gst_videofilter_getcaps), (gst_videofilter_link), (gst_videofilter_init), (gst_videofilter_set_output_size), (gst_videofilter_setup), (gst_videofilter_find_format_by_structure): * gst/videofilter/gstvideofilter.h: Negotiation fixes * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), (gst_videoscale_link): * gst/videoscale/videoscale.c: (videoscale_get_structure), (videoscale_find_by_structure), (gst_videoscale_setup): * gst/videoscale/videoscale.h: Negotiation fixes * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), (gst_ximagesink_fixate), (gst_ximagesink_init): Add a fixate function, restrict resizing to a multiple of 4 (hack until everyone supports odd sizes correctly). 2003-12-29 Colin Walters * ext/esd/esdsink.c (gst_esdsink_link): Fix typo; get depth instead of signed. 2003-12-30 Jan Schmidt * ext/sndfile/gstsf.c: (gst_sf_loop): Fix warning about discarding const qualifier 2003-12-27 Jeremy Simon * gst/cutter/gstcutter.c: * gst/videoscale/gstvideoscale.c: * gst/volenv/gstvolenv.c: * gst-libs/gst/audio/audio.c: * gst-libs/gst/video/video.c: Fix warnings 2003-12-27 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_open_audio): Don't send ALSA debugging to stderr. * ext/alsa/gstalsa.h: Use GST_WARNING instead of g_warning when ALSA functions fail. 2003-12-27 Benjamin Otte * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): Free XVAdapterInfo correctly. 2003-12-27 Benjamin Otte * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), (gst_id3_tag_do_caps_nego), (gst_id3_tag_src_link): Make id3tag use correct caps nego. 2003-12-27 Amaury Jacquot * ext/ivorbis/vorbis.c: * ext/ivorbis/vorbisenc.h: * ext/ivorbis/vorbisfile.c: Modify so that it uses the new caps things 2003-12-27 Benjamin Otte * testsuite/spider/spider1.c: (main): * testsuite/spider/spider2.c: (main): * testsuite/spider/spider3.c: (main): Make tests compile again. They probably don't work. 2003-12-24 Colin Walters * sys/oss/gstosssink.c (gst_osssink_sink_fixate): Return NULL if we can't fixate the caps anymore. 2003-12-23 David Schleef * gst/volume/gstvolume.c: (volume_init): Proxy getcaps. * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_sink_fixate): Add fixate function. 2003-12-24 Ronald Bultje * ext/ffmpeg/gstffmpegcodecmap.c: * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_getcaps), (gst_ffmpegcsp_srcconnect_func), (gst_ffmpegcsp_sinkconnect), (gst_ffmpegcsp_srcconnect), (gst_ffmpegcsp_get_type), (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), (gst_ffmpegcsp_get_property), (gst_ffmpegcsp_register): fix typo in RGB masks, and move back to "old" colorspace capsnego code until whoever wrote this new crap has actually tested it so that it works. And yes, this works, keep it that way please. 2003-12-23 Ronald Bultje * ext/divx/gstdivxdec.c: (gst_divxdec_base_init), (gst_divxdec_init), (gst_divxdec_negotiate): * ext/divx/gstdivxdec.h: * ext/divx/gstdivxenc.c: (gst_divxenc_base_init), (gst_divxenc_init): * ext/faac/gstfaac.c: (gst_faac_base_init), (gst_faac_init), (gst_faac_sinkconnect), (gst_faac_srcconnect): * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mpeg2enc/gstmpeg2encoder.cc: * ext/mpeg2enc/gstmpeg2encpicturereader.cc: * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_base_init), (dxr3audiosink_init), (dxr3audiosink_pcm_sinklink): * sys/dxr3/dxr3spusink.c: (dxr3spusink_base_init), (dxr3spusink_init): * sys/dxr3/dxr3videosink.c: (dxr3videosink_base_init), (dxr3videosink_init): Fix caps breakage after Dave's caps branch merge. 2003-12-23 Ronald Bultje * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): Fix for 24bpp display. 2003-12-23 Colin Walters * ext/gnomevfs/gstgnomevfssink.c: Add ARG_HANDLE property that takes a GnomeVFSHandle directly. 2003-12-22 Benjamin Otte * gst/volume/Makefile.am: * gst/volume/gstvolume.c: (volume_connect), (volume_parse_caps), (volume_base_init), (volume_init): Reenable volume element and fix to work with new caps stuff. Rhythmbox needs this. 2003-12-22 Benjamin Otte * gst/qtdemux/qtdemux.c: (plugin_init): qtdemux requires bytestream 2003-12-22 Benjamin Otte * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_link): Fix remaining caps handling errors due to CAPS merge. 2003-12-22 Benjamin Otte * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_init), (gst_faad_sinkconnect), (gst_faad_srcgetcaps), (gst_faad_srcconnect): Port to new caps system. 2003-12-21 Julien MOUTTE * examples/gstplay/player.c: (got_time_tick), (got_stream_length), (got_video_size), (main): using g_print instead of g_message. * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup): Fixing EOS signal which was not emitted because of "switch" element added to the bin but not connected. (Removing from the bin temporarily) 2003-12-21 Julien MOUTTE * configure.ac: X_DISPLAY_MISSING is set to 1 if AC_PATH_XTRA fails to find X development files. I don't understand the previous tests and they fail on my debian/ppc unstable. This one works. * examples/gstplay/player.c: (main): Set the pipeline to READY before exiting. * gst-libs/gst/play/gstplay.c: (gst_play_get_length_callback), (gst_play_set_video_sink), (gst_play_set_audio_sink), (gst_play_set_visualization): Add some safety checks in set_ methods and state_change. This was throwing some ugly CRITICAL messages when pipeline was getting disposed and casts were failing. 2003-12-21 Ronald Bultje * configure.ac: Improve mpeg2enc detection. This is for distributions that do ship mjpegtools, but without mpeg2enc. Also does object check for might there ever be ABI incompatibility. * ext/mpeg2enc/gstmpeg2enc.cc: Add Andrew as second maintainer (he's helping me), and also add an error if no caps was set. This happens if I pull before capsnego and that's something I should solve sometime else. * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup): Fix time parsing. * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link), (gst_matroska_mux_track_header): Add caps to templates. * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_sink_factory): Add mpegversion=1 to prevent confusion with MPEG/AAC. * gst/mpegstream/gstmpegdemux.c: Remove layer since it causes warnings about unfixed caps. * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): Fix obvious typo (we error out if caps were set, we should of course error out if *no* caps were set). * sys/oss/gstosselement.c: (gst_osselement_convert): Fix format conversion, we confused bits/bytes. * sys/oss/gstosselement.h: Improve documentation for 'bps'. * sys/v4l/TODO: Remove stuff about plugins that need removing - this was done ages ago. * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init), (gst_v4lmjpegsrc_src_convert), (gst_v4lmjpegsrc_src_query): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_src_convert), (gst_v4lsrc_src_query): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), (gst_v4l2src_src_convert), (gst_v4l2src_src_query): Add get_query_types(), get_formats() and query() functions. 2003-12-21 Thomas Vander Stichele * ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gst-plugins * moved CVS to freedesktop.org gst-plugins-good-0.10.31/docs/plugins/0000755000175000017500000000000011720565325014476 500000000000000gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins.prerequisites0000644000175000017500000000057711677341654024146 00000000000000GIcon GObject GstChildProxy GstObject GstColorBalance GstImplementsInterface GstElement GstImplementsInterface GstElement GstMixer GstImplementsInterface GstElement GstStreamVolume GObject GstTagSetter GstElement GstTagXmpWriter GstElement GstTuner GstImplementsInterface GstElement GstVideoOrientation GstImplementsInterface GstElement GstXOverlay GstImplementsInterface GstElement gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins.interfaces0000644000175000017500000000505111677341654023355 00000000000000GdkPixbuf GIcon Gst3GPPMux GstTagSetter GstTagXmpWriter GstApev2Mux GstTagSetter GstAspectRatioCrop GstChildProxy GstAudioEncoder GstPreset GstAutoAudioSink GstChildProxy GstAutoAudioSrc GstChildProxy GstAutoVideoSink GstChildProxy GstAutoVideoSrc GstChildProxy GstAviMux GstTagSetter GstBin GstChildProxy GstDV1394Src GstURIHandler GstPropertyProbe GstDeinterlace GstChildProxy GstFlacEnc GstPreset GstTagSetter GstFlacEnc GstTagSetter GstPreset GstFlacTag GstTagSetter GstFlvMux GstTagSetter GstGConfAudioSink GstChildProxy GstGConfAudioSrc GstChildProxy GstGConfVideoSink GstChildProxy GstGConfVideoSrc GstChildProxy GstGPPMux GstTagSetter GstTagXmpWriter GstHDV1394Src GstURIHandler GstPropertyProbe GstHalAudioSink GstChildProxy GstHalAudioSrc GstChildProxy GstISMLMux GstTagSetter GstTagXmpWriter GstId3v2Mux GstTagSetter GstIirEqualizer GstChildProxy GstIirEqualizer10Bands GstChildProxy GstPreset GstIirEqualizer3Bands GstChildProxy GstPreset GstIirEqualizerNBands GstChildProxy GstMJ2Mux GstTagSetter GstTagXmpWriter GstMP4Mux GstTagSetter GstTagXmpWriter GstMatroskaMux GstTagSetter GstOss4Mixer GstImplementsInterface GstMixer GstPropertyProbe GstOss4Sink GstStreamVolume GstPropertyProbe GstOss4Source GstImplementsInterface GstMixer GstPropertyProbe GstOssMixerElement GstImplementsInterface GstMixer GstOssSrc GstImplementsInterface GstMixer GstPipeline GstChildProxy GstPulseAudioSink GstChildProxy GstPulseMixer GstImplementsInterface GstMixer GstPropertyProbe GstPulseSink GstStreamVolume GstImplementsInterface GstPropertyProbe GstPulseSrc GstImplementsInterface GstMixer GstPropertyProbe GstPulseSrc GstStreamVolume GstImplementsInterface GstMixer GstPropertyProbe GstPushFileSrc GstChildProxy GstURIHandler GstQTMoovRecover GstChildProxy GstQTMux GstTagSetter GstTagXmpWriter GstRTSPSrc GstChildProxy GstURIHandler GstRgVolume GstChildProxy GstRtpBin GstChildProxy GstShout2send GstTagSetter GstSoupHTTPSrc GstURIHandler GstSpeexEnc GstPreset GstTagSetter GstSpeexEnc GstTagSetter GstPreset GstSwitchSink GstChildProxy GstSwitchSrc GstChildProxy GstTagLibMux GstTagSetter GstUDPSink GstURIHandler GstUDPSrc GstURIHandler GstV4l2Radio GstURIHandler GstImplementsInterface GstTuner GstPropertyProbe GstV4l2Sink GstImplementsInterface GstXOverlay GstNavigation GstColorBalance GstVideoOrientation GstPropertyProbe GstV4l2Src GstURIHandler GstImplementsInterface GstTuner GstColorBalance GstVideoOrientation GstPropertyProbe GstVideoBalance GstImplementsInterface GstColorBalance GstVideoMixer GstChildProxy GstVideoMixer2 GstChildProxy GstWavpackEnc GstPreset GstWebMMux GstTagSetter gst-plugins-good-0.10.31/docs/plugins/Makefile.am0000644000175000017500000002353611677341654016473 00000000000000GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj ## Process this file with automake to produce Makefile.in # The name of the module, e.g. 'glib'. #DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@ MODULE=gst-plugins-good DOC_MODULE=$(MODULE)-plugins # for upload-doc.mak DOC=$(MODULE)-plugins FORMATS=html html: html-build.stamp include $(top_srcdir)/common/upload-doc.mak # The top-level SGML file. Change it if you want. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # The directory containing the source code. # gtk-doc will search all .c & .h files beneath here for inline comments # documenting functions and macros. DOC_SOURCE_DIR = $(top_srcdir)/gst $(top_srcdir)/ext $(top_srcdir)/sys # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS= # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS=--sgml-mode --source-suffixes=c,h,cc # Extra options to supply to gtkdoc-fixref. FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \ --extra-dir=$(GSTPB_PREFIX)/share/gtk-doc/html # Used for dependencies. HFILE_GLOB= \ $(top_srcdir)/gst/*/*.h $(top_srcdir)/ext/*/*.h $(top_srcdir)/sys/*/*.h CFILE_GLOB= \ $(top_srcdir)/gst/*/*.c $(top_srcdir)/ext/*/*.c $(top_srcdir)/sys/*/*.c \ $(top_srcdir)/ext/*/*.cc $(top_srcdir)/sys/*/*.m # Header files to ignore when scanning. IGNORE_HFILES = IGNORE_CFILES = # we add all .h files of elements that have signals/args we want # sadly this also pulls in the private methods - maybe we should # move those around in the source ? # also, we should add some stuff here conditionally based on whether # or not the plugin will actually build # but I'm not sure about that - it might be this Just Works given that # the registry won't have the element EXTRA_HFILES = \ $(top_srcdir)/ext/aalib/gstaasink.h \ $(top_srcdir)/ext/annodex/gstcmmldec.h \ $(top_srcdir)/ext/annodex/gstcmmlenc.h \ $(top_srcdir)/ext/cairo/gsttextoverlay.h \ $(top_srcdir)/ext/cairo/gsttimeoverlay.h \ $(top_srcdir)/ext/cairo/gstcairorender.h \ $(top_srcdir)/ext/cairo/gstcairooverlay.h \ $(top_srcdir)/ext/dv/gstdvdec.h \ $(top_srcdir)/ext/dv/gstdvdemux.h \ $(top_srcdir)/ext/esd/esdsink.h \ $(top_srcdir)/ext/flac/gstflacdec.h \ $(top_srcdir)/ext/flac/gstflacenc.h \ $(top_srcdir)/ext/flac/gstflactag.h \ $(top_srcdir)/ext/gconf/gstgconfaudiosrc.h \ $(top_srcdir)/ext/gconf/gstgconfaudiosink.h \ $(top_srcdir)/ext/gconf/gstgconfvideosrc.h \ $(top_srcdir)/ext/gconf/gstgconfvideosink.h \ $(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 \ $(top_srcdir)/ext/jpeg/gstsmokeenc.h \ $(top_srcdir)/ext/libcaca/gstcacasink.h \ $(top_srcdir)/ext/libpng/gstpngdec.h \ $(top_srcdir)/ext/libpng/gstpngenc.h \ $(top_srcdir)/ext/raw1394/gstdv1394src.h \ $(top_srcdir)/ext/raw1394/gsthdv1394src.h \ $(top_srcdir)/ext/soup/gstsouphttpsrc.h \ $(top_srcdir)/ext/taglib/gstapev2mux.h \ $(top_srcdir)/ext/taglib/gstid3v2mux.h \ $(top_srcdir)/ext/pulse/pulsesink.h \ $(top_srcdir)/ext/pulse/pulsesrc.h \ $(top_srcdir)/ext/pulse/pulsemixer.h \ $(top_srcdir)/ext/speex/gstspeexenc.h \ $(top_srcdir)/ext/speex/gstspeexdec.h \ $(top_srcdir)/ext/wavpack/gstwavpackdec.h \ $(top_srcdir)/ext/wavpack/gstwavpackenc.h \ $(top_srcdir)/ext/wavpack/gstwavpackparse.h \ $(top_srcdir)/gst/alpha/gstalpha.h \ $(top_srcdir)/gst/alpha/gstalphacolor.h \ $(top_srcdir)/gst/apetag/gstapedemux.h \ $(top_srcdir)/gst/audiofx/audioamplify.h \ $(top_srcdir)/gst/audiofx/audioecho.h \ $(top_srcdir)/gst/audiofx/audiodynamic.h \ $(top_srcdir)/gst/audiofx/audioinvert.h \ $(top_srcdir)/gst/audiofx/audiokaraoke.h \ $(top_srcdir)/gst/audiofx/audiopanorama.h \ $(top_srcdir)/gst/audiofx/audiocheblimit.h \ $(top_srcdir)/gst/audiofx/audiochebband.h \ $(top_srcdir)/gst/audiofx/audioiirfilter.h \ $(top_srcdir)/gst/audiofx/audiowsincband.h \ $(top_srcdir)/gst/audiofx/audiowsinclimit.h \ $(top_srcdir)/gst/audiofx/audiofirfilter.h \ $(top_srcdir)/gst/audioparsers/gstaacparse.h \ $(top_srcdir)/gst/audioparsers/gstac3parse.h \ $(top_srcdir)/gst/audioparsers/gstamrparse.h \ $(top_srcdir)/gst/audioparsers/gstflacparse.h \ $(top_srcdir)/gst/audioparsers/gstdcaparse.h \ $(top_srcdir)/gst/audioparsers/gstmpegaudioparse.h \ $(top_srcdir)/gst/auparse/gstauparse.h \ $(top_srcdir)/gst/autodetect/gstautoaudiosink.h \ $(top_srcdir)/gst/autodetect/gstautoaudiosrc.h \ $(top_srcdir)/gst/autodetect/gstautovideosink.h \ $(top_srcdir)/gst/autodetect/gstautovideosrc.h \ $(top_srcdir)/gst/avi/gstavidemux.h \ $(top_srcdir)/gst/avi/gstavimux.h \ $(top_srcdir)/gst/avi/gstavisubtitle.h \ $(top_srcdir)/gst/cutter/gstcutter.h \ $(top_srcdir)/gst/debugutils/gstcapssetter.h \ $(top_srcdir)/gst/debugutils/gsttaginject.h \ $(top_srcdir)/gst/debugutils/progressreport.h \ $(top_srcdir)/gst/deinterlace/gstdeinterlace.h \ $(top_srcdir)/gst/effectv/gstaging.h \ $(top_srcdir)/gst/effectv/gstdice.h \ $(top_srcdir)/gst/effectv/gstedge.h \ $(top_srcdir)/gst/effectv/gstquark.h \ $(top_srcdir)/gst/effectv/gstrev.h \ $(top_srcdir)/gst/effectv/gstshagadelic.h \ $(top_srcdir)/gst/effectv/gstvertigo.h \ $(top_srcdir)/gst/effectv/gstwarp.h \ $(top_srcdir)/gst/effectv/gststreak.h \ $(top_srcdir)/gst/effectv/gstripple.h \ $(top_srcdir)/gst/effectv/gstop.h \ $(top_srcdir)/gst/effectv/gstradioac.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer3bands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer10bands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizernbands.h \ $(top_srcdir)/gst/flv/gstflvdemux.h \ $(top_srcdir)/gst/flv/gstflvmux.h \ $(top_srcdir)/gst/flx/gstflxdec.h \ $(top_srcdir)/gst/goom/gstgoom.h \ $(top_srcdir)/gst/goom2k1/gstgoom.h \ $(top_srcdir)/gst/law/alaw-decode.h \ $(top_srcdir)/gst/law/alaw-encode.h \ $(top_srcdir)/gst/law/mulaw-decode.h \ $(top_srcdir)/gst/law/mulaw-encode.h \ $(top_srcdir)/gst/icydemux/gsticydemux.h \ $(top_srcdir)/gst/id3demux/gstid3demux.h \ $(top_srcdir)/gst/imagefreeze/gstimagefreeze.h \ $(top_srcdir)/gst/interleave/deinterleave.h \ $(top_srcdir)/gst/interleave/interleave.h \ $(top_srcdir)/gst/level/gstlevel.h \ $(top_srcdir)/gst/matroska/matroska-demux.h \ $(top_srcdir)/gst/matroska/matroska-mux.h \ $(top_srcdir)/gst/matroska/webm-mux.h \ $(top_srcdir)/gst/monoscope/gstmonoscope.h \ $(top_srcdir)/gst/multifile/gstmultifilesink.h \ $(top_srcdir)/gst/multifile/gstmultifilesrc.h \ $(top_srcdir)/gst/multifile/gstsplitfilesrc.h \ $(top_srcdir)/gst/multipart/multipartdemux.h \ $(top_srcdir)/gst/multipart/multipartmux.h \ $(top_srcdir)/gst/isomp4/qtdemux.h \ $(top_srcdir)/gst/isomp4/gstqtmux.h \ $(top_srcdir)/gst/isomp4/gstqtmux-doc.h \ $(top_srcdir)/gst/replaygain/gstrganalysis.h \ $(top_srcdir)/gst/replaygain/gstrglimiter.h \ $(top_srcdir)/gst/replaygain/gstrgvolume.h \ $(top_srcdir)/gst/rtp/gstrtpj2kpay.h \ $(top_srcdir)/gst/rtp/gstrtpjpegpay.h \ $(top_srcdir)/gst/rtpmanager/gstrtpbin.h \ $(top_srcdir)/gst/rtpmanager/gstrtpjitterbuffer.h \ $(top_srcdir)/gst/rtpmanager/gstrtpptdemux.h \ $(top_srcdir)/gst/rtpmanager/gstrtpsession.h \ $(top_srcdir)/gst/rtpmanager/gstrtpssrcdemux.h \ $(top_srcdir)/gst/rtsp/gstrtpdec.h \ $(top_srcdir)/gst/rtsp/gstrtspsrc.h \ $(top_srcdir)/gst/shapewipe/gstshapewipe.h \ $(top_srcdir)/gst/smpte/gstsmpte.h \ $(top_srcdir)/gst/smpte/gstsmptealpha.h \ $(top_srcdir)/gst/spectrum/gstspectrum.h \ $(top_srcdir)/gst/udp/gstmultiudpsink.h \ $(top_srcdir)/gst/udp/gstudpsrc.h \ $(top_srcdir)/gst/udp/gstudpsink.h \ $(top_srcdir)/gst/videobox/gstvideobox.h \ $(top_srcdir)/gst/videocrop/gstvideocrop.h \ $(top_srcdir)/gst/videocrop/gstaspectratiocrop.h \ $(top_srcdir)/gst/videofilter/gstgamma.h \ $(top_srcdir)/gst/videofilter/gstvideobalance.h \ $(top_srcdir)/gst/videofilter/gstvideoflip.h \ $(top_srcdir)/gst/videomixer/videomixer.h \ $(top_srcdir)/gst/videomixer/videomixerpad.h \ $(top_srcdir)/gst/videomixer/videomixer2.h \ $(top_srcdir)/gst/videomixer/videomixer2pad.h \ $(top_srcdir)/gst/wavenc/gstwavenc.h \ $(top_srcdir)/gst/wavparse/gstwavparse.h \ $(top_srcdir)/gst/y4m/gsty4mencode.h \ $(top_srcdir)/sys/directsound/gstdirectsoundsink.h \ $(top_srcdir)/sys/oss4/oss4-mixer.h \ $(top_srcdir)/sys/oss4/oss4-sink.h \ $(top_srcdir)/sys/oss4/oss4-source.h \ $(top_srcdir)/sys/oss/gstossmixerelement.h \ $(top_srcdir)/sys/oss/gstosssink.h \ $(top_srcdir)/sys/oss/gstosssrc.h \ $(top_srcdir)/sys/osxaudio/gstosxaudiosrc.h \ $(top_srcdir)/sys/osxaudio/gstosxaudiosink.h \ $(top_srcdir)/sys/osxvideo/osxvideosink.h \ $(top_srcdir)/sys/v4l2/gstv4l2src.h \ $(top_srcdir)/sys/v4l2/gstv4l2sink.h \ $(top_srcdir)/sys/v4l2/gstv4l2radio.h \ $(top_srcdir)/sys/waveform/gstwaveformsink.h \ $(top_srcdir)/sys/ximage/gstximagesrc.h # example code that needs to be converted to xml and placed in xml/ EXAMPLE_CFILES = \ $(top_srcdir)/tests/examples/level/level-example.c \ $(top_srcdir)/tests/examples/spectrum/spectrum-example.c \ $(top_srcdir)/tests/examples/audiofx/firfilter-example.c \ $(top_srcdir)/tests/examples/audiofx/iirfilter-example.c # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). content_files = # Other files to distribute. extra_files = # CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib # contains GtkObjects/GObjects and you want to document signals and properties. GTKDOC_CFLAGS = $(GST_BASE_CFLAGS) -I$(top_builddir) GTKDOC_LIBS = $(GST_BASE_LIBS) GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC) GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC) # If you need to override some of the declarations, place them in this file # and uncomment this line. #DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt DOC_OVERRIDES = include $(top_srcdir)/common/gtk-doc-plugins.mak gst-plugins-good-0.10.31/docs/plugins/inspect/0000755000175000017500000000000011720565325016143 500000000000000gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-cacasink.xml0000644000175000017500000000345111720564144021656 00000000000000 cacasink Colored ASCII Art video sink ../../ext/libcaca/.libs/libgstcacasink.so libgstcacasink.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin cacasink A colored ASCII art video sink Sink/Video A colored ASCII art videosink Zeeshan Ali <zak147@yahoo.com> sink sink always
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-osxaudio.xml0000644000175000017500000000176311671175352021745 00000000000000 osxaudio OSX (Mac OS X) audio support for GStreamer ../../sys/osxaudio/.libs/libgstosxaudio.so libgstosxaudio.so 0.10.5.1 LGPL gst-plugins-good GStreamer Good Plug-ins CVS/prerelease Unknown package origin osxaudiosink Audio Sink (OSX) Sink/Audio Output to a sound card in OS X Zaheer Abbas Merali <zaheerabbas at merali dot org> osxaudiosrc Audio Source (OSX) Source/Audio Input from a sound card in OS X Zaheer Abbas Merali <zaheerabbas at merali dot org> gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-rtp.xml0000644000175000017500000017614411720564144020721 00000000000000 rtp Real-time protocol plugins ../../gst/rtp/.libs/libgstrtp.so libgstrtp.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin asteriskh263 RTP Asterisk H263 depayloader Codec/Depayloader/Network/RTP Extracts H263 video from RTP and encodes in Asterisk H263 format Neil Stratford <neils@vipadia.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263-1998
src source always
application/x-asteriskh263
rtpL16depay RTP audio depayloader Codec/Depayloader/Network/RTP Extracts raw audio from RTP packets Zeeshan Ali <zak147@yahoo.com>,Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)L16; application/x-rtp, media=(string)audio, payload=(int){ 10, 11 }, clock-rate=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, endianness=(int)4321, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
rtpL16pay RTP audio payloader Codec/Payloader/Network/RTP Payload-encode Raw audio into RTP packets (RFC 3551) Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/x-raw-int, endianness=(int)4321, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)L16, channels=(int)[ 1, 2147483647 ]; application/x-rtp, media=(string)audio, encoding-name=(string)L16, payload=(int)10, clock-rate=(int)44100; application/x-rtp, media=(string)audio, encoding-name=(string)L16, payload=(int)11, clock-rate=(int)44100
rtpac3depay RTP AC3 depayloader Codec/Depayloader/Network/RTP Extracts AC3 audio from RTP packets (RFC 4184) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int){ 32000, 44100, 48000 }, encoding-name=(string)AC3
src source always
audio/ac3
rtpac3pay RTP AC3 audio payloader Codec/Payloader/Network/RTP Payload AC3 audio as RTP packets (RFC 4184) Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/ac3; audio/x-ac3
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int){ 32000, 44100, 48000 }, encoding-name=(string)AC3
rtpamrdepay RTP AMR depayloader Codec/Depayloader/Network/RTP Extracts AMR or AMR-WB audio from RTP packets (RFC 3267) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)AMR, encoding-params=(string)1, octet-align=(string)1, crc=(string){ 0, 1 }, robust-sorting=(string)0, interleaving=(string)0; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)AMR-WB, encoding-params=(string)1, octet-align=(string)1, crc=(string){ 0, 1 }, robust-sorting=(string)0, interleaving=(string)0
src source always
audio/AMR, channels=(int)1, rate=(int)8000; audio/AMR-WB, channels=(int)1, rate=(int)16000
rtpamrpay RTP AMR payloader Codec/Payloader/Network/RTP Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267) Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/AMR, channels=(int)1, rate=(int)8000; audio/AMR-WB, channels=(int)1, rate=(int)16000
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)AMR, encoding-params=(string)1, octet-align=(string)1, crc=(string)0, robust-sorting=(string)0, interleaving=(string)0, mode-set=(int)[ 0, 7 ], mode-change-period=(int)[ 1, 2147483647 ], mode-change-neighbor=(string){ 0, 1 }, maxptime=(int)[ 20, 2147483647 ], ptime=(int)[ 20, 2147483647 ]; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)AMR-WB, encoding-params=(string)1, octet-align=(string)1, crc=(string)0, robust-sorting=(string)0, interleaving=(string)0, mode-set=(int)[ 0, 7 ], mode-change-period=(int)[ 1, 2147483647 ], mode-change-neighbor=(string){ 0, 1 }, maxptime=(int)[ 20, 2147483647 ], ptime=(int)[ 20, 2147483647 ]
rtpbvdepay RTP BroadcomVoice depayloader Codec/Depayloader/Network/RTP Extracts BroadcomVoice audio from RTP packets (RFC 4298) Wim Taymans <wim.taymans@collabora.co.uk> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)BV16; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)BV32
src source always
audio/x-bv, mode=(int){ 16, 32 }
rtpbvpay RTP BV Payloader Codec/Payloader/Network/RTP Packetize BroadcomVoice audio streams into RTP packets (RFC 4298) Wim Taymans <wim.taymans@collabora.co.uk> sink sink always
audio/x-bv, mode=(int){ 16, 32 }
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)BV16; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)BV32
rtpceltdepay RTP CELT depayloader Codec/Depayloader/Network/RTP Extracts CELT audio from RTP packets Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 32000, 48000 ], encoding-name=(string)CELT
src source always
audio/x-celt
rtpceltpay RTP CELT payloader Codec/Payloader/Network/RTP Payload-encodes CELT audio into a RTP packet Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/x-celt, rate=(int)[ 32000, 64000 ], channels=(int)[ 1, 2 ], frame-size=(int)[ 64, 512 ]
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 32000, 48000 ], encoding-name=(string)CELT
rtpdepay Dummy RTP session manager Codec/Depayloader/Network/RTP Accepts raw RTP and RTCP packets and sends them forward Wim Taymans <wim.taymans@gmail.com> sinkrtcp sink always
application/x-rtcp
sinkrtp sink always
application/x-rtp
srcrtcp source always
application/x-rtcp
srcrtp source always
application/x-rtp
rtpdvdepay RTP DV Depayloader Codec/Depayloader/Network/RTP Depayloads DV from RTP packets (RFC 3189) Marcel Moreaux <marcelm@spacelabs.nl>, Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string){ video, audio }, payload=(int)[ 96, 127 ], encoding-name=(string)DV, clock-rate=(int)90000, encode=(string){ SD-VCR/525-60, SD-VCR/625-50, HD-VCR/1125-60, HD-VCR/1250-50, SDL-VCR/525-60, SDL-VCR/625-50, 306M/525-60, 306M/625-50, 314M-25/525-60, 314M-25/625-50, 314M-50/525-60, 314M-50/625-50 }
src source always
video/x-dv
rtpdvpay RTP DV Payloader Codec/Payloader/Network/RTP Payloads DV into RTP packets (RFC 3189) Marcel Moreaux <marcelm@spacelabs.nl>, Wim Taymans <wim.taymans@gmail.com> sink sink always
video/x-dv
src source always
application/x-rtp, media=(string){ video, audio }, payload=(int)[ 96, 127 ], encoding-name=(string)DV, clock-rate=(int)90000, encode=(string){ SD-VCR/525-60, SD-VCR/625-50, HD-VCR/1125-60, HD-VCR/1250-50, SDL-VCR/525-60, SDL-VCR/625-50, 306M/525-60, 306M/625-50, 314M-25/525-60, 314M-25/625-50, 314M-50/525-60, 314M-50/625-50 }
rtpg722depay RTP audio depayloader Codec/Depayloader/Network/RTP Extracts G722 audio from RTP packets Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G722; application/x-rtp, media=(string)audio, payload=(int)9, clock-rate=(int)[ 1, 2147483647 ]
src source always
audio/G722, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
rtpg722pay RTP audio payloader Codec/Payloader/Network/RTP Payload-encode Raw audio into RTP packets (RFC 3551) Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/G722, rate=(int)16000, channels=(int)1
src source always
application/x-rtp, media=(string)audio, encoding-name=(string)G722, payload=(int)9, clock-rate=(int)8000
rtpg723depay RTP G.723 depayloader Codec/Depayloader/Network/RTP Extracts G.723 audio from RTP packets (RFC 3551) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G723; application/x-rtp, media=(string)audio, payload=(int)4, clock-rate=(int)8000
src source always
audio/G723, channels=(int)1, rate=(int)8000
rtpg723pay RTP G.723 payloader Codec/Payloader/Network/RTP Packetize G.723 audio into RTP packets Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/G723, channels=(int)1, rate=(int)8000
src source always
application/x-rtp, media=(string)audio, payload=(int)4, clock-rate=(int)8000, encoding-name=(string)G723; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G723
rtpg726depay RTP G.726 depayloader Codec/Depayloader/Network/RTP Extracts G.726 audio from RTP packets Axis Communications <dev-gstreamer@axis.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string){ G726, G726-16, G726-24, G726-32, G726-40, AAL2-G726-16, AAL2-G726-24, AAL2-G726-32, AAL2-G726-40 }, clock-rate=(int)8000
src source always
audio/x-adpcm, channels=(int)1, rate=(int)8000, bitrate=(int){ 16000, 24000, 32000, 40000 }, layout=(string)g726
rtpg726pay RTP G.726 payloader Codec/Payloader/Network/RTP Payload-encodes G.726 audio into a RTP packet Axis Communications <dev-gstreamer@axis.com> sink sink always
audio/x-adpcm, channels=(int)1, rate=(int)8000, bitrate=(int){ 16000, 24000, 32000, 40000 }, layout=(string)g726
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string){ G726-16, G726-24, G726-32, G726-40, AAL2-G726-16, AAL2-G726-24, AAL2-G726-32, AAL2-G726-40 }
rtpg729depay RTP G.729 depayloader Codec/Depayloader/Network/RTP Extracts G.729 audio from RTP packets (RFC 3551) Laurent Glayal <spglegle@yahoo.fr> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G729; application/x-rtp, media=(string)audio, payload=(int)18, clock-rate=(int)8000
src source always
audio/G729, channels=(int)1, rate=(int)8000
rtpg729pay RTP G.729 payloader Codec/Payloader/Network/RTP Packetize G.729 audio into RTP packets Olivier Crete <olivier.crete@collabora.co.uk> sink sink always
audio/G729, channels=(int)1, rate=(int)8000
src source always
application/x-rtp, media=(string)audio, payload=(int)18, clock-rate=(int)8000, encoding-name=(string)G729; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)G729
rtpgsmdepay RTP GSM depayloader Codec/Depayloader/Network/RTP Extracts GSM audio from RTP packets Zeeshan Ali <zeenix@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)GSM; application/x-rtp, media=(string)audio, payload=(int)3, clock-rate=(int)8000
src source always
audio/x-gsm, rate=(int)8000, channels=(int)1
rtpgsmpay RTP GSM payloader Codec/Payloader/Network/RTP Payload-encodes GSM audio into a RTP packet Zeeshan Ali <zeenix@gmail.com> sink sink always
audio/x-gsm, rate=(int)8000, channels=(int)1
src source always
application/x-rtp, media=(string)audio, payload=(int)3, clock-rate=(int)8000, encoding-name=(string)GSM; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)GSM
rtpgstdepay GStreamer depayloader Codec/Depayloader/Network Extracts GStreamer buffers from RTP packets Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)application, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)X-GST
src source always
ANY
rtpgstpay RTP GStreamer payloader Codec/Payloader/Network/RTP Payload GStreamer buffers as RTP packets Wim Taymans <wim.taymans@gmail.com> sink sink always
ANY
src source always
application/x-rtp, media=(string)application, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)X-GST
rtph263depay RTP H263 depayloader Codec/Depayloader/Network/RTP Extracts H263 video from RTP packets (RFC 2190) Philippe Kalaf <philippe.kalaf@collabora.co.uk>, Edward Hervey <bilboed@bilboed.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)34, clock-rate=(int)90000, encoding-name=(string)H263; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263
src source always
video/x-h263, variant=(string)itu, h263version=(string)h263
rtph263pay RTP H263 packet payloader Codec/Payloader/Network/RTP Payload-encodes H263 video in RTP packets (RFC 2190) Neil Stratford <neils@vipadia.com>Dejan Sakelsak <dejan.sakelsak@marand.si> sink sink always
video/x-h263, variant=(string)itu, h263version=(string)h263
src source always
application/x-rtp, media=(string)video, payload=(int)34, clock-rate=(int)90000, encoding-name=(string)H263; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263
rtph263pdepay RTP H263 depayloader Codec/Depayloader/Network/RTP Extracts H263/+/++ video from RTP packets (RFC 4629) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)H263-1998; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)H263-2000
src source always
video/x-h263, variant=(string)itu
rtph263ppay RTP H263 payloader Codec/Payloader/Network/RTP Payload-encodes H263/+/++ video in RTP packets (RFC 4629) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/x-h263, variant=(string)itu
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263-1998; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H263-2000
rtph264depay RTP H264 depayloader Codec/Depayloader/Network/RTP Extracts H264 video from RTP packets (RFC 3984) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H264
src source always
video/x-h264
rtph264pay RTP H264 payloader Codec/Payloader/Network/RTP Payload-encode H264 video into RTP packets (RFC 3984) Laurent Glayal <spglegle@yahoo.fr> sink sink always
video/x-h264
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)H264
rtpilbcdepay RTP iLBC depayloader Codec/Depayloader/Network/RTP Extracts iLBC audio from RTP packets (RFC 3952) Philippe Kalaf <philippe.kalaf@collabora.co.uk> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)ILBC, mode=(string){ 20, 30 }
src source always
audio/x-iLBC, mode=(int){ 20, 30 }
rtpilbcpay RTP iLBC Payloader Codec/Payloader/Network/RTP Packetize iLBC audio streams into RTP packets Philippe Kalaf <philippe.kalaf@collabora.co.uk> sink sink always
audio/x-iLBC, mode=(int){ 20, 30 }
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)ILBC, mode=(string){ 20, 30 }
rtpj2kdepay RTP JPEG 2000 depayloader Codec/Depayloader/Network/RTP Extracts JPEG 2000 video from RTP packets (RFC 5371) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG2000
src source always
image/x-jpc
rtpj2kpay RTP JPEG 2000 payloader Codec/Payloader/Network/RTP Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371) Wim Taymans <wim.taymans@gmail.com> sink sink always
image/x-jpc
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG2000
rtpjpegdepay RTP JPEG depayloader Codec/Depayloader/Network/RTP Extracts JPEG video from RTP packets (RFC 2435) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG; application/x-rtp, media=(string)video, payload=(int)26, clock-rate=(int)90000
src source always
image/jpeg
rtpjpegpay RTP JPEG payloader Codec/Payloader/Network/RTP Payload-encodes JPEG pictures into RTP packets (RFC 2435) Axis Communications <dev-gstreamer@axis.com> sink sink always
image/jpeg; video/x-jpeg
src source always
application/x-rtp, media=(string)video, payload=(int)26, clock-rate=(int)90000, encoding-name=(string)JPEG
rtpmp1sdepay RTP MPEG1 System Stream depayloader Codec/Depayloader/Network/RTP Extracts MPEG1 System Streams from RTP packets (RFC 3555) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)other, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP1S; application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP1S
src source always
video/mpeg, systemstream=(boolean)true
rtpmp2tdepay RTP MPEG Transport Stream depayloader Codec/Depayloader/Network/RTP Extracts MPEG2 TS from RTP packets (RFC 2250) Wim Taymans <wim.taymans@gmail.com>, Thijs Vermeir <thijs.vermeir@barco.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP2T-ES; application/x-rtp, media=(string)video, payload=(int)33, clock-rate=(int)[ 1, 2147483647 ]
src source always
video/mpegts, packetsize=(int)188, systemstream=(boolean)true
rtpmp2tpay RTP MPEG2 Transport Stream payloader Codec/Payloader/Network/RTP Payload-encodes MPEG2 TS into RTP packets (RFC 2250) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/mpegts, packetsize=(int)188, systemstream=(boolean)true
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MP2T-ES
rtpmp4adepay RTP MPEG4 audio depayloader Codec/Depayloader/Network/RTP Extracts MPEG4 audio from RTP packets (RFC 3016) Nokia Corporation (contact <stefan.kost@nokia.com>), Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4A-LATM
src source always
audio/mpeg, mpegversion=(int)4, framed=(boolean)true, stream-format=(string)raw
rtpmp4apay RTP MPEG4 audio payloader Codec/Payloader/Network/RTP Payload MPEG4 audio as RTP packets (RFC 3016) Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/mpeg, mpegversion=(int)4, stream-format=(string)raw
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4A-LATM
rtpmp4gdepay RTP MPEG4 ES depayloader Codec/Depayloader/Network/RTP Extracts MPEG4 elementary streams from RTP packets (RFC 3640) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string){ video, audio, application }, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MPEG4-GENERIC, streamtype=(string){ 4, 5 }, mode=(string){ generic, CELP-cbr, CELP-vbr, AAC-lbr, AAC-hbr }
src source always
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw
rtpmp4gpay RTP MPEG4 ES payloader Codec/Payloader/Network/RTP Payload MPEG4 elementary streams as RTP packets (RFC 3640) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw
src source always
application/x-rtp, media=(string){ video, audio, application }, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MPEG4-GENERIC, streamtype=(string){ 4, 5 }, mode=(string){ generic, CELP-cbr, CELP-vbr, AAC-lbr, AAC-hbr }
rtpmp4vdepay RTP MPEG4 video depayloader Codec/Depayloader/Network/RTP Extracts MPEG4 video from RTP packets (RFC 3016) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4V-ES
src source always
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false
rtpmp4vpay RTP MPEG4 Video payloader Codec/Payloader/Network/RTP Payload MPEG-4 video as RTP packets (RFC 3016) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-xvid
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)MP4V-ES
rtpmpadepay RTP MPEG audio depayloader Codec/Depayloader/Network/RTP Extracts MPEG audio from RTP packets (RFC 2038) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPA; application/x-rtp, media=(string)audio, payload=(int)14, clock-rate=(int)90000
src source always
audio/mpeg, mpegversion=(int)1
rtpmpapay RTP MPEG audio payloader Codec/Payloader/Network/RTP Payload MPEG audio as RTP packets (RFC 2038) Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/mpeg, mpegversion=(int)1
src source always
application/x-rtp, media=(string)audio, payload=(int)14, clock-rate=(int)90000; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPA
rtpmparobustdepay RTP MPEG audio depayloader Codec/Depayloader/Network/RTP Extracts MPEG audio from RTP packets (RFC 5219) Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPA-ROBUST; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string){ X-MP3-DRAFT-00, X-MP3-DRAFT-01, X-MP3-DRAFT-02, X-MP3-DRAFT-03, X-MP3-DRAFT-04, X-MP3-DRAFT-05, X-MP3-DRAFT-06 }
src source always
audio/mpeg, mpegversion=(int)1
rtpmpvdepay RTP MPEG video depayloader Codec/Depayloader/Network/RTP Extracts MPEG video from RTP packets (RFC 2250) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)MPV; application/x-rtp, media=(string)video, payload=(int)32, clock-rate=(int)90000
src source always
video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
rtpmpvpay RTP MPEG2 ES video payloader Codec/Payloader/Network/RTP Payload-encodes MPEG2 ES into RTP packets (RFC 2250) Thijs Vermeir <thijsvermeir@gmail.com> sink sink always
video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
src source always
application/x-rtp, media=(string)video, payload=(int)32, clock-rate=(int)90000, encoding-name=(string)MPV
rtppcmadepay RTP PCMA depayloader Codec/Depayloader/Network/RTP Extracts PCMA audio from RTP packets Edgard Lima <edgard.lima@indt.org.br>, Zeeshan Ali <zeenix@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)8, clock-rate=(int)8000, encoding-name=(string)PCMA; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)PCMA
src source always
audio/x-alaw, channels=(int)1, rate=(int)[ 1, 2147483647 ]
rtppcmapay RTP PCMA payloader Codec/Payloader/Network/RTP Payload-encodes PCMA audio into a RTP packet Edgard Lima <edgard.lima@indt.org.br> sink sink always
audio/x-alaw, channels=(int)1, rate=(int)8000
src source always
application/x-rtp, media=(string)audio, payload=(int)8, clock-rate=(int)8000, encoding-name=(string)PCMA; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)PCMA
rtppcmudepay RTP PCMU depayloader Codec/Depayloader/Network/RTP Extracts PCMU audio from RTP packets Edgard Lima <edgard.lima@indt.org.br>, Zeeshan Ali <zeenix@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)0, encoding-name=(string)PCMU, clock-rate=(int)8000; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string)PCMU, clock-rate=(int)[ 1, 2147483647 ]
src source always
audio/x-mulaw, channels=(int)1, rate=(int)[ 1, 2147483647 ]
rtppcmupay RTP PCMU payloader Codec/Payloader/Network/RTP Payload-encodes PCMU audio into a RTP packet Edgard Lima <edgard.lima@indt.org.br> sink sink always
audio/x-mulaw, channels=(int)1, rate=(int)8000
src source always
application/x-rtp, media=(string)audio, payload=(int)0, clock-rate=(int)8000, encoding-name=(string)PCMU; application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)PCMU
rtpqcelpdepay RTP QCELP depayloader Codec/Depayloader/Network/RTP Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)8000, encoding-name=(string)QCELP; application/x-rtp, media=(string)audio, payload=(int)12, clock-rate=(int)8000
src source always
audio/qcelp, channels=(int)1, rate=(int)8000
rtpqdm2depay RTP QDM2 depayloader Codec/Depayloader/Network/RTP Extracts QDM2 audio from RTP packets (no RFC) Edward Hervey <bilboed@bilboed.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], encoding-name=(string)X-QDM
src source always
audio/x-qdm2
rtpsirendepay RTP Siren packet depayloader Codec/Depayloader/Network/RTP Extracts Siren audio from RTP packets Philippe Kalaf <philippe.kalaf@collabora.co.uk> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)SIREN, dct-length=(int)320
src source always
audio/x-siren, dct-length=(int)320
rtpsirenpay RTP Payloader for Siren Audio Codec/Payloader/Network/RTP Packetize Siren audio streams into RTP packets Youness Alaoui <kakaroto@kakaroto.homelinux.net> sink sink always
audio/x-siren, dct-length=(int)320
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)16000, encoding-name=(string)SIREN, bitrate=(string)16000, dct-length=(int)320
rtpspeexdepay RTP Speex depayloader Codec/Depayloader/Network/RTP Extracts Speex audio from RTP packets Edgard Lima <edgard.lima@indt.org.br> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 6000, 48000 ], encoding-name=(string)SPEEX, encoding-params=(string)1
src source always
audio/x-speex
rtpspeexpay RTP Speex payloader Codec/Payloader/Network/RTP Payload-encodes Speex audio into a RTP packet Edgard Lima <edgard.lima@indt.org.br> sink sink always
audio/x-speex, rate=(int)[ 6000, 48000 ], channels=(int)1
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 6000, 48000 ], encoding-name=(string)SPEEX, encoding-params=(string)1
rtpsv3vdepay RTP SVQ3 depayloader Codec/Depayloader/Network/RTP Extracts SVQ3 video from RTP packets (no RFC) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string){ X-SV3V-ES, X-SORENSON-VIDEO, X-SORENSONVIDEO, X-SorensonVideo }
src source always
video/x-svq, svqversion=(int)3
rtptheoradepay RTP Theora depayloader Codec/Depayloader/Network/RTP Extracts Theora video from RTP packets (draft-01 of RFC XXXX) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)THEORA
src source always
video/x-theora
rtptheorapay RTP Theora payloader Codec/Payloader/Network/RTP Payload-encode Theora video into RTP packets (draft-01 RFC XXXX) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/x-theora
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)THEORA
rtpvorbisdepay RTP Vorbis depayloader Codec/Depayloader/Network/RTP Extracts Vorbis Audio from RTP packets (RFC 5215) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)VORBIS
src source always
audio/x-vorbis
rtpvorbispay RTP Vorbis depayloader Codec/Payloader/Network/RTP Payload-encode Vorbis audio into RTP packets (RFC 5215) Wim Taymans <wimi.taymans@gmail.com> sink sink always
audio/x-vorbis
src source always
application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string)VORBIS
rtpvrawdepay RTP Raw Video depayloader Codec/Depayloader/Network/RTP Extracts raw video from RTP packets (RFC 4175) Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)RAW
src source always
video/x-raw-rgb; video/x-raw-yuv
rtpvrawpay RTP Raw Video payloader Codec/Payloader/Network/RTP Payload raw video as RTP packets (RFC 4175) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]; video/x-raw-yuv, format=(fourcc){ AYUV, UYVY, I420, Y41B, UYVP }, width=(int)[ 1, 32767 ], height=(int)[ 1, 32767 ]
src source always
application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string){ RGB, RGBA, BGR, BGRA, YCbCr-4:4:4, YCbCr-4:2:2, YCbCr-4:2:0, YCbCr-4:1:1 }, depth=(string){ 8, 10, 12, 16 }, colorimetry=(string){ BT601-5, BT709-2, SMPTE240M }
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-monoscope.xml0000644000175000017500000000260011677341654022111 00000000000000 monoscope Monoscope visualization ../../gst/monoscope/.libs/libgstmonoscope.so libgstmonoscope.so 0.10.30.1 LGPL gst-plugins-good GStreamer Good Plug-ins git Unknown package origin monoscope Monoscope Visualization Displays a highly stabilised waveform of audio input Richard Boulton <richard@tartarus.org> sink sink always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-soup.xml0000644000175000017500000000255511720564144021074 00000000000000 soup libsoup HTTP client src/sink ../../ext/soup/.libs/libgstsouphttpsrc.so libgstsouphttpsrc.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin souphttpclientsink HTTP client sink Generic Sends streams to HTTP server via PUT David Schleef <ds@entropywave.com> sink sink always
ANY
souphttpsrc HTTP client source Source/Network Receive data as a client over the network via HTTP using SOUP Wouter Cloetens <wouter@mind.be> src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-dv.xml0000644000175000017500000000525411720564144020516 00000000000000 dv DV demuxer and decoder based on libdv (libdv.sf.net) ../../ext/dv/.libs/libgstdv.so libgstdv.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin dvdec DV video decoder Codec/Decoder/Video Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net) Erik Walthinsen <omega@cse.ogi.edu>,Wim Taymans <wim@fluendo.com> sink sink always
video/x-dv, systemstream=(boolean)false
src source always
video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]
dvdemux DV system stream demuxer Codec/Demuxer Uses libdv to separate DV audio from DV video (libdv.sourceforge.net) Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com> sink sink always
video/x-dv, systemstream=(boolean)true
audio source sometimes
audio/x-raw-int, depth=(int)16, width=(int)16, signed=(boolean)true, channels=(int){ 2, 4 }, endianness=(int)1234, rate=(int){ 32000, 44100, 48000 }
video source sometimes
video/x-dv, systemstream=(boolean)false
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-jpeg.xml0000644000175000017500000001577711720564144021045 00000000000000 jpeg JPeg plugin library ../../ext/jpeg/.libs/libgstjpeg.so libgstjpeg.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin jpegdec JPEG image decoder Codec/Decoder/Image Decode images from JPEG format Wim Taymans <wim@fluendo.com> sink sink always
image/jpeg, width=(int)[ 1, 65535 ], height=(int)[ 1, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ], sof-marker=(int){ 0, 1, 2, 5, 6, 7, 9, 10, 13, 14 }
src source always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
jpegenc JPEG image encoder Codec/Encoder/Image Encode images in JPEG format Wim Taymans <wim.taymans@tvd.be> sink sink always
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, Y41B, Y42B, YVYU, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
image/jpeg, width=(int)[ 16, 65535 ], height=(int)[ 16, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
smokedec Smoke video decoder Codec/Decoder/Video Decode video from Smoke format Wim Taymans <wim@fluendo.com> sink sink always
video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
smokeenc Smoke video encoder Codec/Encoder/Video Encode images into the Smoke format Wim Taymans <wim@fluendo.com> sink sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-rtsp.xml0000644000175000017500000000407611720564144021076 00000000000000 rtsp transfer data via RTSP ../../gst/rtsp/.libs/libgstrtsp.so libgstrtsp.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin rtpdec RTP Decoder Codec/Parser/Network Accepts raw RTP and RTCP packets and sends them forward Wim Taymans <wim@fluendo.com> recv_rtcp_sink_%d sink request
application/x-rtcp
recv_rtp_sink_%d sink request
application/x-rtp
recv_rtp_src_%d_%d_%d source sometimes
application/x-rtp
rtcp_src_%d source request
application/x-rtcp
rtspsrc RTSP packet receiver Source/Network Receive data over the network via RTSP (RFC 2326) Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com>, Lutz Mueller <lutz@topfrose.de> stream%d source sometimes
application/x-rtp; application/x-rdt
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-cairo.xml0000644000175000017500000001336111720564144021200 00000000000000 cairo Cairo-based elements ../../ext/cairo/.libs/libgstcairo.so libgstcairo.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin cairooverlay Cairo overlay Filter/Editor/Video Render overlay on a video stream using Cairo Jon Nordby <jononor@gmail.com> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
cairorender Cairo encoder Codec/Encoder Encodes streams using Cairo Lutz Mueller <lutz@topfrose.de> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
src source always
application/pdf, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; application/postscript, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/svg+xml, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
cairotextoverlay Text overlay Filter/Editor/Video Adds text strings on top of a video buffer David Schleef <ds@schleef.org> text_sink sink always
text/plain
video_sink sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
cairotimeoverlay Time overlay Filter/Editor/Video Overlays the time on a video stream David Schleef <ds@schleef.org> sink sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-efence.xml0000644000175000017500000000305411720564144021326 00000000000000 efence 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 "Electric Fence". ../../gst/debugutils/.libs/libgstefence.so libgstefence.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin efence Electric Fence Testing 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 "Electric Fence". David A. Schleef <ds@schleef.org> sink sink always
ANY
src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-annodex.xml0000644000175000017500000000346411720564144021542 00000000000000 annodex annodex stream manipulation (info about annodex: http://www.annodex.net) ../../ext/annodex/.libs/libgstannodex.so libgstannodex.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin cmmldec CMML stream decoder Codec/Decoder Decodes CMML streams Alessandro Decina <alessandro@nnva.org> sink sink always
text/x-cmml, encoded=(boolean)true
src source always
text/x-cmml, encoded=(boolean)false
cmmlenc CMML streams encoder Codec/Encoder Encodes CMML streams Alessandro Decina <alessandro@nnva.org> sink sink always
text/x-cmml, encoded=(boolean)false
src source always
text/x-cmml, encoded=(boolean)true
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-avi.xml0000644000175000017500000004416511720564144020670 00000000000000 avi AVI stream handling ../../gst/avi/.libs/libgstavi.so libgstavi.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin avidemux Avi demuxer Codec/Demuxer Demultiplex an avi file into audio and video Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>, Thijs Vermeir <thijsvermeir@gmail.com> sink sink always
video/x-msvideo
audio_%02d source sometimes
audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-dts; audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]; audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/AMR, rate=(int)8000, channels=(int)1; audio/AMR-WB, rate=(int)16000, channels=(int)1; audio/x-siren; application/x-ogg-avi; audio/x-avi-unknown
subtitle_%02d source sometimes
application/x-subtitle-avi
video_%02d source sometimes
video/x-3ivx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-asus, asusversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-asus, asusversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-cirrus-logic-accupak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-camstudio, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-compressed-yuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-rgb, bpp=(int){ 8, 24, 32 }, depth=(int){ 8, 24 }, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-truemotion, trueversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, dvversion=(int)25, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, dvversion=(int)50, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-flash-video, flvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)lucent, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-huffyuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-intel-h263, variant=(string)intel, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)microsoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/jpeg, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)42, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)43, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, systemstream=(boolean)false, mpegversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, systemstream=(boolean)false, mpegversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)41, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-mszh, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; image/png, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-rle, layout=(string)microsoft, depth=(int)[ 1, 64 ], framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-indeo, indeoversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/sp5x, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-truemotion, trueversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-camtasia, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ultimotion, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ati-vcr, vcrversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ati-vcr, vcrversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)vdolive, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)vivo, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vmnc, version=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)videosoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-wmv, wmvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-wmv, wmvversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-wmv, wmvversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xvid, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xan, wcversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)YVU9, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-zlib, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-cinepak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msvideocodec, msvideoversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, variant=(string)xirlink, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dirac, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-ffv, ffvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-kmvc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp6, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp7, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-vp8, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-mimic, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-apple-video, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-theora, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-fraps, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-aasc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-raw-yuv, format=(fourcc)YV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-loco, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-zmbv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)true; video/x-avi-unknown
avimux Avi muxer Codec/Muxer Muxes audio and video into an avi stream GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> audio_%d sink request
audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-wma, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], wmaversion=(int)[ 1, 2 ]
video_%d sink request
video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], divxversion=(int)[ 3, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], msmpegversion=(int)[ 41, 43 ]; video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dv, width=(int)720, height=(int){ 576, 480 }, framerate=(fraction)[ 0/1, 2147483647/1 ], systemstream=(boolean)false; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], wmvversion=(int)[ 1, 3 ]; image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-vp8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-msvideo
avisubtitle Avi subtitle parser Codec/Parser/Subtitle Parse avi subtitle stream Thijs Vermeir <thijsvermeir@gmail.com> sink sink always
application/x-subtitle-avi
src source always
application/x-subtitle
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-multipart.xml0000644000175000017500000000335111720564144022122 00000000000000 multipart multipart stream manipulation ../../gst/multipart/.libs/libgstmultipart.so libgstmultipart.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin multipartdemux Multipart demuxer Codec/Demuxer demux multipart streams Wim Taymans <wim.taymans@gmail.com>, Sjoerd Simons <sjoerd@luon.net> sink sink always
multipart/x-mixed-replace
src_%d source sometimes
ANY
multipartmux Multipart muxer Codec/Muxer mux multipart streams Wim Taymans <wim@fluendo.com> sink_%d sink request
ANY
src source always
multipart/x-mixed-replace
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-interleave.xml0000644000175000017500000000612711720564144022243 00000000000000 interleave Audio interleaver/deinterleaver ../../gst/interleave/.libs/libgstinterleave.so libgstinterleave.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin deinterleave Audio deinterleaver Filter/Converter/Audio Splits one interleaved multichannel audio stream into many mono audio streams Andy Wingo <wingo at pobox.com>, Iain <iain@prettypeople.org>, Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
src%d source sometimes
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
interleave Audio interleaver Filter/Converter/Audio Folds many mono channels into one interleaved audio stream Andy Wingo <wingo at pobox.com>, Sebastian Dröge <slomo@circular-chaos.org> sink%d sink request
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
src source always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-shout2send.xml0000644000175000017500000000204311720564144022174 00000000000000 shout2send Sends data to an icecast server using libshout2 ../../ext/shout2/.libs/libgstshout2.so libgstshout2.so 0.10.31 LGPL gst-plugins-good libshout2 http://www.icecast.org/download.html shout2send Icecast network sink Sink/Network Sends data to an icecast server Wim Taymans <wim.taymans@chello.be>, Pedro Corte-Real <typo@netcabo.pt>, Zaheer Abbas Merali <zaheerabbas at merali dot org> sink sink always
application/ogg; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-ximagesrc.xml0000644000175000017500000000224511720564144022064 00000000000000 ximagesrc X11 video input plugin using standard Xlib calls ../../sys/ximage/.libs/libgstximagesrc.so libgstximagesrc.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin ximagesrc Ximage video source Source/Video Creates a screenshot video stream Lutz Mueller <lutz@users.sourceforge.net>, Jan Schmidt <thaytan@mad.scientist.com>, Zaheer Merali <zaheerabbas at merali dot org> src source always
video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], pixel-aspect-ratio=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-audiofx.xml0000644000175000017500000003250211720564144021540 00000000000000 audiofx Audio effects plugin ../../gst/audiofx/.libs/libgstaudiofx.so libgstaudiofx.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin audioamplify Audio amplifier Filter/Effect/Audio Amplifies an audio stream by a given factor Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiochebband Band pass & band reject filter Filter/Effect/Audio Chebyshev band pass and band reject filter Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiocheblimit Low pass & high pass filter Filter/Effect/Audio Chebyshev low pass and high pass filter Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiodynamic Dynamic range controller Filter/Effect/Audio Compressor and Expander Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audioecho Audio echo Filter/Effect/Audio Adds an echo or reverb effect to an audio stream Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiofirfilter Audio FIR filter Filter/Effect/Audio Generic audio FIR filter with custom filter kernel Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audioiirfilter Audio IIR filter Filter/Effect/Audio Generic audio IIR filter with custom filter kernel Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audioinvert Audio inversion Filter/Effect/Audio Swaps upper and lower half of audio samples Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiokaraoke AudioKaraoke Filter/Effect/Audio Removes voice from sound Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiopanorama Stereo positioning Filter/Effect/Audio Positions audio streams in the stereo panorama Stefan Kost <ensonic@users.sf.net> sink sink always
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
src source always
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)32; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
audiowsincband Band pass & band reject filter Filter/Effect/Audio Band pass and band reject windowed sinc filter Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
audiowsinclimit Low pass & high pass filter Filter/Effect/Audio Low pass and high pass windowed sinc filter Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-pulseaudio.xml0000644000175000017500000001222311720564144022251 00000000000000 pulseaudio PulseAudio plugin library ../../ext/pulse/.libs/libgstpulse.so libgstpulse.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin pulseaudiosink Bin wrapping pulsesink Sink/Audio/Bin Correctly handles sink changes when streaming compressed formats to pulsesink Arun Raghavan <arun.raghavan@collabora.co.uk> sink sink always
audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-ac3, framed=(boolean)true; audio/x-eac3, framed=(boolean)true; audio/x-dts, framed=(boolean)true, block-size=(int){ 512, 1024, 2048 }; audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)[ 1, 2 ], parsed=(boolean)true
pulsemixer PulseAudio Mixer Generic/Audio Control sound input and output levels for PulseAudio Lennart Poettering pulsesink PulseAudio Audio Sink Sink/Audio Plays audio to a PulseAudio server Lennart Poettering sink sink always
audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-ac3, framed=(boolean)true; audio/x-eac3, framed=(boolean)true; audio/x-dts, framed=(boolean)true, block-size=(int){ 512, 1024, 2048 }; audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)[ 1, 2 ], parsed=(boolean)true
pulsesrc PulseAudio Audio Source Source/Audio Captures audio from a PulseAudio server Lennart Poettering src source always
audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-id3demux.xml0000644000175000017500000000215111720564144021620 00000000000000 id3demux Demux ID3v1 and ID3v2 tags from a file ../../gst/id3demux/.libs/libgstid3demux.so libgstid3demux.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin id3demux ID3 tag demuxer Codec/Demuxer/Metadata Read and output ID3v1 and ID3v2 tags while demuxing the contents Jan Schmidt <thaytan@mad.scientist.com> sink sink always
application/x-id3
src source sometimes
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-deinterlace.xml0000644000175000017500000001461711720564144022367 00000000000000 deinterlace Deinterlacer ../../gst/deinterlace/.libs/libgstdeinterlace.so libgstdeinterlace.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin deinterlace Deinterlacer Filter/Effect/Video/Deinterlace Deinterlace Methods ported from DScaler/TvTime Martin Eikermann <meiker@upb.de>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-smpte.xml0000644000175000017500000001163611720564144021236 00000000000000 smpte Apply the standard SMPTE transitions on video images ../../gst/smpte/.libs/libgstsmpte.so libgstsmpte.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin smpte SMPTE transitions Filter/Editor/Video Apply the standard SMPTE transitions on video images Wim Taymans <wim.taymans@chello.be> sink1 sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
sink2 sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
smptealpha SMPTE transitions Filter/Editor/Video Apply the standard SMPTE transitions as alpha on video images Wim Taymans <wim.taymans@gmail.com> sink sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-mulaw.xml0000644000175000017500000000412211720564144021223 00000000000000 mulaw MuLaw audio conversion routines ../../gst/law/.libs/libgstmulaw.so libgstmulaw.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin mulawdec Mu Law audio decoder Codec/Decoder/Audio Convert 8bit mu law to 16bit PCM Zaheer Abbas Merali <zaheerabbas at merali dot org> sink sink always
audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
src source always
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
mulawenc Mu Law audio encoder Codec/Encoder/Audio Convert 16bit PCM to 8bit mu law Zaheer Abbas Merali <zaheerabbas at merali dot org> sink sink always
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
src source always
audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-apetag.xml0000644000175000017500000000210611720564144021337 00000000000000 apetag APEv1/2 tag reader ../../gst/apetag/.libs/libgstapetag.so libgstapetag.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin apedemux APE tag demuxer Codec/Demuxer/Metadata Read and output APE tags while demuxing the contents Tim-Philipp Müller <tim centricular net> sink sink always
application/x-apetag
src source sometimes
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-effectv.xml0000644000175000017500000005745211720564144021536 00000000000000 effectv effect plugins from the effectv project ../../gst/effectv/.libs/libgsteffectv.so libgsteffectv.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin agingtv AgingTV effect Filter/Effect/Video AgingTV adds age to video input using scratches and dust Sam Lantinga <slouken@devolution.com> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
dicetv DiceTV effect Filter/Effect/Video 'Dices' the screen up into many small squares Wim Taymans <wim.taymans@chello.be> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
edgetv EdgeTV effect Filter/Effect/Video Apply edge detect on video Wim Taymans <wim.taymans@chello.be> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
optv OpTV effect Filter/Effect/Video Optical art meets real-time video effect FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
quarktv QuarkTV effect Filter/Effect/Video Motion dissolver FUKUCHI, Kentarou <fukuchi@users.sourceforge.net> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
radioactv RadioacTV effect Filter/Effect/Video motion-enlightment effect FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
revtv RevTV effect Filter/Effect/Video A video waveform monitor for each line of video processed Wim Taymans <wim.taymans@chello.be> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
rippletv RippleTV effect Filter/Effect/Video RippleTV does ripple mark effect on the video input FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
shagadelictv ShagadelicTV Filter/Effect/Video Oh behave, ShagedelicTV makes images shagadelic! Wim Taymans <wim.taymans@chello.be> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
streaktv StreakTV effect Filter/Effect/Video StreakTV makes after images of moving objects FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
vertigotv VertigoTV effect Filter/Effect/Video A loopback alpha blending effector with rotating and scaling Wim Taymans <wim.taymans@chello.be> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
warptv WarpTV effect Filter/Effect/Video WarpTV does realtime goo'ing of the video input Sam Lantinga <slouken@devolution.com> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-goom.xml0000644000175000017500000000264211720564144021044 00000000000000 goom GOOM visualization filter ../../gst/goom/.libs/libgstgoom.so libgstgoom.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin goom GOOM: what a GOOM! Visualization Takes frames of data and outputs video frames using the GOOM filter Wim Taymans <wim@fluendo.com> sink sink always
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-gdkpixbuf.xml0000644000175000017500000001011111720564144022054 00000000000000 gdkpixbuf GdkPixbuf-based image decoder, scaler and sink ../../ext/gdk_pixbuf/.libs/libgstgdkpixbuf.so libgstgdkpixbuf.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin gdkpixbufdec GdkPixbuf image decoder Codec/Decoder/Image Decodes images in a video stream using GdkPixbuf David A. Schleef <ds@schleef.org>, Renato Filho <renato.filho@indt.org.br> sink sink always
image/png; image/gif; image/x-icon; application/x-navi-animation; image/x-cmu-raster; image/x-sun-raster; image/x-pixmap; image/tiff; image/x-portable-anymap; image/x-portable-bitmap; image/x-portable-graymap; image/x-portable-pixmap; image/bmp; image/x-bmp; image/x-MS-bmp; image/vnd.wap.wbmp; image/x-bitmap; image/x-tga; image/x-pcx; image/svg; image/svg+xml
src source always
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gdkpixbufscale GdkPixbuf image scaler Filter/Effect/Video Resizes video Jan Schmidt <thaytan@mad.scientist.com>, Wim Taymans <wim.taymans@chello.be>, Renato Filho <renato.filho@indt.org.br> sink sink always
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gdkpixbufsink GdkPixbuf sink Sink/Video Output images as GdkPixbuf objects in bus messages Tim-Philipp Müller <tim centricular net> sink sink always
video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-audioparsers.xml0000644000175000017500000001250511720564144022603 00000000000000 audioparsers Parsers for various audio formats ../../gst/audioparsers/.libs/libgstaudioparsers.so libgstaudioparsers.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin aacparse AAC audio stream parser Codec/Parser/Audio Advanced Audio Coding parser Stefan Kost <stefan.kost@nokia.com> sink sink always
audio/mpeg, mpegversion=(int){ 2, 4 }
src source always
audio/mpeg, framed=(boolean)true, mpegversion=(int){ 2, 4 }, stream-format=(string){ raw, adts, adif }
ac3parse AC3 audio stream parser Codec/Parser/Converter/Audio AC3 parser Tim-Philipp Müller <tim centricular net> sink sink always
audio/x-ac3; audio/x-eac3; audio/ac3
src source always
audio/x-ac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }; audio/x-eac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }
amrparse AMR audio stream parser Codec/Parser/Audio Adaptive Multi-Rate audio parser Ronald Bultje <rbultje@ronald.bitfreak.net> sink sink always
audio/x-amr-nb-sh; audio/x-amr-wb-sh
src source always
audio/AMR, rate=(int)8000, channels=(int)1; audio/AMR-WB, rate=(int)16000, channels=(int)1
dcaparse DTS Coherent Acoustics audio stream parser Codec/Parser/Audio DCA parser Tim-Philipp Müller <tim centricular net> sink sink always
audio/x-dts
src source always
audio/x-dts, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 192000 ], depth=(int){ 14, 16 }, endianness=(int){ 1234, 4321 }, block-size=(int)[ 1, 2147483647 ], frame-size=(int)[ 1, 2147483647 ]
flacparse FLAC audio parser Codec/Parser/Audio Parses audio with the FLAC lossless audio codec Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-flac
src source always
audio/x-flac, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 1, 655350 ]
mpegaudioparse MPEG1 Audio Parser Codec/Parser/Audio Parses and frames mpeg1 audio streams (levels 1-3), provides seek Jan Schmidt <thaytan@mad.scientist.com>,Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> sink sink always
audio/mpeg, mpegversion=(int)1
src source always
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], mpegaudioversion=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], parsed=(boolean)true
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-videobox.xml0000644000175000017500000002262211720564144021722 00000000000000 videobox resizes a video by adding borders or cropping ../../gst/videobox/.libs/libgstvideobox.so libgstvideobox.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin videobox Video box filter Filter/Effect/Video Resizes a video by adding borders or cropping Wim Taymans <wim@fluendo.com> sink sink always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-replaygain.xml0000644000175000017500000000736311720564144022243 00000000000000 replaygain ReplayGain volume normalization ../../gst/replaygain/.libs/libgstreplaygain.so libgstreplaygain.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin rganalysis ReplayGain analysis Filter/Analyzer/Audio Perform the ReplayGain analysis René Stadler <mail@renestadler.de> sink sink always
audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }; audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
src source always
audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }; audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }
rglimiter ReplayGain limiter Filter/Effect/Audio Apply signal compression to raw audio data René Stadler <mail@renestadler.de> sink sink always
audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234
src source always
audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234
rgvolume ReplayGain volume Filter/Effect/Audio Apply ReplayGain volume adjustment René Stadler <mail@renestadler.de> sink sink always
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
src source always
audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-udp.xml0000644000175000017500000000437611720564144020701 00000000000000 udp transfer data via UDP ../../gst/udp/.libs/libgstudp.so libgstudp.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin dynudpsink UDP packet sender Sink/Network Send data over the network via UDP Philippe Khalaf <burger@speedy.org> sink sink always
ANY
multiudpsink UDP packet sender Sink/Network Send data over the network via UDP Wim Taymans <wim.taymans@gmail.com> sink sink always
ANY
udpsink UDP packet sender Sink/Network Send data over the network via UDP Wim Taymans <wim@fluendo.com> sink sink always
ANY
udpsrc UDP packet receiver Source/Network Receive data over the network via UDP Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com> src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-wavpack.xml0000644000175000017500000000705411720564144021541 00000000000000 wavpack Wavpack lossless/lossy audio format handling ../../ext/wavpack/.libs/libgstwavpack.so libgstwavpack.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin wavpackdec Wavpack audio decoder Codec/Decoder/Audio Decodes Wavpack audio data Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
src source always
audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], endianness=(int)1234, signed=(boolean)true
wavpackenc Wavpack audio encoder Codec/Encoder/Audio Encodes audio with the Wavpack lossless/lossy audio codec Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], endianness=(int)1234, channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], signed=(boolean)true
src source always
audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 2 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
wvcsrc source sometimes
audio/x-wavpack-correction, framed=(boolean)true
wavpackparse Wavpack parser Codec/Demuxer/Audio Parses Wavpack files Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org> sink sink always
audio/x-wavpack, framed=(boolean)false; audio/x-wavpack-correction, framed=(boolean)false
src source sometimes
audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true
wvcsrc source sometimes
audio/x-wavpack-correction, framed=(boolean)true
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-speex.xml0000644000175000017500000000373611720564144021234 00000000000000 speex Speex plugin library ../../ext/speex/.libs/libgstspeex.so libgstspeex.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin speexdec Speex audio decoder Codec/Decoder/Audio decode speex streams to audio Wim Taymans <wim@fluendo.com> sink sink always
audio/x-speex
src source always
audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16
speexenc Speex audio encoder Codec/Encoder/Audio Encodes audio in Speex format Wim Taymans <wim@fluendo.com> sink sink always
audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16
src source always
audio/x-speex, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-osxvideo.xml0000644000175000017500000000124611671175352021746 00000000000000 osxvideo OSX native video output plugin ../../ext/osxvideo/.libs/libgstosxvideo.so libgstosxvideo.so 0.10.4 LGPL gst-plugins-bad Gstreamer http://gstreamer.freedesktop.org osxvideosink OSX Video sink Sink/Video OSX native videosink Zaheer Abbas Merali <zaheerabas at merali dot org> gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-oss4.xml0000644000175000017500000000657711720564144021006 00000000000000 oss4 Open Sound System (OSS) version 4 support for GStreamer ../../sys/oss4/.libs/libgstoss4audio.so libgstoss4audio.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin oss4mixer OSS v4 Audio Mixer Generic/Audio Control sound input and output levels with OSS4 Tim-Philipp Müller <tim centricular net> oss4sink OSS v4 Audio Sink Sink/Audio Output to a sound card via OSS version 4 Tim-Philipp Müller <tim centricular net> sink sink always
audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]
oss4src OSS v4 Audio Source Source/Audio Capture from a sound card via OSS version 4 Tim-Philipp Müller <tim centricular net> src source always
audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-debug.xml0000644000175000017500000001436311720564144021174 00000000000000 debug elements for testing and debugging ../../gst/debugutils/.libs/libgstdebug.so libgstdebug.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin breakmydata Break my data Testing randomly change data in the stream Benjamin Otte <otte@gnome> sink sink always
ANY
src source always
ANY
capsdebug Caps debug Generic Debug caps negotiation David Schleef <ds@schleef.org> sink sink always
ANY
src source always
ANY
capssetter CapsSetter Generic Set/merge caps on stream Mark Nauwelaerts <mnauw@users.sourceforge.net> sink sink always
ANY
src source always
ANY
cpureport CPU report Testing Post cpu usage information every buffer Zaheer Abbas Merali <zaheerabbas at merali dot org> sink sink always
ANY
src source always
ANY
navseek Seek based on left-right arrows Filter/Video Seek based on navigation keys left-right Jan Schmidt <thaytan@mad.scientist.com> sink sink always
ANY
src source always
ANY
progressreport Progress report Testing Periodically query and report on processing progress Jan Schmidt <thaytan@mad.scientist.com> sink sink always
ANY
src source always
ANY
pushfilesrc Push File Source Testing Implements pushfile:// URI-handler for push-based file access Tim-Philipp Müller <tim centricular net> src source always
ANY
rndbuffersize Random buffer size Testing pull random sized buffers Stefan Kost <stefan.kost@nokia.com> sink sink always
ANY
src source always
ANY
taginject TagInject Generic inject metadata tags Stefan Kost <ensonic@users.sf.net> sink sink always
ANY
src source always
ANY
testsink Test plugin Testing perform a number of tests Benjamin Otte <otte@gnome> sink sink always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-multifile.xml0000644000175000017500000000360411720564144022074 00000000000000 multifile Reads/Writes buffers from/to sequentially named files ../../gst/multifile/.libs/libgstmultifile.so libgstmultifile.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin multifilesink Multi-File Sink Sink/File Write buffers to a sequentially named set of files David Schleef <ds@schleef.org> sink sink always
ANY
multifilesrc Multi-File Source Source/File Read a sequentially named set of files into buffers David Schleef <ds@schleef.org> src source always
ANY
splitfilesrc Split-File Source Source/File Read a sequentially named set of files as if it was one large file Tim-Philipp Müller <tim.muller@collabora.co.uk> src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-icydemux.xml0000644000175000017500000000224711720564144021733 00000000000000 icydemux Demux ICY tags from a stream ../../gst/icydemux/.libs/libgsticydemux.so libgsticydemux.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin icydemux ICY tag demuxer Codec/Demuxer/Metadata Read and output ICY tags while demuxing the contents Jan Schmidt <thaytan@mad.scientist.com>, Michael Smith <msmith@fluendo.com> sink sink always
application/x-icy, metadata-interval=(int)[ 0, 2147483647 ]
src source sometimes
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-waveform.xml0000644000175000017500000000124511671175352021733 00000000000000 waveform WaveForm API based plugin ../../win32/vs6/release/libgstwaveform.dll libgstwaveform.dll 0.10.4.1 LGPL gst-plugins-bad GStreamer Good Plug-ins CVS Unknown package origin waveformsink WaveForm audio sink Sink/Audio WaveForm audio sink Sebastien Moutte <sebastien@moutte.net> gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-matroska.xml0000644000175000017500000001767711720564144021742 00000000000000 matroska Matroska and WebM stream handling ../../gst/matroska/.libs/libgstmatroska.so libgstmatroska.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin matroskademux Matroska demuxer Codec/Demuxer Demuxes Matroska/WebM streams into video/audio/subtitles GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> sink sink always
video/x-matroska; video/webm
audio_%02d source sometimes
ANY
subtitle_%02d source sometimes
text/x-pango-markup; application/x-ssa; application/x-ass; application/x-usf; video/x-dvd-subpicture; subpicture/x-pgs; subtitle/x-kate; application/x-subtitle-unknown
video_%02d source sometimes
ANY
matroskamux Matroska muxer Codec/Muxer Muxes video/audio/subtitle streams into a matroska stream GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> audio_%d sink request
audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, stream-format=(string)raw, 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 ]; audio/x-alaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]; audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]
subtitle_%d sink request
subtitle/x-kate
video_%d sink request
video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-theora; video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-pn-realvideo, rmversion=(int)[ 1, 4 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc){ YUY2, I420, YV12, UYVY, AYUV }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-wmv, wmvversion=(int)[ 1, 3 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-matroska
matroskaparse Matroska parser Codec/Parser Parses Matroska/WebM streams into video/audio/subtitles GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> sink sink always
video/x-matroska; video/webm
src source always
video/x-matroska; video/webm
webmmux WebM muxer Codec/Muxer Muxes video and audio streams into a WebM stream GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> audio_%d sink request
audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]
video_%d sink request
video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/webm
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-alphacolor.xml0000644000175000017500000000672211720564144022232 00000000000000 alphacolor RGBA from/to AYUV colorspace conversion preserving the alpha channel ../../gst/alpha/.libs/libgstalphacolor.so libgstalphacolor.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin alphacolor Alpha color filter Filter/Converter/Video ARGB from/to AYUV colorspace conversion preserving the alpha channel Wim Taymans <wim@fluendo.com> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-jack.xml0000644000175000017500000000303111720564144021004 00000000000000 jack JACK audio elements ../../ext/jack/.libs/libgstjack.so libgstjack.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin jackaudiosink Audio Sink (Jack) Sink/Audio Output audio to a JACK server Wim Taymans <wim.taymans@gmail.com> sink sink always
audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
jackaudiosrc Audio Source (Jack) Source/Audio Captures audio from a JACK server Tristan Matthews <tristan@sat.qc.ca> src source always
audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-navigationtest.xml0000644000175000017500000000257211720564144023144 00000000000000 navigationtest Template for a video filter ../../gst/debugutils/.libs/libgstnavigationtest.so libgstnavigationtest.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin navigationtest Video navigation test Filter/Effect/Video Handle navigation events showing a black square following mouse pointer David Schleef <ds@schleef.org> sink sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-equalizer.xml0000644000175000017500000000775311720564144022114 00000000000000 equalizer GStreamer audio equalizers ../../gst/equalizer/.libs/libgstequalizer.so libgstequalizer.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin equalizer-10bands 10 Band Equalizer Filter/Effect/Audio Direct Form 10 band IIR equalizer Stefan Kost <ensonic@users.sf.net> sink sink always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
equalizer-3bands 3 Band Equalizer Filter/Effect/Audio Direct Form 3 band IIR equalizer Stefan Kost <ensonic@users.sf.net> sink sink always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
equalizer-nbands N Band Equalizer Filter/Effect/Audio Direct Form IIR equalizer Benjamin Otte <otte@gnome.org>, Stefan Kost <ensonic@users.sf.net> sink sink always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-esdsink.xml0000644000175000017500000000215411720564144021541 00000000000000 esdsink ESD Element Plugins ../../ext/esd/.libs/libgstesd.so libgstesd.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin esdsink Esound audio sink Sink/Audio Plays audio to an esound server Arwed von Merkatz <v.merkatz@gmx.net> sink sink always
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-isomp4.xml0000644000175000017500000003343111720564144021316 00000000000000 isomp4 ISO base media file format support (mp4, 3gpp, qt, mj2) ../../gst/isomp4/.libs/libgstisomp4.so libgstisomp4.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin 3gppmux 3GPP Muxer Codec/Muxer Multiplex audio and video into a 3GPP file Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> audio_%d sink request
audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
video_%d sink request
video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/quicktime, variant=(string)3gpp
gppmux 3GPP Muxer Codec/Muxer Multiplex audio and video into a 3GPP file (deprecated) Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> audio_%d sink request
audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
video_%d sink request
video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/quicktime, variant=(string)3gpp
ismlmux ISML Muxer Codec/Muxer Multiplex audio and video into a ISML file Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> audio_%d sink request
audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]
video_%d sink request
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/quicktime, variant=(string)iso-fragmented
mj2mux MJ2 Muxer Codec/Muxer Multiplex audio and video into a MJ2 file Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> audio_%d sink request
audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true
video_%d sink request
image/x-j2c, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/x-jpc, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/mj2
mp4mux MP4 Muxer Codec/Muxer Multiplex audio and video into a MP4 file Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> audio_%d sink request
audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]; audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]
video_%d sink request
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-mp4-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/quicktime, variant=(string)iso
qtdemux QuickTime demuxer Codec/Demuxer Demultiplex a QuickTime file into audio and video streams David Schleef <ds@schleef.org>, Wim Taymans <wim@fluendo.com> sink sink always
video/quicktime; video/mj2; audio/x-m4a; application/x-3gp
audio_%02d source sometimes
ANY
subtitle_%02d source sometimes
ANY
video_%02d source sometimes
ANY
qtmoovrecover QT Moov Recover Util Recovers unfinished qtmux files Thiago Santos <thiago.sousa.santos@collabora.co.uk> qtmux QuickTime Muxer Codec/Muxer Multiplex audio and video into a QuickTime file Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> audio_%d sink request
audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true; audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true; audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 64, 8096 ], channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/x-alaw, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]; audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]; audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]
video_%d sink request
video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-svq, svqversion=(int)3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dv, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-qt-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/quicktime, variant=(string)apple; video/quicktime
rtpxqtdepay RTP packet depayloader Codec/Depayloader/Network Extracts Quicktime audio/video from RTP packets Wim Taymans <wim@fluendo.com> sink sink always
application/x-rtp, payload=(int)[ 96, 127 ], media=(string){ audio, video }, clock-rate=(int)[ 1, 2147483647 ], encoding-name=(string){ X-QT, X-QUICKTIME }
src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-wavparse.xml0000644000175000017500000000657211720564144021741 00000000000000 wavparse Parse a .wav file into raw audio ../../gst/wavparse/.libs/libgstwavparse.so libgstwavparse.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin wavparse WAV audio demuxer Codec/Demuxer/Audio Parse a .wav file into raw audio Erik Walthinsen <omega@cse.ogi.edu> wavparse_sink sink always
audio/x-wav
wavparse_src source sometimes
audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-dts; audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]; audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]; audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]; audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]; audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]; audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/AMR, rate=(int)8000, channels=(int)1; audio/AMR-WB, rate=(int)16000, channels=(int)1; audio/x-siren; application/x-ogg-avi
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-png.xml0000644000175000017500000000617311720564144020672 00000000000000 png PNG plugin library ../../ext/libpng/.libs/libgstpng.so libgstpng.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin pngdec PNG image decoder Codec/Decoder/Image Decode a png video frame to a raw image Wim Taymans <wim@fluendo.com> sink sink always
image/png
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)64, depth=(int)64, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
pngenc PNG image encoder Codec/Encoder/Image Encode a video frame to a .png image Jeremy SIMON <jsimon13@yahoo.fr> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
image/png, width=(int)[ 16, 1000000 ], height=(int)[ 16, 1000000 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-flac.xml0000644000175000017500000000560711720564144021014 00000000000000 flac The FLAC Lossless compressor Codec ../../ext/flac/.libs/libgstflac.so libgstflac.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin flacdec FLAC audio decoder Codec/Decoder/Audio Decodes FLAC lossless audio streams Wim Taymans <wim@fluendo.com> sink sink always
audio/x-flac
src source always
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 8, 16, 32 }, depth=(int)[ 4, 32 ], rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]
flacenc FLAC audio encoder Codec/Encoder/Audio Encodes audio with the FLAC lossless audio encoder Wim Taymans <wim.taymans@chello.be> sink sink always
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)8, depth=(int)8, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int){ 12, 16 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int){ 20, 24 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]
src source always
audio/x-flac
flactag FLAC tagger Formatter/Metadata Rewrite tags in a FLAC file Christophe Fergeau <teuf@gnome.org> sink sink always
audio/x-flac
src source always
audio/x-flac
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-alpha.xml0000644000175000017500000002104511720564144021166 00000000000000 alpha adds an alpha channel to video - constant or via chroma-keying ../../gst/alpha/.libs/libgstalpha.so libgstalpha.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin alpha Alpha filter Filter/Effect/Video Adds an alpha channel to video - uniform or via chroma-keying Wim Taymans <wim@fluendo.com> Edward Hervey <edward.hervey@collabora.co.uk> Jan Schmidt <thaytan@noraisin.net> sink sink always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-halelements.xml0000644000175000017500000000256711720564144022412 00000000000000 halelements elements wrapping the GStreamer/HAL audio input/output devices ../../ext/hal/.libs/libgsthalelements.so libgsthalelements.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin halaudiosink HAL audio sink Sink/Audio Audio sink for sound device access via HAL Jürg Billeter <j@bitron.ch> sink sink always
ANY
halaudiosrc HAL audio source Source/Audio Audio source for sound device access via HAL Jürg Billeter <j@bitron.ch> src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-video4linux2.xml0000644000175000017500000001305411720564144022436 00000000000000 video4linux2 elements for Video 4 Linux ../../sys/v4l2/.libs/libgstvideo4linux2.so libgstvideo4linux2.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin v4l2radio Radio (video4linux2) Tuner Tuner Controls a Video4Linux2 radio device Alexey Chernov <4ernov@gmail.com> v4l2src Video (video4linux2) Source Source/Video Reads frames from a Video4Linux2 device Edgard Lima <edgard.lima@indt.org.br>, Stefan Kost <ensonic@users.sf.net> src source always
video/x-raw-rgb, bpp=(int)8, depth=(int)8, red_mask=(int)224, green_mask=(int)28, blue_mask=(int)3, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YVU9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)Y41P, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YUV9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-dv, systemstream=(boolean)true, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/mpegts; video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-y4menc.xml0000644000175000017500000000244211720564144021300 00000000000000 y4menc Encodes a YUV frame into the yuv4mpeg format (mjpegtools) ../../gst/y4m/.libs/libgsty4menc.so libgsty4menc.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin y4menc YUV4MPEG video encoder Codec/Encoder/Video Encodes a YUV frame into the yuv4mpeg format (mjpegtools) Wim Taymans <wim.taymans@gmail.com> sink sink always
video/x-raw-yuv, format=(fourcc){ IYUV, I420, Y42B, Y41B, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
application/x-yuv4mpeg, y4mversion=(int)2
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-videomixer.xml0000644000175000017500000004067011720564144022261 00000000000000 videomixer Video mixer ../../gst/videomixer/.libs/libgstvideomixer.so libgstvideomixer.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin videomixer Video mixer Filter/Editor/Video Mix multiple video streams Wim Taymans <wim@fluendo.com> sink_%d sink request
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
videomixer2 Video mixer 2 Filter/Editor/Video Mix multiple video streams Wim Taymans <wim@fluendo.com>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink_%d sink request
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-1394.xml0000644000175000017500000000321511720564144020500 00000000000000 1394 Source for video data via IEEE1394 interface ../../ext/raw1394/.libs/libgst1394.so libgst1394.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin dv1394src Firewire (1394) DV video source Source/Video Source for DV video data from firewire port Erik Walthinsen <omega@temple-baptist.com>, Daniel Fischer <dan@f3c.com>, Wim Taymans <wim@fluendo.com>, Zaheer Abbas Merali <zaheerabbas at merali dot org> src source always
video/x-dv, format=(string){ NTSC, PAL }, systemstream=(boolean)true
hdv1394src Firewire (1394) HDV video source Source/Video Source for MPEG-TS video data from firewire port Edward Hervey <bilboed@bilboed.com> src source always
video/mpegts, systemstream=(boolean)true, packetsize=(int)188
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-videofilter.xml0000644000175000017500000006236611720564144022430 00000000000000 videofilter Video filters plugin ../../gst/videofilter/.libs/libgstvideofilter.so libgstvideofilter.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin gamma Video gamma correction Filter/Effect/Video Adjusts gamma on a video stream Arwed v. Merkatz <v.merkatz@gmx.net> sink sink always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
videobalance Video balance Filter/Effect/Video Adjusts brightness, contrast, hue, saturation on a video stream David Schleef <ds@schleef.org> sink sink always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
videoflip Video flipper Filter/Effect/Video Flips and rotates video David Schleef <ds@schleef.org> sink sink always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-gconfelements.xml0000644000175000017500000000347211720564144022736 00000000000000 gconfelements elements wrapping the GStreamer/GConf audio/video output settings ../../ext/gconf/.libs/libgstgconfelements.so libgstgconfelements.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin gconfaudiosink GConf audio sink Sink/Audio Audio sink embedding the GConf-settings for audio output Jan Schmidt <thaytan@mad.scientist.com> gconfaudiosrc GConf audio source Source/Audio Audio source embedding the GConf-settings for audio input GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> gconfvideosink GConf video sink Sink/Video Video sink embedding the GConf-settings for video output GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> gconfvideosrc GConf video source Source/Video Video source embedding the GConf-settings for video input GStreamer maintainers <gstreamer-devel@lists.sourceforge.net> gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-flxdec.xml0000644000175000017500000000246511720564144021353 00000000000000 flxdec FLC/FLI/FLX video decoder ../../gst/flx/.libs/libgstflxdec.so libgstflxdec.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin flxdec FLX video decoder Codec/Decoder/Video FLC/FLI/FLX video decoder Sepp Wijnands <mrrazz@garbage-coderz.net>, Zeeshan Ali <zeenix@gmail.com> sink sink always
video/x-fli
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-level.xml0000644000175000017500000000317211720564144021211 00000000000000 level Audio level plugin ../../gst/level/.libs/libgstlevel.so libgstlevel.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin level Level Filter/Analyzer/Audio RMS/Peak/Decaying Peak Level messager for audio/raw Thomas Vander Stichele <thomas at apestaart dot org> sink sink always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }
src source always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-alaw.xml0000644000175000017500000000410611720564144021024 00000000000000 alaw ALaw audio conversion routines ../../gst/law/.libs/libgstalaw.so libgstalaw.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin alawdec A Law audio decoder Codec/Decoder/Audio Convert 8bit A law to 16bit PCM Zaheer Abbas Merali <zaheerabbas at merali dot org> sink sink always
audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
src source always
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
alawenc A Law audio encoder Codec/Encoder/Audio Convert 16bit PCM to 8bit A law Zaheer Abbas Merali <zaheerabbas at merali dot org> sink sink always
audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
src source always
audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-directsound.xml0000644000175000017500000000126011671175352022425 00000000000000 directsound DirectSound plugin ../../win32/vs6/release/libgstdirectsound.dll libgstdirectsound.dll 0.10.4.1 LGPL gst-plugins-bad GStreamer Good Plug-ins CVS Unknown package origin directsoundsink DirectSound audio sink Sink/Audio DirectSound audio sink Sebastien Moutte <sebastien@moutte.net> gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-videocrop.xml0000644000175000017500000004263511720564144022103 00000000000000 videocrop Crops video into a user-defined region ../../gst/videocrop/.libs/libgstvideocrop.so libgstvideocrop.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin aspectratiocrop aspectratiocrop Filter/Effect/Video Crops video into a user-defined aspect-ratio Thijs Vermeir <thijsvermeir@gmail.com> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
videocrop Crop Filter/Effect/Video Crops video into a user-defined region Tim-Philipp Müller <tim centricular net> sink sink always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-cutter.xml0000644000175000017500000000262311720564144021410 00000000000000 cutter Audio Cutter to split audio into non-silent bits ../../gst/cutter/.libs/libgstcutter.so libgstcutter.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin cutter Audio cutter Filter/Editor/Audio Audio Cutter to split audio into non-silent bits Thomas Vander Stichele <thomas at apestaart dot org> sink sink always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
src source always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-shapewipe.xml0000644000175000017500000000757311720564144022100 00000000000000 shapewipe Shape Wipe transition filter ../../gst/shapewipe/.libs/libgstshapewipe.so libgstshapewipe.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin shapewipe Shape Wipe transition filter Filter/Editor/Video Adds a shape wipe transition to a video stream Sebastian Dröge <sebastian.droege@collabora.co.uk> mask_sink sink always
video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1; video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1
video_sink sink always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src source always
video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-imagefreeze.xml0000644000175000017500000000226611720564144022370 00000000000000 imagefreeze Still frame stream generator ../../gst/imagefreeze/.libs/libgstimagefreeze.so libgstimagefreeze.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin imagefreeze Still frame stream generator Filter/Video Generates a still frame stream from an image Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray
src source always
video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-flv.xml0000644000175000017500000001025111720564144020665 00000000000000 flv FLV muxing and demuxing plugin ../../gst/flv/.libs/libgstflv.so libgstflv.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin flvdemux FLV Demuxer Codec/Demuxer Demux FLV feeds into digital streams Julien Moutte <julien@moutte.net> sink sink always
video/x-flv
audio source sometimes
audio/x-adpcm, layout=(string)swf, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 22050, 44100 }, parsed=(boolean)true; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true; audio/x-nellymoser, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 16000, 22050, 44100 }; audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)8, depth=(int)8, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)false; audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)16, depth=(int)16, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)true; audio/x-alaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/x-speex, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }
video source sometimes
video/x-flash-video; video/x-flash-screen; video/x-vp6-flash; video/x-vp6-alpha; video/x-h264, stream-format=(string)avc
flvmux FLV muxer Codec/Muxer Muxes video/audio streams into a FLV stream Sebastian Dröge <sebastian.droege@collabora.co.uk> audio sink request
audio/x-adpcm, layout=(string)swf, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 22050, 44100 }, parsed=(boolean)true; audio/mpeg, mpegversion=(int)2, framed=(boolean)true; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true; audio/x-nellymoser, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 16000, 22050, 44100 }; audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)8, depth=(int)8, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)false; audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)16, depth=(int)16, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)true; audio/x-alaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }; audio/x-speex, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }
video sink request
video/x-flash-video; video/x-flash-screen; video/x-vp6-flash; video/x-vp6-alpha; video/x-h264, stream-format=(string)avc
src source always
video/x-flv
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-autodetect.xml0000644000175000017500000000473111720564144022245 00000000000000 autodetect Plugin contains auto-detection plugins for video/audio in- and outputs ../../gst/autodetect/.libs/libgstautodetect.so libgstautodetect.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin autoaudiosink Auto audio sink Sink/Audio Wrapper audio sink for automatically detected audio sink Jan Schmidt <thaytan@noraisin.net> sink sink always
ANY
autoaudiosrc Auto audio source Source/Audio Wrapper audio source for automatically detected audio source Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net> src source always
ANY
autovideosink Auto video sink Sink/Video Wrapper video sink for automatically detected video sink Jan Schmidt <thaytan@noraisin.net> sink sink always
ANY
autovideosrc Auto video source Source/Video Wrapper video source for automatically detected video source Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net> src source always
ANY
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-ossaudio.xml0000644000175000017500000000440711720564144021732 00000000000000 ossaudio OSS (Open Sound System) support for GStreamer ../../sys/oss/.libs/libgstossaudio.so libgstossaudio.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin ossmixer OSS Mixer Generic/Audio Control sound input and output levels with OSS Andrew Vander Wingo <wingo@pobox.com> osssink Audio Sink (OSS) Sink/Audio Output to a sound card via OSS Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be> sink sink always
audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
osssrc Audio Source (OSS) Source/Audio Capture from a sound card via OSS Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com> src source always
audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-wavenc.xml0000644000175000017500000000363511720564144021371 00000000000000 wavenc Encode raw audio into WAV ../../gst/wavenc/.libs/libgstwavenc.so libgstwavenc.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin wavenc WAV audio muxer Codec/Muxer/Audio Encode raw audio into WAV Iain Holmes <iain@prettypeople.org> sink sink always
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true; audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 32, 64 }; audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false; audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false
src source always
audio/x-wav
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-gstrtpmanager.xml0000644000175000017500000001431411720564144022760 00000000000000 gstrtpmanager RTP session management plugin library ../../gst/rtpmanager/.libs/libgstrtpmanager.so libgstrtpmanager.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin gstrtpbin RTP Bin Filter/Network/RTP Real-Time Transport Protocol bin Wim Taymans <wim.taymans@gmail.com> recv_rtcp_sink_%d sink request
application/x-rtcp
recv_rtp_sink_%d sink request
application/x-rtp
send_rtp_sink_%d sink request
application/x-rtp
recv_rtp_src_%d_%d_%d source sometimes
application/x-rtp
send_rtp_src_%d source sometimes
application/x-rtp
send_rtcp_src_%d source request
application/x-rtcp
gstrtpjitterbuffer RTP packet jitter-buffer Filter/Network/RTP A buffer that deals with network jitter and other transmission faults Philippe Kalaf <philippe.kalaf@collabora.co.uk>, Wim Taymans <wim.taymans@gmail.com> sink sink always
application/x-rtp, clock-rate=(int)[ 1, 2147483647 ]
sink_rtcp sink request
application/x-rtcp
src source always
application/x-rtp
gstrtpptdemux RTP Demux Demux/Network/RTP Parses codec streams transmitted in the same RTP session Kai Vehmanen <kai.vehmanen@nokia.com> sink sink always
application/x-rtp
src_%d source sometimes
application/x-rtp, payload=(int)[ 0, 255 ]
gstrtpsession RTP Session Filter/Network/RTP Implement an RTP session Wim Taymans <wim.taymans@gmail.com> recv_rtcp_sink sink request
application/x-rtcp
recv_rtp_sink sink request
application/x-rtp
send_rtp_sink sink request
application/x-rtp
recv_rtp_src source sometimes
application/x-rtp
send_rtp_src source sometimes
application/x-rtp
sync_src source sometimes
application/x-rtcp
send_rtcp_src source request
application/x-rtcp
gstrtpssrcdemux RTP SSRC Demux Demux/Network/RTP Splits RTP streams based on the SSRC Wim Taymans <wim.taymans@gmail.com> rtcp_sink sink always
application/x-rtcp
sink sink always
application/x-rtp
rtcp_src_%d source sometimes
application/x-rtcp
src_%d source sometimes
application/x-rtp
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-taglib.xml0000644000175000017500000000342311720564144021343 00000000000000 taglib Tag writing plug-in based on taglib ../../ext/taglib/.libs/libgsttaglib.so libgsttaglib.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin apev2mux TagLib-based APEv2 Muxer Formatter/Metadata Adds an APEv2 header to the beginning of files using taglib Sebastian Dröge <slomo@circular-chaos.org> sink sink always
ANY
src source always
application/x-apetag
id3v2mux TagLib-based ID3v2 Muxer Formatter/Metadata Adds an ID3v2 header to the beginning of MP3 files using taglib Christophe Fergeau <teuf@gnome.org> sink sink always
ANY
src source always
application/x-id3
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-goom2k1.xml0000644000175000017500000000270511720564144021362 00000000000000 goom2k1 GOOM 2k1 visualization filter ../../gst/goom2k1/.libs/libgstgoom2k1.so libgstgoom2k1.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin goom2k1 GOOM: what a GOOM! 2k1 edition Visualization Takes frames of data and outputs video frames using the GOOM 2k1 filter Wim Taymans <wim@fluendo.com> sink sink always
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }
src source always
video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-spectrum.xml0000644000175000017500000000455611720564144021753 00000000000000 spectrum Run an FFT on the audio signal, output spectrum data ../../gst/spectrum/.libs/libgstspectrum.so libgstspectrum.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin spectrum Spectrum analyzer Filter/Analyzer/Audio Run an FFT on the audio signal, output spectrum data Erik Walthinsen <omega@cse.ogi.edu>, Stefan Kost <ensonic@users.sf.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk> sink sink always
audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
src source always
audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-auparse.xml0000644000175000017500000000305411720564144021541 00000000000000 auparse parses au streams ../../gst/auparse/.libs/libgstauparse.so libgstauparse.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin auparse AU audio demuxer Codec/Demuxer/Audio Parse an .au file into raw audio Erik Walthinsen <omega@cse.ogi.edu> sink sink always
audio/x-au
src source sometimes
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }; audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string){ g721, g722, g723_3, g723_5 }
gst-plugins-good-0.10.31/docs/plugins/inspect/plugin-aasink.xml0000644000175000017500000000174611720564144021355 00000000000000 aasink ASCII Art video sink ../../ext/aalib/.libs/libgstaasink.so libgstaasink.so 0.10.31 LGPL gst-plugins-good GStreamer Good Plug-ins source release Unknown package origin aasink ASCII art video sink Sink/Video An ASCII art videosink Wim Taymans <wim.taymans@chello.be> sink sink always
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins-sections.txt0000644000175000017500000013445311720565335023700 00000000000000
element-3gppmux 3gppmux Gst3GPPMux
element-aacparse aacparse GstAacParse GstAacParseClass GST_AAC_PARSE GST_AAC_PARSE_CLASS GST_IS_AAC_PARSE GST_IS_AAC_PARSE_CLASS GST_TYPE_AAC_PARSE gst_aac_parse_get_type
element-aasink aasink GstAASink GstAASinkClass GST_AASINK GST_IS_AASINK GST_TYPE_AASINK GST_AASINK_CLASS GST_IS_AASINK_CLASS gst_aasink_get_type
element-ac3parse ac3parse GstAc3Parse GstAc3ParseClass GST_AC3_PARSE GST_AC3_PARSE_CLASS GST_IS_AC3_PARSE GST_IS_AC3_PARSE_CLASS GST_TYPE_AC3_PARSE gst_ac3_parse_get_type
element-alawdec alawdec GstALawDec GstALawDecClass GST_ALAW_DEC GST_IS_ALAW_DEC GST_TYPE_ALAW_DEC GST_ALAW_DEC_CLASS GST_IS_ALAW_DEC_CLASS gst_alaw_dec_get_type
element-alawenc alawenc GstALawEnc GstALawEncClass GST_ALAW_ENC GST_IS_ALAW_ENC GST_TYPE_ALAW_ENC GST_ALAW_ENC_CLASS GST_IS_ALAW_ENC_CLASS gst_alaw_enc_get_type
element-alpha alpha GstAlpha GstAlphaMethod GstAlphaClass GST_ALPHA GST_IS_ALPHA GST_TYPE_ALPHA gst_alpha_get_type GST_ALPHA_CLASS GST_IS_ALPHA_CLASS
element-alphacolor alphacolor GstAlphaColor GstAlphaColorClass GST_ALPHA_COLOR GST_IS_ALPHA_COLOR GST_TYPE_ALPHA_COLOR gst_alpha_color_get_type GST_ALPHA_COLOR_CLASS GST_IS_ALPHA_COLOR_CLASS
element-amrparse amrparse GstAmrParse GstAmrParseClass GST_AMR_PARSE GST_AMR_PARSE_CLASS GST_IS_AMR_PARSE GST_IS_AMR_PARSE_CLASS GST_TYPE_AMR_PARSE gst_amr_parse_get_type
element-apedemux apedemux GstApeDemux GstApeDemuxClass GST_APE_DEMUX GST_IS_APE_DEMUX GST_TYPE_APE_DEMUX gst_ape_demux_get_type GST_APE_DEMUX_CLASS GST_IS_APE_DEMUX_CLASS
element-apev2mux apev2mux GstApev2Mux GstApev2MuxClass GST_APEV2_MUX GST_IS_APEV2_MUX GST_TYPE_APEV2_MUX gst_apev2_mux_get_type GST_APEV2_MUX_CLASS GST_IS_APEV2_MUX_CLASS
element-audioamplify audioamplify GstAudioAmplify GstAudioAmplifyClass GstAudioAmplifyProcessFunc GST_AUDIO_AMPLIFY GST_AUDIO_AMPLIFY_CLASS GST_AUDIO_AMPLIFY_GET_CLASS GST_IS_AUDIO_AMPLIFY GST_IS_AUDIO_AMPLIFY_CLASS GST_TYPE_AUDIO_AMPLIFY gst_audio_amplify_get_type
element-audiochebband audiochebband GstAudioChebBand GstAudioChebBandClass GST_AUDIO_CHEB_BAND GST_AUDIO_CHEB_BAND_CLASS GST_AUDIO_CHEB_BAND_GET_CLASS GST_IS_AUDIO_CHEB_BAND GST_IS_AUDIO_CHEB_BAND_CLASS GST_TYPE_AUDIO_CHEB_BAND gst_audio_cheb_band_get_type
element-audiocheblimit audiocheblimit GstAudioChebLimit GstAudioChebLimitClass GST_AUDIO_CHEB_LIMIT GST_AUDIO_CHEB_LIMIT_CLASS GST_AUDIO_CHEB_LIMIT_GET_CLASS GST_IS_AUDIO_CHEB_LIMIT GST_IS_AUDIO_CHEB_LIMIT_CLASS GST_TYPE_AUDIO_CHEB_LIMIT gst_audio_cheb_limit_get_type
element-audiodynamic audiodynamic GstAudioDynamic GstAudioDynamicClass GstAudioDynamicProcessFunc GST_AUDIO_DYNAMIC GST_AUDIO_DYNAMIC_CLASS GST_AUDIO_DYNAMIC_GET_CLASS GST_IS_AUDIO_DYNAMIC GST_IS_AUDIO_DYNAMIC_CLASS GST_TYPE_AUDIO_DYNAMIC gst_audio_dynamic_get_type
element-audioecho audioecho GstAudioEcho GstAudioEchoClass GstAudioEchoProcessFunc GST_AUDIO_ECHO GST_AUDIO_ECHO_CLASS GST_AUDIO_ECHO_GET_CLASS GST_IS_AUDIO_ECHO GST_IS_AUDIO_ECHO_CLASS GST_TYPE_AUDIO_ECHO gst_audio_echo_get_type
element-audiofirfilter audiofirfilter GstAudioFIRFilter GstAudioFIRFilterClass GST_AUDIO_FIR_FILTER GST_AUDIO_FIR_FILTER_CLASS GST_IS_AUDIO_FIR_FILTER GST_IS_AUDIO_FIR_FILTER_CLASS GST_TYPE_AUDIO_FIR_FILTER gst_audio_fir_filter_get_type
element-audioiirfilter audioiirfilter GstAudioIIRFilter GstAudioIIRFilterClass GST_AUDIO_IIR_FILTER GST_AUDIO_IIR_FILTER_CLASS GST_IS_AUDIO_IIR_FILTER GST_IS_AUDIO_IIR_FILTER_CLASS GST_TYPE_AUDIO_IIR_FILTER gst_audio_iir_filter_get_type
element-audioinvert audioinvert GstAudioInvert GstAudioInvertClass GstAudioInvertProcessFunc GST_AUDIO_INVERT GST_AUDIO_INVERT_CLASS GST_AUDIO_INVERT_GET_CLASS GST_IS_AUDIO_INVERT GST_IS_AUDIO_INVERT_CLASS GST_TYPE_AUDIO_INVERT gst_audio_invert_get_type
element-audiokaraoke audiokaraoke GstAudioKaraoke GstAudioKaraokeClass GstAudioKaraokeProcessFunc GST_AUDIO_KARAOKE GST_AUDIO_KARAOKE_CLASS GST_AUDIO_KARAOKE_GET_CLASS GST_IS_AUDIO_KARAOKE GST_IS_AUDIO_KARAOKE_CLASS GST_TYPE_AUDIO_KARAOKE gst_audio_karaoke_get_type
element-audiopanorama audiopanorama GstAudioPanorama GstAudioPanoramaClass GstAudioPanoramaProcessFunc GST_AUDIO_PANORAMA GST_AUDIO_PANORAMA_CLASS GST_AUDIO_PANORAMA_GET_CLASS GST_IS_AUDIO_PANORAMA GST_IS_AUDIO_PANORAMA_CLASS GST_TYPE_AUDIO_PANORAMA gst_audio_panorama_get_type
element-audiowsincband audiowsincband GstAudioWSincBand GstAudioWSincBandClass GST_AUDIO_WSINC_BAND GST_AUDIO_WSINC_BAND_CLASS GST_IS_AUDIO_WSINC_BAND GST_IS_AUDIO_WSINC_BAND_CLASS GST_TYPE_AUDIO_WSINC_BAND gst_audio_wsincband_get_type
element-audiowsinclimit audiowsinclimit GstAudioWSincLimit GstAudioWSincLimitClass GST_AUDIO_WSINC_LIMIT GST_AUDIO_WSINC_LIMIT_CLASS GST_IS_AUDIO_WSINC_LIMIT GST_IS_AUDIO_WSINC_LIMIT_CLASS GST_TYPE_AUDIO_WSINC_LIMIT gst_audio_wsinclimit_get_type
element-auparse auparse GstAuParse GstAuParseClass GST_TYPE_AU_PARSE GST_AU_PARSE GST_AU_PARSE_CLASS GST_IS_AU_PARSE GST_IS_AU_PARSE_CLASS gst_au_parse_get_type
element-autoaudiosink autoaudiosink GstAutoAudioSink GstAutoAudioSinkClass GST_TYPE_AUTO_AUDIO_SINK GST_AUTO_AUDIO_SINK GST_AUTO_AUDIO_SINK_CLASS GST_IS_AUTO_AUDIO_SINK GST_IS_AUTO_AUDIO_SINK_CLASS gst_auto_audio_sink_get_type
element-autoaudiosrc autoaudiosrc GstAutoAudioSrc GstAutoAudioSrcClass GST_TYPE_AUTO_AUDIO_SRC GST_AUTO_AUDIO_SRC GST_AUTO_AUDIO_SRC_CLASS GST_IS_AUTO_AUDIO_SRC GST_IS_AUTO_AUDIO_SRC_CLASS gst_auto_audio_src_get_type
element-autovideosink autovideosink GstAutoVideoSink GstAutoVideoSinkClass GST_TYPE_AUTO_VIDEO_SINK GST_AUTO_VIDEO_SINK GST_AUTO_VIDEO_SINK_CLASS GST_IS_AUTO_VIDEO_SINK GST_IS_AUTO_VIDEO_SINK_CLASS gst_auto_video_sink_get_type
element-autovideosrc autovideosrc GstAutoVideoSrc GstAutoVideoSrcClass GST_TYPE_AUTO_VIDEO_SRC GST_AUTO_VIDEO_SRC GST_AUTO_VIDEO_SRC_CLASS GST_IS_AUTO_VIDEO_SRC GST_IS_AUTO_VIDEO_SRC_CLASS gst_auto_video_src_get_type
element-avidemux avidemux GstAviDemux GstAviDemuxClass GstAviAudioPad GstAviCollectData GstAviDemuxHeaderState GstAviDemuxState GstAviPad GstAviVideoPad GstAviIndexEntry GstAviStream GST_TYPE_AVI_DEMUX GST_AVI_DEMUX GST_AVI_DEMUX_CLASS GST_IS_AVI_DEMUX GST_IS_AVI_DEMUX_CLASS GST_AVI_DEMUX_MAX_STREAMS gst_avi_demux_get_type CHUNKID_TO_STREAMNR
element-avimux avimux GstAviMux GstAviMuxClass GstAviPadHook GST_AVI_MAX_SIZE GST_TYPE_AVI_MUX GST_AVI_MUX GST_AVI_MUX_CLASS GST_IS_AVI_MUX GST_IS_AVI_MUX_CLASS gst_avi_mux_get_type GST_AVI_INDEX_OF_CHUNKS GST_AVI_INDEX_OF_INDEXES GST_AVI_SUPERINDEX_COUNT gst_avi_superindex_entry gst_riff_strh_full
element-avisubtitle avisubtitle GstAviSubtitle GstAviSubtitleClass GST_TYPE_AVI_SUBTITLE GST_AVI_SUBTITLE GST_AVI_SUBTITLE_CLASS GST_AVI_SUBTITLE_GET_CLASS GST_IS_AVI_SUBTITLE GST_IS_AVI_SUBTITLE_CLASS gst_avi_subtitle_get_type
element-cacasink cacasink GstCACASink GstCACASinkClass GST_CACASINK GST_IS_CACASINK GST_TYPE_CACASINK GST_CACASINK_CLASS GST_IS_CACASINK_CLASS gst_cacasink_get_type
element-cairotextoverlay cairotextoverlay GstCairoTextOverlay GstCairoTextOverlayClass GST_TYPE_CAIRO_TEXT_OVERLAY GST_CAIRO_TEXT_OVERLAY GST_CAIRO_TEXT_OVERLAY_CLASS GST_IS_CAIRO_TEXT_OVERLAY GST_IS_CAIRO_TEXT_OVERLAY_CLASS GST_CAIRO_TEXT_OVERLAY_GET_CLASS gst_text_overlay_get_type GstCairoTextOverlayHAlign GstCairoTextOverlayVAlign
element-cairotimeoverlay cairotimeoverlay GstCairoTimeOverlay GstCairoTimeOverlayClass GST_TYPE_CAIRO_TIME_OVERLAY GST_CAIRO_TIME_OVERLAY GST_CAIRO_TIME_OVERLAY_CLASS GST_IS_CAIRO_TIME_OVERLAY GST_IS_CAIRO_TIME_OVERLAY_CLASS gst_cairo_time_overlay_get_type
element-cairorender cairorender GstCairoRender GstCairoRenderClass GST_TYPE_CAIRO_RENDER GST_CAIRO_RENDER GST_CAIRO_RENDER_CLASS gst_cairo_render_get_type
element-cairooverlay cairooverlay GstCairoOverlay GstCairoOverlayClass GST_TYPE_CAIRO_OVERLAY GST_CAIRO_OVERLAY GST_CAIRO_OVERLAY_CLASS gst_cairo_overlay_get_type
element-capssetter capssetter GstCapsSetter GstCapsSetterClass GST_TYPE_CAPS_SETTER GST_CAPS_SETTER GST_IS_CAPS_SETTER GST_CAPS_SETTER_CLASS GST_IS_CAPS_SETTER_CLASS gst_caps_setter_get_type
element-cmmldec cmmldec GstCmmlDec GstCmmlDecClass GST_TYPE_CMML_DEC GST_CMML_DEC GST_CMML_DEC_CLASS GST_CMML_DEC_GET_CLASS GST_IS_CMML_DEC GST_IS_CMML_DEC_CLASS gst_cmml_dec_plugin_init gst_cmml_dec_get_type
element-cmmlenc cmmlenc GstCmmlEnc GstCmmlEncClass GST_TYPE_CMML_ENC GST_CMML_ENC GST_CMML_ENC_CLASS GST_CMML_ENC_GET_CLASS GST_IS_CMML_ENC GST_IS_CMML_ENC_CLASS gst_cmml_enc_plugin_init gst_cmml_enc_get_type
element-cutter cutter GstCutter GST_CUTTER GST_CUTTER_CLASS GST_IS_CUTTER GST_IS_CUTTER_CLASS GST_TYPE_CUTTER GstCutterClass gst_cutter_get_type
element-dcaparse dcaparse GstDcaParse GstDcaParseClass GST_DCA_PARSE GST_DCA_PARSE_CLASS GST_IS_DCA_PARSE GST_IS_DCA_PARSE_CLASS GST_TYPE_DCA_PARSE gst_dca_parse_get_type
element-deinterlace deinterlace GstDeinterlace GST_DEINTERLACE_MAX_FIELD_HISTORY BUILD_X86_ASM PICTURE_PROGRESSIVE PICTURE_INTERLACED_BOTTOM PICTURE_INTERLACED_TOP PICTURE_INTERLACED_MASK GstDeinterlaceClass GST_IS_DEINTERLACE GST_IS_DEINTERLACE_CLASS GST_DEINTERLACE GST_DEINTERLACE_CLASS GST_TYPE_DEINTERLACE gst_deinterlace_get_type GstDeinterlaceFieldLayout GstDeinterlaceFields GstDeinterlaceMethods GstDeinterlaceMode GstDeinterlaceScanlineData GstDeinterlaceMethod GstDeinterlaceMethodClass GST_DEINTERLACE_METHOD GST_DEINTERLACE_METHOD_CAST GST_DEINTERLACE_METHOD_CLASS GST_DEINTERLACE_METHOD_GET_CLASS GST_IS_DEINTERLACE_METHOD GST_IS_DEINTERLACE_METHOD_CLASS GST_TYPE_DEINTERLACE_METHOD gst_deinterlace_method_get_type GstDeinterlaceSimpleMethod GstDeinterlaceSimpleMethodClass GST_DEINTERLACE_SIMPLE_METHOD GST_DEINTERLACE_SIMPLE_METHOD_CAST GST_DEINTERLACE_SIMPLE_METHOD_CLASS GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS GST_IS_DEINTERLACE_SIMPLE_METHOD GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS GST_TYPE_DEINTERLACE_SIMPLE_METHOD gst_deinterlace_simple_method_get_type
element-deinterleave deinterleave GstDeinterleave GST_DEINTERLEAVE GST_DEINTERLEAVE_CLASS GST_DEINTERLEAVE_GET_CLASS GST_IS_DEINTERLEAVE GST_IS_DEINTERLEAVE_CLASS GST_TYPE_DEINTERLEAVE GstDeinterleaveClass GstDeinterleaveFunc gst_deinterleave_get_type
element-directsoundsink directsoundsink GstDirectSoundSink GstDirectSoundSinkClass GST_DIRECTSOUND_SINK GST_DIRECTSOUND_SINK_CLASS GST_IS_DIRECTSOUND_SINK GST_IS_DIRECTSOUND_SINK_CLASS GST_TYPE_DIRECTSOUND_SINK gst_directsound_sink_get_type GST_DSOUND_LOCK GST_DSOUND_UNLOCK
element-dv1394src dv1394src GstDV1394Src GstDV1394SrcClass GST_TYPE_DV1394SRC GST_DV1394SRC GST_DV1394SRC_CLASS GST_IS_DV1394SRC GST_IS_DV1394SRC_CLASS gst_dv1394src_get_type
element-hdv1394src hdv1394src GstHDV1394Src GstHDV1394SrcClass GST_TYPE_HDV1394SRC GST_HDV1394SRC GST_HDV1394SRC_CLASS GST_IS_HDV1394SRC GST_IS_HDV1394SRC_CLASS gst_hdv1394src_get_type
element-dvdec dvdec GstDVDec GstDVDecClass GST_TYPE_DVDEC GST_DVDEC GST_DVDEC_CLASS GST_IS_DVDEC GST_IS_DVDEC_CLASS gst_dvdec_get_type
element-dvdemux dvdemux GstDVDemux GstDVDemuxClass GstDVDemuxSeekHandler GST_TYPE_DVDEMUX GST_DVDEMUX GST_DVDEMUX_CLASS GST_IS_DVDEMUX GST_IS_DVDEMUX_CLASS gst_dvdemux_get_type
gstiirequalizer GstIirEqualizer GstIirEqualizer GstIirEqualizerBand GstIirEqualizerClass GST_IIR_EQUALIZER GST_IIR_EQUALIZER_CLASS GST_IS_IIR_EQUALIZER GST_IS_IIR_EQUALIZER_CLASS GST_TYPE_IIR_EQUALIZER gst_iir_equalizer_get_type gst_iir_equalizer_compute_frequencies
element-equalizer-3bands equalizer-3bands GstIirEqualizer3Bands GstIirEqualizer3BandsClass GST_IIR_EQUALIZER_3BANDS GST_IIR_EQUALIZER_3BANDS_CLASS GST_IS_IIR_EQUALIZER_3BANDS GST_IS_IIR_EQUALIZER_3BANDS_CLASS GST_TYPE_IIR_EQUALIZER_3BANDS gst_iir_equalizer_3bands_get_type
element-equalizer-10bands equalizer-10bands GstIirEqualizer10Bands GstIirEqualizer10BandsClass GST_IIR_EQUALIZER_10BANDS GST_IIR_EQUALIZER_10BANDS_CLASS GST_IS_IIR_EQUALIZER_10BANDS GST_IS_IIR_EQUALIZER_10BANDS_CLASS GST_TYPE_IIR_EQUALIZER_10BANDS gst_iir_equalizer_10bands_get_type
element-equalizer-nbands equalizer-nbands GstIirEqualizerNBands GstIirEqualizerNBandsClass GST_IIR_EQUALIZER_NBANDS GST_IIR_EQUALIZER_NBANDS_CLASS GST_IS_IIR_EQUALIZER_NBANDS GST_IS_IIR_EQUALIZER_NBANDS_CLASS GST_TYPE_IIR_EQUALIZER_NBANDS gst_iir_equalizer_nbands_get_type HIGHEST_FREQ LOWEST_FREQ ProcessFunc
element-esdsink esdsink GstEsdSink GstEsdSinkClass GST_TYPE_ESDSINK GST_ESDSINK GST_ESDSINK_CLASS GST_IS_ESDSINK GST_IS_ESDSINK_CLASS gst_esdsink_get_type
element-flacdec flacdec GstFlacDec GstFlacDecClass GST_TYPE_FLAC_DEC GST_FLAC_DEC GST_FLAC_DEC_CLASS GST_IS_FLAC_DEC GST_IS_FLAC_DEC_CLASS gst_flac_dec_get_type
element-flacenc flacenc GstFlacEnc GstFlacEncClass GstFlacTagState GST_TYPE_FLAC_ENC GST_FLAC_ENC GST_FLAC_ENC_CLASS GST_IS_FLAC_ENC GST_IS_FLAC_ENC_CLASS gst_flac_enc_get_type
element-flacparse flacparse GstFlacParse GstFlacParseClass GST_FLAC_PARSE GST_FLAC_PARSE_CLASS GST_IS_FLAC_PARSE GST_IS_FLAC_PARSE_CLASS GST_TYPE_FLAC_PARSE gst_flac_parse_get_type
element-flactag flactag GstFlacTag GstFlacTagClass GST_TYPE_FLAC_TAG GST_FLAC_TAG GST_FLAC_TAG_CLASS GST_IS_FLAC_TAG GST_IS_FLAC_TAG_CLASS gst_flac_tag_get_type
element-flvdemux flvdemux GstFlvDemux GstFlvDemuxClass GstFlvDemuxState GST_FLV_DEMUX GST_FLV_DEMUX_CLASS GST_IS_FLV_DEMUX GST_IS_FLV_DEMUX_CLASS GST_TYPE_FLV_DEMUX gst_flv_demux_get_type
element-flvmux flvmux GstFlvMux GstFlvMuxClass GstFlvMuxState GST_FLV_MUX GST_FLV_MUX_CLASS GST_IS_FLV_MUX GST_IS_FLV_MUX_CLASS GST_TYPE_FLV_MUX gst_flv_mux_get_type
element-flxdec flxdec GstFlxDec GstFlxDecClass GstFlxDecState GST_FLXDEC GST_FLXDEC_CLASS GST_IS_FLXDEC GST_IS_FLXDEC_CLASS GST_TYPE_FLXDEC gst_flxdec_get_type
element-gamma gamma GstGamma GstGammaClass GST_GAMMA GST_IS_GAMMA GST_TYPE_GAMMA GST_GAMMA_CLASS GST_IS_GAMMA_CLASS gst_gamma_get_type
element-gconfaudiosrc gconfaudiosrc GstGConfAudioSrc GstGConfAudioSrcClass GST_GCONF_AUDIO_SRC GST_IS_GCONF_AUDIO_SRC GST_TYPE_GCONF_AUDIO_SRC GST_GCONF_AUDIO_SRC_CLASS GST_IS_GCONF_AUDIO_SRC_CLASS gst_gconf_audio_src_get_type
element-gconfaudiosink gconfaudiosink GstGConfAudioSink GstGConfAudioSinkClass GST_GCONF_AUDIO_SINK GST_IS_GCONF_AUDIO_SINK GST_TYPE_GCONF_AUDIO_SINK GST_GCONF_AUDIO_SINK_CLASS GST_IS_GCONF_AUDIO_SINK_CLASS gst_gconf_audio_sink_get_type
element-gconfvideosrc gconfvideosrc GstGConfVideoSrc GstGConfVideoSrcClass GST_GCONF_VIDEO_SRC GST_IS_GCONF_VIDEO_SRC GST_TYPE_GCONF_VIDEO_SRC GST_GCONF_VIDEO_SRC_CLASS GST_IS_GCONF_VIDEO_SRC_CLASS gst_gconf_video_src_get_type
element-gconfvideosink gconfvideosink GstGConfVideoSink GstGConfVideoSinkClass GST_GCONF_VIDEO_SINK GST_IS_GCONF_VIDEO_SINK GST_TYPE_GCONF_VIDEO_SINK GST_GCONF_VIDEO_SINK_CLASS GST_IS_GCONF_VIDEO_SINK_CLASS gst_gconf_video_sink_get_type
element-gdkpixbufsink gdkpixbufsink GstGdkPixbufSink GstGdkPixbufSinkClass GST_TYPE_GDK_PIXBUF_SINK GST_GDK_PIXBUF_SINK GST_GDK_PIXBUF_SINK_CLASS GST_IS_GDK_PIXBUF_SINK GST_IS_GDK_PIXBUF_SINK_CLASS gst_gdk_pixbuf_sink_get_type
element-goom goom GstGoom GstGoomClass GOOM_SAMPLES GST_GOOM GST_IS_GOOM GST_TYPE_GOOM GST_GOOM_CLASS GST_IS_GOOM_CLASS gst_goom_get_type
element-goom2k1 goom2k1 GstGoom GstGoomClass GOOM_SAMPLES GST_GOOM GST_IS_GOOM GST_TYPE_GOOM GST_GOOM_CLASS GST_IS_GOOM_CLASS
element-gstrtpbin gstrtpbin GstRtpBin GstRtpBinPrivate GstRtpBinClass GST_RTP_BIN GST_IS_RTP_BIN GST_TYPE_RTP_BIN gst_rtp_bin_get_type GST_RTP_BIN_CLASS GST_IS_RTP_BIN_CLASS
element-gstrtpjitterbuffer gstrtpjitterbuffer GstRtpJitterBuffer GstRtpJitterBufferClass GstRtpJitterBufferPrivate GST_RTP_JITTER_BUFFER GST_IS_RTP_JITTER_BUFFER GST_TYPE_RTP_JITTER_BUFFER gst_rtp_jitter_buffer_get_type GST_RTP_JITTER_BUFFER_CLASS GST_IS_RTP_JITTER_BUFFER_CLASS
element-gstrtpptdemux gstrtpptdemux GstRtpPtDemux GstRtpPtDemuxClass GstRtpPtDemuxPad GST_RTP_PT_DEMUX GST_IS_RTP_PT_DEMUX GST_TYPE_RTP_PT_DEMUX gst_rtp_pt_demux_get_type GST_RTP_PT_DEMUX_CLASS GST_IS_RTP_PT_DEMUX_CLASS
element-gstrtpsession gstrtpsession GstRtpSession GstRtpSessionClass GstRtpSessionPrivate GST_RTP_SESSION GST_IS_RTP_SESSION GST_TYPE_RTP_SESSION gst_rtp_session_get_type GST_RTP_SESSION_CLASS GST_IS_RTP_SESSION_CLASS GST_RTP_SESSION_CAST
element-gstrtpssrcdemux gstrtpssrcdemux GstRtpSsrcDemux GstRtpSsrcDemuxClass GstRtpSsrcDemuxPad GST_RTP_SSRC_DEMUX GST_IS_RTP_SSRC_DEMUX GST_TYPE_RTP_SSRC_DEMUX gst_rtp_ssrc_demux_get_type GST_RTP_SSRC_DEMUX_CLASS GST_IS_RTP_SSRC_DEMUX_CLASS
element-halaudiosink halaudiosink GstHalAudioSink GstHalAudioSinkClass GST_TYPE_HAL_AUDIO_SINK GST_HAL_AUDIO_SINK GST_HAL_AUDIO_SINK_CLASS GST_IS_HAL_AUDIO_SINK GST_IS_HAL_AUDIO_SINK_CLASS gst_hal_audio_sink_get_type
element-halaudiosrc halaudiosrc GstHalAudioSrc GstHalAudioSrcClass GST_TYPE_HAL_AUDIO_SRC GST_HAL_AUDIO_SRC GST_HAL_AUDIO_SRC_CLASS GST_IS_HAL_AUDIO_SRC GST_IS_HAL_AUDIO_SRC_CLASS gst_hal_audio_src_get_type
element-icydemux icydemux GstICYDemux GstICYDemuxClass GST_TYPE_ICYDEMUX GST_ICYDEMUX GST_ICYDEMUX_CLASS GST_IS_ICYDEMUX GST_IS_ICYDEMUX_CLASS gst_icydemux_get_type
element-id3demux id3demux GstID3Demux GstID3DemuxClass GST_TYPE_ID3DEMUX GST_ID3DEMUX GST_ID3DEMUX_CLASS GST_IS_ID3DEMUX GST_IS_ID3DEMUX_CLASS gst_id3demux_get_type
element-id3v2mux id3v2mux GstId3v2Mux GstId3v2MuxClass GST_TYPE_ID3V2_MUX GST_ID3V2_MUX GST_ID3V2_MUX_CLASS GST_IS_ID3V2_MUX GST_IS_ID3V2_MUX_CLASS gst_id3v2_mux_get_type
element-imagefreeze imagefreeze GstImageFreeze GstImageFreezeClass GST_IMAGE_FREEZE GST_IMAGE_FREEZE_CLASS GST_IS_IMAGE_FREEZE GST_IS_IMAGE_FREEZE_CLASS GST_IMAGE_FREEZE_GET_CLASS GST_TYPE_IMAGE_FREEZE gst_image_freeze_get_type
element-interleave interleave GstInterleave GST_INTERLEAVE GST_INTERLEAVE_CLASS GST_INTERLEAVE_GET_CLASS GST_IS_INTERLEAVE GST_IS_INTERLEAVE_CLASS GST_TYPE_INTERLEAVE GstInterleaveClass GstInterleaveFunc gst_interleave_get_type
element-ismlmux ismlmux GstISMLMux
element-jackaudiosrc jackaudiosrc GstJackAudioSrc 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
element-jackaudiosink jackaudiosink GstJackAudioSink 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
element-jpegdec jpegdec GstJpegDec GstJpegDecClass GST_JPEG_DEC GST_IS_JPEG_DEC GST_TYPE_JPEG_DEC GST_JPEG_DEC_CLASS GST_IS_JPEG_DEC_CLASS gst_jpeg_dec_get_type
element-jpegenc jpegenc GstJpegEnc GstJpegEncClass GST_JPEGENC GST_IS_JPEGENC GST_TYPE_JPEGENC GST_JPEGENC_CLASS GST_IS_JPEGENC_CLASS gst_jpegenc_get_type
element-level level GstLevel GstLevelClass GST_TYPE_LEVEL GST_LEVEL GST_LEVEL_CLASS GST_LEVEL_GET_CLASS GST_IS_LEVEL GST_IS_LEVEL_CLASS gst_level_get_type
element-matroskamux matroskamux GstMatroskaMux GstMatroskaMuxClass GstMatroskaMuxState GstMatroskaMetaSeekIndex GST_TYPE_MATROSKA_MUX GST_MATROSKA_MUX GST_MATROSKA_MUX_CLASS GST_IS_MATROSKA_MUX GST_IS_MATROSKA_MUX_CLASS gst_matroska_mux_get_type
element-matroskademux matroskademux GstMatroskaDemux GstMatroskaDemuxClass GstMatroskaDemuxState GST_TYPE_MATROSKA_DEMUX GST_MATROSKA_DEMUX GST_MATROSKA_DEMUX_CLASS GST_IS_MATROSKA_DEMUX GST_IS_MATROSKA_DEMUX_CLASS gst_matroska_demux_plugin_init
element-mj2mux mj2mux GstMJ2Mux
element-monoscope monoscope GstMonoscope GstMonoscopeClass GST_MONOSCOPE GST_IS_MONOSCOPE GST_TYPE_MONOSCOPE GST_MONOSCOPE_CLASS GST_IS_MONOSCOPE_CLASS gst_monoscope_get_type
element-mpegaudioparse mpegaudioparse GstMpegAudioParse GstMpegAudioParseClass GST_MPEG_AUDIO_PARSE GST_MPEG_AUDIO_PARSE_CLASS GST_IS_MPEG_AUDIO_PARSE GST_IS_MPEG_AUDIO_PARSE_CLASS GST_TYPE_MPEG_AUDIO_PARSE gst_mpeg_audio_parse_get_type
element-mp4mux mp4mux GstMP4Mux
element-mulawdec mulawdec GstMuLawDec GstMuLawDecClass GST_MULAWDEC GST_IS_MULAWDEC GST_TYPE_MULAWDEC GST_MULAWDEC_CLASS GST_IS_MULAWDEC_CLASS gst_mulawdec_get_type
element-mulawenc mulawenc GstMuLawEnc GstMuLawEncClass GST_MULAWENC GST_IS_MULAWENC GST_TYPE_MULAWENC GST_MULAWENC_CLASS GST_IS_MULAWENC_CLASS gst_mulawenc_get_type
element-multifilesrc multifilesrc GstMultiFileSrc GstMultiFileSrcClass GST_MULTI_FILE_SRC GST_MULTI_FILE_SRC_CLASS GST_IS_MULTI_FILE_SRC GST_IS_MULTI_FILE_SRC_CLASS GST_TYPE_MULTI_FILE_SRC gst_multi_file_src_get_type
element-multifilesink multifilesink GstMultiFileSink GstMultiFileSinkNext GstMultiFileSinkClass GST_MULTI_FILE_SINK GST_MULTI_FILE_SINK_CLASS GST_IS_MULTI_FILE_SINK GST_IS_MULTI_FILE_SINK_CLASS GST_TYPE_MULTI_FILE_SINK gst_multi_file_sink_get_type
element-multipartdemux multipartdemux GstMultipartDemux GstMultipartDemuxClass GST_TYPE_MULTIPART_DEMUX GST_MULTIPART_DEMUX GST_MULTIPART_DEMUX_CLASS GST_IS_MULTIPART_DEMUX GST_IS_MULTIPART_DEMUX_CLASS GST_MULTIPART_DEMUX_GET_CLASS MULTIPART_DATA_EOS MULTIPART_DATA_ERROR MULTIPART_NEED_MORE_DATA gst_multipart_demux_get_type gst_multipart_demux_plugin_init
element-multipartmux multipartmux GstMultipartMux GstMultipartMuxClass GST_TYPE_MULTIPART_MUX GST_MULTIPART_MUX GST_MULTIPART_MUX_CLASS GST_IS_MULTIPART_MUX GST_IS_MULTIPART_MUX_CLASS GST_MULTIPART_MUX_GET_CLASS gst_multipart_mux_get_type gst_multipart_mux_plugin_init
element-multiudpsink multiudpsink GstMultiUDPSink GstMultiUDPSinkClass GstUDPClient gst_multiudpsink_add gst_multiudpsink_remove gst_multiudpsink_clear gst_multiudpsink_get_stats GST_MULTIUDPSINK GST_IS_MULTIUDPSINK GST_TYPE_MULTIUDPSINK GST_MULTIUDPSINK_CLASS GST_IS_MULTIUDPSINK_CLASS gst_multiudpsink_get_type
element-oss4mixer oss4mixer GstOss4Mixer GstOss4MixerClass GST_OSS4_MIXER GST_OSS4_MIXER_CLASS GST_IS_OSS4_MIXER GST_IS_OSS4_MIXER_CLASS GST_TYPE_OSS4_MIXER gst_oss4_mixer_get_type GST_OSS4_MIXER_CAST GST_OSS4_MIXER_IS_OPEN MIXEXT_ENUM_IS_AVAILABLE MIXEXT_HAS_DESCRIPTION MIXEXT_IS_ROOT MIXEXT_IS_SLIDER gst_oss4_mixer_get_control_val gst_oss4_mixer_set_control_val gst_oss4_source_input_get_type GstOss4MixerControl
element-oss4sink oss4sink GstOss4Sink GstOss4SinkClass GST_TYPE_OSS4_SINK GST_OSS4_SINK GST_OSS4_SINK_CLASS GST_IS_OSS4_SINK GST_IS_OSS4_SINK_CLASS gst_oss4_sink_get_type GST_OSS4_SINK_CAST
element-oss4src oss4src GstOss4Source GstOss4SourceClass GST_TYPE_OSS4_SOURCE GST_OSS4_SOURCE GST_OSS4_SOURCE_CLASS GST_IS_OSS4_SOURCE GST_IS_OSS4_SOURCE_CLASS gst_oss4_source_get_type GST_IS_OSS4_SOURCE_INPUT GST_IS_OSS4_SOURCE_INPUT_CLASS GST_OSS4_SOURCE_CAST GST_OSS4_SOURCE_INPUT GST_OSS4_SOURCE_INPUT_CLASS GST_TYPE_OSS4_SOURCE_INPUT GstOss4SourceInput GstOss4SourceInputClass
element-ossmixer ossmixer GstOssMixerElement GstOssMixerElementClass GST_OSS_MIXER_ELEMENT GST_OSS_MIXER_ELEMENT_CLASS GST_IS_OSS_MIXER_ELEMENT GST_IS_OSS_MIXER_ELEMENT_CLASS GST_TYPE_OSS_MIXER_ELEMENT gst_oss_mixer_element_get_type
element-osssink osssink GstOssSink GstOssSinkClass GST_TYPE_OSSSINK GST_OSSSINK GST_OSSSINK_CLASS GST_IS_OSSSINK GST_IS_OSSSINK_CLASS gst_oss_sink_get_type
element-osssrc osssrc GstOssSrc GstOssSrcClass GST_TYPE_OSS_SRC GST_OSS_SRC GST_OSS_SRC_CLASS GST_IS_OSS_SRC GST_IS_OSS_SRC_CLASS gst_oss_src_get_type
element-osxaudiosink osxaudiosink GstOsxAudioSink GstOsxAudioSinkClass GST_TYPE_OSX_AUDIO_SINK GST_OSX_AUDIO_SINK GST_OSX_AUDIO_SINK_CLASS gst_osx_audio_sink_get_type
element-osxaudiosrc osxaudiosrc GstOsxAudioSrc GstOsxAudioSrcClass GST_TYPE_OSX_AUDIO_SRC GST_OSX_AUDIO_SRC GST_OSX_AUDIO_SRC_CLASS gst_osx_audio_src_get_type
element-osxvideosink osxvideosink GstOSXVideoSink GstOSXVideoSinkClass GstOSXWindow GST_IS_OSX_VIDEO_SINK GST_IS_OSX_VIDEO_SINK_CLASS GST_OSX_VIDEO_SINK GST_OSX_VIDEO_SINK_CLASS GST_TYPE_OSX_VIDEO_SINK GST_TYPE_OSXVIDEOBUFFER gst_osx_video_sink_get_type
element-pngdec pngdec GstPngDec GstPngDecClass GST_PNGDEC GST_IS_PNGDEC GST_TYPE_PNGDEC GST_PNGDEC_CLASS GST_IS_PNGDEC_CLASS gst_pngdec_get_type
element-pngenc pngenc GstPngEnc GstPngEncClass GST_PNGENC GST_IS_PNGENC GST_TYPE_PNGENC GST_PNGENC_CLASS GST_IS_PNGENC_CLASS gst_pngenc_get_type
element-pulsesink pulsesink GstPulseSink GstPulseSinkClass GST_PULSESINK GST_IS_PULSESINK GST_TYPE_PULSESINK GST_PULSESINK_CLASS GST_IS_PULSESINK_CLASS GST_PULSESINK_CAST gst_pulsesink_get_type
element-pulsesrc pulsesrc GstPulseSrc GstPulseSrcClass GST_PULSESRC GST_IS_PULSESRC GST_TYPE_PULSESRC GST_PULSESRC_CLASS GST_IS_PULSESRC_CLASS GST_PULSESRC_CAST gst_pulsesrc_get_type
element-pulsemixer pulsemixer GstPulseMixer GstPulseMixerClass GST_PULSEMIXER GST_IS_PULSEMIXER GST_TYPE_PULSEMIXER GST_PULSEMIXER_CLASS GST_IS_PULSEMIXER_CLASS gst_pulsemixer_get_type
element-progressreport progressreport GstProgressReport GstProgressReportClass GST_TYPE_PROGRESS_REPORT GST_PROGRESS_REPORT GST_PROGRESS_REPORT_CLASS GST_IS_PROGRESS_REPORT GST_IS_PROGRESS_REPORT_CLASS gst_progress_report_get_type
element-qtdemux qtdemux GstQTDemux GstQTDemuxClass QtDemuxStream GST_QT_DEMUX_CLASSIFICATION_TAG GST_QT_DEMUX_PRIVATE_TAG GST_IS_QTDEMUX GST_IS_QTDEMUX_CLASS GST_QTDEMUX GST_QTDEMUX_CAST GST_QTDEMUX_CLASS GST_QTDEMUX_MAX_STREAMS GST_TYPE_QTDEMUX gst_qtdemux_get_type
element-qtmoovrecover qtmoovrecover GstQTMoovRecover GstQTMoovRecoverClass gst_qt_moov_recover_get_type gst_qt_moov_recover_register
element-qtmux qtmux GstQTMux GstQTMuxClass GST_QT_MUX GST_QT_MUX_CLASS GST_IS_QT_MUX GST_IS_QT_MUX_CLASS GST_TYPE_QT_MUX gst_qt_mux_get_type
element-rganalysis rganalysis GstRgAnalysis GstRgAnalysisClass GST_RG_ANALYSIS GST_RG_ANALYSIS_CLASS GST_IS_RG_ANALYSIS GST_IS_RG_ANALYSIS_CLASS GST_TYPE_RG_ANALYSIS gst_rg_analysis_get_type
element-rglimiter rglimiter GstRgLimiter GstRgLimiterClass GST_RG_LIMITER GST_RG_LIMITER_CLASS GST_IS_RG_LIMITER GST_IS_RG_LIMITER_CLASS GST_TYPE_RG_LIMITER gst_rg_limiter_get_type
element-rgvolume rgvolume GstRgVolume GstRgVolumeClass GST_RG_VOLUME GST_RG_VOLUME_CLASS GST_IS_RG_VOLUME GST_TYPE_RG_VOLUME GST_IS_RG_VOLUME_CLASS gst_rg_volume_get_type
element-rtpdec rtpdec GstRTPDec GstRTPDecClass GstRTPDecSession GST_RTP_DEC GST_IS_RTP_DEC GST_TYPE_RTP_DEC GST_RTP_DEC_CLASS GST_IS_RTP_DEC_CLASS gst_rtp_dec_get_type
element-rtpj2kpay rtpj2kpay GstRtpJ2KPay GstRtpJ2KPayClass GST_RTP_J2K_PAY GST_IS_RTP_J2K_PAY GST_TYPE_RTP_J2K_PAY GST_RTP_J2K_PAY_CLASS GST_IS_RTP_J2K_PAY_CLASS gst_rtp_j2k_pay_plugin_init gst_rtp_j2k_pay_get_type
element-rtpjpegpay rtpjpegpay GstRtpJPEGPay GstRtpJPEGPayClass GST_RTP_JPEG_PAY GST_IS_RTP_JPEG_PAY GST_TYPE_RTP_JPEG_PAY GST_RTP_JPEG_PAY_CLASS GST_IS_RTP_JPEG_PAY_CLASS gst_rtp_jpeg_pay_plugin_init gst_rtp_jpeg_pay_get_type
element-rtspsrc rtspsrc GstRTSPSrc GstRTSPStream GstRTSPSrcClass GstRTSPNatMethod GST_RTSPSRC GST_IS_RTSPSRC GST_TYPE_RTSPSRC GST_RTSPSRC_CLASS GST_IS_RTSPSRC_CLASS GST_RTSPSRC_CAST GST_RTSP_CONN_GET_LOCK GST_RTSP_CONN_LOCK GST_RTSP_CONN_UNLOCK GST_RTSP_STATE_GET_LOCK GST_RTSP_STATE_LOCK GST_RTSP_STATE_UNLOCK GST_RTSP_STREAM_GET_LOCK GST_RTSP_STREAM_LOCK GST_RTSP_STREAM_UNLOCK gst_rtspsrc_get_type
element-shapewipe shapewipe GstShapeWipe GstShapeWipeClass GST_SHAPE_WIPE GST_SHAPE_WIPE_CLASS GST_IS_SHAPE_WIPE GST_IS_SHAPE_WIPE_CLASS GST_SHAPE_WIPE_GET_CLASS GST_TYPE_SHAPE_WIPE gst_shape_wipe_get_type
element-smpte smpte GstSMPTE GstSMPTEClass GST_SMPTE GST_IS_SMPTE GST_TYPE_SMPTE GST_SMPTE_CLASS GST_IS_SMPTE_CLASS gst_smpte_plugin_init
element-smptealpha smptealpha GstSMPTEAlpha GstSMPTEAlphaClass GST_SMPTE_ALPHA GST_IS_SMPTE_ALPHA GST_TYPE_SMPTE_ALPHA GST_SMPTE_ALPHA_CLASS GST_IS_SMPTE_ALPHA_CLASS gst_smpte_alpha_plugin_init
element-souphttpsrc souphttpsrc GstSoupHTTPSrc GstSoupHTTPSrcClass GstSoupHTTPSrcSessionIOStatus GST_SOUP_HTTP_SRC GST_SOUP_HTTP_SRC_CLASS GST_IS_SOUP_HTTP_SRC GST_IS_SOUP_HTTP_SRC_CLASS GST_TYPE_SOUP_HTTP_SRC gst_soup_http_src_get_type
element-smokedec smokedec GstSmokeDec GstSmokeDecClass GST_SMOKEDEC GST_IS_SMOKEDEC GST_TYPE_SMOKEDEC gst_smokedec_get_type GST_SMOKEDEC_CLASS GST_IS_SMOKEDEC_CLASS
element-smokeenc smokeenc GstSmokeEnc GstSmokeEncClass GST_SMOKEENC GST_IS_SMOKEENC GST_TYPE_SMOKEENC gst_smokeenc_get_type GST_SMOKEENC_CLASS GST_IS_SMOKEENC_CLASS
element-spectrum spectrum GstSpectrum GstSpectrumClass GST_SPECTRUM GST_SPECTRUM_CLASS GST_IS_SPECTRUM GST_IS_SPECTRUM_CLASS GST_TYPE_SPECTRUM gst_spectrum_get_type
element-speexdec speexdec GstSpeexDec GstSpeexDecClass GST_TYPE_SPEEX_DEC GST_SPEEX_DEC GST_SPEEX_DEC_CLASS GST_IS_SPEEX_DEC GST_IS_SPEEX_DEC_CLASS gst_speex_dec_get_type
element-speexenc speexenc GstSpeexEnc GstSpeexEncClass GstSpeexMode GST_TYPE_SPEEX_ENC GST_SPEEX_ENC GST_SPEEX_ENC_CLASS GST_IS_SPEEX_ENC GST_IS_SPEEX_ENC_CLASS gst_speex_enc_get_type
element-splitfilesrc splitfilesrc GstSplitFileSrc GstSplitFileSrcClass GST_SPLIT_FILE_SRC GST_SPLIT_FILE_SRC_CLASS GST_IS_SPLIT_FILE_SRC GST_IS_SPLIT_FILE_SRC_CLASS GST_TYPE_SPLIT_FILE_SRC gst_split_file_src_get_type
element-taginject taginject GstTagInject GstTagInjectClass GST_TAG_INJECT GST_IS_TAG_INJECT GST_TYPE_TAG_INJECT GST_TAG_INJECT_CLASS GST_IS_TAG_INJECT_CLASS gst_tag_inject_get_type
element-udpsrc udpsrc GstUDPSrc GstUDPSrcClass GST_UDPSRC GST_IS_UDPSRC GST_TYPE_UDPSRC GST_UDPSRC_CLASS GST_IS_UDPSRC_CLASS GST_UDPSRC_CAST gst_udpsrc_get_type
element-udpsink udpsink GstUDPSink GstUDPSinkClass GST_UDPSINK GST_IS_UDPSINK GST_TYPE_UDPSINK GST_UDPSINK_CLASS GST_IS_UDPSINK_CLASS gst_udpsink_get_type
element-videobox videobox GstVideoBox GstVideoBoxClass GstVideoBoxFill GST_IS_VIDEO_BOX GST_IS_VIDEO_BOX_CLASS GST_TYPE_VIDEO_BOX GST_VIDEO_BOX GST_VIDEO_BOX_CLASS gst_video_box_get_type gst_video_crop_get_type
element-videocrop videocrop GstVideoCrop GstVideoCropClass VideoCropPixelFormat GstVideoCropImageDetails GST_IS_VIDEO_CROP GST_IS_VIDEO_CROP_CLASS GST_VIDEO_CROP GST_VIDEO_CROP_CLASS GST_TYPE_VIDEO_CROP
element-aspectratiocrop aspectratiocrop GstAspectRatioCrop GstAspectRatioCropClass GST_IS_ASPECT_RATIO_CROP GST_IS_ASPECT_RATIO_CROP_CLASS GST_ASPECT_RATIO_CROP GST_ASPECT_RATIO_CROP_CLASS GST_TYPE_ASPECT_RATIO_CROP gst_aspect_ratio_crop_get_type
element-videoflip videoflip GstVideoFlip GstVideoFlipMethod GstVideoFlipClass GST_VIDEO_FLIP GST_IS_VIDEO_FLIP GST_TYPE_VIDEO_FLIP gst_video_flip_get_type GST_VIDEO_FLIP_CLASS GST_IS_VIDEO_FLIP_CLASS
element-videobalance videobalance GstVideoBalance GstVideoBalanceClass GST_VIDEO_BALANCE GST_IS_VIDEO_BALANCE GST_TYPE_VIDEO_BALANCE gst_video_balance_get_type GST_VIDEO_BALANCE_CLASS GST_IS_VIDEO_BALANCE_CLASS
gstvideomixerpad GstVideoMixerPad GstVideoMixerPad GstVideoMixerPadClass GstVideoMixerCollect GST_VIDEO_MIXER_PAD GST_VIDEO_MIXER_PAD_CLASS GST_IS_VIDEO_MIXER_PAD GST_IS_VIDEO_MIXER_PAD_CLASS GST_TYPE_VIDEO_MIXER_PAD
element-videomixer videomixer GstVideoMixer GstVideoMixerBackground GstVideoMixerClass GST_VIDEO_MIXER GST_IS_VIDEO_MIXER GST_TYPE_VIDEO_MIXER GST_VIDEO_MIXER_CLASS GST_IS_VIDEO_MIXER_CLASS gst_video_mixer_get_type
gstvideomixer2pad GstVideoMixer2Pad GstVideoMixer2Pad GstVideoMixer2PadClass GST_VIDEO_MIXER2_PAD GST_VIDEO_MIXER2_PAD_CLASS GST_IS_VIDEO_MIXER2_PAD GST_IS_VIDEO_MIXER2_PAD_CLASS GST_TYPE_VIDEO_MIXER2_PAD gst_videomixer2_pad_get_type
element-videomixer2 videomixer2 GstVideoMixer2 GstVideoMixer2Background GstVideoMixer2Class GST_VIDEO_MIXER2 GST_IS_VIDEO_MIXER2 GST_TYPE_VIDEO_MIXER2 GST_VIDEO_MIXER2_CLASS GST_IS_VIDEO_MIXER2_CLASS gst_videomixer2_get_type
element-v4l2src v4l2src GstV4l2Src GstV4l2SrcGetFunc GstV4l2SrcClass GST_V4L2SRC GST_IS_V4L2SRC GST_TYPE_V4L2SRC GST_V4L2SRC_CLASS GST_IS_V4L2SRC_CLASS gst_v4l2src_get_type
element-v4l2sink v4l2sink GstV4l2Sink GstV4l2SinkClass GST_V4L2SINK GST_IS_V4L2SINK GST_TYPE_V4L2SINK GST_V4L2SINK_CLASS GST_IS_V4L2SINK_CLASS gst_v4l2sink_get_type
element-v4l2radio v4l2radio GstV4l2Radio GstV4l2RadioClass GST_V4L2RADIO GST_IS_V4L2RADIO GST_TYPE_V4L2RADIO GST_V4L2RADIO_CLASS GST_IS_V4L2RADIO_CLASS gst_v4l2radio_get_type
element-waveformsink waveformsink GstWaveFormSink GstWaveFormSinkClass GST_IS_WAVEFORM_SINK GST_IS_WAVEFORM_SINK_CLASS GST_WAVEFORM_SINK GST_WAVEFORM_SINK_CLASS GST_TYPE_WAVEFORM_SINK gst_waveform_sink_get_type WAVE_FORMAT_96M08 WAVE_FORMAT_96M16 WAVE_FORMAT_96S08 WAVE_FORMAT_96S16 BUFFER_COUNT BUFFER_SIZE ERROR_LENGTH
element-wavenc wavenc GstWavEnc GstWavEncClass GST_WAVENC GST_IS_WAVENC GST_TYPE_WAVENC GST_WAVENC_CLASS GST_IS_WAVENC_CLASS gst_wavenc_get_type
element-wavpackdec wavpackdec GstWavpackDec GstWavpackDecClass GST_IS_WAVPACK_DEC GST_IS_WAVPACK_DEC_CLASS GST_WAVPACK_DEC GST_WAVPACK_DEC_CLASS GST_TYPE_WAVPACK_DEC gst_wavpack_dec_get_type gst_wavpack_dec_plugin_init
element-wavpackenc wavpackenc GstWavpackEnc GstWavpackEncClass GST_IS_WAVPACK_ENC GST_IS_WAVPACK_ENC_CLASS GST_WAVPACK_ENC GST_WAVPACK_ENC_CLASS GST_TYPE_WAVPACK_ENC gst_wavpack_enc_get_type gst_wavpack_enc_plugin_init
element-wavpackparse wavpackparse GstWavpackParse GstWavpackParseClass GstWavpackParseIndexEntry GST_IS_WAVPACK_PARSE GST_IS_WAVPACK_PARSE_CLASS GST_WAVPACK_PARSE GST_WAVPACK_PARSE_CLASS GST_TYPE_WAVPACK_PARSE gst_wavpack_parse_get_type gst_wavpack_parse_plugin_init
element-wavparse wavparse GstWavParse GstWavParseClass GstWavParseState GST_WAVPARSE GST_IS_WAVPARSE GST_TYPE_WAVPARSE GST_WAVPARSE_CLASS GST_IS_WAVPARSE_CLASS gst_wavparse_get_type
element-ximagesrc ximagesrc GstXImageSrc GstXImageSrcClass GST_XIMAGE_SRC GST_IS_XIMAGE_SRC GST_TYPE_XIMAGE_SRC GST_XIMAGE_SRC_CLASS GST_IS_XIMAGE_SRC_CLASS gst_ximage_src_get_type
element-y4menc y4menc GstY4mEncode GstY4mEncodeClass GST_Y4M_ENCODE GST_Y4M_ENCODE_CLASS GST_IS_Y4M_ENCODE GST_IS_Y4M_ENCODE_CLASS GST_Y4M_ENCODE_GET_CLASS GST_TYPE_Y4M_ENCODE gst_y4m_encode_get_type
element-agingtv agingtv GstAgingTV SCRATCH_MAX GstAgingTVClass GST_AGINGTV GST_AGINGTV_CLASS GST_IS_AGINGTV GST_IS_AGINGTV_CLASS GST_TYPE_AGINGTV gst_agingtv_get_type
element-dicetv dicetv GstDiceTV GstDiceTVClass GST_DICETV GST_DICETV_CLASS GST_IS_DICETV GST_IS_DICETV_CLASS GST_TYPE_DICETV gst_dicetv_get_type
element-edgetv edgetv GstEdgeTV GstEdgeTVClass GST_EDGETV GST_EDGETV_CLASS GST_IS_EDGETV GST_IS_EDGETV_CLASS GST_TYPE_EDGETV gst_edgetv_get_type
element-optv optv GstOpTV GstOpTVClass GST_OPTV GST_OPTV_CLASS GST_IS_OPTV GST_IS_OPTV_CLASS GST_TYPE_OPTV gst_optv_get_type
element-quarktv quarktv GstQuarkTV GstQuarkTVClass GST_QUARKTV GST_QUARKTV_CLASS GST_IS_QUARKTV GST_IS_QUARKTV_CLASS GST_TYPE_QUARKTV gst_quarktv_get_type
element-radioactv radioactv GstRadioacTV GstRadioacTVClass GST_RADIOACTV GST_RADIOACTV_CLASS GST_IS_RADIOACTV GST_IS_RADIOACTV_CLASS GST_TYPE_RADIOACTV gst_radioactv_get_type
element-revtv revtv GstRevTV GstRevTVClass GST_REVTV GST_REVTV_CLASS GST_IS_REVTV GST_IS_REVTV_CLASS GST_TYPE_REVTV gst_revtv_get_type
element-rippletv rippletv GstRippleTV GstRippleTVClass GST_RIPPLETV GST_RIPPLETV_CLASS GST_IS_RIPPLETV GST_IS_RIPPLETV_CLASS GST_TYPE_RIPPLETV gst_rippletv_get_type
element-shagadelictv shagadelictv GstShagadelicTV GstShagadelicTVClass GST_SHAGADELICTV GST_SHAGADELICTV_CLASS GST_IS_SHAGADELICTV GST_IS_SHAGADELICTV_CLASS GST_TYPE_SHAGADELICTV gst_shagadelictv_get_type
element-streaktv streaktv GstStreakTV PLANES GstStreakTVClass GST_STREAKTV GST_STREAKTV_CLASS GST_IS_STREAKTV GST_IS_STREAKTV_CLASS GST_TYPE_STREAKTV gst_streaktv_get_type
element-vertigotv vertigotv GstVertigoTV GstVertigoTVClass GST_VERTIGOTV GST_VERTIGOTV_CLASS GST_IS_VERTIGOTV GST_IS_VERTIGOTV_CLASS GST_TYPE_VERTIGOTV gst_vertigotv_get_type
element-warptv warptv GstWarpTV GstWarpTVClass GST_WARPTV GST_WARPTV_CLASS GST_IS_WARPTV GST_IS_WARPTV_CLASS GST_TYPE_WARPTV gst_warptv_get_type
element-webmmux webmmux GstWebMMux GST_TYPE_WEBM_MUX GST_WEBM_MUX GST_WEBM_MUX_CLASS GST_IS_WEBM_MUX GST_IS_WEBM_MUX_CLASS gst_webm_mux_get_type GstWebMMuxClass
gst-plugins-good-0.10.31/docs/plugins/html/0000755000175000017500000000000011720565335015443 500000000000000gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html0000644000175000017500000000573211720565335026275 00000000000000 spectrum

spectrum

spectrum — Run an FFT on the audio signal, output spectrum data

Plugin Information

filename

libgstspectrum.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

spectrum

Run an FFT on the audio signal, output spectrum data
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html0000644000175000017500000000655111720565335026747 00000000000000 videofilter

videofilter

videofilter — Video filters plugin

Plugin Information

filename

libgstvideofilter.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

gamma

Adjusts gamma on a video stream

videobalance

Adjusts brightness, contrast, hue, saturation on a video stream

videoflip

Flips and rotates video
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-osssink.html0000644000175000017500000001515211720565335024625 00000000000000 osssink

osssink

osssink — Output to a sound card via OSS

Synopsis

struct              GstOssSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstBaseAudioSink
                           +----GstAudioSink
                                 +----GstOssSink

Properties

  "device"                   gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

ossaudio

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

Details

struct GstOssSink

struct GstOssSink;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

OSS device (usually /dev/dspN).

Default value: "/dev/dsp"

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-videomixer2.html0000644000175000017500000007062111720565335025373 00000000000000 videomixer2

videomixer2

videomixer2 — Mix multiple video streams

Synopsis

struct              GstVideoMixer2;
enum                GstVideoMixer2Background;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstVideoMixer2

Implemented Interfaces

GstVideoMixer2 implements GstChildProxy.

Properties

  "background"               GstVideoMixer2Background  : Read / Write

Description

Videomixer2 can accept AYUV, ARGB and BGRA video streams. For each of the requested sink pads it will compare the incoming geometry and framerate to define the output parameters. Indeed output video frames will have the geometry of the biggest incoming video stream and the framerate of the fastest incoming one.

All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not supported. The src pad will have the same colorspace as the sinks. No colorspace conversion is done.

Individual parameters for each input stream can be configured on the GstVideoMixer2Pad.

At this stage, videomixer2 is considered UNSTABLE. The API provided in the properties may yet change in the near future. When videomixer2 is stable, it will replace videomixer

Sample pipelines

1
2
3
4
5
6
7
8
gst-launch-0.10 \
  videotestsrc pattern=1 ! \
  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \
  videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \
  videomixer2 name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \
  ffmpegcolorspace ! xvimagesink \
  videotestsrc ! \
  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix.
A pipeline to demonstrate videomixer used together with videobox. This should show a 320x240 pixels video test source with some transparency showing the background checker pattern. Another video test source with just the snow pattern of 100x100 pixels is overlayed on top of the first one on the left vertically centered with a small transparency showing the first video test source behind and the checker pattern under it. Note that the framerate of the output video is 10 frames per second.
1
2
3
4
5
gst-launch videotestsrc pattern=1 ! \
  video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \
  videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \
  videotestsrc !  \
  video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending).
1
2
3
4
5
gst-launch videotestsrc pattern=1 ! \
  video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \
  videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \
  videotestsrc ! \
  video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
A pipeline to test I420
1
2
3
4
5
6
7
8
gst-launch videomixer2 name=mixer sink_1::alpha=0.5 sink_1::xpos=50 sink_1::ypos=50 ! \
  ffmpegcolorspace ! ximagesink \
  videotestsrc pattern=snow timestamp-offset=3000000000 ! \
  "video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480,framerate=(fraction)30/1" ! \
  timeoverlay ! queue2 ! mixer. \
  videotestsrc pattern=smpte ! \
  "video/x-raw-yuv,format=(fourcc)AYUV,width=800,height=600,framerate=(fraction)10/1" ! \
  timeoverlay ! queue2 ! mixer.
A pipeline to demonstrate synchronized mixing (the second stream starts after 3 seconds)

Synopsis

Element Information

plugin

videomixer

author

Wim Taymans <wim@fluendo.com>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Editor/Video

Element Pads

name

sink_%d

direction

sink

presence

request

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVideoMixer2

struct GstVideoMixer2;

The opaque GstVideoMixer2 structure.


enum GstVideoMixer2Background

typedef enum {
  VIDEO_MIXER2_BACKGROUND_CHECKER,
  VIDEO_MIXER2_BACKGROUND_BLACK,
  VIDEO_MIXER2_BACKGROUND_WHITE,
  VIDEO_MIXER2_BACKGROUND_TRANSPARENT,
} GstVideoMixer2Background;

The different backgrounds videomixer can blend over.

VIDEO_MIXER2_BACKGROUND_CHECKER

checker pattern background

VIDEO_MIXER2_BACKGROUND_BLACK

solid color black background

VIDEO_MIXER2_BACKGROUND_WHITE

solid color white background

VIDEO_MIXER2_BACKGROUND_TRANSPARENT

background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing.

Property Details

The "background" property

  "background"               GstVideoMixer2Background  : Read / Write

Background type.

Default value: Checker pattern

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gstrtpptdemux.html0000644000175000017500000003645511720565335026077 00000000000000 gstrtpptdemux

gstrtpptdemux

gstrtpptdemux — Parses codec streams transmitted in the same RTP session

Synopsis

struct              GstRtpPtDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstRtpPtDemux

Description

gstrtpptdemux acts as a demuxer for RTP packets based on the payload type of the packets. Its main purpose is to allow an application to easily receive and decode an RTP stream with multiple payload types.

For each payload type that is detected, a new pad will be created and the "new-payload-type" signal will be emitted. When the payload for the RTP stream changes, the "payload-type-change" signal will be emitted.

The element will try to set complete and unique application/x-rtp caps on the outgoing buffers and pads based on the result of the "request-pt-map" signal.

Example pipelines

1
gst-launch udpsrc caps="application/x-rtp" ! gstrtpptdemux ! fakesink
Takes an RTP stream and send the RTP packets with the first detected payload type to fakesink, discarding the other payload types.

Last reviewed on 2007-05-28 (0.10.5)

Synopsis

Element Information

plugin

gstrtpmanager

author

Kai Vehmanen <kai.vehmanen@nokia.com>

class

Demux/Network/RTP

Element Pads

name

sink

direction

sink

presence

always

details

application/x-rtp

name

src_%d

direction

source

presence

sometimes

details

application/x-rtp, payload=(int)[ 0, 255 ]

Details

struct GstRtpPtDemux

struct GstRtpPtDemux;

Signal Details

The "clear-pt-map" signal

void                user_function                      (GstRtpPtDemux *demux,
                                                        gpointer       user_data)      : Action

The application can call this signal to instruct the element to discard the currently cached payload type map.

demux :

the object which received the signal

user_data :

user data set when the signal handler was connected.

The "new-payload-type" signal

void                user_function                      (GstRtpPtDemux *demux,
                                                        guint          pt,
                                                        GstPad        *pad,
                                                        gpointer       user_data)      : Run Last

Emited when a new payload type pad has been created in demux.

demux :

the object which received the signal

pt :

the payload type

pad :

the pad with the new payload

user_data :

user data set when the signal handler was connected.

The "payload-type-change" signal

void                user_function                      (GstRtpPtDemux *demux,
                                                        guint          pt,
                                                        gpointer       user_data)      : Run Last

Emited when the payload type changed.

demux :

the object which received the signal

pt :

the new payload type

user_data :

user data set when the signal handler was connected.

The "request-pt-map" signal

GstCaps*            user_function                      (GstRtpPtDemux *demux,
                                                        guint          pt,
                                                        gpointer       user_data)      : Run Last

Request the payload type as GstCaps for pt.

demux :

the object which received the signal

pt :

the payload type

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-qtdemux.html0000644000175000017500000002271311720565335024624 00000000000000 qtdemux

qtdemux

qtdemux — Demultiplex a QuickTime file into audio and video streams

Synopsis

struct              GstQTDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstQTDemux

Signals

  "got-redirect"                                   

Description

Demuxes a .mov file into raw or compressed audio and/or video streams.

This element supports both push and pull-based scheduling, depending on the capabilities of the upstream elements.

Example launch line

1
gst-launch filesrc location=test.mov ! qtdemux name=demux  demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink   demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink
Play (parse and decode) a .mov file and try to output it to an automatically detected soundcard and videosink. If the MOV file contains compressed audio or video data, this will only work if you have the right decoder elements/plugins installed.

Last reviewed on 2006-12-29 (0.10.5)

Synopsis

Element Information

plugin

isomp4

author

David Schleef <ds@schleef.org>, Wim Taymans <wim@fluendo.com>

class

Codec/Demuxer

Element Pads

name

sink

direction

sink

presence

always

details

video/quicktime

video/mj2

audio/x-m4a

application/x-3gp

name

audio_%02d

direction

source

presence

sometimes

details

ANY

name

subtitle_%02d

direction

source

presence

sometimes

details

ANY

name

video_%02d

direction

source

presence

sometimes

details

ANY

Details

struct GstQTDemux

struct GstQTDemux;

Signal Details

The "got-redirect" signal

void                user_function                      (GstQTDemux *gstqtdemux,
                                                        gchar      *arg1,
                                                        gpointer    user_data)

gstqtdemux :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-alphacolor.html0000644000175000017500000002230011720565335025251 00000000000000 alphacolor

alphacolor

alphacolor — ARGB from/to AYUV colorspace conversion preserving the alpha channel

Synopsis

struct              GstAlphaColor;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstAlphaColor

Description

The alphacolor element does memory-efficient (in-place) colourspace conversion from RGBA to AYUV or AYUV to RGBA while preserving the alpha channel.

Sample pipeline:

1
2
gst-launch videotestsrc ! "video/x-raw-yuv,format=(fourcc)AYUV" ! \
  alphacolor ! "video/x-raw-rgb" ! ffmpegcolorspace ! autovideosink

Synopsis

Element Information

plugin

alphacolor

author

Wim Taymans <wim@fluendo.com>

class

Filter/Converter/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstAlphaColor

struct GstAlphaColor;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-multipartmux.html0000644000175000017500000001761111720565335025711 00000000000000 multipartmux

multipartmux

multipartmux — mux multipart streams

Synopsis

struct              GstMultipartMux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMultipartMux

Properties

  "boundary"                 gchar*                : Read / Write

Description

MultipartMux uses the GstCaps of the sink pad as the Content-type field for incoming buffers when muxing them to a multipart stream. Most of the time multipart streams are sequential JPEG frames.

Sample pipelines

1
gst-launch videotestsrc ! video/x-raw-yuv, framerate='(fraction)'5/1 ! jpegenc ! multipartmux ! filesink location=/tmp/test.multipart
a pipeline to mux 5 JPEG frames per second into a multipart stream stored to a file.

Synopsis

Element Information

plugin

multipart

author

Wim Taymans <wim@fluendo.com>

class

Codec/Muxer

Element Pads

name

sink_%d

direction

sink

presence

request

details

ANY

name

src

direction

source

presence

always

details

multipart/x-mixed-replace

Details

struct GstMultipartMux

struct GstMultipartMux;

The opaque GstMultipartMux structure.

Property Details

The "boundary" property

  "boundary"                 gchar*                : Read / Write

Boundary string.

Default value: "ThisRandomString"

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-mp4mux.html0000644000175000017500000004472311720565335024374 00000000000000 mp4mux

mp4mux

mp4mux — Muxer for ISO MPEG-4 (.mp4) files

Synopsis

typedef             GstMP4Mux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMP4Mux

Implemented Interfaces

GstMP4Mux implements GstTagSetter and GstTagXmpWriter.

Properties

  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
  "faststart"                gboolean              : Read / Write
  "faststart-file"           gchar*                : Read / Write / Construct
  "fragment-duration"        guint                 : Read / Write / Construct
  "moov-recovery-file"       gchar*                : Read / Write / Construct
  "movie-timescale"          guint                 : Read / Write / Construct
  "presentation-time"        gboolean              : Read / Write / Construct
  "streamable"               gboolean              : Read / Write / Construct
  "trak-timescale"           guint                 : Read / Write / Construct

Description

This element merges streams (audio and video) into ISO MPEG-4 (.mp4) files.

The following background intends to explain why various similar muxers are present in this plugin.

The QuickTime file format specification served as basis for the MP4 file format specification (mp4mux), and as such the QuickTime file structure is nearly identical to the so-called ISO Base Media file format defined in ISO 14496-12 (except for some media specific parts). In turn, the latter ISO Base Media format was further specialized as a Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) and in various 3GPP(2) specs (gppmux). The fragmented file features defined (only) in ISO Base Media are used by ISMV files making up (a.o.) Smooth Streaming (ismlmux).

A few properties (movie-timescale, trak-timescale) allow adjusting some technical parameters, which might be useful in (rare) cases to resolve compatibility issues in some situations.

Some other properties influence the result more fundamentally. A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, somewhat contrary to this usually being called "the header". However, a faststart file will (with some effort) arrange this to be located near start of the file, which then allows it e.g. to be played while downloading. Alternatively, rather than having one chunk of metadata at start (or end), there can be some metadata at start and most of the other data can be spread out into fragments of fragment-duration. If such fragmented layout is intended for streaming purposes, then streamable allows foregoing to add index metadata (at the end of file).

dts-method allows selecting a method for managing input timestamps (stay tuned for 0.11 to have this automagically settled). The default delta/duration method should handle nice (aka perfect streams) just fine, but may experience problems otherwise (e.g. input stream with re-ordered B-frames and/or with frame dropping). The re-ordering approach re-assigns incoming timestamps in ascending order to incoming buffers and offers an alternative in such cases. In cases where that might fail, the remaining method can be tried, which is exact and according to specs, but might experience playback on not so spec-wise players. Note that this latter approach also requires one to enable presentation-timestamp.

Example pipelines

1
gst-launch gst-launch v4l2src num-buffers=50 ! queue ! x264enc ! mp4mux ! filesink location=video.mp4
Records a video stream captured from a v4l2 device, encodes it into H.264 and muxes it into an mp4 file.

Documentation last reviewed on 2011-04-21

Synopsis

Element Information

plugin

isomp4

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]

audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

name

video_%d

direction

sink

presence

request

details

video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-mp4-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)iso

Details

GstMP4Mux

typedef struct _Gst3GPPMux GstMP4Mux;

Property Details

The "dts-method" property

  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct

Method to determine DTS time.

Default value: reorder


The "faststart" property

  "faststart"                gboolean              : Read / Write

If the file should be formatted for faststart (headers first).

Default value: FALSE


The "faststart-file" property

  "faststart-file"           gchar*                : Read / Write / Construct

File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically.

Default value: NULL


The "fragment-duration" property

  "fragment-duration"        guint                 : Read / Write / Construct

Fragment durations in ms (produce a fragmented file if > 0).

Default value: 0


The "moov-recovery-file" property

  "moov-recovery-file"       gchar*                : Read / Write / Construct

File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental).

Default value: NULL


The "movie-timescale" property

  "movie-timescale"          guint                 : Read / Write / Construct

Timescale to use in the movie (units per second).

Allowed values: >= 1

Default value: 1000


The "presentation-time" property

  "presentation-time"        gboolean              : Read / Write / Construct

Calculate and include presentation/composition time (in addition to decoding time).

Default value: TRUE


The "streamable" property

  "streamable"               gboolean              : Read / Write / Construct

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

Default value: FALSE


The "trak-timescale" property

  "trak-timescale"           guint                 : Read / Write / Construct

Timescale to use for the tracks (units per second, 0 is automatic).

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html0000644000175000017500000000666511720565335025366 00000000000000 jpeg

jpeg

jpeg — JPeg plugin library

Plugin Information

filename

libgstjpeg.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

jpegdec

Decode images from JPEG format

jpegenc

Encode images in JPEG format

smokedec

Decode video from Smoke format

smokeenc

Encode images into the Smoke format
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-3gppmux.html0000644000175000017500000002203611720565335024536 00000000000000 3gppmux

3gppmux

3gppmux — Muxer for 3GPP (.3gp) files

Synopsis


Description

This element merges streams (audio and video) into 3GPP (.3gp) files.

The following background intends to explain why various similar muxers are present in this plugin.

The QuickTime file format specification served as basis for the MP4 file format specification (mp4mux), and as such the QuickTime file structure is nearly identical to the so-called ISO Base Media file format defined in ISO 14496-12 (except for some media specific parts). In turn, the latter ISO Base Media format was further specialized as a Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) and in various 3GPP(2) specs (gppmux). The fragmented file features defined (only) in ISO Base Media are used by ISMV files making up (a.o.) Smooth Streaming (ismlmux).

A few properties (movie-timescale, trak-timescale) allow adjusting some technical parameters, which might be useful in (rare) cases to resolve compatibility issues in some situations.

Some other properties influence the result more fundamentally. A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, somewhat contrary to this usually being called "the header". However, a faststart file will (with some effort) arrange this to be located near start of the file, which then allows it e.g. to be played while downloading. Alternatively, rather than having one chunk of metadata at start (or end), there can be some metadata at start and most of the other data can be spread out into fragments of fragment-duration. If such fragmented layout is intended for streaming purposes, then streamable allows foregoing to add index metadata (at the end of file).

dts-method allows selecting a method for managing input timestamps (stay tuned for 0.11 to have this automagically settled). The default delta/duration method should handle nice (aka perfect streams) just fine, but may experience problems otherwise (e.g. input stream with re-ordered B-frames and/or with frame dropping). The re-ordering approach re-assigns incoming timestamps in ascending order to incoming buffers and offers an alternative in such cases. In cases where that might fail, the remaining method can be tried, which is exact and according to specs, but might experience playback on not so spec-wise players. Note that this latter approach also requires one to enable presentation-timestamp.

Example pipelines

1
gst-launch v4l2src num-buffers=50 ! queue ! ffenc_h263 ! gppmux ! filesink location=video.3gp
Records a video stream captured from a v4l2 device, encodes it into H.263 and muxes it into an 3gp file.

Documentation last reviewed on 2011-04-21

Synopsis

Element Information

plugin

isomp4

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]

name

video_%d

direction

sink

presence

request

details

video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)3gpp

Details

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-alpha.html0000644000175000017500000006175411720565335024232 00000000000000 alpha

alpha

alpha — Adds an alpha channel to video - uniform or via chroma-keying

Synopsis

struct              GstAlpha;
enum                GstAlphaMethod;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstAlpha

Properties

  "alpha"                    gdouble               : Read / Write
  "angle"                    gfloat                : Read / Write
  "method"                   GstAlphaMethod        : Read / Write
  "noise-level"              gfloat                : Read / Write
  "target-b"                 guint                 : Read / Write
  "target-g"                 guint                 : Read / Write
  "target-r"                 guint                 : Read / Write
  "black-sensitivity"        guint                 : Read / Write
  "white-sensitivity"        guint                 : Read / Write
  "prefer-passthrough"       gboolean              : Read / Write

Description

The alpha element adds an alpha channel to a video stream. The values of the alpha channel can be either be set to a constant or can be dynamically calculated via chroma keying, e.g. blue can be set as the transparent color.

Sample pipeline:

1
2
3
gst-launch videotestsrc pattern=smpte75 ! alpha method=green ! \
  videomixer name=mixer ! ffmpegcolorspace ! autovideosink     \
  videotestsrc pattern=snow ! mixer.

This pipeline adds a alpha channel to the SMPTE color bars with green as the transparent color and mixes the output with a snow video stream.

Synopsis

Element Information

plugin

alpha

author

Wim Taymans <wim@fluendo.com> Edward Hervey <edward.hervey@collabora.co.uk> Jan Schmidt <thaytan@noraisin.net>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstAlpha

struct GstAlpha;


enum GstAlphaMethod

typedef enum {
  ALPHA_METHOD_SET,
  ALPHA_METHOD_GREEN,
  ALPHA_METHOD_BLUE,
  ALPHA_METHOD_CUSTOM,
} GstAlphaMethod;

ALPHA_METHOD_SET

Set/adjust alpha channel

ALPHA_METHOD_GREEN

Chroma Key green

ALPHA_METHOD_BLUE

Chroma Key blue

ALPHA_METHOD_CUSTOM

Chroma Key on target_r/g/b

Property Details

The "alpha" property

  "alpha"                    gdouble               : Read / Write

The value for the alpha channel.

Allowed values: [0,1]

Default value: 1


The "angle" property

  "angle"                    gfloat                : Read / Write

Size of the colorcube to change.

Allowed values: [0,90]

Default value: 20


The "method" property

  "method"                   GstAlphaMethod        : Read / Write

How the alpha channels should be created.

Default value: Set/adjust alpha channel


The "noise-level" property

  "noise-level"              gfloat                : Read / Write

Size of noise radius.

Allowed values: [0,64]

Default value: 2


The "target-b" property

  "target-b"                 guint                 : Read / Write

The Blue target.

Allowed values: <= 255

Default value: 0


The "target-g" property

  "target-g"                 guint                 : Read / Write

The Green target.

Allowed values: <= 255

Default value: 255


The "target-r" property

  "target-r"                 guint                 : Read / Write

The Red target.

Allowed values: <= 255

Default value: 0


The "black-sensitivity" property

  "black-sensitivity"        guint                 : Read / Write

Sensitivity to dark colors.

Allowed values: <= 128

Default value: 100


The "white-sensitivity" property

  "white-sensitivity"        guint                 : Read / Write

Sensitivity to bright colors.

Allowed values: <= 128

Default value: 100


The "prefer-passthrough" property

  "prefer-passthrough"       gboolean              : Read / Write

Don't do any processing for alpha=1.0 if possible.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-avimux.html0000644000175000017500000003335011720565335024445 00000000000000 avimux

avimux

avimux — Muxes audio and video into an avi stream

Synopsis

struct              GstAviMux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAviMux

Implemented Interfaces

GstAviMux implements GstTagSetter.

Properties

  "bigfile"                  gboolean              : Read / Write

Description

Muxes raw or compressed audio and/or video streams into an AVI file.

Example launch lines

(write everything in one line, without the backslash characters)

1
2
3
4
5
6
gst-launch videotestsrc num-buffers=250 \
! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \
! queue ! mux. \
audiotestsrc num-buffers=440 ! audioconvert \
! 'audio/x-raw-int,rate=44100,channels=2' ! queue ! mux. \
avimux name=mux ! filesink location=test.avi
This will create an .AVI file containing an uncompressed video stream with a test picture and an uncompressed audio stream containing a test sound.
1
2
3
4
5
6
gst-launch videotestsrc num-buffers=250 \
! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \
! xvidenc ! queue ! mux. \
audiotestsrc num-buffers=440 ! audioconvert ! 'audio/x-raw-int,rate=44100,channels=2' \
! lame ! queue ! mux. \
avimux name=mux ! filesink location=test.avi
This will create an .AVI file containing the same test video and sound as above, only that both streams will be compressed this time. This will only work if you have the necessary encoder elements installed of course.

Synopsis

Element Information

plugin

avi

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-wma, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], wmaversion=(int)[ 1, 2 ]

name

video_%d

direction

sink

presence

request

details

video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], divxversion=(int)[ 3, 5 ]

video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], msmpegversion=(int)[ 41, 43 ]

video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false

video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dv, width=(int)720, height=(int){ 576, 480 }, framerate=(fraction)[ 0/1, 2147483647/1 ], systemstream=(boolean)false

video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ], wmvversion=(int)[ 1, 3 ]

image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-vp8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-msvideo

Details

struct GstAviMux

struct GstAviMux;

Property Details

The "bigfile" property

  "bigfile"                  gboolean              : Read / Write

Support for openDML-2.0 (big) AVI files.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-id3v2mux.html0000644000175000017500000001310311720565335024607 00000000000000 id3v2mux

id3v2mux

id3v2mux — Adds an ID3v2 header to the beginning of MP3 files using taglib

Synopsis

struct              GstId3v2Mux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstTagLibMux
                     +----GstId3v2Mux

Implemented Interfaces

GstId3v2Mux implements GstTagSetter.

Description

Synopsis

Element Information

plugin

taglib

author

Christophe Fergeau <teuf@gnome.org>

class

Formatter/Metadata

Element Pads

name

sink

direction

sink

presence

always

details

ANY

name

src

direction

source

presence

always

details

application/x-id3

Details

struct GstId3v2Mux

struct GstId3v2Mux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html0000644000175000017500000000570711720565335026265 00000000000000 wavparse

wavparse

wavparse — Parse a .wav file into raw audio

Plugin Information

filename

libgstwavparse.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

wavparse

Parse a .wav file into raw audio
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-avidemux.html0000644000175000017500000006571311720565335024766 00000000000000 avidemux

avidemux

avidemux — Demultiplex an avi file into audio and video

Synopsis

                    GstAviDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAviDemux

Description

Demuxes an .avi file into raw or compressed audio and/or video streams.

This element supports both push and pull-based scheduling, depending on the capabilities of the upstream elements.

Example launch line

1
gst-launch filesrc location=test.avi ! avidemux name=demux  demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink   demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink
Play (parse and decode) an .avi file and try to output it to an automatically detected soundcard and videosink. If the AVI file contains compressed audio or video data, this will only work if you have the right decoder elements/plugins installed.

Last reviewed on 2006-12-29 (0.10.6)

Synopsis

Element Information

plugin

avi

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>, Thijs Vermeir <thijsvermeir@gmail.com>

class

Codec/Demuxer

Element Pads

name

sink

direction

sink

presence

always

details

video/x-msvideo

name

audio_%02d

direction

source

presence

sometimes

details

audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]

audio/x-dts

audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]

audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/AMR, rate=(int)8000, channels=(int)1

audio/AMR-WB, rate=(int)16000, channels=(int)1

audio/x-siren

application/x-ogg-avi

audio/x-avi-unknown

name

subtitle_%02d

direction

source

presence

sometimes

details

application/x-subtitle-avi

name

video_%02d

direction

source

presence

sometimes

details

video/x-3ivx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-asus, asusversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-asus, asusversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-cirrus-logic-accupak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-camstudio, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-compressed-yuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-rgb, bpp=(int){ 8, 24, 32 }, depth=(int){ 8, 24 }, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-divx, divxversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-divx, divxversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-truemotion, trueversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dv, systemstream=(boolean)false, dvversion=(int)25, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dv, systemstream=(boolean)false, dvversion=(int)50, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-divx, divxversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-flash-video, flvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)lucent, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-huffyuv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-intel-h263, variant=(string)intel, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)lead, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)microsoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, mpegversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/jpeg, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msmpeg, msmpegversion=(int)42, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msmpeg, msmpegversion=(int)43, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, systemstream=(boolean)false, mpegversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/mpeg, systemstream=(boolean)false, mpegversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msmpeg, msmpegversion=(int)41, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-mszh, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/png, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-rle, layout=(string)microsoft, depth=(int)[ 1, 64 ], framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-indeo, indeoversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/sp5x, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-truemotion, trueversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-camtasia, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ultimotion, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ati-vcr, vcrversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ati-vcr, vcrversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)vdolive, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)vivo, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vmnc, version=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)videosoft, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-wmv, wmvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-wmv, wmvversion=(int)2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-wmv, wmvversion=(int)3, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-xvid, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-xan, wcversion=(int)4, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)YVU9, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-zlib, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-cinepak, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h264, variant=(string)itu, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-msvideocodec, msvideoversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-h263, variant=(string)xirlink, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dirac, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-ffv, ffvversion=(int)1, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-kmvc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp5, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp6, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp6-flash, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp7, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-vp8, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-mimic, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-apple-video, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-theora, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-fraps, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-aasc, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-raw-yuv, format=(fourcc)YV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-loco, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-zmbv, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

video/x-dv, systemstream=(boolean)true

video/x-avi-unknown

Details

GstAviDemux

typedef struct _GstAviDemux GstAviDemux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-quarktv.html0000644000175000017500000002274111720565335024633 00000000000000 quarktv

quarktv

quarktv — Motion dissolver

Synopsis

struct              GstQuarkTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstQuarkTV

Properties

  "planes"                   gint                  : Read / Write

Description

QuarkTV disolves moving objects. It picks up pixels from the last frames randomly.

Example launch line

1
gst-launch -v videotestsrc ! quarktv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of quarktv on a test stream.

Synopsis

Element Information

plugin

effectv

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstQuarkTV

struct GstQuarkTV;

Property Details

The "planes" property

  "planes"                   gint                  : Read / Write

Number of planes.

Allowed values: [0,64]

Default value: 16

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-dicetv.html0000644000175000017500000002707511720565335024421 00000000000000 dicetv

dicetv

dicetv — 'Dices' the screen up into many small squares

Synopsis

struct              GstDiceTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstDiceTV

Properties

  "square-bits"              gint                  : Read / Write

Signals

  "reset"                                          : Run Last

Description

DiceTV 'dices' the screen up into many small squares, each defaulting to a size of 16 pixels by 16 pixels.. Each square is rotated randomly in one of four directions: up (no change), down (180 degrees, or upside down), right (90 degrees clockwise), or left (90 degrees counterclockwise). The direction of each square normally remains consistent between each frame.

Example launch line

1
gst-launch -v videotestsrc ! dicetv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of dicetv on a test stream.

Synopsis

Element Information

plugin

effectv

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstDiceTV

struct GstDiceTV;

Property Details

The "square-bits" property

  "square-bits"              gint                  : Read / Write

The size of the Squares.

Allowed values: [0,5]

Default value: 4

Signal Details

The "reset" signal

void                user_function                      (GstDiceTV *gstdicetv,
                                                        gpointer   user_data)      : Run Last

gstdicetv :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rglimiter.html0000644000175000017500000002021611720565335025127 00000000000000 rglimiter

rglimiter

rglimiter — Apply signal compression to raw audio data

Synopsis

struct              GstRgLimiter;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstRgLimiter

Properties

  "enabled"                  gboolean              : Read / Write

Description

This element applies signal compression/limiting to raw audio data. It performs strict hard limiting with soft-knee characteristics, using a threshold of -6 dB. This type of filter is mentioned in the proposed ReplayGain standard.

Example launch line

1
2
3
gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \
           ! rgvolume pre-amp=6.0 headroom=10.0 ! rglimiter \
           ! audioconvert ! audioresample ! alsasink
Playback of a file

Synopsis

Element Information

plugin

replaygain

author

René Stadler <mail@renestadler.de>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int)32, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234

Details

struct GstRgLimiter

struct GstRgLimiter;

Opaque data structure.

Property Details

The "enabled" property

  "enabled"                  gboolean              : Read / Write

Enable processing.

Default value: TRUE

See Also

GstRgVolume
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-esdsink.html0000644000175000017500000001510011720565335024565 00000000000000 esdsink

esdsink

esdsink — Plays audio to an esound server

Synopsis

struct              GstEsdSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstBaseAudioSink
                           +----GstAudioSink
                                 +----GstEsdSink

Properties

  "host"                     gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

esdsink

author

Arwed von Merkatz <v.merkatz@gmx.net>

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

Details

struct GstEsdSink

struct GstEsdSink;

Property Details

The "host" property

  "host"                     gchar*                : Read / Write

The host running the esound daemon.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flactag.html0000644000175000017500000001272611720565335024541 00000000000000 flactag

flactag

flactag — Rewrite tags in a FLAC file

Synopsis

struct              GstFlacTag;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstFlacTag

Implemented Interfaces

GstFlacTag implements GstTagSetter.

Description

Synopsis

Element Information

plugin

flac

author

Christophe Fergeau <teuf@gnome.org>

class

Formatter/Metadata

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-flac

name

src

direction

source

presence

always

details

audio/x-flac

Details

struct GstFlacTag

struct GstFlacTag;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-oss4mixer.html0000644000175000017500000001560411720565335025073 00000000000000 oss4mixer

oss4mixer

oss4mixer — Control sound input and output levels with OSS4

Synopsis

struct              GstOss4Mixer;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstOss4Mixer

Implemented Interfaces

GstOss4Mixer implements GstImplementsInterface, GstMixer and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read

Description

Synopsis

Element Information

plugin

oss4

author

Tim-Philipp Müller <tim centricular net>

class

Generic/Audio

Element Pads

Details

struct GstOss4Mixer

struct GstOss4Mixer;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

OSS mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) (NULL = use first mixer device found).

Default value: NULL


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html0000644000175000017500000000662411720565335025224 00000000000000 udp

udp

udp — transfer data via UDP

Plugin Information

filename

libgstudp.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

dynudpsink

Send data over the network via UDP

multiudpsink

Send data over the network via UDP

udpsink

Send data over the network via UDP

udpsrc

Receive data over the network via UDP
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gconfvideosink.html0000644000175000017500000001213611720565335026143 00000000000000 gconfvideosink

gconfvideosink

gconfvideosink — Video sink embedding the GConf-settings for video output

Synopsis

                    GstGConfVideoSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstSwitchSink
                           +----GstGConfVideoSink

Implemented Interfaces

GstGConfVideoSink implements GstChildProxy.

Description

Synopsis

Element Information

plugin

gconfelements

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Sink/Video

Element Pads

Details

GstGConfVideoSink

typedef struct _GstGConfVideoSink GstGConfVideoSink;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html0000644000175000017500000000567711720565335025404 00000000000000 goom

goom

goom — GOOM visualization filter

Plugin Information

filename

libgstgoom.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

goom

Takes frames of data and outputs video frames using the GOOM filter
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-oss4sink.html0000644000175000017500000002446111720565335024714 00000000000000 oss4sink

oss4sink

oss4sink — Output to a sound card via OSS version 4

Synopsis

struct              GstOss4Sink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstBaseAudioSink
                           +----GstAudioSink
                                 +----GstOss4Sink

Implemented Interfaces

GstOss4Sink implements GstStreamVolume and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read
  "mute"                     gboolean              : Read / Write
  "volume"                   gdouble               : Read / Write

Description

Synopsis

Element Information

plugin

oss4

author

Tim-Philipp Müller <tim centricular net>

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

Details

struct GstOss4Sink

struct GstOss4Sink;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available playback device).

Default value: NULL


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL


The "mute" property

  "mute"                     gboolean              : Read / Write

Mute state of this stream.

Default value: FALSE


The "volume" property

  "volume"                   gdouble               : Read / Write

Linear volume of this stream, 1.0=100%.

Allowed values: [0,10]

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-mulawenc.html0000644000175000017500000001205611720565335024747 00000000000000 mulawenc

mulawenc

mulawenc — Convert 16bit PCM to 8bit mu law

Synopsis

struct              GstMuLawDec;
struct              GstMuLawEnc;

Description

This element encode mulaw audio. Mulaw coding is also known as G.711.

Synopsis

Element Information

plugin

mulaw

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Encoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

Details

struct GstMuLawDec

struct GstMuLawDec;


struct GstMuLawEnc

struct GstMuLawEnc {
  GstElement element;

  GstPad *sinkpad,*srcpad;

  gint channels;
  gint rate;
};

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gstrtpssrcdemux.html0000644000175000017500000003363111720565335026417 00000000000000 gstrtpssrcdemux

gstrtpssrcdemux

gstrtpssrcdemux — Splits RTP streams based on the SSRC

Synopsis

struct              GstRtpSsrcDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstRtpSsrcDemux

Description

gstrtpssrcdemux acts as a demuxer for RTP packets based on the SSRC of the packets. Its main purpose is to allow an application to easily receive and decode an RTP stream with multiple SSRCs.

For each SSRC that is detected, a new pad will be created and the "new-ssrc-pad" signal will be emitted.

Example pipelines

1
gst-launch udpsrc caps="application/x-rtp" ! gstrtpssrcdemux ! fakesink
Takes an RTP stream and send the RTP packets with the first detected SSRC to fakesink, discarding the other SSRCs.

Last reviewed on 2007-05-28 (0.10.5)

Synopsis

Element Information

plugin

gstrtpmanager

author

Wim Taymans <wim.taymans@gmail.com>

class

Demux/Network/RTP

Element Pads

name

rtcp_sink

direction

sink

presence

always

details

application/x-rtcp

name

sink

direction

sink

presence

always

details

application/x-rtp

name

rtcp_src_%d

direction

source

presence

sometimes

details

application/x-rtcp

name

src_%d

direction

source

presence

sometimes

details

application/x-rtp

Details

struct GstRtpSsrcDemux

struct GstRtpSsrcDemux;

Signal Details

The "clear-ssrc" signal

void                user_function                      (GstRtpSsrcDemux *demux,
                                                        guint            ssrc,
                                                        gpointer         user_data)      : Action

Action signal to remove the pad for SSRC.

demux :

the object which received the signal

ssrc :

the SSRC of the pad

user_data :

user data set when the signal handler was connected.

The "new-ssrc-pad" signal

void                user_function                      (GstRtpSsrcDemux *demux,
                                                        guint            ssrc,
                                                        GstPad          *pad,
                                                        gpointer         user_data)      : Run Last

Emited when a new SSRC pad has been created.

demux :

the object which received the signal

ssrc :

the SSRC of the pad

pad :

the new pad.

user_data :

user data set when the signal handler was connected.

The "removed-ssrc-pad" signal

void                user_function                      (GstRtpSsrcDemux *demux,
                                                        guint            ssrc,
                                                        GstPad          *pad,
                                                        gpointer         user_data)      : Run Last

Emited when a SSRC pad has been removed.

demux :

the object which received the signal

ssrc :

the SSRC of the pad

pad :

the removed pad.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-autovideosrc.html0000644000175000017500000001757211720565335025653 00000000000000 autovideosrc

autovideosrc

autovideosrc — Wrapper video source for automatically detected video source

Synopsis

                    GstAutoVideoSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstAutoVideoSrc

Implemented Interfaces

GstAutoVideoSrc implements GstChildProxy.

Properties

  "filter-caps"              GstCaps*              : Read / Write

Description

autovideosrc is a video src that automatically detects an appropriate video source to use. It does so by scanning the registry for all elements that have Source and Video in the class field of their element information, and also have a non-zero autoplugging rank.

Example launch line

1
gst-launch -v -m autovideosrc ! xvimagesink

Synopsis

Element Information

plugin

autodetect

author

Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net>

class

Source/Video

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

GstAutoVideoSrc

typedef struct _GstAutoVideoSrc GstAutoVideoSrc;

Property Details

The "filter-caps" property

  "filter-caps"              GstCaps*              : Read / Write

This property will filter out candidate sources that can handle the specified caps. By default only video sources that support raw rgb and yuv video are selected.

This property can only be set before the element goes to the READY state.

Since 0.10.14

See Also

autoaudiosrc, v4l2src, v4lsrc
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-ossmixer.html0000644000175000017500000001534311720565335025007 00000000000000 ossmixer

ossmixer

ossmixer — Control sound input and output levels with OSS

Synopsis

struct              GstOssMixerElement;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstOssMixerElement

Implemented Interfaces

GstOssMixerElement implements GstImplementsInterface and GstMixer.

Properties

  "device-name"              gchar*                : Read
  "device"                   gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

ossaudio

author

Andrew Vander Wingo <wingo@pobox.com>

class

Generic/Audio

Element Pads

Details

struct GstOssMixerElement

struct GstOssMixerElement;

Property Details

The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL


The "device" property

  "device"                   gchar*                : Read / Write

OSS mixer device (usually /dev/mixer).

Default value: "/dev/mixer"

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-efence.html0000644000175000017500000000653111720565335025656 00000000000000 efence

efence

efence — 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 "Electric Fence".

Plugin Information

filename

libgstefence.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

efence

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 "Electric Fence".
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html0000644000175000017500000001054511720565335025644 00000000000000 isomp4

isomp4

isomp4 — ISO base media file format support (mp4, 3gpp, qt, mj2)

Plugin Information

filename

libgstisomp4.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

3gppmux

Multiplex audio and video into a 3GPP file

gppmux

Multiplex audio and video into a 3GPP file (deprecated)

ismlmux

Multiplex audio and video into a ISML file

mj2mux

Multiplex audio and video into a MJ2 file

mp4mux

Multiplex audio and video into a MP4 file

qtdemux

Demultiplex a QuickTime file into audio and video streams

qtmoovrecover

Recovers unfinished qtmux files

qtmux

Multiplex audio and video into a QuickTime file

rtpxqtdepay

Extracts Quicktime audio/video from RTP packets
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-videomixer.html0000644000175000017500000007121711720565335025313 00000000000000 videomixer

videomixer

videomixer — Mix multiple video streams

Synopsis

struct              GstVideoMixer;
enum                GstVideoMixerBackground;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstVideoMixer

Implemented Interfaces

GstVideoMixer implements GstChildProxy.

Properties

  "background"               GstVideoMixerBackground  : Read / Write

Description

Videomixer can accept AYUV, ARGB and BGRA video streams. For each of the requested sink pads it will compare the incoming geometry and framerate to define the output parameters. Indeed output video frames will have the geometry of the biggest incoming video stream and the framerate of the fastest incoming one.

All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not supported. The src pad will have the same colorspace as the sinks. No colorspace conversion is done.

Individual parameters for each input stream can be configured on the GstVideoMixerPad.

Sample pipelines

1
2
3
4
5
6
7
8
gst-launch-0.10 \
  videotestsrc pattern=1 ! \
  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \
  videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \
  videomixer name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \
  ffmpegcolorspace ! xvimagesink \
  videotestsrc ! \
  video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix.
A pipeline to demonstrate videomixer used together with videobox. This should show a 320x240 pixels video test source with some transparency showing the background checker pattern. Another video test source with just the snow pattern of 100x100 pixels is overlayed on top of the first one on the left vertically centered with a small transparency showing the first video test source behind and the checker pattern under it. Note that the framerate of the output video is 10 frames per second.
1
2
3
4
5
gst-launch videotestsrc pattern=1 ! \
  video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \
  videomixer name=mix ! ffmpegcolorspace ! ximagesink \
  videotestsrc !  \
  video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending).
1
2
3
4
5
gst-launch videotestsrc pattern=1 ! \
  video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \
  videomixer name=mix ! ffmpegcolorspace ! ximagesink \
  videotestsrc ! \
  video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix.
A pipeline to test I420
1
gst-launch videotestsrc pattern="snow" ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=200, height=150 ! videomixer name=mix sink_1::xpos=20 sink_1::ypos=20 sink_1::alpha=0.5 ! ffmpegcolorspace ! xvimagesink videotestsrc ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=640, height=360 ! mix.
Set position and alpha on the mixer using GstVideoMixerPad properties.

Synopsis

Element Information

plugin

videomixer

author

Wim Taymans <wim@fluendo.com>

class

Filter/Editor/Video

Element Pads

name

sink_%d

direction

sink

presence

request

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVideoMixer

struct GstVideoMixer;

The opaque GstVideoMixer structure.


enum GstVideoMixerBackground

typedef enum {
  VIDEO_MIXER_BACKGROUND_CHECKER,
  VIDEO_MIXER_BACKGROUND_BLACK,
  VIDEO_MIXER_BACKGROUND_WHITE,
  VIDEO_MIXER_BACKGROUND_TRANSPARENT,
} GstVideoMixerBackground;

The different backgrounds videomixer can blend over.

VIDEO_MIXER_BACKGROUND_CHECKER

checker pattern background

VIDEO_MIXER_BACKGROUND_BLACK

solid color black background

VIDEO_MIXER_BACKGROUND_WHITE

solid color white background

VIDEO_MIXER_BACKGROUND_TRANSPARENT

background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing.

Property Details

The "background" property

  "background"               GstVideoMixerBackground  : Read / Write

Background type.

Default value: Checker pattern

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html0000644000175000017500000000624611720565335026455 00000000000000 multipart

multipart

multipart — multipart stream manipulation

Plugin Information

filename

libgstmultipart.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

multipartdemux

demux multipart streams

multipartmux

mux multipart streams
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html0000644000175000017500000000670211720565335026423 00000000000000 multifile

multifile

multifile — Reads/Writes buffers from/to sequentially named files

Plugin Information

filename

libgstmultifile.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

multifilesink

Write buffers to a sequentially named set of files

multifilesrc

Read a sequentially named set of files into buffers

splitfilesrc

Read a sequentially named set of files as if it was one large file
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-edgetv.html0000644000175000017500000001633311720565335024414 00000000000000 edgetv

edgetv

edgetv — Apply edge detect on video

Synopsis

struct              GstEdgeTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstEdgeTV

Description

EdgeTV detects edges and display it in good old low resolution computer way.

Example launch line

1
gst-launch -v videotestsrc ! edgetv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of edgetv on a test stream.

Synopsis

Element Information

plugin

effectv

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstEdgeTV

struct GstEdgeTV;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-halaudiosrc.html0000644000175000017500000001457211720565335025437 00000000000000 halaudiosrc

halaudiosrc

halaudiosrc — Audio source for sound device access via HAL

Synopsis

                    GstHalAudioSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstHalAudioSrc

Implemented Interfaces

GstHalAudioSrc implements GstChildProxy.

Properties

  "udi"                      gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

halelements

author

Jürg Billeter <j@bitron.ch>

class

Source/Audio

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

GstHalAudioSrc

typedef struct _GstHalAudioSrc GstHalAudioSrc;

Property Details

The "udi" property

  "udi"                      gchar*                : Read / Write

Unique Device Id.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-videocrop.html0000644000175000017500000005200711720565335025126 00000000000000 videocrop

videocrop

videocrop — Crops video into a user-defined region

Synopsis

struct              GstVideoCrop;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoCrop

Properties

  "bottom"                   gint                  : Read / Write
  "left"                     gint                  : Read / Write
  "right"                    gint                  : Read / Write
  "top"                      gint                  : Read / Write

Description

This element crops video frames, meaning it can remove parts of the picture on the left, right, top or bottom of the picture and output a smaller picture than the input picture, with the unwanted parts at the border removed.

The videocrop element is similar to the videobox element, but its main goal is to support a multitude of formats as efficiently as possible. Unlike videbox, it cannot add borders to the picture and unlike videbox it will always output images in exactly the same format as the input image.

If there is nothing to crop, the element will operate in pass-through mode.

Note that no special efforts are made to handle chroma-subsampled formats in the case of odd-valued cropping and compensate for sub-unit chroma plane shifts for such formats in the case where the "left" or "top" property is set to an odd number. This doesn't matter for most use cases, but it might matter for yours.

Example launch line

1
gst-launch -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink

Synopsis

Element Information

plugin

videocrop

author

Tim-Philipp Müller <tim centricular net>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVideoCrop

struct GstVideoCrop;

Property Details

The "bottom" property

  "bottom"                   gint                  : Read / Write

Pixels to crop at bottom.

Allowed values: >= 0

Default value: 0


The "left" property

  "left"                     gint                  : Read / Write

Pixels to crop at left.

Allowed values: >= 0

Default value: 0


The "right" property

  "right"                    gint                  : Read / Write

Pixels to crop at right.

Allowed values: >= 0

Default value: 0


The "top" property

  "top"                      gint                  : Read / Write

Pixels to crop at top.

Allowed values: >= 0

Default value: 0

See Also

GstVideoBox
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rtpj2kpay.html0000644000175000017500000001550711720565335025066 00000000000000 rtpj2kpay

rtpj2kpay

rtpj2kpay — Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)

Synopsis

struct              GstRtpJ2KPay;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseRTPPayload
                     +----GstRtpJ2KPay

Properties

  "buffer-list"              gboolean              : Read / Write

Description

Payload encode JPEG 2000 pictures into RTP packets according to RFC 5371. For detailed information see: http://www.rfc-editor.org/rfc/rfc5371.txt

The payloader takes a JPEG 2000 picture, scans the header for packetization units and constructs the RTP packet header followed by the actual JPEG 2000 codestream.

Synopsis

Element Information

plugin

rtp

author

Wim Taymans <wim.taymans@gmail.com>

class

Codec/Payloader/Network/RTP

Element Pads

name

sink

direction

sink

presence

always

details

image/x-jpc

name

src

direction

source

presence

always

details

application/x-rtp, media=(string)video, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)JPEG2000

Details

struct GstRtpJ2KPay

struct GstRtpJ2KPay;

Property Details

The "buffer-list" property

  "buffer-list"              gboolean              : Read / Write

Use Buffer Lists.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-mj2mux.html0000644000175000017500000004364611720565335024367 00000000000000 mj2mux

mj2mux

mj2mux — Muxer for Motion JPEG-2000 (.mj2) files

Synopsis

                    GstMJ2Mux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMJ2Mux

Implemented Interfaces

GstMJ2Mux implements GstTagSetter and GstTagXmpWriter.

Properties

  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
  "faststart"                gboolean              : Read / Write
  "faststart-file"           gchar*                : Read / Write / Construct
  "fragment-duration"        guint                 : Read / Write / Construct
  "moov-recovery-file"       gchar*                : Read / Write / Construct
  "movie-timescale"          guint                 : Read / Write / Construct
  "presentation-time"        gboolean              : Read / Write / Construct
  "streamable"               gboolean              : Read / Write / Construct
  "trak-timescale"           guint                 : Read / Write / Construct

Description

This element merges streams (audio and video) into MJ2 (.mj2) files.

The following background intends to explain why various similar muxers are present in this plugin.

The QuickTime file format specification served as basis for the MP4 file format specification (mp4mux), and as such the QuickTime file structure is nearly identical to the so-called ISO Base Media file format defined in ISO 14496-12 (except for some media specific parts). In turn, the latter ISO Base Media format was further specialized as a Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) and in various 3GPP(2) specs (gppmux). The fragmented file features defined (only) in ISO Base Media are used by ISMV files making up (a.o.) Smooth Streaming (ismlmux).

A few properties (movie-timescale, trak-timescale) allow adjusting some technical parameters, which might be useful in (rare) cases to resolve compatibility issues in some situations.

Some other properties influence the result more fundamentally. A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, somewhat contrary to this usually being called "the header". However, a faststart file will (with some effort) arrange this to be located near start of the file, which then allows it e.g. to be played while downloading. Alternatively, rather than having one chunk of metadata at start (or end), there can be some metadata at start and most of the other data can be spread out into fragments of fragment-duration. If such fragmented layout is intended for streaming purposes, then streamable allows foregoing to add index metadata (at the end of file).

dts-method allows selecting a method for managing input timestamps (stay tuned for 0.11 to have this automagically settled). The default delta/duration method should handle nice (aka perfect streams) just fine, but may experience problems otherwise (e.g. input stream with re-ordered B-frames and/or with frame dropping). The re-ordering approach re-assigns incoming timestamps in ascending order to incoming buffers and offers an alternative in such cases. In cases where that might fail, the remaining method can be tried, which is exact and according to specs, but might experience playback on not so spec-wise players. Note that this latter approach also requires one to enable presentation-timestamp.

Example pipelines

1
gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2
Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 and muxes it into an mj2 file.

Documentation last reviewed on 2011-04-21

Synopsis

Element Information

plugin

isomp4

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }

audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

name

video_%d

direction

sink

presence

request

details

image/x-j2c, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/x-jpc, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/mj2

Details

GstMJ2Mux

typedef struct _GstMJ2Mux GstMJ2Mux;

Property Details

The "dts-method" property

  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct

Method to determine DTS time.

Default value: reorder


The "faststart" property

  "faststart"                gboolean              : Read / Write

If the file should be formatted for faststart (headers first).

Default value: FALSE


The "faststart-file" property

  "faststart-file"           gchar*                : Read / Write / Construct

File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically.

Default value: NULL


The "fragment-duration" property

  "fragment-duration"        guint                 : Read / Write / Construct

Fragment durations in ms (produce a fragmented file if > 0).

Default value: 0


The "moov-recovery-file" property

  "moov-recovery-file"       gchar*                : Read / Write / Construct

File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental).

Default value: NULL


The "movie-timescale" property

  "movie-timescale"          guint                 : Read / Write / Construct

Timescale to use in the movie (units per second).

Allowed values: >= 1

Default value: 1000


The "presentation-time" property

  "presentation-time"        gboolean              : Read / Write / Construct

Calculate and include presentation/composition time (in addition to decoding time).

Default value: TRUE


The "streamable" property

  "streamable"               gboolean              : Read / Write / Construct

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

Default value: FALSE


The "trak-timescale" property

  "trak-timescale"           guint                 : Read / Write / Construct

Timescale to use for the tracks (units per second, 0 is automatic).

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/GstIirEqualizer.html0000644000175000017500000001101111720565335021326 00000000000000 GstIirEqualizer

GstIirEqualizer

GstIirEqualizer

Synopsis

struct              GstIirEqualizer;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstIirEqualizer
                                 +----GstIirEqualizer10Bands
                                 +----GstIirEqualizer3Bands
                                 +----GstIirEqualizerNBands

Implemented Interfaces

GstIirEqualizer implements GstChildProxy.

Description

Details

struct GstIirEqualizer

struct GstIirEqualizer;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-speexenc.html0000644000175000017500000003233011720565335024743 00000000000000 speexenc

speexenc

speexenc — Encodes audio in Speex format

Synopsis

struct              GstSpeexEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAudioEncoder
                     +----GstSpeexEnc

Implemented Interfaces

GstSpeexEnc implements GstTagSetter and GstPreset.

Properties

  "abr"                      gint                  : Read / Write / Construct
  "bitrate"                  gint                  : Read / Write / Construct
  "complexity"               gint                  : Read / Write / Construct
  "dtx"                      gboolean              : Read / Write / Construct
  "last-message"             gchar*                : Read
  "nframes"                  gint                  : Read / Write / Construct
  "quality"                  gfloat                : Read / Write / Construct
  "vad"                      gboolean              : Read / Write / Construct
  "vbr"                      gboolean              : Read / Write / Construct
  "mode"                     GstSpeexEncMode       : Read / Write / Construct

Description

Synopsis

Element Information

plugin

speex

author

Wim Taymans <wim@fluendo.com>

class

Codec/Encoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16

name

src

direction

source

presence

always

details

audio/x-speex, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ]

Details

struct GstSpeexEnc

struct GstSpeexEnc;

Property Details

The "abr" property

  "abr"                      gint                  : Read / Write / Construct

Enable average bit-rate (0 = disabled).

Allowed values: >= 0

Default value: 0


The "bitrate" property

  "bitrate"                  gint                  : Read / Write / Construct

Specify an encoding bit-rate (in bps). (0 = automatic).

Allowed values: >= 0

Default value: 0


The "complexity" property

  "complexity"               gint                  : Read / Write / Construct

Set encoding complexity.

Allowed values: >= 0

Default value: 3


The "dtx" property

  "dtx"                      gboolean              : Read / Write / Construct

Enable discontinuous transmission.

Default value: FALSE


The "last-message" property

  "last-message"             gchar*                : Read

The last status message.

Default value: NULL


The "nframes" property

  "nframes"                  gint                  : Read / Write / Construct

Number of frames per buffer.

Allowed values: >= 0

Default value: 1


The "quality" property

  "quality"                  gfloat                : Read / Write / Construct

Encoding quality.

Allowed values: [0,10]

Default value: 8


The "vad" property

  "vad"                      gboolean              : Read / Write / Construct

Enable voice activity detection.

Default value: FALSE


The "vbr" property

  "vbr"                      gboolean              : Read / Write / Construct

Enable variable bit-rate.

Default value: FALSE


The "mode" property

  "mode"                     GstSpeexEncMode       : Read / Write / Construct

The encoding mode.

Default value: Auto

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-goom2k1.html0000644000175000017500000001454611720565335024421 00000000000000 goom2k1

goom2k1

goom2k1 — Takes frames of data and outputs video frames using the GOOM 2k1 filter

Synopsis

struct              GstGoom;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstGoom

Description

Goom2k1 is an audio visualisation element. It creates warping structures based on the incomming audio signal. Goom2k1 is the older version of the visualisation. Also available is goom2k4, with a different look.

Example launch line

1
gst-launch -v audiotestsrc ! goom2k1 ! ffmpegcolorspace ! xvimagesink

Synopsis

Element Information

plugin

goom2k1

author

Wim Taymans <wim@fluendo.com>

class

Visualization

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstGoom

struct GstGoom;

See Also

goom, synaesthesia
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-interleave.html0000644000175000017500000003111011720565335025262 00000000000000 interleave

interleave

interleave — Folds many mono channels into one interleaved audio stream

Synopsis

struct              GstInterleave;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstInterleave

Properties

  "channel-positions"        GValueArray*          : Read / Write
  "channel-positions-from-input" gboolean              : Read / Write

Description

Merges separate mono inputs into one interleaved stream.

This element handles all raw floating point sample formats and all signed integer sample formats. The first caps on one of the sinkpads will set the caps of the output so usually an audioconvert element should be placed before every sinkpad of interleave.

It's possible to change the number of channels while the pipeline is running by adding or removing some of the request pads but this will change the caps of the output buffers. Changing the input caps is _not_ supported yet.

The channel number of every sinkpad in the out can be retrieved from the "channel" property of the pad.

Example launch line

1
gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d  interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav    d.src0 ! queue ! audioconvert ! i.sink1    d.src1 ! queue ! audioconvert ! i.sink0
Decodes and deinterleaves a Stereo MP3 file into separate channels and then interleaves the channels again to a WAV file with the channel with the channels exchanged.
1
gst-launch interleave name=i ! audioconvert ! wavenc ! filesink location=file.wav  filesrc location=file1.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink0   filesrc location=file2.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink1
Interleaves two Mono WAV files to a single Stereo WAV file.

Synopsis

Element Information

plugin

interleave

author

Andy Wingo <wingo at pobox.com>, Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Converter/Audio

Element Pads

name

sink%d

direction

sink

presence

request

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }

Details

struct GstInterleave

struct GstInterleave;

Property Details

The "channel-positions" property

  "channel-positions"        GValueArray*          : Read / Write

Channel positions: This property controls the channel positions that are used on the src caps. The number of elements should be the same as the number of sink pads and the array should contain a valid list of channel positions. The n-th element of the array is the position of the n-th sink pad.

These channel positions will only be used if they're valid and the number of elements is the same as the number of channels. If this is not given a NONE layout will be used.


The "channel-positions-from-input" property

  "channel-positions-from-input" gboolean              : Read / Write

Channel positions from input: If this property is set to TRUE the channel positions will be taken from the input caps if valid channel positions for the output can be constructed from them. If this is set to TRUE setting the channel-positions property overwrites this property again.

Default value: TRUE

See Also

deinterleave
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-directsoundsink.html0000644000175000017500000001047111720565335026343 00000000000000 directsoundsink

directsoundsink

directsoundsink — DirectSound audio sink

Synopsis

struct              GstDirectSoundSink;

Description

Synopsis

Element Information

plugin

directsound

author

Sebastien Moutte <sebastien@moutte.net>

class

Sink/Audio

Element Pads

Details

struct GstDirectSoundSink

struct GstDirectSoundSink {
  GstAudioSink sink;

  /* directsound object interface pointer */
  LPDIRECTSOUND pDS;

  /* directsound sound object interface pointer */
  LPDIRECTSOUNDBUFFER pDSBSecondary;

  /* directSound buffer size */
  guint buffer_size;

  /* offset of the circular buffer where we must write next */
  guint current_circular_offset;

  guint bytes_per_sample;

  /* current volume setup by mixer interface */
  glong volume;

  /* tracks list of our mixer interface implementation */
  GList *tracks;

  GstCaps *cached_caps;

  /* lock used to protect writes and resets */
  GMutex *dsound_lock;

  gboolean first_buffer_after_reset;

  GstBufferFormat buffer_format;
};

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-apev2mux.html0000644000175000017500000001312411720565335024700 00000000000000 apev2mux

apev2mux

apev2mux — Adds an APEv2 header to the beginning of files using taglib

Synopsis

struct              GstApev2Mux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstTagLibMux
                     +----GstApev2Mux

Implemented Interfaces

GstApev2Mux implements GstTagSetter.

Description

Synopsis

Element Information

plugin

taglib

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Formatter/Metadata

Element Pads

name

sink

direction

sink

presence

always

details

ANY

name

src

direction

source

presence

always

details

application/x-apetag

Details

struct GstApev2Mux

struct GstApev2Mux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-mulawdec.html0000644000175000017500000001252111720565335024732 00000000000000 mulawdec

mulawdec

mulawdec — Convert 8bit mu law to 16bit PCM

Synopsis

struct              GstMuLawDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMuLawDec

Description

This element decodes mulaw audio. Mulaw coding is also known as G.711.

Synopsis

Element Information

plugin

mulaw

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Decoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

Details

struct GstMuLawDec

struct GstMuLawDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-jackaudiosink.html0000644000175000017500000002021311720565335025745 00000000000000 jackaudiosink

jackaudiosink

jackaudiosink — Output audio to a JACK server

Synopsis

struct              GstJackAudioSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstBaseAudioSink
                           +----GstJackAudioSink

Properties

  "client"                   JackClient*           : Read / Write
  "connect"                  GstJackConnect        : Read / Write
  "server"                   gchar*                : Read / Write
  "client-name"              gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

jack

author

Wim Taymans <wim.taymans@gmail.com>

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstJackAudioSink

struct GstJackAudioSink;

Property Details

The "client" property

  "client"                   JackClient*           : Read / Write

Handle for jack client.


The "connect" property

  "connect"                  GstJackConnect        : Read / Write

Specify how the output ports will be connected.

Default value: Automatically connect ports to physical ports


The "server" property

  "server"                   gchar*                : Read / Write

The Jack server to connect to (NULL = default).

Default value: NULL


The "client-name" property

  "client-name"              gchar*                : Read / Write

The client name of the Jack instance (NULL = default).

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-streaktv.html0000644000175000017500000002305411720565335024777 00000000000000 streaktv

streaktv

streaktv — StreakTV makes after images of moving objects

Synopsis

struct              GstStreakTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstStreakTV

Properties

  "feedback"                 gboolean              : Read / Write

Description

StreakTV makes after images of moving objects.

Example launch line

1
gst-launch -v videotestsrc ! streaktv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of streaktv on a test stream.

Synopsis

Element Information

plugin

effectv

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstStreakTV

struct GstStreakTV;

Property Details

The "feedback" property

  "feedback"                 gboolean              : Read / Write

Feedback.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiowsincband.html0000644000175000017500000003205311720565335026125 00000000000000 audiowsincband

audiowsincband

audiowsincband — Band pass and band reject windowed sinc filter

Synopsis

struct              GstAudioWSincBand;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioFXBaseFIRFilter
                                 +----GstAudioWSincBand

Properties

  "lower-frequency"          gfloat                : Read / Write
  "upper-frequency"          gfloat                : Read / Write
  "mode"                     GstAudioWSincBandMode  : Read / Write
  "window"                   GstAudioWSincBandWindow  : Read / Write
  "length"                   gint                  : Read / Write

Description

Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency band. The length parameter controls the rolloff, the window parameter controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit worse stopband attenuation, the other way around for the Blackman window.

This element has the advantage over the Chebyshev bandpass and bandreject filter that it has a much better rolloff when using a larger kernel size and almost linear phase. The only disadvantage is the much slower execution time with larger kernels.

Example launch line

1
2
3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiosincband mode=band-pass lower-frequency=3000 upper-frequency=10000 length=501 window=blackman ! audioconvert ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsincband mode=band-reject lower-frequency=59 upper-frequency=61 length=10001 window=hamming ! audioconvert ! alsasink
gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsincband mode=band-pass lower-frequency=1000 upper-frequency=2000 length=31 ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioWSincBand

struct GstAudioWSincBand;

Opaque data structure.

Property Details

The "lower-frequency" property

  "lower-frequency"          gfloat                : Read / Write

Cut-off lower frequency (Hz).

Allowed values: [0,100000]

Default value: 0


The "upper-frequency" property

  "upper-frequency"          gfloat                : Read / Write

Cut-off upper frequency (Hz).

Allowed values: [0,100000]

Default value: 0


The "mode" property

  "mode"                     GstAudioWSincBandMode  : Read / Write

Band pass or band reject mode.

Default value: Band pass (default)


The "window" property

  "window"                   GstAudioWSincBandWindow  : Read / Write

Window function to use.

Default value: Hamming window (default)


The "length" property

  "length"                   gint                  : Read / Write

Filter kernel length, will be rounded to the next odd number.

Allowed values: [3,256000]

Default value: 101

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html0000644000175000017500000000560711720565335025702 00000000000000 aasink

aasink

aasink — ASCII Art video sink

Plugin Information

filename

libgstaasink.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

aasink

An ASCII art videosink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-spectrum.html0000644000175000017500000011441011720565335024773 00000000000000 spectrum

spectrum

spectrum — Run an FFT on the audio signal, output spectrum data

Synopsis

struct              GstSpectrum;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstSpectrum

Properties

  "bands"                    guint                 : Read / Write
  "interval"                 guint64               : Read / Write
  "message"                  gboolean              : Read / Write
  "threshold"                gint                  : Read / Write
  "message-magnitude"        gboolean              : Read / Write
  "message-phase"            gboolean              : Read / Write
  "post-messages"            gboolean              : Read / Write
  "multi-channel"            gboolean              : Read / Write

Description

The Spectrum element analyzes the frequency spectrum of an audio signal. If the "post-messages" property is TRUE, it sends analysis results as application messages named "spectrum" after each interval of time given by the "interval" property.

The message's structure contains some combination of these fields:

  • GstClockTime "timestamp": the timestamp of the buffer that triggered the message.

  • GstClockTime "stream-time": the stream time of the buffer.

  • GstClockTime "running-time": the running_time of the buffer.

  • GstClockTime "duration": the duration of the buffer.

  • GstClockTime "endtime": the end time of the buffer that triggered the message as stream time (this is deprecated, as it can be calculated from stream-time + duration)

  • GstValueList of gfloat "magnitude": the level for each frequency band in dB. All values below the value of the "threshold" property will be set to the threshold. Only present if the "message-magnitude" property is TRUE.

  • GstValueList of gfloat "phase": The phase for each frequency band. The value is between -pi and pi. Only present if the "message-phase" property is TRUE.

If "multi-channel" property is set to true. magnitude and phase fields will be each a nested GstValueArray. The first dimension are the channels and the second dimension are the values.

Example application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* GStreamer
 * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
 * Copyright (C) 2008 Jan Schmidt <jan.schmidt@sun.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.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <gst/gst.h>

static guint spect_bands = 20;

#define AUDIOFREQ 32000

/* receive spectral data from element message */
static gboolean
message_handler (GstBus * bus, GstMessage * message, gpointer data)
{
  if (message->type == GST_MESSAGE_ELEMENT) {
    const GstStructure *s = gst_message_get_structure (message);
    const gchar *name = gst_structure_get_name (s);
    GstClockTime endtime;

    if (strcmp (name, "spectrum") == 0) {
      const GValue *magnitudes;
      const GValue *phases;
      const GValue *mag, *phase;
      gdouble freq;
      guint i;

      if (!gst_structure_get_clock_time (s, "endtime", &endtime))
        endtime = GST_CLOCK_TIME_NONE;

      g_print ("New spectrum message, endtime %" GST_TIME_FORMAT "\n",
          GST_TIME_ARGS (endtime));

      magnitudes = gst_structure_get_value (s, "magnitude");
      phases = gst_structure_get_value (s, "phase");

      for (i = 0; i < spect_bands; ++i) {
        freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) / spect_bands;
        mag = gst_value_list_get_value (magnitudes, i);
        phase = gst_value_list_get_value (phases, i);

        if (mag != NULL && phase != NULL) {
          g_print ("band %d (freq %g): magnitude %f dB phase %f\n", i, freq,
              g_value_get_float (mag), g_value_get_float (phase));
        }
      }
      g_print ("\n");
    }
  }
  return TRUE;
}

int
main (int argc, char *argv[])
{
  GstElement *bin;
  GstElement *src, *audioconvert, *spectrum, *sink;
  GstBus *bus;
  GstCaps *caps;
  GMainLoop *loop;

  gst_init (&argc, &argv);

  bin = gst_pipeline_new ("bin");

  src = gst_element_factory_make ("audiotestsrc", "src");
  g_object_set (G_OBJECT (src), "wave", 0, "freq", 6000.0, NULL);
  audioconvert = gst_element_factory_make ("audioconvert", NULL);
  g_assert (audioconvert);

  spectrum = gst_element_factory_make ("spectrum", "spectrum");
  g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,
      "message", TRUE, "message-phase", TRUE, NULL);

  sink = gst_element_factory_make ("fakesink", "sink");
  g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);

  gst_bin_add_many (GST_BIN (bin), src, audioconvert, spectrum, sink, NULL);

  caps = gst_caps_new_simple ("audio/x-raw-int",
      "rate", G_TYPE_INT, AUDIOFREQ, NULL);

  if (!gst_element_link (src, audioconvert) ||
      !gst_element_link_filtered (audioconvert, spectrum, caps) ||
      !gst_element_link (spectrum, sink)) {
    fprintf (stderr, "can't link elements\n");
    exit (1);
  }
  gst_caps_unref (caps);

  bus = gst_element_get_bus (bin);
  gst_bus_add_watch (bus, message_handler, NULL);
  gst_object_unref (bus);

  gst_element_set_state (bin, GST_STATE_PLAYING);

  /* we need to run a GLib main loop to get the messages */
  loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (loop);

  gst_element_set_state (bin, GST_STATE_NULL);

  gst_object_unref (bin);

  return 0;
}

Last reviewed on 2011-03-10 (0.10.29)

Synopsis

Element Information

plugin

spectrum

author

Erik Walthinsen <omega@cse.ogi.edu>, Stefan Kost <ensonic@users.sf.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Analyzer/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)24, depth=(int)[ 1, 24 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstSpectrum

struct GstSpectrum;

Property Details

The "bands" property

  "bands"                    guint                 : Read / Write

Number of frequency bands.

Default value: 128


The "interval" property

  "interval"                 guint64               : Read / Write

Interval of time between message posts (in nanoseconds).

Allowed values: >= 1

Default value: 100000000


The "message" property

  "message"                  gboolean              : Read / Write

Whether to post a 'spectrum' element message on the bus for each passed interval (deprecated, use post-messages).

Default value: TRUE


The "threshold" property

  "threshold"                gint                  : Read / Write

dB threshold for result. All lower values will be set to this.

Allowed values: <= 0

Default value: -60


The "message-magnitude" property

  "message-magnitude"        gboolean              : Read / Write

Whether to add a 'magnitude' field to the structure of any 'spectrum' element messages posted on the bus.

Default value: TRUE


The "message-phase" property

  "message-phase"            gboolean              : Read / Write

Whether to add a 'phase' field to the structure of any 'spectrum' element messages posted on the bus.

Default value: FALSE


The "post-messages" property

  "post-messages"            gboolean              : Read / Write

Post messages on the bus with spectrum information.

Default value: TRUE

Since 0.10.17


The "multi-channel" property

  "multi-channel"            gboolean              : Read / Write

Send separate results for each channel

Default value: FALSE

Since 0.10.29

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html0000644000175000017500000000556711720565335026537 00000000000000 shout2send

shout2send

shout2send — Sends data to an icecast server using libshout2

Plugin Information

filename

libgstshout2.so

version

0.10.31

run-time license

LGPL

package

libshout2

origin

http://www.icecast.org/download.html

Elements

shout2send

Sends data to an icecast server
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-osxaudiosink.html0000644000175000017500000001151211720565335025650 00000000000000 osxaudiosink

osxaudiosink

osxaudiosink — Output to a sound card in OS X

Synopsis

struct              GstOsxAudioSink;

Properties

  "device"                   gint                  : Read / Write

Description

Synopsis

Element Information

plugin

osxaudio

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Sink/Audio

Element Pads

Details

struct GstOsxAudioSink

struct GstOsxAudioSink {
  GstBaseAudioSink sink;

  AudioDeviceID device_id;
  AudioUnit audiounit;
  double volume;
};

Property Details

The "device" property

  "device"                   gint                  : Read / Write

Device ID of output device.

Allowed values: >= 0

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html0000644000175000017500000000566711720565335025641 00000000000000 y4menc

y4menc

y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools)

Plugin Information

filename

libgsty4menc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

y4menc

Encodes a YUV frame into the yuv4mpeg format (mjpegtools)
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cacasink.html0000644000175000017500000002171211720565335024707 00000000000000 cacasink

cacasink

cacasink — A colored ASCII art videosink

Synopsis

struct              GstCACASink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstCACASink

Properties

  "anti-aliasing"            gboolean              : Read / Write
  "dither"                   GstCACASinkDithering  : Read / Write
  "screen-height"            gint                  : Read
  "screen-width"             gint                  : Read

Description

Synopsis

Element Information

plugin

cacasink

author

Zeeshan Ali <zak147@yahoo.com>

class

Sink/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstCACASink

struct GstCACASink;

Property Details

The "anti-aliasing" property

  "anti-aliasing"            gboolean              : Read / Write

Enables Anti-Aliasing.

Default value: TRUE


The "dither" property

  "dither"                   GstCACASinkDithering  : Read / Write

Set type of Dither.

Default value: No dithering


The "screen-height" property

  "screen-height"            gint                  : Read

The height of the screen.

Allowed values: >= 0

Default value: 25


The "screen-width" property

  "screen-width"             gint                  : Read

The width of the screen.

Allowed values: >= 0

Default value: 80

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-osxvideo.html0000644000175000017500000000564211720565335026273 00000000000000 osxvideo

osxvideo

osxvideo — OSX native video output plugin

Plugin Information

filename

libgstosxvideo.so

version

0.10.4

run-time license

LGPL

package

Gstreamer

origin

http://gstreamer.freedesktop.org

Elements

osxvideosink

OSX native videosink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html0000644000175000017500000000612311720565335025352 00000000000000 alaw

alaw

alaw — ALaw audio conversion routines

Plugin Information

filename

libgstalaw.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

alawdec

Convert 8bit A law to 16bit PCM

alawenc

Convert 16bit PCM to 8bit A law
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html0000644000175000017500000000574011720565335025517 00000000000000 alpha

alpha

alpha — adds an alpha channel to video - constant or via chroma-keying

Plugin Information

filename

libgstalpha.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

alpha

Adds an alpha channel to video - uniform or via chroma-keying
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html0000644000175000017500000000576011720565335026717 00000000000000 imagefreeze

imagefreeze

imagefreeze — Still frame stream generator

Plugin Information

filename

libgstimagefreeze.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

imagefreeze

Generates a still frame stream from an image
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-goom.html0000644000175000017500000001432611720565335024077 00000000000000 goom

goom

goom — Takes frames of data and outputs video frames using the GOOM filter

Synopsis

struct              GstGoom;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstGoom

Description

Goom is an audio visualisation element. It creates warping structures based on the incoming audio signal.

Example launch line

1
gst-launch -v audiotestsrc ! goom ! ffmpegcolorspace ! xvimagesink

Synopsis

Element Information

plugin

goom

author

Wim Taymans <wim@fluendo.com>

class

Visualization

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int){ 1, 2 }

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstGoom

struct GstGoom;

See Also

synaesthesia
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-avisubtitle.html0000644000175000017500000001317411720565335025471 00000000000000 avisubtitle

avisubtitle

avisubtitle — Parse avi subtitle stream

Synopsis

struct              GstAviSubtitle;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAviSubtitle

Description

Example launch line

Parses the subtitle stream from an avi file.

gst-launch filesrc location=subtitle.avi ! avidemux name=demux ! queue ! avisubtitle ! subparse ! textoverlay name=overlay ! ffmpegcolorspace ! autovideosink demux. ! queue ! decodebin ! overlay.

This plays an avi file with a video and subtitle stream.

Last reviewed on 2008-02-01

Synopsis

Element Information

plugin

avi

author

Thijs Vermeir <thijsvermeir@gmail.com>

class

Codec/Parser/Subtitle

Element Pads

name

sink

direction

sink

presence

always

details

application/x-subtitle-avi

name

src

direction

source

presence

always

details

application/x-subtitle

Details

struct GstAviSubtitle

struct GstAviSubtitle;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-autovideosink.html0000644000175000017500000001760311720565335026023 00000000000000 autovideosink

autovideosink

autovideosink — Wrapper video sink for automatically detected video sink

Synopsis

                    GstAutoVideoSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstAutoVideoSink

Implemented Interfaces

GstAutoVideoSink implements GstChildProxy.

Properties

  "filter-caps"              GstCaps*              : Read / Write

Description

autovideosink is a video sink that automatically detects an appropriate video sink to use. It does so by scanning the registry for all elements that have Sink and Video in the class field of their element information, and also have a non-zero autoplugging rank.

Example launch line

1
gst-launch -v -m videotestsrc ! autovideosink

Synopsis

Element Information

plugin

autodetect

author

Jan Schmidt <thaytan@noraisin.net>

class

Sink/Video

Element Pads

name

sink

direction

sink

presence

always

details

ANY

Details

GstAutoVideoSink

typedef struct _GstAutoVideoSink GstAutoVideoSink;

Property Details

The "filter-caps" property

  "filter-caps"              GstCaps*              : Read / Write

This property will filter out candidate sinks that can handle the specified caps. By default only video sinks that support raw rgb and yuv video are selected.

This property can only be set before the element goes to the READY state.

Since 0.10.7

See Also

autoaudiosink, ximagesink, xvimagesink, sdlvideosink
gst-plugins-good-0.10.31/docs/plugins/html/ch01.html0000644000175000017500000010077711720565335017020 00000000000000 gst-plugins-good Elements

gst-plugins-good Elements

3gppmux — Muxer for 3GPP (.3gp) files
aacparse — AAC parser
aasink — An ASCII art videosink
ac3parse — AC3 parser
agingtv — AgingTV adds age to video input using scratches and dust
alpha — Adds an alpha channel to video - uniform or via chroma-keying
alphacolor — ARGB from/to AYUV colorspace conversion preserving the alpha channel
alawdec — Convert 8bit A law to 16bit PCM
alawenc — Convert 16bit PCM to 8bit A law
amrparse — AMR parser
apedemux — Read and output APE tags while demuxing the contents
apev2mux — Adds an APEv2 header to the beginning of files using taglib
aspectratiocrop — Crops video into a user-defined aspect-ratio
audioamplify — Amplifies an audio stream by a given factor
audiochebband — Chebyshev band pass and band reject filter
audiocheblimit — Chebyshev low pass and high pass filter
audiofirfilter — Generic audio FIR filter with custom filter kernel
audioiirfilter — Generic audio IIR filter with custom filter kernel
audiowsincband — Band pass and band reject windowed sinc filter
audiowsinclimit — Low pass and high pass windowed sinc filter
audioecho — Adds an echo or reverb effect to an audio stream
audiodynamic — Compressor and Expander
audioinvert — Swaps upper and lower half of audio samples
audiopanorama — Positions audio streams in the stereo panorama
audiokaraoke — Removes voice from sound
auparse — Parse an .au file into raw audio
autoaudiosink — Wrapper audio sink for automatically detected audio sink
autoaudiosrc — Wrapper audio source for automatically detected audio source
autovideosink — Wrapper video sink for automatically detected video sink
autovideosrc — Wrapper video source for automatically detected video source
avidemux — Demultiplex an avi file into audio and video
avimux — Muxes audio and video into an avi stream
avisubtitle — Parse avi subtitle stream
cacasink — A colored ASCII art videosink
cairotextoverlay — Adds text strings on top of a video buffer
cairotimeoverlay — Overlays the time on a video stream
cairorender — Encodes streams using Cairo
cairooverlay — Render overlay on a video stream using Cairo
capssetter — Set/merge caps on stream
cmmldec — Decodes CMML streams
cmmlenc — Encodes CMML streams
cutter — Audio Cutter to split audio into non-silent bits
dcaparse — DCA (DTS Coherent Acoustics) parser
deinterlace — Deinterlace Methods ported from DScaler/TvTime
deinterleave — Splits one interleaved multichannel audio stream into many mono audio streams
dicetv — 'Dices' the screen up into many small squares
directsoundsink — DirectSound audio sink
dv1394src — Source for DV video data from firewire port
dvdec — Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)
dvdemux — Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)
edgetv — Apply edge detect on video
equalizer-10bands — Direct Form 10 band IIR equalizer
equalizer-3bands — Direct Form 3 band IIR equalizer
equalizer-nbands — Direct Form IIR equalizer
esdsink — Plays audio to an esound server
flacdec — Decodes FLAC lossless audio streams
flacenc — Encodes audio with the FLAC lossless audio encoder
flacparse — Parses audio with the FLAC lossless audio codec
flactag — Rewrite tags in a FLAC file
flvdemux — Demux FLV feeds into digital streams
flvmux — Muxes video/audio streams into a FLV stream
flxdec — FLC/FLI/FLX video decoder
gamma — Adjusts gamma on a video stream
gconfaudiosrc — Audio source embedding the GConf-settings for audio input
gconfaudiosink — Audio sink embedding the GConf-settings for audio output
gconfvideosrc — Video source embedding the GConf-settings for video input
gconfvideosink — Video sink embedding the GConf-settings for video output
gdkpixbufsink — Output images as GdkPixbuf objects in bus messages
goom — Takes frames of data and outputs video frames using the GOOM filter
goom2k1 — Takes frames of data and outputs video frames using the GOOM 2k1 filter
gstrtpbin — Real-Time Transport Protocol bin
gstrtpjitterbuffer — A buffer that deals with network jitter and other transmission faults
gstrtpptdemux — Parses codec streams transmitted in the same RTP session
gstrtpsession — Implement an RTP session
gstrtpssrcdemux — Splits RTP streams based on the SSRC
halaudiosink — Audio sink for sound device access via HAL
halaudiosrc — Audio source for sound device access via HAL
hdv1394src — Source for MPEG-TS video data from firewire port
icydemux — Read and output ICY tags while demuxing the contents
id3demux — Read and output ID3v1 and ID3v2 tags while demuxing the contents
id3v2mux — Adds an ID3v2 header to the beginning of MP3 files using taglib
imagefreeze — Generates a still frame stream from an image
interleave — Folds many mono channels into one interleaved audio stream
ismlmux — Muxer for ISML smooth streaming (.isml) files
jackaudiosrc — Captures audio from a JACK server
jackaudiosink — Output audio to a JACK server
jpegdec — Decode images from JPEG format
jpegenc — Encode images in JPEG format
level — RMS/Peak/Decaying Peak Level messager for audio/raw
matroskamux — Muxes video/audio/subtitle streams into a matroska stream
matroskademux — Demuxes Matroska/WebM streams into video/audio/subtitles
mj2mux — Muxer for Motion JPEG-2000 (.mj2) files
monoscope — Displays a highly stabilised waveform of audio input
mpegaudioparse — MPEG audio parser
mp4mux — Muxer for ISO MPEG-4 (.mp4) files
mulawdec — Convert 8bit mu law to 16bit PCM
mulawenc — Convert 16bit PCM to 8bit mu law
multifilesink — Write buffers to a sequentially named set of files
multifilesrc — Read a sequentially named set of files into buffers
multipartdemux — demux multipart streams
multipartmux — mux multipart streams
multiudpsink — Send data over the network via UDP
optv — Optical art meets real-time video effect
oss4mixer — Control sound input and output levels with OSS4
oss4sink — Output to a sound card via OSS version 4
oss4src — Capture from a sound card via OSS version 4
ossmixer — Control sound input and output levels with OSS
osssink — Output to a sound card via OSS
osssrc — Capture from a sound card via OSS
osxaudiosink — Output to a sound card in OS X
osxaudiosrc — Input from a sound card in OS X
osxvideosink — OSX native videosink
pngdec — Decode a png video frame to a raw image
pngenc — Encode a video frame to a .png image
progressreport — Periodically query and report on processing progress
pulsesink — Plays audio to a PulseAudio server
pulsesrc — Captures audio from a PulseAudio server
pulsemixer — Control sound input and output levels for PulseAudio
quarktv — Motion dissolver
qtdemux — Demultiplex a QuickTime file into audio and video streams
qtmux — Muxer for quicktime(.mov) files
qtmoovrecover — Utility element for recovering unfinished quicktime files
radioactv — motion-enlightment effect
revtv — A video waveform monitor for each line of video processed
rganalysis — Perform the ReplayGain analysis
rglimiter — Apply signal compression to raw audio data
rgvolume — Apply ReplayGain volume adjustment
rippletv — RippleTV does ripple mark effect on the video input
rtpdec — Accepts raw RTP and RTCP packets and sends them forward
rtpj2kpay — Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)
rtpjpegpay — Payload-encodes JPEG pictures into RTP packets (RFC 2435)
rtspsrc — Receive data over the network via RTSP (RFC 2326)
shagadelictv — Oh behave, ShagedelicTV makes images shagadelic!
shapewipe — Adds a shape wipe transition to a video stream
smokedec — Decode video from Smoke format
smokeenc — Encode images into the Smoke format
smpte — Apply the standard SMPTE transitions on video images
smptealpha — Apply the standard SMPTE transitions as alpha on video images
souphttpsrc — Receive data as a client over the network via HTTP using SOUP
spectrum — Run an FFT on the audio signal, output spectrum data
speexenc — Encodes audio in Speex format
speexdec — decode speex streams to audio
splitfilesrc — Read a sequentially named set of files as if it was one large file
streaktv — StreakTV makes after images of moving objects
taginject — inject metadata tags
udpsrc — Receive data over the network via UDP
udpsink — Send data over the network via UDP
v4l2src — Reads frames from a Video4Linux2 device
v4l2sink
v4l2radio — Controls a Video4Linux2 radio device
vertigotv — A loopback alpha blending effector with rotating and scaling
videobalance — Adjusts brightness, contrast, hue, saturation on a video stream
videobox — Resizes a video by adding borders or cropping
videocrop — Crops video into a user-defined region
videoflip — Flips and rotates video
videomixer — Mix multiple video streams
videomixer2 — Mix multiple video streams
warptv — WarpTV does realtime goo'ing of the video input
wavenc — Encode raw audio into WAV
waveformsink — WaveForm audio sink
wavpackdec — Decodes Wavpack audio data
wavpackenc — Encodes audio with the Wavpack lossless/lossy audio codec
wavpackparse — Parses Wavpack files
wavparse — Parse a .wav file into raw audio
webmmux — Muxes video and audio streams into a WebM stream
ximagesrc — Creates a screenshot video stream
y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools)
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-shagadelictv.html0000644000175000017500000001534211720565335025573 00000000000000 shagadelictv

shagadelictv

shagadelictv — Oh behave, ShagedelicTV makes images shagadelic!

Synopsis

struct              GstShagadelicTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstShagadelicTV

Description

Oh behave, ShagedelicTV makes images shagadelic!

Example launch line

1
gst-launch -v videotestsrc ! shagadelictv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of shagadelictv on a test stream.

Synopsis

Element Information

plugin

effectv

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstShagadelicTV

struct GstShagadelicTV;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html0000644000175000017500000000564711720565335025705 00000000000000 flxdec

flxdec

flxdec — FLC/FLI/FLX video decoder

Plugin Information

filename

libgstflxdec.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

flxdec

FLC/FLI/FLX video decoder
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html0000644000175000017500000000573711720565335025717 00000000000000 goom2k1

goom2k1

goom2k1 — GOOM 2k1 visualization filter

Plugin Information

filename

libgstgoom2k1.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

goom2k1

Takes frames of data and outputs video frames using the GOOM 2k1 filter
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rtspsrc.html0000644000175000017500000005107411720565335024637 00000000000000 rtspsrc

rtspsrc

rtspsrc — Receive data over the network via RTSP (RFC 2326)

Synopsis

struct              GstRTSPSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstRTSPSrc

Implemented Interfaces

GstRTSPSrc implements GstChildProxy and GstURIHandler.

Properties

  "debug"                    gboolean              : Read / Write
  "location"                 gchar*                : Read / Write
  "protocols"                GstRTSPLowerTrans     : Read / Write
  "retry"                    guint                 : Read / Write
  "timeout"                  guint64               : Read / Write
  "latency"                  guint                 : Read / Write
  "tcp-timeout"              guint64               : Read / Write
  "connection-speed"         guint                 : Read / Write
  "nat-method"               GstRTSPNatMethod      : Read / Write
  "do-rtcp"                  gboolean              : Read / Write
  "proxy"                    gchar*                : Read / Write
  "rtp-blocksize"            guint                 : Read / Write
  "user-id"                  gchar*                : Read / Write
  "user-pw"                  gchar*                : Read / Write
  "buffer-mode"              GstRTSPSrcBufferMode  : Read / Write
  "port-range"               gchar*                : Read / Write
  "udp-buffer-size"          gint                  : Read / Write
  "short-header"             gboolean              : Read / Write

Description

Makes a connection to an RTSP server and read the data. rtspsrc strictly follows RFC 2326 and therefore does not (yet) support RealMedia/Quicktime/Microsoft extensions.

RTSP supports transport over TCP or UDP in unicast or multicast mode. By default rtspsrc will negotiate a connection in the following order: UDP unicast/UDP multicast/TCP. The order cannot be changed but the allowed protocols can be controlled with the "protocols" property.

rtspsrc currently understands SDP as the format of the session description. For each stream listed in the SDP a new rtp_streamd pad will be created with caps derived from the SDP media description. This is a caps of mime type "application/x-rtp" that can be connected to any available RTP depayloader element.

rtspsrc will internally instantiate an RTP session manager element that will handle the RTCP messages to and from the server, jitter removal, packet reordering along with providing a clock for the pipeline. This feature is implemented using the gstrtpbin element.

rtspsrc acts like a live source and will therefore only generate data in the PLAYING state.

Example launch line

1
gst-launch rtspsrc location=rtsp://some.server/url ! fakesink
Establish a connection to an RTSP server and send the raw RTP packets to a fakesink.

Last reviewed on 2006-08-18 (0.10.5)

Synopsis

Element Information

plugin

rtsp

author

Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com>, Lutz Mueller <lutz@topfrose.de>

class

Source/Network

Element Pads

name

stream%d

direction

source

presence

sometimes

details

application/x-rtp

application/x-rdt

Details

struct GstRTSPSrc

struct GstRTSPSrc;

Property Details

The "debug" property

  "debug"                    gboolean              : Read / Write

Dump request and response messages to stdout.

Default value: FALSE


The "location" property

  "location"                 gchar*                : Read / Write

Location of the RTSP url to read.

Default value: NULL


The "protocols" property

  "protocols"                GstRTSPLowerTrans     : Read / Write

Allowed lower transport protocols.

Default value: GST_RTSP_LOWER_TRANS_UDP|GST_RTSP_LOWER_TRANS_UDP_MCAST|GST_RTSP_LOWER_TRANS_TCP


The "retry" property

  "retry"                    guint                 : Read / Write

Max number of retries when allocating RTP ports.

Allowed values: <= 65535

Default value: 20


The "timeout" property

  "timeout"                  guint64               : Read / Write

Retry TCP transport after UDP timeout microseconds (0 = disabled).

Default value: 5000000


The "latency" property

  "latency"                  guint                 : Read / Write

Amount of ms to buffer.

Default value: 2000


The "tcp-timeout" property

  "tcp-timeout"              guint64               : Read / Write

Fail after timeout microseconds on TCP connections (0 = disabled).

Default value: 20000000


The "connection-speed" property

  "connection-speed"         guint                 : Read / Write

Network connection speed in kbps (0 = unknown).

Allowed values: <= 2147483

Default value: 0


The "nat-method" property

  "nat-method"               GstRTSPNatMethod      : Read / Write

Method to use for traversing firewalls and NAT.

Default value: Send Dummy packets


The "do-rtcp" property

  "do-rtcp"                  gboolean              : Read / Write

Send RTCP packets, disable for old incompatible server.

Default value: TRUE


The "proxy" property

  "proxy"                    gchar*                : Read / Write

Proxy settings for HTTP tunneling. Format: [http://][user:passwd@]host[:port].

Default value: NULL


The "rtp-blocksize" property

  "rtp-blocksize"            guint                 : Read / Write

RTP package size to suggest to server (0 = disabled).

Allowed values: <= 65536

Default value: 0


The "user-id" property

  "user-id"                  gchar*                : Read / Write

RTSP location URI user id for authentication.

Default value: NULL


The "user-pw" property

  "user-pw"                  gchar*                : Read / Write

RTSP location URI user password for authentication.

Default value: NULL


The "buffer-mode" property

  "buffer-mode"              GstRTSPSrcBufferMode  : Read / Write

Control the buffering algorithm in use.

Default value: Choose mode depending on stream live


The "port-range" property

  "port-range"               gchar*                : Read / Write

Client port range that can be used to receive RTP and RTCP data, eg. 3000-3005 (NULL = no restrictions).

Default value: NULL


The "udp-buffer-size" property

  "udp-buffer-size"          gint                  : Read / Write

Size of the kernel UDP receive buffer in bytes, 0=default.

Allowed values: >= 0

Default value: 524288


The "short-header" property

  "short-header"             gboolean              : Read / Write

Only send the basic RTSP headers for broken encoders.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flacparse.html0000644000175000017500000002043211720565335025071 00000000000000 flacparse

flacparse

flacparse — Parses audio with the FLAC lossless audio codec

Synopsis

struct              GstFlacParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseParse
                     +----GstFlacParse

Properties

  "check-frame-checksums"    gboolean              : Read / Write

Description

The flacparse element will parse the header packets of the FLAC stream and put them as the streamheader in the caps. This is used in the multifdsink case where you want to stream live FLAC streams to multiple clients, each client has to receive the streamheaders first before they can consume the FLAC packets.

This element also makes sure that the buffers that it pushes out are properly timestamped and that their offset and offset_end are set. The buffers that flacparse outputs have all of the metadata that oggmux expects to receive, which allows you to (for example) remux an ogg/flac or convert a native FLAC format file to an ogg bitstream.

Example pipelines

1
2
gst-launch -v filesrc location=sine.flac ! flacparse ! identity \
           ! oggmux ! filesink location=sine-remuxed.ogg
This pipeline converts a native FLAC format file to an ogg bitstream. It also illustrates that the streamheader is set in the caps, and that each buffer has the timestamp, duration, offset, and offset_end set.

Synopsis

Element Information

plugin

audioparsers

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Codec/Parser/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-flac

name

src

direction

source

presence

always

details

audio/x-flac, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 1, 655350 ]

Details

struct GstFlacParse

struct GstFlacParse;

Property Details

The "check-frame-checksums" property

  "check-frame-checksums"    gboolean              : Read / Write

Check the overall checksums of every frame.

Default value: FALSE

See Also

flacdec, oggdemux, vorbisparse
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html0000644000175000017500000000620711720565335026604 00000000000000 videomixer

videomixer

videomixer — Video mixer

Plugin Information

filename

libgstvideomixer.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

videomixer

Mix multiple video streams

videomixer2

Mix multiple video streams
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html0000644000175000017500000000616711720565335025563 00000000000000 mulaw

mulaw

mulaw — MuLaw audio conversion routines

Plugin Information

filename

libgstmulaw.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

mulawdec

Convert 8bit mu law to 16bit PCM

mulawenc

Convert 16bit PCM to 8bit mu law
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-aacparse.html0000644000175000017500000001504111720565335024710 00000000000000 aacparse

aacparse

aacparse — AAC parser

Synopsis

struct              GstAacParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseParse
                     +----GstAacParse

Description

This is an AAC parser which handles both ADIF and ADTS stream formats.

As ADIF format is not framed, it is not seekable and stream duration cannot be determined either. However, ADTS format AAC clips can be seeked, and parser can also estimate playback position and clip duration.

Example launch line

1
gst-launch filesrc location=abc.aac ! aacparse ! faad ! audioresample ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audioparsers

author

Stefan Kost <stefan.kost@nokia.com>

class

Codec/Parser/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/mpeg, mpegversion=(int){ 2, 4 }

name

src

direction

source

presence

always

details

audio/mpeg, framed=(boolean)true, mpegversion=(int){ 2, 4 }, stream-format=(string){ raw, adts, adif }

Details

struct GstAacParse

struct GstAacParse;

The opaque GstAacParse data structure.

See Also

GstAmrParse
gst-plugins-good-0.10.31/docs/plugins/html/left.png0000644000175000017500000000071311720565335017024 00000000000000PNG  IHDRw=bKGD pHYs  ~tIME1&[(XIDATx!OPE*ID%~ꊯ"p'ŏ`sܖrKf hmiIz}ܯI.p\`x l?l[,Hk<#c%\AUx[S7n6rzEs1j@NL$ݤi0 5/}\EKIo͓$a0jdFbkIAh>WlC'?tk;|/t*INZ^`y4Nr]׮ J<ڐt`X1@p䀸dZ')hK $V?%]+LsgUK"w53OIENDB`gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-ximagesrc.html0000644000175000017500000003271511720565335025122 00000000000000 ximagesrc

ximagesrc

ximagesrc — Creates a screenshot video stream

Synopsis

struct              GstXImageSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstXImageSrc

Properties

  "display-name"             gchar*                : Read / Write
  "screen-num"               guint                 : Read / Write
  "show-pointer"             gboolean              : Read / Write
  "endx"                     guint                 : Read / Write
  "endy"                     guint                 : Read / Write
  "startx"                   guint                 : Read / Write
  "starty"                   guint                 : Read / Write
  "use-damage"               gboolean              : Read / Write
  "remote"                   gboolean              : Read / Write
  "xid"                      guint64               : Read / Write
  "xname"                    gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

ximagesrc

author

Lutz Mueller <lutz@users.sourceforge.net>, Jan Schmidt <thaytan@mad.scientist.com>, Zaheer Merali <zaheerabbas at merali dot org>

class

Source/Video

Element Pads

name

src

direction

source

presence

always

details

video/x-raw-rgb, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], pixel-aspect-ratio=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstXImageSrc

struct GstXImageSrc;

Property Details

The "display-name" property

  "display-name"             gchar*                : Read / Write

X Display Name.

Default value: NULL


The "screen-num" property

  "screen-num"               guint                 : Read / Write

X Screen Number.

Allowed values: <= G_MAXINT

Default value: 0


The "show-pointer" property

  "show-pointer"             gboolean              : Read / Write

Show mouse pointer (if XFixes extension enabled).

Default value: TRUE


The "endx" property

  "endx"                     guint                 : Read / Write

X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen).

Allowed values: <= G_MAXINT

Default value: 0


The "endy" property

  "endy"                     guint                 : Read / Write

Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen).

Allowed values: <= G_MAXINT

Default value: 0


The "startx" property

  "startx"                   guint                 : Read / Write

X coordinate of top left corner of area to be recorded (0 for top left of screen).

Allowed values: <= G_MAXINT

Default value: 0


The "starty" property

  "starty"                   guint                 : Read / Write

Y coordinate of top left corner of area to be recorded (0 for top left of screen).

Allowed values: <= G_MAXINT

Default value: 0


The "use-damage" property

  "use-damage"               gboolean              : Read / Write

Use XDamage (if XDamage extension enabled).

Default value: TRUE


The "remote" property

  "remote"                   gboolean              : Read / Write

Whether the display is remote.

Default value: FALSE


The "xid" property

  "xid"                      guint64               : Read / Write

Window XID to capture from.

Default value: 0


The "xname" property

  "xname"                    gchar*                : Read / Write

Window name to capture from.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-warptv.html0000644000175000017500000002056611720565335024464 00000000000000 warptv

warptv

warptv — WarpTV does realtime goo'ing of the video input

Synopsis

struct              GstWarpTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstWarpTV

Description

WarpTV does realtime goo'ing of the video input.

Example launch line

1
gst-launch -v videotestsrc ! warptv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of warptv on a test stream.

Synopsis

Element Information

plugin

effectv

author

Sam Lantinga <slouken@devolution.com>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstWarpTV

struct GstWarpTV;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-taginject.html0000644000175000017500000002134311720565335025103 00000000000000 taginject

taginject

taginject — inject metadata tags

Synopsis

struct              GstTagInject;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstTagInject

Properties

  "tags"                     gchar*                : Write

Description

Element that injects new metadata tags, but passes incomming data through unmodified.

Example launch lines

1
gst-launch audiotestsrc num-buffers=100 ! taginject tags="title=testsrc,artist=gstreamer" ! vorbisenc ! oggmux ! filesink location=test.ogg
set title and artist
1
gst-launch audiotestsrc num-buffers=100 ! taginject tags="keywords=\{\"testone\",\"audio\"\},title=\"audio testtone\"" ! vorbisenc ! oggmux ! filesink location=test.ogg
set keywords and title demonstrating quoting of special chars and handling lists

Synopsis

Element Information

plugin

debug

author

Stefan Kost <ensonic@users.sf.net>

class

Generic

Element Pads

name

sink

direction

sink

presence

always

details

ANY

name

src

direction

source

presence

always

details

ANY

Details

struct GstTagInject

struct GstTagInject;

Opaque GstTagInject data structure

Property Details

The "tags" property

  "tags"                     gchar*                : Write

List of tags to inject into the target file.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-y4menc.html0000644000175000017500000001327311720565335024335 00000000000000 y4menc

y4menc

y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools)

Synopsis

struct              GstY4mEncode;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstY4mEncode

Description

Example launch line

Creates a YU4MPEG2 raw video stream as defined by the mjpegtools project.

(write everything in one line, without the backslash characters)

gst-launch-0.10 videotestsrc num-buffers=250 \
! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \
! y4menc ! filesink location=test.yuv

Synopsis

Element Information

plugin

y4menc

author

Wim Taymans <wim.taymans@gmail.com>

class

Codec/Encoder/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc){ IYUV, I420, Y42B, Y41B, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

application/x-yuv4mpeg, y4mversion=(int)2

Details

struct GstY4mEncode

struct GstY4mEncode;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-qtmux.html0000644000175000017500000005267711720565335024327 00000000000000 qtmux

qtmux

qtmux — Muxer for quicktime(.mov) files

Synopsis

struct              GstQTMux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstQTMux

Implemented Interfaces

GstQTMux implements GstTagSetter and GstTagXmpWriter.

Properties

  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct
  "faststart"                gboolean              : Read / Write
  "faststart-file"           gchar*                : Read / Write / Construct
  "fragment-duration"        guint                 : Read / Write / Construct
  "moov-recovery-file"       gchar*                : Read / Write / Construct
  "movie-timescale"          guint                 : Read / Write / Construct
  "presentation-time"        gboolean              : Read / Write / Construct
  "streamable"               gboolean              : Read / Write / Construct
  "trak-timescale"           guint                 : Read / Write / Construct

Description

This element merges streams (audio and video) into QuickTime(.mov) files.

The following background intends to explain why various similar muxers are present in this plugin.

The QuickTime file format specification served as basis for the MP4 file format specification (mp4mux), and as such the QuickTime file structure is nearly identical to the so-called ISO Base Media file format defined in ISO 14496-12 (except for some media specific parts). In turn, the latter ISO Base Media format was further specialized as a Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) and in various 3GPP(2) specs (gppmux). The fragmented file features defined (only) in ISO Base Media are used by ISMV files making up (a.o.) Smooth Streaming (ismlmux).

A few properties (movie-timescale, trak-timescale) allow adjusting some technical parameters, which might be useful in (rare) cases to resolve compatibility issues in some situations.

Some other properties influence the result more fundamentally. A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, somewhat contrary to this usually being called "the header". However, a faststart file will (with some effort) arrange this to be located near start of the file, which then allows it e.g. to be played while downloading. Alternatively, rather than having one chunk of metadata at start (or end), there can be some metadata at start and most of the other data can be spread out into fragments of fragment-duration. If such fragmented layout is intended for streaming purposes, then streamable allows foregoing to add index metadata (at the end of file).

dts-method allows selecting a method for managing input timestamps (stay tuned for 0.11 to have this automagically settled). The default delta/duration method should handle nice (aka perfect streams) just fine, but may experience problems otherwise (e.g. input stream with re-ordered B-frames and/or with frame dropping). The re-ordering approach re-assigns incoming timestamps in ascending order to incoming buffers and offers an alternative in such cases. In cases where that might fail, the remaining method can be tried, which is exact and according to specs, but might experience playback on not so spec-wise players. Note that this latter approach also requires one to enable presentation-timestamp.

Example pipelines

1
gst-launch v4l2src num-buffers=500 ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! qtmux ! filesink location=video.mov
Records a video stream captured from a v4l2 device and muxes it into a qt file.

Last reviewed on 2010-12-03

Synopsis

Element Information

plugin

isomp4

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/x-raw-int, width=(int)8, depth=(int)8, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean){ true, false }

audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ], signed=(boolean)true

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 64, 8096 ], channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/x-alaw, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/AMR, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/AMR-WB, rate=(int)16000, channels=(int)[ 1, 2 ]

audio/x-alac, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

name

video_%d

direction

sink

presence

request

details

video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-svq, svqversion=(int)3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dv, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]

video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-qt-part, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)apple

video/quicktime

Details

struct GstQTMux

struct GstQTMux;

Property Details

The "dts-method" property

  "dts-method"               GstQTMuxDtsMethods    : Read / Write / Construct

Method to determine DTS time.

Default value: reorder


The "faststart" property

  "faststart"                gboolean              : Read / Write

If the file should be formatted for faststart (headers first).

Default value: FALSE


The "faststart-file" property

  "faststart-file"           gchar*                : Read / Write / Construct

File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically.

Default value: NULL


The "fragment-duration" property

  "fragment-duration"        guint                 : Read / Write / Construct

Fragment durations in ms (produce a fragmented file if > 0).

Default value: 0


The "moov-recovery-file" property

  "moov-recovery-file"       gchar*                : Read / Write / Construct

File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental).

Default value: NULL


The "movie-timescale" property

  "movie-timescale"          guint                 : Read / Write / Construct

Timescale to use in the movie (units per second).

Allowed values: >= 1

Default value: 1000


The "presentation-time" property

  "presentation-time"        gboolean              : Read / Write / Construct

Calculate and include presentation/composition time (in addition to decoding time).

Default value: TRUE


The "streamable" property

  "streamable"               gboolean              : Read / Write / Construct

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

Default value: FALSE


The "trak-timescale" property

  "trak-timescale"           guint                 : Read / Write / Construct

Timescale to use for the tracks (units per second, 0 is automatic).

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-revtv.html0000644000175000017500000002161711720565335024305 00000000000000 revtv

revtv

revtv — A video waveform monitor for each line of video processed

Synopsis

struct              GstRevTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstRevTV

Properties

  "delay"                    gint                  : Read / Write
  "gain"                     gint                  : Read / Write
  "linespace"                gint                  : Read / Write

Description

Synopsis

Element Information

plugin

effectv

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstRevTV

struct GstRevTV;

Property Details

The "delay" property

  "delay"                    gint                  : Read / Write

Delay in frames between updates.

Allowed values: [1,100]

Default value: 1


The "gain" property

  "gain"                     gint                  : Read / Write

Control gain.

Allowed values: [1,200]

Default value: 50


The "linespace" property

  "linespace"                gint                  : Read / Write

Control line spacing.

Allowed values: [1,100]

Default value: 6

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html0000644000175000017500000000702411720565335026250 00000000000000 matroska

matroska

matroska — Matroska and WebM stream handling

Plugin Information

filename

libgstmatroska.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

matroskademux

Demuxes Matroska/WebM streams into video/audio/subtitles

matroskamux

Muxes video/audio/subtitle streams into a matroska stream

matroskaparse

Parses Matroska/WebM streams into video/audio/subtitles

webmmux

Muxes video and audio streams into a WebM stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-jackaudiosrc.html0000644000175000017500000002041011720565335025567 00000000000000 jackaudiosrc

jackaudiosrc

jackaudiosrc — Captures audio from a JACK server

Synopsis

struct              GstJackAudioSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstBaseAudioSrc
                                 +----GstJackAudioSrc

Properties

  "client"                   JackClient*           : Read / Write
  "connect"                  GstJackConnect        : Read / Write
  "server"                   gchar*                : Read / Write
  "client-name"              gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

jack

author

Tristan Matthews <tristan@sat.qc.ca>

class

Source/Audio

Element Pads

name

src

direction

source

presence

always

details

audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstJackAudioSrc

struct GstJackAudioSrc;

Property Details

The "client" property

  "client"                   JackClient*           : Read / Write

Handle for jack client.


The "connect" property

  "connect"                  GstJackConnect        : Read / Write

Specify how the input ports will be connected.

Default value: Automatically connect ports to physical ports


The "server" property

  "server"                   gchar*                : Read / Write

The Jack server to connect to (NULL = default).

Default value: NULL


The "client-name" property

  "client-name"              gchar*                : Read / Write

The client name of the Jack instance (NULL = default).

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audioecho.html0000644000175000017500000002542111720565335025074 00000000000000 audioecho

audioecho

audioecho — Adds an echo or reverb effect to an audio stream

Synopsis

struct              GstAudioEcho;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioEcho

Properties

  "delay"                    guint64               : Read / Write
  "feedback"                 gfloat                : Read / Write
  "intensity"                gfloat                : Read / Write
  "max-delay"                guint64               : Read / Write

Description

audioecho adds an echo or (simple) reverb effect to an audio stream. The echo delay, intensity and the percentage of feedback can be configured.

For getting an echo effect you have to set the delay to a larger value, for example 200ms and more. Everything below will result in a simple reverb effect, which results in a slightly metallic sound.

Use the max-delay property to set the maximum amount of delay that will be used. This can only be set before going to the PAUSED or PLAYING state and will be set to the current delay by default.

Example launch line

1
2
gst-launch filesrc location="melo1.ogg" ! audioconvert ! audioecho delay=500000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink
gst-launch filesrc location="melo1.ogg" ! decodebin ! audioconvert ! audioecho delay=50000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioEcho

struct GstAudioEcho;

Property Details

The "delay" property

  "delay"                    guint64               : Read / Write

Delay of the echo in nanoseconds.

Allowed values: >= 1

Default value: 1


The "feedback" property

  "feedback"                 gfloat                : Read / Write

Amount of feedback.

Allowed values: [0,1]

Default value: 0


The "intensity" property

  "intensity"                gfloat                : Read / Write

Intensity of the echo.

Allowed values: [0,1]

Default value: 0


The "max-delay" property

  "max-delay"                guint64               : Read / Write

Maximum delay of the echo in nanoseconds (can't be changed in PLAYING or PAUSED state).

Allowed values: >= 1

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-imagefreeze.html0000644000175000017500000001470011720565335025415 00000000000000 imagefreeze

imagefreeze

imagefreeze — Generates a still frame stream from an image

Synopsis

struct              GstImageFreeze;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstImageFreeze

Description

The imagefreeze element generates a still frame video stream from the input. It duplicates the first frame with the framerate requested by downstream, allows seeking and answers queries.

Example launch line

1
gst-launch -v filesrc location=some.png ! decodebin2 ! imagefreeze ! autovideosink
This pipeline shows a still frame stream of a PNG file.

Synopsis

Element Information

plugin

imagefreeze

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv

video/x-raw-rgb

video/x-raw-gray

name

src

direction

source

presence

always

details

video/x-raw-yuv

video/x-raw-rgb

video/x-raw-gray

Details

struct GstImageFreeze

struct GstImageFreeze;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cairorender.html0000644000175000017500000001531711720565335025434 00000000000000 cairorender

cairorender

cairorender — Encodes streams using Cairo

Synopsis

struct              GstCairoRender;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstCairoRender

Description

Synopsis

Element Information

plugin

cairo

author

Lutz Mueller <lutz@topfrose.de>

class

Codec/Encoder

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

application/pdf, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

application/postscript, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/svg+xml, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

image/png, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]

Details

struct GstCairoRender

struct GstCairoRender;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiochebband.html0000644000175000017500000003436311720565335025711 00000000000000 audiochebband

audiochebband

audiochebband — Chebyshev band pass and band reject filter

Synopsis

struct              GstAudioChebBand;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioFXBaseIIRFilter
                                 +----GstAudioChebBand

Properties

  "lower-frequency"          gfloat                : Read / Write
  "mode"                     GstAudioChebBandMode  : Read / Write
  "poles"                    gint                  : Read / Write
  "ripple"                   gfloat                : Read / Write
  "type"                     gint                  : Read / Write
  "upper-frequency"          gfloat                : Read / Write

Description

Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency band. The number of poles and the ripple parameter control the rolloff.

This element has the advantage over the windowed sinc bandpass and bandreject filter that it is much faster and produces almost as good results. It's only disadvantages are the highly non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel.

For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. some frequencies in the passband will be amplified by that value. A higher ripple value will allow a faster rolloff.

For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will be at most this value. A lower ripple value will allow a faster rolloff.

As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter.

Note

Be warned that a too large number of poles can produce noise. The most poles are possible with a cutoff frequency at a quarter of the sampling rate.

Example launch line

1
2
3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequenc=6000 poles=4 ! audioconvert ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiochebband mode=band-reject lower-frequency=1000 upper-frequency=4000 ripple=0.2 ! audioconvert ! alsasink
gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequency=4000 type=2 ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioChebBand

struct GstAudioChebBand;

Property Details

The "lower-frequency" property

  "lower-frequency"          gfloat                : Read / Write

Start frequency of the band (Hz).

Allowed values: [0,100000]

Default value: 0


The "mode" property

  "mode"                     GstAudioChebBandMode  : Read / Write

Low pass or high pass mode.

Default value: Band pass (default)


The "poles" property

  "poles"                    gint                  : Read / Write

Number of poles to use, will be rounded up to the next multiply of four.

Allowed values: [4,32]

Default value: 4


The "ripple" property

  "ripple"                   gfloat                : Read / Write

Amount of ripple (dB).

Allowed values: [0,200]

Default value: 0.25


The "type" property

  "type"                     gint                  : Read / Write

Type of the chebychev filter.

Allowed values: [1,2]

Default value: 1


The "upper-frequency" property

  "upper-frequency"          gfloat                : Read / Write

Stop frequency of the band (Hz).

Allowed values: [0,100000]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-webmmux.html0000644000175000017500000002325011720565335024616 00000000000000 webmmux

webmmux

webmmux — Muxes video and audio streams into a WebM stream

Synopsis

struct              GstWebMMux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMatroskaMux
                     +----GstWebMMux

Implemented Interfaces

GstWebMMux implements GstTagSetter.

Description

webmmux muxes VP8 video and Vorbis audio streams into a WebM file.

Example launch line

1
2
3
4
gst-launch-0.10 webmmux name=mux ! filesink location=newfile.webm         \
  uridecodebin uri=file:///path/to/somefile.ogv name=demux                \
  demux. ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0    \
  demux. ! progressreport ! audioconvert ! audiorate ! vorbisenc ! queue ! mux.audio_0
This pipeline re-encodes a video file of any format into a WebM file.
1
2
3
gst-launch-0.10 webmmux name=mux ! filesink location=test.webm            \
  videotestsrc num-buffers=250 ! video/x-raw-yuv,framerate=25/1 ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 \
  audiotestsrc samplesperbuffer=44100 num-buffers=10 ! audio/x-raw-float,rate=44100 ! vorbisenc ! queue ! mux.audio_0
This pipeline muxes a test video and a sine wave into a WebM file.

Synopsis

Element Information

plugin

matroska

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

name

video_%d

direction

sink

presence

request

details

video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/webm

Details

struct GstWebMMux

struct GstWebMMux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-gconfelements.html0000644000175000017500000000733211720565335027262 00000000000000 gconfelements

gconfelements

gconfelements — elements wrapping the GStreamer/GConf audio/video output settings

Plugin Information

filename

libgstgconfelements.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

gconfaudiosink

Audio sink embedding the GConf-settings for audio output

gconfaudiosrc

Audio source embedding the GConf-settings for audio input

gconfvideosink

Video sink embedding the GConf-settings for video output

gconfvideosrc

Video source embedding the GConf-settings for video input
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-smokeenc.html0000644000175000017500000002075011720565335024740 00000000000000 smokeenc

smokeenc

smokeenc — Encode images into the Smoke format

Synopsis

struct              GstSmokeEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstSmokeEnc

Properties

  "keyframe"                 gint                  : Read / Write
  "qmax"                     gint                  : Read / Write
  "qmin"                     gint                  : Read / Write
  "threshold"                gint                  : Read / Write

Description

Synopsis

Element Information

plugin

jpeg

author

Wim Taymans <wim@fluendo.com>

class

Codec/Encoder/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstSmokeEnc

struct GstSmokeEnc;

Property Details

The "keyframe" property

  "keyframe"                 gint                  : Read / Write

Insert keyframe every N frames.

Allowed values: [1,100000]

Default value: 20


The "qmax" property

  "qmax"                     gint                  : Read / Write

Maximum quality.

Allowed values: [0,100]

Default value: 85


The "qmin" property

  "qmin"                     gint                  : Read / Write

Minimum quality.

Allowed values: [0,100]

Default value: 10


The "threshold" property

  "threshold"                gint                  : Read / Write

Motion estimation threshold.

Allowed values: [0,100000000]

Default value: 3000

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html0000644000175000017500000000652511720565335026567 00000000000000 replaygain

replaygain

replaygain — ReplayGain volume normalization

Plugin Information

filename

libgstreplaygain.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

rganalysis

Perform the ReplayGain analysis

rglimiter

Apply signal compression to raw audio data

rgvolume

Apply ReplayGain volume adjustment
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins.devhelp20000644000175000017500000052437211720565331023710 00000000000000 gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-osxvideosink.html0000644000175000017500000001303711720565335025661 00000000000000 osxvideosink

osxvideosink

osxvideosink — OSX native videosink

Synopsis

struct              GstOSXVideoSink;

Properties

  "embed"                    gboolean              : Read / Write
  "fullscreen"               gboolean              : Read / Write

Description

Synopsis

Element Information

plugin

osxvideo

author

Zaheer Abbas Merali <zaheerabas at merali dot org>

class

Sink/Video

Element Pads

Details

struct GstOSXVideoSink

struct GstOSXVideoSink {
  /* Our element stuff */
  GstVideoSink videosink;
  GstOSXWindow *osxwindow;
  NSView *superview;
};

Property Details

The "embed" property

  "embed"                    gboolean              : Read / Write

When enabled, it can be embedded.

Default value: FALSE


The "fullscreen" property

  "fullscreen"               gboolean              : Read / Write

When enabled, the view is fullscreen.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-jpegdec.html0000644000175000017500000002205011720565335024530 00000000000000 jpegdec

jpegdec

jpegdec — Decode images from JPEG format

Synopsis

struct              GstJpegDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstJpegDec

Properties

  "idct-method"              GstIDCTMethod         : Read / Write
  "max-errors"               gint                  : Read / Write

Description

Synopsis

Element Information

plugin

jpeg

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Image

Element Pads

name

sink

direction

sink

presence

always

details

image/jpeg, width=(int)[ 1, 65535 ], height=(int)[ 1, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ], sof-marker=(int){ 0, 1, 2, 5, 6, 7, 9, 10, 13, 14 }

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstJpegDec

struct GstJpegDec;

Property Details

The "idct-method" property

  "idct-method"              GstIDCTMethod         : Read / Write

The IDCT algorithm to use.

Default value: Faster, less accurate integer method


The "max-errors" property

  "max-errors"               gint                  : Read / Write

Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error).

Allowed values: >= G_MAXULONG

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-jpegenc.html0000644000175000017500000002534111720565335024550 00000000000000 jpegenc

jpegenc

jpegenc — Encode images in JPEG format

Synopsis

struct              GstJpegEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstJpegEnc

Properties

  "quality"                  gint                  : Read / Write
  "idct-method"              GstIDCTMethod         : Read / Write

Signals

  "frame-encoded"                                  : Run Last

Description

Synopsis

Element Information

plugin

jpeg

author

Wim Taymans <wim.taymans@tvd.be>

class

Codec/Encoder/Image

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, Y41B, Y42B, YVYU, Y444 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

image/jpeg, width=(int)[ 16, 65535 ], height=(int)[ 16, 65535 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstJpegEnc

struct GstJpegEnc;

Property Details

The "quality" property

  "quality"                  gint                  : Read / Write

Quality of encoding.

Allowed values: [0,100]

Default value: 85


The "idct-method" property

  "idct-method"              GstIDCTMethod         : Read / Write

The IDCT algorithm to use.

Default value: Faster, less accurate integer method

Signal Details

The "frame-encoded" signal

void                user_function                      (GstJpegEnc *gstjpegenc,
                                                        gpointer    user_data)       : Run Last

gstjpegenc :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-agingtv.html0000644000175000017500000002455711720565335024604 00000000000000 agingtv

agingtv

agingtv — AgingTV adds age to video input using scratches and dust

Synopsis

struct              GstAgingTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstAgingTV

Properties

  "color-aging"              gboolean              : Read / Write
  "dusts"                    gboolean              : Read / Write
  "pits"                     gboolean              : Read / Write
  "scratch-lines"            guint                 : Read / Write

Description

AgingTV ages a video stream in realtime, changes the colors and adds scratches and dust.

Example launch line

1
gst-launch -v videotestsrc ! agingtv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of agingtv on a test stream.

Synopsis

Element Information

plugin

effectv

author

Sam Lantinga <slouken@devolution.com>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstAgingTV

struct GstAgingTV;

Property Details

The "color-aging" property

  "color-aging"              gboolean              : Read / Write

Color Aging.

Default value: TRUE


The "dusts" property

  "dusts"                    gboolean              : Read / Write

Dusts.

Default value: TRUE


The "pits" property

  "pits"                     gboolean              : Read / Write

Pits.

Default value: TRUE


The "scratch-lines" property

  "scratch-lines"            guint                 : Read / Write

Number of scratch lines.

Allowed values: <= 20

Default value: 7

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flvmux.html0000644000175000017500000002564211720565335024462 00000000000000 flvmux

flvmux

flvmux — Muxes video/audio streams into a FLV stream

Synopsis

                    GstFlvMux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstFlvMux

Implemented Interfaces

GstFlvMux implements GstTagSetter.

Properties

  "is-live"                  gboolean              : Read / Write
  "streamable"               gboolean              : Read / Write

Description

flvmux muxes different streams into an FLV file.

Example launch line

1
gst-launch -v filesrc location=/path/to/audio ! decodebin2 ! queue ! flvmux name=m ! filesink location=file.flv   filesrc location=/path/to/video ! decodebin2 ! queue ! m.
This pipeline muxes an audio and video file into a single FLV file.

Synopsis

Element Information

plugin

flv

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Codec/Muxer

Element Pads

name

audio

direction

sink

presence

request

details

audio/x-adpcm, layout=(string)swf, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 22050, 44100 }, parsed=(boolean)true

audio/mpeg, mpegversion=(int)2, framed=(boolean)true

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true

audio/x-nellymoser, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 16000, 22050, 44100 }

audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)8, depth=(int)8, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)false

audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)16, depth=(int)16, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)true

audio/x-alaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

audio/x-speex, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

name

video

direction

sink

presence

request

details

video/x-flash-video

video/x-flash-screen

video/x-vp6-flash

video/x-vp6-alpha

video/x-h264, stream-format=(string)avc

name

src

direction

source

presence

always

details

video/x-flv

Details

GstFlvMux

typedef struct _GstFlvMux GstFlvMux;

Property Details

The "is-live" property

  "is-live"                  gboolean              : Read / Write

The stream is live and does not need an index.

Default value: FALSE


The "streamable" property

  "streamable"               gboolean              : Read / Write

If True, the output will be streaming friendly. (ie without indexes and duration)

Default value: FALSE

Since 0.10.24

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html0000644000175000017500000000567311720565335025700 00000000000000 apetag

apetag

apetag — APEv1/2 tag reader

Plugin Information

filename

libgstapetag.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

apedemux

Read and output APE tags while demuxing the contents
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html0000644000175000017500000000635311720565335026571 00000000000000 interleave

interleave

interleave — Audio interleaver/deinterleaver

Plugin Information

filename

libgstinterleave.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

deinterleave

Splits one interleaved multichannel audio stream into many mono audio streams

interleave

Folds many mono channels into one interleaved audio stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-aspectratiocrop.html0000644000175000017500000004460611720565335026344 00000000000000 aspectratiocrop

aspectratiocrop

aspectratiocrop — Crops video into a user-defined aspect-ratio

Synopsis

struct              GstAspectRatioCrop;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstAspectRatioCrop

Implemented Interfaces

GstAspectRatioCrop implements GstChildProxy.

Properties

  "aspect-ratio"             GstFraction           : Read / Write

Description

This element crops video frames to a specified "aspect-ratio".

If the aspect-ratio is already correct, the element will operate in pass-through mode.

Example launch line

1
gst-launch -v videotestsrc ! video/x-raw-rgb,height=640,width=480 ! aspectratiocrop aspect-ratio=16/9 ! ximagesink
This pipeline generates a videostream in 4/3 and crops it to 16/9.

Synopsis

Element Information

plugin

videocrop

author

Thijs Vermeir <thijsvermeir@gmail.com>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y800, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstAspectRatioCrop

struct GstAspectRatioCrop;

Property Details

The "aspect-ratio" property

  "aspect-ratio"             GstFraction           : Read / Write

Target aspect-ratio of video.

See Also

GstVideoCrop
gst-plugins-good-0.10.31/docs/plugins/html/up.png0000644000175000017500000000062611720565335016521 00000000000000PNG  IHDRw=bKGD pHYs  ~tIME2.E#IDATx=J@Fo] !+2[Z<@/9|t$D9nnBjBRIsI:H8UPN1fcsN95M㧖ɵ 束1~pEe$I 7nrDf!;`'ykI䲤sI_]y^^I>O>?YBIENDB`gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-smokedec.html0000644000175000017500000001243011720565335024722 00000000000000 smokedec

smokedec

smokedec — Decode video from Smoke format

Synopsis

struct              GstSmokeDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstSmokeDec

Description

Synopsis

Element Information

plugin

jpeg

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-smoke, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstSmokeDec

struct GstSmokeDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-v4l2radio.html0000644000175000017500000001602011720565335024735 00000000000000 v4l2radio

v4l2radio

v4l2radio — Controls a Video4Linux2 radio device

Synopsis

struct              GstV4l2Radio;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstV4l2Radio

Implemented Interfaces

GstV4l2Radio implements GstURIHandler, GstImplementsInterface, GstTuner and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "frequency"                gint                  : Read / Write

Description

Synopsis

Element Information

plugin

video4linux2

author

Alexey Chernov <4ernov@gmail.com>

class

Tuner

Element Pads

Details

struct GstV4l2Radio

struct GstV4l2Radio;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

Video4Linux2 radio device location.

Default value: "/dev/radio0"


The "frequency" property

  "frequency"                gint                  : Read / Write

Station frequency in Hz.

Allowed values: [87500000,108000000]

Default value: 100000000

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-autoaudiosink.html0000644000175000017500000001772011720565335026016 00000000000000 autoaudiosink

autoaudiosink

autoaudiosink — Wrapper audio sink for automatically detected audio sink

Synopsis

                    GstAutoAudioSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstAutoAudioSink

Implemented Interfaces

GstAutoAudioSink implements GstChildProxy.

Properties

  "filter-caps"              GstCaps*              : Read / Write

Description

autoaudiosink is an audio sink that automatically detects an appropriate audio sink to use. It does so by scanning the registry for all elements that have Sink and Audio in the class field of their element information, and also have a non-zero autoplugging rank.

Example launch line

1
gst-launch -v -m audiotestsrc ! audioconvert ! audioresample ! autoaudiosink

Synopsis

Element Information

plugin

autodetect

author

Jan Schmidt <thaytan@noraisin.net>

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

ANY

Details

GstAutoAudioSink

typedef struct _GstAutoAudioSink GstAutoAudioSink;

Property Details

The "filter-caps" property

  "filter-caps"              GstCaps*              : Read / Write

This property will filter out candidate sinks that can handle the specified caps. By default only audio sinks that support raw floating point and integer audio are selected.

This property can only be set before the element goes to the READY state.

Since 0.10.7

See Also

autovideosink, alsasink, osssink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html0000644000175000017500000002631211720565335025235 00000000000000 rtp

rtp

rtp — Real-time protocol plugins

Plugin Information

filename

libgstrtp.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

asteriskh263

Extracts H263 video from RTP and encodes in Asterisk H263 format

rtpL16depay

Extracts raw audio from RTP packets

rtpL16pay

Payload-encode Raw audio into RTP packets (RFC 3551)

rtpac3depay

Extracts AC3 audio from RTP packets (RFC 4184)

rtpac3pay

Payload AC3 audio as RTP packets (RFC 4184)

rtpamrdepay

Extracts AMR or AMR-WB audio from RTP packets (RFC 3267)

rtpamrpay

Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267)

rtpbvdepay

Extracts BroadcomVoice audio from RTP packets (RFC 4298)

rtpbvpay

Packetize BroadcomVoice audio streams into RTP packets (RFC 4298)

rtpceltdepay

Extracts CELT audio from RTP packets

rtpceltpay

Payload-encodes CELT audio into a RTP packet

rtpdepay

Accepts raw RTP and RTCP packets and sends them forward

rtpdvdepay

Depayloads DV from RTP packets (RFC 3189)

rtpdvpay

Payloads DV into RTP packets (RFC 3189)

rtpg722depay

Extracts G722 audio from RTP packets

rtpg722pay

Payload-encode Raw audio into RTP packets (RFC 3551)

rtpg723depay

Extracts G.723 audio from RTP packets (RFC 3551)

rtpg723pay

Packetize G.723 audio into RTP packets

rtpg726depay

Extracts G.726 audio from RTP packets

rtpg726pay

Payload-encodes G.726 audio into a RTP packet

rtpg729depay

Extracts G.729 audio from RTP packets (RFC 3551)

rtpg729pay

Packetize G.729 audio into RTP packets

rtpgsmdepay

Extracts GSM audio from RTP packets

rtpgsmpay

Payload-encodes GSM audio into a RTP packet

rtpgstdepay

Extracts GStreamer buffers from RTP packets

rtpgstpay

Payload GStreamer buffers as RTP packets

rtph263depay

Extracts H263 video from RTP packets (RFC 2190)

rtph263pay

Payload-encodes H263 video in RTP packets (RFC 2190)

rtph263pdepay

Extracts H263/+/++ video from RTP packets (RFC 4629)

rtph263ppay

Payload-encodes H263/+/++ video in RTP packets (RFC 4629)

rtph264depay

Extracts H264 video from RTP packets (RFC 3984)

rtph264pay

Payload-encode H264 video into RTP packets (RFC 3984)

rtpilbcdepay

Extracts iLBC audio from RTP packets (RFC 3952)

rtpilbcpay

Packetize iLBC audio streams into RTP packets

rtpj2kdepay

Extracts JPEG 2000 video from RTP packets (RFC 5371)

rtpj2kpay

Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)

rtpjpegdepay

Extracts JPEG video from RTP packets (RFC 2435)

rtpjpegpay

Payload-encodes JPEG pictures into RTP packets (RFC 2435)

rtpmp1sdepay

Extracts MPEG1 System Streams from RTP packets (RFC 3555)

rtpmp2tdepay

Extracts MPEG2 TS from RTP packets (RFC 2250)

rtpmp2tpay

Payload-encodes MPEG2 TS into RTP packets (RFC 2250)

rtpmp4adepay

Extracts MPEG4 audio from RTP packets (RFC 3016)

rtpmp4apay

Payload MPEG4 audio as RTP packets (RFC 3016)

rtpmp4gdepay

Extracts MPEG4 elementary streams from RTP packets (RFC 3640)

rtpmp4gpay

Payload MPEG4 elementary streams as RTP packets (RFC 3640)

rtpmp4vdepay

Extracts MPEG4 video from RTP packets (RFC 3016)

rtpmp4vpay

Payload MPEG-4 video as RTP packets (RFC 3016)

rtpmpadepay

Extracts MPEG audio from RTP packets (RFC 2038)

rtpmpapay

Payload MPEG audio as RTP packets (RFC 2038)

rtpmparobustdepay

Extracts MPEG audio from RTP packets (RFC 5219)

rtpmpvdepay

Extracts MPEG video from RTP packets (RFC 2250)

rtpmpvpay

Payload-encodes MPEG2 ES into RTP packets (RFC 2250)

rtppcmadepay

Extracts PCMA audio from RTP packets

rtppcmapay

Payload-encodes PCMA audio into a RTP packet

rtppcmudepay

Extracts PCMU audio from RTP packets

rtppcmupay

Payload-encodes PCMU audio into a RTP packet

rtpqcelpdepay

Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658)

rtpqdm2depay

Extracts QDM2 audio from RTP packets (no RFC)

rtpsirendepay

Extracts Siren audio from RTP packets

rtpsirenpay

Packetize Siren audio streams into RTP packets

rtpspeexdepay

Extracts Speex audio from RTP packets

rtpspeexpay

Payload-encodes Speex audio into a RTP packet

rtpsv3vdepay

Extracts SVQ3 video from RTP packets (no RFC)

rtptheoradepay

Extracts Theora video from RTP packets (draft-01 of RFC XXXX)

rtptheorapay

Payload-encode Theora video into RTP packets (draft-01 RFC XXXX)

rtpvorbisdepay

Extracts Vorbis Audio from RTP packets (RFC 5215)

rtpvorbispay

Payload-encode Vorbis audio into RTP packets (RFC 5215)

rtpvrawdepay

Extracts raw video from RTP packets (RFC 4175)

rtpvrawpay

Payload raw video as RTP packets (RFC 4175)
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-progressreport.html0000644000175000017500000003100411720565335026226 00000000000000 progressreport

progressreport

progressreport — Periodically query and report on processing progress

Synopsis

struct              GstProgressReport;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstProgressReport

Properties

  "silent"                   gboolean              : Read / Write
  "update-freq"              gint                  : Read / Write
  "format"                   gchar*                : Read / Write
  "do-query"                 gboolean              : Read / Write

Description

The progressreport element can be put into a pipeline to report progress, which is done by doing upstream duration and position queries in regular (real-time) intervals. Both the interval and the prefered query format can be specified via the "update-freq" and the "format" property.

Element messages containing a "progress" structure are posted on the bus whenever progress has been queried (since gst-plugins-good 0.10.6 only).

Since the element was originally designed for debugging purposes, it will by default also print information about the current progress to the terminal. This can be prevented by setting the "silent" property to TRUE.

This element is most useful in transcoding pipelines or other situations where just querying the pipeline might not lead to the wanted result. For progress in TIME format, the element is best placed in a 'raw stream' section of the pipeline (or after any demuxers/decoders/parsers).

Three more things should be pointed out: firstly, the element will only query progress when data flow happens. If data flow is stalled for some reason, no progress messages will be posted. Secondly, there are other elements (like qtdemux, for example) that may also post "progress" element messages on the bus. Applications should check the source of any element messages they receive, if needed. Finally, applications should not take action on receiving notification of progress being 100%, they should only take action when they receive an EOS message (since the progress reported is in reference to an internal point of a pipeline and not the pipeline as a whole).

Example launch line

1
gst-launch -m filesrc location=foo.ogg ! decodebin ! progressreport update-freq=1 ! audioconvert ! audioresample ! autoaudiosink
This shows a progress query where a duration is available.
1
gst-launch -m audiotestsrc ! progressreport update-freq=1 ! audioconvert ! autoaudiosink
This shows a progress query where no duration is available.

Synopsis

Element Information

plugin

debug

author

Jan Schmidt <thaytan@mad.scientist.com>

class

Testing

Element Pads

name

sink

direction

sink

presence

always

details

ANY

name

src

direction

source

presence

always

details

ANY

Details

struct GstProgressReport

struct GstProgressReport;

Property Details

The "silent" property

  "silent"                   gboolean              : Read / Write

Do not print output to stdout.

Default value: FALSE


The "update-freq" property

  "update-freq"              gint                  : Read / Write

Number of seconds between reports when data is flowing.

Allowed values: >= 1

Default value: 5


The "format" property

  "format"                   gchar*                : Read / Write

Format to use for the querying.

Default value: "auto"


The "do-query" property

  "do-query"                 gboolean              : Read / Write

Use a query instead of buffer metadata to determine stream position.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-deinterlace.html0000644000175000017500000004720511720565335025417 00000000000000 deinterlace

deinterlace

deinterlace — Deinterlace Methods ported from DScaler/TvTime

Synopsis

struct              GstDeinterlace;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstDeinterlace

Implemented Interfaces

GstDeinterlace implements GstChildProxy.

Properties

  "fields"                   GstDeinterlaceFields  : Read / Write
  "method"                   GstDeinterlaceMethods  : Read / Write
  "mode"                     GstDeinterlaceModes   : Read / Write
  "tff"                      GstDeinterlaceFieldLayout  : Read / Write
  "drop-orphans"             gboolean              : Read / Write
  "ignore-obscure"           gboolean              : Read / Write
  "locking"                  GstDeinterlaceLocking  : Read / Write

Description

deinterlace deinterlaces interlaced video frames to progressive video frames. For this different algorithms can be selected which will be described later.

Example launch line

1
gst-launch -v filesrc location=/path/to/file ! decodebin2 ! ffmpegcolorspace ! deinterlace ! ffmpegcolorspace ! autovideosink
This pipeline deinterlaces a video file with the default deinterlacing options.

Synopsis

Element Information

plugin

deinterlace

author

Martin Eikermann <meiker@upb.de>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video/Deinterlace

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc){ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstDeinterlace

struct GstDeinterlace;

Property Details

The "fields" property

  "fields"                   GstDeinterlaceFields  : Read / Write

This selects which fields should be output. If "all" is selected the output framerate will be double.

Default value: All fields


The "method" property

  "method"                   GstDeinterlaceMethods  : Read / Write

Selects the different deinterlacing algorithms that can be used. These provide different quality and CPU usage.

Some methods provide parameters which can be set by getting the "method" child via the GstChildProxy interface and setting the appropiate properties on it.

  • tomsmocomp Motion Adaptive: Motion Search

  • greedyh Motion Adaptive: Advanced Detection

  • greedyl Motion Adaptive: Simple Detection

  • vfir Blur vertical

  • linear Linear interpolation

  • linearblend Linear interpolation in time domain. Any motion causes significant ghosting, so this method should not be used.

  • scalerbob Double lines

  • weave Weave. Bad quality, do not use.

  • weavetff Progressive: Top Field First. Bad quality, do not use.

  • weavebff Progressive: Bottom Field First. Bad quality, do not use.

Default value: Television: Full resolution


The "mode" property

  "mode"                     GstDeinterlaceModes   : Read / Write

This selects whether the deinterlacing methods should always be applied or if they should only be applied on content that has the "interlaced" flag on the caps.

Default value: Auto detection


The "tff" property

  "tff"                      GstDeinterlaceFieldLayout  : Read / Write

Deinterlace top field first.

Default value: Auto detection


The "drop-orphans" property

  "drop-orphans"             gboolean              : Read / Write

This selects whether to drop orphan fields at the beginning of telecine patterns in active locking mode.

Default value: TRUE

Since 0.10.31


The "ignore-obscure" property

  "ignore-obscure"           gboolean              : Read / Write

This selects whether to ignore obscure/rare telecine patterns. NTSC 2:3 pulldown variants are the only really common patterns.

Default value: TRUE

Since 0.10.31


The "locking" property

  "locking"                  GstDeinterlaceLocking  : Read / Write

This selects which approach to pattern locking is used which affects processing latency and accuracy of timestamp adjustment for telecine streams.

Default value: No pattern locking

Since 0.10.31

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-icydemux.html0000644000175000017500000001461711720565335024770 00000000000000 icydemux

icydemux

icydemux — Read and output ICY tags while demuxing the contents

Synopsis

struct              GstICYDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstICYDemux

Description

icydemux accepts data streams with ICY metadata at known intervals, as transmitted from an upstream element (usually read as response headers from an HTTP stream). The mime type of the data between the tag blocks is detected using typefind functions, and the appropriate output mime type set on outgoing buffers.

Example launch line

1
gst-launch souphttpsrc location=http://some.server/ iradio-mode=true ! icydemux ! fakesink -t
This pipeline should read any available ICY tag information and output it. The contents of the stream should be detected, and the appropriate mime type set on buffers produced from icydemux. (Using gnomevfssrc, neonhttpsrc or giosrc instead of souphttpsrc should also work.)

Synopsis

Element Information

plugin

icydemux

author

Jan Schmidt <thaytan@mad.scientist.com>, Michael Smith <msmith@fluendo.com>

class

Codec/Demuxer/Metadata

Element Pads

name

sink

direction

sink

presence

always

details

application/x-icy, metadata-interval=(int)[ 0, 2147483647 ]

name

src

direction

source

presence

sometimes

details

ANY

Details

struct GstICYDemux

struct GstICYDemux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html0000644000175000017500000000633011720565335026411 00000000000000 gdkpixbuf

gdkpixbuf

gdkpixbuf — GdkPixbuf-based image decoder, scaler and sink

Plugin Information

filename

libgstgdkpixbuf.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

gdkpixbufdec

Decodes images in a video stream using GdkPixbuf

gdkpixbufscale

Resizes video

gdkpixbufsink

Output images as GdkPixbuf objects in bus messages
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-osxaudio.html0000644000175000017500000000624111720565335026262 00000000000000 osxaudio

osxaudio

osxaudio — OSX (Mac OS X) audio support for GStreamer

Plugin Information

filename

libgstosxaudio.so

version

0.10.5.1

run-time license

LGPL

package

GStreamer Good Plug-ins CVS/prerelease

origin

Unknown package origin

Elements

osxaudiosink

Output to a sound card in OS X

osxaudiosrc

Input from a sound card in OS X
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-annodex.html0000644000175000017500000000621011720565335026057 00000000000000 annodex

annodex

annodex — annodex stream manipulation (info about annodex: http://www.annodex.net)

Plugin Information

filename

libgstannodex.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

cmmldec

Decodes CMML streams

cmmlenc

Encodes CMML streams
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-wavpackenc.html0000644000175000017500000002703211720565335025256 00000000000000 wavpackenc

wavpackenc

wavpackenc — Encodes audio with the Wavpack lossless/lossy audio codec

Synopsis

struct              GstWavpackEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstWavpackEnc

Implemented Interfaces

GstWavpackEnc implements GstPreset.

Properties

  "bitrate"                  guint                 : Read / Write
  "bits-per-sample"          gdouble               : Read / Write
  "correction-mode"          GstWavpackEncCorrectionMode  : Read / Write
  "extra-processing"         guint                 : Read / Write
  "joint-stereo-mode"        GstWavpackEncJSMode   : Read / Write
  "md5"                      gboolean              : Read / Write
  "mode"                     GstWavpackEncMode     : Read / Write

Description

Synopsis

Element Information

plugin

wavpack

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Codec/Encoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], endianness=(int)1234, channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], signed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 2 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true

name

wvcsrc

direction

source

presence

sometimes

details

audio/x-wavpack-correction, framed=(boolean)true

Details

struct GstWavpackEnc

struct GstWavpackEnc;

Property Details

The "bitrate" property

  "bitrate"                  guint                 : Read / Write

Try to encode with this average bitrate (bits/sec). This enables lossy encoding, values smaller than 24000 disable it again.

Allowed values: <= 9600000

Default value: 0


The "bits-per-sample" property

  "bits-per-sample"          gdouble               : Read / Write

Try to encode with this amount of bits per sample. This enables lossy encoding, values smaller than 2.0 disable it again.

Allowed values: [0,24]

Default value: 0


The "correction-mode" property

  "correction-mode"          GstWavpackEncCorrectionMode  : Read / Write

Use this mode for the correction stream. Only works in lossy mode!.

Default value: Create no correction file


The "extra-processing" property

  "extra-processing"         guint                 : Read / Write

Use better but slower filters for better compression/quality.

Allowed values: <= 6

Default value: 0


The "joint-stereo-mode" property

  "joint-stereo-mode"        GstWavpackEncJSMode   : Read / Write

Use this joint-stereo mode.

Default value: auto


The "md5" property

  "md5"                      gboolean              : Read / Write

Store MD5 hash of raw samples within the file.

Default value: FALSE


The "mode" property

  "mode"                     GstWavpackEncMode     : Read / Write

Speed versus compression tradeoff.

Default value: Normal Compression

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-pngdec.html0000644000175000017500000001360511720565335024375 00000000000000 pngdec

pngdec

pngdec — Decode a png video frame to a raw image

Synopsis

struct              GstPngDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstPngDec

Description

Synopsis

Element Information

plugin

png

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Image

Element Pads

name

sink

direction

sink

presence

always

details

image/png

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)64, depth=(int)64, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstPngDec

struct GstPngDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rtpjpegpay.html0000644000175000017500000002071611720565335025323 00000000000000 rtpjpegpay

rtpjpegpay

rtpjpegpay — Payload-encodes JPEG pictures into RTP packets (RFC 2435)

Synopsis

struct              GstRtpJPEGPay;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseRTPPayload
                     +----GstRtpJPEGPay

Properties

  "quality"                  gint                  : Read / Write
  "type"                     gint                  : Read / Write
  "buffer-list"              gboolean              : Read / Write

Description

Payload encode JPEG pictures into RTP packets according to RFC 2435. For detailed information see: http://www.rfc-editor.org/rfc/rfc2435.txt

The payloader takes a JPEG picture, scans the header for quantization tables (if needed) and constructs the RTP packet header followed by the actual JPEG entropy scan.

The payloader assumes that correct width and height is found in the caps.

Synopsis

Element Information

plugin

rtp

author

Axis Communications <dev-gstreamer@axis.com>

class

Codec/Payloader/Network/RTP

Element Pads

name

sink

direction

sink

presence

always

details

image/jpeg

video/x-jpeg

name

src

direction

source

presence

always

details

application/x-rtp, media=(string)video, payload=(int)26, clock-rate=(int)90000, encoding-name=(string)JPEG

Details

struct GstRtpJPEGPay

struct GstRtpJPEGPay;

Property Details

The "quality" property

  "quality"                  gint                  : Read / Write

Quality factor on JPEG data (unused).

Allowed values: [0,255]

Default value: 255


The "type" property

  "type"                     gint                  : Read / Write

Default JPEG Type, overwritten by SOF when present.

Allowed values: [0,255]

Default value: 1


The "buffer-list" property

  "buffer-list"              gboolean              : Read / Write

Use Buffer Lists.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-vertigotv.html0000644000175000017500000002575111720565335025173 00000000000000 vertigotv

vertigotv

vertigotv — A loopback alpha blending effector with rotating and scaling

Synopsis

struct              GstVertigoTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstVertigoTV

Properties

  "speed"                    gfloat                : Read / Write
  "zoom-speed"               gfloat                : Read / Write

Signals

  "reset-parms"                                    : Run Last

Description

VertigoTV is a loopback alpha blending effector with rotating and scaling.

Example launch line

1
gst-launch -v videotestsrc ! vertigotv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of vertigotv on a test stream.

Synopsis

Element Information

plugin

effectv

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVertigoTV

struct GstVertigoTV;

Property Details

The "speed" property

  "speed"                    gfloat                : Read / Write

Control the speed of movement.

Allowed values: [0.01,100]

Default value: 0.02


The "zoom-speed" property

  "zoom-speed"               gfloat                : Read / Write

Control the rate of zooming.

Allowed values: [1.01,1.1]

Default value: 1.01

Signal Details

The "reset-parms" signal

void                user_function                      (GstVertigoTV *gstvertigotv,
                                                        gpointer      user_data)         : Run Last

gstvertigotv :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-equalizer-10bands.html0000644000175000017500000004042011720565335026357 00000000000000 equalizer-10bands

equalizer-10bands

equalizer-10bands — Direct Form 10 band IIR equalizer

Synopsis

struct              GstIirEqualizer10Bands;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstIirEqualizer
                                 +----GstIirEqualizer10Bands

Implemented Interfaces

GstIirEqualizer10Bands implements GstChildProxy and GstPreset.

Properties

  "band0"                    gdouble               : Read / Write
  "band1"                    gdouble               : Read / Write
  "band2"                    gdouble               : Read / Write
  "band3"                    gdouble               : Read / Write
  "band4"                    gdouble               : Read / Write
  "band5"                    gdouble               : Read / Write
  "band6"                    gdouble               : Read / Write
  "band7"                    gdouble               : Read / Write
  "band8"                    gdouble               : Read / Write
  "band9"                    gdouble               : Read / Write

Description

The 10 band equalizer element allows to change the gain of 10 equally distributed frequency bands between 30 Hz and 15 kHz.

Example launch line

1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-10bands band2=3.0 ! alsasink
This raises the volume of the 3rd band which is at 119 Hz by 3 db.

Synopsis

Element Information

plugin

equalizer

author

Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstIirEqualizer10Bands

struct GstIirEqualizer10Bands;

Property Details

The "band0" property

  "band0"                    gdouble               : Read / Write

gain for the frequency band 29 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band1" property

  "band1"                    gdouble               : Read / Write

gain for the frequency band 59 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band2" property

  "band2"                    gdouble               : Read / Write

gain for the frequency band 119 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band3" property

  "band3"                    gdouble               : Read / Write

gain for the frequency band 237 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band4" property

  "band4"                    gdouble               : Read / Write

gain for the frequency band 474 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band5" property

  "band5"                    gdouble               : Read / Write

gain for the frequency band 947 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band6" property

  "band6"                    gdouble               : Read / Write

gain for the frequency band 1889 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band7" property

  "band7"                    gdouble               : Read / Write

gain for the frequency band 3770 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band8" property

  "band8"                    gdouble               : Read / Write

gain for the frequency band 7523 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0


The "band9" property

  "band9"                    gdouble               : Read / Write

gain for the frequency band 15011 Hz, ranging from -24 dB to +12 dB.

Allowed values: [-24,12]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rganalysis.html0000644000175000017500000004456411720565335025321 00000000000000 rganalysis

rganalysis

rganalysis — Perform the ReplayGain analysis

Synopsis

struct              GstRgAnalysis;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstRgAnalysis

Properties

  "forced"                   gboolean              : Read / Write
  "num-tracks"               gint                  : Read / Write
  "reference-level"          gdouble               : Read / Write
  "message"                  gboolean              : Read / Write / Construct

Description

This element analyzes raw audio sample data in accordance with the proposed ReplayGain standard for calculating the ideal replay gain for music tracks and albums. The element is designed as a pass-through filter that never modifies any data. As it receives an EOS event, it finalizes the ongoing analysis and generates a tag list containing the results. It is sent downstream with a tag event and posted on the message bus with a tag message. The EOS event is forwarded as normal afterwards. Result tag lists at least contain the tags GST_TAG_TRACK_GAIN, GST_TAG_TRACK_PEAK and GST_TAG_REFERENCE_LEVEL.

Because the generated metadata tags become available at the end of streams, downstream muxer and encoder elements are normally unable to save them in their output since they generally save metadata in the file header. Therefore, it is often necessary that applications read the results in a bus event handler for the tag message. Obtaining the values this way is always needed for album processing since the album gain and peak values need to be associated with all tracks of an album, not just the last one.

Example launch lines

1
gst-launch -t audiotestsrc wave=sine num-buffers=512 ! rganalysis ! fakesink
Analyze a simple test waveform
1
2
gst-launch -t filesrc location=filename.ext ! decodebin \
    ! audioconvert ! audioresample ! rganalysis ! fakesink
Analyze a given file
1
2
gst-launch -t gnomevfssrc location=http://replaygain.hydrogenaudio.org/ref_pink.wav \
    ! wavparse ! rganalysis ! fakesink
Analyze the pink noise reference file

The above launch line yields a result gain of +6 dB (instead of the expected +0 dB). This is not in error, refer to the "reference-level" property documentation for more information.


Acknowledgements

This element is based on code used in the vorbisgain program and many others. The relevant parts are copyrighted by David Robinson, Glen Sawyer and Frank Klemm.

Synopsis

Element Information

plugin

replaygain

author

René Stadler <mail@renestadler.de>

class

Filter/Analyzer/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int)32, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }

audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean)true, endianness=(int)1234, channels=(int){ 1, 2 }, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }

Details

struct GstRgAnalysis

struct GstRgAnalysis;

Opaque data structure.

Property Details

The "forced" property

  "forced"                   gboolean              : Read / Write

Whether to analyze streams even when ReplayGain tags exist.

For assisting transcoder/converter applications, the element can silently skip the processing of streams that already contain the necessary tags. Data will flow as usual but the element will not consume CPU time and will not generate result tags. To enable possible skipping, set this property to FALSE.

If used in conjunction with album processing, the element will skip the number of remaining album tracks if a full set of tags is found for the first track. If a subsequent track of the album is missing tags, processing cannot start again. If this is undesired, the application has to scan all files beforehand and enable forcing of processing if needed.

Default value: TRUE


The "num-tracks" property

  "num-tracks"               gint                  : Read / Write

Number of remaining album tracks.

Analyzing several streams sequentially and assigning them a common result gain is known as "album processing". If this gain is used during playback (by switching to "album mode"), all tracks of an album receive the same amplification. This keeps the relative volume levels between the tracks intact. To enable this, set this property to the number of streams that will be processed as album tracks.

Every time an EOS event is received, the value of this property is decremented by one. As it reaches zero, it is assumed that the last track of the album finished. The tag list for the final stream will contain the additional tags GST_TAG_ALBUM_GAIN and GST_TAG_ALBUM_PEAK. All other streams just get the two track tags posted because the values for the album tags are not known before all tracks are analyzed. Applications need to ensure that the album gain and peak values are also associated with the other tracks when storing the results.

If the total number of album tracks is unknown beforehand, just ensure that the value is greater than 1 before each track starts. Then before the end of the last track, set it to the value 1.

To perform album processing, the element has to preserve data between streams. This cannot survive a state change to the NULL or READY state. If you change your pipeline's state to NULL or READY between tracks, lock the element's state using gst_element_set_locked_state() when it is in PAUSED or PLAYING.

Allowed values: >= 0

Default value: 0


The "reference-level" property

  "reference-level"          gdouble               : Read / Write

Reference level [dB].

Analyzing the ReplayGain pink noise reference waveform computes a result of +6 dB instead of the expected 0 dB. This is because the default reference level is 89 dB. To obtain values as lined out in the original proposal of ReplayGain, set this property to 83.

Almost all software uses 89 dB as a reference however, and this value has become the new official value. That is to say, while the change has been acclaimed by the author of the ReplayGain proposal, the webpage is still outdated at the time of this writing.

The value was changed because the original proposal recommends a default pre-amp value of +6 dB for playback. This seemed a bit odd, as it means that the algorithm has the general tendency to produce adjustment values that are 6 dB too low. Bumping the reference level by 6 dB compensated for this.

The problem of the reference level being ambiguous for lack of concise standardization is to be solved by adopting the GST_TAG_REFERENCE_LEVEL tag, which allows to store the used value alongside the gain values.

Allowed values: [0,150]

Default value: 89


The "message" property

  "message"                  gboolean              : Read / Write / Construct

Post statics messages.

Default value: FALSE

See Also

GstRgVolume
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html0000644000175000017500000000576011720565335026253 00000000000000 videobox

videobox

videobox — resizes a video by adding borders or cropping

Plugin Information

filename

libgstvideobox.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

videobox

Resizes a video by adding borders or cropping
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html0000644000175000017500000000613311720565335025216 00000000000000 flv

flv

flv — FLV muxing and demuxing plugin

Plugin Information

filename

libgstflv.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

flvdemux

Demux FLV feeds into digital streams

flvmux

Muxes video/audio streams into a FLV stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-dvdec.html0000644000175000017500000002117711720565335024225 00000000000000 dvdec

dvdec

dvdec — Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)

Synopsis

struct              GstDVDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstDVDec

Properties

  "clamp-chroma"             gboolean              : Read / Write
  "clamp-luma"               gboolean              : Read / Write
  "drop-factor"              gint                  : Read / Write
  "quality"                  GstDVDecQualityEnum   : Read / Write

Description

Synopsis

Element Information

plugin

dv

author

Erik Walthinsen <omega@cse.ogi.edu>,Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-dv, systemstream=(boolean)false

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)720, framerate=(fraction)[ 1/1, 60/1 ]

Details

struct GstDVDec

struct GstDVDec;

Property Details

The "clamp-chroma" property

  "clamp-chroma"             gboolean              : Read / Write

Clamp chroma.

Default value: FALSE


The "clamp-luma" property

  "clamp-luma"               gboolean              : Read / Write

Clamp luma.

Default value: FALSE


The "drop-factor" property

  "drop-factor"              gint                  : Read / Write

Only decode Nth frame.

Allowed values: >= 1

Default value: 1


The "quality" property

  "quality"                  GstDVDecQualityEnum   : Read / Write

Decoding quality.

Default value: Highest quality colour decoding

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html0000644000175000017500000000625611720565335025565 00000000000000 smpte

smpte

smpte — Apply the standard SMPTE transitions on video images

Plugin Information

filename

libgstsmpte.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

smpte

Apply the standard SMPTE transitions on video images

smptealpha

Apply the standard SMPTE transitions as alpha on video images
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html0000644000175000017500000000564511720565335025545 00000000000000 level

level

level — Audio level plugin

Plugin Information

filename

libgstlevel.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

level

RMS/Peak/Decaying Peak Level messager for audio/raw
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html0000644000175000017500000000650411720565335026257 00000000000000 ossaudio

ossaudio

ossaudio — OSS (Open Sound System) support for GStreamer

Plugin Information

filename

libgstossaudio.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

ossmixer

Control sound input and output levels with OSS

osssink

Output to a sound card via OSS

osssrc

Capture from a sound card via OSS
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-pulsesink.html0000644000175000017500000003212111720565335025144 00000000000000 pulsesink

pulsesink

pulsesink — Plays audio to a PulseAudio server

Synopsis

struct              GstPulseSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstBaseAudioSink
                           +----GstPulseSink

Implemented Interfaces

GstPulseSink implements GstStreamVolume, GstImplementsInterface and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "server"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read
  "volume"                   gdouble               : Read / Write
  "mute"                     gboolean              : Read / Write
  "client"                   gchar*                : Read / Write
  "stream-properties"        GstStructure*         : Read / Write

Description

Synopsis

Element Information

plugin

pulseaudio

author

Lennart Poettering

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)24, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)24, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-ac3, framed=(boolean)true

audio/x-eac3, framed=(boolean)true

audio/x-dts, framed=(boolean)true, block-size=(int){ 512, 1024, 2048 }

audio/mpeg, mpegversion=(int)1, mpegaudioversion=(int)[ 1, 2 ], parsed=(boolean)true

Details

struct GstPulseSink

struct GstPulseSink;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

The PulseAudio sink device to connect to.

Default value: NULL


The "server" property

  "server"                   gchar*                : Read / Write

The PulseAudio server to connect to.

Default value: NULL


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL


The "volume" property

  "volume"                   gdouble               : Read / Write

Linear volume of this stream, 1.0=100%.

Allowed values: [0,10]

Default value: 1


The "mute" property

  "mute"                     gboolean              : Read / Write

Mute state of this stream.

Default value: FALSE


The "client" property

  "client"                   gchar*                : Read / Write

The PulseAudio client name to use.

Default value: "lt-gst-plugins-good-plugins-scan"


The "stream-properties" property

  "stream-properties"        GstStructure*         : Read / Write

list of pulseaudio stream properties.

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-amrparse.html0000644000175000017500000001502611720565335024746 00000000000000 amrparse

amrparse

amrparse — AMR parser

Synopsis

struct              GstAmrParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseParse
                     +----GstAmrParse

Description

This is an AMR parser capable of handling both narrow-band and wideband formats.

Example launch line

1
gst-launch filesrc location=abc.amr ! amrparse ! amrdec ! audioresample ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audioparsers

author

Ronald Bultje <rbultje@ronald.bitfreak.net>

class

Codec/Parser/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-amr-nb-sh

audio/x-amr-wb-sh

name

src

direction

source

presence

always

details

audio/AMR, rate=(int)8000, channels=(int)1

audio/AMR-WB, rate=(int)16000, channels=(int)1

Details

struct GstAmrParse

struct GstAmrParse;

The opaque GstAacParse data structure.

See Also

GstAmrnbDec, GstAmrnbEnc
gst-plugins-good-0.10.31/docs/plugins/html/style.css0000644000175000017500000001210011720565335017227 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } gst-plugins-good-0.10.31/docs/plugins/html/GstVideoMixerPad.html0000644000175000017500000001457611720565335021444 00000000000000 GstVideoMixerPad

GstVideoMixerPad

GstVideoMixerPad

Synopsis

struct              GstVideoMixerPad;

Object Hierarchy

  GObject
   +----GstObject
         +----GstPad
               +----GstVideoMixerPad

Properties

  "alpha"                    gdouble               : Read / Write
  "xpos"                     gint                  : Read / Write
  "ypos"                     gint                  : Read / Write
  "zorder"                   guint                 : Read / Write

Description

Details

struct GstVideoMixerPad

struct GstVideoMixerPad;

Property Details

The "alpha" property

  "alpha"                    gdouble               : Read / Write

Alpha of the picture.

Allowed values: [0,1]

Default value: 1


The "xpos" property

  "xpos"                     gint                  : Read / Write

X Position of the picture.

Default value: 0


The "ypos" property

  "ypos"                     gint                  : Read / Write

Y Position of the picture.

Default value: 0


The "zorder" property

  "zorder"                   guint                 : Read / Write

Z Order of the picture.

Allowed values: <= 10000

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cairotimeoverlay.html0000644000175000017500000001326111720565335026511 00000000000000 cairotimeoverlay

cairotimeoverlay

cairotimeoverlay — Overlays the time on a video stream

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstCairoTimeOverlay

Description

Synopsis

Element Information

plugin

cairo

author

David Schleef <ds@schleef.org>

class

Filter/Editor/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

GstCairoTimeOverlay

typedef struct _GstCairoTimeOverlay GstCairoTimeOverlay;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html0000644000175000017500000000626011720565335025041 00000000000000 dv

dv

dv — DV demuxer and decoder based on libdv (libdv.sf.net)

Plugin Information

filename

libgstdv.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

dvdec

Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)

dvdemux

Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-ac3parse.html0000644000175000017500000001523211720565335024634 00000000000000 ac3parse

ac3parse

ac3parse — AC3 parser

Synopsis

struct              GstAc3Parse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseParse
                     +----GstAc3Parse

Description

This is an AC3 parser.

Example launch line

1
gst-launch filesrc location=abc.ac3 ! ac3parse ! a52dec ! audioresample ! audioconvert ! autoaudiosink

Synopsis

Element Information

plugin

audioparsers

author

Tim-Philipp Müller <tim centricular net>

class

Codec/Parser/Converter/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-ac3

audio/x-eac3

audio/ac3

name

src

direction

source

presence

always

details

audio/x-ac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }

audio/x-eac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }

Details

struct GstAc3Parse

struct GstAc3Parse;

The opaque GstAc3Parse object

See Also

GstAmrParse, GstAACParse
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cairotextoverlay.html0000644000175000017500000003313511720565335026541 00000000000000 cairotextoverlay

cairotextoverlay

cairotextoverlay — Adds text strings on top of a video buffer

Synopsis

struct              GstCairoTextOverlay;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstCairoTextOverlay

Properties

  "deltax"                   gint                  : Write
  "deltay"                   gint                  : Write
  "font-desc"                gchar*                : Write
  "halign"                   gchar*                : Write
  "shaded-background"        gboolean              : Write
  "text"                     gchar*                : Write
  "valign"                   gchar*                : Write
  "xpad"                     gint                  : Write
  "ypad"                     gint                  : Write
  "silent"                   gboolean              : Write

Description

Synopsis

Element Information

plugin

cairo

author

David Schleef <ds@schleef.org>

class

Filter/Editor/Video

Element Pads

name

text_sink

direction

sink

presence

always

details

text/plain

name

video_sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstCairoTextOverlay

struct GstCairoTextOverlay;

Property Details

The "deltax" property

  "deltax"                   gint                  : Write

Shift X position to the left or to the right. Unit is pixels.

Default value: 0


The "deltay" property

  "deltay"                   gint                  : Write

Shift Y position up or down. Unit is pixels.

Default value: 0


The "font-desc" property

  "font-desc"                gchar*                : Write

Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax.

Default value: ""


The "halign" property

  "halign"                   gchar*                : Write

Horizontal alignment of the text. Can be either 'left', 'right', or 'center'.

Default value: "center"


The "shaded-background" property

  "shaded-background"        gboolean              : Write

Whether to shade the background under the text area.

Default value: FALSE


The "text" property

  "text"                     gchar*                : Write

Text to be display.

Default value: ""


The "valign" property

  "valign"                   gchar*                : Write

Vertical alignment of the text. Can be either 'baseline', 'bottom', or 'top'.

Default value: "baseline"


The "xpad" property

  "xpad"                     gint                  : Write

Horizontal paddding when using left/right alignment.

Default value: 25


The "ypad" property

  "ypad"                     gint                  : Write

Vertical padding when using top/bottom alignment.

Default value: 25


The "silent" property

  "silent"                   gboolean              : Write

Whether to render the text string.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/ch03.html0000644000175000017500000000407711720565335017016 00000000000000 gst-plugins-good Base Classes

gst-plugins-good Base Classes

gst-plugins-good-0.10.31/docs/plugins/html/home.png0000644000175000017500000000121611720565335017021 00000000000000PNG  IHDRw=bKGD pHYs  ~tIME1KvIDATxՕkq?rCp ~CnpCAAJ .B-\'G]:ܠC -(8 Ԁ!fDғklbRoyxwpðIJ<of_-@RHf֟t^ښ$Q|pgv;X^^&s(bwwZF9&3඙ ^IRZUE.0Z]]U PYM8HGIekqqҀ! $۬3n e{-/seeeÌXOͷ$8==USQRR'9-s+B^ Cەs+%<7W :2IENDB`gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flacenc.html0000644000175000017500000004450111720565335024527 00000000000000 flacenc

flacenc

flacenc — Encodes audio with the FLAC lossless audio encoder

Synopsis

struct              GstFlacEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAudioEncoder
                     +----GstFlacEnc

Implemented Interfaces

GstFlacEnc implements GstTagSetter and GstPreset.

Properties

  "blocksize"                guint                 : Read / Write / Construct
  "escape-coding"            gboolean              : Read / Write / Construct
  "exhaustive-model-search"  gboolean              : Read / Write / Construct
  "loose-mid-side-stereo"    gboolean              : Read / Write / Construct
  "max-lpc-order"            guint                 : Read / Write / Construct
  "max-residual-partition-order" guint                 : Read / Write / Construct
  "mid-side-stereo"          gboolean              : Read / Write / Construct
  "min-residual-partition-order" guint                 : Read / Write / Construct
  "qlp-coeff-prec-search"    gboolean              : Read / Write / Construct
  "qlp-coeff-precision"      guint                 : Read / Write / Construct
  "quality"                  GstFlacEncQuality     : Read / Write / Construct
  "rice-parameter-search-dist" guint                 : Read / Write / Construct
  "streamable-subset"        gboolean              : Read / Write / Construct
  "padding"                  guint                 : Read / Write / Construct
  "seekpoints"               gint                  : Read / Write / Construct

Description

Synopsis

Element Information

plugin

flac

author

Wim Taymans <wim.taymans@chello.be>

class

Codec/Encoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)8, depth=(int)8, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int){ 12, 16 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int){ 20, 24 }, rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]

name

src

direction

source

presence

always

details

audio/x-flac

Details

struct GstFlacEnc

struct GstFlacEnc;

Property Details

The "blocksize" property

  "blocksize"                guint                 : Read / Write / Construct

Blocksize in samples.

Allowed values: [16,65535]

Default value: 4608


The "escape-coding" property

  "escape-coding"            gboolean              : Read / Write / Construct

search for escape codes in the entropy coding stage for slightly better compression.

Default value: FALSE


The "exhaustive-model-search" property

  "exhaustive-model-search"  gboolean              : Read / Write / Construct

do exhaustive search of LP coefficient quantization (expensive!).

Default value: FALSE


The "loose-mid-side-stereo" property

  "loose-mid-side-stereo"    gboolean              : Read / Write / Construct

Loose mid side stereo.

Default value: FALSE


The "max-lpc-order" property

  "max-lpc-order"            guint                 : Read / Write / Construct

Max LPC order; 0 => use only fixed predictors.

Allowed values: <= 32

Default value: 8


The "max-residual-partition-order" property

  "max-residual-partition-order" guint                 : Read / Write / Construct

Max residual partition order (above 4 doesn't usually help much).

Allowed values: <= 16

Default value: 3


The "mid-side-stereo" property

  "mid-side-stereo"          gboolean              : Read / Write / Construct

Do mid side stereo (only for stereo input).

Default value: TRUE


The "min-residual-partition-order" property

  "min-residual-partition-order" guint                 : Read / Write / Construct

Min residual partition order (above 4 doesn't usually help much).

Allowed values: <= 16

Default value: 3


The "qlp-coeff-prec-search" property

  "qlp-coeff-prec-search"    gboolean              : Read / Write / Construct

false = use qlp_coeff_precision, true = search around qlp_coeff_precision, take best.

Default value: FALSE


The "qlp-coeff-precision" property

  "qlp-coeff-precision"      guint                 : Read / Write / Construct

Precision in bits of quantized linear-predictor coefficients; 0 = automatic.

Allowed values: <= 32

Default value: 0


The "quality" property

  "quality"                  GstFlacEncQuality     : Read / Write / Construct

Speed versus compression tradeoff.

Default value: 5 - Default


The "rice-parameter-search-dist" property

  "rice-parameter-search-dist" guint                 : Read / Write / Construct

0 = try only calc'd parameter k; else try all [k-dist..k+dist] parameters, use best.

Allowed values: <= 15

Default value: 0


The "streamable-subset" property

  "streamable-subset"        gboolean              : Read / Write / Construct

true to limit encoder to generating a Subset stream, else false.

Default value: TRUE


The "padding" property

  "padding"                  guint                 : Read / Write / Construct

Write a PADDING block with this length in bytes.

Default value: 0


The "seekpoints" property

  "seekpoints"               gint                  : Read / Write / Construct

Add SEEKTABLE metadata (if > 0, number of entries, if < 0, interval in sec).

Allowed values: >= -2147483647

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-udpsink.html0000644000175000017500000001761211720565335024614 00000000000000 udpsink

udpsink

udpsink — Send data over the network via UDP

Synopsis

struct              GstUDPSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstMultiUDPSink
                           +----GstUDPSink

Implemented Interfaces

GstUDPSink implements GstURIHandler.

Properties

  "host"                     gchar*                : Read / Write
  "port"                     gint                  : Read / Write

Description

udpsink is a network sink that sends UDP packets to the network. It can be combined with RTP payloaders to implement RTP streaming.

Examples

1
gst-launch -v audiotestsrc ! udpsink

Synopsis

Element Information

plugin

udp

author

Wim Taymans <wim@fluendo.com>

class

Sink/Network

Element Pads

name

sink

direction

sink

presence

always

details

ANY

Details

struct GstUDPSink

struct GstUDPSink;

Property Details

The "host" property

  "host"                     gchar*                : Read / Write

The host/IP/Multicast group to send the packets to.

Default value: "localhost"


The "port" property

  "port"                     gint                  : Read / Write

The port to send the packets to.

Allowed values: [0,65535]

Default value: 4951

See Also

udpsrc, multifdsink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-wavparse.html0000644000175000017500000002512011720565335024760 00000000000000 wavparse

wavparse

wavparse — Parse a .wav file into raw audio

Synopsis

struct              GstWavParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstWavParse

Description

Parse a .wav file into raw or compressed audio.

Wavparse supports both push and pull mode operations, making it possible to stream from a network source.

Example launch line

1
gst-launch filesrc location=sine.wav ! wavparse ! audioconvert ! alsasink
Read a wav file and output to the soundcard using the ALSA element. The wav file is assumed to contain raw uncompressed samples.
1
gst-launch gnomevfssrc location=http://www.example.org/sine.wav ! queue ! wavparse ! audioconvert ! alsasink
Stream data from a network url.

Last reviewed on 2007-02-14 (0.10.6)

Synopsis

Element Information

plugin

wavparse

author

Erik Walthinsen <omega@cse.ogi.edu>

class

Codec/Demuxer/Audio

Element Pads

name

wavparse_sink

direction

sink

presence

always

details

audio/x-wav

name

wavparse_src

direction

source

presence

sometimes

details

audio/ms-gsm, rate=(int)[ 1, 96000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)3, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]

audio/mpeg, mpegversion=(int)1, layer=(int)2, rate=(int)[ 16000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-vorbis, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ]

audio/x-dts

audio/mpeg, mpegversion=(int)4, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 8 ]

audio/x-alaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]

audio/x-wms, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ], block_align=(int)[ 1, 2147483647 ]

audio/x-truespeech, rate=(int)8000, channels=(int)[ 1, 2 ]

audio/x-wma, wmaversion=(int)1, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)2, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-wma, wmaversion=(int)3, bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 6 ], block_align=(int)[ 1, 2147483647 ]

audio/x-vnd.sony.atrac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-raw-float, endianness=(int)1234, width=(int){ 32, 64 }, rate=(int)[ 1000, 192000 ], channels=(int)[ 1, 8 ]

audio/x-voxware, voxwaretype=(int)117, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk4, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dk3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string)dvi, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]

audio/AMR, rate=(int)8000, channels=(int)1

audio/AMR-WB, rate=(int)16000, channels=(int)1

audio/x-siren

application/x-ogg-avi

Details

struct GstWavParse

struct GstWavParse;

Opaque data structure.

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html0000644000175000017500000000576611720565335026164 00000000000000 id3demux

id3demux

id3demux — Demux ID3v1 and ID3v2 tags from a file

Plugin Information

filename

libgstid3demux.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

id3demux

Read and output ID3v1 and ID3v2 tags while demuxing the contents
gst-plugins-good-0.10.31/docs/plugins/html/GstVideoMixer2Pad.html0000644000175000017500000000646411720565335021523 00000000000000 GstVideoMixer2Pad

GstVideoMixer2Pad

GstVideoMixer2Pad

Synopsis

struct              GstVideoMixer2Pad;

Object Hierarchy

  GObject
   +----GstObject
         +----GstPad
               +----GstVideoMixer2Pad

Description

Details

struct GstVideoMixer2Pad

struct GstVideoMixer2Pad;

The opaque GstVideoMixer2Pad structure.

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-id3demux.html0000644000175000017500000002010611720565335024651 00000000000000 id3demux

id3demux

id3demux — Read and output ID3v1 and ID3v2 tags while demuxing the contents

Synopsis

struct              GstID3Demux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstTagDemux
                     +----GstID3Demux

Properties

  "prefer-v1"                gboolean              : Read / Write / Construct

Description

id3demux accepts data streams with either (or both) ID3v2 regions at the start, or ID3v1 at the end. The mime type of the data between the tag blocks is detected using typefind functions, and the appropriate output mime type set on outgoing buffers.

The element is only able to read ID3v1 tags from a seekable stream, because they are at the end of the stream. That is, when get_range mode is supported by the upstream elements. If get_range operation is available, id3demux makes it available downstream. This means that elements which require get_range mode, such as wavparse, can operate on files containing ID3 tag information.

This id3demux element replaced an older element with the same name which relied on libid3tag from the MAD project.

Example launch line

1
gst-launch filesrc location=file.mp3 ! id3demux ! fakesink -t
This pipeline should read any available ID3 tag information and output it. The contents of the file inside the ID3 tag regions should be detected, and the appropriate mime type set on buffers produced from id3demux.

Synopsis

Element Information

plugin

id3demux

author

Jan Schmidt <thaytan@mad.scientist.com>

class

Codec/Demuxer/Metadata

Element Pads

name

sink

direction

sink

presence

always

details

application/x-id3

name

src

direction

source

presence

sometimes

details

ANY

Details

struct GstID3Demux

struct GstID3Demux;

Property Details

The "prefer-v1" property

  "prefer-v1"                gboolean              : Read / Write / Construct

Prefer tags from ID3v1 tag at end of file when both ID3v1 and ID3v2 tags are present.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html0000644000175000017500000000630311720565335026420 00000000000000 videocrop

videocrop

videocrop — Crops video into a user-defined region

Plugin Information

filename

libgstvideocrop.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

aspectratiocrop

Crops video into a user-defined aspect-ratio

videocrop

Crops video into a user-defined region
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html0000644000175000017500000000623511720565335025674 00000000000000 taglib

taglib

taglib — Tag writing plug-in based on taglib

Plugin Information

filename

libgsttaglib.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

apev2mux

Adds an APEv2 header to the beginning of files using taglib

id3v2mux

Adds an ID3v2 header to the beginning of MP3 files using taglib
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-directsound.html0000644000175000017500000000570411720565335026755 00000000000000 directsound

directsound

directsound — DirectSound plugin

Plugin Information

filename

libgstdirectsound.dll

version

0.10.4.1

run-time license

LGPL

package

GStreamer Good Plug-ins CVS

origin

Unknown package origin

Elements

directsoundsink

DirectSound audio sink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-dcaparse.html0000644000175000017500000001510611720565335024715 00000000000000 dcaparse

dcaparse

dcaparse — DCA (DTS Coherent Acoustics) parser

Synopsis

struct              GstDcaParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseParse
                     +----GstDcaParse

Description

This is a DCA (DTS Coherent Acoustics) parser.

Example launch line

1
gst-launch filesrc location=abc.dts ! dcaparse ! dtsdec ! audioresample ! audioconvert ! autoaudiosink

Synopsis

Element Information

plugin

audioparsers

author

Tim-Philipp Müller <tim centricular net>

class

Codec/Parser/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-dts

name

src

direction

source

presence

always

details

audio/x-dts, framed=(boolean)true, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 192000 ], depth=(int){ 14, 16 }, endianness=(int){ 1234, 4321 }, block-size=(int)[ 1, 2147483647 ], frame-size=(int)[ 1, 2147483647 ]

Details

struct GstDcaParse

struct GstDcaParse;

The opaque GstDcaParse object

See Also

GstAmrParse, GstAACParse, GstAc3Parse
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-smpte.html0000644000175000017500000002726311720565335024272 00000000000000 smpte

smpte

smpte — Apply the standard SMPTE transitions on video images

Synopsis

struct              GstSMPTE;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstSMPTE

Properties

  "border"                   gint                  : Read / Write
  "depth"                    gint                  : Read / Write
  "fps"                      gfloat                : Read / Write
  "type"                     GstSMPTETransitionType  : Read / Write
  "duration"                 guint64               : Read / Write
  "invert"                   gboolean              : Read / Write

Description

smpte can accept I420 video streams with the same width, height and framerate. The two incomming buffers are blended together using an effect specific alpha mask.

The "depth" property defines the presision in bits of the mask. A higher presision will create a mask with smoother gradients in order to avoid banding.

Sample pipelines

1
gst-launch -v videotestsrc pattern=1 ! smpte name=s border=20000 type=234 duration=2000000000 ! ffmpegcolorspace ! ximagesink videotestsrc ! s.
A pipeline to demonstrate the smpte transition. It shows a pinwheel transition a from a snow videotestsrc to an smpte pattern videotestsrc. The transition will take 2 seconds to complete. The edges of the transition are smoothed with a 20000 big border.

Synopsis

Element Information

plugin

smpte

author

Wim Taymans <wim.taymans@chello.be>

class

Filter/Editor/Video

Element Pads

name

sink1

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

sink2

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstSMPTE

struct GstSMPTE;

Property Details

The "border" property

  "border"                   gint                  : Read / Write

The border width of the transition.

Allowed values: >= 0

Default value: 0


The "depth" property

  "depth"                    gint                  : Read / Write

Depth of the mask in bits.

Allowed values: [1,24]

Default value: 16


The "fps" property

  "fps"                      gfloat                : Read / Write

Frames per second if no input files are given (deprecated).

Allowed values: >= 0

Default value: 0


The "type" property

  "type"                     GstSMPTETransitionType  : Read / Write

The type of transition to use.

Default value: A bar moves from left to right


The "duration" property

  "duration"                 guint64               : Read / Write

Duration of the transition effect in nanoseconds.

Default value: 1000000000


The "invert" property

  "invert"                   gboolean              : Read / Write

Invert transition mask.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-multiudpsink.html0000644000175000017500000007160211720565335025666 00000000000000 multiudpsink

multiudpsink

multiudpsink — Send data over the network via UDP

Synopsis

struct              GstMultiUDPSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstMultiUDPSink
                           +----GstUDPSink

Properties

  "bytes-served"             guint64               : Read
  "bytes-to-serve"           guint64               : Read
  "clients"                  gchar*                : Read / Write
  "closefd"                  gboolean              : Read / Write
  "sock"                     gint                  : Read
  "sockfd"                   gint                  : Read / Write
  "auto-multicast"           gboolean              : Read / Write
  "loop"                     gboolean              : Read / Write
  "qos-dscp"                 gint                  : Read / Write
  "ttl"                      gint                  : Read / Write
  "ttl-mc"                   gint                  : Read / Write
  "send-duplicates"          gboolean              : Read / Write
  "buffer-size"              gint                  : Read / Write

Description

multiudpsink is a network sink that sends UDP packets to multiple clients. It can be combined with rtp payload encoders to implement RTP streaming.

Synopsis

Element Information

plugin

udp

author

Wim Taymans <wim.taymans@gmail.com>

class

Sink/Network

Element Pads

name

sink

direction

sink

presence

always

details

ANY

Details

struct GstMultiUDPSink

struct GstMultiUDPSink;

Property Details

The "bytes-served" property

  "bytes-served"             guint64               : Read

Total number of bytes sent to all clients.

Default value: 0


The "bytes-to-serve" property

  "bytes-to-serve"           guint64               : Read

Number of bytes received to serve to clients.

Default value: 0


The "clients" property

  "clients"                  gchar*                : Read / Write

A comma separated list of host:port pairs with destinations.

Default value: NULL


The "closefd" property

  "closefd"                  gboolean              : Read / Write

Close sockfd if passed as property on state change.

Default value: TRUE


The "sock" property

  "sock"                     gint                  : Read

Socket currently in use for UDP sending. (-1 == no socket).

Allowed values: >= G_MAXULONG

Default value: -1


The "sockfd" property

  "sockfd"                   gint                  : Read / Write

Socket to use for UDP sending. (-1 == allocate).

Allowed values: >= G_MAXULONG

Default value: -1


The "auto-multicast" property

  "auto-multicast"           gboolean              : Read / Write

Automatically join/leave the multicast groups, FALSE means user has to do it himself.

Default value: TRUE


The "loop" property

  "loop"                     gboolean              : Read / Write

Used for setting the multicast loop parameter. TRUE = enable, FALSE = disable.

Default value: TRUE


The "qos-dscp" property

  "qos-dscp"                 gint                  : Read / Write

Quality of Service, differentiated services code point (-1 default).

Allowed values: [G_MAXULONG,63]

Default value: -1


The "ttl" property

  "ttl"                      gint                  : Read / Write

Used for setting the unicast TTL parameter.

Allowed values: [0,255]

Default value: 64


The "ttl-mc" property

  "ttl-mc"                   gint                  : Read / Write

Used for setting the multicast TTL parameter.

Allowed values: [0,255]

Default value: 1


The "send-duplicates" property

  "send-duplicates"          gboolean              : Read / Write

When a distination/port pair is added multiple times, send packets multiple times as well.

Default value: TRUE


The "buffer-size" property

  "buffer-size"              gint                  : Read / Write

Size of the kernel send buffer in bytes, 0=default.

Allowed values: >= 0

Default value: 0

Signal Details

The "add" signal

void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
                                                        gchar           *host,
                                                        gint             port,
                                                        gpointer         user_data)            : Action

Add a client with destination host and port to the list of clients. When the same host/port pair is added multiple times, the send-duplicates property defines if the packets are sent multiple times to the same host/port pair or not.

When a host/port pair is added multiple times, an equal amount of remove calls must be performed to actually remove the host/port pair from the list of destinations.

gstmultiudpsink :

the sink on which the signal is emitted

host :

the hostname/IP address of the client to add

port :

the port of the client to add

user_data :

user data set when the signal handler was connected.

The "clear" signal

void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
                                                        gpointer         user_data)            : Action

Clear the list of clients.

gstmultiudpsink :

the sink on which the signal is emitted

user_data :

user data set when the signal handler was connected.

The "client-added" signal

void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
                                                        gchar           *host,
                                                        gint             port,
                                                        gpointer         user_data)            : Run Last

Signal emited when a new client is added to the list of clients.

gstmultiudpsink :

the sink emitting the signal

host :

the hostname/IP address of the added client

port :

the port of the added client

user_data :

user data set when the signal handler was connected.

The "client-removed" signal

void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
                                                        gchar           *host,
                                                        gint             port,
                                                        gpointer         user_data)            : Run Last

Signal emited when a client is removed from the list of clients.

gstmultiudpsink :

the sink emitting the signal

host :

the hostname/IP address of the removed client

port :

the port of the removed client

user_data :

user data set when the signal handler was connected.

The "get-stats" signal

GValueArray*        user_function                      (GstMultiUDPSink *gstmultiudpsink,
                                                        gchar           *host,
                                                        gint             port,
                                                        gpointer         user_data)            : Action

Get the statistics of the client with destination host and port.

gstmultiudpsink :

the sink on which the signal is emitted

host :

the hostname/IP address of the client to get stats on

port :

the port of the client to get stats on

user_data :

user data set when the signal handler was connected.

Returns :

a GValueArray of uint64: bytes_sent, packets_sent, connect_time (in epoch seconds), disconnect_time (in epoch seconds)

The "remove" signal

void                user_function                      (GstMultiUDPSink *gstmultiudpsink,
                                                        gchar           *host,
                                                        gint             port,
                                                        gpointer         user_data)            : Action

Remove the client with destination host and port from the list of clients.

gstmultiudpsink :

the sink on which the signal is emitted

host :

the hostname/IP address of the client to remove

port :

the port of the client to remove

user_data :

user data set when the signal handler was connected.

See Also

udpsink, multifdsink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html0000644000175000017500000000573411720565335026714 00000000000000 deinterlace

deinterlace

deinterlace — Deinterlacer

Plugin Information

filename

libgstdeinterlace.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

deinterlace

Deinterlace Methods ported from DScaler/TvTime
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-deinterleave.html0000644000175000017500000002512111720565335025600 00000000000000 deinterleave

deinterleave

deinterleave — Splits one interleaved multichannel audio stream into many mono audio streams

Synopsis

struct              GstDeinterleave;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstDeinterleave

Properties

  "keep-positions"           gboolean              : Read / Write

Description

Splits one interleaved multichannel audio stream into many mono audio streams.

This element handles all raw audio formats and supports changing the input caps as long as all downstream elements can handle the new caps and the number of channels and the channel positions stay the same. This restriction will be removed in later versions by adding or removing some source pads as required.

In most cases a queue and an audioconvert element should be added after each source pad before further processing of the audio data.

Example launch line

1
gst-launch filesrc location=/path/to/file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2 ! deinterleave name=d  d.src0 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel1.ogg  d.src1 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel2.ogg
Decodes an MP3 file and encodes the left and right channel into separate Ogg Vorbis files.
1
gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d  interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav    d.src0 ! queue ! audioconvert ! i.sink1    d.src1 ! queue ! audioconvert ! i.sink0
Decodes and deinterleaves a Stereo MP3 file into separate channels and then interleaves the channels again to a WAV file with the channel with the channels exchanged.

Synopsis

Element Information

plugin

interleave

author

Andy Wingo <wingo at pobox.com>, Iain <iain@prettypeople.org>, Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Converter/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }

name

src%d

direction

source

presence

sometimes

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }

Details

struct GstDeinterleave

struct GstDeinterleave;

Property Details

The "keep-positions" property

  "keep-positions"           gboolean              : Read / Write

Keep positions: When enable the caps on the output buffers will contain the original channel positions. This can be used to correctly interleave the output again later but can also lead to unwanted effects if the output should be handled as Mono.

Default value: FALSE

See Also

interleave
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiocheblimit.html0000644000175000017500000003203211720565335026112 00000000000000 audiocheblimit

audiocheblimit

audiocheblimit — Chebyshev low pass and high pass filter

Synopsis

struct              GstAudioChebLimit;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioFXBaseIIRFilter
                                 +----GstAudioChebLimit

Properties

  "cutoff"                   gfloat                : Read / Write
  "mode"                     GstAudioChebLimitMode  : Read / Write
  "poles"                    gint                  : Read / Write
  "ripple"                   gfloat                : Read / Write
  "type"                     gint                  : Read / Write

Description

Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the cutoff frequency (high-pass). The number of poles and the ripple parameter control the rolloff.

This element has the advantage over the windowed sinc lowpass and highpass filter that it is much faster and produces almost as good results. It's only disadvantages are the highly non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel.

For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. some frequencies in the passband will be amplified by that value. A higher ripple value will allow a faster rolloff.

For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will be at most this value. A lower ripple value will allow a faster rolloff.

As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter.

Note

Be warned that a too large number of poles can produce noise. The most poles are possible with a cutoff frequency at a quarter of the sampling rate.

Example launch line

1
2
3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiocheblimit mode=low-pass cutoff=1000 poles=4 ! audioconvert ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiocheblimit mode=high-pass cutoff=400 ripple=0.2 ! audioconvert ! alsasink
gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiocheblimit mode=low-pass cutoff=800 type=2 ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioChebLimit

struct GstAudioChebLimit;

Property Details

The "cutoff" property

  "cutoff"                   gfloat                : Read / Write

Cut off frequency (Hz).

Allowed values: [0,100000]

Default value: 0


The "mode" property

  "mode"                     GstAudioChebLimitMode  : Read / Write

Low pass or high pass mode.

Default value: Low pass (default)


The "poles" property

  "poles"                    gint                  : Read / Write

Number of poles to use, will be rounded up to the next even number.

Allowed values: [2,32]

Default value: 4


The "ripple" property

  "ripple"                   gfloat                : Read / Write

Amount of ripple (dB).

Allowed values: [0,200]

Default value: 0.25


The "type" property

  "type"                     gint                  : Read / Write

Type of the chebychev filter.

Allowed values: [1,2]

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cairooverlay.html0000644000175000017500000002362311720565335025635 00000000000000 cairooverlay

cairooverlay

cairooverlay — Render overlay on a video stream using Cairo

Synopsis

struct              GstCairoOverlay;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstCairoOverlay

Signals

  "caps-changed"                                   
  "draw"                                           

Description

Synopsis

Element Information

plugin

cairo

author

Jon Nordby <jononor@gmail.com>

class

Filter/Editor/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstCairoOverlay

struct GstCairoOverlay;

Signal Details

The "caps-changed" signal

void                user_function                      (GstCairoOverlay *gstcairooverlay,
                                                        GstCaps         *arg1,
                                                        gpointer         user_data)

gstcairooverlay :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "draw" signal

void                user_function                      (GstCairoOverlay *gstcairooverlay,
                                                        CairoContext    *arg1,
                                                        guint64          arg2,
                                                        guint64          arg3,
                                                        gpointer         user_data)

gstcairooverlay :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-ismlmux.html0000644000175000017500000002135011720565335024627 00000000000000 ismlmux

ismlmux

ismlmux — Muxer for ISML smooth streaming (.isml) files

Synopsis


Description

This element merges streams (audio and video) into MJ2 (.mj2) files.

The following background intends to explain why various similar muxers are present in this plugin.

The QuickTime file format specification served as basis for the MP4 file format specification (mp4mux), and as such the QuickTime file structure is nearly identical to the so-called ISO Base Media file format defined in ISO 14496-12 (except for some media specific parts). In turn, the latter ISO Base Media format was further specialized as a Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) and in various 3GPP(2) specs (gppmux). The fragmented file features defined (only) in ISO Base Media are used by ISMV files making up (a.o.) Smooth Streaming (ismlmux).

A few properties (movie-timescale, trak-timescale) allow adjusting some technical parameters, which might be useful in (rare) cases to resolve compatibility issues in some situations.

Some other properties influence the result more fundamentally. A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, somewhat contrary to this usually being called "the header". However, a faststart file will (with some effort) arrange this to be located near start of the file, which then allows it e.g. to be played while downloading. Alternatively, rather than having one chunk of metadata at start (or end), there can be some metadata at start and most of the other data can be spread out into fragments of fragment-duration. If such fragmented layout is intended for streaming purposes, then streamable allows foregoing to add index metadata (at the end of file).

dts-method allows selecting a method for managing input timestamps (stay tuned for 0.11 to have this automagically settled). The default delta/duration method should handle nice (aka perfect streams) just fine, but may experience problems otherwise (e.g. input stream with re-ordered B-frames and/or with frame dropping). The re-ordering approach re-assigns incoming timestamps in ascending order to incoming buffers and offers an alternative in such cases. In cases where that might fail, the remaining method can be tried, which is exact and according to specs, but might experience playback on not so spec-wise players. Note that this latter approach also requires one to enable presentation-timestamp.

Example pipelines

1
gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2
Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 and muxes it into an mj2 file.

Documentation last reviewed on 2011-04-21

Synopsis

Element Information

plugin

isomp4

author

Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int)[ 1, 2 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, channels=(int)[ 1, 8 ], rate=(int)[ 1, 2147483647 ]

name

video_%d

direction

sink

presence

request

details

video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, divxversion=(int)5, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/quicktime, variant=(string)iso-fragmented

Details

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-oss4src.html0000644000175000017500000002224511720565335024535 00000000000000 oss4src

oss4src

oss4src — Capture from a sound card via OSS version 4

Synopsis

struct              GstOss4Source;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstBaseAudioSrc
                                 +----GstAudioSrc
                                       +----GstOss4Source

Implemented Interfaces

GstOss4Source implements GstImplementsInterface, GstMixer and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read

Description

Synopsis

Element Information

plugin

oss4

author

Tim-Philipp Müller <tim centricular net>

class

Source/Audio

Element Pads

name

src

direction

source

presence

always

details

audio/x-alaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-mulaw, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)32, depth=(int){ 32, 24 }, signed=(boolean)true, endianness=(int)4321, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int){ 32, 24 }, depth=(int)24, signed=(boolean)true, endianness=(int)1234, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 1, 192000 ], channels=(int)[ 1, 4096 ]

Details

struct GstOss4Source

struct GstOss4Source;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available device).

Default value: NULL


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html0000644000175000017500000000602511720565335026553 00000000000000 alphacolor

alphacolor

alphacolor — RGBA from/to AYUV colorspace conversion preserving the alpha channel

Plugin Information

filename

libgstalphacolor.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

alphacolor

ARGB from/to AYUV colorspace conversion preserving the alpha channel
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cutter.html0000644000175000017500000002522311720565335024442 00000000000000 cutter

cutter

cutter — Audio Cutter to split audio into non-silent bits

Synopsis

struct              GstCutter;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstCutter

Properties

  "leaky"                    gboolean              : Read / Write
  "pre-length"               guint64               : Read / Write
  "run-length"               guint64               : Read / Write
  "threshold"                gdouble               : Read / Write
  "threshold-dB"             gdouble               : Read / Write

Description

Analyses the audio signal for periods of silence. The start and end of silence is signalled by bus messages named "cutter". The message's structure contains two fields:

  • GstClockTime "timestamp": the timestamp of the buffer that triggered the message.

  • gboolean "above": TRUE for begin of silence and FALSE for end of silence.

Example launch line

1
gst-launch -m filesrc location=foo.ogg ! decodebin ! audioconvert ! cutter ! autoaudiosink
Show cut messages.

Synopsis

Element Information

plugin

cutter

author

Thomas Vander Stichele <thomas at apestaart dot org>

class

Filter/Editor/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true

Details

struct GstCutter

struct GstCutter;

Property Details

The "leaky" property

  "leaky"                    gboolean              : Read / Write

do we leak buffers when below threshold ?.

Default value: FALSE


The "pre-length" property

  "pre-length"               guint64               : Read / Write

Length of pre-recording buffer (in nanoseconds).

Default value: 0


The "run-length" property

  "run-length"               guint64               : Read / Write

Length of drop below threshold before cut_stop (in nanoseconds).

Default value: 0


The "threshold" property

  "threshold"                gdouble               : Read / Write

Volume threshold before trigger.

Default value: 0


The "threshold-dB" property

  "threshold-dB"             gdouble               : Read / Write

Volume threshold before trigger (in dB).

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gstrtpbin.html0000644000175000017500000016256111720565335025157 00000000000000 gstrtpbin

gstrtpbin

gstrtpbin — Real-Time Transport Protocol bin

Synopsis

struct              GstRtpBin;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstRtpBin

Implemented Interfaces

GstRtpBin implements GstChildProxy.

Properties

  "do-lost"                  gboolean              : Read / Write
  "latency"                  guint                 : Read / Write
  "sdes"                     GstStructure*         : Read / Write
  "ignore-pt"                gboolean              : Read / Write
  "autoremove"               gboolean              : Read / Write
  "buffer-mode"              RTPJitterBufferMode   : Read / Write
  "ntp-sync"                 gboolean              : Read / Write
  "use-pipeline-clock"       gboolean              : Read / Write
  "rtcp-sync"                GstRTCPSync           : Read / Write
  "rtcp-sync-interval"       guint                 : Read / Write

Description

RTP bin combines the functions of GstRtpSession, GstRtpSsrcDemux, GstRtpJitterBuffer and GstRtpPtDemux in one element. It allows for multiple RTP sessions that will be synchronized together using RTCP SR packets.

GstRtpBin is configured with a number of request pads that define the functionality that is activated, similar to the GstRtpSession element.

To use GstRtpBin as an RTP receiver, request a recv_rtp_sink_%d pad. The session number must be specified in the pad name. Data received on the recv_rtp_sink_%d pad will be processed in the GstRtpSession manager and after being validated forwarded on GstRtpSsrcDemux element. Each RTP stream is demuxed based on the SSRC and send to a GstRtpJitterBuffer. After the packets are released from the jitterbuffer, they will be forwarded to a GstRtpPtDemux element. The GstRtpPtDemux element will demux the packets based on the payload type and will create a unique pad recv_rtp_src_%d_%d_%d on gstrtpbin with the session number, SSRC and payload type respectively as the pad name.

To also use GstRtpBin as an RTCP receiver, request a recv_rtcp_sink_%d pad. The session number must be specified in the pad name.

If you want the session manager to generate and send RTCP packets, request the send_rtcp_src_%d pad with the session number in the pad name. Packet pushed on this pad contain SR/RR RTCP reports that should be sent to all participants in the session.

To use GstRtpBin as a sender, request a send_rtp_sink_%d pad, which will automatically create a send_rtp_src_%d pad. If the session number is not provided, the pad from the lowest available session will be returned. The session manager will modify the SSRC in the RTP packets to its own SSRC and wil forward the packets on the send_rtp_src_%d pad after updating its internal state.

The session manager needs the clock-rate of the payload types it is handling and will signal the "request-pt-map" signal when it needs such a mapping. One can clear the cached values with the "clear-pt-map" signal.

Access to the internal statistics of gstrtpbin is provided with the get-internal-session property. This action signal gives access to the RTPSession object which further provides action signals to retrieve the internal source and other sources.

Example pipelines

1
2
gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink_0 \
    gstrtpbin ! rtptheoradepay ! theoradec ! xvimagesink
Receive RTP data from port 5000 and send to the session 0 in gstrtpbin.
1
2
3
4
5
6
7
8
9
gst-launch gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        audiotestsrc ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1
Encode and payload H263 video captured from a v4l2src. Encode and payload AMR audio generated from audiotestsrc. The video is sent to session 0 in rtpbin and the audio is sent to session 1. Video packets are sent on UDP port 5000 and audio packets on port 5002. The video RTCP packets for session 0 are sent on port 5001 and the audio RTCP packets for session 0 are sent on port 5003. RTCP packets for session 0 are received on port 5005 and RTCP for session 1 is received on port 5007. Since RTCP packets from the sender should be sent as soon as possible and do not participate in preroll, sync=false and async=false is configured on udpsink
1
2
3
4
5
6
7
8
9
10
11
gst-launch -v gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpamrdepay ! amrnbdec ! alsasink                           \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false
Receive H263 on port 5000, send it through rtpbin in session 0, depayload, decode and display the video. Receive AMR on port 5002, send it through rtpbin in session 1, depayload, decode and play the audio. Receive server RTCP packets for session 0 on port 5001 and RTCP packets for session 1 on port 5003. These packets will be used for session management and synchronisation. Send RTCP reports for session 0 on port 5005 and RTCP reports for session 1 on port 5007.

Last reviewed on 2007-08-30 (0.10.6)

Synopsis

Element Information

plugin

gstrtpmanager

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Network/RTP

Element Pads

name

recv_rtcp_sink_%d

direction

sink

presence

request

details

application/x-rtcp

name

recv_rtp_sink_%d

direction

sink

presence

request

details

application/x-rtp

name

send_rtp_sink_%d

direction

sink

presence

request

details

application/x-rtp

name

recv_rtp_src_%d_%d_%d

direction

source

presence

sometimes

details

application/x-rtp

name

send_rtp_src_%d

direction

source

presence

sometimes

details

application/x-rtp

name

send_rtcp_src_%d

direction

source

presence

request

details

application/x-rtcp

Details

struct GstRtpBin

struct GstRtpBin;

Property Details

The "do-lost" property

  "do-lost"                  gboolean              : Read / Write

Send an event downstream when a packet is lost.

Default value: FALSE


The "latency" property

  "latency"                  guint                 : Read / Write

Default amount of ms to buffer in the jitterbuffers.

Default value: 200


The "sdes" property

  "sdes"                     GstStructure*         : Read / Write

The SDES items of this session.


The "ignore-pt" property

  "ignore-pt"                gboolean              : Read / Write

Do not demultiplex based on PT values.

Default value: FALSE


The "autoremove" property

  "autoremove"               gboolean              : Read / Write

Automatically remove timed out sources.

Default value: FALSE


The "buffer-mode" property

  "buffer-mode"              RTPJitterBufferMode   : Read / Write

Control the buffering algorithm in use.

Default value: Slave receiver to sender clock


The "ntp-sync" property

  "ntp-sync"                 gboolean              : Read / Write

Synchronize received streams to the NTP clock.

Default value: FALSE


The "use-pipeline-clock" property

  "use-pipeline-clock"       gboolean              : Read / Write

Use the pipeline clock to set the NTP time in the RTCP SR messages.

Default value: FALSE


The "rtcp-sync" property

  "rtcp-sync"                GstRTCPSync           : Read / Write

Use of RTCP SR in synchronization.

Default value: always


The "rtcp-sync-interval" property

  "rtcp-sync-interval"       guint                 : Read / Write

RTCP SR interval synchronization (ms) (0 = always).

Default value: 0

Signal Details

The "clear-pt-map" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        gpointer   user_data)      : Action

Clear all previously cached pt-mapping obtained with "request-pt-map".

rtpbin :

the object which received the signal

user_data :

user data set when the signal handler was connected.

The "get-internal-session" signal

RTPSession*         user_function                      (GstRtpBin *rtpbin,
                                                        guint      id,
                                                        gpointer   user_data)      : Action

Request the internal RTPSession object as GObject in session id.

rtpbin :

the object which received the signal

id :

the session id

user_data :

user data set when the signal handler was connected.

The "on-bye-ssrc" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of an SSRC that became inactive because of a BYE packet.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-bye-timeout" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of an SSRC that has timed out because of BYE

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-new-ssrc" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of a new SSRC that entered session.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-npt-stop" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify that SSRC sender has sent data up to the configured NPT stop time.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-sender-timeout" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of a sender SSRC that has timed out and became a receiver

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-active" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of a SSRC that is active, i.e., sending RTCP.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-collision" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify when we have an SSRC collision

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-sdes" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of a SSRC that is active, i.e., sending RTCP.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-validated" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of a new SSRC that became validated.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-timeout" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of an SSRC that has timed out

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "request-pt-map" signal

GstCaps*            user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      pt,
                                                        gpointer   user_data)      : Run Last

Request the payload type as GstCaps for pt in session.

rtpbin :

the object which received the signal

session :

the session

pt :

the pt

user_data :

user data set when the signal handler was connected.

The "reset-sync" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        gpointer   user_data)      : Action

Reset all currently configured lip-sync parameters and require new SR packets for all streams before lip-sync is attempted again.

rtpbin :

the object which received the signal

user_data :

user data set when the signal handler was connected.

The "payload-type-change" signal

void                user_function                      (GstRtpBin *rtpbin,
                                                        guint      session,
                                                        guint      pt,
                                                        gpointer   user_data)      : Run Last

Signal that the current payload type changed to pt in session.

rtpbin :

the object which received the signal

session :

the session

pt :

the pt

user_data :

user data set when the signal handler was connected.

Since 0.10.17

See Also

gstrtpjitterbuffer, gstrtpsession, gstrtpptdemux, gstrtpssrcdemux
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-capssetter.html0000644000175000017500000002212311720565335025305 00000000000000 capssetter

capssetter

capssetter — Set/merge caps on stream

Synopsis

struct              GstCapsSetter;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstCapsSetter

Properties

  "caps"                     GstCaps*              : Read / Write
  "join"                     gboolean              : Read / Write
  "replace"                  gboolean              : Read / Write

Description

Sets or merges caps on a stream's buffers. That is, a buffer's caps are updated using (fields of) caps. Note that this may contain multiple structures (though not likely recommended), but each of these must be fixed (or will otherwise be rejected).

If join is TRUE, then the incoming caps' mime-type is compared to the mime-type(s) of provided caps and only matching structure(s) are considered for updating.

If replace is TRUE, then any caps update is preceded by clearing existing fields, making provided fields (as a whole) replace incoming ones. Otherwise, no clearing is performed, in which case provided fields are added/merged onto incoming caps

Although this element might mainly serve as debug helper, it can also practically be used to correct a faulty pixel-aspect-ratio, or to modify a yuv fourcc value to effectively swap chroma components or such alike.

Synopsis

Element Information

plugin

debug

author

Mark Nauwelaerts <mnauw@users.sourceforge.net>

class

Generic

Element Pads

name

sink

direction

sink

presence

always

details

ANY

name

src

direction

source

presence

always

details

ANY

Details

struct GstCapsSetter

struct GstCapsSetter;

Property Details

The "caps" property

  "caps"                     GstCaps*              : Read / Write

Merge these caps (thereby overwriting) in the stream.


The "join" property

  "join"                     gboolean              : Read / Write

Match incoming caps' mime-type to mime-type of provided caps.

Default value: TRUE


The "replace" property

  "replace"                  gboolean              : Read / Write

Drop fields of incoming caps.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosink.html0000644000175000017500000001376211720565335026144 00000000000000 gconfaudiosink

gconfaudiosink

gconfaudiosink — Audio sink embedding the GConf-settings for audio output

Synopsis

                    GstGConfAudioSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstSwitchSink
                           +----GstGConfAudioSink

Implemented Interfaces

GstGConfAudioSink implements GstChildProxy.

Properties

  "profile"                  GstGConfProfile       : Read / Write

Description

Synopsis

Element Information

plugin

gconfelements

author

Jan Schmidt <thaytan@mad.scientist.com>

class

Sink/Audio

Element Pads

Details

GstGConfAudioSink

typedef struct _GstGConfAudioSink GstGConfAudioSink;

Property Details

The "profile" property

  "profile"                  GstGConfProfile       : Read / Write

Profile.

Default value: Sound Events

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audioamplify.html0000644000175000017500000002531411720565335025620 00000000000000 audioamplify

audioamplify

audioamplify — Amplifies an audio stream by a given factor

Synopsis

struct              GstAudioAmplify;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioAmplify

Properties

  "amplification"            gfloat                : Read / Write
  "clipping-method"          GstAudioPanoramaClippingMethod  : Read / Write

Description

Amplifies an audio stream by a given factor and allows the selection of different clipping modes. The difference between the clipping modes is best evaluated by testing.

Example launch line

1
2
3
gst-launch audiotestsrc wave=saw ! audioamplify amplification=1.5 ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioamplify amplification=1.5 method=wrap-negative ! alsasink
gst-launch audiotestsrc wave=saw ! audioconvert ! audioamplify amplification=1.5 method=wrap-positive ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)8, width=(int)8, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-int, depth=(int)32, width=(int)32, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioAmplify

struct GstAudioAmplify;

Property Details

The "amplification" property

  "amplification"            gfloat                : Read / Write

Factor of amplification.

Default value: 1


The "clipping-method" property

  "clipping-method"          GstAudioPanoramaClippingMethod  : Read / Write

Clipping method: clip mode set values higher than the maximum to the maximum. The wrap-negative mode pushes those values back from the opposite side, wrap-positive pushes them back from the same side.

Default value: Normal clipping (default)

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html0000644000175000017500000000622311720565335025417 00000000000000 rtsp

rtsp

rtsp — transfer data via RTSP

Plugin Information

filename

libgstrtsp.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

rtpdec

Accepts raw RTP and RTCP packets and sends them forward

rtspsrc

Receive data over the network via RTSP (RFC 2326)
gst-plugins-good-0.10.31/docs/plugins/html/index.sgml0000644000175000017500000127414111720565335017370 00000000000000 gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-multifilesink.html0000644000175000017500000003700711720565335026016 00000000000000 multifilesink

multifilesink

multifilesink — Write buffers to a sequentially named set of files

Synopsis

struct              GstMultiFileSink;
enum                GstMultiFileSinkNext;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstMultiFileSink

Properties

  "location"                 gchar*                : Read / Write
  "index"                    gint                  : Read / Write
  "next-file"                GstMultiFileSinkNext  : Read / Write
  "post-messages"            gboolean              : Read / Write
  "max-files"                guint                 : Read / Write
  "max-file-size"            guint64               : Read / Write

Description

Write incoming data to a series of sequentially-named files.

The filename property should contain a string with a %d placeholder that will be substituted with the index for each filename.

If the "post-messages" property is TRUE, it sends an application message named "GstMultiFileSink" after writing each buffer.

The message's structure contains these fields:

  • gchar * "filename": the filename where the buffer was written.

  • gint "index": the index of the buffer.

  • GstClockTime "timestamp": the timestamp of the buffer.

  • GstClockTime "stream-time": the stream time of the buffer.

  • GstClockTime "running-time": the running_time of the buffer.

  • GstClockTime "duration": the duration of the buffer.

  • guint64 "offset": the offset of the buffer that triggered the message.

  • guint64 "offset-end": the offset-end of the buffer that triggered the message.

Example launch line

1
2
gst-launch audiotestsrc ! multifilesink
gst-launch videotestsrc ! multifilesink post-messages=true filename="frame%d"

Last reviewed on 2009-09-11 (0.10.17)

Synopsis

Element Information

plugin

multifile

author

David Schleef <ds@schleef.org>

class

Sink/File

Element Pads

name

sink

direction

sink

presence

always

details

ANY

Details

struct GstMultiFileSink

struct GstMultiFileSink;


enum GstMultiFileSinkNext

typedef enum {
  GST_MULTI_FILE_SINK_NEXT_BUFFER,
  GST_MULTI_FILE_SINK_NEXT_DISCONT,
  GST_MULTI_FILE_SINK_NEXT_KEY_FRAME,
  GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT,
  GST_MULTI_FILE_SINK_NEXT_MAX_SIZE
} GstMultiFileSinkNext;

File splitting modes.

GST_MULTI_FILE_SINK_NEXT_BUFFER

New file for each buffer

GST_MULTI_FILE_SINK_NEXT_DISCONT

New file after each discontinuity

GST_MULTI_FILE_SINK_NEXT_KEY_FRAME

New file at each key frame (Useful for MPEG-TS segmenting)

GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT

New file after a force key unit event (Since: 0.10.31)

GST_MULTI_FILE_SINK_NEXT_MAX_SIZE

New file when the configured maximum file size would be exceeded with the next buffer or buffer list (Since: 0.10.31)

Property Details

The "location" property

  "location"                 gchar*                : Read / Write

Location of the file to write.

Default value: NULL


The "index" property

  "index"                    gint                  : Read / Write

Index to use with location property to create file names. The index is incremented by one for each buffer written.

Allowed values: >= 0

Default value: 0


The "next-file" property

  "next-file"                GstMultiFileSinkNext  : Read / Write

When to start a new file.

Default value: New file for each buffer

Since 0.10.17


The "post-messages" property

  "post-messages"            gboolean              : Read / Write

Post a message on the GstBus for each file.

Default value: FALSE

Since 0.10.17


The "max-files" property

  "max-files"                guint                 : Read / Write

Maximum number of files to keep on disk. Once the maximum is reached, old files start to be deleted to make room for new ones.

Default value: 0

Since 0.10.31


The "max-file-size" property

  "max-file-size"            guint64               : Read / Write

Maximum file size before starting a new file in max-size mode.

Default value: 2147483648

Since 0.10.31

See Also

GstFileSrc
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiokaraoke.html0000644000175000017500000002456211720565335025600 00000000000000 audiokaraoke

audiokaraoke

audiokaraoke — Removes voice from sound

Synopsis

struct              GstAudioKaraoke;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioKaraoke

Properties

  "filter-band"              gfloat                : Read / Write
  "filter-width"             gfloat                : Read / Write
  "level"                    gfloat                : Read / Write
  "mono-level"               gfloat                : Read / Write

Description

Remove the voice from audio by filtering the center channel. This plugin is useful for karaoke applications.

Example launch line

1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audiokaraoke ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioKaraoke

struct GstAudioKaraoke;

Property Details

The "filter-band" property

  "filter-band"              gfloat                : Read / Write

The Frequency band of the filter.

Allowed values: [0,441]

Default value: 220


The "filter-width" property

  "filter-width"             gfloat                : Read / Write

The Frequency width of the filter.

Allowed values: [0,100]

Default value: 100


The "level" property

  "level"                    gfloat                : Read / Write

Level of the effect (1.0 = full).

Allowed values: [0,1]

Default value: 1


The "mono-level" property

  "mono-level"               gfloat                : Read / Write

Level of the mono channel (1.0 = full).

Allowed values: [0,1]

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-qtmoovrecover.html0000644000175000017500000002577311720565335026061 00000000000000 qtmoovrecover

qtmoovrecover

qtmoovrecover — Utility element for recovering unfinished quicktime files

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstPipeline
                           +----GstQTMoovRecover

Implemented Interfaces

GstQTMoovRecover implements GstChildProxy.

Properties

  "broken-input"             gchar*                : Read / Write
  "faststart-mode"           gboolean              : Read / Write
  "fixed-output"             gchar*                : Read / Write
  "recovery-input"           gchar*                : Read / Write

Description

Example pipelines

This element recovers quicktime files created with qtmux using the moov recovery feature.

TODO

Documentation last reviewed on 2011-04-21

Synopsis

Element Information

plugin

isomp4

author

Thiago Santos <thiago.sousa.santos@collabora.co.uk>

class

Util

Element Pads

Details

struct GstQTMoovRecover

struct GstQTMoovRecover;


struct GstQTMoovRecoverClass

struct GstQTMoovRecoverClass {
  GstPipelineClass parent_class;
};


gst_qt_moov_recover_get_type ()

GType               gst_qt_moov_recover_get_type        (void);


gst_qt_moov_recover_register ()

gboolean            gst_qt_moov_recover_register        (GstPlugin *plugin);

Property Details

The "broken-input" property

  "broken-input"             gchar*                : Read / Write

Path to broken input file. (If qtmux was on faststart mode, this file is the faststart file).

Default value: NULL


The "faststart-mode" property

  "faststart-mode"           gboolean              : Read / Write

If the broken input is from faststart mode.

Default value: FALSE


The "fixed-output" property

  "fixed-output"             gchar*                : Read / Write

Path to write the fixed file to (used as output).

Default value: NULL


The "recovery-input" property

  "recovery-input"           gchar*                : Read / Write

Path to recovery file (used as input).

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-alawenc.html0000644000175000017500000001177411720565335024554 00000000000000 alawenc

alawenc

alawenc — Convert 16bit PCM to 8bit A law

Synopsis

struct              GstALawDec;
struct              GstALawEnc;

Description

This element encode alaw audio. Alaw coding is also known as G.711.

Synopsis

Element Information

plugin

alaw

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Encoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

Details

struct GstALawDec

struct GstALawDec;


struct GstALawEnc

struct GstALawEnc {
  GstElement element;

  GstPad *sinkpad,*srcpad;

  gint channels;
  gint rate;
};

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-esdsink.html0000644000175000017500000000563511720565335026075 00000000000000 esdsink

esdsink

esdsink — ESD Element Plugins

Plugin Information

filename

libgstesd.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

esdsink

Plays audio to an esound server
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-udpsrc.html0000644000175000017500000005234711720565335024443 00000000000000 udpsrc

udpsrc

udpsrc — Receive data over the network via UDP

Synopsis

struct              GstUDPSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstUDPSrc

Implemented Interfaces

GstUDPSrc implements GstURIHandler.

Properties

  "caps"                     GstCaps*              : Read / Write
  "multicast-group"          gchar*                : Read / Write
  "port"                     gint                  : Read / Write
  "uri"                      gchar*                : Read / Write
  "sockfd"                   gint                  : Read / Write
  "buffer-size"              gint                  : Read / Write
  "timeout"                  guint64               : Read / Write
  "closefd"                  gboolean              : Read / Write
  "skip-first-bytes"         gint                  : Read / Write
  "sock"                     gint                  : Read
  "auto-multicast"           gboolean              : Read / Write
  "multicast-iface"          gchar*                : Read / Write
  "reuse"                    gboolean              : Read / Write

Description

udpsrc is a network source that reads UDP packets from the network. It can be combined with RTP depayloaders to implement RTP streaming.

The udpsrc element supports automatic port allocation by setting the "port" property to 0. After setting the udpsrc to PAUSED, the allocated port can be obtained by reading the port property.

udpsrc can read from multicast groups by setting the "multicast-group" property to the IP address of the multicast group.

Alternatively one can provide a custom socket to udpsrc with the "sockfd" property, udpsrc will then not allocate a socket itself but use the provided one.

The "caps" property is mainly used to give a type to the UDP packet so that they can be autoplugged in GStreamer pipelines. This is very usefull for RTP implementations where the contents of the UDP packets is transfered out-of-bounds using SDP or other means.

The "buffer-size" property is used to change the default kernel buffersizes used for receiving packets. The buffer size may be increased for high-volume connections, or may be decreased to limit the possible backlog of incoming data. The system places an absolute limit on these values, on Linux, for example, the default buffer size is typically 50K and can be increased to maximally 100K.

The "skip-first-bytes" property is used to strip off an arbitrary number of bytes from the start of the raw udp packet and can be used to strip off proprietary header, for example.

The udpsrc is always a live source. It does however not provide a GstClock, this is left for upstream elements such as an RTP session manager or demuxer (such as an MPEG demuxer). As with all live sources, the captured buffers will have their timestamp set to the current running time of the pipeline.

udpsrc implements a GstURIHandler interface that handles udp://host:port type URIs.

If the "timeout" property is set to a value bigger than 0, udpsrc will generate an element message named "GstUDPSrcTimeout" if no data was recieved in the given timeout. The message's structure contains one field:

  • guint64 "timeout": the timeout in microseconds that expired when waiting for data.

The message is typically used to detect that no UDP arrives in the receiver because it is blocked by a firewall.

A custom file descriptor can be configured with the "sockfd" property. The socket will be closed when setting the element to READY by default. This behaviour can be overriden with the "closefd" property, in which case the application is responsible for closing the file descriptor.

Examples

1
gst-launch -v udpsrc ! fakesink dump=1
A pipeline to read from the default port and dump the udp packets. To actually generate udp packets on the default port one can use the udpsink element. When running the following pipeline in another terminal, the above mentioned pipeline should dump data packets to the console.
1
gst-launch -v audiotestsrc ! udpsink
1
gst-launch -v udpsrc port=0 ! fakesink
read udp packets from a free port.

Last reviewed on 2007-09-20 (0.10.7)

Synopsis

Element Information

plugin

udp

author

Wim Taymans <wim@fluendo.com>, Thijs Vermeir <thijs.vermeir@barco.com>

class

Source/Network

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

struct GstUDPSrc

struct GstUDPSrc;

Property Details

The "caps" property

  "caps"                     GstCaps*              : Read / Write

The caps of the source pad.


The "multicast-group" property

  "multicast-group"          gchar*                : Read / Write

The Address of multicast group to join.

Default value: "0.0.0.0"


The "port" property

  "port"                     gint                  : Read / Write

The port to receive the packets from, 0=allocate.

Allowed values: [0,65535]

Default value: 4951


The "uri" property

  "uri"                      gchar*                : Read / Write

URI in the form of udp://multicast_group:port.

Default value: "udp://0.0.0.0:4951"


The "sockfd" property

  "sockfd"                   gint                  : Read / Write

Socket to use for UDP reception. (-1 == allocate).

Allowed values: >= G_MAXULONG

Default value: -1


The "buffer-size" property

  "buffer-size"              gint                  : Read / Write

Size of the kernel receive buffer in bytes, 0=default.

Allowed values: >= 0

Default value: 0


The "timeout" property

  "timeout"                  guint64               : Read / Write

Post a message after timeout microseconds (0 = disabled).

Default value: 0


The "closefd" property

  "closefd"                  gboolean              : Read / Write

Close sockfd if passed as property on state change.

Default value: TRUE


The "skip-first-bytes" property

  "skip-first-bytes"         gint                  : Read / Write

number of bytes to skip for each udp packet.

Allowed values: >= 0

Default value: 0


The "sock" property

  "sock"                     gint                  : Read

Socket currently in use for UDP reception. (-1 = no socket).

Allowed values: >= G_MAXULONG

Default value: -1


The "auto-multicast" property

  "auto-multicast"           gboolean              : Read / Write

Automatically join/leave multicast groups.

Default value: TRUE


The "multicast-iface" property

  "multicast-iface"          gchar*                : Read / Write

The network interface on which to join the multicast group.

Default value: NULL


The "reuse" property

  "reuse"                    gboolean              : Read / Write

Enable reuse of the port.

Default value: TRUE

See Also

udpsink, multifdsink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-pulsesrc.html0000644000175000017500000003264311720565335025000 00000000000000 pulsesrc

pulsesrc

pulsesrc — Captures audio from a PulseAudio server

Synopsis

struct              GstPulseSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstBaseAudioSrc
                                 +----GstAudioSrc
                                       +----GstPulseSrc

Implemented Interfaces

GstPulseSrc implements GstStreamVolume, GstImplementsInterface, GstMixer and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "server"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read
  "stream-properties"        GstStructure*         : Read / Write
  "client"                   gchar*                : Read / Write
  "mute"                     gboolean              : Read / Write
  "source-output-index"      guint                 : Read
  "volume"                   gdouble               : Read / Write

Description

Synopsis

Element Information

plugin

pulseaudio

author

Lennart Poettering

class

Source/Audio

Element Pads

name

src

direction

source

presence

always

details

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-float, endianness=(int){ 1234, 4321 }, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, endianness=(int){ 1234, 4321 }, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-alaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

audio/x-mulaw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 32 ]

Details

struct GstPulseSrc

struct GstPulseSrc;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

The PulseAudio source device to connect to.

Default value: NULL


The "server" property

  "server"                   gchar*                : Read / Write

The PulseAudio server to connect to.

Default value: NULL


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL


The "stream-properties" property

  "stream-properties"        GstStructure*         : Read / Write

list of pulseaudio stream properties.


The "client" property

  "client"                   gchar*                : Read / Write

The PulseAudio client_name_to_use.

Default value: "lt-gst-plugins-good-plugins-scan"


The "mute" property

  "mute"                     gboolean              : Read / Write

Mute state of this stream.

Default value: FALSE


The "source-output-index" property

  "source-output-index"      guint                 : Read

The index of the PulseAudio source output corresponding to this record stream.

Default value: 4294967295


The "volume" property

  "volume"                   gdouble               : Read / Write

Linear volume of this stream, 1.0=100%.

Allowed values: [0,10]

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html0000644000175000017500000000653611720565335026072 00000000000000 wavpack

wavpack

wavpack — Wavpack lossless/lossy audio format handling

Plugin Information

filename

libgstwavpack.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

wavpackdec

Decodes Wavpack audio data

wavpackenc

Encodes audio with the Wavpack lossless/lossy audio codec

wavpackparse

Parses Wavpack files
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html0000644000175000017500000000566211720565335026075 00000000000000 auparse

auparse

auparse — parses au streams

Plugin Information

filename

libgstauparse.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

auparse

Parse an .au file into raw audio
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rtpdec.html0000644000175000017500000006006111720565335024414 00000000000000 rtpdec

rtpdec

rtpdec — Accepts raw RTP and RTCP packets and sends them forward

Synopsis

struct              GstRTPDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstRTPDec

Properties

  "skip"                     gint                  : Read / Write
  "latency"                  guint                 : Read / Write

Description

A simple RTP session manager used internally by rtspsrc.

Last reviewed on 2006-06-20 (0.10.4)

Synopsis

Element Information

plugin

rtsp

author

Wim Taymans <wim@fluendo.com>

class

Codec/Parser/Network

Element Pads

name

recv_rtcp_sink_%d

direction

sink

presence

request

details

application/x-rtcp

name

recv_rtp_sink_%d

direction

sink

presence

request

details

application/x-rtp

name

recv_rtp_src_%d_%d_%d

direction

source

presence

sometimes

details

application/x-rtp

name

rtcp_src_%d

direction

source

presence

request

details

application/x-rtcp

Details

struct GstRTPDec

struct GstRTPDec;

Property Details

The "skip" property

  "skip"                     gint                  : Read / Write

skip (unused).

Default value: 0


The "latency" property

  "latency"                  guint                 : Read / Write

Amount of ms to buffer.

Default value: 200

Signal Details

The "clear-pt-map" signal

void                user_function                      (GstRTPDec *gstrtpdec,
                                                        gpointer   user_data)      : Run Last

gstrtpdec :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "request-pt-map" signal

GstCaps*            user_function                      (GstRTPDec *rtpdec,
                                                        guint      session,
                                                        guint      pt,
                                                        gpointer   user_data)      : Run Last

Request the payload type as GstCaps for pt in session.

rtpdec :

the object which received the signal

session :

the session

pt :

the pt

user_data :

user data set when the signal handler was connected.

The "on-bye-ssrc" signal

void                user_function                      (GstRTPDec *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of an SSRC that became inactive because of a BYE packet.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-bye-timeout" signal

void                user_function                      (GstRTPDec *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of an SSRC that has timed out because of BYE

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-new-ssrc" signal

void                user_function                      (GstRTPDec *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of a new SSRC that entered session.

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-collision" signal

void                user_function                      (GstRTPDec *gstrtpdec,
                                                        guint      arg1,
                                                        guint      arg2,
                                                        gpointer   user_data)      : Run Last

gstrtpdec :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "on-ssrc-validated" signal

void                user_function                      (GstRTPDec *gstrtpdec,
                                                        guint      arg1,
                                                        guint      arg2,
                                                        gpointer   user_data)      : Run Last

gstrtpdec :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "on-timeout" signal

void                user_function                      (GstRTPDec *rtpbin,
                                                        guint      session,
                                                        guint      ssrc,
                                                        gpointer   user_data)      : Run Last

Notify of an SSRC that has timed out

rtpbin :

the object which received the signal

session :

the session

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cmmldec.html0000644000175000017500000001444311720565335024542 00000000000000 cmmldec

cmmldec

cmmldec — Decodes CMML streams

Synopsis

struct              GstCmmlDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstCmmlDec

Properties

  "wait-clip-end-time"       gboolean              : Read / Write

Description

Synopsis

Element Information

plugin

annodex

author

Alessandro Decina <alessandro@nnva.org>

class

Codec/Decoder

Element Pads

name

sink

direction

sink

presence

always

details

text/x-cmml, encoded=(boolean)true

name

src

direction

source

presence

always

details

text/x-cmml, encoded=(boolean)false

Details

struct GstCmmlDec

struct GstCmmlDec;

Property Details

The "wait-clip-end-time" property

  "wait-clip-end-time"       gboolean              : Read / Write

Send a tag for a clip when the clip ends, setting its end-time. Use when you need to know both clip's start-time and end-time.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiofirfilter.html0000644000175000017500000010535611720565335026152 00000000000000 audiofirfilter

audiofirfilter

audiofirfilter — Generic audio FIR filter with custom filter kernel

Synopsis

struct              GstAudioFIRFilter;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioFXBaseFIRFilter
                                 +----GstAudioFIRFilter

Properties

  "kernel"                   GValueArray*          : Read / Write
  "latency"                  guint64               : Read / Write

Signals

  "rate-changed"                                   : Run Last

Description

audiofirfilter implements a generic audio FIR filter. Before usage the "kernel" property has to be set to the filter kernel that should be used and the "latency" property has to be set to the latency (in samples) that is introduced by the filter kernel. Setting a latency of n samples will lead to the first n samples being dropped from the output and n samples added to the end.

The filter kernel describes the impulse response of the filter. To calculate the frequency response of the filter you have to calculate the Fourier Transform of the impulse response.

To change the filter kernel whenever the sampling rate changes the "rate-changed" signal can be used. This should be done for most FIR filters as they're depending on the sampling rate.

Example application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* GStreamer
 * Copyright (C) 2009 Sebastian Droege <sebastian.droege@collabora.co.uk>
 *
 * 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.
 */

/* This small sample application creates a bandpass FIR filter
 * by transforming the frequency response to the filter kernel.
 */

#include <string.h>
#include <math.h>

#include <gst/gst.h>
#include <gst/fft/gstfftf64.h>

static gboolean
on_message (GstBus * bus, GstMessage * message, gpointer user_data)
{
  GMainLoop *loop = (GMainLoop *) user_data;

  switch (GST_MESSAGE_TYPE (message)) {
    case GST_MESSAGE_ERROR:
      g_error ("Got ERROR");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_WARNING:
      g_warning ("Got WARNING");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_EOS:
      g_main_loop_quit (loop);
      break;
    default:
      break;
  }

  return TRUE;
}

static void
on_rate_changed (GstElement * element, gint rate, gpointer user_data)
{
  GValueArray *va;
  GValue v = { 0, };
  GstFFTF64 *fft;
  GstFFTF64Complex frequency_response[17];
  gdouble tmp[32];
  gdouble filter_kernel[32];
  guint i;

  /* Create the frequency response: zero outside
   * a small frequency band */
  for (i = 0; i < 17; i++) {
    if (i < 5 || i > 11)
      frequency_response[i].r = 0.0;
    else
      frequency_response[i].r = 1.0;

    frequency_response[i].i = 0.0;
  }

  /* Calculate the inverse FT of the frequency response */
  fft = gst_fft_f64_new (32, TRUE);
  gst_fft_f64_inverse_fft (fft, frequency_response, tmp);
  gst_fft_f64_free (fft);

  /* Shift the inverse FT of the frequency response by 16,
   * i.e. the half of the kernel length to get the
   * impulse response. See http://www.dspguide.com/ch17/1.htm
   * for more information.
   */
  for (i = 0; i < 32; i++)
    filter_kernel[i] = tmp[(i + 16) % 32];

  /* Apply the hamming window to the impulse response to get
   * a better result than given from the rectangular window
   */
  for (i = 0; i < 32; i++)
    filter_kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / 32));

  va = g_value_array_new (1);

  g_value_init (&v, G_TYPE_DOUBLE);
  for (i = 0; i < 32; i++) {
    g_value_set_double (&v, filter_kernel[i]);
    g_value_array_append (va, &v);
    g_value_reset (&v);
  }
  g_object_set (G_OBJECT (element), "kernel", va, NULL);
  /* Latency is 1/2 of the kernel length for this method of
   * calculating a filter kernel from the frequency response
   */
  g_object_set (G_OBJECT (element), "latency", (gint64) (32 / 2), NULL);
  g_value_array_free (va);
}

gint
main (gint argc, gchar * argv[])
{
  GstElement *pipeline, *src, *filter, *conv, *sink;
  GstBus *bus;
  GMainLoop *loop;

  gst_init (NULL, NULL);

  pipeline = gst_element_factory_make ("pipeline", NULL);

  src = gst_element_factory_make ("audiotestsrc", NULL);
  g_object_set (G_OBJECT (src), "wave", 5, NULL);

  filter = gst_element_factory_make ("audiofirfilter", NULL);
  g_signal_connect (G_OBJECT (filter), "rate-changed",
      G_CALLBACK (on_rate_changed), NULL);

  conv = gst_element_factory_make ("audioconvert", NULL);

  sink = gst_element_factory_make ("autoaudiosink", NULL);
  g_return_val_if_fail (sink != NULL, -1);

  gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL);
  if (!gst_element_link_many (src, filter, conv, sink, NULL)) {
    g_error ("Failed to link elements");
    return -2;
  }

  loop = g_main_loop_new (NULL, FALSE);

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_signal_watch (bus);
  g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
  gst_object_unref (GST_OBJECT (bus));

  if (gst_element_set_state (pipeline,
          GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
    g_error ("Failed to go into PLAYING state");
    return -3;
  }

  g_main_loop_run (loop);

  gst_element_set_state (pipeline, GST_STATE_NULL);

  g_main_loop_unref (loop);
  gst_object_unref (pipeline);

  return 0;
}

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioFIRFilter

struct GstAudioFIRFilter;

Opaque data structure.

Property Details

The "kernel" property

  "kernel"                   GValueArray*          : Read / Write

Filter kernel for the FIR filter.


The "latency" property

  "latency"                  guint64               : Read / Write

Filter latency in samples.

Default value: 0

Signal Details

The "rate-changed" signal

void                user_function                      (GstAudioFIRFilter *filter,
                                                        gint               rate,
                                                        gpointer           user_data)      : Run Last

Will be emitted when the sampling rate changes. The callbacks will be called from the streaming thread and processing will stop until the event is handled.

filter :

the filter on which the signal is emitted

rate :

the new sampling rate

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html0000644000175000017500000000613511720565335025215 00000000000000 png

png

png — PNG plugin library

Plugin Information

filename

libgstpng.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

pngdec

Decode a png video frame to a raw image

pngenc

Encode a video frame to a .png image
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiopanorama.html0000644000175000017500000002365111720565335025757 00000000000000 audiopanorama

audiopanorama

audiopanorama — Positions audio streams in the stereo panorama

Synopsis

struct              GstAudioPanorama;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioPanorama

Properties

  "panorama"                 gfloat                : Read / Write
  "method"                   GstAudioPanoramaMethod  : Read / Write

Description

Stereo panorama effect with controllable pan position. One can choose between the default psychoacoustic panning method, which keeps the same perceived loudness, and a simple panning method that just controls the volume on one channel.

Example launch line

1
2
3
4
gst-launch audiotestsrc wave=saw ! audiopanorama panorama=-1.00 ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiopanorama panorama=-1.00 ! alsasink
gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama panorama=-1.00 ! audioconvert ! alsasink
gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama method=simple panorama=-0.50 ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)32

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

Details

struct GstAudioPanorama

struct GstAudioPanorama;

Property Details

The "panorama" property

  "panorama"                 gfloat                : Read / Write

Position in stereo panorama (-1.0 left -> 1.0 right).

Allowed values: [-1,1]

Default value: 0


The "method" property

  "method"                   GstAudioPanoramaMethod  : Read / Write

Panning method: psychoacoustic mode keeps the same perceived loudness, while simple mode just controls the volume of one channel. It's merely a matter of taste which method should be chosen.

Default value: Psychoacoustic Panning (default)

Since 0.10.6

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html0000644000175000017500000000676711720565335026616 00000000000000 pulseaudio

pulseaudio

pulseaudio — PulseAudio plugin library

Plugin Information

filename

libgstpulse.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

pulseaudiosink

Correctly handles sink changes when streaming compressed formats to pulsesink

pulsemixer

Control sound input and output levels for PulseAudio

pulsesink

Plays audio to a PulseAudio server

pulsesrc

Captures audio from a PulseAudio server
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-wavenc.html0000644000175000017500000001447711720565335024430 00000000000000 wavenc

wavenc

wavenc — Encode raw audio into WAV

Synopsis

struct              GstWavEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstWavEnc

Description

Format a audio stream into the wav format.

Synopsis

Element Information

plugin

wavenc

author

Iain Holmes <iain@prettypeople.org>

class

Codec/Muxer/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, depth=(int)32, signed=(boolean)true

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)24, depth=(int)24, signed=(boolean)true

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 32, 64 }

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], width=(int)8, depth=(int)8, signed=(boolean)false

name

src

direction

source

presence

always

details

audio/x-wav

Details

struct GstWavEnc

struct GstWavEnc;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html0000644000175000017500000001010711720565335025511 00000000000000 debug

debug

debug — elements for testing and debugging

Plugin Information

filename

libgstdebug.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

breakmydata

randomly change data in the stream

capsdebug

Debug caps negotiation

capssetter

Set/merge caps on stream

cpureport

Post cpu usage information every buffer

navseek

Seek based on navigation keys left-right

progressreport

Periodically query and report on processing progress

pushfilesrc

Implements pushfile:// URI-handler for push-based file access

rndbuffersize

pull random sized buffers

taginject

inject metadata tags

testsink

perform a number of tests
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rgvolume.html0000644000175000017500000004550611720565335025002 00000000000000 rgvolume

rgvolume

rgvolume — Apply ReplayGain volume adjustment

Synopsis

struct              GstRgVolume;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstRgVolume

Implemented Interfaces

GstRgVolume implements GstChildProxy.

Properties

  "album-mode"               gboolean              : Read / Write
  "fallback-gain"            gdouble               : Read / Write
  "headroom"                 gdouble               : Read / Write
  "pre-amp"                  gdouble               : Read / Write
  "result-gain"              gdouble               : Read
  "target-gain"              gdouble               : Read

Description

This element applies volume changes to streams as lined out in the proposed ReplayGain standard. It interprets the ReplayGain meta data tags and carries out the adjustment (by using a volume element internally). The relevant tags are:

The information carried by these tags must have been calculated beforehand by performing the ReplayGain analysis. This is implemented by the rganalysis element.

The signal compression/limiting recommendations outlined in the proposed standard are not implemented by this element. This has to be handled by separate elements because applications might want to have additional filters between the volume adjustment and the limiting stage. A basic limiter is included with this plugin: The rglimiter element applies -6 dB hard limiting as mentioned in the ReplayGain standard.

Example launch line

1
2
gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \
    ! rgvolume ! audioconvert ! audioresample ! alsasink
Playback of a file

Synopsis

Element Information

plugin

replaygain

author

René Stadler <mail@renestadler.de>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32

audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32

audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

Details

struct GstRgVolume

struct GstRgVolume;

Opaque data structure.

Property Details

The "album-mode" property

  "album-mode"               gboolean              : Read / Write

Whether to prefer album gain over track gain.

If set to TRUE, use album gain instead of track gain if both are available. This keeps the relative loudness levels of tracks from the same album intact.

If set to FALSE, track mode is used instead. This effectively leads to more extensive normalization.

If album mode is enabled but the album gain tag is absent in the stream, the track gain is used instead. If both gain tags are missing, the value of the fallback-gain property is used instead.

Default value: TRUE


The "fallback-gain" property

  "fallback-gain"            gdouble               : Read / Write

Fallback gain [dB] for streams missing ReplayGain tags.

Allowed values: [-60,60]

Default value: 0


The "headroom" property

  "headroom"                 gdouble               : Read / Write

Extra headroom [dB]. This controls the amount by which the output can exceed digital full scale.

Only set this to a value greater than 0.0 if signal compression/limiting of a suitable form is applied to the output (or output is brought into the correct range by some other transformation).

This element internally uses a volume element, which also supports operating on integer audio formats. These formats do not allow exceeding digital full scale. If extra headroom is used, make sure that the raw audio data format is floating point (audio/x-raw-float). Otherwise, clipping distortion might be introduced as part of the volume adjustment itself.

Allowed values: [0,60]

Default value: 0


The "pre-amp" property

  "pre-amp"                  gdouble               : Read / Write

Additional gain to apply globally [dB]. This controls the trade-off between uniformity of normalization and utilization of available dynamic range.

Note that the default value is 0 dB because the ReplayGain reference value was adjusted by +6 dB (from 83 to 89 dB). At the time of this writing, the webpage is still outdated and does not reflect this change however. Where the original proposal states that a proper default pre-amp value is +6 dB, this translates to the used 0 dB.

Allowed values: [-60,60]

Default value: 0


The "result-gain" property

  "result-gain"              gdouble               : Read

Applied gain [dB]. This gain is applied to processed buffer data.

This is set to the target gain if amplification by that amount can be applied safely. "Safely" means that the volume adjustment does not inflict clipping distortion. Should this not be the case, the result gain is set to an appropriately reduced value (by applying peak normalization). The proposed standard calls this "clipping prevention".

The difference between target and result gain reflects the necessary amount of reduction. Applications can make use of this information to temporarily reduce the pre-amp for subsequent streams, as recommended by the ReplayGain standard.

Note that target and result gain differing for a great majority of streams indicates a problem: What happens in this case is that most streams receive peak normalization instead of amplification by the ideal replay gain. To prevent this, the pre-amp has to be lowered and/or a limiter has to be used which facilitates the use of headroom.

Allowed values: [-120,120]

Default value: 0


The "target-gain" property

  "target-gain"              gdouble               : Read

Applicable gain [dB]. This gain is supposed to be applied.

Depending on the value of the album-mode property and the presence of ReplayGain tags in the stream, this is set according to one of these simple formulas:

Allowed values: [-120,120]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gamma.html0000644000175000017500000004517411720565335024225 00000000000000 gamma

gamma

gamma — Adjusts gamma on a video stream

Synopsis

struct              GstGamma;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstGamma

Properties

  "gamma"                    gdouble               : Read / Write

Description

Performs gamma correction on a video stream.

Example launch line

1
gst-launch videotestsrc ! gamma gamma=2.0 ! ffmpegcolorspace ! ximagesink
This pipeline will make the image "brighter".
1
gst-launch videotestsrc ! gamma gamma=0.5 ! ffmpegcolorspace ! ximagesink
This pipeline will make the image "darker".

Last reviewed on 2010-04-18 (0.10.22)

Synopsis

Element Information

plugin

videofilter

author

Arwed v. Merkatz <v.merkatz@gmx.net>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstGamma

struct GstGamma;

Opaque data structure.

Property Details

The "gamma" property

  "gamma"                    gdouble               : Read / Write

gamma.

Allowed values: [0.01,10]

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-autoaudiosrc.html0000644000175000017500000001777011720565335025646 00000000000000 autoaudiosrc

autoaudiosrc

autoaudiosrc — Wrapper audio source for automatically detected audio source

Synopsis

                    GstAutoAudioSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstAutoAudioSrc

Implemented Interfaces

GstAutoAudioSrc implements GstChildProxy.

Properties

  "filter-caps"              GstCaps*              : Read / Write

Description

autoaudiosrc is an audio source that automatically detects an appropriate audio source to use. It does so by scanning the registry for all elements that have Source and Audio in the class field of their element information, and also have a non-zero autoplugging rank.

Example launch line

1
gst-launch -v -m autoaudiosrc ! audioconvert ! audioresample ! autoaudiosink

Synopsis

Element Information

plugin

autodetect

author

Jan Schmidt <thaytan@noraisin.net>, Stefan Kost <ensonic@users.sf.net>

class

Source/Audio

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

GstAutoAudioSrc

typedef struct _GstAutoAudioSrc GstAutoAudioSrc;

Property Details

The "filter-caps" property

  "filter-caps"              GstCaps*              : Read / Write

This property will filter out candidate sinks that can handle the specified caps. By default only audio sinks that support raw floating point and integer audio are selected.

This property can only be set before the element goes to the READY state.

Since 0.10.14

See Also

autovideosrc, alsasrc, osssrc
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-videoflip.html0000644000175000017500000004540711720565335025123 00000000000000 videoflip

videoflip

videoflip — Flips and rotates video

Synopsis

struct              GstVideoFlip;
enum                GstVideoFlipMethod;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstVideoFlip

Properties

  "method"                   GstVideoFlipMethod    : Read / Write

Description

Flips and rotates video.

Example launch line

1
gst-launch videotestsrc ! videoflip method=clockwise ! ffmpegcolorspace ! ximagesink
This pipeline flips the test image 90 degrees clockwise.

Last reviewed on 2010-04-18 (0.10.22)

Synopsis

Element Information

plugin

videofilter

author

David Schleef <ds@schleef.org>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVideoFlip

struct GstVideoFlip;

Opaque datastructure.


enum GstVideoFlipMethod

typedef enum {
  GST_VIDEO_FLIP_METHOD_IDENTITY,
  GST_VIDEO_FLIP_METHOD_90R,
  GST_VIDEO_FLIP_METHOD_180,
  GST_VIDEO_FLIP_METHOD_90L,
  GST_VIDEO_FLIP_METHOD_HORIZ,
  GST_VIDEO_FLIP_METHOD_VERT,
  GST_VIDEO_FLIP_METHOD_TRANS,
  GST_VIDEO_FLIP_METHOD_OTHER
} GstVideoFlipMethod;

The different flip methods.

GST_VIDEO_FLIP_METHOD_IDENTITY

Identity (no rotation)

GST_VIDEO_FLIP_METHOD_90R

Rotate clockwise 90 degrees

GST_VIDEO_FLIP_METHOD_180

Rotate 180 degrees

GST_VIDEO_FLIP_METHOD_90L

Rotate counter-clockwise 90 degrees

GST_VIDEO_FLIP_METHOD_HORIZ

Flip horizontally

GST_VIDEO_FLIP_METHOD_VERT

Flip vertically

GST_VIDEO_FLIP_METHOD_TRANS

Flip across upper left/lower right diagonal

GST_VIDEO_FLIP_METHOD_OTHER

Flip across upper right/lower left diagonal

Property Details

The "method" property

  "method"                   GstVideoFlipMethod    : Read / Write

method.

Default value: Identity (no rotation)

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-auparse.html0000644000175000017500000001362311720565335024575 00000000000000 auparse

auparse

auparse — Parse an .au file into raw audio

Synopsis

struct              GstAuParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAuParse

Description

Parses .au files mostly originating from sun os based computers.

Synopsis

Element Information

plugin

auparse

author

Erik Walthinsen <omega@cse.ogi.edu>

class

Codec/Demuxer/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-au

name

src

direction

source

presence

sometimes

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 24, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

audio/x-adpcm, layout=(string){ g721, g722, g723_3, g723_5 }

Details

struct GstAuParse

struct GstAuParse;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html0000644000175000017500000004265111720565335024614 00000000000000 v4l2sink

v4l2sink

v4l2sink

Synopsis

struct              GstV4l2Sink;

Properties

  "device"                   gchar*                : Read / Write
  "device-fd"                gint                  : Read
  "device-name"              gchar*                : Read
  "flags"                    GstV4l2DeviceTypeFlags  : Read
  "overlay-height"           guint                 : Read / Write
  "overlay-left"             gint                  : Read / Write
  "overlay-top"              gint                  : Read / Write
  "overlay-width"            guint                 : Read / Write
  "queue-size"               guint                 : Read / Write
  "brightness"               gint                  : Read / Write
  "contrast"                 gint                  : Read / Write
  "hue"                      gint                  : Read / Write
  "saturation"               gint                  : Read / Write
  "crop-height"              guint                 : Read / Write
  "crop-left"                gint                  : Read / Write
  "crop-top"                 gint                  : Read / Write
  "crop-width"               guint                 : Read / Write
  "min-queued-bufs"          guint                 : Read / Write

Description

Details

struct GstV4l2Sink

struct GstV4l2Sink {
  GstVideoSink videosink;
};

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

Device location.

Default value: "/dev/video1"


The "device-fd" property

  "device-fd"                gint                  : Read

File descriptor of the device.

Allowed values: >= -1

Default value: -1


The "device-name" property

  "device-name"              gchar*                : Read

Name of the device.

Default value: NULL


The "flags" property

  "flags"                    GstV4l2DeviceTypeFlags  : Read

Device type flags.


The "overlay-height" property

  "overlay-height"           guint                 : Read / Write

The height of the video overlay; default is equal to negotiated image height.

Default value: 0


The "overlay-left" property

  "overlay-left"             gint                  : Read / Write

The leftmost (x) coordinate of the video overlay; top left corner of screen is 0,0.

Default value: 0


The "overlay-top" property

  "overlay-top"              gint                  : Read / Write

The topmost (y) coordinate of the video overlay; top left corner of screen is 0,0.

Default value: 0


The "overlay-width" property

  "overlay-width"            guint                 : Read / Write

The width of the video overlay; default is equal to negotiated image width.

Default value: 0


The "queue-size" property

  "queue-size"               guint                 : Read / Write

Number of buffers to be enqueud in the driver in streaming mode.

Allowed values: [1,16]

Default value: 12


The "brightness" property

  "brightness"               gint                  : Read / Write

Picture brightness, or more precisely, the black level.

Default value: 0


The "contrast" property

  "contrast"                 gint                  : Read / Write

Picture contrast or luma gain.

Default value: 0


The "hue" property

  "hue"                      gint                  : Read / Write

Hue or color balance.

Default value: 0


The "saturation" property

  "saturation"               gint                  : Read / Write

Picture color saturation or chroma gain.

Default value: 0


The "crop-height" property

  "crop-height"              guint                 : Read / Write

The height of the video crop; default is equal to negotiated image height.

Default value: 0


The "crop-left" property

  "crop-left"                gint                  : Read / Write

The leftmost (x) coordinate of the video crop; top left corner of image is 0,0.

Default value: 0


The "crop-top" property

  "crop-top"                 gint                  : Read / Write

The topmost (y) coordinate of the video crop; top left corner of image is 0,0.

Default value: 0


The "crop-width" property

  "crop-width"               guint                 : Read / Write

The width of the video crop; default is equal to negotiated image width.

Default value: 0


The "min-queued-bufs" property

  "min-queued-bufs"          guint                 : Read / Write

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).

Allowed values: <= 16

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-halelements.html0000644000175000017500000000633411720565335026733 00000000000000 halelements

halelements

halelements — elements wrapping the GStreamer/HAL audio input/output devices

Plugin Information

filename

libgsthalelements.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

halaudiosink

Audio sink for sound device access via HAL

halaudiosrc

Audio source for sound device access via HAL
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-apedemux.html0000644000175000017500000001537111720565335024747 00000000000000 apedemux

apedemux

apedemux — Read and output APE tags while demuxing the contents

Synopsis

struct              GstApeDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstTagDemux
                     +----GstApeDemux

Description

apedemux accepts data streams with APE tags at the start or at the end (or both). The mime type of the data between the tag blocks is detected using typefind functions, and the appropriate output mime type set on outgoing buffers.

The element is only able to read APE tags at the end of a stream from a seekable stream, ie. when get_range mode is supported by the upstream elements. If get_range operation is available, apedemux makes it available downstream. This means that elements which require get_range mode, such as wavparse or musepackdec, can operate on files containing APE tag information.

Example launch line

1
gst-launch -t filesrc location=file.mpc ! apedemux ! fakesink
This pipeline should read any available APE tag information and output it. The contents of the file inside the APE tag regions should be detected, and the appropriate mime type set on buffers produced from apedemux.

Synopsis

Element Information

plugin

apetag

author

Tim-Philipp Müller <tim centricular net>

class

Codec/Demuxer/Metadata

Element Pads

name

sink

direction

sink

presence

always

details

application/x-apetag

name

src

direction

source

presence

sometimes

details

ANY

Details

struct GstApeDemux

struct GstApeDemux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-level.html0000644000175000017500000010522211720565335024241 00000000000000 level

level

level — RMS/Peak/Decaying Peak Level messager for audio/raw

Synopsis

struct              GstLevel;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstLevel

Properties

  "interval"                 guint64               : Read / Write
  "message"                  gboolean              : Read / Write
  "peak-falloff"             gdouble               : Read / Write
  "peak-ttl"                 guint64               : Read / Write

Description

Level analyses incoming audio buffers and, if the "message" property is TRUE, generates an element message named "level": after each interval of time given by the "interval" property. The message's structure contains these fields:

  • GstClockTime "timestamp": the timestamp of the buffer that triggered the message.

  • GstClockTime "stream-time": the stream time of the buffer.

  • GstClockTime "running-time": the running_time of the buffer.

  • GstClockTime "duration": the duration of the buffer.

  • GstClockTime "endtime": the end time of the buffer that triggered the message as stream time (this is deprecated, as it can be calculated from stream-time + duration)

  • GstValueList of gdouble "peak": the peak power level in dB for each channel

  • GstValueList of gdouble "decay": the decaying peak power level in dB for each channel the decaying peak level follows the peak level, but starts dropping if no new peak is reached after the time given by the the time to live. When the decaying peak level drops, it does so at the decay rate as specified by the the peak falloff rate.

  • GstValueList of gdouble "rms": the Root Mean Square (or average power) level in dB for each channel

Example application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* GStreamer
 * Copyright (C) 2000,2001,2002,2003,2005
 *           Thomas Vander Stichele <thomas at apestaart dot org>
 *
 * 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 <math.h>

#include <gst/gst.h>

static gboolean
message_handler (GstBus * bus, GstMessage * message, gpointer data)
{

  if (message->type == GST_MESSAGE_ELEMENT) {
    const GstStructure *s = gst_message_get_structure (message);
    const gchar *name = gst_structure_get_name (s);

    if (strcmp (name, "level") == 0) {
      gint channels;
      GstClockTime endtime;
      gdouble rms_dB, peak_dB, decay_dB;
      gdouble rms;
      const GValue *list;
      const GValue *value;

      gint i;

      if (!gst_structure_get_clock_time (s, "endtime", &endtime))
        g_warning ("Could not parse endtime");
      /* we can get the number of channels as the length of any of the value
       * lists */
      list = gst_structure_get_value (s, "rms");
      channels = gst_value_list_get_size (list);

      g_print ("endtime: %" GST_TIME_FORMAT ", channels: %d\n",
          GST_TIME_ARGS (endtime), channels);
      for (i = 0; i < channels; ++i) {
        g_print ("channel %d\n", i);
        list = gst_structure_get_value (s, "rms");
        value = gst_value_list_get_value (list, i);
        rms_dB = g_value_get_double (value);
        list = gst_structure_get_value (s, "peak");
        value = gst_value_list_get_value (list, i);
        peak_dB = g_value_get_double (value);
        list = gst_structure_get_value (s, "decay");
        value = gst_value_list_get_value (list, i);
        decay_dB = g_value_get_double (value);
        g_print ("    RMS: %f dB, peak: %f dB, decay: %f dB\n",
            rms_dB, peak_dB, decay_dB);

        /* converting from dB to normal gives us a value between 0.0 and 1.0 */
        rms = pow (10, rms_dB / 20);
        g_print ("    normalized rms value: %f\n", rms);
      }
    }
  }
  /* we handled the message we want, and ignored the ones we didn't want.
   * so the core can unref the message for us */
  return TRUE;
}

int
main (int argc, char *argv[])
{
  GstElement *audiotestsrc, *audioconvert, *level, *fakesink;
  GstElement *pipeline;
  GstCaps *caps;
  GstBus *bus;
  guint watch_id;
  GMainLoop *loop;

  gst_init (&argc, &argv);

  caps = gst_caps_from_string ("audio/x-raw-int,channels=2");

  pipeline = gst_pipeline_new (NULL);
  g_assert (pipeline);
  audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL);
  g_assert (audiotestsrc);
  audioconvert = gst_element_factory_make ("audioconvert", NULL);
  g_assert (audioconvert);
  level = gst_element_factory_make ("level", NULL);
  g_assert (level);
  fakesink = gst_element_factory_make ("fakesink", NULL);
  g_assert (fakesink);

  gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, audioconvert, level,
      fakesink, NULL);
  if (!gst_element_link (audiotestsrc, audioconvert))
    g_error ("Failed to link audiotestsrc and audioconvert");
  if (!gst_element_link_filtered (audioconvert, level, caps))
    g_error ("Failed to link audioconvert and level");
  if (!gst_element_link (level, fakesink))
    g_error ("Failed to link level and fakesink");

  /* make sure we'll get messages */
  g_object_set (G_OBJECT (level), "message", TRUE, NULL);
  /* run synced and not as fast as we can */
  g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL);

  bus = gst_element_get_bus (pipeline);
  watch_id = gst_bus_add_watch (bus, message_handler, NULL);

  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* we need to run a GLib main loop to get the messages */
  loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (loop);

  g_source_remove (watch_id);
  g_main_loop_unref (loop);
  return 0;
}

Synopsis

Element Information

plugin

level

author

Thomas Vander Stichele <thomas at apestaart dot org>

class

Filter/Analyzer/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16, 32 }, depth=(int){ 8, 16, 32 }, signed=(boolean)true

audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 32, 64 }

Details

struct GstLevel

struct GstLevel;

Opaque data structure.

Property Details

The "interval" property

  "interval"                 guint64               : Read / Write

Interval of time between message posts (in nanoseconds).

Allowed values: >= 1

Default value: 100000000


The "message" property

  "message"                  gboolean              : Read / Write

Post a level message for each passed interval.

Default value: TRUE


The "peak-falloff" property

  "peak-falloff"             gdouble               : Read / Write

Decay rate of decay peak after TTL (in dB/sec).

Allowed values: >= 0

Default value: 10


The "peak-ttl" property

  "peak-ttl"                 guint64               : Read / Write

Time To Live of decay peak before it falls back (in nanoseconds).

Default value: 300000000

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-rippletv.html0000644000175000017500000002411211720565335024775 00000000000000 rippletv

rippletv

rippletv — RippleTV does ripple mark effect on the video input

Synopsis

struct              GstRippleTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstRippleTV

Properties

  "mode"                     GstRippleTVMode       : Read / Write
  "reset"                    gboolean              : Write

Description

RippleTV does ripple mark effect on the video input. The ripple is caused by motion or random rain drops.

Example launch line

1
gst-launch -v videotestsrc ! rippletv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of rippletv on a test stream.

Synopsis

Element Information

plugin

effectv

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstRippleTV

struct GstRippleTV;

Property Details

The "mode" property

  "mode"                     GstRippleTVMode       : Read / Write

Mode.

Default value: Motion Detection


The "reset" property

  "reset"                    gboolean              : Write

Reset all current ripples.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/index.html0000644000175000017500000014066111720565335017370 00000000000000 GStreamer Good Plugins 0.10 Plugins Reference Manual

for GStreamer Good Plugins 0.10 (0.10.31) The latest version of this documentation can be found on-line at http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/.


gst-plugins-good Elements
3gppmux — Muxer for 3GPP (.3gp) files
aacparse — AAC parser
aasink — An ASCII art videosink
ac3parse — AC3 parser
agingtv — AgingTV adds age to video input using scratches and dust
alpha — Adds an alpha channel to video - uniform or via chroma-keying
alphacolor — ARGB from/to AYUV colorspace conversion preserving the alpha channel
alawdec — Convert 8bit A law to 16bit PCM
alawenc — Convert 16bit PCM to 8bit A law
amrparse — AMR parser
apedemux — Read and output APE tags while demuxing the contents
apev2mux — Adds an APEv2 header to the beginning of files using taglib
aspectratiocrop — Crops video into a user-defined aspect-ratio
audioamplify — Amplifies an audio stream by a given factor
audiochebband — Chebyshev band pass and band reject filter
audiocheblimit — Chebyshev low pass and high pass filter
audiofirfilter — Generic audio FIR filter with custom filter kernel
audioiirfilter — Generic audio IIR filter with custom filter kernel
audiowsincband — Band pass and band reject windowed sinc filter
audiowsinclimit — Low pass and high pass windowed sinc filter
audioecho — Adds an echo or reverb effect to an audio stream
audiodynamic — Compressor and Expander
audioinvert — Swaps upper and lower half of audio samples
audiopanorama — Positions audio streams in the stereo panorama
audiokaraoke — Removes voice from sound
auparse — Parse an .au file into raw audio
autoaudiosink — Wrapper audio sink for automatically detected audio sink
autoaudiosrc — Wrapper audio source for automatically detected audio source
autovideosink — Wrapper video sink for automatically detected video sink
autovideosrc — Wrapper video source for automatically detected video source
avidemux — Demultiplex an avi file into audio and video
avimux — Muxes audio and video into an avi stream
avisubtitle — Parse avi subtitle stream
cacasink — A colored ASCII art videosink
cairotextoverlay — Adds text strings on top of a video buffer
cairotimeoverlay — Overlays the time on a video stream
cairorender — Encodes streams using Cairo
cairooverlay — Render overlay on a video stream using Cairo
capssetter — Set/merge caps on stream
cmmldec — Decodes CMML streams
cmmlenc — Encodes CMML streams
cutter — Audio Cutter to split audio into non-silent bits
dcaparse — DCA (DTS Coherent Acoustics) parser
deinterlace — Deinterlace Methods ported from DScaler/TvTime
deinterleave — Splits one interleaved multichannel audio stream into many mono audio streams
dicetv — 'Dices' the screen up into many small squares
directsoundsink — DirectSound audio sink
dv1394src — Source for DV video data from firewire port
dvdec — Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)
dvdemux — Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)
edgetv — Apply edge detect on video
equalizer-10bands — Direct Form 10 band IIR equalizer
equalizer-3bands — Direct Form 3 band IIR equalizer
equalizer-nbands — Direct Form IIR equalizer
esdsink — Plays audio to an esound server
flacdec — Decodes FLAC lossless audio streams
flacenc — Encodes audio with the FLAC lossless audio encoder
flacparse — Parses audio with the FLAC lossless audio codec
flactag — Rewrite tags in a FLAC file
flvdemux — Demux FLV feeds into digital streams
flvmux — Muxes video/audio streams into a FLV stream
flxdec — FLC/FLI/FLX video decoder
gamma — Adjusts gamma on a video stream
gconfaudiosrc — Audio source embedding the GConf-settings for audio input
gconfaudiosink — Audio sink embedding the GConf-settings for audio output
gconfvideosrc — Video source embedding the GConf-settings for video input
gconfvideosink — Video sink embedding the GConf-settings for video output
gdkpixbufsink — Output images as GdkPixbuf objects in bus messages
goom — Takes frames of data and outputs video frames using the GOOM filter
goom2k1 — Takes frames of data and outputs video frames using the GOOM 2k1 filter
gstrtpbin — Real-Time Transport Protocol bin
gstrtpjitterbuffer — A buffer that deals with network jitter and other transmission faults
gstrtpptdemux — Parses codec streams transmitted in the same RTP session
gstrtpsession — Implement an RTP session
gstrtpssrcdemux — Splits RTP streams based on the SSRC
halaudiosink — Audio sink for sound device access via HAL
halaudiosrc — Audio source for sound device access via HAL
hdv1394src — Source for MPEG-TS video data from firewire port
icydemux — Read and output ICY tags while demuxing the contents
id3demux — Read and output ID3v1 and ID3v2 tags while demuxing the contents
id3v2mux — Adds an ID3v2 header to the beginning of MP3 files using taglib
imagefreeze — Generates a still frame stream from an image
interleave — Folds many mono channels into one interleaved audio stream
ismlmux — Muxer for ISML smooth streaming (.isml) files
jackaudiosrc — Captures audio from a JACK server
jackaudiosink — Output audio to a JACK server
jpegdec — Decode images from JPEG format
jpegenc — Encode images in JPEG format
level — RMS/Peak/Decaying Peak Level messager for audio/raw
matroskamux — Muxes video/audio/subtitle streams into a matroska stream
matroskademux — Demuxes Matroska/WebM streams into video/audio/subtitles
mj2mux — Muxer for Motion JPEG-2000 (.mj2) files
monoscope — Displays a highly stabilised waveform of audio input
mpegaudioparse — MPEG audio parser
mp4mux — Muxer for ISO MPEG-4 (.mp4) files
mulawdec — Convert 8bit mu law to 16bit PCM
mulawenc — Convert 16bit PCM to 8bit mu law
multifilesink — Write buffers to a sequentially named set of files
multifilesrc — Read a sequentially named set of files into buffers
multipartdemux — demux multipart streams
multipartmux — mux multipart streams
multiudpsink — Send data over the network via UDP
optv — Optical art meets real-time video effect
oss4mixer — Control sound input and output levels with OSS4
oss4sink — Output to a sound card via OSS version 4
oss4src — Capture from a sound card via OSS version 4
ossmixer — Control sound input and output levels with OSS
osssink — Output to a sound card via OSS
osssrc — Capture from a sound card via OSS
osxaudiosink — Output to a sound card in OS X
osxaudiosrc — Input from a sound card in OS X
osxvideosink — OSX native videosink
pngdec — Decode a png video frame to a raw image
pngenc — Encode a video frame to a .png image
progressreport — Periodically query and report on processing progress
pulsesink — Plays audio to a PulseAudio server
pulsesrc — Captures audio from a PulseAudio server
pulsemixer — Control sound input and output levels for PulseAudio
quarktv — Motion dissolver
qtdemux — Demultiplex a QuickTime file into audio and video streams
qtmux — Muxer for quicktime(.mov) files
qtmoovrecover — Utility element for recovering unfinished quicktime files
radioactv — motion-enlightment effect
revtv — A video waveform monitor for each line of video processed
rganalysis — Perform the ReplayGain analysis
rglimiter — Apply signal compression to raw audio data
rgvolume — Apply ReplayGain volume adjustment
rippletv — RippleTV does ripple mark effect on the video input
rtpdec — Accepts raw RTP and RTCP packets and sends them forward
rtpj2kpay — Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)
rtpjpegpay — Payload-encodes JPEG pictures into RTP packets (RFC 2435)
rtspsrc — Receive data over the network via RTSP (RFC 2326)
shagadelictv — Oh behave, ShagedelicTV makes images shagadelic!
shapewipe — Adds a shape wipe transition to a video stream
smokedec — Decode video from Smoke format
smokeenc — Encode images into the Smoke format
smpte — Apply the standard SMPTE transitions on video images
smptealpha — Apply the standard SMPTE transitions as alpha on video images
souphttpsrc — Receive data as a client over the network via HTTP using SOUP
spectrum — Run an FFT on the audio signal, output spectrum data
speexenc — Encodes audio in Speex format
speexdec — decode speex streams to audio
splitfilesrc — Read a sequentially named set of files as if it was one large file
streaktv — StreakTV makes after images of moving objects
taginject — inject metadata tags
udpsrc — Receive data over the network via UDP
udpsink — Send data over the network via UDP
v4l2src — Reads frames from a Video4Linux2 device
v4l2sink
v4l2radio — Controls a Video4Linux2 radio device
vertigotv — A loopback alpha blending effector with rotating and scaling
videobalance — Adjusts brightness, contrast, hue, saturation on a video stream
videobox — Resizes a video by adding borders or cropping
videocrop — Crops video into a user-defined region
videoflip — Flips and rotates video
videomixer — Mix multiple video streams
videomixer2 — Mix multiple video streams
warptv — WarpTV does realtime goo'ing of the video input
wavenc — Encode raw audio into WAV
waveformsink — WaveForm audio sink
wavpackdec — Decodes Wavpack audio data
wavpackenc — Encodes audio with the Wavpack lossless/lossy audio codec
wavpackparse — Parses Wavpack files
wavparse — Parse a .wav file into raw audio
webmmux — Muxes video and audio streams into a WebM stream
ximagesrc — Creates a screenshot video stream
y4menc — Encodes a YUV frame into the yuv4mpeg format (mjpegtools)
gst-plugins-good Plugins
1394Source for video data via IEEE1394 interface
aasinkASCII Art video sink
alawALaw audio conversion routines
alphaadds an alpha channel to video - constant or via chroma-keying
alphacolorRGBA from/to AYUV colorspace conversion preserving the alpha channel
annodexannodex stream manipulation (info about annodex: http://www.annodex.net)
apetagAPEv1/2 tag reader
audiofxAudio effects plugin
auparseparses au streams
autodetectPlugin contains auto-detection plugins for video/audio in- and outputs
aviAVI stream handling
cacasinkColored ASCII Art video sink
cairoCairo-based elements
cutterAudio Cutter to split audio into non-silent bits
debugelements for testing and debugging
deinterlaceDeinterlacer
directsoundDirectSound plugin
dvDV demuxer and decoder based on libdv (libdv.sf.net)
efenceThis 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 "Electric Fence".
equalizerGStreamer audio equalizers
effectveffect plugins from the effectv project
esdsinkESD Element Plugins
flacThe FLAC Lossless compressor Codec
flvFLV muxing and demuxing plugin
flxdecFLC/FLI/FLX video decoder
gconfelementselements wrapping the GStreamer/GConf audio/video output settings
gdkpixbufGdkPixbuf-based image decoder, scaler and sink
goomGOOM visualization filter
goom2k1GOOM 2k1 visualization filter
halelementselements wrapping the GStreamer/HAL audio input/output devices
icydemuxDemux ICY tags from a stream
id3demuxDemux ID3v1 and ID3v2 tags from a file
imagefreezeStill frame stream generator
interleaveAudio interleaver/deinterleaver
isomp4ISO base media file format support (mp4, 3gpp, qt, mj2)
jackJACK audio elements
jpegJPeg plugin library
levelAudio level plugin
matroskaMatroska and WebM stream handling
monoscopeMonoscope visualization
mulawMuLaw audio conversion routines
multifileReads/Writes buffers from/to sequentially named files
multipartmultipart stream manipulation
navigationtestTemplate for a video filter
oss4Open Sound System (OSS) version 4 support for GStreamer
ossaudioOSS (Open Sound System) support for GStreamer
osxaudioOSX (Mac OS X) audio support for GStreamer
osxvideoOSX native video output plugin
pngPNG plugin library
pulseaudioPulseAudio plugin library
replaygainReplayGain volume normalization
rtpReal-time protocol plugins
gstrtpmanagerRTP session management plugin library
rtsptransfer data via RTSP
shapewipeShape Wipe transition filter
shout2sendSends data to an icecast server using libshout2
smpteApply the standard SMPTE transitions on video images
souplibsoup HTTP client src/sink
spectrumRun an FFT on the audio signal, output spectrum data
speexSpeex plugin library
taglibTag writing plug-in based on taglib
udptransfer data via UDP
video4linux2elements for Video 4 Linux
videoboxresizes a video by adding borders or cropping
videocropCrops video into a user-defined region
videofilterVideo filters plugin
videomixerVideo mixer
waveformWaveForm API based plugin
wavencEncode raw audio into WAV
wavpackWavpack lossless/lossy audio format handling
wavparseParse a .wav file into raw audio
ximagesrcX11 video input plugin using standard Xlib calls
y4mencEncodes a YUV frame into the yuv4mpeg format (mjpegtools)
gst-plugins-good Base Classes
GstIirEqualizer
GstVideoMixerPad
GstVideoMixer2Pad
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-radioactv.html0000644000175000017500000002524111720565335025110 00000000000000 radioactv

radioactv

radioactv — motion-enlightment effect

Synopsis

struct              GstRadioacTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstRadioacTV

Properties

  "color"                    GstRadioacTVColor     : Read / Write
  "interval"                 guint                 : Read / Write
  "mode"                     GstRadioacTVMode      : Read / Write
  "trigger"                  gboolean              : Read / Write

Description

RadioacTV does *NOT* detect a radioactivity. It detects a difference from previous frame and blurs it.

RadioacTV has 4 mode, normal, strobe1, strobe2 and trigger. In trigger mode, effect appears only when the trigger property is TRUE.

strobe1 and strobe2 mode drops some frames. strobe1 mode uses the difference between current frame and previous frame dropped, while strobe2 mode uses the difference from previous frame displayed. The effect of strobe2 is stronger than strobe1.

Example launch line

1
gst-launch -v videotestsrc ! radioactv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of radioactv on a test stream.

Synopsis

Element Information

plugin

effectv

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstRadioacTV

struct GstRadioacTV;

Property Details

The "color" property

  "color"                    GstRadioacTVColor     : Read / Write

Color.

Default value: White


The "interval" property

  "interval"                 guint                 : Read / Write

Snapshot interval (in strobe mode).

Allowed values: <= G_MAXINT

Default value: 3


The "mode" property

  "mode"                     GstRadioacTVMode      : Read / Write

Mode.

Default value: Normal


The "trigger" property

  "trigger"                  gboolean              : Read / Write

Trigger (in trigger mode).

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-equalizer-nbands.html0000644000175000017500000003605511720565335026405 00000000000000 equalizer-nbands

equalizer-nbands

equalizer-nbands — Direct Form IIR equalizer

Synopsis

struct              GstIirEqualizerNBands;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstIirEqualizer
                                 +----GstIirEqualizerNBands

Implemented Interfaces

GstIirEqualizerNBands implements GstChildProxy.

Properties

  "num-bands"                guint                 : Read / Write / Construct

Description

The n-band equalizer element is a fully parametric equalizer. It allows to select between 1 and 64 bands and has properties on each band to change the center frequency, band width and gain.

Example launch line

1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-nbands num-bands=15 band5::gain=6.0 ! alsasink
This make the equalizer use 15 bands and raises the volume of the 5th band by 6 db.


Example code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <gst/gst.h>

...
typedef struct {
  gfloat freq;
  gfloat width;
  gfloat gain;
} GstEqualizerBandState;

...

  GstElement *equalizer;
  GstObject *band;
  gint i;
  GstEqualizerBandState state[] = {
    { 120.0,   50.0, - 3.0},
    { 500.0,   20.0,  12.0},
    {1503.0,    2.0, -20.0},
    {6000.0, 1000.0,   6.0},
    {3000.0,  120.0,   2.0}
  };

...

  equalizer = gst_element_factory_make ("equalizer-nbands", "equalizer");
  g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL);

...

  for (i = 0; i < 5; i++) {
    band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i);
    g_object_set (G_OBJECT (band), "freq", state[i].freq,
        "bandwidth", state[i].width,
	"gain", state[i].gain);
    g_object_unref (G_OBJECT (band));
  }

...

Synopsis

Element Information

plugin

equalizer

author

Benjamin Otte <otte@gnome.org>, Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstIirEqualizerNBands

struct GstIirEqualizerNBands;

Property Details

The "num-bands" property

  "num-bands"                guint                 : Read / Write / Construct

number of different bands to use.

Allowed values: [1,64]

Default value: 10

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-splitfilesrc.html0000644000175000017500000001736011720565335025642 00000000000000 splitfilesrc

splitfilesrc

splitfilesrc — Read a sequentially named set of files as if it was one large file

Synopsis

struct              GstSplitFileSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstSplitFileSrc

Properties

  "location"                 gchar*                : Read / Write

Description

Reads data from multiple files, presenting those files as one continuous file to downstream elements. This is useful for reading a large file that had to be split into multiple parts due to filesystem file size limitations, for example.

The files to select are chosen via the location property, which supports (and expects) shell-style wildcards (but only for the filename, not for directories). The results will be sorted.

Example launch line

1
gst-launch splitfilesrc location="/path/to/part-*.mpg" ! decodebin ! ... \
Plays the different parts as if they were one single MPEG file.

Synopsis

Element Information

plugin

multifile

author

Tim-Philipp Müller <tim.muller@collabora.co.uk>

class

Source/File

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

struct GstSplitFileSrc

struct GstSplitFileSrc;

Property Details

The "location" property

  "location"                 gchar*                : Read / Write

Wildcard pattern to match file names of the input files. If the location is an absolute path or contains directory components, only the base file name part will be considered for pattern matching. The results will be sorted.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-smptealpha.html0000644000175000017500000003335511720565335025277 00000000000000 smptealpha

smptealpha

smptealpha — Apply the standard SMPTE transitions as alpha on video images

Synopsis

struct              GstSMPTEAlpha;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstSMPTEAlpha

Properties

  "border"                   gint                  : Read / Write
  "depth"                    gint                  : Read / Write
  "position"                 gdouble               : Read / Write
  "type"                     GstSMPTEAlphaTransitionType  : Read / Write
  "invert"                   gboolean              : Read / Write

Description

smptealpha can accept an I420 or AYUV video stream. An alpha channel is added using an effect specific SMPTE mask in the I420 input case. In the AYUV case, the alpha channel is modified using the effect specific SMPTE mask.

The "position" property is a controllabe double between 0.0 and 1.0 that specifies the position in the transition. 0.0 is the start of the transition with the alpha channel to complete opaque where 1.0 has the alpha channel set to completely transparent.

The "depth" property defines the precision in bits of the mask. A higher presision will create a mask with smoother gradients in order to avoid banding.

Sample pipelines

Here is a pipeline to demonstrate the smpte transition :

gst-launch -v videotestsrc ! smptealpha border=20000 type=44
position=0.5 ! videomixer ! ffmpegcolorspace ! ximagesink 

This shows a midway bowtie-h transition a from a videotestsrc to a transparent image. The edges of the transition are smoothed with a 20000 big border.

Synopsis

Element Information

plugin

smpte

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Editor/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstSMPTEAlpha

struct GstSMPTEAlpha;

Property Details

The "border" property

  "border"                   gint                  : Read / Write

The border width of the transition.

Allowed values: >= 0

Default value: 0


The "depth" property

  "depth"                    gint                  : Read / Write

Depth of the mask in bits.

Allowed values: [1,24]

Default value: 16


The "position" property

  "position"                 gdouble               : Read / Write

Position of the transition effect.

Allowed values: [0,1]

Default value: 0


The "type" property

  "type"                     GstSMPTEAlphaTransitionType  : Read / Write

The type of transition to use.

Default value: A bar moves from left to right


The "invert" property

  "invert"                   gboolean              : Read / Write

Set to TRUE to invert the transition mask (ie. flip it horizontally).

Default value: FALSE

Since 0.10.23

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html0000644000175000017500000005140411720565335024433 00000000000000 v4l2src

v4l2src

v4l2src — Reads frames from a Video4Linux2 device

Synopsis

struct              GstV4l2Src;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstV4l2Src

Properties

  "device"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read
  "flags"                    GstV4l2DeviceTypeFlags  : Read
  "queue-size"               guint                 : Read / Write
  "always-copy"              gboolean              : Read / Write
  "device-fd"                gint                  : Read
  "brightness"               gint                  : Read / Write
  "contrast"                 gint                  : Read / Write
  "decimate"                 gint                  : Read / Write
  "hue"                      gint                  : Read / Write
  "saturation"               gint                  : Read / Write
  "norm"                     V4L2_TV_norms         : Read / Write

Description

Synopsis

Element Information

plugin

video4linux2

author

Edgard Lima <edgard.lima@indt.org.br>, Stefan Kost <ensonic@users.sf.net>

class

Source/Video

Element Pads

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)8, depth=(int)8, red_mask=(int)224, green_mask=(int)28, blue_mask=(int)3, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, endianness=(int)4321, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-gray, bpp=(int)8, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YVU9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)Y41P, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)NV12, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)NV21, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YUV9, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

image/jpeg, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-dv, systemstream=(boolean)true, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/mpegts

video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]

Details

struct GstV4l2Src

struct GstV4l2Src;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

Device location.

Default value: "/dev/video0"


The "device-name" property

  "device-name"              gchar*                : Read

Name of the device.

Default value: NULL


The "flags" property

  "flags"                    GstV4l2DeviceTypeFlags  : Read

Device type flags.


The "queue-size" property

  "queue-size"               guint                 : Read / Write

Number of buffers to be enqueud in the driver in streaming mode.

Allowed values: [1,16]

Default value: 2


The "always-copy" property

  "always-copy"              gboolean              : Read / Write

If the buffer will or not be used directly from mmap.

Default value: TRUE


The "device-fd" property

  "device-fd"                gint                  : Read

File descriptor of the device.

Allowed values: >= G_MAXULONG

Default value: -1


The "brightness" property

  "brightness"               gint                  : Read / Write

Picture brightness, or more precisely, the black level.

Default value: 0


The "contrast" property

  "contrast"                 gint                  : Read / Write

Picture contrast or luma gain.

Default value: 0


The "decimate" property

  "decimate"                 gint                  : Read / Write

Only use every nth frame.

Allowed values: >= 1

Default value: 1


The "hue" property

  "hue"                      gint                  : Read / Write

Hue or color balance.

Default value: 0


The "saturation" property

  "saturation"               gint                  : Read / Write

Picture color saturation or chroma gain.

Default value: 0


The "norm" property

  "norm"                     V4L2_TV_norms         : Read / Write

video standard.

Default value: none

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html0000644000175000017500000000613611720565335025032 00000000000000 1394

1394

1394 — Source for video data via IEEE1394 interface

Plugin Information

filename

libgst1394.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

dv1394src

Source for DV video data from firewire port

hdv1394src

Source for MPEG-TS video data from firewire port
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html0000644000175000017500000000727011720565335026573 00000000000000 autodetect

autodetect

autodetect — Plugin contains auto-detection plugins for video/audio in- and outputs

Plugin Information

filename

libgstautodetect.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

autoaudiosink

Wrapper audio sink for automatically detected audio sink

autoaudiosrc

Wrapper audio source for automatically detected audio source

autovideosink

Wrapper video sink for automatically detected video sink

autovideosrc

Wrapper video source for automatically detected video source
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-wavpackdec.html0000644000175000017500000001263411720565335025246 00000000000000 wavpackdec

wavpackdec

wavpackdec — Decodes Wavpack audio data

Synopsis

struct              GstWavpackDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstWavpackDec

Description

Synopsis

Element Information

plugin

wavpack

author

Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org>

class

Codec/Decoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true

name

src

direction

source

presence

always

details

audio/x-raw-int, width=(int)32, depth=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], endianness=(int)1234, signed=(boolean)true

Details

struct GstWavpackDec

struct GstWavpackDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiodynamic.html0000644000175000017500000002644711720565335025613 00000000000000 audiodynamic

audiodynamic

audiodynamic — Compressor and Expander

Synopsis

struct              GstAudioDynamic;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioDynamic

Properties

  "characteristics"          GstAudioDynamicCharacteristics  : Read / Write
  "mode"                     GstAudioDynamicMode   : Read / Write
  "ratio"                    gfloat                : Read / Write
  "threshold"                gfloat                : Read / Write

Description

This element can act as a compressor or expander. A compressor changes the amplitude of all samples above a specific threshold with a specific ratio, a expander does the same for all samples below a specific threshold. If soft-knee mode is selected the ratio is applied smoothly.

Example launch line

1
2
3
gst-launch audiotestsrc wave=saw ! audiodynamic characteristics=soft-knee mode=compressor threshold=0.5 rate=0.5 ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiodynamic characteristics=hard-knee mode=expander threshold=0.2 rate=4.0 ! alsasink
gst-launch audiotestsrc wave=saw ! audioconvert ! audiodynamic ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioDynamic

struct GstAudioDynamic;

Property Details

The "characteristics" property

  "characteristics"          GstAudioDynamicCharacteristics  : Read / Write

Selects whether the ratio should be applied smooth (soft-knee) or hard (hard-knee).

Default value: Hard Knee (default)


The "mode" property

  "mode"                     GstAudioDynamicMode   : Read / Write

Selects whether the filter should work on loud samples (compressor) orquiet samples (expander).

Default value: Compressor (default)


The "ratio" property

  "ratio"                    gfloat                : Read / Write

Ratio that should be applied.

Allowed values: >= 0

Default value: 1


The "threshold" property

  "threshold"                gfloat                : Read / Write

Threshold until the filter is activated.

Allowed values: [0,1]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html0000644000175000017500000000657311720565335026440 00000000000000 equalizer

equalizer

equalizer — GStreamer audio equalizers

Plugin Information

filename

libgstequalizer.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

equalizer-10bands

Direct Form 10 band IIR equalizer

equalizer-3bands

Direct Form 3 band IIR equalizer

equalizer-nbands

Direct Form IIR equalizer
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-pulsemixer.html0000644000175000017500000001706711720565335025340 00000000000000 pulsemixer

pulsemixer

pulsemixer — Control sound input and output levels for PulseAudio

Synopsis

struct              GstPulseMixer;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstPulseMixer

Implemented Interfaces

GstPulseMixer implements GstImplementsInterface, GstMixer and GstPropertyProbe.

Properties

  "device"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read
  "server"                   gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

pulseaudio

author

Lennart Poettering

class

Generic/Audio

Element Pads

Details

struct GstPulseMixer

struct GstPulseMixer;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

The PulseAudio sink or source to control.

Default value: NULL


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: NULL


The "server" property

  "server"                   gchar*                : Read / Write

The PulseAudio server to connect to.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-matroskademux.html0000644000175000017500000002135011720565335026015 00000000000000 matroskademux

matroskademux

matroskademux — Demuxes Matroska/WebM streams into video/audio/subtitles

Synopsis

                    GstMatroskaDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMatroskaDemux

Properties

  "max-gap-time"             guint64               : Read / Write

Description

matroskademux demuxes a Matroska file into the different contained streams.

Example launch line

1
gst-launch -v filesrc location=/path/to/mkv ! matroskademux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
This pipeline demuxes a Matroska file and outputs the contained Vorbis audio.

Synopsis

Element Information

plugin

matroska

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Demuxer

Element Pads

name

sink

direction

sink

presence

always

details

video/x-matroska

video/webm

name

audio_%02d

direction

source

presence

sometimes

details

ANY

name

subtitle_%02d

direction

source

presence

sometimes

details

text/x-pango-markup

application/x-ssa

application/x-ass

application/x-usf

video/x-dvd-subpicture

subpicture/x-pgs

subtitle/x-kate

application/x-subtitle-unknown

name

video_%02d

direction

source

presence

sometimes

details

ANY

Details

GstMatroskaDemux

typedef struct _GstMatroskaDemux GstMatroskaDemux;

Property Details

The "max-gap-time" property

  "max-gap-time"             guint64               : Read / Write

The demuxer sends out newsegment events for skipping gaps longer than this (0 = disabled).

Default value: 2000000000

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html0000644000175000017500000000613211720565335025552 00000000000000 speex

speex

speex — Speex plugin library

Plugin Information

filename

libgstspeex.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

speexdec

decode speex streams to audio

speexenc

Encodes audio in Speex format
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html0000644000175000017500000000565011720565335026206 00000000000000 cacasink

cacasink

cacasink — Colored ASCII Art video sink

Plugin Information

filename

libgstcacasink.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

cacasink

A colored ASCII art videosink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-videobalance.html0000644000175000017500000005043211720565335025550 00000000000000 videobalance

videobalance

videobalance — Adjusts brightness, contrast, hue, saturation on a video stream

Synopsis

struct              GstVideoBalance;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstVideoBalance

Implemented Interfaces

GstVideoBalance implements GstImplementsInterface and GstColorBalance.

Properties

  "brightness"               gdouble               : Read / Write
  "contrast"                 gdouble               : Read / Write
  "hue"                      gdouble               : Read / Write
  "saturation"               gdouble               : Read / Write

Description

Adjusts brightness, contrast, hue, saturation on a video stream.

Example launch line

1
gst-launch videotestsrc ! videobalance saturation=0.0 ! ffmpegcolorspace ! ximagesink
This pipeline converts the image to black and white by setting the saturation to 0.0.

Last reviewed on 2010-04-18 (0.10.22)

Synopsis

Element Information

plugin

videofilter

author

David Schleef <ds@schleef.org>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)IYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVideoBalance

struct GstVideoBalance;

Opaque data structure.

Property Details

The "brightness" property

  "brightness"               gdouble               : Read / Write

brightness.

Allowed values: [-1,1]

Default value: 0


The "contrast" property

  "contrast"                 gdouble               : Read / Write

contrast.

Allowed values: [0,2]

Default value: 1


The "hue" property

  "hue"                      gdouble               : Read / Write

hue.

Allowed values: [-1,1]

Default value: 0


The "saturation" property

  "saturation"               gdouble               : Read / Write

saturation.

Allowed values: [0,2]

Default value: 1

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audioiirfilter.html0000644000175000017500000007617711720565335026165 00000000000000 audioiirfilter

audioiirfilter

audioiirfilter — Generic audio IIR filter with custom filter kernel

Synopsis

struct              GstAudioIIRFilter;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioFXBaseIIRFilter
                                 +----GstAudioIIRFilter

Properties

  "a"                        GValueArray*          : Read / Write
  "b"                        GValueArray*          : Read / Write

Signals

  "rate-changed"                                   : Run Last

Description

audioiirfilter implements a generic audio IIR filter. Before usage the "a" and "b" properties have to be set to the filter coefficients that should be used.

The filter coefficients describe the numerator and denominator of the transfer function.

To change the filter coefficients whenever the sampling rate changes the "rate-changed" signal can be used. This should be done for most IIR filters as they're depending on the sampling rate.

Example application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* GStreamer
 * Copyright (C) 2009 Sebastian Droege <sebastian.droege@collabora.co.uk>
 *
 * 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.
 */

/* This small sample application creates a lowpass IIR filter
 * and applies it to white noise.
 * See http://www.dspguide.com/ch19/2.htm for a description
 * of the IIR filter that is used.
 */

#include <string.h>
#include <math.h>

#include <gst/gst.h>

/* Cutoff of 4000 Hz */
#define CUTOFF (4000.0)

static gboolean
on_message (GstBus * bus, GstMessage * message, gpointer user_data)
{
  GMainLoop *loop = (GMainLoop *) user_data;

  switch (GST_MESSAGE_TYPE (message)) {
    case GST_MESSAGE_ERROR:
      g_error ("Got ERROR");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_WARNING:
      g_warning ("Got WARNING");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_EOS:
      g_main_loop_quit (loop);
      break;
    default:
      break;
  }

  return TRUE;
}

static void
on_rate_changed (GstElement * element, gint rate, gpointer user_data)
{
  GValueArray *va;
  GValue v = { 0, };
  gdouble x;

  if (rate / 2.0 > CUTOFF)
    x = exp (-2.0 * G_PI * (CUTOFF / rate));
  else
    x = 0.0;

  va = g_value_array_new (1);

  g_value_init (&v, G_TYPE_DOUBLE);
  g_value_set_double (&v, 1.0 - x);
  g_value_array_append (va, &v);
  g_value_reset (&v);
  g_object_set (G_OBJECT (element), "a", va, NULL);
  g_value_array_free (va);

  va = g_value_array_new (1);
  g_value_set_double (&v, x);
  g_value_array_append (va, &v);
  g_value_reset (&v);
  g_object_set (G_OBJECT (element), "b", va, NULL);
  g_value_array_free (va);
}

gint
main (gint argc, gchar * argv[])
{
  GstElement *pipeline, *src, *filter, *conv, *sink;
  GstBus *bus;
  GMainLoop *loop;

  gst_init (NULL, NULL);

  pipeline = gst_element_factory_make ("pipeline", NULL);

  src = gst_element_factory_make ("audiotestsrc", NULL);
  g_object_set (G_OBJECT (src), "wave", 5, NULL);

  filter = gst_element_factory_make ("audioiirfilter", NULL);
  g_signal_connect (G_OBJECT (filter), "rate-changed",
      G_CALLBACK (on_rate_changed), NULL);

  conv = gst_element_factory_make ("audioconvert", NULL);

  sink = gst_element_factory_make ("autoaudiosink", NULL);
  g_return_val_if_fail (sink != NULL, -1);

  gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL);
  if (!gst_element_link_many (src, filter, conv, sink, NULL)) {
    g_error ("Failed to link elements");
    return -2;
  }

  loop = g_main_loop_new (NULL, FALSE);

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_signal_watch (bus);
  g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
  gst_object_unref (GST_OBJECT (bus));

  if (gst_element_set_state (pipeline,
          GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
    g_error ("Failed to go into PLAYING state");
    return -3;
  }

  g_main_loop_run (loop);

  gst_element_set_state (pipeline, GST_STATE_NULL);

  g_main_loop_unref (loop);
  gst_object_unref (pipeline);

  return 0;
}

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioIIRFilter

struct GstAudioIIRFilter;

Opaque data structure.

Property Details

The "a" property

  "a"                        GValueArray*          : Read / Write

Filter coefficients (numerator of transfer function).


The "b" property

  "b"                        GValueArray*          : Read / Write

Filter coefficients (denominator of transfer function).

Signal Details

The "rate-changed" signal

void                user_function                      (GstAudioIIRFilter *filter,
                                                        gint               rate,
                                                        gpointer           user_data)      : Run Last

Will be emitted when the sampling rate changes. The callbacks will be called from the streaming thread and processing will stop until the event is handled.

filter :

the filter on which the signal is emitted

rate :

the new sampling rate

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-shapewipe.html0000644000175000017500000003245111720565335025122 00000000000000 shapewipe

shapewipe

shapewipe — Adds a shape wipe transition to a video stream

Synopsis

struct              GstShapeWipe;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstShapeWipe

Properties

  "border"                   gfloat                : Read / Write
  "position"                 gfloat                : Read / Write

Description

The shapewipe element provides custom transitions on video streams based on a grayscale bitmap. The state of the transition can be controlled by the position property and an optional blended border can be added by the border property.

Transition bitmaps can be downloaded from the Cinelerra transition page.

Example launch line

1
gst-launch -v videotestsrc ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! shapewipe position=0.5 name=shape ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink     filesrc location=mask.png ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink    videotestsrc pattern=snow ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! queue ! mixer.
This pipeline adds the transition from mask.png with position 0.5 to an SMPTE test screen and snow.

Synopsis

Element Information

plugin

shapewipe

author

Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Editor/Video

Element Pads

name

mask_sink

direction

sink

presence

always

details

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)0/1

name

video_sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstShapeWipe

struct GstShapeWipe;

Property Details

The "border" property

  "border"                   gfloat                : Read / Write

Border of the mask.

Allowed values: [0,1]

Default value: 0


The "position" property

  "position"                 gfloat                : Read / Write

Position of the mask.

Allowed values: [0,1]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gdkpixbufsink.html0000644000175000017500000002013211720565335025776 00000000000000 gdkpixbufsink

gdkpixbufsink

gdkpixbufsink — Output images as GdkPixbuf objects in bus messages

Synopsis

struct              GstGdkPixbufSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstVideoSink
                           +----GstGdkPixbufSink

Properties

  "last-pixbuf"              GdkPixbuf*            : Read
  "send-messages"            gboolean              : Read / Write
  "post-messages"            gboolean              : Read / Write

Description

Synopsis

Element Information

plugin

gdkpixbuf

author

Tim-Philipp Müller <tim centricular net>

class

Sink/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstGdkPixbufSink

struct GstGdkPixbufSink;

Property Details

The "last-pixbuf" property

  "last-pixbuf"              GdkPixbuf*            : Read

Last GdkPixbuf object rendered.


The "send-messages" property

  "send-messages"            gboolean              : Read / Write

Whether to post messages containing pixbufs on the bus (deprecated, use post-messages).

Default value: TRUE


The "post-messages" property

  "post-messages"            gboolean              : Read / Write

Whether to post messages containing pixbufs on the bus.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/ch02.html0000644000175000017500000004230111720565335017005 00000000000000 gst-plugins-good Plugins

gst-plugins-good Plugins

1394Source for video data via IEEE1394 interface
aasinkASCII Art video sink
alawALaw audio conversion routines
alphaadds an alpha channel to video - constant or via chroma-keying
alphacolorRGBA from/to AYUV colorspace conversion preserving the alpha channel
annodexannodex stream manipulation (info about annodex: http://www.annodex.net)
apetagAPEv1/2 tag reader
audiofxAudio effects plugin
auparseparses au streams
autodetectPlugin contains auto-detection plugins for video/audio in- and outputs
aviAVI stream handling
cacasinkColored ASCII Art video sink
cairoCairo-based elements
cutterAudio Cutter to split audio into non-silent bits
debugelements for testing and debugging
deinterlaceDeinterlacer
directsoundDirectSound plugin
dvDV demuxer and decoder based on libdv (libdv.sf.net)
efenceThis 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 "Electric Fence".
equalizerGStreamer audio equalizers
effectveffect plugins from the effectv project
esdsinkESD Element Plugins
flacThe FLAC Lossless compressor Codec
flvFLV muxing and demuxing plugin
flxdecFLC/FLI/FLX video decoder
gconfelementselements wrapping the GStreamer/GConf audio/video output settings
gdkpixbufGdkPixbuf-based image decoder, scaler and sink
goomGOOM visualization filter
goom2k1GOOM 2k1 visualization filter
halelementselements wrapping the GStreamer/HAL audio input/output devices
icydemuxDemux ICY tags from a stream
id3demuxDemux ID3v1 and ID3v2 tags from a file
imagefreezeStill frame stream generator
interleaveAudio interleaver/deinterleaver
isomp4ISO base media file format support (mp4, 3gpp, qt, mj2)
jackJACK audio elements
jpegJPeg plugin library
levelAudio level plugin
matroskaMatroska and WebM stream handling
monoscopeMonoscope visualization
mulawMuLaw audio conversion routines
multifileReads/Writes buffers from/to sequentially named files
multipartmultipart stream manipulation
navigationtestTemplate for a video filter
oss4Open Sound System (OSS) version 4 support for GStreamer
ossaudioOSS (Open Sound System) support for GStreamer
osxaudioOSX (Mac OS X) audio support for GStreamer
osxvideoOSX native video output plugin
pngPNG plugin library
pulseaudioPulseAudio plugin library
replaygainReplayGain volume normalization
rtpReal-time protocol plugins
gstrtpmanagerRTP session management plugin library
rtsptransfer data via RTSP
shapewipeShape Wipe transition filter
shout2sendSends data to an icecast server using libshout2
smpteApply the standard SMPTE transitions on video images
souplibsoup HTTP client src/sink
spectrumRun an FFT on the audio signal, output spectrum data
speexSpeex plugin library
taglibTag writing plug-in based on taglib
udptransfer data via UDP
video4linux2elements for Video 4 Linux
videoboxresizes a video by adding borders or cropping
videocropCrops video into a user-defined region
videofilterVideo filters plugin
videomixerVideo mixer
waveformWaveForm API based plugin
wavencEncode raw audio into WAV
wavpackWavpack lossless/lossy audio format handling
wavparseParse a .wav file into raw audio
ximagesrcX11 video input plugin using standard Xlib calls
y4mencEncodes a YUV frame into the yuv4mpeg format (mjpegtools)
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html0000644000175000017500000000656711720565335025332 00000000000000 oss4

oss4

oss4 — Open Sound System (OSS) version 4 support for GStreamer

Plugin Information

filename

libgstoss4audio.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

oss4mixer

Control sound input and output levels with OSS4

oss4sink

Output to a sound card via OSS version 4

oss4src

Capture from a sound card via OSS version 4
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-alawdec.html0000644000175000017500000001247411720565335024540 00000000000000 alawdec

alawdec

alawdec — Convert 8bit A law to 16bit PCM

Synopsis

struct              GstALawDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstALawDec

Description

This element decodes alaw audio. Alaw coding is also known as G.711.

Synopsis

Element Information

plugin

alaw

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Codec/Decoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

Details

struct GstALawDec

struct GstALawDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html0000644000175000017500000001232311720565335026064 00000000000000 audiofx

audiofx

audiofx — Audio effects plugin

Plugin Information

filename

libgstaudiofx.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

audioamplify

Amplifies an audio stream by a given factor

audiochebband

Chebyshev band pass and band reject filter

audiocheblimit

Chebyshev low pass and high pass filter

audiodynamic

Compressor and Expander

audioecho

Adds an echo or reverb effect to an audio stream

audiofirfilter

Generic audio FIR filter with custom filter kernel

audioiirfilter

Generic audio IIR filter with custom filter kernel

audioinvert

Swaps upper and lower half of audio samples

audiokaraoke

Removes voice from sound

audiopanorama

Positions audio streams in the stereo panorama

audiowsincband

Band pass and band reject windowed sinc filter

audiowsinclimit

Low pass and high pass windowed sinc filter
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-videobox.html0000644000175000017500000006062411720565335024757 00000000000000 videobox

videobox

videobox — Resizes a video by adding borders or cropping

Synopsis

struct              GstVideoBox;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoBox

Properties

  "alpha"                    gdouble               : Read / Write
  "border-alpha"             gdouble               : Read / Write
  "bottom"                   gint                  : Read / Write
  "fill"                     GstVideoBoxFill       : Read / Write
  "left"                     gint                  : Read / Write
  "right"                    gint                  : Read / Write
  "top"                      gint                  : Read / Write
  "autocrop"                 gboolean              : Read / Write

Description

This plugin crops or enlarges the image. It takes 4 values as input, a top, bottom, left and right offset. Positive values will crop that much pixels from the respective border of the image, negative values will add that much pixels. When pixels are added, you can specify their color. Some predefined colors are usable with an enum property.

The plugin is alpha channel aware and will try to negotiate with a format that supports alpha channels first. When alpha channel is active two other properties, alpha and border_alpha can be used to set the alpha values of the inner picture and the border respectively. an alpha value of 0.0 means total transparency, 1.0 is opaque.

The videobox plugin has many uses such as doing a mosaic of pictures, letterboxing video, cutting out pieces of video, picture in picture, etc..

Setting autocrop to true changes the behavior of the plugin so that caps determine crop properties rather than the other way around: given input and output dimensions, the crop values are selected so that the smaller frame is effectively centered in the larger frame. This involves either cropping or padding.

If you use autocrop there is little point in setting the other properties manually because they will be overriden if the caps change, but nothing stops you from doing so.

Sample pipeline:

1
2
gst-launch videotestsrc ! videobox autocrop=true ! \
  "video/x-raw-yuv, width=600, height=400" ! ffmpegcolorspace ! ximagesink

Synopsis

Element Information

plugin

videobox

author

Wim Taymans <wim@fluendo.com>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, alpha_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y444, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y42B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YVYU, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)YV12, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc)Y41B, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)4321, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)16, depth=(int)16, endianness=(int)1234, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstVideoBox

struct GstVideoBox;

Property Details

The "alpha" property

  "alpha"                    gdouble               : Read / Write

Alpha value picture.

Allowed values: [0,1]

Default value: 1


The "border-alpha" property

  "border-alpha"             gdouble               : Read / Write

Alpha value of the border.

Allowed values: [0,1]

Default value: 1


The "bottom" property

  "bottom"                   gint                  : Read / Write

Pixels to box at bottom (<0 = add a border).

Default value: 0


The "fill" property

  "fill"                     GstVideoBoxFill       : Read / Write

How to fill the borders.

Default value: Black


The "left" property

  "left"                     gint                  : Read / Write

Pixels to box at left (<0 = add a border).

Default value: 0


The "right" property

  "right"                    gint                  : Read / Write

Pixels to box at right (<0 = add a border).

Default value: 0


The "top" property

  "top"                      gint                  : Read / Write

Pixels to box at top (<0 = add a border).

Default value: 0


The "autocrop" property

  "autocrop"                 gboolean              : Read / Write

If set to TRUE videobox will automatically crop/pad the input video to be centered in the output.

Default value: FALSE

Since 0.10.16

See Also

GstVideoCrop
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-matroskamux.html0000644000175000017500000004273711720565335025520 00000000000000 matroskamux

matroskamux

matroskamux — Muxes video/audio/subtitle streams into a matroska stream

Synopsis

                    GstMatroskaMux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMatroskaMux
                     +----GstWebMMux

Implemented Interfaces

GstMatroskaMux implements GstTagSetter.

Properties

  "writing-app"              gchar*                : Read / Write
  "version"                  gint                  : Read / Write
  "min-index-interval"       gint64                : Read / Write
  "streamable"               gboolean              : Read / Write

Description

matroskamux muxes different input streams into a Matroska file.

Example launch line

1
gst-launch -v filesrc location=/path/to/mp3 ! mp3parse ! matroskamux name=mux ! filesink location=test.mkv  filesrc location=/path/to/theora.ogg ! oggdemux ! theoraparse ! mux.
This pipeline muxes an MP3 file and a Ogg Theora video into a Matroska file.
1
gst-launch -v audiotestsrc num-buffers=100 ! audioconvert ! vorbisenc ! matroskamux ! filesink location=test.mka
This pipeline muxes a 440Hz sine wave encoded with the Vorbis codec into a Matroska file.

Synopsis

Element Information

plugin

matroska

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Codec/Muxer

Element Pads

name

audio_%d

direction

sink

presence

request

details

audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]

audio/mpeg, mpegversion=(int){ 2, 4 }, stream-format=(string)raw, 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 ]

audio/x-alaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]

audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int)[ 8000, 192000 ]

name

subtitle_%d

direction

sink

presence

request

details

subtitle/x-kate

name

video_%d

direction

sink

presence

request

details

video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h264, stream-format=(string)avc, alignment=(string)au, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-dv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]

video/x-theora

video/x-dirac, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-pn-realvideo, rmversion=(int)[ 1, 4 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-vp8, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-yuv, format=(fourcc){ YUY2, I420, YV12, UYVY, AYUV }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-wmv, wmvversion=(int)[ 1, 3 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-matroska

Details

GstMatroskaMux

typedef struct _GstMatroskaMux GstMatroskaMux;

Property Details

The "writing-app" property

  "writing-app"              gchar*                : Read / Write

The name the application that creates the matroska file.

Default value: NULL


The "version" property

  "version"                  gint                  : Read / Write

This parameter determines what Matroska features can be used.

Allowed values: [1,2]

Default value: 2


The "min-index-interval" property

  "min-index-interval"       gint64                : Read / Write

An index entry is created every so many nanoseconds.

Allowed values: >= 0

Default value: 0


The "streamable" property

  "streamable"               gboolean              : Read / Write

If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written.

Default value: FALSE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-waveform.html0000644000175000017500000000566611720565335026267 00000000000000 waveform

waveform

waveform — WaveForm API based plugin

Plugin Information

filename

libgstwaveform.dll

version

0.10.4.1

run-time license

LGPL

package

GStreamer Good Plug-ins CVS

origin

Unknown package origin

Elements

waveformsink

WaveForm audio sink
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-dvdemux.html0000644000175000017500000001330211720565335024603 00000000000000 dvdemux

dvdemux

dvdemux — Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)

Synopsis

struct              GstDVDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstDVDemux

Description

Synopsis

Element Information

plugin

dv

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>

class

Codec/Demuxer

Element Pads

name

sink

direction

sink

presence

always

details

video/x-dv, systemstream=(boolean)true

name

audio

direction

source

presence

sometimes

details

audio/x-raw-int, depth=(int)16, width=(int)16, signed=(boolean)true, channels=(int){ 2, 4 }, endianness=(int)1234, rate=(int){ 32000, 44100, 48000 }

name

video

direction

source

presence

sometimes

details

video/x-dv, systemstream=(boolean)false

Details

struct GstDVDemux

struct GstDVDemux;

gst-plugins-good-0.10.31/docs/plugins/html/right.png0000644000175000017500000000073011720565335017206 00000000000000PNG  IHDRw=bKGD pHYs  ~tIME2 I%=eIDATx!o@.'**M0$$?1~vIeEuLl&4䝠Bݛ|>$ݶoc gstrtpmanager

gstrtpmanager

gstrtpmanager — RTP session management plugin library

Plugin Information

filename

libgstrtpmanager.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

gstrtpbin

Real-Time Transport Protocol bin

gstrtpjitterbuffer

A buffer that deals with network jitter and other transmission faults

gstrtpptdemux

Parses codec streams transmitted in the same RTP session

gstrtpsession

Implement an RTP session

gstrtpssrcdemux

Splits RTP streams based on the SSRC
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-multifilesrc.html0000644000175000017500000003016511720565335025637 00000000000000 multifilesrc

multifilesrc

multifilesrc — Read a sequentially named set of files into buffers

Synopsis

struct              GstMultiFileSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstMultiFileSrc

Properties

  "caps"                     GstCaps*              : Read / Write
  "index"                    gint                  : Read / Write
  "location"                 gchar*                : Read / Write
  "loop"                     gboolean              : Read / Write
  "start-index"              gint                  : Read / Write
  "stop-index"               gint                  : Read / Write

Description

Reads buffers from sequentially named files. If used together with an image decoder, one needs to use the "caps" property or a capsfilter to force to caps containing a framerate. Otherwise image decoders send EOS after the first picture.

File names are created by replacing "%d" with the index using printf().

Example launch line

1
2
3
gst-launch multifilesrc location="img.%04d.png" index=0 caps="image/png,framerate=\(fraction\)12/1" ! \
    pngdec ! ffmpegcolorspace ! theoraenc ! oggmux ! \
    filesink location="images.ogg"
This pipeline creates a video file "images.ogg" by joining multiple PNG files named img.0000.png, img.0001.png, etc.

Synopsis

Element Information

plugin

multifile

author

David Schleef <ds@schleef.org>

class

Source/File

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

struct GstMultiFileSrc

struct GstMultiFileSrc;

Property Details

The "caps" property

  "caps"                     GstCaps*              : Read / Write

Caps describing the format of the data.


The "index" property

  "index"                    gint                  : Read / Write

Index to use with location property to create file names. The index is incremented by one for each buffer read.

Allowed values: >= 0

Default value: 0


The "location" property

  "location"                 gchar*                : Read / Write

Pattern to create file names of input files. File names are created by calling sprintf() with the pattern and the current index.

Default value: "%05d"


The "loop" property

  "loop"                     gboolean              : Read / Write

Whether to repeat from the beginning when all files have been read.

Default value: FALSE


The "start-index" property

  "start-index"              gint                  : Read / Write

Start value of index. The initial value of index can be set either by setting index or start-index. When the end of the loop is reached, the index will be set to the value start-index.

Allowed values: >= 0

Default value: 0


The "stop-index" property

  "stop-index"               gint                  : Read / Write

Stop value of index. The special value -1 means no stop.

Allowed values: >= G_MAXULONG

Default value: 0

See Also

GstFileSrc
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flvdemux.html0000644000175000017500000002020111720565335024755 00000000000000 flvdemux

flvdemux

flvdemux — Demux FLV feeds into digital streams

Synopsis

struct              GstFlvDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstFlvDemux

Description

flvdemux demuxes an FLV file into the different contained streams.

Example launch line

1
gst-launch -v filesrc location=/path/to/flv ! flvdemux ! audioconvert ! autoaudiosink
This pipeline demuxes an FLV file and outputs the contained raw audio streams.

Synopsis

Element Information

plugin

flv

author

Julien Moutte <julien@moutte.net>

class

Codec/Demuxer

Element Pads

name

sink

direction

sink

presence

always

details

video/x-flv

name

audio

direction

source

presence

sometimes

details

audio/x-adpcm, layout=(string)swf, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

audio/mpeg, mpegversion=(int)1, layer=(int)3, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 22050, 44100 }, parsed=(boolean)true

audio/mpeg, mpegversion=(int)4, stream-format=(string)raw, framed=(boolean)true

audio/x-nellymoser, channels=(int){ 1, 2 }, rate=(int){ 5512, 8000, 11025, 16000, 22050, 44100 }

audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)8, depth=(int)8, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)false

audio/x-raw-int, endianness=(int)1234, channels=(int){ 1, 2 }, width=(int)16, depth=(int)16, rate=(int){ 5512, 11025, 22050, 44100 }, signed=(boolean)true

audio/x-alaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

audio/x-mulaw, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

audio/x-speex, channels=(int){ 1, 2 }, rate=(int){ 5512, 11025, 22050, 44100 }

name

video

direction

source

presence

sometimes

details

video/x-flash-video

video/x-flash-screen

video/x-vp6-flash

video/x-vp6-alpha

video/x-h264, stream-format=(string)avc

Details

struct GstFlvDemux

struct GstFlvDemux;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flacdec.html0000644000175000017500000001225711720565335024520 00000000000000 flacdec

flacdec

flacdec — Decodes FLAC lossless audio streams

Synopsis

struct              GstFlacDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstFlacDec

Description

Synopsis

Element Information

plugin

flac

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-flac

name

src

direction

source

presence

always

details

audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 8, 16, 32 }, depth=(int)[ 4, 32 ], rate=(int)[ 1, 655350 ], channels=(int)[ 1, 8 ]

Details

struct GstFlacDec

struct GstFlacDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-monoscope.html0000644000175000017500000000571111720565335026432 00000000000000 monoscope

monoscope

monoscope — Monoscope visualization

Plugin Information

filename

libgstmonoscope.so

version

0.10.30.1

run-time license

LGPL

package

GStreamer Good Plug-ins git

origin

Unknown package origin

Elements

monoscope

Displays a highly stabilised waveform of audio input
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gconfvideosrc.html0000644000175000017500000001211311720565335025761 00000000000000 gconfvideosrc

gconfvideosrc

gconfvideosrc — Video source embedding the GConf-settings for video input

Synopsis

                    GstGConfVideoSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstSwitchSrc
                           +----GstGConfVideoSrc

Implemented Interfaces

GstGConfVideoSrc implements GstChildProxy.

Description

Synopsis

Element Information

plugin

gconfelements

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Source/Video

Element Pads

Details

GstGConfVideoSrc

typedef struct _GstGConfVideoSrc GstGConfVideoSrc;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-cmmlenc.html0000644000175000017500000001677111720565335024562 00000000000000 cmmlenc

cmmlenc

cmmlenc — Encodes CMML streams

Synopsis

struct              GstCmmlEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstCmmlEnc

Properties

  "granule-rate-denominator" gint64                : Read / Write / Construct
  "granule-rate-numerator"   gint64                : Read / Write / Construct
  "granule-shift"            guchar                : Read / Write / Construct

Description

Synopsis

Element Information

plugin

annodex

author

Alessandro Decina <alessandro@nnva.org>

class

Codec/Encoder

Element Pads

name

sink

direction

sink

presence

always

details

text/x-cmml, encoded=(boolean)false

name

src

direction

source

presence

always

details

text/x-cmml, encoded=(boolean)true

Details

struct GstCmmlEnc

struct GstCmmlEnc;

Property Details

The "granule-rate-denominator" property

  "granule-rate-denominator" gint64                : Read / Write / Construct

Granulerate denominator.

Allowed values: >= 0

Default value: 1


The "granule-rate-numerator" property

  "granule-rate-numerator"   gint64                : Read / Write / Construct

Granulerate numerator.

Allowed values: >= 0

Default value: 1000


The "granule-shift" property

  "granule-shift"            guchar                : Read / Write / Construct

The number of lower bits to use for partitioning a granule position.

Allowed values: <= 64

Default value: 32

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-monoscope.html0000644000175000017500000001462511720565335025142 00000000000000 monoscope

monoscope

monoscope — Displays a highly stabilised waveform of audio input

Synopsis

struct              GstMonoscope;

Description

Monoscope is an audio visualisation element. It creates a coloured curve of the audio signal like on an oscilloscope.

Example launch line

1
gst-launch -v audiotestsrc ! audioconvert ! monoscope ! ffmpegcolorspace ! ximagesink

Synopsis

Element Information

plugin

monoscope

author

Richard Boulton <richard@tartarus.org>

class

Visualization

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstMonoscope

struct GstMonoscope {
  GstElement element;

  /* pads */
  GstPad      *sinkpad;
  GstPad      *srcpad;

  GstAdapter  *adapter;

  guint64      next_ts;             /* expected timestamp of the next frame */
  guint64      frame_duration;      /* video frame duration    */
  gint         rate;                /* sample rate             */
  guint        bps;                 /* bytes per sample        */
  guint        spf;                 /* samples per video frame */

  GstSegment   segment;

  /* QoS stuff *//* with LOCK */
  gdouble      proportion;
  GstClockTime earliest_time;

  /* video state */
  gint         fps_num;
  gint         fps_denom;
  gint         width;
  gint         height;
  guint        outsize;

  /* visualisation state */
  struct monoscope_state *visstate;
};

See Also

goom
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audioinvert.html0000644000175000017500000002167511720565335025474 00000000000000 audioinvert

audioinvert

audioinvert — Swaps upper and lower half of audio samples

Synopsis

struct              GstAudioInvert;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioInvert

Properties

  "degree"                   gfloat                : Read / Write

Description

Swaps upper and lower half of audio samples. Mixing an inverted sample on top of the original with a slight delay can produce effects that sound like resonance. Creating a stereo sample from a mono source, with one channel inverted produces wide-stereo sounds.

Example launch line

1
2
3
gst-launch audiotestsrc wave=saw ! audioinvert invert=0.4 ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioinvert invert=0.4 ! alsasink
gst-launch audiotestsrc wave=saw ! audioconvert ! audioinvert invert=0.4 ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Sebastian Dröge <slomo@circular-chaos.org>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioInvert

struct GstAudioInvert;

Property Details

The "degree" property

  "degree"                   gfloat                : Read / Write

Degree of inversion.

Allowed values: [0,1]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-optv.html0000644000175000017500000002302711720565335024124 00000000000000 optv

optv

optv — Optical art meets real-time video effect

Synopsis

struct              GstOpTV;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstVideoFilter
                           +----GstOpTV

Properties

  "mode"                     GstOpTVMode           : Read / Write
  "speed"                    gint                  : Read / Write
  "threshold"                guint                 : Read / Write

Description

Traditional black-white optical animation is now resurrected as a real-time video effect. Input images are binarized and combined with various optical pattern.

Example launch line

1
gst-launch -v videotestsrc ! optv ! ffmpegcolorspace ! autovideosink
This pipeline shows the effect of optv on a test stream.

Synopsis

Element Information

plugin

effectv

author

FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstOpTV

struct GstOpTV;

Property Details

The "mode" property

  "mode"                     GstOpTVMode           : Read / Write

Mode.

Default value: Maelstrom


The "speed" property

  "speed"                    gint                  : Read / Write

Effect speed.

Default value: 16


The "threshold" property

  "threshold"                guint                 : Read / Write

Luma threshold.

Allowed values: <= G_MAXINT

Default value: 60

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html0000644000175000017500000000643611720565335025342 00000000000000 flac

flac

flac — The FLAC Lossless compressor Codec

Plugin Information

filename

libgstflac.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

flacdec

Decodes FLAC lossless audio streams

flacenc

Encodes audio with the FLAC lossless audio encoder

flactag

Rewrite tags in a FLAC file
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-pngenc.html0000644000175000017500000001731311720565335024407 00000000000000 pngenc

pngenc

pngenc — Encode a video frame to a .png image

Synopsis

struct              GstPngEnc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstPngEnc

Properties

  "compression-level"        guint                 : Read / Write
  "snapshot"                 gboolean              : Read / Write

Description

Synopsis

Element Information

plugin

png

author

Jeremy SIMON <jsimon13@yahoo.fr>

class

Codec/Encoder/Image

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, alpha_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw-gray, bpp=(int)8, depth=(int)8, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name

src

direction

source

presence

always

details

image/png, width=(int)[ 16, 1000000 ], height=(int)[ 16, 1000000 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstPngEnc

struct GstPngEnc;

Property Details

The "compression-level" property

  "compression-level"        guint                 : Read / Write

PNG compression level.

Allowed values: <= 9

Default value: 6


The "snapshot" property

  "snapshot"                 gboolean              : Read / Write

Send EOS after encoding a frame, useful for snapshots.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html0000644000175000017500000000622211720565335026762 00000000000000 video4linux2

video4linux2

video4linux2 — elements for Video 4 Linux

Plugin Information

filename

libgstvideo4linux2.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

v4l2radio

Controls a Video4Linux2 radio device

v4l2src

Reads frames from a Video4Linux2 device
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-mpegaudioparse.html0000644000175000017500000001501011720565335026132 00000000000000 mpegaudioparse

mpegaudioparse

mpegaudioparse — MPEG audio parser

Synopsis

struct              GstMpegAudioParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseParse
                     +----GstMpegAudioParse

Description

Parses and frames mpeg1 audio streams. Provides seeking.

Example launch line

1
gst-launch filesrc location=test.mp3 ! mpegaudioparse ! mad ! autoaudiosink

Synopsis

Element Information

plugin

audioparsers

author

Jan Schmidt <thaytan@mad.scientist.com>,Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>

class

Codec/Parser/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/mpeg, mpegversion=(int)1

name

src

direction

source

presence

always

details

audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], mpegaudioversion=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], parsed=(boolean)true

Details

struct GstMpegAudioParse

struct GstMpegAudioParse;

The opaque GstMpegAudioParse object

See Also

GstAmrParse, GstAACParse
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-osxaudiosrc.html0000644000175000017500000001156211720565335025500 00000000000000 osxaudiosrc

osxaudiosrc

osxaudiosrc — Input from a sound card in OS X

Synopsis

struct              GstOsxAudioSrc;

Properties

  "device"                   gint                  : Read / Write

Description

Synopsis

Element Information

plugin

osxaudio

author

Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Source/Audio

Element Pads

Details

struct GstOsxAudioSrc

struct GstOsxAudioSrc {
  GstBaseAudioSrc src;

  AudioDeviceID device_id;

  /* actual number of channels reported by input device */
  int deviceChannels;
};

Property Details

The "device" property

  "device"                   gint                  : Read / Write

Device ID of input device.

Allowed values: >= 0

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-osssrc.html0000644000175000017500000002003311720565335024442 00000000000000 osssrc

osssrc

osssrc — Capture from a sound card via OSS

Synopsis

struct              GstOssSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstBaseAudioSrc
                                 +----GstAudioSrc
                                       +----GstOssSrc

Implemented Interfaces

GstOssSrc implements GstImplementsInterface and GstMixer.

Properties

  "device"                   gchar*                : Read / Write
  "device-name"              gchar*                : Read

Description

Synopsis

Element Information

plugin

ossaudio

author

Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>

class

Source/Audio

Element Pads

name

src

direction

source

presence

always

details

audio/x-raw-int, endianness=(int){ 1234 }, signed=(boolean){ true, false }, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

audio/x-raw-int, signed=(boolean){ true, false }, width=(int)8, depth=(int)8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]

Details

struct GstOssSrc

struct GstOssSrc;

Property Details

The "device" property

  "device"                   gchar*                : Read / Write

OSS device (usually /dev/dspN).

Default value: "/dev/dsp"


The "device-name" property

  "device-name"              gchar*                : Read

Human-readable name of the sound device.

Default value: ""

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html0000644000175000017500000000566711720565335027501 00000000000000 navigationtest

navigationtest

navigationtest — Template for a video filter

Plugin Information

filename

libgstnavigationtest.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

navigationtest

Handle navigation events showing a black square following mouse pointer
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-equalizer-3bands.html0000644000175000017500000002545411720565335026313 00000000000000 equalizer-3bands

equalizer-3bands

equalizer-3bands — Direct Form 3 band IIR equalizer

Synopsis

struct              GstIirEqualizer3Bands;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstIirEqualizer
                                 +----GstIirEqualizer3Bands

Implemented Interfaces

GstIirEqualizer3Bands implements GstChildProxy and GstPreset.

Properties

  "band0"                    gdouble               : Read / Write
  "band1"                    gdouble               : Read / Write
  "band2"                    gdouble               : Read / Write

Description

The 3-band equalizer element allows to change the gain of a low frequency, medium frequency and high frequency band.

Example launch line

1
gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-3bands band1=6.0 ! alsasink
This raises the volume of the 2nd band, which is at 1110 Hz, by 6 db.

Synopsis

Element Information

plugin

equalizer

author

Stefan Kost <ensonic@users.sf.net>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-int, depth=(int)16, width=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1000, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstIirEqualizer3Bands

struct GstIirEqualizer3Bands;

Property Details

The "band0" property

  "band0"                    gdouble               : Read / Write

gain for the frequency band 100 Hz, ranging from -24.0 to +12.0.

Allowed values: [-24,12]

Default value: 0


The "band1" property

  "band1"                    gdouble               : Read / Write

gain for the frequency band 1100 Hz, ranging from -24.0 to +12.0.

Allowed values: [-24,12]

Default value: 0


The "band2" property

  "band2"                    gdouble               : Read / Write

gain for the frequency band 11 kHz, ranging from -24.0 to +12.0.

Allowed values: [-24,12]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gstrtpsession.html0000644000175000017500000013021211720565335026056 00000000000000 gstrtpsession

gstrtpsession

gstrtpsession — Implement an RTP session

Synopsis

struct              GstRtpSession;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstRtpSession

Properties

  "bandwidth"                gdouble               : Read / Write
  "internal-session"         RTPSession*           : Read
  "ntp-ns-base"              guint64               : Read / Write
  "num-active-sources"       guint                 : Read
  "num-sources"              guint                 : Read
  "rtcp-fraction"            gdouble               : Read / Write
  "sdes"                     GstStructure*         : Read / Write
  "rtcp-rr-bandwidth"        gint                  : Read / Write
  "rtcp-rs-bandwidth"        gint                  : Read / Write
  "use-pipeline-clock"       gboolean              : Read / Write
  "rtcp-min-interval"        guint64               : Read / Write

Description

The RTP session manager models one participant with a unique SSRC in an RTP session. This session can be used to send and receive RTP and RTCP packets. Based on what REQUEST pads are requested from the session manager, specific functionality can be activated.

The session manager currently implements RFC 3550 including:

  • RTP packet validation based on consecutive sequence numbers.

  • Maintainance of the SSRC participant database.

  • Keeping per participant statistics based on received RTCP packets.

  • Scheduling of RR/SR RTCP packets.

The gstrtpsession will not demux packets based on SSRC or payload type, nor will it correct for packet reordering and jitter. Use GstRtpsSrcDemux, GstRtpPtDemux and GstRtpJitterBuffer in addition to GstRtpSession to perform these tasks. It is usually a good idea to use GstRtpBin, which combines all these features in one element.

To use GstRtpSession as an RTP receiver, request a recv_rtp_sink pad, which will automatically create recv_rtp_src pad. Data received on the recv_rtp_sink pad will be processed in the session and after being validated forwarded on the recv_rtp_src pad.

To also use GstRtpSession as an RTCP receiver, request a recv_rtcp_sink pad, which will automatically create a sync_src pad. Packets received on the RTCP pad will be used by the session manager to update the stats and database of the other participants. SR packets will be forwarded on the sync_src pad so that they can be used to perform inter-stream synchronisation when needed.

If you want the session manager to generate and send RTCP packets, request the send_rtcp_src pad. Packet pushed on this pad contain SR/RR RTCP reports that should be sent to all participants in the session.

To use GstRtpSession as a sender, request a send_rtp_sink pad, which will automatically create a send_rtp_src pad. The session manager will modify the SSRC in the RTP packets to its own SSRC and wil forward the packets on the send_rtp_src pad after updating its internal state.

The session manager needs the clock-rate of the payload types it is handling and will signal the "request-pt-map" signal when it needs such a mapping. One can clear the cached values with the "clear-pt-map" signal.

Example pipelines

1
gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink
Receive theora RTP packets from port 5000 and send them to the depayloader, decoder and display. Note that the application/x-rtp caps on udpsrc should be configured based on some negotiation process such as RTSP for this pipeline to work correctly.
1
2
3
gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession name=session \
       .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink \
    udpsrc port=5001 caps="application/x-rtcp" ! session.recv_rtcp_sink
Receive theora RTP packets from port 5000 and send them to the depayloader, decoder and display. Receive RTCP packets from port 5001 and process them in the session manager. Note that the application/x-rtp caps on udpsrc should be configured based on some negotiation process such as RTSP for this pipeline to work correctly.
1
gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession .send_rtp_src ! udpsink port=5000
Send theora RTP packets through the session manager and out on UDP port 5000.
1
2
gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession name=session .send_rtp_src \
    ! udpsink port=5000  session.send_rtcp_src ! udpsink port=5001
Send theora RTP packets through the session manager and out on UDP port 5000. Send RTCP packets on port 5001. Note that this pipeline will not preroll correctly because the second udpsink will not preroll correctly (no RTCP packets are sent in the PAUSED state). Applications should manually set and keep (see gst_element_set_locked_state()) the RTCP udpsink to the PLAYING state.

Last reviewed on 2007-05-28 (0.10.5)

Synopsis

Element Information

plugin

gstrtpmanager

author

Wim Taymans <wim.taymans@gmail.com>

class

Filter/Network/RTP

Element Pads

name

recv_rtcp_sink

direction

sink

presence

request

details

application/x-rtcp

name

recv_rtp_sink

direction

sink

presence

request

details

application/x-rtp

name

send_rtp_sink

direction

sink

presence

request

details

application/x-rtp

name

recv_rtp_src

direction

source

presence

sometimes

details

application/x-rtp

name

send_rtp_src

direction

source

presence

sometimes

details

application/x-rtp

name

sync_src

direction

source

presence

sometimes

details

application/x-rtcp

name

send_rtcp_src

direction

source

presence

request

details

application/x-rtcp

Details

struct GstRtpSession

struct GstRtpSession;

Property Details

The "bandwidth" property

  "bandwidth"                gdouble               : Read / Write

The bandwidth of the session in bytes per second (0 for auto-discover).

Allowed values: >= 0

Default value: 64000


The "internal-session" property

  "internal-session"         RTPSession*           : Read

The internal RTPSession object.


The "ntp-ns-base" property

  "ntp-ns-base"              guint64               : Read / Write

The NTP base time corresponding to running_time 0 (deprecated).

Default value: 0


The "num-active-sources" property

  "num-active-sources"       guint                 : Read

The number of active sources in the session.

Default value: 0


The "num-sources" property

  "num-sources"              guint                 : Read

The number of sources in the session.

Default value: 0


The "rtcp-fraction" property

  "rtcp-fraction"            gdouble               : Read / Write

The RTCP bandwidth of the session in bytes per second (or as a real fraction of the RTP bandwidth if < 1.0).

Allowed values: >= 0

Default value: 3200


The "sdes" property

  "sdes"                     GstStructure*         : Read / Write

The SDES items of this session.


The "rtcp-rr-bandwidth" property

  "rtcp-rr-bandwidth"        gint                  : Read / Write

The RTCP bandwidth used for receivers in bytes per second (-1 = default).

Allowed values: >= G_MAXULONG

Default value: -1


The "rtcp-rs-bandwidth" property

  "rtcp-rs-bandwidth"        gint                  : Read / Write

The RTCP bandwidth used for senders in bytes per second (-1 = default).

Allowed values: >= G_MAXULONG

Default value: -1


The "use-pipeline-clock" property

  "use-pipeline-clock"       gboolean              : Read / Write

Use the pipeline clock to set the NTP time in the RTCP SR messages.

Default value: FALSE


The "rtcp-min-interval" property

  "rtcp-min-interval"        guint64               : Read / Write

Minimum interval between Regular RTCP packet (in ns).

Default value: 5000000000

Signal Details

The "clear-pt-map" signal

void                user_function                      (GstRtpSession *sess,
                                                        gpointer       user_data)      : Action

Clear the cached pt-maps requested with "request-pt-map".

sess :

the object which received the signal

user_data :

user data set when the signal handler was connected.

The "on-bye-ssrc" signal

void                user_function                      (GstRtpSession *sess,
                                                        guint          ssrc,
                                                        gpointer       user_data)      : Run Last

Notify of an SSRC that became inactive because of a BYE packet.

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-bye-timeout" signal

void                user_function                      (GstRtpSession *sess,
                                                        guint          ssrc,
                                                        gpointer       user_data)      : Run Last

Notify of an SSRC that has timed out because of BYE

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-new-ssrc" signal

void                user_function                      (GstRtpSession *sess,
                                                        guint          ssrc,
                                                        gpointer       user_data)      : Run Last

Notify of a new SSRC that entered session.

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-sender-timeout" signal

void                user_function                      (GstRtpSession *sess,
                                                        guint          ssrc,
                                                        gpointer       user_data)      : Run Last

Notify of a sender SSRC that has timed out and became a receiver

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-active" signal

void                user_function                      (GstRtpSession *gstrtpsession,
                                                        guint          arg1,
                                                        gpointer       user_data)          : Run Last

gstrtpsession :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "on-ssrc-collision" signal

void                user_function                      (GstRtpSession *gstrtpsession,
                                                        guint          arg1,
                                                        gpointer       user_data)          : Run Last

gstrtpsession :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "on-ssrc-sdes" signal

void                user_function                      (GstRtpSession *session,
                                                        guint          src,
                                                        gpointer       user_data)      : Run Last

Notify that a new SDES was received for SSRC.

session :

the object which received the signal

src :

the SSRC

user_data :

user data set when the signal handler was connected.

The "on-ssrc-validated" signal

void                user_function                      (GstRtpSession *gstrtpsession,
                                                        guint          arg1,
                                                        gpointer       user_data)          : Run Last

gstrtpsession :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "on-timeout" signal

void                user_function                      (GstRtpSession *sess,
                                                        guint          ssrc,
                                                        gpointer       user_data)      : Run Last

Notify of an SSRC that has timed out

sess :

the object which received the signal

ssrc :

the SSRC

user_data :

user data set when the signal handler was connected.

The "request-pt-map" signal

GstCaps*            user_function                      (GstRtpSession *sess,
                                                        guint          pt,
                                                        gpointer       user_data)      : Run Last

Request the payload type as GstCaps for pt.

sess :

the object which received the signal

pt :

the pt

user_data :

user data set when the signal handler was connected.

See Also

gstrtpjitterbuffer, gstrtpbin, gstrtpptdemux, gstrtpssrcdemux
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html0000644000175000017500000000705711720565335025532 00000000000000 cairo

cairo

cairo — Cairo-based elements

Plugin Information

filename

libgstcairo.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

cairooverlay

Render overlay on a video stream using Cairo

cairorender

Encodes streams using Cairo

cairotextoverlay

Adds text strings on top of a video buffer

cairotimeoverlay

Overlays the time on a video stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-souphttpsrc.html0000644000175000017500000004411311720565335025531 00000000000000 souphttpsrc

souphttpsrc

souphttpsrc — Receive data as a client over the network via HTTP using SOUP

Synopsis

struct              GstSoupHTTPSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstSoupHTTPSrc

Implemented Interfaces

GstSoupHTTPSrc implements GstURIHandler.

Properties

  "automatic-redirect"       gboolean              : Read / Write
  "cookies"                  GStrv                 : Read / Write
  "iradio-genre"             gchar*                : Read
  "iradio-mode"              gboolean              : Read / Write
  "iradio-name"              gchar*                : Read
  "iradio-title"             gchar*                : Read
  "iradio-url"               gchar*                : Read
  "location"                 gchar*                : Read / Write
  "proxy"                    gchar*                : Read / Write
  "user-agent"               gchar*                : Read / Write
  "is-live"                  gboolean              : Read / Write
  "proxy-id"                 gchar*                : Read / Write
  "proxy-pw"                 gchar*                : Read / Write
  "user-id"                  gchar*                : Read / Write
  "user-pw"                  gchar*                : Read / Write
  "extra-headers"            GstStructure*         : Read / Write
  "timeout"                  guint                 : Read / Write

Description

Synopsis

Element Information

plugin

soup

author

Wouter Cloetens <wouter@mind.be>

class

Source/Network

Element Pads

name

src

direction

source

presence

always

details

ANY

Details

struct GstSoupHTTPSrc

struct GstSoupHTTPSrc;

Property Details

The "automatic-redirect" property

  "automatic-redirect"       gboolean              : Read / Write

Automatically follow HTTP redirects (HTTP Status Code 3xx).

Default value: TRUE


The "cookies" property

  "cookies"                  GStrv                 : Read / Write

HTTP request cookies.


The "iradio-genre" property

  "iradio-genre"             gchar*                : Read

Genre of the stream.

Default value: NULL


The "iradio-mode" property

  "iradio-mode"              gboolean              : Read / Write

Enable internet radio mode (extraction of shoutcast/icecast metadata).

Default value: FALSE


The "iradio-name" property

  "iradio-name"              gchar*                : Read

Name of the stream.

Default value: NULL


The "iradio-title" property

  "iradio-title"             gchar*                : Read

Name of currently playing song.

Default value: NULL


The "iradio-url" property

  "iradio-url"               gchar*                : Read

Homepage URL for radio stream.

Default value: NULL


The "location" property

  "location"                 gchar*                : Read / Write

Location to read from.

Default value: ""


The "proxy" property

  "proxy"                    gchar*                : Read / Write

HTTP proxy server URI.

Default value: ""


The "user-agent" property

  "user-agent"               gchar*                : Read / Write

Value of the User-Agent HTTP request header field.

Default value: "GStreamer souphttpsrc "


The "is-live" property

  "is-live"                  gboolean              : Read / Write

Act like a live source.

Default value: FALSE


The "proxy-id" property

  "proxy-id"                 gchar*                : Read / Write

HTTP proxy URI user id for authentication.

Default value: ""


The "proxy-pw" property

  "proxy-pw"                 gchar*                : Read / Write

HTTP proxy URI user password for authentication.

Default value: ""


The "user-id" property

  "user-id"                  gchar*                : Read / Write

HTTP location URI user id for authentication.

Default value: ""


The "user-pw" property

  "user-pw"                  gchar*                : Read / Write

HTTP location URI user password for authentication.

Default value: ""


The "extra-headers" property

  "extra-headers"            GstStructure*         : Read / Write

Extra headers to append to the HTTP request.


The "timeout" property

  "timeout"                  guint                 : Read / Write

Value in seconds to timeout a blocking I/O (0 = No timeout).

Allowed values: <= 3600

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-dv1394src.html0000644000175000017500000003311511720565335024575 00000000000000 dv1394src

dv1394src

dv1394src — Source for DV video data from firewire port

Synopsis

struct              GstDV1394Src;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstDV1394Src

Implemented Interfaces

GstDV1394Src implements GstURIHandler and GstPropertyProbe.

Properties

  "channel"                  gint                  : Read / Write
  "consecutive"              gint                  : Read / Write
  "drop-incomplete"          gboolean              : Read / Write
  "guid"                     guint64               : Read / Write
  "port"                     gint                  : Read / Write
  "skip"                     gint                  : Read / Write
  "use-avc"                  gboolean              : Read / Write
  "device-name"              gchar*                : Read

Signals

  "frame-dropped"                                  : Run Last

Description

Synopsis

Element Information

plugin

1394

author

Erik Walthinsen <omega@temple-baptist.com>, Daniel Fischer <dan@f3c.com>, Wim Taymans <wim@fluendo.com>, Zaheer Abbas Merali <zaheerabbas at merali dot org>

class

Source/Video

Element Pads

name

src

direction

source

presence

always

details

video/x-dv, format=(string){ NTSC, PAL }, systemstream=(boolean)true

Details

struct GstDV1394Src

struct GstDV1394Src;

Property Details

The "channel" property

  "channel"                  gint                  : Read / Write

Channel number for listening.

Allowed values: [0,64]

Default value: 63


The "consecutive" property

  "consecutive"              gint                  : Read / Write

send n consecutive frames after skipping.

Allowed values: >= 1

Default value: 1


The "drop-incomplete" property

  "drop-incomplete"          gboolean              : Read / Write

drop incomplete frames.

Default value: TRUE


The "guid" property

  "guid"                     guint64               : Read / Write

select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid).

Default value: 0


The "port" property

  "port"                     gint                  : Read / Write

Port number (-1 automatic).

Allowed values: [G_MAXULONG,16]

Default value: -1


The "skip" property

  "skip"                     gint                  : Read / Write

skip n frames.

Allowed values: >= 0

Default value: 0


The "use-avc" property

  "use-avc"                  gboolean              : Read / Write

Use AV/C VTR control.

Default value: TRUE


The "device-name" property

  "device-name"              gchar*                : Read

user-friendly name of the device.

Default value: "Default"

Signal Details

The "frame-dropped" signal

void                user_function                      (GstDV1394Src *gstdv1394src,
                                                        gpointer      user_data)         : Run Last

gstdv1394src :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gstrtpjitterbuffer.html0000644000175000017500000005467411720565335027107 00000000000000 gstrtpjitterbuffer

gstrtpjitterbuffer

gstrtpjitterbuffer — A buffer that deals with network jitter and other transmission faults

Synopsis

struct              GstRtpJitterBuffer;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstRtpJitterBuffer

Properties

  "do-lost"                  gboolean              : Read / Write
  "drop-on-latency"          gboolean              : Read / Write
  "latency"                  guint                 : Read / Write
  "ts-offset"                gint64                : Read / Write
  "mode"                     RTPJitterBufferMode   : Read / Write
  "percent"                  gint                  : Read

Description

This element reorders and removes duplicate RTP packets as they are received from a network source. It will also wait for missing packets up to a configurable time limit using the "latency" property. Packets arriving too late are considered to be lost packets.

This element acts as a live element and so adds "latency" to the pipeline.

The element needs the clock-rate of the RTP payload in order to estimate the delay. This information is obtained either from the caps on the sink pad or, when no caps are present, from the "request-pt-map" signal. To clear the previous pt-map use the "clear-pt-map" signal.

This element will automatically be used inside gstrtpbin.

Example pipelines

1
gst-launch rtspsrc location=rtsp://192.168.1.133:8554/mpeg1or2AudioVideoTest ! gstrtpjitterbuffer ! rtpmpvdepay ! mpeg2dec ! xvimagesink
Connect to a streaming server and decode the MPEG video. The jitterbuffer is inserted into the pipeline to smooth out network jitter and to reorder the out-of-order RTP packets.

Last reviewed on 2007-05-28 (0.10.5)

Synopsis

Element Information

plugin

gstrtpmanager

author

Philippe Kalaf <philippe.kalaf@collabora.co.uk>, Wim Taymans <wim.taymans@gmail.com>

class

Filter/Network/RTP

Element Pads

name

sink

direction

sink

presence

always

details

application/x-rtp, clock-rate=(int)[ 1, 2147483647 ]

name

sink_rtcp

direction

sink

presence

request

details

application/x-rtcp

name

src

direction

source

presence

always

details

application/x-rtp

Details

struct GstRtpJitterBuffer

struct GstRtpJitterBuffer;

Opaque jitterbuffer structure.

Property Details

The "do-lost" property

  "do-lost"                  gboolean              : Read / Write

Send an event downstream when a packet is lost.

Default value: FALSE


The "drop-on-latency" property

  "drop-on-latency"          gboolean              : Read / Write

Tells the jitterbuffer to never exceed the given latency in size.

Default value: FALSE


The "latency" property

  "latency"                  guint                 : Read / Write

Amount of ms to buffer.

Default value: 200


The "ts-offset" property

  "ts-offset"                gint64                : Read / Write

Adjust buffer timestamps with offset in nanoseconds.

Default value: 0


The "mode" property

  "mode"                     RTPJitterBufferMode   : Read / Write

Control the buffering algorithm in use.

Default value: Slave receiver to sender clock


The "percent" property

  "percent"                  gint                  : Read

The buffer filled percent.

Allowed values: [0,100]

Default value: 0

Signal Details

The "clear-pt-map" signal

void                user_function                      (GstRtpJitterBuffer *buffer,
                                                        gpointer            user_data)      : Action

Invalidate the clock-rate as obtained with the "request-pt-map" signal.

buffer :

the object which received the signal

user_data :

user data set when the signal handler was connected.

The "handle-sync" signal

void                user_function                      (GstRtpJitterBuffer *buffer,
                                                        GstStructure       *struct,
                                                        gpointer            user_data)      : Run Last

Be notified of new sync values.

buffer :

the object which received the signal

struct :

a GstStructure containing sync values.

user_data :

user data set when the signal handler was connected.

The "on-npt-stop" signal

void                user_function                      (GstRtpJitterBuffer *buffer,
                                                        gpointer            user_data)      : Run Last

Signal that the jitterbufer has pushed the RTP packet that corresponds to the npt-stop position.

buffer :

the object which received the signal

user_data :

user data set when the signal handler was connected.

The "request-pt-map" signal

GstCaps*            user_function                      (GstRtpJitterBuffer *buffer,
                                                        guint               pt,
                                                        gpointer            user_data)      : Run Last

Request the payload type as GstCaps for pt.

buffer :

the object which received the signal

pt :

the pt

user_data :

user data set when the signal handler was connected.

The "set-active" signal

guint64             user_function                      (GstRtpJitterBuffer *buffer,
                                                        gboolean            Returns,
                                                        guint64             arg2,
                                                        gpointer            user_data)      : Action

Start pushing out packets with the given base time. This signal is only useful in buffering mode.

buffer :

the object which received the signal

user_data :

user data set when the signal handler was connected.

Returns :

the time of the last pushed packet.

Since 0.10.19

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-multipartdemux.html0000644000175000017500000002416111720565335026220 00000000000000 multipartdemux

multipartdemux

multipartdemux — demux multipart streams

Synopsis

struct              GstMultipartDemux;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstMultipartDemux

Properties

  "autoscan"                 gboolean              : Read / Write
  "boundary"                 gchar*                : Read / Write / Construct
  "single-stream"            gboolean              : Read / Write

Description

MultipartDemux uses the Content-type field of incoming buffers to demux and push data to dynamic source pads. Most of the time multipart streams are sequential JPEG frames generated from a live source such as a network source or a camera.

The output buffers of the multipartdemux typically have no timestamps and are usually played as fast as possible (at the rate that the source provides the data).

the content in multipart files is separated with a boundary string that can be configured specifically with the "boundary" property otherwise it will be autodetected.

Sample pipelines

1
gst-launch filesrc location=/tmp/test.multipart ! multipartdemux ! jpegdec ! ffmpegcolorspace ! ximagesink
a simple pipeline to demux a multipart file muxed with GstMultipartMux containing JPEG frames.

Synopsis

Element Information

plugin

multipart

author

Wim Taymans <wim.taymans@gmail.com>, Sjoerd Simons <sjoerd@luon.net>

class

Codec/Demuxer

Element Pads

name

sink

direction

sink

presence

always

details

multipart/x-mixed-replace

name

src_%d

direction

source

presence

sometimes

details

ANY

Details

struct GstMultipartDemux

struct GstMultipartDemux;

The opaque GstMultipartDemux structure.

Property Details

The "autoscan" property

  "autoscan"                 gboolean              : Read / Write

Try to autofind the prefix (deprecated unused, see boundary).

Default value: FALSE


The "boundary" property

  "boundary"                 gchar*                : Read / Write / Construct

The boundary string separating data, automatic if NULL.

Default value: NULL


The "single-stream" property

  "single-stream"            gboolean              : Read / Write

Assume that there is only one stream whose content-type will not change and emit no-more-pads as soon as the first boundary content is parsed, decoded, and pads are linked.

Default value: FALSE

See Also

GstMultipartMux
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html0000644000175000017500000000614611720565335025343 00000000000000 jack

jack

jack — JACK audio elements

Plugin Information

filename

libgstjack.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

jackaudiosink

Output audio to a JACK server

jackaudiosrc

Captures audio from a JACK server
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html0000644000175000017500000000572411720565335026421 00000000000000 shapewipe

shapewipe

shapewipe — Shape Wipe transition filter

Plugin Information

filename

libgstshapewipe.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

shapewipe

Adds a shape wipe transition to a video stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html0000644000175000017500000000610711720565335025416 00000000000000 soup

soup

soup — libsoup HTTP client src/sink

Plugin Information

filename

libgstsouphttpsrc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

souphttpclientsink

Sends streams to HTTP server via PUT

souphttpsrc

Receive data as a client over the network via HTTP using SOUP
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-flxdec.html0000644000175000017500000001252311720565335024400 00000000000000 flxdec

flxdec

flxdec — FLC/FLI/FLX video decoder

Synopsis

struct              GstFlxDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstFlxDec

Description

This element decodes fli/flc/flx-video into raw video

Synopsis

Element Information

plugin

flxdec

author

Sepp Wijnands <mrrazz@garbage-coderz.net>, Zeeshan Ali <zeenix@gmail.com>

class

Codec/Decoder/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-fli

name

src

direction

source

presence

always

details

video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstFlxDec

struct GstFlxDec;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-speexdec.html0000644000175000017500000001444711720565335024742 00000000000000 speexdec

speexdec

speexdec — decode speex streams to audio

Synopsis

struct              GstSpeexDec;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstAudioDecoder
                     +----GstSpeexDec

Properties

  "enh"                      gboolean              : Read / Write

Description

Synopsis

Element Information

plugin

speex

author

Wim Taymans <wim@fluendo.com>

class

Codec/Decoder/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-speex

name

src

direction

source

presence

always

details

audio/x-raw-int, rate=(int)[ 6000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16

Details

struct GstSpeexDec

struct GstSpeexDec;

Property Details

The "enh" property

  "enh"                      gboolean              : Read / Write

Enable perceptual enhancement.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html0000644000175000017500000001207411720565335026052 00000000000000 effectv

effectv

effectv — effect plugins from the effectv project

Plugin Information

filename

libgsteffectv.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

agingtv

AgingTV adds age to video input using scratches and dust

dicetv

'Dices' the screen up into many small squares

edgetv

Apply edge detect on video

optv

Optical art meets real-time video effect

quarktv

Motion dissolver

radioactv

motion-enlightment effect

revtv

A video waveform monitor for each line of video processed

rippletv

RippleTV does ripple mark effect on the video input

shagadelictv

Oh behave, ShagedelicTV makes images shagadelic!

streaktv

StreakTV makes after images of moving objects

vertigotv

A loopback alpha blending effector with rotating and scaling

warptv

WarpTV does realtime goo'ing of the video input
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html0000644000175000017500000000564411720565335025720 00000000000000 wavenc

wavenc

wavenc — Encode raw audio into WAV

Plugin Information

filename

libgstwavenc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

wavenc

Encode raw audio into WAV
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-wavpackparse.html0000644000175000017500000001361111720565335025621 00000000000000 wavpackparse

wavpackparse

wavpackparse — Parses Wavpack files

Synopsis

struct              GstWavpackParse;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstWavpackParse

Description

Synopsis

Element Information

plugin

wavpack

author

Arwed v. Merkatz <v.merkatz@gmx.net>, Sebastian Dröge <slomo@circular-chaos.org>

class

Codec/Demuxer/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-wavpack, framed=(boolean)false

audio/x-wavpack-correction, framed=(boolean)false

name

src

direction

source

presence

sometimes

details

audio/x-wavpack, width=(int)[ 1, 32 ], channels=(int)[ 1, 8 ], rate=(int)[ 6000, 192000 ], framed=(boolean)true

name

wvcsrc

direction

source

presence

sometimes

details

audio/x-wavpack-correction, framed=(boolean)true

Details

struct GstWavpackParse

struct GstWavpackParse;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-audiowsinclimit.html0000644000175000017500000003104211720565335026334 00000000000000 audiowsinclimit

audiowsinclimit

audiowsinclimit — Low pass and high pass windowed sinc filter

Synopsis

struct              GstAudioWSincLimit;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseTransform
                     +----GstAudioFilter
                           +----GstAudioFXBaseFIRFilter
                                 +----GstAudioWSincLimit

Properties

  "frequency"                gdouble               : Read / Write
  "length"                   gint                  : Read / Write
  "mode"                     GstAudioWSincLimitMode  : Read / Write
  "window"                   GstAudioWSincLimitWindow  : Read / Write
  "cutoff"                   gfloat                : Read / Write

Description

Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the cutoff frequency (high-pass). The length parameter controls the rolloff, the window parameter controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit worse stopband attenuation, the other way around for the Blackman window.

This element has the advantage over the Chebyshev lowpass and highpass filter that it has a much better rolloff when using a larger kernel size and almost linear phase. The only disadvantage is the much slower execution time with larger kernels.

Example launch line

1
2
3
gst-launch audiotestsrc freq=1500 ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=501 ! audioconvert ! alsasink
gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsinclimit mode=high-pass frequency=15000 length=501 ! audioconvert ! alsasink
gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=10001 window=blackman ! audioconvert ! alsasink

Synopsis

Element Information

plugin

audiofx

author

Thomas Vander Stichele <thomas at apestaart dot org>, Steven W. Smith, Dreamlab Technologies Ltd. <mathis.hofer@dreamlab.net>, Sebastian Dröge <sebastian.droege@collabora.co.uk>

class

Filter/Effect/Audio

Element Pads

name

sink

direction

sink

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

name

src

direction

source

presence

always

details

audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]

Details

struct GstAudioWSincLimit

struct GstAudioWSincLimit;

Opaque data structure.

Property Details

The "frequency" property

  "frequency"                gdouble               : Read / Write

Cut-off Frequency (Hz).

Allowed values: >= 0

Default value: 0


The "length" property

  "length"                   gint                  : Read / Write

Filter kernel length, will be rounded to the next odd number.

Allowed values: [3,256000]

Default value: 101


The "mode" property

  "mode"                     GstAudioWSincLimitMode  : Read / Write

Low pass or high pass mode.

Default value: Low pass (default)


The "window" property

  "window"                   GstAudioWSincLimitWindow  : Read / Write

Window function to use.

Default value: Hamming window (default)


The "cutoff" property

  "cutoff"                   gfloat                : Read / Write

Cut-off Frequency (Hz).

Allowed values: [0,100000]

Default value: 0

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html0000644000175000017500000000574011720565335026261 00000000000000 icydemux

icydemux

icydemux — Demux ICY tags from a stream

Plugin Information

filename

libgsticydemux.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

icydemux

Read and output ICY tags while demuxing the contents
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-gconfaudiosrc.html0000644000175000017500000001206211720565335025757 00000000000000 gconfaudiosrc

gconfaudiosrc

gconfaudiosrc — Audio source embedding the GConf-settings for audio input

Synopsis

                    GstGConfAudioSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstSwitchSrc
                           +----GstGConfAudioSrc

Implemented Interfaces

GstGConfAudioSrc implements GstChildProxy.

Description

Synopsis

Element Information

plugin

gconfelements

author

GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>

class

Source/Audio

Element Pads

Details

GstGConfAudioSrc

typedef struct _GstGConfAudioSrc GstGConfAudioSrc;

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-hdv1394src.html0000644000175000017500000002274511720565335024754 00000000000000 hdv1394src

hdv1394src

hdv1394src — Source for MPEG-TS video data from firewire port

Synopsis

struct              GstHDV1394Src;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----GstPushSrc
                           +----GstHDV1394Src

Implemented Interfaces

GstHDV1394Src implements GstURIHandler and GstPropertyProbe.

Properties

  "channel"                  gint                  : Read / Write
  "device-name"              gchar*                : Read
  "guid"                     guint64               : Read / Write
  "port"                     gint                  : Read / Write
  "use-avc"                  gboolean              : Read / Write

Description

Synopsis

Element Information

plugin

1394

author

Edward Hervey <bilboed@bilboed.com>

class

Source/Video

Element Pads

name

src

direction

source

presence

always

details

video/mpegts, systemstream=(boolean)true, packetsize=(int)188

Details

struct GstHDV1394Src

struct GstHDV1394Src;

Property Details

The "channel" property

  "channel"                  gint                  : Read / Write

Channel number for listening.

Allowed values: [0,64]

Default value: 63


The "device-name" property

  "device-name"              gchar*                : Read

user-friendly name of the device.

Default value: "Default"


The "guid" property

  "guid"                     guint64               : Read / Write

select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid).

Default value: 0


The "port" property

  "port"                     gint                  : Read / Write

Port number (-1 automatic).

Allowed values: [G_MAXULONG,16]

Default value: -1


The "use-avc" property

  "use-avc"                  gboolean              : Read / Write

Use AV/C VTR control.

Default value: TRUE

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-waveformsink.html0000644000175000017500000001077311720565335025653 00000000000000 waveformsink

waveformsink

waveformsink — WaveForm audio sink

Synopsis

struct              GstWaveFormSink;

Description

Synopsis

Element Information

plugin

waveform

author

Sebastien Moutte <sebastien@moutte.net>

class

Sink/Audio

Element Pads

Details

struct GstWaveFormSink

struct GstWaveFormSink {
  /* parent object */
  GstAudioSink sink;

  /* supported caps */
  GstCaps *cached_caps;
  
  /* handle to the waveform-audio output device */
  HWAVEOUT hwaveout;
  
  /* table of buffer headers */
  WAVEHDR *wave_buffers;

  /* critical section protecting access to the number of free buffers */
  CRITICAL_SECTION critic_wave;

  /* number of free buffers available */
  guint free_buffers_count;
  
  /* current free buffer where you have to write incoming data */
  guint write_buffer;
  
  /* size of buffers streamed to the device */
  guint buffer_size;

  /* number of buffers streamed to the device */
  guint buffer_count;

  /* total of bytes in queue before they are written to the device */
  guint bytes_in_queue;

  /* bytes per sample from setcaps used to evaluate the number samples returned by delay */
  guint bytes_per_sample;

  /* wave form error string */
  gchar error_string[ERROR_LENGTH];
};

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-aasink.html0000644000175000017500000003753311720565335024411 00000000000000 aasink

aasink

aasink — An ASCII art videosink

Synopsis

struct              GstAASink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSink
                     +----GstAASink

Properties

  "brightness"               gint                  : Read / Write
  "contrast"                 gint                  : Read / Write
  "dither"                   GstAASinkDitherers    : Read / Write
  "driver"                   GstAASinkDrivers      : Read / Write
  "frame-time"               gint                  : Read
  "frames-displayed"         gint                  : Read
  "gamma"                    gfloat                : Read / Write
  "height"                   gint                  : Read / Write
  "inversion"                gboolean              : Read / Write
  "randomval"                gint                  : Read / Write
  "width"                    gint                  : Read / Write

Description

Synopsis

Element Information

plugin

aasink

author

Wim Taymans <wim.taymans@chello.be>

class

Sink/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Details

struct GstAASink

struct GstAASink;

Property Details

The "brightness" property

  "brightness"               gint                  : Read / Write

brightness.

Default value: 0


The "contrast" property

  "contrast"                 gint                  : Read / Write

contrast.

Default value: 0


The "dither" property

  "dither"                   GstAASinkDitherers    : Read / Write

dither.

Default value: no dithering


The "driver" property

  "driver"                   GstAASinkDrivers      : Read / Write

driver.

Default value: X11 driver 1.1


The "frame-time" property

  "frame-time"               gint                  : Read

frame time.

Default value: 0


The "frames-displayed" property

  "frames-displayed"         gint                  : Read

frames displayed.

Default value: 0


The "gamma" property

  "gamma"                    gfloat                : Read / Write

gamma.

Allowed values: [0,5]

Default value: 1


The "height" property

  "height"                   gint                  : Read / Write

height.

Default value: 0


The "inversion" property

  "inversion"                gboolean              : Read / Write

inversion.

Default value: TRUE


The "randomval" property

  "randomval"                gint                  : Read / Write

randomval.

Default value: 0


The "width" property

  "width"                    gint                  : Read / Write

width.

Default value: 0

Signal Details

The "frame-displayed" signal

void                user_function                      (GstAASink *gstaasink,
                                                        gpointer   user_data)      : Run Last

gstaasink :

the object which received the signal.

user_data :

user data set when the signal handler was connected.

The "have-size" signal

void                user_function                      (GstAASink *gstaasink,
                                                        guint      arg1,
                                                        guint      arg2,
                                                        gpointer   user_data)      : Run Last

gstaasink :

the object which received the signal.

user_data :

user data set when the signal handler was connected.
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-halaudiosink.html0000644000175000017500000001464011720565335025610 00000000000000 halaudiosink

halaudiosink

halaudiosink — Audio sink for sound device access via HAL

Synopsis

                    GstHalAudioSink;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----GstHalAudioSink

Implemented Interfaces

GstHalAudioSink implements GstChildProxy.

Properties

  "udi"                      gchar*                : Read / Write

Description

Synopsis

Element Information

plugin

halelements

author

Jürg Billeter <j@bitron.ch>

class

Sink/Audio

Element Pads

name

sink

direction

sink

presence

always

details

ANY

Details

GstHalAudioSink

typedef struct _GstHalAudioSink GstHalAudioSink;

Property Details

The "udi" property

  "udi"                      gchar*                : Read / Write

Unique Device Id.

Default value: NULL

gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html0000644000175000017500000000645211720565335025212 00000000000000 avi

avi

avi — AVI stream handling

Plugin Information

filename

libgstavi.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

avidemux

Demultiplex an avi file into audio and video

avimux

Muxes audio and video into an avi stream

avisubtitle

Parse avi subtitle stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html0000644000175000017500000000573311720565335026416 00000000000000 ximagesrc

ximagesrc

ximagesrc — X11 video input plugin using standard Xlib calls

Plugin Information

filename

libgstximagesrc.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

ximagesrc

Creates a screenshot video stream
gst-plugins-good-0.10.31/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html0000644000175000017500000000570311720565335025737 00000000000000 cutter

cutter

cutter — Audio Cutter to split audio into non-silent bits

Plugin Information

filename

libgstcutter.so

version

0.10.31

run-time license

LGPL

package

GStreamer Good Plug-ins source release

origin

Unknown package origin

Elements

cutter

Audio Cutter to split audio into non-silent bits
gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins-docs.sgml0000644000175000017500000003250111677341654023122 00000000000000 %version-entities; ]> GStreamer Good Plugins &GST_MAJORMINOR; Plugins Reference Manual for GStreamer Good Plugins &GST_MAJORMINOR; (&GST_VERSION;) The latest version of this documentation can be found on-line at http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/. gst-plugins-good Elements gst-plugins-good Plugins gst-plugins-good Base Classes gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins.args0000644000175000017500000157256611720564145022202 00000000000000 GstIirEqualizer10Bands::band0 gdouble [-24,12] rw 29 Hz gain for the frequency band 29 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band1 gdouble [-24,12] rw 59 Hz gain for the frequency band 59 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band2 gdouble [-24,12] rw 119 Hz gain for the frequency band 119 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band3 gdouble [-24,12] rw 237 Hz gain for the frequency band 237 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band4 gdouble [-24,12] rw 474 Hz gain for the frequency band 474 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band5 gdouble [-24,12] rw 947 Hz gain for the frequency band 947 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band6 gdouble [-24,12] rw 1889 Hz gain for the frequency band 1889 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band7 gdouble [-24,12] rw 3770 Hz gain for the frequency band 3770 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band8 gdouble [-24,12] rw 7523 Hz gain for the frequency band 7523 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer10Bands::band9 gdouble [-24,12] rw 15011 Hz gain for the frequency band 15011 Hz, ranging from -24 dB to +12 dB. 0 GstIirEqualizer3Bands::band0 gdouble [-24,12] rw 110 Hz gain for the frequency band 100 Hz, ranging from -24.0 to +12.0. 0 GstIirEqualizer3Bands::band1 gdouble [-24,12] rw 1100 Hz gain for the frequency band 1100 Hz, ranging from -24.0 to +12.0. 0 GstIirEqualizer3Bands::band2 gdouble [-24,12] rw 11 kHz gain for the frequency band 11 kHz, ranging from -24.0 to +12.0. 0 GstIirEqualizerNBands::num-bands guint [1,64] rwx num-bands number of different bands to use. 10 GstMultiFileSink::location gchar* rw File Location Location of the file to write. NULL GstMultiFileSink::index gint >= 0 rw Index Index to use with location property to create file names. The index is incremented by one for each buffer written. 0 GstMultiFileSink::next-file GstMultiFileSinkNext rw Next File When to start a new file. New file for each buffer GstMultiFileSink::post-messages gboolean rw Post Messages Post a message for each file with information of the buffer. FALSE GstMultiFileSink::max-files guint rw Max files Maximum number of files to keep on disk. Once the maximum is reached,old files start to be deleted to make room for new ones. 0 GstMultiFileSink::max-file-size guint64 rw Maximum File Size Maximum file size before starting a new file in max-size mode. 2147483648 GstMultiFileSrc::caps GstCaps* rw Caps Caps describing the format of the data. GstMultiFileSrc::index gint >= 0 rw File Index Index to use with location property to create file names. The index is incremented by one for each buffer read. 0 GstMultiFileSrc::location gchar* rw File Location Pattern to create file names of input files. File names are created by calling sprintf() with the pattern and the current index. "%05d" GstMultiFileSrc::loop gboolean rw Loop Whether to repeat from the beginning when all files have been read. FALSE GstMultiFileSrc::start-index gint >= 0 rw Start Index Start value of index. The initial value of index can be set either by setting index or start-index. When the end of the loop is reached, the index will be set to the value start-index. 0 GstMultiFileSrc::stop-index gint >= G_MAXULONG rw Start Index Stop value of index. The special value -1 means no stop. 0 GstOssSrc::device gchar* rw Device OSS device (usually /dev/dspN). "/dev/dsp" GstOssSrc::device-name gchar* r Device name Human-readable name of the sound device. "" GstSpectrum::bands guint rw Bands Number of frequency bands. 128 GstSpectrum::interval guint64 >= 1 rw Interval Interval of time between message posts (in nanoseconds). 100000000 GstSpectrum::message gboolean rw Message Whether to post a 'spectrum' element message on the bus for each passed interval (deprecated, use post-messages). TRUE GstSpectrum::threshold gint <= 0 rw Threshold dB threshold for result. All lower values will be set to this. -60 GstSpectrum::message-magnitude gboolean rw Magnitude Whether to add a 'magnitude' field to the structure of any 'spectrum' element messages posted on the bus. TRUE GstSpectrum::message-phase gboolean rw Phase Whether to add a 'phase' field to the structure of any 'spectrum' element messages posted on the bus. FALSE GstSpectrum::post-messages gboolean rw Post Messages Whether to post a 'spectrum' element message on the bus for each passed interval. TRUE GstSpectrum::multi-channel gboolean rw Multichannel results Send separate results for each channel. FALSE GstVideoflip::method GstVideoflipMethod rw method method. Rotate clockwise 90 degrees GstVideoBox::alpha gdouble [0,1] rw Alpha Alpha value picture. 1 GstVideoBox::border-alpha gdouble [0,1] rw Border Alpha Alpha value of the border. 1 GstVideoBox::bottom gint rw Bottom Pixels to box at bottom (<0 = add a border). 0 GstVideoBox::fill GstVideoBoxFill rw Fill How to fill the borders. Black GstVideoBox::left gint rw Left Pixels to box at left (<0 = add a border). 0 GstVideoBox::right gint rw Right Pixels to box at right (<0 = add a border). 0 GstVideoBox::top gint rw Top Pixels to box at top (<0 = add a border). 0 GstVideoBox::autocrop gboolean rw Auto crop Auto crop. FALSE GstUDPSink::host gchar* rw host The host/IP/Multicast group to send the packets to. "localhost" GstUDPSink::port gint [0,65535] rw port The port to send the packets to. 4951 GstUDPSrc::caps GstCaps* rw Caps The caps of the source pad. GstUDPSrc::multicast-group gchar* rw Multicast Group The Address of multicast group to join. "0.0.0.0" GstUDPSrc::port gint [0,65535] rw Port The port to receive the packets from, 0=allocate. 4951 GstUDPSrc::uri gchar* rw URI URI in the form of udp://multicast_group:port. "udp://0.0.0.0:4951" GstUDPSrc::sockfd gint >= G_MAXULONG rw Socket Handle Socket to use for UDP reception. (-1 == allocate). -1 GstUDPSrc::buffer-size gint >= 0 rw Buffer Size Size of the kernel receive buffer in bytes, 0=default. 0 GstUDPSrc::timeout guint64 rw Timeout Post a message after timeout microseconds (0 = disabled). 0 GstUDPSrc::closefd gboolean rw Close sockfd Close sockfd if passed as property on state change. TRUE GstUDPSrc::skip-first-bytes gint >= 0 rw Skip first bytes number of bytes to skip for each udp packet. 0 GstUDPSrc::sock gint >= G_MAXULONG r Socket Handle Socket currently in use for UDP reception. (-1 = no socket). -1 GstUDPSrc::auto-multicast gboolean rw Auto Multicast Automatically join/leave multicast groups. TRUE GstUDPSrc::multicast-iface gchar* rw Multicast Interface The network interface on which to join the multicast group. NULL GstUDPSrc::reuse gboolean rw Reuse Enable reuse of the port. TRUE GstSMPTE::border gint >= 0 rw Border The border width of the transition. 0 GstSMPTE::depth gint [1,24] rw Depth Depth of the mask in bits. 16 GstSMPTE::fps gfloat >= 0 rw FPS Frames per second if no input files are given (deprecated). 0 GstSMPTE::type GstSMPTETransitionType rw Type The type of transition to use. A bar moves from left to right GstSMPTE::duration guint64 rw Duration Duration of the transition effect in nanoseconds. 1000000000 GstSMPTE::invert gboolean rw Invert Invert transition mask. FALSE GstRTSPSrc::debug gboolean rw Debug Dump request and response messages to stdout. FALSE GstRTSPSrc::location gchar* rw RTSP Location Location of the RTSP url to read. NULL GstRTSPSrc::protocols GstRTSPLowerTrans rw Protocols Allowed lower transport protocols. GST_RTSP_LOWER_TRANS_UDP|GST_RTSP_LOWER_TRANS_UDP_MCAST|GST_RTSP_LOWER_TRANS_TCP GstRTSPSrc::retry guint <= 65535 rw Retry Max number of retries when allocating RTP ports. 20 GstRTSPSrc::timeout guint64 rw Timeout Retry TCP transport after UDP timeout microseconds (0 = disabled). 5000000 GstRTSPSrc::latency guint rw Buffer latency in ms Amount of ms to buffer. 2000 GstRTSPSrc::tcp-timeout guint64 rw TCP Timeout Fail after timeout microseconds on TCP connections (0 = disabled). 20000000 GstRTSPSrc::connection-speed guint <= 2147483 rw Connection Speed Network connection speed in kbps (0 = unknown). 0 GstRTSPSrc::nat-method GstRTSPNatMethod rw NAT Method Method to use for traversing firewalls and NAT. Send Dummy packets GstRTSPSrc::do-rtcp gboolean rw Do RTCP Send RTCP packets, disable for old incompatible server. TRUE GstRTSPSrc::proxy gchar* rw Proxy Proxy settings for HTTP tunneling. Format: [http://][user:passwd@]host[:port]. NULL GstRTSPSrc::rtp-blocksize guint <= 65536 rw RTP Blocksize RTP package size to suggest to server (0 = disabled). 0 GstRTSPSrc::user-id gchar* rw user-id RTSP location URI user id for authentication. NULL GstRTSPSrc::user-pw gchar* rw user-pw RTSP location URI user password for authentication. NULL GstRTSPSrc::buffer-mode GstRTSPSrcBufferMode rw Buffer Mode Control the buffering algorithm in use. Choose mode depending on stream live GstRTSPSrc::port-range gchar* rw Port range Client port range that can be used to receive RTP and RTCP data, eg. 3000-3005 (NULL = no restrictions). NULL GstRTSPSrc::udp-buffer-size gint >= 0 rw UDP Buffer Size Size of the kernel UDP receive buffer in bytes, 0=default. 524288 GstRTSPSrc::short-header gboolean rw Short Header Only send the basic RTSP headers for broken encoders. FALSE GstRTPDec::skip gint rw Skip skip (unused). 0 GstRTPDec::latency guint rw Buffer latency in ms Amount of ms to buffer. 200 GstLevel::interval guint64 >= 1 rw Interval Interval of time between message posts (in nanoseconds). 100000000 GstLevel::message gboolean rw message Post a level message for each passed interval. TRUE GstLevel::peak-falloff gdouble >= 0 rw Peak Falloff Decay rate of decay peak after TTL (in dB/sec). 10 GstLevel::peak-ttl guint64 rw Peak TTL Time To Live of decay peak before it falls back (in nanoseconds). 300000000 GstDiceTV::square-bits gint [0,5] rw Square Bits The size of the Squares. 4 GstVertigoTV::speed gfloat [0.01,100] rw Speed Control the speed of movement. 0.02 GstVertigoTV::zoom-speed gfloat [1.01,1.1] rw Zoom Speed Control the rate of zooming. 1.01 GstRevTV::delay gint [1,100] rw Delay Delay in frames between updates. 1 GstRevTV::gain gint [1,200] rw Gain Control gain. 50 GstRevTV::linespace gint [1,100] rw Linespace Control line spacing. 6 GstQuarkTV::planes gint [0,64] rw Planes Number of planes. 16 GstEFence::fence-top gboolean rw Fence Top Align buffers with top of fenced region. TRUE GstAlpha::alpha gdouble [0,1] rw Alpha The value for the alpha channel. 1 GstAlpha::angle gfloat [0,90] rw Angle Size of the colorcube to change. 20 GstAlpha::method GstAlphaMethod rw Method How the alpha channels should be created. Set/adjust alpha channel GstAlpha::noise-level gfloat [0,64] rw Noise Level Size of noise radius. 2 GstAlpha::target-b guint <= 255 rw Target Blue The Blue target. 0 GstAlpha::target-g guint <= 255 rw Target Green The Green target. 255 GstAlpha::target-r guint <= 255 rw Target Red The Red target. 0 GstAlpha::black-sensitivity guint <= 128 rw Black Sensitivity Sensitivity to dark colors. 100 GstAlpha::white-sensitivity guint <= 128 rw Sensitivity Sensitivity to bright colors. 100 GstAlpha::prefer-passthrough gboolean rw Prefer Passthrough Don't do any processing for alpha=1.0 if possible. FALSE GstShout2send::description gchar* rw description description. "" GstShout2send::genre gchar* rw genre genre. "" GstShout2send::ip gchar* rw ip ip. "127.0.0.1" GstShout2send::mount gchar* rw mount mount. "" GstShout2send::password gchar* rw password password. "hackme" GstShout2send::port gint [1,65535] rw port port. 8000 GstShout2send::protocol GstShout2SendProtocol rw protocol Connection Protocol to use. Http Protocol (icecast 2.x) GstShout2send::streamname gchar* rw streamname name of the stream. "" GstShout2send::sync gboolean rw Sync Sync on the clock. FALSE GstShout2send::url gchar* rw url url. "" GstShout2send::username gchar* rw username username. "source" GstShout2send::public gboolean rw public If the stream should be listed on the server's stream directory. FALSE GstSpeexDec::enh gboolean rw Enh Enable perceptual enhancement. TRUE DV1394Src::channel gint [0,64] rw Channel Channel number for listening. 63 DV1394Src::consecutive gint >= 1 rw consecutive frames send n consecutive frames after skipping. 1 DV1394Src::drop-incomplete gboolean rw drop_incomplete drop incomplete frames. TRUE DV1394Src::guid guint64 rw GUID select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid). 0 DV1394Src::port gint [-1,16] rw Port Port number (-1 automatic). -1 DV1394Src::skip gint >= 0 rw skip frames skip n frames. 0 DV1394Src::use-avc gboolean rw Use AV/C Use AV/C VTR control. TRUE GstPngEnc::compression-level guint <= 9 rw compression-level PNG compression level. 6 GstPngEnc::snapshot gboolean rw Snapshot Send EOS after encoding a frame, useful for snapshots. TRUE GstCACASink::anti-aliasing gboolean rw Anti Aliasing Enables Anti-Aliasing. TRUE GstCACASink::dither GstCACASinkDithering rw Dither Type Set type of Dither. No dithering GstCACASink::screen-height gint >= 0 r Screen Height The height of the screen. 25 GstCACASink::screen-width gint >= 0 r Screen Width The width of the screen. 80 GstJpegEnc::quality gint [0,100] rw Quality Quality of encoding. 85 GstJpegEnc::idct-method GstIDCTMethod rw IDCT Method The IDCT algorithm to use. Faster, less accurate integer method GstSmokeEnc::keyframe gint [1,100000] rw Keyframe Insert keyframe every N frames. 20 GstSmokeEnc::qmax gint [0,100] rw Qmax Maximum quality. 85 GstSmokeEnc::qmin gint [0,100] rw Qmin Minimum quality. 10 GstSmokeEnc::threshold gint [0,100000000] rw Threshold Motion estimation threshold. 3000 GstEsdSink::host gchar* rw Host The host running the esound daemon. NULL GstDVDec::clamp-chroma gboolean rw Clamp chroma Clamp chroma. FALSE GstDVDec::clamp-luma gboolean rw Clamp luma Clamp luma. FALSE GstDVDec::drop-factor gint >= 1 rw Drop Factor Only decode Nth frame. 1 GstDVDec::quality GstDVDecQualityEnum rw Quality Decoding quality. Highest quality colour decoding GstAASink::brightness gint rw brightness brightness. 0 GstAASink::contrast gint rw contrast contrast. 0 GstAASink::dither GstAASinkDitherers rw dither dither. no dithering GstAASink::driver GstAASinkDrivers rw driver driver. X11 driver 1.1 GstAASink::frame-time gint r frame time frame time. 0 GstAASink::frames-displayed gint r frames displayed frames displayed. 0 GstAASink::gamma gfloat [0,5] rw gamma gamma. 1 GstAASink::height gint rw height height. 0 GstAASink::inversion gboolean rw inversion inversion. TRUE GstAASink::randomval gint rw randomval randomval. 0 GstAASink::width gint rw width width. 0 GstRtpGSMParse::frequency gint rw frequency frequency. 8000 GstSpeexEnc::abr gint >= 0 rwx ABR Enable average bit-rate (0 = disabled). 0 GstSpeexEnc::bitrate gint >= 0 rwx Encoding Bit-rate Specify an encoding bit-rate (in bps). (0 = automatic). 0 GstSpeexEnc::complexity gint >= 0 rwx Complexity Set encoding complexity. 3 GstSpeexEnc::dtx gboolean rwx DTX Enable discontinuous transmission. FALSE GstSpeexEnc::last-message gchar* r last-message The last status message. NULL GstSpeexEnc::nframes gint >= 0 rwx NFrames Number of frames per buffer. 1 GstSpeexEnc::quality gfloat [0,10] rwx Quality Encoding quality. 8 GstSpeexEnc::vad gboolean rwx VAD Enable voice activity detection. FALSE GstSpeexEnc::vbr gboolean rwx VBR Enable variable bit-rate. FALSE GstSpeexEnc::mode GstSpeexEncMode rwx Mode The encoding mode. Auto GstDV1394Src::channel gint [0,64] rw Channel Channel number for listening. 63 GstDV1394Src::consecutive gint >= 1 rw consecutive frames send n consecutive frames after skipping. 1 GstDV1394Src::drop-incomplete gboolean rw drop incomplete drop incomplete frames. TRUE GstDV1394Src::guid guint64 rw GUID select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid). 0 GstDV1394Src::port gint [G_MAXULONG,16] rw Port Port number (-1 automatic). -1 GstDV1394Src::skip gint >= 0 rw skip frames skip n frames. 0 GstDV1394Src::use-avc gboolean rw Use AV/C Use AV/C VTR control. TRUE GstDV1394Src::device-name gchar* r device name user-friendly name of the device. "Default" GstFlacEnc::blocksize guint [16,65535] rwx Blocksize Blocksize in samples. 4608 GstFlacEnc::escape-coding gboolean rwx Do Escape coding search for escape codes in the entropy coding stage for slightly better compression. FALSE GstFlacEnc::exhaustive-model-search gboolean rwx Do exhaustive model search do exhaustive search of LP coefficient quantization (expensive!). FALSE GstFlacEnc::loose-mid-side-stereo gboolean rwx Loose mid side stereo Loose mid side stereo. FALSE GstFlacEnc::max-lpc-order guint <= 32 rwx Max LPC order Max LPC order; 0 => use only fixed predictors. 8 GstFlacEnc::max-residual-partition-order guint <= 16 rwx Max residual partition order Max residual partition order (above 4 doesn't usually help much). 3 GstFlacEnc::mid-side-stereo gboolean rwx Do mid side stereo Do mid side stereo (only for stereo input). TRUE GstFlacEnc::min-residual-partition-order guint <= 16 rwx Min residual partition order Min residual partition order (above 4 doesn't usually help much). 3 GstFlacEnc::qlp-coeff-prec-search gboolean rwx Do QLP coefficients precision search false = use qlp_coeff_precision, true = search around qlp_coeff_precision, take best. FALSE GstFlacEnc::qlp-coeff-precision guint <= 32 rwx QLP coefficients precision Precision in bits of quantized linear-predictor coefficients; 0 = automatic. 0 GstFlacEnc::quality GstFlacEncQuality rwx Quality Speed versus compression tradeoff. 5 - Default GstFlacEnc::rice-parameter-search-dist guint <= 15 rwx rice_parameter_search_dist 0 = try only calc'd parameter k; else try all [k-dist..k+dist] parameters, use best. 0 GstFlacEnc::streamable-subset gboolean rwx Streamable subset true to limit encoder to generating a Subset stream, else false. TRUE GstFlacEnc::padding guint rwx Padding Write a PADDING block with this length in bytes. 0 GstFlacEnc::seekpoints gint >= -2147483647 rwx Seekpoints Add SEEKTABLE metadata (if > 0, number of entries, if < 0, interval in sec). 0 GstOssSink::device gchar* rw Device OSS device (usually /dev/dspN). "/dev/dsp" GstVideoMixer::background GstVideoMixerBackground rw Background Background type. Checker pattern GstMatroskaMux::writing-app gchar* rw Writing application. The name the application that creates the matroska file. NULL GstMatroskaMux::version gint [1,2] rw DocType version This parameter determines what Matroska features can be used. 2 GstMatroskaMux::min-index-interval gint64 >= 0 rw Minimum time between index entries An index entry is created every so many nanoseconds. 0 GstMatroskaMux::streamable gboolean rw Determines whether output should be streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstTest::allowed-timestamp-deviation gint64 >= G_MAXULONG rwx allowed timestamp deviation allowed average difference in usec between timestamp of next buffer and expected timestamp from analyzing last buffer. -1 GstTest::buffer-count gint64 >= G_MAXULONG r buffer count number of buffers in stream. -1 GstTest::expected-buffer-count gint64 >= G_MAXULONG rwx expected buffer count expected number of buffers in stream. -1 GstTest::expected-length gint64 >= G_MAXULONG rwx expected length expected length of stream. -1 GstTest::expected-md5 gchar* rwx expected md5 expected md5 of processing the whole data. "---" GstTest::length gint64 >= G_MAXULONG r length length of stream. -1 GstTest::md5 gchar* r md5 md5 of processing the whole data. "---" GstTest::timestamp-deviation gint64 >= G_MAXULONG r timestamp deviation average difference in usec between timestamp of next buffer and expected timestamp from analyzing last buffer. -1 GstProgressReport::silent gboolean rw Do not print output to stdout Do not print output to stdout. FALSE GstProgressReport::update-freq gint >= 1 rw Update Frequency Number of seconds between reports when data is flowing. 5 GstProgressReport::format gchar* rw format Format to use for the querying. "auto" GstProgressReport::do-query gboolean rw Use a query instead of buffer metadata to determine stream position Use a query instead of buffer metadata to determine stream position. TRUE GstNavSeek::seek-offset gdouble >= 0 rw Seek Offset Time in seconds to seek by. 5 GstBreakMyData::probability gdouble [0,1] rwx probability probability for each byte in the buffer to be changed. 0 GstBreakMyData::seed guint rwx seed seed for randomness (initialized when going from READY to PAUSED). 0 GstBreakMyData::set-to gint [G_MAXULONG,255] rwx set-to set changed bytes to this value (-1 means random value. -1 GstBreakMyData::skip guint rwx skip amount of bytes skipped at the beginning of stream. 0 GstTextOverlay::deltax gint w X position modifier Shift X position to the left or to the right. Unit is pixels. 0 GstTextOverlay::deltay gint w Y position modifier Shift Y position up or down. Unit is pixels. 0 GstTextOverlay::font-desc gchararray w font description Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax. "" GstTextOverlay::halign gchararray w horizontal alignment Horizontal alignment of the text. Can be either 'left', 'right', or 'center'. "center" GstTextOverlay::shaded-background gboolean w shaded background Whether to shade the background under the text area. FALSE GstTextOverlay::text gchararray w text Text to be display. "" GstTextOverlay::valign gchararray w vertical alignment Vertical alignment of the text. Can be either 'baseline', 'bottom', or 'top'. "baseline" GstTextOverlay::xpad gint w horizontal paddding Horizontal paddding when using left/right alignment. 25 GstTextOverlay::ypad gint w vertical padding Vertical padding when using top/bottom alignment. 25 GstCutter::leaky gboolean rw Leaky do we leak buffers when below threshold ?. FALSE GstCutter::pre-length guint64 rw Pre-recording buffer length Length of pre-recording buffer (in nanoseconds). 0 GstCutter::run-length guint64 rw Run length Length of drop below threshold before cut_stop (in nanoseconds). 0 GstCutter::threshold gdouble rw Threshold Volume threshold before trigger. 0 GstCutter::threshold-dB gdouble rw Threshold (dB) Volume threshold before trigger (in dB). 0 GstVideoFlip::method GstVideoFlipMethod rw method method. Identity (no rotation) GstRtpMP4VPay::send-config gboolean rw Send Config Send the config parameters in RTP packets as well(deprecated see config-interval). FALSE GstRtpMP4VPay::buffer-list gboolean rw Buffer Array Use Buffer Arrays. FALSE GstRtpMP4VPay::config-interval guint <= 3600 rw Config Send Interval Send Config Insertion Interval in seconds (configuration headers will be multiplexed in the data stream when detected.) (0 = disabled). 0 GstRTPDepay::skip gint rw skip skip. 0 GstMultipartMux::boundary gchar* rw Boundary Boundary string. "ThisRandomString" GstCairoTextOverlay::deltax gint w X position modifier Shift X position to the left or to the right. Unit is pixels. 0 GstCairoTextOverlay::deltay gint w Y position modifier Shift Y position up or down. Unit is pixels. 0 GstCairoTextOverlay::font-desc gchar* w font description Pango font description of font to be used for rendering. See documentation of pango_font_description_from_string for syntax. "" GstCairoTextOverlay::halign gchar* w horizontal alignment Horizontal alignment of the text. Can be either 'left', 'right', or 'center'. "center" GstCairoTextOverlay::shaded-background gboolean w shaded background Whether to shade the background under the text area. FALSE GstCairoTextOverlay::text gchar* w text Text to be display. "" GstCairoTextOverlay::valign gchar* w vertical alignment Vertical alignment of the text. Can be either 'baseline', 'bottom', or 'top'. "baseline" GstCairoTextOverlay::xpad gint w horizontal paddding Horizontal paddding when using left/right alignment. 25 GstCairoTextOverlay::ypad gint w vertical padding Vertical padding when using top/bottom alignment. 25 GstCairoTextOverlay::silent gboolean w silent Whether to render the text string. FALSE GstOssMixerElement::device-name gchar* r Device name Human-readable name of the sound device. NULL GstOssMixerElement::device gchar* rw Device OSS mixer device (usually /dev/mixer). "/dev/mixer" GstID3Demux::prefer-v1 gboolean rwx Prefer version 1 tag Prefer tags from ID3v1 tag at end of file when both ID3v1 and ID3v2 tags are present. FALSE GstDynUDPSink::sockfd gint [G_MAXULONG,32767] rw socket handle Socket to use for UDP sending. (-1 == allocate). -1 GstDynUDPSink::closefd gboolean rw Close sockfd Close sockfd if passed as property on state change. TRUE GstCdioCddaSrc::read-speed gint [-1,100] rw Read speed Read from device at the specified speed (-1 = default). -1 GstMultiUDPSink::bytes-served guint64 r Bytes served Total number of bytes sent to all clients. 0 GstMultiUDPSink::bytes-to-serve guint64 r Bytes to serve Number of bytes received to serve to clients. 0 GstMultiUDPSink::clients gchar* rw Clients A comma separated list of host:port pairs with destinations. NULL GstMultiUDPSink::closefd gboolean rw Close sockfd Close sockfd if passed as property on state change. TRUE GstMultiUDPSink::sock gint >= G_MAXULONG r Socket Handle Socket currently in use for UDP sending. (-1 == no socket). -1 GstMultiUDPSink::sockfd gint >= G_MAXULONG rw Socket Handle Socket to use for UDP sending. (-1 == allocate). -1 GstMultiUDPSink::auto-multicast gboolean rw Automatically join/leave multicast groups Automatically join/leave the multicast groups, FALSE means user has to do it himself. TRUE GstMultiUDPSink::loop gboolean rw Multicast Loopback Used for setting the multicast loop parameter. TRUE = enable, FALSE = disable. TRUE GstMultiUDPSink::qos-dscp gint [G_MAXULONG,63] rw QoS diff srv code point Quality of Service, differentiated services code point (-1 default). -1 GstMultiUDPSink::ttl gint [0,255] rw Unicast TTL Used for setting the unicast TTL parameter. 64 GstMultiUDPSink::ttl-mc gint [0,255] rw Multicast TTL Used for setting the multicast TTL parameter. 1 GstMultiUDPSink::send-duplicates gboolean rw Send Duplicates When a distination/port pair is added multiple times, send packets multiple times as well. TRUE GstMultiUDPSink::buffer-size gint >= 0 rw Buffer Size Size of the kernel send buffer in bytes, 0=default. 0 GstCmmlDec::wait-clip-end-time gboolean rw Wait clip end time Send a tag for a clip when the clip ends, setting its end-time. Use when you need to know both clip's start-time and end-time. FALSE GstCmmlEnc::granule-rate-denominator gint64 >= 0 rwx Granulerate denominator Granulerate denominator. 1 GstCmmlEnc::granule-rate-numerator gint64 >= 0 rwx Granulerate numerator Granulerate numerator. 1000 GstCmmlEnc::granule-shift guchar <= 64 rwx Granuleshift The number of lower bits to use for partitioning a granule position. 32 GstHalAudioSrc::udi gchar* rw UDI Unique Device Id. NULL GstHalAudioSink::udi gchar* rw UDI Unique Device Id. NULL GstPixbufScale::method GstPixbufScaleMethod rw method method. 2 GstGdkPixbuf::silent gboolean rw Silent Produce verbose output ? (deprecated). FALSE GstGConfAudioSink::profile GstGConfProfile rw Profile Profile. Sound Events GstXImageSrc::display-name gchar* rw Display X Display Name. NULL GstXImageSrc::screen-num guint <= G_MAXINT rw Screen number X Screen Number. 0 GstXImageSrc::show-pointer gboolean rw Show Mouse Pointer Show mouse pointer (if XFixes extension enabled). TRUE GstXImageSrc::endx guint <= G_MAXINT rw End X X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen). 0 GstXImageSrc::endy guint <= G_MAXINT rw End Y Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen). 0 GstXImageSrc::startx guint <= G_MAXINT rw Start X co-ordinate X coordinate of top left corner of area to be recorded (0 for top left of screen). 0 GstXImageSrc::starty guint <= G_MAXINT rw Start Y co-ordinate Y coordinate of top left corner of area to be recorded (0 for top left of screen). 0 GstXImageSrc::use-damage gboolean rw Use XDamage Use XDamage (if XDamage extension enabled). TRUE GstXImageSrc::remote gboolean rw Remote dispay Whether the display is remote. FALSE GstXImageSrc::xid guint64 rw Window XID Window XID to capture from. 0 GstXImageSrc::xname gchar* rw Window name Window name to capture from. NULL GstVideoBalance::brightness gdouble [-1,1] rw Brightness brightness. 0 GstVideoBalance::contrast gdouble [0,2] rw Contrast contrast. 1 GstVideoBalance::hue gdouble [-1,1] rw Hue hue. 0 GstVideoBalance::saturation gdouble [0,2] rw Saturation saturation. 1 GstMultipartDemux::autoscan gboolean rw autoscan Try to autofind the prefix (deprecated unused, see boundary). FALSE GstMultipartDemux::boundary gchar* rwx Boundary The boundary string separating data, automatic if NULL. NULL GstMultipartDemux::single-stream gboolean rw Single Stream Assume that there is only one stream whose content-type will not change and emit no-more-pads as soon as the first boundary content is parsed, decoded, and pads are linked. FALSE GstAviMux::bigfile gboolean rw Bigfile Support (>2GB) Support for openDML-2.0 (big) AVI files. TRUE GstJpegDec::idct-method GstIDCTMethod rw IDCT Method The IDCT algorithm to use. Faster, less accurate integer method GstJpegDec::max-errors gint >= G_MAXULONG rw Maximum Consecutive Decoding Errors Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error). 0 GstRTPiLBCDepay::mode iLBCMode rw Mode iLBC frame mode. 30ms frames GstAudioPanorama::panorama gfloat [-1,1] rw Panorama Position in stereo panorama (-1.0 left -> 1.0 right). 0 GstAudioPanorama::method GstAudioPanoramaMethod rw Panning method Psychoacoustic mode keeps same perceived loudness, simple mode just controls volume of one channel. Psychoacoustic Panning (default) GstAudioInvert::degree gfloat [0,1] rw Degree Degree of inversion. 0 GstAudioAmplify::amplification gfloat rw Amplification Factor of amplification. 1 GstAudioAmplify::clipping-method GstAudioPanoramaClippingMethod rw Clipping method Selects how to handle values higher than the maximum. Normal clipping (default) GstAudioDynamic::characteristics GstAudioDynamicCharacteristics rw Characteristics Selects whether the ratio should be applied smooth (soft-knee) or hard (hard-knee). Hard Knee (default) GstAudioDynamic::mode GstAudioDynamicMode rw Mode Selects whether the filter should work on loud samples (compressor) orquiet samples (expander). Compressor (default) GstAudioDynamic::ratio gfloat >= 0 rw Ratio Ratio that should be applied. 1 GstAudioDynamic::threshold gfloat [0,1] rw Threshold Threshold until the filter is activated. 0 GstDirectDrawSink::force-aspect-ratio gboolean rw Force aspect ratio When enabled, scaling will respect original aspect ratio. FALSE GstWavpackEnc::bitrate guint <= 9600000 rw Bitrate Try to encode with this average bitrate (bits/sec). This enables lossy encoding, values smaller than 24000 disable it again. 0 GstWavpackEnc::bits-per-sample gdouble [0,24] rw Bits per sample Try to encode with this amount of bits per sample. This enables lossy encoding, values smaller than 2.0 disable it again. 0 GstWavpackEnc::correction-mode GstWavpackEncCorrectionMode rw Correction stream mode Use this mode for the correction stream. Only works in lossy mode!. Create no correction file GstWavpackEnc::extra-processing guint <= 6 rw Extra processing Use better but slower filters for better compression/quality. 0 GstWavpackEnc::joint-stereo-mode GstWavpackEncJSMode rw Joint-Stereo mode Use this joint-stereo mode. auto GstWavpackEnc::md5 gboolean rw MD5 Store MD5 hash of raw samples within the file. FALSE GstWavpackEnc::mode GstWavpackEncMode rw Encoding mode Speed versus compression tradeoff. Normal Compression GstRtpMP2TDepay::skip-first-bytes guint rw Skip first bytes The amount of bytes that need to be skipped at the beginning of the payload. 0 GstRtpH263PPay::fragmentation-mode GstFragmentationMode rw Fragmentation Mode Packet Fragmentation Mode. Normal GstGamma::gamma gdouble [0.01,10] rw Gamma gamma. 1 GstVideoCrop::bottom gint >= 0 rw Bottom Pixels to crop at bottom. 0 GstVideoCrop::left gint >= 0 rw Left Pixels to crop at left. 0 GstVideoCrop::right gint >= 0 rw Right Pixels to crop at right. 0 GstVideoCrop::top gint >= 0 rw Top Pixels to crop at top. 0 GstV4l2Src::device gchar* rw Device Device location. "/dev/video0" GstV4l2Src::device-name gchar* r Device name Name of the device. NULL GstV4l2Src::flags GstV4l2DeviceTypeFlags r Flags Device type flags. GstV4l2Src::queue-size guint [1,16] rw Queue size Number of buffers to be enqueud in the driver in streaming mode. 2 GstV4l2Src::always-copy gboolean rw Always Copy If the buffer will or not be used directly from mmap. TRUE GstV4l2Src::device-fd gint >= G_MAXULONG r File descriptor File descriptor of the device. -1 GstV4l2Src::brightness gint rw Brightness Picture brightness, or more precisely, the black level. 0 GstV4l2Src::contrast gint rw Contrast Picture contrast or luma gain. 0 GstV4l2Src::decimate gint >= 1 rw Decimate Only use every nth frame. 1 GstV4l2Src::hue gint rw Hue Hue or color balance. 0 GstV4l2Src::saturation gint rw Saturation Picture color saturation or chroma gain. 0 GstV4l2Src::norm V4L2_TV_norms rw TV norm video standard. none GstAudioChebBand::lower-frequency gfloat [0,100000] rw Lower frequency Start frequency of the band (Hz). 0 GstAudioChebBand::mode GstAudioChebBandMode rw Mode Low pass or high pass mode. Band pass (default) GstAudioChebBand::poles gint [4,32] rw Poles Number of poles to use, will be rounded up to the next multiply of four. 4 GstAudioChebBand::ripple gfloat [0,200] rw Ripple Amount of ripple (dB). 0.25 GstAudioChebBand::type gint [1,2] rw Type Type of the chebychev filter. 1 GstAudioChebBand::upper-frequency gfloat [0,100000] rw Upper frequency Stop frequency of the band (Hz). 0 GstAudioChebLimit::cutoff gfloat [0,100000] rw Cutoff Cut off frequency (Hz). 0 GstAudioChebLimit::mode GstAudioChebLimitMode rw Mode Low pass or high pass mode. Low pass (default) GstAudioChebLimit::poles gint [2,32] rw Poles Number of poles to use, will be rounded up to the next even number. 4 GstAudioChebLimit::ripple gfloat [0,200] rw Ripple Amount of ripple (dB). 0.25 GstAudioChebLimit::type gint [1,2] rw Type Type of the chebychev filter. 1 GstAudioWSincBand::lower-frequency gfloat [0,100000] rw Lower Frequency Cut-off lower frequency (Hz). 0 GstAudioWSincBand::upper-frequency gfloat [0,100000] rw Upper Frequency Cut-off upper frequency (Hz). 0 GstAudioWSincBand::mode GstAudioWSincBandMode rw Mode Band pass or band reject mode. Band pass (default) GstAudioWSincBand::window GstAudioWSincBandWindow rw Window Window function to use. Hamming window (default) GstAudioWSincBand::length gint [3,256000] rw Length Filter kernel length, will be rounded to the next odd number. 101 GstAudioWSincLimit::frequency gdouble >= 0 rw Frequency Cut-off Frequency (Hz). 0 GstAudioWSincLimit::length gint [3,256000] rw Length Filter kernel length, will be rounded to the next odd number. 101 GstAudioWSincLimit::mode GstAudioWSincLimitMode rw Mode Low pass or high pass mode. Low pass (default) GstAudioWSincLimit::window GstAudioWSincLimitWindow rw Window Window function to use. Hamming window (default) GstAudioWSincLimit::cutoff gfloat [0,100000] rw Cutoff Cut-off Frequency (Hz). 0 GstRndBufferSize::max glong [1,G_MAXINT] rwx maximum maximum buffer size. 8192 GstRndBufferSize::min glong [0,G_MAXINT] rwx mininum mininum buffer size. 1 GstRndBufferSize::seed gulong <= G_MAXUINT rwx random number seed seed for randomness (initialized when going from READY to PAUSED). GstAutoAudioSink::filter-caps GstCaps* rw Filter caps Filter sink candidates using these caps. GstAutoVideoSink::filter-caps GstCaps* rw Filter caps Filter sink candidates using these caps. GstOsxAudioSink::device gint >= 0 rw Device ID Device ID of output device. 0 GstOsxAudioSrc::device gint >= 0 rw Device ID Device ID of input device. 0 GstOSXVideoSink::embed gboolean rw embed When enabled, it can be embedded. FALSE GstOSXVideoSink::fullscreen gboolean rw fullscreen When enabled, the view is fullscreen. FALSE GstGdkPixbufSink::last-pixbuf GdkPixbuf* r Last Pixbuf Last GdkPixbuf object rendered. GstGdkPixbufSink::send-messages gboolean rw Send Messages Whether to post messages containing pixbufs on the bus (deprecated, use post-messages). TRUE GstGdkPixbufSink::post-messages gboolean rw Post Messages Whether to post messages containing pixbufs on the bus. TRUE GstSoupHTTPSrc::automatic-redirect gboolean rw automatic-redirect Automatically follow HTTP redirects (HTTP Status Code 3xx). TRUE GstSoupHTTPSrc::cookies GStrv rw Cookies HTTP request cookies. GstSoupHTTPSrc::iradio-genre gchar* r iradio-genre Genre of the stream. NULL GstSoupHTTPSrc::iradio-mode gboolean rw iradio-mode Enable internet radio mode (extraction of shoutcast/icecast metadata). FALSE GstSoupHTTPSrc::iradio-name gchar* r iradio-name Name of the stream. NULL GstSoupHTTPSrc::iradio-title gchar* r iradio-title Name of currently playing song. NULL GstSoupHTTPSrc::iradio-url gchar* r iradio-url Homepage URL for radio stream. NULL GstSoupHTTPSrc::location gchar* rw Location Location to read from. "" GstSoupHTTPSrc::proxy gchar* rw Proxy HTTP proxy server URI. "" GstSoupHTTPSrc::user-agent gchar* rw User-Agent Value of the User-Agent HTTP request header field. "GStreamer souphttpsrc " GstSoupHTTPSrc::is-live gboolean rw is-live Act like a live source. FALSE GstSoupHTTPSrc::proxy-id gchar* rw proxy-id HTTP proxy URI user id for authentication. "" GstSoupHTTPSrc::proxy-pw gchar* rw proxy-pw HTTP proxy URI user password for authentication. "" GstSoupHTTPSrc::user-id gchar* rw user-id HTTP location URI user id for authentication. "" GstSoupHTTPSrc::user-pw gchar* rw user-pw HTTP location URI user password for authentication. "" GstSoupHTTPSrc::extra-headers GstStructure* rw Extra Headers Extra headers to append to the HTTP request. GstSoupHTTPSrc::timeout guint <= 3600 rw timeout Value in seconds to timeout a blocking I/O (0 = No timeout). 0 GstRTPDVPay::mode GstDVPayMode rw Mode The payload mode of payloading. Video only GstRtpH264Pay::profile-level-id gchar* rw profile-level-id The base64 profile-level-id to set in the sink caps (deprecated). NULL GstRtpH264Pay::sprop-parameter-sets gchar* rw sprop-parameter-sets The base64 sprop-parameter-sets to set in out caps (set to NULL to extract from stream). NULL GstRtpH264Pay::scan-mode GstH264PayScanMode rw Scan Mode How to scan the input buffers for NAL units. Performance can be increased when certain assumptions are made about the input buffers. Buffers contain multiple complete NALUs GstRtpH264Pay::buffer-list gboolean rw Buffer List Use Buffer Lists. FALSE GstRtpH264Pay::config-interval guint <= 3600 rw SPS PPS Send Interval Send SPS and PPS Insertion Interval in seconds (sprop parameter sets will be multiplexed in the data stream when detected.) (0 = disabled). 0 ladspa-hardLimiter::Residue-level gfloat [0,1] rwx Residue-level Residue-level. 0 ladspa-hardLimiter::Wet-level gfloat [0,1] rwx Wet-level Wet-level. 1 ladspa-hardLimiter::dB-limit gfloat [-50,0] rwx dB-limit dB-limit. 0 ladspa-dj-eq-mono::Hi-gain gfloat [-70,6] rwx Hi-gain Hi-gain. 0 ladspa-dj-eq-mono::Lo-gain gfloat [-70,6] rwx Lo-gain Lo-gain. 0 ladspa-dj-eq-mono::Mid-gain gfloat [-70,6] rwx Mid-gain Mid-gain. 0 ladspa-dj-eq-mono::latency gfloat r latency latency. -3,40282e+38 ladspa-dj-eq::Hi-gain gfloat [-70,6] rwx Hi-gain Hi-gain. 0 ladspa-dj-eq::Lo-gain gfloat [-70,6] rwx Lo-gain Lo-gain. 0 ladspa-dj-eq::Mid-gain gfloat [-70,6] rwx Mid-gain Mid-gain. 0 ladspa-dj-eq::latency gfloat r latency latency. -3,40282e+38 ladspa-branch-ic-ococ::First-Output gfloat r First-Output First-Output. -3,40282e+38 ladspa-branch-ic-ococ::Input gfloat rwx Input Input. -3,40282e+38 ladspa-branch-ic-ococ::Second-Output gfloat r Second-Output Second-Output. -3,40282e+38 ladspa-Exaggerate::amount gfloat [-1,10] rwx amount amount. 1 ladspa-Transpose::transpose gfloat [-24,24] rwx transpose transpose. 0 ladspa-Accumulate::decay gfloat [0,1] rwx decay decay. 0,25 ladspa-Accumulate::glissando gfloat [-1,1] rwx glissando glissando. 0 ladspa-sinusWavewrapper::Wrap-degree gfloat [0,10] rwx Wrap-degree Wrap-degree. 0 ladspa-foverdrive::Drive-level gfloat [1,3] rwx Drive-level Drive-level. 1 ladspa-mbeq::latency gfloat r latency latency. -3,40282e+38 ladspa-mbeq::param-10000Hz-gain gfloat [-70,30] rwx param-10000Hz-gain param-10000Hz-gain. 0 ladspa-mbeq::param-100Hz-gain gfloat [-70,30] rwx param-100Hz-gain param-100Hz-gain. 0 ladspa-mbeq::param-1250Hz-gain gfloat [-70,30] rwx param-1250Hz-gain param-1250Hz-gain. 0 ladspa-mbeq::param-156Hz-gain gfloat [-70,30] rwx param-156Hz-gain param-156Hz-gain. 0 ladspa-mbeq::param-1750Hz-gain gfloat [-70,30] rwx param-1750Hz-gain param-1750Hz-gain. 0 ladspa-mbeq::param-20000Hz-gain gfloat [-70,30] rwx param-20000Hz-gain param-20000Hz-gain. 0 ladspa-mbeq::param-220Hz-gain gfloat [-70,30] rwx param-220Hz-gain param-220Hz-gain. 0 ladspa-mbeq::param-2500Hz-gain gfloat [-70,30] rwx param-2500Hz-gain param-2500Hz-gain. 0 ladspa-mbeq::param-311Hz-gain gfloat [-70,30] rwx param-311Hz-gain param-311Hz-gain. 0 ladspa-mbeq::param-3500Hz-gain gfloat [-70,30] rwx param-3500Hz-gain param-3500Hz-gain. 0 ladspa-mbeq::param-440Hz-gain gfloat [-70,30] rwx param-440Hz-gain param-440Hz-gain. 0 ladspa-mbeq::param-5000Hz-gain gfloat [-70,30] rwx param-5000Hz-gain param-5000Hz-gain. 0 ladspa-mbeq::param-50Hz-gain gfloat [-70,30] rwx param-50Hz-gain param-50Hz-gain. 0 ladspa-mbeq::param-622Hz-gain gfloat [-70,30] rwx param-622Hz-gain param-622Hz-gain. 0 ladspa-mbeq::param-880Hz-gain gfloat [-70,30] rwx param-880Hz-gain param-880Hz-gain. 0 ladspa-delayorama::Amplitude-change gfloat [0,2,5] rwx Amplitude-change Amplitude-change. 1 ladspa-delayorama::Amplitude-random gfloat [0,100] rwx Amplitude-random Amplitude-random. 0 ladspa-delayorama::Delay-change gfloat [0,2,5] rwx Delay-change Delay-change. 1 ladspa-delayorama::Delay-random gfloat [0,100] rwx Delay-random Delay-random. 0 ladspa-delayorama::Delay-range gfloat [0,0001,6] rwx Delay-range Delay-range. 6 ladspa-delayorama::Dry-wet-mix gfloat [0,1] rwx Dry-wet-mix Dry-wet-mix. 1 ladspa-delayorama::Feedback gfloat [0,100] rwx Feedback Feedback. 0 ladspa-delayorama::First-delay gfloat [0,5] rwx First-delay First-delay. 0 ladspa-delayorama::Input-gain gfloat [-96,24] rwx Input-gain Input-gain. 0 ladspa-delayorama::Number-of-taps gint [2,128] rwx Number-of-taps Number-of-taps. 2 ladspa-delayorama::Random-seed gint [0,1000] rwx Random-seed Random-seed. 0 ladspa-tap-equalizer-bw::Band-1-Bandwidth--octaves- gfloat [0,1,5] rwx Band-1-Bandwidth--octaves- Band-1-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-1-Freq--Hz- gfloat [40,280] rwx Band-1-Freq--Hz- Band-1-Freq--Hz-. 100 ladspa-tap-equalizer-bw::Band-1-Gain--dB- gfloat [-50,20] rwx Band-1-Gain--dB- Band-1-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-2-Bandwidth--octaves- gfloat [0,1,5] rwx Band-2-Bandwidth--octaves- Band-2-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-2-Freq--Hz- gfloat [100,500] rwx Band-2-Freq--Hz- Band-2-Freq--Hz-. 200 ladspa-tap-equalizer-bw::Band-2-Gain--dB- gfloat [-50,20] rwx Band-2-Gain--dB- Band-2-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-3-Bandwidth--octaves- gfloat [0,1,5] rwx Band-3-Bandwidth--octaves- Band-3-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-3-Freq--Hz- gfloat [200,1000] rwx Band-3-Freq--Hz- Band-3-Freq--Hz-. 400 ladspa-tap-equalizer-bw::Band-3-Gain--dB- gfloat [-50,20] rwx Band-3-Gain--dB- Band-3-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-4-Bandwidth--octaves- gfloat [0,1,5] rwx Band-4-Bandwidth--octaves- Band-4-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-4-Freq--Hz- gfloat [400,2800] rwx Band-4-Freq--Hz- Band-4-Freq--Hz-. 1000 ladspa-tap-equalizer-bw::Band-4-Gain--dB- gfloat [-50,20] rwx Band-4-Gain--dB- Band-4-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-5-Bandwidth--octaves- gfloat [0,1,5] rwx Band-5-Bandwidth--octaves- Band-5-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-5-Freq--Hz- gfloat [1000,5000] rwx Band-5-Freq--Hz- Band-5-Freq--Hz-. 3000 ladspa-tap-equalizer-bw::Band-5-Gain--dB- gfloat [-50,20] rwx Band-5-Gain--dB- Band-5-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-6-Bandwidth--octaves- gfloat [0,1,5] rwx Band-6-Bandwidth--octaves- Band-6-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-6-Freq--Hz- gfloat [3000,9000] rwx Band-6-Freq--Hz- Band-6-Freq--Hz-. 6000 ladspa-tap-equalizer-bw::Band-6-Gain--dB- gfloat [-50,20] rwx Band-6-Gain--dB- Band-6-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-7-Bandwidth--octaves- gfloat [0,1,5] rwx Band-7-Bandwidth--octaves- Band-7-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-7-Freq--Hz- gfloat [6000,18000] rwx Band-7-Freq--Hz- Band-7-Freq--Hz-. 12000 ladspa-tap-equalizer-bw::Band-7-Gain--dB- gfloat [-50,20] rwx Band-7-Gain--dB- Band-7-Gain--dB-. 0 ladspa-tap-equalizer-bw::Band-8-Bandwidth--octaves- gfloat [0,1,5] rwx Band-8-Bandwidth--octaves- Band-8-Bandwidth--octaves-. 1 ladspa-tap-equalizer-bw::Band-8-Freq--Hz- gfloat [10000,20000] rwx Band-8-Freq--Hz- Band-8-Freq--Hz-. 15000 ladspa-tap-equalizer-bw::Band-8-Gain--dB- gfloat [-50,20] rwx Band-8-Gain--dB- Band-8-Gain--dB-. 0 ladspa-crossoverDist::Crossover-amplitude gfloat [0,0,1] rwx Crossover-amplitude Crossover-amplitude. 0 ladspa-crossoverDist::Smoothing gfloat [0,1] rwx Smoothing Smoothing. 1 ladspa-fadDelay::Delay gfloat [0,1,10] rwx Delay Delay. 1 ladspa-fadDelay::Feedback gfloat [-70,0] rwx Feedback Feedback. 0 ladspa-multivoiceChorus::Delay-base gfloat [10,40] rwx Delay-base Delay-base. 10 ladspa-multivoiceChorus::Detune gfloat [0,5] rwx Detune Detune. 1 ladspa-multivoiceChorus::LFO-frequency gfloat [2,30] rwx LFO-frequency LFO-frequency. 9 ladspa-multivoiceChorus::Number-of-voices gint [1,8] rwx Number-of-voices Number-of-voices. 1 ladspa-multivoiceChorus::Output-attenuation gfloat [-20,0] rwx Output-attenuation Output-attenuation. 0 ladspa-multivoiceChorus::Voice-separation gfloat [0,2] rwx Voice-separation Voice-separation. 0,5 ladspa-syncsquare-fcga-oa::Frequency gfloat [0,64] rwx Frequency Frequency. 16 ladspa-smoothDecimate::Resample-rate gfloat [0,44100] rwx Resample-rate Resample-rate. 44100 ladspa-smoothDecimate::Smoothing gfloat [0,1] rwx Smoothing Smoothing. 1 ladspa-allpass-n::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-allpass-n::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-allpass-n::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-allpass-l::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-allpass-l::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-allpass-l::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-allpass-c::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-allpass-c::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-allpass-c::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-fmOsc::Waveform gint [1,4] rwx Waveform Waveform. 1 ladspa-foldover::Drive gfloat [0,1] rwx Drive Drive. 0 ladspa-foldover::Skew gfloat [0,1] rwx Skew Skew. 0 ladspa-valve::Distortion-character gfloat [0,1] rwx Distortion-character Distortion-character. 0 ladspa-valve::Distortion-level gfloat [0,1] rwx Distortion-level Distortion-level. 0 ladspa-difference-iamc-oa::Input-to-Subtract gfloat rwx Input-to-Subtract Input-to-Subtract. -3,40282e+38 ladspa-difference-icma-oa::Input gfloat rwx Input Input. -3,40282e+38 ladspa-difference-icmc-oc::Difference-Output gfloat r Difference-Output Difference-Output. -3,40282e+38 ladspa-difference-icmc-oc::Input gfloat rwx Input Input. -3,40282e+38 ladspa-difference-icmc-oc::Input-to-Subtract gfloat rwx Input-to-Subtract Input-to-Subtract. -3,40282e+38 ladspa-Mvclpf-1::Exp-FM-gain gfloat [0,10] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Mvclpf-1::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Mvclpf-1::Input-gain gfloat [-60,10] rwx Input-gain Input-gain. 0 ladspa-Mvclpf-1::Output-gain gfloat [-15,15] rwx Output-gain Output-gain. 0 ladspa-Mvclpf-1::Resonance gfloat [0,1] rwx Resonance Resonance. 0 ladspa-Mvclpf-1::Resonance-gain gfloat [0,1] rwx Resonance-gain Resonance-gain. 0 ladspa-Mvclpf-2::Exp-FM-gain gfloat [0,10] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Mvclpf-2::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Mvclpf-2::Input-gain gfloat [-60,10] rwx Input-gain Input-gain. 0 ladspa-Mvclpf-2::Output-gain gfloat [-15,15] rwx Output-gain Output-gain. 0 ladspa-Mvclpf-2::Resonance gfloat [0,1] rwx Resonance Resonance. 0 ladspa-Mvclpf-2::Resonance-gain gfloat [0,1] rwx Resonance-gain Resonance-gain. 0 ladspa-Mvclpf-3::Exp-FM-gain gfloat [0,10] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Mvclpf-3::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Mvclpf-3::Input-gain gfloat [-60,10] rwx Input-gain Input-gain. 0 ladspa-Mvclpf-3::Output-gain gfloat [-15,15] rwx Output-gain Output-gain. 0 ladspa-Mvclpf-3::Resonance gfloat [0,1] rwx Resonance Resonance. 0 ladspa-Mvclpf-3::Resonance-gain gfloat [0,1] rwx Resonance-gain Resonance-gain. 0 ladspa-Mvclpf-4::Exp-FM-gain gfloat [0,10] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Mvclpf-4::Filter-poles gint [0,4] rwx Filter-poles Filter-poles. 0 ladspa-Mvclpf-4::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Mvclpf-4::Input-gain gfloat [-60,10] rwx Input-gain Input-gain. 0 ladspa-Mvclpf-4::Output-gain gfloat [-15,15] rwx Output-gain Output-gain. 0 ladspa-Mvclpf-4::Resonance gfloat [0,1] rwx Resonance Resonance. 0 ladspa-Mvclpf-4::Resonance-gain gfloat [0,1] rwx Resonance-gain Resonance-gain. 0 ladspa-alienwah-mono::Delay gint [5,50] rwx Delay Delay. 5 ladspa-alienwah-mono::Feedback gfloat [0,1] rwx Feedback Feedback. 0 ladspa-alienwah-mono::Frequency gfloat [0,inf] rwx Frequency Frequency. 0 ladspa-alienwah-mono::Initial-phase-for-stereo gfloat rwx Initial-phase-for-stereo Initial-phase-for-stereo. -3,40282e+38 ladspa-alienwah-stereo::Delay gint [5,50] rwx Delay Delay. 5 ladspa-alienwah-stereo::Feedback gfloat [0,2] rwx Feedback Feedback. 0 ladspa-alienwah-stereo::Frequency gfloat [0,inf] rwx Frequency Frequency. 0 ladspa-alienwah-stereo::Initial-phase-for-stereo gfloat [0,6,28319] rwx Initial-phase-for-stereo Initial-phase-for-stereo. 6,28319 ladspa-gongBeater::Impulse-gain gfloat [-70,0] rwx Impulse-gain Impulse-gain. -70 ladspa-gongBeater::Strike-duration gfloat [0,001,0,2] rwx Strike-duration Strike-duration. 0,1005 ladspa-gongBeater::Strike-gain gfloat [-70,0] rwx Strike-gain Strike-gain. 0 ladspa-Chorus1::Delay gfloat [0,30] rwx Delay Delay. 0 ladspa-Chorus1::Mod-Amplitude-1 gfloat [0,10] rwx Mod-Amplitude-1 Mod-Amplitude-1. 0 ladspa-Chorus1::Mod-Amplitude-2 gfloat [0,3] rwx Mod-Amplitude-2 Mod-Amplitude-2. 0 ladspa-Chorus1::Mod-Frequency-1 gfloat [0,003,10] rwx Mod-Frequency-1 Mod-Frequency-1. 0,003 ladspa-Chorus1::Mod-Frequency-2 gfloat [0,01,30] rwx Mod-Frequency-2 Mod-Frequency-2. 0,01 ladspa-Chorus2::Delay gfloat [0,30] rwx Delay Delay. 0 ladspa-Chorus2::Mod-Amplitude-1 gfloat [0,10] rwx Mod-Amplitude-1 Mod-Amplitude-1. 0 ladspa-Chorus2::Mod-Amplitude-2 gfloat [0,3] rwx Mod-Amplitude-2 Mod-Amplitude-2. 0 ladspa-Chorus2::Mod-Frequency-1 gfloat [0,003,10] rwx Mod-Frequency-1 Mod-Frequency-1. 0,003 ladspa-Chorus2::Mod-Frequency-2 gfloat [0,01,30] rwx Mod-Frequency-2 Mod-Frequency-2. 0,01 ladspa-hilbert::latency gfloat r latency latency. -3,40282e+38 ladspa-tapeDelay::Dry-level gfloat [-90,0] rwx Dry-level Dry-level. -90 ladspa-tapeDelay::Tap-1-distance gfloat [0,4] rwx Tap-1-distance Tap-1-distance. 0 ladspa-tapeDelay::Tap-1-level gfloat [-90,0] rwx Tap-1-level Tap-1-level. 0 ladspa-tapeDelay::Tap-2-distance gfloat [0,4] rwx Tap-2-distance Tap-2-distance. 1 ladspa-tapeDelay::Tap-2-level gfloat [-90,0] rwx Tap-2-level Tap-2-level. -90 ladspa-tapeDelay::Tap-3-distance gfloat [0,4] rwx Tap-3-distance Tap-3-distance. 2 ladspa-tapeDelay::Tap-3-level gfloat [-90,0] rwx Tap-3-level Tap-3-level. -90 ladspa-tapeDelay::Tap-4-distance gfloat [0,4] rwx Tap-4-distance Tap-4-distance. 3 ladspa-tapeDelay::Tap-4-level gfloat [-90,0] rwx Tap-4-level Tap-4-level. -90 ladspa-tapeDelay::Tape-speed gfloat [0,10] rwx Tape-speed Tape-speed. 1 ladspa-sum-iaic-oa::Second-Input gfloat rwx Second-Input Second-Input. -3,40282e+38 ladspa-sum-icic-oc::First-Input gfloat rwx First-Input First-Input. -3,40282e+38 ladspa-sum-icic-oc::Second-Input gfloat rwx Second-Input Second-Input. -3,40282e+38 ladspa-sum-icic-oc::Summed-Output gfloat r Summed-Output Summed-Output. -3,40282e+38 ladspa-sc1::Attack-time gfloat [2,400] rwx Attack-time Attack-time. 101,5 ladspa-sc1::Knee-radius gfloat [1,10] rwx Knee-radius Knee-radius. 3,25 ladspa-sc1::Makeup-gain gfloat [0,24] rwx Makeup-gain Makeup-gain. 0 ladspa-sc1::Ratio gfloat [1,10] rwx Ratio Ratio. 1 ladspa-sc1::Release-time gfloat [2,800] rwx Release-time Release-time. 401 ladspa-sc1::Threshold-level gfloat [-30,0] rwx Threshold-level Threshold-level. 0 ladspa-combSplitter::Band-separation gfloat [16,640] rwx Band-separation Band-separation. 172 ladspa-sc4m::Amplitude gfloat [-40,12] r Amplitude Amplitude. -40 ladspa-sc4m::Attack-time gfloat [1,5,400] rwx Attack-time Attack-time. 101,125 ladspa-sc4m::Gain-reduction gfloat [-24,0] r Gain-reduction Gain-reduction. -24 ladspa-sc4m::Knee-radius gfloat [1,10] rwx Knee-radius Knee-radius. 3,25 ladspa-sc4m::Makeup-gain gfloat [0,24] rwx Makeup-gain Makeup-gain. 0 ladspa-sc4m::RMS-peak gfloat [0,1] rwx RMS-peak RMS-peak. 0 ladspa-sc4m::Ratio gfloat [1,20] rwx Ratio Ratio. 1 ladspa-sc4m::Release-time gfloat [2,800] rwx Release-time Release-time. 401 ladspa-sc4m::Threshold-level gfloat [-30,0] rwx Threshold-level Threshold-level. 0 ladspa-preamp::fc gfloat [20,4000] rwx fc fc. 440 ladspa-preamp::gain gfloat [0,10] rwx gain gain. 1 ladspa-lsFilter::Cutoff-frequency gfloat [88,2,22050] rwx Cutoff-frequency Cutoff-frequency. 1394,56 ladspa-lsFilter::Filter-type gint [0,2] rwx Filter-type Filter-type. 0 ladspa-lsFilter::Resonance gfloat [0,1] rwx Resonance Resonance. 0 ladspa-matrixMSSt::Width gfloat [0,2] rwx Width Width. 1 ladspa-lpf::Cutoff-Frequency gfloat [0,22050] rwx Cutoff-Frequency Cutoff-Frequency. 440 ladspa-hpf::Cutoff-Frequency gfloat [0,22050] rwx Cutoff-Frequency Cutoff-Frequency. 440 ladspa-quantiser50::Match-Range gfloat >= 0 rwx Match-Range Match-Range. 0 ladspa-quantiser50::Mode gint [0,2] rwx Mode Mode. 0 ladspa-quantiser50::Quantise-Range-Maximum gfloat rwx Quantise-Range-Maximum Quantise-Range-Maximum. -3,40282e+38 ladspa-quantiser50::Quantise-Range-Minimum gfloat rwx Quantise-Range-Minimum Quantise-Range-Minimum. -3,40282e+38 ladspa-quantiser50::Steps gint [1,50] rwx Steps Steps. 50 ladspa-quantiser50::Value-0 gfloat rwx Value-0 Value-0. -3,40282e+38 ladspa-quantiser50::Value-1 gfloat rwx Value-1 Value-1. -3,40282e+38 ladspa-quantiser50::Value-10 gfloat rwx Value-10 Value-10. -3,40282e+38 ladspa-quantiser50::Value-11 gfloat rwx Value-11 Value-11. -3,40282e+38 ladspa-quantiser50::Value-12 gfloat rwx Value-12 Value-12. -3,40282e+38 ladspa-quantiser50::Value-13 gfloat rwx Value-13 Value-13. -3,40282e+38 ladspa-quantiser50::Value-14 gfloat rwx Value-14 Value-14. -3,40282e+38 ladspa-quantiser50::Value-15 gfloat rwx Value-15 Value-15. -3,40282e+38 ladspa-quantiser50::Value-16 gfloat rwx Value-16 Value-16. -3,40282e+38 ladspa-quantiser50::Value-17 gfloat rwx Value-17 Value-17. -3,40282e+38 ladspa-quantiser50::Value-18 gfloat rwx Value-18 Value-18. -3,40282e+38 ladspa-quantiser50::Value-19 gfloat rwx Value-19 Value-19. -3,40282e+38 ladspa-quantiser50::Value-2 gfloat rwx Value-2 Value-2. -3,40282e+38 ladspa-quantiser50::Value-20 gfloat rwx Value-20 Value-20. -3,40282e+38 ladspa-quantiser50::Value-21 gfloat rwx Value-21 Value-21. -3,40282e+38 ladspa-quantiser50::Value-22 gfloat rwx Value-22 Value-22. -3,40282e+38 ladspa-quantiser50::Value-23 gfloat rwx Value-23 Value-23. -3,40282e+38 ladspa-quantiser50::Value-24 gfloat rwx Value-24 Value-24. -3,40282e+38 ladspa-quantiser50::Value-25 gfloat rwx Value-25 Value-25. -3,40282e+38 ladspa-quantiser50::Value-26 gfloat rwx Value-26 Value-26. -3,40282e+38 ladspa-quantiser50::Value-27 gfloat rwx Value-27 Value-27. -3,40282e+38 ladspa-quantiser50::Value-28 gfloat rwx Value-28 Value-28. -3,40282e+38 ladspa-quantiser50::Value-29 gfloat rwx Value-29 Value-29. -3,40282e+38 ladspa-quantiser50::Value-3 gfloat rwx Value-3 Value-3. -3,40282e+38 ladspa-quantiser50::Value-30 gfloat rwx Value-30 Value-30. -3,40282e+38 ladspa-quantiser50::Value-31 gfloat rwx Value-31 Value-31. -3,40282e+38 ladspa-quantiser50::Value-32 gfloat rwx Value-32 Value-32. -3,40282e+38 ladspa-quantiser50::Value-33 gfloat rwx Value-33 Value-33. -3,40282e+38 ladspa-quantiser50::Value-34 gfloat rwx Value-34 Value-34. -3,40282e+38 ladspa-quantiser50::Value-35 gfloat rwx Value-35 Value-35. -3,40282e+38 ladspa-quantiser50::Value-36 gfloat rwx Value-36 Value-36. -3,40282e+38 ladspa-quantiser50::Value-37 gfloat rwx Value-37 Value-37. -3,40282e+38 ladspa-quantiser50::Value-38 gfloat rwx Value-38 Value-38. -3,40282e+38 ladspa-quantiser50::Value-39 gfloat rwx Value-39 Value-39. -3,40282e+38 ladspa-quantiser50::Value-4 gfloat rwx Value-4 Value-4. -3,40282e+38 ladspa-quantiser50::Value-40 gfloat rwx Value-40 Value-40. -3,40282e+38 ladspa-quantiser50::Value-41 gfloat rwx Value-41 Value-41. -3,40282e+38 ladspa-quantiser50::Value-42 gfloat rwx Value-42 Value-42. -3,40282e+38 ladspa-quantiser50::Value-43 gfloat rwx Value-43 Value-43. -3,40282e+38 ladspa-quantiser50::Value-44 gfloat rwx Value-44 Value-44. -3,40282e+38 ladspa-quantiser50::Value-45 gfloat rwx Value-45 Value-45. -3,40282e+38 ladspa-quantiser50::Value-46 gfloat rwx Value-46 Value-46. -3,40282e+38 ladspa-quantiser50::Value-47 gfloat rwx Value-47 Value-47. -3,40282e+38 ladspa-quantiser50::Value-48 gfloat rwx Value-48 Value-48. -3,40282e+38 ladspa-quantiser50::Value-49 gfloat rwx Value-49 Value-49. -3,40282e+38 ladspa-quantiser50::Value-5 gfloat rwx Value-5 Value-5. -3,40282e+38 ladspa-quantiser50::Value-6 gfloat rwx Value-6 Value-6. -3,40282e+38 ladspa-quantiser50::Value-7 gfloat rwx Value-7 Value-7. -3,40282e+38 ladspa-quantiser50::Value-8 gfloat rwx Value-8 Value-8. -3,40282e+38 ladspa-quantiser50::Value-9 gfloat rwx Value-9 Value-9. -3,40282e+38 ladspa-plate::Damping gfloat [0,1] rwx Damping Damping. 0,25 ladspa-plate::Dry-wet-mix gfloat [0,1] rwx Dry-wet-mix Dry-wet-mix. 0,25 ladspa-plate::Reverb-time gfloat [0,01,8,5] rwx Reverb-time Reverb-time. 4,255 ladspa-diode::Mode gfloat [0,3] rwx Mode Mode. 0 ladspa-quantiser100::Match-Range gfloat >= 0 rwx Match-Range Match-Range. 0 ladspa-quantiser100::Mode gint [0,2] rwx Mode Mode. 0 ladspa-quantiser100::Quantise-Range-Maximum gfloat rwx Quantise-Range-Maximum Quantise-Range-Maximum. -3,40282e+38 ladspa-quantiser100::Quantise-Range-Minimum gfloat rwx Quantise-Range-Minimum Quantise-Range-Minimum. -3,40282e+38 ladspa-quantiser100::Steps gint [1,100] rwx Steps Steps. 100 ladspa-quantiser100::Value-0 gfloat rwx Value-0 Value-0. -3,40282e+38 ladspa-quantiser100::Value-1 gfloat rwx Value-1 Value-1. -3,40282e+38 ladspa-quantiser100::Value-10 gfloat rwx Value-10 Value-10. -3,40282e+38 ladspa-quantiser100::Value-11 gfloat rwx Value-11 Value-11. -3,40282e+38 ladspa-quantiser100::Value-12 gfloat rwx Value-12 Value-12. -3,40282e+38 ladspa-quantiser100::Value-13 gfloat rwx Value-13 Value-13. -3,40282e+38 ladspa-quantiser100::Value-14 gfloat rwx Value-14 Value-14. -3,40282e+38 ladspa-quantiser100::Value-15 gfloat rwx Value-15 Value-15. -3,40282e+38 ladspa-quantiser100::Value-16 gfloat rwx Value-16 Value-16. -3,40282e+38 ladspa-quantiser100::Value-17 gfloat rwx Value-17 Value-17. -3,40282e+38 ladspa-quantiser100::Value-18 gfloat rwx Value-18 Value-18. -3,40282e+38 ladspa-quantiser100::Value-19 gfloat rwx Value-19 Value-19. -3,40282e+38 ladspa-quantiser100::Value-2 gfloat rwx Value-2 Value-2. -3,40282e+38 ladspa-quantiser100::Value-20 gfloat rwx Value-20 Value-20. -3,40282e+38 ladspa-quantiser100::Value-21 gfloat rwx Value-21 Value-21. -3,40282e+38 ladspa-quantiser100::Value-22 gfloat rwx Value-22 Value-22. -3,40282e+38 ladspa-quantiser100::Value-23 gfloat rwx Value-23 Value-23. -3,40282e+38 ladspa-quantiser100::Value-24 gfloat rwx Value-24 Value-24. -3,40282e+38 ladspa-quantiser100::Value-25 gfloat rwx Value-25 Value-25. -3,40282e+38 ladspa-quantiser100::Value-26 gfloat rwx Value-26 Value-26. -3,40282e+38 ladspa-quantiser100::Value-27 gfloat rwx Value-27 Value-27. -3,40282e+38 ladspa-quantiser100::Value-28 gfloat rwx Value-28 Value-28. -3,40282e+38 ladspa-quantiser100::Value-29 gfloat rwx Value-29 Value-29. -3,40282e+38 ladspa-quantiser100::Value-3 gfloat rwx Value-3 Value-3. -3,40282e+38 ladspa-quantiser100::Value-30 gfloat rwx Value-30 Value-30. -3,40282e+38 ladspa-quantiser100::Value-31 gfloat rwx Value-31 Value-31. -3,40282e+38 ladspa-quantiser100::Value-32 gfloat rwx Value-32 Value-32. -3,40282e+38 ladspa-quantiser100::Value-33 gfloat rwx Value-33 Value-33. -3,40282e+38 ladspa-quantiser100::Value-34 gfloat rwx Value-34 Value-34. -3,40282e+38 ladspa-quantiser100::Value-35 gfloat rwx Value-35 Value-35. -3,40282e+38 ladspa-quantiser100::Value-36 gfloat rwx Value-36 Value-36. -3,40282e+38 ladspa-quantiser100::Value-37 gfloat rwx Value-37 Value-37. -3,40282e+38 ladspa-quantiser100::Value-38 gfloat rwx Value-38 Value-38. -3,40282e+38 ladspa-quantiser100::Value-39 gfloat rwx Value-39 Value-39. -3,40282e+38 ladspa-quantiser100::Value-4 gfloat rwx Value-4 Value-4. -3,40282e+38 ladspa-quantiser100::Value-40 gfloat rwx Value-40 Value-40. -3,40282e+38 ladspa-quantiser100::Value-41 gfloat rwx Value-41 Value-41. -3,40282e+38 ladspa-quantiser100::Value-42 gfloat rwx Value-42 Value-42. -3,40282e+38 ladspa-quantiser100::Value-43 gfloat rwx Value-43 Value-43. -3,40282e+38 ladspa-quantiser100::Value-44 gfloat rwx Value-44 Value-44. -3,40282e+38 ladspa-quantiser100::Value-45 gfloat rwx Value-45 Value-45. -3,40282e+38 ladspa-quantiser100::Value-46 gfloat rwx Value-46 Value-46. -3,40282e+38 ladspa-quantiser100::Value-47 gfloat rwx Value-47 Value-47. -3,40282e+38 ladspa-quantiser100::Value-48 gfloat rwx Value-48 Value-48. -3,40282e+38 ladspa-quantiser100::Value-49 gfloat rwx Value-49 Value-49. -3,40282e+38 ladspa-quantiser100::Value-5 gfloat rwx Value-5 Value-5. -3,40282e+38 ladspa-quantiser100::Value-50 gfloat rwx Value-50 Value-50. -3,40282e+38 ladspa-quantiser100::Value-51 gfloat rwx Value-51 Value-51. -3,40282e+38 ladspa-quantiser100::Value-52 gfloat rwx Value-52 Value-52. -3,40282e+38 ladspa-quantiser100::Value-53 gfloat rwx Value-53 Value-53. -3,40282e+38 ladspa-quantiser100::Value-54 gfloat rwx Value-54 Value-54. -3,40282e+38 ladspa-quantiser100::Value-55 gfloat rwx Value-55 Value-55. -3,40282e+38 ladspa-quantiser100::Value-56 gfloat rwx Value-56 Value-56. -3,40282e+38 ladspa-quantiser100::Value-57 gfloat rwx Value-57 Value-57. -3,40282e+38 ladspa-quantiser100::Value-58 gfloat rwx Value-58 Value-58. -3,40282e+38 ladspa-quantiser100::Value-59 gfloat rwx Value-59 Value-59. -3,40282e+38 ladspa-quantiser100::Value-6 gfloat rwx Value-6 Value-6. -3,40282e+38 ladspa-quantiser100::Value-60 gfloat rwx Value-60 Value-60. -3,40282e+38 ladspa-quantiser100::Value-61 gfloat rwx Value-61 Value-61. -3,40282e+38 ladspa-quantiser100::Value-62 gfloat rwx Value-62 Value-62. -3,40282e+38 ladspa-quantiser100::Value-63 gfloat rwx Value-63 Value-63. -3,40282e+38 ladspa-quantiser100::Value-64 gfloat rwx Value-64 Value-64. -3,40282e+38 ladspa-quantiser100::Value-65 gfloat rwx Value-65 Value-65. -3,40282e+38 ladspa-quantiser100::Value-66 gfloat rwx Value-66 Value-66. -3,40282e+38 ladspa-quantiser100::Value-67 gfloat rwx Value-67 Value-67. -3,40282e+38 ladspa-quantiser100::Value-68 gfloat rwx Value-68 Value-68. -3,40282e+38 ladspa-quantiser100::Value-69 gfloat rwx Value-69 Value-69. -3,40282e+38 ladspa-quantiser100::Value-7 gfloat rwx Value-7 Value-7. -3,40282e+38 ladspa-quantiser100::Value-70 gfloat rwx Value-70 Value-70. -3,40282e+38 ladspa-quantiser100::Value-71 gfloat rwx Value-71 Value-71. -3,40282e+38 ladspa-quantiser100::Value-72 gfloat rwx Value-72 Value-72. -3,40282e+38 ladspa-quantiser100::Value-73 gfloat rwx Value-73 Value-73. -3,40282e+38 ladspa-quantiser100::Value-74 gfloat rwx Value-74 Value-74. -3,40282e+38 ladspa-quantiser100::Value-75 gfloat rwx Value-75 Value-75. -3,40282e+38 ladspa-quantiser100::Value-76 gfloat rwx Value-76 Value-76. -3,40282e+38 ladspa-quantiser100::Value-77 gfloat rwx Value-77 Value-77. -3,40282e+38 ladspa-quantiser100::Value-78 gfloat rwx Value-78 Value-78. -3,40282e+38 ladspa-quantiser100::Value-79 gfloat rwx Value-79 Value-79. -3,40282e+38 ladspa-quantiser100::Value-8 gfloat rwx Value-8 Value-8. -3,40282e+38 ladspa-quantiser100::Value-80 gfloat rwx Value-80 Value-80. -3,40282e+38 ladspa-quantiser100::Value-81 gfloat rwx Value-81 Value-81. -3,40282e+38 ladspa-quantiser100::Value-82 gfloat rwx Value-82 Value-82. -3,40282e+38 ladspa-quantiser100::Value-83 gfloat rwx Value-83 Value-83. -3,40282e+38 ladspa-quantiser100::Value-84 gfloat rwx Value-84 Value-84. -3,40282e+38 ladspa-quantiser100::Value-85 gfloat rwx Value-85 Value-85. -3,40282e+38 ladspa-quantiser100::Value-86 gfloat rwx Value-86 Value-86. -3,40282e+38 ladspa-quantiser100::Value-87 gfloat rwx Value-87 Value-87. -3,40282e+38 ladspa-quantiser100::Value-88 gfloat rwx Value-88 Value-88. -3,40282e+38 ladspa-quantiser100::Value-89 gfloat rwx Value-89 Value-89. -3,40282e+38 ladspa-quantiser100::Value-9 gfloat rwx Value-9 Value-9. -3,40282e+38 ladspa-quantiser100::Value-90 gfloat rwx Value-90 Value-90. -3,40282e+38 ladspa-quantiser100::Value-91 gfloat rwx Value-91 Value-91. -3,40282e+38 ladspa-quantiser100::Value-92 gfloat rwx Value-92 Value-92. -3,40282e+38 ladspa-quantiser100::Value-93 gfloat rwx Value-93 Value-93. -3,40282e+38 ladspa-quantiser100::Value-94 gfloat rwx Value-94 Value-94. -3,40282e+38 ladspa-quantiser100::Value-95 gfloat rwx Value-95 Value-95. -3,40282e+38 ladspa-quantiser100::Value-96 gfloat rwx Value-96 Value-96. -3,40282e+38 ladspa-quantiser100::Value-97 gfloat rwx Value-97 Value-97. -3,40282e+38 ladspa-quantiser100::Value-98 gfloat rwx Value-98 Value-98. -3,40282e+38 ladspa-quantiser100::Value-99 gfloat rwx Value-99 Value-99. -3,40282e+38 ladspa-tap-tubewarmth::Drive gfloat [0,1,10] rwx Drive Drive. 2,575 ladspa-tap-tubewarmth::Tape--Tube-Blend gfloat [-10,10] rwx Tape--Tube-Blend Tape--Tube-Blend. 10 ladspa-vcf-reslp::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-reslp::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-reslp::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-reslp::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-lp::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-lp::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-lp::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-lp::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-hp::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-hp::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-hp::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-hp::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-bp1::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-bp1::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-bp1::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-bp1::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-bp2::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-bp2::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-bp2::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-bp2::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-notch::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-notch::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-notch::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-notch::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-peakeq::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-peakeq::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-peakeq::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-peakeq::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-peakeq::dBgain-Offset gfloat [6,24] rwx dBgain-Offset dBgain-Offset. 6 ladspa-vcf-lshelf::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-lshelf::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-lshelf::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-lshelf::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-lshelf::dBgain-Offset gfloat [6,24] rwx dBgain-Offset dBgain-Offset. 6 ladspa-vcf-hshelf::Frequency-Offset gfloat [20,20000] rwx Frequency-Offset Frequency-Offset. 20 ladspa-vcf-hshelf::Frequency-Pitch gfloat [-2,2] rwx Frequency-Pitch Frequency-Pitch. -2 ladspa-vcf-hshelf::Gain gfloat [0,1] rwx Gain Gain. 0 ladspa-vcf-hshelf::Resonance-Offset gfloat [0,001,1] rwx Resonance-Offset Resonance-Offset. 0,001 ladspa-vcf-hshelf::dBgain-Offset gfloat [6,24] rwx dBgain-Offset dBgain-Offset. 6 ladspa-satanMaximiser::Decay-time gfloat [2,30] rwx Decay-time Decay-time. 30 ladspa-satanMaximiser::Knee-point gfloat [-90,0] rwx Knee-point Knee-point. 0 ladspa-syncpulse-fcpcga-oa::Frequenz gfloat [0,64] rwx Frequenz Frequenz. 16 ladspa-syncpulse-fcpcga-oa::Pulse-Width gfloat [0,1] rwx Pulse-Width Pulse-Width. 0,5 ladspa-transient::Attack-speed gfloat [-1,1] rwx Attack-speed Attack-speed. 0 ladspa-transient::Sustain-time gfloat [-1,1] rwx Sustain-time Sustain-time. 0 ladspa-sc3::Attack-time gfloat [2,400] rwx Attack-time Attack-time. 101,5 ladspa-sc3::Chain-balance gfloat [0,1] rwx Chain-balance Chain-balance. 0 ladspa-sc3::Knee-radius gfloat [1,10] rwx Knee-radius Knee-radius. 3,25 ladspa-sc3::Makeup-gain gfloat [0,24] rwx Makeup-gain Makeup-gain. 0 ladspa-sc3::Ratio gfloat [1,10] rwx Ratio Ratio. 1 ladspa-sc3::Release-time gfloat [2,800] rwx Release-time Release-time. 401 ladspa-sc3::Threshold-level gfloat [-30,0] rwx Threshold-level Threshold-level. 0 ladspa-tap-sigmoid::Post-Gain--dB- gfloat [-90,20] rwx Post-Gain--dB- Post-Gain--dB-. 0 ladspa-tap-sigmoid::Pre-Gain--dB- gfloat [-90,20] rwx Pre-Gain--dB- Pre-Gain--dB-. 0 ladspa-analogueOsc::Frequency gfloat [0,0441,22005,9] rwx Frequency Frequency. 440 ladspa-analogueOsc::Instability gfloat [0,1] rwx Instability Instability. 0 ladspa-analogueOsc::Warmth gfloat [0,1] rwx Warmth Warmth. 0 ladspa-analogueOsc::Waveform gint [1,4] rwx Waveform Waveform. 1 ladspa-adsr::Abklingzeit gfloat >= 0 rwx Abklingzeit Abklingzeit. 0 ladspa-adsr::Ausklingzeit gfloat >= 0 rwx Ausklingzeit Ausklingzeit. 0 ladspa-adsr::Einschwingzeit gfloat >= 0 rwx Einschwingzeit Einschwingzeit. 0 ladspa-adsr::Haltewert gfloat [0,1] rwx Haltewert Haltewert. 1 ladspa-adsr::Trigger-Threshold gfloat rwx Trigger-Threshold Trigger-Threshold. -3,40282e+38 ladspa-sifter::Sift-size gfloat [1,1000] rwx Sift-size Sift-size. 1 ladspa-adsr-g+t::Abklingzeit gfloat >= 0 rwx Abklingzeit Abklingzeit. 0 ladspa-adsr-g+t::Ausklingzeit gfloat >= 0 rwx Ausklingzeit Ausklingzeit. 0 ladspa-adsr-g+t::Einschwingzeit gfloat >= 0 rwx Einschwingzeit Einschwingzeit. 0 ladspa-adsr-g+t::Haltewert gfloat [0,1] rwx Haltewert Haltewert. 1 ladspa-ratio-nadc-oa::Denominator gfloat rwx Denominator Denominator. -3,40282e+38 ladspa-ratio-ncda-oa::Numerator gfloat rwx Numerator Numerator. -3,40282e+38 ladspa-ratio-ncdc-oc::Denominator gfloat rwx Denominator Denominator. -3,40282e+38 ladspa-ratio-ncdc-oc::Numerator gfloat rwx Numerator Numerator. -3,40282e+38 ladspa-ratio-ncdc-oc::Ratio-Output gfloat r Ratio-Output Ratio-Output. -3,40282e+38 ladspa-giantFlange::Delay-1-range gfloat [0,10,5] rwx Delay-1-range Delay-1-range. 2,625 ladspa-giantFlange::Delay-2-range gfloat [0,10,5] rwx Delay-2-range Delay-2-range. 0 ladspa-giantFlange::Double-delay gfloat rwx Double-delay Double-delay. -3,40282e+38 ladspa-giantFlange::Dry-Wet-level gfloat [0,1] rwx Dry-Wet-level Dry-Wet-level. 0 ladspa-giantFlange::Feedback gfloat [-100,100] rwx Feedback Feedback. 0 ladspa-giantFlange::LFO-frequency-1 gfloat [0,30] rwx LFO-frequency-1 LFO-frequency-1. 1 ladspa-giantFlange::LFO-frequency-2 gfloat [0,30] rwx LFO-frequency-2 LFO-frequency-2. 1 ladspa-svf::Filter-Q gfloat [0,1] rwx Filter-Q Filter-Q. 0,25 ladspa-svf::Filter-freq gfloat [0,6000] rwx Filter-freq Filter-freq. 440 ladspa-svf::Filter-resonance gfloat [0,1] rwx Filter-resonance Filter-resonance. 0 ladspa-svf::Filter-type gint [0,5] rwx Filter-type Filter-type. 0 ladspa-lp4pole-fcrcia-oa::Cutoff-Frequency gfloat [0,91875,22050] rwx Cutoff-Frequency Cutoff-Frequency. 22050 ladspa-lp4pole-fcrcia-oa::Resonanz gfloat [0,4] rwx Resonanz Resonanz. 0 ladspa-tap-pitch::Dry-Level--dB- gfloat [-90,20] rwx Dry-Level--dB- Dry-Level--dB-. -90 ladspa-tap-pitch::Rate-Shift---- gfloat [-50,100] rwx Rate-Shift---- Rate-Shift----. 0 ladspa-tap-pitch::Semitone-Shift gfloat [-12,12] rwx Semitone-Shift Semitone-Shift. 0 ladspa-tap-pitch::Wet-Level--dB- gfloat [-90,20] rwx Wet-Level--dB- Wet-Level--dB-. 0 ladspa-tap-pitch::latency gfloat [0,16027] r latency latency. 16027 ladspa-square-fc-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-bandpass-a-iir::Bandwidth gfloat [4,41,19845] rwx Bandwidth Bandwidth. 295,832 ladspa-bandpass-a-iir::Center-Frequency gfloat [4,41,19845] rwx Center-Frequency Center-Frequency. 36,1195 ladspa-amp-mono::Gain gfloat >= 0 rwx Gain Gain. 1 ladspa-amp-stereo::Gain gfloat >= 0 rwx Gain Gain. 1 ladspa-ringmod-2i1o::Modulation-depth gfloat [0,2] rwx Modulation-depth Modulation-depth. 0 ladspa-ringmod-1i1o1l::Frequency gfloat [1,1000] rwx Frequency Frequency. 440 ladspa-ringmod-1i1o1l::Modulation-depth gfloat [0,2] rwx Modulation-depth Modulation-depth. 0 ladspa-ringmod-1i1o1l::Sawtooth-level gfloat [-1,1] rwx Sawtooth-level Sawtooth-level. 0 ladspa-ringmod-1i1o1l::Sine-level gfloat [-1,1] rwx Sine-level Sine-level. 1 ladspa-ringmod-1i1o1l::Square-level gfloat [-1,1] rwx Square-level Square-level. 0 ladspa-ringmod-1i1o1l::Triangle-level gfloat [-1,1] rwx Triangle-level Triangle-level. 0 ladspa-delay-n::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-delay-n::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-delay-l::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-delay-l::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-delay-c::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-delay-c::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-fmod-famc-oa::Modulation gfloat rwx Modulation Modulation. -3,40282e+38 ladspa-fmod-fcma-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-fmod-fcmc-oc::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-fmod-fcmc-oc::Modulation gfloat rwx Modulation Modulation. -3,40282e+38 ladspa-fmod-fcmc-oc::Modulierte-Frequenz gfloat r Modulierte-Frequenz Modulierte-Frequenz. -3,40282e+38 ladspa-gverb::Damping gfloat [0,1] rwx Damping Damping. 0,5 ladspa-gverb::Dry-signal-level gfloat [-70,0] rwx Dry-signal-level Dry-signal-level. -70 ladspa-gverb::Early-reflection-level gfloat [-70,0] rwx Early-reflection-level Early-reflection-level. 0 ladspa-gverb::Input-bandwidth gfloat [0,1] rwx Input-bandwidth Input-bandwidth. 0,75 ladspa-gverb::Reverb-time gfloat [0,1,30] rwx Reverb-time Reverb-time. 7,575 ladspa-gverb::Roomsize gfloat [1,300] rwx Roomsize Roomsize. 75,75 ladspa-gverb::Tail-level gfloat [-70,0] rwx Tail-level Tail-level. -17,5 ladspa-se4::Amplitude gfloat [-40,12] r Amplitude Amplitude. -40 ladspa-se4::Attack-time gfloat [1,5,400] rwx Attack-time Attack-time. 101,125 ladspa-se4::Attenuation gfloat [-24,0] rwx Attenuation Attenuation. 0 ladspa-se4::Gain-expansion gfloat [0,24] r Gain-expansion Gain-expansion. 0 ladspa-se4::Knee-radius gfloat [1,10] rwx Knee-radius Knee-radius. 3,25 ladspa-se4::RMS-peak gfloat [0,1] rwx RMS-peak RMS-peak. 0 ladspa-se4::Ratio gfloat [1,20] rwx Ratio Ratio. 1 ladspa-se4::Release-time gfloat [2,800] rwx Release-time Release-time. 401 ladspa-se4::Threshold-level gfloat [-30,0] rwx Threshold-level Threshold-level. 0 ladspa-gong::Inner-damping gfloat [0,1] rwx Inner-damping Inner-damping. 0,5 ladspa-gong::Inner-size-1 gfloat [0,1] rwx Inner-size-1 Inner-size-1. 0,5 ladspa-gong::Inner-size-2 gfloat [0,1] rwx Inner-size-2 Inner-size-2. 0,5 ladspa-gong::Inner-size-3 gfloat [0,1] rwx Inner-size-3 Inner-size-3. 0,5 ladspa-gong::Inner-size-4 gfloat [0,1] rwx Inner-size-4 Inner-size-4. 0,5 ladspa-gong::Inner-stiffness-1-- gfloat [0,1] rwx Inner-stiffness-1-- Inner-stiffness-1--. 0,5 ladspa-gong::Inner-stiffness-1---1 gfloat [0,1] rwx Inner-stiffness-1---1 Inner-stiffness-1---1. 0,5 ladspa-gong::Inner-stiffness-2-- gfloat [0,1] rwx Inner-stiffness-2-- Inner-stiffness-2--. 0,5 ladspa-gong::Inner-stiffness-2---1 gfloat [0,1] rwx Inner-stiffness-2---1 Inner-stiffness-2---1. 0,5 ladspa-gong::Inner-stiffness-3-- gfloat [0,1] rwx Inner-stiffness-3-- Inner-stiffness-3--. 0,5 ladspa-gong::Inner-stiffness-3---1 gfloat [0,1] rwx Inner-stiffness-3---1 Inner-stiffness-3---1. 0,5 ladspa-gong::Inner-stiffness-4-- gfloat [0,1] rwx Inner-stiffness-4-- Inner-stiffness-4--. 0,5 ladspa-gong::Inner-stiffness-4---1 gfloat [0,1] rwx Inner-stiffness-4---1 Inner-stiffness-4---1. 0,5 ladspa-gong::Mic-position gfloat [0,1] rwx Mic-position Mic-position. 0,25 ladspa-gong::Outer-damping gfloat [0,1] rwx Outer-damping Outer-damping. 0,5 ladspa-gong::Outer-size-1 gfloat [0,1] rwx Outer-size-1 Outer-size-1. 0,5 ladspa-gong::Outer-size-2 gfloat [0,1] rwx Outer-size-2 Outer-size-2. 0,5 ladspa-gong::Outer-size-3 gfloat [0,1] rwx Outer-size-3 Outer-size-3. 0,5 ladspa-gong::Outer-size-4 gfloat [0,1] rwx Outer-size-4 Outer-size-4. 0,5 ladspa-gong::Outer-stiffness-1-- gfloat [0,1] rwx Outer-stiffness-1-- Outer-stiffness-1--. 0,5 ladspa-gong::Outer-stiffness-1---1 gfloat [0,1] rwx Outer-stiffness-1---1 Outer-stiffness-1---1. 0,5 ladspa-gong::Outer-stiffness-2-- gfloat [0,1] rwx Outer-stiffness-2-- Outer-stiffness-2--. 0,5 ladspa-gong::Outer-stiffness-2---1 gfloat [0,1] rwx Outer-stiffness-2---1 Outer-stiffness-2---1. 0,5 ladspa-gong::Outer-stiffness-3-- gfloat [0,1] rwx Outer-stiffness-3-- Outer-stiffness-3--. 0,5 ladspa-gong::Outer-stiffness-3---1 gfloat [0,1] rwx Outer-stiffness-3---1 Outer-stiffness-3---1. 0,5 ladspa-gong::Outer-stiffness-4-- gfloat [0,1] rwx Outer-stiffness-4-- Outer-stiffness-4--. 0,5 ladspa-gong::Outer-stiffness-4---1 gfloat [0,1] rwx Outer-stiffness-4---1 Outer-stiffness-4---1. 0,5 ladspa-encode-bformat::Sound-Source-X-Coordinate gfloat rwx Sound-Source-X-Coordinate Sound-Source-X-Coordinate. 1 ladspa-encode-bformat::Sound-Source-Y-Coordinate gfloat rwx Sound-Source-Y-Coordinate Sound-Source-Y-Coordinate. 0 ladspa-encode-bformat::Sound-Source-Z-Coordinate gfloat rwx Sound-Source-Z-Coordinate Sound-Source-Z-Coordinate. 0 ladspa-encode-fmh::Sound-Source-X-Coordinate gfloat rwx Sound-Source-X-Coordinate Sound-Source-X-Coordinate. 1 ladspa-encode-fmh::Sound-Source-Y-Coordinate gfloat rwx Sound-Source-Y-Coordinate Sound-Source-Y-Coordinate. 0 ladspa-encode-fmh::Sound-Source-Z-Coordinate gfloat rwx Sound-Source-Z-Coordinate Sound-Source-Z-Coordinate. 0 ladspa-bf-rotate-z::Angle-of-Rotation gfloat [-180,180] rwx Angle-of-Rotation Angle-of-Rotation. 90 ladspa-fmh-rotate-z::Angle-of-Rotation gfloat [-180,180] rwx Angle-of-Rotation Angle-of-Rotation. 90 ladspa-analogue::DCO1-Attack gfloat [0,1] rwx DCO1-Attack DCO1-Attack. 0 ladspa-analogue::DCO1-Decay gfloat [0,1] rwx DCO1-Decay DCO1-Decay. 0 ladspa-analogue::DCO1-LFO-Frequency-Modulation gfloat [-2,2] rwx DCO1-LFO-Frequency-Modulation DCO1-LFO-Frequency-Modulation. -2 ladspa-analogue::DCO1-LFO-Pulse-Width-Modulation gint [0,5] rwx DCO1-LFO-Pulse-Width-Modulation DCO1-LFO-Pulse-Width-Modulation. 0 ladspa-analogue::DCO1-Octave gfloat [0,001,1] rwx DCO1-Octave DCO1-Octave. 0,001 ladspa-analogue::DCO1-Release gfloat [0,01,8] rwx DCO1-Release DCO1-Release. 0,01 ladspa-analogue::DCO1-Sustain gfloat [0,01,8] rwx DCO1-Sustain DCO1-Sustain. 0,01 ladspa-analogue::DCO1-Waveform gfloat [0,10] rwx DCO1-Waveform DCO1-Waveform. 0 ladspa-analogue::DCO2-Attack gfloat [0,1] rwx DCO2-Attack DCO2-Attack. 0 ladspa-analogue::DCO2-Decay gfloat [0,1] rwx DCO2-Decay DCO2-Decay. 0 ladspa-analogue::DCO2-LFO-Frequency-Modulation gfloat [-2,2] rwx DCO2-LFO-Frequency-Modulation DCO2-LFO-Frequency-Modulation. -2 ladspa-analogue::DCO2-LFO-Pulse-Width-Modulation gint [0,5] rwx DCO2-LFO-Pulse-Width-Modulation DCO2-LFO-Pulse-Width-Modulation. 0 ladspa-analogue::DCO2-Octave gfloat [0,1] rwx DCO2-Octave DCO2-Octave. 0 ladspa-analogue::DCO2-Release gfloat [0,01,8] rwx DCO2-Release DCO2-Release. 0,01 ladspa-analogue::DCO2-Sustain gfloat [0,01,8] rwx DCO2-Sustain DCO2-Sustain. 0,01 ladspa-analogue::DCO2-Waveform gfloat [0,01,8] rwx DCO2-Waveform DCO2-Waveform. 0,01 ladspa-analogue::Filter-Attack gfloat [0,1] rwx Filter-Attack Filter-Attack. 0 ladspa-analogue::Filter-Decay gfloat [0,1] rwx Filter-Decay Filter-Decay. 0 ladspa-analogue::Filter-Envelope-Modulation gfloat [0,20] rwx Filter-Envelope-Modulation Filter-Envelope-Modulation. 0 ladspa-analogue::Filter-LFO-Modulation gfloat [0,01,8] rwx Filter-LFO-Modulation Filter-LFO-Modulation. 0,01 ladspa-analogue::Filter-Release gfloat [0,01,8] rwx Filter-Release Filter-Release. 0,01 ladspa-analogue::Filter-Resonance gfloat [0,1] rwx Filter-Resonance Filter-Resonance. 0 ladspa-analogue::Filter-Sustain gfloat [0,01,8] rwx Filter-Sustain Filter-Sustain. 0,01 ladspa-analogue::Frequency gfloat [0,20000] rwx Frequency Frequency. 0 ladspa-analogue::Gate gboolean rwx Gate Gate. FALSE ladspa-analogue::LFO-Fadein gfloat [0,01,8] rwx LFO-Fadein LFO-Fadein. 0,01 ladspa-analogue::LFO-Frequency gfloat [0,1] rwx LFO-Frequency LFO-Frequency. 0 ladspa-analogue::Velocity gfloat [0,1] rwx Velocity Velocity. 0 ladspa-canyon-delay::Left-to-Right-Feedback gfloat [-1,1] rwx Left-to-Right-Feedback Left-to-Right-Feedback. -1 ladspa-canyon-delay::Left-to-Right-Time gfloat [0,01,0,99] rwx Left-to-Right-Time Left-to-Right-Time. 0,01 ladspa-canyon-delay::Low-Pass-Cutoff gfloat [1,5000] rwx Low-Pass-Cutoff Low-Pass-Cutoff. 1 ladspa-canyon-delay::Right-to-Left-Feedback gfloat [-1,1] rwx Right-to-Left-Feedback Right-to-Left-Feedback. -1 ladspa-canyon-delay::Right-to-Left-Time gfloat [0,01,0,99] rwx Right-to-Left-Time Right-to-Left-Time. 0,01 ladspa-disintegrator::Multiplier gfloat [-1,1] rwx Multiplier Multiplier. 0 ladspa-disintegrator::Probability gfloat [0,1] rwx Probability Probability. 0 ladspa-sledgehammer::Carrier-influence gfloat [-1,1] rwx Carrier-influence Carrier-influence. 1 ladspa-sledgehammer::Modulator-influence gfloat [-1,1] rwx Modulator-influence Modulator-influence. 0 ladspa-sledgehammer::Rate gfloat [1e-05,0,001] rwx Rate Rate. 0,000505 ladspa-delay-0-01s::Delay gfloat [0,0,01] rwx Delay Delay. 0,01 ladspa-delay-0-01s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-delay-0-1s::Delay gfloat [0,0,1] rwx Delay Delay. 0,1 ladspa-delay-0-1s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-delay-1s::Delay gfloat [0,1] rwx Delay Delay. 1 ladspa-delay-1s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-delay-5s::Delay gfloat [0,5] rwx Delay Delay. 1 ladspa-delay-5s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-delay-60s::Delay gfloat [0,60] rwx Delay Delay. 1 ladspa-delay-60s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-track-max-peak::Envelope-Forgetting-Factor gfloat >= 0 rwx Envelope-Forgetting-Factor Envelope-Forgetting-Factor. 3,40282e+38 ladspa-track-max-peak::Output gfloat >= 0 r Output Output. 0 ladspa-track-max-rms::Envelope-Forgetting-Factor gfloat >= 0 rwx Envelope-Forgetting-Factor Envelope-Forgetting-Factor. 3,40282e+38 ladspa-track-max-rms::Output gfloat >= 0 r Output Output. 0 ladspa-track-peak::Output gfloat >= 0 r Output Output. 0 ladspa-track-peak::Smoothing-Factor gfloat [0,1] rwx Smoothing-Factor Smoothing-Factor. 0 ladspa-track-rms::Output gfloat >= 0 r Output Output. 0 ladspa-track-rms::Smoothing-Factor gfloat [0,1] rwx Smoothing-Factor Smoothing-Factor. 0 ladspa-fbdelay-0-01s::Delay gfloat [0,0,01] rwx Delay Delay. 0,01 ladspa-fbdelay-0-01s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-fbdelay-0-01s::Feedback gfloat [-1,1] rwx Feedback Feedback. 0,5 ladspa-fbdelay-0-1s::Delay gfloat [0,0,1] rwx Delay Delay. 0,1 ladspa-fbdelay-0-1s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-fbdelay-0-1s::Feedback gfloat [-1,1] rwx Feedback Feedback. 0,5 ladspa-fbdelay-1s::Delay gfloat [0,1] rwx Delay Delay. 1 ladspa-fbdelay-1s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-fbdelay-1s::Feedback gfloat [-1,1] rwx Feedback Feedback. 0,5 ladspa-fbdelay-5s::Delay gfloat [0,5] rwx Delay Delay. 1 ladspa-fbdelay-5s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-fbdelay-5s::Feedback gfloat [-1,1] rwx Feedback Feedback. 0,5 ladspa-fbdelay-60s::Delay gfloat [0,60] rwx Delay Delay. 1 ladspa-fbdelay-60s::Dry-Wet-Balance gfloat [0,1] rwx Dry-Wet-Balance Dry-Wet-Balance. 0,5 ladspa-fbdelay-60s::Feedback gfloat [-1,1] rwx Feedback Feedback. 0,5 ladspa-freeverb3::Damping gfloat [0,1] rwx Damping Damping. 0 ladspa-freeverb3::Dry-Level gfloat [0,1] rwx Dry-Level Dry-Level. 1 ladspa-freeverb3::Freeze-Mode gboolean rwx Freeze-Mode Freeze-Mode. FALSE ladspa-freeverb3::Room-Size gfloat [0,1] rwx Room-Size Room-Size. 0,5 ladspa-freeverb3::Wet-Level gfloat [0,1] rwx Wet-Level Wet-Level. 0 ladspa-freeverb3::Width gfloat [0,1] rwx Width Width. 0,5 ladspa-grain-scatter::Density gfloat >= 0 rwx Density Density. 3,40282e+38 ladspa-grain-scatter::Grain-Attack gfloat >= 0 rwx Grain-Attack Grain-Attack. 3,40282e+38 ladspa-grain-scatter::Grain-Length gfloat >= 0 rwx Grain-Length Grain-Length. 3,40282e+38 ladspa-grain-scatter::Scatter gfloat [0,5] rwx Scatter Scatter. 2,5 ladspa-hard-gate::Threshold gfloat [0,1] rwx Threshold Threshold. 0 ladspa-identity-control::Input gfloat rwx Input Input. -3,40282e+38 ladspa-identity-control::Output gfloat r Output Output. -3,40282e+38 ladspa-lofi::Crackling gint [0,100] rwx Crackling Crackling. 0 ladspa-lofi::Opamp-Bandwidth-Limiting gfloat [1,10000] rwx Opamp-Bandwidth-Limiting Opamp-Bandwidth-Limiting. 1 ladspa-lofi::Powersupply-Overloading gfloat [0,100] rwx Powersupply-Overloading Powersupply-Overloading. 0 ladspa-logistic::Step-frequency gfloat [0,44,1] rwx Step-frequency Step-frequency. 22,05 ladspa-logistic::param--r--parameter gfloat [2,9,3,9999] rwx param--r--parameter param--r--parameter. 3,9999 ladspa-noise-source-white::Amplitude gfloat >= 0 rwx Amplitude Amplitude. 1 ladspa-null-ci::Input gfloat rwx Input Input. -3,40282e+38 ladspa-null-co::Output gfloat r Output Output. -3,40282e+38 ladspa-organ::Attack-Hi gfloat [0,01,1] rwx Attack-Hi Attack-Hi. 0,01 ladspa-organ::Attack-Lo gfloat [0,01,1] rwx Attack-Lo Attack-Lo. 0,01 ladspa-organ::Brass gboolean rwx Brass Brass. FALSE ladspa-organ::Decay-Hi gfloat [0,01,1] rwx Decay-Hi Decay-Hi. 0,01 ladspa-organ::Decay-Lo gfloat [0,01,1] rwx Decay-Lo Decay-Lo. 0,01 ladspa-organ::Flute gboolean rwx Flute Flute. FALSE ladspa-organ::Frequency gfloat [0,20000] rwx Frequency Frequency. 0 ladspa-organ::Gate gboolean rwx Gate Gate. FALSE ladspa-organ::Reed gboolean rwx Reed Reed. FALSE ladspa-organ::Release-Hi gfloat [0,01,1] rwx Release-Hi Release-Hi. 0,01 ladspa-organ::Release-Lo gfloat [0,01,1] rwx Release-Lo Release-Lo. 0,01 ladspa-organ::Sustain-Hi gfloat [0,1] rwx Sustain-Hi Sustain-Hi. 0 ladspa-organ::Sustain-Lo gfloat [0,1] rwx Sustain-Lo Sustain-Lo. 0 ladspa-organ::Velocity gfloat [0,1] rwx Velocity Velocity. 0 ladspa-organ::param-16th-Harmonic gfloat [0,1] rwx param-16th-Harmonic param-16th-Harmonic. 0 ladspa-organ::param-2-2-3rd-Harmonic gfloat [0,1] rwx param-2-2-3rd-Harmonic param-2-2-3rd-Harmonic. 0 ladspa-organ::param-2nd-Harmonic gfloat [0,1] rwx param-2nd-Harmonic param-2nd-Harmonic. 0 ladspa-organ::param-4th-Harmonic gfloat [0,1] rwx param-4th-Harmonic param-4th-Harmonic. 0 ladspa-organ::param-5-1-3rd-Harmonic gfloat [0,1] rwx param-5-1-3rd-Harmonic param-5-1-3rd-Harmonic. 0 ladspa-organ::param-8th-Harmonic gfloat [0,1] rwx param-8th-Harmonic param-8th-Harmonic. 0 ladspa-peak::Peak gfloat >= 0 r Peak Peak. 0 ladspa-phasemod::DCO1-Attack gfloat [0,01,8] rwx DCO1-Attack DCO1-Attack. 0,01 ladspa-phasemod::DCO1-Decay gfloat [0,01,8] rwx DCO1-Decay DCO1-Decay. 0,01 ladspa-phasemod::DCO1-Modulation gfloat [0,1] rwx DCO1-Modulation DCO1-Modulation. 0 ladspa-phasemod::DCO1-Octave gfloat [-2,2] rwx DCO1-Octave DCO1-Octave. -2 ladspa-phasemod::DCO1-Release gfloat [0,01,8] rwx DCO1-Release DCO1-Release. 0,01 ladspa-phasemod::DCO1-Sustain gfloat [0,1] rwx DCO1-Sustain DCO1-Sustain. 0 ladspa-phasemod::DCO1-Waveform gint [0,5] rwx DCO1-Waveform DCO1-Waveform. 0 ladspa-phasemod::DCO2-Attack gfloat [0,01,8] rwx DCO2-Attack DCO2-Attack. 0,01 ladspa-phasemod::DCO2-Decay gfloat [0,01,8] rwx DCO2-Decay DCO2-Decay. 0,01 ladspa-phasemod::DCO2-Modulation gfloat [0,1] rwx DCO2-Modulation DCO2-Modulation. 0 ladspa-phasemod::DCO2-Octave gfloat [-2,2] rwx DCO2-Octave DCO2-Octave. -2 ladspa-phasemod::DCO2-Release gfloat [0,01,8] rwx DCO2-Release DCO2-Release. 0,01 ladspa-phasemod::DCO2-Sustain gfloat [0,1] rwx DCO2-Sustain DCO2-Sustain. 0 ladspa-phasemod::DCO2-Waveform gint [0,5] rwx DCO2-Waveform DCO2-Waveform. 0 ladspa-phasemod::DCO3-Attack gfloat [0,01,8] rwx DCO3-Attack DCO3-Attack. 0,01 ladspa-phasemod::DCO3-Decay gfloat [0,01,8] rwx DCO3-Decay DCO3-Decay. 0,01 ladspa-phasemod::DCO3-Modulation gfloat [0,1] rwx DCO3-Modulation DCO3-Modulation. 0 ladspa-phasemod::DCO3-Octave gfloat [-2,2] rwx DCO3-Octave DCO3-Octave. -2 ladspa-phasemod::DCO3-Release gfloat [0,01,8] rwx DCO3-Release DCO3-Release. 0,01 ladspa-phasemod::DCO3-Sustain gfloat [0,1] rwx DCO3-Sustain DCO3-Sustain. 0 ladspa-phasemod::DCO3-Waveform gint [0,5] rwx DCO3-Waveform DCO3-Waveform. 0 ladspa-phasemod::DCO4-Attack gfloat [0,01,8] rwx DCO4-Attack DCO4-Attack. 0,01 ladspa-phasemod::DCO4-Decay gfloat [0,01,8] rwx DCO4-Decay DCO4-Decay. 0,01 ladspa-phasemod::DCO4-Modulation gfloat [0,1] rwx DCO4-Modulation DCO4-Modulation. 0 ladspa-phasemod::DCO4-Octave gfloat [-2,2] rwx DCO4-Octave DCO4-Octave. -2 ladspa-phasemod::DCO4-Release gfloat [0,01,8] rwx DCO4-Release DCO4-Release. 0,01 ladspa-phasemod::DCO4-Sustain gfloat [0,1] rwx DCO4-Sustain DCO4-Sustain. 0 ladspa-phasemod::DCO4-Waveform gint [0,5] rwx DCO4-Waveform DCO4-Waveform. 0 ladspa-phasemod::DCO5-Attack gfloat [0,01,8] rwx DCO5-Attack DCO5-Attack. 0,01 ladspa-phasemod::DCO5-Decay gfloat [0,01,8] rwx DCO5-Decay DCO5-Decay. 0,01 ladspa-phasemod::DCO5-Modulation gfloat [0,1] rwx DCO5-Modulation DCO5-Modulation. 0 ladspa-phasemod::DCO5-Octave gfloat [-2,2] rwx DCO5-Octave DCO5-Octave. -2 ladspa-phasemod::DCO5-Release gfloat [0,01,8] rwx DCO5-Release DCO5-Release. 0,01 ladspa-phasemod::DCO5-Sustain gfloat [0,1] rwx DCO5-Sustain DCO5-Sustain. 0 ladspa-phasemod::DCO5-Waveform gint [0,5] rwx DCO5-Waveform DCO5-Waveform. 0 ladspa-phasemod::DCO6-Attack gfloat [0,01,8] rwx DCO6-Attack DCO6-Attack. 0,01 ladspa-phasemod::DCO6-Decay gfloat [0,01,8] rwx DCO6-Decay DCO6-Decay. 0,01 ladspa-phasemod::DCO6-Modulation gfloat [0,1] rwx DCO6-Modulation DCO6-Modulation. 0 ladspa-phasemod::DCO6-Octave gfloat [-2,2] rwx DCO6-Octave DCO6-Octave. -2 ladspa-phasemod::DCO6-Release gfloat [0,01,8] rwx DCO6-Release DCO6-Release. 0,01 ladspa-phasemod::DCO6-Sustain gfloat [0,1] rwx DCO6-Sustain DCO6-Sustain. 0 ladspa-phasemod::DCO6-Waveform gint [0,5] rwx DCO6-Waveform DCO6-Waveform. 0 ladspa-phasemod::Frequency gfloat [0,20000] rwx Frequency Frequency. 0 ladspa-phasemod::Gate gboolean rwx Gate Gate. FALSE ladspa-phasemod::Velocity gfloat [0,1] rwx Velocity Velocity. 0 ladspa-pink-interpolated-audio::Highest-frequency gfloat [0,44100] rwx Highest-frequency Highest-frequency. 1 ladspa-pink-sh::Sample-and-hold-frequency gfloat [0,882] rwx Sample-and-hold-frequency Sample-and-hold-frequency. 1 ladspa-compress-peak::Compression-Ratio gfloat <= 1 rwx Compression-Ratio Compression-Ratio. -1,70141e+38 ladspa-compress-peak::Output-Envelope-Attack gfloat >= 0 rwx Output-Envelope-Attack Output-Envelope-Attack. 3,40282e+38 ladspa-compress-peak::Output-Envelope-Decay gfloat >= 0 rwx Output-Envelope-Decay Output-Envelope-Decay. 3,40282e+38 ladspa-compress-peak::Threshold gfloat >= 0 rwx Threshold Threshold. 1 ladspa-compress-rms::Compression-Ratio gfloat <= 1 rwx Compression-Ratio Compression-Ratio. -1,70141e+38 ladspa-compress-rms::Output-Envelope-Attack gfloat >= 0 rwx Output-Envelope-Attack Output-Envelope-Attack. 3,40282e+38 ladspa-compress-rms::Output-Envelope-Decay gfloat >= 0 rwx Output-Envelope-Decay Output-Envelope-Decay. 3,40282e+38 ladspa-compress-rms::Threshold gfloat >= 0 rwx Threshold Threshold. 1 ladspa-expand-peak::Expansion-Ratio gfloat <= 1 rwx Expansion-Ratio Expansion-Ratio. -1,70141e+38 ladspa-expand-peak::Output-Envelope-Attack gfloat >= 0 rwx Output-Envelope-Attack Output-Envelope-Attack. 3,40282e+38 ladspa-expand-peak::Output-Envelope-Decay gfloat >= 0 rwx Output-Envelope-Decay Output-Envelope-Decay. 3,40282e+38 ladspa-expand-peak::Threshold gfloat >= 0 rwx Threshold Threshold. 1 ladspa-expand-rms::Expansion-Ratio gfloat <= 1 rwx Expansion-Ratio Expansion-Ratio. -1,70141e+38 ladspa-expand-rms::Output-Envelope-Attack gfloat >= 0 rwx Output-Envelope-Attack Output-Envelope-Attack. 3,40282e+38 ladspa-expand-rms::Output-Envelope-Decay gfloat >= 0 rwx Output-Envelope-Decay Output-Envelope-Decay. 3,40282e+38 ladspa-expand-rms::Threshold gfloat >= 0 rwx Threshold Threshold. 1 ladspa-limit-peak::Output-Envelope-Attack gfloat >= 0 rwx Output-Envelope-Attack Output-Envelope-Attack. 3,40282e+38 ladspa-limit-peak::Output-Envelope-Decay gfloat >= 0 rwx Output-Envelope-Decay Output-Envelope-Decay. 3,40282e+38 ladspa-limit-peak::Threshold gfloat >= 0 rwx Threshold Threshold. 1 ladspa-limit-rms::Output-Envelope-Attack gfloat >= 0 rwx Output-Envelope-Attack Output-Envelope-Attack. 3,40282e+38 ladspa-limit-rms::Output-Envelope-Decay gfloat >= 0 rwx Output-Envelope-Decay Output-Envelope-Decay. 3,40282e+38 ladspa-limit-rms::Threshold gfloat >= 0 rwx Threshold Threshold. 1 ladspa-sine-faac::Amplitude gfloat >= 0 rwx Amplitude Amplitude. 1 ladspa-sine-fcaa::Frequency gfloat [0,22050] rwx Frequency Frequency. 440 ladspa-sine-fcac::Amplitude gfloat >= 0 rwx Amplitude Amplitude. 1 ladspa-sine-fcac::Frequency gfloat [0,22050] rwx Frequency Frequency. 440 ladspa-syndrum::Frequency gfloat [0,20000] rwx Frequency Frequency. 0 ladspa-syndrum::Frequency-Ratio gfloat [0,10] rwx Frequency-Ratio Frequency-Ratio. 0 ladspa-syndrum::Resonance gfloat [0,001,1] rwx Resonance Resonance. 0,001 ladspa-syndrum::Trigger gboolean rwx Trigger Trigger. FALSE ladspa-syndrum::Velocity gfloat [0,10] rwx Velocity Velocity. 0 ladspa-vcf303::Cutoff gfloat [0,1] rwx Cutoff Cutoff. 0 ladspa-vcf303::Decay gfloat [0,1] rwx Decay Decay. 0 ladspa-vcf303::Envelope-Modulation gfloat [0,1] rwx Envelope-Modulation Envelope-Modulation. 0 ladspa-vcf303::Resonance gfloat [0,1] rwx Resonance Resonance. 0 ladspa-vcf303::Trigger gboolean rwx Trigger Trigger. FALSE ladspa-wshape-sine::Limiting-Amplitude gfloat >= 0 rwx Limiting-Amplitude Limiting-Amplitude. 1 ladspa-chebstortion::Distortion gfloat [0,3] rwx Distortion Distortion. 0 ladspa-lcrDelay::C-delay gfloat [0,2700] rwx C-delay C-delay. 675 ladspa-lcrDelay::C-level gfloat [0,50] rwx C-level C-level. 25 ladspa-lcrDelay::Dry-Wet-level gfloat [0,1] rwx Dry-Wet-level Dry-Wet-level. 0 ladspa-lcrDelay::Feedback gfloat [-100,100] rwx Feedback Feedback. 0 ladspa-lcrDelay::High-damp gfloat [0,100] rwx High-damp High-damp. 50 ladspa-lcrDelay::L-delay gfloat [0,2700] rwx L-delay L-delay. 675 ladspa-lcrDelay::L-level gfloat [0,50] rwx L-level L-level. 25 ladspa-lcrDelay::Low-damp gfloat [0,100] rwx Low-damp Low-damp. 50 ladspa-lcrDelay::R-delay gfloat [0,2700] rwx R-delay R-delay. 675 ladspa-lcrDelay::R-level gfloat [0,50] rwx R-level R-level. 25 ladspa-lcrDelay::Spread gfloat [0,50] rwx Spread Spread. 25 ladspa-divider::Denominator gint [1,8] rwx Denominator Denominator. 1 ladspa-random-fasc-oa::Wave-Smoothness gfloat [0,1] rwx Wave-Smoothness Wave-Smoothness. 1 ladspa-random-fcsa-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-random-fcsc-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-random-fcsc-oa::Wave-Smoothness gfloat [0,1] rwx Wave-Smoothness Wave-Smoothness. 1 ladspa-lfoPhaser::Feedback gfloat [-1,1] rwx Feedback Feedback. 0 ladspa-lfoPhaser::LFO-depth gfloat [0,1] rwx LFO-depth LFO-depth. 0,25 ladspa-lfoPhaser::LFO-rate gfloat [0,100] rwx LFO-rate LFO-rate. 25 ladspa-lfoPhaser::Spread gfloat [0,2] rwx Spread Spread. 1 ladspa-fourByFourPole::Feedback-1 gfloat [-1,1] rwx Feedback-1 Feedback-1. 0 ladspa-fourByFourPole::Feedback-2 gfloat [-1,1] rwx Feedback-2 Feedback-2. 0 ladspa-fourByFourPole::Feedback-3 gfloat [-1,1] rwx Feedback-3 Feedback-3. 0 ladspa-fourByFourPole::Feedback-4 gfloat [-1,1] rwx Feedback-4 Feedback-4. 0 ladspa-fourByFourPole::Frequency-1 gfloat [1,20000] rwx Frequency-1 Frequency-1. 5000,75 ladspa-fourByFourPole::Frequency-2 gfloat [1,20000] rwx Frequency-2 Frequency-2. 10000,5 ladspa-fourByFourPole::Frequency-3 gfloat [1,20000] rwx Frequency-3 Frequency-3. 15000,2 ladspa-fourByFourPole::Frequency-4 gfloat [1,20000] rwx Frequency-4 Frequency-4. 20000 ladspa-autoPhaser::Attack-time gfloat [0,1] rwx Attack-time Attack-time. 0,25 ladspa-autoPhaser::Decay-time gfloat [0,1] rwx Decay-time Decay-time. 0,25 ladspa-autoPhaser::Feedback gfloat [-1,1] rwx Feedback Feedback. 0 ladspa-autoPhaser::Modulation-depth gfloat [0,1] rwx Modulation-depth Modulation-depth. 0,25 ladspa-autoPhaser::Spread gfloat [0,2] rwx Spread Spread. 1 ladspa-tap-reflector::Dry-Level--dB- gfloat [-90,20] rwx Dry-Level--dB- Dry-Level--dB-. -90 ladspa-tap-reflector::Fragment-Length--ms- gfloat [20,1600] rwx Fragment-Length--ms- Fragment-Length--ms-. 415 ladspa-tap-reflector::Wet-Level--dB- gfloat [-90,20] rwx Wet-Level--dB- Wet-Level--dB-. 0 ladspa-fastLookaheadLimiter::Attenuation gfloat [0,70] r Attenuation Attenuation. 0 ladspa-fastLookaheadLimiter::Input-gain gfloat [-20,20] rwx Input-gain Input-gain. 0 ladspa-fastLookaheadLimiter::Limit gfloat [-20,0] rwx Limit Limit. 0 ladspa-fastLookaheadLimiter::Release-time gfloat [0,01,2] rwx Release-time Release-time. 0,5075 ladspa-fastLookaheadLimiter::latency gfloat r latency latency. -3,40282e+38 ladspa-quantiser20::Match-Range gfloat >= 0 rwx Match-Range Match-Range. 0 ladspa-quantiser20::Mode gint [0,2] rwx Mode Mode. 0 ladspa-quantiser20::Quantise-Range-Maximum gfloat rwx Quantise-Range-Maximum Quantise-Range-Maximum. -3,40282e+38 ladspa-quantiser20::Quantise-Range-Minimum gfloat rwx Quantise-Range-Minimum Quantise-Range-Minimum. -3,40282e+38 ladspa-quantiser20::Steps gint [1,20] rwx Steps Steps. 20 ladspa-quantiser20::Value-0 gfloat rwx Value-0 Value-0. -3,40282e+38 ladspa-quantiser20::Value-1 gfloat rwx Value-1 Value-1. -3,40282e+38 ladspa-quantiser20::Value-10 gfloat rwx Value-10 Value-10. -3,40282e+38 ladspa-quantiser20::Value-11 gfloat rwx Value-11 Value-11. -3,40282e+38 ladspa-quantiser20::Value-12 gfloat rwx Value-12 Value-12. -3,40282e+38 ladspa-quantiser20::Value-13 gfloat rwx Value-13 Value-13. -3,40282e+38 ladspa-quantiser20::Value-14 gfloat rwx Value-14 Value-14. -3,40282e+38 ladspa-quantiser20::Value-15 gfloat rwx Value-15 Value-15. -3,40282e+38 ladspa-quantiser20::Value-16 gfloat rwx Value-16 Value-16. -3,40282e+38 ladspa-quantiser20::Value-17 gfloat rwx Value-17 Value-17. -3,40282e+38 ladspa-quantiser20::Value-18 gfloat rwx Value-18 Value-18. -3,40282e+38 ladspa-quantiser20::Value-19 gfloat rwx Value-19 Value-19. -3,40282e+38 ladspa-quantiser20::Value-2 gfloat rwx Value-2 Value-2. -3,40282e+38 ladspa-quantiser20::Value-3 gfloat rwx Value-3 Value-3. -3,40282e+38 ladspa-quantiser20::Value-4 gfloat rwx Value-4 Value-4. -3,40282e+38 ladspa-quantiser20::Value-5 gfloat rwx Value-5 Value-5. -3,40282e+38 ladspa-quantiser20::Value-6 gfloat rwx Value-6 Value-6. -3,40282e+38 ladspa-quantiser20::Value-7 gfloat rwx Value-7 Value-7. -3,40282e+38 ladspa-quantiser20::Value-8 gfloat rwx Value-8 Value-8. -3,40282e+38 ladspa-quantiser20::Value-9 gfloat rwx Value-9 Value-9. -3,40282e+38 ladspa-vynil::Crackle gfloat [0,1] rwx Crackle Crackle. 0 ladspa-vynil::RPM gfloat [33,78] rwx RPM RPM. 33 ladspa-vynil::Surface-warping gfloat [0,1] rwx Surface-warping Surface-warping. 0 ladspa-vynil::Wear gfloat [0,1] rwx Wear Wear. 0 ladspa-vynil::Year gfloat [1900,1990] rwx Year Year. 1990 ladspa-const::Signal-amplitude gfloat [-1,1,1] rwx Signal-amplitude Signal-amplitude. 0 ladspa-product-iaic-oa::Second-Input gfloat rwx Second-Input Second-Input. -3,40282e+38 ladspa-product-icic-oc::First-Input gfloat rwx First-Input First-Input. -3,40282e+38 ladspa-product-icic-oc::Product-Output gfloat r Product-Output Product-Output. -3,40282e+38 ladspa-product-icic-oc::Second-Input gfloat rwx Second-Input Second-Input. -3,40282e+38 ladspa-tap-reverb::Allpass-Filters gboolean rwx Allpass-Filters Allpass-Filters. FALSE ladspa-tap-reverb::Bandpass-Filter gboolean rwx Bandpass-Filter Bandpass-Filter. FALSE ladspa-tap-reverb::Comb-Filters gboolean rwx Comb-Filters Comb-Filters. FALSE ladspa-tap-reverb::Decay--ms- gfloat [0,10000] rwx Decay--ms- Decay--ms-. 2500 ladspa-tap-reverb::Dry-Level--dB- gfloat [-70,10] rwx Dry-Level--dB- Dry-Level--dB-. 0 ladspa-tap-reverb::Enhanced-Stereo gboolean rwx Enhanced-Stereo Enhanced-Stereo. FALSE ladspa-tap-reverb::Reverb-Type gint [0,42] rwx Reverb-Type Reverb-Type. 0 ladspa-tap-reverb::Wet-Level--dB- gfloat [-70,10] rwx Wet-Level--dB- Wet-Level--dB-. 0 ladspa-Pulse-VCO::Exp-FM-gain gfloat [0,4] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Pulse-VCO::LP-filter gfloat [0,1] rwx LP-filter LP-filter. 1 ladspa-Pulse-VCO::Lin-FM-gain gfloat [0,4] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Pulse-VCO::Octave gint [-4,4] rwx Octave Octave. 0 ladspa-Pulse-VCO::Tune gfloat [0,1] rwx Tune Tune. 0 ladspa-Saw-VCO::Exp-FM-gain gfloat [0,4] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Saw-VCO::LP-filter gfloat [0,1] rwx LP-filter LP-filter. 1 ladspa-Saw-VCO::Lin-FM-gain gfloat [0,4] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Saw-VCO::Octave gint [-4,4] rwx Octave Octave. 0 ladspa-Saw-VCO::Tune gfloat [0,1] rwx Tune Tune. 0 ladspa-Rec-VCO::Exp-FM-gain gfloat [0,4] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Rec-VCO::Form-mod gfloat [0,4] rwx Form-mod Form-mod. 0 ladspa-Rec-VCO::LP-filter gfloat [0,1] rwx LP-filter LP-filter. 1 ladspa-Rec-VCO::Lin-FM-gain gfloat [0,4] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Rec-VCO::Octave gint [-4,4] rwx Octave Octave. 0 ladspa-Rec-VCO::Tune gfloat [0,1] rwx Tune Tune. 0 ladspa-Rec-VCO::Waveform gfloat [-1,1] rwx Waveform Waveform. 0 ladspa-singlePara::Bandwidth gfloat [0,4] rwx Bandwidth Bandwidth. 1 ladspa-singlePara::Frequency gfloat [0,17640] rwx Frequency Frequency. 440 ladspa-singlePara::Gain gfloat [-70,30] rwx Gain Gain. 0 ladspa-gate::Attack gfloat [0,01,1000] rwx Attack Attack. 250,008 ladspa-gate::Decay gfloat [2,4000] rwx Decay Decay. 2001 ladspa-gate::HF-key-filter gfloat [220,5,21609] rwx HF-key-filter HF-key-filter. 21609 ladspa-gate::Hold gfloat [2,2000] rwx Hold Hold. 1500,5 ladspa-gate::LF-key-filter gfloat [30,87,4410] rwx LF-key-filter LF-key-filter. 30,87 ladspa-gate::Output-select gint [-1,1] rwx Output-select Output-select. 0 ladspa-gate::Range gfloat [-90,0] rwx Range Range. -90 ladspa-gate::Threshold gfloat [-70,20] rwx Threshold Threshold. -70 ladspa-tap-dynamics-st::Attack--ms- gfloat [4,500] rwx Attack--ms- Attack--ms-. 128 ladspa-tap-dynamics-st::Envelope-Volume gfloat [-60,20] r Envelope-Volume Envelope-Volume. 0 ladspa-tap-dynamics-st::Envelope-Volume-1 gfloat [-60,20] r Envelope-Volume-1 Envelope-Volume-1. 0 ladspa-tap-dynamics-st::Function gint [0,14] rwx Function Function. 0 ladspa-tap-dynamics-st::Gain-Adjustment gfloat [-60,20] r Gain-Adjustment Gain-Adjustment. 0 ladspa-tap-dynamics-st::Gain-Adjustment-1 gfloat [-60,20] r Gain-Adjustment-1 Gain-Adjustment-1. 0 ladspa-tap-dynamics-st::Makeup-Gain--dB- gfloat [-20,20] rwx Makeup-Gain--dB- Makeup-Gain--dB-. 0 ladspa-tap-dynamics-st::Offset-Gain--dB- gfloat [-20,20] rwx Offset-Gain--dB- Offset-Gain--dB-. 0 ladspa-tap-dynamics-st::Release--ms- gfloat [4,1000] rwx Release--ms- Release--ms-. 502 ladspa-tap-dynamics-st::Stereo-Mode gint [0,2] rwx Stereo-Mode Stereo-Mode. 0 ladspa-Parametric1::Bandwidth-1 gfloat [0,125,8] rwx Bandwidth-1 Bandwidth-1. 1 ladspa-Parametric1::Bandwidth-2 gfloat [0,125,8] rwx Bandwidth-2 Bandwidth-2. 1 ladspa-Parametric1::Bandwidth-3 gfloat [0,125,8] rwx Bandwidth-3 Bandwidth-3. 1 ladspa-Parametric1::Bandwidth-4 gfloat [0,125,8] rwx Bandwidth-4 Bandwidth-4. 1 ladspa-Parametric1::Filter gboolean rwx Filter Filter. FALSE ladspa-Parametric1::Frequency-1 gfloat [20,2000] rwx Frequency-1 Frequency-1. 200 ladspa-Parametric1::Frequency-2 gfloat [40,4000] rwx Frequency-2 Frequency-2. 400 ladspa-Parametric1::Frequency-3 gfloat [100,10000] rwx Frequency-3 Frequency-3. 1000 ladspa-Parametric1::Frequency-4 gfloat [200,20000] rwx Frequency-4 Frequency-4. 2000 ladspa-Parametric1::Gain gfloat [-20,20] rwx Gain Gain. 0 ladspa-Parametric1::Gain-1 gfloat [-20,20] rwx Gain-1 Gain-1. 0 ladspa-Parametric1::Gain-2 gfloat [-20,20] rwx Gain-2 Gain-2. 0 ladspa-Parametric1::Gain-3 gfloat [-20,20] rwx Gain-3 Gain-3. 0 ladspa-Parametric1::Gain-4 gfloat [-20,20] rwx Gain-4 Gain-4. 0 ladspa-Parametric1::Section-1 gboolean rwx Section-1 Section-1. FALSE ladspa-Parametric1::Section-2 gboolean rwx Section-2 Section-2. FALSE ladspa-Parametric1::Section-3 gboolean rwx Section-3 Section-3. FALSE ladspa-Parametric1::Section-4 gboolean rwx Section-4 Section-4. FALSE ladspa-sinCos::Base-frequency gfloat [0,0441,22050] rwx Base-frequency Base-frequency. 440 ladspa-sinCos::Pitch-offset gfloat [0,8] rwx Pitch-offset Pitch-offset. 0 ladspa-matrixSpatialiser::Width gint [-512,512] rwx Width Width. 0 ladspa-tap-limiter::Limit-Level--dB- gfloat [-30,20] rwx Limit-Level--dB- Limit-Level--dB-. 0 ladspa-tap-limiter::Output-Volume--dB- gfloat [-30,20] rwx Output-Volume--dB- Output-Volume--dB-. 0 ladspa-tap-limiter::latency gfloat [0,2500,1] r latency latency. 2500,1 ladspa-bodeShifterCV::Base-shift gfloat [0,5000] rwx Base-shift Base-shift. 0 ladspa-bodeShifterCV::CV-Attenuation gfloat [0,1] rwx CV-Attenuation CV-Attenuation. 1 ladspa-bodeShifterCV::Mix gfloat [-1,1] rwx Mix Mix. 0 ladspa-bodeShifterCV::latency gfloat r latency latency. -3,40282e+38 ladspa-Phaser1::Exp-FM-gain gfloat [0,10] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Phaser1::Feedback-gain gfloat [-1,1] rwx Feedback-gain Feedback-gain. 0 ladspa-Phaser1::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Phaser1::Input-gain gfloat [-40,10] rwx Input-gain Input-gain. 0 ladspa-Phaser1::Lin-FM-gain gfloat [0,10] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Phaser1::Output-mix gfloat [-1,1] rwx Output-mix Output-mix. 0 ladspa-Phaser1::Sections gint [1,30] rwx Sections Sections. 1 ladspa-Phaser1+LFO::Feedback-gain gfloat [-1,1] rwx Feedback-gain Feedback-gain. 0 ladspa-Phaser1+LFO::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Phaser1+LFO::Input-gain gfloat [-40,10] rwx Input-gain Input-gain. 0 ladspa-Phaser1+LFO::LFO-frequency gfloat [0,01,30] rwx LFO-frequency LFO-frequency. 0,01 ladspa-Phaser1+LFO::LFO-waveform gfloat [-1,1] rwx LFO-waveform LFO-waveform. 0 ladspa-Phaser1+LFO::Modulation-gain gfloat [0,10] rwx Modulation-gain Modulation-gain. 0 ladspa-Phaser1+LFO::Output-mix gfloat [-1,1] rwx Output-mix Output-mix. 0 ladspa-Phaser1+LFO::Sections gint [1,30] rwx Sections Sections. 1 ladspa-decimator::Bit-depth gfloat [1,24] rwx Bit-depth Bit-depth. 24 ladspa-decimator::Sample-rate gfloat [44,1,44100] rwx Sample-rate Sample-rate. 44100 ladspa-shaper::Waveshape gfloat [-10,10] rwx Waveshape Waveshape. 0 ladspa-triangle-fasc-oa::Slope gfloat [0,1] rwx Slope Slope. 0,5 ladspa-triangle-fcsa-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-triangle-fcsc-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-triangle-fcsc-oa::Slope gfloat [0,1] rwx Slope Slope. 0,5 ladspa-djFlanger::Feedback gfloat [-100,100] rwx Feedback Feedback. 0 ladspa-djFlanger::LFO-depth gfloat [1,5] rwx LFO-depth LFO-depth. 4 ladspa-djFlanger::LFO-period gfloat [0,1,32] rwx LFO-period LFO-period. 1 ladspa-djFlanger::LFO-sync gfloat rwx LFO-sync LFO-sync. -3,40282e+38 ladspa-imp::Gain gfloat [-90,24] rwx Gain Gain. 0 ladspa-imp::High-latency-mode gint [0,1] rwx High-latency-mode High-latency-mode. 0 ladspa-imp::Impulse-ID gint [1,21] rwx Impulse-ID Impulse-ID. 1 ladspa-imp::latency gfloat r latency latency. -3,40282e+38 ladspa-tap-dynamics-m::Attack--ms- gfloat [4,500] rwx Attack--ms- Attack--ms-. 128 ladspa-tap-dynamics-m::Envelope-Volume--dB- gfloat [-60,20] r Envelope-Volume--dB- Envelope-Volume--dB-. 0 ladspa-tap-dynamics-m::Function gint [0,14] rwx Function Function. 0 ladspa-tap-dynamics-m::Gain-Adjustment--dB- gfloat [-60,20] r Gain-Adjustment--dB- Gain-Adjustment--dB-. 0 ladspa-tap-dynamics-m::Makeup-Gain--dB- gfloat [-20,20] rwx Makeup-Gain--dB- Makeup-Gain--dB-. 0 ladspa-tap-dynamics-m::Offset-Gain--dB- gfloat [-20,20] rwx Offset-Gain--dB- Offset-Gain--dB-. 0 ladspa-tap-dynamics-m::Release--ms- gfloat [4,1000] rwx Release--ms- Release--ms-. 502 ladspa-xfade::Crossfade gfloat [-1,1] rwx Crossfade Crossfade. 0 ladspa-xfade4::Crossfade gfloat [-1,1] rwx Crossfade Crossfade. 0 ladspa-tap-tremolo::Depth---- gfloat [0,100] rwx Depth---- Depth----. 0 ladspa-tap-tremolo::Frequency--Hz- gfloat [0,20] rwx Frequency--Hz- Frequency--Hz-. 0 ladspa-tap-tremolo::Gain--dB- gfloat [-70,20] rwx Gain--dB- Gain--dB-. 0 ladspa-pitchScale::Pitch-co-efficient gfloat [0,5,2] rwx Pitch-co-efficient Pitch-co-efficient. 1 ladspa-pitchScale::latency gfloat r latency latency. -3,40282e+38 ladspa-pitchScaleHQ::Pitch-co-efficient gfloat [0,5,2] rwx Pitch-co-efficient Pitch-co-efficient. 1 ladspa-pitchScaleHQ::latency gfloat r latency latency. -3,40282e+38 ladspa-valveRect::Distortion gfloat [0,1] rwx Distortion Distortion. 0 ladspa-valveRect::Sag-level gfloat [0,1] rwx Sag-level Sag-level. 0 ladspa-tap-pinknoise::Fractal-Dimension gfloat [0,1] rwx Fractal-Dimension Fractal-Dimension. 0,5 ladspa-tap-pinknoise::Noise-Level--dB- gfloat [-90,20] rwx Noise-Level--dB- Noise-Level--dB-. -90 ladspa-tap-pinknoise::Signal-Level--dB- gfloat [-90,20] rwx Signal-Level--dB- Signal-Level--dB-. 0 ladspa-interpolator::Control-Input gfloat rwx Control-Input Control-Input. -3,40282e+38 ladspa-hermesFilter::Band-1-gain gfloat [-70,20] rwx Band-1-gain Band-1-gain. 0 ladspa-hermesFilter::Band-2-gain gfloat [-70,20] rwx Band-2-gain Band-2-gain. 0 ladspa-hermesFilter::Band-3-gain gfloat [-70,20] rwx Band-3-gain Band-3-gain. 0 ladspa-hermesFilter::Delay1-feedback gfloat [0,1] rwx Delay1-feedback Delay1-feedback. 0 ladspa-hermesFilter::Delay1-length gfloat [0,2] rwx Delay1-length Delay1-length. 0 ladspa-hermesFilter::Delay1-wetness gfloat [0,1] rwx Delay1-wetness Delay1-wetness. 0 ladspa-hermesFilter::Delay2-feedback gfloat [0,1] rwx Delay2-feedback Delay2-feedback. 0 ladspa-hermesFilter::Delay2-length gfloat [0,2] rwx Delay2-length Delay2-length. 0 ladspa-hermesFilter::Delay2-wetness gfloat [0,1] rwx Delay2-wetness Delay2-wetness. 0 ladspa-hermesFilter::Delay3-feedback gfloat [0,1] rwx Delay3-feedback Delay3-feedback. 0 ladspa-hermesFilter::Delay3-length gfloat [0,2] rwx Delay3-length Delay3-length. 0 ladspa-hermesFilter::Delay3-wetness gfloat [0,1] rwx Delay3-wetness Delay3-wetness. 0 ladspa-hermesFilter::Dist1-drive gfloat [0,3] rwx Dist1-drive Dist1-drive. 0 ladspa-hermesFilter::Dist2-drive gfloat [0,3] rwx Dist2-drive Dist2-drive. 0 ladspa-hermesFilter::Dist3-drive gfloat [0,3] rwx Dist3-drive Dist3-drive. 0 ladspa-hermesFilter::Filt1-LFO1-level gfloat [-500,500] rwx Filt1-LFO1-level Filt1-LFO1-level. 0 ladspa-hermesFilter::Filt1-LFO2-level gfloat [-500,500] rwx Filt1-LFO2-level Filt1-LFO2-level. 0 ladspa-hermesFilter::Filt1-freq gfloat [0,8000] rwx Filt1-freq Filt1-freq. 440 ladspa-hermesFilter::Filt1-q gfloat [0,1] rwx Filt1-q Filt1-q. 0 ladspa-hermesFilter::Filt1-resonance gfloat [0,1] rwx Filt1-resonance Filt1-resonance. 0 ladspa-hermesFilter::Filt1-type gint [0,5] rwx Filt1-type Filt1-type. 0 ladspa-hermesFilter::Filt2-LFO1-level gfloat [-500,500] rwx Filt2-LFO1-level Filt2-LFO1-level. 0 ladspa-hermesFilter::Filt2-LFO2-level gfloat [-500,500] rwx Filt2-LFO2-level Filt2-LFO2-level. 0 ladspa-hermesFilter::Filt2-freq gfloat [0,8000] rwx Filt2-freq Filt2-freq. 440 ladspa-hermesFilter::Filt2-q gfloat [0,1] rwx Filt2-q Filt2-q. 0 ladspa-hermesFilter::Filt2-resonance gfloat [0,1] rwx Filt2-resonance Filt2-resonance. 0 ladspa-hermesFilter::Filt2-type gint [0,5] rwx Filt2-type Filt2-type. 0 ladspa-hermesFilter::Filt3-LFO1-level gfloat [-500,500] rwx Filt3-LFO1-level Filt3-LFO1-level. 0 ladspa-hermesFilter::Filt3-LFO2-level gfloat [-500,500] rwx Filt3-LFO2-level Filt3-LFO2-level. 0 ladspa-hermesFilter::Filt3-freq gfloat [0,8000] rwx Filt3-freq Filt3-freq. 440 ladspa-hermesFilter::Filt3-q gfloat [0,1] rwx Filt3-q Filt3-q. 0 ladspa-hermesFilter::Filt3-resonance gfloat [0,1] rwx Filt3-resonance Filt3-resonance. 0 ladspa-hermesFilter::Filt3-type gint [0,5] rwx Filt3-type Filt3-type. 0 ladspa-hermesFilter::Input-gain gfloat [-70,20] rwx Input-gain Input-gain. 0 ladspa-hermesFilter::LFO1-freq gfloat [0,1000] rwx LFO1-freq LFO1-freq. 250 ladspa-hermesFilter::LFO1-wave gint [0,4] rwx LFO1-wave LFO1-wave. 0 ladspa-hermesFilter::LFO2-freq gfloat [0,1000] rwx LFO2-freq LFO2-freq. 250 ladspa-hermesFilter::LFO2-wave gint [0,4] rwx LFO2-wave LFO2-wave. 0 ladspa-hermesFilter::Osc1-freq gfloat [0,4000] rwx Osc1-freq Osc1-freq. 440 ladspa-hermesFilter::Osc1-gain gfloat [-70,20] rwx Osc1-gain Osc1-gain. -70 ladspa-hermesFilter::Osc1-wave gint [0,4] rwx Osc1-wave Osc1-wave. 0 ladspa-hermesFilter::Osc2-freq gfloat [0,4000] rwx Osc2-freq Osc2-freq. 440 ladspa-hermesFilter::Osc2-gain gfloat [-70,20] rwx Osc2-gain Osc2-gain. -70 ladspa-hermesFilter::Osc2-wave gint [0,4] rwx Osc2-wave Osc2-wave. 0 ladspa-hermesFilter::RM1-gain gfloat [-70,20] rwx RM1-gain RM1-gain. -70 ladspa-hermesFilter::RM2-gain gfloat [-70,20] rwx RM2-gain RM2-gain. -70 ladspa-hermesFilter::RM3-gain gfloat [-70,20] rwx RM3-gain RM3-gain. -70 ladspa-hermesFilter::Ringmod-1-depth gfloat [0,2] rwx Ringmod-1-depth Ringmod-1-depth. 0 ladspa-hermesFilter::Ringmod-2-depth gfloat [0,2] rwx Ringmod-2-depth Ringmod-2-depth. 0 ladspa-hermesFilter::Ringmod-3-depth gfloat [0,2] rwx Ringmod-3-depth Ringmod-3-depth. 0 ladspa-hermesFilter::Xover-lower-freq gfloat [50,6000] rwx Xover-lower-freq Xover-lower-freq. 1537,5 ladspa-hermesFilter::Xover-upper-freq gfloat [1000,10000] rwx Xover-upper-freq Xover-upper-freq. 7750 ladspa-impulse-fc::Frequency gfloat >= 0 rwx Frequency Frequency. 0 ladspa-bodeShifter::Frequency-shift gfloat [0,5000] rwx Frequency-shift Frequency-shift. 0 ladspa-bodeShifter::latency gfloat r latency latency. -3,40282e+38 ladspa-harmonicGen::Fundamental-magnitude gfloat [-1,1] rwx Fundamental-magnitude Fundamental-magnitude. 1 ladspa-harmonicGen::param-10th-harmonic-magnitude gfloat [-1,1] rwx param-10th-harmonic-magnitude param-10th-harmonic-magnitude. 0 ladspa-harmonicGen::param-2nd-harmonic-magnitude gfloat [-1,1] rwx param-2nd-harmonic-magnitude param-2nd-harmonic-magnitude. 0 ladspa-harmonicGen::param-3rd-harmonic-magnitude gfloat [-1,1] rwx param-3rd-harmonic-magnitude param-3rd-harmonic-magnitude. 0 ladspa-harmonicGen::param-4th-harmonic-magnitude gfloat [-1,1] rwx param-4th-harmonic-magnitude param-4th-harmonic-magnitude. 0 ladspa-harmonicGen::param-5th-harmonic-magnitude gfloat [-1,1] rwx param-5th-harmonic-magnitude param-5th-harmonic-magnitude. 0 ladspa-harmonicGen::param-6th-harmonic-magnitude gfloat [-1,1] rwx param-6th-harmonic-magnitude param-6th-harmonic-magnitude. 0 ladspa-harmonicGen::param-7th-harmonic-magnitude gfloat [-1,1] rwx param-7th-harmonic-magnitude param-7th-harmonic-magnitude. 0 ladspa-harmonicGen::param-8th-harmonic-magnitude gfloat [-1,1] rwx param-8th-harmonic-magnitude param-8th-harmonic-magnitude. 0 ladspa-harmonicGen::param-9th-harmonic-magnitude gfloat [-1,1] rwx param-9th-harmonic-magnitude param-9th-harmonic-magnitude. 0 ladspa-pulse-fapc-oa::Pulse-Width gfloat [0,1] rwx Pulse-Width Pulse-Width. 0,5 ladspa-pulse-fcpa-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-pulse-fcpc-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-pulse-fcpc-oa::Pulse-Width gfloat [0,1] rwx Pulse-Width Pulse-Width. 0,5 ladspa-lowpass-iir::Cutoff-Frequency gfloat [4,41,19845] rwx Cutoff-Frequency Cutoff-Frequency. 2422,97 ladspa-lowpass-iir::Stages-2-poles-per-stage- gint [1,10] rwx Stages-2-poles-per-stage- Stages-2-poles-per-stage-. 1 ladspa-tap-rotspeak::Horn-Frequency--Hz- gfloat [0,30] rwx Horn-Frequency--Hz- Horn-Frequency--Hz-. 0 ladspa-tap-rotspeak::Mic-Distance---- gfloat [0,100] rwx Mic-Distance---- Mic-Distance----. 25 ladspa-tap-rotspeak::Rotor-Frequency--Hz- gfloat [0,30] rwx Rotor-Frequency--Hz- Rotor-Frequency--Hz-. 0 ladspa-tap-rotspeak::Rotor-Horn-Mix gfloat [0,1] rwx Rotor-Horn-Mix Rotor-Horn-Mix. 0,5 ladspa-tap-rotspeak::latency gfloat [0,9200] r latency latency. 9200 ladspa-tap-vibrato::Depth---- gfloat [0,20] rwx Depth---- Depth----. 0 ladspa-tap-vibrato::Dry-Level--dB- gfloat [-90,20] rwx Dry-Level--dB- Dry-Level--dB-. -90 ladspa-tap-vibrato::Frequency--Hz- gfloat [0,30] rwx Frequency--Hz- Frequency--Hz-. 0 ladspa-tap-vibrato::Wet-Level--dB- gfloat [-90,20] rwx Wet-Level--dB- Wet-Level--dB-. 0 ladspa-tap-vibrato::latency gfloat [0,6300] r latency latency. 6300 ladspa-stepMuxer::Crossfade-time gfloat [0,100] rwx Crossfade-time Crossfade-time. 50 ladspa-flanger::Delay-base gfloat [0,1,25] rwx Delay-base Delay-base. 6,325 ladspa-flanger::Feedback gfloat [-1,1] rwx Feedback Feedback. 0 ladspa-flanger::LFO-frequency gfloat [0,05,100] rwx LFO-frequency LFO-frequency. 0,33437 ladspa-flanger::Max-slowdown gfloat [0,10] rwx Max-slowdown Max-slowdown. 2,5 ladspa-amp::Amps-gain gfloat [-70,70] rwx Amps-gain Amps-gain. 0 ladspa-dahdsr-g+t-control::Abklingzeit gfloat >= 0 rwx Abklingzeit Abklingzeit. 0 ladspa-dahdsr-g+t-control::Ausklingzeit gfloat >= 0 rwx Ausklingzeit Ausklingzeit. 0 ladspa-dahdsr-g+t-control::Einschwingzeit gfloat >= 0 rwx Einschwingzeit Einschwingzeit. 0 ladspa-dahdsr-g+t-control::Haltewert gfloat [0,1] rwx Haltewert Haltewert. 1 ladspa-dahdsr-g+t-control::Haltezeit gfloat >= 0 rwx Haltezeit Haltezeit. 0 ladspa-dahdsr-g+t-control::Verz--gerungszeit gfloat >= 0 rwx Verz--gerungszeit Verz--gerungszeit. 0 ladspa-dahdsr-cg+t-control::Abklingzeit gfloat >= 0 rwx Abklingzeit Abklingzeit. 0 ladspa-dahdsr-cg+t-control::Ausklingzeit gfloat >= 0 rwx Ausklingzeit Ausklingzeit. 0 ladspa-dahdsr-cg+t-control::Ausl--ser gboolean rwx Ausl--ser Ausl--ser. FALSE ladspa-dahdsr-cg+t-control::Einschwingzeit gfloat >= 0 rwx Einschwingzeit Einschwingzeit. 0 ladspa-dahdsr-cg+t-control::Gatter gboolean rwx Gatter Gatter. FALSE ladspa-dahdsr-cg+t-control::Haltewert gfloat [0,1] rwx Haltewert Haltewert. 1 ladspa-dahdsr-cg+t-control::Haltezeit gfloat >= 0 rwx Haltezeit Haltezeit. 0 ladspa-dahdsr-cg+t-control::Verz--gerungszeit gfloat >= 0 rwx Verz--gerungszeit Verz--gerungszeit. 0 ladspa-Sync-Saw-VCO::Exp-FM-gain gfloat [0,4] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Sync-Saw-VCO::LP-filter gfloat [0,1] rwx LP-filter LP-filter. 0,5 ladspa-Sync-Saw-VCO::Lin-FM-gain gfloat [0,4] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Sync-Saw-VCO::Octave gint [-4,4] rwx Octave Octave. 0 ladspa-Sync-Saw-VCO::Tune gfloat [0,1] rwx Tune Tune. 0 ladspa-Sync-Rect-VCO::Exp-FM-gain gfloat [0,4] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Sync-Rect-VCO::LP-filter gfloat [0,1] rwx LP-filter LP-filter. 0,5 ladspa-Sync-Rect-VCO::Lin-FM-gain gfloat [0,4] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Sync-Rect-VCO::Octave gint [-4,4] rwx Octave Octave. 0 ladspa-Sync-Rect-VCO::Tune gfloat [0,1] rwx Tune Tune. 0 ladspa-Sync-Rect-VCO::WMod-gain gfloat [0,4] rwx WMod-gain WMod-gain. 0 ladspa-Sync-Rect-VCO::Waveform gfloat [-1,1] rwx Waveform Waveform. 0 ladspa-Sync-Tri-VCO::Exp-FM-gain gfloat [0,4] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Sync-Tri-VCO::LP-filter gfloat [0,1] rwx LP-filter LP-filter. 0,5 ladspa-Sync-Tri-VCO::Lin-FM-gain gfloat [0,4] rwx Lin-FM-gain Lin-FM-gain. 0 ladspa-Sync-Tri-VCO::Octave gint [-4,4] rwx Octave Octave. 0 ladspa-Sync-Tri-VCO::Tune gfloat [0,1] rwx Tune Tune. 0 ladspa-Sync-Tri-VCO::WMod-gain gfloat [0,4] rwx WMod-gain WMod-gain. 0 ladspa-Sync-Tri-VCO::Waveform gfloat [-1,1] rwx Waveform Waveform. 0 ladspa-bwxover-iir::Cutoff-Frequency gfloat [4,41,19845] rwx Cutoff-Frequency Cutoff-Frequency. 36,1195 ladspa-bwxover-iir::Resonance gfloat [0,1,1,41] rwx Resonance Resonance. 0,755 ladspa-buttlow-iir::Cutoff-Frequency gfloat [4,41,19845] rwx Cutoff-Frequency Cutoff-Frequency. 36,1195 ladspa-buttlow-iir::Resonance gfloat [0,1,1,41] rwx Resonance Resonance. 0,755 ladspa-butthigh-iir::Cutoff-Frequency gfloat [4,41,19845] rwx Cutoff-Frequency Cutoff-Frequency. 36,1195 ladspa-butthigh-iir::Resonance gfloat [0,1,1,41] rwx Resonance Resonance. 0,755 ladspa-Mvchpf-1::Exp-FM-gain gfloat [0,10] rwx Exp-FM-gain Exp-FM-gain. 0 ladspa-Mvchpf-1::Frequency gfloat [-6,6] rwx Frequency Frequency. 0 ladspa-Mvchpf-1::Input-gain gfloat [-60,10] rwx Input-gain Input-gain. 0 ladspa-Mvchpf-1::Output-gain gfloat [-15,15] rwx Output-gain Output-gain. 0 ladspa-tracker-gaacdcia-oa::Attack-Rate gfloat [0,91875,22050] rwx Attack-Rate Attack-Rate. 100 ladspa-tracker-gaacdcia-oa::Attack-Rate-1 gfloat [0,91875,22050] rwx Attack-Rate-1 Attack-Rate-1. 100 ladspa-tracker-gaacdcia-oa::Decay-Rate gfloat [0,91875,22050] rwx Decay-Rate Decay-Rate. 100 ladspa-tracker-gaacdcia-oa::Decay-Rate-1 gfloat [0,91875,22050] rwx Decay-Rate-1 Decay-Rate-1. 100 ladspa-tap-doubler::Dry-Left-Position gfloat [0,1] rwx Dry-Left-Position Dry-Left-Position. 0 ladspa-tap-doubler::Dry-Level--dB- gfloat [-90,20] rwx Dry-Level--dB- Dry-Level--dB-. 0 ladspa-tap-doubler::Dry-Right-Position gfloat [0,1] rwx Dry-Right-Position Dry-Right-Position. 1 ladspa-tap-doubler::Pitch-Tracking gfloat [0,1] rwx Pitch-Tracking Pitch-Tracking. 0,5 ladspa-tap-doubler::Time-Tracking gfloat [0,1] rwx Time-Tracking Time-Tracking. 0,5 ladspa-tap-doubler::Wet-Left-Position gfloat [0,1] rwx Wet-Left-Position Wet-Left-Position. 0 ladspa-tap-doubler::Wet-Level--dB- gfloat [-90,20] rwx Wet-Level--dB- Wet-Level--dB-. 0 ladspa-tap-doubler::Wet-Right-Position gfloat [0,1] rwx Wet-Right-Position Wet-Right-Position. 1 ladspa-amp-gcia-oa::Verst--rkung gfloat [-96,96] rwx Verst--rkung Verst--rkung. -96 ladspa-sequencer16::Closed-Gate-Value gfloat rwx Closed-Gate-Value Closed-Gate-Value. -3,40282e+38 ladspa-sequencer16::Loop-Steps gint [1,16] rwx Loop-Steps Loop-Steps. 16 ladspa-sequencer16::Reset-to-Value-on-Gate-Close- gint [0,1] rwx Reset-to-Value-on-Gate-Close- Reset-to-Value-on-Gate-Close-. 0 ladspa-sequencer16::Value-Step-0 gfloat rwx Value-Step-0 Value-Step-0. -3,40282e+38 ladspa-sequencer16::Value-Step-1 gfloat rwx Value-Step-1 Value-Step-1. -3,40282e+38 ladspa-sequencer16::Value-Step-10 gfloat rwx Value-Step-10 Value-Step-10. -3,40282e+38 ladspa-sequencer16::Value-Step-11 gfloat rwx Value-Step-11 Value-Step-11. -3,40282e+38 ladspa-sequencer16::Value-Step-12 gfloat rwx Value-Step-12 Value-Step-12. -3,40282e+38 ladspa-sequencer16::Value-Step-13 gfloat rwx Value-Step-13 Value-Step-13. -3,40282e+38 ladspa-sequencer16::Value-Step-14 gfloat rwx Value-Step-14 Value-Step-14. -3,40282e+38 ladspa-sequencer16::Value-Step-15 gfloat rwx Value-Step-15 Value-Step-15. -3,40282e+38 ladspa-sequencer16::Value-Step-2 gfloat rwx Value-Step-2 Value-Step-2. -3,40282e+38 ladspa-sequencer16::Value-Step-3 gfloat rwx Value-Step-3 Value-Step-3. -3,40282e+38 ladspa-sequencer16::Value-Step-4 gfloat rwx Value-Step-4 Value-Step-4. -3,40282e+38 ladspa-sequencer16::Value-Step-5 gfloat rwx Value-Step-5 Value-Step-5. -3,40282e+38 ladspa-sequencer16::Value-Step-6 gfloat rwx Value-Step-6 Value-Step-6. -3,40282e+38 ladspa-sequencer16::Value-Step-7 gfloat rwx Value-Step-7 Value-Step-7. -3,40282e+38 ladspa-sequencer16::Value-Step-8 gfloat rwx Value-Step-8 Value-Step-8. -3,40282e+38 ladspa-sequencer16::Value-Step-9 gfloat rwx Value-Step-9 Value-Step-9. -3,40282e+38 ladspa-sc2::Attack-time gfloat [2,400] rwx Attack-time Attack-time. 101,5 ladspa-sc2::Knee-radius gfloat [1,10] rwx Knee-radius Knee-radius. 3,25 ladspa-sc2::Makeup-gain gfloat [0,24] rwx Makeup-gain Makeup-gain. 0 ladspa-sc2::Ratio gfloat [1,10] rwx Ratio Ratio. 1 ladspa-sc2::Release-time gfloat [2,800] rwx Release-time Release-time. 401 ladspa-sc2::Threshold-level gfloat [-30,0] rwx Threshold-level Threshold-level. 0 ladspa-dysonCompress::Compression-ratio gfloat [0,1] rwx Compression-ratio Compression-ratio. 0,5 ladspa-dysonCompress::Fast-compression-ratio gfloat [0,1] rwx Fast-compression-ratio Fast-compression-ratio. 0,5 ladspa-dysonCompress::Peak-limit gfloat [-30,0] rwx Peak-limit Peak-limit. 0 ladspa-dysonCompress::Release-time gfloat [0,1] rwx Release-time Release-time. 0,25 ladspa-decay::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-alias::Aliasing-level gfloat [0,1] rwx Aliasing-level Aliasing-level. 0 ladspa-SooperLooper::Cycle-Length-Out gfloat >= 0 r Cycle-Length-Out Cycle-Length-Out. 0 ladspa-SooperLooper::Dry-Level gfloat [0,1] rwx Dry-Level Dry-Level. 0 ladspa-SooperLooper::Feedback gfloat [0,1] rwx Feedback Feedback. 0 ladspa-SooperLooper::Free-Sample-Mem gfloat >= 0 r Free-Sample-Mem Free-Sample-Mem. 0 ladspa-SooperLooper::Loop-Length-Out gfloat >= 0 r Loop-Length-Out Loop-Length-Out. 0 ladspa-SooperLooper::Loop-Position-Out gfloat >= 0 r Loop-Position-Out Loop-Position-Out. 0 ladspa-SooperLooper::Multi-Control gint [0,127] rwx Multi-Control Multi-Control. 0 ladspa-SooperLooper::MultiCtrl-10s gint [0,12] rwx MultiCtrl-10s MultiCtrl-10s. 0 ladspa-SooperLooper::QuantizeMode gint <= G_MININT rwx QuantizeMode QuantizeMode. -2147483648 ladspa-SooperLooper::Rate gfloat [-4,4] rwx Rate Rate. -4 ladspa-SooperLooper::RedoTapMode gint <= G_MININT rwx RedoTapMode RedoTapMode. -2147483648 ladspa-SooperLooper::RoundMode gint <= G_MININT rwx RoundMode RoundMode. -2147483648 ladspa-SooperLooper::Scratch-Destination gfloat [0,1] rwx Scratch-Destination Scratch-Destination. 0 ladspa-SooperLooper::State-Output gfloat r State-Output State-Output. -3,40282e+38 ladspa-SooperLooper::Tap-Delay-Trigger gfloat [0,1] rwx Tap-Delay-Trigger Tap-Delay-Trigger. 0 ladspa-SooperLooper::Total-Sample-Mem gfloat >= 0 r Total-Sample-Mem Total-Sample-Mem. 0 ladspa-SooperLooper::Trigger-Threshold gfloat [0,1] rwx Trigger-Threshold Trigger-Threshold. 0 ladspa-SooperLooper::Wet-Level gfloat [0,1] rwx Wet-Level Wet-Level. 0 ladspa-vlevel-mono::Current-Multiplier gfloat [0,20] r Current-Multiplier Current-Multiplier. 0 ladspa-vlevel-mono::Look-ahead gfloat [0,5] rwx Look-ahead Look-ahead. 2,5 ladspa-vlevel-mono::Maximum-Multiplier gfloat [0,20] rwx Maximum-Multiplier Maximum-Multiplier. 10 ladspa-vlevel-mono::Strength gfloat [0,1] rwx Strength Strength. 0,75 ladspa-vlevel-mono::Undo gboolean rwx Undo Undo. FALSE ladspa-vlevel-mono::Use-Maximum-Multiplier gboolean rwx Use-Maximum-Multiplier Use-Maximum-Multiplier. FALSE ladspa-vlevel-stereo::Current-Multiplier gfloat [0,20] r Current-Multiplier Current-Multiplier. 0 ladspa-vlevel-stereo::Look-ahead gfloat [0,5] rwx Look-ahead Look-ahead. 2,5 ladspa-vlevel-stereo::Maximum-Multiplier gfloat [0,20] rwx Maximum-Multiplier Maximum-Multiplier. 10 ladspa-vlevel-stereo::Strength gfloat [0,1] rwx Strength Strength. 0,75 ladspa-vlevel-stereo::Undo gboolean rwx Undo Undo. FALSE ladspa-vlevel-stereo::Use-Maximum-Multiplier gboolean rwx Use-Maximum-Multiplier Use-Maximum-Multiplier. FALSE ladspa-artificialLatency::Delay gfloat [0,10000] rwx Delay Delay. 2500 ladspa-artificialLatency::latency gfloat r latency latency. -3,40282e+38 ladspa-triplePara::Band-1-bandwidth gfloat [0,4] rwx Band-1-bandwidth Band-1-bandwidth. 1 ladspa-triplePara::Band-1-frequency gfloat [4,41,21609] rwx Band-1-frequency Band-1-frequency. 36,8967 ladspa-triplePara::Band-1-gain gfloat [-70,30] rwx Band-1-gain Band-1-gain. 0 ladspa-triplePara::Band-2-bandwidth gfloat [0,4] rwx Band-2-bandwidth Band-2-bandwidth. 1 ladspa-triplePara::Band-2-frequency gfloat [4,41,21609] rwx Band-2-frequency Band-2-frequency. 308,7 ladspa-triplePara::Band-2-gain gfloat [-70,30] rwx Band-2-gain Band-2-gain. 0 ladspa-triplePara::Band-3-bandwidth gfloat [0,4] rwx Band-3-bandwidth Band-3-bandwidth. 1 ladspa-triplePara::Band-3-frequency gfloat [4,41,21609] rwx Band-3-frequency Band-3-frequency. 2582,77 ladspa-triplePara::Band-3-gain gfloat [-70,30] rwx Band-3-gain Band-3-gain. 0 ladspa-triplePara::High-shelving-frequency gfloat [4,41,21609] rwx High-shelving-frequency High-shelving-frequency. 21609 ladspa-triplePara::High-shelving-gain gfloat [-70,30] rwx High-shelving-gain High-shelving-gain. 0 ladspa-triplePara::High-shelving-slope gfloat [0,1] rwx High-shelving-slope High-shelving-slope. 0,5 ladspa-triplePara::Low-shelving-frequency gfloat [4,41,21609] rwx Low-shelving-frequency Low-shelving-frequency. 4,41 ladspa-triplePara::Low-shelving-gain gfloat [-70,30] rwx Low-shelving-gain Low-shelving-gain. 0 ladspa-triplePara::Low-shelving-slope gfloat [0,1] rwx Low-shelving-slope Low-shelving-slope. 0,5 ladspa-revdelay::Crossfade-samples gint [0,5000] rwx Crossfade-samples Crossfade-samples. 1250 ladspa-revdelay::Delay-Time gfloat [0,5] rwx Delay-Time Delay-Time. 0 ladspa-revdelay::Dry-Level gfloat [-70,0] rwx Dry-Level Dry-Level. 0 ladspa-revdelay::Feedback gfloat [0,1] rwx Feedback Feedback. 0 ladspa-revdelay::Wet-Level gfloat [-70,0] rwx Wet-Level Wet-Level. 0 ladspa-tap-equalizer::Band-1-Freq--Hz- gfloat [40,280] rwx Band-1-Freq--Hz- Band-1-Freq--Hz-. 100 ladspa-tap-equalizer::Band-1-Gain--dB- gfloat [-50,20] rwx Band-1-Gain--dB- Band-1-Gain--dB-. 0 ladspa-tap-equalizer::Band-2-Freq--Hz- gfloat [100,500] rwx Band-2-Freq--Hz- Band-2-Freq--Hz-. 200 ladspa-tap-equalizer::Band-2-Gain--dB- gfloat [-50,20] rwx Band-2-Gain--dB- Band-2-Gain--dB-. 0 ladspa-tap-equalizer::Band-3-Freq--Hz- gfloat [200,1000] rwx Band-3-Freq--Hz- Band-3-Freq--Hz-. 400 ladspa-tap-equalizer::Band-3-Gain--dB- gfloat [-50,20] rwx Band-3-Gain--dB- Band-3-Gain--dB-. 0 ladspa-tap-equalizer::Band-4-Freq--Hz- gfloat [400,2800] rwx Band-4-Freq--Hz- Band-4-Freq--Hz-. 1000 ladspa-tap-equalizer::Band-4-Gain--dB- gfloat [-50,20] rwx Band-4-Gain--dB- Band-4-Gain--dB-. 0 ladspa-tap-equalizer::Band-5-Freq--Hz- gfloat [1000,5000] rwx Band-5-Freq--Hz- Band-5-Freq--Hz-. 3000 ladspa-tap-equalizer::Band-5-Gain--dB- gfloat [-50,20] rwx Band-5-Gain--dB- Band-5-Gain--dB-. 0 ladspa-tap-equalizer::Band-6-Freq--Hz- gfloat [3000,9000] rwx Band-6-Freq--Hz- Band-6-Freq--Hz-. 6000 ladspa-tap-equalizer::Band-6-Gain--dB- gfloat [-50,20] rwx Band-6-Gain--dB- Band-6-Gain--dB-. 0 ladspa-tap-equalizer::Band-7-Freq--Hz- gfloat [6000,18000] rwx Band-7-Freq--Hz- Band-7-Freq--Hz-. 12000 ladspa-tap-equalizer::Band-7-Gain--dB- gfloat [-50,20] rwx Band-7-Gain--dB- Band-7-Gain--dB-. 0 ladspa-tap-equalizer::Band-8-Freq--Hz- gfloat [10000,20000] rwx Band-8-Freq--Hz- Band-8-Freq--Hz-. 15000 ladspa-tap-equalizer::Band-8-Gain--dB- gfloat [-50,20] rwx Band-8-Gain--dB- Band-8-Gain--dB-. 0 ladspa-retroFlange::Average-stall gfloat [0,10] rwx Average-stall Average-stall. 2,5 ladspa-retroFlange::Flange-frequency gfloat [0,5,8] rwx Flange-frequency Flange-frequency. 1 ladspa-Ambisonics-mono-panner::Azimuth gfloat [-180,180] rwx Azimuth Azimuth. 0 ladspa-Ambisonics-mono-panner::Elevation gfloat [-90,90] rwx Elevation Elevation. 0 ladspa-Ambisonics-stero-panner::Azimuth gfloat [-180,180] rwx Azimuth Azimuth. 0 ladspa-Ambisonics-stero-panner::Elevation gfloat [-90,90] rwx Elevation Elevation. 0 ladspa-Ambisonics-stero-panner::Width gfloat [-90,90] rwx Width Width. 90 ladspa-Ambisonics-rotator::Angle gfloat [-180,180] rwx Angle Angle. 0 ladspa-Ambisonics-square-decoder::Distance gfloat [1,30] rwx Distance Distance. 30 ladspa-Ambisonics-square-decoder::Front gboolean rwx Front Front. FALSE ladspa-Ambisonics-square-decoder::LF-ratio gfloat [1,2] rwx LF-ratio LF-ratio. 1 ladspa-Ambisonics-hexagon-decoder::Distance gfloat [1,30] rwx Distance Distance. 30 ladspa-Ambisonics-hexagon-decoder::Front gboolean rwx Front Front. FALSE ladspa-Ambisonics-hexagon-decoder::LF-ratio gfloat [1,2] rwx LF-ratio LF-ratio. 1 ladspa-G2reverb::Damping gfloat [0,1] rwx Damping Damping. 0 ladspa-G2reverb::Dry-sound gfloat [-80,0] rwx Dry-sound Dry-sound. -80 ladspa-G2reverb::Input-BW gfloat [0,1] rwx Input-BW Input-BW. 0 ladspa-G2reverb::Reflections gfloat [-80,0] rwx Reflections Reflections. -80 ladspa-G2reverb::Reverb-tail gfloat [-80,0] rwx Reverb-tail Reverb-tail. -80 ladspa-G2reverb::Reverb-time gfloat [1,20] rwx Reverb-time Reverb-time. 1 ladspa-G2reverb::Room-size gfloat [10,150] rwx Room-size Room-size. 10 ladspa-amPitchshift::Buffer-size gint [1,7] rwx Buffer-size Buffer-size. 4 ladspa-amPitchshift::Pitch-shift gfloat [0,25,4] rwx Pitch-shift Pitch-shift. 1 ladspa-amPitchshift::latency gfloat r latency latency. -3,40282e+38 ladspa-modDelay::Base-delay gfloat [0,1] rwx Base-delay Base-delay. 1 ladspa-tap-autopan::Depth---- gfloat [0,100] rwx Depth---- Depth----. 0 ladspa-tap-autopan::Frequency--Hz- gfloat [0,20] rwx Frequency--Hz- Frequency--Hz-. 0 ladspa-tap-autopan::Gain--dB- gfloat [-70,20] rwx Gain--dB- Gain--dB-. 0 ladspa-rateShifter::Rate gfloat [-4,4] rwx Rate Rate. 1 ladspa-Filter::Frequency gfloat [10,20000] rwx Frequency Frequency. 10 ladspa-Filter::Inertia gfloat [5,100] rwx Inertia Inertia. 5 ladspa-Filter::Mode gint [0,5] rwx Mode Mode. 0 ladspa-Filter::Resonance gfloat [0,707,20] rwx Resonance Resonance. 0,707 ladspa-Flanger::Amount gfloat [0,2] rwx Amount Amount. 0 ladspa-Flanger::Feedback gfloat [-0,99,0,99] rwx Feedback Feedback. -0,99 ladspa-Flanger::Minimum-delay gfloat [0,1,10] rwx Minimum-delay Minimum-delay. 0,1 ladspa-Flanger::Modulation-depth gfloat [0,1,10] rwx Modulation-depth Modulation-depth. 0,1 ladspa-Flanger::Modulation-rate gfloat [0,01,20] rwx Modulation-rate Modulation-rate. 0,01 ladspa-Flanger::Reset gboolean rwx Reset Reset. FALSE ladspa-Flanger::Stereo-phase gfloat [0,360] rwx Stereo-phase Stereo-phase. 0 ladspa-Reverb::Amount gfloat [0,2] rwx Amount Amount. 0 ladspa-Reverb::Decay-time gfloat [0,5,15] rwx Decay-time Decay-time. 0,5 ladspa-Reverb::Diffusion gfloat [0,1] rwx Diffusion Diffusion. 0 ladspa-Reverb::High-Frq-Damp gfloat [2000,20000] rwx High-Frq-Damp High-Frq-Damp. 2000 ladspa-Reverb::Room-size gint [0,3] rwx Room-size Room-size. 0 ladspa-VintageDelay::Amount gfloat [0,2] rwx Amount Amount. 0 ladspa-VintageDelay::Feedback gfloat [0,1] rwx Feedback Feedback. 0 ladspa-VintageDelay::Medium gint [0,2] rwx Medium Medium. 0 ladspa-VintageDelay::Mix-mode gint [0,1] rwx Mix-mode Mix-mode. 0 ladspa-VintageDelay::Subdivide gint [1,16] rwx Subdivide Subdivide. 1 ladspa-VintageDelay::Tempo gfloat [30,300] rwx Tempo Tempo. 30 ladspa-VintageDelay::Time-L gint [1,16] rwx Time-L Time-L. 1 ladspa-VintageDelay::Time-R gint [1,16] rwx Time-R Time-R. 1 ladspa-RotarySpeaker::Speed-Mode gint [0,4] rwx Speed-Mode Speed-Mode. 0 ladspa-RotarySpeaker::Tap-Offset gfloat [0,1] rwx Tap-Offset Tap-Offset. 0 ladspa-RotarySpeaker::Tap-Spacing gfloat [0,1] rwx Tap-Spacing Tap-Spacing. 0 ladspa-phaser::Amount gfloat [0,2] rwx Amount Amount. 0 ladspa-phaser::Center-Freq gfloat [20,20000] rwx Center-Freq Center-Freq. 20 ladspa-phaser::Feedback gfloat [-0,99,0,99] rwx Feedback Feedback. -0,99 ladspa-phaser::Modulation-depth gfloat [0,10800] rwx Modulation-depth Modulation-depth. 0 ladspa-phaser::Modulation-rate gfloat [0,01,20] rwx Modulation-rate Modulation-rate. 0,01 ladspa-phaser::Reset gboolean rwx Reset Reset. FALSE ladspa-phaser::Stereo-phase gfloat [0,360] rwx Stereo-phase Stereo-phase. 0 ladspa-phaser::param---Stages gint [1,12] rwx param---Stages param---Stages. 1 ladspa-Eq::param-1-kHz gfloat [-48,24] rwx param-1-kHz param-1-kHz. 0 ladspa-Eq::param-125-Hz gfloat [-48,24] rwx param-125-Hz param-125-Hz. 0 ladspa-Eq::param-16-kHz gfloat [-48,24] rwx param-16-kHz param-16-kHz. 0 ladspa-Eq::param-2-kHz gfloat [-48,24] rwx param-2-kHz param-2-kHz. 0 ladspa-Eq::param-250-Hz gfloat [-48,24] rwx param-250-Hz param-250-Hz. 0 ladspa-Eq::param-31-Hz gfloat [-48,24] rwx param-31-Hz param-31-Hz. -30 ladspa-Eq::param-4-kHz gfloat [-48,24] rwx param-4-kHz param-4-kHz. 0 ladspa-Eq::param-500-Hz gfloat [-48,24] rwx param-500-Hz param-500-Hz. 0 ladspa-Eq::param-63-Hz gfloat [-48,24] rwx param-63-Hz param-63-Hz. 0 ladspa-Eq::param-8-kHz gfloat [-48,24] rwx param-8-kHz param-8-kHz. 0 ladspa-Eq2x2::param-1-kHz gfloat [-48,24] rwx param-1-kHz param-1-kHz. 0 ladspa-Eq2x2::param-125-Hz gfloat [-48,24] rwx param-125-Hz param-125-Hz. 0 ladspa-Eq2x2::param-16-kHz gfloat [-48,24] rwx param-16-kHz param-16-kHz. 0 ladspa-Eq2x2::param-2-kHz gfloat [-48,24] rwx param-2-kHz param-2-kHz. 0 ladspa-Eq2x2::param-250-Hz gfloat [-48,24] rwx param-250-Hz param-250-Hz. 0 ladspa-Eq2x2::param-31-Hz gfloat [-48,24] rwx param-31-Hz param-31-Hz. 0 ladspa-Eq2x2::param-4-kHz gfloat [-48,24] rwx param-4-kHz param-4-kHz. 0 ladspa-Eq2x2::param-500-Hz gfloat [-48,24] rwx param-500-Hz param-500-Hz. 0 ladspa-Eq2x2::param-63-Hz gfloat [-48,24] rwx param-63-Hz param-63-Hz. 0 ladspa-Eq2x2::param-8-kHz gfloat [-48,24] rwx param-8-kHz param-8-kHz. 0 ladspa-Compress::attack gfloat [0,001,1] rwx attack attack. 0,001 ladspa-Compress::gain gfloat [0,24] rwx gain gain. 6 ladspa-Compress::knee-radius gfloat [1,10] rwx knee-radius knee-radius. 3,25 ladspa-Compress::ratio gfloat [1,10] rwx ratio ratio. 1 ladspa-Compress::release gfloat [0,001,1] rwx release release. 0,5005 ladspa-Compress::threshold gfloat [-30,400] rwx threshold threshold. 0 ladspa-Pan::mono gboolean rwx mono mono. FALSE ladspa-Pan::pan gfloat [-1,1] rwx pan pan. 0 ladspa-Pan::t gfloat [0,1,40] rwx t t. 10,075 ladspa-Pan::width gfloat [0,1] rwx width width. 0 ladspa-PreampIII::gain gfloat [0,10] rwx gain gain. 1 ladspa-PreampIII::latency gfloat r latency latency. -3,40282e+38 ladspa-PreampIII::temperature gfloat [0,005,1] rwx temperature temperature. 0,25375 ladspa-PreampIV::bass gfloat [-20,20] rwx bass bass. 0 ladspa-PreampIV::gain gfloat [0,10] rwx gain gain. 1 ladspa-PreampIV::hi gfloat [-20,20] rwx hi hi. 0 ladspa-PreampIV::latency gfloat r latency latency. -3,40282e+38 ladspa-PreampIV::mid gfloat [-20,20] rwx mid mid. 0 ladspa-PreampIV::temperature gfloat [0,005,1] rwx temperature temperature. 0,5025 ladspa-PreampIV::treble gfloat [-20,20] rwx treble treble. 0 ladspa-ToneStack::bass gfloat [0,1] rwx bass bass. 0,5 ladspa-ToneStack::mid gfloat [0,1] rwx mid mid. 0,5 ladspa-ToneStack::model gint [0,5] rwx model model. 0 ladspa-ToneStack::treble gfloat [0,1] rwx treble treble. 0,5 ladspa-ToneStackLT::bass gfloat [0,1] rwx bass bass. 0,5 ladspa-ToneStackLT::mid gfloat [0,1] rwx mid mid. 0,5 ladspa-ToneStackLT::treble gfloat [0,1] rwx treble treble. 0,5 ladspa-AmpIII::drive gfloat [0,0001,1] rwx drive drive. 1 ladspa-AmpIII::gain gfloat [0,10] rwx gain gain. 1 ladspa-AmpIII::latency gfloat r latency latency. -3,40282e+38 ladspa-AmpIII::temperature gfloat [0,005,1] rwx temperature temperature. 0,5025 ladspa-AmpIV::bass gfloat [-20,20] rwx bass bass. 0 ladspa-AmpIV::drive gfloat [0,0001,1] rwx drive drive. 1 ladspa-AmpIV::gain gfloat [0,10] rwx gain gain. 1 ladspa-AmpIV::hi gfloat [-20,20] rwx hi hi. 0 ladspa-AmpIV::latency gfloat r latency latency. -3,40282e+38 ladspa-AmpIV::mid gfloat [-20,20] rwx mid mid. 0 ladspa-AmpIV::temperature gfloat [0,005,1] rwx temperature temperature. 0,5025 ladspa-AmpIV::treble gfloat [-20,20] rwx treble treble. 0 ladspa-AmpV::bass gfloat [-9,9] rwx bass bass. 0 ladspa-AmpV::drive gfloat [0,0001,1] rwx drive drive. 0,750025 ladspa-AmpV::gain gfloat [0,3] rwx gain gain. 1 ladspa-AmpV::latency gfloat r latency latency. -3,40282e+38 ladspa-AmpV::tone gfloat [0,1] rwx tone tone. 0 ladspa-AmpV::watts gfloat [5,150] rwx watts watts. 77,5 ladspa-AmpVTS::bass gfloat [0,1] rwx bass bass. 0,5 ladspa-AmpVTS::drive gfloat [0,0001,1] rwx drive drive. 0,250075 ladspa-AmpVTS::gain gfloat [0,3] rwx gain gain. 2,25 ladspa-AmpVTS::latency gfloat r latency latency. -3,40282e+38 ladspa-AmpVTS::mid gfloat [0,1] rwx mid mid. 1 ladspa-AmpVTS::model gint [0,5] rwx model model. 0 ladspa-AmpVTS::treble gfloat [0,1] rwx treble treble. 0,75 ladspa-AmpVTS::watts gfloat [0,0001,1] rwx watts watts. 0,750025 ladspa-CabinetI::gain gfloat [-24,24] rwx gain gain. 0 ladspa-CabinetI::model gint [0,5] rwx model model. 1 ladspa-CabinetII::gain gfloat [-24,24] rwx gain gain. 0 ladspa-CabinetII::model gint [0,5] rwx model model. 1 ladspa-Clip::gain gfloat [-72,72] rwx gain gain. 1 ladspa-Clip::latency gfloat r latency latency. -3,40282e+38 ladspa-ChorusI::blend gfloat [0,1] rwx blend blend. 1 ladspa-ChorusI::feedback gfloat [0,1] rwx feedback feedback. 0 ladspa-ChorusI::feedforward gfloat [0,1] rwx feedforward feedforward. 0,25 ladspa-ChorusI::rate gfloat [0,5] rwx rate rate. 1,25 ladspa-ChorusI::t gfloat [2,5,40] rwx t t. 5 ladspa-ChorusI::width gfloat [0,5,10] rwx width width. 1 ladspa-StereoChorusI::blend gfloat [0,1] rwx blend blend. 1 ladspa-StereoChorusI::feedback gfloat [0,1] rwx feedback feedback. 0 ladspa-StereoChorusI::feedforward gfloat [0,1] rwx feedforward feedforward. 0,25 ladspa-StereoChorusI::phase gfloat [0,1] rwx phase phase. 1 ladspa-StereoChorusI::rate gfloat [0,5] rwx rate rate. 1,25 ladspa-StereoChorusI::t gfloat [2,5,40] rwx t t. 2,5 ladspa-StereoChorusI::width gfloat [0,5,10] rwx width width. 1 ladspa-ChorusII::blend gfloat [0,1] rwx blend blend. 1 ladspa-ChorusII::feedback gfloat [0,1] rwx feedback feedback. 0 ladspa-ChorusII::feedforward gfloat [0,1] rwx feedforward feedforward. 0,25 ladspa-ChorusII::rate gfloat [0,1] rwx rate rate. 0,25 ladspa-ChorusII::t gfloat [2,5,40] rwx t t. 5 ladspa-ChorusII::width gfloat [0,5,10] rwx width width. 1 ladspa-StereoChorusII::blend gfloat [0,1] rwx blend blend. 1 ladspa-StereoChorusII::feedback gfloat [0,1] rwx feedback feedback. 0 ladspa-StereoChorusII::feedforward gfloat [0,1] rwx feedforward feedforward. 0,5 ladspa-StereoChorusII::rate gfloat [0,1] rwx rate rate. 0,25 ladspa-StereoChorusII::t gfloat [2,5,40] rwx t t. 11,875 ladspa-StereoChorusII::width gfloat [0,5,10] rwx width width. 2,875 ladspa-PhaserI::depth gfloat [0,1] rwx depth depth. 0,75 ladspa-PhaserI::feedback gfloat [0,0,999] rwx feedback feedback. 0,74925 ladspa-PhaserI::rate gfloat [0,10] rwx rate rate. 1 ladspa-PhaserI::spread gfloat [0,3,14159] rwx spread spread. 0,785398 ladspa-PhaserII::depth gfloat [0,1] rwx depth depth. 0,75 ladspa-PhaserII::feedback gfloat [0,0,999] rwx feedback feedback. 0,74925 ladspa-PhaserII::rate gfloat [0,1] rwx rate rate. 0,25 ladspa-PhaserII::spread gfloat [0,1,5708] rwx spread spread. 0,392699 ladspa-SweepVFI::Q gfloat [0,001,0,999] rwx Q Q. 0,5 ladspa-SweepVFI::depth-x gfloat [0,1] rwx depth-x depth-x. 0,25 ladspa-SweepVFI::depth-y gfloat [0,1] rwx depth-y depth-y. 0,5 ladspa-SweepVFI::depth-z gfloat [0,1] rwx depth-z depth-z. 1 ladspa-SweepVFI::f gfloat [83,3383] rwx f f. 209,717 ladspa-SweepVFI::h gfloat [0,001,1] rwx h h. 0,25075 ladspa-SweepVFI::mode gint [0,1] rwx mode mode. 1 ladspa-SweepVFII::Q gfloat [0,001,0,999] rwx Q Q. 0,5 ladspa-SweepVFII::Q-depth-x gfloat [0,1] rwx Q-depth-x Q-depth-x. 0,25 ladspa-SweepVFII::Q-depth-y gfloat [0,1] rwx Q-depth-y Q-depth-y. 0,5 ladspa-SweepVFII::Q-depth-z gfloat [0,1] rwx Q-depth-z Q-depth-z. 1 ladspa-SweepVFII::Q-h gfloat [0,001,1] rwx Q-h Q-h. 0,25075 ladspa-SweepVFII::f gfloat [83,3383] rwx f f. 209,717 ladspa-SweepVFII::f-depth-x gfloat [0,1] rwx f-depth-x f-depth-x. 0,25 ladspa-SweepVFII::f-depth-y gfloat [0,1] rwx f-depth-y f-depth-y. 0,5 ladspa-SweepVFII::f-depth-z gfloat [0,1] rwx f-depth-z f-depth-z. 1 ladspa-SweepVFII::f-h gfloat [0,001,1] rwx f-h f-h. 0,25075 ladspa-SweepVFII::mode gint [0,1] rwx mode mode. 1 ladspa-AutoWah::Q gfloat [0,001,0,999] rwx Q Q. 0,2505 ladspa-AutoWah::depth gfloat [0,1] rwx depth depth. 0,5 ladspa-AutoWah::f gfloat [43,933] rwx f f. 92,8051 ladspa-Scape::blend gfloat [0,1] rwx blend blend. 0,75 ladspa-Scape::bpm gfloat [30,240] rwx bpm bpm. 82,5 ladspa-Scape::divider gint [2,4] rwx divider divider. 2 ladspa-Scape::dry gfloat [0,1] rwx dry dry. 0,25 ladspa-Scape::feedback gfloat [0,1] rwx feedback feedback. 0,25 ladspa-VCOs::f gfloat [1,5751] rwx f f. 100 ladspa-VCOs::param------square gfloat [0,1] rwx param------square param------square. 0 ladspa-VCOs::tri----saw gfloat [0,1] rwx tri----saw tri----saw. 0 ladspa-VCOs::volume gfloat [1e-06,1] rwx volume volume. 0,5 ladspa-VCOd::blend gfloat [-1,1] rwx blend blend. 0,5 ladspa-VCOd::f gfloat [1,5751] rwx f f. 100 ladspa-VCOd::param-1-------square gfloat [0,1] rwx param-1-------square param-1-------square. 0 ladspa-VCOd::param-1--tri----saw gfloat [0,1] rwx param-1--tri----saw param-1--tri----saw. 0 ladspa-VCOd::param-2-------square gfloat [0,1] rwx param-2-------square param-2-------square. 0 ladspa-VCOd::param-2--tri----saw gfloat [0,1] rwx param-2--tri----saw param-2--tri----saw. 0 ladspa-VCOd::param-2--tune gfloat [-12,12] rwx param-2--tune param-2--tune. 0 ladspa-VCOd::sync gfloat [0,1] rwx sync sync. 0 ladspa-VCOd::volume gfloat [1e-06,1] rwx volume volume. 0,5 ladspa-CEO::damping gfloat [0,1] rwx damping damping. 0 ladspa-CEO::mpm gfloat [4,244] rwx mpm mpm. 184 ladspa-CEO::volume gfloat [0,1] rwx volume volume. 0,5 ladspa-Sin::f gfloat [0,0001,20000] rwx f f. 100 ladspa-Sin::volume gfloat [1e-06,1] rwx volume volume. 0,5 ladspa-White::volume gfloat [1e-06,1] rwx volume volume. 0,5 ladspa-Lorenz::h gfloat [0,1] rwx h h. 0 ladspa-Lorenz::volume gfloat [1e-06,1] rwx volume volume. 0,5 ladspa-Lorenz::x gfloat [0,1] rwx x x. 1 ladspa-Lorenz::y gfloat [0,1] rwx y y. 0 ladspa-Lorenz::z gfloat [0,1] rwx z z. 0 ladspa-Roessler::h gfloat [0,1] rwx h h. 0 ladspa-Roessler::volume gfloat [1e-06,1] rwx volume volume. 0,5 ladspa-Roessler::x gfloat [0,1] rwx x x. 1 ladspa-Roessler::y gfloat [0,1] rwx y y. 0,5 ladspa-Roessler::z gfloat [0,1] rwx z z. 0 ladspa-JVRev::blend gfloat [0,0,28] rwx blend blend. 0,07 ladspa-JVRev::t60 gfloat [0,4,6] rwx t60 t60. 2,3 ladspa-Plate::bandwidth gfloat [0,005,0,999] rwx bandwidth bandwidth. 0,502 ladspa-Plate::blend gfloat [0,1] rwx blend blend. 0,25 ladspa-Plate::damping gfloat [0,0005,1] rwx damping damping. 0,250375 ladspa-Plate::tail gfloat [0,0,749] rwx tail tail. 0,3745 ladspa-Plate2x2::bandwidth gfloat [0,005,0,999] rwx bandwidth bandwidth. 0,502 ladspa-Plate2x2::blend gfloat [0,1] rwx blend blend. 0,25 ladspa-Plate2x2::damping gfloat [0,0005,1] rwx damping damping. 0,250375 ladspa-Plate2x2::tail gfloat [0,0,749] rwx tail tail. 0,3745 ladspa-Click::bpm gfloat [4,244] rwx bpm bpm. 64 ladspa-Click::damping gfloat [0,1] rwx damping damping. 0,75 ladspa-Click::volume gfloat [0,1] rwx volume volume. 0,5 ladspa-Dirac::damping gfloat [0,1] rwx damping damping. 0 ladspa-Dirac::ppm gfloat [30,60] rwx ppm ppm. 30 ladspa-Dirac::volume gfloat [0,1] rwx volume volume. 0 ladspa-HRTF::pan gint [-36,36] rwx pan pan. 0 ladspa-sequencer64::Closed-Gate-Value gfloat rwx Closed-Gate-Value Closed-Gate-Value. -3,40282e+38 ladspa-sequencer64::Loop-Steps gint [1,64] rwx Loop-Steps Loop-Steps. 64 ladspa-sequencer64::Reset-to-Value-on-Gate-Close- gint [0,1] rwx Reset-to-Value-on-Gate-Close- Reset-to-Value-on-Gate-Close-. 0 ladspa-sequencer64::Value-Step-0 gfloat rwx Value-Step-0 Value-Step-0. -3,40282e+38 ladspa-sequencer64::Value-Step-1 gfloat rwx Value-Step-1 Value-Step-1. -3,40282e+38 ladspa-sequencer64::Value-Step-10 gfloat rwx Value-Step-10 Value-Step-10. -3,40282e+38 ladspa-sequencer64::Value-Step-11 gfloat rwx Value-Step-11 Value-Step-11. -3,40282e+38 ladspa-sequencer64::Value-Step-12 gfloat rwx Value-Step-12 Value-Step-12. -3,40282e+38 ladspa-sequencer64::Value-Step-13 gfloat rwx Value-Step-13 Value-Step-13. -3,40282e+38 ladspa-sequencer64::Value-Step-14 gfloat rwx Value-Step-14 Value-Step-14. -3,40282e+38 ladspa-sequencer64::Value-Step-15 gfloat rwx Value-Step-15 Value-Step-15. -3,40282e+38 ladspa-sequencer64::Value-Step-16 gfloat rwx Value-Step-16 Value-Step-16. -3,40282e+38 ladspa-sequencer64::Value-Step-17 gfloat rwx Value-Step-17 Value-Step-17. -3,40282e+38 ladspa-sequencer64::Value-Step-18 gfloat rwx Value-Step-18 Value-Step-18. -3,40282e+38 ladspa-sequencer64::Value-Step-19 gfloat rwx Value-Step-19 Value-Step-19. -3,40282e+38 ladspa-sequencer64::Value-Step-2 gfloat rwx Value-Step-2 Value-Step-2. -3,40282e+38 ladspa-sequencer64::Value-Step-20 gfloat rwx Value-Step-20 Value-Step-20. -3,40282e+38 ladspa-sequencer64::Value-Step-21 gfloat rwx Value-Step-21 Value-Step-21. -3,40282e+38 ladspa-sequencer64::Value-Step-22 gfloat rwx Value-Step-22 Value-Step-22. -3,40282e+38 ladspa-sequencer64::Value-Step-23 gfloat rwx Value-Step-23 Value-Step-23. -3,40282e+38 ladspa-sequencer64::Value-Step-24 gfloat rwx Value-Step-24 Value-Step-24. -3,40282e+38 ladspa-sequencer64::Value-Step-25 gfloat rwx Value-Step-25 Value-Step-25. -3,40282e+38 ladspa-sequencer64::Value-Step-26 gfloat rwx Value-Step-26 Value-Step-26. -3,40282e+38 ladspa-sequencer64::Value-Step-27 gfloat rwx Value-Step-27 Value-Step-27. -3,40282e+38 ladspa-sequencer64::Value-Step-28 gfloat rwx Value-Step-28 Value-Step-28. -3,40282e+38 ladspa-sequencer64::Value-Step-29 gfloat rwx Value-Step-29 Value-Step-29. -3,40282e+38 ladspa-sequencer64::Value-Step-3 gfloat rwx Value-Step-3 Value-Step-3. -3,40282e+38 ladspa-sequencer64::Value-Step-30 gfloat rwx Value-Step-30 Value-Step-30. -3,40282e+38 ladspa-sequencer64::Value-Step-31 gfloat rwx Value-Step-31 Value-Step-31. -3,40282e+38 ladspa-sequencer64::Value-Step-32 gfloat rwx Value-Step-32 Value-Step-32. -3,40282e+38 ladspa-sequencer64::Value-Step-33 gfloat rwx Value-Step-33 Value-Step-33. -3,40282e+38 ladspa-sequencer64::Value-Step-34 gfloat rwx Value-Step-34 Value-Step-34. -3,40282e+38 ladspa-sequencer64::Value-Step-35 gfloat rwx Value-Step-35 Value-Step-35. -3,40282e+38 ladspa-sequencer64::Value-Step-36 gfloat rwx Value-Step-36 Value-Step-36. -3,40282e+38 ladspa-sequencer64::Value-Step-37 gfloat rwx Value-Step-37 Value-Step-37. -3,40282e+38 ladspa-sequencer64::Value-Step-38 gfloat rwx Value-Step-38 Value-Step-38. -3,40282e+38 ladspa-sequencer64::Value-Step-39 gfloat rwx Value-Step-39 Value-Step-39. -3,40282e+38 ladspa-sequencer64::Value-Step-4 gfloat rwx Value-Step-4 Value-Step-4. -3,40282e+38 ladspa-sequencer64::Value-Step-40 gfloat rwx Value-Step-40 Value-Step-40. -3,40282e+38 ladspa-sequencer64::Value-Step-41 gfloat rwx Value-Step-41 Value-Step-41. -3,40282e+38 ladspa-sequencer64::Value-Step-42 gfloat rwx Value-Step-42 Value-Step-42. -3,40282e+38 ladspa-sequencer64::Value-Step-43 gfloat rwx Value-Step-43 Value-Step-43. -3,40282e+38 ladspa-sequencer64::Value-Step-44 gfloat rwx Value-Step-44 Value-Step-44. -3,40282e+38 ladspa-sequencer64::Value-Step-45 gfloat rwx Value-Step-45 Value-Step-45. -3,40282e+38 ladspa-sequencer64::Value-Step-46 gfloat rwx Value-Step-46 Value-Step-46. -3,40282e+38 ladspa-sequencer64::Value-Step-47 gfloat rwx Value-Step-47 Value-Step-47. -3,40282e+38 ladspa-sequencer64::Value-Step-48 gfloat rwx Value-Step-48 Value-Step-48. -3,40282e+38 ladspa-sequencer64::Value-Step-49 gfloat rwx Value-Step-49 Value-Step-49. -3,40282e+38 ladspa-sequencer64::Value-Step-5 gfloat rwx Value-Step-5 Value-Step-5. -3,40282e+38 ladspa-sequencer64::Value-Step-50 gfloat rwx Value-Step-50 Value-Step-50. -3,40282e+38 ladspa-sequencer64::Value-Step-51 gfloat rwx Value-Step-51 Value-Step-51. -3,40282e+38 ladspa-sequencer64::Value-Step-52 gfloat rwx Value-Step-52 Value-Step-52. -3,40282e+38 ladspa-sequencer64::Value-Step-53 gfloat rwx Value-Step-53 Value-Step-53. -3,40282e+38 ladspa-sequencer64::Value-Step-54 gfloat rwx Value-Step-54 Value-Step-54. -3,40282e+38 ladspa-sequencer64::Value-Step-55 gfloat rwx Value-Step-55 Value-Step-55. -3,40282e+38 ladspa-sequencer64::Value-Step-56 gfloat rwx Value-Step-56 Value-Step-56. -3,40282e+38 ladspa-sequencer64::Value-Step-57 gfloat rwx Value-Step-57 Value-Step-57. -3,40282e+38 ladspa-sequencer64::Value-Step-58 gfloat rwx Value-Step-58 Value-Step-58. -3,40282e+38 ladspa-sequencer64::Value-Step-59 gfloat rwx Value-Step-59 Value-Step-59. -3,40282e+38 ladspa-sequencer64::Value-Step-6 gfloat rwx Value-Step-6 Value-Step-6. -3,40282e+38 ladspa-sequencer64::Value-Step-60 gfloat rwx Value-Step-60 Value-Step-60. -3,40282e+38 ladspa-sequencer64::Value-Step-61 gfloat rwx Value-Step-61 Value-Step-61. -3,40282e+38 ladspa-sequencer64::Value-Step-62 gfloat rwx Value-Step-62 Value-Step-62. -3,40282e+38 ladspa-sequencer64::Value-Step-63 gfloat rwx Value-Step-63 Value-Step-63. -3,40282e+38 ladspa-sequencer64::Value-Step-7 gfloat rwx Value-Step-7 Value-Step-7. -3,40282e+38 ladspa-sequencer64::Value-Step-8 gfloat rwx Value-Step-8 Value-Step-8. -3,40282e+38 ladspa-sequencer64::Value-Step-9 gfloat rwx Value-Step-9 Value-Step-9. -3,40282e+38 ladspa-pointerCastDistortion::Dry-wet-mix gfloat [0,1] rwx Dry-wet-mix Dry-wet-mix. 0 ladspa-pointerCastDistortion::Effect-cutoff-freq gfloat [4,41,13230] rwx Effect-cutoff-freq Effect-cutoff-freq. 32,6376 ladspa-comb::Band-separation gfloat [16,640] rwx Band-separation Band-separation. 172 ladspa-comb::Feedback gfloat [-0,99,0,99] rwx Feedback Feedback. 0 ladspa-tap-stereo-echo::Cross-Mode gboolean rwx Cross-Mode Cross-Mode. FALSE ladspa-tap-stereo-echo::Dry-Level--dB- gfloat [-70,10] rwx Dry-Level--dB- Dry-Level--dB-. 0 ladspa-tap-stereo-echo::Haas-Effect gboolean rwx Haas-Effect Haas-Effect. FALSE ladspa-tap-stereo-echo::L-Delay--ms- gfloat [0,2000] rwx L-Delay--ms- L-Delay--ms-. 100 ladspa-tap-stereo-echo::L-Echo-Level--dB- gfloat [-70,10] rwx L-Echo-Level--dB- L-Echo-Level--dB-. 0 ladspa-tap-stereo-echo::L-Feedback---- gfloat [0,100] rwx L-Feedback---- L-Feedback----. 0 ladspa-tap-stereo-echo::R-Echo-Level--dB- gfloat [-70,10] rwx R-Echo-Level--dB- R-Echo-Level--dB-. 0 ladspa-tap-stereo-echo::R-Haas-Delay--ms- gfloat [0,2000] rwx R-Haas-Delay--ms- R-Haas-Delay--ms-. 100 ladspa-tap-stereo-echo::R-Haas-Feedback---- gfloat [0,100] rwx R-Haas-Feedback---- R-Haas-Feedback----. 0 ladspa-tap-stereo-echo::Swap-Outputs gboolean rwx Swap-Outputs Swap-Outputs. FALSE ladspa-gsm::Dry-wet-mix gfloat [0,1] rwx Dry-wet-mix Dry-wet-mix. 1 ladspa-gsm::Error-rate gfloat [0,30] rwx Error-rate Error-rate. 0 ladspa-gsm::Number-of-passes gint [0,10] rwx Number-of-passes Number-of-passes. 1 ladspa-gsm::latency gfloat r latency latency. -3,40282e+38 ladspa-highpass-iir::Cutoff-Frequency gfloat [4,41,19845] rwx Cutoff-Frequency Cutoff-Frequency. 36,1195 ladspa-highpass-iir::Stages-2-poles-per-stage- gint [1,10] rwx Stages-2-poles-per-stage- Stages-2-poles-per-stage-. 1 ladspa-vocoder::Band-1-Level gfloat [0,1] rwx Band-1-Level Band-1-Level. 0 ladspa-vocoder::Band-10-Level gfloat [0,1] rwx Band-10-Level Band-10-Level. 0 ladspa-vocoder::Band-11-Level gfloat [0,1] rwx Band-11-Level Band-11-Level. 0 ladspa-vocoder::Band-12-Level gfloat [0,1] rwx Band-12-Level Band-12-Level. 0 ladspa-vocoder::Band-13-Level gfloat [0,1] rwx Band-13-Level Band-13-Level. 0 ladspa-vocoder::Band-14-Level gfloat [0,1] rwx Band-14-Level Band-14-Level. 0 ladspa-vocoder::Band-15-Level gfloat [0,1] rwx Band-15-Level Band-15-Level. 0 ladspa-vocoder::Band-16-Level gfloat [0,1] rwx Band-16-Level Band-16-Level. 0 ladspa-vocoder::Band-2-Level gfloat [0,1] rwx Band-2-Level Band-2-Level. 0 ladspa-vocoder::Band-3-Level gfloat [0,1] rwx Band-3-Level Band-3-Level. 0 ladspa-vocoder::Band-4-Level gfloat [0,1] rwx Band-4-Level Band-4-Level. 0 ladspa-vocoder::Band-5-Level gfloat [0,1] rwx Band-5-Level Band-5-Level. 0 ladspa-vocoder::Band-6-Level gfloat [0,1] rwx Band-6-Level Band-6-Level. 0 ladspa-vocoder::Band-7-Level gfloat [0,1] rwx Band-7-Level Band-7-Level. 0 ladspa-vocoder::Band-8-Level gfloat [0,1] rwx Band-8-Level Band-8-Level. 0 ladspa-vocoder::Band-9-Level gfloat [0,1] rwx Band-9-Level Band-9-Level. 0 ladspa-vocoder::Number-of-bands gint [1,16] rwx Number-of-bands Number-of-bands. 1 ladspa-karaoke::Vocal-volume gfloat [-70,0] rwx Vocal-volume Vocal-volume. 0 ladspa-jaminController::Scene-no- gint [1,20] rwx Scene-no- Scene-no-. 1 ladspa-tap-chorusflanger::Contour--Hz- gfloat [20,20000] rwx Contour--Hz- Contour--Hz-. 100 ladspa-tap-chorusflanger::Delay--ms- gfloat [0,100] rwx Delay--ms- Delay--ms-. 25 ladspa-tap-chorusflanger::Depth---- gfloat [0,100] rwx Depth---- Depth----. 75 ladspa-tap-chorusflanger::Dry-Level--dB- gfloat [-90,20] rwx Dry-Level--dB- Dry-Level--dB-. 0 ladspa-tap-chorusflanger::Frequency--Hz- gfloat [0,5] rwx Frequency--Hz- Frequency--Hz-. 1,25 ladspa-tap-chorusflanger::L-R-Phase-Shift--deg- gfloat [0,180] rwx L-R-Phase-Shift--deg- L-R-Phase-Shift--deg-. 90 ladspa-tap-chorusflanger::Wet-Level--dB- gfloat [-90,20] rwx Wet-Level--dB- Wet-Level--dB-. 0 ladspa-bandpass-iir::Bandwidth gfloat [4,41,19845] rwx Bandwidth Bandwidth. 295,832 ladspa-bandpass-iir::Center-Frequency gfloat [4,41,19845] rwx Center-Frequency Center-Frequency. 295,832 ladspa-bandpass-iir::Stages-2-poles-per-stage- gint [1,10] rwx Stages-2-poles-per-stage- Stages-2-poles-per-stage-. 1 ladspa-sc4::Amplitude gfloat [-40,12] r Amplitude Amplitude. -40 ladspa-sc4::Attack-time gfloat [1,5,400] rwx Attack-time Attack-time. 101,125 ladspa-sc4::Gain-reduction gfloat [-24,0] r Gain-reduction Gain-reduction. -24 ladspa-sc4::Knee-radius gfloat [1,10] rwx Knee-radius Knee-radius. 3,25 ladspa-sc4::Makeup-gain gfloat [0,24] rwx Makeup-gain Makeup-gain. 0 ladspa-sc4::RMS-peak gfloat [0,1] rwx RMS-peak RMS-peak. 0 ladspa-sc4::Ratio gfloat [1,20] rwx Ratio Ratio. 1 ladspa-sc4::Release-time gfloat [2,800] rwx Release-time Release-time. 401 ladspa-sc4::Threshold-level gfloat [-30,0] rwx Threshold-level Threshold-level. 0 ladspa-sawtooth-fc-oa::Frequenz gfloat [0,91875,22050] rwx Frequenz Frequenz. 440 ladspa-notch-iir::Bandwidth gfloat [4,41,19845] rwx Bandwidth Bandwidth. 295,832 ladspa-notch-iir::Center-Frequency gfloat [4,41,19845] rwx Center-Frequency Center-Frequency. 295,832 ladspa-notch-iir::Stages-2-poles-per-stage- gint [1,10] rwx Stages-2-poles-per-stage- Stages-2-poles-per-stage-. 1 ladspa-freqTracker::Tracking-speed gfloat [0,1] rwx Tracking-speed Tracking-speed. 0,5 ladspa-comb-n::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-comb-n::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-comb-n::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-comb-l::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-comb-l::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-comb-l::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-comb-c::Decay-Time gfloat >= 0 rwx Decay-Time Decay-Time. 0 ladspa-comb-c::Delay-Time gfloat >= 0 rwx Delay-Time Delay-Time. 0 ladspa-comb-c::Max-Delay gfloat >= 0 rwx Max-Delay Max-Delay. 0 ladspa-sequencer32::Closed-Gate-Value gfloat rwx Closed-Gate-Value Closed-Gate-Value. -3,40282e+38 ladspa-sequencer32::Loop-Steps gint [1,32] rwx Loop-Steps Loop-Steps. 32 ladspa-sequencer32::Reset-to-Value-on-Gate-Close- gint [0,1] rwx Reset-to-Value-on-Gate-Close- Reset-to-Value-on-Gate-Close-. 0 ladspa-sequencer32::Value-Step-0 gfloat rwx Value-Step-0 Value-Step-0. -3,40282e+38 ladspa-sequencer32::Value-Step-1 gfloat rwx Value-Step-1 Value-Step-1. -3,40282e+38 ladspa-sequencer32::Value-Step-10 gfloat rwx Value-Step-10 Value-Step-10. -3,40282e+38 ladspa-sequencer32::Value-Step-11 gfloat rwx Value-Step-11 Value-Step-11. -3,40282e+38 ladspa-sequencer32::Value-Step-12 gfloat rwx Value-Step-12 Value-Step-12. -3,40282e+38 ladspa-sequencer32::Value-Step-13 gfloat rwx Value-Step-13 Value-Step-13. -3,40282e+38 ladspa-sequencer32::Value-Step-14 gfloat rwx Value-Step-14 Value-Step-14. -3,40282e+38 ladspa-sequencer32::Value-Step-15 gfloat rwx Value-Step-15 Value-Step-15. -3,40282e+38 ladspa-sequencer32::Value-Step-16 gfloat rwx Value-Step-16 Value-Step-16. -3,40282e+38 ladspa-sequencer32::Value-Step-17 gfloat rwx Value-Step-17 Value-Step-17. -3,40282e+38 ladspa-sequencer32::Value-Step-18 gfloat rwx Value-Step-18 Value-Step-18. -3,40282e+38 ladspa-sequencer32::Value-Step-19 gfloat rwx Value-Step-19 Value-Step-19. -3,40282e+38 ladspa-sequencer32::Value-Step-2 gfloat rwx Value-Step-2 Value-Step-2. -3,40282e+38 ladspa-sequencer32::Value-Step-20 gfloat rwx Value-Step-20 Value-Step-20. -3,40282e+38 ladspa-sequencer32::Value-Step-21 gfloat rwx Value-Step-21 Value-Step-21. -3,40282e+38 ladspa-sequencer32::Value-Step-22 gfloat rwx Value-Step-22 Value-Step-22. -3,40282e+38 ladspa-sequencer32::Value-Step-23 gfloat rwx Value-Step-23 Value-Step-23. -3,40282e+38 ladspa-sequencer32::Value-Step-24 gfloat rwx Value-Step-24 Value-Step-24. -3,40282e+38 ladspa-sequencer32::Value-Step-25 gfloat rwx Value-Step-25 Value-Step-25. -3,40282e+38 ladspa-sequencer32::Value-Step-26 gfloat rwx Value-Step-26 Value-Step-26. -3,40282e+38 ladspa-sequencer32::Value-Step-27 gfloat rwx Value-Step-27 Value-Step-27. -3,40282e+38 ladspa-sequencer32::Value-Step-28 gfloat rwx Value-Step-28 Value-Step-28. -3,40282e+38 ladspa-sequencer32::Value-Step-29 gfloat rwx Value-Step-29 Value-Step-29. -3,40282e+38 ladspa-sequencer32::Value-Step-3 gfloat rwx Value-Step-3 Value-Step-3. -3,40282e+38 ladspa-sequencer32::Value-Step-30 gfloat rwx Value-Step-30 Value-Step-30. -3,40282e+38 ladspa-sequencer32::Value-Step-31 gfloat rwx Value-Step-31 Value-Step-31. -3,40282e+38 ladspa-sequencer32::Value-Step-4 gfloat rwx Value-Step-4 Value-Step-4. -3,40282e+38 ladspa-sequencer32::Value-Step-5 gfloat rwx Value-Step-5 Value-Step-5. -3,40282e+38 ladspa-sequencer32::Value-Step-6 gfloat rwx Value-Step-6 Value-Step-6. -3,40282e+38 ladspa-sequencer32::Value-Step-7 gfloat rwx Value-Step-7 Value-Step-7. -3,40282e+38 ladspa-sequencer32::Value-Step-8 gfloat rwx Value-Step-8 Value-Step-8. -3,40282e+38 ladspa-sequencer32::Value-Step-9 gfloat rwx Value-Step-9 Value-Step-9. -3,40282e+38 ladspa-tap-deesser::Attenuation--dB- gfloat [0,10] r Attenuation--dB- Attenuation--dB-. 0 ladspa-tap-deesser::Frequency--Hz- gfloat [2000,16000] rwx Frequency--Hz- Frequency--Hz-. 5500 ladspa-tap-deesser::Monitor gint [0,1] rwx Monitor Monitor. 0 ladspa-tap-deesser::Sidechain-Filter gint [0,1] rwx Sidechain-Filter Sidechain-Filter. 0 ladspa-tap-deesser::Threshold-Level--dB- gfloat [-50,10] rwx Threshold-Level--dB- Threshold-Level--dB-. 0 ladspa-noise-white::Amplitude gfloat >= 0 rwx Amplitude Amplitude. 1 GstSMPTEAlpha::border gint >= 0 rw Border The border width of the transition. 0 GstSMPTEAlpha::depth gint [1,24] rw Depth Depth of the mask in bits. 16 GstSMPTEAlpha::position gdouble [0,1] rw Position Position of the transition effect. 0 GstSMPTEAlpha::type GstSMPTEAlphaTransitionType rw Type The type of transition to use. A bar moves from left to right GstSMPTEAlpha::invert gboolean rw Invert Invert transition mask. FALSE GstVideoMixerPad::alpha gdouble [0,1] rw Alpha Alpha of the picture. 1 GstVideoMixerPad::xpos gint rw X Position X Position of the picture. 0 GstVideoMixerPad::ypos gint rw Y Position Y Position of the picture. 0 GstVideoMixerPad::zorder guint <= 10000 rw Z-Order Z Order of the picture. 0 GstRtpH264Depay::byte-stream gboolean rw Byte Stream Generate byte stream format of NALU (deprecated; use caps). TRUE GstRtpH264Depay::access-unit gboolean rw Access Unit Merge NALU into AU (picture) (deprecated; use caps). FALSE GstAudioKaraoke::filter-band gfloat [0,441] rw Filter Band The Frequency band of the filter. 220 GstAudioKaraoke::filter-width gfloat [0,100] rw Filter Width The Frequency width of the filter. 100 GstAudioKaraoke::level gfloat [0,1] rw Level Level of the effect (1.0 = full). 1 GstAudioKaraoke::mono-level gfloat [0,1] rw Mono Level Level of the mono channel (1.0 = full). 1 GstPulseSink::device gchar* rw Device The PulseAudio sink device to connect to. NULL GstPulseSink::server gchar* rw Server The PulseAudio server to connect to. NULL GstPulseSink::device-name gchar* r Device name Human-readable name of the sound device. NULL GstPulseSink::volume gdouble [0,10] rw Volume Linear volume of this stream, 1.0=100%. 1 GstPulseSink::mute gboolean rw Mute Mute state of this stream. FALSE GstPulseSink::client gchar* rw Client The PulseAudio client name to use. "lt-gst-plugins-good-plugins-scan" GstPulseSink::stream-properties GstStructure* rw stream properties list of pulseaudio stream properties. GstPulseSrc::device gchar* rw Device The PulseAudio source device to connect to. NULL GstPulseSrc::server gchar* rw Server The PulseAudio server to connect to. NULL GstPulseSrc::device-name gchar* r Device name Human-readable name of the sound device. NULL GstPulseSrc::stream-properties GstStructure* rw stream properties list of pulseaudio stream properties. GstPulseSrc::client gchar* rw Client The PulseAudio client_name_to_use. "lt-gst-plugins-good-plugins-scan" GstPulseSrc::mute gboolean rw Mute Mute state of this stream. FALSE GstPulseSrc::source-output-index guint r source output index The index of the PulseAudio source output corresponding to this record stream. 4294967295 GstPulseSrc::volume gdouble [0,10] rw Volume Linear volume of this stream, 1.0=100%. 1 GstPulseMixer::device gchar* rw Device The PulseAudio sink or source to control. NULL GstPulseMixer::device-name gchar* r Device name Human-readable name of the sound device. NULL GstPulseMixer::server gchar* rw Server The PulseAudio server to connect to. NULL GstTagInject::tags gchar* w taglist List of tags to inject into the target file. NULL GstDeinterleave::keep-positions gboolean rw Keep positions Keep the original channel positions on the output buffers. FALSE GstInterleave::channel-positions GValueArray* rw Channel positions Channel positions used on the output. GstInterleave::channel-positions-from-input gboolean rw Channel positions from input Take channel positions from the input. TRUE GstRgVolume::album-mode gboolean rw Album mode Prefer album over track gain. TRUE GstRgVolume::fallback-gain gdouble [-60,60] rw Fallback gain Gain for streams missing tags [dB]. 0 GstRgVolume::headroom gdouble [0,60] rw Headroom Extra headroom [dB]. 0 GstRgVolume::pre-amp gdouble [-60,60] rw Pre-amp Extra gain [dB]. 0 GstRgVolume::result-gain gdouble [-120,120] r Result-gain Applied gain [dB]. 0 GstRgVolume::target-gain gdouble [-120,120] r Target-gain Applicable gain [dB]. 0 GstRgLimiter::enabled gboolean rw Enabled Enable processing. TRUE GstRgAnalysis::forced gboolean rw Forced Analyze even if ReplayGain tags exist. TRUE GstRgAnalysis::num-tracks gint >= 0 rw Number of album tracks Number of remaining album tracks. 0 GstRgAnalysis::reference-level gdouble [0,150] rw Reference level Reference level [dB]. 89 GstRgAnalysis::message gboolean rwx Message Post statics messages. FALSE GstHDV1394Src::channel gint [0,64] rw Channel Channel number for listening. 63 GstHDV1394Src::device-name gchar* r device name user-friendly name of the device. "Default" GstHDV1394Src::guid guint64 rw GUID select one of multiple DV devices by its GUID. use a hexadecimal like 0xhhhhhhhhhhhhhhhh. (0 = no guid). 0 GstHDV1394Src::port gint [G_MAXULONG,16] rw Port Port number (-1 automatic). -1 GstHDV1394Src::use-avc gboolean rw Use AV/C Use AV/C VTR control. TRUE GstAutoVideoSrc::filter-caps GstCaps* rw Filter caps Filter src candidates using these caps. GstAutoAudioSrc::filter-caps GstCaps* rw Filter caps Filter sink candidates using these caps. GstRtpJPEGPay::quality gint [0,255] rw Quality Quality factor on JPEG data (unused). 255 GstRtpJPEGPay::type gint [0,255] rw Type Default JPEG Type, overwritten by SOF when present. 1 GstRtpJPEGPay::buffer-list gboolean rw Buffer List Use Buffer Lists. FALSE GstAudioFIRFilter::kernel GValueArray* rw Filter Kernel Filter kernel for the FIR filter. GstAudioFIRFilter::latency guint64 rw Latecy Filter latency in samples. 0 GstAudioIIRFilter::a GValueArray* rw A Filter coefficients (numerator of transfer function). GstAudioIIRFilter::b GValueArray* rw B Filter coefficients (denominator of transfer function). GstAudioDelay::delay guint64 >= 1 rw Delay Delay in nanoseconds. 1 GstAudioDelay::feedback gfloat [0,1] rw Feedback Amount of feedback. 0 GstAudioDelay::intensity gfloat [0,1] rw Intensity Intensity of the echo. 0 GstAudioReverb::delay guint64 >= 1 rw Delay Delay of the echo in nanoseconds. 1 GstAudioReverb::feedback gfloat [0,1] rw Feedback Amount of feedback. 0 GstAudioReverb::intensity gfloat [0,1] rw Intensity Intensity of the echo. 0 GstAudioEcho::delay guint64 >= 1 rw Delay Delay of the echo in nanoseconds. 1 GstAudioEcho::feedback gfloat [0,1] rw Feedback Amount of feedback. 0 GstAudioEcho::intensity gfloat [0,1] rw Intensity Intensity of the echo. 0 GstAudioEcho::max-delay guint64 >= 1 rw Maximum Delay Maximum delay of the echo in nanoseconds (can't be changed in PLAYING or PAUSED state). 1 GstAspectRatioCrop::aspect-ratio GstFraction rw aspect-ratio Target aspect-ratio of video. GstRtpG726Depay::force-aal2 gboolean rw Force AAL2 Force AAL2 decoding for compatibility with bad payloaders. TRUE GstRtpG726Pay::force-aal2 gboolean rw Force AAL2 Force AAL2 encoding for compatibility with bad depayloaders. TRUE GstRtpH263Pay::modea-only gboolean rw Fragment packets in mode A Only Disable packetization modes B and C. FALSE GstDeinterlace::fields GstDeinterlaceFields rw fields Fields to use for deinterlacing. All fields GstDeinterlace::method GstDeinterlaceMethods rw Method Deinterlace Method. Television: Full resolution GstDeinterlace::mode GstDeinterlaceModes rw Mode Deinterlace Mode. Auto detection GstDeinterlace::tff GstDeinterlaceFieldLayout rw tff Deinterlace top field first. Auto detection GstDeinterlace::drop-orphans gboolean rw drop-orphans Drop orphan fields at the beginning of telecine patterns in active locking mode. TRUE GstDeinterlace::ignore-obscure gboolean rw ignore-obscure Ignore obscure telecine patterns (only consider P, I and 2:3 variants). TRUE GstDeinterlace::locking GstDeinterlaceLocking rw locking Pattern locking mode. No pattern locking GstAgingTV::color-aging gboolean rw Color Aging Color Aging. TRUE GstAgingTV::dusts gboolean rw Dusts Dusts. TRUE GstAgingTV::pits gboolean rw Pits Pits. TRUE GstAgingTV::scratch-lines guint <= 20 rw Scratch Lines Number of scratch lines. 7 GstOpTV::mode GstOpTVMode rw Mode Mode. Maelstrom GstOpTV::speed gint rw Speed Effect speed. 16 GstOpTV::threshold guint <= G_MAXINT rw Threshold Luma threshold. 60 GstRadioacTV::color GstRadioacTVColor rw Color Color. White GstRadioacTV::interval guint <= G_MAXINT rw Interval Snapshot interval (in strobe mode). 3 GstRadioacTV::mode GstRadioacTVMode rw Mode Mode. Normal GstRadioacTV::trigger gboolean rw Trigger Trigger (in trigger mode). FALSE GstStreakTV::feedback gboolean rw Feedback Feedback. FALSE GstRippleTV::mode GstRippleTVMode rw Mode Mode. Motion Detection GstRippleTV::reset gboolean w Reset Reset all current ripples. FALSE GstRtpBin::do-lost gboolean rw Do Lost Send an event downstream when a packet is lost. FALSE GstRtpBin::latency guint rw Buffer latency in ms Default amount of ms to buffer in the jitterbuffers. 200 GstRtpBin::sdes GstStructure* rw SDES The SDES items of this session. GstRtpBin::ignore-pt gboolean rw Ignore PT Do not demultiplex based on PT values. FALSE GstRtpBin::autoremove gboolean rw Auto Remove Automatically remove timed out sources. FALSE GstRtpBin::buffer-mode RTPJitterBufferMode rw Buffer Mode Control the buffering algorithm in use. Slave receiver to sender clock GstRtpBin::ntp-sync gboolean rw Sync on NTP clock Synchronize received streams to the NTP clock. FALSE GstRtpBin::use-pipeline-clock gboolean rw Use pipeline clock Use the pipeline clock to set the NTP time in the RTCP SR messages. FALSE GstRtpBin::rtcp-sync GstRTCPSync rw RTCP Sync Use of RTCP SR in synchronization. always GstRtpBin::rtcp-sync-interval guint rw RTCP Sync Interval RTCP SR interval synchronization (ms) (0 = always). 0 GstRtpJitterBuffer::do-lost gboolean rw Do Lost Send an event downstream when a packet is lost. FALSE GstRtpJitterBuffer::drop-on-latency gboolean rw Drop buffers when maximum latency is reached Tells the jitterbuffer to never exceed the given latency in size. FALSE GstRtpJitterBuffer::latency guint rw Buffer latency in ms Amount of ms to buffer. 200 GstRtpJitterBuffer::ts-offset gint64 rw Timestamp Offset Adjust buffer timestamps with offset in nanoseconds. 0 GstRtpJitterBuffer::mode RTPJitterBufferMode rw Mode Control the buffering algorithm in use. Slave receiver to sender clock GstRtpJitterBuffer::percent gint [0,100] r percent The buffer filled percent. 0 GstRtpSession::bandwidth gdouble >= 0 rw Bandwidth The bandwidth of the session in bytes per second (0 for auto-discover). 64000 GstRtpSession::internal-session RTPSession* r Internal Session The internal RTPSession object. GstRtpSession::ntp-ns-base guint64 rw NTP base time The NTP base time corresponding to running_time 0 (deprecated). 0 GstRtpSession::num-active-sources guint r Num Active Sources The number of active sources in the session. 0 GstRtpSession::num-sources guint r Num Sources The number of sources in the session. 0 GstRtpSession::rtcp-fraction gdouble >= 0 rw RTCP Fraction The RTCP bandwidth of the session in bytes per second (or as a real fraction of the RTP bandwidth if < 1.0). 3200 GstRtpSession::sdes GstStructure* rw SDES The SDES items of this session. GstRtpSession::rtcp-rr-bandwidth gint >= G_MAXULONG rw RTCP RR bandwidth The RTCP bandwidth used for receivers in bytes per second (-1 = default). -1 GstRtpSession::rtcp-rs-bandwidth gint >= G_MAXULONG rw RTCP RS bandwidth The RTCP bandwidth used for senders in bytes per second (-1 = default). -1 GstRtpSession::use-pipeline-clock gboolean rw Use pipeline clock Use the pipeline clock to set the NTP time in the RTCP SR messages. FALSE GstRtpSession::rtcp-min-interval guint64 rw Minimum RTCP interval Minimum interval between Regular RTCP packet (in ns). 5000000000 GstV4l2Sink::device gchar* rw Device Device location. "/dev/video1" GstV4l2Sink::device-fd gint >= -1 r File descriptor File descriptor of the device. -1 GstV4l2Sink::device-name gchar* r Device name Name of the device. NULL GstV4l2Sink::flags GstV4l2DeviceTypeFlags r Flags Device type flags. GstV4l2Sink::overlay-height guint rw Overlay height The height of the video overlay; default is equal to negotiated image height. 0 GstV4l2Sink::overlay-left gint rw Overlay left The leftmost (x) coordinate of the video overlay; top left corner of screen is 0,0. 0 GstV4l2Sink::overlay-top gint rw Overlay top The topmost (y) coordinate of the video overlay; top left corner of screen is 0,0. 0 GstV4l2Sink::overlay-width guint rw Overlay width The width of the video overlay; default is equal to negotiated image width. 0 GstV4l2Sink::queue-size guint [1,16] rw Queue size Number of buffers to be enqueud in the driver in streaming mode. 12 GstV4l2Sink::brightness gint rw Brightness Picture brightness, or more precisely, the black level. 0 GstV4l2Sink::contrast gint rw Contrast Picture contrast or luma gain. 0 GstV4l2Sink::hue gint rw Hue Hue or color balance. 0 GstV4l2Sink::saturation gint rw Saturation Picture color saturation or chroma gain. 0 GstV4l2Sink::crop-height guint rw Crop height The height of the video crop; default is equal to negotiated image height. 0 GstV4l2Sink::crop-left gint rw Crop left The leftmost (x) coordinate of the video crop; top left corner of image is 0,0. 0 GstV4l2Sink::crop-top gint rw Crop top The topmost (y) coordinate of the video crop; top left corner of image is 0,0. 0 GstV4l2Sink::crop-width guint rw Crop width The width of the video crop; default is equal to negotiated image width. 0 GstV4l2Sink::min-queued-bufs guint <= 16 rw Minimum queued bufs 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). 1 GstShapeWipe::border gfloat [0,1] rw Border Border of the mask. 0 GstShapeWipe::position gfloat [0,1] rw Position Position of the mask. 0 GstFlvMux::is-live gboolean rw Is Live The stream is live and does not need an index. FALSE GstFlvMux::streamable gboolean rw streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstCapsSetter::caps GstCaps* rw Merge caps Merge these caps (thereby overwriting) in the stream. GstCapsSetter::join gboolean rw Join Match incoming caps' mime-type to mime-type of provided caps. TRUE GstCapsSetter::replace gboolean rw Replace Drop fields of incoming caps. FALSE GstOss4Mixer::device gchar* rw Device OSS mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) (NULL = use first mixer device found). NULL GstOss4Mixer::device-name gchar* r Device name Human-readable name of the sound device. NULL GstOss4Source::device gchar* rw Device OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available device). NULL GstOss4Source::device-name gchar* r Device name Human-readable name of the sound device. NULL GstOss4Sink::device gchar* rw Device OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) (NULL = use first available playback device). NULL GstOss4Sink::device-name gchar* r Device name Human-readable name of the sound device. NULL GstOss4Sink::mute gboolean rw Mute Mute state of this stream. FALSE GstOss4Sink::volume gdouble [0,10] rw Volume Linear volume of this stream, 1.0=100%. 1 GstRtpTheoraPay::config-interval guint <= 3600 rw Config Send Interval Send Config Insertion Interval in seconds (configuration headers will be multiplexed in the data stream when detected.) (0 = disabled). 0 GstVideoMixer2::background GstVideoMixer2Background rw Background Background type. Checker pattern GstRtpJ2KPay::buffer-list gboolean rw Buffer List Use Buffer Lists. TRUE GstRtpJ2KDepay::buffer-list gboolean rw Buffer List Use Buffer Lists. TRUE GstJackAudioSrc::client JackClient* rw JackClient Handle for jack client. GstJackAudioSrc::connect GstJackConnect rw Connect Specify how the input ports will be connected. Automatically connect ports to physical ports GstJackAudioSrc::server gchar* rw Server The Jack server to connect to (NULL = default). NULL GstJackAudioSrc::client-name gchar* rw Client name The client name of the Jack instance (NULL = default). NULL GstJackAudioSink::client JackClient* rw JackClient Handle for jack client. GstJackAudioSink::connect GstJackConnect rw Connect Specify how the output ports will be connected. Automatically connect ports to physical ports GstJackAudioSink::server gchar* rw Server The Jack server to connect to (NULL = default). NULL GstJackAudioSink::client-name gchar* rw Client name The client name of the Jack instance (NULL = default). NULL GstFlacParse::check-frame-checksums gboolean rw Check Frame Checksums Check the overall checksums of every frame. FALSE GstV4l2Radio::device gchar* rw Radio device location Video4Linux2 radio device location. "/dev/radio0" GstV4l2Radio::frequency gint [87500000,108000000] rw Station frequency Station frequency in Hz. 100000000 GstQTMux::dts-method GstQTMuxDtsMethods rwx dts-method Method to determine DTS time. reorder GstQTMux::faststart gboolean rw Format file to faststart If the file should be formatted for faststart (headers first). FALSE GstQTMux::faststart-file gchar* rwx File to use for storing buffers File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. NULL GstQTMux::fragment-duration guint rwx Fragment duration Fragment durations in ms (produce a fragmented file if > 0). 0 GstQTMux::moov-recovery-file gchar* rwx File to store data for posterior moov atom recovery File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). NULL GstQTMux::movie-timescale guint >= 1 rwx Movie timescale Timescale to use in the movie (units per second). 1000 GstQTMux::presentation-time gboolean rwx Include presentation-time info Calculate and include presentation/composition time (in addition to decoding time). TRUE GstQTMux::streamable gboolean rwx Streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstQTMux::trak-timescale guint rwx Track timescale Timescale to use for the tracks (units per second, 0 is automatic). 0 GstQTMoovRecover::broken-input gchar* rw Path to broken input file Path to broken input file. (If qtmux was on faststart mode, this file is the faststart file). NULL GstQTMoovRecover::faststart-mode gboolean rw If the broken input is from faststart mode If the broken input is from faststart mode. FALSE GstQTMoovRecover::fixed-output gchar* rw Path to write the fixed file Path to write the fixed file to (used as output). NULL GstQTMoovRecover::recovery-input gchar* rw Path to recovery file Path to recovery file (used as input). NULL GstMP4Mux::dts-method GstQTMuxDtsMethods rwx dts-method Method to determine DTS time. reorder GstMP4Mux::faststart gboolean rw Format file to faststart If the file should be formatted for faststart (headers first). FALSE GstMP4Mux::faststart-file gchar* rwx File to use for storing buffers File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. NULL GstMP4Mux::fragment-duration guint rwx Fragment duration Fragment durations in ms (produce a fragmented file if > 0). 0 GstMP4Mux::moov-recovery-file gchar* rwx File to store data for posterior moov atom recovery File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). NULL GstMP4Mux::movie-timescale guint >= 1 rwx Movie timescale Timescale to use in the movie (units per second). 1000 GstMP4Mux::presentation-time gboolean rwx Include presentation-time info Calculate and include presentation/composition time (in addition to decoding time). TRUE GstMP4Mux::streamable gboolean rwx Streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstMP4Mux::trak-timescale guint rwx Track timescale Timescale to use for the tracks (units per second, 0 is automatic). 0 GstMJ2Mux::dts-method GstQTMuxDtsMethods rwx dts-method Method to determine DTS time. reorder GstMJ2Mux::faststart gboolean rw Format file to faststart If the file should be formatted for faststart (headers first). FALSE GstMJ2Mux::faststart-file gchar* rwx File to use for storing buffers File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. NULL GstMJ2Mux::fragment-duration guint rwx Fragment duration Fragment durations in ms (produce a fragmented file if > 0). 0 GstMJ2Mux::moov-recovery-file gchar* rwx File to store data for posterior moov atom recovery File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). NULL GstMJ2Mux::movie-timescale guint >= 1 rwx Movie timescale Timescale to use in the movie (units per second). 1000 GstMJ2Mux::presentation-time gboolean rwx Include presentation-time info Calculate and include presentation/composition time (in addition to decoding time). TRUE GstMJ2Mux::streamable gboolean rwx Streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstMJ2Mux::trak-timescale guint rwx Track timescale Timescale to use for the tracks (units per second, 0 is automatic). 0 GstISMLMux::dts-method GstQTMuxDtsMethods rwx dts-method Method to determine DTS time. reorder GstISMLMux::faststart gboolean rw Format file to faststart If the file should be formatted for faststart (headers first). FALSE GstISMLMux::faststart-file gchar* rwx File to use for storing buffers File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. NULL GstISMLMux::fragment-duration guint rwx Fragment duration Fragment durations in ms (produce a fragmented file if > 0). 2000 GstISMLMux::moov-recovery-file gchar* rwx File to store data for posterior moov atom recovery File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). NULL GstISMLMux::movie-timescale guint >= 1 rwx Movie timescale Timescale to use in the movie (units per second). 1000 GstISMLMux::presentation-time gboolean rwx Include presentation-time info Calculate and include presentation/composition time (in addition to decoding time). TRUE GstISMLMux::streamable gboolean rwx Streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstISMLMux::trak-timescale guint rwx Track timescale Timescale to use for the tracks (units per second, 0 is automatic). 0 GstGPPMux::dts-method GstQTMuxDtsMethods rwx dts-method Method to determine DTS time. reorder GstGPPMux::faststart gboolean rw Format file to faststart If the file should be formatted for faststart (headers first). FALSE GstGPPMux::faststart-file gchar* rwx File to use for storing buffers File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. NULL GstGPPMux::fragment-duration guint rwx Fragment duration Fragment durations in ms (produce a fragmented file if > 0). 0 GstGPPMux::moov-recovery-file gchar* rwx File to store data for posterior moov atom recovery File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). NULL GstGPPMux::movie-timescale guint >= 1 rwx Movie timescale Timescale to use in the movie (units per second). 1000 GstGPPMux::presentation-time gboolean rwx Include presentation-time info Calculate and include presentation/composition time (in addition to decoding time). TRUE GstGPPMux::streamable gboolean rwx Streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE GstGPPMux::trak-timescale guint rwx Track timescale Timescale to use for the tracks (units per second, 0 is automatic). 0 Gst3GPPMux::dts-method GstQTMuxDtsMethods rwx dts-method Method to determine DTS time. reorder Gst3GPPMux::faststart gboolean rw Format file to faststart If the file should be formatted for faststart (headers first). FALSE Gst3GPPMux::faststart-file gchar* rwx File to use for storing buffers File that will be used temporarily to store data from the stream when creating a faststart file. If null a filepath will be created automatically. NULL Gst3GPPMux::fragment-duration guint rwx Fragment duration Fragment durations in ms (produce a fragmented file if > 0). 0 Gst3GPPMux::moov-recovery-file gchar* rwx File to store data for posterior moov atom recovery File to be used to store data for moov atom making movie file recovery possible in case of a crash during muxing. Null for disabled. (Experimental). NULL Gst3GPPMux::movie-timescale guint >= 1 rwx Movie timescale Timescale to use in the movie (units per second). 1000 Gst3GPPMux::presentation-time gboolean rwx Include presentation-time info Calculate and include presentation/composition time (in addition to decoding time). TRUE Gst3GPPMux::streamable gboolean rwx Streamable If set to true, the output should be as if it is to be streamed and hence no indexes written or duration written. FALSE Gst3GPPMux::trak-timescale guint rwx Track timescale Timescale to use for the tracks (units per second, 0 is automatic). 0 GstSplitFileSrc::location gchar* rw File Location Wildcard pattern to match file names of the input files. If the location is an absolute path or contains directory components, only the base file name part will be considered for pattern matching. The results will be sorted. NULL GstMatroskaDemux::max-gap-time guint64 rw Maximum gap time The demuxer sends out newsegment events for skipping gaps longer than this (0 = disabled). 2000000000 GstPulseAudioSink::alignment-threshold guint64 [1,18446744073709551614] rw Alignment Threshold Timestamp alignment threshold in nanoseconds. 40000000 GstPulseAudioSink::async gboolean rw Async Go asynchronously to PAUSED. TRUE GstPulseAudioSink::blocksize guint rw Block size Size in bytes to pull per buffer (0 = default). 4096 GstPulseAudioSink::buffer-time gint64 >= 1 rw Buffer Time Size of audio buffer in microseconds. 200000 GstPulseAudioSink::can-activate-pull gboolean rw Allow Pull Scheduling Allow pull-based scheduling. FALSE GstPulseAudioSink::client gchar* rw Client The PulseAudio client name to use. "lt-gst-plugins-good-plugins-scan" GstPulseAudioSink::device gchar* rw Device The PulseAudio sink device to connect to. NULL GstPulseAudioSink::device-name gchar* r Device name Human-readable name of the sound device. NULL GstPulseAudioSink::discont-wait guint64 <= 18446744073709551614 rw Discont Wait Window of time in nanoseconds to wait before creating a discontinuity. 1000000000 GstPulseAudioSink::drift-tolerance gint64 >= 1 rw Drift Tolerance Tolerance for clock drift in microseconds. 40000 GstPulseAudioSink::enable-last-buffer gboolean rw Enable Last Buffer Enable the last-buffer property. TRUE GstPulseAudioSink::last-buffer GstBuffer* r Last Buffer The last buffer received in the sink. GstPulseAudioSink::latency-time gint64 >= 1 rw Latency Time Audio latency in microseconds. 10000 GstPulseAudioSink::max-lateness gint64 >= G_MAXULONG rw Max Lateness Maximum number of nanoseconds that a buffer can be late before it is dropped (-1 unlimited). -1 GstPulseAudioSink::mute gboolean rw Mute Mute state of this stream. FALSE GstPulseAudioSink::preroll-queue-len guint rwx Preroll queue length Number of buffers to queue during preroll. 0 GstPulseAudioSink::provide-clock gboolean rw Provide Clock Provide a clock to be used as the global pipeline clock. TRUE GstPulseAudioSink::qos gboolean rw Qos Generate Quality-of-Service events upstream. FALSE GstPulseAudioSink::render-delay guint64 rw Render Delay Additional render delay of the sink in nanoseconds. 0 GstPulseAudioSink::server gchar* rw Server The PulseAudio server to connect to. NULL GstPulseAudioSink::slave-method GstBaseAudioSinkSlaveMethod rw Slave Method Algorithm to use to match the rate of the masterclock. GST_BASE_AUDIO_SINK_SLAVE_SKEW GstPulseAudioSink::stream-properties GstStructure* rw stream properties list of pulseaudio stream properties. GstPulseAudioSink::sync gboolean rw Sync Sync on the clock. TRUE GstPulseAudioSink::throttle-time guint64 rw Throttle time The time to keep between rendered buffers (unused). 0 GstPulseAudioSink::ts-offset gint64 rw TS Offset Timestamp offset in nanoseconds. 0 GstPulseAudioSink::volume gdouble [0,10] rw Volume Linear volume of this stream, 1.0=100%. 1 GstSoupHttpClientSink::automatic-redirect gboolean rw automatic-redirect Automatically follow HTTP redirects (HTTP Status Code 3xx). TRUE GstSoupHttpClientSink::cookies GStrv rw Cookies HTTP request cookies. GstSoupHttpClientSink::location gchar* rw Location URI to send to. "" GstSoupHttpClientSink::proxy gchar* rw Proxy HTTP proxy server URI. "" GstSoupHttpClientSink::proxy-id gchar* rw proxy-id user id for proxy authentication. "" GstSoupHttpClientSink::proxy-pw gchar* rw proxy-pw user password for proxy authentication. "" GstSoupHttpClientSink::session SoupSession* rw session SoupSession object to use for communication. GstSoupHttpClientSink::user-agent gchar* rw User-Agent Value of the User-Agent HTTP request header field. "GStreamer souphttpclientsink " GstSoupHttpClientSink::user-id gchar* rw user-id user id for authentication. "" GstSoupHttpClientSink::user-pw gchar* rw user-pw user password for authentication. "" gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins.hierarchy0000644000175000017500000001542711720564144023206 00000000000000GObject GdkPixbuf GstCmmlTagClip GstCmmlTagHead GstCmmlTagStream GstColorBalanceChannel GstMixerTrack GstMixerOptions GstObject GstBus GstClock GstSystemClock GstAudioClock GstElement Gst3GPPMux GstALawDec GstALawEnc GstAsteriskh263 GstAuParse GstAudioDecoder GstSpeexDec GstAudioEncoder GstFlacEnc GstSpeexEnc GstAviDemux GstAviMux GstAviSubtitle GstBaseParse GstAacParse GstAc3Parse GstAmrParse GstDcaParse GstFlacParse GstMpegAudioParse GstBaseRTPDepayload GstRTPBVDepay GstRTPDVDepay GstRTPGSMDepay GstRTPSirenDepay GstRTPiLBCDepay GstRtpAC3Depay GstRtpAMRDepay GstRtpCELTDepay GstRtpG722Depay GstRtpG723Depay GstRtpG726Depay GstRtpG729Depay GstRtpGSTDepay GstRtpH263Depay GstRtpH263PDepay GstRtpH264Depay GstRtpJ2KDepay GstRtpJPEGDepay GstRtpL16Depay GstRtpMP1SDepay GstRtpMP2TDepay GstRtpMP4ADepay GstRtpMP4GDepay GstRtpMP4VDepay GstRtpMPADepay GstRtpMPARobustDepay GstRtpMPVDepay GstRtpPcmaDepay GstRtpPcmuDepay GstRtpQCELPDepay GstRtpQDM2Depay GstRtpSPEEXDepay GstRtpSV3VDepay GstRtpTheoraDepay GstRtpVRawDepay GstRtpVorbisDepay GstRtpXQTDepay GstBaseRTPPayload GstBaseRTPAudioPayload GstRTPBVPay GstRTPILBCPay GstRTPSirenPay GstRtpG722Pay GstRtpG726Pay GstRtpL16Pay GstRtpPcmaPay GstRtpPcmuPay GstRTPDVPay GstRTPG723Pay GstRTPG729Pay GstRTPGSMPay GstRTPMP2TPay GstRTPMPVPay GstRtpAC3Pay GstRtpAMRPay GstRtpCELTPay GstRtpGSTPay GstRtpH263PPay GstRtpH263Pay GstRtpH264Pay GstRtpJ2KPay GstRtpJPEGPay GstRtpMP4APay GstRtpMP4GPay GstRtpMP4VPay GstRtpMPAPay GstRtpSPEEXPay GstRtpTheoraPay GstRtpVRawPay GstRtpVorbisPay GstBaseSink GstAASink GstBaseAudioSink GstAudioSink GstEsdSink GstOss4Sink GstOssSink GstJackAudioSink GstPulseSink GstCACASink GstDynUDPSink GstMultiFileSink GstMultiUDPSink GstUDPSink GstShout2send GstSoupHttpClientSink GstTest GstVideoSink GstGdkPixbufSink GstBaseSrc GstPushSrc GstBaseAudioSrc GstAudioSrc GstOss4Source GstOssSrc GstPulseSrc GstJackAudioSrc GstDV1394Src GstHDV1394Src GstMultiFileSrc GstSoupHTTPSrc GstUDPSrc GstV4l2Src GstXImageSrc GstSplitFileSrc GstBaseTransform GstAudioFilter GstAudioAmplify GstAudioDynamic GstAudioEcho GstAudioFXBaseFIRFilter GstAudioFIRFilter GstAudioWSincBand GstAudioWSincLimit GstAudioFXBaseIIRFilter GstAudioChebBand GstAudioChebLimit GstAudioIIRFilter GstAudioInvert GstAudioKaraoke GstIirEqualizer GstIirEqualizer10Bands GstIirEqualizer3Bands GstIirEqualizerNBands GstSpectrum GstAudioPanorama GstBreakMyData GstCairoTimeOverlay GstCapsSetter GstCpuReport GstLevel GstNavSeek GstPixbufScale GstProgressReport GstRgAnalysis GstRgLimiter GstTagInject GstVideoBox GstVideoCrop GstVideoFilter GstAgingTV GstAlpha GstAlphaColor GstCairoOverlay GstDiceTV GstEdgeTV GstGamma GstNavigationtest GstOpTV GstQuarkTV GstRadioacTV GstRevTV GstRippleTV GstSMPTEAlpha GstShagadelicTV GstStreakTV GstVertigoTV GstVideoBalance GstVideoFlip GstWarpTV GstBin GstAspectRatioCrop GstAutoAudioSink GstAutoAudioSrc GstAutoVideoSink GstAutoVideoSrc GstHalAudioSink GstHalAudioSrc GstPipeline GstQTMoovRecover GstPulseAudioSink GstPushFileSrc GstRTSPSrc GstRgVolume GstRtpBin GstSwitchSink GstGConfAudioSink GstGConfVideoSink GstSwitchSrc GstGConfAudioSrc GstGConfVideoSrc GstCairoRender GstCairoTextOverlay GstCapsDebug GstCmmlDec GstCmmlEnc GstCutter GstDVDec GstDVDemux GstDeinterlace GstDeinterleave GstEFence GstFlacDec GstFlacTag GstFlvDemux GstFlvMux GstFlxDec GstGPPMux GstGdkPixbuf GstGoom GstGoom2k1 GstICYDemux GstISMLMux GstImageFreeze GstInterleave GstJpegDec GstJpegEnc GstMJ2Mux GstMP4Mux GstMatroskaDemux GstMatroskaMux GstWebMMux GstMatroskaParse GstMuLawDec GstMuLawEnc GstMultipartDemux GstMultipartMux GstOss4Mixer GstOssMixerElement GstPngDec GstPngEnc GstPulseMixer GstQTDemux GstQTMux GstRTPDec GstRTPDepay GstRndBufferSize GstRtpJitterBuffer GstRtpPtDemux GstRtpSession GstRtpSsrcDemux GstSMPTE GstShapeWipe GstSmokeDec GstSmokeEnc GstTagDemux GstApeDemux GstID3Demux GstTagLibMux GstApev2Mux GstId3v2Mux GstV4l2Radio GstVideoMixer GstVideoMixer2 GstWavEnc GstWavParse GstWavpackDec GstWavpackEnc GstWavpackParse GstY4mEncode GstPad GstInterleavePad GstVideoMixer2Pad GstVideoMixerPad GstPadTemplate GstPlugin GstPluginFeature GstElementFactory GstIndexFactory GstTypeFindFactory GstRegistry GstRingBuffer GstAudioSinkRingBuffer GstAudioSrcRingBuffer GstJackAudioSinkRingBuffer GstJackAudioSrcRingBuffer GstTask GstTaskPool GstSignalObject GstTunerChannel GstTunerNorm RTPSession SoupSession GInterface GIcon GTypePlugin GstChildProxy GstColorBalance GstImplementsInterface GstMixer GstPreset GstPropertyProbe GstStreamVolume GstTagSetter GstTagXmpWriter GstTuner GstURIHandler GstVideoOrientation gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins.signals0000644000175000017500000002722411677341654022700 00000000000000 GstQTDemux::got-redirect void GstQTDemux *gstqtdemux gchar *arg1 GstGSMEnc::frame-encoded void GstGSMEnc *gstgsmenc GstMultiUDPSink::add void la GstMultiUDPSink *gstmultiudpsink gchar *arg1 gint arg2 GstMultiUDPSink::clear void la GstMultiUDPSink *gstmultiudpsink GstMultiUDPSink::client-added void l GstMultiUDPSink *gstmultiudpsink gchar *arg1 gint arg2 GstMultiUDPSink::client-removed void l GstMultiUDPSink *gstmultiudpsink gchar *arg1 gint arg2 GstMultiUDPSink::get-stats GValueArray* la GstMultiUDPSink *gstmultiudpsink gchar *arg1 gint arg2 GstMultiUDPSink::remove void la GstMultiUDPSink *gstmultiudpsink gchar *arg1 gint arg2 GstDynUDPSink::get-stats GValueArray* l GstDynUDPSink *gstdynudpsink gchar *arg1 gint arg2 GstFdSrc::timeout void GstFdSrc *gstfdsrc GstDiceTV::reset void GstDiceTV *gstdicetv GstVertigoTV::reset-parms void GstVertigoTV *gstvertigotv GstShout2send::connection-problem void c GstShout2send *gstshout2send gint arg1 DV1394Src::frame-dropped void DV1394Src *dv1394src GstJpegEnc::frame-encoded void l GstJpegEnc *gstjpegenc GstAASink::frame-displayed void l GstAASink *gstaasink GstAASink::have-size void l GstAASink *gstaasink guint arg1 guint arg2 GstMultiFdSink::add void GstMultiFdSink *gstmultifdsink gint arg1 GstMultiFdSink::clear void GstMultiFdSink *gstmultifdsink GstMultiFdSink::client-added void GstMultiFdSink *gstmultifdsink gint arg1 GstMultiFdSink::client-removed void GstMultiFdSink *gstmultifdsink gint arg1 GstClientStatus arg2 GstMultiFdSink::get-stats GValueArray* GstMultiFdSink *gstmultifdsink gint arg1 GstMultiFdSink::remove void GstMultiFdSink *gstmultifdsink gint arg1 GstDecodeBin::new-decoded-pad void GstDecodeBin *gstdecodebin GstPad *arg1 gboolean arg2 GstDecodeBin::removed-decoded-pad void GstDecodeBin *gstdecodebin GstPad *arg1 GstDecodeBin::unknown-type void GstDecodeBin *gstdecodebin GstPad *arg1 GstCaps *arg2 GstFakeSrc::handoff void GstFakeSrc *gstfakesrc GstBuffer arg1 GstPad *arg2 GstFakeSink::handoff void GstFakeSink *gstfakesink GstBuffer arg1 GstPad *arg2 GstIdentity::handoff void GstIdentity *gstidentity GstBuffer arg1 GstTypeFindElement::have-type void GstTypeFindElement *gsttypefindelement guint arg1 GstCaps *arg2 GstQueue::overrun void GstQueue *gstqueue GstQueue::running void GstQueue *gstqueue GstQueue::underrun void GstQueue *gstqueue GstBin::element-added void GstBin *gstbin GstElement *arg1 GstBin::element-removed void GstBin *gstbin GstElement *arg1 GstDV1394Src::frame-dropped void l GstDV1394Src *gstdv1394src GstRTPDec::clear-pt-map void l GstRTPDec *gstrtpdec GstRTPDec::request-pt-map GstCaps* l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstRTPDec::on-bye-ssrc void l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstRTPDec::on-bye-timeout void l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstRTPDec::on-new-ssrc void l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstRTPDec::on-ssrc-collision void l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstRTPDec::on-ssrc-validated void l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstRTPDec::on-timeout void l GstRTPDec *gstrtpdec guint arg1 guint arg2 GstAudioFIRFilter::rate-changed void l GstAudioFIRFilter *gstaudiofirfilter gint arg1 GstAudioIIRFilter::rate-changed void l GstAudioIIRFilter *gstaudioiirfilter gint arg1 GstRtpBin::clear-pt-map void la GstRtpBin *gstrtpbin GstRtpBin::get-internal-session RTPSession* la GstRtpBin *gstrtpbin guint arg1 GstRtpBin::on-bye-ssrc void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-bye-timeout void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-new-ssrc void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-npt-stop void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-sender-timeout void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-ssrc-active void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-ssrc-collision void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-ssrc-sdes void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-ssrc-validated void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::on-timeout void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::request-pt-map GstCaps* l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpBin::reset-sync void la GstRtpBin *gstrtpbin GstRtpBin::payload-type-change void l GstRtpBin *gstrtpbin guint arg1 guint arg2 GstRtpJitterBuffer::clear-pt-map void la GstRtpJitterBuffer *gstrtpjitterbuffer GstRtpJitterBuffer::handle-sync void l GstRtpJitterBuffer *gstrtpjitterbuffer GstStructure *arg1 GstRtpJitterBuffer::on-npt-stop void l GstRtpJitterBuffer *gstrtpjitterbuffer GstRtpJitterBuffer::request-pt-map GstCaps* l GstRtpJitterBuffer *gstrtpjitterbuffer guint arg1 GstRtpJitterBuffer::set-active guint64 la GstRtpJitterBuffer *gstrtpjitterbuffer gboolean arg1 guint64 arg2 GstRtpPtDemux::clear-pt-map void la GstRtpPtDemux *gstrtpptdemux GstRtpPtDemux::new-payload-type void l GstRtpPtDemux *gstrtpptdemux guint arg1 GstPad *arg2 GstRtpPtDemux::payload-type-change void l GstRtpPtDemux *gstrtpptdemux guint arg1 GstRtpPtDemux::request-pt-map GstCaps* l GstRtpPtDemux *gstrtpptdemux guint arg1 GstRtpSession::clear-pt-map void a GstRtpSession *gstrtpsession GstRtpSession::on-bye-ssrc void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-bye-timeout void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-new-ssrc void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-sender-timeout void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-ssrc-active void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-ssrc-collision void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-ssrc-sdes void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-ssrc-validated void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::on-timeout void l GstRtpSession *gstrtpsession guint arg1 GstRtpSession::request-pt-map GstCaps* l GstRtpSession *gstrtpsession guint arg1 GstRtpSsrcDemux::clear-ssrc void la GstRtpSsrcDemux *gstrtpssrcdemux guint arg1 GstRtpSsrcDemux::new-ssrc-pad void l GstRtpSsrcDemux *gstrtpssrcdemux guint arg1 GstPad *arg2 GstRtpSsrcDemux::removed-ssrc-pad void l GstRtpSsrcDemux *gstrtpssrcdemux guint arg1 GstPad *arg2 GstCairoOverlay::caps-changed void GstCairoOverlay *gstcairooverlay GstCaps *arg1 GstCairoOverlay::draw void GstCairoOverlay *gstcairooverlay CairoContext *arg1 guint64 arg2 guint64 arg3 gst-plugins-good-0.10.31/docs/plugins/scanobj-build.stamp0000644000175000017500000000000011720564145020165 00000000000000gst-plugins-good-0.10.31/docs/plugins/Makefile.in0000644000175000017500000013323011720560224016456 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # this snippet is to be included by both our docbook manuals # and gtk-doc API references # it adds an upload target to each of these dir's Makefiles # each Makefile.am should define the following variables: # - DOC: the base name of the documentation # (faq, manual, pwg, gstreamer, gstreamer-libs) # - FORMATS: the formats in which DOC is output # (html ps pdf) # if you want to use it, make sure your $HOME/.ssh/config file contains the # correct User entry for the Host entry for the DOC_SERVER # This is an include file specifically tuned for building documentation # for GStreamer plug-ins VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/common/gtk-doc-plugins.mak \ $(top_srcdir)/common/upload-doc.mak subdir = docs/plugins ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj # The name of the module, e.g. 'glib'. #DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@ MODULE = gst-plugins-good DOC_MODULE = $(MODULE)-plugins # for upload-doc.mak DOC = $(MODULE)-plugins FORMATS = html # these variables define the location of the online docs DOC_SERVER = gstreamer.freedesktop.org DOC_BASE = /srv/gstreamer.freedesktop.org/www/data/doc DOC_URL = $(DOC_SERVER):$(DOC_BASE) # The top-level SGML file. Change it if you want. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # The directory containing the source code. # gtk-doc will search all .c & .h files beneath here for inline comments # documenting functions and macros. DOC_SOURCE_DIR = $(top_srcdir)/gst $(top_srcdir)/ext $(top_srcdir)/sys # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS = # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS = --sgml-mode --source-suffixes=c,h,cc # Extra options to supply to gtkdoc-fixref. FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \ --extra-dir=$(GSTPB_PREFIX)/share/gtk-doc/html # Used for dependencies. HFILE_GLOB = \ $(top_srcdir)/gst/*/*.h $(top_srcdir)/ext/*/*.h $(top_srcdir)/sys/*/*.h CFILE_GLOB = \ $(top_srcdir)/gst/*/*.c $(top_srcdir)/ext/*/*.c $(top_srcdir)/sys/*/*.c \ $(top_srcdir)/ext/*/*.cc $(top_srcdir)/sys/*/*.m # Header files to ignore when scanning. IGNORE_HFILES = IGNORE_CFILES = # we add all .h files of elements that have signals/args we want # sadly this also pulls in the private methods - maybe we should # move those around in the source ? # also, we should add some stuff here conditionally based on whether # or not the plugin will actually build # but I'm not sure about that - it might be this Just Works given that # the registry won't have the element EXTRA_HFILES = \ $(top_srcdir)/ext/aalib/gstaasink.h \ $(top_srcdir)/ext/annodex/gstcmmldec.h \ $(top_srcdir)/ext/annodex/gstcmmlenc.h \ $(top_srcdir)/ext/cairo/gsttextoverlay.h \ $(top_srcdir)/ext/cairo/gsttimeoverlay.h \ $(top_srcdir)/ext/cairo/gstcairorender.h \ $(top_srcdir)/ext/cairo/gstcairooverlay.h \ $(top_srcdir)/ext/dv/gstdvdec.h \ $(top_srcdir)/ext/dv/gstdvdemux.h \ $(top_srcdir)/ext/esd/esdsink.h \ $(top_srcdir)/ext/flac/gstflacdec.h \ $(top_srcdir)/ext/flac/gstflacenc.h \ $(top_srcdir)/ext/flac/gstflactag.h \ $(top_srcdir)/ext/gconf/gstgconfaudiosrc.h \ $(top_srcdir)/ext/gconf/gstgconfaudiosink.h \ $(top_srcdir)/ext/gconf/gstgconfvideosrc.h \ $(top_srcdir)/ext/gconf/gstgconfvideosink.h \ $(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 \ $(top_srcdir)/ext/jpeg/gstsmokeenc.h \ $(top_srcdir)/ext/libcaca/gstcacasink.h \ $(top_srcdir)/ext/libpng/gstpngdec.h \ $(top_srcdir)/ext/libpng/gstpngenc.h \ $(top_srcdir)/ext/raw1394/gstdv1394src.h \ $(top_srcdir)/ext/raw1394/gsthdv1394src.h \ $(top_srcdir)/ext/soup/gstsouphttpsrc.h \ $(top_srcdir)/ext/taglib/gstapev2mux.h \ $(top_srcdir)/ext/taglib/gstid3v2mux.h \ $(top_srcdir)/ext/pulse/pulsesink.h \ $(top_srcdir)/ext/pulse/pulsesrc.h \ $(top_srcdir)/ext/pulse/pulsemixer.h \ $(top_srcdir)/ext/speex/gstspeexenc.h \ $(top_srcdir)/ext/speex/gstspeexdec.h \ $(top_srcdir)/ext/wavpack/gstwavpackdec.h \ $(top_srcdir)/ext/wavpack/gstwavpackenc.h \ $(top_srcdir)/ext/wavpack/gstwavpackparse.h \ $(top_srcdir)/gst/alpha/gstalpha.h \ $(top_srcdir)/gst/alpha/gstalphacolor.h \ $(top_srcdir)/gst/apetag/gstapedemux.h \ $(top_srcdir)/gst/audiofx/audioamplify.h \ $(top_srcdir)/gst/audiofx/audioecho.h \ $(top_srcdir)/gst/audiofx/audiodynamic.h \ $(top_srcdir)/gst/audiofx/audioinvert.h \ $(top_srcdir)/gst/audiofx/audiokaraoke.h \ $(top_srcdir)/gst/audiofx/audiopanorama.h \ $(top_srcdir)/gst/audiofx/audiocheblimit.h \ $(top_srcdir)/gst/audiofx/audiochebband.h \ $(top_srcdir)/gst/audiofx/audioiirfilter.h \ $(top_srcdir)/gst/audiofx/audiowsincband.h \ $(top_srcdir)/gst/audiofx/audiowsinclimit.h \ $(top_srcdir)/gst/audiofx/audiofirfilter.h \ $(top_srcdir)/gst/audioparsers/gstaacparse.h \ $(top_srcdir)/gst/audioparsers/gstac3parse.h \ $(top_srcdir)/gst/audioparsers/gstamrparse.h \ $(top_srcdir)/gst/audioparsers/gstflacparse.h \ $(top_srcdir)/gst/audioparsers/gstdcaparse.h \ $(top_srcdir)/gst/audioparsers/gstmpegaudioparse.h \ $(top_srcdir)/gst/auparse/gstauparse.h \ $(top_srcdir)/gst/autodetect/gstautoaudiosink.h \ $(top_srcdir)/gst/autodetect/gstautoaudiosrc.h \ $(top_srcdir)/gst/autodetect/gstautovideosink.h \ $(top_srcdir)/gst/autodetect/gstautovideosrc.h \ $(top_srcdir)/gst/avi/gstavidemux.h \ $(top_srcdir)/gst/avi/gstavimux.h \ $(top_srcdir)/gst/avi/gstavisubtitle.h \ $(top_srcdir)/gst/cutter/gstcutter.h \ $(top_srcdir)/gst/debugutils/gstcapssetter.h \ $(top_srcdir)/gst/debugutils/gsttaginject.h \ $(top_srcdir)/gst/debugutils/progressreport.h \ $(top_srcdir)/gst/deinterlace/gstdeinterlace.h \ $(top_srcdir)/gst/effectv/gstaging.h \ $(top_srcdir)/gst/effectv/gstdice.h \ $(top_srcdir)/gst/effectv/gstedge.h \ $(top_srcdir)/gst/effectv/gstquark.h \ $(top_srcdir)/gst/effectv/gstrev.h \ $(top_srcdir)/gst/effectv/gstshagadelic.h \ $(top_srcdir)/gst/effectv/gstvertigo.h \ $(top_srcdir)/gst/effectv/gstwarp.h \ $(top_srcdir)/gst/effectv/gststreak.h \ $(top_srcdir)/gst/effectv/gstripple.h \ $(top_srcdir)/gst/effectv/gstop.h \ $(top_srcdir)/gst/effectv/gstradioac.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer3bands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer10bands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizernbands.h \ $(top_srcdir)/gst/flv/gstflvdemux.h \ $(top_srcdir)/gst/flv/gstflvmux.h \ $(top_srcdir)/gst/flx/gstflxdec.h \ $(top_srcdir)/gst/goom/gstgoom.h \ $(top_srcdir)/gst/goom2k1/gstgoom.h \ $(top_srcdir)/gst/law/alaw-decode.h \ $(top_srcdir)/gst/law/alaw-encode.h \ $(top_srcdir)/gst/law/mulaw-decode.h \ $(top_srcdir)/gst/law/mulaw-encode.h \ $(top_srcdir)/gst/icydemux/gsticydemux.h \ $(top_srcdir)/gst/id3demux/gstid3demux.h \ $(top_srcdir)/gst/imagefreeze/gstimagefreeze.h \ $(top_srcdir)/gst/interleave/deinterleave.h \ $(top_srcdir)/gst/interleave/interleave.h \ $(top_srcdir)/gst/level/gstlevel.h \ $(top_srcdir)/gst/matroska/matroska-demux.h \ $(top_srcdir)/gst/matroska/matroska-mux.h \ $(top_srcdir)/gst/matroska/webm-mux.h \ $(top_srcdir)/gst/monoscope/gstmonoscope.h \ $(top_srcdir)/gst/multifile/gstmultifilesink.h \ $(top_srcdir)/gst/multifile/gstmultifilesrc.h \ $(top_srcdir)/gst/multifile/gstsplitfilesrc.h \ $(top_srcdir)/gst/multipart/multipartdemux.h \ $(top_srcdir)/gst/multipart/multipartmux.h \ $(top_srcdir)/gst/isomp4/qtdemux.h \ $(top_srcdir)/gst/isomp4/gstqtmux.h \ $(top_srcdir)/gst/isomp4/gstqtmux-doc.h \ $(top_srcdir)/gst/replaygain/gstrganalysis.h \ $(top_srcdir)/gst/replaygain/gstrglimiter.h \ $(top_srcdir)/gst/replaygain/gstrgvolume.h \ $(top_srcdir)/gst/rtp/gstrtpj2kpay.h \ $(top_srcdir)/gst/rtp/gstrtpjpegpay.h \ $(top_srcdir)/gst/rtpmanager/gstrtpbin.h \ $(top_srcdir)/gst/rtpmanager/gstrtpjitterbuffer.h \ $(top_srcdir)/gst/rtpmanager/gstrtpptdemux.h \ $(top_srcdir)/gst/rtpmanager/gstrtpsession.h \ $(top_srcdir)/gst/rtpmanager/gstrtpssrcdemux.h \ $(top_srcdir)/gst/rtsp/gstrtpdec.h \ $(top_srcdir)/gst/rtsp/gstrtspsrc.h \ $(top_srcdir)/gst/shapewipe/gstshapewipe.h \ $(top_srcdir)/gst/smpte/gstsmpte.h \ $(top_srcdir)/gst/smpte/gstsmptealpha.h \ $(top_srcdir)/gst/spectrum/gstspectrum.h \ $(top_srcdir)/gst/udp/gstmultiudpsink.h \ $(top_srcdir)/gst/udp/gstudpsrc.h \ $(top_srcdir)/gst/udp/gstudpsink.h \ $(top_srcdir)/gst/videobox/gstvideobox.h \ $(top_srcdir)/gst/videocrop/gstvideocrop.h \ $(top_srcdir)/gst/videocrop/gstaspectratiocrop.h \ $(top_srcdir)/gst/videofilter/gstgamma.h \ $(top_srcdir)/gst/videofilter/gstvideobalance.h \ $(top_srcdir)/gst/videofilter/gstvideoflip.h \ $(top_srcdir)/gst/videomixer/videomixer.h \ $(top_srcdir)/gst/videomixer/videomixerpad.h \ $(top_srcdir)/gst/videomixer/videomixer2.h \ $(top_srcdir)/gst/videomixer/videomixer2pad.h \ $(top_srcdir)/gst/wavenc/gstwavenc.h \ $(top_srcdir)/gst/wavparse/gstwavparse.h \ $(top_srcdir)/gst/y4m/gsty4mencode.h \ $(top_srcdir)/sys/directsound/gstdirectsoundsink.h \ $(top_srcdir)/sys/oss4/oss4-mixer.h \ $(top_srcdir)/sys/oss4/oss4-sink.h \ $(top_srcdir)/sys/oss4/oss4-source.h \ $(top_srcdir)/sys/oss/gstossmixerelement.h \ $(top_srcdir)/sys/oss/gstosssink.h \ $(top_srcdir)/sys/oss/gstosssrc.h \ $(top_srcdir)/sys/osxaudio/gstosxaudiosrc.h \ $(top_srcdir)/sys/osxaudio/gstosxaudiosink.h \ $(top_srcdir)/sys/osxvideo/osxvideosink.h \ $(top_srcdir)/sys/v4l2/gstv4l2src.h \ $(top_srcdir)/sys/v4l2/gstv4l2sink.h \ $(top_srcdir)/sys/v4l2/gstv4l2radio.h \ $(top_srcdir)/sys/waveform/gstwaveformsink.h \ $(top_srcdir)/sys/ximage/gstximagesrc.h # example code that needs to be converted to xml and placed in xml/ EXAMPLE_CFILES = \ $(top_srcdir)/tests/examples/level/level-example.c \ $(top_srcdir)/tests/examples/spectrum/spectrum-example.c \ $(top_srcdir)/tests/examples/audiofx/firfilter-example.c \ $(top_srcdir)/tests/examples/audiofx/iirfilter-example.c # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). content_files = # Other files to distribute. extra_files = # CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib # contains GtkObjects/GObjects and you want to document signals and properties. GTKDOC_CFLAGS = $(GST_BASE_CFLAGS) -I$(top_builddir) GTKDOC_LIBS = $(GST_BASE_LIBS) GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) # If you need to override some of the declarations, place them in this file # and uncomment this line. #DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt DOC_OVERRIDES = # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) # thomas: make docs parallel installable TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ MAINTAINER_DOC_STAMPS = \ scanobj-build.stamp EXTRA_DIST = \ $(MAINTAINER_DOC_STAMPS) \ $(srcdir)/inspect/*.xml \ $(SCANOBJ_FILES) \ $(content_files) \ $(extra_files) \ $(HTML_IMAGES) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_OVERRIDES) \ $(DOC_MODULE)-sections.txt # we don't add scanobj-build.stamp here since they are built manually by docs # maintainers and result is commited to git DOC_STAMPS = \ scan-build.stamp \ tmpl-build.stamp \ sgml-build.stamp \ html-build.stamp \ scan.stamp \ tmpl.stamp \ sgml.stamp \ html.stamp # files generated/updated by gtkdoc-scangobj SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals \ $(DOC_MODULE).types SCANOBJ_FILES_O = \ .libs/$(DOC_MODULE)-scan.o # files generated/updated by gtkdoc-scan SCAN_FILES = \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt \ $(DOC_MODULE)-decl.txt \ $(DOC_MODULE)-decl-list.txt REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = \ $(SCANOBJ_FILES_O) \ $(REPORT_FILES) \ $(DOC_STAMPS) \ inspect-registry.xml INSPECT_DIR = inspect ### inspect GStreamer plug-ins; done by documentation maintainer ### # only look at the plugins in this module when building inspect .xml stuff @ENABLE_GTK_DOC_TRUE@INSPECT_REGISTRY = $(top_builddir)/docs/plugins/inspect-registry.xml @ENABLE_GTK_DOC_TRUE@INSPECT_ENVIRONMENT = \ @ENABLE_GTK_DOC_TRUE@ LC_ALL=C \ @ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_SYSTEM_PATH= \ @ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \ @ENABLE_GTK_DOC_TRUE@ GST_REGISTRY=$(INSPECT_REGISTRY) \ @ENABLE_GTK_DOC_TRUE@ PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ @ENABLE_GTK_DOC_TRUE@ $(INSPECT_EXTRA_ENVIRONMENT) MAINTAINERCLEANFILES = $(MAINTAINER_DOC_STAMPS) # wildcard is apparently not portable to other makes, hence the use of find inspect_files = $(shell find $(srcdir)/$(INSPECT_DIR) -name '*.xml') all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/upload-doc.mak $(top_srcdir)/common/gtk-doc-plugins.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/plugins/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/upload-doc.mak $(top_srcdir)/common/gtk-doc-plugins.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool clean-local dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-local html: html-build.stamp upload: $(FORMATS) @if echo $(FORMATS) | grep html > /dev/null; then \ echo "Preparing docs for upload (rebasing cross-references) ..." ; \ if test x$(builddir) != x$(srcdir); then \ echo "make upload can only be used if srcdir == builddir"; \ exit 1; \ fi; \ # gtkdoc-rebase sometimes gets confused, so reset everything to \ # local links before rebasing to online links \ gtkdoc-rebase --html-dir=$(builddir)/html 2>/dev/null 2>/dev/null ; \ rebase=`gtkdoc-rebase --verbose --online --html-dir=$(builddir)/html` ; \ echo "$$rebase" | grep -e "On-*line"; \ for req in glib gobject gstreamer gstreamer-libs gst-plugins-base-libs; do \ if ! ( echo "$$rebase" | grep -i -e "On-*line.*/$$req/" ); then \ echo "===============================================================================" ; \ echo " Could not determine online location for $$req docs. Cross-referencing will be " ; \ echo " broken, so not uploading. Make sure the library's gtk-doc documentation is " ; \ echo " installed somewhere in /usr/share/gtk-doc. " ; \ echo "===============================================================================" ; \ exit 1; \ fi; \ done; \ export SRC="$$SRC html"; \ fi; \ if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \ if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \ \ # upload releases to both 0.10.X/ and head/ subdirectories \ if test "x$(PACKAGE_VERSION_NANO)" = x0; then \ export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) mkdir -p $$DIR; \ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ fi; \ \ export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) mkdir -p $$DIR; \ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ \ if echo $(FORMATS) | grep html > /dev/null; then \ echo "Un-preparing docs for upload (rebasing cross-references) ..." ; \ gtkdoc-rebase --html-dir=$(builddir)/html ; \ fi; \ echo Done help: @echo @echo "If you are a doc maintainer, run 'make update' to update" @echo "the documentation files maintained in git" @echo @echo Other useful make targets: @echo @echo check-inspected-versions: make sure the inspected plugin info @echo is up to date before a release @echo # update the stuff maintained by doc maintainers update: $(MAKE) scanobj-update $(MAKE) check-outdated-docs @ENABLE_GTK_DOC_TRUE@all-local: html-build.stamp #### scan gobjects; done by documentation maintainer #### @ENABLE_GTK_DOC_TRUE@scanobj-update: @ENABLE_GTK_DOC_TRUE@ -rm scanobj-build.stamp @ENABLE_GTK_DOC_TRUE@ $(MAKE) scanobj-build.stamp # gstdoc-scanobj produces 5 output files (.new) # scangobj-merge.py merges them into the file which we commit later # TODO: also merge the hierarchy @ENABLE_GTK_DOC_TRUE@scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles) @ENABLE_GTK_DOC_TRUE@ @echo " DOC Introspecting gobjects" @ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ @ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ @ENABLE_GTK_DOC_TRUE@ do \ @ENABLE_GTK_DOC_TRUE@ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ @ENABLE_GTK_DOC_TRUE@ done; \ @ENABLE_GTK_DOC_TRUE@ fi; \ @ENABLE_GTK_DOC_TRUE@ mkdir -p $(INSPECT_DIR); \ @ENABLE_GTK_DOC_TRUE@ scanobj_options=""; \ @ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ @ENABLE_GTK_DOC_TRUE@ scanobj_options="--verbose"; \ @ENABLE_GTK_DOC_TRUE@ fi; \ @ENABLE_GTK_DOC_TRUE@ $(INSPECT_ENVIRONMENT) \ @ENABLE_GTK_DOC_TRUE@ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ @ENABLE_GTK_DOC_TRUE@ CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS) $(WARNING_CFLAGS)" \ @ENABLE_GTK_DOC_TRUE@ LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ @ENABLE_GTK_DOC_TRUE@ $(GST_DOC_SCANOBJ) $$scanobj_options --type-init-func="gst_init(NULL,NULL)" \ @ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) --source=$(PACKAGE) --inspect-dir=$(INSPECT_DIR) && \ @ENABLE_GTK_DOC_TRUE@ echo " DOC Merging introspection data" && \ @ENABLE_GTK_DOC_TRUE@ $(PYTHON) \ @ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE); \ @ENABLE_GTK_DOC_TRUE@ if test x"$(srcdir)" != x. ; then \ @ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES); \ @ENABLE_GTK_DOC_TRUE@ do \ @ENABLE_GTK_DOC_TRUE@ cmp -s ./$$f $(srcdir)/$$f || cp ./$$f $(srcdir)/ ; \ @ENABLE_GTK_DOC_TRUE@ done; \ @ENABLE_GTK_DOC_TRUE@ fi; \ @ENABLE_GTK_DOC_TRUE@ touch scanobj-build.stamp @ENABLE_GTK_DOC_TRUE@$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(SCANOBJ_FILES_O): scan-build.stamp @ENABLE_GTK_DOC_TRUE@ @true ### scan headers; done on every build ### @ENABLE_GTK_DOC_TRUE@scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp @ENABLE_GTK_DOC_TRUE@ @echo ' DOC Scanning header files' @ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ @ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ @ENABLE_GTK_DOC_TRUE@ do \ @ENABLE_GTK_DOC_TRUE@ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ @ENABLE_GTK_DOC_TRUE@ done; \ @ENABLE_GTK_DOC_TRUE@ fi @ENABLE_GTK_DOC_TRUE@ @_source_dir='' ; \ @ENABLE_GTK_DOC_TRUE@ for i in $(DOC_SOURCE_DIR) ; do \ @ENABLE_GTK_DOC_TRUE@ _source_dir="$${_source_dir} --source-dir=$$i" ; \ @ENABLE_GTK_DOC_TRUE@ done ; \ @ENABLE_GTK_DOC_TRUE@ gtkdoc-scan \ @ENABLE_GTK_DOC_TRUE@ $(SCAN_OPTIONS) $(EXTRA_HFILES) \ @ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) \ @ENABLE_GTK_DOC_TRUE@ $${_source_dir} \ @ENABLE_GTK_DOC_TRUE@ --ignore-headers="$(IGNORE_HFILES)"; \ @ENABLE_GTK_DOC_TRUE@ touch scan-build.stamp #### update templates; done on every build #### # in a non-srcdir build, we need to copy files from the previous step # and the files from previous runs of this step @ENABLE_GTK_DOC_TRUE@tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES) @ENABLE_GTK_DOC_TRUE@ @echo ' DOC Rebuilding template files' @ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ @ENABLE_GTK_DOC_TRUE@ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ @ENABLE_GTK_DOC_TRUE@ do \ @ENABLE_GTK_DOC_TRUE@ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ @ENABLE_GTK_DOC_TRUE@ done; \ @ENABLE_GTK_DOC_TRUE@ fi @ENABLE_GTK_DOC_TRUE@ @gtkdoc-mktmpl --module=$(DOC_MODULE) @ENABLE_GTK_DOC_TRUE@ @$(PYTHON) \ @ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/mangle-tmpl.py $(srcdir)/$(INSPECT_DIR) tmpl @ENABLE_GTK_DOC_TRUE@ @touch tmpl-build.stamp @ENABLE_GTK_DOC_TRUE@tmpl.stamp: tmpl-build.stamp @ENABLE_GTK_DOC_TRUE@ @true #### xml #### @ENABLE_GTK_DOC_TRUE@sgml-build.stamp: tmpl.stamp scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl $(expand_content_files) @ENABLE_GTK_DOC_TRUE@ @echo ' DOC Building XML' @ENABLE_GTK_DOC_TRUE@ @-mkdir -p xml @ENABLE_GTK_DOC_TRUE@ @for a in $(srcdir)/$(INSPECT_DIR)/*.xml; do \ @ENABLE_GTK_DOC_TRUE@ xsltproc --stringparam module $(MODULE) \ @ENABLE_GTK_DOC_TRUE@ $(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done @ENABLE_GTK_DOC_TRUE@ @for f in $(EXAMPLE_CFILES); do \ @ENABLE_GTK_DOC_TRUE@ $(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done @ENABLE_GTK_DOC_TRUE@ @gtkdoc-mkdb \ @ENABLE_GTK_DOC_TRUE@ --module=$(DOC_MODULE) \ @ENABLE_GTK_DOC_TRUE@ --source-dir=$(DOC_SOURCE_DIR) \ @ENABLE_GTK_DOC_TRUE@ --expand-content-files="$(expand_content_files)" \ @ENABLE_GTK_DOC_TRUE@ --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ --output-format=xml \ @ENABLE_GTK_DOC_TRUE@ --ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \ @ENABLE_GTK_DOC_TRUE@ $(MKDB_OPTIONS) @ENABLE_GTK_DOC_TRUE@ @cp ../version.entities xml @ENABLE_GTK_DOC_TRUE@ @touch sgml-build.stamp @ENABLE_GTK_DOC_TRUE@sgml.stamp: sgml-build.stamp @ENABLE_GTK_DOC_TRUE@ @true #### html #### @ENABLE_GTK_DOC_TRUE@html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @ENABLE_GTK_DOC_TRUE@ @echo ' DOC Building HTML' @ENABLE_GTK_DOC_TRUE@ @rm -rf html @ENABLE_GTK_DOC_TRUE@ @mkdir html @ENABLE_GTK_DOC_TRUE@ @cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html @ENABLE_GTK_DOC_TRUE@ @for f in $(content_files); do cp $(srcdir)/$$f html; done @ENABLE_GTK_DOC_TRUE@ @cp -pr xml html @ENABLE_GTK_DOC_TRUE@ @cp ../version.entities html @ENABLE_GTK_DOC_TRUE@ @mkhtml_options=""; \ @ENABLE_GTK_DOC_TRUE@ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ @ENABLE_GTK_DOC_TRUE@ if test "$(?)" = "0"; then \ @ENABLE_GTK_DOC_TRUE@ if test "x$(V)" = "x1"; then \ @ENABLE_GTK_DOC_TRUE@ mkhtml_options="$$mkhtml_options --verbose"; \ @ENABLE_GTK_DOC_TRUE@ fi; \ @ENABLE_GTK_DOC_TRUE@ fi; \ @ENABLE_GTK_DOC_TRUE@ cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) @ENABLE_GTK_DOC_TRUE@ @mv html/index.sgml html/index.sgml.bak @ENABLE_GTK_DOC_TRUE@ @$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml @ENABLE_GTK_DOC_TRUE@ @rm -f html/index.sgml.bak @ENABLE_GTK_DOC_TRUE@ @rm -f html/$(DOC_MAIN_SGML_FILE) @ENABLE_GTK_DOC_TRUE@ @rm -rf html/xml @ENABLE_GTK_DOC_TRUE@ @rm -f html/version.entities @ENABLE_GTK_DOC_TRUE@ @test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \ @ENABLE_GTK_DOC_TRUE@ if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done @ENABLE_GTK_DOC_TRUE@ @echo ' DOC Fixing cross-references' @ENABLE_GTK_DOC_TRUE@ @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @ENABLE_GTK_DOC_TRUE@ @touch html-build.stamp @ENABLE_GTK_DOC_TRUE@clean-local-gtkdoc: @ENABLE_GTK_DOC_TRUE@ @rm -rf xml tmpl html # clean files copied for nonsrcdir templates build @ENABLE_GTK_DOC_TRUE@ @if test x"$(srcdir)" != x. ; then \ @ENABLE_GTK_DOC_TRUE@ rm -rf $(SCANOBJ_FILES) $(SCAN_FILES) $(REPORT_FILES) \ @ENABLE_GTK_DOC_TRUE@ $(MAINTAINER_DOC_STAMPS); \ @ENABLE_GTK_DOC_TRUE@ fi @ENABLE_GTK_DOC_FALSE@all-local: @ENABLE_GTK_DOC_FALSE@clean-local-gtkdoc: clean-local: clean-local-gtkdoc @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -f $(REPORT_FILES) \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @rm -rf tmpl/*.sgml.bak @rm -f $(DOC_MODULE).hierarchy @rm -f *.stamp || true @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(DOC_MODULE)-docs.sgml ; \ rm -f $(DOC_MODULE).types ; \ rm -f $(DOC_MODULE).interfaces ; \ rm -f $(DOC_MODULE)-overrides.txt ; \ rm -f $(DOC_MODULE).prerequisites ; \ rm -f $(DOC_MODULE)-sections.txt ; \ rm -rf tmpl/*.sgml ; \ rm -rf $(INSPECT_DIR); \ fi @rm -rf *.o # thomas: make docs parallel installable; devhelp requires majorminor too install-data-local: (installfiles=`echo $(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css`; \ if test "$$installfiles" = '$(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css'; \ then echo '-- Nothing to install' ; \ else \ $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ for i in $$installfiles; do \ echo '-- Installing '$$i ; \ $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ done; \ pngfiles=`echo ./html/*.png`; \ if test "$$pngfiles" != './html/*.png'; then \ for i in $$pngfiles; do \ echo '-- Installing '$$i ; \ $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ done; \ fi; \ echo '-- Installing $(builddir)/html/$(DOC_MODULE).devhelp2' ; \ if test -e $(builddir)/html/$(DOC_MODULE).devhelp2; then \ $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \ $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ fi; \ (which gtkdoc-rebase >/dev/null && \ gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \ fi) uninstall-local: if test -d $(DESTDIR)$(TARGET_DIR); then \ rm -rf $(DESTDIR)$(TARGET_DIR)/*; \ rmdir -p $(DESTDIR)$(TARGET_DIR) 2>/dev/null || true; \ else \ echo '-- Nothing to uninstall' ; \ fi; # # Checks # @ENABLE_GTK_DOC_TRUE@check-hierarchy: $(DOC_MODULE).hierarchy @ENABLE_GTK_DOC_TRUE@ @if grep ' ' $(DOC_MODULE).hierarchy; then \ @ENABLE_GTK_DOC_TRUE@ echo "$(DOC_MODULE).hierarchy contains tabs, please fix"; \ @ENABLE_GTK_DOC_TRUE@ /bin/false; \ @ENABLE_GTK_DOC_TRUE@ fi @ENABLE_GTK_DOC_TRUE@check: check-hierarchy check-inspected-versions: @echo Checking plugin versions of inspected plugin data ...; \ fail=0 ; \ for each in $(inspect_files) ; do \ if (grep -H '' $$each | grep -v '$(VERSION)'); then \ echo $$each should be fixed to say version $(VERSION) or be removed ; \ echo "sed -i -e 's//$(VERSION)<\/version>/'" $$each; \ echo ; \ fail=1; \ fi ; \ done ; \ exit $$fail check-outdated-docs: $(AM_V_GEN)echo Checking for outdated plugin inspect data ...; \ fail=0 ; \ if [ -d $(top_srcdir)/.git/ ]; then \ files=`find $(srcdir)/inspect/ -name '*xml'`; \ for f in $$files; do \ ver=`grep '$(PACKAGE_VERSION)' $$f`; \ if test "x$$ver" = "x"; then \ plugin=`echo $$f | sed -e 's/^.*plugin-//' -e 's/.xml//'`; \ # echo "Checking $$plugin $$f"; \ pushd "$(top_srcdir)" >/dev/null; \ pinit=`git grep -A3 GST_PLUGIN_DEFINE -- ext/ gst/ sys/ | grep "\"$$plugin\""`; \ popd >/dev/null; \ # echo "[$$pinit]"; \ if test "x$$pinit" = "x"; then \ printf " **** outdated docs for plugin %-15s: %s\n" $$plugin $$f; \ fail=1; \ fi; \ fi; \ done; \ fi ; \ exit $$fail # # Require gtk-doc when making dist # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false # FIXME: decide whether we want to dist generated html or not # also this only works, if the project has been build before # we could dist html only if its there, but that might lead to missing html in # tarballs dist-hook: dist-check-gtkdoc dist-hook-local mkdir $(distdir)/html cp html/* $(distdir)/html -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ cd $(distdir) && rm -f $(DISTCLEANFILES) -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs check-outdated-docs inspect # avoid spurious build errors when distchecking with -jN .NOTPARALLEL: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/docs/plugins/gst-plugins-good-plugins.types0000644000175000017500000000013011720565335022360 00000000000000#include type:GstIirEqualizer type:GstVideoMixerPad type:GstVideoMixer2Pad gst-plugins-good-0.10.31/docs/Makefile.in0000644000175000017500000006176711720560224015014 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/version.entities.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.entities CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @ENABLE_PLUGIN_DOCS_FALSE@PLUGIN_DOCS_DIRS = @ENABLE_PLUGIN_DOCS_TRUE@PLUGIN_DOCS_DIRS = plugins SUBDIRS = $(PLUGIN_DOCS_DIRS) DIST_SUBDIRS = plugins EXTRA_DIST = \ random/ChangeLog-0.8 \ version.entities.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): version.entities: $(top_builddir)/config.status $(srcdir)/version.entities.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am upload: @if test "x$(SUBDIRS)" != x; then for a in $(SUBDIRS); do cd $$a; make upload; cd ..; done; fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/0000755000175000017500000000000011720565321012661 500000000000000gst-plugins-good-0.10.31/ext/shout2/0000755000175000017500000000000011720565322014106 500000000000000gst-plugins-good-0.10.31/ext/shout2/gstshout2.h0000644000175000017500000000506411671175352016153 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SHOUT2SEND_H__ #define __GST_SHOUT2SEND_H__ #include #include #include G_BEGIN_DECLS /* Protocol type enum */ typedef enum { SHOUT2SEND_PROTOCOL_XAUDIOCAST = 1, SHOUT2SEND_PROTOCOL_ICY, SHOUT2SEND_PROTOCOL_HTTP } GstShout2SendProtocol; /* Definition of structure storing data for this element. */ typedef struct _GstShout2send GstShout2send; struct _GstShout2send { GstBaseSink parent; GstShout2SendProtocol protocol; GstPoll *timer; shout_t *conn; gchar *ip; guint port; gchar *password; gchar *username; gchar *streamname; gchar *description; gchar *genre; gchar *mount; gchar *url; gboolean connected; gboolean ispublic; gchar *songmetadata; gchar *songartist; gchar *songtitle; guint16 audio_format; GstTagList* tags; }; /* Standard definition defining a class for this element. */ typedef struct _GstShout2sendClass GstShout2sendClass; struct _GstShout2sendClass { GstBaseSinkClass parent_class; /* signal callbacks */ void (*connection_problem) (GstElement *element,guint errno); }; /* Standard macros for defining types for this element. */ #define GST_TYPE_SHOUT2SEND \ (gst_shout2send_get_type()) #define GST_SHOUT2SEND(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SHOUT2SEND,GstShout2send)) #define GST_SHOUT2SEND_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SHOUT2SEND,GstShout2sendClass)) #define GST_IS_SHOUT2SEND(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SHOUT2SEND)) #define GST_IS_SHOUT2SEND_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHOUT2SEND)) /* Standard function returning type information. */ GType gst_shout2send_get_type(void); G_END_DECLS #endif /* __GST_SHOUT2SEND_H__ */ gst-plugins-good-0.10.31/ext/shout2/Makefile.am0000644000175000017500000000053711671175352016074 00000000000000plugin_LTLIBRARIES = libgstshout2.la libgstshout2_la_SOURCES = gstshout2.c libgstshout2_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SHOUT2_CFLAGS) libgstshout2_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(SHOUT2_LIBS) libgstshout2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstshout2_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstshout2.h gst-plugins-good-0.10.31/ext/shout2/gstshout2.c0000644000175000017500000006467311717042034016150 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Tim-Philipp Müller * Copyright (C) <2012> Ralph Giles * * 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 "gstshout2.h" #include #include #include "gst/gst-i18n-plugin.h" GST_DEBUG_CATEGORY_STATIC (shout2_debug); #define GST_CAT_DEFAULT shout2_debug enum { SIGNAL_CONNECTION_PROBLEM, /* 0.11 FIXME: remove this */ LAST_SIGNAL }; enum { ARG_0, ARG_IP, /* the ip of the server */ ARG_PORT, /* the encoder port number on the server */ ARG_PASSWORD, /* the encoder password on the server */ ARG_USERNAME, /* the encoder username on the server */ ARG_PUBLIC, /* is this stream public? */ ARG_STREAMNAME, /* Name of the stream */ ARG_DESCRIPTION, /* Description of the stream */ ARG_GENRE, /* Genre of the stream */ ARG_PROTOCOL, /* Protocol to connect with */ ARG_MOUNT, /* mountpoint of stream (icecast only) */ ARG_URL /* Url of stream (I'm guessing) */ }; #define DEFAULT_IP "127.0.0.1" #define DEFAULT_PORT 8000 #define DEFAULT_PASSWORD "hackme" #define DEFAULT_USERNAME "source" #define DEFAULT_PUBLIC FALSE #define DEFAULT_STREAMNAME "" #define DEFAULT_DESCRIPTION "" #define DEFAULT_GENRE "" #define DEFAULT_MOUNT "" #define DEFAULT_URL "" #define DEFAULT_PROTOCOL SHOUT2SEND_PROTOCOL_HTTP static GstElementClass *parent_class = NULL; #ifdef SHOUT_FORMAT_WEBM #define WEBM_CAPS "; video/webm" #else #define WEBM_CAPS "" #endif static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/ogg; " "audio/mpeg, mpegversion = (int) 1, layer = (int) [ 1, 3 ]" WEBM_CAPS)); static void gst_shout2send_class_init (GstShout2sendClass * klass); static void gst_shout2send_base_init (GstShout2sendClass * klass); static void gst_shout2send_init (GstShout2send * shout2send); static void gst_shout2send_finalize (GstShout2send * shout2send); static gboolean gst_shout2send_event (GstBaseSink * sink, GstEvent * event); static gboolean gst_shout2send_unlock (GstBaseSink * basesink); static gboolean gst_shout2send_unlock_stop (GstBaseSink * basesink); static GstFlowReturn gst_shout2send_render (GstBaseSink * sink, GstBuffer * buffer); static gboolean gst_shout2send_start (GstBaseSink * basesink); static gboolean gst_shout2send_stop (GstBaseSink * basesink); static void gst_shout2send_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_shout2send_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_shout2send_setcaps (GstPad * pad, GstCaps * caps); static guint gst_shout2send_signals[LAST_SIGNAL] = { 0 }; #define GST_TYPE_SHOUT_PROTOCOL (gst_shout2send_protocol_get_type()) static GType gst_shout2send_protocol_get_type (void) { static GType shout2send_protocol_type = 0; static const GEnumValue shout2send_protocol[] = { {SHOUT2SEND_PROTOCOL_XAUDIOCAST, "Xaudiocast Protocol (icecast 1.3.x)", "xaudiocast"}, {SHOUT2SEND_PROTOCOL_ICY, "Icy Protocol (ShoutCast)", "icy"}, {SHOUT2SEND_PROTOCOL_HTTP, "Http Protocol (icecast 2.x)", "http"}, {0, NULL, NULL}, }; if (!shout2send_protocol_type) { shout2send_protocol_type = g_enum_register_static ("GstShout2SendProtocol", shout2send_protocol); } return shout2send_protocol_type; } GType gst_shout2send_get_type (void) { static GType shout2send_type = 0; if (!shout2send_type) { static const GTypeInfo shout2send_info = { sizeof (GstShout2sendClass), (GBaseInitFunc) gst_shout2send_base_init, NULL, (GClassInitFunc) gst_shout2send_class_init, NULL, NULL, sizeof (GstShout2send), 0, (GInstanceInitFunc) gst_shout2send_init, }; static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; shout2send_type = g_type_register_static (GST_TYPE_BASE_SINK, "GstShout2send", &shout2send_info, 0); g_type_add_interface_static (shout2send_type, GST_TYPE_TAG_SETTER, &tag_setter_info); } return shout2send_type; } static void gst_shout2send_base_init (GstShout2sendClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "Icecast network sink", "Sink/Network", "Sends data to an icecast server", "Wim Taymans , " "Pedro Corte-Real , " "Zaheer Abbas Merali "); GST_DEBUG_CATEGORY_INIT (shout2_debug, "shout2", 0, "shout2send element"); } static void gst_shout2send_class_init (GstShout2sendClass * klass) { GObjectClass *gobject_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_shout2send_set_property; gobject_class->get_property = gst_shout2send_get_property; gobject_class->finalize = (GObjectFinalizeFunc) gst_shout2send_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_IP, g_param_spec_string ("ip", "ip", "ip", DEFAULT_IP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PORT, g_param_spec_int ("port", "port", "port", 1, G_MAXUSHORT, DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PASSWORD, g_param_spec_string ("password", "password", "password", DEFAULT_PASSWORD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_USERNAME, g_param_spec_string ("username", "username", "username", DEFAULT_USERNAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* metadata */ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PUBLIC, g_param_spec_boolean ("public", "public", "If the stream should be listed on the server's stream directory", DEFAULT_PUBLIC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STREAMNAME, g_param_spec_string ("streamname", "streamname", "name of the stream", DEFAULT_STREAMNAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DESCRIPTION, g_param_spec_string ("description", "description", "description", DEFAULT_DESCRIPTION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GENRE, g_param_spec_string ("genre", "genre", "genre", DEFAULT_GENRE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PROTOCOL, g_param_spec_enum ("protocol", "protocol", "Connection Protocol to use", GST_TYPE_SHOUT_PROTOCOL, DEFAULT_PROTOCOL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* icecast only */ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MOUNT, g_param_spec_string ("mount", "mount", "mount", DEFAULT_MOUNT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_URL, g_param_spec_string ("url", "url", "url", DEFAULT_URL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* signals */ gst_shout2send_signals[SIGNAL_CONNECTION_PROBLEM] = g_signal_new ("connection-problem", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_CLEANUP, G_STRUCT_OFFSET (GstShout2sendClass, connection_problem), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_shout2send_start); gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_shout2send_stop); gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_shout2send_unlock); gstbasesink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_shout2send_unlock_stop); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_shout2send_render); gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_shout2send_event); } static void gst_shout2send_init (GstShout2send * shout2send) { gst_base_sink_set_sync (GST_BASE_SINK (shout2send), FALSE); gst_pad_set_setcaps_function (GST_BASE_SINK_PAD (shout2send), GST_DEBUG_FUNCPTR (gst_shout2send_setcaps)); shout2send->timer = gst_poll_new_timer (); shout2send->ip = g_strdup (DEFAULT_IP); shout2send->port = DEFAULT_PORT; shout2send->password = g_strdup (DEFAULT_PASSWORD); shout2send->username = g_strdup (DEFAULT_USERNAME); shout2send->streamname = g_strdup (DEFAULT_STREAMNAME); shout2send->description = g_strdup (DEFAULT_DESCRIPTION); shout2send->genre = g_strdup (DEFAULT_GENRE); shout2send->mount = g_strdup (DEFAULT_MOUNT); shout2send->url = g_strdup (DEFAULT_URL); shout2send->protocol = DEFAULT_PROTOCOL; shout2send->ispublic = DEFAULT_PUBLIC; shout2send->tags = gst_tag_list_new (); shout2send->conn = NULL; shout2send->audio_format = SHOUT_FORMAT_VORBIS; shout2send->connected = FALSE; shout2send->songmetadata = NULL; shout2send->songartist = NULL; shout2send->songtitle = NULL; } static void gst_shout2send_finalize (GstShout2send * shout2send) { g_free (shout2send->ip); g_free (shout2send->password); g_free (shout2send->username); g_free (shout2send->streamname); g_free (shout2send->description); g_free (shout2send->genre); g_free (shout2send->mount); g_free (shout2send->url); gst_tag_list_free (shout2send->tags); gst_poll_free (shout2send->timer); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (shout2send)); } static void set_shout_metadata (const GstTagList * list, const gchar * tag, gpointer user_data) { GstShout2send *shout2send = (GstShout2send *) user_data; char **shout_metadata = &(shout2send->songmetadata); char **song_artist = &(shout2send->songartist); char **song_title = &(shout2send->songtitle); gchar *value; GST_DEBUG ("tag: %s being added", tag); if (strcmp (tag, GST_TAG_ARTIST) == 0) { if (gst_tag_get_type (tag) == G_TYPE_STRING) { if (!gst_tag_list_get_string (list, tag, &value)) { GST_DEBUG ("Error reading \"%s\" tag value", tag); return; } if (*song_artist != NULL) g_free (*song_artist); *song_artist = g_strdup (value); } } else if (strcmp (tag, GST_TAG_TITLE) == 0) { if (gst_tag_get_type (tag) == G_TYPE_STRING) { if (!gst_tag_list_get_string (list, tag, &value)) { GST_DEBUG ("Error reading \"%s\" tag value", tag); return; } if (*song_title != NULL) g_free (*song_title); *song_title = g_strdup (value); } } if (*shout_metadata != NULL) g_free (*shout_metadata); if (*song_title && *song_artist) { *shout_metadata = g_strdup_printf ("%s - %s", *song_artist, *song_title); } else if (*song_title && *song_artist == NULL) { *shout_metadata = g_strdup_printf ("Unknown - %s", *song_title); } else if (*song_title == NULL && *song_artist) { *shout_metadata = g_strdup_printf ("%s - Unknown", *song_artist); } else { *shout_metadata = g_strdup_printf ("Unknown - Unknown"); } GST_LOG ("shout metadata is now: %s", *shout_metadata); } #if 0 static void gst_shout2send_set_metadata (GstShout2send * shout2send) { const GstTagList *user_tags; GstTagList *copy; char *tempmetadata; shout_metadata_t *pmetadata; g_return_if_fail (shout2send != NULL); user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (shout2send)); if ((shout2send->tags == NULL) && (user_tags == NULL)) { return; } copy = gst_tag_list_merge (user_tags, shout2send->tags, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (shout2send))); /* lets get the artist and song tags */ tempmetadata = NULL; gst_tag_list_foreach ((GstTagList *) copy, set_shout_metadata, (gpointer) & tempmetadata); if (tempmetadata) { pmetadata = shout_metadata_new (); shout_metadata_add (pmetadata, "song", tempmetadata); shout_set_metadata (shout2send->conn, pmetadata); shout_metadata_free (pmetadata); } gst_tag_list_free (copy); } #endif static gboolean gst_shout2send_event (GstBaseSink * sink, GstEvent * event) { GstShout2send *shout2send; gboolean ret = TRUE; shout2send = GST_SHOUT2SEND (sink); GST_LOG_OBJECT (shout2send, "got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ /* vorbis audio doesnt need metadata setting on the icecast level, only mp3 */ if (shout2send->tags && shout2send->audio_format == SHOUT_FORMAT_MP3) { GstTagList *list; gst_event_parse_tag (event, &list); GST_DEBUG_OBJECT (shout2send, "tags=%" GST_PTR_FORMAT, list); gst_tag_list_insert (shout2send->tags, list, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (shout2send))); /* lets get the artist and song tags */ gst_tag_list_foreach ((GstTagList *) list, set_shout_metadata, shout2send); if (shout2send->songmetadata && shout2send->connected) { shout_metadata_t *pmetadata; GST_DEBUG_OBJECT (shout2send, "metadata now: %s", shout2send->songmetadata); pmetadata = shout_metadata_new (); shout_metadata_add (pmetadata, "song", shout2send->songmetadata); shout_set_metadata (shout2send->conn, pmetadata); shout_metadata_free (pmetadata); } } break; } default:{ GST_LOG_OBJECT (shout2send, "let base class handle event"); if (GST_BASE_SINK_CLASS (parent_class)->event) { event = gst_event_ref (event); ret = GST_BASE_SINK_CLASS (parent_class)->event (sink, event); } break; } } return ret; } static gboolean gst_shout2send_start (GstBaseSink * basesink) { GstShout2send *sink = GST_SHOUT2SEND (basesink); const gchar *cur_prop; gshort proto = 3; gchar *version_string; GST_DEBUG_OBJECT (sink, "starting"); sink->conn = shout_new (); switch (sink->protocol) { case SHOUT2SEND_PROTOCOL_XAUDIOCAST: proto = SHOUT_PROTOCOL_XAUDIOCAST; break; case SHOUT2SEND_PROTOCOL_ICY: proto = SHOUT_PROTOCOL_ICY; break; case SHOUT2SEND_PROTOCOL_HTTP: proto = SHOUT_PROTOCOL_HTTP; break; } cur_prop = "protocol"; GST_DEBUG_OBJECT (sink, "setting protocol: %d", sink->protocol); if (shout_set_protocol (sink->conn, proto) != SHOUTERR_SUCCESS) goto set_failed; /* --- FIXME: shout requires an ip, and fails if it is given a host. */ /* may want to put convert_to_ip(shout2send->ip) here */ cur_prop = "ip"; GST_DEBUG_OBJECT (sink, "setting ip: %s", sink->ip); if (shout_set_host (sink->conn, sink->ip) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "port"; GST_DEBUG_OBJECT (sink, "setting port: %u", sink->port); if (shout_set_port (sink->conn, sink->port) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "password"; GST_DEBUG_OBJECT (sink, "setting password: %s", sink->password); if (shout_set_password (sink->conn, sink->password) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "public"; GST_DEBUG_OBJECT (sink, "setting %s: %u", cur_prop, sink->ispublic); if (shout_set_public (sink->conn, (sink->ispublic ? 1 : 0)) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "streamname"; GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->streamname); if (shout_set_name (sink->conn, sink->streamname) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "description"; GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->description); if (shout_set_description (sink->conn, sink->description) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "genre"; GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->genre); if (shout_set_genre (sink->conn, sink->genre) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "mount"; GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, sink->mount); if (shout_set_mount (sink->conn, sink->mount) != SHOUTERR_SUCCESS) goto set_failed; cur_prop = "username"; GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, "source"); if (shout_set_user (sink->conn, sink->username) != SHOUTERR_SUCCESS) goto set_failed; version_string = gst_version_string (); cur_prop = "agent"; GST_DEBUG_OBJECT (sink, "setting %s: %s", cur_prop, version_string); if (shout_set_agent (sink->conn, version_string) != SHOUTERR_SUCCESS) { g_free (version_string); goto set_failed; } g_free (version_string); return TRUE; /* ERROR */ set_failed: { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Error setting %s: %s", cur_prop, shout_get_error (sink->conn))); return FALSE; } } static gboolean gst_shout2send_connect (GstShout2send * sink) { const char *format = (sink->audio_format == SHOUT_FORMAT_VORBIS) ? "vorbis" : ((sink->audio_format == SHOUT_FORMAT_MP3) ? "mp3" : "unknown"); #ifdef SHOUT_FORMAT_WEBM if (sink->audio_format == SHOUT_FORMAT_WEBM) format = "webm"; #endif GST_DEBUG_OBJECT (sink, "Connection format is: %s", format); if (shout_set_format (sink->conn, sink->audio_format) != SHOUTERR_SUCCESS) goto could_not_set_format; if (shout_open (sink->conn) != SHOUTERR_SUCCESS) goto could_not_connect; GST_DEBUG_OBJECT (sink, "connected to server"); sink->connected = TRUE; /* let's set metadata */ if (sink->songmetadata) { shout_metadata_t *pmetadata; GST_DEBUG_OBJECT (sink, "shout metadata now: %s", sink->songmetadata); pmetadata = shout_metadata_new (); shout_metadata_add (pmetadata, "song", sink->songmetadata); shout_set_metadata (sink->conn, pmetadata); shout_metadata_free (pmetadata); } return TRUE; /* ERRORS */ could_not_set_format: { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Error setting connection format: %s", shout_get_error (sink->conn))); return FALSE; } could_not_connect: { GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (_("Could not connect to server")), ("shout_open() failed: err=%s", shout_get_error (sink->conn))); g_signal_emit (sink, gst_shout2send_signals[SIGNAL_CONNECTION_PROBLEM], 0, shout_get_errno (sink->conn)); return FALSE; } } static gboolean gst_shout2send_stop (GstBaseSink * basesink) { GstShout2send *sink = GST_SHOUT2SEND (basesink); if (sink->conn) { if (sink->connected) shout_close (sink->conn); shout_free (sink->conn); sink->conn = NULL; } if (sink->songmetadata) { g_free (sink->songmetadata); sink->songmetadata = NULL; } sink->connected = FALSE; return TRUE; } static gboolean gst_shout2send_unlock (GstBaseSink * basesink) { GstShout2send *sink; sink = GST_SHOUT2SEND (basesink); GST_DEBUG_OBJECT (basesink, "unlock"); gst_poll_set_flushing (sink->timer, TRUE); return TRUE; } static gboolean gst_shout2send_unlock_stop (GstBaseSink * basesink) { GstShout2send *sink; sink = GST_SHOUT2SEND (basesink); GST_DEBUG_OBJECT (basesink, "unlock_stop"); gst_poll_set_flushing (sink->timer, FALSE); return TRUE; } static GstFlowReturn gst_shout2send_render (GstBaseSink * basesink, GstBuffer * buf) { GstShout2send *sink; glong ret; gint delay; GstFlowReturn fret; sink = GST_SHOUT2SEND (basesink); /* presumably we connect here because we need to know the format before * we can set up the connection, which we don't know yet in _start() */ if (!sink->connected) { if (!gst_shout2send_connect (sink)) return GST_FLOW_ERROR; } delay = shout_delay (sink->conn); if (delay > 0) { GST_LOG_OBJECT (sink, "waiting %d msec", delay); if (gst_poll_wait (sink->timer, GST_MSECOND * delay) == -1) { GST_LOG_OBJECT (sink, "unlocked"); fret = gst_base_sink_wait_preroll (basesink); if (fret != GST_FLOW_OK) return fret; } } else { GST_LOG_OBJECT (sink, "we're %d msec late", -delay); } GST_LOG_OBJECT (sink, "sending %u bytes of data", GST_BUFFER_SIZE (buf)); ret = shout_send (sink->conn, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); if (ret != SHOUTERR_SUCCESS) goto send_error; return GST_FLOW_OK; /* ERRORS */ send_error: { GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, (NULL), ("shout_send() failed: %s", shout_get_error (sink->conn))); g_signal_emit (sink, gst_shout2send_signals[SIGNAL_CONNECTION_PROBLEM], 0, shout_get_errno (sink->conn)); return GST_FLOW_ERROR; } } static void gst_shout2send_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstShout2send *shout2send; shout2send = GST_SHOUT2SEND (object); switch (prop_id) { case ARG_IP: if (shout2send->ip) g_free (shout2send->ip); shout2send->ip = g_strdup (g_value_get_string (value)); break; case ARG_PORT: shout2send->port = g_value_get_int (value); break; case ARG_PASSWORD: if (shout2send->password) g_free (shout2send->password); shout2send->password = g_strdup (g_value_get_string (value)); break; case ARG_USERNAME: if (shout2send->username) g_free (shout2send->username); shout2send->username = g_strdup (g_value_get_string (value)); break; case ARG_PUBLIC: shout2send->ispublic = g_value_get_boolean (value); break; case ARG_STREAMNAME: /* Name of the stream */ if (shout2send->streamname) g_free (shout2send->streamname); shout2send->streamname = g_strdup (g_value_get_string (value)); break; case ARG_DESCRIPTION: /* Description of the stream */ if (shout2send->description) g_free (shout2send->description); shout2send->description = g_strdup (g_value_get_string (value)); break; case ARG_GENRE: /* Genre of the stream */ if (shout2send->genre) g_free (shout2send->genre); shout2send->genre = g_strdup (g_value_get_string (value)); break; case ARG_PROTOCOL: /* protocol to connect with */ shout2send->protocol = g_value_get_enum (value); break; case ARG_MOUNT: /* mountpoint of stream (icecast only) */ if (shout2send->mount) g_free (shout2send->mount); shout2send->mount = g_strdup (g_value_get_string (value)); break; case ARG_URL: /* Url of the stream (I'm guessing) */ if (shout2send->url) g_free (shout2send->url); shout2send->url = g_strdup (g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_shout2send_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstShout2send *shout2send; shout2send = GST_SHOUT2SEND (object); switch (prop_id) { case ARG_IP: g_value_set_string (value, shout2send->ip); break; case ARG_PORT: g_value_set_int (value, shout2send->port); break; case ARG_PASSWORD: g_value_set_string (value, shout2send->password); break; case ARG_USERNAME: g_value_set_string (value, shout2send->username); break; case ARG_PUBLIC: g_value_set_boolean (value, shout2send->ispublic); break; case ARG_STREAMNAME: /* Name of the stream */ g_value_set_string (value, shout2send->streamname); break; case ARG_DESCRIPTION: /* Description of the stream */ g_value_set_string (value, shout2send->description); break; case ARG_GENRE: /* Genre of the stream */ g_value_set_string (value, shout2send->genre); break; case ARG_PROTOCOL: /* protocol to connect with */ g_value_set_enum (value, shout2send->protocol); break; case ARG_MOUNT: /* mountpoint of stream (icecast only) */ g_value_set_string (value, shout2send->mount); break; case ARG_URL: /* Url of stream (I'm guessing) */ g_value_set_string (value, shout2send->url); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_shout2send_setcaps (GstPad * pad, GstCaps * caps) { const gchar *mimetype; GstShout2send *shout2send; gboolean ret = TRUE; shout2send = GST_SHOUT2SEND (GST_OBJECT_PARENT (pad)); mimetype = gst_structure_get_name (gst_caps_get_structure (caps, 0)); GST_DEBUG_OBJECT (shout2send, "mimetype of caps given is: %s", mimetype); if (!strcmp (mimetype, "audio/mpeg")) { shout2send->audio_format = SHOUT_FORMAT_MP3; } else if (!strcmp (mimetype, "application/ogg")) { shout2send->audio_format = SHOUT_FORMAT_VORBIS; #ifdef SHOUT_FORMAT_WEBM } else if (!strcmp (mimetype, "video/webm")) { shout2send->audio_format = SHOUT_FORMAT_WEBM; #endif } else { ret = FALSE; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ return gst_element_register (plugin, "shout2send", GST_RANK_NONE, GST_TYPE_SHOUT2SEND); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "shout2send", "Sends data to an icecast server using libshout2", plugin_init, VERSION, "LGPL", "libshout2", "http://www.icecast.org/download.html") gst-plugins-good-0.10.31/ext/shout2/Makefile.in0000644000175000017500000006530411720560227016102 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/shout2 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstshout2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstshout2_la_OBJECTS = libgstshout2_la-gstshout2.lo libgstshout2_la_OBJECTS = $(am_libgstshout2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstshout2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstshout2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstshout2_la_CFLAGS) $(CFLAGS) \ $(libgstshout2_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstshout2_la_SOURCES) DIST_SOURCES = $(libgstshout2_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstshout2.la libgstshout2_la_SOURCES = gstshout2.c libgstshout2_la_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SHOUT2_CFLAGS) libgstshout2_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(SHOUT2_LIBS) libgstshout2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstshout2_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstshout2.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/shout2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/shout2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstshout2.la: $(libgstshout2_la_OBJECTS) $(libgstshout2_la_DEPENDENCIES) $(EXTRA_libgstshout2_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstshout2_la_LINK) -rpath $(plugindir) $(libgstshout2_la_OBJECTS) $(libgstshout2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstshout2_la-gstshout2.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstshout2_la-gstshout2.lo: gstshout2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshout2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshout2_la_CFLAGS) $(CFLAGS) -MT libgstshout2_la-gstshout2.lo -MD -MP -MF $(DEPDIR)/libgstshout2_la-gstshout2.Tpo -c -o libgstshout2_la-gstshout2.lo `test -f 'gstshout2.c' || echo '$(srcdir)/'`gstshout2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstshout2_la-gstshout2.Tpo $(DEPDIR)/libgstshout2_la-gstshout2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstshout2.c' object='libgstshout2_la-gstshout2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshout2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshout2_la_CFLAGS) $(CFLAGS) -c -o libgstshout2_la-gstshout2.lo `test -f 'gstshout2.c' || echo '$(srcdir)/'`gstshout2.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/gdk_pixbuf/0000755000175000017500000000000011720565321015003 500000000000000gst-plugins-good-0.10.31/ext/gdk_pixbuf/Makefile.am0000644000175000017500000000110111671175352016756 00000000000000plugin_LTLIBRARIES = libgstgdkpixbuf.la libgstgdkpixbuf_la_SOURCES = gstgdkpixbuf.c gstgdkpixbufsink.c pixbufscale.c libgstgdkpixbuf_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(GDK_PIXBUF_CFLAGS) libgstgdkpixbuf_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) $(GDK_PIXBUF_LIBS) libgstgdkpixbuf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgdkpixbuf_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstgdkpixbuf.h \ gstgdkpixbufsink.h \ pixbufscale.h \ gstgdkanimation.h gst-plugins-good-0.10.31/ext/gdk_pixbuf/gstgdkpixbufsink.h0000644000175000017500000000432611671175352020475 00000000000000/* GStreamer GdkPixbuf sink * Copyright (C) 2006-2008 Tim-Philipp Müller * * 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_GDK_PIXBUF_SINK_H #define GST_GDK_PIXBUF_SINK_H #include #include #include #define GST_TYPE_GDK_PIXBUF_SINK (gst_gdk_pixbuf_sink_get_type()) #define GST_GDK_PIXBUF_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_PIXBUF_SINK,GstGdkPixbufSink)) #define GST_GDK_PIXBUF_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_PIXBUF_SINK,GstGdkPixbufSinkClass)) #define GST_IS_GDK_PIXBUF_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_PIXBUF_SINK)) #define GST_IS_GDK_PIXBUF_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_PIXBUF_SINK)) typedef struct _GstGdkPixbufSink GstGdkPixbufSink; typedef struct _GstGdkPixbufSinkClass GstGdkPixbufSinkClass; /** * GstGdkPixbufSink: * * Opaque element structure. */ struct _GstGdkPixbufSink { GstVideoSink basesink; /*< private >*/ /* current caps */ gint width; gint height; gint rowstride; gint par_n; gint par_d; gboolean has_alpha; /* properties */ gboolean post_messages; GdkPixbuf * last_pixbuf; }; /** * GstGdkPixbufSinkClass: * * Opaque element class structure. */ struct _GstGdkPixbufSinkClass { GstVideoSinkClass basesinkclass; }; GType gst_gdk_pixbuf_sink_get_type (void); #endif /* GST_GDK_PIXBUF_SINK_H */ gst-plugins-good-0.10.31/ext/gdk_pixbuf/pixbufscale.h0000644000175000017500000000455211671175352017415 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2004> Jan Schmidt * Copyright (C) <2004> Tim-Philipp Mueller * * 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_PIXBUFSCALE_H__ #define __GST_PIXBUFSCALE_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_PIXBUFSCALE \ (gst_pixbufscale_get_type()) #define GST_PIXBUFSCALE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PIXBUFSCALE,GstPixbufScale)) #define GST_PIXBUFSCALE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PIXBUFSCALE,GstPixbufScaleClass)) #define GST_IS_PIXBUFSCALE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PIXBUFSCALE)) #define GST_IS_PIXBUFSCALE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PIXBUFSCALE)) typedef enum { GST_PIXBUFSCALE_NEAREST, GST_PIXBUFSCALE_TILES, GST_PIXBUFSCALE_BILINEAR, GST_PIXBUFSCALE_HYPER } GstPixbufScaleMethod; typedef struct _GstPixbufScale GstPixbufScale; typedef struct _GstPixbufScaleClass GstPixbufScaleClass; struct _GstPixbufScale { GstBaseTransform element; /* video state */ gint to_width; gint to_height; gint from_width; gint from_height; gboolean passthru; GstPixbufScaleMethod method; GdkInterpType gdk_method; /* private */ gint from_buf_size; gint from_stride; gint to_buf_size; gint to_stride; }; struct _GstPixbufScaleClass { GstBaseTransformClass parent_class; }; GType gst_pixbufscale_get_type(void); gboolean pixbufscale_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_PIXBUFSCALE_H__ */ gst-plugins-good-0.10.31/ext/gdk_pixbuf/gstgdkpixbuf.h0000644000175000017500000000402711671175352017606 00000000000000/* GStreamer GdkPixbuf-based image decoder * Copyright (C) 1999-2001 Erik Walthinsen * Copyright (C) 2003 David A. Schleef * * 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_GDK_PIXBUF_H__ #define __GST_GDK_PIXBUF_H__ #include G_BEGIN_DECLS /* #define's don't like whitespacey bits */ #define GST_TYPE_GDK_PIXBUF \ (gst_gdk_pixbuf_get_type()) #define GST_GDK_PIXBUF(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_PIXBUF,GstGdkPixbuf)) #define GST_GDK_PIXBUF_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_PIXBUF,GstGdkPixbufClass)) #define GST_IS_GDK_PIXBUF(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_PIXBUF)) #define GST_IS_GDK_PIXBUF_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_PIXBUF)) typedef struct _GstGdkPixbuf GstGdkPixbuf; typedef struct _GstGdkPixbufClass GstGdkPixbufClass; struct _GstGdkPixbuf { GstElement element; GstPad *sinkpad, *srcpad; GstClockTime last_timestamp; GdkPixbufLoader *pixbuf_loader; int width; int height; int rowstride; unsigned int image_size; gint framerate_numerator; gint framerate_denominator; }; struct _GstGdkPixbufClass { GstElementClass parent_class; }; static GType gst_gdk_pixbuf_get_type (void); G_END_DECLS #endif /* __GST_GDK_PIXBUF_H__ */ gst-plugins-good-0.10.31/ext/gdk_pixbuf/gstgdkpixbufsink.c0000644000175000017500000003304411677341654020475 00000000000000/* GStreamer GdkPixbuf sink * Copyright (C) 2006-2008 Tim-Philipp Müller * * 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 free software; you can redistribute it and/or * 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-gdkpixbufsink * @Since: 0.10.8 * * This sink element takes RGB or RGBA images as input and wraps them into * #GdkPixbuf objects, for easy saving to file via the * GdkPixbuf library API or displaying in Gtk+ applications (e.g. using * the #GtkImage widget). * * There are two ways to use this element and obtain the #GdkPixbuf objects * created: * * * Watching for element messages named "preroll-pixbuf" * or "pixbuf" on the bus, which * will be posted whenever an image would usually be rendered. See below for * more details on these messages and how to extract the pixbuf object * contained in them. * * * Retrieving the current pixbuf via the #GstGdkPixbufSink:last-pixbuf property * when needed. * * * * The primary purpose of this element is to abstract away the #GstBuffer to * #GdkPixbuf conversion. Other than that it's very similar to the fakesink * element. * * This element is meant for easy no-hassle video snapshotting. It is not * suitable for video playback or video display at high framerates. Use * ximagesink, xvimagesink or some other suitable video sink in connection * with the #GstXOverlay interface instead if you want to do video playback. * * * Message details * As mentioned above, this element will by default post element messages * containing structures named "preroll-pixbuf" * or "pixbuf" on the bus (this * can be disabled by setting the #GstGdkPixbufSink:post-messages property * to #FALSE though). The element message structure has the following fields: * * * "pixbuf": the #GdkPixbuf object * * * "pixel-aspect-ratio": the pixel aspect * ratio (PAR) of the input image (this field contains a #GstFraction); the * PAR is usually 1:1 for images, but is often something non-1:1 in the case * of video input. In this case the image may be distorted and you may need * to rescale it accordingly before saving it to file or displaying it. This * can easily be done using gdk_pixbuf_scale() (the reason this is not done * automatically is that the application will often scale the image anyway * according to the size of the output window, in which case it is much more * efficient to only scale once rather than twice). You can put a videoscale * element and a capsfilter element with * video/x-raw-rgb,pixel-aspect-ratio=(fraction)1/1 caps * in front of this element to make sure the pixbufs always have a 1:1 PAR. * * * * * * Example pipeline * |[ * gst-launch -m -v videotestsrc num-buffers=1 ! gdkpixbufsink * ]| Process one single test image as pixbuf (note that the output you see will * be slightly misleading. The message structure does contain a valid pixbuf * object even if the structure string says '(NULL)'). * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstgdkpixbufsink.h" #include #define DEFAULT_SEND_MESSAGES TRUE #define DEFAULT_POST_MESSAGES TRUE enum { PROP_0, PROP_SEND_MESSAGES, PROP_POST_MESSAGES, PROP_LAST_PIXBUF, PROP_LAST }; GST_BOILERPLATE (GstGdkPixbufSink, gst_gdk_pixbuf_sink, GstVideoSink, GST_TYPE_VIDEO_SINK); static void gst_gdk_pixbuf_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_gdk_pixbuf_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_gdk_pixbuf_sink_start (GstBaseSink * basesink); static gboolean gst_gdk_pixbuf_sink_stop (GstBaseSink * basesink); static gboolean gst_gdk_pixbuf_sink_set_caps (GstBaseSink * basesink, GstCaps * caps); static GstFlowReturn gst_gdk_pixbuf_sink_render (GstBaseSink * bsink, GstBuffer * buf); static GstFlowReturn gst_gdk_pixbuf_sink_preroll (GstBaseSink * bsink, GstBuffer * buf); static GdkPixbuf *gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (GstGdkPixbufSink * sink, GstBuffer * buf); #define WxH ", width = (int) [ 16, 4096 ], height = (int) [ 16, 4096 ]" static GstStaticPadTemplate pixbufsink_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB WxH ";" GST_VIDEO_CAPS_RGBA WxH)); static void gst_gdk_pixbuf_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "GdkPixbuf sink", "Sink/Video", "Output images as GdkPixbuf objects in bus messages", "Tim-Philipp Müller "); gst_element_class_add_static_pad_template (element_class, &pixbufsink_sink_factory); } static void gst_gdk_pixbuf_sink_class_init (GstGdkPixbufSinkClass * klass) { GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = gst_gdk_pixbuf_sink_set_property; gobject_class->get_property = gst_gdk_pixbuf_sink_get_property; /* FIXME 0.11, remove in favour of post-messages */ g_object_class_install_property (gobject_class, PROP_SEND_MESSAGES, g_param_spec_boolean ("send-messages", "Send Messages", "Whether to post messages containing pixbufs on the bus " " (deprecated, use post-messages)", DEFAULT_SEND_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstGdkPixbuf:post-messages: * * Post messages on the bus containing pixbufs. * * Since: 0.10.17 */ g_object_class_install_property (gobject_class, PROP_POST_MESSAGES, g_param_spec_boolean ("post-messages", "Post Messages", "Whether to post messages containing pixbufs on the bus", DEFAULT_POST_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_LAST_PIXBUF, g_param_spec_object ("last-pixbuf", "Last Pixbuf", "Last GdkPixbuf object rendered", GDK_TYPE_PIXBUF, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); basesink_class->start = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_start); basesink_class->stop = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_stop); basesink_class->render = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_render); basesink_class->preroll = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_preroll); basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_set_caps); } static void gst_gdk_pixbuf_sink_init (GstGdkPixbufSink * sink, GstGdkPixbufSinkClass * klass) { sink->par_n = 0; sink->par_d = 0; sink->has_alpha = FALSE; sink->last_pixbuf = NULL; sink->post_messages = DEFAULT_POST_MESSAGES; /* we're not a real video sink, we just derive from GstVideoSink in case * anything interesting is added to it in future */ gst_base_sink_set_max_lateness (GST_BASE_SINK (sink), -1); gst_base_sink_set_qos_enabled (GST_BASE_SINK (sink), FALSE); } static gboolean gst_gdk_pixbuf_sink_start (GstBaseSink * basesink) { GST_LOG_OBJECT (basesink, "start"); return TRUE; } static gboolean gst_gdk_pixbuf_sink_stop (GstBaseSink * basesink) { GstGdkPixbufSink *sink = GST_GDK_PIXBUF_SINK (basesink); GST_VIDEO_SINK_WIDTH (sink) = 0; GST_VIDEO_SINK_HEIGHT (sink) = 0; sink->par_n = 0; sink->par_d = 0; sink->has_alpha = FALSE; if (sink->last_pixbuf) { g_object_unref (sink->last_pixbuf); sink->last_pixbuf = NULL; } GST_LOG_OBJECT (sink, "stop"); return TRUE; } static gboolean gst_gdk_pixbuf_sink_set_caps (GstBaseSink * basesink, GstCaps * caps) { GstGdkPixbufSink *sink = GST_GDK_PIXBUF_SINK (basesink); GstVideoFormat fmt; gint w, h, par_n, par_d; GST_LOG_OBJECT (sink, "caps: %" GST_PTR_FORMAT, caps); if (!gst_video_format_parse_caps (caps, &fmt, &w, &h)) { GST_WARNING_OBJECT (sink, "parse_caps failed"); return FALSE; } if (!gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) { GST_LOG_OBJECT (sink, "no pixel aspect ratio"); return FALSE; } g_assert ((fmt == GST_VIDEO_FORMAT_RGB && gst_video_format_get_pixel_stride (fmt, 0) == 3) || (fmt == GST_VIDEO_FORMAT_RGBA && gst_video_format_get_pixel_stride (fmt, 0) == 4)); GST_VIDEO_SINK_WIDTH (sink) = w; GST_VIDEO_SINK_HEIGHT (sink) = h; sink->rowstride = gst_video_format_get_row_stride (fmt, 0, w); sink->has_alpha = (fmt == GST_VIDEO_FORMAT_RGBA); sink->par_n = par_n; sink->par_d = par_d; GST_INFO_OBJECT (sink, "format : %d", fmt); GST_INFO_OBJECT (sink, "width x height : %d x %d", w, h); GST_INFO_OBJECT (sink, "pixel-aspect-ratio : %d/%d", par_n, par_d); return TRUE; } static void gst_gdk_pixbuf_sink_pixbuf_destroy_notify (guchar * pixels, GstBuffer * buf) { gst_buffer_unref (buf); } static GdkPixbuf * gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (GstGdkPixbufSink * sink, GstBuffer * buf) { GdkPixbuf *pix = NULL; gint minsize, bytes_per_pixel; g_return_val_if_fail (GST_VIDEO_SINK_WIDTH (sink) > 0, NULL); g_return_val_if_fail (GST_VIDEO_SINK_HEIGHT (sink) > 0, NULL); bytes_per_pixel = (sink->has_alpha) ? 4 : 3; /* last row needn't have row padding */ minsize = (sink->rowstride * (GST_VIDEO_SINK_HEIGHT (sink) - 1)) + (bytes_per_pixel * GST_VIDEO_SINK_WIDTH (sink)); g_return_val_if_fail (GST_BUFFER_SIZE (buf) >= minsize, NULL); pix = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (buf), GDK_COLORSPACE_RGB, sink->has_alpha, 8, GST_VIDEO_SINK_WIDTH (sink), GST_VIDEO_SINK_HEIGHT (sink), sink->rowstride, (GdkPixbufDestroyNotify) gst_gdk_pixbuf_sink_pixbuf_destroy_notify, gst_buffer_ref (buf)); return pix; } static GstFlowReturn gst_gdk_pixbuf_sink_handle_buffer (GstBaseSink * basesink, GstBuffer * buf, const gchar * msg_name) { GstGdkPixbufSink *sink; GdkPixbuf *pixbuf; gboolean do_post; sink = GST_GDK_PIXBUF_SINK (basesink); pixbuf = gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (sink, buf); GST_OBJECT_LOCK (sink); do_post = sink->post_messages; if (sink->last_pixbuf) g_object_unref (sink->last_pixbuf); sink->last_pixbuf = pixbuf; /* take ownership */ GST_OBJECT_UNLOCK (sink); if (G_UNLIKELY (pixbuf == NULL)) goto error; if (do_post) { GstStructure *s; GstMessage *msg; /* it's okay to keep using pixbuf here, we can be sure no one is going to * unref or change sink->last_pixbuf before we return from this function. * The structure will take its own ref to the pixbuf. */ s = gst_structure_new (msg_name, "pixbuf", GDK_TYPE_PIXBUF, pixbuf, "pixel-aspect-ratio", GST_TYPE_FRACTION, sink->par_n, sink->par_d, NULL); msg = gst_message_new_element (GST_OBJECT_CAST (sink), s); gst_element_post_message (GST_ELEMENT_CAST (sink), msg); } g_object_notify (G_OBJECT (sink), "last-pixbuf"); return GST_FLOW_OK; /* ERRORS */ error: { /* This shouldn't really happen */ GST_ELEMENT_ERROR (sink, LIBRARY, FAILED, ("Couldn't create pixbuf from RGB image."), ("Probably not enough free memory")); return GST_FLOW_ERROR; } } static GstFlowReturn gst_gdk_pixbuf_sink_preroll (GstBaseSink * basesink, GstBuffer * buf) { return gst_gdk_pixbuf_sink_handle_buffer (basesink, buf, "preroll-pixbuf"); } static GstFlowReturn gst_gdk_pixbuf_sink_render (GstBaseSink * basesink, GstBuffer * buf) { return gst_gdk_pixbuf_sink_handle_buffer (basesink, buf, "pixbuf"); } static void gst_gdk_pixbuf_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGdkPixbufSink *sink; sink = GST_GDK_PIXBUF_SINK (object); switch (prop_id) { case PROP_SEND_MESSAGES: case PROP_POST_MESSAGES: GST_OBJECT_LOCK (sink); sink->post_messages = g_value_get_boolean (value); GST_OBJECT_UNLOCK (sink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_gdk_pixbuf_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGdkPixbufSink *sink; sink = GST_GDK_PIXBUF_SINK (object); switch (prop_id) { case PROP_SEND_MESSAGES: case PROP_POST_MESSAGES: GST_OBJECT_LOCK (sink); g_value_set_boolean (value, sink->post_messages); GST_OBJECT_UNLOCK (sink); break; case PROP_LAST_PIXBUF: GST_OBJECT_LOCK (sink); g_value_set_object (value, sink->last_pixbuf); GST_OBJECT_UNLOCK (sink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/ext/gdk_pixbuf/pixbufscale.c0000644000175000017500000003524311677341654017417 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2004> Jan Schmidt * Copyright (C) <2004> Tim-Philipp Mueller * * 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 #include #include #define ROUND_UP_2(x) (((x)+1)&~1) #define ROUND_UP_4(x) (((x)+3)&~3) #define ROUND_UP_8(x) (((x)+7)&~7) /* These match the ones gstffmpegcolorspace uses (Tim) */ #define GST_RGB24_ROWSTRIDE(width) (ROUND_UP_4 ((width)*3)) #define GST_RGB24_SIZE(width,height) ((height)*GST_RGB24_ROWSTRIDE(width)) GST_DEBUG_CATEGORY_STATIC (pixbufscale_debug); #define GST_CAT_DEFAULT pixbufscale_debug /* GstPixbufScale signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, ARG_METHOD /* FILL ME */ }; static GstStaticPadTemplate gst_pixbufscale_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) ); static GstStaticPadTemplate gst_pixbufscale_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) ); #define GST_TYPE_PIXBUFSCALE_METHOD (gst_pixbufscale_method_get_type()) static GType gst_pixbufscale_method_get_type (void) { static GType pixbufscale_method_type = 0; static const GEnumValue pixbufscale_methods[] = { {GST_PIXBUFSCALE_NEAREST, "0", "Nearest Neighbour"}, {GST_PIXBUFSCALE_TILES, "1", "Tiles"}, {GST_PIXBUFSCALE_BILINEAR, "2", "Bilinear"}, {GST_PIXBUFSCALE_HYPER, "3", "Hyper"}, {0, NULL, NULL}, }; if (!pixbufscale_method_type) { pixbufscale_method_type = g_enum_register_static ("GstPixbufScaleMethod", pixbufscale_methods); } return pixbufscale_method_type; } static void gst_pixbufscale_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pixbufscale_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_pixbufscale_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps); static gboolean gst_pixbufscale_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out); static gboolean gst_pixbufscale_get_unit_size (GstBaseTransform * trans, GstCaps * caps, guint * size); static void gst_pixbufscale_fixate_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); static GstFlowReturn gst_pixbufscale_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out); static gboolean gst_pixbufscale_handle_src_event (GstPad * pad, GstEvent * event); static gboolean parse_caps (GstCaps * caps, gint * width, gint * height); GST_BOILERPLATE (GstPixbufScale, gst_pixbufscale, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_pixbufscale_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "GdkPixbuf image scaler", "Filter/Effect/Video", "Resizes video", "Jan Schmidt , " "Wim Taymans , " "Renato Filho "); gst_element_class_add_static_pad_template (element_class, &gst_pixbufscale_src_template); gst_element_class_add_static_pad_template (element_class, &gst_pixbufscale_sink_template); } static void gst_pixbufscale_class_init (GstPixbufScaleClass * klass) { GObjectClass *gobject_class; GstBaseTransformClass *trans_class; gobject_class = (GObjectClass *) klass; trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_pixbufscale_set_property; gobject_class->get_property = gst_pixbufscale_get_property; g_object_class_install_property (gobject_class, ARG_METHOD, g_param_spec_enum ("method", "method", "method", GST_TYPE_PIXBUFSCALE_METHOD, GST_PIXBUFSCALE_BILINEAR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_pixbufscale_transform_caps); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_pixbufscale_set_caps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_pixbufscale_get_unit_size); trans_class->transform = GST_DEBUG_FUNCPTR (gst_pixbufscale_transform); trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_pixbufscale_fixate_caps); trans_class->passthrough_on_same_caps = TRUE; parent_class = g_type_class_peek_parent (klass); } static void gst_pixbufscale_init (GstPixbufScale * pixbufscale, GstPixbufScaleClass * kclass) { GstBaseTransform *trans; GST_DEBUG_OBJECT (pixbufscale, "_init"); trans = GST_BASE_TRANSFORM (pixbufscale); gst_pad_set_event_function (trans->srcpad, gst_pixbufscale_handle_src_event); pixbufscale->method = GST_PIXBUFSCALE_TILES; pixbufscale->gdk_method = GDK_INTERP_TILES; } static void gst_pixbufscale_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPixbufScale *src; g_return_if_fail (GST_IS_PIXBUFSCALE (object)); src = GST_PIXBUFSCALE (object); switch (prop_id) { case ARG_METHOD: src->method = g_value_get_enum (value); switch (src->method) { case GST_PIXBUFSCALE_NEAREST: src->gdk_method = GDK_INTERP_NEAREST; break; case GST_PIXBUFSCALE_TILES: src->gdk_method = GDK_INTERP_TILES; break; case GST_PIXBUFSCALE_BILINEAR: src->gdk_method = GDK_INTERP_BILINEAR; break; case GST_PIXBUFSCALE_HYPER: src->gdk_method = GDK_INTERP_HYPER; break; } break; default: break; } } static void gst_pixbufscale_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPixbufScale *src; g_return_if_fail (GST_IS_PIXBUFSCALE (object)); src = GST_PIXBUFSCALE (object); switch (prop_id) { case ARG_METHOD: g_value_set_enum (value, src->method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_pixbufscale_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps) { GstCaps *ret; int i; ret = gst_caps_copy (caps); for (i = 0; i < gst_caps_get_size (ret); i++) { GstStructure *structure = gst_caps_get_structure (ret, i); gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 16, 4096, "height", GST_TYPE_INT_RANGE, 16, 4096, NULL); gst_structure_remove_field (structure, "pixel-aspect-ratio"); } GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret); return ret; } static gboolean parse_caps (GstCaps * caps, gint * width, gint * height) { gboolean ret; GstStructure *structure; structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "width", width); ret &= gst_structure_get_int (structure, "height", height); return ret; } static gboolean gst_pixbufscale_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out) { GstPixbufScale *pixbufscale; gboolean ret; pixbufscale = GST_PIXBUFSCALE (trans); ret = parse_caps (in, &pixbufscale->from_width, &pixbufscale->from_height); ret &= parse_caps (out, &pixbufscale->to_width, &pixbufscale->to_height); if (!ret) goto done; pixbufscale->from_stride = GST_ROUND_UP_4 (pixbufscale->from_width * 3); pixbufscale->from_buf_size = pixbufscale->from_stride * pixbufscale->from_height; pixbufscale->to_stride = GST_ROUND_UP_4 (pixbufscale->to_width * 3); pixbufscale->to_buf_size = pixbufscale->to_stride * pixbufscale->to_height; GST_DEBUG_OBJECT (pixbufscale, "from=%dx%d, size %d -> to=%dx%d, size %d", pixbufscale->from_width, pixbufscale->from_height, pixbufscale->from_buf_size, pixbufscale->to_width, pixbufscale->to_height, pixbufscale->to_buf_size); done: return ret; } static gboolean gst_pixbufscale_get_unit_size (GstBaseTransform * trans, GstCaps * caps, guint * size) { gint width, height; g_assert (size); if (!parse_caps (caps, &width, &height)) return FALSE; *size = GST_ROUND_UP_4 (width * 3) * height; return TRUE; } static void gst_pixbufscale_fixate_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) { GstStructure *ins, *outs; const GValue *from_par, *to_par; g_return_if_fail (gst_caps_is_fixed (caps)); GST_DEBUG_OBJECT (base, "trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %" GST_PTR_FORMAT, othercaps, caps); ins = gst_caps_get_structure (caps, 0); outs = gst_caps_get_structure (othercaps, 0); from_par = gst_structure_get_value (ins, "pixel-aspect-ratio"); to_par = gst_structure_get_value (outs, "pixel-aspect-ratio"); if (from_par && to_par) { GValue to_ratio = { 0, }; /* w/h of output video */ int from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d; int count = 0, w = 0, h = 0, num, den; /* if both width and height are already fixed, we can't do anything * * about it anymore */ if (gst_structure_get_int (outs, "width", &w)) ++count; if (gst_structure_get_int (outs, "height", &h)) ++count; if (count == 2) { GST_DEBUG_OBJECT (base, "dimensions already set to %dx%d, not fixating", w, h); return; } gst_structure_get_int (ins, "width", &from_w); gst_structure_get_int (ins, "height", &from_h); from_par_n = gst_value_get_fraction_numerator (from_par); from_par_d = gst_value_get_fraction_denominator (from_par); to_par_n = gst_value_get_fraction_numerator (to_par); to_par_d = gst_value_get_fraction_denominator (to_par); g_value_init (&to_ratio, GST_TYPE_FRACTION); gst_value_set_fraction (&to_ratio, from_w * from_par_n * to_par_d, from_h * from_par_d * to_par_n); num = gst_value_get_fraction_numerator (&to_ratio); den = gst_value_get_fraction_denominator (&to_ratio); GST_DEBUG_OBJECT (base, "scaling input with %dx%d and PAR %d/%d to output PAR %d/%d", from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d); GST_DEBUG_OBJECT (base, "resulting output should respect ratio of %d/%d", num, den); /* now find a width x height that respects this display ratio. * * prefer those that have one of w/h the same as the incoming video * * using wd / hd = num / den */ /* start with same height, because of interlaced video */ /* check hd / den is an integer scale factor, and scale wd with the PAR */ if (from_h % den == 0) { GST_DEBUG_OBJECT (base, "keeping video height"); h = from_h; w = h * num / den; } else if (from_w % num == 0) { GST_DEBUG_OBJECT (base, "keeping video width"); w = from_w; h = w * den / num; } else { GST_DEBUG_OBJECT (base, "approximating but keeping video height"); h = from_h; w = h * num / den; } GST_DEBUG_OBJECT (base, "scaling to %dx%d", w, h); /* now fixate */ gst_structure_fixate_field_nearest_int (outs, "width", w); gst_structure_fixate_field_nearest_int (outs, "height", h); } else { gint width, height; if (gst_structure_get_int (ins, "width", &width)) { if (gst_structure_has_field (outs, "width")) { gst_structure_fixate_field_nearest_int (outs, "width", width); } } if (gst_structure_get_int (ins, "height", &height)) { if (gst_structure_has_field (outs, "height")) { gst_structure_fixate_field_nearest_int (outs, "height", height); } } } GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps); } static GstFlowReturn gst_pixbufscale_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstPixbufScale *scale; GdkPixbuf *src_pixbuf, *dest_pixbuf; scale = GST_PIXBUFSCALE (trans); src_pixbuf = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (in), GDK_COLORSPACE_RGB, FALSE, 8, scale->from_width, scale->from_height, GST_RGB24_ROWSTRIDE (scale->from_width), NULL, NULL); dest_pixbuf = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (out), GDK_COLORSPACE_RGB, FALSE, 8, scale->to_width, scale->to_height, GST_RGB24_ROWSTRIDE (scale->to_width), NULL, NULL); gdk_pixbuf_scale (src_pixbuf, dest_pixbuf, 0, 0, scale->to_width, scale->to_height, 0, 0, (double) scale->to_width / scale->from_width, (double) scale->to_height / scale->from_height, scale->gdk_method); g_object_unref (src_pixbuf); g_object_unref (dest_pixbuf); return GST_FLOW_OK; } static gboolean gst_pixbufscale_handle_src_event (GstPad * pad, GstEvent * event) { GstPixbufScale *pixbufscale; gboolean ret; double a; GstStructure *structure; pixbufscale = GST_PIXBUFSCALE (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (pixbufscale, "handling %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: event = GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event))); structure = (GstStructure *) gst_event_get_structure (event); if (gst_structure_get_double (structure, "pointer_x", &a)) { gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, a * pixbufscale->from_width / pixbufscale->to_width, NULL); } if (gst_structure_get_double (structure, "pointer_y", &a)) { gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, a * pixbufscale->from_height / pixbufscale->to_height, NULL); } break; default: break; } ret = gst_pad_event_default (pad, event); gst_object_unref (pixbufscale); return ret; } gboolean pixbufscale_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "gdkpixbufscale", GST_RANK_NONE, GST_TYPE_PIXBUFSCALE)) return FALSE; GST_DEBUG_CATEGORY_INIT (pixbufscale_debug, "gdkpixbufscale", 0, "pixbufscale element"); return TRUE; } gst-plugins-good-0.10.31/ext/gdk_pixbuf/Makefile.in0000644000175000017500000007342111720560226016776 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/gdk_pixbuf DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstgdkpixbuf_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstgdkpixbuf_la_OBJECTS = libgstgdkpixbuf_la-gstgdkpixbuf.lo \ libgstgdkpixbuf_la-gstgdkpixbufsink.lo \ libgstgdkpixbuf_la-pixbufscale.lo libgstgdkpixbuf_la_OBJECTS = $(am_libgstgdkpixbuf_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstgdkpixbuf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) \ $(libgstgdkpixbuf_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstgdkpixbuf_la_SOURCES) DIST_SOURCES = $(libgstgdkpixbuf_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstgdkpixbuf.la libgstgdkpixbuf_la_SOURCES = gstgdkpixbuf.c gstgdkpixbufsink.c pixbufscale.c libgstgdkpixbuf_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(GDK_PIXBUF_CFLAGS) libgstgdkpixbuf_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) $(GDK_PIXBUF_LIBS) libgstgdkpixbuf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgdkpixbuf_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstgdkpixbuf.h \ gstgdkpixbufsink.h \ pixbufscale.h \ gstgdkanimation.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/gdk_pixbuf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/gdk_pixbuf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstgdkpixbuf.la: $(libgstgdkpixbuf_la_OBJECTS) $(libgstgdkpixbuf_la_DEPENDENCIES) $(EXTRA_libgstgdkpixbuf_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstgdkpixbuf_la_LINK) -rpath $(plugindir) $(libgstgdkpixbuf_la_OBJECTS) $(libgstgdkpixbuf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstgdkpixbuf_la-gstgdkpixbuf.lo: gstgdkpixbuf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -MT libgstgdkpixbuf_la-gstgdkpixbuf.lo -MD -MP -MF $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Tpo -c -o libgstgdkpixbuf_la-gstgdkpixbuf.lo `test -f 'gstgdkpixbuf.c' || echo '$(srcdir)/'`gstgdkpixbuf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Tpo $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbuf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgdkpixbuf.c' object='libgstgdkpixbuf_la-gstgdkpixbuf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -c -o libgstgdkpixbuf_la-gstgdkpixbuf.lo `test -f 'gstgdkpixbuf.c' || echo '$(srcdir)/'`gstgdkpixbuf.c libgstgdkpixbuf_la-gstgdkpixbufsink.lo: gstgdkpixbufsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -MT libgstgdkpixbuf_la-gstgdkpixbufsink.lo -MD -MP -MF $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Tpo -c -o libgstgdkpixbuf_la-gstgdkpixbufsink.lo `test -f 'gstgdkpixbufsink.c' || echo '$(srcdir)/'`gstgdkpixbufsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Tpo $(DEPDIR)/libgstgdkpixbuf_la-gstgdkpixbufsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgdkpixbufsink.c' object='libgstgdkpixbuf_la-gstgdkpixbufsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -c -o libgstgdkpixbuf_la-gstgdkpixbufsink.lo `test -f 'gstgdkpixbufsink.c' || echo '$(srcdir)/'`gstgdkpixbufsink.c libgstgdkpixbuf_la-pixbufscale.lo: pixbufscale.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -MT libgstgdkpixbuf_la-pixbufscale.lo -MD -MP -MF $(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Tpo -c -o libgstgdkpixbuf_la-pixbufscale.lo `test -f 'pixbufscale.c' || echo '$(srcdir)/'`pixbufscale.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Tpo $(DEPDIR)/libgstgdkpixbuf_la-pixbufscale.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixbufscale.c' object='libgstgdkpixbuf_la-pixbufscale.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgdkpixbuf_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgdkpixbuf_la_CFLAGS) $(CFLAGS) -c -o libgstgdkpixbuf_la-pixbufscale.lo `test -f 'pixbufscale.c' || echo '$(srcdir)/'`pixbufscale.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/gdk_pixbuf/gstgdkpixbuf.c0000644000175000017500000003773511677341654017623 00000000000000/* GStreamer GdkPixbuf-based image decoder * Copyright (C) 1999-2001 Erik Walthinsen * Copyright (C) 2003 David A. Schleef * * 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 #include #include #include #include "gstgdkpixbuf.h" #include "gstgdkpixbufsink.h" #include "pixbufscale.h" GST_DEBUG_CATEGORY_STATIC (gst_gdk_pixbuf_debug); #define GST_CAT_DEFAULT gst_gdk_pixbuf_debug enum { ARG_0, ARG_SILENT /* FIXME 0.11: remove */ }; static GstStaticPadTemplate gst_gdk_pixbuf_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/png; " /* "image/jpeg; " disabled because we can't handle MJPEG */ "image/gif; " "image/x-icon; " "application/x-navi-animation; " "image/x-cmu-raster; " "image/x-sun-raster; " "image/x-pixmap; " "image/tiff; " "image/x-portable-anymap; " "image/x-portable-bitmap; " "image/x-portable-graymap; " "image/x-portable-pixmap; " "image/bmp; " "image/x-bmp; " "image/x-MS-bmp; " "image/vnd.wap.wbmp; " "image/x-bitmap; " "image/x-tga; " "image/x-pcx; image/svg; image/svg+xml") ); static GstStaticPadTemplate gst_gdk_pixbuf_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_RGBA) ); static void gst_gdk_pixbuf_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_gdk_pixbuf_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_gdk_pixbuf_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_gdk_pixbuf_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_gdk_pixbuf_sink_event (GstPad * pad, GstEvent * event); #ifdef enable_typefind static void gst_gdk_pixbuf_type_find (GstTypeFind * tf, gpointer ignore); #endif GST_BOILERPLATE (GstGdkPixbuf, gst_gdk_pixbuf, GstElement, GST_TYPE_ELEMENT); static gboolean gst_gdk_pixbuf_sink_setcaps (GstPad * pad, GstCaps * caps) { GstGdkPixbuf *filter; const GValue *framerate; GstStructure *s; filter = GST_GDK_PIXBUF (GST_PAD_PARENT (pad)); s = gst_caps_get_structure (caps, 0); if ((framerate = gst_structure_get_value (s, "framerate")) != NULL) { filter->framerate_numerator = gst_value_get_fraction_numerator (framerate); filter->framerate_denominator = gst_value_get_fraction_denominator (framerate); GST_DEBUG_OBJECT (filter, "got framerate of %d/%d fps => packetized mode", filter->framerate_numerator, filter->framerate_denominator); } else { filter->framerate_numerator = 0; filter->framerate_denominator = 1; GST_DEBUG_OBJECT (filter, "no framerate, assuming single image"); } return TRUE; } static GstCaps * gst_gdk_pixbuf_get_capslist (void) { GSList *slist; GSList *slist0; GstCaps *capslist = NULL; GstCaps *return_caps = NULL; GstCaps *tmpl_caps; capslist = gst_caps_new_empty (); slist0 = gdk_pixbuf_get_formats (); for (slist = slist0; slist; slist = g_slist_next (slist)) { GdkPixbufFormat *pixbuf_format; char **mimetypes; char **mimetype; pixbuf_format = slist->data; mimetypes = gdk_pixbuf_format_get_mime_types (pixbuf_format); for (mimetype = mimetypes; *mimetype; mimetype++) { gst_caps_append_structure (capslist, gst_structure_new (*mimetype, NULL)); } g_strfreev (mimetypes); } g_slist_free (slist0); tmpl_caps = gst_static_caps_get (&gst_gdk_pixbuf_sink_template.static_caps); return_caps = gst_caps_intersect (capslist, tmpl_caps); gst_caps_unref (tmpl_caps); gst_caps_unref (capslist); return return_caps; } static GstCaps * gst_gdk_pixbuf_sink_getcaps (GstPad * pad) { return gst_gdk_pixbuf_get_capslist (); } static void gst_gdk_pixbuf_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_gdk_pixbuf_src_template); gst_element_class_add_static_pad_template (element_class, &gst_gdk_pixbuf_sink_template); gst_element_class_set_details_simple (element_class, "GdkPixbuf image decoder", "Codec/Decoder/Image", "Decodes images in a video stream using GdkPixbuf", "David A. Schleef , Renato Filho "); } /* initialize the plugin's class */ static void gst_gdk_pixbuf_class_init (GstGdkPixbufClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_gdk_pixbuf_set_property; gobject_class->get_property = gst_gdk_pixbuf_get_property; g_object_class_install_property (gobject_class, ARG_SILENT, g_param_spec_boolean ("silent", "Silent", "Produce verbose output ? (deprecated)", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_change_state); } static void gst_gdk_pixbuf_init (GstGdkPixbuf * filter, GstGdkPixbufClass * klass) { filter->sinkpad = gst_pad_new_from_static_template (&gst_gdk_pixbuf_sink_template, "sink"); gst_pad_set_setcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_setcaps)); gst_pad_set_getcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_getcaps)); gst_pad_set_chain_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_chain)); gst_pad_set_event_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_event)); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); filter->srcpad = gst_pad_new_from_static_template (&gst_gdk_pixbuf_src_template, "src"); gst_pad_use_fixed_caps (filter->srcpad); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->last_timestamp = GST_CLOCK_TIME_NONE; filter->pixbuf_loader = NULL; } static GstFlowReturn gst_gdk_pixbuf_flush (GstGdkPixbuf * filter) { GstBuffer *outbuf; GdkPixbuf *pixbuf; int y; guint8 *out_pix; guint8 *in_pix; int in_rowstride; GstFlowReturn ret; GstCaps *caps = NULL; gint n_channels; pixbuf = gdk_pixbuf_loader_get_pixbuf (filter->pixbuf_loader); if (pixbuf == NULL) goto no_pixbuf; if (filter->image_size == 0) { filter->width = gdk_pixbuf_get_width (pixbuf); filter->height = gdk_pixbuf_get_height (pixbuf); filter->rowstride = gdk_pixbuf_get_rowstride (pixbuf); filter->image_size = filter->rowstride * filter->height; n_channels = gdk_pixbuf_get_n_channels (pixbuf); switch (n_channels) { case 3: caps = gst_caps_from_string (GST_VIDEO_CAPS_RGB); break; case 4: caps = gst_caps_from_string (GST_VIDEO_CAPS_RGBA); break; default: goto channels_not_supported; } gst_caps_set_simple (caps, "width", G_TYPE_INT, filter->width, "height", G_TYPE_INT, filter->height, "framerate", GST_TYPE_FRACTION, filter->framerate_numerator, filter->framerate_denominator, NULL); GST_DEBUG ("Set size to %dx%d", filter->width, filter->height); gst_pad_set_caps (filter->srcpad, caps); gst_caps_unref (caps); } ret = gst_pad_alloc_buffer_and_set_caps (filter->srcpad, GST_BUFFER_OFFSET_NONE, filter->image_size, GST_PAD_CAPS (filter->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto no_buffer; GST_BUFFER_TIMESTAMP (outbuf) = filter->last_timestamp; GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE; in_pix = gdk_pixbuf_get_pixels (pixbuf); in_rowstride = gdk_pixbuf_get_rowstride (pixbuf); out_pix = GST_BUFFER_DATA (outbuf); /* FIXME, last line might not have rowstride pixels */ for (y = 0; y < filter->height; y++) { memcpy (out_pix, in_pix, filter->rowstride); in_pix += in_rowstride; out_pix += filter->rowstride; } GST_DEBUG ("pushing... %d bytes", GST_BUFFER_SIZE (outbuf)); ret = gst_pad_push (filter->srcpad, outbuf); if (ret != GST_FLOW_OK) GST_DEBUG_OBJECT (filter, "flow: %s", gst_flow_get_name (ret)); return ret; /* ERRORS */ no_pixbuf: { GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), ("error geting pixbuf")); return GST_FLOW_ERROR; } channels_not_supported: { GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), ("%d channels not supported", n_channels)); return GST_FLOW_ERROR; } no_buffer: { GST_DEBUG ("Failed to create outbuffer - %s", gst_flow_get_name (ret)); return ret; } } static gboolean gst_gdk_pixbuf_sink_event (GstPad * pad, GstEvent * event) { GstFlowReturn res = GST_FLOW_OK; gboolean ret = TRUE; GstGdkPixbuf *pixbuf; pixbuf = GST_GDK_PIXBUF (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: if (pixbuf->pixbuf_loader != NULL) { gdk_pixbuf_loader_close (pixbuf->pixbuf_loader, NULL); res = gst_gdk_pixbuf_flush (pixbuf); g_object_unref (G_OBJECT (pixbuf->pixbuf_loader)); pixbuf->pixbuf_loader = NULL; /* as long as we don't have flow returns for event functions we need * to post an error here, or the application might never know that * things failed */ if (res != GST_FLOW_OK && res != GST_FLOW_WRONG_STATE) { GST_ELEMENT_ERROR (pixbuf, STREAM, FAILED, (NULL), ("Flow: %s", gst_flow_get_name (res))); } } break; case GST_EVENT_NEWSEGMENT: case GST_EVENT_FLUSH_STOP: if (pixbuf->pixbuf_loader != NULL) { gdk_pixbuf_loader_close (pixbuf->pixbuf_loader, NULL); g_object_unref (G_OBJECT (pixbuf->pixbuf_loader)); pixbuf->pixbuf_loader = NULL; } break; default: break; } if (res == GST_FLOW_OK) { ret = gst_pad_event_default (pad, event); } else { ret = FALSE; } gst_object_unref (pixbuf); return ret; } static GstFlowReturn gst_gdk_pixbuf_chain (GstPad * pad, GstBuffer * buf) { GstGdkPixbuf *filter; GstFlowReturn ret = GST_FLOW_OK; GError *error = NULL; GstClockTime timestamp; guint8 *data; guint size; filter = GST_GDK_PIXBUF (gst_pad_get_parent (pad)); timestamp = GST_BUFFER_TIMESTAMP (buf); if (GST_CLOCK_TIME_IS_VALID (timestamp)) filter->last_timestamp = timestamp; GST_LOG_OBJECT (filter, "buffer with ts: %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (filter->pixbuf_loader == NULL) filter->pixbuf_loader = gdk_pixbuf_loader_new (); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); GST_LOG_OBJECT (filter, "Writing buffer size %d", size); if (!gdk_pixbuf_loader_write (filter->pixbuf_loader, data, size, &error)) goto error; /* packetised mode? */ if (filter->framerate_numerator != 0) { gdk_pixbuf_loader_close (filter->pixbuf_loader, NULL); ret = gst_gdk_pixbuf_flush (filter); g_object_unref (filter->pixbuf_loader); filter->pixbuf_loader = NULL; } gst_buffer_unref (buf); gst_object_unref (filter); return ret; /* ERRORS */ error: { GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), ("gdk_pixbuf_loader_write error: %s", error->message)); g_error_free (error); gst_buffer_unref (buf); gst_object_unref (filter); return GST_FLOW_ERROR; } } static void gst_gdk_pixbuf_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { switch (prop_id) { case ARG_SILENT: /* filter->silent = g_value_get_boolean (value); */ break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_gdk_pixbuf_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { switch (prop_id) { case ARG_SILENT: /* g_value_set_boolean (value, filter->silent); */ break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_gdk_pixbuf_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstGdkPixbuf *dec = GST_GDK_PIXBUF (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: /* default to single image mode, setcaps function might not be called */ dec->framerate_numerator = 0; dec->framerate_denominator = 1; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: dec->framerate_numerator = 0; dec->framerate_denominator = 0; break; default: break; } return ret; } #define GST_GDK_PIXBUF_TYPE_FIND_SIZE 1024 #ifdef enable_typefind static void gst_gdk_pixbuf_type_find (GstTypeFind * tf, gpointer ignore) { guint8 *data; GdkPixbufLoader *pixbuf_loader; GdkPixbufFormat *format; data = gst_type_find_peek (tf, 0, GST_GDK_PIXBUF_TYPE_FIND_SIZE); if (data == NULL) return; GST_DEBUG ("creating new loader"); pixbuf_loader = gdk_pixbuf_loader_new (); gdk_pixbuf_loader_write (pixbuf_loader, data, GST_GDK_PIXBUF_TYPE_FIND_SIZE, NULL); format = gdk_pixbuf_loader_get_format (pixbuf_loader); if (format != NULL) { GstCaps *caps; gchar **p; gchar **mlist = gdk_pixbuf_format_get_mime_types (format); for (p = mlist; *p; ++p) { GST_DEBUG ("suggesting mime type %s", *p); caps = gst_caps_new_simple (*p, NULL); gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, caps); gst_caps_free (caps); } g_strfreev (mlist); } GST_DEBUG ("closing pixbuf loader, hope it doesn't hang ..."); /* librsvg 2.4.x has a bug where it triggers an endless loop in trying to close a gzip that's not an svg; fixed upstream but no good way to work around it */ gdk_pixbuf_loader_close (pixbuf_loader, NULL); GST_DEBUG ("closed pixbuf loader"); g_object_unref (G_OBJECT (pixbuf_loader)); } #endif /* entry point to initialize the plug-in * initialize the plug-in itself * register the element factories and pad templates * register the features */ static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_gdk_pixbuf_debug, "gdkpixbuf", 0, "gdk pixbuf loader"); if (!gst_element_register (plugin, "gdkpixbufdec", GST_RANK_SECONDARY, GST_TYPE_GDK_PIXBUF)) return FALSE; #ifdef enable_typefind gst_type_find_register (plugin, "image/*", GST_RANK_MARGINAL, gst_gdk_pixbuf_type_find, NULL, GST_CAPS_ANY, NULL); #endif if (!gst_element_register (plugin, "gdkpixbufsink", GST_RANK_NONE, GST_TYPE_GDK_PIXBUF_SINK)) return FALSE; if (!pixbufscale_init (plugin)) return FALSE; /* plugin initialisation succeeded */ return TRUE; } /* this is the structure that gst-register looks for * so keep the name plugin_desc, or you cannot get your plug-in registered */ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "gdkpixbuf", "GdkPixbuf-based image decoder, scaler and sink", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/gdk_pixbuf/gstgdkanimation.h0000644000175000017500000001101011671175352020256 00000000000000/* * Copyright (C) 2003 Benjamin Otte * * 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_LOADER_H__ #define __GST_LOADER_H__ #include #include #include #include #include G_BEGIN_DECLS /* how many bytes we need to have available before we dare to start a new iteration */ #define GST_GDK_BUFFER_SIZE (102400) /* how far behind we need to be before we attempt to seek */ #define GST_GDK_MAX_DELAY_TO_SEEK (GST_SECOND / 4) #define GST_TYPE_GDK_ANIMATION (gst_gdk_animation_get_type()) #define GST_GDK_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_ANIMATION,GstGdkAnimation)) #define GST_GDK_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_ANIMATION,GstGdkAnimationClass)) #define GST_IS_GDK_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_ANIMATION)) #define GST_IS_GDK_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_ANIMATION)) typedef struct _GstGdkAnimation GstGdkAnimation; typedef struct _GstGdkAnimationClass GstGdkAnimationClass; typedef struct _GstGdkAnimationIter GstGdkAnimationIter; typedef struct _GstGdkAnimationIterClass GstGdkAnimationIterClass; struct _GstGdkAnimation { GdkPixbufAnimation parent; /* name of temporary buffer file */ gchar * temp_location; /* file descriptor to temporary file or 0 if we're done writing */ int temp_fd; /* size of image */ gint width; gint height; gint bpp; /* static image we use */ GdkPixbuf * pixbuf; }; struct _GstGdkAnimationClass { GdkPixbufAnimationClass parent_class; }; GType gst_gdk_animation_get_type (void); GstGdkAnimation * gst_gdk_animation_new (GError **error); gboolean gst_gdk_animation_add_data (GstGdkAnimation * ani, const guint8 * data, guint size); void gst_gdk_animation_done_adding (GstGdkAnimation * ani); #define GST_TYPE_GDK_ANIMATION_ITER (gst_gdk_animation_iter_get_type ()) #define GST_GDK_ANIMATION_ITER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIter)) #define GST_IS_GDK_ANIMATION_ITER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GST_TYPE_GDK_ANIMATION_ITER)) #define GST_GDK_ANIMATION_ITER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIterClass)) #define GST_IS_GDK_ANIMATION_ITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GDK_ANIMATION_ITER)) #define GST_GDK_ANIMATION_ITER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GDK_ANIMATION_ITER, GstGdkAnimationIterClass)) struct _GstGdkAnimationIter { GdkPixbufAnimationIter parent; /* our animation */ GstGdkAnimation * ani; /* start timeval */ GTimeVal start; /* timestamp of last buffer */ GstClockTime last_timestamp; /* pipeline we're using */ GstElement * pipeline; gboolean eos; gboolean just_seeked; /* current image and the buffers containing the data */ GdkPixbuf * pixbuf; GQueue * buffers; }; struct _GstGdkAnimationIterClass { GdkPixbufAnimationIterClass parent_class; }; GType gst_gdk_animation_iter_get_type (void) G_GNUC_CONST; G_END_DECLS #endif /* __GST_GDK_ANIMATION_H__ */ gst-plugins-good-0.10.31/ext/libpng/0000755000175000017500000000000011720565322014135 500000000000000gst-plugins-good-0.10.31/ext/libpng/gstpngdec.h0000644000175000017500000000404511671175352016214 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_PNGDEC_H__ #define __GST_PNGDEC_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_PNGDEC (gst_pngdec_get_type()) #define GST_PNGDEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PNGDEC,GstPngDec)) #define GST_PNGDEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PNGDEC,GstPngDecClass)) #define GST_IS_PNGDEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PNGDEC)) #define GST_IS_PNGDEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PNGDEC)) typedef struct _GstPngDec GstPngDec; typedef struct _GstPngDecClass GstPngDecClass; struct _GstPngDec { GstElement element; GstPad *sinkpad, *srcpad; gboolean need_newsegment; /* Progressive */ GstBuffer *buffer_out; GstFlowReturn ret; png_uint_32 rowbytes; /* Pull range */ gint offset; png_structp png; png_infop info; png_infop endinfo; gboolean setup; gint width; gint height; gint bpp; gint color_type; gint fps_n; gint fps_d; /* Chain */ gboolean framed; GstClockTime in_timestamp; GstClockTime in_duration; GstSegment segment; gboolean image_ready; }; struct _GstPngDecClass { GstElementClass parent_class; }; GType gst_pngdec_get_type(void); G_END_DECLS #endif /* __GST_PNGDEC_H__ */ gst-plugins-good-0.10.31/ext/libpng/Makefile.am0000644000175000017500000000063411677341654016127 00000000000000plugin_LTLIBRARIES = libgstpng.la libgstpng_la_SOURCES = gstpng.c gstpngenc.c gstpngdec.c libgstpng_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBPNG_CFLAGS) libgstpng_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ $(GST_LIBS) $(LIBPNG_LIBS) libgstpng_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstpng_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstpngdec.h gstpngenc.h gst-plugins-good-0.10.31/ext/libpng/gstpngdec.c0000644000175000017500000005776411677341654016235 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-pngdec * * Decodes png images. If there is no framerate set on sink caps, it sends EOS * after the first picture. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstpngdec.h" #include #include #include #include GST_DEBUG_CATEGORY_STATIC (pngdec_debug); #define GST_CAT_DEFAULT pngdec_debug static void gst_pngdec_base_init (gpointer g_class); static void gst_pngdec_class_init (GstPngDecClass * klass); static void gst_pngdec_init (GstPngDec * pngdec); static gboolean gst_pngdec_libpng_init (GstPngDec * pngdec); static gboolean gst_pngdec_libpng_clear (GstPngDec * pngdec); static GstStateChangeReturn gst_pngdec_change_state (GstElement * element, GstStateChange transition); static gboolean gst_pngdec_sink_activate_push (GstPad * sinkpad, gboolean active); static gboolean gst_pngdec_sink_activate_pull (GstPad * sinkpad, gboolean active); static gboolean gst_pngdec_sink_activate (GstPad * sinkpad); static GstFlowReturn gst_pngdec_caps_create_and_set (GstPngDec * pngdec); static void gst_pngdec_task (GstPad * pad); static GstFlowReturn gst_pngdec_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_pngdec_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_pngdec_sink_setcaps (GstPad * pad, GstCaps * caps); static GstElementClass *parent_class = NULL; GType gst_pngdec_get_type (void) { static GType pngdec_type = 0; if (!pngdec_type) { static const GTypeInfo pngdec_info = { sizeof (GstPngDecClass), gst_pngdec_base_init, NULL, (GClassInitFunc) gst_pngdec_class_init, NULL, NULL, sizeof (GstPngDec), 0, (GInstanceInitFunc) gst_pngdec_init, }; pngdec_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPngDec", &pngdec_info, 0); } return pngdec_type; } static GstStaticPadTemplate gst_pngdec_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_ARGB_64) ); static GstStaticPadTemplate gst_pngdec_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/png") ); static void gst_pngdec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_pngdec_src_pad_template); gst_element_class_add_static_pad_template (element_class, &gst_pngdec_sink_pad_template); gst_element_class_set_details_simple (element_class, "PNG image decoder", "Codec/Decoder/Image", "Decode a png video frame to a raw image", "Wim Taymans "); } static void gst_pngdec_class_init (GstPngDecClass * klass) { GstElementClass *gstelement_class; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gstelement_class->change_state = gst_pngdec_change_state; GST_DEBUG_CATEGORY_INIT (pngdec_debug, "pngdec", 0, "PNG image decoder"); } static void gst_pngdec_init (GstPngDec * pngdec) { pngdec->sinkpad = gst_pad_new_from_static_template (&gst_pngdec_sink_pad_template, "sink"); gst_pad_set_activate_function (pngdec->sinkpad, gst_pngdec_sink_activate); gst_pad_set_activatepush_function (pngdec->sinkpad, gst_pngdec_sink_activate_push); gst_pad_set_activatepull_function (pngdec->sinkpad, gst_pngdec_sink_activate_pull); gst_pad_set_chain_function (pngdec->sinkpad, gst_pngdec_chain); gst_pad_set_event_function (pngdec->sinkpad, gst_pngdec_sink_event); gst_pad_set_setcaps_function (pngdec->sinkpad, gst_pngdec_sink_setcaps); gst_element_add_pad (GST_ELEMENT (pngdec), pngdec->sinkpad); pngdec->srcpad = gst_pad_new_from_static_template (&gst_pngdec_src_pad_template, "src"); gst_pad_use_fixed_caps (pngdec->srcpad); gst_element_add_pad (GST_ELEMENT (pngdec), pngdec->srcpad); pngdec->buffer_out = NULL; pngdec->png = NULL; pngdec->info = NULL; pngdec->endinfo = NULL; pngdec->setup = FALSE; pngdec->color_type = -1; pngdec->width = -1; pngdec->height = -1; pngdec->bpp = -1; pngdec->fps_n = 0; pngdec->fps_d = 1; pngdec->in_timestamp = GST_CLOCK_TIME_NONE; pngdec->in_duration = GST_CLOCK_TIME_NONE; gst_segment_init (&pngdec->segment, GST_FORMAT_UNDEFINED); pngdec->image_ready = FALSE; } static void user_error_fn (png_structp png_ptr, png_const_charp error_msg) { GST_ERROR ("%s", error_msg); } static void user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) { GST_WARNING ("%s", warning_msg); } static void user_info_callback (png_structp png_ptr, png_infop info) { GstPngDec *pngdec = NULL; GstFlowReturn ret = GST_FLOW_OK; size_t buffer_size; GstBuffer *buffer = NULL; pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); GST_LOG ("info ready"); /* Generate the caps and configure */ ret = gst_pngdec_caps_create_and_set (pngdec); if (ret != GST_FLOW_OK) { goto beach; } /* Allocate output buffer */ pngdec->rowbytes = png_get_rowbytes (pngdec->png, pngdec->info); if (pngdec->rowbytes > (G_MAXUINT32 - 3) || pngdec->height > G_MAXUINT32 / pngdec->rowbytes) { ret = GST_FLOW_ERROR; goto beach; } pngdec->rowbytes = GST_ROUND_UP_4 (pngdec->rowbytes); buffer_size = pngdec->height * pngdec->rowbytes; ret = gst_pad_alloc_buffer_and_set_caps (pngdec->srcpad, GST_BUFFER_OFFSET_NONE, buffer_size, GST_PAD_CAPS (pngdec->srcpad), &buffer); if (ret != GST_FLOW_OK) { goto beach; } pngdec->buffer_out = buffer; beach: pngdec->ret = ret; } static void user_endrow_callback (png_structp png_ptr, png_bytep new_row, png_uint_32 row_num, int pass) { GstPngDec *pngdec = NULL; pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); /* FIXME: implement interlaced pictures */ /* If buffer_out doesn't exist, it means buffer_alloc failed, which * will already have set the return code */ if (GST_IS_BUFFER (pngdec->buffer_out)) { size_t offset = row_num * pngdec->rowbytes; GST_LOG ("got row %u, copying in buffer %p at offset %" G_GSIZE_FORMAT, (guint) row_num, pngdec->buffer_out, offset); memcpy (GST_BUFFER_DATA (pngdec->buffer_out) + offset, new_row, pngdec->rowbytes); pngdec->ret = GST_FLOW_OK; } } static gboolean buffer_clip (GstPngDec * dec, GstBuffer * buffer) { gboolean res = TRUE; gint64 cstart, cstop; if ((!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))) || (!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer))) || (dec->segment.format != GST_FORMAT_TIME)) goto beach; cstart = GST_BUFFER_TIMESTAMP (buffer); cstop = GST_BUFFER_DURATION (buffer); if ((res = gst_segment_clip (&dec->segment, GST_FORMAT_TIME, cstart, cstart + cstop, &cstart, &cstop))) { GST_BUFFER_TIMESTAMP (buffer) = cstart; GST_BUFFER_DURATION (buffer) = cstop - cstart; } beach: return res; } static void user_end_callback (png_structp png_ptr, png_infop info) { GstPngDec *pngdec = NULL; pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); GST_LOG_OBJECT (pngdec, "and we are done reading this image"); if (!pngdec->buffer_out) return; if (GST_CLOCK_TIME_IS_VALID (pngdec->in_timestamp)) GST_BUFFER_TIMESTAMP (pngdec->buffer_out) = pngdec->in_timestamp; if (GST_CLOCK_TIME_IS_VALID (pngdec->in_duration)) GST_BUFFER_DURATION (pngdec->buffer_out) = pngdec->in_duration; /* buffer clipping */ if (buffer_clip (pngdec, pngdec->buffer_out)) { /* Push our buffer and then EOS if needed */ GST_LOG_OBJECT (pngdec, "pushing buffer with ts=%" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (pngdec->buffer_out))); pngdec->ret = gst_pad_push (pngdec->srcpad, pngdec->buffer_out); } else { GST_LOG_OBJECT (pngdec, "dropped decoded buffer"); gst_buffer_unref (pngdec->buffer_out); } pngdec->buffer_out = NULL; pngdec->image_ready = TRUE; } static void user_read_data (png_structp png_ptr, png_bytep data, png_size_t length) { GstPngDec *pngdec; GstBuffer *buffer; GstFlowReturn ret = GST_FLOW_OK; guint size; pngdec = GST_PNGDEC (png_get_io_ptr (png_ptr)); GST_LOG ("reading %" G_GSIZE_FORMAT " bytes of data at offset %d", length, pngdec->offset); ret = gst_pad_pull_range (pngdec->sinkpad, pngdec->offset, length, &buffer); if (ret != GST_FLOW_OK) goto pause; size = GST_BUFFER_SIZE (buffer); if (size != length) goto short_buffer; memcpy (data, GST_BUFFER_DATA (buffer), size); gst_buffer_unref (buffer); pngdec->offset += length; return; /* ERRORS */ pause: { GST_INFO_OBJECT (pngdec, "pausing task, reason %s", gst_flow_get_name (ret)); gst_pad_pause_task (pngdec->sinkpad); if (ret == GST_FLOW_UNEXPECTED) { gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); } else if (ret < GST_FLOW_UNEXPECTED || ret == GST_FLOW_NOT_LINKED) { GST_ELEMENT_ERROR (pngdec, STREAM, FAILED, (_("Internal data stream error.")), ("stream stopped, reason %s", gst_flow_get_name (ret))); gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); } png_error (png_ptr, "Internal data stream error."); return; } short_buffer: { gst_buffer_unref (buffer); GST_ELEMENT_ERROR (pngdec, STREAM, FAILED, (_("Internal data stream error.")), ("Read %u, needed %" G_GSIZE_FORMAT "bytes", size, length)); ret = GST_FLOW_ERROR; goto pause; } } static GstFlowReturn gst_pngdec_caps_create_and_set (GstPngDec * pngdec) { GstFlowReturn ret = GST_FLOW_OK; GstCaps *caps = NULL, *res = NULL; GstPadTemplate *templ = NULL; gint bpc = 0, color_type; png_uint_32 width, height; g_return_val_if_fail (GST_IS_PNGDEC (pngdec), GST_FLOW_ERROR); /* Get bits per channel */ bpc = png_get_bit_depth (pngdec->png, pngdec->info); if (bpc > 8) { /* Add alpha channel if 16-bit depth */ png_set_add_alpha (pngdec->png, 0xffff, PNG_FILLER_BEFORE); png_set_swap (pngdec->png); } /* Get Color type */ color_type = png_get_color_type (pngdec->png, pngdec->info); #if 0 /* We used to have this HACK to reverse the outgoing bytes, but the problem * that originally required the hack seems to have been in ffmpegcolorspace's * RGBA descriptions. It doesn't seem needed now that's fixed, but might * still be needed on big-endian systems, I'm not sure. J.S. 6/7/2007 */ if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) png_set_bgr (pngdec->png); #endif /* Gray scale converted to RGB and upscaled to 8 bits */ if ((color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || (color_type == PNG_COLOR_TYPE_GRAY)) { GST_LOG_OBJECT (pngdec, "converting grayscale png to RGB"); png_set_gray_to_rgb (pngdec->png); if (bpc < 8) { /* Convert to 8 bits */ GST_LOG_OBJECT (pngdec, "converting grayscale image to 8 bits"); #if PNG_LIBPNG_VER < 10400 png_set_gray_1_2_4_to_8 (pngdec->png); #else png_set_expand_gray_1_2_4_to_8 (pngdec->png); #endif } } /* Palette converted to RGB */ if (color_type == PNG_COLOR_TYPE_PALETTE) { GST_LOG_OBJECT (pngdec, "converting palette png to RGB"); png_set_palette_to_rgb (pngdec->png); } /* Update the info structure */ png_read_update_info (pngdec->png, pngdec->info); /* Get IHDR header again after transformation settings */ png_get_IHDR (pngdec->png, pngdec->info, &width, &height, &bpc, &pngdec->color_type, NULL, NULL, NULL); pngdec->width = width; pngdec->height = height; GST_LOG_OBJECT (pngdec, "this is a %dx%d PNG image", pngdec->width, pngdec->height); switch (pngdec->color_type) { case PNG_COLOR_TYPE_RGB: GST_LOG_OBJECT (pngdec, "we have no alpha channel, depth is 24 bits"); pngdec->bpp = 3 * bpc; break; case PNG_COLOR_TYPE_RGB_ALPHA: GST_LOG_OBJECT (pngdec, "we have an alpha channel, depth is 32 bits"); pngdec->bpp = 4 * bpc; break; default: GST_ELEMENT_ERROR (pngdec, STREAM, NOT_IMPLEMENTED, (NULL), ("pngdec does not support this color type")); ret = GST_FLOW_NOT_SUPPORTED; goto beach; } caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, pngdec->width, "height", G_TYPE_INT, pngdec->height, "bpp", G_TYPE_INT, pngdec->bpp, "framerate", GST_TYPE_FRACTION, pngdec->fps_n, pngdec->fps_d, NULL); templ = gst_static_pad_template_get (&gst_pngdec_src_pad_template); res = gst_caps_intersect (caps, gst_pad_template_get_caps (templ)); gst_caps_unref (caps); gst_object_unref (templ); if (!gst_pad_set_caps (pngdec->srcpad, res)) ret = GST_FLOW_NOT_NEGOTIATED; GST_DEBUG_OBJECT (pngdec, "our caps %" GST_PTR_FORMAT, res); gst_caps_unref (res); /* Push a newsegment event */ if (pngdec->need_newsegment) { gst_pad_push_event (pngdec->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0)); pngdec->need_newsegment = FALSE; } beach: return ret; } static void gst_pngdec_task (GstPad * pad) { GstPngDec *pngdec; GstBuffer *buffer = NULL; size_t buffer_size = 0; gint i = 0; png_bytep *rows, inp; png_uint_32 rowbytes; GstFlowReturn ret = GST_FLOW_OK; pngdec = GST_PNGDEC (GST_OBJECT_PARENT (pad)); GST_LOG_OBJECT (pngdec, "read frame"); /* Let libpng come back here on error */ if (setjmp (png_jmpbuf (pngdec->png))) { ret = GST_FLOW_ERROR; goto pause; } /* Set reading callback */ png_set_read_fn (pngdec->png, pngdec, user_read_data); /* Read info */ png_read_info (pngdec->png, pngdec->info); /* Generate the caps and configure */ ret = gst_pngdec_caps_create_and_set (pngdec); if (ret != GST_FLOW_OK) { goto pause; } /* Allocate output buffer */ rowbytes = png_get_rowbytes (pngdec->png, pngdec->info); if (rowbytes > (G_MAXUINT32 - 3) || pngdec->height > G_MAXUINT32 / rowbytes) { ret = GST_FLOW_ERROR; goto pause; } rowbytes = GST_ROUND_UP_4 (rowbytes); buffer_size = pngdec->height * rowbytes; ret = gst_pad_alloc_buffer_and_set_caps (pngdec->srcpad, GST_BUFFER_OFFSET_NONE, buffer_size, GST_PAD_CAPS (pngdec->srcpad), &buffer); if (ret != GST_FLOW_OK) goto pause; rows = (png_bytep *) g_malloc (sizeof (png_bytep) * pngdec->height); inp = GST_BUFFER_DATA (buffer); for (i = 0; i < pngdec->height; i++) { rows[i] = inp; inp += rowbytes; } /* Read the actual picture */ png_read_image (pngdec->png, rows); g_free (rows); /* Push the raw RGB frame */ ret = gst_pad_push (pngdec->srcpad, buffer); if (ret != GST_FLOW_OK) goto pause; /* And we are done */ gst_pad_pause_task (pngdec->sinkpad); gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); return; pause: { GST_INFO_OBJECT (pngdec, "pausing task, reason %s", gst_flow_get_name (ret)); gst_pad_pause_task (pngdec->sinkpad); if (ret == GST_FLOW_UNEXPECTED) { gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { GST_ELEMENT_ERROR (pngdec, STREAM, FAILED, (_("Internal data stream error.")), ("stream stopped, reason %s", gst_flow_get_name (ret))); gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); } } } static GstFlowReturn gst_pngdec_chain (GstPad * pad, GstBuffer * buffer) { GstPngDec *pngdec; GstFlowReturn ret = GST_FLOW_OK; pngdec = GST_PNGDEC (gst_pad_get_parent (pad)); GST_LOG_OBJECT (pngdec, "Got buffer, size=%u", GST_BUFFER_SIZE (buffer)); if (G_UNLIKELY (!pngdec->setup)) goto not_configured; /* Something is going wrong in our callbacks */ ret = pngdec->ret; if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING_OBJECT (pngdec, "we have a pending return code of %d", ret); goto beach; } /* Let libpng come back here on error */ if (setjmp (png_jmpbuf (pngdec->png))) { GST_WARNING_OBJECT (pngdec, "error during decoding"); ret = GST_FLOW_ERROR; goto beach; } pngdec->in_timestamp = GST_BUFFER_TIMESTAMP (buffer); pngdec->in_duration = GST_BUFFER_DURATION (buffer); /* Progressive loading of the PNG image */ png_process_data (pngdec->png, pngdec->info, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); if (pngdec->image_ready) { if (pngdec->framed) { /* Reset ourselves for the next frame */ gst_pngdec_libpng_clear (pngdec); gst_pngdec_libpng_init (pngdec); GST_LOG_OBJECT (pngdec, "setting up callbacks for next frame"); png_set_progressive_read_fn (pngdec->png, pngdec, user_info_callback, user_endrow_callback, user_end_callback); } else { GST_LOG_OBJECT (pngdec, "sending EOS"); pngdec->ret = gst_pad_push_event (pngdec->srcpad, gst_event_new_eos ()); } pngdec->image_ready = FALSE; } /* grab new return code */ ret = pngdec->ret; /* And release the buffer */ gst_buffer_unref (buffer); beach: gst_object_unref (pngdec); return ret; /* ERRORS */ not_configured: { GST_LOG_OBJECT (pngdec, "we are not configured yet"); ret = GST_FLOW_WRONG_STATE; goto beach; } } static gboolean gst_pngdec_sink_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *s; GstPngDec *pngdec; gint num, denom; pngdec = GST_PNGDEC (gst_pad_get_parent (pad)); s = gst_caps_get_structure (caps, 0); if (gst_structure_get_fraction (s, "framerate", &num, &denom)) { GST_DEBUG_OBJECT (pngdec, "framed input"); pngdec->framed = TRUE; pngdec->fps_n = num; pngdec->fps_d = denom; } else { GST_DEBUG_OBJECT (pngdec, "single picture input"); pngdec->framed = FALSE; pngdec->fps_n = 0; pngdec->fps_d = 1; } gst_object_unref (pngdec); return TRUE; } static gboolean gst_pngdec_sink_event (GstPad * pad, GstEvent * event) { GstPngDec *pngdec; gboolean res; pngdec = GST_PNGDEC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT:{ gdouble rate, arate; gboolean update; gint64 start, stop, position; GstFormat fmt; gst_event_parse_new_segment_full (event, &update, &rate, &arate, &fmt, &start, &stop, &position); gst_segment_set_newsegment_full (&pngdec->segment, update, rate, arate, fmt, start, stop, position); GST_LOG_OBJECT (pngdec, "NEWSEGMENT (%s)", gst_format_get_name (fmt)); if (fmt == GST_FORMAT_TIME) { pngdec->need_newsegment = FALSE; res = gst_pad_push_event (pngdec->srcpad, event); } else { gst_event_unref (event); res = TRUE; } break; } case GST_EVENT_FLUSH_STOP: { gst_pngdec_libpng_clear (pngdec); gst_pngdec_libpng_init (pngdec); png_set_progressive_read_fn (pngdec->png, pngdec, user_info_callback, user_endrow_callback, user_end_callback); pngdec->ret = GST_FLOW_OK; gst_segment_init (&pngdec->segment, GST_FORMAT_UNDEFINED); res = gst_pad_push_event (pngdec->srcpad, event); break; } case GST_EVENT_EOS: { GST_LOG_OBJECT (pngdec, "EOS"); gst_pngdec_libpng_clear (pngdec); pngdec->ret = GST_FLOW_UNEXPECTED; res = gst_pad_push_event (pngdec->srcpad, event); break; } default: res = gst_pad_push_event (pngdec->srcpad, event); break; } gst_object_unref (pngdec); return res; } /* Clean up the libpng structures */ static gboolean gst_pngdec_libpng_clear (GstPngDec * pngdec) { png_infopp info = NULL, endinfo = NULL; g_return_val_if_fail (GST_IS_PNGDEC (pngdec), FALSE); GST_LOG ("cleaning up libpng structures"); if (pngdec->info) { info = &pngdec->info; } if (pngdec->endinfo) { endinfo = &pngdec->endinfo; } if (pngdec->png) { png_destroy_read_struct (&(pngdec->png), info, endinfo); pngdec->png = NULL; pngdec->info = NULL; pngdec->endinfo = NULL; } pngdec->bpp = pngdec->color_type = pngdec->height = pngdec->width = -1; pngdec->offset = 0; pngdec->rowbytes = 0; pngdec->buffer_out = NULL; pngdec->setup = FALSE; pngdec->in_timestamp = GST_CLOCK_TIME_NONE; pngdec->in_duration = GST_CLOCK_TIME_NONE; return TRUE; } static gboolean gst_pngdec_libpng_init (GstPngDec * pngdec) { g_return_val_if_fail (GST_IS_PNGDEC (pngdec), FALSE); if (pngdec->setup) return TRUE; GST_LOG ("init libpng structures"); /* initialize png struct stuff */ pngdec->png = png_create_read_struct (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, user_error_fn, user_warning_fn); if (pngdec->png == NULL) goto init_failed; pngdec->info = png_create_info_struct (pngdec->png); if (pngdec->info == NULL) goto info_failed; pngdec->endinfo = png_create_info_struct (pngdec->png); if (pngdec->endinfo == NULL) goto endinfo_failed; pngdec->setup = TRUE; return TRUE; /* ERRORS */ init_failed: { GST_ELEMENT_ERROR (pngdec, LIBRARY, INIT, (NULL), ("Failed to initialize png structure")); return FALSE; } info_failed: { gst_pngdec_libpng_clear (pngdec); GST_ELEMENT_ERROR (pngdec, LIBRARY, INIT, (NULL), ("Failed to initialize info structure")); return FALSE; } endinfo_failed: { gst_pngdec_libpng_clear (pngdec); GST_ELEMENT_ERROR (pngdec, LIBRARY, INIT, (NULL), ("Failed to initialize endinfo structure")); return FALSE; } } static GstStateChangeReturn gst_pngdec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstPngDec *pngdec; pngdec = GST_PNGDEC (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_pngdec_libpng_init (pngdec); pngdec->need_newsegment = TRUE; pngdec->framed = FALSE; pngdec->ret = GST_FLOW_OK; gst_segment_init (&pngdec->segment, GST_FORMAT_UNDEFINED); break; default: break; } ret = parent_class->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_pngdec_libpng_clear (pngdec); break; default: break; } return ret; } /* this function gets called when we activate ourselves in push mode. */ static gboolean gst_pngdec_sink_activate_push (GstPad * sinkpad, gboolean active) { GstPngDec *pngdec; pngdec = GST_PNGDEC (GST_OBJECT_PARENT (sinkpad)); pngdec->ret = GST_FLOW_OK; if (active) { /* Let libpng come back here on error */ if (setjmp (png_jmpbuf (pngdec->png))) goto setup_failed; GST_LOG ("setting up progressive loading callbacks"); png_set_progressive_read_fn (pngdec->png, pngdec, user_info_callback, user_endrow_callback, user_end_callback); } return TRUE; setup_failed: { GST_LOG ("failed setting up libpng jmpbuf"); gst_pngdec_libpng_clear (pngdec); return FALSE; } } /* this function gets called when we activate ourselves in pull mode. * We can perform random access to the resource and we start a task * to start reading */ static gboolean gst_pngdec_sink_activate_pull (GstPad * sinkpad, gboolean active) { if (active) { return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_pngdec_task, sinkpad); } else { return gst_pad_stop_task (sinkpad); } } /* this function is called when the pad is activated and should start * processing data. * * We check if we can do random access to decide if we work push or * pull based. */ static gboolean gst_pngdec_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) { return gst_pad_activate_pull (sinkpad, TRUE); } else { return gst_pad_activate_push (sinkpad, TRUE); } } gst-plugins-good-0.10.31/ext/libpng/gstpngenc.h0000644000175000017500000000366611677341654016244 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_PNGENC_H__ #define __GST_PNGENC_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define GST_TYPE_PNGENC (gst_pngenc_get_type()) #define GST_PNGENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PNGENC,GstPngEnc)) #define GST_PNGENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PNGENC,GstPngEncClass)) #define GST_IS_PNGENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PNGENC)) #define GST_IS_PNGENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PNGENC)) typedef struct _GstPngEnc GstPngEnc; typedef struct _GstPngEncClass GstPngEncClass; struct _GstPngEnc { GstElement element; GstPad *sinkpad, *srcpad; GstBuffer *buffer_out; guint written; png_structp png_struct_ptr; png_infop png_info_ptr; gint png_color_type; gint width; gint height; gint stride; guint compression_level; gboolean snapshot; gboolean newmedia; }; struct _GstPngEncClass { GstElementClass parent_class; }; GType gst_pngenc_get_type(void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __GST_PNGENC_H__ */ gst-plugins-good-0.10.31/ext/libpng/gstpng.c0000644000175000017500000000227711671175352015540 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * Filter: * Copyright (C) 2000 Donald A. Graft * * 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 #endif #include #include #include "gstpngdec.h" #include "gstpngenc.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "pngdec", GST_RANK_PRIMARY, GST_TYPE_PNGDEC)) return FALSE; if (!gst_element_register (plugin, "pngenc", GST_RANK_PRIMARY, GST_TYPE_PNGENC)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "png", "PNG plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/libpng/gstpngenc.c0000644000175000017500000003017111677341654016226 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * Filter: * Copyright (C) 2000 Donald A. Graft * * 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-pngenc * * Encodes png images. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstpngenc.h" #include #include GST_DEBUG_CATEGORY_STATIC (pngenc_debug); #define GST_CAT_DEFAULT pngenc_debug /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_SNAPSHOT TRUE /* #define DEFAULT_NEWMEDIA FALSE */ #define DEFAULT_COMPRESSION_LEVEL 6 enum { ARG_0, ARG_SNAPSHOT, /* ARG_NEWMEDIA, */ ARG_COMPRESSION_LEVEL }; static GstStaticPadTemplate pngenc_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/png, " "width = (int) [ 16, 1000000 ], " "height = (int) [ 16, 1000000 ], " "framerate = " GST_VIDEO_FPS_RANGE) ); static GstStaticPadTemplate pngenc_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_GRAY8) ); /* static GstElementClass *parent_class = NULL; */ GST_BOILERPLATE (GstPngEnc, gst_pngenc, GstElement, GST_TYPE_ELEMENT); static void gst_pngenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pngenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_pngenc_chain (GstPad * pad, GstBuffer * data); static void user_error_fn (png_structp png_ptr, png_const_charp error_msg) { g_warning ("%s", error_msg); } static void user_warning_fn (png_structp png_ptr, png_const_charp warning_msg) { g_warning ("%s", warning_msg); } static void gst_pngenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &pngenc_sink_template); gst_element_class_add_static_pad_template (element_class, &pngenc_src_template); gst_element_class_set_details_simple (element_class, "PNG image encoder", "Codec/Encoder/Image", "Encode a video frame to a .png image", "Jeremy SIMON "); } static void gst_pngenc_class_init (GstPngEncClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->get_property = gst_pngenc_get_property; gobject_class->set_property = gst_pngenc_set_property; g_object_class_install_property (gobject_class, ARG_SNAPSHOT, g_param_spec_boolean ("snapshot", "Snapshot", "Send EOS after encoding a frame, useful for snapshots", DEFAULT_SNAPSHOT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* g_object_class_install_property (gobject_class, ARG_NEWMEDIA, */ /* g_param_spec_boolean ("newmedia", "newmedia", */ /* "Send new media discontinuity after encoding each frame", */ /* DEFAULT_NEWMEDIA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); */ g_object_class_install_property (gobject_class, ARG_COMPRESSION_LEVEL, g_param_spec_uint ("compression-level", "compression-level", "PNG compression level", Z_NO_COMPRESSION, Z_BEST_COMPRESSION, DEFAULT_COMPRESSION_LEVEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (pngenc_debug, "pngenc", 0, "PNG image encoder"); } static gboolean gst_pngenc_setcaps (GstPad * pad, GstCaps * caps) { GstPngEnc *pngenc; GstVideoFormat format; int fps_n, fps_d; GstCaps *pcaps; gboolean ret; pngenc = GST_PNGENC (gst_pad_get_parent (pad)); ret = gst_video_format_parse_caps (caps, &format, &pngenc->width, &pngenc->height); if (G_LIKELY (ret)) ret = gst_video_parse_caps_framerate (caps, &fps_n, &fps_d); if (G_UNLIKELY (!ret)) goto done; switch (format) { case GST_VIDEO_FORMAT_RGBA: pngenc->png_color_type = PNG_COLOR_TYPE_RGBA; break; case GST_VIDEO_FORMAT_RGB: pngenc->png_color_type = PNG_COLOR_TYPE_RGB; break; case GST_VIDEO_FORMAT_GRAY8: pngenc->png_color_type = PNG_COLOR_TYPE_GRAY; break; default: ret = FALSE; goto done; } if (G_UNLIKELY (pngenc->width < 16 || pngenc->width > 1000000 || pngenc->height < 16 || pngenc->height > 1000000)) { ret = FALSE; goto done; } pngenc->stride = gst_video_format_get_row_stride (format, 0, pngenc->width); pcaps = gst_caps_new_simple ("image/png", "width", G_TYPE_INT, pngenc->width, "height", G_TYPE_INT, pngenc->height, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); ret = gst_pad_set_caps (pngenc->srcpad, pcaps); gst_caps_unref (pcaps); /* Fall-through. */ done: if (G_UNLIKELY (!ret)) { pngenc->width = 0; pngenc->height = 0; } gst_object_unref (pngenc); return ret; } static void gst_pngenc_init (GstPngEnc * pngenc, GstPngEncClass * g_class) { /* sinkpad */ pngenc->sinkpad = gst_pad_new_from_static_template (&pngenc_sink_template, "sink"); gst_pad_set_chain_function (pngenc->sinkpad, gst_pngenc_chain); /* gst_pad_set_link_function (pngenc->sinkpad, gst_pngenc_sinklink); */ /* gst_pad_set_getcaps_function (pngenc->sinkpad, gst_pngenc_sink_getcaps); */ gst_pad_set_setcaps_function (pngenc->sinkpad, gst_pngenc_setcaps); gst_element_add_pad (GST_ELEMENT (pngenc), pngenc->sinkpad); /* srcpad */ pngenc->srcpad = gst_pad_new_from_static_template (&pngenc_src_template, "src"); /* pngenc->srcpad = gst_pad_new ("src", GST_PAD_SRC); */ /* gst_pad_set_getcaps_function (pngenc->srcpad, gst_pngenc_src_getcaps); */ /* gst_pad_set_setcaps_function (pngenc->srcpad, gst_pngenc_setcaps); */ gst_element_add_pad (GST_ELEMENT (pngenc), pngenc->srcpad); /* init settings */ pngenc->png_struct_ptr = NULL; pngenc->png_info_ptr = NULL; pngenc->snapshot = DEFAULT_SNAPSHOT; /* pngenc->newmedia = FALSE; */ pngenc->compression_level = DEFAULT_COMPRESSION_LEVEL; } static void user_flush_data (png_structp png_ptr G_GNUC_UNUSED) { } static void user_write_data (png_structp png_ptr, png_bytep data, png_uint_32 length) { GstPngEnc *pngenc; pngenc = (GstPngEnc *) png_get_io_ptr (png_ptr); if (pngenc->written + length >= GST_BUFFER_SIZE (pngenc->buffer_out)) { GST_ERROR_OBJECT (pngenc, "output buffer bigger than the input buffer!?"); png_error (png_ptr, "output buffer bigger than the input buffer!?"); /* never reached */ return; } memcpy (GST_BUFFER_DATA (pngenc->buffer_out) + pngenc->written, data, length); pngenc->written += length; } static GstFlowReturn gst_pngenc_chain (GstPad * pad, GstBuffer * buf) { GstPngEnc *pngenc; gint row_index; png_byte **row_pointers; GstFlowReturn ret = GST_FLOW_OK; GstBuffer *encoded_buf = NULL; pngenc = GST_PNGENC (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (pngenc, "BEGINNING"); if (G_UNLIKELY (pngenc->width <= 0 || pngenc->height <= 0)) { ret = GST_FLOW_NOT_NEGOTIATED; goto done; } if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < pngenc->height * pngenc->stride)) { gst_buffer_unref (buf); GST_ELEMENT_ERROR (pngenc, STREAM, FORMAT, (NULL), ("Provided input buffer is too small, caps problem?")); ret = GST_FLOW_ERROR; goto done; } /* initialize png struct stuff */ pngenc->png_struct_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, user_error_fn, user_warning_fn); if (pngenc->png_struct_ptr == NULL) { gst_buffer_unref (buf); GST_ELEMENT_ERROR (pngenc, LIBRARY, INIT, (NULL), ("Failed to initialize png structure")); ret = GST_FLOW_ERROR; goto done; } pngenc->png_info_ptr = png_create_info_struct (pngenc->png_struct_ptr); if (!pngenc->png_info_ptr) { gst_buffer_unref (buf); png_destroy_write_struct (&(pngenc->png_struct_ptr), (png_infopp) NULL); GST_ELEMENT_ERROR (pngenc, LIBRARY, INIT, (NULL), ("Failed to initialize the png info structure")); ret = GST_FLOW_ERROR; goto done; } /* non-0 return is from a longjmp inside of libpng */ if (setjmp (png_jmpbuf (pngenc->png_struct_ptr)) != 0) { gst_buffer_unref (buf); png_destroy_write_struct (&pngenc->png_struct_ptr, &pngenc->png_info_ptr); GST_ELEMENT_ERROR (pngenc, LIBRARY, FAILED, (NULL), ("returning from longjmp")); ret = GST_FLOW_ERROR; goto done; } png_set_filter (pngenc->png_struct_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE); png_set_compression_level (pngenc->png_struct_ptr, pngenc->compression_level); png_set_IHDR (pngenc->png_struct_ptr, pngenc->png_info_ptr, pngenc->width, pngenc->height, 8, pngenc->png_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_set_write_fn (pngenc->png_struct_ptr, pngenc, (png_rw_ptr) user_write_data, user_flush_data); row_pointers = g_new (png_byte *, pngenc->height); for (row_index = 0; row_index < pngenc->height; row_index++) { row_pointers[row_index] = GST_BUFFER_DATA (buf) + (row_index * pngenc->stride); } /* allocate the output buffer */ pngenc->buffer_out = gst_buffer_new_and_alloc (pngenc->height * pngenc->stride); pngenc->written = 0; png_write_info (pngenc->png_struct_ptr, pngenc->png_info_ptr); png_write_image (pngenc->png_struct_ptr, row_pointers); png_write_end (pngenc->png_struct_ptr, NULL); g_free (row_pointers); encoded_buf = gst_buffer_create_sub (pngenc->buffer_out, 0, pngenc->written); png_destroy_info_struct (pngenc->png_struct_ptr, &pngenc->png_info_ptr); png_destroy_write_struct (&pngenc->png_struct_ptr, (png_infopp) NULL); gst_buffer_copy_metadata (encoded_buf, buf, GST_BUFFER_COPY_TIMESTAMPS); gst_buffer_unref (buf); gst_buffer_set_caps (encoded_buf, GST_PAD_CAPS (pngenc->srcpad)); if ((ret = gst_pad_push (pngenc->srcpad, encoded_buf)) != GST_FLOW_OK) goto done; if (pngenc->snapshot) { GstEvent *event; GST_DEBUG_OBJECT (pngenc, "snapshot mode, sending EOS"); /* send EOS event, since a frame has been pushed out */ event = gst_event_new_eos (); gst_pad_push_event (pngenc->srcpad, event); ret = GST_FLOW_UNEXPECTED; } done: GST_DEBUG_OBJECT (pngenc, "END, ret:%d", ret); if (pngenc->buffer_out != NULL) { gst_buffer_unref (pngenc->buffer_out); pngenc->buffer_out = NULL; } gst_object_unref (pngenc); return ret; } static void gst_pngenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPngEnc *pngenc; pngenc = GST_PNGENC (object); switch (prop_id) { case ARG_SNAPSHOT: g_value_set_boolean (value, pngenc->snapshot); break; /* case ARG_NEWMEDIA: */ /* g_value_set_boolean (value, pngenc->newmedia); */ /* break; */ case ARG_COMPRESSION_LEVEL: g_value_set_uint (value, pngenc->compression_level); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_pngenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPngEnc *pngenc; pngenc = GST_PNGENC (object); switch (prop_id) { case ARG_SNAPSHOT: pngenc->snapshot = g_value_get_boolean (value); break; /* case ARG_NEWMEDIA: */ /* pngenc->newmedia = g_value_get_boolean (value); */ /* break; */ case ARG_COMPRESSION_LEVEL: pngenc->compression_level = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/ext/libpng/Makefile.in0000644000175000017500000007176011720560226016133 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/libpng DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstpng_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstpng_la_OBJECTS = libgstpng_la-gstpng.lo \ libgstpng_la-gstpngenc.lo libgstpng_la-gstpngdec.lo libgstpng_la_OBJECTS = $(am_libgstpng_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstpng_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstpng_la_CFLAGS) $(CFLAGS) \ $(libgstpng_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstpng_la_SOURCES) DIST_SOURCES = $(libgstpng_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstpng.la libgstpng_la_SOURCES = gstpng.c gstpngenc.c gstpngdec.c libgstpng_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBPNG_CFLAGS) libgstpng_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ $(GST_LIBS) $(LIBPNG_LIBS) libgstpng_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstpng_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstpngdec.h gstpngenc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/libpng/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/libpng/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstpng.la: $(libgstpng_la_OBJECTS) $(libgstpng_la_DEPENDENCIES) $(EXTRA_libgstpng_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstpng_la_LINK) -rpath $(plugindir) $(libgstpng_la_OBJECTS) $(libgstpng_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpng_la-gstpng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpng_la-gstpngdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpng_la-gstpngenc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstpng_la-gstpng.lo: gstpng.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -MT libgstpng_la-gstpng.lo -MD -MP -MF $(DEPDIR)/libgstpng_la-gstpng.Tpo -c -o libgstpng_la-gstpng.lo `test -f 'gstpng.c' || echo '$(srcdir)/'`gstpng.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpng_la-gstpng.Tpo $(DEPDIR)/libgstpng_la-gstpng.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpng.c' object='libgstpng_la-gstpng.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -c -o libgstpng_la-gstpng.lo `test -f 'gstpng.c' || echo '$(srcdir)/'`gstpng.c libgstpng_la-gstpngenc.lo: gstpngenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -MT libgstpng_la-gstpngenc.lo -MD -MP -MF $(DEPDIR)/libgstpng_la-gstpngenc.Tpo -c -o libgstpng_la-gstpngenc.lo `test -f 'gstpngenc.c' || echo '$(srcdir)/'`gstpngenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpng_la-gstpngenc.Tpo $(DEPDIR)/libgstpng_la-gstpngenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpngenc.c' object='libgstpng_la-gstpngenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -c -o libgstpng_la-gstpngenc.lo `test -f 'gstpngenc.c' || echo '$(srcdir)/'`gstpngenc.c libgstpng_la-gstpngdec.lo: gstpngdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -MT libgstpng_la-gstpngdec.lo -MD -MP -MF $(DEPDIR)/libgstpng_la-gstpngdec.Tpo -c -o libgstpng_la-gstpngdec.lo `test -f 'gstpngdec.c' || echo '$(srcdir)/'`gstpngdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpng_la-gstpngdec.Tpo $(DEPDIR)/libgstpng_la-gstpngdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpngdec.c' object='libgstpng_la-gstpngdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpng_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpng_la_CFLAGS) $(CFLAGS) -c -o libgstpng_la-gstpngdec.lo `test -f 'gstpngdec.c' || echo '$(srcdir)/'`gstpngdec.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/jpeg/0000755000175000017500000000000011720565322013607 500000000000000gst-plugins-good-0.10.31/ext/jpeg/gstjpegdec.c0000644000175000017500000016235211677341654016036 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Tim-Philipp Müller * * 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-jpegdec * * Decodes jpeg images. * * * Example launch line * |[ * gst-launch -v v4l2src ! jpegdec ! ffmpegcolorspace ! xvimagesink * ]| The above pipeline reads a motion JPEG stream from a v4l2 camera * and renders it to the screen. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstjpegdec.h" #include "gstjpeg.h" #include #include "gst/gst-i18n-plugin.h" #include #define MIN_WIDTH 1 #define MAX_WIDTH 65535 #define MIN_HEIGHT 1 #define MAX_HEIGHT 65535 #define CINFO_GET_JPEGDEC(cinfo_ptr) \ (((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_MAX_ERRORS }; /* *INDENT-OFF* */ static GstStaticPadTemplate gst_jpeg_dec_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") "; " GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_BGR "; " GST_VIDEO_CAPS_RGBx "; " GST_VIDEO_CAPS_xRGB "; " GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_GRAY8) ); /* *INDENT-ON* */ /* FIXME: sof-marker is for IJG libjpeg 8, should be different for 6.2 */ static GstStaticPadTemplate gst_jpeg_dec_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " "width = (int) [ " G_STRINGIFY (MIN_WIDTH) ", " G_STRINGIFY (MAX_WIDTH) " ], " "height = (int) [ " G_STRINGIFY (MIN_HEIGHT) ", " G_STRINGIFY (MAX_HEIGHT) " ], framerate = (fraction) [ 0/1, MAX ], " "sof-marker = (int) { 0, 1, 2, 5, 6, 7, 9, 10, 13, 14 }") ); GST_DEBUG_CATEGORY_STATIC (jpeg_dec_debug); #define GST_CAT_DEFAULT jpeg_dec_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE); /* These macros are adapted from videotestsrc.c * and/or gst-plugins/gst/games/gstvideoimage.c */ #define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) #define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) #define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2) #define I420_Y_OFFSET(w,h) (0) #define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) #define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) #define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) static GstElementClass *parent_class; /* NULL */ static void gst_jpeg_dec_base_init (gpointer g_class); static void gst_jpeg_dec_class_init (GstJpegDecClass * klass); static void gst_jpeg_dec_init (GstJpegDec * jpegdec); static void gst_jpeg_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_jpeg_dec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_jpeg_dec_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_jpeg_dec_getcaps (GstPad * pad); static gboolean gst_jpeg_dec_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_jpeg_dec_src_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_jpeg_dec_change_state (GstElement * element, GstStateChange transition); static void gst_jpeg_dec_update_qos (GstJpegDec * dec, gdouble proportion, GstClockTimeDiff diff, GstClockTime ts); static void gst_jpeg_dec_reset_qos (GstJpegDec * dec); static void gst_jpeg_dec_read_qos (GstJpegDec * dec, gdouble * proportion, GstClockTime * time); GType gst_jpeg_dec_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo jpeg_dec_info = { sizeof (GstJpegDecClass), (GBaseInitFunc) gst_jpeg_dec_base_init, NULL, (GClassInitFunc) gst_jpeg_dec_class_init, NULL, NULL, sizeof (GstJpegDec), 0, (GInstanceInitFunc) gst_jpeg_dec_init, }; type = g_type_register_static (GST_TYPE_ELEMENT, "GstJpegDec", &jpeg_dec_info, 0); } return type; } static void gst_jpeg_dec_finalize (GObject * object) { GstJpegDec *dec = GST_JPEG_DEC (object); jpeg_destroy_decompress (&dec->cinfo); g_object_unref (dec->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_jpeg_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_jpeg_dec_src_pad_template); gst_element_class_add_static_pad_template (element_class, &gst_jpeg_dec_sink_pad_template); gst_element_class_set_details_simple (element_class, "JPEG image decoder", "Codec/Decoder/Image", "Decode images from JPEG format", "Wim Taymans "); } static void gst_jpeg_dec_class_init (GstJpegDecClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; gstelement_class = (GstElementClass *) klass; gobject_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_jpeg_dec_finalize; gobject_class->set_property = gst_jpeg_dec_set_property; gobject_class->get_property = gst_jpeg_dec_get_property; g_object_class_install_property (gobject_class, PROP_IDCT_METHOD, g_param_spec_enum ("idct-method", "IDCT Method", "The IDCT algorithm to use", GST_TYPE_IDCT_METHOD, 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); GST_DEBUG_CATEGORY_INIT (jpeg_dec_debug, "jpegdec", 0, "JPEG decoder"); 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) { GstJpegDec *dec; guint av; dec = CINFO_GET_JPEGDEC (cinfo); g_return_val_if_fail (dec != NULL, FALSE); av = gst_adapter_available_fast (dec->adapter); GST_DEBUG_OBJECT (dec, "fill_input_buffer: fast av=%u, remaining=%u", av, dec->rem_img_len); if (av == 0) { GST_DEBUG_OBJECT (dec, "Out of data"); return FALSE; } if (dec->rem_img_len < av) av = dec->rem_img_len; dec->rem_img_len -= av; g_free (dec->cur_buf); dec->cur_buf = gst_adapter_take (dec->adapter, av); cinfo->src->next_input_byte = dec->cur_buf; cinfo->src->bytes_in_buffer = av; return TRUE; } static void gst_jpeg_dec_init_source (j_decompress_ptr cinfo) { GST_LOG_OBJECT (CINFO_GET_JPEGDEC (cinfo), "init_source"); } static void gst_jpeg_dec_skip_input_data (j_decompress_ptr cinfo, glong num_bytes) { GstJpegDec *dec = CINFO_GET_JPEGDEC (cinfo); GST_DEBUG_OBJECT (dec, "skip %ld bytes", num_bytes); if (num_bytes > 0 && cinfo->src->bytes_in_buffer >= num_bytes) { cinfo->src->next_input_byte += (size_t) num_bytes; cinfo->src->bytes_in_buffer -= (size_t) num_bytes; } else if (num_bytes > 0) { gint available; num_bytes -= cinfo->src->bytes_in_buffer; cinfo->src->next_input_byte += (size_t) cinfo->src->bytes_in_buffer; cinfo->src->bytes_in_buffer = 0; available = gst_adapter_available (dec->adapter); if (available < num_bytes || available < dec->rem_img_len) { GST_WARNING_OBJECT (dec, "Less bytes to skip than available in the " "adapter or the remaining image length %ld < %d or %u", num_bytes, available, dec->rem_img_len); } num_bytes = MIN (MIN (num_bytes, available), dec->rem_img_len); gst_adapter_flush (dec->adapter, num_bytes); dec->rem_img_len -= num_bytes; } } static boolean gst_jpeg_dec_resync_to_restart (j_decompress_ptr cinfo, gint desired) { GST_LOG_OBJECT (CINFO_GET_JPEGDEC (cinfo), "resync_to_start"); return TRUE; } static void gst_jpeg_dec_term_source (j_decompress_ptr cinfo) { GST_LOG_OBJECT (CINFO_GET_JPEGDEC (cinfo), "term_source"); return; } METHODDEF (void) gst_jpeg_dec_my_output_message (j_common_ptr cinfo) { return; /* do nothing */ } METHODDEF (void) gst_jpeg_dec_my_emit_message (j_common_ptr cinfo, int msg_level) { /* GST_LOG_OBJECT (CINFO_GET_JPEGDEC (&cinfo), "msg_level=%d", msg_level); */ return; } METHODDEF (void) gst_jpeg_dec_my_error_exit (j_common_ptr cinfo) { struct GstJpegDecErrorMgr *err_mgr = (struct GstJpegDecErrorMgr *) cinfo->err; (*cinfo->err->output_message) (cinfo); longjmp (err_mgr->setjmp_buffer, 1); } static void gst_jpeg_dec_init (GstJpegDec * dec) { GST_DEBUG ("initializing"); /* create the sink and src pads */ dec->sinkpad = gst_pad_new_from_static_template (&gst_jpeg_dec_sink_pad_template, "sink"); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); gst_pad_set_setcaps_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_jpeg_dec_setcaps)); gst_pad_set_getcaps_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_jpeg_dec_getcaps)); gst_pad_set_chain_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_jpeg_dec_chain)); gst_pad_set_event_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_jpeg_dec_sink_event)); dec->srcpad = gst_pad_new_from_static_template (&gst_jpeg_dec_src_pad_template, "src"); gst_pad_set_event_function (dec->srcpad, GST_DEBUG_FUNCPTR (gst_jpeg_dec_src_event)); gst_pad_use_fixed_caps (dec->srcpad); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); /* setup jpeglib */ memset (&dec->cinfo, 0, sizeof (dec->cinfo)); memset (&dec->jerr, 0, sizeof (dec->jerr)); dec->cinfo.err = jpeg_std_error (&dec->jerr.pub); dec->jerr.pub.output_message = gst_jpeg_dec_my_output_message; dec->jerr.pub.emit_message = gst_jpeg_dec_my_emit_message; dec->jerr.pub.error_exit = gst_jpeg_dec_my_error_exit; jpeg_create_decompress (&dec->cinfo); dec->cinfo.src = (struct jpeg_source_mgr *) &dec->jsrc; dec->cinfo.src->init_source = gst_jpeg_dec_init_source; dec->cinfo.src->fill_input_buffer = gst_jpeg_dec_fill_input_buffer; dec->cinfo.src->skip_input_data = gst_jpeg_dec_skip_input_data; dec->cinfo.src->resync_to_restart = gst_jpeg_dec_resync_to_restart; dec->cinfo.src->term_source = gst_jpeg_dec_term_source; dec->jsrc.dec = dec; /* init properties */ dec->idct_method = JPEG_DEFAULT_IDCT_METHOD; dec->max_errors = JPEG_DEFAULT_MAX_ERRORS; dec->adapter = gst_adapter_new (); } static gboolean gst_jpeg_dec_ensure_header (GstJpegDec * dec) { gint av; gint offset; av = gst_adapter_available (dec->adapter); /* we expect at least 4 bytes, first of which start marker */ offset = gst_adapter_masked_scan_uint32 (dec->adapter, 0xffffff00, 0xffd8ff00, 0, av); if (G_UNLIKELY (offset < 0)) { GST_DEBUG_OBJECT (dec, "No JPEG header in current buffer"); /* not found */ if (av > 4) gst_adapter_flush (dec->adapter, av - 4); return FALSE; } if (offset > 0) { GST_LOG_OBJECT (dec, "Skipping %u bytes.", offset); gst_adapter_flush (dec->adapter, offset); } GST_DEBUG_OBJECT (dec, "Found JPEG header"); return TRUE; } static inline gboolean gst_jpeg_dec_parse_tag_has_entropy_segment (guint8 tag) { if (tag == 0xda || (tag >= 0xd0 && tag <= 0xd7)) return TRUE; return FALSE; } /* returns image length in bytes if parsed successfully, * otherwise 0 if more data needed, * if < 0 the absolute value needs to be flushed */ static gint gst_jpeg_dec_parse_image_data (GstJpegDec * dec) { guint size; gboolean resync; GstAdapter *adapter = dec->adapter; gint offset, noffset; size = gst_adapter_available (adapter); /* we expect at least 4 bytes, first of which start marker */ if (gst_adapter_masked_scan_uint32 (adapter, 0xffff0000, 0xffd80000, 0, 4)) return 0; GST_DEBUG ("Parsing jpeg image data (%u bytes)", size); GST_DEBUG ("Parse state: offset=%d, resync=%d, entropy len=%d", dec->parse_offset, dec->parse_resync, dec->parse_entropy_len); /* offset is 2 less than actual offset; * - adapter needs at least 4 bytes for scanning, * - start and end marker ensure at least that much */ /* resume from state offset */ offset = dec->parse_offset; while (1) { guint frame_len; guint32 value; noffset = gst_adapter_masked_scan_uint32_peek (adapter, 0x0000ff00, 0x0000ff00, offset, size - offset, &value); /* lost sync if 0xff marker not where expected */ if ((resync = (noffset != offset))) { GST_DEBUG ("Lost sync at 0x%08x, resyncing", offset + 2); } /* may have marker, but could have been resyncng */ resync = resync || dec->parse_resync; /* Skip over extra 0xff */ while ((noffset >= 0) && ((value & 0xff) == 0xff)) { noffset++; noffset = gst_adapter_masked_scan_uint32_peek (adapter, 0x0000ff00, 0x0000ff00, noffset, size - noffset, &value); } /* enough bytes left for marker? (we need 0xNN after the 0xff) */ if (noffset < 0) { GST_DEBUG ("at end of input and no EOI marker found, need more data"); goto need_more_data; } /* now lock on the marker we found */ offset = noffset; value = value & 0xff; if (value == 0xd9) { GST_DEBUG ("0x%08x: EOI marker", offset + 2); /* clear parse state */ dec->parse_resync = FALSE; dec->parse_offset = 0; return (offset + 4); } else if (value == 0xd8) { /* Skip this frame if we found another SOI marker */ GST_DEBUG ("0x%08x: SOI marker before EOI, skipping", offset + 2); dec->parse_resync = FALSE; dec->parse_offset = 0; return -(offset + 2); } if (value >= 0xd0 && value <= 0xd7) frame_len = 0; else { /* peek tag and subsequent length */ if (offset + 2 + 4 > size) goto need_more_data; else gst_adapter_masked_scan_uint32_peek (adapter, 0x0, 0x0, offset + 2, 4, &frame_len); frame_len = frame_len & 0xffff; } GST_DEBUG ("0x%08x: tag %02x, frame_len=%u", offset + 2, value, frame_len); /* the frame length includes the 2 bytes for the length; here we want at * least 2 more bytes at the end for an end marker */ if (offset + 2 + 2 + frame_len + 2 > size) { goto need_more_data; } if (gst_jpeg_dec_parse_tag_has_entropy_segment (value)) { guint eseglen = dec->parse_entropy_len; GST_DEBUG ("0x%08x: finding entropy segment length", offset + 2); noffset = offset + 2 + frame_len + dec->parse_entropy_len; while (1) { noffset = gst_adapter_masked_scan_uint32_peek (adapter, 0x0000ff00, 0x0000ff00, noffset, size - noffset, &value); if (noffset < 0) { /* need more data */ dec->parse_entropy_len = size - offset - 4 - frame_len - 2; goto need_more_data; } if ((value & 0xff) != 0x00) { eseglen = noffset - offset - frame_len - 2; break; } noffset++; } dec->parse_entropy_len = 0; frame_len += eseglen; GST_DEBUG ("entropy segment length=%u => frame_len=%u", eseglen, frame_len); } if (resync) { /* check if we will still be in sync if we interpret * this as a sync point and skip this frame */ noffset = offset + frame_len + 2; noffset = gst_adapter_masked_scan_uint32 (adapter, 0x0000ff00, 0x0000ff00, noffset, 4); if (noffset < 0) { /* ignore and continue resyncing until we hit the end * of our data or find a sync point that looks okay */ offset++; continue; } GST_DEBUG ("found sync at 0x%x", offset + 2); } offset += frame_len + 2; } /* EXITS */ need_more_data: { dec->parse_offset = offset; dec->parse_resync = resync; return 0; } } /* shamelessly ripped from jpegutils.c in mjpegtools */ static void add_huff_table (j_decompress_ptr dinfo, JHUFF_TBL ** htblptr, const UINT8 * bits, const UINT8 * val) /* Define a Huffman table */ { int nsymbols, len; if (*htblptr == NULL) *htblptr = jpeg_alloc_huff_table ((j_common_ptr) dinfo); g_assert (*htblptr); /* Copy the number-of-symbols-of-each-code-length counts */ memcpy ((*htblptr)->bits, bits, sizeof ((*htblptr)->bits)); /* Validate the counts. We do this here mainly so we can copy the right * number of symbols from the val[] array, without risking marching off * the end of memory. jchuff.c will do a more thorough test later. */ nsymbols = 0; for (len = 1; len <= 16; len++) nsymbols += bits[len]; if (nsymbols < 1 || nsymbols > 256) g_error ("jpegutils.c: add_huff_table failed badly. "); memcpy ((*htblptr)->huffval, val, nsymbols * sizeof (UINT8)); } static void std_huff_tables (j_decompress_ptr dinfo) /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ /* IMPORTANT: these are only valid for 8-bit data precision! */ { static const UINT8 bits_dc_luminance[17] = { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; static const UINT8 val_dc_luminance[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static const UINT8 bits_dc_chrominance[17] = { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; static const UINT8 val_dc_chrominance[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static const UINT8 bits_ac_luminance[17] = { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; static const UINT8 val_ac_luminance[] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; static const UINT8 bits_ac_chrominance[17] = { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; static const UINT8 val_ac_chrominance[] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; add_huff_table (dinfo, &dinfo->dc_huff_tbl_ptrs[0], bits_dc_luminance, val_dc_luminance); add_huff_table (dinfo, &dinfo->ac_huff_tbl_ptrs[0], bits_ac_luminance, val_ac_luminance); add_huff_table (dinfo, &dinfo->dc_huff_tbl_ptrs[1], bits_dc_chrominance, val_dc_chrominance); add_huff_table (dinfo, &dinfo->ac_huff_tbl_ptrs[1], bits_ac_chrominance, val_ac_chrominance); } static void guarantee_huff_tables (j_decompress_ptr dinfo) { if ((dinfo->dc_huff_tbl_ptrs[0] == NULL) && (dinfo->dc_huff_tbl_ptrs[1] == NULL) && (dinfo->ac_huff_tbl_ptrs[0] == NULL) && (dinfo->ac_huff_tbl_ptrs[1] == NULL)) { GST_DEBUG ("Generating standard Huffman tables for this frame."); std_huff_tables (dinfo); } } static gboolean gst_jpeg_dec_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *s; GstJpegDec *dec; const GValue *framerate; dec = GST_JPEG_DEC (GST_OBJECT_PARENT (pad)); s = gst_caps_get_structure (caps, 0); if ((framerate = gst_structure_get_value (s, "framerate")) != NULL) { dec->framerate_numerator = gst_value_get_fraction_numerator (framerate); dec->framerate_denominator = gst_value_get_fraction_denominator (framerate); dec->packetized = TRUE; GST_DEBUG ("got framerate of %d/%d fps => packetized mode", dec->framerate_numerator, dec->framerate_denominator); } /* do not extract width/height here. we do that in the chain * function on a per-frame basis (including the line[] array * setup) */ /* But we can take the framerate values and set them on the src pad */ return TRUE; } static GstCaps * gst_jpeg_dec_getcaps (GstPad * pad) { GstJpegDec *dec; GstCaps *caps; GstPad *peer; dec = GST_JPEG_DEC (GST_OBJECT_PARENT (pad)); if (GST_PAD_CAPS (pad)) return gst_caps_ref (GST_PAD_CAPS (pad)); peer = gst_pad_get_peer (dec->srcpad); if (peer) { GstCaps *peer_caps; const GstCaps *templ_caps; GstStructure *s; guint i, n; peer_caps = gst_pad_get_caps (peer); /* Translate peercaps to image/jpeg */ peer_caps = gst_caps_make_writable (peer_caps); n = gst_caps_get_size (peer_caps); for (i = 0; i < n; i++) { s = gst_caps_get_structure (peer_caps, i); gst_structure_set_name (s, "image/jpeg"); } templ_caps = gst_pad_get_pad_template_caps (pad); caps = gst_caps_intersect_full (peer_caps, templ_caps, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peer_caps); gst_object_unref (peer); } else { caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); } return caps; } /* yuk */ static void hresamplecpy1 (guint8 * dest, const guint8 * src, guint len) { gint i; for (i = 0; i < len; ++i) { /* equivalent to: dest[i] = src[i << 1] */ *dest = *src; ++dest; ++src; ++src; } } static void gst_jpeg_dec_free_buffers (GstJpegDec * dec) { gint i; for (i = 0; i < 16; i++) { g_free (dec->idr_y[i]); g_free (dec->idr_u[i]); g_free (dec->idr_v[i]); dec->idr_y[i] = NULL; dec->idr_u[i] = NULL; dec->idr_v[i] = NULL; } dec->idr_width_allocated = 0; } static inline gboolean gst_jpeg_dec_ensure_buffers (GstJpegDec * dec, guint maxrowbytes) { gint i; if (G_LIKELY (dec->idr_width_allocated == maxrowbytes)) return TRUE; /* FIXME: maybe just alloc one or three blocks altogether? */ for (i = 0; i < 16; i++) { dec->idr_y[i] = g_try_realloc (dec->idr_y[i], maxrowbytes); dec->idr_u[i] = g_try_realloc (dec->idr_u[i], maxrowbytes); dec->idr_v[i] = g_try_realloc (dec->idr_v[i], maxrowbytes); if (G_UNLIKELY (!dec->idr_y[i] || !dec->idr_u[i] || !dec->idr_v[i])) { GST_WARNING_OBJECT (dec, "out of memory, i=%d, bytes=%u", i, maxrowbytes); return FALSE; } } dec->idr_width_allocated = maxrowbytes; GST_LOG_OBJECT (dec, "allocated temp memory, %u bytes/row", maxrowbytes); return TRUE; } static void gst_jpeg_dec_decode_grayscale (GstJpegDec * dec, guchar * base[1], guint width, guint height, guint pstride, guint rstride) { guchar *rows[16]; guchar **scanarray[1] = { rows }; gint i, j, k; gint lines; GST_DEBUG_OBJECT (dec, "indirect decoding of grayscale"); if (G_UNLIKELY (!gst_jpeg_dec_ensure_buffers (dec, GST_ROUND_UP_32 (width)))) return; memcpy (rows, dec->idr_y, 16 * sizeof (gpointer)); i = 0; while (i < height) { lines = jpeg_read_raw_data (&dec->cinfo, scanarray, DCTSIZE); if (G_LIKELY (lines > 0)) { for (j = 0; (j < DCTSIZE) && (i < height); j++, i++) { gint p; p = 0; for (k = 0; k < width; k++) { base[0][p] = rows[j][k]; p += pstride; } base[0] += rstride; } } else { GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); } } } static void gst_jpeg_dec_decode_rgb (GstJpegDec * dec, guchar * base[3], guint width, guint height, guint pstride, guint rstride) { guchar *r_rows[16], *g_rows[16], *b_rows[16]; guchar **scanarray[3] = { r_rows, g_rows, b_rows }; gint i, j, k; gint lines; GST_DEBUG_OBJECT (dec, "indirect decoding of RGB"); if (G_UNLIKELY (!gst_jpeg_dec_ensure_buffers (dec, GST_ROUND_UP_32 (width)))) return; memcpy (r_rows, dec->idr_y, 16 * sizeof (gpointer)); memcpy (g_rows, dec->idr_u, 16 * sizeof (gpointer)); memcpy (b_rows, dec->idr_v, 16 * sizeof (gpointer)); i = 0; while (i < height) { lines = jpeg_read_raw_data (&dec->cinfo, scanarray, DCTSIZE); if (G_LIKELY (lines > 0)) { for (j = 0; (j < DCTSIZE) && (i < height); j++, i++) { gint p; p = 0; for (k = 0; k < width; k++) { base[0][p] = r_rows[j][k]; base[1][p] = g_rows[j][k]; base[2][p] = b_rows[j][k]; p += pstride; } base[0] += rstride; base[1] += rstride; base[2] += rstride; } } else { GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); } } } static void gst_jpeg_dec_decode_indirect (GstJpegDec * dec, guchar * base[3], guchar * last[3], guint width, guint height, gint r_v, gint r_h, gint comp) { guchar *y_rows[16], *u_rows[16], *v_rows[16]; guchar **scanarray[3] = { y_rows, u_rows, v_rows }; gint i, j, k; gint lines; GST_DEBUG_OBJECT (dec, "unadvantageous width or r_h, taking slow route involving memcpy"); if (G_UNLIKELY (!gst_jpeg_dec_ensure_buffers (dec, GST_ROUND_UP_32 (width)))) return; memcpy (y_rows, dec->idr_y, 16 * sizeof (gpointer)); memcpy (u_rows, dec->idr_u, 16 * sizeof (gpointer)); memcpy (v_rows, dec->idr_v, 16 * sizeof (gpointer)); /* fill chroma components for grayscale */ if (comp == 1) { GST_DEBUG_OBJECT (dec, "grayscale, filling chroma"); for (i = 0; i < 16; i++) { memset (u_rows[i], GST_ROUND_UP_32 (width), 0x80); memset (v_rows[i], GST_ROUND_UP_32 (width), 0x80); } } for (i = 0; i < height; i += r_v * DCTSIZE) { lines = jpeg_read_raw_data (&dec->cinfo, scanarray, r_v * DCTSIZE); if (G_LIKELY (lines > 0)) { for (j = 0, k = 0; j < (r_v * DCTSIZE); j += r_v, k++) { if (G_LIKELY (base[0] <= last[0])) { memcpy (base[0], y_rows[j], I420_Y_ROWSTRIDE (width)); base[0] += I420_Y_ROWSTRIDE (width); } if (r_v == 2) { if (G_LIKELY (base[0] <= last[0])) { memcpy (base[0], y_rows[j + 1], I420_Y_ROWSTRIDE (width)); base[0] += I420_Y_ROWSTRIDE (width); } } if (G_LIKELY (base[1] <= last[1] && base[2] <= last[2])) { if (r_h == 2) { memcpy (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); memcpy (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); } else if (r_h == 1) { hresamplecpy1 (base[1], u_rows[k], I420_U_ROWSTRIDE (width)); hresamplecpy1 (base[2], v_rows[k], I420_V_ROWSTRIDE (width)); } else { /* FIXME: implement (at least we avoid crashing by doing nothing) */ } } if (r_v == 2 || (k & 1) != 0) { base[1] += I420_U_ROWSTRIDE (width); base[2] += I420_V_ROWSTRIDE (width); } } } else { GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); } } } #ifndef GST_DISABLE_GST_DEBUG static inline void dump_lines (guchar * base[3], guchar ** line[3], int v_samp0, int width) { int j; for (j = 0; j < (v_samp0 * DCTSIZE); ++j) { GST_LOG ("[%02d] %5d %5d %5d", j, (line[0][j] >= base[0]) ? (int) (line[0][j] - base[0]) / I420_Y_ROWSTRIDE (width) : -1, (line[1][j] >= base[1]) ? (int) (line[1][j] - base[1]) / I420_U_ROWSTRIDE (width) : -1, (line[2][j] >= base[2]) ? (int) (line[2][j] - base[2]) / I420_V_ROWSTRIDE (width) : -1); } } #endif static GstFlowReturn gst_jpeg_dec_decode_direct (GstJpegDec * dec, guchar * base[3], guchar * last[3], guint width, guint height) { guchar **line[3]; /* the jpeg line buffer */ guchar *y[4 * DCTSIZE] = { NULL, }; /* alloc enough for the lines */ guchar *u[4 * DCTSIZE] = { NULL, }; /* r_v will be <4 */ guchar *v[4 * DCTSIZE] = { NULL, }; gint i, j; gint lines, v_samp[3]; line[0] = y; line[1] = u; line[2] = v; v_samp[0] = dec->cinfo.comp_info[0].v_samp_factor; v_samp[1] = dec->cinfo.comp_info[1].v_samp_factor; v_samp[2] = dec->cinfo.comp_info[2].v_samp_factor; if (G_UNLIKELY (v_samp[0] > 2 || v_samp[1] > 2 || v_samp[2] > 2)) goto format_not_supported; /* let jpeglib decode directly into our final buffer */ GST_DEBUG_OBJECT (dec, "decoding directly into output buffer"); for (i = 0; i < height; i += v_samp[0] * DCTSIZE) { for (j = 0; j < (v_samp[0] * DCTSIZE); ++j) { /* Y */ line[0][j] = base[0] + (i + j) * I420_Y_ROWSTRIDE (width); if (G_UNLIKELY (line[0][j] > last[0])) line[0][j] = last[0]; /* U */ if (v_samp[1] == v_samp[0]) { line[1][j] = base[1] + ((i + j) / 2) * I420_U_ROWSTRIDE (width); } else if (j < (v_samp[1] * DCTSIZE)) { line[1][j] = base[1] + ((i / 2) + j) * I420_U_ROWSTRIDE (width); } if (G_UNLIKELY (line[1][j] > last[1])) line[1][j] = last[1]; /* V */ if (v_samp[2] == v_samp[0]) { line[2][j] = base[2] + ((i + j) / 2) * I420_V_ROWSTRIDE (width); } else if (j < (v_samp[2] * DCTSIZE)) { line[2][j] = base[2] + ((i / 2) + j) * I420_V_ROWSTRIDE (width); } if (G_UNLIKELY (line[2][j] > last[2])) line[2][j] = last[2]; } /* dump_lines (base, line, v_samp[0], width); */ lines = jpeg_read_raw_data (&dec->cinfo, line, v_samp[0] * DCTSIZE); if (G_UNLIKELY (!lines)) { GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0"); } } return GST_FLOW_OK; format_not_supported: { 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; } } static void gst_jpeg_dec_update_qos (GstJpegDec * dec, gdouble proportion, GstClockTimeDiff diff, GstClockTime ts) { GST_OBJECT_LOCK (dec); dec->proportion = proportion; if (G_LIKELY (ts != GST_CLOCK_TIME_NONE)) { if (G_UNLIKELY (diff > 0)) dec->earliest_time = ts + 2 * diff + dec->qos_duration; else dec->earliest_time = ts + diff; } else { dec->earliest_time = GST_CLOCK_TIME_NONE; } GST_OBJECT_UNLOCK (dec); } static void gst_jpeg_dec_reset_qos (GstJpegDec * dec) { gst_jpeg_dec_update_qos (dec, 0.5, 0, GST_CLOCK_TIME_NONE); } static void gst_jpeg_dec_read_qos (GstJpegDec * dec, gdouble * proportion, GstClockTime * time) { GST_OBJECT_LOCK (dec); *proportion = dec->proportion; *time = dec->earliest_time; GST_OBJECT_UNLOCK (dec); } /* Perform qos calculations before decoding the next frame. Returns TRUE if the * frame should be decoded, FALSE if the frame can be dropped entirely */ static gboolean gst_jpeg_dec_do_qos (GstJpegDec * dec, GstClockTime timestamp) { GstClockTime qostime, earliest_time; gdouble proportion; /* no timestamp, can't do QoS => decode frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { GST_LOG_OBJECT (dec, "invalid timestamp, can't do QoS, decode frame"); return TRUE; } /* get latest QoS observation values */ gst_jpeg_dec_read_qos (dec, &proportion, &earliest_time); /* skip qos if we have no observation (yet) => decode frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { GST_LOG_OBJECT (dec, "no observation yet, decode frame"); return TRUE; } /* qos is done on running time */ qostime = gst_segment_to_running_time (&dec->segment, GST_FORMAT_TIME, timestamp); /* see how our next timestamp relates to the latest qos timestamp */ GST_LOG_OBJECT (dec, "qostime %" GST_TIME_FORMAT ", earliest %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { GST_DEBUG_OBJECT (dec, "we are late, drop frame"); return FALSE; } GST_LOG_OBJECT (dec, "decode frame"); return TRUE; } static void gst_jpeg_dec_negotiate (GstJpegDec * dec, gint width, gint height, gint clrspc) { GstCaps *caps; GstVideoFormat format; if (G_UNLIKELY (width == dec->caps_width && height == dec->caps_height && dec->framerate_numerator == dec->caps_framerate_numerator && dec->framerate_denominator == dec->caps_framerate_denominator && clrspc == dec->clrspc)) return; /* framerate == 0/1 is a still frame */ if (dec->framerate_denominator == 0) { dec->framerate_numerator = 0; dec->framerate_denominator = 1; } /* calculate or assume an average frame duration for QoS purposes */ GST_OBJECT_LOCK (dec); if (dec->framerate_numerator != 0) { dec->qos_duration = gst_util_uint64_scale (GST_SECOND, dec->framerate_denominator, dec->framerate_numerator); } else { /* if not set just use 25fps */ dec->qos_duration = gst_util_uint64_scale (GST_SECOND, 1, 25); } GST_OBJECT_UNLOCK (dec); if (dec->cinfo.jpeg_color_space == JCS_RGB) { gint i; GstCaps *allowed_caps; GST_DEBUG_OBJECT (dec, "selecting RGB format"); /* retrieve allowed caps, and find the first one that reasonably maps * to the parameters of the colourspace */ caps = gst_pad_get_allowed_caps (dec->srcpad); if (!caps) { GST_DEBUG_OBJECT (dec, "... but no peer, using template caps"); /* need to copy because get_allowed_caps returns a ref, * and get_pad_template_caps doesn't */ caps = gst_caps_copy (gst_pad_get_pad_template_caps (dec->srcpad)); } /* avoid lists of fourcc, etc */ allowed_caps = gst_caps_normalize (caps); gst_caps_unref (caps); caps = NULL; GST_LOG_OBJECT (dec, "allowed source caps %" GST_PTR_FORMAT, allowed_caps); for (i = 0; i < gst_caps_get_size (allowed_caps); i++) { if (caps) gst_caps_unref (caps); caps = gst_caps_copy_nth (allowed_caps, i); /* sigh, ds and _parse_caps need fixed caps for parsing, fixate */ gst_pad_fixate_caps (dec->srcpad, caps); GST_LOG_OBJECT (dec, "checking caps %" GST_PTR_FORMAT, caps); if (!gst_video_format_parse_caps (caps, &format, NULL, NULL)) continue; /* we'll settle for the first (preferred) downstream rgb format */ if (gst_video_format_is_rgb (format)) break; /* default fall-back */ format = GST_VIDEO_FORMAT_RGB; } if (caps) gst_caps_unref (caps); gst_caps_unref (allowed_caps); caps = gst_video_format_new_caps (format, width, height, dec->framerate_numerator, dec->framerate_denominator, 1, 1); dec->outsize = gst_video_format_get_size (format, width, height); /* some format info */ dec->offset[0] = gst_video_format_get_component_offset (format, 0, width, height); dec->offset[1] = gst_video_format_get_component_offset (format, 1, width, height); dec->offset[2] = gst_video_format_get_component_offset (format, 2, width, height); /* equal for all components */ dec->stride = gst_video_format_get_row_stride (format, 0, width); dec->inc = gst_video_format_get_pixel_stride (format, 0); } else if (dec->cinfo.jpeg_color_space == JCS_GRAYSCALE) { /* TODO is anything else then 8bit supported in jpeg? */ format = GST_VIDEO_FORMAT_GRAY8; caps = gst_video_format_new_caps (format, width, height, dec->framerate_numerator, dec->framerate_denominator, 1, 1); dec->outsize = gst_video_format_get_size (format, width, height); dec->offset[0] = gst_video_format_get_component_offset (format, 0, width, height); dec->stride = gst_video_format_get_row_stride (format, 0, width); dec->inc = gst_video_format_get_pixel_stride (format, 0); } else { /* go for plain and simple I420 */ /* TODO other YUV cases ? */ caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, dec->framerate_numerator, dec->framerate_denominator, NULL); dec->outsize = I420_SIZE (width, height); } GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (dec, "max_v_samp_factor=%d", dec->cinfo.max_v_samp_factor); GST_DEBUG_OBJECT (dec, "max_h_samp_factor=%d", dec->cinfo.max_h_samp_factor); gst_pad_set_caps (dec->srcpad, caps); gst_caps_unref (caps); dec->caps_width = width; dec->caps_height = height; dec->caps_framerate_numerator = dec->framerate_numerator; dec->caps_framerate_denominator = dec->framerate_denominator; } static GstFlowReturn gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; GstJpegDec *dec; GstBuffer *outbuf = NULL; #ifndef GST_DISABLE_GST_DEBUG guchar *data; #endif guchar *outdata; guchar *base[3], *last[3]; gint img_len; guint outsize; gint width, height; gint r_h, r_v; guint code, hdr_ok; GstClockTime timestamp, duration; dec = GST_JPEG_DEC (GST_PAD_PARENT (pad)); timestamp = GST_BUFFER_TIMESTAMP (buf); duration = GST_BUFFER_DURATION (buf); if (GST_CLOCK_TIME_IS_VALID (timestamp)) dec->next_ts = timestamp; if (GST_BUFFER_IS_DISCONT (buf)) { GST_DEBUG_OBJECT (dec, "buffer has DISCONT flag set"); dec->discont = TRUE; if (!dec->packetized && gst_adapter_available (dec->adapter)) { GST_WARNING_OBJECT (dec, "DISCONT buffer in non-packetized mode, bad"); gst_adapter_clear (dec->adapter); } } gst_adapter_push (dec->adapter, buf); buf = NULL; /* If we are non-packetized and know the total incoming size in bytes, * just wait until we have enough before doing any processing. */ if (!dec->packetized && (dec->segment.format == GST_FORMAT_BYTES) && (dec->segment.stop != -1) && (gst_adapter_available (dec->adapter) < dec->segment.stop)) { /* We assume that non-packetized input in bytes is *one* single jpeg image */ GST_DEBUG ("Non-packetized mode. Got %d bytes, need %" G_GINT64_FORMAT, gst_adapter_available (dec->adapter), dec->segment.stop); goto need_more_data; } again: if (!gst_jpeg_dec_ensure_header (dec)) goto need_more_data; /* If we know that each input buffer contains data * for a whole jpeg image (e.g. MJPEG streams), just * do some sanity checking instead of parsing all of * the jpeg data */ if (dec->packetized) { img_len = gst_adapter_available (dec->adapter); } else { /* Parse jpeg image to handle jpeg input that * is not aligned to buffer boundaries */ img_len = gst_jpeg_dec_parse_image_data (dec); if (img_len == 0) { goto need_more_data; } else if (img_len < 0) { gst_adapter_flush (dec->adapter, -img_len); goto again; } } dec->rem_img_len = img_len; GST_LOG_OBJECT (dec, "image size = %u", img_len); /* QoS: if we're too late anyway, skip decoding */ if (dec->packetized && !gst_jpeg_dec_do_qos (dec, timestamp)) goto skip_decoding; #ifndef GST_DISABLE_GST_DEBUG data = (guint8 *) gst_adapter_peek (dec->adapter, 4); GST_LOG_OBJECT (dec, "reading header %02x %02x %02x %02x", data[0], data[1], data[2], data[3]); #endif gst_jpeg_dec_fill_input_buffer (&dec->cinfo); if (setjmp (dec->jerr.setjmp_buffer)) { code = dec->jerr.pub.msg_code; if (code == JERR_INPUT_EOF) { GST_DEBUG ("jpeg input EOF error, we probably need more data"); goto need_more_data; } goto decode_error; } /* read header */ hdr_ok = jpeg_read_header (&dec->cinfo, TRUE); if (G_UNLIKELY (hdr_ok != JPEG_HEADER_OK)) { GST_WARNING_OBJECT (dec, "reading the header failed, %d", hdr_ok); } GST_LOG_OBJECT (dec, "num_components=%d", dec->cinfo.num_components); GST_LOG_OBJECT (dec, "jpeg_color_space=%d", dec->cinfo.jpeg_color_space); if (!dec->cinfo.num_components || !dec->cinfo.comp_info) goto components_not_supported; r_h = dec->cinfo.comp_info[0].h_samp_factor; r_v = dec->cinfo.comp_info[0].v_samp_factor; GST_LOG_OBJECT (dec, "r_h = %d, r_v = %d", r_h, r_v); if (dec->cinfo.num_components > 3) goto components_not_supported; /* verify color space expectation to avoid going *boom* or bogus output */ if (dec->cinfo.jpeg_color_space != JCS_YCbCr && dec->cinfo.jpeg_color_space != JCS_GRAYSCALE && dec->cinfo.jpeg_color_space != JCS_RGB) goto unsupported_colorspace; #ifndef GST_DISABLE_GST_DEBUG { gint i; for (i = 0; i < dec->cinfo.num_components; ++i) { GST_LOG_OBJECT (dec, "[%d] h_samp_factor=%d, v_samp_factor=%d, cid=%d", i, dec->cinfo.comp_info[i].h_samp_factor, dec->cinfo.comp_info[i].v_samp_factor, dec->cinfo.comp_info[i].component_id); } } #endif /* prepare for raw output */ dec->cinfo.do_fancy_upsampling = FALSE; dec->cinfo.do_block_smoothing = FALSE; dec->cinfo.out_color_space = dec->cinfo.jpeg_color_space; dec->cinfo.dct_method = dec->idct_method; dec->cinfo.raw_data_out = TRUE; GST_LOG_OBJECT (dec, "starting decompress"); guarantee_huff_tables (&dec->cinfo); if (!jpeg_start_decompress (&dec->cinfo)) { GST_WARNING_OBJECT (dec, "failed to start decompression cycle"); } /* sanity checks to get safe and reasonable output */ switch (dec->cinfo.jpeg_color_space) { case JCS_GRAYSCALE: if (dec->cinfo.num_components != 1) goto invalid_yuvrgbgrayscale; break; case JCS_RGB: if (dec->cinfo.num_components != 3 || dec->cinfo.max_v_samp_factor > 1 || dec->cinfo.max_h_samp_factor > 1) goto invalid_yuvrgbgrayscale; break; case JCS_YCbCr: if (dec->cinfo.num_components != 3 || r_v > 2 || r_v < dec->cinfo.comp_info[0].v_samp_factor || r_v < dec->cinfo.comp_info[1].v_samp_factor || r_h < dec->cinfo.comp_info[0].h_samp_factor || r_h < dec->cinfo.comp_info[1].h_samp_factor) goto invalid_yuvrgbgrayscale; break; default: g_assert_not_reached (); break; } width = dec->cinfo.output_width; height = dec->cinfo.output_height; if (G_UNLIKELY (width < MIN_WIDTH || width > MAX_WIDTH || height < MIN_HEIGHT || height > MAX_HEIGHT)) goto wrong_size; gst_jpeg_dec_negotiate (dec, width, height, dec->cinfo.jpeg_color_space); ret = gst_pad_alloc_buffer_and_set_caps (dec->srcpad, GST_BUFFER_OFFSET_NONE, dec->outsize, GST_PAD_CAPS (dec->srcpad), &outbuf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto alloc_failed; outdata = GST_BUFFER_DATA (outbuf); outsize = GST_BUFFER_SIZE (outbuf); GST_LOG_OBJECT (dec, "width %d, height %d, buffer size %d, required size %d", width, height, outsize, dec->outsize); GST_BUFFER_TIMESTAMP (outbuf) = dec->next_ts; if (dec->packetized && GST_CLOCK_TIME_IS_VALID (dec->next_ts)) { if (GST_CLOCK_TIME_IS_VALID (duration)) { /* use duration from incoming buffer for outgoing buffer */ dec->next_ts += duration; } else if (dec->framerate_numerator != 0) { duration = gst_util_uint64_scale (GST_SECOND, dec->framerate_denominator, dec->framerate_numerator); dec->next_ts += duration; } else { duration = GST_CLOCK_TIME_NONE; dec->next_ts = GST_CLOCK_TIME_NONE; } } else { duration = GST_CLOCK_TIME_NONE; dec->next_ts = GST_CLOCK_TIME_NONE; } GST_BUFFER_DURATION (outbuf) = duration; if (dec->cinfo.jpeg_color_space == JCS_RGB) { base[0] = outdata + dec->offset[0]; base[1] = outdata + dec->offset[1]; base[2] = outdata + dec->offset[2]; gst_jpeg_dec_decode_rgb (dec, base, width, height, dec->inc, dec->stride); } else if (dec->cinfo.jpeg_color_space == JCS_GRAYSCALE) { base[0] = outdata + dec->offset[0]; gst_jpeg_dec_decode_grayscale (dec, base, width, height, dec->inc, dec->stride); } else { /* mind the swap, jpeglib outputs blue chroma first * ensonic: I see no swap? */ base[0] = outdata + I420_Y_OFFSET (width, height); base[1] = outdata + I420_U_OFFSET (width, height); base[2] = outdata + I420_V_OFFSET (width, height); /* make sure we don't make jpeglib write beyond our buffer, * which might happen if (height % (r_v*DCTSIZE)) != 0 */ last[0] = base[0] + (I420_Y_ROWSTRIDE (width) * (height - 1)); last[1] = base[1] + (I420_U_ROWSTRIDE (width) * ((GST_ROUND_UP_2 (height) / 2) - 1)); last[2] = base[2] + (I420_V_ROWSTRIDE (width) * ((GST_ROUND_UP_2 (height) / 2) - 1)); GST_LOG_OBJECT (dec, "decompressing (reqired scanline buffer height = %u)", dec->cinfo.rec_outbuf_height); /* For some widths jpeglib requires more horizontal padding than I420 * provides. In those cases we need to decode into separate buffers and then * copy over the data into our final picture buffer, otherwise jpeglib might * write over the end of a line into the beginning of the next line, * resulting in blocky artifacts on the left side of the picture. */ if (G_UNLIKELY (width % (dec->cinfo.max_h_samp_factor * DCTSIZE) != 0 || dec->cinfo.comp_info[0].h_samp_factor != 2 || dec->cinfo.comp_info[1].h_samp_factor != 1 || dec->cinfo.comp_info[2].h_samp_factor != 1)) { GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, dec, "indirect decoding using extra buffer copy"); gst_jpeg_dec_decode_indirect (dec, base, last, width, height, r_v, r_h, dec->cinfo.num_components); } else { ret = gst_jpeg_dec_decode_direct (dec, base, last, width, height); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto decode_direct_failed; } } GST_LOG_OBJECT (dec, "decompressing finished"); jpeg_finish_decompress (&dec->cinfo); /* Clipping */ if (dec->segment.format == GST_FORMAT_TIME) { gint64 start, stop, clip_start, clip_stop; GST_LOG_OBJECT (dec, "Attempting clipping"); start = GST_BUFFER_TIMESTAMP (outbuf); if (GST_BUFFER_DURATION (outbuf) == GST_CLOCK_TIME_NONE) stop = start; else stop = start + GST_BUFFER_DURATION (outbuf); if (gst_segment_clip (&dec->segment, GST_FORMAT_TIME, start, stop, &clip_start, &clip_stop)) { GST_LOG_OBJECT (dec, "Clipping start to %" GST_TIME_FORMAT, GST_TIME_ARGS (clip_start)); GST_BUFFER_TIMESTAMP (outbuf) = clip_start; if (GST_BUFFER_DURATION (outbuf) != GST_CLOCK_TIME_NONE) { GST_LOG_OBJECT (dec, "Clipping duration to %" GST_TIME_FORMAT, GST_TIME_ARGS (clip_stop - clip_start)); GST_BUFFER_DURATION (outbuf) = clip_stop - clip_start; } } else 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))); ret = gst_pad_push (dec->srcpad, outbuf); skip_decoding: done: gst_adapter_flush (dec->adapter, dec->rem_img_len); 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 */ need_more_data: { GST_LOG_OBJECT (dec, "we need more data"); if (outbuf) { gst_buffer_unref (outbuf); outbuf = NULL; } ret = GST_FLOW_OK; goto exit; } /* ERRORS */ wrong_size: { 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; } decode_error: { gchar err_msg[JMSG_LENGTH_MAX]; dec->jerr.pub.format_message ((j_common_ptr) (&dec->cinfo), 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; } ret = GST_FLOW_ERROR; goto done; } decode_direct_failed: { /* already posted an error message */ jpeg_abort_decompress (&dec->cinfo); gst_buffer_replace (&outbuf, NULL); goto done; } alloc_failed: { const gchar *reason; reason = gst_flow_get_name (ret); GST_DEBUG_OBJECT (dec, "failed to alloc buffer, reason %s", reason); /* Reset for next time */ jpeg_abort_decompress (&dec->cinfo); if (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_WRONG_STATE && ret != GST_FLOW_NOT_LINKED) { gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, "Buffer allocation failed, reason: %s", reason); } goto exit; } drop_buffer: { GST_WARNING_OBJECT (dec, "Outgoing buffer is outside configured segment"); gst_buffer_unref (outbuf); ret = GST_FLOW_OK; goto exit; } components_not_supported: { gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, "number of components not supported: %d (max 3)", dec->cinfo.num_components); ret = GST_FLOW_ERROR; goto done; } unsupported_colorspace: { gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, "Picture has unknown or unsupported colourspace"); ret = GST_FLOW_ERROR; goto done; } invalid_yuvrgbgrayscale: { gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__, "Picture is corrupt or unhandled YUV/RGB/grayscale layout"); ret = GST_FLOW_ERROR; goto done; } } static gboolean gst_jpeg_dec_src_event (GstPad * pad, GstEvent * event) { GstJpegDec *dec; gboolean res; dec = GST_JPEG_DEC (gst_pad_get_parent (pad)); if (G_UNLIKELY (dec == NULL)) { gst_event_unref (event); return FALSE; } switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS:{ GstClockTimeDiff diff; GstClockTime timestamp; gdouble proportion; gst_event_parse_qos (event, &proportion, &diff, ×tamp); gst_jpeg_dec_update_qos (dec, proportion, diff, timestamp); break; } default: break; } res = gst_pad_push_event (dec->sinkpad, event); gst_object_unref (dec); return res; } static gboolean gst_jpeg_dec_sink_event (GstPad * pad, GstEvent * event) { gboolean ret = TRUE; GstJpegDec *dec = GST_JPEG_DEC (GST_OBJECT_PARENT (pad)); GST_DEBUG_OBJECT (dec, "event : %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: GST_DEBUG_OBJECT (dec, "Aborting decompress"); jpeg_abort_decompress (&dec->cinfo); gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED); gst_adapter_clear (dec->adapter); g_free (dec->cur_buf); dec->cur_buf = NULL; dec->parse_offset = 0; dec->parse_entropy_len = 0; dec->parse_resync = FALSE; gst_jpeg_dec_reset_qos (dec); break; case GST_EVENT_NEWSEGMENT:{ gboolean update; gdouble rate, applied_rate; GstFormat format; gint64 start, stop, position; gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, &format, &start, &stop, &position); GST_DEBUG_OBJECT (dec, "Got NEWSEGMENT [%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "]", GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); gst_segment_set_newsegment_full (&dec->segment, update, rate, applied_rate, format, start, stop, position); break; } default: break; } ret = gst_pad_push_event (dec->srcpad, event); return ret; } static void gst_jpeg_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstJpegDec *dec; dec = GST_JPEG_DEC (object); switch (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); break; } } static void gst_jpeg_dec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstJpegDec *dec; dec = GST_JPEG_DEC (object); switch (prop_id) { 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); break; } } static GstStateChangeReturn gst_jpeg_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstJpegDec *dec; dec = GST_JPEG_DEC (element); 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; dec->caps_width = -1; dec->caps_height = -1; dec->clrspc = -1; dec->packetized = FALSE; dec->next_ts = 0; dec->discont = TRUE; dec->parse_offset = 0; dec->parse_entropy_len = 0; dec->parse_resync = FALSE; dec->cur_buf = NULL; gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED); gst_jpeg_dec_reset_qos (dec); default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_adapter_clear (dec->adapter); g_free (dec->cur_buf); dec->cur_buf = NULL; gst_jpeg_dec_free_buffers (dec); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/jpeg/gstsmokedec.h0000644000175000017500000000362211671175352016220 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SMOKEDEC_H__ #define __GST_SMOKEDEC_H__ #include #include "smokecodec.h" G_BEGIN_DECLS #define GST_TYPE_SMOKEDEC \ (gst_smokedec_get_type()) #define GST_SMOKEDEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMOKEDEC,GstSmokeDec)) #define GST_SMOKEDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMOKEDEC,GstSmokeDecClass)) #define GST_IS_SMOKEDEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMOKEDEC)) #define GST_IS_SMOKEDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOKEDEC)) typedef struct _GstSmokeDec GstSmokeDec; typedef struct _GstSmokeDecClass GstSmokeDecClass; struct _GstSmokeDec { GstElement element; /* pads */ GstPad *sinkpad,*srcpad; /* video state */ gint format; gint width; gint height; gint fps_num; gint fps_denom; GstClockTime next_time; SmokeCodecInfo *info; gint threshold; gint quality; gint smoothing; gboolean need_keyframe; }; struct _GstSmokeDecClass { GstElementClass parent_class; }; GType gst_smokedec_get_type(void); G_END_DECLS #endif /* __GST_SMOKEDEC_H__ */ gst-plugins-good-0.10.31/ext/jpeg/gstjpegdec.h0000644000175000017500000000746411671175352016037 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_JPEG_DEC_H__ #define __GST_JPEG_DEC_H__ #include #include #include #include /* this is a hack hack hack to get around jpeglib header bugs... */ #ifdef HAVE_STDLIB_H # undef HAVE_STDLIB_H #endif #include #include G_BEGIN_DECLS #define GST_TYPE_JPEG_DEC \ (gst_jpeg_dec_get_type()) #define GST_JPEG_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JPEG_DEC,GstJpegDec)) #define GST_JPEG_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JPEG_DEC,GstJpegDecClass)) #define GST_IS_JPEG_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JPEG_DEC)) #define GST_IS_JPEG_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEG_DEC)) typedef struct _GstJpegDec GstJpegDec; typedef struct _GstJpegDecClass GstJpegDecClass; struct GstJpegDecErrorMgr { struct jpeg_error_mgr pub; /* public fields */ jmp_buf setjmp_buffer; }; struct GstJpegDecSourceMgr { struct jpeg_source_mgr pub; /* public fields */ GstJpegDec *dec; }; /* Can't use GstBaseTransform, because GstBaseTransform * doesn't handle the N buffers in, 1 buffer out case, * but only the 1-in 1-out case */ struct _GstJpegDec { GstElement element; /* pads */ GstPad *sinkpad; GstPad *srcpad; GstAdapter *adapter; guint8 *cur_buf; /* TRUE if each input buffer contains a whole jpeg image */ gboolean packetized; /* the (expected) timestamp of the next frame */ guint64 next_ts; GstSegment segment; /* TRUE if the next output buffer should have the DISCONT flag set */ gboolean discont; /* QoS stuff *//* with LOCK */ gdouble proportion; GstClockTime earliest_time; GstClockTime qos_duration; /* video state */ gint framerate_numerator; gint framerate_denominator; /* negotiated state */ gint caps_framerate_numerator; gint caps_framerate_denominator; gint caps_width; gint caps_height; gint outsize; gint clrspc; gint offset[3]; gint stride; gint inc; /* parse state */ gint parse_offset; gint parse_entropy_len; gint parse_resync; /* properties */ gint idct_method; gint max_errors; /* ATOMIC */ /* current error (the message is the debug message) */ gchar *error_msg; int error_line; const gchar *error_func; /* number of errors since start or last successfully decoded image */ guint error_count; /* number of successfully decoded images since start */ guint good_count; struct jpeg_decompress_struct cinfo; struct GstJpegDecErrorMgr jerr; struct GstJpegDecSourceMgr jsrc; /* arrays for indirect decoding */ gboolean idr_width_allocated; guchar *idr_y[16],*idr_u[16],*idr_v[16]; /* current (parsed) image size */ guint rem_img_len; }; struct _GstJpegDecClass { GstElementClass parent_class; }; GType gst_jpeg_dec_get_type(void); G_END_DECLS #endif /* __GST_JPEG_DEC_H__ */ gst-plugins-good-0.10.31/ext/jpeg/gstjpeg.c0000644000175000017500000000426411671175352015351 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #endif #include #include #include "gstjpeg.h" #include "gstjpegdec.h" #include "gstjpegenc.h" #include "gstsmokeenc.h" #include "gstsmokedec.h" GType gst_idct_method_get_type (void) { static GType idct_method_type = 0; static const GEnumValue idct_method[] = { {JDCT_ISLOW, "Slow but accurate integer algorithm", "islow"}, {JDCT_IFAST, "Faster, less accurate integer method", "ifast"}, {JDCT_FLOAT, "Floating-point: accurate, fast on fast HW", "float"}, {0, NULL, NULL}, }; if (!idct_method_type) { idct_method_type = g_enum_register_static ("GstIDCTMethod", idct_method); } return idct_method_type; } static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "jpegenc", GST_RANK_PRIMARY, GST_TYPE_JPEGENC)) return FALSE; if (!gst_element_register (plugin, "jpegdec", GST_RANK_PRIMARY, GST_TYPE_JPEG_DEC)) return FALSE; if (!gst_element_register (plugin, "smokeenc", GST_RANK_PRIMARY, GST_TYPE_SMOKEENC)) return FALSE; if (!gst_element_register (plugin, "smokedec", GST_RANK_PRIMARY, GST_TYPE_SMOKEDEC)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "jpeg", "JPeg plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/jpeg/gstjpegenc.c0000644000175000017500000005425411707322373016040 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-jpegenc * * Encodes jpeg images. * * * Example launch line * |[ * gst-launch videotestsrc num-buffers=50 ! video/x-raw-yuv, framerate='(fraction)'5/1 ! jpegenc ! avimux ! filesink location=mjpeg.avi * ]| a pipeline to mux 5 JPEG frames per second into a 10 sec. long motion jpeg * avi. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstjpegenc.h" #include "gstjpeg.h" #include /* experimental */ /* setting smoothig seems to have no effect in libjepeg #define ENABLE_SMOOTHING 1 */ GST_DEBUG_CATEGORY_STATIC (jpegenc_debug); #define GST_CAT_DEFAULT jpegenc_debug #define JPEG_DEFAULT_QUALITY 85 #define JPEG_DEFAULT_SMOOTHING 0 #define JPEG_DEFAULT_IDCT_METHOD JDCT_FASTEST /* JpegEnc signals and args */ enum { FRAME_ENCODED, /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_QUALITY, PROP_SMOOTHING, PROP_IDCT_METHOD }; static void gst_jpegenc_reset (GstJpegEnc * enc); static void gst_jpegenc_base_init (gpointer g_class); static void gst_jpegenc_class_init (GstJpegEnc * klass); static void gst_jpegenc_init (GstJpegEnc * jpegenc); static void gst_jpegenc_finalize (GObject * object); static GstFlowReturn gst_jpegenc_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_jpegenc_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_jpegenc_getcaps (GstPad * pad); static void gst_jpegenc_resync (GstJpegEnc * jpegenc); static void gst_jpegenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_jpegenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_jpegenc_change_state (GstElement * element, GstStateChange transition); static GstElementClass *parent_class = NULL; static guint gst_jpegenc_signals[LAST_SIGNAL] = { 0 }; GType gst_jpegenc_get_type (void) { static GType jpegenc_type = 0; if (!jpegenc_type) { static const GTypeInfo jpegenc_info = { sizeof (GstJpegEnc), (GBaseInitFunc) gst_jpegenc_base_init, NULL, (GClassInitFunc) gst_jpegenc_class_init, NULL, NULL, sizeof (GstJpegEnc), 0, (GInstanceInitFunc) gst_jpegenc_init, }; jpegenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstJpegEnc", &jpegenc_info, 0); } return jpegenc_type; } /* *INDENT-OFF* */ static GstStaticPadTemplate gst_jpegenc_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, YV12, YUY2, UYVY, Y41B, Y42B, YVYU, Y444 }") "; " GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_BGR "; " GST_VIDEO_CAPS_RGBx "; " GST_VIDEO_CAPS_xRGB "; " GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_GRAY8) ); /* *INDENT-ON* */ static GstStaticPadTemplate gst_jpegenc_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " "width = (int) [ 16, 65535 ], " "height = (int) [ 16, 65535 ], " "framerate = (fraction) [ 0/1, MAX ]") ); static void gst_jpegenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_jpegenc_sink_pad_template); gst_element_class_add_static_pad_template (element_class, &gst_jpegenc_src_pad_template); gst_element_class_set_details_simple (element_class, "JPEG image encoder", "Codec/Encoder/Image", "Encode images in JPEG format", "Wim Taymans "); } static void gst_jpegenc_class_init (GstJpegEnc * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gst_jpegenc_signals[FRAME_ENCODED] = g_signal_new ("frame-encoded", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstJpegEncClass, frame_encoded), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gobject_class->set_property = gst_jpegenc_set_property; gobject_class->get_property = gst_jpegenc_get_property; g_object_class_install_property (gobject_class, PROP_QUALITY, g_param_spec_int ("quality", "Quality", "Quality of encoding", 0, 100, JPEG_DEFAULT_QUALITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #ifdef ENABLE_SMOOTHING /* disabled, since it doesn't seem to work */ g_object_class_install_property (gobject_class, PROP_SMOOTHING, g_param_spec_int ("smoothing", "Smoothing", "Smoothing factor", 0, 100, JPEG_DEFAULT_SMOOTHING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #endif g_object_class_install_property (gobject_class, PROP_IDCT_METHOD, g_param_spec_enum ("idct-method", "IDCT Method", "The IDCT algorithm to use", GST_TYPE_IDCT_METHOD, JPEG_DEFAULT_IDCT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = gst_jpegenc_change_state; gobject_class->finalize = gst_jpegenc_finalize; GST_DEBUG_CATEGORY_INIT (jpegenc_debug, "jpegenc", 0, "JPEG encoding element"); } static void gst_jpegenc_init_destination (j_compress_ptr cinfo) { GST_DEBUG ("gst_jpegenc_chain: init_destination"); } static boolean gst_jpegenc_flush_destination (j_compress_ptr cinfo) { GstBuffer *overflow_buffer; guint32 old_buffer_size; GstJpegEnc *jpegenc = (GstJpegEnc *) (cinfo->client_data); GstFlowReturn ret; GST_DEBUG_OBJECT (jpegenc, "gst_jpegenc_chain: flush_destination: buffer too small"); /* Our output buffer wasn't big enough. * Make a new buffer that's twice the size, */ old_buffer_size = GST_BUFFER_SIZE (jpegenc->output_buffer); ret = gst_pad_alloc_buffer_and_set_caps (jpegenc->srcpad, GST_BUFFER_OFFSET_NONE, old_buffer_size * 2, GST_PAD_CAPS (jpegenc->srcpad), &overflow_buffer); /* handle here if needed */ if (ret != GST_FLOW_OK) { overflow_buffer = gst_buffer_new_and_alloc (old_buffer_size * 2); gst_buffer_set_caps (overflow_buffer, GST_PAD_CAPS (jpegenc->srcpad)); } memcpy (GST_BUFFER_DATA (overflow_buffer), GST_BUFFER_DATA (jpegenc->output_buffer), old_buffer_size); gst_buffer_copy_metadata (overflow_buffer, jpegenc->output_buffer, GST_BUFFER_COPY_TIMESTAMPS); /* drop it into place, */ gst_buffer_unref (jpegenc->output_buffer); jpegenc->output_buffer = overflow_buffer; /* and last, update libjpeg on where to work. */ jpegenc->jdest.next_output_byte = GST_BUFFER_DATA (jpegenc->output_buffer) + old_buffer_size; jpegenc->jdest.free_in_buffer = GST_BUFFER_SIZE (jpegenc->output_buffer) - old_buffer_size; return TRUE; } static void gst_jpegenc_term_destination (j_compress_ptr cinfo) { GstJpegEnc *jpegenc = (GstJpegEnc *) (cinfo->client_data); GST_DEBUG_OBJECT (jpegenc, "gst_jpegenc_chain: term_source"); /* Trim the buffer size and push it. */ GST_BUFFER_SIZE (jpegenc->output_buffer) = GST_BUFFER_SIZE (jpegenc->output_buffer) - jpegenc->jdest.free_in_buffer; g_signal_emit (G_OBJECT (jpegenc), gst_jpegenc_signals[FRAME_ENCODED], 0); jpegenc->last_ret = gst_pad_push (jpegenc->srcpad, jpegenc->output_buffer); jpegenc->output_buffer = NULL; } static void gst_jpegenc_init (GstJpegEnc * jpegenc) { /* create the sink and src pads */ jpegenc->sinkpad = gst_pad_new_from_static_template (&gst_jpegenc_sink_pad_template, "sink"); gst_pad_set_chain_function (jpegenc->sinkpad, GST_DEBUG_FUNCPTR (gst_jpegenc_chain)); gst_pad_set_getcaps_function (jpegenc->sinkpad, GST_DEBUG_FUNCPTR (gst_jpegenc_getcaps)); gst_pad_set_setcaps_function (jpegenc->sinkpad, GST_DEBUG_FUNCPTR (gst_jpegenc_setcaps)); gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->sinkpad); jpegenc->srcpad = gst_pad_new_from_static_template (&gst_jpegenc_src_pad_template, "src"); gst_pad_use_fixed_caps (jpegenc->srcpad); gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->srcpad); /* reset the initial video state */ jpegenc->width = -1; jpegenc->height = -1; /* setup jpeglib */ memset (&jpegenc->cinfo, 0, sizeof (jpegenc->cinfo)); memset (&jpegenc->jerr, 0, sizeof (jpegenc->jerr)); jpegenc->cinfo.err = jpeg_std_error (&jpegenc->jerr); jpeg_create_compress (&jpegenc->cinfo); jpegenc->jdest.init_destination = gst_jpegenc_init_destination; jpegenc->jdest.empty_output_buffer = gst_jpegenc_flush_destination; jpegenc->jdest.term_destination = gst_jpegenc_term_destination; jpegenc->cinfo.dest = &jpegenc->jdest; jpegenc->cinfo.client_data = jpegenc; /* init properties */ jpegenc->quality = JPEG_DEFAULT_QUALITY; jpegenc->smoothing = JPEG_DEFAULT_SMOOTHING; jpegenc->idct_method = JPEG_DEFAULT_IDCT_METHOD; gst_jpegenc_reset (jpegenc); } static void gst_jpegenc_reset (GstJpegEnc * enc) { gint i, j; g_free (enc->line[0]); g_free (enc->line[1]); g_free (enc->line[2]); enc->line[0] = NULL; enc->line[1] = NULL; enc->line[2] = NULL; for (i = 0; i < 3; i++) { for (j = 0; j < 4 * DCTSIZE; j++) { g_free (enc->row[i][j]); enc->row[i][j] = NULL; } } enc->width = -1; enc->height = -1; enc->format = GST_VIDEO_FORMAT_UNKNOWN; enc->fps_den = enc->par_den = 0; enc->height = enc->width = 0; } static void gst_jpegenc_finalize (GObject * object) { GstJpegEnc *filter = GST_JPEGENC (object); jpeg_destroy_compress (&filter->cinfo); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_jpegenc_getcaps (GstPad * pad) { GstJpegEnc *jpegenc = GST_JPEGENC (gst_pad_get_parent (pad)); GstCaps *caps, *othercaps; const GstCaps *templ; gint i, j; GstStructure *structure = NULL; /* we want to proxy properties like width, height and framerate from the other end of the element */ othercaps = gst_pad_peer_get_caps_reffed (jpegenc->srcpad); if (othercaps == NULL || gst_caps_is_empty (othercaps) || gst_caps_is_any (othercaps)) { caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); goto done; } caps = gst_caps_new_empty (); templ = gst_pad_get_pad_template_caps (pad); for (i = 0; i < gst_caps_get_size (templ); i++) { /* pick fields from peer caps */ for (j = 0; j < gst_caps_get_size (othercaps); j++) { GstStructure *s = gst_caps_get_structure (othercaps, j); const GValue *val; structure = gst_structure_copy (gst_caps_get_structure (templ, i)); if ((val = gst_structure_get_value (s, "width"))) gst_structure_set_value (structure, "width", val); if ((val = gst_structure_get_value (s, "height"))) gst_structure_set_value (structure, "height", val); if ((val = gst_structure_get_value (s, "framerate"))) gst_structure_set_value (structure, "framerate", val); gst_caps_merge_structure (caps, structure); } } done: gst_caps_replace (&othercaps, NULL); gst_object_unref (jpegenc); return caps; } static gboolean gst_jpegenc_setcaps (GstPad * pad, GstCaps * caps) { GstJpegEnc *enc = GST_JPEGENC (gst_pad_get_parent (pad)); GstVideoFormat format; gint width, height; gint fps_num, fps_den; gint par_num, par_den; gint i; GstCaps *othercaps; gboolean ret; /* get info from caps */ if (!gst_video_format_parse_caps (caps, &format, &width, &height)) goto refuse_caps; /* optional; pass along if present */ fps_num = fps_den = -1; par_num = par_den = -1; gst_video_parse_caps_framerate (caps, &fps_num, &fps_den); gst_video_parse_caps_pixel_aspect_ratio (caps, &par_num, &par_den); if (width == enc->width && height == enc->height && enc->format == format && fps_num == enc->fps_num && fps_den == enc->fps_den && par_num == enc->par_num && par_den == enc->par_den) return TRUE; /* store input description */ enc->format = format; enc->width = width; enc->height = height; enc->fps_num = fps_num; enc->fps_den = fps_den; enc->par_num = par_num; enc->par_den = par_den; /* prepare a cached image description */ enc->channels = 3 + (gst_video_format_has_alpha (format) ? 1 : 0); /* ... but any alpha is disregarded in encoding */ if (gst_video_format_is_gray (format)) enc->channels = 1; else enc->channels = 3; enc->h_max_samp = 0; enc->v_max_samp = 0; for (i = 0; i < enc->channels; ++i) { enc->cwidth[i] = gst_video_format_get_component_width (format, i, width); enc->cheight[i] = gst_video_format_get_component_height (format, i, height); enc->offset[i] = gst_video_format_get_component_offset (format, i, width, height); enc->stride[i] = gst_video_format_get_row_stride (format, i, width); enc->inc[i] = gst_video_format_get_pixel_stride (format, i); enc->h_samp[i] = GST_ROUND_UP_4 (width) / enc->cwidth[i]; enc->h_max_samp = MAX (enc->h_max_samp, enc->h_samp[i]); enc->v_samp[i] = GST_ROUND_UP_4 (height) / enc->cheight[i]; enc->v_max_samp = MAX (enc->v_max_samp, enc->v_samp[i]); } /* samp should only be 1, 2 or 4 */ g_assert (enc->h_max_samp <= 4); g_assert (enc->v_max_samp <= 4); /* now invert */ /* maximum is invariant, as one of the components should have samp 1 */ for (i = 0; i < enc->channels; ++i) { enc->h_samp[i] = enc->h_max_samp / enc->h_samp[i]; enc->v_samp[i] = enc->v_max_samp / enc->v_samp[i]; } enc->planar = (enc->inc[0] == 1 && enc->inc[1] == 1 && enc->inc[2] == 1); othercaps = gst_caps_copy (gst_pad_get_pad_template_caps (enc->srcpad)); gst_caps_set_simple (othercaps, "width", G_TYPE_INT, enc->width, "height", G_TYPE_INT, enc->height, NULL); if (enc->fps_den > 0) gst_caps_set_simple (othercaps, "framerate", GST_TYPE_FRACTION, enc->fps_num, enc->fps_den, NULL); if (enc->par_den > 0) gst_caps_set_simple (othercaps, "pixel-aspect-ratio", GST_TYPE_FRACTION, enc->par_num, enc->par_den, NULL); ret = gst_pad_set_caps (enc->srcpad, othercaps); gst_caps_unref (othercaps); if (ret) gst_jpegenc_resync (enc); gst_object_unref (enc); return ret; /* ERRORS */ refuse_caps: { GST_WARNING_OBJECT (enc, "refused caps %" GST_PTR_FORMAT, caps); gst_object_unref (enc); return FALSE; } } static void gst_jpegenc_resync (GstJpegEnc * jpegenc) { gint width, height; gint i, j; GST_DEBUG_OBJECT (jpegenc, "resync"); jpegenc->cinfo.image_width = width = jpegenc->width; jpegenc->cinfo.image_height = height = jpegenc->height; jpegenc->cinfo.input_components = jpegenc->channels; GST_DEBUG_OBJECT (jpegenc, "width %d, height %d", width, height); GST_DEBUG_OBJECT (jpegenc, "format %d", jpegenc->format); if (gst_video_format_is_rgb (jpegenc->format)) { GST_DEBUG_OBJECT (jpegenc, "RGB"); jpegenc->cinfo.in_color_space = JCS_RGB; } else if (gst_video_format_is_gray (jpegenc->format)) { GST_DEBUG_OBJECT (jpegenc, "gray"); jpegenc->cinfo.in_color_space = JCS_GRAYSCALE; } else { GST_DEBUG_OBJECT (jpegenc, "YUV"); jpegenc->cinfo.in_color_space = JCS_YCbCr; } /* input buffer size as max output */ jpegenc->bufsize = gst_video_format_get_size (jpegenc->format, width, height); jpeg_set_defaults (&jpegenc->cinfo); jpegenc->cinfo.raw_data_in = TRUE; /* duh, libjpeg maps RGB to YUV ... and don't expect some conversion */ if (jpegenc->cinfo.in_color_space == JCS_RGB) jpeg_set_colorspace (&jpegenc->cinfo, JCS_RGB); GST_DEBUG_OBJECT (jpegenc, "h_max_samp=%d, v_max_samp=%d", jpegenc->h_max_samp, jpegenc->v_max_samp); /* image dimension info */ for (i = 0; i < jpegenc->channels; i++) { GST_DEBUG_OBJECT (jpegenc, "comp %i: h_samp=%d, v_samp=%d", i, jpegenc->h_samp[i], jpegenc->v_samp[i]); jpegenc->cinfo.comp_info[i].h_samp_factor = jpegenc->h_samp[i]; jpegenc->cinfo.comp_info[i].v_samp_factor = jpegenc->v_samp[i]; g_free (jpegenc->line[i]); jpegenc->line[i] = g_new (guchar *, jpegenc->v_max_samp * DCTSIZE); if (!jpegenc->planar) { for (j = 0; j < jpegenc->v_max_samp * DCTSIZE; j++) { g_free (jpegenc->row[i][j]); jpegenc->row[i][j] = g_malloc (width); jpegenc->line[i][j] = jpegenc->row[i][j]; } } } /* guard against a potential error in gst_jpegenc_term_destination which occurs iff bufsize % 4 < free_space_remaining */ jpegenc->bufsize = GST_ROUND_UP_4 (jpegenc->bufsize); jpeg_suppress_tables (&jpegenc->cinfo, TRUE); GST_DEBUG_OBJECT (jpegenc, "resync done"); } static GstFlowReturn gst_jpegenc_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret; GstJpegEnc *jpegenc; guchar *data; gulong size; guint height; guchar *base[3], *end[3]; gint i, j, k; jpegenc = GST_JPEGENC (GST_OBJECT_PARENT (pad)); if (G_UNLIKELY (jpegenc->width <= 0 || jpegenc->height <= 0)) goto not_negotiated; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); GST_LOG_OBJECT (jpegenc, "got buffer of %lu bytes", size); ret = gst_pad_alloc_buffer_and_set_caps (jpegenc->srcpad, GST_BUFFER_OFFSET_NONE, jpegenc->bufsize, GST_PAD_CAPS (jpegenc->srcpad), &jpegenc->output_buffer); if (ret != GST_FLOW_OK) goto done; gst_buffer_copy_metadata (jpegenc->output_buffer, buf, GST_BUFFER_COPY_TIMESTAMPS); height = jpegenc->height; for (i = 0; i < jpegenc->channels; i++) { base[i] = data + jpegenc->offset[i]; end[i] = base[i] + jpegenc->cheight[i] * jpegenc->stride[i]; } jpegenc->jdest.next_output_byte = GST_BUFFER_DATA (jpegenc->output_buffer); jpegenc->jdest.free_in_buffer = GST_BUFFER_SIZE (jpegenc->output_buffer); /* prepare for raw input */ #if JPEG_LIB_VERSION >= 70 jpegenc->cinfo.do_fancy_downsampling = FALSE; #endif jpegenc->cinfo.smoothing_factor = jpegenc->smoothing; jpegenc->cinfo.dct_method = jpegenc->idct_method; jpeg_set_quality (&jpegenc->cinfo, jpegenc->quality, TRUE); jpeg_start_compress (&jpegenc->cinfo, TRUE); GST_LOG_OBJECT (jpegenc, "compressing"); if (jpegenc->planar) { for (i = 0; i < height; i += jpegenc->v_max_samp * DCTSIZE) { for (k = 0; k < jpegenc->channels; k++) { for (j = 0; j < jpegenc->v_samp[k] * DCTSIZE; j++) { jpegenc->line[k][j] = base[k]; if (base[k] + jpegenc->stride[k] < end[k]) base[k] += jpegenc->stride[k]; } } jpeg_write_raw_data (&jpegenc->cinfo, jpegenc->line, jpegenc->v_max_samp * DCTSIZE); } } else { for (i = 0; i < height; i += jpegenc->v_max_samp * DCTSIZE) { for (k = 0; k < jpegenc->channels; k++) { for (j = 0; j < jpegenc->v_samp[k] * DCTSIZE; j++) { guchar *src, *dst; gint l; /* ouch, copy line */ src = base[k]; dst = jpegenc->line[k][j]; for (l = jpegenc->cwidth[k]; l > 0; l--) { *dst = *src; src += jpegenc->inc[k]; dst++; } if (base[k] + jpegenc->stride[k] < end[k]) base[k] += jpegenc->stride[k]; } } jpeg_write_raw_data (&jpegenc->cinfo, jpegenc->line, jpegenc->v_max_samp * DCTSIZE); } } /* This will ensure that gst_jpegenc_term_destination is called; we push the final output buffer from there */ jpeg_finish_compress (&jpegenc->cinfo); GST_LOG_OBJECT (jpegenc, "compressing done"); done: gst_buffer_unref (buf); return ret; /* ERRORS */ not_negotiated: { GST_WARNING_OBJECT (jpegenc, "no input format set (no caps on buffer)"); ret = GST_FLOW_NOT_NEGOTIATED; goto done; } } static void gst_jpegenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstJpegEnc *jpegenc = GST_JPEGENC (object); GST_OBJECT_LOCK (jpegenc); switch (prop_id) { case PROP_QUALITY: jpegenc->quality = g_value_get_int (value); break; #ifdef ENABLE_SMOOTHING case PROP_SMOOTHING: jpegenc->smoothing = g_value_get_int (value); break; #endif case PROP_IDCT_METHOD: jpegenc->idct_method = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (jpegenc); } static void gst_jpegenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstJpegEnc *jpegenc = GST_JPEGENC (object); GST_OBJECT_LOCK (jpegenc); switch (prop_id) { case PROP_QUALITY: g_value_set_int (value, jpegenc->quality); break; #ifdef ENABLE_SMOOTHING case PROP_SMOOTHING: g_value_set_int (value, jpegenc->smoothing); break; #endif case PROP_IDCT_METHOD: g_value_set_enum (value, jpegenc->idct_method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (jpegenc); } static GstStateChangeReturn gst_jpegenc_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstJpegEnc *filter = GST_JPEGENC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: GST_DEBUG_OBJECT (element, "setting line buffers"); filter->line[0] = NULL; filter->line[1] = NULL; filter->line[2] = NULL; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_jpegenc_reset (filter); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/jpeg/Makefile.am0000644000175000017500000000111211671175352015563 00000000000000plugin_LTLIBRARIES = libgstjpeg.la libgstjpeg_la_SOURCES = \ gstjpeg.c \ gstjpegenc.c \ gstjpegdec.c \ gstsmokeenc.c \ smokecodec.c \ gstsmokedec.c libgstjpeg_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstjpeg_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(JPEG_LIBS) $(LIBM) libgstjpeg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstjpeg_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstjpeg.h \ gstjpegdec.h gstjpegenc.h \ gstsmokeenc.h gstsmokedec.h \ smokecodec.h smokeformat.h gst-plugins-good-0.10.31/ext/jpeg/smokecodec.h0000644000175000017500000001154311671175352016025 00000000000000/* Smoke Codec * Copyright (C) <2004> Wim Taymans * * 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 __SMOKECODEC_H__ #define __SMOKECODEC_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct _SmokeCodecInfo SmokeCodecInfo; typedef enum { SMOKECODEC_WRONGVERSION = -5, SMOKECODEC_WRONGSIZE = -4, SMOKECODEC_ERROR = -3, SMOKECODEC_NOMEM = -2, SMOKECODEC_NULLPTR = -1, SMOKECODEC_OK = 0 } SmokeCodecResult; typedef enum { SMOKECODEC_KEYFRAME = (1<<0), SMOKECODEC_MOTION_VECTORS = (1<<1) } SmokeCodecFlags; #define SMOKECODEC_ID_STRING "smoke" typedef enum { SMOKECODEC_TYPE_ID = 0x80, SMOKECODEC_TYPE_COMMENT = 0x81, SMOKECODEC_TYPE_EXTRA = 0x83, SMOKECODEC_TYPE_DATA = 0x40 } SmokePacketType; /* init */ int smokecodec_encode_new (SmokeCodecInfo **info, const unsigned int width, const unsigned int height, const unsigned int fps_num, const unsigned int fps_denom); int smokecodec_decode_new (SmokeCodecInfo **info); int smokecodec_info_free (SmokeCodecInfo * info); /* config */ SmokeCodecResult smokecodec_set_quality (SmokeCodecInfo *info, const unsigned int min, const unsigned int max); SmokeCodecResult smokecodec_get_quality (SmokeCodecInfo *info, unsigned int *min, unsigned int *max); SmokeCodecResult smokecodec_set_threshold (SmokeCodecInfo *info, const unsigned int threshold); SmokeCodecResult smokecodec_get_threshold (SmokeCodecInfo *info, unsigned int *threshold); SmokeCodecResult smokecodec_set_bitrate (SmokeCodecInfo *info, const unsigned int bitrate); SmokeCodecResult smokecodec_get_bitrate (SmokeCodecInfo *info, unsigned int *bitrate); /* encoding */ SmokeCodecResult smokecodec_encode_id (SmokeCodecInfo *info, unsigned char *out, unsigned int *outsize); SmokeCodecResult smokecodec_encode (SmokeCodecInfo *info, const unsigned char *in, SmokeCodecFlags flags, unsigned char *out, unsigned int *outsize); /* decoding */ SmokeCodecResult smokecodec_parse_id (SmokeCodecInfo *info, const unsigned char *in, const unsigned int insize); SmokeCodecResult smokecodec_parse_header (SmokeCodecInfo *info, const unsigned char *in, const unsigned int insize, SmokeCodecFlags *flags, unsigned int *width, unsigned int *height, unsigned int *fps_num, unsigned int *fps_denom); SmokeCodecResult smokecodec_decode (SmokeCodecInfo *info, const unsigned char *in, const unsigned int insize, unsigned char *out); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __SMOKECODEC_H__ */ gst-plugins-good-0.10.31/ext/jpeg/gstjpegenc.h0000644000175000017500000000563111671175352016043 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_JPEGENC_H__ #define __GST_JPEGENC_H__ #include #include /* this is a hack hack hack to get around jpeglib header bugs... */ #ifdef HAVE_STDLIB_H # undef HAVE_STDLIB_H #endif #include #include G_BEGIN_DECLS #define GST_TYPE_JPEGENC \ (gst_jpegenc_get_type()) #define GST_JPEGENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JPEGENC,GstJpegEnc)) #define GST_JPEGENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JPEGENC,GstJpegEncClass)) #define GST_IS_JPEGENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JPEGENC)) #define GST_IS_JPEGENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEGENC)) typedef struct _GstJpegEnc GstJpegEnc; typedef struct _GstJpegEncClass GstJpegEncClass; #define GST_JPEG_ENC_MAX_COMPONENT 4 struct _GstJpegEnc { GstElement element; /* pads */ GstPad *sinkpad, *srcpad; /* stream/image properties */ GstVideoFormat format; gint width; gint height; gint channels; gint fps_num, fps_den; gint par_num, par_den; /* standard video_format indexed */ gint stride[GST_JPEG_ENC_MAX_COMPONENT]; gint offset[GST_JPEG_ENC_MAX_COMPONENT]; gint inc[GST_JPEG_ENC_MAX_COMPONENT]; gint cwidth[GST_JPEG_ENC_MAX_COMPONENT]; gint cheight[GST_JPEG_ENC_MAX_COMPONENT]; gint h_samp[GST_JPEG_ENC_MAX_COMPONENT]; gint v_samp[GST_JPEG_ENC_MAX_COMPONENT]; gint h_max_samp; gint v_max_samp; gboolean planar; /* the video buffer */ gint bufsize; /* the jpeg line buffer */ guchar **line[3]; /* indirect encoding line buffers */ guchar *row[3][4 * DCTSIZE]; struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; struct jpeg_destination_mgr jdest; /* properties */ gint quality; gint smoothing; gint idct_method; /* cached return state for any problems that may occur in callbacks */ GstFlowReturn last_ret; GstBuffer *output_buffer; }; struct _GstJpegEncClass { GstElementClass parent_class; /* signals */ void (*frame_encoded) (GstElement * element); }; GType gst_jpegenc_get_type (void); G_END_DECLS #endif /* __GST_JPEGENC_H__ */ gst-plugins-good-0.10.31/ext/jpeg/smokeformat.h0000644000175000017500000000237511671175352016243 00000000000000/* Smoke Codec * Copyright (C) <2004> Wim Taymans * * 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 __SMOKEFORMAT_H__ #define __SMOKEFORMAT_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define IDX_TYPE 0 #define IDX_WIDTH 1 #define IDX_HEIGHT 3 #define IDX_FPS_NUM 5 #define IDX_FPS_DENOM 9 #define IDX_FLAGS 13 #define IDX_NUM_BLOCKS 14 #define IDX_SIZE 16 #define IDX_BLOCKS 18 #define OFFS_PICT 18 #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __SMOKEFORMAT_H__ */ gst-plugins-good-0.10.31/ext/jpeg/gstjpeg.h0000644000175000017500000000203411671175352015347 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_JPEG_H__ #define __GST_JPEG_H__ #include G_BEGIN_DECLS #define GST_TYPE_IDCT_METHOD (gst_idct_method_get_type()) GType gst_idct_method_get_type (void); G_END_DECLS #endif /* __GST_JPEG_H__ */ gst-plugins-good-0.10.31/ext/jpeg/README0000644000175000017500000000141411671175352014414 00000000000000The Smoke Codec --------------- This is a very simple compression algorithm I was toying with when doing a Java based player. Decoding a JPEG in Java has acceptable speed so this codec tries to exploit that feature. The algorithm first compares the last and the new image and finds all 16x16 blocks that have a squared difference bigger than a configurable threshold. Then all these blocks are compressed into an NxM JPEG. The quality of the JPEG is inversely proportional to the number of blocks, this way, the picture quality degrades with heavy motion scenes but the bitrate stays more or less constant. Decoding decompresses the JPEG and then updates the old picture with the new blocks. TODO: ---- - make format extensible - motion vectors - do some real bitrate control gst-plugins-good-0.10.31/ext/jpeg/gstsmokeenc.h0000644000175000017500000000362411671175352016234 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SMOKEENC_H__ #define __GST_SMOKEENC_H__ #include #include "smokecodec.h" G_BEGIN_DECLS #define GST_TYPE_SMOKEENC \ (gst_smokeenc_get_type()) #define GST_SMOKEENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMOKEENC,GstSmokeEnc)) #define GST_SMOKEENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMOKEENC,GstSmokeEncClass)) #define GST_IS_SMOKEENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMOKEENC)) #define GST_IS_SMOKEENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOKEENC)) typedef struct _GstSmokeEnc GstSmokeEnc; typedef struct _GstSmokeEncClass GstSmokeEncClass; struct _GstSmokeEnc { GstElement element; /* pads */ GstPad *sinkpad,*srcpad; /* video state */ gint format; gint width; gint height; gint frame; gint keyframe; gint fps_num, fps_denom; SmokeCodecInfo *info; gint threshold; gint min_quality; gint max_quality; gboolean need_header; }; struct _GstSmokeEncClass { GstElementClass parent_class; }; GType gst_smokeenc_get_type(void); G_END_DECLS #endif /* __GST_SMOKEENC_H__ */ gst-plugins-good-0.10.31/ext/jpeg/gstsmokeenc.c0000644000175000017500000003425511677341654016241 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-smokeenc * * Encodes images in smoke format. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstsmokeenc.h" #include GST_DEBUG_CATEGORY_STATIC (smokeenc_debug); #define GST_CAT_DEFAULT smokeenc_debug /* SmokeEnc signals and args */ enum { FRAME_ENCODED, /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_PROP_MIN_QUALITY 10 #define DEFAULT_PROP_MAX_QUALITY 85 #define DEFAULT_PROP_THRESHOLD 3000 #define DEFAULT_PROP_KEYFRAME 20 enum { PROP_0, PROP_MIN_QUALITY, PROP_MAX_QUALITY, PROP_THRESHOLD, PROP_KEYFRAME /* FILL ME */ }; static void gst_smokeenc_base_init (gpointer g_class); static void gst_smokeenc_class_init (GstSmokeEnc * klass); static void gst_smokeenc_init (GstSmokeEnc * smokeenc); static void gst_smokeenc_finalize (GObject * object); static GstStateChangeReturn gst_smokeenc_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_smokeenc_chain (GstPad * pad, GstBuffer * buf); static GstCaps *gst_smokeenc_getcaps (GstPad * pad); static gboolean gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_smokeenc_resync (GstSmokeEnc * smokeenc); static void gst_smokeenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_smokeenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; GType gst_smokeenc_get_type (void) { static GType smokeenc_type = 0; if (!smokeenc_type) { static const GTypeInfo smokeenc_info = { sizeof (GstSmokeEncClass), (GBaseInitFunc) gst_smokeenc_base_init, NULL, (GClassInitFunc) gst_smokeenc_class_init, NULL, NULL, sizeof (GstSmokeEnc), 0, (GInstanceInitFunc) gst_smokeenc_init, }; smokeenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSmokeEnc", &smokeenc_info, 0); } return smokeenc_type; } static GstStaticPadTemplate gst_smokeenc_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstStaticPadTemplate gst_smokeenc_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-smoke, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0/1, MAX ]") ); static void gst_smokeenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_smokeenc_sink_pad_template); gst_element_class_add_static_pad_template (element_class, &gst_smokeenc_src_pad_template); gst_element_class_set_details_simple (element_class, "Smoke video encoder", "Codec/Encoder/Video", "Encode images into the Smoke format", "Wim Taymans "); } static void gst_smokeenc_class_init (GstSmokeEnc * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_smokeenc_finalize; gobject_class->set_property = gst_smokeenc_set_property; gobject_class->get_property = gst_smokeenc_get_property; g_object_class_install_property (gobject_class, PROP_MIN_QUALITY, g_param_spec_int ("qmin", "Qmin", "Minimum quality", 0, 100, DEFAULT_PROP_MIN_QUALITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MAX_QUALITY, g_param_spec_int ("qmax", "Qmax", "Maximum quality", 0, 100, DEFAULT_PROP_MAX_QUALITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_THRESHOLD, g_param_spec_int ("threshold", "Threshold", "Motion estimation threshold", 0, 100000000, DEFAULT_PROP_THRESHOLD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_KEYFRAME, g_param_spec_int ("keyframe", "Keyframe", "Insert keyframe every N frames", 1, 100000, DEFAULT_PROP_KEYFRAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_smokeenc_change_state); GST_DEBUG_CATEGORY_INIT (smokeenc_debug, "smokeenc", 0, "Smoke encoding element"); } static void gst_smokeenc_init (GstSmokeEnc * smokeenc) { /* create the sink and src pads */ smokeenc->sinkpad = gst_pad_new_from_static_template (&gst_smokeenc_sink_pad_template, "sink"); gst_pad_set_chain_function (smokeenc->sinkpad, gst_smokeenc_chain); gst_pad_set_getcaps_function (smokeenc->sinkpad, gst_smokeenc_getcaps); gst_pad_set_setcaps_function (smokeenc->sinkpad, gst_smokeenc_setcaps); gst_element_add_pad (GST_ELEMENT (smokeenc), smokeenc->sinkpad); smokeenc->srcpad = gst_pad_new_from_static_template (&gst_smokeenc_src_pad_template, "src"); gst_pad_set_getcaps_function (smokeenc->srcpad, gst_smokeenc_getcaps); gst_pad_use_fixed_caps (smokeenc->srcpad); gst_element_add_pad (GST_ELEMENT (smokeenc), smokeenc->srcpad); smokeenc->min_quality = DEFAULT_PROP_MIN_QUALITY; smokeenc->max_quality = DEFAULT_PROP_MAX_QUALITY; smokeenc->threshold = DEFAULT_PROP_THRESHOLD; smokeenc->keyframe = DEFAULT_PROP_KEYFRAME; } static void gst_smokeenc_finalize (GObject * object) { GstSmokeEnc *enc = GST_SMOKEENC (object); if (enc->info) smokecodec_info_free (enc->info); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_smokeenc_getcaps (GstPad * pad) { GstSmokeEnc *smokeenc = GST_SMOKEENC (gst_pad_get_parent (pad)); GstPad *otherpad; GstCaps *result, *caps; const GstCaps *tcaps; const char *name; int i; GstStructure *structure = NULL; /* we want to proxy properties like width, height and framerate from the other end of the element */ otherpad = (pad == smokeenc->srcpad) ? smokeenc->sinkpad : smokeenc->srcpad; /* get template caps, we always need this to fiter the peer caps */ tcaps = gst_pad_get_pad_template_caps (otherpad); /* get any constraints on the peer pad */ caps = gst_pad_peer_get_caps (otherpad); if (caps == NULL) caps = gst_caps_copy (tcaps); else caps = gst_caps_make_writable (caps); /* intersect with the template */ result = gst_caps_intersect (caps, tcaps); gst_caps_unref (caps); if (pad == smokeenc->srcpad) { name = "video/x-smoke"; } else { name = "video/x-raw-yuv"; } /* we can only copy width, height, framerate from one side to the other */ for (i = 0; i < gst_caps_get_size (result); i++) { structure = gst_caps_get_structure (result, i); gst_structure_set_name (structure, name); gst_structure_remove_field (structure, "format"); /* ... but for the sink pad, we only do I420 anyway, so add that */ if (pad == smokeenc->sinkpad) { gst_structure_set (structure, "format", GST_TYPE_FOURCC, GST_STR_FOURCC ("I420"), NULL); } } gst_object_unref (smokeenc); return result; } static gboolean gst_smokeenc_setcaps (GstPad * pad, GstCaps * caps) { GstSmokeEnc *smokeenc; GstStructure *structure; const GValue *framerate; gboolean ret; GstCaps *srccaps; smokeenc = GST_SMOKEENC (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); framerate = gst_structure_get_value (structure, "framerate"); if (framerate) { smokeenc->fps_num = gst_value_get_fraction_numerator (framerate); smokeenc->fps_denom = gst_value_get_fraction_denominator (framerate); } else { smokeenc->fps_num = 0; smokeenc->fps_denom = 1; } gst_structure_get_int (structure, "width", &smokeenc->width); gst_structure_get_int (structure, "height", &smokeenc->height); if ((smokeenc->width & 0x0f) != 0 || (smokeenc->height & 0x0f) != 0) goto width_or_height_notx16; if (!gst_smokeenc_resync (smokeenc)) goto init_failed; srccaps = gst_caps_new_simple ("video/x-smoke", "width", G_TYPE_INT, smokeenc->width, "height", G_TYPE_INT, smokeenc->height, "framerate", GST_TYPE_FRACTION, smokeenc->fps_num, smokeenc->fps_denom, NULL); ret = gst_pad_set_caps (smokeenc->srcpad, srccaps); gst_caps_unref (srccaps); gst_object_unref (smokeenc); return ret; width_or_height_notx16: { GST_WARNING_OBJECT (smokeenc, "width and height must be multiples of 16" ", %dx%d not allowed", smokeenc->width, smokeenc->height); gst_object_unref (smokeenc); return FALSE; } init_failed: { GST_WARNING_OBJECT (smokeenc, "could not init decoder"); gst_object_unref (smokeenc); return FALSE; } } static gboolean gst_smokeenc_resync (GstSmokeEnc * smokeenc) { int ret; GST_DEBUG ("resync: %dx%d@%d/%dfps", smokeenc->width, smokeenc->height, smokeenc->fps_num, smokeenc->fps_denom); if (smokeenc->info) smokecodec_info_free (smokeenc->info); ret = smokecodec_encode_new (&smokeenc->info, smokeenc->width, smokeenc->height, smokeenc->fps_num, smokeenc->fps_denom); if (ret != SMOKECODEC_OK) goto init_failed; smokecodec_set_quality (smokeenc->info, smokeenc->min_quality, smokeenc->max_quality); GST_DEBUG ("resync done"); return TRUE; /* ERRORS */ init_failed: { GST_WARNING_OBJECT (smokeenc, "smokecodec_encode_new() failed: %d", ret); return FALSE; } } static GstFlowReturn gst_smokeenc_chain (GstPad * pad, GstBuffer * buf) { GstSmokeEnc *smokeenc; guchar *data, *outdata; gulong size; gint outsize; guint encsize; GstBuffer *outbuf; SmokeCodecFlags flags; GstFlowReturn ret; smokeenc = GST_SMOKEENC (GST_OBJECT_PARENT (pad)); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); GST_LOG_OBJECT (smokeenc, "got buffer of %lu bytes", size); if (smokeenc->need_header) { outbuf = gst_buffer_new_and_alloc (256); outdata = GST_BUFFER_DATA (outbuf); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); smokecodec_encode_id (smokeenc->info, outdata, &encsize); GST_BUFFER_SIZE (outbuf) = encsize; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad)); ret = gst_pad_push (smokeenc->srcpad, outbuf); if (ret != GST_FLOW_OK) goto done; smokeenc->need_header = FALSE; } encsize = outsize = smokeenc->width * smokeenc->height * 3; outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, smokeenc->fps_denom, smokeenc->fps_num); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokeenc->srcpad)); flags = 0; if ((smokeenc->frame % smokeenc->keyframe) == 0) { flags |= SMOKECODEC_KEYFRAME; } smokecodec_set_quality (smokeenc->info, smokeenc->min_quality, smokeenc->max_quality); smokecodec_set_threshold (smokeenc->info, smokeenc->threshold); smokecodec_encode (smokeenc->info, data, flags, outdata, &encsize); gst_buffer_unref (buf); GST_BUFFER_SIZE (outbuf) = encsize; GST_BUFFER_OFFSET (outbuf) = smokeenc->frame; GST_BUFFER_OFFSET_END (outbuf) = smokeenc->frame + 1; ret = gst_pad_push (smokeenc->srcpad, outbuf); smokeenc->frame++; done: return ret; } static void gst_smokeenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSmokeEnc *smokeenc; g_return_if_fail (GST_IS_SMOKEENC (object)); smokeenc = GST_SMOKEENC (object); switch (prop_id) { case PROP_MIN_QUALITY: smokeenc->min_quality = g_value_get_int (value); break; case PROP_MAX_QUALITY: smokeenc->max_quality = g_value_get_int (value); break; case PROP_THRESHOLD: smokeenc->threshold = g_value_get_int (value); break; case PROP_KEYFRAME: smokeenc->keyframe = g_value_get_int (value); break; default: break; } } static void gst_smokeenc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSmokeEnc *smokeenc; g_return_if_fail (GST_IS_SMOKEENC (object)); smokeenc = GST_SMOKEENC (object); switch (prop_id) { case PROP_MIN_QUALITY: g_value_set_int (value, smokeenc->min_quality); break; case PROP_MAX_QUALITY: g_value_set_int (value, smokeenc->max_quality); break; case PROP_THRESHOLD: g_value_set_int (value, smokeenc->threshold); break; case PROP_KEYFRAME: g_value_set_int (value, smokeenc->keyframe); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_smokeenc_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstSmokeEnc *enc; enc = GST_SMOKEENC (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: /* reset the initial video state */ enc->width = 0; enc->height = 0; enc->frame = 0; enc->need_header = TRUE; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/jpeg/Makefile.in0000644000175000017500000010175611720560226015604 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/jpeg DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstjpeg_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstjpeg_la_OBJECTS = libgstjpeg_la-gstjpeg.lo \ libgstjpeg_la-gstjpegenc.lo libgstjpeg_la-gstjpegdec.lo \ libgstjpeg_la-gstsmokeenc.lo libgstjpeg_la-smokecodec.lo \ libgstjpeg_la-gstsmokedec.lo libgstjpeg_la_OBJECTS = $(am_libgstjpeg_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstjpeg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstjpeg_la_CFLAGS) $(CFLAGS) \ $(libgstjpeg_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstjpeg_la_SOURCES) DIST_SOURCES = $(libgstjpeg_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstjpeg.la libgstjpeg_la_SOURCES = \ gstjpeg.c \ gstjpegenc.c \ gstjpegdec.c \ gstsmokeenc.c \ smokecodec.c \ gstsmokedec.c libgstjpeg_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstjpeg_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(JPEG_LIBS) $(LIBM) libgstjpeg_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstjpeg_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstjpeg.h \ gstjpegdec.h gstjpegenc.h \ gstsmokeenc.h gstsmokedec.h \ smokecodec.h smokeformat.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/jpeg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/jpeg/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstjpeg.la: $(libgstjpeg_la_OBJECTS) $(libgstjpeg_la_DEPENDENCIES) $(EXTRA_libgstjpeg_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstjpeg_la_LINK) -rpath $(plugindir) $(libgstjpeg_la_OBJECTS) $(libgstjpeg_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstjpeg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstjpegdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstjpegenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstsmokedec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-gstsmokeenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjpeg_la-smokecodec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstjpeg_la-gstjpeg.lo: gstjpeg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstjpeg.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstjpeg.Tpo -c -o libgstjpeg_la-gstjpeg.lo `test -f 'gstjpeg.c' || echo '$(srcdir)/'`gstjpeg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstjpeg.Tpo $(DEPDIR)/libgstjpeg_la-gstjpeg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpeg.c' object='libgstjpeg_la-gstjpeg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstjpeg.lo `test -f 'gstjpeg.c' || echo '$(srcdir)/'`gstjpeg.c libgstjpeg_la-gstjpegenc.lo: gstjpegenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstjpegenc.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstjpegenc.Tpo -c -o libgstjpeg_la-gstjpegenc.lo `test -f 'gstjpegenc.c' || echo '$(srcdir)/'`gstjpegenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstjpegenc.Tpo $(DEPDIR)/libgstjpeg_la-gstjpegenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpegenc.c' object='libgstjpeg_la-gstjpegenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstjpegenc.lo `test -f 'gstjpegenc.c' || echo '$(srcdir)/'`gstjpegenc.c libgstjpeg_la-gstjpegdec.lo: gstjpegdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstjpegdec.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstjpegdec.Tpo -c -o libgstjpeg_la-gstjpegdec.lo `test -f 'gstjpegdec.c' || echo '$(srcdir)/'`gstjpegdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstjpegdec.Tpo $(DEPDIR)/libgstjpeg_la-gstjpegdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjpegdec.c' object='libgstjpeg_la-gstjpegdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstjpegdec.lo `test -f 'gstjpegdec.c' || echo '$(srcdir)/'`gstjpegdec.c libgstjpeg_la-gstsmokeenc.lo: gstsmokeenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstsmokeenc.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstsmokeenc.Tpo -c -o libgstjpeg_la-gstsmokeenc.lo `test -f 'gstsmokeenc.c' || echo '$(srcdir)/'`gstsmokeenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstsmokeenc.Tpo $(DEPDIR)/libgstjpeg_la-gstsmokeenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmokeenc.c' object='libgstjpeg_la-gstsmokeenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstsmokeenc.lo `test -f 'gstsmokeenc.c' || echo '$(srcdir)/'`gstsmokeenc.c libgstjpeg_la-smokecodec.lo: smokecodec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-smokecodec.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-smokecodec.Tpo -c -o libgstjpeg_la-smokecodec.lo `test -f 'smokecodec.c' || echo '$(srcdir)/'`smokecodec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-smokecodec.Tpo $(DEPDIR)/libgstjpeg_la-smokecodec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smokecodec.c' object='libgstjpeg_la-smokecodec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-smokecodec.lo `test -f 'smokecodec.c' || echo '$(srcdir)/'`smokecodec.c libgstjpeg_la-gstsmokedec.lo: gstsmokedec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -MT libgstjpeg_la-gstsmokedec.lo -MD -MP -MF $(DEPDIR)/libgstjpeg_la-gstsmokedec.Tpo -c -o libgstjpeg_la-gstsmokedec.lo `test -f 'gstsmokedec.c' || echo '$(srcdir)/'`gstsmokedec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjpeg_la-gstsmokedec.Tpo $(DEPDIR)/libgstjpeg_la-gstsmokedec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmokedec.c' object='libgstjpeg_la-gstsmokedec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjpeg_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjpeg_la_CFLAGS) $(CFLAGS) -c -o libgstjpeg_la-gstsmokedec.lo `test -f 'gstsmokedec.c' || echo '$(srcdir)/'`gstsmokedec.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/jpeg/smokecodec.c0000644000175000017500000004270711671175352016026 00000000000000/* Smoke codec * Copyright (C) <2004> Wim Taymans * * 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 #include #include #include /* this is a hack hack hack to get around jpeglib header bugs... */ #ifdef HAVE_STDLIB_H # undef HAVE_STDLIB_H #endif #include #include "smokecodec.h" #include "smokeformat.h" #include struct _SmokeCodecInfo { unsigned int width; unsigned int height; unsigned int fps_num; unsigned int fps_denom; unsigned int minquality; unsigned int maxquality; unsigned int bitrate; unsigned int threshold; unsigned int refdec; unsigned char **line[3]; unsigned char *compbuf[3]; struct jpeg_error_mgr jerr; struct jpeg_compress_struct cinfo; struct jpeg_destination_mgr jdest; struct jpeg_decompress_struct dinfo; struct jpeg_source_mgr jsrc; int need_keyframe; unsigned char *reference; }; static void smokecodec_init_destination (j_compress_ptr cinfo) { } static boolean smokecodec_flush_destination (j_compress_ptr cinfo) { return 1; } static void smokecodec_term_destination (j_compress_ptr cinfo) { } static void smokecodec_init_source (j_decompress_ptr cinfo) { } static boolean smokecodec_fill_input_buffer (j_decompress_ptr cinfo) { return 1; } static void smokecodec_skip_input_data (j_decompress_ptr cinfo, long num_bytes) { } static boolean smokecodec_resync_to_restart (j_decompress_ptr cinfo, int desired) { return 1; } static void smokecodec_term_source (j_decompress_ptr cinfo) { } int smokecodec_encode_new (SmokeCodecInfo ** info, const unsigned int width, const unsigned int height, const unsigned int fps_num, const unsigned int fps_denom) { SmokeCodecInfo *newinfo; int i, j; unsigned char *base[3]; if (!info) return SMOKECODEC_NULLPTR; if ((width & 0xf) || (height & 0xf)) return SMOKECODEC_WRONGSIZE; newinfo = malloc (sizeof (SmokeCodecInfo)); if (!newinfo) { return SMOKECODEC_NOMEM; } newinfo->width = width; newinfo->height = height; newinfo->fps_num = fps_num; newinfo->fps_denom = fps_denom; /* setup jpeglib */ memset (&newinfo->cinfo, 0, sizeof (newinfo->cinfo)); memset (&newinfo->jerr, 0, sizeof (newinfo->jerr)); newinfo->cinfo.err = jpeg_std_error (&newinfo->jerr); jpeg_create_compress (&newinfo->cinfo); newinfo->cinfo.input_components = 3; jpeg_set_defaults (&newinfo->cinfo); newinfo->cinfo.dct_method = JDCT_FASTEST; /* prepare for raw input */ #if JPEG_LIB_VERSION >= 70 newinfo->cinfo.do_fancy_downsampling = FALSE; #endif newinfo->cinfo.raw_data_in = TRUE; newinfo->cinfo.in_color_space = JCS_YCbCr; newinfo->cinfo.comp_info[0].h_samp_factor = 2; newinfo->cinfo.comp_info[0].v_samp_factor = 2; newinfo->cinfo.comp_info[1].h_samp_factor = 1; newinfo->cinfo.comp_info[1].v_samp_factor = 1; newinfo->cinfo.comp_info[2].h_samp_factor = 1; newinfo->cinfo.comp_info[2].v_samp_factor = 1; newinfo->line[0] = malloc (DCTSIZE * 2 * sizeof (char *)); newinfo->line[1] = malloc (DCTSIZE * sizeof (char *)); newinfo->line[2] = malloc (DCTSIZE * sizeof (char *)); base[0] = newinfo->compbuf[0] = malloc (256 * 2 * DCTSIZE * 2 * DCTSIZE); base[1] = newinfo->compbuf[1] = malloc (256 * DCTSIZE * DCTSIZE); base[2] = newinfo->compbuf[2] = malloc (256 * DCTSIZE * DCTSIZE); for (i = 0, j = 0; i < 2 * DCTSIZE; i += 2, j++) { newinfo->line[0][i] = base[0]; base[0] += 2 * DCTSIZE * 256; newinfo->line[0][i + 1] = base[0]; base[0] += 2 * DCTSIZE * 256; newinfo->line[1][j] = base[1]; base[1] += DCTSIZE * 256; newinfo->line[2][j] = base[2]; base[2] += DCTSIZE * 256; } newinfo->jdest.init_destination = smokecodec_init_destination; newinfo->jdest.empty_output_buffer = smokecodec_flush_destination; newinfo->jdest.term_destination = smokecodec_term_destination; newinfo->cinfo.dest = &newinfo->jdest; jpeg_suppress_tables (&newinfo->cinfo, FALSE); memset (&newinfo->dinfo, 0, sizeof (newinfo->dinfo)); newinfo->dinfo.err = jpeg_std_error (&newinfo->jerr); jpeg_create_decompress (&newinfo->dinfo); newinfo->jsrc.init_source = smokecodec_init_source; newinfo->jsrc.fill_input_buffer = smokecodec_fill_input_buffer; newinfo->jsrc.skip_input_data = smokecodec_skip_input_data; newinfo->jsrc.resync_to_restart = smokecodec_resync_to_restart; newinfo->jsrc.term_source = smokecodec_term_source; newinfo->dinfo.src = &newinfo->jsrc; newinfo->need_keyframe = 1; newinfo->threshold = 4000; newinfo->minquality = 10; newinfo->maxquality = 85; newinfo->reference = malloc (3 * (width * height) / 2); newinfo->refdec = 0; *info = newinfo; return SMOKECODEC_OK; } int smokecodec_decode_new (SmokeCodecInfo ** info) { return smokecodec_encode_new (info, 16, 16, 1, 1); } int smokecodec_info_free (SmokeCodecInfo * info) { free (info->line[0]); free (info->line[1]); free (info->line[2]); free (info->compbuf[0]); free (info->compbuf[1]); free (info->compbuf[2]); free (info->reference); jpeg_destroy_compress (&info->cinfo); jpeg_destroy_decompress (&info->dinfo); free (info); return SMOKECODEC_OK; } SmokeCodecResult smokecodec_set_quality (SmokeCodecInfo * info, const unsigned int min, const unsigned int max) { info->minquality = min; info->maxquality = max; return SMOKECODEC_OK; } SmokeCodecResult smokecodec_get_quality (SmokeCodecInfo * info, unsigned int *min, unsigned int *max) { *min = info->minquality; *max = info->maxquality; return SMOKECODEC_OK; } SmokeCodecResult smokecodec_set_threshold (SmokeCodecInfo * info, const unsigned int threshold) { info->threshold = threshold; return SMOKECODEC_OK; } SmokeCodecResult smokecodec_get_threshold (SmokeCodecInfo * info, unsigned int *threshold) { *threshold = info->threshold; return SMOKECODEC_OK; } SmokeCodecResult smokecodec_set_bitrate (SmokeCodecInfo * info, const unsigned int bitrate) { info->bitrate = bitrate; return SMOKECODEC_OK; } SmokeCodecResult smokecodec_get_bitrate (SmokeCodecInfo * info, unsigned int *bitrate) { *bitrate = info->bitrate; return SMOKECODEC_OK; } static void find_best_size (int blocks, unsigned int *width, unsigned int *height) { int sqchng; int w, h; int best, bestw; int free; sqchng = ceil (sqrt (blocks)); w = sqchng; h = sqchng; GST_DEBUG ("guess: %d %d", w, h); free = w * h - blocks; best = free; bestw = w; while (w < 256) { GST_DEBUG ("current: %d %d", w, h); if (free < best) { best = free; bestw = w; if (free == 0) break; } // if we cannot reduce the height, increase width if (free < w) { w++; free += h; } // reduce height while possible while (free >= w) { h--; free -= w; } } *width = bestw; *height = (blocks + best) / bestw; } static int abs_diff (const unsigned char *in1, const unsigned char *in2, const int stride) { int s; int i, j, diff; s = 0; for (i = 0; i < 2 * DCTSIZE; i++) { for (j = 0; j < 2 * DCTSIZE; j++) { diff = in1[j] - in2[j]; s += diff * diff; } in1 += stride; in2 += stride; } return s; } static void put (const unsigned char *src, unsigned char *dest, int width, int height, int srcstride, int deststride) { int i, j; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[j] = src[j]; } src += srcstride; dest += deststride; } } /* encoding */ SmokeCodecResult smokecodec_encode_id (SmokeCodecInfo * info, unsigned char *out, unsigned int *outsize) { int i; *out++ = SMOKECODEC_TYPE_ID; for (i = 0; i < strlen (SMOKECODEC_ID_STRING); i++) { *out++ = SMOKECODEC_ID_STRING[i]; } *out++ = 0; *out++ = 1; *out++ = 0; *outsize = 9; return SMOKECODEC_OK; } SmokeCodecResult smokecodec_encode (SmokeCodecInfo * info, const unsigned char *in, SmokeCodecFlags flags, unsigned char *out, unsigned int *outsize) { unsigned int i, j, s; const unsigned char *ip; unsigned char *op; unsigned int blocks, encoding; unsigned int size; unsigned int width, height; unsigned int blocks_w, blocks_h; unsigned int threshold; unsigned int max; if (info->need_keyframe) { flags |= SMOKECODEC_KEYFRAME; info->need_keyframe = 0; } if (flags & SMOKECODEC_KEYFRAME) threshold = 0; else threshold = info->threshold; ip = in; op = info->reference; width = info->width; height = info->height; blocks_w = width / (DCTSIZE * 2); blocks_h = height / (DCTSIZE * 2); max = blocks_w * blocks_h; out[IDX_TYPE] = SMOKECODEC_TYPE_DATA; #define STORE16(var, pos, x) \ var[pos] = (x >> 8); \ var[pos+1] = (x & 0xff); #define STORE32(var, pos, x) \ var[pos] = ((x >> 24) & 0xff); \ var[pos+1] = ((x >> 16) & 0xff); \ var[pos+2] = ((x >> 8) & 0xff); \ var[pos+3] = (x & 0xff); /* write dimension */ STORE16 (out, IDX_WIDTH, width); STORE16 (out, IDX_HEIGHT, height); /* write framerate */ STORE32 (out, IDX_FPS_NUM, info->fps_num); STORE32 (out, IDX_FPS_DENOM, info->fps_denom); if (!(flags & SMOKECODEC_KEYFRAME)) { int block = 0; blocks = 0; for (i = 0; i < height; i += 2 * DCTSIZE) { for (j = 0; j < width; j += 2 * DCTSIZE) { s = abs_diff (ip, op, width); if (s >= threshold) { STORE16 (out, blocks * 2 + IDX_BLOCKS, block); blocks++; } ip += 2 * DCTSIZE; op += 2 * DCTSIZE; block++; } ip += (2 * DCTSIZE - 1) * width; op += (2 * DCTSIZE - 1) * width; } if (blocks == max) { flags |= SMOKECODEC_KEYFRAME; blocks = 0; encoding = max; } else { encoding = blocks; } } else { blocks = 0; encoding = max; } STORE16 (out, IDX_NUM_BLOCKS, blocks); out[IDX_FLAGS] = (flags & 0xff); GST_DEBUG ("blocks %d, encoding %d", blocks, encoding); info->jdest.next_output_byte = &out[blocks * 2 + OFFS_PICT]; info->jdest.free_in_buffer = (*outsize) - OFFS_PICT; if (encoding > 0) { int quality; if (!(flags & SMOKECODEC_KEYFRAME)) find_best_size (encoding, &blocks_w, &blocks_h); GST_DEBUG ("best: %d %d", blocks_w, blocks_h); info->cinfo.image_width = blocks_w * DCTSIZE * 2; info->cinfo.image_height = blocks_h * DCTSIZE * 2; if (flags & SMOKECODEC_KEYFRAME) { quality = (info->maxquality * 60) / 100; } else { quality = info->maxquality - ((info->maxquality - info->minquality) * blocks) / max; } GST_DEBUG ("set q %d %d %d", quality, encoding, max); jpeg_set_quality (&info->cinfo, quality, TRUE); GST_DEBUG ("start"); jpeg_start_compress (&info->cinfo, TRUE); for (i = 0; i < encoding; i++) { int pos; int x, y; if (flags & SMOKECODEC_KEYFRAME) pos = i; else pos = (out[i * 2 + IDX_BLOCKS] << 8) | (out[i * 2 + IDX_BLOCKS + 1]); x = pos % (width / (DCTSIZE * 2)); y = pos / (width / (DCTSIZE * 2)); ip = in + (x * (DCTSIZE * 2)) + (y * (DCTSIZE * 2) * width); op = info->compbuf[0] + (i % blocks_w) * (DCTSIZE * 2); put (ip, op, 2 * DCTSIZE, 2 * DCTSIZE, width, 256 * (DCTSIZE * 2)); ip = in + width * height + (x * DCTSIZE) + (y * DCTSIZE * width / 2); op = info->compbuf[1] + (i % blocks_w) * (DCTSIZE); put (ip, op, DCTSIZE, DCTSIZE, width / 2, 256 * DCTSIZE); ip = in + 5 * (width * height) / 4 + (x * DCTSIZE) + (y * DCTSIZE * width / 2); op = info->compbuf[2] + (i % blocks_w) * (DCTSIZE); put (ip, op, DCTSIZE, DCTSIZE, width / 2, 256 * DCTSIZE); if ((i % blocks_w) == (blocks_w - 1) || (i == encoding - 1)) { GST_DEBUG ("write %d", pos); jpeg_write_raw_data (&info->cinfo, info->line, 2 * DCTSIZE); } } GST_DEBUG ("finish"); jpeg_finish_compress (&info->cinfo); } size = ((((*outsize) - OFFS_PICT - info->jdest.free_in_buffer) + 3) & ~3); STORE16 (out, IDX_SIZE, size); *outsize = size + blocks * 2 + OFFS_PICT; GST_DEBUG ("outsize %d", *outsize); // and decode in reference frame again if (info->refdec) { smokecodec_decode (info, out, *outsize, info->reference); } else { memcpy (info->reference, in, 3 * (width * height) / 2); } return SMOKECODEC_OK; } SmokeCodecResult smokecodec_parse_id (SmokeCodecInfo * info, const unsigned char *in, const unsigned int insize) { int i; if (insize < 4 + strlen (SMOKECODEC_ID_STRING)) { return SMOKECODEC_WRONGVERSION; } if (*in++ != SMOKECODEC_TYPE_ID) return SMOKECODEC_ERROR; for (i = 0; i < strlen (SMOKECODEC_ID_STRING); i++) { if (*in++ != SMOKECODEC_ID_STRING[i]) return SMOKECODEC_ERROR; } if (*in++ != 0 || *in++ != 1 || *in++ != 0) return SMOKECODEC_ERROR; return SMOKECODEC_OK; } #define READ16(var, pos, x) \ x = var[pos]<<8 | var[pos+1]; #define READ32(var, pos, x) \ x = var[pos]<<24 | var[pos+1]<<16 | \ var[pos+2]<<8 | var[pos+3]; /* decoding */ SmokeCodecResult smokecodec_parse_header (SmokeCodecInfo * info, const unsigned char *in, const unsigned int insize, SmokeCodecFlags * flags, unsigned int *width, unsigned int *height, unsigned int *fps_num, unsigned int *fps_denom) { READ16 (in, IDX_WIDTH, *width); READ16 (in, IDX_HEIGHT, *height); *flags = in[IDX_FLAGS]; READ32 (in, IDX_FPS_NUM, *fps_num); READ32 (in, IDX_FPS_DENOM, *fps_denom); if (info->width != *width || info->height != *height || info->fps_num != *fps_num || info->fps_denom != *fps_denom) { GST_DEBUG ("new width: %d %d", *width, *height); info->reference = realloc (info->reference, 3 * ((*width) * (*height)) / 2); info->width = *width; info->height = *height; info->fps_num = *fps_num; info->fps_denom = *fps_denom; } return SMOKECODEC_OK; } SmokeCodecResult smokecodec_decode (SmokeCodecInfo * info, const unsigned char *in, const unsigned int insize, unsigned char *out) { unsigned int width, height; unsigned int fps_num, fps_denom; SmokeCodecFlags flags; int i, j; int blocks_w, blocks_h; int blockptr; int blocks, decoding; const unsigned char *ip; unsigned char *op; int res; smokecodec_parse_header (info, in, insize, &flags, &width, &height, &fps_num, &fps_denom); READ16 (in, IDX_NUM_BLOCKS, blocks); GST_DEBUG ("blocks %d", blocks); if (flags & SMOKECODEC_KEYFRAME) decoding = width / (DCTSIZE * 2) * height / (DCTSIZE * 2); else decoding = blocks; if (decoding > 0) { info->jsrc.next_input_byte = &in[blocks * 2 + OFFS_PICT]; info->jsrc.bytes_in_buffer = insize - (blocks * 2 + OFFS_PICT); GST_DEBUG ("header %02x %d", in[blocks * 2 + OFFS_PICT], insize); res = jpeg_read_header (&info->dinfo, TRUE); GST_DEBUG ("header %d %d %d", res, info->dinfo.image_width, info->dinfo.image_height); blocks_w = info->dinfo.image_width / (2 * DCTSIZE); blocks_h = info->dinfo.image_height / (2 * DCTSIZE); info->dinfo.output_width = info->dinfo.image_width; info->dinfo.output_height = info->dinfo.image_height; GST_DEBUG ("start"); info->dinfo.do_fancy_upsampling = FALSE; info->dinfo.do_block_smoothing = FALSE; info->dinfo.out_color_space = JCS_YCbCr; info->dinfo.dct_method = JDCT_IFAST; info->dinfo.raw_data_out = TRUE; jpeg_start_decompress (&info->dinfo); blockptr = 0; for (i = 0; i < blocks_h; i++) { GST_DEBUG ("read"); jpeg_read_raw_data (&info->dinfo, info->line, 2 * DCTSIZE); GST_DEBUG ("copy %d", blocks_w); for (j = 0; j < blocks_w; j++) { int pos; int x, y; if (flags & SMOKECODEC_KEYFRAME) pos = blockptr; else READ16 (in, blockptr * 2 + IDX_BLOCKS, pos); x = pos % (width / (DCTSIZE * 2)); y = pos / (width / (DCTSIZE * 2)); GST_DEBUG ("block %d %d %d", pos, x, y); ip = info->compbuf[0] + j * (DCTSIZE * 2); op = info->reference + (x * (DCTSIZE * 2)) + (y * (DCTSIZE * 2) * width); put (ip, op, 2 * DCTSIZE, 2 * DCTSIZE, 256 * (DCTSIZE * 2), width); ip = info->compbuf[1] + j * (DCTSIZE); op = info->reference + width * height + (x * DCTSIZE) + (y * DCTSIZE * width / 2); put (ip, op, DCTSIZE, DCTSIZE, 256 * DCTSIZE, width / 2); ip = info->compbuf[2] + j * (DCTSIZE); op = info->reference + 5 * (width * height) / 4 + (x * DCTSIZE) + (y * DCTSIZE * width / 2); put (ip, op, DCTSIZE, DCTSIZE, 256 * DCTSIZE, width / 2); GST_DEBUG ("block done %d %d %d", pos, x, y); blockptr++; if (blockptr >= decoding) break; } } GST_DEBUG ("finish"); jpeg_finish_decompress (&info->dinfo); } GST_DEBUG ("copy"); if (out != info->reference) memcpy (out, info->reference, 3 * (width * height) / 2); GST_DEBUG ("copy done"); return SMOKECODEC_OK; } gst-plugins-good-0.10.31/ext/jpeg/gstsmokedec.c0000644000175000017500000002126211677341654016221 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-smokedec * * Decodes images in smoke format. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /*#define DEBUG_ENABLED*/ #include "gstsmokedec.h" #include GST_DEBUG_CATEGORY_STATIC (smokedec_debug); #define GST_CAT_DEFAULT smokedec_debug /* SmokeDec signals and args */ enum { LAST_SIGNAL }; enum { PROP_0 }; static void gst_smokedec_base_init (gpointer g_class); static void gst_smokedec_class_init (GstSmokeDec * klass); static void gst_smokedec_init (GstSmokeDec * smokedec); static void gst_smokedec_finalize (GObject * object); static GstStateChangeReturn gst_smokedec_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_smokedec_chain (GstPad * pad, GstBuffer * buf); static GstElementClass *parent_class = NULL; /*static guint gst_smokedec_signals[LAST_SIGNAL] = { 0 }; */ GType gst_smokedec_get_type (void) { static GType smokedec_type = 0; if (!smokedec_type) { static const GTypeInfo smokedec_info = { sizeof (GstSmokeDecClass), gst_smokedec_base_init, NULL, (GClassInitFunc) gst_smokedec_class_init, NULL, NULL, sizeof (GstSmokeDec), 0, (GInstanceInitFunc) gst_smokedec_init, }; smokedec_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSmokeDec", &smokedec_info, 0); } return smokedec_type; } static GstStaticPadTemplate gst_smokedec_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstStaticPadTemplate gst_smokedec_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-smoke, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0/1, MAX ]") ); static void gst_smokedec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_smokedec_src_pad_template); gst_element_class_add_static_pad_template (element_class, &gst_smokedec_sink_pad_template); gst_element_class_set_details_simple (element_class, "Smoke video decoder", "Codec/Decoder/Video", "Decode video from Smoke format", "Wim Taymans "); } static void gst_smokedec_class_init (GstSmokeDec * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_smokedec_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_smokedec_change_state); GST_DEBUG_CATEGORY_INIT (smokedec_debug, "smokedec", 0, "Smoke decoder"); } static void gst_smokedec_init (GstSmokeDec * smokedec) { GST_DEBUG_OBJECT (smokedec, "gst_smokedec_init: initializing"); /* create the sink and src pads */ smokedec->sinkpad = gst_pad_new_from_static_template (&gst_smokedec_sink_pad_template, "sink"); gst_pad_set_chain_function (smokedec->sinkpad, gst_smokedec_chain); gst_element_add_pad (GST_ELEMENT (smokedec), smokedec->sinkpad); smokedec->srcpad = gst_pad_new_from_static_template (&gst_smokedec_src_pad_template, "src"); gst_pad_use_fixed_caps (smokedec->srcpad); gst_element_add_pad (GST_ELEMENT (smokedec), smokedec->srcpad); smokecodec_decode_new (&smokedec->info); } static void gst_smokedec_finalize (GObject * object) { GstSmokeDec *dec = GST_SMOKEDEC (object); smokecodec_info_free (dec->info); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstFlowReturn gst_smokedec_chain (GstPad * pad, GstBuffer * buf) { GstSmokeDec *smokedec; guint8 *data, *outdata; gulong size, outsize; GstBuffer *outbuf; SmokeCodecFlags flags; GstClockTime time; guint width, height; guint fps_num, fps_denom; gint smokeret; GstFlowReturn ret; smokedec = GST_SMOKEDEC (gst_pad_get_parent (pad)); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); time = GST_BUFFER_TIMESTAMP (buf); if (size < 1) goto too_small; GST_LOG_OBJECT (smokedec, "got buffer of %lu bytes", size); /* have the ID packet. */ if (data[0] == SMOKECODEC_TYPE_ID) { smokeret = smokecodec_parse_id (smokedec->info, data, size); if (smokeret != SMOKECODEC_OK) goto header_error; ret = GST_FLOW_OK; goto done; } /* now handle data packets */ GST_DEBUG_OBJECT (smokedec, "reading header %08lx", *(gulong *) data); smokecodec_parse_header (smokedec->info, data, size, &flags, &width, &height, &fps_num, &fps_denom); if (smokedec->height != height || smokedec->width != width || smokedec->fps_num != fps_num || smokedec->fps_denom != fps_denom) { GstCaps *caps; GST_DEBUG_OBJECT (smokedec, "parameter change: %dx%d @ %d/%dfps", width, height, fps_num, fps_denom); smokedec->height = height; smokedec->width = width; caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, fps_num, fps_denom, NULL); gst_pad_set_caps (smokedec->srcpad, caps); gst_caps_unref (caps); } if (smokedec->need_keyframe) { if (!(flags & SMOKECODEC_KEYFRAME)) goto keyframe_skip; smokedec->need_keyframe = FALSE; } outsize = width * height + width * height / 2; outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, fps_denom, fps_num); GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buf); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smokedec->srcpad)); if (time == GST_CLOCK_TIME_NONE) { if (GST_BUFFER_OFFSET (buf) == -1) { time = smokedec->next_time; } else { time = GST_BUFFER_OFFSET (buf) * GST_BUFFER_DURATION (outbuf); } } GST_BUFFER_TIMESTAMP (outbuf) = time; if (time != -1) smokedec->next_time = time + GST_BUFFER_DURATION (outbuf); else smokedec->next_time = -1; smokeret = smokecodec_decode (smokedec->info, data, size, outdata); if (smokeret != SMOKECODEC_OK) goto decode_error; GST_DEBUG_OBJECT (smokedec, "gst_smokedec_chain: sending buffer"); ret = gst_pad_push (smokedec->srcpad, outbuf); done: gst_buffer_unref (buf); gst_object_unref (smokedec); return ret; /* ERRORS */ too_small: { GST_ELEMENT_ERROR (smokedec, STREAM, DECODE, (NULL), ("Input buffer too small")); ret = GST_FLOW_ERROR; goto done; } header_error: { GST_ELEMENT_ERROR (smokedec, STREAM, DECODE, (NULL), ("Could not parse smoke header, reason: %d", smokeret)); ret = GST_FLOW_ERROR; goto done; } keyframe_skip: { GST_DEBUG_OBJECT (smokedec, "dropping buffer while waiting for keyframe"); ret = GST_FLOW_OK; goto done; } decode_error: { GST_ELEMENT_ERROR (smokedec, STREAM, DECODE, (NULL), ("Could not decode smoke frame, reason: %d", smokeret)); ret = GST_FLOW_ERROR; goto done; } } static GstStateChangeReturn gst_smokedec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstSmokeDec *dec; dec = GST_SMOKEDEC (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: /* reset the initial video state */ dec->format = -1; dec->width = -1; dec->height = -1; dec->fps_num = -1; dec->fps_denom = -1; dec->next_time = 0; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/Makefile.am0000644000175000017500000000352311671175352014646 00000000000000if USE_AALIB AALIB_DIR = aalib else AALIB_DIR = endif if USE_ANNODEX ANNODEX_DIR = annodex else ANNODEX_DIR = endif if USE_CAIRO CAIRO_DIR = cairo else CAIRO_DIR = endif if USE_ESD ESD_DIR = esd else ESD_DIR = endif if USE_FLAC FLAC_DIR = flac else FLAC_DIR = endif if USE_GCONF GCONF_DIR = gconf else GCONF_DIR = endif if USE_GDK_PIXBUF GDK_PIXBUF_DIR = gdk_pixbuf else GDK_PIXBUF_DIR = endif if USE_HAL HAL_DIR = hal else HAL_DIR = endif if USE_JACK JACK_DIR=jack else JACK_DIR= endif if USE_JPEG JPEG_DIR = jpeg else JPEG_DIR = endif if USE_LIBCACA LIBCACA_DIR = libcaca else LIBCACA_DIR = endif if USE_LIBDV LIBDV_DIR = dv else LIBDV_DIR = endif # if USE_LIBMNG # LIBMNG_DIR = libmng # else LIBMNG_DIR = # endif if USE_LIBPNG LIBPNG_DIR = libpng else LIBPNG_DIR = endif # if USE_MIKMOD # MIKMOD_DIR = mikmod # else MIKMOD_DIR = # endif if USE_DV1394 DV1394_DIR = raw1394 else DV1394_DIR = endif if USE_PULSE PULSE_DIR = pulse else PULSE_DIR = endif if USE_SHOUT2 SHOUT2_DIR = shout2 else SHOUT2_DIR = endif if USE_SOUP SOUP_DIR=soup else SOUP_DIR= endif if USE_SPEEX SPEEX_DIR = speex else SPEEX_DIR = endif if USE_TAGLIB TAGLIB_DIR = taglib else TAGLIB_DIR = endif if USE_WAVPACK WAVPACK_DIR=wavpack else WAVPACK_DIR= endif SUBDIRS = \ $(AALIB_DIR) \ $(ANNODEX_DIR) \ $(CAIRO_DIR) \ $(DV1394_DIR) \ $(ESD_DIR) \ $(FLAC_DIR) \ $(GCONF_DIR) \ $(GDK_PIXBUF_DIR) \ $(HAL_DIR) \ $(JACK_DIR) \ $(JPEG_DIR) \ $(LIBCACA_DIR) \ $(LIBDV_DIR) \ $(LIBMNG_DIR) \ $(LIBPNG_DIR) \ $(MIKMOD_DIR) \ $(PULSE_DIR) \ $(SHOUT2_DIR) \ $(SOUP_DIR) \ $(SPEEX_DIR) \ $(TAGLIB_DIR) \ $(WAVPACK_DIR) DIST_SUBDIRS = \ aalib \ annodex \ cairo \ dv \ esd \ flac \ gconf \ gdk_pixbuf \ hal \ jack \ jpeg \ libcaca \ libpng \ pulse \ raw1394 \ shout2 \ soup \ speex \ taglib \ wavpack include $(top_srcdir)/common/parallel-subdirs.mak gst-plugins-good-0.10.31/ext/esd/0000755000175000017500000000000011720565321013434 500000000000000gst-plugins-good-0.10.31/ext/esd/gstesd.c0000644000175000017500000000334011671175352015017 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David A. Schleef * * 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 "esdsink.h" #if 0 #include "esdmon.h" #endif #include "gst/gst-i18n-plugin.h" GST_DEBUG_CATEGORY (esd_debug); static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "esdsink", GST_RANK_MARGINAL, GST_TYPE_ESDSINK)) return FALSE; #if 0 if (!gst_element_register (plugin, "esdmon", GST_RANK_NONE, GST_TYPE_ESDMON)) return FALSE; #endif GST_DEBUG_CATEGORY_INIT (esd_debug, "esd", 0, "ESounD elements"); #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "esdsink", "ESD Element Plugins", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/esd/Makefile.am0000644000175000017500000000067611671175352015427 00000000000000plugin_LTLIBRARIES = libgstesd.la libgstesd_la_SOURCES = esdsink.c gstesd.c libgstesd_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ESD_CFLAGS) libgstesd_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(ESD_LIBS) libgstesd_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstesd_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = esdsink.h esdmon.h EXTRA_DIST = gst-plugins-good-0.10.31/ext/esd/esdsink.h0000644000175000017500000000340411671175352015174 00000000000000/* GStreamer * Copyright (C) <2005> Arwed v. Merkatz * * esdsink.h: an EsounD audio sink * * 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_ESDSINK_H__ #define __GST_ESDSINK_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_ESDSINK \ (gst_esdsink_get_type()) #define GST_ESDSINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ESDSINK,GstEsdSink)) #define GST_ESDSINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESDSINK,GstEsdSinkClass)) #define GST_IS_ESDSINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDSINK)) #define GST_IS_ESDSINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDSINK)) typedef struct _GstEsdSink GstEsdSink; typedef struct _GstEsdSinkClass GstEsdSinkClass; struct _GstEsdSink { GstAudioSink sink; int fd; int ctrl_fd; gchar *host; guint rate; GstCaps *cur_caps; }; struct _GstEsdSinkClass { GstAudioSinkClass parent_class; }; GType gst_esdsink_get_type (void); G_END_DECLS #endif /* __GST_ESDSINK_H__ */ gst-plugins-good-0.10.31/ext/esd/esdsink.c0000644000175000017500000003061611677341654015202 00000000000000/* GStreamer * Copyright (C) <2005> Arwed v. Merkatz * * Roughly based on the gstreamer 0.8 esdsink plugin: * Copyright (C) <2001> Richard Boulton * * esdsink.c: an EsounD audio sink * * 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-esdsink * @see_also: #GstAlsaSink, #GstAutoAudioSink * * This element outputs sound to an already-running Enlightened Sound Daemon * (ESound Daemon, esd). Note that a sound daemon will never be auto-spawned * through this element (regardless of the system configuration), since this * is actively prevented by the element. If you must use esd, you need to * make sure it is started automatically with your session or otherwise. * * TODO: insert some comments about how sucky esd is and that all the cool * kids use pulseaudio or whatever these days. * * * Example launch line * |[ * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! esdsink * ]| play an Ogg/Vorbis audio file via esd * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "esdsink.h" #include #include #include #include /* wtay: from my esd.h (debian unstable libesd0-dev 0.2.36-3) */ #ifndef ESD_MAX_WRITE_SIZE #define ESD_MAX_WRITE_SIZE (21 * 4096) #endif GST_DEBUG_CATEGORY_EXTERN (esd_debug); #define GST_CAT_DEFAULT esd_debug enum { PROP_0, PROP_HOST }; static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " "audio/x-raw-int, " "signed = (boolean) { true, false }, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") ); static void gst_esdsink_finalize (GObject * object); static GstCaps *gst_esdsink_getcaps (GstBaseSink * bsink); static gboolean gst_esdsink_open (GstAudioSink * asink); static gboolean gst_esdsink_close (GstAudioSink * asink); static gboolean gst_esdsink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); static gboolean gst_esdsink_unprepare (GstAudioSink * asink); static guint gst_esdsink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_esdsink_delay (GstAudioSink * asink); static void gst_esdsink_reset (GstAudioSink * asink); static void gst_esdsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_esdsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstEsdSink, gst_esdsink, GstAudioSink, GST_TYPE_AUDIO_SINK); static void gst_esdsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Esound audio sink", "Sink/Audio", "Plays audio to an esound server", "Arwed von Merkatz "); } static void gst_esdsink_class_init (GstEsdSinkClass * klass) { GObjectClass *gobject_class; GstBaseSinkClass *gstbasesink_class; GstAudioSinkClass *gstaudiosink_class; gobject_class = (GObjectClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; gstaudiosink_class = (GstAudioSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_esdsink_finalize; gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_esdsink_getcaps); gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_esdsink_open); gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_esdsink_close); gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_esdsink_prepare); gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_esdsink_unprepare); gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_esdsink_write); gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_esdsink_delay); gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_esdsink_reset); gobject_class->set_property = gst_esdsink_set_property; gobject_class->get_property = gst_esdsink_get_property; /* default value is filled in the _init method */ g_object_class_install_property (gobject_class, PROP_HOST, g_param_spec_string ("host", "Host", "The host running the esound daemon", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_esdsink_init (GstEsdSink * esdsink, GstEsdSinkClass * klass) { esdsink->fd = -1; esdsink->ctrl_fd = -1; esdsink->host = g_strdup (g_getenv ("ESPEAKER")); } static void gst_esdsink_finalize (GObject * object) { GstEsdSink *esdsink = GST_ESDSINK (object); gst_caps_replace (&esdsink->cur_caps, NULL); g_free (esdsink->host); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_esdsink_getcaps (GstBaseSink * bsink) { GstEsdSink *esdsink; esdsink = GST_ESDSINK (bsink); /* no fd, we're done with the template caps */ if (esdsink->ctrl_fd < 0 || esdsink->cur_caps == NULL) { GST_LOG_OBJECT (esdsink, "getcaps called, returning template caps"); return NULL; } GST_LOG_OBJECT (esdsink, "returning %" GST_PTR_FORMAT, esdsink->cur_caps); return gst_caps_ref (esdsink->cur_caps); } static gboolean gst_esdsink_open (GstAudioSink * asink) { esd_server_info_t *server_info; GstPadTemplate *pad_template; GstEsdSink *esdsink; gchar *saved_env; gint i; esdsink = GST_ESDSINK (asink); GST_DEBUG_OBJECT (esdsink, "open"); /* ensure libesd doesn't auto-spawn a sound daemon if none is running yet */ saved_env = g_strdup (g_getenv ("ESD_NO_SPAWN")); g_setenv ("ESD_NO_SPAWN", "1", TRUE); /* now try to connect to any existing/running sound daemons */ esdsink->ctrl_fd = esd_open_sound (esdsink->host); /* and restore the previous state */ if (saved_env != NULL) { g_setenv ("ESD_NO_SPAWN", saved_env, TRUE); } else { g_unsetenv ("ESD_NO_SPAWN"); } g_free (saved_env); if (esdsink->ctrl_fd < 0) goto couldnt_connect; /* get server info */ server_info = esd_get_server_info (esdsink->ctrl_fd); if (!server_info) goto no_server_info; GST_INFO_OBJECT (esdsink, "got server info rate: %i", server_info->rate); pad_template = gst_static_pad_template_get (&sink_factory); esdsink->cur_caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); gst_object_unref (pad_template); for (i = 0; i < esdsink->cur_caps->structs->len; i++) { GstStructure *s; s = gst_caps_get_structure (esdsink->cur_caps, i); gst_structure_set (s, "rate", G_TYPE_INT, server_info->rate, NULL); } esd_free_server_info (server_info); GST_INFO_OBJECT (esdsink, "server caps: %" GST_PTR_FORMAT, esdsink->cur_caps); return TRUE; /* ERRORS */ couldnt_connect: { GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, (_("Could not establish connection to sound server")), ("can't open connection to esound server")); return FALSE; } no_server_info: { GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, (_("Failed to query sound server capabilities")), ("couldn't get server info!")); return FALSE; } } static gboolean gst_esdsink_close (GstAudioSink * asink) { GstEsdSink *esdsink = GST_ESDSINK (asink); GST_DEBUG_OBJECT (esdsink, "close"); gst_caps_replace (&esdsink->cur_caps, NULL); esd_close (esdsink->ctrl_fd); esdsink->ctrl_fd = -1; return TRUE; } static gboolean gst_esdsink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) { GstEsdSink *esdsink = GST_ESDSINK (asink); esd_format_t esdformat; /* Name used by esound for this connection. */ const char connname[] = "GStreamer"; GST_DEBUG_OBJECT (esdsink, "prepare"); /* Bitmap describing audio format. */ esdformat = ESD_STREAM | ESD_PLAY; switch (spec->depth) { case 8: esdformat |= ESD_BITS8; break; case 16: esdformat |= ESD_BITS16; break; default: goto unsupported_depth; } switch (spec->channels) { case 1: esdformat |= ESD_MONO; break; case 2: esdformat |= ESD_STEREO; break; default: goto unsupported_channels; } GST_INFO_OBJECT (esdsink, "attempting to open data connection to esound server"); esdsink->fd = esd_play_stream (esdformat, spec->rate, esdsink->host, connname); if ((esdsink->fd < 0) || (esdsink->ctrl_fd < 0)) goto cannot_open; esdsink->rate = spec->rate; spec->segsize = ESD_BUF_SIZE; spec->segtotal = (ESD_MAX_WRITE_SIZE / spec->segsize); /* FIXME: this is wrong for signed ints (and the * audioringbuffers should do it for us anyway) */ spec->silence_sample[0] = 0; spec->silence_sample[1] = 0; spec->silence_sample[2] = 0; spec->silence_sample[3] = 0; GST_INFO_OBJECT (esdsink, "successfully opened connection to esound server"); return TRUE; /* ERRORS */ unsupported_depth: { GST_ELEMENT_ERROR (esdsink, STREAM, WRONG_TYPE, (NULL), ("can't handle sample depth of %d, only 8 or 16 supported", spec->depth)); return FALSE; } unsupported_channels: { GST_ELEMENT_ERROR (esdsink, STREAM, WRONG_TYPE, (NULL), ("can't handle %d channels, only 1 or 2 supported", spec->channels)); return FALSE; } cannot_open: { GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, (_("Could not establish connection to sound server")), ("can't open connection to esound server")); return FALSE; } } static gboolean gst_esdsink_unprepare (GstAudioSink * asink) { GstEsdSink *esdsink = GST_ESDSINK (asink); if ((esdsink->fd < 0) && (esdsink->ctrl_fd < 0)) return TRUE; close (esdsink->fd); esdsink->fd = -1; GST_INFO_OBJECT (esdsink, "closed sound device"); return TRUE; } static guint gst_esdsink_write (GstAudioSink * asink, gpointer data, guint length) { GstEsdSink *esdsink = GST_ESDSINK (asink); gint to_write = 0; to_write = length; while (to_write > 0) { int done; done = write (esdsink->fd, data, to_write); if (done < 0) goto write_error; to_write -= done; data = (char *) data + done; } return length; /* ERRORS */ write_error: { GST_ELEMENT_ERROR (esdsink, RESOURCE, WRITE, ("Failed to write data to the esound daemon"), GST_ERROR_SYSTEM); return -1; } } static guint gst_esdsink_delay (GstAudioSink * asink) { GstEsdSink *esdsink = GST_ESDSINK (asink); guint latency; latency = esd_get_latency (esdsink->ctrl_fd); if (latency == (guint) - 1) { GST_WARNING_OBJECT (asink, "couldn't get latency"); return 0; } /* latency is measured in samples at a rate of 44100, this * cannot overflow. */ latency = latency * G_GINT64_CONSTANT (44100) / esdsink->rate; GST_DEBUG_OBJECT (asink, "got latency: %u", latency); return latency; } static void gst_esdsink_reset (GstAudioSink * asink) { GST_DEBUG_OBJECT (asink, "reset called"); } static void gst_esdsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstEsdSink *esdsink = GST_ESDSINK (object); switch (prop_id) { case PROP_HOST: g_free (esdsink->host); esdsink->host = g_value_dup_string (value); break; default: break; } } static void gst_esdsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstEsdSink *esdsink = GST_ESDSINK (object); switch (prop_id) { case PROP_HOST: g_value_set_string (value, esdsink->host); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/ext/esd/esdmon.h0000644000175000017500000000400211671175352015014 00000000000000/* GStreamer * Copyright (C) <2001,2002> Richard Boulton * * Based on example.c: * Copyright (C) <1999> Erik Walthinsen * * 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_ESDMON_H__ #define __GST_ESDMON_H__ #include G_BEGIN_DECLS #define GST_TYPE_ESDMON \ (gst_esdmon_get_type()) #define GST_ESDMON(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ESDMON,GstEsdmon)) #define GST_ESDMON_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESDMON,GstEsdmonClass)) #define GST_IS_ESDMON(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDMON)) #define GST_IS_ESDMON_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDMON)) typedef enum { GST_ESDMON_OPEN = (GST_ELEMENT_FLAG_LAST << 0), GST_ESDMON_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2) } GstEsdSrcFlags; typedef struct _GstEsdmon GstEsdmon; typedef struct _GstEsdmonClass GstEsdmonClass; struct _GstEsdmon { GstElement element; GstPad *srcpad; gchar* host; int fd; gint depth; gint channels; gint frequency; guint64 basetime; guint64 samples_since_basetime; guint64 curoffset; guint64 bytes_per_read; }; struct _GstEsdmonClass { GstElementClass parent_class; }; GType gst_esdmon_get_type (void); G_END_DECLS #endif /* __GST_ESDMON_H__ */ gst-plugins-good-0.10.31/ext/esd/Makefile.in0000644000175000017500000006750711720560225015436 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/esd DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstesd_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstesd_la_OBJECTS = libgstesd_la-esdsink.lo \ libgstesd_la-gstesd.lo libgstesd_la_OBJECTS = $(am_libgstesd_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstesd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstesd_la_CFLAGS) $(CFLAGS) \ $(libgstesd_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstesd_la_SOURCES) DIST_SOURCES = $(libgstesd_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstesd.la libgstesd_la_SOURCES = esdsink.c gstesd.c libgstesd_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ESD_CFLAGS) libgstesd_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(ESD_LIBS) libgstesd_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstesd_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = esdsink.h esdmon.h EXTRA_DIST = all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/esd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/esd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstesd.la: $(libgstesd_la_OBJECTS) $(libgstesd_la_DEPENDENCIES) $(EXTRA_libgstesd_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstesd_la_LINK) -rpath $(plugindir) $(libgstesd_la_OBJECTS) $(libgstesd_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstesd_la-esdsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstesd_la-gstesd.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstesd_la-esdsink.lo: esdsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -MT libgstesd_la-esdsink.lo -MD -MP -MF $(DEPDIR)/libgstesd_la-esdsink.Tpo -c -o libgstesd_la-esdsink.lo `test -f 'esdsink.c' || echo '$(srcdir)/'`esdsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstesd_la-esdsink.Tpo $(DEPDIR)/libgstesd_la-esdsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='esdsink.c' object='libgstesd_la-esdsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -c -o libgstesd_la-esdsink.lo `test -f 'esdsink.c' || echo '$(srcdir)/'`esdsink.c libgstesd_la-gstesd.lo: gstesd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -MT libgstesd_la-gstesd.lo -MD -MP -MF $(DEPDIR)/libgstesd_la-gstesd.Tpo -c -o libgstesd_la-gstesd.lo `test -f 'gstesd.c' || echo '$(srcdir)/'`gstesd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstesd_la-gstesd.Tpo $(DEPDIR)/libgstesd_la-gstesd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstesd.c' object='libgstesd_la-gstesd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstesd_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstesd_la_CFLAGS) $(CFLAGS) -c -o libgstesd_la-gstesd.lo `test -f 'gstesd.c' || echo '$(srcdir)/'`gstesd.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/speex/0000755000175000017500000000000011720565322014006 500000000000000gst-plugins-good-0.10.31/ext/speex/gstspeexdec.h0000644000175000017500000000440511677341654016433 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SPEEX_DEC_H__ #define __GST_SPEEX_DEC_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_SPEEX_DEC \ (gst_speex_dec_get_type()) #define GST_SPEEX_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEX_DEC,GstSpeexDec)) #define GST_SPEEX_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEX_DEC,GstSpeexDecClass)) #define GST_IS_SPEEX_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEX_DEC)) #define GST_IS_SPEEX_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEX_DEC)) typedef struct _GstSpeexDec GstSpeexDec; typedef struct _GstSpeexDecClass GstSpeexDecClass; struct _GstSpeexDec { GstAudioDecoder element; void *state; SpeexStereoState *stereo; #ifdef SPEEX_1_0 SpeexMode *mode; #else const SpeexMode *mode; #endif SpeexHeader *header; SpeexCallback callback; SpeexBits bits; gboolean enh; gint frame_size; GstClockTime frame_duration; guint64 packetno; GstBuffer *streamheader; GstBuffer *vorbiscomment; }; struct _GstSpeexDecClass { GstAudioDecoderClass parent_class; }; GType gst_speex_dec_get_type (void); G_END_DECLS #endif /* __GST_SPEEX_DEC_H__ */ gst-plugins-good-0.10.31/ext/speex/gstspeexdec.c0000644000175000017500000003707311677341654016435 00000000000000/* GStreamer * Copyright (C) 2004 Wim Taymans * Copyright (C) 2006 Tim-Philipp Müller * * 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-speexdec * @see_also: speexenc, oggdemux * * This element decodes a Speex stream to raw integer audio. * Speex is a royalty-free * audio codec maintained by the Xiph.org * Foundation. * * * Example pipelines * |[ * gst-launch -v filesrc location=speex.ogg ! oggdemux ! speexdec ! audioconvert ! audioresample ! alsasink * ]| Decode an Ogg/Speex file. To create an Ogg/Speex file refer to the * documentation of speexenc. * * * Last reviewed on 2006-04-05 (0.10.2) */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstspeexdec.h" #include #include #include GST_DEBUG_CATEGORY_STATIC (speexdec_debug); #define GST_CAT_DEFAULT speexdec_debug #define DEFAULT_ENH TRUE enum { ARG_0, ARG_ENH }; static GstStaticPadTemplate speex_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 6000, 48000 ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16") ); static GstStaticPadTemplate speex_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-speex") ); GST_BOILERPLATE (GstSpeexDec, gst_speex_dec, GstAudioDecoder, GST_TYPE_AUDIO_DECODER); static gboolean gst_speex_dec_start (GstAudioDecoder * dec); static gboolean gst_speex_dec_stop (GstAudioDecoder * dec); static gboolean gst_speex_dec_set_format (GstAudioDecoder * bdec, GstCaps * caps); static GstFlowReturn gst_speex_dec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer); static void gst_speex_dec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_speex_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_speex_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &speex_dec_src_factory); gst_element_class_add_static_pad_template (element_class, &speex_dec_sink_factory); gst_element_class_set_details_simple (element_class, "Speex audio decoder", "Codec/Decoder/Audio", "decode speex streams to audio", "Wim Taymans "); } static void gst_speex_dec_class_init (GstSpeexDecClass * klass) { GObjectClass *gobject_class; GstAudioDecoderClass *base_class; gobject_class = (GObjectClass *) klass; base_class = (GstAudioDecoderClass *) klass; gobject_class->set_property = gst_speex_dec_set_property; gobject_class->get_property = gst_speex_dec_get_property; base_class->start = GST_DEBUG_FUNCPTR (gst_speex_dec_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_speex_dec_stop); base_class->set_format = GST_DEBUG_FUNCPTR (gst_speex_dec_set_format); base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_speex_dec_handle_frame); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ENH, g_param_spec_boolean ("enh", "Enh", "Enable perceptual enhancement", DEFAULT_ENH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (speexdec_debug, "speexdec", 0, "speex decoding element"); } static void gst_speex_dec_reset (GstSpeexDec * dec) { dec->packetno = 0; dec->frame_size = 0; dec->frame_duration = 0; dec->mode = NULL; free (dec->header); dec->header = NULL; speex_bits_destroy (&dec->bits); gst_buffer_replace (&dec->streamheader, NULL); gst_buffer_replace (&dec->vorbiscomment, NULL); if (dec->stereo) { speex_stereo_state_destroy (dec->stereo); dec->stereo = NULL; } if (dec->state) { speex_decoder_destroy (dec->state); dec->state = NULL; } } static void gst_speex_dec_init (GstSpeexDec * dec, GstSpeexDecClass * g_class) { dec->enh = DEFAULT_ENH; gst_speex_dec_reset (dec); } static gboolean gst_speex_dec_start (GstAudioDecoder * dec) { GstSpeexDec *sd = GST_SPEEX_DEC (dec); GST_DEBUG_OBJECT (dec, "start"); gst_speex_dec_reset (sd); /* we know about concealment */ gst_audio_decoder_set_plc_aware (dec, TRUE); return TRUE; } static gboolean gst_speex_dec_stop (GstAudioDecoder * dec) { GstSpeexDec *sd = GST_SPEEX_DEC (dec); GST_DEBUG_OBJECT (dec, "stop"); gst_speex_dec_reset (sd); return TRUE; } static GstFlowReturn gst_speex_dec_parse_header (GstSpeexDec * dec, GstBuffer * buf) { GstCaps *caps; /* get the header */ dec->header = speex_packet_to_header ((char *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); if (!dec->header) goto no_header; if (dec->header->mode >= SPEEX_NB_MODES || dec->header->mode < 0) goto mode_too_old; dec->mode = speex_lib_get_mode (dec->header->mode); /* initialize the decoder */ dec->state = speex_decoder_init (dec->mode); if (!dec->state) goto init_failed; speex_decoder_ctl (dec->state, SPEEX_SET_ENH, &dec->enh); speex_decoder_ctl (dec->state, SPEEX_GET_FRAME_SIZE, &dec->frame_size); if (dec->header->nb_channels != 1) { dec->stereo = speex_stereo_state_init (); dec->callback.callback_id = SPEEX_INBAND_STEREO; dec->callback.func = speex_std_stereo_request_handler; dec->callback.data = dec->stereo; speex_decoder_ctl (dec->state, SPEEX_SET_HANDLER, &dec->callback); } speex_decoder_ctl (dec->state, SPEEX_SET_SAMPLING_RATE, &dec->header->rate); dec->frame_duration = gst_util_uint64_scale_int (dec->frame_size, GST_SECOND, dec->header->rate); speex_bits_init (&dec->bits); /* set caps */ caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, dec->header->rate, "channels", G_TYPE_INT, dec->header->nb_channels, "signed", G_TYPE_BOOLEAN, TRUE, "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL); if (!gst_pad_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), caps)) goto nego_failed; gst_caps_unref (caps); return GST_FLOW_OK; /* ERRORS */ no_header: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("couldn't read header")); return GST_FLOW_ERROR; } mode_too_old: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("Mode number %d does not (yet/any longer) exist in this version", dec->header->mode)); return GST_FLOW_ERROR; } init_failed: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("couldn't initialize decoder")); return GST_FLOW_ERROR; } nego_failed: { GST_ELEMENT_ERROR (GST_ELEMENT (dec), STREAM, DECODE, (NULL), ("couldn't negotiate format")); gst_caps_unref (caps); return GST_FLOW_NOT_NEGOTIATED; } } static GstFlowReturn gst_speex_dec_parse_comments (GstSpeexDec * dec, GstBuffer * buf) { GstTagList *list; gchar *ver, *encoder = NULL; list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, &encoder); if (!list) { GST_WARNING_OBJECT (dec, "couldn't decode comments"); list = gst_tag_list_new (); } if (encoder) { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, encoder, NULL); } gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, "Speex", NULL); ver = g_strndup (dec->header->speex_version, SPEEX_HEADER_VERSION_LENGTH); g_strstrip (ver); if (ver != NULL && *ver != '\0') { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER_VERSION, ver, NULL); } if (dec->header->bitrate > 0) { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, (guint) dec->header->bitrate, NULL); } GST_INFO_OBJECT (dec, "tags: %" GST_PTR_FORMAT, list); gst_element_found_tags_for_pad (GST_ELEMENT (dec), GST_AUDIO_DECODER_SRC_PAD (dec), list); g_free (encoder); g_free (ver); return GST_FLOW_OK; } static gboolean gst_speex_dec_set_format (GstAudioDecoder * bdec, GstCaps * caps) { GstSpeexDec *dec = GST_SPEEX_DEC (bdec); gboolean ret = TRUE; GstStructure *s; const GValue *streamheader; s = gst_caps_get_structure (caps, 0); if ((streamheader = gst_structure_get_value (s, "streamheader")) && G_VALUE_HOLDS (streamheader, GST_TYPE_ARRAY) && gst_value_array_get_size (streamheader) >= 2) { const GValue *header, *vorbiscomment; GstBuffer *buf; GstFlowReturn res = GST_FLOW_OK; header = gst_value_array_get_value (streamheader, 0); if (header && G_VALUE_HOLDS (header, GST_TYPE_BUFFER)) { buf = gst_value_get_buffer (header); res = gst_speex_dec_parse_header (dec, buf); if (res != GST_FLOW_OK) goto done; gst_buffer_replace (&dec->streamheader, buf); } vorbiscomment = gst_value_array_get_value (streamheader, 1); if (vorbiscomment && G_VALUE_HOLDS (vorbiscomment, GST_TYPE_BUFFER)) { buf = gst_value_get_buffer (vorbiscomment); res = gst_speex_dec_parse_comments (dec, buf); if (res != GST_FLOW_OK) goto done; gst_buffer_replace (&dec->vorbiscomment, buf); } } done: return ret; } static GstFlowReturn gst_speex_dec_parse_data (GstSpeexDec * dec, GstBuffer * buf) { GstFlowReturn res = GST_FLOW_OK; gint i, fpp; guint size; guint8 *data; SpeexBits *bits; if (!dec->frame_duration) goto not_negotiated; if (G_LIKELY (GST_BUFFER_SIZE (buf))) { data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* send data to the bitstream */ speex_bits_read_from (&dec->bits, (char *) data, size); fpp = dec->header->frames_per_packet; bits = &dec->bits; GST_DEBUG_OBJECT (dec, "received buffer of size %u, fpp %d, %d bits", size, fpp, speex_bits_remaining (bits)); } else { /* FIXME ? actually consider how much concealment is needed */ /* concealment data, pass NULL as the bits parameters */ GST_DEBUG_OBJECT (dec, "creating concealment data"); fpp = dec->header->frames_per_packet; bits = NULL; } /* now decode each frame, catering for unknown number of them (e.g. rtp) */ for (i = 0; i < fpp; i++) { GstBuffer *outbuf; gint16 *out_data; gint ret; GST_LOG_OBJECT (dec, "decoding frame %d/%d, %d bits remaining", i, fpp, bits ? speex_bits_remaining (bits) : -1); res = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), GST_BUFFER_OFFSET_NONE, dec->frame_size * dec->header->nb_channels * 2, GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)), &outbuf); if (res != GST_FLOW_OK) { GST_DEBUG_OBJECT (dec, "buf alloc flow: %s", gst_flow_get_name (res)); return res; } out_data = (gint16 *) GST_BUFFER_DATA (outbuf); ret = speex_decode_int (dec->state, bits, out_data); if (ret == -1) { /* uh? end of stream */ if (fpp == 0 && speex_bits_remaining (bits) < 8) { /* if we did not know how many frames to expect, then we get this at the end if there are leftover bits to pad to the next byte */ GST_DEBUG_OBJECT (dec, "Discarding leftover bits"); } else { GST_WARNING_OBJECT (dec, "Unexpected end of stream found"); } gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), NULL, 1); gst_buffer_unref (outbuf); } else if (ret == -2) { GST_WARNING_OBJECT (dec, "Decoding error: corrupted stream?"); gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), NULL, 1); gst_buffer_unref (outbuf); } if (bits && speex_bits_remaining (bits) < 0) { GST_WARNING_OBJECT (dec, "Decoding overflow: corrupted stream?"); gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), NULL, 1); gst_buffer_unref (outbuf); } if (dec->header->nb_channels == 2) speex_decode_stereo_int (out_data, dec->frame_size, dec->stereo); res = gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (dec), outbuf, 1); if (res != GST_FLOW_OK) { GST_DEBUG_OBJECT (dec, "flow: %s", gst_flow_get_name (res)); break; } } return res; /* ERRORS */ not_negotiated: { GST_ELEMENT_ERROR (dec, CORE, NEGOTIATION, (NULL), ("decoder not initialized")); return GST_FLOW_NOT_NEGOTIATED; } } static GstFlowReturn gst_speex_dec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buf) { GstFlowReturn res; GstSpeexDec *dec; /* no fancy draining */ if (G_UNLIKELY (!buf)) return GST_FLOW_OK; dec = GST_SPEEX_DEC (bdec); /* If we have the streamheader and vorbiscomment from the caps already * ignore them here */ if (dec->streamheader && dec->vorbiscomment) { if (GST_BUFFER_SIZE (dec->streamheader) == GST_BUFFER_SIZE (buf) && memcmp (GST_BUFFER_DATA (dec->streamheader), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)) == 0) { GST_DEBUG_OBJECT (dec, "found streamheader"); gst_audio_decoder_finish_frame (bdec, NULL, 1); res = GST_FLOW_OK; } else if (GST_BUFFER_SIZE (dec->vorbiscomment) == GST_BUFFER_SIZE (buf) && memcmp (GST_BUFFER_DATA (dec->vorbiscomment), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)) == 0) { GST_DEBUG_OBJECT (dec, "found vorbiscomments"); gst_audio_decoder_finish_frame (bdec, NULL, 1); res = GST_FLOW_OK; } else { res = gst_speex_dec_parse_data (dec, buf); } } else { /* Otherwise fall back to packet counting and assume that the * first two packets are the headers. */ switch (dec->packetno) { case 0: GST_DEBUG_OBJECT (dec, "counted streamheader"); res = gst_speex_dec_parse_header (dec, buf); gst_audio_decoder_finish_frame (bdec, NULL, 1); break; case 1: GST_DEBUG_OBJECT (dec, "counted vorbiscomments"); res = gst_speex_dec_parse_comments (dec, buf); gst_audio_decoder_finish_frame (bdec, NULL, 1); break; default: { res = gst_speex_dec_parse_data (dec, buf); break; } } } dec->packetno++; return res; } static void gst_speex_dec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSpeexDec *speexdec; speexdec = GST_SPEEX_DEC (object); switch (prop_id) { case ARG_ENH: g_value_set_boolean (value, speexdec->enh); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_speex_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSpeexDec *speexdec; speexdec = GST_SPEEX_DEC (object); switch (prop_id) { case ARG_ENH: speexdec->enh = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/ext/speex/Makefile.am0000644000175000017500000000105011677341654015771 00000000000000plugin_LTLIBRARIES = libgstspeex.la libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c gstspeexenc.c libgstspeex_la_CFLAGS = -DGST_USE_UNSTABLE_API \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(SPEEX_CFLAGS) libgstspeex_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgsttag-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(SPEEX_LIBS) libgstspeex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) libgstspeex_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstspeexenc.h gstspeexdec.h gst-plugins-good-0.10.31/ext/speex/gstspeexenc.h0000644000175000017500000000531611677341654016447 00000000000000/* GStreamer Speex Encoder * Copyright (C) <1999> Erik Walthinsen * * 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_SPEEX_ENC_H__ #define __GST_SPEEX_ENC_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_SPEEX_ENC \ (gst_speex_enc_get_type()) #define GST_SPEEX_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPEEX_ENC,GstSpeexEnc)) #define GST_SPEEX_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPEEX_ENC,GstSpeexEncClass)) #define GST_IS_SPEEX_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEEX_ENC)) #define GST_IS_SPEEX_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEEX_ENC)) typedef enum { GST_SPEEX_ENC_MODE_AUTO, GST_SPEEX_ENC_MODE_UWB, GST_SPEEX_ENC_MODE_WB, GST_SPEEX_ENC_MODE_NB } GstSpeexMode; typedef struct _GstSpeexEnc GstSpeexEnc; typedef struct _GstSpeexEncClass GstSpeexEncClass; struct _GstSpeexEnc { GstAudioEncoder element; SpeexBits bits; SpeexHeader header; #ifdef SPEEX_1_0 SpeexMode *speex_mode; #else const SpeexMode *speex_mode; #endif void *state; /* properties */ GstSpeexMode mode; gfloat quality; gint bitrate; gboolean vbr; gint abr; gboolean vad; gboolean dtx; gint complexity; gint nframes; gchar *last_message; gint channels; gint rate; gboolean header_sent; GSList *headers; GstTagList *tags; gint frame_size; gint lookahead; guint8 *comments; gint comment_len; }; struct _GstSpeexEncClass { GstAudioEncoderClass parent_class; }; GType gst_speex_enc_get_type (void); G_END_DECLS #endif /* __GST_SPEEXENC_H__ */ gst-plugins-good-0.10.31/ext/speex/Makefile.in0000644000175000017500000007255111720560227016004 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/speex DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstspeex_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstspeex_la_OBJECTS = libgstspeex_la-gstspeex.lo \ libgstspeex_la-gstspeexdec.lo libgstspeex_la-gstspeexenc.lo libgstspeex_la_OBJECTS = $(am_libgstspeex_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstspeex_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstspeex_la_CFLAGS) $(CFLAGS) \ $(libgstspeex_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstspeex_la_SOURCES) DIST_SOURCES = $(libgstspeex_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstspeex.la libgstspeex_la_SOURCES = gstspeex.c gstspeexdec.c gstspeexenc.c libgstspeex_la_CFLAGS = -DGST_USE_UNSTABLE_API \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(SPEEX_CFLAGS) libgstspeex_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgsttag-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(SPEEX_LIBS) libgstspeex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) libgstspeex_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstspeexenc.h gstspeexdec.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/speex/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/speex/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstspeex.la: $(libgstspeex_la_OBJECTS) $(libgstspeex_la_DEPENDENCIES) $(EXTRA_libgstspeex_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstspeex_la_LINK) -rpath $(plugindir) $(libgstspeex_la_OBJECTS) $(libgstspeex_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspeex_la-gstspeex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspeex_la-gstspeexdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspeex_la-gstspeexenc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstspeex_la-gstspeex.lo: gstspeex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -MT libgstspeex_la-gstspeex.lo -MD -MP -MF $(DEPDIR)/libgstspeex_la-gstspeex.Tpo -c -o libgstspeex_la-gstspeex.lo `test -f 'gstspeex.c' || echo '$(srcdir)/'`gstspeex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspeex_la-gstspeex.Tpo $(DEPDIR)/libgstspeex_la-gstspeex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspeex.c' object='libgstspeex_la-gstspeex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -c -o libgstspeex_la-gstspeex.lo `test -f 'gstspeex.c' || echo '$(srcdir)/'`gstspeex.c libgstspeex_la-gstspeexdec.lo: gstspeexdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -MT libgstspeex_la-gstspeexdec.lo -MD -MP -MF $(DEPDIR)/libgstspeex_la-gstspeexdec.Tpo -c -o libgstspeex_la-gstspeexdec.lo `test -f 'gstspeexdec.c' || echo '$(srcdir)/'`gstspeexdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspeex_la-gstspeexdec.Tpo $(DEPDIR)/libgstspeex_la-gstspeexdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspeexdec.c' object='libgstspeex_la-gstspeexdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -c -o libgstspeex_la-gstspeexdec.lo `test -f 'gstspeexdec.c' || echo '$(srcdir)/'`gstspeexdec.c libgstspeex_la-gstspeexenc.lo: gstspeexenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -MT libgstspeex_la-gstspeexenc.lo -MD -MP -MF $(DEPDIR)/libgstspeex_la-gstspeexenc.Tpo -c -o libgstspeex_la-gstspeexenc.lo `test -f 'gstspeexenc.c' || echo '$(srcdir)/'`gstspeexenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspeex_la-gstspeexenc.Tpo $(DEPDIR)/libgstspeex_la-gstspeexenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspeexenc.c' object='libgstspeex_la-gstspeexenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspeex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspeex_la_CFLAGS) $(CFLAGS) -c -o libgstspeex_la-gstspeexenc.lo `test -f 'gstspeexenc.c' || echo '$(srcdir)/'`gstspeexenc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/speex/gstspeex.c0000644000175000017500000000267211671175352015750 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #endif #include "gstspeexdec.h" #include "gstspeexenc.h" #include static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "speexenc", GST_RANK_PRIMARY, GST_TYPE_SPEEX_ENC)) return FALSE; if (!gst_element_register (plugin, "speexdec", GST_RANK_PRIMARY, GST_TYPE_SPEEX_DEC)) return FALSE; gst_tag_register_musicbrainz_tags (); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "speex", "Speex plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/speex/gstspeexenc.c0000644000175000017500000006305111677341654016442 00000000000000/* GStreamer Speex Encoder * Copyright (C) <1999> Erik Walthinsen * * 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-speexenc * @see_also: speexdec, oggmux * * This element encodes audio as a Speex stream. * Speex is a royalty-free * audio codec maintained by the Xiph.org * Foundation. * * * Example pipelines * |[ * gst-launch audiotestsrc num-buffers=100 ! speexenc ! oggmux ! filesink location=beep.ogg * ]| Encode an Ogg/Speex file. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include "gstspeexenc.h" GST_DEBUG_CATEGORY_STATIC (speexenc_debug); #define GST_CAT_DEFAULT speexenc_debug static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 6000, 48000 ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-speex, " "rate = (int) [ 6000, 48000 ], " "channels = (int) [ 1, 2]") ); #define DEFAULT_QUALITY 8.0 #define DEFAULT_BITRATE 0 #define DEFAULT_MODE GST_SPEEX_ENC_MODE_AUTO #define DEFAULT_VBR FALSE #define DEFAULT_ABR 0 #define DEFAULT_VAD FALSE #define DEFAULT_DTX FALSE #define DEFAULT_COMPLEXITY 3 #define DEFAULT_NFRAMES 1 enum { PROP_0, PROP_QUALITY, PROP_BITRATE, PROP_MODE, PROP_VBR, PROP_ABR, PROP_VAD, PROP_DTX, PROP_COMPLEXITY, PROP_NFRAMES, PROP_LAST_MESSAGE }; #define GST_TYPE_SPEEX_ENC_MODE (gst_speex_enc_mode_get_type()) static GType gst_speex_enc_mode_get_type (void) { static GType speex_enc_mode_type = 0; static const GEnumValue speex_enc_modes[] = { {GST_SPEEX_ENC_MODE_AUTO, "Auto", "auto"}, {GST_SPEEX_ENC_MODE_UWB, "Ultra Wide Band", "uwb"}, {GST_SPEEX_ENC_MODE_WB, "Wide Band", "wb"}, {GST_SPEEX_ENC_MODE_NB, "Narrow Band", "nb"}, {0, NULL, NULL}, }; if (G_UNLIKELY (speex_enc_mode_type == 0)) { speex_enc_mode_type = g_enum_register_static ("GstSpeexEncMode", speex_enc_modes); } return speex_enc_mode_type; } static void gst_speex_enc_finalize (GObject * object); static gboolean gst_speex_enc_setup (GstSpeexEnc * enc); static void gst_speex_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_speex_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static GstFlowReturn gst_speex_enc_encode (GstSpeexEnc * enc, GstBuffer * buf); static gboolean gst_speex_enc_start (GstAudioEncoder * enc); static gboolean gst_speex_enc_stop (GstAudioEncoder * enc); static gboolean gst_speex_enc_set_format (GstAudioEncoder * enc, GstAudioInfo * info); static GstFlowReturn gst_speex_enc_handle_frame (GstAudioEncoder * enc, GstBuffer * in_buf); static gboolean gst_speex_enc_sink_event (GstAudioEncoder * enc, GstEvent * event); static GstFlowReturn gst_speex_enc_pre_push (GstAudioEncoder * benc, GstBuffer ** buffer); static void gst_speex_enc_setup_interfaces (GType speexenc_type) { static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; g_type_add_interface_static (speexenc_type, GST_TYPE_TAG_SETTER, &tag_setter_info); GST_DEBUG_CATEGORY_INIT (speexenc_debug, "speexenc", 0, "Speex encoder"); } GST_BOILERPLATE_FULL (GstSpeexEnc, gst_speex_enc, GstAudioEncoder, GST_TYPE_AUDIO_ENCODER, gst_speex_enc_setup_interfaces); static void gst_speex_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Speex audio encoder", "Codec/Encoder/Audio", "Encodes audio in Speex format", "Wim Taymans "); } static void gst_speex_enc_class_init (GstSpeexEncClass * klass) { GObjectClass *gobject_class; GstAudioEncoderClass *base_class; gobject_class = (GObjectClass *) klass; base_class = (GstAudioEncoderClass *) klass; gobject_class->set_property = gst_speex_enc_set_property; gobject_class->get_property = gst_speex_enc_get_property; base_class->start = GST_DEBUG_FUNCPTR (gst_speex_enc_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_speex_enc_stop); base_class->set_format = GST_DEBUG_FUNCPTR (gst_speex_enc_set_format); base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_speex_enc_handle_frame); base_class->event = GST_DEBUG_FUNCPTR (gst_speex_enc_sink_event); base_class->pre_push = GST_DEBUG_FUNCPTR (gst_speex_enc_pre_push); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QUALITY, g_param_spec_float ("quality", "Quality", "Encoding quality", 0.0, 10.0, DEFAULT_QUALITY, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BITRATE, g_param_spec_int ("bitrate", "Encoding Bit-rate", "Specify an encoding bit-rate (in bps). (0 = automatic)", 0, G_MAXINT, DEFAULT_BITRATE, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "The encoding mode", GST_TYPE_SPEEX_ENC_MODE, GST_SPEEX_ENC_MODE_AUTO, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VBR, g_param_spec_boolean ("vbr", "VBR", "Enable variable bit-rate", DEFAULT_VBR, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ABR, g_param_spec_int ("abr", "ABR", "Enable average bit-rate (0 = disabled)", 0, G_MAXINT, DEFAULT_ABR, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_VAD, g_param_spec_boolean ("vad", "VAD", "Enable voice activity detection", DEFAULT_VAD, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DTX, g_param_spec_boolean ("dtx", "DTX", "Enable discontinuous transmission", DEFAULT_DTX, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_COMPLEXITY, g_param_spec_int ("complexity", "Complexity", "Set encoding complexity", 0, G_MAXINT, DEFAULT_COMPLEXITY, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_NFRAMES, g_param_spec_int ("nframes", "NFrames", "Number of frames per buffer", 0, G_MAXINT, DEFAULT_NFRAMES, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LAST_MESSAGE, g_param_spec_string ("last-message", "last-message", "The last status message", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); gobject_class->finalize = gst_speex_enc_finalize; } static void gst_speex_enc_finalize (GObject * object) { GstSpeexEnc *enc; enc = GST_SPEEX_ENC (object); g_free (enc->last_message); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_speex_enc_init (GstSpeexEnc * enc, GstSpeexEncClass * klass) { GstAudioEncoder *benc = GST_AUDIO_ENCODER (enc); /* arrange granulepos marking (and required perfect ts) */ gst_audio_encoder_set_mark_granule (benc, TRUE); gst_audio_encoder_set_perfect_timestamp (benc, TRUE); } static gboolean gst_speex_enc_start (GstAudioEncoder * benc) { GstSpeexEnc *enc = GST_SPEEX_ENC (benc); GST_DEBUG_OBJECT (enc, "start"); speex_bits_init (&enc->bits); enc->tags = gst_tag_list_new (); enc->header_sent = FALSE; return TRUE; } static gboolean gst_speex_enc_stop (GstAudioEncoder * benc) { GstSpeexEnc *enc = GST_SPEEX_ENC (benc); GST_DEBUG_OBJECT (enc, "stop"); enc->header_sent = FALSE; if (enc->state) { speex_encoder_destroy (enc->state); enc->state = NULL; } speex_bits_destroy (&enc->bits); gst_tag_list_free (enc->tags); enc->tags = NULL; g_slist_foreach (enc->headers, (GFunc) gst_buffer_unref, NULL); enc->headers = NULL; gst_tag_setter_reset_tags (GST_TAG_SETTER (enc)); return TRUE; } static gint64 gst_speex_enc_get_latency (GstSpeexEnc * enc) { /* See the Speex manual section "Latency and algorithmic delay" */ if (enc->rate == 8000) return 30 * GST_MSECOND; else return 34 * GST_MSECOND; } static gboolean gst_speex_enc_set_format (GstAudioEncoder * benc, GstAudioInfo * info) { GstSpeexEnc *enc; enc = GST_SPEEX_ENC (benc); enc->channels = GST_AUDIO_INFO_CHANNELS (info); enc->rate = GST_AUDIO_INFO_RATE (info); /* handle reconfigure */ if (enc->state) { speex_encoder_destroy (enc->state); enc->state = NULL; } if (!gst_speex_enc_setup (enc)) return FALSE; /* feedback to base class */ gst_audio_encoder_set_latency (benc, gst_speex_enc_get_latency (enc), gst_speex_enc_get_latency (enc)); gst_audio_encoder_set_lookahead (benc, enc->lookahead); if (enc->nframes == 0) { /* as many frames as available input allows */ gst_audio_encoder_set_frame_samples_min (benc, enc->frame_size); gst_audio_encoder_set_frame_samples_max (benc, enc->frame_size); gst_audio_encoder_set_frame_max (benc, 0); } else { /* exactly as many frames as configured */ gst_audio_encoder_set_frame_samples_min (benc, enc->frame_size * enc->nframes); gst_audio_encoder_set_frame_samples_max (benc, enc->frame_size * enc->nframes); gst_audio_encoder_set_frame_max (benc, 1); } return TRUE; } static GstBuffer * gst_speex_enc_create_metadata_buffer (GstSpeexEnc * enc) { const GstTagList *user_tags; GstTagList *merged_tags; GstBuffer *comments = NULL; user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc)); GST_DEBUG_OBJECT (enc, "upstream tags = %" GST_PTR_FORMAT, enc->tags); GST_DEBUG_OBJECT (enc, "user-set tags = %" GST_PTR_FORMAT, user_tags); /* gst_tag_list_merge() will handle NULL for either or both lists fine */ merged_tags = gst_tag_list_merge (user_tags, enc->tags, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc))); if (merged_tags == NULL) merged_tags = gst_tag_list_new (); GST_DEBUG_OBJECT (enc, "merged tags = %" GST_PTR_FORMAT, merged_tags); comments = gst_tag_list_to_vorbiscomment_buffer (merged_tags, NULL, 0, "Encoded with GStreamer Speexenc"); gst_tag_list_free (merged_tags); GST_BUFFER_OFFSET (comments) = 0; GST_BUFFER_OFFSET_END (comments) = 0; return comments; } static void gst_speex_enc_set_last_msg (GstSpeexEnc * enc, const gchar * msg) { g_free (enc->last_message); enc->last_message = g_strdup (msg); GST_WARNING_OBJECT (enc, "%s", msg); g_object_notify (G_OBJECT (enc), "last-message"); } static gboolean gst_speex_enc_setup (GstSpeexEnc * enc) { switch (enc->mode) { case GST_SPEEX_ENC_MODE_UWB: GST_LOG_OBJECT (enc, "configuring for requested UWB mode"); enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_UWB); break; case GST_SPEEX_ENC_MODE_WB: GST_LOG_OBJECT (enc, "configuring for requested WB mode"); enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_WB); break; case GST_SPEEX_ENC_MODE_NB: GST_LOG_OBJECT (enc, "configuring for requested NB mode"); enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_NB); break; case GST_SPEEX_ENC_MODE_AUTO: /* fall through */ GST_LOG_OBJECT (enc, "finding best mode"); default: break; } if (enc->rate > 25000) { if (enc->mode == GST_SPEEX_ENC_MODE_AUTO) { GST_LOG_OBJECT (enc, "selected UWB mode for samplerate %d", enc->rate); enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_UWB); } else { if (enc->speex_mode != speex_lib_get_mode (SPEEX_MODEID_UWB)) { gst_speex_enc_set_last_msg (enc, "Warning: suggest to use ultra wide band mode for this rate"); } } } else if (enc->rate > 12500) { if (enc->mode == GST_SPEEX_ENC_MODE_AUTO) { GST_LOG_OBJECT (enc, "selected WB mode for samplerate %d", enc->rate); enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_WB); } else { if (enc->speex_mode != speex_lib_get_mode (SPEEX_MODEID_WB)) { gst_speex_enc_set_last_msg (enc, "Warning: suggest to use wide band mode for this rate"); } } } else { if (enc->mode == GST_SPEEX_ENC_MODE_AUTO) { GST_LOG_OBJECT (enc, "selected NB mode for samplerate %d", enc->rate); enc->speex_mode = speex_lib_get_mode (SPEEX_MODEID_NB); } else { if (enc->speex_mode != speex_lib_get_mode (SPEEX_MODEID_NB)) { gst_speex_enc_set_last_msg (enc, "Warning: suggest to use narrow band mode for this rate"); } } } if (enc->rate != 8000 && enc->rate != 16000 && enc->rate != 32000) { gst_speex_enc_set_last_msg (enc, "Warning: speex is optimized for 8, 16 and 32 KHz"); } speex_init_header (&enc->header, enc->rate, 1, enc->speex_mode); enc->header.frames_per_packet = enc->nframes; enc->header.vbr = enc->vbr; enc->header.nb_channels = enc->channels; /*Initialize Speex encoder */ enc->state = speex_encoder_init (enc->speex_mode); speex_encoder_ctl (enc->state, SPEEX_GET_FRAME_SIZE, &enc->frame_size); speex_encoder_ctl (enc->state, SPEEX_SET_COMPLEXITY, &enc->complexity); speex_encoder_ctl (enc->state, SPEEX_SET_SAMPLING_RATE, &enc->rate); if (enc->vbr) speex_encoder_ctl (enc->state, SPEEX_SET_VBR_QUALITY, &enc->quality); else { gint tmp = floor (enc->quality); speex_encoder_ctl (enc->state, SPEEX_SET_QUALITY, &tmp); } if (enc->bitrate) { if (enc->quality >= 0.0 && enc->vbr) { gst_speex_enc_set_last_msg (enc, "Warning: bitrate option is overriding quality"); } speex_encoder_ctl (enc->state, SPEEX_SET_BITRATE, &enc->bitrate); } if (enc->vbr) { gint tmp = 1; speex_encoder_ctl (enc->state, SPEEX_SET_VBR, &tmp); } else if (enc->vad) { gint tmp = 1; speex_encoder_ctl (enc->state, SPEEX_SET_VAD, &tmp); } if (enc->dtx) { gint tmp = 1; speex_encoder_ctl (enc->state, SPEEX_SET_DTX, &tmp); } if (enc->dtx && !(enc->vbr || enc->abr || enc->vad)) { gst_speex_enc_set_last_msg (enc, "Warning: dtx is useless without vad, vbr or abr"); } else if ((enc->vbr || enc->abr) && (enc->vad)) { gst_speex_enc_set_last_msg (enc, "Warning: vad is already implied by vbr or abr"); } if (enc->abr) { speex_encoder_ctl (enc->state, SPEEX_SET_ABR, &enc->abr); } speex_encoder_ctl (enc->state, SPEEX_GET_LOOKAHEAD, &enc->lookahead); GST_LOG_OBJECT (enc, "we have frame size %d, lookahead %d", enc->frame_size, enc->lookahead); return TRUE; } /* push out the buffer */ static GstFlowReturn gst_speex_enc_push_buffer (GstSpeexEnc * enc, GstBuffer * buffer) { guint size; size = GST_BUFFER_SIZE (buffer); GST_DEBUG_OBJECT (enc, "pushing output buffer of size %u", size); gst_buffer_set_caps (buffer, GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc))); return gst_pad_push (GST_AUDIO_ENCODER_SRC_PAD (enc), buffer); } static gboolean gst_speex_enc_sink_event (GstAudioEncoder * benc, GstEvent * event) { GstSpeexEnc *enc; enc = GST_SPEEX_ENC (benc); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG: { if (enc->tags) { GstTagList *list; gst_event_parse_tag (event, &list); gst_tag_list_insert (enc->tags, list, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc))); } else { g_assert_not_reached (); } break; } default: break; } /* we only peeked, let base class handle it */ return FALSE; } static GstFlowReturn gst_speex_enc_encode (GstSpeexEnc * enc, GstBuffer * buf) { gint frame_size = enc->frame_size; gint bytes = frame_size * 2 * enc->channels, samples, size; gint outsize, written, dtx_ret = 0; guint8 *data, *data0 = NULL; GstBuffer *outbuf; GstFlowReturn ret = GST_FLOW_OK; if (G_LIKELY (buf)) { data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); if (G_UNLIKELY (size % bytes)) { GST_DEBUG_OBJECT (enc, "draining; adding silence samples"); size = ((size / bytes) + 1) * bytes; data0 = data = g_malloc0 (size); memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } } else { GST_DEBUG_OBJECT (enc, "nothing to drain"); goto done; } samples = size / (2 * enc->channels); speex_bits_reset (&enc->bits); /* FIXME what about dropped samples if DTS enabled ?? */ while (size) { GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)", frame_size, bytes); if (enc->channels == 2) { speex_encode_stereo_int ((gint16 *) data, frame_size, &enc->bits); } dtx_ret += speex_encode_int (enc->state, (gint16 *) data, &enc->bits); data += bytes; size -= bytes; } speex_bits_insert_terminator (&enc->bits); outsize = speex_bits_nbytes (&enc->bits); ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), GST_BUFFER_OFFSET_NONE, outsize, GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf); if ((GST_FLOW_OK != ret)) goto done; written = speex_bits_write (&enc->bits, (gchar *) GST_BUFFER_DATA (outbuf), outsize); if (G_UNLIKELY (written < outsize)) { GST_ERROR_OBJECT (enc, "short write: %d < %d bytes", written, outsize); GST_BUFFER_SIZE (outbuf) = written; } else if (G_UNLIKELY (written > outsize)) { GST_ERROR_OBJECT (enc, "overrun: %d > %d bytes", written, outsize); } if (!dtx_ret) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); ret = gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf, samples); done: g_free (data0); return ret; } /* * (really really) FIXME: move into core (dixit tpm) */ /** * _gst_caps_set_buffer_array: * @caps: a #GstCaps * @field: field in caps to set * @buf: header buffers * * Adds given buffers to an array of buffers set as the given @field * on the given @caps. List of buffer arguments must be NULL-terminated. * * Returns: input caps with a streamheader field added, or NULL if some error */ static GstCaps * _gst_caps_set_buffer_array (GstCaps * caps, const gchar * field, GstBuffer * buf, ...) { GstStructure *structure = NULL; va_list va; GValue array = { 0 }; GValue value = { 0 }; g_return_val_if_fail (caps != NULL, NULL); g_return_val_if_fail (gst_caps_is_fixed (caps), NULL); g_return_val_if_fail (field != NULL, NULL); caps = gst_caps_make_writable (caps); structure = gst_caps_get_structure (caps, 0); g_value_init (&array, GST_TYPE_ARRAY); va_start (va, buf); /* put buffers in a fixed list */ while (buf) { g_assert (gst_buffer_is_metadata_writable (buf)); /* mark buffer */ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); g_value_init (&value, GST_TYPE_BUFFER); buf = gst_buffer_copy (buf); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); gst_value_set_buffer (&value, buf); gst_buffer_unref (buf); gst_value_array_append_value (&array, &value); g_value_unset (&value); buf = va_arg (va, GstBuffer *); } gst_structure_set_value (structure, field, &array); g_value_unset (&array); return caps; } static GstFlowReturn gst_speex_enc_handle_frame (GstAudioEncoder * benc, GstBuffer * buf) { GstSpeexEnc *enc; GstFlowReturn ret = GST_FLOW_OK; enc = GST_SPEEX_ENC (benc); if (!enc->header_sent) { /* Speex streams begin with two headers; the initial header (with most of the codec setup parameters) which is mandated by the Ogg bitstream spec. The second header holds any comment fields. We merely need to make the headers, then pass them to libspeex one at a time; libspeex handles the additional Ogg bitstream constraints */ GstBuffer *buf1, *buf2; GstCaps *caps; guchar *data; gint data_len; /* create header buffer */ data = (guint8 *) speex_header_to_packet (&enc->header, &data_len); buf1 = gst_buffer_new (); GST_BUFFER_DATA (buf1) = GST_BUFFER_MALLOCDATA (buf1) = data; GST_BUFFER_SIZE (buf1) = data_len; GST_BUFFER_OFFSET_END (buf1) = 0; GST_BUFFER_OFFSET (buf1) = 0; /* create comment buffer */ buf2 = gst_speex_enc_create_metadata_buffer (enc); /* mark and put on caps */ caps = gst_caps_new_simple ("audio/x-speex", "rate", G_TYPE_INT, enc->rate, "channels", G_TYPE_INT, enc->channels, NULL); caps = _gst_caps_set_buffer_array (caps, "streamheader", buf1, buf2, NULL); /* negotiate with these caps */ GST_DEBUG_OBJECT (enc, "here are the caps: %" GST_PTR_FORMAT, caps); gst_buffer_set_caps (buf1, caps); gst_buffer_set_caps (buf2, caps); gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), caps); gst_caps_unref (caps); /* push out buffers */ /* store buffers for later pre_push sending */ g_slist_foreach (enc->headers, (GFunc) gst_buffer_unref, NULL); enc->headers = NULL; GST_DEBUG_OBJECT (enc, "storing header buffers"); enc->headers = g_slist_prepend (enc->headers, buf2); enc->headers = g_slist_prepend (enc->headers, buf1); enc->header_sent = TRUE; } GST_DEBUG_OBJECT (enc, "received buffer %p of %u bytes", buf, buf ? GST_BUFFER_SIZE (buf) : 0); ret = gst_speex_enc_encode (enc, buf); return ret; } static GstFlowReturn gst_speex_enc_pre_push (GstAudioEncoder * benc, GstBuffer ** buffer) { GstSpeexEnc *enc; GstFlowReturn ret = GST_FLOW_OK; enc = GST_SPEEX_ENC (benc); /* FIXME 0.11 ? get rid of this special ogg stuff and have it * put and use 'codec data' in caps like anything else, * with all the usual out-of-band advantage etc */ if (G_UNLIKELY (enc->headers)) { GSList *header = enc->headers; /* try to push all of these, if we lose one, might as well lose all */ while (header) { if (ret == GST_FLOW_OK) ret = gst_speex_enc_push_buffer (enc, header->data); else gst_speex_enc_push_buffer (enc, header->data); header = g_slist_next (header); } g_slist_free (enc->headers); enc->headers = NULL; } return ret; } static void gst_speex_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSpeexEnc *enc; enc = GST_SPEEX_ENC (object); switch (prop_id) { case PROP_QUALITY: g_value_set_float (value, enc->quality); break; case PROP_BITRATE: g_value_set_int (value, enc->bitrate); break; case PROP_MODE: g_value_set_enum (value, enc->mode); break; case PROP_VBR: g_value_set_boolean (value, enc->vbr); break; case PROP_ABR: g_value_set_int (value, enc->abr); break; case PROP_VAD: g_value_set_boolean (value, enc->vad); break; case PROP_DTX: g_value_set_boolean (value, enc->dtx); break; case PROP_COMPLEXITY: g_value_set_int (value, enc->complexity); break; case PROP_NFRAMES: g_value_set_int (value, enc->nframes); break; case PROP_LAST_MESSAGE: g_value_set_string (value, enc->last_message); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_speex_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSpeexEnc *enc; enc = GST_SPEEX_ENC (object); switch (prop_id) { case PROP_QUALITY: enc->quality = g_value_get_float (value); break; case PROP_BITRATE: enc->bitrate = g_value_get_int (value); break; case PROP_MODE: enc->mode = g_value_get_enum (value); break; case PROP_VBR: enc->vbr = g_value_get_boolean (value); break; case PROP_ABR: enc->abr = g_value_get_int (value); break; case PROP_VAD: enc->vad = g_value_get_boolean (value); break; case PROP_DTX: enc->dtx = g_value_get_boolean (value); break; case PROP_COMPLEXITY: enc->complexity = g_value_get_int (value); break; case PROP_NFRAMES: enc->nframes = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/ext/libcaca/0000755000175000017500000000000011720565322014240 500000000000000gst-plugins-good-0.10.31/ext/libcaca/Makefile.am0000644000175000017500000000064011671175352016221 00000000000000plugin_LTLIBRARIES = libgstcacasink.la libgstcacasink_la_SOURCES = gstcacasink.c libgstcacasink_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(LIBCACA_CFLAGS) libgstcacasink_la_LIBADD = \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(LIBCACA_LIBS) libgstcacasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcacasink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstcacasink.h gst-plugins-good-0.10.31/ext/libcaca/gstcacasink.c0000644000175000017500000003110111677341654016625 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-cacasink * @see_also: #GstAASink * * Displays video as color ascii art. * * * Example launch line * |[ * CACA_GEOMETRY=160x60 CACA_FONT=5x7 gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! cacasink * ]| This pipeline renders a video to ascii art into a separate window using a * small font and specifying the ascii resolution. * |[ * CACA_DRIVER=ncurses gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! cacasink * ]| This pipeline renders a video to ascii art into the current terminal. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstcacasink.h" #define GST_CACA_DEFAULT_SCREEN_WIDTH 80 #define GST_CACA_DEFAULT_SCREEN_HEIGHT 25 #define GST_CACA_DEFAULT_BPP 24 #define GST_CACA_DEFAULT_RED_MASK GST_VIDEO_BYTE1_MASK_32_INT #define GST_CACA_DEFAULT_GREEN_MASK GST_VIDEO_BYTE2_MASK_32_INT #define GST_CACA_DEFAULT_BLUE_MASK GST_VIDEO_BYTE3_MASK_32_INT //#define GST_CACA_DEFAULT_RED_MASK R_MASK_32_REVERSE_INT //#define GST_CACA_DEFAULT_GREEN_MASK G_MASK_32_REVERSE_INT //#define GST_CACA_DEFAULT_BLUE_MASK B_MASK_32_REVERSE_INT /* cacasink signals and args */ enum { LAST_SIGNAL }; enum { ARG_0, ARG_SCREEN_WIDTH, ARG_SCREEN_HEIGHT, ARG_DITHER, ARG_ANTIALIASING }; static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB_16 ";" GST_VIDEO_CAPS_RGB_15) ); static void gst_cacasink_base_init (gpointer g_class); static void gst_cacasink_class_init (GstCACASinkClass * klass); static void gst_cacasink_init (GstCACASink * cacasink); static gboolean gst_cacasink_setcaps (GstBaseSink * pad, GstCaps * caps); static void gst_cacasink_get_times (GstBaseSink * sink, GstBuffer * buffer, GstClockTime * start, GstClockTime * end); static GstFlowReturn gst_cacasink_render (GstBaseSink * basesink, GstBuffer * buffer); static void gst_cacasink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_cacasink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_cacasink_change_state (GstElement * element, GstStateChange transition); static GstElementClass *parent_class = NULL; GType gst_cacasink_get_type (void) { static GType cacasink_type = 0; if (!cacasink_type) { static const GTypeInfo cacasink_info = { sizeof (GstCACASinkClass), gst_cacasink_base_init, NULL, (GClassInitFunc) gst_cacasink_class_init, NULL, NULL, sizeof (GstCACASink), 0, (GInstanceInitFunc) gst_cacasink_init, }; cacasink_type = g_type_register_static (GST_TYPE_BASE_SINK, "GstCACASink", &cacasink_info, 0); } return cacasink_type; } #define GST_TYPE_CACADITHER (gst_cacasink_dither_get_type()) static GType gst_cacasink_dither_get_type (void) { static GType dither_type = 0; static const GEnumValue dither_types[] = { {CACA_DITHERING_NONE, "No dithering", "none"}, {CACA_DITHERING_ORDERED2, "Ordered 2x2 Bayer dithering", "2x2"}, {CACA_DITHERING_ORDERED4, "Ordered 4x4 Bayer dithering", "4x4"}, {CACA_DITHERING_ORDERED8, "Ordered 8x8 Bayer dithering", "8x8"}, {CACA_DITHERING_RANDOM, "Random dithering", "random"}, {0, NULL, NULL}, }; if (!dither_type) { dither_type = g_enum_register_static ("GstCACASinkDithering", dither_types); } return dither_type; } static void gst_cacasink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "A colored ASCII art video sink", "Sink/Video", "A colored ASCII art videosink", "Zeeshan Ali "); gst_element_class_add_static_pad_template (element_class, &sink_template); } static void gst_cacasink_class_init (GstCACASinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_cacasink_set_property; gobject_class->get_property = gst_cacasink_get_property; gstelement_class->change_state = gst_cacasink_change_state; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_WIDTH, g_param_spec_int ("screen-width", "Screen Width", "The width of the screen", 0, G_MAXINT, GST_CACA_DEFAULT_SCREEN_WIDTH, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SCREEN_HEIGHT, g_param_spec_int ("screen-height", "Screen Height", "The height of the screen", 0, G_MAXINT, GST_CACA_DEFAULT_SCREEN_HEIGHT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DITHER, g_param_spec_enum ("dither", "Dither Type", "Set type of Dither", GST_TYPE_CACADITHER, CACA_DITHERING_NONE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ANTIALIASING, g_param_spec_boolean ("anti-aliasing", "Anti Aliasing", "Enables Anti-Aliasing", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_cacasink_setcaps); gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_cacasink_get_times); gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_cacasink_render); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_cacasink_render); } static void gst_cacasink_get_times (GstBaseSink * sink, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { *start = GST_BUFFER_TIMESTAMP (buffer); *end = *start + GST_BUFFER_DURATION (buffer); } static gboolean gst_cacasink_setcaps (GstBaseSink * basesink, GstCaps * caps) { GstCACASink *cacasink; GstStructure *structure; gint endianness; cacasink = GST_CACASINK (basesink); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &(cacasink->width)); gst_structure_get_int (structure, "height", &(cacasink->height)); gst_structure_get_int (structure, "endianness", &endianness); gst_structure_get_int (structure, "bpp", (int *) &cacasink->bpp); gst_structure_get_int (structure, "red_mask", (int *) &cacasink->red_mask); gst_structure_get_int (structure, "green_mask", (int *) &cacasink->green_mask); gst_structure_get_int (structure, "blue_mask", (int *) &cacasink->blue_mask); if (cacasink->bpp == 24) { cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask) >> 8; cacasink->green_mask = GUINT32_FROM_BE (cacasink->green_mask) >> 8; cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask) >> 8; } else if (cacasink->bpp == 32) { cacasink->red_mask = GUINT32_FROM_BE (cacasink->red_mask); cacasink->green_mask = GUINT32_FROM_BE (cacasink->green_mask); cacasink->blue_mask = GUINT32_FROM_BE (cacasink->blue_mask); } else if (cacasink->bpp == 16) { if (endianness == G_BIG_ENDIAN) { cacasink->red_mask = GUINT16_FROM_BE (cacasink->red_mask); cacasink->green_mask = GUINT16_FROM_BE (cacasink->green_mask); cacasink->blue_mask = GUINT16_FROM_BE (cacasink->blue_mask); } else { cacasink->red_mask = GUINT16_FROM_LE (cacasink->red_mask); cacasink->green_mask = GUINT16_FROM_LE (cacasink->green_mask); cacasink->blue_mask = GUINT16_FROM_LE (cacasink->blue_mask); } } if (cacasink->bitmap) { caca_free_bitmap (cacasink->bitmap); } cacasink->bitmap = caca_create_bitmap (cacasink->bpp, cacasink->width, cacasink->height, GST_ROUND_UP_4 (cacasink->width * cacasink->bpp / 8), cacasink->red_mask, cacasink->green_mask, cacasink->blue_mask, 0); if (!cacasink->bitmap) { return FALSE; } return TRUE; } static void gst_cacasink_init (GstCACASink * cacasink) { cacasink->screen_width = GST_CACA_DEFAULT_SCREEN_WIDTH; cacasink->screen_height = GST_CACA_DEFAULT_SCREEN_HEIGHT; cacasink->bpp = GST_CACA_DEFAULT_BPP; cacasink->red_mask = GST_CACA_DEFAULT_RED_MASK; cacasink->green_mask = GST_CACA_DEFAULT_GREEN_MASK; cacasink->blue_mask = GST_CACA_DEFAULT_BLUE_MASK; } static GstFlowReturn gst_cacasink_render (GstBaseSink * basesink, GstBuffer * buffer) { GstCACASink *cacasink = GST_CACASINK (basesink); GST_DEBUG ("render"); caca_clear (); caca_draw_bitmap (0, 0, cacasink->screen_width - 1, cacasink->screen_height - 1, cacasink->bitmap, GST_BUFFER_DATA (buffer)); caca_refresh (); return GST_FLOW_OK; } static void gst_cacasink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstCACASink *cacasink; g_return_if_fail (GST_IS_CACASINK (object)); cacasink = GST_CACASINK (object); switch (prop_id) { case ARG_DITHER:{ cacasink->dither = g_value_get_enum (value); caca_set_dithering (cacasink->dither + CACA_DITHERING_NONE); break; } case ARG_ANTIALIASING:{ cacasink->antialiasing = g_value_get_boolean (value); if (cacasink->antialiasing) { caca_set_feature (CACA_ANTIALIASING_MAX); } else { caca_set_feature (CACA_ANTIALIASING_MIN); } break; } default: break; } } static void gst_cacasink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstCACASink *cacasink; cacasink = GST_CACASINK (object); switch (prop_id) { case ARG_SCREEN_WIDTH:{ g_value_set_int (value, cacasink->screen_width); break; } case ARG_SCREEN_HEIGHT:{ g_value_set_int (value, cacasink->screen_height); break; } case ARG_DITHER:{ g_value_set_enum (value, cacasink->dither); break; } case ARG_ANTIALIASING:{ g_value_set_boolean (value, cacasink->antialiasing); break; } default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } } static gboolean gst_cacasink_open (GstCACASink * cacasink) { cacasink->bitmap = NULL; if (caca_init () < 0) { GST_ELEMENT_ERROR (cacasink, RESOURCE, OPEN_WRITE, (NULL), ("caca_init() failed")); return FALSE; } cacasink->screen_width = caca_get_width (); cacasink->screen_height = caca_get_height (); cacasink->antialiasing = TRUE; caca_set_feature (CACA_ANTIALIASING_MAX); cacasink->dither = 0; caca_set_dithering (CACA_DITHERING_NONE); return TRUE; } static void gst_cacasink_close (GstCACASink * cacasink) { if (cacasink->bitmap) { caca_free_bitmap (cacasink->bitmap); cacasink->bitmap = NULL; } caca_end (); } static GstStateChangeReturn gst_cacasink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: if (!gst_cacasink_open (GST_CACASINK (element))) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_cacasink_close (GST_CACASINK (element)); break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "cacasink", GST_RANK_NONE, GST_TYPE_CACASINK)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "cacasink", "Colored ASCII Art video sink", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/libcaca/gstcacasink.h0000644000175000017500000000367611671175352016644 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_CACASINK_H__ #define __GST_CACASINK_H__ #include #include #include #include #ifdef CACA_API_VERSION_1 # include #endif G_BEGIN_DECLS #define GST_TYPE_CACASINK \ (gst_cacasink_get_type()) #define GST_CACASINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CACASINK,GstCACASink)) #define GST_CACASINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CACASINK,GstCACASinkClass)) #define GST_IS_CACASINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CACASINK)) #define GST_IS_CACASINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CACASINK)) typedef struct _GstCACASink GstCACASink; typedef struct _GstCACASinkClass GstCACASinkClass; struct _GstCACASink { GstBaseSink parent; gint width, height; gint screen_width, screen_height; guint bpp; guint dither; gboolean antialiasing; guint red_mask, green_mask, blue_mask; struct caca_bitmap *bitmap; }; struct _GstCACASinkClass { GstBaseSinkClass parent_class; /* signals */ }; GType gst_cacasink_get_type(void); G_END_DECLS #endif /* __GST_CACASINK_H__ */ gst-plugins-good-0.10.31/ext/libcaca/Makefile.in0000644000175000017500000006555011720560226016236 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/libcaca DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstcacasink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstcacasink_la_OBJECTS = libgstcacasink_la-gstcacasink.lo libgstcacasink_la_OBJECTS = $(am_libgstcacasink_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstcacasink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstcacasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstcacasink_la_CFLAGS) $(CFLAGS) \ $(libgstcacasink_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstcacasink_la_SOURCES) DIST_SOURCES = $(libgstcacasink_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstcacasink.la libgstcacasink_la_SOURCES = gstcacasink.c libgstcacasink_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(LIBCACA_CFLAGS) libgstcacasink_la_LIBADD = \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(LIBCACA_LIBS) libgstcacasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcacasink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstcacasink.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/libcaca/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/libcaca/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstcacasink.la: $(libgstcacasink_la_OBJECTS) $(libgstcacasink_la_DEPENDENCIES) $(EXTRA_libgstcacasink_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstcacasink_la_LINK) -rpath $(plugindir) $(libgstcacasink_la_OBJECTS) $(libgstcacasink_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcacasink_la-gstcacasink.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstcacasink_la-gstcacasink.lo: gstcacasink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcacasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcacasink_la_CFLAGS) $(CFLAGS) -MT libgstcacasink_la-gstcacasink.lo -MD -MP -MF $(DEPDIR)/libgstcacasink_la-gstcacasink.Tpo -c -o libgstcacasink_la-gstcacasink.lo `test -f 'gstcacasink.c' || echo '$(srcdir)/'`gstcacasink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcacasink_la-gstcacasink.Tpo $(DEPDIR)/libgstcacasink_la-gstcacasink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcacasink.c' object='libgstcacasink_la-gstcacasink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcacasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcacasink_la_CFLAGS) $(CFLAGS) -c -o libgstcacasink_la-gstcacasink.lo `test -f 'gstcacasink.c' || echo '$(srcdir)/'`gstcacasink.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/hal/0000755000175000017500000000000011720565321013425 500000000000000gst-plugins-good-0.10.31/ext/hal/hal.c0000644000175000017500000002626111671175352014272 00000000000000/* GStreamer * Copyright (C) <2002> Thomas Vander Stichele * Copyright (C) <2006> Jürg Billeter * Copyright (C) <2007> Sebastian Dröge * * 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. */ /* * this library handles interaction with Hal */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "hal.h" GST_DEBUG_CATEGORY_EXTERN (hal_debug); #define GST_CAT_DEFAULT hal_debug /* compat for older libhal */ #ifndef LIBHAL_FREE_DBUS_ERROR #define LIBHAL_FREE_DBUS_ERROR(e) dbus_error_free (e) #endif /* * gst_hal_get_alsa_element: * @ctx: a #LibHalContext which should be used for querying HAL. * @udi: a #gchar corresponding to the UDI you want to get. * @device_type: a #GstHalDeviceType specifying the wanted device type. * * Get Hal UDI @udi's string value. * * Returns: a newly allocated #gchar string containing the appropriate pipeline * for UDI @udi, or NULL in the case of an error.. */ static gchar * gst_hal_get_alsa_element (LibHalContext * ctx, const gchar * udi, GstHalDeviceType device_type) { char *type, *string = NULL; const char *element = NULL; DBusError error; dbus_error_init (&error); if (!libhal_device_query_capability (ctx, udi, "alsa", &error)) { if (dbus_error_is_set (&error)) { GST_DEBUG ("Failed querying %s for alsa capability: %s: %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); } else { GST_DEBUG ("UDI %s has no alsa capability", udi); } return NULL; } type = libhal_device_get_property_string (ctx, udi, "alsa.type", &error); if (dbus_error_is_set (&error)) { GST_DEBUG ("UDI %s has alsa capabilities but no alsa.type property: %s, %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); return NULL; } else if (!type) { GST_DEBUG ("UDI %s has empty alsa.type property", udi); return NULL; } if (strcmp (type, "playback") == 0 && device_type == GST_HAL_AUDIOSINK) element = "alsasink"; else if (strcmp (type, "capture") == 0 && device_type == GST_HAL_AUDIOSRC) element = "alsasrc"; libhal_free_string (type); if (element) { int card, device; card = libhal_device_get_property_int (ctx, udi, "alsa.card", &error); if (dbus_error_is_set (&error)) { GST_DEBUG ("UDI %s has no alsa.card property: %s: %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); return NULL; } else if (card == -1) { GST_DEBUG ("UDI %s has no alsa.card property", udi); return NULL; } device = libhal_device_get_property_int (ctx, udi, "alsa.device", &error); if (dbus_error_is_set (&error)) { GST_DEBUG ("UDI %s has no alsa.device property: %s: %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); return NULL; } else if (device == -1) { GST_DEBUG ("UDI %s has no alsa.device property", udi); return NULL; } /* This is a bit dodgy, since it makes lots of assumptions about the way * alsa is set up. In any case, only munge the device string for playback */ if (strcmp (element, "alsasink") == 0 && device == 0) { /* handle default device specially to use * dmix, dsnoop, and softvol if appropriate */ string = g_strdup_printf ("%s device=default:%d", element, card); } else { string = g_strdup_printf ("%s device=plughw:%d,%d", element, card, device); } } return string; } /* * gst_hal_get_oss_element: * @ctx: a #LibHalContext which should be used for querying HAL. * @udi: a #gchar corresponding to the UDI you want to get. * @device_type: a #GstHalDeviceType specifying the wanted device type. * * Get Hal UDI @udi's string value. * * Returns: a newly allocated #gchar string containing the appropriate pipeline * for UDI @udi, or NULL in the case of an error.. */ static gchar * gst_hal_get_oss_element (LibHalContext * ctx, const gchar * udi, GstHalDeviceType device_type) { char *type, *string = NULL; const char *element = NULL; DBusError error; dbus_error_init (&error); if (!libhal_device_query_capability (ctx, udi, "oss", &error)) { if (dbus_error_is_set (&error)) { GST_DEBUG ("Failed querying %s for oss capability: %s: %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); } else { GST_DEBUG ("UDI %s has no oss capability", udi); } return NULL; } type = libhal_device_get_property_string (ctx, udi, "oss.type", &error); if (dbus_error_is_set (&error)) { GST_DEBUG ("UDI %s has oss capabilities but no oss.type property: %s, %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); return NULL; } else if (!type) { GST_DEBUG ("UDI %s has empty oss.type property", udi); return NULL; } if (strcmp (type, "pcm") == 0) { if (device_type == GST_HAL_AUDIOSINK) element = "osssink"; else if (device_type == GST_HAL_AUDIOSRC) element = "osssrc"; } libhal_free_string (type); if (element) { char *device = NULL; device = libhal_device_get_property_string (ctx, udi, "oss.device_file", &error); if (dbus_error_is_set (&error)) { GST_DEBUG ("UDI %s has oss capabilities but no oss.device_file property: %s, %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); return NULL; } else if (!device) { GST_DEBUG ("UDI %s has empty oss.device_file property", udi); return NULL; } string = g_strdup_printf ("%s device=%s", element, device); libhal_free_string (device); } return string; } /* * gst_hal_get_string: * @udi: a #gchar corresponding to the UDI you want to get. * @device_type: a #GstHalDeviceType specifying the wanted device type. * * Get Hal UDI @udi's string value. * * Returns: a newly allocated #gchar string containing the appropriate pipeline * for UDI @udi, or NULL in the case of an error.. */ static gchar * gst_hal_get_string (const gchar * udi, GstHalDeviceType device_type) { DBusError error; LibHalContext *ctx; char *string = NULL; /* Don't query HAL for NULL UDIs. Passing NULL as UDI to HAL gives * an assertion failure in D-Bus when running with * DBUS_FATAL_WARNINGS=1. */ if (!udi) return NULL; dbus_error_init (&error); ctx = libhal_ctx_new (); /* Should only happen on OOM */ g_return_val_if_fail (ctx != NULL, NULL); if (!libhal_ctx_set_dbus_connection (ctx, dbus_bus_get (DBUS_BUS_SYSTEM, &error))) { GST_DEBUG ("Unable to set DBus connection: %s: %s", error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); goto ctx_free; } if (!libhal_ctx_init (ctx, &error)) { GST_DEBUG ("Unable to set init HAL context: %s: %s", error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); goto ctx_free; } /* Now first check if UDI is an alsa device, then oss and then * check the childs of the given device. If there are alsa and oss * children the first alsa one is used. */ string = gst_hal_get_alsa_element (ctx, udi, device_type); if (!string) string = gst_hal_get_oss_element (ctx, udi, device_type); if (!string) { int num_childs; char **childs = NULL; /* now try if one of the direct subdevices supports ALSA or OSS */ childs = libhal_manager_find_device_string_match (ctx, "info.parent", udi, &num_childs, &error); if (dbus_error_is_set (&error)) { GST_DEBUG ("Unable to retrieve childs of %s: %s: %s", udi, error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); goto ctx_shutdown; } if (childs && num_childs > 0) { int i; char *alsa_string = NULL, *oss_string = NULL; for (i = 0; i < num_childs && !alsa_string; i++) { alsa_string = gst_hal_get_alsa_element (ctx, childs[i], device_type); if (!oss_string) oss_string = gst_hal_get_oss_element (ctx, childs[i], device_type); } if (alsa_string) { string = alsa_string; g_free (oss_string); } else if (oss_string) { string = oss_string; } } libhal_free_string_array (childs); } ctx_shutdown: if (!libhal_ctx_shutdown (ctx, &error)) { GST_DEBUG ("Closing connection to HAL failed: %s: %s", error.name, error.message); LIBHAL_FREE_DBUS_ERROR (&error); } ctx_free: libhal_ctx_free (ctx); if (string == NULL) { GST_WARNING ("Problem finding a HAL audio device for udi %s", udi); } else { GST_INFO ("Using %s", string); } return string; } /* external functions */ /** * gst_hal_render_bin_from_udi: * @udi: a #gchar string corresponding to a Hal UDI. * * Render bin from Hal UDI @udi. * * Returns: a #GstElement containing the rendered bin. */ GstElement * gst_hal_render_bin_from_udi (const gchar * udi, GstHalDeviceType type) { GstElement *bin = NULL; gchar *value; value = gst_hal_get_string (udi, type); if (value) bin = gst_parse_bin_from_description (value, TRUE, NULL); g_free (value); return bin; } /** * gst_hal_get_audio_sink: * @udi: a #gchar string corresponding to a Hal UDI. * * Render audio output bin from GStreamer Hal UDI. * If no device with the specified UDI exists or @udi is NULL, * the default audio sink for the platform is used * (typically alsasink, osssink or sunaudiosink). * * Returns: a #GstElement containing the audio output bin, or NULL if * everything failed. */ GstElement * gst_hal_get_audio_sink (const gchar * udi) { GstElement *ret = NULL; if (udi) ret = gst_hal_render_bin_from_udi (udi, GST_HAL_AUDIOSINK); if (!ret) { ret = gst_element_factory_make (DEFAULT_AUDIOSINK, NULL); if (!ret) GST_ERROR ("Hal audio sink and %s don't work", DEFAULT_AUDIOSINK); } return ret; } /** * gst_hal_get_audio_src: * @udi: a #gchar string corresponding to a Hal UDI. * * Render audio acquisition bin from GStreamer Hal UDI. * If no device with the specified UDI exists or @udi is NULL, * the default audio source for the plaform is used * (typically alsasrc, osssrc or sunaudiosrc). * * Returns: a #GstElement containing the audio source bin, or NULL if * everything failed. */ GstElement * gst_hal_get_audio_src (const gchar * udi) { GstElement *ret = NULL; if (udi) ret = gst_hal_render_bin_from_udi (udi, GST_HAL_AUDIOSRC); if (!ret) { ret = gst_element_factory_make (DEFAULT_AUDIOSRC, NULL); if (!ret) GST_ERROR ("Hal audio src and %s don't work", DEFAULT_AUDIOSRC); } return ret; } gst-plugins-good-0.10.31/ext/hal/Makefile.am0000644000175000017500000000070711671175352015413 00000000000000plugin_LTLIBRARIES = libgsthalelements.la libgsthalelements_la_SOURCES = \ gsthalaudiosink.c \ gsthalaudiosrc.c \ gsthalelements.c \ hal.c libgsthalelements_la_CFLAGS = $(GST_CFLAGS) $(HAL_CFLAGS) libgsthalelements_la_LIBADD = $(GST_LIBS) $(HAL_LIBS) libgsthalelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsthalelements_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gsthalaudiosink.h \ gsthalaudiosrc.h \ gsthalelements.h \ hal.h gst-plugins-good-0.10.31/ext/hal/gsthalaudiosink.h0000644000175000017500000000355411671175352016724 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jürg Billeter * * 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_HAL_AUDIO_SINK_H__ #define __GST_HAL_AUDIO_SINK_H__ #include G_BEGIN_DECLS #define GST_TYPE_HAL_AUDIO_SINK \ (gst_hal_audio_sink_get_type ()) #define GST_HAL_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_HAL_AUDIO_SINK, \ GstHalAudioSink)) #define GST_HAL_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_HAL_AUDIO_SINK, \ GstHalAudioSinkClass)) #define GST_IS_HAL_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_HAL_AUDIO_SINK)) #define GST_IS_HAL_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_HAL_AUDIO_SINK)) typedef struct _GstHalAudioSink { GstBin parent; /* explicit pointers to stuff used */ gchar *udi; GstElement *kid; GstPad *pad; } GstHalAudioSink; typedef struct _GstHalAudioSinkClass { GstBinClass parent_class; } GstHalAudioSinkClass; GType gst_hal_audio_sink_get_type (void); G_END_DECLS #endif /* __GST_HAL_AUDIO_SINK_H__ */ gst-plugins-good-0.10.31/ext/hal/gsthalelements.h0000644000175000017500000000205711671175352016547 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Ronald S. Bultje * * 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_HAL_ELEMENTS_H__ #define __GST_HAL_ELEMENTS_H__ #include GST_DEBUG_CATEGORY_EXTERN (hal_debug); #define GST_CAT_DEFAULT hal_debug #endif /* __GST_HAL_ELEMENTS_H__ */ gst-plugins-good-0.10.31/ext/hal/hal.h0000644000175000017500000000253011671175352014270 00000000000000/* GStreamer * Copyright (C) <2002> Thomas Vander Stichele * Copyright (C) <2006> Jürg Billeter * * 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_HAL_H #define GST_HAL_H /* * this library handles interaction with Hal */ #include #include #include G_BEGIN_DECLS typedef enum { GST_HAL_AUDIOSINK, GST_HAL_AUDIOSRC } GstHalDeviceType; GstElement *gst_hal_render_bin_from_udi (const gchar * udi, GstHalDeviceType type); GstElement *gst_hal_get_audio_sink (const gchar * udi); GstElement *gst_hal_get_audio_src (const gchar * udi); G_END_DECLS #endif /* GST_HAL_H */ gst-plugins-good-0.10.31/ext/hal/gsthalaudiosrc.h0000644000175000017500000000353411671175352016545 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2005 Tim-Philipp Müller * (c) 2006 Jürg Billeter * * 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_HAL_AUDIO_SRC_H__ #define __GST_HAL_AUDIO_SRC_H__ #include G_BEGIN_DECLS #define GST_TYPE_HAL_AUDIO_SRC (gst_hal_audio_src_get_type ()) #define GST_HAL_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_HAL_AUDIO_SRC, GstHalAudioSrc)) #define GST_HAL_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_HAL_AUDIO_SRC, GstHalAudioSrcClass)) #define GST_IS_HAL_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_HAL_AUDIO_SRC)) #define GST_IS_HAL_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_HAL_AUDIO_SRC)) typedef struct _GstHalAudioSrc { GstBin parent; /* explicit pointers to stuff used */ gchar *udi; GstElement *kid; GstPad *pad; } GstHalAudioSrc; typedef struct _GstHalAudioSrcClass { GstBinClass parent_class; } GstHalAudioSrcClass; GType gst_hal_audio_src_get_type (void); G_END_DECLS #endif /* __GST_HAL_AUDIO_SRC_H__ */ gst-plugins-good-0.10.31/ext/hal/gsthalaudiosrc.c0000644000175000017500000001577411677341654016557 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2005 Tim-Philipp Müller * (c) 2006 Jürg Billeter * * 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-halaudiosrc * * HalAudioSrc allows access to input of sound devices by specifying the * corresponding persistent Unique Device Id (UDI) from the Hardware Abstraction * Layer (HAL) in the #GstHalAudioSrc:udi property. * It currently always embeds alsasrc or osssrc as HAL doesn't support other * sound systems yet. You can also specify the UDI of a device that has ALSA or * OSS subdevices. If both are present ALSA is preferred. * * * Examples * |[ * hal-find-by-property --key alsa.type --string capture * ]| list the UDIs of all your ALSA input devices * |[ * gst-launch -v halaudiosrc udi=/org/freedesktop/Hal/devices/pci_8086_27d8_alsa_capture_0 ! autoaudiosink * ]| You should now hear yourself with a small delay if you have a microphone * connected to the specified sound device. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gsthalelements.h" #include "gsthalaudiosrc.h" static void gst_hal_audio_src_dispose (GObject * object); static GstStateChangeReturn gst_hal_audio_src_change_state (GstElement * element, GstStateChange transition); enum { PROP_0, PROP_UDI }; GST_BOILERPLATE (GstHalAudioSrc, gst_hal_audio_src, GstBin, GST_TYPE_BIN); static void gst_hal_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_hal_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_hal_audio_src_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); gst_element_class_add_static_pad_template (eklass, &src_template); gst_element_class_set_details_simple (eklass, "HAL audio source", "Source/Audio", "Audio source for sound device access via HAL", "Jürg Billeter "); } static void gst_hal_audio_src_class_init (GstHalAudioSrcClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); oklass->set_property = gst_hal_audio_src_set_property; oklass->get_property = gst_hal_audio_src_get_property; oklass->dispose = gst_hal_audio_src_dispose; eklass->change_state = gst_hal_audio_src_change_state; g_object_class_install_property (oklass, PROP_UDI, g_param_spec_string ("udi", "UDI", "Unique Device Id", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } /* * Hack to make negotiation work. */ static void gst_hal_audio_src_reset (GstHalAudioSrc * src) { GstPad *targetpad; /* fakesrc */ if (src->kid) { gst_element_set_state (src->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (src), src->kid); } src->kid = gst_element_factory_make ("fakesrc", "testsrc"); gst_bin_add (GST_BIN (src), src->kid); targetpad = gst_element_get_static_pad (src->kid, "src"); gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); gst_object_unref (targetpad); } static void gst_hal_audio_src_init (GstHalAudioSrc * src, GstHalAudioSrcClass * g_class) { src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); gst_element_add_pad (GST_ELEMENT (src), src->pad); gst_hal_audio_src_reset (src); } static void gst_hal_audio_src_dispose (GObject * object) { GstHalAudioSrc *src = GST_HAL_AUDIO_SRC (object); if (src->udi) { g_free (src->udi); src->udi = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static gboolean do_toggle_element (GstHalAudioSrc * src) { GstPad *targetpad; /* kill old element */ if (src->kid) { GST_DEBUG_OBJECT (src, "Removing old kid"); gst_element_set_state (src->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (src), src->kid); src->kid = NULL; } GST_DEBUG_OBJECT (src, "Creating new kid"); if (!src->udi) GST_INFO_OBJECT (src, "No UDI set for device, using default one"); if (!(src->kid = gst_hal_get_audio_src (src->udi))) { GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL), ("Failed to render audio source from Hal")); return FALSE; } gst_element_set_state (src->kid, GST_STATE (src)); gst_bin_add (GST_BIN (src), src->kid); /* re-attach ghostpad */ GST_DEBUG_OBJECT (src, "Creating new ghostpad"); targetpad = gst_element_get_static_pad (src->kid, "src"); gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); gst_object_unref (targetpad); GST_DEBUG_OBJECT (src, "done changing hal audio source"); return TRUE; } static void gst_hal_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstHalAudioSrc *this = GST_HAL_AUDIO_SRC (object); GST_OBJECT_LOCK (this); switch (prop_id) { case PROP_UDI: if (this->udi) g_free (this->udi); this->udi = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (this); } static void gst_hal_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstHalAudioSrc *this = GST_HAL_AUDIO_SRC (object); GST_OBJECT_LOCK (this); switch (prop_id) { case PROP_UDI: g_value_set_string (value, this->udi); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (this); } static GstStateChangeReturn gst_hal_audio_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstHalAudioSrc *src = GST_HAL_AUDIO_SRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!do_toggle_element (src)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_hal_audio_src_reset (src); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/hal/gsthalelements.c0000644000175000017500000000323311671175352016537 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jürg Billeter * * 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 #include "gsthalelements.h" #include "gsthalaudiosink.h" #include "gsthalaudiosrc.h" GST_DEBUG_CATEGORY (hal_debug); static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (hal_debug, "hal", 0, "HAL/GStreamer audio input/output wrapper elements"); if (!gst_element_register (plugin, "halaudiosink", GST_RANK_NONE, GST_TYPE_HAL_AUDIO_SINK) || !gst_element_register (plugin, "halaudiosrc", GST_RANK_NONE, GST_TYPE_HAL_AUDIO_SRC)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "halelements", "elements wrapping the GStreamer/HAL audio input/output devices", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/hal/Makefile.in0000644000175000017500000007573211720560226015427 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/hal DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgsthalelements_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgsthalelements_la_OBJECTS = \ libgsthalelements_la-gsthalaudiosink.lo \ libgsthalelements_la-gsthalaudiosrc.lo \ libgsthalelements_la-gsthalelements.lo \ libgsthalelements_la-hal.lo libgsthalelements_la_OBJECTS = $(am_libgsthalelements_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgsthalelements_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgsthalelements_la_CFLAGS) $(CFLAGS) \ $(libgsthalelements_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsthalelements_la_SOURCES) DIST_SOURCES = $(libgsthalelements_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgsthalelements.la libgsthalelements_la_SOURCES = \ gsthalaudiosink.c \ gsthalaudiosrc.c \ gsthalelements.c \ hal.c libgsthalelements_la_CFLAGS = $(GST_CFLAGS) $(HAL_CFLAGS) libgsthalelements_la_LIBADD = $(GST_LIBS) $(HAL_LIBS) libgsthalelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsthalelements_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gsthalaudiosink.h \ gsthalaudiosrc.h \ gsthalelements.h \ hal.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/hal/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/hal/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsthalelements.la: $(libgsthalelements_la_OBJECTS) $(libgsthalelements_la_DEPENDENCIES) $(EXTRA_libgsthalelements_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsthalelements_la_LINK) -rpath $(plugindir) $(libgsthalelements_la_OBJECTS) $(libgsthalelements_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-gsthalelements.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthalelements_la-hal.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgsthalelements_la-gsthalaudiosink.lo: gsthalaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-gsthalaudiosink.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Tpo -c -o libgsthalelements_la-gsthalaudiosink.lo `test -f 'gsthalaudiosink.c' || echo '$(srcdir)/'`gsthalaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Tpo $(DEPDIR)/libgsthalelements_la-gsthalaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthalaudiosink.c' object='libgsthalelements_la-gsthalaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-gsthalaudiosink.lo `test -f 'gsthalaudiosink.c' || echo '$(srcdir)/'`gsthalaudiosink.c libgsthalelements_la-gsthalaudiosrc.lo: gsthalaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-gsthalaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Tpo -c -o libgsthalelements_la-gsthalaudiosrc.lo `test -f 'gsthalaudiosrc.c' || echo '$(srcdir)/'`gsthalaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Tpo $(DEPDIR)/libgsthalelements_la-gsthalaudiosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthalaudiosrc.c' object='libgsthalelements_la-gsthalaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-gsthalaudiosrc.lo `test -f 'gsthalaudiosrc.c' || echo '$(srcdir)/'`gsthalaudiosrc.c libgsthalelements_la-gsthalelements.lo: gsthalelements.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-gsthalelements.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-gsthalelements.Tpo -c -o libgsthalelements_la-gsthalelements.lo `test -f 'gsthalelements.c' || echo '$(srcdir)/'`gsthalelements.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-gsthalelements.Tpo $(DEPDIR)/libgsthalelements_la-gsthalelements.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthalelements.c' object='libgsthalelements_la-gsthalelements.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-gsthalelements.lo `test -f 'gsthalelements.c' || echo '$(srcdir)/'`gsthalelements.c libgsthalelements_la-hal.lo: hal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -MT libgsthalelements_la-hal.lo -MD -MP -MF $(DEPDIR)/libgsthalelements_la-hal.Tpo -c -o libgsthalelements_la-hal.lo `test -f 'hal.c' || echo '$(srcdir)/'`hal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsthalelements_la-hal.Tpo $(DEPDIR)/libgsthalelements_la-hal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hal.c' object='libgsthalelements_la-hal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthalelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthalelements_la_CFLAGS) $(CFLAGS) -c -o libgsthalelements_la-hal.lo `test -f 'hal.c' || echo '$(srcdir)/'`hal.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/hal/gsthalaudiosink.c0000644000175000017500000001577111677341654016731 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jürg Billeter * * 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-halaudiosink * * HalAudioSink allows access to output of sound devices by specifying the * corresponding persistent Unique Device Id (UDI) from the Hardware Abstraction * Layer (HAL) in the #GstHalAudioSink:udi property. * It currently always embeds alsasink or osssink as HAL doesn't support other * sound systems yet. You can also specify the UDI of a device that has ALSA or * OSS subdevices. If both are present ALSA is preferred. * * * Examples * |[ * hal-find-by-property --key alsa.type --string playback * ]| list the UDIs of all your ALSA output devices * |[ * gst-launch -v audiotestsrc ! halaudiosink udi=/org/freedesktop/Hal/devices/pci_8086_27d8_alsa_playback_0 * ]| test your soundcard by playing a test signal on the specified sound device. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gsthalelements.h" #include "gsthalaudiosink.h" static void gst_hal_audio_sink_dispose (GObject * object); static GstStateChangeReturn gst_hal_audio_sink_change_state (GstElement * element, GstStateChange transition); enum { PROP_0, PROP_UDI }; GST_BOILERPLATE (GstHalAudioSink, gst_hal_audio_sink, GstBin, GST_TYPE_BIN); static void gst_hal_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_hal_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_hal_audio_sink_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); gst_element_class_add_static_pad_template (eklass, &sink_template); gst_element_class_set_details_simple (eklass, "HAL audio sink", "Sink/Audio", "Audio sink for sound device access via HAL", "Jürg Billeter "); } static void gst_hal_audio_sink_class_init (GstHalAudioSinkClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); oklass->set_property = gst_hal_audio_sink_set_property; oklass->get_property = gst_hal_audio_sink_get_property; oklass->dispose = gst_hal_audio_sink_dispose; eklass->change_state = gst_hal_audio_sink_change_state; g_object_class_install_property (oklass, PROP_UDI, g_param_spec_string ("udi", "UDI", "Unique Device Id", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } /* * Hack to make negotiation work. */ static void gst_hal_audio_sink_reset (GstHalAudioSink * sink) { GstPad *targetpad; /* fakesink */ if (sink->kid) { gst_element_set_state (sink->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (sink), sink->kid); } sink->kid = gst_element_factory_make ("fakesink", "testsink"); gst_bin_add (GST_BIN (sink), sink->kid); targetpad = gst_element_get_static_pad (sink->kid, "sink"); gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); gst_object_unref (targetpad); } static void gst_hal_audio_sink_init (GstHalAudioSink * sink, GstHalAudioSinkClass * g_class) { sink->pad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); gst_element_add_pad (GST_ELEMENT (sink), sink->pad); gst_hal_audio_sink_reset (sink); } static void gst_hal_audio_sink_dispose (GObject * object) { GstHalAudioSink *sink = GST_HAL_AUDIO_SINK (object); if (sink->udi) { g_free (sink->udi); sink->udi = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static gboolean do_toggle_element (GstHalAudioSink * sink) { GstPad *targetpad; /* kill old element */ if (sink->kid) { GST_DEBUG_OBJECT (sink, "Removing old kid"); gst_element_set_state (sink->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (sink), sink->kid); sink->kid = NULL; } GST_DEBUG_OBJECT (sink, "Creating new kid"); if (!sink->udi) GST_INFO_OBJECT (sink, "No UDI set for device, using default one"); if (!(sink->kid = gst_hal_get_audio_sink (sink->udi))) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render audio sink from Hal")); return FALSE; } gst_element_set_state (sink->kid, GST_STATE (sink)); gst_bin_add (GST_BIN (sink), sink->kid); /* re-attach ghostpad */ GST_DEBUG_OBJECT (sink, "Creating new ghostpad"); targetpad = gst_element_get_static_pad (sink->kid, "sink"); gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); gst_object_unref (targetpad); GST_DEBUG_OBJECT (sink, "done changing hal audio sink"); return TRUE; } static void gst_hal_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstHalAudioSink *this = GST_HAL_AUDIO_SINK (object); GST_OBJECT_LOCK (this); switch (prop_id) { case PROP_UDI: if (this->udi) g_free (this->udi); this->udi = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (this); } static void gst_hal_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstHalAudioSink *this = GST_HAL_AUDIO_SINK (object); GST_OBJECT_LOCK (this); switch (prop_id) { case PROP_UDI: g_value_set_string (value, this->udi); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (this); } static GstStateChangeReturn gst_hal_audio_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstHalAudioSink *sink = GST_HAL_AUDIO_SINK (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!do_toggle_element (sink)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_hal_audio_sink_reset (sink); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/jack/0000755000175000017500000000000011720565322013572 500000000000000gst-plugins-good-0.10.31/ext/jack/gstjack.c0000644000175000017500000000531311671175352015313 00000000000000/* GStreamer Jack plugins * Copyright (C) 2006 Wim Taymans * * 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) gst-plugins-good-0.10.31/ext/jack/gstjack.h0000644000175000017500000000367211671175352015326 00000000000000/* GStreamer * Copyright (C) 2006 Wim Taymans * * 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_ gst-plugins-good-0.10.31/ext/jack/gstjackaudioclient.h0000644000175000017500000000427311671175352017545 00000000000000/* GStreamer * Copyright (C) 2006 Wim Taymans * * 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 #include 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__ */ gst-plugins-good-0.10.31/ext/jack/gstjackaudioclient.c0000644000175000017500000003440611677341654017547 00000000000000/* GStreamer * Copyright (C) 2006 Wim Taymans * * 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 #include "gstjackaudioclient.h" #include 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; } gst-plugins-good-0.10.31/ext/jack/gstjackringbuffer.h0000644000175000017500000001003211671175352017364 00000000000000/* * GStreamer * Copyright (C) 2006 Wim Taymans * Copyright (C) 2008 Tristan Matthews * * 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 gst-plugins-good-0.10.31/ext/jack/Makefile.am0000644000175000017500000000102011671175352015544 00000000000000 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 gst-plugins-good-0.10.31/ext/jack/gstjackaudiosrc.c0000644000175000017500000006372511677341654017066 00000000000000/* GStreamer * Copyright (C) 2008 Tristan Matthews * * 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_<name>_<num> where * <name> is the element name and <num> 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. * * * Example launch line * |[ * gst-launch jackaudiosrc connect=0 ! jackaudiosink connect=0 * ]| Get audio input into gstreamer from jack. * * * Last reviewed on 2008-07-22 (0.10.4) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #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) { GstRingBufferClass *gstringbuffer_class; 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"); if (src->client_name) { name = src->client_name; } else { 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 | JackFailure)) { 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_READ, (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; } #if defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7) static guint gst_jack_ring_buffer_delay (GstRingBuffer * buf) { GstJackAudioSrc *src; guint i, res = 0; jack_latency_range_t range; src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf)); for (i = 0; i < src->port_count; i++) { jack_port_get_latency_range (src->ports[i], JackCaptureLatency, &range); if (range.max > res) res = range.max; } GST_DEBUG_OBJECT (src, "delay %u", res); return res; } #else /* !(defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)) */ static guint gst_jack_ring_buffer_delay (GstRingBuffer * buf) { GstJackAudioSrc *src; guint i, res = 0; guint 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; } #endif /* Audiosrc signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO #define DEFAULT_PROP_SERVER NULL #define DEFAULT_PROP_CLIENT_NAME NULL enum { PROP_0, PROP_CONNECT, PROP_SERVER, PROP_CLIENT, PROP_CLIENT_NAME, 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_static_pad_template (element_class, &src_factory); gst_element_class_set_details_simple (element_class, "Audio Source (Jack)", "Source/Audio", "Captures audio from a JACK server", "Tristan Matthews "); } /* initialize the jack_audio_src's class */ static void gst_jack_audio_src_class_init (GstJackAudioSrcClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; GstBaseAudioSrcClass *gstbaseaudiosrc_class; gobject_class = (GObjectClass *) 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)); /** * GstJackAudioSrc:client-name * * The client name to use. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_CLIENT_NAME, g_param_spec_string ("client-name", "Client name", "The client name of the Jack instance (NULL = default)", DEFAULT_PROP_CLIENT_NAME, 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; src->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME); } static void gst_jack_audio_src_dispose (GObject * object) { GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object); gst_caps_replace (&src->caps, NULL); if (src->client_name != NULL) { g_free (src->client_name); src->client_name = 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_CLIENT_NAME: g_free (src->client_name); src->client_name = g_value_dup_string (value); break; 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_CLIENT_NAME: g_value_set_string (value, src->client_name); break; 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; } gst-plugins-good-0.10.31/ext/jack/gstjackutil.c0000644000175000017500000000745111671175352016216 00000000000000/* GStreamer Jack utility functions * Copyright (C) 2010 Tristan Matthews * * 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 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); } gst-plugins-good-0.10.31/ext/jack/gstjackaudiosink.h0000644000175000017500000000466411677341654017245 00000000000000/* GStreamer * Copyright (C) 2006 Wim Taymans * * 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 #include #include #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; gchar *client_name; /* our client */ GstJackAudioClient *client; /* our ports */ jack_port_t **ports; int port_count; sample_t **buffers; }; struct _GstJackAudioSinkClass { GstBaseAudioSinkClass parent_class; }; GType gst_jack_audio_sink_get_type (void); G_END_DECLS #endif /* __GST_JACK_AUDIO_SINK_H__ */ gst-plugins-good-0.10.31/ext/jack/gstjackaudiosink.c0000644000175000017500000006176311677341654017243 00000000000000/* GStreamer * Copyright (C) 2006 Wim Taymans * * 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_<name>_<num> where * <name> is the element name and <num> 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. * * * Example launch line * |[ * gst-launch audiotestsrc ! jackaudiosink * ]| Play a sine wave to using jack. * * * Last reviewed on 2006-11-30 (0.10.4) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #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); sink->buffers = g_realloc (sink->buffers, sizeof (sample_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; g_free (sink->buffers); sink->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, "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) { GstRingBufferClass *gstringbuffer_class; 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; gint readseg, len; guint8 *readptr; gint i, j, flen, channels; sample_t *data; buf = GST_RING_BUFFER_CAST (arg); sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); channels = buf->spec.channels; /* get target buffers */ for (i = 0; i < channels; i++) { sink->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++) { sink->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 (sink->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"); if (sink->client_name) { name = sink->client_name; } else { 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; } #if defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7) static guint gst_jack_ring_buffer_delay (GstRingBuffer * buf) { GstJackAudioSink *sink; guint i, res = 0; jack_latency_range_t range; sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf)); for (i = 0; i < sink->port_count; i++) { jack_port_get_latency_range (sink->ports[i], JackPlaybackLatency, &range); if (range.max > res) res = range.max; } GST_LOG_OBJECT (sink, "delay %u", res); return res; } #else /* !(defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)) */ static guint gst_jack_ring_buffer_delay (GstRingBuffer * buf) { GstJackAudioSink *sink; guint i, res = 0; guint 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; } #endif 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 #define DEFAULT_PROP_CLIENT_NAME NULL enum { PROP_0, PROP_CONNECT, PROP_SERVER, PROP_CLIENT, PROP_CLIENT_NAME, 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 "); gst_element_class_add_static_pad_template (element_class, &jackaudiosink_sink_factory); } static void gst_jack_audio_sink_class_init (GstJackAudioSinkClass * klass) { GObjectClass *gobject_class; GstBaseSinkClass *gstbasesink_class; GstBaseAudioSinkClass *gstbaseaudiosink_class; gobject_class = (GObjectClass *) 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)); /** * GstJackAudioSink:client-name * * The client name to use. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_CLIENT_NAME, g_param_spec_string ("client-name", "Client name", "The client name of the Jack instance (NULL = default)", DEFAULT_PROP_CLIENT_NAME, 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; sink->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME); sink->buffers = NULL; } static void gst_jack_audio_sink_dispose (GObject * object) { GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (object); gst_caps_replace (&sink->caps, NULL); if (sink->client_name != NULL) { g_free (sink->client_name); sink->client_name = 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_CLIENT_NAME: g_free (sink->client_name); sink->client_name = g_value_dup_string (value); break; 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_CLIENT_NAME: g_value_set_string (value, sink->client_name); break; 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; } gst-plugins-good-0.10.31/ext/jack/gstjackutil.h0000644000175000017500000000176511671175352016225 00000000000000/* GStreamer * Copyright (C) 2010 Tristan Matthews * * 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 void gst_jack_set_layout_on_caps (GstCaps **caps, gint channels); #endif // _GST_JACK_UTIL_H_ gst-plugins-good-0.10.31/ext/jack/Makefile.in0000644000175000017500000007765311720560226015577 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/jack DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstjack_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstjack_la_OBJECTS = libgstjack_la-gstjackutil.lo \ libgstjack_la-gstjack.lo libgstjack_la-gstjackaudiosrc.lo \ libgstjack_la-gstjackaudiosink.lo \ libgstjack_la-gstjackaudioclient.lo libgstjack_la_OBJECTS = $(am_libgstjack_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstjack_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstjack_la_CFLAGS) $(CFLAGS) \ $(libgstjack_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstjack_la_SOURCES) DIST_SOURCES = $(libgstjack_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ 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 all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/jack/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/jack/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstjack.la: $(libgstjack_la_OBJECTS) $(libgstjack_la_DEPENDENCIES) $(EXTRA_libgstjack_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstjack_la_LINK) -rpath $(plugindir) $(libgstjack_la_OBJECTS) $(libgstjack_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackaudioclient.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackaudiosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstjack_la-gstjackutil.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstjack_la-gstjackutil.lo: gstjackutil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackutil.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackutil.Tpo -c -o libgstjack_la-gstjackutil.lo `test -f 'gstjackutil.c' || echo '$(srcdir)/'`gstjackutil.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackutil.Tpo $(DEPDIR)/libgstjack_la-gstjackutil.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackutil.c' object='libgstjack_la-gstjackutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackutil.lo `test -f 'gstjackutil.c' || echo '$(srcdir)/'`gstjackutil.c libgstjack_la-gstjack.lo: gstjack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjack.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjack.Tpo -c -o libgstjack_la-gstjack.lo `test -f 'gstjack.c' || echo '$(srcdir)/'`gstjack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjack.Tpo $(DEPDIR)/libgstjack_la-gstjack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjack.c' object='libgstjack_la-gstjack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjack.lo `test -f 'gstjack.c' || echo '$(srcdir)/'`gstjack.c libgstjack_la-gstjackaudiosrc.lo: gstjackaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackaudiosrc.Tpo -c -o libgstjack_la-gstjackaudiosrc.lo `test -f 'gstjackaudiosrc.c' || echo '$(srcdir)/'`gstjackaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackaudiosrc.Tpo $(DEPDIR)/libgstjack_la-gstjackaudiosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackaudiosrc.c' object='libgstjack_la-gstjackaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackaudiosrc.lo `test -f 'gstjackaudiosrc.c' || echo '$(srcdir)/'`gstjackaudiosrc.c libgstjack_la-gstjackaudiosink.lo: gstjackaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackaudiosink.Tpo -c -o libgstjack_la-gstjackaudiosink.lo `test -f 'gstjackaudiosink.c' || echo '$(srcdir)/'`gstjackaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackaudiosink.Tpo $(DEPDIR)/libgstjack_la-gstjackaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackaudiosink.c' object='libgstjack_la-gstjackaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackaudiosink.lo `test -f 'gstjackaudiosink.c' || echo '$(srcdir)/'`gstjackaudiosink.c libgstjack_la-gstjackaudioclient.lo: gstjackaudioclient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -MT libgstjack_la-gstjackaudioclient.lo -MD -MP -MF $(DEPDIR)/libgstjack_la-gstjackaudioclient.Tpo -c -o libgstjack_la-gstjackaudioclient.lo `test -f 'gstjackaudioclient.c' || echo '$(srcdir)/'`gstjackaudioclient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstjack_la-gstjackaudioclient.Tpo $(DEPDIR)/libgstjack_la-gstjackaudioclient.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstjackaudioclient.c' object='libgstjack_la-gstjackaudioclient.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstjack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstjack_la_CFLAGS) $(CFLAGS) -c -o libgstjack_la-gstjackaudioclient.lo `test -f 'gstjackaudioclient.c' || echo '$(srcdir)/'`gstjackaudioclient.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/jack/gstjackaudiosrc.h0000644000175000017500000000713611677341654017065 00000000000000/* GStreamer * Copyright (C) 2008 Tristan Matthews * * 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 #include #include #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; gchar *client_name; /* 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__ */ gst-plugins-good-0.10.31/ext/pulse/0000755000175000017500000000000011720565322014012 500000000000000gst-plugins-good-0.10.31/ext/pulse/pulseutil.c0000644000175000017500000002512211677341654016141 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; 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 "pulseutil.h" #include #ifdef HAVE_UNISTD_H # include /* getpid on UNIX */ #endif #ifdef HAVE_PROCESS_H # include /* getpid on win32 */ #endif static const pa_channel_position_t gst_pos_to_pa[GST_AUDIO_CHANNEL_POSITION_NUM] = { [GST_AUDIO_CHANNEL_POSITION_FRONT_MONO] = PA_CHANNEL_POSITION_MONO, [GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT, [GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT] = PA_CHANNEL_POSITION_FRONT_RIGHT, [GST_AUDIO_CHANNEL_POSITION_REAR_CENTER] = PA_CHANNEL_POSITION_REAR_CENTER, [GST_AUDIO_CHANNEL_POSITION_REAR_LEFT] = PA_CHANNEL_POSITION_REAR_LEFT, [GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT] = PA_CHANNEL_POSITION_REAR_RIGHT, [GST_AUDIO_CHANNEL_POSITION_LFE] = PA_CHANNEL_POSITION_LFE, [GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER] = PA_CHANNEL_POSITION_FRONT_CENTER, [GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, [GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, [GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT] = PA_CHANNEL_POSITION_SIDE_LEFT, [GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT] = PA_CHANNEL_POSITION_SIDE_RIGHT, [GST_AUDIO_CHANNEL_POSITION_NONE] = PA_CHANNEL_POSITION_INVALID }; /* All index are increased by one because PA_CHANNEL_POSITION_INVALID == -1 */ static const GstAudioChannelPosition pa_to_gst_pos[GST_AUDIO_CHANNEL_POSITION_NUM] = { [PA_CHANNEL_POSITION_MONO + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO, [PA_CHANNEL_POSITION_FRONT_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, [PA_CHANNEL_POSITION_FRONT_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, [PA_CHANNEL_POSITION_REAR_CENTER + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, [PA_CHANNEL_POSITION_REAR_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, [PA_CHANNEL_POSITION_REAR_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, [PA_CHANNEL_POSITION_LFE + 1] = GST_AUDIO_CHANNEL_POSITION_LFE, [PA_CHANNEL_POSITION_FRONT_CENTER + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, [PA_CHANNEL_POSITION_SIDE_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, [PA_CHANNEL_POSITION_SIDE_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, [PA_CHANNEL_POSITION_INVALID + 1] = GST_AUDIO_CHANNEL_POSITION_NONE, }; gboolean gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, pa_sample_spec * ss) { if (spec->format == GST_MU_LAW && spec->width == 8) ss->format = PA_SAMPLE_ULAW; else if (spec->format == GST_A_LAW && spec->width == 8) ss->format = PA_SAMPLE_ALAW; else if (spec->format == GST_U8 && spec->width == 8) ss->format = PA_SAMPLE_U8; else if (spec->format == GST_S16_LE && spec->width == 16) ss->format = PA_SAMPLE_S16LE; else if (spec->format == GST_S16_BE && spec->width == 16) ss->format = PA_SAMPLE_S16BE; else if (spec->format == GST_FLOAT32_LE && spec->width == 32) ss->format = PA_SAMPLE_FLOAT32LE; else if (spec->format == GST_FLOAT32_BE && spec->width == 32) ss->format = PA_SAMPLE_FLOAT32BE; else if (spec->format == GST_S32_LE && spec->width == 32) ss->format = PA_SAMPLE_S32LE; else if (spec->format == GST_S32_BE && spec->width == 32) ss->format = PA_SAMPLE_S32BE; else if (spec->format == GST_S24_3LE && spec->width == 24) ss->format = PA_SAMPLE_S24LE; else if (spec->format == GST_S24_3BE && spec->width == 24) ss->format = PA_SAMPLE_S24BE; else if (spec->format == GST_S24_LE && spec->width == 32) ss->format = PA_SAMPLE_S24_32LE; else if (spec->format == GST_S24_BE && spec->width == 32) ss->format = PA_SAMPLE_S24_32BE; else return FALSE; ss->channels = spec->channels; ss->rate = spec->rate; if (!pa_sample_spec_valid (ss)) return FALSE; return TRUE; } #ifdef HAVE_PULSE_1_0 gboolean gst_pulse_fill_format_info (GstRingBufferSpec * spec, pa_format_info ** f, guint * channels) { pa_format_info *format; pa_sample_format_t sf = PA_SAMPLE_INVALID; format = pa_format_info_new (); if (spec->format == GST_MU_LAW && spec->width == 8) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_ULAW; } else if (spec->format == GST_A_LAW && spec->width == 8) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_ALAW; } else if (spec->format == GST_U8 && spec->width == 8) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_U8; } else if (spec->format == GST_S16_LE && spec->width == 16) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S16LE; } else if (spec->format == GST_S16_BE && spec->width == 16) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S16BE; } else if (spec->format == GST_FLOAT32_LE && spec->width == 32) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_FLOAT32LE; } else if (spec->format == GST_FLOAT32_BE && spec->width == 32) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_FLOAT32BE; } else if (spec->format == GST_S32_LE && spec->width == 32) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S32LE; } else if (spec->format == GST_S32_BE && spec->width == 32) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S32BE; } else if (spec->format == GST_S24_3LE && spec->width == 24) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S24LE; } else if (spec->format == GST_S24_3BE && spec->width == 24) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S24BE; } else if (spec->format == GST_S24_LE && spec->width == 32) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S24_32LE; } else if (spec->format == GST_S24_BE && spec->width == 32) { format->encoding = PA_ENCODING_PCM; sf = PA_SAMPLE_S24_32BE; } else if (spec->format == GST_AC3) { format->encoding = PA_ENCODING_AC3_IEC61937; } else if (spec->format == GST_EAC3) { format->encoding = PA_ENCODING_EAC3_IEC61937; } else if (spec->format == GST_DTS) { format->encoding = PA_ENCODING_DTS_IEC61937; } else if (spec->format == GST_MPEG) { format->encoding = PA_ENCODING_MPEG_IEC61937; } else { goto fail; } if (format->encoding == PA_ENCODING_PCM) { pa_format_info_set_sample_format (format, sf); pa_format_info_set_channels (format, spec->channels); } pa_format_info_set_rate (format, spec->rate); if (!pa_format_info_valid (format)) goto fail; *f = format; *channels = spec->channels; return TRUE; fail: if (format) pa_format_info_free (format); return FALSE; } #endif /* PATH_MAX is not defined everywhere, e.g. on GNU Hurd */ #ifndef PATH_MAX #define PATH_MAX 4096 #endif gchar * gst_pulse_client_name (void) { gchar buf[PATH_MAX]; const char *c; if ((c = g_get_application_name ())) return g_strdup (c); else if (pa_get_binary_name (buf, sizeof (buf))) return g_strdup (buf); else return g_strdup_printf ("GStreamer-pid-%lu", (gulong) getpid ()); } pa_channel_map * gst_pulse_gst_to_channel_map (pa_channel_map * map, const GstRingBufferSpec * spec) { int i; GstAudioChannelPosition *pos; pa_channel_map_init (map); if (!(pos = gst_audio_get_channel_positions (gst_caps_get_structure (spec->caps, 0)))) { return NULL; } for (i = 0; i < spec->channels; i++) { if (pos[i] == GST_AUDIO_CHANNEL_POSITION_NONE) { /* no valid mappings for these channels */ g_free (pos); return NULL; } else if (pos[i] < GST_AUDIO_CHANNEL_POSITION_NUM) map->map[i] = gst_pos_to_pa[pos[i]]; else map->map[i] = PA_CHANNEL_POSITION_INVALID; } g_free (pos); map->channels = spec->channels; if (!pa_channel_map_valid (map)) { return NULL; } return map; } GstRingBufferSpec * gst_pulse_channel_map_to_gst (const pa_channel_map * map, GstRingBufferSpec * spec) { int i; GstAudioChannelPosition *pos; gboolean invalid = FALSE; g_return_val_if_fail (map->channels == spec->channels, NULL); pos = g_new0 (GstAudioChannelPosition, spec->channels + 1); for (i = 0; i < spec->channels; i++) { if (map->map[i] == PA_CHANNEL_POSITION_INVALID) { invalid = TRUE; break; } else if ((int) map->map[i] < (int) GST_AUDIO_CHANNEL_POSITION_NUM) { pos[i] = pa_to_gst_pos[map->map[i] + 1]; } else { invalid = TRUE; break; } } if (!invalid && !gst_audio_check_channel_positions (pos, spec->channels)) invalid = TRUE; if (invalid) { for (i = 0; i < spec->channels; i++) pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE; } gst_audio_set_channel_positions (gst_caps_get_structure (spec->caps, 0), pos); g_free (pos); return spec; } void gst_pulse_cvolume_from_linear (pa_cvolume * v, unsigned channels, gdouble volume) { pa_cvolume_set (v, channels, pa_sw_volume_from_linear (volume)); } static gboolean make_proplist_item (GQuark field_id, const GValue * value, gpointer user_data) { pa_proplist *p = (pa_proplist *) user_data; gchar *prop_id = (gchar *) g_quark_to_string (field_id); /* http://0pointer.de/lennart/projects/pulseaudio/doxygen/proplist_8h.html */ /* match prop id */ /* check type */ switch (G_VALUE_TYPE (value)) { case G_TYPE_STRING: pa_proplist_sets (p, prop_id, g_value_get_string (value)); break; default: GST_WARNING ("unmapped property type %s", G_VALUE_TYPE_NAME (value)); break; } return TRUE; } pa_proplist * gst_pulse_make_proplist (const GstStructure * properties) { pa_proplist *proplist = pa_proplist_new (); /* iterate the structure and fill the proplist */ gst_structure_foreach (properties, make_proplist_item, proplist); return proplist; } gst-plugins-good-0.10.31/ext/pulse/pulsesink.c0000644000175000017500000025102211707322452016115 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * (c) 2009 Wim Taymans * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ /** * SECTION:element-pulsesink * @see_also: pulsesrc, pulsemixer * * This element outputs audio to a * PulseAudio sound server. * * * Example pipelines * |[ * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! pulsesink * ]| Play an Ogg/Vorbis file. * |[ * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.4 ! pulsesink * ]| Play a 440Hz sine wave. * |[ * gst-launch -v audiotestsrc ! pulsesink stream-properties="props,media.title=test" * ]| Play a sine wave and set a stream property. The property can be checked * with "pactl list". * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include /* only used for GST_PLUGINS_BASE_VERSION_* */ #include #include "pulsesink.h" #include "pulseutil.h" GST_DEBUG_CATEGORY_EXTERN (pulse_debug); #define GST_CAT_DEFAULT pulse_debug #define DEFAULT_SERVER NULL #define DEFAULT_DEVICE NULL #define DEFAULT_DEVICE_NAME NULL #define DEFAULT_VOLUME 1.0 #define DEFAULT_MUTE FALSE #define MAX_VOLUME 10.0 enum { PROP_0, PROP_SERVER, PROP_DEVICE, PROP_DEVICE_NAME, PROP_VOLUME, PROP_MUTE, PROP_CLIENT, PROP_STREAM_PROPERTIES, PROP_LAST }; #define GST_TYPE_PULSERING_BUFFER \ (gst_pulseringbuffer_get_type()) #define GST_PULSERING_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSERING_BUFFER,GstPulseRingBuffer)) #define GST_PULSERING_BUFFER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSERING_BUFFER,GstPulseRingBufferClass)) #define GST_PULSERING_BUFFER_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PULSERING_BUFFER, GstPulseRingBufferClass)) #define GST_PULSERING_BUFFER_CAST(obj) \ ((GstPulseRingBuffer *)obj) #define GST_IS_PULSERING_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSERING_BUFFER)) #define GST_IS_PULSERING_BUFFER_CLASS(klass)\ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSERING_BUFFER)) typedef struct _GstPulseRingBuffer GstPulseRingBuffer; typedef struct _GstPulseRingBufferClass GstPulseRingBufferClass; typedef struct _GstPulseContext GstPulseContext; /* Store the PA contexts in a hash table to allow easy sharing among * multiple instances of the sink. Keys are $context_name@$server_name * (strings) and values should be GstPulseContext pointers. */ struct _GstPulseContext { pa_context *context; GSList *ring_buffers; }; static GHashTable *gst_pulse_shared_contexts = NULL; /* use one static main-loop for all instances * this is needed to make the context sharing work as the contexts are * released when releasing their parent main-loop */ static pa_threaded_mainloop *mainloop = NULL; static guint mainloop_ref_ct = 0; /* lock for access to shared resources */ static GMutex *pa_shared_resource_mutex = NULL; /* We keep a custom ringbuffer that is backed up by data allocated by * pulseaudio. We must also overide the commit function to write into * pulseaudio memory instead. */ struct _GstPulseRingBuffer { GstRingBuffer object; gchar *context_name; gchar *stream_name; pa_context *context; pa_stream *stream; #ifdef HAVE_PULSE_1_0 pa_format_info *format; guint channels; gboolean is_pcm; #else pa_sample_spec sample_spec; #endif void *m_data; size_t m_towrite; size_t m_writable; gint64 m_offset; gint64 m_lastoffset; gboolean corked:1; gboolean in_commit:1; gboolean paused:1; }; struct _GstPulseRingBufferClass { GstRingBufferClass parent_class; }; static GType gst_pulseringbuffer_get_type (void); static void gst_pulseringbuffer_finalize (GObject * object); static GstRingBufferClass *ring_parent_class = NULL; static gboolean gst_pulseringbuffer_open_device (GstRingBuffer * buf); static gboolean gst_pulseringbuffer_close_device (GstRingBuffer * buf); static gboolean gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec); static gboolean gst_pulseringbuffer_release (GstRingBuffer * buf); static gboolean gst_pulseringbuffer_start (GstRingBuffer * buf); static gboolean gst_pulseringbuffer_pause (GstRingBuffer * buf); static gboolean gst_pulseringbuffer_stop (GstRingBuffer * buf); static void gst_pulseringbuffer_clear (GstRingBuffer * buf); static guint gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample, guchar * data, gint in_samples, gint out_samples, gint * accum); G_DEFINE_TYPE (GstPulseRingBuffer, gst_pulseringbuffer, GST_TYPE_RING_BUFFER); static void gst_pulsesink_init_contexts (void) { g_assert (pa_shared_resource_mutex == NULL); pa_shared_resource_mutex = g_mutex_new (); gst_pulse_shared_contexts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } static void gst_pulseringbuffer_class_init (GstPulseRingBufferClass * klass) { GObjectClass *gobject_class; GstRingBufferClass *gstringbuffer_class; gobject_class = (GObjectClass *) klass; gstringbuffer_class = (GstRingBufferClass *) klass; ring_parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_pulseringbuffer_finalize; gstringbuffer_class->open_device = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_open_device); gstringbuffer_class->close_device = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_close_device); gstringbuffer_class->acquire = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_acquire); gstringbuffer_class->release = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_release); gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_start); gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_pause); gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_start); gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_stop); gstringbuffer_class->clear_all = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_clear); gstringbuffer_class->commit = GST_DEBUG_FUNCPTR (gst_pulseringbuffer_commit); } static void gst_pulseringbuffer_init (GstPulseRingBuffer * pbuf) { pbuf->stream_name = NULL; pbuf->context = NULL; pbuf->stream = NULL; #ifdef HAVE_PULSE_1_0 pbuf->format = NULL; pbuf->channels = 0; pbuf->is_pcm = FALSE; #else pa_sample_spec_init (&pbuf->sample_spec); #endif pbuf->m_data = NULL; pbuf->m_towrite = 0; pbuf->m_writable = 0; pbuf->m_offset = 0; pbuf->m_lastoffset = 0; pbuf->corked = TRUE; pbuf->in_commit = FALSE; pbuf->paused = FALSE; } static void gst_pulsering_destroy_stream (GstPulseRingBuffer * pbuf) { if (pbuf->stream) { if (pbuf->m_data) { /* drop shm memory buffer */ pa_stream_cancel_write (pbuf->stream); /* reset internal variables */ pbuf->m_data = NULL; pbuf->m_towrite = 0; pbuf->m_writable = 0; pbuf->m_offset = 0; pbuf->m_lastoffset = 0; } #ifdef HAVE_PULSE_1_0 if (pbuf->format) { pa_format_info_free (pbuf->format); pbuf->format = NULL; pbuf->channels = 0; pbuf->is_pcm = FALSE; } #endif pa_stream_disconnect (pbuf->stream); /* Make sure we don't get any further callbacks */ pa_stream_set_state_callback (pbuf->stream, NULL, NULL); pa_stream_set_write_callback (pbuf->stream, NULL, NULL); pa_stream_set_underflow_callback (pbuf->stream, NULL, NULL); pa_stream_set_overflow_callback (pbuf->stream, NULL, NULL); pa_stream_unref (pbuf->stream); pbuf->stream = NULL; } g_free (pbuf->stream_name); pbuf->stream_name = NULL; } static void gst_pulsering_destroy_context (GstPulseRingBuffer * pbuf) { g_mutex_lock (pa_shared_resource_mutex); GST_DEBUG_OBJECT (pbuf, "destroying ringbuffer %p", pbuf); gst_pulsering_destroy_stream (pbuf); if (pbuf->context) { pa_context_unref (pbuf->context); pbuf->context = NULL; } if (pbuf->context_name) { GstPulseContext *pctx; pctx = g_hash_table_lookup (gst_pulse_shared_contexts, pbuf->context_name); GST_DEBUG_OBJECT (pbuf, "releasing context with name %s, pbuf=%p, pctx=%p", pbuf->context_name, pbuf, pctx); if (pctx) { pctx->ring_buffers = g_slist_remove (pctx->ring_buffers, pbuf); if (pctx->ring_buffers == NULL) { GST_DEBUG_OBJECT (pbuf, "destroying final context with name %s, pbuf=%p, pctx=%p", pbuf->context_name, pbuf, pctx); pa_context_disconnect (pctx->context); /* Make sure we don't get any further callbacks */ pa_context_set_state_callback (pctx->context, NULL, NULL); pa_context_set_subscribe_callback (pctx->context, NULL, NULL); g_hash_table_remove (gst_pulse_shared_contexts, pbuf->context_name); pa_context_unref (pctx->context); g_slice_free (GstPulseContext, pctx); } } g_free (pbuf->context_name); pbuf->context_name = NULL; } g_mutex_unlock (pa_shared_resource_mutex); } static void gst_pulseringbuffer_finalize (GObject * object) { GstPulseRingBuffer *ringbuffer; ringbuffer = GST_PULSERING_BUFFER_CAST (object); gst_pulsering_destroy_context (ringbuffer); G_OBJECT_CLASS (ring_parent_class)->finalize (object); } #define CONTEXT_OK(c) ((c) && PA_CONTEXT_IS_GOOD (pa_context_get_state ((c)))) #define STREAM_OK(s) ((s) && PA_STREAM_IS_GOOD (pa_stream_get_state ((s)))) static gboolean gst_pulsering_is_dead (GstPulseSink * psink, GstPulseRingBuffer * pbuf, gboolean check_stream) { if (!CONTEXT_OK (pbuf->context)) goto error; if (check_stream && !STREAM_OK (pbuf->stream)) goto error; return FALSE; error: { const gchar *err_str = pbuf->context ? pa_strerror (pa_context_errno (pbuf->context)) : NULL; GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Disconnected: %s", err_str), (NULL)); return TRUE; } } static void gst_pulsering_context_state_cb (pa_context * c, void *userdata) { pa_context_state_t state; pa_threaded_mainloop *mainloop = (pa_threaded_mainloop *) userdata; state = pa_context_get_state (c); GST_LOG ("got new context state %d", state); switch (state) { case PA_CONTEXT_READY: case PA_CONTEXT_TERMINATED: case PA_CONTEXT_FAILED: GST_LOG ("signaling"); pa_threaded_mainloop_signal (mainloop, 0); break; case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; } } static void gst_pulsering_context_subscribe_cb (pa_context * c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { GstPulseSink *psink; GstPulseContext *pctx = (GstPulseContext *) userdata; GSList *walk; if (t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE) && t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_NEW)) return; for (walk = pctx->ring_buffers; walk; walk = g_slist_next (walk)) { GstPulseRingBuffer *pbuf = (GstPulseRingBuffer *) walk->data; psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); GST_LOG_OBJECT (psink, "type %d, idx %u", t, idx); if (!pbuf->stream) continue; if (idx != pa_stream_get_index (pbuf->stream)) continue; #ifdef HAVE_PULSE_1_0 if (psink->device && pbuf->is_pcm && !g_str_equal (psink->device, pa_stream_get_device_name (pbuf->stream))) { /* Underlying sink changed. And this is not a passthrough stream. Let's * see if someone upstream wants to try to renegotiate. */ GstEvent *renego; g_free (psink->device); psink->device = g_strdup (pa_stream_get_device_name (pbuf->stream)); GST_INFO_OBJECT (psink, "emitting sink-changed"); renego = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, gst_structure_new ("pulse-sink-changed", NULL)); if (!gst_pad_push_event (GST_BASE_SINK (psink)->sinkpad, renego)) GST_DEBUG_OBJECT (psink, "Emitted sink-changed - nobody was listening"); } #endif /* Actually this event is also triggered when other properties of * the stream change that are unrelated to the volume. However it is * probably cheaper to signal the change here and check for the * volume when the GObject property is read instead of querying it always. */ /* inform streaming thread to notify */ g_atomic_int_compare_and_exchange (&psink->notify, 0, 1); } } /* will be called when the device should be opened. In this case we will connect * to the server. We should not try to open any streams in this state. */ static gboolean gst_pulseringbuffer_open_device (GstRingBuffer * buf) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; GstPulseContext *pctx; pa_mainloop_api *api; gboolean need_unlock_shared; psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf)); pbuf = GST_PULSERING_BUFFER_CAST (buf); g_assert (!pbuf->stream); g_assert (psink->client_name); if (psink->server) pbuf->context_name = g_strdup_printf ("%s@%s", psink->client_name, psink->server); else pbuf->context_name = g_strdup (psink->client_name); pa_threaded_mainloop_lock (mainloop); g_mutex_lock (pa_shared_resource_mutex); need_unlock_shared = TRUE; pctx = g_hash_table_lookup (gst_pulse_shared_contexts, pbuf->context_name); if (pctx == NULL) { pctx = g_slice_new0 (GstPulseContext); /* get the mainloop api and create a context */ GST_INFO_OBJECT (psink, "new context with name %s, pbuf=%p, pctx=%p", pbuf->context_name, pbuf, pctx); api = pa_threaded_mainloop_get_api (mainloop); if (!(pctx->context = pa_context_new (api, pbuf->context_name))) goto create_failed; pctx->ring_buffers = g_slist_prepend (pctx->ring_buffers, pbuf); g_hash_table_insert (gst_pulse_shared_contexts, g_strdup (pbuf->context_name), (gpointer) pctx); /* register some essential callbacks */ pa_context_set_state_callback (pctx->context, gst_pulsering_context_state_cb, mainloop); pa_context_set_subscribe_callback (pctx->context, gst_pulsering_context_subscribe_cb, pctx); /* try to connect to the server and wait for completion, we don't want to * autospawn a deamon */ GST_LOG_OBJECT (psink, "connect to server %s", GST_STR_NULL (psink->server)); if (pa_context_connect (pctx->context, psink->server, PA_CONTEXT_NOAUTOSPAWN, NULL) < 0) goto connect_failed; } else { GST_INFO_OBJECT (psink, "reusing shared context with name %s, pbuf=%p, pctx=%p", pbuf->context_name, pbuf, pctx); pctx->ring_buffers = g_slist_prepend (pctx->ring_buffers, pbuf); } g_mutex_unlock (pa_shared_resource_mutex); need_unlock_shared = FALSE; /* context created or shared okay */ pbuf->context = pa_context_ref (pctx->context); for (;;) { pa_context_state_t state; state = pa_context_get_state (pbuf->context); GST_LOG_OBJECT (psink, "context state is now %d", state); if (!PA_CONTEXT_IS_GOOD (state)) goto connect_failed; if (state == PA_CONTEXT_READY) break; /* Wait until the context is ready */ GST_LOG_OBJECT (psink, "waiting.."); pa_threaded_mainloop_wait (mainloop); } GST_LOG_OBJECT (psink, "opened the device"); pa_threaded_mainloop_unlock (mainloop); return TRUE; /* ERRORS */ unlock_and_fail: { if (need_unlock_shared) g_mutex_unlock (pa_shared_resource_mutex); gst_pulsering_destroy_context (pbuf); pa_threaded_mainloop_unlock (mainloop); return FALSE; } create_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Failed to create context"), (NULL)); g_slice_free (GstPulseContext, pctx); goto unlock_and_fail; } connect_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Failed to connect: %s", pa_strerror (pa_context_errno (pctx->context))), (NULL)); goto unlock_and_fail; } } /* close the device */ static gboolean gst_pulseringbuffer_close_device (GstRingBuffer * buf) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (buf); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf)); GST_LOG_OBJECT (psink, "closing device"); pa_threaded_mainloop_lock (mainloop); gst_pulsering_destroy_context (pbuf); pa_threaded_mainloop_unlock (mainloop); GST_LOG_OBJECT (psink, "closed device"); return TRUE; } static void gst_pulsering_stream_state_cb (pa_stream * s, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pa_stream_state_t state; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); state = pa_stream_get_state (s); GST_LOG_OBJECT (psink, "got new stream state %d", state); switch (state) { case PA_STREAM_READY: case PA_STREAM_FAILED: case PA_STREAM_TERMINATED: GST_LOG_OBJECT (psink, "signaling"); pa_threaded_mainloop_signal (mainloop, 0); break; case PA_STREAM_UNCONNECTED: case PA_STREAM_CREATING: break; } } static void gst_pulsering_stream_request_cb (pa_stream * s, size_t length, void *userdata) { GstPulseSink *psink; GstRingBuffer *rbuf; GstPulseRingBuffer *pbuf; rbuf = GST_RING_BUFFER_CAST (userdata); pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); GST_LOG_OBJECT (psink, "got request for length %" G_GSIZE_FORMAT, length); if (pbuf->in_commit && (length >= rbuf->spec.segsize)) { /* only signal when we are waiting in the commit thread * and got request for atleast a segment */ pa_threaded_mainloop_signal (mainloop, 0); } } static void gst_pulsering_stream_underflow_cb (pa_stream * s, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); GST_WARNING_OBJECT (psink, "Got underflow"); } static void gst_pulsering_stream_overflow_cb (pa_stream * s, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); GST_WARNING_OBJECT (psink, "Got overflow"); } static void gst_pulsering_stream_latency_cb (pa_stream * s, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; const pa_timing_info *info; pa_usec_t sink_usec; info = pa_stream_get_timing_info (s); pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); if (!info) { GST_LOG_OBJECT (psink, "latency update (information unknown)"); return; } sink_usec = info->configured_sink_usec; GST_LOG_OBJECT (psink, "latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT, GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt, info->write_index, info->read_index_corrupt, info->read_index, info->sink_usec, sink_usec); } static void gst_pulsering_stream_suspended_cb (pa_stream * p, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); if (pa_stream_is_suspended (p)) GST_DEBUG_OBJECT (psink, "stream suspended"); else GST_DEBUG_OBJECT (psink, "stream resumed"); } static void gst_pulsering_stream_started_cb (pa_stream * p, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); GST_DEBUG_OBJECT (psink, "stream started"); } static void gst_pulsering_stream_event_cb (pa_stream * p, const char *name, pa_proplist * pl, void *userdata) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); if (!strcmp (name, PA_STREAM_EVENT_REQUEST_CORK)) { /* the stream wants to PAUSE, post a message for the application. */ GST_DEBUG_OBJECT (psink, "got request for CORK"); gst_element_post_message (GST_ELEMENT_CAST (psink), gst_message_new_request_state (GST_OBJECT_CAST (psink), GST_STATE_PAUSED)); } else if (!strcmp (name, PA_STREAM_EVENT_REQUEST_UNCORK)) { GST_DEBUG_OBJECT (psink, "got request for UNCORK"); gst_element_post_message (GST_ELEMENT_CAST (psink), gst_message_new_request_state (GST_OBJECT_CAST (psink), GST_STATE_PLAYING)); #ifdef HAVE_PULSE_1_0 } else if (!strcmp (name, PA_STREAM_EVENT_FORMAT_LOST)) { GstEvent *renego; if (g_atomic_int_get (&psink->format_lost)) { /* Duplicate event before we're done reconfiguring, discard */ return; } GST_DEBUG_OBJECT (psink, "got FORMAT LOST"); g_atomic_int_set (&psink->format_lost, 1); psink->format_lost_time = g_ascii_strtoull (pa_proplist_gets (pl, "stream-time"), NULL, 0) * 1000; g_free (psink->device); psink->device = g_strdup (pa_proplist_gets (pl, "device")); renego = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, gst_structure_new ("pulse-format-lost", NULL)); if (!gst_pad_push_event (GST_BASE_SINK (psink)->sinkpad, renego)) { /* Nobody handled the format change - emit an error */ GST_ELEMENT_ERROR (psink, STREAM, FORMAT, ("Sink format changed"), ("Sink format changed")); } #endif } else { GST_DEBUG_OBJECT (psink, "got unknown event %s", name); } } /* Called with the mainloop locked */ static gboolean gst_pulsering_wait_for_stream_ready (GstPulseSink * psink, pa_stream * stream) { pa_stream_state_t state; for (;;) { state = pa_stream_get_state (stream); GST_LOG_OBJECT (psink, "stream state is now %d", state); if (!PA_STREAM_IS_GOOD (state)) return FALSE; if (state == PA_STREAM_READY) return TRUE; /* Wait until the stream is ready */ pa_threaded_mainloop_wait (mainloop); } } /* This method should create a new stream of the given @spec. No playback should * start yet so we start in the corked state. */ static gboolean gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pa_buffer_attr wanted; const pa_buffer_attr *actual; pa_channel_map channel_map; pa_operation *o = NULL; #ifdef HAVE_PULSE_0_9_20 pa_cvolume v; #endif pa_cvolume *pv = NULL; pa_stream_flags_t flags; const gchar *name; GstAudioClock *clock; #ifdef HAVE_PULSE_1_0 pa_format_info *formats[1]; #ifndef GST_DISABLE_GST_DEBUG gchar print_buf[PA_FORMAT_INFO_SNPRINT_MAX]; #endif #endif psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf)); pbuf = GST_PULSERING_BUFFER_CAST (buf); GST_LOG_OBJECT (psink, "creating sample spec"); /* convert the gstreamer sample spec to the pulseaudio format */ #ifdef HAVE_PULSE_1_0 if (!gst_pulse_fill_format_info (spec, &pbuf->format, &pbuf->channels)) goto invalid_spec; pbuf->is_pcm = pa_format_info_is_pcm (pbuf->format); #else if (!gst_pulse_fill_sample_spec (spec, &pbuf->sample_spec)) goto invalid_spec; #endif pa_threaded_mainloop_lock (mainloop); /* we need a context and a no stream */ g_assert (pbuf->context); g_assert (!pbuf->stream); /* enable event notifications */ GST_LOG_OBJECT (psink, "subscribing to context events"); if (!(o = pa_context_subscribe (pbuf->context, PA_SUBSCRIPTION_MASK_SINK_INPUT, NULL, NULL))) goto subscribe_failed; pa_operation_unref (o); /* initialize the channel map */ #ifdef HAVE_PULSE_1_0 if (pbuf->is_pcm && gst_pulse_gst_to_channel_map (&channel_map, spec)) pa_format_info_set_channel_map (pbuf->format, &channel_map); #else gst_pulse_gst_to_channel_map (&channel_map, spec); #endif /* find a good name for the stream */ if (psink->stream_name) name = psink->stream_name; else name = "Playback Stream"; /* create a stream */ #ifdef HAVE_PULSE_1_0 formats[0] = pbuf->format; if (!(pbuf->stream = pa_stream_new_extended (pbuf->context, name, formats, 1, psink->proplist))) goto stream_failed; #else GST_LOG_OBJECT (psink, "creating stream with name %s", name); if (!(pbuf->stream = pa_stream_new_with_proplist (pbuf->context, name, &pbuf->sample_spec, &channel_map, psink->proplist))) goto stream_failed; #endif /* install essential callbacks */ pa_stream_set_state_callback (pbuf->stream, gst_pulsering_stream_state_cb, pbuf); pa_stream_set_write_callback (pbuf->stream, gst_pulsering_stream_request_cb, pbuf); pa_stream_set_underflow_callback (pbuf->stream, gst_pulsering_stream_underflow_cb, pbuf); pa_stream_set_overflow_callback (pbuf->stream, gst_pulsering_stream_overflow_cb, pbuf); pa_stream_set_latency_update_callback (pbuf->stream, gst_pulsering_stream_latency_cb, pbuf); pa_stream_set_suspended_callback (pbuf->stream, gst_pulsering_stream_suspended_cb, pbuf); pa_stream_set_started_callback (pbuf->stream, gst_pulsering_stream_started_cb, pbuf); pa_stream_set_event_callback (pbuf->stream, gst_pulsering_stream_event_cb, pbuf); /* buffering requirements. When setting prebuf to 0, the stream will not pause * when we cause an underrun, which causes time to continue. */ memset (&wanted, 0, sizeof (wanted)); wanted.tlength = spec->segtotal * spec->segsize; wanted.maxlength = -1; wanted.prebuf = 0; wanted.minreq = spec->segsize; GST_INFO_OBJECT (psink, "tlength: %d", wanted.tlength); GST_INFO_OBJECT (psink, "maxlength: %d", wanted.maxlength); GST_INFO_OBJECT (psink, "prebuf: %d", wanted.prebuf); GST_INFO_OBJECT (psink, "minreq: %d", wanted.minreq); #ifdef HAVE_PULSE_0_9_20 /* configure volume when we changed it, else we leave the default */ if (psink->volume_set) { GST_LOG_OBJECT (psink, "have volume of %f", psink->volume); pv = &v; #ifdef HAVE_PULSE_1_0 if (pbuf->is_pcm) gst_pulse_cvolume_from_linear (pv, pbuf->channels, psink->volume); else { GST_DEBUG_OBJECT (psink, "passthrough stream, not setting volume"); pv = NULL; } #else gst_pulse_cvolume_from_linear (pv, pbuf->sample_spec.channels, psink->volume); #endif } else { pv = NULL; } #endif /* construct the flags */ flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED; if (psink->mute_set && psink->mute) flags |= PA_STREAM_START_MUTED; /* we always start corked (see flags above) */ pbuf->corked = TRUE; /* try to connect now */ GST_LOG_OBJECT (psink, "connect for playback to device %s", GST_STR_NULL (psink->device)); if (pa_stream_connect_playback (pbuf->stream, psink->device, &wanted, flags, pv, NULL) < 0) goto connect_failed; /* our clock will now start from 0 again */ clock = GST_AUDIO_CLOCK (GST_BASE_AUDIO_SINK (psink)->provided_clock); gst_audio_clock_reset (clock, 0); if (!gst_pulsering_wait_for_stream_ready (psink, pbuf->stream)) goto connect_failed; #ifdef HAVE_PULSE_1_0 g_free (psink->device); psink->device = g_strdup (pa_stream_get_device_name (pbuf->stream)); #ifndef GST_DISABLE_GST_DEBUG pa_format_info_snprint (print_buf, sizeof (print_buf), pa_stream_get_format_info (pbuf->stream)); GST_INFO_OBJECT (psink, "negotiated to: %s", print_buf); #endif #endif /* After we passed the volume off of to PA we never want to set it again, since it is PA's job to save/restore volumes. */ psink->volume_set = psink->mute_set = FALSE; GST_LOG_OBJECT (psink, "stream is acquired now"); /* get the actual buffering properties now */ actual = pa_stream_get_buffer_attr (pbuf->stream); GST_INFO_OBJECT (psink, "tlength: %d (wanted: %d)", actual->tlength, wanted.tlength); GST_INFO_OBJECT (psink, "maxlength: %d", actual->maxlength); GST_INFO_OBJECT (psink, "prebuf: %d", actual->prebuf); GST_INFO_OBJECT (psink, "minreq: %d (wanted %d)", actual->minreq, wanted.minreq); spec->segsize = actual->minreq; spec->segtotal = actual->tlength / spec->segsize; pa_threaded_mainloop_unlock (mainloop); return TRUE; /* ERRORS */ unlock_and_fail: { gst_pulsering_destroy_stream (pbuf); pa_threaded_mainloop_unlock (mainloop); return FALSE; } invalid_spec: { GST_ELEMENT_ERROR (psink, RESOURCE, SETTINGS, ("Invalid sample specification."), (NULL)); return FALSE; } subscribe_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_context_subscribe() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock_and_fail; } stream_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Failed to create stream: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock_and_fail; } connect_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Failed to connect stream: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock_and_fail; } } /* free the stream that we acquired before */ static gboolean gst_pulseringbuffer_release (GstRingBuffer * buf) { GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (buf); pa_threaded_mainloop_lock (mainloop); gst_pulsering_destroy_stream (pbuf); pa_threaded_mainloop_unlock (mainloop); #ifdef HAVE_PULSE_1_0 { GstPulseSink *psink; psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); g_atomic_int_set (&psink->format_lost, FALSE); psink->format_lost_time = GST_CLOCK_TIME_NONE; } #endif return TRUE; } static void gst_pulsering_success_cb (pa_stream * s, int success, void *userdata) { pa_threaded_mainloop_signal (mainloop, 0); } /* update the corked state of a stream, must be called with the mainloop * lock */ static gboolean gst_pulsering_set_corked (GstPulseRingBuffer * pbuf, gboolean corked, gboolean wait) { pa_operation *o = NULL; GstPulseSink *psink; gboolean res = FALSE; psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); #ifdef HAVE_PULSE_1_0 if (g_atomic_int_get (&psink->format_lost)) { /* Sink format changed, stream's gone so fake being paused */ return TRUE; } #endif GST_DEBUG_OBJECT (psink, "setting corked state to %d", corked); if (pbuf->corked != corked) { if (!(o = pa_stream_cork (pbuf->stream, corked, gst_pulsering_success_cb, pbuf))) goto cork_failed; while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto server_dead; } pbuf->corked = corked; } else { GST_DEBUG_OBJECT (psink, "skipping, already in requested state"); } res = TRUE; cleanup: if (o) pa_operation_unref (o); return res; /* ERRORS */ server_dead: { GST_DEBUG_OBJECT (psink, "the server is dead"); goto cleanup; } cork_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_cork() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto cleanup; } } static void gst_pulseringbuffer_clear (GstRingBuffer * buf) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pa_operation *o = NULL; pbuf = GST_PULSERING_BUFFER_CAST (buf); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); pa_threaded_mainloop_lock (mainloop); GST_DEBUG_OBJECT (psink, "clearing"); if (pbuf->stream) { /* don't wait for the flush to complete */ if ((o = pa_stream_flush (pbuf->stream, NULL, pbuf))) pa_operation_unref (o); } pa_threaded_mainloop_unlock (mainloop); } /* called from pulse with the mainloop lock */ static void mainloop_enter_defer_cb (pa_mainloop_api * api, void *userdata) { GstPulseSink *pulsesink = GST_PULSESINK (userdata); GstMessage *message; GValue val = { 0 }; g_value_init (&val, G_TYPE_POINTER); g_value_set_pointer (&val, g_thread_self ()); GST_DEBUG_OBJECT (pulsesink, "posting ENTER stream status"); message = gst_message_new_stream_status (GST_OBJECT (pulsesink), GST_STREAM_STATUS_TYPE_ENTER, GST_ELEMENT (pulsesink)); gst_message_set_stream_status_object (message, &val); gst_element_post_message (GST_ELEMENT (pulsesink), message); g_return_if_fail (pulsesink->defer_pending); pulsesink->defer_pending--; pa_threaded_mainloop_signal (mainloop, 0); } /* start/resume playback ASAP, we don't uncork here but in the commit method */ static gboolean gst_pulseringbuffer_start (GstRingBuffer * buf) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pbuf = GST_PULSERING_BUFFER_CAST (buf); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); pa_threaded_mainloop_lock (mainloop); GST_DEBUG_OBJECT (psink, "scheduling stream status"); psink->defer_pending++; pa_mainloop_api_once (pa_threaded_mainloop_get_api (mainloop), mainloop_enter_defer_cb, psink); GST_DEBUG_OBJECT (psink, "starting"); pbuf->paused = FALSE; /* EOS needs running clock */ if (GST_BASE_SINK_CAST (psink)->eos || g_atomic_int_get (&GST_BASE_AUDIO_SINK (psink)->abidata. ABI.eos_rendering)) gst_pulsering_set_corked (pbuf, FALSE, FALSE); pa_threaded_mainloop_unlock (mainloop); return TRUE; } /* pause/stop playback ASAP */ static gboolean gst_pulseringbuffer_pause (GstRingBuffer * buf) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; gboolean res; pbuf = GST_PULSERING_BUFFER_CAST (buf); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); pa_threaded_mainloop_lock (mainloop); GST_DEBUG_OBJECT (psink, "pausing and corking"); /* make sure the commit method stops writing */ pbuf->paused = TRUE; res = gst_pulsering_set_corked (pbuf, TRUE, TRUE); if (pbuf->in_commit) { /* we are waiting in a commit, signal */ GST_DEBUG_OBJECT (psink, "signal commit"); pa_threaded_mainloop_signal (mainloop, 0); } pa_threaded_mainloop_unlock (mainloop); return res; } /* called from pulse with the mainloop lock */ static void mainloop_leave_defer_cb (pa_mainloop_api * api, void *userdata) { GstPulseSink *pulsesink = GST_PULSESINK (userdata); GstMessage *message; GValue val = { 0 }; g_value_init (&val, G_TYPE_POINTER); g_value_set_pointer (&val, g_thread_self ()); GST_DEBUG_OBJECT (pulsesink, "posting LEAVE stream status"); message = gst_message_new_stream_status (GST_OBJECT (pulsesink), GST_STREAM_STATUS_TYPE_LEAVE, GST_ELEMENT (pulsesink)); gst_message_set_stream_status_object (message, &val); gst_element_post_message (GST_ELEMENT (pulsesink), message); g_return_if_fail (pulsesink->defer_pending); pulsesink->defer_pending--; pa_threaded_mainloop_signal (mainloop, 0); } /* stop playback, we flush everything. */ static gboolean gst_pulseringbuffer_stop (GstRingBuffer * buf) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; gboolean res = FALSE; pa_operation *o = NULL; pbuf = GST_PULSERING_BUFFER_CAST (buf); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); pa_threaded_mainloop_lock (mainloop); pbuf->paused = TRUE; res = gst_pulsering_set_corked (pbuf, TRUE, TRUE); /* Inform anyone waiting in _commit() call that it shall wakeup */ if (pbuf->in_commit) { GST_DEBUG_OBJECT (psink, "signal commit thread"); pa_threaded_mainloop_signal (mainloop, 0); } #ifdef HAVE_PULSE_1_0 if (g_atomic_int_get (&psink->format_lost)) { /* Don't try to flush, the stream's probably gone by now */ res = TRUE; goto cleanup; } #endif /* then try to flush, it's not fatal when this fails */ GST_DEBUG_OBJECT (psink, "flushing"); if ((o = pa_stream_flush (pbuf->stream, gst_pulsering_success_cb, pbuf))) { while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { GST_DEBUG_OBJECT (psink, "wait for completion"); pa_threaded_mainloop_wait (mainloop); if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto server_dead; } GST_DEBUG_OBJECT (psink, "flush completed"); } res = TRUE; cleanup: if (o) { pa_operation_cancel (o); pa_operation_unref (o); } GST_DEBUG_OBJECT (psink, "scheduling stream status"); psink->defer_pending++; pa_mainloop_api_once (pa_threaded_mainloop_get_api (mainloop), mainloop_leave_defer_cb, psink); pa_threaded_mainloop_unlock (mainloop); return res; /* ERRORS */ server_dead: { GST_DEBUG_OBJECT (psink, "the server is dead"); goto cleanup; } } /* in_samples >= out_samples, rate > 1.0 */ #define FWD_UP_SAMPLES(s,se,d,de) \ G_STMT_START { \ guint8 *sb = s, *db = d; \ while (s <= se && d < de) { \ memcpy (d, s, bps); \ s += bps; \ *accum += outr; \ if ((*accum << 1) >= inr) { \ *accum -= inr; \ d += bps; \ } \ } \ in_samples -= (s - sb)/bps; \ out_samples -= (d - db)/bps; \ GST_DEBUG ("fwd_up end %d/%d",*accum,*toprocess); \ } G_STMT_END /* out_samples > in_samples, for rates smaller than 1.0 */ #define FWD_DOWN_SAMPLES(s,se,d,de) \ G_STMT_START { \ guint8 *sb = s, *db = d; \ while (s <= se && d < de) { \ memcpy (d, s, bps); \ d += bps; \ *accum += inr; \ if ((*accum << 1) >= outr) { \ *accum -= outr; \ s += bps; \ } \ } \ in_samples -= (s - sb)/bps; \ out_samples -= (d - db)/bps; \ GST_DEBUG ("fwd_down end %d/%d",*accum,*toprocess); \ } G_STMT_END #define REV_UP_SAMPLES(s,se,d,de) \ G_STMT_START { \ guint8 *sb = se, *db = d; \ while (s <= se && d < de) { \ memcpy (d, se, bps); \ se -= bps; \ *accum += outr; \ while (d < de && (*accum << 1) >= inr) { \ *accum -= inr; \ d += bps; \ } \ } \ in_samples -= (sb - se)/bps; \ out_samples -= (d - db)/bps; \ GST_DEBUG ("rev_up end %d/%d",*accum,*toprocess); \ } G_STMT_END #define REV_DOWN_SAMPLES(s,se,d,de) \ G_STMT_START { \ guint8 *sb = se, *db = d; \ while (s <= se && d < de) { \ memcpy (d, se, bps); \ d += bps; \ *accum += inr; \ while (s <= se && (*accum << 1) >= outr) { \ *accum -= outr; \ se -= bps; \ } \ } \ in_samples -= (sb - se)/bps; \ out_samples -= (d - db)/bps; \ GST_DEBUG ("rev_down end %d/%d",*accum,*toprocess); \ } G_STMT_END /* our custom commit function because we write into the buffer of pulseaudio * instead of keeping our own buffer */ static guint gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample, guchar * data, gint in_samples, gint out_samples, gint * accum) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; guint result; guint8 *data_end; gboolean reverse; gint *toprocess; gint inr, outr, bps; gint64 offset; guint bufsize; pbuf = GST_PULSERING_BUFFER_CAST (buf); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); /* FIXME post message rather than using a signal (as mixer interface) */ if (g_atomic_int_compare_and_exchange (&psink->notify, 1, 0)) { g_object_notify (G_OBJECT (psink), "volume"); g_object_notify (G_OBJECT (psink), "mute"); } /* make sure the ringbuffer is started */ if (G_UNLIKELY (g_atomic_int_get (&buf->state) != GST_RING_BUFFER_STATE_STARTED)) { /* see if we are allowed to start it */ if (G_UNLIKELY (g_atomic_int_get (&buf->abidata.ABI.may_start) == FALSE)) goto no_start; GST_DEBUG_OBJECT (buf, "start!"); if (!gst_ring_buffer_start (buf)) goto start_failed; } pa_threaded_mainloop_lock (mainloop); GST_DEBUG_OBJECT (psink, "entering commit"); pbuf->in_commit = TRUE; bps = buf->spec.bytes_per_sample; bufsize = buf->spec.segsize * buf->spec.segtotal; /* our toy resampler for trick modes */ reverse = out_samples < 0; out_samples = ABS (out_samples); if (in_samples >= out_samples) toprocess = &in_samples; else toprocess = &out_samples; inr = in_samples - 1; outr = out_samples - 1; GST_DEBUG_OBJECT (psink, "in %d, out %d", inr, outr); /* data_end points to the last sample we have to write, not past it. This is * needed to properly handle reverse playback: it points to the last sample. */ data_end = data + (bps * inr); #ifdef HAVE_PULSE_1_0 if (g_atomic_int_get (&psink->format_lost)) { /* Sink format changed, drop the data and hope upstream renegotiates */ goto fake_done; } #endif if (pbuf->paused) goto was_paused; /* offset is in bytes */ offset = *sample * bps; while (*toprocess > 0) { size_t avail; guint towrite; GST_LOG_OBJECT (psink, "need to write %d samples at offset %" G_GINT64_FORMAT, *toprocess, offset); if (offset != pbuf->m_lastoffset) GST_LOG_OBJECT (psink, "discontinuity, offset is %" G_GINT64_FORMAT ", " "last offset was %" G_GINT64_FORMAT, offset, pbuf->m_lastoffset); towrite = out_samples * bps; /* Wait for at least segsize bytes to become available */ if (towrite > buf->spec.segsize) towrite = buf->spec.segsize; if ((pbuf->m_writable < towrite) || (offset != pbuf->m_lastoffset)) { /* if no room left or discontinuity in offset, we need to flush data and get a new buffer */ /* flush the buffer if possible */ if ((pbuf->m_data != NULL) && (pbuf->m_towrite > 0)) { GST_LOG_OBJECT (psink, "flushing %u samples at offset %" G_GINT64_FORMAT, (guint) pbuf->m_towrite / bps, pbuf->m_offset); if (pa_stream_write (pbuf->stream, (uint8_t *) pbuf->m_data, pbuf->m_towrite, NULL, pbuf->m_offset, PA_SEEK_ABSOLUTE) < 0) { goto write_failed; } } pbuf->m_towrite = 0; pbuf->m_offset = offset; /* keep track of current offset */ /* get a buffer to write in for now on */ for (;;) { pbuf->m_writable = pa_stream_writable_size (pbuf->stream); #ifdef HAVE_PULSE_1_0 if (g_atomic_int_get (&psink->format_lost)) { /* Sink format changed, give up and hope upstream renegotiates */ goto fake_done; } #endif if (pbuf->m_writable == (size_t) - 1) goto writable_size_failed; pbuf->m_writable /= bps; pbuf->m_writable *= bps; /* handle only complete samples */ if (pbuf->m_writable >= towrite) break; /* see if we need to uncork because we have no free space */ if (pbuf->corked) { if (!gst_pulsering_set_corked (pbuf, FALSE, FALSE)) goto uncork_failed; } /* we can't write segsize bytes, wait a bit */ GST_LOG_OBJECT (psink, "waiting for free space"); pa_threaded_mainloop_wait (mainloop); if (pbuf->paused) goto was_paused; } /* Recalculate what we can write in the next chunk */ towrite = out_samples * bps; if (pbuf->m_writable > towrite) pbuf->m_writable = towrite; GST_LOG_OBJECT (psink, "requesting %" G_GSIZE_FORMAT " bytes of " "shared memory", pbuf->m_writable); if (pa_stream_begin_write (pbuf->stream, &pbuf->m_data, &pbuf->m_writable) < 0) { GST_LOG_OBJECT (psink, "pa_stream_begin_write() failed"); goto writable_size_failed; } GST_LOG_OBJECT (psink, "got %" G_GSIZE_FORMAT " bytes of shared memory", pbuf->m_writable); } if (towrite > pbuf->m_writable) towrite = pbuf->m_writable; avail = towrite / bps; GST_LOG_OBJECT (psink, "writing %u samples at offset %" G_GUINT64_FORMAT, (guint) avail, offset); #ifdef HAVE_PULSE_1_0 /* No trick modes for passthrough streams */ if (G_UNLIKELY (!pbuf->is_pcm && (inr != outr || reverse))) { GST_WARNING_OBJECT (psink, "Passthrough stream can't run in trick mode"); goto unlock_and_fail; } #endif if (G_LIKELY (inr == outr && !reverse)) { /* no rate conversion, simply write out the samples */ /* copy the data into internal buffer */ memcpy ((guint8 *) pbuf->m_data + pbuf->m_towrite, data, towrite); pbuf->m_towrite += towrite; pbuf->m_writable -= towrite; data += towrite; in_samples -= avail; out_samples -= avail; } else { guint8 *dest, *d, *d_end; /* write into the PulseAudio shm buffer */ dest = d = (guint8 *) pbuf->m_data + pbuf->m_towrite; d_end = d + towrite; if (!reverse) { if (inr >= outr) /* forward speed up */ FWD_UP_SAMPLES (data, data_end, d, d_end); else /* forward slow down */ FWD_DOWN_SAMPLES (data, data_end, d, d_end); } else { if (inr >= outr) /* reverse speed up */ REV_UP_SAMPLES (data, data_end, d, d_end); else /* reverse slow down */ REV_DOWN_SAMPLES (data, data_end, d, d_end); } /* see what we have left to write */ towrite = (d - dest); pbuf->m_towrite += towrite; pbuf->m_writable -= towrite; avail = towrite / bps; } /* flush the buffer if it's full */ if ((pbuf->m_data != NULL) && (pbuf->m_towrite > 0) && (pbuf->m_writable == 0)) { GST_LOG_OBJECT (psink, "flushing %u samples at offset %" G_GINT64_FORMAT, (guint) pbuf->m_towrite / bps, pbuf->m_offset); if (pa_stream_write (pbuf->stream, (uint8_t *) pbuf->m_data, pbuf->m_towrite, NULL, pbuf->m_offset, PA_SEEK_ABSOLUTE) < 0) { goto write_failed; } pbuf->m_towrite = 0; pbuf->m_offset = offset + towrite; /* keep track of current offset */ } *sample += avail; offset += avail * bps; pbuf->m_lastoffset = offset; /* check if we need to uncork after writing the samples */ if (pbuf->corked) { const pa_timing_info *info; if ((info = pa_stream_get_timing_info (pbuf->stream))) { GST_LOG_OBJECT (psink, "read_index at %" G_GUINT64_FORMAT ", offset %" G_GINT64_FORMAT, info->read_index, offset); /* we uncork when the read_index is too far behind the offset we need * to write to. */ if (info->read_index + bufsize <= offset) { if (!gst_pulsering_set_corked (pbuf, FALSE, FALSE)) goto uncork_failed; } } else { GST_LOG_OBJECT (psink, "no timing info available yet"); } } } #ifdef HAVE_PULSE_1_0 fake_done: #endif /* we consumed all samples here */ data = data_end + bps; pbuf->in_commit = FALSE; pa_threaded_mainloop_unlock (mainloop); done: result = inr - ((data_end - data) / bps); GST_LOG_OBJECT (psink, "wrote %d samples", result); return result; /* ERRORS */ unlock_and_fail: { pbuf->in_commit = FALSE; GST_LOG_OBJECT (psink, "we are reset"); pa_threaded_mainloop_unlock (mainloop); goto done; } no_start: { GST_LOG_OBJECT (psink, "we can not start"); return 0; } start_failed: { GST_LOG_OBJECT (psink, "failed to start the ringbuffer"); return 0; } uncork_failed: { pbuf->in_commit = FALSE; GST_ERROR_OBJECT (psink, "uncork failed"); pa_threaded_mainloop_unlock (mainloop); goto done; } was_paused: { pbuf->in_commit = FALSE; GST_LOG_OBJECT (psink, "we are paused"); pa_threaded_mainloop_unlock (mainloop); goto done; } writable_size_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_writable_size() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock_and_fail; } write_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_write() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock_and_fail; } } /* write pending local samples, must be called with the mainloop lock */ static void gst_pulsering_flush (GstPulseRingBuffer * pbuf) { GstPulseSink *psink; psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); GST_DEBUG_OBJECT (psink, "entering flush"); /* flush the buffer if possible */ if (pbuf->stream && (pbuf->m_data != NULL) && (pbuf->m_towrite > 0)) { #ifndef GST_DISABLE_GST_DEBUG gint bps; bps = (GST_RING_BUFFER_CAST (pbuf))->spec.bytes_per_sample; GST_LOG_OBJECT (psink, "flushing %u samples at offset %" G_GINT64_FORMAT, (guint) pbuf->m_towrite / bps, pbuf->m_offset); #endif if (pa_stream_write (pbuf->stream, (uint8_t *) pbuf->m_data, pbuf->m_towrite, NULL, pbuf->m_offset, PA_SEEK_ABSOLUTE) < 0) { goto write_failed; } pbuf->m_towrite = 0; pbuf->m_offset += pbuf->m_towrite; /* keep track of current offset */ } done: return; /* ERRORS */ write_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_write() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto done; } } static void gst_pulsesink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pulsesink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_pulsesink_finalize (GObject * object); static gboolean gst_pulsesink_event (GstBaseSink * sink, GstEvent * event); static GstStateChangeReturn gst_pulsesink_change_state (GstElement * element, GstStateChange transition); static void gst_pulsesink_init_interfaces (GType type); GST_IMPLEMENT_PULSEPROBE_METHODS (GstPulseSink, gst_pulsesink); #define _do_init(type) \ gst_pulsesink_init_contexts (); \ gst_pulsesink_init_interfaces (type); GST_BOILERPLATE_FULL (GstPulseSink, gst_pulsesink, GstBaseAudioSink, GST_TYPE_BASE_AUDIO_SINK, _do_init); static gboolean gst_pulsesink_interface_supported (GstImplementsInterface * iface, GType interface_type) { GstPulseSink *this = GST_PULSESINK_CAST (iface); if (interface_type == GST_TYPE_PROPERTY_PROBE && this->probe) return TRUE; if (interface_type == GST_TYPE_STREAM_VOLUME) return TRUE; return FALSE; } static void gst_pulsesink_implements_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_pulsesink_interface_supported; } static void gst_pulsesink_init_interfaces (GType type) { static const GInterfaceInfo implements_iface_info = { (GInterfaceInitFunc) gst_pulsesink_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo probe_iface_info = { (GInterfaceInitFunc) gst_pulsesink_property_probe_interface_init, NULL, NULL, }; static const GInterfaceInfo svol_iface_info = { NULL, NULL, NULL }; g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info); g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_iface_info); g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &probe_iface_info); } static void gst_pulsesink_base_init (gpointer g_class) { static GstStaticPadTemplate pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (PULSE_SINK_TEMPLATE_CAPS)); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "PulseAudio Audio Sink", "Sink/Audio", "Plays audio to a PulseAudio server", "Lennart Poettering"); gst_element_class_add_static_pad_template (element_class, &pad_template); } static GstRingBuffer * gst_pulsesink_create_ringbuffer (GstBaseAudioSink * sink) { GstRingBuffer *buffer; GST_DEBUG_OBJECT (sink, "creating ringbuffer"); buffer = g_object_new (GST_TYPE_PULSERING_BUFFER, NULL); GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer); return buffer; } static GstBuffer * gst_pulsesink_payload (GstBaseAudioSink * sink, GstBuffer * buf) { switch (sink->ringbuffer->spec.type) { case GST_BUFTYPE_AC3: case GST_BUFTYPE_EAC3: case GST_BUFTYPE_DTS: case GST_BUFTYPE_MPEG: { /* FIXME: alloc memory from PA if possible */ gint framesize = gst_audio_iec61937_frame_size (&sink->ringbuffer->spec); GstBuffer *out; if (framesize <= 0) return NULL; out = gst_buffer_new_and_alloc (framesize); if (!gst_audio_iec61937_payload (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), GST_BUFFER_DATA (out), GST_BUFFER_SIZE (out), &sink->ringbuffer->spec)) { gst_buffer_unref (out); return NULL; } gst_buffer_copy_metadata (out, buf, GST_BUFFER_COPY_ALL); return out; } default: return gst_buffer_ref (buf); } } static void gst_pulsesink_class_init (GstPulseSinkClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass); GstBaseSinkClass *bc; GstBaseAudioSinkClass *gstaudiosink_class = GST_BASE_AUDIO_SINK_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gchar *clientname; gobject_class->finalize = gst_pulsesink_finalize; gobject_class->set_property = gst_pulsesink_set_property; gobject_class->get_property = gst_pulsesink_get_property; gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_pulsesink_event); /* restore the original basesink pull methods */ bc = g_type_class_peek (GST_TYPE_BASE_SINK); gstbasesink_class->activate_pull = GST_DEBUG_FUNCPTR (bc->activate_pull); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_pulsesink_change_state); gstaudiosink_class->create_ringbuffer = GST_DEBUG_FUNCPTR (gst_pulsesink_create_ringbuffer); gstaudiosink_class->payload = GST_DEBUG_FUNCPTR (gst_pulsesink_payload); /* Overwrite GObject fields */ g_object_class_install_property (gobject_class, PROP_SERVER, g_param_spec_string ("server", "Server", "The PulseAudio server to connect to", DEFAULT_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "The PulseAudio sink device to connect to", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_VOLUME, g_param_spec_double ("volume", "Volume", "Linear volume of this stream, 1.0=100%", 0.0, MAX_VOLUME, DEFAULT_VOLUME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MUTE, g_param_spec_boolean ("mute", "Mute", "Mute state of this stream", DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstPulseSink:client * * The PulseAudio client name to use. * * Since: 0.10.25 */ clientname = gst_pulse_client_name (); g_object_class_install_property (gobject_class, PROP_CLIENT, g_param_spec_string ("client", "Client", "The PulseAudio client name to use", clientname, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY)); g_free (clientname); /** * GstPulseSink:stream-properties * * List of pulseaudio stream properties. A list of defined properties can be * found in the pulseaudio api docs. * * Below is an example for registering as a music application to pulseaudio. * |[ * GstStructure *props; * * props = gst_structure_from_string ("props,media.role=music", NULL); * g_object_set (pulse, "stream-properties", props, NULL); * gst_structure_free * ]| * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_STREAM_PROPERTIES, g_param_spec_boxed ("stream-properties", "stream properties", "list of pulseaudio stream properties", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } /* returns the current time of the sink ringbuffer */ static GstClockTime gst_pulsesink_get_time (GstClock * clock, GstBaseAudioSink * sink) { GstPulseSink *psink; GstPulseRingBuffer *pbuf; pa_usec_t time; if (!sink->ringbuffer || !sink->ringbuffer->acquired) return GST_CLOCK_TIME_NONE; pbuf = GST_PULSERING_BUFFER_CAST (sink->ringbuffer); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); #ifdef HAVE_PULSE_1_0 if (g_atomic_int_get (&psink->format_lost)) { /* Stream was lost in a format change, it'll get set up again once * upstream renegotiates */ return psink->format_lost_time; } #endif pa_threaded_mainloop_lock (mainloop); if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto server_dead; /* if we don't have enough data to get a timestamp, just return NONE, which * will return the last reported time */ if (pa_stream_get_time (pbuf->stream, &time) < 0) { GST_DEBUG_OBJECT (psink, "could not get time"); time = GST_CLOCK_TIME_NONE; } else time *= 1000; pa_threaded_mainloop_unlock (mainloop); GST_LOG_OBJECT (psink, "current time is %" GST_TIME_FORMAT, GST_TIME_ARGS (time)); return time; /* ERRORS */ server_dead: { GST_DEBUG_OBJECT (psink, "the server is dead"); pa_threaded_mainloop_unlock (mainloop); return GST_CLOCK_TIME_NONE; } } static void gst_pulsesink_sink_info_cb (pa_context * c, const pa_sink_info * i, int eol, void *userdata) { GstPulseRingBuffer *pbuf; GstPulseSink *psink; #ifdef HAVE_PULSE_1_0 GList *l; guint8 j; #endif pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); if (!i) goto done; g_free (psink->device_description); psink->device_description = g_strdup (i->description); #ifdef HAVE_PULSE_1_0 g_mutex_lock (psink->sink_formats_lock); for (l = g_list_first (psink->sink_formats); l; l = g_list_next (l)) pa_format_info_free ((pa_format_info *) l->data); g_list_free (psink->sink_formats); psink->sink_formats = NULL; for (j = 0; j < i->n_formats; j++) psink->sink_formats = g_list_prepend (psink->sink_formats, pa_format_info_copy (i->formats[j])); g_mutex_unlock (psink->sink_formats_lock); #endif done: pa_threaded_mainloop_signal (mainloop, 0); } #ifdef HAVE_PULSE_1_0 /* NOTE: If you're making changes here, see if pulseaudiosink acceptcaps also * needs to be changed accordingly. */ static gboolean gst_pulsesink_pad_acceptcaps (GstPad * pad, GstCaps * caps) { GstPulseSink *psink = GST_PULSESINK (gst_pad_get_parent_element (pad)); GstPulseRingBuffer *pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); GstCaps *pad_caps; GstStructure *st; gboolean ret = FALSE; GstRingBufferSpec spec = { 0 }; pa_stream *stream = NULL; pa_operation *o = NULL; pa_channel_map channel_map; pa_stream_flags_t flags; pa_format_info *format = NULL, *formats[1]; guint channels; pad_caps = gst_pad_get_caps_reffed (pad); if (pad_caps) { ret = gst_caps_can_intersect (pad_caps, caps); gst_caps_unref (pad_caps); } /* Either template caps didn't match, or we're still in NULL state */ if (!ret || !pbuf->context) goto done; /* If we've not got fixed caps, creating a stream might fail, so let's just * return from here with default acceptcaps behaviour */ if (!gst_caps_is_fixed (caps)) goto done; ret = FALSE; pa_threaded_mainloop_lock (mainloop); spec.latency_time = GST_BASE_AUDIO_SINK (psink)->latency_time; if (!gst_ring_buffer_parse_caps (&spec, caps)) goto out; if (!gst_pulse_fill_format_info (&spec, &format, &channels)) goto out; /* Make sure input is framed (one frame per buffer) and can be payloaded */ if (!pa_format_info_is_pcm (format)) { gboolean framed = FALSE, parsed = FALSE; st = gst_caps_get_structure (caps, 0); gst_structure_get_boolean (st, "framed", &framed); gst_structure_get_boolean (st, "parsed", &parsed); if ((!framed && !parsed) || gst_audio_iec61937_frame_size (&spec) <= 0) goto out; } /* initialize the channel map */ if (pa_format_info_is_pcm (format) && gst_pulse_gst_to_channel_map (&channel_map, &spec)) pa_format_info_set_channel_map (format, &channel_map); if (pbuf->stream) { /* We're already in PAUSED or above, so just reuse this stream to query * sink formats and use those. */ GList *i; if (!(o = pa_context_get_sink_info_by_name (pbuf->context, psink->device, gst_pulsesink_sink_info_cb, pbuf))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto out; } g_mutex_lock (psink->sink_formats_lock); for (i = g_list_first (psink->sink_formats); i; i = g_list_next (i)) { if (pa_format_info_is_compatible ((pa_format_info *) i->data, format)) { ret = TRUE; break; } } g_mutex_unlock (psink->sink_formats_lock); } else { /* We're in READY, let's connect a stream to see if the format is * accpeted by whatever sink we're routed to */ formats[0] = format; if (!(stream = pa_stream_new_extended (pbuf->context, "pulsesink probe", formats, 1, psink->proplist))) goto out; /* construct the flags */ flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED; pa_stream_set_state_callback (stream, gst_pulsering_stream_state_cb, pbuf); if (pa_stream_connect_playback (stream, psink->device, NULL, flags, NULL, NULL) < 0) goto out; ret = gst_pulsering_wait_for_stream_ready (psink, stream); } out: if (format) pa_format_info_free (format); if (o) pa_operation_unref (o); if (stream) { pa_stream_set_state_callback (stream, NULL, NULL); pa_stream_disconnect (stream); pa_stream_unref (stream); } pa_threaded_mainloop_unlock (mainloop); done: gst_object_unref (psink); return ret; info_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_context_get_sink_input_info() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto out; } } #endif static void gst_pulsesink_init (GstPulseSink * pulsesink, GstPulseSinkClass * klass) { pulsesink->server = NULL; pulsesink->device = NULL; pulsesink->device_description = NULL; pulsesink->client_name = gst_pulse_client_name (); #ifdef HAVE_PULSE_1_0 pulsesink->sink_formats_lock = g_mutex_new (); pulsesink->sink_formats = NULL; #endif pulsesink->volume = DEFAULT_VOLUME; pulsesink->volume_set = FALSE; pulsesink->mute = DEFAULT_MUTE; pulsesink->mute_set = FALSE; pulsesink->notify = 0; #ifdef HAVE_PULSE_1_0 g_atomic_int_set (&pulsesink->format_lost, FALSE); pulsesink->format_lost_time = GST_CLOCK_TIME_NONE; #endif pulsesink->properties = NULL; pulsesink->proplist = NULL; /* override with a custom clock */ if (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock) gst_object_unref (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock); GST_BASE_AUDIO_SINK (pulsesink)->provided_clock = gst_audio_clock_new ("GstPulseSinkClock", (GstAudioClockGetTimeFunc) gst_pulsesink_get_time, pulsesink); #ifdef HAVE_PULSE_1_0 gst_pad_set_acceptcaps_function (GST_BASE_SINK (pulsesink)->sinkpad, GST_DEBUG_FUNCPTR (gst_pulsesink_pad_acceptcaps)); #endif /* TRUE for sinks, FALSE for sources */ pulsesink->probe = gst_pulseprobe_new (G_OBJECT (pulsesink), G_OBJECT_GET_CLASS (pulsesink), PROP_DEVICE, pulsesink->device, TRUE, FALSE); } static void gst_pulsesink_finalize (GObject * object) { GstPulseSink *pulsesink = GST_PULSESINK_CAST (object); #ifdef HAVE_PULSE_1_0 GList *i; #endif g_free (pulsesink->server); g_free (pulsesink->device); g_free (pulsesink->device_description); g_free (pulsesink->client_name); #ifdef HAVE_PULSE_1_0 for (i = g_list_first (pulsesink->sink_formats); i; i = g_list_next (i)) pa_format_info_free ((pa_format_info *) i->data); g_list_free (pulsesink->sink_formats); g_mutex_free (pulsesink->sink_formats_lock); #endif if (pulsesink->properties) gst_structure_free (pulsesink->properties); if (pulsesink->proplist) pa_proplist_free (pulsesink->proplist); if (pulsesink->probe) { gst_pulseprobe_free (pulsesink->probe); pulsesink->probe = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_pulsesink_set_volume (GstPulseSink * psink, gdouble volume) { pa_cvolume v; pa_operation *o = NULL; GstPulseRingBuffer *pbuf; uint32_t idx; if (!mainloop) goto no_mainloop; pa_threaded_mainloop_lock (mainloop); GST_DEBUG_OBJECT (psink, "setting volume to %f", volume); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) goto no_index; #ifdef HAVE_PULSE_1_0 if (pbuf->is_pcm) gst_pulse_cvolume_from_linear (&v, pbuf->channels, volume); else /* FIXME: this will eventually be superceded by checks to see if the volume * is readable/writable */ goto unlock; #else gst_pulse_cvolume_from_linear (&v, pbuf->sample_spec.channels, volume); #endif if (!(o = pa_context_set_sink_input_volume (pbuf->context, idx, &v, NULL, NULL))) goto volume_failed; /* We don't really care about the result of this call */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (mainloop); return; /* ERRORS */ no_mainloop: { psink->volume = volume; psink->volume_set = TRUE; GST_DEBUG_OBJECT (psink, "we have no mainloop"); return; } no_buffer: { psink->volume = volume; psink->volume_set = TRUE; GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } no_index: { GST_DEBUG_OBJECT (psink, "we don't have a stream index"); goto unlock; } volume_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_set_sink_input_volume() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static void gst_pulsesink_set_mute (GstPulseSink * psink, gboolean mute) { pa_operation *o = NULL; GstPulseRingBuffer *pbuf; uint32_t idx; if (!mainloop) goto no_mainloop; pa_threaded_mainloop_lock (mainloop); GST_DEBUG_OBJECT (psink, "setting mute state to %d", mute); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) goto no_index; if (!(o = pa_context_set_sink_input_mute (pbuf->context, idx, mute, NULL, NULL))) goto mute_failed; /* We don't really care about the result of this call */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (mainloop); return; /* ERRORS */ no_mainloop: { psink->mute = mute; psink->mute_set = TRUE; GST_DEBUG_OBJECT (psink, "we have no mainloop"); return; } no_buffer: { psink->mute = mute; psink->mute_set = TRUE; GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } no_index: { GST_DEBUG_OBJECT (psink, "we don't have a stream index"); goto unlock; } mute_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_set_sink_input_mute() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static void gst_pulsesink_sink_input_info_cb (pa_context * c, const pa_sink_input_info * i, int eol, void *userdata) { GstPulseRingBuffer *pbuf; GstPulseSink *psink; pbuf = GST_PULSERING_BUFFER_CAST (userdata); psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); if (!i) goto done; if (!pbuf->stream) goto done; /* If the index doesn't match our current stream, * it implies we just recreated the stream (caps change) */ if (i->index == pa_stream_get_index (pbuf->stream)) { psink->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume)); psink->mute = i->mute; } done: pa_threaded_mainloop_signal (mainloop, 0); } static gdouble gst_pulsesink_get_volume (GstPulseSink * psink) { GstPulseRingBuffer *pbuf; pa_operation *o = NULL; gdouble v = DEFAULT_VOLUME; uint32_t idx; if (!mainloop) goto no_mainloop; pa_threaded_mainloop_lock (mainloop); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) goto no_index; if (!(o = pa_context_get_sink_input_info (pbuf->context, idx, gst_pulsesink_sink_input_info_cb, pbuf))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto unlock; } unlock: v = psink->volume; if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (mainloop); if (v > MAX_VOLUME) { GST_WARNING_OBJECT (psink, "Clipped volume from %f to %f", v, MAX_VOLUME); v = MAX_VOLUME; } return v; /* ERRORS */ no_mainloop: { v = psink->volume; GST_DEBUG_OBJECT (psink, "we have no mainloop"); return v; } no_buffer: { GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } no_index: { GST_DEBUG_OBJECT (psink, "we don't have a stream index"); goto unlock; } info_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_context_get_sink_input_info() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static gboolean gst_pulsesink_get_mute (GstPulseSink * psink) { GstPulseRingBuffer *pbuf; pa_operation *o = NULL; uint32_t idx; gboolean mute = FALSE; if (!mainloop) goto no_mainloop; pa_threaded_mainloop_lock (mainloop); mute = psink->mute; pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; if ((idx = pa_stream_get_index (pbuf->stream)) == PA_INVALID_INDEX) goto no_index; if (!(o = pa_context_get_sink_input_info (pbuf->context, idx, gst_pulsesink_sink_input_info_cb, pbuf))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto unlock; } unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (mainloop); return mute; /* ERRORS */ no_mainloop: { mute = psink->mute; GST_DEBUG_OBJECT (psink, "we have no mainloop"); return mute; } no_buffer: { GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } no_index: { GST_DEBUG_OBJECT (psink, "we don't have a stream index"); goto unlock; } info_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_context_get_sink_input_info() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static gchar * gst_pulsesink_device_description (GstPulseSink * psink) { GstPulseRingBuffer *pbuf; pa_operation *o = NULL; gchar *t; if (!mainloop) goto no_mainloop; pa_threaded_mainloop_lock (mainloop); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL) goto no_buffer; if (!(o = pa_context_get_sink_info_by_name (pbuf->context, psink->device, gst_pulsesink_sink_info_cb, pbuf))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); if (gst_pulsering_is_dead (psink, pbuf, FALSE)) goto unlock; } unlock: if (o) pa_operation_unref (o); t = g_strdup (psink->device_description); pa_threaded_mainloop_unlock (mainloop); return t; /* ERRORS */ no_mainloop: { GST_DEBUG_OBJECT (psink, "we have no mainloop"); return NULL; } no_buffer: { GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } info_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_context_get_sink_info_by_index() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static void gst_pulsesink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPulseSink *pulsesink = GST_PULSESINK_CAST (object); switch (prop_id) { case PROP_SERVER: g_free (pulsesink->server); pulsesink->server = g_value_dup_string (value); if (pulsesink->probe) gst_pulseprobe_set_server (pulsesink->probe, pulsesink->server); break; case PROP_DEVICE: g_free (pulsesink->device); pulsesink->device = g_value_dup_string (value); break; case PROP_VOLUME: gst_pulsesink_set_volume (pulsesink, g_value_get_double (value)); break; case PROP_MUTE: gst_pulsesink_set_mute (pulsesink, g_value_get_boolean (value)); break; case PROP_CLIENT: g_free (pulsesink->client_name); if (!g_value_get_string (value)) { GST_WARNING_OBJECT (pulsesink, "Empty PulseAudio client name not allowed. Resetting to default value"); pulsesink->client_name = gst_pulse_client_name (); } else pulsesink->client_name = g_value_dup_string (value); break; case PROP_STREAM_PROPERTIES: if (pulsesink->properties) gst_structure_free (pulsesink->properties); pulsesink->properties = gst_structure_copy (gst_value_get_structure (value)); if (pulsesink->proplist) pa_proplist_free (pulsesink->proplist); pulsesink->proplist = gst_pulse_make_proplist (pulsesink->properties); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_pulsesink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPulseSink *pulsesink = GST_PULSESINK_CAST (object); switch (prop_id) { case PROP_SERVER: g_value_set_string (value, pulsesink->server); break; case PROP_DEVICE: g_value_set_string (value, pulsesink->device); break; case PROP_DEVICE_NAME: g_value_take_string (value, gst_pulsesink_device_description (pulsesink)); break; case PROP_VOLUME: g_value_set_double (value, gst_pulsesink_get_volume (pulsesink)); break; case PROP_MUTE: g_value_set_boolean (value, gst_pulsesink_get_mute (pulsesink)); break; case PROP_CLIENT: g_value_set_string (value, pulsesink->client_name); break; case PROP_STREAM_PROPERTIES: gst_value_set_structure (value, pulsesink->properties); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_pulsesink_change_title (GstPulseSink * psink, const gchar * t) { pa_operation *o = NULL; GstPulseRingBuffer *pbuf; pa_threaded_mainloop_lock (mainloop); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; g_free (pbuf->stream_name); pbuf->stream_name = g_strdup (t); if (!(o = pa_stream_set_name (pbuf->stream, pbuf->stream_name, NULL, NULL))) goto name_failed; /* We're not interested if this operation failed or not */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (mainloop); return; /* ERRORS */ no_buffer: { GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } name_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_set_name() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static void gst_pulsesink_change_props (GstPulseSink * psink, GstTagList * l) { static const gchar *const map[] = { GST_TAG_TITLE, PA_PROP_MEDIA_TITLE, /* might get overriden in the next iteration by GST_TAG_ARTIST */ GST_TAG_PERFORMER, PA_PROP_MEDIA_ARTIST, GST_TAG_ARTIST, PA_PROP_MEDIA_ARTIST, GST_TAG_LANGUAGE_CODE, PA_PROP_MEDIA_LANGUAGE, GST_TAG_LOCATION, PA_PROP_MEDIA_FILENAME, /* We might add more here later on ... */ NULL }; pa_proplist *pl = NULL; const gchar *const *t; gboolean empty = TRUE; pa_operation *o = NULL; GstPulseRingBuffer *pbuf; pl = pa_proplist_new (); for (t = map; *t; t += 2) { gchar *n = NULL; if (gst_tag_list_get_string (l, *t, &n)) { if (n && *n) { pa_proplist_sets (pl, *(t + 1), n); empty = FALSE; } g_free (n); } } if (empty) goto finish; pa_threaded_mainloop_lock (mainloop); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; if (!(o = pa_stream_proplist_update (pbuf->stream, PA_UPDATE_REPLACE, pl, NULL, NULL))) goto update_failed; /* We're not interested if this operation failed or not */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (mainloop); finish: if (pl) pa_proplist_free (pl); return; /* ERRORS */ no_buffer: { GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } update_failed: { GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("pa_stream_proplist_update() failed: %s", pa_strerror (pa_context_errno (pbuf->context))), (NULL)); goto unlock; } } static void gst_pulsesink_flush_ringbuffer (GstPulseSink * psink) { GstPulseRingBuffer *pbuf; pa_threaded_mainloop_lock (mainloop); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); if (pbuf == NULL || pbuf->stream == NULL) goto no_buffer; gst_pulsering_flush (pbuf); /* Uncork if we haven't already (happens when waiting to get enough data * to send out the first time) */ if (pbuf->corked) gst_pulsering_set_corked (pbuf, FALSE, FALSE); /* We're not interested if this operation failed or not */ unlock: pa_threaded_mainloop_unlock (mainloop); return; /* ERRORS */ no_buffer: { GST_DEBUG_OBJECT (psink, "we have no ringbuffer"); goto unlock; } } static gboolean gst_pulsesink_event (GstBaseSink * sink, GstEvent * event) { GstPulseSink *pulsesink = GST_PULSESINK_CAST (sink); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ gchar *title = NULL, *artist = NULL, *location = NULL, *description = NULL, *t = NULL, *buf = NULL; GstTagList *l; gst_event_parse_tag (event, &l); gst_tag_list_get_string (l, GST_TAG_TITLE, &title); gst_tag_list_get_string (l, GST_TAG_ARTIST, &artist); gst_tag_list_get_string (l, GST_TAG_LOCATION, &location); gst_tag_list_get_string (l, GST_TAG_DESCRIPTION, &description); if (!artist) gst_tag_list_get_string (l, GST_TAG_PERFORMER, &artist); if (title && artist) /* TRANSLATORS: 'song title' by 'artist name' */ t = buf = g_strdup_printf (_("'%s' by '%s'"), g_strstrip (title), g_strstrip (artist)); else if (title) t = g_strstrip (title); else if (description) t = g_strstrip (description); else if (location) t = g_strstrip (location); if (t) gst_pulsesink_change_title (pulsesink, t); g_free (title); g_free (artist); g_free (location); g_free (description); g_free (buf); gst_pulsesink_change_props (pulsesink, l); break; } case GST_EVENT_EOS: gst_pulsesink_flush_ringbuffer (pulsesink); break; default: ; } return GST_BASE_SINK_CLASS (parent_class)->event (sink, event); } static void gst_pulsesink_release_mainloop (GstPulseSink * psink) { if (!mainloop) return; pa_threaded_mainloop_lock (mainloop); while (psink->defer_pending) { GST_DEBUG_OBJECT (psink, "waiting for stream status message emission"); pa_threaded_mainloop_wait (mainloop); } pa_threaded_mainloop_unlock (mainloop); g_mutex_lock (pa_shared_resource_mutex); mainloop_ref_ct--; if (!mainloop_ref_ct) { GST_INFO_OBJECT (psink, "terminating pa main loop thread"); pa_threaded_mainloop_stop (mainloop); pa_threaded_mainloop_free (mainloop); mainloop = NULL; } g_mutex_unlock (pa_shared_resource_mutex); } static GstStateChangeReturn gst_pulsesink_change_state (GstElement * element, GstStateChange transition) { GstPulseSink *pulsesink = GST_PULSESINK (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: g_mutex_lock (pa_shared_resource_mutex); if (!mainloop_ref_ct) { GST_INFO_OBJECT (element, "new pa main loop thread"); if (!(mainloop = pa_threaded_mainloop_new ())) goto mainloop_failed; if (pa_threaded_mainloop_start (mainloop) < 0) { pa_threaded_mainloop_free (mainloop); goto mainloop_start_failed; } mainloop_ref_ct = 1; g_mutex_unlock (pa_shared_resource_mutex); } else { GST_INFO_OBJECT (element, "reusing pa main loop thread"); mainloop_ref_ct++; g_mutex_unlock (pa_shared_resource_mutex); } break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_element_post_message (element, gst_message_new_clock_provide (GST_OBJECT_CAST (element), GST_BASE_AUDIO_SINK (pulsesink)->provided_clock, TRUE)); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto state_failure; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: /* format_lost is reset in release() in baseaudiosink */ gst_element_post_message (element, gst_message_new_clock_lost (GST_OBJECT_CAST (element), GST_BASE_AUDIO_SINK (pulsesink)->provided_clock)); break; case GST_STATE_CHANGE_READY_TO_NULL: gst_pulsesink_release_mainloop (pulsesink); break; default: break; } return ret; /* ERRORS */ mainloop_failed: { g_mutex_unlock (pa_shared_resource_mutex); GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, ("pa_threaded_mainloop_new() failed"), (NULL)); return GST_STATE_CHANGE_FAILURE; } mainloop_start_failed: { g_mutex_unlock (pa_shared_resource_mutex); GST_ELEMENT_ERROR (pulsesink, RESOURCE, FAILED, ("pa_threaded_mainloop_start() failed"), (NULL)); return GST_STATE_CHANGE_FAILURE; } state_failure: { if (transition == GST_STATE_CHANGE_NULL_TO_READY) { /* Clear the PA mainloop if baseaudiosink failed to open the ring_buffer */ g_assert (mainloop); gst_pulsesink_release_mainloop (pulsesink); } return ret; } } gst-plugins-good-0.10.31/ext/pulse/pulsesink.h0000644000175000017500000001231711677341654016137 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSESINK_H__ #define __GST_PULSESINK_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "pulseprobe.h" G_BEGIN_DECLS #define GST_TYPE_PULSESINK \ (gst_pulsesink_get_type()) #define GST_PULSESINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSESINK,GstPulseSink)) #define GST_PULSESINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSESINK,GstPulseSinkClass)) #define GST_IS_PULSESINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSESINK)) #define GST_IS_PULSESINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSESINK)) #define GST_PULSESINK_CAST(obj) \ ((GstPulseSink *)(obj)) typedef struct _GstPulseSink GstPulseSink; typedef struct _GstPulseSinkClass GstPulseSinkClass; struct _GstPulseSink { GstBaseAudioSink sink; gchar *server, *device, *stream_name, *client_name; gchar *device_description; GstPulseProbe *probe; gdouble volume; gboolean volume_set:1; gboolean mute:1; gboolean mute_set:1; guint defer_pending; gint notify; /* atomic */ const gchar *pa_version; GstStructure *properties; pa_proplist *proplist; #ifdef HAVE_PULSE_1_0 GMutex *sink_formats_lock; GList *sink_formats; volatile gint format_lost; GstClockTime format_lost_time; #endif }; struct _GstPulseSinkClass { GstBaseAudioSinkClass parent_class; }; GType gst_pulsesink_get_type (void); #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) # define ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN" #else # define ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN" #endif #define _PULSE_SINK_CAPS_COMMON \ "audio/x-raw-int, " \ "endianness = (int) { " ENDIANNESS " }, " \ "signed = (boolean) TRUE, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 32 ];" \ "audio/x-raw-float, " \ "endianness = (int) { " ENDIANNESS " }, " \ "width = (int) 32, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 32 ];" \ "audio/x-raw-int, " \ "endianness = (int) { " ENDIANNESS " }, " \ "signed = (boolean) TRUE, " \ "width = (int) 32, " \ "depth = (int) 32, " \ "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" \ "audio/x-raw-int, " \ "signed = (boolean) FALSE, " \ "width = (int) 8, " \ "depth = (int) 8, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 32 ];" \ "audio/x-alaw, " \ "rate = (int) [ 1, MAX], " \ "channels = (int) [ 1, 32 ];" \ "audio/x-mulaw, " \ "rate = (int) [ 1, MAX], " "channels = (int) [ 1, 32 ];" \ "audio/x-raw-int, " \ "endianness = (int) { " ENDIANNESS " }, " \ "signed = (boolean) TRUE, " \ "width = (int) 24, " \ "depth = (int) 24, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 32 ];" \ "audio/x-raw-int, " \ "endianness = (int) { " ENDIANNESS " }, " \ "signed = (boolean) TRUE, " \ "width = (int) 32, " \ "depth = (int) 24, " \ "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" #ifdef HAVE_PULSE_1_0 #define _PULSE_SINK_CAPS_1_0 \ "audio/x-ac3, framed = (boolean) true;" \ "audio/x-eac3, framed = (boolean) true; " \ "audio/x-dts, framed = (boolean) true, " \ "block-size = (int) { 512, 1024, 2048 }; " \ "audio/mpeg, mpegversion = (int) 1, " \ "mpegaudioversion = (int) [ 1, 2 ], parsed = (boolean) true;" #else #define _PULSE_SINK_CAPS_1_0 "" #endif #define PULSE_SINK_TEMPLATE_CAPS \ _PULSE_SINK_CAPS_COMMON \ _PULSE_SINK_CAPS_1_0 #ifdef HAVE_PULSE_1_0 #define GST_TYPE_PULSE_AUDIO_SINK \ (gst_pulse_audio_sink_get_type()) #define GST_PULSE_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSE_AUDIO_SINK,GstPulseAudioSink)) #define GST_PULSE_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSE_AUDIO_SINK,GstPulseAudioSinkClass)) #define GST_IS_PULSE_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSE_AUDIO_SINK)) #define GST_IS_PULSE_AUDIO_SINK_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSE_AUDIO_SINK)) #define GST_PULSE_AUDIO_SINK_CAST(obj) \ ((GstPulseAudioSink *)(obj)) GType gst_pulse_audio_sink_get_type (void); #endif /* HAVE_PULSE_1_0 */ G_END_DECLS #endif /* __GST_PULSESINK_H__ */ gst-plugins-good-0.10.31/ext/pulse/pulsemixertrack.c0000644000175000017500000000364511671175352017335 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; 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 #include "pulsemixertrack.h" GST_DEBUG_CATEGORY_EXTERN (pulse_debug); #define GST_CAT_DEFAULT pulse_debug G_DEFINE_TYPE (GstPulseMixerTrack, gst_pulsemixer_track, GST_TYPE_MIXER_TRACK); static void gst_pulsemixer_track_class_init (GstPulseMixerTrackClass * klass) { } static void gst_pulsemixer_track_init (GstPulseMixerTrack * track) { track->control = NULL; } GstMixerTrack * gst_pulsemixer_track_new (GstPulseMixerCtrl * control) { GstPulseMixerTrack *pulsetrack; GstMixerTrack *track; pulsetrack = g_object_new (GST_TYPE_PULSEMIXER_TRACK, NULL); pulsetrack->control = control; track = GST_MIXER_TRACK (pulsetrack); track->label = g_strdup ("Master"); track->num_channels = control->channel_map.channels; track->flags = (control->type == GST_PULSEMIXER_SINK ? GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_MASTER : GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_RECORD) | (control->muted ? GST_MIXER_TRACK_MUTE : 0); track->min_volume = PA_VOLUME_MUTED; track->max_volume = PA_VOLUME_NORM; return track; } gst-plugins-good-0.10.31/ext/pulse/Makefile.am0000644000175000017500000000134211677341654016001 00000000000000plugin_LTLIBRARIES = libgstpulse.la libgstpulse_la_SOURCES = \ plugin.c \ pulsemixer.c \ pulsemixerctrl.c \ pulsemixertrack.c \ pulseprobe.c \ pulsesink.c \ pulseaudiosink.c \ pulsesrc.c \ pulseutil.c libgstpulse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(PULSE_CFLAGS) libgstpulse_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ -lgstinterfaces-$(GST_MAJORMINOR) -lgstpbutils-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(PULSE_LIBS) libgstpulse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstpulse_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ pulsemixerctrl.h \ pulsemixer.h \ pulsemixertrack.h \ pulseprobe.h \ pulsesink.h \ pulsesrc.h \ pulseutil.h gst-plugins-good-0.10.31/ext/pulse/pulseutil.h0000644000175000017500000000321111677341654016141 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSEUTIL_H__ #define __GST_PULSEUTIL_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include gboolean gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, pa_sample_spec * ss); #ifdef HAVE_PULSE_1_0 gboolean gst_pulse_fill_format_info (GstRingBufferSpec * spec, pa_format_info ** f, guint * channels); #endif gchar *gst_pulse_client_name (void); pa_channel_map *gst_pulse_gst_to_channel_map (pa_channel_map * map, const GstRingBufferSpec * spec); GstRingBufferSpec *gst_pulse_channel_map_to_gst (const pa_channel_map * map, GstRingBufferSpec * spec); void gst_pulse_cvolume_from_linear (pa_cvolume *v, unsigned channels, gdouble volume); pa_proplist *gst_pulse_make_proplist (const GstStructure *properties); #endif gst-plugins-good-0.10.31/ext/pulse/plugin.c0000644000175000017500000000405511713013171015370 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; 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 #include "pulsesink.h" #include "pulsesrc.h" #include "pulsemixer.h" GST_DEBUG_CATEGORY (pulse_debug); static gboolean plugin_init (GstPlugin * plugin) { #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif if (!gst_element_register (plugin, "pulsesink", GST_RANK_PRIMARY + 10, GST_TYPE_PULSESINK)) return FALSE; if (!gst_element_register (plugin, "pulsesrc", GST_RANK_PRIMARY + 10, GST_TYPE_PULSESRC)) return FALSE; #ifdef HAVE_PULSE_1_0 if (!gst_element_register (plugin, "pulseaudiosink", GST_RANK_MARGINAL - 1, GST_TYPE_PULSE_AUDIO_SINK)) return FALSE; #endif if (!gst_element_register (plugin, "pulsemixer", GST_RANK_NONE, GST_TYPE_PULSEMIXER)) return FALSE; GST_DEBUG_CATEGORY_INIT (pulse_debug, "pulse", 0, "PulseAudio elements"); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "pulseaudio", "PulseAudio plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/pulse/pulsemixerctrl.h0000644000175000017500000002105411671175352017174 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSEMIXERCTRL_H__ #define __GST_PULSEMIXERCTRL_H__ #include #include #include #include G_BEGIN_DECLS #define GST_PULSEMIXER_CTRL(obj) ((GstPulseMixerCtrl*)(obj)) typedef struct _GstPulseMixerCtrl GstPulseMixerCtrl; typedef enum { GST_PULSEMIXER_UNKNOWN, GST_PULSEMIXER_SINK, GST_PULSEMIXER_SOURCE } GstPulseMixerType; struct _GstPulseMixerCtrl { GObject *object; GList *tracklist; gchar *server, *device; pa_threaded_mainloop *mainloop; pa_context *context; gchar *name, *description; pa_channel_map channel_map; pa_cvolume volume; gboolean muted:1; gboolean update_volume:1; gboolean update_mute:1; gboolean operation_success:1; guint32 index; GstPulseMixerType type; GstMixerTrack *track; pa_time_event *time_event; int outstandig_queries; int ignore_queries; }; GstPulseMixerCtrl *gst_pulsemixer_ctrl_new (GObject *object, const gchar * server, const gchar * device, GstPulseMixerType type); void gst_pulsemixer_ctrl_free (GstPulseMixerCtrl * mixer); const GList *gst_pulsemixer_ctrl_list_tracks (GstPulseMixerCtrl * mixer); void gst_pulsemixer_ctrl_set_volume (GstPulseMixerCtrl * mixer, GstMixerTrack * track, gint * volumes); void gst_pulsemixer_ctrl_get_volume (GstPulseMixerCtrl * mixer, GstMixerTrack * track, gint * volumes); void gst_pulsemixer_ctrl_set_mute (GstPulseMixerCtrl * mixer, GstMixerTrack * track, gboolean mute); void gst_pulsemixer_ctrl_set_record (GstPulseMixerCtrl * mixer, GstMixerTrack * track, gboolean record); GstMixerFlags gst_pulsemixer_ctrl_get_mixer_flags (GstPulseMixerCtrl * mixer); #define GST_IMPLEMENT_PULSEMIXER_CTRL_METHODS(Type, interface_as_function) \ static const GList* \ interface_as_function ## _list_tracks (GstMixer * mixer) \ { \ Type *this = (Type*) mixer; \ \ g_return_val_if_fail (this != NULL, NULL); \ g_return_val_if_fail (this->mixer != NULL, NULL); \ \ return gst_pulsemixer_ctrl_list_tracks (this->mixer); \ } \ static void \ interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ gint * volumes) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_pulsemixer_ctrl_set_volume (this->mixer, track, volumes); \ } \ static void \ interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ gint * volumes) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_pulsemixer_ctrl_get_volume (this->mixer, track, volumes); \ } \ static void \ interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ gboolean record) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_pulsemixer_ctrl_set_record (this->mixer, track, record); \ } \ static void \ interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ gboolean mute) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_pulsemixer_ctrl_set_mute (this->mixer, track, mute); \ } \ static GstMixerFlags \ interface_as_function ## _get_mixer_flags (GstMixer * mixer) \ { \ Type *this = (Type*) mixer; \ \ g_return_val_if_fail (this != NULL, GST_MIXER_FLAG_NONE); \ g_return_val_if_fail (this->mixer != NULL, GST_MIXER_FLAG_NONE); \ \ return gst_pulsemixer_ctrl_get_mixer_flags (this->mixer); \ } \ static void \ interface_as_function ## _mixer_interface_init (GstMixerClass * klass) \ { \ GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ \ klass->list_tracks = interface_as_function ## _list_tracks; \ klass->set_volume = interface_as_function ## _set_volume; \ klass->get_volume = interface_as_function ## _get_volume; \ klass->set_mute = interface_as_function ## _set_mute; \ klass->set_record = interface_as_function ## _set_record; \ klass->get_mixer_flags = interface_as_function ## _get_mixer_flags; \ } G_END_DECLS #endif gst-plugins-good-0.10.31/ext/pulse/pulsemixerctrl.c0000644000175000017500000004031711671175352017172 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; 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 #include "pulsemixerctrl.h" #include "pulsemixertrack.h" #include "pulseutil.h" GST_DEBUG_CATEGORY_EXTERN (pulse_debug); #define GST_CAT_DEFAULT pulse_debug static void gst_pulsemixer_ctrl_context_state_cb (pa_context * context, void *userdata) { GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); /* Called from the background thread! */ switch (pa_context_get_state (context)) { case PA_CONTEXT_READY: case PA_CONTEXT_TERMINATED: case PA_CONTEXT_FAILED: pa_threaded_mainloop_signal (c->mainloop, 0); break; case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; } } static void gst_pulsemixer_ctrl_sink_info_cb (pa_context * context, const pa_sink_info * i, int eol, void *userdata) { GstPulseMixerCtrl *c = userdata; gboolean vol_chg = FALSE; gboolean old_mute; /* Called from the background thread! */ if (c->outstandig_queries > 0) c->outstandig_queries--; if (c->ignore_queries > 0 || c->time_event) { if (c->ignore_queries > 0) c->ignore_queries--; return; } if (!i && eol < 0) { c->operation_success = FALSE; pa_threaded_mainloop_signal (c->mainloop, 0); return; } if (eol) return; g_free (c->name); g_free (c->description); c->name = g_strdup (i->name); c->description = g_strdup (i->description); c->index = i->index; c->channel_map = i->channel_map; vol_chg = !pa_cvolume_equal (&c->volume, &i->volume); c->volume = i->volume; old_mute = c->muted; c->muted = !!i->mute; c->type = GST_PULSEMIXER_SINK; if (c->track) { GstMixerTrackFlags flags = c->track->flags; flags = (flags & ~GST_MIXER_TRACK_MUTE) | (c->muted ? GST_MIXER_TRACK_MUTE : 0); c->track->flags = flags; } c->operation_success = TRUE; pa_threaded_mainloop_signal (c->mainloop, 0); if (vol_chg && c->track) { gint volumes[PA_CHANNELS_MAX]; gint i; for (i = 0; i < c->volume.channels; i++) volumes[i] = (gint) (c->volume.values[i]); GST_LOG_OBJECT (c->object, "Sending volume change notification"); gst_mixer_volume_changed (GST_MIXER (c->object), c->track, volumes); } if ((c->muted != old_mute) && c->track) { GST_LOG_OBJECT (c->object, "Sending mute toggled notification"); gst_mixer_mute_toggled (GST_MIXER (c->object), c->track, c->muted); } } static void gst_pulsemixer_ctrl_source_info_cb (pa_context * context, const pa_source_info * i, int eol, void *userdata) { GstPulseMixerCtrl *c = userdata; gboolean vol_chg = FALSE; gboolean old_mute; /* Called from the background thread! */ if (c->outstandig_queries > 0) c->outstandig_queries--; if (c->ignore_queries > 0 || c->time_event) { if (c->ignore_queries > 0) c->ignore_queries--; return; } if (!i && eol < 0) { c->operation_success = FALSE; pa_threaded_mainloop_signal (c->mainloop, 0); return; } if (eol) return; g_free (c->name); g_free (c->description); c->name = g_strdup (i->name); c->description = g_strdup (i->description); c->index = i->index; c->channel_map = i->channel_map; vol_chg = !pa_cvolume_equal (&c->volume, &i->volume); c->volume = i->volume; old_mute = c->muted; c->muted = !!i->mute; c->type = GST_PULSEMIXER_SOURCE; if (c->track) { GstMixerTrackFlags flags = c->track->flags; flags = (flags & ~GST_MIXER_TRACK_MUTE) | (c->muted ? GST_MIXER_TRACK_MUTE : 0); c->track->flags = flags; } c->operation_success = TRUE; pa_threaded_mainloop_signal (c->mainloop, 0); if (vol_chg && c->track) { gint volumes[PA_CHANNELS_MAX]; gint i; for (i = 0; i < c->volume.channels; i++) volumes[i] = (gint) (c->volume.values[i]); GST_LOG_OBJECT (c->object, "Sending volume change notification"); gst_mixer_volume_changed (GST_MIXER (c->object), c->track, volumes); } if ((c->muted != old_mute) && c->track) { GST_LOG_OBJECT (c->object, "Sending mute toggled notification"); gst_mixer_mute_toggled (GST_MIXER (c->object), c->track, c->muted); } } static void gst_pulsemixer_ctrl_subscribe_cb (pa_context * context, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); pa_operation *o = NULL; /* Called from the background thread! */ if (c->index != idx) return; if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE) return; if (c->type == GST_PULSEMIXER_SINK) o = pa_context_get_sink_info_by_index (c->context, c->index, gst_pulsemixer_ctrl_sink_info_cb, c); else o = pa_context_get_source_info_by_index (c->context, c->index, gst_pulsemixer_ctrl_source_info_cb, c); if (!o) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); return; } pa_operation_unref (o); c->outstandig_queries++; } static void gst_pulsemixer_ctrl_success_cb (pa_context * context, int success, void *userdata) { GstPulseMixerCtrl *c = (GstPulseMixerCtrl *) userdata; c->operation_success = !!success; pa_threaded_mainloop_signal (c->mainloop, 0); } #define CHECK_DEAD_GOTO(c, label) \ G_STMT_START { \ if (!(c)->context || \ !PA_CONTEXT_IS_GOOD(pa_context_get_state((c)->context))) { \ GST_WARNING_OBJECT ((c)->object, "Not connected: %s", \ (c)->context ? pa_strerror(pa_context_errno((c)->context)) : "NULL"); \ goto label; \ } \ } G_STMT_END static gboolean gst_pulsemixer_ctrl_open (GstPulseMixerCtrl * c) { int e; gchar *name; pa_operation *o = NULL; g_assert (c); GST_DEBUG_OBJECT (c->object, "ctrl open"); c->mainloop = pa_threaded_mainloop_new (); if (!c->mainloop) return FALSE; e = pa_threaded_mainloop_start (c->mainloop); if (e < 0) return FALSE; name = gst_pulse_client_name (); pa_threaded_mainloop_lock (c->mainloop); if (!(c->context = pa_context_new (pa_threaded_mainloop_get_api (c->mainloop), name))) { GST_WARNING_OBJECT (c->object, "Failed to create context"); goto unlock_and_fail; } pa_context_set_state_callback (c->context, gst_pulsemixer_ctrl_context_state_cb, c); pa_context_set_subscribe_callback (c->context, gst_pulsemixer_ctrl_subscribe_cb, c); if (pa_context_connect (c->context, c->server, 0, NULL) < 0) { GST_WARNING_OBJECT (c->object, "Failed to connect context: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } /* Wait until the context is ready */ while (pa_context_get_state (c->context) != PA_CONTEXT_READY) { CHECK_DEAD_GOTO (c, unlock_and_fail); pa_threaded_mainloop_wait (c->mainloop); } /* Subscribe to events */ if (!(o = pa_context_subscribe (c->context, PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SOURCE, gst_pulsemixer_ctrl_success_cb, c))) { GST_WARNING_OBJECT (c->object, "Failed to subscribe to events: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } c->operation_success = FALSE; while (pa_operation_get_state (o) != PA_OPERATION_DONE) { CHECK_DEAD_GOTO (c, unlock_and_fail); pa_threaded_mainloop_wait (c->mainloop); } if (!c->operation_success) { GST_WARNING_OBJECT (c->object, "Failed to subscribe to events: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } pa_operation_unref (o); o = NULL; /* Get sink info */ if (c->type == GST_PULSEMIXER_UNKNOWN || c->type == GST_PULSEMIXER_SINK) { GST_WARNING_OBJECT (c->object, "Get info for '%s'", c->device); if (!(o = pa_context_get_sink_info_by_name (c->context, c->device, gst_pulsemixer_ctrl_sink_info_cb, c))) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } c->operation_success = FALSE; while (pa_operation_get_state (o) != PA_OPERATION_DONE) { CHECK_DEAD_GOTO (c, unlock_and_fail); pa_threaded_mainloop_wait (c->mainloop); } pa_operation_unref (o); o = NULL; if (!c->operation_success && (c->type == GST_PULSEMIXER_SINK || pa_context_errno (c->context) != PA_ERR_NOENTITY)) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } } if (c->type == GST_PULSEMIXER_UNKNOWN || c->type == GST_PULSEMIXER_SOURCE) { if (!(o = pa_context_get_source_info_by_name (c->context, c->device, gst_pulsemixer_ctrl_source_info_cb, c))) { GST_WARNING_OBJECT (c->object, "Failed to get source info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } c->operation_success = FALSE; while (pa_operation_get_state (o) != PA_OPERATION_DONE) { CHECK_DEAD_GOTO (c, unlock_and_fail); pa_threaded_mainloop_wait (c->mainloop); } pa_operation_unref (o); o = NULL; if (!c->operation_success) { GST_WARNING_OBJECT (c->object, "Failed to get source info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } } g_assert (c->type != GST_PULSEMIXER_UNKNOWN); c->track = gst_pulsemixer_track_new (c); c->tracklist = g_list_append (c->tracklist, c->track); pa_threaded_mainloop_unlock (c->mainloop); g_free (name); return TRUE; unlock_and_fail: if (o) pa_operation_unref (o); if (c->mainloop) pa_threaded_mainloop_unlock (c->mainloop); g_free (name); return FALSE; } static void gst_pulsemixer_ctrl_close (GstPulseMixerCtrl * c) { g_assert (c); GST_DEBUG_OBJECT (c->object, "ctrl close"); if (c->mainloop) pa_threaded_mainloop_stop (c->mainloop); if (c->context) { pa_context_disconnect (c->context); pa_context_unref (c->context); c->context = NULL; } if (c->mainloop) { pa_threaded_mainloop_free (c->mainloop); c->mainloop = NULL; c->time_event = NULL; } if (c->tracklist) { g_list_free (c->tracklist); c->tracklist = NULL; } if (c->track) { GST_PULSEMIXER_TRACK (c->track)->control = NULL; g_object_unref (c->track); c->track = NULL; } } GstPulseMixerCtrl * gst_pulsemixer_ctrl_new (GObject * object, const gchar * server, const gchar * device, GstPulseMixerType type) { GstPulseMixerCtrl *c = NULL; g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE ((object), GST_TYPE_MIXER), c); GST_DEBUG_OBJECT (object, "new mixer ctrl for %s", device); c = g_new (GstPulseMixerCtrl, 1); c->object = g_object_ref (object); c->tracklist = NULL; c->server = g_strdup (server); c->device = g_strdup (device); c->mainloop = NULL; c->context = NULL; c->track = NULL; c->ignore_queries = c->outstandig_queries = 0; pa_cvolume_mute (&c->volume, PA_CHANNELS_MAX); pa_channel_map_init (&c->channel_map); c->muted = FALSE; c->index = PA_INVALID_INDEX; c->type = type; c->name = NULL; c->description = NULL; c->time_event = NULL; c->update_volume = c->update_mute = FALSE; if (!(gst_pulsemixer_ctrl_open (c))) { gst_pulsemixer_ctrl_free (c); return NULL; } return c; } void gst_pulsemixer_ctrl_free (GstPulseMixerCtrl * c) { g_assert (c); gst_pulsemixer_ctrl_close (c); g_free (c->server); g_free (c->device); g_free (c->name); g_free (c->description); g_object_unref (c->object); g_free (c); } const GList * gst_pulsemixer_ctrl_list_tracks (GstPulseMixerCtrl * c) { g_assert (c); return c->tracklist; } static void gst_pulsemixer_ctrl_timeout_event (pa_mainloop_api * a, pa_time_event * e, const struct timeval *tv, void *userdata) { pa_operation *o; GstPulseMixerCtrl *c = GST_PULSEMIXER_CTRL (userdata); if (c->update_volume) { if (c->type == GST_PULSEMIXER_SINK) o = pa_context_set_sink_volume_by_index (c->context, c->index, &c->volume, NULL, NULL); else o = pa_context_set_source_volume_by_index (c->context, c->index, &c->volume, NULL, NULL); if (!o) GST_WARNING_OBJECT (c->object, "Failed to set device volume: %s", pa_strerror (pa_context_errno (c->context))); else pa_operation_unref (o); c->update_volume = FALSE; } if (c->update_mute) { if (c->type == GST_PULSEMIXER_SINK) o = pa_context_set_sink_mute_by_index (c->context, c->index, c->muted, NULL, NULL); else o = pa_context_set_source_mute_by_index (c->context, c->index, c->muted, NULL, NULL); if (!o) GST_WARNING_OBJECT (c->object, "Failed to set device mute: %s", pa_strerror (pa_context_errno (c->context))); else pa_operation_unref (o); c->update_mute = FALSE; } /* Make sure that all outstanding queries are being ignored */ c->ignore_queries = c->outstandig_queries; g_assert (e == c->time_event); a->time_free (e); c->time_event = NULL; } #define UPDATE_DELAY 50000 static void restart_time_event (GstPulseMixerCtrl * c) { struct timeval tv; pa_mainloop_api *api; g_assert (c); if (c->time_event) return; /* Updating the volume too often will cause a lot of traffic * when accessing a networked server. Therefore we make sure * to update the volume only once every 50ms */ api = pa_threaded_mainloop_get_api (c->mainloop); c->time_event = api->time_new (api, pa_timeval_add (pa_gettimeofday (&tv), UPDATE_DELAY), gst_pulsemixer_ctrl_timeout_event, c); } void gst_pulsemixer_ctrl_set_volume (GstPulseMixerCtrl * c, GstMixerTrack * track, gint * volumes) { pa_cvolume v; int i; g_assert (c); g_assert (track == c->track); pa_threaded_mainloop_lock (c->mainloop); for (i = 0; i < c->channel_map.channels; i++) v.values[i] = (pa_volume_t) volumes[i]; v.channels = c->channel_map.channels; c->volume = v; c->update_volume = TRUE; restart_time_event (c); pa_threaded_mainloop_unlock (c->mainloop); } void gst_pulsemixer_ctrl_get_volume (GstPulseMixerCtrl * c, GstMixerTrack * track, gint * volumes) { int i; g_assert (c); g_assert (track == c->track); pa_threaded_mainloop_lock (c->mainloop); for (i = 0; i < c->channel_map.channels; i++) volumes[i] = c->volume.values[i]; pa_threaded_mainloop_unlock (c->mainloop); } void gst_pulsemixer_ctrl_set_record (GstPulseMixerCtrl * c, GstMixerTrack * track, gboolean record) { g_assert (c); g_assert (track == c->track); } void gst_pulsemixer_ctrl_set_mute (GstPulseMixerCtrl * c, GstMixerTrack * track, gboolean mute) { g_assert (c); g_assert (track == c->track); pa_threaded_mainloop_lock (c->mainloop); c->muted = mute; c->update_mute = TRUE; if (c->track) { GstMixerTrackFlags flags = c->track->flags; flags = (flags & ~GST_MIXER_TRACK_MUTE) | (c->muted ? GST_MIXER_TRACK_MUTE : 0); c->track->flags = flags; } restart_time_event (c); pa_threaded_mainloop_unlock (c->mainloop); } GstMixerFlags gst_pulsemixer_ctrl_get_mixer_flags (GstPulseMixerCtrl * mixer) { return GST_MIXER_FLAG_AUTO_NOTIFICATIONS; } gst-plugins-good-0.10.31/ext/pulse/pulsesrc.h0000644000175000017500000000472411677341654015765 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSESRC_H__ #define __GST_PULSESRC_H__ #include #include #include #include #include "pulsemixerctrl.h" #include "pulseprobe.h" G_BEGIN_DECLS #define GST_TYPE_PULSESRC \ (gst_pulsesrc_get_type()) #define GST_PULSESRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSESRC,GstPulseSrc)) #define GST_PULSESRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSESRC,GstPulseSrcClass)) #define GST_IS_PULSESRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSESRC)) #define GST_IS_PULSESRC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSESRC)) #define GST_PULSESRC_CAST(obj) \ ((GstPulseSrc *)(obj)) typedef struct _GstPulseSrc GstPulseSrc; typedef struct _GstPulseSrcClass GstPulseSrcClass; struct _GstPulseSrc { GstAudioSrc src; gchar *server, *device, *client_name; pa_threaded_mainloop *mainloop; pa_context *context; pa_stream *stream; guint32 source_output_idx; pa_sample_spec sample_spec; const void *read_buffer; size_t read_buffer_length; gchar *device_description; GstPulseMixerCtrl *mixer; GstPulseProbe *probe; #ifdef HAVE_PULSE_1_0 gdouble volume; gboolean volume_set:1; gboolean mute:1; gboolean mute_set:1; gint notify; /* atomic */ #endif gboolean corked:1; gboolean operation_success:1; gboolean paused:1; gboolean in_read:1; GstStructure *properties; pa_proplist *proplist; }; struct _GstPulseSrcClass { GstAudioSrcClass parent_class; }; GType gst_pulsesrc_get_type (void); G_END_DECLS #endif /* __GST_PULSESRC_H__ */ gst-plugins-good-0.10.31/ext/pulse/pulsemixer.h0000644000175000017500000000354511671175352016314 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSEMIXER_H__ #define __GST_PULSEMIXER_H__ #include #include #include #include "pulsemixerctrl.h" #include "pulseprobe.h" G_BEGIN_DECLS #define GST_TYPE_PULSEMIXER \ (gst_pulsemixer_get_type()) #define GST_PULSEMIXER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PULSEMIXER,GstPulseMixer)) #define GST_PULSEMIXER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PULSEMIXER,GstPulseMixerClass)) #define GST_IS_PULSEMIXER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PULSEMIXER)) #define GST_IS_PULSEMIXER_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSEMIXER)) typedef struct _GstPulseMixer GstPulseMixer; typedef struct _GstPulseMixerClass GstPulseMixerClass; struct _GstPulseMixer { GstElement parent; gchar *server, *device; GstPulseMixerCtrl *mixer; GstPulseProbe *probe; }; struct _GstPulseMixerClass { GstElementClass parent_class; }; GType gst_pulsemixer_get_type (void); G_END_DECLS #endif /* __GST_PULSEMIXER_H__ */ gst-plugins-good-0.10.31/ext/pulse/pulsemixertrack.h0000644000175000017500000000350511671175352017335 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSEMIXERTRACK_H__ #define __GST_PULSEMIXERTRACK_H__ #include #include "pulsemixerctrl.h" G_BEGIN_DECLS #define GST_TYPE_PULSEMIXER_TRACK \ (gst_pulsemixer_track_get_type()) #define GST_PULSEMIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PULSEMIXER_TRACK, GstPulseMixerTrack)) #define GST_PULSEMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PULSEMIXER_TRACK, GstPulseMixerTrackClass)) #define GST_IS_PULSEMIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PULSEMIXER_TRACK)) #define GST_IS_PULSEMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PULSEMIXER_TRACK)) typedef struct _GstPulseMixerTrack { GstMixerTrack parent; GstPulseMixerCtrl *control; } GstPulseMixerTrack; typedef struct _GstPulseMixerTrackClass { GstMixerTrackClass parent; } GstPulseMixerTrackClass; GType gst_pulsemixer_track_get_type (void); GstMixerTrack *gst_pulsemixer_track_new (GstPulseMixerCtrl * control); G_END_DECLS #endif gst-plugins-good-0.10.31/ext/pulse/pulseaudiosink.c0000644000175000017500000007023711677341654017161 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* GStreamer pulseaudio plugin * * Copyright (c) 2011 Intel Corporation * 2011 Collabora * 2011 Arun Raghavan * 2011 Sebastian Dröge * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ /** * SECTION:element-pulseaudiosink * @see_also: pulsesink, pulsesrc, pulsemixer * * This element outputs audio to a * PulseAudio sound server via * the @pulsesink element. It transparently takes care of passing compressed * format as-is if the sink supports it, decoding if necessary, and changes * to supported formats at runtime. * * * Example pipelines * |[ * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! pulseaudiosink * ]| Decode and play an Ogg/Vorbis file. * |[ * gst-launch -v filesrc location=test.mp3 ! mp3parse ! pulseaudiosink stream-properties="props,media.title=test" * ]| Play an MP3 file on a sink that supports decoding directly, plug in a * decoder if/when required. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_PULSE_1_0 #include #include #include #include #include "pulsesink.h" GST_DEBUG_CATEGORY (pulseaudiosink_debug); #define GST_CAT_DEFAULT (pulseaudiosink_debug) #define GST_PULSE_AUDIO_SINK_LOCK(obj) G_STMT_START { \ GST_LOG_OBJECT (obj, \ "locking from thread %p", \ g_thread_self ()); \ g_mutex_lock (GST_PULSE_AUDIO_SINK_CAST(obj)->lock); \ GST_LOG_OBJECT (obj, \ "locked from thread %p", \ g_thread_self ()); \ } G_STMT_END #define GST_PULSE_AUDIO_SINK_UNLOCK(obj) G_STMT_START { \ GST_LOG_OBJECT (obj, \ "unlocking from thread %p", \ g_thread_self ()); \ g_mutex_unlock (GST_PULSE_AUDIO_SINK_CAST(obj)->lock); \ } G_STMT_END typedef struct { GstBin parent; GMutex *lock; GstPad *sinkpad; GstPad *sink_proxypad; GstPadEventFunction sinkpad_old_eventfunc; GstPadEventFunction proxypad_old_eventfunc; GstPulseSink *psink; GstElement *dbin2; GstSegment segment; guint event_probe_id; gulong pad_added_id; gboolean format_lost; } GstPulseAudioSink; typedef struct { GstBinClass parent_class; guint n_prop_own; guint n_prop_total; } GstPulseAudioSinkClass; static void gst_pulse_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_pulse_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pulse_audio_sink_dispose (GObject * object); static gboolean gst_pulse_audio_sink_src_event (GstPad * pad, GstEvent * event); static gboolean gst_pulse_audio_sink_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_pulse_audio_sink_sink_acceptcaps (GstPad * pad, GstCaps * caps); static gboolean gst_pulse_audio_sink_sink_setcaps (GstPad * pad, GstCaps * caps); static GstStateChangeReturn gst_pulse_audio_sink_change_state (GstElement * element, GstStateChange transition); static void gst_pulse_audio_sink_do_init (GType type) { GST_DEBUG_CATEGORY_INIT (pulseaudiosink_debug, "pulseaudiosink", 0, "Bin that wraps pulsesink for handling compressed formats"); } GST_BOILERPLATE_FULL (GstPulseAudioSink, gst_pulse_audio_sink, GstBin, GST_TYPE_BIN, gst_pulse_audio_sink_do_init); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (PULSE_SINK_TEMPLATE_CAPS)); static void gst_pulse_audio_sink_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "Bin wrapping pulsesink", "Sink/Audio/Bin", "Correctly handles sink changes when streaming compressed formats to " "pulsesink", "Arun Raghavan "); } static GParamSpec * param_spec_copy (GParamSpec * spec) { const char *name, *nick, *blurb; GParamFlags flags; name = g_param_spec_get_name (spec); nick = g_param_spec_get_nick (spec); blurb = g_param_spec_get_blurb (spec); flags = spec->flags; if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_BOOLEAN) { return g_param_spec_boolean (name, nick, blurb, G_PARAM_SPEC_BOOLEAN (spec)->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_BOXED) { return g_param_spec_boxed (name, nick, blurb, spec->value_type, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_CHAR) { GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (spec); return g_param_spec_char (name, nick, blurb, cspec->minimum, cspec->maximum, cspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_DOUBLE) { GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (spec); return g_param_spec_double (name, nick, blurb, dspec->minimum, dspec->maximum, dspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_ENUM) { return g_param_spec_enum (name, nick, blurb, spec->value_type, G_PARAM_SPEC_ENUM (spec)->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_FLAGS) { return g_param_spec_flags (name, nick, blurb, spec->value_type, G_PARAM_SPEC_ENUM (spec)->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_FLOAT) { GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (spec); return g_param_spec_double (name, nick, blurb, fspec->minimum, fspec->maximum, fspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_GTYPE) { return g_param_spec_gtype (name, nick, blurb, G_PARAM_SPEC_GTYPE (spec)->is_a_type, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_INT) { GParamSpecInt *ispec = G_PARAM_SPEC_INT (spec); return g_param_spec_int (name, nick, blurb, ispec->minimum, ispec->maximum, ispec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_INT64) { GParamSpecInt64 *ispec = G_PARAM_SPEC_INT64 (spec); return g_param_spec_int64 (name, nick, blurb, ispec->minimum, ispec->maximum, ispec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_LONG) { GParamSpecLong *lspec = G_PARAM_SPEC_LONG (spec); return g_param_spec_long (name, nick, blurb, lspec->minimum, lspec->maximum, lspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_OBJECT) { return g_param_spec_object (name, nick, blurb, spec->value_type, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_PARAM) { return g_param_spec_param (name, nick, blurb, spec->value_type, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_POINTER) { return g_param_spec_pointer (name, nick, blurb, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_STRING) { return g_param_spec_string (name, nick, blurb, G_PARAM_SPEC_STRING (spec)->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UCHAR) { GParamSpecUChar *cspec = G_PARAM_SPEC_UCHAR (spec); return g_param_spec_uchar (name, nick, blurb, cspec->minimum, cspec->maximum, cspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UINT) { GParamSpecUInt *ispec = G_PARAM_SPEC_UINT (spec); return g_param_spec_uint (name, nick, blurb, ispec->minimum, ispec->maximum, ispec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UINT64) { GParamSpecUInt64 *ispec = G_PARAM_SPEC_UINT64 (spec); return g_param_spec_uint64 (name, nick, blurb, ispec->minimum, ispec->maximum, ispec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_ULONG) { GParamSpecULong *lspec = G_PARAM_SPEC_ULONG (spec); return g_param_spec_ulong (name, nick, blurb, lspec->minimum, lspec->maximum, lspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_UNICHAR) { return g_param_spec_unichar (name, nick, blurb, G_PARAM_SPEC_UNICHAR (spec)->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == G_TYPE_PARAM_VARIANT) { GParamSpecVariant *vspec = G_PARAM_SPEC_VARIANT (spec); return g_param_spec_variant (name, nick, blurb, vspec->type, vspec->default_value, flags); } if (G_PARAM_SPEC_TYPE (spec) == GST_TYPE_PARAM_MINI_OBJECT) { return gst_param_spec_mini_object (name, nick, blurb, spec->value_type, flags); } g_warning ("Unknown param type %ld for '%s'", (long) G_PARAM_SPEC_TYPE (spec), name); g_assert_not_reached (); } static void gst_pulse_audio_sink_class_init (GstPulseAudioSinkClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *element_class = (GstElementClass *) klass; GstPulseSinkClass *psink_class = GST_PULSESINK_CLASS (g_type_class_ref (GST_TYPE_PULSESINK)); GParamSpec **specs; guint n, i, j; gobject_class->get_property = gst_pulse_audio_sink_get_property; gobject_class->set_property = gst_pulse_audio_sink_set_property; gobject_class->dispose = gst_pulse_audio_sink_dispose; element_class->change_state = GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_change_state); /* Find out how many properties we already have */ specs = g_object_class_list_properties (gobject_class, &klass->n_prop_own); g_free (specs); /* Proxy pulsesink's properties */ specs = g_object_class_list_properties (G_OBJECT_CLASS (psink_class), &n); for (i = 0, j = klass->n_prop_own; i < n; i++) { if (g_object_class_find_property (gobject_class, g_param_spec_get_name (specs[i]))) { /* We already inherited this property from a parent, skip */ j--; } else { g_object_class_install_property (gobject_class, i + j + 1, param_spec_copy (specs[i])); } } klass->n_prop_total = i + j; g_free (specs); g_type_class_unref (psink_class); } static GstPad * get_proxypad (GstPad * sinkpad) { GstIterator *iter = NULL; GstPad *proxypad = NULL; iter = gst_pad_iterate_internal_links (sinkpad); if (iter) { if (gst_iterator_next (iter, (gpointer) & proxypad) != GST_ITERATOR_OK) proxypad = NULL; gst_iterator_free (iter); } return proxypad; } static void post_missing_element_message (GstPulseAudioSink * pbin, const gchar * name) { GstMessage *msg; msg = gst_missing_element_message_new (GST_ELEMENT_CAST (pbin), name); gst_element_post_message (GST_ELEMENT_CAST (pbin), msg); } static void notify_cb (GObject * selector, GParamSpec * pspec, GstPulseAudioSink * pbin) { g_object_notify (G_OBJECT (pbin), g_param_spec_get_name (pspec)); } static void gst_pulse_audio_sink_init (GstPulseAudioSink * pbin, GstPulseAudioSinkClass * klass) { GstPadTemplate *template; GstPad *pad = NULL; GParamSpec **specs; GString *prop; guint i; pbin->lock = g_mutex_new (); gst_segment_init (&pbin->segment, GST_FORMAT_UNDEFINED); pbin->psink = GST_PULSESINK (gst_element_factory_make ("pulsesink", "pulseaudiosink-sink")); g_assert (pbin->psink != NULL); if (!gst_bin_add (GST_BIN (pbin), GST_ELEMENT (pbin->psink))) { GST_ERROR_OBJECT (pbin, "Failed to add pulsesink to bin"); goto error; } pad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); template = gst_static_pad_template_get (&sink_template); pbin->sinkpad = gst_ghost_pad_new_from_template ("sink", pad, template); gst_object_unref (template); pbin->sinkpad_old_eventfunc = GST_PAD_EVENTFUNC (pbin->sinkpad); gst_pad_set_event_function (pbin->sinkpad, GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_sink_event)); gst_pad_set_setcaps_function (pbin->sinkpad, GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_sink_setcaps)); gst_pad_set_acceptcaps_function (pbin->sinkpad, GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_sink_acceptcaps)); gst_element_add_pad (GST_ELEMENT (pbin), pbin->sinkpad); if (!(pbin->sink_proxypad = get_proxypad (pbin->sinkpad))) GST_ERROR_OBJECT (pbin, "Failed to get proxypad of srcpad"); else { pbin->proxypad_old_eventfunc = GST_PAD_EVENTFUNC (pbin->sink_proxypad); gst_pad_set_event_function (pbin->sink_proxypad, GST_DEBUG_FUNCPTR (gst_pulse_audio_sink_src_event)); } /* Now proxy all the notify::* signals */ specs = g_object_class_list_properties (G_OBJECT_CLASS (klass), &i); prop = g_string_sized_new (30); for (i--; i >= klass->n_prop_own; i--) { g_string_printf (prop, "notify::%s", g_param_spec_get_name (specs[i])); g_signal_connect (pbin->psink, prop->str, G_CALLBACK (notify_cb), pbin); } g_string_free (prop, TRUE); g_free (specs); pbin->format_lost = FALSE; out: if (pad) gst_object_unref (pad); return; error: if (pbin->psink) gst_object_unref (pbin->psink); goto out; } static void gst_pulse_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (object); GstPulseAudioSinkClass *klass = GST_PULSE_AUDIO_SINK_CLASS (G_OBJECT_GET_CLASS (object)); g_return_if_fail (prop_id <= klass->n_prop_total); g_object_set_property (G_OBJECT (pbin->psink), g_param_spec_get_name (pspec), value); } static void gst_pulse_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (object); GstPulseAudioSinkClass *klass = GST_PULSE_AUDIO_SINK_CLASS (G_OBJECT_GET_CLASS (object)); g_return_if_fail (prop_id <= klass->n_prop_total); g_object_get_property (G_OBJECT (pbin->psink), g_param_spec_get_name (pspec), value); } static void gst_pulse_audio_sink_free_dbin2 (GstPulseAudioSink * pbin) { g_signal_handler_disconnect (pbin->dbin2, pbin->pad_added_id); gst_element_set_state (pbin->dbin2, GST_STATE_NULL); gst_bin_remove (GST_BIN (pbin), pbin->dbin2); pbin->dbin2 = NULL; } static void gst_pulse_audio_sink_dispose (GObject * object) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (object); if (pbin->lock) { g_mutex_free (pbin->lock); pbin->lock = NULL; } if (pbin->sink_proxypad) { gst_object_unref (pbin->sink_proxypad); pbin->sink_proxypad = NULL; } if (pbin->dbin2) { g_signal_handler_disconnect (pbin->dbin2, pbin->pad_added_id); pbin->dbin2 = NULL; } pbin->sinkpad = NULL; pbin->psink = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } static gboolean gst_pulse_audio_sink_update_sinkpad (GstPulseAudioSink * pbin, GstPad * sinkpad) { gboolean ret; ret = gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (pbin->sinkpad), sinkpad); if (!ret) GST_WARNING_OBJECT (pbin, "Could not update ghostpad target"); return ret; } static void distribute_running_time (GstElement * element, const GstSegment * segment) { GstEvent *event; GstPad *pad; pad = gst_element_get_static_pad (element, "sink"); /* FIXME: Some decoders collect newsegments and send them out at once, making * them lose accumulator events (and thus making dbin2_event_probe() hard to * do right if we're sending these as well. We can get away with not sending * these at the moment, but this should be fixed! */ #if 0 if (segment->accum) { event = gst_event_new_new_segment_full (FALSE, segment->rate, segment->applied_rate, segment->format, 0, segment->accum, 0); gst_pad_send_event (pad, event); } #endif event = gst_event_new_new_segment_full (FALSE, segment->rate, segment->applied_rate, segment->format, segment->start, segment->stop, segment->time); gst_pad_send_event (pad, event); gst_object_unref (pad); } static gboolean dbin2_event_probe (GstPad * pad, GstMiniObject * obj, gpointer data) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (data); GstEvent *event = GST_EVENT (obj); if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { GST_DEBUG_OBJECT (pbin, "Got newsegment - dropping"); gst_pad_remove_event_probe (pad, pbin->event_probe_id); return FALSE; } return TRUE; } static void pad_added_cb (GstElement * dbin2, GstPad * pad, gpointer * data) { GstPulseAudioSink *pbin; GstPad *sinkpad = NULL; pbin = GST_PULSE_AUDIO_SINK (data); sinkpad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); GST_PULSE_AUDIO_SINK_LOCK (pbin); if (gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK) GST_ERROR_OBJECT (pbin, "Failed to link decodebin2 to pulsesink"); else GST_DEBUG_OBJECT (pbin, "Linked new pad to pulsesink"); GST_PULSE_AUDIO_SINK_UNLOCK (pbin); gst_object_unref (sinkpad); } /* Called with pbin lock held */ static void gst_pulse_audio_sink_add_dbin2 (GstPulseAudioSink * pbin) { GstPad *sinkpad = NULL; g_assert (pbin->dbin2 == NULL); pbin->dbin2 = gst_element_factory_make ("decodebin2", "pulseaudiosink-dbin2"); if (!pbin->dbin2) { post_missing_element_message (pbin, "decodebin2"); GST_ELEMENT_WARNING (pbin, CORE, MISSING_PLUGIN, (_("Missing element '%s' - check your GStreamer installation."), "decodebin2"), ("audio playback might fail")); goto out; } if (!gst_bin_add (GST_BIN (pbin), pbin->dbin2)) { GST_ERROR_OBJECT (pbin, "Failed to add decodebin2 to bin"); goto out; } pbin->pad_added_id = g_signal_connect (pbin->dbin2, "pad-added", G_CALLBACK (pad_added_cb), pbin); if (!gst_element_sync_state_with_parent (pbin->dbin2)) { GST_ERROR_OBJECT (pbin, "Failed to set decodebin2 to parent state"); goto out; } /* Trap the newsegment events that we feed the decodebin and discard them */ sinkpad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); pbin->event_probe_id = gst_pad_add_event_probe_full (sinkpad, G_CALLBACK (dbin2_event_probe), gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); gst_object_unref (sinkpad); sinkpad = NULL; GST_DEBUG_OBJECT (pbin, "Distributing running time to decodebin"); distribute_running_time (pbin->dbin2, &pbin->segment); sinkpad = gst_element_get_static_pad (pbin->dbin2, "sink"); gst_pulse_audio_sink_update_sinkpad (pbin, sinkpad); out: if (sinkpad) gst_object_unref (sinkpad); } static void update_eac3_alignment (GstPulseAudioSink * pbin) { GstCaps *caps = gst_pad_peer_get_caps_reffed (pbin->sinkpad); GstStructure *st; if (!caps) return; st = gst_caps_get_structure (caps, 0); if (g_str_equal (gst_structure_get_name (st), "audio/x-eac3")) { GstStructure *event_st = gst_structure_new ("ac3parse-set-alignment", "alignment", G_TYPE_STRING, pbin->dbin2 ? "frame" : "iec61937", NULL); if (!gst_pad_push_event (pbin->sinkpad, gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, event_st))) GST_WARNING_OBJECT (pbin->sinkpad, "Could not update alignment"); } gst_caps_unref (caps); } static void proxypad_blocked_cb (GstPad * pad, gboolean blocked, gpointer data) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (data); GstCaps *caps; GstPad *sinkpad = NULL; if (!blocked) { /* Unblocked, don't need to do anything */ GST_DEBUG_OBJECT (pbin, "unblocked"); return; } GST_DEBUG_OBJECT (pbin, "blocked"); GST_PULSE_AUDIO_SINK_LOCK (pbin); if (!pbin->format_lost) { sinkpad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); if (GST_PAD_CAPS (pbin->sinkpad)) { /* See if we already got caps on our sinkpad */ caps = gst_caps_ref (GST_PAD_CAPS (pbin->sinkpad)); } else { /* We haven't, so get caps from upstream */ caps = gst_pad_get_caps_reffed (pad); } if (gst_pad_accept_caps (sinkpad, caps)) { if (pbin->dbin2) { GST_DEBUG_OBJECT (pbin, "Removing decodebin"); gst_pulse_audio_sink_free_dbin2 (pbin); gst_pulse_audio_sink_update_sinkpad (pbin, sinkpad); } else GST_DEBUG_OBJECT (pbin, "Doing nothing"); gst_caps_unref (caps); gst_object_unref (sinkpad); goto done; } /* pulsesink doesn't accept the incoming caps, so add a decodebin * (potentially after removing the existing once, since decodebin2 can't * renegotiate). */ } else { /* Format lost, proceed to try plugging a decodebin */ pbin->format_lost = FALSE; } if (pbin->dbin2 != NULL) { /* decodebin2 doesn't support reconfiguration, so throw this one away and * create a new one. */ gst_pulse_audio_sink_free_dbin2 (pbin); } GST_DEBUG_OBJECT (pbin, "Adding decodebin"); gst_pulse_audio_sink_add_dbin2 (pbin); done: update_eac3_alignment (pbin); gst_pad_set_blocked_async_full (pad, FALSE, proxypad_blocked_cb, gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); GST_PULSE_AUDIO_SINK_UNLOCK (pbin); } static gboolean gst_pulse_audio_sink_src_event (GstPad * pad, GstEvent * event) { GstPulseAudioSink *pbin = NULL; GstPad *ghostpad = NULL; gboolean ret = FALSE; ghostpad = GST_PAD_CAST (gst_pad_get_parent (pad)); if (G_UNLIKELY (!ghostpad)) { GST_WARNING_OBJECT (pad, "Could not get ghostpad"); goto out; } pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (ghostpad)); if (G_UNLIKELY (!pbin)) { GST_WARNING_OBJECT (pad, "Could not get pulseaudiosink"); goto out; } if (G_UNLIKELY (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_UPSTREAM) && (gst_event_has_name (event, "pulse-format-lost") || gst_event_has_name (event, "pulse-sink-changed"))) { g_return_val_if_fail (pad->mode != GST_ACTIVATE_PULL, FALSE); GST_PULSE_AUDIO_SINK_LOCK (pbin); if (gst_event_has_name (event, "pulse-format-lost")) pbin->format_lost = TRUE; if (!gst_pad_is_blocked (pad)) gst_pad_set_blocked_async_full (pad, TRUE, proxypad_blocked_cb, gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); GST_PULSE_AUDIO_SINK_UNLOCK (pbin); ret = TRUE; } else if (pbin->proxypad_old_eventfunc) { ret = pbin->proxypad_old_eventfunc (pad, event); event = NULL; } out: if (ghostpad) gst_object_unref (ghostpad); if (pbin) gst_object_unref (pbin); if (event) gst_event_unref (event); return ret; } static gboolean gst_pulse_audio_sink_sink_event (GstPad * pad, GstEvent * event) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (pad)); gboolean ret; ret = pbin->sinkpad_old_eventfunc (pad, gst_event_ref (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time; gboolean update; GST_PULSE_AUDIO_SINK_LOCK (pbin); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); GST_DEBUG_OBJECT (pbin, "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); if (format == GST_FORMAT_TIME) { /* Store the values for feeding to sub-elements */ gst_segment_set_newsegment_full (&pbin->segment, update, rate, arate, format, start, stop, time); } else { GST_WARNING_OBJECT (pbin, "Got a non-TIME format segment"); gst_segment_init (&pbin->segment, GST_FORMAT_TIME); } GST_PULSE_AUDIO_SINK_UNLOCK (pbin); break; } case GST_EVENT_FLUSH_STOP: GST_PULSE_AUDIO_SINK_LOCK (pbin); gst_segment_init (&pbin->segment, GST_FORMAT_UNDEFINED); GST_PULSE_AUDIO_SINK_UNLOCK (pbin); break; default: break; } gst_object_unref (pbin); gst_event_unref (event); return ret; } /* The bin's acceptcaps should be exactly equivalent to a pulsesink that is * connected to a sink that supports all the formats in template caps. This * means that upstream will have to have everything possibly upto a parser * plugged and we plugin a decoder whenever required. */ static gboolean gst_pulse_audio_sink_sink_acceptcaps (GstPad * pad, GstCaps * caps) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (pad)); GstRingBufferSpec spec = { 0 }; const GstStructure *st; GstCaps *pad_caps = NULL; gboolean ret = FALSE; pad_caps = gst_pad_get_caps_reffed (pad); if (!pad_caps || !gst_caps_can_intersect (pad_caps, caps)) goto out; /* If we've not got fixed caps, creating a stream might fail, so let's just * return from here with default acceptcaps behaviour */ if (!gst_caps_is_fixed (caps)) goto out; spec.latency_time = GST_BASE_AUDIO_SINK (pbin->psink)->latency_time; if (!gst_ring_buffer_parse_caps (&spec, caps)) goto out; /* Make sure non-raw input is framed (one frame per buffer) and can be * payloaded */ st = gst_caps_get_structure (caps, 0); if (!g_str_has_prefix (gst_structure_get_name (st), "audio/x-raw")) { gboolean framed = FALSE, parsed = FALSE; gst_structure_get_boolean (st, "framed", &framed); gst_structure_get_boolean (st, "parsed", &parsed); if ((!framed && !parsed) || gst_audio_iec61937_frame_size (&spec) <= 0) goto out; } ret = TRUE; out: if (pad_caps) gst_caps_unref (pad_caps); gst_object_unref (pbin); return ret; } static gboolean gst_pulse_audio_sink_sink_setcaps (GstPad * pad, GstCaps * caps) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (gst_pad_get_parent (pad)); gboolean ret = TRUE; GST_PULSE_AUDIO_SINK_LOCK (pbin); if (!gst_pad_is_blocked (pbin->sinkpad)) gst_pad_set_blocked_async_full (pbin->sink_proxypad, TRUE, proxypad_blocked_cb, gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); GST_PULSE_AUDIO_SINK_UNLOCK (pbin); gst_object_unref (pbin); return ret; } static GstStateChangeReturn gst_pulse_audio_sink_change_state (GstElement * element, GstStateChange transition) { GstPulseAudioSink *pbin = GST_PULSE_AUDIO_SINK (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; /* Nothing to do for upward transitions */ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: GST_PULSE_AUDIO_SINK_LOCK (pbin); if (gst_pad_is_blocked (pbin->sinkpad)) { gst_pad_set_blocked_async_full (pbin->sink_proxypad, FALSE, proxypad_blocked_cb, gst_object_ref (pbin), (GDestroyNotify) gst_object_unref); } GST_PULSE_AUDIO_SINK_UNLOCK (pbin); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (pbin, "Base class returned %d on state change", ret); goto out; } switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: GST_PULSE_AUDIO_SINK_LOCK (pbin); gst_segment_init (&pbin->segment, GST_FORMAT_UNDEFINED); if (pbin->dbin2) { GstPad *pad = gst_element_get_static_pad (GST_ELEMENT (pbin->psink), "sink"); gst_pulse_audio_sink_free_dbin2 (pbin); gst_pulse_audio_sink_update_sinkpad (pbin, pad); gst_object_unref (pad); } GST_PULSE_AUDIO_SINK_UNLOCK (pbin); break; default: break; } out: return ret; } #endif /* HAVE_PULSE_1_0 */ gst-plugins-good-0.10.31/ext/pulse/pulsemixer.c0000644000175000017500000001723611671175352016311 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ /** * SECTION:element-pulsemixer * @see_also: pulsesrc, pulsesink * * This element lets you adjust sound input and output levels for the * PulseAudio sound server. It supports the GstMixer interface, which can be * used to obtain a list of available mixer tracks. Set the mixer element to * READY state before using the GstMixer interface on it. * * * Example pipelines * * pulsemixer can't be used in a sensible way in gst-launch. * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "pulsemixer.h" enum { PROP_SERVER = 1, PROP_DEVICE, PROP_DEVICE_NAME }; GST_DEBUG_CATEGORY_EXTERN (pulse_debug); #define GST_CAT_DEFAULT pulse_debug static void gst_pulsemixer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pulsemixer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_pulsemixer_finalize (GObject * object); static GstStateChangeReturn gst_pulsemixer_change_state (GstElement * element, GstStateChange transition); static void gst_pulsemixer_init_interfaces (GType type); GST_IMPLEMENT_PULSEMIXER_CTRL_METHODS (GstPulseMixer, gst_pulsemixer); GST_IMPLEMENT_PULSEPROBE_METHODS (GstPulseMixer, gst_pulsemixer); GST_BOILERPLATE_FULL (GstPulseMixer, gst_pulsemixer, GstElement, GST_TYPE_ELEMENT, gst_pulsemixer_init_interfaces); static gboolean gst_pulsemixer_interface_supported (GstImplementsInterface * iface, GType interface_type) { GstPulseMixer *this = GST_PULSEMIXER (iface); if (interface_type == GST_TYPE_MIXER && this->mixer) return TRUE; if (interface_type == GST_TYPE_PROPERTY_PROBE && this->probe) return TRUE; return FALSE; } static void gst_pulsemixer_implements_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_pulsemixer_interface_supported; } static void gst_pulsemixer_init_interfaces (GType type) { static const GInterfaceInfo implements_iface_info = { (GInterfaceInitFunc) gst_pulsemixer_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo mixer_iface_info = { (GInterfaceInitFunc) gst_pulsemixer_mixer_interface_init, NULL, NULL, }; static const GInterfaceInfo probe_iface_info = { (GInterfaceInitFunc) gst_pulsemixer_property_probe_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_iface_info); g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &probe_iface_info); } static void gst_pulsemixer_base_init (gpointer g_class) { gst_element_class_set_details_simple (GST_ELEMENT_CLASS (g_class), "PulseAudio Mixer", "Generic/Audio", "Control sound input and output levels for PulseAudio", "Lennart Poettering"); } static void gst_pulsemixer_class_init (GstPulseMixerClass * g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_pulsemixer_change_state); gobject_class->finalize = gst_pulsemixer_finalize; gobject_class->get_property = gst_pulsemixer_get_property; gobject_class->set_property = gst_pulsemixer_set_property; g_object_class_install_property (gobject_class, PROP_SERVER, g_param_spec_string ("server", "Server", "The PulseAudio server to connect to", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "The PulseAudio sink or source to control", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } static void gst_pulsemixer_init (GstPulseMixer * this, GstPulseMixerClass * g_class) { this->mixer = NULL; this->server = NULL; this->device = NULL; this->probe = gst_pulseprobe_new (G_OBJECT (this), G_OBJECT_GET_CLASS (this), PROP_DEVICE, this->device, TRUE, TRUE); } static void gst_pulsemixer_finalize (GObject * object) { GstPulseMixer *this = GST_PULSEMIXER (object); g_free (this->server); g_free (this->device); if (this->mixer) { gst_pulsemixer_ctrl_free (this->mixer); this->mixer = NULL; } if (this->probe) { gst_pulseprobe_free (this->probe); this->probe = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_pulsemixer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPulseMixer *this = GST_PULSEMIXER (object); switch (prop_id) { case PROP_SERVER: g_free (this->server); this->server = g_value_dup_string (value); if (this->probe) gst_pulseprobe_set_server (this->probe, this->server); break; case PROP_DEVICE: g_free (this->device); this->device = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_pulsemixer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPulseMixer *this = GST_PULSEMIXER (object); switch (prop_id) { case PROP_SERVER: g_value_set_string (value, this->server); break; case PROP_DEVICE: g_value_set_string (value, this->device); break; case PROP_DEVICE_NAME: if (this->mixer) { char *t = g_strdup_printf ("%s: %s", this->mixer->type == GST_PULSEMIXER_SINK ? "Playback" : "Capture", this->mixer->description); g_value_take_string (value, t); } else g_value_set_string (value, NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_pulsemixer_change_state (GstElement * element, GstStateChange transition) { GstPulseMixer *this = GST_PULSEMIXER (element); GstStateChangeReturn res; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!this->mixer) this->mixer = gst_pulsemixer_ctrl_new (G_OBJECT (this), this->server, this->device, GST_PULSEMIXER_UNKNOWN); break; default: ; } res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (this->mixer) { gst_pulsemixer_ctrl_free (this->mixer); this->mixer = NULL; } break; default: ; } return res; } gst-plugins-good-0.10.31/ext/pulse/pulsesrc.c0000644000175000017500000013726411707322454015755 00000000000000/* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ /** * SECTION:element-pulsesrc * @see_also: pulsesink, pulsemixer * * This element captures audio from a * PulseAudio sound server. * * * Example pipelines * |[ * gst-launch -v pulsesrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=alsasrc.ogg * ]| Record from a sound card using pulseaudio and encode to Ogg/Vorbis. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #ifdef HAVE_PULSE_1_0 #include #endif #include "pulsesrc.h" #include "pulseutil.h" #include "pulsemixerctrl.h" GST_DEBUG_CATEGORY_EXTERN (pulse_debug); #define GST_CAT_DEFAULT pulse_debug #define DEFAULT_SERVER NULL #define DEFAULT_DEVICE NULL #define DEFAULT_DEVICE_NAME NULL #ifdef HAVE_PULSE_1_0 #define DEFAULT_VOLUME 1.0 #define DEFAULT_MUTE FALSE #define MAX_VOLUME 10.0 #endif enum { PROP_0, PROP_SERVER, PROP_DEVICE, PROP_DEVICE_NAME, PROP_CLIENT, PROP_STREAM_PROPERTIES, PROP_SOURCE_OUTPUT_INDEX, #ifdef HAVE_PULSE_1_0 PROP_VOLUME, PROP_MUTE, #endif PROP_LAST }; static void gst_pulsesrc_destroy_stream (GstPulseSrc * pulsesrc); static void gst_pulsesrc_destroy_context (GstPulseSrc * pulsesrc); static void gst_pulsesrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_pulsesrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_pulsesrc_finalize (GObject * object); static gboolean gst_pulsesrc_open (GstAudioSrc * asrc); static gboolean gst_pulsesrc_close (GstAudioSrc * asrc); static gboolean gst_pulsesrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec); static gboolean gst_pulsesrc_unprepare (GstAudioSrc * asrc); static guint gst_pulsesrc_read (GstAudioSrc * asrc, gpointer data, guint length); static guint gst_pulsesrc_delay (GstAudioSrc * asrc); static void gst_pulsesrc_reset (GstAudioSrc * src); static gboolean gst_pulsesrc_negotiate (GstBaseSrc * basesrc); static GstStateChangeReturn gst_pulsesrc_change_state (GstElement * element, GstStateChange transition); static void gst_pulsesrc_init_interfaces (GType type); #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) # define ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN" #else # define ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN" #endif GST_IMPLEMENT_PULSEMIXER_CTRL_METHODS (GstPulseSrc, gst_pulsesrc); GST_IMPLEMENT_PULSEPROBE_METHODS (GstPulseSrc, gst_pulsesrc); GST_BOILERPLATE_FULL (GstPulseSrc, gst_pulsesrc, GstAudioSrc, GST_TYPE_AUDIO_SRC, gst_pulsesrc_init_interfaces); static gboolean gst_pulsesrc_interface_supported (GstImplementsInterface * iface, GType interface_type) { GstPulseSrc *this = GST_PULSESRC_CAST (iface); if (interface_type == GST_TYPE_MIXER && this->mixer) return TRUE; if (interface_type == GST_TYPE_PROPERTY_PROBE && this->probe) return TRUE; #ifdef HAVE_PULSE_1_0 if (interface_type == GST_TYPE_STREAM_VOLUME) return TRUE; #endif return FALSE; } static void gst_pulsesrc_implements_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_pulsesrc_interface_supported; } static void gst_pulsesrc_init_interfaces (GType type) { #ifdef HAVE_PULSE_1_0 static const GInterfaceInfo svol_iface_info = { NULL, NULL, NULL, }; #endif static const GInterfaceInfo implements_iface_info = { (GInterfaceInitFunc) gst_pulsesrc_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo mixer_iface_info = { (GInterfaceInitFunc) gst_pulsesrc_mixer_interface_init, NULL, NULL, }; static const GInterfaceInfo probe_iface_info = { (GInterfaceInitFunc) gst_pulsesrc_property_probe_interface_init, NULL, NULL, }; #ifdef HAVE_PULSE_1_0 g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info); #endif g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_iface_info); g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &probe_iface_info); } static void gst_pulsesrc_base_init (gpointer g_class) { static GstStaticPadTemplate pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) { " ENDIANNESS " }, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" "audio/x-raw-float, " "endianness = (int) { " ENDIANNESS " }, " "width = (int) 32, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" "audio/x-raw-int, " "endianness = (int) { " ENDIANNESS " }, " "signed = (boolean) TRUE, " "width = (int) 32, " "depth = (int) 32, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" "audio/x-raw-int, " "signed = (boolean) FALSE, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];" "audio/x-alaw, " "rate = (int) [ 1, MAX], " "channels = (int) [ 1, 32 ];" "audio/x-mulaw, " "rate = (int) [ 1, MAX], " "channels = (int) [ 1, 32 ]") ); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "PulseAudio Audio Source", "Source/Audio", "Captures audio from a PulseAudio server", "Lennart Poettering"); gst_element_class_add_static_pad_template (element_class, &pad_template); } static void gst_pulsesrc_class_init (GstPulseSrcClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstAudioSrcClass *gstaudiosrc_class = GST_AUDIO_SRC_CLASS (klass); GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gchar *clientname; gobject_class->finalize = gst_pulsesrc_finalize; gobject_class->set_property = gst_pulsesrc_set_property; gobject_class->get_property = gst_pulsesrc_get_property; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_pulsesrc_change_state); gstbasesrc_class->negotiate = GST_DEBUG_FUNCPTR (gst_pulsesrc_negotiate); gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_pulsesrc_open); gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_pulsesrc_close); gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_pulsesrc_prepare); gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_pulsesrc_unprepare); gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_pulsesrc_read); gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_pulsesrc_delay); gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_pulsesrc_reset); /* Overwrite GObject fields */ g_object_class_install_property (gobject_class, PROP_SERVER, g_param_spec_string ("server", "Server", "The PulseAudio server to connect to", DEFAULT_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "The PulseAudio source device to connect to", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); clientname = gst_pulse_client_name (); /** * GstPulseSrc:client * * The PulseAudio client name to use. * * Since: 0.10.27 */ g_object_class_install_property (gobject_class, PROP_CLIENT, g_param_spec_string ("client", "Client", "The PulseAudio client_name_to_use", clientname, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY)); g_free (clientname); /** * GstPulseSrc:stream-properties * * List of pulseaudio stream properties. A list of defined properties can be * found in the pulseaudio api docs. * * Below is an example for registering as a music application to pulseaudio. * |[ * GstStructure *props; * * props = gst_structure_from_string ("props,media.role=music", NULL); * g_object_set (pulse, "stream-properties", props, NULL); * gst_structure_free (props); * ]| * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_STREAM_PROPERTIES, g_param_spec_boxed ("stream-properties", "stream properties", "list of pulseaudio stream properties", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstPulseSrc:source-output-index * * The index of the PulseAudio source output corresponding to this element. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_SOURCE_OUTPUT_INDEX, g_param_spec_uint ("source-output-index", "source output index", "The index of the PulseAudio source output corresponding to this " "record stream", 0, G_MAXUINT, PA_INVALID_INDEX, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); #ifdef HAVE_PULSE_1_0 /** * GstPulseSrc:volume * * The volume of the record stream. Only works when using PulseAudio 1.0 or * later. * * Since: 0.10.36 */ g_object_class_install_property (gobject_class, PROP_VOLUME, g_param_spec_double ("volume", "Volume", "Linear volume of this stream, 1.0=100%", 0.0, MAX_VOLUME, DEFAULT_VOLUME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstPulseSrc:mute * * Whether the stream is muted or not. Only works when using PulseAudio 1.0 * or later. * * Since: 0.10.36 */ g_object_class_install_property (gobject_class, PROP_MUTE, g_param_spec_boolean ("mute", "Mute", "Mute state of this stream", DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #endif } static void gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass) { pulsesrc->server = NULL; pulsesrc->device = NULL; pulsesrc->client_name = gst_pulse_client_name (); pulsesrc->device_description = NULL; pulsesrc->context = NULL; pulsesrc->stream = NULL; pulsesrc->source_output_idx = PA_INVALID_INDEX; pulsesrc->read_buffer = NULL; pulsesrc->read_buffer_length = 0; pa_sample_spec_init (&pulsesrc->sample_spec); pulsesrc->operation_success = FALSE; pulsesrc->paused = FALSE; pulsesrc->in_read = FALSE; #ifdef HAVE_PULSE_1_0 pulsesrc->volume = DEFAULT_VOLUME; pulsesrc->volume_set = FALSE; pulsesrc->mute = DEFAULT_MUTE; pulsesrc->mute_set = FALSE; pulsesrc->notify = 0; #endif pulsesrc->mixer = NULL; pulsesrc->properties = NULL; pulsesrc->proplist = NULL; pulsesrc->probe = gst_pulseprobe_new (G_OBJECT (pulsesrc), G_OBJECT_GET_CLASS (pulsesrc), PROP_DEVICE, pulsesrc->server, FALSE, TRUE); /* FALSE for sinks, TRUE for sources */ /* this should be the default but it isn't yet */ gst_base_audio_src_set_slave_method (GST_BASE_AUDIO_SRC (pulsesrc), GST_BASE_AUDIO_SRC_SLAVE_SKEW); } static void gst_pulsesrc_destroy_stream (GstPulseSrc * pulsesrc) { if (pulsesrc->stream) { pa_stream_disconnect (pulsesrc->stream); pa_stream_unref (pulsesrc->stream); pulsesrc->stream = NULL; pulsesrc->source_output_idx = PA_INVALID_INDEX; g_object_notify (G_OBJECT (pulsesrc), "source-output-index"); } g_free (pulsesrc->device_description); pulsesrc->device_description = NULL; } static void gst_pulsesrc_destroy_context (GstPulseSrc * pulsesrc) { gst_pulsesrc_destroy_stream (pulsesrc); if (pulsesrc->context) { pa_context_disconnect (pulsesrc->context); /* Make sure we don't get any further callbacks */ pa_context_set_state_callback (pulsesrc->context, NULL, NULL); #ifdef HAVE_PULSE_1_0 pa_context_set_subscribe_callback (pulsesrc->context, NULL, NULL); #endif pa_context_unref (pulsesrc->context); pulsesrc->context = NULL; } } static void gst_pulsesrc_finalize (GObject * object) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); g_free (pulsesrc->server); g_free (pulsesrc->device); g_free (pulsesrc->client_name); if (pulsesrc->properties) gst_structure_free (pulsesrc->properties); if (pulsesrc->proplist) pa_proplist_free (pulsesrc->proplist); if (pulsesrc->mixer) { gst_pulsemixer_ctrl_free (pulsesrc->mixer); pulsesrc->mixer = NULL; } if (pulsesrc->probe) { gst_pulseprobe_free (pulsesrc->probe); pulsesrc->probe = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } #define CONTEXT_OK(c) ((c) && PA_CONTEXT_IS_GOOD (pa_context_get_state ((c)))) #define STREAM_OK(s) ((s) && PA_STREAM_IS_GOOD (pa_stream_get_state ((s)))) static gboolean gst_pulsesrc_is_dead (GstPulseSrc * pulsesrc, gboolean check_stream) { if (!CONTEXT_OK (pulsesrc->context)) goto error; if (check_stream && !STREAM_OK (pulsesrc->stream)) goto error; return FALSE; error: { const gchar *err_str = pulsesrc->context ? pa_strerror (pa_context_errno (pulsesrc->context)) : NULL; GST_ELEMENT_ERROR ((pulsesrc), RESOURCE, FAILED, ("Disconnected: %s", err_str), (NULL)); return TRUE; } } static void gst_pulsesrc_source_info_cb (pa_context * c, const pa_source_info * i, int eol, void *userdata) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); if (!i) goto done; g_free (pulsesrc->device_description); pulsesrc->device_description = g_strdup (i->description); done: pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); } static gchar * gst_pulsesrc_device_description (GstPulseSrc * pulsesrc) { pa_operation *o = NULL; gchar *t; if (!pulsesrc->mainloop) goto no_mainloop; pa_threaded_mainloop_lock (pulsesrc->mainloop); if (!(o = pa_context_get_source_info_by_name (pulsesrc->context, pulsesrc->device, gst_pulsesrc_source_info_cb, pulsesrc))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_get_source_info() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { if (gst_pulsesrc_is_dead (pulsesrc, FALSE)) goto unlock; pa_threaded_mainloop_wait (pulsesrc->mainloop); } unlock: if (o) pa_operation_unref (o); t = g_strdup (pulsesrc->device_description); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return t; no_mainloop: { GST_DEBUG_OBJECT (pulsesrc, "have no mainloop"); return NULL; } } #ifdef HAVE_PULSE_1_0 static void gst_pulsesrc_source_output_info_cb (pa_context * c, const pa_source_output_info * i, int eol, void *userdata) { GstPulseSrc *psrc; psrc = GST_PULSESRC_CAST (userdata); if (!i) goto done; /* If the index doesn't match our current stream, * it implies we just recreated the stream (caps change) */ if (i->index == psrc->source_output_idx) { psrc->volume = pa_sw_volume_to_linear (pa_cvolume_max (&i->volume)); psrc->mute = i->mute; } done: pa_threaded_mainloop_signal (psrc->mainloop, 0); } static gdouble gst_pulsesrc_get_stream_volume (GstPulseSrc * pulsesrc) { pa_operation *o = NULL; gdouble v; if (!pulsesrc->mainloop) goto no_mainloop; if (pulsesrc->source_output_idx == PA_INVALID_INDEX) goto no_index; pa_threaded_mainloop_lock (pulsesrc->mainloop); if (!(o = pa_context_get_source_output_info (pulsesrc->context, pulsesrc->source_output_idx, gst_pulsesrc_source_output_info_cb, pulsesrc))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (pulsesrc->mainloop); if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock; } unlock: v = pulsesrc->volume; if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (pulsesrc->mainloop); if (v > MAX_VOLUME) { GST_WARNING_OBJECT (pulsesrc, "Clipped volume from %f to %f", v, MAX_VOLUME); v = MAX_VOLUME; } return v; /* ERRORS */ no_mainloop: { v = pulsesrc->volume; GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); return v; } no_index: { v = pulsesrc->volume; GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); return v; } info_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_context_get_source_output_info() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } } static gboolean gst_pulsesrc_get_stream_mute (GstPulseSrc * pulsesrc) { pa_operation *o = NULL; gboolean mute; if (!pulsesrc->mainloop) goto no_mainloop; if (pulsesrc->source_output_idx == PA_INVALID_INDEX) goto no_index; pa_threaded_mainloop_lock (pulsesrc->mainloop); if (!(o = pa_context_get_source_output_info (pulsesrc->context, pulsesrc->source_output_idx, gst_pulsesrc_source_output_info_cb, pulsesrc))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (pulsesrc->mainloop); if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock; } unlock: mute = pulsesrc->mute; if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return mute; /* ERRORS */ no_mainloop: { mute = pulsesrc->mute; GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); return mute; } no_index: { mute = pulsesrc->mute; GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); return mute; } info_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_context_get_source_output_info() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } } static void gst_pulsesrc_set_stream_volume (GstPulseSrc * pulsesrc, gdouble volume) { pa_cvolume v; pa_operation *o = NULL; if (!pulsesrc->mainloop) goto no_mainloop; if (!pulsesrc->source_output_idx) goto no_index; pa_threaded_mainloop_lock (pulsesrc->mainloop); GST_DEBUG_OBJECT (pulsesrc, "setting volume to %f", volume); gst_pulse_cvolume_from_linear (&v, pulsesrc->sample_spec.channels, volume); if (!(o = pa_context_set_source_output_volume (pulsesrc->context, pulsesrc->source_output_idx, &v, NULL, NULL))) goto volume_failed; /* We don't really care about the result of this call */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return; /* ERRORS */ no_mainloop: { pulsesrc->volume = volume; pulsesrc->volume_set = TRUE; GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); return; } no_index: { pulsesrc->volume = volume; pulsesrc->volume_set = TRUE; GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); return; } volume_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_set_source_output_volume() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } } static void gst_pulsesrc_set_stream_mute (GstPulseSrc * pulsesrc, gboolean mute) { pa_operation *o = NULL; if (!pulsesrc->mainloop) goto no_mainloop; if (!pulsesrc->source_output_idx) goto no_index; pa_threaded_mainloop_lock (pulsesrc->mainloop); GST_DEBUG_OBJECT (pulsesrc, "setting mute state to %d", mute); if (!(o = pa_context_set_source_output_mute (pulsesrc->context, pulsesrc->source_output_idx, mute, NULL, NULL))) goto mute_failed; /* We don't really care about the result of this call */ unlock: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return; /* ERRORS */ no_mainloop: { pulsesrc->mute = mute; pulsesrc->mute_set = TRUE; GST_DEBUG_OBJECT (pulsesrc, "we have no mainloop"); return; } no_index: { pulsesrc->mute = mute; pulsesrc->mute_set = TRUE; GST_DEBUG_OBJECT (pulsesrc, "we don't have a stream index"); return; } mute_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_set_source_output_mute() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock; } } #endif static void gst_pulsesrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); switch (prop_id) { case PROP_SERVER: g_free (pulsesrc->server); pulsesrc->server = g_value_dup_string (value); if (pulsesrc->probe) gst_pulseprobe_set_server (pulsesrc->probe, pulsesrc->server); break; case PROP_DEVICE: g_free (pulsesrc->device); pulsesrc->device = g_value_dup_string (value); break; case PROP_CLIENT: g_free (pulsesrc->client_name); if (!g_value_get_string (value)) { GST_WARNING_OBJECT (pulsesrc, "Empty PulseAudio client name not allowed. Resetting to default value"); pulsesrc->client_name = gst_pulse_client_name (); } else pulsesrc->client_name = g_value_dup_string (value); break; case PROP_STREAM_PROPERTIES: if (pulsesrc->properties) gst_structure_free (pulsesrc->properties); pulsesrc->properties = gst_structure_copy (gst_value_get_structure (value)); if (pulsesrc->proplist) pa_proplist_free (pulsesrc->proplist); pulsesrc->proplist = gst_pulse_make_proplist (pulsesrc->properties); break; #ifdef HAVE_PULSE_1_0 case PROP_VOLUME: gst_pulsesrc_set_stream_volume (pulsesrc, g_value_get_double (value)); break; case PROP_MUTE: gst_pulsesrc_set_stream_mute (pulsesrc, g_value_get_boolean (value)); break; #endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_pulsesrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); switch (prop_id) { case PROP_SERVER: g_value_set_string (value, pulsesrc->server); break; case PROP_DEVICE: g_value_set_string (value, pulsesrc->device); break; case PROP_DEVICE_NAME: g_value_take_string (value, gst_pulsesrc_device_description (pulsesrc)); break; case PROP_CLIENT: g_value_set_string (value, pulsesrc->client_name); break; case PROP_STREAM_PROPERTIES: gst_value_set_structure (value, pulsesrc->properties); break; case PROP_SOURCE_OUTPUT_INDEX: g_value_set_uint (value, pulsesrc->source_output_idx); break; #ifdef HAVE_PULSE_1_0 case PROP_VOLUME: g_value_set_double (value, gst_pulsesrc_get_stream_volume (pulsesrc)); break; case PROP_MUTE: g_value_set_boolean (value, gst_pulsesrc_get_stream_mute (pulsesrc)); break; #endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_pulsesrc_context_state_cb (pa_context * c, void *userdata) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); switch (pa_context_get_state (c)) { case PA_CONTEXT_READY: case PA_CONTEXT_TERMINATED: case PA_CONTEXT_FAILED: pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); break; case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; } } static void gst_pulsesrc_stream_state_cb (pa_stream * s, void *userdata) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); switch (pa_stream_get_state (s)) { case PA_STREAM_READY: case PA_STREAM_FAILED: case PA_STREAM_TERMINATED: pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); break; case PA_STREAM_UNCONNECTED: case PA_STREAM_CREATING: break; } } static void gst_pulsesrc_stream_request_cb (pa_stream * s, size_t length, void *userdata) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); GST_LOG_OBJECT (pulsesrc, "got request for length %" G_GSIZE_FORMAT, length); if (pulsesrc->in_read) { /* only signal when reading */ pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); } } static void gst_pulsesrc_stream_latency_update_cb (pa_stream * s, void *userdata) { const pa_timing_info *info; pa_usec_t source_usec; info = pa_stream_get_timing_info (s); if (!info) { GST_LOG_OBJECT (GST_PULSESRC_CAST (userdata), "latency update (information unknown)"); return; } source_usec = info->configured_source_usec; GST_LOG_OBJECT (GST_PULSESRC_CAST (userdata), "latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT, GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt, info->write_index, info->read_index_corrupt, info->read_index, info->source_usec, source_usec); } static void gst_pulsesrc_stream_underflow_cb (pa_stream * s, void *userdata) { GST_WARNING_OBJECT (GST_PULSESRC_CAST (userdata), "Got underflow"); } static void gst_pulsesrc_stream_overflow_cb (pa_stream * s, void *userdata) { GST_WARNING_OBJECT (GST_PULSESRC_CAST (userdata), "Got overflow"); } #ifdef HAVE_PULSE_1_0 static void gst_pulsesrc_context_subscribe_cb (pa_context * c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { GstPulseSrc *psrc = GST_PULSESRC (userdata); if (t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE) && t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_NEW)) return; if (idx != psrc->source_output_idx) return; /* Actually this event is also triggered when other properties of the stream * change that are unrelated to the volume. However it is probably cheaper to * signal the change here and check for the volume when the GObject property * is read instead of querying it always. */ /* inform streaming thread to notify */ g_atomic_int_compare_and_exchange (&psrc->notify, 0, 1); } #endif static gboolean gst_pulsesrc_open (GstAudioSrc * asrc) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); pa_threaded_mainloop_lock (pulsesrc->mainloop); g_assert (!pulsesrc->context); g_assert (!pulsesrc->stream); GST_DEBUG_OBJECT (pulsesrc, "opening device"); if (!(pulsesrc->context = pa_context_new (pa_threaded_mainloop_get_api (pulsesrc->mainloop), pulsesrc->client_name))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to create context"), (NULL)); goto unlock_and_fail; } pa_context_set_state_callback (pulsesrc->context, gst_pulsesrc_context_state_cb, pulsesrc); #ifdef HAVE_PULSE_1_0 pa_context_set_subscribe_callback (pulsesrc->context, gst_pulsesrc_context_subscribe_cb, pulsesrc); #endif GST_DEBUG_OBJECT (pulsesrc, "connect to server %s", GST_STR_NULL (pulsesrc->server)); if (pa_context_connect (pulsesrc->context, pulsesrc->server, 0, NULL) < 0) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to connect: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } for (;;) { pa_context_state_t state; state = pa_context_get_state (pulsesrc->context); if (!PA_CONTEXT_IS_GOOD (state)) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to connect: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } if (state == PA_CONTEXT_READY) break; /* Wait until the context is ready */ pa_threaded_mainloop_wait (pulsesrc->mainloop); } GST_DEBUG_OBJECT (pulsesrc, "connected"); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return TRUE; /* ERRORS */ unlock_and_fail: { gst_pulsesrc_destroy_context (pulsesrc); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return FALSE; } } static gboolean gst_pulsesrc_close (GstAudioSrc * asrc) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); pa_threaded_mainloop_lock (pulsesrc->mainloop); gst_pulsesrc_destroy_context (pulsesrc); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return TRUE; } static gboolean gst_pulsesrc_unprepare (GstAudioSrc * asrc) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); pa_threaded_mainloop_lock (pulsesrc->mainloop); gst_pulsesrc_destroy_stream (pulsesrc); pa_threaded_mainloop_unlock (pulsesrc->mainloop); pulsesrc->read_buffer = NULL; pulsesrc->read_buffer_length = 0; return TRUE; } static guint gst_pulsesrc_read (GstAudioSrc * asrc, gpointer data, guint length) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); size_t sum = 0; pa_threaded_mainloop_lock (pulsesrc->mainloop); pulsesrc->in_read = TRUE; #ifdef HAVE_PULSE_1_0 if (g_atomic_int_compare_and_exchange (&pulsesrc->notify, 1, 0)) { g_object_notify (G_OBJECT (pulsesrc), "volume"); g_object_notify (G_OBJECT (pulsesrc), "mute"); } #endif if (pulsesrc->paused) goto was_paused; while (length > 0) { size_t l; GST_LOG_OBJECT (pulsesrc, "reading %u bytes", length); /*check if we have a leftover buffer */ if (!pulsesrc->read_buffer) { for (;;) { if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock_and_fail; /* read all available data, we keep a pointer to the data and the length * and take from it what we need. */ if (pa_stream_peek (pulsesrc->stream, &pulsesrc->read_buffer, &pulsesrc->read_buffer_length) < 0) goto peek_failed; GST_LOG_OBJECT (pulsesrc, "have data of %" G_GSIZE_FORMAT " bytes", pulsesrc->read_buffer_length); /* if we have data, process if */ if (pulsesrc->read_buffer && pulsesrc->read_buffer_length) break; /* now wait for more data to become available */ GST_LOG_OBJECT (pulsesrc, "waiting for data"); pa_threaded_mainloop_wait (pulsesrc->mainloop); if (pulsesrc->paused) goto was_paused; } } l = pulsesrc->read_buffer_length > length ? length : pulsesrc->read_buffer_length; memcpy (data, pulsesrc->read_buffer, l); pulsesrc->read_buffer = (const guint8 *) pulsesrc->read_buffer + l; pulsesrc->read_buffer_length -= l; data = (guint8 *) data + l; length -= l; sum += l; if (pulsesrc->read_buffer_length <= 0) { /* we copied all of the data, drop it now */ if (pa_stream_drop (pulsesrc->stream) < 0) goto drop_failed; /* reset pointer to data */ pulsesrc->read_buffer = NULL; pulsesrc->read_buffer_length = 0; } } pulsesrc->in_read = FALSE; pa_threaded_mainloop_unlock (pulsesrc->mainloop); return sum; /* ERRORS */ was_paused: { GST_LOG_OBJECT (pulsesrc, "we are paused"); goto unlock_and_fail; } peek_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_peek() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } drop_failed: { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_drop() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } unlock_and_fail: { pulsesrc->in_read = FALSE; pa_threaded_mainloop_unlock (pulsesrc->mainloop); return (guint) - 1; } } /* return the delay in samples */ static guint gst_pulsesrc_delay (GstAudioSrc * asrc) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); pa_usec_t t; int negative, res; guint result; pa_threaded_mainloop_lock (pulsesrc->mainloop); if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto server_dead; /* get the latency, this can fail when we don't have a latency update yet. * We don't want to wait for latency updates here but we just return 0. */ res = pa_stream_get_latency (pulsesrc->stream, &t, &negative); pa_threaded_mainloop_unlock (pulsesrc->mainloop); if (res < 0) { GST_DEBUG_OBJECT (pulsesrc, "could not get latency"); result = 0; } else { if (negative) result = 0; else result = (guint) ((t * pulsesrc->sample_spec.rate) / 1000000LL); } return result; /* ERRORS */ server_dead: { GST_DEBUG_OBJECT (pulsesrc, "the server is dead"); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return 0; } } static gboolean gst_pulsesrc_create_stream (GstPulseSrc * pulsesrc, GstCaps * caps) { pa_channel_map channel_map; GstStructure *s; gboolean need_channel_layout = FALSE; GstRingBufferSpec spec; const gchar *name; memset (&spec, 0, sizeof (GstRingBufferSpec)); spec.latency_time = GST_SECOND; if (!gst_ring_buffer_parse_caps (&spec, caps)) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, SETTINGS, ("Can't parse caps."), (NULL)); goto fail; } /* Keep the refcount of the caps at 1 to make them writable */ gst_caps_unref (spec.caps); if (!gst_pulse_fill_sample_spec (&spec, &pulsesrc->sample_spec)) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, SETTINGS, ("Invalid sample specification."), (NULL)); goto fail; } pa_threaded_mainloop_lock (pulsesrc->mainloop); if (!pulsesrc->context) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Bad context"), (NULL)); goto unlock_and_fail; } s = gst_caps_get_structure (caps, 0); if (!gst_structure_has_field (s, "channel-layout") || !gst_pulse_gst_to_channel_map (&channel_map, &spec)) { if (spec.channels == 1) pa_channel_map_init_mono (&channel_map); else if (spec.channels == 2) pa_channel_map_init_stereo (&channel_map); else need_channel_layout = TRUE; } name = "Record Stream"; if (pulsesrc->proplist) { if (!(pulsesrc->stream = pa_stream_new_with_proplist (pulsesrc->context, name, &pulsesrc->sample_spec, (need_channel_layout) ? NULL : &channel_map, pulsesrc->proplist))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to create stream: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } } else if (!(pulsesrc->stream = pa_stream_new (pulsesrc->context, name, &pulsesrc->sample_spec, (need_channel_layout) ? NULL : &channel_map))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to create stream: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } if (need_channel_layout) { const pa_channel_map *m = pa_stream_get_channel_map (pulsesrc->stream); gst_pulse_channel_map_to_gst (m, &spec); caps = spec.caps; } GST_DEBUG_OBJECT (pulsesrc, "Caps are %" GST_PTR_FORMAT, caps); pa_stream_set_state_callback (pulsesrc->stream, gst_pulsesrc_stream_state_cb, pulsesrc); pa_stream_set_read_callback (pulsesrc->stream, gst_pulsesrc_stream_request_cb, pulsesrc); pa_stream_set_underflow_callback (pulsesrc->stream, gst_pulsesrc_stream_underflow_cb, pulsesrc); pa_stream_set_overflow_callback (pulsesrc->stream, gst_pulsesrc_stream_overflow_cb, pulsesrc); pa_stream_set_latency_update_callback (pulsesrc->stream, gst_pulsesrc_stream_latency_update_cb, pulsesrc); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return TRUE; unlock_and_fail: gst_pulsesrc_destroy_stream (pulsesrc); pa_threaded_mainloop_unlock (pulsesrc->mainloop); fail: return FALSE; } /* This is essentially gst_base_src_negotiate_default() but the caps * are guaranteed to have a channel layout for > 2 channels */ static gboolean gst_pulsesrc_negotiate (GstBaseSrc * basesrc) { GstCaps *thiscaps; GstCaps *caps = NULL; GstCaps *peercaps = NULL; gboolean result = FALSE; /* first see what is possible on our source pad */ thiscaps = gst_pad_get_caps_reffed (GST_BASE_SRC_PAD (basesrc)); GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps); /* nothing or anything is allowed, we're done */ if (thiscaps == NULL || gst_caps_is_any (thiscaps)) goto no_nego_needed; /* get the peer caps */ peercaps = gst_pad_peer_get_caps_reffed (GST_BASE_SRC_PAD (basesrc)); GST_DEBUG_OBJECT (basesrc, "caps of peer: %" GST_PTR_FORMAT, peercaps); if (peercaps) { /* get intersection */ caps = gst_caps_intersect (thiscaps, peercaps); GST_DEBUG_OBJECT (basesrc, "intersect: %" GST_PTR_FORMAT, caps); gst_caps_unref (thiscaps); gst_caps_unref (peercaps); } else { /* no peer, work with our own caps then */ caps = thiscaps; } if (caps) { /* take first (and best, since they are sorted) possibility */ caps = gst_caps_make_writable (caps); gst_caps_truncate (caps); /* now fixate */ if (!gst_caps_is_empty (caps)) { gst_pad_fixate_caps (GST_BASE_SRC_PAD (basesrc), caps); GST_DEBUG_OBJECT (basesrc, "fixated to: %" GST_PTR_FORMAT, caps); if (gst_caps_is_any (caps)) { /* hmm, still anything, so element can do anything and * nego is not needed */ result = TRUE; } else if (gst_caps_is_fixed (caps)) { /* yay, fixed caps, use those then */ result = gst_pulsesrc_create_stream (GST_PULSESRC_CAST (basesrc), caps); if (result) result = gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), caps); } } gst_caps_unref (caps); } return result; no_nego_needed: { GST_DEBUG_OBJECT (basesrc, "no negotiation needed"); if (thiscaps) gst_caps_unref (thiscaps); return TRUE; } } static gboolean gst_pulsesrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) { pa_buffer_attr wanted; const pa_buffer_attr *actual; GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); pa_stream_flags_t flags; #ifdef HAVE_PULSE_1_0 pa_operation *o; #endif pa_threaded_mainloop_lock (pulsesrc->mainloop); #ifdef HAVE_PULSE_1_0 /* enable event notifications */ GST_LOG_OBJECT (pulsesrc, "subscribing to context events"); if (!(o = pa_context_subscribe (pulsesrc->context, PA_SUBSCRIPTION_MASK_SINK_INPUT, NULL, NULL))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_context_subscribe() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } pa_operation_unref (o); #endif wanted.maxlength = -1; wanted.tlength = -1; wanted.prebuf = 0; wanted.minreq = -1; wanted.fragsize = spec->segsize; GST_INFO_OBJECT (pulsesrc, "maxlength: %d", wanted.maxlength); GST_INFO_OBJECT (pulsesrc, "tlength: %d", wanted.tlength); GST_INFO_OBJECT (pulsesrc, "prebuf: %d", wanted.prebuf); GST_INFO_OBJECT (pulsesrc, "minreq: %d", wanted.minreq); GST_INFO_OBJECT (pulsesrc, "fragsize: %d", wanted.fragsize); flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_NOT_MONOTONIC | PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED; #ifdef HAVE_PULSE_1_0 if (pulsesrc->mute_set && pulsesrc->mute) flags |= PA_STREAM_START_MUTED; #endif if (pa_stream_connect_record (pulsesrc->stream, pulsesrc->device, &wanted, flags) < 0) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to connect stream: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } pulsesrc->corked = TRUE; for (;;) { pa_stream_state_t state; state = pa_stream_get_state (pulsesrc->stream); if (!PA_STREAM_IS_GOOD (state)) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Failed to connect stream: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } if (state == PA_STREAM_READY) break; /* Wait until the stream is ready */ pa_threaded_mainloop_wait (pulsesrc->mainloop); } /* store the source output index so it can be accessed via a property */ pulsesrc->source_output_idx = pa_stream_get_index (pulsesrc->stream); g_object_notify (G_OBJECT (pulsesrc), "source-output-index"); #ifdef HAVE_PULSE_1_0 if (pulsesrc->volume_set) { gst_pulsesrc_set_stream_volume (pulsesrc, pulsesrc->volume); pulsesrc->volume_set = FALSE; } #endif /* get the actual buffering properties now */ actual = pa_stream_get_buffer_attr (pulsesrc->stream); GST_INFO_OBJECT (pulsesrc, "maxlength: %d", actual->maxlength); GST_INFO_OBJECT (pulsesrc, "tlength: %d (wanted: %d)", actual->tlength, wanted.tlength); GST_INFO_OBJECT (pulsesrc, "prebuf: %d", actual->prebuf); GST_INFO_OBJECT (pulsesrc, "minreq: %d (wanted %d)", actual->minreq, wanted.minreq); GST_INFO_OBJECT (pulsesrc, "fragsize: %d (wanted %d)", actual->fragsize, wanted.fragsize); if (actual->fragsize >= wanted.fragsize) { spec->segsize = actual->fragsize; } else { spec->segsize = actual->fragsize * (wanted.fragsize / actual->fragsize); } spec->segtotal = actual->maxlength / spec->segsize; pa_threaded_mainloop_unlock (pulsesrc->mainloop); return TRUE; unlock_and_fail: { gst_pulsesrc_destroy_stream (pulsesrc); pa_threaded_mainloop_unlock (pulsesrc->mainloop); return FALSE; } } static void gst_pulsesrc_success_cb (pa_stream * s, int success, void *userdata) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); pulsesrc->operation_success = ! !success; pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); } static void gst_pulsesrc_reset (GstAudioSrc * asrc) { GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (asrc); pa_operation *o = NULL; pa_threaded_mainloop_lock (pulsesrc->mainloop); GST_DEBUG_OBJECT (pulsesrc, "reset"); if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock_and_fail; if (!(o = pa_stream_flush (pulsesrc->stream, gst_pulsesrc_success_cb, pulsesrc))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_flush() failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } pulsesrc->paused = TRUE; /* Inform anyone waiting in _write() call that it shall wakeup */ if (pulsesrc->in_read) { pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); } pulsesrc->operation_success = FALSE; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock_and_fail; pa_threaded_mainloop_wait (pulsesrc->mainloop); } if (!pulsesrc->operation_success) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("Flush failed: %s", pa_strerror (pa_context_errno (pulsesrc->context))), (NULL)); goto unlock_and_fail; } unlock_and_fail: if (o) { pa_operation_cancel (o); pa_operation_unref (o); } pa_threaded_mainloop_unlock (pulsesrc->mainloop); } /* update the corked state of a stream, must be called with the mainloop * lock */ static gboolean gst_pulsesrc_set_corked (GstPulseSrc * psrc, gboolean corked, gboolean wait) { pa_operation *o = NULL; gboolean res = FALSE; GST_DEBUG_OBJECT (psrc, "setting corked state to %d", corked); if (psrc->corked != corked) { if (!(o = pa_stream_cork (psrc->stream, corked, gst_pulsesrc_success_cb, psrc))) goto cork_failed; while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (psrc->mainloop); if (gst_pulsesrc_is_dead (psrc, TRUE)) goto server_dead; } psrc->corked = corked; } else { GST_DEBUG_OBJECT (psrc, "skipping, already in requested state"); } res = TRUE; cleanup: if (o) pa_operation_unref (o); return res; /* ERRORS */ server_dead: { GST_DEBUG_OBJECT (psrc, "the server is dead"); goto cleanup; } cork_failed: { GST_ELEMENT_ERROR (psrc, RESOURCE, FAILED, ("pa_stream_cork() failed: %s", pa_strerror (pa_context_errno (psrc->context))), (NULL)); goto cleanup; } } /* start/resume playback ASAP */ static gboolean gst_pulsesrc_play (GstPulseSrc * psrc) { pa_threaded_mainloop_lock (psrc->mainloop); GST_DEBUG_OBJECT (psrc, "playing"); psrc->paused = FALSE; gst_pulsesrc_set_corked (psrc, FALSE, FALSE); pa_threaded_mainloop_unlock (psrc->mainloop); return TRUE; } /* pause/stop playback ASAP */ static gboolean gst_pulsesrc_pause (GstPulseSrc * psrc) { pa_threaded_mainloop_lock (psrc->mainloop); GST_DEBUG_OBJECT (psrc, "pausing"); /* make sure the commit method stops writing */ psrc->paused = TRUE; if (psrc->in_read) { /* we are waiting in a read, signal */ GST_DEBUG_OBJECT (psrc, "signal read"); pa_threaded_mainloop_signal (psrc->mainloop, 0); } pa_threaded_mainloop_unlock (psrc->mainloop); return TRUE; } static GstStateChangeReturn gst_pulsesrc_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstPulseSrc *this = GST_PULSESRC_CAST (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!(this->mainloop = pa_threaded_mainloop_new ())) goto mainloop_failed; if (pa_threaded_mainloop_start (this->mainloop) < 0) { pa_threaded_mainloop_free (this->mainloop); this->mainloop = NULL; goto mainloop_start_failed; } if (!this->mixer) this->mixer = gst_pulsemixer_ctrl_new (G_OBJECT (this), this->server, this->device, GST_PULSEMIXER_SOURCE); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: /* uncork and start recording */ gst_pulsesrc_play (this); break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: /* stop recording ASAP by corking */ pa_threaded_mainloop_lock (this->mainloop); GST_DEBUG_OBJECT (this, "corking"); gst_pulsesrc_set_corked (this, TRUE, FALSE); pa_threaded_mainloop_unlock (this->mainloop); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: /* now make sure we get out of the _read method */ gst_pulsesrc_pause (this); break; case GST_STATE_CHANGE_READY_TO_NULL: if (this->mixer) { gst_pulsemixer_ctrl_free (this->mixer); this->mixer = NULL; } if (this->mainloop) pa_threaded_mainloop_stop (this->mainloop); gst_pulsesrc_destroy_context (this); if (this->mainloop) { pa_threaded_mainloop_free (this->mainloop); this->mainloop = NULL; } break; default: break; } return ret; /* ERRORS */ mainloop_failed: { GST_ELEMENT_ERROR (this, RESOURCE, FAILED, ("pa_threaded_mainloop_new() failed"), (NULL)); return GST_STATE_CHANGE_FAILURE; } mainloop_start_failed: { GST_ELEMENT_ERROR (this, RESOURCE, FAILED, ("pa_threaded_mainloop_start() failed"), (NULL)); return GST_STATE_CHANGE_FAILURE; } } gst-plugins-good-0.10.31/ext/pulse/Makefile.in0000644000175000017500000011175311720560227016006 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/pulse DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstpulse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstpulse_la_OBJECTS = libgstpulse_la-plugin.lo \ libgstpulse_la-pulsemixer.lo libgstpulse_la-pulsemixerctrl.lo \ libgstpulse_la-pulsemixertrack.lo libgstpulse_la-pulseprobe.lo \ libgstpulse_la-pulsesink.lo libgstpulse_la-pulseaudiosink.lo \ libgstpulse_la-pulsesrc.lo libgstpulse_la-pulseutil.lo libgstpulse_la_OBJECTS = $(am_libgstpulse_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstpulse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstpulse_la_CFLAGS) $(CFLAGS) \ $(libgstpulse_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstpulse_la_SOURCES) DIST_SOURCES = $(libgstpulse_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstpulse.la libgstpulse_la_SOURCES = \ plugin.c \ pulsemixer.c \ pulsemixerctrl.c \ pulsemixertrack.c \ pulseprobe.c \ pulsesink.c \ pulseaudiosink.c \ pulsesrc.c \ pulseutil.c libgstpulse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(PULSE_CFLAGS) libgstpulse_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ -lgstinterfaces-$(GST_MAJORMINOR) -lgstpbutils-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(PULSE_LIBS) libgstpulse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstpulse_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ pulsemixerctrl.h \ pulsemixer.h \ pulsemixertrack.h \ pulseprobe.h \ pulsesink.h \ pulsesrc.h \ pulseutil.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/pulse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/pulse/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstpulse.la: $(libgstpulse_la_OBJECTS) $(libgstpulse_la_DEPENDENCIES) $(EXTRA_libgstpulse_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstpulse_la_LINK) -rpath $(plugindir) $(libgstpulse_la_OBJECTS) $(libgstpulse_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulseaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsemixer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsemixerctrl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsemixertrack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulseprobe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsesink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulsesrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstpulse_la-pulseutil.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstpulse_la-plugin.lo: plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-plugin.Tpo -c -o libgstpulse_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-plugin.Tpo $(DEPDIR)/libgstpulse_la-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstpulse_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c libgstpulse_la-pulsemixer.lo: pulsemixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsemixer.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsemixer.Tpo -c -o libgstpulse_la-pulsemixer.lo `test -f 'pulsemixer.c' || echo '$(srcdir)/'`pulsemixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsemixer.Tpo $(DEPDIR)/libgstpulse_la-pulsemixer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsemixer.c' object='libgstpulse_la-pulsemixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsemixer.lo `test -f 'pulsemixer.c' || echo '$(srcdir)/'`pulsemixer.c libgstpulse_la-pulsemixerctrl.lo: pulsemixerctrl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsemixerctrl.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsemixerctrl.Tpo -c -o libgstpulse_la-pulsemixerctrl.lo `test -f 'pulsemixerctrl.c' || echo '$(srcdir)/'`pulsemixerctrl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsemixerctrl.Tpo $(DEPDIR)/libgstpulse_la-pulsemixerctrl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsemixerctrl.c' object='libgstpulse_la-pulsemixerctrl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsemixerctrl.lo `test -f 'pulsemixerctrl.c' || echo '$(srcdir)/'`pulsemixerctrl.c libgstpulse_la-pulsemixertrack.lo: pulsemixertrack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsemixertrack.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsemixertrack.Tpo -c -o libgstpulse_la-pulsemixertrack.lo `test -f 'pulsemixertrack.c' || echo '$(srcdir)/'`pulsemixertrack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsemixertrack.Tpo $(DEPDIR)/libgstpulse_la-pulsemixertrack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsemixertrack.c' object='libgstpulse_la-pulsemixertrack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsemixertrack.lo `test -f 'pulsemixertrack.c' || echo '$(srcdir)/'`pulsemixertrack.c libgstpulse_la-pulseprobe.lo: pulseprobe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulseprobe.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulseprobe.Tpo -c -o libgstpulse_la-pulseprobe.lo `test -f 'pulseprobe.c' || echo '$(srcdir)/'`pulseprobe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulseprobe.Tpo $(DEPDIR)/libgstpulse_la-pulseprobe.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulseprobe.c' object='libgstpulse_la-pulseprobe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulseprobe.lo `test -f 'pulseprobe.c' || echo '$(srcdir)/'`pulseprobe.c libgstpulse_la-pulsesink.lo: pulsesink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsesink.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsesink.Tpo -c -o libgstpulse_la-pulsesink.lo `test -f 'pulsesink.c' || echo '$(srcdir)/'`pulsesink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsesink.Tpo $(DEPDIR)/libgstpulse_la-pulsesink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsesink.c' object='libgstpulse_la-pulsesink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsesink.lo `test -f 'pulsesink.c' || echo '$(srcdir)/'`pulsesink.c libgstpulse_la-pulseaudiosink.lo: pulseaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulseaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulseaudiosink.Tpo -c -o libgstpulse_la-pulseaudiosink.lo `test -f 'pulseaudiosink.c' || echo '$(srcdir)/'`pulseaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulseaudiosink.Tpo $(DEPDIR)/libgstpulse_la-pulseaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulseaudiosink.c' object='libgstpulse_la-pulseaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulseaudiosink.lo `test -f 'pulseaudiosink.c' || echo '$(srcdir)/'`pulseaudiosink.c libgstpulse_la-pulsesrc.lo: pulsesrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulsesrc.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulsesrc.Tpo -c -o libgstpulse_la-pulsesrc.lo `test -f 'pulsesrc.c' || echo '$(srcdir)/'`pulsesrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulsesrc.Tpo $(DEPDIR)/libgstpulse_la-pulsesrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsesrc.c' object='libgstpulse_la-pulsesrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulsesrc.lo `test -f 'pulsesrc.c' || echo '$(srcdir)/'`pulsesrc.c libgstpulse_la-pulseutil.lo: pulseutil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -MT libgstpulse_la-pulseutil.lo -MD -MP -MF $(DEPDIR)/libgstpulse_la-pulseutil.Tpo -c -o libgstpulse_la-pulseutil.lo `test -f 'pulseutil.c' || echo '$(srcdir)/'`pulseutil.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstpulse_la-pulseutil.Tpo $(DEPDIR)/libgstpulse_la-pulseutil.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulseutil.c' object='libgstpulse_la-pulseutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstpulse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstpulse_la_CFLAGS) $(CFLAGS) -c -o libgstpulse_la-pulseutil.lo `test -f 'pulseutil.c' || echo '$(srcdir)/'`pulseutil.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/pulse/pulseprobe.h0000644000175000017500000001424311671175352016274 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #ifndef __GST_PULSEPROBE_H__ #define __GST_PULSEPROBE_H__ #include G_BEGIN_DECLS #include #include #include typedef struct _GstPulseProbe GstPulseProbe; struct _GstPulseProbe { GObject *object; gchar *server; GList *devices; gboolean devices_valid:1; gboolean operation_success:1; gboolean enumerate_sinks:1; gboolean enumerate_sources:1; pa_threaded_mainloop *mainloop; pa_context *context; GList *properties; guint prop_id; }; GstPulseProbe *gst_pulseprobe_new (GObject *object, GObjectClass * klass, guint prop_id, const gchar * server, gboolean sinks, gboolean sources); void gst_pulseprobe_free (GstPulseProbe * probe); const GList *gst_pulseprobe_get_properties (GstPulseProbe * probe); gboolean gst_pulseprobe_needs_probe (GstPulseProbe * probe, guint prop_id, const GParamSpec * pspec); void gst_pulseprobe_probe_property (GstPulseProbe * probe, guint prop_id, const GParamSpec * pspec); GValueArray *gst_pulseprobe_get_values (GstPulseProbe * probe, guint prop_id, const GParamSpec * pspec); void gst_pulseprobe_set_server (GstPulseProbe * c, const gchar * server); #define GST_IMPLEMENT_PULSEPROBE_METHODS(Type, interface_as_function) \ static const GList* \ interface_as_function ## _get_properties(GstPropertyProbe * probe) \ { \ Type *this = (Type*) probe; \ \ g_return_val_if_fail(this != NULL, NULL); \ g_return_val_if_fail(this->probe != NULL, NULL); \ \ return gst_pulseprobe_get_properties(this->probe); \ } \ static gboolean \ interface_as_function ## _needs_probe(GstPropertyProbe *probe, guint prop_id, \ const GParamSpec *pspec) \ { \ Type *this = (Type*) probe; \ \ g_return_val_if_fail(this != NULL, FALSE); \ g_return_val_if_fail(this->probe != NULL, FALSE); \ \ return gst_pulseprobe_needs_probe(this->probe, prop_id, pspec); \ } \ static void \ interface_as_function ## _probe_property(GstPropertyProbe *probe, \ guint prop_id, const GParamSpec *pspec) \ { \ Type *this = (Type*) probe; \ \ g_return_if_fail(this != NULL); \ g_return_if_fail(this->probe != NULL); \ \ gst_pulseprobe_probe_property(this->probe, prop_id, pspec); \ } \ static GValueArray* \ interface_as_function ## _get_values(GstPropertyProbe *probe, guint prop_id, \ const GParamSpec *pspec) \ { \ Type *this = (Type*) probe; \ \ g_return_val_if_fail(this != NULL, NULL); \ g_return_val_if_fail(this->probe != NULL, NULL); \ \ return gst_pulseprobe_get_values(this->probe, prop_id, pspec); \ } \ static void \ interface_as_function ## _property_probe_interface_init(GstPropertyProbeInterface *iface)\ { \ iface->get_properties = interface_as_function ## _get_properties; \ iface->needs_probe = interface_as_function ## _needs_probe; \ iface->probe_property = interface_as_function ## _probe_property; \ iface->get_values = interface_as_function ## _get_values; \ } G_END_DECLS #endif gst-plugins-good-0.10.31/ext/pulse/pulseprobe.c0000644000175000017500000002250511671175352016267 00000000000000/*-*- Mode: C; c-basic-offset: 2 -*-*/ /* * GStreamer pulseaudio plugin * * Copyright (c) 2004-2008 Lennart Poettering * * gst-pulse is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * gst-pulse 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with gst-pulse; 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 "pulseprobe.h" #include "pulseutil.h" GST_DEBUG_CATEGORY_EXTERN (pulse_debug); #define GST_CAT_DEFAULT pulse_debug static void gst_pulseprobe_context_state_cb (pa_context * context, void *userdata) { GstPulseProbe *c = (GstPulseProbe *) userdata; /* Called from the background thread! */ switch (pa_context_get_state (context)) { case PA_CONTEXT_READY: case PA_CONTEXT_TERMINATED: case PA_CONTEXT_FAILED: pa_threaded_mainloop_signal (c->mainloop, 0); break; case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; } } static void gst_pulseprobe_sink_info_cb (pa_context * context, const pa_sink_info * i, int eol, void *userdata) { GstPulseProbe *c = (GstPulseProbe *) userdata; /* Called from the background thread! */ if (eol || !i) { c->operation_success = eol > 0; pa_threaded_mainloop_signal (c->mainloop, 0); } if (i) c->devices = g_list_append (c->devices, g_strdup (i->name)); } static void gst_pulseprobe_source_info_cb (pa_context * context, const pa_source_info * i, int eol, void *userdata) { GstPulseProbe *c = (GstPulseProbe *) userdata; /* Called from the background thread! */ if (eol || !i) { c->operation_success = eol > 0; pa_threaded_mainloop_signal (c->mainloop, 0); } if (i) c->devices = g_list_append (c->devices, g_strdup (i->name)); } static void gst_pulseprobe_invalidate (GstPulseProbe * c) { g_list_foreach (c->devices, (GFunc) g_free, NULL); g_list_free (c->devices); c->devices = NULL; c->devices_valid = FALSE; } static gboolean gst_pulseprobe_open (GstPulseProbe * c) { int e; gchar *name; g_assert (c); GST_DEBUG_OBJECT (c->object, "probe open"); c->mainloop = pa_threaded_mainloop_new (); if (!c->mainloop) return FALSE; e = pa_threaded_mainloop_start (c->mainloop); if (e < 0) return FALSE; name = gst_pulse_client_name (); pa_threaded_mainloop_lock (c->mainloop); if (!(c->context = pa_context_new (pa_threaded_mainloop_get_api (c->mainloop), name))) { GST_WARNING_OBJECT (c->object, "Failed to create context"); goto unlock_and_fail; } pa_context_set_state_callback (c->context, gst_pulseprobe_context_state_cb, c); if (pa_context_connect (c->context, c->server, 0, NULL) < 0) { GST_WARNING_OBJECT (c->object, "Failed to connect context: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } for (;;) { pa_context_state_t state; state = pa_context_get_state (c->context); if (!PA_CONTEXT_IS_GOOD (state)) { GST_WARNING_OBJECT (c->object, "Failed to connect context: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } if (state == PA_CONTEXT_READY) break; /* Wait until the context is ready */ pa_threaded_mainloop_wait (c->mainloop); } pa_threaded_mainloop_unlock (c->mainloop); g_free (name); gst_pulseprobe_invalidate (c); return TRUE; unlock_and_fail: if (c->mainloop) pa_threaded_mainloop_unlock (c->mainloop); g_free (name); return FALSE; } static gboolean gst_pulseprobe_is_dead (GstPulseProbe * pulseprobe) { if (!pulseprobe->context || !PA_CONTEXT_IS_GOOD (pa_context_get_state (pulseprobe->context))) { const gchar *err_str = pulseprobe->context ? pa_strerror (pa_context_errno (pulseprobe->context)) : NULL; GST_ELEMENT_ERROR ((pulseprobe), RESOURCE, FAILED, ("Disconnected: %s", err_str), (NULL)); return TRUE; } return FALSE; } static gboolean gst_pulseprobe_enumerate (GstPulseProbe * c) { pa_operation *o = NULL; GST_DEBUG_OBJECT (c->object, "probe enumerate"); pa_threaded_mainloop_lock (c->mainloop); if (c->enumerate_sinks) { /* Get sink info */ if (!(o = pa_context_get_sink_info_list (c->context, gst_pulseprobe_sink_info_cb, c))) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } c->operation_success = FALSE; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { if (gst_pulseprobe_is_dead (c)) goto unlock_and_fail; pa_threaded_mainloop_wait (c->mainloop); } if (!c->operation_success) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } pa_operation_unref (o); o = NULL; } if (c->enumerate_sources) { /* Get source info */ if (!(o = pa_context_get_source_info_list (c->context, gst_pulseprobe_source_info_cb, c))) { GST_WARNING_OBJECT (c->object, "Failed to get source info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } c->operation_success = FALSE; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { if (gst_pulseprobe_is_dead (c)) goto unlock_and_fail; pa_threaded_mainloop_wait (c->mainloop); } if (!c->operation_success) { GST_WARNING_OBJECT (c->object, "Failed to get sink info: %s", pa_strerror (pa_context_errno (c->context))); goto unlock_and_fail; } pa_operation_unref (o); o = NULL; } c->devices_valid = TRUE; pa_threaded_mainloop_unlock (c->mainloop); return TRUE; unlock_and_fail: if (o) pa_operation_unref (o); pa_threaded_mainloop_unlock (c->mainloop); return FALSE; } static void gst_pulseprobe_close (GstPulseProbe * c) { g_assert (c); GST_DEBUG_OBJECT (c->object, "probe close"); if (c->mainloop) pa_threaded_mainloop_stop (c->mainloop); if (c->context) { pa_context_disconnect (c->context); pa_context_set_state_callback (c->context, NULL, NULL); pa_context_unref (c->context); c->context = NULL; } if (c->mainloop) { pa_threaded_mainloop_free (c->mainloop); c->mainloop = NULL; } } GstPulseProbe * gst_pulseprobe_new (GObject * object, GObjectClass * klass, guint prop_id, const gchar * server, gboolean sinks, gboolean sources) { GstPulseProbe *c = NULL; c = g_new (GstPulseProbe, 1); c->object = object; /* We don't inc the ref counter here to avoid a ref loop */ c->server = g_strdup (server); c->enumerate_sinks = sinks; c->enumerate_sources = sources; c->mainloop = NULL; c->context = NULL; c->prop_id = prop_id; c->properties = g_list_append (NULL, g_object_class_find_property (klass, "device")); c->devices = NULL; c->devices_valid = FALSE; c->operation_success = FALSE; return c; } void gst_pulseprobe_free (GstPulseProbe * c) { g_assert (c); gst_pulseprobe_close (c); g_list_free (c->properties); g_free (c->server); g_list_foreach (c->devices, (GFunc) g_free, NULL); g_list_free (c->devices); g_free (c); } const GList * gst_pulseprobe_get_properties (GstPulseProbe * c) { return c->properties; } gboolean gst_pulseprobe_needs_probe (GstPulseProbe * c, guint prop_id, const GParamSpec * pspec) { if (prop_id == c->prop_id) return !c->devices_valid; G_OBJECT_WARN_INVALID_PROPERTY_ID (c->object, prop_id, pspec); return FALSE; } void gst_pulseprobe_probe_property (GstPulseProbe * c, guint prop_id, const GParamSpec * pspec) { if (prop_id != c->prop_id) { G_OBJECT_WARN_INVALID_PROPERTY_ID (c->object, prop_id, pspec); return; } if (gst_pulseprobe_open (c)) { gst_pulseprobe_enumerate (c); gst_pulseprobe_close (c); } } GValueArray * gst_pulseprobe_get_values (GstPulseProbe * c, guint prop_id, const GParamSpec * pspec) { GValueArray *array; GValue value = { 0 }; GList *item; if (prop_id != c->prop_id) { G_OBJECT_WARN_INVALID_PROPERTY_ID (c->object, prop_id, pspec); return NULL; } if (!c->devices_valid) return NULL; array = g_value_array_new (g_list_length (c->devices)); g_value_init (&value, G_TYPE_STRING); for (item = c->devices; item != NULL; item = item->next) { GST_WARNING_OBJECT (c->object, "device found: %s", (const gchar *) item->data); g_value_set_string (&value, (const gchar *) item->data); g_value_array_append (array, &value); } g_value_unset (&value); return array; } void gst_pulseprobe_set_server (GstPulseProbe * c, const gchar * server) { g_assert (c); gst_pulseprobe_invalidate (c); g_free (c->server); c->server = g_strdup (server); } gst-plugins-good-0.10.31/ext/cairo/0000755000175000017500000000000011720565321013756 500000000000000gst-plugins-good-0.10.31/ext/cairo/gstcairooverlay.h0000644000175000017500000000362711671175352017302 00000000000000/* GStreamer * Copyright (C) <2011> Jon Nordby * * 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_CAIRO_OVERLAY_H__ #define __GST_CAIRO_OVERLAY_H__ #include #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_CAIRO_OVERLAY \ (gst_cairo_overlay_get_type()) #define GST_CAIRO_OVERLAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAIRO_OVERLAY,GstCairoOverlay)) #define GST_CAIRO_OVERLAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAIRO_OVERLAY,GstCairoOverlayClass)) #define GST_IS_CAIRO_OVERLAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAIRO_OVERLAY)) #define GST_IS_CAIRO_OVERLAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAIRO_OVERLAY)) typedef struct _GstCairoOverlay GstCairoOverlay; typedef struct _GstCairoOverlayClass GstCairoOverlayClass; struct _GstCairoOverlay { GstVideoFilter parent_instance; /* < private > */ GstVideoFormat format; gint width; gint height; }; struct _GstCairoOverlayClass { GstVideoFilterClass parent_class; }; GType gst_cairo_overlay_get_type(void); G_END_DECLS #endif /* __GST_CAIRO_OVERLAY_H__ */ gst-plugins-good-0.10.31/ext/cairo/gstcairo.c0000644000175000017500000000355111671175352015667 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003,2004> David Schleef * * 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 #include #include #ifdef HAVE_CAIRO_GOBJECT #include #endif #include #include GST_DEBUG_CATEGORY (cairo_debug); static gboolean plugin_init (GstPlugin * plugin) { gst_element_register (plugin, "cairotextoverlay", GST_RANK_NONE, GST_TYPE_CAIRO_TEXT_OVERLAY); gst_element_register (plugin, "cairotimeoverlay", GST_RANK_NONE, GST_TYPE_CAIRO_TIME_OVERLAY); #ifdef HAVE_CAIRO_GOBJECT gst_element_register (plugin, "cairooverlay", GST_RANK_NONE, GST_TYPE_CAIRO_OVERLAY); #endif gst_element_register (plugin, "cairorender", GST_RANK_SECONDARY, GST_TYPE_CAIRO_RENDER); GST_DEBUG_CATEGORY_INIT (cairo_debug, "cairo", 0, "Cairo elements"); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "cairo", "Cairo-based elements", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/ext/cairo/Makefile.am0000644000175000017500000000223011710031417015720 00000000000000plugin_LTLIBRARIES = libgstcairo.la if USE_CAIRO_GOBJECT glib_enum_define = GST_CAIRO glib_gen_prefix = gst_cairo glib_gen_basename = gstcairo include $(top_srcdir)/common/gst-glib-gen.mak built_sources = gstcairo-marshal.c built_headers = gstcairo-marshal.h BUILT_SOURCES = $(built_sources) $(built_headers) gstcairo_gobject_dep_sources = gstcairooverlay.c gstcairo_gobject_dep_headers = gstcairooverlay.h CLEANFILES = $(BUILT_SOURCES) endif noinst_HEADERS = \ gsttimeoverlay.h \ gsttextoverlay.h \ gstcairorender.h \ $(gstcairo_gobject_dep_headers) libgstcairo_la_SOURCES = \ gstcairo.c \ gsttimeoverlay.c \ gsttextoverlay.c \ gstcairorender.c \ $(gstcairo_gobject_dep_sources) nodist_libgstcairo_la_SOURCES = \ $(built_sources) libgstcairo_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(CAIRO_CFLAGS) $(CAIRO_GOBJECT_CFLAGS) libgstcairo_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(CAIRO_LIBS) $(CAIRO_GOBJECT_LIBS) $(LIBM) libgstcairo_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcairo_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = gstcairo-marshal.list gst-plugins-good-0.10.31/ext/cairo/gsttimeoverlay.c0000644000175000017500000002224511677341654017141 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * 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-cairotimeoverlay * * cairotimeoverlay renders the buffer timestamp for each frame on top of * the frame. * * * Example launch line * |[ * gst-launch videotestsrc ! cairotimeoverlay ! autovideosink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include static GstStaticPadTemplate gst_cairo_time_overlay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstStaticPadTemplate gst_cairo_time_overlay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstBaseTransformClass *parent_class = NULL; static void gst_cairo_time_overlay_update_font_height (GstCairoTimeOverlay * timeoverlay) { gint width, height; cairo_surface_t *font_surface; cairo_t *font_cairo; cairo_font_extents_t font_extents; width = timeoverlay->width; height = timeoverlay->height; font_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); font_cairo = cairo_create (font_surface); cairo_surface_destroy (font_surface); font_surface = NULL; cairo_select_font_face (font_cairo, "monospace", 0, 0); cairo_set_font_size (font_cairo, 20); cairo_font_extents (font_cairo, &font_extents); timeoverlay->text_height = font_extents.height; GST_DEBUG_OBJECT (timeoverlay, "font height is %f", font_extents.height); cairo_destroy (font_cairo); font_cairo = NULL; } static gboolean gst_cairo_time_overlay_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstCairoTimeOverlay *filter = GST_CAIRO_TIME_OVERLAY (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { gst_cairo_time_overlay_update_font_height (filter); ret = TRUE; } return ret; } /* Useful macros */ #define GST_VIDEO_I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) #define GST_VIDEO_I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) #define GST_VIDEO_I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(GST_VIDEO_I420_Y_ROWSTRIDE(width)))/2) #define GST_VIDEO_I420_Y_OFFSET(w,h) (0) #define GST_VIDEO_I420_U_OFFSET(w,h) (GST_VIDEO_I420_Y_OFFSET(w,h)+(GST_VIDEO_I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) #define GST_VIDEO_I420_V_OFFSET(w,h) (GST_VIDEO_I420_U_OFFSET(w,h)+(GST_VIDEO_I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) #define GST_VIDEO_I420_SIZE(w,h) (GST_VIDEO_I420_V_OFFSET(w,h)+(GST_VIDEO_I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) static gboolean gst_cairo_time_overlay_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size) { GstCairoTimeOverlay *filter; GstStructure *structure; gboolean ret = FALSE; gint width, height; filter = GST_CAIRO_TIME_OVERLAY (btrans); structure = gst_caps_get_structure (caps, 0); if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { *size = GST_VIDEO_I420_SIZE (width, height); ret = TRUE; GST_DEBUG_OBJECT (filter, "our frame size is %d bytes (%dx%d)", *size, width, height); } return ret; } static char * gst_cairo_time_overlay_print_smpte_time (guint64 time) { int hours; int minutes; int seconds; int ms; double x; x = rint (gst_util_guint64_to_gdouble (time + 500000) * 1e-6); hours = floor (x / (60 * 60 * 1000)); x -= hours * 60 * 60 * 1000; minutes = floor (x / (60 * 1000)); x -= minutes * 60 * 1000; seconds = floor (x / (1000)); x -= seconds * 1000; ms = rint (x); return g_strdup_printf ("%02d:%02d:%02d.%03d", hours, minutes, seconds, ms); } static GstFlowReturn gst_cairo_time_overlay_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstCairoTimeOverlay *timeoverlay; int width; int height; int b_width; int stride_y, stride_u, stride_v; char *string; int i, j; unsigned char *image; cairo_text_extents_t extents; guint8 *dest, *src; cairo_surface_t *font_surface; cairo_t *text_cairo; GstFlowReturn ret = GST_FLOW_OK; timeoverlay = GST_CAIRO_TIME_OVERLAY (trans); gst_buffer_copy_metadata (out, in, GST_BUFFER_COPY_TIMESTAMPS); src = GST_BUFFER_DATA (in); dest = GST_BUFFER_DATA (out); width = timeoverlay->width; height = timeoverlay->height; /* create surface for font rendering */ /* FIXME: preparation of the surface could also be done once when settings * change */ image = g_malloc (4 * width * timeoverlay->text_height); font_surface = cairo_image_surface_create_for_data (image, CAIRO_FORMAT_ARGB32, width, timeoverlay->text_height, width * 4); text_cairo = cairo_create (font_surface); cairo_surface_destroy (font_surface); font_surface = NULL; /* we draw a rectangle because the compositing on the buffer below * doesn't do alpha */ cairo_save (text_cairo); cairo_rectangle (text_cairo, 0, 0, width, timeoverlay->text_height); cairo_set_source_rgba (text_cairo, 0, 0, 0, 1); cairo_set_operator (text_cairo, CAIRO_OPERATOR_SOURCE); cairo_fill (text_cairo); cairo_restore (text_cairo); string = gst_cairo_time_overlay_print_smpte_time (GST_BUFFER_TIMESTAMP (in)); cairo_save (text_cairo); cairo_select_font_face (text_cairo, "monospace", 0, 0); cairo_set_font_size (text_cairo, 20); cairo_text_extents (text_cairo, string, &extents); cairo_set_source_rgb (text_cairo, 1, 1, 1); cairo_move_to (text_cairo, 0, timeoverlay->text_height - 2); cairo_show_text (text_cairo, string); g_free (string); cairo_restore (text_cairo); /* blend width; should retain a max text width so it doesn't jitter */ b_width = extents.width; if (b_width > width) b_width = width; stride_y = GST_VIDEO_I420_Y_ROWSTRIDE (width); stride_u = GST_VIDEO_I420_U_ROWSTRIDE (width); stride_v = GST_VIDEO_I420_V_ROWSTRIDE (width); memcpy (dest, src, GST_BUFFER_SIZE (in)); for (i = 0; i < timeoverlay->text_height; i++) { for (j = 0; j < b_width; j++) { ((unsigned char *) dest)[i * stride_y + j] = image[(i * width + j) * 4 + 0]; } } for (i = 0; i < timeoverlay->text_height / 2; i++) { memset (dest + GST_VIDEO_I420_U_OFFSET (width, height) + i * stride_u, 128, b_width / 2); memset (dest + GST_VIDEO_I420_V_OFFSET (width, height) + i * stride_v, 128, b_width / 2); } cairo_destroy (text_cairo); text_cairo = NULL; g_free (image); return ret; } static void gst_cairo_time_overlay_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Time overlay", "Filter/Editor/Video", "Overlays the time on a video stream", "David Schleef "); gst_element_class_add_static_pad_template (element_class, &gst_cairo_time_overlay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_cairo_time_overlay_src_template); } static void gst_cairo_time_overlay_class_init (gpointer klass, gpointer class_data) { GstBaseTransformClass *trans_class; trans_class = (GstBaseTransformClass *) klass; parent_class = g_type_class_peek_parent (klass); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_cairo_time_overlay_set_caps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_cairo_time_overlay_get_unit_size); trans_class->transform = GST_DEBUG_FUNCPTR (gst_cairo_time_overlay_transform); } static void gst_cairo_time_overlay_init (GTypeInstance * instance, gpointer g_class) { } GType gst_cairo_time_overlay_get_type (void) { static GType cairo_time_overlay_type = 0; if (!cairo_time_overlay_type) { static const GTypeInfo cairo_time_overlay_info = { sizeof (GstCairoTimeOverlayClass), gst_cairo_time_overlay_base_init, NULL, gst_cairo_time_overlay_class_init, NULL, NULL, sizeof (GstCairoTimeOverlay), 0, gst_cairo_time_overlay_init, }; cairo_time_overlay_type = g_type_register_static (GST_TYPE_BASE_TRANSFORM, "GstCairoTimeOverlay", &cairo_time_overlay_info, 0); } return cairo_time_overlay_type; } gst-plugins-good-0.10.31/ext/cairo/gstcairorender.h0000644000175000017500000000340411671175352017071 00000000000000/* cairorender: CAIRO plugin for GStreamer * * Copyright (C) 2006-2009 Lutz Mueller * * 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_CAIRO_RENDER_H_ #define __GST_CAIRO_RENDER_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_CAIRO_RENDER (gst_cairo_render_get_type()) #define GST_CAIRO_RENDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAIRO_RENDER,GstCairoRender)) #define GST_CAIRO_RENDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAIRO_RENDER,GstCairoRenderClass)) typedef struct _GstCairoRender GstCairoRender; typedef struct _GstCairoRenderClass GstCairoRenderClass; struct _GstCairoRender { GstElement parent; GstPad *snk, *src; /* < private > */ /* Source */ cairo_surface_t *surface; gint width, height, stride; /* Sink */ gint64 offset, duration; gboolean png; cairo_format_t format; }; struct _GstCairoRenderClass { GstElementClass parent_class; }; GType gst_cairo_render_get_type (void) G_GNUC_CONST; G_END_DECLS #endif /* __GST_CAIRO_RENDER_H__ */ gst-plugins-good-0.10.31/ext/cairo/gstcairooverlay.c0000644000175000017500000001537211677341654017303 00000000000000/* GStreamer * Copyright (C) <2011> Jon Nordby * * 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-cairooverlay * * cairooverlay renders an overlay using a application provided render function. * * The full example can be found in tests/examples/cairo/cairo_overlay.c * * Example code * |[ * * #include <gst/gst.h> * #include <gst/video/video.h> * * ... * * typedef struct { * gboolean valid; * int width; * int height; * } CairoOverlayState; * * ... * * static void * prepare_overlay (GstElement * overlay, GstCaps * caps, gpointer user_data) * { * CairoOverlayState *state = (CairoOverlayState *)user_data; * * gst_video_format_parse_caps (caps, NULL, &state->width, &state->height); * state->valid = TRUE; * } * * static void * draw_overlay (GstElement * overlay, cairo_t * cr, guint64 timestamp, * guint64 duration, gpointer user_data) * { * CairoOverlayState *s = (CairoOverlayState *)user_data; * double scale; * * if (!s->valid) * return; * * scale = 2*(((timestamp/(int)1e7) % 70)+30)/100.0; * cairo_translate(cr, s->width/2, (s->height/2)-30); * cairo_scale (cr, scale, scale); * * cairo_move_to (cr, 0, 0); * cairo_curve_to (cr, 0,-30, -50,-30, -50,0); * cairo_curve_to (cr, -50,30, 0,35, 0,60 ); * cairo_curve_to (cr, 0,35, 50,30, 50,0 ); * * cairo_curve_to (cr, 50,-30, 0,-30, 0,0 ); * cairo_set_source_rgba (cr, 0.9, 0.0, 0.1, 0.7); * cairo_fill (cr); * } * * ... * * cairo_overlay = gst_element_factory_make ("cairooverlay", "overlay"); * * g_signal_connect (cairo_overlay, "draw", G_CALLBACK (draw_overlay), * overlay_state); * g_signal_connect (cairo_overlay, "caps-changed", * G_CALLBACK (prepare_overlay), overlay_state); * ... * * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstcairooverlay.h" #include "gstcairo-marshal.h" #include #include #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define TEMPLATE_CAPS GST_VIDEO_CAPS_BGRx " ; " GST_VIDEO_CAPS_BGRA " ; " #else #define TEMPLATE_CAPS GST_VIDEO_CAPS_xRGB " ; " GST_VIDEO_CAPS_ARGB " ; " #endif static GstStaticPadTemplate gst_cairo_overlay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (TEMPLATE_CAPS) ); static GstStaticPadTemplate gst_cairo_overlay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (TEMPLATE_CAPS) ); GST_BOILERPLATE (GstCairoOverlay, gst_cairo_overlay, GstVideoFilter, GST_TYPE_VIDEO_FILTER); enum { SIGNAL_DRAW, SIGNAL_CAPS_CHANGED, N_SIGNALS }; static guint gst_cairo_overlay_signals[N_SIGNALS]; static gboolean gst_cairo_overlay_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstCairoOverlay *overlay = GST_CAIRO_OVERLAY (btrans); gboolean ret; ret = gst_video_format_parse_caps (incaps, &overlay->format, &overlay->width, &overlay->height); if (G_UNLIKELY (!ret)) return FALSE; g_signal_emit (overlay, gst_cairo_overlay_signals[SIGNAL_CAPS_CHANGED], 0, incaps, NULL); return ret; } static GstFlowReturn gst_cairo_overlay_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) { GstCairoOverlay *overlay = GST_CAIRO_OVERLAY (btrans); cairo_surface_t *surface; cairo_t *cr; cairo_format_t format; format = (overlay->format == GST_VIDEO_FORMAT_ARGB || overlay->format == GST_VIDEO_FORMAT_BGRA) ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24; surface = cairo_image_surface_create_for_data (GST_BUFFER_DATA (buf), format, overlay->width, overlay->height, overlay->width * 4); if (G_UNLIKELY (!surface)) return GST_FLOW_ERROR; cr = cairo_create (surface); if (G_UNLIKELY (!cr)) { cairo_surface_destroy (surface); return GST_FLOW_ERROR; } g_signal_emit (overlay, gst_cairo_overlay_signals[SIGNAL_DRAW], 0, cr, GST_BUFFER_TIMESTAMP (buf), GST_BUFFER_DURATION (buf), NULL); cairo_destroy (cr); cairo_surface_destroy (surface); return GST_FLOW_OK; } static void gst_cairo_overlay_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Cairo overlay", "Filter/Editor/Video", "Render overlay on a video stream using Cairo", "Jon Nordby "); gst_element_class_add_static_pad_template (element_class, &gst_cairo_overlay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_cairo_overlay_src_template); } static void gst_cairo_overlay_class_init (GstCairoOverlayClass * klass) { GstBaseTransformClass *trans_class; trans_class = (GstBaseTransformClass *) klass; trans_class->set_caps = gst_cairo_overlay_set_caps; trans_class->transform_ip = gst_cairo_overlay_transform_ip; /** * GstCairoOverlay::draw: * @overlay: Overlay element emitting the signal. * @cr: Cairo context to draw to. * @timestamp: Timestamp (see #GstClockTime) of the current buffer. * @duration: Duration (see #GstClockTime) of the current buffer. * * This signal is emitted when the overlay should be drawn. */ gst_cairo_overlay_signals[SIGNAL_DRAW] = g_signal_new ("draw", G_TYPE_FROM_CLASS (klass), 0, 0, NULL, NULL, gst_cairo_marshal_VOID__BOXED_UINT64_UINT64, G_TYPE_NONE, 3, CAIRO_GOBJECT_TYPE_CONTEXT, G_TYPE_UINT64, G_TYPE_UINT64); /** * GstCairoOverlay::caps-changed: * @overlay: Overlay element emitting the signal. * @caps: The #GstCaps of the element. * * This signal is emitted when the caps of the element has changed. */ gst_cairo_overlay_signals[SIGNAL_CAPS_CHANGED] = g_signal_new ("caps-changed", G_TYPE_FROM_CLASS (klass), 0, 0, NULL, NULL, gst_cairo_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_CAPS); } static void gst_cairo_overlay_init (GstCairoOverlay * overlay, GstCairoOverlayClass * klass) { } gst-plugins-good-0.10.31/ext/cairo/gsttimeoverlay.h0000644000175000017500000000363011671175352017135 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_CAIRO_TIME_OVERLAY_H__ #define __GST_CAIRO_TIME_OVERLAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_CAIRO_TIME_OVERLAY \ (gst_cairo_time_overlay_get_type()) #define GST_CAIRO_TIME_OVERLAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAIRO_TIME_OVERLAY,GstCairoTimeOverlay)) #define GST_CAIRO_TIME_OVERLAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAIRO_TIME_OVERLAY,GstCairoTimeOverlayClass)) #define GST_IS_CAIRO_TIME_OVERLAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAIRO_TIME_OVERLAY)) #define GST_IS_CAIRO_TIME_OVERLAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAIRO_TIME_OVERLAY)) typedef struct _GstCairoTimeOverlay { GstBaseTransform basetransform; gint width, height; cairo_surface_t *surface; cairo_t *cr; int text_height; } GstCairoTimeOverlay; typedef struct _GstCairoTimeOverlayClass { GstBaseTransformClass parent_class; } GstCairoTimeOverlayClass; GType gst_cairo_time_overlay_get_type(void); G_END_DECLS #endif /* __GST_CAIRO_TIME_OVERLAY_H__ */ gst-plugins-good-0.10.31/ext/cairo/gstcairo-marshal.list0000644000175000017500000000004411671175352020037 00000000000000VOID:BOXED,UINT64,UINT64 VOID:BOXED gst-plugins-good-0.10.31/ext/cairo/gstcairorender.c0000644000175000017500000002477111677341654017104 00000000000000/* GStreamer * * Copyright (C) 2006-2009 Lutz Mueller * * 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-cairorender * * cairorender encodes a video stream into PDF, SVG, PNG or Postscript * * * Example launch line * |[ * gst-launch videotestsrc num-buffers=3 ! cairorender ! "application/pdf" ! filesink location=test.pdf * ]| * */ #include "gstcairorender.h" #include #include #ifdef CAIRO_HAS_PS_SURFACE #include #endif #ifdef CAIRO_HAS_PDF_SURFACE #include #endif #ifdef CAIRO_HAS_SVG_SURFACE #include #endif #include #include GST_DEBUG_CATEGORY_STATIC (cairo_render_debug); #define GST_CAT_DEFAULT cairo_render_debug static gboolean gst_cairo_render_event (GstPad * pad, GstEvent * e) { GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (e)) { case GST_EVENT_EOS: if (c->surface) cairo_surface_finish (c->surface); break; default: break; } return gst_pad_event_default (pad, e); } static cairo_status_t write_func (void *closure, const unsigned char *data, unsigned int length) { GstCairoRender *c = GST_CAIRO_RENDER (closure); GstBuffer *buf; GstFlowReturn r; buf = gst_buffer_new (); gst_buffer_set_data (buf, (guint8 *) data, length); gst_buffer_set_caps (buf, GST_PAD_CAPS (c->src)); if ((r = gst_pad_push (c->src, buf)) != GST_FLOW_OK) { GST_DEBUG_OBJECT (c, "Could not pass on buffer: %s.", gst_flow_get_name (r)); return CAIRO_STATUS_WRITE_ERROR; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t read_buffer (void *closure, unsigned char *data, unsigned int length) { GstBuffer *buf = GST_BUFFER (closure); if (GST_BUFFER_OFFSET (buf) + length > GST_BUFFER_SIZE (buf)) return CAIRO_STATUS_READ_ERROR; memcpy (data, GST_BUFFER_DATA (buf) + GST_BUFFER_OFFSET (buf), length); GST_BUFFER_OFFSET (buf) += length; return CAIRO_STATUS_SUCCESS; } static gboolean gst_cairo_render_push_surface (GstCairoRender * c, cairo_surface_t * surface) { cairo_status_t s = 0; cairo_t *cr; if (!c->surface) { s = cairo_surface_write_to_png_stream (surface, write_func, c); cairo_surface_destroy (surface); if (s != CAIRO_STATUS_SUCCESS) { GST_DEBUG_OBJECT (c, "Could not create PNG stream: %s.", cairo_status_to_string (s)); return FALSE; } return TRUE; } cr = cairo_create (c->surface); cairo_set_source_surface (cr, surface, 0, 0); cairo_paint (cr); cairo_show_page (cr); cairo_destroy (cr); cairo_surface_destroy (surface); return (TRUE); } static GstFlowReturn gst_cairo_render_chain (GstPad * pad, GstBuffer * buf) { GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad)); cairo_surface_t *s; gboolean success; if (G_UNLIKELY (c->width <= 0 || c->height <= 0 || c->stride <= 0)) return GST_FLOW_NOT_NEGOTIATED; if (c->png) { GST_BUFFER_OFFSET (buf) = 0; s = cairo_image_surface_create_from_png_stream (read_buffer, buf); } else { if (c->format == CAIRO_FORMAT_ARGB32) { guint i, j; guint8 *data = GST_BUFFER_DATA (buf); buf = gst_buffer_make_writable (buf); /* Cairo ARGB is pre-multiplied with the alpha * value, i.e. 0x80008000 is half transparent * green */ for (i = 0; i < c->height; i++) { for (j = 0; j < c->width; j++) { #if G_BYTE_ORDER == G_LITTLE_ENDIAN guint8 alpha = data[3]; data[0] = (data[0] * alpha) >> 8; data[1] = (data[1] * alpha) >> 8; data[2] = (data[2] * alpha) >> 8; #else guint8 alpha = data[0]; data[1] = (data[1] * alpha) >> 8; data[2] = (data[2] * alpha) >> 8; data[3] = (data[3] * alpha) >> 8; #endif data += 4; } } } s = cairo_image_surface_create_for_data (GST_BUFFER_DATA (buf), c->format, c->width, c->height, c->stride); } success = gst_cairo_render_push_surface (c, s); gst_buffer_unref (buf); return success ? GST_FLOW_OK : GST_FLOW_ERROR; } static gboolean gst_cairo_render_setcaps_sink (GstPad * pad, GstCaps * caps) { GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad)); GstStructure *s = gst_caps_get_structure (caps, 0); const gchar *mime = gst_structure_get_name (s); gint fps_n = 0, fps_d = 1; gint w, h; GST_DEBUG_OBJECT (c, "Got caps (%s).", mime); if ((c->png = !strcmp (mime, "image/png"))) return TRUE; /* Width and height */ if (!gst_structure_get_int (s, "width", &c->width) || !gst_structure_get_int (s, "height", &c->height)) { GST_ERROR_OBJECT (c, "Invalid caps"); return FALSE; } /* Colorspace */ if (!strcmp (mime, "video/x-raw-yuv") || !strcmp (mime, "video/x-raw-grey")) { c->format = CAIRO_FORMAT_A8; c->stride = GST_ROUND_UP_4 (c->width); } else if (!strcmp (mime, "video/x-raw-rgb")) { gint bpp; if (!gst_structure_get_int (s, "bpp", &bpp)) { GST_ERROR_OBJECT (c, "Invalid caps"); return FALSE; } c->format = (bpp == 32) ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24; c->stride = 4 * c->width; } else { GST_DEBUG_OBJECT (c, "Unknown mime type '%s'.", mime); return FALSE; } /* Framerate */ gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d); /* Create output caps */ caps = gst_pad_get_allowed_caps (c->src); caps = gst_caps_make_writable (caps); gst_caps_truncate (caps); s = gst_caps_get_structure (caps, 0); mime = gst_structure_get_name (s); gst_structure_set (s, "height", G_TYPE_INT, c->height, "width", G_TYPE_INT, c->width, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); if (c->surface) { cairo_surface_destroy (c->surface); c->surface = NULL; } w = c->width; h = c->height; GST_DEBUG_OBJECT (c, "Setting src caps %" GST_PTR_FORMAT, caps); gst_pad_set_caps (c->src, caps); #if CAIRO_HAS_PS_SURFACE if (!strcmp (mime, "application/postscript")) { c->surface = cairo_ps_surface_create_for_stream (write_func, c, w, h); } else #endif #if CAIRO_HAS_PDF_SURFACE if (!strcmp (mime, "application/pdf")) { c->surface = cairo_pdf_surface_create_for_stream (write_func, c, w, h); } else #endif #if CAIRO_HAS_SVG_SURFACE if (!strcmp (mime, "image/svg+xml")) { c->surface = cairo_svg_surface_create_for_stream (write_func, c, w, h); } else #endif { gst_caps_unref (caps); return FALSE; } gst_caps_unref (caps); return TRUE; } #define SIZE_CAPS "width = (int) [ 1, MAX], height = (int) [ 1, MAX] " #if CAIRO_HAS_PDF_SURFACE #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 #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 #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 #define PNG_CAPS "image/png, " SIZE_CAPS #define PNG_CAPS2 "; image/png, " SIZE_CAPS #else #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 PNG_CAPS2)); GST_BOILERPLATE (GstCairoRender, gst_cairo_render, GstElement, GST_TYPE_ELEMENT); static void gst_cairo_render_init (GstCairoRender * c, GstCairoRenderClass * klass) { /* The sink */ c->snk = gst_pad_new_from_static_template (&t_snk, "sink"); gst_pad_set_event_function (c->snk, gst_cairo_render_event); gst_pad_set_chain_function (c->snk, gst_cairo_render_chain); gst_pad_set_setcaps_function (c->snk, gst_cairo_render_setcaps_sink); gst_pad_use_fixed_caps (c->snk); gst_element_add_pad (GST_ELEMENT (c), c->snk); /* The source */ c->src = gst_pad_new_from_static_template (&t_src, "src"); gst_pad_use_fixed_caps (c->src); gst_element_add_pad (GST_ELEMENT (c), c->src); c->width = 0; c->height = 0; c->stride = 0; } static void gst_cairo_render_base_init (gpointer g_class) { GstElementClass *ec = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (ec, "Cairo encoder", "Codec/Encoder", "Encodes streams using Cairo", "Lutz Mueller "); gst_element_class_add_static_pad_template (ec, &t_snk); gst_element_class_add_static_pad_template (ec, &t_src); } static void gst_cairo_render_finalize (GObject * object) { GstCairoRender *c = GST_CAIRO_RENDER (object); if (c->surface) { cairo_surface_destroy (c->surface); c->surface = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_cairo_render_class_init (GstCairoRenderClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = gst_cairo_render_finalize; GST_DEBUG_CATEGORY_INIT (cairo_render_debug, "cairo_render", 0, "Cairo encoder"); } gst-plugins-good-0.10.31/ext/cairo/gsttextoverlay.h0000644000175000017500000000574111677341654017176 00000000000000 #ifndef __GST_CAIRO_TEXT_OVERLAY_H__ #define __GST_CAIRO_TEXT_OVERLAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_CAIRO_TEXT_OVERLAY (gst_text_overlay_get_type()) #define GST_CAIRO_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ GST_TYPE_CAIRO_TEXT_OVERLAY, GstCairoTextOverlay)) #define GST_CAIRO_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ GST_TYPE_CAIRO_TEXT_OVERLAY, GstCairoTextOverlayClass)) #define GST_CAIRO_TEXT_OVERLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\ GST_TYPE_CAIRO_TEXT_OVERLAY, GstCairoTextOverlayClass)) #define GST_IS_CAIRO_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ GST_TYPE_CAIRO_TEXT_OVERLAY)) #define GST_IS_CAIRO_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ GST_TYPE_CAIRO_TEXT_OVERLAY)) typedef struct _GstCairoTextOverlay GstCairoTextOverlay; typedef struct _GstCairoTextOverlayClass GstCairoTextOverlayClass; typedef enum _GstCairoTextOverlayVAlign GstCairoTextOverlayVAlign; typedef enum _GstCairoTextOverlayHAlign GstCairoTextOverlayHAlign; enum _GstCairoTextOverlayVAlign { GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE, GST_CAIRO_TEXT_OVERLAY_VALIGN_BOTTOM, GST_CAIRO_TEXT_OVERLAY_VALIGN_TOP }; enum _GstCairoTextOverlayHAlign { GST_CAIRO_TEXT_OVERLAY_HALIGN_LEFT, GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER, GST_CAIRO_TEXT_OVERLAY_HALIGN_RIGHT }; struct _GstCairoTextOverlay { GstElement element; GstPad *video_sinkpad; GstPad *text_sinkpad; GstPad *srcpad; GstCollectPads *collect; GstCollectData *video_collect_data; GstCollectData *text_collect_data; GstPadEventFunction collect_event; gint width; gint height; gint fps_n; gint fps_d; GstCairoTextOverlayVAlign valign; GstCairoTextOverlayHAlign halign; gint xpad; gint ypad; gint deltax; gint deltay; gchar *default_text; gboolean want_shading; guchar *text_fill_image; guchar *text_outline_image; gint font_height; gint text_x0, text_x1; /* start/end x position of text */ gint text_dy; gboolean need_render; gchar *font; gint slant; gint weight; gdouble scale; gboolean silent; }; struct _GstCairoTextOverlayClass { GstElementClass parent_class; }; GType gst_text_overlay_get_type (void); G_END_DECLS #endif /* __GST_CAIRO_TEXT_OVERLAY_H */ gst-plugins-good-0.10.31/ext/cairo/Makefile.in0000644000175000017500000011415311720560225015746 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # these are the variables your Makefile.am should set # the example is based on the colorbalance interface #glib_enum_headers=$(colorbalance_headers) #glib_enum_define=GST_COLOR_BALANCE #glib_gen_prefix=gst_color_balance #glib_gen_basename=colorbalance VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak subdir = ext/cairo ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstcairo_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libgstcairo_la_SOURCES_DIST = gstcairo.c gsttimeoverlay.c \ gsttextoverlay.c gstcairorender.c gstcairooverlay.c @USE_CAIRO_GOBJECT_TRUE@am__objects_1 = \ @USE_CAIRO_GOBJECT_TRUE@ libgstcairo_la-gstcairooverlay.lo am_libgstcairo_la_OBJECTS = libgstcairo_la-gstcairo.lo \ libgstcairo_la-gsttimeoverlay.lo \ libgstcairo_la-gsttextoverlay.lo \ libgstcairo_la-gstcairorender.lo $(am__objects_1) @USE_CAIRO_GOBJECT_TRUE@am__objects_2 = \ @USE_CAIRO_GOBJECT_TRUE@ libgstcairo_la-gstcairo-marshal.lo nodist_libgstcairo_la_OBJECTS = $(am__objects_2) libgstcairo_la_OBJECTS = $(am_libgstcairo_la_OBJECTS) \ $(nodist_libgstcairo_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstcairo_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstcairo_la_CFLAGS) $(CFLAGS) \ $(libgstcairo_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstcairo_la_SOURCES) $(nodist_libgstcairo_la_SOURCES) DIST_SOURCES = $(am__libgstcairo_la_SOURCES_DIST) am__noinst_HEADERS_DIST = gsttimeoverlay.h gsttextoverlay.h \ gstcairorender.h gstcairooverlay.h HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstcairo.la @USE_CAIRO_GOBJECT_TRUE@glib_enum_define = GST_CAIRO @USE_CAIRO_GOBJECT_TRUE@glib_gen_prefix = gst_cairo @USE_CAIRO_GOBJECT_TRUE@glib_gen_basename = gstcairo @USE_CAIRO_GOBJECT_TRUE@enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") @USE_CAIRO_GOBJECT_TRUE@built_sources = gstcairo-marshal.c @USE_CAIRO_GOBJECT_TRUE@built_headers = gstcairo-marshal.h @USE_CAIRO_GOBJECT_TRUE@BUILT_SOURCES = $(built_sources) $(built_headers) @USE_CAIRO_GOBJECT_TRUE@gstcairo_gobject_dep_sources = gstcairooverlay.c @USE_CAIRO_GOBJECT_TRUE@gstcairo_gobject_dep_headers = gstcairooverlay.h @USE_CAIRO_GOBJECT_TRUE@CLEANFILES = $(BUILT_SOURCES) noinst_HEADERS = \ gsttimeoverlay.h \ gsttextoverlay.h \ gstcairorender.h \ $(gstcairo_gobject_dep_headers) libgstcairo_la_SOURCES = \ gstcairo.c \ gsttimeoverlay.c \ gsttextoverlay.c \ gstcairorender.c \ $(gstcairo_gobject_dep_sources) nodist_libgstcairo_la_SOURCES = \ $(built_sources) libgstcairo_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(CAIRO_CFLAGS) $(CAIRO_GOBJECT_CFLAGS) libgstcairo_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(CAIRO_LIBS) $(CAIRO_GOBJECT_LIBS) $(LIBM) libgstcairo_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcairo_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = gstcairo-marshal.list all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/gst-glib-gen.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/cairo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/cairo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/gst-glib-gen.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstcairo.la: $(libgstcairo_la_OBJECTS) $(libgstcairo_la_DEPENDENCIES) $(EXTRA_libgstcairo_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstcairo_la_LINK) -rpath $(plugindir) $(libgstcairo_la_OBJECTS) $(libgstcairo_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairo-marshal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairooverlay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gstcairorender.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gsttextoverlay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcairo_la-gsttimeoverlay.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstcairo_la-gstcairo.lo: gstcairo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairo.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairo.Tpo -c -o libgstcairo_la-gstcairo.lo `test -f 'gstcairo.c' || echo '$(srcdir)/'`gstcairo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairo.Tpo $(DEPDIR)/libgstcairo_la-gstcairo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairo.c' object='libgstcairo_la-gstcairo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairo.lo `test -f 'gstcairo.c' || echo '$(srcdir)/'`gstcairo.c libgstcairo_la-gsttimeoverlay.lo: gsttimeoverlay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gsttimeoverlay.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gsttimeoverlay.Tpo -c -o libgstcairo_la-gsttimeoverlay.lo `test -f 'gsttimeoverlay.c' || echo '$(srcdir)/'`gsttimeoverlay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gsttimeoverlay.Tpo $(DEPDIR)/libgstcairo_la-gsttimeoverlay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttimeoverlay.c' object='libgstcairo_la-gsttimeoverlay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gsttimeoverlay.lo `test -f 'gsttimeoverlay.c' || echo '$(srcdir)/'`gsttimeoverlay.c libgstcairo_la-gsttextoverlay.lo: gsttextoverlay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gsttextoverlay.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gsttextoverlay.Tpo -c -o libgstcairo_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gsttextoverlay.Tpo $(DEPDIR)/libgstcairo_la-gsttextoverlay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttextoverlay.c' object='libgstcairo_la-gsttextoverlay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c libgstcairo_la-gstcairorender.lo: gstcairorender.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairorender.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairorender.Tpo -c -o libgstcairo_la-gstcairorender.lo `test -f 'gstcairorender.c' || echo '$(srcdir)/'`gstcairorender.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairorender.Tpo $(DEPDIR)/libgstcairo_la-gstcairorender.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairorender.c' object='libgstcairo_la-gstcairorender.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairorender.lo `test -f 'gstcairorender.c' || echo '$(srcdir)/'`gstcairorender.c libgstcairo_la-gstcairooverlay.lo: gstcairooverlay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairooverlay.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairooverlay.Tpo -c -o libgstcairo_la-gstcairooverlay.lo `test -f 'gstcairooverlay.c' || echo '$(srcdir)/'`gstcairooverlay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairooverlay.Tpo $(DEPDIR)/libgstcairo_la-gstcairooverlay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairooverlay.c' object='libgstcairo_la-gstcairooverlay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairooverlay.lo `test -f 'gstcairooverlay.c' || echo '$(srcdir)/'`gstcairooverlay.c libgstcairo_la-gstcairo-marshal.lo: gstcairo-marshal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -MT libgstcairo_la-gstcairo-marshal.lo -MD -MP -MF $(DEPDIR)/libgstcairo_la-gstcairo-marshal.Tpo -c -o libgstcairo_la-gstcairo-marshal.lo `test -f 'gstcairo-marshal.c' || echo '$(srcdir)/'`gstcairo-marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcairo_la-gstcairo-marshal.Tpo $(DEPDIR)/libgstcairo_la-gstcairo-marshal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcairo-marshal.c' object='libgstcairo_la-gstcairo-marshal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcairo_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcairo_la_CFLAGS) $(CFLAGS) -c -o libgstcairo_la-gstcairo-marshal.lo `test -f 'gstcairo-marshal.c' || echo '$(srcdir)/'`gstcairo-marshal.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # these are all the rules generating the relevant files @USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list @USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ @USE_CAIRO_GOBJECT_TRUE@ mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h @USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list @USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ @USE_CAIRO_GOBJECT_TRUE@ glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ @USE_CAIRO_GOBJECT_TRUE@ mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c @USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) @USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)glib-mkenums \ @USE_CAIRO_GOBJECT_TRUE@ --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ @USE_CAIRO_GOBJECT_TRUE@ --fprod "\n/* enumerations from \"@filename@\" */\n" \ @USE_CAIRO_GOBJECT_TRUE@ --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ @USE_CAIRO_GOBJECT_TRUE@ --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ @USE_CAIRO_GOBJECT_TRUE@ $^ > $@ @USE_CAIRO_GOBJECT_TRUE@$(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) @USE_CAIRO_GOBJECT_TRUE@ @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi @USE_CAIRO_GOBJECT_TRUE@ $(AM_V_GEN)glib-mkenums \ @USE_CAIRO_GOBJECT_TRUE@ --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ @USE_CAIRO_GOBJECT_TRUE@ --fprod "\n/* enumerations from \"@filename@\" */" \ @USE_CAIRO_GOBJECT_TRUE@ --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ @USE_CAIRO_GOBJECT_TRUE@ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ @USE_CAIRO_GOBJECT_TRUE@ --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ @USE_CAIRO_GOBJECT_TRUE@ $^ > $@ # a hack rule to make sure .Plo files exist because they get include'd # from Makefile's @USE_CAIRO_GOBJECT_TRUE@.deps/%-marshal.Plo: @USE_CAIRO_GOBJECT_TRUE@ @touch $@ @USE_CAIRO_GOBJECT_TRUE@.deps/%-enumtypes.Plo: @USE_CAIRO_GOBJECT_TRUE@ @touch $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/cairo/gsttextoverlay.c0000644000175000017500000010007511677341654017165 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * 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-cairotextoverlay * * cairotextoverlay renders the text on top of the video frames. * * * Example launch line * |[ * gst-launch videotestsrc ! cairotextoverlay text="hello" ! autovideosink * ]| * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "gsttextoverlay.h" #include /* FIXME: * - calculating the position of the shading rectangle is * not really right (try with text "L"), to say the least. * Seems to work at least with latin script though. * - check final x/y position and text width/height so that * we don't do out-of-memory access when blitting the text. * Also, we do not want to blit over the right or left margin. * - what about text with newline characters? Cairo doesn't deal * with that (we'd need to fix text_height usage for that as well) * - upstream caps renegotiation, ie. when video window gets resized */ GST_DEBUG_CATEGORY_EXTERN (cairo_debug); #define GST_CAT_DEFAULT cairo_debug enum { ARG_0, ARG_TEXT, ARG_SHADING, ARG_VALIGN, ARG_HALIGN, ARG_XPAD, ARG_YPAD, ARG_DELTAX, ARG_DELTAY, ARG_SILENT, ARG_FONT_DESC }; #define DEFAULT_YPAD 25 #define DEFAULT_XPAD 25 #define DEFAULT_FONT "sans" #define DEFAULT_SILENT FALSE #define GST_CAIRO_TEXT_OVERLAY_DEFAULT_SCALE 20.0 static GstStaticPadTemplate cairo_text_overlay_src_template_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstStaticPadTemplate video_sink_template_factory = GST_STATIC_PAD_TEMPLATE ("video_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstStaticPadTemplate text_sink_template_factory = GST_STATIC_PAD_TEMPLATE ("text_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("text/plain") ); static void gst_text_overlay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_text_overlay_change_state (GstElement * element, GstStateChange transition); static GstCaps *gst_text_overlay_getcaps (GstPad * pad); static gboolean gst_text_overlay_setcaps (GstPad * pad, GstCaps * caps); static GstPadLinkReturn gst_text_overlay_text_pad_linked (GstPad * pad, GstPad * peer); static void gst_text_overlay_text_pad_unlinked (GstPad * pad); static GstFlowReturn gst_text_overlay_collected (GstCollectPads * pads, gpointer data); static void gst_text_overlay_finalize (GObject * object); static void gst_text_overlay_font_init (GstCairoTextOverlay * overlay); static gboolean gst_text_overlay_src_event (GstPad * pad, GstEvent * event); static gboolean gst_text_overlay_video_event (GstPad * pad, GstEvent * event); /* These macros are adapted from videotestsrc.c */ #define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) #define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) #define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2) #define I420_Y_OFFSET(w,h) (0) #define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) #define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) #define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) GST_BOILERPLATE (GstCairoTextOverlay, gst_text_overlay, GstElement, GST_TYPE_ELEMENT); static void gst_text_overlay_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &cairo_text_overlay_src_template_factory); gst_element_class_add_static_pad_template (element_class, &video_sink_template_factory); gst_element_class_add_static_pad_template (element_class, &text_sink_template_factory); gst_element_class_set_details_simple (element_class, "Text overlay", "Filter/Editor/Video", "Adds text strings on top of a video buffer", "David Schleef "); } static void gst_text_overlay_class_init (GstCairoTextOverlayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_text_overlay_finalize; gobject_class->set_property = gst_text_overlay_set_property; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_text_overlay_change_state); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEXT, g_param_spec_string ("text", "text", "Text to be display.", "", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SHADING, g_param_spec_boolean ("shaded-background", "shaded background", "Whether to shade the background under the text area", FALSE, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VALIGN, g_param_spec_string ("valign", "vertical alignment", "Vertical alignment of the text. " "Can be either 'baseline', 'bottom', or 'top'", "baseline", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HALIGN, g_param_spec_string ("halign", "horizontal alignment", "Horizontal alignment of the text. " "Can be either 'left', 'right', or 'center'", "center", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_XPAD, g_param_spec_int ("xpad", "horizontal paddding", "Horizontal paddding when using left/right alignment", G_MININT, G_MAXINT, DEFAULT_XPAD, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_YPAD, g_param_spec_int ("ypad", "vertical padding", "Vertical padding when using top/bottom alignment", G_MININT, G_MAXINT, DEFAULT_YPAD, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELTAX, g_param_spec_int ("deltax", "X position modifier", "Shift X position to the left or to the right. Unit is pixels.", G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DELTAY, g_param_spec_int ("deltay", "Y position modifier", "Shift Y position up or down. Unit is pixels.", G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FONT_DESC, g_param_spec_string ("font-desc", "font description", "Pango font description of font " "to be used for rendering. " "See documentation of " "pango_font_description_from_string" " for syntax.", "", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); /* FIXME 0.11: rename to "visible" or "text-visible" or "render-text" */ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT, g_param_spec_boolean ("silent", "silent", "Whether to render the text string", DEFAULT_SILENT, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); } static void gst_text_overlay_finalize (GObject * object) { GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (object); gst_collect_pads_stop (overlay->collect); gst_object_unref (overlay->collect); g_free (overlay->text_fill_image); g_free (overlay->text_outline_image); g_free (overlay->default_text); g_free (overlay->font); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_text_overlay_init (GstCairoTextOverlay * overlay, GstCairoTextOverlayClass * klass) { /* video sink */ overlay->video_sinkpad = gst_pad_new_from_static_template (&video_sink_template_factory, "video_sink"); gst_pad_set_getcaps_function (overlay->video_sinkpad, GST_DEBUG_FUNCPTR (gst_text_overlay_getcaps)); gst_pad_set_setcaps_function (overlay->video_sinkpad, GST_DEBUG_FUNCPTR (gst_text_overlay_setcaps)); gst_element_add_pad (GST_ELEMENT (overlay), overlay->video_sinkpad); /* text sink */ overlay->text_sinkpad = gst_pad_new_from_static_template (&text_sink_template_factory, "text_sink"); gst_pad_set_link_function (overlay->text_sinkpad, GST_DEBUG_FUNCPTR (gst_text_overlay_text_pad_linked)); gst_pad_set_unlink_function (overlay->text_sinkpad, GST_DEBUG_FUNCPTR (gst_text_overlay_text_pad_unlinked)); gst_element_add_pad (GST_ELEMENT (overlay), overlay->text_sinkpad); /* (video) source */ overlay->srcpad = gst_pad_new_from_static_template (&cairo_text_overlay_src_template_factory, "src"); gst_pad_set_getcaps_function (overlay->srcpad, GST_DEBUG_FUNCPTR (gst_text_overlay_getcaps)); gst_pad_set_event_function (overlay->srcpad, GST_DEBUG_FUNCPTR (gst_text_overlay_src_event)); gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad); overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER; overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE; overlay->xpad = DEFAULT_XPAD; overlay->ypad = DEFAULT_YPAD; overlay->deltax = 0; overlay->deltay = 0; overlay->default_text = g_strdup (""); overlay->need_render = TRUE; overlay->font = g_strdup (DEFAULT_FONT); gst_text_overlay_font_init (overlay); overlay->silent = DEFAULT_SILENT; overlay->fps_n = 0; overlay->fps_d = 1; overlay->collect = gst_collect_pads_new (); gst_collect_pads_set_function (overlay->collect, GST_DEBUG_FUNCPTR (gst_text_overlay_collected), overlay); overlay->video_collect_data = gst_collect_pads_add_pad (overlay->collect, overlay->video_sinkpad, sizeof (GstCollectData)); /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events. Nicked from avimux. */ overlay->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (overlay->video_sinkpad); gst_pad_set_event_function (overlay->video_sinkpad, GST_DEBUG_FUNCPTR (gst_text_overlay_video_event)); /* text pad will be added when it is linked */ overlay->text_collect_data = NULL; } static void gst_text_overlay_font_init (GstCairoTextOverlay * overlay) { cairo_font_extents_t font_extents; cairo_surface_t *surface; cairo_t *cr; gchar *font_desc, *sep; font_desc = g_ascii_strdown (overlay->font, -1); /* cairo_select_font_face() does not parse the size at the end, so we have * to do that ourselves; same for slate and weight */ sep = MAX (strrchr (font_desc, ' '), strrchr (font_desc, ',')); if (sep != NULL && g_strtod (sep, NULL) > 0.0) { /* there may be a suffix such as 'px', but we just ignore that for now */ overlay->scale = g_strtod (sep, NULL); } else { overlay->scale = GST_CAIRO_TEXT_OVERLAY_DEFAULT_SCALE; } if (strstr (font_desc, "bold")) overlay->weight = CAIRO_FONT_WEIGHT_BOLD; else overlay->weight = CAIRO_FONT_WEIGHT_NORMAL; if (strstr (font_desc, "italic")) overlay->slant = CAIRO_FONT_SLANT_ITALIC; else if (strstr (font_desc, "oblique")) overlay->slant = CAIRO_FONT_SLANT_OBLIQUE; else overlay->slant = CAIRO_FONT_SLANT_NORMAL; GST_LOG_OBJECT (overlay, "Font desc: '%s', scale=%f, weight=%d, slant=%d", overlay->font, overlay->scale, overlay->weight, overlay->slant); surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256, 256); cr = cairo_create (surface); cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); cairo_set_font_size (cr, overlay->scale); /* this has a static leak: * http://lists.freedesktop.org/archives/cairo/2007-May/010623.html */ cairo_font_extents (cr, &font_extents); overlay->font_height = GST_ROUND_UP_2 ((guint) font_extents.height); overlay->need_render = TRUE; cairo_destroy (cr); cairo_surface_destroy (surface); g_free (font_desc); } static void gst_text_overlay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (object); GST_OBJECT_LOCK (overlay); switch (prop_id) { case ARG_TEXT:{ g_free (overlay->default_text); overlay->default_text = g_value_dup_string (value); break; } case ARG_SHADING:{ overlay->want_shading = g_value_get_boolean (value); break; } case ARG_VALIGN:{ const gchar *s = g_value_get_string (value); if (g_ascii_strcasecmp (s, "baseline") == 0) overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE; else if (g_ascii_strcasecmp (s, "bottom") == 0) overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_BOTTOM; else if (g_ascii_strcasecmp (s, "top") == 0) overlay->valign = GST_CAIRO_TEXT_OVERLAY_VALIGN_TOP; else g_warning ("Invalid 'valign' property value: %s", s); break; } case ARG_HALIGN:{ const gchar *s = g_value_get_string (value); if (g_ascii_strcasecmp (s, "left") == 0) overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_LEFT; else if (g_ascii_strcasecmp (s, "right") == 0) overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_RIGHT; else if (g_ascii_strcasecmp (s, "center") == 0) overlay->halign = GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER; else g_warning ("Invalid 'halign' property value: %s", s); break; } case ARG_XPAD:{ overlay->xpad = g_value_get_int (value); break; } case ARG_YPAD:{ overlay->ypad = g_value_get_int (value); break; } case ARG_DELTAX:{ overlay->deltax = g_value_get_int (value); break; } case ARG_DELTAY:{ overlay->deltay = g_value_get_int (value); break; } case ARG_FONT_DESC:{ g_free (overlay->font); overlay->font = g_value_dup_string (value); if (overlay->font == NULL) overlay->font = g_strdup (DEFAULT_FONT); gst_text_overlay_font_init (overlay); break; } case ARG_SILENT: overlay->silent = g_value_get_boolean (value); break; default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } overlay->need_render = TRUE; GST_OBJECT_UNLOCK (overlay); } static void gst_text_overlay_render_text (GstCairoTextOverlay * overlay, const gchar * text, gint textlen) { cairo_text_extents_t extents; cairo_surface_t *surface; cairo_t *cr; gchar *string; double x, y; if (overlay->silent) { GST_DEBUG_OBJECT (overlay, "Silent mode, not rendering"); return; } if (textlen < 0) textlen = strlen (text); if (!overlay->need_render) { GST_DEBUG ("Using previously rendered text."); g_return_if_fail (overlay->text_fill_image != NULL); g_return_if_fail (overlay->text_outline_image != NULL); return; } string = g_strndup (text, textlen); GST_DEBUG ("Rendering text '%s' on cairo RGBA surface", string); overlay->text_fill_image = g_realloc (overlay->text_fill_image, 4 * overlay->width * overlay->font_height); surface = cairo_image_surface_create_for_data (overlay->text_fill_image, CAIRO_FORMAT_ARGB32, overlay->width, overlay->font_height, overlay->width * 4); cr = cairo_create (surface); cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); cairo_set_font_size (cr, overlay->scale); cairo_save (cr); cairo_rectangle (cr, 0, 0, overlay->width, overlay->font_height); cairo_set_source_rgba (cr, 0, 0, 0, 1.0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_fill (cr); cairo_restore (cr); cairo_save (cr); cairo_text_extents (cr, string, &extents); cairo_set_source_rgba (cr, 1, 1, 1, 1.0); switch (overlay->halign) { case GST_CAIRO_TEXT_OVERLAY_HALIGN_LEFT: x = overlay->xpad; break; case GST_CAIRO_TEXT_OVERLAY_HALIGN_CENTER: x = (overlay->width - extents.width) / 2; break; case GST_CAIRO_TEXT_OVERLAY_HALIGN_RIGHT: x = overlay->width - extents.width - overlay->xpad; break; default: x = 0; } x += overlay->deltax; overlay->text_x0 = x; overlay->text_x1 = x + extents.x_advance; overlay->text_dy = (extents.height + extents.y_bearing); y = overlay->font_height - overlay->text_dy; cairo_move_to (cr, x, y); cairo_show_text (cr, string); cairo_restore (cr); cairo_destroy (cr); cairo_surface_destroy (surface); /* ----------- */ overlay->text_outline_image = g_realloc (overlay->text_outline_image, 4 * overlay->width * overlay->font_height); surface = cairo_image_surface_create_for_data (overlay->text_outline_image, CAIRO_FORMAT_ARGB32, overlay->width, overlay->font_height, overlay->width * 4); cr = cairo_create (surface); cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); cairo_set_font_size (cr, overlay->scale); cairo_save (cr); cairo_rectangle (cr, 0, 0, overlay->width, overlay->font_height); cairo_set_source_rgba (cr, 0, 0, 0, 1.0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_fill (cr); cairo_restore (cr); cairo_save (cr); cairo_move_to (cr, x, y); cairo_set_source_rgba (cr, 1, 1, 1, 1.0); cairo_set_line_width (cr, 1.0); cairo_text_path (cr, string); cairo_stroke (cr); cairo_restore (cr); g_free (string); cairo_destroy (cr); cairo_surface_destroy (surface); overlay->need_render = FALSE; } static GstCaps * gst_text_overlay_getcaps (GstPad * pad) { GstCairoTextOverlay *overlay; GstPad *otherpad; GstCaps *caps; overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); if (pad == overlay->srcpad) otherpad = overlay->video_sinkpad; else otherpad = overlay->srcpad; /* we can do what the peer can */ caps = gst_pad_peer_get_caps (otherpad); if (caps) { GstCaps *temp; const GstCaps *templ; GST_DEBUG_OBJECT (pad, "peer caps %" GST_PTR_FORMAT, caps); /* filtered against our padtemplate */ templ = gst_pad_get_pad_template_caps (otherpad); GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ); temp = gst_caps_intersect (caps, templ); GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp); gst_caps_unref (caps); /* this is what we can do */ caps = temp; } else { /* no peer, our padtemplate is enough then */ caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); } GST_DEBUG_OBJECT (overlay, "returning %" GST_PTR_FORMAT, caps); gst_object_unref (overlay); return caps; } /* FIXME: upstream nego (e.g. when the video window is resized) */ static gboolean gst_text_overlay_setcaps (GstPad * pad, GstCaps * caps) { GstCairoTextOverlay *overlay; GstStructure *structure; gboolean ret = FALSE; const GValue *fps; if (!GST_PAD_IS_SINK (pad)) return TRUE; g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); overlay->width = 0; overlay->height = 0; structure = gst_caps_get_structure (caps, 0); fps = gst_structure_get_value (structure, "framerate"); if (gst_structure_get_int (structure, "width", &overlay->width) && gst_structure_get_int (structure, "height", &overlay->height) && fps != NULL) { ret = gst_pad_set_caps (overlay->srcpad, caps); } overlay->fps_n = gst_value_get_fraction_numerator (fps); overlay->fps_d = gst_value_get_fraction_denominator (fps); gst_object_unref (overlay); return ret; } static GstPadLinkReturn gst_text_overlay_text_pad_linked (GstPad * pad, GstPad * peer) { GstCairoTextOverlay *overlay; overlay = GST_CAIRO_TEXT_OVERLAY (GST_PAD_PARENT (pad)); GST_DEBUG_OBJECT (overlay, "Text pad linked"); if (overlay->text_collect_data == NULL) { overlay->text_collect_data = gst_collect_pads_add_pad (overlay->collect, overlay->text_sinkpad, sizeof (GstCollectData)); } overlay->need_render = TRUE; return GST_PAD_LINK_OK; } static void gst_text_overlay_text_pad_unlinked (GstPad * pad) { GstCairoTextOverlay *overlay; /* don't use gst_pad_get_parent() here, will deadlock */ overlay = GST_CAIRO_TEXT_OVERLAY (GST_PAD_PARENT (pad)); GST_DEBUG_OBJECT (overlay, "Text pad unlinked"); if (overlay->text_collect_data) { gst_collect_pads_remove_pad (overlay->collect, overlay->text_sinkpad); overlay->text_collect_data = NULL; } overlay->need_render = TRUE; } #define BOX_SHADING_VAL -80 #define BOX_XPAD 6 #define BOX_YPAD 6 static inline void gst_text_overlay_shade_y (GstCairoTextOverlay * overlay, guchar * dest, guint dest_stride, gint y0, gint y1) { gint i, j, x0, x1; x0 = CLAMP (overlay->text_x0 - BOX_XPAD, 0, overlay->width); x1 = CLAMP (overlay->text_x1 + BOX_XPAD, 0, overlay->width); y0 = CLAMP (y0 - BOX_YPAD, 0, overlay->height); y1 = CLAMP (y1 + BOX_YPAD, 0, overlay->height); for (i = y0; i < y1; ++i) { for (j = x0; j < x1; ++j) { gint y = dest[(i * dest_stride) + j] + BOX_SHADING_VAL; dest[(i * dest_stride) + j] = CLAMP (y, 0, 255); } } } static inline void gst_text_overlay_blit_1 (GstCairoTextOverlay * overlay, guchar * dest, guchar * text_image, gint val, guint dest_stride, gint y0) { gint i, j; gint x, a, y; gint y1; y = val; y0 = MIN (y0, overlay->height); y1 = MIN (y0 + overlay->font_height, overlay->height); for (i = y0; i < y1; i++) { for (j = 0; j < overlay->width; j++) { x = dest[i * dest_stride + j]; a = text_image[4 * ((i - y0) * overlay->width + j) + 1]; dest[i * dest_stride + j] = (y * a + x * (255 - a)) / 255; } } } static inline void gst_text_overlay_blit_sub2x2 (GstCairoTextOverlay * overlay, guchar * dest, guchar * text_image, gint val, guint dest_stride, gint y0) { gint i, j; gint x, a, y; gint y1; y0 = MIN (y0, overlay->height); y1 = MIN (y0 + overlay->font_height, overlay->height); y = val; for (i = y0; i < y1; i += 2) { for (j = 0; j < overlay->width; j += 2) { x = dest[(i / 2) * dest_stride + j / 2]; a = (text_image[4 * ((i - y0) * overlay->width + j) + 1] + text_image[4 * ((i - y0) * overlay->width + j + 1) + 1] + text_image[4 * ((i - y0 + 1) * overlay->width + j) + 1] + text_image[4 * ((i - y0 + 1) * overlay->width + j + 1) + 1] + 2) / 4; dest[(i / 2) * dest_stride + j / 2] = (y * a + x * (255 - a)) / 255; } } } static GstFlowReturn gst_text_overlay_push_frame (GstCairoTextOverlay * overlay, GstBuffer * video_frame) { guchar *y, *u, *v; gint ypos; video_frame = gst_buffer_make_writable (video_frame); switch (overlay->valign) { case GST_CAIRO_TEXT_OVERLAY_VALIGN_BOTTOM: ypos = overlay->height - overlay->font_height - overlay->ypad; break; case GST_CAIRO_TEXT_OVERLAY_VALIGN_BASELINE: ypos = overlay->height - (overlay->font_height - overlay->text_dy) - overlay->ypad; break; case GST_CAIRO_TEXT_OVERLAY_VALIGN_TOP: ypos = overlay->ypad; break; default: ypos = overlay->ypad; break; } ypos += overlay->deltay; y = GST_BUFFER_DATA (video_frame); u = y + I420_U_OFFSET (overlay->width, overlay->height); v = y + I420_V_OFFSET (overlay->width, overlay->height); /* shaded background box */ if (overlay->want_shading) { gst_text_overlay_shade_y (overlay, y, I420_Y_ROWSTRIDE (overlay->width), ypos + overlay->text_dy, ypos + overlay->font_height); } /* blit outline text on video image */ gst_text_overlay_blit_1 (overlay, y, overlay->text_outline_image, 0, I420_Y_ROWSTRIDE (overlay->width), ypos); gst_text_overlay_blit_sub2x2 (overlay, u, overlay->text_outline_image, 128, I420_U_ROWSTRIDE (overlay->width), ypos); gst_text_overlay_blit_sub2x2 (overlay, v, overlay->text_outline_image, 128, I420_V_ROWSTRIDE (overlay->width), ypos); /* blit text on video image */ gst_text_overlay_blit_1 (overlay, y, overlay->text_fill_image, 255, I420_Y_ROWSTRIDE (overlay->width), ypos); gst_text_overlay_blit_sub2x2 (overlay, u, overlay->text_fill_image, 128, I420_U_ROWSTRIDE (overlay->width), ypos); gst_text_overlay_blit_sub2x2 (overlay, v, overlay->text_fill_image, 128, I420_V_ROWSTRIDE (overlay->width), ypos); return gst_pad_push (overlay->srcpad, video_frame); } static void gst_text_overlay_pop_video (GstCairoTextOverlay * overlay) { GstBuffer *buf; buf = gst_collect_pads_pop (overlay->collect, overlay->video_collect_data); g_return_if_fail (buf != NULL); gst_buffer_unref (buf); } static void gst_text_overlay_pop_text (GstCairoTextOverlay * overlay) { GstBuffer *buf; if (overlay->text_collect_data) { buf = gst_collect_pads_pop (overlay->collect, overlay->text_collect_data); g_return_if_fail (buf != NULL); gst_buffer_unref (buf); } overlay->need_render = TRUE; } /* This function is called when there is data on all pads */ static GstFlowReturn gst_text_overlay_collected (GstCollectPads * pads, gpointer data) { GstCairoTextOverlay *overlay; GstFlowReturn ret = GST_FLOW_OK; GstClockTime now, txt_end, frame_end; GstBuffer *video_frame = NULL; GstBuffer *text_buf = NULL; gchar *text; gint text_len; overlay = GST_CAIRO_TEXT_OVERLAY (data); GST_DEBUG ("Collecting"); video_frame = gst_collect_pads_peek (overlay->collect, overlay->video_collect_data); /* send EOS if video stream EOSed regardless of text stream */ if (video_frame == NULL) { GST_DEBUG ("Video stream at EOS"); if (overlay->text_collect_data) { text_buf = gst_collect_pads_pop (overlay->collect, overlay->text_collect_data); } gst_pad_push_event (overlay->srcpad, gst_event_new_eos ()); ret = GST_FLOW_UNEXPECTED; goto done; } if (GST_BUFFER_TIMESTAMP (video_frame) == GST_CLOCK_TIME_NONE) { g_warning ("%s: video frame has invalid timestamp", G_STRLOC); } now = GST_BUFFER_TIMESTAMP (video_frame); if (GST_BUFFER_DURATION (video_frame) != GST_CLOCK_TIME_NONE) { frame_end = now + GST_BUFFER_DURATION (video_frame); } else if (overlay->fps_n > 0) { frame_end = now + gst_util_uint64_scale_int (GST_SECOND, overlay->fps_d, overlay->fps_n); } else { /* magic value, does not really matter since texts * tend to span quite a few frames in practice anyway */ frame_end = now + GST_SECOND / 25; } GST_DEBUG ("Got video frame: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, GST_TIME_ARGS (now), GST_TIME_ARGS (frame_end)); /* text pad not linked? */ if (overlay->text_collect_data == NULL) { GST_DEBUG ("Text pad not linked, rendering default text: '%s'", GST_STR_NULL (overlay->default_text)); if (overlay->default_text && *overlay->default_text != '\0') { gst_text_overlay_render_text (overlay, overlay->default_text, -1); ret = gst_text_overlay_push_frame (overlay, video_frame); } else { ret = gst_pad_push (overlay->srcpad, video_frame); } gst_text_overlay_pop_video (overlay); video_frame = NULL; goto done; } text_buf = gst_collect_pads_peek (overlay->collect, overlay->text_collect_data); /* just push the video frame if the text stream has EOSed */ if (text_buf == NULL) { GST_DEBUG ("Text pad EOSed, just pushing video frame as is"); ret = gst_pad_push (overlay->srcpad, video_frame); gst_text_overlay_pop_video (overlay); video_frame = NULL; goto done; } /* if the text buffer isn't stamped right, pop it off the * queue and display it for the current video frame only */ if (GST_BUFFER_TIMESTAMP (text_buf) == GST_CLOCK_TIME_NONE || GST_BUFFER_DURATION (text_buf) == GST_CLOCK_TIME_NONE) { GST_WARNING ("Got text buffer with invalid time stamp or duration"); gst_text_overlay_pop_text (overlay); GST_BUFFER_TIMESTAMP (text_buf) = now; GST_BUFFER_DURATION (text_buf) = frame_end - now; } txt_end = GST_BUFFER_TIMESTAMP (text_buf) + GST_BUFFER_DURATION (text_buf); GST_DEBUG ("Got text buffer: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (text_buf)), GST_TIME_ARGS (txt_end)); /* if the text buffer is too old, pop it off the * queue and return so we get a new one next time */ if (txt_end < now) { GST_DEBUG ("Text buffer too old, popping off the queue"); gst_text_overlay_pop_text (overlay); ret = GST_FLOW_OK; goto done; } /* if the video frame ends before the text even starts, * just push it out as is and pop it off the queue */ if (frame_end < GST_BUFFER_TIMESTAMP (text_buf)) { GST_DEBUG ("Video buffer before text, pushing out and popping off queue"); ret = gst_pad_push (overlay->srcpad, video_frame); gst_text_overlay_pop_video (overlay); video_frame = NULL; goto done; } /* text duration overlaps video frame duration */ text = g_strndup ((gchar *) GST_BUFFER_DATA (text_buf), GST_BUFFER_SIZE (text_buf)); g_strdelimit (text, "\n\r\t", ' '); text_len = strlen (text); if (text_len > 0) { GST_DEBUG ("Rendering text '%*s'", text_len, text);; gst_text_overlay_render_text (overlay, text, text_len); } else { GST_DEBUG ("No text to render (empty buffer)"); gst_text_overlay_render_text (overlay, " ", 1); } g_free (text); gst_text_overlay_pop_video (overlay); ret = gst_text_overlay_push_frame (overlay, video_frame); video_frame = NULL; goto done; done: { if (text_buf) gst_buffer_unref (text_buf); if (video_frame) gst_buffer_unref (video_frame); return ret; } } static gboolean gst_text_overlay_src_event (GstPad * pad, GstEvent * event) { GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); gboolean ret = TRUE; /* forward events to the video sink, and, if it is linked, the text sink */ if (overlay->text_collect_data) { gst_event_ref (event); ret &= gst_pad_push_event (overlay->text_sinkpad, event); } ret &= gst_pad_push_event (overlay->video_sinkpad, event); gst_object_unref (overlay); return ret; } static gboolean gst_text_overlay_video_event (GstPad * pad, GstEvent * event) { gboolean ret = FALSE; GstCairoTextOverlay *overlay = NULL; overlay = GST_CAIRO_TEXT_OVERLAY (gst_pad_get_parent (pad)); if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { GST_DEBUG_OBJECT (overlay, "received new segment on video sink pad, forwarding"); gst_event_ref (event); gst_pad_push_event (overlay->srcpad, event); } /* now GstCollectPads can take care of the rest, e.g. EOS */ ret = overlay->collect_event (pad, event); gst_object_unref (overlay); return ret; } static GstStateChangeReturn gst_text_overlay_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstCairoTextOverlay *overlay = GST_CAIRO_TEXT_OVERLAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_collect_pads_start (overlay->collect); break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* need to unblock the collectpads before calling the * parent change_state so that streaming can finish */ gst_collect_pads_stop (overlay->collect); break; default: break; } ret = parent_class->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { default: break; } return ret; } gst-plugins-good-0.10.31/ext/flac/0000755000175000017500000000000011720565321013566 500000000000000gst-plugins-good-0.10.31/ext/flac/gstflacenc.c0000644000175000017500000013500311713013161015755 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-flacenc * @see_also: #GstFlacDec * * flacenc encodes FLAC streams. * FLAC * is a Free Lossless Audio Codec. * * * Example launch line * |[ * gst-launch audiotestsrc num-buffers=100 ! flacenc ! filesink location=beep.flac * ]| * */ /* TODO: - We currently don't handle discontinuities in the stream in a useful * way and instead rely on the developer plugging in audiorate if * the stream contains discontinuities. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include /* Taken from http://flac.sourceforge.net/format.html#frame_header */ static const GstAudioChannelPosition channel_positions[8][8] = { {GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}, {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { 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_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */ { 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}, { 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} }; #define FLAC_SINK_CAPS \ "audio/x-raw-int, " \ "endianness = (int) BYTE_ORDER, " \ "signed = (boolean) TRUE, " \ "width = (int) 8, " \ "depth = (int) 8, " \ "rate = (int) [ 1, 655350 ], " \ "channels = (int) [ 1, 8 ]; " \ "audio/x-raw-int, " \ "endianness = (int) BYTE_ORDER, " \ "signed = (boolean) TRUE, " \ "width = (int) 16, " \ "depth = (int) { 12, 16 }, " \ "rate = (int) [ 1, 655350 ], " \ "channels = (int) [ 1, 8 ]; " \ "audio/x-raw-int, " \ "endianness = (int) BYTE_ORDER, " \ "signed = (boolean) TRUE, " \ "width = (int) 32, " \ "depth = (int) { 20, 24 }, " \ "rate = (int) [ 1, 655350 ], " \ "channels = (int) [ 1, 8 ]" static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-flac") ); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (FLAC_SINK_CAPS) ); enum { PROP_0, PROP_QUALITY, PROP_STREAMABLE_SUBSET, PROP_MID_SIDE_STEREO, PROP_LOOSE_MID_SIDE_STEREO, PROP_BLOCKSIZE, PROP_MAX_LPC_ORDER, PROP_QLP_COEFF_PRECISION, PROP_QLP_COEFF_PREC_SEARCH, PROP_ESCAPE_CODING, PROP_EXHAUSTIVE_MODEL_SEARCH, PROP_MIN_RESIDUAL_PARTITION_ORDER, PROP_MAX_RESIDUAL_PARTITION_ORDER, PROP_RICE_PARAMETER_SEARCH_DIST, PROP_PADDING, PROP_SEEKPOINTS }; GST_DEBUG_CATEGORY_STATIC (flacenc_debug); #define GST_CAT_DEFAULT flacenc_debug #define _do_init(type) \ G_STMT_START{ \ static const GInterfaceInfo tag_setter_info = { \ NULL, \ NULL, \ NULL \ }; \ g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, \ &tag_setter_info); \ }G_STMT_END GST_BOILERPLATE_FULL (GstFlacEnc, gst_flac_enc, GstAudioEncoder, GST_TYPE_AUDIO_ENCODER, _do_init); static gboolean gst_flac_enc_start (GstAudioEncoder * enc); static gboolean gst_flac_enc_stop (GstAudioEncoder * enc); static gboolean gst_flac_enc_set_format (GstAudioEncoder * enc, GstAudioInfo * info); static GstFlowReturn gst_flac_enc_handle_frame (GstAudioEncoder * enc, GstBuffer * in_buf); static GstCaps *gst_flac_enc_getcaps (GstAudioEncoder * enc); static gboolean gst_flac_enc_sink_event (GstAudioEncoder * enc, GstEvent * event); static void gst_flac_enc_finalize (GObject * object); static gboolean gst_flac_enc_update_quality (GstFlacEnc * flacenc, gint quality); static void gst_flac_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_flac_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static FLAC__StreamEncoderWriteStatus gst_flac_enc_write_callback (const FLAC__StreamEncoder * encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); static FLAC__StreamEncoderSeekStatus gst_flac_enc_seek_callback (const FLAC__StreamEncoder * encoder, FLAC__uint64 absolute_byte_offset, void *client_data); static FLAC__StreamEncoderTellStatus gst_flac_enc_tell_callback (const FLAC__StreamEncoder * encoder, FLAC__uint64 * absolute_byte_offset, void *client_data); typedef struct { gboolean exhaustive_model_search; gboolean escape_coding; gboolean mid_side; gboolean loose_mid_side; guint qlp_coeff_precision; gboolean qlp_coeff_prec_search; guint min_residual_partition_order; guint max_residual_partition_order; guint rice_parameter_search_dist; guint max_lpc_order; guint blocksize; } GstFlacEncParams; static const GstFlacEncParams flacenc_params[] = { {FALSE, FALSE, FALSE, FALSE, 0, FALSE, 2, 2, 0, 0, 1152}, {FALSE, FALSE, TRUE, TRUE, 0, FALSE, 2, 2, 0, 0, 1152}, {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 3, 0, 0, 1152}, {FALSE, FALSE, FALSE, FALSE, 0, FALSE, 3, 3, 0, 6, 4608}, {FALSE, FALSE, TRUE, TRUE, 0, FALSE, 3, 3, 0, 8, 4608}, {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 3, 3, 0, 8, 4608}, {FALSE, FALSE, TRUE, FALSE, 0, FALSE, 0, 4, 0, 8, 4608}, {TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 8, 4608}, {TRUE, FALSE, TRUE, FALSE, 0, FALSE, 0, 6, 0, 12, 4608}, {TRUE, TRUE, TRUE, FALSE, 0, FALSE, 0, 16, 0, 32, 4608}, }; #define DEFAULT_QUALITY 5 #define DEFAULT_PADDING 0 #define DEFAULT_SEEKPOINTS 0 #define GST_TYPE_FLAC_ENC_QUALITY (gst_flac_enc_quality_get_type ()) static GType gst_flac_enc_quality_get_type (void) { static GType qtype = 0; if (qtype == 0) { static const GEnumValue values[] = { {0, "0 - Fastest compression", "0"}, {1, "1", "1"}, {2, "2", "2"}, {3, "3", "3"}, {4, "4", "4"}, {5, "5 - Default", "5"}, {6, "6", "6"}, {7, "7", "7"}, {8, "8 - Highest compression", "8"}, {9, "9 - Insane", "9"}, {0, NULL, NULL} }; qtype = g_enum_register_static ("GstFlacEncQuality", values); } return qtype; } static void gst_flac_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "FLAC audio encoder", "Codec/Encoder/Audio", "Encodes audio with the FLAC lossless audio encoder", "Wim Taymans "); GST_DEBUG_CATEGORY_INIT (flacenc_debug, "flacenc", 0, "Flac encoding element"); } static void gst_flac_enc_class_init (GstFlacEncClass * klass) { GObjectClass *gobject_class; GstAudioEncoderClass *base_class; gobject_class = (GObjectClass *) klass; base_class = (GstAudioEncoderClass *) (klass); gobject_class->set_property = gst_flac_enc_set_property; gobject_class->get_property = gst_flac_enc_get_property; gobject_class->finalize = gst_flac_enc_finalize; base_class->start = GST_DEBUG_FUNCPTR (gst_flac_enc_start); base_class->stop = GST_DEBUG_FUNCPTR (gst_flac_enc_stop); base_class->set_format = GST_DEBUG_FUNCPTR (gst_flac_enc_set_format); base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_flac_enc_handle_frame); base_class->getcaps = GST_DEBUG_FUNCPTR (gst_flac_enc_getcaps); base_class->event = GST_DEBUG_FUNCPTR (gst_flac_enc_sink_event); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QUALITY, g_param_spec_enum ("quality", "Quality", "Speed versus compression tradeoff", GST_TYPE_FLAC_ENC_QUALITY, DEFAULT_QUALITY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_STREAMABLE_SUBSET, g_param_spec_boolean ("streamable-subset", "Streamable subset", "true to limit encoder to generating a Subset stream, else false", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MID_SIDE_STEREO, g_param_spec_boolean ("mid-side-stereo", "Do mid side stereo", "Do mid side stereo (only for stereo input)", flacenc_params[DEFAULT_QUALITY].mid_side, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LOOSE_MID_SIDE_STEREO, g_param_spec_boolean ("loose-mid-side-stereo", "Loose mid side stereo", "Loose mid side stereo", flacenc_params[DEFAULT_QUALITY].loose_mid_side, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BLOCKSIZE, g_param_spec_uint ("blocksize", "Blocksize", "Blocksize in samples", FLAC__MIN_BLOCK_SIZE, FLAC__MAX_BLOCK_SIZE, flacenc_params[DEFAULT_QUALITY].blocksize, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_LPC_ORDER, g_param_spec_uint ("max-lpc-order", "Max LPC order", "Max LPC order; 0 => use only fixed predictors", 0, FLAC__MAX_LPC_ORDER, flacenc_params[DEFAULT_QUALITY].max_lpc_order, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QLP_COEFF_PRECISION, g_param_spec_uint ("qlp-coeff-precision", "QLP coefficients precision", "Precision in bits of quantized linear-predictor coefficients; 0 = automatic", 0, 32, flacenc_params[DEFAULT_QUALITY].qlp_coeff_precision, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QLP_COEFF_PREC_SEARCH, g_param_spec_boolean ("qlp-coeff-prec-search", "Do QLP coefficients precision search", "false = use qlp_coeff_precision, " "true = search around qlp_coeff_precision, take best", flacenc_params[DEFAULT_QUALITY].qlp_coeff_prec_search, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ESCAPE_CODING, g_param_spec_boolean ("escape-coding", "Do Escape coding", "search for escape codes in the entropy coding stage " "for slightly better compression", flacenc_params[DEFAULT_QUALITY].escape_coding, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_EXHAUSTIVE_MODEL_SEARCH, g_param_spec_boolean ("exhaustive-model-search", "Do exhaustive model search", "do exhaustive search of LP coefficient quantization (expensive!)", flacenc_params[DEFAULT_QUALITY].exhaustive_model_search, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MIN_RESIDUAL_PARTITION_ORDER, g_param_spec_uint ("min-residual-partition-order", "Min residual partition order", "Min residual partition order (above 4 doesn't usually help much)", 0, 16, flacenc_params[DEFAULT_QUALITY].min_residual_partition_order, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_RESIDUAL_PARTITION_ORDER, g_param_spec_uint ("max-residual-partition-order", "Max residual partition order", "Max residual partition order (above 4 doesn't usually help much)", 0, 16, flacenc_params[DEFAULT_QUALITY].max_residual_partition_order, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_RICE_PARAMETER_SEARCH_DIST, g_param_spec_uint ("rice-parameter-search-dist", "rice_parameter_search_dist", "0 = try only calc'd parameter k; else try all [k-dist..k+dist] " "parameters, use best", 0, FLAC__MAX_RICE_PARTITION_ORDER, flacenc_params[DEFAULT_QUALITY].rice_parameter_search_dist, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); /** * GstFlacEnc:padding * * Write a PADDING block with this length in bytes * * Since: 0.10.16 **/ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PADDING, g_param_spec_uint ("padding", "Padding", "Write a PADDING block with this length in bytes", 0, G_MAXUINT, DEFAULT_PADDING, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); /** * GstFlacEnc:seekpoints * * Write a SEEKTABLE block with a specific number of seekpoints * or with a specific interval spacing. * * Since: 0.10.18 **/ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEEKPOINTS, g_param_spec_int ("seekpoints", "Seekpoints", "Add SEEKTABLE metadata (if > 0, number of entries, if < 0, interval in sec)", -G_MAXINT, G_MAXINT, DEFAULT_SEEKPOINTS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); } static void gst_flac_enc_init (GstFlacEnc * flacenc, GstFlacEncClass * klass) { GstAudioEncoder *enc = GST_AUDIO_ENCODER (flacenc); flacenc->encoder = FLAC__stream_encoder_new (); gst_flac_enc_update_quality (flacenc, DEFAULT_QUALITY); /* arrange granulepos marking (and required perfect ts) */ gst_audio_encoder_set_mark_granule (enc, TRUE); gst_audio_encoder_set_perfect_timestamp (enc, TRUE); } static void gst_flac_enc_finalize (GObject * object) { GstFlacEnc *flacenc = GST_FLAC_ENC (object); FLAC__stream_encoder_delete (flacenc->encoder); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_flac_enc_start (GstAudioEncoder * enc) { GstFlacEnc *flacenc = GST_FLAC_ENC (enc); GST_DEBUG_OBJECT (enc, "start"); flacenc->stopped = TRUE; flacenc->got_headers = FALSE; flacenc->last_flow = GST_FLOW_OK; flacenc->offset = 0; flacenc->channels = 0; flacenc->depth = 0; flacenc->sample_rate = 0; flacenc->eos = FALSE; flacenc->tags = gst_tag_list_new (); return TRUE; } static gboolean gst_flac_enc_stop (GstAudioEncoder * enc) { GstFlacEnc *flacenc = GST_FLAC_ENC (enc); GST_DEBUG_OBJECT (enc, "stop"); gst_tag_list_free (flacenc->tags); flacenc->tags = NULL; if (FLAC__stream_encoder_get_state (flacenc->encoder) != FLAC__STREAM_ENCODER_UNINITIALIZED) { flacenc->stopped = TRUE; FLAC__stream_encoder_finish (flacenc->encoder); } if (flacenc->meta) { FLAC__metadata_object_delete (flacenc->meta[0]); if (flacenc->meta[1]) FLAC__metadata_object_delete (flacenc->meta[1]); if (flacenc->meta[2]) FLAC__metadata_object_delete (flacenc->meta[2]); g_free (flacenc->meta); flacenc->meta = NULL; } g_list_foreach (flacenc->headers, (GFunc) gst_mini_object_unref, NULL); g_list_free (flacenc->headers); flacenc->headers = NULL; gst_tag_setter_reset_tags (GST_TAG_SETTER (enc)); return TRUE; } static void add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) { GList *comments; GList *it; GstFlacEnc *flacenc = GST_FLAC_ENC (user_data); /* IMAGE and PREVIEW_IMAGE tags are already written * differently, no need to store them inside the * vorbiscomments too */ if (strcmp (tag, GST_TAG_IMAGE) == 0 || strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0) return; comments = gst_tag_to_vorbis_comments (list, tag); for (it = comments; it != NULL; it = it->next) { FLAC__StreamMetadata_VorbisComment_Entry commment_entry; commment_entry.length = strlen (it->data); commment_entry.entry = it->data; FLAC__metadata_object_vorbiscomment_insert_comment (flacenc->meta[0], flacenc->meta[0]->data.vorbis_comment.num_comments, commment_entry, TRUE); g_free (it->data); } g_list_free (comments); } static void gst_flac_enc_set_metadata (GstFlacEnc * flacenc, guint64 total_samples) { const GstTagList *user_tags; GstTagList *copy; gint entries = 1; gint n_images, n_preview_images; g_return_if_fail (flacenc != NULL); user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (flacenc)); if ((flacenc->tags == NULL) && (user_tags == NULL)) { return; } copy = gst_tag_list_merge (user_tags, flacenc->tags, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (flacenc))); n_images = gst_tag_list_get_tag_size (copy, GST_TAG_IMAGE); n_preview_images = gst_tag_list_get_tag_size (copy, GST_TAG_PREVIEW_IMAGE); flacenc->meta = g_new0 (FLAC__StreamMetadata *, 3 + n_images + n_preview_images); flacenc->meta[0] = FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT); gst_tag_list_foreach (copy, add_one_tag, flacenc); if (n_images + n_preview_images > 0) { GstBuffer *buffer; GstCaps *caps; GstStructure *structure; GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE; gint i; for (i = 0; i < n_images + n_preview_images; i++) { if (i < n_images) { if (!gst_tag_list_get_buffer_index (copy, GST_TAG_IMAGE, i, &buffer)) continue; } else { if (!gst_tag_list_get_buffer_index (copy, GST_TAG_PREVIEW_IMAGE, i - n_images, &buffer)) continue; } flacenc->meta[entries] = FLAC__metadata_object_new (FLAC__METADATA_TYPE_PICTURE); caps = gst_buffer_get_caps (buffer); structure = gst_caps_get_structure (caps, 0); gst_structure_get (structure, "image-type", GST_TYPE_TAG_IMAGE_TYPE, &image_type, NULL); /* Convert to ID3v2 APIC image type */ if (image_type == GST_TAG_IMAGE_TYPE_NONE) image_type = (i < n_images) ? 0x00 : 0x01; else image_type = image_type + 2; FLAC__metadata_object_picture_set_data (flacenc->meta[entries], GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), TRUE); /* FIXME: There's no way to set the picture type in libFLAC */ flacenc->meta[entries]->data.picture.type = image_type; FLAC__metadata_object_picture_set_mime_type (flacenc->meta[entries], (char *) gst_structure_get_name (structure), TRUE); gst_caps_unref (caps); gst_buffer_unref (buffer); entries++; } } if (flacenc->seekpoints && total_samples != GST_CLOCK_TIME_NONE) { gboolean res; guint samples; flacenc->meta[entries] = FLAC__metadata_object_new (FLAC__METADATA_TYPE_SEEKTABLE); if (flacenc->seekpoints > 0) { res = FLAC__metadata_object_seektable_template_append_spaced_points (flacenc->meta[entries], flacenc->seekpoints, total_samples); } else { samples = -flacenc->seekpoints * flacenc->sample_rate; res = FLAC__metadata_object_seektable_template_append_spaced_points_by_samples (flacenc->meta[entries], samples, total_samples); } if (!res) { GST_DEBUG_OBJECT (flacenc, "adding seekpoint template %d failed", flacenc->seekpoints); FLAC__metadata_object_delete (flacenc->meta[1]); flacenc->meta[entries] = NULL; } else { entries++; } } else if (flacenc->seekpoints && total_samples == GST_CLOCK_TIME_NONE) { GST_WARNING_OBJECT (flacenc, "total time unknown; can not add seekpoints"); } if (flacenc->padding > 0) { flacenc->meta[entries] = FLAC__metadata_object_new (FLAC__METADATA_TYPE_PADDING); flacenc->meta[entries]->length = flacenc->padding; entries++; } if (FLAC__stream_encoder_set_metadata (flacenc->encoder, flacenc->meta, entries) != true) g_warning ("Dude, i'm already initialized!"); gst_tag_list_free (copy); } static void gst_flac_enc_caps_append_structure_with_widths (GstCaps * caps, GstStructure * s) { GstStructure *tmp; GValue list = { 0, }; GValue depth = { 0, }; tmp = gst_structure_copy (s); gst_structure_set (tmp, "width", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8, NULL); gst_caps_append_structure (caps, tmp); tmp = gst_structure_copy (s); g_value_init (&depth, G_TYPE_INT); g_value_init (&list, GST_TYPE_LIST); g_value_set_int (&depth, 12); gst_value_list_append_value (&list, &depth); g_value_set_int (&depth, 16); gst_value_list_append_value (&list, &depth); gst_structure_set (tmp, "width", G_TYPE_INT, 16, NULL); gst_structure_set_value (tmp, "depth", &list); gst_caps_append_structure (caps, tmp); g_value_reset (&list); tmp = s; g_value_set_int (&depth, 20); gst_value_list_append_value (&list, &depth); g_value_set_int (&depth, 24); gst_value_list_append_value (&list, &depth); gst_structure_set (tmp, "width", G_TYPE_INT, 32, NULL); gst_structure_set_value (tmp, "depth", &list); gst_caps_append_structure (caps, tmp); g_value_unset (&list); g_value_unset (&depth); } static GstCaps * gst_flac_enc_getcaps (GstAudioEncoder * enc) { GstCaps *ret = NULL, *caps = NULL; GstPad *pad; pad = GST_AUDIO_ENCODER_SINK_PAD (enc); GST_OBJECT_LOCK (pad); if (GST_PAD_CAPS (pad)) { ret = gst_caps_ref (GST_PAD_CAPS (pad)); } else { gint i, c; ret = gst_caps_new_empty (); gst_flac_enc_caps_append_structure_with_widths (ret, gst_structure_new ("audio/x-raw-int", "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "rate", GST_TYPE_INT_RANGE, 1, 655350, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL)); for (i = 3; i <= 8; i++) { GValue positions = { 0, }; GValue pos = { 0, }; GstStructure *s; g_value_init (&positions, GST_TYPE_ARRAY); g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION); for (c = 0; c < i; c++) { g_value_set_enum (&pos, channel_positions[i - 1][c]); gst_value_array_append_value (&positions, &pos); } g_value_unset (&pos); s = gst_structure_new ("audio/x-raw-int", "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "rate", GST_TYPE_INT_RANGE, 1, 655350, "channels", G_TYPE_INT, i, NULL); gst_structure_set_value (s, "channel-positions", &positions); g_value_unset (&positions); gst_flac_enc_caps_append_structure_with_widths (ret, s); } } GST_OBJECT_UNLOCK (pad); GST_DEBUG_OBJECT (pad, "Return caps %" GST_PTR_FORMAT, ret); caps = gst_audio_encoder_proxy_getcaps (enc, ret); gst_caps_unref (ret); return caps; } static guint64 gst_flac_enc_query_peer_total_samples (GstFlacEnc * flacenc, GstPad * pad) { GstFormat fmt = GST_FORMAT_DEFAULT; gint64 duration; GST_DEBUG_OBJECT (flacenc, "querying peer for DEFAULT format duration"); if (gst_pad_query_peer_duration (pad, &fmt, &duration) && fmt == GST_FORMAT_DEFAULT && duration != GST_CLOCK_TIME_NONE) goto done; fmt = GST_FORMAT_TIME; GST_DEBUG_OBJECT (flacenc, "querying peer for TIME format duration"); if (gst_pad_query_peer_duration (pad, &fmt, &duration) && fmt == GST_FORMAT_TIME && duration != GST_CLOCK_TIME_NONE) { GST_DEBUG_OBJECT (flacenc, "peer reported duration %" GST_TIME_FORMAT, GST_TIME_ARGS (duration)); duration = GST_CLOCK_TIME_TO_FRAMES (duration, flacenc->sample_rate); goto done; } GST_DEBUG_OBJECT (flacenc, "Upstream reported no total samples"); return GST_CLOCK_TIME_NONE; done: GST_DEBUG_OBJECT (flacenc, "Upstream reported %" G_GUINT64_FORMAT " total samples", duration); return duration; } static gboolean gst_flac_enc_set_format (GstAudioEncoder * enc, GstAudioInfo * info) { GstFlacEnc *flacenc; guint64 total_samples = GST_CLOCK_TIME_NONE; FLAC__StreamEncoderInitStatus init_status; GstCaps *caps; flacenc = GST_FLAC_ENC (enc); /* if configured again, means something changed, can't handle that */ if (FLAC__stream_encoder_get_state (flacenc->encoder) != FLAC__STREAM_ENCODER_UNINITIALIZED) goto encoder_already_initialized; flacenc->channels = GST_AUDIO_INFO_CHANNELS (info); flacenc->width = GST_AUDIO_INFO_WIDTH (info); flacenc->depth = GST_AUDIO_INFO_DEPTH (info); flacenc->sample_rate = GST_AUDIO_INFO_RATE (info); caps = gst_caps_new_simple ("audio/x-flac", "channels", G_TYPE_INT, flacenc->channels, "rate", G_TYPE_INT, flacenc->sample_rate, NULL); if (!gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), caps)) goto setting_src_caps_failed; gst_caps_unref (caps); total_samples = gst_flac_enc_query_peer_total_samples (flacenc, GST_AUDIO_ENCODER_SINK_PAD (enc)); FLAC__stream_encoder_set_bits_per_sample (flacenc->encoder, flacenc->depth); FLAC__stream_encoder_set_sample_rate (flacenc->encoder, flacenc->sample_rate); FLAC__stream_encoder_set_channels (flacenc->encoder, flacenc->channels); if (total_samples != GST_CLOCK_TIME_NONE) FLAC__stream_encoder_set_total_samples_estimate (flacenc->encoder, MIN (total_samples, G_GUINT64_CONSTANT (0x0FFFFFFFFF))); gst_flac_enc_set_metadata (flacenc, total_samples); /* callbacks clear to go now; * write callbacks receives headers during init */ flacenc->stopped = FALSE; init_status = FLAC__stream_encoder_init_stream (flacenc->encoder, gst_flac_enc_write_callback, gst_flac_enc_seek_callback, gst_flac_enc_tell_callback, NULL, flacenc); if (init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) goto failed_to_initialize; /* no special feedback to base class; should provide all available samples */ return TRUE; encoder_already_initialized: { g_warning ("flac already initialized -- fixme allow this"); gst_object_unref (flacenc); return FALSE; } setting_src_caps_failed: { GST_DEBUG_OBJECT (flacenc, "Couldn't set caps on source pad: %" GST_PTR_FORMAT, caps); gst_caps_unref (caps); gst_object_unref (flacenc); return FALSE; } failed_to_initialize: { GST_ELEMENT_ERROR (flacenc, LIBRARY, INIT, (NULL), ("could not initialize encoder (wrong parameters?)")); gst_object_unref (flacenc); return FALSE; } } static gboolean gst_flac_enc_update_quality (GstFlacEnc * flacenc, gint quality) { flacenc->quality = quality; #define DO_UPDATE(name, val, str) \ G_STMT_START { \ if (FLAC__stream_encoder_get_##name (flacenc->encoder) != \ flacenc_params[quality].val) { \ FLAC__stream_encoder_set_##name (flacenc->encoder, \ flacenc_params[quality].val); \ g_object_notify (G_OBJECT (flacenc), str); \ } \ } G_STMT_END g_object_freeze_notify (G_OBJECT (flacenc)); if (flacenc->channels == 2 || flacenc->channels == 0) { DO_UPDATE (do_mid_side_stereo, mid_side, "mid_side_stereo"); DO_UPDATE (loose_mid_side_stereo, loose_mid_side, "loose_mid_side"); } DO_UPDATE (blocksize, blocksize, "blocksize"); DO_UPDATE (max_lpc_order, max_lpc_order, "max_lpc_order"); DO_UPDATE (qlp_coeff_precision, qlp_coeff_precision, "qlp_coeff_precision"); DO_UPDATE (do_qlp_coeff_prec_search, qlp_coeff_prec_search, "qlp_coeff_prec_search"); DO_UPDATE (do_escape_coding, escape_coding, "escape_coding"); DO_UPDATE (do_exhaustive_model_search, exhaustive_model_search, "exhaustive_model_search"); DO_UPDATE (min_residual_partition_order, min_residual_partition_order, "min_residual_partition_order"); DO_UPDATE (max_residual_partition_order, max_residual_partition_order, "max_residual_partition_order"); DO_UPDATE (rice_parameter_search_dist, rice_parameter_search_dist, "rice_parameter_search_dist"); #undef DO_UPDATE g_object_thaw_notify (G_OBJECT (flacenc)); return TRUE; } static FLAC__StreamEncoderSeekStatus gst_flac_enc_seek_callback (const FLAC__StreamEncoder * encoder, FLAC__uint64 absolute_byte_offset, void *client_data) { GstFlacEnc *flacenc; GstPad *peerpad; flacenc = GST_FLAC_ENC (client_data); if (flacenc->stopped) return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; if ((peerpad = gst_pad_get_peer (GST_AUDIO_ENCODER_SRC_PAD (flacenc)))) { GstEvent *event = gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_BYTES, absolute_byte_offset, GST_BUFFER_OFFSET_NONE, 0); gboolean ret = gst_pad_send_event (peerpad, event); gst_object_unref (peerpad); if (ret) { GST_DEBUG ("Seek to %" G_GUINT64_FORMAT " %s", (guint64) absolute_byte_offset, "succeeded"); } else { GST_DEBUG ("Seek to %" G_GUINT64_FORMAT " %s", (guint64) absolute_byte_offset, "failed"); return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; } } else { GST_DEBUG ("Seek to %" G_GUINT64_FORMAT " failed (no peer pad)", (guint64) absolute_byte_offset); } flacenc->offset = absolute_byte_offset; return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; } static void notgst_value_array_append_buffer (GValue * array_val, GstBuffer * buf) { GValue value = { 0, }; g_value_init (&value, GST_TYPE_BUFFER); /* copy buffer to avoid problems with circular refcounts */ buf = gst_buffer_copy (buf); /* again, for good measure */ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); gst_value_set_buffer (&value, buf); gst_buffer_unref (buf); gst_value_array_append_value (array_val, &value); g_value_unset (&value); } #define HDR_TYPE_STREAMINFO 0 #define HDR_TYPE_VORBISCOMMENT 4 static GstFlowReturn gst_flac_enc_process_stream_headers (GstFlacEnc * enc) { GstBuffer *vorbiscomment = NULL; GstBuffer *streaminfo = NULL; GstBuffer *marker = NULL; GValue array = { 0, }; GstCaps *caps; GList *l; GstFlowReturn ret = GST_FLOW_OK; caps = gst_caps_new_simple ("audio/x-flac", "channels", G_TYPE_INT, enc->channels, "rate", G_TYPE_INT, enc->sample_rate, NULL); for (l = enc->headers; l != NULL; l = l->next) { const guint8 *data; guint size; /* mark buffers so oggmux will ignore them if it already muxed the * header buffers from the streamheaders field in the caps */ l->data = gst_buffer_make_metadata_writable (GST_BUFFER (l->data)); GST_BUFFER_FLAG_SET (GST_BUFFER (l->data), GST_BUFFER_FLAG_IN_CAPS); data = GST_BUFFER_DATA (GST_BUFFER_CAST (l->data)); size = GST_BUFFER_SIZE (GST_BUFFER_CAST (l->data)); /* find initial 4-byte marker which we need to skip later on */ if (size == 4 && memcmp (data, "fLaC", 4) == 0) { marker = GST_BUFFER_CAST (l->data); } else if (size > 1 && (data[0] & 0x7f) == HDR_TYPE_STREAMINFO) { streaminfo = GST_BUFFER_CAST (l->data); } else if (size > 1 && (data[0] & 0x7f) == HDR_TYPE_VORBISCOMMENT) { vorbiscomment = GST_BUFFER_CAST (l->data); } } if (marker == NULL || streaminfo == NULL || vorbiscomment == NULL) { GST_WARNING_OBJECT (enc, "missing header %p %p %p, muxing into container " "formats may be broken", marker, streaminfo, vorbiscomment); goto push_headers; } g_value_init (&array, GST_TYPE_ARRAY); /* add marker including STREAMINFO header */ { GstBuffer *buf; guint16 num; /* minus one for the marker that is merged with streaminfo here */ num = g_list_length (enc->headers) - 1; buf = gst_buffer_new_and_alloc (13 + GST_BUFFER_SIZE (streaminfo)); GST_BUFFER_DATA (buf)[0] = 0x7f; memcpy (GST_BUFFER_DATA (buf) + 1, "FLAC", 4); GST_BUFFER_DATA (buf)[5] = 0x01; /* mapping version major */ GST_BUFFER_DATA (buf)[6] = 0x00; /* mapping version minor */ GST_BUFFER_DATA (buf)[7] = (num & 0xFF00) >> 8; GST_BUFFER_DATA (buf)[8] = (num & 0x00FF) >> 0; memcpy (GST_BUFFER_DATA (buf) + 9, "fLaC", 4); memcpy (GST_BUFFER_DATA (buf) + 13, GST_BUFFER_DATA (streaminfo), GST_BUFFER_SIZE (streaminfo)); notgst_value_array_append_buffer (&array, buf); gst_buffer_unref (buf); } /* add VORBISCOMMENT header */ notgst_value_array_append_buffer (&array, vorbiscomment); /* add other headers, if there are any */ for (l = enc->headers; l != NULL; l = l->next) { if (GST_BUFFER_CAST (l->data) != marker && GST_BUFFER_CAST (l->data) != streaminfo && GST_BUFFER_CAST (l->data) != vorbiscomment) { notgst_value_array_append_buffer (&array, GST_BUFFER_CAST (l->data)); } } gst_structure_set_value (gst_caps_get_structure (caps, 0), "streamheader", &array); g_value_unset (&array); push_headers: /* push header buffers; update caps, so when we push the first buffer the * negotiated caps will change to caps that include the streamheader field */ for (l = enc->headers; l != NULL; l = l->next) { GstBuffer *buf; buf = GST_BUFFER (l->data); gst_buffer_set_caps (buf, caps); GST_LOG_OBJECT (enc, "Pushing header buffer, size %u bytes", GST_BUFFER_SIZE (buf)); GST_MEMDUMP_OBJECT (enc, "header buffer", GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); ret = gst_pad_push (GST_AUDIO_ENCODER_SRC_PAD (enc), buf); l->data = NULL; } g_list_free (enc->headers); enc->headers = NULL; gst_caps_unref (caps); return ret; } static FLAC__StreamEncoderWriteStatus gst_flac_enc_write_callback (const FLAC__StreamEncoder * encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) { GstFlowReturn ret = GST_FLOW_OK; GstFlacEnc *flacenc; GstBuffer *outbuf; flacenc = GST_FLAC_ENC (client_data); if (flacenc->stopped) return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; outbuf = gst_buffer_new_and_alloc (bytes); memcpy (GST_BUFFER_DATA (outbuf), buffer, bytes); /* we assume libflac passes us stuff neatly framed */ if (!flacenc->got_headers) { if (samples == 0) { GST_DEBUG_OBJECT (flacenc, "Got header, queueing (%u bytes)", (guint) bytes); flacenc->headers = g_list_append (flacenc->headers, outbuf); /* note: it's important that we increase our byte offset */ goto out; } else { GST_INFO_OBJECT (flacenc, "Non-header packet, we have all headers now"); ret = gst_flac_enc_process_stream_headers (flacenc); flacenc->got_headers = TRUE; } } if (flacenc->got_headers && samples == 0) { /* header fixup, push downstream directly */ GST_DEBUG_OBJECT (flacenc, "Fixing up headers at pos=%" G_GUINT64_FORMAT ", size=%u", flacenc->offset, (guint) bytes); GST_MEMDUMP_OBJECT (flacenc, "Presumed header fragment", GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf)); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (flacenc))); ret = gst_pad_push (GST_AUDIO_ENCODER_SRC_PAD (flacenc), outbuf); } else { /* regular frame data, pass to base class */ GST_LOG ("Pushing buffer: ts=%" GST_TIME_FORMAT ", samples=%u, size=%u, " "pos=%" G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), samples, (guint) bytes, flacenc->offset); ret = gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (flacenc), outbuf, samples); } if (ret != GST_FLOW_OK) GST_DEBUG_OBJECT (flacenc, "flow: %s", gst_flow_get_name (ret)); flacenc->last_flow = ret; out: flacenc->offset += bytes; if (ret != GST_FLOW_OK) return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; } static FLAC__StreamEncoderTellStatus gst_flac_enc_tell_callback (const FLAC__StreamEncoder * encoder, FLAC__uint64 * absolute_byte_offset, void *client_data) { GstFlacEnc *flacenc = GST_FLAC_ENC (client_data); *absolute_byte_offset = flacenc->offset; return FLAC__STREAM_ENCODER_TELL_STATUS_OK; } static gboolean gst_flac_enc_sink_event (GstAudioEncoder * enc, GstEvent * event) { GstFlacEnc *flacenc; GstTagList *taglist; gboolean ret = FALSE; flacenc = GST_FLAC_ENC (enc); GST_DEBUG ("Received %s event on sinkpad", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT:{ GstFormat format; gint64 start, stream_time; if (flacenc->offset == 0) { gst_event_parse_new_segment (event, NULL, NULL, &format, &start, NULL, &stream_time); } else { start = -1; stream_time = -1; } if (start > 0) { if (flacenc->offset > 0) GST_DEBUG ("Not handling mid-stream newsegment event"); else GST_DEBUG ("Not handling newsegment event with non-zero start"); } else { GstEvent *e = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0); ret = gst_pad_push_event (GST_AUDIO_ENCODER_SRC_PAD (enc), e); } if (stream_time > 0) { GST_DEBUG ("Not handling non-zero stream time"); } /* don't push it downstream, we'll generate our own via seek to 0 */ gst_event_unref (event); ret = TRUE; break; } case GST_EVENT_EOS: flacenc->eos = TRUE; break; case GST_EVENT_TAG: if (flacenc->tags) { gst_event_parse_tag (event, &taglist); gst_tag_list_insert (flacenc->tags, taglist, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (flacenc))); } else { g_assert_not_reached (); } break; default: break; } return ret; } static GstFlowReturn gst_flac_enc_handle_frame (GstAudioEncoder * enc, GstBuffer * buffer) { GstFlacEnc *flacenc; FLAC__int32 *data; gulong insize; gint samples, width; gulong i; FLAC__bool res; flacenc = GST_FLAC_ENC (enc); /* base class ensures configuration */ g_return_val_if_fail (flacenc->depth != 0, GST_FLOW_NOT_NEGOTIATED); width = flacenc->width; if (G_UNLIKELY (!buffer)) { if (flacenc->eos) { FLAC__stream_encoder_finish (flacenc->encoder); } else { /* can't handle intermittent draining/resyncing */ GST_ELEMENT_WARNING (flacenc, STREAM, FORMAT, (NULL), ("Stream discontinuity detected. " "The output may have wrong timestamps, " "consider using audiorate to handle discontinuities")); } return flacenc->last_flow; } insize = GST_BUFFER_SIZE (buffer); samples = insize / (width >> 3); data = g_malloc (samples * sizeof (FLAC__int32)); if (width == 8) { gint8 *indata = (gint8 *) GST_BUFFER_DATA (buffer); for (i = 0; i < samples; i++) data[i] = (FLAC__int32) indata[i]; } else if (width == 16) { gint16 *indata = (gint16 *) GST_BUFFER_DATA (buffer); for (i = 0; i < samples; i++) data[i] = (FLAC__int32) indata[i]; } else if (width == 32) { gint32 *indata = (gint32 *) GST_BUFFER_DATA (buffer); for (i = 0; i < samples; i++) data[i] = (FLAC__int32) indata[i]; } else { g_assert_not_reached (); } res = FLAC__stream_encoder_process_interleaved (flacenc->encoder, (const FLAC__int32 *) data, samples / flacenc->channels); g_free (data); if (!res) { if (flacenc->last_flow == GST_FLOW_OK) return GST_FLOW_ERROR; else return flacenc->last_flow; } return GST_FLOW_OK; } static void gst_flac_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstFlacEnc *this = GST_FLAC_ENC (object); GST_OBJECT_LOCK (this); switch (prop_id) { case PROP_QUALITY: gst_flac_enc_update_quality (this, g_value_get_enum (value)); break; case PROP_STREAMABLE_SUBSET: FLAC__stream_encoder_set_streamable_subset (this->encoder, g_value_get_boolean (value)); break; case PROP_MID_SIDE_STEREO: FLAC__stream_encoder_set_do_mid_side_stereo (this->encoder, g_value_get_boolean (value)); break; case PROP_LOOSE_MID_SIDE_STEREO: FLAC__stream_encoder_set_loose_mid_side_stereo (this->encoder, g_value_get_boolean (value)); break; case PROP_BLOCKSIZE: FLAC__stream_encoder_set_blocksize (this->encoder, g_value_get_uint (value)); break; case PROP_MAX_LPC_ORDER: FLAC__stream_encoder_set_max_lpc_order (this->encoder, g_value_get_uint (value)); break; case PROP_QLP_COEFF_PRECISION: FLAC__stream_encoder_set_qlp_coeff_precision (this->encoder, g_value_get_uint (value)); break; case PROP_QLP_COEFF_PREC_SEARCH: FLAC__stream_encoder_set_do_qlp_coeff_prec_search (this->encoder, g_value_get_boolean (value)); break; case PROP_ESCAPE_CODING: FLAC__stream_encoder_set_do_escape_coding (this->encoder, g_value_get_boolean (value)); break; case PROP_EXHAUSTIVE_MODEL_SEARCH: FLAC__stream_encoder_set_do_exhaustive_model_search (this->encoder, g_value_get_boolean (value)); break; case PROP_MIN_RESIDUAL_PARTITION_ORDER: FLAC__stream_encoder_set_min_residual_partition_order (this->encoder, g_value_get_uint (value)); break; case PROP_MAX_RESIDUAL_PARTITION_ORDER: FLAC__stream_encoder_set_max_residual_partition_order (this->encoder, g_value_get_uint (value)); break; case PROP_RICE_PARAMETER_SEARCH_DIST: FLAC__stream_encoder_set_rice_parameter_search_dist (this->encoder, g_value_get_uint (value)); break; case PROP_PADDING: this->padding = g_value_get_uint (value); break; case PROP_SEEKPOINTS: this->seekpoints = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (this); } static void gst_flac_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstFlacEnc *this = GST_FLAC_ENC (object); GST_OBJECT_LOCK (this); switch (prop_id) { case PROP_QUALITY: g_value_set_enum (value, this->quality); break; case PROP_STREAMABLE_SUBSET: g_value_set_boolean (value, FLAC__stream_encoder_get_streamable_subset (this->encoder)); break; case PROP_MID_SIDE_STEREO: g_value_set_boolean (value, FLAC__stream_encoder_get_do_mid_side_stereo (this->encoder)); break; case PROP_LOOSE_MID_SIDE_STEREO: g_value_set_boolean (value, FLAC__stream_encoder_get_loose_mid_side_stereo (this->encoder)); break; case PROP_BLOCKSIZE: g_value_set_uint (value, FLAC__stream_encoder_get_blocksize (this->encoder)); break; case PROP_MAX_LPC_ORDER: g_value_set_uint (value, FLAC__stream_encoder_get_max_lpc_order (this->encoder)); break; case PROP_QLP_COEFF_PRECISION: g_value_set_uint (value, FLAC__stream_encoder_get_qlp_coeff_precision (this->encoder)); break; case PROP_QLP_COEFF_PREC_SEARCH: g_value_set_boolean (value, FLAC__stream_encoder_get_do_qlp_coeff_prec_search (this->encoder)); break; case PROP_ESCAPE_CODING: g_value_set_boolean (value, FLAC__stream_encoder_get_do_escape_coding (this->encoder)); break; case PROP_EXHAUSTIVE_MODEL_SEARCH: g_value_set_boolean (value, FLAC__stream_encoder_get_do_exhaustive_model_search (this->encoder)); break; case PROP_MIN_RESIDUAL_PARTITION_ORDER: g_value_set_uint (value, FLAC__stream_encoder_get_min_residual_partition_order (this->encoder)); break; case PROP_MAX_RESIDUAL_PARTITION_ORDER: g_value_set_uint (value, FLAC__stream_encoder_get_max_residual_partition_order (this->encoder)); break; case PROP_RICE_PARAMETER_SEARCH_DIST: g_value_set_uint (value, FLAC__stream_encoder_get_rice_parameter_search_dist (this->encoder)); break; case PROP_PADDING: g_value_set_uint (value, this->padding); break; case PROP_SEEKPOINTS: g_value_set_int (value, this->seekpoints); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (this); } gst-plugins-good-0.10.31/ext/flac/gstflacenc.h0000644000175000017500000000454411677341654016013 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_FLAC_ENC_H__ #define __GST_FLAC_ENC_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_FLAC_ENC (gst_flac_enc_get_type()) #define GST_FLAC_ENC(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_FLAC_ENC, GstFlacEnc) #define GST_FLAC_ENC_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_FLAC_ENC, GstFlacEncClass) #define GST_IS_FLAC_ENC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLAC_ENC) #define GST_IS_FLAC_ENC_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLAC_ENC) typedef struct _GstFlacEnc GstFlacEnc; typedef struct _GstFlacEncClass GstFlacEncClass; struct _GstFlacEnc { GstAudioEncoder element; /* < private > */ GstFlowReturn last_flow; /* save flow from last push so we can pass the * correct flow return upstream in case the push * fails for some reason */ guint64 offset; gint channels; gint width; gint depth; gint sample_rate; gint quality; gboolean stopped; guint padding; gint seekpoints; FLAC__StreamEncoder *encoder; FLAC__StreamMetadata **meta; GstTagList * tags; gboolean eos; /* queue headers until we have them all so we can add streamheaders to caps */ gboolean got_headers; GList *headers; }; struct _GstFlacEncClass { GstAudioEncoderClass parent_class; }; GType gst_flac_enc_get_type(void); G_END_DECLS #endif /* __GST_FLAC_ENC_H__ */ gst-plugins-good-0.10.31/ext/flac/gstflacdec.c0000644000175000017500000020752711707323125015765 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Tim-Philipp Müller * Copyright (C) <2006> Jan Schmidt * * 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-flacdec * @see_also: #GstFlacEnc * * flacdec decodes FLAC streams. * FLAC * is a Free Lossless Audio Codec. * * * Example launch line * |[ * gst-launch filesrc location=media/small/dark.441-16-s.flac ! flacdec ! audioconvert ! audioresample ! autoaudiosink * ]| * |[ * gst-launch gnomevfssrc location=http://gstreamer.freedesktop.org/media/small/dark.441-16-s.flac ! flacdec ! audioconvert ! audioresample ! queue min-threshold-buffers=10 ! autoaudiosink * ]| * */ /* TODO: add seeking when operating chain-based with unframed input */ /* FIXME: demote/remove granulepos handling and make more time-centric */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include "gstflacdec.h" #include #include #include #include #include /* Taken from http://flac.sourceforge.net/format.html#frame_header */ static const GstAudioChannelPosition channel_positions[8][8] = { {GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}, {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { 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_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */ { 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}, { 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} }; GST_DEBUG_CATEGORY_STATIC (flacdec_debug); #define GST_CAT_DEFAULT flacdec_debug static void gst_flac_dec_finalize (GObject * object); static void gst_flac_dec_loop (GstPad * pad); static GstStateChangeReturn gst_flac_dec_change_state (GstElement * element, GstStateChange transition); static const GstQueryType *gst_flac_dec_get_src_query_types (GstPad * pad); static const GstQueryType *gst_flac_dec_get_sink_query_types (GstPad * pad); static gboolean gst_flac_dec_sink_query (GstPad * pad, GstQuery * query); static gboolean gst_flac_dec_src_query (GstPad * pad, GstQuery * query); static gboolean gst_flac_dec_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); static gboolean gst_flac_dec_src_event (GstPad * pad, GstEvent * event); static gboolean gst_flac_dec_sink_activate (GstPad * sinkpad); static gboolean gst_flac_dec_sink_activate_pull (GstPad * sinkpad, gboolean active); static gboolean gst_flac_dec_sink_activate_push (GstPad * sinkpad, gboolean active); static gboolean gst_flac_dec_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_flac_dec_chain (GstPad * pad, GstBuffer * buf); static void gst_flac_dec_reset_decoders (GstFlacDec * flacdec); static void gst_flac_dec_setup_decoder (GstFlacDec * flacdec); static FLAC__StreamDecoderReadStatus gst_flac_dec_read_seekable (const FLAC__StreamDecoder * decoder, FLAC__byte buffer[], size_t * bytes, void *client_data); static FLAC__StreamDecoderReadStatus gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, FLAC__byte buffer[], size_t * bytes, void *client_data); static FLAC__StreamDecoderSeekStatus gst_flac_dec_seek (const FLAC__StreamDecoder * decoder, FLAC__uint64 position, void *client_data); static FLAC__StreamDecoderTellStatus gst_flac_dec_tell (const FLAC__StreamDecoder * decoder, FLAC__uint64 * position, void *client_data); static FLAC__StreamDecoderLengthStatus gst_flac_dec_length (const FLAC__StreamDecoder * decoder, FLAC__uint64 * length, void *client_data); static FLAC__bool gst_flac_dec_eof (const FLAC__StreamDecoder * decoder, void *client_data); static FLAC__StreamDecoderWriteStatus gst_flac_dec_write_stream (const FLAC__StreamDecoder * decoder, const FLAC__Frame * frame, const FLAC__int32 * const buffer[], void *client_data); static void gst_flac_dec_metadata_cb (const FLAC__StreamDecoder * decoder, const FLAC__StreamMetadata * metadata, void *client_data); static void gst_flac_dec_error_cb (const FLAC__StreamDecoder * decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); GST_BOILERPLATE (GstFlacDec, gst_flac_dec, GstElement, GST_TYPE_ELEMENT); /* FIXME 0.11: Use width=32 for all depths and let audioconvert * handle the conversions instead of doing it ourself. */ #define GST_FLAC_DEC_SRC_CAPS \ "audio/x-raw-int, " \ "endianness = (int) BYTE_ORDER, " \ "signed = (boolean) true, " \ "width = (int) { 8, 16, 32 }, " \ "depth = (int) [ 4, 32 ], " \ "rate = (int) [ 1, 655350 ], " \ "channels = (int) [ 1, 8 ]" static GstStaticPadTemplate flac_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_FLAC_DEC_SRC_CAPS)); static GstStaticPadTemplate flac_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-flac") ); static void gst_flac_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &flac_dec_src_factory); gst_element_class_add_static_pad_template (element_class, &flac_dec_sink_factory); gst_element_class_set_details_simple (element_class, "FLAC audio decoder", "Codec/Decoder/Audio", "Decodes FLAC lossless audio streams", "Wim Taymans "); GST_DEBUG_CATEGORY_INIT (flacdec_debug, "flacdec", 0, "flac decoder"); } static void gst_flac_dec_class_init (GstFlacDecClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; gstelement_class = (GstElementClass *) klass; gobject_class = (GObjectClass *) klass; gobject_class->finalize = gst_flac_dec_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_flac_dec_change_state); } static void gst_flac_dec_init (GstFlacDec * flacdec, GstFlacDecClass * klass) { flacdec->sinkpad = gst_pad_new_from_static_template (&flac_dec_sink_factory, "sink"); gst_pad_set_activate_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_sink_activate)); gst_pad_set_activatepull_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_sink_activate_pull)); gst_pad_set_activatepush_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_sink_activate_push)); gst_pad_set_query_type_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_get_sink_query_types)); gst_pad_set_query_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_sink_query)); gst_pad_set_event_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_sink_event)); gst_pad_set_chain_function (flacdec->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_dec_chain)); gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->sinkpad); flacdec->srcpad = gst_pad_new_from_static_template (&flac_dec_src_factory, "src"); gst_pad_set_query_type_function (flacdec->srcpad, GST_DEBUG_FUNCPTR (gst_flac_dec_get_src_query_types)); gst_pad_set_query_function (flacdec->srcpad, GST_DEBUG_FUNCPTR (gst_flac_dec_src_query)); gst_pad_set_event_function (flacdec->srcpad, GST_DEBUG_FUNCPTR (gst_flac_dec_src_event)); gst_pad_use_fixed_caps (flacdec->srcpad); gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->srcpad); gst_flac_dec_reset_decoders (flacdec); } static void gst_flac_dec_reset_decoders (GstFlacDec * flacdec) { /* Clean up the decoder */ if (flacdec->decoder) { FLAC__stream_decoder_delete (flacdec->decoder); flacdec->decoder = NULL; } if (flacdec->adapter) { gst_adapter_clear (flacdec->adapter); g_object_unref (flacdec->adapter); flacdec->adapter = NULL; } if (flacdec->close_segment) { gst_event_unref (flacdec->close_segment); flacdec->close_segment = NULL; } if (flacdec->start_segment) { gst_event_unref (flacdec->start_segment); flacdec->start_segment = NULL; } if (flacdec->tags) { gst_tag_list_free (flacdec->tags); flacdec->tags = NULL; } if (flacdec->pending) { gst_buffer_unref (flacdec->pending); flacdec->pending = NULL; } flacdec->segment.last_stop = 0; flacdec->offset = 0; flacdec->init = TRUE; } static void gst_flac_dec_setup_decoder (GstFlacDec * dec) { gst_flac_dec_reset_decoders (dec); dec->tags = gst_tag_list_new (); gst_tag_list_add (dec->tags, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, "FLAC", NULL); dec->adapter = gst_adapter_new (); dec->decoder = FLAC__stream_decoder_new (); /* no point calculating since it's never checked here */ FLAC__stream_decoder_set_md5_checking (dec->decoder, false); FLAC__stream_decoder_set_metadata_respond (dec->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC__stream_decoder_set_metadata_respond (dec->decoder, FLAC__METADATA_TYPE_PICTURE); } static void gst_flac_dec_finalize (GObject * object) { GstFlacDec *flacdec; flacdec = GST_FLAC_DEC (object); gst_flac_dec_reset_decoders (flacdec); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_flac_dec_update_metadata (GstFlacDec * flacdec, const FLAC__StreamMetadata * metadata) { GstTagList *list; guint num, i; if (flacdec->tags) list = flacdec->tags; else flacdec->tags = list = gst_tag_list_new (); num = metadata->data.vorbis_comment.num_comments; GST_DEBUG_OBJECT (flacdec, "%u tag(s) found", num); for (i = 0; i < num; ++i) { gchar *vc, *name, *value; vc = g_strndup ((gchar *) metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length); if (gst_tag_parse_extended_comment (vc, &name, NULL, &value, TRUE)) { GST_DEBUG_OBJECT (flacdec, "%s : %s", name, value); if (value && strlen (value)) gst_vorbis_tag_add (list, name, value); g_free (name); g_free (value); } g_free (vc); } return TRUE; } /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ static const guint8 crc8_table[256] = { 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 }; static guint8 gst_flac_calculate_crc8 (guint8 * data, guint length) { guint8 crc = 0; while (length--) { crc = crc8_table[crc ^ *data]; ++data; } return crc; } static gboolean gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size, gint64 * last_sample_num) { guint headerlen; guint sr_from_end = 0; /* can be 0, 8 or 16 */ guint bs_from_end = 0; /* can be 0, 8 or 16 */ guint32 val = 0; guint8 bs, sr, ca, ss, pb; if (size < 10) return FALSE; /* sync */ if (data[0] != 0xFF || (data[1] & 0xFC) != 0xF8) return FALSE; if (data[1] & 1) { GST_WARNING_OBJECT (flacdec, "Variable block size FLAC unsupported"); return FALSE; } bs = (data[2] & 0xF0) >> 4; /* blocksize marker */ sr = (data[2] & 0x0F); /* samplerate marker */ ca = (data[3] & 0xF0) >> 4; /* channel assignment */ ss = (data[3] & 0x0F) >> 1; /* sample size marker */ pb = (data[3] & 0x01); /* padding bit */ GST_LOG_OBJECT (flacdec, "got sync, bs=%x,sr=%x,ca=%x,ss=%x,pb=%x", bs, sr, ca, ss, pb); if (bs == 0 || sr == 0x0F || ca >= 0x0B || ss == 0x03 || ss == 0x07) { return FALSE; } /* read block size from end of header? */ if (bs == 6) bs_from_end = 8; else if (bs == 7) bs_from_end = 16; /* read sample rate from end of header? */ if (sr == 0x0C) sr_from_end = 8; else if (sr == 0x0D || sr == 0x0E) sr_from_end = 16; /* FIXME: This is can be 36 bit if variable block size is used, * fortunately not encoder supports this yet and we check for that * above. */ val = (guint32) g_utf8_get_char_validated ((gchar *) data + 4, -1); if (val == (guint32) - 1 || val == (guint32) - 2) { GST_LOG_OBJECT (flacdec, "failed to read sample/frame"); return FALSE; } headerlen = 4 + g_unichar_to_utf8 ((gunichar) val, NULL) + (bs_from_end / 8) + (sr_from_end / 8); if (gst_flac_calculate_crc8 (data, headerlen) != data[headerlen]) { GST_LOG_OBJECT (flacdec, "invalid checksum"); return FALSE; } if (flacdec->min_blocksize == flacdec->max_blocksize) { *last_sample_num = (val + 1) * flacdec->min_blocksize; } else { *last_sample_num = 0; /* FIXME: + length of last block in samples */ } /* FIXME: only valid for fixed block size streams */ GST_DEBUG_OBJECT (flacdec, "frame number: %" G_GINT64_FORMAT, *last_sample_num); if (flacdec->sample_rate > 0 && *last_sample_num != 0) { GST_DEBUG_OBJECT (flacdec, "last sample %" G_GINT64_FORMAT " = %" GST_TIME_FORMAT, *last_sample_num, GST_TIME_ARGS (*last_sample_num * GST_SECOND / flacdec->sample_rate)); } return TRUE; } #define SCANBLOCK_SIZE (64*1024) static void gst_flac_dec_scan_for_last_block (GstFlacDec * flacdec, gint64 * samples) { GstFormat format = GST_FORMAT_BYTES; gint64 file_size, offset; GST_INFO_OBJECT (flacdec, "total number of samples unknown, scanning file"); if (!gst_pad_query_peer_duration (flacdec->sinkpad, &format, &file_size)) { GST_WARNING_OBJECT (flacdec, "failed to query upstream size!"); return; } if (flacdec->min_blocksize != flacdec->max_blocksize) { GST_WARNING_OBJECT (flacdec, "scanning for last sample only works " "for FLAC files with constant blocksize"); return; } GST_DEBUG_OBJECT (flacdec, "upstream size: %" G_GINT64_FORMAT, file_size); offset = file_size - 1; while (offset >= MAX (SCANBLOCK_SIZE / 2, file_size / 2)) { GstFlowReturn flow; GstBuffer *buf = NULL; guint8 *data; guint size; /* divide by 2 = not very sophisticated way to deal with overlapping */ offset -= SCANBLOCK_SIZE / 2; GST_LOG_OBJECT (flacdec, "looking for frame at %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT, offset, offset + SCANBLOCK_SIZE); flow = gst_pad_pull_range (flacdec->sinkpad, offset, SCANBLOCK_SIZE, &buf); if (flow != GST_FLOW_OK) { GST_DEBUG_OBJECT (flacdec, "flow = %s", gst_flow_get_name (flow)); return; } size = GST_BUFFER_SIZE (buf); data = GST_BUFFER_DATA (buf); while (size > 16) { if (gst_flac_dec_scan_got_frame (flacdec, data, size, samples)) { GST_DEBUG_OBJECT (flacdec, "frame sync at offset %" G_GINT64_FORMAT, offset + GST_BUFFER_SIZE (buf) - size); gst_buffer_unref (buf); return; } ++data; --size; } gst_buffer_unref (buf); } } static void gst_flac_extract_picture_buffer (GstFlacDec * dec, const FLAC__StreamMetadata * metadata) { FLAC__StreamMetadata_Picture picture; GstTagList *tags; g_return_if_fail (metadata->type == FLAC__METADATA_TYPE_PICTURE); GST_LOG_OBJECT (dec, "Got PICTURE block"); picture = metadata->data.picture; GST_DEBUG_OBJECT (dec, "declared MIME type is: '%s'", GST_STR_NULL (picture.mime_type)); GST_DEBUG_OBJECT (dec, "image data is %u bytes", picture.data_length); tags = gst_tag_list_new (); gst_tag_list_add_id3_image (tags, (guint8 *) picture.data, picture.data_length, picture.type); if (!gst_tag_list_is_empty (tags)) { gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, tags); } else { GST_DEBUG_OBJECT (dec, "problem parsing PICTURE block, skipping"); gst_tag_list_free (tags); } } static void gst_flac_dec_metadata_cb (const FLAC__StreamDecoder * decoder, const FLAC__StreamMetadata * metadata, void *client_data) { GstFlacDec *flacdec = GST_FLAC_DEC (client_data); GST_LOG_OBJECT (flacdec, "metadata type: %d", metadata->type); switch (metadata->type) { case FLAC__METADATA_TYPE_STREAMINFO:{ gint64 samples; guint depth; samples = metadata->data.stream_info.total_samples; flacdec->min_blocksize = metadata->data.stream_info.min_blocksize; flacdec->max_blocksize = metadata->data.stream_info.max_blocksize; flacdec->sample_rate = metadata->data.stream_info.sample_rate; flacdec->depth = depth = metadata->data.stream_info.bits_per_sample; flacdec->channels = metadata->data.stream_info.channels; if (depth < 9) flacdec->width = 8; else if (depth < 17) flacdec->width = 16; else flacdec->width = 32; GST_DEBUG_OBJECT (flacdec, "blocksize: min=%u, max=%u", flacdec->min_blocksize, flacdec->max_blocksize); GST_DEBUG_OBJECT (flacdec, "sample rate: %u, channels: %u", flacdec->sample_rate, flacdec->channels); GST_DEBUG_OBJECT (flacdec, "depth: %u, width: %u", flacdec->depth, flacdec->width); /* Only scan for last block in pull-mode, since it uses pull_range() */ if (samples == 0 && !flacdec->streaming) { gst_flac_dec_scan_for_last_block (flacdec, &samples); } GST_DEBUG_OBJECT (flacdec, "total samples = %" G_GINT64_FORMAT, samples); /* in framed mode the demuxer/parser upstream has already pushed a * newsegment event in TIME format which we've passed on */ if (samples > 0 && !flacdec->framed) { gint64 duration; gst_segment_set_duration (&flacdec->segment, GST_FORMAT_DEFAULT, samples); /* convert duration to time */ duration = gst_util_uint64_scale_int (samples, GST_SECOND, flacdec->sample_rate); /* fixme, at this time we could seek to the queued seek event if we have * any */ if (flacdec->start_segment) gst_event_unref (flacdec->start_segment); flacdec->start_segment = gst_event_new_new_segment_full (FALSE, flacdec->segment.rate, flacdec->segment.applied_rate, GST_FORMAT_TIME, 0, duration, 0); } break; } case FLAC__METADATA_TYPE_PICTURE:{ gst_flac_extract_picture_buffer (flacdec, metadata); break; } case FLAC__METADATA_TYPE_VORBIS_COMMENT: gst_flac_dec_update_metadata (flacdec, metadata); break; default: break; } } static void gst_flac_dec_error_cb (const FLAC__StreamDecoder * d, FLAC__StreamDecoderErrorStatus status, void *client_data) { const gchar *error; GstFlacDec *dec; dec = GST_FLAC_DEC (client_data); switch (status) { case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC: /* Ignore this error and keep processing */ return; case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER: error = "bad header"; break; case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH: error = "CRC mismatch"; break; default: error = "unknown error"; break; } GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("%s (%d)", error, status)); dec->last_flow = GST_FLOW_ERROR; } static FLAC__StreamDecoderSeekStatus gst_flac_dec_seek (const FLAC__StreamDecoder * decoder, FLAC__uint64 position, void *client_data) { GstFlacDec *flacdec; flacdec = GST_FLAC_DEC (client_data); GST_DEBUG_OBJECT (flacdec, "seek %" G_GUINT64_FORMAT, (guint64) position); flacdec->offset = position; return FLAC__STREAM_DECODER_SEEK_STATUS_OK; } static FLAC__StreamDecoderTellStatus gst_flac_dec_tell (const FLAC__StreamDecoder * decoder, FLAC__uint64 * position, void *client_data) { GstFlacDec *flacdec; flacdec = GST_FLAC_DEC (client_data); *position = flacdec->offset; GST_DEBUG_OBJECT (flacdec, "tell %" G_GINT64_FORMAT, (gint64) * position); return FLAC__STREAM_DECODER_TELL_STATUS_OK; } static FLAC__StreamDecoderLengthStatus gst_flac_dec_length (const FLAC__StreamDecoder * decoder, FLAC__uint64 * length, void *client_data) { GstFlacDec *flacdec; GstFormat fmt = GST_FORMAT_BYTES; gint64 len = -1; flacdec = GST_FLAC_DEC (client_data); if (!gst_pad_query_peer_duration (flacdec->sinkpad, &fmt, &len) || (fmt != GST_FORMAT_BYTES || len == -1)) return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; *length = len; GST_DEBUG_OBJECT (flacdec, "encoded byte length %" G_GINT64_FORMAT, (gint64) * length); return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; } static FLAC__bool gst_flac_dec_eof (const FLAC__StreamDecoder * decoder, void *client_data) { GstFlacDec *flacdec; GstFormat fmt; GstPad *peer; gboolean ret = FALSE; gint64 len; flacdec = GST_FLAC_DEC (client_data); if (!(peer = gst_pad_get_peer (flacdec->sinkpad))) { GST_WARNING_OBJECT (flacdec, "no peer pad, returning EOF"); return TRUE; } fmt = GST_FORMAT_BYTES; if (gst_pad_query_duration (peer, &fmt, &len) && fmt == GST_FORMAT_BYTES && len != -1 && flacdec->offset >= len) { GST_DEBUG_OBJECT (flacdec, "offset=%" G_GINT64_FORMAT ", len=%" G_GINT64_FORMAT ", returning EOF", flacdec->offset, len); ret = TRUE; } gst_object_unref (peer); return ret; } static FLAC__StreamDecoderReadStatus gst_flac_dec_read_seekable (const FLAC__StreamDecoder * decoder, FLAC__byte buffer[], size_t * bytes, void *client_data) { GstFlowReturn flow; GstFlacDec *flacdec; GstBuffer *buf; flacdec = GST_FLAC_DEC (client_data); flow = gst_pad_pull_range (flacdec->sinkpad, flacdec->offset, *bytes, &buf); GST_PAD_STREAM_LOCK (flacdec->sinkpad); flacdec->pull_flow = flow; GST_PAD_STREAM_UNLOCK (flacdec->sinkpad); if (G_UNLIKELY (flow != GST_FLOW_OK)) { GST_INFO_OBJECT (flacdec, "pull_range flow: %s", gst_flow_get_name (flow)); if (flow == GST_FLOW_UNEXPECTED) return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; else return FLAC__STREAM_DECODER_READ_STATUS_ABORT; } GST_DEBUG_OBJECT (flacdec, "Read %d bytes at %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buf), flacdec->offset); memcpy (buffer, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); *bytes = GST_BUFFER_SIZE (buf); gst_buffer_unref (buf); flacdec->offset += *bytes; return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } static FLAC__StreamDecoderReadStatus gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, FLAC__byte buffer[], size_t * bytes, void *client_data) { GstFlacDec *dec = GST_FLAC_DEC (client_data); guint len; len = MIN (gst_adapter_available (dec->adapter), *bytes); if (len == 0) { GST_LOG_OBJECT (dec, "0 bytes available at the moment"); return FLAC__STREAM_DECODER_READ_STATUS_ABORT; } GST_LOG_OBJECT (dec, "feeding %u bytes to decoder (available=%u, bytes=%u)", len, gst_adapter_available (dec->adapter), (guint) * bytes); gst_adapter_copy (dec->adapter, buffer, 0, len); *bytes = len; gst_adapter_flush (dec->adapter, len); return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; } static FLAC__StreamDecoderWriteStatus gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, const FLAC__int32 * const buffer[]) { GstFlowReturn ret = GST_FLOW_OK; GstBuffer *outbuf; guint depth = frame->header.bits_per_sample; guint width; guint sample_rate = frame->header.sample_rate; guint channels = frame->header.channels; guint samples = frame->header.blocksize; guint j, i; GstClockTime next; GST_LOG_OBJECT (flacdec, "samples in frame header: %d", samples); /* if a DEFAULT segment is configured, don't send samples past the end * of the segment */ if (flacdec->segment.format == GST_FORMAT_DEFAULT && flacdec->segment.stop != -1 && flacdec->segment.last_stop >= 0 && flacdec->segment.last_stop + samples > flacdec->segment.stop) { samples = flacdec->segment.stop - flacdec->segment.last_stop; GST_DEBUG_OBJECT (flacdec, "clipping last buffer to %d samples because of segment", samples); } switch (depth) { case 8: width = 8; break; case 12: case 16: width = 16; break; case 20: case 24: case 32: width = 32; break; case 0: if (flacdec->depth < 4 || flacdec->depth > 32) { GST_ERROR_OBJECT (flacdec, "unsupported depth %d from STREAMINFO", flacdec->depth); ret = GST_FLOW_ERROR; goto done; } depth = flacdec->depth; if (depth < 9) width = 8; else if (depth < 17) width = 16; else width = 32; break; default: GST_ERROR_OBJECT (flacdec, "unsupported depth %d", depth); ret = GST_FLOW_ERROR; goto done; } if (sample_rate == 0) { if (flacdec->sample_rate != 0) { sample_rate = flacdec->sample_rate; } else { GST_ERROR_OBJECT (flacdec, "unknown sample rate"); ret = GST_FLOW_ERROR; goto done; } } if (!GST_PAD_CAPS (flacdec->srcpad)) { GstCaps *caps; GST_DEBUG_OBJECT (flacdec, "Negotiating %d Hz @ %d channels", frame->header.sample_rate, channels); caps = gst_caps_new_simple ("audio/x-raw-int", "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, width, "depth", G_TYPE_INT, depth, "rate", G_TYPE_INT, frame->header.sample_rate, "channels", G_TYPE_INT, channels, NULL); if (channels > 2) { GstStructure *s = gst_caps_get_structure (caps, 0); gst_audio_set_channel_positions (s, channel_positions[channels - 1]); } flacdec->depth = depth; flacdec->width = width; flacdec->channels = channels; flacdec->sample_rate = sample_rate; gst_pad_set_caps (flacdec->srcpad, caps); gst_caps_unref (caps); } if (flacdec->close_segment) { GST_DEBUG_OBJECT (flacdec, "pushing close segment"); gst_pad_push_event (flacdec->srcpad, flacdec->close_segment); flacdec->close_segment = NULL; } if (flacdec->start_segment) { GST_DEBUG_OBJECT (flacdec, "pushing start segment"); gst_pad_push_event (flacdec->srcpad, flacdec->start_segment); flacdec->start_segment = NULL; } if (flacdec->tags) { gst_element_found_tags_for_pad (GST_ELEMENT (flacdec), flacdec->srcpad, flacdec->tags); flacdec->tags = NULL; } if (flacdec->pending) { GST_DEBUG_OBJECT (flacdec, "pushing pending samples at offset %" G_GINT64_FORMAT " (%" GST_TIME_FORMAT " + %" GST_TIME_FORMAT ")", GST_BUFFER_OFFSET (flacdec->pending), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (flacdec->pending)), GST_TIME_ARGS (GST_BUFFER_DURATION (flacdec->pending))); /* Pending buffer was always allocated from the seeking thread, * which means it wasn't gst_buffer_alloc'd. Do so now to let * downstream negotiation work on older basetransform */ ret = gst_pad_alloc_buffer_and_set_caps (flacdec->srcpad, GST_BUFFER_OFFSET (flacdec->pending), GST_BUFFER_SIZE (flacdec->pending), GST_BUFFER_CAPS (flacdec->pending), &outbuf); if (ret == GST_FLOW_OK) { gst_pad_push (flacdec->srcpad, flacdec->pending); gst_buffer_unref (outbuf); } outbuf = flacdec->pending = NULL; flacdec->segment.last_stop += flacdec->pending_samples; flacdec->pending_samples = 0; } if (flacdec->seeking) { GST_DEBUG_OBJECT (flacdec, "a pad_alloc would block here, do normal alloc"); outbuf = gst_buffer_new_and_alloc (samples * channels * (width / 8)); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (flacdec->srcpad)); GST_BUFFER_OFFSET (outbuf) = flacdec->segment.last_stop; } else { GST_LOG_OBJECT (flacdec, "alloc_buffer_and_set_caps"); ret = gst_pad_alloc_buffer_and_set_caps (flacdec->srcpad, flacdec->segment.last_stop, samples * channels * (width / 8), GST_PAD_CAPS (flacdec->srcpad), &outbuf); if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (flacdec, "gst_pad_alloc_buffer() returned %s", gst_flow_get_name (ret)); goto done; } } if (flacdec->cur_granulepos != GST_BUFFER_OFFSET_NONE) { /* this should be fine since it should be one flac frame per ogg packet */ /* note the + 1, as the granpos is the presentation time of the last sample, whereas the last stop represents the end time of that sample */ flacdec->segment.last_stop = flacdec->cur_granulepos - samples + 1; GST_LOG_OBJECT (flacdec, "granulepos = %" G_GINT64_FORMAT ", samples = %u", flacdec->cur_granulepos, samples); } GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int (flacdec->segment.last_stop, GST_SECOND, frame->header.sample_rate); /* get next timestamp to calculate the duration */ next = gst_util_uint64_scale_int (flacdec->segment.last_stop + samples, GST_SECOND, frame->header.sample_rate); GST_BUFFER_DURATION (outbuf) = next - GST_BUFFER_TIMESTAMP (outbuf); if (width == 8) { gint8 *outbuffer = (gint8 *) GST_BUFFER_DATA (outbuf); for (i = 0; i < samples; i++) { for (j = 0; j < channels; j++) { *outbuffer++ = (gint8) buffer[j][i]; } } } else if (width == 16) { gint16 *outbuffer = (gint16 *) GST_BUFFER_DATA (outbuf); for (i = 0; i < samples; i++) { for (j = 0; j < channels; j++) { *outbuffer++ = (gint16) buffer[j][i]; } } } else if (width == 32) { gint32 *outbuffer = (gint32 *) GST_BUFFER_DATA (outbuf); for (i = 0; i < samples; i++) { for (j = 0; j < channels; j++) { *outbuffer++ = (gint32) buffer[j][i]; } } } else { g_assert_not_reached (); } if (!flacdec->seeking) { GST_DEBUG_OBJECT (flacdec, "pushing %d samples at offset %" G_GINT64_FORMAT " (%" GST_TIME_FORMAT " + %" GST_TIME_FORMAT ")", samples, GST_BUFFER_OFFSET (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); if (flacdec->discont) { GST_DEBUG_OBJECT (flacdec, "marking discont"); outbuf = gst_buffer_make_metadata_writable (outbuf); GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); flacdec->discont = FALSE; } ret = gst_pad_push (flacdec->srcpad, outbuf); GST_DEBUG_OBJECT (flacdec, "returned %s", gst_flow_get_name (ret)); flacdec->segment.last_stop += samples; } else { GST_DEBUG_OBJECT (flacdec, "not pushing %d samples at offset %" G_GINT64_FORMAT " (in seek)", samples, GST_BUFFER_OFFSET (outbuf)); gst_buffer_replace (&flacdec->pending, outbuf); gst_buffer_unref (outbuf); flacdec->pending_samples = samples; ret = GST_FLOW_OK; } if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (flacdec, "gst_pad_push() returned %s", gst_flow_get_name (ret)); } done: /* we act on the flow return value later in the loop function, as we don't * want to mess up the internal decoder state by returning ABORT when the * error is in fact non-fatal (like a pad in flushing mode) and we want * to continue later. So just pretend everything's dandy and act later. */ flacdec->last_flow = ret; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } static FLAC__StreamDecoderWriteStatus gst_flac_dec_write_stream (const FLAC__StreamDecoder * decoder, const FLAC__Frame * frame, const FLAC__int32 * const buffer[], void *client_data) { return gst_flac_dec_write (GST_FLAC_DEC (client_data), frame, buffer); } static void gst_flac_dec_loop (GstPad * sinkpad) { GstFlacDec *flacdec; FLAC__StreamDecoderState s; FLAC__StreamDecoderInitStatus is; flacdec = GST_FLAC_DEC (GST_OBJECT_PARENT (sinkpad)); GST_LOG_OBJECT (flacdec, "entering loop"); if (flacdec->eos) { GST_DEBUG_OBJECT (flacdec, "Seeked after end of file"); if (flacdec->close_segment) { GST_DEBUG_OBJECT (flacdec, "pushing close segment"); gst_pad_push_event (flacdec->srcpad, flacdec->close_segment); flacdec->close_segment = NULL; } if (flacdec->start_segment) { GST_DEBUG_OBJECT (flacdec, "pushing start segment"); gst_pad_push_event (flacdec->srcpad, flacdec->start_segment); flacdec->start_segment = NULL; } if (flacdec->tags) { gst_element_found_tags_for_pad (GST_ELEMENT (flacdec), flacdec->srcpad, flacdec->tags); flacdec->tags = NULL; } if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) == 0) { goto eos_and_pause; } else { goto segment_done_and_pause; } } if (flacdec->init) { GST_DEBUG_OBJECT (flacdec, "initializing new decoder"); is = FLAC__stream_decoder_init_stream (flacdec->decoder, gst_flac_dec_read_seekable, gst_flac_dec_seek, gst_flac_dec_tell, gst_flac_dec_length, gst_flac_dec_eof, gst_flac_dec_write_stream, gst_flac_dec_metadata_cb, gst_flac_dec_error_cb, flacdec); if (is != FLAC__STREAM_DECODER_INIT_STATUS_OK) goto analyze_state; /* FLAC__seekable_decoder_process_metadata (flacdec->decoder); */ flacdec->init = FALSE; } flacdec->cur_granulepos = GST_BUFFER_OFFSET_NONE; flacdec->last_flow = GST_FLOW_OK; GST_LOG_OBJECT (flacdec, "processing single"); FLAC__stream_decoder_process_single (flacdec->decoder); analyze_state: GST_LOG_OBJECT (flacdec, "done processing, checking encoder state"); s = FLAC__stream_decoder_get_state (flacdec->decoder); switch (s) { case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: case FLAC__STREAM_DECODER_READ_METADATA: case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: case FLAC__STREAM_DECODER_READ_FRAME: { GST_DEBUG_OBJECT (flacdec, "everything ok"); if (flacdec->last_flow < GST_FLOW_UNEXPECTED || flacdec->last_flow == GST_FLOW_NOT_LINKED) { GST_ELEMENT_ERROR (flacdec, STREAM, FAILED, (_("Internal data stream error.")), ("stream stopped, reason %s", gst_flow_get_name (flacdec->last_flow))); goto eos_and_pause; } else if (flacdec->last_flow == GST_FLOW_UNEXPECTED) { goto eos_and_pause; } else if (flacdec->last_flow != GST_FLOW_OK) { goto pause; } /* check if we're at the end of a configured segment */ if (flacdec->segment.stop != -1 && flacdec->segment.last_stop > 0 && flacdec->segment.last_stop >= flacdec->segment.stop) { GST_DEBUG_OBJECT (flacdec, "reached end of the configured segment"); if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) == 0) { goto eos_and_pause; } else { goto segment_done_and_pause; } g_assert_not_reached (); } return; } case FLAC__STREAM_DECODER_END_OF_STREAM:{ GST_DEBUG_OBJECT (flacdec, "EOS"); FLAC__stream_decoder_reset (flacdec->decoder); if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) != 0) { if (flacdec->segment.duration > 0) { flacdec->segment.stop = flacdec->segment.duration; } else { flacdec->segment.stop = flacdec->segment.last_stop; } goto segment_done_and_pause; } goto eos_and_pause; } /* gst_flac_dec_read_seekable() returned ABORTED */ case FLAC__STREAM_DECODER_ABORTED: { GST_INFO_OBJECT (flacdec, "read aborted: last pull_range flow = %s", gst_flow_get_name (flacdec->pull_flow)); if (flacdec->pull_flow == GST_FLOW_WRONG_STATE) { /* it seems we need to flush the decoder here to reset the decoder * state after the abort for FLAC__stream_decoder_seek_absolute() * to work properly */ GST_DEBUG_OBJECT (flacdec, "flushing decoder to reset decoder state"); FLAC__stream_decoder_flush (flacdec->decoder); goto pause; } /* fall through */ } case FLAC__STREAM_DECODER_OGG_ERROR: case FLAC__STREAM_DECODER_SEEK_ERROR: case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR: case FLAC__STREAM_DECODER_UNINITIALIZED: default:{ /* fixme: this error sucks -- should try to figure out when/if an more specific error was already sent via the callback */ GST_ELEMENT_ERROR (flacdec, STREAM, DECODE, (NULL), ("%s", FLAC__StreamDecoderStateString[s])); goto eos_and_pause; } } return; segment_done_and_pause: { gint64 stop_time; stop_time = gst_util_uint64_scale_int (flacdec->segment.stop, GST_SECOND, flacdec->sample_rate); GST_DEBUG_OBJECT (flacdec, "posting SEGMENT_DONE message, stop time %" GST_TIME_FORMAT, GST_TIME_ARGS (stop_time)); gst_element_post_message (GST_ELEMENT (flacdec), gst_message_new_segment_done (GST_OBJECT (flacdec), GST_FORMAT_TIME, stop_time)); goto pause; } eos_and_pause: { GST_DEBUG_OBJECT (flacdec, "sending EOS event"); flacdec->running = FALSE; gst_pad_push_event (flacdec->srcpad, gst_event_new_eos ()); /* fall through to pause */ } pause: { GST_DEBUG_OBJECT (flacdec, "pausing"); gst_pad_pause_task (sinkpad); return; } } static gboolean gst_flac_dec_sink_event (GstPad * pad, GstEvent * event) { GstFlacDec *dec; gboolean res; dec = GST_FLAC_DEC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP:{ if (dec->init == FALSE) { FLAC__stream_decoder_flush (dec->decoder); gst_adapter_clear (dec->adapter); } res = gst_pad_push_event (dec->srcpad, event); break; } case GST_EVENT_NEWSEGMENT:{ GstFormat fmt; gboolean update; gdouble rate, applied_rate; gint64 cur, stop, time; gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, &fmt, &cur, &stop, &time); if (fmt == GST_FORMAT_TIME) { GstFormat dformat = GST_FORMAT_DEFAULT; GST_DEBUG_OBJECT (dec, "newsegment event in TIME format => framed"); dec->framed = TRUE; res = gst_pad_push_event (dec->srcpad, event); /* this won't work for the first newsegment event though ... */ if (gst_flac_dec_convert_src (dec->srcpad, GST_FORMAT_TIME, cur, &dformat, &cur) && cur != -1 && gst_flac_dec_convert_src (dec->srcpad, GST_FORMAT_TIME, stop, &dformat, &stop) && stop != -1) { gst_segment_set_newsegment_full (&dec->segment, update, rate, applied_rate, dformat, cur, stop, time); GST_DEBUG_OBJECT (dec, "segment %" GST_SEGMENT_FORMAT, &dec->segment); } else { GST_WARNING_OBJECT (dec, "couldn't convert time => samples"); } } else if (fmt == GST_FORMAT_BYTES || TRUE) { GST_DEBUG_OBJECT (dec, "newsegment event in %s format => not framed", gst_format_get_name (fmt)); dec->framed = FALSE; /* prepare generic newsegment event, for some reason our metadata * callback where we usually set this up is not being called in * push mode */ if (dec->start_segment) gst_event_unref (dec->start_segment); dec->start_segment = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0); gst_event_unref (event); res = TRUE; } break; } case GST_EVENT_EOS:{ GST_LOG_OBJECT (dec, "EOS, with %u bytes available in adapter", gst_adapter_available (dec->adapter)); if (dec->init == FALSE) { if (gst_adapter_available (dec->adapter) > 0) { FLAC__stream_decoder_process_until_end_of_stream (dec->decoder); } FLAC__stream_decoder_flush (dec->decoder); } gst_adapter_clear (dec->adapter); res = gst_pad_push_event (dec->srcpad, event); break; } default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (dec); return res; } static gboolean gst_flac_dec_chain_parse_headers (GstFlacDec * dec) { guint8 marker[4]; guint avail, off; avail = gst_adapter_available (dec->adapter); if (avail < 4) return FALSE; gst_adapter_copy (dec->adapter, marker, 0, 4); if (strncmp ((const gchar *) marker, "fLaC", 4) != 0) { GST_ERROR_OBJECT (dec, "Unexpected header, expected fLaC header"); return TRUE; /* abort header parsing */ } GST_DEBUG_OBJECT (dec, "fLaC header : len 4 @ %7u", 0); off = 4; while (avail > (off + 1 + 3)) { gboolean is_last; guint8 mb_hdr[4]; guint len, block_type; gst_adapter_copy (dec->adapter, mb_hdr, off, 4); is_last = ((mb_hdr[0] & 0x80) == 0x80); block_type = mb_hdr[0] & 0x7f; len = GST_READ_UINT24_BE (mb_hdr + 1); GST_DEBUG_OBJECT (dec, "Metadata block type %u: len %7u + 4 @ %7u%s", block_type, len, off, (is_last) ? " (last)" : ""); off += 4 + len; if (is_last) break; if (off >= avail) { GST_LOG_OBJECT (dec, "Need more data: next offset %u > avail %u", off, avail); return FALSE; } } /* want metadata blocks plus at least one frame */ return (off + FLAC__MAX_BLOCK_SIZE >= avail); } static GstFlowReturn gst_flac_dec_chain (GstPad * pad, GstBuffer * buf) { FLAC__StreamDecoderInitStatus s; GstFlacDec *dec; gboolean got_audio_frame; dec = GST_FLAC_DEC (GST_PAD_PARENT (pad)); GST_LOG_OBJECT (dec, "buffer with ts=%" GST_TIME_FORMAT ", offset=%" G_GINT64_FORMAT ", end_offset=%" G_GINT64_FORMAT ", size=%u", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET_END (buf), GST_BUFFER_SIZE (buf)); if (dec->init) { GST_DEBUG_OBJECT (dec, "initializing decoder"); s = FLAC__stream_decoder_init_stream (dec->decoder, gst_flac_dec_read_stream, NULL, NULL, NULL, NULL, gst_flac_dec_write_stream, gst_flac_dec_metadata_cb, gst_flac_dec_error_cb, dec); if (s != FLAC__STREAM_DECODER_INIT_STATUS_OK) { GST_ELEMENT_ERROR (GST_ELEMENT (dec), LIBRARY, INIT, (NULL), (NULL)); return GST_FLOW_ERROR; } GST_DEBUG_OBJECT (dec, "initialized (framed=%d)", dec->framed); dec->init = FALSE; } else if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { /* Clear the adapter and the decoder */ gst_adapter_clear (dec->adapter); FLAC__stream_decoder_flush (dec->decoder); } if (dec->framed) { gint64 unused; /* check if this is a flac audio frame (rather than a header or junk) */ got_audio_frame = gst_flac_dec_scan_got_frame (dec, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), &unused); /* oggdemux will set granulepos in OFFSET_END instead of timestamp */ if (G_LIKELY (got_audio_frame)) { /* old oggdemux for now */ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { dec->cur_granulepos = GST_BUFFER_OFFSET_END (buf); } else { GstFormat dformat = GST_FORMAT_DEFAULT; /* upstream (e.g. demuxer) presents us time, * convert to default samples */ gst_flac_dec_convert_src (dec->srcpad, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buf), &dformat, &dec->segment.last_stop); dec->cur_granulepos = GST_BUFFER_OFFSET_NONE; } } } else { dec->cur_granulepos = GST_BUFFER_OFFSET_NONE; got_audio_frame = TRUE; } gst_adapter_push (dec->adapter, buf); buf = NULL; dec->last_flow = GST_FLOW_OK; if (!dec->framed) { if (G_UNLIKELY (!dec->got_headers)) { if (!gst_flac_dec_chain_parse_headers (dec)) { GST_LOG_OBJECT (dec, "don't have metadata blocks yet, need more data"); goto out; } GST_INFO_OBJECT (dec, "have all metadata blocks now"); dec->got_headers = TRUE; } /* wait until we have at least 64kB because libflac's StreamDecoder * interface is a bit dumb it seems (if we don't have as much data as * it wants it will call our read callback repeatedly and the only * way to stop that is to error out or EOS, which will affect the * decoder state). And the decoder seems to always ask for MAX_BLOCK_SIZE * bytes rather than the max. block size from the header). Requiring * MAX_BLOCK_SIZE bytes here should make sure it always gets enough data * to decode at least one block */ while (gst_adapter_available (dec->adapter) >= FLAC__MAX_BLOCK_SIZE && dec->last_flow == GST_FLOW_OK) { GST_LOG_OBJECT (dec, "%u bytes available", gst_adapter_available (dec->adapter)); if (!FLAC__stream_decoder_process_single (dec->decoder)) { GST_DEBUG_OBJECT (dec, "process_single failed"); break; } if (FLAC__stream_decoder_get_state (dec->decoder) == FLAC__STREAM_DECODER_ABORTED) { GST_WARNING_OBJECT (dec, "Read callback caused internal abort"); dec->last_flow = GST_FLOW_ERROR; break; } } } else if (dec->framed && got_audio_frame) { /* framed - there should always be enough data to decode something */ GST_LOG_OBJECT (dec, "%u bytes available", gst_adapter_available (dec->adapter)); if (G_UNLIKELY (!dec->got_headers)) { /* The first time we get audio data, we know we got all the headers. * We then loop until all the metadata is processed, then do an extra * "process_single" step for the audio frame. */ GST_DEBUG_OBJECT (dec, "First audio frame, ensuring all metadata is processed"); if (!FLAC__stream_decoder_process_until_end_of_metadata (dec->decoder)) { GST_DEBUG_OBJECT (dec, "process_until_end_of_metadata failed"); } GST_DEBUG_OBJECT (dec, "All metadata is now processed, reading to process audio data"); dec->got_headers = TRUE; } if (!FLAC__stream_decoder_process_single (dec->decoder)) { GST_DEBUG_OBJECT (dec, "process_single failed"); } } else { GST_DEBUG_OBJECT (dec, "don't have all headers yet"); } out: return dec->last_flow; } static gboolean gst_flac_dec_convert_sink (GstFlacDec * dec, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; if (dec->width == 0 || dec->channels == 0 || dec->sample_rate == 0) { /* no frame decoded yet */ GST_DEBUG_OBJECT (dec, "cannot convert: not set up yet"); return FALSE; } switch (src_format) { case GST_FORMAT_BYTES:{ res = FALSE; break; } case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_BYTES: res = FALSE; break; case GST_FORMAT_TIME: /* granulepos = sample */ *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, dec->sample_rate); break; default: res = FALSE; break; } break; case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: res = FALSE; break; case GST_FORMAT_DEFAULT: *dest_value = gst_util_uint64_scale_int (src_value, dec->sample_rate, GST_SECOND); break; default: res = FALSE; break; } break; default: res = FALSE; break; } return res; } static const GstQueryType * gst_flac_dec_get_sink_query_types (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_CONVERT, 0, }; return types; } static gboolean gst_flac_dec_sink_query (GstPad * pad, GstQuery * query) { GstFlacDec *dec; gboolean res = FALSE; dec = GST_FLAC_DEC (gst_pad_get_parent (pad)); GST_LOG_OBJECT (dec, "%s query", GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT:{ GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL); res = gst_flac_dec_convert_sink (dec, src_fmt, src_val, &dest_fmt, &dest_val); if (res) { gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); } GST_LOG_OBJECT (dec, "conversion %s", (res) ? "ok" : "FAILED"); break; } default:{ res = gst_pad_query_default (pad, query); break; } } gst_object_unref (dec); return res; } static gboolean gst_flac_dec_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { GstFlacDec *flacdec = GST_FLAC_DEC (GST_PAD_PARENT (pad)); gboolean res = TRUE; guint bytes_per_sample; guint scale = 1; if (flacdec->width == 0 || flacdec->channels == 0 || flacdec->sample_rate == 0) { /* no frame decoded yet */ GST_DEBUG_OBJECT (flacdec, "cannot convert: not set up yet"); return FALSE; } bytes_per_sample = flacdec->channels * (flacdec->width / 8); switch (src_format) { case GST_FORMAT_BYTES:{ switch (*dest_format) { case GST_FORMAT_DEFAULT: *dest_value = gst_util_uint64_scale_int (src_value, 1, bytes_per_sample); break; case GST_FORMAT_TIME: { gint byterate = bytes_per_sample * flacdec->sample_rate; *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, byterate); break; } default: res = FALSE; } break; } case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_BYTES: *dest_value = src_value * bytes_per_sample; break; case GST_FORMAT_TIME: *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, flacdec->sample_rate); break; default: res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: scale = bytes_per_sample; case GST_FORMAT_DEFAULT: *dest_value = gst_util_uint64_scale_int_round (src_value, scale * flacdec->sample_rate, GST_SECOND); break; default: res = FALSE; } break; default: res = FALSE; } return res; } static const GstQueryType * gst_flac_dec_get_src_query_types (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_CONVERT, GST_QUERY_SEEKING, 0, }; return types; } static gboolean gst_flac_dec_src_query (GstPad * pad, GstQuery * query) { GstFlacDec *flacdec; gboolean res = TRUE; GstPad *peer; flacdec = GST_FLAC_DEC (gst_pad_get_parent (pad)); peer = gst_pad_get_peer (flacdec->sinkpad); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION:{ GstFormat fmt; gint64 pos; gst_query_parse_position (query, &fmt, NULL); /* there might be a demuxer in front of us who can handle this */ if (fmt == GST_FORMAT_TIME && (res = gst_pad_query (peer, query))) break; if (fmt != GST_FORMAT_DEFAULT) { if (!gst_flac_dec_convert_src (flacdec->srcpad, GST_FORMAT_DEFAULT, flacdec->segment.last_stop, &fmt, &pos)) { GST_DEBUG_OBJECT (flacdec, "failed to convert position into %s " "format", gst_format_get_name (fmt)); res = FALSE; goto done; } } else { pos = flacdec->segment.last_stop; } gst_query_set_position (query, fmt, pos); GST_DEBUG_OBJECT (flacdec, "returning position %" G_GUINT64_FORMAT " (format: %s)", pos, gst_format_get_name (fmt)); res = TRUE; break; } case GST_QUERY_DURATION:{ GstFormat fmt; gint64 len; gst_query_parse_duration (query, &fmt, NULL); /* try any demuxers or parsers before us first */ if ((fmt == GST_FORMAT_TIME || fmt == GST_FORMAT_DEFAULT) && peer != NULL && gst_pad_query (peer, query)) { gst_query_parse_duration (query, NULL, &len); GST_DEBUG_OBJECT (flacdec, "peer returned duration %" GST_TIME_FORMAT, GST_TIME_ARGS (len)); res = TRUE; goto done; } if (flacdec->segment.duration == 0 || flacdec->segment.duration == -1) { GST_DEBUG_OBJECT (flacdec, "duration not known yet"); res = FALSE; goto done; } /* convert total number of samples to request format */ if (fmt != GST_FORMAT_DEFAULT) { if (!gst_flac_dec_convert_src (flacdec->srcpad, GST_FORMAT_DEFAULT, flacdec->segment.duration, &fmt, &len)) { GST_DEBUG_OBJECT (flacdec, "failed to convert duration into %s " "format", gst_format_get_name (fmt)); res = FALSE; goto done; } } else { len = flacdec->segment.duration; } gst_query_set_duration (query, fmt, len); GST_DEBUG_OBJECT (flacdec, "returning duration %" G_GUINT64_FORMAT " (format: %s)", len, gst_format_get_name (fmt)); res = TRUE; break; } case GST_QUERY_CONVERT:{ GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL); res = gst_flac_dec_convert_src (pad, src_fmt, src_val, &dest_fmt, &dest_val); if (res) { gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); } break; } case GST_QUERY_SEEKING:{ GstFormat fmt; gboolean seekable = FALSE; res = TRUE; /* If upstream can handle the query we're done */ seekable = gst_pad_peer_query (flacdec->sinkpad, query); if (seekable) gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL); if (seekable) goto done; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); if ((fmt != GST_FORMAT_TIME && fmt != GST_FORMAT_DEFAULT) || flacdec->streaming) { gst_query_set_seeking (query, fmt, FALSE, -1, -1); } else { gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, -1); } break; } default:{ res = gst_pad_query_default (pad, query); break; } } done: if (peer) gst_object_unref (peer); gst_object_unref (flacdec); return res; } static gboolean gst_flac_dec_handle_seek_event (GstFlacDec * flacdec, GstEvent * event) { FLAC__bool seek_ok; GstSeekFlags seek_flags; GstSeekType start_type; GstSeekType stop_type; GstSegment segment; GstFormat seek_format; gboolean only_update = FALSE; gboolean flush; gdouble rate; gint64 start, last_stop; gint64 stop; if (flacdec->streaming) { GST_DEBUG_OBJECT (flacdec, "seeking in streaming mode not implemented yet"); return FALSE; } gst_event_parse_seek (event, &rate, &seek_format, &seek_flags, &start_type, &start, &stop_type, &stop); if (seek_format != GST_FORMAT_DEFAULT && seek_format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (flacdec, "seeking is only supported in TIME or DEFAULT format"); return FALSE; } if (rate < 0.0) { GST_DEBUG_OBJECT (flacdec, "only forward playback supported, rate %f not allowed", rate); return FALSE; } if (seek_format != GST_FORMAT_DEFAULT) { GstFormat target_format = GST_FORMAT_DEFAULT; if (start_type != GST_SEEK_TYPE_NONE && !gst_flac_dec_convert_src (flacdec->srcpad, seek_format, start, &target_format, &start)) { GST_DEBUG_OBJECT (flacdec, "failed to convert start to DEFAULT format"); return FALSE; } if (stop_type != GST_SEEK_TYPE_NONE && !gst_flac_dec_convert_src (flacdec->srcpad, seek_format, stop, &target_format, &stop)) { GST_DEBUG_OBJECT (flacdec, "failed to convert stop to DEFAULT format"); return FALSE; } } /* Check if we seeked after the end of file */ if (start_type != GST_SEEK_TYPE_NONE && flacdec->segment.duration > 0 && start >= flacdec->segment.duration) { flacdec->eos = TRUE; } else { flacdec->eos = FALSE; } flush = ((seek_flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH); if (flush) { /* flushing seek, clear the pipeline of stuff, we need a newsegment after * this. */ GST_DEBUG_OBJECT (flacdec, "flushing"); gst_pad_push_event (flacdec->sinkpad, gst_event_new_flush_start ()); gst_pad_push_event (flacdec->srcpad, gst_event_new_flush_start ()); } else { /* non flushing seek, pause the task */ GST_DEBUG_OBJECT (flacdec, "stopping task"); gst_pad_stop_task (flacdec->sinkpad); } /* acquire the stream lock, this either happens when the streaming thread * stopped because of the flush or when the task is paused after the loop * function finished an iteration, which can never happen when it's blocked * downstream in PAUSED, for example */ GST_PAD_STREAM_LOCK (flacdec->sinkpad); /* start seek with clear state to avoid seeking thread pushing segments/data. * Note current state may have some pending, * e.g. multi-sink seek leads to immediate subsequent seek events */ if (flacdec->start_segment) { gst_event_unref (flacdec->start_segment); flacdec->start_segment = NULL; } gst_buffer_replace (&flacdec->pending, NULL); flacdec->pending_samples = 0; /* save a segment copy until we know the seek worked. The idea is that * when the seek fails, we want to restore with what we were doing. */ segment = flacdec->segment; /* update the segment with the seek values, last_stop will contain the new * position we should seek to */ gst_segment_set_seek (&flacdec->segment, rate, GST_FORMAT_DEFAULT, seek_flags, start_type, start, stop_type, stop, &only_update); GST_DEBUG_OBJECT (flacdec, "configured segment: [%" G_GINT64_FORMAT "-%" G_GINT64_FORMAT "] = [%" GST_TIME_FORMAT "-%" GST_TIME_FORMAT "]", flacdec->segment.start, flacdec->segment.stop, GST_TIME_ARGS (flacdec->segment.start * GST_SECOND / flacdec->sample_rate), GST_TIME_ARGS (flacdec->segment.stop * GST_SECOND / flacdec->sample_rate)); GST_DEBUG_OBJECT (flacdec, "performing seek to sample %" G_GINT64_FORMAT, flacdec->segment.last_stop); /* flush sinkpad again because we need to pull and push buffers while doing * the seek */ if (flush) { GST_DEBUG_OBJECT (flacdec, "flushing stop"); gst_pad_push_event (flacdec->sinkpad, gst_event_new_flush_stop ()); gst_pad_push_event (flacdec->srcpad, gst_event_new_flush_stop ()); } /* mark ourselves as seeking because the above lines will trigger some * callbacks that need to behave differently when seeking */ flacdec->seeking = TRUE; if (!flacdec->eos) { GST_LOG_OBJECT (flacdec, "calling seek_absolute"); seek_ok = FLAC__stream_decoder_seek_absolute (flacdec->decoder, flacdec->segment.last_stop); GST_LOG_OBJECT (flacdec, "done with seek_absolute, seek_ok=%d", seek_ok); } else { GST_LOG_OBJECT (flacdec, "not seeking, seeked after end of file"); seek_ok = TRUE; } flacdec->seeking = FALSE; GST_DEBUG_OBJECT (flacdec, "performed seek to sample %" G_GINT64_FORMAT, flacdec->segment.last_stop); if (!seek_ok) { GST_WARNING_OBJECT (flacdec, "seek failed"); /* seek failed, restore the segment and start streaming again with * the previous segment values */ flacdec->segment = segment; } else if (!flush && flacdec->running) { /* we are running the current segment and doing a non-flushing seek, * close the segment first based on the last_stop. */ GST_DEBUG_OBJECT (flacdec, "closing running segment %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, segment.start, segment.last_stop); /* convert the old segment values to time to close the old segment */ start = gst_util_uint64_scale_int (segment.start, GST_SECOND, flacdec->sample_rate); last_stop = gst_util_uint64_scale_int (segment.last_stop, GST_SECOND, flacdec->sample_rate); /* queue the segment for sending in the stream thread, start and time are * always the same. */ if (flacdec->close_segment) gst_event_unref (flacdec->close_segment); flacdec->close_segment = gst_event_new_new_segment_full (TRUE, segment.rate, segment.applied_rate, GST_FORMAT_TIME, start, last_stop, start); } if (seek_ok) { /* seek succeeded, flacdec->segment contains the new positions */ GST_DEBUG_OBJECT (flacdec, "seek successful"); } /* convert the (new) segment values to time, we will need them to generate the * new segment events. */ start = gst_util_uint64_scale_int (flacdec->segment.start, GST_SECOND, flacdec->sample_rate); last_stop = gst_util_uint64_scale_int (flacdec->segment.last_stop, GST_SECOND, flacdec->sample_rate); /* for deriving a stop position for the playback segment from the seek * segment, we must take the duration when the stop is not set */ if (flacdec->segment.stop != -1) stop = gst_util_uint64_scale_int (flacdec->segment.stop, GST_SECOND, flacdec->sample_rate); else stop = gst_util_uint64_scale_int (flacdec->segment.duration, GST_SECOND, flacdec->sample_rate); /* notify start of new segment when we were asked to do so. */ if (flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) { /* last_stop contains the position we start from */ gst_element_post_message (GST_ELEMENT (flacdec), gst_message_new_segment_start (GST_OBJECT (flacdec), GST_FORMAT_TIME, last_stop)); } /* if the seek was ok or (when it failed) we are flushing, we need to send out * a new segment. If we did not flush and the seek failed, we simply do * nothing here and continue where we were. */ if (seek_ok || flush) { GST_DEBUG_OBJECT (flacdec, "Creating newsegment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_TIME_ARGS (last_stop), GST_TIME_ARGS (stop)); /* now replace the old segment so that we send it in the stream thread the * next time it is scheduled. */ if (flacdec->start_segment) gst_event_unref (flacdec->start_segment); flacdec->start_segment = gst_event_new_new_segment_full (FALSE, flacdec->segment.rate, flacdec->segment.applied_rate, GST_FORMAT_TIME, last_stop, stop, last_stop); } /* we'll generate a discont on the next buffer */ flacdec->discont = TRUE; /* the task is running again now */ flacdec->running = TRUE; gst_pad_start_task (flacdec->sinkpad, (GstTaskFunction) gst_flac_dec_loop, flacdec->sinkpad); GST_PAD_STREAM_UNLOCK (flacdec->sinkpad); return seek_ok; } static gboolean gst_flac_dec_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstFlacDec *flacdec; flacdec = GST_FLAC_DEC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK:{ GST_DEBUG_OBJECT (flacdec, "received seek event %p", event); /* first, see if we're before a demuxer that * might handle the seek for us */ gst_event_ref (event); res = gst_pad_event_default (pad, event); /* if not, try to handle it ourselves */ if (!res) { GST_DEBUG_OBJECT (flacdec, "default failed, handling ourselves"); res = gst_flac_dec_handle_seek_event (flacdec, event); } gst_event_unref (event); break; } default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (flacdec); return res; } static gboolean gst_flac_dec_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) return gst_pad_activate_pull (sinkpad, TRUE); return gst_pad_activate_push (sinkpad, TRUE); } static gboolean gst_flac_dec_sink_activate_push (GstPad * sinkpad, gboolean active) { GstFlacDec *dec = GST_FLAC_DEC (GST_OBJECT_PARENT (sinkpad)); if (active) { gst_flac_dec_setup_decoder (dec); dec->streaming = TRUE; dec->got_headers = FALSE; } return TRUE; } static gboolean gst_flac_dec_sink_activate_pull (GstPad * sinkpad, gboolean active) { gboolean res; if (active) { GstFlacDec *flacdec; flacdec = GST_FLAC_DEC (GST_PAD_PARENT (sinkpad)); flacdec->offset = 0; gst_flac_dec_setup_decoder (flacdec); flacdec->running = TRUE; flacdec->streaming = FALSE; res = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_flac_dec_loop, sinkpad); } else { res = gst_pad_stop_task (sinkpad); } return res; } static GstStateChangeReturn gst_flac_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstFlacDec *flacdec = GST_FLAC_DEC (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: flacdec->eos = FALSE; flacdec->seeking = FALSE; flacdec->channels = 0; flacdec->depth = 0; flacdec->width = 0; flacdec->sample_rate = 0; gst_segment_init (&flacdec->segment, GST_FORMAT_DEFAULT); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_segment_init (&flacdec->segment, GST_FORMAT_UNDEFINED); gst_flac_dec_reset_decoders (flacdec); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/flac/gstflactag.c0000644000175000017500000003635411677341654016020 00000000000000/* GStreamer * Copyright (C) 2003 Christophe Fergeau * Copyright (C) 2008 Jonathan Matthew * Copyright (C) 2008 Sebastian Dröge * * gstflactag.c: plug-in for reading/modifying vorbis comments in flac files * * 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-flactag * @see_also: #flacenc, #flacdec, #GstTagSetter * * The flactag element can change the tag contained within a raw * FLAC stream. Specifically, it modifies the comments header packet * of the FLAC stream. * * Applications can set the tags to write using the #GstTagSetter interface. * Tags contained withing the FLAC bitstream will be picked up * automatically (and merged according to the merge mode set via the tag * setter interface). * * * Example pipelines * |[ * gst-launch -v filesrc location=foo.flac ! flactag ! filesink location=bar.flac * ]| This element is not useful with gst-launch, because it does not support * setting the tags on a #GstTagSetter interface. Conceptually, the element * will usually be used in this order though. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "gstflactag.h" GST_DEBUG_CATEGORY_STATIC (flactag_debug); #define GST_CAT_DEFAULT flactag_debug /* elementfactory information */ static GstStaticPadTemplate flac_tag_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-flac") ); static GstStaticPadTemplate flac_tag_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-flac") ); /* signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 /* FILL ME */ }; static void gst_flac_tag_dispose (GObject * object); static GstFlowReturn gst_flac_tag_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_flac_tag_change_state (GstElement * element, GstStateChange transition); static gboolean gst_flac_tag_sink_setcaps (GstPad * pad, GstCaps * caps); static void gst_flac_tag_setup_interfaces (GType flac_tag_type) { static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; g_type_add_interface_static (flac_tag_type, GST_TYPE_TAG_SETTER, &tag_setter_info); } GST_BOILERPLATE_FULL (GstFlacTag, gst_flac_tag, GstElement, GST_TYPE_ELEMENT, gst_flac_tag_setup_interfaces); static void gst_flac_tag_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "FLAC tagger", "Formatter/Metadata", "Rewrite tags in a FLAC file", "Christophe Fergeau "); gst_element_class_add_static_pad_template (element_class, &flac_tag_sink_template); gst_element_class_add_static_pad_template (element_class, &flac_tag_src_template); GST_DEBUG_CATEGORY_INIT (flactag_debug, "flactag", 0, "flac tag rewriter"); } static void gst_flac_tag_class_init (GstFlacTagClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; gstelement_class = (GstElementClass *) klass; gobject_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = gst_flac_tag_dispose; gstelement_class->change_state = gst_flac_tag_change_state; } static void gst_flac_tag_dispose (GObject * object) { GstFlacTag *tag = GST_FLAC_TAG (object); if (tag->adapter) { g_object_unref (tag->adapter); tag->adapter = NULL; } if (tag->vorbiscomment) { gst_buffer_unref (tag->vorbiscomment); tag->vorbiscomment = NULL; } if (tag->tags) { gst_tag_list_free (tag->tags); tag->tags = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_flac_tag_init (GstFlacTag * tag, GstFlacTagClass * klass) { /* create the sink and src pads */ tag->sinkpad = gst_pad_new_from_static_template (&flac_tag_sink_template, "sink"); gst_pad_set_chain_function (tag->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_tag_chain)); gst_pad_set_setcaps_function (tag->sinkpad, GST_DEBUG_FUNCPTR (gst_flac_tag_sink_setcaps)); gst_element_add_pad (GST_ELEMENT (tag), tag->sinkpad); tag->srcpad = gst_pad_new_from_static_template (&flac_tag_src_template, "src"); gst_element_add_pad (GST_ELEMENT (tag), tag->srcpad); tag->adapter = gst_adapter_new (); } static gboolean gst_flac_tag_sink_setcaps (GstPad * pad, GstCaps * caps) { GstFlacTag *tag = GST_FLAC_TAG (GST_PAD_PARENT (pad)); return gst_pad_set_caps (tag->srcpad, caps); } #define FLAC_MAGIC "fLaC" #define FLAC_MAGIC_SIZE (sizeof (FLAC_MAGIC) - 1) static GstFlowReturn gst_flac_tag_chain (GstPad * pad, GstBuffer * buffer) { GstFlacTag *tag; GstFlowReturn ret; ret = GST_FLOW_OK; tag = GST_FLAC_TAG (gst_pad_get_parent (pad)); gst_adapter_push (tag->adapter, buffer); /* Initial state, we don't even know if we are dealing with a flac file */ if (tag->state == GST_FLAC_TAG_STATE_INIT) { GstBuffer *id_buffer; if (gst_adapter_available (tag->adapter) < sizeof (FLAC_MAGIC)) goto cleanup; id_buffer = gst_adapter_take_buffer (tag->adapter, FLAC_MAGIC_SIZE); GST_DEBUG_OBJECT (tag, "looking for " FLAC_MAGIC " identifier"); if (memcmp (GST_BUFFER_DATA (id_buffer), FLAC_MAGIC, FLAC_MAGIC_SIZE) == 0) { GST_DEBUG_OBJECT (tag, "pushing " FLAC_MAGIC " identifier buffer"); gst_buffer_set_caps (id_buffer, GST_PAD_CAPS (tag->srcpad)); ret = gst_pad_push (tag->srcpad, id_buffer); if (ret != GST_FLOW_OK) goto cleanup; tag->state = GST_FLAC_TAG_STATE_METADATA_BLOCKS; } else { /* FIXME: does that work well with FLAC files containing ID3v2 tags ? */ gst_buffer_unref (id_buffer); GST_ELEMENT_ERROR (tag, STREAM, WRONG_TYPE, (NULL), (NULL)); ret = GST_FLOW_ERROR; } } /* The fLaC magic string has been skipped, try to detect the beginning * of a metadata block */ if (tag->state == GST_FLAC_TAG_STATE_METADATA_BLOCKS) { guint size; guint type; gboolean is_last; const guint8 *block_header; g_assert (tag->metadata_block_size == 0); g_assert (tag->metadata_last_block == FALSE); /* The header of a flac metadata block is 4 bytes long: * 1st bit: indicates whether this is the last metadata info block * 7 next bits: 4 if vorbis comment block * 24 next bits: size of the metadata to follow (big endian) */ if (gst_adapter_available (tag->adapter) < 4) goto cleanup; block_header = gst_adapter_peek (tag->adapter, 4); is_last = ((block_header[0] & 0x80) == 0x80); type = block_header[0] & 0x7F; size = (block_header[1] << 16) | (block_header[2] << 8) | block_header[3]; /* The 4 bytes long header isn't included in the metadata size */ tag->metadata_block_size = size + 4; tag->metadata_last_block = is_last; GST_DEBUG_OBJECT (tag, "got metadata block: %d bytes, type %d, is vorbiscomment: %d, is last: %d", size, type, (type == 0x04), is_last); /* Metadata blocks of type 4 are vorbis comment blocks */ if (type == 0x04) { tag->state = GST_FLAC_TAG_STATE_VC_METADATA_BLOCK; } else { tag->state = GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK; } } /* Reads a metadata block */ if ((tag->state == GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK) || (tag->state == GST_FLAC_TAG_STATE_VC_METADATA_BLOCK)) { GstBuffer *metadata_buffer; if (gst_adapter_available (tag->adapter) < tag->metadata_block_size) goto cleanup; metadata_buffer = gst_adapter_take_buffer (tag->adapter, tag->metadata_block_size); /* clear the is-last flag, as the last metadata block will * be the vorbis comment block which we will build ourselves. */ GST_BUFFER_DATA (metadata_buffer)[0] &= (~0x80); if (tag->state == GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK) { GST_DEBUG_OBJECT (tag, "pushing metadata block buffer"); gst_buffer_set_caps (metadata_buffer, GST_PAD_CAPS (tag->srcpad)); ret = gst_pad_push (tag->srcpad, metadata_buffer); if (ret != GST_FLOW_OK) goto cleanup; } else { tag->vorbiscomment = metadata_buffer; } tag->metadata_block_size = 0; tag->state = GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK; } /* This state is mainly used to be able to stop as soon as we read * a vorbiscomment block from the flac file if we are in an only output * tags mode */ if (tag->state == GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK) { /* Check if in the previous iteration we read a vorbis comment metadata * block, and stop now if the user only wants to read tags */ if (tag->vorbiscomment != NULL) { /* We found some tags, try to parse them and notify the other elements * that we encountered some tags */ GST_DEBUG_OBJECT (tag, "emitting vorbiscomment tags"); tag->tags = gst_tag_list_from_vorbiscomment_buffer (tag->vorbiscomment, GST_BUFFER_DATA (tag->vorbiscomment), 4, NULL); if (tag->tags != NULL) { gst_element_found_tags (GST_ELEMENT (tag), gst_tag_list_copy (tag->tags)); } gst_buffer_unref (tag->vorbiscomment); tag->vorbiscomment = NULL; } /* Skip to next state */ if (tag->metadata_last_block == FALSE) { tag->state = GST_FLAC_TAG_STATE_METADATA_BLOCKS; } else { tag->state = GST_FLAC_TAG_STATE_ADD_VORBIS_COMMENT; } } /* Creates a vorbis comment block from the metadata which was set * on the gstreamer element, and add it to the flac stream */ if (tag->state == GST_FLAC_TAG_STATE_ADD_VORBIS_COMMENT) { GstBuffer *buffer; gint size; const GstTagList *user_tags; GstTagList *merged_tags; /* merge the tag lists */ user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (tag)); if (user_tags != NULL) { merged_tags = gst_tag_list_merge (user_tags, tag->tags, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (tag))); } else { merged_tags = gst_tag_list_copy (tag->tags); } if (merged_tags == NULL) { /* If we get a NULL list of tags, we must generate a padding block * which is marked as the last metadata block, otherwise we'll * end up with a corrupted flac file. */ GST_WARNING_OBJECT (tag, "No tags found"); buffer = gst_buffer_new_and_alloc (12); if (buffer == NULL) { GST_ELEMENT_ERROR (tag, CORE, TOO_LAZY, (NULL), ("Error creating 12-byte buffer for padding block")); ret = GST_FLOW_ERROR; goto cleanup; } memset (GST_BUFFER_DATA (buffer), 0, GST_BUFFER_SIZE (buffer)); GST_BUFFER_DATA (buffer)[0] = 0x81; /* 0x80 = Last metadata block, * 0x01 = padding block */ } else { guchar header[4]; memset (header, 0, sizeof (header)); header[0] = 0x84; /* 0x80 = Last metadata block, * 0x04 = vorbiscomment block */ buffer = gst_tag_list_to_vorbiscomment_buffer (merged_tags, header, sizeof (header), NULL); GST_DEBUG_OBJECT (tag, "Writing tags %" GST_PTR_FORMAT, merged_tags); gst_tag_list_free (merged_tags); if (buffer == NULL) { GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), ("Error converting tag list to vorbiscomment buffer")); ret = GST_FLOW_ERROR; goto cleanup; } size = GST_BUFFER_SIZE (buffer) - 4; if ((size > 0xFFFFFF) || (size < 0)) { /* FLAC vorbis comment blocks are limited to 2^24 bytes, * while the vorbis specs allow more than that. Shouldn't * be a real world problem though */ GST_ELEMENT_ERROR (tag, CORE, TAG, (NULL), ("Vorbis comment of size %d too long", size)); ret = GST_FLOW_ERROR; goto cleanup; } /* Get rid of the framing bit at the end of the vorbiscomment buffer * if it exists since libFLAC seems to lose sync because of this * bit in gstflacdec */ if (GST_BUFFER_DATA (buffer)[GST_BUFFER_SIZE (buffer) - 1] == 1) { GstBuffer *sub; sub = gst_buffer_create_sub (buffer, 0, GST_BUFFER_SIZE (buffer) - 1); gst_buffer_unref (buffer); buffer = sub; } } /* The 4 byte metadata block header isn't accounted for in the total * size of the metadata block */ size = GST_BUFFER_SIZE (buffer) - 4; GST_BUFFER_DATA (buffer)[1] = ((size & 0xFF0000) >> 16); GST_BUFFER_DATA (buffer)[2] = ((size & 0x00FF00) >> 8); GST_BUFFER_DATA (buffer)[3] = (size & 0x0000FF); GST_DEBUG_OBJECT (tag, "pushing %d byte vorbiscomment buffer", GST_BUFFER_SIZE (buffer)); gst_buffer_set_caps (buffer, GST_PAD_CAPS (tag->srcpad)); ret = gst_pad_push (tag->srcpad, buffer); if (ret != GST_FLOW_OK) { goto cleanup; } tag->state = GST_FLAC_TAG_STATE_AUDIO_DATA; } /* The metadata blocks have been read, now we are reading audio data */ if (tag->state == GST_FLAC_TAG_STATE_AUDIO_DATA) { GstBuffer *buffer; guint avail; avail = gst_adapter_available (tag->adapter); if (avail > 0) { buffer = gst_adapter_take_buffer (tag->adapter, avail); gst_buffer_set_caps (buffer, GST_PAD_CAPS (tag->srcpad)); ret = gst_pad_push (tag->srcpad, buffer); } } cleanup: gst_object_unref (tag); return ret; } static GstStateChangeReturn gst_flac_tag_change_state (GstElement * element, GstStateChange transition) { GstFlacTag *tag; tag = GST_FLAC_TAG (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: /* do something to get out of the chain function faster */ break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_adapter_clear (tag->adapter); if (tag->vorbiscomment) { gst_buffer_unref (tag->vorbiscomment); tag->vorbiscomment = NULL; } if (tag->tags) { gst_tag_list_free (tag->tags); tag->tags = NULL; } tag->metadata_block_size = 0; tag->metadata_last_block = FALSE; tag->state = GST_FLAC_TAG_STATE_INIT; break; case GST_STATE_CHANGE_READY_TO_NULL: break; } return parent_class->change_state (element, transition); } gst-plugins-good-0.10.31/ext/flac/Makefile.am0000644000175000017500000000103511677341654015555 00000000000000plugin_LTLIBRARIES = libgstflac.la libgstflac_la_SOURCES = gstflac.c gstflacdec.c gstflacenc.c gstflactag.c libgstflac_la_CFLAGS = -DGST_USE_UNSTABLE_API \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(FLAC_CFLAGS) libgstflac_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(FLAC_LIBS) libgstflac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstflac_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstflacenc.h gstflacdec.h gstflactag.h gst-plugins-good-0.10.31/ext/flac/gstflactag.h0000644000175000017500000000445311671175352016012 00000000000000/* GStreamer * Copyright (C) 2003 Christophe Fergeau * Copyright (C) 2008 Jonathan Matthew * Copyright (C) 2008 Sebastian Dröge * * gstflactag.c: plug-in for reading/modifying vorbis comments in flac files * * 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_FLAC_TAG_H #define GST_FLAC_TAG_H #include #include #define GST_TYPE_FLAC_TAG (gst_flac_tag_get_type()) #define GST_FLAC_TAG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLAC_TAG, GstFlacTag)) #define GST_FLAC_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLAC_TAG, GstFlacTag)) #define GST_IS_FLAC_TAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLAC_TAG)) #define GST_IS_FLAC_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLAC_TAG)) typedef struct _GstFlacTag GstFlacTag; typedef struct _GstFlacTagClass GstFlacTagClass; typedef enum { GST_FLAC_TAG_STATE_INIT, GST_FLAC_TAG_STATE_METADATA_BLOCKS, GST_FLAC_TAG_STATE_METADATA_NEXT_BLOCK, GST_FLAC_TAG_STATE_WRITING_METADATA_BLOCK, GST_FLAC_TAG_STATE_VC_METADATA_BLOCK, GST_FLAC_TAG_STATE_ADD_VORBIS_COMMENT, GST_FLAC_TAG_STATE_AUDIO_DATA } GstFlacTagState; struct _GstFlacTag { GstElement element; /* < private > */ /* pads */ GstPad *sinkpad; GstPad *srcpad; GstFlacTagState state; GstAdapter *adapter; GstBuffer *vorbiscomment; GstTagList *tags; guint metadata_block_size; gboolean metadata_last_block; }; struct _GstFlacTagClass { GstElementClass parent_class; }; GType gst_flac_tag_get_type (void); #endif /* GST_FLAC_TAG_H */ gst-plugins-good-0.10.31/ext/flac/gstflac.c0000644000175000017500000000351411671175352015306 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 "gstflacenc.h" #include "gstflacdec.h" #include "gstflactag.h" #include #include static gboolean plugin_init (GstPlugin * plugin) { #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif if (!gst_element_register (plugin, "flacenc", GST_RANK_PRIMARY, GST_TYPE_FLAC_ENC)) return FALSE; if (!gst_element_register (plugin, "flacdec", GST_RANK_PRIMARY, GST_TYPE_FLAC_DEC)) return FALSE; if (!gst_element_register (plugin, "flactag", GST_RANK_PRIMARY, gst_flac_tag_get_type ())) return FALSE; gst_tag_register_musicbrainz_tags (); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "flac", "The FLAC Lossless compressor Codec", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/flac/Makefile.in0000644000175000017500000007471511720560225015567 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/flac DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstflac_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstflac_la_OBJECTS = libgstflac_la-gstflac.lo \ libgstflac_la-gstflacdec.lo libgstflac_la-gstflacenc.lo \ libgstflac_la-gstflactag.lo libgstflac_la_OBJECTS = $(am_libgstflac_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstflac_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstflac_la_CFLAGS) $(CFLAGS) \ $(libgstflac_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstflac_la_SOURCES) DIST_SOURCES = $(libgstflac_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstflac.la libgstflac_la_SOURCES = gstflac.c gstflacdec.c gstflacenc.c gstflactag.c libgstflac_la_CFLAGS = -DGST_USE_UNSTABLE_API \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(FLAC_CFLAGS) libgstflac_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(FLAC_LIBS) libgstflac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstflac_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstflacenc.h gstflacdec.h gstflactag.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/flac/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/flac/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstflac.la: $(libgstflac_la_OBJECTS) $(libgstflac_la_DEPENDENCIES) $(EXTRA_libgstflac_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstflac_la_LINK) -rpath $(plugindir) $(libgstflac_la_OBJECTS) $(libgstflac_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflacdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflacenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflac_la-gstflactag.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstflac_la-gstflac.lo: gstflac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflac.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflac.Tpo -c -o libgstflac_la-gstflac.lo `test -f 'gstflac.c' || echo '$(srcdir)/'`gstflac.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflac.Tpo $(DEPDIR)/libgstflac_la-gstflac.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflac.c' object='libgstflac_la-gstflac.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflac.lo `test -f 'gstflac.c' || echo '$(srcdir)/'`gstflac.c libgstflac_la-gstflacdec.lo: gstflacdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflacdec.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflacdec.Tpo -c -o libgstflac_la-gstflacdec.lo `test -f 'gstflacdec.c' || echo '$(srcdir)/'`gstflacdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflacdec.Tpo $(DEPDIR)/libgstflac_la-gstflacdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflacdec.c' object='libgstflac_la-gstflacdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflacdec.lo `test -f 'gstflacdec.c' || echo '$(srcdir)/'`gstflacdec.c libgstflac_la-gstflacenc.lo: gstflacenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflacenc.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflacenc.Tpo -c -o libgstflac_la-gstflacenc.lo `test -f 'gstflacenc.c' || echo '$(srcdir)/'`gstflacenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflacenc.Tpo $(DEPDIR)/libgstflac_la-gstflacenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflacenc.c' object='libgstflac_la-gstflacenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflacenc.lo `test -f 'gstflacenc.c' || echo '$(srcdir)/'`gstflacenc.c libgstflac_la-gstflactag.lo: gstflactag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -MT libgstflac_la-gstflactag.lo -MD -MP -MF $(DEPDIR)/libgstflac_la-gstflactag.Tpo -c -o libgstflac_la-gstflactag.lo `test -f 'gstflactag.c' || echo '$(srcdir)/'`gstflactag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflac_la-gstflactag.Tpo $(DEPDIR)/libgstflac_la-gstflactag.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflactag.c' object='libgstflac_la-gstflactag.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflac_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflac_la_CFLAGS) $(CFLAGS) -c -o libgstflac_la-gstflactag.lo `test -f 'gstflactag.c' || echo '$(srcdir)/'`gstflactag.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/flac/gstflacdec.h0000644000175000017500000000635611677341654016004 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_FLAC_DEC_H__ #define __GST_FLAC_DEC_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_FLAC_DEC gst_flac_dec_get_type() #define GST_FLAC_DEC(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, GST_TYPE_FLAC_DEC, GstFlacDec) #define GST_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, GST_TYPE_FLAC_DEC, GstFlacDecClass) #define GST_IS_FLAC_DEC(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, GST_TYPE_FLAC_DEC) #define GST_IS_FLAC_DEC_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, GST_TYPE_FLAC_DEC) typedef struct _GstFlacDec GstFlacDec; typedef struct _GstFlacDecClass GstFlacDecClass; struct _GstFlacDec { GstElement element; /* < private > */ FLAC__StreamDecoder *decoder; GstAdapter *adapter; gboolean framed; gboolean streaming; gboolean got_headers; /* if we've parsed the headers (unframed push mode only) */ GstPad *sinkpad; GstPad *srcpad; gboolean init; guint64 offset; /* current byte offset of input */ gboolean seeking; /* set to TRUE while seeking to make sure we * don't push any buffers in the write callback * until we are actually at the new position */ gboolean eos; /* set to TRUE if seeked after the end of file */ GstSegment segment; /* the currently configured segment, in * samples/audio frames (DEFAULT format) */ gboolean running; gboolean discont; GstBuffer *pending; /* pending buffer, produced in seek */ guint pending_samples; GstEvent *close_segment; GstEvent *start_segment; GstTagList *tags; GstFlowReturn pull_flow; /* last flow from pull_range */ /* STREAM_LOCK */ GstFlowReturn last_flow; /* the last flow return received from either * gst_pad_push or gst_pad_buffer_alloc */ gint channels; gint depth; gint width; gint sample_rate; /* from the stream info, needed for scanning */ guint16 min_blocksize; guint16 max_blocksize; gint64 cur_granulepos; /* only used in framed mode (flac-in-ogg) */ }; struct _GstFlacDecClass { GstElementClass parent_class; }; GType gst_flac_dec_get_type (void); G_END_DECLS #endif /* __GST_FLAC_DEC_H__ */ gst-plugins-good-0.10.31/ext/soup/0000755000175000017500000000000011720565322013650 500000000000000gst-plugins-good-0.10.31/ext/soup/gstsouphttpclientsink.h0000644000175000017500000000462711677341654020455 00000000000000/* GStreamer * Copyright (C) 2011 David Schleef * * 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_SOUP_HTTP_CLIENT_SINK_H_ #define _GST_SOUP_HTTP_CLIENT_SINK_H_ #include #include G_BEGIN_DECLS #define GST_TYPE_SOUP_HTTP_CLIENT_SINK (gst_soup_http_client_sink_get_type()) #define GST_SOUP_HTTP_CLIENT_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SOUP_HTTP_CLIENT_SINK,GstSoupHttpClientSink)) #define GST_SOUP_HTTP_CLIENT_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SOUP_HTTP_CLIENT_SINK,GstSoupHttpClientSinkClass)) #define GST_IS_SOUP_HTTP_CLIENT_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SOUP_HTTP_CLIENT_SINK)) #define GST_IS_SOUP_HTTP_CLIENT_SINK_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SOUP_HTTP_CLIENT_SINK)) typedef struct _GstSoupHttpClientSink GstSoupHttpClientSink; typedef struct _GstSoupHttpClientSinkClass GstSoupHttpClientSinkClass; struct _GstSoupHttpClientSink { GstBaseSink base_souphttpsink; GMutex *mutex; GCond *cond; GMainContext *context; GMainLoop *loop; GThread *thread; SoupMessage *message; SoupSession *session; GList *queued_buffers; GList *sent_buffers; GList *streamheader_buffers; int status_code; char *reason_phrase; guint64 offset; int timeout; /* properties */ SoupSession *prop_session; char *location; char *user_id; char *user_pw; SoupURI *proxy; char *proxy_id; char *proxy_pw; char *user_agent; gboolean automatic_redirect; gchar **cookies; }; struct _GstSoupHttpClientSinkClass { GstBaseSinkClass base_souphttpsink_class; }; GType gst_soup_http_client_sink_get_type (void); G_END_DECLS #endif gst-plugins-good-0.10.31/ext/soup/gstsouphttpclientsink.c0000644000175000017500000005635011677341654020450 00000000000000/* GStreamer * Copyright (C) 2011 David Schleef * * 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., 51 Franklin Street, Suite 500, * Boston, MA 02110-1335, USA. */ /** * SECTION:element-gstsouphttpclientsink * * The souphttpclientsink element sends pipeline data to an HTTP server * using HTTP PUT commands. * * * Example launch line * |[ * gst-launch -v videotestsrc num-buffers=300 ! theoraenc ! oggmux ! * souphttpclientsink location=http://server/filename.ogv * ]| * * This example encodes 10 seconds of video and sends it to the HTTP * server "server" using HTTP PUT commands. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstsouphttpclientsink.h" #include GST_DEBUG_CATEGORY_STATIC (souphttpclientsink_dbg); #define GST_CAT_DEFAULT souphttpclientsink_dbg /* prototypes */ static void gst_soup_http_client_sink_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); static void gst_soup_http_client_sink_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec); static void gst_soup_http_client_sink_dispose (GObject * object); static void gst_soup_http_client_sink_finalize (GObject * object); static gboolean gst_soup_http_client_sink_set_caps (GstBaseSink * sink, GstCaps * caps); static void gst_soup_http_client_sink_get_times (GstBaseSink * sink, GstBuffer * buffer, GstClockTime * start, GstClockTime * end); static gboolean gst_soup_http_client_sink_start (GstBaseSink * sink); static gboolean gst_soup_http_client_sink_stop (GstBaseSink * sink); static gboolean gst_soup_http_client_sink_unlock (GstBaseSink * sink); static gboolean gst_soup_http_client_sink_event (GstBaseSink * sink, GstEvent * event); static GstFlowReturn gst_soup_http_client_sink_preroll (GstBaseSink * sink, GstBuffer * buffer); static GstFlowReturn gst_soup_http_client_sink_render (GstBaseSink * sink, GstBuffer * buffer); static void free_buffer_list (GList * list); static void gst_soup_http_client_sink_reset (GstSoupHttpClientSink * souphttpsink); static void authenticate (SoupSession * session, SoupMessage * msg, SoupAuth * auth, gboolean retrying, gpointer user_data); static void callback (SoupSession * session, SoupMessage * msg, gpointer user_data); static gboolean gst_soup_http_client_sink_set_proxy (GstSoupHttpClientSink * souphttpsink, const gchar * uri); enum { PROP_0, PROP_LOCATION, PROP_USER_AGENT, PROP_AUTOMATIC_REDIRECT, PROP_PROXY, PROP_USER_ID, PROP_USER_PW, PROP_PROXY_ID, PROP_PROXY_PW, PROP_COOKIES, PROP_SESSION }; #define DEFAULT_USER_AGENT "GStreamer souphttpclientsink " /* pad templates */ static GstStaticPadTemplate gst_soup_http_client_sink_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); /* class initialization */ #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (souphttpclientsink_dbg, "souphttpclientsink", 0, \ "souphttpclientsink element"); GST_BOILERPLATE_FULL (GstSoupHttpClientSink, gst_soup_http_client_sink, GstBaseSink, GST_TYPE_BASE_SINK, DEBUG_INIT); static void gst_soup_http_client_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_soup_http_client_sink_sink_template); gst_element_class_set_details_simple (element_class, "HTTP client sink", "Generic", "Sends streams to HTTP server via PUT", "David Schleef "); } static void gst_soup_http_client_sink_class_init (GstSoupHttpClientSinkClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseSinkClass *base_sink_class = GST_BASE_SINK_CLASS (klass); gobject_class->set_property = gst_soup_http_client_sink_set_property; gobject_class->get_property = gst_soup_http_client_sink_get_property; gobject_class->dispose = gst_soup_http_client_sink_dispose; gobject_class->finalize = gst_soup_http_client_sink_finalize; base_sink_class->set_caps = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_set_caps); if (0) base_sink_class->get_times = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_get_times); base_sink_class->start = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_start); base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_stop); base_sink_class->unlock = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_unlock); base_sink_class->event = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_event); if (0) base_sink_class->preroll = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_preroll); base_sink_class->render = GST_DEBUG_FUNCPTR (gst_soup_http_client_sink_render); g_object_class_install_property (gobject_class, PROP_LOCATION, g_param_spec_string ("location", "Location", "URI to send to", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_AGENT, g_param_spec_string ("user-agent", "User-Agent", "Value of the User-Agent HTTP request header field", DEFAULT_USER_AGENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_AUTOMATIC_REDIRECT, g_param_spec_boolean ("automatic-redirect", "automatic-redirect", "Automatically follow HTTP redirects (HTTP Status Code 3xx)", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROXY, g_param_spec_string ("proxy", "Proxy", "HTTP proxy server URI", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_ID, g_param_spec_string ("user-id", "user-id", "user id for authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_PW, g_param_spec_string ("user-pw", "user-pw", "user password for authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROXY_ID, g_param_spec_string ("proxy-id", "proxy-id", "user id for proxy authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROXY_PW, g_param_spec_string ("proxy-pw", "proxy-pw", "user password for proxy authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SESSION, g_param_spec_object ("session", "session", "SoupSession object to use for communication", SOUP_TYPE_SESSION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_COOKIES, g_param_spec_boxed ("cookies", "Cookies", "HTTP request cookies", G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_soup_http_client_sink_init (GstSoupHttpClientSink * souphttpsink, GstSoupHttpClientSinkClass * souphttpsink_class) { const char *proxy; souphttpsink->mutex = g_mutex_new (); souphttpsink->cond = g_cond_new (); souphttpsink->location = NULL; souphttpsink->automatic_redirect = TRUE; souphttpsink->user_agent = g_strdup (DEFAULT_USER_AGENT); souphttpsink->user_id = NULL; souphttpsink->user_pw = NULL; souphttpsink->proxy_id = NULL; souphttpsink->proxy_pw = NULL; souphttpsink->prop_session = NULL; souphttpsink->timeout = 1; proxy = g_getenv ("http_proxy"); if (proxy && !gst_soup_http_client_sink_set_proxy (souphttpsink, proxy)) { GST_WARNING_OBJECT (souphttpsink, "The proxy in the http_proxy env var (\"%s\") cannot be parsed.", proxy); } gst_soup_http_client_sink_reset (souphttpsink); } static void gst_soup_http_client_sink_reset (GstSoupHttpClientSink * souphttpsink) { g_free (souphttpsink->reason_phrase); souphttpsink->reason_phrase = NULL; souphttpsink->status_code = 0; souphttpsink->offset = 0; } static gboolean gst_soup_http_client_sink_set_proxy (GstSoupHttpClientSink * souphttpsink, const gchar * uri) { if (souphttpsink->proxy) { soup_uri_free (souphttpsink->proxy); souphttpsink->proxy = NULL; } if (g_str_has_prefix (uri, "http://")) { souphttpsink->proxy = soup_uri_new (uri); } else { gchar *new_uri = g_strconcat ("http://", uri, NULL); souphttpsink->proxy = soup_uri_new (new_uri); g_free (new_uri); } return TRUE; } void gst_soup_http_client_sink_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); g_mutex_lock (souphttpsink->mutex); switch (property_id) { case PROP_SESSION: if (souphttpsink->prop_session) { g_object_unref (souphttpsink->prop_session); } souphttpsink->prop_session = g_value_dup_object (value); break; case PROP_LOCATION: g_free (souphttpsink->location); souphttpsink->location = g_value_dup_string (value); souphttpsink->offset = 0; break; case PROP_USER_AGENT: g_free (souphttpsink->user_agent); souphttpsink->user_agent = g_value_dup_string (value); break; case PROP_AUTOMATIC_REDIRECT: souphttpsink->automatic_redirect = g_value_get_boolean (value); break; case PROP_USER_ID: g_free (souphttpsink->user_id); souphttpsink->user_id = g_value_dup_string (value); break; case PROP_USER_PW: g_free (souphttpsink->user_pw); souphttpsink->user_pw = g_value_dup_string (value); break; case PROP_PROXY_ID: g_free (souphttpsink->proxy_id); souphttpsink->proxy_id = g_value_dup_string (value); break; case PROP_PROXY_PW: g_free (souphttpsink->proxy_pw); souphttpsink->proxy_pw = g_value_dup_string (value); break; case PROP_PROXY: { const gchar *proxy; proxy = g_value_get_string (value); if (proxy == NULL) { GST_WARNING ("proxy property cannot be NULL"); goto done; } if (!gst_soup_http_client_sink_set_proxy (souphttpsink, proxy)) { GST_WARNING ("badly formatted proxy URI"); goto done; } break; } case PROP_COOKIES: g_strfreev (souphttpsink->cookies); souphttpsink->cookies = g_strdupv (g_value_get_boxed (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } done: g_mutex_unlock (souphttpsink->mutex); } void gst_soup_http_client_sink_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); switch (property_id) { case PROP_SESSION: g_value_set_object (value, souphttpsink->prop_session); break; case PROP_LOCATION: g_value_set_string (value, souphttpsink->location); break; case PROP_AUTOMATIC_REDIRECT: g_value_set_boolean (value, souphttpsink->automatic_redirect); break; case PROP_USER_AGENT: g_value_set_string (value, souphttpsink->user_agent); break; case PROP_USER_ID: g_value_set_string (value, souphttpsink->user_id); break; case PROP_USER_PW: g_value_set_string (value, souphttpsink->user_pw); break; case PROP_PROXY_ID: g_value_set_string (value, souphttpsink->proxy_id); break; case PROP_PROXY_PW: g_value_set_string (value, souphttpsink->proxy_pw); break; case PROP_PROXY: if (souphttpsink->proxy == NULL) g_value_set_static_string (value, ""); else { char *proxy = soup_uri_to_string (souphttpsink->proxy, FALSE); g_value_set_string (value, proxy); g_free (proxy); } break; case PROP_COOKIES: g_value_set_boxed (value, g_strdupv (souphttpsink->cookies)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } void gst_soup_http_client_sink_dispose (GObject * object) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); /* clean up as possible. may be called multiple times */ if (souphttpsink->prop_session) g_object_unref (souphttpsink->prop_session); souphttpsink->prop_session = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } void gst_soup_http_client_sink_finalize (GObject * object) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (object); /* clean up object here */ g_free (souphttpsink->user_agent); g_free (souphttpsink->user_id); g_free (souphttpsink->user_pw); g_free (souphttpsink->proxy_id); g_free (souphttpsink->proxy_pw); if (souphttpsink->proxy) soup_uri_free (souphttpsink->proxy); g_free (souphttpsink->location); g_cond_free (souphttpsink->cond); g_mutex_free (souphttpsink->mutex); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_soup_http_client_sink_set_caps (GstBaseSink * sink, GstCaps * caps) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); GstStructure *structure; const GValue *value_array; int i, n; structure = gst_caps_get_structure (caps, 0); value_array = gst_structure_get_value (structure, "streamheader"); if (value_array) { free_buffer_list (souphttpsink->streamheader_buffers); souphttpsink->streamheader_buffers = NULL; n = gst_value_array_get_size (value_array); for (i = 0; i < n; i++) { const GValue *value; GstBuffer *buffer; value = gst_value_array_get_value (value_array, i); buffer = GST_BUFFER (gst_value_get_buffer (value)); souphttpsink->streamheader_buffers = g_list_append (souphttpsink->streamheader_buffers, gst_buffer_ref (buffer)); } } return TRUE; } static void gst_soup_http_client_sink_get_times (GstBaseSink * sink, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { } static gboolean thread_ready_idle_cb (gpointer data) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (data); GST_LOG_OBJECT (souphttpsink, "thread ready"); g_mutex_lock (souphttpsink->mutex); g_cond_signal (souphttpsink->cond); g_mutex_unlock (souphttpsink->mutex); return FALSE; /* only run once */ } static gpointer thread_func (gpointer ptr) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (ptr); GST_DEBUG ("thread start"); g_main_loop_run (souphttpsink->loop); GST_DEBUG ("thread quit"); return NULL; } static gboolean gst_soup_http_client_sink_start (GstBaseSink * sink) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); if (souphttpsink->prop_session) { souphttpsink->session = souphttpsink->prop_session; } else { GSource *source; GError *error = NULL; souphttpsink->context = g_main_context_new (); /* set up idle source to signal when the main loop is running and * it's safe for ::stop() to call g_main_loop_quit() */ source = g_idle_source_new (); g_source_set_callback (source, thread_ready_idle_cb, sink, NULL); g_source_attach (source, souphttpsink->context); g_source_unref (source); souphttpsink->loop = g_main_loop_new (souphttpsink->context, TRUE); g_mutex_lock (souphttpsink->mutex); /* FIXME: error handling */ #if !GLIB_CHECK_VERSION (2, 31, 0) souphttpsink->thread = g_thread_create (thread_func, souphttpsink, TRUE, &error); #else souphttpsink->thread = g_thread_try_new ("souphttpclientsink-thread", thread_func, souphttpsink, &error); #endif GST_LOG_OBJECT (souphttpsink, "waiting for main loop thread to start up"); g_cond_wait (souphttpsink->cond, souphttpsink->mutex); g_mutex_unlock (souphttpsink->mutex); GST_LOG_OBJECT (souphttpsink, "main loop thread running"); souphttpsink->session = soup_session_async_new_with_options (SOUP_SESSION_ASYNC_CONTEXT, souphttpsink->context, SOUP_SESSION_USER_AGENT, souphttpsink->user_agent, SOUP_SESSION_TIMEOUT, souphttpsink->timeout, NULL); //soup_session_add_feature (souphttpsink->session, // SOUP_SESSION_FEATURE (soup_logger_new (SOUP_LOGGER_LOG_BODY, 100))); g_signal_connect (souphttpsink->session, "authenticate", G_CALLBACK (authenticate), souphttpsink); } return TRUE; } static gboolean gst_soup_http_client_sink_stop (GstBaseSink * sink) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); GST_DEBUG ("stop"); if (souphttpsink->prop_session == NULL) { soup_session_abort (souphttpsink->session); g_object_unref (souphttpsink->session); } if (souphttpsink->loop) { g_main_loop_quit (souphttpsink->loop); g_thread_join (souphttpsink->thread); g_main_loop_unref (souphttpsink->loop); souphttpsink->loop = NULL; } if (souphttpsink->context) { g_main_context_unref (souphttpsink->context); souphttpsink->context = NULL; } gst_soup_http_client_sink_reset (souphttpsink); return TRUE; } static gboolean gst_soup_http_client_sink_unlock (GstBaseSink * sink) { GST_DEBUG ("unlock"); return TRUE; } static gboolean gst_soup_http_client_sink_event (GstBaseSink * sink, GstEvent * event) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); GST_DEBUG_OBJECT (souphttpsink, "event"); if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { GST_DEBUG_OBJECT (souphttpsink, "got eos"); g_mutex_lock (souphttpsink->mutex); while (souphttpsink->message) { GST_DEBUG_OBJECT (souphttpsink, "waiting"); g_cond_wait (souphttpsink->cond, souphttpsink->mutex); } g_mutex_unlock (souphttpsink->mutex); GST_DEBUG_OBJECT (souphttpsink, "finished eos"); } return TRUE; } static GstFlowReturn gst_soup_http_client_sink_preroll (GstBaseSink * sink, GstBuffer * buffer) { GST_DEBUG ("preroll"); return GST_FLOW_OK; } static void free_buffer_list (GList * list) { GList *g; for (g = list; g; g = g_list_next (g)) { GstBuffer *buffer = g->data; gst_buffer_unref (buffer); } g_list_free (list); } static void send_message_locked (GstSoupHttpClientSink * souphttpsink) { GList *g; guint64 n; if (souphttpsink->queued_buffers == NULL || souphttpsink->message) { return; } /* If the URI went away, drop all these buffers */ if (souphttpsink->location == NULL) { free_buffer_list (souphttpsink->queued_buffers); souphttpsink->queued_buffers = NULL; return; } souphttpsink->message = soup_message_new ("PUT", souphttpsink->location); n = 0; if (souphttpsink->offset == 0) { for (g = souphttpsink->streamheader_buffers; g; g = g_list_next (g)) { GstBuffer *buffer = g->data; soup_message_body_append (souphttpsink->message->request_body, SOUP_MEMORY_STATIC, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); n += GST_BUFFER_SIZE (buffer); } } for (g = souphttpsink->queued_buffers; g; g = g_list_next (g)) { GstBuffer *buffer = g->data; if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_IN_CAPS)) { soup_message_body_append (souphttpsink->message->request_body, SOUP_MEMORY_STATIC, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); n += GST_BUFFER_SIZE (buffer); } } if (souphttpsink->offset != 0) { char *s; s = g_strdup_printf ("bytes %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "/*", souphttpsink->offset, souphttpsink->offset + n - 1); soup_message_headers_append (souphttpsink->message->request_headers, "Content-Range", s); g_free (s); } if (n == 0) { free_buffer_list (souphttpsink->queued_buffers); souphttpsink->queued_buffers = NULL; g_object_unref (souphttpsink->message); souphttpsink->message = NULL; return; } souphttpsink->sent_buffers = souphttpsink->queued_buffers; souphttpsink->queued_buffers = NULL; GST_DEBUG_OBJECT (souphttpsink, "queue message %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT, souphttpsink->offset, n); soup_session_queue_message (souphttpsink->session, souphttpsink->message, callback, souphttpsink); souphttpsink->offset += n; } static gboolean send_message (GstSoupHttpClientSink * souphttpsink) { g_mutex_lock (souphttpsink->mutex); send_message_locked (souphttpsink); g_mutex_unlock (souphttpsink->mutex); return FALSE; } static void callback (SoupSession * session, SoupMessage * msg, gpointer user_data) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (user_data); GST_DEBUG_OBJECT (souphttpsink, "callback status=%d %s", msg->status_code, msg->reason_phrase); g_mutex_lock (souphttpsink->mutex); g_cond_signal (souphttpsink->cond); souphttpsink->message = NULL; if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { souphttpsink->status_code = msg->status_code; souphttpsink->reason_phrase = g_strdup (msg->reason_phrase); g_mutex_unlock (souphttpsink->mutex); return; } free_buffer_list (souphttpsink->sent_buffers); souphttpsink->sent_buffers = NULL; send_message_locked (souphttpsink); g_mutex_unlock (souphttpsink->mutex); } static GstFlowReturn gst_soup_http_client_sink_render (GstBaseSink * sink, GstBuffer * buffer) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (sink); GSource *source; gboolean wake; if (souphttpsink->status_code != 0) { /* FIXME we should allow a moderate amount of retries. */ GST_ELEMENT_ERROR (souphttpsink, RESOURCE, WRITE, ("Could not write to HTTP URI"), ("error: %d %s", souphttpsink->status_code, souphttpsink->reason_phrase)); return GST_FLOW_ERROR; } g_mutex_lock (souphttpsink->mutex); if (souphttpsink->location != NULL) { wake = (souphttpsink->queued_buffers == NULL); souphttpsink->queued_buffers = g_list_append (souphttpsink->queued_buffers, gst_buffer_ref (buffer)); if (wake) { source = g_idle_source_new (); g_source_set_callback (source, (GSourceFunc) (send_message), souphttpsink, NULL); g_source_attach (source, souphttpsink->context); g_source_unref (source); } } g_mutex_unlock (souphttpsink->mutex); return GST_FLOW_OK; } static void authenticate (SoupSession * session, SoupMessage * msg, SoupAuth * auth, gboolean retrying, gpointer user_data) { GstSoupHttpClientSink *souphttpsink = GST_SOUP_HTTP_CLIENT_SINK (user_data); if (!retrying) { if (souphttpsink->user_id && souphttpsink->user_pw) { soup_auth_authenticate (auth, souphttpsink->user_id, souphttpsink->user_pw); } } } gst-plugins-good-0.10.31/ext/soup/Makefile.am0000644000175000017500000000100011677341654015626 00000000000000plugin_LTLIBRARIES = libgstsouphttpsrc.la libgstsouphttpsrc_la_SOURCES = gstsouphttpsrc.c gstsouphttpclientsink.c gstsoup.c libgstsouphttpsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SOUP_CFLAGS) libgstsouphttpsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(SOUP_LIBS) libgstsouphttpsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsouphttpsrc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstsouphttpsrc.h gstsouphttpclientsink.h gst-plugins-good-0.10.31/ext/soup/gstsouphttpsrc.c0000644000175000017500000013532611677341654017075 00000000000000/* GStreamer * Copyright (C) 2007-2008 Wouter Cloetens * * 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 */ /** * SECTION:element-souphttpsrc * * This plugin reads data from a remote location specified by a URI. * Supported protocols are 'http', 'https'. * * An HTTP proxy must be specified by its URL. * If the "http_proxy" environment variable is set, its value is used. * If built with libsoup's GNOME integration features, the GNOME proxy * configuration will be used, or failing that, proxy autodetection. * The #GstSoupHTTPSrc:proxy property can be used to override the default. * * In case the #GstSoupHTTPSrc:iradio-mode property is set and the location is * an HTTP resource, souphttpsrc will send special Icecast HTTP headers to the * server to request additional Icecast meta-information. * If the server is not an Icecast server, it will behave as if the * #GstSoupHTTPSrc:iradio-mode property were not set. If it is, souphttpsrc will * output data with a media type of application/x-icy, in which case you will * need to use the #ICYDemux element as follow-up element to extract the Icecast * metadata and to determine the underlying media type. * * * Example launch line * |[ * gst-launch -v souphttpsrc location=https://some.server.org/index.html * ! filesink location=/home/joe/server.html * ]| The above pipeline reads a web page from a server using the HTTPS protocol * and writes it to a local file. * |[ * gst-launch -v souphttpsrc user-agent="FooPlayer 0.99 beta" * automatic-redirect=false proxy=http://proxy.intranet.local:8080 * location=http://music.foobar.com/demo.mp3 ! mad ! audioconvert * ! audioresample ! alsasink * ]| The above pipeline will read and decode and play an mp3 file from a * web server using the HTTP protocol. If the server sends redirects, * the request fails instead of following the redirect. The specified * HTTP proxy server is used. The User-Agent HTTP request header * is set to a custom string instead of "GStreamer souphttpsrc." * |[ * gst-launch -v souphttpsrc location=http://10.11.12.13/mjpeg * do-timestamp=true ! multipartdemux * ! image/jpeg,width=640,height=480 ! matroskamux * ! filesink location=mjpeg.mkv * ]| The above pipeline reads a motion JPEG stream from an IP camera * using the HTTP protocol, encoded as mime/multipart image/jpeg * parts, and writes a Matroska motion JPEG file. The width and * height properties are set in the caps to provide the Matroska * multiplexer with the information to set this in the header. * Timestamps are set on the buffers as they arrive from the camera. * These are used by the mime/multipart demultiplexer to emit timestamps * on the JPEG-encoded video frame buffers. This allows the Matroska * multiplexer to timestamp the frames in the resulting file. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef HAVE_STDLIB_H #include /* atoi() */ #endif #include #include #ifdef HAVE_LIBSOUP_GNOME #include #else #include #endif #include "gstsouphttpsrc.h" #include GST_DEBUG_CATEGORY_STATIC (souphttpsrc_debug); #define GST_CAT_DEFAULT souphttpsrc_debug static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); enum { PROP_0, PROP_LOCATION, PROP_IS_LIVE, PROP_USER_AGENT, PROP_AUTOMATIC_REDIRECT, PROP_PROXY, PROP_USER_ID, PROP_USER_PW, PROP_PROXY_ID, PROP_PROXY_PW, PROP_COOKIES, PROP_IRADIO_MODE, PROP_IRADIO_NAME, PROP_IRADIO_GENRE, PROP_IRADIO_URL, PROP_IRADIO_TITLE, PROP_TIMEOUT, PROP_EXTRA_HEADERS }; #define DEFAULT_USER_AGENT "GStreamer souphttpsrc " static void gst_soup_http_src_uri_handler_init (gpointer g_iface, gpointer iface_data); static void gst_soup_http_src_finalize (GObject * gobject); static void gst_soup_http_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_soup_http_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_soup_http_src_create (GstPushSrc * psrc, GstBuffer ** outbuf); static gboolean gst_soup_http_src_start (GstBaseSrc * bsrc); static gboolean gst_soup_http_src_stop (GstBaseSrc * bsrc); static gboolean gst_soup_http_src_get_size (GstBaseSrc * bsrc, guint64 * size); static gboolean gst_soup_http_src_is_seekable (GstBaseSrc * bsrc); static gboolean gst_soup_http_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment); static gboolean gst_soup_http_src_query (GstBaseSrc * bsrc, GstQuery * query); static gboolean gst_soup_http_src_unlock (GstBaseSrc * bsrc); static gboolean gst_soup_http_src_unlock_stop (GstBaseSrc * bsrc); static gboolean gst_soup_http_src_set_location (GstSoupHTTPSrc * src, const gchar * uri); static gboolean gst_soup_http_src_set_proxy (GstSoupHTTPSrc * src, const gchar * uri); static char *gst_soup_http_src_unicodify (const char *str); static gboolean gst_soup_http_src_build_message (GstSoupHTTPSrc * src); static void gst_soup_http_src_cancel_message (GstSoupHTTPSrc * src); static void gst_soup_http_src_queue_message (GstSoupHTTPSrc * src); static gboolean gst_soup_http_src_add_range_header (GstSoupHTTPSrc * src, guint64 offset); static void gst_soup_http_src_session_unpause_message (GstSoupHTTPSrc * src); static void gst_soup_http_src_session_pause_message (GstSoupHTTPSrc * src); static void gst_soup_http_src_session_close (GstSoupHTTPSrc * src); static void gst_soup_http_src_parse_status (SoupMessage * msg, GstSoupHTTPSrc * src); static void gst_soup_http_src_chunk_free (gpointer gstbuf); static SoupBuffer *gst_soup_http_src_chunk_allocator (SoupMessage * msg, gsize max_len, gpointer user_data); static void gst_soup_http_src_got_chunk_cb (SoupMessage * msg, SoupBuffer * chunk, GstSoupHTTPSrc * src); static void gst_soup_http_src_response_cb (SoupSession * session, SoupMessage * msg, GstSoupHTTPSrc * src); static void gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src); static void gst_soup_http_src_got_body_cb (SoupMessage * msg, GstSoupHTTPSrc * src); static void gst_soup_http_src_finished_cb (SoupMessage * msg, GstSoupHTTPSrc * src); static void gst_soup_http_src_authenticate_cb (SoupSession * session, SoupMessage * msg, SoupAuth * auth, gboolean retrying, GstSoupHTTPSrc * src); static void _do_init (GType type) { static const GInterfaceInfo urihandler_info = { gst_soup_http_src_uri_handler_init, NULL, NULL }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); GST_DEBUG_CATEGORY_INIT (souphttpsrc_debug, "souphttpsrc", 0, "SOUP HTTP src"); } GST_BOILERPLATE_FULL (GstSoupHTTPSrc, gst_soup_http_src, GstPushSrc, GST_TYPE_PUSH_SRC, _do_init); static void gst_soup_http_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &srctemplate); gst_element_class_set_details_simple (element_class, "HTTP client source", "Source/Network", "Receive data as a client over the network via HTTP using SOUP", "Wouter Cloetens "); } static void gst_soup_http_src_class_init (GstSoupHTTPSrcClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; GstPushSrcClass *gstpushsrc_class; gobject_class = (GObjectClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstpushsrc_class = (GstPushSrcClass *) klass; gobject_class->set_property = gst_soup_http_src_set_property; gobject_class->get_property = gst_soup_http_src_get_property; gobject_class->finalize = gst_soup_http_src_finalize; g_object_class_install_property (gobject_class, PROP_LOCATION, g_param_spec_string ("location", "Location", "Location to read from", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_AGENT, g_param_spec_string ("user-agent", "User-Agent", "Value of the User-Agent HTTP request header field", DEFAULT_USER_AGENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_AUTOMATIC_REDIRECT, g_param_spec_boolean ("automatic-redirect", "automatic-redirect", "Automatically follow HTTP redirects (HTTP Status Code 3xx)", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROXY, g_param_spec_string ("proxy", "Proxy", "HTTP proxy server URI", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_ID, g_param_spec_string ("user-id", "user-id", "HTTP location URI user id for authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_PW, g_param_spec_string ("user-pw", "user-pw", "HTTP location URI user password for authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROXY_ID, g_param_spec_string ("proxy-id", "proxy-id", "HTTP proxy URI user id for authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROXY_PW, g_param_spec_string ("proxy-pw", "proxy-pw", "HTTP proxy URI user password for authentication", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_COOKIES, g_param_spec_boxed ("cookies", "Cookies", "HTTP request cookies", G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IS_LIVE, g_param_spec_boolean ("is-live", "is-live", "Act like a live source", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TIMEOUT, g_param_spec_uint ("timeout", "timeout", "Value in seconds to timeout a blocking I/O (0 = No timeout).", 0, 3600, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_EXTRA_HEADERS, g_param_spec_boxed ("extra-headers", "Extra Headers", "Extra headers to append to the HTTP request", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* icecast stuff */ g_object_class_install_property (gobject_class, PROP_IRADIO_MODE, g_param_spec_boolean ("iradio-mode", "iradio-mode", "Enable internet radio mode (extraction of shoutcast/icecast metadata)", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IRADIO_NAME, g_param_spec_string ("iradio-name", "iradio-name", "Name of the stream", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IRADIO_GENRE, g_param_spec_string ("iradio-genre", "iradio-genre", "Genre of the stream", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IRADIO_URL, g_param_spec_string ("iradio-url", "iradio-url", "Homepage URL for radio stream", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IRADIO_TITLE, g_param_spec_string ("iradio-title", "iradio-title", "Name of currently playing song", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_soup_http_src_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_soup_http_src_stop); gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_soup_http_src_unlock); gstbasesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_soup_http_src_unlock_stop); gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_soup_http_src_get_size); gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_soup_http_src_is_seekable); gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_soup_http_src_do_seek); gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_soup_http_src_query); gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_soup_http_src_create); } static void gst_soup_http_src_reset (GstSoupHTTPSrc * src) { src->interrupted = FALSE; src->retry = FALSE; src->have_size = FALSE; src->seekable = FALSE; src->read_position = 0; src->request_position = 0; src->content_size = 0; gst_caps_replace (&src->src_caps, NULL); g_free (src->iradio_name); src->iradio_name = NULL; g_free (src->iradio_genre); src->iradio_genre = NULL; g_free (src->iradio_url); src->iradio_url = NULL; g_free (src->iradio_title); src->iradio_title = NULL; } static void gst_soup_http_src_init (GstSoupHTTPSrc * src, GstSoupHTTPSrcClass * g_class) { const gchar *proxy; src->location = NULL; src->automatic_redirect = TRUE; src->user_agent = g_strdup (DEFAULT_USER_AGENT); src->user_id = NULL; src->user_pw = NULL; src->proxy_id = NULL; src->proxy_pw = NULL; src->cookies = NULL; src->iradio_mode = FALSE; src->loop = NULL; src->context = NULL; src->session = NULL; src->msg = NULL; proxy = g_getenv ("http_proxy"); if (proxy && !gst_soup_http_src_set_proxy (src, proxy)) { GST_WARNING_OBJECT (src, "The proxy in the http_proxy env var (\"%s\") cannot be parsed.", proxy); } gst_soup_http_src_reset (src); } static void gst_soup_http_src_finalize (GObject * gobject) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (gobject); GST_DEBUG_OBJECT (src, "finalize"); g_free (src->location); g_free (src->user_agent); if (src->proxy != NULL) { soup_uri_free (src->proxy); } g_free (src->user_id); g_free (src->user_pw); g_free (src->proxy_id); g_free (src->proxy_pw); g_strfreev (src->cookies); G_OBJECT_CLASS (parent_class)->finalize (gobject); } static void gst_soup_http_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (object); switch (prop_id) { case PROP_LOCATION: { const gchar *location; location = g_value_get_string (value); if (location == NULL) { GST_WARNING ("location property cannot be NULL"); goto done; } if (!gst_soup_http_src_set_location (src, location)) { GST_WARNING ("badly formatted location"); goto done; } break; } case PROP_USER_AGENT: if (src->user_agent) g_free (src->user_agent); src->user_agent = g_value_dup_string (value); break; case PROP_IRADIO_MODE: src->iradio_mode = g_value_get_boolean (value); break; case PROP_AUTOMATIC_REDIRECT: src->automatic_redirect = g_value_get_boolean (value); break; case PROP_PROXY: { const gchar *proxy; proxy = g_value_get_string (value); if (proxy == NULL) { GST_WARNING ("proxy property cannot be NULL"); goto done; } if (!gst_soup_http_src_set_proxy (src, proxy)) { GST_WARNING ("badly formatted proxy URI"); goto done; } break; } case PROP_COOKIES: g_strfreev (src->cookies); src->cookies = g_strdupv (g_value_get_boxed (value)); break; case PROP_IS_LIVE: gst_base_src_set_live (GST_BASE_SRC (src), g_value_get_boolean (value)); break; case PROP_USER_ID: if (src->user_id) g_free (src->user_id); src->user_id = g_value_dup_string (value); break; case PROP_USER_PW: if (src->user_pw) g_free (src->user_pw); src->user_pw = g_value_dup_string (value); break; case PROP_PROXY_ID: if (src->proxy_id) g_free (src->proxy_id); src->proxy_id = g_value_dup_string (value); break; case PROP_PROXY_PW: if (src->proxy_pw) g_free (src->proxy_pw); src->proxy_pw = g_value_dup_string (value); break; case PROP_TIMEOUT: src->timeout = g_value_get_uint (value); break; case PROP_EXTRA_HEADERS:{ const GstStructure *s = gst_value_get_structure (value); if (src->extra_headers) gst_structure_free (src->extra_headers); src->extra_headers = s ? gst_structure_copy (s) : NULL; break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } done: return; } static void gst_soup_http_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (object); switch (prop_id) { case PROP_LOCATION: g_value_set_string (value, src->location); break; case PROP_USER_AGENT: g_value_set_string (value, src->user_agent); break; case PROP_AUTOMATIC_REDIRECT: g_value_set_boolean (value, src->automatic_redirect); break; case PROP_PROXY: if (src->proxy == NULL) g_value_set_static_string (value, ""); else { char *proxy = soup_uri_to_string (src->proxy, FALSE); g_value_set_string (value, proxy); g_free (proxy); } break; case PROP_COOKIES: g_value_set_boxed (value, g_strdupv (src->cookies)); break; case PROP_IS_LIVE: g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (src))); break; case PROP_IRADIO_MODE: g_value_set_boolean (value, src->iradio_mode); break; case PROP_IRADIO_NAME: g_value_set_string (value, src->iradio_name); break; case PROP_IRADIO_GENRE: g_value_set_string (value, src->iradio_genre); break; case PROP_IRADIO_URL: g_value_set_string (value, src->iradio_url); break; case PROP_IRADIO_TITLE: g_value_set_string (value, src->iradio_title); break; case PROP_USER_ID: g_value_set_string (value, src->user_id); break; case PROP_USER_PW: g_value_set_string (value, src->user_pw); break; case PROP_PROXY_ID: g_value_set_string (value, src->proxy_id); break; case PROP_PROXY_PW: g_value_set_string (value, src->proxy_pw); break; case PROP_TIMEOUT: g_value_set_uint (value, src->timeout); break; case PROP_EXTRA_HEADERS: gst_value_set_structure (value, src->extra_headers); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gchar * gst_soup_http_src_unicodify (const gchar * str) { const gchar *env_vars[] = { "GST_ICY_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; return gst_tag_freeform_string_to_utf8 (str, -1, env_vars); } static void gst_soup_http_src_cancel_message (GstSoupHTTPSrc * src) { if (src->msg != NULL) { src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED; soup_session_cancel_message (src->session, src->msg, SOUP_STATUS_CANCELLED); } src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE; src->msg = NULL; } static void gst_soup_http_src_queue_message (GstSoupHTTPSrc * src) { soup_session_queue_message (src->session, src->msg, (SoupSessionCallback) gst_soup_http_src_response_cb, src); src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED; } static gboolean gst_soup_http_src_add_range_header (GstSoupHTTPSrc * src, guint64 offset) { gchar buf[64]; gint rc; soup_message_headers_remove (src->msg->request_headers, "Range"); if (offset) { rc = g_snprintf (buf, sizeof (buf), "bytes=%" G_GUINT64_FORMAT "-", offset); if (rc > sizeof (buf) || rc < 0) return FALSE; soup_message_headers_append (src->msg->request_headers, "Range", buf); } src->read_position = offset; return TRUE; } static gboolean _append_extra_header (GQuark field_id, const GValue * value, gpointer user_data) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (user_data); const gchar *field_name = g_quark_to_string (field_id); gchar *field_content = NULL; if (G_VALUE_TYPE (value) == G_TYPE_STRING) { field_content = g_value_dup_string (value); } else { GValue dest = { 0, }; g_value_init (&dest, G_TYPE_STRING); if (g_value_transform (value, &dest)) { field_content = g_value_dup_string (&dest); } } if (field_content == NULL) { GST_ERROR_OBJECT (src, "extra-headers field '%s' contains no value " "or can't be converted to a string", field_name); return FALSE; } GST_DEBUG_OBJECT (src, "Appending extra header: \"%s: %s\"", field_name, field_content); soup_message_headers_append (src->msg->request_headers, field_name, field_content); g_free (field_content); return TRUE; } static gboolean _append_extra_headers (GQuark field_id, const GValue * value, gpointer user_data) { if (G_VALUE_TYPE (value) == GST_TYPE_ARRAY) { guint n = gst_value_array_get_size (value); guint i; for (i = 0; i < n; i++) { const GValue *v = gst_value_array_get_value (value, i); if (!_append_extra_header (field_id, v, user_data)) return FALSE; } } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) { guint n = gst_value_list_get_size (value); guint i; for (i = 0; i < n; i++) { const GValue *v = gst_value_list_get_value (value, i); if (!_append_extra_header (field_id, v, user_data)) return FALSE; } } else { return _append_extra_header (field_id, value, user_data); } return TRUE; } static gboolean gst_soup_http_src_add_extra_headers (GstSoupHTTPSrc * src) { if (!src->extra_headers) return TRUE; return gst_structure_foreach (src->extra_headers, _append_extra_headers, src); } static void gst_soup_http_src_session_unpause_message (GstSoupHTTPSrc * src) { soup_session_unpause_message (src->session, src->msg); } static void gst_soup_http_src_session_pause_message (GstSoupHTTPSrc * src) { soup_session_pause_message (src->session, src->msg); } static void gst_soup_http_src_session_close (GstSoupHTTPSrc * src) { if (src->session) { soup_session_abort (src->session); /* This unrefs the message. */ g_object_unref (src->session); src->session = NULL; src->msg = NULL; } } static void gst_soup_http_src_authenticate_cb (SoupSession * session, SoupMessage * msg, SoupAuth * auth, gboolean retrying, GstSoupHTTPSrc * src) { if (!retrying) { /* First time authentication only, if we fail and are called again with retry true fall through */ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) { if (src->user_id && src->user_pw) soup_auth_authenticate (auth, src->user_id, src->user_pw); } else if (msg->status_code == SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED) { if (src->proxy_id && src->proxy_pw) soup_auth_authenticate (auth, src->proxy_id, src->proxy_pw); } } } static void gst_soup_http_src_headers_foreach (const gchar * name, const gchar * val, gpointer src) { GST_DEBUG_OBJECT (src, " %s: %s", name, val); } static void gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src) { const char *value; GstTagList *tag_list; GstBaseSrc *basesrc; guint64 newsize; GHashTable *params = NULL; GST_DEBUG_OBJECT (src, "got headers:"); soup_message_headers_foreach (msg->response_headers, gst_soup_http_src_headers_foreach, src); if (msg->status_code == 407 && src->proxy_id && src->proxy_pw) return; if (src->automatic_redirect && SOUP_STATUS_IS_REDIRECTION (msg->status_code)) { GST_DEBUG_OBJECT (src, "%u redirect to \"%s\"", msg->status_code, soup_message_headers_get (msg->response_headers, "Location")); return; } if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) return; src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING; /* Parse Content-Length. */ if (soup_message_headers_get_encoding (msg->response_headers) == SOUP_ENCODING_CONTENT_LENGTH) { newsize = src->request_position + soup_message_headers_get_content_length (msg->response_headers); if (!src->have_size || (src->content_size != newsize)) { src->content_size = newsize; src->have_size = TRUE; src->seekable = TRUE; GST_DEBUG_OBJECT (src, "size = %" G_GUINT64_FORMAT, src->content_size); basesrc = GST_BASE_SRC_CAST (src); gst_segment_set_duration (&basesrc->segment, GST_FORMAT_BYTES, src->content_size); gst_element_post_message (GST_ELEMENT (src), gst_message_new_duration (GST_OBJECT (src), GST_FORMAT_BYTES, src->content_size)); } } /* Icecast stuff */ tag_list = gst_tag_list_new (); if ((value = soup_message_headers_get (msg->response_headers, "icy-metaint")) != NULL) { gint icy_metaint = atoi (value); GST_DEBUG_OBJECT (src, "icy-metaint: %s (parsed: %d)", value, icy_metaint); if (icy_metaint > 0) { if (src->src_caps) gst_caps_unref (src->src_caps); src->src_caps = gst_caps_new_simple ("application/x-icy", "metadata-interval", G_TYPE_INT, icy_metaint, NULL); } } if ((value = soup_message_headers_get_content_type (msg->response_headers, ¶ms)) != NULL) { GST_DEBUG_OBJECT (src, "Content-Type: %s", value); if (g_ascii_strcasecmp (value, "audio/L16") == 0) { gint channels = 2; gint rate = 44100; char *param; if (src->src_caps) gst_caps_unref (src->src_caps); param = g_hash_table_lookup (params, "channels"); if (param != NULL) channels = atol (param); param = g_hash_table_lookup (params, "rate"); if (param != NULL) rate = atol (param); src->src_caps = gst_caps_new_simple ("audio/x-raw-int", "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "signed", G_TYPE_BOOLEAN, TRUE, "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); } else { /* Set the Content-Type field on the caps */ if (src->src_caps) gst_caps_set_simple (src->src_caps, "content-type", G_TYPE_STRING, value, NULL); } } if (params != NULL) g_hash_table_destroy (params); if ((value = soup_message_headers_get (msg->response_headers, "icy-name")) != NULL) { g_free (src->iradio_name); src->iradio_name = gst_soup_http_src_unicodify (value); if (src->iradio_name) { g_object_notify (G_OBJECT (src), "iradio-name"); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_ORGANIZATION, src->iradio_name, NULL); } } if ((value = soup_message_headers_get (msg->response_headers, "icy-genre")) != NULL) { g_free (src->iradio_genre); src->iradio_genre = gst_soup_http_src_unicodify (value); if (src->iradio_genre) { g_object_notify (G_OBJECT (src), "iradio-genre"); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_GENRE, src->iradio_genre, NULL); } } if ((value = soup_message_headers_get (msg->response_headers, "icy-url")) != NULL) { g_free (src->iradio_url); src->iradio_url = gst_soup_http_src_unicodify (value); if (src->iradio_url) { g_object_notify (G_OBJECT (src), "iradio-url"); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_LOCATION, src->iradio_url, NULL); } } if (!gst_tag_list_is_empty (tag_list)) { GST_DEBUG_OBJECT (src, "calling gst_element_found_tags with %" GST_PTR_FORMAT, tag_list); gst_element_found_tags (GST_ELEMENT_CAST (src), tag_list); } else { gst_tag_list_free (tag_list); } /* Handle HTTP errors. */ gst_soup_http_src_parse_status (msg, src); /* Check if Range header was respected. */ if (src->ret == GST_FLOW_CUSTOM_ERROR && src->read_position && msg->status_code != SOUP_STATUS_PARTIAL_CONTENT) { src->seekable = FALSE; GST_ELEMENT_ERROR (src, RESOURCE, SEEK, (_("Server does not support seeking.")), ("Server does not accept Range HTTP header, URL: %s", src->location)); src->ret = GST_FLOW_ERROR; } } /* Have body. Signal EOS. */ static void gst_soup_http_src_got_body_cb (SoupMessage * msg, GstSoupHTTPSrc * src) { if (G_UNLIKELY (msg != src->msg)) { GST_DEBUG_OBJECT (src, "got body, but not for current message"); return; } if (G_UNLIKELY (src->session_io_status != GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING)) { /* Probably a redirect. */ return; } GST_DEBUG_OBJECT (src, "got body"); src->ret = GST_FLOW_UNEXPECTED; if (src->loop) g_main_loop_quit (src->loop); gst_soup_http_src_session_pause_message (src); } /* Finished. Signal EOS. */ static void gst_soup_http_src_finished_cb (SoupMessage * msg, GstSoupHTTPSrc * src) { if (G_UNLIKELY (msg != src->msg)) { GST_DEBUG_OBJECT (src, "finished, but not for current message"); return; } GST_DEBUG_OBJECT (src, "finished"); src->ret = GST_FLOW_UNEXPECTED; if (src->session_io_status == GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED) { /* gst_soup_http_src_cancel_message() triggered this; probably a seek * that occurred in the QUEUEING state; i.e. before the connection setup * was complete. Do nothing */ } else if (src->session_io_status == GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING && src->read_position > 0) { /* The server disconnected while streaming. Reconnect and seeking to the * last location. */ src->retry = TRUE; src->ret = GST_FLOW_CUSTOM_ERROR; } else if (G_UNLIKELY (src->session_io_status != GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING)) { /* FIXME: reason_phrase is not translated, add proper error message */ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, ("%s", msg->reason_phrase), ("libsoup status code %d", msg->status_code)); } if (src->loop) g_main_loop_quit (src->loop); } /* Buffer lifecycle management. * * gst_soup_http_src_create() runs the GMainLoop for this element, to let * Soup take control. * A GstBuffer is allocated in gst_soup_http_src_chunk_allocator() and * associated with a SoupBuffer. * Soup reads HTTP data in the GstBuffer's data buffer. * The gst_soup_http_src_got_chunk_cb() is then called with the SoupBuffer. * That sets gst_soup_http_src_create()'s return argument to the GstBuffer, * increments its refcount (to 2), pauses the flow of data from the HTTP * source to prevent gst_soup_http_src_got_chunk_cb() from being called * again and breaks out of the GMainLoop. * Because the SOUP_MESSAGE_OVERWRITE_CHUNKS flag is set, Soup frees the * SoupBuffer and calls gst_soup_http_src_chunk_free(), which decrements the * refcount (to 1). * gst_soup_http_src_create() returns the GstBuffer. It will be freed by a * downstream element. * If Soup fails to read HTTP data, it does not call * gst_soup_http_src_got_chunk_cb(), but still frees the SoupBuffer and * calls gst_soup_http_src_chunk_free(), which decrements the GstBuffer's * refcount to 0, freeing it. */ static void gst_soup_http_src_chunk_free (gpointer gstbuf) { gst_buffer_unref (GST_BUFFER_CAST (gstbuf)); } static SoupBuffer * gst_soup_http_src_chunk_allocator (SoupMessage * msg, gsize max_len, gpointer user_data) { GstSoupHTTPSrc *src = (GstSoupHTTPSrc *) user_data; GstBaseSrc *basesrc = GST_BASE_SRC_CAST (src); GstBuffer *gstbuf; SoupBuffer *soupbuf; gsize length; GstFlowReturn rc; if (max_len) length = MIN (basesrc->blocksize, max_len); else length = basesrc->blocksize; GST_DEBUG_OBJECT (src, "alloc %" G_GSIZE_FORMAT " bytes <= %" G_GSIZE_FORMAT, length, max_len); rc = gst_pad_alloc_buffer (GST_BASE_SRC_PAD (basesrc), GST_BUFFER_OFFSET_NONE, length, src->src_caps ? src->src_caps : GST_PAD_CAPS (GST_BASE_SRC_PAD (basesrc)), &gstbuf); if (G_UNLIKELY (rc != GST_FLOW_OK)) { /* Failed to allocate buffer. Stall SoupSession and return error code * to create(). */ src->ret = rc; g_main_loop_quit (src->loop); return NULL; } soupbuf = soup_buffer_new_with_owner (GST_BUFFER_DATA (gstbuf), length, gstbuf, gst_soup_http_src_chunk_free); return soupbuf; } static void gst_soup_http_src_got_chunk_cb (SoupMessage * msg, SoupBuffer * chunk, GstSoupHTTPSrc * src) { GstBaseSrc *basesrc; guint64 new_position; if (G_UNLIKELY (msg != src->msg)) { GST_DEBUG_OBJECT (src, "got chunk, but not for current message"); return; } if (G_UNLIKELY (src->session_io_status != GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING)) { /* Probably a redirect. */ return; } basesrc = GST_BASE_SRC_CAST (src); GST_DEBUG_OBJECT (src, "got chunk of %" G_GSIZE_FORMAT " bytes", chunk->length); /* Extract the GstBuffer from the SoupBuffer and set its fields. */ *src->outbuf = GST_BUFFER_CAST (soup_buffer_get_owner (chunk)); GST_BUFFER_SIZE (*src->outbuf) = chunk->length; GST_BUFFER_OFFSET (*src->outbuf) = basesrc->segment.last_stop; gst_buffer_set_caps (*src->outbuf, (src->src_caps) ? src->src_caps : GST_PAD_CAPS (GST_BASE_SRC_PAD (basesrc))); gst_buffer_ref (*src->outbuf); new_position = src->read_position + chunk->length; if (G_LIKELY (src->request_position == src->read_position)) src->request_position = new_position; src->read_position = new_position; src->ret = GST_FLOW_OK; g_main_loop_quit (src->loop); gst_soup_http_src_session_pause_message (src); } static void gst_soup_http_src_response_cb (SoupSession * session, SoupMessage * msg, GstSoupHTTPSrc * src) { if (G_UNLIKELY (msg != src->msg)) { GST_DEBUG_OBJECT (src, "got response %d: %s, but not for current message", msg->status_code, msg->reason_phrase); return; } if (G_UNLIKELY (src->session_io_status != GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING) && SOUP_STATUS_IS_REDIRECTION (msg->status_code)) { /* Ignore redirections. */ return; } GST_DEBUG_OBJECT (src, "got response %d: %s", msg->status_code, msg->reason_phrase); if (src->session_io_status == GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING && src->read_position > 0) { /* The server disconnected while streaming. Reconnect and seeking to the * last location. */ src->retry = TRUE; } else gst_soup_http_src_parse_status (msg, src); /* The session's SoupMessage object expires after this callback returns. */ src->msg = NULL; g_main_loop_quit (src->loop); } #define SOUP_HTTP_SRC_ERROR(src,soup_msg,cat,code,error_message) \ GST_ELEMENT_ERROR ((src), cat, code, ("%s", error_message), \ ("%s (%d), URL: %s", (soup_msg)->reason_phrase, \ (soup_msg)->status_code, (src)->location)); static void gst_soup_http_src_parse_status (SoupMessage * msg, GstSoupHTTPSrc * src) { if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) { switch (msg->status_code) { case SOUP_STATUS_CANT_RESOLVE: case SOUP_STATUS_CANT_RESOLVE_PROXY: SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, NOT_FOUND, _("Could not resolve server name.")); src->ret = GST_FLOW_ERROR; break; case SOUP_STATUS_CANT_CONNECT: case SOUP_STATUS_CANT_CONNECT_PROXY: SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, OPEN_READ, _("Could not establish connection to server.")); src->ret = GST_FLOW_ERROR; break; case SOUP_STATUS_SSL_FAILED: SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, OPEN_READ, _("Secure connection setup failed.")); src->ret = GST_FLOW_ERROR; break; case SOUP_STATUS_IO_ERROR: SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, READ, _("A network error occured, or the server closed the connection " "unexpectedly.")); src->ret = GST_FLOW_ERROR; break; case SOUP_STATUS_MALFORMED: SOUP_HTTP_SRC_ERROR (src, msg, RESOURCE, READ, _("Server sent bad data.")); src->ret = GST_FLOW_ERROR; break; case SOUP_STATUS_CANCELLED: /* No error message when interrupted by program. */ break; } } else if (SOUP_STATUS_IS_CLIENT_ERROR (msg->status_code) || SOUP_STATUS_IS_REDIRECTION (msg->status_code) || SOUP_STATUS_IS_SERVER_ERROR (msg->status_code)) { /* Report HTTP error. */ /* FIXME: reason_phrase is not translated and not suitable for user * error dialog according to libsoup documentation. * FIXME: error code (OPEN_READ vs. READ) should depend on http status? */ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", msg->reason_phrase), ("%s (%d), URL: %s", msg->reason_phrase, msg->status_code, src->location)); src->ret = GST_FLOW_ERROR; } } static gboolean gst_soup_http_src_build_message (GstSoupHTTPSrc * src) { src->msg = soup_message_new (SOUP_METHOD_GET, src->location); if (!src->msg) { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("Error parsing URL."), ("URL: %s", src->location)); return FALSE; } src->session_io_status = GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE; soup_message_headers_append (src->msg->request_headers, "Connection", "close"); if (src->iradio_mode) { soup_message_headers_append (src->msg->request_headers, "icy-metadata", "1"); } if (src->cookies) { gchar **cookie; for (cookie = src->cookies; *cookie != NULL; cookie++) { soup_message_headers_append (src->msg->request_headers, "Cookie", *cookie); } } soup_message_headers_append (src->msg->request_headers, "transferMode.dlna.org", "Streaming"); src->retry = FALSE; g_signal_connect (src->msg, "got_headers", G_CALLBACK (gst_soup_http_src_got_headers_cb), src); g_signal_connect (src->msg, "got_body", G_CALLBACK (gst_soup_http_src_got_body_cb), src); g_signal_connect (src->msg, "finished", G_CALLBACK (gst_soup_http_src_finished_cb), src); g_signal_connect (src->msg, "got_chunk", G_CALLBACK (gst_soup_http_src_got_chunk_cb), src); soup_message_set_flags (src->msg, SOUP_MESSAGE_OVERWRITE_CHUNKS | (src->automatic_redirect ? 0 : SOUP_MESSAGE_NO_REDIRECT)); soup_message_set_chunk_allocator (src->msg, gst_soup_http_src_chunk_allocator, src, NULL); gst_soup_http_src_add_range_header (src, src->request_position); gst_soup_http_src_add_extra_headers (src); GST_DEBUG_OBJECT (src, "request headers:"); soup_message_headers_foreach (src->msg->request_headers, gst_soup_http_src_headers_foreach, src); return TRUE; } static GstFlowReturn gst_soup_http_src_create (GstPushSrc * psrc, GstBuffer ** outbuf) { GstSoupHTTPSrc *src; src = GST_SOUP_HTTP_SRC (psrc); if (src->msg && (src->request_position != src->read_position)) { if (src->content_size != 0 && src->request_position >= src->content_size) { GST_WARNING_OBJECT (src, "Seeking behind the end of file -- EOS"); return GST_FLOW_UNEXPECTED; } else if (src->session_io_status == GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE) { gst_soup_http_src_add_range_header (src, src->request_position); } else { GST_DEBUG_OBJECT (src, "Seek from position %" G_GUINT64_FORMAT " to %" G_GUINT64_FORMAT ": requeueing connection request", src->read_position, src->request_position); gst_soup_http_src_cancel_message (src); } } if (!src->msg) if (!gst_soup_http_src_build_message (src)) return GST_FLOW_ERROR; src->ret = GST_FLOW_CUSTOM_ERROR; src->outbuf = outbuf; do { if (src->interrupted) { GST_DEBUG_OBJECT (src, "interrupted"); break; } if (src->retry) { GST_DEBUG_OBJECT (src, "Reconnecting"); if (!gst_soup_http_src_build_message (src)) return GST_FLOW_ERROR; src->retry = FALSE; continue; } if (!src->msg) { GST_DEBUG_OBJECT (src, "EOS reached"); break; } switch (src->session_io_status) { case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE: GST_DEBUG_OBJECT (src, "Queueing connection request"); gst_soup_http_src_queue_message (src); break; case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED: break; case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING: gst_soup_http_src_session_unpause_message (src); break; case GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED: /* Impossible. */ break; } if (src->ret == GST_FLOW_CUSTOM_ERROR) g_main_loop_run (src->loop); } while (src->ret == GST_FLOW_CUSTOM_ERROR); if (src->ret == GST_FLOW_CUSTOM_ERROR) src->ret = GST_FLOW_UNEXPECTED; return src->ret; } static gboolean gst_soup_http_src_start (GstBaseSrc * bsrc) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); GST_DEBUG_OBJECT (src, "start(\"%s\")", src->location); if (!src->location) { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (_("No URL set.")), ("Missing location property")); return FALSE; } src->context = g_main_context_new (); src->loop = g_main_loop_new (src->context, TRUE); if (!src->loop) { GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Failed to start GMainLoop")); g_main_context_unref (src->context); return FALSE; } if (src->proxy == NULL) { src->session = soup_session_async_new_with_options (SOUP_SESSION_ASYNC_CONTEXT, src->context, SOUP_SESSION_USER_AGENT, src->user_agent, SOUP_SESSION_TIMEOUT, src->timeout, #ifdef HAVE_LIBSOUP_GNOME SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_PROXY_RESOLVER_GNOME, #endif NULL); } else { src->session = soup_session_async_new_with_options (SOUP_SESSION_ASYNC_CONTEXT, src->context, SOUP_SESSION_PROXY_URI, src->proxy, SOUP_SESSION_TIMEOUT, src->timeout, SOUP_SESSION_USER_AGENT, src->user_agent, NULL); } if (!src->session) { GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Failed to create async session")); return FALSE; } g_signal_connect (src->session, "authenticate", G_CALLBACK (gst_soup_http_src_authenticate_cb), src); return TRUE; } static gboolean gst_soup_http_src_stop (GstBaseSrc * bsrc) { GstSoupHTTPSrc *src; src = GST_SOUP_HTTP_SRC (bsrc); GST_DEBUG_OBJECT (src, "stop()"); gst_soup_http_src_session_close (src); if (src->loop) { g_main_loop_unref (src->loop); g_main_context_unref (src->context); src->loop = NULL; src->context = NULL; } if (src->extra_headers) { gst_structure_free (src->extra_headers); src->extra_headers = NULL; } gst_soup_http_src_reset (src); return TRUE; } /* Interrupt a blocking request. */ static gboolean gst_soup_http_src_unlock (GstBaseSrc * bsrc) { GstSoupHTTPSrc *src; src = GST_SOUP_HTTP_SRC (bsrc); GST_DEBUG_OBJECT (src, "unlock()"); src->interrupted = TRUE; if (src->loop) g_main_loop_quit (src->loop); return TRUE; } /* Interrupt interrupt. */ static gboolean gst_soup_http_src_unlock_stop (GstBaseSrc * bsrc) { GstSoupHTTPSrc *src; src = GST_SOUP_HTTP_SRC (bsrc); GST_DEBUG_OBJECT (src, "unlock_stop()"); src->interrupted = FALSE; return TRUE; } static gboolean gst_soup_http_src_get_size (GstBaseSrc * bsrc, guint64 * size) { GstSoupHTTPSrc *src; src = GST_SOUP_HTTP_SRC (bsrc); if (src->have_size) { GST_DEBUG_OBJECT (src, "get_size() = %" G_GUINT64_FORMAT, src->content_size); *size = src->content_size; return TRUE; } GST_DEBUG_OBJECT (src, "get_size() = FALSE"); return FALSE; } static gboolean gst_soup_http_src_is_seekable (GstBaseSrc * bsrc) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); return src->seekable; } static gboolean gst_soup_http_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); GST_DEBUG_OBJECT (src, "do_seek(%" G_GUINT64_FORMAT ")", segment->start); if (src->read_position == segment->start) { GST_DEBUG_OBJECT (src, "Seeking to current read position"); return TRUE; } if (!src->seekable) { GST_WARNING_OBJECT (src, "Not seekable"); return FALSE; } if (segment->rate < 0.0 || segment->format != GST_FORMAT_BYTES) { GST_WARNING_OBJECT (src, "Invalid seek segment"); return FALSE; } if (src->content_size != 0 && segment->start >= src->content_size) { GST_WARNING_OBJECT (src, "Seeking behind end of file, will go to EOS soon"); } /* Wait for create() to handle the jump in offset. */ src->request_position = segment->start; return TRUE; } static gboolean gst_soup_http_src_query (GstBaseSrc * bsrc, GstQuery * query) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc); gboolean ret; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_URI: gst_query_set_uri (query, src->location); ret = TRUE; break; default: ret = FALSE; break; } if (!ret) ret = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); return ret; } static gboolean gst_soup_http_src_set_location (GstSoupHTTPSrc * src, const gchar * uri) { if (src->location) { g_free (src->location); src->location = NULL; } src->location = g_strdup (uri); return TRUE; } static gboolean gst_soup_http_src_set_proxy (GstSoupHTTPSrc * src, const gchar * uri) { if (src->proxy) { soup_uri_free (src->proxy); src->proxy = NULL; } if (g_str_has_prefix (uri, "http://")) { src->proxy = soup_uri_new (uri); } else { gchar *new_uri = g_strconcat ("http://", uri, NULL); src->proxy = soup_uri_new (new_uri); g_free (new_uri); } return TRUE; } static guint gst_soup_http_src_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_soup_http_src_uri_get_protocols (void) { static const gchar *protocols[] = { "http", "https", NULL }; return (gchar **) protocols; } static const gchar * gst_soup_http_src_uri_get_uri (GstURIHandler * handler) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (handler); return src->location; } static gboolean gst_soup_http_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) { GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (handler); return gst_soup_http_src_set_location (src, uri); } static void gst_soup_http_src_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_soup_http_src_uri_get_type; iface->get_protocols = gst_soup_http_src_uri_get_protocols; iface->get_uri = gst_soup_http_src_uri_get_uri; iface->set_uri = gst_soup_http_src_uri_set_uri; } gst-plugins-good-0.10.31/ext/soup/gstsoup.c0000644000175000017500000000260711677341654015460 00000000000000/* GStreamer * Copyright (C) 2007-2008 Wouter Cloetens * * 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 */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstsouphttpsrc.h" #include "gstsouphttpclientsink.h" static gboolean plugin_init (GstPlugin * plugin) { #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif gst_element_register (plugin, "souphttpsrc", GST_RANK_PRIMARY, GST_TYPE_SOUP_HTTP_SRC); gst_element_register (plugin, "souphttpclientsink", GST_RANK_NONE, GST_TYPE_SOUP_HTTP_CLIENT_SINK); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "soup", "libsoup HTTP client src/sink", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/soup/gstsouphttpsrc.h0000644000175000017500000000707511671175352017073 00000000000000/* GStreamer * Copyright (C) 2007-2008 Wouter Cloetens * * 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 */ #ifndef __GST_SOUP_HTTP_SRC_H__ #define __GST_SOUP_HTTP_SRC_H__ #include #include #include G_BEGIN_DECLS #include #define GST_TYPE_SOUP_HTTP_SRC \ (gst_soup_http_src_get_type()) #define GST_SOUP_HTTP_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SOUP_HTTP_SRC,GstSoupHTTPSrc)) #define GST_SOUP_HTTP_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), \ GST_TYPE_SOUP_HTTP_SRC,GstSoupHTTPSrcClass)) #define GST_IS_SOUP_HTTP_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SOUP_HTTP_SRC)) #define GST_IS_SOUP_HTTP_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SOUP_HTTP_SRC)) typedef struct _GstSoupHTTPSrc GstSoupHTTPSrc; typedef struct _GstSoupHTTPSrcClass GstSoupHTTPSrcClass; typedef enum { GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_IDLE, GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_QUEUED, GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING, GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_CANCELLED, } GstSoupHTTPSrcSessionIOStatus; struct _GstSoupHTTPSrc { GstPushSrc element; gchar *location; /* Full URI. */ gchar *user_agent; /* User-Agent HTTP header. */ gboolean automatic_redirect; /* Follow redirects. */ SoupURI *proxy; /* HTTP proxy URI. */ gchar *user_id; /* Authentication user id for location URI. */ gchar *user_pw; /* Authentication user password for location URI. */ gchar *proxy_id; /* Authentication user id for proxy URI. */ gchar *proxy_pw; /* Authentication user password for proxy URI. */ gchar **cookies; /* HTTP request cookies. */ GMainContext *context; /* I/O context. */ GMainLoop *loop; /* Event loop. */ SoupSession *session; /* Async context. */ GstSoupHTTPSrcSessionIOStatus session_io_status; /* Async I/O status. */ SoupMessage *msg; /* Request message. */ GstFlowReturn ret; /* Return code from callback. */ GstBuffer **outbuf; /* Return buffer allocated by callback. */ gboolean interrupted; /* Signal unlock(). */ gboolean retry; /* Should attempt to reconnect. */ gboolean have_size; /* Received and parsed Content-Length header. */ guint64 content_size; /* Value of Content-Length header. */ guint64 read_position; /* Current position. */ gboolean seekable; /* FALSE if the server does not support Range. */ guint64 request_position; /* Seek to this position. */ /* Shoutcast/icecast metadata extraction handling. */ gboolean iradio_mode; GstCaps *src_caps; gchar *iradio_name; gchar *iradio_genre; gchar *iradio_url; gchar *iradio_title; GstStructure *extra_headers; guint timeout; }; struct _GstSoupHTTPSrcClass { GstPushSrcClass parent_class; }; GType gst_soup_http_src_get_type (void); G_END_DECLS #endif /* __GST_SOUP_HTTP_SRC_H__ */ gst-plugins-good-0.10.31/ext/soup/Makefile.in0000644000175000017500000007351311720560227015645 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/soup DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstsouphttpsrc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstsouphttpsrc_la_OBJECTS = \ libgstsouphttpsrc_la-gstsouphttpsrc.lo \ libgstsouphttpsrc_la-gstsouphttpclientsink.lo \ libgstsouphttpsrc_la-gstsoup.lo libgstsouphttpsrc_la_OBJECTS = $(am_libgstsouphttpsrc_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstsouphttpsrc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) \ $(libgstsouphttpsrc_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstsouphttpsrc_la_SOURCES) DIST_SOURCES = $(libgstsouphttpsrc_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstsouphttpsrc.la libgstsouphttpsrc_la_SOURCES = gstsouphttpsrc.c gstsouphttpclientsink.c gstsoup.c libgstsouphttpsrc_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(SOUP_CFLAGS) libgstsouphttpsrc_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(SOUP_LIBS) libgstsouphttpsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsouphttpsrc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstsouphttpsrc.h gstsouphttpclientsink.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/soup/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/soup/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstsouphttpsrc.la: $(libgstsouphttpsrc_la_OBJECTS) $(libgstsouphttpsrc_la_DEPENDENCIES) $(EXTRA_libgstsouphttpsrc_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstsouphttpsrc_la_LINK) -rpath $(plugindir) $(libgstsouphttpsrc_la_OBJECTS) $(libgstsouphttpsrc_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstsouphttpsrc_la-gstsouphttpsrc.lo: gstsouphttpsrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -MT libgstsouphttpsrc_la-gstsouphttpsrc.lo -MD -MP -MF $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Tpo -c -o libgstsouphttpsrc_la-gstsouphttpsrc.lo `test -f 'gstsouphttpsrc.c' || echo '$(srcdir)/'`gstsouphttpsrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Tpo $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpsrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsouphttpsrc.c' object='libgstsouphttpsrc_la-gstsouphttpsrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -c -o libgstsouphttpsrc_la-gstsouphttpsrc.lo `test -f 'gstsouphttpsrc.c' || echo '$(srcdir)/'`gstsouphttpsrc.c libgstsouphttpsrc_la-gstsouphttpclientsink.lo: gstsouphttpclientsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -MT libgstsouphttpsrc_la-gstsouphttpclientsink.lo -MD -MP -MF $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Tpo -c -o libgstsouphttpsrc_la-gstsouphttpclientsink.lo `test -f 'gstsouphttpclientsink.c' || echo '$(srcdir)/'`gstsouphttpclientsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Tpo $(DEPDIR)/libgstsouphttpsrc_la-gstsouphttpclientsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsouphttpclientsink.c' object='libgstsouphttpsrc_la-gstsouphttpclientsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -c -o libgstsouphttpsrc_la-gstsouphttpclientsink.lo `test -f 'gstsouphttpclientsink.c' || echo '$(srcdir)/'`gstsouphttpclientsink.c libgstsouphttpsrc_la-gstsoup.lo: gstsoup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -MT libgstsouphttpsrc_la-gstsoup.lo -MD -MP -MF $(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Tpo -c -o libgstsouphttpsrc_la-gstsoup.lo `test -f 'gstsoup.c' || echo '$(srcdir)/'`gstsoup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Tpo $(DEPDIR)/libgstsouphttpsrc_la-gstsoup.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsoup.c' object='libgstsouphttpsrc_la-gstsoup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsouphttpsrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsouphttpsrc_la_CFLAGS) $(CFLAGS) -c -o libgstsouphttpsrc_la-gstsoup.lo `test -f 'gstsoup.c' || echo '$(srcdir)/'`gstsoup.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/gconf/0000755000175000017500000000000011720565321013755 500000000000000gst-plugins-good-0.10.31/ext/gconf/gstgconf.c0000644000175000017500000001716211671175352015670 00000000000000/* GStreamer * nf_get_default_audio_sink * Copyright (C) <2002> Thomas Vander Stichele * Copyright (C) <2006> Jürg Billeter * * 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. */ /* * this library handles interaction with GConf */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstgconf.h" #include "gstgconfelements.h" /* for debug category */ #ifndef GST_GCONF_DIR #error "GST_GCONF_DIR is not defined !" #endif static GConfClient *_gst_gconf_client = NULL; /* GConf connection */ /* internal functions */ static GConfClient * gst_gconf_get_client (void) { if (!_gst_gconf_client) _gst_gconf_client = gconf_client_get_default (); return _gst_gconf_client; } /* external functions */ /** * gst_gconf_get_string: * @key: a #gchar corresponding to the key you want to get. * * Get GConf key @key's string value. * * Returns: a newly allocated #gchar string containing @key's value, * or NULL in the case of an error.. */ gchar * gst_gconf_get_string (const gchar * key) { GError *error = NULL; gchar *value = NULL; gchar *full_key; if (!g_str_has_prefix (key, GST_GCONF_DIR)) full_key = g_strdup_printf ("%s/%s", GST_GCONF_DIR, key); else full_key = g_strdup (key); value = gconf_client_get_string (gst_gconf_get_client (), full_key, &error); g_free (full_key); if (error) { g_warning ("gst_gconf_get_string: error: %s\n", error->message); g_error_free (error); return NULL; } return value; } const gchar * gst_gconf_get_key_for_sink_profile (GstGConfProfile profile) { switch (profile) { case GCONF_PROFILE_SOUNDS: return GST_GCONF_DIR "/" GST_GCONF_AUDIOSINK_KEY; case GCONF_PROFILE_MUSIC: return GST_GCONF_DIR "/" GST_GCONF_MUSIC_AUDIOSINK_KEY; case GCONF_PROFILE_CHAT: return GST_GCONF_DIR "/" GST_GCONF_CHAT_AUDIOSINK_KEY; default: break; } g_return_val_if_reached (GST_GCONF_DIR "/" GST_GCONF_AUDIOSINK_KEY); } /** * gst_gconf_set_string: * @key: a #gchar corresponding to the key you want to set. * @value: a #gchar containing key value. * * Set GConf key @key to string value @value. */ void gst_gconf_set_string (const gchar * key, const gchar * value) { GError *error = NULL; gchar *full_key; if (!g_str_has_prefix (key, GST_GCONF_DIR)) full_key = g_strdup_printf ("%s/%s", GST_GCONF_DIR, key); else full_key = g_strdup (key); gconf_client_set_string (gst_gconf_get_client (), full_key, value, &error); if (error) { GST_ERROR ("gst_gconf_set_string: error: %s\n", error->message); g_error_free (error); } g_free (full_key); } /** * gst_gconf_render_bin_from_key: * @key: a #gchar string corresponding to a GConf key. * * Render bin from GConf key @key. * * Returns: a #GstElement containing the rendered bin. */ GstElement * gst_gconf_render_bin_from_key (const gchar * key) { GstElement *bin = NULL; gchar *value; value = gst_gconf_get_string (key); GST_LOG ("%s = %s", GST_STR_NULL (key), GST_STR_NULL (value)); if (value) { GError *err = NULL; bin = gst_parse_bin_from_description (value, TRUE, &err); if (err) { GST_ERROR ("gconf: error creating bin '%s': %s", value, err->message); g_error_free (err); } g_free (value); } return bin; } /** * gst_gconf_render_bin_with_default: * @bin: a #gchar string describing the pipeline to construct. * @default_sink: an element to use as default if the given pipeline fails to construct. * * Render bin from description @bin using @default_sink element as a fallback. * * Returns: a #GstElement containing the rendered bin. */ GstElement * gst_gconf_render_bin_with_default (const gchar * bin, const gchar * default_sink) { GstElement *ret = NULL; GError *err = NULL; if (bin != NULL) ret = gst_parse_bin_from_description (bin, TRUE, &err); if (ret == NULL || err != NULL) { if (err) { GST_DEBUG ("Could not create audio sink from GConf settings: %s", err->message); g_error_free (err); } else { GST_DEBUG ("Could not create audio sink from GConf settings"); } ret = gst_element_factory_make (default_sink, NULL); if (!ret) g_warning ("Could not build GConf audio sink and the replacement %s doesn't work", DEFAULT_AUDIOSINK); } return ret; } /** * gst_gconf_get_default_video_sink: * * Render video output bin from GStreamer GConf key : "default/videosink". * If key is invalid, the default video sink for the platform is used * (typically xvimagesink or ximagesink). * * Returns: a #GstElement containing the video output bin, or NULL if * everything failed. */ GstElement * gst_gconf_get_default_video_sink (void) { GstElement *ret = gst_gconf_render_bin_from_key (GST_GCONF_VIDEOSINK_KEY); if (!ret) { ret = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL); if (!ret) g_warning ("No GConf default video sink key and %s doesn't work", DEFAULT_VIDEOSINK); } return ret; } /** * gst_gconf_get_default_audio_src: * * Render audio acquisition bin from GStreamer GConf key : "default/audiosrc". * If key is invalid, the default audio source for the plaform is used. * (typically osssrc or sunaudiosrc). * * Returns: a #GstElement containing the audio source bin, or NULL if * everything failed. */ GstElement * gst_gconf_get_default_audio_src (void) { GstElement *ret = gst_gconf_render_bin_from_key (GST_GCONF_AUDIOSRC_KEY); if (!ret) { ret = gst_element_factory_make (DEFAULT_AUDIOSRC, NULL); if (!ret) g_warning ("No GConf default audio src key and %s doesn't work", DEFAULT_AUDIOSRC); } return ret; } /** * gst_gconf_get_default_video_src: * * Render video acquisition bin from GStreamer GConf key : * "default/videosrc". If key is invalid, the default video source * for the platform is used (typically videotestsrc). * * Returns: a #GstElement containing the video source bin, or NULL if * everything failed. */ GstElement * gst_gconf_get_default_video_src (void) { GstElement *ret = gst_gconf_render_bin_from_key (GST_GCONF_VIDEOSRC_KEY); if (!ret) { ret = gst_element_factory_make (DEFAULT_VIDEOSRC, NULL); if (!ret) g_warning ("No GConf default video src key and %s doesn't work", DEFAULT_VIDEOSRC); } return ret; } /** * gst_gconf_get_default_visualization_element: * * Render visualization bin from GStreamer GConf key : "default/visualization". * If key is invalid, the default visualization element is used. * * Returns: a #GstElement containing the visualization bin, or NULL if * everything failed. */ GstElement * gst_gconf_get_default_visualization_element (void) { GstElement *ret = gst_gconf_render_bin_from_key ("default/visualization"); if (!ret) { ret = gst_element_factory_make (DEFAULT_VISUALIZER, NULL); if (!ret) g_warning ("No GConf default visualization plugin key and %s doesn't work", DEFAULT_VISUALIZER); } return ret; } gst-plugins-good-0.10.31/ext/gconf/gstgconf.h0000644000175000017500000000447711671175352015702 00000000000000/* GStreamer * Copyright (C) <2002> Thomas Vander Stichele * Copyright (C) <2006> Jürg Billeter * * 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_GCONF_H #define GST_GCONF_H /* * this library handles interaction with GConf */ #include #include G_BEGIN_DECLS #define GST_GCONF_AUDIOSRC_KEY "default/audiosrc" #define GST_GCONF_AUDIOSINK_KEY "default/audiosink" #define GST_GCONF_MUSIC_AUDIOSINK_KEY "default/musicaudiosink" #define GST_GCONF_CHAT_AUDIOSINK_KEY "default/chataudiosink" #define GST_GCONF_VIDEOSRC_KEY "default/videosrc" #define GST_GCONF_VIDEOSINK_KEY "default/videosink" typedef enum { GCONF_PROFILE_SOUNDS, GCONF_PROFILE_MUSIC, GCONF_PROFILE_CHAT, GCONF_PROFILE_NONE /* Internal value only */ } GstGConfProfile; gchar * gst_gconf_get_string (const gchar *key); void gst_gconf_set_string (const gchar *key, const gchar *value); const gchar * gst_gconf_get_key_for_sink_profile (GstGConfProfile profile); GstElement * gst_gconf_render_bin_from_key (const gchar *key); GstElement * gst_gconf_render_bin_with_default (const gchar *bin, const gchar *default_sink); GstElement * gst_gconf_get_default_video_sink (void); GstElement * gst_gconf_get_default_audio_sink (int profile); GstElement * gst_gconf_get_default_video_src (void); GstElement * gst_gconf_get_default_audio_src (void); GstElement * gst_gconf_get_default_visualization_element (void); G_END_DECLS #endif /* GST_GCONF_H */ gst-plugins-good-0.10.31/ext/gconf/gstgconfaudiosink.c0000644000175000017500000002124611671175352017575 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jürg Billeter * * 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-gconfaudiosink * * This element outputs sound to the audiosink that has been configured in * GConf by the user. * * * Example launch line * |[ * gst-launch filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! gconfaudiosink * ]| Play on configured audiosink * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstgconfelements.h" #include "gstgconfaudiosink.h" static void gst_gconf_audio_sink_dispose (GObject * object); static void gst_gconf_audio_sink_finalize (GstGConfAudioSink * sink); static void cb_change_child (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data); static GstStateChangeReturn gst_gconf_audio_sink_change_state (GstElement * element, GstStateChange transition); static void gst_gconf_switch_profile (GstGConfAudioSink * sink, GstGConfProfile profile); enum { PROP_0, PROP_PROFILE }; GST_BOILERPLATE (GstGConfAudioSink, gst_gconf_audio_sink, GstSwitchSink, GST_TYPE_SWITCH_SINK); static void gst_gconf_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_gconf_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_gconf_audio_sink_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (eklass, "GConf audio sink", "Sink/Audio", "Audio sink embedding the GConf-settings for audio output", "Jan Schmidt "); } #define GST_TYPE_GCONF_PROFILE (gst_gconf_profile_get_type()) static GType gst_gconf_profile_get_type (void) { static GType gconf_profile_type = 0; static const GEnumValue gconf_profiles[] = { {GCONF_PROFILE_SOUNDS, "Sound Events", "sounds"}, {GCONF_PROFILE_MUSIC, "Music and Movies", "music"}, {GCONF_PROFILE_CHAT, "Audio/Video Conferencing", "chat"}, {0, NULL, NULL} }; if (!gconf_profile_type) { gconf_profile_type = g_enum_register_static ("GstGConfProfile", gconf_profiles); } return gconf_profile_type; } static void gst_gconf_audio_sink_class_init (GstGConfAudioSinkClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); oklass->set_property = gst_gconf_audio_sink_set_property; oklass->get_property = gst_gconf_audio_sink_get_property; oklass->dispose = gst_gconf_audio_sink_dispose; oklass->finalize = (GObjectFinalizeFunc) gst_gconf_audio_sink_finalize; eklass->change_state = gst_gconf_audio_sink_change_state; g_object_class_install_property (oklass, PROP_PROFILE, g_param_spec_enum ("profile", "Profile", "Profile", GST_TYPE_GCONF_PROFILE, GCONF_PROFILE_SOUNDS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_gconf_audio_sink_reset (GstGConfAudioSink * sink) { gst_switch_sink_set_child (GST_SWITCH_SINK (sink), NULL); g_free (sink->gconf_str); sink->gconf_str = NULL; } static void gst_gconf_audio_sink_init (GstGConfAudioSink * sink, GstGConfAudioSinkClass * g_class) { gst_gconf_audio_sink_reset (sink); sink->client = gconf_client_get_default (); gconf_client_add_dir (sink->client, GST_GCONF_DIR "/default", GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); gst_gconf_switch_profile (sink, GCONF_PROFILE_SOUNDS); } static void gst_gconf_audio_sink_dispose (GObject * object) { GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (object); if (sink->client) { gst_gconf_switch_profile (sink, GCONF_PROFILE_NONE); g_object_unref (G_OBJECT (sink->client)); sink->client = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static void gst_gconf_audio_sink_finalize (GstGConfAudioSink * sink) { g_free (sink->gconf_str); GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (sink))); } static gboolean do_change_child (GstGConfAudioSink * sink) { const gchar *key; gchar *new_gconf_str; GstElement *new_kid; if (sink->profile == GCONF_PROFILE_NONE) return FALSE; /* Can't switch to a 'NONE' sink */ key = gst_gconf_get_key_for_sink_profile (sink->profile); new_gconf_str = gst_gconf_get_string (key); GST_LOG_OBJECT (sink, "old gconf string: %s", GST_STR_NULL (sink->gconf_str)); GST_LOG_OBJECT (sink, "new gconf string: %s", GST_STR_NULL (new_gconf_str)); if (new_gconf_str != NULL && sink->gconf_str != NULL && (strlen (new_gconf_str) == 0 || strcmp (sink->gconf_str, new_gconf_str) == 0)) { g_free (new_gconf_str); GST_DEBUG_OBJECT (sink, "GConf key was updated, but it didn't change. Ignoring"); return TRUE; } GST_DEBUG_OBJECT (sink, "GConf key changed: '%s' to '%s'", GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str)); GST_DEBUG_OBJECT (sink, "Creating new child for profile %d", sink->profile); new_kid = gst_gconf_render_bin_with_default (new_gconf_str, DEFAULT_AUDIOSINK); if (new_kid == NULL) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render audio sink from GConf")); goto fail; } if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { GST_WARNING_OBJECT (sink, "Failed to update child element"); goto fail; } g_free (sink->gconf_str); sink->gconf_str = new_gconf_str; GST_DEBUG_OBJECT (sink, "done changing gconf audio sink"); return TRUE; fail: g_free (new_gconf_str); return FALSE; } static void gst_gconf_switch_profile (GstGConfAudioSink * sink, GstGConfProfile profile) { if (sink->client == NULL) return; if (sink->notify_id) { GST_DEBUG_OBJECT (sink, "Unsubscribing old key %s for profile %d", gst_gconf_get_key_for_sink_profile (sink->profile), sink->profile); gconf_client_notify_remove (sink->client, sink->notify_id); sink->notify_id = 0; } sink->profile = profile; if (profile != GCONF_PROFILE_NONE) { const gchar *key = gst_gconf_get_key_for_sink_profile (sink->profile); GST_DEBUG_OBJECT (sink, "Subscribing to key %s for profile %d", key, profile); sink->notify_id = gconf_client_notify_add (sink->client, key, cb_change_child, sink, NULL, NULL); } } static void gst_gconf_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGConfAudioSink *sink; sink = GST_GCONF_AUDIO_SINK (object); switch (prop_id) { case PROP_PROFILE: gst_gconf_switch_profile (sink, g_value_get_enum (value)); break; default: break; } } static void gst_gconf_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGConfAudioSink *sink; sink = GST_GCONF_AUDIO_SINK (object); switch (prop_id) { case PROP_PROFILE: g_value_set_enum (value, sink->profile); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void cb_change_child (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data) { do_change_child (GST_GCONF_AUDIO_SINK (data)); } static GstStateChangeReturn gst_gconf_audio_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!do_change_child (sink)) { gst_gconf_audio_sink_reset (sink); return GST_STATE_CHANGE_FAILURE; } break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_gconf_audio_sink_reset (sink); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/gconf/gstgconfaudiosrc.h0000644000175000017500000000372511671175352017427 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2005 Tim-Philipp Müller * * 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_GCONF_AUDIO_SRC_H__ #define __GST_GCONF_AUDIO_SRC_H__ #include #include #include "gstswitchsrc.h" G_BEGIN_DECLS #define GST_TYPE_GCONF_AUDIO_SRC (gst_gconf_audio_src_get_type ()) #define GST_GCONF_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_AUDIO_SRC, GstGConfAudioSrc)) #define GST_GCONF_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_AUDIO_SRC, GstGConfAudioSrcClass)) #define GST_IS_GCONF_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_AUDIO_SRC)) #define GST_IS_GCONF_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_AUDIO_SRC)) typedef struct _GstGConfAudioSrc { GstSwitchSrc parent; /* explicit pointers to stuff used */ GConfClient *client; guint gconf_notify_id; /* Current gconf string */ gchar *gconf_str; } GstGConfAudioSrc; typedef struct _GstGConfAudioSrcClass { GstSwitchSrcClass parent_class; } GstGConfAudioSrcClass; GType gst_gconf_audio_src_get_type (void); G_END_DECLS #endif /* __GST_GCONF_AUDIO_SRC_H__ */ gst-plugins-good-0.10.31/ext/gconf/gstswitchsrc.h0000644000175000017500000000401611671175352016604 00000000000000/* GStreamer * * Copyright (c) 2005 Ronald S. Bultje * Copyright (c) 2005 Tim-Philipp Müller * Copyright (c) 2007 Jan Schmidt * Copyright (c) 2010 Sebastian Dröge * * 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_SWITCH_SRC_H__ #define __GST_SWITCH_SRC_H__ #include G_BEGIN_DECLS #define GST_TYPE_SWITCH_SRC (gst_switch_src_get_type ()) #define GST_SWITCH_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SWITCH_SRC, GstSwitchSrc)) #define GST_SWITCH_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SWITCH_SRC, GstSwitchSrcClass)) #define GST_IS_SWITCH_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SWITCH_SRC)) #define GST_IS_SWITCH_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SWITCH_SRC)) typedef struct _GstSwitchSrc { GstBin parent; GstElement *kid; GstElement *new_kid; GstPad *pad; /* If a custom child has been set... */ gboolean have_kid; } GstSwitchSrc; typedef struct _GstSwitchSrcClass { GstBinClass parent_class; } GstSwitchSrcClass; GType gst_switch_src_get_type (void); gboolean gst_switch_src_set_child (GstSwitchSrc *ssrc, GstElement *new_kid); G_END_DECLS #endif /* __GST_SWITCH_SRC_H__ */ gst-plugins-good-0.10.31/ext/gconf/Makefile.am0000644000175000017500000000134311671175352015740 00000000000000plugin_LTLIBRARIES = libgstgconfelements.la libgstgconfelements_la_SOURCES = \ gstgconfaudiosink.c \ gstgconfaudiosrc.c \ gstgconfelements.c \ gstgconfvideosink.c \ gstgconfvideosrc.c \ gstswitchsink.c \ gstswitchsrc.c \ gstgconf.c DIR_CFLAGS = -DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\" libgstgconfelements_la_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS) libgstgconfelements_la_LIBADD = $(GST_LIBS) $(GCONF_LIBS) libgstgconfelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgconfelements_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstgconfaudiosink.h \ gstgconfaudiosrc.h \ gstgconfelements.h \ gstgconfvideosink.h \ gstgconfvideosrc.h \ gstswitchsink.h \ gstswitchsrc.h \ gstgconf.h gst-plugins-good-0.10.31/ext/gconf/gstswitchsink.h0000644000175000017500000000370711671175352016767 00000000000000/* GStreamer * Copyright (c) 2005 Ronald S. Bultje * Copyright (c) 2007 Jan Schmidt * * 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_SWITCH_SINK_H__ #define __GST_SWITCH_SINK_H__ #include G_BEGIN_DECLS #define GST_TYPE_SWITCH_SINK \ (gst_switch_sink_get_type ()) #define GST_SWITCH_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SWITCH_SINK, \ GstSwitchSink)) #define GST_SWITCH_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SWITCH_SINK, \ GstSwitchSinkClass)) #define GST_IS_SWITCH_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SWITCH_SINK)) #define GST_IS_SWITCH_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SWITCH_SINK)) typedef struct _GstSwitchSink { GstBin parent; GstElement *kid; GstElement *new_kid; GstPad *pad; /* If a custom child has been set... */ gboolean have_kid; } GstSwitchSink; typedef struct _GstSwitchSinkClass { GstBinClass parent_class; } GstSwitchSinkClass; GType gst_switch_sink_get_type (void); gboolean gst_switch_sink_set_child (GstSwitchSink *ssink, GstElement *new_kid); G_END_DECLS #endif /* __GST_SWITCH_SINK_H__ */ gst-plugins-good-0.10.31/ext/gconf/gstgconfaudiosrc.c0000644000175000017500000001346611671175352017425 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2005 Tim-Philipp Müller * * 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-gconfaudiosrc * @see_also: #GstAlsaSrc, #GstAutoAudioSrc * * This element records sound from the audiosink that has been configured in * GConf by the user. * * * Example launch line * |[ * gst-launch gconfaudiosrc ! audioconvert ! wavenc ! filesink location=record.wav * ]| Record from configured audioinput * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstgconfelements.h" #include "gstgconfaudiosrc.h" static void gst_gconf_audio_src_dispose (GObject * object); static void gst_gconf_audio_src_finalize (GstGConfAudioSrc * src); static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data); static GstStateChangeReturn gst_gconf_audio_src_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstGConfAudioSrc, gst_gconf_audio_src, GstSwitchSrc, GST_TYPE_SWITCH_SRC); static void gst_gconf_audio_src_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (eklass, "GConf audio source", "Source/Audio", "Audio source embedding the GConf-settings for audio input", "GStreamer maintainers "); } static void gst_gconf_audio_src_class_init (GstGConfAudioSrcClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); oklass->dispose = gst_gconf_audio_src_dispose; oklass->finalize = (GObjectFinalizeFunc) gst_gconf_audio_src_finalize; eklass->change_state = gst_gconf_audio_src_change_state; } /* * Hack to make negotiation work. */ static gboolean gst_gconf_audio_src_reset (GstGConfAudioSrc * src) { gst_switch_src_set_child (GST_SWITCH_SRC (src), NULL); g_free (src->gconf_str); src->gconf_str = NULL; return TRUE; } static void gst_gconf_audio_src_init (GstGConfAudioSrc * src, GstGConfAudioSrcClass * g_class) { gst_gconf_audio_src_reset (src); src->client = gconf_client_get_default (); gconf_client_add_dir (src->client, GST_GCONF_DIR, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); src->gconf_notify_id = gconf_client_notify_add (src->client, GST_GCONF_DIR "/" GST_GCONF_AUDIOSRC_KEY, cb_toggle_element, src, NULL, NULL); } static void gst_gconf_audio_src_dispose (GObject * object) { GstGConfAudioSrc *src = GST_GCONF_AUDIO_SRC (object); if (src->client) { if (src->gconf_notify_id) { gconf_client_notify_remove (src->client, src->gconf_notify_id); src->gconf_notify_id = 0; } g_object_unref (G_OBJECT (src->client)); src->client = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static void gst_gconf_audio_src_finalize (GstGConfAudioSrc * src) { g_free (src->gconf_str); GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (src))); } static gboolean do_toggle_element (GstGConfAudioSrc * src) { GstElement *new_kid; gchar *new_gconf_str; new_gconf_str = gst_gconf_get_string (GST_GCONF_AUDIOSRC_KEY); if (new_gconf_str != NULL && src->gconf_str != NULL && (strlen (new_gconf_str) == 0 || strcmp (src->gconf_str, new_gconf_str) == 0)) { g_free (new_gconf_str); GST_DEBUG_OBJECT (src, "GConf key was updated, but it didn't change"); return TRUE; } GST_DEBUG_OBJECT (src, "GConf key changed: '%s' to '%s'", GST_STR_NULL (src->gconf_str), GST_STR_NULL (new_gconf_str)); GST_DEBUG_OBJECT (src, "Creating new kid"); if (!(new_kid = gst_gconf_get_default_audio_src ())) { GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL), ("Failed to render audio src from GConf")); return FALSE; } if (!gst_switch_src_set_child (GST_SWITCH_SRC (src), new_kid)) { GST_WARNING_OBJECT (src, "Failed to update child element"); goto fail; } g_free (src->gconf_str); src->gconf_str = new_gconf_str; GST_DEBUG_OBJECT (src, "done changing gconf audio src"); return TRUE; fail: g_free (new_gconf_str); return FALSE; } static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data) { do_toggle_element (GST_GCONF_AUDIO_SRC (data)); } static GstStateChangeReturn gst_gconf_audio_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstGConfAudioSrc *src = GST_GCONF_AUDIO_SRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!do_toggle_element (src)) { gst_gconf_audio_src_reset (src); return GST_STATE_CHANGE_FAILURE; } break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (!gst_gconf_audio_src_reset (src)) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/gconf/gstgconfvideosrc.c0000644000175000017500000001337711671175352017433 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2005 Tim-Philipp Müller * * 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-gconfvideosrc * @see_also: #GstAlsaSrc, #GstAutoVideoSrc * * This element records video from the videosink that has been configured in * GConf by the user. * * * Example launch line * |[ * gst-launch gconfvideosrc ! theoraenc ! oggmux ! filesink location=record.ogg * ]| Record from configured videoinput * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstgconfelements.h" #include "gstgconfvideosrc.h" static void gst_gconf_video_src_dispose (GObject * object); static void gst_gconf_video_src_finalize (GstGConfVideoSrc * src); static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data); static GstStateChangeReturn gst_gconf_video_src_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstGConfVideoSrc, gst_gconf_video_src, GstSwitchSrc, GST_TYPE_SWITCH_SRC); static void gst_gconf_video_src_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (eklass, "GConf video source", "Source/Video", "Video source embedding the GConf-settings for video input", "GStreamer maintainers "); } static void gst_gconf_video_src_class_init (GstGConfVideoSrcClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); oklass->dispose = gst_gconf_video_src_dispose; oklass->finalize = (GObjectFinalizeFunc) gst_gconf_video_src_finalize; eklass->change_state = gst_gconf_video_src_change_state; } /* * Hack to make negotiation work. */ static gboolean gst_gconf_video_src_reset (GstGConfVideoSrc * src) { gst_switch_src_set_child (GST_SWITCH_SRC (src), NULL); g_free (src->gconf_str); src->gconf_str = NULL; return TRUE; } static void gst_gconf_video_src_init (GstGConfVideoSrc * src, GstGConfVideoSrcClass * g_class) { gst_gconf_video_src_reset (src); src->client = gconf_client_get_default (); gconf_client_add_dir (src->client, GST_GCONF_DIR, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); src->notify_id = gconf_client_notify_add (src->client, GST_GCONF_DIR "/" GST_GCONF_VIDEOSRC_KEY, cb_toggle_element, src, NULL, NULL); } static void gst_gconf_video_src_dispose (GObject * object) { GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (object); if (src->client) { if (src->notify_id != 0) gconf_client_notify_remove (src->client, src->notify_id); g_object_unref (G_OBJECT (src->client)); src->client = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static void gst_gconf_video_src_finalize (GstGConfVideoSrc * src) { g_free (src->gconf_str); GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (src))); } static gboolean do_toggle_element (GstGConfVideoSrc * src) { GstElement *new_kid; gchar *new_gconf_str; new_gconf_str = gst_gconf_get_string (GST_GCONF_VIDEOSRC_KEY); if (new_gconf_str != NULL && src->gconf_str != NULL && (strlen (new_gconf_str) == 0 || strcmp (src->gconf_str, new_gconf_str) == 0)) { g_free (new_gconf_str); GST_DEBUG_OBJECT (src, "GConf key was updated, but it didn't change"); return TRUE; } GST_DEBUG_OBJECT (src, "GConf key changed: '%s' to '%s'", GST_STR_NULL (src->gconf_str), GST_STR_NULL (new_gconf_str)); GST_DEBUG_OBJECT (src, "Creating new kid"); if (!(new_kid = gst_gconf_get_default_video_src ())) { GST_ELEMENT_ERROR (src, LIBRARY, SETTINGS, (NULL), ("Failed to render video src from GConf")); return FALSE; } if (!gst_switch_src_set_child (GST_SWITCH_SRC (src), new_kid)) { GST_WARNING_OBJECT (src, "Failed to update child element"); goto fail; } g_free (src->gconf_str); src->gconf_str = new_gconf_str; GST_DEBUG_OBJECT (src, "done changing gconf video src"); return TRUE; fail: g_free (new_gconf_str); return FALSE; } static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data) { do_toggle_element (GST_GCONF_VIDEO_SRC (data)); } static GstStateChangeReturn gst_gconf_video_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstGConfVideoSrc *src = GST_GCONF_VIDEO_SRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!do_toggle_element (src)) { gst_gconf_video_src_reset (src); return GST_STATE_CHANGE_FAILURE; } break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (!gst_gconf_video_src_reset (src)) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/gconf/gstgconfvideosink.h0000644000175000017500000000377211671175352017613 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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_GCONF_VIDEO_SINK_H__ #define __GST_GCONF_VIDEO_SINK_H__ #include #include #include "gstswitchsink.h" G_BEGIN_DECLS #define GST_TYPE_GCONF_VIDEO_SINK \ (gst_gconf_video_sink_get_type ()) #define GST_GCONF_VIDEO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_VIDEO_SINK, \ GstGConfVideoSink)) #define GST_GCONF_VIDEO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_VIDEO_SINK, \ GstGConfVideoSinkClass)) #define GST_IS_GCONF_VIDEO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_VIDEO_SINK)) #define GST_IS_GCONF_VIDEO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_VIDEO_SINK)) typedef struct _GstGConfVideoSink { GstSwitchSink parent; /* explicit pointers to stuff used */ GConfClient *client; /* gconf notify id */ guint notify_id; /* Current gconf string */ gchar *gconf_str; } GstGConfVideoSink; typedef struct _GstGConfVideoSinkClass { GstSwitchSinkClass parent_class; } GstGConfVideoSinkClass; GType gst_gconf_video_sink_get_type (void); G_END_DECLS #endif /* __GST_GCONF_VIDEO_SINK_H__ */ gst-plugins-good-0.10.31/ext/gconf/gstgconfvideosrc.h0000644000175000017500000000376111671175352017434 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2005 Tim-Philipp Müller * * 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_GCONF_VIDEO_SRC_H__ #define __GST_GCONF_VIDEO_SRC_H__ #include #include #include "gstswitchsrc.h" G_BEGIN_DECLS #define GST_TYPE_GCONF_VIDEO_SRC (gst_gconf_video_src_get_type ()) #define GST_GCONF_VIDEO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_VIDEO_SRC, GstGConfVideoSrc)) #define GST_GCONF_VIDEO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_VIDEO_SRC, GstGConfVideoSrcClass)) #define GST_IS_GCONF_VIDEO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_VIDEO_SRC)) #define GST_IS_GCONF_VIDEO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_VIDEO_SRC)) typedef struct _GstGConfVideoSrc { GstSwitchSrc parent; /* explicit pointers to stuff used */ GConfClient *client; /* gconf key notification id */ guint notify_id; /* Current gconf string */ gchar *gconf_str; } GstGConfVideoSrc; typedef struct _GstGConfVideoSrcClass { GstSwitchSrcClass parent_class; } GstGConfVideoSrcClass; GType gst_gconf_video_src_get_type (void); G_END_DECLS #endif /* __GST_GCONF_VIDEO_SRC_H__ */ gst-plugins-good-0.10.31/ext/gconf/gstgconfelements.h0000644000175000017500000000200311671175352017416 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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_GCONF_ELEMENTS_H__ #define __GST_GCONF_ELEMENTS_H__ #include "gstgconf.h" GST_DEBUG_CATEGORY_EXTERN (gconf_debug); #define GST_CAT_DEFAULT gconf_debug #endif /* __GST_GCONF_ELEMENTS_H__ */ gst-plugins-good-0.10.31/ext/gconf/gstgconfvideosink.c0000644000175000017500000001353111671175352017600 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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-gconfvideosink * * This element outputs video to the videosink that has been configured in * GConf by the user. * * * Example launch line * |[ * gst-launch filesrc location=foo.ogg ! decodebin ! ffmpegcolorspace ! gconfvideosink * ]| Play on configured videosink * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstgconfelements.h" #include "gstgconfvideosink.h" static void gst_gconf_video_sink_dispose (GObject * object); static void gst_gconf_video_sink_finalize (GstGConfVideoSink * sink); static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data); static GstStateChangeReturn gst_gconf_video_sink_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstGConfVideoSink, gst_gconf_video_sink, GstSwitchSink, GST_TYPE_SWITCH_SINK); static void gst_gconf_video_sink_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (eklass, "GConf video sink", "Sink/Video", "Video sink embedding the GConf-settings for video output", "GStreamer maintainers "); } static void gst_gconf_video_sink_class_init (GstGConfVideoSinkClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); oklass->dispose = gst_gconf_video_sink_dispose; oklass->finalize = (GObjectFinalizeFunc) gst_gconf_video_sink_finalize; eklass->change_state = gst_gconf_video_sink_change_state; } /* * Hack to make negotiation work. */ static void gst_gconf_video_sink_reset (GstGConfVideoSink * sink) { gst_switch_sink_set_child (GST_SWITCH_SINK (sink), NULL); g_free (sink->gconf_str); sink->gconf_str = NULL; } static void gst_gconf_video_sink_init (GstGConfVideoSink * sink, GstGConfVideoSinkClass * g_class) { gst_gconf_video_sink_reset (sink); sink->client = gconf_client_get_default (); gconf_client_add_dir (sink->client, GST_GCONF_DIR, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); sink->notify_id = gconf_client_notify_add (sink->client, GST_GCONF_DIR "/" GST_GCONF_VIDEOSINK_KEY, cb_toggle_element, sink, NULL, NULL); } static void gst_gconf_video_sink_dispose (GObject * object) { GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (object); if (sink->client) { if (sink->notify_id != 0) gconf_client_notify_remove (sink->client, sink->notify_id); g_object_unref (G_OBJECT (sink->client)); sink->client = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static void gst_gconf_video_sink_finalize (GstGConfVideoSink * sink) { g_free (sink->gconf_str); GST_CALL_PARENT (G_OBJECT_CLASS, finalize, ((GObject *) (sink))); } static gboolean do_change_child (GstGConfVideoSink * sink) { gchar *new_gconf_str; GstElement *new_kid; new_gconf_str = gst_gconf_get_string (GST_GCONF_VIDEOSINK_KEY); GST_LOG_OBJECT (sink, "old gconf string: %s", GST_STR_NULL (sink->gconf_str)); GST_LOG_OBJECT (sink, "new gconf string: %s", GST_STR_NULL (new_gconf_str)); if (new_gconf_str != NULL && sink->gconf_str != NULL && (strlen (new_gconf_str) == 0 || strcmp (sink->gconf_str, new_gconf_str) == 0)) { g_free (new_gconf_str); GST_DEBUG_OBJECT (sink, "GConf key was updated, but it didn't change. Ignoring"); return TRUE; } GST_DEBUG_OBJECT (sink, "GConf key changed: '%s' to '%s'", GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str)); GST_DEBUG_OBJECT (sink, "Creating new kid"); if (!(new_kid = gst_gconf_get_default_video_sink ())) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render video sink from GConf")); return FALSE; } if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { GST_WARNING_OBJECT (sink, "Failed to update child element"); goto fail; } g_free (sink->gconf_str); sink->gconf_str = new_gconf_str; GST_DEBUG_OBJECT (sink, "done changing gconf video sink"); return TRUE; fail: g_free (new_gconf_str); return FALSE; } static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data) { do_change_child (GST_GCONF_VIDEO_SINK (data)); } static GstStateChangeReturn gst_gconf_video_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstGConfVideoSink *sink = GST_GCONF_VIDEO_SINK (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!do_change_child (sink)) { gst_gconf_video_sink_reset (sink); return GST_STATE_CHANGE_FAILURE; } break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_gconf_video_sink_reset (sink); break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/gconf/gstswitchsrc.c0000644000175000017500000002011211677341654016600 00000000000000/* GStreamer * Copyright (c) 2005 Ronald S. Bultje * Copyright (c) 2006 Jürg Billeter * Copyright (c) 2007 Jan Schmidt * Copyright (c) 2010 Sebastian Dröge * * 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 #include "gstswitchsrc.h" GST_DEBUG_CATEGORY_STATIC (switch_debug); #define GST_CAT_DEFAULT switch_debug static void gst_switch_src_dispose (GObject * object); static GstStateChangeReturn gst_switch_src_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstSwitchSrc, gst_switch_src, GstBin, GST_TYPE_BIN); static void gst_switch_src_base_init (gpointer klass) { GST_DEBUG_CATEGORY_INIT (switch_debug, "switchsrc", 0, "switchsrc element"); } static void gst_switch_src_class_init (GstSwitchSrcClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GstPadTemplate *child_pad_templ; oklass->dispose = gst_switch_src_dispose; eklass->change_state = gst_switch_src_change_state; /* Provide a default pad template if the child didn't */ child_pad_templ = gst_element_class_get_pad_template (eklass, "src"); if (child_pad_templ == NULL) { gst_element_class_add_static_pad_template (eklass, &src_template); } } static gboolean gst_switch_src_reset (GstSwitchSrc * src) { /* this will install fakesrc if no other child has been set, * otherwise we rely on the subclass to know when to unset its * custom kid */ if (src->kid == NULL) { return gst_switch_src_set_child (src, NULL); } return TRUE; } static void gst_switch_src_init (GstSwitchSrc * src, GstSwitchSrcClass * g_class) { GstElementClass *eklass = GST_ELEMENT_GET_CLASS (src); GstPadTemplate *templ; templ = gst_element_class_get_pad_template (eklass, "src"); src->pad = gst_ghost_pad_new_no_target_from_template ("src", templ); gst_element_add_pad (GST_ELEMENT (src), src->pad); gst_switch_src_reset (src); GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } static void gst_switch_src_dispose (GObject * object) { GstSwitchSrc *src = GST_SWITCH_SRC (object); GstObject *new_kid, *kid; GST_OBJECT_LOCK (src); new_kid = GST_OBJECT_CAST (src->new_kid); src->new_kid = NULL; kid = GST_OBJECT_CAST (src->kid); src->kid = NULL; GST_OBJECT_UNLOCK (src); gst_object_replace (&new_kid, NULL); gst_object_replace (&kid, NULL); GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static gboolean gst_switch_src_commit_new_kid (GstSwitchSrc * src) { GstPad *targetpad; GstState kid_state; GstElement *new_kid, *old_kid; gboolean is_fakesrc = FALSE; GstBus *bus; /* need locking around member accesses */ GST_OBJECT_LOCK (src); /* If we're currently changing state, set the child to the next state * we're transitioning too, rather than our current state which is * about to change */ if (GST_STATE_NEXT (src) != GST_STATE_VOID_PENDING) kid_state = GST_STATE_NEXT (src); else kid_state = GST_STATE (src); new_kid = src->new_kid ? gst_object_ref (src->new_kid) : NULL; src->new_kid = NULL; GST_OBJECT_UNLOCK (src); /* Fakesrc by default if NULL is passed as the new child */ if (new_kid == NULL) { GST_DEBUG_OBJECT (src, "Replacing kid with fakesrc"); new_kid = gst_element_factory_make ("fakesrc", "testsrc"); if (new_kid == NULL) { GST_ERROR_OBJECT (src, "Failed to create fakesrc"); return FALSE; } /* Add a reference, as it would if the element came from src->new_kid */ gst_object_ref (new_kid); is_fakesrc = TRUE; } else { GST_DEBUG_OBJECT (src, "Setting new kid"); } /* set temporary bus of our own to catch error messages from the child * (could we just set our own bus on it, or would the state change messages * from the not-yet-added element confuse the state change algorithm? Let's * play it safe for now) */ bus = gst_bus_new (); gst_element_set_bus (new_kid, bus); gst_object_unref (bus); if (gst_element_set_state (new_kid, kid_state) == GST_STATE_CHANGE_FAILURE) { GstMessage *msg; /* check if child posted an error message and if so re-post it on our bus * so that the application gets to see a decent error and not our generic * fallback error message which is completely indecipherable to the user */ msg = gst_bus_pop_filtered (GST_ELEMENT_BUS (new_kid), GST_MESSAGE_ERROR); if (msg) { GST_INFO_OBJECT (src, "Forwarding kid error: %" GST_PTR_FORMAT, msg); gst_element_post_message (GST_ELEMENT (src), msg); } GST_ELEMENT_ERROR (src, CORE, STATE_CHANGE, (NULL), ("Failed to set state on new child.")); gst_element_set_bus (new_kid, NULL); gst_object_unref (new_kid); return FALSE; } gst_element_set_bus (new_kid, NULL); gst_bin_add (GST_BIN (src), new_kid); /* Now, replace the existing child */ GST_OBJECT_LOCK (src); old_kid = src->kid; src->kid = new_kid; /* Mark whether a custom kid or fakesrc has been installed */ src->have_kid = !is_fakesrc; GST_OBJECT_UNLOCK (src); /* kill old element */ if (old_kid) { GST_DEBUG_OBJECT (src, "Removing old kid %" GST_PTR_FORMAT, old_kid); gst_element_set_state (old_kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (src), old_kid); gst_object_unref (old_kid); /* Don't lose the SOURCE flag */ GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } /* re-attach ghostpad */ GST_DEBUG_OBJECT (src, "Creating new ghostpad"); targetpad = gst_element_get_static_pad (src->kid, "src"); gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); gst_object_unref (targetpad); GST_DEBUG_OBJECT (src, "done changing child of switchsrc"); return TRUE; } gboolean gst_switch_src_set_child (GstSwitchSrc * src, GstElement * new_kid) { GstState cur, next; GstElement **p_kid; /* Nothing to do if clearing the child and we've already installed fakesrc */ if (new_kid == NULL && src->kid != NULL && src->have_kid == FALSE) return TRUE; /* Store the new kid to be committed later */ GST_OBJECT_LOCK (src); cur = GST_STATE (src); next = GST_STATE_NEXT (src); p_kid = &src->new_kid; gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); GST_OBJECT_UNLOCK (src); if (new_kid) gst_object_unref (new_kid); /* Sometime, it would be lovely to allow src changes even when * already running */ /* FIXME: Block the pad and replace the kid when it completes */ if (cur > GST_STATE_READY || next == GST_STATE_PAUSED) { GST_DEBUG_OBJECT (src, "Switch-src is already running. Ignoring change of child."); gst_object_unref (new_kid); return TRUE; } return gst_switch_src_commit_new_kid (src); } static GstStateChangeReturn gst_switch_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstSwitchSrc *src = GST_SWITCH_SRC (element); ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (!gst_switch_src_reset (src)) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/gconf/Makefile.in0000644000175000017500000011231211720560226015741 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/gconf DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstgconfelements_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstgconfelements_la_OBJECTS = \ libgstgconfelements_la-gstgconfaudiosink.lo \ libgstgconfelements_la-gstgconfaudiosrc.lo \ libgstgconfelements_la-gstgconfelements.lo \ libgstgconfelements_la-gstgconfvideosink.lo \ libgstgconfelements_la-gstgconfvideosrc.lo \ libgstgconfelements_la-gstswitchsink.lo \ libgstgconfelements_la-gstswitchsrc.lo \ libgstgconfelements_la-gstgconf.lo libgstgconfelements_la_OBJECTS = $(am_libgstgconfelements_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstgconfelements_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) \ $(libgstgconfelements_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstgconfelements_la_SOURCES) DIST_SOURCES = $(libgstgconfelements_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstgconfelements.la libgstgconfelements_la_SOURCES = \ gstgconfaudiosink.c \ gstgconfaudiosrc.c \ gstgconfelements.c \ gstgconfvideosink.c \ gstgconfvideosrc.c \ gstswitchsink.c \ gstswitchsrc.c \ gstgconf.c DIR_CFLAGS = -DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\" libgstgconfelements_la_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS) libgstgconfelements_la_LIBADD = $(GST_LIBS) $(GCONF_LIBS) libgstgconfelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgconfelements_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstgconfaudiosink.h \ gstgconfaudiosrc.h \ gstgconfelements.h \ gstgconfvideosink.h \ gstgconfvideosrc.h \ gstswitchsink.h \ gstswitchsrc.h \ gstgconf.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/gconf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/gconf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstgconfelements.la: $(libgstgconfelements_la_OBJECTS) $(libgstgconfelements_la_DEPENDENCIES) $(EXTRA_libgstgconfelements_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstgconfelements_la_LINK) -rpath $(plugindir) $(libgstgconfelements_la_OBJECTS) $(libgstgconfelements_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfelements.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstswitchsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstgconfelements_la-gstgconfaudiosink.lo: gstgconfaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Tpo -c -o libgstgconfelements_la-gstgconfaudiosink.lo `test -f 'gstgconfaudiosink.c' || echo '$(srcdir)/'`gstgconfaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfaudiosink.c' object='libgstgconfelements_la-gstgconfaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfaudiosink.lo `test -f 'gstgconfaudiosink.c' || echo '$(srcdir)/'`gstgconfaudiosink.c libgstgconfelements_la-gstgconfaudiosrc.lo: gstgconfaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Tpo -c -o libgstgconfelements_la-gstgconfaudiosrc.lo `test -f 'gstgconfaudiosrc.c' || echo '$(srcdir)/'`gstgconfaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfaudiosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfaudiosrc.c' object='libgstgconfelements_la-gstgconfaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfaudiosrc.lo `test -f 'gstgconfaudiosrc.c' || echo '$(srcdir)/'`gstgconfaudiosrc.c libgstgconfelements_la-gstgconfelements.lo: gstgconfelements.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfelements.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfelements.Tpo -c -o libgstgconfelements_la-gstgconfelements.lo `test -f 'gstgconfelements.c' || echo '$(srcdir)/'`gstgconfelements.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfelements.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfelements.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfelements.c' object='libgstgconfelements_la-gstgconfelements.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfelements.lo `test -f 'gstgconfelements.c' || echo '$(srcdir)/'`gstgconfelements.c libgstgconfelements_la-gstgconfvideosink.lo: gstgconfvideosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfvideosink.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Tpo -c -o libgstgconfelements_la-gstgconfvideosink.lo `test -f 'gstgconfvideosink.c' || echo '$(srcdir)/'`gstgconfvideosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfvideosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfvideosink.c' object='libgstgconfelements_la-gstgconfvideosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfvideosink.lo `test -f 'gstgconfvideosink.c' || echo '$(srcdir)/'`gstgconfvideosink.c libgstgconfelements_la-gstgconfvideosrc.lo: gstgconfvideosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconfvideosrc.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Tpo -c -o libgstgconfelements_la-gstgconfvideosrc.lo `test -f 'gstgconfvideosrc.c' || echo '$(srcdir)/'`gstgconfvideosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconfvideosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconfvideosrc.c' object='libgstgconfelements_la-gstgconfvideosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconfvideosrc.lo `test -f 'gstgconfvideosrc.c' || echo '$(srcdir)/'`gstgconfvideosrc.c libgstgconfelements_la-gstswitchsink.lo: gstswitchsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstswitchsink.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstswitchsink.Tpo -c -o libgstgconfelements_la-gstswitchsink.lo `test -f 'gstswitchsink.c' || echo '$(srcdir)/'`gstswitchsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstswitchsink.Tpo $(DEPDIR)/libgstgconfelements_la-gstswitchsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstswitchsink.c' object='libgstgconfelements_la-gstswitchsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstswitchsink.lo `test -f 'gstswitchsink.c' || echo '$(srcdir)/'`gstswitchsink.c libgstgconfelements_la-gstswitchsrc.lo: gstswitchsrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstswitchsrc.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Tpo -c -o libgstgconfelements_la-gstswitchsrc.lo `test -f 'gstswitchsrc.c' || echo '$(srcdir)/'`gstswitchsrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Tpo $(DEPDIR)/libgstgconfelements_la-gstswitchsrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstswitchsrc.c' object='libgstgconfelements_la-gstswitchsrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstswitchsrc.lo `test -f 'gstswitchsrc.c' || echo '$(srcdir)/'`gstswitchsrc.c libgstgconfelements_la-gstgconf.lo: gstgconf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -MT libgstgconfelements_la-gstgconf.lo -MD -MP -MF $(DEPDIR)/libgstgconfelements_la-gstgconf.Tpo -c -o libgstgconfelements_la-gstgconf.lo `test -f 'gstgconf.c' || echo '$(srcdir)/'`gstgconf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgconfelements_la-gstgconf.Tpo $(DEPDIR)/libgstgconfelements_la-gstgconf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgconf.c' object='libgstgconfelements_la-gstgconf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgconfelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgconfelements_la_CFLAGS) $(CFLAGS) -c -o libgstgconfelements_la-gstgconf.lo `test -f 'gstgconf.c' || echo '$(srcdir)/'`gstgconf.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/gconf/gstgconfelements.c0000644000175000017500000000364411671175352017425 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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 #include "gstgconfelements.h" #include "gstgconfaudiosink.h" #include "gstgconfaudiosrc.h" #include "gstgconfvideosink.h" #include "gstgconfvideosrc.h" GST_DEBUG_CATEGORY (gconf_debug); static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gconf_debug, "gconf", 0, "GConf/GStreamer audio/video output wrapper elements"); if (!gst_element_register (plugin, "gconfvideosink", GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SINK) || !gst_element_register (plugin, "gconfvideosrc", GST_RANK_NONE, GST_TYPE_GCONF_VIDEO_SRC) || !gst_element_register (plugin, "gconfaudiosink", GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SINK) || !gst_element_register (plugin, "gconfaudiosrc", GST_RANK_NONE, GST_TYPE_GCONF_AUDIO_SRC)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "gconfelements", "elements wrapping the GStreamer/GConf audio/video output settings", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/gconf/gstswitchsink.c0000644000175000017500000002051611677341654016765 00000000000000/* GStreamer * Copyright (c) 2005 Ronald S. Bultje * Copyright (c) 2006 Jürg Billeter * Copyright (c) 2007 Jan Schmidt * * 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 #include "gstswitchsink.h" GST_DEBUG_CATEGORY_STATIC (switch_debug); #define GST_CAT_DEFAULT switch_debug static void gst_switch_sink_dispose (GObject * object); static GstStateChangeReturn gst_switch_sink_change_state (GstElement * element, GstStateChange transition); enum { PROP_0 }; GST_BOILERPLATE (GstSwitchSink, gst_switch_sink, GstBin, GST_TYPE_BIN); static void gst_switch_sink_base_init (gpointer klass) { GST_DEBUG_CATEGORY_INIT (switch_debug, "switchsink", 0, "switchsink element"); } static void gst_switch_sink_class_init (GstSwitchSinkClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GstPadTemplate *child_pad_templ; oklass->dispose = gst_switch_sink_dispose; eklass->change_state = gst_switch_sink_change_state; /* Provide a default pad template if the child didn't */ child_pad_templ = gst_element_class_get_pad_template (eklass, "sink"); if (child_pad_templ == NULL) { gst_element_class_add_static_pad_template (eklass, &sink_template); } } static gboolean gst_switch_sink_reset (GstSwitchSink * sink) { /* this will install fakesink if no other child has been set, * otherwise we rely on the subclass to know when to unset its * custom kid */ if (sink->kid == NULL) { return gst_switch_sink_set_child (sink, NULL); } return TRUE; } static void gst_switch_sink_init (GstSwitchSink * sink, GstSwitchSinkClass * g_class) { GstElementClass *eklass = GST_ELEMENT_GET_CLASS (sink); GstPadTemplate *templ; templ = gst_element_class_get_pad_template (eklass, "sink"); sink->pad = gst_ghost_pad_new_no_target_from_template ("sink", templ); gst_element_add_pad (GST_ELEMENT (sink), sink->pad); gst_switch_sink_reset (sink); GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } static void gst_switch_sink_dispose (GObject * object) { GstSwitchSink *sink = GST_SWITCH_SINK (object); GstObject *new_kid, *kid; GST_OBJECT_LOCK (sink); new_kid = GST_OBJECT_CAST (sink->new_kid); sink->new_kid = NULL; kid = GST_OBJECT_CAST (sink->kid); sink->kid = NULL; GST_OBJECT_UNLOCK (sink); gst_object_replace (&new_kid, NULL); gst_object_replace (&kid, NULL); GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static gboolean gst_switch_sink_commit_new_kid (GstSwitchSink * sink) { GstPad *targetpad; GstState kid_state; GstElement *new_kid, *old_kid; gboolean is_fakesink = FALSE; GstBus *bus; /* need locking around member accesses */ GST_OBJECT_LOCK (sink); /* If we're currently changing state, set the child to the next state * we're transitioning too, rather than our current state which is * about to change */ if (GST_STATE_NEXT (sink) != GST_STATE_VOID_PENDING) kid_state = GST_STATE_NEXT (sink); else kid_state = GST_STATE (sink); new_kid = sink->new_kid ? gst_object_ref (sink->new_kid) : NULL; sink->new_kid = NULL; GST_OBJECT_UNLOCK (sink); /* Fakesink by default if NULL is passed as the new child */ if (new_kid == NULL) { GST_DEBUG_OBJECT (sink, "Replacing kid with fakesink"); new_kid = gst_element_factory_make ("fakesink", "testsink"); if (new_kid == NULL) { GST_ERROR_OBJECT (sink, "Failed to create fakesink"); return FALSE; } /* Add a reference, as it would if the element came from sink->new_kid */ gst_object_ref (new_kid); g_object_set (new_kid, "sync", TRUE, NULL); is_fakesink = TRUE; } else { GST_DEBUG_OBJECT (sink, "Setting new kid"); } /* set temporary bus of our own to catch error messages from the child * (could we just set our own bus on it, or would the state change messages * from the not-yet-added element confuse the state change algorithm? Let's * play it safe for now) */ bus = gst_bus_new (); gst_element_set_bus (new_kid, bus); gst_object_unref (bus); if (gst_element_set_state (new_kid, kid_state) == GST_STATE_CHANGE_FAILURE) { GstMessage *msg; /* check if child posted an error message and if so re-post it on our bus * so that the application gets to see a decent error and not our generic * fallback error message which is completely indecipherable to the user */ msg = gst_bus_pop_filtered (GST_ELEMENT_BUS (new_kid), GST_MESSAGE_ERROR); if (msg) { GST_INFO_OBJECT (sink, "Forwarding kid error: %" GST_PTR_FORMAT, msg); gst_element_post_message (GST_ELEMENT (sink), msg); } GST_ELEMENT_ERROR (sink, CORE, STATE_CHANGE, (NULL), ("Failed to set state on new child.")); gst_element_set_bus (new_kid, NULL); gst_object_unref (new_kid); return FALSE; } gst_element_set_bus (new_kid, NULL); gst_bin_add (GST_BIN (sink), new_kid); /* Now, replace the existing child */ GST_OBJECT_LOCK (sink); old_kid = sink->kid; sink->kid = new_kid; /* Mark whether a custom kid or fakesink has been installed */ sink->have_kid = !is_fakesink; GST_OBJECT_UNLOCK (sink); /* kill old element */ if (old_kid) { GST_DEBUG_OBJECT (sink, "Removing old kid %" GST_PTR_FORMAT, old_kid); gst_element_set_state (old_kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (sink), old_kid); gst_object_unref (old_kid); /* Don't lose the SINK flag */ GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } /* re-attach ghostpad */ GST_DEBUG_OBJECT (sink, "Creating new ghostpad"); targetpad = gst_element_get_static_pad (sink->kid, "sink"); gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); gst_object_unref (targetpad); GST_DEBUG_OBJECT (sink, "done changing child of switchsink"); /* FIXME: Push new-segment info and pre-roll buffer(s) into the kid */ return TRUE; } gboolean gst_switch_sink_set_child (GstSwitchSink * sink, GstElement * new_kid) { GstState cur, next; GstElement **p_kid; /* Nothing to do if clearing the child and we've already installed fakesink */ if (new_kid == NULL && sink->kid != NULL && sink->have_kid == FALSE) return TRUE; /* Store the new kid to be committed later */ GST_OBJECT_LOCK (sink); cur = GST_STATE (sink); next = GST_STATE_NEXT (sink); p_kid = &sink->new_kid; gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); GST_OBJECT_UNLOCK (sink); if (new_kid) gst_object_unref (new_kid); /* Sometime, it would be lovely to allow sink changes even when * already running, but this involves sending an appropriate new-segment * and possibly prerolling etc */ /* FIXME: Block the pad and replace the kid when it completes */ if (cur > GST_STATE_READY || next == GST_STATE_PAUSED) { GST_DEBUG_OBJECT (sink, "Switch-sink is already running. Ignoring change of child."); gst_object_unref (new_kid); return TRUE; } return gst_switch_sink_commit_new_kid (sink); } static GstStateChangeReturn gst_switch_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstSwitchSink *sink = GST_SWITCH_SINK (element); ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (!gst_switch_sink_reset (sink)) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; } gst-plugins-good-0.10.31/ext/gconf/gstgconfaudiosink.h0000644000175000017500000000377311671175352017607 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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_GCONF_AUDIO_SINK_H__ #define __GST_GCONF_AUDIO_SINK_H__ #include #include #include "gstswitchsink.h" G_BEGIN_DECLS #define GST_TYPE_GCONF_AUDIO_SINK \ (gst_gconf_audio_sink_get_type ()) #define GST_GCONF_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GCONF_AUDIO_SINK, \ GstGConfAudioSink)) #define GST_GCONF_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GCONF_AUDIO_SINK, \ GstGConfAudioSinkClass)) #define GST_IS_GCONF_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GCONF_AUDIO_SINK)) #define GST_IS_GCONF_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GCONF_AUDIO_SINK)) typedef struct _GstGConfAudioSink { GstSwitchSink parent; /* explicit pointers to stuff used */ GConfClient *client; GstGConfProfile profile; guint notify_id; /* Current gconf string */ gchar *gconf_str; } GstGConfAudioSink; typedef struct _GstGConfAudioSinkClass { GstSwitchSinkClass parent_class; } GstGConfAudioSinkClass; GType gst_gconf_audio_sink_get_type (void); G_END_DECLS #endif /* __GST_GCONF_AUDIO_SINK_H__ */ gst-plugins-good-0.10.31/ext/taglib/0000755000175000017500000000000011720565322014124 500000000000000gst-plugins-good-0.10.31/ext/taglib/gstapev2mux.h0000644000175000017500000000342511671175352016513 00000000000000/* GStreamer taglib-based APEv2 muxer * Copyright (C) 2006 Christophe Fergeau * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Sebastian Dröge * * 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_APEV2_MUX_H #define GST_APEV2_MUX_H #include "gsttaglibmux.h" G_BEGIN_DECLS typedef struct _GstApev2Mux GstApev2Mux; typedef struct _GstApev2MuxClass GstApev2MuxClass; struct _GstApev2Mux { GstTagLibMux taglibmux; }; struct _GstApev2MuxClass { GstTagLibMuxClass taglibmux_class; }; #define GST_TYPE_APEV2_MUX \ (gst_apev2_mux_get_type()) #define GST_APEV2_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_APEV2_MUX,GstApev2Mux)) #define GST_APEV2_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_APEV2_MUX,GstApev2MuxClass)) #define GST_IS_APEV2_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_APEV2_MUX)) #define GST_IS_APEV2_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_APEV2_MUX)) GType gst_apev2_mux_get_type (void); G_END_DECLS #endif /* GST_APEV2_MUX_H */ gst-plugins-good-0.10.31/ext/taglib/gstapev2mux.cc0000644000175000017500000003021311677341654016652 00000000000000/* GStreamer taglib-based APEv2 muxer * Copyright (C) 2006 Christophe Fergeau * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Sebastian Dröge * * 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-apev2mux * @see_also: #GstTagSetter * * This element adds APEv2 tags to the beginning of a stream using the taglib * library. * * Applications can set the tags to write using the #GstTagSetter interface. * Tags sent by upstream elements will be picked up automatically (and merged * according to the merge mode set via the tag setter interface). * * * Example pipelines * |[ * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! apev2mux ! filesink location=foo.mp3 * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with an * APEv2 that contains the same as the the Ogg/Vorbis file. Make sure the * Ogg/Vorbis file actually has comments to preserve. * |[ * gst-launch -m filesrc location=foo.mp3 ! apedemux ! fakesink silent=TRUE 2> /dev/null | grep taglist * ]| Verify that tags have been written. * */ #ifdef HAVE_CONFIG_H #include #endif #include "gstapev2mux.h" #include #include #include using namespace TagLib; GST_DEBUG_CATEGORY_STATIC (gst_apev2_mux_debug); #define GST_CAT_DEFAULT gst_apev2_mux_debug static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-apetag")); GST_BOILERPLATE (GstApev2Mux, gst_apev2_mux, GstTagLibMux, GST_TYPE_TAG_LIB_MUX); static GstBuffer *gst_apev2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist); static void gst_apev2_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "TagLib-based APEv2 Muxer", "Formatter/Metadata", "Adds an APEv2 header to the beginning of files using taglib", "Sebastian Dröge "); GST_DEBUG_CATEGORY_INIT (gst_apev2_mux_debug, "apev2mux", 0, "taglib-based APEv2 tag muxer"); } static void gst_apev2_mux_class_init (GstApev2MuxClass * klass) { GST_TAG_LIB_MUX_CLASS (klass)->render_tag = GST_DEBUG_FUNCPTR (gst_apev2_mux_render_tag); } static void gst_apev2_mux_init (GstApev2Mux * apev2mux, GstApev2MuxClass * apev2mux_class) { /* nothing to do */ } static void add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) { APE::Tag * apev2tag = (APE::Tag *) user_data; gboolean result; /* FIXME: if there are several values set for the same tag, this won't * work, only the first value will be taken into account */ if (strcmp (tag, GST_TAG_TITLE) == 0) { const char *title; result = gst_tag_list_peek_string_index (list, tag, 0, &title); if (result != FALSE) { GST_DEBUG ("Setting title to %s", title); apev2tag->setTitle (String (title, String::UTF8)); } } else if (strcmp (tag, GST_TAG_ALBUM) == 0) { const char *album; result = gst_tag_list_peek_string_index (list, tag, 0, &album); if (result != FALSE) { GST_DEBUG ("Setting album to %s", album); apev2tag->setAlbum (String (album, String::UTF8)); } } else if (strcmp (tag, GST_TAG_ARTIST) == 0) { const char *artist; result = gst_tag_list_peek_string_index (list, tag, 0, &artist); if (result != FALSE) { GST_DEBUG ("Setting artist to %s", artist); apev2tag->setArtist (String (artist, String::UTF8)); } } else if (strcmp (tag, GST_TAG_COMPOSER) == 0) { const char *composer; result = gst_tag_list_peek_string_index (list, tag, 0, &composer); if (result != FALSE) { GST_DEBUG ("Setting composer to %s", composer); apev2tag->addValue (String ("COMPOSER", String::UTF8), String (composer, String::UTF8)); } } else if (strcmp (tag, GST_TAG_GENRE) == 0) { const char *genre; result = gst_tag_list_peek_string_index (list, tag, 0, &genre); if (result != FALSE) { GST_DEBUG ("Setting genre to %s", genre); apev2tag->setGenre (String (genre, String::UTF8)); } } else if (strcmp (tag, GST_TAG_COMMENT) == 0) { const char *comment; result = gst_tag_list_peek_string_index (list, tag, 0, &comment); if (result != FALSE) { GST_DEBUG ("Setting comment to %s", comment); apev2tag->setComment (String (comment, String::UTF8)); } } else if (strcmp (tag, GST_TAG_DATE) == 0) { GDate *date; result = gst_tag_list_get_date_index (list, tag, 0, &date); if (result != FALSE) { GDateYear year; year = g_date_get_year (date); GST_DEBUG ("Setting track year to %d", year); apev2tag->setYear (year); g_date_free (date); } } else if (strcmp (tag, GST_TAG_TRACK_NUMBER) == 0) { guint track_number; result = gst_tag_list_get_uint_index (list, tag, 0, &track_number); if (result != FALSE) { guint total_tracks; result = gst_tag_list_get_uint_index (list, GST_TAG_TRACK_COUNT, 0, &total_tracks); if (result) { gchar *tag_str; tag_str = g_strdup_printf ("%d/%d", track_number, total_tracks); GST_DEBUG ("Setting track number to %s", tag_str); apev2tag->addValue (String ("TRACK", String::UTF8), String (tag_str, String::UTF8), true); g_free (tag_str); } else { GST_DEBUG ("Setting track number to %d", track_number); apev2tag->setTrack (track_number); } } } else if (strcmp (tag, GST_TAG_TRACK_COUNT) == 0) { guint n; if (gst_tag_list_get_uint_index (list, GST_TAG_TRACK_NUMBER, 0, &n)) { GST_DEBUG ("track-count handled with track-number, skipping"); } else if (gst_tag_list_get_uint_index (list, GST_TAG_TRACK_COUNT, 0, &n)) { gchar *tag_str; tag_str = g_strdup_printf ("0/%d", n); GST_DEBUG ("Setting track number to %s", tag_str); apev2tag->addValue (String ("TRACK", String::UTF8), String (tag_str, String::UTF8), true); g_free (tag_str); } #if 0 } else if (strcmp (tag, GST_TAG_ALBUM_VOLUME_NUMBER) == 0) { guint volume_number; result = gst_tag_list_get_uint_index (list, tag, 0, &volume_number); if (result != FALSE) { guint volume_count; gchar *tag_str; result = gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_COUNT, 0, &volume_count); if (result) { tag_str = g_strdup_printf ("CD %d/%d", volume_number, volume_count); } else { tag_str = g_strdup_printf ("CD %d", volume_number); } GST_DEBUG ("Setting album number to %s", tag_str); apev2tag->addValue (String ("MEDIA", String::UTF8), String (tag_str, String::UTF8), true); g_free (tag_str); } } else if (strcmp (tag, GST_TAG_ALBUM_VOLUME_COUNT) == 0) { guint n; if (gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_NUMBER, 0, &n)) { GST_DEBUG ("volume-count handled with volume-number, skipping"); } else if (gst_tag_list_get_uint_index (list, GST_TAG_ALBUM_VOLUME_COUNT, 0, &n)) { gchar *tag_str; tag_str = g_strdup_printf ("CD 0/%u", n); GST_DEBUG ("Setting album volume number/count to %s", tag_str); apev2tag->addValue (String ("MEDIA", String::UTF8), String (tag_str, String::UTF8), true); g_free (tag_str); } #endif } else if (strcmp (tag, GST_TAG_COPYRIGHT) == 0) { const gchar *copyright; result = gst_tag_list_peek_string_index (list, tag, 0, ©right); if (result != FALSE) { GST_DEBUG ("Setting copyright to %s", copyright); apev2tag->addValue (String ("COPYRIGHT", String::UTF8), String (copyright, String::UTF8), true); } } else if (strcmp (tag, GST_TAG_LOCATION) == 0) { const gchar *location; result = gst_tag_list_peek_string_index (list, tag, 0, &location); if (result != FALSE) { GST_DEBUG ("Setting location to %s", location); apev2tag->addValue (String ("FILE", String::UTF8), String (location, String::UTF8), true); } } else if (strcmp (tag, GST_TAG_ISRC) == 0) { const gchar *isrc; result = gst_tag_list_peek_string_index (list, tag, 0, &isrc); if (result != FALSE) { GST_DEBUG ("Setting ISRC to %s", isrc); apev2tag->addValue (String ("ISRC", String::UTF8), String (isrc, String::UTF8), true); } } else if (strcmp (tag, GST_TAG_TRACK_GAIN) == 0) { gdouble value; result = gst_tag_list_get_double_index (list, tag, 0, &value); if (result != FALSE) { gchar *track_gain = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); track_gain = g_ascii_dtostr (track_gain, G_ASCII_DTOSTR_BUF_SIZE, value); GST_DEBUG ("Setting track gain to %s", track_gain); apev2tag->addValue (String ("REPLAYGAIN_TRACK_GAIN", String::UTF8), String (track_gain, String::UTF8), true); g_free (track_gain); } } else if (strcmp (tag, GST_TAG_TRACK_PEAK) == 0) { gdouble value; result = gst_tag_list_get_double_index (list, tag, 0, &value); if (result != FALSE) { gchar *track_peak = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); track_peak = g_ascii_dtostr (track_peak, G_ASCII_DTOSTR_BUF_SIZE, value); GST_DEBUG ("Setting track peak to %s", track_peak); apev2tag->addValue (String ("REPLAYGAIN_TRACK_PEAK", String::UTF8), String (track_peak, String::UTF8), true); g_free (track_peak); } } else if (strcmp (tag, GST_TAG_ALBUM_GAIN) == 0) { gdouble value; result = gst_tag_list_get_double_index (list, tag, 0, &value); if (result != FALSE) { gchar *album_gain = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); album_gain = g_ascii_dtostr (album_gain, G_ASCII_DTOSTR_BUF_SIZE, value); GST_DEBUG ("Setting album gain to %s", album_gain); apev2tag->addValue (String ("REPLAYGAIN_ALBUM_GAIN", String::UTF8), String (album_gain, String::UTF8), true); g_free (album_gain); } } else if (strcmp (tag, GST_TAG_ALBUM_PEAK) == 0) { gdouble value; result = gst_tag_list_get_double_index (list, tag, 0, &value); if (result != FALSE) { gchar *album_peak = (gchar *) g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); album_peak = g_ascii_dtostr (album_peak, G_ASCII_DTOSTR_BUF_SIZE, value); GST_DEBUG ("Setting album peak to %s", album_peak); apev2tag->addValue (String ("REPLAYGAIN_ALBUM_PEAK", String::UTF8), String (album_peak, String::UTF8), true); g_free (album_peak); } } else { GST_WARNING ("Unsupported tag: %s", tag); } } static GstBuffer * gst_apev2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist) { APE::Tag apev2tag; ByteVector rendered_tag; GstBuffer *buf; guint tag_size; /* Render the tag */ gst_tag_list_foreach (taglist, add_one_tag, &apev2tag); rendered_tag = apev2tag.render (); tag_size = rendered_tag.size (); GST_LOG_OBJECT (mux, "tag size = %d bytes", tag_size); /* Create buffer with tag */ buf = gst_buffer_new_and_alloc (tag_size); memcpy (GST_BUFFER_DATA (buf), rendered_tag.data (), tag_size); gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad)); return buf; } gboolean gst_apev2_mux_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "apev2mux", GST_RANK_NONE, GST_TYPE_APEV2_MUX)) return FALSE; return TRUE; } gst-plugins-good-0.10.31/ext/taglib/Makefile.am0000644000175000017500000000107511671175352016110 00000000000000plugin_LTLIBRARIES = libgsttaglib.la libgsttaglib_la_SOURCES = gsttaglibmux.c gstid3v2mux.cc gstapev2mux.cc libgsttaglib_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(TAGLIB_CFLAGS) libgsttaglib_la_CXXFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CXXFLAGS) \ $(TAGLIB_CXXFLAGS) libgsttaglib_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ $(GST_LIBS) \ $(TAGLIB_LIBS) libgsttaglib_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsttaglib_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsttaglibmux.h gstid3v2mux.h gstapev2mux.h gst-plugins-good-0.10.31/ext/taglib/gsttaglibmux.h0000644000175000017500000000460711671175352016743 00000000000000/* GStreamer taglib-based muxer base class * Copyright (C) 2006 Christophe Fergeau * Copyright (C) 2006 Tim-Philipp Müller * 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_TAG_LIB_MUX_H #define GST_TAG_LIB_MUX_H #include G_BEGIN_DECLS typedef struct _GstTagLibMux GstTagLibMux; typedef struct _GstTagLibMuxClass GstTagLibMuxClass; /* Definition of structure storing data for this element. */ struct _GstTagLibMux { GstElement element; GstPad *srcpad; GstPad *sinkpad; GstTagList *event_tags; /* tags received from upstream elements */ gsize tag_size; gboolean render_tag; GstEvent *newsegment_ev; /* cached newsegment event from upstream */ }; /* Standard definition defining a class for this element. */ struct _GstTagLibMuxClass { GstElementClass parent_class; /* vfuncs */ GstBuffer * (*render_tag) (GstTagLibMux * mux, GstTagList * tag_list); }; /* Standard macros for defining types for this element. */ #define GST_TYPE_TAG_LIB_MUX \ (gst_tag_lib_mux_get_type()) #define GST_TAG_LIB_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_LIB_MUX,GstTagLibMux)) #define GST_TAG_LIB_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_LIB_MUX,GstTagLibMuxClass)) #define GST_IS_TAG_LIB_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_LIB_MUX)) #define GST_IS_TAG_LIB_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_LIB_MUX)) /* Standard function returning type information. */ GType gst_tag_lib_mux_get_type (void); gboolean gst_apev2_mux_plugin_init (GstPlugin * plugin); gboolean gst_id3v2_mux_plugin_init (GstPlugin * plugin); G_END_DECLS #endif gst-plugins-good-0.10.31/ext/taglib/gstid3v2mux.h0000644000175000017500000000332311671175352016422 00000000000000/* GStreamer taglib-based ID3v2 muxer * Copyright (C) 2006 Christophe Fergeau * Copyright (C) 2006 Tim-Philipp Müller * * 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_ID3V2_MUX_H #define GST_ID3V2_MUX_H #include "gsttaglibmux.h" G_BEGIN_DECLS typedef struct _GstId3v2Mux GstId3v2Mux; typedef struct _GstId3v2MuxClass GstId3v2MuxClass; struct _GstId3v2Mux { GstTagLibMux taglibmux; }; struct _GstId3v2MuxClass { GstTagLibMuxClass taglibmux_class; }; #define GST_TYPE_ID3V2_MUX \ (gst_id3v2_mux_get_type()) #define GST_ID3V2_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3V2_MUX,GstId3v2Mux)) #define GST_ID3V2_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3V2_MUX,GstId3v2MuxClass)) #define GST_IS_ID3V2_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3V2_MUX)) #define GST_IS_ID3V2_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3V2_MUX)) GType gst_id3v2_mux_get_type (void); G_END_DECLS #endif /* GST_ID3V2_MUX_H */ gst-plugins-good-0.10.31/ext/taglib/gsttaglibmux.c0000644000175000017500000002674711677341654016755 00000000000000/* GStreamer taglib-based muxer base class * Copyright (C) 2006 Christophe Fergeau * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Sebastian Dröge * 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 #endif #include #include #include #include "gsttaglibmux.h" GST_DEBUG_CATEGORY_STATIC (gst_tag_lib_mux_debug); #define GST_CAT_DEFAULT gst_tag_lib_mux_debug static GstStaticPadTemplate gst_tag_lib_mux_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY")); static void gst_tag_lib_mux_iface_init (GType taglib_type) { static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; g_type_add_interface_static (taglib_type, GST_TYPE_TAG_SETTER, &tag_setter_info); } GST_BOILERPLATE_FULL (GstTagLibMux, gst_tag_lib_mux, GstElement, GST_TYPE_ELEMENT, gst_tag_lib_mux_iface_init); static GstStateChangeReturn gst_tag_lib_mux_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_tag_lib_mux_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_tag_lib_mux_sink_event (GstPad * pad, GstEvent * event); static void gst_tag_lib_mux_finalize (GObject * obj) { GstTagLibMux *mux = GST_TAG_LIB_MUX (obj); if (mux->newsegment_ev) { gst_event_unref (mux->newsegment_ev); mux->newsegment_ev = NULL; } if (mux->event_tags) { gst_tag_list_free (mux->event_tags); mux->event_tags = NULL; } G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_tag_lib_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_tag_lib_mux_sink_template); GST_DEBUG_CATEGORY_INIT (gst_tag_lib_mux_debug, "taglibmux", 0, "taglib-based muxer"); } static void gst_tag_lib_mux_class_init (GstTagLibMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_tag_lib_mux_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_tag_lib_mux_change_state); } static void gst_tag_lib_mux_init (GstTagLibMux * mux, GstTagLibMuxClass * mux_class) { GstElementClass *element_klass = GST_ELEMENT_CLASS (mux_class); GstPadTemplate *tmpl; /* pad through which data comes in to the element */ mux->sinkpad = gst_pad_new_from_static_template (&gst_tag_lib_mux_sink_template, "sink"); gst_pad_set_chain_function (mux->sinkpad, GST_DEBUG_FUNCPTR (gst_tag_lib_mux_chain)); gst_pad_set_event_function (mux->sinkpad, GST_DEBUG_FUNCPTR (gst_tag_lib_mux_sink_event)); gst_element_add_pad (GST_ELEMENT (mux), mux->sinkpad); /* pad through which data goes out of the element */ tmpl = gst_element_class_get_pad_template (element_klass, "src"); if (tmpl) { mux->srcpad = gst_pad_new_from_template (tmpl, "src"); gst_pad_use_fixed_caps (mux->srcpad); gst_pad_set_caps (mux->srcpad, gst_pad_template_get_caps (tmpl)); gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); } mux->render_tag = TRUE; } static GstBuffer * gst_tag_lib_mux_render_tag (GstTagLibMux * mux) { GstTagLibMuxClass *klass; GstTagMergeMode merge_mode; GstTagSetter *tagsetter; GstBuffer *buffer; const GstTagList *tagsetter_tags; GstTagList *taglist; GstEvent *event; tagsetter = GST_TAG_SETTER (mux); tagsetter_tags = gst_tag_setter_get_tag_list (tagsetter); merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter); GST_LOG_OBJECT (mux, "merging tags, merge mode = %d", merge_mode); GST_LOG_OBJECT (mux, "event tags: %" GST_PTR_FORMAT, mux->event_tags); GST_LOG_OBJECT (mux, "set tags: %" GST_PTR_FORMAT, tagsetter_tags); taglist = gst_tag_list_merge (tagsetter_tags, mux->event_tags, merge_mode); GST_LOG_OBJECT (mux, "final tags: %" GST_PTR_FORMAT, taglist); klass = GST_TAG_LIB_MUX_CLASS (G_OBJECT_GET_CLASS (mux)); if (klass->render_tag == NULL) goto no_vfunc; buffer = klass->render_tag (mux, taglist); if (buffer == NULL) goto render_error; mux->tag_size = GST_BUFFER_SIZE (buffer); GST_LOG_OBJECT (mux, "tag size = %" G_GSIZE_FORMAT " bytes", mux->tag_size); /* Send newsegment event from byte position 0, so the tag really gets * written to the start of the file, independent of the upstream segment */ gst_pad_push_event (mux->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); /* Send an event about the new tags to downstream elements */ /* gst_event_new_tag takes ownership of the list, so no need to unref it */ event = gst_event_new_tag (taglist); gst_pad_push_event (mux->srcpad, event); GST_BUFFER_OFFSET (buffer) = 0; return buffer; no_vfunc: { GST_ERROR_OBJECT (mux, "Subclass does not implement render_tag vfunc!"); gst_tag_list_free (taglist); return NULL; } render_error: { GST_ERROR_OBJECT (mux, "Failed to render tag"); gst_tag_list_free (taglist); return NULL; } } static GstEvent * gst_tag_lib_mux_adjust_event_offsets (GstTagLibMux * mux, const GstEvent * newsegment_event) { GstFormat format; gint64 start, stop, cur; gst_event_parse_new_segment ((GstEvent *) newsegment_event, NULL, NULL, &format, &start, &stop, &cur); g_assert (format == GST_FORMAT_BYTES); if (start != -1) start += mux->tag_size; if (stop != -1) stop += mux->tag_size; if (cur != -1) cur += mux->tag_size; GST_DEBUG_OBJECT (mux, "adjusting newsegment event offsets to start=%" G_GINT64_FORMAT ", stop=%" G_GINT64_FORMAT ", cur=%" G_GINT64_FORMAT " (delta = +%" G_GSIZE_FORMAT ")", start, stop, cur, mux->tag_size); return gst_event_new_new_segment (TRUE, 1.0, format, start, stop, cur); } static GstFlowReturn gst_tag_lib_mux_chain (GstPad * pad, GstBuffer * buffer) { GstTagLibMux *mux = GST_TAG_LIB_MUX (GST_OBJECT_PARENT (pad)); if (mux->render_tag) { GstFlowReturn ret; GstBuffer *tag_buffer; GST_INFO_OBJECT (mux, "Adding tags to stream"); tag_buffer = gst_tag_lib_mux_render_tag (mux); if (tag_buffer == NULL) goto no_tag_buffer; ret = gst_pad_push (mux->srcpad, tag_buffer); if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (mux, "flow: %s", gst_flow_get_name (ret)); gst_buffer_unref (buffer); return ret; } /* Now send the cached newsegment event that we got from upstream */ if (mux->newsegment_ev) { GST_DEBUG_OBJECT (mux, "sending cached newsegment event"); gst_pad_push_event (mux->srcpad, gst_tag_lib_mux_adjust_event_offsets (mux, mux->newsegment_ev)); gst_event_unref (mux->newsegment_ev); mux->newsegment_ev = NULL; } else { /* upstream sent no newsegment event or only one in a non-BYTE format */ } mux->render_tag = FALSE; } buffer = gst_buffer_make_metadata_writable (buffer); if (GST_BUFFER_OFFSET (buffer) != GST_BUFFER_OFFSET_NONE) { GST_LOG_OBJECT (mux, "Adjusting buffer offset from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET (buffer) + mux->tag_size); GST_BUFFER_OFFSET (buffer) += mux->tag_size; } gst_buffer_set_caps (buffer, GST_PAD_CAPS (mux->srcpad)); return gst_pad_push (mux->srcpad, buffer); /* ERRORS */ no_tag_buffer: { GST_ELEMENT_ERROR (mux, LIBRARY, ENCODE, (NULL), (NULL)); return GST_FLOW_ERROR; } } static gboolean gst_tag_lib_mux_sink_event (GstPad * pad, GstEvent * event) { GstTagLibMux *mux; gboolean result; mux = GST_TAG_LIB_MUX (gst_pad_get_parent (pad)); result = FALSE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ GstTagList *tags; gst_event_parse_tag (event, &tags); GST_INFO_OBJECT (mux, "Got tag event: %" GST_PTR_FORMAT, tags); if (mux->event_tags != NULL) { gst_tag_list_insert (mux->event_tags, tags, GST_TAG_MERGE_REPLACE); } else { mux->event_tags = gst_tag_list_copy (tags); } GST_INFO_OBJECT (mux, "Event tags are now: %" GST_PTR_FORMAT, mux->event_tags); /* just drop the event, we'll push a new tag event in render_tag */ gst_event_unref (event); result = TRUE; break; } case GST_EVENT_NEWSEGMENT:{ GstFormat fmt; gst_event_parse_new_segment (event, NULL, NULL, &fmt, NULL, NULL, NULL); if (fmt != GST_FORMAT_BYTES) { GST_WARNING_OBJECT (mux, "dropping newsegment event in %s format", gst_format_get_name (fmt)); gst_event_unref (event); break; } if (mux->render_tag) { /* we have not rendered the tag yet, which means that we don't know * how large it is going to be yet, so we can't adjust the offsets * here at this point and need to cache the newsegment event for now * (also, there could be tag events coming after this newsegment event * and before the first buffer). */ if (mux->newsegment_ev) { GST_WARNING_OBJECT (mux, "discarding old cached newsegment event"); gst_event_unref (mux->newsegment_ev); } GST_LOG_OBJECT (mux, "caching newsegment event for later"); mux->newsegment_ev = event; } else { GST_DEBUG_OBJECT (mux, "got newsegment event, adjusting offsets"); gst_pad_push_event (mux->srcpad, gst_tag_lib_mux_adjust_event_offsets (mux, event)); gst_event_unref (event); } event = NULL; result = TRUE; break; } default: result = gst_pad_event_default (pad, event); break; } gst_object_unref (mux); return result; } static GstStateChangeReturn gst_tag_lib_mux_change_state (GstElement * element, GstStateChange transition) { GstTagLibMux *mux; GstStateChangeReturn result; mux = GST_TAG_LIB_MUX (element); result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (result != GST_STATE_CHANGE_SUCCESS) { return result; } switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY:{ if (mux->newsegment_ev) { gst_event_unref (mux->newsegment_ev); mux->newsegment_ev = NULL; } if (mux->event_tags) { gst_tag_list_free (mux->event_tags); mux->event_tags = NULL; } mux->tag_size = 0; mux->render_tag = TRUE; break; } default: break; } return result; } static gboolean plugin_init (GstPlugin * plugin) { return (gst_id3v2_mux_plugin_init (plugin) && gst_apev2_mux_plugin_init (plugin)); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "taglib", "Tag writing plug-in based on taglib", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/ext/taglib/gstid3v2mux.cc0000644000175000017500000005736111677341654016601 00000000000000/* GStreamer taglib-based ID3v2 muxer * Copyright (C) 2006 Christophe Fergeau * Copyright (C) 2006 Tim-Philipp Müller * * 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-id3v2mux * @see_also: #GstID3Demux, #GstTagSetter * * This element adds ID3v2 tags to the beginning of a stream using the taglib * library. More precisely, the tags written are ID3 version 2.4.0 tags (which * means in practice that some hardware players or outdated programs might not * be able to read them properly). * * Applications can set the tags to write using the #GstTagSetter interface. * Tags sent by upstream elements will be picked up automatically (and merged * according to the merge mode set via the tag setter interface). * * * Example pipelines * |[ * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3v2mux ! filesink location=foo.mp3 * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with an * ID3v2 that contains the same as the the Ogg/Vorbis file. Make sure the * Ogg/Vorbis file actually has comments to preserve. * |[ * gst-launch -m filesrc location=foo.mp3 ! id3demux ! fakesink silent=TRUE 2> /dev/null | grep taglist * ]| Verify that tags have been written. * */ #ifdef HAVE_CONFIG_H #include #endif #include "gstid3v2mux.h" #include #include #include #include #include #include #include #include #include #include using namespace TagLib; GST_DEBUG_CATEGORY_STATIC (gst_id3v2_mux_debug); #define GST_CAT_DEFAULT gst_id3v2_mux_debug static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-id3")); GST_BOILERPLATE (GstId3v2Mux, gst_id3v2_mux, GstTagLibMux, GST_TYPE_TAG_LIB_MUX); static GstBuffer *gst_id3v2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist); static void gst_id3v2_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "TagLib-based ID3v2 Muxer", "Formatter/Metadata", "Adds an ID3v2 header to the beginning of MP3 files using taglib", "Christophe Fergeau "); GST_DEBUG_CATEGORY_INIT (gst_id3v2_mux_debug, "id3v2mux", 0, "taglib-based ID3v2 tag muxer"); } static void gst_id3v2_mux_class_init (GstId3v2MuxClass * klass) { GST_TAG_LIB_MUX_CLASS (klass)->render_tag = GST_DEBUG_FUNCPTR (gst_id3v2_mux_render_tag); } static void gst_id3v2_mux_init (GstId3v2Mux * id3v2mux, GstId3v2MuxClass * id3v2mux_class) { /* nothing to do */ } #if 0 static void add_one_txxx_tag (ID3v2::Tag * id3v2tag, const gchar * key, const gchar * val) { ID3v2::UserTextIdentificationFrame * frame; if (val == NULL) return; GST_DEBUG ("Setting %s to %s", key, val); frame = new ID3v2::UserTextIdentificationFrame (String::UTF8); id3v2tag->addFrame (frame); frame->setDescription (key); frame->setText (val); } #endif typedef void (*GstId3v2MuxAddTagFunc) (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * data); static void add_encoder_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * unused) { TagLib::StringList string_list; guint n; /* ENCODER_VERSION is either handled with the ENCODER tag or not at all */ if (strcmp (tag, GST_TAG_ENCODER_VERSION) == 0) return; for (n = 0; n < num_tags; ++n) { gchar *encoder = NULL; if (gst_tag_list_get_string_index (list, tag, n, &encoder) && encoder) { guint encoder_version; gchar *s; if (gst_tag_list_get_uint_index (list, GST_TAG_ENCODER_VERSION, n, &encoder_version) && encoder_version > 0) { s = g_strdup_printf ("%s %u", encoder, encoder_version); } else { s = g_strdup (encoder); } GST_LOG ("encoder[%u] = '%s'", n, s); string_list.append (String (s, String::UTF8)); g_free (s); g_free (encoder); } } if (!string_list.isEmpty ()) { ID3v2::TextIdentificationFrame * f; f = new ID3v2::TextIdentificationFrame ("TSSE", String::UTF8); id3v2tag->addFrame (f); f->setText (string_list); } else { GST_WARNING ("Empty list for tag %s, skipping", tag); } } static void add_date_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * unused) { TagLib::StringList string_list; guint n; GST_LOG ("Adding date frame"); for (n = 0; n < num_tags; ++n) { GDate *date = NULL; if (gst_tag_list_get_date_index (list, tag, n, &date) && date != NULL) { GDateYear year; gchar *s; year = g_date_get_year (date); if (year > 500 && year < 2100) { s = g_strdup_printf ("%u", year); GST_LOG ("%s[%u] = '%s'", tag, n, s); string_list.append (String (s, String::UTF8)); g_free (s); } else { GST_WARNING ("invalid year %u, skipping", year); } g_date_free (date); } } if (!string_list.isEmpty ()) { ID3v2::TextIdentificationFrame * f; f = new ID3v2::TextIdentificationFrame ("TDRC", String::UTF8); id3v2tag->addFrame (f); f->setText (string_list); } else { GST_WARNING ("Empty list for tag %s, skipping", tag); } } static void add_count_or_num_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * frame_id) { static const struct { const gchar *gst_tag; const gchar *corr_count; /* corresponding COUNT tag (if number) */ const gchar *corr_num; /* corresponding NUMBER tag (if count) */ } corr[] = { { GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, NULL}, { GST_TAG_TRACK_COUNT, NULL, GST_TAG_TRACK_NUMBER}, { GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, NULL}, { GST_TAG_ALBUM_VOLUME_COUNT, NULL, GST_TAG_ALBUM_VOLUME_NUMBER} }; guint idx; for (idx = 0; idx < G_N_ELEMENTS (corr); ++idx) { if (strcmp (corr[idx].gst_tag, tag) == 0) break; } g_assert (idx < G_N_ELEMENTS (corr)); g_assert (frame_id && strlen (frame_id) == 4); if (corr[idx].corr_num == NULL) { guint number; /* number tag */ if (gst_tag_list_get_uint_index (list, tag, 0, &number)) { ID3v2::TextIdentificationFrame * frame; gchar *tag_str; guint count; if (gst_tag_list_get_uint_index (list, corr[idx].corr_count, 0, &count)) tag_str = g_strdup_printf ("%u/%u", number, count); else tag_str = g_strdup_printf ("%u", number); GST_DEBUG ("Setting %s to %s (frame_id = %s)", tag, tag_str, frame_id); frame = new ID3v2::TextIdentificationFrame (frame_id, String::UTF8); id3v2tag->addFrame (frame); frame->setText (tag_str); g_free (tag_str); } } else if (corr[idx].corr_count == NULL) { guint count; /* count tag */ if (gst_tag_list_get_uint_index (list, corr[idx].corr_num, 0, &count)) { GST_DEBUG ("%s handled with %s, skipping", tag, corr[idx].corr_num); } else if (gst_tag_list_get_uint_index (list, tag, 0, &count)) { ID3v2::TextIdentificationFrame * frame; gchar *tag_str; tag_str = g_strdup_printf ("0/%u", count); GST_DEBUG ("Setting %s to %s (frame_id = %s)", tag, tag_str, frame_id); frame = new ID3v2::TextIdentificationFrame (frame_id, String::UTF8); id3v2tag->addFrame (frame); frame->setText (tag_str); g_free (tag_str); } } if (num_tags > 1) { GST_WARNING ("more than one %s, can only handle one", tag); } } static void add_unique_file_id_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * unused) { const gchar *origin = "http://musicbrainz.org"; gchar *id_str = NULL; if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { ID3v2::UniqueFileIdentifierFrame * frame; GST_LOG ("Adding %s (%s): %s", tag, origin, id_str); frame = new ID3v2::UniqueFileIdentifierFrame (origin, id_str); id3v2tag->addFrame (frame); g_free (id_str); } } static void add_musicbrainz_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * data) { static const struct { const gchar gst_tag[28]; const gchar spec_id[28]; const gchar realworld_id[28]; } mb_ids[] = { { GST_TAG_MUSICBRAINZ_ARTISTID, "MusicBrainz Artist Id", "musicbrainz_artistid"}, { GST_TAG_MUSICBRAINZ_ALBUMID, "MusicBrainz Album Id", "musicbrainz_albumid"}, { GST_TAG_MUSICBRAINZ_ALBUMARTISTID, "MusicBrainz Album Artist Id", "musicbrainz_albumartistid"}, { GST_TAG_MUSICBRAINZ_TRMID, "MusicBrainz TRM Id", "musicbrainz_trmid"}, { GST_TAG_CDDA_MUSICBRAINZ_DISCID, "MusicBrainz DiscID", "musicbrainz_discid"}, { /* the following one is more or less made up, there seems to be little * evidence that any popular application is actually putting this info * into TXXX frames; the first one comes from a musicbrainz wiki 'proposed * tags' page, the second one is analogue to the vorbis/ape/flac tag. */ GST_TAG_CDDA_CDDB_DISCID, "CDDB DiscID", "discid"} }; guint i, idx; idx = (guint8) data[0]; g_assert (idx < G_N_ELEMENTS (mb_ids)); for (i = 0; i < num_tags; ++i) { ID3v2::UserTextIdentificationFrame * frame; gchar *id_str; if (gst_tag_list_get_string_index (list, tag, 0, &id_str) && id_str) { GST_DEBUG ("Setting '%s' to '%s'", mb_ids[idx].spec_id, id_str); /* add two frames, one with the ID the musicbrainz.org spec mentions * and one with the ID that applications use in the real world */ frame = new ID3v2::UserTextIdentificationFrame (String::Latin1); id3v2tag->addFrame (frame); frame->setDescription (mb_ids[idx].spec_id); frame->setText (id_str); frame = new ID3v2::UserTextIdentificationFrame (String::Latin1); id3v2tag->addFrame (frame); frame->setDescription (mb_ids[idx].realworld_id); frame->setText (id_str); g_free (id_str); } } } static void add_id3v2frame_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * frame_id) { ID3v2::FrameFactory * factory = ID3v2::FrameFactory::instance (); guint i; for (i = 0; i < num_tags; ++i) { ID3v2::Frame * frame; const GValue *val; GstBuffer *buf; val = gst_tag_list_get_value_index (list, tag, i); buf = (GstBuffer *) gst_value_get_mini_object (val); if (buf && GST_BUFFER_CAPS (buf)) { GstStructure *s; gint version = 0; s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); if (s && gst_structure_get_int (s, "version", &version) && version > 0) { ByteVector bytes ((char *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); GST_DEBUG ("Injecting ID3v2.%u frame %u/%u of length %u and type %" GST_PTR_FORMAT, version, i, num_tags, GST_BUFFER_SIZE (buf), s); frame = factory->createFrame (bytes, (TagLib::uint) version); if (frame) id3v2tag->addFrame (frame); } } } } static void add_image_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * unused) { guint n; for (n = 0; n < num_tags; ++n) { const GValue *val; GstBuffer *image; GST_DEBUG ("image %u/%u", n + 1, num_tags); val = gst_tag_list_get_value_index (list, tag, n); image = (GstBuffer *) gst_value_get_mini_object (val); if (GST_IS_BUFFER (image) && GST_BUFFER_SIZE (image) > 0 && GST_BUFFER_CAPS (image) != NULL && !gst_caps_is_empty (GST_BUFFER_CAPS (image))) { const gchar *mime_type; GstStructure *s; s = gst_caps_get_structure (GST_BUFFER_CAPS (image), 0); mime_type = gst_structure_get_name (s); if (mime_type != NULL) { ID3v2::AttachedPictureFrame * frame; const gchar *desc; if (strcmp (mime_type, "text/uri-list") == 0) mime_type = "-->"; frame = new ID3v2::AttachedPictureFrame (); GST_DEBUG ("Attaching picture of %u bytes and mime type %s", GST_BUFFER_SIZE (image), mime_type); id3v2tag->addFrame (frame); frame->setPicture (ByteVector ((const char *) GST_BUFFER_DATA (image), GST_BUFFER_SIZE (image))); frame->setTextEncoding (String::UTF8); frame->setMimeType (mime_type); desc = gst_structure_get_string (s, "image-description"); frame->setDescription ((desc) ? desc : ""); /* FIXME set image type properly from caps */ if (strcmp (tag, GST_TAG_PREVIEW_IMAGE) == 0) { frame->setType (ID3v2::AttachedPictureFrame::FileIcon); } else { frame->setType (ID3v2::AttachedPictureFrame::Other); } } } else { GST_WARNING ("NULL image or no caps on image buffer (%p, caps=%" GST_PTR_FORMAT ")", image, (image) ? GST_BUFFER_CAPS (image) : NULL); } } } static void add_comment_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * unused) { TagLib::StringList string_list; guint n; GST_LOG ("Adding comment frames"); for (n = 0; n < num_tags; ++n) { gchar *s = NULL; if (gst_tag_list_get_string_index (list, tag, n, &s) && s != NULL) { ID3v2::CommentsFrame * f; gchar *desc = NULL, *val = NULL, *lang = NULL; f = new ID3v2::CommentsFrame (String::UTF8); if (strcmp (tag, GST_TAG_COMMENT) == 0 || !gst_tag_parse_extended_comment (s, &desc, &lang, &val, TRUE)) { /* create dummy description to allow for multiple comment frames * (taglib will drop comment frames if descriptions are not unique) */ desc = g_strdup_printf ("c%u", n); val = g_strdup (s); } GST_LOG ("%s[%u] = '%s' (%s|%s|%s)", tag, n, s, GST_STR_NULL (desc), GST_STR_NULL (lang), GST_STR_NULL (val)); f->setDescription (desc); f->setText (val); if (lang) { f->setLanguage (lang); } g_free (lang); g_free (desc); g_free (val); id3v2tag->addFrame (f); } g_free (s); } } static void add_text_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * frame_id) { ID3v2::TextIdentificationFrame * f; TagLib::StringList string_list; guint n; GST_LOG ("Adding '%s' frame", frame_id); for (n = 0; n < num_tags; ++n) { gchar *s = NULL; if (gst_tag_list_get_string_index (list, tag, n, &s) && s != NULL) { GST_LOG ("%s: %s[%u] = '%s'", frame_id, tag, n, s); string_list.append (String (s, String::UTF8)); g_free (s); } } if (!string_list.isEmpty ()) { f = new ID3v2::TextIdentificationFrame (frame_id, String::UTF8); id3v2tag->addFrame (f); f->setText (string_list); } else { GST_WARNING ("Empty list for tag %s, skipping", tag); } } static void add_uri_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * frame_id) { gchar *url = NULL; g_assert (frame_id != NULL); /* URI tags are limited to one of each per taglist */ if (gst_tag_list_get_string_index (list, tag, 0, &url) && url != NULL) { guint url_len; url_len = strlen (url); if (url_len > 0 && gst_uri_is_valid (url)) { ID3v2::FrameFactory * factory = ID3v2::FrameFactory::instance (); ID3v2::Frame * frame; char *data; data = g_new0 (char, 10 + url_len); memcpy (data, frame_id, 4); memcpy (data + 4, ID3v2::SynchData::fromUInt (url_len).data (), 4); memcpy (data + 10, url, url_len); ByteVector bytes (data, 10 + url_len); g_free (data); frame = factory->createFrame (bytes, (TagLib::uint) 4); if (frame) { id3v2tag->addFrame (frame); GST_LOG ("%s: %s = '%s'", frame_id, tag, url); } } else { GST_WARNING ("Tag %s does not contain a valid URI (%s)", tag, url); } g_free (url); } } static void add_relative_volume_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * frame_id) { const char *gain_tag_name; const char *peak_tag_name; gdouble peak_val; gdouble gain_val; ID3v2::RelativeVolumeFrame * frame; frame = new ID3v2::RelativeVolumeFrame (); /* figure out tag names and the identification string to use */ if (strcmp (tag, GST_TAG_TRACK_PEAK) == 0 || strcmp (tag, GST_TAG_TRACK_GAIN) == 0) { gain_tag_name = GST_TAG_TRACK_GAIN; peak_tag_name = GST_TAG_TRACK_PEAK; frame->setIdentification ("track"); GST_DEBUG ("adding track relative-volume frame"); } else { gain_tag_name = GST_TAG_ALBUM_GAIN; peak_tag_name = GST_TAG_ALBUM_PEAK; frame->setIdentification ("album"); GST_DEBUG ("adding album relative-volume frame"); } /* find the value for the paired tag (gain, if this is peak, and * vice versa). if both tags exist, only write the frame when * we're processing the peak tag. */ if (strcmp (tag, GST_TAG_TRACK_PEAK) == 0 || strcmp (tag, GST_TAG_ALBUM_PEAK) == 0) { ID3v2::RelativeVolumeFrame::PeakVolume encoded_peak; short peak_int; gst_tag_list_get_double (list, tag, &peak_val); if (gst_tag_list_get_tag_size (list, gain_tag_name) > 0) { gst_tag_list_get_double (list, gain_tag_name, &gain_val); GST_DEBUG ("setting volume adjustment %g", gain_val); frame->setVolumeAdjustment (gain_val); } /* copying mutagen: always write as 16 bits for sanity. */ peak_int = (short)(peak_val * G_MAXSHORT); encoded_peak.bitsRepresentingPeak = 16; encoded_peak.peakVolume = ByteVector::fromShort(peak_int, true); GST_DEBUG ("setting peak value %g", peak_val); frame->setPeakVolume(encoded_peak); } else { gst_tag_list_get_double (list, tag, &gain_val); GST_DEBUG ("setting volume adjustment %g", gain_val); frame->setVolumeAdjustment (gain_val); if (gst_tag_list_get_tag_size (list, peak_tag_name) != 0) { GST_DEBUG ("both gain and peak tags exist, not adding frame this time around"); delete frame; return; } } id3v2tag->addFrame (frame); } static void add_bpm_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, const gchar * tag, guint num_tags, const gchar * frame_id) { gdouble bpm; if (gst_tag_list_get_double_index (list, tag, 0, &bpm)) { ID3v2::TextIdentificationFrame * frame; gchar *tag_str; tag_str = g_strdup_printf ("%u", (guint)bpm); GST_DEBUG ("Setting %s to %s", tag, tag_str); frame = new ID3v2::TextIdentificationFrame ("TBPM", String::UTF8); id3v2tag->addFrame (frame); frame->setText (tag_str); g_free (tag_str); } } /* id3demux produces these for frames it cannot parse */ #define GST_ID3_DEMUX_TAG_ID3V2_FRAME "private-id3v2-frame" static const struct { const gchar *gst_tag; const GstId3v2MuxAddTagFunc func; const gchar data[5]; } add_funcs[] = { { GST_TAG_ARTIST, add_text_tag, "TPE1"}, { GST_TAG_ALBUM_ARTIST, add_text_tag, "TPE2"}, { GST_TAG_TITLE, add_text_tag, "TIT2"}, { GST_TAG_ALBUM, add_text_tag, "TALB"}, { GST_TAG_COPYRIGHT, add_text_tag, "TCOP"}, { GST_TAG_COMPOSER, add_text_tag, "TCOM"}, { GST_TAG_GENRE, add_text_tag, "TCON"}, { GST_TAG_COMMENT, add_comment_tag, ""}, { GST_TAG_EXTENDED_COMMENT, add_comment_tag, ""}, { GST_TAG_DATE, add_date_tag, ""}, { GST_TAG_IMAGE, add_image_tag, ""}, { GST_TAG_PREVIEW_IMAGE, add_image_tag, ""}, { GST_ID3_DEMUX_TAG_ID3V2_FRAME, add_id3v2frame_tag, ""}, { GST_TAG_MUSICBRAINZ_ARTISTID, add_musicbrainz_tag, "\000"}, { GST_TAG_MUSICBRAINZ_ALBUMID, add_musicbrainz_tag, "\001"}, { GST_TAG_MUSICBRAINZ_ALBUMARTISTID, add_musicbrainz_tag, "\002"}, { GST_TAG_MUSICBRAINZ_TRMID, add_musicbrainz_tag, "\003"}, { GST_TAG_CDDA_MUSICBRAINZ_DISCID, add_musicbrainz_tag, "\004"}, { GST_TAG_CDDA_CDDB_DISCID, add_musicbrainz_tag, "\005"}, { GST_TAG_MUSICBRAINZ_TRACKID, add_unique_file_id_tag, ""}, { GST_TAG_ARTIST_SORTNAME, add_text_tag, "TSOP"}, { GST_TAG_ALBUM_SORTNAME, add_text_tag, "TSOA"}, { GST_TAG_TITLE_SORTNAME, add_text_tag, "TSOT"}, { GST_TAG_TRACK_NUMBER, add_count_or_num_tag, "TRCK"}, { GST_TAG_TRACK_COUNT, add_count_or_num_tag, "TRCK"}, { GST_TAG_ALBUM_VOLUME_NUMBER, add_count_or_num_tag, "TPOS"}, { GST_TAG_ALBUM_VOLUME_COUNT, add_count_or_num_tag, "TPOS"}, { GST_TAG_ENCODER, add_encoder_tag, ""}, { GST_TAG_ENCODER_VERSION, add_encoder_tag, ""}, { GST_TAG_COPYRIGHT_URI, add_uri_tag, "WCOP"}, { GST_TAG_LICENSE_URI, add_uri_tag, "WCOP"}, { GST_TAG_TRACK_PEAK, add_relative_volume_tag, ""}, { GST_TAG_TRACK_GAIN, add_relative_volume_tag, ""}, { GST_TAG_ALBUM_PEAK, add_relative_volume_tag, ""}, { GST_TAG_ALBUM_GAIN, add_relative_volume_tag, ""}, { GST_TAG_BEATS_PER_MINUTE, add_bpm_tag, ""} }; static void foreach_add_tag (const GstTagList * list, const gchar * tag, gpointer userdata) { ID3v2::Tag * id3v2tag = (ID3v2::Tag *) userdata; TagLib::StringList string_list; guint num_tags, i; num_tags = gst_tag_list_get_tag_size (list, tag); GST_LOG ("Processing tag %s (num=%u)", tag, num_tags); if (num_tags > 1 && gst_tag_is_fixed (tag)) { GST_WARNING ("Multiple occurences of fixed tag '%s', ignoring some", tag); num_tags = 1; } for (i = 0; i < G_N_ELEMENTS (add_funcs); ++i) { if (strcmp (add_funcs[i].gst_tag, tag) == 0) { add_funcs[i].func (id3v2tag, list, tag, num_tags, add_funcs[i].data); break; } } if (i == G_N_ELEMENTS (add_funcs)) { GST_WARNING ("Unsupported tag '%s' - not written", tag); } } static GstBuffer * gst_id3v2_mux_render_tag (GstTagLibMux * mux, GstTagList * taglist) { ID3v2::Tag id3v2tag; ByteVector rendered_tag; GstBuffer *buf; guint tag_size; /* write all strings as UTF-8 by default */ TagLib::ID3v2::FrameFactory::instance ()-> setDefaultTextEncoding (TagLib::String::UTF8); /* Render the tag */ gst_tag_list_foreach (taglist, foreach_add_tag, &id3v2tag); #if 0 /* Do we want to add our own signature to the tag somewhere? */ { gchar *tag_producer_str; tag_producer_str = g_strdup_printf ("(GStreamer id3v2mux %s, using " "taglib %u.%u)", VERSION, TAGLIB_MAJOR_VERSION, TAGLIB_MINOR_VERSION); add_one_txxx_tag (id3v2tag, "tag_encoder", tag_producer_str); g_free (tag_producer_str); } #endif rendered_tag = id3v2tag.render (); tag_size = rendered_tag.size (); GST_LOG_OBJECT (mux, "tag size = %d bytes", tag_size); /* Create buffer with tag */ buf = gst_buffer_new_and_alloc (tag_size); memcpy (GST_BUFFER_DATA (buf), rendered_tag.data (), tag_size); gst_buffer_set_caps (buf, GST_PAD_CAPS (mux->srcpad)); return buf; } gboolean gst_id3v2_mux_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "id3v2mux", GST_RANK_NONE, GST_TYPE_ID3V2_MUX)) return FALSE; gst_tag_register_musicbrainz_tags (); return TRUE; } gst-plugins-good-0.10.31/ext/taglib/Makefile.in0000644000175000017500000007712011720560227016117 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/taglib DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgsttaglib_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgsttaglib_la_OBJECTS = libgsttaglib_la-gsttaglibmux.lo \ libgsttaglib_la-gstid3v2mux.lo libgsttaglib_la-gstapev2mux.lo libgsttaglib_la_OBJECTS = $(am_libgsttaglib_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgsttaglib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CXXLD) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) \ $(libgsttaglib_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsttaglib_la_SOURCES) DIST_SOURCES = $(libgsttaglib_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgsttaglib.la libgsttaglib_la_SOURCES = gsttaglibmux.c gstid3v2mux.cc gstapev2mux.cc libgsttaglib_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(TAGLIB_CFLAGS) libgsttaglib_la_CXXFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CXXFLAGS) \ $(TAGLIB_CXXFLAGS) libgsttaglib_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ $(GST_LIBS) \ $(TAGLIB_LIBS) libgsttaglib_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsttaglib_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsttaglibmux.h gstid3v2mux.h gstapev2mux.h all: all-am .SUFFIXES: .SUFFIXES: .c .cc .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/taglib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/taglib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsttaglib.la: $(libgsttaglib_la_OBJECTS) $(libgsttaglib_la_DEPENDENCIES) $(EXTRA_libgsttaglib_la_DEPENDENCIES) $(AM_V_CXXLD)$(libgsttaglib_la_LINK) -rpath $(plugindir) $(libgsttaglib_la_OBJECTS) $(libgsttaglib_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttaglib_la-gstapev2mux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttaglib_la-gstid3v2mux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsttaglib_la-gsttaglibmux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgsttaglib_la-gsttaglibmux.lo: gsttaglibmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CFLAGS) $(CFLAGS) -MT libgsttaglib_la-gsttaglibmux.lo -MD -MP -MF $(DEPDIR)/libgsttaglib_la-gsttaglibmux.Tpo -c -o libgsttaglib_la-gsttaglibmux.lo `test -f 'gsttaglibmux.c' || echo '$(srcdir)/'`gsttaglibmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttaglib_la-gsttaglibmux.Tpo $(DEPDIR)/libgsttaglib_la-gsttaglibmux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttaglibmux.c' object='libgsttaglib_la-gsttaglibmux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CFLAGS) $(CFLAGS) -c -o libgsttaglib_la-gsttaglibmux.lo `test -f 'gsttaglibmux.c' || echo '$(srcdir)/'`gsttaglibmux.c .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libgsttaglib_la-gstid3v2mux.lo: gstid3v2mux.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -MT libgsttaglib_la-gstid3v2mux.lo -MD -MP -MF $(DEPDIR)/libgsttaglib_la-gstid3v2mux.Tpo -c -o libgsttaglib_la-gstid3v2mux.lo `test -f 'gstid3v2mux.cc' || echo '$(srcdir)/'`gstid3v2mux.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttaglib_la-gstid3v2mux.Tpo $(DEPDIR)/libgsttaglib_la-gstid3v2mux.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstid3v2mux.cc' object='libgsttaglib_la-gstid3v2mux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -c -o libgsttaglib_la-gstid3v2mux.lo `test -f 'gstid3v2mux.cc' || echo '$(srcdir)/'`gstid3v2mux.cc libgsttaglib_la-gstapev2mux.lo: gstapev2mux.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -MT libgsttaglib_la-gstapev2mux.lo -MD -MP -MF $(DEPDIR)/libgsttaglib_la-gstapev2mux.Tpo -c -o libgsttaglib_la-gstapev2mux.lo `test -f 'gstapev2mux.cc' || echo '$(srcdir)/'`gstapev2mux.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsttaglib_la-gstapev2mux.Tpo $(DEPDIR)/libgsttaglib_la-gstapev2mux.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gstapev2mux.cc' object='libgsttaglib_la-gstapev2mux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgsttaglib_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsttaglib_la_CXXFLAGS) $(CXXFLAGS) -c -o libgsttaglib_la-gstapev2mux.lo `test -f 'gstapev2mux.cc' || echo '$(srcdir)/'`gstapev2mux.cc mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/dv/0000755000175000017500000000000011720565321013272 500000000000000gst-plugins-good-0.10.31/ext/dv/gstdvdemux.h0000644000175000017500000000515111671175352015565 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_DVDEMUX_H__ #define __GST_DVDEMUX_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_DVDEMUX \ (gst_dvdemux_get_type()) #define GST_DVDEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVDEMUX,GstDVDemux)) #define GST_DVDEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVDEMUX,GstDVDemuxClass)) #define GST_IS_DVDEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVDEMUX)) #define GST_IS_DVDEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVDEMUX)) typedef struct _GstDVDemux GstDVDemux; typedef struct _GstDVDemuxClass GstDVDemuxClass; typedef gboolean (*GstDVDemuxSeekHandler) (GstDVDemux *demux, GstPad * pad, GstEvent * event); struct _GstDVDemux { GstElement element; GstPad *sinkpad; GstPad *videosrcpad; GstPad *audiosrcpad; dv_decoder_t *decoder; GstAdapter *adapter; gint frame_len; /* video params */ gint framerate_numerator; gint framerate_denominator; gint height; gboolean wide; /* audio params */ gint frequency; gint channels; gint framecount; gint64 frame_offset; gint64 audio_offset; gint64 video_offset; GstDVDemuxSeekHandler seek_handler; GstSegment byte_segment; GstSegment time_segment; gboolean running; gboolean need_segment; gboolean new_media; int frames_since_new_media; gint found_header; /* ATOMIC */ GstEvent *seek_event; GstEvent *pending_segment; gint16 *audio_buffers[4]; }; struct _GstDVDemuxClass { GstElementClass parent_class; }; GType gst_dvdemux_get_type (void); G_END_DECLS #endif /* __GST_DVDEMUX_H__ */ gst-plugins-good-0.10.31/ext/dv/Makefile.am0000644000175000017500000000131011671175352015247 00000000000000plugin_LTLIBRARIES = libgstdv.la libgstdv_la_SOURCES = gstdv.c gstdvdec.c gstdvdemux.c gstsmptetimecode.c libgstdv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) libgstdv_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBDV_LIBS) libgstdv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdv_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstdvdemux.h gstdvdec.h gstsmptetimecode.h EXTRA_DIST = NOTES noinst_PROGRAMS = smpte_test smpte_test_SOURCES = smpte_test.c gstsmptetimecode.c smpte_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) smpte_test_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) gst-plugins-good-0.10.31/ext/dv/NOTES0000644000175000017500000000140111671175352014027 00000000000000Packets come from 1394 480 bytes at a time. This is not a video segment length. This causes problems, since a packet boundary crossing a video segment can split a video segment if we lose an iso packet. We can recover from this, sorta, with significant changes to the parser. We have to deal with the idea that a) some macroblocks just don't exist (we have zero's for them) and b) when any of the 5 macroblocks doesn't exist, we can't do pass 3. Since things are bitstream-based, we can deal with this, but we have to add a layer of code that tries to save time (maybe) by not decoding things that don't exist. Not sure how this is gonna work with the parse code being based on video segments, and not easily splittable into macroblock-level parsing (or is it?). gst-plugins-good-0.10.31/ext/dv/gstdv.c0000644000175000017500000000273711671175352014524 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2005> Wim Taymans * * 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 "gstdvdec.h" #include "gstdvdemux.h" static gboolean plugin_init (GstPlugin * plugin) { dv_init (0, 0); if (!gst_element_register (plugin, "dvdemux", GST_RANK_PRIMARY, gst_dvdemux_get_type ())) return FALSE; if (!gst_element_register (plugin, "dvdec", GST_RANK_MARGINAL, gst_dvdec_get_type ())) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "dv", "DV demuxer and decoder based on libdv (libdv.sf.net)", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/ext/dv/gstdvdec.h0000644000175000017500000000440311671175352015175 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_DVDEC_H__ #define __GST_DVDEC_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_DVDEC \ (gst_dvdec_get_type()) #define GST_DVDEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DVDEC,GstDVDec)) #define GST_DVDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DVDEC,GstDVDecClass)) #define GST_IS_DVDEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DVDEC)) #define GST_IS_DVDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVDEC)) typedef struct _GstDVDec GstDVDec; typedef struct _GstDVDecClass GstDVDecClass; struct _GstDVDec { GstElement element; GstPad *sinkpad; GstPad *srcpad; dv_decoder_t *decoder; gboolean clamp_luma; gboolean clamp_chroma; gint quality; gboolean PAL; gboolean interlaced; gboolean wide; gint frame_len; /* input caps */ gboolean sink_negotiated; gint framerate_numerator; gint framerate_denominator; gint height; gint par_x; gint par_y; gboolean need_par; /* negotiated output */ dv_color_space_t space; gint bpp; gboolean src_negotiated; gint video_offset; gint drop_factor; GstSegment *segment; }; struct _GstDVDecClass { GstElementClass parent_class; }; GType gst_dvdec_get_type (void); G_END_DECLS #endif /* __GST_DVDEC_H__ */ gst-plugins-good-0.10.31/ext/dv/gstdvdemux.c0000644000175000017500000016150011677341654015567 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2005> Wim Taymans * * 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 /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include #include "gstdvdemux.h" #include "gstsmptetimecode.h" /** * SECTION:element-dvdemux * * dvdemux splits raw DV into its audio and video components. The audio will be * decoded raw samples and the video will be encoded DV video. * * This element can operate in both push and pull mode depending on the * capabilities of the upstream peer. * * * Example launch line * |[ * gst-launch filesrc location=test.dv ! dvdemux name=demux ! queue ! audioconvert ! alsasink demux. ! queue ! dvdec ! xvimagesink * ]| This pipeline decodes and renders the raw DV stream to an audio and a videosink. * * * Last reviewed on 2006-02-27 (0.10.3) */ /* DV output has two modes, normal and wide. The resolution is the same in both * cases: 720 pixels wide by 576 pixels tall in PAL format, and 720x480 for * NTSC. * * Each of the modes has its own pixel aspect ratio, which is fixed in practice * by ITU-R BT.601 (also known as "CCIR-601" or "Rec.601"). Or so claims a * reference that I culled from the reliable "internet", * http://www.mir.com/DMG/aspect.html. Normal PAL is 59/54 and normal NTSC is * 10/11. Because the pixel resolution is the same for both cases, we can get * the pixel aspect ratio for wide recordings by multiplying by the ratio of * display aspect ratios, 16/9 (for wide) divided by 4/3 (for normal): * * Wide NTSC: 10/11 * (16/9)/(4/3) = 40/33 * Wide PAL: 59/54 * (16/9)/(4/3) = 118/81 * * However, the pixel resolution coming out of a DV source does not combine with * the standard pixel aspect ratios to give a proper display aspect ratio. An * image 480 pixels tall, with a 4:3 display aspect ratio, will be 768 pixels * wide. But, if we take the normal PAL aspect ratio of 59/54, and multiply it * with the width of the DV image (720 pixels), we get 786.666..., which is * nonintegral and too wide. The camera is not outputting a 4:3 image. * * If the video sink for this stream has fixed dimensions (such as for * fullscreen playback, or for a java applet in a web page), you then have two * choices. Either you show the whole image, but pad the image with black * borders on the top and bottom (like watching a widescreen video on a 4:3 * device), or you crop the video to the proper ratio. Apparently the latter is * the standard practice. * * For its part, GStreamer is concerned with accuracy and preservation of * information. This element outputs the 720x576 or 720x480 video that it * recieves, noting the proper aspect ratio. This should not be a problem for * windowed applications, which can change size to fit the video. Applications * with fixed size requirements should decide whether to crop or pad which * an element such as videobox can do. */ #define NTSC_HEIGHT 480 #define NTSC_BUFFER 120000 #define NTSC_FRAMERATE_NUMERATOR 30000 #define NTSC_FRAMERATE_DENOMINATOR 1001 #define PAL_HEIGHT 576 #define PAL_BUFFER 144000 #define PAL_FRAMERATE_NUMERATOR 25 #define PAL_FRAMERATE_DENOMINATOR 1 #define PAL_NORMAL_PAR_X 59 #define PAL_NORMAL_PAR_Y 54 #define PAL_WIDE_PAR_X 118 #define PAL_WIDE_PAR_Y 81 #define NTSC_NORMAL_PAR_X 10 #define NTSC_NORMAL_PAR_Y 11 #define NTSC_WIDE_PAR_X 40 #define NTSC_WIDE_PAR_Y 33 GST_DEBUG_CATEGORY_STATIC (dvdemux_debug); #define GST_CAT_DEFAULT dvdemux_debug static GstStaticPadTemplate sink_temp = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-dv, systemstream = (boolean) true") ); static GstStaticPadTemplate video_src_temp = GST_STATIC_PAD_TEMPLATE ("video", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("video/x-dv, systemstream = (boolean) false") ); static GstStaticPadTemplate audio_src_temp = GST_STATIC_PAD_TEMPLATE ("audio", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-raw-int, " "depth = (int) 16, " "width = (int) 16, " "signed = (boolean) TRUE, " "channels = (int) {2, 4}, " "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " "rate = (int) { 32000, 44100, 48000 }") ); GST_BOILERPLATE (GstDVDemux, gst_dvdemux, GstElement, GST_TYPE_ELEMENT); static void gst_dvdemux_finalize (GObject * object); /* query functions */ static const GstQueryType *gst_dvdemux_get_src_query_types (GstPad * pad); static gboolean gst_dvdemux_src_query (GstPad * pad, GstQuery * query); static const GstQueryType *gst_dvdemux_get_sink_query_types (GstPad * pad); static gboolean gst_dvdemux_sink_query (GstPad * pad, GstQuery * query); /* convert functions */ static gboolean gst_dvdemux_sink_convert (GstDVDemux * demux, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); static gboolean gst_dvdemux_src_convert (GstDVDemux * demux, GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); /* event functions */ static gboolean gst_dvdemux_send_event (GstElement * element, GstEvent * event); static gboolean gst_dvdemux_handle_src_event (GstPad * pad, GstEvent * event); static gboolean gst_dvdemux_handle_sink_event (GstPad * pad, GstEvent * event); /* scheduling functions */ static void gst_dvdemux_loop (GstPad * pad); static GstFlowReturn gst_dvdemux_flush (GstDVDemux * dvdemux); static GstFlowReturn gst_dvdemux_chain (GstPad * pad, GstBuffer * buffer); /* state change functions */ static gboolean gst_dvdemux_sink_activate (GstPad * sinkpad); static gboolean gst_dvdemux_sink_activate_push (GstPad * sinkpad, gboolean active); static gboolean gst_dvdemux_sink_activate_pull (GstPad * sinkpad, gboolean active); static GstStateChangeReturn gst_dvdemux_change_state (GstElement * element, GstStateChange transition); static void gst_dvdemux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_temp); gst_element_class_add_static_pad_template (element_class, &video_src_temp); gst_element_class_add_static_pad_template (element_class, &audio_src_temp); gst_element_class_set_details_simple (element_class, "DV system stream demuxer", "Codec/Demuxer", "Uses libdv to separate DV audio from DV video (libdv.sourceforge.net)", "Erik Walthinsen , Wim Taymans "); GST_DEBUG_CATEGORY_INIT (dvdemux_debug, "dvdemux", 0, "DV demuxer element"); } static void gst_dvdemux_class_init (GstDVDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_dvdemux_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dvdemux_change_state); gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_dvdemux_send_event); } static void gst_dvdemux_init (GstDVDemux * dvdemux, GstDVDemuxClass * g_class) { gint i; dvdemux->sinkpad = gst_pad_new_from_static_template (&sink_temp, "sink"); /* we can operate in pull and push mode so we install * a custom activate function */ gst_pad_set_activate_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_sink_activate)); /* the function to activate in push mode */ gst_pad_set_activatepush_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_sink_activate_push)); /* the function to activate in pull mode */ gst_pad_set_activatepull_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_sink_activate_pull)); /* for push mode, this is the chain function */ gst_pad_set_chain_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_chain)); /* handling events (in push mode only) */ gst_pad_set_event_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_handle_sink_event)); /* query functions */ gst_pad_set_query_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_sink_query)); gst_pad_set_query_type_function (dvdemux->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdemux_get_sink_query_types)); /* now add the pad */ gst_element_add_pad (GST_ELEMENT (dvdemux), dvdemux->sinkpad); dvdemux->adapter = gst_adapter_new (); /* we need 4 temp buffers for audio decoding which are of a static * size and which we can allocate here */ for (i = 0; i < 4; i++) { dvdemux->audio_buffers[i] = (gint16 *) g_malloc (DV_AUDIO_MAX_SAMPLES * sizeof (gint16)); } } static void gst_dvdemux_finalize (GObject * object) { GstDVDemux *dvdemux; gint i; dvdemux = GST_DVDEMUX (object); g_object_unref (dvdemux->adapter); /* clean up temp audio buffers */ for (i = 0; i < 4; i++) { g_free (dvdemux->audio_buffers[i]); } G_OBJECT_CLASS (parent_class)->finalize (object); } /* reset to default values before starting streaming */ static void gst_dvdemux_reset (GstDVDemux * dvdemux) { dvdemux->frame_offset = 0; dvdemux->audio_offset = 0; dvdemux->video_offset = 0; dvdemux->framecount = 0; g_atomic_int_set (&dvdemux->found_header, 0); dvdemux->frame_len = -1; dvdemux->need_segment = FALSE; dvdemux->new_media = FALSE; dvdemux->framerate_numerator = 0; dvdemux->framerate_denominator = 0; dvdemux->height = 0; dvdemux->frequency = 0; dvdemux->channels = 0; dvdemux->wide = FALSE; gst_segment_init (&dvdemux->byte_segment, GST_FORMAT_BYTES); gst_segment_init (&dvdemux->time_segment, GST_FORMAT_TIME); } static GstPad * gst_dvdemux_add_pad (GstDVDemux * dvdemux, GstStaticPadTemplate * template) { gboolean no_more_pads; GstPad *pad; pad = gst_pad_new_from_static_template (template, template->name_template); gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_dvdemux_src_query)); gst_pad_set_query_type_function (pad, GST_DEBUG_FUNCPTR (gst_dvdemux_get_src_query_types)); gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_dvdemux_handle_src_event)); gst_pad_use_fixed_caps (pad); gst_pad_set_active (pad, TRUE); gst_element_add_pad (GST_ELEMENT (dvdemux), pad); no_more_pads = (dvdemux->videosrcpad != NULL && template == &audio_src_temp) || (dvdemux->audiosrcpad != NULL && template == &video_src_temp); if (no_more_pads) gst_element_no_more_pads (GST_ELEMENT (dvdemux)); gst_pad_push_event (pad, gst_event_new_new_segment (FALSE, dvdemux->byte_segment.rate, GST_FORMAT_TIME, dvdemux->time_segment.start, dvdemux->time_segment.stop, dvdemux->time_segment.start)); if (no_more_pads) { gst_element_found_tags (GST_ELEMENT (dvdemux), gst_tag_list_new_full (GST_TAG_CONTAINER_FORMAT, "DV", NULL)); } return pad; } static void gst_dvdemux_remove_pads (GstDVDemux * dvdemux) { if (dvdemux->videosrcpad) { gst_element_remove_pad (GST_ELEMENT (dvdemux), dvdemux->videosrcpad); dvdemux->videosrcpad = NULL; } if (dvdemux->audiosrcpad) { gst_element_remove_pad (GST_ELEMENT (dvdemux), dvdemux->audiosrcpad); dvdemux->audiosrcpad = NULL; } } static gboolean gst_dvdemux_src_convert (GstDVDemux * dvdemux, GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; if (*dest_format == src_format || src_value == -1) { *dest_value = src_value; goto done; } if (dvdemux->frame_len <= 0) goto error; if (dvdemux->decoder == NULL) goto error; GST_INFO_OBJECT (pad, "src_value:%" G_GINT64_FORMAT ", src_format:%d, dest_format:%d", src_value, src_format, *dest_format); switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_DEFAULT: if (pad == dvdemux->videosrcpad) *dest_value = src_value / dvdemux->frame_len; else if (pad == dvdemux->audiosrcpad) *dest_value = src_value / (2 * dvdemux->channels); break; case GST_FORMAT_TIME: *dest_format = GST_FORMAT_TIME; if (pad == dvdemux->videosrcpad) *dest_value = gst_util_uint64_scale (src_value, GST_SECOND * dvdemux->framerate_denominator, dvdemux->frame_len * dvdemux->framerate_numerator); else if (pad == dvdemux->audiosrcpad) *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND, 2 * dvdemux->frequency * dvdemux->channels); break; default: res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: if (pad == dvdemux->videosrcpad) *dest_value = gst_util_uint64_scale (src_value, dvdemux->frame_len * dvdemux->framerate_numerator, dvdemux->framerate_denominator * GST_SECOND); else if (pad == dvdemux->audiosrcpad) *dest_value = gst_util_uint64_scale_int (src_value, 2 * dvdemux->frequency * dvdemux->channels, GST_SECOND); break; case GST_FORMAT_DEFAULT: if (pad == dvdemux->videosrcpad) { if (src_value) *dest_value = gst_util_uint64_scale (src_value, dvdemux->framerate_numerator, dvdemux->framerate_denominator * GST_SECOND); else *dest_value = 0; } else if (pad == dvdemux->audiosrcpad) { *dest_value = gst_util_uint64_scale (src_value, dvdemux->frequency, GST_SECOND); } break; default: res = FALSE; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_TIME: if (pad == dvdemux->videosrcpad) { *dest_value = gst_util_uint64_scale (src_value, GST_SECOND * dvdemux->framerate_denominator, dvdemux->framerate_numerator); } else if (pad == dvdemux->audiosrcpad) { if (src_value) *dest_value = gst_util_uint64_scale (src_value, GST_SECOND, dvdemux->frequency); else *dest_value = 0; } break; case GST_FORMAT_BYTES: if (pad == dvdemux->videosrcpad) { *dest_value = src_value * dvdemux->frame_len; } else if (pad == dvdemux->audiosrcpad) { *dest_value = src_value * 2 * dvdemux->channels; } break; default: res = FALSE; } break; default: res = FALSE; } done: GST_INFO_OBJECT (pad, "Result : dest_format:%d, dest_value:%" G_GINT64_FORMAT ", res:%d", *dest_format, *dest_value, res); return res; /* ERRORS */ error: { GST_INFO ("source conversion failed"); return FALSE; } } static gboolean gst_dvdemux_sink_convert (GstDVDemux * dvdemux, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; GST_DEBUG_OBJECT (dvdemux, "%d -> %d", src_format, *dest_format); GST_INFO_OBJECT (dvdemux, "src_value:%" G_GINT64_FORMAT ", src_format:%d, dest_format:%d", src_value, src_format, *dest_format); if (*dest_format == GST_FORMAT_DEFAULT) *dest_format = GST_FORMAT_TIME; if (*dest_format == src_format || src_value == -1) { *dest_value = src_value; goto done; } if (dvdemux->frame_len <= 0) goto error; switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_TIME: { guint64 frame; /* get frame number, rounds down so don't combine this * line and the next line. */ frame = src_value / dvdemux->frame_len; *dest_value = gst_util_uint64_scale (frame, GST_SECOND * dvdemux->framerate_denominator, dvdemux->framerate_numerator); break; } default: res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: { guint64 frame; /* calculate the frame */ frame = gst_util_uint64_scale (src_value, dvdemux->framerate_numerator, dvdemux->framerate_denominator * GST_SECOND); /* calculate the offset from the rounded frame */ *dest_value = frame * dvdemux->frame_len; break; } default: res = FALSE; } break; default: res = FALSE; } GST_INFO_OBJECT (dvdemux, "Result : dest_format:%d, dest_value:%" G_GINT64_FORMAT ", res:%d", *dest_format, *dest_value, res); done: return res; error: { GST_INFO_OBJECT (dvdemux, "sink conversion failed"); return FALSE; } } static const GstQueryType * gst_dvdemux_get_src_query_types (GstPad * pad) { static const GstQueryType src_query_types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_CONVERT, 0 }; return src_query_types; } static gboolean gst_dvdemux_src_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstDVDemux *dvdemux; dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gint64 cur; /* get target format */ gst_query_parse_position (query, &format, NULL); /* bring the position to the requested format. */ if (!(res = gst_dvdemux_src_convert (dvdemux, pad, GST_FORMAT_TIME, dvdemux->time_segment.last_stop, &format, &cur))) goto error; gst_query_set_position (query, format, cur); break; } case GST_QUERY_DURATION: { GstFormat format; GstFormat format2; gint64 end; /* First ask the peer in the original format */ if (!gst_pad_peer_query (dvdemux->sinkpad, query)) { /* get target format */ gst_query_parse_duration (query, &format, NULL); /* change query to bytes to perform on peer */ gst_query_set_duration (query, GST_FORMAT_BYTES, -1); /* Now ask the peer in BYTES format and try to convert */ if (!gst_pad_peer_query (dvdemux->sinkpad, query)) { goto error; } /* get peer total length */ gst_query_parse_duration (query, NULL, &end); /* convert end to requested format */ if (end != -1) { format2 = format; if (!(res = gst_dvdemux_sink_convert (dvdemux, GST_FORMAT_BYTES, end, &format2, &end))) { goto error; } gst_query_set_duration (query, format, end); } } break; } case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if (!(res = gst_dvdemux_src_convert (dvdemux, pad, src_fmt, src_val, &dest_fmt, &dest_val))) goto error; gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (dvdemux); return res; /* ERRORS */ error: { gst_object_unref (dvdemux); GST_DEBUG ("error source query"); return FALSE; } } static const GstQueryType * gst_dvdemux_get_sink_query_types (GstPad * pad) { static const GstQueryType sink_query_types[] = { GST_QUERY_CONVERT, 0 }; return sink_query_types; } static gboolean gst_dvdemux_sink_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstDVDemux *dvdemux; dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if (!(res = gst_dvdemux_sink_convert (dvdemux, src_fmt, src_val, &dest_fmt, &dest_val))) goto error; gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (dvdemux); return res; /* ERRORS */ error: { gst_object_unref (dvdemux); GST_DEBUG ("error handling sink query"); return FALSE; } } /* takes ownership of the event */ static gboolean gst_dvdemux_push_event (GstDVDemux * dvdemux, GstEvent * event) { gboolean res = FALSE; if (dvdemux->videosrcpad) { gst_event_ref (event); res |= gst_pad_push_event (dvdemux->videosrcpad, event); } if (dvdemux->audiosrcpad) res |= gst_pad_push_event (dvdemux->audiosrcpad, event); else gst_event_unref (event); return res; } static gboolean gst_dvdemux_handle_sink_event (GstPad * pad, GstEvent * event) { GstDVDemux *dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); gboolean res = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: /* we are not blocking on anything exect the push() calls * to the peer which will be unblocked by forwarding the * event.*/ res = gst_dvdemux_push_event (dvdemux, event); break; case GST_EVENT_FLUSH_STOP: gst_adapter_clear (dvdemux->adapter); GST_DEBUG ("cleared adapter"); gst_segment_init (&dvdemux->byte_segment, GST_FORMAT_BYTES); gst_segment_init (&dvdemux->time_segment, GST_FORMAT_TIME); res = gst_dvdemux_push_event (dvdemux, event); break; case GST_EVENT_NEWSEGMENT: { gboolean update; gdouble rate; GstFormat format; gint64 start, stop, time; /* parse byte start and stop positions */ gst_event_parse_new_segment (event, &update, &rate, &format, &start, &stop, &time); switch (format) { case GST_FORMAT_BYTES: gst_segment_set_newsegment (&dvdemux->byte_segment, update, rate, format, start, stop, time); /* the update can always be sent */ if (update) { GstEvent *update; update = gst_event_new_new_segment (TRUE, dvdemux->time_segment.rate, dvdemux->time_segment.format, dvdemux->time_segment.start, dvdemux->time_segment.last_stop, dvdemux->time_segment.time); gst_dvdemux_push_event (dvdemux, update); } else { /* and queue a SEGMENT before sending the next set of buffers, we * cannot convert to time yet as we might not know the size of the * frames, etc.. */ dvdemux->need_segment = TRUE; } gst_event_unref (event); break; case GST_FORMAT_TIME: gst_segment_set_newsegment (&dvdemux->time_segment, update, rate, format, start, stop, time); /* and we can just forward this time event */ res = gst_dvdemux_push_event (dvdemux, event); break; default: gst_event_unref (event); /* cannot accept this format */ res = FALSE; break; } break; } case GST_EVENT_EOS: /* flush any pending data, should be nothing left. */ gst_dvdemux_flush (dvdemux); /* forward event */ res = gst_dvdemux_push_event (dvdemux, event); /* and clear the adapter */ gst_adapter_clear (dvdemux->adapter); break; default: res = gst_dvdemux_push_event (dvdemux, event); break; } gst_object_unref (dvdemux); return res; } /* convert a pair of values on the given srcpad */ static gboolean gst_dvdemux_convert_src_pair (GstDVDemux * dvdemux, GstPad * pad, GstFormat src_format, gint64 src_start, gint64 src_stop, GstFormat dst_format, gint64 * dst_start, gint64 * dst_stop) { gboolean res; GST_INFO ("starting conversion of start"); /* bring the format to time on srcpad. */ if (!(res = gst_dvdemux_src_convert (dvdemux, pad, src_format, src_start, &dst_format, dst_start))) { goto done; } GST_INFO ("Finished conversion of start: %" G_GINT64_FORMAT, *dst_start); GST_INFO ("starting conversion of stop"); /* bring the format to time on srcpad. */ if (!(res = gst_dvdemux_src_convert (dvdemux, pad, src_format, src_stop, &dst_format, dst_stop))) { /* could not convert seek format to time offset */ goto done; } GST_INFO ("Finished conversion of stop: %" G_GINT64_FORMAT, *dst_stop); done: return res; } /* convert a pair of values on the sinkpad */ static gboolean gst_dvdemux_convert_sink_pair (GstDVDemux * dvdemux, GstFormat src_format, gint64 src_start, gint64 src_stop, GstFormat dst_format, gint64 * dst_start, gint64 * dst_stop) { gboolean res; GST_INFO ("starting conversion of start"); /* bring the format to time on srcpad. */ if (!(res = gst_dvdemux_sink_convert (dvdemux, src_format, src_start, &dst_format, dst_start))) { goto done; } GST_INFO ("Finished conversion of start: %" G_GINT64_FORMAT, *dst_start); GST_INFO ("starting conversion of stop"); /* bring the format to time on srcpad. */ if (!(res = gst_dvdemux_sink_convert (dvdemux, src_format, src_stop, &dst_format, dst_stop))) { /* could not convert seek format to time offset */ goto done; } GST_INFO ("Finished conversion of stop: %" G_GINT64_FORMAT, *dst_stop); done: return res; } /* convert a pair of values on the srcpad to a pair of * values on the sinkpad */ static gboolean gst_dvdemux_convert_src_to_sink (GstDVDemux * dvdemux, GstPad * pad, GstFormat src_format, gint64 src_start, gint64 src_stop, GstFormat dst_format, gint64 * dst_start, gint64 * dst_stop) { GstFormat conv; gboolean res; conv = GST_FORMAT_TIME; /* convert to TIME intermediate format */ if (!(res = gst_dvdemux_convert_src_pair (dvdemux, pad, src_format, src_start, src_stop, conv, dst_start, dst_stop))) { /* could not convert format to time offset */ goto done; } /* convert to dst format on sinkpad */ if (!(res = gst_dvdemux_convert_sink_pair (dvdemux, conv, *dst_start, *dst_stop, dst_format, dst_start, dst_stop))) { /* could not convert format to time offset */ goto done; } done: return res; } #if 0 static gboolean gst_dvdemux_convert_segment (GstDVDemux * dvdemux, GstSegment * src, GstSegment * dest) { dest->rate = src->rate; dest->abs_rate = src->abs_rate; dest->flags = src->flags; return TRUE; } #endif /* handle seek in push base mode. * * Convert the time seek to a bytes seek and send it * upstream * Does not take ownership of the event. */ static gboolean gst_dvdemux_handle_push_seek (GstDVDemux * dvdemux, GstPad * pad, GstEvent * event) { gboolean res = FALSE; gdouble rate; GstSeekFlags flags; GstFormat format; GstSeekType cur_type, stop_type; gint64 cur, stop; gint64 start_position, end_position; GstEvent *newevent; gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* First try if upstream can handle time based seeks */ if (format == GST_FORMAT_TIME) res = gst_pad_push_event (dvdemux->sinkpad, gst_event_ref (event)); 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; /* 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; } /* position ourselves to the configured segment, used in pull mode. * The input segment is in TIME format. We convert the time values * to bytes values into our byte_segment which we use to pull data from * the sinkpad peer. */ static gboolean gst_dvdemux_do_seek (GstDVDemux * demux, GstSegment * segment) { gboolean res; GstFormat format; /* position to value configured is last_stop, this will round down * to the byte position where the frame containing the given * timestamp can be found. */ format = GST_FORMAT_BYTES; res = gst_dvdemux_sink_convert (demux, segment->format, segment->last_stop, &format, &demux->byte_segment.last_stop); if (!res) goto done; /* update byte segment start */ gst_dvdemux_sink_convert (demux, segment->format, segment->start, &format, &demux->byte_segment.start); /* update byte segment stop */ gst_dvdemux_sink_convert (demux, segment->format, segment->stop, &format, &demux->byte_segment.stop); /* update byte segment time */ gst_dvdemux_sink_convert (demux, segment->format, segment->time, &format, &demux->byte_segment.time); /* calculate current frame number */ format = GST_FORMAT_DEFAULT; gst_dvdemux_src_convert (demux, demux->videosrcpad, segment->format, segment->start, &format, &demux->video_offset); /* calculate current audio number */ format = GST_FORMAT_DEFAULT; gst_dvdemux_src_convert (demux, demux->audiosrcpad, segment->format, segment->start, &format, &demux->audio_offset); /* every DV frame corresponts with one video frame */ demux->frame_offset = demux->video_offset; done: return res; } /* handle seek in pull base mode. * * Does not take ownership of the event. */ static gboolean gst_dvdemux_handle_pull_seek (GstDVDemux * demux, GstPad * pad, GstEvent * event) { gboolean res; gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType cur_type, stop_type; gint64 cur, stop; gboolean flush; gboolean update; GstSegment seeksegment; GST_DEBUG_OBJECT (demux, "doing seek"); /* first bring the event format to TIME, our native format * to perform the seek on */ if (event) { GstFormat conv; gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* can't seek backwards yet */ if (rate <= 0.0) goto wrong_rate; /* convert input format to TIME */ conv = GST_FORMAT_TIME; if (!(gst_dvdemux_convert_src_pair (demux, pad, format, cur, stop, conv, &cur, &stop))) goto no_format; format = GST_FORMAT_TIME; } else { flags = 0; } flush = flags & GST_SEEK_FLAG_FLUSH; /* send flush start */ if (flush) gst_dvdemux_push_event (demux, gst_event_new_flush_start ()); else gst_pad_pause_task (demux->sinkpad); /* grab streaming lock, this should eventually be possible, either * because the task is paused or our streaming thread stopped * because our peer is flushing. */ GST_PAD_STREAM_LOCK (demux->sinkpad); /* make copy into temp structure, we can only update the main one * when the subclass actually could to the seek. */ memcpy (&seeksegment, &demux->time_segment, sizeof (GstSegment)); /* now configure the seek segment */ if (event) { gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); } GST_DEBUG_OBJECT (demux, "segment configured from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT ", position %" G_GINT64_FORMAT, seeksegment.start, seeksegment.stop, seeksegment.last_stop); /* do the seek, segment.last_stop contains new position. */ res = gst_dvdemux_do_seek (demux, &seeksegment); /* and prepare to continue streaming */ if (flush) { /* send flush stop, peer will accept data and events again. We * are not yet providing data as we still have the STREAM_LOCK. */ gst_dvdemux_push_event (demux, gst_event_new_flush_stop ()); } else if (res && demux->running) { /* we are running the current segment and doing a non-flushing seek, * close the segment first based on the last_stop. */ GST_DEBUG_OBJECT (demux, "closing running segment %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, demux->time_segment.start, demux->time_segment.last_stop); gst_dvdemux_push_event (demux, gst_event_new_new_segment (TRUE, demux->time_segment.rate, demux->time_segment.format, demux->time_segment.start, demux->time_segment.last_stop, demux->time_segment.time)); } /* if successfull seek, we update our real segment and push * out the new segment. */ if (res) { memcpy (&demux->time_segment, &seeksegment, sizeof (GstSegment)); if (demux->time_segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (demux), gst_message_new_segment_start (GST_OBJECT_CAST (demux), demux->time_segment.format, demux->time_segment.last_stop)); } if ((stop = demux->time_segment.stop) == -1) stop = demux->time_segment.duration; GST_INFO_OBJECT (demux, "Saving newsegment event to be sent in streaming thread"); if (demux->pending_segment) gst_event_unref (demux->pending_segment); demux->pending_segment = gst_event_new_new_segment (FALSE, demux->time_segment.rate, demux->time_segment.format, demux->time_segment.last_stop, stop, demux->time_segment.time); demux->need_segment = FALSE; } demux->running = TRUE; /* and restart the task in case it got paused explicitely or by * the FLUSH_START event we pushed out. */ gst_pad_start_task (demux->sinkpad, (GstTaskFunction) gst_dvdemux_loop, demux->sinkpad); /* and release the lock again so we can continue streaming */ GST_PAD_STREAM_UNLOCK (demux->sinkpad); return TRUE; /* ERRORS */ wrong_rate: { GST_DEBUG_OBJECT (demux, "negative playback rate %lf not supported.", rate); return FALSE; } no_format: { GST_DEBUG_OBJECT (demux, "cannot convert to TIME format, seek aborted."); return FALSE; } } static gboolean gst_dvdemux_send_event (GstElement * element, GstEvent * event) { GstDVDemux *dvdemux = GST_DVDEMUX (element); gboolean res = FALSE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: { /* checking header and configuring the seek must be atomic */ GST_OBJECT_LOCK (dvdemux); if (g_atomic_int_get (&dvdemux->found_header) == 0) { GstEvent **event_p; event_p = &dvdemux->seek_event; /* We don't have pads yet. Keep the event. */ GST_INFO_OBJECT (dvdemux, "Keeping the seek event for later"); gst_event_replace (event_p, event); GST_OBJECT_UNLOCK (dvdemux); res = TRUE; } else { GST_OBJECT_UNLOCK (dvdemux); if (dvdemux->seek_handler) { res = dvdemux->seek_handler (dvdemux, dvdemux->videosrcpad, event); gst_event_unref (event); } } break; } default: res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event); break; } return res; } /* handle an event on the source pad, it's most likely a seek */ static gboolean gst_dvdemux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstDVDemux *dvdemux; dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: /* seek handler is installed based on scheduling mode */ if (dvdemux->seek_handler) res = dvdemux->seek_handler (dvdemux, pad, event); else res = FALSE; break; case GST_EVENT_QOS: /* we can't really (yet) do QoS */ res = FALSE; break; case GST_EVENT_NAVIGATION: /* no navigation either... */ res = FALSE; break; default: res = gst_pad_push_event (dvdemux->sinkpad, event); event = NULL; break; } if (event) gst_event_unref (event); gst_object_unref (dvdemux); return res; } /* does not take ownership of buffer */ static GstFlowReturn gst_dvdemux_demux_audio (GstDVDemux * dvdemux, GstBuffer * buffer, guint64 duration) { gint num_samples; GstFlowReturn ret; const guint8 *data; data = GST_BUFFER_DATA (buffer); dv_decode_full_audio (dvdemux->decoder, data, dvdemux->audio_buffers); if (G_LIKELY ((num_samples = dv_get_num_samples (dvdemux->decoder)) > 0)) { gint16 *a_ptr; gint i, j; GstBuffer *outbuf; gint frequency, channels; if (G_UNLIKELY (dvdemux->audiosrcpad == NULL)) dvdemux->audiosrcpad = gst_dvdemux_add_pad (dvdemux, &audio_src_temp); /* get initial format or check if format changed */ frequency = dv_get_frequency (dvdemux->decoder); channels = dv_get_num_channels (dvdemux->decoder); if (G_UNLIKELY ((frequency != dvdemux->frequency) || (channels != dvdemux->channels))) { GstCaps *caps; dvdemux->frequency = frequency; dvdemux->channels = channels; /* and set new caps */ caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, frequency, "depth", G_TYPE_INT, 16, "width", G_TYPE_INT, 16, "signed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, channels, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); gst_pad_set_caps (dvdemux->audiosrcpad, caps); gst_caps_unref (caps); } outbuf = gst_buffer_new_and_alloc (num_samples * sizeof (gint16) * dvdemux->channels); a_ptr = (gint16 *) GST_BUFFER_DATA (outbuf); for (i = 0; i < num_samples; i++) { for (j = 0; j < dvdemux->channels; j++) { *(a_ptr++) = dvdemux->audio_buffers[j][i]; } } GST_DEBUG ("pushing audio %" GST_TIME_FORMAT, GST_TIME_ARGS (dvdemux->time_segment.last_stop)); GST_BUFFER_TIMESTAMP (outbuf) = dvdemux->time_segment.last_stop; GST_BUFFER_DURATION (outbuf) = duration; GST_BUFFER_OFFSET (outbuf) = dvdemux->audio_offset; dvdemux->audio_offset += num_samples; GST_BUFFER_OFFSET_END (outbuf) = dvdemux->audio_offset; if (dvdemux->new_media) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (dvdemux->audiosrcpad)); ret = gst_pad_push (dvdemux->audiosrcpad, outbuf); } else { /* no samples */ ret = GST_FLOW_OK; } return ret; } /* takes ownership of buffer */ static GstFlowReturn gst_dvdemux_demux_video (GstDVDemux * dvdemux, GstBuffer * buffer, guint64 duration) { GstBuffer *outbuf; gint height; gboolean wide; GstFlowReturn ret = GST_FLOW_OK; if (G_UNLIKELY (dvdemux->videosrcpad == NULL)) dvdemux->videosrcpad = gst_dvdemux_add_pad (dvdemux, &video_src_temp); /* get params */ /* framerate is already up-to-date */ height = dvdemux->decoder->height; wide = dv_format_wide (dvdemux->decoder); /* see if anything changed */ if (G_UNLIKELY ((dvdemux->height != height) || dvdemux->wide != wide)) { GstCaps *caps; gint par_x, par_y; dvdemux->height = height; dvdemux->wide = wide; if (dvdemux->decoder->system == e_dv_system_625_50) { if (wide) { par_x = PAL_WIDE_PAR_X; par_y = PAL_WIDE_PAR_Y; } else { par_x = PAL_NORMAL_PAR_X; par_y = PAL_NORMAL_PAR_Y; } } else { if (wide) { par_x = NTSC_WIDE_PAR_X; par_y = NTSC_WIDE_PAR_Y; } else { par_x = NTSC_NORMAL_PAR_X; par_y = NTSC_NORMAL_PAR_Y; } } caps = gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, FALSE, "width", G_TYPE_INT, 720, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, dvdemux->framerate_numerator, dvdemux->framerate_denominator, "pixel-aspect-ratio", GST_TYPE_FRACTION, par_x, par_y, NULL); gst_pad_set_caps (dvdemux->videosrcpad, caps); gst_caps_unref (caps); } /* takes ownership of buffer here, we just need to modify * the metadata. */ outbuf = gst_buffer_make_metadata_writable (buffer); GST_BUFFER_TIMESTAMP (outbuf) = dvdemux->time_segment.last_stop; GST_BUFFER_OFFSET (outbuf) = dvdemux->video_offset; GST_BUFFER_OFFSET_END (outbuf) = dvdemux->video_offset + 1; GST_BUFFER_DURATION (outbuf) = duration; if (dvdemux->new_media) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (dvdemux->videosrcpad)); GST_DEBUG ("pushing video %" GST_TIME_FORMAT, GST_TIME_ARGS (dvdemux->time_segment.last_stop)); ret = gst_pad_push (dvdemux->videosrcpad, outbuf); dvdemux->video_offset++; return ret; } static int get_ssyb_offset (int dif, int ssyb) { int offset; offset = dif * 12000; /* to dif */ offset += 80 * (1 + (ssyb / 6)); /* to subcode pack */ offset += 3; /* past header */ offset += 8 * (ssyb % 6); /* to ssyb */ return offset; } static gboolean gst_dvdemux_get_timecode (GstDVDemux * dvdemux, GstBuffer * buffer, GstSMPTETimeCode * timecode) { guint8 *data = GST_BUFFER_DATA (buffer); int offset; int dif; int n_difs = dvdemux->decoder->num_dif_seqs; for (dif = 0; dif < n_difs; dif++) { offset = get_ssyb_offset (dif, 3); if (data[offset + 3] == 0x13) { timecode->frames = ((data[offset + 4] >> 4) & 0x3) * 10 + (data[offset + 4] & 0xf); timecode->seconds = ((data[offset + 5] >> 4) & 0x3) * 10 + (data[offset + 5] & 0xf); timecode->minutes = ((data[offset + 6] >> 4) & 0x3) * 10 + (data[offset + 6] & 0xf); timecode->hours = ((data[offset + 7] >> 4) & 0x3) * 10 + (data[offset + 7] & 0xf); GST_DEBUG ("got timecode %" GST_SMPTE_TIME_CODE_FORMAT, GST_SMPTE_TIME_CODE_ARGS (timecode)); return TRUE; } } return FALSE; } static gboolean gst_dvdemux_is_new_media (GstDVDemux * dvdemux, GstBuffer * buffer) { guint8 *data = GST_BUFFER_DATA (buffer); int aaux_offset; int dif; int n_difs; n_difs = dvdemux->decoder->num_dif_seqs; for (dif = 0; dif < n_difs; dif++) { if (dif & 1) { aaux_offset = (dif * 12000) + (6 + 16 * 1) * 80 + 3; } else { aaux_offset = (dif * 12000) + (6 + 16 * 4) * 80 + 3; } if (data[aaux_offset + 0] == 0x51) { if ((data[aaux_offset + 2] & 0x80) == 0) return TRUE; } } return FALSE; } /* takes ownership of buffer */ static GstFlowReturn gst_dvdemux_demux_frame (GstDVDemux * dvdemux, GstBuffer * buffer) { GstClockTime next_ts; GstFlowReturn aret, vret, ret; guint8 *data; guint64 duration; GstSMPTETimeCode timecode; int frame_number; if (G_UNLIKELY (dvdemux->need_segment)) { GstEvent *event; GstFormat format; /* convert to time and store as start/end_timestamp */ format = GST_FORMAT_TIME; if (!(gst_dvdemux_convert_sink_pair (dvdemux, GST_FORMAT_BYTES, dvdemux->byte_segment.start, dvdemux->byte_segment.stop, format, &dvdemux->time_segment.start, &dvdemux->time_segment.stop))) goto segment_error; dvdemux->time_segment.rate = dvdemux->byte_segment.rate; dvdemux->time_segment.abs_rate = dvdemux->byte_segment.abs_rate; dvdemux->time_segment.last_stop = dvdemux->time_segment.start; /* calculate current frame number */ format = GST_FORMAT_DEFAULT; if (!(gst_dvdemux_src_convert (dvdemux, dvdemux->videosrcpad, GST_FORMAT_TIME, dvdemux->time_segment.start, &format, &dvdemux->frame_offset))) goto segment_error; GST_DEBUG_OBJECT (dvdemux, "sending segment start: %" GST_TIME_FORMAT ", stop: %" GST_TIME_FORMAT ", time: %" GST_TIME_FORMAT, GST_TIME_ARGS (dvdemux->time_segment.start), GST_TIME_ARGS (dvdemux->time_segment.stop), GST_TIME_ARGS (dvdemux->time_segment.start)); event = gst_event_new_new_segment (FALSE, dvdemux->byte_segment.rate, GST_FORMAT_TIME, dvdemux->time_segment.start, dvdemux->time_segment.stop, dvdemux->time_segment.start); gst_dvdemux_push_event (dvdemux, event); dvdemux->need_segment = FALSE; } gst_dvdemux_get_timecode (dvdemux, buffer, &timecode); gst_smpte_time_code_get_frame_number ( (dvdemux->decoder->system == e_dv_system_625_50) ? GST_SMPTE_TIME_CODE_SYSTEM_25 : GST_SMPTE_TIME_CODE_SYSTEM_30, &frame_number, &timecode); next_ts = gst_util_uint64_scale_int ( (dvdemux->frame_offset + 1) * GST_SECOND, dvdemux->framerate_denominator, dvdemux->framerate_numerator); duration = next_ts - dvdemux->time_segment.last_stop; data = GST_BUFFER_DATA (buffer); dv_parse_packs (dvdemux->decoder, data); dvdemux->new_media = FALSE; if (gst_dvdemux_is_new_media (dvdemux, buffer) && dvdemux->frames_since_new_media > 2) { dvdemux->new_media = TRUE; dvdemux->frames_since_new_media = 0; } dvdemux->frames_since_new_media++; /* does not take ownership of buffer */ aret = ret = gst_dvdemux_demux_audio (dvdemux, buffer, duration); if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED)) { gst_buffer_unref (buffer); goto done; } /* takes ownership of buffer */ vret = ret = gst_dvdemux_demux_video (dvdemux, buffer, duration); if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED)) goto done; /* if both are not linked, we stop */ if (G_UNLIKELY (aret == GST_FLOW_NOT_LINKED && vret == GST_FLOW_NOT_LINKED)) { ret = GST_FLOW_NOT_LINKED; goto done; } gst_segment_set_last_stop (&dvdemux->time_segment, GST_FORMAT_TIME, next_ts); dvdemux->frame_offset++; /* check for the end of the segment */ if (dvdemux->time_segment.stop != -1 && next_ts > dvdemux->time_segment.stop) ret = GST_FLOW_UNEXPECTED; else ret = GST_FLOW_OK; done: return ret; /* ERRORS */ segment_error: { GST_DEBUG ("error generating new_segment event"); gst_buffer_unref (buffer); return GST_FLOW_ERROR; } } /* flush any remaining data in the adapter, used in chain based scheduling mode */ static GstFlowReturn gst_dvdemux_flush (GstDVDemux * dvdemux) { GstFlowReturn ret = GST_FLOW_OK; while (gst_adapter_available (dvdemux->adapter) >= dvdemux->frame_len) { const guint8 *data; gint length; /* get the accumulated bytes */ data = gst_adapter_peek (dvdemux->adapter, dvdemux->frame_len); /* parse header to know the length and other params */ if (G_UNLIKELY (dv_parse_header (dvdemux->decoder, data) < 0)) goto parse_header_error; /* after parsing the header we know the length of the data */ length = dvdemux->frame_len = dvdemux->decoder->frame_size; if (dvdemux->decoder->system == e_dv_system_625_50) { dvdemux->framerate_numerator = PAL_FRAMERATE_NUMERATOR; dvdemux->framerate_denominator = PAL_FRAMERATE_DENOMINATOR; } else { dvdemux->framerate_numerator = NTSC_FRAMERATE_NUMERATOR; dvdemux->framerate_denominator = NTSC_FRAMERATE_DENOMINATOR; } g_atomic_int_set (&dvdemux->found_header, 1); /* let demux_video set the height, it needs to detect when things change so * it can reset caps */ /* if we still have enough for a frame, start decoding */ if (G_LIKELY (gst_adapter_available (dvdemux->adapter) >= length)) { GstBuffer *buffer; data = gst_adapter_take (dvdemux->adapter, length); /* create buffer for the remainder of the code */ buffer = gst_buffer_new (); GST_BUFFER_DATA (buffer) = (guint8 *) data; GST_BUFFER_SIZE (buffer) = length; GST_BUFFER_MALLOCDATA (buffer) = (guint8 *) data; /* and decode the buffer, takes ownership */ ret = gst_dvdemux_demux_frame (dvdemux, buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto done; } } done: return ret; /* ERRORS */ parse_header_error: { GST_ELEMENT_ERROR (dvdemux, STREAM, DECODE, (NULL), ("Error parsing DV header")); return GST_FLOW_ERROR; } } /* streaming operation: * * accumulate data until we have a frame, then decode. */ static GstFlowReturn gst_dvdemux_chain (GstPad * pad, GstBuffer * buffer) { GstDVDemux *dvdemux; GstFlowReturn ret; GstClockTime timestamp; dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); /* a discontinuity in the stream, we need to get rid of * accumulated data in the adapter and assume a new frame * starts after the discontinuity */ if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) gst_adapter_clear (dvdemux->adapter); /* a timestamp always should be respected */ timestamp = GST_BUFFER_TIMESTAMP (buffer); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { gst_segment_set_last_stop (&dvdemux->time_segment, GST_FORMAT_TIME, timestamp); /* FIXME, adjust frame_offset and other counters */ } gst_adapter_push (dvdemux->adapter, buffer); /* Apparently dv_parse_header can read from the body of the frame * too, so it needs more than header_size bytes. Wacky! */ if (G_UNLIKELY (dvdemux->frame_len == -1)) { /* if we don't know the length of a frame, we assume it is * the NTSC_BUFFER length, as this is enough to figure out * if this is PAL or NTSC */ dvdemux->frame_len = NTSC_BUFFER; } /* and try to flush pending frames */ ret = gst_dvdemux_flush (dvdemux); gst_object_unref (dvdemux); return ret; } /* pull based operation. * * Read header first to figure out the frame size. Then read * and decode full frames. */ static void gst_dvdemux_loop (GstPad * pad) { GstFlowReturn ret; GstDVDemux *dvdemux; GstBuffer *buffer = NULL; const guint8 *data; dvdemux = GST_DVDEMUX (gst_pad_get_parent (pad)); if (G_UNLIKELY (g_atomic_int_get (&dvdemux->found_header) == 0)) { GST_DEBUG_OBJECT (dvdemux, "pulling first buffer"); /* pull in NTSC sized buffer to figure out the frame * length */ ret = gst_pad_pull_range (dvdemux->sinkpad, dvdemux->byte_segment.last_stop, NTSC_BUFFER, &buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto pause; /* check buffer size, don't want to read small buffers */ if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < NTSC_BUFFER)) goto small_buffer; data = GST_BUFFER_DATA (buffer); /* parse header to know the length and other params */ if (G_UNLIKELY (dv_parse_header (dvdemux->decoder, data) < 0)) goto parse_header_error; /* after parsing the header we know the length of the data */ dvdemux->frame_len = dvdemux->decoder->frame_size; if (dvdemux->decoder->system == e_dv_system_625_50) { dvdemux->framerate_numerator = PAL_FRAMERATE_NUMERATOR; dvdemux->framerate_denominator = PAL_FRAMERATE_DENOMINATOR; } else { dvdemux->framerate_numerator = NTSC_FRAMERATE_NUMERATOR; dvdemux->framerate_denominator = NTSC_FRAMERATE_DENOMINATOR; } dvdemux->need_segment = TRUE; /* see if we need to read a larger part */ if (dvdemux->frame_len != NTSC_BUFFER) { gst_buffer_unref (buffer); buffer = NULL; } { GstEvent *event; /* setting header and prrforming the seek must be atomic */ GST_OBJECT_LOCK (dvdemux); /* got header now */ g_atomic_int_set (&dvdemux->found_header, 1); /* now perform pending seek if any. */ event = dvdemux->seek_event; if (event) gst_event_ref (event); GST_OBJECT_UNLOCK (dvdemux); if (event) { if (!gst_dvdemux_handle_pull_seek (dvdemux, dvdemux->videosrcpad, event)) { GST_ELEMENT_WARNING (dvdemux, STREAM, DECODE, (NULL), ("Error perfoming initial seek")); } gst_event_unref (event); /* and we need to pull a new buffer in all cases. */ if (buffer) { gst_buffer_unref (buffer); buffer = NULL; } } } } if (G_UNLIKELY (dvdemux->pending_segment)) { /* now send the newsegment */ GST_DEBUG_OBJECT (dvdemux, "Sending newsegment from"); gst_dvdemux_push_event (dvdemux, dvdemux->pending_segment); dvdemux->pending_segment = NULL; } if (G_LIKELY (buffer == NULL)) { GST_DEBUG_OBJECT (dvdemux, "pulling buffer at offset %" G_GINT64_FORMAT, dvdemux->byte_segment.last_stop); ret = gst_pad_pull_range (dvdemux->sinkpad, dvdemux->byte_segment.last_stop, dvdemux->frame_len, &buffer); if (ret != GST_FLOW_OK) goto pause; /* check buffer size, don't want to read small buffers */ if (GST_BUFFER_SIZE (buffer) < dvdemux->frame_len) goto small_buffer; } /* and decode the buffer */ ret = gst_dvdemux_demux_frame (dvdemux, buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto pause; /* and position ourselves for the next buffer */ dvdemux->byte_segment.last_stop += dvdemux->frame_len; done: gst_object_unref (dvdemux); return; /* ERRORS */ parse_header_error: { GST_ELEMENT_ERROR (dvdemux, STREAM, DECODE, (NULL), ("Error parsing DV header")); gst_buffer_unref (buffer); dvdemux->running = FALSE; gst_pad_pause_task (dvdemux->sinkpad); gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); goto done; } small_buffer: { GST_ELEMENT_ERROR (dvdemux, STREAM, DECODE, (NULL), ("Error reading buffer")); gst_buffer_unref (buffer); dvdemux->running = FALSE; gst_pad_pause_task (dvdemux->sinkpad); gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); goto done; } pause: { GST_INFO_OBJECT (dvdemux, "pausing task, %s", gst_flow_get_name (ret)); dvdemux->running = FALSE; gst_pad_pause_task (dvdemux->sinkpad); if (ret == GST_FLOW_UNEXPECTED) { GST_LOG_OBJECT (dvdemux, "got eos"); /* perform EOS logic */ if (dvdemux->time_segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT (dvdemux), gst_message_new_segment_done (GST_OBJECT_CAST (dvdemux), dvdemux->time_segment.format, dvdemux->time_segment.last_stop)); } else { gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { /* for fatal errors or not-linked we post an error message */ GST_ELEMENT_ERROR (dvdemux, STREAM, FAILED, (NULL), ("streaming stopped, reason %s", gst_flow_get_name (ret))); gst_dvdemux_push_event (dvdemux, gst_event_new_eos ()); } goto done; } } static gboolean gst_dvdemux_sink_activate_push (GstPad * sinkpad, gboolean active) { GstDVDemux *demux = GST_DVDEMUX (gst_pad_get_parent (sinkpad)); if (active) { demux->seek_handler = gst_dvdemux_handle_push_seek; } else { demux->seek_handler = NULL; } gst_object_unref (demux); return TRUE; } static gboolean gst_dvdemux_sink_activate_pull (GstPad * sinkpad, gboolean active) { GstDVDemux *demux = GST_DVDEMUX (gst_pad_get_parent (sinkpad)); if (active) { demux->running = TRUE; demux->seek_handler = gst_dvdemux_handle_pull_seek; gst_pad_start_task (sinkpad, (GstTaskFunction) gst_dvdemux_loop, sinkpad); } else { demux->seek_handler = NULL; gst_pad_stop_task (sinkpad); demux->running = FALSE; } gst_object_unref (demux); return TRUE; }; /* decide on push or pull based scheduling */ static gboolean gst_dvdemux_sink_activate (GstPad * sinkpad) { gboolean ret; if (gst_pad_check_pull_range (sinkpad)) ret = gst_pad_activate_pull (sinkpad, TRUE); else ret = gst_pad_activate_push (sinkpad, TRUE); return ret; }; static GstStateChangeReturn gst_dvdemux_change_state (GstElement * element, GstStateChange transition) { GstDVDemux *dvdemux = GST_DVDEMUX (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: dvdemux->decoder = dv_decoder_new (0, FALSE, FALSE); dv_set_error_log (dvdemux->decoder, NULL); gst_dvdemux_reset (dvdemux); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_adapter_clear (dvdemux->adapter); dv_decoder_free (dvdemux->decoder); dvdemux->decoder = NULL; gst_dvdemux_remove_pads (dvdemux); break; case GST_STATE_CHANGE_READY_TO_NULL: { GstEvent **event_p; event_p = &dvdemux->seek_event; gst_event_replace (event_p, NULL); if (dvdemux->pending_segment) gst_event_unref (dvdemux->pending_segment); dvdemux->pending_segment = NULL; break; } default: break; } return ret; } gst-plugins-good-0.10.31/ext/dv/gstsmptetimecode.c0000644000175000017500000001541511671175352016752 00000000000000/* GStreamer * Copyright (C) 2009 David A. Schleef * * 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. */ /* * Utility functions for handing SMPTE Time Codes, as described in * SMPTE Standard 12M-1999. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstsmptetimecode.h" #define NTSC_FRAMES_PER_10_MINS (10*60*30 - 10*2 + 2) #define NTSC_FRAMES_PER_HOUR (6*NTSC_FRAMES_PER_10_MINS) /** * gst_smpte_time_code_from_frame_number: * @system: SMPTE Time Code system * @time_code: pointer to time code structure * @frame_number: integer frame number * * Converts a frame number to a time code. * * Returns: TRUE if the conversion was successful */ gboolean gst_smpte_time_code_from_frame_number (GstSMPTETimeCodeSystem system, GstSMPTETimeCode * time_code, int frame_number) { int ten_mins; int n; g_return_val_if_fail (time_code != NULL, FALSE); g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), FALSE); time_code->hours = 99; time_code->minutes = 99; time_code->seconds = 99; time_code->frames = 99; if (frame_number < 0) return FALSE; switch (system) { case GST_SMPTE_TIME_CODE_SYSTEM_30: if (frame_number >= 24 * NTSC_FRAMES_PER_HOUR) return FALSE; ten_mins = frame_number / NTSC_FRAMES_PER_10_MINS; frame_number -= ten_mins * NTSC_FRAMES_PER_10_MINS; time_code->hours = ten_mins / 6; time_code->minutes = 10 * (ten_mins % 6); if (frame_number < 2) { /* treat the first two frames of each ten minutes specially */ time_code->seconds = 0; time_code->frames = frame_number; } else { n = (frame_number - 2) / (60 * 30 - 2); time_code->minutes += n; frame_number -= n * (60 * 30 - 2); time_code->seconds = frame_number / 30; time_code->frames = frame_number % 30; } break; case GST_SMPTE_TIME_CODE_SYSTEM_25: if (frame_number >= 24 * 60 * 60 * 25) return FALSE; time_code->frames = frame_number % 25; frame_number /= 25; time_code->seconds = frame_number % 60; frame_number /= 60; time_code->minutes = frame_number % 60; frame_number /= 60; time_code->hours = frame_number; break; case GST_SMPTE_TIME_CODE_SYSTEM_24: if (frame_number >= 24 * 60 * 60 * 24) return FALSE; time_code->frames = frame_number % 24; frame_number /= 24; time_code->seconds = frame_number % 60; frame_number /= 60; time_code->minutes = frame_number % 60; frame_number /= 60; time_code->hours = frame_number; break; } return TRUE; } /** * gst_smpte_time_code_is_valid: * @system: SMPTE Time Code system * @time_code: pointer to time code structure * * Checks that the time code represents a valid time code. * * Returns: TRUE if the time code is valid */ gboolean gst_smpte_time_code_is_valid (GstSMPTETimeCodeSystem system, GstSMPTETimeCode * time_code) { g_return_val_if_fail (time_code != NULL, FALSE); g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), FALSE); if (time_code->hours < 0 || time_code->hours >= 24) return FALSE; if (time_code->minutes < 0 || time_code->minutes >= 60) return FALSE; if (time_code->seconds < 0 || time_code->seconds >= 60) return FALSE; if (time_code->frames < 0) return FALSE; switch (system) { case GST_SMPTE_TIME_CODE_SYSTEM_30: if (time_code->frames >= 30) return FALSE; if (time_code->frames >= 2 || time_code->seconds > 0) return TRUE; if (time_code->minutes % 10 != 0) return FALSE; break; case GST_SMPTE_TIME_CODE_SYSTEM_25: if (time_code->frames >= 25) return FALSE; break; case GST_SMPTE_TIME_CODE_SYSTEM_24: if (time_code->frames >= 24) return FALSE; break; } return TRUE; } /** * gst_smpte_time_get_frame_number: * @system: SMPTE Time Code system * @frame_number: pointer to frame number * @time_code: pointer to time code structure * * Converts the time code structure to a linear frame number. * * Returns: TRUE if the time code could be converted */ gboolean gst_smpte_time_code_get_frame_number (GstSMPTETimeCodeSystem system, int *frame_number, GstSMPTETimeCode * time_code) { int frame = 0; g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), FALSE); g_return_val_if_fail (time_code != NULL, FALSE); if (!gst_smpte_time_code_is_valid (system, time_code)) { return FALSE; } switch (system) { case GST_SMPTE_TIME_CODE_SYSTEM_30: frame = time_code->hours * NTSC_FRAMES_PER_HOUR; frame += (time_code->minutes / 10) * NTSC_FRAMES_PER_10_MINS; frame += (time_code->minutes % 10) * (30 * 60 - 2); frame += time_code->seconds * 30; break; case GST_SMPTE_TIME_CODE_SYSTEM_25: time_code->frames = 25 * ((time_code->hours * 60 + time_code->minutes) * 60 + time_code->seconds); break; case GST_SMPTE_TIME_CODE_SYSTEM_24: time_code->frames = 24 * ((time_code->hours * 60 + time_code->minutes) * 60 + time_code->seconds); break; } frame += time_code->frames; if (frame_number) { *frame_number = frame; } return TRUE; } /** * gst_smpte_time_get_timestamp: * @system: SMPTE Time Code system * @time_code: pointer to time code structure * * Converts the time code structure to a timestamp. * * Returns: Time stamp for time code, or GST_CLOCK_TIME_NONE if time * code is invalid. */ GstClockTime gst_smpte_time_code_get_timestamp (GstSMPTETimeCodeSystem system, GstSMPTETimeCode * time_code) { int frame_number; g_return_val_if_fail (GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID (system), GST_CLOCK_TIME_NONE); g_return_val_if_fail (time_code != NULL, GST_CLOCK_TIME_NONE); if (gst_smpte_time_code_get_frame_number (system, &frame_number, time_code)) { static int framerate_n[3] = { 3000, 25, 24 }; static int framerate_d[3] = { 1001, 1, 1 }; return gst_util_uint64_scale (frame_number, GST_SECOND * framerate_d[system], framerate_n[system]); } return GST_CLOCK_TIME_NONE; } gst-plugins-good-0.10.31/ext/dv/gstsmptetimecode.h0000644000175000017500000000440511671175352016754 00000000000000/* GStreamer * Copyright (C) 2009 David A. Schleef * * 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_SMPTE_TIME_CODE_H_ #define _GST_SMPTE_TIME_CODE_H_ #include G_BEGIN_DECLS typedef struct _GstSMPTETimeCode GstSMPTETimeCode; /** * GstSMPTETimeCode: * @GST_SMPTE_TIME_CODE_SYSTEM_30: 29.97 frame per second system (NTSC) * @GST_SMPTE_TIME_CODE_SYSTEM_25: 25 frame per second system (PAL) * @GST_SMPTE_TIME_CODE_SYSTEM_24: 24 frame per second system * * Enum value representing SMPTE Time Code system. */ typedef enum { GST_SMPTE_TIME_CODE_SYSTEM_30 = 0, GST_SMPTE_TIME_CODE_SYSTEM_25, GST_SMPTE_TIME_CODE_SYSTEM_24 } GstSMPTETimeCodeSystem; struct _GstSMPTETimeCode { int hours; int minutes; int seconds; int frames; }; #define GST_SMPTE_TIME_CODE_SYSTEM_IS_VALID(x) \ ((x) >= GST_SMPTE_TIME_CODE_SYSTEM_30 && (x) <= GST_SMPTE_TIME_CODE_SYSTEM_24) #define GST_SMPTE_TIME_CODE_FORMAT "02d:%02d:%02d:%02d" #define GST_SMPTE_TIME_CODE_ARGS(timecode) \ (timecode)->hours, (timecode)->minutes, \ (timecode)->seconds, (timecode)->frames gboolean gst_smpte_time_code_is_valid (GstSMPTETimeCodeSystem system, GstSMPTETimeCode *time_code); gboolean gst_smpte_time_code_from_frame_number (GstSMPTETimeCodeSystem system, GstSMPTETimeCode *time_code, int frame_number); gboolean gst_smpte_time_code_get_frame_number (GstSMPTETimeCodeSystem system, int *frame_number, GstSMPTETimeCode *time_code); GstClockTime gst_smpte_time_code_get_timestamp (GstSMPTETimeCodeSystem system, GstSMPTETimeCode *time_code); G_END_DECLS #endif gst-plugins-good-0.10.31/ext/dv/Makefile.in0000644000175000017500000010713211720560225015261 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = smpte_test$(EXEEXT) subdir = ext/dv DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstdv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstdv_la_OBJECTS = libgstdv_la-gstdv.lo libgstdv_la-gstdvdec.lo \ libgstdv_la-gstdvdemux.lo libgstdv_la-gstsmptetimecode.lo libgstdv_la_OBJECTS = $(am_libgstdv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstdv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstdv_la_CFLAGS) $(CFLAGS) $(libgstdv_la_LDFLAGS) \ $(LDFLAGS) -o $@ PROGRAMS = $(noinst_PROGRAMS) am_smpte_test_OBJECTS = smpte_test-smpte_test.$(OBJEXT) \ smpte_test-gstsmptetimecode.$(OBJEXT) smpte_test_OBJECTS = $(am_smpte_test_OBJECTS) smpte_test_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) smpte_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(smpte_test_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstdv_la_SOURCES) $(smpte_test_SOURCES) DIST_SOURCES = $(libgstdv_la_SOURCES) $(smpte_test_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstdv.la libgstdv_la_SOURCES = gstdv.c gstdvdec.c gstdvdemux.c gstsmptetimecode.c libgstdv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) libgstdv_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBDV_LIBS) libgstdv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdv_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstdvdemux.h gstdvdec.h gstsmptetimecode.h EXTRA_DIST = NOTES smpte_test_SOURCES = smpte_test.c gstsmptetimecode.c smpte_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(LIBDV_CFLAGS) smpte_test_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/dv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/dv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstdv.la: $(libgstdv_la_OBJECTS) $(libgstdv_la_DEPENDENCIES) $(EXTRA_libgstdv_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstdv_la_LINK) -rpath $(plugindir) $(libgstdv_la_OBJECTS) $(libgstdv_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list smpte_test$(EXEEXT): $(smpte_test_OBJECTS) $(smpte_test_DEPENDENCIES) $(EXTRA_smpte_test_DEPENDENCIES) @rm -f smpte_test$(EXEEXT) $(AM_V_CCLD)$(smpte_test_LINK) $(smpte_test_OBJECTS) $(smpte_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstdv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstdvdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstdvdemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdv_la-gstsmptetimecode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smpte_test-gstsmptetimecode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smpte_test-smpte_test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstdv_la-gstdv.lo: gstdv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstdv.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstdv.Tpo -c -o libgstdv_la-gstdv.lo `test -f 'gstdv.c' || echo '$(srcdir)/'`gstdv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstdv.Tpo $(DEPDIR)/libgstdv_la-gstdv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdv.c' object='libgstdv_la-gstdv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstdv.lo `test -f 'gstdv.c' || echo '$(srcdir)/'`gstdv.c libgstdv_la-gstdvdec.lo: gstdvdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstdvdec.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstdvdec.Tpo -c -o libgstdv_la-gstdvdec.lo `test -f 'gstdvdec.c' || echo '$(srcdir)/'`gstdvdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstdvdec.Tpo $(DEPDIR)/libgstdv_la-gstdvdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdvdec.c' object='libgstdv_la-gstdvdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstdvdec.lo `test -f 'gstdvdec.c' || echo '$(srcdir)/'`gstdvdec.c libgstdv_la-gstdvdemux.lo: gstdvdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstdvdemux.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstdvdemux.Tpo -c -o libgstdv_la-gstdvdemux.lo `test -f 'gstdvdemux.c' || echo '$(srcdir)/'`gstdvdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstdvdemux.Tpo $(DEPDIR)/libgstdv_la-gstdvdemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdvdemux.c' object='libgstdv_la-gstdvdemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstdvdemux.lo `test -f 'gstdvdemux.c' || echo '$(srcdir)/'`gstdvdemux.c libgstdv_la-gstsmptetimecode.lo: gstsmptetimecode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -MT libgstdv_la-gstsmptetimecode.lo -MD -MP -MF $(DEPDIR)/libgstdv_la-gstsmptetimecode.Tpo -c -o libgstdv_la-gstsmptetimecode.lo `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdv_la-gstsmptetimecode.Tpo $(DEPDIR)/libgstdv_la-gstsmptetimecode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptetimecode.c' object='libgstdv_la-gstsmptetimecode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdv_la_CFLAGS) $(CFLAGS) -c -o libgstdv_la-gstsmptetimecode.lo `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c smpte_test-smpte_test.o: smpte_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-smpte_test.o -MD -MP -MF $(DEPDIR)/smpte_test-smpte_test.Tpo -c -o smpte_test-smpte_test.o `test -f 'smpte_test.c' || echo '$(srcdir)/'`smpte_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-smpte_test.Tpo $(DEPDIR)/smpte_test-smpte_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smpte_test.c' object='smpte_test-smpte_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-smpte_test.o `test -f 'smpte_test.c' || echo '$(srcdir)/'`smpte_test.c smpte_test-smpte_test.obj: smpte_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-smpte_test.obj -MD -MP -MF $(DEPDIR)/smpte_test-smpte_test.Tpo -c -o smpte_test-smpte_test.obj `if test -f 'smpte_test.c'; then $(CYGPATH_W) 'smpte_test.c'; else $(CYGPATH_W) '$(srcdir)/smpte_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-smpte_test.Tpo $(DEPDIR)/smpte_test-smpte_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smpte_test.c' object='smpte_test-smpte_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-smpte_test.obj `if test -f 'smpte_test.c'; then $(CYGPATH_W) 'smpte_test.c'; else $(CYGPATH_W) '$(srcdir)/smpte_test.c'; fi` smpte_test-gstsmptetimecode.o: gstsmptetimecode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-gstsmptetimecode.o -MD -MP -MF $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo -c -o smpte_test-gstsmptetimecode.o `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo $(DEPDIR)/smpte_test-gstsmptetimecode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptetimecode.c' object='smpte_test-gstsmptetimecode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-gstsmptetimecode.o `test -f 'gstsmptetimecode.c' || echo '$(srcdir)/'`gstsmptetimecode.c smpte_test-gstsmptetimecode.obj: gstsmptetimecode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -MT smpte_test-gstsmptetimecode.obj -MD -MP -MF $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo -c -o smpte_test-gstsmptetimecode.obj `if test -f 'gstsmptetimecode.c'; then $(CYGPATH_W) 'gstsmptetimecode.c'; else $(CYGPATH_W) '$(srcdir)/gstsmptetimecode.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/smpte_test-gstsmptetimecode.Tpo $(DEPDIR)/smpte_test-gstsmptetimecode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptetimecode.c' object='smpte_test-gstsmptetimecode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smpte_test_CFLAGS) $(CFLAGS) -c -o smpte_test-gstsmptetimecode.obj `if test -f 'gstsmptetimecode.c'; then $(CYGPATH_W) 'gstsmptetimecode.c'; else $(CYGPATH_W) '$(srcdir)/gstsmptetimecode.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS clean-pluginLTLIBRARIES \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/dv/gstdvdec.c0000644000175000017500000004342011677341654015200 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2005> Wim Taymans * * 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-dvdec * * dvdec decodes DV video into raw video. The element expects a full DV frame * as input, which is 120000 bytes for NTSC and 144000 for PAL video. * * This element can perform simple frame dropping with the #GstDVDec:drop-factor * property. Setting this property to a value N > 1 will only decode every * Nth frame. * * * Example launch line * |[ * gst-launch filesrc location=test.dv ! dvdemux name=demux ! dvdec ! xvimagesink * ]| This pipeline decodes and renders the raw DV stream to a videosink. * * * Last reviewed on 2006-02-28 (0.10.3) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gstdvdec.h" /* sizes of one input buffer */ #define NTSC_HEIGHT 480 #define NTSC_BUFFER 120000 #define NTSC_FRAMERATE_NUMERATOR 30000 #define NTSC_FRAMERATE_DENOMINATOR 1001 #define PAL_HEIGHT 576 #define PAL_BUFFER 144000 #define PAL_FRAMERATE_NUMERATOR 25 #define PAL_FRAMERATE_DENOMINATOR 1 #define PAL_NORMAL_PAR_X 59 #define PAL_NORMAL_PAR_Y 54 #define PAL_WIDE_PAR_X 118 #define PAL_WIDE_PAR_Y 81 #define NTSC_NORMAL_PAR_X 10 #define NTSC_NORMAL_PAR_Y 11 #define NTSC_WIDE_PAR_X 40 #define NTSC_WIDE_PAR_Y 33 #define DV_DEFAULT_QUALITY DV_QUALITY_BEST #define DV_DEFAULT_DECODE_NTH 1 GST_DEBUG_CATEGORY_STATIC (dvdec_debug); #define GST_CAT_DEFAULT dvdec_debug enum { PROP_0, PROP_CLAMP_LUMA, PROP_CLAMP_CHROMA, PROP_QUALITY, PROP_DECODE_NTH }; const gint qualities[] = { DV_QUALITY_DC, DV_QUALITY_AC_1, DV_QUALITY_AC_2, DV_QUALITY_DC | DV_QUALITY_COLOR, DV_QUALITY_AC_1 | DV_QUALITY_COLOR, DV_QUALITY_AC_2 | DV_QUALITY_COLOR }; static GstStaticPadTemplate sink_temp = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-dv, systemstream = (boolean) false") ); static GstStaticPadTemplate src_temp = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv, " "format = (fourcc) YUY2, " "width = (int) 720, " "framerate = (fraction) [ 1/1, 60/1 ];" "video/x-raw-rgb, " "bpp = (int) 32, " "depth = (int) 24, " "endianness = (int) " G_STRINGIFY (G_BIG_ENDIAN) ", " "red_mask = (int) 0x0000ff00, " "green_mask = (int) 0x00ff0000, " "blue_mask = (int) 0xff000000, " "width = (int) 720, " "framerate = (fraction) [ 1/1, 60/1 ];" "video/x-raw-rgb, " "bpp = (int) 24, " "depth = (int) 24, " "endianness = (int) " G_STRINGIFY (G_BIG_ENDIAN) ", " "red_mask = (int) 0x00ff0000, " "green_mask = (int) 0x0000ff00, " "blue_mask = (int) 0x000000ff, " "width = (int) 720, " "framerate = (fraction) [ 1/1, 60/1 ]") ); #define GST_TYPE_DVDEC_QUALITY (gst_dvdec_quality_get_type()) static GType gst_dvdec_quality_get_type (void) { static GType qtype = 0; if (qtype == 0) { static const GEnumValue values[] = { {0, "Monochrome, DC (Fastest)", "fastest"}, {1, "Monochrome, first AC coefficient", "monochrome-ac"}, {2, "Monochrome, highest quality", "monochrome-best"}, {3, "Colour, DC, fastest", "colour-fastest"}, {4, "Colour, using only the first AC coefficient", "colour-ac"}, {5, "Highest quality colour decoding", "best"}, {0, NULL, NULL}, }; qtype = g_enum_register_static ("GstDVDecQualityEnum", values); } return qtype; } GST_BOILERPLATE (GstDVDec, gst_dvdec, GstElement, GST_TYPE_ELEMENT); static void gst_dvdec_finalize (GObject * object); static gboolean gst_dvdec_sink_setcaps (GstPad * pad, GstCaps * caps); static GstFlowReturn gst_dvdec_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_dvdec_sink_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_dvdec_change_state (GstElement * element, GstStateChange transition); static void gst_dvdec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_dvdec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_dvdec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_temp); gst_element_class_add_static_pad_template (element_class, &src_temp); gst_element_class_set_details_simple (element_class, "DV video decoder", "Codec/Decoder/Video", "Uses libdv to decode DV video (smpte314) (libdv.sourceforge.net)", "Erik Walthinsen ," "Wim Taymans "); GST_DEBUG_CATEGORY_INIT (dvdec_debug, "dvdec", 0, "DV decoding element"); } static void gst_dvdec_class_init (GstDVDecClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_dvdec_finalize; gobject_class->set_property = gst_dvdec_set_property; gobject_class->get_property = gst_dvdec_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CLAMP_LUMA, g_param_spec_boolean ("clamp-luma", "Clamp luma", "Clamp luma", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CLAMP_CHROMA, g_param_spec_boolean ("clamp-chroma", "Clamp chroma", "Clamp chroma", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QUALITY, g_param_spec_enum ("quality", "Quality", "Decoding quality", GST_TYPE_DVDEC_QUALITY, DV_DEFAULT_QUALITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DECODE_NTH, g_param_spec_int ("drop-factor", "Drop Factor", "Only decode Nth frame", 1, G_MAXINT, DV_DEFAULT_DECODE_NTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = gst_dvdec_change_state; } static void gst_dvdec_init (GstDVDec * dvdec, GstDVDecClass * g_class) { dvdec->sinkpad = gst_pad_new_from_static_template (&sink_temp, "sink"); gst_pad_set_setcaps_function (dvdec->sinkpad, GST_DEBUG_FUNCPTR (gst_dvdec_sink_setcaps)); gst_pad_set_chain_function (dvdec->sinkpad, gst_dvdec_chain); gst_pad_set_event_function (dvdec->sinkpad, gst_dvdec_sink_event); gst_element_add_pad (GST_ELEMENT (dvdec), dvdec->sinkpad); dvdec->srcpad = gst_pad_new_from_static_template (&src_temp, "src"); gst_pad_use_fixed_caps (dvdec->srcpad); gst_element_add_pad (GST_ELEMENT (dvdec), dvdec->srcpad); dvdec->framerate_numerator = 0; dvdec->framerate_denominator = 0; dvdec->wide = FALSE; dvdec->drop_factor = 1; dvdec->clamp_luma = FALSE; dvdec->clamp_chroma = FALSE; dvdec->quality = DV_DEFAULT_QUALITY; dvdec->segment = gst_segment_new (); } static void gst_dvdec_finalize (GObject * object) { GstDVDec *dvdec = GST_DVDEC (object); gst_segment_free (dvdec->segment); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_dvdec_sink_setcaps (GstPad * pad, GstCaps * caps) { GstDVDec *dvdec; GstStructure *s; const GValue *par = NULL, *rate = NULL; dvdec = GST_DVDEC (gst_pad_get_parent (pad)); /* first parse the caps */ s = gst_caps_get_structure (caps, 0); /* we allow framerate and PAR to be overwritten. framerate is mandatory. */ if (!(rate = gst_structure_get_value (s, "framerate"))) goto no_framerate; par = gst_structure_get_value (s, "pixel-aspect-ratio"); if (par) { dvdec->par_x = gst_value_get_fraction_numerator (par); dvdec->par_y = gst_value_get_fraction_denominator (par); dvdec->need_par = FALSE; } else { dvdec->par_x = 0; dvdec->par_y = 0; dvdec->need_par = TRUE; } dvdec->framerate_numerator = gst_value_get_fraction_numerator (rate); dvdec->framerate_denominator = gst_value_get_fraction_denominator (rate); dvdec->sink_negotiated = TRUE; dvdec->src_negotiated = FALSE; gst_object_unref (dvdec); return TRUE; /* ERRORS */ no_framerate: { GST_DEBUG_OBJECT (dvdec, "no framerate specified in caps"); gst_object_unref (dvdec); return FALSE; } } static gboolean gst_dvdec_src_negotiate (GstDVDec * dvdec) { GstCaps *othercaps; /* no PAR was specified in input, derive from encoded data */ if (dvdec->need_par) { if (dvdec->PAL) { if (dvdec->wide) { dvdec->par_x = PAL_WIDE_PAR_X; dvdec->par_y = PAL_WIDE_PAR_Y; } else { dvdec->par_x = PAL_NORMAL_PAR_X; dvdec->par_y = PAL_NORMAL_PAR_Y; } } else { if (dvdec->wide) { dvdec->par_x = NTSC_WIDE_PAR_X; dvdec->par_y = NTSC_WIDE_PAR_Y; } else { dvdec->par_x = NTSC_NORMAL_PAR_X; dvdec->par_y = NTSC_NORMAL_PAR_Y; } } GST_DEBUG_OBJECT (dvdec, "Inferred PAR %d/%d from video format", dvdec->par_x, dvdec->par_y); } /* ignoring rgb, bgr0 for now */ dvdec->bpp = 2; othercaps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_STR_FOURCC ("YUY2"), "width", G_TYPE_INT, 720, "height", G_TYPE_INT, dvdec->height, "framerate", GST_TYPE_FRACTION, dvdec->framerate_numerator, dvdec->framerate_denominator, "pixel-aspect-ratio", GST_TYPE_FRACTION, dvdec->par_x, dvdec->par_y, "interlaced", G_TYPE_BOOLEAN, dvdec->interlaced, NULL); gst_pad_set_caps (dvdec->srcpad, othercaps); gst_caps_unref (othercaps); dvdec->src_negotiated = TRUE; return TRUE; } static gboolean gst_dvdec_sink_event (GstPad * pad, GstEvent * event) { GstDVDec *dvdec; gboolean res = TRUE; dvdec = GST_DVDEC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_segment_init (dvdec->segment, GST_FORMAT_UNDEFINED); break; case GST_EVENT_NEWSEGMENT:{ gboolean update; gdouble rate, applied_rate; GstFormat format; gint64 start, stop, position; gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, &format, &start, &stop, &position); GST_DEBUG_OBJECT (dvdec, "Got NEWSEGMENT [%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "]", GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); gst_segment_set_newsegment_full (dvdec->segment, update, rate, applied_rate, format, start, stop, position); break; } default: break; } res = gst_pad_push_event (dvdec->srcpad, event); return res; } static GstFlowReturn gst_dvdec_chain (GstPad * pad, GstBuffer * buf) { GstDVDec *dvdec; guint8 *inframe; guint8 *outframe; guint8 *outframe_ptrs[3]; gint outframe_pitches[3]; GstBuffer *outbuf; GstFlowReturn ret = GST_FLOW_OK; guint length; gint64 cstart, cstop; gboolean PAL, wide; dvdec = GST_DVDEC (gst_pad_get_parent (pad)); inframe = GST_BUFFER_DATA (buf); /* buffer should be at least the size of one NTSC frame, this should * be enough to decode the header. */ if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < NTSC_BUFFER)) goto wrong_size; /* preliminary dropping. unref and return if outside of configured segment */ if ((dvdec->segment->format == GST_FORMAT_TIME) && (!(gst_segment_clip (dvdec->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buf), GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf), &cstart, &cstop)))) goto dropping; if (G_UNLIKELY (dv_parse_header (dvdec->decoder, inframe) < 0)) goto parse_header_error; /* get size */ PAL = dv_system_50_fields (dvdec->decoder); wide = dv_format_wide (dvdec->decoder); /* check the buffer is of right size after we know if we are * dealing with PAL or NTSC */ length = (PAL ? PAL_BUFFER : NTSC_BUFFER); if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < length)) goto wrong_size; dv_parse_packs (dvdec->decoder, inframe); if (dvdec->video_offset % dvdec->drop_factor != 0) goto skip; /* renegotiate on change */ if (PAL != dvdec->PAL || wide != dvdec->wide) { dvdec->src_negotiated = FALSE; dvdec->PAL = PAL; dvdec->wide = wide; } dvdec->height = (dvdec->PAL ? PAL_HEIGHT : NTSC_HEIGHT); dvdec->interlaced = !dv_is_progressive (dvdec->decoder); /* negotiate if not done yet */ if (!dvdec->src_negotiated) { if (!gst_dvdec_src_negotiate (dvdec)) goto not_negotiated; } ret = gst_pad_alloc_buffer_and_set_caps (dvdec->srcpad, 0, (720 * dvdec->height) * dvdec->bpp, GST_PAD_CAPS (dvdec->srcpad), &outbuf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto no_buffer; outframe = GST_BUFFER_DATA (outbuf); outframe_ptrs[0] = outframe; outframe_pitches[0] = 720 * dvdec->bpp; /* the rest only matters for YUY2 */ if (dvdec->bpp < 3) { outframe_ptrs[1] = outframe_ptrs[0] + 720 * dvdec->height; outframe_ptrs[2] = outframe_ptrs[1] + 360 * dvdec->height; outframe_pitches[1] = dvdec->height / 2; outframe_pitches[2] = outframe_pitches[1]; } GST_DEBUG_OBJECT (dvdec, "decoding and pushing buffer"); dv_decode_full_frame (dvdec->decoder, inframe, e_dv_color_yuv, outframe_ptrs, outframe_pitches); GST_BUFFER_FLAG_UNSET (outbuf, GST_VIDEO_BUFFER_TFF); GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buf); GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_END (buf); GST_BUFFER_TIMESTAMP (outbuf) = cstart; GST_BUFFER_DURATION (outbuf) = cstop - cstart; ret = gst_pad_push (dvdec->srcpad, outbuf); skip: dvdec->video_offset++; done: gst_buffer_unref (buf); gst_object_unref (dvdec); return ret; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (dvdec, STREAM, DECODE, (NULL), ("Input buffer too small")); ret = GST_FLOW_ERROR; goto done; } parse_header_error: { GST_ELEMENT_ERROR (dvdec, STREAM, DECODE, (NULL), ("Error parsing DV header")); ret = GST_FLOW_ERROR; goto done; } not_negotiated: { GST_DEBUG_OBJECT (dvdec, "could not negotiate output"); ret = GST_FLOW_NOT_NEGOTIATED; goto done; } no_buffer: { GST_DEBUG_OBJECT (dvdec, "could not allocate buffer"); goto done; } dropping: { GST_DEBUG_OBJECT (dvdec, "dropping buffer since it's out of the configured segment"); goto done; } } static GstStateChangeReturn gst_dvdec_change_state (GstElement * element, GstStateChange transition) { GstDVDec *dvdec = GST_DVDEC (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: dvdec->decoder = dv_decoder_new (0, dvdec->clamp_luma, dvdec->clamp_chroma); dvdec->decoder->quality = qualities[dvdec->quality]; dv_set_error_log (dvdec->decoder, NULL); gst_segment_init (dvdec->segment, GST_FORMAT_UNDEFINED); dvdec->src_negotiated = FALSE; dvdec->sink_negotiated = FALSE; /* * Enable this function call when libdv2 0.100 or higher is more * common */ /* dv_set_quality (dvdec->decoder, qualities [dvdec->quality]); */ break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: dv_decoder_free (dvdec->decoder); dvdec->decoder = NULL; break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static void gst_dvdec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDVDec *dvdec = GST_DVDEC (object); switch (prop_id) { case PROP_CLAMP_LUMA: dvdec->clamp_luma = g_value_get_boolean (value); break; case PROP_CLAMP_CHROMA: dvdec->clamp_chroma = g_value_get_boolean (value); break; case PROP_QUALITY: dvdec->quality = g_value_get_enum (value); if ((dvdec->quality < 0) || (dvdec->quality > 5)) dvdec->quality = 0; break; case PROP_DECODE_NTH: dvdec->drop_factor = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_dvdec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDVDec *dvdec = GST_DVDEC (object); switch (prop_id) { case PROP_CLAMP_LUMA: g_value_set_boolean (value, dvdec->clamp_luma); break; case PROP_CLAMP_CHROMA: g_value_set_boolean (value, dvdec->clamp_chroma); break; case PROP_QUALITY: g_value_set_enum (value, dvdec->quality); break; case PROP_DECODE_NTH: g_value_set_int (value, dvdec->drop_factor); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/ext/dv/smpte_test.c0000644000175000017500000000421111671175352015551 00000000000000 #include "config.h" #include "gstsmptetimecode.h" #include #define NTSC_FRAMES_PER_10_MINS (10*60*30 - 10*2 + 2) #define NTSC_FRAMES_PER_HOUR (6*NTSC_FRAMES_PER_10_MINS) int main (int argc, char *argv[]) { GstSMPTETimeCode tc; int i; int min; for (min = 0; min < 3; min++) { g_print ("--- minute %d ---\n", min); for (i = min * 60 * 30 - 5; i <= min * 60 * 30 + 5; i++) { gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, i); g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, tc.frames); } } for (min = 9; min < 12; min++) { g_print ("--- minute %d ---\n", min); for (i = min * 60 * 30 - 5 - 18; i <= min * 60 * 30 + 5 - 18; i++) { gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, i); g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, tc.frames); } } for (min = -1; min < 2; min++) { int offset = NTSC_FRAMES_PER_HOUR; g_print ("--- minute %d ---\n", min); for (i = offset + min * 60 * 30 - 5; i <= offset + min * 60 * 30 + 5; i++) { gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, i); g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, tc.frames); } } for (min = 0; min < 1; min++) { int offset = NTSC_FRAMES_PER_HOUR; g_print ("--- minute %d ---\n", min); for (i = 24 * offset - 5; i <= 24 * offset + 5; i++) { gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, i); g_print ("%d %02d:%02d:%02d:%02d\n", i, tc.hours, tc.minutes, tc.seconds, tc.frames); } } for (i = 0; i < 24 * NTSC_FRAMES_PER_HOUR; i++) { int fn; int ret; gst_smpte_time_code_from_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &tc, i); ret = gst_smpte_time_code_get_frame_number (GST_SMPTE_TIME_CODE_SYSTEM_30, &fn, &tc); if (!ret) { g_print ("bad valid at %d\n", i); } if (fn != i) { g_print ("index mismatch %d != %d\n", fn, i); } } return 0; } gst-plugins-good-0.10.31/ext/wavpack/0000755000175000017500000000000011720565322014316 500000000000000gst-plugins-good-0.10.31/ext/wavpack/gstwavpackdec.c0000644000175000017500000003677511677341654017265 00000000000000/* GStreamer Wavpack plugin * Copyright (c) 2005 Arwed v. Merkatz * Copyright (c) 2006 Edward Hervey * Copyright (c) 2006 Sebastian Dröge * * gstwavpackdec.c: raw Wavpack bitstream decoder * * 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-wavpackdec * * WavpackDec decodes framed (for example by the WavpackParse element) * Wavpack streams and decodes them to raw audio. * Wavpack is an open-source * audio codec that features both lossless and lossy encoding. * * * Example launch line * |[ * gst-launch filesrc location=test.wv ! wavpackparse ! wavpackdec ! audioconvert ! audioresample ! autoaudiosink * ]| This pipeline decodes the Wavpack file test.wv into raw audio buffers and * tries to play it back using an automatically found audio sink. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include "gstwavpackdec.h" #include "gstwavpackcommon.h" #include "gstwavpackstreamreader.h" #define WAVPACK_DEC_MAX_ERRORS 16 GST_DEBUG_CATEGORY_STATIC (gst_wavpack_dec_debug); #define GST_CAT_DEFAULT gst_wavpack_dec_debug static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack, " "width = (int) [ 1, 32 ], " "channels = (int) [ 1, 8 ], " "rate = (int) [ 6000, 192000 ], " "framed = (boolean) true") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "width = (int) 32, " "depth = (int) [ 1, 32 ], " "channels = (int) [ 1, 8 ], " "rate = (int) [ 6000, 192000 ], " "endianness = (int) BYTE_ORDER, " "signed = (boolean) true") ); static GstFlowReturn gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_wavpack_dec_sink_set_caps (GstPad * pad, GstCaps * caps); static gboolean gst_wavpack_dec_sink_event (GstPad * pad, GstEvent * event); static void gst_wavpack_dec_finalize (GObject * object); static GstStateChangeReturn gst_wavpack_dec_change_state (GstElement * element, GstStateChange transition); static void gst_wavpack_dec_post_tags (GstWavpackDec * dec); GST_BOILERPLATE (GstWavpackDec, gst_wavpack_dec, GstElement, GST_TYPE_ELEMENT); static void gst_wavpack_dec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Wavpack audio decoder", "Codec/Decoder/Audio", "Decodes Wavpack audio data", "Arwed v. Merkatz , " "Sebastian Dröge "); } static void gst_wavpack_dec_class_init (GstWavpackDecClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_wavpack_dec_change_state); gobject_class->finalize = gst_wavpack_dec_finalize; } static void gst_wavpack_dec_reset (GstWavpackDec * dec) { dec->wv_id.buffer = NULL; dec->wv_id.position = dec->wv_id.length = 0; dec->error_count = 0; dec->channels = 0; dec->channel_mask = 0; dec->sample_rate = 0; dec->depth = 0; gst_segment_init (&dec->segment, GST_FORMAT_TIME); dec->next_block_index = 0; } static void gst_wavpack_dec_init (GstWavpackDec * dec, GstWavpackDecClass * gklass) { dec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_pad_set_chain_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_dec_chain)); gst_pad_set_setcaps_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_dec_sink_set_caps)); gst_pad_set_event_function (dec->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_dec_sink_event)); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); dec->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_use_fixed_caps (dec->srcpad); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); dec->context = NULL; dec->stream_reader = gst_wavpack_stream_reader_new (); gst_wavpack_dec_reset (dec); } static void gst_wavpack_dec_finalize (GObject * object) { GstWavpackDec *dec = GST_WAVPACK_DEC (object); g_free (dec->stream_reader); dec->stream_reader = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_wavpack_dec_sink_set_caps (GstPad * pad, GstCaps * caps) { GstWavpackDec *dec = GST_WAVPACK_DEC (gst_pad_get_parent (pad)); GstStructure *structure = gst_caps_get_structure (caps, 0); /* Check if we can set the caps here already */ if (gst_structure_get_int (structure, "channels", &dec->channels) && gst_structure_get_int (structure, "rate", &dec->sample_rate) && gst_structure_get_int (structure, "width", &dec->depth)) { GstCaps *caps; GstAudioChannelPosition *pos; caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, dec->sample_rate, "channels", G_TYPE_INT, dec->channels, "depth", G_TYPE_INT, dec->depth, "width", G_TYPE_INT, 32, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, NULL); /* If we already have the channel layout set from upstream * take this */ if (gst_structure_has_field (structure, "channel-positions")) { pos = gst_audio_get_channel_positions (structure); if (pos != NULL && dec->channels > 2) { GstStructure *new_str = gst_caps_get_structure (caps, 0); gst_audio_set_channel_positions (new_str, pos); dec->channel_mask = gst_wavpack_get_channel_mask_from_positions (pos, dec->channels); } if (pos != NULL) g_free (pos); } GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps); /* should always succeed */ gst_pad_set_caps (dec->srcpad, caps); gst_caps_unref (caps); /* send GST_TAG_AUDIO_CODEC and GST_TAG_BITRATE tags before something * is decoded or after the format has changed */ gst_wavpack_dec_post_tags (dec); } gst_object_unref (dec); return TRUE; } static void gst_wavpack_dec_post_tags (GstWavpackDec * dec) { GstTagList *list; GstFormat format_time = GST_FORMAT_TIME, format_bytes = GST_FORMAT_BYTES; gint64 duration, size; list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, "Wavpack", NULL); /* try to estimate the average bitrate */ if (gst_pad_query_peer_duration (dec->sinkpad, &format_bytes, &size) && gst_pad_query_peer_duration (dec->sinkpad, &format_time, &duration) && size > 0 && duration > 0) { guint64 bitrate; bitrate = gst_util_uint64_scale (size, 8 * GST_SECOND, duration); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, (guint) bitrate, NULL); } gst_element_post_message (GST_ELEMENT (dec), gst_message_new_tag (GST_OBJECT (dec), list)); } static GstFlowReturn gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buf) { GstWavpackDec *dec; GstBuffer *outbuf = NULL; GstFlowReturn ret = GST_FLOW_OK; WavpackHeader wph; int32_t decoded, unpacked_size; gboolean format_changed; dec = GST_WAVPACK_DEC (GST_PAD_PARENT (pad)); /* check input, we only accept framed input with complete chunks */ if (GST_BUFFER_SIZE (buf) < sizeof (WavpackHeader)) goto input_not_framed; if (!gst_wavpack_read_header (&wph, GST_BUFFER_DATA (buf))) goto invalid_header; if (GST_BUFFER_SIZE (buf) < wph.ckSize + 4 * 1 + 4) goto input_not_framed; if (!(wph.flags & INITIAL_BLOCK)) goto input_not_framed; dec->wv_id.buffer = GST_BUFFER_DATA (buf); dec->wv_id.length = GST_BUFFER_SIZE (buf); dec->wv_id.position = 0; /* create a new wavpack context if there is none yet but if there * was already one (i.e. caps were set on the srcpad) check whether * the new one has the same caps */ if (!dec->context) { gchar error_msg[80]; dec->context = WavpackOpenFileInputEx (dec->stream_reader, &dec->wv_id, NULL, error_msg, OPEN_STREAMING, 0); if (!dec->context) { GST_WARNING ("Couldn't decode buffer: %s", error_msg); dec->error_count++; if (dec->error_count <= WAVPACK_DEC_MAX_ERRORS) { goto out; /* just return OK for now */ } else { goto decode_error; } } } g_assert (dec->context != NULL); dec->error_count = 0; format_changed = (dec->sample_rate != WavpackGetSampleRate (dec->context)) || (dec->channels != WavpackGetNumChannels (dec->context)) || (dec->depth != WavpackGetBitsPerSample (dec->context)) || #ifdef WAVPACK_OLD_API (dec->channel_mask != dec->context->config.channel_mask); #else (dec->channel_mask != WavpackGetChannelMask (dec->context)); #endif if (!GST_PAD_CAPS (dec->srcpad) || format_changed) { GstCaps *caps; gint channel_mask; dec->sample_rate = WavpackGetSampleRate (dec->context); dec->channels = WavpackGetNumChannels (dec->context); dec->depth = WavpackGetBitsPerSample (dec->context); caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, dec->sample_rate, "channels", G_TYPE_INT, dec->channels, "depth", G_TYPE_INT, dec->depth, "width", G_TYPE_INT, 32, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, NULL); #ifdef WAVPACK_OLD_API channel_mask = dec->context->config.channel_mask; #else channel_mask = WavpackGetChannelMask (dec->context); #endif if (channel_mask == 0) channel_mask = gst_wavpack_get_default_channel_mask (dec->channels); dec->channel_mask = channel_mask; /* Only set the channel layout for more than two channels * otherwise things break unfortunately */ if (channel_mask != 0 && dec->channels > 2) if (!gst_wavpack_set_channel_layout (caps, channel_mask)) GST_WARNING_OBJECT (dec, "Failed to set channel layout"); GST_DEBUG_OBJECT (dec, "setting caps %" GST_PTR_FORMAT, caps); /* should always succeed */ gst_pad_set_caps (dec->srcpad, caps); gst_caps_unref (caps); /* send GST_TAG_AUDIO_CODEC and GST_TAG_BITRATE tags before something * is decoded or after the format has changed */ gst_wavpack_dec_post_tags (dec); } /* alloc output buffer */ unpacked_size = 4 * wph.block_samples * dec->channels; ret = gst_pad_alloc_buffer (dec->srcpad, GST_BUFFER_OFFSET (buf), unpacked_size, GST_PAD_CAPS (dec->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto out; gst_buffer_copy_metadata (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS); /* If we got a DISCONT buffer forward the flag. Nothing else * has to be done as libwavpack doesn't store state between * Wavpack blocks */ if (GST_BUFFER_IS_DISCONT (buf) || dec->next_block_index != wph.block_index) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); dec->next_block_index = wph.block_index + wph.block_samples; /* decode */ decoded = WavpackUnpackSamples (dec->context, (int32_t *) GST_BUFFER_DATA (outbuf), wph.block_samples); if (decoded != wph.block_samples) goto decode_error; if ((outbuf = gst_audio_buffer_clip (outbuf, &dec->segment, dec->sample_rate, 4 * dec->channels))) { GST_LOG_OBJECT (dec, "pushing buffer with time %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); ret = gst_pad_push (dec->srcpad, outbuf); } out: if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_DEBUG_OBJECT (dec, "flow: %s", gst_flow_get_name (ret)); } gst_buffer_unref (buf); return ret; /* ERRORS */ input_not_framed: { GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("Expected framed input")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } invalid_header: { GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("Invalid wavpack header")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } decode_error: { const gchar *reason = "unknown"; if (dec->context) { #ifdef WAVPACK_OLD_API reason = dec->context->error_message; #else reason = WavpackGetErrorMessage (dec->context); #endif } else { reason = "couldn't create decoder context"; } GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("Failed to decode wavpack stream: %s", reason)); if (outbuf) gst_buffer_unref (outbuf); gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static gboolean gst_wavpack_dec_sink_event (GstPad * pad, GstEvent * event) { GstWavpackDec *dec = GST_WAVPACK_DEC (gst_pad_get_parent (pad)); GST_LOG_OBJECT (dec, "Received %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT:{ GstFormat fmt; gboolean is_update; gint64 start, end, base; gdouble rate; gst_event_parse_new_segment (event, &is_update, &rate, &fmt, &start, &end, &base); if (fmt == GST_FORMAT_TIME) { GST_DEBUG ("Got NEWSEGMENT event in GST_FORMAT_TIME, passing on (%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", GST_TIME_ARGS (start), GST_TIME_ARGS (end)); gst_segment_set_newsegment (&dec->segment, is_update, rate, fmt, start, end, base); } else { gst_segment_init (&dec->segment, GST_FORMAT_TIME); } break; } default: break; } gst_object_unref (dec); return gst_pad_event_default (pad, event); } static GstStateChangeReturn gst_wavpack_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstWavpackDec *dec = GST_WAVPACK_DEC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: if (dec->context) { WavpackCloseFile (dec->context); dec->context = NULL; } gst_wavpack_dec_reset (dec); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_wavpack_dec_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "wavpackdec", GST_RANK_PRIMARY, GST_TYPE_WAVPACK_DEC)) return FALSE; GST_DEBUG_CATEGORY_INIT (gst_wavpack_dec_debug, "wavpack_dec", 0, "Wavpack decoder"); return TRUE; } gst-plugins-good-0.10.31/ext/wavpack/gstwavpackparse.c0000644000175000017500000011302711677341654017626 00000000000000/* GStreamer wavpack plugin * Copyright (c) 2005 Arwed v. Merkatz * Copyright (c) 2006 Tim-Philipp Müller * Copyright (c) 2006 Sebastian Dröge * * gstwavpackparse.c: wavpack file parser * * 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-wavpackparse * * WavpackParse takes raw, unframed Wavpack streams and splits them into * single Wavpack chunks with information like bit depth and the position * in the stream. * Wavpack is an open-source * audio codec that features both lossless and lossy encoding. * * * Example launch line * |[ * gst-launch filesrc location=test.wv ! wavpackparse ! wavpackdec ! fakesink * ]| This pipeline decodes the Wavpack file test.wv into raw audio buffers. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include #include #include #include "gstwavpackparse.h" #include "gstwavpackstreamreader.h" #include "gstwavpackcommon.h" GST_DEBUG_CATEGORY_STATIC (gst_wavpack_parse_debug); #define GST_CAT_DEFAULT gst_wavpack_parse_debug static inline GstWavpackParseIndexEntry * gst_wavpack_parse_index_entry_new (void) { return g_slice_new (GstWavpackParseIndexEntry); } static inline void gst_wavpack_parse_index_entry_free (GstWavpackParseIndexEntry * entry) { g_slice_free (GstWavpackParseIndexEntry, entry); } static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack, " "framed = (boolean) false; " "audio/x-wavpack-correction, " "framed = (boolean) false") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-wavpack, " "width = (int) [ 1, 32 ], " "channels = (int) [ 1, 8 ], " "rate = (int) [ 6000, 192000 ], " "framed = (boolean) true") ); static GstStaticPadTemplate wvc_src_factory = GST_STATIC_PAD_TEMPLATE ("wvcsrc", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-wavpack-correction, " "framed = (boolean) true") ); static gboolean gst_wavpack_parse_sink_activate (GstPad * sinkpad); static gboolean gst_wavpack_parse_sink_activate_pull (GstPad * sinkpad, gboolean active); static void gst_wavpack_parse_loop (GstElement * element); static GstStateChangeReturn gst_wavpack_parse_change_state (GstElement * element, GstStateChange transition); static void gst_wavpack_parse_reset (GstWavpackParse * parse); static gint64 gst_wavpack_parse_get_upstream_length (GstWavpackParse * wvparse); static GstBuffer *gst_wavpack_parse_pull_buffer (GstWavpackParse * wvparse, gint64 offset, guint size, GstFlowReturn * flow); static GstFlowReturn gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf); GST_BOILERPLATE (GstWavpackParse, gst_wavpack_parse, GstElement, GST_TYPE_ELEMENT); static void gst_wavpack_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &wvc_src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Wavpack parser", "Codec/Demuxer/Audio", "Parses Wavpack files", "Arwed v. Merkatz , " "Sebastian Dröge "); } static void gst_wavpack_parse_finalize (GObject * object) { gst_wavpack_parse_reset (GST_WAVPACK_PARSE (object)); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_wavpack_parse_class_init (GstWavpackParseClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_wavpack_parse_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_wavpack_parse_change_state); } static GstWavpackParseIndexEntry * gst_wavpack_parse_index_get_last_entry (GstWavpackParse * wvparse) { g_assert (wvparse->entries != NULL); return wvparse->entries->data; } static GstWavpackParseIndexEntry * gst_wavpack_parse_index_get_entry_from_sample (GstWavpackParse * wvparse, gint64 sample_offset) { gint i; GSList *node; if (wvparse->entries == NULL) return NULL; for (node = wvparse->entries, i = 0; node; node = node->next, i++) { GstWavpackParseIndexEntry *entry; entry = node->data; GST_LOG_OBJECT (wvparse, "Index entry %03u: sample %" G_GINT64_FORMAT " @" " byte %" G_GINT64_FORMAT, i, entry->sample_offset, entry->byte_offset); if (entry->sample_offset <= sample_offset && sample_offset < entry->sample_offset_end) { GST_LOG_OBJECT (wvparse, "found match"); return entry; } /* as the list is sorted and we first look at the latest entry * we can abort searching for an entry if the sample we want is * after the latest one */ if (sample_offset >= entry->sample_offset_end) break; } GST_LOG_OBJECT (wvparse, "no match in index"); return NULL; } static void gst_wavpack_parse_index_append_entry (GstWavpackParse * wvparse, gint64 byte_offset, gint64 sample_offset, gint64 num_samples) { GstWavpackParseIndexEntry *entry; /* do we have this one already? */ if (wvparse->entries) { entry = gst_wavpack_parse_index_get_last_entry (wvparse); if (entry->byte_offset >= byte_offset || entry->sample_offset >= sample_offset) return; } GST_LOG_OBJECT (wvparse, "Adding index entry %8" G_GINT64_FORMAT " - %" GST_TIME_FORMAT " @ offset 0x%08" G_GINT64_MODIFIER "x", sample_offset, GST_TIME_ARGS (gst_util_uint64_scale_int (sample_offset, GST_SECOND, wvparse->samplerate)), byte_offset); entry = gst_wavpack_parse_index_entry_new (); entry->byte_offset = byte_offset; entry->sample_offset = sample_offset; entry->sample_offset_end = sample_offset + num_samples; wvparse->entries = g_slist_prepend (wvparse->entries, entry); } static void gst_wavpack_parse_reset (GstWavpackParse * parse) { parse->total_samples = G_GINT64_CONSTANT (-1); parse->samplerate = 0; parse->channels = 0; gst_segment_init (&parse->segment, GST_FORMAT_UNDEFINED); parse->next_block_index = 0; parse->current_offset = 0; parse->need_newsegment = TRUE; parse->discont = TRUE; parse->upstream_length = -1; if (parse->entries) { g_slist_foreach (parse->entries, (GFunc) gst_wavpack_parse_index_entry_free, NULL); g_slist_free (parse->entries); parse->entries = NULL; } if (parse->adapter) { gst_adapter_clear (parse->adapter); g_object_unref (parse->adapter); parse->adapter = NULL; } if (parse->srcpad != NULL) { gboolean res; GST_DEBUG_OBJECT (parse, "Removing src pad"); res = gst_element_remove_pad (GST_ELEMENT (parse), parse->srcpad); g_return_if_fail (res != FALSE); gst_object_unref (parse->srcpad); parse->srcpad = NULL; } g_list_foreach (parse->queued_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (parse->queued_events); parse->queued_events = NULL; if (parse->pending_buffer) gst_buffer_unref (parse->pending_buffer); parse->pending_buffer = NULL; } static const GstQueryType * gst_wavpack_parse_get_src_query_types (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_SEEKING, 0 }; return types; } static gboolean gst_wavpack_parse_src_query (GstPad * pad, GstQuery * query) { GstWavpackParse *parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad)); GstFormat format; gboolean ret = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION:{ gint64 cur; guint rate; GST_OBJECT_LOCK (parse); cur = parse->segment.last_stop; rate = parse->samplerate; GST_OBJECT_UNLOCK (parse); if (rate == 0) { GST_DEBUG_OBJECT (parse, "haven't read header yet"); break; } gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: cur = gst_util_uint64_scale_int (cur, GST_SECOND, rate); gst_query_set_position (query, GST_FORMAT_TIME, cur); ret = TRUE; break; case GST_FORMAT_DEFAULT: gst_query_set_position (query, GST_FORMAT_DEFAULT, cur); ret = TRUE; break; default: GST_DEBUG_OBJECT (parse, "cannot handle position query in " "%s format. Forwarding upstream.", gst_format_get_name (format)); ret = gst_pad_query_default (pad, query); break; } break; } case GST_QUERY_DURATION:{ gint64 len; guint rate; GST_OBJECT_LOCK (parse); rate = parse->samplerate; len = parse->total_samples; GST_OBJECT_UNLOCK (parse); if (rate == 0) { GST_DEBUG_OBJECT (parse, "haven't read header yet"); break; } gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: if (len != G_GINT64_CONSTANT (-1)) len = gst_util_uint64_scale_int (len, GST_SECOND, rate); gst_query_set_duration (query, GST_FORMAT_TIME, len); ret = TRUE; break; case GST_FORMAT_DEFAULT: gst_query_set_duration (query, GST_FORMAT_DEFAULT, len); ret = TRUE; break; default: GST_DEBUG_OBJECT (parse, "cannot handle duration query in " "%s format. Forwarding upstream.", gst_format_get_name (format)); ret = gst_pad_query_default (pad, query); break; } break; } case GST_QUERY_SEEKING:{ gst_query_parse_seeking (query, &format, NULL, NULL, NULL); if (format == GST_FORMAT_TIME || format == GST_FORMAT_DEFAULT) { gboolean seekable; gint64 duration = -1; /* only fails if we didn't read the headers yet and can't say * anything about our seeking capabilities */ if (!gst_pad_query_duration (pad, &format, &duration)) break; /* can't seek in streaming mode yet */ GST_OBJECT_LOCK (parse); seekable = (parse->adapter == NULL); GST_OBJECT_UNLOCK (parse); gst_query_set_seeking (query, format, seekable, 0, duration); ret = TRUE; } break; } default:{ ret = gst_pad_query_default (pad, query); break; } } gst_object_unref (parse); return ret; } /* returns TRUE on success, with byte_offset set to the offset of the * wavpack chunk containing the sample requested. start_sample will be * set to the first sample in the chunk starting at byte_offset. * Scanning from the last known header offset to the wanted position * when seeking forward isn't very clever, but seems fast enough in * practice and has the nice side effect of populating our index * table */ static gboolean gst_wavpack_parse_scan_to_find_sample (GstWavpackParse * parse, gint64 sample, gint64 * byte_offset, gint64 * start_sample) { GstWavpackParseIndexEntry *entry; GstFlowReturn ret; gint64 off = 0; /* first, check if we have to scan at all */ entry = gst_wavpack_parse_index_get_entry_from_sample (parse, sample); if (entry) { *byte_offset = entry->byte_offset; *start_sample = entry->sample_offset; GST_LOG_OBJECT (parse, "Found index entry: sample %" G_GINT64_FORMAT " @ offset %" G_GINT64_FORMAT, entry->sample_offset, entry->byte_offset); return TRUE; } GST_LOG_OBJECT (parse, "No matching entry in index, scanning file ..."); /* if we have an index, we can start scanning from the last known offset * in there, after all we know our wanted sample is not in the index */ if (parse->entries) { GstWavpackParseIndexEntry *entry; entry = gst_wavpack_parse_index_get_last_entry (parse); off = entry->byte_offset; } /* now scan forward until we find the chunk we're looking for or hit EOS */ do { WavpackHeader header; GstBuffer *buf; buf = gst_wavpack_parse_pull_buffer (parse, off, sizeof (WavpackHeader), &ret); if (buf == NULL) break; gst_wavpack_read_header (&header, GST_BUFFER_DATA (buf)); gst_buffer_unref (buf); if (header.flags & INITIAL_BLOCK) gst_wavpack_parse_index_append_entry (parse, off, header.block_index, header.block_samples); else continue; if (header.block_index <= sample && sample < (header.block_index + header.block_samples)) { *byte_offset = off; *start_sample = header.block_index; return TRUE; } off += header.ckSize + 8; } while (1); GST_DEBUG_OBJECT (parse, "scan failed: %s (off=0x%08" G_GINT64_MODIFIER "x)", gst_flow_get_name (ret), off); return FALSE; } static gboolean gst_wavpack_parse_send_newsegment (GstWavpackParse * wvparse, gboolean update) { GstSegment *s = &wvparse->segment; gboolean ret; gint64 stop_time = -1; gint64 start_time = 0; gint64 cur_pos_time; gint64 diff; /* segment is in DEFAULT format, but we want to send a TIME newsegment */ start_time = gst_util_uint64_scale_int (s->start, GST_SECOND, wvparse->samplerate); if (s->stop != -1) { stop_time = gst_util_uint64_scale_int (s->stop, GST_SECOND, wvparse->samplerate); } GST_DEBUG_OBJECT (wvparse, "sending newsegment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time), GST_TIME_ARGS (stop_time)); /* after a seek, s->last_stop will point to a chunk boundary, ie. from * which sample we will start sending data again, while s->start will * point to the sample we actually want to seek to and want to start * playing right after the seek. Adjust clock-time for the difference * so we start playing from start_time */ cur_pos_time = gst_util_uint64_scale_int (s->last_stop, GST_SECOND, wvparse->samplerate); diff = start_time - cur_pos_time; ret = gst_pad_push_event (wvparse->srcpad, gst_event_new_new_segment (update, s->rate, GST_FORMAT_TIME, start_time, stop_time, start_time - diff)); return ret; } static gboolean gst_wavpack_parse_handle_seek_event (GstWavpackParse * wvparse, GstEvent * event) { GstSeekFlags seek_flags; GstSeekType start_type; GstSeekType stop_type; GstSegment segment; GstFormat format; gboolean only_update; gboolean flush, ret; gdouble speed; gint64 stop; gint64 start; /* sample we want to seek to */ gint64 byte_offset; /* byte offset the chunk we seek to starts at */ gint64 chunk_start; /* first sample in chunk we seek to */ guint rate; gint64 last_stop; if (wvparse->adapter) { GST_DEBUG_OBJECT (wvparse, "seeking in streaming mode not implemented yet"); return FALSE; } gst_event_parse_seek (event, &speed, &format, &seek_flags, &start_type, &start, &stop_type, &stop); if (format != GST_FORMAT_DEFAULT && format != GST_FORMAT_TIME) { GST_DEBUG ("seeking is only supported in TIME or DEFAULT format"); return FALSE; } if (speed < 0.0) { GST_DEBUG ("only forward playback supported, rate %f not allowed", speed); return FALSE; } GST_OBJECT_LOCK (wvparse); rate = wvparse->samplerate; if (rate == 0) { GST_OBJECT_UNLOCK (wvparse); GST_DEBUG ("haven't read header yet"); return FALSE; } /* figure out the last position we need to play. If it's configured (stop != * -1), use that, else we play until the total duration of the file */ if (stop == -1) stop = wvparse->segment.duration; /* convert from time to samples if necessary */ if (format == GST_FORMAT_TIME) { if (start_type != GST_SEEK_TYPE_NONE) start = gst_util_uint64_scale_int (start, rate, GST_SECOND); if (stop_type != GST_SEEK_TYPE_NONE) stop = gst_util_uint64_scale_int (stop, rate, GST_SECOND); } if (start < 0) { GST_OBJECT_UNLOCK (wvparse); GST_DEBUG_OBJECT (wvparse, "Invalid start sample %" G_GINT64_FORMAT, start); return FALSE; } flush = ((seek_flags & GST_SEEK_FLAG_FLUSH) != 0); /* operate on segment copy until we know the seek worked */ segment = wvparse->segment; gst_segment_set_seek (&segment, speed, GST_FORMAT_DEFAULT, seek_flags, start_type, start, stop_type, stop, &only_update); #if 0 if (only_update) { wvparse->segment = segment; gst_wavpack_parse_send_newsegment (wvparse, TRUE); goto done; } #endif gst_pad_push_event (wvparse->sinkpad, gst_event_new_flush_start ()); if (flush) { gst_pad_push_event (wvparse->srcpad, gst_event_new_flush_start ()); } else { gst_pad_pause_task (wvparse->sinkpad); } GST_PAD_STREAM_LOCK (wvparse->sinkpad); /* Save current position */ last_stop = wvparse->segment.last_stop; gst_pad_push_event (wvparse->sinkpad, gst_event_new_flush_stop ()); if (flush) { gst_pad_push_event (wvparse->srcpad, gst_event_new_flush_stop ()); } GST_DEBUG_OBJECT (wvparse, "Performing seek to %" GST_TIME_FORMAT " sample %" G_GINT64_FORMAT, GST_TIME_ARGS (segment.start * GST_SECOND / rate), start); ret = gst_wavpack_parse_scan_to_find_sample (wvparse, segment.start, &byte_offset, &chunk_start); if (ret) { GST_DEBUG_OBJECT (wvparse, "new offset: %" G_GINT64_FORMAT, byte_offset); wvparse->current_offset = byte_offset; /* we want to send a newsegment event with the actual seek position * as start, even though our first buffer might start before the * configured segment. We leave it up to the decoder or sink to crop * the output buffers accordingly */ wvparse->segment = segment; wvparse->segment.last_stop = chunk_start; wvparse->need_newsegment = TRUE; wvparse->discont = (last_stop != chunk_start) ? TRUE : FALSE; /* if we're doing a segment seek, post a SEGMENT_START message */ if (wvparse->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (wvparse), gst_message_new_segment_start (GST_OBJECT_CAST (wvparse), wvparse->segment.format, wvparse->segment.last_stop)); } } else { GST_DEBUG_OBJECT (wvparse, "seek failed: don't know where to seek to"); } GST_PAD_STREAM_UNLOCK (wvparse->sinkpad); GST_OBJECT_UNLOCK (wvparse); gst_pad_start_task (wvparse->sinkpad, (GstTaskFunction) gst_wavpack_parse_loop, wvparse); return ret; } static gboolean gst_wavpack_parse_sink_event (GstPad * pad, GstEvent * event) { GstWavpackParse *parse; gboolean ret = TRUE; parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP:{ if (parse->adapter) { gst_adapter_clear (parse->adapter); } if (parse->pending_buffer) { gst_buffer_unref (parse->pending_buffer); parse->pending_buffer = NULL; parse->pending_offset = 0; } ret = gst_pad_push_event (parse->srcpad, event); break; } case GST_EVENT_NEWSEGMENT:{ parse->need_newsegment = TRUE; gst_event_unref (event); ret = TRUE; break; } case GST_EVENT_EOS:{ if (parse->adapter) { /* remove all bytes that are left in the adapter after EOS. They can't * be a complete Wavpack block and we can't do anything with them */ gst_adapter_clear (parse->adapter); } if (parse->pending_buffer) { gst_buffer_unref (parse->pending_buffer); parse->pending_buffer = NULL; parse->pending_offset = 0; } ret = gst_pad_push_event (parse->srcpad, event); break; } default:{ /* stream lock is recursive, should be fine for all events */ GST_PAD_STREAM_LOCK (pad); if (parse->srcpad == NULL) { parse->queued_events = g_list_append (parse->queued_events, event); } else { ret = gst_pad_push_event (parse->srcpad, event); } GST_PAD_STREAM_UNLOCK (pad); } } gst_object_unref (parse); return ret; } static gboolean gst_wavpack_parse_src_event (GstPad * pad, GstEvent * event) { GstWavpackParse *parse; gboolean ret; parse = GST_WAVPACK_PARSE (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: ret = gst_wavpack_parse_handle_seek_event (parse, event); break; default: ret = gst_pad_event_default (pad, event); break; } gst_object_unref (parse); return ret; } static void gst_wavpack_parse_init (GstWavpackParse * parse, GstWavpackParseClass * gclass) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (parse); GstPadTemplate *tmpl; tmpl = gst_element_class_get_pad_template (klass, "sink"); parse->sinkpad = gst_pad_new_from_template (tmpl, "sink"); gst_pad_set_activate_function (parse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_activate)); gst_pad_set_activatepull_function (parse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_activate_pull)); gst_pad_set_event_function (parse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_sink_event)); gst_pad_set_chain_function (parse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_chain)); gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad); parse->srcpad = NULL; gst_wavpack_parse_reset (parse); } static gint64 gst_wavpack_parse_get_upstream_length (GstWavpackParse * parse) { gint64 length = -1; GstFormat format = GST_FORMAT_BYTES; if (!gst_pad_query_peer_duration (parse->sinkpad, &format, &length)) { length = -1; } else { GST_DEBUG ("upstream length: %" G_GINT64_FORMAT, length); } return length; } static GstBuffer * gst_wavpack_parse_pull_buffer (GstWavpackParse * wvparse, gint64 offset, guint size, GstFlowReturn * flow) { GstFlowReturn flow_ret; GstBuffer *buf = NULL; if (offset + size > wvparse->upstream_length) { wvparse->upstream_length = gst_wavpack_parse_get_upstream_length (wvparse); if (offset + size > wvparse->upstream_length) { GST_DEBUG_OBJECT (wvparse, "EOS: %" G_GINT64_FORMAT " + %u > %" G_GINT64_FORMAT, offset, size, wvparse->upstream_length); flow_ret = GST_FLOW_UNEXPECTED; goto done; } } flow_ret = gst_pad_pull_range (wvparse->sinkpad, offset, size, &buf); if (flow_ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (wvparse, "pull_range (%" G_GINT64_FORMAT ", %u) " "failed, flow: %s", offset, size, gst_flow_get_name (flow_ret)); buf = NULL; goto done; } if (GST_BUFFER_SIZE (buf) < size) { GST_DEBUG_OBJECT (wvparse, "Short read at offset %" G_GINT64_FORMAT ", got only %u of %u bytes", offset, GST_BUFFER_SIZE (buf), size); gst_buffer_unref (buf); buf = NULL; flow_ret = GST_FLOW_UNEXPECTED; } done: if (flow) *flow = flow_ret; return buf; } static gboolean gst_wavpack_parse_create_src_pad (GstWavpackParse * wvparse, GstBuffer * buf, WavpackHeader * header) { GstWavpackMetadata meta; GstCaps *caps = NULL; guchar *bufptr; g_assert (wvparse->srcpad == NULL); bufptr = GST_BUFFER_DATA (buf) + sizeof (WavpackHeader); while (gst_wavpack_read_metadata (&meta, GST_BUFFER_DATA (buf), &bufptr)) { switch (meta.id) { case ID_WVC_BITSTREAM:{ caps = gst_caps_new_simple ("audio/x-wavpack-correction", "framed", G_TYPE_BOOLEAN, TRUE, NULL); wvparse->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (wvparse), "wvcsrc"), "wvcsrc"); break; } case ID_WV_BITSTREAM: case ID_WVX_BITSTREAM:{ WavpackStreamReader *stream_reader = gst_wavpack_stream_reader_new (); WavpackContext *wpc; gchar error_msg[80]; read_id rid; gint channel_mask; rid.buffer = GST_BUFFER_DATA (buf); rid.length = GST_BUFFER_SIZE (buf); rid.position = 0; wpc = WavpackOpenFileInputEx (stream_reader, &rid, NULL, error_msg, 0, 0); if (!wpc) return FALSE; wvparse->samplerate = WavpackGetSampleRate (wpc); wvparse->channels = WavpackGetNumChannels (wpc); wvparse->total_samples = (header->total_samples == 0xffffffff) ? G_GINT64_CONSTANT (-1) : header->total_samples; caps = gst_caps_new_simple ("audio/x-wavpack", "width", G_TYPE_INT, WavpackGetBitsPerSample (wpc), "channels", G_TYPE_INT, wvparse->channels, "rate", G_TYPE_INT, wvparse->samplerate, "framed", G_TYPE_BOOLEAN, TRUE, NULL); #ifdef WAVPACK_OLD_API channel_mask = wpc->config.channel_mask; #else channel_mask = WavpackGetChannelMask (wpc); #endif if (channel_mask == 0) channel_mask = gst_wavpack_get_default_channel_mask (wvparse->channels); if (channel_mask != 0) { if (!gst_wavpack_set_channel_layout (caps, channel_mask)) { GST_WARNING_OBJECT (wvparse, "Failed to set channel layout"); gst_caps_unref (caps); caps = NULL; WavpackCloseFile (wpc); g_free (stream_reader); break; } } wvparse->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (wvparse), "src"), "src"); WavpackCloseFile (wpc); g_free (stream_reader); break; } default:{ GST_LOG_OBJECT (wvparse, "unhandled ID: 0x%02x", meta.id); break; } } if (caps != NULL) break; } if (caps == NULL || wvparse->srcpad == NULL) return FALSE; GST_DEBUG_OBJECT (wvparse, "Added src pad with caps %" GST_PTR_FORMAT, caps); gst_pad_set_query_function (wvparse->srcpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_src_query)); gst_pad_set_query_type_function (wvparse->srcpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_get_src_query_types)); gst_pad_set_event_function (wvparse->srcpad, GST_DEBUG_FUNCPTR (gst_wavpack_parse_src_event)); gst_pad_set_caps (wvparse->srcpad, caps); gst_caps_unref (caps); gst_pad_use_fixed_caps (wvparse->srcpad); gst_object_ref (wvparse->srcpad); gst_pad_set_active (wvparse->srcpad, TRUE); gst_element_add_pad (GST_ELEMENT (wvparse), wvparse->srcpad); gst_element_no_more_pads (GST_ELEMENT (wvparse)); return TRUE; } static GstFlowReturn gst_wavpack_parse_push_buffer (GstWavpackParse * wvparse, GstBuffer * buf, WavpackHeader * header) { GstFlowReturn ret; wvparse->current_offset += header->ckSize + 8; wvparse->segment.last_stop = header->block_index; if (wvparse->need_newsegment) { if (gst_wavpack_parse_send_newsegment (wvparse, FALSE)) wvparse->need_newsegment = FALSE; } /* send any queued events */ if (wvparse->queued_events) { GList *l; for (l = wvparse->queued_events; l != NULL; l = l->next) { gst_pad_push_event (wvparse->srcpad, GST_EVENT (l->data)); } g_list_free (wvparse->queued_events); wvparse->queued_events = NULL; } if (wvparse->pending_buffer == NULL) { wvparse->pending_buffer = buf; wvparse->pending_offset = header->block_index; } else if (wvparse->pending_offset == header->block_index) { wvparse->pending_buffer = gst_buffer_join (wvparse->pending_buffer, buf); } else { GST_ERROR ("Got incomplete block, dropping"); gst_buffer_unref (wvparse->pending_buffer); wvparse->pending_buffer = buf; wvparse->pending_offset = header->block_index; } if (!(header->flags & FINAL_BLOCK)) return GST_FLOW_OK; buf = wvparse->pending_buffer; wvparse->pending_buffer = NULL; GST_BUFFER_TIMESTAMP (buf) = gst_util_uint64_scale_int (header->block_index, GST_SECOND, wvparse->samplerate); GST_BUFFER_DURATION (buf) = gst_util_uint64_scale_int (header->block_samples, GST_SECOND, wvparse->samplerate); GST_BUFFER_OFFSET (buf) = header->block_index; GST_BUFFER_OFFSET_END (buf) = header->block_index + header->block_samples; if (wvparse->discont || wvparse->next_block_index != header->block_index) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); wvparse->discont = FALSE; } wvparse->next_block_index = header->block_index + header->block_samples; gst_buffer_set_caps (buf, GST_PAD_CAPS (wvparse->srcpad)); GST_LOG_OBJECT (wvparse, "Pushing buffer with time %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); ret = gst_pad_push (wvparse->srcpad, buf); wvparse->segment.last_stop = wvparse->next_block_index; return ret; } static guint8 * gst_wavpack_parse_find_marker (guint8 * buf, guint size) { int i; guint8 *ret = NULL; if (G_UNLIKELY (size < 4)) return NULL; for (i = 0; i < size - 4; i++) { if (memcmp (buf + i, "wvpk", 4) == 0) { ret = buf + i; break; } } return ret; } static GstFlowReturn gst_wavpack_parse_resync_loop (GstWavpackParse * parse, WavpackHeader * header) { GstFlowReturn flow_ret = GST_FLOW_UNEXPECTED; GstBuffer *buf = NULL; /* loop until we have a frame header or reach the end of the stream */ while (1) { guint8 *data, *marker; guint len, size; if (buf) { gst_buffer_unref (buf); buf = NULL; } if (parse->upstream_length == 0 || parse->upstream_length <= parse->current_offset) { parse->upstream_length = gst_wavpack_parse_get_upstream_length (parse); if (parse->upstream_length == 0 || parse->upstream_length <= parse->current_offset) { break; } } len = MIN (parse->upstream_length - parse->current_offset, 2048); GST_LOG_OBJECT (parse, "offset: %" G_GINT64_FORMAT, parse->current_offset); buf = gst_wavpack_parse_pull_buffer (parse, parse->current_offset, len, &flow_ret); /* whatever the problem is, there's nothing more for us to do for now */ if (flow_ret != GST_FLOW_OK) break; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* not enough data for a header? */ if (size < sizeof (WavpackHeader)) break; /* got a header right where we are at now? */ if (gst_wavpack_read_header (header, data)) break; /* nope, let's see if we can find one */ marker = gst_wavpack_parse_find_marker (data + 1, size - 1); if (marker) { parse->current_offset += marker - data; /* do one more loop iteration to make sure we pull enough * data for a full header, we'll bail out then */ } else { parse->current_offset += len - 4; } } if (buf) gst_buffer_unref (buf); return flow_ret; } static void gst_wavpack_parse_loop (GstElement * element) { GstWavpackParse *parse = GST_WAVPACK_PARSE (element); GstFlowReturn flow_ret; WavpackHeader header = { {0,}, 0, }; GstBuffer *buf = NULL; flow_ret = gst_wavpack_parse_resync_loop (parse, &header); if (flow_ret != GST_FLOW_OK) goto pause; GST_LOG_OBJECT (parse, "Read header at offset %" G_GINT64_FORMAT ": chunk size = %u+8", parse->current_offset, header.ckSize); buf = gst_wavpack_parse_pull_buffer (parse, parse->current_offset, header.ckSize + 8, &flow_ret); if (flow_ret != GST_FLOW_OK) goto pause; if (parse->srcpad == NULL) { if (!gst_wavpack_parse_create_src_pad (parse, buf, &header)) { GST_ERROR_OBJECT (parse, "Failed to create src pad"); flow_ret = GST_FLOW_ERROR; goto pause; } } if (header.flags & INITIAL_BLOCK) gst_wavpack_parse_index_append_entry (parse, parse->current_offset, header.block_index, header.block_samples); flow_ret = gst_wavpack_parse_push_buffer (parse, buf, &header); if (flow_ret != GST_FLOW_OK) goto pause; return; pause: { const gchar *reason = gst_flow_get_name (flow_ret); GST_LOG_OBJECT (parse, "pausing task, reason %s", reason); gst_pad_pause_task (parse->sinkpad); if (flow_ret == GST_FLOW_UNEXPECTED && parse->srcpad) { if (parse->segment.flags & GST_SEEK_FLAG_SEGMENT) { GstClockTime stop; GST_LOG_OBJECT (parse, "Sending segment done"); if ((stop = parse->segment.stop) == -1) stop = parse->segment.duration; gst_element_post_message (GST_ELEMENT_CAST (parse), gst_message_new_segment_done (GST_OBJECT_CAST (parse), parse->segment.format, stop)); } else { GST_LOG_OBJECT (parse, "Sending EOS, at end of stream"); gst_pad_push_event (parse->srcpad, gst_event_new_eos ()); } } else if (flow_ret == GST_FLOW_NOT_LINKED || flow_ret < GST_FLOW_UNEXPECTED) { GST_ELEMENT_ERROR (parse, STREAM, FAILED, (_("Internal data stream error.")), ("stream stopped, reason %s", reason)); if (parse->srcpad) gst_pad_push_event (parse->srcpad, gst_event_new_eos ()); } return; } } static gboolean gst_wavpack_parse_resync_adapter (GstAdapter * adapter) { const guint8 *buf, *marker; guint avail = gst_adapter_available (adapter); if (avail < 4) return FALSE; /* if the marker is at the beginning don't do the expensive search */ buf = gst_adapter_peek (adapter, 4); if (memcmp (buf, "wvpk", 4) == 0) return TRUE; if (avail == 4) return FALSE; /* search for the marker in the complete content of the adapter */ buf = gst_adapter_peek (adapter, avail); if (buf && (marker = gst_wavpack_parse_find_marker ((guint8 *) buf, avail))) { gst_adapter_flush (adapter, marker - buf); return TRUE; } /* flush everything except the last 4 bytes. they could contain * the start of a new marker */ gst_adapter_flush (adapter, avail - 4); return FALSE; } static GstFlowReturn gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf) { GstWavpackParse *wvparse = GST_WAVPACK_PARSE (GST_PAD_PARENT (pad)); GstFlowReturn ret = GST_FLOW_OK; WavpackHeader wph; const guint8 *tmp_buf; if (!wvparse->adapter) { wvparse->adapter = gst_adapter_new (); } if (GST_BUFFER_IS_DISCONT (buf)) { gst_adapter_clear (wvparse->adapter); wvparse->discont = TRUE; } gst_adapter_push (wvparse->adapter, buf); if (gst_adapter_available (wvparse->adapter) < sizeof (WavpackHeader)) return ret; if (!gst_wavpack_parse_resync_adapter (wvparse->adapter)) return ret; tmp_buf = gst_adapter_peek (wvparse->adapter, sizeof (WavpackHeader)); gst_wavpack_read_header (&wph, (guint8 *) tmp_buf); while (gst_adapter_available (wvparse->adapter) >= wph.ckSize + 4 * 1 + 4) { GstBuffer *outbuf = gst_adapter_take_buffer (wvparse->adapter, wph.ckSize + 4 * 1 + 4); if (!outbuf) return GST_FLOW_ERROR; if (wvparse->srcpad == NULL) { if (!gst_wavpack_parse_create_src_pad (wvparse, outbuf, &wph)) { GST_ERROR_OBJECT (wvparse, "Failed to create src pad"); ret = GST_FLOW_ERROR; break; } } ret = gst_wavpack_parse_push_buffer (wvparse, outbuf, &wph); if (ret != GST_FLOW_OK) break; if (gst_adapter_available (wvparse->adapter) >= sizeof (WavpackHeader)) { tmp_buf = gst_adapter_peek (wvparse->adapter, sizeof (WavpackHeader)); if (!gst_wavpack_parse_resync_adapter (wvparse->adapter)) break; gst_wavpack_read_header (&wph, (guint8 *) tmp_buf); } } return ret; } static GstStateChangeReturn gst_wavpack_parse_change_state (GstElement * element, GstStateChange transition) { GstWavpackParse *wvparse = GST_WAVPACK_PARSE (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_segment_init (&wvparse->segment, GST_FORMAT_DEFAULT); wvparse->segment.last_stop = 0; default: break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_wavpack_parse_reset (wvparse); break; default: break; } return ret; } static gboolean gst_wavpack_parse_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) { return gst_pad_activate_pull (sinkpad, TRUE); } else { return gst_pad_activate_push (sinkpad, TRUE); } } static gboolean gst_wavpack_parse_sink_activate_pull (GstPad * sinkpad, gboolean active) { gboolean result; if (active) { result = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_wavpack_parse_loop, GST_PAD_PARENT (sinkpad)); } else { result = gst_pad_stop_task (sinkpad); } return result; } gboolean gst_wavpack_parse_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "wavpackparse", GST_RANK_PRIMARY, GST_TYPE_WAVPACK_PARSE)) { return FALSE; } GST_DEBUG_CATEGORY_INIT (gst_wavpack_parse_debug, "wavpack_parse", 0, "Wavpack file parser"); return TRUE; } gst-plugins-good-0.10.31/ext/wavpack/gstwavpackenc.h0000644000175000017500000000521111671175352017253 00000000000000/* GStreamer Wavpack encoder plugin * Copyright (c) 2006 Sebastian Dröge * * gstwavpackenc.h: Wavpack audio encoder * * 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_WAVPACK_ENC_H__ #define __GST_WAVPACK_ENC_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_WAVPACK_ENC \ (gst_wavpack_enc_get_type()) #define GST_WAVPACK_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPACK_ENC,GstWavpackEnc)) #define GST_WAVPACK_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPACK_ENC,GstWavpackEnc)) #define GST_IS_WAVPACK_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPACK_ENC)) #define GST_IS_WAVPACK_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPACK_ENC)) typedef struct _GstWavpackEnc GstWavpackEnc; typedef struct _GstWavpackEncClass GstWavpackEncClass; typedef struct { gboolean correction; GstWavpackEnc *wavpack_enc; gboolean passthrough; } GstWavpackEncWriteID; struct _GstWavpackEnc { GstElement element; /*< private > */ GstPad *sinkpad, *srcpad; GstPad *wvcsrcpad; GstFlowReturn srcpad_last_return; GstFlowReturn wvcsrcpad_last_return; WavpackConfig *wp_config; WavpackContext *wp_context; gint samplerate; gint channels; gint channel_mask; gint8 channel_mapping[8]; gboolean need_channel_remap; gint depth; GstWavpackEncWriteID wv_id; GstWavpackEncWriteID wvc_id; guint mode; guint bitrate; gdouble bps; guint correction_mode; gboolean md5; GChecksum *md5_context; guint extra_processing; guint joint_stereo_mode; void *first_block; int32_t first_block_size; GstBuffer *pending_buffer; gint32 pending_offset; GstClockTime timestamp_offset; GstClockTime next_ts; }; struct _GstWavpackEncClass { GstElementClass parent; }; GType gst_wavpack_enc_get_type (void); gboolean gst_wavpack_enc_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_WAVPACK_ENC_H__ */ gst-plugins-good-0.10.31/ext/wavpack/gstwavpackparse.h0000644000175000017500000000615411671175352017627 00000000000000/* GStreamer wavpack plugin * (c) 2005 Arwed v. Merkatz * * gstwavpackparse.h: wavpack file parser * * 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_WAVPACK_PARSE_H__ #define __GST_WAVPACK_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_WAVPACK_PARSE \ (gst_wavpack_parse_get_type()) #define GST_WAVPACK_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPACK_PARSE,GstWavpackParse)) #define GST_WAVPACK_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPACK_PARSE,GstWavpackParseClass)) #define GST_IS_WAVPACK_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPACK_PARSE)) #define GST_IS_WAVPACK_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPACK_PARSE)) typedef struct _GstWavpackParse GstWavpackParse; typedef struct _GstWavpackParseClass GstWavpackParseClass; typedef struct _GstWavpackParseIndexEntry GstWavpackParseIndexEntry; struct _GstWavpackParseIndexEntry { gint64 byte_offset; /* byte offset of this chunk */ gint64 sample_offset; /* first sample in this chunk */ gint64 sample_offset_end; /* first sample in next chunk */ }; struct _GstWavpackParse { GstElement element; /*< private > */ GstPad *sinkpad; GstPad *srcpad; guint samplerate; guint channels; gint64 total_samples; gboolean need_newsegment; gboolean discont; gint64 current_offset; /* byte offset on sink pad */ gint64 upstream_length; /* length of file in bytes */ GstSegment segment; /* the currently configured segment, in * samples/audio frames (DEFAULT format) */ GstBuffer *pending_buffer; gint32 pending_offset; guint32 next_block_index; GstAdapter *adapter; /* when operating chain-based, otherwise NULL */ /* List of GstWavpackParseIndexEntry structs, mapping known * sample offsets to byte offsets. Is kept increasing without * gaps (ie. append only and consecutive entries must always * map to consecutive chunks in the file). */ GSList *entries; /* Queued events (e.g. tag events we receive before we create the src pad) */ GList *queued_events; /* STREAM_LOCK */ }; struct _GstWavpackParseClass { GstElementClass parent; }; GType gst_wavpack_parse_get_type (void); gboolean gst_wavpack_parse_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_WAVPACK_PARSE_H__ */ gst-plugins-good-0.10.31/ext/wavpack/gstwavpackcommon.h0000644000175000017500000000546411671175352020010 00000000000000/* GStreamer Wavpack plugin * Copyright (c) 2005 Arwed v. Merkatz * Copyright (c) 2006 Sebastian Dröge * * gstwavpackcommon.h: common helper functions * * 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_WAVPACK_COMMON_H__ #define __GST_WAVPACK_COMMON_H__ #include #include #include typedef struct { guint32 byte_length; guint8 *data; guint8 id; } GstWavpackMetadata; #define ID_UNIQUE 0x3f #define ID_OPTIONAL_DATA 0x20 #define ID_ODD_SIZE 0x40 #define ID_LARGE 0x80 #define ID_DUMMY 0x0 #define ID_ENCODER_INFO 0x1 #define ID_DECORR_TERMS 0x2 #define ID_DECORR_WEIGHTS 0x3 #define ID_DECORR_SAMPLES 0x4 #define ID_ENTROPY_VARS 0x5 #define ID_HYBRID_PROFILE 0x6 #define ID_SHAPING_WEIGHTS 0x7 #define ID_FLOAT_INFO 0x8 #define ID_INT32_INFO 0x9 #define ID_WV_BITSTREAM 0xa #define ID_WVC_BITSTREAM 0xb #define ID_WVX_BITSTREAM 0xc #define ID_CHANNEL_INFO 0xd #define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1) #define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2) #define ID_REPLAY_GAIN (ID_OPTIONAL_DATA | 0x3) #define ID_CUESHEET (ID_OPTIONAL_DATA | 0x4) #define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5) #define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6) #define ID_SAMPLE_RATE (ID_OPTIONAL_DATA | 0x7) gboolean gst_wavpack_read_header (WavpackHeader * header, guint8 * buf); gboolean gst_wavpack_read_metadata (GstWavpackMetadata * meta, guint8 * header_data, guint8 ** p_data); gint gst_wavpack_get_default_channel_mask (gint nchannels); gboolean gst_wavpack_set_channel_layout (GstCaps * caps, gint layout); GstAudioChannelPosition *gst_wavpack_get_default_channel_positions (gint nchannels); gint gst_wavpack_get_channel_mask_from_positions (GstAudioChannelPosition *pos, gint nchannels); gboolean gst_wavpack_set_channel_mapping (GstAudioChannelPosition *pos, gint nchannels, gint8 *channel_mapping); #endif gst-plugins-good-0.10.31/ext/wavpack/Makefile.am0000644000175000017500000000125711671175352016304 00000000000000plugin_LTLIBRARIES = libgstwavpack.la libgstwavpack_la_SOURCES = \ gstwavpack.c \ gstwavpackcommon.c \ gstwavpackparse.c \ gstwavpackdec.c \ gstwavpackenc.c \ gstwavpackstreamreader.c libgstwavpack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(WAVPACK_CFLAGS) libgstwavpack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(WAVPACK_LIBS) libgstwavpack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstwavpack_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstwavpackparse.h \ gstwavpackdec.h \ gstwavpackenc.h \ gstwavpackcommon.h \ gstwavpackstreamreader.h gst-plugins-good-0.10.31/ext/wavpack/gstwavpackcommon.c0000644000175000017500000001701511671175352017776 00000000000000/* GStreamer Wavpack plugin * Copyright (c) 2005 Arwed v. Merkatz * Copyright (c) 1998 - 2005 Conifer Software * Copyright (c) 2006 Sebastian Dröge * * gstwavpackcommon.c: common helper functions * * 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 "gstwavpackcommon.h" #include #include #include GST_DEBUG_CATEGORY_EXTERN (wavpack_debug); #define GST_CAT_DEFAULT wavpack_debug gboolean gst_wavpack_read_header (WavpackHeader * header, guint8 * buf) { g_memmove (header, buf, sizeof (WavpackHeader)); #ifndef WAVPACK_OLD_API WavpackLittleEndianToNative (header, (char *) WavpackHeaderFormat); #else little_endian_to_native (header, WavpackHeaderFormat); #endif return (memcmp (header->ckID, "wvpk", 4) == 0); } /* inspired by the original one in wavpack */ gboolean gst_wavpack_read_metadata (GstWavpackMetadata * wpmd, guint8 * header_data, guint8 ** p_data) { WavpackHeader hdr; guint8 *end; gst_wavpack_read_header (&hdr, header_data); end = header_data + hdr.ckSize + 8; if (end - *p_data < 2) return FALSE; wpmd->id = GST_READ_UINT8 (*p_data); wpmd->byte_length = 2 * (guint) GST_READ_UINT8 (*p_data + 1); *p_data += 2; if ((wpmd->id & ID_LARGE) == ID_LARGE) { guint extra; wpmd->id &= ~ID_LARGE; if (end - *p_data < 2) return FALSE; extra = GST_READ_UINT16_LE (*p_data); wpmd->byte_length += (extra << 9); *p_data += 2; } if ((wpmd->id & ID_ODD_SIZE) == ID_ODD_SIZE) { wpmd->id &= ~ID_ODD_SIZE; --wpmd->byte_length; } if (wpmd->byte_length > 0) { if (end - *p_data < wpmd->byte_length + (wpmd->byte_length & 1)) { wpmd->data = NULL; return FALSE; } wpmd->data = *p_data; *p_data += wpmd->byte_length + (wpmd->byte_length & 1); } else { wpmd->data = NULL; } return TRUE; } gint gst_wavpack_get_default_channel_mask (gint nchannels) { gint channel_mask = 0; /* Set the default channel mask for the given number of channels. * It's the same as for WAVE_FORMAT_EXTENDED: * http://www.microsoft.com/whdc/device/audio/multichaud.mspx */ switch (nchannels) { case 11: channel_mask |= 0x00400; channel_mask |= 0x00200; case 9: channel_mask |= 0x00100; case 8: channel_mask |= 0x00080; channel_mask |= 0x00040; case 6: channel_mask |= 0x00020; channel_mask |= 0x00010; case 4: channel_mask |= 0x00008; case 3: channel_mask |= 0x00004; case 2: channel_mask |= 0x00002; channel_mask |= 0x00001; break; case 1: /* For mono use front center */ channel_mask |= 0x00004; break; } return channel_mask; } static const struct { const guint32 ms_mask; const GstAudioChannelPosition gst_pos; } layout_mapping[] = { { 0x00001, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, { 0x00002, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { 0x00004, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { 0x00008, GST_AUDIO_CHANNEL_POSITION_LFE}, { 0x00010, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT}, { 0x00020, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { 0x00040, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, { 0x00080, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, { 0x00100, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, { 0x00200, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT}, { 0x00400, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, { 0x00800, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_CENTER */ { 0x01000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_LEFT */ { 0x02000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_CENTER */ { 0x04000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_FRONT_RIGHT */ { 0x08000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_BACK_LEFT */ { 0x10000, GST_AUDIO_CHANNEL_POSITION_INVALID}, /* TOP_BACK_CENTER */ { 0x20000, GST_AUDIO_CHANNEL_POSITION_INVALID} /* TOP_BACK_RIGHT */ }; #define MAX_CHANNEL_POSITIONS G_N_ELEMENTS (layout_mapping) gboolean gst_wavpack_set_channel_layout (GstCaps * caps, gint layout) { GstAudioChannelPosition pos[MAX_CHANNEL_POSITIONS]; GstStructure *s; gint num_channels, i, p; s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "channels", &num_channels)) g_return_val_if_reached (FALSE); if (num_channels == 1 && layout == 0x00004) { pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO; gst_audio_set_channel_positions (s, pos); return TRUE; } p = 0; for (i = 0; i < MAX_CHANNEL_POSITIONS; ++i) { if ((layout & layout_mapping[i].ms_mask) != 0) { if (p >= num_channels) { GST_WARNING ("More bits set in the channel layout map than there " "are channels! Broken file"); return FALSE; } if (layout_mapping[i].gst_pos == GST_AUDIO_CHANNEL_POSITION_INVALID) { GST_WARNING ("Unsupported channel position (mask 0x%08x) in channel " "layout map - ignoring those channels", layout_mapping[i].ms_mask); /* what to do? just ignore it and let downstream deal with a channel * layout that has INVALID positions in it for now ... */ } pos[p] = layout_mapping[i].gst_pos; ++p; } } if (p != num_channels) { GST_WARNING ("Only %d bits set in the channel layout map, but there are " "supposed to be %d channels! Broken file", p, num_channels); return FALSE; } gst_audio_set_channel_positions (s, pos); return TRUE; } GstAudioChannelPosition * gst_wavpack_get_default_channel_positions (gint nchannels) { GstAudioChannelPosition *pos = g_new (GstAudioChannelPosition, nchannels); gint i; if (nchannels == 1) { pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER; return pos; } for (i = 0; i < nchannels; i++) pos[i] = layout_mapping[i].gst_pos; return pos; } gint gst_wavpack_get_channel_mask_from_positions (GstAudioChannelPosition * pos, gint nchannels) { gint channel_mask = 0; gint i, j; if (nchannels == 1 && pos[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_MONO) { channel_mask = 0x00000004; return channel_mask; } /* FIXME: not exactly efficient but otherwise we need an inverse * mapping table too */ for (i = 0; i < nchannels; i++) { for (j = 0; j < MAX_CHANNEL_POSITIONS; j++) { if (pos[i] == layout_mapping[j].gst_pos) { channel_mask |= layout_mapping[j].ms_mask; break; } } } return channel_mask; } gboolean gst_wavpack_set_channel_mapping (GstAudioChannelPosition * pos, gint nchannels, gint8 * channel_mapping) { gint i, j; gboolean ret = TRUE; for (i = 0; i < nchannels; i++) { for (j = 0; j < MAX_CHANNEL_POSITIONS; j++) { if (pos[i] == layout_mapping[j].gst_pos) { channel_mapping[i] = j; ret &= (i == j); break; } } } return !ret; } gst-plugins-good-0.10.31/ext/wavpack/gstwavpack.c0000644000175000017500000000340211671175352016560 00000000000000/* GStreamer wavpack plugin * (c) 2004 Arwed v. Merkatz * * gstwavpack.c: plugin loader * * 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 #include "gstwavpackparse.h" #include "gstwavpackdec.h" #include "gstwavpackenc.h" /* debug category for common code */ GST_DEBUG_CATEGORY (wavpack_debug); static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (wavpack_debug, "wavpack", 0, "Wavpack elements"); #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif return (gst_wavpack_parse_plugin_init (plugin) && gst_wavpack_dec_plugin_init (plugin) && gst_wavpack_enc_plugin_init (plugin)); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "wavpack", "Wavpack lossless/lossy audio format handling", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ext/wavpack/gstwavpackstreamreader.c0000644000175000017500000000707511671175352021171 00000000000000/* GStreamer Wavpack plugin * Copyright (c) 2006 Sebastian Dröge * * gstwavpackstreamreader.c: stream reader used for decoding * * 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 #include #include #include "gstwavpackstreamreader.h" GST_DEBUG_CATEGORY_EXTERN (wavpack_debug); #define GST_CAT_DEFAULT wavpack_debug static int32_t gst_wavpack_stream_reader_read_bytes (void *id, void *data, int32_t bcount) { read_id *rid = (read_id *) id; uint32_t left = rid->length - rid->position; uint32_t to_read = MIN (left, bcount); GST_DEBUG ("Trying to read %d of %d bytes from position %d", bcount, rid->length, rid->position); if (to_read > 0) { g_memmove (data, rid->buffer + rid->position, to_read); rid->position += to_read; return to_read; } else { GST_WARNING ("Couldn't read %d bytes", bcount); return 0; } } static uint32_t gst_wavpack_stream_reader_get_pos (void *id) { GST_DEBUG ("Returning position %d", ((read_id *) id)->position); return ((read_id *) id)->position; } static int gst_wavpack_stream_reader_set_pos_abs (void *id, uint32_t pos) { GST_WARNING ("Should not be called: tried to set absolute position to %d", pos); return -1; } static int gst_wavpack_stream_reader_set_pos_rel (void *id, int32_t delta, int mode) { GST_WARNING ("Should not be called: tried to set relative position to %d" " with mode %d", delta, mode); return -1; } static int gst_wavpack_stream_reader_push_back_byte (void *id, int c) { read_id *rid = (read_id *) id; GST_DEBUG ("Pushing back one byte: 0x%x", c); rid->position -= 1; if (rid->position < 0) rid->position = 0; return rid->position; } static uint32_t gst_wavpack_stream_reader_get_length (void *id) { GST_DEBUG ("Returning length %d", ((read_id *) id)->length); return ((read_id *) id)->length; } static int gst_wavpack_stream_reader_can_seek (void *id) { GST_DEBUG ("Can't seek"); return FALSE; } static int32_t gst_wavpack_stream_reader_write_bytes (void *id, void *data, int32_t bcount) { GST_WARNING ("Should not be called, tried to write %d bytes", bcount); return 0; } WavpackStreamReader * gst_wavpack_stream_reader_new (void) { WavpackStreamReader *stream_reader = (WavpackStreamReader *) g_malloc0 (sizeof (WavpackStreamReader)); stream_reader->read_bytes = gst_wavpack_stream_reader_read_bytes; stream_reader->get_pos = gst_wavpack_stream_reader_get_pos; stream_reader->set_pos_abs = gst_wavpack_stream_reader_set_pos_abs; stream_reader->set_pos_rel = gst_wavpack_stream_reader_set_pos_rel; stream_reader->push_back_byte = gst_wavpack_stream_reader_push_back_byte; stream_reader->get_length = gst_wavpack_stream_reader_get_length; stream_reader->can_seek = gst_wavpack_stream_reader_can_seek; stream_reader->write_bytes = gst_wavpack_stream_reader_write_bytes; return stream_reader; } gst-plugins-good-0.10.31/ext/wavpack/gstwavpackenc.c0000644000175000017500000010331211677341654017255 00000000000000/* GStreamer Wavpack encoder plugin * Copyright (c) 2006 Sebastian Dröge * * gstwavpackdec.c: Wavpack audio encoder * * 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-wavpackenc * * WavpackEnc encodes raw audio into a framed Wavpack stream. * Wavpack is an open-source * audio codec that features both lossless and lossy encoding. * * * Example launch line * |[ * gst-launch audiotestsrc num-buffers=500 ! audioconvert ! wavpackenc ! filesink location=sinewave.wv * ]| This pipeline encodes audio from audiotestsrc into a Wavpack file. The audioconvert element is needed * as the Wavpack encoder only accepts input with 32 bit width (and every depth between 1 and 32 bits). * |[ * gst-launch cdda://1 ! audioconvert ! wavpackenc ! filesink location=track1.wv * ]| This pipeline encodes audio from an audio CD into a Wavpack file using * lossless encoding (the file output will be fairly large). * |[ * gst-launch cdda://1 ! audioconvert ! wavpackenc bitrate=128000 ! filesink location=track1.wv * ]| This pipeline encodes audio from an audio CD into a Wavpack file using * lossy encoding at a certain bitrate (the file will be fairly small). * */ /* * TODO: - add 32 bit float mode. CONFIG_FLOAT_DATA */ #include #include #include #include #include "gstwavpackenc.h" #include "gstwavpackcommon.h" static GstFlowReturn gst_wavpack_enc_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_wavpack_enc_sink_set_caps (GstPad * pad, GstCaps * caps); static int gst_wavpack_enc_push_block (void *id, void *data, int32_t count); static gboolean gst_wavpack_enc_sink_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_wavpack_enc_change_state (GstElement * element, GstStateChange transition); static void gst_wavpack_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_wavpack_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); enum { ARG_0, ARG_MODE, ARG_BITRATE, ARG_BITSPERSAMPLE, ARG_CORRECTION_MODE, ARG_MD5, ARG_EXTRA_PROCESSING, ARG_JOINT_STEREO_MODE }; GST_DEBUG_CATEGORY_STATIC (gst_wavpack_enc_debug); #define GST_CAT_DEFAULT gst_wavpack_enc_debug static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "width = (int) 32, " "depth = (int) [ 1, 32], " "endianness = (int) BYTE_ORDER, " "channels = (int) [ 1, 8 ], " "rate = (int) [ 6000, 192000 ]," "signed = (boolean) TRUE") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack, " "width = (int) [ 1, 32 ], " "channels = (int) [ 1, 2 ], " "rate = (int) [ 6000, 192000 ], " "framed = (boolean) TRUE") ); static GstStaticPadTemplate wvcsrc_factory = GST_STATIC_PAD_TEMPLATE ("wvcsrc", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-wavpack-correction, " "framed = (boolean) TRUE") ); enum { GST_WAVPACK_ENC_MODE_VERY_FAST = 0, GST_WAVPACK_ENC_MODE_FAST, GST_WAVPACK_ENC_MODE_DEFAULT, GST_WAVPACK_ENC_MODE_HIGH, GST_WAVPACK_ENC_MODE_VERY_HIGH }; #define GST_TYPE_WAVPACK_ENC_MODE (gst_wavpack_enc_mode_get_type ()) static GType gst_wavpack_enc_mode_get_type (void) { static GType qtype = 0; if (qtype == 0) { static const GEnumValue values[] = { #if 0 /* Very Fast Compression is not supported yet, but will be supported * in future wavpack versions */ {GST_WAVPACK_ENC_MODE_VERY_FAST, "Very Fast Compression", "veryfast"}, #endif {GST_WAVPACK_ENC_MODE_FAST, "Fast Compression", "fast"}, {GST_WAVPACK_ENC_MODE_DEFAULT, "Normal Compression", "normal"}, {GST_WAVPACK_ENC_MODE_HIGH, "High Compression", "high"}, #ifndef WAVPACK_OLD_API {GST_WAVPACK_ENC_MODE_VERY_HIGH, "Very High Compression", "veryhigh"}, #endif {0, NULL, NULL} }; qtype = g_enum_register_static ("GstWavpackEncMode", values); } return qtype; } enum { GST_WAVPACK_CORRECTION_MODE_OFF = 0, GST_WAVPACK_CORRECTION_MODE_ON, GST_WAVPACK_CORRECTION_MODE_OPTIMIZED }; #define GST_TYPE_WAVPACK_ENC_CORRECTION_MODE (gst_wavpack_enc_correction_mode_get_type ()) static GType gst_wavpack_enc_correction_mode_get_type (void) { static GType qtype = 0; if (qtype == 0) { static const GEnumValue values[] = { {GST_WAVPACK_CORRECTION_MODE_OFF, "Create no correction file", "off"}, {GST_WAVPACK_CORRECTION_MODE_ON, "Create correction file", "on"}, {GST_WAVPACK_CORRECTION_MODE_OPTIMIZED, "Create optimized correction file", "optimized"}, {0, NULL, NULL} }; qtype = g_enum_register_static ("GstWavpackEncCorrectionMode", values); } return qtype; } enum { GST_WAVPACK_JS_MODE_AUTO = 0, GST_WAVPACK_JS_MODE_LEFT_RIGHT, GST_WAVPACK_JS_MODE_MID_SIDE }; #define GST_TYPE_WAVPACK_ENC_JOINT_STEREO_MODE (gst_wavpack_enc_joint_stereo_mode_get_type ()) static GType gst_wavpack_enc_joint_stereo_mode_get_type (void) { static GType qtype = 0; if (qtype == 0) { static const GEnumValue values[] = { {GST_WAVPACK_JS_MODE_AUTO, "auto", "auto"}, {GST_WAVPACK_JS_MODE_LEFT_RIGHT, "left/right", "leftright"}, {GST_WAVPACK_JS_MODE_MID_SIDE, "mid/side", "midside"}, {0, NULL, NULL} }; qtype = g_enum_register_static ("GstWavpackEncJSMode", values); } return qtype; } static void _do_init (GType object_type) { const GInterfaceInfo preset_interface_info = { NULL, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; g_type_add_interface_static (object_type, GST_TYPE_PRESET, &preset_interface_info); } GST_BOILERPLATE_FULL (GstWavpackEnc, gst_wavpack_enc, GstElement, GST_TYPE_ELEMENT, _do_init); static void gst_wavpack_enc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); /* add pad templates */ gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &wvcsrc_factory); /* set element details */ gst_element_class_set_details_simple (element_class, "Wavpack audio encoder", "Codec/Encoder/Audio", "Encodes audio with the Wavpack lossless/lossy audio codec", "Sebastian Dröge "); } static void gst_wavpack_enc_class_init (GstWavpackEncClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); /* set state change handler */ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_wavpack_enc_change_state); /* set property handlers */ gobject_class->set_property = gst_wavpack_enc_set_property; gobject_class->get_property = gst_wavpack_enc_get_property; /* install all properties */ g_object_class_install_property (gobject_class, ARG_MODE, g_param_spec_enum ("mode", "Encoding mode", "Speed versus compression tradeoff.", GST_TYPE_WAVPACK_ENC_MODE, GST_WAVPACK_ENC_MODE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_BITRATE, g_param_spec_uint ("bitrate", "Bitrate", "Try to encode with this average bitrate (bits/sec). " "This enables lossy encoding, values smaller than 24000 disable it again.", 0, 9600000, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_BITSPERSAMPLE, g_param_spec_double ("bits-per-sample", "Bits per sample", "Try to encode with this amount of bits per sample. " "This enables lossy encoding, values smaller than 2.0 disable it again.", 0.0, 24.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_CORRECTION_MODE, g_param_spec_enum ("correction-mode", "Correction stream mode", "Use this mode for the correction stream. Only works in lossy mode!", GST_TYPE_WAVPACK_ENC_CORRECTION_MODE, GST_WAVPACK_CORRECTION_MODE_OFF, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_MD5, g_param_spec_boolean ("md5", "MD5", "Store MD5 hash of raw samples within the file.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_EXTRA_PROCESSING, g_param_spec_uint ("extra-processing", "Extra processing", "Use better but slower filters for better compression/quality.", 0, 6, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_JOINT_STEREO_MODE, g_param_spec_enum ("joint-stereo-mode", "Joint-Stereo mode", "Use this joint-stereo mode.", GST_TYPE_WAVPACK_ENC_JOINT_STEREO_MODE, GST_WAVPACK_JS_MODE_AUTO, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_wavpack_enc_reset (GstWavpackEnc * enc) { /* close and free everything stream related if we already did something */ if (enc->wp_context) { WavpackCloseFile (enc->wp_context); enc->wp_context = NULL; } if (enc->wp_config) { g_free (enc->wp_config); enc->wp_config = NULL; } if (enc->first_block) { g_free (enc->first_block); enc->first_block = NULL; } enc->first_block_size = 0; if (enc->md5_context) { g_checksum_free (enc->md5_context); enc->md5_context = NULL; } if (enc->pending_buffer) { gst_buffer_unref (enc->pending_buffer); enc->pending_buffer = NULL; enc->pending_offset = 0; } /* reset the last returns to GST_FLOW_OK. This is only set to something else * while WavpackPackSamples() or more specific gst_wavpack_enc_push_block() * so not valid anymore */ enc->srcpad_last_return = enc->wvcsrcpad_last_return = GST_FLOW_OK; /* reset stream information */ enc->samplerate = 0; enc->depth = 0; enc->channels = 0; enc->channel_mask = 0; enc->need_channel_remap = FALSE; enc->timestamp_offset = GST_CLOCK_TIME_NONE; enc->next_ts = GST_CLOCK_TIME_NONE; } static void gst_wavpack_enc_init (GstWavpackEnc * enc, GstWavpackEncClass * gclass) { enc->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_pad_set_setcaps_function (enc->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_enc_sink_set_caps)); gst_pad_set_chain_function (enc->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_enc_chain)); gst_pad_set_event_function (enc->sinkpad, GST_DEBUG_FUNCPTR (gst_wavpack_enc_sink_event)); gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad); /* setup src pad */ enc->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad); /* initialize object attributes */ enc->wp_config = NULL; enc->wp_context = NULL; enc->first_block = NULL; enc->md5_context = NULL; gst_wavpack_enc_reset (enc); enc->wv_id.correction = FALSE; enc->wv_id.wavpack_enc = enc; enc->wv_id.passthrough = FALSE; enc->wvc_id.correction = TRUE; enc->wvc_id.wavpack_enc = enc; enc->wvc_id.passthrough = FALSE; /* set default values of params */ enc->mode = GST_WAVPACK_ENC_MODE_DEFAULT; enc->bitrate = 0; enc->bps = 0.0; enc->correction_mode = GST_WAVPACK_CORRECTION_MODE_OFF; enc->md5 = FALSE; enc->extra_processing = 0; enc->joint_stereo_mode = GST_WAVPACK_JS_MODE_AUTO; } static gboolean gst_wavpack_enc_sink_set_caps (GstPad * pad, GstCaps * caps) { GstWavpackEnc *enc = GST_WAVPACK_ENC (gst_pad_get_parent (pad)); GstStructure *structure = gst_caps_get_structure (caps, 0); GstAudioChannelPosition *pos; if (!gst_structure_get_int (structure, "channels", &enc->channels) || !gst_structure_get_int (structure, "rate", &enc->samplerate) || !gst_structure_get_int (structure, "depth", &enc->depth)) { GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), ("got invalid caps: %" GST_PTR_FORMAT, caps)); gst_object_unref (enc); return FALSE; } pos = gst_audio_get_channel_positions (structure); /* If one channel is NONE they'll be all undefined */ if (pos != NULL && pos[0] == GST_AUDIO_CHANNEL_POSITION_NONE) { g_free (pos); pos = NULL; } if (pos == NULL) { GST_ELEMENT_ERROR (enc, STREAM, FORMAT, (NULL), ("input has no valid channel layout")); gst_object_unref (enc); return FALSE; } enc->channel_mask = gst_wavpack_get_channel_mask_from_positions (pos, enc->channels); enc->need_channel_remap = gst_wavpack_set_channel_mapping (pos, enc->channels, enc->channel_mapping); g_free (pos); /* set fixed src pad caps now that we know what we will get */ caps = gst_caps_new_simple ("audio/x-wavpack", "channels", G_TYPE_INT, enc->channels, "rate", G_TYPE_INT, enc->samplerate, "width", G_TYPE_INT, enc->depth, "framed", G_TYPE_BOOLEAN, TRUE, NULL); if (!gst_wavpack_set_channel_layout (caps, enc->channel_mask)) GST_WARNING_OBJECT (enc, "setting channel layout failed"); if (!gst_pad_set_caps (enc->srcpad, caps)) { GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), ("setting caps failed: %" GST_PTR_FORMAT, caps)); gst_caps_unref (caps); gst_object_unref (enc); return FALSE; } gst_pad_use_fixed_caps (enc->srcpad); gst_caps_unref (caps); gst_object_unref (enc); return TRUE; } static void gst_wavpack_enc_set_wp_config (GstWavpackEnc * enc) { enc->wp_config = g_new0 (WavpackConfig, 1); /* set general stream informations in the WavpackConfig */ enc->wp_config->bytes_per_sample = GST_ROUND_UP_8 (enc->depth) / 8; enc->wp_config->bits_per_sample = enc->depth; enc->wp_config->num_channels = enc->channels; enc->wp_config->channel_mask = enc->channel_mask; enc->wp_config->sample_rate = enc->samplerate; /* * Set parameters in WavpackConfig */ /* Encoding mode */ switch (enc->mode) { #if 0 case GST_WAVPACK_ENC_MODE_VERY_FAST: enc->wp_config->flags |= CONFIG_VERY_FAST_FLAG; enc->wp_config->flags |= CONFIG_FAST_FLAG; break; #endif case GST_WAVPACK_ENC_MODE_FAST: enc->wp_config->flags |= CONFIG_FAST_FLAG; break; case GST_WAVPACK_ENC_MODE_DEFAULT: break; case GST_WAVPACK_ENC_MODE_HIGH: enc->wp_config->flags |= CONFIG_HIGH_FLAG; break; #ifndef WAVPACK_OLD_API case GST_WAVPACK_ENC_MODE_VERY_HIGH: enc->wp_config->flags |= CONFIG_HIGH_FLAG; enc->wp_config->flags |= CONFIG_VERY_HIGH_FLAG; break; #endif } /* Bitrate, enables lossy mode */ if (enc->bitrate) { enc->wp_config->flags |= CONFIG_HYBRID_FLAG; enc->wp_config->flags |= CONFIG_BITRATE_KBPS; enc->wp_config->bitrate = enc->bitrate / 1000.0; } else if (enc->bps) { enc->wp_config->flags |= CONFIG_HYBRID_FLAG; enc->wp_config->bitrate = enc->bps; } /* Correction Mode, only in lossy mode */ if (enc->wp_config->flags & CONFIG_HYBRID_FLAG) { if (enc->correction_mode > GST_WAVPACK_CORRECTION_MODE_OFF) { GstCaps *caps = gst_caps_new_simple ("audio/x-wavpack-correction", "framed", G_TYPE_BOOLEAN, TRUE, NULL); enc->wvcsrcpad = gst_pad_new_from_static_template (&wvcsrc_factory, "wvcsrc"); /* try to add correction src pad, don't set correction mode on failure */ GST_DEBUG_OBJECT (enc, "Adding correction pad with caps %" GST_PTR_FORMAT, caps); if (!gst_pad_set_caps (enc->wvcsrcpad, caps)) { enc->correction_mode = 0; GST_WARNING_OBJECT (enc, "setting correction caps failed"); } else { gst_pad_use_fixed_caps (enc->wvcsrcpad); gst_pad_set_active (enc->wvcsrcpad, TRUE); gst_element_add_pad (GST_ELEMENT (enc), enc->wvcsrcpad); enc->wp_config->flags |= CONFIG_CREATE_WVC; if (enc->correction_mode == GST_WAVPACK_CORRECTION_MODE_OPTIMIZED) { enc->wp_config->flags |= CONFIG_OPTIMIZE_WVC; } } gst_caps_unref (caps); } } else { if (enc->correction_mode > GST_WAVPACK_CORRECTION_MODE_OFF) { enc->correction_mode = 0; GST_WARNING_OBJECT (enc, "setting correction mode only has " "any effect if a bitrate is provided."); } } gst_element_no_more_pads (GST_ELEMENT (enc)); /* MD5, setup MD5 context */ if ((enc->md5) && !(enc->md5_context)) { enc->wp_config->flags |= CONFIG_MD5_CHECKSUM; enc->md5_context = g_checksum_new (G_CHECKSUM_MD5); } /* Extra encode processing */ if (enc->extra_processing) { enc->wp_config->flags |= CONFIG_EXTRA_MODE; enc->wp_config->xmode = enc->extra_processing; } /* Joint stereo mode */ switch (enc->joint_stereo_mode) { case GST_WAVPACK_JS_MODE_AUTO: break; case GST_WAVPACK_JS_MODE_LEFT_RIGHT: enc->wp_config->flags |= CONFIG_JOINT_OVERRIDE; enc->wp_config->flags &= ~CONFIG_JOINT_STEREO; break; case GST_WAVPACK_JS_MODE_MID_SIDE: enc->wp_config->flags |= (CONFIG_JOINT_OVERRIDE | CONFIG_JOINT_STEREO); break; } } static int gst_wavpack_enc_push_block (void *id, void *data, int32_t count) { GstWavpackEncWriteID *wid = (GstWavpackEncWriteID *) id; GstWavpackEnc *enc = GST_WAVPACK_ENC (wid->wavpack_enc); GstFlowReturn *flow; GstBuffer *buffer; GstPad *pad; guchar *block = (guchar *) data; pad = (wid->correction) ? enc->wvcsrcpad : enc->srcpad; flow = (wid->correction) ? &enc->wvcsrcpad_last_return : &enc-> srcpad_last_return; *flow = gst_pad_alloc_buffer_and_set_caps (pad, GST_BUFFER_OFFSET_NONE, count, GST_PAD_CAPS (pad), &buffer); if (*flow != GST_FLOW_OK) { GST_WARNING_OBJECT (enc, "flow on %s:%s = %s", GST_DEBUG_PAD_NAME (pad), gst_flow_get_name (*flow)); return FALSE; } g_memmove (GST_BUFFER_DATA (buffer), block, count); if (count > sizeof (WavpackHeader) && memcmp (block, "wvpk", 4) == 0) { /* if it's a Wavpack block set buffer timestamp and duration, etc */ WavpackHeader wph; GST_LOG_OBJECT (enc, "got %d bytes of encoded wavpack %sdata", count, (wid->correction) ? "correction " : ""); gst_wavpack_read_header (&wph, block); /* Only set when pushing the first buffer again, in that case * we don't want to delay the buffer or push newsegment events */ if (!wid->passthrough) { /* Only push complete blocks */ if (enc->pending_buffer == NULL) { enc->pending_buffer = buffer; enc->pending_offset = wph.block_index; } else if (enc->pending_offset == wph.block_index) { enc->pending_buffer = gst_buffer_join (enc->pending_buffer, buffer); } else { GST_ERROR ("Got incomplete block, dropping"); gst_buffer_unref (enc->pending_buffer); enc->pending_buffer = buffer; enc->pending_offset = wph.block_index; } if (!(wph.flags & FINAL_BLOCK)) return TRUE; buffer = enc->pending_buffer; enc->pending_buffer = NULL; enc->pending_offset = 0; /* if it's the first wavpack block, send a NEW_SEGMENT event */ if (wph.block_index == 0) { gst_pad_push_event (pad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, GST_BUFFER_OFFSET_NONE, 0)); /* save header for later reference, so we can re-send it later on * EOS with fixed up values for total sample count etc. */ if (enc->first_block == NULL && !wid->correction) { enc->first_block = g_memdup (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); enc->first_block_size = GST_BUFFER_SIZE (buffer); } } } /* set buffer timestamp, duration, offset, offset_end from * the wavpack header */ GST_BUFFER_TIMESTAMP (buffer) = enc->timestamp_offset + gst_util_uint64_scale_int (GST_SECOND, wph.block_index, enc->samplerate); GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (GST_SECOND, wph.block_samples, enc->samplerate); GST_BUFFER_OFFSET (buffer) = wph.block_index; GST_BUFFER_OFFSET_END (buffer) = wph.block_index + wph.block_samples; } else { /* if it's something else set no timestamp and duration on the buffer */ GST_DEBUG_OBJECT (enc, "got %d bytes of unknown data", count); GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; } /* push the buffer and forward errors */ GST_DEBUG_OBJECT (enc, "pushing buffer with %d bytes", GST_BUFFER_SIZE (buffer)); *flow = gst_pad_push (pad, buffer); if (*flow != GST_FLOW_OK) { GST_WARNING_OBJECT (enc, "flow on %s:%s = %s", GST_DEBUG_PAD_NAME (pad), gst_flow_get_name (*flow)); return FALSE; } return TRUE; } static void gst_wavpack_enc_fix_channel_order (GstWavpackEnc * enc, gint32 * data, gint nsamples) { gint i, j; gint32 tmp[8]; for (i = 0; i < nsamples / enc->channels; i++) { for (j = 0; j < enc->channels; j++) { tmp[enc->channel_mapping[j]] = data[j]; } for (j = 0; j < enc->channels; j++) { data[j] = tmp[j]; } data += enc->channels; } } static GstFlowReturn gst_wavpack_enc_chain (GstPad * pad, GstBuffer * buf) { GstWavpackEnc *enc = GST_WAVPACK_ENC (gst_pad_get_parent (pad)); uint32_t sample_count = GST_BUFFER_SIZE (buf) / 4; GstFlowReturn ret; /* reset the last returns to GST_FLOW_OK. This is only set to something else * while WavpackPackSamples() or more specific gst_wavpack_enc_push_block() * so not valid anymore */ enc->srcpad_last_return = enc->wvcsrcpad_last_return = GST_FLOW_OK; GST_DEBUG ("got %u raw samples", sample_count); /* check if we already have a valid WavpackContext, otherwise make one */ if (!enc->wp_context) { /* create raw context */ enc->wp_context = WavpackOpenFileOutput (gst_wavpack_enc_push_block, &enc->wv_id, (enc->correction_mode > 0) ? &enc->wvc_id : NULL); if (!enc->wp_context) { GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), ("error creating Wavpack context")); gst_object_unref (enc); gst_buffer_unref (buf); return GST_FLOW_ERROR; } /* set the WavpackConfig according to our parameters */ gst_wavpack_enc_set_wp_config (enc); /* set the configuration to the context now that we know everything * and initialize the encoder */ if (!WavpackSetConfiguration (enc->wp_context, enc->wp_config, (uint32_t) (-1)) || !WavpackPackInit (enc->wp_context)) { GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, (NULL), ("error setting up wavpack encoding context")); WavpackCloseFile (enc->wp_context); gst_object_unref (enc); gst_buffer_unref (buf); return GST_FLOW_ERROR; } GST_DEBUG ("setup of encoding context successfull"); } /* Save the timestamp of the first buffer. This will be later * used as offset for all following buffers */ if (enc->timestamp_offset == GST_CLOCK_TIME_NONE) { if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { enc->timestamp_offset = GST_BUFFER_TIMESTAMP (buf); enc->next_ts = GST_BUFFER_TIMESTAMP (buf); } else { enc->timestamp_offset = 0; enc->next_ts = 0; } } /* Check if we have a continous stream, if not drop some samples or the buffer or * insert some silence samples */ if (enc->next_ts != GST_CLOCK_TIME_NONE && GST_BUFFER_TIMESTAMP (buf) < enc->next_ts) { guint64 diff = enc->next_ts - GST_BUFFER_TIMESTAMP (buf); guint64 diff_bytes; GST_WARNING_OBJECT (enc, "Buffer is older than previous " "timestamp + duration (%" GST_TIME_FORMAT "< %" GST_TIME_FORMAT "), cannot handle. Clipping buffer.", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (enc->next_ts)); diff_bytes = GST_CLOCK_TIME_TO_FRAMES (diff, enc->samplerate) * enc->channels * 2; if (diff_bytes >= GST_BUFFER_SIZE (buf)) { gst_buffer_unref (buf); return GST_FLOW_OK; } buf = gst_buffer_make_metadata_writable (buf); GST_BUFFER_DATA (buf) += diff_bytes; GST_BUFFER_SIZE (buf) -= diff_bytes; GST_BUFFER_TIMESTAMP (buf) += diff; if (GST_BUFFER_DURATION_IS_VALID (buf)) GST_BUFFER_DURATION (buf) -= diff; } /* Allow a diff of at most 5 ms */ if (enc->next_ts != GST_CLOCK_TIME_NONE && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { if (GST_BUFFER_TIMESTAMP (buf) != enc->next_ts && GST_BUFFER_TIMESTAMP (buf) - enc->next_ts > 5 * GST_MSECOND) { GST_WARNING_OBJECT (enc, "Discontinuity detected: %" G_GUINT64_FORMAT " > %" G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP (buf) - enc->next_ts, 5 * GST_MSECOND); WavpackFlushSamples (enc->wp_context); enc->timestamp_offset += (GST_BUFFER_TIMESTAMP (buf) - enc->next_ts); } } if (GST_BUFFER_TIMESTAMP_IS_VALID (buf) && GST_BUFFER_DURATION_IS_VALID (buf)) enc->next_ts = GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf); else enc->next_ts = GST_CLOCK_TIME_NONE; if (enc->need_channel_remap) { buf = gst_buffer_make_writable (buf); gst_wavpack_enc_fix_channel_order (enc, (gint32 *) GST_BUFFER_DATA (buf), sample_count); } /* if we want to append the MD5 sum to the stream update it here * with the current raw samples */ if (enc->md5) { g_checksum_update (enc->md5_context, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } /* encode and handle return values from encoding */ if (WavpackPackSamples (enc->wp_context, (int32_t *) GST_BUFFER_DATA (buf), sample_count / enc->channels)) { GST_DEBUG ("encoding samples successful"); ret = GST_FLOW_OK; } else { if ((enc->srcpad_last_return == GST_FLOW_RESEND) || (enc->wvcsrcpad_last_return == GST_FLOW_RESEND)) { ret = GST_FLOW_RESEND; } else if ((enc->srcpad_last_return == GST_FLOW_OK) || (enc->wvcsrcpad_last_return == GST_FLOW_OK)) { ret = GST_FLOW_OK; } else if ((enc->srcpad_last_return == GST_FLOW_NOT_LINKED) && (enc->wvcsrcpad_last_return == GST_FLOW_NOT_LINKED)) { ret = GST_FLOW_NOT_LINKED; } else if ((enc->srcpad_last_return == GST_FLOW_WRONG_STATE) && (enc->wvcsrcpad_last_return == GST_FLOW_WRONG_STATE)) { ret = GST_FLOW_WRONG_STATE; } else { GST_ELEMENT_ERROR (enc, LIBRARY, ENCODE, (NULL), ("encoding samples failed")); ret = GST_FLOW_ERROR; } } gst_buffer_unref (buf); gst_object_unref (enc); return ret; } static void gst_wavpack_enc_rewrite_first_block (GstWavpackEnc * enc) { GstEvent *event = gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_BYTES, 0, GST_BUFFER_OFFSET_NONE, 0); gboolean ret; g_return_if_fail (enc); g_return_if_fail (enc->first_block); /* update the sample count in the first block */ WavpackUpdateNumSamples (enc->wp_context, enc->first_block); /* try to seek to the beginning of the output */ ret = gst_pad_push_event (enc->srcpad, event); if (ret) { /* try to rewrite the first block */ GST_DEBUG_OBJECT (enc, "rewriting first block ..."); enc->wv_id.passthrough = TRUE; ret = gst_wavpack_enc_push_block (&enc->wv_id, enc->first_block, enc->first_block_size); enc->wv_id.passthrough = FALSE; } else { GST_WARNING_OBJECT (enc, "rewriting of first block failed. " "Seeking to first block failed!"); } } static gboolean gst_wavpack_enc_sink_event (GstPad * pad, GstEvent * event) { GstWavpackEnc *enc = GST_WAVPACK_ENC (gst_pad_get_parent (pad)); gboolean ret = TRUE; GST_DEBUG ("Received %s event on sinkpad", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* Encode all remaining samples and flush them to the src pads */ WavpackFlushSamples (enc->wp_context); /* Drop all remaining data, this is no complete block otherwise * it would've been pushed already */ if (enc->pending_buffer) { gst_buffer_unref (enc->pending_buffer); enc->pending_buffer = NULL; enc->pending_offset = 0; } /* write the MD5 sum if we have to write one */ if ((enc->md5) && (enc->md5_context)) { guint8 md5_digest[16]; gsize digest_len = sizeof (md5_digest); g_checksum_get_digest (enc->md5_context, md5_digest, &digest_len); if (digest_len == sizeof (md5_digest)) WavpackStoreMD5Sum (enc->wp_context, md5_digest); else GST_WARNING_OBJECT (enc, "Calculating MD5 digest failed"); } /* Try to rewrite the first frame with the correct sample number */ if (enc->first_block) gst_wavpack_enc_rewrite_first_block (enc); /* close the context if not already happened */ if (enc->wp_context) { WavpackCloseFile (enc->wp_context); enc->wp_context = NULL; } ret = gst_pad_event_default (pad, event); break; case GST_EVENT_NEWSEGMENT: if (enc->wp_context) { GST_WARNING_OBJECT (enc, "got NEWSEGMENT after encoding " "already started"); } /* drop NEWSEGMENT events, we create our own when pushing * the first buffer to the pads */ gst_event_unref (event); ret = TRUE; break; default: ret = gst_pad_event_default (pad, event); break; } gst_object_unref (enc); return ret; } static GstStateChangeReturn gst_wavpack_enc_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstWavpackEnc *enc = GST_WAVPACK_ENC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: /* set the last returned GstFlowReturns of the two pads to GST_FLOW_OK * as they're only set to something else in WavpackPackSamples() or more * specific gst_wavpack_enc_push_block() and nothing happened there yet */ enc->srcpad_last_return = enc->wvcsrcpad_last_return = GST_FLOW_OK; break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_wavpack_enc_reset (enc); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static void gst_wavpack_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstWavpackEnc *enc = GST_WAVPACK_ENC (object); switch (prop_id) { case ARG_MODE: enc->mode = g_value_get_enum (value); break; case ARG_BITRATE:{ guint val = g_value_get_uint (value); if ((val >= 24000) && (val <= 9600000)) { enc->bitrate = val; enc->bps = 0.0; } else { enc->bitrate = 0; enc->bps = 0.0; } break; } case ARG_BITSPERSAMPLE:{ gdouble val = g_value_get_double (value); if ((val >= 2.0) && (val <= 24.0)) { enc->bps = val; enc->bitrate = 0; } else { enc->bps = 0.0; enc->bitrate = 0; } break; } case ARG_CORRECTION_MODE: enc->correction_mode = g_value_get_enum (value); break; case ARG_MD5: enc->md5 = g_value_get_boolean (value); break; case ARG_EXTRA_PROCESSING: enc->extra_processing = g_value_get_uint (value); break; case ARG_JOINT_STEREO_MODE: enc->joint_stereo_mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_wavpack_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstWavpackEnc *enc = GST_WAVPACK_ENC (object); switch (prop_id) { case ARG_MODE: g_value_set_enum (value, enc->mode); break; case ARG_BITRATE: if (enc->bps == 0.0) { g_value_set_uint (value, enc->bitrate); } else { g_value_set_uint (value, 0); } break; case ARG_BITSPERSAMPLE: if (enc->bitrate == 0) { g_value_set_double (value, enc->bps); } else { g_value_set_double (value, 0.0); } break; case ARG_CORRECTION_MODE: g_value_set_enum (value, enc->correction_mode); break; case ARG_MD5: g_value_set_boolean (value, enc->md5); break; case ARG_EXTRA_PROCESSING: g_value_set_uint (value, enc->extra_processing); break; case ARG_JOINT_STEREO_MODE: g_value_set_enum (value, enc->joint_stereo_mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_wavpack_enc_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "wavpackenc", GST_RANK_NONE, GST_TYPE_WAVPACK_ENC)) return FALSE; GST_DEBUG_CATEGORY_INIT (gst_wavpack_enc_debug, "wavpack_enc", 0, "Wavpack encoder"); return TRUE; } gst-plugins-good-0.10.31/ext/wavpack/gstwavpackstreamreader.h0000644000175000017500000000222411671175352021165 00000000000000/* GStreamer Wavpack plugin * Copyright (c) 2006 Sebastian Dröge * * gstwavpackstreamreader.h: stream reader used for decoding * * 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_WAVPACK_STREAM_READER_H__ #define __GST_WAVPACK_STREAM_READER_H__ #include typedef struct { guint8 *buffer; uint32_t length; uint32_t position; } read_id; WavpackStreamReader *gst_wavpack_stream_reader_new (void); #endif gst-plugins-good-0.10.31/ext/wavpack/Makefile.in0000644000175000017500000010352311720560227016306 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/wavpack DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstwavpack_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstwavpack_la_OBJECTS = libgstwavpack_la-gstwavpack.lo \ libgstwavpack_la-gstwavpackcommon.lo \ libgstwavpack_la-gstwavpackparse.lo \ libgstwavpack_la-gstwavpackdec.lo \ libgstwavpack_la-gstwavpackenc.lo \ libgstwavpack_la-gstwavpackstreamreader.lo libgstwavpack_la_OBJECTS = $(am_libgstwavpack_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstwavpack_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstwavpack_la_CFLAGS) $(CFLAGS) \ $(libgstwavpack_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstwavpack_la_SOURCES) DIST_SOURCES = $(libgstwavpack_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstwavpack.la libgstwavpack_la_SOURCES = \ gstwavpack.c \ gstwavpackcommon.c \ gstwavpackparse.c \ gstwavpackdec.c \ gstwavpackenc.c \ gstwavpackstreamreader.c libgstwavpack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(WAVPACK_CFLAGS) libgstwavpack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(WAVPACK_LIBS) libgstwavpack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstwavpack_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstwavpackparse.h \ gstwavpackdec.h \ gstwavpackenc.h \ gstwavpackcommon.h \ gstwavpackstreamreader.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/wavpack/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/wavpack/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstwavpack.la: $(libgstwavpack_la_OBJECTS) $(libgstwavpack_la_DEPENDENCIES) $(EXTRA_libgstwavpack_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstwavpack_la_LINK) -rpath $(plugindir) $(libgstwavpack_la_OBJECTS) $(libgstwavpack_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstwavpack_la-gstwavpack.lo: gstwavpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpack.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpack.Tpo -c -o libgstwavpack_la-gstwavpack.lo `test -f 'gstwavpack.c' || echo '$(srcdir)/'`gstwavpack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpack.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpack.c' object='libgstwavpack_la-gstwavpack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpack.lo `test -f 'gstwavpack.c' || echo '$(srcdir)/'`gstwavpack.c libgstwavpack_la-gstwavpackcommon.lo: gstwavpackcommon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackcommon.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Tpo -c -o libgstwavpack_la-gstwavpackcommon.lo `test -f 'gstwavpackcommon.c' || echo '$(srcdir)/'`gstwavpackcommon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackcommon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackcommon.c' object='libgstwavpack_la-gstwavpackcommon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackcommon.lo `test -f 'gstwavpackcommon.c' || echo '$(srcdir)/'`gstwavpackcommon.c libgstwavpack_la-gstwavpackparse.lo: gstwavpackparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackparse.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackparse.Tpo -c -o libgstwavpack_la-gstwavpackparse.lo `test -f 'gstwavpackparse.c' || echo '$(srcdir)/'`gstwavpackparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackparse.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackparse.c' object='libgstwavpack_la-gstwavpackparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackparse.lo `test -f 'gstwavpackparse.c' || echo '$(srcdir)/'`gstwavpackparse.c libgstwavpack_la-gstwavpackdec.lo: gstwavpackdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackdec.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackdec.Tpo -c -o libgstwavpack_la-gstwavpackdec.lo `test -f 'gstwavpackdec.c' || echo '$(srcdir)/'`gstwavpackdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackdec.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackdec.c' object='libgstwavpack_la-gstwavpackdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackdec.lo `test -f 'gstwavpackdec.c' || echo '$(srcdir)/'`gstwavpackdec.c libgstwavpack_la-gstwavpackenc.lo: gstwavpackenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackenc.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackenc.Tpo -c -o libgstwavpack_la-gstwavpackenc.lo `test -f 'gstwavpackenc.c' || echo '$(srcdir)/'`gstwavpackenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackenc.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackenc.c' object='libgstwavpack_la-gstwavpackenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackenc.lo `test -f 'gstwavpackenc.c' || echo '$(srcdir)/'`gstwavpackenc.c libgstwavpack_la-gstwavpackstreamreader.lo: gstwavpackstreamreader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -MT libgstwavpack_la-gstwavpackstreamreader.lo -MD -MP -MF $(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Tpo -c -o libgstwavpack_la-gstwavpackstreamreader.lo `test -f 'gstwavpackstreamreader.c' || echo '$(srcdir)/'`gstwavpackstreamreader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Tpo $(DEPDIR)/libgstwavpack_la-gstwavpackstreamreader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavpackstreamreader.c' object='libgstwavpack_la-gstwavpackstreamreader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavpack_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavpack_la_CFLAGS) $(CFLAGS) -c -o libgstwavpack_la-gstwavpackstreamreader.lo `test -f 'gstwavpackstreamreader.c' || echo '$(srcdir)/'`gstwavpackstreamreader.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/wavpack/gstwavpackdec.h0000644000175000017500000000435411671175352017250 00000000000000/* GStreamer Wavpack plugin * Copyright (c) 2004 Arwed v. Merkatz * Copyright (c) 2006 Sebastian Dröge * * gstwavpackdec.h: raw Wavpack bitstream decoder * * 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_WAVPACK_DEC_H__ #define __GST_WAVPACK_DEC_H__ #include #include #include "gstwavpackstreamreader.h" G_BEGIN_DECLS #define GST_TYPE_WAVPACK_DEC \ (gst_wavpack_dec_get_type()) #define GST_WAVPACK_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPACK_DEC,GstWavpackDec)) #define GST_WAVPACK_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPACK_DEC,GstWavpackDecClass)) #define GST_IS_WAVPACK_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPACK_DEC)) #define GST_IS_WAVPACK_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPACK_DEC)) typedef struct _GstWavpackDec GstWavpackDec; typedef struct _GstWavpackDecClass GstWavpackDecClass; struct _GstWavpackDec { GstElement element; /*< private > */ GstPad *sinkpad; GstPad *srcpad; WavpackContext *context; WavpackStreamReader *stream_reader; read_id wv_id; GstSegment segment; /* used for clipping, TIME format */ guint32 next_block_index; gint sample_rate; gint depth; gint channels; gint channel_mask; gint error_count; }; struct _GstWavpackDecClass { GstElementClass parent; }; GType gst_wavpack_dec_get_type (void); gboolean gst_wavpack_dec_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_WAVPACK_DEC_H__ */ gst-plugins-good-0.10.31/ext/Makefile.in0000644000175000017500000006600711720560225014655 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # include this at the end of $MODULE/ext/Makefile.am to force make to # build subdirectories in parallel when make -jN is used. We will end up # descending into all subdirectories a second time, but only after the first # (parallel) run has finished, so it should go right through the second time. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/common/parallel-subdirs.mak subdir = ext ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @USE_AALIB_FALSE@AALIB_DIR = @USE_AALIB_TRUE@AALIB_DIR = aalib @USE_ANNODEX_FALSE@ANNODEX_DIR = @USE_ANNODEX_TRUE@ANNODEX_DIR = annodex @USE_CAIRO_FALSE@CAIRO_DIR = @USE_CAIRO_TRUE@CAIRO_DIR = cairo @USE_ESD_FALSE@ESD_DIR = @USE_ESD_TRUE@ESD_DIR = esd @USE_FLAC_FALSE@FLAC_DIR = @USE_FLAC_TRUE@FLAC_DIR = flac @USE_GCONF_FALSE@GCONF_DIR = @USE_GCONF_TRUE@GCONF_DIR = gconf @USE_GDK_PIXBUF_FALSE@GDK_PIXBUF_DIR = @USE_GDK_PIXBUF_TRUE@GDK_PIXBUF_DIR = gdk_pixbuf @USE_HAL_FALSE@HAL_DIR = @USE_HAL_TRUE@HAL_DIR = hal @USE_JACK_FALSE@JACK_DIR = @USE_JACK_TRUE@JACK_DIR = jack @USE_JPEG_FALSE@JPEG_DIR = @USE_JPEG_TRUE@JPEG_DIR = jpeg @USE_LIBCACA_FALSE@LIBCACA_DIR = @USE_LIBCACA_TRUE@LIBCACA_DIR = libcaca @USE_LIBDV_FALSE@LIBDV_DIR = @USE_LIBDV_TRUE@LIBDV_DIR = dv # if USE_LIBMNG # LIBMNG_DIR = libmng # else LIBMNG_DIR = @USE_LIBPNG_FALSE@LIBPNG_DIR = # endif @USE_LIBPNG_TRUE@LIBPNG_DIR = libpng # if USE_MIKMOD # MIKMOD_DIR = mikmod # else MIKMOD_DIR = @USE_DV1394_FALSE@DV1394_DIR = # endif @USE_DV1394_TRUE@DV1394_DIR = raw1394 @USE_PULSE_FALSE@PULSE_DIR = @USE_PULSE_TRUE@PULSE_DIR = pulse @USE_SHOUT2_FALSE@SHOUT2_DIR = @USE_SHOUT2_TRUE@SHOUT2_DIR = shout2 @USE_SOUP_FALSE@SOUP_DIR = @USE_SOUP_TRUE@SOUP_DIR = soup @USE_SPEEX_FALSE@SPEEX_DIR = @USE_SPEEX_TRUE@SPEEX_DIR = speex @USE_TAGLIB_FALSE@TAGLIB_DIR = @USE_TAGLIB_TRUE@TAGLIB_DIR = taglib @USE_WAVPACK_FALSE@WAVPACK_DIR = @USE_WAVPACK_TRUE@WAVPACK_DIR = wavpack SUBDIRS = \ $(AALIB_DIR) \ $(ANNODEX_DIR) \ $(CAIRO_DIR) \ $(DV1394_DIR) \ $(ESD_DIR) \ $(FLAC_DIR) \ $(GCONF_DIR) \ $(GDK_PIXBUF_DIR) \ $(HAL_DIR) \ $(JACK_DIR) \ $(JPEG_DIR) \ $(LIBCACA_DIR) \ $(LIBDV_DIR) \ $(LIBMNG_DIR) \ $(LIBPNG_DIR) \ $(MIKMOD_DIR) \ $(PULSE_DIR) \ $(SHOUT2_DIR) \ $(SOUP_DIR) \ $(SPEEX_DIR) \ $(TAGLIB_DIR) \ $(WAVPACK_DIR) DIST_SUBDIRS = \ aalib \ annodex \ cairo \ dv \ esd \ flac \ gconf \ gdk_pixbuf \ hal \ jack \ jpeg \ libcaca \ libpng \ pulse \ raw1394 \ shout2 \ soup \ speex \ taglib \ wavpack all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/parallel-subdirs.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: independent-subdirs $(SUBDIRS) independent-subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ all-recursive: independent-subdirs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/raw1394/0000755000175000017500000000000011720565322013774 500000000000000gst-plugins-good-0.10.31/ext/raw1394/gst1394.c0000644000175000017500000000274411671175352015212 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #include "gstdv1394src.h" #ifdef HAVE_LIBIEC61883 #include "gsthdv1394src.h" #endif static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "dv1394src", GST_RANK_NONE, GST_TYPE_DV1394SRC)) return FALSE; #ifdef HAVE_LIBIEC61883 if (!gst_element_register (plugin, "hdv1394src", GST_RANK_NONE, GST_TYPE_HDV1394SRC)) return FALSE; #endif return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "1394", "Source for video data via IEEE1394 interface", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/ext/raw1394/gsthdv1394src.h0000644000175000017500000000421011671175352016417 00000000000000/* GStreamer * Copyright (C) <2008> Edward Hervey * * 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_GSTHDV1394_H__ #define __GST_GSTHDV1394_H__ #include #include #include #ifdef HAVE_LIBIEC61883 #include #endif G_BEGIN_DECLS #define GST_TYPE_HDV1394SRC \ (gst_hdv1394src_get_type()) #define GST_HDV1394SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_HDV1394SRC,GstHDV1394Src)) #define GST_HDV1394SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_HDV1394SRC,GstHDV1394SrcClass)) #define GST_IS_HDV1394SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_HDV1394SRC)) #define GST_IS_HDV1394SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_HDV1394SRC)) typedef struct _GstHDV1394Src GstHDV1394Src; typedef struct _GstHDV1394SrcClass GstHDV1394SrcClass; struct _GstHDV1394Src { GstPushSrc element; gint num_ports; gint port; gint channel; octlet_t guid; gint avc_node; gboolean use_avc; struct raw1394_portinfo pinfo[16]; raw1394handle_t handle; gpointer outdata; gsize outoffset; guint frame_size; guint frame_sequence; int control_sock[2]; gchar *uri; gchar *device_name; gboolean connected; iec61883_mpeg2_t iec61883mpeg2; }; struct _GstHDV1394SrcClass { GstPushSrcClass parent_class; }; GType gst_hdv1394src_get_type(void); G_END_DECLS #endif /* __GST_GST1394_H__ */ gst-plugins-good-0.10.31/ext/raw1394/gsthdv1394src.c0000644000175000017500000005676211677341654016443 00000000000000/* GStreamer * Copyright (C) <2008> Edward Hervey * * 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-hdv1394src * * Read MPEG-TS data from firewire port. * * * Example launch line * |[ * gst-launch hdv1394src ! queue ! decodebin name=d ! queue ! xvimagesink d. ! queue ! alsasink * ]| captures from the firewire port and plays the streams. * |[ * gst-launch hdv1394src ! queue ! filesink location=mydump.ts * ]| capture to a disk file * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gsthdv1394src.h" #include "gst1394probe.h" #define CONTROL_STOP 'S' /* stop the select call */ #define CONTROL_SOCKETS(src) src->control_sock #define WRITE_SOCKET(src) src->control_sock[1] #define READ_SOCKET(src) src->control_sock[0] #define SEND_COMMAND(src, command) \ G_STMT_START { \ int G_GNUC_UNUSED _res; unsigned char c; c = command; \ _res = write (WRITE_SOCKET(src), &c, 1); \ } G_STMT_END #define READ_COMMAND(src, command, res) \ G_STMT_START { \ res = read(READ_SOCKET(src), &command, 1); \ } G_STMT_END GST_DEBUG_CATEGORY_STATIC (hdv1394src_debug); #define GST_CAT_DEFAULT (hdv1394src_debug) #define DEFAULT_PORT -1 #define DEFAULT_CHANNEL 63 #define DEFAULT_USE_AVC TRUE #define DEFAULT_GUID 0 enum { PROP_0, PROP_PORT, PROP_CHANNEL, PROP_USE_AVC, PROP_GUID, PROP_DEVICE_NAME }; static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpegts,systemstream=(boolean)true,packetsize=(int)188") ); static void gst_hdv1394src_uri_handler_init (gpointer g_iface, gpointer iface_data); static void gst_hdv1394src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_hdv1394src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_hdv1394src_dispose (GObject * object); static gboolean gst_hdv1394src_start (GstBaseSrc * bsrc); static gboolean gst_hdv1394src_stop (GstBaseSrc * bsrc); static gboolean gst_hdv1394src_unlock (GstBaseSrc * bsrc); static GstFlowReturn gst_hdv1394src_create (GstPushSrc * psrc, GstBuffer ** buf); static void gst_hdv1394src_update_device_name (GstHDV1394Src * src); static void _do_init (GType type) { static const GInterfaceInfo urihandler_info = { gst_hdv1394src_uri_handler_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); gst_1394_type_add_property_probe_interface (type); GST_DEBUG_CATEGORY_INIT (hdv1394src_debug, "hdv1394src", 0, "MPEG-TS firewire source"); } GST_BOILERPLATE_FULL (GstHDV1394Src, gst_hdv1394src, GstPushSrc, GST_TYPE_PUSH_SRC, _do_init); static void gst_hdv1394src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_set_details_simple (element_class, "Firewire (1394) HDV video source", "Source/Video", "Source for MPEG-TS video data from firewire port", "Edward Hervey "); } static void gst_hdv1394src_class_init (GstHDV1394SrcClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; GstPushSrcClass *gstpushsrc_class; gobject_class = (GObjectClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstpushsrc_class = (GstPushSrcClass *) klass; gobject_class->set_property = gst_hdv1394src_set_property; gobject_class->get_property = gst_hdv1394src_get_property; gobject_class->dispose = gst_hdv1394src_dispose; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, g_param_spec_int ("port", "Port", "Port number (-1 automatic)", -1, 16, DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CHANNEL, g_param_spec_int ("channel", "Channel", "Channel number for listening", 0, 64, DEFAULT_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_USE_AVC, g_param_spec_boolean ("use-avc", "Use AV/C", "Use AV/C VTR control", DEFAULT_USE_AVC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GUID, g_param_spec_uint64 ("guid", "GUID", "select one of multiple DV devices by its GUID. use a hexadecimal " "like 0xhhhhhhhhhhhhhhhh. (0 = no guid)", 0, G_MAXUINT64, DEFAULT_GUID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstHDV1394Src:device-name * * Descriptive name of the currently opened device * * Since: 0.10.7 **/ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEVICE_NAME, g_param_spec_string ("device-name", "device name", "user-friendly name of the device", "Default", G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); gstbasesrc_class->negotiate = NULL; gstbasesrc_class->start = gst_hdv1394src_start; gstbasesrc_class->stop = gst_hdv1394src_stop; gstbasesrc_class->unlock = gst_hdv1394src_unlock; gstpushsrc_class->create = gst_hdv1394src_create; } static void gst_hdv1394src_init (GstHDV1394Src * dv1394src, GstHDV1394SrcClass * klass) { GstPad *srcpad = GST_BASE_SRC_PAD (dv1394src); gst_base_src_set_live (GST_BASE_SRC (dv1394src), TRUE); gst_pad_use_fixed_caps (srcpad); dv1394src->port = DEFAULT_PORT; dv1394src->channel = DEFAULT_CHANNEL; dv1394src->use_avc = DEFAULT_USE_AVC; dv1394src->guid = DEFAULT_GUID; dv1394src->uri = g_strdup_printf ("hdv://%d", dv1394src->port); dv1394src->device_name = g_strdup_printf ("Default"); READ_SOCKET (dv1394src) = -1; WRITE_SOCKET (dv1394src) = -1; dv1394src->frame_sequence = 0; } static void gst_hdv1394src_dispose (GObject * object) { GstHDV1394Src *src = GST_HDV1394SRC (object); g_free (src->uri); src->uri = NULL; g_free (src->device_name); src->device_name = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_hdv1394src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstHDV1394Src *filter = GST_HDV1394SRC (object); switch (prop_id) { case PROP_PORT: filter->port = g_value_get_int (value); g_free (filter->uri); filter->uri = g_strdup_printf ("hdv://%d", filter->port); break; case PROP_CHANNEL: filter->channel = g_value_get_int (value); break; case PROP_USE_AVC: filter->use_avc = g_value_get_boolean (value); break; case PROP_GUID: filter->guid = g_value_get_uint64 (value); gst_hdv1394src_update_device_name (filter); break; default: break; } } static void gst_hdv1394src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstHDV1394Src *filter = GST_HDV1394SRC (object); switch (prop_id) { case PROP_PORT: g_value_set_int (value, filter->port); break; case PROP_CHANNEL: g_value_set_int (value, filter->channel); break; case PROP_USE_AVC: g_value_set_boolean (value, filter->use_avc); break; case PROP_GUID: g_value_set_uint64 (value, filter->guid); break; case PROP_DEVICE_NAME: g_value_set_string (value, filter->device_name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstHDV1394Src * gst_hdv1394src_from_raw1394handle (raw1394handle_t handle) { iec61883_mpeg2_t mpeg2 = (iec61883_mpeg2_t) raw1394_get_userdata (handle); return GST_HDV1394SRC (iec61883_mpeg2_get_callback_data (mpeg2)); } /* Within one loop iteration (which may call _receive() many times), it seems * as though '*data' will always be different. * * We can therefore assume that any '*data' given to us will stay allocated until * the next loop iteration. */ static int gst_hdv1394src_iec61883_receive (unsigned char *data, int len, unsigned int dropped, void *cbdata) { GstHDV1394Src *dv1394src = GST_HDV1394SRC (cbdata); GST_LOG ("data:%p, len:%d, dropped:%d", data, len, dropped); /* error out if we don't have enough room ! */ if (G_UNLIKELY (dv1394src->outoffset > (2048 * 188 - len))) return -1; if (G_LIKELY (len == IEC61883_MPEG2_TSP_SIZE)) { memcpy ((guint8 *) dv1394src->outdata + dv1394src->outoffset, data, len); dv1394src->outoffset += len; } dv1394src->frame_sequence++; return 0; } /* * When an ieee1394 bus reset happens, usually a device has been removed * or added. We send a message on the message bus with the node count * and whether the capture device used in this element connected, disconnected * or was unchanged * Message structure: * nodecount - integer with number of nodes on bus * current-device-change - integer (1 if device connected, 0 if no change to * current device status, -1 if device disconnected) */ static int gst_hdv1394src_bus_reset (raw1394handle_t handle, unsigned int generation) { GstHDV1394Src *src; gint nodecount; GstMessage *message; GstStructure *structure; gint current_device_change; gint i; src = gst_hdv1394src_from_raw1394handle (handle); GST_INFO_OBJECT (src, "have bus reset"); /* update generation - told to do so by docs */ raw1394_update_generation (handle, generation); nodecount = raw1394_get_nodecount (handle); /* allocate memory for portinfo */ /* current_device_change is -1 if camera disconnected, 0 if other device * connected or 1 if camera has now connected */ current_device_change = -1; for (i = 0; i < nodecount; i++) { if (src->guid == rom1394_get_guid (handle, i)) { /* Camera is with us */ GST_DEBUG ("Camera is with us"); if (!src->connected) { current_device_change = 1; src->connected = TRUE; } else current_device_change = 0; } } if (src->connected && current_device_change == -1) { GST_DEBUG ("Camera has disconnected"); src->connected = FALSE; } else if (!src->connected && current_device_change == -1) { GST_DEBUG ("Camera is still not with us"); current_device_change = 0; } structure = gst_structure_new ("ieee1394-bus-reset", "nodecount", G_TYPE_INT, nodecount, "current-device-change", G_TYPE_INT, current_device_change, NULL); message = gst_message_new_element (GST_OBJECT (src), structure); gst_element_post_message (GST_ELEMENT (src), message); return 0; } static GstFlowReturn gst_hdv1394src_create (GstPushSrc * psrc, GstBuffer ** buf) { GstHDV1394Src *dv1394src = GST_HDV1394SRC (psrc); GstCaps *caps; struct pollfd pollfds[2]; pollfds[0].fd = raw1394_get_fd (dv1394src->handle); pollfds[0].events = POLLIN | POLLERR | POLLHUP | POLLPRI; pollfds[1].fd = READ_SOCKET (dv1394src); pollfds[1].events = POLLIN | POLLERR | POLLHUP | POLLPRI; /* allocate a 2048 samples buffer */ dv1394src->outdata = g_malloc (2048 * 188); dv1394src->outoffset = 0; GST_DEBUG ("Create..."); while (TRUE) { int res = poll (pollfds, 2, -1); GST_LOG ("res:%d", res); if (G_UNLIKELY (res < 0)) { if (errno == EAGAIN || errno == EINTR) continue; else goto error_while_polling; } if (G_UNLIKELY (pollfds[1].revents)) { char command; if (pollfds[1].revents & POLLIN) READ_COMMAND (dv1394src, command, res); goto told_to_stop; } else if (G_LIKELY (pollfds[0].revents & POLLIN)) { int pt; pt = dv1394src->frame_sequence; /* shouldn't block in theory */ GST_LOG ("Iterating ! (%d)", dv1394src->frame_sequence); raw1394_loop_iterate (dv1394src->handle); GST_LOG ("After iteration : %d (diff:%d)", dv1394src->frame_sequence, dv1394src->frame_sequence - pt); if (dv1394src->outoffset) break; } } g_assert (dv1394src->outoffset); GST_LOG ("We have some frames (%u bytes)", (guint) dv1394src->outoffset); /* Create the buffer */ *buf = gst_buffer_new (); GST_BUFFER_DATA (*buf) = dv1394src->outdata; GST_BUFFER_MALLOCDATA (*buf) = dv1394src->outdata; GST_BUFFER_SIZE (*buf) = dv1394src->outoffset; dv1394src->outdata = NULL; dv1394src->outoffset = 0; caps = gst_pad_get_caps (GST_BASE_SRC_PAD (psrc)); gst_buffer_set_caps (*buf, caps); gst_caps_unref (caps); return GST_FLOW_OK; error_while_polling: { GST_ELEMENT_ERROR (dv1394src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); return GST_FLOW_UNEXPECTED; } told_to_stop: { GST_DEBUG_OBJECT (dv1394src, "told to stop, shutting down"); return GST_FLOW_WRONG_STATE; } } static int gst_hdv1394src_discover_avc_node (GstHDV1394Src * src) { int node = -1; int i, j = 0; int m = src->num_ports; if (src->port >= 0) { /* search on explicit port */ j = src->port; m = j + 1; } /* loop over all our ports */ for (; j < m && node == -1; j++) { raw1394handle_t handle; struct raw1394_portinfo pinf[16]; /* open the port */ handle = raw1394_new_handle (); if (!handle) { GST_WARNING ("raw1394 - failed to get handle: %s.\n", strerror (errno)); continue; } if (raw1394_get_port_info (handle, pinf, 16) < 0) { GST_WARNING ("raw1394 - failed to get port info: %s.\n", strerror (errno)); goto next; } /* tell raw1394 which host adapter to use */ if (raw1394_set_port (handle, j) < 0) { GST_WARNING ("raw1394 - failed to set set port: %s.\n", strerror (errno)); goto next; } /* now loop over all the nodes */ for (i = 0; i < raw1394_get_nodecount (handle); i++) { /* are we looking for an explicit GUID ? */ if (src->guid != 0) { if (src->guid == rom1394_get_guid (handle, i)) { node = i; src->port = j; g_free (src->uri); src->uri = g_strdup_printf ("dv://%d", src->port); break; } } else { rom1394_directory rom_dir; /* select first AV/C Tape Recorder Player node */ if (rom1394_get_directory (handle, i, &rom_dir) < 0) { GST_WARNING ("error reading config rom directory for node %d\n", i); continue; } if ((rom1394_get_node_type (&rom_dir) == ROM1394_NODE_TYPE_AVC) && avc1394_check_subunit_type (handle, i, AVC1394_SUBUNIT_TYPE_VCR)) { node = i; src->port = j; src->guid = rom1394_get_guid (handle, i); g_free (src->uri); src->uri = g_strdup_printf ("dv://%d", src->port); g_free (src->device_name); src->device_name = g_strdup (rom_dir.label); break; } rom1394_free_directory (&rom_dir); } } next: raw1394_destroy_handle (handle); } return node; } static gboolean gst_hdv1394src_start (GstBaseSrc * bsrc) { GstHDV1394Src *src = GST_HDV1394SRC (bsrc); int control_sock[2]; src->connected = FALSE; if (socketpair (PF_UNIX, SOCK_STREAM, 0, control_sock) < 0) goto socket_pair; READ_SOCKET (src) = control_sock[0]; WRITE_SOCKET (src) = control_sock[1]; fcntl (READ_SOCKET (src), F_SETFL, O_NONBLOCK); fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); src->handle = raw1394_new_handle (); if (!src->handle) { if (errno == EACCES) goto permission_denied; else if (errno == ENOENT) goto not_found; else goto no_handle; } src->num_ports = raw1394_get_port_info (src->handle, src->pinfo, 16); if (src->num_ports == 0) goto no_ports; if (src->use_avc || src->port == -1) src->avc_node = gst_hdv1394src_discover_avc_node (src); /* lets destroy handle and create one on port this is more reliable than setting port on the existing handle */ raw1394_destroy_handle (src->handle); src->handle = raw1394_new_handle_on_port (src->port); if (!src->handle) goto cannot_set_port; raw1394_set_userdata (src->handle, src); raw1394_set_bus_reset_handler (src->handle, gst_hdv1394src_bus_reset); if ((src->iec61883mpeg2 = iec61883_mpeg2_recv_init (src->handle, gst_hdv1394src_iec61883_receive, src)) == NULL) goto cannot_initialise_dv; #if 0 raw1394_set_iso_handler (src->handle, src->channel, gst_hdv1394src_iso_receive); #endif GST_DEBUG_OBJECT (src, "successfully opened up 1394 connection"); src->connected = TRUE; if (iec61883_mpeg2_recv_start (src->iec61883mpeg2, src->channel) != 0) goto cannot_start; #if 0 if (raw1394_start_iso_rcv (src->handle, src->channel) < 0) goto cannot_start; #endif if (src->use_avc) { raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); GST_LOG ("We have an avc_handle"); /* start the VCR */ if (avc_handle) { if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) && avc1394_vcr_is_playing (avc_handle, src->avc_node) != AVC1394_VCR_OPERAND_PLAY_FORWARD) { GST_LOG ("Calling avc1394_vcr_play()"); avc1394_vcr_play (avc_handle, src->avc_node); } raw1394_destroy_handle (avc_handle); } else { GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", g_strerror (errno)); } } return TRUE; socket_pair: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), GST_ERROR_SYSTEM); return FALSE; } permission_denied: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); return FALSE; } not_found: { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), GST_ERROR_SYSTEM); return FALSE; } no_handle: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("can't get raw1394 handle (%s)", g_strerror (errno))); return FALSE; } no_ports: { raw1394_destroy_handle (src->handle); src->handle = NULL; GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("no ports available for raw1394")); return FALSE; } cannot_set_port: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("can't set 1394 port %d", src->port)); return FALSE; } cannot_start: { raw1394_destroy_handle (src->handle); src->handle = NULL; iec61883_mpeg2_close (src->iec61883mpeg2); src->iec61883mpeg2 = NULL; GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("can't start 1394 iso receive")); return FALSE; } cannot_initialise_dv: { raw1394_destroy_handle (src->handle); src->handle = NULL; GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("can't initialise iec61883 hdv")); return FALSE; } } static gboolean gst_hdv1394src_stop (GstBaseSrc * bsrc) { GstHDV1394Src *src = GST_HDV1394SRC (bsrc); close (READ_SOCKET (src)); close (WRITE_SOCKET (src)); READ_SOCKET (src) = -1; WRITE_SOCKET (src) = -1; iec61883_mpeg2_close (src->iec61883mpeg2); #if 0 raw1394_stop_iso_rcv (src->handle, src->channel); #endif if (src->use_avc) { raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); /* pause and stop the VCR */ if (avc_handle) { if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) && (avc1394_vcr_is_playing (avc_handle, src->avc_node) != AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE)) avc1394_vcr_pause (avc_handle, src->avc_node); avc1394_vcr_stop (avc_handle, src->avc_node); raw1394_destroy_handle (avc_handle); } else { GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", g_strerror (errno)); } } raw1394_destroy_handle (src->handle); return TRUE; } static gboolean gst_hdv1394src_unlock (GstBaseSrc * bsrc) { GstHDV1394Src *src = GST_HDV1394SRC (bsrc); SEND_COMMAND (src, CONTROL_STOP); return TRUE; } static void gst_hdv1394src_update_device_name (GstHDV1394Src * src) { raw1394handle_t handle; gint portcount, port, nodecount, node; rom1394_directory directory; g_free (src->device_name); src->device_name = NULL; GST_LOG_OBJECT (src, "updating device name for current GUID"); handle = raw1394_new_handle (); if (handle == NULL) goto gethandle_failed; portcount = raw1394_get_port_info (handle, NULL, 0); for (port = 0; port < portcount; port++) { if (raw1394_set_port (handle, port) >= 0) { nodecount = raw1394_get_nodecount (handle); for (node = 0; node < nodecount; node++) { if (src->guid == rom1394_get_guid (handle, node)) { if (rom1394_get_directory (handle, node, &directory) >= 0) { g_free (src->device_name); src->device_name = g_strdup (directory.label); rom1394_free_directory (&directory); goto done; } else { GST_WARNING ("error reading rom directory for node %d", node); } } } } } src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ done: raw1394_destroy_handle (handle); return; /* ERRORS */ gethandle_failed: { GST_WARNING ("failed to get raw1394 handle: %s", g_strerror (errno)); src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ return; } } /*** GSTURIHANDLER INTERFACE *************************************************/ static guint gst_hdv1394src_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_hdv1394src_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "hdv", NULL }; return protocols; } static const gchar * gst_hdv1394src_uri_get_uri (GstURIHandler * handler) { GstHDV1394Src *gst_hdv1394src = GST_HDV1394SRC (handler); return gst_hdv1394src->uri; } static gboolean gst_hdv1394src_uri_set_uri (GstURIHandler * handler, const gchar * uri) { gchar *protocol, *location; gboolean ret = TRUE; GstHDV1394Src *gst_hdv1394src = GST_HDV1394SRC (handler); protocol = gst_uri_get_protocol (uri); if (strcmp (protocol, "hdv") != 0) { g_free (protocol); return FALSE; } g_free (protocol); location = gst_uri_get_location (uri); if (location && *location != '\0') gst_hdv1394src->port = strtol (location, NULL, 10); else gst_hdv1394src->port = DEFAULT_PORT; g_free (location); g_free (gst_hdv1394src->uri); gst_hdv1394src->uri = g_strdup_printf ("hdv://%d", gst_hdv1394src->port); return ret; } static void gst_hdv1394src_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_hdv1394src_uri_get_type; iface->get_protocols = gst_hdv1394src_uri_get_protocols; iface->get_uri = gst_hdv1394src_uri_get_uri; iface->set_uri = gst_hdv1394src_uri_set_uri; } gst-plugins-good-0.10.31/ext/raw1394/Makefile.am0000644000175000017500000000124411671175352015756 00000000000000plugin_LTLIBRARIES = libgst1394.la if USE_LIBIEC61883 hdvsource = gsthdv1394src.c hdvheaders = gsthdv1394src.h else hdvsource = hdvheaders = endif libgst1394_la_SOURCES = \ gst1394.c gst1394probe.c gstdv1394src.c $(hdvsource) \ gst1394clock.c libgst1394_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(DV1394_CFLAGS) libgst1394_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(DV1394_LIBS) libgst1394_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgst1394_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstdv1394src.h gst1394probe.h $(hdvheaders) \ gst1394clock.h gst-plugins-good-0.10.31/ext/raw1394/gst1394clock.h0000644000175000017500000000454211671175352016231 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2005 Wim Taymans * Copyright (C) 2009 David Schleef * * gst1394clock.h: Clock for use by the IEEE 1394 * * 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_1394_CLOCK_H__ #define __GST_1394_CLOCK_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_1394_CLOCK \ (gst_1394_clock_get_type()) #define GST_1394_CLOCK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_1394_CLOCK,Gst1394Clock)) #define GST_1394_CLOCK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_1394_CLOCK,Gst1394ClockClass)) #define GST_IS_1394_CLOCK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_1394_CLOCK)) #define GST_IS_1394_CLOCK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_1394_CLOCK)) #define GST_1394_CLOCK_CAST(obj) \ ((Gst1394Clock*)(obj)) typedef struct _Gst1394Clock Gst1394Clock; typedef struct _Gst1394ClockClass Gst1394ClockClass; /** * Gst1394Clock: * @clock: parent #GstSystemClock * * Opaque #Gst1394Clock. */ struct _Gst1394Clock { GstSystemClock clock; raw1394handle_t handle; guint32 cycle_timer_lo; guint32 cycle_timer_hi; }; struct _Gst1394ClockClass { GstSystemClockClass parent_class; }; GType gst_1394_clock_get_type (void); Gst1394Clock* gst_1394_clock_new (const gchar *name); void gst_1394_clock_set_handle (Gst1394Clock *clock, raw1394handle_t handle); void gst_1394_clock_unset_handle (Gst1394Clock *clock); G_END_DECLS #endif /* __GST_1394_CLOCK_H__ */ gst-plugins-good-0.10.31/ext/raw1394/gst1394probe.h0000644000175000017500000000176311671175352016247 00000000000000/* GStreamer * Copyright (C) 2007 Julien Puydt * * 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_1394_PROBE_H #define GST_1394_PROBE_H #include G_BEGIN_DECLS void gst_1394_type_add_property_probe_interface (GType type); G_END_DECLS #endif /* __GST_1394_PROBE_H */ gst-plugins-good-0.10.31/ext/raw1394/gst1394clock.c0000644000175000017500000001003211677341654016221 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * Copyright (C) 2009 David Schleef * * gst1394clock.c: Clock for use by IEEE 1394 plugins * * 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 "gst1394clock.h" GST_DEBUG_CATEGORY_STATIC (gst_1394_clock_debug); #define GST_CAT_DEFAULT gst_1394_clock_debug static void gst_1394_clock_class_init (Gst1394ClockClass * klass); static void gst_1394_clock_init (Gst1394Clock * clock); static GstClockTime gst_1394_clock_get_internal_time (GstClock * clock); static GstSystemClockClass *parent_class = NULL; /* static guint gst_1394_clock_signals[LAST_SIGNAL] = { 0 }; */ GType gst_1394_clock_get_type (void) { static GType clock_type = 0; if (!clock_type) { static const GTypeInfo clock_info = { sizeof (Gst1394ClockClass), NULL, NULL, (GClassInitFunc) gst_1394_clock_class_init, NULL, NULL, sizeof (Gst1394Clock), 4, (GInstanceInitFunc) gst_1394_clock_init, NULL }; clock_type = g_type_register_static (GST_TYPE_SYSTEM_CLOCK, "Gst1394Clock", &clock_info, 0); } return clock_type; } static void gst_1394_clock_class_init (Gst1394ClockClass * klass) { GstClockClass *gstclock_class; gstclock_class = (GstClockClass *) klass; parent_class = g_type_class_peek_parent (klass); gstclock_class->get_internal_time = gst_1394_clock_get_internal_time; GST_DEBUG_CATEGORY_INIT (gst_1394_clock_debug, "1394clock", 0, "1394clock"); } static void gst_1394_clock_init (Gst1394Clock * clock) { GST_OBJECT_FLAG_SET (clock, GST_CLOCK_FLAG_CAN_SET_MASTER); } /** * gst_1394_clock_new: * @name: the name of the clock * * Create a new #Gst1394Clock instance. * * Returns: a new #Gst1394Clock */ Gst1394Clock * gst_1394_clock_new (const gchar * name) { Gst1394Clock *_1394clock = GST_1394_CLOCK (g_object_new (GST_TYPE_1394_CLOCK, "name", name, NULL)); return _1394clock; } static GstClockTime gst_1394_clock_get_internal_time (GstClock * clock) { Gst1394Clock *_1394clock; GstClockTime result; guint32 cycle_timer; guint64 local_time; _1394clock = GST_1394_CLOCK_CAST (clock); if (_1394clock->handle != NULL) { GST_OBJECT_LOCK (clock); raw1394_read_cycle_timer (_1394clock->handle, &cycle_timer, &local_time); if (cycle_timer < _1394clock->cycle_timer_lo) { GST_LOG_OBJECT (clock, "overflow %u to %u", _1394clock->cycle_timer_lo, cycle_timer); _1394clock->cycle_timer_hi++; } _1394clock->cycle_timer_lo = cycle_timer; /* get the seconds from the cycleSeconds counter */ result = (((((guint64) _1394clock->cycle_timer_hi) << 32) | cycle_timer) >> 25) * GST_SECOND; /* add the microseconds from the cycleCount counter */ result += (((cycle_timer >> 12) & 0x1fff) * 125) * GST_USECOND; GST_LOG_OBJECT (clock, "result %" GST_TIME_FORMAT, GST_TIME_ARGS (result)); GST_OBJECT_UNLOCK (clock); } else { result = GST_CLOCK_TIME_NONE; } return result; } void gst_1394_clock_set_handle (Gst1394Clock * clock, raw1394handle_t handle) { clock->handle = handle; clock->cycle_timer_lo = 0; clock->cycle_timer_hi = 0; } void gst_1394_clock_unset_handle (Gst1394Clock * clock) { clock->handle = NULL; } gst-plugins-good-0.10.31/ext/raw1394/gst1394probe.c0000644000175000017500000000764511671175352016247 00000000000000/* GStreamer * Copyright (C) 2007 Julien Puydt * * 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 #include #include #include #include #include "gst1394probe.h" #include "gst/interfaces/propertyprobe.h" static GValueArray * gst_1394_get_guid_array (void) { GValueArray *result = NULL; raw1394handle_t handle = NULL; int num_ports = 0; int port = 0; int num_nodes = 0; int node = 0; rom1394_directory directory; GValue value = { 0, }; handle = raw1394_new_handle (); if (handle == NULL) return NULL; num_ports = raw1394_get_port_info (handle, NULL, 0); for (port = 0; port < num_ports; port++) { if (raw1394_set_port (handle, port) >= 0) { num_nodes = raw1394_get_nodecount (handle); for (node = 0; node < num_nodes; node++) { rom1394_get_directory (handle, node, &directory); if (rom1394_get_node_type (&directory) == ROM1394_NODE_TYPE_AVC && avc1394_check_subunit_type (handle, node, AVC1394_SUBUNIT_TYPE_VCR)) { if (result == NULL) result = g_value_array_new (3); /* looks like a sensible default */ g_value_init (&value, G_TYPE_UINT64); g_value_set_uint64 (&value, rom1394_get_guid (handle, node)); g_value_array_append (result, &value); g_value_unset (&value); } } } } return result; } static const GList * gst_1394_property_probe_get_properties (GstPropertyProbe * probe) { static GList *result = NULL; GObjectClass *klass = NULL; GParamSpec *spec = NULL; if (result == NULL) { klass = G_OBJECT_GET_CLASS (probe); spec = g_object_class_find_property (klass, "guid"); result = g_list_append (result, spec); } return result; } static void gst_1394_property_probe_probe_property (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec) { if (!g_str_equal (pspec->name, "guid")) G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); } static gboolean gst_1394_property_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec) { return TRUE; } static GValueArray * gst_1394_property_probe_get_values (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec) { GValueArray *result = NULL; if (!g_str_equal (pspec->name, "guid")) { G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); return NULL; } result = gst_1394_get_guid_array (); if (result == NULL) GST_LOG_OBJECT (probe, "No guid found"); return result; } static void gst_1394_property_probe_interface_init (GstPropertyProbeInterface * iface) { iface->get_properties = gst_1394_property_probe_get_properties; iface->probe_property = gst_1394_property_probe_probe_property; iface->needs_probe = gst_1394_property_probe_needs_probe; iface->get_values = gst_1394_property_probe_get_values; } void gst_1394_type_add_property_probe_interface (GType type) { static const GInterfaceInfo probe_iface_info = { (GInterfaceInitFunc) gst_1394_property_probe_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &probe_iface_info); } gst-plugins-good-0.10.31/ext/raw1394/gstdv1394src.c0000644000175000017500000010145011677341654016254 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2000> Daniel Fischer * <2004> Wim Taymans * <2006> Zaheer Abbas Merali * * 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-dv1394src * * Read DV (digital video) data from firewire port. * * * Example launch line * |[ * gst-launch dv1394src ! queue ! dvdemux name=d ! queue ! dvdec ! xvimagesink d. ! queue ! alsasink * ]| This pipeline captures from the firewire port and displays it (might need * format converters for audio/video). * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBIEC61883 #include #endif #include #include "gstdv1394src.h" #include "gst1394probe.h" #include "gst1394clock.h" #define CONTROL_STOP 'S' /* stop the select call */ #define CONTROL_SOCKETS(src) src->control_sock #define WRITE_SOCKET(src) src->control_sock[1] #define READ_SOCKET(src) src->control_sock[0] #define SEND_COMMAND(src, command) \ G_STMT_START { \ int G_GNUC_UNUSED _res; unsigned char c; c = command; \ _res = write (WRITE_SOCKET(src), &c, 1); \ } G_STMT_END #define READ_COMMAND(src, command, res) \ G_STMT_START { \ res = read(READ_SOCKET(src), &command, 1); \ } G_STMT_END GST_DEBUG_CATEGORY_STATIC (dv1394src_debug); #define GST_CAT_DEFAULT (dv1394src_debug) #define PAL_FRAMESIZE 144000 #define PAL_FRAMERATE 25 #define NTSC_FRAMESIZE 120000 #define NTSC_FRAMERATE 30 enum { SIGNAL_FRAME_DROPPED, /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_PORT -1 #define DEFAULT_CHANNEL 63 #define DEFAULT_CONSECUTIVE 1 #define DEFAULT_SKIP 0 #define DEFAULT_DROP_INCOMPLETE TRUE #define DEFAULT_USE_AVC TRUE #define DEFAULT_GUID 0 enum { PROP_0, PROP_PORT, PROP_CHANNEL, PROP_CONSECUTIVE, PROP_SKIP, PROP_DROP_INCOMPLETE, PROP_USE_AVC, PROP_GUID, PROP_DEVICE_NAME }; static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-dv, " "format = (string) { NTSC, PAL }, " "systemstream = (boolean) true") ); static void gst_dv1394src_uri_handler_init (gpointer g_iface, gpointer iface_data); static void gst_dv1394src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_dv1394src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_dv1394src_dispose (GObject * object); static GstClock *gst_dv1394src_provide_clock (GstElement * element); static GstStateChangeReturn gst_dv1394_src_change_state (GstElement * element, GstStateChange transition); static gboolean gst_dv1394src_start (GstBaseSrc * bsrc); static gboolean gst_dv1394src_stop (GstBaseSrc * bsrc); static gboolean gst_dv1394src_unlock (GstBaseSrc * bsrc); static GstFlowReturn gst_dv1394src_create (GstPushSrc * psrc, GstBuffer ** buf); static gboolean gst_dv1394src_query (GstBaseSrc * src, GstQuery * query); static void gst_dv1394src_update_device_name (GstDV1394Src * src); static void _do_init (GType type) { static const GInterfaceInfo urihandler_info = { gst_dv1394src_uri_handler_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); gst_1394_type_add_property_probe_interface (type); GST_DEBUG_CATEGORY_INIT (dv1394src_debug, "dv1394src", 0, "DV firewire source"); } GST_BOILERPLATE_FULL (GstDV1394Src, gst_dv1394src, GstPushSrc, GST_TYPE_PUSH_SRC, _do_init); static guint gst_dv1394src_signals[LAST_SIGNAL] = { 0 }; static void gst_dv1394src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_set_details_simple (element_class, "Firewire (1394) DV video source", "Source/Video", "Source for DV video data from firewire port", "Erik Walthinsen , " "Daniel Fischer , " "Wim Taymans , " "Zaheer Abbas Merali "); } static void gst_dv1394src_class_init (GstDV1394SrcClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSrcClass *gstbasesrc_class; GstPushSrcClass *gstpushsrc_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstpushsrc_class = (GstPushSrcClass *) klass; gobject_class->set_property = gst_dv1394src_set_property; gobject_class->get_property = gst_dv1394src_get_property; gobject_class->dispose = gst_dv1394src_dispose; gstelement_class->provide_clock = gst_dv1394src_provide_clock; gstelement_class->change_state = gst_dv1394_src_change_state; gst_dv1394src_signals[SIGNAL_FRAME_DROPPED] = g_signal_new ("frame-dropped", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDV1394SrcClass, frame_dropped), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, g_param_spec_int ("port", "Port", "Port number (-1 automatic)", -1, 16, DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CHANNEL, g_param_spec_int ("channel", "Channel", "Channel number for listening", 0, 64, DEFAULT_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CONSECUTIVE, g_param_spec_int ("consecutive", "consecutive frames", "send n consecutive frames after skipping", 1, G_MAXINT, DEFAULT_CONSECUTIVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SKIP, g_param_spec_int ("skip", "skip frames", "skip n frames", 0, G_MAXINT, DEFAULT_SKIP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DROP_INCOMPLETE, g_param_spec_boolean ("drop-incomplete", "drop incomplete", "drop incomplete frames", DEFAULT_DROP_INCOMPLETE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_USE_AVC, g_param_spec_boolean ("use-avc", "Use AV/C", "Use AV/C VTR control", DEFAULT_USE_AVC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GUID, g_param_spec_uint64 ("guid", "GUID", "select one of multiple DV devices by its GUID. use a hexadecimal " "like 0xhhhhhhhhhhhhhhhh. (0 = no guid)", 0, G_MAXUINT64, DEFAULT_GUID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstDV1394Src:device-name * * Descriptive name of the currently opened device * * Since: 0.10.7 **/ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEVICE_NAME, g_param_spec_string ("device-name", "device name", "user-friendly name of the device", "Default", G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); gstbasesrc_class->negotiate = NULL; gstbasesrc_class->start = gst_dv1394src_start; gstbasesrc_class->stop = gst_dv1394src_stop; gstbasesrc_class->unlock = gst_dv1394src_unlock; gstbasesrc_class->query = gst_dv1394src_query; gstpushsrc_class->create = gst_dv1394src_create; } static void gst_dv1394src_init (GstDV1394Src * dv1394src, GstDV1394SrcClass * klass) { GstPad *srcpad = GST_BASE_SRC_PAD (dv1394src); gst_base_src_set_live (GST_BASE_SRC (dv1394src), TRUE); gst_base_src_set_format (GST_BASE_SRC (dv1394src), GST_FORMAT_TIME); gst_base_src_set_do_timestamp (GST_BASE_SRC (dv1394src), TRUE); gst_pad_use_fixed_caps (srcpad); dv1394src->port = DEFAULT_PORT; dv1394src->channel = DEFAULT_CHANNEL; dv1394src->consecutive = DEFAULT_CONSECUTIVE; dv1394src->skip = DEFAULT_SKIP; dv1394src->drop_incomplete = DEFAULT_DROP_INCOMPLETE; dv1394src->use_avc = DEFAULT_USE_AVC; dv1394src->guid = DEFAULT_GUID; dv1394src->uri = g_strdup_printf ("dv://%d", dv1394src->port); dv1394src->device_name = g_strdup_printf ("Default"); READ_SOCKET (dv1394src) = -1; WRITE_SOCKET (dv1394src) = -1; /* initialized when first header received */ dv1394src->frame_size = 0; dv1394src->buf = NULL; dv1394src->frame = NULL; dv1394src->frame_sequence = 0; dv1394src->provided_clock = gst_1394_clock_new ("dv1394clock"); } static void gst_dv1394src_dispose (GObject * object) { GstDV1394Src *src = GST_DV1394SRC (object); if (src->provided_clock) { g_object_unref (src->provided_clock); } g_free (src->uri); src->uri = NULL; g_free (src->device_name); src->device_name = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_dv1394src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDV1394Src *filter = GST_DV1394SRC (object); switch (prop_id) { case PROP_PORT: filter->port = g_value_get_int (value); g_free (filter->uri); filter->uri = g_strdup_printf ("dv://%d", filter->port); break; case PROP_CHANNEL: filter->channel = g_value_get_int (value); break; case PROP_SKIP: filter->skip = g_value_get_int (value); break; case PROP_CONSECUTIVE: filter->consecutive = g_value_get_int (value); break; case PROP_DROP_INCOMPLETE: filter->drop_incomplete = g_value_get_boolean (value); break; case PROP_USE_AVC: filter->use_avc = g_value_get_boolean (value); break; case PROP_GUID: filter->guid = g_value_get_uint64 (value); gst_dv1394src_update_device_name (filter); break; default: break; } } static void gst_dv1394src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDV1394Src *filter = GST_DV1394SRC (object); switch (prop_id) { case PROP_PORT: g_value_set_int (value, filter->port); break; case PROP_CHANNEL: g_value_set_int (value, filter->channel); break; case PROP_SKIP: g_value_set_int (value, filter->skip); break; case PROP_CONSECUTIVE: g_value_set_int (value, filter->consecutive); break; case PROP_DROP_INCOMPLETE: g_value_set_boolean (value, filter->drop_incomplete); break; case PROP_USE_AVC: g_value_set_boolean (value, filter->use_avc); break; case PROP_GUID: g_value_set_uint64 (value, filter->guid); break; case PROP_DEVICE_NAME: g_value_set_string (value, filter->device_name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstClock * gst_dv1394src_provide_clock (GstElement * element) { GstDV1394Src *dv1394src = GST_DV1394SRC (element); return GST_CLOCK_CAST (gst_object_ref (dv1394src->provided_clock)); } static GstStateChangeReturn gst_dv1394_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstDV1394Src *src = GST_DV1394SRC (element); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gst_element_post_message (element, gst_message_new_clock_lost (GST_OBJECT_CAST (element), GST_CLOCK_CAST (src->provided_clock))); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: gst_element_post_message (element, gst_message_new_clock_provide (GST_OBJECT_CAST (element), GST_CLOCK_CAST (src->provided_clock), TRUE)); break; default: break; } return ret; } #ifdef HAVE_LIBIEC61883 static GstDV1394Src * gst_dv1394src_from_raw1394handle (raw1394handle_t handle) { iec61883_dv_t dv = (iec61883_dv_t) raw1394_get_userdata (handle); iec61883_dv_fb_t dv_fb = (iec61883_dv_fb_t) iec61883_dv_get_callback_data (dv); return GST_DV1394SRC (iec61883_dv_fb_get_callback_data (dv_fb)); } #else /* HAVE_LIBIEC61883 */ static GstDV1394Src * gst_dv1394src_from_raw1394handle (raw1394handle_t handle) { return GST_DV1394SRC (raw1394_get_userdata (handle)); } #endif /* HAVE_LIBIEC61883 */ #ifdef HAVE_LIBIEC61883 static int gst_dv1394src_iec61883_receive (unsigned char *data, int len, int complete, void *cbdata) { GstDV1394Src *dv1394src = GST_DV1394SRC (cbdata); if (G_UNLIKELY (!GST_PAD_CAPS (GST_BASE_SRC_PAD (dv1394src)))) { GstCaps *caps; unsigned char *p = data; // figure format (NTSC/PAL) if (p[3] & 0x80) { // PAL dv1394src->frame_size = PAL_FRAMESIZE; dv1394src->frame_rate = PAL_FRAMERATE; GST_DEBUG ("PAL data"); caps = gst_caps_new_simple ("video/x-dv", "format", G_TYPE_STRING, "PAL", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); } else { // NTSC (untested) dv1394src->frame_size = NTSC_FRAMESIZE; dv1394src->frame_rate = NTSC_FRAMERATE; GST_DEBUG ("NTSC data [untested] - please report success/failure to "); caps = gst_caps_new_simple ("video/x-dv", "format", G_TYPE_STRING, "NTSC", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); } gst_pad_set_caps (GST_BASE_SRC_PAD (dv1394src), caps); gst_caps_unref (caps); } dv1394src->frame = NULL; if (G_LIKELY ((dv1394src->frame_sequence + 1) % (dv1394src->skip + dv1394src->consecutive) < dv1394src->consecutive)) { if (complete && len == dv1394src->frame_size) { guint8 *bufdata; GstBuffer *buf; buf = gst_buffer_new_and_alloc (dv1394src->frame_size); GST_BUFFER_OFFSET (buf) = dv1394src->frame_sequence; bufdata = GST_BUFFER_DATA (buf); memcpy (bufdata, data, len); dv1394src->buf = buf; } } dv1394src->frame_sequence++; return 0; } #else static int gst_dv1394src_iso_receive (raw1394handle_t handle, int channel, size_t len, quadlet_t * data) { GstDV1394Src *dv1394src = gst_dv1394src_from_raw1394handle (handle); if (len > 16) { /* the following code taken from kino-0.51 (Dan Dennedy/Charles Yates) Kindly relicensed under the LGPL. See the commit log for version 1.6 of this file in CVS. */ unsigned char *p = (unsigned char *) &data[3]; int section_type = p[0] >> 5; /* section type is in bits 5 - 7 */ int dif_sequence = p[1] >> 4; /* dif sequence number is in bits 4 - 7 */ int dif_block = p[2]; /* if we are at the beginning of a frame, we set buf=frame, and alloc a new buffer for frame */ if (section_type == 0 && dif_sequence == 0) { // dif header if (!GST_PAD_CAPS (GST_BASE_SRC_PAD (dv1394src))) { GstCaps *caps; // figure format (NTSC/PAL) if (p[3] & 0x80) { // PAL dv1394src->frame_size = PAL_FRAMESIZE; dv1394src->frame_rate = PAL_FRAMERATE; GST_DEBUG ("PAL data"); caps = gst_caps_new_simple ("video/x-dv", "format", G_TYPE_STRING, "PAL", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); } else { // NTSC (untested) dv1394src->frame_size = NTSC_FRAMESIZE; dv1394src->frame_rate = NTSC_FRAMERATE; GST_DEBUG ("NTSC data [untested] - please report success/failure to "); caps = gst_caps_new_simple ("video/x-dv", "format", G_TYPE_STRING, "NTSC", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); } gst_pad_set_caps (GST_BASE_SRC_PAD (dv1394src), caps); gst_caps_unref (caps); } // drop last frame when not complete if (!dv1394src->drop_incomplete || dv1394src->bytes_in_frame == dv1394src->frame_size) { dv1394src->buf = dv1394src->frame; } else { GST_INFO_OBJECT (GST_ELEMENT (dv1394src), "incomplete frame dropped"); g_signal_emit (G_OBJECT (dv1394src), gst_dv1394src_signals[SIGNAL_FRAME_DROPPED], 0); if (dv1394src->frame) { gst_buffer_unref (dv1394src->frame); } } if ((dv1394src->frame_sequence + 1) % (dv1394src->skip + dv1394src->consecutive) < dv1394src->consecutive) { GstBuffer *buf; gint64 i64; buf = gst_buffer_new_and_alloc (dv1394src->frame_size); /* fill in offset, duration, timestamp */ GST_BUFFER_OFFSET (buf) = dv1394src->frame_sequence; dv1394src->frame = buf; } dv1394src->frame_sequence++; dv1394src->bytes_in_frame = 0; } if (dv1394src->frame != NULL) { guint8 *data = GST_BUFFER_DATA (dv1394src->frame); switch (section_type) { case 0: /* 1 Header block */ /* p[3] |= 0x80; // hack to force PAL data */ memcpy (data + dif_sequence * 150 * 80, p, 480); break; case 1: /* 2 Subcode blocks */ memcpy (data + dif_sequence * 150 * 80 + (1 + dif_block) * 80, p, 480); break; case 2: /* 3 VAUX blocks */ memcpy (data + dif_sequence * 150 * 80 + (3 + dif_block) * 80, p, 480); break; case 3: /* 9 Audio blocks interleaved with video */ memcpy (data + dif_sequence * 150 * 80 + (6 + dif_block * 16) * 80, p, 480); break; case 4: /* 135 Video blocks interleaved with audio */ memcpy (data + dif_sequence * 150 * 80 + (7 + (dif_block / 15) + dif_block) * 80, p, 480); break; default: /* we can't handle any other data */ break; } dv1394src->bytes_in_frame += 480; } } return 0; } #endif /* * When an ieee1394 bus reset happens, usually a device has been removed * or added. We send a message on the message bus with the node count * and whether the capture device used in this element connected, disconnected * or was unchanged * Message structure: * nodecount - integer with number of nodes on bus * current-device-change - integer (1 if device connected, 0 if no change to * current device status, -1 if device disconnected) */ static int gst_dv1394src_bus_reset (raw1394handle_t handle, unsigned int generation) { GstDV1394Src *src; gint nodecount; GstMessage *message; GstStructure *structure; gint current_device_change; gint i; src = gst_dv1394src_from_raw1394handle (handle); GST_INFO_OBJECT (src, "have bus reset"); /* update generation - told to do so by docs */ raw1394_update_generation (handle, generation); nodecount = raw1394_get_nodecount (handle); /* allocate memory for portinfo */ /* current_device_change is -1 if camera disconnected, 0 if other device * connected or 1 if camera has now connected */ current_device_change = -1; for (i = 0; i < nodecount; i++) { if (src->guid == rom1394_get_guid (handle, i)) { /* Camera is with us */ GST_DEBUG ("Camera is with us"); if (!src->connected) { current_device_change = 1; src->connected = TRUE; } else current_device_change = 0; } } if (src->connected && current_device_change == -1) { GST_DEBUG ("Camera has disconnected"); src->connected = FALSE; } else if (!src->connected && current_device_change == -1) { GST_DEBUG ("Camera is still not with us"); current_device_change = 0; } structure = gst_structure_new ("ieee1394-bus-reset", "nodecount", G_TYPE_INT, nodecount, "current-device-change", G_TYPE_INT, current_device_change, NULL); message = gst_message_new_element (GST_OBJECT (src), structure); gst_element_post_message (GST_ELEMENT (src), message); return 0; } static GstFlowReturn gst_dv1394src_create (GstPushSrc * psrc, GstBuffer ** buf) { GstDV1394Src *dv1394src = GST_DV1394SRC (psrc); GstCaps *caps; struct pollfd pollfds[2]; pollfds[0].fd = raw1394_get_fd (dv1394src->handle); pollfds[0].events = POLLIN | POLLERR | POLLHUP | POLLPRI; pollfds[1].fd = READ_SOCKET (dv1394src); pollfds[1].events = POLLIN | POLLERR | POLLHUP | POLLPRI; if (G_UNLIKELY (dv1394src->buf)) { /* maybe we had an error before, and there's a stale buffer? */ gst_buffer_unref (dv1394src->buf); dv1394src->buf = NULL; } while (TRUE) { int res = poll (pollfds, 2, -1); if (G_UNLIKELY (res < 0)) { if (errno == EAGAIN || errno == EINTR) continue; else goto error_while_polling; } if (G_UNLIKELY (pollfds[1].revents)) { char command; if (pollfds[1].revents & POLLIN) READ_COMMAND (dv1394src, command, res); goto told_to_stop; } else if (G_LIKELY (pollfds[0].revents & POLLIN)) { /* shouldn't block in theory */ raw1394_loop_iterate (dv1394src->handle); if (dv1394src->buf) break; } } g_assert (dv1394src->buf); caps = gst_pad_get_caps (GST_BASE_SRC_PAD (psrc)); gst_buffer_set_caps (dv1394src->buf, caps); gst_caps_unref (caps); *buf = dv1394src->buf; dv1394src->buf = NULL; return GST_FLOW_OK; error_while_polling: { GST_ELEMENT_ERROR (dv1394src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); return GST_FLOW_UNEXPECTED; } told_to_stop: { GST_DEBUG_OBJECT (dv1394src, "told to stop, shutting down"); return GST_FLOW_WRONG_STATE; } } static int gst_dv1394src_discover_avc_node (GstDV1394Src * src) { int node = -1; int i, j = 0; int m = src->num_ports; if (src->port >= 0) { /* search on explicit port */ j = src->port; m = j + 1; } /* loop over all our ports */ for (; j < m && node == -1; j++) { raw1394handle_t handle; struct raw1394_portinfo pinf[16]; /* open the port */ handle = raw1394_new_handle (); if (!handle) { GST_WARNING ("raw1394 - failed to get handle: %s.\n", strerror (errno)); continue; } if (raw1394_get_port_info (handle, pinf, 16) < 0) { GST_WARNING ("raw1394 - failed to get port info: %s.\n", strerror (errno)); goto next; } /* tell raw1394 which host adapter to use */ if (raw1394_set_port (handle, j) < 0) { GST_WARNING ("raw1394 - failed to set set port: %s.\n", strerror (errno)); goto next; } /* now loop over all the nodes */ for (i = 0; i < raw1394_get_nodecount (handle); i++) { /* are we looking for an explicit GUID ? */ if (src->guid != 0) { if (src->guid == rom1394_get_guid (handle, i)) { node = i; src->port = j; g_free (src->uri); src->uri = g_strdup_printf ("dv://%d", src->port); break; } } else { rom1394_directory rom_dir; /* select first AV/C Tape Recorder Player node */ if (rom1394_get_directory (handle, i, &rom_dir) < 0) { GST_WARNING ("error reading config rom directory for node %d\n", i); continue; } if ((rom1394_get_node_type (&rom_dir) == ROM1394_NODE_TYPE_AVC) && avc1394_check_subunit_type (handle, i, AVC1394_SUBUNIT_TYPE_VCR)) { node = i; src->port = j; src->guid = rom1394_get_guid (handle, i); g_free (src->uri); src->uri = g_strdup_printf ("dv://%d", src->port); g_free (src->device_name); src->device_name = g_strdup (rom_dir.label); break; } rom1394_free_directory (&rom_dir); } } next: raw1394_destroy_handle (handle); } return node; } static gboolean gst_dv1394src_start (GstBaseSrc * bsrc) { GstDV1394Src *src = GST_DV1394SRC (bsrc); int control_sock[2]; src->connected = FALSE; if (socketpair (PF_UNIX, SOCK_STREAM, 0, control_sock) < 0) goto socket_pair; READ_SOCKET (src) = control_sock[0]; WRITE_SOCKET (src) = control_sock[1]; fcntl (READ_SOCKET (src), F_SETFL, O_NONBLOCK); fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); src->handle = raw1394_new_handle (); if (!src->handle) { if (errno == EACCES) goto permission_denied; else if (errno == ENOENT) goto not_found; else goto no_handle; } src->num_ports = raw1394_get_port_info (src->handle, src->pinfo, 16); if (src->num_ports == 0) goto no_ports; if (src->use_avc || src->port == -1) src->avc_node = gst_dv1394src_discover_avc_node (src); /* lets destroy handle and create one on port this is more reliable than setting port on the existing handle */ raw1394_destroy_handle (src->handle); src->handle = raw1394_new_handle_on_port (src->port); if (!src->handle) goto cannot_set_port; raw1394_set_userdata (src->handle, src); raw1394_set_bus_reset_handler (src->handle, gst_dv1394src_bus_reset); #ifdef HAVE_LIBIEC61883 if ((src->iec61883dv = iec61883_dv_fb_init (src->handle, gst_dv1394src_iec61883_receive, src)) == NULL) goto cannot_initialise_dv; #else raw1394_set_iso_handler (src->handle, src->channel, gst_dv1394src_iso_receive); #endif GST_DEBUG_OBJECT (src, "successfully opened up 1394 connection"); src->connected = TRUE; #ifdef HAVE_LIBIEC61883 if (iec61883_dv_fb_start (src->iec61883dv, src->channel) != 0) goto cannot_start; #else if (raw1394_start_iso_rcv (src->handle, src->channel) < 0) goto cannot_start; #endif if (src->use_avc) { raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); /* start the VCR */ if (avc_handle) { if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) && avc1394_vcr_is_playing (avc_handle, src->avc_node) != AVC1394_VCR_OPERAND_PLAY_FORWARD) avc1394_vcr_play (avc_handle, src->avc_node); raw1394_destroy_handle (avc_handle); } else { GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", g_strerror (errno)); } } gst_1394_clock_set_handle (src->provided_clock, src->handle); return TRUE; socket_pair: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), GST_ERROR_SYSTEM); return FALSE; } permission_denied: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); return FALSE; } not_found: { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), GST_ERROR_SYSTEM); return FALSE; } no_handle: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("can't get raw1394 handle (%s)", g_strerror (errno))); return FALSE; } no_ports: { raw1394_destroy_handle (src->handle); src->handle = NULL; GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("no ports available for raw1394")); return FALSE; } cannot_set_port: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("can't set 1394 port %d", src->port)); return FALSE; } cannot_start: { raw1394_destroy_handle (src->handle); src->handle = NULL; #ifdef HAVE_LIBIEC61883 iec61883_dv_fb_close (src->iec61883dv); src->iec61883dv = NULL; #endif GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("can't start 1394 iso receive")); return FALSE; } #ifdef HAVE_LIBIEC61883 cannot_initialise_dv: { raw1394_destroy_handle (src->handle); src->handle = NULL; GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("can't initialise iec61883 dv")); return FALSE; } #endif } static gboolean gst_dv1394src_stop (GstBaseSrc * bsrc) { GstDV1394Src *src = GST_DV1394SRC (bsrc); close (READ_SOCKET (src)); close (WRITE_SOCKET (src)); READ_SOCKET (src) = -1; WRITE_SOCKET (src) = -1; #ifdef HAVE_LIBIEC61883 iec61883_dv_fb_close (src->iec61883dv); #else raw1394_stop_iso_rcv (src->handle, src->channel); #endif if (src->use_avc) { raw1394handle_t avc_handle = raw1394_new_handle_on_port (src->port); /* pause and stop the VCR */ if (avc_handle) { if (!avc1394_vcr_is_recording (avc_handle, src->avc_node) && (avc1394_vcr_is_playing (avc_handle, src->avc_node) != AVC1394_VCR_OPERAND_PLAY_FORWARD_PAUSE)) avc1394_vcr_pause (avc_handle, src->avc_node); avc1394_vcr_stop (avc_handle, src->avc_node); raw1394_destroy_handle (avc_handle); } else { GST_WARNING_OBJECT (src, "Starting VCR via avc1394 failed: %s", g_strerror (errno)); } } gst_1394_clock_unset_handle (src->provided_clock); raw1394_destroy_handle (src->handle); return TRUE; } static gboolean gst_dv1394src_unlock (GstBaseSrc * bsrc) { GstDV1394Src *src = GST_DV1394SRC (bsrc); SEND_COMMAND (src, CONTROL_STOP); return TRUE; } static gboolean gst_dv1394src_query (GstBaseSrc * basesrc, GstQuery * query) { switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { gst_query_set_latency (query, TRUE, GST_SECOND / 25, GST_CLOCK_TIME_NONE); } break; default: goto not_supported; } return TRUE; not_supported: return GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); } static void gst_dv1394src_update_device_name (GstDV1394Src * src) { raw1394handle_t handle; gint portcount, port, nodecount, node; rom1394_directory directory; g_free (src->device_name); src->device_name = NULL; GST_LOG_OBJECT (src, "updating device name for current GUID"); handle = raw1394_new_handle (); if (handle == NULL) goto gethandle_failed; portcount = raw1394_get_port_info (handle, NULL, 0); for (port = 0; port < portcount; port++) { if (raw1394_set_port (handle, port) >= 0) { nodecount = raw1394_get_nodecount (handle); for (node = 0; node < nodecount; node++) { if (src->guid == rom1394_get_guid (handle, node)) { if (rom1394_get_directory (handle, node, &directory) >= 0) { g_free (src->device_name); src->device_name = g_strdup (directory.label); rom1394_free_directory (&directory); goto done; } else { GST_WARNING ("error reading rom directory for node %d", node); } } } } } src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ done: raw1394_destroy_handle (handle); return; /* ERRORS */ gethandle_failed: { GST_WARNING ("failed to get raw1394 handle: %s", g_strerror (errno)); src->device_name = g_strdup ("Unknown"); /* FIXME: translate? */ return; } } /*** GSTURIHANDLER INTERFACE *************************************************/ static guint gst_dv1394src_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_dv1394src_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "dv", NULL }; return protocols; } static const gchar * gst_dv1394src_uri_get_uri (GstURIHandler * handler) { GstDV1394Src *gst_dv1394src = GST_DV1394SRC (handler); return gst_dv1394src->uri; } static gboolean gst_dv1394src_uri_set_uri (GstURIHandler * handler, const gchar * uri) { gchar *protocol, *location; gboolean ret = TRUE; GstDV1394Src *gst_dv1394src = GST_DV1394SRC (handler); protocol = gst_uri_get_protocol (uri); if (strcmp (protocol, "dv") != 0) { g_free (protocol); return FALSE; } g_free (protocol); location = gst_uri_get_location (uri); if (location && *location != '\0') gst_dv1394src->port = strtol (location, NULL, 10); else gst_dv1394src->port = DEFAULT_PORT; g_free (location); g_free (gst_dv1394src->uri); gst_dv1394src->uri = g_strdup_printf ("dv://%d", gst_dv1394src->port); return ret; } static void gst_dv1394src_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_dv1394src_uri_get_type; iface->get_protocols = gst_dv1394src_uri_get_protocols; iface->get_uri = gst_dv1394src_uri_get_uri; iface->set_uri = gst_dv1394src_uri_set_uri; } gst-plugins-good-0.10.31/ext/raw1394/gstdv1394src.h0000644000175000017500000000470311671175352016256 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_GST1394_H__ #define __GST_GST1394_H__ #include #include #include "gst1394clock.h" #include #ifdef HAVE_LIBIEC61883 #include #endif G_BEGIN_DECLS #define GST_TYPE_DV1394SRC \ (gst_dv1394src_get_type()) #define GST_DV1394SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DV1394SRC,GstDV1394Src)) #define GST_DV1394SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DV1394SRC,GstDV1394SrcClass)) #define GST_IS_DV1394SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DV1394SRC)) #define GST_IS_DV1394SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DV1394SRC)) typedef struct _GstDV1394Src GstDV1394Src; typedef struct _GstDV1394SrcClass GstDV1394SrcClass; struct _GstDV1394Src { GstPushSrc element; // consecutive=2, skip=4 will skip 4 frames, then let 2 consecutive ones thru gint consecutive; gint skip; gboolean drop_incomplete; gint num_ports; gint port; gint channel; octlet_t guid; gint avc_node; gboolean use_avc; struct raw1394_portinfo pinfo[16]; raw1394handle_t handle; GstBuffer *buf; GstBuffer *frame; guint frame_size; guint frame_rate; guint bytes_in_frame; guint frame_sequence; int control_sock[2]; gchar *uri; gchar *device_name; gboolean connected; #ifdef HAVE_LIBIEC61883 iec61883_dv_fb_t iec61883dv; #endif Gst1394Clock *provided_clock; }; struct _GstDV1394SrcClass { GstPushSrcClass parent_class; /* signal */ void (*frame_dropped) (GstElement *elem); }; GType gst_dv1394src_get_type(void); G_END_DECLS #endif /* __GST_GST1394_H__ */ gst-plugins-good-0.10.31/ext/raw1394/Makefile.in0000644000175000017500000010042111720560227015756 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/raw1394 DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgst1394_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libgst1394_la_SOURCES_DIST = gst1394.c gst1394probe.c \ gstdv1394src.c gsthdv1394src.c gst1394clock.c @USE_LIBIEC61883_TRUE@am__objects_1 = libgst1394_la-gsthdv1394src.lo am_libgst1394_la_OBJECTS = libgst1394_la-gst1394.lo \ libgst1394_la-gst1394probe.lo libgst1394_la-gstdv1394src.lo \ $(am__objects_1) libgst1394_la-gst1394clock.lo libgst1394_la_OBJECTS = $(am_libgst1394_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgst1394_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgst1394_la_CFLAGS) $(CFLAGS) \ $(libgst1394_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgst1394_la_SOURCES) DIST_SOURCES = $(am__libgst1394_la_SOURCES_DIST) am__noinst_HEADERS_DIST = gstdv1394src.h gst1394probe.h \ gsthdv1394src.h gst1394clock.h HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgst1394.la @USE_LIBIEC61883_FALSE@hdvsource = @USE_LIBIEC61883_TRUE@hdvsource = gsthdv1394src.c @USE_LIBIEC61883_FALSE@hdvheaders = @USE_LIBIEC61883_TRUE@hdvheaders = gsthdv1394src.h libgst1394_la_SOURCES = \ gst1394.c gst1394probe.c gstdv1394src.c $(hdvsource) \ gst1394clock.c libgst1394_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(DV1394_CFLAGS) libgst1394_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(DV1394_LIBS) libgst1394_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgst1394_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstdv1394src.h gst1394probe.h $(hdvheaders) \ gst1394clock.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/raw1394/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/raw1394/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgst1394.la: $(libgst1394_la_OBJECTS) $(libgst1394_la_DEPENDENCIES) $(EXTRA_libgst1394_la_DEPENDENCIES) $(AM_V_CCLD)$(libgst1394_la_LINK) -rpath $(plugindir) $(libgst1394_la_OBJECTS) $(libgst1394_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gst1394.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gst1394clock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gst1394probe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gstdv1394src.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgst1394_la-gsthdv1394src.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgst1394_la-gst1394.lo: gst1394.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gst1394.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gst1394.Tpo -c -o libgst1394_la-gst1394.lo `test -f 'gst1394.c' || echo '$(srcdir)/'`gst1394.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gst1394.Tpo $(DEPDIR)/libgst1394_la-gst1394.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst1394.c' object='libgst1394_la-gst1394.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gst1394.lo `test -f 'gst1394.c' || echo '$(srcdir)/'`gst1394.c libgst1394_la-gst1394probe.lo: gst1394probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gst1394probe.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gst1394probe.Tpo -c -o libgst1394_la-gst1394probe.lo `test -f 'gst1394probe.c' || echo '$(srcdir)/'`gst1394probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gst1394probe.Tpo $(DEPDIR)/libgst1394_la-gst1394probe.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst1394probe.c' object='libgst1394_la-gst1394probe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gst1394probe.lo `test -f 'gst1394probe.c' || echo '$(srcdir)/'`gst1394probe.c libgst1394_la-gstdv1394src.lo: gstdv1394src.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gstdv1394src.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gstdv1394src.Tpo -c -o libgst1394_la-gstdv1394src.lo `test -f 'gstdv1394src.c' || echo '$(srcdir)/'`gstdv1394src.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gstdv1394src.Tpo $(DEPDIR)/libgst1394_la-gstdv1394src.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdv1394src.c' object='libgst1394_la-gstdv1394src.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gstdv1394src.lo `test -f 'gstdv1394src.c' || echo '$(srcdir)/'`gstdv1394src.c libgst1394_la-gsthdv1394src.lo: gsthdv1394src.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gsthdv1394src.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gsthdv1394src.Tpo -c -o libgst1394_la-gsthdv1394src.lo `test -f 'gsthdv1394src.c' || echo '$(srcdir)/'`gsthdv1394src.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gsthdv1394src.Tpo $(DEPDIR)/libgst1394_la-gsthdv1394src.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsthdv1394src.c' object='libgst1394_la-gsthdv1394src.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gsthdv1394src.lo `test -f 'gsthdv1394src.c' || echo '$(srcdir)/'`gsthdv1394src.c libgst1394_la-gst1394clock.lo: gst1394clock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -MT libgst1394_la-gst1394clock.lo -MD -MP -MF $(DEPDIR)/libgst1394_la-gst1394clock.Tpo -c -o libgst1394_la-gst1394clock.lo `test -f 'gst1394clock.c' || echo '$(srcdir)/'`gst1394clock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgst1394_la-gst1394clock.Tpo $(DEPDIR)/libgst1394_la-gst1394clock.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst1394clock.c' object='libgst1394_la-gst1394clock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgst1394_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgst1394_la_CFLAGS) $(CFLAGS) -c -o libgst1394_la-gst1394clock.lo `test -f 'gst1394clock.c' || echo '$(srcdir)/'`gst1394clock.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/aalib/0000755000175000017500000000000011720565321013731 500000000000000gst-plugins-good-0.10.31/ext/aalib/Makefile.am0000644000175000017500000000056611671175352015722 00000000000000plugin_LTLIBRARIES = libgstaasink.la libgstaasink_la_SOURCES = gstaasink.c libgstaasink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AALIB_CFLAGS) libgstaasink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(AALIB_LIBS) libgstaasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaasink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstaasink.h gst-plugins-good-0.10.31/ext/aalib/gstaasink.h0000644000175000017500000000407111671175352016016 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_AASINK_H__ #define __GST_AASINK_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define GST_TYPE_AASINK \ (gst_aasink_get_type()) #define GST_AASINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AASINK,GstAASink)) #define GST_AASINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AASINK,GstAASinkClass)) #define GST_IS_AASINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AASINK)) #define GST_IS_AASINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AASINK)) typedef struct _GstAASink GstAASink; typedef struct _GstAASinkClass GstAASinkClass; struct _GstAASink { GstBaseSink parent; gulong format; gint width, height; gint frames_displayed; guint64 frame_time; aa_context *context; struct aa_hardware_params ascii_surf; struct aa_renderparams ascii_parms; aa_palette palette; gint aa_driver; }; struct _GstAASinkClass { GstBaseSinkClass parent_class; /* signals */ void (*frame_displayed) (GstElement *element); void (*have_size) (GstElement *element, guint width, guint height); }; GType gst_aasink_get_type(void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __GST_AASINKE_H__ */ gst-plugins-good-0.10.31/ext/aalib/gstaasink.c0000644000175000017500000004047311677341654016025 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-aasink * @see_also: #GstCACASink * * Displays video as b/w ascii art. * * * Example launch line * |[ * gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! aasink * ]| This pipeline renders a video to ascii art into a separate window. * |[ * gst-launch filesrc location=test.avi ! decodebin ! ffmpegcolorspace ! aasink driver=curses * ]| This pipeline renders a video to ascii art into the current terminal. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstaasink.h" #include /* aasink signals and args */ enum { SIGNAL_FRAME_DISPLAYED, SIGNAL_HAVE_SIZE, LAST_SIGNAL }; enum { ARG_0, ARG_WIDTH, ARG_HEIGHT, ARG_DRIVER, ARG_DITHER, ARG_BRIGHTNESS, ARG_CONTRAST, ARG_GAMMA, ARG_INVERSION, ARG_RANDOMVAL, ARG_FRAMES_DISPLAYED, ARG_FRAME_TIME }; static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static void gst_aasink_base_init (gpointer g_class); static void gst_aasink_class_init (GstAASinkClass * klass); static void gst_aasink_init (GstAASink * aasink); static gboolean gst_aasink_setcaps (GstBaseSink * pad, GstCaps * caps); static void gst_aasink_get_times (GstBaseSink * sink, GstBuffer * buffer, GstClockTime * start, GstClockTime * end); static GstFlowReturn gst_aasink_render (GstBaseSink * basesink, GstBuffer * buffer); static void gst_aasink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_aasink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_aasink_change_state (GstElement * element, GstStateChange transition); static GstElementClass *parent_class = NULL; static guint gst_aasink_signals[LAST_SIGNAL] = { 0 }; GType gst_aasink_get_type (void) { static GType aasink_type = 0; if (!aasink_type) { static const GTypeInfo aasink_info = { sizeof (GstAASinkClass), gst_aasink_base_init, NULL, (GClassInitFunc) gst_aasink_class_init, NULL, NULL, sizeof (GstAASink), 0, (GInstanceInitFunc) gst_aasink_init, }; aasink_type = g_type_register_static (GST_TYPE_BASE_SINK, "GstAASink", &aasink_info, 0); } return aasink_type; } #define GST_TYPE_AADRIVERS (gst_aasink_drivers_get_type()) static GType gst_aasink_drivers_get_type (void) { static GType driver_type = 0; if (!driver_type) { GEnumValue *drivers; const struct aa_driver *driver; gint n_drivers; gint i; for (n_drivers = 0; aa_drivers[n_drivers]; n_drivers++) { /* count number of drivers */ } drivers = g_new0 (GEnumValue, n_drivers + 1); for (i = 0; i < n_drivers; i++) { driver = aa_drivers[i]; drivers[i].value = i; drivers[i].value_name = g_strdup (driver->name); drivers[i].value_nick = g_utf8_strdown (driver->shortname, -1); } drivers[i].value = 0; drivers[i].value_name = NULL; drivers[i].value_nick = NULL; driver_type = g_enum_register_static ("GstAASinkDrivers", drivers); } return driver_type; } #define GST_TYPE_AADITHER (gst_aasink_dither_get_type()) static GType gst_aasink_dither_get_type (void) { static GType dither_type = 0; if (!dither_type) { GEnumValue *ditherers; gint n_ditherers; gint i; for (n_ditherers = 0; aa_dithernames[n_ditherers]; n_ditherers++) { /* count number of ditherers */ } ditherers = g_new0 (GEnumValue, n_ditherers + 1); for (i = 0; i < n_ditherers; i++) { ditherers[i].value = i; ditherers[i].value_name = g_strdup (aa_dithernames[i]); ditherers[i].value_nick = g_strdelimit (g_strdup (aa_dithernames[i]), " _", '-'); } ditherers[i].value = 0; ditherers[i].value_name = NULL; ditherers[i].value_nick = NULL; dither_type = g_enum_register_static ("GstAASinkDitherers", ditherers); } return dither_type; } static void gst_aasink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "ASCII art video sink", "Sink/Video", "An ASCII art videosink", "Wim Taymans "); } static void gst_aasink_class_init (GstAASinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_aasink_set_property; gobject_class->get_property = gst_aasink_get_property; /* FIXME: add long property descriptions */ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, g_param_spec_int ("width", "width", "width", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT, g_param_spec_int ("height", "height", "height", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DRIVER, g_param_spec_enum ("driver", "driver", "driver", GST_TYPE_AADRIVERS, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DITHER, g_param_spec_enum ("dither", "dither", "dither", GST_TYPE_AADITHER, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BRIGHTNESS, g_param_spec_int ("brightness", "brightness", "brightness", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CONTRAST, g_param_spec_int ("contrast", "contrast", "contrast", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GAMMA, g_param_spec_float ("gamma", "gamma", "gamma", 0.0, 5.0, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_INVERSION, g_param_spec_boolean ("inversion", "inversion", "inversion", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RANDOMVAL, g_param_spec_int ("randomval", "randomval", "randomval", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAMES_DISPLAYED, g_param_spec_int ("frames-displayed", "frames displayed", "frames displayed", G_MININT, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAME_TIME, g_param_spec_int ("frame-time", "frame time", "frame time", G_MININT, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); gst_aasink_signals[SIGNAL_FRAME_DISPLAYED] = g_signal_new ("frame-displayed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAASinkClass, frame_displayed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_aasink_signals[SIGNAL_HAVE_SIZE] = g_signal_new ("have-size", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAASinkClass, have_size), NULL, NULL, gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_aasink_change_state); gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_aasink_setcaps); gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_aasink_get_times); gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_aasink_render); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_aasink_render); } static void gst_aasink_fixate (GstPad * pad, GstCaps * caps) { GstStructure *structure; structure = gst_caps_get_structure (caps, 0); gst_structure_fixate_field_nearest_int (structure, "width", 320); gst_structure_fixate_field_nearest_int (structure, "height", 240); gst_structure_fixate_field_nearest_fraction (structure, "framerate", 30, 1); } static gboolean gst_aasink_setcaps (GstBaseSink * basesink, GstCaps * caps) { GstAASink *aasink; GstStructure *structure; aasink = GST_AASINK (basesink); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &aasink->width); gst_structure_get_int (structure, "height", &aasink->height); /* FIXME aasink->format is never set */ g_print ("%d %d\n", aasink->width, aasink->height); GST_DEBUG ("aasink: setting %08lx (%" GST_FOURCC_FORMAT ")", aasink->format, GST_FOURCC_ARGS (aasink->format)); g_signal_emit (G_OBJECT (aasink), gst_aasink_signals[SIGNAL_HAVE_SIZE], 0, aasink->width, aasink->height); return TRUE; } static void gst_aasink_init (GstAASink * aasink) { GstPad *pad; pad = GST_BASE_SINK_PAD (aasink); gst_pad_set_fixatecaps_function (pad, gst_aasink_fixate); memcpy (&aasink->ascii_surf, &aa_defparams, sizeof (struct aa_hardware_params)); aasink->ascii_parms.bright = 0; aasink->ascii_parms.contrast = 16; aasink->ascii_parms.gamma = 1.0; aasink->ascii_parms.dither = 0; aasink->ascii_parms.inversion = 0; aasink->ascii_parms.randomval = 0; aasink->aa_driver = 0; aasink->width = -1; aasink->height = -1; } static void gst_aasink_scale (GstAASink * aasink, guchar * src, guchar * dest, gint sw, gint sh, gint dw, gint dh) { gint ypos, yinc, y; gint xpos, xinc, x; g_return_if_fail ((dw != 0) && (dh != 0)); ypos = 0x10000; yinc = (sh << 16) / dh; xinc = (sw << 16) / dw; for (y = dh; y; y--) { while (ypos > 0x10000) { ypos -= 0x10000; src += sw; } xpos = 0x10000; { guchar *destp = dest; guchar *srcp = src; for (x = dw; x; x--) { while (xpos >= 0x10000L) { srcp++; xpos -= 0x10000L; } *destp++ = *srcp; xpos += xinc; } } dest += dw; ypos += yinc; } } static void gst_aasink_get_times (GstBaseSink * sink, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { *start = GST_BUFFER_TIMESTAMP (buffer); *end = *start + GST_BUFFER_DURATION (buffer); } static GstFlowReturn gst_aasink_render (GstBaseSink * basesink, GstBuffer * buffer) { GstAASink *aasink; aasink = GST_AASINK (basesink); GST_DEBUG ("render"); gst_aasink_scale (aasink, GST_BUFFER_DATA (buffer), /* src */ aa_image (aasink->context), /* dest */ aasink->width, /* sw */ aasink->height, /* sh */ aa_imgwidth (aasink->context), /* dw */ aa_imgheight (aasink->context)); /* dh */ aa_render (aasink->context, &aasink->ascii_parms, 0, 0, aa_imgwidth (aasink->context), aa_imgheight (aasink->context)); aa_flush (aasink->context); aa_getevent (aasink->context, FALSE); return GST_FLOW_OK; } static void gst_aasink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAASink *aasink; aasink = GST_AASINK (object); switch (prop_id) { case ARG_WIDTH: aasink->ascii_surf.width = g_value_get_int (value); break; case ARG_HEIGHT: aasink->ascii_surf.height = g_value_get_int (value); break; case ARG_DRIVER:{ aasink->aa_driver = g_value_get_enum (value); break; } case ARG_DITHER:{ aasink->ascii_parms.dither = g_value_get_enum (value); break; } case ARG_BRIGHTNESS:{ aasink->ascii_parms.bright = g_value_get_int (value); break; } case ARG_CONTRAST:{ aasink->ascii_parms.contrast = g_value_get_int (value); break; } case ARG_GAMMA:{ aasink->ascii_parms.gamma = g_value_get_float (value); break; } case ARG_INVERSION:{ aasink->ascii_parms.inversion = g_value_get_boolean (value); break; } case ARG_RANDOMVAL:{ aasink->ascii_parms.randomval = g_value_get_int (value); break; } default: break; } } static void gst_aasink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAASink *aasink; aasink = GST_AASINK (object); switch (prop_id) { case ARG_WIDTH:{ g_value_set_int (value, aasink->ascii_surf.width); break; } case ARG_HEIGHT:{ g_value_set_int (value, aasink->ascii_surf.height); break; } case ARG_DRIVER:{ g_value_set_enum (value, aasink->aa_driver); break; } case ARG_DITHER:{ g_value_set_enum (value, aasink->ascii_parms.dither); break; } case ARG_BRIGHTNESS:{ g_value_set_int (value, aasink->ascii_parms.bright); break; } case ARG_CONTRAST:{ g_value_set_int (value, aasink->ascii_parms.contrast); break; } case ARG_GAMMA:{ g_value_set_float (value, aasink->ascii_parms.gamma); break; } case ARG_INVERSION:{ g_value_set_boolean (value, aasink->ascii_parms.inversion); break; } case ARG_RANDOMVAL:{ g_value_set_int (value, aasink->ascii_parms.randomval); break; } case ARG_FRAMES_DISPLAYED:{ g_value_set_int (value, aasink->frames_displayed); break; } case ARG_FRAME_TIME:{ g_value_set_int (value, aasink->frame_time / 1000000); break; } default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } } static gboolean gst_aasink_open (GstAASink * aasink) { if (!aasink->context) { aa_recommendhidisplay (aa_drivers[aasink->aa_driver]->shortname); aasink->context = aa_autoinit (&aasink->ascii_surf); if (aasink->context == NULL) { GST_ELEMENT_ERROR (GST_ELEMENT (aasink), LIBRARY, TOO_LAZY, (NULL), ("error opening aalib context")); return FALSE; } aa_autoinitkbd (aasink->context, 0); aa_resizehandler (aasink->context, (void *) aa_resize); } return TRUE; } static gboolean gst_aasink_close (GstAASink * aasink) { aa_close (aasink->context); aasink->context = NULL; return TRUE; } static GstStateChangeReturn gst_aasink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!gst_aasink_open (GST_AASINK (element))) goto open_failed; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: gst_aasink_close (GST_AASINK (element)); break; default: break; } return ret; open_failed: { return GST_STATE_CHANGE_FAILURE; } } static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "aasink", GST_RANK_NONE, GST_TYPE_AASINK)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "aasink", "ASCII Art video sink", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/ext/aalib/Makefile.in0000644000175000017500000006533011720560225015723 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/aalib DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstaasink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstaasink_la_OBJECTS = libgstaasink_la-gstaasink.lo libgstaasink_la_OBJECTS = $(am_libgstaasink_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstaasink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstaasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstaasink_la_CFLAGS) $(CFLAGS) \ $(libgstaasink_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstaasink_la_SOURCES) DIST_SOURCES = $(libgstaasink_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstaasink.la libgstaasink_la_SOURCES = gstaasink.c libgstaasink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AALIB_CFLAGS) libgstaasink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(AALIB_LIBS) libgstaasink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaasink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstaasink.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/aalib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/aalib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstaasink.la: $(libgstaasink_la_OBJECTS) $(libgstaasink_la_DEPENDENCIES) $(EXTRA_libgstaasink_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstaasink_la_LINK) -rpath $(plugindir) $(libgstaasink_la_OBJECTS) $(libgstaasink_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaasink_la-gstaasink.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstaasink_la-gstaasink.lo: gstaasink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaasink_la_CFLAGS) $(CFLAGS) -MT libgstaasink_la-gstaasink.lo -MD -MP -MF $(DEPDIR)/libgstaasink_la-gstaasink.Tpo -c -o libgstaasink_la-gstaasink.lo `test -f 'gstaasink.c' || echo '$(srcdir)/'`gstaasink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaasink_la-gstaasink.Tpo $(DEPDIR)/libgstaasink_la-gstaasink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaasink.c' object='libgstaasink_la-gstaasink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaasink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaasink_la_CFLAGS) $(CFLAGS) -c -o libgstaasink_la-gstaasink.lo `test -f 'gstaasink.c' || echo '$(srcdir)/'`gstaasink.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/annodex/0000755000175000017500000000000011720565321014315 500000000000000gst-plugins-good-0.10.31/ext/annodex/gstcmmltag.c0000644000175000017500000004442511671175352016562 00000000000000/* * gstcmmltags.c - GStreamer CMML tag support * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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 #include "gstcmmlparser.h" #include "gstcmmltag.h" #include "gstannodex.h" enum { ARG_0, GST_CMML_TAG_STREAM_TIMEBASE, GST_CMML_TAG_STREAM_UTC, GST_CMML_TAG_STREAM_IMPORTS, GST_CMML_TAG_HEAD_TITLE, GST_CMML_TAG_HEAD_BASE, GST_CMML_TAG_HEAD_META, GST_CMML_TAG_CLIP_EMPTY, GST_CMML_TAG_CLIP_ID, GST_CMML_TAG_CLIP_TRACK, GST_CMML_TAG_CLIP_START_TIME, GST_CMML_TAG_CLIP_END_TIME, GST_CMML_TAG_CLIP_ANCHOR_HREF, GST_CMML_TAG_CLIP_ANCHOR_TEXT, GST_CMML_TAG_CLIP_IMG_SRC, GST_CMML_TAG_CLIP_IMG_ALT, GST_CMML_TAG_CLIP_DESC_TEXT, GST_CMML_TAG_CLIP_META, }; G_DEFINE_TYPE (GstCmmlTagStream, gst_cmml_tag_stream, G_TYPE_OBJECT); static void gst_cmml_tag_stream_finalize (GObject * object); static void gst_cmml_tag_stream_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); static void gst_cmml_tag_stream_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec); static void gst_cmml_tag_stream_value_from_string_value (const GValue * src, GValue * dest); G_DEFINE_TYPE (GstCmmlTagHead, gst_cmml_tag_head, G_TYPE_OBJECT); static void gst_cmml_tag_head_finalize (GObject * object); static void gst_cmml_tag_head_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); static void gst_cmml_tag_head_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec); static void gst_cmml_tag_head_value_from_string_value (const GValue * src, GValue * dest); G_DEFINE_TYPE (GstCmmlTagClip, gst_cmml_tag_clip, G_TYPE_OBJECT); static void gst_cmml_tag_clip_finalize (GObject * object); static void gst_cmml_tag_clip_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); static void gst_cmml_tag_clip_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec); static void gst_cmml_tag_clip_value_from_string_value (const GValue * src, GValue * dest); static void set_object_on_value (GObject * object, GValue * dest); static const gchar default_preamble[] = ""; /* Stream tag */ static void gst_cmml_tag_stream_class_init (GstCmmlTagStreamClass * stream_class) { GObjectClass *klass = G_OBJECT_CLASS (stream_class); klass->set_property = gst_cmml_tag_stream_set_property; klass->get_property = gst_cmml_tag_stream_get_property; klass->finalize = gst_cmml_tag_stream_finalize; g_object_class_install_property (klass, GST_CMML_TAG_STREAM_TIMEBASE, g_param_spec_string ("base-time", "Base time", "Playback time (in seconds) of the first data packet", "0", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_STREAM_UTC, g_param_spec_string ("calendar-base-time", "Calendar base time", "Date and wall-clock time (expressed as UTC time in the format " "YYYYMMDDTHHMMSS.sssZ) associated with the base-time", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_STREAM_IMPORTS, g_param_spec_value_array ("input-streams", "Input streams", "List of input streams that compose this bitstream", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_CMML_TAG_STREAM, gst_cmml_tag_stream_value_from_string_value); } static void gst_cmml_tag_stream_init (GstCmmlTagStream * stream) { } static void gst_cmml_tag_stream_finalize (GObject * object) { GstCmmlTagStream *stream = GST_CMML_TAG_STREAM (object); g_free (stream->timebase); g_free (stream->utc); if (stream->imports) g_value_array_free (stream->imports); if (G_OBJECT_CLASS (gst_cmml_tag_stream_parent_class)->finalize) G_OBJECT_CLASS (gst_cmml_tag_stream_parent_class)->finalize (object); } static void gst_cmml_tag_stream_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstCmmlTagStream *stream = GST_CMML_TAG_STREAM (object); switch (property_id) { case GST_CMML_TAG_STREAM_TIMEBASE: g_free (stream->timebase); stream->timebase = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_STREAM_UTC: g_free (stream->utc); stream->utc = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_STREAM_IMPORTS: { GValueArray *va = g_value_get_boxed (value); if (stream->imports) g_value_array_free (stream->imports); stream->imports = va != NULL ? g_value_array_copy (va) : NULL; break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void gst_cmml_tag_stream_value_from_string_value (const GValue * src, GValue * dest) { GstCmmlParser *parser; const gchar *str; guint size; parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); parser->user_data = dest; parser->stream_callback = (GstCmmlParserStreamCallback) set_object_on_value; gst_cmml_parser_parse_chunk (parser, default_preamble, strlen (default_preamble), NULL); str = g_value_get_string (src); size = strlen (str); gst_cmml_parser_parse_chunk (parser, str, size, NULL); gst_cmml_parser_free (parser); } static void gst_cmml_tag_stream_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstCmmlTagStream *stream = GST_CMML_TAG_STREAM (object); switch (property_id) { case GST_CMML_TAG_STREAM_TIMEBASE: g_value_set_string (value, (gchar *) stream->timebase); break; case GST_CMML_TAG_STREAM_UTC: g_value_set_string (value, (gchar *) stream->utc); break; case GST_CMML_TAG_STREAM_IMPORTS: g_value_set_boxed (value, stream->imports); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } /* Head tag */ static void gst_cmml_tag_head_class_init (GstCmmlTagHeadClass * head_class) { GObjectClass *klass = G_OBJECT_CLASS (head_class); klass->set_property = gst_cmml_tag_head_set_property; klass->get_property = gst_cmml_tag_head_get_property; klass->finalize = gst_cmml_tag_head_finalize; g_object_class_install_property (klass, GST_CMML_TAG_HEAD_TITLE, g_param_spec_string ("title", "Title", "Title of the bitstream", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_HEAD_BASE, g_param_spec_string ("base-uri", "Base URI", "Base URI of the bitstream. All relative URIs are relative to this", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_HEAD_META, g_param_spec_value_array ("meta", "Meta annotations", "Meta annotations for the complete Annodex bitstream", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_CMML_TAG_HEAD, gst_cmml_tag_head_value_from_string_value); } static void gst_cmml_tag_head_init (GstCmmlTagHead * head) { } static void gst_cmml_tag_head_finalize (GObject * object) { GstCmmlTagHead *head = GST_CMML_TAG_HEAD (object); g_free (head->title); g_free (head->base); if (head->meta) g_value_array_free (head->meta); if (G_OBJECT_CLASS (gst_cmml_tag_head_parent_class)->finalize) G_OBJECT_CLASS (gst_cmml_tag_head_parent_class)->finalize (object); } static void gst_cmml_tag_head_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstCmmlTagHead *head = GST_CMML_TAG_HEAD (object); switch (property_id) { case GST_CMML_TAG_HEAD_TITLE: g_free (head->title); head->title = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_HEAD_BASE: g_free (head->base); head->base = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_HEAD_META: { GValueArray *va = g_value_get_boxed (value); if (head->meta) g_value_array_free (head->meta); head->meta = va != NULL ? g_value_array_copy (va) : NULL; break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void gst_cmml_tag_head_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstCmmlTagHead *head = GST_CMML_TAG_HEAD (object); switch (property_id) { case GST_CMML_TAG_HEAD_TITLE: g_value_set_string (value, (gchar *) head->title); break; case GST_CMML_TAG_HEAD_BASE: g_value_set_string (value, (gchar *) head->base); break; case GST_CMML_TAG_HEAD_META: g_value_set_boxed (value, head->meta); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void gst_cmml_tag_head_value_from_string_value (const GValue * src, GValue * dest) { GstCmmlParser *parser; const gchar *str; guint size; parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); parser->user_data = dest; parser->head_callback = (GstCmmlParserHeadCallback) set_object_on_value; gst_cmml_parser_parse_chunk (parser, default_preamble, strlen (default_preamble), NULL); str = g_value_get_string (src); size = strlen (str); gst_cmml_parser_parse_chunk (parser, str, size, NULL); gst_cmml_parser_free (parser); } /* Clip tag */ static void gst_cmml_tag_clip_class_init (GstCmmlTagClipClass * clip_class) { GObjectClass *klass = G_OBJECT_CLASS (clip_class); klass->set_property = gst_cmml_tag_clip_set_property; klass->get_property = gst_cmml_tag_clip_get_property; klass->finalize = gst_cmml_tag_clip_finalize; g_object_class_install_property (klass, GST_CMML_TAG_CLIP_EMPTY, g_param_spec_boolean ("empty", "Empty clip flag", "An empty clip only marks the end of the previous clip", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_ID, g_param_spec_string ("id", "Clip id", "Id of the clip", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_TRACK, g_param_spec_string ("track", "Track number", "The track this clip belongs to", "default", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_START_TIME, g_param_spec_uint64 ("start-time", "Start time", "The start time (in seconds) of the clip", 0, G_MAXUINT64, GST_CLOCK_TIME_NONE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_END_TIME, g_param_spec_uint64 ("end-time", "End time", "The end time (in seconds) of the clip (only set if extract-mode=true)", 0, G_MAXUINT64, GST_CLOCK_TIME_NONE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_ANCHOR_HREF, g_param_spec_string ("anchor-uri", "Anchor URI", "The location of a Web resource closely connected to the clip", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_ANCHOR_TEXT, g_param_spec_string ("anchor-text", "Anchor text", "A short description of the resource pointed by anchor-uri", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_IMG_SRC, g_param_spec_string ("img-uri", "Image URI", "The URI of a representative image for the clip", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_IMG_ALT, g_param_spec_string ("img-alt", "Image alternative text", "Alternative text to be displayed instead of the image " "specified in img-uri", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_DESC_TEXT, g_param_spec_string ("description", "Description", "A textual description of the content of the clip", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_TAG_CLIP_META, g_param_spec_value_array ("meta", "Meta annotations", "Meta annotations for the clip", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_CMML_TAG_CLIP, gst_cmml_tag_clip_value_from_string_value); } static void gst_cmml_tag_clip_init (GstCmmlTagClip * clip) { } static void gst_cmml_tag_clip_finalize (GObject * object) { GstCmmlTagClip *clip = GST_CMML_TAG_CLIP (object); g_free (clip->id); g_free (clip->track); g_free (clip->anchor_href); g_free (clip->anchor_text); g_free (clip->img_src); g_free (clip->img_alt); g_free (clip->desc_text); if (clip->meta) g_value_array_free (clip->meta); if (G_OBJECT_CLASS (gst_cmml_tag_clip_parent_class)->finalize) G_OBJECT_CLASS (gst_cmml_tag_clip_parent_class)->finalize (object); } static void gst_cmml_tag_clip_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstCmmlTagClip *clip = GST_CMML_TAG_CLIP (object); switch (property_id) { case GST_CMML_TAG_CLIP_EMPTY: clip->empty = g_value_get_boolean (value); break; case GST_CMML_TAG_CLIP_ID: g_free (clip->id); clip->id = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_TRACK: g_free (clip->track); clip->track = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_START_TIME: clip->start_time = g_value_get_uint64 (value); break; case GST_CMML_TAG_CLIP_END_TIME: clip->end_time = g_value_get_uint64 (value); break; case GST_CMML_TAG_CLIP_ANCHOR_HREF: g_free (clip->anchor_href); clip->anchor_href = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_ANCHOR_TEXT: g_free (clip->anchor_text); clip->anchor_text = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_IMG_SRC: g_free (clip->img_src); clip->img_src = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_IMG_ALT: g_free (clip->img_alt); clip->img_alt = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_DESC_TEXT: g_free (clip->desc_text); clip->desc_text = (guchar *) g_value_dup_string (value); break; case GST_CMML_TAG_CLIP_META: { GValueArray *va = (GValueArray *) g_value_get_boxed (value); if (clip->meta) g_value_array_free (clip->meta); clip->meta = va != NULL ? g_value_array_copy (va) : NULL; break; } } } static void gst_cmml_tag_clip_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstCmmlTagClip *clip = GST_CMML_TAG_CLIP (object); switch (property_id) { case GST_CMML_TAG_CLIP_EMPTY: g_value_set_boolean (value, clip->empty); break; case GST_CMML_TAG_CLIP_ID: g_value_set_string (value, (gchar *) clip->id); break; case GST_CMML_TAG_CLIP_TRACK: g_value_set_string (value, (gchar *) clip->track); break; case GST_CMML_TAG_CLIP_START_TIME: g_value_set_uint64 (value, clip->start_time); break; case GST_CMML_TAG_CLIP_END_TIME: g_value_set_uint64 (value, clip->end_time); break; case GST_CMML_TAG_CLIP_ANCHOR_HREF: g_value_set_string (value, (gchar *) clip->anchor_href); break; case GST_CMML_TAG_CLIP_ANCHOR_TEXT: g_value_set_string (value, (gchar *) clip->anchor_text); break; case GST_CMML_TAG_CLIP_IMG_SRC: g_value_set_string (value, (gchar *) clip->img_src); break; case GST_CMML_TAG_CLIP_IMG_ALT: g_value_set_string (value, (gchar *) clip->img_alt); break; case GST_CMML_TAG_CLIP_DESC_TEXT: g_value_set_string (value, (gchar *) clip->desc_text); break; case GST_CMML_TAG_CLIP_META: g_value_set_boxed (value, clip->meta); break; } } static void gst_cmml_tag_clip_value_from_string_value (const GValue * src, GValue * dest) { GstCmmlParser *parser; const gchar *str; guint size; parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); parser->user_data = dest; parser->clip_callback = (GstCmmlParserClipCallback) set_object_on_value; gst_cmml_parser_parse_chunk (parser, default_preamble, strlen (default_preamble), NULL); str = g_value_get_string (src); size = strlen (str); gst_cmml_parser_parse_chunk (parser, str, size, NULL); gst_cmml_parser_free (parser); } static void set_object_on_value (GObject * tag, GValue * dest) { g_value_take_object (dest, tag); } gst-plugins-good-0.10.31/ext/annodex/gstcmmlenc.h0000644000175000017500000000431011671175352016546 00000000000000/* * gstcmmlenc.h - GStreamer CMML encoder * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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_CMML_ENC_H__ #define __GST_CMML_ENC_H__ #define GST_TYPE_CMML_ENC (gst_cmml_enc_get_type()) #define GST_CMML_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_ENC, GstCmmlEnc)) #define GST_CMML_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_ENC, GstCmmlEncClass)) #define GST_IS_CMML_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_CMML_ENC)) #define GST_IS_CMML_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CMML_ENC)) #define GST_CMML_ENC_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CMML_ENC, GstCmmlEncClass)) #include #include #include "gstcmmlparser.h" #include "gstcmmlutils.h" typedef struct _GstCmmlEnc GstCmmlEnc; typedef struct _GstCmmlEncClass GstCmmlEncClass; struct _GstCmmlEnc { GstElement element; GstPad *sinkpad; GstPad *srcpad; gint16 major; gint16 minor; gint64 granulerate_n; gint64 granulerate_d; gint8 granuleshift; GstCmmlParser *parser; gboolean streaming; GHashTable *tracks; GstFlowReturn flow_return; guchar *preamble; gboolean sent_headers; gboolean sent_eos; }; struct _GstCmmlEncClass { GstElementClass parent_class; }; GType gst_cmml_enc_get_type (void); gboolean gst_cmml_enc_plugin_init (GstPlugin * plugin); #endif /* __GST_CMML_ENC_H__ */ gst-plugins-good-0.10.31/ext/annodex/Makefile.am0000644000175000017500000000112411671175352016275 00000000000000plugin_LTLIBRARIES = libgstannodex.la libgstannodex_la_SOURCES = \ gstannodex.c \ gstcmmlutils.c \ gstcmmldec.c \ gstcmmlenc.c \ gstcmmltag.c \ gstcmmlparser.c libgstannodex_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(ANNODEX_CFLAGS) libgstannodex_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ $(GST_LIBS) $(ANNODEX_LIBS) $(LIBM) libgstannodex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstannodex_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstannodex.h gstcmmlutils.h gstcmmltag.h gstcmmlparser.h \ gstcmmldec.h gstcmmlenc.h gst-plugins-good-0.10.31/ext/annodex/gstcmmlutils.h0000644000175000017500000000425411671175352017150 00000000000000/* * gstcmmlutils.h - GStreamer CMML utility functions * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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_CMML_CLOCK_TIME_H__ #define __GST_CMML_CLOCK_TIME_H__ #include #include "gstcmmltag.h" /* time utils */ GstClockTime gst_cmml_clock_time_from_npt (const gchar * time); GstClockTime gst_cmml_clock_time_from_smpte (const gchar * time); gchar * gst_cmml_clock_time_to_npt (const GstClockTime time); gint64 gst_cmml_clock_time_to_granule (GstClockTime prev_time, GstClockTime current_time, gint64 granulerate_n, gint64 granulerate_d, guint8 granuleshift); /* tracklist */ GHashTable * gst_cmml_track_list_new (void); void gst_cmml_track_list_destroy (GHashTable * tracks); void gst_cmml_track_list_add_clip (GHashTable * tracks, GstCmmlTagClip * clip); gboolean gst_cmml_track_list_del_clip (GHashTable * tracks, GstCmmlTagClip * clip); gboolean gst_cmml_track_list_has_clip (GHashTable * tracks, GstCmmlTagClip * clip); GstCmmlTagClip * gst_cmml_track_list_get_track_last_clip (GHashTable * tracks, const gchar * track_name); GList * gst_cmml_track_list_get_track_clips (GHashTable * tracks, const gchar * track_name); GList * gst_cmml_track_list_get_clips (GHashTable * tracks); void gst_cmml_track_list_set_track_data (GHashTable * tracks, gpointer data); gpointer gst_cmml_track_list_get_track_data (GHashTable * tracks); #endif /* __GST_CMML_CLOCK_TIME_H__ */ gst-plugins-good-0.10.31/ext/annodex/gstcmmlparser.c0000644000175000017500000004457111671175352017305 00000000000000/* * gstcmmlparser.c - GStreamer CMML document parser * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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 #include #include #include "gstcmmlparser.h" #include "gstannodex.h" #include "gstcmmlutils.h" GST_DEBUG_CATEGORY_STATIC (cmmlparser); #define GST_CAT_DEFAULT cmmlparser static void gst_cmml_parser_generic_error (void *ctx, const char *msg, ...); static xmlNodePtr gst_cmml_parser_new_node (GstCmmlParser * parser, const gchar * name, ...); static void gst_cmml_parser_parse_start_element_ns (xmlParserCtxt * ctxt, const xmlChar * name, const xmlChar * prefix, const xmlChar * URI, int nb_preferences, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted, const xmlChar ** attributes); static void gst_cmml_parser_parse_end_element_ns (xmlParserCtxt * ctxt, const xmlChar * name, const xmlChar * prefix, const xmlChar * URI); static void gst_cmml_parser_parse_processing_instruction (xmlParserCtxtPtr ctxt, const xmlChar * target, const xmlChar * data); static void gst_cmml_parser_meta_to_string (GstCmmlParser * parser, xmlNodePtr parent, GValueArray * meta); /* initialize the parser */ void gst_cmml_parser_init (void) { GST_DEBUG_CATEGORY_INIT (cmmlparser, "cmmlparser", 0, "annodex CMML parser"); xmlGenericError = gst_cmml_parser_generic_error; } /* create a new CMML parser */ GstCmmlParser * gst_cmml_parser_new (GstCmmlParserMode mode) { GstCmmlParser *parser = g_malloc (sizeof (GstCmmlParser)); parser->mode = mode; parser->context = xmlCreatePushParserCtxt (NULL, NULL, NULL, 0, "cmml-bitstream"); xmlCtxtUseOptions (parser->context, XML_PARSE_NONET | XML_PARSE_NOERROR); parser->context->_private = parser; parser->context->sax->startElementNs = (startElementNsSAX2Func) gst_cmml_parser_parse_start_element_ns; parser->context->sax->endElementNs = (endElementNsSAX2Func) gst_cmml_parser_parse_end_element_ns; parser->context->sax->processingInstruction = (processingInstructionSAXFunc) gst_cmml_parser_parse_processing_instruction; parser->preamble_callback = NULL; parser->cmml_end_callback = NULL; parser->stream_callback = NULL; parser->head_callback = NULL; parser->clip_callback = NULL; parser->user_data = NULL; return parser; } /* free a CMML parser instance */ void gst_cmml_parser_free (GstCmmlParser * parser) { if (parser) { xmlFreeDoc (parser->context->myDoc); xmlFreeParserCtxt (parser->context); g_free (parser); } } /* parse an xml chunk * * returns false if the xml is invalid */ gboolean gst_cmml_parser_parse_chunk (GstCmmlParser * parser, const gchar * data, guint size, GError ** err) { gint xmlres; xmlres = xmlParseChunk (parser->context, data, size, 0); if (xmlres != XML_ERR_OK) { xmlErrorPtr xml_error = xmlCtxtGetLastError (parser->context); GST_DEBUG ("Error occurred decoding chunk %s", data); g_set_error (err, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED, "%s", xml_error->message); return FALSE; } return TRUE; } /* convert an xmlNodePtr to a string */ static guchar * gst_cmml_parser_node_to_string (GstCmmlParser * parser, xmlNodePtr node) { xmlBufferPtr xml_buffer; xmlDocPtr doc; guchar *str; if (parser) doc = parser->context->myDoc; else doc = NULL; xml_buffer = xmlBufferCreate (); xmlNodeDump (xml_buffer, doc, node, 0, 0); str = xmlStrndup (xml_buffer->content, xml_buffer->use); xmlBufferFree (xml_buffer); return str; } guchar * gst_cmml_parser_tag_stream_to_string (GstCmmlParser * parser, GstCmmlTagStream * stream) { xmlNodePtr node; xmlNodePtr import; guchar *ret; node = gst_cmml_parser_new_node (parser, "stream", NULL); if (stream->timebase) xmlSetProp (node, (xmlChar *) "timebase", stream->timebase); if (stream->utc) xmlSetProp (node, (xmlChar *) "utc", stream->utc); if (stream->imports) { gint i; GValue *val; for (i = 0; i < stream->imports->n_values; ++i) { val = g_value_array_get_nth (stream->imports, i); import = gst_cmml_parser_new_node (parser, "import", "src", g_value_get_string (val), NULL); xmlAddChild (node, import); } } ret = gst_cmml_parser_node_to_string (parser, node); xmlUnlinkNode (node); xmlFreeNode (node); return ret; } /* convert a GstCmmlTagHead to its string representation */ guchar * gst_cmml_parser_tag_head_to_string (GstCmmlParser * parser, GstCmmlTagHead * head) { xmlNodePtr node; xmlNodePtr tmp; guchar *ret; node = gst_cmml_parser_new_node (parser, "head", NULL); if (head->title) { tmp = gst_cmml_parser_new_node (parser, "title", NULL); xmlNodeSetContent (tmp, head->title); xmlAddChild (node, tmp); } if (head->base) { tmp = gst_cmml_parser_new_node (parser, "base", "uri", head->base, NULL); xmlAddChild (node, tmp); } if (head->meta) gst_cmml_parser_meta_to_string (parser, node, head->meta); ret = gst_cmml_parser_node_to_string (parser, node); xmlUnlinkNode (node); xmlFreeNode (node); return ret; } /* convert a GstCmmlTagClip to its string representation */ guchar * gst_cmml_parser_tag_clip_to_string (GstCmmlParser * parser, GstCmmlTagClip * clip) { xmlNodePtr node; xmlNodePtr tmp; guchar *ret; node = gst_cmml_parser_new_node (parser, "clip", "id", clip->id, "track", clip->track, NULL); /* add the anchor element */ if (clip->anchor_href) { tmp = gst_cmml_parser_new_node (parser, "a", "href", clip->anchor_href, NULL); if (clip->anchor_text) xmlNodeSetContent (tmp, clip->anchor_text); xmlAddChild (node, tmp); } /* add the img element */ if (clip->img_src) { tmp = gst_cmml_parser_new_node (parser, "img", "src", clip->img_src, "alt", clip->img_alt, NULL); xmlAddChild (node, tmp); } /* add the desc element */ if (clip->desc_text) { tmp = gst_cmml_parser_new_node (parser, "desc", NULL); xmlNodeSetContent (tmp, clip->desc_text); xmlAddChild (node, tmp); } /* add the meta elements */ if (clip->meta) gst_cmml_parser_meta_to_string (parser, node, clip->meta); if (parser->mode == GST_CMML_PARSER_DECODE) { gchar *time_str; time_str = gst_cmml_clock_time_to_npt (clip->start_time); if (time_str == NULL) goto fail; xmlSetProp (node, (xmlChar *) "start", (xmlChar *) time_str); g_free (time_str); if (clip->end_time != GST_CLOCK_TIME_NONE) { time_str = gst_cmml_clock_time_to_npt (clip->end_time); if (time_str == NULL) goto fail; xmlSetProp (node, (xmlChar *) "end", (xmlChar *) time_str); g_free (time_str); } } ret = gst_cmml_parser_node_to_string (parser, node); xmlUnlinkNode (node); xmlFreeNode (node); return ret; fail: xmlUnlinkNode (node); xmlFreeNode (node); return NULL; } guchar * gst_cmml_parser_tag_object_to_string (GstCmmlParser * parser, GObject * tag) { guchar *tag_string = NULL; GType tag_type = G_OBJECT_TYPE (tag); if (tag_type == GST_TYPE_CMML_TAG_STREAM) tag_string = gst_cmml_parser_tag_stream_to_string (parser, GST_CMML_TAG_STREAM (tag)); else if (tag_type == GST_TYPE_CMML_TAG_HEAD) tag_string = gst_cmml_parser_tag_head_to_string (parser, GST_CMML_TAG_HEAD (tag)); else if (tag_type == GST_TYPE_CMML_TAG_CLIP) tag_string = gst_cmml_parser_tag_clip_to_string (parser, GST_CMML_TAG_CLIP (tag)); else g_warning ("could not convert object to cmml"); return tag_string; } /*** private section ***/ /* create a new node * * helper to create a node and set its attributes */ static xmlNodePtr gst_cmml_parser_new_node (GstCmmlParser * parser, const gchar * name, ...) { va_list args; xmlNodePtr node; xmlChar *prop_name, *prop_value; node = xmlNewNode (NULL, (xmlChar *) name); va_start (args, name); prop_name = va_arg (args, xmlChar *); while (prop_name != NULL) { prop_value = va_arg (args, xmlChar *); if (prop_value != NULL) xmlSetProp (node, prop_name, prop_value); prop_name = va_arg (args, xmlChar *); } va_end (args); return node; } /* get the last node of the stream * * returns the last node at depth 1 (if any) or the root node */ static xmlNodePtr gst_cmml_parser_get_last_element (GstCmmlParser * parser) { xmlNodePtr node; node = xmlDocGetRootElement (parser->context->myDoc); if (!node) { g_warning ("no last cmml element"); return NULL; } if (node->children) node = xmlGetLastChild (node); return node; } static void gst_cmml_parser_parse_preamble (GstCmmlParser * parser, const guchar * attributes) { gchar *preamble; gchar *element; const gchar *version; const gchar *encoding; const gchar *standalone; xmlDocPtr doc; doc = parser->context->myDoc; version = doc->version ? (gchar *) doc->version : "1.0"; encoding = doc->encoding ? (gchar *) doc->encoding : "UTF-8"; standalone = doc->standalone ? "yes" : "no"; preamble = g_strdup_printf ("\n" "\n", version, encoding, standalone); if (attributes == NULL) attributes = (guchar *) ""; if (parser->mode == GST_CMML_PARSER_ENCODE) element = g_strdup_printf ("", attributes); else element = g_strdup_printf ("", attributes); parser->preamble_callback (parser->user_data, (guchar *) preamble, (guchar *) element); g_free (preamble); g_free (element); } /* parse the cmml stream tag */ static void gst_cmml_parser_parse_stream (GstCmmlParser * parser, xmlNodePtr stream) { GstCmmlTagStream *stream_tag; GValue str_val = { 0 }; xmlNodePtr walk; guchar *timebase; g_value_init (&str_val, G_TYPE_STRING); /* read the timebase and utc attributes */ timebase = xmlGetProp (stream, (xmlChar *) "timebase"); if (timebase == NULL) timebase = (guchar *) g_strdup ("0"); stream_tag = g_object_new (GST_TYPE_CMML_TAG_STREAM, "timebase", timebase, NULL); g_free (timebase); stream_tag->utc = xmlGetProp (stream, (xmlChar *) "utc"); /* walk the children nodes */ for (walk = stream->children; walk; walk = walk->next) { /* for every import tag add its src attribute to stream_tag->imports */ if (!xmlStrcmp (walk->name, (xmlChar *) "import")) { g_value_take_string (&str_val, (gchar *) xmlGetProp (walk, (xmlChar *) "src")); if (stream_tag->imports == NULL) stream_tag->imports = g_value_array_new (0); g_value_array_append (stream_tag->imports, &str_val); } } g_value_unset (&str_val); parser->stream_callback (parser->user_data, stream_tag); g_object_unref (stream_tag); } /* parse the cmml head tag */ static void gst_cmml_parser_parse_head (GstCmmlParser * parser, xmlNodePtr head) { GstCmmlTagHead *head_tag; xmlNodePtr walk; GValue str_val = { 0 }; head_tag = g_object_new (GST_TYPE_CMML_TAG_HEAD, NULL); g_value_init (&str_val, G_TYPE_STRING); /* Parse the content of the node and setup the GST_TAG_CMML_HEAD tag. * Create a GST_TAG_TITLE when we find the title element. */ for (walk = head->children; walk; walk = walk->next) { if (!xmlStrcmp (walk->name, (xmlChar *) "title")) { head_tag->title = xmlNodeGetContent (walk); } else if (!xmlStrcmp (walk->name, (xmlChar *) "base")) { head_tag->base = xmlGetProp (walk, (xmlChar *) "uri"); } else if (!xmlStrcmp (walk->name, (xmlChar *) "meta")) { if (head_tag->meta == NULL) head_tag->meta = g_value_array_new (0); /* add a pair name, content to the meta value array */ g_value_take_string (&str_val, (gchar *) xmlGetProp (walk, (xmlChar *) "name")); g_value_array_append (head_tag->meta, &str_val); g_value_take_string (&str_val, (gchar *) xmlGetProp (walk, (xmlChar *) "content")); g_value_array_append (head_tag->meta, &str_val); } } g_value_unset (&str_val); parser->head_callback (parser->user_data, head_tag); g_object_unref (head_tag); } /* parse a cmml clip tag */ static void gst_cmml_parser_parse_clip (GstCmmlParser * parser, xmlNodePtr clip) { GstCmmlTagClip *clip_tag; GValue str_val = { 0 }; guchar *id, *track, *start, *end; xmlNodePtr walk; GstClockTime start_time = GST_CLOCK_TIME_NONE; GstClockTime end_time = GST_CLOCK_TIME_NONE; start = xmlGetProp (clip, (xmlChar *) "start"); if (parser->mode == GST_CMML_PARSER_ENCODE && start == NULL) /* XXX: validate the document */ return; id = xmlGetProp (clip, (xmlChar *) "id"); track = xmlGetProp (clip, (xmlChar *) "track"); end = xmlGetProp (clip, (xmlChar *) "end"); if (track == NULL) track = (guchar *) g_strdup ("default"); if (start) { if (!strncmp ((gchar *) start, "smpte", 5)) start_time = gst_cmml_clock_time_from_smpte ((gchar *) start); else start_time = gst_cmml_clock_time_from_npt ((gchar *) start); } if (end) { if (!strncmp ((gchar *) end, "smpte", 5)) start_time = gst_cmml_clock_time_from_smpte ((gchar *) end); else end_time = gst_cmml_clock_time_from_npt ((gchar *) end); } clip_tag = g_object_new (GST_TYPE_CMML_TAG_CLIP, "id", id, "track", track, "start-time", start_time, "end-time", end_time, NULL); g_free (id); g_free (track); g_free (start); g_free (end); g_value_init (&str_val, G_TYPE_STRING); /* parse the children */ for (walk = clip->children; walk; walk = walk->next) { /* the clip is not empty */ clip_tag->empty = FALSE; if (!xmlStrcmp (walk->name, (xmlChar *) "a")) { clip_tag->anchor_href = xmlGetProp (walk, (xmlChar *) "href"); clip_tag->anchor_text = xmlNodeGetContent (walk); } else if (!xmlStrcmp (walk->name, (xmlChar *) "img")) { clip_tag->img_src = xmlGetProp (walk, (xmlChar *) "src"); clip_tag->img_alt = xmlGetProp (walk, (xmlChar *) "alt"); } else if (!xmlStrcmp (walk->name, (xmlChar *) "desc")) { clip_tag->desc_text = xmlNodeGetContent (walk); } else if (!xmlStrcmp (walk->name, (xmlChar *) "meta")) { if (clip_tag->meta == NULL) clip_tag->meta = g_value_array_new (0); /* add a pair name, content to the meta value array */ g_value_take_string (&str_val, (char *) xmlGetProp (walk, (xmlChar *) "name")); g_value_array_append (clip_tag->meta, &str_val); g_value_take_string (&str_val, (char *) xmlGetProp (walk, (xmlChar *) "content")); g_value_array_append (clip_tag->meta, &str_val); } } g_value_unset (&str_val); parser->clip_callback (parser->user_data, clip_tag); g_object_unref (clip_tag); } void gst_cmml_parser_meta_to_string (GstCmmlParser * parser, xmlNodePtr parent, GValueArray * array) { gint i; xmlNodePtr node; GValue *name, *content; for (i = 0; i < array->n_values - 1; i += 2) { name = g_value_array_get_nth (array, i); content = g_value_array_get_nth (array, i + 1); node = gst_cmml_parser_new_node (parser, "meta", "name", g_value_get_string (name), "content", g_value_get_string (content), NULL); xmlAddChild (parent, node); } } static void gst_cmml_parser_generic_error (void *ctx, const char *msg, ...) { #ifndef GST_DISABLE_GST_DEBUG va_list varargs; va_start (varargs, msg); gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, "", "", 0, NULL, msg, varargs); va_end (varargs); #endif /* GST_DISABLE_GST_DEBUG */ } /* sax handler called when an element start tag is found * this is used to parse the cmml start tag */ static void gst_cmml_parser_parse_start_element_ns (xmlParserCtxt * ctxt, const xmlChar * name, const xmlChar * prefix, const xmlChar * URI, int nb_preferences, const xmlChar ** namespaces, int nb_attributes, int nb_defaulted, const xmlChar ** attributes) { GstCmmlParser *parser = (GstCmmlParser *) ctxt->_private; xmlSAX2StartElementNs (ctxt, name, prefix, URI, nb_preferences, namespaces, nb_attributes, nb_defaulted, attributes); if (parser->mode == GST_CMML_PARSER_ENCODE) if (!xmlStrcmp (name, (xmlChar *) "cmml")) if (parser->preamble_callback) /* FIXME: parse attributes */ gst_cmml_parser_parse_preamble (parser, NULL); } /* sax processing instruction handler * used to parse the cmml processing instruction */ static void gst_cmml_parser_parse_processing_instruction (xmlParserCtxtPtr ctxt, const xmlChar * target, const xmlChar * data) { GstCmmlParser *parser = (GstCmmlParser *) ctxt->_private; xmlSAX2ProcessingInstruction (ctxt, target, data); if (parser->mode == GST_CMML_PARSER_DECODE) if (!xmlStrcmp (target, (xmlChar *) "cmml")) if (parser->preamble_callback) gst_cmml_parser_parse_preamble (parser, data); } /* sax handler called when an xml end tag is found * used to parse the stream, head and clip nodes */ static void gst_cmml_parser_parse_end_element_ns (xmlParserCtxt * ctxt, const xmlChar * name, const xmlChar * prefix, const xmlChar * URI) { xmlNodePtr node; GstCmmlParser *parser = (GstCmmlParser *) ctxt->_private; xmlSAX2EndElementNs (ctxt, name, prefix, URI); if (!xmlStrcmp (name, (xmlChar *) "clip")) { if (parser->clip_callback) { node = gst_cmml_parser_get_last_element (parser); gst_cmml_parser_parse_clip (parser, node); } } else if (!xmlStrcmp (name, (xmlChar *) "cmml")) { if (parser->cmml_end_callback) parser->cmml_end_callback (parser->user_data); } else if (!xmlStrcmp (name, (xmlChar *) "stream")) { if (parser->stream_callback) { node = gst_cmml_parser_get_last_element (parser); gst_cmml_parser_parse_stream (parser, node); } } else if (!xmlStrcmp (name, (xmlChar *) "head")) { if (parser->head_callback) { node = gst_cmml_parser_get_last_element (parser); gst_cmml_parser_parse_head (parser, node); } } } gst-plugins-good-0.10.31/ext/annodex/gstcmmldec.h0000644000175000017500000000635211671175352016544 00000000000000/* * gstcmmldec.h - GStreamer annodex CMML decoder * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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_CMML_DEC_H__ #define __GST_CMML_DEC_H__ #include #include #include #include "gstcmmlparser.h" /* GstCmmlDec */ #define GST_TYPE_CMML_DEC (gst_cmml_dec_get_type()) #define GST_CMML_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_DEC, GstCmmlDec)) #define GST_CMML_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_DEC, GstCmmlDecClass)) #define GST_IS_CMML_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_CMML_DEC)) #define GST_IS_CMML_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CMML_DEC)) #define GST_CMML_DEC_GET_CLASS(klass) \ (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CMML_DEC, GstCmmlDecClass)) typedef struct _GstCmmlDec GstCmmlDec; typedef struct _GstCmmlDecClass GstCmmlDecClass; typedef enum _GstCmmlPacketType GstCmmlPacketType; enum _GstCmmlPacketType { GST_CMML_PACKET_UNKNOWN, GST_CMML_PACKET_IDENT_HEADER, GST_CMML_PACKET_FIRST_HEADER, GST_CMML_PACKET_SECOND_HEADER, GST_CMML_PACKET_CLIP }; struct _GstCmmlDec { GstElement element; /* element part */ GstPad *sinkpad; GstPad *srcpad; /* bitstream part */ gint16 major; /* bitstream version major */ gint16 minor; /* bitstream version minor */ gint64 granulerate_n; /* bitrstream granulerate numerator */ gint64 granulerate_d; /* bitstream granulerate denominator */ gint8 granuleshift; /* bitstreamgranuleshift */ gint64 granulepos; /* bitstream granule position */ GstClockTime timestamp; /* timestamp of the last buffer */ /* decoder part */ GstCmmlParser *parser; /* cmml parser */ gboolean sent_root; GstFlowReturn flow_return; /* _chain return value */ gboolean wait_clip_end; /* when TRUE, the GST_TAG_MESSAGE for a * clip is sent when the next clip (or EOS) * is found, so that the clip end-time is * known. This is useful for pre-extracting * the clips. */ GHashTable *tracks; }; struct _GstCmmlDecClass { GstElementClass parent_class; }; GType gst_cmml_dec_get_type (void); gboolean gst_cmml_dec_plugin_init (GstPlugin * plugin); #endif /* __GST_CMML_DEC_H__ */ gst-plugins-good-0.10.31/ext/annodex/gstcmmlenc.c0000644000175000017500000004444611677341654016565 00000000000000/* * gstcmmlenc.c - GStreamer CMML encoder * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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-cmmlenc * @see_also: cmmldec, oggmux * * Cmmlenc encodes a CMML document into a CMML stream. CMML is * an XML markup language for time-continuous data maintained by the Annodex Foundation. * * * Example pipeline * |[ * gst-launch -v filesrc location=annotations.cmml ! cmmlenc ! oggmux name=mux ! filesink location=annotated.ogg * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstcmmlenc.h" #include "gstannodex.h" GST_DEBUG_CATEGORY_STATIC (cmmlenc); #define GST_CAT_DEFAULT cmmlenc #define CMML_IDENT_HEADER_SIZE 29 enum { ARG_0, GST_CMML_ENC_GRANULERATE_N, GST_CMML_ENC_GRANULERATE_D, GST_CMML_ENC_GRANULESHIFT }; enum { LAST_SIGNAL }; static GstStaticPadTemplate gst_cmml_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) true") ); static GstStaticPadTemplate gst_cmml_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) false") ); GST_BOILERPLATE (GstCmmlEnc, gst_cmml_enc, GstElement, GST_TYPE_ELEMENT); static void gst_cmml_enc_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec); static void gst_cmml_enc_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); static gboolean gst_cmml_enc_sink_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_cmml_enc_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_cmml_enc_chain (GstPad * pad, GstBuffer * buffer); static void gst_cmml_enc_parse_preamble (GstCmmlEnc * enc, guchar * preamble, guchar * processing_instruction); static void gst_cmml_enc_parse_end_tag (GstCmmlEnc * enc); static void gst_cmml_enc_parse_tag_head (GstCmmlEnc * enc, GstCmmlTagHead * head); static void gst_cmml_enc_parse_tag_clip (GstCmmlEnc * enc, GstCmmlTagClip * tag); static GstFlowReturn gst_cmml_enc_new_buffer (GstCmmlEnc * enc, guchar * data, gint size, GstBuffer ** buffer); static GstFlowReturn gst_cmml_enc_push_clip (GstCmmlEnc * enc, GstCmmlTagClip * clip, GstClockTime prev_clip_time); static GstFlowReturn gst_cmml_enc_push (GstCmmlEnc * enc, GstBuffer * buffer); static void gst_cmml_enc_finalize (GObject * object); static void gst_cmml_enc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_cmml_enc_sink_factory); gst_element_class_add_static_pad_template (element_class, &gst_cmml_enc_src_factory); gst_element_class_set_details_simple (element_class, "CMML streams encoder", "Codec/Encoder", "Encodes CMML streams", "Alessandro Decina "); } static void gst_cmml_enc_class_init (GstCmmlEncClass * enc_class) { GObjectClass *klass = G_OBJECT_CLASS (enc_class); klass->get_property = gst_cmml_enc_get_property; klass->set_property = gst_cmml_enc_set_property; klass->finalize = gst_cmml_enc_finalize; g_object_class_install_property (klass, GST_CMML_ENC_GRANULERATE_N, g_param_spec_int64 ("granule-rate-numerator", "Granulerate numerator", "Granulerate numerator", 0, G_MAXINT64, 1000, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_ENC_GRANULERATE_D, g_param_spec_int64 ("granule-rate-denominator", "Granulerate denominator", "Granulerate denominator", 0, G_MAXINT64, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (klass, GST_CMML_ENC_GRANULESHIFT, g_param_spec_uchar ("granule-shift", "Granuleshift", "The number of lower bits to use for partitioning a granule position", 0, 64, 32, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); GST_ELEMENT_CLASS (klass)->change_state = gst_cmml_enc_change_state; } static void gst_cmml_enc_init (GstCmmlEnc * enc, GstCmmlEncClass * klass) { enc->sinkpad = gst_pad_new_from_static_template (&gst_cmml_enc_sink_factory, "sink"); gst_pad_set_chain_function (enc->sinkpad, gst_cmml_enc_chain); gst_pad_set_event_function (enc->sinkpad, gst_cmml_enc_sink_event); gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad); enc->srcpad = gst_pad_new_from_static_template (&gst_cmml_enc_src_factory, "src"); gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad); enc->major = 3; enc->minor = 0; } static void gst_cmml_enc_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstCmmlEnc *enc = GST_CMML_ENC (object); switch (property_id) { case GST_CMML_ENC_GRANULERATE_N: /* XXX: may need to flush clips */ enc->granulerate_n = g_value_get_int64 (value); break; case GST_CMML_ENC_GRANULERATE_D: enc->granulerate_d = g_value_get_int64 (value); break; case GST_CMML_ENC_GRANULESHIFT: enc->granuleshift = g_value_get_uchar (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void gst_cmml_enc_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstCmmlEnc *enc = GST_CMML_ENC (object); switch (property_id) { case GST_CMML_ENC_GRANULERATE_N: g_value_set_int64 (value, enc->granulerate_n); break; case GST_CMML_ENC_GRANULERATE_D: g_value_set_int64 (value, enc->granulerate_d); break; case GST_CMML_ENC_GRANULESHIFT: g_value_set_uchar (value, enc->granuleshift); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void gst_cmml_enc_finalize (GObject * object) { GstCmmlEnc *enc = GST_CMML_ENC (object); if (enc->tracks) { gst_cmml_track_list_destroy (enc->tracks); enc->tracks = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static GstStateChangeReturn gst_cmml_enc_change_state (GstElement * element, GstStateChange transition) { GstCmmlEnc *enc = GST_CMML_ENC (element); GstStateChangeReturn res; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: enc->parser = gst_cmml_parser_new (GST_CMML_PARSER_ENCODE); enc->parser->user_data = enc; enc->parser->preamble_callback = (GstCmmlParserPreambleCallback) gst_cmml_enc_parse_preamble; enc->parser->head_callback = (GstCmmlParserHeadCallback) gst_cmml_enc_parse_tag_head; enc->parser->clip_callback = (GstCmmlParserClipCallback) gst_cmml_enc_parse_tag_clip; enc->parser->cmml_end_callback = (GstCmmlParserCmmlEndCallback) gst_cmml_enc_parse_end_tag; enc->tracks = gst_cmml_track_list_new (); enc->sent_headers = FALSE; enc->sent_eos = FALSE; enc->flow_return = GST_FLOW_OK; break; default: break; } res = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: { gst_cmml_track_list_destroy (enc->tracks); enc->tracks = NULL; g_free (enc->preamble); enc->preamble = NULL; gst_cmml_parser_free (enc->parser); break; } default: break; } return res; } static gboolean gst_cmml_enc_sink_event (GstPad * pad, GstEvent * event) { GstCmmlEnc *enc = GST_CMML_ENC (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: { if (!enc->sent_eos) gst_cmml_enc_parse_end_tag (enc); break; } default: break; } return gst_pad_event_default (pad, event); } static GstFlowReturn gst_cmml_enc_new_buffer (GstCmmlEnc * enc, guchar * data, gint size, GstBuffer ** buffer) { GstFlowReturn res; res = gst_pad_alloc_buffer (enc->srcpad, GST_BUFFER_OFFSET_NONE, size, NULL, buffer); if (res == GST_FLOW_OK) { if (data) memcpy (GST_BUFFER_DATA (*buffer), data, size); } else { GST_WARNING_OBJECT (enc, "alloc function returned error %s", gst_flow_get_name (res)); } return res; } static GstCaps * gst_cmml_enc_set_header_on_caps (GstCmmlEnc * enc, GstCaps * caps, GstBuffer * ident, GstBuffer * preamble, GstBuffer * head) { GValue array = { 0 }; GValue value = { 0 }; GstStructure *structure; GstBuffer *buffer; caps = gst_caps_make_writable (caps); structure = gst_caps_get_structure (caps, 0); g_value_init (&array, GST_TYPE_ARRAY); g_value_init (&value, GST_TYPE_BUFFER); /* Make copies of header buffers to avoid circular references */ buffer = gst_buffer_copy (ident); gst_value_set_buffer (&value, buffer); gst_value_array_append_value (&array, &value); gst_buffer_unref (buffer); buffer = gst_buffer_copy (preamble); gst_value_set_buffer (&value, buffer); gst_value_array_append_value (&array, &value); gst_buffer_unref (buffer); buffer = gst_buffer_copy (head); gst_value_set_buffer (&value, buffer); gst_value_array_append_value (&array, &value); gst_buffer_unref (buffer); GST_BUFFER_FLAG_SET (ident, GST_BUFFER_FLAG_IN_CAPS); GST_BUFFER_FLAG_SET (preamble, GST_BUFFER_FLAG_IN_CAPS); GST_BUFFER_FLAG_SET (head, GST_BUFFER_FLAG_IN_CAPS); gst_structure_set_value (structure, "streamheader", &array); g_value_unset (&value); g_value_unset (&array); return caps; } /* create a CMML ident header buffer */ static GstFlowReturn gst_cmml_enc_new_ident_header (GstCmmlEnc * enc, GstBuffer ** buffer) { guint8 ident_header[CMML_IDENT_HEADER_SIZE]; guint8 *wptr = ident_header; memcpy (wptr, "CMML\0\0\0\0", 8); wptr += 8; GST_WRITE_UINT16_LE (wptr, enc->major); wptr += 2; GST_WRITE_UINT16_LE (wptr, enc->minor); wptr += 2; GST_WRITE_UINT64_LE (wptr, enc->granulerate_n); wptr += 8; GST_WRITE_UINT64_LE (wptr, enc->granulerate_d); wptr += 8; *wptr = enc->granuleshift; return gst_cmml_enc_new_buffer (enc, (guchar *) & ident_header, CMML_IDENT_HEADER_SIZE, buffer); } /* parse the CMML preamble */ static void gst_cmml_enc_parse_preamble (GstCmmlEnc * enc, guchar * preamble, guchar * processing_instruction) { GST_INFO_OBJECT (enc, "parsing preamble"); /* save the preamble: it will be pushed when the head tag is found */ enc->preamble = (guchar *) g_strconcat ((gchar *) preamble, (gchar *) processing_instruction, NULL); } /* parse the CMML end tag */ static void gst_cmml_enc_parse_end_tag (GstCmmlEnc * enc) { GstBuffer *buffer; GST_INFO_OBJECT (enc, "parsing end tag"); /* push an empty buffer to signal EOS */ enc->flow_return = gst_cmml_enc_new_buffer (enc, NULL, 0, &buffer); if (enc->flow_return == GST_FLOW_OK) { /* set granulepos 0 on EOS */ GST_BUFFER_OFFSET_END (buffer) = 0; enc->flow_return = gst_cmml_enc_push (enc, buffer); enc->sent_eos = TRUE; } return; } /* encode the CMML head tag and push the CMML headers */ static void gst_cmml_enc_parse_tag_head (GstCmmlEnc * enc, GstCmmlTagHead * head) { GList *headers = NULL; GList *walk; guchar *head_string; GstCaps *caps; GstBuffer *ident_buf, *preamble_buf, *head_buf; GstBuffer *buffer; if (enc->preamble == NULL) goto flow_unexpected; GST_INFO_OBJECT (enc, "parsing head tag"); enc->flow_return = gst_cmml_enc_new_ident_header (enc, &ident_buf); if (enc->flow_return != GST_FLOW_OK) goto alloc_error; headers = g_list_append (headers, ident_buf); enc->flow_return = gst_cmml_enc_new_buffer (enc, enc->preamble, strlen ((gchar *) enc->preamble), &preamble_buf); if (enc->flow_return != GST_FLOW_OK) goto alloc_error; headers = g_list_append (headers, preamble_buf); head_string = gst_cmml_parser_tag_head_to_string (enc->parser, head); enc->flow_return = gst_cmml_enc_new_buffer (enc, head_string, strlen ((gchar *) head_string), &head_buf); g_free (head_string); if (enc->flow_return != GST_FLOW_OK) goto alloc_error; headers = g_list_append (headers, head_buf); caps = gst_pad_get_caps (enc->srcpad); caps = gst_cmml_enc_set_header_on_caps (enc, caps, ident_buf, preamble_buf, head_buf); while (headers) { buffer = GST_BUFFER (headers->data); /* set granulepos 0 on headers */ GST_BUFFER_OFFSET_END (buffer) = 0; gst_buffer_set_caps (buffer, caps); enc->flow_return = gst_cmml_enc_push (enc, buffer); headers = g_list_delete_link (headers, headers); if (enc->flow_return != GST_FLOW_OK) goto push_error; } gst_caps_unref (caps); enc->sent_headers = TRUE; return; flow_unexpected: GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("got head tag before preamble")); enc->flow_return = GST_FLOW_ERROR; return; push_error: gst_caps_unref (caps); /* fallthrough */ alloc_error: for (walk = headers; walk; walk = walk->next) gst_buffer_unref (GST_BUFFER (walk->data)); g_list_free (headers); return; } /* encode a CMML clip tag * remove the start and end attributes (GstCmmlParser does this itself) and * push the tag with the timestamp of its start attribute. If the tag has the * end attribute, create a new empty clip and encode it. */ static void gst_cmml_enc_parse_tag_clip (GstCmmlEnc * enc, GstCmmlTagClip * clip) { GstCmmlTagClip *prev_clip; GstClockTime prev_clip_time = GST_CLOCK_TIME_NONE; /* this can happen if there's a programming error (eg user forgets to set * the start-time property) or if one of the gst_cmml_clock_time_from_* * overflows in GstCmmlParser */ if (clip->start_time == GST_CLOCK_TIME_NONE) { GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("invalid start time for clip (%s)", clip->id)); enc->flow_return = GST_FLOW_ERROR; return; } /* get the previous clip's start time to encode the current granulepos */ prev_clip = gst_cmml_track_list_get_track_last_clip (enc->tracks, (gchar *) clip->track); if (prev_clip) { prev_clip_time = prev_clip->start_time; if (prev_clip_time > clip->start_time) { GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("previous clip start time > current clip (%s) start time", clip->id)); enc->flow_return = GST_FLOW_ERROR; return; } /* we don't need the prev clip anymore */ gst_cmml_track_list_del_clip (enc->tracks, prev_clip); } /* add the current clip to the tracklist */ gst_cmml_track_list_add_clip (enc->tracks, clip); enc->flow_return = gst_cmml_enc_push_clip (enc, clip, prev_clip_time); } static GstFlowReturn gst_cmml_enc_push_clip (GstCmmlEnc * enc, GstCmmlTagClip * clip, GstClockTime prev_clip_time) { GstFlowReturn res; GstBuffer *buffer; gchar *clip_string; gint64 granulepos; /* encode the clip */ clip_string = (gchar *) gst_cmml_parser_tag_clip_to_string (enc->parser, clip); res = gst_cmml_enc_new_buffer (enc, (guchar *) clip_string, strlen (clip_string), &buffer); g_free (clip_string); if (res != GST_FLOW_OK) goto done; GST_INFO_OBJECT (enc, "encoding clip" "(start-time: %" GST_TIME_FORMAT " end-time: %" GST_TIME_FORMAT, GST_TIME_ARGS (clip->start_time), GST_TIME_ARGS (clip->end_time)); /* set the granulepos */ granulepos = gst_cmml_clock_time_to_granule (prev_clip_time, clip->start_time, enc->granulerate_n, enc->granulerate_d, enc->granuleshift); if (granulepos == -1) { gst_buffer_unref (buffer); goto granule_overflow; } GST_BUFFER_OFFSET (buffer) = clip->start_time; GST_BUFFER_OFFSET_END (buffer) = granulepos; GST_BUFFER_TIMESTAMP (buffer) = clip->start_time; res = gst_cmml_enc_push (enc, buffer); if (res != GST_FLOW_OK) goto done; if (clip->end_time != GST_CLOCK_TIME_NONE) { /* create a new empty clip for the same cmml track starting at end_time */ GObject *end_clip = g_object_new (GST_TYPE_CMML_TAG_CLIP, "start-time", clip->end_time, "track", clip->track, NULL); /* encode the empty end clip */ gst_cmml_enc_push_clip (enc, GST_CMML_TAG_CLIP (end_clip), clip->start_time); g_object_unref (end_clip); } done: return res; granule_overflow: GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("granulepos overflow")); return GST_FLOW_ERROR; } static GstFlowReturn gst_cmml_enc_push (GstCmmlEnc * enc, GstBuffer * buffer) { GstFlowReturn res; res = gst_pad_push (enc->srcpad, buffer); if (res != GST_FLOW_OK) GST_WARNING_OBJECT (enc, "push returned: %s", gst_flow_get_name (res)); return res; } static GstFlowReturn gst_cmml_enc_chain (GstPad * pad, GstBuffer * buffer) { GError *err = NULL; GstCmmlEnc *enc = GST_CMML_ENC (GST_PAD_PARENT (pad)); /* the CMML handlers registered with enc->parser will override this when * encoding/pushing the buffers downstream */ enc->flow_return = GST_FLOW_OK; if (!gst_cmml_parser_parse_chunk (enc->parser, (gchar *) GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), &err)) { GST_ELEMENT_ERROR (enc, STREAM, ENCODE, (NULL), ("%s", err->message)); g_error_free (err); enc->flow_return = GST_FLOW_ERROR; } gst_buffer_unref (buffer); return enc->flow_return; } gboolean gst_cmml_enc_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "cmmlenc", GST_RANK_NONE, GST_TYPE_CMML_ENC)) return FALSE; GST_DEBUG_CATEGORY_INIT (cmmlenc, "cmmlenc", 0, "annodex cmml decoding element"); return TRUE; } gst-plugins-good-0.10.31/ext/annodex/gstcmmlparser.h0000644000175000017500000000530211671175352017277 00000000000000/* * gstcmmlparser.h - GStreamer CMML document parser * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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_CMML_PARSER_H__ #define __GST_CMML_PARSER_H__ #include #include #include "gstcmmltag.h" typedef struct _GstCmmlParser GstCmmlParser; typedef enum _GstCmmlParserMode GstCmmlParserMode; typedef void (*GstCmmlParserPreambleCallback) (void *user_data, const guchar * xml_preamble, const guchar * cmml_attrs); typedef void (*GstCmmlParserCmmlEndCallback) (void *user_data); typedef void (*GstCmmlParserStreamCallback) (void *user_data, GstCmmlTagStream * stream); typedef void (*GstCmmlParserHeadCallback) (void *user_data, GstCmmlTagHead * head); typedef void (*GstCmmlParserClipCallback) (void *user_data, GstCmmlTagClip * clip); enum _GstCmmlParserMode { GST_CMML_PARSER_ENCODE, GST_CMML_PARSER_DECODE }; struct _GstCmmlParser { GstCmmlParserMode mode; xmlParserCtxtPtr context; const gchar *preamble; guint preamble_size; void *user_data; GstCmmlParserPreambleCallback preamble_callback; GstCmmlParserStreamCallback stream_callback; GstCmmlParserCmmlEndCallback cmml_end_callback; GstCmmlParserHeadCallback head_callback; GstCmmlParserClipCallback clip_callback; }; void gst_cmml_parser_init (void); GstCmmlParser *gst_cmml_parser_new (GstCmmlParserMode mode); void gst_cmml_parser_free (GstCmmlParser * parser); gboolean gst_cmml_parser_parse_chunk (GstCmmlParser * parser, const gchar * data, guint size, GError ** error); guchar *gst_cmml_parser_tag_stream_to_string (GstCmmlParser * parser, GstCmmlTagStream * stream); guchar *gst_cmml_parser_tag_head_to_string (GstCmmlParser * parser, GstCmmlTagHead * head); guchar *gst_cmml_parser_tag_clip_to_string (GstCmmlParser * parser, GstCmmlTagClip * clip); guchar *gst_cmml_parser_tag_object_to_string (GstCmmlParser * parser, GObject * tag); #endif /* __GST_CMML_PARSER_H__ */ gst-plugins-good-0.10.31/ext/annodex/gstcmmlutils.c0000644000175000017500000002246711671175352017151 00000000000000/* * gstcmmlutils.c - GStreamer CMML utility functions * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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 "gstcmmlutils.h" #include #include #include typedef struct { GList *clips; gpointer user_data; } GstCmmlTrack; GstClockTime gst_cmml_clock_time_from_npt (const gchar * time) { GstClockTime res; gint fields; gint hours = 0; gint minutes = 0; gint seconds = 0; gint mseconds = 0; GstClockTime hours_t = 0, seconds_t = 0; if (!strncmp (time, "npt:", 4)) time += 4; /* parse npt-hhmmss */ fields = sscanf (time, "%d:%d:%d.%d", &hours, &minutes, &seconds, &mseconds); if (fields == 4) { if (hours < 0 || (guint) minutes > 59 || (guint) seconds > 59) goto bad_input; hours_t = gst_util_uint64_scale (hours, GST_SECOND * 3600, 1); if (hours_t == G_MAXUINT64) goto overflow; seconds_t = seconds * GST_SECOND; } else { guint64 u64seconds; /* parse npt-sec */ hours_t = 0; minutes = 0; fields = sscanf (time, "%" G_GUINT64_FORMAT ".%d", &u64seconds, &mseconds); if (seconds < 0) goto bad_input; seconds_t = gst_util_uint64_scale_int (u64seconds, GST_SECOND, 1); if (seconds_t == G_MAXUINT64) goto overflow; } if ((guint) mseconds > 999) goto bad_input; res = (minutes * 60) * GST_SECOND + mseconds * GST_MSECOND; if (G_MAXUINT64 - hours_t - seconds_t < res) goto overflow; res += hours_t + seconds_t; return res; bad_input: overflow: return GST_CLOCK_TIME_NONE; } GstClockTime gst_cmml_clock_time_from_smpte (const gchar * time) { GstClockTime res; GstClockTime hours_t; gint hours, minutes, seconds; gdouble framerate; gfloat frames; gint fields; if (!strncmp (time, "smpte-24:", 9)) { framerate = 24.0; time += 9; } else if (!strncmp (time, "smpte-24-drop:", 14)) { framerate = 23.976; time += 14; } else if (!strncmp (time, "smpte-25:", 9)) { framerate = 25.0; time += 9; } else if (!strncmp (time, "smpte-30:", 9)) { framerate = 30.0; time += 9; } else if (!strncmp (time, "smpte-30-drop:", 14)) { framerate = 29.976; time += 14; } else if (!strncmp (time, "smpte-50:", 9)) { framerate = 50.0; time += 9; } else if (!strncmp (time, "smpte-60:", 9)) { framerate = 60.0; time += 9; } else if (!strncmp (time, "smpte-60-drop:", 14)) { framerate = 59.94; time += 14; } else { return GST_CLOCK_TIME_NONE; } fields = sscanf (time, "%d:%d:%d:%f", &hours, &minutes, &seconds, &frames); if (fields == 4) { if (hours < 0 || (guint) minutes > 59 || (guint) seconds > 59 || frames < 0 || frames > ceil (framerate)) { res = GST_CLOCK_TIME_NONE; } else { hours_t = gst_util_uint64_scale (hours, GST_SECOND * 3600, 1); if (hours_t == G_MAXUINT64) goto overflow; res = ((minutes * 60) + seconds + (frames / framerate)) * GST_SECOND; if (G_MAXUINT64 - hours_t < res) goto overflow; res = hours_t + res; } } else { res = GST_CLOCK_TIME_NONE; } return res; overflow: return GST_CLOCK_TIME_NONE; } gchar * gst_cmml_clock_time_to_npt (const GstClockTime time) { guint seconds, hours, minutes, mseconds; gchar *res; g_return_val_if_fail (time != GST_CLOCK_TIME_NONE, NULL); hours = time / (GST_SECOND * 3600); minutes = (time / ((GST_SECOND * 60)) % 60); seconds = (time / GST_SECOND) % 60; mseconds = (time % GST_SECOND) / GST_MSECOND; if (mseconds < 100) mseconds *= 10; res = g_strdup_printf ("%u:%02u:%02u.%03u", hours, minutes, seconds, mseconds); return res; } gint64 gst_cmml_clock_time_to_granule (GstClockTime prev_time, GstClockTime current_time, gint64 granulerate_n, gint64 granulerate_d, guint8 granuleshift) { guint64 keyindex, keyoffset, granulepos, maxoffset; gint64 granulerate; g_return_val_if_fail (granulerate_d != 0, -1); g_return_val_if_fail (granuleshift > 0, -1); g_return_val_if_fail (granuleshift <= 64, -1); if (prev_time == GST_CLOCK_TIME_NONE) prev_time = 0; if (prev_time > current_time) return -1; /* GST_SECOND / (granulerate_n / granulerate_d) */ granulerate = gst_util_uint64_scale (GST_SECOND, granulerate_d, granulerate_n); prev_time = prev_time / granulerate; /* granuleshift == 64 should be a << 0 shift, which is defined */ maxoffset = ((guint64) 1 << (64 - granuleshift)) - 1; if (prev_time > maxoffset) /* we need more than 64 - granuleshift bits to encode prev_time */ goto overflow; keyindex = prev_time << granuleshift; keyoffset = (current_time / granulerate) - prev_time; /* make sure we don't shift to the limits of the types as this is undefined. */ if (granuleshift == 64) maxoffset = G_MAXUINT64; else maxoffset = ((guint64) 1 << granuleshift) - 1; if (keyoffset > maxoffset) /* we need more than granuleshift bits to encode prev_time - current_time */ goto overflow; granulepos = keyindex + keyoffset; return granulepos; overflow: return -1; } /* track list */ GHashTable * gst_cmml_track_list_new (void) { return g_hash_table_new (g_str_hash, g_str_equal); } static gboolean gst_cmml_track_list_destroy_track (gchar * key, GstCmmlTrack * track, gpointer user_data) { GList *walk; for (walk = track->clips; walk; walk = g_list_next (walk)) g_object_unref (G_OBJECT (walk->data)); g_free (key); g_list_free (track->clips); g_free (track); return TRUE; } void gst_cmml_track_list_destroy (GHashTable * tracks) { g_hash_table_foreach_remove (tracks, (GHRFunc) gst_cmml_track_list_destroy_track, NULL); g_hash_table_destroy (tracks); } static gint gst_cmml_track_list_compare_clips (GstCmmlTagClip * a, GstCmmlTagClip * b) { if (a->start_time < b->start_time) return -1; return 1; } void gst_cmml_track_list_add_clip (GHashTable * tracks, GstCmmlTagClip * clip) { gpointer key, value; GstCmmlTrack *track; gchar *track_name; g_return_if_fail (clip->track != NULL); if (g_hash_table_lookup_extended (tracks, clip->track, &key, &value)) { track_name = (gchar *) key; track = (GstCmmlTrack *) value; } else { track_name = g_strdup ((gchar *) clip->track); track = g_new0 (GstCmmlTrack, 1); g_hash_table_insert (tracks, track_name, track); } /* add clip to the tracklist */ track->clips = g_list_insert_sorted (track->clips, g_object_ref (clip), (GCompareFunc) gst_cmml_track_list_compare_clips); } gboolean gst_cmml_track_list_del_clip (GHashTable * tracks, GstCmmlTagClip * clip) { GstCmmlTrack *track; GList *link; gboolean res = FALSE; g_return_val_if_fail (clip->track != NULL, FALSE); track = g_hash_table_lookup (tracks, clip->track); if (track) { link = g_list_find (track->clips, clip); if (link) { g_object_unref (G_OBJECT (link->data)); track->clips = g_list_delete_link (track->clips, link); res = TRUE; } } return res; } gboolean gst_cmml_track_list_has_clip (GHashTable * tracks, GstCmmlTagClip * clip) { GstCmmlTrack *track; GList *walk; GstCmmlTagClip *tmp; gboolean res = FALSE; track = g_hash_table_lookup (tracks, (gchar *) clip->track); if (track) { for (walk = track->clips; walk; walk = g_list_next (walk)) { tmp = GST_CMML_TAG_CLIP (walk->data); if (tmp->start_time == clip->start_time) { res = TRUE; break; } } } return res; } static gboolean gst_cmml_track_list_merge_track (gchar * track_name, GstCmmlTrack * track, GList ** list) { GList *walk; GstCmmlTagClip *cur; for (walk = track->clips; walk; walk = g_list_next (walk)) { cur = GST_CMML_TAG_CLIP (walk->data); *list = g_list_insert_sorted (*list, cur, (GCompareFunc) gst_cmml_track_list_compare_clips); } return TRUE; } GList * gst_cmml_track_list_get_track_clips (GHashTable * tracks, const gchar * track_name) { GstCmmlTrack *track; g_return_val_if_fail (track_name != NULL, NULL); track = g_hash_table_lookup (tracks, track_name); return track ? track->clips : NULL; } GList * gst_cmml_track_list_get_clips (GHashTable * tracks) { GList *list = NULL; g_hash_table_foreach (tracks, (GHFunc) gst_cmml_track_list_merge_track, &list); return list; } GstCmmlTagClip * gst_cmml_track_list_get_track_last_clip (GHashTable * tracks, const gchar * track_name) { GstCmmlTrack *track; GList *res = NULL; g_return_val_if_fail (track_name != NULL, NULL); track = g_hash_table_lookup (tracks, track_name); if (track && track->clips) res = g_list_last (track->clips); return res ? GST_CMML_TAG_CLIP (res->data) : NULL; } gst-plugins-good-0.10.31/ext/annodex/gstannodex.h0000644000175000017500000000235511671175352016573 00000000000000/* * gstannodex.h - GStreamer annodex utility functions * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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_ANNODEX_H__ #define __GST_ANNODEX_H__ #include GstClockTime gst_annodex_granule_to_time (gint64 granulepos, gint64 granulerate_n, gint64 granulerate_d, guint8 granuleshift); gchar *gst_annodex_time_to_npt (GstClockTime time); GValueArray *gst_annodex_parse_headers (const gchar * headers); #endif /* __GST_ANNODEX_H__ */ gst-plugins-good-0.10.31/ext/annodex/gstcmmltag.h0000644000175000017500000001116411671175352016561 00000000000000/* * gstcmmltag.h - GStreamer annodex CMML tag support * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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_CMML_TAG_H__ #define __GST_CMML_TAG_H__ #include /* GstCmmlTagStream */ #define GST_TYPE_CMML_TAG_STREAM (gst_cmml_tag_stream_get_type ()) #define GST_CMML_TAG_STREAM(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), \ GST_TYPE_CMML_TAG_STREAM, GstCmmlTagStream)) #define GST_CMML_TAG_STREAM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), \ GST_TYPE_CMML_TAG_STREAM, GstCmmlTagStreamClass)) #define GST_CMML_TAG_STREAM_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), \ GST_TYPE_CMML_TAG_STREAM, GstCmmlTagStreamClass)) /* GstCmmlTagHead */ #define GST_TYPE_CMML_TAG_HEAD (gst_cmml_tag_head_get_type ()) #define GST_CMML_TAG_HEAD(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_TAG_HEAD, GstCmmlTagHead)) #define GST_CMML_TAG_HEAD_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_TAG_HEAD, GstCmmlTagHeadClass)) #define GST_CMML_TAG_HEAD_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), \ GST_TYPE_CMML_TAG_HEAD, GstCmmlTagHeadClass)) /* GstCmmlTagClip */ #define GST_TYPE_CMML_TAG_CLIP (gst_cmml_tag_clip_get_type ()) #define GST_CMML_TAG_CLIP(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CMML_TAG_CLIP, GstCmmlTagClip)) #define GST_CMML_TAG_CLIP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CMML_TAG_CLIP, GstCmmlTagClipClass)) #define GST_CMML_TAG_CLIP_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), \ GST_TYPE_CMML_TAG_CLIP, GstCmmlTagClipClass)) typedef struct _GstCmmlTagStream GstCmmlTagStream; typedef struct _GstCmmlTagStreamClass GstCmmlTagStreamClass; typedef struct _GstCmmlTagHead GstCmmlTagHead; typedef struct _GstCmmlTagHeadClass GstCmmlTagHeadClass; typedef struct _GstCmmlTagClip GstCmmlTagClip; typedef struct _GstCmmlTagClipClass GstCmmlTagClipClass; struct _GstCmmlTagStream { GObject object; guchar *timebase; guchar *utc; GValueArray *imports; }; struct _GstCmmlTagStreamClass { GObjectClass parent_class; }; struct _GstCmmlTagHead { GObject object; guchar *title; /* title of the media */ guchar *base; GValueArray *meta; /* metadata attached to the media. * The elements are positioned in key-value * pairs ie (key, content, key2, content2, * ...) */ }; struct _GstCmmlTagHeadClass { GObjectClass parent_class; }; struct _GstCmmlTagClip { GObject object; gboolean empty; /* empty flag. An empty clip marks the * end of the previous clip. */ guchar *id; /* clip id */ guchar *track; /* clip track */ GstClockTime start_time; /* clip start time */ GstClockTime end_time; /* clip end time */ guchar *anchor_href; /* anchor href URI */ guchar *anchor_text; /* anchor text */ guchar *img_src; /* image URI */ guchar *img_alt; /* image alternative text */ guchar *desc_text; /* clip description */ GValueArray *meta; /* metadata attached to the clip * The elements are positioned in key-value * pairs ie (key, content, key2, content2, * ...) */ }; struct _GstCmmlTagClipClass { GObjectClass parent_class; }; GType gst_cmml_tag_stream_get_type (void); GType gst_cmml_tag_head_get_type (void); GType gst_cmml_tag_clip_get_type (void); #endif /* __GST_CMML_TAG_H__ */ gst-plugins-good-0.10.31/ext/annodex/Makefile.in0000644000175000017500000010261511720560225016305 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ext/annodex DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstannodex_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstannodex_la_OBJECTS = libgstannodex_la-gstannodex.lo \ libgstannodex_la-gstcmmlutils.lo \ libgstannodex_la-gstcmmldec.lo libgstannodex_la-gstcmmlenc.lo \ libgstannodex_la-gstcmmltag.lo \ libgstannodex_la-gstcmmlparser.lo libgstannodex_la_OBJECTS = $(am_libgstannodex_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstannodex_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstannodex_la_CFLAGS) $(CFLAGS) \ $(libgstannodex_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstannodex_la_SOURCES) DIST_SOURCES = $(libgstannodex_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstannodex.la libgstannodex_la_SOURCES = \ gstannodex.c \ gstcmmlutils.c \ gstcmmldec.c \ gstcmmlenc.c \ gstcmmltag.c \ gstcmmlparser.c libgstannodex_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(ANNODEX_CFLAGS) libgstannodex_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ $(GST_LIBS) $(ANNODEX_LIBS) $(LIBM) libgstannodex_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstannodex_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstannodex.h gstcmmlutils.h gstcmmltag.h gstcmmlparser.h \ gstcmmldec.h gstcmmlenc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ext/annodex/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ext/annodex/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstannodex.la: $(libgstannodex_la_OBJECTS) $(libgstannodex_la_DEPENDENCIES) $(EXTRA_libgstannodex_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstannodex_la_LINK) -rpath $(plugindir) $(libgstannodex_la_OBJECTS) $(libgstannodex_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstannodex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmldec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmlenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmlparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmltag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstannodex_la-gstcmmlutils.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstannodex_la-gstannodex.lo: gstannodex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstannodex.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstannodex.Tpo -c -o libgstannodex_la-gstannodex.lo `test -f 'gstannodex.c' || echo '$(srcdir)/'`gstannodex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstannodex.Tpo $(DEPDIR)/libgstannodex_la-gstannodex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstannodex.c' object='libgstannodex_la-gstannodex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstannodex.lo `test -f 'gstannodex.c' || echo '$(srcdir)/'`gstannodex.c libgstannodex_la-gstcmmlutils.lo: gstcmmlutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmlutils.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmlutils.Tpo -c -o libgstannodex_la-gstcmmlutils.lo `test -f 'gstcmmlutils.c' || echo '$(srcdir)/'`gstcmmlutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmlutils.Tpo $(DEPDIR)/libgstannodex_la-gstcmmlutils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmlutils.c' object='libgstannodex_la-gstcmmlutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmlutils.lo `test -f 'gstcmmlutils.c' || echo '$(srcdir)/'`gstcmmlutils.c libgstannodex_la-gstcmmldec.lo: gstcmmldec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmldec.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmldec.Tpo -c -o libgstannodex_la-gstcmmldec.lo `test -f 'gstcmmldec.c' || echo '$(srcdir)/'`gstcmmldec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmldec.Tpo $(DEPDIR)/libgstannodex_la-gstcmmldec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmldec.c' object='libgstannodex_la-gstcmmldec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmldec.lo `test -f 'gstcmmldec.c' || echo '$(srcdir)/'`gstcmmldec.c libgstannodex_la-gstcmmlenc.lo: gstcmmlenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmlenc.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmlenc.Tpo -c -o libgstannodex_la-gstcmmlenc.lo `test -f 'gstcmmlenc.c' || echo '$(srcdir)/'`gstcmmlenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmlenc.Tpo $(DEPDIR)/libgstannodex_la-gstcmmlenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmlenc.c' object='libgstannodex_la-gstcmmlenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmlenc.lo `test -f 'gstcmmlenc.c' || echo '$(srcdir)/'`gstcmmlenc.c libgstannodex_la-gstcmmltag.lo: gstcmmltag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmltag.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmltag.Tpo -c -o libgstannodex_la-gstcmmltag.lo `test -f 'gstcmmltag.c' || echo '$(srcdir)/'`gstcmmltag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmltag.Tpo $(DEPDIR)/libgstannodex_la-gstcmmltag.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmltag.c' object='libgstannodex_la-gstcmmltag.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmltag.lo `test -f 'gstcmmltag.c' || echo '$(srcdir)/'`gstcmmltag.c libgstannodex_la-gstcmmlparser.lo: gstcmmlparser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -MT libgstannodex_la-gstcmmlparser.lo -MD -MP -MF $(DEPDIR)/libgstannodex_la-gstcmmlparser.Tpo -c -o libgstannodex_la-gstcmmlparser.lo `test -f 'gstcmmlparser.c' || echo '$(srcdir)/'`gstcmmlparser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstannodex_la-gstcmmlparser.Tpo $(DEPDIR)/libgstannodex_la-gstcmmlparser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcmmlparser.c' object='libgstannodex_la-gstcmmlparser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstannodex_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstannodex_la_CFLAGS) $(CFLAGS) -c -o libgstannodex_la-gstcmmlparser.lo `test -f 'gstcmmlparser.c' || echo '$(srcdir)/'`gstcmmlparser.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/ext/annodex/gstcmmldec.c0000644000175000017500000005155011677341654016545 00000000000000/* * gstcmmldec.c - GStreamer annodex CMML decoder * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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-cmmldec * @see_also: cmmlenc, oggdemux * * Cmmldec extracts a CMML document from a CMML bitstream.CMML is * an XML markup language for time-continuous data maintained by the Annodex Foundation. * * * Example pipeline * |[ * gst-launch -v filesrc location=annotated.ogg ! oggdemux ! cmmldec ! filesink location=annotations.cmml * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gstannodex.h" #include "gstcmmltag.h" #include "gstcmmldec.h" #include "gstcmmlutils.h" GST_DEBUG_CATEGORY_STATIC (cmmldec); #define GST_CAT_DEFAULT cmmldec #define CMML_IDENT_HEADER_SIZE 29 enum { ARG_0, GST_CMML_DEC_WAIT_CLIP_END }; enum { LAST_SIGNAL }; static GstStaticPadTemplate gst_cmml_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) false") ); static GstStaticPadTemplate gst_cmml_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("text/x-cmml, encoded = (boolean) true") ); /* GstCmmlDec */ GST_BOILERPLATE (GstCmmlDec, gst_cmml_dec, GstElement, GST_TYPE_ELEMENT); static void gst_cmml_dec_get_property (GObject * dec, guint property_id, GValue * value, GParamSpec * pspec); static void gst_cmml_dec_set_property (GObject * dec, guint property_id, const GValue * value, GParamSpec * pspec); static const GstQueryType *gst_cmml_dec_query_types (GstPad * pad); static gboolean gst_cmml_dec_sink_query (GstPad * pad, GstQuery * query); static gboolean gst_cmml_dec_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_cmml_dec_convert (GstPad * pad, GstFormat src_fmt, gint64 src_val, GstFormat * dest_fmt, gint64 * dest_val); static GstStateChangeReturn gst_cmml_dec_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_cmml_dec_chain (GstPad * pad, GstBuffer * buffer); static GstCmmlPacketType gst_cmml_dec_parse_packet_type (GstCmmlDec * dec, GstBuffer * buffer); static void gst_cmml_dec_parse_ident_header (GstCmmlDec * dec, GstBuffer * buf); static void gst_cmml_dec_parse_first_header (GstCmmlDec * dec, GstBuffer * buf); static void gst_cmml_dec_parse_preamble (GstCmmlDec * dec, guchar * preamble, guchar * cmml_root_element); static void gst_cmml_dec_parse_xml (GstCmmlDec * dec, guchar * data, guint size); static void gst_cmml_dec_parse_head (GstCmmlDec * dec, GstCmmlTagHead * head); static void gst_cmml_dec_parse_clip (GstCmmlDec * dec, GstCmmlTagClip * clip); static GstFlowReturn gst_cmml_dec_new_buffer (GstCmmlDec * dec, guchar * data, gint size, GstBuffer ** buffer); static void gst_cmml_dec_push_clip (GstCmmlDec * dec, GstCmmlTagClip * clip); static void gst_cmml_dec_send_clip_tag (GstCmmlDec * dec, GstCmmlTagClip * clip); static void gst_cmml_dec_finalize (GObject * object); static void gst_cmml_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_cmml_dec_sink_factory); gst_element_class_add_static_pad_template (element_class, &gst_cmml_dec_src_factory); gst_element_class_set_details_simple (element_class, "CMML stream decoder", "Codec/Decoder", "Decodes CMML streams", "Alessandro Decina "); } static void gst_cmml_dec_class_init (GstCmmlDecClass * dec_class) { GObjectClass *klass = G_OBJECT_CLASS (dec_class); GST_ELEMENT_CLASS (klass)->change_state = gst_cmml_dec_change_state; klass->set_property = gst_cmml_dec_set_property; klass->get_property = gst_cmml_dec_get_property; klass->finalize = gst_cmml_dec_finalize; g_object_class_install_property (klass, GST_CMML_DEC_WAIT_CLIP_END, g_param_spec_boolean ("wait-clip-end-time", "Wait clip end time", "Send a tag for a clip when the clip ends, setting its end-time. " "Use when you need to know both clip's start-time and end-time.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_cmml_dec_init (GstCmmlDec * dec, GstCmmlDecClass * klass) { dec->sinkpad = gst_pad_new_from_static_template (&gst_cmml_dec_sink_factory, "sink"); gst_pad_set_chain_function (dec->sinkpad, gst_cmml_dec_chain); gst_pad_set_query_type_function (dec->sinkpad, gst_cmml_dec_query_types); gst_pad_set_query_function (dec->sinkpad, gst_cmml_dec_sink_query); gst_pad_set_event_function (dec->sinkpad, gst_cmml_dec_sink_event); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); dec->srcpad = gst_pad_new_from_static_template (&gst_cmml_dec_src_factory, "src"); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); dec->wait_clip_end = FALSE; } static void gst_cmml_dec_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstCmmlDec *dec = GST_CMML_DEC (object); switch (property_id) { case GST_CMML_DEC_WAIT_CLIP_END: g_value_set_boolean (value, dec->wait_clip_end); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void gst_cmml_dec_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstCmmlDec *dec = GST_CMML_DEC (object); switch (property_id) { case GST_CMML_DEC_WAIT_CLIP_END: dec->wait_clip_end = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (dec, property_id, pspec); } } static void gst_cmml_dec_finalize (GObject * object) { GstCmmlDec *dec = GST_CMML_DEC (object); if (dec->tracks) { gst_cmml_track_list_destroy (dec->tracks); dec->tracks = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static GstStateChangeReturn gst_cmml_dec_change_state (GstElement * element, GstStateChange transition) { GstCmmlDec *dec = GST_CMML_DEC (element); GstStateChangeReturn res; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: dec->parser = gst_cmml_parser_new (GST_CMML_PARSER_DECODE); dec->parser->user_data = dec; dec->parser->preamble_callback = (GstCmmlParserPreambleCallback) gst_cmml_dec_parse_preamble; dec->parser->head_callback = (GstCmmlParserHeadCallback) gst_cmml_dec_parse_head; dec->parser->clip_callback = (GstCmmlParserClipCallback) gst_cmml_dec_parse_clip; dec->major = -1; dec->minor = -1; dec->granulerate_n = -1; dec->granulerate_d = -1; dec->granuleshift = 0; dec->granulepos = 0; dec->flow_return = GST_FLOW_OK; dec->sent_root = FALSE; dec->tracks = gst_cmml_track_list_new (); break; default: break; } res = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_cmml_parser_free (dec->parser); gst_cmml_track_list_destroy (dec->tracks); dec->tracks = NULL; break; default: break; } return res; } static const GstQueryType * gst_cmml_dec_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_CONVERT, 0 }; return query_types; } static gboolean gst_cmml_dec_sink_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); res = gst_cmml_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val); if (res) gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; } default: break; } return res; } static gboolean gst_cmml_dec_convert (GstPad * pad, GstFormat src_fmt, gint64 src_val, GstFormat * dest_fmt, gint64 * dest_val) { GstCmmlDec *dec = GST_CMML_DEC (GST_PAD_PARENT (pad)); gboolean res = FALSE; switch (src_fmt) { case GST_FORMAT_DEFAULT: switch (*dest_fmt) { case GST_FORMAT_TIME: { *dest_val = gst_annodex_granule_to_time (src_val, dec->granulerate_n, dec->granulerate_d, dec->granuleshift); res = TRUE; break; } default: break; } break; default: break; } return res; } static gboolean gst_cmml_dec_sink_event (GstPad * pad, GstEvent * event) { GstCmmlDec *dec = GST_CMML_DEC (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: { GstBuffer *buffer; GstCmmlTagClip *clip; GList *clips, *walk; GST_INFO_OBJECT (dec, "got EOS, flushing clips"); /* since we output a clip when the next one in the same track is found, on * EOS we need to output the last clip (if any) of every track */ clips = gst_cmml_track_list_get_clips (dec->tracks); for (walk = clips; walk; walk = g_list_next (walk)) { clip = GST_CMML_TAG_CLIP (walk->data); gst_cmml_dec_push_clip (dec, clip); if (dec->wait_clip_end) { clip->end_time = dec->timestamp; gst_cmml_dec_send_clip_tag (dec, clip); } } g_list_free (clips); /* send the cmml end tag */ dec->flow_return = gst_cmml_dec_new_buffer (dec, (guchar *) "", strlen (""), &buffer); if (dec->flow_return == GST_FLOW_OK) dec->flow_return = gst_pad_push (dec->srcpad, buffer); if (dec->flow_return == GST_FLOW_NOT_LINKED) dec->flow_return = GST_FLOW_OK; /* Ignore NOT_LINKED */ break; } default: break; } return gst_pad_event_default (pad, event); } static GstFlowReturn gst_cmml_dec_chain (GstPad * pad, GstBuffer * buffer) { GstCmmlDec *dec = GST_CMML_DEC (GST_PAD_PARENT (pad)); GstCmmlPacketType packet; if (GST_BUFFER_SIZE (buffer) == 0) { /* the EOS page could be empty */ dec->flow_return = GST_FLOW_OK; goto done; } dec->granulepos = GST_BUFFER_OFFSET_END (buffer); dec->timestamp = gst_annodex_granule_to_time (dec->granulepos, dec->granulerate_n, dec->granulerate_d, dec->granuleshift); /* identify the packet type */ packet = gst_cmml_dec_parse_packet_type (dec, buffer); /* handle the packet. the handler will set dec->flow_return */ switch (packet) { case GST_CMML_PACKET_IDENT_HEADER: if (dec->sent_root == FALSE) /* don't parse the ident again in case of seeking to the beginning */ gst_cmml_dec_parse_ident_header (dec, buffer); break; case GST_CMML_PACKET_FIRST_HEADER: if (dec->sent_root == FALSE) /* don't parse the xml preamble if it has already been parsed because it * would error out, so seeking to the beginning would fail */ gst_cmml_dec_parse_first_header (dec, buffer); break; case GST_CMML_PACKET_SECOND_HEADER: case GST_CMML_PACKET_CLIP: gst_cmml_dec_parse_xml (dec, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); break; case GST_CMML_PACKET_UNKNOWN: default: GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("unknown packet type")); dec->flow_return = GST_FLOW_ERROR; } done: gst_buffer_unref (buffer); return dec->flow_return; } /* finds the packet type of the buffer */ static GstCmmlPacketType gst_cmml_dec_parse_packet_type (GstCmmlDec * dec, GstBuffer * buffer) { GstCmmlPacketType packet_type = GST_CMML_PACKET_UNKNOWN; gchar *data = (gchar *) GST_BUFFER_DATA (buffer); guint size = GST_BUFFER_SIZE (buffer); if (size >= 8 && !memcmp (data, "CMML\0\0\0\0", 8)) { packet_type = GST_CMML_PACKET_IDENT_HEADER; } else if (size >= 5) { if (!strncmp (data, "srcpad, GST_BUFFER_OFFSET_NONE, size, gst_static_pad_template_get_caps (&gst_cmml_dec_src_factory), buffer); if (res == GST_FLOW_OK) { if (data) memcpy (GST_BUFFER_DATA (*buffer), data, size); GST_BUFFER_TIMESTAMP (*buffer) = dec->timestamp; } else if (res == GST_FLOW_NOT_LINKED) { GST_DEBUG_OBJECT (dec, "alloc function return NOT-LINKED, ignoring"); } else { GST_WARNING_OBJECT (dec, "alloc function returned error %s", gst_flow_get_name (res)); } return res; } /* parses the first CMML packet (the ident header) */ static void gst_cmml_dec_parse_ident_header (GstCmmlDec * dec, GstBuffer * buffer) { guint8 *data = GST_BUFFER_DATA (buffer); /* the ident header has a fixed length */ if (GST_BUFFER_SIZE (buffer) != CMML_IDENT_HEADER_SIZE) { GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("wrong ident header size: %d", GST_BUFFER_SIZE (buffer))); dec->flow_return = GST_FLOW_ERROR; return; } data += 8; dec->major = GST_READ_UINT16_LE (data); data += 2; dec->minor = GST_READ_UINT16_LE (data); data += 2; dec->granulerate_n = GST_READ_UINT64_LE (data); data += 8; dec->granulerate_d = GST_READ_UINT64_LE (data); data += 8; dec->granuleshift = GST_READ_UINT8 (data); GST_INFO_OBJECT (dec, "bitstream initialized " "(major: %" G_GINT16_FORMAT " minor: %" G_GINT16_FORMAT " granulerate_n: %" G_GINT64_FORMAT " granulerate_d: %" G_GINT64_FORMAT " granuleshift: %d)", dec->major, dec->minor, dec->granulerate_n, dec->granulerate_d, dec->granuleshift); dec->flow_return = GST_FLOW_OK; } /* parses the first secondary header. * the first secondary header contains the xml version, the doctype and the * optional "cmml" processing instruction. */ static void gst_cmml_dec_parse_first_header (GstCmmlDec * dec, GstBuffer * buffer) { gst_cmml_dec_parse_xml (dec, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); /* if there is a processing instruction, gst_cmml_dec_parse_preamble * will be triggered. Otherwise we need to call it manually. */ if (dec->flow_return == GST_FLOW_OK && !dec->sent_root) { guchar *preamble = (guchar *) g_strndup ((gchar *) GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); gst_cmml_dec_parse_preamble (dec, preamble, (guchar *) ""); g_free (preamble); } } /* feeds data into the cmml parser. */ static void gst_cmml_dec_parse_xml (GstCmmlDec * dec, guchar * data, guint size) { GError *err = NULL; if (!gst_cmml_parser_parse_chunk (dec->parser, (gchar *) data, size, &err)) { GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("%s", err->message)); g_error_free (err); dec->flow_return = GST_FLOW_ERROR; } } static void gst_cmml_dec_parse_preamble (GstCmmlDec * dec, guchar * preamble, guchar * root_element) { GstBuffer *buffer; guchar *encoded_preamble; encoded_preamble = (guchar *) g_strconcat ((gchar *) preamble, (gchar *) root_element, NULL); /* send the root element to the internal parser */ gst_cmml_dec_parse_xml (dec, root_element, strlen ((gchar *) root_element)); dec->sent_root = TRUE; /* push the root element */ dec->flow_return = gst_cmml_dec_new_buffer (dec, encoded_preamble, strlen ((gchar *) encoded_preamble), &buffer); if (dec->flow_return == GST_FLOW_OK) { dec->flow_return = gst_pad_push (dec->srcpad, buffer); } if (dec->flow_return == GST_FLOW_OK) { GST_INFO_OBJECT (dec, "preamble parsed"); } g_free (encoded_preamble); return; } /* outputs the cmml head element and send TITLE and CMML_HEAD tags. * This callback is registered with dec->parser. It is called when the * head element is parsed. */ static void gst_cmml_dec_parse_head (GstCmmlDec * dec, GstCmmlTagHead * head) { GstTagList *tags; GValue str_val = { 0 }, title_val = { 0}; guchar *head_str; GstBuffer *buffer; GST_DEBUG_OBJECT (dec, "found CMML head (title: %s base: %s)", head->title, head->base); /* create the GST_TAG_TITLE tag */ g_value_init (&str_val, G_TYPE_STRING); g_value_init (&title_val, gst_tag_get_type (GST_TAG_TITLE)); g_value_set_string (&str_val, (gchar *) head->title); g_value_transform (&str_val, &title_val); tags = gst_tag_list_new (); gst_tag_list_add_values (tags, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, &title_val, NULL); gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_CMML_HEAD, head, NULL); gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, tags); g_value_unset (&str_val); g_value_unset (&title_val); head_str = gst_cmml_parser_tag_head_to_string (dec->parser, head); dec->flow_return = gst_cmml_dec_new_buffer (dec, head_str, strlen ((gchar *) head_str), &buffer); g_free (head_str); if (dec->flow_return == GST_FLOW_OK) dec->flow_return = gst_pad_push (dec->srcpad, buffer); if (dec->flow_return == GST_FLOW_NOT_LINKED) dec->flow_return = GST_FLOW_OK; /* Ignore NOT_LINKED */ } /* send a TAG_MESSAGE event for a clip */ static void gst_cmml_dec_send_clip_tag (GstCmmlDec * dec, GstCmmlTagClip * clip) { GstTagList *tags; GST_DEBUG_OBJECT (dec, "sending clip tag %s", clip->id); tags = gst_tag_list_new (); gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_CMML_CLIP, clip, NULL); gst_element_found_tags_for_pad (GST_ELEMENT (dec), dec->srcpad, tags); } /* push the string representation of a clip */ static void gst_cmml_dec_push_clip (GstCmmlDec * dec, GstCmmlTagClip * clip) { GstBuffer *buffer; guchar *clip_str; GST_DEBUG_OBJECT (dec, "pushing clip %s", clip->id); clip_str = gst_cmml_parser_tag_clip_to_string (dec->parser, clip); dec->flow_return = gst_cmml_dec_new_buffer (dec, clip_str, strlen ((gchar *) clip_str), &buffer); if (dec->flow_return == GST_FLOW_OK) dec->flow_return = gst_pad_push (dec->srcpad, buffer); if (dec->flow_return == GST_FLOW_NOT_LINKED) dec->flow_return = GST_FLOW_OK; /* Ignore NOT_LINKED */ g_free (clip_str); } /* decode a clip tag * this callback is registered with dec->parser. It is called whenever a * clip is parsed. */ static void gst_cmml_dec_parse_clip (GstCmmlDec * dec, GstCmmlTagClip * clip) { GstCmmlTagClip *prev_clip; dec->flow_return = GST_FLOW_OK; if (clip->empty) GST_INFO_OBJECT (dec, "parsing empty clip"); else GST_INFO_OBJECT (dec, "parsing clip (id: %s)", clip->id); clip->start_time = dec->timestamp; if (clip->start_time == GST_CLOCK_TIME_NONE) { GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), ("invalid clip start time")); dec->flow_return = GST_FLOW_ERROR; return; } /* get the last clip in the current track */ prev_clip = gst_cmml_track_list_get_track_last_clip (dec->tracks, (gchar *) clip->track); if (prev_clip) { /* output the previous clip */ if (clip->empty) /* the current clip marks the end of the previous one */ prev_clip->end_time = clip->start_time; gst_cmml_dec_push_clip (dec, prev_clip); } if (dec->wait_clip_end) { /* now it's time to send the tag for the previous clip */ if (prev_clip) { prev_clip->end_time = clip->start_time; gst_cmml_dec_send_clip_tag (dec, prev_clip); } } else if (!clip->empty) { /* send the tag for the current clip */ gst_cmml_dec_send_clip_tag (dec, clip); } if (prev_clip) gst_cmml_track_list_del_clip (dec->tracks, prev_clip); if (!clip->empty) if (!gst_cmml_track_list_has_clip (dec->tracks, clip)) gst_cmml_track_list_add_clip (dec->tracks, clip); } gboolean gst_cmml_dec_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "cmmldec", GST_RANK_PRIMARY, GST_TYPE_CMML_DEC)) return FALSE; GST_DEBUG_CATEGORY_INIT (cmmldec, "cmmldec", 0, "annodex CMML decoding element"); return TRUE; } gst-plugins-good-0.10.31/ext/annodex/gstannodex.c0000644000175000017500000001110111671175352016553 00000000000000/* * gstannodex.c - GStreamer annodex plugin * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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 #include #include "gstannodex.h" #include "gstcmmlparser.h" #include "gstcmmlenc.h" #include "gstcmmldec.h" GstClockTime gst_annodex_granule_to_time (gint64 granulepos, gint64 granulerate_n, gint64 granulerate_d, guint8 granuleshift) { gint64 keyindex, keyoffset; gint64 granulerate; GstClockTime res; g_return_val_if_fail (granuleshift <= 64, GST_CLOCK_TIME_NONE); if (granulepos == -1) return GST_CLOCK_TIME_NONE; if (granulepos == 0 || granulerate_n == 0 || granulerate_d == 0) return 0; if (granuleshift != 0 && granuleshift != 64) { keyindex = granulepos >> granuleshift; keyoffset = granulepos - (keyindex << granuleshift); granulepos = keyindex + keyoffset; } /* GST_SECOND / (granulerate_n / granulerate_d) */ granulerate = gst_util_uint64_scale (GST_SECOND, granulerate_d, granulerate_n); /* granulepos * granulerate */ res = gst_util_uint64_scale (granulepos, granulerate, 1); return res; } GValueArray * gst_annodex_parse_headers (const gchar * headers) { GValueArray *array; GValue val = { 0 }; gchar *header_name = NULL; gchar *header_value = NULL; gchar *line, *column, *space, *tmp; gchar **lines; gint i = 0; array = g_value_array_new (0); g_value_init (&val, G_TYPE_STRING); lines = g_strsplit (headers, "\r\n", 0); line = lines[i]; while (line != NULL && *line != '\0') { if (line[0] == '\t' || line[0] == ' ') { /* WSP: continuation line */ if (header_value == NULL) /* continuation line without a previous value */ goto fail; tmp = g_strjoin (" ", header_value, g_strstrip (line), NULL); g_free (header_value); header_value = tmp; } else { if (header_name) { g_value_take_string (&val, header_name); g_value_array_append (array, &val); g_value_take_string (&val, header_value); g_value_array_append (array, &val); } /* search the column starting from line[1] as an header name can't be * empty */ column = g_strstr_len (line + 1, strlen (line) - 1, ":"); if (column == NULL) /* bad syntax */ goto fail; if (*(space = column + 1) != ' ') /* bad syntax */ goto fail; header_name = g_strndup (line, column - line); header_value = g_strdup (space + 1); } line = lines[++i]; } if (header_name) { g_value_take_string (&val, header_name); g_value_array_append (array, &val); g_value_take_string (&val, header_value); g_value_array_append (array, &val); } g_value_unset (&val); g_strfreev (lines); return array; fail: GST_WARNING ("could not parse annodex headers"); g_free (header_name); g_free (header_value); g_strfreev (lines); g_value_array_free (array); g_value_unset (&val); return NULL; } static gboolean plugin_init (GstPlugin * plugin) { gst_tag_register (GST_TAG_CMML_STREAM, GST_TAG_FLAG_META, GST_TYPE_CMML_TAG_STREAM, "cmml-stream", "annodex CMML stream tag", NULL); gst_tag_register (GST_TAG_CMML_HEAD, GST_TAG_FLAG_META, GST_TYPE_CMML_TAG_HEAD, "cmml-head", "annodex CMML head tag", NULL); gst_tag_register (GST_TAG_CMML_CLIP, GST_TAG_FLAG_META, GST_TYPE_CMML_TAG_CLIP, "cmml-clip", "annodex CMML clip tag", NULL); gst_cmml_parser_init (); if (!gst_cmml_enc_plugin_init (plugin)) return FALSE; if (!gst_cmml_dec_plugin_init (plugin)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "annodex", "annodex stream manipulation (info about annodex: http://www.annodex.net)", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/ltmain.sh0000644000175000017500000105202211720560211013614 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 gst-plugins-good-0.10.31/config.rpath0000755000175000017500000004364711720560207014325 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2007 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix4* | aix5*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GStreamer Good Plug-ins' PACKAGE_TARNAME='gst-plugins-good' PACKAGE_VERSION='0.10.31' PACKAGE_STRING='GStreamer Good Plug-ins 0.10.31' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer' PACKAGE_URL='' ac_unique_file="gst/law/alaw.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS GST_PLUGIN_LDFLAGS GST_ALL_LDFLAGS GST_CXXFLAGS GST_LT_LDFLAGS GST_OPTION_CXXFLAGS GST_OPTION_CFLAGS DEPRECATED_CFLAGS PROFILE_CFLAGS USE_BZ2_FALSE USE_BZ2_TRUE BZ2_LIBS HAVE_BZ2 USE_ZLIB_FALSE USE_ZLIB_TRUE HAVE_ZLIB ZLIB_LIBS USE_WAVPACK_FALSE USE_WAVPACK_TRUE WAVPACK_LIBS WAVPACK_CFLAGS USE_TAGLIB_FALSE USE_TAGLIB_TRUE TAGLIB_CXXFLAGS TAGLIB_LIBS TAGLIB_CFLAGS USE_SPEEX_FALSE USE_SPEEX_TRUE HAVE_SPEEX SPEEX_LIBS SPEEX_CFLAGS USE_SOUP_FALSE USE_SOUP_TRUE SOUP_LIBS SOUP_CFLAGS USE_SHOUT2_FALSE USE_SHOUT2_TRUE SHOUT2_LIBS SHOUT2_CFLAGS USE_LIBIEC61883_FALSE USE_LIBIEC61883_TRUE USE_DV1394_FALSE USE_DV1394_TRUE DV1394_LIBS DV1394_CFLAGS HAVE_ROM1394 HAVE_AVC1394 LIBIEC61883_LIBS LIBIEC61883_CFLAGS RAW1394_LIBS RAW1394_CFLAGS USE_PULSE_FALSE USE_PULSE_TRUE PULSE_1_0_LIBS PULSE_1_0_CFLAGS PULSE_0_9_20_LIBS PULSE_0_9_20_CFLAGS PULSE_LIBS PULSE_CFLAGS USE_LIBPNG_FALSE USE_LIBPNG_TRUE LIBPNG_LIBS LIBPNG_CFLAGS USE_LIBDV_FALSE USE_LIBDV_TRUE LIBDV_LIBS LIBDV_CFLAGS USE_LIBCACA_FALSE USE_LIBCACA_TRUE LIBCACA_LIBS LIBCACA_CFLAGS USE_JPEG_FALSE USE_JPEG_TRUE JPEG_LIBS USE_JACK_FALSE USE_JACK_TRUE JACK_1_9_7_LIBS JACK_1_9_7_CFLAGS JACK_0_120_1_LIBS JACK_0_120_1_CFLAGS JACK_LIBS JACK_CFLAGS USE_HAL_FALSE USE_HAL_TRUE HAL_LIBS HAL_CFLAGS USE_GDK_PIXBUF_FALSE USE_GDK_PIXBUF_TRUE GDK_PIXBUF_LIBS GDK_PIXBUF_CFLAGS USE_GCONF_FALSE USE_GCONF_TRUE GCONF_LIBS GCONF_CFLAGS USE_FLAC_FALSE USE_FLAC_TRUE FLAC_LIBS FLAC_CFLAGS USE_ESD_FALSE USE_ESD_TRUE ESD_CONFIG ESD_LIBS ESD_CFLAGS USE_CAIRO_GOBJECT_FALSE USE_CAIRO_GOBJECT_TRUE CAIRO_GOBJECT_LIBS CAIRO_GOBJECT_CFLAGS USE_CAIRO_FALSE USE_CAIRO_TRUE CAIRO_LIBS CAIRO_CFLAGS USE_ANNODEX_FALSE USE_ANNODEX_TRUE ANNODEX_LIBS ANNODEX_CFLAGS USE_AALIB_FALSE USE_AALIB_TRUE AALIB_LIBS AALIB_CFLAGS AALIB_CONFIG USE_XVIDEO_FALSE USE_XVIDEO_TRUE USE_XSHM_FALSE USE_XSHM_TRUE XSHM_LIBS HAVE_XSHM USE_X_FALSE USE_X_TRUE HAVE_X XDAMAGE_LIBS XDAMAGE_CFLAGS XFIXES_LIBS XFIXES_CFLAGS X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF LIBV4L2_LIBS LIBV4L2_CFLAGS GUDEV_LIBS GUDEV_CFLAGS USE_GST_V4L2_FALSE USE_GST_V4L2_TRUE XVIDEO_LIBS USE_OSX_VIDEO_FALSE USE_OSX_VIDEO_TRUE USE_OSX_AUDIO_FALSE USE_OSX_AUDIO_TRUE USE_SUNAUDIO_FALSE USE_SUNAUDIO_TRUE USE_OSS4_FALSE USE_OSS4_TRUE USE_OSS_FALSE USE_OSS_TRUE USE_DIRECTSOUND_FALSE USE_DIRECTSOUND_TRUE HAVE_DIRECTSOUND DIRECTSOUND_LIBS DIRECTSOUND_LDFLAGS DIRECTSOUND_CFLAGS WIN32_LIBS USE_PLUGIN_Y4M_FALSE USE_PLUGIN_Y4M_TRUE USE_PLUGIN_WAVPARSE_FALSE USE_PLUGIN_WAVPARSE_TRUE USE_PLUGIN_WAVENC_FALSE USE_PLUGIN_WAVENC_TRUE USE_PLUGIN_VIDEOMIXER_FALSE USE_PLUGIN_VIDEOMIXER_TRUE USE_PLUGIN_VIDEOCROP_FALSE USE_PLUGIN_VIDEOCROP_TRUE USE_PLUGIN_VIDEOBOX_FALSE USE_PLUGIN_VIDEOBOX_TRUE USE_PLUGIN_UDP_FALSE USE_PLUGIN_UDP_TRUE USE_PLUGIN_SPECTRUM_FALSE USE_PLUGIN_SPECTRUM_TRUE USE_PLUGIN_SMPTE_FALSE USE_PLUGIN_SMPTE_TRUE USE_PLUGIN_SHAPEWIPE_FALSE USE_PLUGIN_SHAPEWIPE_TRUE USE_PLUGIN_RTSP_FALSE USE_PLUGIN_RTSP_TRUE USE_PLUGIN_RTPMANAGER_FALSE USE_PLUGIN_RTPMANAGER_TRUE USE_PLUGIN_RTP_FALSE USE_PLUGIN_RTP_TRUE USE_PLUGIN_REPLAYGAIN_FALSE USE_PLUGIN_REPLAYGAIN_TRUE USE_PLUGIN_MULTIPART_FALSE USE_PLUGIN_MULTIPART_TRUE USE_PLUGIN_MULTIFILE_FALSE USE_PLUGIN_MULTIFILE_TRUE USE_PLUGIN_MONOSCOPE_FALSE USE_PLUGIN_MONOSCOPE_TRUE USE_PLUGIN_MATROSKA_FALSE USE_PLUGIN_MATROSKA_TRUE USE_PLUGIN_LEVEL_FALSE USE_PLUGIN_LEVEL_TRUE USE_PLUGIN_LAW_FALSE USE_PLUGIN_LAW_TRUE USE_PLUGIN_ISOMP4_FALSE USE_PLUGIN_ISOMP4_TRUE USE_PLUGIN_IMAGEFREEZE_FALSE USE_PLUGIN_IMAGEFREEZE_TRUE USE_PLUGIN_GOOM2K1_FALSE USE_PLUGIN_GOOM2K1_TRUE USE_PLUGIN_GOOM_FALSE USE_PLUGIN_GOOM_TRUE USE_PLUGIN_FLX_FALSE USE_PLUGIN_FLX_TRUE USE_PLUGIN_INTERLEAVE_FALSE USE_PLUGIN_INTERLEAVE_TRUE USE_PLUGIN_ICYDEMUX_FALSE USE_PLUGIN_ICYDEMUX_TRUE USE_PLUGIN_ID3DEMUX_FALSE USE_PLUGIN_ID3DEMUX_TRUE USE_PLUGIN_FLV_FALSE USE_PLUGIN_FLV_TRUE USE_PLUGIN_EQUALIZER_FALSE USE_PLUGIN_EQUALIZER_TRUE USE_PLUGIN_EFFECTV_FALSE USE_PLUGIN_EFFECTV_TRUE USE_PLUGIN_DEINTERLACE_FALSE USE_PLUGIN_DEINTERLACE_TRUE USE_PLUGIN_DEBUGUTILS_FALSE USE_PLUGIN_DEBUGUTILS_TRUE USE_PLUGIN_CUTTER_FALSE USE_PLUGIN_CUTTER_TRUE USE_PLUGIN_AVI_FALSE USE_PLUGIN_AVI_TRUE USE_PLUGIN_AUTODETECT_FALSE USE_PLUGIN_AUTODETECT_TRUE USE_PLUGIN_AUPARSE_FALSE USE_PLUGIN_AUPARSE_TRUE USE_PLUGIN_AUDIOPARSERS_FALSE USE_PLUGIN_AUDIOPARSERS_TRUE USE_PLUGIN_AUDIOFX_FALSE USE_PLUGIN_AUDIOFX_TRUE USE_PLUGIN_APETAG_FALSE USE_PLUGIN_APETAG_TRUE USE_PLUGIN_ALPHA_FALSE USE_PLUGIN_ALPHA_TRUE USE_PLUGIN_VIDEOFILTER_FALSE USE_PLUGIN_VIDEOFILTER_TRUE DEFAULT_VISUALIZER DEFAULT_VIDEOSRC DEFAULT_VIDEOSINK DEFAULT_AUDIOSRC DEFAULT_AUDIOSINK GST_LEVEL_DEFAULT ERROR_CXXFLAGS WARNING_CXXFLAGS ERROR_CFLAGS WARNING_CFLAGS plugindir PLUGINDIR GST_LICENSE USE_GCONFTOOL_FALSE USE_GCONFTOOL_TRUE HAVE_GCONFTOOL GCONFTOOL HAVE_GTK_X11_FALSE HAVE_GTK_X11_TRUE HAVE_GTK_FALSE HAVE_GTK_TRUE GTK_X11_LIBS GTK_X11_CFLAGS GTK_LIBS GTK_CFLAGS GSTPB_PREFIX GST_PREFIX GLIB_PREFIX HAVE_GST_CHECK_FALSE HAVE_GST_CHECK_TRUE GSTPB_PLUGINS_DIR GST_PLUGINS_BASE_DIR GST_PLUGINS_BASE_LIBS GST_PLUGINS_BASE_CFLAGS GST_CHECK_LIBS GST_CHECK_CFLAGS GST_CONTROLLER_LIBS GST_CONTROLLER_CFLAGS GST_GDP_LIBS GST_GDP_CFLAGS GST_BASE_LIBS GST_BASE_CFLAGS GST_PLUGINS_DIR GST_TOOLS_DIR GST_LIBS GST_CFLAGS HAVE_ORCC_FALSE HAVE_ORCC_TRUE HAVE_ORC_FALSE HAVE_ORC_TRUE ORCC_FLAGS ORCC ORC_LIBS ORC_CFLAGS GIO_LIBS GIO_CFLAGS GLIB_EXTRA_CFLAGS GLIB_LIBS GLIB_CFLAGS GLIB_REQ GST_HAVE_MMAP_FALSE GST_HAVE_MMAP_TRUE HAVE_GCC_ASM_FALSE HAVE_GCC_ASM_TRUE HAVE_WINSOCK2_H_FALSE HAVE_WINSOCK2_H_TRUE LIBM ENABLE_PLUGIN_DOCS_FALSE ENABLE_PLUGIN_DOCS_TRUE pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_PLATFORM PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_VERSION PYTHON GTK_DOC_USE_LIBTOOL_FALSE GTK_DOC_USE_LIBTOOL_TRUE ENABLE_GTK_DOC_FALSE ENABLE_GTK_DOC_TRUE GTKDOC_CHECK HTML_DIR GCONF_SCHEMAS_INSTALL_FALSE GCONF_SCHEMAS_INSTALL_TRUE GCONF_SCHEMA_FILE_DIR GCONF_SCHEMA_CONFIG_SOURCE HAVE_VALGRIND_FALSE HAVE_VALGRIND_TRUE VALGRIND_PATH am__fastdepCCAS_FALSE am__fastdepCCAS_TRUE CCASDEPMODE CCAS am__fastdepOBJC_FALSE am__fastdepOBJC_TRUE OBJCDEPMODE OBJC_LDFLAGS ac_ct_OBJC OBJC HAVE_CXX CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXX HAVE_CPU_CRISV32_FALSE HAVE_CPU_CRISV32_TRUE HAVE_CPU_CRIS_FALSE HAVE_CPU_CRIS_TRUE HAVE_CPU_X86_64_FALSE HAVE_CPU_X86_64_TRUE HAVE_CPU_M68K_FALSE HAVE_CPU_M68K_TRUE HAVE_CPU_IA64_FALSE HAVE_CPU_IA64_TRUE HAVE_CPU_S390_FALSE HAVE_CPU_S390_TRUE HAVE_CPU_MIPS_FALSE HAVE_CPU_MIPS_TRUE HAVE_CPU_HPPA_FALSE HAVE_CPU_HPPA_TRUE HAVE_CPU_SPARC_FALSE HAVE_CPU_SPARC_TRUE HAVE_CPU_ARM_FALSE HAVE_CPU_ARM_TRUE HAVE_CPU_ALPHA_FALSE HAVE_CPU_ALPHA_TRUE HAVE_CPU_PPC64_FALSE HAVE_CPU_PPC64_TRUE HAVE_CPU_PPC_FALSE HAVE_CPU_PPC_TRUE HAVE_CPU_I386_FALSE HAVE_CPU_I386_TRUE BUILD_EXPERIMENTAL_FALSE BUILD_EXPERIMENTAL_TRUE USE_EXPERIMENTAL_FALSE USE_EXPERIMENTAL_TRUE BUILD_EXTERNAL_FALSE BUILD_EXTERNAL_TRUE USE_EXTERNAL_FALSE USE_EXTERNAL_TRUE GST_PLUGINS_SELECTED GST_PLUGINS_ALL GST_PACKAGE_ORIGIN GST_PACKAGE_NAME BUILD_EXAMPLES_FALSE BUILD_EXAMPLES_TRUE GST_GCOV_ENABLED_FALSE GST_GCOV_ENABLED_TRUE CCASFLAGS FFLAGS CXXFLAGS GCOV GCOV_LIBS GCOV_CFLAGS VALGRIND_LIBS VALGRIND_CFLAGS PKG_CONFIG LOCALEDIR GETTEXT_PACKAGE POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS ACLOCAL_AMFLAGS CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LIBTOOL OBJDUMP DLLTOOL AS GST_MAJORMINOR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V host_os host_vendor host_cpu host build_os build_vendor build_cpu build MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE PACKAGE_VERSION_RELEASE PACKAGE_VERSION_NANO PACKAGE_VERSION_MICRO PACKAGE_VERSION_MINOR PACKAGE_VERSION_MAJOR am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_silent_rules enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock with_autoconf with_autoheader with_automake with_aclocal enable_nls enable_rpath with_libiconv_prefix with_libintl_prefix enable_debug enable_profiling enable_valgrind enable_gcov enable_examples with_pkg_config_path with_package_name with_package_origin with_plugins enable_external enable_experimental with_gconf_source with_gconf_schema_file_dir enable_schemas_install with_html_dir enable_gtk_doc enable_gobject_cast_checks enable_glib_asserts enable_orc with_gtk enable_gconftool with_default_audiosink with_default_audiosrc with_default_videosink with_default_videosrc with_default_visualizer enable_videofilter enable_alpha enable_apetag enable_audiofx enable_audioparsers enable_auparse enable_autodetect enable_avi enable_cutter enable_debugutils enable_deinterlace enable_effectv enable_equalizer enable_flv enable_id3demux enable_icydemux enable_interleave enable_flx enable_goom enable_goom2k1 enable_imagefreeze enable_isomp4 enable_law enable_level enable_matroska enable_monoscope enable_multifile enable_multipart enable_replaygain enable_rtp enable_rtpmanager enable_rtsp enable_shapewipe enable_smpte enable_spectrum enable_udp enable_videobox enable_videocrop enable_videomixer enable_wavenc enable_wavparse enable_y4m enable_directsound enable_oss enable_oss4 enable_sunaudio enable_osx_audio enable_osx_video enable_gst_v4l2 with_gudev with_libv4l2 enable_x with_x enable_xshm enable_xvideo enable_aalib with_aalib_prefix with_aalib_exec_prefix enable_aalibtest enable_annodex enable_cairo enable_cairo_gobject enable_esd with_esd_prefix with_esd_exec_prefix enable_esdtest enable_flac enable_gconf enable_gdk_pixbuf enable_hal enable_jack enable_jpeg with_jpeg_mmx enable_libcaca enable_libdv enable_libpng enable_pulse enable_dv1394 enable_shout2 enable_soup enable_speex enable_taglib enable_wavpack enable_zlib enable_bz2 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG VALGRIND_CFLAGS VALGRIND_LIBS CXX CXXFLAGS CCC CXXCPP CCAS CCASFLAGS GLIB_CFLAGS GLIB_LIBS GIO_CFLAGS GIO_LIBS ORC_CFLAGS ORC_LIBS GST_CFLAGS GST_LIBS GST_BASE_CFLAGS GST_BASE_LIBS GST_GDP_CFLAGS GST_GDP_LIBS GST_CONTROLLER_CFLAGS GST_CONTROLLER_LIBS GST_CHECK_CFLAGS GST_CHECK_LIBS GST_PLUGINS_BASE_CFLAGS GST_PLUGINS_BASE_LIBS GTK_CFLAGS GTK_LIBS GTK_X11_CFLAGS GTK_X11_LIBS GUDEV_CFLAGS GUDEV_LIBS LIBV4L2_CFLAGS LIBV4L2_LIBS XMKMF XFIXES_CFLAGS XFIXES_LIBS XDAMAGE_CFLAGS XDAMAGE_LIBS ANNODEX_CFLAGS ANNODEX_LIBS CAIRO_CFLAGS CAIRO_LIBS CAIRO_GOBJECT_CFLAGS CAIRO_GOBJECT_LIBS ESD_CFLAGS ESD_LIBS FLAC_CFLAGS FLAC_LIBS GCONF_CFLAGS GCONF_LIBS GDK_PIXBUF_CFLAGS GDK_PIXBUF_LIBS HAL_CFLAGS HAL_LIBS JACK_CFLAGS JACK_LIBS JACK_0_120_1_CFLAGS JACK_0_120_1_LIBS JACK_1_9_7_CFLAGS JACK_1_9_7_LIBS LIBCACA_CFLAGS LIBCACA_LIBS LIBDV_CFLAGS LIBDV_LIBS LIBPNG_CFLAGS LIBPNG_LIBS PULSE_CFLAGS PULSE_LIBS PULSE_0_9_20_CFLAGS PULSE_0_9_20_LIBS PULSE_1_0_CFLAGS PULSE_1_0_LIBS RAW1394_CFLAGS RAW1394_LIBS LIBIEC61883_CFLAGS LIBIEC61883_LIBS SHOUT2_CFLAGS SHOUT2_LIBS SOUP_CFLAGS SOUP_LIBS SPEEX_CFLAGS SPEEX_LIBS TAGLIB_CFLAGS TAGLIB_LIBS WAVPACK_CFLAGS WAVPACK_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GStreamer Good Plug-ins 0.10.31 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gst-plugins-good] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GStreamer Good Plug-ins 0.10.31:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-libtool-lock avoid locking (might break parallel builds) --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --disable-debug disable addition of -g debugging info --enable-profiling adds -pg to compiler commandline, for profiling --disable-valgrind disable run-time valgrind detection --enable-gcov compile with coverage profiling instrumentation (gcc only) --disable-examples disable building examples --disable-external disable building of plug-ins with external deps --enable-experimental enable building of experimental plug-ins --disable-schemas-install Disable the schemas installation --enable-gtk-doc use gtk-doc to build documentation [[default=no]] --enable-gobject-cast-checks=[no/auto/yes] Enable GObject cast checks --enable-glib-asserts=[no/auto/yes] Enable GLib assertion --enable-orc use Orc if installed --disable-gconftool disable GConf schemas --disable-videofilter disable dependency-less videofilter plugin --disable-alpha disable dependency-less alpha plugin --disable-apetag disable dependency-less apetag plugin --disable-audiofx disable dependency-less audiofx plugin --disable-audioparsers disable dependency-less audioparsers plugin --disable-auparse disable dependency-less auparse plugin --disable-autodetect disable dependency-less autodetect plugin --disable-avi disable dependency-less avi plugin --disable-cutter disable dependency-less cutter plugin --disable-debugutils disable dependency-less debugutils plugin --disable-deinterlace disable dependency-less deinterlace plugin --disable-effectv disable dependency-less effectv plugin --disable-equalizer disable dependency-less equalizer plugin --disable-flv disable dependency-less flv plugin --disable-id3demux disable dependency-less id3demux plugin --disable-icydemux disable dependency-less icydemux plugin --disable-interleave disable dependency-less interleave plugin --disable-flx disable dependency-less flx plugin --disable-goom disable dependency-less goom plugin --disable-goom2k1 disable dependency-less goom2k1 plugin --disable-imagefreeze disable dependency-less imagefreeze plugin --disable-isomp4 disable dependency-less isomp4 plugin --disable-law disable dependency-less law plugin --disable-level disable dependency-less level plugin --disable-matroska disable dependency-less matroska plugin --disable-monoscope disable dependency-less monoscope plugin --disable-multifile disable dependency-less multifile plugin --disable-multipart disable dependency-less multipart plugin --disable-replaygain disable dependency-less replaygain plugin --disable-rtp disable dependency-less rtp plugin --disable-rtpmanager disable dependency-less rtpmanager plugin --disable-rtsp disable dependency-less rtsp plugin --disable-shapewipe disable dependency-less shapewipe plugin --disable-smpte disable dependency-less smpte plugin --disable-spectrum disable dependency-less spectrum plugin --disable-udp disable dependency-less udp plugin --disable-videobox disable dependency-less videobox plugin --disable-videocrop disable dependency-less videocrop plugin --disable-videomixer disable dependency-less videomixer plugin --disable-wavenc disable dependency-less wavenc plugin --disable-wavparse disable dependency-less wavparse plugin --disable-y4m disable dependency-less y4m plugin --disable-directsound disable DirectSound plug-in: directsoundsink --disable-oss disable OSS audio: ossaudio --disable-oss4 disable Open Sound System 4: oss4 --disable-sunaudio disable Sun Audio: sunaudio --disable-osx_audio disable OSX audio: osxaudio --disable-osx_video disable OSX video: osxvideosink --disable-gst_v4l2 disable Video 4 Linux 2: v4l2src --disable-x disable X libraries and plugins: ximagesrc --disable-xshm disable X Shared Memory extension --disable-xvideo disable X11 XVideo extensions --disable-aalib disable aalib ASCII Art library: aasink --disable-aalibtest do not try to compile and run a test AALIB program --disable-annodex disable XML library: annodex --disable-cairo disable Cairo graphics rendering: cairo --disable-cairo_gobject disable Cairo graphics rendering gobject bindings: cairooverlay --disable-esd disable ESounD sound daemon: esdsink --disable-esdtest do not try to compile and run a test ESD program --disable-flac disable FLAC lossless audio: flac --disable-gconf disable GConf libraries: gconfelements --disable-gdk_pixbuf disable GDK pixbuf: gdkpixbuf --disable-hal disable HAL libraries: halelements --disable-jack disable Jack: jack --disable-jpeg disable jpeg library: jpeg --disable-libcaca disable libcaca coloured ASCII art: cacasink --disable-libdv disable libdv DV demuxer/decoder: dv --disable-libpng disable Portable Network Graphics library: png --disable-pulse disable pulseaudio plug-in: pulseaudio --disable-dv1394 disable raw1394 and avc1394 library: 1394 --disable-shout2 disable Shoutcast/Icecast client library: shout2 --disable-soup disable soup http client plugin (2.4): souphttpsrc --disable-speex disable speex speech codec: speex --disable-taglib disable taglib tagging library: taglib --disable-wavpack disable wavpack plug-in: wavpack --disable-zlib disable zlib support for qtdemux/matroska --disable-bz2 disable bz2 library for matroska Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-autoconf use a different autoconf for regeneration of Makefiles --with-autoheader use a different autoheader for regeneration of Makefiles --with-automake use a different automake for regeneration of Makefiles --with-aclocal use a different aclocal for regeneration of Makefiles --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-pkg-config-path colon-separated list of pkg-config(1) dirs --with-package-name specify package name to use in plugins --with-package-origin specify package origin URL to use in plugins --with-plugins comma-separated list of dependencyless plug-ins to compile --with-gconf-source=sourceaddress Config database for installing schema files. --with-gconf-schema-file-dir=dir Directory for installing schema files. --with-html-dir=PATH path to installed docs --with-gtk=3.0|2.0 which gtk+ version to compile against (default: 2.0) --with-default-audiosink specify default audio sink --with-default-audiosrc specify default audio source --with-default-videosink specify default video sink --with-default-videosrc specify default video source --with-default-visualizer specify default visualizer --with-gudev device detection with gudev --with-libv4l2 support video buffer conversion using libv4l2 --with-x use the X Window System --with-aalib-prefix=PFX prefix where AALIB is installed (optional) --with-aalib-exec-prefix=PFX exec prefix where AALIB is installed (optional) --with-esd-prefix=PFX prefix where ESD is installed (optional) --with-esd-exec-prefix=PFX exec prefix where ESD is installed (optional) --with-jpeg-mmx, path to MMX'ified JPEG library Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility VALGRIND_CFLAGS C compiler flags for VALGRIND, overriding pkg-config VALGRIND_LIBS linker flags for VALGRIND, overriding pkg-config CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config GIO_CFLAGS C compiler flags for GIO, overriding pkg-config GIO_LIBS linker flags for GIO, overriding pkg-config ORC_CFLAGS C compiler flags for ORC, overriding pkg-config ORC_LIBS linker flags for ORC, overriding pkg-config GST_CFLAGS C compiler flags for GST, overriding pkg-config GST_LIBS linker flags for GST, overriding pkg-config GST_BASE_CFLAGS C compiler flags for GST_BASE, overriding pkg-config GST_BASE_LIBS linker flags for GST_BASE, overriding pkg-config GST_GDP_CFLAGS C compiler flags for GST_GDP, overriding pkg-config GST_GDP_LIBS linker flags for GST_GDP, overriding pkg-config GST_CONTROLLER_CFLAGS C compiler flags for GST_CONTROLLER, overriding pkg-config GST_CONTROLLER_LIBS linker flags for GST_CONTROLLER, overriding pkg-config GST_CHECK_CFLAGS C compiler flags for GST_CHECK, overriding pkg-config GST_CHECK_LIBS linker flags for GST_CHECK, overriding pkg-config GST_PLUGINS_BASE_CFLAGS C compiler flags for GST_PLUGINS_BASE, overriding pkg-config GST_PLUGINS_BASE_LIBS linker flags for GST_PLUGINS_BASE, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTK_X11_CFLAGS C compiler flags for GTK_X11, overriding pkg-config GTK_X11_LIBS linker flags for GTK_X11, overriding pkg-config GUDEV_CFLAGS C compiler flags for GUDEV, overriding pkg-config GUDEV_LIBS linker flags for GUDEV, overriding pkg-config LIBV4L2_CFLAGS C compiler flags for LIBV4L2, overriding pkg-config LIBV4L2_LIBS linker flags for LIBV4L2, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System XFIXES_CFLAGS C compiler flags for XFIXES, overriding pkg-config XFIXES_LIBS linker flags for XFIXES, overriding pkg-config XDAMAGE_CFLAGS C compiler flags for XDAMAGE, overriding pkg-config XDAMAGE_LIBS linker flags for XDAMAGE, overriding pkg-config ANNODEX_CFLAGS C compiler flags for ANNODEX, overriding pkg-config ANNODEX_LIBS linker flags for ANNODEX, overriding pkg-config CAIRO_CFLAGS C compiler flags for CAIRO, overriding pkg-config CAIRO_LIBS linker flags for CAIRO, overriding pkg-config CAIRO_GOBJECT_CFLAGS C compiler flags for CAIRO_GOBJECT, overriding pkg-config CAIRO_GOBJECT_LIBS linker flags for CAIRO_GOBJECT, overriding pkg-config ESD_CFLAGS C compiler flags for ESD, overriding pkg-config ESD_LIBS linker flags for ESD, overriding pkg-config FLAC_CFLAGS C compiler flags for FLAC, overriding pkg-config FLAC_LIBS linker flags for FLAC, overriding pkg-config GCONF_CFLAGS C compiler flags for GCONF, overriding pkg-config GCONF_LIBS linker flags for GCONF, overriding pkg-config GDK_PIXBUF_CFLAGS C compiler flags for GDK_PIXBUF, overriding pkg-config GDK_PIXBUF_LIBS linker flags for GDK_PIXBUF, overriding pkg-config HAL_CFLAGS C compiler flags for HAL, overriding pkg-config HAL_LIBS linker flags for HAL, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config JACK_0_120_1_CFLAGS C compiler flags for JACK_0_120_1, overriding pkg-config JACK_0_120_1_LIBS linker flags for JACK_0_120_1, overriding pkg-config JACK_1_9_7_CFLAGS C compiler flags for JACK_1_9_7, overriding pkg-config JACK_1_9_7_LIBS linker flags for JACK_1_9_7, overriding pkg-config LIBCACA_CFLAGS C compiler flags for LIBCACA, overriding pkg-config LIBCACA_LIBS linker flags for LIBCACA, overriding pkg-config LIBDV_CFLAGS C compiler flags for LIBDV, overriding pkg-config LIBDV_LIBS linker flags for LIBDV, overriding pkg-config LIBPNG_CFLAGS C compiler flags for LIBPNG, overriding pkg-config LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config PULSE_CFLAGS C compiler flags for PULSE, overriding pkg-config PULSE_LIBS linker flags for PULSE, overriding pkg-config PULSE_0_9_20_CFLAGS C compiler flags for PULSE_0_9_20, overriding pkg-config PULSE_0_9_20_LIBS linker flags for PULSE_0_9_20, overriding pkg-config PULSE_1_0_CFLAGS C compiler flags for PULSE_1_0, overriding pkg-config PULSE_1_0_LIBS linker flags for PULSE_1_0, overriding pkg-config RAW1394_CFLAGS C compiler flags for RAW1394, overriding pkg-config RAW1394_LIBS linker flags for RAW1394, overriding pkg-config LIBIEC61883_CFLAGS C compiler flags for LIBIEC61883, overriding pkg-config LIBIEC61883_LIBS linker flags for LIBIEC61883, overriding pkg-config SHOUT2_CFLAGS C compiler flags for SHOUT2, overriding pkg-config SHOUT2_LIBS linker flags for SHOUT2, overriding pkg-config SOUP_CFLAGS C compiler flags for SOUP, overriding pkg-config SOUP_LIBS linker flags for SOUP, overriding pkg-config SPEEX_CFLAGS C compiler flags for SPEEX, overriding pkg-config SPEEX_LIBS linker flags for SPEEX, overriding pkg-config TAGLIB_CFLAGS C compiler flags for TAGLIB, overriding pkg-config TAGLIB_LIBS linker flags for TAGLIB, overriding pkg-config WAVPACK_CFLAGS C compiler flags for WAVPACK, overriding pkg-config WAVPACK_LIBS linker flags for WAVPACK, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GStreamer Good Plug-ins configure 0.10.31 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------------------------------ ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer ## ## ------------------------------------------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GStreamer Good Plug-ins $as_me 0.10.31, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gst-plugins-good' VERSION='0.10.31' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' PACKAGE_VERSION_MAJOR=$(echo 0.10.31 | cut -d'.' -f1) PACKAGE_VERSION_MINOR=$(echo 0.10.31 | cut -d'.' -f2) PACKAGE_VERSION_MICRO=$(echo 0.10.31 | cut -d'.' -f3) { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5 $as_echo_n "checking nano version... " >&6; } NANO=$(echo 0.10.31 | cut -d'.' -f4) if test x"$NANO" = x || test "x$NANO" = "x0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5 $as_echo "0 (release)" >&6; } NANO=0 PACKAGE_VERSION_RELEASE=1 GST_GIT="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NANO" >&5 $as_echo "$NANO" >&6; } PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` if test "x$NANO" != "x1" ; then GST_GIT="no" else GST_GIT="yes" fi fi PACKAGE_VERSION_NANO=$NANO ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' GST_MAJORMINOR=$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR GST_MAJORMINOR=0.10 case $host_os in cygwin* | mingw*) lt_cv_deplibs_check_method=pass_all ;; esac enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: GST_REQ=0.10.36 GSTPB_REQ=0.10.36 # Check whether --with-autoconf was given. if test "${with_autoconf+set}" = set; then : withval=$with_autoconf; unset AUTOCONF AUTOCONF=${AUTOCONF-"${am_missing_run}${withval}"} { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOCONF as autoconf" >&5 $as_echo "$as_me: Using $AUTOCONF as autoconf" >&6;} fi # Check whether --with-autoheader was given. if test "${with_autoheader+set}" = set; then : withval=$with_autoheader; unset AUTOHEADER AUTOHEADER=${AUTOHEADER-"${am_missing_run}${withval}"} { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOHEADER as autoheader" >&5 $as_echo "$as_me: Using $AUTOHEADER as autoheader" >&6;} fi # Check whether --with-automake was given. if test "${with_automake+set}" = set; then : withval=$with_automake; unset AUTOMAKE AUTOMAKE=${AUTOMAKE-"${am_missing_run}${withval}"} { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOMAKE as automake" >&5 $as_echo "$as_me: Using $AUTOMAKE as automake" >&6;} fi # Check whether --with-aclocal was given. if test "${with_aclocal+set}" = set; then : withval=$with_aclocal; unset ACLOCAL ACLOCAL=${ACLOCAL-"${am_missing_run}${withval}"} { $as_echo "$as_me:${as_lineno-$LINENO}: Using $ACLOCAL as aclocal" >&5 $as_echo "$as_me: Using $ACLOCAL as aclocal" >&6;} fi ACLOCAL_AMFLAGS="-I m4 -I common/m4" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.17 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBICONV_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBINTL_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" if test "$USE_NLS" = "yes"; then GETTEXT_PACKAGE=gst-plugins-good-$GST_MAJORMINOR else GETTEXT_PACKAGE=NULL fi cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF EXP_VAR=LOCALEDIR FROM_VAR=$datadir/locale prefix_save=$prefix exec_prefix_save=$exec_prefix if test "x$prefix" = "xNONE"; then prefix="$ac_default_prefix" fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var" = "x$full_var"; then break; fi full_var=$new_full_var done full_var=$new_full_var LOCALEDIR="$full_var" prefix=$prefix_save exec_prefix=$exec_prefix_save cat >>confdefs.h <<_ACEOF #define LOCALEDIR "$LOCALEDIR" _ACEOF # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) USE_DEBUG=yes ;; no) USE_DEBUG=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else USE_DEBUG=yes fi # Check whether --enable-profiling was given. if test "${enable_profiling+set}" = set; then : enableval=$enable_profiling; case "${enableval}" in yes) USE_PROFILING=yes ;; no) USE_PROFILING=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-profiling" "$LINENO" 5 ;; esac else USE_PROFILING=no fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check whether --enable-valgrind was given. if test "${enable_valgrind+set}" = set; then : enableval=$enable_valgrind; case "${enableval}" in yes) USE_VALGRIND="$USE_DEBUG" ;; no) USE_VALGRIND=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-valgrind" "$LINENO" 5 ;; esac else USE_VALGRIND="$USE_DEBUG" fi VALGRIND_REQ="3.0" if test "x$USE_VALGRIND" = xyes; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5 $as_echo_n "checking for VALGRIND... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$VALGRIND_CFLAGS"; then pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind >= \$VALGRIND_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "valgrind >= $VALGRIND_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind >= $VALGRIND_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$VALGRIND_LIBS"; then pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind >= \$VALGRIND_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "valgrind >= $VALGRIND_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind >= $VALGRIND_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "valgrind >= $VALGRIND_REQ"` else VALGRIND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "valgrind >= $VALGRIND_REQ"` fi # Put the nasty error message in config.log where it belongs echo "$VALGRIND_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } USE_VALGRIND="no" elif test $pkg_failed = untried; then USE_VALGRIND="no" else VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } USE_VALGRIND="yes" fi fi if test "x$USE_VALGRIND" = xyes; then $as_echo "#define HAVE_VALGRIND 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: Using extra code paths for valgrind" >&5 $as_echo "$as_me: Using extra code paths for valgrind" >&6;} fi # Check whether --enable-gcov was given. if test "${enable_gcov+set}" = set; then : enableval=$enable_gcov; enable_gcov=$enableval else enable_gcov=no fi if test x$enable_gcov = xyes ; then if test "x$GCC" != "xyes" then as_fn_error $? "gcov only works if gcc is used" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands \"-fprofile-arcs\"" >&5 $as_echo_n "checking to see if compiler understands \"-fprofile-arcs\"... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS "-fprofile-arcs"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs" true else true true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands \"-ftest-coverage\"" >&5 $as_echo_n "checking to see if compiler understands \"-ftest-coverage\"... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS "-ftest-coverage"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage" true else true true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[0-9]*//g'` GCOV_LIBS=-lgcov GCOV=`echo $CC | sed s/gcc/gcov/g` GST_GCOV_ENABLED=yes cat >>confdefs.h <<_ACEOF #define GST_GCOV_ENABLED 1 _ACEOF if test "x$GST_GCOV_ENABLED" = "xyes" then CFLAGS="-O0" CXXFLAGS="-O0" FFLAGS="-O0" CCASFLAGS="-O0" { $as_echo "$as_me:${as_lineno-$LINENO}: gcov enabled, setting CFLAGS and friends to $CFLAGS" >&5 $as_echo "$as_me: gcov enabled, setting CFLAGS and friends to $CFLAGS" >&6;} fi fi if test x$enable_gcov = xyes; then GST_GCOV_ENABLED_TRUE= GST_GCOV_ENABLED_FALSE='#' else GST_GCOV_ENABLED_TRUE='#' GST_GCOV_ENABLED_FALSE= fi # Check whether --enable-examples was given. if test "${enable_examples+set}" = set; then : enableval=$enable_examples; case "${enableval}" in yes) BUILD_EXAMPLES=yes ;; no) BUILD_EXAMPLES=no ;; *) as_fn_error $? "bad value ${enableval} for --disable-examples" "$LINENO" 5 ;; esac else BUILD_EXAMPLES=yes fi if test "x$BUILD_EXAMPLES" = "xyes"; then BUILD_EXAMPLES_TRUE= BUILD_EXAMPLES_FALSE='#' else BUILD_EXAMPLES_TRUE='#' BUILD_EXAMPLES_FALSE= fi # Check whether --with-pkg-config-path was given. if test "${with_pkg_config_path+set}" = set; then : withval=$with_pkg_config_path; export PKG_CONFIG_PATH=${withval} { $as_echo "$as_me:${as_lineno-$LINENO}: Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH" >&5 $as_echo "$as_me: Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH" >&6;} fi # Check whether --with-package-name was given. if test "${with_package_name+set}" = set; then : withval=$with_package_name; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-package-name" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-package-name" "$LINENO" 5 ;; *) GST_PACKAGE_NAME="${withval}" ;; esac else P= if test "x$P" = "x" then P=$PACKAGE_NAME fi if test "x$PACKAGE_VERSION_NANO" = "x0" then GST_PACKAGE_NAME="$P source release" else if test "x$PACKAGE_VERSION_NANO" = "x1" then GST_PACKAGE_NAME="$P git" else GST_PACKAGE_NAME="$P prerelease" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_PACKAGE_NAME as package name" >&5 $as_echo "$as_me: Using $GST_PACKAGE_NAME as package name" >&6;} cat >>confdefs.h <<_ACEOF #define GST_PACKAGE_NAME "$GST_PACKAGE_NAME" _ACEOF # Check whether --with-package-origin was given. if test "${with_package_origin+set}" = set; then : withval=$with_package_origin; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-package-origin" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-package-origin" "$LINENO" 5 ;; *) GST_PACKAGE_ORIGIN="${withval}" ;; esac else GST_PACKAGE_ORIGIN="Unknown package origin" fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_PACKAGE_ORIGIN as package origin" >&5 $as_echo "$as_me: Using $GST_PACKAGE_ORIGIN as package origin" >&6;} cat >>confdefs.h <<_ACEOF #define GST_PACKAGE_ORIGIN "$GST_PACKAGE_ORIGIN" _ACEOF # Check whether --with-plugins was given. if test "${with_plugins+set}" = set; then : withval=$with_plugins; WITH_PLUGINS=$withval else WITH_PLUGINS= fi GST_PLUGINS_ALL="" GST_PLUGINS_SELECTED="" echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: building of plug-ins with external deps ***" >&5 $as_echo "$as_me: *** checking feature: building of plug-ins with external deps ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_EXTERNAL" = "xno"; then NOUSE="yes" fi # Check whether --enable-external was given. if test "${enable_external+set}" = set; then : enableval=$enable_external; case "${enableval}" in yes) USE_EXTERNAL=yes;; no) USE_EXTERNAL=no;; *) as_fn_error $? "bad value ${enableval} for --enable-external" "$LINENO" 5 ;; esac else USE_EXTERNAL=yes fi if test "x$NOUSE" = "xyes"; then USE_EXTERNAL="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_EXTERNAL = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_EXTERNAL=no HAVE_EXTERNAL=yes LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_EXTERNAL = xno; then USE_EXTERNAL=no else : fi fi if test x$USE_EXTERNAL = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: building external plug-ins" >&5 $as_echo "$as_me: building external plug-ins" >&6;} BUILD_EXTERNAL="yes" if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_EXTERNAL /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: all plug-ins with external dependencies will not be built" >&5 $as_echo "$as_me: WARNING: all plug-ins with external dependencies will not be built" >&2;} BUILD_EXTERNAL="no" fi if test x$USE_EXTERNAL = xyes; then USE_EXTERNAL_TRUE= USE_EXTERNAL_FALSE='#' else USE_EXTERNAL_TRUE='#' USE_EXTERNAL_FALSE= fi # make BUILD_EXTERNAL available to Makefile.am if test "x$BUILD_EXTERNAL" = "xyes"; then BUILD_EXTERNAL_TRUE= BUILD_EXTERNAL_FALSE='#' else BUILD_EXTERNAL_TRUE='#' BUILD_EXTERNAL_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: building of experimental plug-ins ***" >&5 $as_echo "$as_me: *** checking feature: building of experimental plug-ins ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_EXPERIMENTAL" = "xno"; then NOUSE="yes" fi # Check whether --enable-experimental was given. if test "${enable_experimental+set}" = set; then : enableval=$enable_experimental; case "${enableval}" in yes) USE_EXPERIMENTAL=yes;; no) USE_EXPERIMENTAL=no;; *) as_fn_error $? "bad value ${enableval} for --enable-experimental" "$LINENO" 5 ;; esac else USE_EXPERIMENTAL=no fi if test "x$NOUSE" = "xyes"; then USE_EXPERIMENTAL="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_EXPERIMENTAL = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_EXPERIMENTAL=no HAVE_EXPERIMENTAL=yes LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_EXPERIMENTAL = xno; then USE_EXPERIMENTAL=no else : fi fi if test x$USE_EXPERIMENTAL = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: building experimental plug-ins" >&5 $as_echo "$as_me: WARNING: building experimental plug-ins" >&2;} BUILD_EXPERIMENTAL="yes" if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_EXPERIMENTAL /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi { $as_echo "$as_me:${as_lineno-$LINENO}: not building experimental plug-ins" >&5 $as_echo "$as_me: not building experimental plug-ins" >&6;} BUILD_EXPERIMENTAL="no" fi if test x$USE_EXPERIMENTAL = xyes; then USE_EXPERIMENTAL_TRUE= USE_EXPERIMENTAL_FALSE='#' else USE_EXPERIMENTAL_TRUE='#' USE_EXPERIMENTAL_FALSE= fi # make BUILD_EXPERIMENTAL available to Makefile.am if test "x$BUILD_EXPERIMENTAL" = "xyes"; then BUILD_EXPERIMENTAL_TRUE= BUILD_EXPERIMENTAL_FALSE='#' else BUILD_EXPERIMENTAL_TRUE='#' BUILD_EXPERIMENTAL_FALSE= fi case "x${host_cpu}" in xi?86 | xk? | xi?86_64) case $host_os in solaris*) ac_fn_c_check_decl "$LINENO" "__i386" "ac_cv_have_decl___i386" "$ac_includes_default" if test "x$ac_cv_have_decl___i386" = xyes; then : I386_ABI="yes" else I386_ABI="no" fi ac_fn_c_check_decl "$LINENO" "__amd64" "ac_cv_have_decl___amd64" "$ac_includes_default" if test "x$ac_cv_have_decl___amd64" = xyes; then : AMD64_ABI="yes" else AMD64_ABI="no" fi if test "x$I386_ABI" = "xyes" ; then HAVE_CPU_I386=yes $as_echo "#define HAVE_CPU_I386 1" >>confdefs.h fi if test "x$AMD64_ABI" = "xyes" ; then HAVE_CPU_X86_64=yes $as_echo "#define HAVE_CPU_X86_64 1" >>confdefs.h fi ;; *) HAVE_CPU_I386=yes $as_echo "#define HAVE_CPU_I386 1" >>confdefs.h case "x${host_cpu}" in xi386 | xi486) ;; *) $as_echo "#define HAVE_RDTSC 1" >>confdefs.h ;; esac ;; esac ;; xpowerpc) HAVE_CPU_PPC=yes $as_echo "#define HAVE_CPU_PPC 1" >>confdefs.h ;; xpowerpc64) HAVE_CPU_PPC64=yes $as_echo "#define HAVE_CPU_PPC64 1" >>confdefs.h ;; xalpha*) HAVE_CPU_ALPHA=yes $as_echo "#define HAVE_CPU_ALPHA 1" >>confdefs.h ;; xarm*) HAVE_CPU_ARM=yes $as_echo "#define HAVE_CPU_ARM 1" >>confdefs.h ;; xsparc*) HAVE_CPU_SPARC=yes $as_echo "#define HAVE_CPU_SPARC 1" >>confdefs.h ;; xmips*) HAVE_CPU_MIPS=yes $as_echo "#define HAVE_CPU_MIPS 1" >>confdefs.h ;; xhppa*) HAVE_CPU_HPPA=yes $as_echo "#define HAVE_CPU_HPPA 1" >>confdefs.h ;; xs390*) HAVE_CPU_S390=yes $as_echo "#define HAVE_CPU_S390 1" >>confdefs.h ;; xia64*) HAVE_CPU_IA64=yes $as_echo "#define HAVE_CPU_IA64 1" >>confdefs.h ;; xm68k*) HAVE_CPU_M68K=yes $as_echo "#define HAVE_CPU_M68K 1" >>confdefs.h ;; xx86_64) HAVE_CPU_X86_64=yes $as_echo "#define HAVE_CPU_X86_64 1" >>confdefs.h ;; xcris) HAVE_CPU_CRIS=yes $as_echo "#define HAVE_CPU_CRIS 1" >>confdefs.h ;; xcrisv32) HAVE_CPU_CRISV32=yes $as_echo "#define HAVE_CPU_CRISV32 1" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "x$HAVE_CPU_I386" = "xyes"; then HAVE_CPU_I386_TRUE= HAVE_CPU_I386_FALSE='#' else HAVE_CPU_I386_TRUE='#' HAVE_CPU_I386_FALSE= fi if test "x$HAVE_CPU_PPC" = "xyes"; then HAVE_CPU_PPC_TRUE= HAVE_CPU_PPC_FALSE='#' else HAVE_CPU_PPC_TRUE='#' HAVE_CPU_PPC_FALSE= fi if test "x$HAVE_CPU_PPC64" = "xyes"; then HAVE_CPU_PPC64_TRUE= HAVE_CPU_PPC64_FALSE='#' else HAVE_CPU_PPC64_TRUE='#' HAVE_CPU_PPC64_FALSE= fi if test "x$HAVE_CPU_ALPHA" = "xyes"; then HAVE_CPU_ALPHA_TRUE= HAVE_CPU_ALPHA_FALSE='#' else HAVE_CPU_ALPHA_TRUE='#' HAVE_CPU_ALPHA_FALSE= fi if test "x$HAVE_CPU_ARM" = "xyes"; then HAVE_CPU_ARM_TRUE= HAVE_CPU_ARM_FALSE='#' else HAVE_CPU_ARM_TRUE='#' HAVE_CPU_ARM_FALSE= fi if test "x$HAVE_CPU_SPARC" = "xyes"; then HAVE_CPU_SPARC_TRUE= HAVE_CPU_SPARC_FALSE='#' else HAVE_CPU_SPARC_TRUE='#' HAVE_CPU_SPARC_FALSE= fi if test "x$HAVE_CPU_HPPA" = "xyes"; then HAVE_CPU_HPPA_TRUE= HAVE_CPU_HPPA_FALSE='#' else HAVE_CPU_HPPA_TRUE='#' HAVE_CPU_HPPA_FALSE= fi if test "x$HAVE_CPU_MIPS" = "xyes"; then HAVE_CPU_MIPS_TRUE= HAVE_CPU_MIPS_FALSE='#' else HAVE_CPU_MIPS_TRUE='#' HAVE_CPU_MIPS_FALSE= fi if test "x$HAVE_CPU_S390" = "xyes"; then HAVE_CPU_S390_TRUE= HAVE_CPU_S390_FALSE='#' else HAVE_CPU_S390_TRUE='#' HAVE_CPU_S390_FALSE= fi if test "x$HAVE_CPU_IA64" = "xyes"; then HAVE_CPU_IA64_TRUE= HAVE_CPU_IA64_FALSE='#' else HAVE_CPU_IA64_TRUE='#' HAVE_CPU_IA64_FALSE= fi if test "x$HAVE_CPU_M68K" = "xyes"; then HAVE_CPU_M68K_TRUE= HAVE_CPU_M68K_FALSE='#' else HAVE_CPU_M68K_TRUE='#' HAVE_CPU_M68K_FALSE= fi if test "x$HAVE_CPU_X86_64" = "xyes"; then HAVE_CPU_X86_64_TRUE= HAVE_CPU_X86_64_FALSE='#' else HAVE_CPU_X86_64_TRUE='#' HAVE_CPU_X86_64_FALSE= fi if test "x$HAVE_CPU_CRIS" = "xyes"; then HAVE_CPU_CRIS_TRUE= HAVE_CPU_CRIS_FALSE='#' else HAVE_CPU_CRIS_TRUE='#' HAVE_CPU_CRIS_FALSE= fi if test "x$HAVE_CPU_CRISV32" = "xyes"; then HAVE_CPU_CRISV32_TRUE= HAVE_CPU_CRISV32_FALSE='#' else HAVE_CPU_CRISV32_TRUE='#' HAVE_CPU_CRISV32_FALSE= fi cat >>confdefs.h <<_ACEOF #define HOST_CPU "$host_cpu" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi case $ac_cv_prog_cc_stdc in #( no) : ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 else ac_cv_prog_cc_stdc=no fi fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 $as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } if ${ac_cv_prog_cc_stdc+:} false; then : $as_echo_n "(cached) " >&6 fi case $ac_cv_prog_cc_stdc in #( no) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; #( '') : { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 $as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; esac ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Extract the first word of "$CXX", so it can be a program name with args. set dummy $CXX; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HAVE_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAVE_CXX"; then ac_cv_prog_HAVE_CXX="$HAVE_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HAVE_CXX="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HAVE_CXX" && ac_cv_prog_HAVE_CXX="no" fi fi HAVE_CXX=$ac_cv_prog_HAVE_CXX if test -n "$HAVE_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX" >&5 $as_echo "$HAVE_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in objcc objc gcc cc CC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJC"; then ac_cv_prog_OBJC="$OBJC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJC=$ac_cv_prog_OBJC if test -n "$OBJC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5 $as_echo "$OBJC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OBJC" && break done fi if test -z "$OBJC"; then ac_ct_OBJC=$OBJC for ac_prog in objcc objc gcc cc CC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJC"; then ac_cv_prog_ac_ct_OBJC="$ac_ct_OBJC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC if test -n "$ac_ct_OBJC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5 $as_echo "$ac_ct_OBJC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_OBJC" && break done if test "x$ac_ct_OBJC" = x; then OBJC="none" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJC=$ac_ct_OBJC fi fi OBJC_LDFLAGS="-lobjc" if test "x$OBJC" != xnone ; then depcc="$OBJC" am_compiler_list='gcc3 gcc' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_OBJC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_OBJC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_OBJC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_OBJC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5 $as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; } OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then am__fastdepOBJC_TRUE= am__fastdepOBJC_FALSE='#' else am__fastdepOBJC_TRUE='#' am__fastdepOBJC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Objective C compiler works" >&5 $as_echo_n "checking if Objective C compiler works... " >&6; } cat >>conftest.m < @interface Moo:Object { } - moo; int main(); @end @implementation Moo - moo { exit(0); } int main() { id moo; moo = [Moo new]; [moo moo]; return 1; } @end EOF ${OBJC} conftest.m ${OBJC_LDFLAGS} >&5 2>&5 if test -f a.out -o -f a.exe ; then result=yes else result=no echo failed program is: >&5 cat conftest.m >&5 fi rm -f conftest.m a.out a.exe { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 $as_echo "$result" >&6; } else depcc="$OBJC" am_compiler_list='gcc3 gcc' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_OBJC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_OBJC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_OBJC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_OBJC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5 $as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; } OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then am__fastdepOBJC_TRUE= am__fastdepOBJC_FALSE='#' else am__fastdepOBJC_TRUE='#' am__fastdepOBJC_FALSE= fi fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS depcc="$CCAS" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CCAS_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CCAS_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CCAS_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 $as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then am__fastdepCCAS_TRUE= am__fastdepCCAS_FALSE='#' else am__fastdepCCAS_TRUE='#' am__fastdepCCAS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working do while(0) macros" >&5 $as_echo_n "checking for working do while(0) macros... " >&6; } if ${_cv_g_support_dowhile_macros+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #define STMT_START do #define STMT_END while(0) #define STMT_TEST STMT_START { i = 0; } STMT_END int main(void) { int i = 1; STMT_TEST; return i; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : _cv_g_support_dowhile_macros=yes else _cv_g_support_dowhile_macros=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_g_support_dowhile_macros" >&5 $as_echo "$_cv_g_support_dowhile_macros" >&6; } if test x$_cv_g_support_dowhile_macros = xyes; then $as_echo "#define HAVE_DOWHILE_MACROS 1" >>confdefs.h fi # Extract the first word of "valgrind", so it can be a program name with args. set dummy valgrind; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_VALGRIND_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $VALGRIND_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_VALGRIND_PATH="$VALGRIND_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_VALGRIND_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_VALGRIND_PATH" && ac_cv_path_VALGRIND_PATH="no" ;; esac fi VALGRIND_PATH=$ac_cv_path_VALGRIND_PATH if test -n "$VALGRIND_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND_PATH" >&5 $as_echo "$VALGRIND_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test ! "x$VALGRIND_PATH" = "xno"; then HAVE_VALGRIND_TRUE= HAVE_VALGRIND_FALSE='#' else HAVE_VALGRIND_TRUE='#' HAVE_VALGRIND_FALSE= fi if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi # Check whether --with-gconf-source was given. if test "${with_gconf_source+set}" = set; then : withval=$with_gconf_source; GCONF_SCHEMA_CONFIG_SOURCE="$withval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&5 $as_echo "Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&6; } if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' fi # Check whether --with-gconf-schema-file-dir was given. if test "${with_gconf_schema_file_dir+set}" = set; then : withval=$with_gconf_schema_file_dir; GCONF_SCHEMA_FILE_DIR="$withval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&5 $as_echo "Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&6; } # Check whether --enable-schemas-install was given. if test "${enable_schemas_install+set}" = set; then : enableval=$enable_schemas_install; case "${enableval}" in yes) schemas_install=true ;; no) schemas_install=false ;; *) as_fn_error $? "bad value ${enableval} for --disable-schemas-install" "$LINENO" 5 ;; esac else schemas_install=true fi if test x$schemas_install = xtrue; then GCONF_SCHEMAS_INSTALL_TRUE= GCONF_SCHEMAS_INSTALL_FALSE='#' else GCONF_SCHEMAS_INSTALL_TRUE='#' GCONF_SCHEMAS_INSTALL_FALSE= fi # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; else with_html_dir='${datadir}/gtk-doc/html' fi HTML_DIR="$with_html_dir" # Check whether --enable-gtk-doc was given. if test "${enable_gtk_doc+set}" = set; then : enableval=$enable_gtk_doc; else enable_gtk_doc=no fi if test x$enable_gtk_doc = xyes; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.3\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : else as_fn_error $? "You need to have gtk-doc >= 1.3 installed to build gtk-doc" "$LINENO" 5 fi if test -z "$SED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 $as_echo_n "checking whether to build gtk-doc documentation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 $as_echo "$enable_gtk_doc" >&6; } for ac_prog in gtkdoc-check do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_CHECK+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_CHECK in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK if test -n "$GTKDOC_CHECK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 $as_echo "$GTKDOC_CHECK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GTKDOC_CHECK" && break done if test x$enable_gtk_doc = xyes; then ENABLE_GTK_DOC_TRUE= ENABLE_GTK_DOC_FALSE='#' else ENABLE_GTK_DOC_TRUE='#' ENABLE_GTK_DOC_FALSE= fi if test -n "$LIBTOOL"; then GTK_DOC_USE_LIBTOOL_TRUE= GTK_DOC_USE_LIBTOOL_FALSE='#' else GTK_DOC_USE_LIBTOOL_TRUE='#' GTK_DOC_USE_LIBTOOL_FALSE= fi PYTHON_CANDIDATES="python python2.2 python2.1 python2.0 python2 \ python1.6 python1.5" { $as_echo "$as_me:${as_lineno-$LINENO}: Looking for Python version >= 2.1" >&5 $as_echo "$as_me: Looking for Python version >= 2.1" >&6;} prog=" import sys, string minver = '2.1' # split string by '.' and convert to numeric minver_info = map(string.atoi, string.split(minver, '.')) # we can now do comparisons on the two lists: if sys.version_info >= tuple(minver_info): sys.exit(0) else: sys.exit(1)" python_good=false for python_candidate in $PYTHON_CANDIDATES; do unset PYTHON # Extract the first word of "$python_candidate", so it can be a program name with args. set dummy $python_candidate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 1> /dev/null 2> /dev/null if test "x$PYTHON" = "x"; then continue; fi if $PYTHON -c "$prog" 1>&5 2>&5; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"$PYTHON\":" >&5 $as_echo_n "checking \"$PYTHON\":... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5 $as_echo "okay" >&6; } python_good=true break; else unset ac_cv_path_PYTHON fi done if test "$python_good" != "true"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No suitable version of python found" >&5 $as_echo "$as_me: WARNING: No suitable version of python found" >&2;} PYTHON= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking local Python configuration" >&5 $as_echo_n "checking local Python configuration... " >&6; } PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"` PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"` pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages pkgpythondir=\${pythondir}/$PACKAGE pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages pkgpyexecdir=\${pyexecdir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: result: looks good" >&5 $as_echo "looks good" >&6; } fi build_plugin_docs=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build plugin documentation" >&5 $as_echo_n "checking whether to build plugin documentation... " >&6; } if test x$enable_gtk_doc = xyes; then build_plugin_docs=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (gtk-doc disabled or not available)" >&5 $as_echo "no (gtk-doc disabled or not available)" >&6; } fi if test x$build_plugin_docs = xyes; then ENABLE_PLUGIN_DOCS_TRUE= ENABLE_PLUGIN_DOCS_FALSE='#' else ENABLE_PLUGIN_DOCS_TRUE='#' ENABLE_PLUGIN_DOCS_FALSE= fi LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 $as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _mwvalidcheckl (); int main () { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mw__mwvalidcheckl=yes else ac_cv_lib_mw__mwvalidcheckl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 $as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : LIBM="-lmw" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="$LIBM -lm" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="-lm" fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # ------ AX CREATE STDINT H ------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint types" >&5 $as_echo_n "checking for stdint types... " >&6; } ac_stdint_h=`echo _stdint.h` # try to shortcircuit - if the default include path of the compiler # can find a "stdint.h" header then we assume that all compilers can. if ${ac_cv_header_stdint_t+:} false; then : $as_echo_n "(cached) " >&6 else old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" old_CFLAGS="$CFLAGS" ; CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int_least32_t v = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_stdint_result="(assuming C99 compatible system)" ac_cv_header_stdint_t="stdint.h"; else ac_cv_header_stdint_t="" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then CFLAGS="-std=c99" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int_least32_t v = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&5 $as_echo "$as_me: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi CXXFLAGS="$old_CXXFLAGS" CPPFLAGS="$old_CPPFLAGS" CFLAGS="$old_CFLAGS" fi v="... $ac_cv_header_stdint_h" if test "$ac_stdint_h" = "stdint.h" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./stdint.h?)" >&5 $as_echo "(are you sure you want them in ./stdint.h?)" >&6; } elif test "$ac_stdint_h" = "inttypes.h" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./inttypes.h?)" >&5 $as_echo "(are you sure you want them in ./inttypes.h?)" >&6; } elif test "_$ac_cv_header_stdint_t" = "_" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: (putting them into $ac_stdint_h)$v" >&5 $as_echo "(putting them into $ac_stdint_h)$v" >&6; } else ac_cv_header_stdint="$ac_cv_header_stdint_t" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint (shortcircuit)" >&5 $as_echo "$ac_cv_header_stdint (shortcircuit)" >&6; } fi if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. inttype_headers=`echo | sed -e 's/,/ /g'` ac_cv_stdint_result="(no helpful system typedefs seen)" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5 $as_echo_n "checking for stdint uintptr_t... " >&6; } if ${ac_cv_header_stdint_x+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 $as_echo "(..)" >&6; } for i in stdint.h inttypes.h sys/inttypes.h $inttype_headers do unset ac_cv_type_uintptr_t unset ac_cv_type_uint64_t ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <$i> " if test "x$ac_cv_type_uintptr_t" = xyes; then : ac_cv_header_stdint_x=$i else continue fi ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i> " if test "x$ac_cv_type_uint64_t" = xyes; then : and64="/uint64_t" else and64="" fi ac_cv_stdint_result="(seen uintptr_t$and64 in $i)" break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5 $as_echo_n "checking for stdint uintptr_t... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_x" >&5 $as_echo "$ac_cv_header_stdint_x" >&6; } if test "_$ac_cv_header_stdint_x" = "_" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5 $as_echo_n "checking for stdint uint32_t... " >&6; } if ${ac_cv_header_stdint_o+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 $as_echo "(..)" >&6; } for i in inttypes.h sys/inttypes.h stdint.h $inttype_headers do unset ac_cv_type_uint32_t unset ac_cv_type_uint64_t ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <$i> " if test "x$ac_cv_type_uint32_t" = xyes; then : ac_cv_header_stdint_o=$i else continue fi ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i> " if test "x$ac_cv_type_uint64_t" = xyes; then : and64="/uint64_t" else and64="" fi ac_cv_stdint_result="(seen uint32_t$and64 in $i)" break break; done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5 $as_echo_n "checking for stdint uint32_t... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_o" >&5 $as_echo "$ac_cv_header_stdint_o" >&6; } fi if test "_$ac_cv_header_stdint_x" = "_" ; then if test "_$ac_cv_header_stdint_o" = "_" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5 $as_echo_n "checking for stdint u_int32_t... " >&6; } if ${ac_cv_header_stdint_u+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 $as_echo "(..)" >&6; } for i in sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do unset ac_cv_type_u_int32_t unset ac_cv_type_u_int64_t ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <$i> " if test "x$ac_cv_type_u_int32_t" = xyes; then : ac_cv_header_stdint_u=$i else continue fi ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include<$i> " if test "x$ac_cv_type_u_int64_t" = xyes; then : and64="/u_int64_t" else and64="" fi ac_cv_stdint_result="(seen u_int32_t$and64 in $i)" break break; done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5 $as_echo_n "checking for stdint u_int32_t... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_u" >&5 $as_echo "$ac_cv_header_stdint_u" >&6; } fi fi if test "_$ac_cv_header_stdint_x" = "_" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint datatype model" >&5 $as_echo_n "checking for stdint datatype model... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 $as_echo "(..)" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 $as_echo_n "checking size of char... " >&6; } if ${ac_cv_sizeof_char+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : else if test "$ac_cv_type_char" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (char) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_char=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 $as_echo "$ac_cv_sizeof_char" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_CHAR $ac_cv_sizeof_char _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 $as_echo_n "checking size of void*... " >&6; } if ${ac_cv_sizeof_voidp+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : else if test "$ac_cv_type_voidp" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void*) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_voidp=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 $as_echo "$ac_cv_sizeof_voidp" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOIDP $ac_cv_sizeof_voidp _ACEOF ac_cv_char_data_model="" ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" ac_cv_long_data_model="" ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" { $as_echo "$as_me:${as_lineno-$LINENO}: checking data model" >&5 $as_echo_n "checking data model... " >&6; } case "$ac_cv_char_data_model/$ac_cv_long_data_model" in 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; 222/*|333/*|444/*|666/*|888/*) : ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; *) ac_cv_data_model="none" ; n="very unusual model" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_data_model ($ac_cv_long_data_model, $n)" >&5 $as_echo "$ac_cv_data_model ($ac_cv_long_data_model, $n)" >&6; } fi if test "_$ac_cv_header_stdint_x" != "_" ; then ac_cv_header_stdint="$ac_cv_header_stdint_x" elif test "_$ac_cv_header_stdint_o" != "_" ; then ac_cv_header_stdint="$ac_cv_header_stdint_o" elif test "_$ac_cv_header_stdint_u" != "_" ; then ac_cv_header_stdint="$ac_cv_header_stdint_u" else ac_cv_header_stdint="stddef.h" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra inttypes in chosen header" >&5 $as_echo_n "checking for extra inttypes in chosen header... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($ac_cv_header_stdint)" >&5 $as_echo "($ac_cv_header_stdint)" >&6; } unset ac_cv_type_int_least32_t unset ac_cv_type_int_fast32_t ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <$ac_cv_header_stdint> " if test "x$ac_cv_type_int_least32_t" = xyes; then : fi ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include<$ac_cv_header_stdint> " if test "x$ac_cv_type_int_fast32_t" = xyes; then : fi ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "#include <$ac_cv_header_stdint> " if test "x$ac_cv_type_intmax_t" = xyes; then : fi fi # shortcircut to system "stdint.h" # ------------------ PREPARE VARIABLES ------------------------------ if test "$GCC" = "yes" ; then ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` else ac_cv_stdint_message="using $CC" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&5 $as_echo "make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&6; } # ----------------- DONE inttypes.h checks START header ------------- ac_config_commands="$ac_config_commands $ac_stdint_h" for ac_header in netinet/in.h do : ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" if test "x$ac_cv_header_netinet_in_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NETINET_IN_H 1 _ACEOF fi done for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF HAVE_WINSOCK2_H=yes fi done if test "x$HAVE_WINSOCK2_H" = "xyes"; then HAVE_WINSOCK2_H_TRUE= HAVE_WINSOCK2_H_FALSE='#' else HAVE_WINSOCK2_H_TRUE='#' HAVE_WINSOCK2_H_FALSE= fi for ac_header in sys/time.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TIME_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/ioctl.h" >&5 $as_echo_n "checking for FIONREAD in sys/ioctl.h... " >&6; } if ${_cv_gst_fionread_in_sys_ioctl+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int x = FIONREAD; if ( x ) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : _cv_gst_fionread_in_sys_ioctl="yes" else _cv_gst_fionread_in_sys_ioctl="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gst_fionread_in_sys_ioctl" >&5 $as_echo "$_cv_gst_fionread_in_sys_ioctl" >&6; } if test "$_cv_gst_fionread_in_sys_ioctl" = "yes"; then $as_echo "#define HAVE_FIONREAD_IN_SYS_IOCTL 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/filio.h" >&5 $as_echo_n "checking for FIONREAD in sys/filio.h... " >&6; } if ${_cv_gst_fionread_in_sys_filio+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int x = FIONREAD; if ( x ) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : _cv_gst_fionread_in_sys_filio="yes" else _cv_gst_fionread_in_sys_filio="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gst_fionread_in_sys_filio" >&5 $as_echo "$_cv_gst_fionread_in_sys_filio" >&6; } if test "$_cv_gst_fionread_in_sys_filio" = "yes"; then $as_echo "#define HAVE_FIONREAD_IN_SYS_FILIO 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports gcc-style inline assembly" >&5 $as_echo_n "checking if compiler supports gcc-style inline assembly... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef __GNUC_MINOR__ #if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 #error GCC before 3.4 has critical bugs compiling inline assembly #endif #endif __asm__ (""::) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "X$flag_ok" = Xyes ; then HAVE_GCC_ASM=yes true else HAVE_GCC_ASM=no true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test x$HAVE_GCC_ASM = xyes ; then $as_echo "#define HAVE_GCC_ASM 1" >>confdefs.h fi if test "x$HAVE_GCC_ASM" = "xyes"; then HAVE_GCC_ASM_TRUE= HAVE_GCC_ASM_FALSE='#' else HAVE_GCC_ASM_TRUE='#' HAVE_GCC_ASM_FALSE= fi LIBS_SAVE=$LIBS LIBS="$LIBS $LIBM" for ac_func in rint sinh cosh asinh fpclass do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS=$LIBS_SAVE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5 $as_echo_n "checking for isinf... " >&6; } if ${ac_cv_have_isinf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { float f = 0.0; int i=isinf(f) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_isinf="yes" else ac_cv_have_isinf="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_isinf" >&5 $as_echo "$ac_cv_have_isinf" >&6; } if test "$ac_cv_have_isinf" = "yes" then $as_echo "#define HAVE_ISINF 1" >>confdefs.h fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt if test "x$ac_cv_func_mmap_fixed_mapped" = "xyes"; then GST_HAVE_MMAP_TRUE= GST_HAVE_MMAP_FALSE='#' else GST_HAVE_MMAP_TRUE='#' GST_HAVE_MMAP_FALSE= fi ac_fn_c_check_type "$LINENO" "struct ip_mreqn" "ac_cv_type_struct_ip_mreqn" "#include " if test "x$ac_cv_type_struct_ip_mreqn" = xyes; then : $as_echo "#define HAVE_IP_MREQN /**/" >>confdefs.h fi GLIB_REQ=2.24 if test "x$GLIB_REQ" = "x" then as_fn_error $? "Please specify a required version for GLib 2.0" "$LINENO" 5 fi which="glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GLIB="no" if test "x$required" = "xyes"; then as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5 $as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_GLIB="no" if test "x$required" = "xyes"; then as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5 $as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;} fi else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GLIB="yes" fi if test "x$HAVE_GLIB" = "xno"; then as_fn_error $? "This package requires GLib >= $GLIB_REQ to compile." "$LINENO" 5 fi GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_THREADS_MANDATORY" if test "x$PACKAGE_VERSION_NANO" = "x1"; then GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_DEPRECATED" fi # Check whether --enable-gobject-cast-checks was given. if test "${enable_gobject_cast_checks+set}" = set; then : enableval=$enable_gobject_cast_checks; else enable_gobject_cast_checks=auto fi if test "x$enable_gobject_cast_checks" = "xauto"; then if test "x$PACKAGE_VERSION_NANO" = "x1"; then enable_gobject_cast_checks=yes else enable_gobject_cast_checks=no fi fi if test "x$enable_gobject_cast_checks" = "xno"; then GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_CAST_CHECKS" fi # Check whether --enable-glib-asserts was given. if test "${enable_glib_asserts+set}" = set; then : enableval=$enable_glib_asserts; else enable_glib_assertions=auto fi if test "x$enable_glib_assertions" = "xauto"; then if test "x$PACKAGE_VERSION_NANO" = "x1"; then enable_glib_assertions=yes else enable_glib_assertions=no fi fi if test "x$enable_glib_assertions" = "xno"; then GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT" fi GIVEN_CFLAGS=$GLIB_CFLAGS INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` done GLIB_CFLAGS=$GIVEN_CFLAGS pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO" >&5 $as_echo_n "checking for GIO... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GIO_CFLAGS"; then pkg_cv_GIO_CFLAGS="$GIO_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gio-2.0 >= 2.20 \""; } >&5 ($PKG_CONFIG --exists --print-errors " gio-2.0 >= 2.20 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_CFLAGS=`$PKG_CONFIG --cflags " gio-2.0 >= 2.20 " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GIO_LIBS"; then pkg_cv_GIO_LIBS="$GIO_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gio-2.0 >= 2.20 \""; } >&5 ($PKG_CONFIG --exists --print-errors " gio-2.0 >= 2.20 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_LIBS=`$PKG_CONFIG --libs " gio-2.0 >= 2.20 " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " gio-2.0 >= 2.20 "` else GIO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " gio-2.0 >= 2.20 "` fi # Put the nasty error message in config.log where it belongs echo "$GIO_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "gio is required" "$LINENO" 5 elif test $pkg_failed = untried; then as_fn_error $? "gio is required" "$LINENO" 5 else GIO_CFLAGS=$pkg_cv_GIO_CFLAGS GIO_LIBS=$pkg_cv_GIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi ORC_REQ=0.4.11 # Check whether --enable-orc was given. if test "${enable_orc+set}" = set; then : enableval=$enable_orc; case "${enableval}" in auto) enable_orc=auto ;; yes) enable_orc=yes ;; no) enable_orc=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-orc" "$LINENO" 5 ;; esac else enable_orc=auto fi if test "x$enable_orc" != "xno" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ORC" >&5 $as_echo_n "checking for ORC... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ORC_CFLAGS"; then pkg_cv_ORC_CFLAGS="$ORC_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"orc-0.4 >= \$ORC_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "orc-0.4 >= $ORC_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ORC_CFLAGS=`$PKG_CONFIG --cflags "orc-0.4 >= $ORC_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ORC_LIBS"; then pkg_cv_ORC_LIBS="$ORC_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"orc-0.4 >= \$ORC_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "orc-0.4 >= $ORC_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ORC_LIBS=`$PKG_CONFIG --libs "orc-0.4 >= $ORC_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ORC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "orc-0.4 >= $ORC_REQ"` else ORC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "orc-0.4 >= $ORC_REQ"` fi # Put the nasty error message in config.log where it belongs echo "$ORC_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$enable_orc" = "xyes" ; then as_fn_error $? "--enable-orc specified, but Orc >= $ORC_REQ not found" "$LINENO" 5 fi $as_echo "#define DISABLE_ORC 1" >>confdefs.h HAVE_ORC=no HAVE_ORCC=no elif test $pkg_failed = untried; then if test "x$enable_orc" = "xyes" ; then as_fn_error $? "--enable-orc specified, but Orc >= $ORC_REQ not found" "$LINENO" 5 fi $as_echo "#define DISABLE_ORC 1" >>confdefs.h HAVE_ORC=no HAVE_ORCC=no else ORC_CFLAGS=$pkg_cv_ORC_CFLAGS ORC_LIBS=$pkg_cv_ORC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_ORC 1" >>confdefs.h HAVE_ORC=yes if test "x$ORCC" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usable orcc" >&5 $as_echo_n "checking for usable orcc... " >&6; } ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` if $ORCC --version 1> /dev/null 2> /dev/null; then : else ORCC=`which orcc` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ORCC" >&5 $as_echo "$ORCC" >&6; } fi ORCC_FLAGS="--compat $ORC_REQ" if test "x$ORCC" = "x"; then : HAVE_ORCC=no else HAVE_ORCC=yes fi fi else $as_echo "#define DISABLE_ORC 1" >>confdefs.h HAVE_ORC=no HAVE_ORCC=no fi if test "x$HAVE_ORC" = "xyes"; then HAVE_ORC_TRUE= HAVE_ORC_FALSE='#' else HAVE_ORC_TRUE='#' HAVE_ORC_FALSE= fi if test "x$HAVE_ORCC" = "xyes"; then HAVE_ORCC_TRUE= HAVE_ORCC_FALSE='#' else HAVE_ORCC_TRUE='#' HAVE_ORCC_FALSE= fi module=gstreamer-$GST_MAJORMINOR minver=$GST_REQ name="GStreamer" required=yes pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5 $as_echo_n "checking for GST... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GST_CFLAGS"; then pkg_cv_GST_CFLAGS="$GST_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GST_LIBS"; then pkg_cv_GST_LIBS="$GST_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GST_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` else GST_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` fi # Put the nasty error message in config.log where it belongs echo "$GST_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GST="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi elif test $pkg_failed = untried; then HAVE_GST="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi else GST_CFLAGS=$pkg_cv_GST_CFLAGS GST_LIBS=$pkg_cv_GST_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GST="yes" fi if test -z $GST_TOOLS_DIR; then GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_MAJORMINOR` if test -z $GST_TOOLS_DIR; then as_fn_error $? "no tools dir set in GStreamer pkg-config file, core upgrade needed." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer tools in $GST_TOOLS_DIR" >&5 $as_echo "$as_me: using GStreamer tools in $GST_TOOLS_DIR" >&6;} if test -z $GST_PLUGINS_DIR; then GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-$GST_MAJORMINOR` if test -z $GST_PLUGINS_DIR; then as_fn_error $? "no pluginsdir set in GStreamer pkg-config file, core upgrade needed." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer plug-ins in $GST_PLUGINS_DIR" >&5 $as_echo "$as_me: using GStreamer plug-ins in $GST_PLUGINS_DIR" >&6;} module=gstreamer-base-$GST_MAJORMINOR minver=$GST_REQ name="GStreamer Base Libraries" required=yes pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_BASE" >&5 $as_echo_n "checking for GST_BASE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GST_BASE_CFLAGS"; then pkg_cv_GST_BASE_CFLAGS="$GST_BASE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_BASE_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GST_BASE_LIBS"; then pkg_cv_GST_BASE_LIBS="$GST_BASE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_BASE_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GST_BASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` else GST_BASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` fi # Put the nasty error message in config.log where it belongs echo "$GST_BASE_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GST_BASE="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_BASE_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_BASE_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi elif test $pkg_failed = untried; then HAVE_GST_BASE="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_BASE_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_BASE_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi else GST_BASE_CFLAGS=$pkg_cv_GST_BASE_CFLAGS GST_BASE_LIBS=$pkg_cv_GST_BASE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GST_BASE="yes" fi module=gstreamer-dataprotocol-$GST_MAJORMINOR minver=$GST_REQ name="GStreamer Data Protocol Library" required=yes pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_GDP" >&5 $as_echo_n "checking for GST_GDP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GST_GDP_CFLAGS"; then pkg_cv_GST_GDP_CFLAGS="$GST_GDP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_GDP_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GST_GDP_LIBS"; then pkg_cv_GST_GDP_LIBS="$GST_GDP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_GDP_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GST_GDP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` else GST_GDP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` fi # Put the nasty error message in config.log where it belongs echo "$GST_GDP_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GST_GDP="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_GDP_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_GDP_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi elif test $pkg_failed = untried; then HAVE_GST_GDP="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_GDP_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_GDP_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi else GST_GDP_CFLAGS=$pkg_cv_GST_GDP_CFLAGS GST_GDP_LIBS=$pkg_cv_GST_GDP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GST_GDP="yes" fi module=gstreamer-controller-$GST_MAJORMINOR minver=$GST_REQ name="GStreamer Controller Library" required=yes pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_CONTROLLER" >&5 $as_echo_n "checking for GST_CONTROLLER... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GST_CONTROLLER_CFLAGS"; then pkg_cv_GST_CONTROLLER_CFLAGS="$GST_CONTROLLER_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_CONTROLLER_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GST_CONTROLLER_LIBS"; then pkg_cv_GST_CONTROLLER_LIBS="$GST_CONTROLLER_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_CONTROLLER_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GST_CONTROLLER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` else GST_CONTROLLER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` fi # Put the nasty error message in config.log where it belongs echo "$GST_CONTROLLER_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GST_CONTROLLER="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CONTROLLER_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_CONTROLLER_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi elif test $pkg_failed = untried; then HAVE_GST_CONTROLLER="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CONTROLLER_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_CONTROLLER_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi else GST_CONTROLLER_CFLAGS=$pkg_cv_GST_CONTROLLER_CFLAGS GST_CONTROLLER_LIBS=$pkg_cv_GST_CONTROLLER_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GST_CONTROLLER="yes" fi module=gstreamer-check-$GST_MAJORMINOR minver=$GST_REQ name="GStreamer Check unittest Library" required=no pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_CHECK" >&5 $as_echo_n "checking for GST_CHECK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GST_CHECK_CFLAGS"; then pkg_cv_GST_CHECK_CFLAGS="$GST_CHECK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_CHECK_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GST_CHECK_LIBS"; then pkg_cv_GST_CHECK_LIBS="$GST_CHECK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_CHECK_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GST_CHECK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` else GST_CHECK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` fi # Put the nasty error message in config.log where it belongs echo "$GST_CHECK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GST_CHECK="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CHECK_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_CHECK_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi elif test $pkg_failed = untried; then HAVE_GST_CHECK="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CHECK_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_CHECK_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi else GST_CHECK_CFLAGS=$pkg_cv_GST_CHECK_CFLAGS GST_CHECK_LIBS=$pkg_cv_GST_CHECK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GST_CHECK="yes" fi module=gstreamer-plugins-base-$GST_MAJORMINOR minver=$GSTPB_REQ name="GStreamer Base Plugins" required=yes pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PLUGINS_BASE" >&5 $as_echo_n "checking for GST_PLUGINS_BASE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GST_PLUGINS_BASE_CFLAGS"; then pkg_cv_GST_PLUGINS_BASE_CFLAGS="$GST_PLUGINS_BASE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_PLUGINS_BASE_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GST_PLUGINS_BASE_LIBS"; then pkg_cv_GST_PLUGINS_BASE_LIBS="$GST_PLUGINS_BASE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5 ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GST_PLUGINS_BASE_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GST_PLUGINS_BASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"` else GST_PLUGINS_BASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"` fi # Put the nasty error message in config.log where it belongs echo "$GST_PLUGINS_BASE_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GST_PLUGINS_BASE="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_BASE_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_PLUGINS_BASE_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi elif test $pkg_failed = untried; then HAVE_GST_PLUGINS_BASE="no" { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_BASE_PKG_ERRORS" >&5 $as_echo "$as_me: $GST_PLUGINS_BASE_PKG_ERRORS" >&6;} if test "x$required" = "xyes"; then as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5 $as_echo "$as_me: no $module >= $minver ($name) found" >&6;} fi else GST_PLUGINS_BASE_CFLAGS=$pkg_cv_GST_PLUGINS_BASE_CFLAGS GST_PLUGINS_BASE_LIBS=$pkg_cv_GST_PLUGINS_BASE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GST_PLUGINS_BASE="yes" fi if test "x$HAVE_GST_PLUGINS_BASE" = "xyes"; then if test -z $GSTPB_PLUGINS_DIR; then GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-$GST_MAJORMINOR` if test -z $GSTPB_PLUGINS_DIR; then as_fn_error $? "no pluginsdir set in GStreamer Base Plugins pkg-config file" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&5 $as_echo "$as_me: using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&6;} GST_PLUGINS_BASE_DIR="$GSTPB_PLUGINS_DIR/gst:$GSTPB_PLUGINS_DIR/sys:$GSTPB_PLUGINS_DIR/ext" fi GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_MAJORMINOR` if test -z $GST_TOOLS_DIR; then as_fn_error $? "no tools dir defined in GStreamer pkg-config file; core upgrade needed." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using GStreamer Core Plugins in $GST_PLUGINS_DIR" >&5 $as_echo "$as_me: Using GStreamer Core Plugins in $GST_PLUGINS_DIR" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&5 $as_echo "$as_me: Using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&6;} if test "x$HAVE_GST_CHECK" = "xyes"; then HAVE_GST_CHECK_TRUE= HAVE_GST_CHECK_FALSE='#' else HAVE_GST_CHECK_TRUE='#' HAVE_GST_CHECK_FALSE= fi GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-$GST_MAJORMINOR`" GSTPB_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-plugins-base-$GST_MAJORMINOR`" HAVE_GTK=no GTK2_REQ=2.14.0 GTK3_REQ=2.91.3 if test "x$BUILD_EXAMPLES" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking which gtk+ version to compile examples against (optional)" >&5 $as_echo_n "checking which gtk+ version to compile examples against (optional)... " >&6; } # Check whether --with-gtk was given. if test "${with_gtk+set}" = set; then : withval=$with_gtk; case "$with_gtk" in 2.0) GTK_REQ=$GTK2_REQ ;; 3.0) GTK_REQ=$GTK3_REQ ;; *) as_fn_error $? "invalid gtk+ version specified" "$LINENO" 5;; esac else with_gtk=2.0 GTK_REQ=$GTK2_REQ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gtk (>= $GTK_REQ)" >&5 $as_echo "$with_gtk (>= $GTK_REQ)" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-\$with_gtk >= \$GTK_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-$with_gtk >= $GTK_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-$with_gtk >= $GTK_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-\$with_gtk >= \$GTK_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-$with_gtk >= $GTK_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-$with_gtk >= $GTK_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-$with_gtk >= $GTK_REQ"` else GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-$with_gtk >= $GTK_REQ"` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTK=no elif test $pkg_failed = untried; then HAVE_GTK=no else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTK=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_X11" >&5 $as_echo_n "checking for GTK_X11... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GTK_X11_CFLAGS"; then pkg_cv_GTK_X11_CFLAGS="$GTK_X11_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-\$with_gtk >= \$GTK_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_X11_CFLAGS=`$PKG_CONFIG --cflags "gtk+-x11-$with_gtk >= $GTK_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTK_X11_LIBS"; then pkg_cv_GTK_X11_LIBS="$GTK_X11_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-\$with_gtk >= \$GTK_REQ\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_X11_LIBS=`$PKG_CONFIG --libs "gtk+-x11-$with_gtk >= $GTK_REQ" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ"` else GTK_X11_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ"` fi # Put the nasty error message in config.log where it belongs echo "$GTK_X11_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTK_X11=no elif test $pkg_failed = untried; then HAVE_GTK_X11=no else GTK_X11_CFLAGS=$pkg_cv_GTK_X11_CFLAGS GTK_X11_LIBS=$pkg_cv_GTK_X11_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTK_X11=yes fi fi if test "x$HAVE_GTK" = "xyes"; then HAVE_GTK_TRUE= HAVE_GTK_FALSE='#' else HAVE_GTK_TRUE='#' HAVE_GTK_FALSE= fi if test "x$HAVE_GTK_X11" = "xyes"; then HAVE_GTK_X11_TRUE= HAVE_GTK_X11_FALSE='#' else HAVE_GTK_X11_TRUE='#' HAVE_GTK_X11_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GConf schemas ***" >&5 $as_echo "$as_me: *** checking feature: GConf schemas ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_GCONFTOOL" = "xno"; then NOUSE="yes" fi # Check whether --enable-gconftool was given. if test "${enable_gconftool+set}" = set; then : enableval=$enable_gconftool; case "${enableval}" in yes) USE_GCONFTOOL=yes;; no) USE_GCONFTOOL=no;; *) as_fn_error $? "bad value ${enableval} for --enable-gconftool" "$LINENO" 5 ;; esac else USE_GCONFTOOL=yes fi if test "x$NOUSE" = "xyes"; then USE_GCONFTOOL="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_GCONFTOOL = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_GCONFTOOL=no # Extract the first word of "gconftool-2", so it can be a program name with args. set dummy gconftool-2; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GCONFTOOL+:} false; then : $as_echo_n "(cached) " >&6 else case $GCONFTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_GCONFTOOL="$GCONFTOOL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GCONFTOOL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GCONFTOOL" && ac_cv_path_GCONFTOOL="no" ;; esac fi GCONFTOOL=$ac_cv_path_GCONFTOOL if test -n "$GCONFTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCONFTOOL" >&5 $as_echo "$GCONFTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$GCONFTOOL = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not installing GConf schemas" >&5 $as_echo "$as_me: WARNING: Not installing GConf schemas" >&2;} HAVE_GCONFTOOL="no" else HAVE_GCONFTOOL="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_GCONFTOOL = xno; then USE_GCONFTOOL=no else : fi fi if test x$USE_GCONFTOOL = xyes; then : if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_GCONFTOOL /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi : fi if test x$USE_GCONFTOOL = xyes; then USE_GCONFTOOL_TRUE= USE_GCONFTOOL_FALSE='#' else USE_GCONFTOOL_TRUE='#' USE_GCONFTOOL_FALSE= fi GST_LICENSE="LGPL" cat >>confdefs.h <<_ACEOF #define GST_LICENSE "$GST_LICENSE" _ACEOF EXP_VAR=PLUGINDIR FROM_VAR=${libdir}/gstreamer-$GST_MAJORMINOR prefix_save=$prefix exec_prefix_save=$exec_prefix if test "x$prefix" = "xNONE"; then prefix="$ac_default_prefix" fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var" = "x$full_var"; then break; fi full_var=$new_full_var done full_var=$new_full_var PLUGINDIR="$full_var" prefix=$prefix_save exec_prefix=$exec_prefix_save cat >>confdefs.h <<_ACEOF #define PLUGINDIR "$PLUGINDIR" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: Using $PLUGINDIR as the plugin install location" >&5 $as_echo "$as_me: Using $PLUGINDIR as the plugin install location" >&6;} plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" if test "x$PACKAGE_VERSION_NANO" = "x0"; then if test "xyes" = "xno" -o "xyes" = "x"; then GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"` elif test "xyes" = "xyes"; then if ( echo yes | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then GST_PACKAGE_RELEASE_DATETIME=yes else YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO "${srcdir}/gst-plugins-good.doap" `; if test "x$YYYY_MM_DD" != "x"; then GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD else as_fn_error $? "SET_PACKAGE_RELEASE_DATETIME: could not extract release date for release version $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO from \"${srcdir}/gst-plugins-good.doap\" " "$LINENO" 5 GST_PACKAGE_RELEASE_DATETIME="" fi fi elif ( echo yes | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then GST_PACKAGE_RELEASE_DATETIME=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5 $as_echo "$as_me: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&2;} GST_PACKAGE_RELEASE_DATETIME="" fi if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&5 $as_echo "$as_me: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&5 $as_echo "$as_me: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&6;} cat >>confdefs.h <<_ACEOF #define GST_PACKAGE_RELEASE_DATETIME "$GST_PACKAGE_RELEASE_DATETIME" _ACEOF fi else if test "xno" = "xno" -o "xno" = "x"; then GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"` elif test "xno" = "xyes"; then if ( echo no | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then GST_PACKAGE_RELEASE_DATETIME=no else YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" `; if test "x$YYYY_MM_DD" != "x"; then GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD else as_fn_error $? "SET_PACKAGE_RELEASE_DATETIME: could not extract release date for release version from " "$LINENO" 5 GST_PACKAGE_RELEASE_DATETIME="" fi fi elif ( echo no | grep -e '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then GST_PACKAGE_RELEASE_DATETIME=no else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5 $as_echo "$as_me: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&2;} GST_PACKAGE_RELEASE_DATETIME="" fi if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&5 $as_echo "$as_me: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&5 $as_echo "$as_me: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&6;} cat >>confdefs.h <<_ACEOF #define GST_PACKAGE_RELEASE_DATETIME "$GST_PACKAGE_RELEASE_DATETIME" _ACEOF fi fi if test "x$HAVE_OSX_VIDEO" != "xyes"; then WARNING_CFLAGS="" ERROR_CFLAGS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wall" >&5 $as_echo_n "checking to see if compiler understands -Wall... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wall" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wall" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wdeclaration-after-statement" >&5 $as_echo_n "checking to see if compiler understands -Wdeclaration-after-statement... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wdeclaration-after-statement" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wvla" >&5 $as_echo_n "checking to see if compiler understands -Wvla... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wvla" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wvla" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wpointer-arith" >&5 $as_echo_n "checking to see if compiler understands -Wpointer-arith... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wpointer-arith" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$GST_GIT" != "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Werror" >&5 $as_echo_n "checking to see if compiler understands -Werror... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="$ERROR_CFLAGS -Werror" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$ERROR_CFLAGS" = "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5 $as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -errwarn=%all" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="-errwarn=%all" for f in 'no%E_EMPTY_DECLARATION' \ 'no%E_STATEMENT_NOT_REACHED' \ 'no%E_ARGUEMENT_MISMATCH' \ 'no%E_MACRO_REDEFINED' \ 'no%E_LOOP_NOT_ENTERED_AT_TOP' do { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5 $as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -errwarn=%all,$f" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="$ERROR_CFLAGS,$f" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } done true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -fno-strict-aliasing" >&5 $as_echo_n "checking to see if compiler understands -fno-strict-aliasing... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fno-strict-aliasing" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="$ERROR_CFLAGS -fno-strict-aliasing" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } fi fi fi if test "x -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wwrite-strings -Wold-style-definition -Waggregate-return -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar -Wnested-externs " != "x" then UNSUPPORTED="" list=" -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wwrite-strings -Wold-style-definition -Waggregate-return -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar -Wnested-externs " for each in $list do { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands $each" >&5 $as_echo_n "checking to see if compiler understands $each... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $each" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS $each" true else UNSUPPORTED="$UNSUPPORTED $each" true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } done if test "X$UNSUPPORTED" != X ; then { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5 $as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CFLAGS to $WARNING_CFLAGS" >&5 $as_echo "$as_me: set WARNING_CFLAGS to $WARNING_CFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CFLAGS to $ERROR_CFLAGS" >&5 $as_echo "$as_me: set ERROR_CFLAGS to $ERROR_CFLAGS" >&6;} else WARNING_CFLAGS="" ERROR_CFLAGS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wall" >&5 $as_echo_n "checking to see if compiler understands -Wall... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wall" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wall" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wdeclaration-after-statement" >&5 $as_echo_n "checking to see if compiler understands -Wdeclaration-after-statement... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wdeclaration-after-statement" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wvla" >&5 $as_echo_n "checking to see if compiler understands -Wvla... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wvla" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wvla" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wpointer-arith" >&5 $as_echo_n "checking to see if compiler understands -Wpointer-arith... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wpointer-arith" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$GST_GIT" != "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Werror" >&5 $as_echo_n "checking to see if compiler understands -Werror... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="$ERROR_CFLAGS -Werror" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$ERROR_CFLAGS" = "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5 $as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -errwarn=%all" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="-errwarn=%all" for f in 'no%E_EMPTY_DECLARATION' \ 'no%E_STATEMENT_NOT_REACHED' \ 'no%E_ARGUEMENT_MISMATCH' \ 'no%E_MACRO_REDEFINED' \ 'no%E_LOOP_NOT_ENTERED_AT_TOP' do { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5 $as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -errwarn=%all,$f" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="$ERROR_CFLAGS,$f" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } done true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -fno-strict-aliasing" >&5 $as_echo_n "checking to see if compiler understands -fno-strict-aliasing... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fno-strict-aliasing" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CFLAGS="$ERROR_CFLAGS -fno-strict-aliasing" true else true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } fi fi fi if test "x -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wwrite-strings -Wold-style-definition -Winit-self -Wmissing-include-dirs -Wno-multichar -Wnested-externs " != "x" then UNSUPPORTED="" list=" -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wwrite-strings -Wold-style-definition -Winit-self -Wmissing-include-dirs -Wno-multichar -Wnested-externs " for each in $list do { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands $each" >&5 $as_echo_n "checking to see if compiler understands $each... " >&6; } save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $each" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CFLAGS="$WARNING_CFLAGS $each" true else UNSUPPORTED="$UNSUPPORTED $each" true fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } done if test "X$UNSUPPORTED" != X ; then { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5 $as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CFLAGS to $WARNING_CFLAGS" >&5 $as_echo "$as_me: set WARNING_CFLAGS to $WARNING_CFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CFLAGS to $ERROR_CFLAGS" >&5 $as_echo "$as_me: set ERROR_CFLAGS to $ERROR_CFLAGS" >&6;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands " >&5 $as_echo_n "checking to see if c++ compiler understands ... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS " ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then true else true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } ERROR_CXXFLAGS="" WARNING_CXXFLAGS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wall" >&5 $as_echo_n "checking to see if c++ compiler understands -Wall... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -Wall" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Wall" true else true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$GST_GIT" != "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Werror" >&5 $as_echo_n "checking to see if c++ compiler understands -Werror... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -Werror" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror" true else true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$ERROR_CXXFLAGS" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wno-non-virtual-dtor" >&5 $as_echo_n "checking to see if c++ compiler understands -Wno-non-virtual-dtor... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -Wno-non-virtual-dtor" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Wno-non-virtual-dtor" true else true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -fno-strict-aliasing" >&5 $as_echo_n "checking to see if c++ compiler understands -fno-strict-aliasing... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -fno-strict-aliasing" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing" true else true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -errwarn=%all" >&5 $as_echo_n "checking to see if c++ compiler understands -errwarn=%all... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -errwarn=%all" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all" true else true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } if test "x$ERROR_CXXFLAGS" != "x"; then for f in 'no%E_EMPTY_DECLARATION' \ 'no%E_STATEMENT_NOT_REACHED' \ 'no%E_ARGUEMENT_MISMATCH' \ 'no%E_MACRO_REDEFINED' \ 'no%E_LOOP_NOT_ENTERED_AT_TOP' do { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -errwarn=%all,$f" >&5 $as_echo_n "checking to see if c++ compiler understands -errwarn=%all,$f... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -errwarn=%all,$f" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then ERROR_CXXFLAGS="$ERROR_CXXFLAGS true else $f" true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } done fi fi fi if test "x -Wmissing-declarations -Wredundant-decls -Wwrite-strings -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar " != "x" then UNSUPPORTED="" list=" -Wmissing-declarations -Wredundant-decls -Wwrite-strings -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar " for each in $list do { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands $each" >&5 $as_echo_n "checking to see if c++ compiler understands $each... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $each" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then WARNING_CXXFLAGS="$WARNING_CXXFLAGS $each" true else UNSUPPORTED="$UNSUPPORTED $each" true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } done if test "X$UNSUPPORTED" != X ; then { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5 $as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CXXFLAGS to $WARNING_CXXFLAGS" >&5 $as_echo "$as_me: set WARNING_CXXFLAGS to $WARNING_CXXFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CXXFLAGS to $ERROR_CXXFLAGS" >&5 $as_echo "$as_me: set ERROR_CXXFLAGS to $ERROR_CXXFLAGS" >&6;} if test "x$GST_GIT" = "xyes"; then GST_LEVEL_DEFAULT=GST_LEVEL_ERROR else GST_LEVEL_DEFAULT=GST_LEVEL_NONE fi cat >>confdefs.h <<_ACEOF #define GST_LEVEL_DEFAULT $GST_LEVEL_DEFAULT _ACEOF DEFAULT_AUDIOSINK="autoaudiosink" DEFAULT_VIDEOSINK="autovideosink" DEFAULT_AUDIOSRC="alsasrc" DEFAULT_VIDEOSRC="v4l2src" DEFAULT_VISUALIZER="goom" case "$host" in *-sun-* | *pc-solaris* ) DEFAULT_AUDIOSRC="sunaudiosrc" ;; *-darwin* ) DEFAULT_AUDIOSRC="osxaudiosrc" ;; esac # Check whether --with-default-audiosink was given. if test "${with_default_audiosink+set}" = set; then : withval=$with_default_audiosink; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-default-audiosink" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-default-audiosink" "$LINENO" 5 ;; *) DEFAULT_AUDIOSINK="${withval}" ;; esac else DEFAULT_AUDIOSINK="$DEFAULT_AUDIOSINK" fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_AUDIOSINK as default audio sink" >&5 $as_echo "$as_me: Using $DEFAULT_AUDIOSINK as default audio sink" >&6;} cat >>confdefs.h <<_ACEOF #define DEFAULT_AUDIOSINK "$DEFAULT_AUDIOSINK" _ACEOF # Check whether --with-default-audiosrc was given. if test "${with_default_audiosrc+set}" = set; then : withval=$with_default_audiosrc; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-default-audiosrc" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-default-audiosrc" "$LINENO" 5 ;; *) DEFAULT_AUDIOSRC="${withval}" ;; esac else DEFAULT_AUDIOSRC="$DEFAULT_AUDIOSRC" fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_AUDIOSRC as default audio source" >&5 $as_echo "$as_me: Using $DEFAULT_AUDIOSRC as default audio source" >&6;} cat >>confdefs.h <<_ACEOF #define DEFAULT_AUDIOSRC "$DEFAULT_AUDIOSRC" _ACEOF # Check whether --with-default-videosink was given. if test "${with_default_videosink+set}" = set; then : withval=$with_default_videosink; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-default-videosink" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-default-videosink" "$LINENO" 5 ;; *) DEFAULT_VIDEOSINK="${withval}" ;; esac else DEFAULT_VIDEOSINK="$DEFAULT_VIDEOSINK" fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VIDEOSINK as default video sink" >&5 $as_echo "$as_me: Using $DEFAULT_VIDEOSINK as default video sink" >&6;} cat >>confdefs.h <<_ACEOF #define DEFAULT_VIDEOSINK "$DEFAULT_VIDEOSINK" _ACEOF # Check whether --with-default-videosrc was given. if test "${with_default_videosrc+set}" = set; then : withval=$with_default_videosrc; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-default-videosrc" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-default-videosrc" "$LINENO" 5 ;; *) DEFAULT_VIDEOSRC="${withval}" ;; esac else DEFAULT_VIDEOSRC="$DEFAULT_VIDEOSRC" fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VIDEOSRC as default video source" >&5 $as_echo "$as_me: Using $DEFAULT_VIDEOSRC as default video source" >&6;} cat >>confdefs.h <<_ACEOF #define DEFAULT_VIDEOSRC "$DEFAULT_VIDEOSRC" _ACEOF # Check whether --with-default-visualizer was given. if test "${with_default_visualizer+set}" = set; then : withval=$with_default_visualizer; case "${withval}" in yes) as_fn_error $? "bad value ${withval} for --with-default-visualizer" "$LINENO" 5 ;; no) as_fn_error $? "bad value ${withval} for --with-default-visualizer" "$LINENO" 5 ;; *) DEFAULT_VISUALIZER="${withval}" ;; esac else DEFAULT_VISUALIZER="$DEFAULT_VISUALIZER" fi { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VISUALIZER as default visualizer" >&5 $as_echo "$as_me: Using $DEFAULT_VISUALIZER as default visualizer" >&6;} cat >>confdefs.h <<_ACEOF #define DEFAULT_VISUALIZER "$DEFAULT_VISUALIZER" _ACEOF GST_PLUGINS_ALL="$GST_PLUGINS_ALL videofilter" # Check whether --enable-videofilter was given. if test "${enable_videofilter+set}" = set; then : enableval=$enable_videofilter; case "${enableval}" in yes) gst_use_videofilter=yes ;; no) gst_use_videofilter=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-videofilter" "$LINENO" 5 ;; esac else gst_use_videofilter=yes fi if test x$gst_use_videofilter = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videofilter" >&5 $as_echo "$as_me: disabling dependency-less plugin videofilter" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS videofilter" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videofilter " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videofilter" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videofilter " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videofilter / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " videofilter " > /dev/null; then USE_PLUGIN_VIDEOFILTER_TRUE= USE_PLUGIN_VIDEOFILTER_FALSE='#' else USE_PLUGIN_VIDEOFILTER_TRUE='#' USE_PLUGIN_VIDEOFILTER_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL alpha" # Check whether --enable-alpha was given. if test "${enable_alpha+set}" = set; then : enableval=$enable_alpha; case "${enableval}" in yes) gst_use_alpha=yes ;; no) gst_use_alpha=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-alpha" "$LINENO" 5 ;; esac else gst_use_alpha=yes fi if test x$gst_use_alpha = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin alpha" >&5 $as_echo "$as_me: disabling dependency-less plugin alpha" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS alpha" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " alpha " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED alpha" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " alpha " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ alpha / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " alpha " > /dev/null; then USE_PLUGIN_ALPHA_TRUE= USE_PLUGIN_ALPHA_FALSE='#' else USE_PLUGIN_ALPHA_TRUE='#' USE_PLUGIN_ALPHA_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL apetag" # Check whether --enable-apetag was given. if test "${enable_apetag+set}" = set; then : enableval=$enable_apetag; case "${enableval}" in yes) gst_use_apetag=yes ;; no) gst_use_apetag=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-apetag" "$LINENO" 5 ;; esac else gst_use_apetag=yes fi if test x$gst_use_apetag = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin apetag" >&5 $as_echo "$as_me: disabling dependency-less plugin apetag" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS apetag" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " apetag " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED apetag" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " apetag " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ apetag / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " apetag " > /dev/null; then USE_PLUGIN_APETAG_TRUE= USE_PLUGIN_APETAG_FALSE='#' else USE_PLUGIN_APETAG_TRUE='#' USE_PLUGIN_APETAG_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiofx" # Check whether --enable-audiofx was given. if test "${enable_audiofx+set}" = set; then : enableval=$enable_audiofx; case "${enableval}" in yes) gst_use_audiofx=yes ;; no) gst_use_audiofx=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-audiofx" "$LINENO" 5 ;; esac else gst_use_audiofx=yes fi if test x$gst_use_audiofx = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiofx" >&5 $as_echo "$as_me: disabling dependency-less plugin audiofx" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiofx" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiofx " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiofx" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiofx " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiofx / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " audiofx " > /dev/null; then USE_PLUGIN_AUDIOFX_TRUE= USE_PLUGIN_AUDIOFX_FALSE='#' else USE_PLUGIN_AUDIOFX_TRUE='#' USE_PLUGIN_AUDIOFX_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL audioparsers" # Check whether --enable-audioparsers was given. if test "${enable_audioparsers+set}" = set; then : enableval=$enable_audioparsers; case "${enableval}" in yes) gst_use_audioparsers=yes ;; no) gst_use_audioparsers=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-audioparsers" "$LINENO" 5 ;; esac else gst_use_audioparsers=yes fi if test x$gst_use_audioparsers = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audioparsers" >&5 $as_echo "$as_me: disabling dependency-less plugin audioparsers" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS audioparsers" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audioparsers " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audioparsers" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audioparsers " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audioparsers / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " audioparsers " > /dev/null; then USE_PLUGIN_AUDIOPARSERS_TRUE= USE_PLUGIN_AUDIOPARSERS_FALSE='#' else USE_PLUGIN_AUDIOPARSERS_TRUE='#' USE_PLUGIN_AUDIOPARSERS_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL auparse" # Check whether --enable-auparse was given. if test "${enable_auparse+set}" = set; then : enableval=$enable_auparse; case "${enableval}" in yes) gst_use_auparse=yes ;; no) gst_use_auparse=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-auparse" "$LINENO" 5 ;; esac else gst_use_auparse=yes fi if test x$gst_use_auparse = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin auparse" >&5 $as_echo "$as_me: disabling dependency-less plugin auparse" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS auparse" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " auparse " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED auparse" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " auparse " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ auparse / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " auparse " > /dev/null; then USE_PLUGIN_AUPARSE_TRUE= USE_PLUGIN_AUPARSE_FALSE='#' else USE_PLUGIN_AUPARSE_TRUE='#' USE_PLUGIN_AUPARSE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL autodetect" # Check whether --enable-autodetect was given. if test "${enable_autodetect+set}" = set; then : enableval=$enable_autodetect; case "${enableval}" in yes) gst_use_autodetect=yes ;; no) gst_use_autodetect=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-autodetect" "$LINENO" 5 ;; esac else gst_use_autodetect=yes fi if test x$gst_use_autodetect = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin autodetect" >&5 $as_echo "$as_me: disabling dependency-less plugin autodetect" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS autodetect" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " autodetect " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED autodetect" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " autodetect " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ autodetect / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " autodetect " > /dev/null; then USE_PLUGIN_AUTODETECT_TRUE= USE_PLUGIN_AUTODETECT_FALSE='#' else USE_PLUGIN_AUTODETECT_TRUE='#' USE_PLUGIN_AUTODETECT_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL avi" # Check whether --enable-avi was given. if test "${enable_avi+set}" = set; then : enableval=$enable_avi; case "${enableval}" in yes) gst_use_avi=yes ;; no) gst_use_avi=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-avi" "$LINENO" 5 ;; esac else gst_use_avi=yes fi if test x$gst_use_avi = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin avi" >&5 $as_echo "$as_me: disabling dependency-less plugin avi" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS avi" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " avi " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED avi" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " avi " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ avi / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " avi " > /dev/null; then USE_PLUGIN_AVI_TRUE= USE_PLUGIN_AVI_FALSE='#' else USE_PLUGIN_AVI_TRUE='#' USE_PLUGIN_AVI_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL cutter" # Check whether --enable-cutter was given. if test "${enable_cutter+set}" = set; then : enableval=$enable_cutter; case "${enableval}" in yes) gst_use_cutter=yes ;; no) gst_use_cutter=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-cutter" "$LINENO" 5 ;; esac else gst_use_cutter=yes fi if test x$gst_use_cutter = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin cutter" >&5 $as_echo "$as_me: disabling dependency-less plugin cutter" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS cutter" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " cutter " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED cutter" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " cutter " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ cutter / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " cutter " > /dev/null; then USE_PLUGIN_CUTTER_TRUE= USE_PLUGIN_CUTTER_FALSE='#' else USE_PLUGIN_CUTTER_TRUE='#' USE_PLUGIN_CUTTER_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL debugutils" # Check whether --enable-debugutils was given. if test "${enable_debugutils+set}" = set; then : enableval=$enable_debugutils; case "${enableval}" in yes) gst_use_debugutils=yes ;; no) gst_use_debugutils=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-debugutils" "$LINENO" 5 ;; esac else gst_use_debugutils=yes fi if test x$gst_use_debugutils = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin debugutils" >&5 $as_echo "$as_me: disabling dependency-less plugin debugutils" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS debugutils" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " debugutils " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED debugutils" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " debugutils " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ debugutils / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " debugutils " > /dev/null; then USE_PLUGIN_DEBUGUTILS_TRUE= USE_PLUGIN_DEBUGUTILS_FALSE='#' else USE_PLUGIN_DEBUGUTILS_TRUE='#' USE_PLUGIN_DEBUGUTILS_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL deinterlace" # Check whether --enable-deinterlace was given. if test "${enable_deinterlace+set}" = set; then : enableval=$enable_deinterlace; case "${enableval}" in yes) gst_use_deinterlace=yes ;; no) gst_use_deinterlace=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-deinterlace" "$LINENO" 5 ;; esac else gst_use_deinterlace=yes fi if test x$gst_use_deinterlace = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin deinterlace" >&5 $as_echo "$as_me: disabling dependency-less plugin deinterlace" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS deinterlace" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " deinterlace " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED deinterlace" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " deinterlace " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ deinterlace / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " deinterlace " > /dev/null; then USE_PLUGIN_DEINTERLACE_TRUE= USE_PLUGIN_DEINTERLACE_FALSE='#' else USE_PLUGIN_DEINTERLACE_TRUE='#' USE_PLUGIN_DEINTERLACE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL effectv" # Check whether --enable-effectv was given. if test "${enable_effectv+set}" = set; then : enableval=$enable_effectv; case "${enableval}" in yes) gst_use_effectv=yes ;; no) gst_use_effectv=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-effectv" "$LINENO" 5 ;; esac else gst_use_effectv=yes fi if test x$gst_use_effectv = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin effectv" >&5 $as_echo "$as_me: disabling dependency-less plugin effectv" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS effectv" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " effectv " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED effectv" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " effectv " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ effectv / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " effectv " > /dev/null; then USE_PLUGIN_EFFECTV_TRUE= USE_PLUGIN_EFFECTV_FALSE='#' else USE_PLUGIN_EFFECTV_TRUE='#' USE_PLUGIN_EFFECTV_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL equalizer" # Check whether --enable-equalizer was given. if test "${enable_equalizer+set}" = set; then : enableval=$enable_equalizer; case "${enableval}" in yes) gst_use_equalizer=yes ;; no) gst_use_equalizer=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-equalizer" "$LINENO" 5 ;; esac else gst_use_equalizer=yes fi if test x$gst_use_equalizer = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin equalizer" >&5 $as_echo "$as_me: disabling dependency-less plugin equalizer" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS equalizer" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " equalizer " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED equalizer" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " equalizer " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ equalizer / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " equalizer " > /dev/null; then USE_PLUGIN_EQUALIZER_TRUE= USE_PLUGIN_EQUALIZER_FALSE='#' else USE_PLUGIN_EQUALIZER_TRUE='#' USE_PLUGIN_EQUALIZER_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL flv" # Check whether --enable-flv was given. if test "${enable_flv+set}" = set; then : enableval=$enable_flv; case "${enableval}" in yes) gst_use_flv=yes ;; no) gst_use_flv=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-flv" "$LINENO" 5 ;; esac else gst_use_flv=yes fi if test x$gst_use_flv = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin flv" >&5 $as_echo "$as_me: disabling dependency-less plugin flv" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS flv" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " flv " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED flv" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " flv " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ flv / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " flv " > /dev/null; then USE_PLUGIN_FLV_TRUE= USE_PLUGIN_FLV_FALSE='#' else USE_PLUGIN_FLV_TRUE='#' USE_PLUGIN_FLV_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL id3demux" # Check whether --enable-id3demux was given. if test "${enable_id3demux+set}" = set; then : enableval=$enable_id3demux; case "${enableval}" in yes) gst_use_id3demux=yes ;; no) gst_use_id3demux=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-id3demux" "$LINENO" 5 ;; esac else gst_use_id3demux=yes fi if test x$gst_use_id3demux = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin id3demux" >&5 $as_echo "$as_me: disabling dependency-less plugin id3demux" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS id3demux" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " id3demux " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED id3demux" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " id3demux " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ id3demux / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " id3demux " > /dev/null; then USE_PLUGIN_ID3DEMUX_TRUE= USE_PLUGIN_ID3DEMUX_FALSE='#' else USE_PLUGIN_ID3DEMUX_TRUE='#' USE_PLUGIN_ID3DEMUX_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL icydemux" # Check whether --enable-icydemux was given. if test "${enable_icydemux+set}" = set; then : enableval=$enable_icydemux; case "${enableval}" in yes) gst_use_icydemux=yes ;; no) gst_use_icydemux=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-icydemux" "$LINENO" 5 ;; esac else gst_use_icydemux=yes fi if test x$gst_use_icydemux = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin icydemux" >&5 $as_echo "$as_me: disabling dependency-less plugin icydemux" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS icydemux" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " icydemux " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED icydemux" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " icydemux " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ icydemux / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " icydemux " > /dev/null; then USE_PLUGIN_ICYDEMUX_TRUE= USE_PLUGIN_ICYDEMUX_FALSE='#' else USE_PLUGIN_ICYDEMUX_TRUE='#' USE_PLUGIN_ICYDEMUX_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL interleave" # Check whether --enable-interleave was given. if test "${enable_interleave+set}" = set; then : enableval=$enable_interleave; case "${enableval}" in yes) gst_use_interleave=yes ;; no) gst_use_interleave=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-interleave" "$LINENO" 5 ;; esac else gst_use_interleave=yes fi if test x$gst_use_interleave = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin interleave" >&5 $as_echo "$as_me: disabling dependency-less plugin interleave" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS interleave" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " interleave " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED interleave" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " interleave " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ interleave / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " interleave " > /dev/null; then USE_PLUGIN_INTERLEAVE_TRUE= USE_PLUGIN_INTERLEAVE_FALSE='#' else USE_PLUGIN_INTERLEAVE_TRUE='#' USE_PLUGIN_INTERLEAVE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL flx" # Check whether --enable-flx was given. if test "${enable_flx+set}" = set; then : enableval=$enable_flx; case "${enableval}" in yes) gst_use_flx=yes ;; no) gst_use_flx=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-flx" "$LINENO" 5 ;; esac else gst_use_flx=yes fi if test x$gst_use_flx = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin flx" >&5 $as_echo "$as_me: disabling dependency-less plugin flx" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS flx" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " flx " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED flx" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " flx " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ flx / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " flx " > /dev/null; then USE_PLUGIN_FLX_TRUE= USE_PLUGIN_FLX_FALSE='#' else USE_PLUGIN_FLX_TRUE='#' USE_PLUGIN_FLX_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL goom" # Check whether --enable-goom was given. if test "${enable_goom+set}" = set; then : enableval=$enable_goom; case "${enableval}" in yes) gst_use_goom=yes ;; no) gst_use_goom=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-goom" "$LINENO" 5 ;; esac else gst_use_goom=yes fi if test x$gst_use_goom = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin goom" >&5 $as_echo "$as_me: disabling dependency-less plugin goom" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS goom" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " goom " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED goom" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " goom " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ goom / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " goom " > /dev/null; then USE_PLUGIN_GOOM_TRUE= USE_PLUGIN_GOOM_FALSE='#' else USE_PLUGIN_GOOM_TRUE='#' USE_PLUGIN_GOOM_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL goom2k1" # Check whether --enable-goom2k1 was given. if test "${enable_goom2k1+set}" = set; then : enableval=$enable_goom2k1; case "${enableval}" in yes) gst_use_goom2k1=yes ;; no) gst_use_goom2k1=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-goom2k1" "$LINENO" 5 ;; esac else gst_use_goom2k1=yes fi if test x$gst_use_goom2k1 = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin goom2k1" >&5 $as_echo "$as_me: disabling dependency-less plugin goom2k1" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS goom2k1" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " goom2k1 " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED goom2k1" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " goom2k1 " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ goom2k1 / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " goom2k1 " > /dev/null; then USE_PLUGIN_GOOM2K1_TRUE= USE_PLUGIN_GOOM2K1_FALSE='#' else USE_PLUGIN_GOOM2K1_TRUE='#' USE_PLUGIN_GOOM2K1_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL imagefreeze" # Check whether --enable-imagefreeze was given. if test "${enable_imagefreeze+set}" = set; then : enableval=$enable_imagefreeze; case "${enableval}" in yes) gst_use_imagefreeze=yes ;; no) gst_use_imagefreeze=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-imagefreeze" "$LINENO" 5 ;; esac else gst_use_imagefreeze=yes fi if test x$gst_use_imagefreeze = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin imagefreeze" >&5 $as_echo "$as_me: disabling dependency-less plugin imagefreeze" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS imagefreeze" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " imagefreeze " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED imagefreeze" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " imagefreeze " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ imagefreeze / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " imagefreeze " > /dev/null; then USE_PLUGIN_IMAGEFREEZE_TRUE= USE_PLUGIN_IMAGEFREEZE_FALSE='#' else USE_PLUGIN_IMAGEFREEZE_TRUE='#' USE_PLUGIN_IMAGEFREEZE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL isomp4" # Check whether --enable-isomp4 was given. if test "${enable_isomp4+set}" = set; then : enableval=$enable_isomp4; case "${enableval}" in yes) gst_use_isomp4=yes ;; no) gst_use_isomp4=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-isomp4" "$LINENO" 5 ;; esac else gst_use_isomp4=yes fi if test x$gst_use_isomp4 = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin isomp4" >&5 $as_echo "$as_me: disabling dependency-less plugin isomp4" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS isomp4" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " isomp4 " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED isomp4" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " isomp4 " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ isomp4 / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " isomp4 " > /dev/null; then USE_PLUGIN_ISOMP4_TRUE= USE_PLUGIN_ISOMP4_FALSE='#' else USE_PLUGIN_ISOMP4_TRUE='#' USE_PLUGIN_ISOMP4_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL law" # Check whether --enable-law was given. if test "${enable_law+set}" = set; then : enableval=$enable_law; case "${enableval}" in yes) gst_use_law=yes ;; no) gst_use_law=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-law" "$LINENO" 5 ;; esac else gst_use_law=yes fi if test x$gst_use_law = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin law" >&5 $as_echo "$as_me: disabling dependency-less plugin law" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS law" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " law " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED law" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " law " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ law / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " law " > /dev/null; then USE_PLUGIN_LAW_TRUE= USE_PLUGIN_LAW_FALSE='#' else USE_PLUGIN_LAW_TRUE='#' USE_PLUGIN_LAW_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL level" # Check whether --enable-level was given. if test "${enable_level+set}" = set; then : enableval=$enable_level; case "${enableval}" in yes) gst_use_level=yes ;; no) gst_use_level=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-level" "$LINENO" 5 ;; esac else gst_use_level=yes fi if test x$gst_use_level = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin level" >&5 $as_echo "$as_me: disabling dependency-less plugin level" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS level" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " level " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED level" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " level " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ level / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " level " > /dev/null; then USE_PLUGIN_LEVEL_TRUE= USE_PLUGIN_LEVEL_FALSE='#' else USE_PLUGIN_LEVEL_TRUE='#' USE_PLUGIN_LEVEL_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL matroska" # Check whether --enable-matroska was given. if test "${enable_matroska+set}" = set; then : enableval=$enable_matroska; case "${enableval}" in yes) gst_use_matroska=yes ;; no) gst_use_matroska=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-matroska" "$LINENO" 5 ;; esac else gst_use_matroska=yes fi if test x$gst_use_matroska = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin matroska" >&5 $as_echo "$as_me: disabling dependency-less plugin matroska" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS matroska" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " matroska " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED matroska" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " matroska " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ matroska / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " matroska " > /dev/null; then USE_PLUGIN_MATROSKA_TRUE= USE_PLUGIN_MATROSKA_FALSE='#' else USE_PLUGIN_MATROSKA_TRUE='#' USE_PLUGIN_MATROSKA_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL monoscope" # Check whether --enable-monoscope was given. if test "${enable_monoscope+set}" = set; then : enableval=$enable_monoscope; case "${enableval}" in yes) gst_use_monoscope=yes ;; no) gst_use_monoscope=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-monoscope" "$LINENO" 5 ;; esac else gst_use_monoscope=yes fi if test x$gst_use_monoscope = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin monoscope" >&5 $as_echo "$as_me: disabling dependency-less plugin monoscope" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS monoscope" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " monoscope " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED monoscope" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " monoscope " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ monoscope / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " monoscope " > /dev/null; then USE_PLUGIN_MONOSCOPE_TRUE= USE_PLUGIN_MONOSCOPE_FALSE='#' else USE_PLUGIN_MONOSCOPE_TRUE='#' USE_PLUGIN_MONOSCOPE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL multifile" # Check whether --enable-multifile was given. if test "${enable_multifile+set}" = set; then : enableval=$enable_multifile; case "${enableval}" in yes) gst_use_multifile=yes ;; no) gst_use_multifile=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-multifile" "$LINENO" 5 ;; esac else gst_use_multifile=yes fi if test x$gst_use_multifile = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin multifile" >&5 $as_echo "$as_me: disabling dependency-less plugin multifile" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS multifile" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " multifile " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED multifile" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " multifile " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ multifile / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " multifile " > /dev/null; then USE_PLUGIN_MULTIFILE_TRUE= USE_PLUGIN_MULTIFILE_FALSE='#' else USE_PLUGIN_MULTIFILE_TRUE='#' USE_PLUGIN_MULTIFILE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL multipart" # Check whether --enable-multipart was given. if test "${enable_multipart+set}" = set; then : enableval=$enable_multipart; case "${enableval}" in yes) gst_use_multipart=yes ;; no) gst_use_multipart=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-multipart" "$LINENO" 5 ;; esac else gst_use_multipart=yes fi if test x$gst_use_multipart = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin multipart" >&5 $as_echo "$as_me: disabling dependency-less plugin multipart" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS multipart" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " multipart " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED multipart" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " multipart " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ multipart / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " multipart " > /dev/null; then USE_PLUGIN_MULTIPART_TRUE= USE_PLUGIN_MULTIPART_FALSE='#' else USE_PLUGIN_MULTIPART_TRUE='#' USE_PLUGIN_MULTIPART_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL replaygain" # Check whether --enable-replaygain was given. if test "${enable_replaygain+set}" = set; then : enableval=$enable_replaygain; case "${enableval}" in yes) gst_use_replaygain=yes ;; no) gst_use_replaygain=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-replaygain" "$LINENO" 5 ;; esac else gst_use_replaygain=yes fi if test x$gst_use_replaygain = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin replaygain" >&5 $as_echo "$as_me: disabling dependency-less plugin replaygain" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS replaygain" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " replaygain " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED replaygain" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " replaygain " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ replaygain / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " replaygain " > /dev/null; then USE_PLUGIN_REPLAYGAIN_TRUE= USE_PLUGIN_REPLAYGAIN_FALSE='#' else USE_PLUGIN_REPLAYGAIN_TRUE='#' USE_PLUGIN_REPLAYGAIN_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL rtp" # Check whether --enable-rtp was given. if test "${enable_rtp+set}" = set; then : enableval=$enable_rtp; case "${enableval}" in yes) gst_use_rtp=yes ;; no) gst_use_rtp=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-rtp" "$LINENO" 5 ;; esac else gst_use_rtp=yes fi if test x$gst_use_rtp = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rtp" >&5 $as_echo "$as_me: disabling dependency-less plugin rtp" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS rtp" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rtp " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rtp" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rtp " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtp / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " rtp " > /dev/null; then USE_PLUGIN_RTP_TRUE= USE_PLUGIN_RTP_FALSE='#' else USE_PLUGIN_RTP_TRUE='#' USE_PLUGIN_RTP_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL rtpmanager" # Check whether --enable-rtpmanager was given. if test "${enable_rtpmanager+set}" = set; then : enableval=$enable_rtpmanager; case "${enableval}" in yes) gst_use_rtpmanager=yes ;; no) gst_use_rtpmanager=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-rtpmanager" "$LINENO" 5 ;; esac else gst_use_rtpmanager=yes fi if test x$gst_use_rtpmanager = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rtpmanager" >&5 $as_echo "$as_me: disabling dependency-less plugin rtpmanager" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS rtpmanager" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rtpmanager " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rtpmanager" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rtpmanager " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtpmanager / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " rtpmanager " > /dev/null; then USE_PLUGIN_RTPMANAGER_TRUE= USE_PLUGIN_RTPMANAGER_FALSE='#' else USE_PLUGIN_RTPMANAGER_TRUE='#' USE_PLUGIN_RTPMANAGER_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL rtsp" # Check whether --enable-rtsp was given. if test "${enable_rtsp+set}" = set; then : enableval=$enable_rtsp; case "${enableval}" in yes) gst_use_rtsp=yes ;; no) gst_use_rtsp=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-rtsp" "$LINENO" 5 ;; esac else gst_use_rtsp=yes fi if test x$gst_use_rtsp = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rtsp" >&5 $as_echo "$as_me: disabling dependency-less plugin rtsp" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS rtsp" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rtsp " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rtsp" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rtsp " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtsp / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " rtsp " > /dev/null; then USE_PLUGIN_RTSP_TRUE= USE_PLUGIN_RTSP_FALSE='#' else USE_PLUGIN_RTSP_TRUE='#' USE_PLUGIN_RTSP_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL shapewipe" # Check whether --enable-shapewipe was given. if test "${enable_shapewipe+set}" = set; then : enableval=$enable_shapewipe; case "${enableval}" in yes) gst_use_shapewipe=yes ;; no) gst_use_shapewipe=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-shapewipe" "$LINENO" 5 ;; esac else gst_use_shapewipe=yes fi if test x$gst_use_shapewipe = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin shapewipe" >&5 $as_echo "$as_me: disabling dependency-less plugin shapewipe" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS shapewipe" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " shapewipe " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED shapewipe" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " shapewipe " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ shapewipe / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " shapewipe " > /dev/null; then USE_PLUGIN_SHAPEWIPE_TRUE= USE_PLUGIN_SHAPEWIPE_FALSE='#' else USE_PLUGIN_SHAPEWIPE_TRUE='#' USE_PLUGIN_SHAPEWIPE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL smpte" # Check whether --enable-smpte was given. if test "${enable_smpte+set}" = set; then : enableval=$enable_smpte; case "${enableval}" in yes) gst_use_smpte=yes ;; no) gst_use_smpte=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-smpte" "$LINENO" 5 ;; esac else gst_use_smpte=yes fi if test x$gst_use_smpte = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin smpte" >&5 $as_echo "$as_me: disabling dependency-less plugin smpte" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS smpte" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " smpte " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED smpte" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " smpte " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ smpte / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " smpte " > /dev/null; then USE_PLUGIN_SMPTE_TRUE= USE_PLUGIN_SMPTE_FALSE='#' else USE_PLUGIN_SMPTE_TRUE='#' USE_PLUGIN_SMPTE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL spectrum" # Check whether --enable-spectrum was given. if test "${enable_spectrum+set}" = set; then : enableval=$enable_spectrum; case "${enableval}" in yes) gst_use_spectrum=yes ;; no) gst_use_spectrum=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-spectrum" "$LINENO" 5 ;; esac else gst_use_spectrum=yes fi if test x$gst_use_spectrum = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin spectrum" >&5 $as_echo "$as_me: disabling dependency-less plugin spectrum" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS spectrum" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " spectrum " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED spectrum" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " spectrum " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ spectrum / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " spectrum " > /dev/null; then USE_PLUGIN_SPECTRUM_TRUE= USE_PLUGIN_SPECTRUM_FALSE='#' else USE_PLUGIN_SPECTRUM_TRUE='#' USE_PLUGIN_SPECTRUM_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL udp" # Check whether --enable-udp was given. if test "${enable_udp+set}" = set; then : enableval=$enable_udp; case "${enableval}" in yes) gst_use_udp=yes ;; no) gst_use_udp=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-udp" "$LINENO" 5 ;; esac else gst_use_udp=yes fi if test x$gst_use_udp = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin udp" >&5 $as_echo "$as_me: disabling dependency-less plugin udp" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS udp" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " udp " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED udp" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " udp " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ udp / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " udp " > /dev/null; then USE_PLUGIN_UDP_TRUE= USE_PLUGIN_UDP_FALSE='#' else USE_PLUGIN_UDP_TRUE='#' USE_PLUGIN_UDP_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL videobox" # Check whether --enable-videobox was given. if test "${enable_videobox+set}" = set; then : enableval=$enable_videobox; case "${enableval}" in yes) gst_use_videobox=yes ;; no) gst_use_videobox=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-videobox" "$LINENO" 5 ;; esac else gst_use_videobox=yes fi if test x$gst_use_videobox = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videobox" >&5 $as_echo "$as_me: disabling dependency-less plugin videobox" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS videobox" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videobox " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videobox" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videobox " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videobox / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " videobox " > /dev/null; then USE_PLUGIN_VIDEOBOX_TRUE= USE_PLUGIN_VIDEOBOX_FALSE='#' else USE_PLUGIN_VIDEOBOX_TRUE='#' USE_PLUGIN_VIDEOBOX_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL videocrop" # Check whether --enable-videocrop was given. if test "${enable_videocrop+set}" = set; then : enableval=$enable_videocrop; case "${enableval}" in yes) gst_use_videocrop=yes ;; no) gst_use_videocrop=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-videocrop" "$LINENO" 5 ;; esac else gst_use_videocrop=yes fi if test x$gst_use_videocrop = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videocrop" >&5 $as_echo "$as_me: disabling dependency-less plugin videocrop" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS videocrop" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videocrop " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videocrop" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videocrop " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videocrop / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " videocrop " > /dev/null; then USE_PLUGIN_VIDEOCROP_TRUE= USE_PLUGIN_VIDEOCROP_FALSE='#' else USE_PLUGIN_VIDEOCROP_TRUE='#' USE_PLUGIN_VIDEOCROP_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL videomixer" # Check whether --enable-videomixer was given. if test "${enable_videomixer+set}" = set; then : enableval=$enable_videomixer; case "${enableval}" in yes) gst_use_videomixer=yes ;; no) gst_use_videomixer=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-videomixer" "$LINENO" 5 ;; esac else gst_use_videomixer=yes fi if test x$gst_use_videomixer = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videomixer" >&5 $as_echo "$as_me: disabling dependency-less plugin videomixer" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS videomixer" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videomixer " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videomixer" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videomixer " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videomixer / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " videomixer " > /dev/null; then USE_PLUGIN_VIDEOMIXER_TRUE= USE_PLUGIN_VIDEOMIXER_FALSE='#' else USE_PLUGIN_VIDEOMIXER_TRUE='#' USE_PLUGIN_VIDEOMIXER_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL wavenc" # Check whether --enable-wavenc was given. if test "${enable_wavenc+set}" = set; then : enableval=$enable_wavenc; case "${enableval}" in yes) gst_use_wavenc=yes ;; no) gst_use_wavenc=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-wavenc" "$LINENO" 5 ;; esac else gst_use_wavenc=yes fi if test x$gst_use_wavenc = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin wavenc" >&5 $as_echo "$as_me: disabling dependency-less plugin wavenc" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS wavenc" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " wavenc " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED wavenc" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " wavenc " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ wavenc / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " wavenc " > /dev/null; then USE_PLUGIN_WAVENC_TRUE= USE_PLUGIN_WAVENC_FALSE='#' else USE_PLUGIN_WAVENC_TRUE='#' USE_PLUGIN_WAVENC_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL wavparse" # Check whether --enable-wavparse was given. if test "${enable_wavparse+set}" = set; then : enableval=$enable_wavparse; case "${enableval}" in yes) gst_use_wavparse=yes ;; no) gst_use_wavparse=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-wavparse" "$LINENO" 5 ;; esac else gst_use_wavparse=yes fi if test x$gst_use_wavparse = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin wavparse" >&5 $as_echo "$as_me: disabling dependency-less plugin wavparse" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS wavparse" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " wavparse " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED wavparse" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " wavparse " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ wavparse / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " wavparse " > /dev/null; then USE_PLUGIN_WAVPARSE_TRUE= USE_PLUGIN_WAVPARSE_FALSE='#' else USE_PLUGIN_WAVPARSE_TRUE='#' USE_PLUGIN_WAVPARSE_FALSE= fi GST_PLUGINS_ALL="$GST_PLUGINS_ALL y4m" # Check whether --enable-y4m was given. if test "${enable_y4m+set}" = set; then : enableval=$enable_y4m; case "${enableval}" in yes) gst_use_y4m=yes ;; no) gst_use_y4m=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-y4m" "$LINENO" 5 ;; esac else gst_use_y4m=yes fi if test x$gst_use_y4m = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin y4m" >&5 $as_echo "$as_me: disabling dependency-less plugin y4m" >&6;} WITHOUT_PLUGINS="$WITHOUT_PLUGINS y4m" fi if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " y4m " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED y4m" fi if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " y4m " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ y4m / /'` fi if echo " $GST_PLUGINS_SELECTED " | grep -i " y4m " > /dev/null; then USE_PLUGIN_Y4M_TRUE= USE_PLUGIN_Y4M_FALSE='#' else USE_PLUGIN_Y4M_TRUE='#' USE_PLUGIN_Y4M_FALSE= fi ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" if test "x$ac_cv_func_socket" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF LIBS="-lsocket $LIBS" fi fi for ac_header in sys/socket.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" if test "x$ac_cv_header_sys_socket_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SOCKET_H 1 _ACEOF HAVE_SYS_SOCKET_H=yes fi done for ac_header in winsock2.h do : ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINSOCK2_H 1 _ACEOF HAVE_WINSOCK2_H=yes fi done if test "x$HAVE_SYS_SOCKET_H" != "xyes" -a "x$HAVE_WINSOCK2_H" != "xyes"; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ udp / /'` if false; then USE_PLUGIN_UDP_TRUE= USE_PLUGIN_UDP_FALSE='#' else USE_PLUGIN_UDP_TRUE='#' USE_PLUGIN_UDP_FALSE= fi GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rtsp / /'` if false; then USE_PLUGIN_RTSP_TRUE= USE_PLUGIN_RTSP_FALSE='#' else USE_PLUGIN_RTSP_TRUE='#' USE_PLUGIN_RTSP_FALSE= fi fi if test "x$HAVE_WINSOCK2_H" = "xyes"; then WIN32_LIBS="-lws2_32" fi if test "x$BUILD_EXPERIMENTAL" != "xyes"; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ monoscope / /'` if false; then USE_PLUGIN_MONOSCOPE_TRUE= USE_PLUGIN_MONOSCOPE_FALSE='#' else USE_PLUGIN_MONOSCOPE_TRUE='#' USE_PLUGIN_MONOSCOPE_FALSE= fi fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: Checking libraries for plugins in sys/" >&5 $as_echo "$as_me: Checking libraries for plugins in sys/" >&6;} echo echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: DirectSound plug-in ***" >&5 $as_echo "$as_me: *** checking feature: DirectSound plug-in ***" >&6;} if test "xdirectsoundsink" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: directsoundsink ***" >&5 $as_echo "$as_me: *** for plug-ins: directsoundsink ***" >&6;} fi NOUSE= if test "x$USE_DIRECTSOUND" = "xno"; then NOUSE="yes" fi # Check whether --enable-directsound was given. if test "${enable_directsound+set}" = set; then : enableval=$enable_directsound; case "${enableval}" in yes) USE_DIRECTSOUND=yes;; no) USE_DIRECTSOUND=no;; *) as_fn_error $? "bad value ${enableval} for --enable-directsound" "$LINENO" 5 ;; esac else USE_DIRECTSOUND=yes fi if test "x$NOUSE" = "xyes"; then USE_DIRECTSOUND="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** directsoundsink pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** directsoundsink pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_DIRECTSOUND = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_DIRECTSOUND=no HAVE_DIRECTSOUND="no" save_CFLAGS="$CFLAGS" save_LDFLAGS="$LDFLAGS" save_LIBS="$LIBS" CFLAGS="$CFLAGS $DIRECTSOUND_CFLAGS" LDFLAGS="$LDFLAGS $DIRECTSOUND_LDFLAGS" LIBS="$LIBS -ldsound -ldxerr9 -luser32" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DirectSound LDFLAGS" >&5 $as_echo_n "checking for DirectSound LDFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { DXGetErrorString9 (0); DirectSoundCreate(NULL, NULL, NULL); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : HAVE_DIRECTSOUND="yes" else HAVE_DIRECTSOUND="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DIRECTSOUND" >&5 $as_echo "$HAVE_DIRECTSOUND" >&6; } CFLAGS=$save_CFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS if test "x$HAVE_DIRECTSOUND" = "xyes"; then DIRECTSOUND_LIBS="-ldsound -ldxerr9 -luser32" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_DIRECTSOUND = xno; then USE_DIRECTSOUND=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: directsoundsink" >&5 $as_echo "$as_me: *** These plugins will be built: directsoundsink" >&6;} fi fi if test x$USE_DIRECTSOUND = xyes; then : if test "xdirectsoundsink" != "x"; then GST_PLUGINS_YES="\tdirectsoundsink\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_DIRECTSOUND /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: directsoundsink" >&5 $as_echo "$as_me: *** These plugins will not be built: directsoundsink" >&6;} if test "xdirectsoundsink" != "x"; then GST_PLUGINS_NO="\tdirectsoundsink\n$GST_PLUGINS_NO" fi : fi if test x$USE_DIRECTSOUND = xyes; then USE_DIRECTSOUND_TRUE= USE_DIRECTSOUND_FALSE='#' else USE_DIRECTSOUND_TRUE='#' USE_DIRECTSOUND_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OSS audio ***" >&5 $as_echo "$as_me: *** checking feature: OSS audio ***" >&6;} if test "xossaudio" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ossaudio ***" >&5 $as_echo "$as_me: *** for plug-ins: ossaudio ***" >&6;} fi NOUSE= if test "x$USE_OSS" = "xno"; then NOUSE="yes" fi # Check whether --enable-oss was given. if test "${enable_oss+set}" = set; then : enableval=$enable_oss; case "${enableval}" in yes) USE_OSS=yes;; no) USE_OSS=no;; *) as_fn_error $? "bad value ${enableval} for --enable-oss" "$LINENO" 5 ;; esac else USE_OSS=yes fi if test "x$NOUSE" = "xyes"; then USE_OSS="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ossaudio pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** ossaudio pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_OSS = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_OSS=no HAVE_OSS="yes" ac_fn_c_check_header_mongrel "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_sys_soundcard_h" = xyes; then : $as_echo "#define HAVE_OSS_INCLUDE_IN_SYS /**/" >>confdefs.h else ac_fn_c_check_header_mongrel "$LINENO" "soundcard.h" "ac_cv_header_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_soundcard_h" = xyes; then : $as_echo "#define HAVE_OSS_INCLUDE_IN_ROOT /**/" >>confdefs.h else ac_fn_c_check_header_mongrel "$LINENO" "machine/soundcard.h" "ac_cv_header_machine_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_machine_soundcard_h" = xyes; then : $as_echo "#define HAVE_OSS_INCLUDE_IN_MACHINE /**/" >>confdefs.h else HAVE_OSS="no" fi fi fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_OSS = xno; then USE_OSS=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ossaudio" >&5 $as_echo "$as_me: *** These plugins will be built: ossaudio" >&6;} fi fi if test x$USE_OSS = xyes; then : if test "xossaudio" != "x"; then GST_PLUGINS_YES="\tossaudio\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_OSS /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ossaudio" >&5 $as_echo "$as_me: *** These plugins will not be built: ossaudio" >&6;} if test "xossaudio" != "x"; then GST_PLUGINS_NO="\tossaudio\n$GST_PLUGINS_NO" fi : fi if test x$USE_OSS = xyes; then USE_OSS_TRUE= USE_OSS_FALSE='#' else USE_OSS_TRUE='#' USE_OSS_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Open Sound System 4 ***" >&5 $as_echo "$as_me: *** checking feature: Open Sound System 4 ***" >&6;} if test "xoss4" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: oss4 ***" >&5 $as_echo "$as_me: *** for plug-ins: oss4 ***" >&6;} fi NOUSE= if test "x$USE_OSS4" = "xno"; then NOUSE="yes" fi # Check whether --enable-oss4 was given. if test "${enable_oss4+set}" = set; then : enableval=$enable_oss4; case "${enableval}" in yes) USE_OSS4=yes;; no) USE_OSS4=no;; *) as_fn_error $? "bad value ${enableval} for --enable-oss4" "$LINENO" 5 ;; esac else USE_OSS4=yes fi if test "x$NOUSE" = "xyes"; then USE_OSS4="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** oss4 pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** oss4 pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_OSS4 = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_OSS4=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking if we can build the OSS4 elements" >&5 $as_echo_n "checking Checking if we can build the OSS4 elements... " >&6; } for ac_header in fcntl.h sys/ioctl.h sys/stat.h sys/types.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF test -z "$OSS4_MISSING_HEADER" && HAVE_OSS4="yes" else OSS4_MISSING_HEADER="yes";HAVE_OSS4="no" fi done LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_OSS4 = xno; then USE_OSS4=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: oss4" >&5 $as_echo "$as_me: *** These plugins will be built: oss4" >&6;} fi fi if test x$USE_OSS4 = xyes; then : if test "xoss4" != "x"; then GST_PLUGINS_YES="\toss4\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_OSS4 /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: oss4" >&5 $as_echo "$as_me: *** These plugins will not be built: oss4" >&6;} if test "xoss4" != "x"; then GST_PLUGINS_NO="\toss4\n$GST_PLUGINS_NO" fi : fi if test x$USE_OSS4 = xyes; then USE_OSS4_TRUE= USE_OSS4_FALSE='#' else USE_OSS4_TRUE='#' USE_OSS4_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Sun Audio ***" >&5 $as_echo "$as_me: *** checking feature: Sun Audio ***" >&6;} if test "xsunaudio" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: sunaudio ***" >&5 $as_echo "$as_me: *** for plug-ins: sunaudio ***" >&6;} fi NOUSE= if test "x$USE_SUNAUDIO" = "xno"; then NOUSE="yes" fi # Check whether --enable-sunaudio was given. if test "${enable_sunaudio+set}" = set; then : enableval=$enable_sunaudio; case "${enableval}" in yes) USE_SUNAUDIO=yes;; no) USE_SUNAUDIO=no;; *) as_fn_error $? "bad value ${enableval} for --enable-sunaudio" "$LINENO" 5 ;; esac else USE_SUNAUDIO=yes fi if test "x$NOUSE" = "xyes"; then USE_SUNAUDIO="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sunaudio pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** sunaudio pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_SUNAUDIO = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_SUNAUDIO=no ac_fn_c_check_header_mongrel "$LINENO" "sys/audioio.h" "ac_cv_header_sys_audioio_h" "$ac_includes_default" if test "x$ac_cv_header_sys_audioio_h" = xyes; then : HAVE_SUNAUDIO="yes" else HAVE_SUNAUDIO="no" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_SUNAUDIO = xno; then USE_SUNAUDIO=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: sunaudio" >&5 $as_echo "$as_me: *** These plugins will be built: sunaudio" >&6;} fi fi if test x$USE_SUNAUDIO = xyes; then : if test "xsunaudio" != "x"; then GST_PLUGINS_YES="\tsunaudio\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_SUNAUDIO /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: sunaudio" >&5 $as_echo "$as_me: *** These plugins will not be built: sunaudio" >&6;} if test "xsunaudio" != "x"; then GST_PLUGINS_NO="\tsunaudio\n$GST_PLUGINS_NO" fi : fi if test x$USE_SUNAUDIO = xyes; then USE_SUNAUDIO_TRUE= USE_SUNAUDIO_FALSE='#' else USE_SUNAUDIO_TRUE='#' USE_SUNAUDIO_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OSX audio ***" >&5 $as_echo "$as_me: *** checking feature: OSX audio ***" >&6;} if test "xosxaudio" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: osxaudio ***" >&5 $as_echo "$as_me: *** for plug-ins: osxaudio ***" >&6;} fi NOUSE= if test "x$USE_OSX_AUDIO" = "xno"; then NOUSE="yes" fi # Check whether --enable-osx_audio was given. if test "${enable_osx_audio+set}" = set; then : enableval=$enable_osx_audio; case "${enableval}" in yes) USE_OSX_AUDIO=yes;; no) USE_OSX_AUDIO=no;; *) as_fn_error $? "bad value ${enableval} for --enable-osx_audio" "$LINENO" 5 ;; esac else USE_OSX_AUDIO=yes fi if test "x$NOUSE" = "xyes"; then USE_OSX_AUDIO="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** osxaudio pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** osxaudio pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_OSX_AUDIO = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_OSX_AUDIO=no ac_fn_c_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : HAVE_OSX_AUDIO="yes" else HAVE_OSX_AUDIO="no" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_OSX_AUDIO = xno; then USE_OSX_AUDIO=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: osxaudio" >&5 $as_echo "$as_me: *** These plugins will be built: osxaudio" >&6;} fi fi if test x$USE_OSX_AUDIO = xyes; then : if test "xosxaudio" != "x"; then GST_PLUGINS_YES="\tosxaudio\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_OSX_AUDIO /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: osxaudio" >&5 $as_echo "$as_me: *** These plugins will not be built: osxaudio" >&6;} if test "xosxaudio" != "x"; then GST_PLUGINS_NO="\tosxaudio\n$GST_PLUGINS_NO" fi : fi if test x$USE_OSX_AUDIO = xyes; then USE_OSX_AUDIO_TRUE= USE_OSX_AUDIO_FALSE='#' else USE_OSX_AUDIO_TRUE='#' USE_OSX_AUDIO_FALSE= fi HAVE_OSX_VIDEO="no" echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OSX video ***" >&5 $as_echo "$as_me: *** checking feature: OSX video ***" >&6;} if test "xosxvideosink" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: osxvideosink ***" >&5 $as_echo "$as_me: *** for plug-ins: osxvideosink ***" >&6;} fi NOUSE= if test "x$USE_OSX_VIDEO" = "xno"; then NOUSE="yes" fi # Check whether --enable-osx_video was given. if test "${enable_osx_video+set}" = set; then : enableval=$enable_osx_video; case "${enableval}" in yes) USE_OSX_VIDEO=yes;; no) USE_OSX_VIDEO=no;; *) as_fn_error $? "bad value ${enableval} for --enable-osx_video" "$LINENO" 5 ;; esac else USE_OSX_VIDEO=yes fi if test "x$NOUSE" = "xyes"; then USE_OSX_VIDEO="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** osxvideosink pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** osxvideosink pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_OSX_VIDEO = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_OSX_VIDEO=no ac_fn_c_check_header_mongrel "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default" if test "x$ac_cv_header_OpenGL_gl_h" = xyes; then : HAVE_OSX_VIDEO="yes" else HAVE_OSX_VIDEO="no" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_OSX_VIDEO = xno; then USE_OSX_VIDEO=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: osxvideosink" >&5 $as_echo "$as_me: *** These plugins will be built: osxvideosink" >&6;} fi fi if test x$USE_OSX_VIDEO = xyes; then : if test "xosxvideosink" != "x"; then GST_PLUGINS_YES="\tosxvideosink\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_OSX_VIDEO /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: osxvideosink" >&5 $as_echo "$as_me: *** These plugins will not be built: osxvideosink" >&6;} if test "xosxvideosink" != "x"; then GST_PLUGINS_NO="\tosxvideosink\n$GST_PLUGINS_NO" fi : fi if test x$USE_OSX_VIDEO = xyes; then USE_OSX_VIDEO_TRUE= USE_OSX_VIDEO_FALSE='#' else USE_OSX_VIDEO_TRUE='#' USE_OSX_VIDEO_FALSE= fi case "$host" in *-*darwin*) ;; *) HAVE_OSX_VIDEO="no" ;; esac echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Video 4 Linux 2 ***" >&5 $as_echo "$as_me: *** checking feature: Video 4 Linux 2 ***" >&6;} if test "xv4l2src" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: v4l2src ***" >&5 $as_echo "$as_me: *** for plug-ins: v4l2src ***" >&6;} fi NOUSE= if test "x$USE_GST_V4L2" = "xno"; then NOUSE="yes" fi # Check whether --enable-gst_v4l2 was given. if test "${enable_gst_v4l2+set}" = set; then : enableval=$enable_gst_v4l2; case "${enableval}" in yes) USE_GST_V4L2=yes;; no) USE_GST_V4L2=no;; *) as_fn_error $? "bad value ${enableval} for --enable-gst_v4l2" "$LINENO" 5 ;; esac else USE_GST_V4L2=yes fi if test "x$NOUSE" = "xyes"; then USE_GST_V4L2="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** v4l2src pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** v4l2src pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_GST_V4L2 = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_GST_V4L2=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking for up to date v4l2 installation" >&5 $as_echo_n "checking Checking for up to date v4l2 installation... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __sun /* Solaris */ #include #include #else /* Linux */ #include #define _LINUX_TIME_H #define __user #include #endif #if defined(V4L2_MAJOR_VERSION) || defined(V4L2_MINOR_VERSION) #error too early v4l2 version or no v4l2 at all #endif int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_GST_V4L2="yes" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else HAVE_GST_V4L2="no" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_VIDEODEV=no ac_fn_c_check_header_mongrel "$LINENO" "linux/videodev2.h" "ac_cv_header_linux_videodev2_h" "$ac_includes_default" if test "x$ac_cv_header_linux_videodev2_h" = xyes; then : HAVE_VIDEODEV=yes else ac_fn_c_check_header_mongrel "$LINENO" "sys/videodev2.h" "ac_cv_header_sys_videodev2_h" "$ac_includes_default" if test "x$ac_cv_header_sys_videodev2_h" = xyes; then : HAVE_VIDEODEV=yes fi fi if test "x$HAVE_VIDEODEV" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: video4linux2 headers were found, but they're old." >&5 $as_echo "$as_me: WARNING: video4linux2 headers were found, but they're old." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Please update v4l2 to compile the v4l2 plugins" >&5 $as_echo "$as_me: WARNING: Please update v4l2 to compile the v4l2 plugins" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: video4linux2 was not found" >&5 $as_echo "$as_me: WARNING: video4linux2 was not found" >&2;} fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$HAVE_GST_V4L2 = xyes ; then MISSING_DECL=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking struct v4l2_buffer declaration" >&5 $as_echo_n "checking struct v4l2_buffer declaration... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __sun /* Solaris */ #include #include #else /* Linux */ #include #define _LINUX_TIME_H #define __user #include #endif int main () { struct v4l2_buffer buf; buf.index = 0; return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else MISSING_DECL=1 && { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$MISSING_DECL = x1 ; then $as_echo "#define GST_V4L2_MISSING_BUFDECL 1" >>confdefs.h fi if test x$HAVE_X = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv_pic" >&5 $as_echo_n "checking for XvQueryExtension in -lXv_pic... " >&6; } if ${ac_cv_lib_Xv_pic_XvQueryExtension+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXv_pic $X_LIBS -lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XvQueryExtension (); int main () { return XvQueryExtension (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xv_pic_XvQueryExtension=yes else ac_cv_lib_Xv_pic_XvQueryExtension=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_pic_XvQueryExtension" >&5 $as_echo "$ac_cv_lib_Xv_pic_XvQueryExtension" >&6; } if test "x$ac_cv_lib_Xv_pic_XvQueryExtension" = xyes; then : HAVE_XVIDEO="yes" else HAVE_XVIDEO="no" fi if test x$HAVE_XVIDEO = xyes; then XVIDEO_LIBS="-lXv_pic -lXext" else if test x$HAVE_XVIDEO = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv" >&5 $as_echo_n "checking for XvQueryExtension in -lXv... " >&6; } if ${ac_cv_lib_Xv_XvQueryExtension+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXv $X_LIBS -lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XvQueryExtension (); int main () { return XvQueryExtension (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xv_XvQueryExtension=yes else ac_cv_lib_Xv_XvQueryExtension=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_XvQueryExtension" >&5 $as_echo "$ac_cv_lib_Xv_XvQueryExtension" >&6; } if test "x$ac_cv_lib_Xv_XvQueryExtension" = xyes; then : HAVE_XVIDEO="yes" else HAVE_XVIDEO="no" fi if test x$HAVE_XVIDEO = xyes; then XVIDEO_LIBS="-lXv -lXext" fi fi fi fi fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_GST_V4L2 = xno; then USE_GST_V4L2=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: v4l2src" >&5 $as_echo "$as_me: *** These plugins will be built: v4l2src" >&6;} fi fi if test x$USE_GST_V4L2 = xyes; then : if test "xv4l2src" != "x"; then GST_PLUGINS_YES="\tv4l2src\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_GST_V4L2 /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: v4l2src" >&5 $as_echo "$as_me: *** These plugins will not be built: v4l2src" >&6;} if test "xv4l2src" != "x"; then GST_PLUGINS_NO="\tv4l2src\n$GST_PLUGINS_NO" fi : fi if test x$USE_GST_V4L2 = xyes; then USE_GST_V4L2_TRUE= USE_GST_V4L2_FALSE='#' else USE_GST_V4L2_TRUE='#' USE_GST_V4L2_FALSE= fi # Optional gudev for device probing # Check whether --with-gudev was given. if test "${with_gudev+set}" = set; then : withval=$with_gudev; else with_gudev=check fi if test x$HAVE_GST_V4L2 = xyes; then if test x$with_gudev != xno; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUDEV" >&5 $as_echo_n "checking for GUDEV... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GUDEV_CFLAGS"; then pkg_cv_GUDEV_CFLAGS="$GUDEV_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gudev-1.0 >= 143 \""; } >&5 ($PKG_CONFIG --exists --print-errors " gudev-1.0 >= 143 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUDEV_CFLAGS=`$PKG_CONFIG --cflags " gudev-1.0 >= 143 " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GUDEV_LIBS"; then pkg_cv_GUDEV_LIBS="$GUDEV_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gudev-1.0 >= 143 \""; } >&5 ($PKG_CONFIG --exists --print-errors " gudev-1.0 >= 143 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUDEV_LIBS=`$PKG_CONFIG --libs " gudev-1.0 >= 143 " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GUDEV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " gudev-1.0 >= 143 "` else GUDEV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " gudev-1.0 >= 143 "` fi # Put the nasty error message in config.log where it belongs echo "$GUDEV_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_gudev=no elif test $pkg_failed = untried; then have_gudev=no else GUDEV_CFLAGS=$pkg_cv_GUDEV_CFLAGS GUDEV_LIBS=$pkg_cv_GUDEV_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_gudev=yes $as_echo "#define HAVE_GUDEV 1" >>confdefs.h $as_echo "#define G_UDEV_API_IS_SUBJECT_TO_CHANGE 1" >>confdefs.h fi else have_gudev=no fi fi # Make libv4l2 non-automagic # Check whether --with-libv4l2 was given. if test "${with_libv4l2+set}" = set; then : withval=$with_libv4l2; else with_libv4l2=check fi if test x$HAVE_GST_V4L2 = xyes; then if test x$with_libv4l2 != xno; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBV4L2" >&5 $as_echo_n "checking for LIBV4L2... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBV4L2_CFLAGS"; then pkg_cv_LIBV4L2_CFLAGS="$LIBV4L2_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libv4l2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libv4l2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBV4L2_CFLAGS=`$PKG_CONFIG --cflags "libv4l2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBV4L2_LIBS"; then pkg_cv_LIBV4L2_LIBS="$LIBV4L2_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libv4l2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libv4l2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBV4L2_LIBS=`$PKG_CONFIG --libs "libv4l2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBV4L2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libv4l2"` else LIBV4L2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libv4l2"` fi # Put the nasty error message in config.log where it belongs echo "$LIBV4L2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_libv4l2=no elif test $pkg_failed = untried; then have_libv4l2=no else LIBV4L2_CFLAGS=$pkg_cv_LIBV4L2_CFLAGS LIBV4L2_LIBS=$pkg_cv_LIBV4L2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_libv4l2=yes $as_echo "#define HAVE_LIBV4L2 1" >>confdefs.h fi else have_libv4l2=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: X libraries and plugins ***" >&5 $as_echo "$as_me: *** checking feature: X libraries and plugins ***" >&6;} if test "xximagesrc" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ximagesrc ***" >&5 $as_echo "$as_me: *** for plug-ins: ximagesrc ***" >&6;} fi NOUSE= if test "x$USE_X" = "xno"; then NOUSE="yes" fi # Check whether --enable-x was given. if test "${enable_x+set}" = set; then : enableval=$enable_x; case "${enableval}" in yes) USE_X=yes;; no) USE_X=no;; *) as_fn_error $? "bad value ${enableval} for --enable-x" "$LINENO" 5 ;; esac else USE_X=yes fi if test "x$NOUSE" = "xyes"; then USE_X="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ximagesrc pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** ximagesrc pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_X = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_X=no if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi ac_cflags_save="$CFLAGS" ac_cppflags_save="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "X11/Xlib.h" "ac_cv_header_X11_Xlib_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Xlib_h" = xyes; then : HAVE_X="yes" else HAVE_X="no" fi if test "x$HAVE_X" = "xno" then { $as_echo "$as_me:${as_lineno-$LINENO}: cannot find X11 development files" >&5 $as_echo "$as_me: cannot find X11 development files" >&6;} else X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" X_LIBS="$X_LIBS -lX11" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XFIXES" >&5 $as_echo_n "checking for XFIXES... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$XFIXES_CFLAGS"; then pkg_cv_XFIXES_CFLAGS="$XFIXES_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xfixes\""; } >&5 ($PKG_CONFIG --exists --print-errors "xfixes") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XFIXES_CFLAGS=`$PKG_CONFIG --cflags "xfixes" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$XFIXES_LIBS"; then pkg_cv_XFIXES_LIBS="$XFIXES_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xfixes\""; } >&5 ($PKG_CONFIG --exists --print-errors "xfixes") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XFIXES_LIBS=`$PKG_CONFIG --libs "xfixes" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XFIXES_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xfixes"` else XFIXES_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xfixes"` fi # Put the nasty error message in config.log where it belongs echo "$XFIXES_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_XFIXES="no" elif test $pkg_failed = untried; then HAVE_XFIXES="no" else XFIXES_CFLAGS=$pkg_cv_XFIXES_CFLAGS XFIXES_LIBS=$pkg_cv_XFIXES_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_XFIXES="yes" fi if test "x$HAVE_XFIXES" = "xyes" then XFIXES_CFLAGS="-DHAVE_XFIXES $XFIXES_CFLAGS" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XDAMAGE" >&5 $as_echo_n "checking for XDAMAGE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$XDAMAGE_CFLAGS"; then pkg_cv_XDAMAGE_CFLAGS="$XDAMAGE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xdamage\""; } >&5 ($PKG_CONFIG --exists --print-errors "xdamage") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XDAMAGE_CFLAGS=`$PKG_CONFIG --cflags "xdamage" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$XDAMAGE_LIBS"; then pkg_cv_XDAMAGE_LIBS="$XDAMAGE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xdamage\""; } >&5 ($PKG_CONFIG --exists --print-errors "xdamage") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XDAMAGE_LIBS=`$PKG_CONFIG --libs "xdamage" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XDAMAGE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xdamage"` else XDAMAGE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xdamage"` fi # Put the nasty error message in config.log where it belongs echo "$XDAMAGE_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_XDAMAGE="no" elif test $pkg_failed = untried; then HAVE_XDAMAGE="no" else XDAMAGE_CFLAGS=$pkg_cv_XDAMAGE_CFLAGS XDAMAGE_LIBS=$pkg_cv_XDAMAGE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_XDAMAGE="yes" fi if test "x$HAVE_XDAMAGE" = "xyes" then XDAMAGE_CFLAGS="-DHAVE_XDAMAGE $XDAMAGE_CFLAGS" fi fi CFLAGS="$ac_cflags_save" CPPFLAGS="$ac_cppflags_save" LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_X = xno; then USE_X=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ximagesrc" >&5 $as_echo "$as_me: *** These plugins will be built: ximagesrc" >&6;} fi fi if test x$USE_X = xyes; then : if test "xximagesrc" != "x"; then GST_PLUGINS_YES="\tximagesrc\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_X /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ximagesrc" >&5 $as_echo "$as_me: *** These plugins will not be built: ximagesrc" >&6;} if test "xximagesrc" != "x"; then GST_PLUGINS_NO="\tximagesrc\n$GST_PLUGINS_NO" fi : fi if test x$USE_X = xyes; then USE_X_TRUE= USE_X_FALSE='#' else USE_X_TRUE='#' USE_X_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: X Shared Memory extension ***" >&5 $as_echo "$as_me: *** checking feature: X Shared Memory extension ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_XSHM" = "xno"; then NOUSE="yes" fi # Check whether --enable-xshm was given. if test "${enable_xshm+set}" = set; then : enableval=$enable_xshm; case "${enableval}" in yes) USE_XSHM=yes;; no) USE_XSHM=no;; *) as_fn_error $? "bad value ${enableval} for --enable-xshm" "$LINENO" 5 ;; esac else USE_XSHM=yes fi if test "x$NOUSE" = "xyes"; then USE_XSHM="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_XSHM = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_XSHM=no if test x$HAVE_X = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmAttach in -lXext" >&5 $as_echo_n "checking for XShmAttach in -lXext... " >&6; } if ${ac_cv_lib_Xext_XShmAttach+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXext $X_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XShmAttach (); int main () { return XShmAttach (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xext_XShmAttach=yes else ac_cv_lib_Xext_XShmAttach=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XShmAttach" >&5 $as_echo "$ac_cv_lib_Xext_XShmAttach" >&6; } if test "x$ac_cv_lib_Xext_XShmAttach" = xyes; then : HAVE_XSHM="yes" else HAVE_XSHM="no" fi if test "x$HAVE_XSHM" = "xyes"; then XSHM_LIBS="-lXext" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmAttach in -lXextSam" >&5 $as_echo_n "checking for XShmAttach in -lXextSam... " >&6; } if ${ac_cv_lib_XextSam_XShmAttach+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXextSam $X_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XShmAttach (); int main () { return XShmAttach (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_XextSam_XShmAttach=yes else ac_cv_lib_XextSam_XShmAttach=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmAttach" >&5 $as_echo "$ac_cv_lib_XextSam_XShmAttach" >&6; } if test "x$ac_cv_lib_XextSam_XShmAttach" = xyes; then : HAVE_XSHM="yes" else HAVE_XSHM="no" fi if test "x$HAVE_XSHM" = "xyes"; then XSHM_LIBS="-lXext -lXextSam" fi fi fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_XSHM = xno; then USE_XSHM=no else : fi fi if test x$USE_XSHM = xyes; then if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_XSHM /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi : fi if test x$USE_XSHM = xyes; then USE_XSHM_TRUE= USE_XSHM_FALSE='#' else USE_XSHM_TRUE='#' USE_XSHM_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: X11 XVideo extensions ***" >&5 $as_echo "$as_me: *** checking feature: X11 XVideo extensions ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_XVIDEO" = "xno"; then NOUSE="yes" fi # Check whether --enable-xvideo was given. if test "${enable_xvideo+set}" = set; then : enableval=$enable_xvideo; case "${enableval}" in yes) USE_XVIDEO=yes;; no) USE_XVIDEO=no;; *) as_fn_error $? "bad value ${enableval} for --enable-xvideo" "$LINENO" 5 ;; esac else USE_XVIDEO=yes fi if test "x$NOUSE" = "xyes"; then USE_XVIDEO="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_XVIDEO = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_XVIDEO=no if test x$HAVE_X = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv_pic" >&5 $as_echo_n "checking for XvQueryExtension in -lXv_pic... " >&6; } if ${ac_cv_lib_Xv_pic_XvQueryExtension+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXv_pic $X_LIBS -lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XvQueryExtension (); int main () { return XvQueryExtension (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xv_pic_XvQueryExtension=yes else ac_cv_lib_Xv_pic_XvQueryExtension=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_pic_XvQueryExtension" >&5 $as_echo "$ac_cv_lib_Xv_pic_XvQueryExtension" >&6; } if test "x$ac_cv_lib_Xv_pic_XvQueryExtension" = xyes; then : HAVE_XVIDEO="yes" else HAVE_XVIDEO="no" fi if test x$HAVE_XVIDEO = xyes; then XVIDEO_LIBS="-lXv_pic -lXext" else if test x$HAVE_XVIDEO = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XvQueryExtension in -lXv" >&5 $as_echo_n "checking for XvQueryExtension in -lXv... " >&6; } if ${ac_cv_lib_Xv_XvQueryExtension+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXv $X_LIBS -lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XvQueryExtension (); int main () { return XvQueryExtension (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xv_XvQueryExtension=yes else ac_cv_lib_Xv_XvQueryExtension=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xv_XvQueryExtension" >&5 $as_echo "$ac_cv_lib_Xv_XvQueryExtension" >&6; } if test "x$ac_cv_lib_Xv_XvQueryExtension" = xyes; then : HAVE_XVIDEO="yes" else HAVE_XVIDEO="no" fi if test x$HAVE_XVIDEO = xyes; then XVIDEO_LIBS="-lXv -lXext" fi fi fi fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_XVIDEO = xno; then USE_XVIDEO=no else : fi fi if test x$USE_XVIDEO = xyes; then : if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_XVIDEO /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi : fi if test x$USE_XVIDEO = xyes; then USE_XVIDEO_TRUE= USE_XVIDEO_FALSE='#' else USE_XVIDEO_TRUE='#' USE_XVIDEO_FALSE= fi if test "x$BUILD_EXTERNAL" = "xyes"; then echo { $as_echo "$as_me:${as_lineno-$LINENO}: Checking libraries for plugins in ext/" >&5 $as_echo "$as_me: Checking libraries for plugins in ext/" >&6;} echo echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: aalib ASCII Art library ***" >&5 $as_echo "$as_me: *** checking feature: aalib ASCII Art library ***" >&6;} if test "xaasink" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: aasink ***" >&5 $as_echo "$as_me: *** for plug-ins: aasink ***" >&6;} fi NOUSE= if test "x$USE_AALIB" = "xno"; then NOUSE="yes" fi # Check whether --enable-aalib was given. if test "${enable_aalib+set}" = set; then : enableval=$enable_aalib; case "${enableval}" in yes) USE_AALIB=yes;; no) USE_AALIB=no;; *) as_fn_error $? "bad value ${enableval} for --enable-aalib" "$LINENO" 5 ;; esac else USE_AALIB=yes fi if test "x$NOUSE" = "xyes"; then USE_AALIB="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** aasink pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** aasink pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_AALIB = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_AALIB=no # Check whether --with-aalib-prefix was given. if test "${with_aalib_prefix+set}" = set; then : withval=$with_aalib_prefix; aalib_prefix="$withval" else aalib_prefix="" fi # Check whether --with-aalib-exec-prefix was given. if test "${with_aalib_exec_prefix+set}" = set; then : withval=$with_aalib_exec_prefix; aalib_exec_prefix="$withval" else aalib_exec_prefix="" fi # Check whether --enable-aalibtest was given. if test "${enable_aalibtest+set}" = set; then : enableval=$enable_aalibtest; else enable_aalibtest=yes fi if test x$aalib_exec_prefix != x ; then aalib_args="$aalib_args --exec-prefix=$aalib_exec_prefix" if test x${AALIB_CONFIG+set} != xset ; then AALIB_CONFIG=$aalib_exec_prefix/bin/aalib-config fi fi if test x$aalib_prefix != x ; then aalib_args="$aalib_args --prefix=$aalib_prefix" if test x${AALIB_CONFIG+set} != xset ; then AALIB_CONFIG=$aalib_prefix/bin/aalib-config fi fi # Extract the first word of "aalib-config", so it can be a program name with args. set dummy aalib-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_AALIB_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $AALIB_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_AALIB_CONFIG="$AALIB_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_AALIB_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_AALIB_CONFIG" && ac_cv_path_AALIB_CONFIG="no" ;; esac fi AALIB_CONFIG=$ac_cv_path_AALIB_CONFIG if test -n "$AALIB_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AALIB_CONFIG" >&5 $as_echo "$AALIB_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_aalib_version=0.11.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for AALIB - version >= $min_aalib_version" >&5 $as_echo_n "checking for AALIB - version >= $min_aalib_version... " >&6; } no_aalib="" if test "$AALIB_CONFIG" = "no" ; then no_aalib=yes else AALIB_CFLAGS=`$AALIB_CONFIG $aalibconf_args --cflags` AALIB_LIBS=`$AALIB_CONFIG $aalibconf_args --libs` aalib_major_version=`$AALIB_CONFIG $aalib_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` aalib_minor_version=`$AALIB_CONFIG $aalib_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` aalib_micro_version=`$AALIB_CONFIG $aalib_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_aalibtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $AALIB_CFLAGS" LIBS="$LIBS $AALIB_LIBS" rm -f conf.aalibtest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "aalib.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.aalibtest"); */ { FILE *fp = fopen("conf.aalibtest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_aalib_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_aalib_version"); exit(1); } if (($aalib_major_version > major) || (($aalib_major_version == major) && ($aalib_minor_version > minor)) || (($aalib_major_version == major) && ($aalib_minor_version == minor) && ($aalib_micro_version >= micro))) { return 0; } else { printf("\n*** 'aalib-config --version' returned %d.%d.%d, but the minimum version\n", $aalib_major_version, $aalib_minor_version, $aalib_micro_version); printf("*** of AALIB required is %d.%d.%d. If aalib-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If aalib-config was wrong, set the environment variable AALIB_CONFIG\n"); printf("*** to point to the correct copy of aalib-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_aalib=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_aalib" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_AALIB=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$AALIB_CONFIG" = "no" ; then echo "*** The aalib-config script installed by AALIB could not be found" echo "*** If AALIB was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the AALIB_CONFIG environment variable to the" echo "*** full path to aalib-config." else if test -f conf.aalibtest ; then : else echo "*** Could not run AALIB test program, checking why..." CFLAGS="$CFLAGS $AALIB_CFLAGS" LIBS="$LIBS $AALIB_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "AALIB.h" int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding AALIB or finding the wrong" echo "*** version of AALIB. If it is not finding AALIB, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means AALIB was incorrectly installed" echo "*** or that you have moved AALIB since it was installed. In the latter case, you" echo "*** may want to edit the aalib-config script: $AALIB_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi AALIB_CFLAGS="" AALIB_LIBS="" HAVE_AALIB=no fi rm -f conf.aalibtest GIVEN_CFLAGS=$AALIB_CFLAGS INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` done AALIB_CFLAGS=$GIVEN_CFLAGS LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_AALIB = xno; then USE_AALIB=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: aasink" >&5 $as_echo "$as_me: *** These plugins will be built: aasink" >&6;} fi fi if test x$USE_AALIB = xyes; then : if test "xaasink" != "x"; then GST_PLUGINS_YES="\taasink\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_AALIB /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: aasink" >&5 $as_echo "$as_me: *** These plugins will not be built: aasink" >&6;} if test "xaasink" != "x"; then GST_PLUGINS_NO="\taasink\n$GST_PLUGINS_NO" fi : fi if test x$USE_AALIB = xyes; then USE_AALIB_TRUE= USE_AALIB_FALSE='#' else USE_AALIB_TRUE='#' USE_AALIB_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: XML library ***" >&5 $as_echo "$as_me: *** checking feature: XML library ***" >&6;} if test "xannodex" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: annodex ***" >&5 $as_echo "$as_me: *** for plug-ins: annodex ***" >&6;} fi NOUSE= if test "x$USE_ANNODEX" = "xno"; then NOUSE="yes" fi # Check whether --enable-annodex was given. if test "${enable_annodex+set}" = set; then : enableval=$enable_annodex; case "${enableval}" in yes) USE_ANNODEX=yes;; no) USE_ANNODEX=no;; *) as_fn_error $? "bad value ${enableval} for --enable-annodex" "$LINENO" 5 ;; esac else USE_ANNODEX=yes fi if test "x$NOUSE" = "xyes"; then USE_ANNODEX="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** annodex pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** annodex pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_ANNODEX = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_ANNODEX=no which="libxml-2.0 >= 2.4.9" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANNODEX" >&5 $as_echo_n "checking for ANNODEX... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ANNODEX_CFLAGS"; then pkg_cv_ANNODEX_CFLAGS="$ANNODEX_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ANNODEX_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ANNODEX_LIBS"; then pkg_cv_ANNODEX_LIBS="$ANNODEX_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ANNODEX_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ANNODEX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else ANNODEX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$ANNODEX_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_ANNODEX="no" if test "x$required" = "xyes"; then as_fn_error $? "$ANNODEX_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $ANNODEX_PKG_ERRORS" >&5 $as_echo "$as_me: $ANNODEX_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_ANNODEX="no" if test "x$required" = "xyes"; then as_fn_error $? "$ANNODEX_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $ANNODEX_PKG_ERRORS" >&5 $as_echo "$as_me: $ANNODEX_PKG_ERRORS" >&6;} fi else ANNODEX_CFLAGS=$pkg_cv_ANNODEX_CFLAGS ANNODEX_LIBS=$pkg_cv_ANNODEX_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_ANNODEX="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_ANNODEX = xno; then USE_ANNODEX=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: annodex" >&5 $as_echo "$as_me: *** These plugins will be built: annodex" >&6;} fi fi if test x$USE_ANNODEX = xyes; then : if test "xannodex" != "x"; then GST_PLUGINS_YES="\tannodex\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_ANNODEX /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: annodex" >&5 $as_echo "$as_me: *** These plugins will not be built: annodex" >&6;} if test "xannodex" != "x"; then GST_PLUGINS_NO="\tannodex\n$GST_PLUGINS_NO" fi : fi if test x$USE_ANNODEX = xyes; then USE_ANNODEX_TRUE= USE_ANNODEX_FALSE='#' else USE_ANNODEX_TRUE='#' USE_ANNODEX_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Cairo graphics rendering ***" >&5 $as_echo "$as_me: *** checking feature: Cairo graphics rendering ***" >&6;} if test "xcairo" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cairo ***" >&5 $as_echo "$as_me: *** for plug-ins: cairo ***" >&6;} fi NOUSE= if test "x$USE_CAIRO" = "xno"; then NOUSE="yes" fi # Check whether --enable-cairo was given. if test "${enable_cairo+set}" = set; then : enableval=$enable_cairo; case "${enableval}" in yes) USE_CAIRO=yes;; no) USE_CAIRO=no;; *) as_fn_error $? "bad value ${enableval} for --enable-cairo" "$LINENO" 5 ;; esac else USE_CAIRO=yes fi if test "x$NOUSE" = "xyes"; then USE_CAIRO="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cairo pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** cairo pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_CAIRO = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_CAIRO=no which="cairo >= 1.0.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 $as_echo_n "checking for CAIRO... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$CAIRO_CFLAGS"; then pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$CAIRO_LIBS"; then pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else CAIRO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_CAIRO="no" if test "x$required" = "xyes"; then as_fn_error $? "$CAIRO_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_PKG_ERRORS" >&5 $as_echo "$as_me: $CAIRO_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_CAIRO="no" if test "x$required" = "xyes"; then as_fn_error $? "$CAIRO_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_PKG_ERRORS" >&5 $as_echo "$as_me: $CAIRO_PKG_ERRORS" >&6;} fi else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS CAIRO_LIBS=$pkg_cv_CAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_CAIRO="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_CAIRO = xno; then USE_CAIRO=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cairo" >&5 $as_echo "$as_me: *** These plugins will be built: cairo" >&6;} fi fi if test x$USE_CAIRO = xyes; then : if test "xcairo" != "x"; then GST_PLUGINS_YES="\tcairo\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_CAIRO /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cairo" >&5 $as_echo "$as_me: *** These plugins will not be built: cairo" >&6;} if test "xcairo" != "x"; then GST_PLUGINS_NO="\tcairo\n$GST_PLUGINS_NO" fi : fi if test x$USE_CAIRO = xyes; then USE_CAIRO_TRUE= USE_CAIRO_FALSE='#' else USE_CAIRO_TRUE='#' USE_CAIRO_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Cairo graphics rendering gobject bindings ***" >&5 $as_echo "$as_me: *** checking feature: Cairo graphics rendering gobject bindings ***" >&6;} if test "xcairooverlay" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cairooverlay ***" >&5 $as_echo "$as_me: *** for plug-ins: cairooverlay ***" >&6;} fi NOUSE= if test "x$USE_CAIRO_GOBJECT" = "xno"; then NOUSE="yes" fi # Check whether --enable-cairo_gobject was given. if test "${enable_cairo_gobject+set}" = set; then : enableval=$enable_cairo_gobject; case "${enableval}" in yes) USE_CAIRO_GOBJECT=yes;; no) USE_CAIRO_GOBJECT=no;; *) as_fn_error $? "bad value ${enableval} for --enable-cairo_gobject" "$LINENO" 5 ;; esac else USE_CAIRO_GOBJECT=yes fi if test "x$NOUSE" = "xyes"; then USE_CAIRO_GOBJECT="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cairooverlay pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** cairooverlay pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_CAIRO_GOBJECT = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_CAIRO_GOBJECT=no which="cairo-gobject >= 1.10.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO_GOBJECT" >&5 $as_echo_n "checking for CAIRO_GOBJECT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$CAIRO_GOBJECT_CFLAGS"; then pkg_cv_CAIRO_GOBJECT_CFLAGS="$CAIRO_GOBJECT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$CAIRO_GOBJECT_LIBS"; then pkg_cv_CAIRO_GOBJECT_LIBS="$CAIRO_GOBJECT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_GOBJECT_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else CAIRO_GOBJECT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_GOBJECT_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_CAIRO_GOBJECT="no" if test "x$required" = "xyes"; then as_fn_error $? "$CAIRO_GOBJECT_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_GOBJECT_PKG_ERRORS" >&5 $as_echo "$as_me: $CAIRO_GOBJECT_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_CAIRO_GOBJECT="no" if test "x$required" = "xyes"; then as_fn_error $? "$CAIRO_GOBJECT_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $CAIRO_GOBJECT_PKG_ERRORS" >&5 $as_echo "$as_me: $CAIRO_GOBJECT_PKG_ERRORS" >&6;} fi else CAIRO_GOBJECT_CFLAGS=$pkg_cv_CAIRO_GOBJECT_CFLAGS CAIRO_GOBJECT_LIBS=$pkg_cv_CAIRO_GOBJECT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_CAIRO_GOBJECT="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_CAIRO_GOBJECT = xno; then USE_CAIRO_GOBJECT=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cairooverlay" >&5 $as_echo "$as_me: *** These plugins will be built: cairooverlay" >&6;} fi fi if test x$USE_CAIRO_GOBJECT = xyes; then : if test "xcairooverlay" != "x"; then GST_PLUGINS_YES="\tcairooverlay\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_CAIRO_GOBJECT /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cairooverlay" >&5 $as_echo "$as_me: *** These plugins will not be built: cairooverlay" >&6;} if test "xcairooverlay" != "x"; then GST_PLUGINS_NO="\tcairooverlay\n$GST_PLUGINS_NO" fi : fi if test x$USE_CAIRO_GOBJECT = xyes; then USE_CAIRO_GOBJECT_TRUE= USE_CAIRO_GOBJECT_FALSE='#' else USE_CAIRO_GOBJECT_TRUE='#' USE_CAIRO_GOBJECT_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ESounD sound daemon ***" >&5 $as_echo "$as_me: *** checking feature: ESounD sound daemon ***" >&6;} if test "xesdsink" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: esdsink ***" >&5 $as_echo "$as_me: *** for plug-ins: esdsink ***" >&6;} fi NOUSE= if test "x$USE_ESD" = "xno"; then NOUSE="yes" fi # Check whether --enable-esd was given. if test "${enable_esd+set}" = set; then : enableval=$enable_esd; case "${enableval}" in yes) USE_ESD=yes;; no) USE_ESD=no;; *) as_fn_error $? "bad value ${enableval} for --enable-esd" "$LINENO" 5 ;; esac else USE_ESD=yes fi if test "x$NOUSE" = "xyes"; then USE_ESD="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** esdsink pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** esdsink pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_ESD = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_ESD=no which="esound >= 0.2.12" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ESD" >&5 $as_echo_n "checking for ESD... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ESD_CFLAGS"; then pkg_cv_ESD_CFLAGS="$ESD_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ESD_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ESD_LIBS"; then pkg_cv_ESD_LIBS="$ESD_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ESD_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ESD_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else ESD_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$ESD_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_ESD="no" if test "x$required" = "xyes"; then as_fn_error $? "$ESD_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $ESD_PKG_ERRORS" >&5 $as_echo "$as_me: $ESD_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_ESD="no" if test "x$required" = "xyes"; then as_fn_error $? "$ESD_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $ESD_PKG_ERRORS" >&5 $as_echo "$as_me: $ESD_PKG_ERRORS" >&6;} fi else ESD_CFLAGS=$pkg_cv_ESD_CFLAGS ESD_LIBS=$pkg_cv_ESD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_ESD="yes" fi if test $HAVE_ESD = no then # Check whether --with-esd-prefix was given. if test "${with_esd_prefix+set}" = set; then : withval=$with_esd_prefix; esd_prefix="$withval" else esd_prefix="" fi # Check whether --with-esd-exec-prefix was given. if test "${with_esd_exec_prefix+set}" = set; then : withval=$with_esd_exec_prefix; esd_exec_prefix="$withval" else esd_exec_prefix="" fi # Check whether --enable-esdtest was given. if test "${enable_esdtest+set}" = set; then : enableval=$enable_esdtest; else enable_esdtest=yes fi if test x$esd_exec_prefix != x ; then esd_args="$esd_args --exec-prefix=$esd_exec_prefix" if test x${ESD_CONFIG+set} != xset ; then ESD_CONFIG=$esd_exec_prefix/bin/esd-config fi fi if test x$esd_prefix != x ; then esd_args="$esd_args --prefix=$esd_prefix" if test x${ESD_CONFIG+set} != xset ; then ESD_CONFIG=$esd_prefix/bin/esd-config fi fi # Extract the first word of "esd-config", so it can be a program name with args. set dummy esd-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ESD_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ESD_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ESD_CONFIG="$ESD_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ESD_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ESD_CONFIG" && ac_cv_path_ESD_CONFIG="no" ;; esac fi ESD_CONFIG=$ac_cv_path_ESD_CONFIG if test -n "$ESD_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESD_CONFIG" >&5 $as_echo "$ESD_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_esd_version=0.2.12 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ESD - version >= $min_esd_version" >&5 $as_echo_n "checking for ESD - version >= $min_esd_version... " >&6; } no_esd="" if test "$ESD_CONFIG" = "no" ; then no_esd=yes else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ESD_CFLAGS=`$ESD_CONFIG $esdconf_args --cflags` ESD_LIBS=`$ESD_CONFIG $esdconf_args --libs` esd_major_version=`$ESD_CONFIG $esd_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` esd_minor_version=`$ESD_CONFIG $esd_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_esdtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $ESD_CFLAGS" LIBS="$LIBS $ESD_LIBS" rm -f conf.esdtest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include char* my_strdup (char *str) { char *new_str; if (str) { new_str = malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main () { int major, minor, micro; char *tmp_version; system ("touch conf.esdtest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_esd_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_esd_version"); exit(1); } if (($esd_major_version > major) || (($esd_major_version == major) && ($esd_minor_version > minor)) || (($esd_major_version == major) && ($esd_minor_version == minor) && ($esd_micro_version >= micro))) { return 0; } else { printf("\n*** 'esd-config --version' returned %d.%d.%d, but the minimum version\n", $esd_major_version, $esd_minor_version, $esd_micro_version); printf("*** of ESD required is %d.%d.%d. If esd-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If esd-config was wrong, set the environment variable ESD_CONFIG\n"); printf("*** to point to the correct copy of esd-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_esd=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi if test "x$no_esd" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_ESD="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$ESD_CONFIG" = "no" ; then echo "*** The esd-config script installed by ESD could not be found" echo "*** If ESD was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the ESD_CONFIG environment variable to the" echo "*** full path to esd-config." else if test -f conf.esdtest ; then : else echo "*** Could not run ESD test program, checking why..." CFLAGS="$CFLAGS $ESD_CFLAGS" LIBS="$LIBS $ESD_LIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding ESD or finding the wrong" echo "*** version of ESD. If it is not finding ESD, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means ESD was incorrectly installed" echo "*** or that you have moved ESD since it was installed. In the latter case, you" echo "*** may want to edit the esd-config script: $ESD_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi ESD_CFLAGS="" ESD_LIBS="" : fi rm -f conf.esdtest GIVEN_CFLAGS=$ESD_CFLAGS INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` done ESD_CFLAGS=$GIVEN_CFLAGS fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_ESD = xno; then USE_ESD=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: esdsink" >&5 $as_echo "$as_me: *** These plugins will be built: esdsink" >&6;} fi fi if test x$USE_ESD = xyes; then : if test "xesdsink" != "x"; then GST_PLUGINS_YES="\tesdsink\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_ESD /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: esdsink" >&5 $as_echo "$as_me: *** These plugins will not be built: esdsink" >&6;} if test "xesdsink" != "x"; then GST_PLUGINS_NO="\tesdsink\n$GST_PLUGINS_NO" fi : fi if test x$USE_ESD = xyes; then USE_ESD_TRUE= USE_ESD_FALSE='#' else USE_ESD_TRUE='#' USE_ESD_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: FLAC lossless audio ***" >&5 $as_echo "$as_me: *** checking feature: FLAC lossless audio ***" >&6;} if test "xflac" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: flac ***" >&5 $as_echo "$as_me: *** for plug-ins: flac ***" >&6;} fi NOUSE= if test "x$USE_FLAC" = "xno"; then NOUSE="yes" fi # Check whether --enable-flac was given. if test "${enable_flac+set}" = set; then : enableval=$enable_flac; case "${enableval}" in yes) USE_FLAC=yes;; no) USE_FLAC=no;; *) as_fn_error $? "bad value ${enableval} for --enable-flac" "$LINENO" 5 ;; esac else USE_FLAC=yes fi if test "x$NOUSE" = "xyes"; then USE_FLAC="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** flac pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** flac pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_FLAC = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_FLAC=no which="flac >= 1.1.4" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLAC" >&5 $as_echo_n "checking for FLAC... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FLAC_CFLAGS"; then pkg_cv_FLAC_CFLAGS="$FLAC_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLAC_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FLAC_LIBS"; then pkg_cv_FLAC_LIBS="$FLAC_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FLAC_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FLAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else FLAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$FLAC_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_FLAC="no" if test "x$required" = "xyes"; then as_fn_error $? "$FLAC_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $FLAC_PKG_ERRORS" >&5 $as_echo "$as_me: $FLAC_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_FLAC="no" if test "x$required" = "xyes"; then as_fn_error $? "$FLAC_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $FLAC_PKG_ERRORS" >&5 $as_echo "$as_me: $FLAC_PKG_ERRORS" >&6;} fi else FLAC_CFLAGS=$pkg_cv_FLAC_CFLAGS FLAC_LIBS=$pkg_cv_FLAC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_FLAC="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_FLAC = xno; then USE_FLAC=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: flac" >&5 $as_echo "$as_me: *** These plugins will be built: flac" >&6;} fi fi if test x$USE_FLAC = xyes; then : if test "xflac" != "x"; then GST_PLUGINS_YES="\tflac\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_FLAC /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: flac" >&5 $as_echo "$as_me: *** These plugins will not be built: flac" >&6;} if test "xflac" != "x"; then GST_PLUGINS_NO="\tflac\n$GST_PLUGINS_NO" fi : fi if test x$USE_FLAC = xyes; then USE_FLAC_TRUE= USE_FLAC_FALSE='#' else USE_FLAC_TRUE='#' USE_FLAC_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GConf libraries ***" >&5 $as_echo "$as_me: *** checking feature: GConf libraries ***" >&6;} if test "xgconfelements" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gconfelements ***" >&5 $as_echo "$as_me: *** for plug-ins: gconfelements ***" >&6;} fi NOUSE= if test "x$USE_GCONF" = "xno"; then NOUSE="yes" fi # Check whether --enable-gconf was given. if test "${enable_gconf+set}" = set; then : enableval=$enable_gconf; case "${enableval}" in yes) USE_GCONF=yes;; no) USE_GCONF=no;; *) as_fn_error $? "bad value ${enableval} for --enable-gconf" "$LINENO" 5 ;; esac else USE_GCONF=yes fi if test "x$NOUSE" = "xyes"; then USE_GCONF="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gconfelements pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** gconfelements pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_GCONF = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_GCONF=no which="gconf-2.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCONF" >&5 $as_echo_n "checking for GCONF... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GCONF_CFLAGS"; then pkg_cv_GCONF_CFLAGS="$GCONF_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GCONF_LIBS"; then pkg_cv_GCONF_LIBS="$GCONF_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GCONF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else GCONF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$GCONF_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GCONF="no" if test "x$required" = "xyes"; then as_fn_error $? "$GCONF_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $GCONF_PKG_ERRORS" >&5 $as_echo "$as_me: $GCONF_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_GCONF="no" if test "x$required" = "xyes"; then as_fn_error $? "$GCONF_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $GCONF_PKG_ERRORS" >&5 $as_echo "$as_me: $GCONF_PKG_ERRORS" >&6;} fi else GCONF_CFLAGS=$pkg_cv_GCONF_CFLAGS GCONF_LIBS=$pkg_cv_GCONF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GCONF="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_GCONF = xno; then USE_GCONF=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gconfelements" >&5 $as_echo "$as_me: *** These plugins will be built: gconfelements" >&6;} fi fi if test x$USE_GCONF = xyes; then : if test "xgconfelements" != "x"; then GST_PLUGINS_YES="\tgconfelements\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_GCONF /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gconfelements" >&5 $as_echo "$as_me: *** These plugins will not be built: gconfelements" >&6;} if test "xgconfelements" != "x"; then GST_PLUGINS_NO="\tgconfelements\n$GST_PLUGINS_NO" fi : fi if test x$USE_GCONF = xyes; then USE_GCONF_TRUE= USE_GCONF_FALSE='#' else USE_GCONF_TRUE='#' USE_GCONF_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GDK pixbuf ***" >&5 $as_echo "$as_me: *** checking feature: GDK pixbuf ***" >&6;} if test "xgdkpixbuf" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gdkpixbuf ***" >&5 $as_echo "$as_me: *** for plug-ins: gdkpixbuf ***" >&6;} fi NOUSE= if test "x$USE_GDK_PIXBUF" = "xno"; then NOUSE="yes" fi # Check whether --enable-gdk_pixbuf was given. if test "${enable_gdk_pixbuf+set}" = set; then : enableval=$enable_gdk_pixbuf; case "${enableval}" in yes) USE_GDK_PIXBUF=yes;; no) USE_GDK_PIXBUF=no;; *) as_fn_error $? "bad value ${enableval} for --enable-gdk_pixbuf" "$LINENO" 5 ;; esac else USE_GDK_PIXBUF=yes fi if test "x$NOUSE" = "xyes"; then USE_GDK_PIXBUF="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gdkpixbuf pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** gdkpixbuf pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_GDK_PIXBUF = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_GDK_PIXBUF=no which="gdk-pixbuf-2.0 >= 2.8.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF" >&5 $as_echo_n "checking for GDK_PIXBUF... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GDK_PIXBUF_CFLAGS"; then pkg_cv_GDK_PIXBUF_CFLAGS="$GDK_PIXBUF_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GDK_PIXBUF_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GDK_PIXBUF_LIBS"; then pkg_cv_GDK_PIXBUF_LIBS="$GDK_PIXBUF_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GDK_PIXBUF_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GDK_PIXBUF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else GDK_PIXBUF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$GDK_PIXBUF_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GDK_PIXBUF="no" if test "x$required" = "xyes"; then as_fn_error $? "$GDK_PIXBUF_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $GDK_PIXBUF_PKG_ERRORS" >&5 $as_echo "$as_me: $GDK_PIXBUF_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_GDK_PIXBUF="no" if test "x$required" = "xyes"; then as_fn_error $? "$GDK_PIXBUF_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $GDK_PIXBUF_PKG_ERRORS" >&5 $as_echo "$as_me: $GDK_PIXBUF_PKG_ERRORS" >&6;} fi else GDK_PIXBUF_CFLAGS=$pkg_cv_GDK_PIXBUF_CFLAGS GDK_PIXBUF_LIBS=$pkg_cv_GDK_PIXBUF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GDK_PIXBUF="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_GDK_PIXBUF = xno; then USE_GDK_PIXBUF=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gdkpixbuf" >&5 $as_echo "$as_me: *** These plugins will be built: gdkpixbuf" >&6;} fi fi if test x$USE_GDK_PIXBUF = xyes; then : if test "xgdkpixbuf" != "x"; then GST_PLUGINS_YES="\tgdkpixbuf\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_GDK_PIXBUF /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gdkpixbuf" >&5 $as_echo "$as_me: *** These plugins will not be built: gdkpixbuf" >&6;} if test "xgdkpixbuf" != "x"; then GST_PLUGINS_NO="\tgdkpixbuf\n$GST_PLUGINS_NO" fi : fi if test x$USE_GDK_PIXBUF = xyes; then USE_GDK_PIXBUF_TRUE= USE_GDK_PIXBUF_FALSE='#' else USE_GDK_PIXBUF_TRUE='#' USE_GDK_PIXBUF_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: HAL libraries ***" >&5 $as_echo "$as_me: *** checking feature: HAL libraries ***" >&6;} if test "xhalelements" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: halelements ***" >&5 $as_echo "$as_me: *** for plug-ins: halelements ***" >&6;} fi NOUSE= if test "x$USE_HAL" = "xno"; then NOUSE="yes" fi # Check whether --enable-hal was given. if test "${enable_hal+set}" = set; then : enableval=$enable_hal; case "${enableval}" in yes) USE_HAL=yes;; no) USE_HAL=no;; *) as_fn_error $? "bad value ${enableval} for --enable-hal" "$LINENO" 5 ;; esac else USE_HAL=yes fi if test "x$NOUSE" = "xyes"; then USE_HAL="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** halelements pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** halelements pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_HAL = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_HAL=no which="hal >= 0.5.6, dbus-1 >= 0.32" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAL" >&5 $as_echo_n "checking for HAL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$HAL_CFLAGS"; then pkg_cv_HAL_CFLAGS="$HAL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$HAL_LIBS"; then pkg_cv_HAL_LIBS="$HAL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then HAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else HAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$HAL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_HAL="no" if test "x$required" = "xyes"; then as_fn_error $? "$HAL_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $HAL_PKG_ERRORS" >&5 $as_echo "$as_me: $HAL_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_HAL="no" if test "x$required" = "xyes"; then as_fn_error $? "$HAL_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $HAL_PKG_ERRORS" >&5 $as_echo "$as_me: $HAL_PKG_ERRORS" >&6;} fi else HAL_CFLAGS=$pkg_cv_HAL_CFLAGS HAL_LIBS=$pkg_cv_HAL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_HAL="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_HAL = xno; then USE_HAL=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: halelements" >&5 $as_echo "$as_me: *** These plugins will be built: halelements" >&6;} fi fi if test x$USE_HAL = xyes; then : if test "xhalelements" != "x"; then GST_PLUGINS_YES="\thalelements\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_HAL /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: halelements" >&5 $as_echo "$as_me: *** These plugins will not be built: halelements" >&6;} if test "xhalelements" != "x"; then GST_PLUGINS_NO="\thalelements\n$GST_PLUGINS_NO" fi : fi if test x$USE_HAL = xyes; then USE_HAL_TRUE= USE_HAL_FALSE='#' else USE_HAL_TRUE='#' USE_HAL_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Jack ***" >&5 $as_echo "$as_me: *** checking feature: Jack ***" >&6;} if test "xjack" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: jack ***" >&5 $as_echo "$as_me: *** for plug-ins: jack ***" >&6;} fi NOUSE= if test "x$USE_JACK" = "xno"; then NOUSE="yes" fi # Check whether --enable-jack was given. if test "${enable_jack+set}" = set; then : enableval=$enable_jack; case "${enableval}" in yes) USE_JACK=yes;; no) USE_JACK=no;; *) as_fn_error $? "bad value ${enableval} for --enable-jack" "$LINENO" 5 ;; esac else USE_JACK=yes fi if test "x$NOUSE" = "xyes"; then USE_JACK="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** jack pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_JACK = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_JACK=no pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.99.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack >= 0.99.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "jack >= 0.99.10" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.99.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack >= 0.99.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "jack >= 0.99.10" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "jack >= 0.99.10"` else JACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "jack >= 0.99.10"` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_JACK="no" elif test $pkg_failed = untried; then HAVE_JACK="no" else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_JACK="yes" fi which="jack >= 0.120.1 jack < 1.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK_0_120_1" >&5 $as_echo_n "checking for JACK_0_120_1... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$JACK_0_120_1_CFLAGS"; then pkg_cv_JACK_0_120_1_CFLAGS="$JACK_0_120_1_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_0_120_1_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$JACK_0_120_1_LIBS"; then pkg_cv_JACK_0_120_1_LIBS="$JACK_0_120_1_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_0_120_1_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_0_120_1_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else JACK_0_120_1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$JACK_0_120_1_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_JACK_0_120_1="no" if test "x$required" = "xyes"; then as_fn_error $? "$JACK_0_120_1_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_0_120_1_PKG_ERRORS" >&5 $as_echo "$as_me: $JACK_0_120_1_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_JACK_0_120_1="no" if test "x$required" = "xyes"; then as_fn_error $? "$JACK_0_120_1_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_0_120_1_PKG_ERRORS" >&5 $as_echo "$as_me: $JACK_0_120_1_PKG_ERRORS" >&6;} fi else JACK_0_120_1_CFLAGS=$pkg_cv_JACK_0_120_1_CFLAGS JACK_0_120_1_LIBS=$pkg_cv_JACK_0_120_1_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_JACK_0_120_1="yes" fi if test x$HAVE_JACK_0_120_1 = xyes; then $as_echo "#define HAVE_JACK_0_120_1 1" >>confdefs.h fi which="jack >= 1.9.7" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK_1_9_7" >&5 $as_echo_n "checking for JACK_1_9_7... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$JACK_1_9_7_CFLAGS"; then pkg_cv_JACK_1_9_7_CFLAGS="$JACK_1_9_7_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_1_9_7_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$JACK_1_9_7_LIBS"; then pkg_cv_JACK_1_9_7_LIBS="$JACK_1_9_7_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_1_9_7_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_1_9_7_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else JACK_1_9_7_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$JACK_1_9_7_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_JACK_1_9_7="no" if test "x$required" = "xyes"; then as_fn_error $? "$JACK_1_9_7_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_1_9_7_PKG_ERRORS" >&5 $as_echo "$as_me: $JACK_1_9_7_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_JACK_1_9_7="no" if test "x$required" = "xyes"; then as_fn_error $? "$JACK_1_9_7_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $JACK_1_9_7_PKG_ERRORS" >&5 $as_echo "$as_me: $JACK_1_9_7_PKG_ERRORS" >&6;} fi else JACK_1_9_7_CFLAGS=$pkg_cv_JACK_1_9_7_CFLAGS JACK_1_9_7_LIBS=$pkg_cv_JACK_1_9_7_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_JACK_1_9_7="yes" fi if test x$HAVE_JACK_1_9_7 = xyes; then $as_echo "#define HAVE_JACK_1_9_7 1" >>confdefs.h fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_JACK = xno; then USE_JACK=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: jack" >&5 $as_echo "$as_me: *** These plugins will be built: jack" >&6;} fi fi if test x$USE_JACK = xyes; then : if test "xjack" != "x"; then GST_PLUGINS_YES="\tjack\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_JACK /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: jack" >&5 $as_echo "$as_me: *** These plugins will not be built: jack" >&6;} if test "xjack" != "x"; then GST_PLUGINS_NO="\tjack\n$GST_PLUGINS_NO" fi : fi if test x$USE_JACK = xyes; then USE_JACK_TRUE= USE_JACK_FALSE='#' else USE_JACK_TRUE='#' USE_JACK_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: jpeg library ***" >&5 $as_echo "$as_me: *** checking feature: jpeg library ***" >&6;} if test "xjpeg" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: jpeg ***" >&5 $as_echo "$as_me: *** for plug-ins: jpeg ***" >&6;} fi NOUSE= if test "x$USE_JPEG" = "xno"; then NOUSE="yes" fi # Check whether --enable-jpeg was given. if test "${enable_jpeg+set}" = set; then : enableval=$enable_jpeg; case "${enableval}" in yes) USE_JPEG=yes;; no) USE_JPEG=no;; *) as_fn_error $? "bad value ${enableval} for --enable-jpeg" "$LINENO" 5 ;; esac else USE_JPEG=yes fi if test "x$NOUSE" = "xyes"; then USE_JPEG="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jpeg pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** jpeg pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_JPEG = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_JPEG=no # Check whether --with-jpeg-mmx was given. if test "${with_jpeg_mmx+set}" = set; then : withval=$with_jpeg_mmx; fi OLD_LIBS="$LIBS" if test x$with_jpeg_mmx != x; then LIBS="$LIBS -L$with_jpeg_mmx" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg-mmx" >&5 $as_echo_n "checking for jpeg_set_defaults in -ljpeg-mmx... " >&6; } if ${ac_cv_lib_jpeg_mmx_jpeg_set_defaults+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg-mmx $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_set_defaults (); int main () { return jpeg_set_defaults (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_mmx_jpeg_set_defaults=yes else ac_cv_lib_jpeg_mmx_jpeg_set_defaults=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_mmx_jpeg_set_defaults" >&5 $as_echo "$ac_cv_lib_jpeg_mmx_jpeg_set_defaults" >&6; } if test "x$ac_cv_lib_jpeg_mmx_jpeg_set_defaults" = xyes; then : HAVE_JPEG="yes" else HAVE_JPEG="no" fi JPEG_LIBS="$LIBS -ljpeg-mmx" LIBS="$OLD_LIBS" if test x$HAVE_JPEG != xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg" >&5 $as_echo_n "checking for jpeg_set_defaults in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_set_defaults+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_set_defaults (); int main () { return jpeg_set_defaults (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_set_defaults=yes else ac_cv_lib_jpeg_jpeg_set_defaults=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_set_defaults" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_set_defaults" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_set_defaults" = xyes; then : HAVE_JPEG="yes" else HAVE_JPEG="no" fi JPEG_LIBS="-ljpeg" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_JPEG = xno; then USE_JPEG=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: jpeg" >&5 $as_echo "$as_me: *** These plugins will be built: jpeg" >&6;} fi fi if test x$USE_JPEG = xyes; then : if test "xjpeg" != "x"; then GST_PLUGINS_YES="\tjpeg\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_JPEG /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: jpeg" >&5 $as_echo "$as_me: *** These plugins will not be built: jpeg" >&6;} if test "xjpeg" != "x"; then GST_PLUGINS_NO="\tjpeg\n$GST_PLUGINS_NO" fi : fi if test x$USE_JPEG = xyes; then USE_JPEG_TRUE= USE_JPEG_FALSE='#' else USE_JPEG_TRUE='#' USE_JPEG_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libcaca coloured ASCII art ***" >&5 $as_echo "$as_me: *** checking feature: libcaca coloured ASCII art ***" >&6;} if test "xcacasink" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: cacasink ***" >&5 $as_echo "$as_me: *** for plug-ins: cacasink ***" >&6;} fi NOUSE= if test "x$USE_LIBCACA" = "xno"; then NOUSE="yes" fi # Check whether --enable-libcaca was given. if test "${enable_libcaca+set}" = set; then : enableval=$enable_libcaca; case "${enableval}" in yes) USE_LIBCACA=yes;; no) USE_LIBCACA=no;; *) as_fn_error $? "bad value ${enableval} for --enable-libcaca" "$LINENO" 5 ;; esac else USE_LIBCACA=yes fi if test "x$NOUSE" = "xyes"; then USE_LIBCACA="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** cacasink pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** cacasink pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_LIBCACA = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_LIBCACA=no which="caca" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCACA" >&5 $as_echo_n "checking for LIBCACA... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBCACA_CFLAGS"; then pkg_cv_LIBCACA_CFLAGS="$LIBCACA_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCACA_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBCACA_LIBS"; then pkg_cv_LIBCACA_LIBS="$LIBCACA_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCACA_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBCACA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else LIBCACA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$LIBCACA_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBCACA="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBCACA_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBCACA_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBCACA_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_LIBCACA="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBCACA_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBCACA_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBCACA_PKG_ERRORS" >&6;} fi else LIBCACA_CFLAGS=$pkg_cv_LIBCACA_CFLAGS LIBCACA_LIBS=$pkg_cv_LIBCACA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBCACA="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_LIBCACA = xno; then USE_LIBCACA=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: cacasink" >&5 $as_echo "$as_me: *** These plugins will be built: cacasink" >&6;} fi fi if test x$USE_LIBCACA = xyes; then : if test "xcacasink" != "x"; then GST_PLUGINS_YES="\tcacasink\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_LIBCACA /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: cacasink" >&5 $as_echo "$as_me: *** These plugins will not be built: cacasink" >&6;} if test "xcacasink" != "x"; then GST_PLUGINS_NO="\tcacasink\n$GST_PLUGINS_NO" fi : fi if test x$USE_LIBCACA = xyes; then USE_LIBCACA_TRUE= USE_LIBCACA_FALSE='#' else USE_LIBCACA_TRUE='#' USE_LIBCACA_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libdv DV demuxer/decoder ***" >&5 $as_echo "$as_me: *** checking feature: libdv DV demuxer/decoder ***" >&6;} if test "xdv" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dv ***" >&5 $as_echo "$as_me: *** for plug-ins: dv ***" >&6;} fi NOUSE= if test "x$USE_LIBDV" = "xno"; then NOUSE="yes" fi # Check whether --enable-libdv was given. if test "${enable_libdv+set}" = set; then : enableval=$enable_libdv; case "${enableval}" in yes) USE_LIBDV=yes;; no) USE_LIBDV=no;; *) as_fn_error $? "bad value ${enableval} for --enable-libdv" "$LINENO" 5 ;; esac else USE_LIBDV=yes fi if test "x$NOUSE" = "xyes"; then USE_LIBDV="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dv pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** dv pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_LIBDV = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_LIBDV=no which="libdv >= 0.100" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBDV" >&5 $as_echo_n "checking for LIBDV... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBDV_CFLAGS"; then pkg_cv_LIBDV_CFLAGS="$LIBDV_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBDV_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBDV_LIBS"; then pkg_cv_LIBDV_LIBS="$LIBDV_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBDV_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBDV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else LIBDV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$LIBDV_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBDV="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBDV_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBDV_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBDV_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_LIBDV="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBDV_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBDV_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBDV_PKG_ERRORS" >&6;} fi else LIBDV_CFLAGS=$pkg_cv_LIBDV_CFLAGS LIBDV_LIBS=$pkg_cv_LIBDV_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBDV="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_LIBDV = xno; then USE_LIBDV=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dv" >&5 $as_echo "$as_me: *** These plugins will be built: dv" >&6;} fi fi if test x$USE_LIBDV = xyes; then : if test "xdv" != "x"; then GST_PLUGINS_YES="\tdv\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_LIBDV /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dv" >&5 $as_echo "$as_me: *** These plugins will not be built: dv" >&6;} if test "xdv" != "x"; then GST_PLUGINS_NO="\tdv\n$GST_PLUGINS_NO" fi : fi if test x$USE_LIBDV = xyes; then USE_LIBDV_TRUE= USE_LIBDV_FALSE='#' else USE_LIBDV_TRUE='#' USE_LIBDV_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Portable Network Graphics library ***" >&5 $as_echo "$as_me: *** checking feature: Portable Network Graphics library ***" >&6;} if test "xpng" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: png ***" >&5 $as_echo "$as_me: *** for plug-ins: png ***" >&6;} fi NOUSE= if test "x$USE_LIBPNG" = "xno"; then NOUSE="yes" fi # Check whether --enable-libpng was given. if test "${enable_libpng+set}" = set; then : enableval=$enable_libpng; case "${enableval}" in yes) USE_LIBPNG=yes;; no) USE_LIBPNG=no;; *) as_fn_error $? "bad value ${enableval} for --enable-libpng" "$LINENO" 5 ;; esac else USE_LIBPNG=yes fi if test "x$NOUSE" = "xyes"; then USE_LIBPNG="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** png pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** png pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_LIBPNG = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_LIBPNG=no which="libpng >= 1.2" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5 $as_echo_n "checking for LIBPNG... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBPNG_CFLAGS"; then pkg_cv_LIBPNG_CFLAGS="$LIBPNG_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBPNG_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBPNG_LIBS"; then pkg_cv_LIBPNG_LIBS="$LIBPNG_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBPNG_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else LIBPNG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$LIBPNG_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBPNG="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBPNG_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBPNG_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBPNG_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_LIBPNG="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBPNG_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBPNG_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBPNG_PKG_ERRORS" >&6;} fi else LIBPNG_CFLAGS=$pkg_cv_LIBPNG_CFLAGS LIBPNG_LIBS=$pkg_cv_LIBPNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBPNG="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_LIBPNG = xno; then USE_LIBPNG=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: png" >&5 $as_echo "$as_me: *** These plugins will be built: png" >&6;} fi fi if test x$USE_LIBPNG = xyes; then : if test "xpng" != "x"; then GST_PLUGINS_YES="\tpng\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_LIBPNG /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: png" >&5 $as_echo "$as_me: *** These plugins will not be built: png" >&6;} if test "xpng" != "x"; then GST_PLUGINS_NO="\tpng\n$GST_PLUGINS_NO" fi : fi if test x$USE_LIBPNG = xyes; then USE_LIBPNG_TRUE= USE_LIBPNG_FALSE='#' else USE_LIBPNG_TRUE='#' USE_LIBPNG_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: pulseaudio plug-in ***" >&5 $as_echo "$as_me: *** checking feature: pulseaudio plug-in ***" >&6;} if test "xpulseaudio" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: pulseaudio ***" >&5 $as_echo "$as_me: *** for plug-ins: pulseaudio ***" >&6;} fi NOUSE= if test "x$USE_PULSE" = "xno"; then NOUSE="yes" fi # Check whether --enable-pulse was given. if test "${enable_pulse+set}" = set; then : enableval=$enable_pulse; case "${enableval}" in yes) USE_PULSE=yes;; no) USE_PULSE=no;; *) as_fn_error $? "bad value ${enableval} for --enable-pulse" "$LINENO" 5 ;; esac else USE_PULSE=yes fi if test "x$NOUSE" = "xyes"; then USE_PULSE="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pulseaudio pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pulseaudio pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_PULSE = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_PULSE=no for ac_header in process.h do : ac_fn_c_check_header_mongrel "$LINENO" "process.h" "ac_cv_header_process_h" "$ac_includes_default" if test "x$ac_cv_header_process_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PROCESS_H 1 _ACEOF fi done which="libpulse >= 0.9.16" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE" >&5 $as_echo_n "checking for PULSE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PULSE_CFLAGS"; then pkg_cv_PULSE_CFLAGS="$PULSE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PULSE_LIBS"; then pkg_cv_PULSE_LIBS="$PULSE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else PULSE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$PULSE_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_PULSE="no" if test "x$required" = "xyes"; then as_fn_error $? "$PULSE_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_PKG_ERRORS" >&5 $as_echo "$as_me: $PULSE_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_PULSE="no" if test "x$required" = "xyes"; then as_fn_error $? "$PULSE_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_PKG_ERRORS" >&5 $as_echo "$as_me: $PULSE_PKG_ERRORS" >&6;} fi else PULSE_CFLAGS=$pkg_cv_PULSE_CFLAGS PULSE_LIBS=$pkg_cv_PULSE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_PULSE="yes" fi which="libpulse >= 0.9.20" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE_0_9_20" >&5 $as_echo_n "checking for PULSE_0_9_20... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PULSE_0_9_20_CFLAGS"; then pkg_cv_PULSE_0_9_20_CFLAGS="$PULSE_0_9_20_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_0_9_20_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PULSE_0_9_20_LIBS"; then pkg_cv_PULSE_0_9_20_LIBS="$PULSE_0_9_20_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_0_9_20_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSE_0_9_20_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else PULSE_0_9_20_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$PULSE_0_9_20_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_PULSE_0_9_20="no" if test "x$required" = "xyes"; then as_fn_error $? "$PULSE_0_9_20_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_0_9_20_PKG_ERRORS" >&5 $as_echo "$as_me: $PULSE_0_9_20_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_PULSE_0_9_20="no" if test "x$required" = "xyes"; then as_fn_error $? "$PULSE_0_9_20_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_0_9_20_PKG_ERRORS" >&5 $as_echo "$as_me: $PULSE_0_9_20_PKG_ERRORS" >&6;} fi else PULSE_0_9_20_CFLAGS=$pkg_cv_PULSE_0_9_20_CFLAGS PULSE_0_9_20_LIBS=$pkg_cv_PULSE_0_9_20_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_PULSE_0_9_20="yes" fi if test x$HAVE_PULSE_0_9_20 = xyes; then $as_echo "#define HAVE_PULSE_0_9_20 1" >>confdefs.h fi which="libpulse >= 0.98" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE_1_0" >&5 $as_echo_n "checking for PULSE_1_0... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PULSE_1_0_CFLAGS"; then pkg_cv_PULSE_1_0_CFLAGS="$PULSE_1_0_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_1_0_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PULSE_1_0_LIBS"; then pkg_cv_PULSE_1_0_LIBS="$PULSE_1_0_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_1_0_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSE_1_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else PULSE_1_0_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$PULSE_1_0_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_PULSE_1_0="no" if test "x$required" = "xyes"; then as_fn_error $? "$PULSE_1_0_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_1_0_PKG_ERRORS" >&5 $as_echo "$as_me: $PULSE_1_0_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_PULSE_1_0="no" if test "x$required" = "xyes"; then as_fn_error $? "$PULSE_1_0_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $PULSE_1_0_PKG_ERRORS" >&5 $as_echo "$as_me: $PULSE_1_0_PKG_ERRORS" >&6;} fi else PULSE_1_0_CFLAGS=$pkg_cv_PULSE_1_0_CFLAGS PULSE_1_0_LIBS=$pkg_cv_PULSE_1_0_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_PULSE_1_0="yes" fi if test x$HAVE_PULSE_1_0 = xyes; then $as_echo "#define HAVE_PULSE_1_0 1" >>confdefs.h fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_PULSE = xno; then USE_PULSE=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: pulseaudio" >&5 $as_echo "$as_me: *** These plugins will be built: pulseaudio" >&6;} fi fi if test x$USE_PULSE = xyes; then : if test "xpulseaudio" != "x"; then GST_PLUGINS_YES="\tpulseaudio\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_PULSE /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: pulseaudio" >&5 $as_echo "$as_me: *** These plugins will not be built: pulseaudio" >&6;} if test "xpulseaudio" != "x"; then GST_PLUGINS_NO="\tpulseaudio\n$GST_PLUGINS_NO" fi : fi if test x$USE_PULSE = xyes; then USE_PULSE_TRUE= USE_PULSE_FALSE='#' else USE_PULSE_TRUE='#' USE_PULSE_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: raw1394 and avc1394 library ***" >&5 $as_echo "$as_me: *** checking feature: raw1394 and avc1394 library ***" >&6;} if test "x1394" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: 1394 ***" >&5 $as_echo "$as_me: *** for plug-ins: 1394 ***" >&6;} fi NOUSE= if test "x$USE_DV1394" = "xno"; then NOUSE="yes" fi # Check whether --enable-dv1394 was given. if test "${enable_dv1394+set}" = set; then : enableval=$enable_dv1394; case "${enableval}" in yes) USE_DV1394=yes;; no) USE_DV1394=no;; *) as_fn_error $? "bad value ${enableval} for --enable-dv1394" "$LINENO" 5 ;; esac else USE_DV1394=yes fi if test "x$NOUSE" = "xyes"; then USE_DV1394="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** 1394 pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** 1394 pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_DV1394 = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_DV1394=no which="libraw1394 >= 2.0.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAW1394" >&5 $as_echo_n "checking for RAW1394... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$RAW1394_CFLAGS"; then pkg_cv_RAW1394_CFLAGS="$RAW1394_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_RAW1394_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$RAW1394_LIBS"; then pkg_cv_RAW1394_LIBS="$RAW1394_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_RAW1394_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then RAW1394_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else RAW1394_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$RAW1394_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_RAW1394="no" if test "x$required" = "xyes"; then as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 $as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_RAW1394="no" if test "x$required" = "xyes"; then as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 $as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} fi else RAW1394_CFLAGS=$pkg_cv_RAW1394_CFLAGS RAW1394_LIBS=$pkg_cv_RAW1394_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_RAW1394="yes" fi which="libiec61883 >= 1.0.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBIEC61883" >&5 $as_echo_n "checking for LIBIEC61883... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBIEC61883_CFLAGS"; then pkg_cv_LIBIEC61883_CFLAGS="$LIBIEC61883_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBIEC61883_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBIEC61883_LIBS"; then pkg_cv_LIBIEC61883_LIBS="$LIBIEC61883_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBIEC61883_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBIEC61883_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else LIBIEC61883_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$LIBIEC61883_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBIEC61883="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBIEC61883_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBIEC61883_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBIEC61883_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_LIBIEC61883="no" if test "x$required" = "xyes"; then as_fn_error $? "$LIBIEC61883_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBIEC61883_PKG_ERRORS" >&5 $as_echo "$as_me: $LIBIEC61883_PKG_ERRORS" >&6;} fi else LIBIEC61883_CFLAGS=$pkg_cv_LIBIEC61883_CFLAGS LIBIEC61883_LIBS=$pkg_cv_LIBIEC61883_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBIEC61883="yes" fi if test x$HAVE_RAW1394 = xyes && \ test x$HAVE_LIBIEC61883 = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for avc1394_send_command in -lavc1394" >&5 $as_echo_n "checking for avc1394_send_command in -lavc1394... " >&6; } if ${ac_cv_lib_avc1394_avc1394_send_command+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavc1394 $RAW1394_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char avc1394_send_command (); int main () { return avc1394_send_command (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avc1394_avc1394_send_command=yes else ac_cv_lib_avc1394_avc1394_send_command=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avc1394_avc1394_send_command" >&5 $as_echo "$ac_cv_lib_avc1394_avc1394_send_command" >&6; } if test "x$ac_cv_lib_avc1394_avc1394_send_command" = xyes; then : HAVE_AVC1394=yes else HAVE_AVC1394=no fi if test "x$HAVE_AVC1394" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/avc1394.h" "ac_cv_header_libavc1394_avc1394_h" "$ac_includes_default" if test "x$ac_cv_header_libavc1394_avc1394_h" = xyes; then : : else HAVE_AVC1394=no fi if test "x$HAVE_AVC1394" = "xyes"; then AVC1394_LIBS="-lavc1394" else : fi else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rom1394_free_directory in -lrom1394" >&5 $as_echo_n "checking for rom1394_free_directory in -lrom1394... " >&6; } if ${ac_cv_lib_rom1394_rom1394_free_directory+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrom1394 $RAW1394_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rom1394_free_directory (); int main () { return rom1394_free_directory (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rom1394_rom1394_free_directory=yes else ac_cv_lib_rom1394_rom1394_free_directory=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rom1394_rom1394_free_directory" >&5 $as_echo "$ac_cv_lib_rom1394_rom1394_free_directory" >&6; } if test "x$ac_cv_lib_rom1394_rom1394_free_directory" = xyes; then : HAVE_ROM1394=yes else HAVE_ROM1394=no fi if test "x$HAVE_ROM1394" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/rom1394.h" "ac_cv_header_libavc1394_rom1394_h" "$ac_includes_default" if test "x$ac_cv_header_libavc1394_rom1394_h" = xyes; then : : else HAVE_ROM1394=no fi if test "x$HAVE_ROM1394" = "xyes"; then ROM1394_LIBS="-lrom1394" else : fi else : fi if test x$HAVE_AVC1394 = xyes && \ test x$HAVE_AVC1394 = xyes && \ test x$HAVE_ROM1394 = xyes; then HAVE_DV1394=yes DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS $LIBIEC61883_LIBS" DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" fi else if test x$HAVE_RAW1394 = xno; then which="libraw1394 >= 1.1.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAW1394" >&5 $as_echo_n "checking for RAW1394... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$RAW1394_CFLAGS"; then pkg_cv_RAW1394_CFLAGS="$RAW1394_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_RAW1394_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$RAW1394_LIBS"; then pkg_cv_RAW1394_LIBS="$RAW1394_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_RAW1394_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then RAW1394_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else RAW1394_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$RAW1394_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_RAW1394="no" if test "x$required" = "xyes"; then as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 $as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_RAW1394="no" if test "x$required" = "xyes"; then as_fn_error $? "$RAW1394_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $RAW1394_PKG_ERRORS" >&5 $as_echo "$as_me: $RAW1394_PKG_ERRORS" >&6;} fi else RAW1394_CFLAGS=$pkg_cv_RAW1394_CFLAGS RAW1394_LIBS=$pkg_cv_RAW1394_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_RAW1394="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for avc1394_send_command in -lavc1394" >&5 $as_echo_n "checking for avc1394_send_command in -lavc1394... " >&6; } if ${ac_cv_lib_avc1394_avc1394_send_command+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavc1394 $RAW1394_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char avc1394_send_command (); int main () { return avc1394_send_command (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avc1394_avc1394_send_command=yes else ac_cv_lib_avc1394_avc1394_send_command=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avc1394_avc1394_send_command" >&5 $as_echo "$ac_cv_lib_avc1394_avc1394_send_command" >&6; } if test "x$ac_cv_lib_avc1394_avc1394_send_command" = xyes; then : HAVE_AVC1394=yes else HAVE_AVC1394=no fi if test "x$HAVE_AVC1394" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/avc1394.h" "ac_cv_header_libavc1394_avc1394_h" "$ac_includes_default" if test "x$ac_cv_header_libavc1394_avc1394_h" = xyes; then : : else HAVE_AVC1394=no fi if test "x$HAVE_AVC1394" = "xyes"; then AVC1394_LIBS="-lavc1394" else : fi else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rom1394_free_directory in -lrom1394" >&5 $as_echo_n "checking for rom1394_free_directory in -lrom1394... " >&6; } if ${ac_cv_lib_rom1394_rom1394_free_directory+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrom1394 $RAW1394_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char rom1394_free_directory (); int main () { return rom1394_free_directory (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rom1394_rom1394_free_directory=yes else ac_cv_lib_rom1394_rom1394_free_directory=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rom1394_rom1394_free_directory" >&5 $as_echo "$ac_cv_lib_rom1394_rom1394_free_directory" >&6; } if test "x$ac_cv_lib_rom1394_rom1394_free_directory" = xyes; then : HAVE_ROM1394=yes else HAVE_ROM1394=no fi if test "x$HAVE_ROM1394" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "libavc1394/rom1394.h" "ac_cv_header_libavc1394_rom1394_h" "$ac_includes_default" if test "x$ac_cv_header_libavc1394_rom1394_h" = xyes; then : : else HAVE_ROM1394=no fi if test "x$HAVE_ROM1394" = "xyes"; then ROM1394_LIBS="-lrom1394" else : fi else : fi if test x$HAVE_RAW1394 = xyes && \ test x$HAVE_AVC1394 = xyes && \ test x$HAVE_ROM1394 = xyes; then HAVE_DV1394=yes DV1394_LIBS="$RAW1394_LIBS $AVC1394_LIBS $ROM1394_LIBS" DV1394_CFLAGS="$RAW1394_CFLAGS" if test x$HAVE_LIBIEC61883 = xyes; then DV1394_CFLAGS="$RAW1394_CFLAGS $LIBIEC61883_CFLAGS -DHAVE_LIBIEC61883" DV1394_LIBS="$DV1394_LIBS $LIBIEC61883_LIBS" fi fi fi fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_DV1394 = xno; then USE_DV1394=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: 1394" >&5 $as_echo "$as_me: *** These plugins will be built: 1394" >&6;} fi fi if test x$USE_DV1394 = xyes; then : if test "x1394" != "x"; then GST_PLUGINS_YES="\t1394\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_DV1394 /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: 1394" >&5 $as_echo "$as_me: *** These plugins will not be built: 1394" >&6;} if test "x1394" != "x"; then GST_PLUGINS_NO="\t1394\n$GST_PLUGINS_NO" fi : fi if test x$USE_DV1394 = xyes; then USE_DV1394_TRUE= USE_DV1394_FALSE='#' else USE_DV1394_TRUE='#' USE_DV1394_FALSE= fi if test "x${HAVE_LIBIEC61883}" = xyes ; then USE_LIBIEC61883_TRUE= USE_LIBIEC61883_FALSE='#' else USE_LIBIEC61883_TRUE='#' USE_LIBIEC61883_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Shoutcast/Icecast client library ***" >&5 $as_echo "$as_me: *** checking feature: Shoutcast/Icecast client library ***" >&6;} if test "xshout2" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: shout2 ***" >&5 $as_echo "$as_me: *** for plug-ins: shout2 ***" >&6;} fi NOUSE= if test "x$USE_SHOUT2" = "xno"; then NOUSE="yes" fi # Check whether --enable-shout2 was given. if test "${enable_shout2+set}" = set; then : enableval=$enable_shout2; case "${enableval}" in yes) USE_SHOUT2=yes;; no) USE_SHOUT2=no;; *) as_fn_error $? "bad value ${enableval} for --enable-shout2" "$LINENO" 5 ;; esac else USE_SHOUT2=yes fi if test "x$NOUSE" = "xyes"; then USE_SHOUT2="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** shout2 pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** shout2 pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_SHOUT2 = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_SHOUT2=no which="shout >= 2.0" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHOUT2" >&5 $as_echo_n "checking for SHOUT2... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SHOUT2_CFLAGS"; then pkg_cv_SHOUT2_CFLAGS="$SHOUT2_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SHOUT2_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SHOUT2_LIBS"; then pkg_cv_SHOUT2_LIBS="$SHOUT2_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SHOUT2_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SHOUT2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else SHOUT2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$SHOUT2_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_SHOUT2="no" if test "x$required" = "xyes"; then as_fn_error $? "$SHOUT2_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $SHOUT2_PKG_ERRORS" >&5 $as_echo "$as_me: $SHOUT2_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_SHOUT2="no" if test "x$required" = "xyes"; then as_fn_error $? "$SHOUT2_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $SHOUT2_PKG_ERRORS" >&5 $as_echo "$as_me: $SHOUT2_PKG_ERRORS" >&6;} fi else SHOUT2_CFLAGS=$pkg_cv_SHOUT2_CFLAGS SHOUT2_LIBS=$pkg_cv_SHOUT2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_SHOUT2="yes" fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_SHOUT2 = xno; then USE_SHOUT2=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: shout2" >&5 $as_echo "$as_me: *** These plugins will be built: shout2" >&6;} fi fi if test x$USE_SHOUT2 = xyes; then : if test "xshout2" != "x"; then GST_PLUGINS_YES="\tshout2\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_SHOUT2 /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: shout2" >&5 $as_echo "$as_me: *** These plugins will not be built: shout2" >&6;} if test "xshout2" != "x"; then GST_PLUGINS_NO="\tshout2\n$GST_PLUGINS_NO" fi : fi if test x$USE_SHOUT2 = xyes; then USE_SHOUT2_TRUE= USE_SHOUT2_FALSE='#' else USE_SHOUT2_TRUE='#' USE_SHOUT2_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: soup http client plugin (2.4) ***" >&5 $as_echo "$as_me: *** checking feature: soup http client plugin (2.4) ***" >&6;} if test "xsouphttpsrc" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: souphttpsrc ***" >&5 $as_echo "$as_me: *** for plug-ins: souphttpsrc ***" >&6;} fi NOUSE= if test "x$USE_SOUP" = "xno"; then NOUSE="yes" fi # Check whether --enable-soup was given. if test "${enable_soup+set}" = set; then : enableval=$enable_soup; case "${enableval}" in yes) USE_SOUP=yes;; no) USE_SOUP=no;; *) as_fn_error $? "bad value ${enableval} for --enable-soup" "$LINENO" 5 ;; esac else USE_SOUP=yes fi if test "x$NOUSE" = "xyes"; then USE_SOUP="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** souphttpsrc pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** souphttpsrc pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_SOUP = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_SOUP=no pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUP" >&5 $as_echo_n "checking for SOUP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SOUP_CFLAGS"; then pkg_cv_SOUP_CFLAGS="$SOUP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-gnome-2.4 >= 2.3.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-gnome-2.4 >= 2.3.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-gnome-2.4 >= 2.3.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SOUP_LIBS"; then pkg_cv_SOUP_LIBS="$SOUP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-gnome-2.4 >= 2.3.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-gnome-2.4 >= 2.3.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SOUP_LIBS=`$PKG_CONFIG --libs "libsoup-gnome-2.4 >= 2.3.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsoup-gnome-2.4 >= 2.3.2"` else SOUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsoup-gnome-2.4 >= 2.3.2"` fi # Put the nasty error message in config.log where it belongs echo "$SOUP_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUP" >&5 $as_echo_n "checking for SOUP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SOUP_CFLAGS"; then pkg_cv_SOUP_CFLAGS="$SOUP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-2.4 >= 2.26" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SOUP_LIBS"; then pkg_cv_SOUP_LIBS="$SOUP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SOUP_LIBS=`$PKG_CONFIG --libs "libsoup-2.4 >= 2.26" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` else SOUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` fi # Put the nasty error message in config.log where it belongs echo "$SOUP_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_SOUP="no" elif test $pkg_failed = untried; then HAVE_SOUP="no" else SOUP_CFLAGS=$pkg_cv_SOUP_CFLAGS SOUP_LIBS=$pkg_cv_SOUP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_SOUP="yes" fi elif test $pkg_failed = untried; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUP" >&5 $as_echo_n "checking for SOUP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SOUP_CFLAGS"; then pkg_cv_SOUP_CFLAGS="$SOUP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-2.4 >= 2.26" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SOUP_LIBS"; then pkg_cv_SOUP_LIBS="$SOUP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.26\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.26") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SOUP_LIBS=`$PKG_CONFIG --libs "libsoup-2.4 >= 2.26" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` else SOUP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsoup-2.4 >= 2.26"` fi # Put the nasty error message in config.log where it belongs echo "$SOUP_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_SOUP="no" elif test $pkg_failed = untried; then HAVE_SOUP="no" else SOUP_CFLAGS=$pkg_cv_SOUP_CFLAGS SOUP_LIBS=$pkg_cv_SOUP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_SOUP="yes" fi else SOUP_CFLAGS=$pkg_cv_SOUP_CFLAGS SOUP_LIBS=$pkg_cv_SOUP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_SOUP="yes" $as_echo "#define HAVE_LIBSOUP_GNOME 1" >>confdefs.h fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_SOUP = xno; then USE_SOUP=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: souphttpsrc" >&5 $as_echo "$as_me: *** These plugins will be built: souphttpsrc" >&6;} fi fi if test x$USE_SOUP = xyes; then : if test "xsouphttpsrc" != "x"; then GST_PLUGINS_YES="\tsouphttpsrc\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_SOUP /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: souphttpsrc" >&5 $as_echo "$as_me: *** These plugins will not be built: souphttpsrc" >&6;} if test "xsouphttpsrc" != "x"; then GST_PLUGINS_NO="\tsouphttpsrc\n$GST_PLUGINS_NO" fi : fi if test x$USE_SOUP = xyes; then USE_SOUP_TRUE= USE_SOUP_FALSE='#' else USE_SOUP_TRUE='#' USE_SOUP_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: speex speech codec ***" >&5 $as_echo "$as_me: *** checking feature: speex speech codec ***" >&6;} if test "xspeex" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: speex ***" >&5 $as_echo "$as_me: *** for plug-ins: speex ***" >&6;} fi NOUSE= if test "x$USE_SPEEX" = "xno"; then NOUSE="yes" fi # Check whether --enable-speex was given. if test "${enable_speex+set}" = set; then : enableval=$enable_speex; case "${enableval}" in yes) USE_SPEEX=yes;; no) USE_SPEEX=no;; *) as_fn_error $? "bad value ${enableval} for --enable-speex" "$LINENO" 5 ;; esac else USE_SPEEX=yes fi if test "x$NOUSE" = "xyes"; then USE_SPEEX="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** speex pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** speex pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_SPEEX = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_SPEEX=no which="speex >= 1.1.6" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SPEEX" >&5 $as_echo_n "checking for SPEEX... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SPEEX_CFLAGS"; then pkg_cv_SPEEX_CFLAGS="$SPEEX_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SPEEX_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SPEEX_LIBS"; then pkg_cv_SPEEX_LIBS="$SPEEX_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SPEEX_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SPEEX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else SPEEX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$SPEEX_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_SPEEX="no" if test "x$required" = "xyes"; then as_fn_error $? "$SPEEX_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $SPEEX_PKG_ERRORS" >&5 $as_echo "$as_me: $SPEEX_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_SPEEX="no" if test "x$required" = "xyes"; then as_fn_error $? "$SPEEX_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $SPEEX_PKG_ERRORS" >&5 $as_echo "$as_me: $SPEEX_PKG_ERRORS" >&6;} fi else SPEEX_CFLAGS=$pkg_cv_SPEEX_CFLAGS SPEEX_LIBS=$pkg_cv_SPEEX_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_SPEEX="yes" fi if test $HAVE_SPEEX = no then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for speex_bits_init in -lspeex" >&5 $as_echo_n "checking for speex_bits_init in -lspeex... " >&6; } if ${ac_cv_lib_speex_speex_bits_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lspeex $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char speex_bits_init (); int main () { return speex_bits_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_speex_speex_bits_init=yes else ac_cv_lib_speex_speex_bits_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_speex_speex_bits_init" >&5 $as_echo "$ac_cv_lib_speex_speex_bits_init" >&6; } if test "x$ac_cv_lib_speex_speex_bits_init" = xyes; then : HAVE_SPEEX=yes else HAVE_SPEEX=no fi if test "x$HAVE_SPEEX" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "speex/speex.h" "ac_cv_header_speex_speex_h" "$ac_includes_default" if test "x$ac_cv_header_speex_speex_h" = xyes; then : : else HAVE_SPEEX=no fi if test "x$HAVE_SPEEX" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "speex/speex_jitter.h" "ac_cv_header_speex_speex_jitter_h" "$ac_includes_default" if test "x$ac_cv_header_speex_speex_jitter_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for speex_encode_int in -lspeex" >&5 $as_echo_n "checking for speex_encode_int in -lspeex... " >&6; } if ${ac_cv_lib_speex_speex_encode_int+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lspeex $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char speex_encode_int (); int main () { return speex_encode_int (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_speex_speex_encode_int=yes else ac_cv_lib_speex_speex_encode_int=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_speex_speex_encode_int" >&5 $as_echo "$ac_cv_lib_speex_speex_encode_int" >&6; } if test "x$ac_cv_lib_speex_speex_encode_int" = xyes; then : HAVE_SPEEX=yes else HAVE_SPEEX=no fi if test "x$HAVE_SPEEX" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "speex/speex.h" "ac_cv_header_speex_speex_h" "$ac_includes_default" if test "x$ac_cv_header_speex_speex_h" = xyes; then : : else HAVE_SPEEX=no fi if test "x$HAVE_SPEEX" = "xyes"; then HAVE_SPEEX="yes" SPEEX_LIBS="-lspeex" else HAVE_SPEEX="no" fi else HAVE_SPEEX="no" fi else ac_fn_c_check_decl "$LINENO" "SPEEX_GET_LOOKAHEAD" "ac_cv_have_decl_SPEEX_GET_LOOKAHEAD" " #include " if test "x$ac_cv_have_decl_SPEEX_GET_LOOKAHEAD" = xyes; then : HAVE_SPEEX="yes" SPEEX_LIBS="-lspeex" cat >>confdefs.h <<_ACEOF #define SPEEX_1_0 1 _ACEOF else HAVE_SPEEX="no" { $as_echo "$as_me:${as_lineno-$LINENO}: You need at least 1.0.4 to compile the speex plugin" >&5 $as_echo "$as_me: You need at least 1.0.4 to compile the speex plugin" >&6;} fi fi else : fi else : fi fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_SPEEX = xno; then USE_SPEEX=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: speex" >&5 $as_echo "$as_me: *** These plugins will be built: speex" >&6;} fi fi if test x$USE_SPEEX = xyes; then : if test "xspeex" != "x"; then GST_PLUGINS_YES="\tspeex\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_SPEEX /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: speex" >&5 $as_echo "$as_me: *** These plugins will not be built: speex" >&6;} if test "xspeex" != "x"; then GST_PLUGINS_NO="\tspeex\n$GST_PLUGINS_NO" fi : fi if test x$USE_SPEEX = xyes; then USE_SPEEX_TRUE= USE_SPEEX_FALSE='#' else USE_SPEEX_TRUE='#' USE_SPEEX_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: taglib tagging library ***" >&5 $as_echo "$as_me: *** checking feature: taglib tagging library ***" >&6;} if test "xtaglib" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: taglib ***" >&5 $as_echo "$as_me: *** for plug-ins: taglib ***" >&6;} fi NOUSE= if test "x$USE_TAGLIB" = "xno"; then NOUSE="yes" fi # Check whether --enable-taglib was given. if test "${enable_taglib+set}" = set; then : enableval=$enable_taglib; case "${enableval}" in yes) USE_TAGLIB=yes;; no) USE_TAGLIB=no;; *) as_fn_error $? "bad value ${enableval} for --enable-taglib" "$LINENO" 5 ;; esac else USE_TAGLIB=yes fi if test "x$NOUSE" = "xyes"; then USE_TAGLIB="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** taglib pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** taglib pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_TAGLIB = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_TAGLIB=no which="taglib >= 1.5" required="no" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TAGLIB" >&5 $as_echo_n "checking for TAGLIB... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$TAGLIB_CFLAGS"; then pkg_cv_TAGLIB_CFLAGS="$TAGLIB_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TAGLIB_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$TAGLIB_LIBS"; then pkg_cv_TAGLIB_LIBS="$TAGLIB_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5 ($PKG_CONFIG --exists --print-errors "$which") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TAGLIB_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TAGLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"` else TAGLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"` fi # Put the nasty error message in config.log where it belongs echo "$TAGLIB_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_TAGLIB="no" if test "x$required" = "xyes"; then as_fn_error $? "$TAGLIB_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $TAGLIB_PKG_ERRORS" >&5 $as_echo "$as_me: $TAGLIB_PKG_ERRORS" >&6;} fi elif test $pkg_failed = untried; then HAVE_TAGLIB="no" if test "x$required" = "xyes"; then as_fn_error $? "$TAGLIB_PKG_ERRORS" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: $TAGLIB_PKG_ERRORS" >&5 $as_echo "$as_me: $TAGLIB_PKG_ERRORS" >&6;} fi else TAGLIB_CFLAGS=$pkg_cv_TAGLIB_CFLAGS TAGLIB_LIBS=$pkg_cv_TAGLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_TAGLIB="yes" fi if test "x$HAVE_CXX" != "xyes"; then USE_TAGLIB=false { $as_echo "$as_me:${as_lineno-$LINENO}: Not building taglib plugin: no C++ compiler found" >&5 $as_echo "$as_me: Not building taglib plugin: no C++ compiler found" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wno-attributes" >&5 $as_echo_n "checking to see if c++ compiler understands -Wno-attributes... " >&6; } save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -Wno-attributes" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : flag_ok=yes else flag_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS -Wno-attributes" true else TAGLIB_CXXFLAGS="$TAGLIB_CFLAGS" true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5 $as_echo "$flag_ok" >&6; } fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_TAGLIB = xno; then USE_TAGLIB=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: taglib" >&5 $as_echo "$as_me: *** These plugins will be built: taglib" >&6;} fi fi if test x$USE_TAGLIB = xyes; then : if test "xtaglib" != "x"; then GST_PLUGINS_YES="\ttaglib\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_TAGLIB /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: taglib" >&5 $as_echo "$as_me: *** These plugins will not be built: taglib" >&6;} if test "xtaglib" != "x"; then GST_PLUGINS_NO="\ttaglib\n$GST_PLUGINS_NO" fi : fi if test x$USE_TAGLIB = xyes; then USE_TAGLIB_TRUE= USE_TAGLIB_FALSE='#' else USE_TAGLIB_TRUE='#' USE_TAGLIB_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: wavpack plug-in ***" >&5 $as_echo "$as_me: *** checking feature: wavpack plug-in ***" >&6;} if test "xwavpack" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: wavpack ***" >&5 $as_echo "$as_me: *** for plug-ins: wavpack ***" >&6;} fi NOUSE= if test "x$USE_WAVPACK" = "xno"; then NOUSE="yes" fi # Check whether --enable-wavpack was given. if test "${enable_wavpack+set}" = set; then : enableval=$enable_wavpack; case "${enableval}" in yes) USE_WAVPACK=yes;; no) USE_WAVPACK=no;; *) as_fn_error $? "bad value ${enableval} for --enable-wavpack" "$LINENO" 5 ;; esac else USE_WAVPACK=yes fi if test "x$NOUSE" = "xyes"; then USE_WAVPACK="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wavpack pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** wavpack pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_WAVPACK = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_WAVPACK=no pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAVPACK" >&5 $as_echo_n "checking for WAVPACK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$WAVPACK_CFLAGS"; then pkg_cv_WAVPACK_CFLAGS="$WAVPACK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.40.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "wavpack >= 4.40.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WAVPACK_CFLAGS=`$PKG_CONFIG --cflags "wavpack >= 4.40.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$WAVPACK_LIBS"; then pkg_cv_WAVPACK_LIBS="$WAVPACK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.40.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "wavpack >= 4.40.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WAVPACK_LIBS=`$PKG_CONFIG --libs "wavpack >= 4.40.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then WAVPACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wavpack >= 4.40.0"` else WAVPACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wavpack >= 4.40.0"` fi # Put the nasty error message in config.log where it belongs echo "$WAVPACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAVPACK" >&5 $as_echo_n "checking for WAVPACK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$WAVPACK_CFLAGS"; then pkg_cv_WAVPACK_CFLAGS="$WAVPACK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WAVPACK_CFLAGS=`$PKG_CONFIG --cflags "wavpack >= 4.20" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$WAVPACK_LIBS"; then pkg_cv_WAVPACK_LIBS="$WAVPACK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WAVPACK_LIBS=`$PKG_CONFIG --libs "wavpack >= 4.20" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then WAVPACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wavpack >= 4.20"` else WAVPACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wavpack >= 4.20"` fi # Put the nasty error message in config.log where it belongs echo "$WAVPACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_WAVPACK=no elif test $pkg_failed = untried; then HAVE_WAVPACK=no else WAVPACK_CFLAGS=$pkg_cv_WAVPACK_CFLAGS WAVPACK_LIBS=$pkg_cv_WAVPACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_WAVPACK=yes $as_echo "#define WAVPACK_OLD_API 1" >>confdefs.h fi elif test $pkg_failed = untried; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAVPACK" >&5 $as_echo_n "checking for WAVPACK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$WAVPACK_CFLAGS"; then pkg_cv_WAVPACK_CFLAGS="$WAVPACK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WAVPACK_CFLAGS=`$PKG_CONFIG --cflags "wavpack >= 4.20" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$WAVPACK_LIBS"; then pkg_cv_WAVPACK_LIBS="$WAVPACK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wavpack >= 4.20\""; } >&5 ($PKG_CONFIG --exists --print-errors "wavpack >= 4.20") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WAVPACK_LIBS=`$PKG_CONFIG --libs "wavpack >= 4.20" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then WAVPACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wavpack >= 4.20"` else WAVPACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wavpack >= 4.20"` fi # Put the nasty error message in config.log where it belongs echo "$WAVPACK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_WAVPACK=no elif test $pkg_failed = untried; then HAVE_WAVPACK=no else WAVPACK_CFLAGS=$pkg_cv_WAVPACK_CFLAGS WAVPACK_LIBS=$pkg_cv_WAVPACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_WAVPACK=yes $as_echo "#define WAVPACK_OLD_API 1" >>confdefs.h fi else WAVPACK_CFLAGS=$pkg_cv_WAVPACK_CFLAGS WAVPACK_LIBS=$pkg_cv_WAVPACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_WAVPACK=yes fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_WAVPACK = xno; then USE_WAVPACK=no else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: wavpack" >&5 $as_echo "$as_me: *** These plugins will be built: wavpack" >&6;} fi fi if test x$USE_WAVPACK = xyes; then : if test "xwavpack" != "x"; then GST_PLUGINS_YES="\twavpack\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_WAVPACK /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: wavpack" >&5 $as_echo "$as_me: *** These plugins will not be built: wavpack" >&6;} if test "xwavpack" != "x"; then GST_PLUGINS_NO="\twavpack\n$GST_PLUGINS_NO" fi : fi if test x$USE_WAVPACK = xyes; then USE_WAVPACK_TRUE= USE_WAVPACK_FALSE='#' else USE_WAVPACK_TRUE='#' USE_WAVPACK_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: zlib support for qtdemux/matroska ***" >&5 $as_echo "$as_me: *** checking feature: zlib support for qtdemux/matroska ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_ZLIB" = "xno"; then NOUSE="yes" fi # Check whether --enable-zlib was given. if test "${enable_zlib+set}" = set; then : enableval=$enable_zlib; case "${enableval}" in yes) USE_ZLIB=yes;; no) USE_ZLIB=no;; *) as_fn_error $? "bad value ${enableval} for --enable-zlib" "$LINENO" 5 ;; esac else USE_ZLIB=yes fi if test "x$NOUSE" = "xyes"; then USE_ZLIB="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_ZLIB = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_ZLIB=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uncompress in -lz" >&5 $as_echo_n "checking for uncompress in -lz... " >&6; } if ${ac_cv_lib_z_uncompress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char uncompress (); int main () { return uncompress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_uncompress=yes else ac_cv_lib_z_uncompress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_uncompress" >&5 $as_echo "$ac_cv_lib_z_uncompress" >&6; } if test "x$ac_cv_lib_z_uncompress" = xyes; then : HAVE_ZLIB=yes else HAVE_ZLIB=no fi if test "x$HAVE_ZLIB" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : : else HAVE_ZLIB=no fi if test "x$HAVE_ZLIB" = "xyes"; then HAVE_ZLIB="yes" ZLIB_LIBS="-lz" else : fi else : fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_ZLIB = xno; then USE_ZLIB=no else : fi fi if test x$USE_ZLIB = xyes; then : if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_ZLIB /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi : fi if test x$USE_ZLIB = xyes; then USE_ZLIB_TRUE= USE_ZLIB_FALSE='#' else USE_ZLIB_TRUE='#' USE_ZLIB_FALSE= fi echo { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: bz2 library for matroska ***" >&5 $as_echo "$as_me: *** checking feature: bz2 library for matroska ***" >&6;} if test "x" != "x" then { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ***" >&5 $as_echo "$as_me: *** for plug-ins: ***" >&6;} fi NOUSE= if test "x$USE_BZ2" = "xno"; then NOUSE="yes" fi # Check whether --enable-bz2 was given. if test "${enable_bz2+set}" = set; then : enableval=$enable_bz2; case "${enableval}" in yes) USE_BZ2=yes;; no) USE_BZ2=no;; *) as_fn_error $? "bad value ${enableval} for --enable-bz2" "$LINENO" 5 ;; esac else USE_BZ2=yes fi if test "x$NOUSE" = "xyes"; then USE_BZ2="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pre-configured not to be built" >&5 $as_echo "$as_me: WARNING: *** pre-configured not to be built" >&2;} fi NOUSE= if test x$USE_BZ2 = xyes; then gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_BZ2=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzCompress in -lbz2" >&5 $as_echo_n "checking for BZ2_bzCompress in -lbz2... " >&6; } if ${ac_cv_lib_bz2_BZ2_bzCompress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbz2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char BZ2_bzCompress (); int main () { return BZ2_bzCompress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bz2_BZ2_bzCompress=yes else ac_cv_lib_bz2_BZ2_bzCompress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzCompress" >&5 $as_echo "$ac_cv_lib_bz2_BZ2_bzCompress" >&6; } if test "x$ac_cv_lib_bz2_BZ2_bzCompress" = xyes; then : HAVE_BZ2=yes else HAVE_BZ2=no fi if test "x$HAVE_BZ2" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" if test "x$ac_cv_header_bzlib_h" = xyes; then : : else HAVE_BZ2=no fi if test "x$HAVE_BZ2" = "xyes"; then BZ2_LIBS="-lbz2" else : fi else : fi LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS if test x$HAVE_BZ2 = xno; then USE_BZ2=no else : fi fi if test x$USE_BZ2 = xyes; then : if test "x" != "x"; then GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES" fi $as_echo "#define HAVE_BZ2 /**/" >>confdefs.h else : if test "x" != "x"; then GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO" fi : fi if test x$USE_BZ2 = xyes; then USE_BZ2_TRUE= USE_BZ2_FALSE='#' else USE_BZ2_TRUE='#' USE_BZ2_FALSE= fi else if false; then USE_AALIB_TRUE= USE_AALIB_FALSE='#' else USE_AALIB_TRUE='#' USE_AALIB_FALSE= fi if false; then USE_ANNODEX_TRUE= USE_ANNODEX_FALSE='#' else USE_ANNODEX_TRUE='#' USE_ANNODEX_FALSE= fi if false; then USE_BZ2_TRUE= USE_BZ2_FALSE='#' else USE_BZ2_TRUE='#' USE_BZ2_FALSE= fi if false; then USE_CAIRO_TRUE= USE_CAIRO_FALSE='#' else USE_CAIRO_TRUE='#' USE_CAIRO_FALSE= fi if false; then USE_CAIRO_GOBJECT_TRUE= USE_CAIRO_GOBJECT_FALSE='#' else USE_CAIRO_GOBJECT_TRUE='#' USE_CAIRO_GOBJECT_FALSE= fi if false; then USE_DIRECTSOUND_TRUE= USE_DIRECTSOUND_FALSE='#' else USE_DIRECTSOUND_TRUE='#' USE_DIRECTSOUND_FALSE= fi if false; then USE_DV1394_TRUE= USE_DV1394_FALSE='#' else USE_DV1394_TRUE='#' USE_DV1394_FALSE= fi if false; then USE_ESD_TRUE= USE_ESD_FALSE='#' else USE_ESD_TRUE='#' USE_ESD_FALSE= fi if false; then USE_FLAC_TRUE= USE_FLAC_FALSE='#' else USE_FLAC_TRUE='#' USE_FLAC_FALSE= fi if false; then USE_GCONF_TRUE= USE_GCONF_FALSE='#' else USE_GCONF_TRUE='#' USE_GCONF_FALSE= fi if false; then USE_GCONFTOOL_TRUE= USE_GCONFTOOL_FALSE='#' else USE_GCONFTOOL_TRUE='#' USE_GCONFTOOL_FALSE= fi if false; then USE_GDK_PIXBUF_TRUE= USE_GDK_PIXBUF_FALSE='#' else USE_GDK_PIXBUF_TRUE='#' USE_GDK_PIXBUF_FALSE= fi if false; then USE_GST_V4L2_TRUE= USE_GST_V4L2_FALSE='#' else USE_GST_V4L2_TRUE='#' USE_GST_V4L2_FALSE= fi if false; then USE_HAL_TRUE= USE_HAL_FALSE='#' else USE_HAL_TRUE='#' USE_HAL_FALSE= fi if false; then USE_JACK_TRUE= USE_JACK_FALSE='#' else USE_JACK_TRUE='#' USE_JACK_FALSE= fi if false; then USE_JPEG_TRUE= USE_JPEG_FALSE='#' else USE_JPEG_TRUE='#' USE_JPEG_FALSE= fi if false; then USE_LIBCACA_TRUE= USE_LIBCACA_FALSE='#' else USE_LIBCACA_TRUE='#' USE_LIBCACA_FALSE= fi if false; then USE_LIBDV_TRUE= USE_LIBDV_FALSE='#' else USE_LIBDV_TRUE='#' USE_LIBDV_FALSE= fi if false; then USE_LIBIEC61883_TRUE= USE_LIBIEC61883_FALSE='#' else USE_LIBIEC61883_TRUE='#' USE_LIBIEC61883_FALSE= fi if false; then USE_LIBPNG_TRUE= USE_LIBPNG_FALSE='#' else USE_LIBPNG_TRUE='#' USE_LIBPNG_FALSE= fi if false; then USE_OSS_TRUE= USE_OSS_FALSE='#' else USE_OSS_TRUE='#' USE_OSS_FALSE= fi if false; then USE_OSS4_TRUE= USE_OSS4_FALSE='#' else USE_OSS4_TRUE='#' USE_OSS4_FALSE= fi if false; then USE_OSX_AUDIO_TRUE= USE_OSX_AUDIO_FALSE='#' else USE_OSX_AUDIO_TRUE='#' USE_OSX_AUDIO_FALSE= fi if false; then USE_OSX_VIDEO_TRUE= USE_OSX_VIDEO_FALSE='#' else USE_OSX_VIDEO_TRUE='#' USE_OSX_VIDEO_FALSE= fi if false; then USE_PULSE_TRUE= USE_PULSE_FALSE='#' else USE_PULSE_TRUE='#' USE_PULSE_FALSE= fi if false; then USE_SHOUT2_TRUE= USE_SHOUT2_FALSE='#' else USE_SHOUT2_TRUE='#' USE_SHOUT2_FALSE= fi if false; then USE_SOUP_TRUE= USE_SOUP_FALSE='#' else USE_SOUP_TRUE='#' USE_SOUP_FALSE= fi if false; then USE_SPEEX_TRUE= USE_SPEEX_FALSE='#' else USE_SPEEX_TRUE='#' USE_SPEEX_FALSE= fi if false; then USE_SUNAUDIO_TRUE= USE_SUNAUDIO_FALSE='#' else USE_SUNAUDIO_TRUE='#' USE_SUNAUDIO_FALSE= fi if false; then USE_TAGLIB_TRUE= USE_TAGLIB_FALSE='#' else USE_TAGLIB_TRUE='#' USE_TAGLIB_FALSE= fi if false; then USE_WAVPACK_TRUE= USE_WAVPACK_FALSE='#' else USE_WAVPACK_TRUE='#' USE_WAVPACK_FALSE= fi if false; then USE_X_TRUE= USE_X_FALSE='#' else USE_X_TRUE='#' USE_X_FALSE= fi if false; then USE_XSHM_TRUE= USE_XSHM_FALSE='#' else USE_XSHM_TRUE='#' USE_XSHM_FALSE= fi if false; then USE_XVIDEO_TRUE= USE_XVIDEO_FALSE='#' else USE_XVIDEO_TRUE='#' USE_XVIDEO_FALSE= fi if false; then USE_ZLIB_TRUE= USE_ZLIB_FALSE='#' else USE_ZLIB_TRUE='#' USE_ZLIB_FALSE= fi fi if test "x$USE_DEBUG" = xyes; then PROFILE_CFLAGS="-g" fi if test "x$PACKAGE_VERSION_NANO" = "x1"; then DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED" else DEPRECATED_CFLAGS="" fi GST_OPTION_CFLAGS="\$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" GST_OPTION_CXXFLAGS="\$(WARNING_CXXFLAGS) \$(ERROR_CXXFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)" GST_CXXFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)" GST_CFLAGS="-I\$(top_srcdir)/gst-libs $GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)" GST_ALL_LDFLAGS="-no-undefined" GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^_*gst_plugin_desc.*' $GST_ALL_LDFLAGS" ac_config_files="$ac_config_files Makefile gst/Makefile gst/alpha/Makefile gst/apetag/Makefile gst/audiofx/Makefile gst/audioparsers/Makefile gst/auparse/Makefile gst/autodetect/Makefile gst/avi/Makefile gst/cutter/Makefile gst/deinterlace/Makefile gst/debugutils/Makefile gst/effectv/Makefile gst/equalizer/Makefile gst/flv/Makefile gst/goom/Makefile gst/goom2k1/Makefile gst/id3demux/Makefile gst/icydemux/Makefile gst/imagefreeze/Makefile gst/interleave/Makefile gst/isomp4/Makefile gst/law/Makefile gst/level/Makefile gst/matroska/Makefile gst/monoscope/Makefile gst/multifile/Makefile gst/multipart/Makefile gst/replaygain/Makefile gst/rtp/Makefile gst/rtpmanager/Makefile gst/rtsp/Makefile gst/shapewipe/Makefile gst/smpte/Makefile gst/spectrum/Makefile gst/udp/Makefile gst/videobox/Makefile gst/videocrop/Makefile gst/videofilter/Makefile gst/videomixer/Makefile gst/wavenc/Makefile gst/wavparse/Makefile gst/flx/Makefile gst/y4m/Makefile ext/Makefile ext/aalib/Makefile ext/annodex/Makefile ext/cairo/Makefile ext/dv/Makefile ext/esd/Makefile 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 ext/raw1394/Makefile ext/shout2/Makefile ext/soup/Makefile ext/speex/Makefile ext/taglib/Makefile ext/wavpack/Makefile sys/Makefile sys/directsound/Makefile sys/oss/Makefile sys/oss4/Makefile sys/osxaudio/Makefile sys/osxvideo/Makefile sys/sunaudio/Makefile sys/v4l2/Makefile sys/waveform/Makefile sys/ximage/Makefile po/Makefile.in tests/Makefile tests/check/Makefile tests/examples/Makefile tests/examples/audiofx/Makefile tests/examples/cairo/Makefile tests/examples/equalizer/Makefile tests/examples/jack/Makefile tests/examples/level/Makefile tests/examples/pulse/Makefile tests/examples/rtp/Makefile tests/examples/shapewipe/Makefile tests/examples/spectrum/Makefile tests/examples/v4l2/Makefile tests/files/Makefile tests/icles/Makefile gconf/Makefile gconf/gstreamer.schemas common/Makefile common/m4/Makefile m4/Makefile docs/Makefile docs/plugins/Makefile docs/version.entities pkgconfig/Makefile pkgconfig/gstreamer-plugins-good-uninstalled.pc gst-plugins-good.spec" sed \ -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"\n\n#define GST_INSTALL_PLUGINS_HELPER PREFIX "\\\\libexec\\\\gst-install-plugins-helper.exe"/' \ -e 's/.* GETTEXT_PACKAGE$/#define GETTEXT_PACKAGE "'$GETTEXT_PACKAGE'"/' \ -e 's/.* GST_DATADIR$/#define GST_DATADIR PREFIX "\\\\share"/' \ -e 's/.* GST_LEVEL_DEFAULT$/#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR/' \ -e 's/.* GST_LICENSE$/#define GST_LICENSE "'$GST_LICENSE'"/' \ -e 's/.* GST_MAJORMINOR$/#define GST_MAJORMINOR "'$GST_MAJORMINOR'"/' \ -e "s,.* GST_PACKAGE_NAME$,#define GST_PACKAGE_NAME \"${GST_PACKAGE_NAME}\"," \ -e 's/.* GST_PACKAGE_ORIGIN$/#define GST_PACKAGE_ORIGIN "Unknown package origin"/' \ -e "s,.* GST_PACKAGE_RELEASE_DATETIME$,#define GST_PACKAGE_RELEASE_DATETIME \"${GST_PACKAGE_RELEASE_DATETIME}\"," \ -e 's/.* HAVE_CPU_I386$/#define HAVE_CPU_I386 1/' \ -e 's/.* HAVE_FGETPOS$/#define HAVE_FGETPOS 1/' \ -e 's/.* HAVE_FSETPOS$/#define HAVE_FSETPOS 1/' \ -e 's/.* HAVE_LIBXML2$/#define HAVE_LIBXML2 1/' \ -e 's/.* HAVE_PROCESS_H$/#define HAVE_PROCESS_H 1/' \ -e 's/.* HAVE_STDLIB_H$/#define HAVE_STDLIB_H 1/' \ -e 's/.* HAVE_STRING_H$/#define HAVE_STRING_H 1/' \ -e 's/.* HAVE_SYS_STAT_H$/#define HAVE_SYS_STAT_H 1/' \ -e 's/.* HAVE_SYS_TYPES_H$/#define HAVE_SYS_TYPES_H 1/' \ -e 's/.* HAVE_WIN32$/#define HAVE_WIN32 1/' \ -e 's/.* HAVE_WINSOCK2_H$/#define HAVE_WINSOCK2_H 1/' \ -e 's/.* HOST_CPU$/#define HOST_CPU "i686"/' \ -e 's/.* LIBDIR$/#ifdef _DEBUG\n# define LIBDIR PREFIX "\\\\debug\\\\lib"\n#else\n# define LIBDIR PREFIX "\\\\lib"\n#endif/' \ -e 's/.* LOCALEDIR$/#define LOCALEDIR PREFIX "\\\\share\\\\locale"/' \ -e "s/.* PACKAGE$/#define PACKAGE \"$PACKAGE\"/" \ -e 's/.* PACKAGE_BUGREPORT$/#define PACKAGE_BUGREPORT "http:\/\/bugzilla.gnome.org\/enter_bug.cgi?product=GStreamer"/' \ -e "s/.* PACKAGE_NAME$/#define PACKAGE_NAME \"$PACKAGE_NAME\"/" \ -e "s/.* PACKAGE_STRING$/#define PACKAGE_STRING \"$PACKAGE_STRING\"/" \ -e 's/.* PACKAGE_TARNAME$/#define PACKAGE_TARNAME "'$PACKAGE_TARNAME'"/' \ -e 's/.* PACKAGE_VERSION$/#define PACKAGE_VERSION "'$PACKAGE_VERSION'"/' \ -e 's/.* PLUGINDIR$/#ifdef _DEBUG\n# define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.10"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.10"\n#endif/' \ -e 's/.* USE_BINARY_REGISTRY$/#define USE_BINARY_REGISTRY/' \ -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \ -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\"/" \ config.h.in >win32/common/config.h-new cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GST_GCOV_ENABLED_TRUE}" && test -z "${GST_GCOV_ENABLED_FALSE}"; then as_fn_error $? "conditional \"GST_GCOV_ENABLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_EXTERNAL_TRUE}" && test -z "${USE_EXTERNAL_FALSE}"; then as_fn_error $? "conditional \"USE_EXTERNAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXTERNAL_TRUE}" && test -z "${BUILD_EXTERNAL_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXTERNAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_EXPERIMENTAL_TRUE}" && test -z "${USE_EXPERIMENTAL_FALSE}"; then as_fn_error $? "conditional \"USE_EXPERIMENTAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXPERIMENTAL_TRUE}" && test -z "${BUILD_EXPERIMENTAL_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXPERIMENTAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_I386_TRUE}" && test -z "${HAVE_CPU_I386_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_I386\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_PPC_TRUE}" && test -z "${HAVE_CPU_PPC_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_PPC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_PPC64_TRUE}" && test -z "${HAVE_CPU_PPC64_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_PPC64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_ALPHA_TRUE}" && test -z "${HAVE_CPU_ALPHA_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_ALPHA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_ARM_TRUE}" && test -z "${HAVE_CPU_ARM_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_ARM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_SPARC_TRUE}" && test -z "${HAVE_CPU_SPARC_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_SPARC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_HPPA_TRUE}" && test -z "${HAVE_CPU_HPPA_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_HPPA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_MIPS_TRUE}" && test -z "${HAVE_CPU_MIPS_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_MIPS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_S390_TRUE}" && test -z "${HAVE_CPU_S390_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_S390\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_IA64_TRUE}" && test -z "${HAVE_CPU_IA64_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_IA64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_M68K_TRUE}" && test -z "${HAVE_CPU_M68K_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_M68K\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_X86_64_TRUE}" && test -z "${HAVE_CPU_X86_64_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_X86_64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_CRIS_TRUE}" && test -z "${HAVE_CPU_CRIS_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_CRIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CPU_CRISV32_TRUE}" && test -z "${HAVE_CPU_CRISV32_FALSE}"; then as_fn_error $? "conditional \"HAVE_CPU_CRISV32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_VALGRIND_TRUE}" && test -z "${HAVE_VALGRIND_FALSE}"; then as_fn_error $? "conditional \"HAVE_VALGRIND\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then as_fn_error $? "conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_PLUGIN_DOCS_TRUE}" && test -z "${ENABLE_PLUGIN_DOCS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_PLUGIN_DOCS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WINSOCK2_H_TRUE}" && test -z "${HAVE_WINSOCK2_H_FALSE}"; then as_fn_error $? "conditional \"HAVE_WINSOCK2_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GCC_ASM_TRUE}" && test -z "${HAVE_GCC_ASM_FALSE}"; then as_fn_error $? "conditional \"HAVE_GCC_ASM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GST_HAVE_MMAP_TRUE}" && test -z "${GST_HAVE_MMAP_FALSE}"; then as_fn_error $? "conditional \"GST_HAVE_MMAP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ORC_TRUE}" && test -z "${HAVE_ORC_FALSE}"; then as_fn_error $? "conditional \"HAVE_ORC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ORCC_TRUE}" && test -z "${HAVE_ORCC_FALSE}"; then as_fn_error $? "conditional \"HAVE_ORCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GST_CHECK_TRUE}" && test -z "${HAVE_GST_CHECK_FALSE}"; then as_fn_error $? "conditional \"HAVE_GST_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then as_fn_error $? "conditional \"HAVE_GTK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GTK_X11_TRUE}" && test -z "${HAVE_GTK_X11_FALSE}"; then as_fn_error $? "conditional \"HAVE_GTK_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONFTOOL_TRUE}" && test -z "${USE_GCONFTOOL_FALSE}"; then as_fn_error $? "conditional \"USE_GCONFTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_VIDEOFILTER_TRUE}" && test -z "${USE_PLUGIN_VIDEOFILTER_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_VIDEOFILTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_ALPHA_TRUE}" && test -z "${USE_PLUGIN_ALPHA_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_ALPHA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_APETAG_TRUE}" && test -z "${USE_PLUGIN_APETAG_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_APETAG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_AUDIOFX_TRUE}" && test -z "${USE_PLUGIN_AUDIOFX_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_AUDIOFX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_AUDIOPARSERS_TRUE}" && test -z "${USE_PLUGIN_AUDIOPARSERS_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_AUDIOPARSERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_AUPARSE_TRUE}" && test -z "${USE_PLUGIN_AUPARSE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_AUPARSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_AUTODETECT_TRUE}" && test -z "${USE_PLUGIN_AUTODETECT_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_AUTODETECT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_AVI_TRUE}" && test -z "${USE_PLUGIN_AVI_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_AVI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_CUTTER_TRUE}" && test -z "${USE_PLUGIN_CUTTER_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_CUTTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_DEBUGUTILS_TRUE}" && test -z "${USE_PLUGIN_DEBUGUTILS_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_DEBUGUTILS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_DEINTERLACE_TRUE}" && test -z "${USE_PLUGIN_DEINTERLACE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_DEINTERLACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_EFFECTV_TRUE}" && test -z "${USE_PLUGIN_EFFECTV_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_EFFECTV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_EQUALIZER_TRUE}" && test -z "${USE_PLUGIN_EQUALIZER_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_EQUALIZER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_FLV_TRUE}" && test -z "${USE_PLUGIN_FLV_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_FLV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_ID3DEMUX_TRUE}" && test -z "${USE_PLUGIN_ID3DEMUX_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_ID3DEMUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_ICYDEMUX_TRUE}" && test -z "${USE_PLUGIN_ICYDEMUX_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_ICYDEMUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_INTERLEAVE_TRUE}" && test -z "${USE_PLUGIN_INTERLEAVE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_INTERLEAVE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_FLX_TRUE}" && test -z "${USE_PLUGIN_FLX_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_FLX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_GOOM_TRUE}" && test -z "${USE_PLUGIN_GOOM_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_GOOM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_GOOM2K1_TRUE}" && test -z "${USE_PLUGIN_GOOM2K1_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_GOOM2K1\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_IMAGEFREEZE_TRUE}" && test -z "${USE_PLUGIN_IMAGEFREEZE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_IMAGEFREEZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_ISOMP4_TRUE}" && test -z "${USE_PLUGIN_ISOMP4_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_ISOMP4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_LAW_TRUE}" && test -z "${USE_PLUGIN_LAW_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_LAW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_LEVEL_TRUE}" && test -z "${USE_PLUGIN_LEVEL_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_LEVEL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_MATROSKA_TRUE}" && test -z "${USE_PLUGIN_MATROSKA_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_MATROSKA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_MONOSCOPE_TRUE}" && test -z "${USE_PLUGIN_MONOSCOPE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_MONOSCOPE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_MULTIFILE_TRUE}" && test -z "${USE_PLUGIN_MULTIFILE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_MULTIFILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_MULTIPART_TRUE}" && test -z "${USE_PLUGIN_MULTIPART_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_MULTIPART\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_REPLAYGAIN_TRUE}" && test -z "${USE_PLUGIN_REPLAYGAIN_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_REPLAYGAIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_RTP_TRUE}" && test -z "${USE_PLUGIN_RTP_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_RTP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_RTPMANAGER_TRUE}" && test -z "${USE_PLUGIN_RTPMANAGER_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_RTPMANAGER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_RTSP_TRUE}" && test -z "${USE_PLUGIN_RTSP_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_RTSP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_SHAPEWIPE_TRUE}" && test -z "${USE_PLUGIN_SHAPEWIPE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_SHAPEWIPE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_SMPTE_TRUE}" && test -z "${USE_PLUGIN_SMPTE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_SMPTE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_SPECTRUM_TRUE}" && test -z "${USE_PLUGIN_SPECTRUM_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_SPECTRUM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_UDP_TRUE}" && test -z "${USE_PLUGIN_UDP_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_UDP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_VIDEOBOX_TRUE}" && test -z "${USE_PLUGIN_VIDEOBOX_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_VIDEOBOX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_VIDEOCROP_TRUE}" && test -z "${USE_PLUGIN_VIDEOCROP_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_VIDEOCROP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_VIDEOMIXER_TRUE}" && test -z "${USE_PLUGIN_VIDEOMIXER_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_VIDEOMIXER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_WAVENC_TRUE}" && test -z "${USE_PLUGIN_WAVENC_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_WAVENC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_WAVPARSE_TRUE}" && test -z "${USE_PLUGIN_WAVPARSE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_WAVPARSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_Y4M_TRUE}" && test -z "${USE_PLUGIN_Y4M_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_Y4M\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_UDP_TRUE}" && test -z "${USE_PLUGIN_UDP_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_UDP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_RTSP_TRUE}" && test -z "${USE_PLUGIN_RTSP_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_RTSP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PLUGIN_MONOSCOPE_TRUE}" && test -z "${USE_PLUGIN_MONOSCOPE_FALSE}"; then as_fn_error $? "conditional \"USE_PLUGIN_MONOSCOPE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_DIRECTSOUND_TRUE}" && test -z "${USE_DIRECTSOUND_FALSE}"; then as_fn_error $? "conditional \"USE_DIRECTSOUND\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSS_TRUE}" && test -z "${USE_OSS_FALSE}"; then as_fn_error $? "conditional \"USE_OSS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSS4_TRUE}" && test -z "${USE_OSS4_FALSE}"; then as_fn_error $? "conditional \"USE_OSS4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SUNAUDIO_TRUE}" && test -z "${USE_SUNAUDIO_FALSE}"; then as_fn_error $? "conditional \"USE_SUNAUDIO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSX_AUDIO_TRUE}" && test -z "${USE_OSX_AUDIO_FALSE}"; then as_fn_error $? "conditional \"USE_OSX_AUDIO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSX_VIDEO_TRUE}" && test -z "${USE_OSX_VIDEO_FALSE}"; then as_fn_error $? "conditional \"USE_OSX_VIDEO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GST_V4L2_TRUE}" && test -z "${USE_GST_V4L2_FALSE}"; then as_fn_error $? "conditional \"USE_GST_V4L2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_X_TRUE}" && test -z "${USE_X_FALSE}"; then as_fn_error $? "conditional \"USE_X\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_XSHM_TRUE}" && test -z "${USE_XSHM_FALSE}"; then as_fn_error $? "conditional \"USE_XSHM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_XVIDEO_TRUE}" && test -z "${USE_XVIDEO_FALSE}"; then as_fn_error $? "conditional \"USE_XVIDEO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_AALIB_TRUE}" && test -z "${USE_AALIB_FALSE}"; then as_fn_error $? "conditional \"USE_AALIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_ANNODEX_TRUE}" && test -z "${USE_ANNODEX_FALSE}"; then as_fn_error $? "conditional \"USE_ANNODEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_CAIRO_TRUE}" && test -z "${USE_CAIRO_FALSE}"; then as_fn_error $? "conditional \"USE_CAIRO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_CAIRO_GOBJECT_TRUE}" && test -z "${USE_CAIRO_GOBJECT_FALSE}"; then as_fn_error $? "conditional \"USE_CAIRO_GOBJECT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_ESD_TRUE}" && test -z "${USE_ESD_FALSE}"; then as_fn_error $? "conditional \"USE_ESD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_FLAC_TRUE}" && test -z "${USE_FLAC_FALSE}"; then as_fn_error $? "conditional \"USE_FLAC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then as_fn_error $? "conditional \"USE_GCONF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GDK_PIXBUF_TRUE}" && test -z "${USE_GDK_PIXBUF_FALSE}"; then as_fn_error $? "conditional \"USE_GDK_PIXBUF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then as_fn_error $? "conditional \"USE_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_JACK_TRUE}" && test -z "${USE_JACK_FALSE}"; then as_fn_error $? "conditional \"USE_JACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_JPEG_TRUE}" && test -z "${USE_JPEG_FALSE}"; then as_fn_error $? "conditional \"USE_JPEG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBCACA_TRUE}" && test -z "${USE_LIBCACA_FALSE}"; then as_fn_error $? "conditional \"USE_LIBCACA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBDV_TRUE}" && test -z "${USE_LIBDV_FALSE}"; then as_fn_error $? "conditional \"USE_LIBDV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBPNG_TRUE}" && test -z "${USE_LIBPNG_FALSE}"; then as_fn_error $? "conditional \"USE_LIBPNG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PULSE_TRUE}" && test -z "${USE_PULSE_FALSE}"; then as_fn_error $? "conditional \"USE_PULSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_DV1394_TRUE}" && test -z "${USE_DV1394_FALSE}"; then as_fn_error $? "conditional \"USE_DV1394\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBIEC61883_TRUE}" && test -z "${USE_LIBIEC61883_FALSE}"; then as_fn_error $? "conditional \"USE_LIBIEC61883\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SHOUT2_TRUE}" && test -z "${USE_SHOUT2_FALSE}"; then as_fn_error $? "conditional \"USE_SHOUT2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SOUP_TRUE}" && test -z "${USE_SOUP_FALSE}"; then as_fn_error $? "conditional \"USE_SOUP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SPEEX_TRUE}" && test -z "${USE_SPEEX_FALSE}"; then as_fn_error $? "conditional \"USE_SPEEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_TAGLIB_TRUE}" && test -z "${USE_TAGLIB_FALSE}"; then as_fn_error $? "conditional \"USE_TAGLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_WAVPACK_TRUE}" && test -z "${USE_WAVPACK_FALSE}"; then as_fn_error $? "conditional \"USE_WAVPACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_ZLIB_TRUE}" && test -z "${USE_ZLIB_FALSE}"; then as_fn_error $? "conditional \"USE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_BZ2_TRUE}" && test -z "${USE_BZ2_FALSE}"; then as_fn_error $? "conditional \"USE_BZ2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_AALIB_TRUE}" && test -z "${USE_AALIB_FALSE}"; then as_fn_error $? "conditional \"USE_AALIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_ANNODEX_TRUE}" && test -z "${USE_ANNODEX_FALSE}"; then as_fn_error $? "conditional \"USE_ANNODEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_BZ2_TRUE}" && test -z "${USE_BZ2_FALSE}"; then as_fn_error $? "conditional \"USE_BZ2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_CAIRO_TRUE}" && test -z "${USE_CAIRO_FALSE}"; then as_fn_error $? "conditional \"USE_CAIRO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_CAIRO_GOBJECT_TRUE}" && test -z "${USE_CAIRO_GOBJECT_FALSE}"; then as_fn_error $? "conditional \"USE_CAIRO_GOBJECT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_DIRECTSOUND_TRUE}" && test -z "${USE_DIRECTSOUND_FALSE}"; then as_fn_error $? "conditional \"USE_DIRECTSOUND\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_DV1394_TRUE}" && test -z "${USE_DV1394_FALSE}"; then as_fn_error $? "conditional \"USE_DV1394\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_ESD_TRUE}" && test -z "${USE_ESD_FALSE}"; then as_fn_error $? "conditional \"USE_ESD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_FLAC_TRUE}" && test -z "${USE_FLAC_FALSE}"; then as_fn_error $? "conditional \"USE_FLAC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then as_fn_error $? "conditional \"USE_GCONF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONFTOOL_TRUE}" && test -z "${USE_GCONFTOOL_FALSE}"; then as_fn_error $? "conditional \"USE_GCONFTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GDK_PIXBUF_TRUE}" && test -z "${USE_GDK_PIXBUF_FALSE}"; then as_fn_error $? "conditional \"USE_GDK_PIXBUF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GST_V4L2_TRUE}" && test -z "${USE_GST_V4L2_FALSE}"; then as_fn_error $? "conditional \"USE_GST_V4L2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then as_fn_error $? "conditional \"USE_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_JACK_TRUE}" && test -z "${USE_JACK_FALSE}"; then as_fn_error $? "conditional \"USE_JACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_JPEG_TRUE}" && test -z "${USE_JPEG_FALSE}"; then as_fn_error $? "conditional \"USE_JPEG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBCACA_TRUE}" && test -z "${USE_LIBCACA_FALSE}"; then as_fn_error $? "conditional \"USE_LIBCACA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBDV_TRUE}" && test -z "${USE_LIBDV_FALSE}"; then as_fn_error $? "conditional \"USE_LIBDV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBIEC61883_TRUE}" && test -z "${USE_LIBIEC61883_FALSE}"; then as_fn_error $? "conditional \"USE_LIBIEC61883\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LIBPNG_TRUE}" && test -z "${USE_LIBPNG_FALSE}"; then as_fn_error $? "conditional \"USE_LIBPNG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSS_TRUE}" && test -z "${USE_OSS_FALSE}"; then as_fn_error $? "conditional \"USE_OSS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSS4_TRUE}" && test -z "${USE_OSS4_FALSE}"; then as_fn_error $? "conditional \"USE_OSS4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSX_AUDIO_TRUE}" && test -z "${USE_OSX_AUDIO_FALSE}"; then as_fn_error $? "conditional \"USE_OSX_AUDIO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_OSX_VIDEO_TRUE}" && test -z "${USE_OSX_VIDEO_FALSE}"; then as_fn_error $? "conditional \"USE_OSX_VIDEO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PULSE_TRUE}" && test -z "${USE_PULSE_FALSE}"; then as_fn_error $? "conditional \"USE_PULSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SHOUT2_TRUE}" && test -z "${USE_SHOUT2_FALSE}"; then as_fn_error $? "conditional \"USE_SHOUT2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SOUP_TRUE}" && test -z "${USE_SOUP_FALSE}"; then as_fn_error $? "conditional \"USE_SOUP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SPEEX_TRUE}" && test -z "${USE_SPEEX_FALSE}"; then as_fn_error $? "conditional \"USE_SPEEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SUNAUDIO_TRUE}" && test -z "${USE_SUNAUDIO_FALSE}"; then as_fn_error $? "conditional \"USE_SUNAUDIO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_TAGLIB_TRUE}" && test -z "${USE_TAGLIB_FALSE}"; then as_fn_error $? "conditional \"USE_TAGLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_WAVPACK_TRUE}" && test -z "${USE_WAVPACK_FALSE}"; then as_fn_error $? "conditional \"USE_WAVPACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_X_TRUE}" && test -z "${USE_X_FALSE}"; then as_fn_error $? "conditional \"USE_X\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_XSHM_TRUE}" && test -z "${USE_XSHM_FALSE}"; then as_fn_error $? "conditional \"USE_XSHM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_XVIDEO_TRUE}" && test -z "${USE_XVIDEO_FALSE}"; then as_fn_error $? "conditional \"USE_XVIDEO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_ZLIB_TRUE}" && test -z "${USE_ZLIB_FALSE}"; then as_fn_error $? "conditional \"USE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GStreamer Good Plug-ins $as_me 0.10.31, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GStreamer Good Plug-ins config.status 0.10.31 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" # variables for create stdint.h replacement PACKAGE="$PACKAGE" VERSION="$VERSION" ac_stdint_h="$ac_stdint_h" _ac_stdint_h=`$as_echo "_$PACKAGE-$ac_stdint_h" | $as_tr_cpp` ac_cv_stdint_message="$ac_cv_stdint_message" ac_cv_header_stdint_t="$ac_cv_header_stdint_t" ac_cv_header_stdint_x="$ac_cv_header_stdint_x" ac_cv_header_stdint_o="$ac_cv_header_stdint_o" ac_cv_header_stdint_u="$ac_cv_header_stdint_u" ac_cv_type_uint64_t="$ac_cv_type_uint64_t" ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" ac_cv_char_data_model="$ac_cv_char_data_model" ac_cv_long_data_model="$ac_cv_long_data_model" ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" ac_cv_type_intmax_t="$ac_cv_type_intmax_t" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "$ac_stdint_h") CONFIG_COMMANDS="$CONFIG_COMMANDS $ac_stdint_h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gst/Makefile") CONFIG_FILES="$CONFIG_FILES gst/Makefile" ;; "gst/alpha/Makefile") CONFIG_FILES="$CONFIG_FILES gst/alpha/Makefile" ;; "gst/apetag/Makefile") CONFIG_FILES="$CONFIG_FILES gst/apetag/Makefile" ;; "gst/audiofx/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiofx/Makefile" ;; "gst/audioparsers/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audioparsers/Makefile" ;; "gst/auparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/auparse/Makefile" ;; "gst/autodetect/Makefile") CONFIG_FILES="$CONFIG_FILES gst/autodetect/Makefile" ;; "gst/avi/Makefile") CONFIG_FILES="$CONFIG_FILES gst/avi/Makefile" ;; "gst/cutter/Makefile") CONFIG_FILES="$CONFIG_FILES gst/cutter/Makefile" ;; "gst/deinterlace/Makefile") CONFIG_FILES="$CONFIG_FILES gst/deinterlace/Makefile" ;; "gst/debugutils/Makefile") CONFIG_FILES="$CONFIG_FILES gst/debugutils/Makefile" ;; "gst/effectv/Makefile") CONFIG_FILES="$CONFIG_FILES gst/effectv/Makefile" ;; "gst/equalizer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/equalizer/Makefile" ;; "gst/flv/Makefile") CONFIG_FILES="$CONFIG_FILES gst/flv/Makefile" ;; "gst/goom/Makefile") CONFIG_FILES="$CONFIG_FILES gst/goom/Makefile" ;; "gst/goom2k1/Makefile") CONFIG_FILES="$CONFIG_FILES gst/goom2k1/Makefile" ;; "gst/id3demux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/id3demux/Makefile" ;; "gst/icydemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/icydemux/Makefile" ;; "gst/imagefreeze/Makefile") CONFIG_FILES="$CONFIG_FILES gst/imagefreeze/Makefile" ;; "gst/interleave/Makefile") CONFIG_FILES="$CONFIG_FILES gst/interleave/Makefile" ;; "gst/isomp4/Makefile") CONFIG_FILES="$CONFIG_FILES gst/isomp4/Makefile" ;; "gst/law/Makefile") CONFIG_FILES="$CONFIG_FILES gst/law/Makefile" ;; "gst/level/Makefile") CONFIG_FILES="$CONFIG_FILES gst/level/Makefile" ;; "gst/matroska/Makefile") CONFIG_FILES="$CONFIG_FILES gst/matroska/Makefile" ;; "gst/monoscope/Makefile") CONFIG_FILES="$CONFIG_FILES gst/monoscope/Makefile" ;; "gst/multifile/Makefile") CONFIG_FILES="$CONFIG_FILES gst/multifile/Makefile" ;; "gst/multipart/Makefile") CONFIG_FILES="$CONFIG_FILES gst/multipart/Makefile" ;; "gst/replaygain/Makefile") CONFIG_FILES="$CONFIG_FILES gst/replaygain/Makefile" ;; "gst/rtp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rtp/Makefile" ;; "gst/rtpmanager/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rtpmanager/Makefile" ;; "gst/rtsp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rtsp/Makefile" ;; "gst/shapewipe/Makefile") CONFIG_FILES="$CONFIG_FILES gst/shapewipe/Makefile" ;; "gst/smpte/Makefile") CONFIG_FILES="$CONFIG_FILES gst/smpte/Makefile" ;; "gst/spectrum/Makefile") CONFIG_FILES="$CONFIG_FILES gst/spectrum/Makefile" ;; "gst/udp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/udp/Makefile" ;; "gst/videobox/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videobox/Makefile" ;; "gst/videocrop/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videocrop/Makefile" ;; "gst/videofilter/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videofilter/Makefile" ;; "gst/videomixer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videomixer/Makefile" ;; "gst/wavenc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/wavenc/Makefile" ;; "gst/wavparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/wavparse/Makefile" ;; "gst/flx/Makefile") CONFIG_FILES="$CONFIG_FILES gst/flx/Makefile" ;; "gst/y4m/Makefile") CONFIG_FILES="$CONFIG_FILES gst/y4m/Makefile" ;; "ext/Makefile") CONFIG_FILES="$CONFIG_FILES ext/Makefile" ;; "ext/aalib/Makefile") CONFIG_FILES="$CONFIG_FILES ext/aalib/Makefile" ;; "ext/annodex/Makefile") CONFIG_FILES="$CONFIG_FILES ext/annodex/Makefile" ;; "ext/cairo/Makefile") CONFIG_FILES="$CONFIG_FILES ext/cairo/Makefile" ;; "ext/dv/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dv/Makefile" ;; "ext/esd/Makefile") CONFIG_FILES="$CONFIG_FILES ext/esd/Makefile" ;; "ext/flac/Makefile") CONFIG_FILES="$CONFIG_FILES ext/flac/Makefile" ;; "ext/gconf/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gconf/Makefile" ;; "ext/gdk_pixbuf/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gdk_pixbuf/Makefile" ;; "ext/hal/Makefile") CONFIG_FILES="$CONFIG_FILES ext/hal/Makefile" ;; "ext/jack/Makefile") CONFIG_FILES="$CONFIG_FILES ext/jack/Makefile" ;; "ext/jpeg/Makefile") CONFIG_FILES="$CONFIG_FILES ext/jpeg/Makefile" ;; "ext/libcaca/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libcaca/Makefile" ;; "ext/libpng/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libpng/Makefile" ;; "ext/pulse/Makefile") CONFIG_FILES="$CONFIG_FILES ext/pulse/Makefile" ;; "ext/raw1394/Makefile") CONFIG_FILES="$CONFIG_FILES ext/raw1394/Makefile" ;; "ext/shout2/Makefile") CONFIG_FILES="$CONFIG_FILES ext/shout2/Makefile" ;; "ext/soup/Makefile") CONFIG_FILES="$CONFIG_FILES ext/soup/Makefile" ;; "ext/speex/Makefile") CONFIG_FILES="$CONFIG_FILES ext/speex/Makefile" ;; "ext/taglib/Makefile") CONFIG_FILES="$CONFIG_FILES ext/taglib/Makefile" ;; "ext/wavpack/Makefile") CONFIG_FILES="$CONFIG_FILES ext/wavpack/Makefile" ;; "sys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;; "sys/directsound/Makefile") CONFIG_FILES="$CONFIG_FILES sys/directsound/Makefile" ;; "sys/oss/Makefile") CONFIG_FILES="$CONFIG_FILES sys/oss/Makefile" ;; "sys/oss4/Makefile") CONFIG_FILES="$CONFIG_FILES sys/oss4/Makefile" ;; "sys/osxaudio/Makefile") CONFIG_FILES="$CONFIG_FILES sys/osxaudio/Makefile" ;; "sys/osxvideo/Makefile") CONFIG_FILES="$CONFIG_FILES sys/osxvideo/Makefile" ;; "sys/sunaudio/Makefile") CONFIG_FILES="$CONFIG_FILES sys/sunaudio/Makefile" ;; "sys/v4l2/Makefile") CONFIG_FILES="$CONFIG_FILES sys/v4l2/Makefile" ;; "sys/waveform/Makefile") CONFIG_FILES="$CONFIG_FILES sys/waveform/Makefile" ;; "sys/ximage/Makefile") CONFIG_FILES="$CONFIG_FILES sys/ximage/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/check/Makefile") CONFIG_FILES="$CONFIG_FILES tests/check/Makefile" ;; "tests/examples/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/Makefile" ;; "tests/examples/audiofx/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/audiofx/Makefile" ;; "tests/examples/cairo/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/cairo/Makefile" ;; "tests/examples/equalizer/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/equalizer/Makefile" ;; "tests/examples/jack/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/jack/Makefile" ;; "tests/examples/level/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/level/Makefile" ;; "tests/examples/pulse/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/pulse/Makefile" ;; "tests/examples/rtp/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/rtp/Makefile" ;; "tests/examples/shapewipe/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/shapewipe/Makefile" ;; "tests/examples/spectrum/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/spectrum/Makefile" ;; "tests/examples/v4l2/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/v4l2/Makefile" ;; "tests/files/Makefile") CONFIG_FILES="$CONFIG_FILES tests/files/Makefile" ;; "tests/icles/Makefile") CONFIG_FILES="$CONFIG_FILES tests/icles/Makefile" ;; "gconf/Makefile") CONFIG_FILES="$CONFIG_FILES gconf/Makefile" ;; "gconf/gstreamer.schemas") CONFIG_FILES="$CONFIG_FILES gconf/gstreamer.schemas" ;; "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;; "common/m4/Makefile") CONFIG_FILES="$CONFIG_FILES common/m4/Makefile" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "docs/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES docs/plugins/Makefile" ;; "docs/version.entities") CONFIG_FILES="$CONFIG_FILES docs/version.entities" ;; "pkgconfig/Makefile") CONFIG_FILES="$CONFIG_FILES pkgconfig/Makefile" ;; "pkgconfig/gstreamer-plugins-good-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-plugins-good-uninstalled.pc" ;; "gst-plugins-good.spec") CONFIG_FILES="$CONFIG_FILES gst-plugins-good.spec" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "$ac_stdint_h":C) { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_stdint_h : $_ac_stdint_h" >&5 $as_echo "$as_me: creating $ac_stdint_h : $_ac_stdint_h" >&6;} ac_stdint=$tmp/_stdint.h echo "#ifndef" $_ac_stdint_h >$ac_stdint echo "#define" $_ac_stdint_h "1" >>$ac_stdint echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint if test "_$ac_cv_header_stdint_t" != "_" ; then echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint echo "#include " >>$ac_stdint echo "#endif" >>$ac_stdint echo "#endif" >>$ac_stdint else cat >>$ac_stdint < #else #include /* .................... configured part ............................ */ STDINT_EOF echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint if test "_$ac_cv_header_stdint_x" != "_" ; then ac_header="$ac_cv_header_stdint_x" echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint else echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint fi echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint if test "_$ac_cv_header_stdint_o" != "_" ; then ac_header="$ac_cv_header_stdint_o" echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint else echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint fi echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint if test "_$ac_cv_header_stdint_u" != "_" ; then ac_header="$ac_cv_header_stdint_u" echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint else echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint fi echo "" >>$ac_stdint if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then echo "#include <$ac_header>" >>$ac_stdint echo "" >>$ac_stdint fi fi echo "/* which 64bit typedef has been found */" >>$ac_stdint if test "$ac_cv_type_uint64_t" = "yes" ; then echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint fi if test "$ac_cv_type_u_int64_t" = "yes" ; then echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint fi echo "" >>$ac_stdint echo "/* which type model has been detected */" >>$ac_stdint if test "_$ac_cv_char_data_model" != "_" ; then echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint else echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint fi echo "" >>$ac_stdint echo "/* whether int_least types were detected */" >>$ac_stdint if test "$ac_cv_type_int_least32_t" = "yes"; then echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint fi echo "/* whether int_fast types were detected */" >>$ac_stdint if test "$ac_cv_type_int_fast32_t" = "yes"; then echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint fi echo "/* whether intmax_t type was detected */" >>$ac_stdint if test "$ac_cv_type_intmax_t" = "yes"; then echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint fi echo "" >>$ac_stdint cat >>$ac_stdint <= 199901L #define _HAVE_UINT64_T #define _HAVE_LONGLONG_UINT64_T typedef long long int64_t; typedef unsigned long long uint64_t; #elif !defined __STRICT_ANSI__ #if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ #define _HAVE_UINT64_T typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ /* note: all ELF-systems seem to have loff-support which needs 64-bit */ #if !defined _NO_LONGLONG #define _HAVE_UINT64_T #define _HAVE_LONGLONG_UINT64_T typedef long long int64_t; typedef unsigned long long uint64_t; #endif #elif defined __alpha || (defined __mips && defined _ABIN32) #if !defined _NO_LONGLONG typedef long int64_t; typedef unsigned long uint64_t; #endif /* compiler/cpu type to define int64_t */ #endif #endif #endif #if defined _STDINT_HAVE_U_INT_TYPES /* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ typedef u_int8_t uint8_t; typedef u_int16_t uint16_t; typedef u_int32_t uint32_t; /* glibc compatibility */ #ifndef __int8_t_defined #define __int8_t_defined #endif #endif #ifdef _STDINT_NEED_INT_MODEL_T /* we must guess all the basic types. Apart from byte-adressable system, */ /* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ /* (btw, those nibble-addressable systems are way off, or so we assume) */ #if defined _STDINT_BYTE_MODEL #if _STDINT_LONG_MODEL+0 == 242 /* 2:4:2 = IP16 = a normal 16-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef long int32_t; #endif #elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 /* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ /* 4:4:4 = ILP32 = a normal 32-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif #elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 /* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ /* 4:8:8 = LP64 = a normal 64-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif /* this system has a "long" of 64bit */ #ifndef _HAVE_UINT64_T #define _HAVE_UINT64_T typedef unsigned long uint64_t; typedef long int64_t; #endif #elif _STDINT_LONG_MODEL+0 == 448 /* LLP64 a 64-bit system derived from a 32-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif /* assuming the system has a "long long" */ #ifndef _HAVE_UINT64_T #define _HAVE_UINT64_T #define _HAVE_LONGLONG_UINT64_T typedef unsigned long long uint64_t; typedef long long int64_t; #endif #else #define _STDINT_NO_INT32_T #endif #else #define _STDINT_NO_INT8_T #define _STDINT_NO_INT32_T #endif #endif /* * quote from SunOS-5.8 sys/inttypes.h: * Use at your own risk. As of February 1996, the committee is squarely * behind the fixed sized types; the "least" and "fast" types are still being * discussed. The probability that the "fast" types may be removed before * the standard is finalized is high enough that they are not currently * implemented. */ #if defined _STDINT_NEED_INT_LEAST_T typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; #ifdef _HAVE_UINT64_T typedef int64_t int_least64_t; #endif typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; #ifdef _HAVE_UINT64_T typedef uint64_t uint_least64_t; #endif /* least types */ #endif #if defined _STDINT_NEED_INT_FAST_T typedef int8_t int_fast8_t; typedef int int_fast16_t; typedef int32_t int_fast32_t; #ifdef _HAVE_UINT64_T typedef int64_t int_fast64_t; #endif typedef uint8_t uint_fast8_t; typedef unsigned uint_fast16_t; typedef uint32_t uint_fast32_t; #ifdef _HAVE_UINT64_T typedef uint64_t uint_fast64_t; #endif /* fast types */ #endif #ifdef _STDINT_NEED_INTMAX_T #ifdef _HAVE_UINT64_T typedef int64_t intmax_t; typedef uint64_t uintmax_t; #else typedef long intmax_t; typedef unsigned long uintmax_t; #endif #endif #ifdef _STDINT_NEED_INTPTR_T #ifndef __intptr_t_defined #define __intptr_t_defined /* we encourage using "long" to store pointer values, never use "int" ! */ #if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 typedef unsigned int uintptr_t; typedef int intptr_t; #elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 typedef unsigned long uintptr_t; typedef long intptr_t; #elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ typedef unsigned long uintptr_t; typedef long intptr_t; #endif #endif #endif /* The ISO C99 standard specifies that in C++ implementations these should only be defined if explicitly requested. */ #if !defined __cplusplus || defined __STDC_CONSTANT_MACROS #ifndef UINT32_C /* Signed. */ # define INT8_C(c) c # define INT16_C(c) c # define INT32_C(c) c # ifdef _HAVE_LONGLONG_UINT64_T # define INT64_C(c) c ## L # else # define INT64_C(c) c ## LL # endif /* Unsigned. */ # define UINT8_C(c) c ## U # define UINT16_C(c) c ## U # define UINT32_C(c) c ## U # ifdef _HAVE_LONGLONG_UINT64_T # define UINT64_C(c) c ## UL # else # define UINT64_C(c) c ## ULL # endif /* Maximal type. */ # ifdef _HAVE_LONGLONG_UINT64_T # define INTMAX_C(c) c ## L # define UINTMAX_C(c) c ## UL # else # define INTMAX_C(c) c ## LL # define UINTMAX_C(c) c ## ULL # endif /* literalnumbers */ #endif #endif /* These limits are merily those of a two complement byte-oriented system */ /* Minimum of signed integral types. */ # define INT8_MIN (-128) # define INT16_MIN (-32767-1) # define INT32_MIN (-2147483647-1) # define INT64_MIN (-__INT64_C(9223372036854775807)-1) /* Maximum of signed integral types. */ # define INT8_MAX (127) # define INT16_MAX (32767) # define INT32_MAX (2147483647) # define INT64_MAX (__INT64_C(9223372036854775807)) /* Maximum of unsigned integral types. */ # define UINT8_MAX (255) # define UINT16_MAX (65535) # define UINT32_MAX (4294967295U) # define UINT64_MAX (__UINT64_C(18446744073709551615)) /* Minimum of signed integral types having a minimum size. */ # define INT_LEAST8_MIN INT8_MIN # define INT_LEAST16_MIN INT16_MIN # define INT_LEAST32_MIN INT32_MIN # define INT_LEAST64_MIN INT64_MIN /* Maximum of signed integral types having a minimum size. */ # define INT_LEAST8_MAX INT8_MAX # define INT_LEAST16_MAX INT16_MAX # define INT_LEAST32_MAX INT32_MAX # define INT_LEAST64_MAX INT64_MAX /* Maximum of unsigned integral types having a minimum size. */ # define UINT_LEAST8_MAX UINT8_MAX # define UINT_LEAST16_MAX UINT16_MAX # define UINT_LEAST32_MAX UINT32_MAX # define UINT_LEAST64_MAX UINT64_MAX /* shortcircuit*/ #endif /* once */ #endif #endif STDINT_EOF fi if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_stdint_h is unchanged" >&5 $as_echo "$as_me: $ac_stdint_h is unchanged" >&6;} else ac_dir=`$as_dirname -- "$ac_stdint_h" || $as_expr X"$ac_stdint_h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_stdint_h" : 'X\(//\)[^/]' \| \ X"$ac_stdint_h" : 'X\(//\)$' \| \ X"$ac_stdint_h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_stdint_h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p rm -f $ac_stdint_h mv $ac_stdint $ac_stdint_h fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi printf "configure: *** Plug-ins without external dependencies that will be built:\n" ( for i in $GST_PLUGINS_SELECTED; do printf '\t'$i'\n'; done ) | sort printf "\n" printf "configure: *** Plug-ins without external dependencies that will NOT be built:\n" ( for i in $GST_PLUGINS_ALL; do case " $GST_PLUGINS_SELECTED " in *\ $i\ *) ;; *) printf '\t'$i'\n' ;; esac done ) | sort printf "\n" if test "x$BUILD_EXTERNAL" = "xno"; then printf "configure: *** No plug-ins with external dependencies will be built\n" else printf "configure: *** Plug-ins with dependencies that will be built:" printf "$GST_PLUGINS_YES\n" | sort printf "\n" printf "configure: *** Plug-ins with dependencies that will NOT be built:" printf "$GST_PLUGINS_NO\n" | sort printf "\n" fi if test "$HAVE_ORC" = yes ; then printf "configure: *** Orc acceleration enabled.\n" else if test "x$enable_orc" = "xno" ; then printf "configure: *** Orc acceleration disabled by --disable-orc. Slower code paths\n" printf " will be used.\n" else printf "configure: *** Orc acceleration disabled. Requires Orc >= $ORC_REQ, which was\n" printf " not found. Slower code paths will be used.\n" fi fi printf "\n" gst-plugins-good-0.10.31/ChangeLog0000644000175000017500001321265711720563176013602 00000000000000=== release 0.10.31 === 2012-02-21 Tim-Philipp Müller * configure.ac: releasing 0.10.31, "Faster" 2012-02-20 12:22:12 -0500 Olivier Crête * gst/rtp/gstrtph264pay.c: rtph264pay: force baseline profile is profile-level-id is unspecified If profile-level-id is missing or invalid, we want any upstream encoder to default to baseline profile, so specify that in the caps we pass upstream. If the caps contain no profile restriction, an encoder may default to high or main profile. 2012-02-17 17:21:53 +0000 Tim-Philipp Müller * gst/equalizer/gstiirequalizer.c: equalizer: fix switching from passthrough to non-passthrough when parameters change commit b5bf0294 moved the if(need_new_coefficients) set_passthrough(equ) after the if(is_passthrough) return FLOW_OK shortcut, so the passthrough mode would never get updated even if the coefficients change. Fixes equalizer-test doing .. nothing. 2012-02-16 17:14:20 +0800 Gary Ching-Pang Lin * sys/v4l2/v4l2_calls.c: v4l2src: failure to query some optional controls is not a fatal error Don't post a (fatal) error message on the bus just because we failed to query some control. Fixes issue with built-in Suyin Corp webcam for HP notebook (usbid 064e:e28a) on OpenSuse 12.1, where querying red/blue balance fails. https://bugzilla.gnome.org/show_bug.cgi?id=670197 2012-02-16 12:59:10 +0000 Tuukka Pasanen * sys/v4l2/v4l2_calls.c: v4l2src: fix for webcamstudio vloopback Because vlooback emits 25 - ENOTTY and no EINVAL v4l2src thought it can't handle this and does not work. https://bugzilla.gnome.org/show_bug.cgi?id=669455 2012-02-13 12:06:37 +0100 Mark Nauwelaerts * tests/check/elements/flacparse.c: tests: flacparse: check and compare intended data 2012-02-09 22:12:14 +0100 Mark Nauwelaerts * tests/check/elements/mpegaudioparse.c: tests: mpegaudioparse: remove stray declaration 2012-02-09 10:11:48 +0100 Marc Leeman * gst/udp/gstmultiudpsink.c: multiudpsink: typo fix (bytes send -> bytes sent) 2012-02-07 14:10:44 -0800 Ralph Giles * ext/shout2/gstshout2.c: shout2send: send video/webm through libshout. This requires SHOUT_FORMAT_WEBM, added in libshout 2.3.0, so video/webm support is contingent on that symbol being defined. Also an indentation change required by the pre-commit hook. https://bugzilla.gnome.org/show_bug.cgi?id=669590 2012-01-28 11:13:16 +0100 Nicola Murino * gst/matroska/matroska-demux.c: matroskademux: avoid posting invalid duration for each frame https://bugzilla.gnome.org/show_bug.cgi?id=666583 2012-02-05 13:40:13 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.30.3 pre-release 2012-02-03 22:05:59 +0530 Arun Raghavan * ext/pulse/plugin.c: pulseaudiosink: Lower rank to prevent autoplugging pulseaudiosink breaks visualisations in its current form, so let's prevent it from being autoplugged for the time being. The best we can hope to do in the 0.10 series is query the list of available sinks and their formats, and expose these as the bin's sinkpad caps. While this is not a comprehensive solution, it will make sure that we're only trying to support compressed formats if we're certain that one exists. The long-term fix for this will be in the form of proper upstream renegotiation support in the 0.11/1.0 series. https://bugzilla.gnome.org/show_bug.cgi?id=666361 2012-02-03 14:53:31 +0000 Vincent Penquerc'h * ext/flac/gstflacenc.c: flacenc: fix event leak when there is no peer on the src pad 2012-02-02 12:27:09 +0000 Vincent Penquerc'h * gst/flv/gstflvmux.c: flvmux: specify we only accept raw AAC in template caps No header seems to be added, and the codec ID is the same as used for raw by flvdemux, so raw seems the only supported case. https://bugzilla.gnome.org/show_bug.cgi?id=665394 2012-02-02 12:25:21 +0000 Vincent Penquerc'h * gst/flv/gstflvdemux.c: flvdemux: specify we only output raw AAC in template caps https://bugzilla.gnome.org/show_bug.cgi?id=665394 2012-01-30 14:52:37 +0000 Vincent Penquerc'h * gst/rtp/gstrtpmp2tpay.c: rtpmp2tpay: do not try to flush a packet when no data is available https://bugzilla.gnome.org/show_bug.cgi?id=668874 2010-06-11 08:36:33 +0200 Pascal Buhler * gst/rtp/gstrtph264depay.c: rtph264depay: Exclude NALu size from payload length on truncated packets. https://bugzilla.gnome.org/show_bug.cgi?id=667846 2012-01-28 13:05:09 +0000 Vincent Penquerc'h * gst/videobox/gstvideobox.c: videobox: avoid wrapping opaque to transparent 2012-01-25 15:21:44 +0000 Jayakrishnan M * ext/cairo/Makefile.am: cairo: fix build, make sure libgstvideo can be found https://bugzilla.gnome.org/show_bug.cgi?id=668648 2012-01-25 13:19:12 +0000 Tim-Philipp Müller * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/rtpsession.c: rtpmanager: don't pretend our random hostnames are fully-qualified domain names 2012-01-23 13:15:46 +0000 Tim-Philipp Müller * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/rtpsession.c: rtpmanager: don't reveal the user's username, hostname or real name by default Send a randomly made-up user@hostname as CNAME and don't send a NAME at all by default. https://bugzilla.gnome.org/show_bug.cgi?id=668320 2012-01-20 17:06:42 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: simplify internal src event debug logging ... which avoids almost superfluous obtaining of rtsp element. 2012-01-20 17:03:50 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: avoid NULL string comparison 2012-01-20 17:02:15 +0100 Mark Nauwelaerts * gst/rtp/gstrtpmp4adepay.c: rtpmp4adepay: prevent out-of-bound array access 2012-01-20 17:01:37 +0100 Mark Nauwelaerts * gst/isomp4/atomsrecovery.c: isomp4: recovery: add sanity check ... on possibly bogus/corrupt input data. 2012-01-20 16:58:28 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroska-demux: remove redundant variable 2012-01-20 16:57:52 +0100 Mark Nauwelaerts * gst/deinterlace/gstdeinterlace.c: deinterlace: fix arithmetic for unsigned comparison 2012-01-20 16:55:06 +0100 Mark Nauwelaerts * gst/imagefreeze/gstimagefreeze.c: imagefreeze: add various missing break 2012-01-20 16:49:14 +0100 Mark Nauwelaerts * gst/alpha/gstalphacolor.c: alphacolor: remove redundant statement 2012-01-20 16:48:49 +0100 Mark Nauwelaerts * ext/flac/gstflacdec.c: flacdec: improve upstream peer duration querying ... to avoid accepting unhandled duration query result. 2012-01-20 16:47:36 +0100 Mark Nauwelaerts * ext/pulse/pulsesrc.c: pulsesrc: additional error condition checking 2012-01-20 16:46:21 +0100 Mark Nauwelaerts * ext/pulse/pulsesink.c: pulsesink: additional error condition checking 2012-01-20 16:44:21 +0100 Mark Nauwelaerts * ext/jpeg/gstjpegenc.c: jpegenc: check _alloc_buffer result and perform fallback alloc if needed ... rather than carrying on with NULL buffer. 2012-01-13 18:11:36 +0000 Vincent Penquerc'h * ext/pulse/pulsesrc.c: pulsesrc: fix wrong error check pa_stream_* functions return negative on error, despite the defines for error codes being positive. I only got to repro the error twice, so I'm not sure 100% sure this fixes the issue (the negative var being uninitialized after returning from pa_stream_get_latency). 2012-01-16 17:51:18 +0000 Vincent Penquerc'h * gst/cutter/gstcutter.c: cutter: fix leak of unused GValue 2012-01-16 16:10:08 +0000 Vincent Penquerc'h * tests/check/elements/autodetect.c: tests: fix autodetect test not testing correctly for state change success State change to PAUSED can be done async, so if this happens, we need to wait for the change to be done (or failed). 2012-01-16 15:42:46 +0000 Vincent Penquerc'h * gst/rtp/gstrtph263ppay.c: rtph263ppay: fix caps leak 2012-01-16 12:13:50 +0000 Vincent Penquerc'h * gst/deinterlace/gstdeinterlace.c: deinterlace: make interlacedness test deterministic If the interlaced flag is not present in the caps, we assume the data is not interlaced, instead of leaving the boolean uninitialized. 2012-01-13 17:43:49 +0000 Vincent Penquerc'h * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: oss4: fix caps leaks 2012-01-13 17:25:59 +0000 Vincent Penquerc'h * sys/v4l2/gstv4l2src.c: v4l2src: fix caps leak 2012-01-13 15:57:20 +0000 Vincent Penquerc'h * tests/check/elements/videocrop.c: tests: fix caps leak in videocrop test 2012-01-13 10:32:59 +0000 Tim-Philipp Müller * gst/rtpmanager/gstrtpptdemux.c: rtpptdemux: plug pad leak in error code path Based on patch by: Stig Sandnes Don't leak srcpad if there are no caps. https://bugzilla.gnome.org/show_bug.cgi?id=667820 2011-10-04 10:00:02 +0200 Stig Sandnes * sys/osxvideo/cocoawindow.m: osxvideo: Fix leak of NSOpenGLPixelFormat object https://bugzilla.gnome.org/show_bug.cgi?id=667818 2011-09-05 10:43:19 +0200 Havard Graff * sys/v4l2/gstv4l2src.c: v4l2src: Don't assert when the interface is not implemented. Simply return FALSE instead. https://bugzilla.gnome.org/show_bug.cgi?id=667817 2012-01-12 00:18:39 +0200 Raimo Järvi * sys/waveform/gstwaveformsink.c: * sys/waveform/gstwaveformsink.h: waveformsink: Fix mingw warnings https://bugzilla.gnome.org/show_bug.cgi?id=667719 2012-01-12 18:23:42 +0000 Vincent Penquerc'h * gst/rtpmanager/gstrtpssrcdemux.c: gstrtpssrcdemux: fix element leak 2012-01-12 14:19:22 +0000 Vincent Penquerc'h * gst/matroska/matroska-read-common.c: matroska: do not leak attachment buffers 2012-01-12 10:30:11 +0000 Vincent Penquerc'h * ext/flac/gstflacenc.c: flacenc: do not drop the first data buffer on the floor (and leak it either) 2012-01-11 18:45:33 -0300 Reynaldo H. Verdejo Pinochet * Android.mk: Temporarily disabling multifile for the Android build There is a hard dependency on inotify comming from gio. We are not currently bundling inotify with the Android dist so I'm disabling multifile for now until someone gets around to sort this out. This change fixes building on Android 2012-01-11 01:45:34 +0000 Tim-Philipp Müller * tests/check/pipelines/wavenc.c: tests: fix wavenc test on big endian wavenc only accepts little-endian PCM, but most of our elements such as audiotestsrc only produce or process audio in native endianness, so we need to plug a converter before wavenc on big endian systems. 2012-01-05 19:25:33 +0000 Vincent Penquerc'h * gst/isomp4/gstqtmux.c: isomp4: fix caps leak 2012-01-05 19:08:03 +0000 Vincent Penquerc'h * gst/isomp4/gstqtmux.c: isomp4: remove dead assignment 2012-01-04 19:40:14 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 11f0cd5 to cb5da59 2012-01-04 17:59:55 +0000 Tim-Philipp Müller * tests/check/elements/qtmux.c: tests: fix some leaks and remove files when done in qtmux test 2011-12-14 10:14:20 +0100 Peter Seiderer * gst/multifile/gstmultifilesink.c: multifilesink: post better error message when we run out of disk space Map write errno ENOSPC to GST_RESOURCE_ERROR_NO_SPACE_LEFT. 2011-12-27 11:50:03 +0000 Tim-Philipp Müller * gst/udp/gstudpsrc.c: udpsrc: fix valgrind warning https://bugzilla.gnome.org/show_bug.cgi?id=666644 2011-12-21 13:22:03 +0100 John Ogness * gst/udp/gstudpsrc.c: udpsrc: drop dataless UDP packets It is allowed to send/receive UDP packets with no data. When such a packet is available, select() will return with success but ioctl(FIONREAD) will return 0. But a read() must still occur in order to clear off the UDP packet from the queue. This patch will read the dataless packet from the socket. If select() was woken for other reasons (and FIONREAD returns 0), this may result in a UDP packet getting accidentally dropped. But since UDP is not reliable, this is acceptable. NOTE: This patch fixes a nasty bug where sending a dataless UDP packet to a udpsrc instance will cause an infinite loop. https://bugzilla.gnome.org/show_bug.cgi?id=666644 Signed-off-by: John Ogness 2011-12-21 20:50:21 +0100 Nicola Murino * ext/jpeg/gstjpegdec.c: jpegdec: fix peer_caps leak https://bugzilla.gnome.org/show_bug.cgi?id=666688 2011-12-25 14:23:29 +0000 Tim-Philipp Müller * gst/flv/gstflvmux.c: flvmux: don't try to push already-freed buffers Fixes unit test. 2011-09-09 11:42:09 +0100 Vincent Penquerc'h * gst/audioparsers/gstac3parse.c: ac3parse: let bsid 9 and 10 through Files with 9 and 10 happen, and seem to comply with the <= 8 format, so let them through. The spec says nothing about 9 and 10. https://bugzilla.gnome.org/show_bug.cgi?id=658546 2011-12-16 19:15:38 +0100 Mark Nauwelaerts * gst/flv/gstflvmux.c: flvmux: properly determine final duration ... which can be authoratively obtained from our own written timestamps. 2011-12-19 13:56:30 +0100 Mark Nauwelaerts * gst/flv/gstflvmux.c: flvmux: only write full metadata at start ... rather than having (potentially) unnecessary duplicates written all over, or even contradictory varying filesize info, or duration info that will not be rewritten upon header rewrite. 2011-12-21 17:43:10 +0100 Branko Subasic * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: do not consider duration of non-finalized file ... to avoid it clamping requested seek position. Non-finalized file case, determined by whether _parse_blockgroup_or_simpleblock ever updates the segment duration. Fixes #652195. 2011-12-21 15:06:57 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: improve decision to fall back to scanning when seeking ... which is basically iff not streaming and no entry found in index 2011-12-13 18:18:45 +0100 Mark Nauwelaerts * gst/matroska/matroska-read-common.c: matroskademux: filter bogus index entries with missing block number ... to avoid contradictory information resulting in seeks sending more downstream than needed for the corresponding segment. 2011-12-13 18:15:18 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: cater for safer arithmetic with global start time 2011-12-13 17:02:01 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: tweak final closing segment sending ... to avoid it interfering with (sparse) stream syncing. 2011-12-12 11:54:56 +0100 Sebastian Dröge * gst-libs/gst/glib-compat-private.h: glib-compat: Add license boilerplate for LGPL 2011-12-12 15:15:46 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: mind (un)signed in some timestamp arithmetic ... to avoid ending up with invalid (negative) duration. 2011-02-09 15:31:22 +0100 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: increase parse tolerance for fuzzy file cases 2011-12-12 10:38:20 +0000 Tim-Philipp Müller * Makefile.am: build: dist glib-compat-private.h properly Add missing slash. 2011-12-12 10:18:14 +0000 Tim-Philipp Müller * tests/check/elements/souphttpsrc.c: tests: use atexit, g_atexit has been deprecated in glib master 2011-12-12 02:52:13 +0000 Tim-Philipp Müller * ext/dv/gstdvdemux.c: * ext/flac/gstflacdec.c: * ext/wavpack/gstwavpackparse.c: * gst/avi/gstavidemux.c: * gst/flv/gstflvdemux.c: * gst/imagefreeze/gstimagefreeze.c: * gst/isomp4/gstqtmoovrecover.c: * gst/isomp4/qtdemux.c: * gst/matroska/matroska-demux.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtsp/gstrtspsrc.c: * gst/videomixer/videomixer2.c: * gst/wavparse/gstwavparse.c: Suppress deprecation warnings in selected files, for g_static_rec_mutex_* mostly GStaticRecMutex is part of our API/ABI, not much we can do here in 0.10 for most of these. 2011-12-12 02:41:37 +0000 Tim-Philipp Müller * tests/check/elements/souphttpsrc.c: * tests/icles/equalizer-test.c: * tests/icles/gdkpixbufsink-test.c: * tests/icles/test-oss4.c: * tests/icles/videocrop-test.c: tests: g_thread_init() is deprecated in glib master It's not needed any longer. 2011-12-12 02:38:37 +0000 Tim-Philipp Müller * ext/soup/gstsouphttpclientsink.c: * gst/rtpmanager/gstrtpsession.c: * sys/oss4/oss4-mixer.c: * tests/icles/v4l2src-test.c: Use g_thread_try_new() instead of g_thread_crate() with newer glib versions 2011-12-12 02:31:36 +0000 Tim-Philipp Müller * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: use new glib API for static mutex if available 2011-12-12 02:30:45 +0000 Tim-Philipp Müller * Makefile.am: * ext/jack/gstjackaudioclient.c: * ext/pulse/pulseaudiosink.c: * ext/pulse/pulsesink.c: * ext/soup/gstsouphttpclientsink.c: * gst-libs/gst/glib-compat-private.h: * gst/audiofx/audiochebband.c: * gst/audiofx/audiocheblimit.c: * gst/audiofx/audiofirfilter.c: * gst/audiofx/audioiirfilter.c: * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: * gst/equalizer/gstiirequalizer.c: * gst/imagefreeze/gstimagefreeze.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/shapewipe/gstshapewipe.c: * gst/udp/gstmultiudpsink.c: * gst/videobox/gstvideobox.c: * gst/videocrop/gstaspectratiocrop.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer2.c: * sys/oss4/oss4-mixer.c: * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2xoverlay.c: * sys/ximage/gstximagesrc.c: Work around deprecated thread API in glib master Add private replacements for deprecated functions such as g_mutex_new(), g_mutex_free(), g_cond_new() etc., mostly to avoid the deprecation warnings. We'll change these over to the new API once we depend on glib >= 2.32. 2011-12-12 10:24:45 +0100 Sebastian Dröge * configure.ac: configure: Require GLib >= 2.24 All other modules require this already and nobody is testing with older versions anyway. 2011-12-11 18:40:31 +0000 Tim-Philipp Müller * ext/gdk_pixbuf/gstgdkpixbufsink.c: gdkpixbufsink: fix inverted pixel-aspect-ratio Spotted by Mike Morrison. https://bugzilla.gnome.org/show_bug.cgi?id=665882 2011-12-11 17:55:14 +0000 Tim-Philipp Müller * ext/pulse/pulseaudiosink.c: pulseaudiosink: don't leak pad template 2011-12-10 15:13:07 +0000 Tim-Philipp Müller * configure.ac: * gst/deinterlace/tvtime-dist.c: * gst/videobox/gstvideoboxorc-dist.c: * gst/videomixer/blendorc-dist.c: * po/eo.po: * win32/common/config.h: 0.10.30.2 pre-release 2011-12-10 14:48:57 +0000 Tim-Philipp Müller * ext/soup/gstsouphttpclientsink.c: soup: fix start/stop race in souphttpclientsink Fix crash or hang in generic/states unit test when doing stop() right after start(). Create main loop in the start function already and not just in the thread function, so that stop() always has a valid main loop to quit on. Also, calling g_main_loop_quit() before g_main_loop_run() won't work and result in the stop function waiting for the thread to join forever. Therefore, wait for the thread to be ready and get the main loop running in the start() function, to be sure stop() always works. 2011-12-10 13:35:08 +0000 Tim-Philipp Müller * tests/files/Makefile.am: tests: dist test file used in matroskaparse unit test 2011-12-10 12:32:32 +0000 Tim-Philipp Müller * tests/check/elements/rgvolume.c: tests: fix up rgvolume test for basetransform event caching Some tests assumed that tag events would always pushed through immediately, which isn't the case any longer, so push a newsegment event and an empty buffer first. 2011-12-10 02:21:02 +0000 Tim-Philipp Müller * po/LINGUAS: * po/eo.po: * po/ja.po: * po/lv.po: * po/sr.po: po: update translations 2011-12-09 15:50:28 +0000 Tim-Philipp Müller * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: don't leak client name when freeing the element And add gtk-doc chunks for the new property. https://bugzilla.gnome.org/show_bug.cgi?id=665872 2011-12-09 15:45:03 +0000 Nicolas Baron * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosink.h: * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackaudiosrc.h: jack: add "client-name" property to jackaudiosink and jackaudiosrc https://bugzilla.gnome.org/show_bug.cgi?id=665872 2011-12-08 11:00:45 +0000 Tim-Philipp Müller * gst/matroska/matroska-mux.c: matroskamux: stream-format=raw goes with aac caps, not mp3 caps 2011-12-02 12:07:24 +0000 Vincent Penquerc'h * sys/v4l2/gstv4l2object.c: v4l2src: do not ignore the highest frame interval https://bugzilla.gnome.org/show_bug.cgi?id=665387 2011-12-02 11:59:03 +0000 Vincent Penquerc'h * sys/v4l2/gstv4l2object.c: v4l2src: do not ignore the largest resolution The 'max' value isn't an STL style "one after the end" bound, but the largest allowed value. https://bugzilla.gnome.org/show_bug.cgi?id=665387 2011-12-06 16:47:25 +0100 Stefan Sauer * gst/multifile/gstmultifilesink.h: docs: add add the two enum values that were just added too 2011-12-06 16:14:54 +0100 Stefan Sauer * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/multifile/gstmultifilesink.h: multifilesink: expose the enum property docs for splitting mode. Fixes #665666. 2011-12-05 12:15:21 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2object.c: v4l2: replace deprecated GST_CLASS_LOCK 2011-11-24 13:58:01 +0100 Sebastian Rasmussen * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: Ceil jpeg dimensions, instead of floor A JPEG image inside an RTP stream has a preceeding RFC2435 header that conveys width/height. The dimensions in this header are limited to be multiples of 8. Since JPEG uses an MCU of 8x8 pixels any image must already indirectly have image data dimensions that are rounded up in order to contain enough data to render the image. Therefore this fix safely rounds the image dimensions in the RFC2435 header up to the closest multiple of 8. 2011-12-04 12:50:57 +0000 Vincent Penquerc'h * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: flacparse: ensure we only check for sample/block mixup at start Otherwise we might trigger at some point within the file, but the check is only making sense for the second block. 2011-12-03 18:14:59 +0000 Vincent Penquerc'h * gst/matroska/matroska-parse.c: matroskaparse: warn if accumulating headers after they were pushed https://bugzilla.gnome.org/show_bug.cgi?id=665412 2011-10-25 12:54:43 -0700 David Schleef * gst/matroska/matroska-parse.c: matroskaparse: fix parsing Mark more parts as belonging to streamheaders. 2011-12-03 17:30:10 +0000 Vincent Penquerc'h * gst/flv/gstflvdemux.c: flvdemux: fix discontinuity threshold check when timestamps go backwards Since unsigned types are used, a negative value would show as very, very positive. Fixes A/V sync on some... less than well made files where timestamps go backwards. 2011-12-02 12:01:22 +0000 Vincent Penquerc'h * sys/v4l2/gstv4l2object.c: v4l2src: add a comment about a "hidden" assumption on rank values https://bugzilla.gnome.org/show_bug.cgi?id=665387 2011-12-01 14:13:05 +0000 Tim-Philipp Müller * tests/check/Makefile.am: tests: fix up LIBS order som more` 2011-12-01 13:22:42 +0000 Tim-Philipp Müller * gst/matroska/matroska-mux.c: matroska-mux: fix name of new property and the unit test https://bugzilla.gnome.org/show_bug.cgi?id=654379 2011-09-25 14:57:56 +0100 Tim-Philipp Müller * gst/multifile/gstmultifilesink.c: multifilesink: add basic buffer list handling We assume for now that all buffers in a buffer list should end up in the same file (so we can group GOPs in buffer lists, for example). Could optimise this a bit to avoid the memcpy. 2011-09-23 18:43:35 +0100 Tim-Philipp Müller * gst/multifile/gstmultifilesink.c: multifilesink: write stream-headers when switching to the next file in max-size mode 2011-09-23 18:31:01 +0100 Tim-Philipp Müller * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: add new 'max-size' mode for switching to the next file 2011-09-23 17:49:05 +0100 Tim-Philipp Müller * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: add "max-file-size" property for new next-file mode 2011-12-01 13:38:06 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Don't forget SSA subtitles in last commit 2011-12-01 13:34:52 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: matroskademux: Only check for markup and escape if necessary for plaintext subtitles Otherwise we break USF and ASS/SSA subtitles. 2011-12-01 13:23:33 +0100 Alessandro Decina * gst/multifile/Makefile.am: multifile: fix build in uninstalled setup Add -base libs includes to CFLAGS, fix order of LIBS . 2011-12-01 13:08:01 +0100 Alessandro Decina * tests/check/elements/multifile.c: tests: fix g_mkdtemp presence check in multifile tests g_mkdtemp was added in glib 2.30 even though the doc claims it was added in 2.26. 2011-07-17 23:56:04 +0200 Alessandro Decina * gst/multifile/Makefile.am: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: * tests/check/Makefile.am: * tests/check/elements/multifile.c: multifilesink: add flag to cut after a force key unit event 2011-12-01 12:47:26 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Copy all buffer flags when creating a subtitle buffer copy after postprocessing This also copies the caps. Otherwise we could end up pusing the first buffer without any caps, which causes downstream to not get notified about the caps. Fixes bug #664892. 2011-10-11 02:07:13 +0200 Alexey Fisher * gst/matroska/matroska-mux.c: matroskamux: make default framerate optional per stream there is at least two use cases where default frame rate should or may be disabled: - vp8 stream with altref frame enabled. If default frame rate is enabled, some players will missinterprete it (critical!) - for webm container, to reduce micro overhead - for stream with variable frame rate. Signed-off-by: Alexey Fisher 2011-11-30 22:13:11 +0100 Stefan Sauer * gst/effectv/gstripple.c: rippletv: fix CLAMP end-values 2011-11-30 19:25:37 +0000 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-isomp4.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: update docs 2011-11-30 19:00:42 +0000 Tim-Philipp Müller * gst/multifile/Makefile.am: * gst/multifile/gstsplitfilesrc.c: * gst/multifile/patternspec.c: * gst/multifile/patternspec.h: splitfilesrc: specify filenames via normal wildcards instead of regular expressions Less cracktastic in the end. 2011-10-10 18:28:11 +0100 Tim-Philipp Müller * gst/multifile/gstsplitfilesrc.c: splitfilesrc: check bytes actually read, just in case Handle corner case where we try to read beyond the end of the last file part, in which case we want to return a short read. If we get fewer bytes than expected for any other file part, we should just error out, since something fishy's going on then. 2011-10-06 08:33:19 +0100 Tim-Philipp Müller * gst/multifile/gstsplitfilesrc.c: splitfilesrc: set offsets on buffers Looks like some parsers (in some versions at least) expect the offsets to be set, and behave weird if that's not the case (e.g. off-by-one in h264parse). 2011-07-28 20:19:56 +0100 Tim-Philipp Müller * configure.ac: * gst/multifile/Makefile.am: * gst/multifile/gstmultifile.c: * gst/multifile/gstsplitfilesrc.c: * gst/multifile/gstsplitfilesrc.h: multifile: add splitfilesrc element Add new splitfilesrc element that presents multiple files (selectable via a location regex) as one single contiguous file. 2011-11-29 17:34:10 -0300 Thiago Santos * ext/pulse/pulseaudiosink.c: Revert "pulseaudiosink: fix caps leak" This reverts commit d6a9de9e2aedc8b66ab3219902b5a37e8d65ada2. setcaps functions aren't supposed to take ownership of the caps passed 2011-11-28 12:58:44 +0000 Vincent Penquerc'h * ext/aalib/gstaasink.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/cairo/gstcairooverlay.c: * ext/cairo/gstcairorender.c: * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttimeoverlay.c: * ext/dv/gstdvdec.c: * ext/dv/gstdvdemux.c: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: * ext/flac/gstflactag.c: * ext/gconf/gstswitchsink.c: * ext/gconf/gstswitchsrc.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/gstgdkpixbufsink.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/hal/gsthalaudiosink.c: * ext/hal/gsthalaudiosrc.c: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokedec.c: * ext/jpeg/gstsmokeenc.c: * ext/libcaca/gstcacasink.c: * ext/libmng/gstmngdec.c: * ext/libmng/gstmngenc.c: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/mikmod/gstmikmod.c: * ext/pulse/pulseaudiosink.c: * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: * ext/shout2/gstshout2.c: * ext/soup/gstsouphttpclientsink.c: * ext/soup/gstsouphttpsrc.c: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * ext/taglib/gstapev2mux.cc: * ext/taglib/gstid3v2mux.cc: * ext/taglib/gsttaglibmux.c: * ext/wavpack/gstwavpackdec.c: * ext/wavpack/gstwavpackenc.c: * ext/wavpack/gstwavpackparse.c: * gst/alpha/gstalpha.c: * gst/alpha/gstalphacolor.c: * gst/apetag/gstapedemux.c: * gst/audiofx/audiopanorama.c: * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstmpegaudioparse.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: * gst/avi/gstavidemux.c: * gst/avi/gstavimux.c: * gst/avi/gstavisubtitle.c: * gst/cutter/gstcutter.c: * gst/debugutils/breakmydata.c: * gst/debugutils/cpureport.c: * gst/debugutils/efence.c: * gst/debugutils/gstcapsdebug.c: * gst/debugutils/gstcapssetter.c: * gst/debugutils/gstnavigationtest.c: * gst/debugutils/gstnavseek.c: * gst/debugutils/gstpushfilesrc.c: * gst/debugutils/gsttaginject.c: * gst/debugutils/progressreport.c: * gst/debugutils/rndbuffersize.c: * gst/debugutils/testplugin.c: * gst/deinterlace/gstdeinterlace.c: * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstop.c: * gst/effectv/gstquark.c: * gst/effectv/gstradioac.c: * gst/effectv/gstrev.c: * gst/effectv/gstripple.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gststreak.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: * gst/flv/gstflvdemux.c: * gst/flv/gstflvmux.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/goom2k1/gstgoom.c: * gst/icydemux/gsticydemux.c: * gst/id3demux/gstid3demux.c: * gst/imagefreeze/gstimagefreeze.c: * gst/interleave/deinterleave.c: * gst/interleave/interleave.c: * gst/isomp4/gstqtmux.c: * gst/isomp4/gstrtpxqtdepay.c: * gst/isomp4/qtdemux.c: * gst/law/alaw-decode.c: * gst/law/alaw-encode.c: * gst/law/mulaw-decode.c: * gst/law/mulaw-encode.c: * gst/level/gstlevel.c: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: * gst/matroska/matroska-parse.c: * gst/matroska/webm-mux.c: * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/replaygain/gstrganalysis.c: * gst/replaygain/gstrglimiter.c: * gst/replaygain/gstrgvolume.c: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpac3pay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdvdepay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpg722depay.c: * gst/rtp/gstrtpg722pay.c: * gst/rtp/gstrtpg723depay.c: * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtpgstdepay.c: * gst/rtp/gstrtpgstpay.c: * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmparobustdepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpqcelpdepay.c: * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpsirendepay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/rtp/gstrtpvrawpay.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspsrc.c: * gst/shapewipe/gstshapewipe.c: * gst/smpte/gstsmpte.c: * gst/smpte/gstsmptealpha.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpsrc.c: * gst/videobox/gstvideobox.c: * gst/videocrop/gstaspectratiocrop.c: * gst/videocrop/gstvideocrop.c: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer2.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: * gst/y4m/gsty4mencode.c: * sys/directsound/gstdirectsoundsink.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxvideo/osxvideosink.m: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosrc.c: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2src.c: * sys/waveform/gstwaveformsink.c: * sys/ximage/gstximagesrc.c: * tests/check/elements/qtmux.c: various: fix pad template leaks https://bugzilla.gnome.org/show_bug.cgi?id=662664 2011-11-28 11:47:11 +0100 Chad * gst/debugutils/gsttaginject.c: taginject: set gap-aware The element does not modify the data anyway. 2011-11-26 21:39:33 +0100 Stefan Sauer * gst/equalizer/gstiirequalizer.c: equalizer: also sync the parameters for the filter bands 2011-11-26 16:06:59 +0000 Tim-Philipp Müller * gst/matroska/matroska-ids.c: matroskademux: initialise seen_markup_tag field on subtitle stream context 2011-11-25 19:28:55 -0300 Thiago Santos * gst/isomp4/gstqtmuxmap.c: ismlmux: Use iso-fragmented as variant type Using 'iso' conflicts with mp4mux variant type, ismlmux now uses iso-fragmented Fixes #656823 2011-11-24 12:05:33 +0530 Arun Raghavan * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: pulsesrc: Implement GstStreamVolume interface PulseAudio 1.0 supports per-source-output volumes, and this exposes the functionality via the GstStreamVolume interface. When compiled against pre-1.0 PulseAudio, the interface is not implemented, and the "volume" or "mute" properties are not available. This bit of ugliness will go away when we can depend on PulseAudio 1.0 or greater. https://bugzilla.gnome.org/show_bug.cgi?id=595055 2011-09-10 21:21:38 -0700 Arun Raghavan * ext/pulse/pulsesrc.c: pulsesrc: Trivial comment copy-paste-o fix 2011-11-14 12:43:27 +0530 Arun Raghavan * ext/pulse/pulseaudiosink.c: pulseaudiosink: Remove redundant code 2011-11-14 12:41:41 +0530 Arun Raghavan * ext/pulse/pulseaudiosink.c: pulseaudiosink: Clean up refcounting in event probe Makes sure we don't leak a refcount if the object is disposed before a NEWSEGMENT turns up. 2011-11-24 16:31:38 +0000 Vincent Penquerc'h * gst/flv/gstflvdemux.c: flvdemux: fix seeking Which I accidentally broke when fixing flv videos breaking on spurious timestamp discontinuities in broken files. https://bugzilla.gnome.org/show_bug.cgi?id=631430 2011-11-25 13:13:47 +0100 Stefan Sauer * gst/effectv/gstradioac.c: * gst/effectv/gstradioac.h: effectv: repair color modes in radioactv by taking rgb,bgr into account 2011-11-25 11:44:49 +0100 Stefan Sauer * gst/effectv/gstradioac.c: radioactv: add one more set of caps It also work in this format. Avoids the need for conversion. 2011-11-25 11:44:18 +0100 Stefan Sauer * gst/effectv/gstradioac.c: * gst/effectv/gstshagadelic.c: effecttv: fix reverse negotiation The plugins were using _fixed_caps_ and thus not adjusting to new upstream sizes. Spotted by Tim Müller. 2011-11-25 11:43:16 +0100 Stefan Sauer * gst/effectv/gstwarp.c: warptv: remove not needed ifdef 2011-11-25 10:15:35 +0100 Stefan Sauer * gst/effectv/gstripple.c: rippletv: clean up the rendering code a bit This is corrrupts the memoy when resizing. Add a FIXME to make it resizeable once that is solved. 2011-11-24 20:42:49 +0100 Stefan Sauer * gst/effectv/gstquark.c: * gst/effectv/gststreak.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: effecttv: fix reverse negotiation The plugins were using _fixed_caps_ and thus not adjusting to new upstream sizes. Spotted by Tim Müller. 2011-11-24 14:14:53 -0300 Thiago Santos * gst/multifile/gstmultifilesink.c: multifilesink: Fix leak of filename strings Do not forget to free the filename strings when deleting the list of files. 2011-11-24 14:11:33 -0300 Thiago Santos * tests/check/elements/multifile.c: multifile: fix build of tests Tests fail to build because g_mkdtemp is available from glib since 2.26. This patch adds a condition around the redefinition of g_mkdtemp on the tests to only build it if glib is older than 2.26. 2011-09-27 16:49:45 +0100 Vincent Penquerc'h * gst/wavparse/gstwavparse.c: wavparse: skip id32 tags This allows decoding at least one sample where something has stuffed some ID3 tag before the (supposedly initial) FMT\ . https://bugzilla.gnome.org/show_bug.cgi?id=660249 2011-10-31 17:06:18 +0000 Vincent Penquerc'h * gst/effectv/gstedge.c: edgetv: trivial comment fix for clarity https://bugzilla.gnome.org/show_bug.cgi?id=661841 2011-10-31 17:04:23 +0000 Vincent Penquerc'h * gst/effectv/gstedge.c: edgetv: don't leave bits of the output buffer uninitialized Let's initialize them to zero. It looks alright, but then it also looks alright with v3, or with the corresponding pixels from the source. I don't know what the original intent would be, and the original effectv source also has this bug/feature. https://bugzilla.gnome.org/show_bug.cgi?id=661841 2011-11-24 10:25:02 +0100 Sebastian Dröge * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstmpegaudioparse.c: audioparse: Use the sinkpad template caps as fallback, not the srcpad ones 2011-11-24 09:59:40 +0100 Sebastian Dröge * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream 2011-11-24 09:57:57 +0100 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream 2011-11-24 09:55:47 +0100 Sebastian Dröge * gst/audioparsers/gstdcaparse.c: dcaparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream 2011-11-24 09:53:18 +0100 Sebastian Dröge * gst/audioparsers/gstamrparse.c: amrparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream 2011-11-24 09:49:27 +0100 Sebastian Dröge * gst/audioparsers/gstamrparse.c: amrparse: Mark some more functions as static 2011-11-24 09:48:33 +0100 Sebastian Dröge * gst/audioparsers/gstac3parse.c: ac3parse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream 2011-11-24 09:44:58 +0100 Sebastian Dröge * gst/audioparsers/gstaacparse.c: aacparse: Mark some functions as static and remove unused function declarations 2011-11-24 09:43:14 +0100 Sebastian Dröge * gst/audioparsers/gstaacparse.c: aacparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream 2011-11-23 00:57:39 +0000 Tim-Philipp Müller * tests/check/Makefile.am: * tests/check/elements/.gitignore: * tests/check/elements/matroskaparse.c: * tests/files/pinknoise-vorbis.mkv: tests: add basic unit test for matroskaparse 2011-11-23 00:56:26 +0000 Tim-Philipp Müller * gst/matroska/matroska-parse.c: matroskaparse: don't leak stream headers https://bugzilla.gnome.org/show_bug.cgi?id=664548 2011-11-16 19:08:05 +0100 Mark Nauwelaerts * ext/speex/gstspeexenc.c: speexenc: ensure to free allocated padded data 2011-11-16 18:57:38 +0100 Mark Nauwelaerts * ext/speex/gstspeexenc.c: speexenc: reset tag setter interface when appropriate 2011-11-16 18:57:21 +0100 Mark Nauwelaerts * ext/flac/gstflacenc.c: flacenc: reset tag setter interface when appropriate 2011-11-14 15:34:57 +0000 Vincent Penquerc'h * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: flacparse: detect when a file lies about fixed block size If the sample/block number happens to be the same as the block size, we assume variable block size, and thus counters in samples in the headers. This can only get us a false positive for a block size of 1, which is invalid. We can get false negatives more often though (eg, if not starting at the start of the stream), but then that's already GIGO. 2011-09-02 19:20:07 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: gstrtpsession: Add special mode to use FIR as repair as Google does https://bugzilla.gnome.org/show_bug.cgi?id=658419 2011-09-01 17:47:38 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.h: rtpsession: Send FIR requests in response to key unit requests with all-headers=TRUE https://bugzilla.gnome.org/show_bug.cgi?id=658419 2011-09-01 16:25:21 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.h: rtpsession: Put the PLI requests in each RTPSource Also refactor a bit and put all the keyframe request code in one place inside rtpsession.c https://bugzilla.gnome.org/show_bug.cgi?id=658419 2011-08-31 14:35:33 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Hack to FIR because Google doesn't set the sender ssrc correctly https://bugzilla.gnome.org/show_bug.cgi?id=658419 2011-08-30 19:06:13 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Process received Full Intra Requests Process FIR requests according to RFC 5104 https://bugzilla.gnome.org/show_bug.cgi?id=658419 2011-11-07 18:43:26 +0000 Sjoerd Simons * sys/v4l2/gstv4l2object.c: v4l2: Set pixel-aspect-ratio to 1/1 We don't currently support setting the pixel-aspect-ratio from V4L2. So simply set it to be 1/1 in the caps to prevent negotiation failures when fixating to weird values (e.g. when the downstream caps has pixel-aspect-ratio = [ MIN, MAX ] ) https://bugzilla.gnome.org/show_bug.cgi?id=663580 2011-11-11 10:06:25 -0300 Thiago Santos * ext/pulse/pulseaudiosink.c: pulseaudiosink: fix caps leak 2011-11-11 14:55:48 +0100 Mark Nauwelaerts * ext/pulse/pulsesink.c: pulsesink: do not leak clientname when setting up property 2011-11-11 18:05:35 +0530 Arun Raghavan * ext/pulse/pulseaudiosink.c: pulse: Chain up dispose() in pulseaudiosink 2011-11-08 15:35:26 +0000 Vincent Penquerc'h * gst/avi/gstavidemux.c: avidemux: fix wrong stride when inverting uncompressed video Such frames have a stride multiple of 4, see http://lscube.org/pipermail/ffmpeg-issues/2010-April/010247.html. This showed up on a sample using a odd width of 24 bit video. https://bugzilla.gnome.org/show_bug.cgi?id=652288 2011-11-09 10:32:06 +0100 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: minimal sanity check on creation datetime 2011-11-02 12:58:12 -0400 Olivier Crête * gst/rtp/gstrtph263ppay.c: rtph263ppay: Return the sink pad template as sink caps, not the src's https://bugzilla.gnome.org/show_bug.cgi?id=577784 2009-03-15 19:26:48 -0400 Olivier Crête * gst/rtp/gstrtph263ppay.c: rtph263ppay: Also implement size/framerate restrictions in getcaps https://bugzilla.gnome.org/show_bug.cgi?id=577784 2009-03-04 20:50:19 -0500 Olivier Crête * gst/rtp/gstrtph263ppay.c: rtph263ppay: Implement getcaps following RFC 4629, picks the right annexes https://bugzilla.gnome.org/show_bug.cgi?id=577784 2011-11-08 14:31:34 +0100 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: also set segment stop at startup rather than only post seek ... so as to ensure consistent playback with or without seek, especially in presence of some bogus edit list entries. 2011-11-02 17:02:54 +0000 Raul Gutierrez Segales * gst/flv/Makefile.am: gst/flv/: add amfdefs.h to noinst_HEADERS https://bugzilla.gnome.org/show_bug.cgi?id=663334 2011-10-03 17:50:43 +0100 Vincent Penquerc'h * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: flvdemux: detect large pts gaps and resync Should work on multiple gaps, but tested on only one. https://bugzilla.gnome.org/show_bug.cgi?id=631430 2011-08-22 10:40:45 +0100 Vincent Penquerc'h * ext/flac/gstflacdec.c: flacdec: fix off by one between granpos and last_stop 2011-10-07 19:41:35 +0100 Vincent Penquerc'h * gst/audioparsers/gstflacparse.c: flacparse: fix last frame timestamp in fixed block size mode The last block may have a different block size, so we should not use it to scale or we'll end up with a wrong timestamp. See comment and quote from the FLAC format documentation in the code. Fixes looped playback of FLAC files (via about-to-finish). https://bugzilla.gnome.org/show_bug.cgi?id=661215 2011-10-27 15:52:47 +0100 Vincent Penquerc'h * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttextoverlay.h: cairotextoverlay: add a 'silent' property to skip rendering https://bugzilla.gnome.org/show_bug.cgi?id=662856 2011-11-07 12:00:12 +0100 René Stadler * gst/matroska/ebml-write.c: matroskamux: fix regression causing malformed files This was caused by me in 1b213d. It seems I was too focused on 0.11 when I did this and tested the wrong branch. The problem was reported by Alexey Fisher. 2011-11-03 23:28:31 +0000 Tim-Philipp Müller * gst/rtp/gstrtpvrawdepay.c: rtp: use GLib's G_BIG_ENDIAN define instead of BIG_ENDIAN Fixes compiler warning on mingw32 2011-10-31 16:18:32 +0100 Mark Nauwelaerts * gst/isomp4/gstqtmux.c: qtmux: avoid shortcut evaluation when adding paired mp4 tag Fixes (part of) #638711. 2011-10-31 15:43:25 +0100 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: do not use unoffical V_MJPEG codec id ... but as not spec'ed especially, consider it a VfW compatibility case. Fixes #659837. 2011-10-30 19:30:14 +0000 Tim-Philipp Müller * ext/flac/gstflacenc.h: flacenc: remove dead code from header We require a new-enough libflac that this condition will never apply. 2011-10-28 09:57:36 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: add sof-marker to template caps, so we don't get plugged for lossless jpeg jpegdec (using libjpeg 6.2/8) can't decode some lossless types of JPEG. https://bugzilla.gnome.org/show_bug.cgi?id=556648 2011-10-28 12:30:33 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: elaborate some debug statements 2011-10-11 20:56:51 +0400 Stas Sergeev * gst/flv/gstflvdemux.c: flvdemux: be careful with negative cts Fixes #661477. 2011-10-06 13:04:54 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: tune non-update seek handling cases Fixes #661049. 2011-10-28 10:40:36 +0200 Sebastian Dröge * gst/videomixer/videomixer2.c: videomixer2: Use the clip function instead of the prepare_buffer function 2011-10-28 09:36:17 +0200 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/gstcollectpads2.c: * gst/videomixer/gstcollectpads2.h: * gst/videomixer/videomixer2.h: * gst/videomixer/videomixer2pad.h: videomixer2: Use collectpads2 from core 2011-10-28 00:41:45 +1100 Jan Schmidt * gst/deinterlace/gstdeinterlace.c: deinterlace: Don't pointlessly hold object lock over caps operations Avoids a deadlock when getcaps is recursive due to the getcaps being reflected upstream/downstream. The lock isn't actually protecting anything here. 2011-10-27 00:37:03 +1100 Jan Schmidt * gst/flv/amfdefs.h: * gst/flv/gstflvmux.c: flvmux: add some comments and defines to clarify code. 2011-10-10 15:36:14 +0200 René Stadler * gst/matroska/ebml-write.c: matroska: refactor ebml-write to be more 0.11 friendly Switching to a more 0.11-friendly pattern, where getting the buffer's data pointer and setting the size many times is less natural. This is of course in preparation to the upcoming port of the plugin. 2011-10-11 21:45:46 +0200 René Stadler * gst/matroska/ebml-write.c: matroska: remove stale floatcast include GDOUBLE_TO_BE was moved to core a long time ago. 2011-10-11 22:10:27 +0200 René Stadler * gst/matroska/matroska-mux.c: matroskamux: fix possible crash with malformed dirac codec_data Since size is unsigned, we need to safeguard against wrapping below zero. 2011-10-21 22:33:34 +0200 René Stadler * gst/equalizer/gstiirequalizer.c: equalizer: remove avoidable call to gst_object_set_name 2011-10-21 22:32:38 +0200 René Stadler * gst/deinterlace/gstdeinterlace.c: deinterlace: remove avoidable call to gst_object_set_name 2011-10-16 20:30:25 +0200 René Stadler * ext/libpng/gstpngenc.c: pngenc: increase arbitrary resolution limits Apparently libpng can technically do up to 2^31-1 rows and columns. However it imposes an (arbitrary) default limit of 1 million (that could theoretically be lifted by using some additional API). Moved array allocation to the heap now. 2011-10-16 20:25:41 +0200 René Stadler * ext/libpng/gstpngenc.c: pngenc: don't unconditionally allocate 4096 pointers on the stack Instead allocate as many as needed (on the stack still). 2011-10-16 20:05:28 +0200 René Stadler * ext/libpng/gstpngenc.c: pngenc: ensure setcaps was called before chain function This is needed to properly error out for e.g. "fakesrc ! pngenc ! fakesink". 2011-10-16 19:44:27 +0200 René Stadler * ext/libpng/gstpngenc.c: pngenc: validate input buffer size Just for safety; of course such mismatch represents a bug in another element. 2011-10-16 19:41:28 +0200 René Stadler * ext/libpng/Makefile.am: * ext/libpng/gstpngenc.c: * ext/libpng/gstpngenc.h: pngenc: make setcaps more robust, use gstvideo functions A setcaps function needs to actually verify the caps carefully. In this case, it was possible to e.g. link a video decoder with YUV+RGB template caps to pngenc. That would cause a crash when the decoder pushes a YUV buffer. Same thing when pushing a valid buffer that exceeds the resolution limits. Also, missing framerate caps field would cause a glib critical warning due to invalid GValue. This fails hard now. 2011-10-21 10:01:43 +0200 René Stadler * gst/matroska/matroska-read-common.c: ebml: small correction to previous commit Signal a short read with UNEXPECTED, exactly like the peek_bytes function. 2011-10-19 13:09:51 +0200 Edward Hervey * gst/matroska/matroska-read-common.c: ebml: Fix push-based behaviour The 'peek' method was completely wrong (!?) 2011-10-18 18:31:17 +0530 Arun Raghavan * ext/pulse/pulseaudiosink.c: pulse: Get caps correctly on pad block Instead of always going upstream, we should first see if already got caps from a setcaps() call. https://bugzilla.gnome.org/show_bug.cgi?id=661262 2011-10-18 12:25:14 +0100 Tim-Philipp Müller * ext/wavpack/gstwavpackenc.c: wavpackenc: don't unref buffer with gst_object_unref() 2011-10-18 12:05:01 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: only use is_pcm for 1.0 of pulseaudio 2011-10-18 11:58:57 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: only disable trickmodes for !pcm Only disable trickmodes when we are not dealing with raw PCM samples. 2011-10-14 10:56:16 +0530 Arun Raghavan * gst/videomixer/videomixer2.c: videomixer2: Fix a leak Buffers weren't being unref'ed in one case inside, causing memory usage to blow up. 2011-10-14 09:10:01 +0200 Marc Leeman * gst/rtp/gstrtpvrawdepay.c: set colour masks for video/x-raw-rgb in rtpvrawdepay 2011-10-13 16:59:50 +0530 Arun Raghavan * gst/videomixer/videomixer2.c: videomixer2: Fix incorrect gst_buffer_replace() call This got exposed when gst_buffer_replace() was changed from a macro to a function. 2011-10-12 11:26:50 +0200 Edward Hervey * gst/rtp/gstrtpvrawpay.c: rtpvrawpay: Only use 24 LSB for depth=24 RGB caps ... and indent the masks for clarity 2011-10-11 14:58:43 +0200 René Stadler * gst/matroska/matroska-mux.c: matroskamux: fix segment handling, so we actually use running time gst_matroska_mux_best_pad adjusts the buffer timestamp to running time using the segment stored in the pad's collect data. However, the event handler didn't pass the newsegment event on to collectpads' handler, so this segment was never updated at all. Re-fixes bug #432612. 2011-10-10 19:01:23 +0100 Sjoerd Simons * gst/rtp/gstrtpg722pay.c: gstrtpg722pay: Compensate for clockrate vs. samplerate difference The RTP clock-rate used for G722 is 8000, even though the samplerate is 16000. Compensate for this by pretending G722 has 8 bits per sample instead of the 4 bits as if it were a codec that ran at half the speed, but with twice the number of bits. Fixes #661376 2011-09-27 19:25:53 +0100 Sjoerd Simons * ext/jpeg/gstjpegdec.c: jpegdec: Implement upstream negotiation Add upstream negotiation for jpegdec. Fixes #660275 2011-10-10 19:02:58 +0100 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska-demux: don't leak audio codec_data buffer 2011-10-10 13:20:04 +0200 Stefan Sauer * tests/examples/cairo/Makefile.am: tests: add missing PLUGIN_ASE_LIBS to LDADD 2011-10-09 21:31:27 +0200 Mark Nauwelaerts * ext/speex/gstspeexenc.c: * ext/speex/gstspeexenc.h: speexenc: only push header buffers following initial events 2011-10-09 11:18:18 -0300 Thiago Santos * gst/isomp4/atomsrecovery.c: qtmux: Fix memory leak on atoms recovery function Remember to free the ftyp data after writing it to a file. Fixes #660969 2011-09-21 18:45:42 +0100 Vincent Penquerc'h * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: improve segment handling with non-zero starting timestamp ... as well as related items, such as seeking and position reporting. https://bugzilla.gnome.org/show_bug.cgi?id=659808 2011-09-29 18:41:53 +0400 Stas Sergeev * sys/v4l2/gstv4l2object.c: * sys/ximage/gstximagesrc.c: v4l2, ximagesrc: fix some printf format compiler warnings https://bugzilla.gnome.org/show_bug.cgi?id=660150 2011-09-30 12:42:22 -0300 Thiago Santos * tests/check/elements/qtmux.c: tests: qtmux: Refactor bitrate check test Refactor bitrate check test to accomodate multiple tests for bitrate 2011-09-30 13:02:31 -0300 Thiago Santos * gst/isomp4/atoms.c: qtmux: update esds atom under wave atom for aac bitrates AAC in mov format puts an ESDS atom inside of a WAVE atom in STSD atom, we need to update the bitrate on this ESDS. This patch fixes it. 2011-09-30 12:41:52 -0300 Thiago Santos * gst/isomp4/atoms.c: * gst/isomp4/fourcc.h: qtmux: Also update btrt atom When rewriting bitrates, also update the btrt atom under stsd 2011-09-30 10:55:53 -0300 Thiago Santos * tests/check/elements/qtmux.c: tests: qtmux: add tests for bitrate average calculation Adds tests to make sure qtmux/mp4mux sets average bitrate correctly 2011-09-28 11:41:49 -0300 Thiago Santos * gst/isomp4/atoms.c: * gst/isomp4/atoms.h: * gst/isomp4/gstqtmux.c: * gst/isomp4/gstqtmux.h: qtmux: Calculate average bitrate for streams Calculate and use average bitrate for streams when no bitrate tag was received 2011-09-28 10:41:14 -0300 Thiago Santos * gst/isomp4/gstqtmux.c: qtmux: Avoid a buffer metadata copy if possible If first_ts is 0 there is no need to subtract, so we might skip some copying to make the buffer metadata writable. 2011-09-29 23:21:46 +0100 Tim-Philipp Müller * ext/speex/gstspeexenc.c: speexenc: initialise variable before adding to it 2011-09-29 17:21:22 +0200 Mark Nauwelaerts * ext/speex/gstspeexdec.c: * ext/speex/gstspeexdec.h: speexdec: port to audiodecoder 2011-09-29 16:33:01 +0200 Mark Nauwelaerts * ext/speex/gstspeexenc.h: speexenc: clean up some unused remnants 2011-09-29 17:32:23 +0200 Mark Nauwelaerts * ext/speex/Makefile.am: * ext/speex/gstspeexenc.c: * ext/speex/gstspeexenc.h: speexenc: port to audioencoder 2011-09-28 16:09:58 +0200 Mark Nauwelaerts * ext/flac/Makefile.am: * ext/flac/gstflacenc.c: * ext/flac/gstflacenc.h: flacenc: port to audioencoder 2011-09-27 15:59:24 +0100 Vincent Penquerc'h * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-parse.c: matroskademux: ensure minimal alignment for audio/x-raw-* buffers Since matroskademux will attempt to push unaligned buffers, downstream might have trouble with those, especially if downstream uses ORC, such as audioconvert. Ensure we push buffers aligned to the basic type at least for those raw buffers. https://bugzilla.gnome.org/show_bug.cgi?id=659798 2011-09-28 00:10:09 +0300 Raimo Järvi * gst/goom2k1/goom_core.c: goom2k1: Fix compiler warnings on 64 bit mingw-w64 Fixes bug #660294. 2011-09-25 15:13:39 +0100 Tim-Philipp Müller * ext/soup/Makefile.am: * ext/soup/gstsoup.c: * ext/soup/gstsouphttpclientsink.c: * ext/soup/gstsouphttpclientsink.h: * ext/soup/gstsouphttpsink.c: * ext/soup/gstsouphttpsink.h: soup: rename souphttpsink to souphttpclientsink To avoid confusion, and because we might want a server sink at some point too. https://bugzilla.gnome.org/show_bug.cgi?id=659947 2011-09-23 16:39:46 +0100 Tim-Philipp Müller * ext/soup/gstsouphttpsink.c: * ext/soup/gstsouphttpsink.h: souphttpsink: don't create unused second sink pad object The base class will create the sink pad. 2011-09-23 15:36:36 +0200 Julien Isorce * gst/audioparsers/gstac3parse.c: ac3parse: correctly check for ac3/e-ac3 switch https://bugzilla.gnome.org/show_bug.cgi?id=659943 2011-09-20 13:38:53 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: improve downstream flow return feedback to upstream ... although basertpdepay does not really make it easy/possible to do so all the way. 2011-09-20 12:11:47 +0100 Vincent Penquerc'h * sys/ximage/gstximagesrc.c: * sys/ximage/gstximagesrc.h: ximagesrc: add xid and xname properties to allow capturing a particular window A particular window may be selected using the new xid (X-Window XID, eg a pointer) and xname (window title) properties. If both are specified, the XID is used in preference, falling back to xname if not found. Default (if none of xid and xname are specified, or if no such window is found) is to capture the root window. https://bugzilla.gnome.org/show_bug.cgi?id=546932 2011-08-02 17:39:44 +0100 Tim-Philipp Müller * tests/check/elements/qtmux.c: tests: add unit test to make sure encodebin picks mp4mux for variant=iso https://bugzilla.gnome.org/show_bug.cgi?id=651496 2011-09-19 12:15:11 +0200 Ha Nguyen * gst/rtpmanager/gstrtpbin.c: rtpbin: Fix a leaked clock for each buffering message Fixes bug #659237. 2011-09-19 12:11:32 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: * gst/isomp4/qtdemux_fourcc.h: qtdemux: parse embedded ID32 tags 2011-09-02 13:41:41 +0200 Mark Nauwelaerts * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsource.c: rtpsession: avoid source premature timing out Use slightly adjusted sender interval to determine sender timeout rather than our own sender side interval (which may have been forced small). 2011-08-25 12:40:52 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: avoid timing out source too quickly ... following a PAUSE/PLAY cycle, particularly applicable when operating with a short RTCP interval (possibly forced so server-side). 2011-08-24 14:37:52 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer/rtpbin: relax dropping rtcp packets ... to at least having it trigger a/v synchronization, possibly without using provided values which are still not considered sane (as previously dropped). 2011-08-24 14:34:23 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: some more reset when clearing pt map ... which in particular caters for some more reset following a possible rtsp PLAY. 2011-08-21 21:58:38 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: do not set elements to PLAYING when doing seek in PAUSED 2011-09-01 14:47:48 +0200 Mark Nauwelaerts * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: only reset skew on gap if input ts available 2011-08-18 14:12:21 +0200 Mark Nauwelaerts * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: check some more for possible rtp timestamp discontinuity ... when operating in non slave mode, and reset if detected. This should avoid some (large) bogus outgoing timestamp due to jumps in rtp time, as result of PAUSE/PLAY or seek or ... 2011-08-08 12:48:50 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: switch to rtp time based syncing when guessed appropriate 2011-08-08 12:15:20 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: alternative inter-stream syncing methods ... at least if not syncing to NPT time: * either sync using RTCP SR data (as currently) * only perform the above once using initial RTCP SR packets * discard RTCP and sync by equating provided stream's clock-base rtptime, as provided by jitterbuffer (typically obtained from RTP-Info in RTSP). 2011-08-08 12:11:24 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: also provide clock-base to sync signal 2011-08-08 12:09:41 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: allow configurable rtcp stream syncing interval ... rather than necessarily syncing at each RTCP SR. 2011-08-01 08:35:01 +0200 Mark Nauwelaerts * gst/rtpmanager/rtpsession.c: rtpsession: trigger reconsideration if rtcp interval set 2011-08-01 08:32:24 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: configure rtcp interval if provided ... in PLAY response. 2011-09-16 16:53:22 +0300 Lasse Laukkanen * gst/isomp4/gstqtmux.c: isomp4: Fix allowing zero duration tracks https://bugzilla.gnome.org/show_bug.cgi?id=637486 2011-09-05 10:11:18 +0100 Vincent Penquerc'h * gst/udp/gstudpnetutils.c: udpsrc: error out when no protocol is specified in the uri It is certainly better than to crash. https://bugzilla.gnome.org/show_bug.cgi?id=658178 2011-09-19 09:37:58 +0200 Vincent Penquerc'h * ext/speex/gstspeexenc.c: speexenc: do not use invalid buffer timestamps 2011-03-29 12:09:18 +0530 Arun Raghavan * ext/pulse/Makefile.am: * ext/pulse/plugin.c: * ext/pulse/pulseaudiosink.c: * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: * ext/pulse/pulseutil.h: pulse: New pulseaudiosink element to handle format changes This introduces a new bin which wraps around pulsesink and depending on the formats supported by the sink, plugs in/out a decodebin2 as required. This allows users to switch sinks on the stream and adapts accordingly (for example, you could watch a movie in passthrough mode on your receiver which supports AC3 decode, then plug out and switch to a non-digital profile to continue uninterrupted on analog output). The bin is required because doing the same with playbin2/playsink will require API changes that cannot be made in 0.10. With 0.11/1.0, we should be able to ask for upstream caps renegotiation to deal with all this. https://bugzilla.gnome.org/show_bug.cgi?id=657179 2011-09-16 15:03:23 +0200 Branko Subasic * gst/matroska/ebml-read.c: * gst/matroska/ebml-read.h: * gst/matroska/matroska-read-common.c: matroskademux: Avoid sending EOS when in paused state Changed the ebml reader's gst_ebml_peek_id_length() function so that it returns the actual reason for why the peek failed, instead of (almost) always returning GST_FLOW_UNEXPECTED. This prevents the pulling task from sending EOS when doing a flushing seek. 2011-09-15 15:53:47 +0100 Vincent Penquerc'h * gst/matroska/matroska-demux.c: matroskademux: fix stuttering A/V Someone got had by implicit promotion to unsigned in ops with a signed and an unsigned value. https://bugzilla.gnome.org/show_bug.cgi?id=659153 2011-09-14 16:37:12 +0100 Vincent Penquerc'h * gst/debugutils/gstnavseek.c: navseek: toggle pause/play on space bar A useful thing to have. https://bugzilla.gnome.org/show_bug.cgi?id=659065 2011-09-14 14:46:00 +0200 David Svensson Fors * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: configurable timestamp gap handling matroskademux performs segment tricks to skip gaps in streams, notably at start for non 0 based files. There may however be cases when full presentation (including intermediate gaps) is desired, so a property allows to configure as of which gap to act (or not at all). API: GstMatroskaDemux::max-gap-time Fixes #659009. 2011-09-12 09:21:47 -0300 Thiago Santos * tests/check/elements/flvmux.c: tests: flvmux: Fix flvmux's tests after fix for request pads handling Now that flvmux doesn't release its request pads on PAUSED->READY the test doesn't need to re-request them for every reuse test start. 2011-09-09 09:12:56 -0300 Thiago Santos * gst/isomp4/gstqtmux.c: qtmux: Fix ctts generation for streams that don't start at 0 timestamps Subtract the first timestamp of a stream from all input buffers to get 0-based timestamps for creating a sane ctts table. Without this patch the ctts could have larger values than needed, causing the playback to have a delay at startup. As the first timestamp is only found after a few buffers are queued (due to possible reordered buffers), once we find the first timestamp we subtract it from all buffers on the queue, from that point on, all buffers have their timestamps subtract when they are collected. https://bugzilla.gnome.org/show_bug.cgi?id=658659 2011-09-12 07:55:19 +0200 Alessandro Decina * gst/flv/gstflvmux.c: flvmux: don't release request pads going PAUSED->READY Don't release request pads but just reset them. This makes pipelines using flvmux reusable. 2011-09-09 12:35:50 +0100 Vincent Penquerc'h * gst/audioparsers/gstac3parse.c: ac3parse: use bsid 9 and 10 to control sample rate See http://matroska.org/technical/specs/codecid/index.html The spec is silent about this though... https://bugzilla.gnome.org/show_bug.cgi?id=658546 2011-09-07 14:13:03 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: ensure some initial state variable setup ... which might otherwise be skipped if the PLAY command is issued before the OPEN command had a chance to actually be acted upon. Fixes #657376. 2011-09-08 15:02:05 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: tweak gap handling ... so as to avoid buffers before and after gap to have identical running time. 2011-09-08 13:28:24 +0200 Guillaume Desmottes * sys/v4l2/gstv4l2object.c: v4l2: use GST_RESOURCE_ERROR_BUSY if v4l2_ioctl fails with EBUSY https://bugzilla.gnome.org/show_bug.cgi?id=658543 2011-09-07 08:54:17 -0300 Thiago Santos * gst/isomp4/gstqtmux.c: qtmux: remove one G_UNLIKELY for user property Using G_UNLIKELY on user properties isn't nice, specially when that is the default option. 2011-03-15 11:03:53 +0100 Andoni Morales Alastruey * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: handle GstForceKeyUnit event ... by starting a new cluster after forwarding event. Fixes #644154. 2011-09-07 14:27:36 +0200 Sebastian Dröge * tests/check/elements/cmmldec.c: * tests/check/elements/cmmlenc.c: cmml: Use complete cmml caps in the unit test 2011-09-07 14:26:01 +0200 Sebastian Dröge * tests/check/elements/qtmux.c: qtmux: Use complete MPEG caps in the unit test 2011-09-07 14:18:58 +0200 Stefan Sauer * docs/plugins/Makefile.am: docs: cleanup makefiles Remove commented out parts that we don't need. Remove "the wingo addition" - no so useful after all. Narrow down file-globs for plugin docs. 2011-08-29 14:12:22 +0200 Konstantin Miller * ext/soup/gstsouphttpsrc.c: souphttpsrc: Don't handle HTTP response 407 as error if proxy authentication data is available Fixes bug #657422. 2011-09-07 12:11:39 +0200 Sebastian Dröge * gst/audioparsers/gstac3parse.c: ac3parse: Add Converter to the classification because it can convert between different alignments This allows decodebin2 to let it negotiate properly. 2011-09-07 12:10:48 +0200 Sebastian Dröge * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstmpegaudioparse.c: audioparsers: Improve src template caps Remove the parsed/framed fields and add all fields to the template caps that always exist. 2011-09-06 15:59:49 +0200 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstaacparse.h: aacparse: parse codec_data to determine number of samples per frame Fixes #656734. 2011-09-06 21:24:46 +0200 Stefan Sauer * common: Automatic update of common submodule From a39eb83 to 11f0cd5 2011-09-06 15:40:32 +0200 Stefan Sauer * common: Automatic update of common submodule From 605cd9a to a39eb83 2011-09-06 15:05:37 +0200 Mark Nauwelaerts * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: make default duration check less sensitive Frame duration might vary for 1 usecond, in this case matroskamux decides to create BLOCKGROUP instead of SIMPLEBLOCK. Convert duration to timecodescale which is (typically) less precise, and then also allow the difference of 1/-1 to arrange for less sensitive check. Based on patch by Alexey Fisher Fixes #653080. 2011-09-06 13:18:40 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmp4gdepay.c: rtpmp4gdepay: improve bogus interleaved index compensating Patch by Fixes #654585. 2011-09-06 10:33:21 +0200 Sebastian Dröge * ext/soup/gstsouphttpsrc.c: souphttpsrc: Allow positive, non-1.0 segment rates Only negative rates are not supported. Fixes bug #658305. 2011-09-05 15:50:56 +0200 Mark Nauwelaerts * tests/check/elements/parser.c: tests: parsers: provide more real data when testing draining of garbage 2011-09-05 15:50:04 +0200 Mark Nauwelaerts * gst/audioparsers/gstamrparse.c: amrparse: fix and streamline valid frame checking ... to handle various combinations of sync or not, and sufficient data or not as might be expected. Fixes #650714. 2011-09-05 14:49:32 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: fragmented support; avoid adjustment for keyframe seek ... since all index data may not yet be available at that time. 2011-09-05 14:48:02 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: fragmented support; mark all audio track samples as keyframe 2011-09-05 14:46:29 +0200 Brian Li * gst/isomp4/qtdemux.c: qtdemux: fragmented support; properly init return variable value Fixes #655918. 2011-09-05 13:31:20 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: add gtk-doc for new short-header property 2011-09-05 13:18:39 +0200 Marc Leeman * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: allow sending short RTSP requests to a server Some encoders (Arecont) do not like the long OPTIONS sent at startup as sent by GStreamer, but do accept the short header as sent by Live555. This patch makes the extending the request optional by adding a property (short-header). Fixes #655805. API: GstRTSPSrc:short-header 2009-03-04 14:51:09 -0500 Olivier Crête * gst/rtp/gstrtph263ppay.c: rtph263ppay: Set H263-2000 if thats what the other side wants The static caps states this element supports H263-2000, but setcaps never sets it, so it was lie. See https://bugzilla.gnome.org/show_bug.cgi?id=577784 2011-08-30 19:02:51 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Initialise the last_keyframe_request variable 2011-08-31 16:04:24 +0200 Peter Korsgaard * gst/udp/gstmultiudpsink.c: multiudpsink: make add/remove/clear/get-stats action signals http://bugzilla.gnome.org/show_bug.cgi?id=657830 Signed-off-by: Peter Korsgaard 2011-08-30 13:33:49 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: * gst/isomp4/qtdemux.h: qtdemux: push mode; perform some extra checks prior to upstream seeking 2011-08-30 13:28:21 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: push mode; fix buffered streaming That is, in case where no seek is peformed to moov, but preceding limited mdat is buffered. 2011-08-29 15:13:56 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: avoid overflow wraparound in timestamp when adding durations Do some type juggling to avoid overflow, while still allowing for 'negative' durations (which would need a wraparound effect). 2011-08-25 23:37:47 +0100 Vincent Penquerc'h * sys/v4l2/v4l2src_calls.c: v4l2src: make this work more than once in a row We used to skip frame rate setup if the camera was already setup with the requested frame rate. This breaks some cameras though, causing them to not output data (several models of Thinkpad cameras have this problem at least). So, don't skip. https://bugzilla.gnome.org/show_bug.cgi?id=638300 2011-08-23 12:12:15 +0100 Vincent Penquerc'h * gst/audioparsers/gstaacparse.c: aacparse: only require two frames in a row when we do not have sync This avoids a single bit error dropping two frames unnecessarily. The two consecutive frames check is still required when we don't have sync. https://bugzilla.gnome.org/show_bug.cgi?id=657080 2011-08-23 21:41:15 +0530 Arun Raghavan * ext/pulse/pulsesink.c: pulsesink: Trivial indentation fix 2011-07-21 17:23:28 -0400 Monty Montgomery * ext/flac/gstflacdec.c: flacdec: Correct sample number rounding resulting in timestamp jitter flacdec converts the src timestamp to a sample number, uses that internally, then reconverts the sample number to a timestamp for the output buffer. Unfortunately, sample numbers can't be represented in an integer number of nanoseconds, and the conversion process was truncating rather than rounding, resulting in sample numbers and output timestamps that were often off by a full sample. This corrects the time->sample convesion 2011-08-20 14:48:20 -0700 David Schleef * gst/debugutils/breakmydata.c: breakmydata: element is not passthrough 2011-07-13 11:20:34 -0700 David Schleef * gst/multifile/gstmultifilesrc.c: multifilesrc: quiet debugging 2011-07-10 21:40:20 -0700 David Schleef * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: change field handling through methods This likely breaks stuff. The good: all of the methods now create field images aligned with input frames, without timestamp mangling. The bad: this touches a lot of code, much of which is hairy and in need of cleanup. However, at this point we can reasonably create a PSNR-based test. 2011-08-21 14:41:14 +0200 Alessandro Decina * gst/multifile/gstmultifilesink.c: multifilesink: reset ->streamheaders to NULL on _stop Fixes invalid memory access reusing multifilesink 2011-08-18 13:37:39 +0200 David Henningsson * ext/pulse/pulsesink.c: pulsesink: Allow writes in bigger chunks There's no use in splitting the incoming data down to the segsize limit - by writing as much as possible in one chunk, we increase performance and avoid PulseAudio unnecessary rewinds. Signed-off-by: David Henningsson 2011-08-08 22:14:28 +0100 Vincent Penquerc'h * gst/matroska/matroska-demux.c: matroskademux: ensure no-more-pads is always emitted In particular, do so even if failing to read while prerolling, such as when reading from a partial file (eg, while it is being downloaded). This fixes a wedge in playbin2. https://bugzilla.gnome.org/show_bug.cgi?id=651965 2011-08-16 17:27:13 +0100 Vincent Penquerc'h * ext/flac/gstflacdec.c: flacdec: avoid timestamp/offset tracking going out of sync The libFLAC API is callback based, and we must only call it to output data when we know we have enough input data. For this reason, a single processing step is done when receiving a buffer. However, if there were metadata buffers still pending, a step intended for the first audio frame might end up writing that leftover metadata. Since a single step is done per buffer, this will cause every buffer to be written one step late. This would add some latency (a bufferfull's worth), possibly lose a buffer when seeking or the like, and also cause timestamp and offset to be applied to the wrong buffer, as updates to the "current" segment last_stop (from incoming buffer timestamp) will be applied to an output buffer originating from the previous incoming buffer. This fixes the issue by ensuring that, upon receiving the first audio frame, processing is done till all metadata is processed, so the next "single step" done will be for the audio frame. After this, we should keep to 1 input buffer -> 1 output buffer and so avoid getting out of sync. https://bugzilla.gnome.org/show_bug.cgi?id=650960 2011-08-16 15:32:07 +0100 Vincent Penquerc'h * ext/flac/gstflacdec.c: flacdec: bail on reserved value Now that we look at the right bits, we can test against the reserved value as we do for other fields. https://bugzilla.gnome.org/show_bug.cgi?id=650960 2011-08-16 15:27:43 +0100 Vincent Penquerc'h * ext/flac/gstflacdec.c: flacdec: fix bit twiddling Right shifting a 8 bit value by 8 bits is twice too much to get the high 4 bits. https://bugzilla.gnome.org/show_bug.cgi?id=650960 2011-08-16 15:22:46 +0100 Vincent Penquerc'h * ext/flac/gstflacdec.c: flacdec: warn if we see a variable block size where unsupported https://bugzilla.gnome.org/show_bug.cgi?id=650960 2011-08-16 18:25:29 +0100 Vincent Penquerc'h * gst/spectrum/gstspectrum.c: spectrum: avoid crashing by resetting the correct number of channels https://bugzilla.gnome.org/show_bug.cgi?id=656606 2011-08-16 13:16:22 +0100 Vincent Penquerc'h * gst/audioparsers/gstflacparse.c: flacparse: fix off by one in frame size check Yes, I was tracking another bug and the small test file I generated to test with improbably just happened to trigger this, with a second and last frame of 1615 bytes. https://bugzilla.gnome.org/show_bug.cgi?id=656649 2011-08-14 20:46:01 +0100 Tim-Philipp Müller * gst/id3demux/id3v2.3.0.html: * gst/id3demux/id3v2.4.0-frames.txt: * gst/id3demux/id3v2.4.0-structure.txt: id3demux: remove specs from git as well now that parsing code is in -base 2011-07-14 15:42:36 +0200 Mark Nauwelaerts * configure.ac: * gst/id3demux/Makefile.am: * gst/id3demux/gstid3demux.c: * gst/id3demux/id3tags.c: * gst/id3demux/id3tags.h: * gst/id3demux/id3v2frames.c: id3demux: use -base provided id3 tag parsing https://bugzilla.gnome.org/show_bug.cgi?id=654388 2011-08-13 16:51:22 +0100 Tim-Philipp Müller * ext/jack/gstjackaudiosrc.c: jackaudiosrc: fix error message code And also post 'not found' error if jackd is not even installed. 2011-08-12 16:32:58 +0200 Stefan Kost * gst/isomp4/qtdemux.c: qtdemux: initialize bitrate variable and reset for each loop Don't check eventually unset variable and don't accidentially use values from last cycle. 2011-08-09 11:28:17 +0200 Edward Hervey * gst/rtsp/gstrtspsrc.c: rtspsrc: Properly error out if SDP contains no streams Also fixes unitialized variable error on macosx. 2011-08-09 09:05:31 +0100 Vincent Penquerc'h * sys/ximage/gstximagesrc.c: ximagesrc: clear flags on buffer reuse This will ensure a logically new buffer does not keep flags from a previous use of that buffer (eg, DISCONT would be set on the first buffer, and mistakenly kept when reused). https://bugzilla.gnome.org/show_bug.cgi?id=653709 2011-08-08 10:54:26 +0100 Vincent Penquerc'h * sys/v4l2/gstv4l2object.c: v4l2: take care not to change the current format where appropriate Some drivers are buggy are will change the current format when processing VIDIOC_TRY_FMT. Save and restore the current format to ensure the format is kept unchanged. https://bugzilla.gnome.org/show_bug.cgi?id=649067 2011-08-07 12:23:26 +0200 Sjoerd Simons * sys/v4l2/v4l2src_calls.c: v4l2src: Use fraction compare util function. Use the fraction compare utility to compare function, not the handcrafted one. The handcrafted one is buggy as it doesn't take into account rounding error. For example comparing a framerate of 20/1 on a camera configured as 30/1 fps would yield true: 1 == (1 * 20)/30 and not re-configure the camera. Fixes #656104 2011-08-03 22:50:05 +1000 Jan Schmidt * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: * gst/matroska/matroska.c: matroska: Register new debug category Register the matroskareadcommon debug category when the plugin is loaded to avoid assertion output when debug is turned on. 2011-07-29 13:03:55 +0200 Philippe Normand * gst/isomp4/qtdemux.c: qtdemux: soften assertion check on stream size https://bugzilla.gnome.org/show_bug.cgi?id=655570 2011-08-03 10:09:42 +0200 Robert Krakora * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: Add support for H.264 payload in MJPEG container See http://www.quickcamteam.net/uvc-h264/USB_Video_Payload_H.264_0.87.pdf Fixes bug #655530. 2011-08-02 22:05:08 -0400 Tristan Matthews * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosink.h: jackaudiosink: Don't call g_alloca() in process_cb g_alloca() is not RT-safe, so instead we should allocate the memory needed in advance. Fixes #655866 2011-08-02 23:42:58 +0100 Tim-Philipp Müller * gst/multipart/multipartdemux.c: * sys/v4l2/gstv4l2object.c: docs: fix two more Since: tags 2011-07-31 04:19:00 +0300 Mart Raudsepp * gst/deinterlace/gstdeinterlace.c: deinterlace: Fix Since tags for fieldanalysis related new properties commit c1b100cf9c is after 0.10.29 and 0.10.30 was a branched release. So fix Since tags from 0.10.29 to 0.10.31 for the new properties. 2011-07-29 13:05:42 +0100 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulsesink: fix variable-set-but-not-used compiler warning with older pulse versions 2011-07-29 12:07:24 +0200 Mark Nauwelaerts * gst/rtpmanager/rtpsession.c: rtpsession: properly init rtcp_min_interval 2011-03-09 11:04:36 +0530 Arun Raghavan * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: * ext/pulse/pulseutil.c: pulsesink: Add support for compressed formats This adds support for various compressed formats (AC3, E-AC3, DTS and MP3) payloaded in IEC 61937 format (used for transmission over S/PDIF, HDMI and Bluetooth). The acceptcaps() function allows bins to probe for what formats the sink being connected to support. This only works after the element is set to at least READY. If the underlying sink changes and the format we are streaming is not available, we emit a message that will allow upstream elements/bins to block and renegotiate a new format. 2011-03-01 15:34:46 +0530 Arun Raghavan * configure.ac: * ext/pulse/pulsesink.c: * ext/pulse/pulseutil.c: * ext/pulse/pulseutil.h: pulsesink: Use the extended stream API if available This uses the new extended API for creating streams. This will allow us to support compressed formats natively in pulsesink as well. 2011-07-29 00:07:52 +0530 Arun Raghavan * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: pulsesrc: Add a source-output-index property This exposes the source output index of the record stream that we open so that clients can use this with the introspection if they want (to move the stream, for example). 2011-07-28 14:44:57 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: keep a ref on the src pad while using it Prevent a possible race if clear_ssrc() is called between getting the pad and doing the push. Based on patch by https://bugzilla.gnome.org/show_bug.cgi?id=650916 2011-05-24 11:29:57 +0300 Olivier Crête * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtpmanager/gstrtpssrcdemux.h: rtpssrcdemux: Make the pads lock recursive and hold it across the signal emit We need to keep the lock held because we don't want a push before the "new-ssrc-pad" handler has completed. But we may want to push an event from inside that handler, hence the recursive mutex. https://bugzilla.gnome.org/show_bug.cgi?id=650916 2011-05-24 11:17:25 +0300 Olivier Crête * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: Use PADs lock https://bugzilla.gnome.org/show_bug.cgi?id=650916 2011-07-27 18:15:20 +0100 Sjoerd Simons * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: rtph264depay: Cope with FU-A E bit not being set Some h264 payloaders are unfortunately buggy and don't correctly set the E bit in FU-A NAL when they have ended. Work around this by assuming such a fragmentation unit has ended when there was no packet loss and a new NAL is started 2011-04-12 17:01:47 +0530 Arun Raghavan * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstac3parse.h: ac3parse: Support switching alignment on-the-fly This allows switching of alignment for E-AC3 streams at run-time. This is requested by downstream elements via a custom event. https://bugzilla.gnome.org/show_bug.cgi?id=650313 2011-04-09 12:26:56 +0530 Arun Raghavan * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstac3parse.h: * tests/check/elements/ac3parse.c: ac3parse: Add support for IEC 61937 alignment When pushing out buffers over S/PDIF or HDMI, IEC 61937 payloading requires each buffer to contain 6 blocks from each substream. This adds code to collect all the frames needed to meet this requirement before pushing out a buffer. https://bugzilla.gnome.org/show_bug.cgi?id=650313 2011-06-08 15:57:37 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Always send application requested feedback in immediate mode Send as many application requested feedback messages in immediate mode, even if they have already been sent. https://bugzilla.gnome.org/show_bug.cgi?id=654583 2011-06-08 14:48:01 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Don't let the computed RTP bandwidth fall too low If it falls too low, the computed RTCP bandwidth will be near zero and the RTCP thread will be stopped. https://bugzilla.gnome.org/show_bug.cgi?id=654583 2011-04-25 16:13:38 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Wait longer to timeout SSRC collision Using the current RTCP interval to timeout SSRC collision can lead to collisions being timed out immediately if a BYE packet is sent because it is sent immediately, so the interval is 0. This is not what we want. So just set a static 10 times the default RTCP interval, it should be enough https://bugzilla.gnome.org/show_bug.cgi?id=648642 2011-07-19 13:38:01 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: set SOURCE flag at init time Fixes #654816. 2011-07-18 16:46:27 -0400 Olivier Crête * gst/rtp/gstrtph264depay.c: rtph264depay: Complete merged AU on marker bit The marker bit on a RTP packet means the AU has been completed, so push it out immediately to reduce the latency. https://bugzilla.gnome.org/show_bug.cgi?id=654850 2011-07-18 20:27:38 -0400 Olivier Crête * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: Only set the marker bit on the last NALU of a multi-NALU access unit An access unit could contain multiple NAL units, in that case, only the last RTP packet of the last NALU should have its marker bit set. https://bugzilla.gnome.org/show_bug.cgi?id=654850 2011-07-20 08:52:58 +0200 Alessandro Decina * gst/multipart/multipartmux.c: multipart: fix compiler warning 2011-07-19 12:05:51 +0200 Mark Nauwelaerts * gst/auparse/gstauparse.c: auparse: avoid hanging on invalid short input ... as in such case there is no srcpad yet on which to forward EOS. 2011-07-18 15:13:33 -0300 Thiago Santos * ext/pulse/pulsesrc.c: pulsesrc: Fix default value leaking Remember to free the default value of client name, avoiding a leak 2011-07-18 14:24:48 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: reset upon FLUSH_STOP ... which is particularly needed when merging NAL units, where not resetting would lead to output of an older (pre-flush) AU (with unintended timestamp). 2011-07-18 14:30:51 +0200 Mark Nauwelaerts * gst/multifile/gstmultifilesink.c: multifilesink: do not use g_slist_free_full ... as that is only in GLib 2.28, which is not yet required at this time. 2011-07-18 09:38:26 +0200 Alessandro Decina * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: * tests/check/elements/multifile.c: multifilesink: add max-files property Add max-files property to limit the number of files saved on disk. API: multifilesink::max-files 2011-07-17 23:36:55 +0200 Alessandro Decina * gst/multifile/gstmultifilesink.c: multifilesink: refactor file opening and closing code 2011-07-16 19:38:51 +0200 Alexey Fisher * gst/matroska/matroska-demux.c: matroskademux: fix pixel-aspect-ratio if header has only one display variable Current matroska demux calculates the pixel aspect ratio only if both DisplayHeight and DisplayWidth are set, but it is legal to use only one variable if the other is equal to PixelWidth or PixelHeight, at least the mkclean utility is doing that. So this makse mkcleaned files play correctly. https://bugzilla.gnome.org/show_bug.cgi?id=654744 2011-07-16 23:47:50 +0100 Antoine Jacoutot * gst/goom/plugin_info.c: goom: fix build on PPC on openbsd A missing sys/param.h include results in: /usr/include/sys/proc.h:64: error: 'MAXLOGNAME' undeclared here (not in a function) /usr/include/sys/proc.h:285: error: 'MAXCOMLEN' undeclared here (not in a function) when compiling goom on openbsd/ppc. We can just remove the two sys/ includes here, they are not needed for anything. https://bugzilla.gnome.org/show_bug.cgi?id=654749 2011-07-14 20:10:02 -0400 Olivier Crête * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: rtppcmApay/depay: Static clock rates on static payloads, dynamic on dynamic Partially reverts 397dc60b 2011-03-04 15:41:22 -0500 Olivier Crête * gst/rtp/Makefile.am: * gst/rtp/gstrtph264pay.c: rtph264pay: Implement getcaps Convert profile-level-id from RTP caps into video/x-h264 style caps (with profile and level) 2011-07-12 15:04:38 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: fix seeking regression ... introduced when shuffling around code for the async implementation by setting state of source (and udp sources) in _play before downstream flushing is undone. 2011-07-11 15:23:41 +0300 René Stadler * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstac3parse.h: ac3parse: fix buffer duration on blocks-per-frame change The gst_base_parse_set_frame_rate call was predicated on a change to sample rate, duration or profile. However, the block count per frame can also change between packets, which would result in incorrect buffer durations. 2011-07-09 19:23:41 -0700 David Schleef * gst/multifile/gstmultifilesrc.c: * gst/multifile/gstmultifilesrc.h: multifilesrc: Improve looping Add start-index and stop-index properties. 2011-06-16 13:57:03 +0100 Jonny Lamb * gst/multifile/gstmultifilesrc.c: * gst/multifile/gstmultifilesrc.h: multifile: add loop property to multifilesrc Fixes: #652727 Signed-off-by: Jonny Lamb Signed-off-by: David Schleef 2009-11-20 10:07:43 +0100 Philip Jägenstedt * sys/directsound/gstdirectsoundsink.c: directsoundsink: 16-bit audio is signed, 8-bit is unsigned. Pretending to handle 8-bit signed causes distorted audio when actually given such audio, which you will get if passing 8-bit unsigned through audioconvert ! audioresample, as audioresample only handles 8-bit signed. Fixes #605834. Signed-off-by: David Schleef 2011-07-07 18:27:36 +0200 Alexey Fisher * gst/matroska/matroska-demux.c: matroskademux: handle blocks with duration=0 Some video frames, for example alt-ref frame in VP8, will be never displayed. This is why it has duration=0. This patch allow to use this duration. Bug: 654175 Signed-off-by: Alexey Fisher 2011-07-06 17:18:05 -0700 David Schleef * gst/isomp4/gstqtmux.c: * gst/isomp4/gstqtmuxmap.c: qtmux: Add direct dirac mapping 2011-06-29 20:59:26 +0300 René Stadler * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: prevent race condition causing ref leak Since commit 8bfd80, gst_pulseringbuffer_stop doesn't wait for the deferred call to be run before returning. This causes a race when READY->NULL is executed shortly after, which stops the mainloop. This leaks the element reference which is passed as userdata for the callback (introduced in commit 7cf996, bug #614765). The correct fix is to wait in READY->NULL for all outstanding calls to be fired (since libpulse doesn't provide a DestroyNotify for the userdata). We get rid of the reference passing from 7cf996 altogether, since finalization from the callback would anyways lead to a deadlock. Re-fixes bug #614765. 2011-07-04 08:58:14 +0300 René Stadler * ext/pulse/pulsesink.c: pulsesink: small cleanup of copy-paste code 2011-06-29 19:50:42 +0300 René Stadler * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: remove unused member variable and misleading log message Wim changed it in commit 8bfd80 so that pa_defer_ran is not read anywhere. The log message used to annotate a mainloop_wait call which is gone. 2011-07-04 12:58:38 -0700 David Schleef * gst/goom/gstgoom.c: goom: Don't answer lantency queries before negotiation 2011-07-04 14:30:09 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: avoid crashing on invalid input without components 2011-07-04 11:25:28 +0200 Mark Nauwelaerts * gst/flv/gstflvmux.c: flvmux: pass along segment info to collectpads ... so it can track this and be subsequently used to determine running time etc. 2011-07-04 11:24:23 +0200 Mark Nauwelaerts * gst/flv/gstflvdemux.c: flvdemux: indicate raw format in aac caps 2011-07-03 19:51:32 -0700 David Schleef * ext/pulse/plugin.c: pulse: Increase ranks to PRIMARY + 10 So that pulsesrc/pulsesink get chosen over other possible PRIMARY src/sinks by autoaudiosink. Presumably, if pulse is available, it is always preferred over another src/sink. Fixes: #647540. 2011-06-30 18:47:48 -0700 David Schleef * gst/multipart/multipartmux.c: multipartmux: Add \r\n to tail of pushed buffers Clients such as Firefox require the \r\n after the payload. 2011-06-16 14:52:51 +0200 Branko Subasic * gst/matroska/ebml-read.c: * gst/matroska/matroska-demux.c: matroskademux: avoid looping when searching for clusters Fixes some bugs that results in the demuxer looping when seaching for clusters in non-finalized files. https://bugzilla.gnome.org/show_bug.cgi?id=652195 2011-06-10 18:54:48 +0530 Debarshi Ray * gst/matroska/matroska-parse.c: matroskaparse: fix reference counting of parse->streamheader https://bugzilla.gnome.org/show_bug.cgi?id=652286 Signed-off-by: David Schleef 2011-06-29 14:39:52 -0700 David Schleef * ext/jpeg/gstjpegenc.c: jpegenc: Don't round up size of encoded buffers For some reason, in code dating to 2001, encoded jpeg buffers were rounded up to multiples of 4 bytes. With the added bonus that the extra bytes are unwritten, causing valgrind issues. Oops. I can't think of any reason why JPEG buffers need to be multiples of 4 bytes, so I removed the padding. There might be some code somewhere that depends on this behavior, so if this needs to be reverted, please fix the valgrind issues. 2011-06-29 12:05:04 +0200 Mark Nauwelaerts * gst/isomp4/gstqtmux.c: qtmux: free date tag 2011-06-28 12:26:37 +0200 Jonas Larsson * gst/audioparsers/gstaacparse.c: aacparse: not so greedy minimum frame size Fixes #653559. 2011-06-25 11:39:23 -0700 David Schleef * configure.ac: configure: remove non-pkg-config check for shout Fixes: 653327 2011-06-20 18:49:57 +0200 Andoni Morales Alastruey * ext/raw1394/gst1394clock.c: dv1394src: make the internal clock thread safe Fixes: #653091. 2011-06-24 11:54:29 +0200 Miguel Angel Cabrera Moya * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: return correct type when assertion fails 2011-06-23 11:28:27 -0700 David Schleef * common: Automatic update of common submodule From 69b981f to 605cd9a 2011-02-02 16:18:54 +0530 Arun Raghavan * configure.ac: * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: * ext/pulse/pulseutil.c: * ext/pulse/pulseutil.h: pulse: Drop support for PA versions before 0.9.16 This drops support fof PulseAudio versions prior to 0.9.16, which was released about 1.5 years ago. Testing with very old versions is not feasible and we don't want to maintain 2 independent code-paths. 2011-06-21 15:15:06 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmp4adepay.c: rtpmp4adepay: fix output buffer timestamps in case of multiple frames 2011-06-20 16:47:36 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: The signal has 5 arguments, not 4 2011-06-18 13:43:02 +0100 Tim-Philipp Müller Bump git version after unplanned 0.10.30 release Merge branch '0.10.30' Conflicts: configure.ac docs/plugins/inspect/plugin-1394.xml docs/plugins/inspect/plugin-aasink.xml docs/plugins/inspect/plugin-alaw.xml docs/plugins/inspect/plugin-alpha.xml docs/plugins/inspect/plugin-alphacolor.xml docs/plugins/inspect/plugin-annodex.xml docs/plugins/inspect/plugin-apetag.xml docs/plugins/inspect/plugin-audiofx.xml docs/plugins/inspect/plugin-audioparsers.xml docs/plugins/inspect/plugin-auparse.xml docs/plugins/inspect/plugin-autodetect.xml docs/plugins/inspect/plugin-avi.xml docs/plugins/inspect/plugin-cacasink.xml docs/plugins/inspect/plugin-cairo.xml docs/plugins/inspect/plugin-cutter.xml docs/plugins/inspect/plugin-debug.xml docs/plugins/inspect/plugin-deinterlace.xml docs/plugins/inspect/plugin-dv.xml docs/plugins/inspect/plugin-efence.xml docs/plugins/inspect/plugin-effectv.xml docs/plugins/inspect/plugin-equalizer.xml docs/plugins/inspect/plugin-esdsink.xml docs/plugins/inspect/plugin-flac.xml docs/plugins/inspect/plugin-flv.xml docs/plugins/inspect/plugin-flxdec.xml docs/plugins/inspect/plugin-gconfelements.xml docs/plugins/inspect/plugin-gdkpixbuf.xml docs/plugins/inspect/plugin-goom.xml docs/plugins/inspect/plugin-goom2k1.xml docs/plugins/inspect/plugin-gstrtpmanager.xml docs/plugins/inspect/plugin-halelements.xml docs/plugins/inspect/plugin-icydemux.xml docs/plugins/inspect/plugin-id3demux.xml docs/plugins/inspect/plugin-imagefreeze.xml docs/plugins/inspect/plugin-interleave.xml docs/plugins/inspect/plugin-isomp4.xml docs/plugins/inspect/plugin-jack.xml docs/plugins/inspect/plugin-jpeg.xml docs/plugins/inspect/plugin-level.xml docs/plugins/inspect/plugin-matroska.xml docs/plugins/inspect/plugin-mulaw.xml docs/plugins/inspect/plugin-multifile.xml docs/plugins/inspect/plugin-multipart.xml docs/plugins/inspect/plugin-navigationtest.xml docs/plugins/inspect/plugin-oss4.xml docs/plugins/inspect/plugin-ossaudio.xml docs/plugins/inspect/plugin-png.xml docs/plugins/inspect/plugin-pulseaudio.xml docs/plugins/inspect/plugin-replaygain.xml docs/plugins/inspect/plugin-rtp.xml docs/plugins/inspect/plugin-rtsp.xml docs/plugins/inspect/plugin-shapewipe.xml docs/plugins/inspect/plugin-shout2send.xml docs/plugins/inspect/plugin-smpte.xml docs/plugins/inspect/plugin-soup.xml docs/plugins/inspect/plugin-spectrum.xml docs/plugins/inspect/plugin-speex.xml docs/plugins/inspect/plugin-taglib.xml docs/plugins/inspect/plugin-udp.xml docs/plugins/inspect/plugin-video4linux2.xml docs/plugins/inspect/plugin-videobox.xml docs/plugins/inspect/plugin-videocrop.xml docs/plugins/inspect/plugin-videofilter.xml docs/plugins/inspect/plugin-videomixer.xml docs/plugins/inspect/plugin-wavenc.xml docs/plugins/inspect/plugin-wavpack.xml docs/plugins/inspect/plugin-wavparse.xml docs/plugins/inspect/plugin-ximagesrc.xml docs/plugins/inspect/plugin-y4menc.xml win32/common/config.h 2011-06-17 10:37:33 +0100 Tim-Philipp Müller * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosink.h: sunaudio: fix typo in comment 2011-06-17 03:07:09 +0300 Stefan Kost * gst/audiofx/audioecho.c: audioecho: fix param flags If the parameter cannot be changed in paused&playing, it is not controlable. Set the appropriate mutability flag instead. === release 0.10.30 === 2011-06-15 23:57:34 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-isomp4.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.30 This is an ad-hoc release that is almost identical to 0.10.29: * work around GLib atomic ops API change * better handling of malformed buffers in RTP depayloders * some minor compilation fixes 2011-06-08 18:33:10 +0300 Raimo Järvi * gst/udp/gstudpnetutils.h: udp: Fix compiler warning on mingw-w64 Fixes: #652144. gstudpnetutils.h:32:0: error: "WINVER" redefined /usr/i686-w64-mingw32/sys-root/mingw/include/_mingw.h:231:0: note: this is the location of the previous definition 2011-06-04 13:49:52 -0700 David Schleef * gst/interleave/interleave.c: interleave: Work around changes in g_atomic API See #651514 for details. 2011-05-18 12:36:40 +0200 Jose Antonio Santos Cadenas * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpg722depay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtpspeexdepay.c: rtp: Fix segmentation fault processing payload buffers This commit checks if the value returned by gst_rtp_buffer_get_payload_buffer and gst_rtp_buffer_get_payload_subbuffer is NULL before using it. 2011-05-16 09:04:31 +0200 Pino Toscano * ext/pulse/pulseutil.c: pulse: Define PATH_MAX if it isn't defined GNU Hurd for example doesn't define it. 2011-04-29 08:55:19 +0200 Sebastian Dröge * gst/wavenc/gstwavenc.c: wavenc: Allow setcaps to be called after a format was negotiated if it's compatible Otherwise wavenc will fail if upstream decides to set equivalent caps or caps with additional information later. Thanks to Alexander Schremmer for finding this bug. 2011-06-09 21:06:28 +0300 Stefan Kost * gst/matroska/matroska-read-common.c: matroska: add missing stdio include for sscanf 2011-06-13 17:05:19 +0200 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstmpegaudioparse.c: audioparsers: not so greedy minimum frame size ... which will be determined by parsing anyway, and avoids introducing redundant additional latency. 2011-06-08 18:33:10 +0300 Raimo Järvi * gst/udp/gstudpnetutils.h: udp: Fix compiler warning on mingw-w64 Fixes: #652144. gstudpnetutils.h:32:0: error: "WINVER" redefined /usr/i686-w64-mingw32/sys-root/mingw/include/_mingw.h:231:0: note: this is the location of the previous definition 2011-06-06 18:21:04 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_chapters https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-06 14:47:27 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_attachments https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-06 12:43:14 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_attached_file https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-05 22:45:55 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_info https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-05 10:15:23 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_metadata https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-05 09:54:42 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_metadata_id_tag https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-05 02:24:41 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_metadata_id_simple_tag https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-06-06 12:42:53 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: reset state tracking variable when appropriate ... so we don't end up interrupting an operation that should not be interrupted based on the indication of a previous interruptable operation. 2011-06-04 13:49:52 -0700 David Schleef * gst/interleave/interleave.c: interleave: Work around changes in g_atomic API See #651514 for details. 2011-06-04 13:43:00 -0700 David Schleef * ext/soup/gstsouphttpsink.c: * ext/soup/gstsouphttpsink.h: souphttpsink: code cleanup 2011-06-05 02:00:08 +0530 Debarshi Ray * gst/matroska/matroska-parse.c: matroskaparse: Use ARTIST tag instead of AUTHOR for GST_TAG_ARTIST AUTHOR only existed in an old version of the spec and ARTIST is the new replacement for this. We are still reading both to still be compatible with old files. Fixes bug #644875. 2011-06-02 13:38:30 +0200 Sebastian Dröge * ext/dv/gstdvdemux.c: dvdemux: First query the peer duration in the requested format before converting to BYTES Fixes usage of dvdemux after another demuxer, e.g. mxfdemux. Fixes bug #650503. 2011-06-02 10:41:52 +0200 Sebastian Dröge * ext/soup/gstsouphttpsink.c: souphttpsink: Fix refcounting of the "session" property Properties should never take ownership of the values passed to them. 2011-06-01 17:04:27 -0700 David Schleef * gst/matroska/matroska-mux.c: matroskamux: For streaming files, push tags first 2011-05-24 14:52:01 -0700 David Schleef * ext/soup/Makefile.am: * ext/soup/gstsoup.c: * ext/soup/gstsouphttpsink.c: * ext/soup/gstsouphttpsink.h: * ext/soup/gstsouphttpsrc.c: soup: Add souphttpsink 2011-06-01 10:19:31 +0200 Thijs Vermeir * gst/udp/gstudpsrc.c: udpsrc: allow skip-first-bytes of full buffer size 2011-05-30 18:31:50 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_parse_header https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-30 12:09:31 +0200 Antonio Frediani * gst/isomp4/gstqtmux.c: qtmux: Use GST_TAG_IMAGE for coverart too Fixes bug #638107. 2011-05-30 10:40:08 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_get_seek_track - gst_matroska_{demux,parse}_reset_streams https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-28 22:04:34 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska{demux,parse}_found_global_tag https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-28 10:59:09 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_index_seek_find - gst_matroska{demux,parse}_do_index_seek https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-27 23:15:23 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_tracknumber_unique https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-27 20:28:19 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_decode_data https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-27 19:30:48 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_get_length https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-27 09:17:46 +0200 Sebastian Dröge * gst/avi/gstavimux.c: avimux: Revert 1a90a6c4 and drop Dirac support again It does not work at all (A/V sync issues), is not very useful, other containers work much better with Dirac and Dirac in AVI is not supported by other software. Fixes bug #541215. 2011-05-26 23:35:52 +0530 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_encoding_cmp - gst_matroska_{demux,parse}_read_track_encodings https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_peek_id_length_pull - gst_matroska_{demux,parse}_peek_id_length_push https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_peek_adapter https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-26 12:48:36 +0200 Sebastian Dröge * sys/ximage/ximageutil.c: xvimagesink: Fallback to non-XShm mode if allocating the XShm image failed Fixes bug #630456. 2011-05-26 12:22:52 +0200 Marc Leeman * gst/rtp/gstrtpmp4vpay.c: rtpmp4vpay: Deprecated send-config property and replace by config-interval Fixes bug #622412. 2010-06-23 11:12:00 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: matroskademux: UTF-8 subtitles may have markup Fixes #616936. 2011-01-23 15:56:49 +0000 Vincent Penquerc'h * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttextoverlay.h: cairotextoverlay: forward new segment events from the sink to the source Not doing so will cause buffers to be received by downstream without a time base set. We use the same method avimux uses to get access to the event when collectpads got the sink event function. https://bugzilla.gnome.org/show_bug.cgi?id=640323 2011-01-24 11:11:48 +0000 Vincent Penquerc'h * ext/cairo/gsttextoverlay.c: textoverlay: forward source events to sinks Events are passed to the video sink, and to the text sink if it is linked. This will allow seeking, for instance. https://bugzilla.gnome.org/show_bug.cgi?id=586450 2011-05-25 21:12:12 +0200 David Hoyt * gst/multipart/multipartdemux.c: * gst/multipart/multipartdemux.h: multipartdemux: Add property to assume a single stream and emit no-more-pads Fixes bug #616686. 2011-05-25 14:50:26 +0200 Miguel Angel Cabrera Moya * gst/rtsp/gstrtspsrc.c: rtspsrc: uniform unknown message handling Do the same processing in all the cases when an unknown message is received. That is, give a warning. https://bugzilla.gnome.org/show_bug.cgi?id=651059 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_peek_pull https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following function to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_peek_bytes https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_{demux,parse}_encoding_order_unique - gst_matroska_{demux,parse}_read_track_encoding https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-24 13:12:19 +0200 Mark Nauwelaerts * gst/rtp/gstrtppcmudepay.c: pcmudepay: allow variable sample rate 2011-05-24 13:11:54 +0200 Mark Nauwelaerts * gst/rtp/gstrtppcmadepay.c: pcmadepay: allow variable sample rate 2010-04-04 06:43:41 -0500 Rob Clark * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/v4l2_calls.c: v4l2: add norm property Based on a patch by Guennadi Liakhovetski. v2: updates because I forgot to add GstTuner interface to v4l2sink v3: update to add all possible values to norm enum 2011-05-23 20:46:04 +0300 Debarshi Ray * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: fixed copyright headers https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Move the following functions to matroska-read-common.[ch] from matroska-demux.c and matroska-parse.c: - gst_matroska_decode_content_encodings - gst_matroska_decompress_data https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 18:48:57 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.h: matroska: move GstMatroska{Demux,Parse}::state to GstMatroskaReadCommon https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-24 09:48:56 +0200 Jonas Larsson * gst/isomp4/qtdemux.c: qtdemux: Fix buffer leak with corrupted files Fixes bug #650912. 2011-05-23 02:46:38 -0700 Miguel Angel Cabrera Moya * gst/deinterlace/gstdeinterlace.c: deinterlace: fix parameter type in trace https://bugzilla.gnome.org/show_bug.cgi?id=650937 2011-05-23 18:06:44 +0300 Debarshi Ray * gst/matroska/Makefile.am: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska-read-common.c: * gst/matroska/matroska-read-common.h: matroska: refactor code common to matroskademux and matroskaparse Replace the following functions with their gst_matroska_read_common_* counterparts: - gst_matroska_{demux,parse}_parse_index - gst_matroska_{demux,parse}_parse_skip - gst_matroska_{demux,parse}_stream_from_num Introduce GstMatroskaReadCommon to contain those members of GstMatroskaDemux and GstMatroskaParse that were used by the above functions. https://bugzilla.gnome.org/show_bug.cgi?id=650877 2011-05-23 13:50:46 +0100 Tim-Philipp Müller * gst/audioparsers/gstflacparse.c: flacparse: tell baseparse the duration in samples for better accuracy Tell GstBaseParse the duration in samples instead of time, so that a duration query in DEFAULT format will return the correct number of samples without rounding errors. Baseparse will convert this into time itself when needed. https://bugzilla.gnome.org/show_bug.cgi?id=650785 2011-05-23 13:25:44 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: also try upstream first for duration query in DEFAULT format https://bugzilla.gnome.org/show_bug.cgi?id=650785 2011-05-23 13:23:21 +0100 Tim-Philipp Müller * gst/audioparsers/gstflacparse.c: flacparse: make conversion from TIME to DEFAULT format (samples) work Fix copy'n'paste error in the previous commit. 2011-05-23 11:36:36 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Implement conversions between TIME and DEFAULT format Fixes bug #650785. 2011-05-22 18:50:51 +0100 Tim-Philipp Müller * gst/audioparsers/gstflacparse.c: flacparse: don't error out on invalid minimum_blocksize value in streaminfo header We don't use it, so may just as well accept an invalid value of 0 here, which is likely inconsequential anyway. https://bugzilla.gnome.org/show_bug.cgi?id=650691 2011-05-20 10:34:47 +0300 Stefan Kost * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpqcelpdepay.c: rtp: fix static array overruns in a nicer way Use G_N_ELEMENTS instead of hard-coding the array size. 2011-05-20 00:53:44 +0300 Stefan Kost * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpqcelpdepay.c: rtp: fix static array overruns Yes array[10] has elements from 0...9. 2011-05-19 23:31:19 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: docs: update plugin introspection data Now more files are merged and produced in a canonical fashion, which hopefully creates less or no delta in the future. 2011-05-19 22:57:15 +0300 Stefan Kost * common: Automatic update of common submodule From 9e5bbd5 to 69b981f 2011-05-19 18:21:33 +0300 Stefan Kost * gst/isomp4/qtdemux.c: qtdemux: add missing break 2010-11-08 14:06:15 +0100 Robert Swain * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Add support for deinterlacing using buffer caps/flags When not using the fieldanalysis element immediately upstream of deinterlace, behaviour should remain unchanged. fieldanalysis will set the caps and flags on the buffers such that they can be interpreted and acted upon to produce progressive output. There are two main modes of operation: - Passive pattern locking Passive pattern locking is a non-blocking, low-latency mode of operation that is suitable for close-to-live usage. Initially a telecine stream will be output as variable framerate with naïve timestamp adjustment. With each incoming buffer, an attempt is made to lock onto a pattern. When a lock is obtained, the src pad and output buffer caps will reflect the pattern and timestamps will be accurately interpolated between pattern repeats. This means that initially and at pattern transitions there will be short periods of inaccurate timestamping. - Active pattern locking Active pattern locking is a blocking, high-latency mode of operation that is targeted at use-cases where timestamp accuracy is paramount. Buffers will be queued until enough are present to make a lock. When locked, timestamps will be accurately interpolated between pattern repeats. Orphan fields can be dropped or deinterlaced. If no lock can be obtained, a single field might be pushed through to be deinterlaced. Locking can also be disabled or 'auto' chooses between passive and active locking modes depending on whether upstream is live. 2011-05-10 16:25:40 -0700 David Schleef * configure.ac: configure: Remove config script check for caca 2011-05-18 12:36:40 +0200 Jose Antonio Santos Cadenas * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpg722depay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtpspeexdepay.c: rtp: Fix segmentation fault processing payload buffers This commit checks if the value returned by gst_rtp_buffer_get_payload_buffer and gst_rtp_buffer_get_payload_subbuffer is NULL before using it. 2011-05-18 16:10:07 +0300 Stefan Kost * common: Automatic update of common submodule From fd35073 to 9e5bbd5 2011-05-18 12:52:31 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: ensure 0-padding when correcting dubious list size 2011-05-18 12:24:25 +0300 Stefan Kost * common: Automatic update of common submodule From 46dfcea to fd35073 2011-05-18 10:22:27 +0300 Stefan Kost * gst/rtsp/gstrtspsrc.c: rtspsrc: use EINVAL for missing url parameter Fixes gcc warning about using uninitialized variable 'res'. 2011-04-28 15:37:40 +0300 Stefan Kost * gst/debugutils/rndbuffersize.c: * gst/videofilter/gstgamma.c: various: fix author tag in element details 2011-04-20 15:25:58 -0400 Chris E Jones * gst/auparse/gstauparse.c: auparse: implement seeking Implement seeking and seeking query. Fixes #644512 2011-04-06 16:05:55 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: also allow PAUSE to be interrupted ... as it is on the way out to NULL. See #632504. 2011-04-06 15:51:49 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: ensure proper closing and cleanup ... since the TEARDOWN sequence might not have had a chance to even start, but at least connections should be closed (synchronously) and state cleaned up. See #632504. 2011-04-06 15:49:01 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: fix and improve async handling Simplify the command handling; passing a command to thread means we really want it to get the message, which means to always flush provided the command can handle being interrupted. Command thread indicates whether command allows interruption and ensure non-flushing connection as it subsequently needs it. In particular, this also makes the TEARDOWN sequence interruptable and also prevents races where _loop_ could miss a command and would continue receiving (or at least trying to). See #632504. 2011-04-06 14:53:27 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: tweak post-seek loop handling 2011-01-10 12:46:37 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: open on play and pause when not done yet With the async state changes, it is possible that we need to open the stream before play and pause. Also make sure we remember a previous open failure so that we don't keep trying again. 2011-01-10 11:45:03 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: improve async handling Simplify the command handling, only continue looping when we have not received another command or when the previous loop was successfull. Avoid looping on a disconnected socket. 2011-01-07 18:02:49 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: rework reconnect code Use the same async code path to implement reconnects. Make sure we only post progress messages when doing async things. 2011-01-07 17:19:59 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: small cleanups Make sure we cancel the previous task when queuing a new one. Move the messages to a central place so we can more easily post them. 2011-01-07 15:15:49 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't post errors when interrupting 2011-01-07 13:43:06 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: implement more async handling Remove some old locks. Make sure we never go into the loop function when flushing. 2011-01-07 11:40:32 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: first attempt at async implementation 2011-01-07 11:40:11 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.h: rtspsrc: small header cleanups 2011-05-17 10:47:32 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpssrcdemux.c: ssrcdemux: Fix uninitialized variable compiler warning for (pre-) releases too 2011-04-28 15:57:04 +0200 Edward Hervey * sys/v4l2/gstv4l2object.c: v4l2objects: Only allow mpeg-ts on source objects Ugly fix for #648312 2011-05-17 09:24:08 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: Fix uninitialized variable compiler warning 2011-05-06 19:09:17 -0400 Olivier Crête * gst/rtpmanager/gstrtpssrcdemux.c: ssrcdemux: Implement iterate internal links for sink pads https://bugzilla.gnome.org/show_bug.cgi?id=649617 2011-05-06 18:41:01 -0400 Olivier Crête * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: iterate pad function is only valid for src pads The iterate function is only used for src pads, so mark it as such and remove dead code. https://bugzilla.gnome.org/show_bug.cgi?id=649617 2011-05-06 18:12:53 -0400 Olivier Crête * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: Release lock before emitting signal If the lock is not released before emitting a signal, it may cause a deadlock if any other function in the element is called. Also removed an unused timestamp parameter https://bugzilla.gnome.org/show_bug.cgi?id=649617 2011-05-15 23:25:15 +0300 Debarshi Ray * gst/matroska/matroska-parse.c: matroskaparse: calculate segment duration after parsing all the IDs Since the segment duration is given in terms of the GST_MATROSKA_ID_TIMECODESCALE we should only convert it into nanoseconds when we are sure that any scale specified in the file has been read. https://bugzilla.gnome.org/show_bug.cgi?id=650258 2011-05-04 11:55:21 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: additional lock safety Fixes #619590. 2011-04-26 16:06:56 +0200 Mark Nauwelaerts * gst/isomp4/qtdemux.c: qtdemux: also check for bitrate info in caps 2010-05-25 01:04:43 +0530 Arun Raghavan * gst/isomp4/qtdemux.c: * gst/isomp4/qtdemux.h: qtdemux: guess bitrate if only one stream's bitrate is unknown If the bitrates for all but one audio/video streams are known, and the total stream size and duration can be determined, this calculates the unkown bitrate as (stream size / duration) - (sum of known bitrates). While this is not guaranteed to be very accurate, it should be good enough for most purposes. For example, this is useful for H.263 + AAC streams where no 'btrt' atom is available for the video portion. https://bugzilla.gnome.org/show_bug.cgi?id=619548 2010-05-31 23:59:59 +0530 Arun Raghavan * gst/isomp4/qtdemux.c: qtdemux: Export max bitrate for AMR-NB/-WB streams This parses the 'damr' atom if present, and exports the maximum bitrate of the stream using the mode set field to determine the highest bitrate frame type that might be present. https://bugzilla.gnome.org/show_bug.cgi?id=620186 2011-05-16 09:04:31 +0200 Pino Toscano * ext/pulse/pulseutil.c: pulse: Define PATH_MAX if it isn't defined GNU Hurd for example doesn't define it. 2011-05-15 23:25:15 +0300 Debarshi Ray * gst/matroska/matroska-demux.c: matroskademux: calculate segment duration after parsing all the IDs Since the segment duration is given in terms of the GST_MATROSKA_ID_TIMECODESCALE we should only convert it into nanoseconds when we are sure that any scale specified in the file has been read. https://bugzilla.gnome.org/show_bug.cgi?id=650258 2011-05-09 19:00:45 +0200 Andoni Morales Alastruey * gst/flv/gstflvmux.c: flvmux: Add support for mpegversion 2, which is also AAC 2011-05-11 10:25:15 +0200 Sebastian Dröge * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: flacdec: Send EOS when seeking after the end of file instead of failing Fixes bug #649780. 2011-04-29 08:59:20 +0200 Sebastian Dröge * gst/wavenc/gstwavenc.c: wavenc: Set fixedcaps getcaps function on the sinkpad wavenc does not allow to change the caps during playback and always returning the template caps is just wrong. 2011-04-29 08:55:19 +0200 Sebastian Dröge * gst/wavenc/gstwavenc.c: wavenc: Allow setcaps to be called after a format was negotiated if it's compatible Otherwise wavenc will fail if upstream decides to set equivalent caps or caps with additional information later. Thanks to Alexander Schremmer for finding this bug. 2011-05-14 10:02:22 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-isomp4.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development === release 0.10.29 === 2011-05-10 10:04:28 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-isomp4.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/gl.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ro.po: * po/ru.po: * po/sk.po: * po/sl.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: * win32/common/config.h: Release 0.10.29 Highlights: - amrparse, aacparse, ac3parse, flacparse, mpegaudioparse, dcaparse audio parsers (moved from -bad) - muxers now mux based on running time - ISO MP4 muxers: mp4mux/3gppmux/qtmux/mj2mux (moved from -bad) - new matroskaparse element - new v4l2radio element - rtpsession: support RTCP Early Feedback (the AVPF profile) - orc 0.4.14 or newer recommended - many other fixes and improvements 2011-05-05 13:24:23 +0200 Edward Hervey * gst/isomp4/gstqtmux.c: qtmux: Fix signed floating point values writing You would end up on some architectures with 0 being written out instead of the proper value. https://bugzilla.gnome.org/show_bug.cgi?id=649449 2011-05-04 12:04:15 +0200 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: avoid building index when streamable ... as it will not be written anyway. Fixes #648937 (?). 2011-05-02 12:09:02 +0100 Tim-Philipp Müller * Makefile.am: build: add old qtdemux/quicktime directories to CRUFT_DIRS and CRUFT_FILES 2011-05-01 00:04:03 -0400 Tom Janiszewski * gst/flv/gstflvmux.c: flvmux: don't overwrite metadata tag with duration in streaming mode A duration tag gets inserted only for streamable=false, so only update/write the duration later if we actually inserted that tag, otherwise we write garbage into other tags. https://bugzilla.gnome.org/show_bug.cgi?id=649060 2011-04-30 18:16:36 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-isomp4.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * po/fr.po: * win32/common/config.h: 0.10.28.4 pre-release 2011-04-30 17:46:36 +0100 Tim-Philipp Müller * Android.mk: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/inspect/plugin-isomp4.xml: * docs/plugins/inspect/plugin-quicktime.xml: * gst-plugins-good.spec.in: * gst/isomp4/LEGAL: * gst/isomp4/Makefile.am: * gst/isomp4/atoms.c: * gst/isomp4/atoms.h: * gst/isomp4/atomsrecovery.c: * gst/isomp4/atomsrecovery.h: * gst/isomp4/descriptors.c: * gst/isomp4/descriptors.h: * gst/isomp4/fourcc.h: * gst/isomp4/ftypcc.h: * gst/isomp4/gstqtmoovrecover.c: * gst/isomp4/gstqtmoovrecover.h: * gst/isomp4/gstqtmux-doc.c: * gst/isomp4/gstqtmux-doc.h: * gst/isomp4/gstqtmux.c: * gst/isomp4/gstqtmux.h: * gst/isomp4/gstqtmuxmap.c: * gst/isomp4/gstqtmuxmap.h: * gst/isomp4/gstrtpxqtdepay.c: * gst/isomp4/gstrtpxqtdepay.h: * gst/isomp4/isomp4-plugin.c: * gst/isomp4/properties.c: * gst/isomp4/properties.h: * gst/isomp4/qtatomparser.h: * gst/isomp4/qtdemux.c: * gst/isomp4/qtdemux.h: * gst/isomp4/qtdemux.vcproj: * gst/isomp4/qtdemux_dump.c: * gst/isomp4/qtdemux_dump.h: * gst/isomp4/qtdemux_fourcc.h: * gst/isomp4/qtdemux_lang.c: * gst/isomp4/qtdemux_lang.h: * gst/isomp4/qtdemux_types.c: * gst/isomp4/qtdemux_types.h: * gst/isomp4/qtpalette.h: * gst/quicktime/LEGAL: * gst/quicktime/Makefile.am: * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/atomsrecovery.c: * gst/quicktime/atomsrecovery.h: * gst/quicktime/descriptors.c: * gst/quicktime/descriptors.h: * gst/quicktime/fourcc.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmoovrecover.c: * gst/quicktime/gstqtmoovrecover.h: * gst/quicktime/gstqtmux-doc.c: * gst/quicktime/gstqtmux-doc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: * gst/quicktime/gstrtpxqtdepay.c: * gst/quicktime/gstrtpxqtdepay.h: * gst/quicktime/properties.c: * gst/quicktime/properties.h: * gst/quicktime/qtatomparser.h: * gst/quicktime/qtdemux.c: * gst/quicktime/qtdemux.h: * gst/quicktime/qtdemux.vcproj: * gst/quicktime/qtdemux_dump.c: * gst/quicktime/qtdemux_dump.h: * gst/quicktime/qtdemux_fourcc.h: * gst/quicktime/qtdemux_lang.c: * gst/quicktime/qtdemux_lang.h: * gst/quicktime/qtdemux_types.c: * gst/quicktime/qtdemux_types.h: * gst/quicktime/qtpalette.h: * gst/quicktime/quicktime.c: * po/POTFILES.in: quicktime: rename plugin to isomp4 https://bugzilla.gnome.org/show_bug.cgi?id=648004 2011-04-27 12:45:51 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * po/bg.po: * po/ja.po: * po/nl.po: * po/ru.po: * win32/common/config.h: 0.10.28.3 pre-release 2011-04-26 15:58:12 +0200 Wim Taymans * gst/rtp/gstrtpgstpay.c: rtpgstpay: fix buffer leak 2011-04-25 10:04:52 +0200 Philip Jägenstedt * ext/jpeg/gstjpegdec.c: jpegdec: documentation typo "jpegddec" https://bugzilla.gnome.org/show_bug.cgi?id=648589 2011-04-24 16:45:07 -0700 David Schleef * gst/avi/gstavimux.c: * gst/matroska/matroska-mux.c: avimux,matroskamux: Add stream-format to h264 caps Fixes #606662. 2011-02-20 12:13:49 -0800 David Schleef * ext/libpng/gstpngdec.c: pngdec: Remove temporary code Now that we depend on (what will be) -base-0.10.33. 2011-04-24 14:03:56 +0100 Tim-Philipp Müller * configure.ac: configure: don't pass -Waddress to ObjC compiler on OSX when compiling osxvideosink Temporary workaround until we fix this properly and check for the ObjC warning/error flags instead of just passing CFLAGS to the ObjC compiler. https://bugzilla.gnome.org/show_bug.cgi?id=643939 2011-04-24 13:29:32 +0100 Tim-Philipp Müller * docs/plugins/inspect/plugin-quicktime.xml: * gst-plugins-good.spec.in: * gst/quicktime/Makefile.am: quicktime: rename plugin filename from *qtdemux* to *quicktime* https://bugzilla.gnome.org/show_bug.cgi?id=648004 2011-04-24 14:03:41 +0100 Tim-Philipp Müller * common: Automatic update of common submodule From c3cafe1 to 46dfcea 2011-04-21 23:30:26 +0100 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/quicktime/Makefile.am: * gst/quicktime/gstqtmoovrecover.c: * gst/quicktime/gstqtmux-doc.c: * gst/quicktime/gstqtmux-doc.h: docs: add various qtmux variants to documentation 2011-04-21 22:51:52 +0100 Tim-Philipp Müller * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: quicktime: register 3gppmux element in addition to the misnamed gppmux 2011-04-18 18:08:30 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Remove incomplete support for RTCP FIR Remove bits that were meant to suppport RTCP FIR https://bugzilla.gnome.org/show_bug.cgi?id=648160 2011-04-19 14:33:25 +0100 Tim-Philipp Müller * tests/check/Makefile.am: * tests/check/generic/.gitignore: * tests/check/generic/index.c: tests: add generic set_index test 2011-04-19 14:33:42 +0100 Tim-Philipp Müller * gst/flv/gstflvdemux.c: flvdemux: fix deadlock on setting index on flvdemux 2011-04-19 14:16:11 +0100 Tim-Philipp Müller * tests/check/elements/flacparse.c: tests: add index-setting test for baseparse/flacparse https://bugzilla.gnome.org/show_bug.cgi?id=646811 2011-04-18 11:29:15 +0200 Sebastian Dröge * tests/check/pipelines/wavpack.c: wavpack: Remove bus GSource to prevent a valgrind warning 2011-04-18 11:14:32 +0200 Sebastian Dröge * tests/check/pipelines/wavenc.c: wavenc: Remove bus GSource to prevent a valgrind warning 2011-04-18 11:11:53 +0200 Sebastian Dröge * tests/check/pipelines/tagschecking.c: tagschecking: Remove bus GSource to prevent a valgrind warning 2011-04-18 11:10:01 +0200 Sebastian Dröge * tests/check/elements/imagefreeze.c: imagefreeze: Remove bus GSource to prevent a valgrind warning 2011-04-17 01:29:01 +0100 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: fix 'variable may be used uninitialized' warnings caused by -DG_DISABLE_ASSERT 2011-04-16 18:50:11 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: * win32/common/gstrtpbin-marshal.c: * win32/common/gstrtpbin-marshal.h: 0.10.28.2 pre-release 2011-04-16 18:49:27 +0100 Tim-Philipp Müller * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: gst: update disted orc backup code 2011-04-16 18:29:45 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audioparsers.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: update for pre-release 2011-04-16 18:27:54 +0100 Tim-Philipp Müller * po/bg.po: * po/cs.po: * po/de.po: * po/es.po: * po/id.po: * po/sl.po: po: update translations 2011-04-16 18:17:01 +0100 Tim-Philipp Müller * gst/quicktime/gstqtmux.c: qtmux: refuse incomplete legacy h264 caps Refuse h264 caps without stream-format and codec_data fields for now, to avoid creating broken files. This might cause some pipelines that worked previously to fail. However, the move from -bad to -good is our only chance to fix this up, so make it strict for now. We can always change it back to be less strict in future. https://bugzilla.gnome.org/show_bug.cgi?id=647919 2011-04-16 18:16:11 +0100 Tim-Philipp Müller * sys/v4l2/gstv4l2sink.c: v4l2sink: fix another unused-but-set-variable warning 2011-04-16 18:10:24 +0100 Tim-Philipp Müller * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: * ext/speex/gstspeexenc.c: * gst/rtp/gstrtpgsmpay.c: pulse, speexenc, rtpgsmpay: don't use g_assert() for error handling Don't use g_assert() for error handling, even if they're highly unlikely. Either we *know* that something can't happen, in which case we should just not handle it, or we think something can happen, but it is very very unlikely that it will ever happen, in which case we should handle it like any other error instead of asserting. g_assert() is best left for conditions we have control of, like checking internal consistency of our code, not checking return values of external code. Fixes a bunch of warnings when compiling with -DG_DISABLE_ASSERT: gstrtpgsmpay.c: In function 'gst_rtp_gsm_pay_handle_buffer': gstrtpgsmpay.c:130:17: warning: variable 'rtpgsmpay' set but not used gstspeexenc.c: In function 'gst_speex_enc_encode': gstspeexenc.c:904:19: warning: variable 'written' set but not used pulsesink.c: In function 'gst_pulsesink_change_state': pulsesink.c:2725:9: warning: variable 'res' set but not used pulsesrc.c: In function 'gst_pulsesrc_change_state': pulsesrc.c:1253:7: warning: variable 'e' set but not used 2011-04-16 18:07:35 +0100 Tim-Philipp Müller * tests/examples/rtp/server-alsasrc-PCMA.c: examples: fix some warnings in rtp example Caused by -DG_DISABLE_ASSERT 2011-04-16 17:57:32 +0100 Tim-Philipp Müller * tests/examples/level/level-example.c: examples: don't put code with side-effects into g_assert() Otherwise things won't work too well when compiling with -DG_DISABLE_ASSERT (as we do for pre-releases and releases). 2011-04-16 16:51:32 +0100 Tim-Philipp Müller * gst/deinterlace/tvtime/greedyh.c: * gst/matroska/matroska-mux.c: deinterlace, matroska: fix two variable-may-be-used-uninitialized compiler warnings We use -DG_DISABLE_ASSERT for the pre-releases, which makes these warnings pop up in cases that were previously covered by g_assert_not_reached() and the like: tvtime/greedyh.c:801:14: warning: 'scanline' may be used uninitialized in this function matroska-mux.c:501:19: warning: 'context' may be used uninitialized in this function 2011-04-16 13:33:45 +0100 Tim-Philipp Müller * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: fix unused-but-set-variable warnings with gcc-4.6 2011-04-16 13:23:50 +0100 Tim-Philipp Müller * tests/examples/cairo/cairo_overlay.c: examples: fix 'control reaches end of non-void function' warning in cairo example 2011-04-15 15:47:24 +0200 Robert Swain * sys/v4l2/gstv4l2src.c: v4l2src: Address unused but set variable The v4l2object formats list was being obtained into a local variable and then still used from the context. Make use of the local variable. 2011-04-15 15:17:34 +0200 Robert Swain * sys/oss4/oss4-mixer-slider.c: * sys/oss4/oss4-mixer-switch.c: * sys/oss4/oss4-property-probe.c: * sys/oss4/oss4-source.c: oss4: Address unused but set variables GCC 4.6.x complains about such variable usage. Unused but set variables were removed except that gst_oss4_mixer_slider_set_mute () now returns the value from the call to gst_oss4_mixer_set_control_val (). 2011-04-15 15:14:13 +0200 Robert Swain * ext/jpeg/gstjpegenc.c: * ext/pulse/pulsesink.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: jpegenc: pulsesink: raw1394: Address unused but set variables GCC 4.6.x spits warnings about such usage of variables. The variables in raw1394 were marked with G_GNUC_UNUSED as this seemed omre appropriate. The others were removed. 2011-04-15 15:12:44 +0200 Robert Swain * gst/shapewipe/gstshapewipe.c: * gst/y4m/gsty4mencode.c: y4mencode: shapewipe: Address unused but set variables GCC 4.6.x complains about such usage. 2011-04-15 15:11:35 +0200 Robert Swain * tests/check/elements/deinterlace.c: * tests/check/elements/rtp-payloading.c: * tests/check/pipelines/flacdec.c: * tests/examples/level/level-example.c: * tests/icles/videocrop-test.c: * tests/icles/ximagesrc-test.c: tests: Address unused but set variables GCC 4.6.x spits warnings about such usage of variables. 2011-04-15 15:36:41 +0200 Robert Swain * gst/videomixer/blendorc.orc: videomixer: Fix argb/rgba overlay orc code Remove some redundant operations (convubw) and use the correct variable, t2, in the orc_overlay_bgra function. 2011-04-15 15:33:35 +0200 Robert Swain * gst/videomixer/blend.c: * gst/videomixer/gstcollectpads2.c: * gst/videomixer/videomixer2.c: videomixer: address unused but set variables GCC 4.6.x spits warnings about variables that are set but unused. Such variables have been removed in blend, collectpads2 and videomixer2. 2011-04-15 14:57:20 +0200 Robert Swain * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpg722pay.c: * gst/rtp/gstrtpgstdepay.c: * gst/rtp/gstrtpgstpay.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpqcelpdepay.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpsession.c: rtp, rtpmanager: Address unused but set variables GCC 4.6.x spits warnings about variables that are unused but set. Such variables have been removed where trivial but with comments left behind for informational purposes in some cases. gst_rtp_session_chain_recv_rtcp () was changed in commit 490113d4 to always return GST_FLOW_OK instead of the return value of rtp_session_process_rtcp (), so we'll keep it that way. 2011-04-15 11:29:30 +0200 Robert Swain * gst/quicktime/descriptors.c: * gst/quicktime/gstrtpxqtdepay.c: * gst/quicktime/qtdemux.c: quicktime: Remove unused but set variables GCC 4.6.x spits warnings about such variable usage. Note that some calculations are left as comments for informative purposes. 2011-04-15 11:23:38 +0200 Robert Swain * gst/matroska/matroska-demux.c: * gst/matroska/matroska-parse.c: matroska: Remove unused but set variables GCC 4.6.x spits warnings about such variable usage. 2011-04-15 11:19:26 +0200 Robert Swain * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Remove unused but set duration variable GCC 4.6.x spits warnings about such variable usage. 2011-04-15 11:18:19 +0200 Robert Swain * gst/flv/gstflvdemux.c: flxdemux: Remove unused but set keyframe variables The FIXMEs about the keyframe flag never being used are left for later fixing, at which point the keyframe variables could be added back. 2011-04-15 11:16:42 +0200 Robert Swain * gst/effectv/gstedge.c: edgetv: Remove unused but set height variable GCC 4.6.x spits warnings about such variables. 2011-04-15 18:51:20 +0100 Tim-Philipp Müller * gst/audioparsers/gstflacparse.c: flacparse: update for gst_base_parse_frame_init() API change 2011-02-01 15:57:01 -0500 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Use existing functions to parse RTCP FB packets Use existing functions to get the FCI from FB packets. https://bugzilla.gnome.org/show_bug.cgi?id=622553 2011-02-01 16:23:52 -0500 Olivier Crête * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/rtpsession.c: rtpsession: marshal GstBuffer as a MiniObject instead of a pointer https://bugzilla.gnome.org/show_bug.cgi?id=622553 2011-04-14 23:24:56 -0700 David Schleef * gst/matroska/matroska-demux.c: matroskademux: Better calculation of framerate https://bugzilla.gnome.org/show_bug.cgi?id=647833 2011-04-13 12:37:09 +0100 Tim-Philipp Müller * gst/quicktime/gstqtmux.c: qtmux: default to dts-method=reorder and presentation-time=true https://bugzilla.gnome.org/show_bug.cgi?id=636699 2011-04-15 12:47:52 +0200 Mark Nauwelaerts * tests/check/elements/qtmux.c: tests: qtmux: test various dts-methods 2011-04-15 12:34:05 +0200 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: fix corner case buffer handling for reorder method 2011-04-14 13:47:05 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: flvdemux: Don't leak the SEEKING query 2011-04-14 13:43:06 +0200 Sebastian Dröge * gst/quicktime/gstqtmoovrecover.c: * gst/quicktime/gstqtmoovrecover.h: qtmoovrecover: Don't leak the static recursive mutex 2011-04-14 13:37:52 +0200 Sebastian Dröge * sys/v4l2/gstv4l2radio.c: v4l2radio: Free videodev string before replacing it 2011-04-14 13:24:21 +0200 Sebastian Dröge * gst/matroska/matroska-parse.c: matroskaparse: Allow webm and matroska caps and don't leak caps 2011-04-14 07:35:29 +0100 Christian Fredrik Kalager Schaller * gst-plugins-good.spec.in: Add parser plugin 2011-03-24 14:34:24 -0700 David Schleef * sys/directsound/gstdirectsoundsink.c: directsoundsink: Add conditionals on WAVE_FORMAT_DOLBY_AC3_SPDIF 2011-04-11 20:09:14 +0100 Tim-Philipp Müller * gst/debugutils/gstcapsdebug.c: capsdebug: fix unused-but-set-variable warnings with gcc 4.6 2011-04-11 20:05:54 +0100 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: fix unused-but-set-variable warning with gcc 4.6 Most likely a leftover from when the index parsing code was rewritten. 2011-04-11 19:54:00 +0100 Tim-Philipp Müller * gst/audioparsers/gstac3parse.c: ac3parse: fix unused-but-set-variable warning with gcc 4.6 2011-04-11 19:50:07 +0100 Tim-Philipp Müller * gst/videofilter/gstvideobalance.c: videobalance: fix handling of YUV images with 'odd' widths Fixes unused-but-set-variable warnings with gcc 4.6. 2011-04-11 19:49:22 +0100 Tim-Philipp Müller * gst/videofilter/gstvideoflip.c: videoflip: fix unused-but-set-variable warnings with gcc 4.6 2011-04-13 18:11:34 +0200 Sebastian Dröge * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: audiowsinc{band,limit}: Fix check for divison by zero 2011-04-13 18:01:01 +0200 Sebastian Dröge * gst/audiofx/audiowsincband.c: audiowsincband: Fix range of kernel elements (lim -> lim-1) 2011-04-13 18:00:44 +0200 Sebastian Dröge * gst/audiofx/audiowsinclimit.c: audiowsinclimit: Add some more braces to make the code more readable 2011-04-11 18:40:30 -0500 Jordi Burguet-Castell * gst/audiofx/audiowsinclimit.c: audiowsinclimit: Fix range of kernel elements (lim -> lim-1) in high/low-pass filters 2011-04-13 17:49:22 +0200 Sebastian Dröge * gst/audiofx/audiowsincband.c: audiowsincband: Add new windowing functions: gaussian, cos and hann 2011-04-11 18:41:43 -0500 Jordi Burguet-Castell * gst/audiofx/audiowsinclimit.c: audiowsinclimimt: Add new windows to high/low-pass filters: gaussian, cosine, hann 2011-04-13 16:47:05 +0100 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroskademux: set stream-format=byte-stream on h264 caps if there's no codec data https://bugzilla.gnome.org/show_bug.cgi?id=606662 2011-04-13 16:37:07 +0100 Thiago Santos * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: restrict h264 some more to only accept AU-aligned AVC https://bugzilla.gnome.org/show_bug.cgi?id=606662 2011-04-13 17:11:26 +0200 Sebastian Dröge * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: The VBRI header is always at offset 0x20, independent of MPEG version Also clean up advancing of the data pointer a bit. Fixes bug #647659. 2011-04-13 15:18:11 +0100 Tim-Philipp Müller * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: * tests/check/Makefile.am: * tests/check/elements/qtmux.c: qtmux: add variant-less video/quicktime to source pad template caps This is needed for automatic transcoding using encodebin. Our typefinder does not always add a variant to the found caps, and encodebin needs an *exact* match to the caps on the source pad template, so we need to add the variant-less video/quicktime caps to the template as well for encodebin to be able to find it. Add unit test for this as well. https://bugzilla.gnome.org/show_bug.cgi?id=642879 2011-04-13 16:17:41 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: flacenc: Properly interprete the result of strcmp() 2011-04-13 16:09:04 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: flacenc: Don't store image tags inside the vorbiscomments and the flac metadata Instead only store them inside the flac metadata. There's no point in storing them twice and the flac metadata is still the official way to store image tags inside flac. 2011-04-13 12:38:15 +0100 Tim-Philipp Müller * tests/check/elements/.gitignore: * tests/check/pipelines/.gitignore: tests: ignore new qtmux-related test binaries 2011-04-13 11:25:11 +0100 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-quicktime.xml: * gst/quicktime/Makefile.am: * gst/quicktime/gstqtmuxplugin.c: * gst/quicktime/quicktime.c: * tests/check/Makefile.am: quicktime: move qtmux plugin from -bad to -good https://bugzilla.gnome.org/show_bug.cgi?id=636699 2011-04-04 12:21:23 +0200 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: more helpful debug error message when no needed duration on input buffers Fixes #646256. 2011-03-21 10:56:51 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: qtmux: Adding GstTagXmpWriter interface Adds GstTagXmpWriter interface support to qtmux 2011-03-22 20:53:08 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: use running time for synchronization See also #432612. 2011-03-10 16:03:58 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: provide for PTS metadata when so configured ... and not only when sort-of feeling like it. In any case, if it turns out all really is in order, and presumably DTS == PTS, then no ctts will be produced anyway. 2011-03-10 16:02:42 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: also track original PTS buffer timestamp in reorder dts-method 2011-02-21 12:14:59 +0100 Edward Hervey * gst/quicktime/gstqtmux.c: Revert "Check that collectpads exists before removing pad" This reverts commit 6d8740476ccd3a3498dc4f18c19733643825c7b8. Depends on a core commit that was reverted 2011-02-20 23:57:19 -0800 David Schleef * gst/quicktime/gstqtmux.c: Check that collectpads exists before removing pad The core now calls release pad from finalize, at which point the collectpads might have already been freed. 2011-01-13 11:28:32 -0300 Thiago Santos * tests/check/elements/qtmux.c: test: qtmux: Tests qtmux reuse Forces the use of qtmux after it has been put to PLAYING and back to NULL once https://bugzilla.gnome.org/show_bug.cgi?id=639338 2011-01-13 15:27:36 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: set src pads when starting file ... rather than at _init time, so they are also available following a pad (de)activation cycle. https://bugzilla.gnome.org/show_bug.cgi?id=639338 2011-01-03 17:24:23 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: adjust nasty case timestamp tracking That is, all sorts of problems arise with re-ordered input timestamps that tend to defy automagic handling for every case, so allow for a few variations that can be tried depending on circumstances. Also try to document accordingly. Also fixes #638288. 2010-12-30 21:48:41 +0200 Felipe Contreras * gst/quicktime/gstqtmux.c: qtmux: get rid of timestamp overprotectiveness Signed-off-by: Felipe Contreras 2011-01-03 16:56:57 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/atomsrecovery.c: * gst/quicktime/gstqtmux.c: qtmux: simplify and fix pts_offset storing In particular, only write a ctts atom if and only if ever a non-zero offset. 2011-01-03 10:43:15 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: add some more documentation 2010-12-03 15:23:00 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: remove large-file property Rather, auto-determine if 64-bits fields are needed for a valid result, and stick to plain 32-bits if not needed. API: GstQTMux:large-file (removed) 2010-12-19 12:53:34 +0100 Sebastian Dröge * gst/quicktime/gstqtmux.c: qtmux: Free AtomInfo structs 2010-12-19 12:50:30 +0100 Sebastian Dröge * gst/quicktime/gstqtmux.c: qtmux: Free tag string after use 2010-12-19 12:12:25 +0100 Sebastian Dröge * tests/check/pipelines/tagschecking.c: tagschecking: Fix some more memory leaks 2010-12-17 19:41:25 +0200 Lasse Laukkanen * gst/quicktime/gstqtmux.c: qtmux: allow zero duration tracks 2010-12-03 18:09:41 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: add documentation 2010-12-01 10:45:49 +0100 David Hoyt * gst/quicktime/gstqtmux.c: qtmux: handle msvc ftruncate incompatibility Fixes #636185. 2010-11-27 16:07:19 -0600 Alejandro Gonzalez * gst/quicktime/gstqtmux.c: qtmux: gst_qtmux_check_difference verify before subtract Avoid negative overflow by checking the order of operands on subtraction of unsigned integers. https://bugzilla.gnome.org/show_bug.cgi?id=635878 2010-11-19 17:55:36 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: remove remnant of obsolete property 2010-11-19 15:18:58 +0100 Mark Nauwelaerts * tests/check/elements/qtmux.c: tests: qtmux: also unit test fragmented file cases 2010-07-30 12:48:29 +0200 Marc-André Lureau * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: allow specifying trak timescale This is mainly because Smoothstreaming client are broken and don't take the TimeScale property into account. 2010-11-19 17:41:41 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: qtmux: include sdtp atoms for ismv fragmented files Based on patch by Marc-André Lureau 2010-11-19 19:17:45 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: enable default fragmented file for ismlmux 2010-09-02 13:58:05 +0200 Marc-André Lureau * gst/quicktime/atoms.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: qtmux: add ismlmux, for fragmented isml major brand 2010-11-19 14:44:45 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: finalize sinkpads list 2010-07-22 19:40:07 +0200 Marc-André Lureau * gst/quicktime/gstqtmux.c: qtmux: add moov in streamheader 2010-08-06 13:26:27 +0200 Marc-André Lureau * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: add streamable property to avoid building fragmented mfra index 2010-11-18 16:48:06 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: add mfra to fragmented file Based on patch by Marc-André Lureau 2010-11-15 15:17:59 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: optionally create fragmented file In this mode, an initial empty moov (containing only stream metadata) is written, followed by fragments containing actual data (along with required metadata). New fragments are started either at keyframe (if such are sparse) or when property configured duration exceeded. Based on patch by Marc-André Lureau Fixes #632911. 2010-11-15 15:12:45 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: qtmux: use helper to set atom flags from given uint 2010-11-09 16:49:07 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: refactor configuring and sending of moov Based on patch by Marc-André Lureau 2010-11-09 15:54:44 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: refactor extra top-level atom handling Also check a bit more for possible errors, and free proper items in such case. 2010-11-09 15:01:15 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: refactor slightly using buffer helper 2010-11-05 13:48:57 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: fix misinforming comment 2010-11-05 12:08:15 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: qtmux: delegate mvex handling to atoms ... which keeps qtmux simpler. 2009-09-28 16:11:35 +0200 Marc-André Lureau * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: qtmux: add mvex/trex in header if fragmented One "trex" is added per "trak". We don't support default values, but the "trex" box is mandatory. 2009-09-28 13:01:30 +0200 Marc-André Lureau * gst/quicktime/fourcc.h: qtmux: add a couple of fourcc for fragmented mp4 2010-11-05 11:08:01 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: avoid removing temp file when error occurred 2009-09-30 17:16:30 +0200 Marc-André Lureau * gst/quicktime/gstqtmux.c: qtmux: truncate buffer file after each send 2009-09-28 16:53:51 +0200 Marc-André Lureau * gst/quicktime/gstqtmux.c: qtmux: remove temp file when reset/finalize 2010-10-19 13:43:14 +0300 Stefan Kost * gst/quicktime/gstqtmoovrecover.c: various (gst): add missing G_PARAM_STATIC_STRINGS flags Canonicalize property names as needed. 2010-10-13 17:47:29 +0200 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: prevent infinite loop when adjusting framerate Fixes #632070. 2010-10-03 23:45:46 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: Add G_PARAM_STATIC_STRINGS Add G_PARAM_STATIC_STRINGS to qtmux properties 2010-09-15 17:54:49 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: Follow xmp serialization guidelines closer qt and isom variants have different ways of serializing xmp, follow these guidelines. Those can be found in Adobe's xmp docs. 2010-08-16 12:36:24 +0200 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: autodetect out-of-order input timestamps and determine DTS accordingly Favour using input buffer timestamps for DTS, but fallback to using buffer duration (accumulation) if input ts detected out-of-order. Fixes #624212. 2010-07-28 16:15:53 +0200 Marc-André Lureau * gst/quicktime/gstqtmux.c: qtmux: use caps bitrate at last chance If we didn't get the stream's bitrate from one of the atoms, try getting it from the caps as a last resort. https://bugzilla.gnome.org/show_bug.cgi?id=625496 2010-07-28 16:12:11 +0200 Marc-André Lureau * gst/quicktime/atoms.c: qtmux: btrt - max bitrate before average According to iso base media file format, the max bitrate is before the avg https://bugzilla.gnome.org/show_bug.cgi?id=625496 2010-07-06 14:48:08 +0530 Arun Raghavan * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: qtmux: Write 'btrt' atom for H.264 media if possible This writes out the optional 'btrt' atom (MPEG4BitrateBox) for H.264 media if either or both of average and maximum bitrate are available for the stream. https://bugzilla.gnome.org/show_bug.cgi?id=623678 2010-07-05 14:09:50 +0530 Arun Raghavan * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: Write avg/max bitrate to ESDS if available This collects the 'bitrate' and 'maximum-bitrate' tags on the corresponding pad and uses these to populate these fields in the ESDS where applicable. https://bugzilla.gnome.org/show_bug.cgi?id=623678 2010-07-02 12:45:20 +0200 Edward Hervey * gst/quicktime/gstqtmux.c: qtmux: Don't use bogus codec/format tags https://bugzilla.gnome.org/show_bug.cgi?id=623365 2010-06-25 20:19:20 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: Write uint tags that don't have a complement Write uint tags that have complements (e.g. track-number/ track-count) even when we only have one of them available and set the other one to 0. Fixes #622484 2010-06-21 19:39:54 +0200 Edward Hervey * gst/quicktime/gstqtmux.c: qtmux: Remove the pad from our internal list before calling collectpads Previously we would end up with the collectpaddata structure already freed. This would result in a bogus iteration of mux->sinkpads (all the GstQTPad being freed) and it wouldn't be removed from that list. Finally, due to it not being removed from that list, we would end up calling a bogus gst_qt_mux_pad_reset on those structures => SEGFAULT 2010-05-12 18:50:34 -0700 David Schleef * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: Add VP8 2010-05-11 13:15:37 +0100 Tim-Philipp Müller * tests/check/pipelines/tagschecking.c: tests: don't fail tagschecking test if qtdemux is not available or too old 2010-03-27 09:46:30 +0000 Tim-Philipp Müller * gst/quicktime/gstqtmuxplugin.c: qtmux: use GStreamer package name and origin in the plugin info 2010-03-23 17:34:30 -0300 Thiago Santos * tests/check/pipelines/tagschecking.c: tests: tagschecking: New tags tests Adds new tags checking tests. 2010-03-25 00:20:54 +0000 Tim-Philipp Müller * gst/quicktime/gstqtmux.c: qtmux: init debug category before using it 2010-03-22 16:56:03 +0100 Benjamin Otte * gst/quicktime/atoms.c: Add -Wold-style-definition and fix the warnings 2010-03-22 13:16:33 +0100 Benjamin Otte * gst/quicktime/atoms.c: * gst/quicktime/gstqtmuxmap.h: * tests/check/elements/qtmux.c: Add -Wwrite-strings and fix its warnings 2010-03-21 21:39:18 +0100 Benjamin Otte * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/atomsrecovery.c: * gst/quicktime/descriptors.c: * tests/check/elements/qtmux.c: * tests/check/pipelines/tagschecking.c: Add -Wmissing-declarations -Wmissing-prototypes to configure flags And fix all warnings 2010-03-18 17:30:26 +0100 Benjamin Otte * gst/quicktime/gstqtmoovrecover.c: * gst/quicktime/gstqtmux.c: gst_element_class_set_details => gst_element_class_set_details_simple 2010-03-12 11:28:51 -0300 Thiago Santos * tests/check/pipelines/tagschecking.c: tests: tagschecking: Improvements and new geo-location tests Makes some improvements to tagschecking.c, making it use fakesrc instead of videotestsrc and allowing to set input caps so that more muxers can be used. Previously we could only use those that accepted raw video caps. Also adds some tests for geo-location tags 2010-03-12 10:53:36 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: Use xmp on mp4mux and gppmux too Do not restrict xmp to qtmux, but use it too on mp4mux and gppmux 2010-03-05 13:33:37 -0300 Thiago Santos * tests/check/pipelines/tagschecking.c: check: tagschecking: tests for tags serialization in muxers Adds a check unit test that aims to test tags serialization and deserialization consistency (in muxers). It provides a basic function that allows one to easily specify tags, a muxer and a demuxer and a test will be done to check if the tags have been consistently muxed and demuxed 2010-02-22 16:45:34 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: qtmux: add xmp support Adds xmp metatags adding to qtmux. Fixes #609539 2010-03-11 17:17:15 +0000 Tim-Philipp Müller * gst/quicktime/gstqtmoovrecover.c: qtmux: fix GST_ELEMENT_ERROR usage We need to pass (NULL) rather than NULL for empty arguments. 2010-03-10 10:23:23 -0600 Rob Clark * gst/quicktime/gstqtmoovrecover.c: qtmux: fix compile error gst/quicktime/gstqtmoovrecover.c:268: warning: format not a string literal and no format arguments https://bugzilla.gnome.org/show_bug.cgi?id=612454 2010-02-22 19:38:15 -0300 Thiago Santos * gst/quicktime/gstqtmuxmap.c: qtmux: Rename 'avc-sample' to 'avc' in caps Fixes #606662 2010-02-26 11:50:25 -0800 Michael Smith * gst/quicktime/gstqtmux.c: qtmux: Take lock around use of (non-threadsafe) tagsetter interface. 2010-02-22 16:51:00 -0300 Thiago Santos * gst/quicktime/atoms.c: qtmux: write all udta children atoms UDTA might have META and other children atoms together, write them all. 2010-02-22 10:48:11 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: Use internal sink pads list Due to GstCollectPads sink pads list being not reliably iteratable (when not inside the collected function) this patch adds a sink pads list to qtmux to be used when iterating sink pads on reset function. Fixes #609055 2010-02-16 17:13:09 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: qtmux: prevent leaking hdlr name 2010-02-16 16:24:12 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: support for ALAC Fixes #580731. 2010-02-16 14:19:04 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: qtmux: refactor building stsd entry 'wave' extension 2010-02-08 11:51:52 -0300 Thiago Santos * gst/quicktime/atomsrecovery.c: qtmux: atomsrecovery: Fix compilation problem Fixes a compilation error due to unused function result. 2009-12-12 16:07:15 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/atomsrecovery.c: * gst/quicktime/atomsrecovery.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmoovrecover.c: * gst/quicktime/gstqtmoovrecover.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxplugin.c: qtmux: Adds moov recovery feature Adds a new property to qtmux that sets a path to a file to write and update data about the moov atom (that is not writen till the end of the file). If the pipeline/app crashes during execution it might be possible to recover the movie using the qtmoovrecover element. qtmoovrecover is an element that is also a pipeline. It is not meant to be used with other elements (it has no pads). It is merely a tool/utilitary to recover unfinished qtmux files. Fixes #601576 2010-01-27 19:06:53 -0800 Michael Smith * gst/quicktime/atoms.c: qtmux: for fixed-sample size streams (PCM audio, etc) don't allocate an enormous buffer that we then won't use at all. 2010-01-27 15:37:37 -0800 Michael Smith * gst/quicktime/gstqtmux.c: qtmux: handle muxing adpcm correctly. 2010-01-22 13:36:04 -0800 Michael Smith * gst/quicktime/atoms.c: qtmux: Set the mdia hdlr name field to what quicktime uses. Fix writing it since it's not null-terminated. Improves compatibility with some hardware players. 2010-01-22 13:30:07 -0800 Michael Smith * gst/quicktime/gstqtmux.c: qtmux: endianness in gstreamer is an int, not boolean. 2010-01-26 17:54:28 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: qtmux: streamline moov data memory storage In particular, use arrays rather than (double) linked lists. 2010-01-26 13:44:04 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: g_free is NULL safe 2010-01-20 13:30:48 +0100 Benjamin Otte * gst/quicktime/descriptors.c: * gst/quicktime/descriptors.h: * gst/quicktime/properties.c: [cleanup] Various style and cleanups Various fixes for gtk-doc warnings and making functions without arguments take void as parameter. 2010-01-14 08:09:03 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/gstqtmux.c: qtmux: Actually use new caps info on renegotiation Following the previous qtmux commit, this patch tries to use the new info added to the caps to fill the 'trak' atom's fields and children atoms. This way qtmux will use the late added 'codec_data' when h264parse adds it in the following pipeline: videotestsrc num-buffers=200 ! x264enc byte-stream=true ! \ h264parse output-format=0 ! qtmux ! \ filesink location=test.mov 2010-01-13 23:33:51 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/gstqtmux.c: qtmux: Do caps renegotiation when it only adds fields Qtmux can accept caps renegotiation if the new caps is a superset of the old one, meaning upstream added new info to the caps. This patch still doesn't make qtmux update any atoms info from the new info, but at least it doesn't reject the new caps anymore. A pipeline that reproduces this use case is: videotestsrc num-buffers=200 ! x264enc byte-stream=true ! \ h264parse output-format=0 ! qtmux ! \ filesink location=test.mov 2010-01-13 19:30:45 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: provide request pads under wider conditions Fixes #606859. 2010-01-13 10:35:00 -0300 Thiago Santos * gst/quicktime/gstqtmuxmap.c: qtmux: Only accept avc-sample h264 qtmux and mp4mux should only accept h264 in avc-sample format 2010-01-11 13:13:41 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: Rename aac's stream-format 'none' to 'raw' Renames aac's stream-format from previous commits from none to raw 2010-01-11 10:34:32 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: Only accept stream-format='none' aac Only accept raw aac streams (stream-format=none) to avoid generating invalid files. Fixes #604925 2009-12-28 11:34:35 +0200 Stefan Kost * gst/quicktime/gstqtmux.h: qtmux: also add .h file changes to unbreak the build 2009-12-27 23:51:50 +0200 Stefan Kost * gst/quicktime/gstqtmux.c: qtmux: use correct names from template for request pads The pads where names pad0, pad1, ... 2009-12-27 23:32:58 +0200 Stefan Kost * gst/quicktime/gstqtmux.c: qtmux: move errors _new_pad to the end 2009-12-21 13:58:30 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: Accept non-paired uint tags Adds support for unpaired unsigned interger tags 2009-12-21 12:05:37 -0300 Thiago Santos * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: qtmux: Adds new tags Maps more tags that are already posted by qtdemux Fixes #599759 2009-12-10 22:20:45 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: qtmux: support more of j2k Reads the new caps added to qtdemux by commit c917d65e6df0b5d585f905c7ad78a8a0a44b2cb0 and adds its corresponding atoms. Also adds support for image/x-jpc as it is the same as image/x-jp2, except that the buffers need to be boxed inside a jp2c isom box before muxing. To solve this the QTPads now have a function that (if not NULL) is called when a buffer is collected. This function returns a replacement to the current collected buffer. Fixes #598916 2009-12-10 16:53:19 -0300 Thiago Santos * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: Maps 'classification' tag for 3gpp files Adds the mapping of 'classification' tags to writing of 'clsf' atoms for gppmux. Based on a patch by: Lasse Laukkanen 2009-12-08 17:59:04 -0800 Michael Smith * gst/quicktime/atoms.c: * gst/quicktime/gstqtmux.c: qtmux: remove c++ comments and add some more comments. 2009-12-08 17:55:56 -0800 Michael Smith * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: add ima adpcm support 2009-11-25 21:41:27 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: replace _scale with _scale_round Use the rounding version for improved sync between streams. Small variations in the duration when muxing might lead to cumullative wrong timestamping when demuxing. Fixes #602936 2009-11-24 16:16:56 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: use timestamps for muxing Try to use timestamps even when the stream has out of order timestamps, only fall back to durations when we detect an out of order buffer. Improves sync between streams. 2009-11-19 18:28:52 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: fix missing debug argument Adds a missing debug argument 2009-11-19 11:36:14 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: fix misinforming debug statement 2009-11-19 11:14:57 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: ensure writable buffer metadata before setting caps 2009-10-29 08:36:02 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: support for SVQ3 Adds support for muxing SVQ3 content. Usually this format has decoder info that must be passed in the 'seqh' field in the caps. It is also good to add the gama atom to make quicktime not crash. Fixes #587922 2009-11-17 09:26:05 -0300 Thiago Sousa Santos * gst/quicktime/gstqtmux.c: qtmux: do not leak a string Frees a string after use. Also does some code organization 2009-11-16 14:57:53 -0300 Thiago Sousa Santos * gst/quicktime/atoms.c: qtmux: do not add size to the pointer variable Do not wrongly add the result of the function to the pointer to the buffer size. Instead, check the result to see if the serialization was ok. Based on a patch by: "Carsten Kroll " Fixes #602106 2009-11-06 10:34:39 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: handle 'late' streams When muxing streams, some can start later than others. qtmux now handle this by adding an empty edts entry with the duration of the 'lateness' to the stream's trak. It tolerates a stream to be up to 0.1s late. Fixes #586848 2009-11-05 21:35:56 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: qtmux: adds the EDTS and ELTS atoms to atoms.c These atoms will be useful for signaling streams that start later in the file. As well for adding edit lists if needed sometime later. 2009-11-06 00:46:12 -0300 Thiago Santos * gst/quicktime/atoms.c: * gst/quicktime/gstqtmux.c: qtmux: Adding some ifs for protection Adding somes ifs to protect against warning conditions that might happen when upstream element is not sane Fixes #600895 2009-10-16 10:47:32 -0300 Thiago Santos * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: gppmux: Add support for 3gr6 Keep track of the chunk durations to be able to add 3gr6 brand if it is a faststart file and the longest chunk is smaller than a sec. Implemented according to 3gpp TS 26.244 v6.4.0 (2005-09) Fixes #584361 2009-10-15 21:11:16 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: Only push ftyp later (in faststart mode) In faststart mode, there is no need to send the ftyp right at the beginning of the stream. Waiting and sending it only later (when the moov atom is ready to be sent) provides us with more information about the stream and we can better select the compatible brands. 2009-10-15 17:51:39 -0300 Thiago Santos * gst/quicktime/gstqtmux.c: qtmux: Improve error message Improve error message when we can't get or estimate the timestamp/duration of a buffer 2009-09-29 15:47:13 +0200 Marc-André Lureau * gst/quicktime/atoms.c: qtmux: fix flags_as_uint to flags[] 2009-08-04 12:58:35 +0200 Jan Urbanski * gst/quicktime/gstqtmux.c: qtmux: Don't require endianness field for 8 bit raw audio Fixes bug #590360. 2009-06-25 08:38:21 +0200 Edward Hervey * gst/quicktime/atoms.c: qtmux: Remove unused variable. 2009-06-25 08:38:10 +0200 Edward Hervey * gst/quicktime/gstqtmux.c: qtmux: Fix debug statement. 2009-06-11 15:54:42 +0200 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: qtmux: only use (64-bit) extended (mdat) atom size if needed. Fixes #585319. 2009-06-10 14:46:14 +0200 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: set default movie timescale to microsecond units 2009-06-10 13:24:20 +0200 Mark Nauwelaerts * gst/quicktime/atoms.c: qtmux: compress/optimize stsc writing 2009-06-10 12:42:44 +0200 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: qtmux: add 3GP style tagging (and refactor appropriately) 2009-06-01 23:00:44 +0200 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: qtmux (and variants): handle pixel-aspect-ratio. Fixes #584358. 2009-06-01 22:42:08 +0200 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmuxmap.c: gppmux: enhance ftyp brand heuristic. Fixes #584360. 2009-05-28 13:56:10 +0200 Mark Nauwelaerts * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: qtmux: use different stsd atom type for H263 for ISO and QT variants Fixes #584114. 2009-05-15 01:54:44 -0300 Thiago Santos * gst/quicktime/atoms.c: [qtmux] Fixes segfault when adding a blob as first tag. Moves tags data initialization to the function that actually appends the tags to the list. Fixes #582702 Also fixes some style caught by the pre-commit hook. 2009-05-10 21:21:36 +0200 Mark Nauwelaerts * gst/quicktime/gstqtmuxmap.c: gppmux: Add MPEG-4 part 2 to supported formats. Fixes #581593. 2009-05-07 17:53:42 +0100 Christian Schaller * gst/quicktime/gstqtmux.c: Add ranks to various muxers and encoders in -bad 2009-04-30 14:43:36 -0300 Thiago Santos * gst/quicktime/gstqtmuxmap.c: qtmux: changes caps of src pads to video/quicktime, variant=something Take a look at bug #580005 for further info. 2009-04-24 18:53:36 -0300 Thiago Santos * gst/quicktime/gstqtmuxmap.c: mp4mux: Changes src caps to application/x-iso-mp4 Fixes #580005 2009-03-25 21:24:44 +0100 Mark Nauwelaerts * gst/quicktime/gstqtmux.c: qtmux: fix reusing element State change to READY and then back to PAUSED should still provide the proper structures as are otherwise freshly available following a request_new_pad. Pointed out by Thiago Santos. 2009-03-23 11:17:39 +0100 Wim Taymans * gst/quicktime/gstqtmux.c: qtmux: fix includes for lseek -- 2009-03-20 14:20:16 +0100 LRN * gst/quicktime/gstqtmux.c: win32: fix seeking in large files Use _lseeki64() on Windows to seek in large files. Fixes #576021. 2009-03-02 10:57:35 +0100 Edward Hervey * gst/quicktime/gstqtmux.c: qtmux: Be a bit more verbose in our debug message when failing to renegotiate 2009-01-28 13:25:14 +0100 Mark Nauwelaerts * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmuxmap.c: Additional media type support in qtmux (and friends). Support AMR and H263 for both qtmux and gppmux, and add extensions in sample table description. 2009-01-09 21:59:48 +0000 David Schleef gst/quicktime/gstqtmuxmap.c: Add video/x-qt-part and video/x-m4-part to caps so schroenc/schroparse can use it. Fixes #5... Original commit message from CVS: * gst/quicktime/gstqtmuxmap.c: Add video/x-qt-part and video/x-m4-part to caps so schroenc/schroparse can use it. Fixes #566958 2008-12-19 18:53:47 +0000 Mark Nauwelaerts gst/quicktime/gstqtmux.c: Do not tempt or suggest to violate gst_collect_pads API specification. Original commit message from CVS: * gst/quicktime/gstqtmux.c: (gst_qt_mux_change_state): Do not tempt or suggest to violate gst_collect_pads API specification. 2008-12-19 18:33:47 +0000 Mark Nauwelaerts gst/quicktime/: Dual license qtmux LGPL/MIT. Fixes #564232. Original commit message from CVS: * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/descriptors.c: * gst/quicktime/descriptors.h: * gst/quicktime/fourcc.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: * gst/quicktime/properties.c: * gst/quicktime/properties.h: Dual license qtmux LGPL/MIT. Fixes #564232. 2008-12-16 16:26:52 +0000 Stefan Kost Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxing issues. Original commit message from CVS: * ext/celt/gstceltenc.c: * ext/celt/gstceltenc.h: * ext/metadata/gstmetadatamux.c: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxing issues. 2008-12-01 16:37:45 +0000 Mark Nauwelaerts gst/quicktime/atoms.c: Fix mj2 sample description metadata construction. Original commit message from CVS: * gst/quicktime/atoms.c: (build_jp2h_extension): Fix mj2 sample description metadata construction. 2008-11-18 01:09:09 +0000 David Schleef gst/quicktime/gstqtmux.c: Quiet a debugging message that I recently added. Original commit message from CVS: * gst/quicktime/gstqtmux.c: Quiet a debugging message that I recently added. 2008-11-15 02:56:31 +0000 David Schleef gst/quicktime/gstqtmux.*: Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part. Original commit message from CVS: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part. 2008-11-14 21:24:51 +0000 Mark Nauwelaerts gst/quicktime/: Revert previous commit. Original commit message from CVS: * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/descriptors.c: * gst/quicktime/descriptors.h: * gst/quicktime/fourcc.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: * gst/quicktime/properties.c: * gst/quicktime/properties.h: Revert previous commit. 2008-11-14 20:38:18 +0000 Mark Nauwelaerts gst/quicktime/: Dual license LGPL/MIT, as apparently supposed to. Original commit message from CVS: * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/descriptors.c: * gst/quicktime/descriptors.h: * gst/quicktime/fourcc.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: * gst/quicktime/properties.c: * gst/quicktime/properties.h: Dual license LGPL/MIT, as apparently supposed to. 2008-11-14 20:17:10 +0000 Mark Nauwelaerts gst/quicktime/: Cut detour in sample description extension construction. Original commit message from CVS: * gst/quicktime/atoms.c: (build_esds_extension), (build_mov_aac_extension), (build_jp2h_extension), (build_codec_data_extension): * gst/quicktime/atoms.h: * gst/quicktime/fourcc.h: * gst/quicktime/gstqtmux.c: (gst_qt_mux_audio_sink_set_caps), (gst_qt_mux_video_sink_set_caps): * gst/quicktime/gstqtmuxmap.c: (gst_qt_mux_map_format_to_header): Cut detour in sample description extension construction. Also actually implement ISO JPEG2000 mj2 format. 2008-11-11 19:31:35 +0000 Mark Nauwelaerts tests/check/: Add unit test for qtmux. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/qtmux.c: (setup_src_pad), (teardown_src_pad), (setup_qtmux), (cleanup_qtmux), (check_qtmux_pad), (GST_START_TEST), (qtmux_suite), (main): Add unit test for qtmux. 2008-11-11 19:24:12 +0000 Mark Nauwelaerts gst/quicktime/gstqtmux.c: Add some more safety/sanity checks in tag manipulation. Original commit message from CVS: * gst/quicktime/gstqtmux.c: (gst_qt_mux_add_metadata_tags): Add some more safety/sanity checks in tag manipulation. 2008-11-08 02:00:58 +0000 Thiago Sousa Santos Copy qtmux from revision 148 of the gst-qtmux repository. Original commit message from CVS: patch by: Thiago Sousa Santos * configure.ac: * gst/quicktime/Makefile.am: * gst/quicktime/atoms.c: * gst/quicktime/atoms.h: * gst/quicktime/descriptors.c: * gst/quicktime/descriptors.h: * gst/quicktime/fourcc.h: * gst/quicktime/ftypcc.h: * gst/quicktime/gstqtmux.c: * gst/quicktime/gstqtmux.h: * gst/quicktime/gstqtmuxmap.c: * gst/quicktime/gstqtmuxmap.h: * gst/quicktime/properties.c: * gst/quicktime/properties.h: Copy qtmux from revision 148 of the gst-qtmux repository. Fixes #550280. 2011-04-12 18:25:34 +0100 Tim-Philipp Müller * Android.mk: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/inspect/plugin-quicktime.xml: * gst/qtdemux/LEGAL: * gst/qtdemux/Makefile.am: * gst/qtdemux/gstrtpxqtdepay.c: * gst/qtdemux/gstrtpxqtdepay.h: * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: * gst/qtdemux/qtdemux.vcproj: * gst/qtdemux/qtdemux_dump.c: * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_lang.c: * gst/qtdemux/qtdemux_lang.h: * gst/qtdemux/qtdemux_types.c: * gst/qtdemux/qtdemux_types.h: * gst/qtdemux/qtpalette.h: * gst/qtdemux/quicktime.c: * gst/quicktime/LEGAL: * gst/quicktime/Makefile.am: * gst/quicktime/gstrtpxqtdepay.c: * gst/quicktime/gstrtpxqtdepay.h: * gst/quicktime/qtatomparser.h: * gst/quicktime/qtdemux.c: * gst/quicktime/qtdemux.h: * gst/quicktime/qtdemux.vcproj: * gst/quicktime/qtdemux_dump.c: * gst/quicktime/qtdemux_dump.h: * gst/quicktime/qtdemux_fourcc.h: * gst/quicktime/qtdemux_lang.c: * gst/quicktime/qtdemux_lang.h: * gst/quicktime/qtdemux_types.c: * gst/quicktime/qtdemux_types.h: * gst/quicktime/qtpalette.h: * gst/quicktime/quicktime.c: * po/POTFILES.in: qtdemux: rename directory to quicktime to match plugin name In preparation for qtmux moving to -good. 2011-04-12 11:49:54 +0200 Mark Nauwelaerts * gst/flv/gstflvdemux.c: flvdemux: simplify framerate fraction calculation 2011-01-24 15:45:28 -0600 Leonardo Sandoval * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: flvdemux: add width, height and framerate to caps when present on onMetaData Fixes #640483. 2010-08-24 13:57:55 +0200 Pascal Buhler * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: Unknown SSRC is not fatal https://bugzilla.gnome.org/show_bug.cgi?id=646966 2010-08-24 13:54:58 +0200 Pascal Buhler * gst/rtpmanager/rtpsession.c: rtpsession: Number of active sources should be updated whenever the status of the source changes to active Forward-ported by Olivier Crête https://bugzilla.gnome.org/show_bug.cgi?id=646965 2010-06-23 11:29:58 +0200 Havard Graff * gst/rtpmanager/rtpsession.c: rtpmanager: ignore a BYE if it is sent with our internal SSRC https://bugzilla.gnome.org/show_bug.cgi?id=646964 2010-01-29 09:49:48 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Adds more h264 fields to its caps Adds alignment=au and stream-format=avc to h264 caps Fixes #606662 2011-04-11 12:44:19 +0300 Stefan Kost * configure.ac: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: also handle deprecations for jack 1.9.7 Jack 1.9.7 was released 20.Mar.2011, need to handle the deprecated api for this version too. 2011-04-10 18:56:52 -0400 Thibault Saunier * Android.mk: * android/NOTICE: * android/apetag.mk: * android/avi.mk: * android/flv.mk: * android/gst/rtpmanager/gstrtpbin-marshal.c: * android/gst/rtpmanager/gstrtpbin-marshal.h: * android/gst/udp/gstudp-enumtypes.c: * android/gst/udp/gstudp-enumtypes.h: * android/gst/udp/gstudp-marshal.c: * android/gst/udp/gstudp-marshal.h: * android/icydemux.mk: * android/id3demux.mk: * android/qtdemux.mk: * android/rtp.mk: * android/rtpmanager.mk: * android/rtsp.mk: * android/soup.mk: * android/udp.mk: * android/wavenc.mk: * android/wavparse.mk: * gst/alpha/Makefile.am: * gst/apetag/Makefile.am: * gst/audiofx/Makefile.am: * gst/auparse/Makefile.am: * gst/autodetect/Makefile.am: * gst/avi/Makefile.am: * gst/cutter/Makefile.am: * gst/debugutils/Makefile.am: * gst/deinterlace/Makefile.am: * gst/effectv/Makefile.am: * gst/equalizer/Makefile.am: * gst/flv/Makefile.am: * gst/flx/Makefile.am: * gst/goom/Makefile.am: * gst/goom2k1/Makefile.am: * gst/icydemux/Makefile.am: * gst/id3demux/Makefile.am: * gst/imagefreeze/Makefile.am: * gst/interleave/Makefile.am: * gst/law/Makefile.am: * gst/level/Makefile.am: * gst/matroska/Makefile.am: * gst/monoscope/Makefile.am: * gst/multifile/Makefile.am: * gst/multipart/Makefile.am: * gst/qtdemux/Makefile.am: * gst/replaygain/Makefile.am: * gst/rtp/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/rtsp/Makefile.am: * gst/shapewipe/Makefile.am: * gst/smpte/Makefile.am: * gst/spectrum/Makefile.am: * gst/udp/Makefile.am: * gst/videobox/Makefile.am: * gst/videocrop/Makefile.am: * gst/videofilter/Makefile.am: * gst/videomixer/Makefile.am: * gst/wavenc/Makefile.am: * gst/wavparse/Makefile.am: * gst/y4m/Makefile.am: android: Make it ready for androgenizer Remove the android/ top dir Fixe the Makefile.am to be androgenized To build gstreamer for android we are now using androgenizer which generates the needed Android.mk files. Androgenizer can be found here: http://git.collabora.co.uk/?p=user/derek/androgenizer.git 2011-04-05 21:14:43 +0200 Haakon Sporsheim * gst/rtp/gstrtpgstpay.c: rtpgstpay: declare frag_offset to hold 32bits. As specified in documenation above and below. https://bugzilla.gnome.org/show_bug.cgi?id=646954 2011-04-09 12:41:48 +0200 Havard Graff * gst/rtpmanager/gstrtpsession.c: rtpsession: fix wrongly applied patch Obviously recv_rtp_sink does not have much to do with send_rtcp_src... See commit 046ff170. https://bugzilla.gnome.org/show_bug.cgi?id=647263 2011-04-08 15:59:58 +0100 Tim-Philipp Müller * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstmpegaudioparse.c: audioparsers: update for set_frame_props -> set_frame_rate API change 2011-04-08 00:03:21 +0100 Tim-Philipp Müller * tests/check/Makefile.am: * tests/check/elements/.gitignore: tests: hook up audioparser unit tests 2011-04-07 18:30:49 +0200 Mark Nauwelaerts * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: relax sync match a bit when draining ... to at least allow initial caps change (but no further caps jitter). Fixes unit test again after previous change. 2011-04-07 15:21:10 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videofilter.xml: docs: update for changes in git 2011-04-07 15:20:19 +0100 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-audioparsers.xml: docs: add audioparsers to docs 2011-04-07 15:07:15 +0100 Tim-Philipp Müller * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstaacparse.h: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstamrparse.h: * gst/audioparsers/plugin.c: aacparse, amrparse: gst_fooparse_xyz -> gst_foo_parse_xyz to match GstFooParse See moving-plugins checklist. 2011-04-07 14:43:42 +0100 Tim-Philipp Müller * configure.ac: * gst/audioparsers/Makefile.am: * gst/audioparsers/plugin.c: audioparsers: hook up to build 2011-04-07 13:26:41 +0100 Tim-Philipp Müller * gst/audioparsers/Makefile.am: * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstaacparse.h: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstac3parse.h: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstamrparse.h: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstdcaparse.h: * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: * gst/audioparsers/gstmpegaudioparse.c: * gst/audioparsers/gstmpegaudioparse.h: audioparsers: port to new GstBaseParse in core 2011-04-04 20:55:39 +0200 Mark Nauwelaerts * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: require tighter sync match when draining 2011-04-01 14:47:43 +0200 Sebastian Dröge * gst/audioparsers/gstmpegaudioparse.c: * gst/audioparsers/gstmpegaudioparse.h: mpegaudioparse: Parse encoder delay and encoder padding from the LAME header if present 2011-03-09 23:06:14 +0530 Arun Raghavan * gst/audioparsers/plugin.c: dcaparse: Bump rank to primary+1 Seems to work fine with a reasonably wide range of media, so bumping rank. 2011-03-23 22:02:37 +0530 Arun Raghavan * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstdcaparse.h: dcaparse: Expose frame size in caps This exports the size of the frame (number of bytes from one sync point to the next) as the "frame_size" field in caps. 2011-03-09 23:03:10 +0530 Arun Raghavan * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstdcaparse.h: dcaparse: Expose block size in caps This sets the "block_size" field on caps as the number of samples encoded in one frame. 2011-03-16 15:53:13 +0000 Tim-Philipp Müller * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: add FIXME for making the base class use xing seek tables better 2011-03-14 18:25:25 +0100 Sebastian Dröge * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstdcaparse.h: dcaparse: Add depth and endianness to the caps Some decoders can only handle specific endianness or a fixed depth and this allows better negotiation. Fixes bug #644208. 2011-02-26 13:53:44 -0800 David Schleef * gst/audioparsers/gstaacparse.c: Revert "aacparse: allow parsed frames on sink pad" This reverts commit e49b89d5c5a1244fa0dcb8bb4996e38fb9bff9e5. 2011-02-23 17:25:03 -0800 David Schleef * gst/audioparsers/gstaacparse.c: aacparse: allow parsed frames on sink pad 2010-10-13 16:12:02 -0700 David Schleef * tests/check/elements/parser.c: tests: fix baseparse test 2010-10-13 15:39:55 -0700 David Schleef * gst/audioparsers/Makefile.am: * gst/audioparsers/gstaacparse.h: * gst/audioparsers/gstac3parse.h: * gst/audioparsers/gstamrparse.h: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: * gst/audioparsers/gstdcaparse.h: * gst/audioparsers/gstflacparse.h: * gst/audioparsers/gstmpegaudioparse.h: baseparse: Create baseparse library 2011-02-07 14:46:57 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: tune QUERY_SEEKING response Even if we currently do not have a duration yet, assume seekable if it looks like we'll likely be able to determine it later on (which coincides with needed information to perform seeking). Fixes #641047. 2011-02-08 23:39:24 +0530 Arun Raghavan * gst/audioparsers/gstbaseparse.c: baseparse: Update min/max bitrate before first posting them This avoids posting an initial min-bitrate of G_UINTMAX and max-bitrate of 0. https://bugzilla.gnome.org/show_bug.cgi?id=641857 2011-02-08 23:50:13 +0530 Arun Raghavan * gst/audioparsers/gstmpegaudioparse.c: * gst/audioparsers/gstmpegaudioparse.h: mpegaudioparse: Post CBR bitrate as nominal bitrate Even if VBR headers are missing, we can't guarantee that a stream is in fact a CBR stream, so it's safer to let baseparse calculate the average bitrate rather than assume a CBR stream. However, in order to make /some/ metadata available before the requisite number of frames have been parsed, this posts the bitrate from the non-VBR headers as the nominal bitrate. https://bugzilla.gnome.org/show_bug.cgi?id=641858 2010-09-06 14:10:11 +0200 Mark Nauwelaerts * gst/audioparsers/gstamrparse.c: amrparse: a valid amr-wb frame should not have reserved frame type index See #639715. 2011-01-27 16:52:34 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: improve handling of dependent substream frames In particular, timestamps of these should track main-stream timestamps. 2011-01-21 14:53:39 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: tune default duration estimate update interval Rather than a fixed default frame count, estimate frame count to aim for an interval duration depending on fps if available, otherwise use old fixed default. 2011-01-14 15:16:04 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: reverse playback; mind keyframes for fragment boundary 2011-01-13 15:26:21 +0100 Mark Nauwelaerts * gst/audioparsers/gstamrparse.c: amrparse: properly check for sufficient available data prior to access 2011-01-12 14:40:37 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: ensure non-empty candidate frames 2011-01-11 15:24:23 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: clarify some debug statements 2011-01-11 15:24:02 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: properly track upstream timestamps ... rather than with a delay. 2011-01-11 15:23:29 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: need proper frame duration to obtain sensible frame bitrate 2011-01-11 15:22:51 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: proper initial values for index tracking variables 2011-01-11 12:05:13 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: arrange for consistent event handling 2011-01-10 16:59:59 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.h: baseparse: header style cleaning 2011-01-10 17:07:38 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: provide some more initial frame metadata in parse_frame ... and document accordingly. 2011-01-10 16:56:36 +0100 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: * gst/audioparsers/gstflacparse.c: baseparse: refactor passthrough into format flags Also add a format flag to signal baseparse that subclass/format can provide (parsed) timestamp rather than an estimated one. In particular, such "strong" timestamp then allows to e.g. determine duration. 2011-01-10 15:34:48 +0100 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstmpegaudioparse.c: baseparse: introduce a baseparse frame to serve as context ... and adjust subclass parsers accordingly 2011-01-07 16:39:51 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: restrict duration scanning to pull mode and avoid extra set_caps call 2011-01-07 15:58:49 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: update some documentation Also add some more debug. 2011-01-06 11:41:44 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: allow increasing min_size for current frame parsing only Also check that subclass actually either directs to skip bytes or increases expected frame size to avoid going nowhere in bogus indefinite looping. 2011-01-14 15:26:37 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baesparse: fix refactor regression in loop based parsing 2011-01-06 11:16:56 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: pass all available data to subclass rather than minimum Also reduce some adapter calls and add a few debug statements. 2010-12-10 15:59:49 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: fix reverse playback handling 2010-12-10 14:56:13 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: minor typo and debug statement cleanup 2010-12-10 14:40:05 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: reduce locking ... which is either already mute and/or implicitly handled by STREAM_LOCK. 2011-01-14 14:08:38 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: avoid loop in frame locating interpolation 2011-01-19 18:26:30 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: mind gst_buffer_unref not liking NULL Fixes #639950. 2011-01-14 16:30:11 -0300 Thiago Santos * gst/audioparsers/gstbaseparse.c: audioparsers: baseparse: Be careful to not lose the event ref Don't unref the event if it hasn't been handled, because the caller assumes it is still valid and might reuse it. I ran into this problem when transcoding an AVI (with mp3 inside) to gpp. https://bugzilla.gnome.org/show_bug.cgi?id=639555 2011-01-13 17:10:13 +0000 Tim-Philipp Müller * gst/audioparsers/gstdcaparse.c: dcaparse: fix sync word for 14-bit little endian coding Fix copy'n'paste bug that made us look for the raw little endian sync word twice instead of looking for the 14-bit LE sync word as well. Fixes parsing of such streams (see #636234 for sample file). 2011-01-13 16:27:04 +0000 Tim-Philipp Müller * gst/audioparsers/gstbaseparse.c: docs: minor baseparse docs/comment fixes Remove copy'n'paste leftovers. 2011-01-06 12:49:43 +0100 Edward Hervey * gst/audioparsers/gstflacparse.c: flacparse: Fix unitialized variable on macosx 2010-12-13 15:17:29 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: relax bsid checking ... to the widest possible spec interpretation. Fixes #637062. 2010-12-03 18:11:56 +0100 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: audioparsers: update some documentation 2010-12-03 18:11:38 +0100 Mark Nauwelaerts * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: add to documentation 2010-12-03 18:11:09 +0100 Mark Nauwelaerts * gst/audioparsers/gstdcaparse.c: dcaparse: add to documentation 2010-11-08 19:58:31 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: increase keyframe awareness ... which is not particular relevant for audio parsing, but more so in video cases. In particular, auto-determine if dealing with video (caps). 2010-12-01 15:28:53 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstac3parse.h: ac3parse: use proper EAC-3 caps 2010-11-30 15:41:02 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: avoid unexpected stray metadata 2010-11-30 15:40:28 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: use proper _NONE output value when applicable 2010-11-25 18:56:42 +0100 Edward Hervey * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstbaseparse.c: audioparsers: Remove dead assignments 2010-11-25 17:14:23 +0100 Andoni Morales Alastruey * gst/audioparsers/gstbaseparse.c: audioparse: fix possible division-by-zero https://bugzilla.gnome.org/show_bug.cgi?id=635786 2010-11-17 16:23:42 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: use correct offset when adding index entry ... bearing in mind that BUFFER_OFFSET is media specific and may not reflect the basic offset after having been parsed. 2010-11-17 14:30:09 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: enhancements for timestamp marked framed formats That is, as such formats allow subclass to extract position from frame, it is possible to extract duration (if not otherwise provided) from (near) last frame, and a seek can fairly accurately target the required position. Fixes #631389. 2010-11-16 17:06:14 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: refactor frame scanning peformed by _loop 2010-11-16 18:04:00 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: slightly optimize sending of pending newsegment events 2010-11-16 17:04:35 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: minor fixes and enhancements Arrange for upstream as well as downstream flushing when seeking. Also determine upstream size as well as seekability. Adjust some comments to reality and employ debug statement in proper order. 2010-11-17 15:33:36 +0100 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: aacparse: minor cleanups 2010-11-17 15:24:37 +0100 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: aacparse: fix regression in ADIF src caps setting 2010-11-16 12:11:53 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: flacparse: parse seektable Fixes #631389 (partially). 2010-11-16 12:08:54 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: minor refactor and enable default baseparse segment clipping 2010-11-09 19:38:25 +0100 Mark Nauwelaerts * gst/audioparsers/gstmpegaudioparse.c: mpegaudioparse: fix silly leak in _reset 2010-10-29 14:08:58 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: use only upstream duration if it provides one 2010-10-25 14:15:50 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: reflow update_bitrate code ... which makes local variables represent real state better, and avoids triggering unneeded updates/actions. 2010-10-25 14:13:51 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: add some debug statements 2010-10-19 23:25:54 +0100 Tim-Philipp Müller * gst/audioparsers/gstdcaparse.c: dcaparse: init variable to make osx build bot happy gstdcaparse.c: In function 'gst_dca_parse_check_valid_frame': gstdcaparse.c:246: warning: 'best_sync' may be used uninitialized in this function 2010-10-19 00:15:20 +0100 Tim-Philipp Müller * gst/audioparsers/Makefile.am: * gst/audioparsers/gstdcaparse.c: * gst/audioparsers/gstdcaparse.h: * gst/audioparsers/plugin.c: audioparsers: add very basic dts/dca parser Still some issues, e.g. with seekable queries in totem, but also processing already-chunked input (created with matroskademux ! gdppay). 2010-10-14 16:48:21 +0200 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: properly parse e-ac3 frame header Also add a few debug statements. 2010-10-13 11:00:01 +0200 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: tweak setting buffer metadata; avoid timestamp jitter Fixes #631993. 2010-10-12 18:07:49 +0200 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstaacparse.h: aacparse: streamline src caps setting In particular, also set src caps whenever changes in stream warrant doing so. 2010-10-12 10:28:33 +0200 Sebastian Dröge * tests/check/elements/flacparse.c: flacparse: Adjust unit tests to new flacparse behaviour Garbage after frames is now included in the frames because flacparse has no easy way to detect the real end of a frame. Decoders are expected to everything after the frame because only decoding the bitstream will reveal the real end of the frame. Fixes bug #631814. 2010-10-12 10:27:53 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Don't drop the last frame if it is followed by garbage See bug #631814. 2010-10-11 17:49:46 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: perform bitrate handling and posting after newsegment sending 2010-10-11 17:36:19 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: immediately post subclass provided bitrate 2010-10-11 17:06:48 +0200 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: fix parsing with unknown framesizes Fixes #631814 (mostly). 2010-10-07 23:37:36 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Simplify frame header parsing by using lookup tables Based on a patch by Felipe Contreras. See bug #631200. 2010-10-07 23:28:08 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: flacparse: Don't parse the complete FLAC frames but only look for valid frame headers Thanks to Felipe Contreras for the suggestion. This is partially based on his patches and makes flacparse more than 3.5 times faster. Looking for valid frame headers is unlikely to give false positives because every frame header is at least 9 bytes long, contains a 14 bit sync code and a 8 bit checksum over the first 8 bytes. Fixes bug #631200. 2010-10-06 18:32:51 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Really post tags only after the initial newsegment event The first newsegment event will be send by the first call to gst_base_parse_push_buffer() if necessary, posting the tags before that is not a good idea. Instead do it from the GstBaseParse::pre_push_buffer vfunc. 2010-10-05 11:17:52 +0100 Tim-Philipp Müller * gst/audioparsers/gstbaseparse.c: Revert "baseparse: add skip property" This reverts commit b5a3d60363d837a10f0533c141ec93d10b742312. Reverting this for now, since no one really seems to remember why this property exists or what it could possibly be good for. It seems to have been in the original mp3parse since the beginning of time and was back- ported from there. 2010-10-04 10:41:52 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Fix uninitialized variable compiler warnings These warnings are wrong, the variables are only used if they were initialized by the bit reader. 2010-09-14 02:48:58 +0300 Felipe Contreras * gst/audioparsers/gstflacparse.c: flacparse: fix picture parsing Signed-off-by: Felipe Contreras 2010-10-03 23:54:49 +0200 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Push tags before the header buffers are pushed 2010-08-02 20:50:21 +0300 Felipe Contreras * gst/audioparsers/gstflacparse.c: flacparse: trivial caps fix Signed-off-by: Felipe Contreras 2010-10-03 23:50:29 +0200 Sebastian Dröge * gst/audioparsers/gstbaseparse.c: audioparser: Let the format string agree with the parameters to fix compiler warning 2010-10-03 15:41:20 +0200 Sebastian Dröge * gst/audioparsers/gstac3parse.c: ac3parse: Use unchecked versions of the bitreader get functions We didn't check the return values anyway... 2010-09-22 15:44:43 +0530 Arun Raghavan * gst/audioparsers/gstbaseparse.c: baseparse: Fix debug output We lose the reference to the buffer after gst_pad_push(), so the debug print should happen before. https://bugzilla.gnome.org/show_bug.cgi?id=622276 2010-10-01 12:34:55 +0200 Mark Nauwelaerts * tests/check/elements/flacparse.c: * tests/check/elements/parser.c: * tests/check/elements/parser.h: audioparsers: add flacparse unit test ... and tweak parser test helper in the process. 2010-09-29 16:12:42 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: support reverse playback ... in pull mode or upstream driven. 2010-09-27 12:16:43 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: remove done TODOs and update documentation 2010-09-25 14:40:54 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: use determined seekability in answering SEEKING query 2010-09-25 14:32:06 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: add skip property 2010-09-25 13:59:39 +0200 Mark Nauwelaerts * tests/check/elements/ac3parse.c: * tests/check/elements/mpegaudioparse.c: audioparsers: add ac3parse and mpegaudioparse unit test 2010-09-25 13:59:18 +0200 Mark Nauwelaerts * gst/audioparsers/Makefile.am: * gst/audioparsers/gstmpegaudioparse.c: * gst/audioparsers/gstmpegaudioparse.h: * gst/audioparsers/plugin.c: mpegaudioparse: initial version ... adequately equivalent to mp3parse, so lets boldly set it to higher rank. 2010-09-25 14:01:07 +0200 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: aacparse: set minimum frame size at _start ... rather than one time at _init. 2010-09-25 13:50:51 +0200 Mark Nauwelaerts * tests/check/elements/aacparse.c: * tests/check/elements/amrparse.c: * tests/check/elements/parser.c: * tests/check/elements/parser.h: audioparsers: refactor existing unit tests using common helper 2010-09-22 15:07:09 +0200 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: use _set_frame_props to configure frame lead_in and lead_out ... provided a corresponding decoder with sufficient leading and following frames to carry out full decoding for a particular segment. 2010-09-22 14:13:17 +0200 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: * gst/audioparsers/gstflacparse.c: baseparse: use _set_duration to configure duration update interval ... as it logically belongs there as one or the other; either subclass can provide a duration, or an estimate must be made (reguarly updated). 2010-09-22 13:55:20 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: localize use of provided fps information 2010-09-22 12:13:12 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: seek table and accurate seek support 2010-09-21 13:57:10 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: proper and more extended segment and seek handling That is, loop pause handling, segment seek support, newsegment for gaps, etc 2010-09-21 10:57:04 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: add index support 2010-09-21 09:59:56 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: refactor state reset 2010-09-20 16:39:37 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: prevent indefinite resyncing 2010-09-20 13:57:55 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: specific EOS handling if no output so far 2010-09-20 13:31:57 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: adjust _set_frame_prop documentation and set default as claimed 2010-09-20 13:30:54 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: fix bitrate copy-and-paste and update heuristic 2010-09-17 18:33:29 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: post duration message if average bitrates is updated 2010-09-17 18:24:22 +0200 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: remove is_seekable vmethod and use a set_seek instead Seekability, like duration, etc is unlikely to change (frequently), and the default assumption covers most cases, so let subclass set when needed. At the same time, allow subclass to indicate if it has seek-metadata (table) available, and possibly have it provide an average bitrate. 2010-09-17 17:35:40 +0200 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: remove redundant default is_seekable 2010-09-17 17:21:46 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: add another hook for subclass prior to pushing buffer ... and allow subclass to perform custom segment clipping, or to emit tags or messages at this time. 2010-09-17 17:19:37 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: 0 converts to 0 by default 2010-09-16 18:56:46 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: basepase: refactor conversion using helper function and export default convert 2010-09-16 18:35:47 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: streamline query handling 2010-09-16 11:51:20 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: cleanup struct and remove unused member 2010-08-16 11:04:37 +0200 Mark Nauwelaerts * gst/audioparsers/plugin.c: audioparsers: increase ranks to enable auto-plugging Because we can, and should, have some shakedown testing before having these make it into -good later on ... 2010-09-22 16:07:24 +0530 Arun Raghavan * gst/audioparsers/gstbaseparse.c: baseparse: Allow chaining of subclass event handlers This allows the child class to chain its event handler with GstBaseParse, so that subclasses don't have to duplicate all the default event handling logic. https://bugzilla.gnome.org/show_bug.cgi?id=622276 2010-08-27 18:35:10 +0200 Sebastian Dröge * gst/audioparsers/gstbaseparse.c: baseparse: Don't use GST_FLOW_IS_FATAL() Also don't post an error message for UNEXPECTED and do it for NOT_LINKED. 2010-09-06 14:12:00 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: non-TIME seek event is simply not handled 2010-06-15 15:34:05 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: fix seek event ref handling 2010-06-15 15:33:37 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: prevent arithmetic overflows in pull mode buffer cache handling 2010-06-15 15:32:34 +0200 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: fix seek handling Allow a few more seek event type combinations, and really use the result of gst_segment_set_seek to perform the seek. Also add some debug. 2010-04-12 18:07:29 +0200 Edward Hervey * tests/check/elements/aacparse.c: * tests/check/elements/amrparse.c: check: Don't re-declare 'GList *buffers' in the tests It's an external which lives in gstcheck.c. Redeclaring it makes some compilers/architectures think the 'buffers' in the individual tests are a different symbol... and therefore we end up comparing holodecks with oranges. 2010-03-26 18:56:49 +0000 Arun Raghavan * gst/audioparsers/gstbaseparse.c: baseparse: Don't emit bitrate tags too early We wait to parse a minimum number of frames (10, arbitrarily) before emiting bitrate tags so that our early estimates are not wildly inaccurate for streams that start with a silence. If the stream ends before that, we just emit the tags anyway. While it _would_ be nicer to be specify the threshold to start pushing the tags in terms of duration, this would introduce more complexity than this merits. https://bugzilla.gnome.org/show_bug.cgi?id=614991 2010-03-26 18:58:35 +0100 Sebastian Dröge * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: flacparse: Optionally check the overall frame checksums too before accepting a frame as valid This is optional because it's a quite expensive operation and it's very unlikely that a non-frame is detected as frame after the header CRC check and checking all bits for valid values. The overall frame checksums are mainly useful to detect inconsistencies in the encoded payload. 2010-03-26 18:42:28 +0100 Sebastian Dröge * gst/audioparsers/gstflacparse.c: flacparse: Check the CRC-8 of the headers before accepting a frame as valid This makes false-positives during seeking much less likely and detection of them much faster. 2010-03-26 18:20:24 +0100 Sebastian Dröge * gst/audioparsers/gstbaseparse.c: baseparse: Set the last stop to the buffer starttime if the duration is invalid ...instead of not setting it at all. 2010-03-26 18:19:00 +0100 Joshua M. Doe * gst/audioparsers/gstbaseparse.c: baseparse: Send NEWSEGMENT event with correct start and position Instead of taking the last stop (which could be buffer endtime instead of starttime) always take the buffer starttime. Fixes bug #614016. 2010-03-26 16:49:01 +0000 Arun Raghavan * gst/audioparsers/gstflacparse.c: flacparse: Fix buffer refcount issue When called from the GST_FLAC_PARSE_STATE_HEADERS case, gst_flac_parse_hand_headers() does a gst_buffer_set_caps() on a buffer with refcount > 1. This change handles this case by making the buffer metadata_Writable. https://bugzilla.gnome.org/show_bug.cgi?id=614037 2010-03-25 17:09:17 +0000 Tim-Philipp Müller * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: audioparsers: remove unused GstBaseParseClassPrivate structure 2010-03-25 12:55:02 +0000 Arun Raghavan * gst/audioparsers/gstflacparse.c: flacparse: Make bitrate estimation more accurate This implements the get_frame_overhead() vfunc so that baseparse can make more accurate bitrate estimates. 2010-03-25 11:48:46 +0000 Arun Raghavan * gst/audioparsers/gstaacparse.c: aacparse: Fix bitrate calculation This patch adds the get_frame_overhead() vfunc so that baseparse can accurately calculate the min/avg/max bitrates for aacparse. Note: The bitrate was being incorrectly calculated for ADTS streams (it's not in the header as the code suggests). 2010-03-25 11:22:58 +0000 Arun Raghavan * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: audioparsers: Add bitrate calculation to baseparse This makes baseparse keep a running average of the stream bitrate, as well as the minimum and maximum bitrates. Subclasses can override a vfunc to make sure that per-frame overhead from the container is not accounted for in the bitrate calculation. We take care not to override the bitrate, minimum-bitrate, and maximum-bitrate tags if they have been posted upstream. We also rate-limit the emission of bitrate so that it is only triggered by a change of >10 kbps. 2010-03-22 16:56:03 +0100 Benjamin Otte * tests/check/elements/amrparse.c: Add -Wold-style-definition and fix the warnings 2010-03-21 21:39:18 +0100 Benjamin Otte * tests/check/elements/aacparse.c: * tests/check/elements/amrparse.c: Add -Wmissing-declarations -Wmissing-prototypes to configure flags And fix all warnings 2010-03-18 17:30:26 +0100 Benjamin Otte * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstamrparse.c: gst_element_class_set_details => gst_element_class_set_details_simple 2010-01-14 11:50:33 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: audioparsers: rename baseparse GType name to avoid possible conflicts 2010-01-12 18:55:53 +0100 Edward Hervey * gst/audioparsers/gstflacparse.c: flacparse: Initialize variables. Fixes build on $#@*( macosx 2010-01-11 22:41:57 +0300 * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstamrparse.c: win32: Include config.h before anything else. Fix mpegdemux LIBADD Because config.h defines __MSVCRT_VERSION__, which should be defined before inclusion of any system header. Also fixes mpegdemux Makefile.am LIBADD typo. Fixes #606665 2010-01-11 13:20:26 -0300 Thiago Santos * gst/audioparsers/gstaacparse.c: aacparse: Also add stream-format to template caps Do not forget to add stream-format to template caps off aacparse 2010-01-11 13:13:41 -0300 Thiago Santos * gst/audioparsers/gstaacparse.c: * tests/check/elements/aacparse.c: Rename aac's stream-format 'none' to 'raw' Renames aac's stream-format from previous commits from none to raw 2010-01-11 12:10:02 -0300 Thiago Santos * tests/check/elements/aacparse.c: aacparse: update tests to stream-format changes Updates aacparse unit tests to check for stream-format correctness as well. 2010-01-11 10:51:18 -0300 Thiago Santos * gst/audioparsers/gstaacparse.c: aacparse: Add stream-format to output caps Adds stream-format field to output caps 2010-01-05 15:05:05 +0100 Mark Nauwelaerts * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstbaseparse.c: audioparsers: documentation fixes 2010-01-05 15:04:38 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: add documentation 2010-01-05 14:48:49 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: flacparse: add documentation 2009-12-21 18:29:43 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: perform additional frame checks when resyncing 2010-01-05 16:35:52 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: fix (multiple channel) frame parsing 2010-01-05 16:35:44 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: declare unparsed input and parsed output 2009-12-21 18:19:23 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: fix scanning for next syncword 2009-12-21 18:18:39 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: adjust seek handling and newsegment sending Perform sanity check on type of seek, and only perform one that is appropriately supported. Adjust downstream newsegment event to first buffer timestamp that is sent downstream. 2009-12-21 11:59:45 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: minor refactor cleanup Also add some debug logging. 2009-12-18 21:05:11 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: locate next sync code more efficiently 2009-12-18 21:04:12 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: baseparse takes care of handling leftover pieces 2009-12-18 21:02:40 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: implement leftover draining in pull mode 2009-12-17 12:45:36 +0100 Mark Nauwelaerts * gst/audioparsers/gstflacparse.c: flacparse: set _OFFSET and _OFFSET_END on outgoing buffers 2009-12-17 12:44:20 +0100 Mark Nauwelaerts * gst/audioparsers/Makefile.am: * gst/audioparsers/gstflacparse.c: * gst/audioparsers/gstflacparse.h: * gst/audioparsers/plugin.c: audioparsers: move 'flacparse' into it 2009-12-16 18:38:33 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: provide default conversion using bps if no fps available Also store estimated duration as such, rather than pretending otherwise (e.g. set by subclass). 2009-12-18 13:30:29 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: check for remaining data when draining in push mode 2009-12-18 13:30:07 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: baseparse: fix pull mode cache size comparison 2009-12-18 13:01:17 +0100 Edward Hervey * gst/audioparsers/gstac3parse.c: ac3parse: Fix unitialized variable. 2009-12-17 14:46:01 +0000 Christian Schaller * gst/audioparsers/Makefile.am: Update spec file and fix ac3parser header listing in Makefile.am 2009-12-11 10:25:16 -0800 Michael Smith * gst/audioparsers/gstbaseparse.c: audioparse: fix a format string as reported on irc. 2009-11-23 16:34:50 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: ensure sufficient data available for parsing 2009-10-29 15:19:04 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: extract and use some more details for Enhanced Ac-3 streams 2009-10-29 15:18:37 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: baseparse: custom bufferflag indicates not to count frame in stats 2009-10-28 14:08:43 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: perform additional frame checks when resyncing 2009-10-28 14:07:17 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: inform base parser of frame duration 2009-10-27 16:16:50 +0100 Mark Nauwelaerts * gst/audioparsers/gstac3parse.c: ac3parse: improve src caps settings 2009-11-27 17:59:03 +0100 Mark Nauwelaerts * gst/audioparsers/Makefile.am: * gst/audioparsers/gstac3parse.c: * gst/audioparsers/gstac3parse.h: * gst/audioparsers/plugin.c: ac3parse: initial version MARGINAL rank for now; might take some time for some (useful) framed=true/false to appear here and there. 2009-11-26 18:34:45 +0100 Mark Nauwelaerts * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstamrparse.h: amrparse: use (default) time handling of baseparser class 2009-11-26 18:15:21 +0100 Mark Nauwelaerts * gst/audioparsers/Makefile.am: * gst/audioparsers/gstamrparse.c: * gst/audioparsers/gstamrparse.h: * gst/audioparsers/plugin.c: audioparsers: move 'amrparse' into it 2009-11-27 17:27:32 +0100 Mark Nauwelaerts * gst/audioparsers/gstbaseparse.c: audioparsers: reference GstBaseParse now lives here 2009-11-28 18:13:31 +0100 Mark Nauwelaerts * gst/aacparse/Makefile.am: * gst/aacparse/gstaacparse.c: * gst/aacparse/gstaacparse.h: * gst/aacparse/gstbaseparse.c: * gst/aacparse/gstbaseparse.h: * gst/aacparse/plugin.c: * gst/audioparsers/Makefile.am: * gst/audioparsers/gstaacparse.c: * gst/audioparsers/gstaacparse.h: * gst/audioparsers/gstbaseparse.c: * gst/audioparsers/gstbaseparse.h: * gst/audioparsers/plugin.c: audioparsers: rename 'aacparse' plugin to generic 'audioparsers' plugin 2009-11-26 17:04:43 +0100 Mark Nauwelaerts * gst/aacparse/Makefile.am: * gst/aacparse/gstaacparse.c: * gst/aacparse/plugin.c: aacparse: separate plugin registration and rename plugin 2009-11-26 17:04:36 +0100 Mark Nauwelaerts * gst/aacparse/gstaacparse.c: aacparse: ensure sufficient data available before accessing 2009-11-05 14:31:40 +0100 Mark Nauwelaerts * gst/aacparse/gstaacparse.c: * gst/aacparse/gstaacparse.h: aacparse: use (default) time handling of baseparser class 2009-10-29 15:19:35 +0100 Mark Nauwelaerts * gst/aacparse/gstaacparse.c: aacparse: fixup comments to C-style 2009-10-29 16:05:00 +0100 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: reset passthrough mode to default (disabled) on activation 2009-10-29 15:16:59 +0100 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: ensure buffer metadata is writable 2009-10-28 14:06:13 +0100 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: * gst/aacparse/gstbaseparse.h: baseparse: fix/enhance DISCONT marking In particular, consider DISCONT == !sync, and allow subclass to query sync state, as it may want to perform additional checks depending on whether sync was achieved earlier on. Also arrange for subclass to query whether leftover data is being drained. 2009-11-23 15:48:25 +0100 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: * gst/aacparse/gstbaseparse.h: baseparse: add timestamp handling, and default conversion In particular, (optionally) provide baseparse with a notion of frames per second (and therefore also frame duration) and have it track frame and byte counts. This way, subclass can provide baseparse with fps and have it provide default buffer time metadata and conversions, though subclass can still install callbacks to handle such itself. 2009-10-28 12:02:03 +0100 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: documentation fixes 2009-10-28 12:00:08 +0100 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: use_fixed_caps for src pad After all, stream is as-is, and there is little molding to downstream's taste that can be done. If subclass can and wants to do so, it can still override as such. 2009-11-20 17:32:13 +0100 Julien Moutte * gst/aacparse/gstbaseparse.c: aacparse: Fix compilation warnings 2009-10-11 11:22:11 +0200 Josep Torra * gst/aacparse/gstaacparse.c: * gst/aacparse/gstbaseparse.c: aacparse: fix warnings in macosx snow leopard 2009-09-25 17:02:53 +0200 Mark Nauwelaerts * gst/aacparse/gstaacparse.c: * gst/aacparse/gstbaseparse.c: * gst/aacparse/gstbaseparse.h: aacparse: forego (bogus) parsing of already parsed (raw) input 2009-08-07 13:07:17 +0200 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: prevent infinite loop when draining 2009-08-07 13:06:28 +0200 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: fix minor memory leak 2009-07-14 14:08:04 +0200 Sebastian Dröge * gst/aacparse/gstbaseparse.c: * gst/aacparse/gstbaseparse.h: aacparse: Add function for the baseparse subclass to push buffers downstream Also handle the case gracefully where the subclass decides to drop the first buffers and has no caps set yet. It's still required to have valid caps set when the first buffer should be passed downstream. 2009-07-14 14:07:44 +0200 Sebastian Dröge * gst/aacparse/gstbaseparse.c: baseparse: Fix seek event leaking 2009-06-18 12:13:28 +0200 Mark Nauwelaerts * gst/aacparse/gstaacparse.c: aacparse: ADIF: do not send bogus timestamps, leave to downstream (decoder) 2009-06-01 15:53:27 +0100 Tim-Philipp Müller * gst/aacparse/gstaacparse.c: aacparse: fix sample rate extraction from codec data In one case we extracted the sample rate index from the codec data and saved it as sample rate rather than getting the real sample rate from the table. Fix that, and also make sure we don't access non-existant table entries by adding a small helper function that guards against out-of-bounds access in case of invalid input data. 2009-06-01 14:02:33 +0100 Tim-Philipp Müller * gst/aacparse/gstaacparse.c: aacparse, amrparse: remove bogus gst_pad_fixate_caps() calls 2009-06-01 13:56:18 +0100 Tim-Philipp Müller * gst/aacparse/gstbaseparse.c: baseparse: propagate return value of GstBaseParse::set_sink_caps() gst_base_parse_sink_setcaps() presumably should fail if the subclass returns FALSE from its ::set_sink_caps() function. 2009-06-01 13:47:01 +0100 Tim-Philipp Müller * gst/aacparse/gstbaseparse.c: baseparse: don't try to GST_LOG an already-freed caps string The proper way to log caps is via GST_PTR_FORMAT anyway. 2009-06-01 13:05:35 +0100 Tim-Philipp Müller * gst/aacparse/gstaacparse.c: * tests/check/elements/aacparse.c: aacparse: set channels and rate on output caps, and keep codec_data Create output caps from input caps, so we maintain any fields we might get on the input caps, such as codec_data or rate and channels. Set channels and rate on the output caps if we don't have input caps or they don't contain such fields. We do this partly because we can, but also because some muxers need this information. Tagreadbin will also be happy about this. 2009-05-26 19:43:53 +0200 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: fix debug category 2009-04-27 22:39:15 +0200 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: fix (regression in) newsegment handling (aacparse, amrparse, flacparse). Fixes #580133. 2009-04-07 04:53:02 +0300 René Stadler * gst/aacparse/gstbaseparse.c: baseparse: Fix slightly broken buffer-in-segment check (aacparse, amrparse, flacparse) 2009-04-05 03:50:19 +0300 René Stadler * gst/aacparse/gstbaseparse.c: baseparse: Fix push mode seeking (aacparse, amrparse) Sending the flush-start event forward before taking the stream lock actually works, in contrast to deadlocking in downstream preroll_wait (hunk 1). After that we get the chain function being stuck in a busy loop. This is fixed by updating the minimum frame size inside the synchronization loop because the subclass asks for more data in this way (hunk 2). Finally, this leads to a very probable crash because the subclass can find a valid frame with a size greater than the currently available data in the adapter. This makes the subsequent gst_adapter_take_buffer call return NULL, which is not expected (hunk 3). 2009-03-31 16:07:46 +0200 Mark Nauwelaerts * gst/aacparse/gstbaseparse.c: baseparse: Delay newsegment as long as possible. If newsegment is sent (too) early, caps may not yet be fixed/set, and downstream may not have been linked. 2009-03-19 01:17:25 +0200 René Stadler * gst/aacparse/gstaacparse.c: aacparse: Fix busyloop when seeking. Fixes #575388 The problem is that after a discont, set_min_frame_size(1024) is called when detect_stream returns FALSE. However, detect_stream calls check_adts_frame which sets the frame size on its own to something larger than 1024. This is the same situation as in the beginning, so the base class ends up calling check_valid_frame in an endless loop. 2009-03-19 00:32:40 +0200 René Stadler * gst/aacparse/gstaacparse.c: aacparse: Refactor check_valid_frame to expose broken code Just moving code around and removing an unhelpful/misleading comment. 2009-02-27 11:24:37 +0200 Stefan Kost * gst/aacparse/gstbaseparse.c: baseparse: revert last change and properly fix Baseparse internaly breaks the semantics of a _chain function by calling it with buffer==NULL. The reson I belived it was okay to remove it was that there is also an unchecked access to buffer later in _chain. Actually that code is wrong, as it most probably wants to set discont on the outgoing buffer. 2009-02-26 11:02:06 +0200 Stefan Kost * gst/aacparse/gstbaseparse.c: baseparse: remove checks for buffer==NULL Accordifn to docs for GstPadChainFunction buffer cannot be NULL. If we would leave the check, we would also need more such check below. 2009-02-11 00:15:43 +0200 René Stadler * gst/aacparse/gstaacparse.c: aacparse: Fix license specified in plugin details. 2009-01-30 18:18:10 +0000 Jan Schmidt * gst/aacparse/gstbaseparse.c: Fix the return value of the default parse_frame function. Fix the return value of the default parse_frame function in both copies of GstBaseParse 2009-01-23 16:00:10 +0200 Stefan Kost * gst/aacparse/gstaacparse.c: Log aac details found in codec_data. 2008-11-13 17:24:58 +0000 Wim Taymans gst/aacparse/gstaacparse.c: Don't autoplug aacparse until it works. Original commit message from CVS: * gst/aacparse/gstaacparse.c: (plugin_init): Don't autoplug aacparse until it works. 2008-11-13 15:20:15 +0000 Stefan Kost tests/check/: Add unit tests for new parsers. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/aacparse.c: * tests/check/elements/amrparse.c: Add unit tests for new parsers. 2008-11-13 14:21:39 +0000 Stefan Kost gst/: Fix baseparse type name. Original commit message from CVS: * gst/aacparse/gstbaseparse.c: * gst/amrparse/gstbaseparse.c: Fix baseparse type name. 2008-11-13 12:59:34 +0000 Stefan Kost Add two new baseparse based parsers (aac and amr) from Bug #518857. Original commit message from CVS: * configure.ac: * gst/aacparse/Makefile.am: * gst/aacparse/gstaacparse.c: * gst/aacparse/gstaacparse.h: * gst/aacparse/gstbaseparse.c: * gst/aacparse/gstbaseparse.h: * gst/amrparse/Makefile.am: * gst/amrparse/gstamrparse.c: * gst/amrparse/gstamrparse.h: * gst/amrparse/gstbaseparse.c: * gst/amrparse/gstbaseparse.h: Add two new baseparse based parsers (aac and amr) from Bug #518857. 2011-03-20 01:08:38 +0100 Havard Graff * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: Make src_query MT-safe It is possible that the element might be going down while the event arrives 2011-04-08 15:22:47 +0200 Sebastian Dröge * ext/jpeg/gstjpegdec.c: jpegdec: Unref event if the parent element disappeared 2011-04-08 15:22:19 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: Unref event if the parent element disappeared 2011-03-21 16:04:34 +0100 Havard Graff * ext/jpeg/gstjpegdec.c: jpegdec: Make upstream events MT-safe 2011-03-21 16:04:34 +0100 Havard Graff * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: Make upstream events MT-safe 2011-04-08 15:20:51 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: rtp: Unref events if the parent element disappeared 2011-01-06 18:24:36 +0100 Ole André Vadla Ravnås * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: rtpmanager: fix pad callbacks so they handle when parent goes away 1) We need to lock and get a strong ref to the parent, if still there. 2) If it has gone away, we need to handle that gracefully. This is necessary in order to safely modify a running pipeline. Has been observed when a streaming thread is doing a buffer_alloc() while an application thread sends an event on a pad further downstream, and from within a pad probe (holding STREAM_LOCK) carries out the pipeline plumbing while the streaming thread has its buffer_alloc() in progress. 2010-11-26 15:20:04 +0100 Havard Graff * gst/rtpmanager/gstrtpsession.c: rtpsession: make iterate_internal_links MT-safe 2011-04-08 14:35:04 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: Revert "Pulsesink: Allow chunks up to bufsize instead of segsize" This reverts commit 1e2c1467ae042a3c6bb1a6bc0c07aeff13ec5edb. The commit causes pulsesink to ignore the latency-time baseaudiosink property. 2011-04-08 11:13:07 +0200 Alexey Fisher * gst/rtp/gstrtpspeexpay.c: rtpspeexpay: Do not transmitt samples with GAP flag If we get GAP samples, there is no need to transmitt it. In some situations, microphone is muted, we can drop net traffick usage to ~1 kbit/s. Without patch it will stay ~20 kbit/s 2011-04-08 11:11:58 +0200 Alexey Fisher * ext/speex/gstspeexenc.c: speexenc: Use speex intern silence detection Speex has build in silence detection. If speex_encode_int returns 0, than there is silence and sample do not need to be transmitted. This work only if vbr=1 and dtx=1 optionas are enabled. So if we get 0, we add GAP flag to the sample. 2011-04-05 17:12:28 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: handle * control correctly Parse session control attributes when no media control attribute is present. Threat * control attributes as an empty string, just like the spec says. Fixes #646800 2011-04-05 14:28:54 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Add support for A-Law and µ-Law Fixes bug #646567. 2011-04-05 09:44:01 +0200 Jon Nordby * configure.ac: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: Fix build with jack 0.120.1 9544622674c0d0a3147a9b51145159b02eec68e9 checked for 0.120.2 and later, but the deprecation was introduced in 0.120.1 2011-04-05 12:05:19 +0300 Stefan Kost * sys/v4l2/gstv4l2radio.h: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2xoverlay.c: docs: fix docuemntation warnings (and reindent) 2011-04-04 17:34:17 +0200 Alessandro Decina * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: videomixer: update orc dist files 2011-04-04 15:57:10 +0300 Stefan Kost * common: Automatic update of common submodule From 1ccbe09 to c3cafe1 2011-03-01 14:08:12 +0530 Arun Raghavan * ext/pulse/pulsesink.c: pulsesink: Always call pa_stream_new_with_proplist() pa_stream_new_with_proplist() can take a NULL proplist, so we don't need to concern ourselves with whether it's NULL or not. 2011-04-04 11:33:10 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: perform post-flush state tricks downstream to upstream ... so downstream is set when upstream resumes data flow. 2011-04-04 11:27:29 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: distribute new base_time to manager children following flush seek ... by forcing a state changed to PLAYING, which should otherwise be a no-op as elements should already be in that state. In particular, jitterbuffer needs new base_time as soon as possible to perform proper timing (e.g. eos timeout handling) and can't wait for the new base_time that will be distributed when the whole pipeline returns to PLAYING. See bug #646397. 2011-04-04 11:35:59 +0200 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: Revert "jitterbuffer: reset element base_time upon flush" This reverts commit f84b8a69cba9c538f5546869cb4ef454ad5efb9d. Fixes bug #646397. 2011-04-04 10:31:44 +0100 Zaheer Abbas Merali * gst/flv/gstflvdemux.c: * gst/flv/gstflvmux.c: flv: Specify the only possible stream-format for h264 in the pad templates. 2011-04-04 10:07:42 +0200 Sebastian Dröge * gst/qtdemux/qtdemux.c: qtdemux: Check for invalid (empty) classification info entity strings Otherwise the classification string can be empty and gst_tag_list_add() will complain or have a \0 in the first four bytes, which is wrong too. 2011-04-04 10:01:26 +0200 Sebastian Dröge * gst/qtdemux/qtdemux.c: qtdemux: Year 0 is not a valid year for GDate and the proleptic gregorian calendar 2011-04-01 13:18:55 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: flacenc: Add support for writing METADATA_BLOCK_PICTURE blocks for GST_TAG_IMAGE and GST_TAG_PREVIEW_IMAGE 2011-04-01 11:33:54 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: * gst/videomixer/videomixer2.c: videomixer[2]: Use orc_memset() instead of memset() 2011-01-19 18:06:45 -0700 Lane Brooks * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Add transparent background option for alpha channel formats 2011-01-19 12:07:17 -0700 Lane Brooks * gst/videomixer/blend.c: * gst/videomixer/blend.h: * gst/videomixer/blendorc.orc: * gst/videomixer/videomixer2.c: * gst/videomixer/videomixer2.h: videomixer2: Add transparent background option for alpha channel formats This option allows the videomixer2 element to output a valid alpha channel when the inputs contain a valid alpha channel. This allows mixing to occur in multiple stages serially. The following pipeline shows an example of such a pipeline: gst-launch videotestsrc background-color=0x000000 pattern=ball ! video/x-raw-yuv,format=\(fourcc\)AYUV ! videomixer2 background=transparent name=mix1 ! videomixer2 name=mix2 ! ffmpegcolorspace ! autovideosink videotestsrc ! video/x-raw-yuv,format=\(fourcc\)AYUV ! mix2. The first videotestsrc in this pipeline creates a moving ball on a transparent background. It is then passed to the first videomixer2. Previously, this videomixer2 would have forced the alpha channel to 1.0 and given a background of checker, black, or white to the stream. With this patch, however, you can now specify the background as transparent, and the alpha channel of the input will be preserved. This allows for further mixing downstream, as is shown in the above pipeline where the a second videomixer2 is used to mix in a background of an smpte videotestsrc. So the result is a ball hovering over the smpte test source. This could, of course, have been accomplished with a single mixer element, but staged mixing is useful when it is not convenient to mix all video at once (e.g. a pipeline where a foreground and background bin exist and are mixed at the final output, but the foreground bin needs an internal mixer to create transitions between clips). Fixes bug #639994. 2011-03-31 13:25:00 +0200 Mark Nauwelaerts * ext/pulse/pulsesink.c: pulsesink: also uncork during EOS waiting (and after EOS is rendered) Pulsesink was recently changed to defer uncorking until there is data to write. This condition will however never occur when EOS in being rendered (since that marks the end of data). Changing to PAUSED state while EOS is being waited on results in a hang: pausing corks the stream, which will never be undone since there is no more data when going back to PLAYING. If pulsesink is the clock provider, deadlock ensues since time doesn't continue in corked state and the clock id for EOS wait never fires. Fixes #645961. 2011-03-29 16:33:43 +0200 Sebastian Dröge * tests/check/elements/rtpbin.c: rtpbin: Don't try to request the same request pad twice 2011-03-28 23:46:47 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: flacdec: fix issues with large metadata blocks when streaming unframed flac Parse metadata blocks when handling unparsed flac in push mode. This works around a bunch of issues with the flac decoder when handling metadata blocks that are larger than the max. flac framesize, which coverart blocks often are. We need to have all the data for these blocks available when we pass data to libflac. http://gstreamer-devel.966125.n4.nabble.com/Flac-files-that-will-playback-but-not-stream-td3338198.html#a3395276 https://bugzilla.gnome.org/show_bug.cgi?id=566769 2011-03-27 21:39:50 +0200 Jan Urbański * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: flvdemux: Do not build an index if upstream is not seekable An index is not useful if upstream cannot handle seeks and building it for infinite files, for instance FLV streams, results in a memory leak. 2011-03-27 01:19:58 +0300 Alexey Chernov <4ernov@gmail.com> * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-video4linux2.xml: * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2radio.c: * sys/v4l2/gstv4l2radio.h: v4l2: new v4l2radio element to control analog radio devices https://bugzilla.gnome.org/show_bug.cgi?id=640118 2011-03-25 22:22:43 +0100 Sebastian Dröge * common: Automatic update of common submodule From 193b717 to 1ccbe09 2011-03-25 14:56:06 +0200 Stefan Kost * common: Automatic update of common submodule From b77e2bf to 193b717 2011-03-25 12:53:43 +0200 Stefan Kost * ext/cairo/Makefile.am: cairo: fix the name of the *-marshall.list file to unbreak make distcheck 2011-03-25 09:31:03 +0100 Sebastian Dröge * common: Automatic update of common submodule From d8814b6 to b77e2bf 2011-03-25 09:06:16 +0100 Sebastian Dröge * common: Automatic update of common submodule From 6aaa286 to d8814b6 2011-03-25 00:10:56 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: refactor processing loop for block based operation Previously the chain function was working sample frame based. In each cycle it was checking if it is time to run a fft or if it is time to send a message. Now we changed the data transform functions to work on a block of data and calculate the max length until either {end-of-data, do-fft, do-msg}. This allows us also to avoid the duplicated code for the single and multi-channel case (as the transformers have the same signature now). 2011-03-24 23:47:33 +0200 Stefan Kost * configure.ac: jack: unbreak the build for jack2 users Jack2 (versions 1.X.X) does only have that API in svn. Limmit the use of the new API for jack1 versions. 2011-03-24 18:49:19 +0200 Stefan Kost * common: Automatic update of common submodule From 6aec6b9 to 6aaa286 2011-03-24 14:14:09 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: fix the error accumulation and frames_todo handling Even though we wrap around the accumulated second, we still need to add the error in the same cycle. Increase the todo in the same conditional as afterwards the accumulated error will be below one second. 2011-03-24 13:53:12 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: fix broken code resulting for a wrong splitup of changes 2011-03-22 16:29:53 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: simplify the have_interval calculation Move some of the conditions to the places where the dependent variables change. 2011-03-22 16:26:45 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: use local var for input_data function Avoid dereferencing the input_data from the instance from within an inner loop. 2011-03-23 16:34:16 +0100 Sebastian Dröge * ext/speex/gstspeexdec.c: * ext/speex/gstspeexdec.h: speexdec: Get and use streamheader from the caps if possible This allows playback of streams where the streamheader buffers were dropped from the stream for some reason. 2011-03-22 19:36:31 +0100 Mark Nauwelaerts * gst/flv/gstflvmux.c: flvmux: use running time for synchronization Fixes #432612. 2011-03-22 19:36:21 +0100 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: use running time for synchronization Fixes #432612. 2011-03-22 19:35:58 +0100 Mark Nauwelaerts * gst/avi/gstavimux.c: avimux: use running time for synchronization See bug #432612. 2011-03-22 12:53:22 +0100 Luis de Bethencourt * configure.ac: configure.ac: redundant uses of AC_MSG_RESULT() cleaned the redundant uses of AC_MSG_RESULT() in configure.ac 2011-03-18 19:34:57 +0100 Luis de Bethencourt * autogen.sh: autogen: wingo signed comment 2011-03-16 10:43:47 +0100 Robert Swain * ext/jack/gstjackaudiosink.c: jackaudiosink: Fix typo from 9544622674c0d0a3147a9b51145159b02eec68e9 2011-03-16 09:38:43 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: matroska: Mark tag mapping tables as static const 2011-03-16 09:37:58 +0100 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Use ARTIST instead of AUTHOR for GST_TAG_ARTIST 2011-03-16 09:35:50 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: matroskademux: Use ARTIST Matroska tag instead of AUTHOR for GST_TAG_ARTIST AUTHOR only existed in an old version of the spec and ARTIST is the new replacement for this. We are still reading both to still be compatible with old files. Fixes bug #644875. 2011-03-15 20:19:48 +0000 Tim-Philipp Müller * tests/check/elements/videofilter.c: tests: enable more formats in videofilter unit test, check more resolutions 2011-03-14 19:14:07 -0400 Youness Alaoui * gst/videofilter/gstvideoflip.c: videoflip: Fix buffer overflow bug for odd resolutions and Y422 colorspaces https://bugzilla.gnome.org/show_bug.cgi?id=644773 2011-03-15 19:36:01 +0200 Vincent Penquerc'h * ext/speex/gstspeexdec.c: speexdec: silence warning message when appropriate If we did not know how many frames to expect, then we get an unexpected end of stream when trying to decode more frames that are there, if there are leftover bits to pad to the next byte 2011-03-14 19:14:07 -0400 Youness Alaoui * gst/videofilter/gstvideoflip.c: videoflip: Add support for YUY2, UVYV and YVYU colorspaces https://bugzilla.gnome.org/show_bug.cgi?id=644773 2011-03-15 09:43:35 +0000 Tim-Philipp Müller * tests/check/elements/videofilter.c: tests: in videofilter unit test also check with 'odd' widths and heights And only use one test suite. 2011-03-14 19:28:07 +0100 Sebastian Dröge * ext/speex/gstspeexdec.c: speexdec: Always process the number of frames per packet as specified in the header Looking at the remaining bits in the bitstream after decoding a single frame can't be used as loop condition. The remaining bits might not give a complete frame and the speex decoder will then output nothing but access uninitialized memory, which leads to valgrind warnings. Fixes bug #644669. 2011-03-14 15:46:50 +0100 Andoni Morales Alastruey * gst/matroska/matroska-mux.c: matroskamux: return TRUE from sink pad event function for tag events, which are handled https://bugzilla.gnome.org/show_bug.cgi?id=644730 2011-03-12 00:44:31 +0530 Philip Jägenstedt * ext/pulse/pulsesink.c: pulsesink: Better fix for deadlock on failed connect This reverts the previous fix that would cause a double-unlock when the stream connect failed. https://bugzilla.gnome.org/show_bug.cgi?id=644510 2011-03-11 23:06:31 +0530 Arun Raghavan * ext/pulse/pulsesink.c: pulsesink: Fix deadlock if connecting to PA fails Commit dd4ec22e introduced a deadlock in the failure path while trying to connect to PulseAudio. This makes sure we drop the lock on the resource mutex to avoid this. https://bugzilla.gnome.org/show_bug.cgi?id=644510 2011-03-11 16:59:10 +0200 Stefan Kost * tests/check/Makefile.am: tests: order state-test blacklist and add jack elements Jack audio src/sink elements recently got moved from bad and should be excluded from the test (like the other device specific source and sinks). Fixes #644288 2011-03-11 13:47:26 +0100 Sebastian Dröge * ext/dv/gstdvdemux.c: dvdemux: Chain up to the parent class' ::send_event for non-seek events 2011-03-11 13:46:05 +0100 Sebastian Dröge * ext/dv/gstdvdemux.c: dvdemux: Fix refcount issues with the seek event Fixes bug #642963. 2011-03-11 09:54:02 +0000 Tim-Philipp Müller * ext/pulse/pulsesink.c: docs: fix pulsesink gtk-doc markup 2011-03-11 10:29:08 +0100 Philippe Normand * configure.ac: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: fix build against jack 0.120.2 jack_port_get_total_latency() has been deprecated in favor of jack_port_get_latency_range(). https://bugzilla.gnome.org/show_bug.cgi?id=644477 2011-03-10 14:29:25 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: more comments and tune and logging 2011-03-10 14:15:42 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: avoid unneccesary extra fft runs Before it was possible that we run an extra fft when the time for sending a new message is due. Only do this if we have not run the fft for the interval at all. 2011-03-10 14:12:01 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: only scale the vectors that we are processing Phase is not produced by default, so lets not scale it unconditionally to save a few cycles. 2011-03-10 14:10:25 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: put number of channels to instance variable When freeing data the format might have changed. Thus we need to remember for which format we allocated memory. 2011-03-10 10:27:14 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: update doc review stamp 2011-03-10 10:22:29 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: use function pointers for data readers Don't check the format for each sample frame to read. We can make that decission in _setup already. This is still not ideal as we call the function per frame. Ideally we determine how many samples we can copy and have a loop in the input reader. As an alternative we might also consider to use the fft variants for the various formats and not convert to float for all cases - we would still need to mix or deinterleave though. 2011-03-09 17:07:47 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: improve recovery from failed seek In case server-side fails to perform seek, i.e. PLAY at non-zero requested position, recovery so far would arrange for streaming to continue, albeit having lost position tracking in the process. So, query position prior to seek and use upon failed seek. 2011-03-09 16:51:00 +0100 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: handle position query 2011-03-09 16:57:28 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: multi-channel support Add a boolean multi-channel property with a default of FALSE. When set to TRUE the element won't mix all input channels to mono, but instead run a FFT on each channel. In that case the result message would contain a 2 dimensional array of channel x data for magnitude and phase. API: GstSpectrum:multi-channel https://bugzilla.gnome.org/show_bug.cgi?id=593482 2011-03-09 16:55:56 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: more xrefs in the docs 2011-03-09 12:41:15 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: factor out the code that accumulated samples into the ring-buffer Use a separate function to read a sample frame into a ringbuffer slot. In the future we can use format-specific function pointer to avoid the reoccuring format checks. 2011-03-09 12:38:52 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: pull format to temp var to improve readability of lines using it 2011-03-09 12:20:11 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: code cleanup for copying data to ring-buffer Rename fp to is_float and restructure if-else part for handling the different formats. 2011-03-09 11:40:48 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: add a GstSpecrtumChannel context structure We now keep the fft data that is related to one channel in a separate structure to prepare for multichannel support. We also refactor the code to operate more often on the channel context. 2011-03-09 11:18:19 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: call the instance var spectrum instead of filter 2011-03-09 11:14:37 +0200 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: don't value we already took from the gvalue 2011-03-08 16:28:27 +0000 Tim-Philipp Müller Merge ad-hoc release branch '0.10.28' === release 0.10.28 === 2011-03-08 15:47:52 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.28 Ad-hoc release to fix build issue with newer kernels. 2011-03-03 00:16:47 +0000 Tim-Philipp Müller * sys/v4l2/v4l2_calls.h: v4l2: remove unnecessary linux/videodev.h include Causes compilation issues with newer kernel headers where the old v4l interface has been removed. https://bugzilla.gnome.org/show_bug.cgi?id=643716 2011-03-07 16:56:43 +0100 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: also estimate eos if very near eos 2011-03-07 16:56:18 +0100 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: avoid trying to buffer more than is available. That is, in case of short (or near eos of) stream, deadlock (until timeout) would occur trying to buffer more than is yet forthcoming. 2011-03-07 11:01:06 +0100 Mark Nauwelaerts * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: reset element base_time upon flush ... to arrange for properly scheduled timeout (following seek). 2011-03-07 10:54:22 +0100 Sebastian Dröge * tests/examples/cairo/cairo_overlay.c: cairooverlay: Add a bus handler to the example to handle EOS/ERROR/WARNING Also clean up the pipeline properly. 2011-03-07 10:47:23 +0100 Sebastian Dröge * tests/examples/Makefile.am: examples: Always dist the cairo example 2011-03-07 10:46:12 +0100 Sebastian Dröge * tests/examples/cairo/Makefile.am: cairooverlay: Use LDADD instead of LDFLAGS for libs and add $(GST_LIBS) 2011-03-05 23:22:58 +0000 Jon Nordby * tests/examples/Makefile.am: * tests/examples/cairo/Makefile.am: * tests/examples/cairo/cairo_overlay.c: cairooverlay: Remove unnecessary gtk/gtk-x11 use in example. This removes code, and allows the example to be used on any platform. Fixes bug #643981. 2011-03-04 18:37:38 -0800 David Schleef * sys/v4l2/gstv4l2object.c: v4l2: Use #ifdefs for V4L2_PIX_FMT_PJPG It's only recently added to kernel headers. 2011-02-23 16:50:43 +0100 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: * gst/wavparse/gstwavparse.h: wavparse: tune output max buffer size to material ... to avoid ending up with tons of short time buffers for e.g. high sample rate audio. 2011-03-04 15:50:01 +0200 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: add a doc example for setting stream-properties 2011-03-04 15:42:19 +0200 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: fix the xml in the docs 2011-03-03 00:16:47 +0000 Tim-Philipp Müller * sys/v4l2/v4l2_calls.h: v4l2: remove unnecessary linux/videodev.h include Causes compilation issues with newer kernel headers where the old v4l interface has been removed. https://bugzilla.gnome.org/show_bug.cgi?id=643716 2011-03-02 23:21:15 +0100 Sebastian Dröge * configure.ac: * tests/examples/Makefile.am: * tests/examples/cairo/Makefile.am: * tests/examples/cairo/cairo_overlay.c: cairooverlay: The example always requires gtk-x11 Check for gtk-x11 and only build the example if it's available. 2011-03-02 23:14:36 +0100 Sebastian Dröge * ext/cairo/gstcairooverlay.c: * ext/cairo/gstcairooverlay.h: cairooverlay: Some minor cleanup 2011-03-02 23:09:21 +0100 Sebastian Dröge * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-deinterlace.xml: docs: Update inspected plugin data 2011-01-28 02:14:04 +0200 Jon Nordby * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/cairo/.gitignore: * ext/cairo/Makefile.am: * ext/cairo/gstcairo-marshal.list: * ext/cairo/gstcairo.c: * ext/cairo/gstcairooverlay.c: * ext/cairo/gstcairooverlay.h: * tests/examples/Makefile.am: * tests/examples/cairo/.gitignore: * tests/examples/cairo/Makefile.am: * tests/examples/cairo/cairo_overlay.c: cairooverlay: Add generic Cairo overlay video element. Allows applications to connect to the "draw" signal of the element and do their custom drawing there. Includes an example application demonstrating usage. Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=595520 2011-03-02 13:00:31 +0200 Stefan Kost * gst/monoscope/monoscope.c: monoscope: don't leak the monoscope_state data The monoscope_close() implementation was empty. 2011-03-02 12:59:35 +0200 Stefan Kost * gst/monoscope/monoscope.c: monoscope: we have 64 colors, don't access colors[64] Fixes remaining invalid read. 2011-03-02 10:25:29 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: arrange for non-fatal error when parsing non-vital parts 2011-03-02 10:56:33 +0200 Stefan Kost * gst/monoscope/convolve.c: monoscope: stack needs to be size+1 as we put a end-marker into it Valgrind is still complaining about one bad read, but this takes care of the crash mentioned in the comment and in bug #564122. 2011-03-01 22:40:19 +0200 Stefan Kost * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: example: fix the variable name for the ip-address Fix the name in the launch pipeline and use a value of "localhost" by default. 2011-02-28 19:16:00 +0100 Mark Nauwelaerts * configure.ac: configure.ac: cygwin/mingw; enable plugin linking to static lib Useful for DirectX plugin(s). Fixes #642507. 2011-02-28 19:13:41 +0100 Mark Nauwelaerts * configure.ac: configure.ac: export plugin description more platform independent Fixes #642504. 2011-02-28 18:32:54 +0100 Mark Nauwelaerts * common: Automatic update of common submodule From 1de7f6a to 6aec6b9 2011-02-23 17:41:22 +0100 Philip Jägenstedt * ext/pulse/pulsesink.c: pulsesink: release pa_shared_resource_mutex before pa_threaded_mainloop_wait Not doing so can result in a deadlock when two threads enter gst_pulseringbuffer_open_device at the same time, as pa_threaded_mainloop_wait releases the mainloop lock while waiting, allowing another thread to take it, resulting in a deadlock as two threads waits for the lock the other is holding. https://bugzilla.gnome.org/show_bug.cgi?id=643087 2011-02-23 17:18:19 +0100 Philip Jägenstedt * ext/pulse/pulsesink.c: pulsesink: s/ressource/resource/ https://bugzilla.gnome.org/show_bug.cgi?id=643087 2011-02-25 20:12:35 -0800 David Schleef * gst/qtdemux/qtdemux.c: qtdemux: remove accidental debug message in previous commit 2011-02-25 19:35:51 -0800 David Schleef * gst/qtdemux/qtdemux.c: qtdemux: Add support for 2Vuy and r210 2011-02-24 14:08:25 +0100 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Add support for NV21 colorspace 2011-02-24 14:00:37 +0100 Carsten Kroll * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Add support for NV12 colorspace Fixes bug #642961. 2011-02-24 13:56:04 +0100 Carsten Kroll * ext/dv/gstdvdemux.c: dvdemux: First try if upstream handles TIME seeks before handling them here Fixes bug #642963. 2010-11-08 14:25:59 +0100 Robert Swain * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Simplify setcaps The current code never uses upstream negotiation so the code can be significantly simplified. 2011-01-24 12:48:18 +0100 Robert Swain * gst/deinterlace/tvtime/greedy.c: deinterlace: Port greedyl to GstDeinterlaceSimpleMethod The main goal of this change is to reuse the complex but now neatly written scanline pointer calculation code from the simple methods. 2011-02-22 15:20:11 +0200 Stefan Kost * gst/id3demux/gstid3demux.c: Revert "id3demux: ensure a taglist before adding the container tag" This reverts commit a86bab66893bb1a3323a756410573c117b8219ef. The issue is fixed with commit ff5e5a8f0daa1fdf89792d0726ea063bbd99db18 instead. 2011-02-22 15:19:00 +0200 Stefan Kost * gst/id3demux/id3tags.c: id3demux: return ID3TAGS_BROKEN_TAG for unsupported versions This prevents us for trying to work with a NULL taglist. 2011-02-22 14:15:27 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Fix unitialized variable. 2011-02-22 14:01:27 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: ensure sane parameters when parsing superindex 2011-02-22 14:00:11 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: check for NULL audio stream format header when parsing stream 2011-02-22 14:52:18 +0200 Stefan Kost * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: rtp-examples: move capsfilter behind converters We need to have the capsfilter behin the converters to make the converters convert from the formats v4l2src can do to what we request with the capsfilter. 2011-02-22 14:50:59 +0200 Stefan Kost * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-PCMA.sh: * tests/examples/rtp/server-alsasrc-PCMA.sh: * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: rtp-examples: fix ascii-art Some boxes where misaligned due to long "audiotetssrc" name. Trim trailing whitespace. 2011-02-22 13:29:26 +0100 Blaise Gassend * gst/rtpmanager/gstrtpbin.c: rtpbin: handle NULL demux elements When using gstrtpbin with ignore-pt=true, the free_stream function tries to call gst_element_set_locked_state and gst_element_set_state on a stream->demux which is NULL. fixes #642412 2011-01-24 12:18:39 +0100 Robert Swain * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: deinterlace: small clean-ups Improve debug output by printing the buffer pointer when popping a buffer and simplify code to use scanlines.bottom_field as appropriate. https://bugzilla.gnome.org/show_bug.cgi?id=642691 2011-01-24 12:18:39 +0100 Robert Swain * gst/deinterlace/gstdeinterlace.c: deinterlace: fix assigned method_id when using fallback https://bugzilla.gnome.org/show_bug.cgi?id=642691 2011-02-21 17:17:32 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: fix setting the SDES property Only the sdes veriable is protected with the object lock. Use the right object when setting the sdes property. 2011-02-21 12:09:07 +0100 Edward Hervey * ext/cairo/gsttextoverlay.c: * gst/avi/gstavimux.c: * gst/flv/gstflvmux.c: * gst/interleave/interleave.c: * gst/matroska/matroska-mux.c: * gst/videomixer/videomixer.c: Revert "Check that collectpads exists before removing pad" This reverts commit 8e6b876e76c94410db160afe5eb30f21452e419f. Depends on a core commit that was reverted 2011-02-21 00:55:49 +0000 Tim-Philipp Müller * gst/icydemux/gsticydemux.c: icydemux: fix tag list handling issues that might have caused crashes Fix slightly confused tag handling in some places: make it clear when we're taking ownership of a tag list and when not. For example, gst_icydemux_tag_found() was taking ownership when the source pad existed, but otherwise not (leak). Also, gst_event_parse_tag() does not return a newly-allocated taglist, but a tag list that belongs to the tag event, so don't give ownership of it away. While we're at it, some minor clean-ups: don't re-invent g_strndup() and simplify gst_icydemux_parse_and_send_tags() a bit, and don't leak the tag list in case no valid tags where found. https://bugzilla.gnome.org/show_bug.cgi?id=641330 2011-02-20 23:39:41 -0800 David Schleef * ext/cairo/gsttextoverlay.c: * gst/avi/gstavimux.c: * gst/flv/gstflvmux.c: * gst/interleave/interleave.c: * gst/matroska/matroska-mux.c: * gst/videomixer/videomixer.c: Check that collectpads exists before removing pad The core now calls release pad from finalize, at which point the collectpads might have already been freed. 2011-02-19 15:48:22 -0800 David Schleef * ext/libpng/gstpngdec.c: pngdec: Handle 16-bit-per-channel images 2011-02-18 10:12:47 +0200 Stefan Kost * gst/avi/gstavidemux.c: avidemux: stream->current_total is accumulated byte size and not time Use timestamp for the stream index as well. 2011-02-15 19:33:45 -0800 David Schleef * gst/udp/gstmultiudpsink.c: udpsink: warn when packet is too large 2011-02-17 17:59:25 -0800 David Schleef * gst/matroska/Makefile.am: * gst/matroska/matroska-parse.c: * gst/matroska/matroska-parse.h: * gst/matroska/matroska.c: matroskaparse: New element Copied from demux. Duplicates much code, also some dead code remaining. 2011-02-17 17:57:55 -0800 David Schleef * gst/matroska/matroska-demux.c: matroskademux: Earlier debug category initialization 2011-01-22 00:13:16 -0800 David Schleef * gst/flv/gstflvmux.c: flvmux: don't set duration for live stream 2011-01-06 15:44:24 -0800 David Schleef * gst/debugutils/Makefile.am: * gst/debugutils/negotiation.c: debugutils: remove bitrotten negotiation element Wasn't enabled, didn't work, and planned features have been superceded by capsfilter and capsdebug. 2010-09-17 12:10:38 -0700 David Schleef * gst/rtp/gstrtpvrawpay.c: * gst/rtp/gstrtpvrawpay.h: rtpvrawpay: Implement interlacing 2011-02-17 17:57:42 +0200 Stefan Kost * gst/avi/gstavidemux.c: avidemux: also add the frame-type for the stream index 2011-02-17 17:56:29 +0200 Stefan Kost * gst/avi/gstavidemux.c: avidemux: get the index writer id when the pad has a parent Otherwise the index writer has a weired name, as the pad has no parent yet. 2011-02-17 14:00:48 +0200 Stefan Kost * gst/avi/gstavidemux.c: * gst/flv/gstflvdemux.c: avidemux, flvdemux: formatting cleanup Trim trailing whitespaces and fix the formatting of double negation. 2011-02-17 13:57:37 +0200 Stefan Kost * gst/avi/gstavidemux.c: * gst/flv/gstflvdemux.c: avidemux, flvdemux: mark delta-units in the index We need to use the 'delta' flag for delta units and not the 'none' flag. 2011-02-17 11:58:42 +0000 Tim-Philipp Müller * tests/icles/.gitignore: .gitignore: ignore moved equalizer test binary 2011-02-17 12:46:14 +0200 Stefan Kost * gst/qtdemux/qtdemux.c: qtdemux: mark delta-unit in the index We need to use the delta flag fro delta units and not none. Print more details to the debug log. 2011-02-17 12:44:01 +0200 Stefan Kost * gst/qtdemux/qtdemux.c: qtdemux: formatting cleanup Trim trailing whitespaces and fix the formatting of double negation. 2011-02-16 17:09:20 +0200 Stefan Kost * gst/matroska/matroska-mux.c: matroskamux: rework _request_new_pad to handle explict req-pad-names Don't ignore explicit pad-names. 2011-02-16 17:06:51 +0200 Stefan Kost * gst/avi/gstavimux.c: avimux: rework _request_new_pad to handle explict req-pad-names Don't ignore explicit pad-names. Rearrange the code and the error handling a bit. Add a FIXME-0.11 for the bad pad-names. 2011-02-16 15:28:53 +0100 Sebastian Dröge * tests/icles/Makefile.am: icles: Add equalizer-test to the build system 2011-02-16 15:23:50 +0100 Sebastian Dröge * tests/icles/equalizer-test.c: [MOVED FROM BAD 5/5] equalizer-test: Initialize debug category after gst_init() to fix segfault 2007-11-07 15:36:59 +0000 Sebastian Dröge [MOVED FROM BAD 4/5] tests/icles/equalizer-test.c: Fix gain ranges for the latest equalizer changes. Original commit message from CVS: * tests/icles/equalizer-test.c: (do_slider_fiddling): Fix gain ranges for the latest equalizer changes. 2007-05-21 14:01:16 +0000 Stefan Kost [MOVED FROM BAD 3/5] ChangeLog: ChangeLog surgery. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBa... Original commit message from CVS: * ChangeLog: ChangeLog surgery. * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, parent_class, gst_iir_equalizer_band_set_property, gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, gst_iir_equalizer_child_proxy_get_child_by_index, gst_iir_equalizer_child_proxy_get_children_count, gst_iir_equalizer_child_proxy_interface_init, setup_filter, gst_iir_equalizer_compute_frequencies, plugin_init): * tests/icles/equalizer-test.c: Add fixme and comment for example. 2007-03-14 16:33:03 +0000 Stefan Kost [MOVED FROM BAD 2/5] tests/icles/equalizer-test.c: Port the example to new equalizer api. Original commit message from CVS: * tests/icles/equalizer-test.c: (equalizer_set_band_value), (equalizer_set_all_band_values), (equalizer_set_band_value_and_wait), (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), (main): Port the example to new equalizer api. 2007-02-03 23:35:26 +0000 Tim-Philipp Müller [MOVED FROM BAD 1/5] Fix up to use the newly ported (actually working) GstAudioFilter. Original commit message from CVS: * configure.ac: * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), (gst_iir_equalizer_init), (setup_filter), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), (gst_iir_equalizer_transform_ip), (gst_iir_equalizer_setup), (plugin_init): * gst/equalizer/gstiirequalizer.h: Fix up to use the newly ported (actually working) GstAudioFilter. Bump core/base requirements to CVS for this. * tests/icles/.cvsignore: * tests/icles/Makefile.am: * tests/icles/equalizer-test.c: (check_bus), (equalizer_set_band_value), (equalizer_set_all_band_values), (equalizer_set_band_value_and_wait), (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), (main): Add brain-dead interactive test for equalizer. 2011-02-15 15:59:32 -0300 Thiago Santos * sys/v4l2/gstv4l2object.c: v4l2: Add PJPG mapping Adds mapping of progressive jpeg format 2011-02-15 16:30:20 +0100 Andy Wingo plug qtdemux refcount leaks * gst/qtdemux/qtdemux.c (gst_qtdemux_src_convert): Unref the qtdemux; we weren't doing so before. (gst_qtdemux_handle_src_event, gst_qtdemux_chain): Fix some error cases which would leak a ref to the qtdemux. 2011-02-14 20:20:08 +0100 Andoni Morales Alastruey * ext/soup/gstsouphttpsrc.c: souphttpsrc: Add URI query handler Fixes bug #642337. 2011-02-14 17:49:54 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: avoid sorting NULL array of cluster positions 2011-02-14 16:46:46 +0100 Wim Taymans * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: theorapay: handle 0 sized packets Handle 0 sized packets (repeat frame) in the payloader and depayloader. Fixes #641827 2011-02-14 15:21:29 +0200 Tuukka Pasanen * gst/debugutils/gsttaginject.c: taginject: resend tags when they are changed Allow setting new tags on the property while running and send them. Fixes #640249 2011-02-14 12:53:27 +0200 Stefan Kost * common: Automatic update of common submodule From f94d739 to 1de7f6a 2011-02-07 23:32:53 +0100 Miguel Angel Cabrera Moya * gst/rtsp/gstrtspsrc.c: rtspsrc: fix minor leaks when handling server requests. https://bugzilla.gnome.org/show_bug.cgi?id=640163 2011-02-14 00:49:00 +0000 Heath Nielson * gst/qtdemux/qtdemux.c: qtdemux: extract MusicBrainz tags Extract MusicBrainz tags added by MusicBrainz's Picard tagger application. These tags (esp. the album id) are helpful for rhythmbox et.al. to automatically downloads cover art. https://bugzilla.gnome.org/show_bug.cgi?id=642205 2011-02-14 00:38:45 +0000 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: refactor iTunes tag parsing a bit 2011-02-10 23:52:51 +0000 Tim-Philipp Müller * gst-plugins-good.doap: doap: update mailing list location 2011-02-10 18:11:46 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: propagate error during expose_streams ... as it may occur during initial parsing of fragmented file. 2011-02-10 18:00:11 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: avoid skipping exposing a stream following a removed stream 2011-02-10 11:56:33 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: store cluster positions provided by SeekHead ... and use those, if available, to locate a cluster rather than scanning. 2011-02-09 16:22:47 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: properly resume cluster scanning ... rather than getting offset tracking messed up, and then likely failing a subsequent assert. 2011-02-08 10:07:43 +0200 Stefan Kost * gst/id3demux/gstid3demux.c: id3demux: ensure a taglist before adding the container tag In the case of id3v1 also don't return NULL on empty tags, but also create a new taglist and add the container tag for consistency. 2011-02-07 17:08:47 +0200 Stefan Kost * gst/rtsp/gstrtspsrc.c: rtspsrc: strip trailing spaces 2011-02-07 17:07:42 +0200 Stefan Kost * gst/rtsp/gstrtspsrc.c: rtpsrc: set multiple properties in one go There is no need for separate g_object_set() calls here. 2011-02-03 16:10:49 -0300 Thiago Santos * gst/deinterlace/gstdeinterlace.c: * tests/check/elements/deinterlace.c: deinterlace: Handle image caps without asserting Images might have framerate=0/1 in the caps, which caused an assertion on deinterlace. I don't know of interlaced image formats but deinterlace might be hardcoded on some generic pipelines and it shouldn't assert. The fix was to set field_duration to 0 if the input has a framerate with a 0 numerator. This patch also adds checks for this situation on the unit tests. https://bugzilla.gnome.org/show_bug.cgi?id=641400 2011-02-04 12:33:09 +0200 Stefan Kost * gst/udp/gstudpsrc.c: docs: fix parameter name in udpsrc docs It is "buffer-size" and not "buffer". Also trim trailing whitespace. 2011-02-03 23:42:59 +0100 Mark Nauwelaerts * sys/v4l2/gstv4l2object.c: v4l2: fix interlaced set_format configuration Commit 6c8268dbfd5c88fac28c882ef2e4598a6522e2d6 broke recording from interlaced v4l2 source (e.g. typical tv capture card) since V4L2_FIELD_SEQ_TB (with fields stored separately) does not map to currently defined interlaced format (fields stored interleaved). Besides this mismatch, hardware might quite likely not support or appreciate this field value, since querying supported formats mapped _INTERLACED field formats to interlaced=true caps (so the latter should not be mapped to field value that is not known to be supported). 2011-02-02 18:27:52 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: source: fix type of ntpnstime 2011-02-02 18:21:26 +0100 Wim Taymans * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: * gst/rtpmanager/rtpstats.h: rtpbin: Get and use the NTP time when receiving RTCP When we receive an RTCP packet, get the current NTP time in nanseconds so that we can correctly calculate the round-trip time. 2011-02-01 19:40:58 +0100 Mark Nauwelaerts * sys/directsound/gstdirectsoundsink.c: directsound: arrange for definition of _swab on Cygwin gstdirectsoundsink.c: In function 'gst_directsound_sink_write': gstdirectsoundsink.c:557: error: implicit declaration of function '_swab' gstdirectsoundsink.c:557: error: nested extern declaration of '_swab' 2010-10-06 21:17:28 -0400 Olivier Crête * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheoradepay.h: rtptheoradepay: Request new keyframe on lost packets Theora can only use the last frame (or the keyframe) as a reference, so in practice. If we receive a buffer that references an unknown codebook, request new headers. It probably means that headers were lost. 2010-08-27 14:11:53 -0400 Olivier Crête * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Add action signal to request early RTCP 2010-08-27 16:11:06 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Add callback to get the current time 2010-10-19 22:21:54 +0200 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Don't relay more than one PLI request per RTT Drop PLI requests if one was relay in the last RTT, the other side may just not have received the keyframe yet. 2010-06-23 16:43:24 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Send GstForceKeyUnit event in response to received RTCP PLI 2010-11-24 15:27:46 -0500 Sjoerd Simons * gst/rtpmanager/gstrtpsession.c: gstrtpsession: Fallback for FIR to PLI if PLI isn't available 2010-06-22 19:56:50 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Implement sending PLI packets in response to GstForceKeyUnit 2010-06-22 13:33:32 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpsource: Retain RTCP Feedback packets for a specified amount of time 2010-09-07 13:35:16 +0300 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Make rtcp buffer metadata writable after processing it Functions that process the rtcp buffer could decide to keep a ref on the buffer for further processing. So make the metadata writable only after they are done. 2010-06-17 17:34:19 -0400 Olivier Crête * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Emit signal on incoming RTCP FB packet 2011-02-01 18:17:13 +0100 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: fix compilation 2010-06-15 18:39:47 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Add method to request early RTCP packet Implement the early mode defined in RFC 4585. In this mode, RTCP feedback packets are sent early to notifier. 2010-06-01 19:28:01 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpstats.c: * gst/rtpmanager/rtpstats.h: rtpsession: Add property for minimum interval between Regular RTCP messages This can be changed according to RFC 4585 2010-06-14 18:40:33 -0400 Olivier Crête * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: Emit signal when sending a compound RTCP packet This allows users to add extra RTCP packets to the compound RTCP packet. 2010-06-19 19:11:06 -0400 Olivier Crête * gst/rtpmanager/gstrtpptdemux.c: rtpptdemux: Tag upstream custom events with payload type 2010-06-18 19:12:40 -0400 Olivier Crete * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: Tag upstream custom events with SSRC 2010-10-01 17:19:16 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Emit "on-ssrc-validated" when validating by RTCP Emit "on-ssrc-validated" if the SSRC is validated by receiving a RTCP SDES packet. 2011-02-01 16:38:20 +0100 Wim Taymans * gst/rtp/gstrtpj2kpay.c: j2kpay: skip EPH packets Include EPH markers into the previous chunk of packets. 2011-01-31 17:56:18 -0500 Olivier Crête * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmapay.h: rtppcmapay: Rename the class to have the right name It was name pmca instead of pcma and made debug logs hard to search. 2011-01-31 05:58:36 +0100 David Henningsson * ext/pulse/pulsesink.c: Pulsesink: Allow chunks up to bufsize instead of segsize By allowing larger chunks to be sent, PulseAudio will have a lower CPU usage. This is especially important on low-end machines, where PulseAudio can crash if packets are coming in at a higher rate than PulseAudio can process them. Signed-off-by: David Henningsson 2011-01-31 13:44:45 +0000 Tim-Philipp Müller * gst/deinterlace/gstdeinterlace.c: deinterlace: simplify template caps We can merge all the YUV variants into one single structure. 2011-01-27 15:35:06 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: win32: fix DEFAULT_AUDIOSINK, should be direct*sound*sink https://bugzilla.gnome.org/show_bug.cgi?id=640705 2011-01-27 16:02:46 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: initialize local variable to please mingw32 compiler 2011-01-26 22:21:31 +0100 Mark Nauwelaerts * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpnetutils.h: * gst/udp/gstudpsrc.c: udp: use socklen_t where appropriate rather than custom type In particular, fixes Cygwin build where socklen_t is defined as int in line with native win32 api definition. 2011-01-27 12:16:46 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: mind rounding issues when converting from global time to mov time In particular, this avoids missing the intended keyframe when first converting from the frame's mov time to global segment time, and then back from global time to mov time when activating the segment. 2011-01-26 08:48:43 +0000 Ognyan Tonchev * gst/matroska/ebml-write.c: * tests/check/elements/matroskamux.c: matroskamux: don't leak ebml writer caps when re-using matroskamux https://bugzilla.gnome.org/show_bug.cgi?id=640542 2011-01-25 21:56:19 +0200 Stefan Kost * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: don't divide by 0 2011-01-18 14:48:04 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: pull mode should always report seekable ... as it no longer requires an index, but can seek by scanning as well. 2011-01-10 12:34:22 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: support some more mpeg-4 fourcc variants 2011-01-10 12:34:03 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: simplify retrieving stsd child entry atom 2011-01-24 18:27:52 +0100 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Don't consider 0 fcc_handler as uncompressed. Just avoids a warning 2011-01-20 12:14:08 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: take configured start time into account when creating the newsegment event, take the configured start time into account. 2011-01-24 15:11:02 +0000 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: fix printf format warning on mingw32 Make win32 build bot happy again, and nicefy output while we're at it. qtdemux.c: In function 'qtdemux_parse_trun': qtdemux.c:2162:3: error: format '%lu' expects type 'long unsigned int', but argument 9 has type 'guint32' 2011-01-24 13:39:58 +0000 Tim-Philipp Müller * tests/examples/rtp/client-H263p-AMR.sh: * tests/examples/rtp/client-H263p-PCMA.sh: * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-PCMA.sh: examples: autoaudisink -> autoaudiosink in RTP examples 2011-01-24 00:32:41 +0000 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development === release 0.10.27 === 2011-01-21 12:54:16 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.27 2011-01-20 14:10:55 +0000 Tim-Philipp Müller * gst/rtp/gstrtph264depay.c: h264depay: don't leak codec data buffer in byte-stream=true mode https://bugzilla.gnome.org/show_bug.cgi?id=640063 2011-01-20 13:41:33 +0000 Tim-Philipp Müller * gst/rtsp/gstrtspsrc.c: rtspsrc: don't leak url string https://bugzilla.gnome.org/show_bug.cgi?id=640064 2011-01-20 11:45:47 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Gracefully handle mov files misusing the WAVE atoms Check that the WAVEHEADER node is present instead of blindly using it. If not present we won't be able to provide a more refined caps, but at least we won't crash. https://bugzilla.gnome.org/show_bug.cgi?id=640028 2011-01-20 00:07:33 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2sink.c: v4l2sink: fix accidental breakage of navigation interface support 2011-01-18 12:58:29 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.26.4 pre-release 2011-01-12 14:03:57 -0800 David Schleef * gst/deinterlace/gstdeinterlacemethod.c: deinterlace: rewrite how neighboring scan lines are calculated Old code was difficult to understand exactly how the neighboring scan lines are calculated, and it appeared that some were off by +2 or -2, depending on the field flag. Fixes #639321. 2011-01-18 09:33:06 +0000 Tim-Philipp Müller * gst/avi/gstavisubtitle.c: avisubtitle: set caps on srcpad to fix issue with discoverer Set caps from the start so discoverer doesn't blow up on seeing no negotiated caps between elements on preroll, which might happen if no subtitle buffers have been pushed yet at the time. See file from bug #603308. 2011-01-17 20:09:16 +0530 Arun Raghavan * ext/pulse/pulsesink.c: pulsesink: Uncork stream while flushing the ringbuffer After starting the ringbuffer, we wait for enough data to arrive before uncorking the stream. This will cause the pipeline to stall if we get an EOS (or otherwise need to flush the stream) before sufficient data becomes available. This patch makes sure that the stream is uncorked while flushing to avoid this problem. Fixes issue with a webkit unit test testing reverse playback of an MP4 H.264/AAC file. https://bugzilla.gnome.org/show_bug.cgi?id=639740 2011-01-14 14:51:51 +0100 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: avoid creating caps from string when possible Fixes #639516. 2011-01-14 14:48:49 +0100 Mark Nauwelaerts * gst/avi/gstavimux.c: avimux: set src pad caps when starting file Fixes #639516. 2011-01-12 20:38:59 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2object.c: v4l2: define V4L2_FIELD_INTERLACED_{TB,BT} if not available in header Older kernels don't have these, and there's no easy way to check for the existance of enums that doesn't involve a configure check, so just define these if the V4L2_CAP_VIDEO_OUTPUT_OVERLAY define is not there, which was added in the same commit as the TB/BT enum. Fixes compilation on CentOS 5. https://bugzilla.gnome.org/show_bug.cgi?id=639339 2011-01-11 23:18:59 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.26.3 pre-release 2011-01-11 22:42:42 +0000 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: update docs 2011-01-11 23:39:12 +0530 Arun Raghavan * ext/pulse/pulsesink.c: pulsesink: Make corking during pause synchronous This makes the call to pa_stream_cork() during ringbuffer pause() synchronous, which makes sure that the clock does not advance after we take a snapshot for start_time. https://bugzilla.gnome.org/show_bug.cgi?id=639240 2011-01-11 19:33:16 +0000 Tim-Philipp Müller * po/da.po: * po/gl.po: * po/pl.po: * po/pt_BR.po: * po/sl.po: * po/sv.po: * po/tr.po: po: update translations 2011-01-11 15:50:28 +0200 Stefan Kost * common: Automatic update of common submodule From e572c87 to f94d739 2011-01-10 16:36:19 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From ccbaa85 to e572c87 2011-01-10 14:53:39 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 46445ad to ccbaa85 2011-01-07 13:24:02 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.26.2 pre-release 2011-01-07 13:06:38 +0000 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/gl.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ro.po: * po/ru.po: * po/sk.po: * po/sl.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update translations 2011-01-07 02:32:20 +0000 Tim-Philipp Müller * gst/alpha/gstalpha.c: alpha: fix compiler warnings caused by -DG_DISABLE_ASSERT 2011-01-07 02:06:51 +0000 Tim-Philipp Müller * gst/matroska/ebml-read.c: matroska: don't put essential function calls into g_assert() g_assert() will expand to NOOPs if -DG_DISABLE_ASSERT is passed. 2011-01-07 01:35:45 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2sink.c: v4l2sink: don't put functional code like ioctl calls into g_return_if_fail() These macros will expand to NOOPs given the right defines. Also, g_return_if_fail() and friends are meant to be used to catch programming errors (like invalid input to functions), not runtime error handling. 2011-01-07 01:11:02 +0000 Tim-Philipp Müller * tests/check/Makefile.am: tests: never disable g_assert() and cast checks for the unit tests The unit tests are riddled with g_assert() and friends, make sure we don't disable assert and cast checks for the unit tests even if this has been specified for the rest of the code base, e.g. via --disable-glib-asserts. 2011-01-06 12:29:21 +0100 Edward Hervey * gst/rtp/gstrtpmp4adepay.c: rtp: Fix unitialized variables on macosx 2011-01-06 12:28:58 +0100 Edward Hervey * gst/qtdemux/qtdemux_dump.c: qtdemux: Fix unitialized variables on macosx 2011-01-05 17:49:16 -0800 David Schleef * gst/debugutils/gstcapsdebug.c: capsdebug: Add capdebug debug category 2010-12-11 12:42:10 -0800 David Schleef * gst/deinterlace/gstdeinterlace.c: deinterlace: Change the default to linear The previous default, greedyh, takes 4 times as long as MPEG-2 video decoding, and is unlikely fast enough on any current CPU to play 1080i video in real-time. greedyl isn't much faster. linear was chosen over vfir, since the quality advantage of vfir is minimal compared to the occasional visual artifacts and slower processing. 2011-01-05 18:32:58 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't confuse return values Return a return value of the right type. 2011-01-05 16:24:13 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: qtdemux: Fix unitialized variables on macosx 2011-01-05 15:03:32 +0100 Wim Taymans * gst/rtp/gstrtpvrawdepay.c: vrawdepay: fix length check Add some more debugging. Add the length check so we don't cause unneeded warnings. 2011-01-05 12:04:03 +0100 Wim Taymans * gst/udp/gstmultiudpsink.c: * gst/udp/gstmultiudpsink.h: multiudpsink: add buffer-size property Add buffer-size property to configure the kernel send buffer. 2011-01-03 20:16:22 +0200 Stefan Kost * gst/rtsp/gstrtspsrc.c: rtspsrc: remove unused variables when debug-logging disabled 2011-01-03 20:06:35 +0200 Stefan Kost * gst/matroska/matroska-demux.c: matroska-demux: remove unused variables when debug-logging disabled 2011-01-03 18:05:15 +0100 Wim Taymans * ext/libcaca/gstcacasink.c: cacasink: fix masks and strides Use the right endianness to read the masks. Use the right strides for the bitmap. Fixes #638569 2011-01-03 01:18:06 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2src.c: v4l2src: undo presumably accidental enablement of the GstXOverlay interface Looks like this got enabled by accident when adding it to v4l2sink, so undo this for now. Not sure it makes much sense in a GStreamer context with current hardware. 2011-01-03 15:40:11 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: increase udp buffer size Set a bigger UDP buffer size by default to reduce packet loss with high bitrate streams. 2011-01-02 19:19:27 -0800 David Schleef * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: send stream headers in key-frame mode 2011-01-02 19:43:02 +0000 Tim-Philipp Müller * ext/jack/Makefile.am: * ext/jack/README: * ext/jack/gstjack.c: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: fix up element details and some other minor clean-ups 2011-01-02 19:23:51 +0000 Erich Schubert * gst/id3demux/id3v2frames.c: id3demux: fix parsing of ID3v2.4 genre frames with multiple genres We'd only extract the first genre (multiple times) instead of all genres. https://bugzilla.gnome.org/show_bug.cgi?id=638535 2011-01-02 17:40:41 +0000 Tim-Philipp Müller * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: template caps had lists with one value, just use value directly 2011-01-02 17:07:19 +0000 Tim-Philipp Müller * ext/jack/gstjack.c: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: make get_type functions thread-safe Because we can (shouldn't be needed with other workarounds still there). 2011-01-02 15:27:19 +0000 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-rtp.xml: docs: update plugin docs 2011-01-02 15:25:41 +0000 Tim-Philipp Müller * .gitignore: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-jack.xml: * ext/Makefile.am: * gst-plugins-good.spec.in: * tests/examples/Makefile.am: * tests/examples/jack/Makefile.am: jack: new jackaudiosrc and jackaudiosink elements, moved from gst-plugins-bad https://bugzilla.gnome.org/show_bug.cgi?id=621929 2010-10-19 16:23:23 +0300 Stefan Kost * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: various (ext): add missing G_PARAM_STATIC_STRINGS flags Canonicalize property names as needed. 2010-09-09 14:49:06 -0400 Tristan Matthews * ext/jack/Makefile.am: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: added translatable text for server not found error 2010-09-06 17:17:54 -0400 Tristan Matthews * tests/examples/jack/Makefile.am: * tests/examples/jack/jack_client.c: examples: add test to demonstrate jack_client_t usage 2010-09-06 16:11:31 -0400 Tristan Matthews * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackaudioclient.c: * ext/jack/gstjackaudioclient.h: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosink.h: * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackaudiosrc.h: jack: added client property 2010-06-17 16:26:07 -0400 Tristan Matthews * ext/jack/gstjackbin.c: jack: removed unused file gstjackbin.c This is a 0.8 leftover. 2010-05-13 12:55:29 +0200 Wim Taymans * ext/jack/gstjackaudiosrc.c: jacksrc: make sure we always read nframes Error out when we are asked to read a different size that what was configured as the jack period size because that would mean something else is wrong. Fixes #618409 2010-05-11 17:56:31 -0400 Tristan Matthews * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackaudiosrc.h: jack: improve process_cb 2010-04-27 10:48:32 -0400 Tristan Matthews * ext/jack/Makefile.am: * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackutil.c: * ext/jack/gstjackutil.h: jack: implement multichannel support correctly for jackaudiosrc Fixes parts of bug #616541. 2010-04-27 11:21:16 +0300 Stefan Kost * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackringbuffer.h: jack: remove empty dispose and finalize methods 2010-04-27 10:59:00 +0300 Stefan Kost * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: don't leak caps Add dispose methods to clear caps. 2010-04-27 10:34:24 +0300 Stefan Kost * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: don't use GST_DEBUG_FUNCPTR for gobject vmethods 2010-03-24 15:59:53 +0200 Stefan Kost * ext/jack/gstjackaudiosrc.c: jack: fix element name in section doc blob 2010-03-22 16:56:03 +0100 Benjamin Otte * ext/jack/gstjackaudiosrc.c: Add -Wold-style-definition and fix the warnings 2010-03-21 21:39:18 +0100 Benjamin Otte * ext/jack/gstjack.h: Add -Wmissing-declarations -Wmissing-prototypes to configure flags And fix all warnings 2010-03-18 17:30:26 +0100 Benjamin Otte * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: gst_element_class_set_details => gst_element_class_set_details_simple 2009-10-12 09:06:37 +0300 Stefan Kost * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: ensure segtotal is at least 2 Not only adjust buffer-time and avoid segtotal=0, but instead ensure segtotal is atleast 2. Do same change on jacksrc. We could also check the latency and buffer time configured by the client and adjust buffer-time so that we get to the same number of segments. 2009-10-12 00:51:27 +0300 Stefan Kost * ext/jack/gstjackaudiosink.c: jack: don't crash in ringbuffer with SIGFPE on small buffer-times Jack overrides user-specified latency-time with the one it gets from jack itself. It also needs to adjust buffer-time somewhat to avoid segtotal being 0 2009-05-11 16:12:54 +0300 Stefan Kost * ext/jack/gstjackaudioclient.c: * ext/jack/gstjackaudiosink.c: jack: when stopping playback, do one more cycle to flush the port. Fixes #582167 The gst_jack_audio_client_set_active() flags the port as deactivating and uses a GCond to wait until the jack_process_cb() has run once more and cleared the flag. This way the client zero's the buffer. This happens if one manyally go to PAUSED and then to READY, while leting the mainloop run inbetween. 2009-03-16 11:21:02 +0100 Wim Taymans * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: jack: Add new connection mode Add a new connection mode to jacksrc and jacksink. In this new auto-force connection mode jack will create as many ports as requested/needed in the pipeline and will then connect as many physical ports as possible, possibly leaving some ports unconnected. Also get rid of some leftover g_print. Fixes #575284. 2008-11-23 17:50:08 +0000 Stefan Kost ext/jack/: Query port latencies for sink/src delays. Original commit message from CVS: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosrc.c: Query port latencies for sink/src delays. * ext/jack/gstjackbin.c: No printf please. 2008-11-04 12:42:30 +0000 Stefan Kost Don't install static libs for plugins. Fixes #550851 for -bad. Original commit message from CVS: * ext/alsaspdif/Makefile.am: * ext/amrwb/Makefile.am: * ext/apexsink/Makefile.am: * ext/arts/Makefile.am: * ext/artsd/Makefile.am: * ext/audiofile/Makefile.am: * ext/audioresample/Makefile.am: * ext/bz2/Makefile.am: * ext/cdaudio/Makefile.am: * ext/celt/Makefile.am: * ext/dc1394/Makefile.am: * ext/dirac/Makefile.am: * ext/directfb/Makefile.am: * ext/divx/Makefile.am: * ext/dts/Makefile.am: * ext/faac/Makefile.am: * ext/faad/Makefile.am: * ext/gsm/Makefile.am: * ext/hermes/Makefile.am: * ext/ivorbis/Makefile.am: * ext/jack/Makefile.am: * ext/jp2k/Makefile.am: * ext/ladspa/Makefile.am: * ext/lcs/Makefile.am: * ext/libfame/Makefile.am: * ext/libmms/Makefile.am: * ext/metadata/Makefile.am: * ext/mpeg2enc/Makefile.am: * ext/mplex/Makefile.am: * ext/musepack/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/mythtv/Makefile.am: * ext/nas/Makefile.am: * ext/neon/Makefile.am: * ext/ofa/Makefile.am: * ext/polyp/Makefile.am: * ext/resindvd/Makefile.am: * ext/sdl/Makefile.am: * ext/shout/Makefile.am: * ext/snapshot/Makefile.am: * ext/sndfile/Makefile.am: * ext/soundtouch/Makefile.am: * ext/spc/Makefile.am: * ext/swfdec/Makefile.am: * ext/tarkin/Makefile.am: * ext/theora/Makefile.am: * ext/timidity/Makefile.am: * ext/twolame/Makefile.am: * ext/x264/Makefile.am: * ext/xine/Makefile.am: * ext/xvid/Makefile.am: * gst-libs/gst/app/Makefile.am: * gst-libs/gst/dshow/Makefile.am: * gst/aiffparse/Makefile.am: * gst/app/Makefile.am: * gst/audiobuffer/Makefile.am: * gst/bayer/Makefile.am: * gst/cdxaparse/Makefile.am: * gst/chart/Makefile.am: * gst/colorspace/Makefile.am: * gst/dccp/Makefile.am: * gst/deinterlace/Makefile.am: * gst/deinterlace2/Makefile.am: * gst/dvdspu/Makefile.am: * gst/festival/Makefile.am: * gst/filter/Makefile.am: * gst/flacparse/Makefile.am: * gst/flv/Makefile.am: * gst/games/Makefile.am: * gst/h264parse/Makefile.am: * gst/librfb/Makefile.am: * gst/mixmatrix/Makefile.am: * gst/modplug/Makefile.am: * gst/mpeg1sys/Makefile.am: * gst/mpeg4videoparse/Makefile.am: * gst/mpegdemux/Makefile.am: * gst/mpegtsmux/Makefile.am: * gst/mpegvideoparse/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/nuvdemux/Makefile.am: * gst/overlay/Makefile.am: * gst/passthrough/Makefile.am: * gst/pcapparse/Makefile.am: * gst/playondemand/Makefile.am: * gst/rawparse/Makefile.am: * gst/real/Makefile.am: * gst/rtjpeg/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/scaletempo/Makefile.am: * gst/sdp/Makefile.am: * gst/selector/Makefile.am: * gst/smooth/Makefile.am: * gst/smoothwave/Makefile.am: * gst/speed/Makefile.am: * gst/speexresample/Makefile.am: * gst/stereo/Makefile.am: * gst/subenc/Makefile.am: * gst/tta/Makefile.am: * gst/vbidec/Makefile.am: * gst/videodrop/Makefile.am: * gst/videosignal/Makefile.am: * gst/virtualdub/Makefile.am: * gst/vmnc/Makefile.am: * gst/y4m/Makefile.am: * sys/acmenc/Makefile.am: * sys/cdrom/Makefile.am: * sys/dshowdecwrapper/Makefile.am: * sys/dshowsrcwrapper/Makefile.am: * sys/dvb/Makefile.am: * sys/dxr3/Makefile.am: * sys/fbdev/Makefile.am: * sys/oss4/Makefile.am: * sys/qcam/Makefile.am: * sys/qtwrapper/Makefile.am: * sys/vcd/Makefile.am: * sys/wininet/Makefile.am: * win32/common/config.h: Don't install static libs for plugins. Fixes #550851 for -bad. 2008-09-17 13:59:21 +0000 Jan Schmidt Fix compiler warnings on OS/X Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (jack_process_cb): * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): Fix compiler warnings on OS/X 2008-08-07 13:15:21 +0000 Stefan Kost ext/jack/gstjackaudiosrc.c: Try committing this once again. Now properly renamed. Original commit message from CVS: * ext/jack/gstjackaudiosrc.c: Try committing this once again. Now properly renamed. 2008-08-07 09:09:44 +0000 Stefan Kost docs/plugins/: docs/plugins/inspect/plugin-jack.xml Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/inspect/plugin-jack.xml Add new element to docs. * ext/jack/gstjack.h Add missing file. * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackaudiosrc.h: Rename jackaudiosrc to jack_audio_src. 2008-08-07 08:47:40 +0000 Tristan Matthews ext/jack/: Add a jackaudiosrc. Refactor sink slightly for better code reuse. Original commit message from CVS: patch by: Tristan Matthews * ext/jack/Makefile.am: * ext/jack/gstjack.c: * ext/jack/gstjackaudioclient.c: * ext/jack/gstjackaudiosink.c: * ext/jack/gstjackaudiosink.h: * ext/jack/gstjackaudiosrc.c: * ext/jack/gstjackaudiosrc.h: * ext/jack/gstjackringbuffer.h: Add a jackaudiosrc. Refactor sink slightly for better code reuse. Fixes #545197. 2008-06-13 11:59:23 +0000 Stefan Kost docs/plugins/: docs/plugins/inspect/plugin-mythtv.xml Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-alsaspdif.xml: * docs/plugins/inspect/plugin-amrwb.xml: * docs/plugins/inspect/plugin-app.xml: * docs/plugins/inspect/plugin-bayer.xml: * docs/plugins/inspect/plugin-bz2.xml: * docs/plugins/inspect/plugin-cdaudio.xml: * docs/plugins/inspect/plugin-cdxaparse.xml: * docs/plugins/inspect/plugin-dtsdec.xml: * docs/plugins/inspect/plugin-dvb.xml: * docs/plugins/inspect/plugin-dvdspu.xml: * docs/plugins/inspect/plugin-faac.xml: * docs/plugins/inspect/plugin-faad.xml: * docs/plugins/inspect/plugin-fbdevsink.xml: * docs/plugins/inspect/plugin-festival.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-flvdemux.xml: * docs/plugins/inspect/plugin-freeze.xml: * docs/plugins/inspect/plugin-gsm.xml: * docs/plugins/inspect/plugin-gstinterlace.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-h264parse.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-metadata.xml: * docs/plugins/inspect/plugin-mms.xml: * docs/plugins/inspect/plugin-modplug.xml: * docs/plugins/inspect/plugin-mpeg2enc.xml: * docs/plugins/inspect/plugin-mpeg4videoparse.xml: * docs/plugins/inspect/plugin-mpegtsparse.xml: * docs/plugins/inspect/plugin-mpegvideoparse.xml: * docs/plugins/inspect/plugin-musepack.xml: * docs/plugins/inspect/plugin-musicbrainz.xml: * docs/plugins/inspect/plugin-mve.xml: * docs/plugins/inspect/plugin-mythtv.xml * docs/plugins/inspect/plugin-nas.xml: * docs/plugins/inspect/plugin-neon.xml: * docs/plugins/inspect/plugin-nsfdec.xml: * docs/plugins/inspect/plugin-nuvdemux.xml: * docs/plugins/inspect/plugin-oss4.xml * docs/plugins/inspect/plugin-rawparse.xml: * docs/plugins/inspect/plugin-real.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rfbsrc.xml: * docs/plugins/inspect/plugin-sdl.xml: * docs/plugins/inspect/plugin-sdp.xml: * docs/plugins/inspect/plugin-selector.xml: * docs/plugins/inspect/plugin-sndfile.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-spcdec.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-speexresample.xml: * docs/plugins/inspect/plugin-stereo.xml: * docs/plugins/inspect/plugin-subenc.xml * docs/plugins/inspect/plugin-timidity.xml: * docs/plugins/inspect/plugin-tta.xml: * docs/plugins/inspect/plugin-vcdsrc.xml: * docs/plugins/inspect/plugin-videosignal.xml: * docs/plugins/inspect/plugin-vmnc.xml: * docs/plugins/inspect/plugin-wildmidi.xml: * docs/plugins/inspect/plugin-x264.xml: * docs/plugins/inspect/plugin-xvid.xml: * docs/plugins/inspect/plugin-y4menc.xml: * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/dc1394/gstdc1394.c: * ext/directfb/dfbvideosink.c: * ext/ivorbis/vorbisdec.c: * ext/jack/gstjackaudiosink.c: * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mplex/gstmplex.cc: * ext/musicbrainz/gsttrm.c: * ext/mythtv/gstmythtvsrc.c: * ext/theora/theoradec.c: * ext/timidity/gsttimidity.c: * ext/timidity/gstwildmidi.c: * gst-libs/gst/app/gstappsink.c: * gst/deinterlace/gstdeinterlace.c: * gst/dvdspu/gstdvdspu.c: * gst/festival/gstfestival.c: * gst/freeze/gstfreeze.c: * gst/interleave/deinterleave.c: * gst/interleave/interleave.c: * gst/modplug/gstmodplug.cc: * gst/nuvdemux/gstnuvdemux.c: Add missing elements to docs. Fix doc-markup: use convinience syntax for examples (produces valid docbook), add several refsec2 when we have several titles. Fix some types. 2008-06-12 14:49:18 +0000 Stefan Kost Do not use short_description in section docs for elements. We extract them from element details and there will be war... Original commit message from CVS: * ext/dc1394/gstdc1394.c: * ext/ivorbis/vorbisdec.c: * ext/jack/gstjackaudiosink.c: * ext/metadata/gstmetadatademux.c: * ext/mythtv/gstmythtvsrc.c: * ext/theora/theoradec.c: * gst-libs/gst/app/gstappsink.c: * gst/bayer/gstbayer2rgb.c: * gst/deinterlace/gstdeinterlace.c: * gst/rawparse/gstaudioparse.c: * gst/rawparse/gstvideoparse.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/selector/gstinputselector.c: * gst/selector/gstoutputselector.c: * gst/videosignal/gstvideoanalyse.c: * gst/videosignal/gstvideodetect.c: * gst/videosignal/gstvideomark.c: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: Do not use short_description in section docs for elements. We extract them from element details and there will be warnings if they differ. Also fixing up the ChangeLog order. 2008-05-26 17:52:21 +0000 Wim Taymans ext/jack/gstjackaudiosink.c: Include the element name in the port name to avoid duplicate port names. Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (gst_jack_audio_sink_allocate_channels): Include the element name in the port name to avoid duplicate port names. 2008-04-06 20:18:16 +0000 Tim-Philipp Müller ext/jack/gstjackaudiosink.c: Work around missing bits of thread-safety on older GLibs some more to avoid assertions w... Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (gst_jack_audio_sink_class_init): Work around missing bits of thread-safety on older GLibs some more to avoid assertions when starting up multiple playbin objects concurrently (see #512382). 2008-03-13 14:25:20 +0000 Sebastian Dröge Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values where possible. Fixes bug #522212. Original commit message from CVS: * ext/alsaspdif/alsaspdifsink.c: * ext/gsm/gstgsm.c: * ext/jack/gstjack.c: * ext/libmms/gstmms.c: * ext/neon/gstneonhttpsrc.c: * ext/shout/gstshout.c: * ext/timidity/gsttimidity.c: * ext/timidity/gstwildmidi.c: * gst/nuvdemux/gstnuvdemux.c: * gst/tta/gsttta.c: Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values where possible. Fixes bug #522212. 2007-07-18 07:42:47 +0000 Stefan Kost ext/jack/gstjackaudiosink.c: Add stdlib include here too. Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_open_device), (gst_jack_ring_buffer_acquire): Add stdlib include here too. 2007-04-04 07:36:28 +0000 Stefan Kost ext/jack/gstjackaudiosink.c: Try t better name clients. properly handle return codes when re- establishing links. Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_open_device), (gst_jack_ring_buffer_acquire): Try t better name clients. properly handle return codes when re- establishing links. 2007-03-18 17:57:48 +0000 Paul Davis ext/jack/gstjackaudioclient.c: Don't need to take the connection lock, it will not be used and could cause deadlocks. Original commit message from CVS: Based on patch by: Paul Davis * ext/jack/gstjackaudioclient.c: (gst_jack_audio_unref_connection): Don't need to take the connection lock, it will not be used and could cause deadlocks. 2007-03-08 15:24:52 +0000 Paul Davis ext/jack/: Make an object to manage client connections to the jack server which we will use in the future to run sele... Original commit message from CVS: Includes patch by: Paul Davis * ext/jack/Makefile.am: * ext/jack/gstjackaudioclient.c: (gst_jack_audio_client_init), (jack_process_cb), (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), (connection_find), (gst_jack_audio_make_connection), (gst_jack_audio_get_connection), (gst_jack_audio_unref_connection), (gst_jack_audio_connection_add_client), (gst_jack_audio_connection_remove_client), (gst_jack_audio_client_new), (gst_jack_audio_client_free), (gst_jack_audio_client_get_client), (gst_jack_audio_client_set_active): * ext/jack/gstjackaudioclient.h: Make an object to manage client connections to the jack server which we will use in the future to run selected jack elements with the same jack connection. Make some stuff a bit more threadsafe. Activate the jack client ASAP. * ext/jack/gstjackaudiosink.c: (gst_jack_audio_sink_allocate_channels), (gst_jack_audio_sink_free_channels), (jack_process_cb), (gst_jack_ring_buffer_open_device), (gst_jack_ring_buffer_close_device), (gst_jack_ring_buffer_acquire), (gst_jack_ring_buffer_release), (gst_jack_audio_sink_class_init), (gst_jack_audio_sink_init), (gst_jack_audio_sink_getcaps): * ext/jack/gstjackaudiosink.h: Use new client object to manage connections. Don't remove and recreate all ports, try to reuse them. 2007-01-12 10:25:40 +0000 Wim Taymans ext/jack/gstjackaudiosink.*: Improve docs. Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), (gst_jack_ring_buffer_acquire): * ext/jack/gstjackaudiosink.h: Improve docs. 2006-12-06 16:57:17 +0000 Jan Schmidt ext/jack/.cvsignore: Ignore old files as requested by the build slave. Original commit message from CVS: * ext/jack/.cvsignore: Ignore old files as requested by the build slave. 2006-11-30 11:59:04 +0000 Wim Taymans ext/Makefile.am: Fix build. Original commit message from CVS: * ext/Makefile.am: Fix build. * ext/jack/gstjackaudiosink.c: (jack_process_cb), (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), (gst_jack_ring_buffer_acquire): Small cleanups. 2006-11-30 11:49:36 +0000 Wim Taymans Added fully functional jackaudiosink. Original commit message from CVS: * configure.ac: * ext/Makefile.am: * ext/jack/Makefile.am: * ext/jack/gstjack.c: (plugin_init): * ext/jack/gstjack.h: * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_get_type), (gst_jack_ring_buffer_class_init), (jack_process_cb), (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), (gst_jack_ring_buffer_init), (gst_jack_ring_buffer_dispose), (gst_jack_ring_buffer_finalize), (gst_jack_ring_buffer_open_device), (gst_jack_ring_buffer_close_device), (gst_jack_ring_buffer_acquire), (gst_jack_ring_buffer_release), (gst_jack_ring_buffer_start), (gst_jack_ring_buffer_pause), (gst_jack_ring_buffer_stop), (gst_jack_ring_buffer_delay), (gst_jack_connect_get_type), (gst_jack_audio_sink_base_init), (gst_jack_audio_sink_class_init), (gst_jack_audio_sink_init), (gst_jack_audio_sink_set_property), (gst_jack_audio_sink_get_property), (gst_jack_audio_sink_getcaps), (gst_jack_audio_sink_create_ringbuffer): * ext/jack/gstjackaudiosink.h: Added fully functional jackaudiosink. 2006-04-08 21:48:01 +0000 Stefan Kost Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) Original commit message from CVS: * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): * ext/arts/gst_arts.c: (gst_arts_class_init): * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): * ext/audiofile/gstafsink.c: (gst_afsink_class_init): * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): * ext/audioresample/gstaudioresample.c: * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_class_init): * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): * ext/jack/gstjack.c: (gst_jack_class_init): * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): * ext/nas/nassink.c: (gst_nassink_class_init): * ext/shout/gstshout.c: (gst_icecastsend_class_init): * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): * ext/sndfile/gstsf.c: (gst_sf_class_init): * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), (gst_swfdec_class_init): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): * gst/chart/gstchart.c: (gst_chart_class_init): * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): * gst/festival/gstfestival.c: (gst_festival_class_init): * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): * gst/filter/gstiir.c: (gst_iir_class_init): * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): * gst/mpeg1sys/gstmpeg1systemencode.c: (gst_system_encode_class_init): * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_class_init): * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_class_init): * gst/overlay/gstoverlay.c: (gst_overlay_class_init): * gst/passthrough/gstpassthrough.c: (passthrough_class_init): * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): * gst/smooth/gstsmooth.c: (gst_smooth_class_init): * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): * gst/stereo/gststereo.c: (gst_stereo_class_init): * gst/switch/gstswitch.c: (gst_switch_class_init): * gst/tta/gstttadec.c: (gst_tta_dec_class_init): * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): * sys/directsound/gstdirectsoundsink.c: (gst_directsoundsink_class_init): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): * sys/v4l2/gstv4l2colorbalance.c: (gst_v4l2_color_balance_channel_class_init): * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), (gst_v4l2_tuner_norm_class_init): * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) 2006-04-01 10:09:11 +0000 Thomas Vander Stichele * ext/jack/gstjack.c: rework build; add translations for v4l2 Original commit message from CVS: rework build; add translations for v4l2 2005-10-12 14:29:55 +0000 Stefan Kost renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition Original commit message from CVS: * examples/indexing/indexmpeg.c: (main): * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio), (gst_artsdsink_close_audio), (gst_artsdsink_change_state): * ext/artsd/gstartsdsink.h: * ext/audiofile/gstafparse.c: (gst_afparse_open_file), (gst_afparse_close_file): * ext/audiofile/gstafparse.h: * ext/audiofile/gstafsink.c: (gst_afsink_open_file), (gst_afsink_close_file), (gst_afsink_chain), (gst_afsink_change_state): * ext/audiofile/gstafsink.h: * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), (gst_afsrc_close_file), (gst_afsrc_change_state): * ext/audiofile/gstafsrc.h: * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_init): * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_init): * ext/dts/gstdtsdec.c: (gst_dtsdec_init): * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: (gst_jack_bin_init), (gst_jack_bin_change_state): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_init): * ext/nas/nassink.c: (gst_nassink_open_audio), (gst_nassink_close_audio), (gst_nassink_change_state): * ext/nas/nassink.h: * ext/polyp/polypsink.c: (gst_polypsink_init): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_change_state): * ext/sdl/sdlvideosink.h: * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): * ext/sndfile/gstsf.c: (gst_sf_set_property), (gst_sf_change_state), (gst_sf_release_request_pad), (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): * ext/sndfile/gstsf.h: * ext/swfdec/gstswfdec.c: (gst_swfdec_init): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_init): * gst/apetag/apedemux.c: (gst_ape_demux_init): * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): * gst/festival/gstfestival.c: (gst_festival_change_state): * gst/festival/gstfestival.h: * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_init), (gst_multifilesink_set_location), (gst_multifilesink_open_file), (gst_multifilesink_close_file), (gst_multifilesink_next_file), (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), (gst_multifilesink_chain), (gst_multifilesink_change_state): * gst/multifilesink/gstmultifilesink.h: * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): * sys/cdrom/gstcdplayer.c: (cdplayer_init): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init), (dxr3audiosink_open), (dxr3audiosink_close), (dxr3audiosink_chain_pcm), (dxr3audiosink_chain_ac3), (dxr3audiosink_change_state): * sys/dxr3/dxr3audiosink.h: * sys/dxr3/dxr3spusink.c: (dxr3spusink_init), (dxr3spusink_open), (dxr3spusink_close), (dxr3spusink_chain), (dxr3spusink_change_state): * sys/dxr3/dxr3spusink.h: * sys/dxr3/dxr3videosink.c: (dxr3videosink_init), (dxr3videosink_open), (dxr3videosink_close), (dxr3videosink_write_data), (dxr3videosink_change_state): * sys/dxr3/dxr3videosink.h: * sys/glsink/glimagesink.c: (gst_glimagesink_init): * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), (gst_qcamsrc_open), (gst_qcamsrc_close): * sys/qcam/gstqcamsrc.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): * sys/vcd/vcdsrc.c: (gst_vcdsrc_set_property), (gst_vcdsrc_get), (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), (gst_vcdsrc_change_state), (gst_vcdsrc_recalculate): * sys/vcd/vcdsrc.h: renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition 2005-09-05 17:20:29 +0000 Jan Schmidt * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: Fix up all the state change functions. Original commit message from CVS: Fix up all the state change functions. 2004-08-03 14:28:12 +0000 Benjamin Otte fixes for G_DISABLE_ASSERT and friends Original commit message from CVS: * examples/dynparams/filter.c: (ui_control_create): * examples/gstplay/player.c: (print_tag): * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad): * ext/gdk_pixbuf/gstgdkanimation.c: (gst_gdk_animation_iter_may_advance): * ext/jack/gstjack.c: (gst_jack_request_new_pad): * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), (tag_list_to_id3_tag_foreach), (gst_id3_tag_handle_event): * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_tag_value): * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value): * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): * gst-libs/gst/media-info/media-info-test.c: (print_tag): * gst/sine/demo-dparams.c: (main): * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): * testsuite/alsa/formats.c: (create_pipeline): * testsuite/alsa/sinesrc.c: (sinesrc_force_caps), (sinesrc_get): fixes for G_DISABLE_ASSERT and friends * gst/typefind/gsttypefindfunctions.c: (aac_type_find), (mp3_type_frame_length_from_header), (mp3_type_find), (plugin_init): require mp3 typefinding to have at least MIN_HEADERS valid headers add typefinding for AAC adts files 2004-05-21 23:28:57 +0000 Stéphane Loeuillet * ext/jack/gstjack.c: * ext/jack/gstjack.h: second batch : remove ',' at end of enums as they could confuse older gcc, foreign compilers (forte) and gtk-doc (in ... Original commit message from CVS: second batch : remove ',' at end of enums as they could confuse older gcc, foreign compilers (forte) and gtk-doc (in gst-plugins/ext/ this time) 2004-03-15 19:32:27 +0000 Thomas Vander Stichele * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: don't mix tabs and spaces Original commit message from CVS: don't mix tabs and spaces 2004-03-15 16:32:54 +0000 Johan Dahlin *.h: Revert indenting Original commit message from CVS: * *.h: Revert indenting 2004-03-14 22:34:33 +0000 Thomas Vander Stichele * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: gst-indent Original commit message from CVS: gst-indent 2004-01-12 03:40:18 +0000 David Schleef * ext/jack/gstjack.c: Remove all usage of gst_pad_get_caps(), and replace it with gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). Original commit message from CVS: Remove all usage of gst_pad_get_caps(), and replace it with gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). 2003-12-22 01:47:09 +0000 David Schleef * ext/jack/gstjack.c: Merge CAPS branch Original commit message from CVS: Merge CAPS branch 2003-12-13 16:59:51 +0000 Benjamin Otte * ext/jack/gstjackbin.c: removed GST_*_CAST. Disabling of type checking is done in glib. Original commit message from CVS: removed GST_*_CAST. Disabling of type checking is done in glib. 2003-12-04 10:37:38 +0000 Andy Wingo * ext/jack/gstjack.c: remove copyright field from plugins Original commit message from CVS: remove copyright field from plugins 2003-11-07 12:47:02 +0000 Ronald S. Bultje * ext/jack/gstjackbin.c: Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes fro... Original commit message from CVS: Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes from several source files 2003-11-01 23:43:13 +0000 Iain Holmes * ext/jack/gstjack.c: Jack fixed too Original commit message from CVS: Jack fixed too 2003-10-29 03:15:55 +0000 David Schleef * ext/jack/gstjack.h: change gst/bytestream.h to gst/bytestream/bytestream.h Original commit message from CVS: change gst/bytestream.h to gst/bytestream/bytestream.h 2003-10-28 20:52:41 +0000 Benjamin Otte * ext/jack/gstjack.h: merge TYPEFIND branch. Major changes: Original commit message from CVS: merge TYPEFIND branch. Major changes: - totally reworked type(find) system - all typefind functions are in gst/typefind now - more typefind functions then before - some plugins might fail to compile now because I don't have them installed and they a) require bytestream or b) haven't had their typefind fixed. Please fix those plugins and put the typefind functions into gst/typefind if they don't have dependencies 2003-10-08 16:08:19 +0000 Andy Wingo * ext/jack/gstjack.c: /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. Original commit message from CVS: /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. 2003-10-01 13:14:50 +0000 Ronald S. Bultje * ext/jack/gstjack.h: New typefind system: bytestream is now part of the core all plugins have been modified to use this new typefind syste... Original commit message from CVS: New typefind system: * bytestream is now part of the core * all plugins have been modified to use this new typefind system * asf typefinding added * mpeg video stream typefiding removed because it's broken * duplicate typefind entries removed * extra id3 typefinding added, because we've seen 4 types of files (riff/wav, flac, vorbis, mp3) with id3 headers and each of these needs to work. Instead, I've added an id3 element and let it redo typefiding after the id3 header. this needs a hack because spider only typefinds once. We can remove this hack once spider supports multiple typefinds. * with all this, mp3 typefinding is semi-rewritten * id3 typefinding in flac/vorbis is removed, it's no longer needed * fixed spider and gst-typefind to use this, too. * Other general cleanups 2003-09-30 12:56:27 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: conform to the buffer-frames props entry -- much nicer now... Original commit message from CVS: conform to the buffer-frames props entry -- much nicer now... 2003-08-10 00:01:58 +0000 David Schleef * ext/jack/Makefile.am: Remove redundant plugindir definition Original commit message from CVS: Remove redundant plugindir definition 2003-07-19 23:25:25 +0000 Leif Johnson * ext/jack/gstjack.c: * ext/jack/gstjack.h: + changes for new float caps without slope/intercept + some category changes for plugins Original commit message from CVS: + changes for new float caps without slope/intercept + some category changes for plugins 2003-07-06 20:49:52 +0000 Ronald S. Bultje * ext/jack/gstjack.c: New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as descri... Original commit message from CVS: New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs 2003-07-01 02:27:06 +0000 David Schleef * ext/jack/gstjack.c: fix type punning Original commit message from CVS: fix type punning 2003-06-29 19:46:13 +0000 Benjamin Otte * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: compatibility fix for new GST_DEBUG stuff. Original commit message from CVS: compatibility fix for new GST_DEBUG stuff. Includes fixes for missing includes for config.h and unistd.h I only ensured for plugins I can build that they work, so if some of them are still broken, you gotta fix them yourselves unfortunately. 2003-06-13 21:21:17 +0000 Wim Taymans * ext/jack/gstjack.c: Removed ugly caps fixed flag hack, will be done automatically in core soon Original commit message from CVS: Removed ugly caps fixed flag hack, will be done automatically in core soon 2003-03-04 15:34:20 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: update for the latest jack cvs and non-cothreaded gst scheduler Original commit message from CVS: update for the latest jack cvs and non-cothreaded gst scheduler 2003-02-05 20:38:41 +0000 Jan Schmidt * ext/jack/gstjack.c: Changed caps->fixed to use FLAG_SET Original commit message from CVS: Changed caps->fixed to use FLAG_SET 2003-01-10 13:38:32 +0000 Thomas Vander Stichele * ext/jack/gstjack.c: PadConnect -> PadLink Original commit message from CVS: PadConnect -> PadLink 2003-01-10 10:22:25 +0000 Thomas Vander Stichele * ext/jack/gstjack.c: another batch of connect->link fixes please let me know about issues and please refrain of making them yourself, so t... Original commit message from CVS: another batch of connect->link fixes please let me know about issues and please refrain of making them yourself, so that I don't spend double the time resolving conflicts 2002-12-08 14:50:10 +0000 Thomas Vander Stichele * ext/jack/Makefile.am: parallel install fixes Original commit message from CVS: parallel install fixes 2002-09-29 18:12:18 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: licenses again Original commit message from CVS: licenses again 2002-09-18 19:02:52 +0000 Christian Schaller * ext/jack/gstjack.c: plugins part of license field patch Original commit message from CVS: plugins part of license field patch 2002-09-10 09:31:40 +0000 Ronald S. Bultje * ext/jack/gstjack.c: This updates all plugins to the new API for gst_pad_try_set_caps Original commit message from CVS: This updates all plugins to the new API for gst_pad_try_set_caps 2002-09-09 23:27:38 +0000 Thomas Vander Stichele * ext/jack/gstjack.c: removing warnings as approved by wim Original commit message from CVS: removing warnings as approved by wim 2002-08-23 04:04:11 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: fix jack input port connection Original commit message from CVS: fix jack input port connection 2002-07-09 17:39:17 +0000 Andy Wingo * ext/jack/gstjack.c: compile fixen, and prepare to move MAINTAINER_MODE to as-version.m4 Original commit message from CVS: compile fixen, and prepare to move MAINTAINER_MODE to as-version.m4 2002-07-02 23:35:07 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: make jack work in all its full duplex glory Original commit message from CVS: make jack work in all its full duplex glory 2002-06-12 03:32:02 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjackbin.c: working jack elements (fixed a problem in upstream jack) random other fixen... Original commit message from CVS: * working jack elements (fixed a problem in upstream jack) * random other fixen... 2002-05-15 19:08:49 +0000 Steve Baker * ext/jack/gstjack.c: use new bytestream api Original commit message from CVS: use new bytestream api 2002-05-13 18:08:33 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: update to new jack api Original commit message from CVS: update to new jack api 2002-05-05 19:39:17 +0000 Andy Wingo * ext/jack/gstjack.c: add some includes Original commit message from CVS: add some includes 2002-05-05 01:08:05 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: better initialization. it doesn't work over here, though. Original commit message from CVS: better initialization. it doesn't work over here, though. 2002-05-04 21:38:56 +0000 Andy Wingo * ext/jack/gstjackbin.c: a commit so that jack will build without errors on Uraeus's system ;) Original commit message from CVS: a commit so that jack will build without errors on Uraeus's system ;) 2002-05-04 20:53:35 +0000 Andy Wingo * ext/jack/gstjack.c: set caps once we know the sample rate of the system Original commit message from CVS: set caps once we know the sample rate of the system 2002-05-04 18:57:44 +0000 Andy Wingo * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: some jack fixes, alsa touchups, and add rtp by default to the build if there are any problems building rtp, we're mov... Original commit message from CVS: some jack fixes, alsa touchups, and add rtp by default to the build if there are any problems building rtp, we're moving it back to experimental ;) 2002-04-20 21:42:51 +0000 Andy Wingo * ext/jack/gstjack.c: a hack to work around intltool's brokenness a current check for mpeg2dec details->klass reorganizations an element br... Original commit message from CVS: * a hack to work around intltool's brokenness * a current check for mpeg2dec * details->klass reorganizations * an element browser that uses details->klass * separated cdxa parse out from the avi directory 2002-04-16 17:14:05 +0000 Andy Wingo * ext/jack/Makefile.am: * ext/jack/gstjack.c: * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: Finally we're on to a proper jack setup, with a specialized bin and elements that can only go in a jack bin. I had to... Original commit message from CVS: Finally we're on to a proper jack setup, with a specialized bin and elements that can only go in a jack bin. I had to fix the parser first to do this, but to run it, the syntax is like so: gst-launch jackbin.( filesrc ! mad ! jacksink ) But of course it's not fully functional yet. Sigh. 2002-04-11 20:42:26 +0000 Andy Wingo * ext/jack/gstjack.c: GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE same with *factory and typefind. Original commit message from CVS: GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE same with *factory and typefind. also, some -Werror fixes. 2002-03-30 21:07:51 +0000 Andy Wingo * ext/jack/gstjack.c: alphabetization fixen a jack caps fix Original commit message from CVS: * alphabetization fixen * a jack caps fix 2002-03-30 19:31:13 +0000 Andy Wingo * ext/jack/gstjack.c: add notify back to filesrc, it's needed for MVC applications remove notify printouts from gst-launch cleanup in gst-p... Original commit message from CVS: * add notify back to filesrc, it's needed for MVC applications * remove notify printouts from gst-launch * cleanup in gst-plugins configure.ac * some jack updates * remove SELF_ITERATING flag in favor of SEF_SCHEDULABLE (not a clear name, but it's what we have for the moment) * improve parsing of request pad names, no more sscanf * fixes to the fastscheduler Makefile.am 2002-03-20 21:45:04 +0000 Andy Wingo * ext/jack/gstjack.c: s/Gnome-Streamer/GStreamer/ Original commit message from CVS: s/Gnome-Streamer/GStreamer/ 2002-03-19 04:10:06 +0000 Andy Wingo * ext/jack/Makefile.am: * ext/jack/gstjack.c: removal of //-style comments don't link plugins to core libs -- the versioning is done internally to the plugins with... Original commit message from CVS: * removal of //-style comments * don't link plugins to core libs -- the versioning is done internally to the plugins with the plugin_info struct, and symbol resolution is lazy, so we can always know if a plugin can be loaded by the plugin_info data. in theory. 2002-03-19 01:39:43 +0000 Andy Wingo * ext/jack/Makefile.am: s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ @-substitued variables variables are defined as make variables automagi... Original commit message from CVS: s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ @-substitued variables variables are defined as make variables automagically, and this gives the user the freedom to say make GST_PLUGIN_LDFLAGS=-myflag 2002-03-18 04:41:35 +0000 Andy Wingo * ext/jack/Makefile.am: * ext/jack/README: * ext/jack/gstjack.c: * ext/jack/gstjack.h: s/gst_element_install_std_props/gst_element_class_install_std_props/ -- it just makes more sense that way added jack ... Original commit message from CVS: * s/gst_element_install_std_props/gst_element_class_install_std_props/ -- it just makes more sense that way * added jack element, doesn't quite work right yet but i didn't want to lose the work -- it does build, register, and attempt to run though * imposed some restrictions on the naming of request pads to better allow for reverse parsing * added '%s' to reverse parsing * added new bin flag to indicate that it is self-iterating, and some lame code in gst-launch to test it out * fixen on launch-gui * added pkg-config stuff for the editor's libs 2011-01-02 11:37:14 +0000 Tim-Philipp Müller * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/v4l2_calls.c: v4l2: mark v4l2sink as experimental and build only if --enable-experimental is passed It's not really of 'good' quality yet, but there's a lot of code shared with v4l2src, so not so easy to move it elswhere. https://bugzilla.gnome.org/show_bug.cgi?id=612244 2011-01-02 01:24:21 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/v4l2_calls.c: Revert "v4l2: add norm property" This reverts commit 9e1d419d07337e6db2cc3936472be205ce927e54. Reverting this since it adds unreviewed and bad API to v4l2src (property of type enum, with seemingly random and unsorted values). 2011-01-01 23:26:33 +0000 Tim-Philipp Müller * tools/.gitignore: * tools/Makefile.am: * tools/README.filterstamp: * tools/filterstamp.sh: * tools/gst-launch-ext-m.m: * tools/gst-launch-ext.1.in: * tools/gst-visualise-m.m: * tools/gst-visualise.1.in: tools: remove unused left-over directory These are all in -base/tools. 2010-12-31 13:57:05 +0100 Wim Taymans * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4adepay.h: mp4adepay: improve timestamps on outgoing packets Improve parsing of the samplerate. Parse the framelen so that we can calculate timestamps. When interpollate the incomming timestamp on outgoing buffers when there are multiple subframes. fixes #625825 2010-12-31 02:16:54 +0000 Tim-Philipp Müller * ext/cairo/gsttimeoverlay.c: * gst/videofilter/gstvideobalance.c: cairo, videofilter: use gst/math-compat.h header for rint 2010-12-30 14:30:27 -0800 David Schleef * gst/videofilter/gstvideobalance.c: videobalance: Check for HAVE_RINT instead Also change M_PI to G_PI for giggles. 2010-12-30 14:21:37 -0800 David Schleef * ext/cairo/gstcairorender.c: cairo: Don't use #ifdefs inside macros 2010-12-30 14:20:52 -0800 David Schleef * gst/audiofx/audiochebband.c: * gst/audiofx/audiocheblimit.c: * gst/audiofx/audiokaraoke.c: * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: * gst/effectv/gstop.c: * gst/equalizer/gstiirequalizer.c: * gst/goom/convolve_fx.c: * gst/goom/ifs.c: * gst/goom/lines.c: * gst/goom/tentacle3d.c: * tests/examples/audiofx/firfilter-example.c: * tests/examples/audiofx/iirfilter-example.c: Change M_PI to G_PI 2010-12-30 12:07:52 -0800 David Schleef * gst/videofilter/gstvideobalance.c: videobalance: use G_OS_WIN32 for windows check 2010-12-30 16:24:16 +0100 Wim Taymans * gst/rtp/gstrtpmp4adepay.c: mp4adepay: fix timestamps on buffers 2010-12-30 16:22:48 +0100 Wim Taymans * gst/rtp/gstrtpmpvpay.c: mpvpay: fix flushing and discont Fix flushing and disconts. Clean up in state changes. 2010-12-29 23:38:18 +0000 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska-demux: increase allowed max. block size for push mode from 10M to 15M It was an arbitrary limit from the start, meant as a basic sanity check, so may just as well increase it a little. Would be good to provide progress reporting while completing the block in any case.. https://bugzilla.gnome.org/show_bug.cgi?id=637060 2010-12-29 23:09:04 +0000 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska-demux: assume matroska if no doctype is specified https://bugzilla.gnome.org/show_bug.cgi?id=638019 2010-12-04 13:43:11 -0600 Rob Clark * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: v4l2: add interlaced support 2010-10-02 14:45:14 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2sink.h: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/gstv4l2xoverlay.h: v4l2sink: add navigation support 2010-04-04 06:43:41 -0500 Rob Clark * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/v4l2_calls.c: v4l2: add norm property Based on a patch by Guennadi Liakhovetski. 2010-07-13 10:03:51 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2_calls.h: v4l2: cleanup get/set input/output output devices should use get/set output, and in either case we should not print a warning message if the ioctl fails but the device does not claim to support the tuner interface 2010-06-10 11:15:46 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/gstv4l2xoverlay.h: v4l2xoverlay: add support to create window If xoverlay is available, v4l2sink should create a window for the overlay to display in. The window automatically tries to make itself as large as possible. This works well on a small screen, but perhaps should first attempt to use the size of the video that is played (no scaling). 2010-04-04 06:41:28 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: v4l2sink: special handling for cases gst_buffer_make_metadata_writable() Special case check for sub-buffers: In certain cases, places like GstBaseTransform, which might check that the buffer is writable before copying metadata, timestamp, and such, will find that the buffer has more than one reference to it. In these cases, they will create a sub-buffer with an offset=0 and length equal to the original buffer size. This could happen in two scenarios: (1) a tee in the pipeline, and (2) because the refcnt is incremented in gst_mini_object_free() before the finalize function is called, and decremented after it returns.. but returning this buffer to the buffer pool in the finalize function, could wake up a thread blocked in _buffer_alloc() which could run and get a buffer w/ refcnt==2 before the thread originally unref'ing the buffer returns from finalize function and decrements the refcnt back to 1! This is related to issue #545501 2010-04-04 06:39:52 -0500 Rob Clark * sys/v4l2/gstv4l2bufferpool.c: v4l2: fix race condition The size of the buffer would be zero'd out in gst_v4l2_buffer_finalize() after the buffer is qbuf'd or pushed onto the queue of available buffers.. leaving a race condition where the thread waiting for the buffer could awake and set back a valid size before the finalizing thread zeros out the length. This would result that the newly allocated buffer has length of zero. 2010-04-04 06:39:08 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2sink.h: v4l2sink: add properties to control crop 2010-04-04 06:37:16 -0500 Rob Clark * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2xoverlay.c: v4l2: re-enable x-overlay support 2010-12-25 11:52:36 -0600 Rob Clark * sys/v4l2/gstv4l2sink.c: v4l2sink: fix for PAUSED->READY->PAUSED state transitions When v4l2sink goes to PAUSED->READY it only stops streaming, so the state should be set to STATE_PENDING_STREAMON in case the element transitions back to PLAYING. 2010-04-04 06:28:51 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2sink.h: v4l2sink: add "min-queued-bufs" property 2010-04-04 06:26:50 -0500 Rob Clark * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2bufferpool.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/v4l2src_calls.c: v4l2sink: Add support for blocking dequeue. We'd prefer to throttle the decoder if we run out of buffers, to keep a bound on memory usage. Also, for OMAP4 it is a requirement of the decoder to not alternate between memory alloced by the display driver and malloc'd userspace memory. 2010-04-04 06:24:41 -0500 Rob Clark * sys/v4l2/gstv4l2bufferpool.c: v4l2: clear flags before reusing buffer from buffer pool note: this really only affects v4l2sink since gst_v4l2_buffer_pool_get() is only called once per buffer in the v4l2src case (in gst_v4l2src_buffer_pool_activate()) 2010-04-04 06:23:31 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: v4l2sink: don't render preroll buffers Most v4l2 drivers will get upset when you queue the same buffer twice in a row without first dequeueing it. Rendering of pre-roll buffers can be re-introduced later, but will require tracking the state of the buffer, and avoiding to re-QBUF if the buffer has already been passed to the driver. 2010-04-04 06:22:43 -0500 Rob Clark * sys/v4l2/gstv4l2sink.c: v4l2sink: Improve behavior for shared buffers. When the decoder is using pad_alloc(), v4l2sink would behave badly if the number of buffers ('queue-size' property) was not high enough to account for all the buffers needed by the decoder, and other elements (such as queues) between the decoder and v4l2sink. This patch slightly increases the default number of buffers, and changes v4l2sink to drop frames rather than return an error in case the number of buffers is not high enough. 2010-11-15 15:58:28 +0100 Andy Wingo * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: add "client" property * ext/pulse/pulsesrc.c (gst_pulsesrc_class_init, gst_pulsesrc_init) (gst_pulsesrc_set_property, gst_pulsesrc_get_property) (gst_pulsesrc_open): Add a "client" property, as in pulsesink. Fixes #634914 2010-12-29 15:54:46 +0000 Tim-Philipp Müller * gst/rtsp/gstrtspsrc.c: rtspsrc: serialise/deserialise floats without changing locale Use g_ascii_dtostr() and g_ascii_strtod() to serialise/deserialise floating point numbers, instead of ugly hacks that switch locale before and after calling libc functions (which is not a good idea in a multi-threaded application). 2010-12-29 14:40:05 +0000 Tim-Philipp Müller * gst/rtp/gstrtpjpegdepay.c: rtpjpegdepay: fix framerate parsing for locales that use a comma as floating point atof() converts strings according to the current locale, but the framerate string will likely always use a dot as floating point separator, so use g_ascii_strtod() instead (but also canonicalise the string before, so we can handle both formats as input). 2010-12-27 13:11:59 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: use the right variable Use the right variable for specifying that we sent a receiver report. 2010-12-23 16:42:29 -0600 Rob Clark * sys/v4l2/gstv4l2bufferpool.c: v4l2: fix typo 2010-12-23 16:03:00 -0600 Rob Clark * gst/matroska/matroska-demux.c: matroska-demux: add stream-format and alignment properties for h264 2010-12-22 11:41:59 +0100 Wim Taymans * gst/rtp/gstrtpgstpay.c: gstpay: fix klass, add RTP as a use case 2010-12-12 15:10:47 +0100 Wim Taymans * gst/rtp/gstrtpgstdepay.c: gstdepay: cleanup the cache 2010-12-12 05:10:01 +0100 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpgstdepay.c: * gst/rtp/gstrtpgstdepay.h: * gst/rtp/gstrtpgstpay.c: * gst/rtp/gstrtpgstpay.h: gstpay/depay: add generic gstreamer payloader Add the beginnings of a generic GStreamer buffers payloader. 2010-12-23 17:06:58 +0100 Wim Taymans * gst/rtp/gstrtpmp4gpay.c: mp4gpay: reset state on flush-stop 2010-12-23 16:26:07 +0100 Wim Taymans * gst/rtp/gstrtpmp4gdepay.c: mp4gdepay: flush state on flush-stop 2010-12-23 16:25:15 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: on-npt-stop is a manager signal 2010-12-23 15:24:29 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: improve RTP session handling Store the RTP session in the stream so that we can more efficiently perform actions on the stream based on RTP signals. 2010-12-23 13:55:31 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: include last send RB block Only report RB values for non-internal sources. Report not only the RB blocks we last received from but also the last RB block we sent to a source. 2010-12-23 13:52:57 +0100 Wim Taymans * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsource.h: rtpsession: remember last sent RB values. 2010-12-23 13:00:49 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: include all stats and document Include all possible stats of a source in the stats structure because we might be interested in what happened in the past. Document the stats property and the fields. 2010-12-23 12:59:59 +0100 Wim Taymans * tests/examples/rtp/client-PCMA.c: examples: add example RTP stats Add some more RTP examples for how to retrieve RTP stats in a receiver. 2010-12-23 12:58:05 +0100 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: also emit RTCP activity on SR Also emit RTCP activity signals when we receive an SR packet without RB blocks, such as from a sender that is not receiving anything. 2010-12-23 11:10:55 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: docs: add some more gstrtpbin docs 2010-12-22 21:27:11 +0100 Edward Hervey * sys/ximage/gstximagesrc.c: ximagesrc: remote is a boolean (and not uint) property 2010-12-22 19:58:21 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Don't use gst_pad_alloc_buffer() Using this in a demuxer will cause deadlocks if there's a pad with a pending pad-block downstream, no matter if there is a queue between the pad or not. Queues pass bufferalloc downstream from the same thread and only act as a thread boundary for events and buffers. 2010-12-22 14:14:08 +0000 Tim-Philipp Müller * gst/matroska/matroska-mux.c: matroskamux: fix subtitle pad template, we only handle kate for now 2010-12-16 11:44:44 +0000 Tim-Philipp Müller * gst/rtsp/gstrtspsrc.c: docs: update rtspsrc docs, rtpbin is not in -bad any more 2010-12-22 11:42:31 +0100 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpsession: unlock before emitting signals 2010-12-21 22:34:49 +0100 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpac3pay.c: * gst/rtp/gstrtpac3pay.h: rtpac3pay: add AC3 payloader 2010-12-21 22:17:19 +0100 Wim Taymans * gst/rtp/gstrtpac3depay.c: ac3depay: fix debug category description 2010-12-21 22:16:42 +0100 Wim Taymans * gst/rtp/gstrtpmpapay.c: mpapay: add debug category 2010-12-20 14:49:02 -0300 Thiago Santos * tests/check/Makefile.am: * tests/check/elements/jpegenc.c: jpegenc: Adds another test case Adds a test for jpegenc to check that is possible to negotiate and push buffers with different resolution one after another. https://bugzilla.gnome.org/show_bug.cgi?id=637686 2010-12-21 13:37:40 -0300 Thiago Santos * ext/jpeg/gstjpegenc.c: jpegenc: sink pad's getcaps shouldn't use the src pad getcaps Instead of using get_allowed_caps on the srcpad, the sinkpad getcaps should use the getcaps of the srcpad's peer. This way the srcpad can keep using fixed_caps and sinkpad getcaps exposes all caps that can be negotiated https://bugzilla.gnome.org/show_bug.cgi?id=637686 2010-12-21 16:58:47 +0100 Wim Taymans * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdvdepay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpg722depay.c: * gst/rtp/gstrtpg722pay.c: * gst/rtp/gstrtpg723depay.c: * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmparobustdepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpqcelpdepay.c: * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpsirendepay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/rtp/gstrtpvrawpay.c: rtp: add RTP hint to the klass 2010-12-21 16:49:28 +0100 Wim Taymans * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdvdepay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpg722depay.c: * gst/rtp/gstrtpg722pay.c: * gst/rtp/gstrtpg723depay.c: * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmparobustdepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpqcelpdepay.c: * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpsirendepay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/rtp/gstrtpvrawpay.c: rtp: fix rank of payloaders and depayloaders Set the payloaders and depayloaders to a reasonable rank. 2010-12-21 15:24:18 +0100 Wim Taymans * gst/rtp/gstrtpvrawdepay.c: vrawdepay: reset depayloader state Reset the depayloader state on flush-stop. 2010-12-21 15:07:14 +0100 Wim Taymans * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: mp4pay: use vmethod for intercepting events 2010-12-21 13:55:40 +0100 Wim Taymans * gst/rtp/gstrtptheorapay.c: theorapay: clear packet on flush-stop 2010-12-21 13:49:41 +0100 Wim Taymans * gst/rtp/gstrtpvorbispay.c: vorbispay: clear packet on flush-stop 2010-12-21 12:31:44 +0100 Wim Taymans * gst/rtp/gstrtpmp4gdepay.c: mp4gdepay: reset depayloader state 2010-12-21 12:29:58 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: h264pay: flush adapter on flush-stop 2010-12-20 18:49:49 +0100 Wim Taymans * gst/rtp/gstrtpmpapay.c: mpapay: flush last packets on EOS 2010-12-20 17:47:05 +0100 Edward Hervey * common: Automatic update of common submodule From 169462a to 46445ad 2010-12-20 16:51:47 +0100 Wim Taymans * gst/rtp/gstrtpmpapay.c: mpapay: reset payloader on state change 2010-12-20 16:05:36 +0100 Wim Taymans * gst/rtp/gstrtpmpapay.c: mpapay: reset payloader on flush Reset the payloader on a flush event. Handle DISCONT better. 2010-12-20 15:54:45 +0100 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: get better buffering level When the jitterbuffer contains -1 timestamps, make sure we still calculate the buffer fill level by skipping the -1 buffers. Try to be more resilient to weird input timestamps. 2010-12-20 11:10:22 +0100 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: provide a clock. since we are using the clock for sync, we need to also provide a clock for good measure. The reason is that even if downstream elements provide a clock, we don't want to have that clock selected because it might not be running yet. 2010-12-20 10:49:56 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: copy buffering stats when we create an aggregate buffering message, copy the buffering stats form the last message. At least we get correct buffering mode then. 2010-12-19 11:02:41 +0100 Sebastian Dröge * tests/check/pipelines/wavenc.c: wavenc: Fix memory leaks in the unit test 2010-12-19 10:58:16 +0100 Sebastian Dröge * gst/effectv/gstradioac.c: * gst/effectv/gstradioac.h: radioactv: Prevent use of uninitialized values Fixes bug #618652. 2010-12-19 10:22:29 +0100 Sebastian Dröge * gst/debugutils/gstcapsdebug.c: capsdebug: Don't leak pad templates created from static pad templates 2010-11-29 12:36:06 +0000 Vincent Penquerc'h * sys/ximage/gstximagesrc.c: * sys/ximage/gstximagesrc.h: ximagesrc: change from XGetImage to XGetSubImage dependant on a property ximagesrc: change from XGetImage to XGetSubImage dependant on a property to avoid unnecessary performance hits by default. 2010-11-28 16:04:35 +0000 Vincent Penquerc'h * sys/ximage/gstximagesrc.c: ximagesrc: use XGetSubImage instead of XGetImage, works with remote X ximagesrc: use XGetSubImage instead of XGetImage, works with remote X (on my setup anyway...) 2010-11-27 17:15:32 +0000 Vincent Penquerc'h * sys/ximage/gstximagesrc.c: ximagesrc: fix various width/height calculations being off by one, ximagesrc: fix various width/height calculations being off by one, and make it so a single pixel width/height can be captured (except the top left one, as 0,0,0,0 is reserved for full screen as per the property comments). 2010-12-17 19:19:35 -0600 Rob Clark * sys/v4l2/gstv4l2object.c: fix compile errors on macosx with i686-apple-darwin10-gcc-4.2.1: gstv4l2object.c: In function 'gst_v4l2_object_get_nearest_size': gstv4l2object.c:1988: warning: format '%u' expects type 'unsigned int', but argument 12 has type 'gint *' gstv4l2object.c:1988: warning: format '%u' expects type 'unsigned int', but argument 13 has type 'gint *' 2010-12-17 15:38:15 +0100 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: determine output h264 layout using caps negotiation ... thereby (partially) deprecating properties currently controlling whether or not byte-stream output or NAL/AU alignment (though properties still determine fallback if nothing specified in caps). Fixes #606662. 2010-12-16 18:55:43 +0100 Wim Taymans * gst/rtp/gstrtpj2kpay.c: j2kpay: handle EOC correctly Don't include the next 2 bytes when we are at the end of the data and there are no more bytes left. 2010-12-16 15:15:49 +0100 Mark Nauwelaerts * ext/pulse/pulsesink.c: pulsesink: flush remaining buffered samples on EOS ... which can make a difference between all or nothing when dealing with short streams and relatively large ringbuffer segment. 2010-12-16 10:04:19 +0100 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Change classification to Filter/Effect/Video/Deinterlace 2010-12-15 18:21:34 +0100 Edward Hervey * gst/rtp/gstrtpj2kpay.c: rtpj2kpay: Initialize all fields Makes sad compliers happy 2010-12-15 16:22:54 +0100 Wim Taymans * gst/rtp/gstrtpj2kpay.c: j2kpay: cleanup header construction Use a simpler way of constructing the header that doesn't depend on the endianness. 2010-12-15 13:30:50 +0000 Tim-Philipp Müller * configure.ac: configure: depend on -base from git for new rtp base depayloader features This is ok in this case, since the plan is to release core/base again along with good/ugly/bad in the next cycle. 2010-12-15 14:55:58 +0200 Stefan Kost * common: Automatic update of common submodule From 20742ae to 169462a 2010-12-15 13:12:09 +0100 Wim Taymans * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kdepay.h: j2kdepay: add support for buffer lists 2010-12-14 18:12:43 +0100 Wim Taymans * gst/rtpmanager/rtpsession.c: session: fix average RTCP packet size some more. Fix stupid error in averaging macro. Include udp headers in packet length estimation. 2010-12-14 17:15:23 +0100 Wim Taymans * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpstats.c: rtpbin: correctly calculate RTCP packet size 2010-12-14 15:27:52 +0100 Wim Taymans * gst/rtp/gstrtpj2kpay.c: j2kpay: stop scanning when we reached the end Stop scanning for markers when we reached the end of the data. 2010-12-13 16:23:24 +0200 Stefan Kost * common: Automatic update of common submodule From 011bcc8 to 20742ae 2010-12-13 12:56:12 +0100 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: avoid leaking sink events Avoid leaking the newsegment event when it has the wrong format. 2010-12-12 14:53:17 +0100 Wim Taymans * gst/rtp/gstrtpmp4vpay.c: mp4vpay: we can also accept xvid caps 2010-12-12 01:39:06 +1100 Jan Schmidt * gst/deinterlace/gstdeinterlace.c: deinterlace: Avoid infinite loop draining frames When the pipeline is flushed just as we're draining history, don't loop infinitely, just discard the history and abort. 2010-12-11 17:39:20 +0000 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: add "max-errors" property to ignore decoding errors Add property to ignore decoding errors. Default is to ignore a few decoding errors if the input is packetized, but error out immediately if the input is not packetized. Ignoring errors for packetized input most likely doesn't work properly yet, so don't do that for now. https://bugzilla.gnome.org/show_bug.cgi?id=623063 2010-05-28 15:27:14 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegenc.c: jpegenc: free/malloc instead of realloc, avoids memcpy 2010-12-11 17:49:03 +0100 Sebastian Dröge * gst/qtdemux/qtdemux.c: qtdemux: Check if there's actually a seek table before parsing it 2010-12-11 17:46:17 +0100 Kishore Arepalli * gst/qtdemux/qtdemux.c: qtdemux: Implement CONVERT and FORMATS query Fixes bug #636784. 2010-07-01 00:22:07 +0100 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska-demux: put unrecognised RIFF format IDs into the unknown caps Extra info can't hurt. Field names aren't necessarily consistent with what's used elsewhere though (e.g. avidemux), but then neither are the caps. https://bugzilla.gnome.org/show_bug.cgi?id=623178 2010-10-29 22:50:14 +0100 Jan Schmidt * ext/pulse/pulsemixerctrl.c: * ext/pulse/pulsemixerctrl.h: pulsemixer: Implement MIXER_FLAG_AUTO_NOTIFICATIONS Add the mixer flag and send notifications when either the volume or muted status changes. https://bugzilla.gnome.org/show_bug.cgi?id=618389 2010-02-08 21:41:29 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: mark DISCONT when resuming PLAY In particular, when streaming interleaved, this arranges for setting a new timestamp on outgoing buffer so downstream can appropriate reset to a change in (rtp)time. 2010-12-02 16:08:34 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: degrade gracefully upon failing seek and tweak QUERY_SEEKING response 2010-10-25 11:51:06 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: add and use auto buffering mode ... which selects BUFFER for a non-live stream, and otherwise SLAVE. Fixes #633088. 2010-12-06 12:16:12 +0100 Wim Taymans * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kdepay.h: j2kdepay: make the depayloader more resilient Use 3 adapters, one to accumulate paketization units, another on to accumulate tiles and a last one to accumulate the final frame. Don't just blindly flush the adapter on DISCONT but only discard the current packetization unit. When we dropped jpeg2000 packets between SOP markers, adjust the SOT header with the new lenght. 2010-12-09 13:49:04 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix flow return aggregation 2010-12-08 11:35:33 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix handling near end-of-file corner cases Also, relax some error handling to not bail out completely when something feels amiss, but consider this EOF and continue with was obtained so far. 2010-12-07 17:19:00 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; fix offset handling and relax error raising In particular, accept unknown stream in track fragment, and only error out if that raises problems later on with respect to offset tracking. Fixes #620283. 2010-12-07 13:11:48 +0100 Mark Nauwelaerts * gst/flv/Makefile.am: * gst/flv/gstflvdemux.c: flvdemux: use aac codec-data to adjust samplerate if needed Based on patch by Fabien Lebaillif-Delamare Fixes #636621. 2010-12-07 11:43:13 +0100 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: don't uncork in _start Don't uncork in the _start method just yet but wait until we have written some samples to pulseaudio. This avoid underruns on pulseaudio and less crackling noises when starting. 2010-12-06 19:59:49 +0100 Alessandro Decina * gst/qtdemux/qtdemux.c: qtdemux: fix compiler warnings on OSX. 2010-12-06 18:17:24 +0100 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: add debug to notify when skipping to jpeg header 2010-12-06 18:16:19 +0100 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: discard incomplete image ... as determined when finding SOI next image before an EOI. Based on patch by David Hoyt Fixes #635734. 2010-12-06 17:45:38 +0100 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: avoid infinite loop when resyncing Fixes #635734 (partly). 2010-12-06 15:21:53 +0100 David Hoyt * gst/imagefreeze/gstimagefreeze.c: imagefreeze: pass along eos if received before buffer arrives Fixes #636172. 2010-10-20 11:05:49 +0200 Andoni Morales Alastruey * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: matroskamux: try to write timestamps in all the outgoing buffers Fixes #632654. 2010-12-06 12:17:21 +0100 Mark Nauwelaerts * gst/debugutils/progressreport.c: * gst/debugutils/progressreport.h: progressreport: optionally determine progress using buffer metadata Based on patch by Leo Singer Fixes #629418. 2010-12-05 14:39:19 +0100 Edward Hervey * tests/check/elements/interleave.c: check: Fixup the shutting down order First bring down everything to NULL before attempting to unlink or unref anything. Avoids the tests just hanging there for ever waiting to acquire a lock that doesn't exist anymore. 2010-11-04 19:31:45 +0100 Janne Grunau * sys/v4l2/gstv4l2bufferpool.c: v4l2src: set top field first for interlaced buffers if v4l2 exports it https://bugzilla.gnome.org/show_bug.cgi?id=634393 2010-11-04 18:36:09 +0100 Janne Grunau * sys/v4l2/gstv4l2object.c: v4l2src: check field information and set interlaced caps accordingly Reject the format if the field type is not supported. https://bugzilla.gnome.org/show_bug.cgi?id=634391 2010-12-03 17:42:14 +0100 Benjamin Gaignard * Android.mk: * android/NOTICE: * android/apetag.mk: * android/avi.mk: * android/flv.mk: * android/gst/rtpmanager/gstrtpbin-marshal.c: * android/gst/rtpmanager/gstrtpbin-marshal.h: * android/gst/udp/gstudp-enumtypes.c: * android/gst/udp/gstudp-enumtypes.h: * android/gst/udp/gstudp-marshal.c: * android/gst/udp/gstudp-marshal.h: * android/icydemux.mk: * android/id3demux.mk: * android/qtdemux.mk: * android/rtp.mk: * android/rtpmanager.mk: * android/rtsp.mk: * android/soup.mk: * android/udp.mk: * android/wavenc.mk: * android/wavparse.mk: Add build system for Android 2010-03-26 13:51:58 +0100 Guillaume Emont * gst/debugutils/gstnavseek.c: navseek: add basic support to change playback rate The following keys will now be interpreted by navseek: 'f' means fast forward: the stream gets played at rate 2.0 'r' means rewind: the stream gets played at rate -2.0 'n' means normal: the stream gets played at rate 1.0 Fixes #631516. 2010-12-01 13:12:04 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: add support for e(a)c-3 audio 2010-11-19 12:44:35 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: avoid sending EOS event twice 2010-11-19 12:44:18 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: remove dead code trying to update stream duration On the one hand, it insufficiently checks whether it only updates a dummy segment. On the other hand, only doing this at the time the last sampled is prepared (and sent downstream) is too little too late. 2010-11-09 10:58:57 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; handle ismv sample flags 2010-11-08 11:41:21 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; handle ismv stbl atoms ... or lack of some thereof, such as mandatory stsz. Shuffle some code in _stbl_init to detect this early enough. 2010-11-08 11:39:37 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; compensate for ismv offset handling ... or lack thereof, which according to specs would put media data in unlikely position. 2010-11-04 14:07:56 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: fragmented support for push mode 2010-11-04 10:17:37 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: fragmented support; proper and incremental moof parsing That is, parse each moof in one pass (considering all contained streams' metadata), and do so incrementally as needed for playback rather than an initial complete scan of all moof (though all moov sample metadata is fully parsed at startup). 2010-11-04 10:06:30 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: refactor stream freeing 2010-11-04 10:05:15 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: delegate linear search for sample to binary search when possible Also arrange for parsing a sample prior to taking a reference to it, which requires less memory layout assumptions for correctness. 2010-11-01 15:52:29 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; handle moov samples and proper stream duration 2010-11-01 13:40:05 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; consider mvex and handle flags and offset fields 2010-10-28 16:49:41 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fragmented support; forego check for short streams ... as some bogus files may indicate streams of 0 duration in moov, while indicating the complete movie duration in mvhd (the latter should be in mehd). 2010-10-28 16:46:48 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_types.h: qtdemux: fragmented support; code cleanups and optimizations in atom parsing Avoid extra allocation in _parse_trun, add more checks for parsing errors, add or adjust some debug statement, fix comments, sprinkle some branch prediction. 2010-09-13 23:19:44 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: parse_moof should return TRUE on success 2010-09-10 22:41:03 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Fix iteration bug Avoid infinite loop when iterating traf 2010-09-10 21:32:26 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Refactor trun parsing The allocation of the samples can be placed out of the loop. Makes the code clearer. Also avoid relying on traf information as it is placed on the end of the file and might not be acessible on push mode. 2010-09-10 00:29:26 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Remove parsing of unused atom sdtp atom is parsed but not used, so we don't have to parse it. 2010-11-09 11:45:00 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: tweak wam support ... with some comment and portability macros. 2009-09-23 18:47:42 +0200 Marc-André Lureau * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: qtdemux: support wma & vc-1 https://bugzilla.gnome.org/show_bug.cgi?id=596321 2010-03-11 09:56:04 +0100 Andoni Morales Alastruey * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: parse fmp4 samples information The fragmented mp4 format stores the tracks and samples information in the 'moof' boxes, which are appended before each fragment (fragment->'moof'+'mdat'). The 'mfra' box stores the offset of each 'moof' box and their presentation time. The location of this box can be retrieved from the 'mfro' box, which is located at the end of the file. The 'mfra' box is parsed to get the offset of each 'moof' box and their presentation time. Each 'moof' box can contain information for one or more tracks inside 'tfhd' boxes. For each track in a 'moof', we have a 'trun' box, which contains information of each sample (offset and duration) used to build the samples table. Based on patch by Marc-André Lureau https://bugzilla.gnome.org/show_bug.cgi?id=596321 2010-03-11 15:34:49 +0100 Marc-André Lureau * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux_dump.c: * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: * gst/qtdemux/qtdemux_types.h: qtdemux: add fragmented mp4 fourccs Adds fourcc's for tfra, tfhd, trun, sdtp, trex, mehd and their dumps https://bugzilla.gnome.org/show_bug.cgi?id=596321 2010-03-11 10:24:56 +0100 Marc-André Lureau * gst/qtdemux/qtdemux.c: qtdemux: parse the track id from the track header Signed-off-by: Andoni Morales Alastruey https://bugzilla.gnome.org/show_bug.cgi?id=596321 2010-03-11 14:10:12 +0100 Marc-André Lureau * gst/qtdemux/qtdemux.c: qtdemux: allow pulling atoms with unknown size Signed-off-by: Andoni Morales Alastruey https://bugzilla.gnome.org/show_bug.cgi?id=596321 2010-07-14 20:13:55 +0200 Marc-André Lureau * gst/qtdemux/qtdemux_dump.c: qtdemux: make qtdemux_dump_mvhd parse version 1 correctly Versions 0 and 1 of mvhd have different sizes of its values (32bits/64bits). This patch makes it dump them correctly. Also use the right node in the parameter and not the root node. https://bugzilla.gnome.org/show_bug.cgi?id=596321 2010-11-19 12:45:00 +0100 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskademux: minor cleanups in setting streamheader on caps 2010-11-02 17:04:04 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: normalize empty Cues to no Cues ... to trigger indexless seeking. 2010-10-26 11:15:49 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: add workaround for buggy list size Fixes truncated extra-data in hdrl/strl/strf due to buggy containing list size not accounting for padding in contained chunks. 2010-12-02 16:11:01 +0100 Mark Nauwelaerts * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: do not hold custom PAD_LOCK when pushing downstream 2010-12-02 16:10:14 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: reset session manager base time when flushing ... as rtpbin uses running time to handle rtpjitterbuffer's buffer mode pauses. 2010-12-01 16:51:33 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: include range request for all streams with non-aggregate control 2010-10-07 14:50:53 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: fix debug statement 2010-12-03 15:38:00 +0100 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Parse more variants of numerical IDIT tag 2010-05-07 17:30:30 +0200 Edward Hervey * ext/libpng/gstpngenc.c: pngenc: Use proper framerate range in caps 2010-12-03 15:04:26 +0100 Edward Hervey * tests/check/pipelines/wavenc.c: tests: Fix previously unbuildable/untested wavenc test 2010-10-24 15:21:08 +0200 Edward Hervey * gst/flv/gstflvdemux.c: flvdemux: Refactor tag pushing logic The logic of when to push was wrong also (resulting in some tags never being pushed). 2010-10-24 15:20:27 +0200 Edward Hervey * gst/flv/Makefile.am: * gst/flv/gstflvdemux.c: flvdemux: Use pbutils for codec descriptions 2010-04-13 11:29:30 +0200 Edward Hervey * tests/check/elements/udpsink.c: check: Use fail_unless_equals_int instead of fail_if Makes the error message more interesting 2010-11-30 19:22:11 +0100 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Also extract IDIT tags present too early https://bugzilla.gnome.org/show_bug.cgi?id=636143 2010-11-30 19:21:23 +0100 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Also emit DateTime tag https://bugzilla.gnome.org/show_bug.cgi?id=636143 2010-12-03 00:22:48 +0000 Tim-Philipp Müller * gst/wavparse/gstwavparse.c: wavparse: detect DTS advertised as PCM correctly in some more cases The DTS typefinder may return a lower probability for frames that start at non-zero offsets and where there's no second frame sync in the first buffer. It's fairly unlikely that we'll acidentally identify PCM data as DTS, so we don't do additional checks for now. https://bugzilla.gnome.org/show_bug.cgi?id=636234 2010-11-08 17:11:42 +0200 Stefan Kost * tests/check/Makefile.am: tests: makefile cleanup Fix indentation. Use $(GST_MAJORMINOR) instead of hardcoded 0.10. 2010-11-08 17:02:56 +0200 Stefan Kost * tests/check/Makefile.am: * tests/check/pipelines/.gitignore: * tests/check/pipelines/wavenc.c: tests: add a test for wav muxing 2010-11-08 16:57:17 +0200 Stefan Kost * tests/check/elements/interleave.c: * tests/check/pipelines/wavpack.c: tests: remove newlines between variable decls (old gst-indent failure) 2010-11-08 14:47:04 +0200 Stefan Kost * ext/libpng/gstpngdec.c: pngdec: use png_error() as recommended by libpng docs to signal an error Without that the element loops endlessly on broekn pngs. Fixes #634314 2010-11-16 17:48:16 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Parse and use creation time tag from mvhd Expose creation time from mvhd as a datetime tag Fixes #634928 2010-10-27 19:15:20 +0200 Andoni Morales Alastruey * gst/icydemux/gsticydemux.c: icydemux: Add 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag 2010-10-23 19:34:00 -0400 Tom Janiszewski * gst/flv/gstflvmux.c: flvmux: Fix for nellymoser codecid setting Fixes bug #632897. 2010-10-21 16:15:08 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Add support for E-AC3 2010-10-21 16:14:44 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Add support for DTS 2010-10-31 18:08:17 +0100 Sebastian Dröge * ext/soup/gstsouphttpsrc.c: souphttpsrc: Don't send seeks behind the end of file to the server Also improve debug output, re-initialize the content size and let the seek handler error out on invalid seek segments. Fixes bug #632977. 2010-12-02 17:53:42 +0100 Wim Taymans * gst/rtp/gstrtpj2kpay.c: j2kpay: use SOP markers to split bitstream When parsing the bitstream, look for SOP markers because we are allowed to split packets on those marker boundaries. Rework the parsing code a little so that we can pack multiple Packetization units in one RTP packet. 2010-11-18 12:49:47 +0100 Wim Taymans * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpj2kpay.h: rtpj2kpay: use buffer lists Use buffer lists for doing zerocopy payloading. Add property to disable buffer lists. 2010-11-16 16:54:25 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: h264pay: small cleanups Allocate adapter only once. Make some guint8 * const. 2010-11-16 15:39:24 +0100 Tambet Ingo * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: implement full bytestream scan mode. Implement the full bytestream scan mode. Fixes #634910 2010-11-15 10:52:31 +0100 Wim Taymans * tests/examples/rtp/client-H263p-AMR.sh: * tests/examples/rtp/client-H263p-PCMA.sh: * tests/examples/rtp/client-H263p.sh: * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-H264.sh: * tests/examples/rtp/client-PCMA.sh: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: examples: improve RTP examples Make the examples use autovideosink and ffmpegcolorspace for better compàtibility. Make some more variables for the sink and the decoders. Set zerolatency tuning on x264enc for better realtime results. 2010-11-10 11:04:48 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: select multicast transports in a smarter way When we see a multicast address in the SDP connection, only try to negotiate a multicast transport with the server. Fixes #634093 2010-12-02 18:14:16 +0000 Tim-Philipp Müller * configure.ac: Bump GLib requirement to implicit requirement ie. >= 2.20 while we depend on core/base 0.10.31 2010-12-02 18:13:57 +0000 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development === release 0.10.26 === 2010-12-01 21:15:09 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.26 2010-11-30 15:28:50 -0800 David Schleef * gst/deinterlace/gstdeinterlace.c: deinterlace: analyse RFF fields in correct order Code was repeating the second field, not the first. Fixes: #636179. 2010-11-29 15:32:40 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: handle stale digest authentication session data In particular, handle Unauthorized server response when trying to convey keep-alive. Fixes #635532. 2010-11-26 15:00:29 +0100 Thijs Vermeir * gst/rtp/gstrtph264depay.c: rtph264depay: fix segfault on empty payload https://bugzilla.gnome.org/show_bug.cgi?id=635843 2010-11-18 00:45:29 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.25.5 pre-release 2010-11-18 00:44:45 +0000 Tim-Philipp Müller * po/bg.po: * po/fi.po: * po/hu.po: * po/sk.po: * po/tr.po: po: update translations 2010-11-14 00:18:16 +0000 Tim-Philipp Müller * gst/deinterlace/gstdeinterlace.c: deinterlace: fix reference leak 2010-11-12 23:59:06 +1100 Jan Schmidt * gst/deinterlace/gstdeinterlace.c: deinterlace: Flush QoS and history before applying segment When handling newsegment, flush out the buffer history in the existing segment, not the new one. Fixes playback in some DVD cases. Partially fixes #633294 2010-11-12 12:20:16 +0000 Tim-Philipp Müller * gst/deinterlace/gstdeinterlace.c: deinterlace: improve event logging 2010-11-05 17:00:15 +0100 Robert Swain * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Implement field history flushing In a number of cases it is necessary to flush the field history by performing 'degraded' deinterlacing - that is, using the user-chosen method for as many fields as possible, then using vfir for as long as there are >= 2 fields remaining in the history, then using linear for the last field. This should avoid losing fields being kept for history for example at EOS. This may address part of #633294 2010-11-05 15:44:35 +0100 Robert Swain * gst/deinterlace/gstdeinterlace.c: deinterlace: Refactor chain function This is needed to be able to output a frame from outside the chain function, i.e. in the following commit that adds flushing of the field history. 2010-11-05 17:17:56 +0000 Tim-Philipp Müller * configure.ac: configure: we still require Gtk+ >= 2.14.0 when compiling against 2.0 The check for the minor version was dropped in the previous commit. 2010-11-05 16:24:42 +0000 Tim-Philipp Müller * configure.ac: configure: add --with-gtk option and default to Gtk+ 2.0 while the 3.0 API is still in flux https://bugzilla.gnome.org/show_bug.cgi?id=634014 2010-11-04 16:42:07 +1000 Jonathan Matthew * gst/icydemux/gsticydemux.c: icydemux: fix use-after-free of taglist Broken by commit 4c2f5333 (bug #630205). https://bugzilla.gnome.org/show_bug.cgi?id=633970 2010-11-01 17:29:01 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.25.4 pre-release 2010-11-01 17:28:36 +0000 Tim-Philipp Müller * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/es.po: * po/fr.po: * po/it.po: * po/nb.po: * po/nl.po: * po/pl.po: * po/sl.po: * po/sv.po: po: update translations 2010-11-01 16:04:20 +0000 Tim-Philipp Müller * configure.ac: configure: fix --disable-external 2010-11-01 14:56:28 +0100 Wim Taymans * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: rtph264depay: only set delta unit on all-non-key units Only set the delta flag when all of the units in the packet are delta units. Based on patch from Olivier Crête Fixes #632945 2010-10-26 15:44:37 -0300 Thiago Santos * gst/goom/gstgoom.c: goom: Return not-negotiated when bps is unknown If caps weren't negotiated, goom should return not-negotiated from its chain functions instead of using bps unitialized, which leads to a division by 0 https://bugzilla.gnome.org/show_bug.cgi?id=633212 2010-10-27 13:16:54 +0100 Jan Schmidt * common: Automatic update of common submodule From 7bbd708 to 011bcc8 2010-10-26 16:54:11 +0100 Jan Schmidt * gst/videofilter/gstvideoflip.c: videoflip: Forward src pad events upstream. Fix passing navigation and other events upstream by actually sending them. Fixes: #633205 2010-10-24 18:50:30 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: fix deadlock in error code path GST_ELEMENT_ERROR must not be called with the object lock held, since it will call gst_object_get_parent() internally, which takes the object lock as well. 2010-10-20 10:21:48 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: Remove useless clearing of send_xiph_headers for Dirac This looks like a mistake when copy-pasting the Theora code. https://bugzilla.gnome.org/show_bug.cgi?id=632682 2010-10-20 13:28:28 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: don't crash if vorbis/theora codec data is missing Error out properly in this case instead of crashing. https://bugzilla.gnome.org/show_bug.cgi?id=632682 2010-10-22 18:11:46 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.25.3 pre-release 2010-10-19 16:45:51 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: fix duration reporting Init segment prior to storing duration info in it. Fixes #632548. 2010-10-19 14:21:53 +0100 Bastien Nocera * gconf/Makefile.am: gconf: Don't install schemas when GConf is disabled https://bugzilla.gnome.org/show_bug.cgi?id=632553 2010-10-16 15:43:53 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: win32: set GST_PACKAGE_RELEASE_DATETIME also in win32 config.h 2010-10-16 01:33:52 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.25.2 pre-release 2010-10-16 01:26:01 +0100 Tim-Philipp Müller * po/el.po: * po/vi.po: po: update translations 2010-10-15 13:22:03 -0700 David Schleef * tests/check/Makefile.am: tests: Don't dist generated orc files 2010-10-15 14:02:19 -0700 David Schleef * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: Update generated orc code 2010-10-15 18:00:10 +0100 Tim-Philipp Müller * configure.ac: configure: bump Orc requirement to 0.4.11 2010-10-14 17:41:30 -0400 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Use the right constant to define the "use-pipeline-clock" property The wrong #define was being used, now use the correct one. 2010-10-14 12:31:48 -0700 David Schleef * common: Automatic update of common submodule From 5a668bf to 7bbd708 2010-10-14 17:26:14 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/qtdemux/qtdemux.c: ac3: demuxers provide framed output 2010-10-14 00:11:27 +0100 Tim-Philipp Müller * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: matroskamux: reduce newsegment event spam and set discont flag where needed Only send newsegment events with new positions downstream when actually needed, instead of sending multiple newsegment events with new seek positions in a row. Also set the discont flag on buffers after a discontinuity. 2010-10-13 23:46:02 +0100 Tim-Philipp Müller * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: matroskamux: set correct buffer offsets after seeks Re-use the existing 'pos' field maintained by ebml writer to set buffer offsets. This also makes sure that we set the right offsets on buffers after a seek (e.g. when writing an index at the end). 2010-10-14 00:22:03 +0100 Tim-Philipp Müller * gst/matroska/matroska-mux.c: matroskamux: don't forward tag events downstream Don't forward stream-specific tag events downstream (esp. not before any newsegment event).x 2010-10-13 17:15:25 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: handle another mp4v variation ... including the glbl atom containing codec-data. 2010-10-13 17:21:23 +0300 Stefan Kost * gst/audiofx/audioamplify.c: * gst/audiofx/audiodynamic.c: * gst/audiofx/audioinvert.c: * gst/audiofx/audiokaraoke.c: * gst/audiofx/audiopanorama.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: * gst/avi/gstavimux.c: * gst/cutter/gstcutter.c: * gst/debugutils/breakmydata.c: * gst/debugutils/efence.c: * gst/debugutils/gstnavseek.c: * gst/debugutils/negotiation.c: * gst/debugutils/progressreport.c: * gst/debugutils/rndbuffersize.c: * gst/id3demux/gstid3demux.c: * gst/level/gstlevel.c: * gst/matroska/matroska-mux.c: * gst/median/gstmedian.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/replaygain/gstrganalysis.c: * gst/replaygain/gstrglimiter.c: * gst/replaygain/gstrgvolume.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtsp/gstrtpdec.c: * gst/smpte/gstsmpte.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: * gst/videocrop/gstaspectratiocrop.c: * gst/videocrop/gstvideocrop.c: * gst/videofilter/gstvideotemplate.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: various (gst): add a missing G_PARAM_STATIC_STRINGS flags 2010-10-13 17:13:04 +0300 Stefan Kost * sys/oss/gstossmixerelement.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: * sys/osxvideo/osxvideosink.m: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosrc.c: * sys/ximage/gstximagesrc.c: various (sys): add a missing G_PARAM_STATIC_STRINGS flags 2010-10-13 16:25:15 +0300 Stefan Kost * ext/aalib/gstaasink.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/annodex/gstcmmltag.c: * ext/cairo/gsttextoverlay.c: * ext/dv/gstdvdec.c: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/flac/gstflacenc.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/gstgdkpixbufsink.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/hal/gsthalaudiosink.c: * ext/hal/gsthalaudiosrc.c: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokeenc.c: * ext/libcaca/gstcacasink.c: * ext/libpng/gstpngenc.c: * ext/mikmod/gstmikmod.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: * ext/shout2/gstshout2.c: * ext/soup/gstsouphttpsrc.c: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * ext/wavpack/gstwavpackenc.c: various (ext): add a missing G_PARAM_STATIC_STRINGS flags 2010-10-13 16:34:09 +0300 Stefan Kost * ext/aalib/gstaasink.c: * ext/esd/esdmon.c: * gst/median/gstmedian.c: various: wrap property registration and add a single fixme for long desc. 2010-10-13 11:46:58 +0200 Wim Taymans * gst/rtp/gstrtph264depay.c: h264depay: always mark the codec_data as keyframe We need to mark the codec_data as a keyframe or else downstream decoders might decide to skip it, waiting for a keyframe. Fixes #631996 2010-10-13 07:16:47 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: matroskamux: make buffer offsets a byte count rather than a buffer count 2010-10-07 21:12:48 +0100 Tim-Philipp Müller * ext/aalib/gstaasink.c: * ext/dv/gstdvdec.c: * ext/esd/esdmon.c: * ext/flac/gstflacenc.c: * ext/mikmod/gstmikmod.c: * ext/raw1394/gstdv1394src.c: * gst/debugutils/efence.c: * gst/rtpmanager/gstrtpbin.c: ext, gst: canonicalise property names where this wasn't the case ie. "foo_bar" -> "foo-bar" 2010-10-12 15:02:42 +0200 Thijs Vermeir * gst/rtp/gstrtpmpvpay.c: rtpmpvpay: fix timestamping of rtp buffers Incomming buffer is only pushed on the adapter at the end of the handle_buffer function. But duration/timestamp of this buffer is already taken into account for the current data in the adapter. This leads to wrong rtp timestamps and extra latency. 2010-10-12 11:37:40 +0200 Sebastian Dröge * tests/examples/equalizer/demo.c: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: examples: Fix build with GTK+ 3.0 2010-10-11 15:12:00 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: mark as a source Mark the rtspsrc element as a source. Requires 0.10.31.1 now 2010-10-11 14:24:13 +0200 Sebastian Dröge * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosrc.c: autodetect: Set GST_ELEMENT_IS_SOURCE flag on sources 2010-10-11 14:21:07 +0200 Sebastian Dröge * ext/gconf/gstswitchsrc.c: switchsrc: Set the GST_ELEMENT_IS_SOURCE flag 2010-10-11 14:17:33 +0200 Sebastian Dröge * configure.ac: configure: Require core 0.10.30.1 2010-10-10 14:43:58 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: matroskamux: set offsets on outgoing buffers 2010-10-09 14:14:27 +0200 IOhannes m zmölnig * sys/v4l2/gstv4l2sink.c: v4l2sink: Only get/set overlay params if needed it's perfectly ok for a video output device to not have overlay capabilities. this patch removes the need to get/set the overlay parameters if the user does not explicitely request one of the overlay properties 2010-09-30 15:28:23 +0200 IOhannes m zmölnig * sys/v4l2/gstv4l2sink.c: v4l2sink: Protect against NULL-pointer access gst_v4l2sink_change_state() would free the pool without checking whether there was a valid pool... 2010-10-08 12:43:51 -0700 David Schleef * common: Automatic update of common submodule From c4a8adc to 5a668bf 2010-10-08 12:53:33 +0200 Sebastian Dröge * common: Automatic update of common submodule From 5e3c9bf to c4a8adc 2010-10-06 11:29:55 +0200 Robert Swain * gst/deinterlace/gstdeinterlace.c: deinterlace: Fix required fields logic Both history_count and fields_required count from 1. As per the while loop condition that follows this code, to perform the deinterlacing method, we need history_count >= fields_required fields in the history. Therefore if we have history_count < fields_required (not fields_required + 1), we need more fields. 2010-09-20 19:43:45 +0200 Andoni Morales Alastruey * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: resend onMetada tag when tags changes in streamable mode 2010-10-05 19:40:50 +0100 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: AAC codec_data can be > 2 bytes long This fixes the assumption that DecoderSpecificInfo must be 2 bytes long for AAC files. The specification allows HE-AAC to be explicitly signalled in a backward compatible way. This is done by means of an additional information after the regular AAC header. It is expected that decoders that can play AAC but not HE-AAC will parse the header normally and ignore extended bits, much as they do for the HE-AAC specific payload in the actual stream. https://bugzilla.gnome.org/show_bug.cgi?id=612313 2010-10-05 16:01:19 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: only unref buffer when no longer needed for cluster scanning Fixes #629047. 2010-10-05 16:00:45 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: avoid infinite cluster scanning 2010-10-05 12:20:52 +0200 Wim Taymans * gst/goom/gstgoom.c: * gst/goom2k1/gstgoom.c: goom: take duration into account when doing QoS Take the duration of the frames into account so that we don't drop frames that are only partially past the QoS deadline. 2010-10-05 10:40:15 +0200 Wim Taymans * gst/goom/gstgoom.c: * gst/goom/gstgoom.h: * gst/goom2k1/gstgoom.c: * gst/goom2k1/gstgoom.h: goom: use adapter for timestamping Use the adapter timestamp code to get more accurate timestamps. Fix latency calculation, we add our own latency in the worst case. 2010-10-04 22:31:32 +0200 Edward Hervey * configure.ac: * ext/raw1394/Makefile.am: * ext/raw1394/gst1394.c: raw1394: Don't compile hdv1394src if libiec61883 isn't available Fixes #629896 2010-09-20 19:44:09 +0200 Andoni Morales Alastruey * gst/icydemux/gsticydemux.c: icydemux: forward tag events https://bugzilla.gnome.org/show_bug.cgi?id=630205 2010-10-04 19:00:45 +0200 Wim Taymans * gst/goom2k1/gstgoom.c: goom2k1: report our latency correctly Fixes #631303 2010-10-04 18:56:15 +0200 Wim Taymans * gst/goom2k1/gstgoom.c: goom2k1: add defines for default width/height/fps Add some defines for the default width/height/fps instead of using different values in different places. 2010-10-04 18:52:14 +0200 Wim Taymans * gst/goom/gstgoom.c: goom: add latency compensation code. Implement a latency query and report how much latency we will add to the stream. Alse make some defaults for the default width/height/framerate Fixes #631303 2010-10-04 17:56:57 +0200 Wim Taymans * tests/examples/rtp/server-alsasrc-PCMA.py: test: add python version of the audio sender Add a python version of the audio sender pipeline. Ported by Sp4rc on IRC. 2010-10-04 17:52:22 +0200 Wim Taymans * tests/examples/rtp/client-PCMA.py: tests: Add python RTP client example Add a python version of the PCMA client app. Ported by Sp4rc on IRC. 2010-10-04 09:39:59 +0200 Sebastian Dröge * gst/rtp/gstrtpmp4gpay.c: rtp: Fix unitialized compiler warnings on OS X build bot These warnings are wrong though, the variables are only used in the cases where they *are* initialized by the bit reader. 2010-10-03 23:49:08 +0200 Sebastian Dröge * gst/rtp/gstrtpg722pay.c: rtpg722pay: Fix uninitialized variable compiler warning The clock rate is always 8000 Hz according to the RFC and the sampling rate must always be 16000 Hz. 2010-10-01 13:59:10 +0400 Vladimir Eremeev * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: improve article reference in comment block https://bugzilla.gnome.org/show_bug.cgi?id=631082 2010-04-30 21:00:31 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: * gst/qtdemux/quicktime.c: qtdemux: Use pbutils for H.264 profile/level extraction The functions used to extract this data have been moved to gstpbutils to facilitate reuse. https://bugzilla.gnome.org/show_bug.cgi?id=617318 2010-04-30 21:00:31 +0530 Arun Raghavan * gst/matroska/Makefile.am: * gst/matroska/matroska-demux.c: * gst/matroska/matroska.c: matroskademux: Use pbutils for H.264 profile/level extraction The functions used to extract this data have been moved to gstpbutils to facilitate reuse. https://bugzilla.gnome.org/show_bug.cgi?id=617318 2010-04-22 19:39:47 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: Export MPEG-4 video profile and level in stream caps This uses gstpbutils to extract the profile and level from the video object sequence and adds this to stream caps. This can be used as metadata and for fine-grained decoder selection. https://bugzilla.gnome.org/show_bug.cgi?id=616521 2010-09-30 12:44:52 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: fix aac channel override based on codec data for 7.1 case 2010-04-30 14:06:27 +0530 Arun Raghavan * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: qtdemux: Export AAC profile and level in caps This exports the AAC profile and level in caps for use as metadata and (eventually) for more fine-grained selection of decoders at caps-negotiation time. (Doesn't work for HE-AAC yet though.) https://bugzilla.gnome.org/show_bug.cgi?id=612313 2010-09-30 18:34:04 +0200 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpg722depay.c: * gst/rtp/gstrtpg722depay.h: * gst/rtp/gstrtpg722pay.c: * gst/rtp/gstrtpg722pay.h: rtp: add G722 pay and depayloader 2010-09-30 12:08:49 +0200 Thijs Vermeir * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: update link to documentation 2010-09-30 11:34:56 +0200 Thijs Vermeir * tests/examples/rtp/client-H264.sh: examples: fix indentation on rtp client example 2010-09-30 11:33:24 +0200 Thijs Vermeir * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-H264.sh: examples: fix typo in port of rtp examples 2010-09-29 13:20:22 +0100 Tim-Philipp Müller * gst/wavenc/gstwavenc.c: wavenc: miniscule code clean-up GST_CLOCK_TIME_NONE is not something that should be used in connection with GST_FORMAT_BYTES. 2010-09-29 10:34:36 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: reverse playback; prevent overlap of subsequent fragments 2010-09-28 16:21:48 +0300 René Stadler * gst/rtsp/gstrtspsrc.c: rtspsrc: fix missing null-terminator in protocols array Fixes random crash regression from commit ae84ae. 2010-09-24 16:26:20 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't add /UDP in the transport, it's the default don't add the default UDP lower-transport, some servers don't seem to like it. Fixes #630500 2010-06-25 17:08:03 +0200 Pascal Buhler * gst/rtpmanager/gstrtpjitterbuffer.c: rtpmanager: packet lost should not be a warning. It happens all the time... 2010-09-24 15:33:40 +0200 Pascal Buhler * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpbin: Make cleaning up sources in rtp_session_on_timeout MT safe Using _foreach_remove on the hashtable, while releasing the lock protecting that table inside the callback is not a good idea. The hashtable might then change (a source removed or added) while signals like on_timeout are being sent. This solution makes a copy of the table, performs the _foreach without actually removing any sources, but marks them for removal on a second iteration with the real list, but this time not letting go of the lock. Fixes #630452 2010-09-24 15:19:15 +0200 Edward Hervey * gst/id3demux/id3tags.c: id3demux: Sanitize id3 frame names This is similar to what is done in qtdemux. Avoids providing invalid structure/tags names 2010-09-24 14:59:45 +0200 Edward Hervey * gst/apetag/gstapedemux.c: apedemux: Skip empty tags Avoid creating bogus string tags. Also added logging of the string values of the tag name and value. 2010-09-24 08:56:36 +0100 Tim-Philipp Müller * ext/soup/gstsouphttpsrc.c: soup: init debug category before using it 2010-04-12 09:49:14 +0200 Pascal Buhler * gst/rtpmanager/gstrtpbin.c: rtpbin: Handle rysnc of iterator when looking for free pad name If a new pad was added while iterating then a pad could be returned that was already in use. Fixes #630451 2010-09-24 14:09:12 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: fix compilation 2010-04-07 15:31:52 +0200 Trond Andersen * gst/rtpmanager/gstrtpbin.c: rtpbin: Unlock before adding pad in new_payload_found Holding internal locks while potentially calling out is a source of deadlocks, and in this case the application might subscribe to the pad-added signal. Fixes #630449 2009-08-31 18:37:40 +0200 Havard Graff * gst/rtpmanager/rtpsession.c: rtpsession: relax third-party collision detection If the source has been inactive for some time, we assume that it has simply changed its transport source address. Hence, there is no true third-party collision - only a simulated one. Fixes #630447 2010-09-24 13:50:02 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: whitespace fixes 2010-09-24 13:48:50 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: simplify the rate estimation some more 2009-08-31 18:34:08 +0200 Havard Graff * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpstats.c: * gst/rtpmanager/rtpstats.h: rtpmanager: provide additional statistics 2010-09-24 00:01:05 +0100 Tim-Philipp Müller * configure.ac: configure: set plugin release datetime 2010-09-23 21:21:29 +0100 Tim-Philipp Müller * gst/equalizer/gstiirequalizer10bands.h: * gst/equalizer/gstiirequalizer3bands.h: * gst/equalizer/gstiirequalizernbands.h: equalizer: fix class definitions Class structures must be based on the parent class struct, not on the parent instance struct. 2010-09-15 20:36:33 +0100 Tim-Philipp Müller * gst/videomixer/videomixer2.c: videomixer2: pre-register pad class properly with g_type_class_ref Fix code to match the comment. Also, there's no need to register the background enum type again, this is already done via install_property. 2010-09-23 21:57:18 +0200 David Hoyt * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: speex: Fix crashes with MSVC Using the symbols for the different Speex modes results in crashes when using MSVC. Use the library functions to get the modes instead. Fixes bug #630378. 2010-08-24 13:25:02 +0200 Havard Graff * gst/level/gstlevel.c: level: avoid division by zero on silence Fixes bug #630458. 2010-09-23 16:46:31 +0200 Wim Taymans * gst/flv/gstflvdemux.c: flvdemux: parse and use cts For H264, there is an extra header containing the CTS, which is a timestamp offset that should be applied to the PTS. Parse this value and use it to adjust the pts. Fixes #630088 2010-09-23 16:45:41 +0200 Wim Taymans * gst/flv/gstflvdemux.c: flvdemux: improve pts debugging 2010-09-22 19:01:40 +0200 Wim Taymans * configure.ac: * tests/examples/Makefile.am: * tests/examples/pulse/.gitignore: * tests/examples/pulse/Makefile.am: * tests/examples/pulse/pulse.c: pulse: add test app for pulse device probe 2010-09-22 18:50:44 +0200 Wim Taymans * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: pulse: fix device_description in READY Make the is_dead check more clear and add an option to check for the status of the stream in addition to the context. We don't need a stream to get the device_description string. Fixes #630317 2010-09-22 12:56:00 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Don't post tags if there are none And make all code go through _post_global_tags. 2010-09-22 12:37:33 +0200 Wim Taymans * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: rtph264depay: refactor and simplify AU merging Move the processing of the NALU to a separate method. Simplify the merging of NALU into AU and use common code when possible. 2010-09-21 23:23:07 +0300 Stefan Kost * tests/examples/shapewipe/shapewipe-example.c: shapewipe: add optional border parameter and slowdown animation Allow to play with the border property (sharp/soft edges). 2010-09-21 19:14:40 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: shapewipe: Force format to AYUV in the example pipeline for the same reason 2010-09-21 19:13:07 +0200 Sebastian Dröge * tests/examples/shapewipe/shapewipe-example.c: shapewipe: Force the input to AYUV to prevent negotiation failures in videomixer The second videotestsrc chain might produce YUY2 because everything is accepted downstream before the first shapewipe chain gets negotiated. 2010-09-21 19:12:45 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: shapewipe: Improve debugging and immediately return empty caps from the getcaps functions 2010-09-21 18:33:55 +0200 Edward Hervey * common: Automatic update of common submodule From aa0d1d0 to 5e3c9bf 2010-09-21 12:49:31 +0200 Philippe Normand * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/gstv4l2xoverlay.h: v4l2: use the xoverlay APIs 2010-09-21 12:48:34 +0200 Philippe Normand * configure.ac: * sys/osxvideo/osxvideosink.m: osxvideosink: use the new xoverlay APIs Also bumped -base requirements. 2010-09-21 12:31:59 +0200 Sebastian Dröge * configure.ac: configure: Use -DGST_DISABLE_DEPRECATED again for GIT versions 2010-09-21 11:52:22 +0200 Edward Hervey * ext/soup/gstsouphttpsrc.c: souphttpsrc: Fix debug statement 2010-09-20 23:17:35 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Parse uuid atoms in push mode Parses uuid atoms in push mode when they are found, they might contain xmp tags. Also does a minor refactoring to put the global tags posting into a single function instead of repeating it in 3 different places. Fixes #629839 2010-09-16 08:04:02 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Delay tags posting a little Delay tags posting until we've parsed all the headers so that the native and xmp tags get merged before posting https://bugzilla.gnome.org/show_bug.cgi?id=629839 2010-09-15 22:13:43 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: Parse xmp packet in uuid atom xmp packet is placed into a top-level uuid atom for isom/mp4 variants. This patch makes qtdemux parse all top-level atoms in pull-mode before starting to push data, making it able to find those tags. https://bugzilla.gnome.org/show_bug.cgi?id=629839 2010-09-17 11:07:52 +0200 Wim Taymans * gst/rtpmanager/rtpstats.c: rtpstats: printf format fixes 2010-09-17 11:07:02 +0200 Wim Taymans * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpg729pay.c: rtppay: some printf format fixes 2010-09-15 18:21:11 +0200 Alessandro Decina * gst/qtdemux/qtdemux.c: qtdemux: fix logic when pushing EOS. Don't check for return values when pushing EOS. Still post an error if EOS is reached and no streams have been found. 2010-09-15 17:02:57 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.args: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2src.c: docs: add gtk-doc chunks with Since: markers for new v4l2src properties 2010-09-15 18:43:50 +0300 Stefan Kost * tests/examples/v4l2/camctrl.c: camctrl: add license header to demo 2010-09-14 17:41:28 +0200 Alessandro Decina * gst/qtdemux/qtdemux.c: qtdemux: don't send EOS twice on the same pad. 2010-09-14 10:07:58 +0300 Stefan Kost * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: move the shared mainloop from class to static var Just have one static var for the shared mainloop instead of one class variable and copies in the instance. 2010-09-13 17:31:35 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: cleanups for DRI markers Protect against invalid DRI markers. do some cleanups 2010-09-10 11:35:53 -0400 American Dynamics * gst/rtp/gstrtpjpegpay.c: gstrtpjpegpay: Added Define Restart Interval (DRI) Marker Added ability to detect and respond to a JPEG-defined DRI marker 2010-06-19 19:20:18 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: gstrtpsession: Split getting the caps into its own function 2010-09-13 16:03:50 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: small cleanup. 2010-09-13 16:24:26 +0300 Stefan Kost * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: rework context sharing We also need to share the main-loop threads as this owns the context. Thus have a class wide main-loop thread. From this we create a context per client-name. Instead of always looking up the context, we keep this with the instance. The reverse mapping is only needed in pulse singal handlers. This saves a lot of locking. Also one signal handler becomes simpler as ther eis only one mainloop to notify. Now valgind happy - no leaks, no bad reads/writes. This reverts major parts of commit 69a397c32f4baf07a7b2937c610f9e8f383e9ae9. Fixes #628996 2010-09-13 15:44:52 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpstats.c: rtpsession: Small cleanups Make the property description prettier. Actually multiple the bandwidth with the fraction. 2010-06-01 21:35:40 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpstats.c: * gst/rtpmanager/rtpstats.h: rtpsession: Calculate RTCP bandwidth as a fraction of the RTP bandwidth Calculate the RTCP bandwidth to be a fraction of the RTP bandwidth if it is specified as a value between 0 and 1. 2010-09-13 15:29:06 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: session: improve bandwidth recalculation Also recalculate bandwidth when one of the source bandwidths changed. Use the newly calculated bandwidth. 2010-06-01 21:17:26 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: rtpsession: Add the option to auto-discover the RTP bandwidth 2010-09-13 14:38:11 +0200 Thijs Vermeir * gst/rtpmanager/gstrtpbin.c: rtpbin: set use-pipeline-clock on correct GObject 2010-06-02 17:51:12 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Initialise the average scaled by 16 2010-09-13 12:41:11 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: add running_time argument docs 2010-06-23 16:13:01 -0400 Olivier Crête * gst/rtpmanager/rtpstats.h: rtpstats: Rectify description of current_time in RTPArrivalStats It is the current time, it is unrelated to when the packet was actually received. 2010-09-13 12:31:40 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: compute the average correctly scaled 2010-06-01 20:31:18 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Count sent RTCP packets after they have been finished If they are counted before calling gst_rtcp_buffer_end(), then the size is way too big. 2010-06-01 19:51:34 -0400 Olivier Crête * gst/rtpmanager/gstrtpsession.c: gstrtpsession: Don't unref pads in finalize The gstrtpsession object is not holding any reference to them directly 2010-09-12 00:09:09 +0100 Tim-Philipp Müller * po/POTFILES.in: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/gl.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ro.po: * po/ru.po: * po/sk.po: * po/sl.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update translations for new souphttpsrc messages 2010-09-12 00:08:05 +0100 Tim-Philipp Müller * ext/soup/gstsouphttpsrc.c: soup: hook up i18n bits for plugin Call bindtextdomain() etc. 2010-09-12 00:04:42 +0100 Tim-Philipp Müller * ext/soup/gstsouphttpsrc.c: soup: fix error messages Error messages should be translated. URIs and filenames should not be part of the error message string that's shown to the user. soup_message->reason_phrase is not translated and not suitable as error message for users (see libsoup documentation). Also fix up error codes a bit, as far as possible with the existing codes. 2010-09-10 09:43:24 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: don't post an error message if buffer alloc fails with NOT_LINKED flow This is not fatal, let upstream handle it. 2010-09-10 18:06:48 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't clear sdp when set as uri when we set the SDP with an uri, don't clear it when we go to READY. 2010-09-10 18:01:18 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: use sdp uri parse method Use the sdp parse method that does proper uri escaping. 2010-09-10 16:59:10 +0300 Stefan Kost * tests/examples/v4l2/.gitignore: * tests/examples/v4l2/Makefile.am: * tests/examples/v4l2/camctrl.c: example: add v4l2 example, demonstrating the use of gst controller 2010-09-10 16:55:25 +0300 Stefan Kost * sys/v4l2/v4l2src_calls.c: v4l2src: don't skip calculating the duration 2010-06-22 15:48:04 +0300 Stefan Kost * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: v4l2src: add controlable colorbalance parameters Expose colorbalance controls as object properties (like we do on xvimagesink). Make them controlable. 2010-09-10 13:25:39 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmparobustdepay.c: rtpmparobustdepay: fix some mis-implementation Also add some debug. 2010-09-10 13:24:02 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmparobustdepay.c: rtpmparobustdepay: properly insert dummy buffers 2010-09-10 11:55:26 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: add rtsp-sdp protocol support Allow setting an SDP with the rtsp-sdp:// url. Based on patch from Marco Ballesio. See #628214 2010-09-10 11:35:58 +0200 Alessandro Decina * gst/alpha/gstalphacolor.c: alphacolor: make passthrough work. 2010-09-09 21:43:40 +0300 Stefan Kost * gst/rtp/gstrtpmp4adepay.c: mp4adepay: small logging cleanup and addition to debug config parsing 2010-09-09 21:42:46 +0300 Stefan Kost * ext/aalib/gstaasink.c: aasink: fix context initialisation and freeing to not leak 2010-09-09 21:40:51 +0300 Stefan Kost * tests/check/Makefile.am: * tests/check/generic/states.c: tests: allow running state tests for all elements Now one can use GST_NO_STATE_IGNORE_ELEMENTS=1 make generic/states.check to try elements that would normaly be skipped. 2010-09-09 18:47:56 +0200 Wim Taymans * tests/check/elements/rtp-payloading.c: tests: fix rtpjpegpay test Make the data we send to the jpeg payloader be a valid jpeg file because the payloader now expects this. 2010-09-09 18:47:11 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: improve debugging 2010-09-09 16:31:56 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmparobustdepay.c: rtpmparobustdepay: use valid bitrate for dummy frame 2010-09-08 17:07:53 -0300 Thiago Santos * ext/taglib/gstid3v2mux.cc: id3v2mux: Adds mapping for album artist Maps GST_TAG_ALBUM_ARTIST to TPE2 in id3v2mux 2010-09-08 18:35:08 +0200 Sebastian Dröge * configure.ac: configure: Require orc 0.4.8 The deinterlace plugin apparently fails to compile with older versions. 2010-09-08 17:50:11 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: QoS handling logic only applies to forward playback Fixes #628894. 2010-09-08 17:43:47 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: remove unused code 2010-09-08 14:36:48 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: fixup last commit We need to prevent the eventual leak better. 2010-09-08 14:16:58 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: code cleanups Use g_slist_prepend as we don't care about the order. Check for list == NULL instead of iterating the list to see if it is empty. Move ctx allocation down to prevent leak in case of failure. 2010-09-08 07:13:42 +0200 Sebastian Dröge * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: Fix uninitialized variable compiler warning Fixes bug #629018. 2010-09-07 19:02:01 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: simplify clock provide code Don't leak the pulsesink element by having the clock keep a ref to the sink. Create the clock only once in the constructor and use the baseaudiosink clock cleanup code. 2010-09-07 17:49:05 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: move the context table init to _get_type phase This seems to fix the invalid reads on context shutdown better, altough I can't really explain. 2010-09-07 17:06:02 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: use older g_array_free g_array_unref() is only since 2.22 2010-09-07 16:49:16 +0200 Wim Taymans * ext/jpeg/gstjpegdec.c: jpegdec: avoid invalid adapter flush on QoS First store the available data in the adapter in the rem_img_len instance field before trying to flush the adapter with that value on QoS. 2010-09-07 16:40:08 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: do some more sanitity checks Protect some more against invalid input. 2010-09-07 15:20:12 +0200 American Dynamics * gst/rtp/gstrtpjpegpay.c: jpegpay: handle corrupted jpeg better Protect against corrupted jpeg input. 2010-09-07 13:55:04 +0200 Wim Taymans * gst/rtp/gstrtpvrawdepay.c: rvawdepay: cleanup unused fields 2010-09-07 13:51:37 +0200 Wim Taymans * gst/rtp/gstrtpvrawdepay.c: vrawdepay: handle invalid payload better Make sure we don't read more data than available in the input buffer. Clip the input data into the output buffer. 2010-08-16 15:35:51 +0300 Stefan Kost * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: * ext/pulse/pulseutil.c: * ext/pulse/pulseutil.h: pulse: allow setting stream properties Add a "properties" property to the elements to allow setting extra stream properties. Fixes #537544 2010-09-07 12:08:10 +0100 Tim-Philipp Müller * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-gdkpixbuf3.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: remove introspection info for gdkpixbuf3 plugin and update version for others The versions got accidentally reverted to a pre-release version, fix that. 2010-09-07 11:42:10 +0100 Tim-Philipp Müller * common: Automatic update of common submodule From c2e10bf to aa0d1d0 2010-09-07 09:20:03 +0100 Tim-Philipp Müller * ext/annodex/gstcmmldec.c: cmmldec: fix flow return handling Fix buggy GST_FLOW_IS_FATAL substitution, and 'make check': - if (!GST_FLOW_IS_FATAL (dec->flow_return) && !dec->sent_root) { + if (dec->flow_return != GST_FLOW_OK && !dec->sent_root) { 2010-09-07 00:27:07 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: don't free the context multiple times Apparently the close function of the ring-buffer can be called multiple times. 2010-08-12 12:33:06 +0300 Stefan Kost * gst/rtp/gstrtpmp4adepay.c: rtpmp4adepay: grab the sampling arte and put into caps This is needed to be able to mux the received audio into mp4 (in the case of aac). Fixes #625825. 2010-09-06 14:40:02 +0100 Tim-Philipp Müller * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpqcelpdepay.c: rtp: mark constant tables as const 2010-08-18 14:40:48 +0200 Mark Nauwelaerts * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpamrpay.h: rtpamrpay: properly support perfect-rtptime 2010-08-18 11:42:33 +0200 Mark Nauwelaerts * gst/rtp/gstrtpamrpay.c: rtpamrpay: proper duration for multiple frame payload 2010-08-18 11:42:07 +0200 Mark Nauwelaerts * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: rtpamr(de)pay: support AMR-WB SID frame 2010-08-18 11:39:06 +0200 Mark Nauwelaerts * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpg729pay.h: rtpg729pay: properly support perfect-rtptime 2010-08-16 16:08:04 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: improve framerate determining Collect a limited number of starting sample durations and use the median of those to determine caps framerate. 2010-08-17 12:08:10 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: attempt more resync upon (cluster) parse error That is, if parse error occurs in state requiring to move to next cluster, and doing so to the expected next position of cluster fails, then scan for a next cluster from present position and resume from there. Fixes #620790. 2010-08-16 16:05:41 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: not so fatal error handling If some bits out of place in block(group) parsing, forego and move to next. Also skip large blocks in pull mode, but need to give up in push mode. Fixes #626463. Improves #620790. 2010-07-26 15:51:49 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: additional parse recovery In particular, upon parse failure in one cluster, we may forego remaining content and try resuming from next cluster onwards. Fixes #620790. 2010-09-06 12:22:11 +0200 American Dynamics * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: Add property to configure udpsrc buffer size Add a new udp-buffer-size property to configure the buffer-size on the udpsrc elements. Fixes #628058 2010-08-27 17:58:47 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: add ntp-sync property Add an ntp-sync property that will sync the received streams to the server NTP time. This requires synchronized NTP times between the sender and receivers, like with ntpd. Based on patch from Thijs Vermeir. Fixes #627796 2010-08-27 12:14:25 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: rename a variable to avoid confusion 2010-08-27 11:07:34 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: rename some variables for less confusion 2010-08-27 10:41:01 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: move comment where it belongs 2010-08-26 16:00:38 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: session: minor cleanups Make clock snapshots more accurate by only sampling the same clock once. 2010-08-26 10:58:26 +0200 Thijs Vermeir * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpsession.c: rtpbin: add use-pipeline-clock property With this property RTCP SR NTP times can be based on the system clock (maybe synced with ntpd) or the current pipeline clock. https://bugzilla.gnome.org/show_bug.cgi?id=627796 2010-08-25 09:58:20 +0200 Wim Taymans * gst/rtsp/gstrtspext.c: rtspext: stop configuration on first failure Stop the configuration of a stream as soon as some of the extensions return FALSE. Fixes #581294 2010-08-20 15:35:27 +0200 Wim Taymans * gst/udp/gstmultiudpsink.c: * gst/udp/gstmultiudpsink.h: multifdsink: use refcount to count host/port duplicates Instead of adding multiple client structures for the same host/port pair, use a refcount. Add a send-duplicates feature that allows you to disable sending multiple copies of the same packet to the same host when it was added multiple times. The send-duplicates property is by default set to TRUE for backwards compatibility although it is very likely that this is not desired behaviour. 2010-08-19 17:06:26 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: implement custom event handler Extend the _push_event() function so that it can also send events to the udp sources when asked. Implement a custum send_event function that correctly dispatches the downstream events in TCP mode. This fixes sending EOS to rtspsrc and have it push the EOS downstream. 2010-08-19 11:37:04 +0200 Wim Taymans * ext/pulse/pulsesrc.c: pulsesrc: use _get_caps_reffed() when we can Use _get_caps_reffed() Add some more debug when opening the server connection. 2010-08-16 11:29:07 +0200 Wim Taymans * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegdepay.h: jpegdepay: handle DISCONT and reset state Put a DISCONT event on the next output buffer when the input buffer had a DISCONT. Make sure we clear our adapter and reset our state before going to PAUSED. Free the qtables. Fixes #626869 2010-08-16 11:27:53 +0200 Wim Taymans * gst/rtp/gstrtpg729pay.h: g729pay: extend from right parent 2010-09-06 09:57:10 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: add since docs for new property. 2010-08-30 16:45:48 +0300 Stefan Kost * gst/qtdemux/qtdemux.c: qtdemux: use GST_BOILERPLATE macro 2010-08-16 17:23:58 +0300 Stefan Kost * gst/videomixer/videomixer.c: videmixer: add a example showing how to use the child properties Show how to position and set the alpho of the videos on gst-launch. 2010-08-16 15:19:38 +0300 Stefan Kost * ext/pulse/pulsesrc.c: pulsesrc: move the property-setter to the getter. 2010-08-11 15:48:18 +0300 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum only aggregate magnitude/phase if user asks for it 2010-08-11 15:45:56 +0300 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: improve performance with local vars Use 'input' instead of 'spectrum->input' which was intende already (variable exists, but not used everywhere). Also use a local version of 'spectrum->input_pos'. 2010-08-11 15:44:03 +0300 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: code cleanup More comments and logging. Extract one complex condition to a variable. Reorder some code for readability. 2010-08-11 15:40:09 +0300 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: improve property setter consistently only update if the property actualy changed the value. Do it without reading the gvalue twice. No need to reset the spectrum analyzer for threshold changes. 2010-08-11 15:38:24 +0300 Stefan Kost * gst/spectrum/gstspectrum.c: spectrum: add helper to only flush ringbuffer data without resetting the fft Reduces some duplicated code as well. 2010-08-11 12:45:53 +0300 Stefan Kost * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: more comments 2010-09-05 22:22:42 -0700 David Schleef * gst/deinterlace/gstdeinterlace.c: deinterlace: Document methods with bad quality 2010-09-05 22:19:56 -0700 David Schleef * gst/deinterlace/gstdeinterlacemethod.c: deinterlace: initialize all deinterlace class members This fixes UYVY deinterlacing. 2010-09-05 18:58:13 -0700 David Schleef * common: Automatic update of common submodule From d3d9acf to c2e10bf 2010-09-05 18:45:21 -0700 David Schleef * gst/videomixer/blend.c: videomixer: orc_init() doesn't need to be called There's no need to call orc_init() unless you're using the Orc API directly. All code created by orcc is guaranteed to work without calling orc_init(). 2010-09-05 18:40:48 -0700 David Schleef * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime.orc: * gst/deinterlace/tvtime/greedy.c: deinterlace: Fix greedyl Orc implementation To agree with the previous C/asm code. 2010-09-05 22:31:34 -0300 Thiago Santos * gst/videomixer/videomixer2.c: videomixer2: Fail when caps are incompatible Do not forget to return false when caps are incompatible. 2010-09-05 20:56:52 -0300 Thiago Santos * gst/videomixer/blend.c: videomixer: Only init orc if it is available Put some ifdef around orc_init to prevent build errors 2010-09-05 12:17:08 +0200 Sebastian Dröge * common: Automatic update of common submodule From ec60217 to d3d9acf 2010-09-04 12:46:31 -0700 David Schleef * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: deinterlace: Update disted Orc files 2009-06-29 11:43:07 -0700 David Schleef * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: v4l2src: add decimate property 2010-06-04 12:09:23 -0700 David Schleef * ext/dv/Makefile.am: * ext/dv/gstdvdemux.c: * ext/dv/gstsmptetimecode.h: dvdemux: Parse SMPTE time codes 2010-08-23 02:50:36 -0700 David Schleef * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: deinterlace: remove assembly code in favor of orc 2010-06-08 14:54:49 -0700 David Schleef * gst/deinterlace/tvtime.orc: * gst/deinterlace/tvtime/greedy.c: deinterlace: implement greedy in Orc 2010-09-04 11:43:21 -0700 David Schleef * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: update disted Orc files 2010-09-02 14:34:50 +0200 Thibault Saunier * gst/alpha/gstalphacolor.c: alphacolor: Fix classification This is no effect but a converter. Fixes bug #628608. 2010-09-02 11:19:06 +0200 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/gst-plugins-good-plugins.types: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-gdkpixbuf3.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst/videomixer/Makefile.am: * gst/videomixer/videomixer2.c: * gst/videomixer/videomixer2.h: * gst/videomixer/videomixer2pad.h: videomixer2: Add documentation and add to the docs 2010-07-26 16:07:15 +0200 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/gstcollectpads2.c: * gst/videomixer/gstcollectpads2.h: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer2.c: * gst/videomixer/videomixer2.h: videomixer2: Add videomixer2 element This is based on collectpads2 and is synchronizing all streams based on the running time. New features compared to old videomixer: * Synchronizing frames on the running time * Improved and simplified negotiation * Full QoS support * Variable framerate support Fixes bug #626048, #624905. 2010-09-01 11:11:34 +0200 Pavel Kostyuchenko * gst/matroska/matroska-demux.c: matroskademux: Relax parsing of date tags Before we required a complete date in matroskademux but in id3demux for example only the year or year and month was possible too. Fixes bug #628454. 2010-08-30 19:03:52 +0100 Sjoerd Simons * sys/v4l2/gstv4l2src.c: v4l2src: Use GstBaseSrc::block-size as fallback size 2010-08-30 18:36:54 +0100 Sjoerd Simons * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2src.c: v4l2src: Fix using mpegts via the mmap interface MPEG doesn't have a static size per frame, so don't pretend it has one and fail when capturing because it doesn't match. Instead mark the size as unknown and let the read frame grabbing method use a reasonable fallback value (assuming that's only for actual streaming formats) Fixes bug #628349. 2010-08-27 18:15:03 +0200 Sebastian Dröge * ext/wavpack/gstwavpackparse.c: wavpackparse: Don't use GST_FLOW_IS_FATAL() 2010-08-27 18:13:21 +0200 Sebastian Dröge * ext/libpng/gstpngdec.c: pngdec: Don't use GST_FLOW_IS_FATAL() And don't post an error message if downstream returns UNEXPECTED. 2010-08-27 18:09:11 +0200 Sebastian Dröge * ext/dv/gstdvdemux.c: dvdemux: Don't use GST_FLOW_IS_FATAL() 2010-08-27 18:05:50 +0200 Sebastian Dröge * ext/jpeg/gstjpegdec.c: jpegdec: Don't use GST_FLOW_IS_FATAL() And don't post an error message if buffer allocation failed because of UNEXPECTED, which only means that downstream wants us to EOS now. 2010-08-27 18:02:57 +0200 Sebastian Dröge * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: flacenc/dec: Don't use GST_FLOW_IS_FATAL() And properly handle UNEXPECTED and WRONG_STATE. 2010-08-27 17:52:18 +0200 Sebastian Dröge * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: cmmldec/enc: Don't use GST_FLOW_IS_FATAL() And as a result, don't ignore WRONG_STATE and NOT_LINKED. Both mean that it's a good idea to pass them upstream instead of pretending that everything is good. 2010-08-27 17:47:22 +0200 Sebastian Dröge * gst/wavparse/gstwavparse.c: wavparse: Don't use GST_FLOW_IS_FATAL() 2010-08-27 17:45:53 +0200 Sebastian Dröge * gst/rtsp/gstrtspsrc.c: rtspsrc: Don't use GST_FLOW_IS_FATAL() and GST_FLOW_IS_SUCCESS() 2010-08-27 17:39:32 +0200 Sebastian Dröge * gst/qtdemux/qtdemux.c: qtdemux: Don't use GST_FLOW_IS_FATAL() 2010-08-27 17:37:33 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Don't use GST_FLOW_IS_FATAL() 2010-08-27 17:35:47 +0200 Sebastian Dröge * gst/debugutils/rndbuffersize.c: rndbuffersize: Don't use GST_FLOW_IS_FATAL() 2010-08-27 17:35:38 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: flvdemux: Don't use GST_FLOW_IS_FATAL() 2010-08-27 17:32:09 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Don't use GST_FLOW_IS_FATAL() And document why wrong-state doesn't need an error message. 2010-08-26 13:44:49 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Fail gracefully if no threaded PA mainloop can be created Fixes bug #628020. 2010-08-24 15:11:20 +0200 Sebastian Dröge * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: videomixer: Update disted ORC files 2010-08-23 15:44:50 +0200 Sebastian Dröge * configure.ac: * gst/videomixer/Makefile.am: * gst/videomixer/blend.c: * gst/videomixer/blend_mmx.h: * gst/videomixer/blendorc.orc: * gst/videomixer/videomixer.c: videomixer: Optimize ARGB blending and implement BGRA blending with orc This now means, that we have absolutely no handwritten assembly anymore in videomixer and it's also faster now when using SSE. 2010-08-22 01:58:05 -0700 David Schleef * gst/videomixer/blend.c: * gst/videomixer/blendorc.orc: videomixer: Add orc implementation for blending videomixer: Add orc implementation for blending 2010-08-22 01:54:16 -0700 David Schleef * gst/videomixer/videomixer.c: videomixer: Fix example pipelines videomixer: Fix example pipelines 2010-08-20 11:41:55 +0200 Sebastian Dröge * tests/check/elements/imagefreeze.c: imagefreeze: Add test for checking if imagefreeze correctly returns UNEXPECTED after the first buffer 2010-08-20 11:38:09 +0200 Sebastian Dröge * tests/check/elements/imagefreeze.c: imagefreeze: Add test for bufferalloc passthrough 2010-08-20 10:35:15 +0200 Sebastian Dröge * tests/check/elements/imagefreeze.c: imagefreeze: Fix race conditions in the unit test If setting the pipeline to PLAYING before issuing the seek, buffers are already arriving at the sink before the seek is handled and will have the wrong timestamps and everything. Fixes bug #625547. 2010-08-20 10:34:17 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: * gst/imagefreeze/gstimagefreeze.h: imagefreeze: Fix another subtle race condition related to starting the srcpad task Due to a seek the srcpad task could be started in rare circumstances although it shouldn't be started anymore because no upstream buffer is available. 2010-08-20 10:24:33 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: * gst/imagefreeze/gstimagefreeze.h: imagefreeze: Protect the flushing-seek variable by the srcpad's stream lock This fixes a subtle race condition, that caused bufferalloc to fail with wrong-state due to a seek but caused it to be not retried as it should. 2010-08-20 09:14:59 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Always generate a perfectly timestamped stream Before there could be rounding errors when calculating the duration, resulting in timestamp + duration being smaller than the next buffer's timestamp. 2010-08-19 18:38:39 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Only include the server name in the context name if it's not NULL 2010-08-18 16:37:41 +0200 Philippe Normand * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: Add "client" property to set the PA client name Allows the application to modify the client name used to connect when connecting to the PulseAudio daemon. Note however that updating the property after the element reached the READY state will have no effect until the next NULL->READY transition. Fixes bug #627174. 2010-08-19 17:59:09 +0200 David Hoyt * ext/soup/gstsouphttpsrc.c: souphttpsrc: Improve error messages Before they contained the URL before the actual failure. The other way around makes more sense and we do the same in other elements like filesrc. Fixes bug #627289. 2010-08-19 12:46:50 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Free the clock on state change failures too 2010-08-17 16:26:41 +0200 Philippe Normand * configure.ac: * ext/pulse/pulseutil.c: * win32/common/config.h: pulseutil: include pid value in gst_pulse_client_name() fallback return value Fixes bug #627162 2010-08-19 12:32:59 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Free the GstPulseContext after usage 2010-08-16 09:12:04 +0200 Philippe Normand * ext/pulse/pulsesink.c: pulsesink: share the PA context between all clients with the same name Avoid to create a new PA context for each new client by using a hash table containing the list of ring-buffers and the shared PA context for each client. Doing this will improve application memory usage in the cases where multiple pipelines involving multiple pulsesink elements are used. Fixes bug #624338. 2010-08-17 13:41:49 +0200 Philippe Normand * ext/pulse/pulsesink.c: pulsesink: clear the PA mainloop if baseaudiosink failed to open the ring_buffer If the application requests a state-change and pulsesink fails to open the ring_buffer device the mainloop attribute of the sink should be cleaned up to avoid future state-change (NULL->READY) failures. 2010-08-19 12:23:16 +0200 Sebastian Dröge * gst/wavparse/gstwavparse.c: wavparse: Post an error message if EOS happens before valid input is found Fixes bug #627341. 2010-08-12 11:49:47 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: Send close newsegment event from the streaming thread 2010-08-11 11:36:31 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: * gst/imagefreeze/gstimagefreeze.h: imagefreeze: Retry bufferalloc if it was aborted with WRONG_STATE because of a flushing seek 2010-08-11 08:46:14 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Return GST_FLOW_UNEXPECTED when getting a second buffer This prevents upstream from pushing many useless buffers and makes it go into EOS state. 2010-08-10 20:11:26 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Passthrough buffer allocations 2010-09-04 13:10:30 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development Temporarily disable -DGST_DISABLE_DEPRECATED for git builds until the code is updated for the GST_FLOW_IS_* macro deprecations. === release 0.10.25 === 2010-09-02 23:44:19 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * gst-plugins-good.doap: * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: * win32/common/config.h: Release 0.10.25 2010-09-02 23:12:48 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: update docs for release 2010-09-02 23:07:36 +0100 Tim-Philipp Müller * po/LINGUAS: * po/es.po: * po/gl.po: * po/lt.po: * po/nl.po: * po/ro.po: * po/sv.po: po: update translations 2010-08-25 19:01:50 +0200 Sebastian Dröge * configure.ac: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sl.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: 0.10.24.5 pre-release 2010-08-22 21:15:07 -0700 David Schleef * gst/deinterlace/gstdeinterlace.c: deinterlace: use separate buffer metadata for fields Call gst_buffer_make_metadata_writable() on buffers that are duplicated into fields. Fixes #627689. 2010-08-21 21:41:36 +0200 Sebastian Dröge * configure.ac: * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sl.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: 0.10.24.4 pre-release 2010-08-19 18:30:05 -0300 Thiago Santos * ext/jpeg/gstjpegdec.c: jpegdec: Prevent crash when reading image with problems Check if we have data on the adapter and fail if not. Fixes #627413 2010-08-13 17:24:01 +0300 Stefan Kost * common: Automatic update of common submodule From 3e8db1d to ec60217 2010-08-11 22:20:25 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Send close segments when seeking only for non-flushing seeks and if we already sent a newsegment event Fixes bug #626619. 2010-08-11 16:50:42 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: * win32/common/gstrtpbin-marshal.c: * win32/common/gstudp-enumtypes.c: * win32/common/gstudp-enumtypes.h: * win32/common/gstudp-marshal.c: 0.10.24.3 pre-release 2010-08-11 11:17:18 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: prevent reading past avc1 atom when parsing ... when one of the subatoms has a large/invalid size. Fixes #626609. 2010-08-10 23:37:23 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: 0.10.24.2 pre-release 2010-08-10 10:57:45 +0100 Tim-Philipp Müller * common: Automatic update of common submodule From bd2054b to 3e8db1d 2010-08-09 00:36:36 +0100 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulse: fix printf format in some debugging messages 2010-08-08 23:31:42 +0100 Tim-Philipp Müller * pkgconfig/gstreamer-plugins-good-uninstalled.pc.in: pkgconfig: set pluginsdir to top-level builddir without the pkgconfig/.. bits Removes clutter in plugin dir paths. This is only used to find the -good plugins for unit tests of ugly/bad/ffmpeg/etc. in an uninstalled setup. 2010-08-06 20:04:59 +0100 Tim-Philipp Müller * sys/v4l2/gstv4l2object.c: v4l2src: also log pixel formats in sorted order 2010-08-06 18:07:46 +0100 Sjoerd Simons * sys/v4l2/gstv4l2object.c: v4l2: sort formats in the right order so that non-emulated formats are prefered The format list should be sorted from high ranks to low ranks. In the GSList sorting function this means the compare needs to return a positive value if format a has a lower rank than format b. Among other things this fixes v4l2src to prefer non-emulated formats to emulated formats when built against libv4l. 2010-08-06 19:24:06 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Fix pipeline in the documentation Make sure that we have the same color format on all streams, i.e. AYUV Fixes bug #625452. 2010-08-05 13:56:44 +0300 Stefan Kost * common: Automatic update of common submodule From a519571 to bd2054b 2010-06-14 19:58:11 +1000 Jonathan Matthew * ext/taglib/gstid3v2mux.cc: * tests/check/elements/id3v2mux.c: id3v2mux: write beats-per-minute tag using TBPM frame https://bugzilla.gnome.org/show_bug.cgi?id=621520 2010-07-25 11:47:43 +0200 Sebastian Dröge * gst/videomixer/blend.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Move debug categories into the source files and add debug category for the blend functions 2010-08-04 19:25:31 +0200 Sebastian Dröge * configure.ac: configure: Check if the compiler supports ISO C89 or C99 and which parameters are required This first checks what is required for ISO C99 support and sets the relevant compiler parameters and if no C99 compiler is found, it checks for a C89 compiler. This enables us to check for and use C89/C99 functions that gcc hides from us without the correct compiler parameters. 2010-07-15 10:10:31 +0200 Philippe Normand * ext/pulse/pulsesink.c: pulsesink: use G_TYPE_DEFINE to define ring buffer type The existing get_type() implementation is racy, and the g_type_class_ref() workaround didn't actually work because it was in the wrong function. Since class creation in GObject is thread-safe these days (since 2.16), the class_ref workaround is no longer needed and it is sufficient to ensure the _get_type() function is thread-safe, which G_TYPE_DEFINE does. https://bugzilla.gnome.org/show_bug.cgi?id=624338 2010-08-04 15:20:42 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Post CLOCK-LOST/CLOCK-PROVIDE when going to/from READY Otherwise the clocks are redistributed every time the pipeline goes to PAUSED, which is quite expensive. 2010-07-12 12:35:15 +0200 Wim Taymans * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4gpay.h: rtpmp4gpay: implement perfect timestamps Use bitreader for parsing the config string Reset state variables when going to READY Parse frame length and use it to keep track of the rtptimestamps 2010-07-09 14:07:49 +0200 Wim Taymans * gst/rtp/gstrtph263pdepay.c: rtph263pdepay: allow more clock-rates as input Although the spec says that the clock-rate should always be 90000, some rtsp servers send different clock-rates so we must accept then in order to handle those streams too. 2010-07-06 19:02:14 +0200 Wim Taymans * gst/rtp/gstrtpL16depay.c: L16depay: default to 1 channel When we can't find any channel or encoding-params on the caps for dynamic payload types, set the default number of channels to 1, as the spec says we should. See #623209 2010-07-06 18:22:24 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't reuse udp sockets Don't reuse sockets but make the udpsrc element fail the state change when the socket is already in use. If we don't prevent reuse, we might end up using the same port for different streams in some cases. Fixes #622017 2010-07-06 18:11:21 +0200 Wim Taymans * gst/udp/gstudpsrc.c: * gst/udp/gstudpsrc.h: udpsrc: add property to enable port reuse 2010-07-05 10:23:37 +0200 Wim Taymans * gst/rtp/gstrtpL16depay.c: L16depay: use encoding-params for the channels When parsing the number of channels, use the encoding-params property from the RTP caps because that is where we can find the channels according to the spec. Fall back to the channels property in the caps when needed. Fixes #623209 2010-06-29 10:46:41 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: improve error and warning message Improve error and warning message. Fixes #622577 2010-08-02 23:15:56 +0300 Stefan Kost * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: examples: no need to set the color for each frq-band 2010-08-02 12:56:29 +0200 Mark Nauwelaerts * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpg729pay.h: rtpg729pay: avoid basertppayload perfect-rtptime mode G729 packets may only occur intermittently (e.g. cn packets), and as such do not allow for perfect-rtptime calculating rtp times based on frame or byte count. In particular, do not use rtp audio base payloader as base class, but rather base payloader directly. 2010-08-02 12:48:02 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264pay.c: rtph264pay: fix element leak 2010-08-02 12:46:41 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmp4vdepay.c: rtpmp4vdepay: fix buffer leak 2010-08-02 12:46:20 +0200 Mark Nauwelaerts * tests/check/elements/rtp-payloading.c: tests: rtp payloading: fix pad leak 2010-07-29 17:18:11 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: push mode; use proper movi offset for movi based index Fixes #623357. 2010-07-29 10:00:15 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: Correctly parse mvhd atoms Parse mvhd data according to its version to avoid failing on valid files. 2010-07-28 12:21:41 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Fix the max/avg in btrt atom reading According to ISO media base format, the max bitrate is the first one, and the avg comes next. 2010-07-27 15:58:02 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: proper handling of streaming upstream without duration Fixes #625371. 2010-07-26 18:33:09 +0200 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroskademux: initialize some variables to fix compiler warnings on OSX build bot 2010-07-26 18:15:25 +0200 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulsesink: correctly check what version of gst-plugins-base we're compiling against We need to check the gst-plugins-base version, not the core version (even if both should be the same in any sane setup). 2010-07-26 17:45:42 +0200 Arnaud Vrac * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: add port-range property to rtspsrc To support setups with firewall/ipsec, it is useful for an rtsp client to be able to set the range of ports that can be used for rtp/rtcp reception. Allows this by adding a "port-range" property to the rtspsrc element. Fixes #625153 2010-07-26 13:38:31 +0200 Andoni Morales Alastruey * gst/qtdemux/qtdemux.c: qtdemux: set the pixel-aspect-ratio field also for par=1/1 https://bugzilla.gnome.org/show_bug.cgi?id=625302 2010-07-26 15:31:16 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix memory leak in server request reply The RTSP server rtspsrc is communicating with, sends a GET_PARAMETER request periodically as a ping. The code in gst_rtspsrc_handle_request forms an OK response and sends, but doesn't call gst_rtsp_message_unset to free the memory after sending the response. This results in a constant slow memory leak. Fixes #624770 2010-07-24 22:39:54 +0100 Zaheer Abbas Merali * gst/debugutils/cpureport.c: cpureport: remove bogus docs 2010-07-24 22:37:11 +0100 Zaheer Abbas Merali * gst/debugutils/Makefile.am: * gst/debugutils/cpureport.c: * gst/debugutils/cpureport.h: * gst/debugutils/gstdebug.c: debugutils: new element cpureport cpureport posts bus messages after every buffer received of cpu used, system clock time, buffer time 2010-07-24 10:29:01 +0200 Sebastian Dröge * tests/examples/equalizer/demo.c: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: examples: Destroy the cairo context after usage 2010-07-24 10:21:05 +0200 Sebastian Dröge * configure.ac: * ext/Makefile.am: * ext/gdk_pixbuf/Makefile.am: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/gstgdkpixbufsink.c: * ext/gdk_pixbuf/pixbufscale.c: Revert "gdkpixbuf: Add a gdkpixbuf3 plugin that uses gdkpixbuf3" This reverts commit b6788153161b4e07fbf3d42a2d8921ea049305d0. There's no gdk-pixbuf3 anymore. gdk-pixbuf was separated from GTK+ and will stay at version 2.0 for GTK+ 3.0. 2010-07-24 10:19:37 +0200 Sebastian Dröge * tests/examples/equalizer/demo.c: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: examples: Use cairo instead of to-be-deprecated GDK API Fixes bug #625002. 2010-07-22 16:24:43 +0200 Mark Nauwelaerts * ext/flac/gstflacdec.c: flacdec: fix event leak 2010-07-22 12:05:26 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: pull mode non-cue seeking That is, in files that have no index (Cue), perform seek by scanning for nearest cluster with timecode before requested position. Scanning is done as a combination of interpolation and sequential scan. Fixes #617368. 2010-07-16 12:46:50 +0200 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: streamable files need no _finish Fixes #624455. 2010-07-22 11:46:35 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: push mode; handle 0-size data chunks Fixes #618535. 2010-07-21 08:11:23 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Only reset QoS information and send a NEWSEGMENT event downstream for NEWSEGMENT events on the master pad 2010-07-14 20:31:44 -0700 David Schleef * gst/debugutils/Makefile.am: * gst/debugutils/gstcapsdebug.c: * gst/debugutils/gstcapsdebug.h: * gst/debugutils/gstdebug.c: capsdebug: Add new element 2010-07-20 16:11:25 +0100 Tim-Philipp Müller * gst/matroska/matroska-mux.c: matroskamux: demote WARNING message to LOG level It's not a warning. 2010-07-19 14:47:32 -0300 Thiago Santos * ext/jpeg/gstjpegdec.c: jpegdec: Fix regression on markers parsing Fixes a regression introduced when fixing bug #583047 in commit a391bf52cc3c580c7a0a2316ca52eb66da3b85c1 Skip the data when libjpeg asks it to be skipped on one of its callbacks. 2010-07-16 18:04:44 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: add missing argument in debug message 2010-07-16 17:53:55 +0200 Sebastian Dröge * ext/pulse/pulsemixerctrl.c: * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: pulsesink: Only use gst_audio_clock_new() when compiling against newer base 2010-07-09 17:33:55 +0200 Sebastian Dröge * ext/raw1394/gstdv1394src.c: dv1394src: Post clock-provide and clock-lost messages when going from/to PLAYING In PAUSED and below the clock is not working. 2010-07-04 16:57:55 +0200 Sebastian Dröge * ext/gconf/gstswitchsink.c: * ext/gconf/gstswitchsink.h: * ext/gconf/gstswitchsrc.c: * ext/gconf/gstswitchsrc.h: gconf: Fix ref handling of new child elements and minor cleanup 2010-07-04 09:45:52 +0200 Sebastian Dröge * ext/gconf/gstgconfvideosrc.c: gconfvideosrc: Use correct GConf key 2010-07-03 14:16:42 +0200 Sebastian Dröge * ext/gconf/gstgconfaudiosrc.c: * ext/gconf/gstgconfaudiosrc.h: gconf: Port gconfaudiosrc to GstSwitchSrc 2010-07-03 14:12:12 +0200 Sebastian Dröge * ext/gconf/gstgconfvideosrc.c: * ext/gconf/gstgconfvideosrc.h: gconf: Port gconfvideosrc to GstSwitchSrc 2010-07-03 14:11:55 +0200 Sebastian Dröge * ext/gconf/Makefile.am: * ext/gconf/gstswitchsrc.c: * ext/gconf/gstswitchsrc.h: gconf: Add GstSwitchSrc base class 2010-07-03 13:56:33 +0200 Sebastian Dröge * ext/gconf/gstswitchsink.c: gconf: Create the ghostpad of the switchsink from the template 2010-07-07 10:10:52 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Post clock-provide/clock-lost when going to/from PAUSED Also use gst_audio_clock_new_full() to prevent crashes when the clock is used after the element was destroyed. 2010-07-15 11:49:03 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: remove bogus UNLOCK 2010-07-13 12:34:44 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: also calculate PAR using track width and height for QT files (... as opposed to only for ISO style files). Fixes #624173. 2010-07-12 17:29:12 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: handle bogus files storing ADTS AAC data 2010-07-09 16:57:33 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: do not error out on a block with unknown tracknumber 2010-07-08 18:57:21 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: do not align reverse playback reference stream twice Timestamp rounding issues could lead to going backwards 2 keyframe periods (rather than only 1). While this is not necessarily a problem, it might potentially place additional (buffering) load on downstream and could be avoided (because We Can). Fixes #623629. 2010-07-08 16:07:16 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: convert some more mov format timestamp to gst time 2010-07-07 14:16:59 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: additional verification heuristics for VBR audio stream Check for and override some header field(s) for reasonable values, according to later expected use in calculations. 2010-07-14 15:21:21 +0200 Alessandro Decina * gst/videofilter/gstvideobalance.c: videobalance: Fix wrong lock order that could lead to a deadlock. Fixes #624331. 2010-07-16 11:31:08 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development === release 0.10.24 === 2010-07-15 01:49:04 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.24 2010-07-15 01:35:06 +0100 Tim-Philipp Müller * po/cs.po: * po/lv.po: po: update translations 2010-07-07 00:42:46 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: 0.10.23.4 pre-release 2010-07-07 00:31:17 +0100 Tim-Philipp Müller * po/LINGUAS: * po/da.po: * po/el.po: * po/es.po: * po/fr.po: * po/id.po: * po/pt_BR.po: * po/sl.po: * po/tr.po: * po/zh_CN.po: po: update translations 2010-06-23 11:47:43 +0200 Michael Grzeschik * sys/v4l2/gstv4l2sink.c: v4l2sink: destroy buffer pool when changing state to NULL In the case we change the State from READY_TO_NULL the buffers in the pool still hold an open dup file descriptor to the device, therefore the device release function will not be called and the device will probably answer with -EBUSY when we reopen it in the next NULL_TO_READY transition. Signed-off-by: Michael Grzeschik See bug #622500 and #612244. 2010-07-06 13:21:19 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: Fix order of bitrates in 'btrt' atom There seems to be a bug in libmp4v2 that generates a MPEG4BitRateBox as (bufferSizeDB, avgBitrate, maxBitrate) instead of (bufferSizeDB, maxBitrate, avgBitrate), according to the spec. I used the mp4file output while writing this code, so the order is wrong. This patches fixes that. https://bugzilla.gnome.org/show_bug.cgi?id=623654 2010-07-05 12:05:57 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: fix skipping extra 0xff markers Fixes #623585. 2010-06-29 23:18:23 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: fix memory leak Don't leak result of gst_adapter_take(). There are most likely smarter things we can do, but let's keep things simple for the release. Fixes #623172. 2010-07-02 12:31:31 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: strip out bogus tags from XMP atom https://bugzilla.gnome.org/show_bug.cgi?id=623366 2010-07-02 14:25:22 +0200 Andrzej K. Haczewski * gst/flv/gstflvmux.c: flvmux: Write duration at the correct position 2010-06-30 11:12:08 +0200 Thijs Vermeir * gst/rtpmanager/gstrtpptdemux.c: rtpptdemux: fix memleak on custom downstream events by not sending custom downstream event twice and fix memleak when not handling the event https://bugzilla.gnome.org/show_bug.cgi?id=623196 2010-06-29 20:18:51 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: 0.10.23.3 pre-release 2010-06-29 20:14:53 +0100 Tim-Philipp Müller * gst/wavparse/gstwavparse.c: wavparse: fix unportable printf format specifiers in commented out code To avoid false positives when grepping for unportable specifiers. 2010-06-29 19:12:36 +0100 Tim-Philipp Müller * configure.ac: configure: fix --disable-external 2010-06-28 15:44:06 +0100 Tim-Philipp Müller * autogen.sh: * configure.ac: Bump automake requirement to 1.10 and autoconf to 2.60 For maintainability reasons and $(builddir). See #622944. 2010-06-28 09:07:58 +0100 Tim-Philipp Müller * gst/goom/plugin_info.c: goom: don't allocate 260kB struct on the stack PluginInfo is quite a sizeable struct, let's not allocate it on the stack, especially not if we're copying it over into another dynamically allocated copy anyway. Fixes #570761. 2010-06-27 10:31:17 +0200 Sebastian Dröge * configure.ac: configure: Require GTK+ >= 2.14 for the examples 2010-06-26 20:12:25 +0200 Guido Günther * tests/examples/equalizer/demo.c: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: examples: Make demos -DSEAL safe to fix build with GTK+ 3.0 2010-06-26 21:39:34 +0200 Sebastian Dröge * ext/jpeg/Makefile.am: jpeg: Explicitely link with libgstbase 2010-06-26 18:42:29 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.23.2 pre-release 2010-06-26 18:41:49 +0100 Tim-Philipp Müller * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videomixer/blendorc-dist.c: gst: update orc files 2010-06-26 18:41:39 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update translations 2010-06-25 19:40:06 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Fix leaking of the streamheader buffers gst_value_set_buffer() increases the refcount and doesn't take ownership of the buffer. 2010-06-24 16:32:23 +0100 Tim-Philipp Müller * gst/matroska/ebml-read.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstvideoflip.c: matroska, videobox, videofilter: fix compiler warnings when debugging is disabled in gstreamer Fixes unused variable warnings when GStreamer's debugging system has been disabled. 2010-06-24 15:17:11 +0100 Tim-Philipp Müller * tests/check/Makefile.am: tests: add plugin loading whitelist to test environment Only want to load core/base/good plugins here. Fixes #619717. 2010-06-24 15:09:16 +0300 Stefan Kost * common: Automatic update of common submodule From 73ff93a to a519571 2010-06-24 13:02:04 +0100 Tim-Philipp Müller * ext/gdk_pixbuf/gstgdkpixbuf.c: gdkpixbufdec: bump rank to SECONDARY Bump gdkpixbufdec's rank to SECONDARY to give it an edge over misc. image decoders in gst-ffmpeg that also have a MARGINAL rank. Fixes #620162. 2010-06-23 12:15:13 +0200 Michael Grzeschik * gst/avi/gstavidemux.c: reset the have_index flag at transition PAUSED_TO_READY If we restart the Stream in the case of doing a transition from PAUSED_TO_READY and back with READY_TO_PAUSED aso. the duration of the video will get calculated even if we have a avi header with that information. Signed-off-by: Michael Grzeschik 2010-06-23 20:29:14 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix negotiation for I420/YV12 We don't support conversion into *all* YUV formats for them, only into I420/YV12/AYUV. Fixes bug #622501. 2010-06-22 15:22:44 +0200 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: wavparse: proper closing segment construction Fixes #618982. 2010-06-22 15:46:51 +0300 Stefan Kost * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2src_calls.c: v4l2: precalculate duration Have frame duration in the instance struct and calculate it after changing the caps. 2010-06-21 12:17:39 +0300 Stefan Kost * sys/v4l2/gstv4l2sink.c: v4l2sink: use glib defines in property declarations for readability 2010-06-21 12:15:14 +0300 Stefan Kost * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2src.c: v4l2: use G_PARAM_STATIC_STRINGS to save a few bytes and strdups 2010-06-18 20:02:49 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix locking after moving things around 2010-06-18 14:13:58 -0300 Thiago Santos * ext/taglib/gstapev2mux.cc: taglib: Use newly added gst_tag_list_peek_string_index Replace calls to gst_tag_list_get_string_index with gst_tag_list_peek_string_index to avoid a string copy 2010-06-18 16:56:19 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: make some errors as warnings Avoid spamming the testsuite with these error debug lines. 2010-06-18 16:49:08 +0200 Keith Nicholson * gst/udp/gstudpsrc.c: udpsrc: fix multicast support on windows builds On windows builds, sets source address for bind to INADDR_ANY, while maintaining the original multicast group address for subsequent join. Fixes #595978 2010-06-18 16:16:28 +0200 Wim Taymans * gst/udp/gstudpnetutils.c: udp: make url parsing compatible with VLC syntax Skip everything before the @ sign in the url location. VLC uses that as the remote address to connect to (but we ignore it for now). This makes our udp urls compatible with the ones used by VLC. Fixes #597695 2010-06-18 15:08:21 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: factor out the connections Keep a global connection for aggregate control but also keep stream connections for non-aggregate control. Add some helper methods to connect/close/flush the connections. 2010-06-17 13:06:56 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: add non-aggregate control Add non-aggregate control. Separate retrieving thr SDP from parsing and setting up the streaming from the SDP. 2010-06-17 22:10:03 +0100 Zaheer Abbas Merali * common: common: update common back to what it was 2010-06-17 17:24:22 +0100 Zaheer Abbas Merali * common: * gst/flv/gstflvmux.c: flvmux: add documentation for streamable property 2010-06-17 16:43:44 +0100 Tim-Philipp Müller * common: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: docs: update introspected plugin docs for gstdoc-scangobj and other changes Update common for latest gstdoc-scangobj, and inspect xml files for escaping and pad template order changes. 2010-06-17 16:41:56 +0100 Tim-Philipp Müller * tests/check/.gitignore: tests: ignore sub-directory with orc tests 2010-06-17 10:44:33 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Fix an uninitialized variable compiler warning 2010-06-16 21:02:13 +0200 Sebastian Dröge * gst/matroska/ebml-read.c: ebml-read: Zero-sized ints/uints/floats have a value of 0 according to the EBML spec 2010-06-16 20:02:58 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Fix possible NULL pointer dereference and assertion that could be caused by invalid files 2010-06-16 19:50:34 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Clean up/fix some minor error handling bugs 2010-06-16 19:30:25 +0200 Sebastian Dröge * sys/ximage/gstximagesrc.c: ximagesrc: Fix NULL pointer dereference when allocation of the ximage fails 2010-06-16 19:28:04 +0200 Sebastian Dröge * ext/flac/gstflactag.c: flactag: Fix possible NULL pointer dereference 2010-06-16 19:24:54 +0200 Sebastian Dröge * gst/audiofx/audioiirfilter.c: audioiirfilter: Fix possible NULL pointer dereference 2010-06-16 19:20:02 +0200 Sebastian Dröge * gst/effectv/gstwarp.c: warptv: Don't use floats as loop counters 2010-06-16 11:21:35 -0400 Havoc Pennington * sys/v4l2/gstv4l2object.c: v4l2src: do not try to change device format if it's already correct This allows set_caps to succeed if caps change in a way that would not modify the format we're getting from the hardware. Otherwise if not in NULL state, setting caps would fail with EBUSY. With this change, in some cases it's OK to go PLAYING->READY->PLAYING rather than PLAYING->NULL->PLAYING to avoid a time-consuming close and reopen of the device. Fixes #621723 2010-06-16 11:09:17 -0400 Havoc Pennington * sys/v4l2/gstv4l2src.c: v4l2src: in negotiate, check for error return from set_caps Fixes #621723 (partially) set_caps can fail if the video device is running, in that case setting its format leads to EBUSY. If set_caps fails then we will not have set up the buffer pool (it will be NULL) which leads to a crash when we try to pull buffers. If we fail the negotiate on set_caps failure, then we won't go to playing state and won't crash. This is a small improvement. Of course, a nicer fix would be to make set_caps work in the case where the format is unchanged. If the format has changed, failing is probably correct because we need to close the device (go to NULL state) in order to set caps. 2010-06-16 15:40:34 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: improve audio vbr detection Subsequent entry time calculations use blockalign value to determine number of frames per chunk, and blockalign == 1 is then most unlikely to result in reasonable values (which also aligns with "spec"). 2010-06-16 15:52:57 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: tweak DELTA_UNIT labeling Consider SPS, PPS and IDR as keyframe, all others as DELTA_UNIT. See #620154. 2010-06-15 20:06:17 +0200 Sebastian Dröge * ext/wavpack/gstwavpackdec.c: wavpackdec: Initialize uninitialized variable and don't unref it if it's NULL 2010-06-15 20:04:35 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Assign variables before printing them 2010-06-15 20:00:28 +0200 Sebastian Dröge * gst/wavparse/gstwavparse.c: wavparse: Initialize uninitialized variable 2010-06-15 19:47:16 +0200 Sebastian Dröge * sys/v4l2/gstv4l2object.c: v4l2: Initialize variable 2010-06-15 19:45:36 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: flacenc: Fix NEWSEGMENT parsing logic and don't use uninitialized variables 2010-06-15 17:20:20 +0200 Edward Hervey * gst/matroska/ebml-read.c: matroska: Fix unitialized variable 2010-06-15 16:49:49 +0200 Edward Hervey * common: Automatic update of common submodule From 9339ccc to 35617c2 2010-06-15 16:54:04 +0300 Stefan Kost * common: Automatic update of common submodule From 5adb1ca to 9339ccc 2010-06-15 16:35:18 +0300 Stefan Kost * common: Automatic update of common submodule From 57c89b7 to 5adb1ca 2010-06-15 14:08:26 +0100 Tim-Philipp Müller * .gitignore: .gitignore: ignore generated tvtime.h file 2010-06-15 15:36:33 +0300 Stefan Kost * common: Automatic update of common submodule From c804988 to 57c89b7 2010-05-17 13:54:03 +0200 Marc-André Lureau * ext/raw1394/gst1394clock.c: * ext/raw1394/gst1394clock.h: raw1394: remove useless last_time It seems to me this code is useless: removing it. https://bugzilla.gnome.org/show_bug.cgi?id=618871 2010-06-14 19:21:22 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: respect aggregate control attributes when the SDP specifies an aggregate control url, use that for playback control. Fixes #619531 2010-06-14 15:36:00 +0200 Sebastian Dröge * gst/goom/gstgoom.c: goom: Call orc_init() before trying to get target flags 2010-06-14 15:35:08 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Call orc_init() before trying to get target flags 2010-06-14 14:26:22 +0100 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: * tests/check/elements/matroskamux.c: matroskamux: revert change that set a reserved flag on the Block. So matroska's Block structure has no keyframe flag, only the SimpleBlock has it. To detect keyframes in Blocks, it is just the BlockGroup container that needs to have a ReferenceBlock attached if it is a delta frame in video. 2010-05-31 12:45:01 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: use libjpeg scatter-gather operation to avoid data copying Fixes #583047 (more). 2010-05-27 15:45:23 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: optimize buffer handling when parsing Use an adapter to collect incoming data, and use adapter API to scan and peek. Fixes #583047. 2010-06-14 13:48:28 +0200 Sebastian Dröge * sys/oss4/oss4-mixer.c: oss4: Use g_ascii_strcasecmp() instead of the deprecated g_strcasecmp() 2010-06-14 13:27:30 +0200 Sebastian Dröge * configure.ac: configure: Use GLIB_EXTRA_CFLAGS 2010-06-14 13:03:57 +0200 Sebastian Dröge * common: Automatic update of common submodule From 7a0fdf5 to c804988 2010-06-14 11:46:32 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: also consider AU and SEI NALUs as DELTA_UNIT Fixes #620154. 2010-06-14 11:32:43 +0200 Sebastian Dröge * common: Automatic update of common submodule From 6da3bab to 7a0fdf5 2010-06-12 21:26:16 +0300 Stefan Kost * gst/rtp/gstrtpmparobustdepay.c: build: include stdio.h for sscanf 2010-06-12 14:12:50 +0200 Sebastian Dröge * tests/check/Makefile.am: tests: Add clean rule for the orc tests 2010-06-12 14:12:04 +0200 Sebastian Dröge * tests/check/Makefile.am: tests: Add autogenerated orc tests 2010-06-12 08:27:42 +0200 Sebastian Dröge * common: Automatic update of common submodule From 733fca9 to 6da3bab 2010-06-11 16:23:29 -0700 David Schleef * sys/v4l2/gstv4l2src.c: v4l2src: Fix element description 2010-06-11 21:13:59 +0100 Tim-Philipp Müller * gst/rtp/gstrtpmparobustdepay.c: rtpmparobustdepay: don't try to unref NULL buffers Fixes generic/states unit test. 2010-06-11 20:50:23 +0100 Tim-Philipp Müller * gst/wavparse/gstwavparse.c: wavparse: use typefind functions to check if PCM data contains dts stream Use new dts audio typefinder from -base to check if the PCM data contains a dts stream. This way we recognise more varieties more reliably and also detect the dts stream if there isn't a frame sync right at the start of the data. Fixes #413942. 2010-06-11 20:47:22 +0100 Tim-Philipp Müller * gst/wavparse/gstwavparse.c: wavparse: set buffer offsets before using the buffer for the first time gst_type_find_helper_for_buffer() will need the correct offset set on the buffer (ie. 0) and not the byte offset we started pulling the data from. 2010-06-10 16:14:43 +0200 Mark Nauwelaerts * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpmparobustdepay.c: * gst/rtp/gstrtpmparobustdepay.h: rtp: add mpa-robust depayloader Fixes #589997. 2010-06-11 10:57:41 +0200 Mark Nauwelaerts * gst/avi/gstavimux.c: avimux: fix avi header bytewriting ... by using proper offsets for tag list writing. Also use _reset rather than _free and consistently use bytewriter position. See #619293. 2010-06-10 22:58:41 +0200 Sebastian Dröge * .gitignore: Update .gitignore Add the generated orc source files 2010-06-10 22:55:17 +0200 Sebastian Dröge * tests/check/elements/matroskamux.c: matroskamux: Fix unit test for changed key-frame behaviour All audio frames are marked as keyframe now instead of marking them all as delta unit... 2010-06-10 22:45:13 +0200 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/blend.c: * gst/videomixer/blend_mmx.h: * gst/videomixer/blendorc-dist.c: * gst/videomixer/blendorc-dist.h: * gst/videomixer/blendorc.orc: videomixer: Port most blending related functions to orc Only remaining MMX implementation is the ARGB/BGRA/AYUV blending for which we first need the orc compositing opcodes. 2010-06-10 20:17:07 +0200 Sebastian Dröge * gst/videomixer/blend_mmx.h: videomixer: Replace some tabs by spaces 2010-06-10 11:04:38 +0100 Andoni Morales Alastruey * ext/raw1394/gst1394clock.c: dv1394: Fix the internal clock even more The cycleCount register is 13 bits long and the cycleOffset one is 12 bits long. To read the cycleCount register we need to shift 12 bits and not 13. Fixes #615461 2010-06-09 18:37:29 -0700 David Schleef * configure.ac: configure: use m4 macro to check for Orc 2010-06-09 22:40:23 +0200 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: matroskamux: some non-delta buffers were not marked as keyframes 2010-06-09 22:00:16 +0200 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: change 2 second limit per cluster Start cluster at every keyframe or when we would overflow the previous cluster's relative timestamp field. This would avoid as much as possible starting clusters at non-keyframes. 2010-06-09 12:40:09 -0700 David Schleef * common: Automatic update of common submodule From fad145b to 733fca9 2010-06-09 12:34:01 -0700 David Schleef * common: Automatic update of common submodule From 47683c1 to fad145b 2010-06-09 20:53:06 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Don't request more shared memory than needed 2010-06-09 20:45:04 +0200 Sebastian Dröge * ext/gconf/gstswitchsink.c: switchsink: Set the GST_ELEMENT_IS_SINK flag on the sink 2010-06-09 20:43:50 +0200 Sebastian Dröge * ext/gconf/gstgconfvideosink.c: * ext/gconf/gstgconfvideosink.h: gconfvideosink: Use GstSwitchSink as base class 2010-06-09 20:30:31 +0200 Sebastian Dröge * ext/gconf/gstgconfaudiosink.c: gconfaudiosink: Use G_PARAM_STATIC_STRINGS 2010-06-09 20:29:02 +0200 Sebastian Dröge * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfaudiosink.h: gconfaudiosink: Rename instance variable to be more descriptive 2010-06-09 20:22:30 +0200 Sebastian Dröge * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautovideosink.c: auto{audio,video}sink: Don't lose the GST_ELEMENT_IS_SINK flag after removing the child 2010-06-09 20:07:09 +0200 Julien Moutte * sys/directsound/gstdirectsoundsink.c: directsoundsink: Plug some memleak and support 22050Hz mono sound. Segment size needs to be a multiple of the sample size in bytes. 2010-06-09 16:22:27 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Flush shm buffer immediately if it's full 2010-06-09 16:21:55 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Fix writing of buffers larger than segsize Fixes bug #620540. 2010-06-09 15:42:37 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Fix playback if PA doesn't give us a large enough shared memory buffer 2010-06-09 15:42:19 +0200 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: change indexed property to streamable The property streamable has reverse semantics to indexed. 2010-06-09 09:13:09 -0300 Thiago Santos * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: Rename unreleased property 'indexed' to 'streamable' Rename 'indexed' to 'streamable' for a better name while it hasn't been released 2010-06-08 15:23:51 -0700 David Schleef * REQUIREMENTS: * configure.ac: configure: remove liboil check 2010-06-08 14:44:19 -0700 David Schleef * gst/level/gstlevel.c: level: remove unused liboil include 2010-06-04 18:22:42 -0700 David Schleef * gst/videomixer/Makefile.am: * gst/videomixer/blend.c: videomixer: liboil to orc conversion 2010-06-04 18:21:21 -0700 David Schleef * gst/videobox/Makefile.am: * gst/videobox/gstvideobox.c: * gst/videobox/gstvideoboxorc-dist.c: * gst/videobox/gstvideoboxorc-dist.h: * gst/videobox/gstvideoboxorc.orc: videobox: liboil to orc conversion 2010-06-04 18:16:25 -0700 David Schleef * gst/goom/Makefile.am: * gst/goom/README: * gst/goom/gstgoom.c: * gst/goom/plugin_info.c: goom: liboil to orc conversion 2010-06-08 16:04:23 -0700 David Schleef * gst/deinterlace/Makefile.am: * gst/deinterlace/tvtime-dist.c: * gst/deinterlace/tvtime-dist.h: * gst/deinterlace/tvtime.orc: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/vfir.c: deinterlace: orcify some deinterlacing methods 2010-06-08 16:03:36 -0700 David Schleef * gst/deinterlace/Makefile.am: * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: convert from liboil to orc 2010-06-08 15:23:28 -0700 David Schleef * REQUIREMENTS: * configure.ac: configure: Add orc check 2010-06-08 14:09:00 +0200 Zaheer Abbas Merali * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: Add indexed property to replace disabled is-live. Add indexed property to be the negation of what the disabled is-live property was. Fixes bug #613066. 2010-06-08 09:22:30 +0200 Sebastian Dröge * configure.ac: raw1394: Require libraw1394 >= 2.0.0 for raw1394_read_cycle_timer Fixes bug #620929. 2010-06-08 07:35:00 +0200 Sebastian Dröge * ext/annodex/gstcmmlenc.c: cmmlenc: Remove hack to let oggmux start a new page for every CMML buffer oggmux does this for CMML by its own now 2010-06-07 18:32:16 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: flvdemux: Don't handle non-TIME seeks Don't send them upstream because for upstream a BYTES seek might make sense but is completely wrong because upstream can't seek to a byte position of the audio or video stream. Also don't build the index in push mode for non-TIME seeks, things will go wrong here otherwise. 2010-06-02 19:16:20 +0100 Sjoerd Simons * gst/rtp/gstrtph264pay.c: Cope with short startcodes in the h264 bytestream 2010-06-06 17:25:16 +0100 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulse: log message printf format fixes 2010-06-06 18:00:22 +0200 Sebastian Dröge * ext/dv/gstdvdemux.c: * ext/pulse/pulsemixer.c: * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: * ext/speex/gstspeexenc.c: * ext/taglib/gsttaglibmux.c: * ext/wavpack/gstwavpackdec.c: * ext/wavpack/gstwavpackenc.c: * ext/wavpack/gstwavpackparse.c: ext: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs 2010-06-06 17:57:03 +0200 Sebastian Dröge * sys/directsound/gstdirectsoundsink.c: * sys/oss/gstossdmabuffer.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxaudio/gstosxringbuffer.c: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosrc.c: * sys/waveform/gstwaveformsink.c: sys: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs 2010-06-06 17:52:40 +0200 Sebastian Dröge * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: * gst/debugutils/breakmydata.c: * gst/debugutils/gsttaginject.c: * gst/debugutils/rndbuffersize.c: * gst/debugutils/testplugin.c: * gst/flv/gstflvdemux.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/videofilter/gstvideobalance.c: * gst/videomixer/videomixer.c: gst: Don't use GST_DEBUG_FUNCPTR for GObject vfuncs 2010-06-06 15:12:16 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: refactor delta unit handling This allows us to skip delta units earlier and is a bit clearer in my opinion. It also makes only video buffers ever be delta units, not just for SimpleBlock as before. 2010-06-06 15:17:00 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: flvdemux: Clear adapter on discontinuities 2010-06-06 14:03:53 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: Ignore keyframe flag for non-video streams When the keyframe bit of SimpleBlock Flags wasn't set, the buffer was being marked with GST_BUFFER_FLAG_DELTA_UNIT, causing all buffers to be skipped after a seek. This may be a problem with the Sorenson Squish encoder, but arguably the keyframe bit should only be applied to video. Fixes bug #620358. 2010-06-06 14:56:52 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: flvdemux: First try upstream when handling seek events/queries 2010-06-04 14:54:59 -0400 Tristan Matthews * gst/rtp/gstrtpceltpay.c: gstrtpceltpay: don't always fixate sink caps to 1 channel The getcaps function should not fixate the channels field until we get the encoding-params field from our srcpad's caps. Fixes #620591 2010-06-04 13:57:28 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtsp: try all ranges from the sdp Try all ranges in the SDP before giving up. 2010-06-04 13:56:07 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: make parse_range return result Make the parse_range function return if the parsing succeeded or failed. 2010-06-04 11:44:09 +0200 Edward Hervey * gst/videomixer/videomixer.c: videomixer: if we're not linked downstream, we can do any format Stupid me, assuming _get_allowed_caps() would actually return the pad templates if there was no peer. 2010-05-31 16:26:19 +0100 Sjoerd Simons * gst/rtp/gstrtptheorapay.c: Keep announcing the delivery-method in the capabilities Even though we don't use delivery-method in our payloader, older versions of the theora payloader in gstreamer required it. As such we need to keep this around in the caps for backwards-compatibility. This reverts part of 49463a37cbaa952e1401291f0a2623de6cab3880 Fixes #618940 2010-06-03 17:52:11 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: * sys/oss4/oss4-mixer.c: oss4: add some comments for translators to clarify meaning of "Low" "Low" etc. are quality settings here (e.g. for the internal resampler). Some day when we use GLib's i18n functions we might want to use NC_() and g_dpgettext2() here instead of the comments. Fixes #555967. 2010-06-03 19:23:01 +0200 Wim Taymans * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gdepay.h: mp4gdepay: calculate the frame duration correctly When we calculate the frame duration, we need to use the amount of frames in the _previous_ packet, not the current packet. The frame duration is needed to correctly de-interleave interleaved streams. This fixes the case where there are a variable number of frames in a packet. Fixes #620494 2010-06-03 18:58:42 +0200 Edward Hervey * gst/videomixer/videomixer.c: videomixer: Don't return caps in get_caps() that will be rejected This commit basically puts _get_caps() in sync with accept_caps(). If we don't have a master pad OR the master pad caps aren't negotiated then we just return the downstream allowed caps. If we have a master pad with negotiated caps, we return those caps with a free range of width/height/framerate 2010-06-03 13:45:32 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: Revert "pulsesink: Add comments to remove the provide-clock message posting once we depend on base 0.10.30" This reverts commit 8f3708f38aa3839a6a625ca7d1c166101c9fbb7f. The baseaudiosink commit was reverted 2010-06-03 10:27:25 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Add comments to remove the provide-clock message posting once we depend on base 0.10.30 baseaudiosink does all this for us now. 2010-06-02 16:36:11 +0200 Mark Nauwelaerts * gst/flv/gstflvdemux.c: flvdemux: delayed seek handling also deserves TRUE event response 2010-06-02 15:30:47 +0200 Thijs Vermeir * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: fix compiler warning unused variable ‘estimated’ 2010-06-02 15:04:00 +0200 Alessandro Decina * common: common: revert the change i did in my previous commit 2010-06-02 13:39:10 +0200 Alessandro Decina * common: * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: stop buffering and emit EOS at the end of a stream When using RTP_JITTER_BUFFER_MODE_BUFFER, make sure that the ringbuffer doesn't get stuck buffering forever when there isn't enough data left to fill the buffer. 2010-06-01 21:52:59 +0200 Benjamin Otte * gst/debugutils/testplugin.c: debugutils: Don't consume preroll buffer twice 2010-06-01 21:32:11 +0200 Benjamin Otte * ext/pulse/pulseutil.c: pulse: Style fix: use g_strdup() instead of printf()ing a simple string 2010-05-27 16:07:31 +0200 Benjamin Otte * gst/debugutils/tests.c: debugutils: Replace md5 implementation with glib's https://bugzilla.gnome.org/show_bug.cgi?id=619824 2010-05-22 11:55:37 +0200 Mark Nauwelaerts * gst/avi/gstavimux.c: avimux: clean up code for avi header using a bytewriter https://bugzilla.gnome.org/show_bug.cgi?id=619293 2010-06-01 18:54:41 -0500 Pierre-Louis Bossart * configure.ac: * ext/pulse/pulsesink.c: pulsesink: optimize communication with PulseAudio using pa_stream_begin_write 2010-06-02 10:52:56 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Post provide-clock message on the bus if the clock appears/disappears Fixes bug #620277. 2010-06-01 23:49:17 -0700 David Schleef * common: Automatic update of common submodule From 17f89e5 to 47683c1 2010-06-01 22:54:49 -0700 David Schleef * common: Automatic update of common submodule From cdff0fb to 17f89e5 2010-06-01 20:45:29 +0200 Edward Hervey * gst/videomixer/videomixer.c: videomixer: filter caps returned from downstream with our pad template. 2010-06-01 16:56:32 +0100 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: matroskamux: Remove more unneeded warnings 2010-06-01 16:54:03 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: matroskamux: remove unneeded warning 2010-06-01 16:49:14 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: matroskamux: remove unneeded debug statement 2010-06-01 16:24:53 +0100 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: change is-live property to indexed 2010-05-23 13:56:16 +0100 Zaheer Abbas Merali * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: matroska: use the uint64 scaling functions In demuxer and muxer use the gst_util_uint64 scaling functions rather than standard integer division. Add warnings (to be changed to debug) for debugging the timestamp and duration. 2010-05-21 14:35:34 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: matroskamux: set delta unit on all buffers except cluster start ones 2010-05-21 13:38:11 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: matroskamux: store caps and set on buffers rather than using pad caps 2010-05-21 13:25:24 +0100 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: matroskamux: make sure pads caps are set before any buffers pushed. 2010-05-21 13:14:04 +0100 Zaheer Abbas Merali * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: matroskamux: add streamheaders 2010-05-21 12:23:08 +0100 Zaheer Abbas Merali * gst/matroska/matroska-mux.c: matroskamux: no need to set cache twice 2010-05-21 01:59:53 +0200 Xavier Queralt * gst/matroska/matroska-mux.c: Do not create a SeekHeader, Cues, .. when doing live 2010-05-20 23:39:59 +0200 Xavier Queralt * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: Add is-live property 2010-06-01 13:22:26 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: fix variable init 2010-05-28 16:37:32 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.h: matroskademux: improve reverse playback Slightly modify approach to also handle cases where cue entries do not reliably lead to initial keyframes. Fixes #619817. 2010-05-24 16:02:58 +0200 Mark Nauwelaerts * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: avoid gtk-doc confusing comments 2010-05-21 11:21:58 +0200 Mark Nauwelaerts * tests/check/Makefile.am: * tests/check/elements/matroskamux.c: matroskamux: adjust unit test to modified behaviour 2010-05-20 14:33:41 +0200 Mark Nauwelaerts * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: matroskamux: use write caching also when writing buffer data Specifically, this reduces pushing several small buffers for each data buffer and also avoids a seek for each buffer altogether (though a seek is still needed for each cluster). Fixes #619273. 2010-05-20 14:23:07 +0200 Mark Nauwelaerts * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: matroskamux: fix ebml write caching with bytewriter implementation Also cache a bit more during header writing. Fixes #619273. 2010-05-20 14:08:42 +0200 Mark Nauwelaerts * gst/matroska/ebml-write.c: matroskamux: use consistent debug category name for ebmlwrite 2010-05-18 14:44:15 +0200 Mark Nauwelaerts * gst/matroska/ebml-read.c: * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: use bytereader based GstEbmlRead as a helper ... rather than basing on it by inheritance. Also use more common code for push and pull mode. Fixes #619198. Fixes #611117. 2010-06-01 15:47:32 +0200 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: _get_pad_template result needs no unref 2010-05-18 19:42:58 -0300 Thiago Santos * ext/libpng/gstpngenc.c: pngenc: Support 8 bit grayscale Adds support to 8 bit grayscale input 2010-05-18 14:46:54 -0300 Thiago Santos * ext/jpeg/gstjpegdec.c: jpegdec: Adds 8bit grayscale support Adds decoding support for jpeg images in 8 bit grayscale format. 2010-05-18 01:57:14 -0300 Thiago Santos * ext/jpeg/gstjpegenc.c: jpegenc: Accept grayscale as input Adds video/x-raw-grayscale (8 bit) support to jpegenc 2010-05-31 13:30:05 +0200 Edward Hervey * gst/videomixer/videomixer.c: videomixer: Implement sinkpad GetCapsFunction. This allows returning only the formats, width, height, framerate and pixel-aspect-ratio that downstream can support. https://bugzilla.gnome.org/show_bug.cgi?id=620148 2010-05-31 07:49:21 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Don't compare running times with stream times when doing QoS 2010-05-27 21:06:43 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Don't reconfigure the caps when changing properties Fixes bug #619848. 2010-05-26 13:13:44 +0200 Sebastian Dröge * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Add property to allow passthrough mode This passthrough mode is used if the alpha method is "set" and the alpha value is 1.0. Fixes bug #617512. 2010-05-25 15:16:06 +1000 Alexander Kojevnikov * gst/spectrum/gstspectrum.c: spectrum: support 24-bit width Fixes #619045 2010-05-24 21:50:58 +1000 Alexander Kojevnikov * gst/spectrum/gstspectrum.c: spectrum: support arbitrary bit depth Partially fixes #619045 2010-05-25 05:36:46 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: fix deadlock introduced by video keyframe QoS 2010-05-23 09:32:08 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.c: * gst/matroska/matroska-ids.h: matroskademux: skip buffers before a late keyframe (QoS) Before, vp8dec had no option but to decode all frames even if some/all of them would be late. With this change, performance when keyframes are frequent is helped a great deal. On my Thinkpad X60s, decoding a 20 s 1080p sunflower encode with keyframes every 10 frames went from taking 42 s with 5 frames shown to 21 s with 15 frames shown (still slow enough to count by hand). When keyframes are more sparse, you will still be able to catch up eventually, but the results won't be as noticable. 2010-05-14 17:57:59 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: * gst/videomixer/videomixerpad.h: videomixer: Don't mix input with different pixel aspect ratios Fixes bug #618530. 2010-05-17 19:54:22 +0200 Sebastian Dröge * gst/deinterlace/tvtime/greedyh.asm: * gst/deinterlace/tvtime/greedyh.c: deinterlace: Add MMX/3DNow implementations of greedyh for UYVY 2010-05-17 19:16:43 +0200 Sebastian Dröge * gst/deinterlace/tvtime/greedyh.c: deinterlace: Fix UYVY implementation of greedyh to be actually used 2010-05-11 11:43:07 +0200 Sebastian Dröge * configure.ac: * ext/Makefile.am: * ext/gdk_pixbuf/Makefile.am: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/gstgdkpixbufsink.c: * ext/gdk_pixbuf/pixbufscale.c: gdkpixbuf: Add a gdkpixbuf3 plugin that uses gdkpixbuf3 2010-06-01 10:06:10 +0100 Tim-Philipp Müller * Makefile.am: * common: * win32/common/gstrtpbin-marshal.c: * win32/common/gstrtpbin-marshal.h: * win32/common/gstudp-enumtypes.c: * win32/common/gstudp-marshal.c: * win32/common/gstudp-marshal.h: win32: add more generated marshal and enumtype files to win32-update 2010-06-01 09:27:00 +0100 Tim-Philipp Müller * gst/matroska/matroska.c: Revert "matroska: add temporary webm typefinder" This reverts commit d148ec0ad2053abb0c38fc681a8953292985388f. We depend on -base git now, which has a webm typefinder in the usual place. 2010-06-01 09:26:11 +0100 Tim-Philipp Müller * gst/avi/gstavimux.c: * gst/flv/gstflvmux.c: * gst/matroska/matroska-mux.c: Revert "avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time" This reverts commit 6a9983cd20c48b96396229b3f94d0254a05ddf48. Rely on locking done in GstTagSetter in core git. 2010-06-01 09:23:18 +0100 Tim-Philipp Müller * configure.ac: configure: require core/base git For WebM typefinding and GstTagsetter fixes. 2010-06-01 09:17:52 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development === release 0.10.23 === 2010-05-30 14:03:53 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.23 2010-05-30 14:02:04 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2010-05-29 10:23:48 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: flvdemux: Fix position query 2010-05-28 15:14:07 +0100 Tim-Philipp Müller * gst/matroska/webm-mux.c: docs: remove unnecessary videorate element from webmmux example pipeline 2010-05-28 10:43:36 -0300 Thiago Santos * ext/jpeg/gstjpegenc.c: jpegenc: Keep variables in sane state after _reset When reseting, keep 'row' variables at a sane state after freeing to avoid it being freed again on _resync realloc when the element is reused. Fixes #619943 2010-05-27 18:08:17 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix floating point to integer conversion for the alpha values Fixes bug #619835. 2010-05-26 08:54:33 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.22.3 pre-release 2010-05-26 00:33:59 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update translations 2010-05-25 15:34:11 +0200 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: wavparse: handle truncated input data at EOS in pull mode Fixes #617733. 2010-05-26 11:55:13 +0100 Tim-Philipp Müller * common: Automatic update of common submodule From 357b0db to fd7ca04 2010-05-25 21:14:05 +0200 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Round timestamp up when scaling to mov format Fix timestamp rounding to allow the correct index to be located. The issue was that scaling from GStreamer time format to mov time format was rounding down causing the timestamp of the newsegment event received after a flushing keyframe seek to find the sample index before the one it should causing further backward seeking to the keyframe prior until no rounding error occurred. Rounding up when scaling to mov format has the desired effect, and it is not clear whether just the _round () variant would be sufficient. Fixes bug #619105 2010-05-24 17:26:42 +0100 Tim-Philipp Müller * gst/avi/gstavimux.c: * gst/flv/gstflvmux.c: * gst/matroska/matroska-mux.c: avimux, flvmux, matroskamux: don't crash if tags arrive on multiple input pads at the same time This is a temporary fix for the release only. Fixes #619533. 2010-05-25 17:05:12 +0200 Wim Taymans * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: rtptheora: remove delivery-method from caps We can accept all delivery methods so don't advertise anything on the caps or parse anything, we will handle whatever we receive. Fixes #618940 2010-05-25 15:40:01 +0100 Tim-Philipp Müller * gst/matroska/matroska.c: matroska: add temporary webm typefinder Add webm typefinder just for the release, so webm works for people whose distros don't patch gst-plugins-base as well. We'll remove this again after the release. 2010-05-23 11:17:27 +0100 Tim-Philipp Müller * gst/matroska/webm-mux.c: docs: add some pipeline examples to webmmux docs 2010-05-21 12:27:07 +0100 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-imagefreeze.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-oss4.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: add webmmux to docs 2010-05-21 13:01:30 +0100 Tim-Philipp Müller * docs/plugins/inspect/plugin-matroska.xml: * gst/matroska/matroska-demux.c: * gst/matroska/matroska.c: * gst/matroska/webm-mux.c: matroska: fix up plugin and element descriptions a bit 2010-05-21 12:47:03 +0100 Tim-Philipp Müller * gst/matroska/Makefile.am: * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: * gst/matroska/matroska.c: * gst/matroska/webm-mux.c: * gst/matroska/webm-mux.h: matroska: move webmmux into own source files Makes things easier for gtk-doc. 2010-05-21 12:26:05 +0500 Christian Schaller * gst-plugins-good.spec.in: Update spec file with latest changes 2010-05-20 20:01:58 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: matroska: Remove the doctype enum, it's not needed anymore 2010-05-20 19:57:14 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: webmmux: Add new webmmux element that only supports muxing of WebM ...and remove the doctype property from matroskamux again. 2010-05-20 17:31:59 +0200 Mark Nauwelaerts * tests/check/elements/matroskamux.c: matroskamux: unit test checks version 1 files 2010-05-18 15:27:06 -0400 Tristan Matthews * ext/speex/gstspeexenc.c: speex: fix latency query Speex should report 30 ms latency for narrowband mode, 34 otherwise. Fixes #619018 2010-05-18 21:04:32 +0800 Philip * gst/matroska/ebml-read.c: ebmlread: rm floatcast.h include (not used) 2010-05-17 05:36:00 +0200 Philip Jägenstedt * gst/matroska/matroska-mux.c: matroskamux: bump default doctype version to 2 In this day and age this should be safe. There's otherwise a risk people will be creating unneccessarily big WebM files as they can't use SimpleBlock in v1. 2010-05-17 05:27:44 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: matroska: handle matroska and webm doctype versions equally The original plan was to let WebM v1 be the same as Matroska v2 (with extra constraints), but for simplicity it was decided to handle the versions equally, such that e.g. SimpleBlock is only allowed in WebM v2. 2010-05-13 12:10:54 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: Verify lace size in _parse_blockgroup_or_simpleblock Failure to do this for corrupt input can cause a subbuffer bigger than the actual buffer to be created, quickly leading to segfault. Test case: bug_s222005751_r0.001____memcpy.webm 2010-05-13 10:23:10 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: ebml: crude hack to avoid crashing on unexpected metadata The comment says this cannot happen, but it did and I don't know why. This is not the correct fix, needs investigation. Test case: bug_s555010094_r0.0005:0.008____IA__g_assertion_message_expr.webm 2010-05-13 09:18:56 +0200 Philip Jägenstedt * gst/matroska/ebml-read.c: ebml: don't modify out str if returning an error in _read_ascii This is a regression from ASCII validation changes. Test case: bug_s66876390_r0.001____malloc_printerr.webm 2010-05-12 13:16:28 +0200 Philip Jägenstedt * gst/matroska/ebml-read.c: ebml: Validate 7-bit ASCII in gst_ebml_read_ascii This was triggering an UTF-8 assertion in gst_caps_set_simple for corrupt files with garbage as codec id. Test case: gstreamer_error_trying_to_set_invalid_utf8_as_codec_id.webm Old gst_ebml_read_ascii renamed to gst_ebml_read_string, also used by gst_ebml_read_utf8. Unlike for UTF-8, failure to validate is an error, as gst_ebml_read_ascii is used for reading doctype and codec id and we might just as well give up early in those cases. 2010-05-12 14:30:18 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: Ignore unexpected CodecState Because GstMatroskaTrackContext *stream is set up in the first SimpleBlock or Block, a rogue CodecState otherwise causes a segfault on derefencing the NULL pointer. Test case: bug_s5506167_r0.001____gst_matroska_demux_parse_blockgroup_or_simpleblock.webm 2010-05-10 06:00:49 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: Add video/webm sink caps 2010-05-09 19:46:51 +0200 Philip Jägenstedt * gst/matroska/matroska-mux.c: matroskamux: Use SimpleBlock for WebM when possible 2010-05-09 19:28:59 +0200 Philip Jägenstedt * gst/matroska/matroska-demux.c: matroskademux: Support "webm" DocType 2010-05-09 12:35:10 +0200 Philip Jägenstedt * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: rename matroska_version to doctype_version 2010-05-09 12:09:57 +0200 Philip Jägenstedt * gst/matroska/matroska-ids.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: Support "webm" DocType 2010-05-12 18:38:48 -0700 David Schleef * gst/qtdemux/qtdemux.c: qtdemux: Add VP8 2010-04-27 15:26:13 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: matroskamux: Add support for On2 VP8 ...matroskademux automatically supports it through libgstriff. 2010-04-27 15:25:32 +0200 Sebastian Dröge * gst/avi/gstavimux.c: avimux: Add support for On2 VP8 ...avidemux automatically supports it through libgstriff. 2010-05-17 17:17:01 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: pulse: Don't lock the mainloop in NULL 2010-05-15 21:15:52 +0200 Sebastian Dröge * configure.ac: configure: Use = instead of == in shell scripts for equality checks 2010-05-14 18:33:32 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.22.2 pre-release 2010-05-14 18:24:14 +0100 Tim-Philipp Müller * common: Automatic update of common submodule From 4d67bd6 to 357b0db 2010-05-14 18:16:45 +0100 Tim-Philipp Müller * tests/check/elements/souphttpsrc.c: tests: fix leak in souphttpsrc unit test Unref server objects when done. Fixes check-valgrind. 2010-05-14 17:30:40 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegenc.c: jpegenc: fix two leaks Don't leak othercaps or jpegenc ref. 2010-05-13 13:01:26 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: fix docs Documentation error spotted by tony Fixes #618419 2010-05-11 13:18:42 -0400 Olivier Crête * gst/rtp/gstrtptheoradepay.c: rtptheoradepay: make delivery-method parameter optional It probably will not be in the final RFC as it is not in RFC 5215 for Vorbis. If there is a configuration specified, assume it is in-line and if nothing is specified, assume it is in-band. https://bugzilla.gnome.org/show_bug.cgi?id=618386 2010-05-13 12:16:59 +0200 Wim Taymans * ext/jpeg/gstjpegdec.c: jpegdec: increase acceptable output sizes We can perfectly decode 1x1 images so lower the min width and height to 1. Fixes #618392 2010-05-13 11:30:27 +0200 Wim Taymans * gst/rtp/gstrtpceltpay.c: celtpay: fix queue duration calculations Don't blindly add the durations of incomming buffers to the total queued duration because it might be invalid. Mark the total queued duration invalid when we receive an invalid incomming timestamp because that's when we lose track of the total queued duration. Fixes #618324 2010-05-10 11:14:39 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264pay.c: rtph264pay: extract SPS and PPS from property provided parameter set ... so it can also be regularly inserted into the stream if so configured. Fixes #617164. 2010-05-11 22:28:08 +0200 Alessandro Decina * sys/osxvideo/osxvideosink.m: osxvideosink: allow switching views at runtime. 2010-05-11 20:26:37 +0100 Tim-Philipp Müller * gst/rtp/Makefile.am: rtp: dist missing header file to fix make distcheck 2010-05-11 19:05:08 +0100 Tim-Philipp Müller * sys/oss4/oss4-sink.c: oss4: minor cleanup Remove fixed FIXME, change finalise to finalize for consistency. 2010-05-11 19:01:51 +0100 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-oss4.xml: docs: add oss4 elements to docs 2010-05-11 16:09:10 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/ky.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: move oss4 strings from -bad to -good 2010-05-11 16:08:21 +0100 Tim-Philipp Müller * configure.ac: * gst-plugins-good.spec.in: * po/POTFILES.in: * sys/Makefile.am: * tests/icles/.gitignore: * tests/icles/Makefile.am: Move oss4 plugin from -bad to -good Hook up build infrastructure, docs and tests. Fixes #614305. 2010-04-29 13:18:58 +0100 Brian Cameron * sys/oss4/oss4-sink.c: * sys/oss4/oss4-sink.h: oss4sink: implement GstStreamVolume interface and add mute and volume properties OSS4 supports per-stream volume control, so expose this using the right API, so that playbin2 and applications like totem can make use of it (instead of using a volume element for volume control). Fixes #614305. 2010-04-08 10:45:33 +0100 Tim-Philipp Müller * sys/oss4/oss4-audio.c: oss4: 8-bit PCM audio caps don't need an endianness field 2010-04-08 10:40:02 +0100 Tim-Philipp Müller * sys/oss4/oss4-audio.c: oss4: don't iterate the formats table twice for each entry When iterating the formats table, we can just pass the whole entry to our helper function, which avoids iterating the table again to find the entry structure from the passed format id. 2010-03-30 11:43:04 +0100 Tim-Philipp Müller * sys/oss4/oss4-audio.c: oss4: also accept formats not natively supported Also accept formats that are not natively supported by the hardware, OSS4 can convert them internally. List the native formats first in the caps though, to express our preference for the native formats. We need this in order to support the case properly where the audio hardware supports only e.g. little endian PCM, but the host is big endian, since many audio elements only support native endianness and make the reasonable assumption that any audiosink will be able to handle audio in native endianness. Based on patch by Jerry Tan Fixes #614317. 2010-03-30 01:14:58 +0100 Tim-Philipp Müller * sys/oss4/oss4-mixer.c: oss4: add comment for translators Not that that will make these strings much better. Also remove i18n marker where it doesn't make sense. 2010-03-22 16:13:12 +0100 Benjamin Otte * sys/oss4/oss4-mixer.c: oss4: Refactor code to make it look more modern A side effect is that it passes -Wformat-nonliteral and doesn't read invalid memory in some cases, like when the mixer track contains a % sign or there is a number but not a known mixer name. 2010-03-22 14:09:24 +0100 Benjamin Otte * sys/oss4/oss4-mixer.c: oss4: Avoid g_quark_to_string (g_quark_from_string ()) madness We to the strdup inside gst_oss4_mixer_control_get_translated_name() instead of in the only caller. 2010-03-21 21:39:18 +0100 Benjamin Otte * sys/oss4/oss4-mixer.c: Add -Wmissing-declarations -Wmissing-prototypes to configure flags And fix all warnings 2010-01-20 13:29:52 +0100 Benjamin Otte * sys/oss4/oss4-mixer.c: Fix compiler warning about unused return value 2009-08-21 01:17:18 +0100 Tim-Philipp Müller * tests/icles/test-oss4.c: tests: fix test-oss4 to treat an empty device name the same as a NULL name 2009-07-16 13:55:14 +0100 Jan Schmidt * sys/oss4/oss4-mixer.c: oss4: Attempt to fix a compiler warning Don't store a const gchar * in a non-const gchar * local var. Also, make the translation string function static since it's only used in the one file. 2009-06-10 19:21:21 +0100 Garrett D'Amore * sys/oss4/oss4-audio.c: * sys/oss4/oss4-mixer-slider.c: * sys/oss4/oss4-mixer-switch.c: * sys/oss4/oss4-mixer.c: oss4: Enhancements to the mixer and audio output Code cleanups, general improvements, support for the new mixer flags in latest gst-plugins-base. Fixes: #584252 Patch By: Brian Cameron Patch By: Garrett D'Amore 2009-06-19 16:21:28 +0100 Tim-Philipp Müller * sys/oss4/oss4-mixer.c: Make build without warnings with debugging disabled 2008-11-04 12:42:30 +0000 Stefan Kost Don't install static libs for plugins. Fixes #550851 for -bad. Original commit message from CVS: * ext/alsaspdif/Makefile.am: * ext/amrwb/Makefile.am: * ext/apexsink/Makefile.am: * ext/arts/Makefile.am: * ext/artsd/Makefile.am: * ext/audiofile/Makefile.am: * ext/audioresample/Makefile.am: * ext/bz2/Makefile.am: * ext/cdaudio/Makefile.am: * ext/celt/Makefile.am: * ext/dc1394/Makefile.am: * ext/dirac/Makefile.am: * ext/directfb/Makefile.am: * ext/divx/Makefile.am: * ext/dts/Makefile.am: * ext/faac/Makefile.am: * ext/faad/Makefile.am: * ext/gsm/Makefile.am: * ext/hermes/Makefile.am: * ext/ivorbis/Makefile.am: * ext/jack/Makefile.am: * ext/jp2k/Makefile.am: * ext/ladspa/Makefile.am: * ext/lcs/Makefile.am: * ext/libfame/Makefile.am: * ext/libmms/Makefile.am: * ext/metadata/Makefile.am: * ext/mpeg2enc/Makefile.am: * ext/mplex/Makefile.am: * ext/musepack/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/mythtv/Makefile.am: * ext/nas/Makefile.am: * ext/neon/Makefile.am: * ext/ofa/Makefile.am: * ext/polyp/Makefile.am: * ext/resindvd/Makefile.am: * ext/sdl/Makefile.am: * ext/shout/Makefile.am: * ext/snapshot/Makefile.am: * ext/sndfile/Makefile.am: * ext/soundtouch/Makefile.am: * ext/spc/Makefile.am: * ext/swfdec/Makefile.am: * ext/tarkin/Makefile.am: * ext/theora/Makefile.am: * ext/timidity/Makefile.am: * ext/twolame/Makefile.am: * ext/x264/Makefile.am: * ext/xine/Makefile.am: * ext/xvid/Makefile.am: * gst-libs/gst/app/Makefile.am: * gst-libs/gst/dshow/Makefile.am: * gst/aiffparse/Makefile.am: * gst/app/Makefile.am: * gst/audiobuffer/Makefile.am: * gst/bayer/Makefile.am: * gst/cdxaparse/Makefile.am: * gst/chart/Makefile.am: * gst/colorspace/Makefile.am: * gst/dccp/Makefile.am: * gst/deinterlace/Makefile.am: * gst/deinterlace2/Makefile.am: * gst/dvdspu/Makefile.am: * gst/festival/Makefile.am: * gst/filter/Makefile.am: * gst/flacparse/Makefile.am: * gst/flv/Makefile.am: * gst/games/Makefile.am: * gst/h264parse/Makefile.am: * gst/librfb/Makefile.am: * gst/mixmatrix/Makefile.am: * gst/modplug/Makefile.am: * gst/mpeg1sys/Makefile.am: * gst/mpeg4videoparse/Makefile.am: * gst/mpegdemux/Makefile.am: * gst/mpegtsmux/Makefile.am: * gst/mpegvideoparse/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/nuvdemux/Makefile.am: * gst/overlay/Makefile.am: * gst/passthrough/Makefile.am: * gst/pcapparse/Makefile.am: * gst/playondemand/Makefile.am: * gst/rawparse/Makefile.am: * gst/real/Makefile.am: * gst/rtjpeg/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/scaletempo/Makefile.am: * gst/sdp/Makefile.am: * gst/selector/Makefile.am: * gst/smooth/Makefile.am: * gst/smoothwave/Makefile.am: * gst/speed/Makefile.am: * gst/speexresample/Makefile.am: * gst/stereo/Makefile.am: * gst/subenc/Makefile.am: * gst/tta/Makefile.am: * gst/vbidec/Makefile.am: * gst/videodrop/Makefile.am: * gst/videosignal/Makefile.am: * gst/virtualdub/Makefile.am: * gst/vmnc/Makefile.am: * gst/y4m/Makefile.am: * sys/acmenc/Makefile.am: * sys/cdrom/Makefile.am: * sys/dshowdecwrapper/Makefile.am: * sys/dshowsrcwrapper/Makefile.am: * sys/dvb/Makefile.am: * sys/dxr3/Makefile.am: * sys/fbdev/Makefile.am: * sys/oss4/Makefile.am: * sys/qcam/Makefile.am: * sys/qtwrapper/Makefile.am: * sys/vcd/Makefile.am: * sys/wininet/Makefile.am: * win32/common/config.h: Don't install static libs for plugins. Fixes #550851 for -bad. 2008-10-12 21:52:27 +0000 Jan Schmidt sys/oss4/: Add some spaces in translateable strings. Original commit message from CVS: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: Add some spaces in translateable strings. Fixes: #555969 #555968 #555965 2008-08-07 16:20:30 +0000 Frederic Crozat Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). Original commit message from CVS: Patch by: Frederic Crozat * ext/sndfile/gstsf.c: (plugin_init): * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_plugin_init): * sys/oss4/oss4-audio.c: (plugin_init): Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). 2008-06-16 07:30:34 +0000 Stefan Kost Final round of doc updates. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/speed/gstspeed.c: * gst/speexresample/gstspeexresample.c: * gst/videosignal/gstvideoanalyse.c: * gst/videosignal/gstvideodetect.c: * gst/videosignal/gstvideomark.c: * sys/dvb/gstdvbsrc.c: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: * sys/wininet/gstwininetsrc.c: Final round of doc updates. 2008-06-12 14:49:18 +0000 Stefan Kost Do not use short_description in section docs for elements. We extract them from element details and there will be war... Original commit message from CVS: * ext/dc1394/gstdc1394.c: * ext/ivorbis/vorbisdec.c: * ext/jack/gstjackaudiosink.c: * ext/metadata/gstmetadatademux.c: * ext/mythtv/gstmythtvsrc.c: * ext/theora/theoradec.c: * gst-libs/gst/app/gstappsink.c: * gst/bayer/gstbayer2rgb.c: * gst/deinterlace/gstdeinterlace.c: * gst/rawparse/gstaudioparse.c: * gst/rawparse/gstvideoparse.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/selector/gstinputselector.c: * gst/selector/gstoutputselector.c: * gst/videosignal/gstvideoanalyse.c: * gst/videosignal/gstvideodetect.c: * gst/videosignal/gstvideomark.c: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: Do not use short_description in section docs for elements. We extract them from element details and there will be warnings if they differ. Also fixing up the ChangeLog order. 2008-06-12 13:06:37 +0000 Stefan Kost tests/icles/test-oss4.c: Include stdlib.h. Original commit message from CVS: * tests/icles/test-oss4.c: Include stdlib.h. 2008-05-22 16:33:25 +0000 Tim-Philipp Müller tests/icles/: Small oss4 test that probes for available devices and retrieves their caps and mixer tracks and all tha... Original commit message from CVS: * tests/icles/.cvsignore: * tests/icles/Makefile.am: * tests/icles/test-oss4.c: (opt_show_mixer_messages), (WAIT_TIME), (show_mixer_messages), (probe_mixer_tracks), (probe_pad), (probe_details), (probe_element), (main): Small oss4 test that probes for available devices and retrieves their caps and mixer tracks and all that. Also allows testing of mixer change messages on the bus. 2008-05-22 15:14:26 +0000 Tim-Philipp Müller sys/oss4/: Make device-name probing in NULL state work better (e.g. for the gnome-control-center sound capplet). Original commit message from CVS: * sys/oss4/oss4-mixer.c: (gst_oss4_mixer_open): * sys/oss4/oss4-property-probe.c: (gst_oss4_property_probe_find_device_name), (gst_oss4_property_probe_find_device_name_nofd): * sys/oss4/oss4-property-probe.h: * sys/oss4/oss4-sink.c: (gst_oss4_sink_get_property): * sys/oss4/oss4-source.c: (gst_oss4_source_get_property): Make device-name probing in NULL state work better (e.g. for the gnome-control-center sound capplet). 2008-05-08 19:16:17 +0000 Clive Wright sys/oss4/oss4-mixer-slider.c: Apparently mono sliders have the mono value repeated in the upper bits, so mask those o... Original commit message from CVS: Based on patch by: Clive Wright * sys/oss4/oss4-mixer-slider.c: (gst_oss4_mixer_slider_unpack_volume): Apparently mono sliders have the mono value repeated in the upper bits, so mask those out when reading them. Probably makes the mixer applet work properly in some more cases. 2008-04-11 08:13:22 +0000 Julien Moutte sys/oss4/: Fix arguments format in debug statements. Original commit message from CVS: 2008-04-11 Julien Moutte * sys/oss4/oss4-mixer-enum.c: (gst_oss4_mixer_enum_get_values_locked): * sys/oss4/oss4-source.c: (gst_oss4_source_delay): Fix arguments format in debug statements. 2008-04-02 20:18:58 +0000 Tim-Philipp Müller Add initial support for OSSv4. Mixer still needs a bit more love, but even magic has its limits. Original commit message from CVS: * configure.ac: * sys/Makefile.am: * sys/oss4/Makefile.am: * sys/oss4/oss4-audio.c: * sys/oss4/oss4-audio.h: * sys/oss4/oss4-mixer-enum.c: * sys/oss4/oss4-mixer-enum.h: * sys/oss4/oss4-mixer-slider.c: * sys/oss4/oss4-mixer-slider.h: * sys/oss4/oss4-mixer-switch.c: * sys/oss4/oss4-mixer-switch.h: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-mixer.h: * sys/oss4/oss4-property-probe.c: * sys/oss4/oss4-property-probe.h: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-sink.h: * sys/oss4/oss4-soundcard.h: * sys/oss4/oss4-source.c: * sys/oss4/oss4-source.h: Add initial support for OSSv4. Mixer still needs a bit more love, but even magic has its limits. 2010-05-11 10:52:58 +0200 Alessandro Decina * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: osxvideosink: implement the xoverlay interface. Fixes #618349. 2010-05-11 18:42:32 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix push based seeking ... where it comes down to transforming incoming BYTE segment to a corresponding TIME segment. Also fixes #609405. 2010-05-11 14:23:47 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-imagefreeze.xml: * tests/check/Makefile.am: * tests/check/elements/.gitignore: Move imagefreeze plugin from -bad to -good Hook up build infrastructure, docs and unit test for new plugin. Fixes #613786. 2010-05-05 12:23:56 +0200 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Set fixed caps on the correct pad This makes the sink getcaps function actually used instead of using the fixed caps function for it. 2010-03-21 21:39:18 +0100 Benjamin Otte * tests/check/elements/imagefreeze.c: Add -Wmissing-declarations -Wmissing-prototypes to configure flags And fix all warnings 2010-03-15 11:54:02 +0100 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Only start the task after a seek if a buffer was received already 2010-02-28 16:08:14 +0100 Sebastian Dröge * tests/check/elements/imagefreeze.c: imagefreeze: Add some unit tests 2010-02-28 16:04:31 +0100 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Set undefined framerate in sink getcaps function 2010-02-28 15:02:02 +0100 Sebastian Dröge * gst/imagefreeze/gstimagefreeze.c: imagefreeze: Implement reverse playback and set buffer offsets 2010-02-27 17:33:05 +0100 Sebastian Dröge * gst/imagefreeze/Makefile.am: * gst/imagefreeze/gstimagefreeze.c: * gst/imagefreeze/gstimagefreeze.h: imagefreeze: Add still frame stream generator element 2010-05-11 13:07:19 +0100 Tim-Philipp Müller * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-debug.xml: * gst/debugutils/Makefile.am: * gst/debugutils/gstdebug.c: * tests/check/Makefile.am: * tests/check/elements/.gitignore: Move capsfilter element from -bad to -good Hook up moved files to the build infrastructure and docs. Fixes #617739. 2010-05-06 13:12:32 +0200 Sebastian Dröge * gst/debugutils/gstcapssetter.c: * gst/debugutils/gstcapssetter.h: capssetter: Some minor cleanup 2010-03-22 16:56:03 +0100 Benjamin Otte * tests/check/elements/capssetter.c: Add -Wold-style-definition and fix the warnings 2010-03-18 17:30:26 +0100 Benjamin Otte * gst/debugutils/gstcapssetter.c: gst_element_class_set_details => gst_element_class_set_details_simple 2009-10-08 19:51:31 +0200 Mark Nauwelaerts * tests/check/elements/capssetter.c: capssetter: add unit test 2009-06-25 16:41:49 +0200 Mark Nauwelaerts * gst/debugutils/gstcapssetter.c: * gst/debugutils/gstcapssetter.h: capssetter: import element into -bad 2010-05-11 12:06:10 +0200 Mark Nauwelaerts * gst/avi/gstavimux.c: avimux: check that pads have been negotiated Also set fcc_handler field in audio stream header. Fixes #618351. 2010-05-10 18:33:03 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix partial parsing of ctts table Fixes #616516. 2010-05-10 18:32:15 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: cleanup a comment and add some debug and conditional compilation 2010-05-11 10:01:52 +0200 Sebastian Dröge * configure.ac: configure: Check for GTK+ 3.0 and if it's not available for GTK+ 2.0 2010-05-10 22:11:10 +0200 Jan Urbański * gst/flv/gstflvmux.c: flvmux: only store the last buffer timestamp if it's valid Fixes bug #618305 2010-01-08 22:13:59 -0500 Olivier Crête * gst/rtp/gstrtph264pay.c: rtph264pay: Re-send SPS/PPS when requested https://bugzilla.gnome.org/show_bug.cgi?id=606689 2010-05-07 17:09:16 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264pay.c: rtph264pay: fix typo in debug message 2010-05-07 15:42:23 +0200 Mark Nauwelaerts * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtptheorapay.h: rtptheorapay: add config-interval parameter to re-insert config in stream Add a new config-interval property to instruct the payloader to insert configuration headers at periodic intervals in the stream (when a keyframe is countered). 2010-05-07 15:31:03 +0200 Mark Nauwelaerts * gst/rtp/gstrtptheoradepay.c: rtptheoradepay: fix in-band configuration parsing Also make configuration header parsing a bit more relaxed with respect to length field interpretation. 2010-05-07 15:30:30 +0200 Mark Nauwelaerts * gst/rtp/gstrtpvorbisdepay.c: rtpvorbisdepay: fix in-line configuration parsing Also make configuration header parsing a bit more relaxed with respect to length field interpretation. 2010-05-04 16:57:35 +0200 Mark Nauwelaerts * gst/rtp/gstrtptheorapay.c: rtptheorapay: do not discard downstream flow return 2010-05-04 16:57:11 +0200 Mark Nauwelaerts * gst/rtp/gstrtptheorapay.c: rtptheorapay: refactor buffer payloading 2010-05-07 20:41:04 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Add support for UYVY 2010-05-07 19:06:35 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: fix return value 2010-05-07 19:02:21 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't leak the session 2010-05-07 18:59:42 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtsp: configure bandwidth properties in the session 2010-05-07 18:58:58 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpsession: add properties to configure the bandwidth Add properties to proxy the bandwidth configuration to the session object. 2010-05-07 18:57:13 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: rtpsession: add properties to configure bandwidths Add properties to configure the sender and receiver bandwidths. Configure the bandwidths before calculating the RTCP timeout when we need to. 2010-05-07 18:56:30 +0200 Wim Taymans * gst/rtpmanager/rtpstats.c: rtpstats: add some debug info 2010-05-07 18:55:34 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpsession: small cleanups 2010-05-07 16:55:13 +0200 Wim Taymans * gst/rtpmanager/rtpstats.c: * gst/rtpmanager/rtpstats.h: rtpstats: make bandwidths more configurable Add a method to configure the various bandwidths in the session. 2010-05-07 13:32:30 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: handle NONE RTCP intervals Prepare for handling RTCP reporting intervals of GST_CLOCK_TIME_NONE, which means don't send RTCP at all. 2010-05-07 12:51:05 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: fall back to SDP ports instead of server_port In multicast, fall back to the ports in the SDP instead of the server_port attribute as this is more in line with the RFC. 2010-05-07 12:24:51 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: refactor collecting the transport info Make a method to collect the ports and destination address. 2010-05-07 11:28:36 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: handle servers that send broken Transports Handle servers that send their port pairs with the wrong name. Fixes #617537 2010-05-06 16:52:26 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: use the SDP connection info in multicast Parse the connection info from the SDP. When we need to configure the multicast destination, fall back to the SDP connection info when the transport did not specify a destination and ttl. Fixes #617537 2010-05-06 15:42:38 +0300 Stefan Kost * gst/goom/gstgoom.c: * gst/goom2k1/gstgoom.c: * gst/monoscope/gstmonoscope.c: goom,monoscope: truncate own caps, instead of copying and using the first only We got the caps from an intersect, it is our own, hence we can truncate it. 2010-05-06 15:40:33 +0300 Stefan Kost * ext/pulse/pulsesrc.c: pulsesrc: reflow to truncate caps just once We get writable cpas from the intersection (unless it failed). As we truncate those anyway, we don't need to manyaly copy the first structure. 2010-05-06 15:39:31 +0300 Stefan Kost * ext/gdk_pixbuf/gstgdkpixbuf.c: gdkpixbuf: don't leak template caps 2010-05-06 15:38:35 +0300 Stefan Kost * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: auto{audio,video}{src,sink}: use can_intersect to avoid a caps copy 2010-04-27 13:36:35 +0300 Stefan Kost * gst/flv/gstflvdemux.c: flvdemux: tell what we can do Any-caps are bad. If apps scan the registry, they'd like to know what we can output. 2010-04-27 13:43:29 +0300 Stefan Kost * ext/jpeg/gstjpegenc.c: jpegenc: also lift the arbitrary restrictions for width and height This was already done for jpegdec. 2010-05-06 14:03:11 +0200 Sebastian Dröge * ext/pulse/pulsesrc.c: pulsesrc: Allocate/free PA mainloop during state changes ...also destroy the stream and context during state changes. 2010-05-06 13:57:01 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Allocate and free the custom clock in NULL<->READY 2010-05-06 13:51:59 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Create and free the PA mainloop in NULL->READY/READY->NULL This fixes a race condition, when stopping the mainloop during finalization is done from a mainloop callback. Fixes bugs #614765 and #590662. 2010-05-05 19:35:48 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Make selection of a sinkpad number threadsafe 2010-05-05 17:39:32 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Add support for all common RGB formats 2010-05-05 16:06:51 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.asm: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Add support for AYUV 2010-05-04 16:34:27 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: make setup url in a smarter way Make sure we always separate the base and control url parts with a / when creating the setup url. 2010-05-04 16:04:39 +0200 Alessandro Decina * gst/rtsp/gstrtspsrc.c: rtspsrc: handle SEEKING queries. 2010-05-04 11:13:45 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: rtpmp4vpay: add config-interval parameter to re-insert config in stream Add a new config-interval property to instruct the payloader to insert config (VOSH, VOS, etc) at periodic intervals in the stream (when a GOP or VOP-I is encountered). Based on patch by Fixes #607452. 2010-05-03 13:26:32 +0200 Alessandro Decina * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: move some initialization code from change_state to _init. Set ->active to TRUE in _init so it can be set to FALSE after creating the jitterbuffer and it won't be mistakenly reset to TRUE in the change_state function. This is needed to start the jitterbuffer as inactive when rtpbin is buffering. 2010-05-03 11:56:58 +0200 Alessandro Decina * gst/rtpmanager/gstrtpbin.c: rtpbin: fix a bug handling BUFFERING messages. If a session exists but has no streams, set the min buffering percent to 0 since it means that we haven't received anything for that session yet. 2010-05-03 11:51:37 +0200 Alessandro Decina * gst/rtpmanager/gstrtpbin.c: rtpbin: when a stream is created, pause the jitterbuffer if rtpbin is buffering. 2010-05-03 11:23:59 +0200 Alessandro Decina * gst/rtpmanager/gstrtpbin.c: rtpbin: fix a bug calculating stream offsets. 2010-05-01 14:20:59 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: Write previous cluster's size This is useful for backwards playback, which should be implemented in matroskademux at some point. 2010-05-01 14:15:49 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Set interlaced flag in the caps if the flag is set in the Matroska file 2010-05-01 14:12:28 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Write interlaced flag if the input video content is interlaced Unfortunately Matroska has no way to specify TFF and friends... 2010-05-01 11:25:26 +0100 Tim-Philipp Müller * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtpvorbisdepay.c: rtp: fix printf format of some debug messages 2010-05-01 11:06:53 +0100 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska: init variable to avoid compiler warning on OSX Fixes (bogus) "'offset' may be used uninitialized in this function" warning on build bot (also spotted by philn). 2010-04-30 17:19:44 -0700 David Schleef * gst/qtdemux/qtdemux.c: qtdemux: UYVY is 4:2:2, not 4:2:0 2010-04-30 22:22:25 +0200 Sebastian Dröge * ext/pulse/pulseutil.c: pulse: Don't compare values of two different enum types 2010-04-30 22:13:30 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Make automatic detection of interlacing the default Previously "force deinterlacing" was the default, which is a not very sensible default for the normal use case where deinterlace should act in passthrough mode unless interlaced content is present. 2010-04-29 16:26:49 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: optimise buffer scanning Specifically, when needing more data, do not rescan from start next time around, but resume from last position. See also #583047. 2010-04-29 15:38:49 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: disregard superfluous lines when indirect decoding 2010-04-27 15:44:39 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: add support for RGB and grayscale color space Also refactor src caps negotiation and setting. 2010-04-27 12:19:22 +0200 Mark Nauwelaerts * ext/jpeg/Makefile.am: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstjpegenc.h: jpegenc: support more colour spaces and some cleanups 2010-04-30 12:47:01 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegenc.c: jpegenc: more generic sink getcaps 2010-04-30 12:42:42 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: more sanity checks on input Specifically, verify input components / colour space is as code subsequently expects, thereby avoiding crashes or otherwise bogus output. Presently, that means 3 components YCbCr colour space, and somewhat limited sampling factors. Fixes #600553. 2010-04-22 12:28:22 +0200 Mark Nauwelaerts * gst/rtp/gstrtptheoradepay.c: rtptheoradepay: also accept in-band configuration Fixes #574416 (theora). 2010-04-22 12:27:35 +0200 Mark Nauwelaerts * gst/rtp/gstrtpvorbisdepay.c: rtpvorbisdepay: also accept in-line configuration Fixes #574416 (vorbis). 2010-04-07 17:21:55 -0400 Olivier Crête * gst/rtp/gstrtptheoradepay.c: rtptheoradepay: Ignore packets without a known codebook Don't produce an error if a packet is received without a valid codebook, it's possible that the codebook will just be coming later. See #574416. 2010-04-20 12:17:26 +0200 Mark Nauwelaerts * tests/check/elements/y4menc.c: y4menc: adjust unit test to element behaviour 2010-02-23 22:16:39 -0500 Benjamin M. Schwartz * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: y4menc: add 4:2:2, 4:1:1, and 4:4:4 output support Fixes #610902. 2010-04-15 12:21:56 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: rtph264depay: DELTA_UNIT marking of output buffers ... which evidently makes (most) sense if output buffers are actually frames. Partially based on a patch by Miguel Angel Cabrera Fixes #609658. 2010-04-16 17:21:50 +0200 Mark Nauwelaerts * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263depay.h: rtph263depay: extra keyframe info from PTYPE header ... as opposed to taking it from h263 payload header, which need not be so reliable. Fixes #610172. 2010-04-16 17:08:47 +0200 Mark Nauwelaerts * gst/rtp/gstrtph263depay.c: rtph263depay: also use Picture Start Code to detect packet loss This ensures a whole frame is dropped if a (start) packet is lost, rather than relying only on the DISCONT flag. 2010-04-16 17:06:11 +0200 Mark Nauwelaerts * gst/rtp/gstrtph263depay.c: rtph263depay: detect frame start using Picture Start Code So we stop dropping fragments as soon as there is a picture start (code). In particular, this prevents dropping the first frame following initial DISCONT. 2010-04-16 16:34:06 +0200 Mark Nauwelaerts * gst/rtp/gstrtph263depay.c: rtph263depay: handle a few FIXMEs 2010-04-16 16:27:25 +0200 Mark Nauwelaerts * gst/rtp/gstrtph263depay.c: rtph263depay: slightly refactor payload dropping 2010-04-16 11:53:17 +0200 Mark Nauwelaerts * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pay.h: rtph263pay: use found GOBs to apply Mode A payloading ... rather than falling back to sending the whole frame in one packet if number of GOB startcodes < maximum. One might take this further and still perform Mode B/C payloading, but at least this should cater for decent fragments in typical cases. Fixes #599585. 2010-04-14 11:53:46 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: implement push mode seeking 2010-04-29 20:08:43 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videofilter.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * gst/smpte/gstsmptealpha.c: docs: update for videofilter plugin merge and add gtk-doc blurb for new property 2010-04-26 18:12:46 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Improve segment handling a bit 2010-04-26 18:05:00 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Order caps by amount of contained information 2010-04-26 17:25:38 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Properly set interlaced field in getcaps 2010-04-24 16:28:12 +0200 Sebastian Dröge * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Add planar YUV support to all other simple methods 2010-04-24 16:10:06 +0200 Sebastian Dröge * gst/deinterlace/tvtime/greedyh.asm: * gst/deinterlace/tvtime/greedyh.c: deinterlace: Add planar YUV support to greedyh method 2010-04-24 15:42:07 +0200 Sebastian Dröge * gst/deinterlace/tvtime/greedy.c: deinterlace: Add support for planar YUV formats in greedyl method 2010-04-24 13:58:03 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/vfir.c: deinterlace: Add support for Y444, Y42B, I420, YV12 and Y41B The vfir method supports them and will be used until something else supports it. 2010-04-24 09:16:22 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlacemethod.c: deinterlace: Define deinterlace method base classes as abstract types 2010-04-23 17:40:10 +0200 Sebastian Dröge * gst/deinterlace/Makefile.am: * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: * gst/deinterlace/gstdeinterlacemethod.c: * gst/deinterlace/gstdeinterlacemethod.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Move deinterlacing methods to their own file 2010-04-23 17:25:12 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Simplify passthrough mode detection 2010-04-23 14:35:44 +0200 Sebastian Dröge * tests/check/elements/deinterlace.c: deinterlace: Fix unit test that checks caps handling deinterlace now always adds the interlaced field to the output caps, if it wasn't present in the input caps the output caps will still contain interlaced=false. 2010-04-21 17:00:05 +0200 Sebastian Dröge * gst/deinterlace/Makefile.am: * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.asm: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Refactor deinterlacing as preparation for supporting more color formats 2010-04-22 19:05:37 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for Y444, Y42B and Y41B 2010-04-22 15:54:21 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for YVYU and reorder template caps 2010-04-18 21:11:21 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Translate navigation events to make sense again upstream 2010-04-18 20:58:14 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Properly handle ranges/lists of width or height when transforming caps Code partly taken from the videocrop element. 2010-04-22 15:45:15 +0200 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Fix planar YUV->RGB processing 2010-04-22 15:42:03 +0200 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Correctly clamp after YUV->RGB conversion 2010-04-22 15:20:24 +0200 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Add support for YUY2, YVYU and UYVY 2010-04-18 15:02:42 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Sync properties to the controller in before_transform 2010-04-16 17:00:02 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for YUY2 and UYUV 2010-04-21 17:41:43 +0200 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Refactor processing and add support for other planar YUV formats This reduces the generated code size by a factor of 2.5. 2010-04-21 17:15:33 +0200 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Add support for YV12 input 2010-04-22 13:56:58 +0200 Sebastian Dröge * gst/videomixer/blend.c: * gst/videomixer/blend.h: * gst/videomixer/videomixer.c: videomixer: Add support for YUY2, YVYU, UYVY 2010-04-20 12:18:18 +0200 Sebastian Dröge * gst/videomixer/blend.c: * gst/videomixer/blend.h: * gst/videomixer/videomixer.c: videomixer: Add support for Y444, Y42B, Y41B and YV12 2010-04-21 17:07:10 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: videofilter: Order color formats by their contained amount of information 2010-04-20 18:22:16 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Drop Y41B/Y42B support Rotating 90°/270° with subsampled YUV where horizontal and vertical subsampling are different doesn't really work. 2010-04-19 14:37:54 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Also flip the pixel-aspect-ratio if width/height are exchanged 2010-04-18 23:08:14 +0200 Sebastian Dröge * tests/check/Makefile.am: * tests/check/elements/videofilter.c: videofilter: Extend the unit test to test different color formats 2010-04-18 22:55:36 +0200 Sebastian Dröge * tests/check/elements/videofilter.c: videofilter: Add some more tests These check different property combinations 2010-04-18 22:54:23 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Change the default method to identity 2010-04-18 22:50:20 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideobalance.h: videobalance: Reduce number of allocations per instance 2010-04-18 22:45:58 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: videofilter: Update last-reviewed comments 2010-04-18 22:40:55 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Add support for all RGB formats 2010-04-18 22:28:17 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Add support for YUY2, UYVY, AYUV and YVYU 2010-04-18 22:23:03 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Add debug category 2010-04-18 22:19:55 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Make property access threadsafe 2010-04-18 22:18:24 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Add support for Y41B, Y42B and Y444 2010-04-18 22:17:02 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideobalance.h: videobalance: Use libgstvideo for format specific things 2010-04-18 22:09:06 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Make properties controllable 2010-04-18 22:06:44 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Emit "value-changed" signal of color balance interface when values change 2010-04-18 21:58:13 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideobalance.h: videobalance: Some random cleanup 2010-04-18 21:37:23 +0200 Sebastian Dröge * gst/videofilter/gstvideobalance.c: videobalance: Stop using liboil The used liboil function is deprecated and has no optimized implementation anyway. 2010-04-18 21:14:11 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Make property access threadsafe 2010-04-18 15:00:36 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: gamma: Sync properties to the controller in before_transform 2010-04-18 14:46:09 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Add support for all RGB formats and AYUV 2010-04-18 14:31:36 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Add support for Y41B, Y42B and Y444 2010-04-18 14:29:30 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideoflip.h: videoflip: Make processing more general and use libgstvideo for all format specific things 2010-04-18 13:12:40 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: videoflip: Make method property controllable and improve debug output 2010-04-18 13:03:48 +0200 Sebastian Dröge * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideoflip.h: videoflip: Some random cleanup 2010-04-18 10:17:52 +0200 Sebastian Dröge * Makefile.am: * gst/videofilter/Makefile.am: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videofilter/plugin.c: videofilter: Move all elements into a single plugin Having all these small elements in a separate plugin is not very memory effective... 2010-04-18 10:07:24 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: * gst/videofilter/gstgamma.h: gamma: Improve docs a bit 2010-04-18 09:59:43 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: gamma: Add support for all RGB formats 2010-04-18 09:46:15 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: gamma: Add support for many packed YUV formats That is YUY2, UYVY, AYUV and YVYU. 2010-04-18 09:38:36 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: gamma: Add support for all other planar YUV formats That is Y41B, Y42B, Y444, NV12 and NV21. 2010-04-18 09:33:49 +0200 Sebastian Dröge * gst/videofilter/Makefile.am: * gst/videofilter/gstgamma.c: gamma: Stop using liboil The used liboil function is deprecated, only has a reference implementation and is more complex than what's needed here. 2010-04-17 18:13:46 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: * gst/videofilter/gstgamma.h: gamma: Use libgstvideo for format specific values and make gamma processing more generic Allows us to easily add support for new color formats later. 2010-04-17 18:01:06 +0200 Sebastian Dröge * gst/videofilter/Makefile.am: * gst/videofilter/gstgamma.c: gamma: Make gamma property controllable ...and properly use liboil. 2010-04-17 17:55:22 +0200 Sebastian Dröge * gst/videofilter/gstgamma.c: gamma: Some random cleanup 2010-04-19 14:45:33 +0200 Sebastian Dröge * gst/smpte/gstsmptealpha.c: smptealpha: Sync properties to the controller in before_transform 2010-04-17 17:47:05 +0200 Sebastian Dröge * gst/smpte/gstsmptealpha.c: smptealpha: Add support for YV12 (converted to AYUV) 2010-04-17 17:43:51 +0200 Sebastian Dröge * gst/smpte/gstsmptealpha.c: smptealpha: Add support for all 4 ARGB formats ...without format conversion. 2010-04-16 17:27:02 +0200 Sebastian Dröge * gst/smpte/gstsmptealpha.c: * gst/smpte/gstsmptealpha.h: smptealpha: Make color format support more generic This allows easier addition of new formats later. 2010-04-16 17:18:15 +0200 Sebastian Dröge * gst/smpte/gstsmptealpha.c: * gst/smpte/gstsmptealpha.h: smptealpha: Some random cleanup 2010-04-15 22:28:58 +0200 Sebastian Dröge * gst/smpte/gstmask.c: * gst/smpte/gstmask.h: * gst/smpte/gstsmpte.c: * gst/smpte/gstsmpte.h: * gst/smpte/gstsmptealpha.c: * gst/smpte/gstsmptealpha.h: smpte: Add property for inverting the transition mask This converts a left-to-right transition to right-to-left or clock-wise to counter-clock-wise. 2010-04-15 22:27:57 +0200 Sebastian Dröge * gst/smpte/gstsmptealpha.c: smptealpha: Correctly detect property changes and update properties 2010-04-16 19:35:12 +0200 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpqcelpdepay.c: * gst/rtp/gstrtpqcelpdepay.h: qcelpdepay: add first version of a QCELP depayloader 2010-04-29 15:18:07 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development. === release 0.10.22 === 2010-04-28 02:58:02 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.22 2010-04-28 02:57:21 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2010-04-25 23:36:29 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.21.3 pre-release 2010-04-25 21:19:33 +0100 Tim-Philipp Müller * gst/flv/gstflvmux.c: flvmux: hide is-live property for release At the very least it needs a better/less wrong name. See #613066. 2010-04-25 15:12:20 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: don't crash if jpeg image contains more than three components Our code currently only handles a maximum of 3 components, so error out for now if the image has more components than that. Fixes #604106. 2010-04-20 17:21:29 +0100 Tim-Philipp Müller * gst-plugins-good.doap: doap: update repository info from cvs->git and maintainers 2010-04-23 14:40:20 +0100 Tim-Philipp Müller * common: Automatic update of common submodule From fc85867 to 4d67bd6 2010-04-22 13:30:55 +0200 Sebastian Dröge * gst/videomixer/blend.c: videomixer: Fix byte order for MMX ARGB/AYUV color filling Fixes bug #616409. 2010-04-21 17:53:49 +0200 Sebastian Dröge * gst/videomixer/blend.c: videomixer: Fix AYUV checker/color filling 2010-04-19 16:43:28 +0200 Sebastian Dröge * gst/videomixer/blend_mmx.h: videomixer: Add i387 floating point registers to the clobbered registers list They are the same as the mm0-mm7 MMX registers and will be overwritten by the assembly code if gcc doesn't know about the MMX registers. Note: They're all added to the list of clobbered registers in all cases and not only when __MMX__ is not defined just to make sure that no other bugs happen with this code just because some compiler version gets things wrong. Fixes bug #614466. 2010-04-19 14:09:34 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Use libgstvideo to get the order of RGB 2010-04-17 10:06:41 +0100 Brian Cameron * gst/goom/xmmx.c: goom: add edx to clobber list in inline assembly code mull modifies %edx, so should be mentioned in clobber list. Fixes crash on Solaris (#615998). 2010-04-15 13:39:41 +0100 Tim-Philipp Müller * tests/icles/Makefile.am: tests: don't use GST_PLUGIN_LDFLAGS when building test binaries 2010-04-16 15:27:12 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix I420->I420 copying Fixes bug #615143. 2010-04-13 18:15:50 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix AYUV->I420 copying 2010-04-16 12:14:26 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: profile-level-id is an optional parameter So, if needed, extract the corresponding info from sprop-parameter-sets. Based on patch provided by Fixes #612657. 2010-04-15 07:13:46 -0300 Thiago Santos * configure.ac: configure: Drop -Wcast-align Commit message copied from core's commit from Benjamin Otte: 246f5dba96a5b50bb74621af67b30942cca72af5 Apparently gcc warns that GstMiniObject is not castable to GstEvent/Message/Buffer due to them containing 64bit variables, even though ARM hackers claim that those only need 4byte alignment. And as long as gcc behaves that way, this warning is not very useful. So we'll remove the warning until this problem is fixed. Fixes #615698 2010-04-14 23:46:06 +0100 Tim-Philipp Müller * ext/flac/gstflactag.c: flactag: fix adapter assertion when used directly after flacenc Unlike filesrc, flacenc outputs the flac blocks neatly aligned one in each buffer. This means that when we switch from metadata mode to audio data passthrough mode, there's no data left in the adapter to push out at this point, so check if there's data in the adapter before requesting buffers from it (also needed in case we get input buffers of 0 size). Fixes #615793. 2010-04-14 23:18:27 +0100 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.21.2 pre-release 2010-04-14 20:31:30 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update 2010-04-14 20:06:09 +0100 Tim-Philipp Müller * tests/examples/equalizer/Makefile.am: * tests/examples/shapewipe/Makefile.am: * tests/examples/spectrum/Makefile.am: * tests/examples/v4l2/Makefile.am: * tests/icles/Makefile.am: tests: use LDADD for libs to link to instead of LDFLAGS Use foo_LDADD instead of foo_LDFLAGS to specify the libraries to link to. This should make sure arguments are passed to the linker in the right order, and makes LDFLAGS usable again. Based on patch by Brian Cameron Fixes #615697. 2010-04-14 18:13:56 +0200 Edward Hervey * gst/videobox/gstvideobox.c: videobox: transform_caps : We can only convert AYUV to xRGB We were previously stating that we could convert AYUV/I420/YV12 to xRGB. 2010-04-13 00:14:46 +0100 Tim-Philipp Müller * configure.ac: configure: also remove -Waggregate-return from warning flags It causes problems with Objective-C code like in osxvideosink. Fixes #613663. 2010-04-12 18:22:39 +0200 Edward Hervey * tests/check/Makefile.am: check: Ignore osx audio/video src/sinks in state change tests And make the line readable for those mere mortals that don't own a 30" screen 2010-04-12 18:03:20 +0200 Edward Hervey * tests/check/elements/cmmldec.c: * tests/check/elements/cmmlenc.c: * tests/check/elements/level.c: * tests/check/elements/matroskamux.c: * tests/check/elements/rganalysis.c: * tests/check/elements/rglimiter.c: * tests/check/elements/rgvolume.c: * tests/check/elements/spectrum.c: * tests/check/elements/videofilter.c: check: Don't re-declare 'GList *buffers' in the tests It's an external which lives in gstcheck.c. Redeclaring it makes some compilers/architectures think the 'buffers' in the individual tests are a different symbol... and therefore we end up comparing holodecks with oranges. 2010-04-12 14:50:46 +0100 Tim-Philipp Müller * gst/matroska/matroska-demux.c: * gst/qtdemux/qtdemux.c: matroskademux, qtdemux: minor code cleanup in avc_level_idc_to_string() Do the same with slightly fewer LOC. 2010-04-12 12:40:11 +0200 Edward Hervey * configure.ac: configure: Remove -Wundef flag Fixes #615161 2010-04-12 11:43:49 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix I420->AYUV copying 2010-04-12 11:25:59 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Correctly clamp frame/background alphas to [0,255] before writing them 2010-04-12 11:16:56 +0200 Edward Hervey * tests/check/elements/.gitignore: check: Ignore jpegenc test 2010-04-11 13:14:30 -0700 David Schleef * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Only check interlaced flag in sink caps Fixes #615460. 2010-04-09 11:21:47 +0200 Sebastian Dröge * common: Automatic update of common submodule From ba33d1f to fc85867 2010-04-08 18:05:46 +0300 Stefan Kost * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/rtpmanager/gstrtpbin.c: docs: do proper escaping for "%" 2010-04-08 17:50:49 +0300 Stefan Kost * gst/rtsp/gstrtspgoogle.c: * gst/rtsp/gstrtspgoogle.h: rtsp: remove obsolete google extension This was not build for a while and can be removed. 2010-04-08 17:42:52 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: move two symbols to private section 2010-04-08 17:36:30 +0300 Stefan Kost * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: add flxdec docs 2010-04-08 17:17:06 +0300 Stefan Kost * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpjpegpay.c: docs: enable the 2 of 65 rtp elements in the docs 2010-04-08 11:54:19 +0200 Benjamin Otte * ext/shout2/gstshout2.c: shout2: Don't wait if we're late In fact, due to signedness issues, a negative delay would be changed to an almost infinite wait causing shout2send to "lock up". Reported by Christopher Montgomery. 2010-04-08 16:56:37 +0300 Stefan Kost * gst/udp/gstmultiudpsink.c: docs: upd -> udp and voila it shows up in the docs 2010-04-08 16:51:27 +0300 Stefan Kost * gst/alpha/gstalpha.h: docs: fix doc blob syntax 2010-04-08 16:51:05 +0300 Stefan Kost * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: add (sparse) docs for auparse element 2010-04-08 14:40:43 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: add videobox symbols 2010-04-08 14:40:19 +0300 Stefan Kost * docs/plugins/Makefile.am: docs: remove dynudpsink until someone documents it 2010-04-08 14:34:59 +0300 Stefan Kost * gst/flv/gstflvdemux.c: flvdemux: make debug category static 2010-04-08 14:29:19 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: flxdemux: rename GstFLVDemux for GstFlvDemux 2010-04-08 14:23:19 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/flv/Makefile.am: * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: * gst/flv/gstflvparse.h: flvdemux: merge flvparse into the demuxer and make function static No need to hide certain function in the docs. Allows to do more cleanups. 2010-04-08 13:13:34 +0200 Sebastian Dröge * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Add documentation 2010-04-08 14:00:08 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: v4l2buffer pool is now a separate object, remove them from v4l2src docs 2010-04-08 13:58:11 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: remove non existing flags and add two internal methods If someone cares flvparse could be merged into flvdemux. 2010-04-08 13:57:09 +0300 Stefan Kost * gst/rtpmanager/gstrtpsession.h: rtpsession: remove prototype for non existing function There is no function by that name anywhere. 2010-04-08 12:56:50 +0200 Sebastian Dröge * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videomixer.xml: docs: Update inspected plugin information 2010-04-08 12:56:30 +0200 Sebastian Dröge * gst/alpha/gstalphacolor.c: alphacolor: Improve docs a bit 2010-04-08 13:47:42 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: add effecttv defines and reorder list 2010-04-08 13:41:47 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: remove three entries that are not exported from the headers anymore 2010-04-08 13:40:36 +0300 Stefan Kost * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: move macro to c source One less semi public symbol without namespace prefix in the headers. 2010-04-08 13:40:09 +0300 Stefan Kost * ext/speex/gstspeexenc.h: speexenc: remove unused defines 2010-04-08 13:23:38 +0300 Stefan Kost * gst/matroska/matroska-mux.c: matroska-mux: fix last commit Use a local define for WAVEFORMAT_EX based on the size of the struct + 2 bytes for the extension size. 2010-04-08 13:16:53 +0300 Stefan Kost * ext/speex/gstspeexdec.h: speex: remove unused define 2010-04-08 13:03:43 +0300 Stefan Kost * gst/wavenc/Makefile.am: * gst/wavenc/gstwavenc.c: * gst/wavenc/riff.h: wavenc: remove internal copy of riff.h and use riff-library instead. We don't use any function yet, just the structures and defines. 2010-04-08 12:56:09 +0300 Stefan Kost * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: use riff lib more Remove BITMAPINFOHEADER and use the one from riff-lib. Also remove the WAVEFORMATEX_SIZE define and use a sizeof together with the respective struct. Besides better code reuse this lessens the ununsed symbols in the docs. 2010-04-08 12:14:07 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: docs: trim sections file more Rename some defines and move some itesm to *.c files. Add more items to internal subsection. 2010-04-08 11:19:43 +0300 Stefan Kost * docs/plugins/gst-plugins-good-plugins-sections.txt: docsw: trim the section file 2010-04-08 10:26:25 +0300 Stefan Kost * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: add v4l2sink to docs 2010-04-08 10:15:08 +0300 Stefan Kost * gst/audiofx/audioamplify.c: * gst/multifile/gstmultifilesink.c: docs: fix xml The title tag belongs into the refsect2. 2010-04-07 17:43:56 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for YV12, including conversion support for I420/AYUV 2010-04-07 17:27:12 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for grayscale input/output This doesn't do any conversion and is the next step to replacing videocrop by supporting all remaining formats in passthrough mode. 2010-04-07 16:24:38 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: * gst/videobox/gstvideobox.h: videobox: Add support for filling the background with red, yellow and white 2010-04-07 16:11:11 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for direct RGB<->AYUV conversion 2010-04-07 16:11:01 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix RGB24 filling 2010-04-07 16:06:54 +0300 Marco Ballesio * gst/rtp/gstrtph264depay.c: h264depay: handle properly STAPs in rtph264depay.c, lines 577-576, NALU-type 24 (Single-Time Aggregation Packet) is handled in fall-through as NALU-type 26 (unhandled). This leads high quality h264 streams such as: rtsp://stream.yle.mobi/yle/areena/MEDIA_E0342657_p3.mp4 to fail with "NAL unit type 24 not supported yet" (but it's actually supported), and thus to close any stream which contains STAPs. The proposed one-liner patch fixes the issue. Fixes #615051. 2010-04-07 13:47:02 +0200 Thijs Vermeir * gst-libs/gst/gst-i18n-plugin.h: * gst/avi/gstavi.c: build: fix compiler warnings fix warnings for all plugins that use: setlocale (LC_ALL... 2010-04-07 13:31:13 +0200 Thijs Vermeir * gst/avi/gstavi.c: avi: fix compiler warning 2010-03-31 17:54:21 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: restrict resyncing to subtitle tracks This should prevent skipping audio or video in not so well interleaved cases. Fixes #614460. 2010-04-06 13:21:51 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: Post avg./max. bitrate tags for H.264 This reads the average and maximum bitrates from the 'btrt' atom if available, and pushes these as tags, https://bugzilla.gnome.org/show_bug.cgi?id=614927 2010-04-03 23:39:20 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: fix racy shutdown Keep a ref of pulsesink for deferred mainloop invocation. Fixes #614765 2010-04-05 15:48:17 -0300 Thiago Santos * tests/check/Makefile.am: * tests/check/elements/jpegenc.c: tests: jpegenc: Adds some getcaps test Adds tests for the jpegenc getcaps function, to avoid having it returning non-subset caps 2010-04-05 14:51:58 -0300 Thiago Santos * ext/jpeg/gstjpegenc.c: jpegenc: Fix getcaps function When creating the caps allowed to upstream using downstream restrictions, use gst_pad_get_allowed_caps as that has the usable formats and puts into it the width, height and framerate fields. This avoids getting errors about getcaps returning non subset caps of its pad template. This error showed up on the metadata plugin unit test in -bad. 2010-04-05 17:31:36 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix conversion from 3 byte RGB to ARGB 2010-04-05 17:08:15 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add support for 3 byte RGB formats and refactor RGB code a bit 2010-04-05 15:51:13 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: * gst/videobox/gstvideobox.h: videobox: Add support for all 32 bit RGB formats ...including conversion between them. 2010-04-05 15:26:03 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: add property to control the buffering method Add a property to control how the jitterbuffer performs timestamping and buffering. 2010-04-04 19:02:41 -0300 André Dieb Martins * gst/alpha/gstalphacolor.c: alphacolor: Removing unused variable Fixes bug #614843. 2010-04-04 20:31:38 -0300 André Dieb Martins * ext/jpeg/gstjpegenc.c: jpegenc: should not return caps ANY based on downstream When downstream has a sink pad with ANY caps, jpegenc should treat it the same as NULL and return its template caps. Fixes #614842 2010-04-04 22:28:33 +0300 Stefan Kost * sys/oss/gstosshelper.c: oss: add fixme comment 2010-04-04 22:26:59 +0300 Stefan Kost * gconf/Makefile.am: build: use $(builddir) for installing generated files 2010-04-04 22:07:33 +0300 Stefan Kost * configure.ac: Revert "configure: fix out of source dir builds" This reverts commit ca0bd3a8cea31f9ea0df798a83d3007e696958ba. 2010-04-04 21:36:35 +0300 Stefan Kost * configure.ac: configure: fix out of source dir builds Remove non-existing gst-libs from include and library-paths'. Fixes #614354 even more. 2010-04-01 10:19:00 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: Read replaygain peak/gain tags Make qtdemux read tags replaygain tags that are within '----' atoms. Fixes #614471 2010-04-01 18:48:43 +0530 Arun Raghavan * gst/matroska/matroska-demux.c: * gst/qtdemux/qtdemux.c: matroska: Export h.264 profile and level in caps This replicates the code in qtdemux to export the h.264 profile and level in the stream caps. https://bugzilla.gnome.org/show_bug.cgi?id=614651 2010-04-02 18:50:45 +0200 Sebastian Dröge * gst/qtdemux/qtdemux.c: qtdemux: Fix off-by-one introduced in last commit 2010-04-01 18:38:38 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: Minor refactor of the code This will make it easier to clump together common code when copying to mastroskademux. https://bugzilla.gnome.org/show_bug.cgi?id=614651 2010-04-01 18:17:09 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: Export h.264 level in caps This exports the h.264 level in the stream caps (as a string) which can be used to match a decoder, or as metadata. https://bugzilla.gnome.org/show_bug.cgi?id=614651 2010-04-01 16:58:32 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: Export h.264 profile in caps This adds the h.264 profile for a given stream into caps. This can (eventually) be used to select an appropriate decoder and as metadata for certain applications. https://bugzilla.gnome.org/show_bug.cgi?id=614651 2010-03-31 14:43:14 +0200 Mark Nauwelaerts * gst/flv/gstflvdemux.c: flvdemux: remove obsolete reverse playback code path 2010-03-31 14:40:50 +0200 Mark Nauwelaerts * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: flvdemux: support (pull mode) negative seek rate 2010-03-29 15:27:37 +0200 Mark Nauwelaerts * gst/flv/gstflvdemux.c: flvdemux: also check for segment stop for non-segment-seek 2010-03-30 16:50:10 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: push correctly sized flac header buffers Fixes #614353. 2010-03-30 07:34:07 -0500 Rob Clark * configure.ac: build: fix compiler warning when srcdir != builddir Fixes '../../gst-libs: No such file or directory' warning/error when the build directory is not the same as the source directory. Fixes #614354. 2010-03-30 01:50:32 +0100 Tim-Philipp Müller * gst/id3demux/id3v2frames.c: id3demux: fix parsing of unsynced frames with data length indicator Fixes bug #614158. 2010-03-29 11:00:04 +0100 Tim-Philipp Müller * common: * ext/Makefile.am: * gst/Makefile.am: * sys/Makefile.am: * tests/examples/Makefile.am: build: build plugins and examples in parallel where possible 2010-03-18 18:49:24 +0000 Tim-Philipp Müller * sys/directsound/gstdirectsoundsink.c: directsoundsink: fix redundant function redeclaration compiler warnings Re-apply this again as well, as it was undone by the previous commit.. 2010-03-18 14:31:35 +0100 Benjamin Otte * sys/directsound/gstdirectsoundsink.c: gst_element_class_set_details => gst_element_class_set_details_simple Apply this again, as it was overwritten by the previous commit. Merging is hard, apparently. 2010-03-26 23:20:10 +0100 Julien Moutte * sys/directsound/gstdirectsoundsink.c: * sys/directsound/gstdirectsoundsink.h: directsoundsink: Implement SPDIF support for AC3. Detect if the sound card supports SPDIF passthru of AC3 and add necessary code to support that like alsasink. 2010-03-26 17:06:57 +0000 Tim-Philipp Müller * Makefile.am: build: add cruft alert for common/shave* 2010-03-26 16:50:22 +0000 Tim-Philipp Müller * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_lang.c: * gst/qtdemux/qtdemux_lang.h: qtdemux: extract stream language in more cases The 16-bit language code can be either a packed ISO-639-2T code or a 'Macintosh language code'. Handle the latter type of language codes as well, and map to the matching ISO code. Lastly, fix language code posting for language #0, which is valid and stands for 'English'. Fixes #614001. 2010-03-26 14:55:53 +0100 Sebastian Dröge * ext/flac/gstflacdec.c: flacdec: Improve debugging and add some FIXMEs 2010-03-26 14:42:06 +0100 Sebastian Dröge * ext/flac/gstflacdec.c: flacdec: Sample rate markers 0x01, 0x02 and 0x03 are valid They are for 88.2kHz, 176.4kHz and 192kHz. 2010-03-26 14:16:39 +0100 Sebastian Dröge * ext/flac/gstflacdec.c: flacdec: Take samplerate, width and number of channels from the STREAMINFO ...and update it from the frame headers if it should change for some reason. This allows playback of files with odd sample rates. 2010-03-26 13:45:46 +0100 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix AYUV->I420 frame copying 2010-03-26 13:34:17 +0100 Raimo Järvi * ext/jpeg/gstjpegenc.c: jpegenc: Set correct getcaps/setcaps functions on srcpads and simplify them This fixes downstream negotiation, upstream negotiation isn't really supported by jpegenc yet. Fixes bug #613789. 2010-03-26 10:31:22 +0100 Sebastian Dröge * gst/videobox/gstvideobox.c: * gst/videobox/gstvideobox.h: videobox: Always fill the complete frame if borders should be added This makes sure that we don't get any gaps between rectangles because of chroma subsampling for example. 2010-03-18 22:12:40 +0000 Damien Lespiau * autogen.sh: autogen.sh: Don't call configure with --enable-plugin-docs configure gives a nice warning: configure: WARNING: unrecognized options: --enable-plugin-docs and indeed, I could not find anything in the configure.ac or the m4 macros that would allow enabling that option. Remove it then. 2010-03-22 16:58:26 +0100 Sebastian Dröge * gst/videobox/gstvideobox.c: * gst/videobox/gstvideobox.h: videobox: Refactor boxing to reduce code duplication 2010-03-22 13:13:59 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Simplify caps transformation 2010-03-21 20:14:19 +0100 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Add const qualifier to the source frame data 2010-03-23 17:47:48 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: only seek when in proper state ... and data structures can be thread-safely accessed. See #601617. 2010-03-23 17:34:50 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.h: matroskademux: support (pull mode) negative seek rate 2010-03-18 15:29:00 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: track clip duration in segment 2010-03-18 13:39:05 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: prefer index of video track to perform seeking 2010-03-24 16:19:53 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: fix typo in header validation check 2010-03-24 18:53:20 +0100 Edward Hervey * common: Automatic update of common submodule From 55cd514 to c1d07dd 2010-03-23 19:46:43 +0100 Edward Hervey * gst/icydemux/gsticydemux.c: * gst/icydemux/gsticydemux.h: icydemux: Handle upstream Content-Type. Allows us to handle ShoutCast TV (NSV) streams. If the upstream caps have the 'content-type' field set to video/nsv, then we shortcut the typefinding and set video/x-nsv directly. 2010-03-23 19:30:50 +0100 Edward Hervey * ext/soup/gstsouphttpsrc.c: souphttpsrc: Set the Content-Type HTTP header on the caps. First step to fixing ShoutCast (NSV) streaming. 2010-03-23 02:38:43 -0400 Tristan Matthews * sys/osxaudio/gstosxaudioelement.c: * sys/osxvideo/Makefile.am: osx: fix compiler warnings Added void parameter to avoid old-style definition warning. Added -Wno-aggregate-return flag to avoid erroneous aggregate return warning. https://bugzilla.gnome.org/show_bug.cgi?id=613663 2010-03-23 00:15:15 +0000 Tim-Philipp Müller * tests/check/elements/videocrop.c: tests: use loop test for long-running videocrop check This should avoid timeouts on slow machines. Fixes #597739. 2010-03-22 17:26:37 +0200 Stefan Kost * ext/flac/gstflac.c: * ext/pulse/plugin.c: * ext/wavpack/gstwavpack.c: * gst-libs/gst/gettext.h: * gst/multifile/gstmultifilesink.h: i18n: build fixes: #if -> #ifdef for ENABLE_NLS 2010-03-22 17:25:09 +0200 Stefan Kost * gst-libs/gst/gst-i18n-plugin.h: i18n: fix the build Don't inlcude locale.h which we include in gettext.h if needed. Guard the inlcude like we do in the simillar headers in core. 2010-03-21 17:46:06 +0100 Benjamin Otte * configure.ac: -Wold-style-definition is not valid for C++ 2010-03-21 17:36:28 +0100 Benjamin Otte * gst/multifile/gstmultifile.c: multifile: Include headers instead fo defining functions 2010-03-21 17:24:14 +0100 Benjamin Otte * configure.ac: Add a large set of warning flags. None of them trigger warnings anymore, so nothing needed to be fixed. 2010-03-21 17:23:43 +0100 Benjamin Otte * gst/goom/config_param.c: * gst/goom/convolve_fx.c: * gst/goom/filters.c: * gst/goom/flying_stars_fx.c: * gst/goom/goom_config_param.h: * gst/goom/goom_core.c: * gst/goom/goom_filters.h: * gst/goom/goom_fx.h: * gst/goom/ifs.c: * gst/goom/ifs.h: * gst/goom/plugin_info.c: * gst/goom/tentacle3d.c: * gst/goom/tentacle3d.h: Make goom not use aggregate returns 2010-03-21 15:17:46 +0100 Benjamin Otte * configure.ac: * ext/annodex/gstcmmlutils.c: * ext/wavpack/gstwavpackparse.c: * gst/effectv/gstwarp.c: * gst/rtp/gstrtph263pay.c: * gst/udp/gstmultiudpsink.c: * tests/check/elements/cmmldec.c: * tests/check/elements/cmmlenc.c: * tests/check/elements/deinterlace.c: * tests/check/elements/rglimiter.c: * tests/check/elements/rtp-payloading.c: * tests/check/elements/udpsink.c: * tests/check/elements/videofilter.c: * tests/check/elements/wavpackdec.c: * tests/check/generic/states.c: * tests/icles/v4l2src-test.c: Add -Wold-style-definition flag And fix the warnings 2010-03-20 00:54:14 +0100 Benjamin Otte * configure.ac: * ext/hal/hal.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: * ext/soup/gstsouphttpsrc.c: * ext/wavpack/gstwavpackcommon.c: * gst/avi/gstavimux.c: * gst/debugutils/gstpushfilesrc.c: * gst/flv/gstflvparse.c: * gst/goom/config_param.c: * gst/goom/goom_config_param.h: * gst/id3demux/id3tags.c: * gst/law/alaw-decode.c: * gst/law/alaw-encode.c: * gst/law/mulaw-decode.c: * gst/law/mulaw-encode.c: * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: * gst/qtdemux/qtdemux.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtsp/gstrtspsrc.c: * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: * gst/videofilter/gstvideobalance.c: * sys/oss/gstossmixertrack.c: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: * tests/check/elements/avimux.c: * tests/check/elements/level.c: * tests/check/elements/rtpbin_buffer_list.c: * tests/check/pipelines/simple-launch-lines.c: Add -Wwrite-strings to the configure flags ... and fix all warnings 2010-03-21 11:14:12 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: shapewipe: Add support for the remaining ARGB formats And handle AYUV like ARGB, we need no YUV specific handling. 2010-03-20 21:30:58 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Add support for RGB and xRGB input 2010-03-20 21:13:23 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Add support for ARGB input 2010-03-20 20:46:19 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Add support for generating ARGB output 2010-03-20 10:47:42 +0100 Sebastian Dröge * gst/videomixer/blend.c: * gst/videomixer/blend.h: * gst/videomixer/blend_mmx.h: * gst/videomixer/videomixer.c: videomixer: Add support for ABGR and RGBA Now all 4 ARGB variants are supported by videomixer. 2010-03-20 10:24:56 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Move chroma keying parameters into stack variables to prevent multiple pointer dereferences per pixel 2010-03-20 10:20:53 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Move color conversion matrixes into stack variables to speed up processing 2010-03-20 10:18:04 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Use correct matrixes to convert chroma keying color to YUV 2010-03-19 18:51:59 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Add support for different color matrixes 2010-03-19 18:21:19 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Rename and move functions as further preparation for supporting more color formats 2010-03-19 18:18:08 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Remove some unneeded calculations and instance struct fields And document the instance struct fields a bit better 2010-03-19 18:11:12 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Some preparations for supporting more color formats 2010-03-19 17:09:06 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: h264pay: fix config-interval property Use the same units for comparing the elapsed time against the interval. Fixes #613013 2010-03-19 16:44:00 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: * gst/alpha/gstalphacolor.h: alphacolor: Implement color-matrix support and use integer arithmetic only Alphacolor now uses the correct matrixes for SDTV and HDTV and can convert between them. 2010-03-19 15:03:43 +0100 Wim Taymans * configure.ac: * gst/rtsp/gstrtspsrc.c: rtsp: use GType from -base and bump required version Use the transport flags GType from -base and bump the required version of -base because of this. 2010-03-19 00:05:19 +0000 Tim-Philipp Müller * gst/apetag/Makefile.am: apetag: minor Makefile.am surgery -I$(top_srcdir)/gst-libs/ is already in $(GST_CFLAGS) 2010-03-04 22:12:35 +0100 Andoni Morales Alastruey * ext/raw1394/gst1394clock.c: dv1394src: Fix internal clock Fixes #593910. 2010-03-18 21:14:17 +0000 Tim-Philipp Müller * ext/dv/Makefile.am: * ext/esd/Makefile.am: * ext/libcaca/Makefile.am: * ext/pulse/Makefile.am: * ext/shout2/Makefile.am: * ext/speex/Makefile.am: * ext/wavpack/Makefile.am: * gst/auparse/Makefile.am: * gst/avi/Makefile.am: * gst/flx/Makefile.am: * gst/icydemux/Makefile.am: * gst/interleave/Makefile.am: * gst/matroska/Makefile.am: * gst/qtdemux/Makefile.am: * gst/replaygain/Makefile.am: * gst/rtp/Makefile.am: * gst/udp/Makefile.am: * gst/videomixer/Makefile.am: * gst/wavparse/Makefile.am: * sys/directsound/Makefile.am: * sys/oss/Makefile.am: * sys/waveform/Makefile.am: * tests/examples/v4l2/Makefile.am: build: Makefile.am cleanups Mostly add $(GST_BASE_CFLAGS) where it was missing, but also fix up order of flags and libs if needed (see docs/random/moving-plugins). 2010-03-18 18:49:24 +0000 Tim-Philipp Müller * sys/directsound/gstdirectsoundsink.c: directsoundsink: fix redundant function redeclaration compiler warnings 2010-03-18 19:00:09 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Remove remaining floating point arithmetic when processing a pixel 2010-03-18 18:55:34 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Refactor chroma keying into a single function This reduces code duplication once we add support for more color formats. 2010-03-18 14:31:35 +0100 Benjamin Otte * ext/aalib/gstaasink.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttimeoverlay.c: * ext/dv/gstdvdec.c: * ext/dv/gstdvdemux.c: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfaudiosrc.c: * ext/gconf/gstgconfvideosink.c: * ext/gconf/gstgconfvideosrc.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/hal/gsthalaudiosink.c: * ext/hal/gsthalaudiosrc.c: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokedec.c: * ext/jpeg/gstsmokeenc.c: * ext/libcaca/gstcacasink.c: * ext/libmng/gstmng.h: * ext/libmng/gstmngdec.c: * ext/libmng/gstmngenc.c: * ext/libpng/gstpng.h: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/mikmod/gstmikmod.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: * ext/shout2/gstshout2.c: * ext/soup/gstsouphttpsrc.c: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * gst/apetag/gstapedemux.c: * gst/audiofx/audioamplify.c: * gst/audiofx/audiodynamic.c: * gst/audiofx/audioinvert.c: * gst/audiofx/audiokaraoke.c: * gst/audiofx/audiopanorama.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: * gst/avi/gstavidemux.c: * gst/avi/gstavimux.c: * gst/cutter/gstcutter.c: * gst/debugutils/breakmydata.c: * gst/debugutils/efence.c: * gst/debugutils/gstnavigationtest.c: * gst/debugutils/gstnavseek.c: * gst/debugutils/gstpushfilesrc.c: * gst/debugutils/negotiation.c: * gst/debugutils/progressreport.c: * gst/debugutils/testplugin.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/goom2k1/gstgoom.c: * gst/icydemux/gsticydemux.c: * gst/id3demux/gstid3demux.c: * gst/law/mulaw-decode.c: * gst/law/mulaw-encode.c: * gst/level/gstlevel.c: * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/qtdemux/gstrtpxqtdepay.c: * gst/qtdemux/qtdemux.c: * gst/replaygain/gstrganalysis.c: * gst/replaygain/gstrglimiter.c: * gst/replaygain/gstrgvolume.c: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdvdepay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpg723depay.c: * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpsirendepay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/rtp/gstrtpvrawpay.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspgoogle.c: * gst/rtsp/gstrtspsrc.c: * gst/smpte/gstsmpte.c: * gst/smpte/gstsmptealpha.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: * gst/videocrop/gstaspectratiocrop.c: * gst/videocrop/gstvideocrop.c: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideotemplate.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: * gst/y4m/gsty4mencode.c: * sys/directsound/gstdirectsoundsink.c: * sys/oss/gstossmixerelement.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxvideo/osxvideosink.m: * sys/sunaudio/gstsunaudiomixer.c: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosrc.c: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2src.c: * sys/waveform/gstwaveformsink.c: * sys/ximage/gstximagesrc.c: gst_element_class_set_details => gst_element_class_set_details_simple 2010-03-18 14:02:30 +0100 Benjamin Otte * gst/oldcore/Makefile.am: * gst/oldcore/gstaggregator.c: * gst/oldcore/gstaggregator.h: * gst/oldcore/gstelements.c: * gst/oldcore/gstfdsink.c: * gst/oldcore/gstfdsink.h: * gst/oldcore/gstmd5sink.c: * gst/oldcore/gstmd5sink.h: * gst/oldcore/gstmultifilesrc.c: * gst/oldcore/gstmultifilesrc.h: * gst/oldcore/gstpipefilter.c: * gst/oldcore/gstpipefilter.h: * gst/oldcore/gstshaper.c: * gst/oldcore/gstshaper.h: * gst/oldcore/gststatistics.c: * gst/oldcore/gststatistics.h: Remove oldcore directory The elements have been unused for ages and all important ones have been replaced or copied elsewhere. 2010-03-18 13:45:08 +0100 Benjamin Otte * gst/avi/gstavidecoder.c: avi: Remove old file Seems to be leftover from the 0.4 days or so. 2010-03-18 12:44:53 +0100 Mark Nauwelaerts * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: * ext/pulse/pulseutil.c: pulse: use #ifdef rather than #if conditionals 2010-03-18 12:20:17 +0100 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: rtph264depay: do not call _push_ts with unneeded (and wrong) time parameter Fixes #613206. 2010-03-18 11:33:59 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: fix typo in header validation check 2010-03-18 01:51:19 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: put more information in the metadata Additional tags are: audiocodecid, videocodecid framerate and (in the non-live case) filesize. While at it, fix index rewriting to update duration and filesize values even if the index is empty. Fixes #613094. 2010-03-17 21:33:28 +0100 Benjamin Otte * configure.ac: * ext/jpeg/gstjpegenc.c: * ext/speex/gstspeexenc.h: * gst/goom/goom_config.h: * gst/goom/mathtools.h: * tests/check/elements/level.c: Add -Wundef to configure flags and fix the resulting warnings 2010-03-17 20:02:16 +0100 Benjamin Otte * configure.ac: -Wmissing-prototypes is not valid for C++ 2010-03-17 19:35:10 +0100 Benjamin Otte * configure.ac: * ext/flac/gstflacdec.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/jpeg/gstjpeg.h: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/soup/gstsouphttpsrc.c: * ext/wavpack/gstwavpackdec.c: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/equalizer/gstiirequalizer.c: * gst/replaygain/gstrganalysis.c: * gst/replaygain/gstrglimiter.c: * gst/replaygain/gstrgvolume.c: * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtsp/gstrtspsrc.c: * gst/videomixer/videomixer.c: * sys/v4l2/v4l2src_calls.c: Add -Wredundant-decls warning flag Also fix compile issues 2010-03-17 18:49:11 +0100 Benjamin Otte * gst/monoscope/gstmonoscope.h: Fix warnings in experimental plugins, too 2010-03-17 18:23:00 +0100 Benjamin Otte * configure.ac: * ext/annodex/gstannodex.c: * ext/annodex/gstcmmldec.h: * ext/annodex/gstcmmlenc.h: * ext/annodex/gstcmmlparser.c: * ext/annodex/gstcmmlutils.c: * ext/dv/gstdvdec.c: * ext/flac/gstflacenc.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/pixbufscale.h: * ext/jpeg/Makefile.am: * ext/jpeg/gstjpeg.c: * ext/jpeg/gstjpeg.h: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/wavpack/gstwavpackstreamreader.c: * ext/wavpack/gstwavpackstreamreader.h: * gst/debugutils/breakmydata.c: * gst/debugutils/gstnavseek.c: * gst/debugutils/rndbuffersize.c: * gst/debugutils/testplugin.c: * gst/deinterlace/tvtime/greedyh.asm: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/mmx.h: * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/goom/goom_fx.h: * gst/goom2k1/filters.c: * gst/goom2k1/filters.h: * gst/law/mulaw-conversion.c: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: * gst/multipart/multipart.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartdemux.h: * gst/multipart/multipartmux.c: * gst/multipart/multipartmux.h: * gst/qtdemux/gstrtpxqtdepay.c: * gst/rtp/fnv1hash.c: * gst/rtp/fnv1hash.h: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpac3depay.h: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpbvdepay.h: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpbvpay.h: * gst/rtp/gstrtpceltdepay.h: * gst/rtp/gstrtpceltpay.h: * gst/rtp/gstrtpdvdepay.h: * gst/rtp/gstrtpdvpay.h: * gst/rtp/gstrtpg723depay.h: * gst/rtp/gstrtpg723pay.h: * gst/rtp/gstrtpg726depay.h: * gst/rtp/gstrtpg726pay.h: * gst/rtp/gstrtpg729depay.h: * gst/rtp/gstrtpg729pay.h: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263depay.h: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtph264depay.h: * gst/rtp/gstrtph264pay.h: * gst/rtp/gstrtpilbcdepay.h: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpilbcpay.h: * gst/rtp/gstrtpj2kdepay.h: * gst/rtp/gstrtpj2kpay.h: * gst/rtp/gstrtpjpegdepay.h: * gst/rtp/gstrtpjpegpay.h: * gst/rtp/gstrtpmp1sdepay.h: * gst/rtp/gstrtpmp2tdepay.h: * gst/rtp/gstrtpmp2tpay.h: * gst/rtp/gstrtpmp4adepay.h: * gst/rtp/gstrtpmp4apay.h: * gst/rtp/gstrtpmp4gdepay.h: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtpmpvdepay.h: * gst/rtp/gstrtpmpvpay.h: * gst/rtp/gstrtppcmadepay.h: * gst/rtp/gstrtppcmapay.h: * gst/rtp/gstrtppcmudepay.h: * gst/rtp/gstrtppcmupay.h: * gst/rtp/gstrtpqdmdepay.h: * gst/rtp/gstrtpsirendepay.h: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpsirenpay.h: * gst/rtp/gstrtpspeexdepay.h: * gst/rtp/gstrtpspeexpay.h: * gst/rtp/gstrtpsv3vdepay.h: * gst/rtp/gstrtptheoradepay.h: * gst/rtp/gstrtptheorapay.h: * gst/rtp/gstrtpvorbisdepay.h: * gst/rtp/gstrtpvorbispay.h: * gst/rtp/gstrtpvrawdepay.h: * gst/rtp/gstrtpvrawpay.h: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspsrc.c: * gst/smpte/gstmask.c: * gst/smpte/gstmask.h: * gst/videobox/gstvideobox.h: * gst/videocrop/gstvideocrop.h: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: * gst/wavenc/gstwavenc.h: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/gstv4l2vidorient.h: * sys/ximage/ximageutil.c: * tests/check/elements/aspectratiocrop.c: * tests/check/elements/audioamplify.c: * tests/check/elements/audiochebband.c: * tests/check/elements/audiocheblimit.c: * tests/check/elements/audiodynamic.c: * tests/check/elements/audioecho.c: * tests/check/elements/audioinvert.c: * tests/check/elements/audiopanorama.c: * tests/check/elements/audiowsincband.c: * tests/check/elements/audiowsinclimit.c: * tests/check/elements/avimux.c: * tests/check/elements/avisubtitle.c: * tests/check/elements/cmmldec.c: * tests/check/elements/equalizer.c: * tests/check/elements/level.c: * tests/check/elements/matroskamux.c: * tests/check/elements/multifile.c: * tests/check/elements/rganalysis.c: * tests/check/elements/rglimiter.c: * tests/check/elements/rgvolume.c: * tests/check/elements/shapewipe.c: * tests/check/elements/souphttpsrc.c: * tests/check/elements/spectrum.c: * tests/check/elements/videofilter.c: * tests/check/elements/wavpackdec.c: * tests/check/elements/wavpackenc.c: * tests/check/elements/wavpackparse.c: * tests/check/elements/y4menc.c: * tests/check/generic/states.c: * tests/check/pipelines/simple-launch-lines.c: * tests/check/pipelines/wavpack.c: * tests/examples/equalizer/demo.c: * tests/examples/level/level-example.c: * tests/examples/spectrum/spectrum-example.c: * tests/icles/v4l2src-test.c: Add -Wmissing-declarations -Wmissing-prototypes warning flags And fix all the warnings. 2010-03-17 16:23:24 +0100 Wim Taymans * gst/rtp/gstrtpmp4gdepay.c: mp4gdepay: improve constantDuration guessing When no constantDuration has been given in the caps, try to derive one from the timestamp difference between packets. Also keep doing this for each packet because some broken streams might simply provide wrong timestamps. 2010-03-16 23:43:39 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: Put width and height in the metadata Some players use that info to scale their display. See #613094. 2010-03-16 23:32:45 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: don't put timestamps larger than G_MAXINT32 in the FLV tags For non-live input respond by pushing EOS, for live wrap the timestamps every G_MAXINT32 miliseconds. Fixes #613003. 2010-03-16 23:40:12 +0200 Stefan Kost * ext/soup/gstsouphttpsrc.c: soup: also use g_value_set_static_string() here for static strings 2010-03-16 21:23:11 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: alphacolor: Fix RGBA<->AYUV conversion 2010-03-16 21:16:26 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Remove redundant instance field 2010-03-16 21:10:08 +0100 Sebastian Dröge * gst/alpha/gstalpha.c: alpha: Protect property values from changes during frame processing 2010-03-15 23:29:55 +0300 Руслан Ижбулатов * ext/libpng/gstpngdec.c: pngenc: Use png_get_io_ptr() instead of accessing io_ptr directly Fixes #612700 (for the last time!) 2010-03-15 23:29:06 +0300 Руслан Ижбулатов * configure.ac: png: Check for libpng >= 1.2 instead of libpng12 2010-03-16 01:29:36 +0100 Jan Urbański * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: Always put a duration tag in the metadata Some Flash players (for instance JW Player) always expect a duration tag, otherwise they don't start playback. If duration can be queried from the sink pads or is provided as a tag, use it. Otherwise try to determine it from the last seen timestamp of the sink pads after EOS and rewrite it in the header before writing the index. 2010-03-16 00:35:46 +0100 Jan Urbański * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: Remove the send_codec_data field from GstFlvPad That field is not used anymore after the changes in 9fdecbc1c11f4e5af6578bba32a9b32771029d33. 2010-03-16 13:53:26 +0100 Wim Taymans * gst/udp/gstmultiudpsink.c: multiudpsink: get family of external sockets too Get the family of externally configured sockets so that we can configure it correctly. 2010-03-15 20:37:51 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: alphacolor: Add support for the remaining ARGB formats 2010-03-15 19:16:18 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: alphacolor: Simplify ARGB<->AYUV conversions by code generation macros 2010-03-15 19:07:28 +0100 Sebastian Dröge * docs/plugins/Makefile.am: * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: * gst/alpha/gstalpha.h: alpha: Minor cleanups and move declarations into a separate header file 2010-03-15 18:58:51 +0100 Sebastian Dröge * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: alpha: Use GstVideoFilter as base class for automatic QoS support 2010-03-15 18:50:11 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: * gst/alpha/gstalphacolor.h: alphacolor: Add support for inplace conversions from AYUV to ARGB 2010-03-15 18:14:19 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: * gst/alpha/gstalphacolor.h: alphacolor: Use libgstvideo for caps parsing 2010-03-15 18:09:55 +0100 Sebastian Dröge * gst/alpha/Makefile.am: * gst/alpha/gstalphacolor.c: * gst/alpha/gstalphacolor.h: alphacolor: Use GstVideoFilter as base class for automatic QoS support 2010-03-15 18:07:29 +0100 Sebastian Dröge * gst/alpha/gstalphacolor.c: alphacolor: Some minor cleanup 2010-03-15 14:16:58 +0100 Sebastian Dröge * ext/speex/gstspeexdec.c: * ext/speex/gstspeexdec.h: speexdec: Use speex_stereo_state_init() instead of the deprecated initialization macro Fixes bug #612777. 2010-03-15 01:09:49 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: Correctly mark buffers as delta units Mark video interframes, video codec data buffers and audio buffers (if it's not an audio-only stream) as delta units. 2010-03-14 19:32:20 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: Support streamheaders Put the FLV header, the metadata tag and (if present) codec information in the streamheader to allow the muxer to be used for streaming. 2010-03-14 01:38:21 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: Preallocate index space and fill it after finishing output Make the index appear at the beginning of the file, which is what most players are expecting. Fixes #601236. 2010-03-15 13:47:13 +0100 Sebastian Dröge * gst/flv/gstflvmux.c: flvmux: Minor coding style fixes and cleanup 2010-03-14 01:34:02 +0100 Jan Urbański * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: Add a is-live property If it is set, the muxer will not write the index. Defaults to false. 2010-03-14 01:25:42 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: Only put valid seek points in the index For files containing video only video keyframes are valid points to which a player can seek. For audio-only files any tag start is a valid seek point. See #601236. 2010-03-14 01:09:37 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: Fix index building to make entries point to tag's start offset Previous coding was wrongly incrementing the total byte count before adding an index entry. 2010-03-15 13:40:38 +0100 Sebastian Dröge * ext/cairo/gsttextoverlay.c: cairotextoverlay: Don't render text outside the frame boundaries Fixes bug #611986. 2010-03-15 11:38:23 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't forget to send keepalive messages When we operate in TCP mode, still send keepalive messages when we need to. Fixes #612696 2010-03-13 23:19:35 +0300 Руслан Ижбулатов * ext/libpng/gstpngenc.c: pngenc: Call png_jmpbuf() instead of accessing png_struct_ptr directly Fixes #612700 (again) 2010-03-12 16:44:30 +0300 Руслан Ижбулатов * ext/libpng/gstpngenc.c: pngenc: Call png_error() instead of using longjmp() directly. Fixes #612700 2010-03-12 13:57:28 +0100 Edward Hervey * common: Automatic update of common submodule From e272f71 to 55cd514 2010-03-05 11:06:47 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: add XMP parsing support Use xmp helpers to parse XMP metadata in udta atom. Fixes #609539 2010-03-11 12:32:56 -0800 Michael Smith * gst/udp/gstmultiudpsink.h: * gst/udp/gstudpnetutils.c: * gst/udp/gstudpnetutils.h: udp: fix compilation errors on non-windows. 2010-03-10 22:23:43 +0100 Andoni Morales Alastruey * gst/udp/gstmultiudpsink.c: * gst/udp/gstmultiudpsink.h: * gst/udp/gstudpnetutils.c: * gst/udp/gstudpnetutils.h: multiudpsink: avoid getting the socket family using getsockname() 2010-03-11 17:28:47 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Fix print statements for pointer differences. This fixes it for both 32 and 64 bit 2010-03-11 17:28:35 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Fix unitialized variables 2010-03-11 17:03:47 +0100 Edward Hervey * gst/flv/gstflvdemux.c: flvdemux: Fix printf formatting for macosx 2010-03-11 17:03:05 +0100 Edward Hervey * gst/flv/gstflvdemux.c: flvdemux: Fix unitialized variables 2010-03-11 17:02:44 +0100 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Fix unitialized variable. 2010-02-19 13:39:04 +0100 Edward Hervey * gst/flv/gstflvparse.c: flvparse: Make script tag parsing more flexible. * The nb_elements for arrays is just an indication, we can therefore ignore it and carry on parsing metadata items until we reach the end marker. * If type == 3, then the script tag contains a list of object followed by the end marker. Refactor code slightly to handle both cases https://bugzilla.gnome.org/show_bug.cgi?id=610447 2010-03-11 15:51:40 +0000 Tim-Philipp Müller * tests/check/elements/deinterleave.c: * tests/check/elements/interleave.c: tests: fix metadata not writable warnings in interleave and deinterleave tests 2010-03-11 15:38:19 +0000 Tim-Philipp Müller * tests/check/elements/apev2mux.c: * tests/check/elements/id3v2mux.c: tests: fix metadata not writable warnings with apev2mux and id3v2mux tests 2010-03-11 15:24:20 +0000 Tim-Philipp Müller * ext/soup/gstsouphttpsrc.c: souphttpsrc: fix metadata writable warnings Set metadata on buffer first, when the refcount is still 1, and only ref again afterwards. 2010-03-11 15:02:48 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: ignore stream with invalid header time metadata 2010-03-08 14:57:17 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Set stream-format=raw on AAC caps Set stream-format=raw for AAC caps, as that is the expected AAC format to be in this container family. Fixes #566250 2010-03-11 12:56:11 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: check for NULL before doing strcmp Check the connection and address type for NULL before doing strcmp and crashing. Fixes #612553 2010-03-11 11:20:59 +0100 Benjamin Otte * common: Automatic update of common submodule From df8a7c8 to e272f71 2010-03-11 11:09:55 +0200 Stefan Kost * gst/udp/gstudpnetutils.c: build: include stdlib.h for atoi() 2010-03-11 10:33:00 +0200 Stefan Kost * gst/audiofx/audiopanorama.c: audiopanorama: move invariant check out of the inner loop Improves performance for simple method. 2010-03-10 22:15:04 +0100 Benjamin Otte * configure.ac: Update CXXFLAGS, too, just like CFLAGS 2010-03-10 21:01:20 +0100 Benjamin Otte * configure.ac: * gst/rtpmanager/Makefile.am: * tests/check/Makefile.am: Update for recent changes to common submodule This just replaces every "$ERROR_CFLAGS" usage with a usage of "$WARNING_CFLAGS $ERROR_CFLAGS" to get the same functionality as previously. Actually using that separation will happen later. 2010-03-10 21:52:09 +0100 Benjamin Otte * common: Automatic update of common submodule From 9720a7d to df8a7c8 2010-03-10 20:43:57 +0100 Benjamin Otte * common: Automatic update of common submodule From 0b6e072 to 9720a7d 2010-03-10 10:51:28 -0800 Andoni Morales Alastruey * gst/udp/gstmultiudpsink.c: multiudpsink: Reset windows error code after getting corresponding error message. 2010-03-09 17:32:27 -0800 Michael Smith * gst/avi/gstavimux.c: * gst/avi/gstavimux.h: avimux: put the codec_data blob into the actual data for MPEG4 video, to match other implementations in the wild. 2010-03-10 16:09:56 +0100 Benjamin Otte * common: Automatic update of common submodule From 7cc5eb4 to 0b6e072 2010-02-23 21:06:55 -0300 Thadeu Lima de Souza Cascardo * sys/ximage/gstximagesrc.c: ximagesrc: send new_segment with GST_FORMAT_TIME format Instead of using BaseSrc default format GST_FORMAT_BYTES, send it in GST_FORMAT_TIME. Signed-off-by: Thadeu Lima de Souza Cascardo Fixes #611659 2010-03-10 11:46:06 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: push mode; also report seekable without an element index ... since recent code also seeks around to obtain required data from avi index. 2010-03-09 18:06:52 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: add some check and standardized seek event handling in push mode 2010-03-09 18:05:29 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: fix offset handling in push mode seeking Push mode seeking uses same index data as pull mode, and stores offset to data in chunk, whereas push mode operates in chunks, and as such needs offset consistently corresponding to chunk headers. Also fix determining best matching stream for incoming newsegment event, as well as setting some stream state accordingly. 2010-02-26 21:29:49 +0100 Mark Nauwelaerts * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: flvdemux: conduct index scan in task thread ... rather than in seeking thread, which might then occupy mainloop for some time with possible unresponsive side-effects. 2010-02-26 21:27:33 +0100 Mark Nauwelaerts * gst/flv/gstflvparse.c: flvdemux: avoid indefinite index growth That is, check for and do not add an index entry that has already been added. 2010-02-18 14:57:39 +0100 Mark Nauwelaerts * gst/flv/gstflvparse.c: flvdemux: also collect index info on-the-fly in pull mode 2010-02-18 12:42:31 +0100 Mark Nauwelaerts * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: * gst/flv/gstflvparse.h: flvdemux: incrementally build index in pull mode Scan for needed part upon a seek as opposed to doing a complete scan at startup, which may take some time depending on file and/or platform. Also accept index metadata in pull mode and peek for some metadata at the end of the file when deemed appropriate. 2010-02-18 12:26:46 +0100 Mark Nauwelaerts * gst/flv/gstflvdemux.c: flvdemux: some more variable cleanup 2010-03-09 18:25:23 +0100 Mark Nauwelaerts * gst/flv/gstflvparse.c: flvdemux: refactor adding index entry 2010-02-17 11:36:13 +0100 Mark Nauwelaerts * gst/flv/gstflvparse.c: flvdemux: fix setting DELTA_UNIT flag on outgoing buffers ... which should not depend on having index available or not. Also refactor resulting collapsed code. 2010-02-11 19:43:47 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: avoid erroneous codec-data overriding of stsd information 2010-02-01 22:37:30 +0100 Mark Nauwelaerts * ext/speex/gstspeexdec.c: speexdec: adapt to new oggdemux Remove all granulepos hacks and simply use upstream timestamps. 2010-02-01 22:36:02 +0100 Mark Nauwelaerts * ext/speex/gstspeexdec.c: * ext/speex/gstspeexdec.h: speexdec: refactor granulepos hacks 2010-03-10 11:19:46 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: parse connection information Parse the connection information from the SDP and use it to figure out if we are dealing with ipv4 or ipv6 connections. 2010-03-09 17:53:32 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: require a destination for multicast When setting up the multicast sockets, we need a destination address to listen on or else we error. 2010-03-09 17:52:35 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: handle ipv6 listening ports when needed Add some code to make udpsrc listen on an ipv6 address when needed. The detection of IPV6 is not yet implemented. 2010-03-09 17:15:16 +0100 Wim Taymans * gst/udp/gstudpsink.c: * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.c: * gst/udp/gstudpsrc.h: udp: use uri parsing code Use the uri parsing helper functions to manage the host and port pairs. This adds support for IPV6. 2010-03-09 17:13:31 +0100 Wim Taymans * gst/udp/gstudpnetutils.c: * gst/udp/gstudpnetutils.h: udpnetutils: add helper functions for udp uri handling Add some helpers to parse udp uris. Make sure IPV6 is supported too. 2010-03-05 16:08:45 +0100 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpsession: Make it possible to favor new sources in case of SSRC conflict Add a "favor-new" property that tells the session to favor new sources when there is a SSRC conflict. This is useful for SIP calls and other such cases where a remote loop is extremely unlikely. Fixes #607615 2010-03-05 15:46:48 +0100 Olivier Crête * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpsession: Move SSRC conflicts lists into RTPSource We will also need to track SSRC conflicts in remote sources. See #607615 2010-02-26 17:13:49 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: send keep alive when paused When we are paused, send keep alive messages to the server so that our session doesn't time out when we go back to playing later. 2010-03-10 01:10:07 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 7aa65b5 to 7cc5eb4 2010-02-23 19:48:10 -0800 David Schleef * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: Add key-frame option to next-file This allows segmenting of MPEG-TS files at key frames, which is exactly what is needed for Apple's HTTP streaming. 2010-03-09 21:32:47 +0000 Sebastian Dröge * common: Automatic update of common submodule From 44ecce7 to 7aa65b5 2010-03-08 20:17:58 +0000 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix autocropping for odd width/height differences 2010-03-08 20:02:19 +0000 Sebastian Dröge * gst/videobox/Makefile.am: * gst/videobox/gstvideobox.c: * gst/videobox/gstvideobox.h: videobox: Use libgstvideo for format specific stuff 2010-03-08 19:28:47 +0000 Sebastian Dröge * gst/audiofx/audioamplify.c: * gst/audiofx/audiodynamic.c: * gst/audiofx/audioecho.c: * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbaseiirfilter.c: * gst/audiofx/audioinvert.c: * gst/audiofx/audiokaraoke.c: * gst/audiofx/audiopanorama.c: audiofx: Sync properties to the stream time 2010-03-08 19:20:59 +0000 Sebastian Dröge * gst/videobox/Makefile.am: * gst/videobox/gstvideobox.c: videobox: Make properties controllable 2010-03-08 19:09:01 +0000 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Some cleanup 2010-02-28 15:47:50 +0100 Sebastian Dröge * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstop.c: * gst/effectv/gstquark.c: * gst/effectv/gstradioac.c: * gst/effectv/gstrev.c: * gst/effectv/gstripple.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gststreak.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: effectv: Use controller where possible, optimize a bit and make properties threadsafe 2010-02-26 16:35:17 +0100 Sebastian Dröge * pkgconfig/Makefile.am: build: Make some more rules silent if requested 2010-02-26 15:41:52 +0100 Sebastian Dröge * configure.ac: configure: Use automake 1.11 silent rules instead of shave if available This makes sure that we use something that is still maintained and also brings back libtool 1.5 support. 2010-03-08 22:57:34 +0100 Benjamin Otte * ext/libpng/gstpngenc.c: png: fractions don't allow doubles 2010-03-01 12:03:56 +0100 Benjamin Otte * gst/flx/gstflxdec.c: flx: fix description It's video, not audio 2010-03-09 17:45:27 +0000 Tim-Philipp Müller * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * win32/common/config.h: Back to development === release 0.10.21 === 2010-03-09 00:28:16 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.21 2010-03-09 00:24:45 +0000 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2010-03-09 00:09:34 +0000 Tim-Philipp Müller * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: Revert "Add 4:2:2, 4:1:1, and 4:4:4 output support" This reverts commit 637c26f61a2bd8d7b01f8b6d081d94da65f74557. === release 0.10.20 === 2010-03-08 23:42:51 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.20 2010-03-08 23:42:06 +0000 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2010-03-08 16:47:04 +0000 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: don't send second newsegment event in framed mode, fixes long playback delay Don't send another newsegment event if the upstream muxer/parser has already sent one (otherwise the sink will wait for $duration before starting playback). Fixes long delay until playback starts with flac-in-ogg files. Fixes #610959. 2010-03-05 13:49:31 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: configure multicast correctly Take the transport destination for multicast. Disable loop and autojoin for multicast on the udpsinks. 2010-03-05 13:47:33 +0100 Wim Taymans * gst/udp/gstmultiudpsink.c: multicast: always configure loop and ttl Also configure TTL and loop parameters when we add a client after initializing the sender. 2010-03-08 12:13:32 +0100 Wim Taymans * gst/rtp/gstrtph263depay.c: Revert "rtph263depay: baseclass handles timestamps for us" This reverts commit 564581e1b88ecd5ec5da82c3cafb0e7a2d58b302. If we don't call push_ts, there will be no timestamp at all on the outgoing buffer. Fixes #612154 2010-02-23 22:16:39 -0500 Benjamin M. Schwartz * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: Add 4:2:2, 4:1:1, and 4:4:4 output support 2010-03-02 13:21:24 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: use payload size to estimate bitrate Use the length of the payload for estimating the receiver bitrate so that it matches the calculations done on the sender side. Together with the number of packets one can scale the bitrate with the header overhead of the lower transport. 2010-03-02 12:39:20 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpsource: refactor bitrate estimation Don't reuse the same variable we need for stats for the bitrate estimation because we're updating it. Refactor the bitrate estimation code so that both sender and receivers use the same code path. 2010-03-01 16:40:27 -0500 Tristan Matthews * gst/rtpmanager/rtpsource.c: added bitrate estimation to receiver-side stats, fixes #611213 2010-03-01 16:01:24 +0100 Wim Taymans * gst/rtp/gstrtph263pay.c: h263pay: fix typo in debug === release 0.10.19 === 2010-03-06 00:43:03 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shapewipe.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.19 2010-03-06 00:42:09 +0000 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2010-03-03 20:29:30 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.18.4 pre-release 2010-03-02 18:29:41 +0100 Edward Hervey * gst/matroska/matroska-demux.c: matroskademux: Make sure we don't send invalid newsegments Fixes #611501 2010-03-02 14:09:14 +0100 Edward Hervey * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: matroskademux: Mark streams as being EOS at the right time. This allows us to stop streaming only when all streams have gone past the segment.stop and not before. Fixes #611501 2010-02-26 18:10:32 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Advance sparse streams only as much as required to keep the gap smaller than 500ms Changing it to the newest timestamp that was ever pushed will increase the segment start in 500ms jumps, which could be just after the next sparse stream buffer. E.g. Video at 1.0s, sparse stream at 0.5s would jump the sparse stream to 1.0s. Now a new sparse stream buffer could appear that has a timestamp of 0.9s and this would be dropped for no good reason because of bad luck. 2010-02-24 01:36:07 +0000 Tim-Philipp Müller * configure.ac: * po/es.po: * win32/common/config.h: 0.10.18.3 pre-release 2010-02-24 02:05:49 +0100 Alessandro Decina * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: Make sure FLUSH_STOP is sent so not to leave downstream flushing. 2010-02-23 17:25:54 +0100 Volker Grabsch * configure.ac: configure: Use $PKG_CONFIG instead of pkg-config to fix cross compilation Fixes bug #610839. 2010-02-23 17:24:03 +0100 Sebastian Dröge * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: Reset skew detection after instantiating the jitterbuffer ...not only when going to READY. This sets high_level and friends to a more useful value. 2010-02-23 17:19:14 +0100 Sebastian Dröge * gst/rtpmanager/rtpjitterbuffer.c: rtpjitterbuffer: Return 100 if high-level is 0 instead of dividing by zero 2010-02-22 12:24:14 +0100 Wim Taymans * gst/rtp/gstrtpmp4gdepay.c: rtpmp4gdepay: avoid division by 0 Avoid a division by 0 when no constantDuration was specified and when out two timestamps are equal. Fixes #610265 2010-02-22 18:20:46 +0100 Wim Taymans * gst/rtp/gstrtpdvdepay.c: * gst/rtp/gstrtpdvdepay.h: dvdepay: don't output frames until we have a header Wait for the complete first 6 header DIF packets before outputting a frame. Decoders need this info to correctly decode the data. Fixes #610556 2010-02-22 20:55:29 +0100 David Hoyt * ext/jpeg/gstjpegdec.c: jpegdec: Fix invalid memory access by first checking and then reading Fixes bug #610483. 2010-02-18 09:05:50 +0100 Philippe Normand * ext/pulse/pulsesink.c: pulsesink: gst_pulsesink_get_mute: set result earlier. In the cases where no buffer was process yet or the index is not available, get_pulsesink_get_mute() would unconditionally return FALSE. https://bugzilla.gnome.org/show_bug.cgi?id=610337 2010-02-19 12:35:29 +0000 Tim-Philipp Müller * pkgconfig/gstreamer-plugins-good-uninstalled.pc.in: pkgconfig: fix gstreamer-plugins-good uninstalled .pc file Fix gst-plugins-base reference/requirement. This caused spurious problems with uninstalled -ugly/-bad not finding -good plugins in their unit tests (when distchecking). 2010-02-19 01:03:31 +0000 Tim-Philipp Müller * configure.ac: * po/lv.po: * win32/common/config.h: 0.10.18.2 pre-release 2010-02-19 00:54:13 +0000 Tim-Philipp Müller * tests/check/elements/.gitignore: * tests/examples/shapewipe/.gitignore: Make git ignore shapewipe examples and tests 2010-02-19 00:46:40 +0000 Tim-Philipp Müller * gst/flv/gstflvparse.c: flvdemux: minor micro-optimisation We know these values don't change during the loop, but the compiler doesn't and has to re-check them for every iteration. 2010-02-19 00:39:50 +0000 Tim-Philipp Müller * gst/flv/gstflvparse.c: flvdemux: remove static keyword from variables that shouldn't be static Multiple flvparse/flvdemux instances should be able to operate without trampling over each other by accidentally re-using the same (static) variables. (Spotted by Mark Nauwelaerts) 2010-02-16 02:07:07 +0000 Tim-Philipp Müller * gst/rtpmanager/gstrtpjitterbuffer.c: docs: add Since: markers for new jitterbuffer properties 2010-02-18 18:20:24 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Fix off-by-one logic error in frame rate cap regression commit 2010-02-17 16:27:33 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Use the correct duration when comparing segments Do not confuse QtDemuxSegments with GstSegments when comparing the total file duration with the segment duration Fixes #610296 2010-02-17 18:06:29 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: add durations modulo 1<<32 For calculating the durations of each sample, we are supposed to add each duration modulo 1<<32 so make the elapsed time counter a uint32. Fixes #610280 2010-02-16 21:05:24 +0100 Anders Skargren * gst/multipart/multipartdemux.c: multipartdemux: improve header mime-type parsing Make the handing of the mime type within the "boundary" a bit less naive. The standard for MIME allows parameters to follow the "type" / "subtype" clause separated from the mime type by ';'. Modifies the multipartdemuxer's header parsing so it doesnt assume the whole line after "content-type:" is the mime type and thus makes it a bit more resilient to finding absurd mime types in the case where parameters are added. Fixes #604711 2010-02-16 19:53:09 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: avoid stopping NULL tasks Check the task for NULL, it could be paused and set to NULL before. 2010-02-16 16:22:28 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix ALAC codec-data handling ALAC codec-data apparently comes in (at least) two flavours (mov, mp4), so use atom based parsing to retrieve required data, rather than aiming for a specific offset. See also #580731. 2010-02-16 15:50:23 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix debug message 2010-02-11 19:39:04 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_types.h: qtdemux: handle signed values in 3GPP location tag 2010-02-08 21:35:53 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: fix typo in debug message 2010-02-16 15:00:13 +0100 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: reset some more stream state after seek In particular, fixes non-flushing seek. 2010-02-16 14:44:11 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Fix frame rate cap regression Look for a non-zero min_duration during initialisation to avoid incorrect frame rate caps. 2010-02-16 10:13:17 +0200 Stefan Kost * sys/v4l2/gstv4l2bufferpool.c: v4l2: log more details in buffer pool finalize Helps to align with the loggin from libv4l. 2010-02-16 10:11:40 +0200 Stefan Kost * sys/v4l2/gstv4l2object.c: v4l2: init datastructures after pre-conditions checks 2010-02-16 10:10:45 +0200 Stefan Kost * ext/jpeg/gstjpegenc.c: jpegenc: add a fixme for handling other YUV variants 2010-02-16 01:40:19 +0000 Brian Cameron * gst/matroska/matroska-demux.c: matroska: fix GST_ELEMENT_ERROR usage Fixes #610053. 2010-02-16 00:50:15 +0000 Tim-Philipp Müller * configure.ac: configure: fix up GST_CXXFLAGS properly We don't want C specific flags in GST_CXXFLAGS, so base it on the GST_CFLAGS that only contains the pkg-config CFLAGS but none of the GST_OPTION_CFLAGS. Also, we only need the local includes once. Fix typo as well (GST_FLAGS -> GST_CFLAGS). 2010-02-15 23:13:46 +0200 Stefan Kost * configure.ac: configure: base GST_CXXFLAGS on --cflags from pkg-config pkg-config sets GST_CFLAGS and GST_LIBS. We need to use CFLAGS as a starting point for for both C and CXX settings. 2010-01-20 18:52:51 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpsession.c: rtpbin: remove use of ntp_ns_base 2010-01-20 18:22:20 +0100 Wim Taymans * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpstats.h: rtpbin: remove more ntpnstime and cleanups Remove some code where we pass ntpnstime around, we can do most things with the running_time just fine. Rename a variable in the ArrivalStats struct so that it's clear that this is the current system time. 2010-01-20 18:19:34 +0100 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: use running_time for jitter Use the running_time to calculate the jitter instead of the ntp time. Part of the plan to get rid of ntpnsbase. 2010-01-20 17:04:03 +0100 Wim Taymans * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpbin: change how NTP time is calculated in RTCP Don't calculate the NTP time based on the running_time of the pipeline but from the systemclock. This allows us to generate more accurate NTP timestamps in case the systemclock is synchronized with NTP or similar. 2010-02-15 12:12:36 +0000 Tim-Philipp Müller * sys/v4l2/v4l2_calls.c: v4l2: printf format string fix The compiler wants a cast here even though the type is already typedefed as 64-bit integer (presumably because glib has typedefed guint64 to unsigned long here). 2010-02-15 10:33:02 +0000 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska: fix printf format string 2010-02-15 00:50:10 +0000 Tim-Philipp Müller * ext/raw1394/gst1394clock.h: * gst/matroska/ebml-write.h: * gst/rtpmanager/gstrtpjitterbuffer.h: raw1394, matroska, rtpmanager: remove padding from structures None of these element and class structures are in public headers, so don't need padding. 2010-02-15 00:47:11 +0000 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update for new translator comment 2010-02-15 00:45:51 +0000 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulsesink: add comment for translators for 'x by y' message Fixes #609724. 2010-02-15 01:28:44 +0100 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Fix leaking of pad templates 2010-02-15 00:50:27 +0100 Sebastian Dröge * tests/check/elements/shapewipe.c: shapewipe: Fix unit test for latest changes Now the alpha is multiplied with the already existing alpha value instead of simply ignoring it and the luma/chroma values are kept, even if the output is 100% transparent. 2010-02-15 00:47:08 +0100 Sebastian Dröge * tests/check/elements/shapewipe.c: shapewipe: Improve unit test output on errors 2010-02-14 23:17:20 +0100 Sebastian Dröge * common: Automatic update of common submodule From 96dc793 to 44ecce7 2010-02-13 23:28:06 +0000 Tim-Philipp Müller * configure.ac: configure: bump -base requirement to git For GST_RIFF_TAG_JUNQ. 2010-02-12 16:11:30 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2.c: v4l2sink: change rank to NONE so it is never autoplugged 2010-02-13 18:18:42 +0100 Edward Hervey * gst/flv/gstflvparse.c: flvdemux: Audio tags without any content are valid. We silently ignore them instead of erroring out. 2010-02-13 18:07:50 +0100 Edward Hervey * gst/flv/gstflvparse.c: flvdemux: Fix GST_CLOCK_DIFF usage. It was previously checking for DIFF(a, b > 6 * GST_SECOND) instead of the proper DIFF(a,b) > 6 * GST_SECOND 2010-02-13 16:27:07 +0100 Edward Hervey * gst/flv/gstflvdemux.c: flvdemux: Don't forget to reset the indexed variable when cleaning up 2010-02-13 11:01:53 +0100 Edward Hervey * gst/flv/gstflvparse.c: flvdemux: Speedup GstIndex usage Used the _add_associationv variant of GstIndex since we know how many associations we're adding. Trims up to 50% from index generation time. Note : It would be great if the index could be generated on the fly or on request as opposed to being fully created at startup. 2010-02-12 19:32:27 +0100 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: don't resync to invalid timestamps If we detect backward timestamps on the server, don't try to resync when we don't have an input timestamp (such as when using RTSP over TCP) instead, do nothing but assume the timestamp was ok, it will correct itself when time goes forwards. 2010-02-12 17:21:43 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: fix typo 2010-02-12 16:47:29 +0100 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: start out active and not buffering There is no need to set the latency in the jittebuffer in _init, we will set that later when going to PAUSED. Set the jitterbuffer active and not buffering when starting. 2010-01-27 17:57:55 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: rtpbin: more buffering work When deactivating jitterbuffers when the buffering starts, keep the current percent of the jitterbuffer and also set the jitterbuffer in the buffering state so that we know when it's filled again. Add property to get the buffering percentage of the jitterbuffer. 2009-10-14 16:29:35 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: adjust latency in buffer mode When we are in buffer mode, adjust the buffering low/high thresholds based on the total configured latency. If we don't and there is a huge queue or element with a big latency downstream we might drain the complete queue immediately and start buffering again. 2009-10-12 11:54:07 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: add ts-offset to timestamp Add the ts-offset to the buffer timestamp to get the final output timestamp of the buffer. 2009-10-08 19:23:53 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/rtpjitterbuffer.c: rtpbin: do more accurate buffer offsets Return the next timestamp in the jitterbuffer. Use the min-timestamp of the jitterbuffers to calculate an offset so that the next timestamp is pushed with a timestamp equal to running_time. Start producing timestamps from 0 in the buffering case too. 2009-10-08 18:42:11 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: only start buffering when < 100% Only start buffering when the percentage message is < 100 %. 2009-10-06 13:34:34 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: keep track of elapsed pause time Keep track of the time we spend pausing the jitterbuffers when they were buffering and distribute this elapsed time to the jitterbuffers. Also keep the latency in nanosecond precision. 2009-10-06 13:33:15 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpjitterbuffer.h: jitterbuffer: keep track of offset Keep track of an outgoing offset that we add to each outgoing buffer to compensate for PAUSE when buffering. Adjust the offset when activating. 2009-10-06 13:30:54 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: report level using high watermark 2009-10-05 21:31:59 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtsp/gstrtspsrc.c: rtpbin: pass running_time to jitterbuffer pause Pass the current running time to the jitterbuffer when pausing or resuming so that it calculate the right offsets. Small cleanups and comments. Set the default rtspsrc latency to 2 seconds. 2009-10-05 20:09:30 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/rtpjitterbuffer.c: rtpbin: add some comments 2009-10-05 19:45:35 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: rtpbin: more buffering updates Add signal to pause the jitterbuffer. This will be emitted from gstrtpbin when one of the jitterbuffers is buffering. Make rtpbin collect the buffering messages and post a new buffering message with the min value. Remove the stats callback from jitterbuffer but pass a percent integer to functions that affect the buffering state of the jitterbuffer. This allows us then to post buffering messages from outside of the jitterbuffer lock. 2009-10-05 13:32:17 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: rtpbin: propagate buffer-mode property Propagate buffer-mode property to the jitterbuffers. Intercept BUFFERING messages in rtpbin 2009-10-01 17:14:09 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: jitterbuffer: do more buffering implementation Add callback for buffering stats. Configure the latency in the jitterbuffer instead of passing it with _insert. Calculate buffering levels when pushing and popping Post buffering messages. 2009-10-01 12:46:21 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: jitterbuffer: flesh out buffering mode some more Add a buffering state to the jitterbuffer and wait until buffering ends before pushing out packets. 2009-10-01 12:09:58 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: hook up the mode property Expose a mode property on the jitterbuffer. Fix the case where timestamps are -1 in the check for outgoing timestamps. 2009-10-01 11:20:08 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: jitterbuffer: add buffering mode options Add getters and setters for different buffering modes that the jitterbuffer will support. Default to the current slave mode. 2010-02-12 15:54:37 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2.c: v4lsink: lower rank to MARGINAL 2010-02-12 16:06:45 +0100 Robert Swain * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: flvdemux: Obtain the index from the end of an flv file in push mode Allows for better support of seeking in flv files when in push mode 2010-01-21 11:55:15 +0100 Robert Swain * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: Drop video frames up to the desired keyframe after a seek The audio packets in AVI are generally muxed ~0.5s before the corresponding video packet. This changes causes downstream to only receive packets with roughly corresponding timestamps. 2010-01-19 18:35:49 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: more DISCONT handling Add some debug in the DISCONT handling code. When we receive a DISCONT in push mode, mark all streams as DISCONT. 2010-01-19 10:51:08 +0100 Robert Swain * gst/avi/gstavidemux.c: avidemux: Fix _handle_seek_push () and new segement behaviour 2010-01-18 17:13:06 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: cleanups Make sure we reset the demuxer correctly wrt parsing the index. Don't leak pending seek events. Rename some methods to reflect what they do and to avoid confusion with similar method names. Try to make the seeking threadsafe by protecting the setup code with a lock. Make sure we post errors when a seek fails. 2010-01-18 11:45:38 +0100 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: rename some variables seek_event -> seg_event event_seek -> seek_event 2010-01-15 18:00:46 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: take fallback duration from avih When we have not parsed any indexes yet, we don't know the length of the streams and we must take the length given in the avih as a fallback. Avoid some typechecking. 2009-12-04 15:13:12 +0100 Robert Swain * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: Push mode seeking support 2010-02-01 16:04:41 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: cleanup properties Use more default constants. Use static strings param flag. Init properties explicitly instead of letting gobject do this. 2010-02-12 15:34:38 +0200 Stefan Kost * ext/speex/gstspeexdec.c: speex: add missing include 2010-02-05 13:28:53 +0200 Stefan Kost * gst/debugutils/gsttaginject.c: taginject: fix multi-value tag example We need to use {} to specify a list. 2010-02-01 14:43:04 +0200 Stefan Kost * gst/avi/gstavidemux.c: * gst/wavparse/gstwavparse.c: avi,wav: also handle JUNQ chunk in addition to JUNK 2010-02-04 15:59:25 +0100 Wim Taymans * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpmp2tpay.c: rtppay: don't ignore result from set_outcaps set_outcaps can fail and we need to propagate the result upstream. 2010-02-04 15:36:24 +0100 Wim Taymans * gst/flv/gstflvparse.c: flvparse: fix confusing debug messages 2010-01-27 13:28:13 +0100 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: add some more debug info 2010-01-27 13:26:46 +0100 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: avoid segfault when shutting down when we are shutting down, we might still receive state updates from pulseaudio but since we are unparented we should not do anything with the NULL parent anymore. 2010-01-26 18:33:27 +0100 Wim Taymans * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: fix timestamp problems When the pad with the highest framerate goes EOS, instead of not timestamping output buffers, intepollate timestamps and durations from the last seen ones. Fixes #608026 2010-02-12 11:32:40 +0100 Sebastian Dröge * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: Update documentation 2010-02-12 11:18:26 +0100 Sebastian Dröge * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-shapewipe.xml: * tests/check/Makefile.am: * tests/examples/Makefile.am: Moved 'shapewipe' from -bad to -good Fixes bug #584536. 2010-02-10 10:52:53 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 29/29] shapewipe: Preserve the input color values in all cases 2010-02-10 10:50:49 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 28/29] shapewipe: Scale mask alpha values by the source alpha values 2010-02-10 10:42:32 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 27/29] shapewipe: Fix ARGB processing 2010-02-10 10:34:24 +0100 Sebastian Dröge * tests/examples/shapewipe/shapewipe-example.c: [MOVED FROM BAD 26/29] shapewipe: Print some more details on error/warning messages 2010-02-08 08:26:33 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 25/29] shapewipe: Improve/add debug output 2010-02-08 08:20:44 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 24/29] shapewipe: Always hold the mask mutex before signalling the GCond 2010-02-08 08:19:48 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 23/29] shapewipe: Move chain function error cases at the end of the function and add useful debug output 2010-02-08 08:12:11 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: * gst/shapewipe/gstshapewipe.h: [MOVED FROM BAD 22/29] shapewipe: Fix race condition during shutdown that can lead to a deadlock 2010-02-08 08:11:33 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 21/29] shapewipe: Drop mask buffer on FLUSH events 2010-02-08 08:09:55 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: * gst/shapewipe/gstshapewipe.h: [MOVED FROM BAD 20/29] shapewipe: Update copyright year 2010-02-08 08:08:44 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 19/29] shapewipe: Don't reset properties when going PAUSED->READY Also use defines for the default values of the properties. 2010-01-16 16:52:11 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 18/29] shapewipe: Replace floating point arithmetic in the inner processing loops by integer arithmetic 2009-12-10 10:40:10 +0100 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 17/29] shapewipe: Don't do pointer dereferences in the processing loop Lowers the time taken there in my testcase from 6.91% to 6.20% as measured by callgrind. 2009-07-08 17:59:29 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 16/29] shapewipe: Add BGRA support for video in/output 2009-07-02 11:24:48 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: * gst/shapewipe/gstshapewipe.h: [MOVED FROM BAD 15/29] shapewipe: Add support for ARGB video input/output 2009-06-23 18:23:13 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 14/29] shapewipe: Correctly handle 0/1 fps 2009-06-09 19:14:41 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: * gst/shapewipe/gstshapewipe.h: [MOVED FROM BAD 13/29] shapewipe: Implement basic QoS This change is based on Tim's QoS implementation for jpegdec. 2009-06-09 18:45:19 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 12/29] shapewipe: Proxy queries on the video pads to the correct peers 2009-06-09 18:37:43 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 11/29] shapewipe: Proxy bufferalloc on the video sinkpad 2009-06-09 18:25:13 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 10/29] shapewipe: Try to work inplace if possible This saves one new, large allocation per frame for the most cases. 2009-06-04 08:56:14 +0200 Sebastian Dröge * tests/check/elements/shapewipe.c: [MOVED FROM BAD 09/29] shapewipe: Increase timeout of the unit test 2009-06-01 21:24:27 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 08/29] shapewipe: Fix some issues that were exposed by the new unit test 2009-06-01 21:24:12 +0200 Sebastian Dröge * tests/check/elements/shapewipe.c: [MOVED FROM BAD 07/29] shapewipe: Add unit test for shapewipe 2009-05-31 21:33:01 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 06/29] shapewipe: Add documentation and integrate into the build system 2009-05-29 21:07:26 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: [MOVED FROM BAD 05/29] shapewipe: Adjust border to still have everything transparent at 1.0 and the other way around 2009-05-29 16:55:25 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: * tests/examples/shapewipe/shapewipe-example.c: [MOVED FROM BAD 04/29] shapewipe: Divide the border value by two, otherwise we use a twice a wide border 2009-05-29 16:51:50 +0200 Sebastian Dröge * gst/shapewipe/gstshapewipe.c: * gst/shapewipe/gstshapewipe.h: * tests/examples/shapewipe/shapewipe-example.c: [MOVED FROM BAD 03/29] shapewipe: Add border property to allow smooth borders ...and use a border of 0.01 in the example application. 2009-05-29 16:00:16 +0200 Sebastian Dröge * tests/examples/shapewipe/Makefile.am: [MOVED FROM BAD 02/29] shapewipe: Fix Makefile of the example application 2009-05-29 15:32:24 +0200 Sebastian Dröge * gst/shapewipe/Makefile.am: * gst/shapewipe/gstshapewipe.c: * gst/shapewipe/gstshapewipe.h: * tests/examples/shapewipe/Makefile.am: * tests/examples/shapewipe/shapewipe-example.c: [MOVED FROM BAD 01/29] shapewipe: Add a simple shapewipe transition filter & example application 2010-02-06 18:19:27 +0100 Sebastian Dröge * ext/flac/gstflacdec.c: flacdec: Only flush the FLAC decoder if it wasn't created right before If the FLAC decoder is flushed, its state will be set to frame-sync mode, which will sync to the next *audio* frame and makes it ignore all headers. This prevented tags and everything else to show up when using flacdec in push mode. Fixes bug #608843. 2010-02-11 01:12:15 +0000 Tim-Philipp Müller * MAINTAINERS: Update MAINTAINERS 2010-02-12 00:03:09 +0000 Tim-Philipp Müller * configure.ac: configure: back to development Slushy freeze remains in effect. === release 0.10.18 === 2010-02-10 23:18:22 +0000 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.18 2010-02-10 23:17:21 +0000 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2010-02-10 20:36:56 +0000 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: temporary safety check to avoid crashes with a certain file Add temporary check to avoid crashes with a certain file when seeking until the real cause of this is figured out. See #609405. 2010-02-05 18:05:39 +0100 Robert Swain * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: skip unknown atoms when looking for moov Fixes bug #609107 2010-02-05 02:13:33 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.17.3 pre-release 2010-02-04 19:10:36 +0000 Tim-Philipp Müller * po/bg.po: * po/hu.po: po: update translations 2010-02-04 14:46:56 +0100 Robert Swain * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: Set the segment start time to the requested seek time for non-keyframe seeks 2010-02-04 12:00:03 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Fix time returned for index at a byte offset The logic for searching forwards/backwards was swapped 2010-02-01 19:22:24 +0100 Mark Nauwelaerts * ext/speex/gstspeexdec.c: speexdec: initialize stereo decoding state 2010-01-28 18:58:08 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: improve stream synchronization In particular, do not make it send newsegment updates that sort-of contradict the indented playback segment (e.g. start time). 2010-01-28 18:53:18 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: fix bridging (time) gaps in streams As a side effect, avoid sending newsegment updates with start times that go back and forth, which leads to bogus downstream running_time. Also fixes seeking in bug #606744. 2010-01-28 18:49:57 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: fix stream synchronization .. by initializing streams starting at 0, as that is basically where we 'seek to' at the start and assume streams to start elsewhere. Also enables newsegment update events for subtitle streams. 2010-02-02 13:41:03 +0200 Stefan Kost * ext/jpeg/gstjpegdec.c: jpeg: don't directly access message, some message have args This caused bogus messages, such as reported in bug #607471. 2010-02-02 00:02:34 +0000 David Hoyt * ext/libpng/gstpngdec.c: png: fix compilation with libpng 1.4 png_set_gray_1_2_4_to_8() has been deprecated for a while and was finally removed in libpng 1.4.x. Use png_set_expand_gray_1_2_4_to_8() instead. Fixes #608629. 2010-02-01 16:46:36 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: free transports on errors See #608564 2010-02-01 09:18:53 +0000 Tim-Philipp Müller * sys/v4l2/v4l2_calls.c: v4l2: fix unportable printf format 2010-01-30 15:18:48 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 15d47a6 to 96dc793 2010-01-27 17:53:07 +0100 Robert Swain * gst/flv/gstflvmux.c: flvmux: index timestamps should be in seconds, not milliseconds 2010-01-27 15:24:52 +0100 Mark Nauwelaerts * ext/speex/gstspeexdec.c: speexdec: free some more when resetting Fixes #608255. 2010-01-27 15:24:24 +0100 Mark Nauwelaerts * gst/rtp/gstrtpspeexpay.c: rtpspeexpay: fix occasional buffer leak Fixes #608255. 2010-01-27 15:22:46 +0100 Mark Nauwelaerts * ext/speex/gstspeexenc.c: speexenc: prevent invalid arithmetic if not setup yet Fixes #608255. 2010-01-27 16:34:21 +0100 Sebastian Dröge * gst/videomixer/blend_mmx.h: videomixer: Fix assembly register constraints Fixes bug #608209. 2010-01-27 01:56:03 +0000 Tim-Philipp Müller * configure.ac: * win32/common/config.h: 0.10.17.2 pre-release 2010-01-27 01:52:59 +0000 Tim-Philipp Müller * po/LINGUAS: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/el.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update translations 2010-01-27 01:49:49 +0000 Tim-Philipp Müller * tests/check/elements/.gitignore: checks: ignore deinterlace check binary 2010-01-27 01:18:51 +0000 Tim-Philipp Müller * configure.ac: configure: purge all mention of CVS 2010-01-26 11:18:28 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: ignore streams that finished When we receive an UNEXPECTED from a stream, move to the next stream and only go EOS when all streams are EOS. When selecting a stream to push, ignore streams that went EOS. Fixes #607949 2010-01-25 17:23:43 +0200 Stefan Kost * sys/v4l2/v4l2src_calls.c: v4l2src: don't deref NULL Error out when the pool gets shutdown. 2010-01-25 17:21:13 +0200 Stefan Kost * ext/jpeg/gstjpegenc.c: * sys/v4l2/v4l2src_calls.c: * tests/check/Makefile.am: Revert "v4l2src: don't deref NULL" This reverts commit 3d9d34bd60faeb940b36d992a47168fc895036ba. 2010-01-25 14:16:22 +0200 Stefan Kost * ext/jpeg/gstjpegenc.c: * sys/v4l2/v4l2src_calls.c: * tests/check/Makefile.am: v4l2src: don't deref NULL Error out when the pool gets shutdown. 2010-01-23 15:32:48 -0800 Michael Smith * ext/jpeg/gstjpegenc.c: jpegenc: when creating an overflow buffer, copy timestamps. 2010-01-23 14:47:55 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: dmb1 is a valid fourcc for Motion-JPEG 2010-01-23 14:20:02 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdeux: IV32 is also used for Indeo 3 video streams 2010-01-22 16:48:01 +0200 Stefan Kost * tests/icles/ximagesrc-test.c: build: no unused variables when disabling asserts 2010-01-21 23:17:40 -0300 Roland Krikava * gst/qtdemux/qtdemux.c: qtdemux: Avoid negative overflow on keyframe search Do not overflow negatively when searching a previous "keyframe" on audio streams. Could cause infinite loops on backwards playback Fixes #607718 2010-01-21 17:22:38 -0800 Peter van Hardenberg * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstjpegenc.h: jpegenc: enlarge buffer if libjpeg tells us it's out of space. Fixes buffer overflow on some high-quality, low-resolution jpeg encodes. 2010-01-21 19:24:22 +0100 Alessandro Decina * gst/qtdemux/qtdemux.c: qtdemux: fix compiler warnings under OS X. 2010-01-21 17:57:36 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: don't parse NULL indexes for some streams we might fail to fetch the index offsets. Don't try to parse NULL indexes in those cases. 2010-01-18 21:15:51 -0500 Olivier Crête * gst/rtp/gstrtpg729pay.c: rtpg729pay: ptime should is in nanoseconds https://bugzilla.gnome.org/show_bug.cgi?id=607403 2010-01-20 15:11:15 -0300 Thiago Santos * gst/wavenc/gstwavenc.c: * gst/wavenc/gstwavenc.h: wavenc: Post warning if file isnt finished properly When the pipeline is shut down and the file isn't finished properly, wavenc should post a warning. Fixes #607440 2009-05-27 13:51:44 +0200 Arnout Vandecappelle * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroskamux: make index size configurable. Added the 'min-index-interval' property to matroskamux, which determines how much time (nanoseconds) is left between keyframes stored in the index. Fixes #583985. 2010-01-20 16:28:31 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: rtph264pay: scale spspps_interval to milliseconds The spspps_interval is kept in seconds. Convert it to milliseconds before comparing it to another value in milliseconds. 2010-01-20 15:18:47 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: always keep media segments within total duration ... as opposed to only doing so following a seek. 2010-01-20 15:44:40 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: rtph264pay: rename spspps-interval property Rename the spspps-interval property to config-interval because it is nicer. 2010-01-19 18:37:31 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: skip RIFF and index in push mode When we are in push mode, we can encounter RIFF and idx tags in the data chunk when we are dealing with ODML files. In these cases, simply skip the chunks and continue streaming instead of going EOS. 2010-01-20 11:27:23 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: more DISCONT handling Add some debug in the DISCONT handling code. When we receive a DISCONT in push mode, mark all streams as DISCONT. 2010-01-20 11:26:34 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: reset on flush events When we receive a flush event on the sinkpad, reset the EOS state and the flowreturn of all streams. Also mark the streams with a DISCONT. 2010-01-20 11:22:04 +0100 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: rename some variable Rename the seek_event variable to seg_event because it really contains the newsegment event that needs to be pushed. 2010-01-20 00:54:03 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 14cec89 to 15d47a6 2010-01-18 14:49:26 -0500 Olivier Crête * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: Don't set profile-level-id in out caps The profile-level-id represents restrictions on what can be sent, it does not describe the stream. So it should be reflected in the sink caps of the payloader, not the src caps. https://bugzilla.gnome.org/show_bug.cgi?id=607353 2010-01-18 14:41:10 -0500 Olivier Crête * gst/rtp/gstrtph264pay.c: rtph264pay: Don't ignore the return value from set_outcaps https://bugzilla.gnome.org/show_bug.cgi?id=607353 2010-01-18 17:43:41 +0100 Sebastian Dröge * gst/deinterlace/tvtime/greedyhmacros.h: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: deinterlace: Fix license and copyright headers 2010-01-18 14:57:42 +0200 Stefan Kost * sys/v4l2/gstv4l2bufferpool.h: v4l2: move G_END_DECLS to the end 2010-01-18 14:55:38 +0200 Stefan Kost * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2bufferpool.h: v4l2: fix bufferpool file names in header comment 2010-01-15 18:15:14 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: avoid some typecasting 2010-01-15 18:13:24 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: avoid some type checks 2010-01-15 18:09:15 +0100 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: fallback to avih duration when we have not yet parsed the indexes (in push mode, for example) use the duration as given in the avih header instead of -1. 2010-01-15 13:32:32 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: g_free is NULL safe 2010-01-15 13:27:40 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: use DEMUX errors, instead of DECODE qtdemux should use DEMUX errors, and not DECODE Conflicts: gst/qtdemux/qtdemux.c 2010-01-14 19:16:19 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Minor refactor Replace repeated code with a function call 2010-01-14 17:11:13 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: Handle another kind of redirect trak Some traks might contain a redirect rtsp uri inside hndl atom (which is a dref atom entry). This commit makes qtdemux post a message when it finds one of these traks and there are no other traks. Fixes #597497 2010-01-14 16:13:08 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: Post error when reaching EOS without pads Post an error when EOS is reached and there are no src pads 2010-01-14 14:13:50 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Do not post empty redirect messages Some misinterpreted data could result in posting redirect messages with empty redirect strings. It is better not to post them. An example is the file on bug #597497 2010-01-14 18:19:25 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: polish last buffer end time usage That is, reset it upon seek, and note that (rarely) last pushed buffer time might precede segment start. 2010-01-13 16:48:46 +0200 Stefan Kost * gst/videomixer/blend_mmx.h: videomixer: use 'q' constraint instead of 'r' This avoids the "bad register name `%dil'" compilation errors on 32bit where because of 'r' gcc puts the value in a general purpose register and then tries to access the lower part as %dil/%sil which is not existing on 32bit. 'q' requests a-d registers 2010-01-13 16:44:58 +0200 Stefan Kost * gst/avi/gstavidemux.c: avi: add missing include for sscanf 2010-01-13 09:36:03 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer10bands.c: equalizer: Fix property description for the 3rd band of the 10band equalizer The frequency is actually 237 Hz, not 227 Hz. Fixes bug #606692. 2010-01-13 09:22:20 +0100 Kipp Cannon * gst/audiofx/audioamplify.c: audioamplify: Allow negative amplifications Fixes bug #606807. 2010-01-13 09:17:05 +0100 Sebastian Dröge * ext/taglib/gstapev2mux.cc: apev2mux: Don't call constructors directly, this leads to compiler errors with gcc 4.5 2010-01-12 17:39:05 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: use G_GSIZE_FORMAT for platform independent gsize qualifier Fixes build on macosx 2010-01-11 19:02:34 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: refactor eos sending when pausing loop Also, prevent hanging if no pads yet on which to send eos by posting a message instead. 2010-01-11 17:50:35 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: standardize seek handling ... which implies fixing some corner cases. 2010-01-11 15:14:06 +0100 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: use more generic xiphN_streamheader_to_codecdata helper 2010-01-11 17:50:04 +0100 Mark Nauwelaerts * gst/matroska/matroska-mux.c: matroskamux: reflow audio and video setcaps and improve logging Also ensure width and height are available as they are mandatory in matroska specs. 2010-01-11 11:42:43 -0800 Michael Smith * gst/qtdemux/qtdemux.c: qtdemux: fix offset for type 2 mp4a sound sample descriptions. Allows us to correctly find the esds (and thus the codec data) for such mp4a files. 2010-01-11 15:45:49 -0300 Thiago Santos * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: rtpmp4g(de)pay: Only handle raw aac rtpmp4g(de)pay should only handle raw AAC streams 2010-01-11 18:59:43 +0100 Sebastian Dröge * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Implement basic QoS This drops frames if they're too late anyway before blending and all that starts but QoS events are not forwarded upstream. In the future the QoS events should be transformed somehow and forwarded upstream. 2010-01-11 14:48:26 -0300 Thiago Santos * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4apay.c: rtpmp4a(de)pay: Only accept raw aac rtpmp4a(de)pay should only handle raw aac to conform to the RFC 2010-01-11 18:35:47 +0100 Sebastian Dröge * gst/videomixer/blend.c: * gst/videomixer/blend_mmx.h: videomixer: Add MMX implementations for I420 and all non-alpha RGB formats 2010-01-04 10:24:45 +0100 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/blend.c: * gst/videomixer/blend.h: * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_i420.c: * gst/videomixer/blend_mmx.h: * gst/videomixer/blend_rgb.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Refactor processing functions This allows easier plugging of optimized processing functions in the future, like for SSE or AltiVec. 2010-01-11 13:26:32 -0300 Thiago Santos * gst/avi/gstavimux.c: * gst/matroska/matroska-mux.c: avimux: matroskamux: rename aac's stream-format to raw AAC's none stream-format has been renamed to raw, rename on avimux and matroskamux as well 2010-01-11 12:07:29 -0300 Thiago Santos * gst/matroska/matroska-mux.c: matroskamux: Only accept raw aac makes matroskamux reject aac streams that are not in raw format (stream-format=none) Fixes #598350 2010-01-11 12:08:55 -0300 Thiago Santos * gst/avi/gstavimux.c: avimux: Only accept raw aac makes avimux reject aac streams that are not in raw format (stream-format=none) Fixes #598350 2010-01-11 10:38:10 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Oops. The gpointer cast is needed because of the const qualifiers on the data elements 2010-01-11 10:17:54 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Debug -> info level for a message for benchmarking index parsing The extra message output at higher levels affects the accuracy of the benchmark. 2010-01-11 10:05:10 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Don't check for NULL pointers or cast to gpointer as this is not needed 2010-01-08 13:55:05 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Refactor stbl sub-atom freeing. Free when index has been completely parsed. 2010-01-08 14:32:06 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Avoid whitespace commits due to inconsistent GNU indent behaviour 2010-01-11 00:10:34 +0000 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: remove newline at end of debug statement 2010-01-08 19:26:21 +0100 Havard Graff * gst/udp/gstmultiudpsink.c: multiudpsink: Compiler warning fixes for Windows Just simple missing casts Fixes bug #606438. 2010-01-08 18:04:14 +0100 Mark Nauwelaerts * ext/flac/gstflacenc.c: flacenc: fix seekpoints property copy-and-paste documentation 2010-01-06 17:06:53 +0100 Mark Nauwelaerts * ext/flac/gstflacenc.c: * ext/flac/gstflacenc.h: flacenc: optionally add a seek table API: GstFlacEnc:seekpoints Fixes #351595. 2010-01-08 11:33:02 -0300 Thiago Santos * gst/avi/gstavidemux.c: avidemux: Use more glib and be safer Be safer on sscanf by limiting string format sizes. Remove useless parameter and use g_strndup. 2010-01-08 10:44:44 -0300 Thiago Santos * gst/avi/gstavidemux.c: avidemux: Simplifying code Greatly simplify the IDIT chunk handling by using sscanf instead of 'manually' parsing. Also replaces strncasecmp and is_alpha/is_digit with glib versions. 2010-01-08 10:18:30 -0300 Thiago Santos * gst/avi/gstavidemux.c: avidemux: it's feb for february Fix typo in last commit. 2010-01-08 09:17:22 -0300 Thiago Santos * gst/avi/gstavidemux.c: avidemux: Parse and post IDIT dates Parses and post date tags contained in IDIT chunks. Fixes #503582 2010-01-07 17:25:05 +0100 Sebastian Dröge * gst/audiofx/audiofirfilter.c: * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: Add property for not draining the history on kernel changes Currently this only works if the kernel size doesn't change, in the future it will be possible to change the kernel size too without draining the complete history and without loosing anything. Partially based on a patch by Thiago Santos 2010-01-07 16:58:55 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: rtph264pay: remove weird memcmp code Use plain memcmp for comparing memory instead of the custom buggy one. Fixes #606198 2010-01-07 15:38:36 +0100 Edward Hervey * gst/level/gstlevel.c: level: fix typo in 'message' property description 2010-01-06 14:06:14 +0100 Mark Nauwelaerts * ext/flac/gstflacdec.c: flacdec: really use upstream timestamp if there is one See/fixes #603471. 2010-01-06 13:45:59 +0100 Wim Taymans * gst/rtp/gstrtpg729pay.c: rtpg728pay: remove unused adapter peek 2010-01-05 19:00:35 -0300 Thiago Santos * tests/check/elements/deinterlace.c: deinterlace: Improve passthrough tests Improve passthrough tests by forcing more specific interlaced/deinterlaced caps to be tested 2010-01-05 18:22:49 -0300 Thiago Santos * tests/check/elements/deinterlace.c: deinterlace: Adds some docs to the new tests Adds some docs explaining the utility functions of the check tests of deinterlace 2010-01-05 18:14:08 -0300 Thiago Santos * tests/check/elements/deinterlace.c: deinterlace: Adds tests for passthrough Adds tests for checking if the element really does passthrough in disabled mode and in auto (if the input is not interlaced) 2010-01-05 07:50:51 -0300 Thiago Santos * tests/check/Makefile.am: * tests/check/elements/deinterlace.c: deinterlace: Adds tests for caps acceptance Adds check unit tests for deinterlace for validating caps accepting and the expected caps output on the other pad 2010-01-04 13:43:00 -0300 Thiago Santos * tests/check/Makefile.am: * tests/check/elements/deinterlace.c: deinterlace: Adds basic check test Adds a basic check test for deinterlace element 2010-01-04 15:44:28 -0800 Michael Smith * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: qtdemux: Add support for wave-style audio in qt. Uses gstriff to parse the wave headers appropriately. Tested with MS-ADPCM content. 2009-12-31 17:09:03 -0500 Olivier Crête * tests/check/elements/rtp-payloading.c: tests: Add G.729 RTP payloader/depayloader test https://bugzilla.gnome.org/show_bug.cgi?id=606050 2009-12-31 16:52:30 -0500 Olivier Crête * gst/rtp/gstrtpg729pay.c: rtpg729pay: Simplify adapter usage https://bugzilla.gnome.org/show_bug.cgi?id=606050 2009-12-31 16:27:30 -0500 Olivier Crête * gst/rtp/gstrtpg729pay.c: rtpg729pay: Support ptime from caps https://bugzilla.gnome.org/show_bug.cgi?id=606050 2009-12-02 19:35:21 +0530 Olivier Crête * gst/rtp/README: rtp: Add maxptime to the README https://bugzilla.gnome.org/show_bug.cgi?id=606050 2010-01-05 19:03:06 +0100 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpg723depay.c: * gst/rtp/gstrtpg723depay.h: rtpg723depay: add G723 depayloader 2010-01-05 19:02:39 +0100 Wim Taymans * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729depay.h: rtpg729depay: remove unused variable 2010-01-05 18:33:25 +0100 Wim Taymans * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg723pay.h: rtpg723pay: rewrite payloader Handle all 3 packet sizes according to RFC 3551. Totally untested, we don't have a G723 encoder. Fixes #605882 2010-01-05 11:47:20 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: fix chunk counter 2010-01-04 19:44:53 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: more work at reducing loop overhead Try to avoid derefs when parsing the index. Save the state into the structures when we exit the loop instead of for each iteration. 2010-01-04 16:33:30 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: cleanups and make duration more accurate Make the QtDemuxSample struct smaller by keeping the duration and the pts_offset as their 32 bit values. Make some macros to calculate PTS, DTS and duration of a sample. Deref the sample index less often by keeping a ref to the sample we're dealing with. 2010-01-04 13:41:18 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: simplify logic to calculate duration Since we no longer store the timestamp and duration in nanoseconds, we can now simply store the duration as-is. 2010-01-01 16:42:57 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Store timestamps in mov format in the index This allows faster building of the index upon seeks so that scaling of timestamps only occurs when actually needed. 2009-12-18 13:54:46 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: make seeking in push mode work Move sample position checks into qtdemux_parse_samples where we can protect it with a lock. Refactor and make an qtdemux_ensure_index function. Rename qtdemux_do_push_seek to qtdemux_seek_offset in order to avoid confusion with gst_qtdemux_do_push_seek. 2009-12-18 12:44:27 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: move error code out of normal flow 2009-11-24 16:27:26 +0100 Robert Swain * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: Add push mode seek support for seeking to obtain the moov atom 2010-01-05 12:22:09 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix on-npt-stop signal warnings for RDT The RDT manager does not implement this signal so we need to check for it before trying to connect to it. 2010-01-05 09:47:00 +0000 Tim-Philipp Müller * sys/v4l2/gstv4l2src.c: v4l2src: fix memory leak in new uri handler code Don't leak a string everytime get_uri() is called and a device has been set. There's a limited number of devices, so just intern the string instead of doing more elaborate housekeeping and storing it in the instance struct or so. 2010-01-01 14:10:49 +0200 Stefan Kost * gst/avi/gstavimux.c: avimux: fix typo in warning message 2010-01-04 09:28:36 -0300 Robert Weidlich * ext/shout2/gstshout2.c: * ext/shout2/gstshout2.h: shout2send: Add 'public' property Adds a property to set 'public' flag on libshout, making the stream listed on the server's stream directory. Fixes #605269 2009-12-30 14:14:55 +0530 Arun Raghavan * gst/qtdemux/qtdemux.c: qtdemux: Add tags for average and maximum bitrate Fixes #599300. 2009-12-26 16:59:14 -0300 Thiago Santos * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: do not try to alloc really large buffers When nsamples_out is larger than nsamples_in, using unsigned ints lead to a overflow and the resulting value is wrong and way too large for allocating a buffer. Use signed integers and returning immediatelly when that happens. 2009-12-25 12:38:35 +0100 Wim Taymans * gst/videomixer/blend_ayuv.c: videomixer: optimize blend code some more Use more efficient formula that uses less multiplies. Reduce the amount of scalar code, use MMX to calculate the desired alpha value. Unroll and handle 2 pixels in one iteration for improved pairing. 2009-12-24 22:59:09 +0100 Wim Taymans * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_i420.c: * gst/videomixer/blend_rgb.c: videomixer: scale and clamp Scale and clamp to the max alpha values. 2009-12-24 22:50:31 +0100 Wim Taymans * gst/alpha/gstalpha.c: alpha: scale and clamp alpha to its full extend Convert the alpha value to 0->255 when setting and to 0->256 when using as a scaling factor. This makes sure we can reach the full opacity value of 0xff in all cases. 2009-12-24 22:23:01 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix some comments, remove property check Fix some comments, clarify some FIXMEs Remove the on-ntp-stop signal check now that the jitterbuffer is in -good and we know that it supports this signal. 2009-12-24 20:27:57 +0100 Wim Taymans * gst/videomixer/videomixer.c: videomixer: some trivial cleanups 2009-12-24 17:04:28 -0300 Thiago Santos * gst/rtsp/gstrtspsrc.c: rtspsrc: Parse all rtpinfo entries Do not forget to parse all rtp-info entries, instead of parsing the first one only. Fixes #605222 2009-12-22 12:44:50 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: perf tag should map to GST_TAG_ARTIST 2009-12-24 17:03:02 +0100 Wim Taymans * gst/interleave/interleave.c: interleave: fix weird indentation 2009-12-24 17:01:54 +0100 Wim Taymans * gst/rtp/gstrtph263ppay.c: rtph263ppay: use faster _adapter_copy() whem possible 2009-12-24 17:01:15 +0100 Wim Taymans * tests/examples/audiofx/firfilter-example.c: tests: use right type when passing vararg value 2009-12-23 17:50:34 +0100 Mark Nauwelaerts * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: flacdec: use a single decoder field for both push and pull mode 2009-12-23 17:03:32 +0100 Mark Nauwelaerts * ext/flac/gstflacdec.c: flacdec: fix possible hanging in pull mode seeking A seek in multi-sink pipeline typically leads to several seek events in a row, which could lead to sending several newsegments in a row without intermediate flushing. These would then accumulate, distort rendering times and as such lead to 'hanging'. 2009-12-23 19:39:05 +0100 Mark Nauwelaerts * gst/rtp/gstrtph264pay.c: rtph264pay: fix uninitialized variable 2009-12-23 13:09:54 +0100 Wim Taymans * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbispay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/rtp/gstrtpvrawpay.c: rtp: use boilerplate 2009-12-23 00:38:05 +0100 Wim Taymans * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpL16pay.h: rtpL16pay: convert to baseaudiopayload Use GstRTPBaseAudioPayload as the base class. This saves a lot of code and fixes a bunch of problems that were already solved in the base class. Fixes #853367 2009-12-23 00:30:49 +0100 Wim Taymans * gst/rtp/gstrtppcmapay.c: rtppcmapay: the boilerplate macro sets parent_class 2009-12-22 22:27:21 +0100 Wim Taymans * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpbin: avoid some structure copies Don't make copied in the getter and setter for SDES in the RTPSource. This avoids a couple of copies of the SDES structure when generating RTCP packets. 2009-08-31 18:42:25 +0200 Pascal Buhler * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpmanager: improve SDES handling Store SDES internally as a struct to support multiple PRIV values. Include all values set in SDES struct when sending RTCP SDES. 2009-12-22 14:41:35 +0100 Wim Taymans * gst/rtp/gstrtph263depay.c: rtph263depay: add some fixmes 2009-12-22 14:35:13 +0100 Wim Taymans * gst/rtp/gstrtph263depay.c: rtph263depay: baseclass handles timestamps for us 2009-12-22 14:27:40 +0100 Wim Taymans * gst/rtp/gstrtph263depay.c: rtph263depay: reset start variable properly 2009-05-29 15:49:27 +0300 Marco Ballesio * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263depay.h: Drop the whole frame if a packet is lost. Fixes #582575 2009-12-21 20:39:53 +0100 Wim Taymans * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: add option to insert PPS/SPS in streams Add a new spspps-interval property to instruct the payloader to insert SPS and PPS at periodic intervals in the stream. Rework the SPS/PPS handling so that bytestream and AVC sample code both use the same code paths to handle sprop-parameter-sets. This also allows to have the AVC code to insert SPS/PPS like the bytestream code. Fixes #604913 2009-12-21 19:12:22 +0100 Mark Nauwelaerts * common: Automatic update of common submodule From 47cb23a to 14cec89 2009-12-21 12:01:53 -0300 Jonathan Conder * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: qtdemux: Adds new tags Adds some new tags mapping to qtdemux. Fixes #599759 2009-12-21 15:05:09 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: add property to remove pads automatically Add a property called autoremove to automatically remove the pads of sources that timed out. Fixes #554839 2009-12-21 14:55:16 +0100 Wim Taymans * gst/rtpmanager/gstrtpssrcdemux.c: ssrcdemux: fix comparison A NULL means no pad was found. 2009-11-08 11:49:14 +0100 Edward Hervey * sys/v4l2/gstv4l2src.c: v4l2src: Add GstURIHandler interface. Fixes #601143 This allows using v4l2://[] 2009-12-20 17:24:47 -0800 Michael Smith * gst/udp/gstmultiudpsink.c: multiudpsink: pass length parameter to g_convert 2009-12-18 12:44:50 +0100 Edward Hervey * gst/matroska/matroska-demux.c: matroska: Fix unitialized variable. Yes, it's stupid, but macosx compilers are even more stupid. 2009-12-17 16:01:25 +0100 Sebastian Dröge * gst/videomixer/blend_ayuv.c: videomixer: Fix assembly compilation on x86 Fixes bug #604814. 2009-12-17 17:37:03 +0100 Branko Čibej * gst/replaygain/rganalysis.c: rganalysis: fix timestamp rounding Use scaling function to round and avoid overflows. Fixes #604352 2009-12-17 17:27:42 +0100 Tiago Katcipis * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpg723pay.c: * gst/rtp/gstrtpg723pay.h: rtp: add G723 payloader Fixes #597823 2009-12-17 16:22:56 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_types.c: qtdemux: Fix ALAC codec_data parsing Fixes #604611 2009-12-16 17:28:30 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Remove cpp style coments Removes // comments and replace them with /* */ comments 2009-12-16 12:48:02 +0100 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: also consider BlockNumber indicated in index when seeking 2009-12-16 12:43:27 +0100 Mark Nauwelaerts * gst/matroska/ebml-read.c: * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: support push based mode Fixes #598610. 2009-12-16 12:44:36 +0100 Mark Nauwelaerts * gst/matroska/ebml-read.c: matroskademux: fix ebml read cache usage 2009-12-16 10:50:32 +0100 Sebastian Dröge * gst/videomixer/blend_ayuv.c: videomixer: Use movzbl instead of movzxb for moving one byte to a l register For some reason latest gcc/binutils accept movzxb here while movzbl would be correct and is the only thing accepted by older gcc/binutils. Fixes bug #604679. 2009-12-16 06:59:01 +0100 Sebastian Dröge * gst/videomixer/blend_ayuv.c: videomixer: src/dest are input and output of the AYUV blending MMX assembler 2009-12-15 18:18:54 +0100 Sebastian Dröge * gst/audiofx/audiowsincband.c: audiowsincband: Use the same upper length limit as audiowsinclimit 2009-12-12 17:00:50 +0100 Sebastian Dröge * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: audiowsinc{limit,band}: Allow much larger filter lengths now 2009-12-11 12:27:32 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Fix frequency response calculation 2009-12-08 14:57:02 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Remove dead assignments 2009-12-06 16:58:51 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Add special processing functions for Mono/Stereo This provides another 7% speedup for the time domain convolution and 1.5% speedup for the FFT convolution on Mono input. This optimization assumes that the compiler simplifies calculations and conditions on constant numbers and unrolls loops with a constant number of repeats. 2009-12-04 09:25:49 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: Add a "low-latency" mode This will always use time-domain convolution, which lowers the latency. With FFT convolution it's always a multiple of the kernel length, with time domain convolution it's only the pre-latency of the filter kernel. 2009-12-04 09:00:22 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Remove obsolete TODO comments 2009-12-03 20:12:01 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Use samples everywhere instead of samples*channels sometimes 2009-12-03 17:27:13 +0100 Sebastian Dröge * gst/audiofx/Makefile.am: * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: FFT convolution implementation This provides a great speedup, especially the relationship between kernel length and processing size is now logarithmic instead of linear. Below a kernel size of 32 it's a bit slower, afterwards it's much faster: 17 0.788000 -> 0.950000 33 1.208000 -> 1.146000 65 2.166000 -> 1.146000 ... 4097 107.444000 -> 1.508000 For sizes smaller 32 the normal time-domain convolution is chosen, for larger sizes the FFT convolution is automatically used. Fixes bug #594381. 2009-11-27 20:33:14 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: Make most code parts independent of the processing functions and used convolution algorithm Only remaining part is the residue pushing, which will be fixed later. 2009-11-26 15:17:27 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Optimize time-domain convolution Remove some redundant calculations, move comparisions out of inner loops, etc. This makes the convolution about 3 (!) times faster but processing time is of course still proportional to the filter size. 2009-11-26 10:45:37 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: audiofxbasefirfilter: Use _CAST macros in some places and do some calculations only once 2009-11-25 18:12:05 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: Rewrite timestamp tracking It's much simpler now and doesn't introduce accumulating rounding errors. 2009-11-25 17:39:53 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: Rename some variables and change comments 2009-11-24 20:06:25 +0100 Sebastian Dröge * gst/audiofx/audiofxbasefirfilter.c: * gst/audiofx/audiofxbasefirfilter.h: audiofxbasefirfilter: Add const qualifier to the source data array 2009-12-14 20:08:06 +0100 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/blend_ayuv.c: * gst/videomixer/videomixer.c: videomixer: Add MMX implementations of the AYUV blending and color filling functions This provides a 20% speedup for blending and 100% for color filling. The blending can probably be optimized even more. 2009-12-13 13:19:43 +0000 Tim-Philipp Müller * gst/id3demux/id3v2frames.c: id3demux: prefer two letter ISO 639-1 code for extended comment 2009-12-13 13:10:12 +0000 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: fix up language code extraction some more Quicktime uses ISO 639-2 for language codes, but GST_TAG_LANGUAGE is supposed to hold a ISO 639-1 code, so convert as needed using the new API from -base. See #602126. 2009-12-13 12:45:22 +0000 Tim-Philipp Müller * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: matroska: fix language code writing and extraction Matroska uses three-letter ISO 639-2B codes, but GST_TAG_LANGUAGE is supposed to contain two-letter ISO 639-1 codes, so use new language code mapping functions in -base to convert between those two as needed. Fixes #505823. 2009-12-07 20:54:07 +0000 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: minor debug message changes Fix up a few debug messages so that it's clearer what they mean. 2009-12-12 17:44:04 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: Revert "qtdemux: Correctly parse classification tags" This reverts commit cd883aa60c1133196a6ae052884d15c295c37dde. Previous code was correct, 4 is due to table and language code, not only language code 2009-12-12 16:28:36 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Correctly parse classification tags In clsf atoms, the language code is 2 bytes long, not 4. 2009-12-12 16:55:13 +0100 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Dequeue current buffer on FLUSH_STOP and don't unref NULL buffers ... NULL buffers shouldn't really happen anymore when popping the buffer from GstCollectPads but better check for this and print a warning. 2009-12-11 13:11:12 +0100 Sebastian Dröge * gst/videomixer/blend_i420.c: videomixer: Fix stupid mistake in last commit 2009-12-11 12:35:59 +0100 Sebastian Dröge * gst/videomixer/blend_i420.c: videomixer: Don't do floating point math in the inner processing loop for I420 blending 2009-12-10 18:43:44 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: handle NULL and empty transport strings When an RTSP extension returns NULL or an empty transport string, just ignore it and try to get the next possible transport. Fixes playback of RealMedia streams. 2009-12-10 18:42:51 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: install event function on internal RTCP pad Install a custom event function on the internal RTCP pad so that we can reply TRUE to a latency event. 2009-12-10 10:48:49 +0100 Sebastian Dröge * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_rgb.c: videomixer: Remove wrong comments, copied from the I420 blend function 2009-12-09 21:15:07 +0100 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: The queued duration is a signed integer ...and it will really be negative sometimes. 2009-12-09 21:03:57 +0100 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Only pop buffers from collectpads after they're fully consumed This decreases latency and memory usage because new buffers are only accepted by collectpads if there's no queued buffer. 2009-12-09 20:42:44 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: Clean up position/duration handling Also use the last end time for closing the segment, not the start time of the last buffer. 2009-12-09 16:50:02 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Close the segment on EOS if the real duration is known 2009-12-09 16:46:18 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Update duration if current buffer is already after the old duration 2009-12-09 16:43:41 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Drop buffers that are after segment stop ...and if this happened for all streams go EOS. 2009-12-09 16:41:04 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Fix position tracking and sending of filler segments 2009-12-09 16:15:09 +0100 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Use gst_util_uint64_scale_int() for fps to seconds per frame calculations 2009-12-08 17:34:15 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Keep the segment stop position for update newsegment events 2009-12-04 14:42:49 +0100 Sebastian Dröge * configure.ac: * ext/Makefile.am: * ext/ladspa/Makefile.am: * ext/ladspa/gstladspa.c: * ext/ladspa/gstladspa.h: * ext/ladspa/gstsignalprocessor.c: * ext/ladspa/gstsignalprocessor.h: * ext/ladspa/load.c: * ext/ladspa/search.c: * ext/ladspa/utils.h: ladspa: Remove the sources from gst-plugins-good It's disabled anyway and the latest version of it is in gst-plugins-bad. Fixes bug #603779. 2009-12-04 13:50:59 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: init current_entry in push mode Set the current_entry to 0 (instead of -1) in push mode so that we correctly calculate the current frame number and timestamp. Add some more debug info and fic the duration debug. 2009-12-04 11:14:03 +0000 Tim-Philipp Müller * gst/rtsp/gstrtspsrc.c: rtspsrc: fix major memory leak when playing back rtsp video streams Don't forget to unref QoS, navigation and latency events when dropping them. 2009-12-03 08:58:08 +0000 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroskademux: only send pending tags with newsegment events Send pending tags only from the streaming thread, just after we've sent the newsegment event, not with e.g. flush-start. This not only does the right thing, but also makes sure we're not trampling over variables set up in the streaming thread from the seeking thread in case someone tries to issue a seek just as the demuxer is parsing the headers. Fixes #601617. Spotted by Ognyan Tonchev. 2009-12-03 17:49:55 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: fix debug message printf args Fixes debug message printf format to make it build in mac's gcc 2009-12-02 13:33:20 -0300 Thiago Santos * ext/shout2/gstshout2.c: shout2: Convert delay correctly Use GST_MSECOND to convert delay in msecs to nanosecs Fixes #603547 2009-12-01 19:24:02 +0100 Wim Taymans * ext/jpeg/gstjpegdec.c: jpegdec: reset segment info after flush Reset the segment info after a flush. We use the segment for handling QoS and if we don't reset the segment, QoS is basically disabled after a flushing seek. 2009-12-01 15:07:06 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 87bf428 to 47cb23a 2009-12-01 14:15:46 +0100 Sebastian Dröge * common: Automatic update of common submodule From da4c75c to 87bf428 2009-11-30 15:59:50 +0100 Aurelien Grimaud * gst/rtpmanager/rtpsession.c: rtpsession: avoid buffer ref/unref pairs for CSRCs We ref the buffer before pushing it downstream in order to get the CSRCs of it after pushing. This causes performance problems when downstream elements want to change the metadata because the buffer needs to be subbuffered. Instead, read and store the CSRCs of the buffer in an array before pushing it and process the array after pushing the buffer. This allows us to remove the ref/unref pair. Fixes #603376 2009-11-28 19:23:26 +0100 Wim Taymans * ext/shout2/gstshout2.c: * ext/shout2/gstshout2.h: shout2: use gstpoll for timeouts Use our own GstPoll based timeout instead of the shout sleep so that we can interrupt when doing a state change and shutting down. Fixes #602887 2009-11-28 12:25:06 +0100 Wim Taymans * tests/check/elements/rtpjitterbuffer.c: check: fix jitterbuffer check Make sure we set a base_time on the element. Fix the timeout to at least twice the jitterbuffer latency. Enable previously failing tests. Remove impossible checks. 2009-11-27 18:55:20 +0100 Edward Hervey * common: Automatic update of common submodule From 53a2485 to da4c75c 2009-11-26 16:14:30 +0100 Mark Nauwelaerts * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: rtph264depay: optionally merge NALUs into Access Units ... which may be expected/desired by some downstream decoders (and spec-wise highly recommended for at least non-bytestream mode). 2009-11-26 17:29:03 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix timestamp datatype 2009-11-25 10:38:23 -0600 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: avoid using wrong clock-rate Check for a valid clock-rate before attempting to estimate the npt stop time. 2009-11-25 10:37:30 -0600 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: fix typo in comments 2009-11-25 16:05:10 +0200 Stefan Kost * tests/check/elements/rtpjitterbuffer.c: rtpjitterbuffertest: add one more test and file a bug now CHange the backwards test to always send first buffer first to have a define basetime. Add another test that sends buffers backwards to assert that only first sent buffer is keep and used as basetime. Disabled those tests still, as its not passing/failing consitently and file a bug for jitterbuffer. 2009-11-25 10:17:34 +0200 Stefan Kost * tests/check/elements/rtpjitterbuffer.c: jitterbuffertest: improve the test the tests are a bit more solid now but still not produce reliable results. Wonder if they are still flawky or if its a bug in jitterbuffer. 2009-11-24 11:13:06 -0800 Michael Smith * gst/udp/gstmultiudpsink.c: multiudpsink: return error message on windows too. 2009-11-24 10:58:49 -0800 Michael Smith * gst/udp/gstmultiudpsink.c: multiudpsink: first phase of fixing up error reporting for windows. 2009-10-30 03:13:54 -0300 Thiago Santos * gst/avi/gstavimux.c: avimux: also set the suggested buf size for audio We were only setting the suggested buf size for video, we can set it for audio as well. This and 195e14529d80ef318ce3a778c1995efb11f266cd fix an issue that prevented seeking on large avi files on WMP (non-recent versions). 2009-11-04 16:10:23 -0300 Thiago Santos * gst/avi/gstavimux.c: * gst/avi/gstavimux.h: avimux: fix indx duration for PCM audio GstBuffers for PCM audio usually contains more than 1 sample, we need to get the total number of samples to set the indx duration. 2009-11-04 16:04:10 -0300 Thiago Santos * gst/avi/gstavimux.c: avimux: Audio buffers should be picked earlier Adds a 0.5s advantage for audio buffers to being picked earlier for muxing. 2009-11-24 16:40:19 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Fix push mode by making sure stbl information is available in next_entry_size () 2009-11-24 16:35:20 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Fix order of arguments in log message 2009-11-24 15:51:21 +0200 Stefan Kost * ext/jpeg/gstjpegenc.c: jpegenc: fix spelling in comment 2009-11-23 17:58:17 +0100 Robert Swain * common: build system: Fix wrongly committed change to common/ 2009-11-10 10:26:07 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Ease debugging by removing a goto for an error message 2009-11-14 15:52:09 +0100 Robert Swain * common: * gst/qtdemux/qtdemux.c: qtdemux: Parse per sample rather than all at once but build complete index when seeking 2009-11-04 17:31:15 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Save atom data for later use so it doesn't get freed after initial parsing 2009-11-06 11:00:04 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Parse from the previously parsed sample up to sample n 2009-11-04 17:04:22 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Make qtdemux_parse_samples () parse up to n samples 2009-10-28 17:49:02 +0000 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Separate off stbl sub-atom initialisation 2009-10-26 22:42:36 +0000 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Move variables into context in preparation for refactorisation 2009-10-26 20:36:08 +0000 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Fix bug where stps is never parsed due to logic error 2009-11-04 17:31:15 +0100 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: Port ctts from Gnode * to GstByteReader 2009-10-23 13:06:44 +0100 Robert Swain * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_types.h: qtdemux: Switch from QtAtomParser to GstByteReader 2009-11-23 12:53:50 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: fix typo and grammar 2009-11-20 10:30:00 +0000 Tim-Philipp Müller * gst/deinterlace/gstdeinterlace.c: deinterlace: fix typo in mode enum description 2009-11-20 11:25:49 +0200 Stefan Kost * gst/rtpmanager/gstrtpbin.c: docs: more links and better short description Fix spelling of GstRtpSsrcDemux to get it linked. Add more links. Change the short description to be more meaningful. 2009-11-20 09:58:26 +0100 Sebastian Dröge * tests/check/elements/wavpackparse.c: wavpackparse: Fix unit test for recent position reporting changes 2009-11-19 16:09:38 +0100 Sebastian Dröge * ext/wavpack/gstwavpackparse.c: wavpackparse: After pushing a frame, update last_stop to the end of the frame This improves position reporting, especially because of the fact that WavPack frames are usually 0.5-1.0 seconds long. 2009-11-19 16:08:33 +0100 Sebastian Dröge * ext/wavpack/gstwavpackparse.c: wavpackparse: Allow pulling the last WavPack frame of a file Because of a >= instead of a >, that last frame of a WavPack file would never be parsed in pull mode. 2009-11-19 10:30:43 +0000 Tim-Philipp Müller * common: Automatic update of common submodule From 0702fe1 to 53a2485 2009-10-29 08:29:38 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: Add more fields to SVQ3 caps qtdemux only added the whole stsd atom as 'codec_data' in its output caps for SVQ3. This patch makes it add the SEQH (inside a SMI atom) and a gamma field (taken from the gama atom) if available. Fixes #587922 2009-11-18 17:55:42 +0100 Edward Hervey * gst/wavenc/gstwavenc.c: wavenc: Raise rank of muxer to PRIMARY 2009-11-18 17:54:16 +0100 Edward Hervey * gst/y4m/gsty4mencode.c: y4m: Raise rank of encoder to PRIMARY 2009-11-18 17:54:02 +0100 Edward Hervey * gst/law/alaw.c: * gst/law/mulaw.c: law: Raise rank of encoders to PRIMARY 2009-11-12 19:11:18 +0000 Bastien Nocera * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: Add user-id and user-pw properties So that one doesn't need to modify the URL to have access to authenticated RTSP streams. fixes #601728 2009-11-18 12:22:10 +0100 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: use acquired flag when checking valid state Use the acquired field of the ringbuffer in get_time to know when we are in an invalid state. We don't clear the rate flag when releasing the ringbuffer so this values is not usable. Avoids some error messages being posted because the pulseaudio connection is down. 2009-11-18 10:17:02 +0000 Tim-Philipp Müller * configure.ac: configure: bump core requirement to 0.10.25.1 as well Make implicit requirement explicit. 2009-11-18 12:53:44 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix bogus memory chunk size check 2009-11-18 12:01:52 +0100 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: implement some more callbacks Implement some more callbacks for debugging purposes. 2009-11-11 15:50:19 +0100 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: release lock before emiting signals Release the jbuf lock before emiting the request-pt-map signal to avoid deadlocks. We also need to catch the shutdown case when locking again. Fixes #593354 2009-11-11 11:59:16 +0100 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpbvdepay.c: * gst/rtp/gstrtpbvdepay.h: rtp: add BroadcomVoice depayloader 2009-11-11 11:38:36 +0100 Wim Taymans * gst/rtp/gstrtpbvpay.c: rtpbvpay: add rfc reference 2009-11-11 11:37:07 +0100 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpbvpay.c: * gst/rtp/gstrtpbvpay.h: rtp: add BroadcomVoice payloader 2009-11-09 12:17:34 +0100 Jan Urbański * gst/flv/gstflvmux.c: flvmux: properly finish the ECMA array The ECMA array with the file index was missing a mandatory end marker. Fixes bug #601242. 2009-11-18 02:15:15 +0000 Jan Schmidt * gst/deinterlace/gstdeinterlace.c: Use new still-frame API from gst-plugins-base 2009-11-18 02:14:46 +0000 Jan Schmidt * configure.ac: Bump gst-plugins-base requirement to 0.10.25.1 2009-11-17 17:59:13 -0800 Michael Smith * gst/qtdemux/qtdemux.c: qtdemux: identify IMA adpcm in qt properly. 2009-11-18 01:27:37 +0000 Jan Schmidt * configure.ac: * win32/common/config.h: Back to development -> 0.10.17.1 2009-11-17 01:53:08 +0000 Jan Schmidt * gst-plugins-good.doap: Add release 0.10.17 to the doap file === release 0.10.17 === 2009-11-17 01:25:30 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: Release 0.10.17 2009-11-17 00:18:22 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2009-11-13 02:07:25 +0000 Jan Schmidt * configure.ac: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: * win32/common/config.h: 0.10.16.3 pre-release 2009-11-10 11:52:24 +0100 Sebastian Dröge * sys/v4l2/gstv4l2object.c: v4l2: Make sure to initialize variables before using them 2009-11-09 20:06:03 +0000 Jan Schmidt * ChangeLog: * configure.ac: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: * win32/common/config.h: 0.10.16.2 pre-release 2009-11-09 15:20:00 +0000 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: free temporary buffer when changing state to NULL Free temporary allocations in the state change function and not only when the object is finalised. 2009-11-09 11:40:25 +0000 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: only allocate as much temporary memory as needed for indirect decoding When we can't decode directly into the output buffer, make our temp buffers only as big as needed instead of allocating for the worst case scenario (well, we still alloc more than strictly needed for some cases, but significantly less than before). 2009-11-05 23:46:58 +0000 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulsesink: printf format fix 2009-11-05 23:44:27 +0000 Tim-Philipp Müller * ext/raw1394/gst1394clock.c: * ext/raw1394/gsthdv1394src.c: raw1394: printf format fixes 2009-11-05 23:40:15 +0000 Tim-Philipp Müller * gst/equalizer/gstiirequalizer.c: equalizer: printf format fix 2009-11-05 12:13:44 -0300 Thiago Santos * gst/avi/gstavimux.c: avimux: do not write empty INFO list avoid writing an empty INFO list chunk, both because it is useless and because vlc refuses to play the resulting file. 2009-11-05 10:54:12 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer.c: equalizer: Notify about band property changes caused by changing number of bands 2009-11-05 10:45:59 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer.c: * gst/equalizer/gstiirequalizer.h: * gst/equalizer/gstiirequalizernbands.c: equalizer: Make changes to band properties and the number of bands threadsafe 2009-11-05 10:30:46 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer.c: equalizer: Fix stupid off by two bug 2009-11-05 08:18:05 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer.c: equalizer: Add band property to select the band filter type This allows per band configuration of a peak, low shelf or high shelf filter, which can be very useful if the band frequencies and widths are manually configured. 2009-11-05 08:17:53 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer.c: equalizer: Fix code style 2009-11-05 08:03:13 +0100 Sebastian Dröge * gst/equalizer/gstiirequalizer.c: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: * gst/equalizer/gstiirequalizernbands.c: equalizer: Some cleanup 2009-10-07 09:31:19 -0400 Gabriel Millaire * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltpay.c: celtpay/depay : change GST_DEBUG_OBJECT to GST_LOG_OBJECT in pay_handle_buffer and depay_process 2009-10-02 17:04:43 -0400 Gabriel Millaire * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltdepay.h: * gst/rtp/gstrtpceltpay.c: celtpay/depay: Negotiate parameters through caps celtdepay : added default framesize(480) channels(1) and clockrate(32000) depay_setcaps : now gets channels and framesize from string with default value depay_process : now adds timestamp to outbuf Added frame_size to GstRtpCeltDepay Changed some GST_DEBUG to GST_DEBUG_OBJECT or GST_LOG_OBJECT celtpay : getcaps : gets channel and framesize and sets caps Added frame-size to static caps for audio/x-celt 2009-11-04 15:58:34 +0000 Jan Schmidt * gst/deinterlace/Makefile.am: deinterlace: Pull in CFLAGS and LIBS flags from -base before core before system. 2009-10-15 16:33:24 +0100 Jan Schmidt * po/Makevars: po: Don't create backup .po files As well as preventing creation of useless backup files, it works around a bug in gettext 0.17 on OS/X 2009-11-04 16:47:42 +0100 Edward Hervey * gst/qtdemux/qtdemux_dump.c: qtdemux: init variables to make compiler on osx build bot happy 2009-11-03 16:04:37 +0000 Tim-Philipp Müller * gst/qtdemux/qtdemux_dump.c: qtdemux: init variables to make compiler on osx build bot happy 2009-11-03 17:35:15 +0200 Stefan Kost * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: don't allocate big arrays on the stack Add the arrays to the instance data and allocate on first use. 2009-11-01 15:57:44 +0000 Tim-Philipp Müller * gst/deinterlace/gstdeinterlace.c: deinterlace: remove pointless call to gst_element_no_more_pads() 2009-11-01 00:29:57 +0200 Stefan Kost * gst/level/gstlevel.c: level: fix decay to be smooth The length not having any fractional part as it was promoted to gdouble after dividing two guint64. 2009-11-01 00:29:24 +0200 Stefan Kost * gst/level/gstlevel.c: * gst/level/gstlevel.h: level: calculate the message-intervall when it changes 2009-11-01 00:14:08 +0200 Stefan Kost * gst/level/gstlevel.c: level: clocktime is a guint64, use right macro to init fields 2009-11-01 00:10:01 +0200 Stefan Kost * gst/level/gstlevel.c: level: use more g-style types 2009-10-30 09:27:59 +0100 Sebastian Dröge * configure.ac: * ext/pulse/pulsesink.c: pulsesink: Only set the volume on stream connection if pulse >= 0.9.20 is available In older versions the volume set during stream connection had no defined sematic and usually it was a relative volume. What was needed for our use case is an absolute volume though, otherwise the volume will be always decreased on stream connection if it's less than 100%. Since pulse 0.9.20 that volume is always an absolute volume if flat volumes are used and relative otherwise, which is the same as for pa_context_set_sink_input_volume(). Relevant pulse changesets: http://git.0pointer.de/?p=pulseaudio.git;a=commit;h=f27a50691c8fe45bac7dd6b21fac91a359def3a1 http://git.0pointer.de/?p=pulseaudio.git;a=commit;h=2501687579e359d5032a4d165b2ffc8f5b1b8ba6 2009-10-27 18:07:18 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: use segment_full when we can Use segment_full so that we can pass the applied rate to the segment values. We will change the applied rate when we implement skip mode. 2009-10-18 00:16:06 +0100 Robert Swain * gst/wavenc/gstwavenc.c: wavenc: Fix buffer offset by moving length incrementation 2009-10-23 18:31:14 -0700 Michael Smith * sys/osxvideo/osxvideosink.m: osxvideosink: Create the video NSView in READY->PAUSED rather than NULL->READY 2009-10-23 18:28:22 -0700 Michael Smith * sys/osxvideo/Makefile.am: osxvideo: explicitly link to GST_LIBS 2009-10-23 18:09:43 -0700 Michael Smith * gst/avi/Makefile.am: * gst/matroska/Makefile.am: * gst/wavparse/Makefile.am: Add dependencies of gstriff to things that link to gstriff, needed on Win32. 2009-10-23 17:25:17 -0700 Michael Smith * tests/examples/rtp/client-PCMA.c: * tests/examples/rtp/server-alsasrc-PCMA.c: rtp examples: remove executable bits from C files. 2009-10-23 11:21:44 +0100 Tim-Philipp Müller * tests/check/elements/rtpjitterbuffer.c: tests: disable all jitterbuffer tests for now Since even the one enabled seems to fail. 2009-10-22 13:39:58 +0300 Stefan Kost * tests/check/elements/rtpjitterbuffer.c: tests: also include the new test for prev commit 2009-10-22 13:19:07 +0300 Stefan Kost * gst/rtpmanager/gstrtpjitterbuffer.c: * tests/check/Makefile.am: * tests/check/elements/.gitignore: tests: add a jitterbuffer test Tests pushing a few buffers in various order and asserting the order sent by the jitterbuffer. Contains two disabled tests that need more work. 2009-10-22 12:30:14 +0200 Sebastian Dröge * gst/matroska/matroska-mux.c: matroskamux: Dirac "muxing" units end on EOS too A Dirac muxing unit are all non-picture, non-end-of-sequence packets up to and including the first picture or eos packet. See http://www.diracvideo.org/wiki/index.php/ContainerFormatMappingGuidelines 2009-10-22 02:09:08 +0100 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: fix compilation with debugging disabled total_idx is always evaluated. 2009-10-19 21:59:46 +0300 Priit Laes * ext/libcaca/gstcacasink.h: cacasink: minor cleanups for header. Use G_BEGIN_DECLS macros, remove unused variables and fix typo. See #599018. 2009-10-19 21:59:23 +0300 Priit Laes * ext/libcaca/gstcacasink.c: cacasink: exit properly when invalid driver has been selected. See #599018. 2009-10-20 18:23:28 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Stop scanning at the last entry... and not the one before :) This ensures we actually push out everything 2009-10-20 17:20:55 +0200 Andy Wingo qtdemux: unpack more information into image/x-j2c caps * gst/qtdemux/qtdemux_fourcc.h: Add new fourccs for use by the mj2 unpacker. * gst/qtdemux/qtdemux.c (qtdemux_parse_trak): Unpack JPEG2000 component mapping and channel definitions from the jp2h header. Will add component-map and channel-definitions elements to the caps if the component maps or channel definitions are nonstandard, where standard order means RGB, 444 packed YUV, or greyscale, with no alpha channel. Fixes #598915. 2009-10-20 17:33:41 +0300 Stefan Kost * tests/check/elements/deinterleave.c: tests: include stdio.h for sscanf 2009-10-19 15:21:57 +0100 Bastien Nocera * ext/pulse/pulsesink.c: Fix the StreamVolume interface not being advertised gst_pulsesink_interface_supported() was missing a check for it. https://bugzilla.gnome.org/show_bug.cgi?id=598933 2009-10-16 21:14:14 +0300 Stefan Kost * gst/level/gstlevel.c: level: code cleanup Use gdouble instead of double. Calculate falloff_time once instead of twice. 2009-10-18 15:52:02 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: MEMDUMP the junk blobs It will only actually pull the junk blobs from upstream if the memdump level is activated 2009-10-18 15:51:34 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Some avi files have INFO lists in the headers. 2009-10-18 16:02:01 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Don't seek on empty streams 2009-10-18 15:50:39 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Ensure _calculate_durations_from_index only uses valid streams 2009-10-18 15:49:29 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Only call convert function if we have strf.auds 2009-10-18 15:48:06 +0200 Edward Hervey * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: Use first indexed stream for seeking. In the future, main_stream can be adjusted to contain the optimal stream as mentionned in the FIXME line 3440 2009-10-18 15:46:48 +0200 Edward Hervey * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: Only expose streams that actually have something in it. This guarantees that in pull-mode, all streams have a valid index to work with. 2009-10-18 15:40:37 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Properly mark presence of index. Instead of blindly saying we have an index, only do so if we have a non-empty index. 2009-10-17 02:18:53 +0200 Lennart Poettering * ext/pulse/pulsesink.c: pulse: never apply volume more than once Generally decisions on the volume of the stream should be done inside of PA, not inside of Gst. Only PA knows how volumes translate between devices and s on. This patch makes sure that all volumes set via the volume property are only applied *once* to the underlying stream. After applying them the client side will not store them anymore. This should make sure that really only user-triggered volume changes are forwarded to server, but the client never tries to save/restore the volume internally. Fixes bug #595231. 2009-10-17 08:55:16 +0200 Sebastian Dröge * ext/pulse/plugin.c: pulsesink: Initialize gettext for the translated strings in plugin_init() 2009-10-17 00:10:30 +0200 Lennart Poettering * ext/pulse/pulsesink.c: pulse: use 'performer' as a fallback for 'artist' tag 2009-10-17 00:09:36 +0200 Lennart Poettering * ext/pulse/pulsesink.c: * po/POTFILES.in: pulse: when constructing a stream title from tag data make sure it is translatable 2009-10-17 00:06:15 +0200 Lennart Poettering * ext/pulse/pulsemixerctrl.c: pulse: loop while connecting to server pthread does not guarantee that there are no spurious condition variable wakeups, neither does pa_threaded_mainloop_xxx() which is a wrapper around it. So we need to loop around the _wait() function to make sure we get the right wakeup. Also, unify the order of the wait loops across the file. 2009-10-17 00:05:10 +0200 Lennart Poettering * ext/pulse/pulsemixerctrl.c: * ext/pulse/pulseprobe.c: pulse: mainloop creation can fail too, so handle that 2009-10-17 00:03:06 +0200 Lennart Poettering * ext/pulse/pulsemixerctrl.c: pulse: adjust CHECK_DEAD_GOTO macro to glib style 2009-10-16 17:28:42 +0200 Lennart Poettering * ext/pulse/pulsemixerctrl.c: * ext/pulse/pulsemixerctrl.h: * ext/pulse/pulseprobe.c: * ext/pulse/pulseprobe.h: * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: * ext/pulse/pulsesrc.h: pulse: make a few things smaller by making them bitfields 2009-10-16 17:26:41 +0200 Lennart Poettering * configure.ac: pulse: bump minimum libpulse version to 0.9.10 Older versions than 0.9.10 are really really old and buggy. Drop compatibility with them. Nobody should run anything that old. Also see: https://bugzilla.gnome.org/show_bug.cgi?id=595029 2009-10-16 18:18:31 +0200 Mark Nauwelaerts * gst/debugutils/gstdebug.c: debugutils: register pushfilesrc element 2009-10-16 17:28:09 +0200 Mark Nauwelaerts * gst/avi/gstavimux.c: * gst/avi/gstavimux.h: avimux: support (some) VBR audio muxing AVI format can handle VBR audio provided audio chunks are of fixed duration (cfr fixed duration video frames). Apply this approach to (always) parsed raw AAC and (if parsed) to MPEG-1/2 audio. See #368681. 2009-10-16 13:41:45 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix branch hints Remove inappropriate branching hints and add some new ones. 2009-10-16 12:33:04 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix regression in indirect decode path Revert variable name back to what it was before the G_LIKELY was added (in commit 69c24fb9). The code works better that way. 2009-10-16 02:47:38 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix regression with certain formats Fix regression introduced by previous commit (#598517). 2009-10-15 19:49:55 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: don't use decompress structure members we shouldn't be using 2009-10-14 17:53:52 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.h: jpegdec: remove some unused members from jpegdec instance structure 2009-10-16 11:53:38 +0300 Stefan Kost * gst/rtpmanager/Makefile.am: * gst/udp/Makefile.am: build: use gst-glib-gen.mak to fix the glib build rules. The build rules in glib-gen.mak were using pattern rules in a non save way. 2009-10-16 10:15:35 +0300 Stefan Kost * common: Automatic update of common submodule From 85d1530 to 0702fe1 2009-10-15 21:04:02 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: adjust flow return aggregation to updated loop_data In particular, each stream is now treated separately, and one stream's EOS should not lead to overall EOS. 2009-10-15 11:52:35 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: check some more atom sizes prior to parsing 2009-10-15 13:19:13 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtsp: handle events in TCP mode We need to handle events in TCP mode so that we can reply to the LATENCY event with TRUE. 2009-10-15 11:24:45 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: add missing argument in debug message 2009-10-14 18:58:06 +0200 Marvin Schmidt * tests/check/elements/flvmux.c: flvmux: Use loop test to prevent timeout on slow machines Partially fixes bug #597739. 2009-10-14 16:15:48 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: forward events into the rtpbin Only catch the SEEK event on the srcpad and let other events enter the rtpbin. 2009-10-14 11:33:24 -0300 Thiago Santos * gst/matroska/matroska-demux.c: matroskademux: Fix late tags finding Use the correct taglist variable when notifying of late tags. 2009-10-14 13:09:03 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: use GstIndex for (limited) seeking in push mode ... but disable this for now. Although it basically works fine, user experience might be shaky (depending on taste), since there is no keyframe info in push mode. 2009-10-14 13:08:47 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: add GstIndex support 2009-10-14 11:55:33 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: also determine duration in push mode 2009-10-14 11:54:44 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: add GstIndex support 2009-10-14 07:38:26 -0300 Thiago Santos * sys/v4l2/gstv4l2src.c: v4l2src: Set duration on buffers Use framerate to estimate duration of buffers. Fixes #590362 2009-10-14 12:28:55 +0200 Håvard Graff * gst/rtpmanager/gstrtpptdemux.c: rtpptdemux: only forward the lost-event to the last seen pt-number forward all events on all pads except for the PacketLost event, which we want to forward to the last seen pt pad. Fixes #598377 2009-10-06 22:28:50 +0300 René Stadler * ext/pulse/pulsesink.c: pulsesink: set desired minreq value to segsize/latency-time If we let the daemon decide freely by passing -1, we end up always getting 20ms. We want to set this value because in some cases we want to select a higher latency-time in order to save power. Fixes #597601 2009-10-14 10:41:21 +0200 Edward Hervey * common: Automatic update of common submodule From a3e3ce4 to 85d1530 2009-10-13 18:33:34 +0200 Edward Hervey * tests/check/pipelines/flacdec.c: tests/pipeline/flac: Fix build on macosx 10.5 2009-10-13 18:19:32 +0200 Wim Taymans * gst/avi/gstavidemux.c: avidemux: demote some warnings to debug 2009-10-13 17:47:40 +0200 Wim Taymans * gst/avi/avi-ids.h: avi: add new avi flag we might want to use 2009-10-13 17:46:22 +0200 Wim Taymans * gst/avi/gstavimux.c: avimux: calculate suggested buffer size Calculate the suggested buffer size based on the largest chunk in the file. See #597847 2009-10-13 17:45:14 +0200 Wim Taymans * gst/avi/gstavimux.c: avimux: add jpeg2000 to allowed caps 2009-10-13 17:41:13 +0200 Wim Taymans * gst/avi/gstavidemux.c: avidemux: add debug for the superindex offsets 2009-10-13 16:02:37 +0100 Jan Schmidt * gst/qtdemux/qtdemux.c: qtdemux: Fix uninitialized variable warning Fix another bogus may-be-used-uninitialized warning in qtdemux 2009-10-13 13:08:33 +0200 Wim Taymans * gst/avi/gstavimux.c: * gst/avi/gstavimux.h: avi: lower max file size Make a constant of the max file size and lower the value to what ffmpeg does, hopefully improving compatibility with windows media player. See #597847 2009-10-13 01:02:15 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix bogus warning about discont flag on first buffer The very first buffer should always have the DISCONT flag set, no need to warn about that. Only warn if we get a DISCONT buffer in non-packetised mode and we already have some data. 2009-10-13 00:41:57 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix crash for unusual vertical chroma subsampling factors Fixes #597351. 2009-10-13 00:12:42 +0100 Jan Schmidt * gst/qtdemux/qtdemux.c: qtdemux: Fix uninitialized variable warnings The gcc on the OS/X buildbot complains about these variables not being initialized, even though they can't possibly actually be used uninitialized. 2009-10-10 00:37:08 +0200 Josep Torra * ext/jpeg/gstjpegdec.c: jpegdec: fixes warning building in snow leopard 2009-10-09 17:12:46 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: also consider Quicktime text subtitles 2009-10-09 17:02:57 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: provide language tag for stream 2009-10-09 16:30:57 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: refactor common parts in track parsing 2009-10-09 16:21:03 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: refactor buffer processing and sending ... so it can be used in both pull and push based mode. 2009-10-08 13:39:25 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: extract palette data for dvd subpicture streams ... and send it downstream using custom dvd event 2009-10-07 14:03:17 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: support 3GPP timed text subtitles In particular, also make subtitle support less subp(icture)-centric. 2009-10-07 16:15:55 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: NULL is not a valid taglist 2009-09-23 17:20:25 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: recognize some more encypted track cases 2009-10-09 15:59:25 +0200 Josep Torra * gst/id3demux/id3tags.c: id3: fixes warnings building on macosx Another round on the formating of that debug line. 2009-10-09 14:44:02 +0300 Stefan Kost * gst/id3demux/id3tags.c: id3: cast pointer math results to glong 2009-10-09 14:37:32 +0300 Stefan Kost * ext/flac/gstflacdec.c: flac: apparently on some platforms a FLAC__uint64!=guint64 2009-10-09 14:21:09 +0300 Stefan Kost * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtpvrawpay.c: buikd: explicitely cast, to tell some compilers that this is not long int 2009-10-09 13:38:17 +0300 Stefan Kost * ext/flac/gstflacdec.c: * gst/id3demux/id3tags.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtpvrawpay.c: build: don't cast, but use the right format specified instead This correct some of the previous macos fixes. 2009-10-09 12:40:47 +0200 Josep Torra * ext/dv/gstdvdemux.c: dv: fix warnings on macosx 2009-10-09 12:25:19 +0200 Josep Torra * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: flac: fix warnings on macosx 2009-10-09 12:19:35 +0200 Josep Torra * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: annodex: fix warnings in macosx 2009-10-09 12:14:22 +0200 Josep Torra * sys/osxvideo/cocoawindow.m: osxvideo: fix a warning doing a cast 2009-10-09 12:11:12 +0200 Josep Torra * sys/osxaudio/gstosxringbuffer.c: osxaudio: fix warnings on macosx 2009-10-09 12:01:10 +0200 Josep Torra * gst/rtp/gstrtpvrawpay.c: rtpvrawpay: fix warning on macosx 2009-10-09 11:57:59 +0200 Josep Torra * gst/rtp/gstrtph263pay.c: rtph263pay: fix warning on macosx 2009-10-09 11:54:03 +0200 Josep Torra * gst/qtdemux/qtdemux.c: qtdemux: fix warnings building on macosx 2009-10-09 11:42:36 +0200 Josep Torra * gst/id3demux/id3tags.c: id3demux: fix printf warnings on macosx 2009-10-09 11:30:00 +0200 Josep Torra * gst/avi/gstavidemux.c: avidemux: fix warning in macosx making the format portable 2009-10-09 10:51:29 +0200 Josep Torra * gst/audiofx/audiofxbasefirfilter.c: audiofx: use G_GUINT64_FORMAT to fix warnings on OSX 2009-10-09 10:11:38 +0200 Josep Torra * sys/osxaudio/gstosxringbuffer.c: osxaudio: Fixes build on macosx snow leopard. 2009-10-09 11:34:16 +0200 Pau Garcia i Quiles * sys/v4l2/gstv4l2object.h: v4l2: Include sys/ioctl.h for the V4L ioctl requests Old videodevice2.h kernel headers used ioctl stuff without including ioctl.h, making compilation fail on older systems. Note: Including ioctl.h here is only a workaround for old kernel headers, should be removed once everybody has new enough headers. Fixes bug #597867. 2009-10-09 00:14:07 +0100 Jan Schmidt * configure.ac: * tests/check/elements/level.c: check: Make the level unit test succeed on Solaris 10 Add a configure check for functional isinf() and fpclass(), and use fpclass() where possible when isinf() is not available. 2009-05-16 13:52:50 +0300 René Stadler * gst/matroska/matroska-demux.c: matroskademux: fix strstr() usage on possibly unterminated string 2009-10-08 16:16:14 +0100 Jan Schmidt * tests/check/Makefile.am: * tests/check/elements/level.c: check: Link against LIBM and include math.h for isinf() 2009-10-07 21:51:38 +0100 Sjoerd Simons * sys/oss/gstossaudio.c: oss: Downgrade the rank of osssrc to SECONDARY which is the same rank as osssink has. Fixes bug #597730. 2009-10-08 10:59:53 +0100 Jan Schmidt * common: Automatic update of common submodule From 19fa4f3 to a3e3ce4 2009-10-08 10:20:09 +0100 Jan Schmidt * gst/avi/gstavidemux.c: * gst/wavparse/gstwavparse.c: avi/wav: Fix some compiler warnings about incompatible pointers. 2009-10-05 17:36:55 +0100 Jan Schmidt * gst/multifile/gstmultifile.c: multifile: Fix plugin description 2009-10-07 14:03:20 +0300 Stefan Kost * ext/annodex/gstcmmlutils.c: * ext/jpeg/gstjpegdec.h: * ext/jpeg/gstjpegenc.h: * gst/apetag/gstapedemux.c: * gst/debugutils/tests.c: * gst/id3demux/id3v2frames.c: * gst/qtdemux/qtdemux.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtsp/gstrtpdec.c: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: * tests/examples/spectrum/spectrum-example.c: build: fprintf, sprintf, sscanf need stdio.h 2009-10-07 00:33:49 +0300 Stefan Kost * gst/equalizer/gstiirequalizer.c: equalizer: use shelfing filters for first and last band Refactor the filter setup. Add two new filters with shelf characteristics for first and last band. Change gain calculation as recommended in the quoted document (no qrt needed). Rename variables to match the formulas in the document. 2009-10-02 23:51:29 +0300 René Stadler * ext/pulse/pulsesrc.c: pulsesrc: guard fragment size with a lower limit based on latency-time In case that the pulse daemon runs the source device at a relatively low fixed fragment size compared to the requested latency-time, configure the ring buffer segsize to the largest integer multiple of the fragment size that is still smaller than or equal to the requested latency-time. Fixes bug #597463. 2009-10-06 17:40:47 +0300 Stefan Kost * ext/jpeg/gstjpegdec.c: jpegdec: comment/logging cleanups and more branch guides 2009-10-05 22:43:11 +0300 Stefan Kost * gst/equalizer/gstiirequalizer.c: equalizer: fix filter history usage. Fixes #597397 The process functions where overwriting the history for each channel. Also pull some static things out of the inner loop. 2009-10-05 16:07:24 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: use locking around the sessions 2009-10-05 11:46:08 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: make sure compatible brands buffer exists before dereferencing it 2009-10-04 21:59:24 +0200 Robert Swain * gst/qtdemux/qtdemux.c: qtdemux: fix printf warnings on OSX Cast variables passed to printf to avoid warnings about incorrect formats (most likely caused by sizeof returning a size_t). Fixes #597348. 2009-10-02 00:23:34 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: remove internal genre table No need to maintain our own genre table in qtdemux. The genres are identical to the ID3 genres, so we can just use libgsttag's gst_tag_id3_genre_get() to look them up. 2009-10-03 17:18:28 +0200 Robert Swain * gst/avi/gstavidemux.c: Fix printf formats to avoid warnings in avidemux. Fixes #597214 https://bugzilla.gnome.org/show_bug.cgi?id=597214 2009-10-03 09:52:57 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Change one GST_WARNING to a GST_DEBUG 2009-10-02 14:37:54 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: flvdemux: If there's no audio stream after 6 seconds of video signal no-more-pads ...and the other way around. Also ignore any audio/video streams that appear after no-more-pads. Fixes bug #597091. 2009-10-02 14:37:40 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: flvdemux: Make sure to only signal no-more-pads a single time 2009-10-02 22:55:45 +0300 René Stadler * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: pulse: rename pa_buffer_attr variables Makes it much easier to see what is going on and is a lot less error prone. 2009-10-02 18:25:16 +0300 Stefan Kost * gst/rtp/gstrtpjpegdepay.c: rtp: add missing include to fix the build 2009-10-02 13:15:59 +0300 Stefan Kost * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: videofilter: add G_OBJECT_WARN_INVALID_PROPERTY_ID to property setter 2009-10-02 13:10:44 +0300 Stefan Kost * gst/level/gstlevel.c: level: don't give wrong number of fields in the message docs 2009-10-01 12:52:40 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: cache latency in nanoseconds Cache the latency in nanoseconds units to avoid having to convert the milliseconds value to nanoseconds all the time. 2009-10-01 12:12:09 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: handle -1 input timestamps Don't try to check a -1 timestamp against the max delay. 2009-10-01 10:54:55 +0300 Stefan Kost * gst/avi/gstavidemux.c: avi: don't misues perf-category and remove unused ext category The performance category is meant to be used to audit codepaths that lead to bad performance (e.g. copies, conversion that can be avoided). Remove the event category which is not used. 2009-09-16 14:23:24 -0400 Olivier Crête * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: rtpg729pay/depay: Demote per-buffer debug messages to log level 2009-09-16 14:16:27 -0400 Olivier Crête * gst/rtp/gstrtpg729pay.c: rtpg729pay: Don't leak incoming buffers after subbuffering them 2009-09-16 13:57:05 -0400 Olivier Crête * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: rtpg729pay/depay: Add debug categories 2009-09-16 13:55:19 -0400 Olivier Crête * gst/rtp/gstrtpg729pay.c: rtpg729pay: Remove long unneeded define replacement 2009-09-30 18:06:07 +0100 Christian F.K. Schaller * ext/dv/Makefile.am: Update makefile with missing header file 2009-09-30 18:45:17 +0200 Sebastian Dröge * tests/examples/rtp/client-H263p-AMR.sh: * tests/examples/rtp/client-H263p-PCMA.sh: * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-PCMA.sh: * tests/examples/rtp/server-alsasrc-PCMA.sh: * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: rtp: Use autoaudio{sink,src} instead of alsa in the examples 2009-09-29 17:51:04 +0300 Stefan Kost * ext/jpeg/gstjpegdec.c: jpegdec: don't leak output buffers on decoding errors The setjmp handles libjpeg error. Free the outputbffer if we don't need it. 2009-09-29 00:01:59 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix 'unused variable' compiler warning when compiling with GST_DISABLE_GST_DEBUG 2009-09-23 14:25:08 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: small cleanups 2009-09-23 13:57:02 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: fix timestamping in some audio streams For vbr audio streams we need to use the number of blocks to calculate the timestamps. When the allocation of additional index memory fails, don't throw away what we had before. Various cleanups. 2009-09-23 12:56:07 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: add support for ODML indexes again 2009-09-22 22:12:58 +0200 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avi: implement index scanning Implement scanning of the file when we can parse the index. Some refactoring of common code. Cleanups and comments. Remove some reimplemented code. Remove index massage code and put a FIXME where we should do something equivalent later. 2009-09-22 18:18:20 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: fix reverse playback 2009-09-22 17:42:48 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: fix prev keyframe search and cleanups 2009-09-22 14:51:30 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: remove code that got converted 2009-09-22 14:44:42 +0200 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avi: more cleanups Remove some duplicate counters. Be smarter when updateing the current the timestamp and offset in the stream because we can reuse previously calculated values when simply go forward one step. Correctly set metadata on outgoing buffers. 2009-09-22 12:35:30 +0200 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: small cleanups 2009-09-22 01:28:54 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: fix read offset and cleanups 2009-09-21 18:04:25 +0200 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avi: rewrite index playback disable code, start on reimplementing loop based operation. Rewrite the index handling so that all streams use their own index for decoding media. 2009-09-21 15:35:55 +0200 Wim Taymans * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: add new index parsing code Add a new function and datastructure to parse and hold the index entries on a per stream base. Also avoid doing too much work trying to figure out the timestamps and durations as we can trivially do that later. Less information in the entries makes them 2 times smaller and not doing too much work makes this code about 12 times faster than the regular case. Hook in the new function alongside the existing function for comparison until the rest of the code is updated to handle the new index datastructure. 2009-09-28 16:29:45 +0300 Stefan Kost * ext/jpeg/gstjpegdec.c: jpeg: handle more libjpeg return values, add some more branch hints Also remove unused size variable in _chain(). 2009-09-25 19:21:32 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: some optional QT specified stsd MPEG-4 atoms also apply to H264 Fixes #596319. 2009-09-25 16:40:31 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: only send tag events downstream after newsegment 2009-09-25 14:14:03 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: if transport protocol unsupported, try another one Also change error message to more accurately reflect cases in which it can occur. 2009-09-25 11:54:06 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: add durations modulo 1<<32 For calculating the durations of each sample, we are supposed to add each duration modulo 1<<32 so make the elapsed time counter a uint32. Fixes #595942 2009-09-24 20:38:54 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: small cleanup 2009-09-24 19:33:39 +0100 Tim-Philipp Müller * gst/qtdemux/qtatomparser.h: qtdemux: don't use core API that doesn't exist yet There's no gst_byte_reader_has_remaining() yet. Fixes build. 2009-09-24 13:20:50 +0100 Tim-Philipp Müller * gst/qtdemux/qtatomparser.h: qtdemux: map some atomparser functions to their new bytereader equivalents Now that GstByteReader has unchecked and inlined variants as well, map atomparser functions to their respective bytereader equivalents. 2009-08-25 12:11:28 +0100 Tim-Philipp Müller * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: qtdemux: add qt_atom_parser_has_chunks() and fix indentation 2009-08-20 18:21:59 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: bail out instead of trying to alloc silly index sizes If it looks like we would be allocating a silly size for our sample index, just bail out instead of trying to allocate it. Helps with broken or fuzzed files where we might end up trying to malloc a couple of hundred MBs otherwise. 2009-08-20 16:47:25 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: error out correctly if we don't even have enough bytes for an atom header 2009-08-20 15:39:00 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: init fourcc to 0 as well to avoid invalid reads when printf'ing error message 2009-08-20 01:39:17 +0100 Tim-Philipp Müller * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: qtdemux: add qt_atom_parse_has_remaining() to avoid overflows with _get_remaining() 2009-08-20 01:21:04 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: use GstByteReader when parsing tkhd atom 2009-08-19 19:13:38 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: use unsigned ints for node length and do more sanity checking of the atom length 2009-08-19 01:36:33 +0100 Tim-Philipp Müller * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux_dump.c: * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_types.h: qtdemux: use GstByteReader for atom dumping and fix a few bugs 2009-08-21 14:21:08 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: move stco, stts, stss and stps atom parsing over to GstByteReader Make sure we don't read beyond the atom boundary. Note that the code behaves slightly differently in the corner case where there is not enough atom data for the specified number of samples (n_samples_time) in the atom, but still enough data to fill the pre-allocated index of n_samples entries: before we would just stop parsing the stts data and continue, whereas now we will likely error out. This should not be a problem in practice though. We could maintain the old behaviour by doing reads with a size check inside the loop if needed. 2009-06-30 19:51:15 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: use bytereader to parse stsz and stsc atoms Use GstByteReader to parse stsz and stsc chunks, and check size of available data before parsing it, instead of blindly assuming there will be enough data. Fixes crashes with some fuzzed/broken files. 2009-08-15 20:38:40 +0100 Tim-Philipp Müller * gst/qtdemux/qtatomparser.h: qtdemux: add qt_atom_parser_get_offset() and optimise _peek_sub() 2009-07-01 13:49:57 +0100 Tim-Philipp Müller * gst/qtdemux/Makefile.am: * gst/qtdemux/qtatomparser.h: * gst/qtdemux/qtdemux.c: qtdemux: add QtAtomParser, an inlined GstByteReader variant 2009-09-23 17:19:34 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: matroskademux: use proper order for no-more-pads and newsegment and tag sending 2009-09-23 09:50:37 +0200 Mark Nauwelaerts * gst/matroska/matroska-demux.c: matroskademux: sprinkle a few branch prediction macros 2009-09-22 15:03:20 +0200 Alessandro Decina * ext/jpeg/gstjpegdec.c: * gst/avi/gstavidemux.c: * gst/flv/gstflvparse.c: * gst/id3demux/id3v2frames.c: Fix compile warnings with gcc 4.0.1. 2009-09-22 11:48:50 +0100 Jan Schmidt * gst/matroska/matroska-mux.c: matroskamux: Don't get stuck in an infinite loop with Dirac At the end, Dirac streams have an EOS packet with 0 length. Don't ever sit in an infinite loop when processing one. Allows muxing Dirac into mkv to complete successfully. 2009-09-22 11:03:46 +0100 Tim-Philipp Müller * .gitignore: Update .gitignore 2009-09-22 11:02:02 +0100 Tim-Philipp Müller * gst/videomixer/Makefile.am: videomixer: fix up Makefile some more Remove CFLAGS from LIBADD and make order of the various CFLAGS and LIBS at least consistent with each other. 2009-09-22 08:02:48 +0200 Brian Cameron * gst/videomixer/Makefile.am: videomixer: Add $(GST_PLUGINS_BASE_LIBS) to LDFLAGS for linking libgstvideo Fixes bug #595897. 2009-09-21 18:09:12 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: fix timestamps in push mode 2009-09-18 17:26:42 +0300 Stefan Kost * ext/jpeg/gstjpegdec.c: jpegdec: add a G_UNLIKELY and put perf-cat log to code path that copies 2009-09-21 12:32:51 +0200 Wim Taymans * gst/avi/gstavidemux.c: avi: add some performance measurements Measure the performance of various index and header parsing steps to the PERFORMANCE debug category. 2009-09-18 11:53:12 +0200 Mark Nauwelaerts * ext/speex/gstspeexdec.c: speexdec: allow for unknown varying number of frames per buffer In particular, this caters for RTP payloads with multiple frames per packet. 2009-09-18 11:45:06 +0200 Mark Nauwelaerts * ext/speex/gstspeexdec.c: speexdec: use correct sample size in conversions 2009-09-18 11:43:46 +0200 Mark Nauwelaerts * ext/speex/gstspeexenc.c: speexenc: fix buffer time and duration for multiple frames per packet 2009-09-18 14:22:02 +0300 Stefan Kost * gst/avi/gstavidemux.c: avidemux: some logging cleanup to help understanding the index parsing overhead 2009-09-16 13:28:27 -0700 David Schleef * sys/osxaudio/Makefile.am: osxaudio: link against GST_BASE_LIBS 2009-09-15 17:24:24 -0400 Olivier Crête * gst/rtp/gstrtpg729pay.c: rtpg729pay: Fix adapter leak The adapter would be leaked if it was empty and the data could be pushed out directly. 2009-09-15 10:04:30 +0200 Sebastian Dröge * ext/pulse/pulsesrc.c: pulsesrc: Don't dereference NULL pointers pa_stream_get_timing_info() can return NULL. Fixes bug #595220. 2009-09-15 10:01:54 +0200 David Henningsson * ext/pulse/pulsesink.c: pulsesink: Don't dereference NULL pointers pa_stream_get_timing_info() can return NULL. Fixes bug #595220. 2009-09-14 16:05:30 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: handle stream events Handle stream events and request a PAUSE/PLAY state change from the application when we receive a CORK/UNCORK event. 2009-09-13 12:30:34 -0700 David Schleef * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: Add next-file property Add a property to allow control over what event causes a file to finish being written and a new file start. The default is the same as before -- each buffer causes a new file to be written. Added is a case where buffers are written to the same file until a discontinuity in the stream. 2009-09-13 15:55:02 -0700 David Schleef * ext/dv/gstdvdemux.c: * ext/dv/gstdvdemux.h: dvdemux: Use values from decoder structure directly Don't store the same values in the GstDvDemux. This fixes a bug where dvdemux would detect a stream as PAL instead of NTSC, and silently parse it wrong. 2009-09-13 12:20:23 -0700 David Schleef * ext/dv/Makefile.am: * ext/dv/gstsmptetimecode.c: * ext/dv/gstsmptetimecode.h: * ext/dv/smpte_test.c: dvdemux: Add code to parse SMPTE time codes Code to convert time codes to/from timestamps and frame numbers. 2009-09-13 12:01:27 -0700 David Schleef * ext/dv/gstdvdemux.c: * ext/dv/gstdvdemux.h: dvdemux: Fix detection of new media There are 5 or 6 AAUX source control packs in a frame, and any of them could have REC_ST cleared, indicating a recording start point. libdv only checks the first. 2009-09-12 19:25:36 +0200 Edward Hervey * ext/dv/gstdvdemux.c: dvdemux: Set DISCONT flag on buffers when REC_ST flag is set. Also add a few branch prediction macros 2009-09-12 00:13:04 +0100 Jan Schmidt * tests/check/elements/souphttpsrc.c: * tests/check/elements/y4menc.c: check: Fix a couple of tests. The souphttpsrc test wasn't compiling. The soup-misc.h header is needed for soup_ssl_supported. Fix the y4menc test to use a 'progressive' header for the test data now that the element outputs correct interlacing info. 2009-09-11 13:32:39 -0700 Michael Smith * gst/wavparse/gstwavparse.c: wavparse: treat a zero-sized data chunk as extending to the end of the file. This fixes playback of some files that don't have a valid data chunk length, apparently some program creates these. 2009-09-11 22:24:47 +0300 Stefan Kost * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: v4l2src: add a function pointer for get_frame function and optimize a bit Use a function-pointer for mmap/read, as this can't change during capture. Also sprinkle a few G_LIKELY/UNLIKELY to improve the error-less code path. 2009-09-11 22:15:01 +0300 Stefan Kost * sys/v4l2/gstv4l2.c: * sys/v4l2/v4l2src_calls.c: v4l2: log buffer copies on queue underrun in perf category v4l2src has a slow path where it does buffer-copies when it runs out of queued buffers. Log this to performance category to help monitoring it. 2009-09-11 15:14:15 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: pulsesink: Implement GstStreamVolume interface 2009-09-11 16:09:40 +0200 Sebastian Dröge * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: Implement mute property 2009-09-11 13:33:31 +0200 Wim Taymans * ext/gdk_pixbuf/gstgdkpixbufsink.c: gdkpixbufsink: fix docs refering to send-messages 2009-09-11 13:28:35 +0200 Wim Taymans * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: spectrum: add post-messages property Add a post-messages property and deprecate the less descriptive message property. 2009-09-11 13:20:06 +0200 Wim Taymans * ext/gdk_pixbuf/gstgdkpixbufsink.c: * ext/gdk_pixbuf/gstgdkpixbufsink.h: pixbufsink: add post-messages property Add post-messages and deprecate send-messages as the former is more descriptive of what actually happens. 2009-09-11 13:12:54 +0200 Wim Taymans * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: rename silent to post-messages Use the post-messages property name instead of silent as it is more descriptive. 2009-09-11 12:16:18 +0200 Wim Taymans * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: multifilesink: post messages for each buffer Add a silent property that can be set to FALSE to post messages on the bus for each written file. Do some more cleanups. Add some docs. Fixes #594663 2009-09-09 18:13:29 -0400 Olivier Crête * gst/rtp/gstrtph263pay.c: rtph263pay: Allocate Boundry structs on the stack instead of the heap to avoid leaks Fixes bug #594691. 2009-09-10 10:28:48 +0300 Stefan Kost * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: docs: fix gtk-doc warnings 2009-09-10 10:26:23 +0300 Stefan Kost * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2sink.h: docs: fix gtk-doc warnings 2009-09-09 17:51:19 -0700 David Schleef * ext/raw1394/Makefile.am: * ext/raw1394/gst1394clock.c: * ext/raw1394/gst1394clock.h: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gstdv1394src.h: dv1394src: Add a clock based on isochronous cycle counter Partial fix for #169383. 2009-09-09 16:02:03 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Fix AYUV->I420 conversion For this fix the averaging of the chroma values. It should't be (a/2 + b)/2 but just (a + b)/2. Fixes bug #594599. 2009-09-09 16:25:06 +0200 Wim Taymans * configure.ac: * ext/pulse/pulsesink.c: pulsesink: remove ringbuffer reset compensation Remove the code to deal with a ringbuffer reset as this code is now in the base class. Bump the -base requirement as we need the new baseaudiosink code to function properly. 2009-09-09 16:24:49 +0200 Wim Taymans * ext/pulse/pulsesink.h: pulsesink: whitespace fixes 2009-09-09 10:27:55 +0200 Wim Taymans * sys/v4l2/gstv4l2colorbalance.h: whitespace fixes 2009-09-08 19:34:09 +0200 Wim Taymans * ext/pulse/pulsemixer.c: * ext/pulse/pulsemixerctrl.c: * ext/pulse/pulseprobe.c: pulse: small cleanups Add some debug info Fix the state changes 2009-09-08 18:29:35 +0200 Marc-André Lureau * gst/multipart/multipartmux.c: multipartmux: mark data buffer as delta-unit So that multifdsink always start sending header buffer first Fixes #594520 2009-09-08 17:37:15 +0200 Marc Leeman * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: add ignore-pt parameter Add a parameter 'ignore-pt' that disables creating a gstrtpptdemux module and ghosts the pads of gstrtpjitterbuffer instead of the ones of gstrtpptdemux. Fixes #594490 2009-09-04 13:51:37 +0200 Marvin Schmidt * tests/check/elements/souphttpsrc.c: checks: only run HTTPS test if libsoup has SSL support 2009-09-08 13:59:56 +0200 Håvard Graff * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: propagate payload-type-change signal from demuxer fixes #594254 2009-08-31 18:46:25 +0200 Havard Graff * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: change severity of clock-rate change debug Make log GST_DEBUG under normal circumstances, GST_WARNING otherwise. Fixes #594253 2009-09-08 13:39:31 +0200 Håvard Graff * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: avoid throwing reordered buffers with same timestamps When we receive a reordered packet with the same timestamp as the previous one (which can happen for fragmented packets) don't consider the packet as lost but instead wait for the reordered packet to arrive. Switch the warning-level, so that a reordering does not get a warning, only an actual produced lost-packet. Fixes #594251 2009-08-31 21:16:54 +0200 Havard Graff * gst/rtp/gstrtpjpegdepay.c: rtpjpegdepay: add missing math.h include Fixes #594247 2009-09-08 13:30:29 +0200 Arnout Vandecappelle * gst/rtsp/gstrtspsrc.c: rtspsrc: fix memory leak In gst_rtspsrc_parse_digest_challenge(), rtspsrc does a g_strndup of the auth header items and then passes them to gst_rtsp_connection_set_auth_param() without freeing. Fixes #594133 2009-09-08 13:18:29 +0200 Stig Sandnes * gst/rtpmanager/gstrtpbin.c: rtpbin: make free_session() remove stream references When receiving a sync-packet, all sessions with the same cname will be compared and synced together. In this process, there could still be references to a session that has been shut down in the meanwhile. This patch makes sure that these references are removed when shutting down a session, so that the syncing can be done safely. Fixes #594283 2009-08-31 18:46:51 +0200 Havard Graff * gst/rtpmanager/gstrtpbin.c: rtpbin: use locked state on internal bins Set the locked state on internal elements to make sure that they don't change back to another state when shutting down. Fixes #594248 2009-09-07 18:28:51 +0200 Wim Taymans * sys/v4l2/gstv4l2object.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: v4l2src: add support for mpeg formats 2009-09-05 20:51:14 -0700 Zaheer Merali * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: y4menc: Add interlaced support Fixes #591713 Signed-off-by: David Schleef 2009-08-24 13:42:42 -0700 David Schleef * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfaudiosrc.c: * ext/gconf/gstgconfvideosink.c: * ext/gconf/gstgconfvideosrc.c: * gst/apetag/gstapedemux.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: * gst/avi/gstavidemux.c: * gst/avi/gstavimux.c: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: * sys/v4l2/gstv4l2src.c: Remove Ronald Bultje from Authors field Replaced with "GStreamer maintainers " or just removed, depending on the number of other authors. 2009-09-05 10:21:31 +0200 Sebastian Dröge * common: Automatic update of common submodule From 00a859e to 19fa4f3 2009-09-04 13:42:43 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: prevent a spurious debug warning 2009-09-04 09:32:42 +0200 Sebastian Dröge * sys/v4l2/gstv4l2object.c: v4l2: Define V4L2_FMT_FLAG_EMULATED if it's not defined yet libv4l2 already uses this flag, even on Linux kernel versions before 2.6.32. 2009-09-04 07:10:03 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Correctly handle NULL GstIndex 2009-09-03 20:40:17 +0200 Sebastian Dröge * sys/v4l2/gstv4l2object.c: v4l2: Fix stupid typo in last commit 2009-09-03 20:38:50 +0200 Sebastian Dröge * sys/v4l2/gstv4l2object.c: v4l2: Put emulated formats behind native formats Fixes bug #593764. 2009-09-03 19:37:10 +0200 Laurent Glayal * gst/rtpmanager/rtpsource.c: rtpsource: fix memleak Don't leak the input buffer when the received and expected seqnum are different when in probation. fixes #594039 2009-09-02 15:21:02 -0400 Olivier Crête * gst/rtpmanager/gstrtpjitterbuffer.c: rtpjitterbuffer: Lock clock_rate variable The priv->clock_rate variable could become -1 between when its checked to not be -1 and when its used, causing an assertion. Fixed by taking the mutex earlier in the chain() function. Fixes #593955 2009-09-03 19:12:39 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: whitespace fixes 2009-09-03 19:09:12 +0200 Wim Taymans * gst/rtp/gstrtpmpapay.c: rtpmpapay: whitespace fixes 2009-09-03 19:08:53 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: whitespace fixes 2009-09-03 17:33:28 +0200 Edward Hervey * ext/jpeg/gstjpegdec.c: jpegdec: Avoid unnecessary processing until we have a full picture. This is for non-packetized mode, when we know the upstream size in bytes. 2009-09-03 14:40:20 +0300 Stefan Kost * gst/flv/gstflvmux.c: flvmux: fully use tagsetter to manage the tags. Fixes #563221 There is no need to manage a separate taglist. 2009-09-03 14:13:43 +0300 Stefan Kost * ext/speex/gstspeexenc.c: speexenc: small taglist handling cleanup Don't eventualy leak the list and instead assert (like in other elements). 2009-09-02 23:12:41 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: also guard reseting subscribe callback with ifdefs It is conditionaly set, so do the same when unsetting. 2009-09-01 15:06:46 +0200 Peter Kjellerstedt * gst/rtpmanager/gstrtpsession.c: rtpmanager: Fixed a copy & paste error 2009-09-01 13:21:23 +0200 Peter Kjellerstedt * gst/rtpmanager/gstrtpsession.c: rtpmanager: Removed unused variable priv The variable priv was initialized in a lot of functions but then never used for anything. 2009-09-01 13:03:57 +0200 Peter Kjellerstedt * gst/rtpmanager/gstrtpsession.c: rtpmanager: A little clean up Make the code flow of gst_rtp_session_send_rtcp() and gst_rtp_session_sync_rtcp() identical. 2009-09-01 12:47:51 +0200 Peter Kjellerstedt * gst/rtpmanager/gstrtpsession.c: rtpmanager: Make sure that used caps are not freed already (take 2) This reintroduces the fix for bug #593391. It also applies it in gst_rtp_session_sync_rtcp() which has very similar code to gst_rtp_session_send_rtcp(). 2009-09-01 12:41:36 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: jitterbuffer: make sure time does not go backwards When we construct a timestamp that would result in a timestamp that is earlier than when the packet was received, reset the skew calculation as this is probably a sign that the sender restarted or paused. Fixes #593354 2009-09-01 11:32:41 +0200 Peter Kjellerstedt * gst/rtpmanager/gstrtpsession.c: rtpmanager: Set caps in gst_rtp_session_send_rtcp() correctly again The test for when to set an RTCP caps on the output pad in gst_rtp_session_send_rtcp() accidentally got inverted in the last commit. 2009-09-01 10:26:46 +0200 Sebastian Dröge * gst/qtdemux/qtdemux.c: qtdemux: Add support for QCELP audio Fixes bug #593757. 2009-08-31 18:10:11 +0200 Peter Kjellerstedt * gst/effectv/gstaging.c: * gst/effectv/gstedge.c: * gst/effectv/gstop.c: * gst/effectv/gstradioac.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: effectv: Fix compilation with gcc 3 Recent changes in gst-plugins-good/gst/effectv prevents it from being compiled with gcc 3. The problem is that the new code uses preprocessor conditionals within a macro call which does not work with older versions of gcc. Fixes bug #593688. 2009-08-31 16:20:59 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins-sections.txt: docs: small clean-ups in -sections.txt Remove duplicate entry for warptv; there is no taglibmux element. 2009-08-27 15:46:52 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmp4gdepay.c: rtpmp4gdepay: consider (optional) auxiliary data when parsing 2009-08-27 15:46:15 +0200 Mark Nauwelaerts * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gdepay.h: rtpmp4gdepay: handle broken AU-Index in non-interleaved streams In case of non-interleaved (= sequentially payloaded) streams, the AU-Index serves little purpose (that is not already covered by RTP fields). (Broken) Payloaders might consider this field then to be disregarded and have non spec compliant values, e.g. each RTP packet having AU-Index 2 (rather than 0). As such, ensure/force simple sequential sending of non-interleaved streams. 2009-08-18 17:17:28 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: also extract ftyp info in push mode 2009-08-13 16:11:59 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: qtdemux: consider 3gpp style tag parsing in some more cases 3GPP specs define a number of tags along with precise layout. While these are normally expected to be found in a container whose major brand is a 3GPP brand, this may also happen when a 3GPP brand is only mentioned as a compatible brand. Apply some checks, heuristic and fallbacks to extract such tags as well. 2009-08-11 13:56:43 +0200 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: wavparse: reflow exit, and fix some leaks 2009-08-11 13:54:56 +0200 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: wavparse: push mode; add pad if needed so downstream gets EOS 2009-08-10 16:19:03 +0200 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: * gst/wavparse/gstwavparse.h: wavparse: push mode; fix/improve chunk handling Handle large, invalid or otherwise unusual chunk sizes. Verify some chunk sizes to be at least the size they are expected to be and round up some sizes to even number for e.g. offset administration, which must also be properly tracked in push mode. 2009-08-08 21:54:00 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: * gst/avi/gstavidemux.h: avidemux: push mode; cater for unusual chunk sizes 2009-08-31 16:34:14 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpsession: use proper locking for pads and caps Use the sesion lock and shotdown variable to protect and ref the pads we are going to push on. fixes #561825 2009-08-31 16:33:26 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: whitespace fixes 2009-08-31 13:38:08 +0100 Tim-Philipp Müller * gst/wavparse/gstwavparse.c: wavparse: clean up adapter properly Reflow code so we don't try to clear or re-use an already-freed adapter. 2009-08-31 13:07:53 +0100 Tim-Philipp Müller * ext/flac/gstflactag.c: * gst/wavparse/gstwavparse.c: flactag, wavparse: GstAdapter is not a GstObject 2009-08-31 12:28:52 +0100 Tim-Philipp Müller * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: docs: update plugin docs to git version 2009-08-31 11:32:39 +0100 Jan Schmidt * gst/flv/gstflvdemux.c: flvdemux: Fix tests warning from setting a NULL index Setting a null index in the tests was causing warnings by unreffing NULL pointers. This is a bug exposed by a recent change in core, it seems. 2009-08-31 13:02:16 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: add slope estimation code and debug Add some code to measure the sender speed vs the receiver speed. This can be used to detect bursts. 2009-08-31 12:57:32 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: reset skew when timestamps change Refactor the jitterbuffer resync code. Reset the skew correction when we detect a big timestamp discont. See #593354 2009-08-31 12:47:15 +0200 Wim Taymans * gst/rtpmanager/rtpjitterbuffer.c: jitterbuffer: make sure time never goes invalid Since the skew can be negative, we might end up with invalid timestamps. Check for negative results and clamp to 0. See #593354 2009-08-31 12:16:01 +0200 Jarkko Palviainen * gst/udp/gstmultiudpsink.c: * gst/udp/gstmultiudpsink.h: * gst/udp/gstudpnetutils.c: udpsink: Add ttl multicast property Add a new ttl-mc property to control the TTL on multicast addresses. Fixes #588245 2009-08-31 12:13:07 +0200 Jarkko Palviainen * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpnetutils.c: * gst/udp/gstudpnetutils.h: udp: split out TTL and loop options Split setting the TTL and loop parameters in 2 methods as they are not related. Fix setting the TTL correctly for multicast streams. See #588245 2009-08-27 12:36:37 +0200 Wim Taymans * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: rtp: whitespace fixes 2009-08-14 13:45:22 +0200 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins.args: videobox: Correctly add to the docs 2009-08-14 13:40:21 +0200 Sebastian Dröge * gst/videobox/Makefile.am: * gst/videobox/gstvideobox.c: * gst/videobox/gstvideobox.h: videobox: Split declarations into a header file and add autocrop stuff to the docs 2009-08-14 13:26:36 +0200 Sebastian Dröge * gst/videobox/gstvideobox.c: videobox: Reconfigure basetransform if something changes again For this invent a new lock and don't abuse the basetransform lock, otherwise we'll end up in deadlocks. 2009-08-14 13:15:57 +0200 Stephen Jungels * gst/videobox/gstvideobox.c: videobox: Add support for autocropping according to the caps Fixes bug #582238. 2009-08-30 21:57:57 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpsession.c: rtpsession: Make sure that used caps are not freed already Fixes bug #593391. 2009-08-26 17:02:45 +0200 Sebastian Dröge * configure.ac: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtpmanager/rtpstats.c: rtp: Use new gst_iterator_new_single() for the internal linked pads iteration 2009-08-19 16:57:05 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpsession.c: rtpsession: Use iterate internal links instead of deprecated get internal links 2009-08-19 16:48:25 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: Use iterate internal links instead of deprecated get internal links 2009-08-19 16:37:11 +0200 Sebastian Dröge * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: Use iterate internal links instead of deprecated get internal links 2009-08-30 23:27:09 +0100 Tim-Philipp Müller * common: Update common 2009-08-30 23:26:48 +0100 Tim-Philipp Müller * configure.ac: Back to hacking -> 0.10.16.1 === release 0.10.16 === 2009-08-29 12:05:40 +0100 Tim-Philipp Müller * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Release 0.10.16 2009-08-26 00:58:45 +0100 Tim-Philipp Müller * configure.ac: 0.10.15.5 pre-release 2009-08-25 16:53:29 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: don't use relative seeks Don't use relative seeks, it's too hard to track where we are after a flush etc. fixes #593015 2009-08-24 17:50:29 +0100 Tim-Philipp Müller * configure.ac: * po/LINGUAS: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/lv.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: 0.10.15.4 pre-release 2009-08-24 16:22:47 +0200 Wim Taymans * ext/pulse/pulsesrc.c: pulsesrc: don't discard the result of _set_caps() Use the result of gst_pad_set_caps() instead of assuming success. See #590678 2009-08-21 11:44:43 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: add support for agsm Fixes #592530 2009-08-18 17:16:11 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix qt style string tag extraction QT style tags are tested on starting with (C) symbol using >>, and (unsigned) int (may) have different >> behaviour. Fixes #592232. 2009-08-17 15:48:20 +0100 Tim-Philipp Müller * ext/jpeg/smokecodec.c: smokeenc: don't crash when compiled against libjpeg7 Set parameters so that we don't crash with libjpeg7. Based on Stefan Kost's fix for jpegenc. Fixes #591951. 2009-08-14 20:18:04 +0100 Tim-Philipp Müller * configure.ac: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: 0.10.15.3 pre-release 2009-08-14 13:45:08 +0100 Tim-Philipp Müller * tests/check/elements/rtpbin.c: checks: add test for leak to rtpbin unit test See #591476. 2009-08-11 14:47:12 -0400 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Fix reference leak Fixes #591476. 2009-08-14 13:34:53 +0100 Zaheer Merali * ext/dv/gstdvdec.c: dvdec: set bottom field first on PAL interlaced content, not top field first DV interlaced content is always bottom field first. Fixes #591712. 2009-08-14 12:44:06 +0100 Hans de Goede * sys/v4l2/gstv4l2src.c: v4l2src: fix 'hang' with some cameras caused by bad timestamping if no framerate is available For cameras/drivers that don't support e.g. VIDIOC_G_PARM we'd end up without a framerate and would try to divide by 0, causing run-time warnings and all frames to be timestamped with 0, which makes sinks that sync against the clock drop them, causing 'hangs' (observed with the pwc driver and a Logitech QuickCam Pro 4000). So if we do not know the framerate, simply don't adjust the timestamps. Fixes #591451. 2009-08-14 10:11:25 +0200 Filippo Argiolas * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2src.c: v4l2src: clear format list in READY->NULL Clear format list and probed caps when going to NULL so if a new device is set we'll probe the formats again instead of using previously detected ones. Fixes bug #591747. 2009-08-11 17:30:41 +0100 Tim-Philipp Müller * configure.ac: * po/LINGUAS: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/de.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/tr.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: 0.10.15.2 pre-release 2009-08-11 15:25:39 +0100 Tim-Philipp Müller * MAINTAINERS: Add myself to MAINTAINERS file and update Wim's e-mail. 2009-08-11 03:08:01 +0100 Tim-Philipp Müller * sys/v4l2/Makefile.am: v4l2: fix make distcheck by disting some more headers 2009-08-11 02:42:16 +0100 Tim-Philipp Müller * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-wavparse.xml: docs: update 2009-08-11 02:31:44 +0100 Tim-Philipp Müller * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * gst-plugins-good.spec.in: * tests/check/Makefile.am: * tests/check/elements/.gitignore: * tests/check/pipelines/.gitignore: Move rtpmanager from -bad to -good. Hook up build infrastructure (autotools, docs, unit test). 2009-08-06 19:26:21 +0200 ric * gst/rtpmanager/rtpsource.c: rtpsource: avoid buffer leak on bad seqnum Fixes #590797 2009-07-28 18:18:20 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: allow for NULL caps on buffers Add the NULL caps check where it matters and also cover another case of potential NULL caps. Fixes #590030 2009-07-28 11:59:56 -0400 Olivier Crête * gst/rtpmanager/rtpsource.c: rtpsource: Incoming buffers do not always have caps 2009-07-27 15:46:23 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: avoid doing lip-sync in BYE When we get a BYE packet, don't do lip-sync with the SR inside because some senders have trouble constructing valid SR packets after BYE. 2009-07-27 13:17:20 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpbin: don't do lip-sync after a BYE After a BYE packet from a source, stop forwarding the SR packets for lip-sync to rtpbin. Some senders don't update their SR packets correctly after sending a BYE and then we break lip-sync. We prefer to let the jitterbuffers drain with the current lip-sync instead. 2009-07-27 12:43:02 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpbin: only reconsider once for BYE When iterating the sources of a BYE packet, don't signal a reconsideration for each of them but signal after we handled all sources. 2009-07-21 15:33:41 -0400 Olivier Crête * gst/rtpmanager/rtpsession.c: rtpsession: Free conflicting addresses on finalize 2009-07-01 12:55:03 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpbin: use new method for netaddress to string 2009-06-29 18:48:33 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * tests/check/elements/rtpbin.c: rtpbin: do better cleanup of the src ghostpads Connect to the pad-removed signal of the ptdemux elements so that we remove the ghostpads for them. Fixes cleanup when going to NULL as well as when releasing the sinkpads. Fixes #561752 2009-05-28 19:08:40 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: rtpsession: add a comment 2009-06-29 16:37:54 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpsession.c: rtpbin: add SDES property Remove all individual SDES properties and use one sdes property that takes a GstStructure instead. This will allow us to add more custom stuff to the SDES messages later. 2009-06-29 16:21:05 +0200 Wim Taymans * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: rtpbin: add SDES property that takes GstStructure Remove all individual SDES properties and use one sdes property that takes a GstStructure instead. This will allow us to add more custom stuff to the SDES messages later. 2009-06-02 17:46:08 +0200 Wim Taymans * gst/rtpmanager/Makefile.am: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpclient.h: * gst/rtpmanager/gstrtpmanager.c: rtpbin: removed old gstrtpclient 2009-06-19 19:09:19 +0200 Branko Subasic * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: * tests/check/elements/rtpbin_buffer_list.c: rtpbin: add support for buffer-list Add support for sending buffer-lists. Add unit test for testing that the buffer-list passed through rtpbin. fixes #585839 2009-06-19 16:21:28 +0100 Tim-Philipp Müller * gst/rtpmanager/gstrtpjitterbuffer.c: Make build without warnings with debugging disabled 2009-05-28 17:37:44 -0400 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Transform the right session sdes message Fixes #584165 2009-05-28 17:33:10 -0400 Olivier Crête * gst/rtpmanager/rtpsource.c: Add ssrc to application/x-rtp-source-sdes structure 2009-05-27 11:03:14 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsouce: the network address is in network order Bring the network address in netowkr byte order to the host order. 2009-05-26 15:40:52 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: byteswap the port from GstNetAddress Since the port in GstNetAddress is in network order we might need to byteswap it before adding it to the source statistics. 2009-05-25 13:46:29 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: remove ptdemux ghostpads 2009-05-25 13:33:20 +0200 Wim Taymans * tests/check/elements/rtpbin.c: tests: add receive rtpbin unit test 2009-05-22 16:41:19 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: add to new signal to remove SSRC pads 2009-05-22 16:35:20 +0200 Ali Sabil * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtpmanager/gstrtpssrcdemux.h: ssrcdemux: emit signal when pads are removed Add action signal to clear an SSRC in the ssrc demuxer. Add signal to notify of removed ssrc. See #554839 2009-05-22 15:45:19 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: use our ghostpads instead of its target Since we keep a reference to our ghostpads, we can use them to track sessions. This avoid us having to mess with the target of the ghostpad. 2009-05-22 15:37:29 +0200 Wim Taymans * tests/check/elements/rtpbin.c: tests: more rtpbin checks 2009-05-22 15:36:17 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: don't warn when getting request pads twice Allow getting the request pads multiple times, just return the previously created pads. 2009-05-22 13:47:30 +0200 Wim Taymans * gst/rtpmanager/rtpsource.c: rtpsource: add RTP and RTCP source address Add the RTP and RTCP sender addresses in the stats structure. 2009-05-22 13:45:15 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpsession: reuse source code for SDES Reuse the RTPSource object property instead of duplicating code. 2009-05-22 13:44:17 +0200 Wim Taymans * tests/check/elements/rtpbin.c: tests: add more rtpbin tests 2009-05-22 12:23:27 +0200 Wim Taymans * tests/check/elements/rtpbin.c: tests: add rtpbin unit test Add the beginnings of an rtpbin unit test Add some more stuff to .gitignore 2009-05-22 12:20:13 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: set target state on new elements Set the state on newly added elements to the state of the parent. Add some debug info and do some cleanups 2009-05-22 11:59:17 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: unref requests pads after releasing 2009-05-22 01:43:50 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Implement releasing the streams See #561752 2009-05-22 01:16:11 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Keep jb signals handler Keep the signal handlers so they can be disconnected at release time See #561752 2009-05-22 01:12:57 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: rtpbin: use the right lock for the sessions Use the right lock when iterating the sessions. 2009-05-22 01:03:55 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Free session if request pads are released Free the session when all the request pads are released. Don't mess with the session list in free_session as it is called from a foreach on that list. Set the state of the upstream element to NULL first. See #561752 2009-05-22 00:51:53 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Implement relasing of the rtp recv pad 2009-05-22 00:44:51 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Implement releasing of rtp send pads 2009-05-22 00:34:36 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Implement release of the recv rtcp pad See #561752 2009-05-22 00:16:19 +0200 Olivier Crête * gst/rtpmanager/gstrtpbin.c: rtpbin: Implement releasing of rtcp src pad See #561752 2009-05-05 16:48:37 +0200 Wim Taymans * gst/rtpmanager/gstrtpssrcdemux.c: rtpssrcdemux: drop unexpected RTCP packets We usually only get SR packets in our chain function but if an invalid packet contains the SR packet after the RR packet, we must not fail but simply ignore the malformed packet. Fixes #581375 2009-04-27 11:09:08 +0200 Olivier Crete * gst/rtpmanager/rtpsource.c: rtpsouce: make WARNING into LOG Since neither rtpmanager nor any of the payloaders properly implement pad allocation, there is no way for the rtpmanager to inform downstream elements of the new SSRC if there is an SSRC collision. So the warning is emitted all the time and it is confusing. Fixes #580144 2009-04-27 11:06:01 +0200 Olivier Crete * gst/rtpmanager/rtpsession.c: rtpsession: notify when SSRC changes Emit a g_object_notify when the SSRc changes because of a collision. Fixes #580144 2009-04-17 16:16:29 +0200 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpsession: join the RTCP thread Avoid a case where a joinable thread would be left unjoined, which leaked the thread structure. Fixes #577318. 2009-04-15 18:14:48 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: prevent overflow in EOS estimation Use a guint64 instead of a guint to hold a 64bit value to prevent completely bogues EOS estimation values due to overflows. 2009-04-15 17:44:17 +0200 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: rtpbin: we should not provide a clock There is no need to provide a clock. 2009-04-15 17:28:56 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: more estimated EOS fixes Do more accurate EOS estimate and guard against backward timestamps. 2009-04-15 17:25:02 +0200 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer: release lock before pushing EOS Make sure we release the jitterbuffer lock before we start pushing out data because else we might deadlock. 2009-03-27 17:44:57 +0100 Wim Taymans * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpjitterbuffer.h: rtpbin: add on_npt_stop signal Add the on_npt_stop signal to rtpbin and rtpjitterbuffer to notify the application that the NPT stop position has been reached. 2009-03-13 15:59:37 +0100 Wim Taymans * gst/rtpmanager/gstrtpsession.c: rtpbin: don't return FALSE on seek events Silently ignore the seek event instead of returning FALSE. 2009-02-26 13:10:29 +0100 Olivier Crête * gst/rtpmanager/gstrtpsession.c: gstrtpbin: Don't forward revc events to sender Don't send events from the receiver to the sender side. Fixes #572900. 2009-02-25 11:45:05 +0200 Stefan Kost * gst/rtpmanager/rtpjitterbuffer.c: docs: various doc fixes No short-desc as we have them in the element details. Also keep things (Makefile.am and sections.txt) sorted. Reword ambigous returns. No text after since please. 2009-01-23 12:13:00 +0100 Wim Taymans * gst/rtpmanager/rtpstats.c: Send BYE packets immediatly for small sessions When the number of participants is less than 50, the RFC allows for sending the BYE packet immediatly instead of using the regular BYE timeout. Fixes #567828. 2009-01-22 13:33:14 +0100 Wim Taymans * gst/rtpmanager/gstrtpjitterbuffer.c: Unlock the jitterbuffer before pushing out the packet-lost events. Move some code before we do the unlock to make the jitterbuffer state consistent while we are unlocked. 2009-01-02 17:40:06 +0000 Olivier Crete gst/rtpmanager/: When an SSRC is found on the caps of the sender RTP, use this as the internal SSRC. Fixes #565910. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_setcaps_send_rtp), (create_send_rtp_sink): * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): When an SSRC is found on the caps of the sender RTP, use this as the internal SSRC. Fixes #565910. 2009-01-02 16:50:53 +0000 Wim Taymans gst/rtpmanager/: Rename a method to better reflect what it really does. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_event_send_rtp_sink), (gst_rtp_session_getcaps_send_rtp): * gst/rtpmanager/rtpsession.c: (check_collision), (rtp_session_schedule_bye_locked), (rtp_session_schedule_bye): * gst/rtpmanager/rtpsession.h: Rename a method to better reflect what it really does. 2008-12-29 15:49:37 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Use method to get the internal SSRC. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_getcaps_send_rtp): Use method to get the internal SSRC. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (rtp_session_set_property), (rtp_session_get_property): Add property to congiure the internal SSRC of the session. Fixes #565910. 2008-12-29 15:21:58 +0000 Wim Taymans gst/rtpmanager/rtpsession.c: Only change the SSRC of the session and reset the internal source when the SSRC actually... Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): Only change the SSRC of the session and reset the internal source when the SSRC actually changed. See #565910. 2008-12-29 14:21:47 +0000 Wim Taymans gst/rtpmanager/rtpsource.*: When no payload was specified on the caps but there was a clock-rate, assume the clock-ra... Original commit message from CVS: * gst/rtpmanager/rtpsource.c: (rtp_source_init), (rtp_source_update_caps), (get_clock_rate): * gst/rtpmanager/rtpsource.h: When no payload was specified on the caps but there was a clock-rate, assume the clock-rate corresponds to the first payload type found in the RTP packets. Fixes #565509. 2008-12-23 11:39:59 +0000 Arnout Vandecappelle gst/rtpmanager/rtpjitterbuffer.*: Keep track of the last outgoing timestamp and of the last sender-side time. Timest... Original commit message from CVS: Patch by: Arnout Vandecappelle * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), (calculate_skew): * gst/rtpmanager/rtpjitterbuffer.h: Keep track of the last outgoing timestamp and of the last sender-side time. Timestamps can only go forward if they do at the sender side, can only go back if they do at the sender side, and remain the same if they remain the same at the sender side. Fixes #565319. 2008-11-26 12:40:18 +0000 Wim Taymans gst/rtpmanager/rtpsession.c: Make obtain_source return an aditional ref so that we don't lose our ref to it when a se... Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (obtain_source), (rtp_session_create_source), (rtp_session_process_rtp), (rtp_session_process_sr), (rtp_session_process_rr), (rtp_session_process_sdes), (rtp_session_process_bye): Make obtain_source return an aditional ref so that we don't lose our ref to it when a session cleanup occurs when we are emiting a signal. Emit the on_new_ssrc signal for the CSRC, not the SSRC. Fixes #562319. 2008-11-26 12:02:21 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Reset the sync parameters when clearing the payload type map too. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_reset_sync), (gst_rtp_bin_clear_pt_map): Reset the sync parameters when clearing the payload type map too. Fixes #562312. 2008-11-26 11:44:37 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Remove a lot of per stream state that is not needed and pass new info in the method call. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (get_client), (gst_rtp_bin_reset_sync), (gst_rtp_bin_associate), (gst_rtp_bin_handle_sync), (create_stream), (gst_rtp_bin_class_init), (new_ssrc_pad_found): * gst/rtpmanager/gstrtpbin.h: Remove a lot of per stream state that is not needed and pass new info in the method call. Add signal to reset sync parameters. Avoid parsing the caps to get a clock_base, we get this from the sync signal now. 2008-11-25 15:12:06 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Fix event leak. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_event_send_rtcp_src): Fix event leak. 2008-11-22 15:31:36 +0000 Wim Taymans gst/rtpmanager/rtpsession.c: Add property to configure the RTCP MTU. Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (rtp_session_init), (rtp_session_set_property), (rtp_session_get_property): Add property to configure the RTCP MTU. 2008-11-22 15:24:47 +0000 Wim Taymans gst/rtpmanager/rtpsession.c: Add G_PARAM_STATIC_STRINGS. Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (copy_source), (rtp_session_create_sources), (rtp_session_get_property): Add G_PARAM_STATIC_STRINGS. Add property to return a GValueArray of all known RTPSources in the session. * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), (rtp_source_create_sdes), (rtp_source_set_property), (rtp_source_get_property): Remove properties to set the various SDES items, an application is never supposed to change the RTPSource data. Change the SDES getter properties to one SDES property that returns all SDES items in a GstStructure. 2008-11-22 13:17:24 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Also unref the target pad for unknown pads. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): Also unref the target pad for unknown pads. 2008-11-21 16:17:22 +0000 Olivier Crete gst/rtpmanager/gstrtpbin.c: Release the right pads on rtpbin. Fixes #561752. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): Release the right pads on rtpbin. Fixes #561752. 2008-11-20 18:41:34 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Pass the running time to the session when processing RTP packets. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (get_current_times), (rtcp_thread), (gst_rtp_session_chain_recv_rtp): Pass the running time to the session when processing RTP packets. Improve the time function to provide more info. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (rtp_session_init), (update_arrival_stats), (rtp_session_process_rtp), (rtp_session_process_sdes), (rtp_session_process_rtcp), (session_start_rtcp), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Mark the internal source with a flag. Use running_time instead of the more useless timestamp. Validate a source when a valid SDES has been received. Pass the current system time when processing SR packets. * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), (rtp_source_init), (rtp_source_create_stats), (rtp_source_get_property), (rtp_source_send_rtp), (rtp_source_process_rb), (rtp_source_get_new_rb), (rtp_source_get_last_rb): * gst/rtpmanager/rtpsource.h: Add property to get source stats. Mark params as STATIC_STRINGS. Calculate the bitrate at the sender SSRC. Avoid negative values in the round trip time calculations. * gst/rtpmanager/rtpstats.h: Update some docs and change some variable name to more closely reflect what it contains. 2008-11-20 08:19:15 +0000 Sebastian Dröge gst/rtpmanager/gstrtpjitterbuffer.c: Initialize return value to fix compiler warning about uninitialized variable. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain_rtcp): Initialize return value to fix compiler warning about uninitialized variable. 2008-11-19 16:48:38 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Mark signal arg as static scope. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init): Mark signal arg as static scope. 2008-11-19 09:06:29 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Remove internal sync pad, use signals instead to get lip-sync notifications. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), (gst_rtp_bin_handle_sync), (create_stream), (free_stream), (new_ssrc_pad_found): Remove internal sync pad, use signals instead to get lip-sync notifications. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_base_init), (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_internal_links), (create_rtcp_sink), (remove_rtcp_sink), (gst_rtp_jitter_buffer_request_new_pad), (gst_rtp_jitter_buffer_release_pad), (gst_rtp_jitter_buffer_sink_rtcp_event), (gst_rtp_jitter_buffer_chain_rtcp), (gst_rtp_jitter_buffer_get_property): * gst/rtpmanager/gstrtpjitterbuffer.h: Make it possible to send SR packets to the jitterbuffer. Check if the SR timestamps are valid by comparing them to the RTP timestamps. Signal the SR packet and the timing information to listeners. * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), (gst_rtp_ssrc_demux_rtcp_chain), (gst_rtp_ssrc_demux_src_query): Remove some unused code. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), (calculate_skew), (rtp_jitter_buffer_get_sync): * gst/rtpmanager/rtpjitterbuffer.h: Keep track of the last seen RTP timestamp so that we can filter out invalid SR packets. 2008-11-17 19:47:32 +0000 Sebastian Dröge gst/rtpmanager/rtpsource.c: Fix GST_DEBUG call to only have as many arguments as required by the format string. Fixes... Original commit message from CVS: * gst/rtpmanager/rtpsource.c: (get_clock_rate): Fix GST_DEBUG call to only have as many arguments as required by the format string. Fixes a compiler warning. 2008-11-17 15:17:52 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Do not try to keep track of the clock-rate ourselves but simply get the value from the ji... Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain), (create_stream), (new_ssrc_pad_found): Do not try to keep track of the clock-rate ourselves but simply get the value from the jitterbuffer. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_get_sync): * gst/rtpmanager/gstrtpjitterbuffer.h: Add some debug info. Pass the clock-rate to the jitterbuffer. Also pass the clock-rate along with the rtp timestamp when getting the sync parameters. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): Fix some debug. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), (calculate_skew), (rtp_jitter_buffer_get_sync): * gst/rtpmanager/rtpjitterbuffer.h: Keep track of clock-rate changes and return the clock-rate together with the rtp timestamps used for sync. Don't try to construct timestamps when we have no base_time. * gst/rtpmanager/rtpsource.c: (get_clock_rate): Request a new clock-rate when the payload type changes. Reset the jitter calculation when the clock-rate changes. 2008-11-13 15:48:54 +0000 Wim Taymans gst/rtpmanager/: Small cleanups and some more debug info. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_chain): * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), (calculate_skew): Small cleanups and some more debug info. 2008-11-10 15:26:40 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Also configure the next expected output seqnum when we get a seqnum-base on the ... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain): Also configure the next expected output seqnum when we get a seqnum-base on the caps. 2008-11-04 12:42:30 +0000 Stefan Kost Don't install static libs for plugins. Fixes #550851 for -bad. Original commit message from CVS: * ext/alsaspdif/Makefile.am: * ext/amrwb/Makefile.am: * ext/apexsink/Makefile.am: * ext/arts/Makefile.am: * ext/artsd/Makefile.am: * ext/audiofile/Makefile.am: * ext/audioresample/Makefile.am: * ext/bz2/Makefile.am: * ext/cdaudio/Makefile.am: * ext/celt/Makefile.am: * ext/dc1394/Makefile.am: * ext/dirac/Makefile.am: * ext/directfb/Makefile.am: * ext/divx/Makefile.am: * ext/dts/Makefile.am: * ext/faac/Makefile.am: * ext/faad/Makefile.am: * ext/gsm/Makefile.am: * ext/hermes/Makefile.am: * ext/ivorbis/Makefile.am: * ext/jack/Makefile.am: * ext/jp2k/Makefile.am: * ext/ladspa/Makefile.am: * ext/lcs/Makefile.am: * ext/libfame/Makefile.am: * ext/libmms/Makefile.am: * ext/metadata/Makefile.am: * ext/mpeg2enc/Makefile.am: * ext/mplex/Makefile.am: * ext/musepack/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/mythtv/Makefile.am: * ext/nas/Makefile.am: * ext/neon/Makefile.am: * ext/ofa/Makefile.am: * ext/polyp/Makefile.am: * ext/resindvd/Makefile.am: * ext/sdl/Makefile.am: * ext/shout/Makefile.am: * ext/snapshot/Makefile.am: * ext/sndfile/Makefile.am: * ext/soundtouch/Makefile.am: * ext/spc/Makefile.am: * ext/swfdec/Makefile.am: * ext/tarkin/Makefile.am: * ext/theora/Makefile.am: * ext/timidity/Makefile.am: * ext/twolame/Makefile.am: * ext/x264/Makefile.am: * ext/xine/Makefile.am: * ext/xvid/Makefile.am: * gst-libs/gst/app/Makefile.am: * gst-libs/gst/dshow/Makefile.am: * gst/aiffparse/Makefile.am: * gst/app/Makefile.am: * gst/audiobuffer/Makefile.am: * gst/bayer/Makefile.am: * gst/cdxaparse/Makefile.am: * gst/chart/Makefile.am: * gst/colorspace/Makefile.am: * gst/dccp/Makefile.am: * gst/deinterlace/Makefile.am: * gst/deinterlace2/Makefile.am: * gst/dvdspu/Makefile.am: * gst/festival/Makefile.am: * gst/filter/Makefile.am: * gst/flacparse/Makefile.am: * gst/flv/Makefile.am: * gst/games/Makefile.am: * gst/h264parse/Makefile.am: * gst/librfb/Makefile.am: * gst/mixmatrix/Makefile.am: * gst/modplug/Makefile.am: * gst/mpeg1sys/Makefile.am: * gst/mpeg4videoparse/Makefile.am: * gst/mpegdemux/Makefile.am: * gst/mpegtsmux/Makefile.am: * gst/mpegvideoparse/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/nuvdemux/Makefile.am: * gst/overlay/Makefile.am: * gst/passthrough/Makefile.am: * gst/pcapparse/Makefile.am: * gst/playondemand/Makefile.am: * gst/rawparse/Makefile.am: * gst/real/Makefile.am: * gst/rtjpeg/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/scaletempo/Makefile.am: * gst/sdp/Makefile.am: * gst/selector/Makefile.am: * gst/smooth/Makefile.am: * gst/smoothwave/Makefile.am: * gst/speed/Makefile.am: * gst/speexresample/Makefile.am: * gst/stereo/Makefile.am: * gst/subenc/Makefile.am: * gst/tta/Makefile.am: * gst/vbidec/Makefile.am: * gst/videodrop/Makefile.am: * gst/videosignal/Makefile.am: * gst/virtualdub/Makefile.am: * gst/vmnc/Makefile.am: * gst/y4m/Makefile.am: * sys/acmenc/Makefile.am: * sys/cdrom/Makefile.am: * sys/dshowdecwrapper/Makefile.am: * sys/dshowsrcwrapper/Makefile.am: * sys/dvb/Makefile.am: * sys/dxr3/Makefile.am: * sys/fbdev/Makefile.am: * sys/oss4/Makefile.am: * sys/qcam/Makefile.am: * sys/qtwrapper/Makefile.am: * sys/vcd/Makefile.am: * sys/wininet/Makefile.am: * win32/common/config.h: Don't install static libs for plugins. Fixes #550851 for -bad. 2008-10-16 13:05:37 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Fix problem with using the output seqnum counter to check for input seqnum disco... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_flush_start), (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Fix problem with using the output seqnum counter to check for input seqnum discontinuities. Improve gap detection and recovery, reset and flush the jitterbuffer on seqnum restart. Fixes #556520. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_insert): Fix wrong G_LIKELY. 2008-10-16 09:51:28 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Install event handler on the rtcp_src pad, make LATENCY event return Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_event_send_rtcp_src), (create_send_rtcp_src): Install event handler on the rtcp_src pad, make LATENCY event return TRUE. 2008-10-07 18:54:41 +0000 Håvard Graff gst/rtpmanager/gstrtpbin-marshal.list: Add marshaller for new action signal. Original commit message from CVS: Patch by: Håvard Graff * gst/rtpmanager/gstrtpbin-marshal.list: Add marshaller for new action signal. * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_internal_session), (gst_rtp_bin_class_init): * gst/rtpmanager/gstrtpbin.h: Add action signal to retrieve the internal RTPSession object. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_get_property), (gst_rtp_session_release_pad): Add property to access the internal RTPSession object. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (check_collision): * gst/rtpmanager/rtpsession.h: Add action signal to retrieve an RTPSource object by SSRC. See #555396. 2008-10-07 11:33:10 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Release pads of the session manager. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (find_session_by_pad), (free_session), (gst_rtp_bin_dispose), (remove_recv_rtp), (remove_recv_rtcp), (remove_send_rtp), (remove_rtcp), (gst_rtp_bin_release_pad): Release pads of the session manager. Start implementing releasing pads of gstrtpbin. * gst/rtpmanager/gstrtpsession.c: (remove_recv_rtp_sink), (remove_recv_rtcp_sink), (remove_send_rtp_sink), (remove_send_rtcp_src), (gst_rtp_session_release_pad): Implement releasing pads in gstrtpsession. 2008-10-07 10:02:20 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Only update the seqnum-base when it was not already configured for the streams. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_parse_caps): Only update the seqnum-base when it was not already configured for the streams. 2008-09-30 15:08:52 +0000 Wim Taymans gst/rtpmanager/rtpsession.c: Ref the rtpsource object before we release the session lock when we emit the signals. Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), (on_ssrc_active), (on_ssrc_sdes), (on_bye_ssrc), (on_bye_timeout), (on_timeout), (on_sender_timeout): Ref the rtpsource object before we release the session lock when we emit the signals. 2008-09-23 18:13:31 +0000 Wim Taymans gst/rtpmanager/: Fix some docs. Original commit message from CVS: * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_insert), (rtp_jitter_buffer_get_sync): * gst/rtpmanager/rtpsession.c: (on_sender_timeout), (session_cleanup): * gst/rtpmanager/rtpsource.c: Fix some docs. 2008-09-17 13:59:21 +0000 Jan Schmidt Fix compiler warnings on OS/X Original commit message from CVS: * ext/jack/gstjackaudiosink.c: (jack_process_cb): * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): Fix compiler warnings on OS/X 2008-09-13 01:37:50 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Do not try to adjust the offset of streams for which we have not yet seen an SR packet. A... Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session), (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain): Do not try to adjust the offset of streams for which we have not yet seen an SR packet. Avoids large ts-offsets in some cases. 2008-09-05 13:52:34 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Add signal to notify listeners when a sender becomes a receiver. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (on_sender_timeout), (create_session), (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain), (gst_rtp_bin_class_init), (gst_rtp_bin_request_new_pad): * gst/rtpmanager/gstrtpbin.h: Add signal to notify listeners when a sender becomes a receiver. Tweak lip-sync code, don't store our own copy of the ts-offset of the jitterbuffer, don't adjust sync if the change is less than 4msec. Get the RTP timestamp <-> GStreamer timestamp relation directly from the jitterbuffer instead of our inaccurate version from the source. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_get_sync): * gst/rtpmanager/gstrtpjitterbuffer.h: Add G_LIKELY macros, use global defines for max packet reorder and dropouts. Reset the jitterbuffer clock skew detection when packets seqnums are changed unexpectedly. * gst/rtpmanager/gstrtpsession.c: (on_sender_timeout), (gst_rtp_session_class_init), (gst_rtp_session_init): * gst/rtpmanager/gstrtpsession.h: Add sender timeout signal. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), (calculate_skew), (rtp_jitter_buffer_insert), (rtp_jitter_buffer_get_sync): * gst/rtpmanager/rtpjitterbuffer.h: Add some G_LIKELY macros. Keep track of the extended RTP timestamp so that we can report the RTP timestamp <-> GStreamer timestamp relation for lip-sync. Remove server timestamp gap detection code, the server can sometimes make a huge gap in timestamps (talk spurts,...) see #549774. Detect timetamp weirdness instead by observing the sender/receiver timestamp relation and resync if it changes more than 1 second. Add method to report about the current rtp <-> gst timestamp relation which is needed for lip-sync. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (on_sender_timeout), (check_collision), (rtp_session_process_sr), (session_cleanup): * gst/rtpmanager/rtpsession.h: Add sender timeout signal. Remove inaccurate rtp <-> gst timestamp relation code, the jitterbuffer can now do an accurate reporting about this. * gst/rtpmanager/rtpsource.c: (rtp_source_init), (rtp_source_update_caps), (calculate_jitter), (rtp_source_process_rtp): * gst/rtpmanager/rtpsource.h: Remove inaccurate rtp <-> gst timestamp relation code. * gst/rtpmanager/rtpstats.h: Define global max-reorder and max-dropout constants for use in various subsystems. 2008-08-28 15:21:45 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Send EOS when the session object instructs us to. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp), (gst_rtp_session_event_send_rtp_sink): Send EOS when the session object instructs us to. * gst/rtpmanager/rtpsession.c: (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Make it possible for the session manager to instruct us to send EOS. We currently will EOS when the session is a sender and when the sender part goes EOS. This is not entirely correct behaviour because the session could still participate as a receiver. Fixes #549409. 2008-08-13 14:31:02 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Reset rtp timestamp interpollation when we detect a gap when the clock_base changed. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain), (new_ssrc_pad_found): Reset rtp timestamp interpollation when we detect a gap when the clock_base changed. Don't try to adjust the ts-offset when it's too big (> 3seconds) * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_set_ssrc): * gst/rtpmanager/gstrtpsession.h: Add method to set session SSRC. * gst/rtpmanager/rtpsession.c: (check_collision), (rtp_session_set_internal_ssrc), (rtp_session_get_internal_ssrc), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Added debugging for the collision checks. Add method to change the internal SSRC of the session. * gst/rtpmanager/rtpsource.c: (rtp_source_process_rtp): Reset the clock base when we detect large jumps in the seqnums. 2008-08-11 07:20:15 +0000 Stefan Kost gst/rtpmanager/gstrtpbin.c: Print the pad-name in debug log. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: Print the pad-name in debug log. * sys/dshowsrcwrapper/gstdshowaudiosrc.c: * sys/dshowsrcwrapper/gstdshowvideosrc.c: Use "-" instead of "_" in property names. Can we call them just "device" like everywhere else? 2008-08-05 09:42:53 +0000 Olivier Crete gst/rtpmanager/gstrtpjitterbuffer.c: Make the buffer metadata writable before inserting it in the jitterbuffer becaus... Original commit message from CVS: Based on patch by: Olivier Crete * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Make the buffer metadata writable before inserting it in the jitterbuffer because the jitterbuffer will modify the timestamps. * gst/rtpmanager/rtpjitterbuffer.c: Update method comment about requiring writable metadata on buffers. * gst/rtpmanager/rtpsession.c: (rtp_session_process_sr), (rtp_session_process_rtcp): Make the RTCP buffer metadata writable because we want to modify the metadata. Fixes #546312. 2008-08-05 09:00:50 +0000 Håvard Graff gst/rtpmanager/gstrtpjitterbuffer.c: Fix debug by logging the right seqnum. Original commit message from CVS: Patch by: Håvard Graff * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain): Fix debug by logging the right seqnum. 2008-08-05 08:58:27 +0000 Olivier Crete gst/rtpmanager/gstrtpbin.c: Release lock before emitting the request-pt-map signal. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpbin.c: (get_pt_map): Release lock before emitting the request-pt-map signal. Fixes #543480. 2008-07-03 14:44:51 +0000 Peter Kjellerstedt gst/rtpmanager/: Corrected a typo (interpollate -> interpolate). Original commit message from CVS: * ChangeLog: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/rtpsource.c: (rtp_source_get_new_sr): Corrected a typo (interpollate -> interpolate). 2008-07-03 14:31:10 +0000 Peter Kjellerstedt gst/rtpmanager/: Changed some GST_DEBUG() to GST_LOG() to reduce the spam when a pipeline is running normally. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), (gst_rtp_session_send_rtp), (gst_rtp_session_send_rtcp), (gst_rtp_session_sync_rtcp), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_chain_send_rtp): * gst/rtpmanager/rtpsession.c: (source_push_rtp), (rtp_session_send_rtp): * gst/rtpmanager/rtpsource.c: (push_packet), (calculate_jitter), (rtp_source_process_rtp), (rtp_source_send_rtp): Changed some GST_DEBUG() to GST_LOG() to reduce the spam when a pipeline is running normally. 2008-07-03 13:47:19 +0000 Peter Kjellerstedt gst/rtpmanager/: Do not mix the use of g_get_current_time() with gst_clock_get_time(). Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_init), (gst_rtp_session_finalize), (rtcp_thread), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_event_send_rtp_sink), (gst_rtp_session_chain_send_rtp): * gst/rtpmanager/rtpsession.c: (check_collision), (update_arrival_stats), (rtp_session_process_rtp), (rtp_session_process_rtcp), (rtp_session_send_rtp), (rtp_session_send_bye_locked), (rtp_session_send_bye), (rtp_session_next_timeout), (session_report_blocks), (session_cleanup), (is_rtcp_time), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Do not mix the use of g_get_current_time() with gst_clock_get_time(). 2008-06-16 07:30:34 +0000 Stefan Kost Final round of doc updates. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/speed/gstspeed.c: * gst/speexresample/gstspeexresample.c: * gst/videosignal/gstvideoanalyse.c: * gst/videosignal/gstvideodetect.c: * gst/videosignal/gstvideomark.c: * sys/dvb/gstdvbsrc.c: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: * sys/wininet/gstwininetsrc.c: Final round of doc updates. 2008-06-16 07:03:58 +0000 Stefan Kost gst/: More doc updates. More xrefs. Original commit message from CVS: * gst/deinterlace/gstdeinterlace.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/sdp/gstsdpdemux.c: More doc updates. More xrefs. 2008-06-12 14:49:18 +0000 Stefan Kost Do not use short_description in section docs for elements. We extract them from element details and there will be war... Original commit message from CVS: * ext/dc1394/gstdc1394.c: * ext/ivorbis/vorbisdec.c: * ext/jack/gstjackaudiosink.c: * ext/metadata/gstmetadatademux.c: * ext/mythtv/gstmythtvsrc.c: * ext/theora/theoradec.c: * gst-libs/gst/app/gstappsink.c: * gst/bayer/gstbayer2rgb.c: * gst/deinterlace/gstdeinterlace.c: * gst/rawparse/gstaudioparse.c: * gst/rawparse/gstvideoparse.c: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/selector/gstinputselector.c: * gst/selector/gstoutputselector.c: * gst/videosignal/gstvideoanalyse.c: * gst/videosignal/gstvideodetect.c: * gst/videosignal/gstvideomark.c: * sys/oss4/oss4-mixer.c: * sys/oss4/oss4-sink.c: * sys/oss4/oss4-source.c: Do not use short_description in section docs for elements. We extract them from element details and there will be warnings if they differ. Also fixing up the ChangeLog order. 2008-06-06 13:01:05 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Fix deadlock when shutting down, use a new lock instead to properly shutdown. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_init), (gst_rtp_bin_finalize), (gst_rtp_bin_change_state): Fix deadlock when shutting down, use a new lock instead to properly shutdown. 2008-05-27 16:48:10 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Break out of callbacks when we are shutting down. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_propagate_property_to_jitterbuffer), (gst_rtp_bin_change_state), (new_payload_found), (new_ssrc_pad_found): Break out of callbacks when we are shutting down. Make sure no state changes can happen when we reconfigure. 2008-05-26 10:09:29 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: When checking the seqnum, reset the jitterbuffer if the gap is too big, we need ... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): When checking the seqnum, reset the jitterbuffer if the gap is too big, we need to do this so that we can better handle a restarted source. Fix some comments. * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew), (rtp_jitter_buffer_insert): Tweak the skew resync diff. Use our working seqnum compare function in -base. Rework the jitterbuffer insert code to make it clearer and more performant by only retrieving the seqnum of the input buffer once and by adding some G_LIKELY compiler hints. Improve debugging for duplicate packets. * gst/rtpmanager/rtpsource.c: (rtp_source_process_rtp): Fix a comment, we don't do skew correction here.. 2008-05-26 10:00:24 +0000 Håvard Graff gst/rtpmanager/gstrtpbin.c: Propagate the do-lost and latency properties to the jitterbuffers when they are changed o... Original commit message from CVS: Patch by: Håvard Graff * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_propagate_property_to_jitterbuffer), (gst_rtp_bin_set_property): Propagate the do-lost and latency properties to the jitterbuffers when they are changed on rtpbin. 2008-05-26 09:57:40 +0000 Wim Taymans Don't use _gst_pad(). Original commit message from CVS: * examples/switch/switcher.c: (switch_timer): * gst/replaygain/gstrgvolume.c: (gst_rg_volume_init): * gst/rtpmanager/gstrtpclient.c: (create_stream): * gst/sdp/gstsdpdemux.c: (gst_sdp_demux_stream_configure_udp), (gst_sdp_demux_stream_configure_udp_sink): * tests/check/elements/deinterleave.c: (GST_START_TEST), (pad_added_setup_data_check_float32_8ch_cb): * tests/check/elements/rganalysis.c: (send_eos_event), (send_tag_event): Don't use _gst_pad(). 2008-05-16 19:56:30 +0000 Jan Schmidt docs/Makefile.am: Don't attempt to build plugin docs when they're disabled. Original commit message from CVS: * docs/Makefile.am: Don't attempt to build plugin docs when they're disabled. * gst/bayer/Makefile.am: Add libgstvideo to the link. * gst/rtpmanager/Makefile.am: Fix link order, and move LIBS things to _LIBS 2008-05-14 21:02:19 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Simply drop bad RTP packets with a warning instead of just posting an error and ... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain): Simply drop bad RTP packets with a warning instead of just posting an error and stopping. This is a perfectly recoverable event and we don't force people to use an rtpbin to filter out bad packets first. 2008-05-13 09:06:51 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Actually add the do-lost property to the object. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): Actually add the do-lost property to the object. 2008-05-12 18:43:41 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Avoid waiting for a negative (huge) duration when the last packet has a lower ti... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): Avoid waiting for a negative (huge) duration when the last packet has a lower timestamp than the current packet. 2008-05-12 14:28:09 +0000 Peter Kjellerstedt gst/rtpmanager/gstrtpsession.c: Make sure to unref the rtpsession returned by gst_pad_get_parent() to prevent a memor... Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_query_send_rtcp_src): Make sure to unref the rtpsession returned by gst_pad_get_parent() to prevent a memory leak. 2008-05-12 14:12:08 +0000 Jan Schmidt gst/rtpmanager/gstrtpjitterbuffer.c: Initialise with GST_CLOCK_TIME_NONE to avoid compiler warning. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): Initialise with GST_CLOCK_TIME_NONE to avoid compiler warning. 2008-05-09 07:41:58 +0000 Peter Kjellerstedt gst/rtpmanager/rtpsource.c: Make sure to unref the caps used by RTPSource to prevent a memory leak. Original commit message from CVS: * gst/rtpmanager/rtpsource.c: (rtp_source_finalize): Make sure to unref the caps used by RTPSource to prevent a memory leak. 2008-05-08 09:43:33 +0000 Olivier Crete gst/rtpmanager/rtpsession.c: Unlock the session lock when calling one of our callbacks. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/rtpsession.c: (source_clock_rate), (rtp_session_process_bye), (rtp_session_send_bye_locked): Unlock the session lock when calling one of our callbacks. Fixes #532011. 2008-05-08 06:23:39 +0000 Sjoerd Simons gst/rtpmanager/gstrtpsession.c: Send RTP BYE command on EOS. Fixes bug #531955. Original commit message from CVS: Patch by: Sjoerd Simons * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_event_send_rtp_sink): Send RTP BYE command on EOS. Fixes bug #531955. 2008-04-25 11:32:09 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Expose new jitterbuffer property in rtpbin too. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_stream), (gst_rtp_bin_init), (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): * gst/rtpmanager/gstrtpbin.h: Expose new jitterbuffer property in rtpbin too. 2008-04-25 11:22:13 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Disable sending out rtp packet lost events by default and make a property to ena... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): Disable sending out rtp packet lost events by default and make a property to enabe it. We will likely enable it by default when the base depayloaders have a default handler for them so that we don't send these events all through the pipeline for now. 2008-04-25 09:35:43 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Remove private version of a function that is in -base now. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_src_event), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Remove private version of a function that is in -base now. Add src event handler. Rework the jitterbuffer pushing loop so that it can quickly react to lost packets and instruct the depayloader of them. This can then be used to implement error concealment data. 2008-04-25 08:21:06 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Set up some internal links functions for the RTCP and sync pads because the defaults ... Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_query_send_rtcp_src), (create_recv_rtcp_sink), (create_send_rtcp_src): Set up some internal links functions for the RTCP and sync pads because the defaults are really not correct. Implement a query handler for the RTCP src pad, mostly to correctly report about the latency. 2008-04-25 08:15:58 +0000 Wim Taymans gst/rtpmanager/: Also keep track of the first buffer timestamp together with the first Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain): * gst/rtpmanager/rtpsession.c: (update_arrival_stats), (rtp_session_process_sr), (rtp_session_on_timeout): * gst/rtpmanager/rtpsource.c: (rtp_source_init), (calculate_jitter): * gst/rtpmanager/rtpsource.h: * gst/rtpmanager/rtpstats.h: Also keep track of the first buffer timestamp together with the first RTP timestamp as they both are needed to construct the timing of outgoing packets in the jitterbuffer and are therefore also needed to manage lip-sync. This fixes lip-sync if the first RTP packets arrive with a wildly different gap. 2008-04-21 08:26:37 +0000 Olivier Crete gst/rtpmanager/gstrtpbin.c: Ref caps when inserting into the cache. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), (new_ssrc_pad_found): Ref caps when inserting into the cache. Don't leak pads. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_get_clock_rate), (gst_rtp_jitter_buffer_query): Avoid a caps leak. Don't leak refcount in query. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps), (gst_rtp_pt_demux_chain): Avoid caps leaks. * gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure), (gst_rtp_session_init), (return_true), (gst_rtp_session_clear_pt_map), (gst_rtp_session_cache_caps), (gst_rtp_session_clock_rate): Ref caps when inserting into the cache. Fix some more caps leaks. Fixes #528245. 2008-04-17 07:31:44 +0000 Wim Taymans gst/rtpmanager/: Unset GValues after g_signal_emitv so that we avoid a refcount leak. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (get_pt_map), (free_client), (gst_rtp_bin_associate), (gst_rtp_bin_get_free_pad_name): * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_get_clock_rate): * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps): * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): Unset GValues after g_signal_emitv so that we avoid a refcount leak. Don't leak a padname. Don't leak client streams list. Lock rtpbin when associating streams. Fixes #528245. 2008-04-09 22:27:50 +0000 Peter Kjellerstedt gst/rtpmanager/: Avoid leaking pads in the RTP manager. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (free_session): * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize): Avoid leaking pads in the RTP manager. 2008-03-11 12:40:58 +0000 Olivier Crete gst/rtpmanager/rtpsession.*: Implement collision and loop detection in rtpmanager. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/rtpsession.c: (find_add_conflicting_addresses), (check_collision), (obtain_source), (rtp_session_create_new_ssrc), (rtp_session_create_source), (rtp_session_process_rtp), (rtp_session_process_sr), (rtp_session_process_rr), (rtp_session_process_sdes), (rtp_session_process_bye), (rtp_session_send_bye_locked), (rtp_session_send_bye), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Implement collision and loop detection in rtpmanager. Fixes #520626. * gst/rtpmanager/rtpsource.c: (rtp_source_reset), (rtp_source_init): * gst/rtpmanager/rtpsource.h: Add method to reset stats. 2008-03-11 11:36:03 +0000 Ole André Vadla Ravnås gst/rtpmanager/gstrtpsession.c: Avoid a deadlock when joining the RTCP thread in PAUSED because it might be blocked d... Original commit message from CVS: Based on patch by: Ole André Vadla Ravnås * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_init), (rtcp_thread), (start_rtcp_thread), (stop_rtcp_thread), (join_rtcp_thread), (gst_rtp_session_change_state): Avoid a deadlock when joining the RTCP thread in PAUSED because it might be blocked downstream. Also avoid spawning multiple rtcp threads. Fixes #520894. 2008-03-11 10:43:32 +0000 Stefan Kost gst/rtpmanager/rtpjitterbuffer.c: Don't try to reset the clock skew when we have no timestamps. Original commit message from CVS: Patch by: Stefan Kost * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): Don't try to reset the clock skew when we have no timestamps. Fixes #519005. 2008-02-20 09:33:25 +0000 Olivier Crete gst/rtpmanager/gstrtpbin.c: Fix small memory leak, leaking caps. Fixes #bug 517571. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpbin.c: (new_ssrc_pad_found): Fix small memory leak, leaking caps. Fixes #bug 517571. 2008-02-14 16:25:51 +0000 Olivier Crete gst/rtpmanager/gstrtpbin.c: Ignore streams that did not receive an SR packet when doing synchronisation. Fixes #516160. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate): Ignore streams that did not receive an SR packet when doing synchronisation. Fixes #516160. 2008-01-29 18:57:27 +0000 Thijs Vermeir gst/rtpmanager/gstrtpjitterbuffer.c: Try to get the new clock-rate from the buffer caps when we receive a new payload... Original commit message from CVS: Patch by: Thijs Vermeir * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain): Try to get the new clock-rate from the buffer caps when we receive a new payload type instead of always firing the signal. Fixes #512774. 2008-01-25 16:58:00 +0000 Olivier Crete gst/rtpmanager/gstrtpbin.c: Also handle lip-sync when the clock-rate is not provided with caps but with a signal. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), (create_stream), (payload_type_change), (new_ssrc_pad_found): Also handle lip-sync when the clock-rate is not provided with caps but with a signal. 2008-01-25 16:00:52 +0000 Olivier Crete gst/rtpmanager/: Remove the fixed clock-rate from the jitterbuffer and extend it so that a clock-rate can be provided... Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain): * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew), (rtp_jitter_buffer_insert): * gst/rtpmanager/rtpjitterbuffer.h: Remove the fixed clock-rate from the jitterbuffer and extend it so that a clock-rate can be provided with each buffer instead. Fixes #511686. 2008-01-25 15:49:55 +0000 Olivier Crete gst/rtpmanager/gstrtpjitterbuffer.c: Remove old unused variable. Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Remove old unused variable. Track pt on input buffers and get the clock-rate when it changes. Ignore packets with unknown clock-rate. See #511686. 2008-01-25 01:44:27 +0000 Olivier Crete gst/rtpmanager/rtpsource.c: Fix unref of buffer using the wrong function. Fixes #511920 Original commit message from CVS: Patch by: Olivier Crete * gst/rtpmanager/rtpsource.c: Fix unref of buffer using the wrong function. Fixes #511920 2008-01-11 17:02:30 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: If we find the caps in the cache, use it to parse the clock-rate instead of returning... Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): If we find the caps in the cache, use it to parse the clock-rate instead of returning an error. Fixes a TODO as found by Youness Alaoui. 2008-01-11 16:45:57 +0000 Youness Alaoui gst/rtpmanager/: Make it possible to use different user_data for each of the callbacks. Original commit message from CVS: Patch by: Youness Alaoui * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): * gst/rtpmanager/rtpsession.c: (rtp_session_set_callbacks), (rtp_session_set_process_rtp_callback), (rtp_session_set_send_rtp_callback), (rtp_session_set_send_rtcp_callback), (rtp_session_set_sync_rtcp_callback), (rtp_session_set_clock_rate_callback), (rtp_session_set_reconsider_callback), (source_push_rtp), (source_clock_rate), (rtp_session_process_bye), (rtp_session_process_rtcp), (rtp_session_send_bye), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Make it possible to use different user_data for each of the callbacks. Fixes #508587. 2008-01-10 20:57:17 +0000 Thijs Vermeir gst/rtpmanager/gstrtpbin.c: Fix documentation for latest patch Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: Fix documentation for latest patch 2008-01-10 14:34:30 +0000 Thijs Vermeir gst/rtpmanager/gstrtpbin.c: Allow request_new_pad with name NULL (bug #508515) Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: Allow request_new_pad with name NULL (bug #508515) 2008-01-09 14:39:44 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Don't set fixed caps, we can basically do everything the upsteam peer pad can renegot... Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (create_send_rtp_sink): Don't set fixed caps, we can basically do everything the upsteam peer pad can renegotiate to. Fixes #507940. 2008-01-04 18:47:57 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Don't unref the popped buffer when we don't have ownership. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): Don't unref the popped buffer when we don't have ownership. Fixes #507020. 2007-12-31 13:12:06 +0000 Wim Taymans gst/rtpmanager/gstrtpssrcdemux.c: Don't clean up pads when going to PAUSED. Original commit message from CVS: * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_change_state): Don't clean up pads when going to PAUSED. 2007-12-12 16:59:03 +0000 Wim Taymans gst/rtpmanager/: Clean up the dynamic pads when going to READY. Original commit message from CVS: * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_finalize), (gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release), (gst_rtp_pt_demux_change_state): * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_reset), (gst_rtp_ssrc_demux_dispose), (gst_rtp_ssrc_demux_src_query), (gst_rtp_ssrc_demux_change_state): Clean up the dynamic pads when going to READY. 2007-12-12 12:11:53 +0000 Wim Taymans gst/rtpmanager/: Fix some leaks. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_finalize), (gst_rtp_bin_set_sdes_string), (gst_rtp_bin_get_sdes_string), (gst_rtp_bin_handle_message): * gst/rtpmanager/rtpsession.c: (rtp_session_finalize), (rtp_session_send_bye): * gst/rtpmanager/rtpsource.c: (rtp_source_finalize): Fix some leaks. 2007-12-10 18:36:04 +0000 Wim Taymans gst/rtpmanager/: Post a message when the SDES infor changes for a source. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init), (gst_rtp_bin_handle_message): * gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure), (on_ssrc_sdes): Post a message when the SDES infor changes for a source. * gst/rtpmanager/rtpsession.c: * gst/rtpmanager/rtpsource.c: Update some comments. 2007-12-10 15:34:19 +0000 Wim Taymans gst/rtpmanager/: Add signal to notify of an SDES change. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (on_ssrc_sdes), (create_session), (gst_rtp_bin_class_init): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpclient.h: * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpmanager.c: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpptdemux.h: * gst/rtpmanager/gstrtpsession.c: (on_ssrc_sdes), (gst_rtp_session_class_init), (gst_rtp_session_init): * gst/rtpmanager/gstrtpsession.h: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtpmanager/gstrtpssrcdemux.h: * gst/rtpmanager/rtpjitterbuffer.c: * gst/rtpmanager/rtpjitterbuffer.h: * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (on_ssrc_sdes), (rtp_session_process_sdes): * gst/rtpmanager/rtpsession.h: * gst/rtpmanager/rtpsource.c: * gst/rtpmanager/rtpsource.h: * gst/rtpmanager/rtpstats.c: * gst/rtpmanager/rtpstats.h: Add signal to notify of an SDES change. Fix object type in the signal callbacks. 2007-12-10 14:03:32 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Expose SDES items as properties and configure the session managers with them. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session), (gst_rtp_bin_class_init), (gst_rtp_bin_init), (sdes_type_to_name), (gst_rtp_bin_set_sdes_string), (gst_rtp_bin_get_sdes_string), (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): * gst/rtpmanager/gstrtpbin.h: Expose SDES items as properties and configure the session managers with them. * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), (rtp_source_set_property): Fix SSRC property. 2007-12-10 11:08:11 +0000 Wim Taymans gst/rtpmanager/: Update comment. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session): * gst/rtpmanager/rtpjitterbuffer.c: Update comment. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_set_property), (gst_rtp_session_get_property): Define some GObject properties to set SDES and other configuration. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (rtp_session_init), (rtp_session_finalize), (rtp_session_set_property), (rtp_session_get_property), (on_ssrc_sdes), (rtp_session_set_bandwidth), (rtp_session_get_bandwidth), (rtp_session_set_rtcp_fraction), (rtp_session_get_rtcp_fraction), (rtp_session_set_sdes_string), (rtp_session_get_sdes_string), (obtain_source), (rtp_session_get_internal_source), (rtp_session_process_sdes), (rtp_session_send_rtp), (rtp_session_next_timeout), (session_sdes), (is_rtcp_time): * gst/rtpmanager/rtpsession.h: Add signal when new SDES infor has been found for a source. Create properties for SDES and other info. Simplify the SDES API. Add method for getting the internal source object of the session. * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), (rtp_source_finalize), (rtp_source_set_property), (rtp_source_get_property), (rtp_source_set_callbacks), (rtp_source_get_ssrc), (rtp_source_set_as_csrc), (rtp_source_is_as_csrc), (rtp_source_is_active), (rtp_source_is_validated), (rtp_source_is_sender), (rtp_source_received_bye), (rtp_source_get_bye_reason), (rtp_source_set_sdes), (rtp_source_set_sdes_string), (rtp_source_get_sdes), (rtp_source_get_sdes_string), (rtp_source_get_new_sr), (rtp_source_get_new_rb): * gst/rtpmanager/rtpsource.h: Add GObject properties for various things. Don't leak the bye reason. 2007-11-22 09:08:27 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer can buffer an unlimited amount of time and thus has no max_latency ... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_query): jitterbuffer can buffer an unlimited amount of time and thus has no max_latency requirements. 2007-11-02 21:45:38 +0000 Ole André Vadla Ravnås gst/rtpmanager/gstrtpsession.c: Fix bad function signatures (#492798). Original commit message from CVS: Patch by: Ole André Vadla Ravnås * gst/rtpmanager/gstrtpsession.c: Fix bad function signatures (#492798). 2007-10-09 10:01:39 +0000 Laurent Glayal gst/rtpmanager/gstrtpbin.c: Fix memleak. Fixes #484990. Original commit message from CVS: Patch by: Laurent Glayal * gst/rtpmanager/gstrtpbin.c: (create_stream), (gst_rtp_bin_class_init): Fix memleak. Fixes #484990. 2007-10-08 17:46:45 +0000 Jan Schmidt gst/: Fix compiler warnings shown by Forte. Original commit message from CVS: * gst/librfb/rfbbuffer.c: (rfb_buffer_new_and_alloc): * gst/librfb/rfbbuffer.h: * gst/librfb/rfbdecoder.c: (rfb_socket_get_buffer): * gst/mpegvideoparse/mpegvideoparse.c: (gst_mpegvideoparse_chain): * gst/nsf/nes6502.c: (nes6502_execute): * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps): * gst/real/gstrealvideodec.c: (open_library): * gst/real/gstrealvideodec.h: * gst/rtpmanager/gstrtpsession.c: (create_recv_rtp_sink), (create_recv_rtcp_sink), (create_send_rtp_sink): Fix compiler warnings shown by Forte. 2007-10-08 10:39:35 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Fix caps refcounting for payload maps. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (get_pt_map), (gst_rtp_bin_clear_pt_map), (gst_rtp_bin_class_init): Fix caps refcounting for payload maps. When clearing payload maps, also clear sessions and streams payload maps. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps), (gst_rtp_pt_demux_clear_pt_map), (gst_rtp_pt_demux_chain), (find_pad_for_pt): Implement clearing the payload map. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_event_send_rtp_sink): Forward flush events instead of leaking them. * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_rtcp_sink_event): Correctly refcount events before pushing them. 2007-10-05 17:26:14 +0000 Wim Taymans gst/rtpmanager/rtpsession.c: When reconsidering RTCP timeouts, set the next timeout against the last report time inst... Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (rtp_session_next_timeout), When reconsidering RTCP timeouts, set the next timeout against the last report time instead of the current clock time so that we don't end up reconsidering forever. 2007-10-05 12:07:37 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Only peek at the tail element instead of popping it off, which allows us to grea... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Only peek at the tail element instead of popping it off, which allows us to greatly simplify things when the tail element changes. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_event_recv_rtp_sink): * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_sink_event): Forward FLUSH events instead of leaking them. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), (calculate_skew), (rtp_jitter_buffer_insert): * gst/rtpmanager/rtpjitterbuffer.h: Remove the tail-changed callback in favour of a simple boolean when we insert a buffer in the queue. Add method to peek the tail of the buffer. 2007-10-02 10:27:45 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Remove some old unused variables. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_flush_start), (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_change_state), (apply_offset), (gst_rtp_jitter_buffer_loop): Remove some old unused variables. Don't add the latency to the skew corrected timestamp, latency is only used to sync against the clock. Improve debugging. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), (rtp_jitter_buffer_reset_skew), (calculate_skew): * gst/rtpmanager/rtpjitterbuffer.h: Handle case where server timestamp goes backwards or wildly jumps by temporarily pausing the skew correction. Improve debugging. 2007-09-28 14:51:58 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Fix crasher in dispose. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (free_client): Fix crasher in dispose. * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): Handle cases where input buffers have no timestamps so that no clock skew can be calculated, in this case interpollate timestamps based on rtp timestamp and assume a 0 clock skew. 2007-09-28 11:17:35 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Remove jitter correction code, it's now in the lower level object. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (apply_latency), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query): Remove jitter correction code, it's now in the lower level object. Use new -core method for doing a peer query. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), (calculate_skew), (rtp_jitter_buffer_insert): * gst/rtpmanager/rtpjitterbuffer.h: Move jitter correction to the lowlevel jitterbuffer. Increase the max window size. When filling the window, already start estimating the skew using a parabolic weighting factor so that we have a much better startup behaviour that gets more accurate with the more samples we have. Increase the default weighting factor for the steady state to get smoother timestamps. 2007-09-26 20:08:28 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Fix cleanup crasher. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_dispose), (gst_rtp_bin_finalize): Fix cleanup crasher. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), (calculate_skew): * gst/rtpmanager/rtpjitterbuffer.h: Dynamically adjust the skew calculation window so that we calculate it over a period of around 2 seconds. 2007-09-20 14:34:57 +0000 Wim Taymans gst/rtpmanager/: Add notification of active SSRCs to various RTP elements. Fixes #478566. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (on_ssrc_active), (create_session), (gst_rtp_bin_class_init): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpsession.c: (on_ssrc_active), (gst_rtp_session_class_init), (gst_rtp_session_init), (gst_rtp_session_event_send_rtp_sink): * gst/rtpmanager/gstrtpsession.h: * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (on_ssrc_active), (rtp_session_process_rb): * gst/rtpmanager/rtpsession.h: Add notification of active SSRCs to various RTP elements. Fixes #478566. 2007-09-17 02:01:41 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Link to the right pads regardless of which one was created first in the ssrc demuxer. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (new_ssrc_pad_found): Link to the right pads regardless of which one was created first in the ssrc demuxer. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_send_rtp): * gst/rtpmanager/rtpsource.c: (calculate_jitter): Improve debugging. * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_finalize), (gst_rtp_ssrc_demux_sink_event), (gst_rtp_ssrc_demux_rtcp_sink_event), (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_rtcp_chain), (gst_rtp_ssrc_demux_internal_links): * gst/rtpmanager/gstrtpssrcdemux.h: Fix race in creating the RTP and RTCP pads when a new SSRC is detected. 2007-09-16 19:40:31 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Use lock to protect variable. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): Use lock to protect variable. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain), (convert_rtptime_to_gsttime), (gst_rtp_jitter_buffer_loop): Reconstruct GST timestamp from RTP timestamps based on measured clock skew and sync offset. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), (rtp_jitter_buffer_set_tail_changed), (rtp_jitter_buffer_set_clock_rate), (rtp_jitter_buffer_get_clock_rate), (calculate_skew), (rtp_jitter_buffer_insert), (rtp_jitter_buffer_peek): * gst/rtpmanager/rtpjitterbuffer.h: Measure clock skew. Add callback to be notfied when a new packet was inserted at the tail. * gst/rtpmanager/rtpsource.c: (rtp_source_init), (calculate_jitter), (rtp_source_send_rtp): * gst/rtpmanager/rtpsource.h: Remove clock skew detection, it's move to the jitterbuffer now. 2007-09-15 18:48:03 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Also set NTP base time on new sessions. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session): Also set NTP base time on new sessions. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): Use the right lock to protect our variables. Fix some comment. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_getcaps_send_rtp), (gst_rtp_session_chain_send_rtp), (create_send_rtp_sink): Implement getcaps on the sender sinkpad so that payloaders can negotiate the right SSRC. 2007-09-12 21:23:47 +0000 Wim Taymans gst/rtpmanager/: Various leak fixes. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session), (free_session), (get_client), (free_client), (gst_rtp_bin_associate), (free_stream), (gst_rtp_bin_class_init), (gst_rtp_bin_dispose), (gst_rtp_bin_finalize): * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_finalize): * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_release): * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize), (gst_rtp_session_set_property), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_send_rtp): * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_dispose): * gst/rtpmanager/rtpsession.c: (rtp_session_finalize): * gst/rtpmanager/rtpsession.h: Various leak fixes. 2007-09-12 18:04:32 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Calculate and configure the NTP base time so that we can generate better Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (calc_ntp_ns_base), (gst_rtp_bin_change_state), (new_payload_found), (create_send_rtp): Calculate and configure the NTP base time so that we can generate better NTP times in SR packets. Set caps on new ghostpad. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): Clean debug statement. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_init), (gst_rtp_session_set_property), (gst_rtp_session_get_property), (get_current_ntp_ns_time), (rtcp_thread), (gst_rtp_session_event_recv_rtp_sink), (gst_rtp_session_internal_links), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_event_send_rtp_sink), (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), (create_send_rtp_sink): * gst/rtpmanager/gstrtpsession.h: Add ntp-ns-base property to convert running_time to NTP time. Handle NEWSEGMENT events on send and recv RTP pads so that we can calculate the running time and thus NTP time of the packets. Simplify getting the current NTP time using the pipeline clock. Implement internal links functions. Use the buffer timestamp to calculate the NTP time instead of the clock. * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_sink_event), (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_rtcp_chain), (gst_rtp_ssrc_demux_internal_links), (gst_rtp_ssrc_demux_src_query): * gst/rtpmanager/gstrtpssrcdemux.h: Implement internal links function. Calculate the diff between different streams, this might be used later to get the inter stream latency. * gst/rtpmanager/rtpsession.c: (rtp_session_send_rtp): Simple cleanup. * gst/rtpmanager/rtpsource.c: (rtp_source_init), (calculate_jitter), (rtp_source_send_rtp), (rtp_source_get_new_sr): Make the clock skew window a little bigger. Apply the clock skew to all buffers, not just one with a new timestamp. Calculate and debug sender clock drift. Use extended last timestamp to interpollate for SR reports. 2007-09-04 15:23:34 +0000 Tim-Philipp Müller gst/rtpmanager/gstrtpsession.c: Make compiler happy: fix compilation with -Wall -Werror (#473562). Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: Make compiler happy: fix compilation with -Wall -Werror (#473562). 2007-09-03 21:19:34 +0000 Wim Taymans gst/rtpmanager/: Updated example pipelines in docs. Original commit message from CVS: * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_client), (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain), (create_stream), (gst_rtp_bin_init), (caps_changed), (new_ssrc_pad_found), (create_recv_rtp), (create_recv_rtcp), (create_send_rtp): * gst/rtpmanager/gstrtpbin.h: Updated example pipelines in docs. Handle sync_rtcp buffers from the SSRC demuxer to perform lip-sync. Set the default latency correctly. Add some more points where we can get caps. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): Add ts-offset property to control timestamping. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_init), (gst_rtp_session_set_property), (gst_rtp_session_get_property), (get_current_ntp_ns_time), (rtcp_thread), (stop_rtcp_thread), (gst_rtp_session_change_state), (gst_rtp_session_send_rtcp), (gst_rtp_session_sync_rtcp), (gst_rtp_session_cache_caps), (gst_rtp_session_clock_rate), (gst_rtp_session_sink_setcaps), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_event_send_rtp_sink), (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), (create_recv_rtcp_sink), (create_send_rtp_sink), (create_send_rtcp_src): Various cleanups. Feed rtpsession manager with NTP time based on pipeline clock when handling RTP packets and RTCP timeouts. Perform all RTCP with the system clock. Set caps on RTCP outgoing buffers. * gst/rtpmanager/gstrtpssrcdemux.c: (find_demux_pad_for_ssrc), (create_demux_pad_for_ssrc), (gst_rtp_ssrc_demux_base_init), (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_sink_event), (gst_rtp_ssrc_demux_rtcp_sink_event), (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_rtcp_chain): * gst/rtpmanager/gstrtpssrcdemux.h: Also demux RTCP messages. * gst/rtpmanager/rtpsession.c: (rtp_session_set_callbacks), (update_arrival_stats), (rtp_session_process_rtp), (rtp_session_process_rb), (rtp_session_process_sr), (rtp_session_process_rr), (rtp_session_process_rtcp), (rtp_session_send_rtp), (rtp_session_send_bye), (session_start_rtcp), (session_report_blocks), (session_cleanup), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Remove the get_time callback, the GStreamer part will feed us with enough timing information. Split sync timing and RTCP timing information. Factor out common RB handling for SR and RR. Send out SR RTCP packets for lip-sync. Move SR and RR packet info generation to the source. * gst/rtpmanager/rtpsource.c: (rtp_source_init), (rtp_source_update_caps), (get_clock_rate), (calculate_jitter), (rtp_source_process_rtp), (rtp_source_send_rtp), (rtp_source_process_sr), (rtp_source_process_rb), (rtp_source_get_new_sr), (rtp_source_get_new_rb), (rtp_source_get_last_sr): * gst/rtpmanager/rtpsource.h: * gst/rtpmanager/rtpstats.h: Use caps on incomming buffers to get timing information when they are there. Calculate clock scew of the receiver compared to the sender and adjust the rtp timestamps. Calculate the round trip in sources. Do SR and RR calculations in the source. 2007-08-31 15:26:14 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Use extended timestamp to release buffers from the jitterbuffer so that we can h... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop): Use extended timestamp to release buffers from the jitterbuffer so that we can handle the rtp wraparound correctly. 2007-08-29 16:56:27 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Improve Comments. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): Improve Comments. * gst/rtpmanager/gstrtpsession.c: (stop_rtcp_thread), (gst_rtp_session_change_state), (gst_rtp_session_parse_caps), (gst_rtp_session_clock_rate), (gst_rtp_session_sink_setcaps), (gst_rtp_session_event_send_rtp_sink), (create_recv_rtp_sink), (create_send_rtp_sink): Also parse the sink caps for clock-rate instead of only relying on the result of the signal. * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): Make sure we fetch the clock rate for payloads we are sending out so that we can use it for SR reports. 2007-08-29 01:22:43 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.*: Distribute synchronisation parameters to the session manager so that it can generate ... Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (stop_rtcp_thread), (gst_rtp_session_change_state), (gst_rtp_session_event_send_rtp_sink): * gst/rtpmanager/gstrtpsession.h: Distribute synchronisation parameters to the session manager so that it can generate correct SR packets for lip-sync. * gst/rtpmanager/rtpsession.c: (rtp_session_set_base_time), (rtp_session_set_timestamp_sync), (session_start_rtcp): * gst/rtpmanager/rtpsession.h: Add methods for setting sync parameters. Set correct RTP time in SR packets using the sync params. * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): * gst/rtpmanager/rtpsource.h: Record last RTP <-> GST timestamp so that we can use them to convert NTP to RTP timestamps in SR packets. 2007-08-28 20:30:16 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Add some more advanced example pipelines. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_clear_pt_map): Add some more advanced example pipelines. * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), (stop_rtcp_thread), (gst_rtp_session_send_rtcp): Add some debug and FIXME. Release LOCK when performing session cleanup. * gst/rtpmanager/rtpsession.c: (session_report_blocks): Add some debug. * gst/rtpmanager/rtpsource.c: (calculate_jitter), (rtp_source_send_rtp): Make sure we always send RTP packets with the session SSRC. 2007-08-27 21:17:21 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: When synchronizing buffers, take peer latency into account. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query): When synchronizing buffers, take peer latency into account. Don't try to add our latency to invalid peer max latency values. 2007-08-23 21:39:58 +0000 Tim-Philipp Müller Rename all GstRTPFoo structs to GstRtpFoo so that GST_BOILERPLATE registers a GType that's different than the GstRTPF... Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.signals: * gst/rtpmanager/gstrtpbin.c: * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpclient.h: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpptdemux.h: * gst/rtpmanager/gstrtpsession.c: * gst/rtpmanager/gstrtpsession.h: * gst/rtpmanager/gstrtpssrcdemux.c: * gst/rtpmanager/gstrtpssrcdemux.h: Rename all GstRTPFoo structs to GstRtpFoo so that GST_BOILERPLATE registers a GType that's different than the GstRTPFoo types that farsight registers (luckily GType names are case sensitive). Should finally fix #430664. 2007-08-21 17:18:29 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: When drop-on-latency is set but we have no latency configured, just push the buf... Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_set_property): When drop-on-latency is set but we have no latency configured, just push the buffer as fast as possible. Fix typo in comment. 2007-08-21 16:04:47 +0000 Wim Taymans gst/rtpmanager/rtpjitterbuffer.*: Fix undefined overflow prone ts_diff handling. Original commit message from CVS: * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_get_ts_diff): * gst/rtpmanager/rtpjitterbuffer.h: Fix undefined overflow prone ts_diff handling. 2007-08-16 11:40:16 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Fix EOS handling. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Fix EOS handling. Convert some DEBUG into WARNINGs. Pause task when flushing. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (rtcp_thread), (gst_rtp_session_event_recv_rtcp_sink): Use system clock for RTCP session management timeouts. * gst/rtpmanager/rtpsession.c: (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout): Release the session lock when emiting signals. 2007-08-13 06:16:40 +0000 Stefan Kost gst/rtpmanager/rtpjitterbuffer.c: Include stdlib. Original commit message from CVS: * gst/rtpmanager/rtpjitterbuffer.c: Include stdlib. 2007-08-10 17:16:53 +0000 Wim Taymans gst/rtpmanager/: Remove complicated async queue and replace with more simple jitterbuffer code while also fixing some... Original commit message from CVS: * gst/rtpmanager/Makefile.am: * gst/rtpmanager/async_jitter_queue.c: * gst/rtpmanager/async_jitter_queue.h: * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_class_init), (rtp_jitter_buffer_init), (rtp_jitter_buffer_finalize), (rtp_jitter_buffer_new), (compare_seqnum), (rtp_jitter_buffer_insert), (rtp_jitter_buffer_pop), (rtp_jitter_buffer_flush), (rtp_jitter_buffer_num_packets), (rtp_jitter_buffer_get_ts_diff): * gst/rtpmanager/rtpjitterbuffer.h: Remove complicated async queue and replace with more simple jitterbuffer code while also fixing some bugs. * gst/rtpmanager/gstrtpbin-marshal.list: * gst/rtpmanager/gstrtpbin.c: (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout), (create_session), (gst_rtp_bin_class_init), (create_recv_rtp), (create_send_rtp): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_dispose), (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_flush_start), (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property): * gst/rtpmanager/gstrtpsession.c: (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout), (gst_rtp_session_class_init), (gst_rtp_session_init): * gst/rtpmanager/gstrtpsession.h: * gst/rtpmanager/rtpsession.c: (on_bye_ssrc), (session_cleanup): Use new jitterbuffer code. Expose some new signals in preparation for handling EOS. 2007-07-18 07:35:32 +0000 Stefan Kost Add stdlib include (free, atoi, exit). Original commit message from CVS: * examples/app/appsrc_ex.c: * examples/switch/switcher.c: * ext/neon/gstneonhttpsrc.c: * ext/timidity/gstwildmidi.c: * ext/x264/gstx264enc.c: * gst/mve/mveaudioenc.c: (mve_compress_audio): * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/spectrum/demo-audiotest.c: * gst/spectrum/demo-osssrc.c: * sys/dvb/gstdvbsrc.c: Add stdlib include (free, atoi, exit). 2007-06-22 20:23:18 +0000 Jens Granseuer gst/: Build fixes for gcc-2.9x (no mid-block variable declarations etc.). Original commit message from CVS: Patch by: Jens Granseuer * gst/equalizer/gstiirequalizer.c: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: * gst/equalizer/gstiirequalizernbands.c: * gst/rtpmanager/async_jitter_queue.c: (async_jitter_queue_push_sorted): * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain): * gst/switch/gstswitch.c: (gst_switch_chain): Build fixes for gcc-2.9x (no mid-block variable declarations etc.). Fixes #450185. 2007-05-28 16:37:47 +0000 Wim Taymans Rename elements to avoid conflict with farsight elements with the same name. Fixes #430664. Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * gst/rtpmanager/gstrtpbin.c: (create_session), (create_stream), (gst_rtp_bin_class_init), (create_recv_rtp), (create_recv_rtcp), (create_send_rtp), (create_rtcp), (gst_rtp_bin_request_new_pad): * gst/rtpmanager/gstrtpclient.c: (create_stream), (gst_rtp_client_request_new_pad): * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_clear_pt_map), (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/gstrtpmanager.c: (plugin_init): * gst/rtpmanager/gstrtpptdemux.c: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_request_new_pad): * gst/rtpmanager/gstrtpssrcdemux.c: Rename elements to avoid conflict with farsight elements with the same name. Fixes #430664. 2007-05-23 13:08:52 +0000 Wim Taymans Document stuff. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_clear_pt_map), (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init), (gst_rtp_pt_demux_clear_pt_map): * gst/rtpmanager/gstrtpptdemux.h: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (rtcp_thread), (gst_rtp_session_clear_pt_map): * gst/rtpmanager/gstrtpsession.h: * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_class_init): Document stuff. Add clear-pt-map action signal where needed. 2007-05-15 13:29:53 +0000 Wim Taymans gst/rtpmanager/gstrtpptdemux.c: We always use fixed caps. Original commit message from CVS: * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): We always use fixed caps. 2007-05-15 03:45:45 +0000 David Schleef gst/rtpmanager/gstrtpbin.c: g_hash_table_remove_all() only exists in 2.12. Work around. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: g_hash_table_remove_all() only exists in 2.12. Work around. 2007-05-14 15:28:36 +0000 Wim Taymans gst/rtpmanager/async_jitter_queue.c: Fix leak when flushing. Original commit message from CVS: * gst/rtpmanager/async_jitter_queue.c: (async_jitter_queue_set_flushing_unlocked): Fix leak when flushing. * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_clear_pt_map), (gst_rtp_bin_class_init): * gst/rtpmanager/gstrtpbin.h: Add clear-pt-map signal. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_loop): Init clock-rate to -1 to mark unknow clock rate. Fix flushing. 2007-05-10 14:02:07 +0000 Stefan Kost gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtde... Original commit message from CVS: * gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtdemux_prepare_current_sample, gst_qtdemux_combine_flows, gst_qtdemux_loop_state_movie, gst_qtdemux_loop, qtdemux_parse_segments, qtdemux_parse_trak): * gst/rtpmanager/rtpsession.c (rtp_session_get_bandwidth, rtp_session_get_rtcp_bandwidth, rtp_session_get_cname, rtp_session_get_name, rtp_session_get_email, rtp_session_get_phone, rtp_session_get_location, rtp_session_get_tool, rtp_session_process_bye, session_report_blocks): * gst/rtpmanager/rtpsource.c (rtp_source_process_rtp, rtp_source_send_rtp, rtp_source_process_sr, rtp_source_process_rb): More format arg fixing (spotted by Ali Sabil ). * gst/switch/Makefile.am: Add require libraries(spotted by Ali Sabil ). 2007-05-10 12:38:49 +0000 Stefan Kost * gst/rtpmanager/async_jitter_queue.c: gst/rtpmanager/async_jitter_queue.c (tail_buffer_duration, async_jitter_queue_ref, async_jitter_queue_ref_unlocked, a... Original commit message from CVS: * gst/rtpmanager/async_jitter_queue.c (tail_buffer_duration, async_jitter_queue_ref, async_jitter_queue_ref_unlocked, async_jitter_queue_set_low_threshold, async_jitter_queue_length_ts_units_unlocked, async_jitter_queue_unref_and_unlock, async_jitter_queue_unref, async_jitter_queue_lock, async_jitter_queue_push, async_jitter_queue_push_unlocked, async_jitter_queue_push_sorted, async_jitter_queue_pop_intern_unlocked, async_jitter_queue_pop, async_jitter_queue_pop_unlocked, async_jitter_queue_length_unlocked, async_jitter_queue_set_flushing_unlocked, async_jitter_queue_unset_flushing_unlocked): Format arg fix (spotted by Ali Sabil ) 2007-05-09 11:24:22 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Pass queries upstream. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_query): Pass queries upstream. 2007-05-04 12:32:27 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Add some debug info. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_query): Add some debug info. * gst/rtpmanager/rtpsession.c: (rtp_session_init), (rtp_session_send_rtp): Store real user name in the session. 2007-04-30 13:41:30 +0000 Wim Taymans gst/rtpmanager/async_jitter_queue.c: Fix the case where the buffer underruns and does not block. Original commit message from CVS: * gst/rtpmanager/async_jitter_queue.c: (signal_waiting_threads), (async_jitter_queue_pop_intern_unlocked): Fix the case where the buffer underruns and does not block. * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_base_init), (create_recv_rtcp), (create_send_rtp), (create_rtcp), (gst_rtp_bin_request_new_pad): Rename RTCP send pad, like in the session manager. Allow getting an RTCP pad for receiving even if we don't receive RTP. fix handling of send_rtp_src pad. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): When no pt map could be found, fall back to the sinkpad caps. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), (gst_rtp_session_send_rtp), (create_recv_rtp_sink), (create_recv_rtcp_sink), (create_send_rtp_sink), (create_send_rtcp_src): Fix pad names. * gst/rtpmanager/rtpsession.c: (source_push_rtp), (rtp_session_create_source), (rtp_session_process_sr), (rtp_session_send_rtp), (session_start_rtcp): * gst/rtpmanager/rtpsession.h: Unlock session when performing a callback. Add callbacks for the internal session object. Fix sending of RTP packets. first attempt at adding NTP times in the SR packets. Small debug and doc improvements. * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): Update stats for SR reports. 2007-04-29 14:46:27 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Remove debug. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp): Remove debug. * gst/rtpmanager/rtpsession.c: (rtp_session_process_sr), (rtp_session_process_sdes), (calculate_rtcp_interval), (rtp_session_next_timeout), (session_report_blocks): * gst/rtpmanager/rtpstats.c: (rtp_stats_calculate_rtcp_interval): Improve debugging Fix interval for BYE/RTCP packets. 2007-04-27 15:09:12 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Move reconsideration code to the rtpsession object. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), (gst_rtp_session_send_rtcp), (gst_rtp_session_reconsider): Move reconsideration code to the rtpsession object. Simplify timout handling and add reconsideration. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (rtp_session_init), (rtp_session_finalize), (on_bye_ssrc), (on_bye_timeout), (on_timeout), (rtp_session_set_callbacks), (obtain_source), (rtp_session_create_source), (update_arrival_stats), (rtp_session_process_rtp), (rtp_session_process_sr), (rtp_session_process_rr), (rtp_session_process_bye), (rtp_session_process_rtcp), (calculate_rtcp_interval), (rtp_session_send_bye), (rtp_session_next_timeout), (session_start_rtcp), (session_report_blocks), (session_cleanup), (session_sdes), (session_bye), (is_rtcp_time), (rtp_session_on_timeout): * gst/rtpmanager/rtpsession.h: Handle timeout of inactive sources and senders. Implement BYE scheduling. * gst/rtpmanager/rtpsource.c: (calculate_jitter), (rtp_source_process_sr), (rtp_source_get_last_sr), (rtp_source_get_last_rb): * gst/rtpmanager/rtpsource.h: Add members to check for timeouts. * gst/rtpmanager/rtpstats.c: (rtp_stats_init_defaults), (rtp_stats_calculate_rtcp_interval), (rtp_stats_add_rtcp_jitter), (rtp_stats_calculate_bye_interval): * gst/rtpmanager/rtpstats.h: Use RFC algorithm for calculating the reporting interval. 2007-04-25 16:38:03 +0000 Wim Taymans gst/rtpmanager/gstrtpsession.c: Implement forward and reverse reconsideration. Original commit message from CVS: * gst/rtpmanager/gstrtpsession.c: (rtcp_thread): Implement forward and reverse reconsideration. * gst/rtpmanager/rtpsession.c: (rtp_session_get_num_sources), (rtp_session_get_num_active_sources), (rtp_session_process_sr), (session_report_blocks): * gst/rtpmanager/rtpsession.h: Small cleanups. 2007-04-25 15:48:46 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Make default jitterbuffer latency configurable. Original commit message from CVS: reviewed by: * gst/rtpmanager/gstrtpbin.c: (create_stream), (gst_rtp_bin_class_init), (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): * gst/rtpmanager/gstrtpbin.h: Make default jitterbuffer latency configurable. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): Debuging cleanups. 2007-04-25 13:19:36 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Report NO_PREROLL when going to PAUSED. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_change_state): Report NO_PREROLL when going to PAUSED. * gst/rtpmanager/gstrtpsession.c: (rtcp_thread): Don't send RTCP right before we are shutting down. * gst/rtpmanager/rtpsession.c: (rtp_session_process_rtp), (rtp_session_process_sr), (session_report_blocks), (rtp_session_perform_reporting): Improve report blocks. * gst/rtpmanager/rtpsource.c: (calculate_jitter), (init_seq), (rtp_source_process_rtp), (rtp_source_process_sr), (rtp_source_process_rb), (rtp_source_get_last_sr), (rtp_source_get_last_rb): * gst/rtpmanager/rtpsource.h: * gst/rtpmanager/rtpstats.h: Cleanups, add methods to access stats. 2007-04-25 08:30:48 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: fix for pad name change Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_rtcp): fix for pad name change * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), (gst_rtp_session_send_rtcp), (gst_rtp_session_clock_rate): Fix for renamed methods. * gst/rtpmanager/rtpsession.c: (rtp_session_init), (rtp_session_finalize), (rtp_session_set_cname), (rtp_session_get_cname), (rtp_session_set_name), (rtp_session_get_name), (rtp_session_set_email), (rtp_session_get_email), (rtp_session_set_phone), (rtp_session_get_phone), (rtp_session_set_location), (rtp_session_get_location), (rtp_session_set_tool), (rtp_session_get_tool), (rtp_session_set_note), (rtp_session_get_note), (source_push_rtp), (obtain_source), (rtp_session_add_source), (rtp_session_get_source_by_ssrc), (rtp_session_create_source), (rtp_session_process_rtp), (rtp_session_process_sr), (rtp_session_process_sdes), (rtp_session_process_rtcp), (rtp_session_send_rtp), (rtp_session_get_reporting_interval), (session_report_blocks), (session_sdes), (rtp_session_perform_reporting): * gst/rtpmanager/rtpsession.h: Prepare for implementing SSRC sampling. Create SSRC for the session. Add methods to set the SDES entries. fix accounting of senders/receivers. Implement SR/RR/SDES RTCP reporting. * gst/rtpmanager/rtpsource.c: (rtp_source_init), (init_seq), (rtp_source_process_rtp), (rtp_source_process_sr): * gst/rtpmanager/rtpsource.h: Implement extended sequence number. * gst/rtpmanager/rtpstats.c: (rtp_stats_calculate_rtcp_interval): * gst/rtpmanager/rtpstats.h: Rename some fields. 2007-04-21 19:21:49 +0000 Tim-Philipp Müller gst/rtpmanager/rtpsession.c: Don't use GLib-2.10 API, we only require GLib 2.8 at the moment. Original commit message from CVS: * gst/rtpmanager/rtpsession.c: (rtp_session_finalize): Don't use GLib-2.10 API, we only require GLib 2.8 at the moment. 2007-04-18 18:58:53 +0000 Wim Taymans configure.ac: Disable rtpmanager for now because it depends on CVS -base. Original commit message from CVS: * configure.ac: Disable rtpmanager for now because it depends on CVS -base. * gst/rtpmanager/Makefile.am: Added new files for session manager. * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), (create_stream), (pt_map_requested), (new_ssrc_pad_found): Some cleanups. the session manager can now also request a pt-map. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_base_init), (gst_rtp_session_class_init), (gst_rtp_session_init), (gst_rtp_session_finalize), (rtcp_thread), (start_rtcp_thread), (stop_rtcp_thread), (gst_rtp_session_change_state), (gst_rtp_session_process_rtp), (gst_rtp_session_send_rtp), (gst_rtp_session_send_rtcp), (gst_rtp_session_clock_rate), (gst_rtp_session_get_time), (gst_rtp_session_event_recv_rtp_sink), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_event_recv_rtcp_sink), (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_event_send_rtp_sink), (gst_rtp_session_chain_send_rtp), (create_send_rtcp_src), (gst_rtp_session_request_new_pad): * gst/rtpmanager/gstrtpsession.h: We can ask for pt-map now too when the session manager needs it. Hook up to the new session manager, implement the needed callbacks for pushing data, getting clock time and requesting clock-rates. Rename rtcp_src to send_rtcp_src to make it clear that this RTCP is to be send to clients. Add code to start and stop the thread that will schedule RTCP through the session manager. * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), (rtp_session_init), (rtp_session_finalize), (rtp_session_set_property), (rtp_session_get_property), (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), (on_bye_ssrc), (rtp_session_new), (rtp_session_set_callbacks), (rtp_session_set_bandwidth), (rtp_session_get_bandwidth), (rtp_session_set_rtcp_bandwidth), (rtp_session_get_rtcp_bandwidth), (source_push_rtp), (source_clock_rate), (check_collision), (obtain_source), (rtp_session_add_source), (rtp_session_get_num_sources), (rtp_session_get_num_active_sources), (rtp_session_get_source_by_ssrc), (rtp_session_get_source_by_cname), (rtp_session_create_source), (update_arrival_stats), (rtp_session_process_rtp), (rtp_session_process_sr), (rtp_session_process_rr), (rtp_session_process_sdes), (rtp_session_process_bye), (rtp_session_process_app), (rtp_session_process_rtcp), (rtp_session_send_rtp), (rtp_session_get_rtcp_interval), (rtp_session_produce_rtcp): * gst/rtpmanager/rtpsession.h: The advanced beginnings of the main session manager that handles the participant database of RTPSources, SSRC probation, SSRC collisions, parse RTCP to update source stats. etc.. * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), (rtp_source_init), (rtp_source_finalize), (rtp_source_new), (rtp_source_set_callbacks), (rtp_source_set_as_csrc), (rtp_source_set_rtp_from), (rtp_source_set_rtcp_from), (push_packet), (get_clock_rate), (calculate_jitter), (rtp_source_process_rtp), (rtp_source_process_bye), (rtp_source_send_rtp), (rtp_source_process_sr), (rtp_source_process_rb): * gst/rtpmanager/rtpsource.h: Object that encapsulates an SSRC and its state in the database. Calculates the jitter and transit times of data packets. * gst/rtpmanager/rtpstats.c: (rtp_stats_init_defaults), (rtp_stats_calculate_rtcp_interval), (rtp_stats_add_rtcp_jitter): * gst/rtpmanager/rtpstats.h: Various stats regarding the session and sources. Used to calculate the RTCP interval. 2007-04-13 09:20:55 +0000 Wim Taymans gst/rtpmanager/: Protect lists and structures with locks. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), (gst_rtp_bin_init), (gst_rtp_bin_finalize), (new_ssrc_pad_found), (create_recv_rtp), (gst_rtp_bin_request_new_pad): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_init), (gst_rtp_session_finalize), (gst_rtp_session_event_recv_rtp_sink), (gst_rtp_session_event_recv_rtcp_sink), (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_request_new_pad): Protect lists and structures with locks. Return FLOW_OK from RTCP messages for now. 2007-04-12 08:18:32 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Emit pt map requests and cache results. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), (create_stream), (gst_rtp_bin_class_init), (pt_map_requested): Emit pt map requests and cache results. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_jitter_buffer_sink_parse_caps), (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_get_clock_rate), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): Emit request-pt-map signals. 2007-04-11 13:49:54 +0000 Wim Taymans gst/rtpmanager/gstrtpbin-marshal.list: Some more custom marshallers. Original commit message from CVS: * gst/rtpmanager/gstrtpbin-marshal.list: Some more custom marshallers. * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), (clock_rate_request), (create_stream), (gst_rtp_bin_class_init), (pt_map_requested), (new_ssrc_pad_found), (create_recv_rtp): * gst/rtpmanager/gstrtpbin.h: Prepare for caching pt maps. Connect to signals to collect pt maps. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/gstrtpjitterbuffer.h: Add request_clock_rate signal. Use scale insteat of scale_int because the later does not deal with negative numbers. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init), (gst_rtp_pt_demux_chain): * gst/rtpmanager/gstrtpptdemux.h: Implement request-pt-map signal. 2007-04-10 09:14:07 +0000 Wim Taymans gst/rtpmanager/: Added custom marshallers for signals. Original commit message from CVS: * gst/rtpmanager/.cvsignore: * gst/rtpmanager/Makefile.am: * gst/rtpmanager/gstrtpbin-marshal.list: Added custom marshallers for signals. * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): * gst/rtpmanager/gstrtpbin.h: Prepare for emiting pt map signals. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init): * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_class_init): Fix signals. 2007-04-06 12:28:29 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Provide a clock. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init), (gst_rtp_bin_init), (gst_rtp_bin_provide_clock): * gst/rtpmanager/gstrtpbin.h: Provide a clock. 2007-04-06 12:07:30 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.c: Fix pad template name parsing. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_rtcp): Fix pad template name parsing. 2007-04-05 16:10:24 +0000 Wim Taymans gst/rtpmanager/gstrtpjitterbuffer.c: Add some debug and comments. Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): Add some debug and comments. Fix double unref() in error cases. 2007-04-05 13:54:23 +0000 Wim Taymans gst/rtpmanager/gstrtpbin.*: Add debugging category. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (find_session_by_id), (create_session), (find_stream_by_ssrc), (create_stream), (gst_rtp_bin_class_init), (new_payload_found), (new_ssrc_pad_found), (create_recv_rtp), (create_recv_rtcp), (create_send_rtp), (create_rtcp): * gst/rtpmanager/gstrtpbin.h: Add debugging category. Added RTPStream to manage stream per SSRC, each with its own jitterbuffer and ptdemux. Added SSRCDemux. Connect to various SSRC and PT signals and create ghostpads, link stuff. * gst/rtpmanager/gstrtpmanager.c: (plugin_init): Added rtpbin to elements. * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): Fix caps and forward GstFlowReturn * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), (gst_rtp_session_event_recv_rtp_sink), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_event_recv_rtcp_sink), (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_event_send_rtp_sink), (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), (create_recv_rtcp_sink), (create_send_rtp_sink), (create_rtcp_src), (gst_rtp_session_request_new_pad): Add debug category. Add event handling * gst/rtpmanager/gstrtpssrcdemux.c: (find_rtp_pad_for_ssrc), (create_rtp_pad_for_ssrc), (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_change_state): * gst/rtpmanager/gstrtpssrcdemux.h: Add debug category. Add new-pt-pad signal. 2007-04-04 10:23:15 +0000 Wim Taymans gst/rtpmanager/: Added simple SSRC demuxer. Original commit message from CVS: * gst/rtpmanager/Makefile.am: * gst/rtpmanager/gstrtpmanager.c: (plugin_init): * gst/rtpmanager/gstrtpssrcdemux.c: (find_pad_for_ssrc), (create_pad_for_ssrc), (gst_rtp_ssrc_demux_base_init), (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_finalize), (gst_rtp_ssrc_demux_sink_event), (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_src_event), (gst_rtp_ssrc_demux_change_state): * gst/rtpmanager/gstrtpssrcdemux.h: Added simple SSRC demuxer. 2007-04-03 11:35:39 +0000 Wim Taymans gst/rtpmanager/: Some more ghostpad magic. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (find_session_by_id), (create_session), (gst_rtp_bin_base_init), (create_recv_rtp), (create_recv_rtcp), (create_send_rtp), (create_rtcp), (gst_rtp_bin_request_new_pad): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpclient.c: Some more ghostpad magic. 2007-04-03 09:51:13 +0000 Wim Taymans gst/rtpmanager/Makefile.am: Add .h file so it can be disted properly. Original commit message from CVS: * gst/rtpmanager/Makefile.am: Add .h file so it can be disted properly. 2007-04-03 09:13:17 +0000 Wim Taymans Add RTP session management elements. Still in progress. Original commit message from CVS: * configure.ac: * gst/rtpmanager/Makefile.am: * gst/rtpmanager/async_jitter_queue.c: (async_jitter_queue_new), (signal_waiting_threads), (async_jitter_queue_ref), (async_jitter_queue_ref_unlocked), (async_jitter_queue_set_low_threshold), (async_jitter_queue_set_high_threshold), (async_jitter_queue_set_max_queue_length), (async_jitter_queue_get_g_queue), (calculate_ts_diff), (async_jitter_queue_length_ts_units_unlocked), (async_jitter_queue_unref_and_unlock), (async_jitter_queue_unref), (async_jitter_queue_lock), (async_jitter_queue_unlock), (async_jitter_queue_push), (async_jitter_queue_push_unlocked), (async_jitter_queue_push_sorted), (async_jitter_queue_push_sorted_unlocked), (async_jitter_queue_insert_after_unlocked), (async_jitter_queue_pop_intern_unlocked), (async_jitter_queue_pop), (async_jitter_queue_pop_unlocked), (async_jitter_queue_length), (async_jitter_queue_length_unlocked), (async_jitter_queue_set_flushing_unlocked), (async_jitter_queue_unset_flushing_unlocked), (async_jitter_queue_set_blocking_unlocked): * gst/rtpmanager/async_jitter_queue.h: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_base_init), (gst_rtp_bin_class_init), (gst_rtp_bin_init), (gst_rtp_bin_finalize), (gst_rtp_bin_set_property), (gst_rtp_bin_get_property), (gst_rtp_bin_change_state), (gst_rtp_bin_request_new_pad), (gst_rtp_bin_release_pad): * gst/rtpmanager/gstrtpbin.h: * gst/rtpmanager/gstrtpclient.c: (new_pad), (create_stream), (free_stream), (find_stream_by_ssrc), (gst_rtp_client_base_init), (gst_rtp_client_class_init), (gst_rtp_client_init), (gst_rtp_client_finalize), (gst_rtp_client_set_property), (gst_rtp_client_get_property), (gst_rtp_client_change_state), (gst_rtp_client_request_new_pad), (gst_rtp_client_release_pad): * gst/rtpmanager/gstrtpclient.h: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_base_init), (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_dispose), (gst_rtp_jitter_buffer_getcaps), (gst_jitter_buffer_sink_setcaps), (free_func), (gst_rtp_jitter_buffer_flush_start), (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_src_activate_push), (gst_rtp_jitter_buffer_change_state), (priv_compare_rtp_seq_lt), (compare_rtp_buffers_seq_num), (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpmanager.c: (plugin_init): * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_base_init), (gst_rtp_pt_demux_class_init), (gst_rtp_pt_demux_init), (gst_rtp_pt_demux_finalize), (gst_rtp_pt_demux_chain), (gst_rtp_pt_demux_getcaps), (find_pad_for_pt), (gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release), (gst_rtp_pt_demux_change_state): * gst/rtpmanager/gstrtpptdemux.h: * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_base_init), (gst_rtp_session_class_init), (gst_rtp_session_init), (gst_rtp_session_finalize), (gst_rtp_session_set_property), (gst_rtp_session_get_property), (gst_rtp_session_change_state), (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), (create_recv_rtcp_sink), (create_send_rtp_sink), (create_rtcp_src), (gst_rtp_session_request_new_pad), (gst_rtp_session_release_pad): * gst/rtpmanager/gstrtpsession.h: Add RTP session management elements. Still in progress. 2009-08-10 13:30:23 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: push mode; cater for chunk padding 2009-08-04 19:45:43 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: only use stream's pad after having checked it exists 2009-08-04 13:38:09 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: sprinkle some more GST_DEBUG_FUNCPTR 2009-08-04 13:36:36 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: post error message if no pads to push EOS event on 2009-08-04 11:39:59 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: fix typo in warning message 2009-08-04 11:39:39 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: fix some buffer ref handling 2009-08-04 11:37:16 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: do not exceed maximum number of supported streams 2009-08-04 11:35:18 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: prevent double unref; gst_avi_demux_parse_avih already unrefs 2009-08-04 11:32:27 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: verify size of INFO LIST to satisfy subsequent expectations 2009-07-29 15:25:38 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: check video stream framerate against avi header frame duration The former might be bogus in silly cases, and the latter seems to carry more weight. 2009-08-04 12:16:13 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: streamline stream duration calculation 2009-07-03 14:04:13 +0200 Edward Hervey * ext/raw1394/gstdv1394src.c: dv1394src: Fix element for live usage... which has been broken for 2 years :( This is a live source, therefore: * Use GST_FORMAT_TIME as the default format * set_timestamp to True * properly implement query latency. This allows expected live usage like : playbin2 uri=dv:// 2009-08-09 09:43:41 +0200 Edward Hervey * ext/raw1394/gstdv1394src.c: raw1394: Remove unneeded variable 2009-08-09 09:43:29 +0200 Edward Hervey * gst/matroska/matroska-demux.c: matroska: remove dead assignments 2009-08-09 09:43:00 +0200 Edward Hervey * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kpay.c: rtp: Remove dead assignments and resulting unneeded variables. 2009-08-10 09:53:28 +0200 Sebastian Dröge * configure.ac: * ext/wavpack/Makefile.am: * ext/wavpack/gstwavpackenc.c: * ext/wavpack/gstwavpackenc.h: * ext/wavpack/md5.c: * ext/wavpack/md5.h: wavpack: Use GLib GChecksum instead of our own MD5 implementation This requires GLib 2.16 but that version is already required by core anyway. 2009-08-08 00:47:48 -0300 Thiago Santos * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: matroska: Adds support to muxing/demuxing WMA Adds support for muxing wma audio family and fixes demuxing of wma family in matroskademux. matroskademux was broken because it missed codec_data. 2009-08-06 20:15:17 -0300 Thiago Santos * gst/matroska/matroska-mux.c: matroskamux: adds support for wmv family Adds support to WMV1, WMV2, WMV3 and other family formats that are signaled by the 'format' field in the caps (i.e. WVC1). Partially fixes #576378 2009-08-09 14:19:42 +0100 Tim-Philipp Müller * sys/v4l2/gstv4l2object.c: v4l2src: if max == min width/height put an int in the probed caps, not an int range Fixes #560033. 2009-08-09 13:58:07 +0100 Tim-Philipp Müller * sys/osxaudio/gstosxaudiosrc.c: osxaudiosrc: if max_channels == min_channels, use an int instead of an int range in the caps 2009-08-09 12:52:17 +0200 LoneStar * gst/id3demux/id3v2frames.c: id3demux: Try GST_*_TAG_ENCODING and locale encoding if tags are not UTF8 Fixes bug #499242. 2009-08-09 01:29:50 +0100 Tim-Philipp Müller * configure.ac: configure: bump core/base requirements to latest release To avoid confusion. 2009-08-09 01:27:01 +0100 Tim-Philipp Müller * tests/check/elements/flvmux.c: check: fix flvmux unit test on big endian machines flvmux only accepts raw audio in little endian, but audiotestsrc produces audio in the native endianness, which makes linking between audiotestsrc and flvmux fail on big endian machines. Add an audioconvert element in between the two to fix this. 2009-02-15 18:49:44 +0000 Vincent Penquerc'h * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: matroska: add kate subtitle support to matroska muxer and demuxer See #525743. 2009-08-07 16:51:45 +0100 Tim-Philipp Müller * gst/id3demux/id3v2.3.0.html: id3demux: add ID3 v2.3 spec as well 2009-08-07 16:42:39 +0100 Tim-Philipp Müller * gst/id3demux/id3v2frames.c: id3demux: sizes in ID3 v2.3 are unlikely to be sync-safe integers In ID3 v2.3 compressed frames will have a 4-byte data length indicator after the frame header to indicate the size of the decompressed data. This integer is unlikely to be a sync-safe integer for v2.3 tags, only in v2.4 it's sync-safe. 2009-08-07 16:36:55 +0100 Tim-Philipp Müller * gst/id3demux/id3tags.c: id3demux: fix typo in debug message 2009-08-07 16:02:23 +0100 Tim-Philipp Müller * gst/id3demux/id3tags.c: * gst/id3demux/id3tags.h: * gst/id3demux/id3v2frames.c: * tests/check/elements/id3demux.c: * tests/files/Makefile.am: * tests/files/id3-588148-unsynced-v24.tag: id3demux: fix parsing of unsync'ed ID3 v2.4 tags and frames Reversing the unsynchronisation seems to work slightly differently for ID3 v2.3 tags and v2.4 tags: v2.3 tags don't have syncsafe frame sizes in the frame header, so the unsynchronisation is applied to the whole frame data including all the frame headers. v2.4 frames have sync-safe sizes, however, so the unsynchronisation only needs to be applied to the actual frame data, and it seems that's what's being done as well. So we need to undo the unsynchronisation on a per-frame basis for v2.4 tags for things to work properly. Fixes extraction of coverart/images from APIC frames in ID3 v2.4 tags (#588148). Add unit test for this as well. 2009-08-06 21:24:14 +0200 Sebastian Dröge * ext/soup/gstsouphttpsrc.c: souphttpsrc: Use SOUP_METHOD_GET instead of "GET" string Fixes bug #590970. 2009-08-06 13:00:59 +0200 Wim Taymans * ext/pulse/pulsesrc.c: pulsesrc: set the default slave method to skew Set the default slave method to the much better skew algorithm. This is the default in the new base class but we override this here as well for the upcomming release. 2009-08-06 10:20:34 +0100 Tim-Philipp Müller * ext/pulse/pulsesrc.c: pulsesrc: fix compilation with --disable-gst-debug 2009-08-03 18:59:32 +0200 Wim Taymans * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: use array instead of queue 2009-08-03 18:55:19 +0200 Mark Nauwelaerts * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: push NALs only after SPS/PPS parse complete (bytestream) buffer for SPS/PPS before pushing NALs. Fixes #564501. 2009-08-04 14:44:36 +0200 Sebastian Dröge * sys/v4l2/v4l2_calls.h: v4l2: Directly use GST_PTR_FORMAT for printing caps with the LOG_CAPS macro 2009-08-04 11:17:17 +0200 Edward Hervey * gst/rtp/gstrtpqdmdepay.c: rtpqdm2depay: Fix debug statement. 2009-08-04 09:32:07 +0200 Sebastian Dröge * sys/v4l2/gstv4l2sink.c: * sys/v4l2/v4l2_calls.h: v4l2: Remove some OMAP specific hacks They require special build flags and are not useful in general. 2009-08-04 09:22:29 +0200 Rob Clark * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2bufferpool.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/v4l2src_calls.c: v4l2sink: change where buffers get dequeued It seems to cause strange occasional high latencies (almost 200ms) when dequeuing buffers from _buffer_alloc(). It is simpler and seems to work much better to dqbuf from the same thread that is queuing the next buffer. 2009-08-04 09:14:20 +0200 Rob Clark * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2bufferpool.c: * sys/v4l2/gstv4l2bufferpool.h: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2sink.c: * sys/v4l2/gstv4l2sink.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: v4l2: Add v4l2sink element This also does the following changes: (1) pull the bufferpool code out into gstv4l2bufferpool.c, and make a bit more generic so it can be used both for v4l2src and v4l2sink (2) move some of the device probing/configuration/caps stuff into gstv4l2object.c so it does not have to be duplicated between v4l2src and v4l2sink Fixes bug #590280. 2009-08-04 07:07:45 +0200 Sebastian Dröge * tests/check/Makefile.am: flvmux: Enable unit test now that it passes 2009-08-03 21:21:39 +0200 Edward Hervey * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpsv3vdepay.c: rtpqdm2depay,rtpsv3vdepay: Add debugging category. 2009-08-03 21:22:48 +0200 Edward Hervey * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpqdmdepay.h: rtpqdm2depay: Handle gaps in incoming packets. Whenever we see a gap, we flush the temporary packets (but not the adapter). If we had some data temporarily stored it will be outputted (the sound will sound a bit garbled... but that's how it sounds on MacOSX :) 2009-08-03 19:01:07 +0200 Edward Hervey * gst/rtp/gstrtpqdmdepay.c: rtpqdmdepay: Fix CRC calculation and remove commented code. 2009-08-02 13:42:12 +0200 Edward Hervey * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpqdmdepay.c: * gst/rtp/gstrtpqdmdepay.h: rtp: New QDM2 rtp depayloader. Reverse-engineered by comparing: * A rtp hinted file provided by DarwinStreamingServer * The output procued by DSS for that same file Also used various streaming sources available on the internet to fine-tune the code. The header/codec_data extraction methods are from FFMpeg (LGPL). 2009-08-03 21:24:44 +0200 Edward Hervey * gst/rtp/gstrtpsv3vdepay.c: rtpsv3vdepay: Properly fill codec_data and cleanup code a bite more. 2009-08-03 19:02:17 +0200 Edward Hervey * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtpsv3vdepay.h: rtpsv3vdepay: Only output buffers once we're configured. 2009-08-03 19:02:00 +0200 Edward Hervey * gst/rtp/gstrtpsv3vdepay.c: rtpsv3vdepay: Add more encoding-name variants 2009-08-03 20:08:33 +0200 Sebastian Dröge * tests/check/elements/flvmux.c: flvmux: Fix unit test to correctly handle request pads Request pads are removed by the element instance in PAUSED->READY so we need to re-request pads for every run and link them again. Last fix for bug #590447. 2009-08-03 20:08:00 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: flvmux: Fix writing of the index for < 128 buffers Partially fixes bug #590447. 2009-08-03 20:07:00 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: flvmux: Fix resetting of the element Reset the have_video/have_audio flags and make sure to properly release the request pads. Partially fixes bug #590447. 2009-08-03 18:13:46 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't add non-utf8 chars to structures 2009-08-03 18:02:31 +0200 Luc Deschenaux * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegdepay.h: jpegdepay: use attributes for extra properties Use some of the SDP attributes when they are present to specify the output dimension and framerate. This allows us to receive jpeg frames larger than 2040 width/height. Fixes #564437 2009-08-03 18:01:27 +0200 Wim Taymans * gst/rtp/README: RTP docs: update with attributes in caps 2009-08-03 17:21:44 +0200 Luc Deschenaux * gst/rtsp/gstrtspsrc.c: rtspsrc: put all SDP attributes on caps Put the SDP attributes on the caps too so that they can be used by depayloaders. See #564437 2009-08-03 13:32:12 +0200 Jonathan Tellier * ext/pulse/pulsesrc.c: pulsesrc: initialize the probe with the server When creating a new probe, pass the server instead of the device string. fixes #590401 2009-08-02 11:44:03 +0100 Tim-Philipp Müller * gst/udp/gstmultiudpsink.c: multiudpsink: don't do things with side-effects inside g_return_val_if_fail() Someone might compile this code with -DG_DISABLE_ASSERT some day. 2009-08-01 21:39:30 +0100 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulsesink: don't do logic within g_assert() statements Otherwise that code will just be expanded to nothing when compiled -DG_DISABLE_ASSERT (PS: why is mainloop_start() called in the init function and not when changing state to READY?) 2009-08-01 17:07:42 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: send newsegment event when operating push-based and unframed For some reason flac doesn't call our metadata callback when we operate in push mode with unframed input, but that's where we set up the newsegment event (since that's where we'd get the duration from the stream info header), so we didn't send a newsegment event at all in this case. Hack around this by storing a generic newsegment event for now which will be used if we don't replace it with a better one that includes the duration. 2009-08-01 16:48:36 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: small cleanups Remove some callback indirections which are no longer needed because there's only one decoder object type now. Also remove unused variable. 2009-08-01 15:22:49 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: use gst_adapter_copy() to avoid unnecessary buffer merges gst_adapter_peek() will merge buffers as needed, which we can avoid here since we're doing a memcpy anyway and then flush the copied data from the adapter right away. 2009-08-01 00:00:41 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: repair some broken indenting 2009-08-01 12:19:41 +0100 Tim-Philipp Müller * tests/check/Makefile.am: * tests/check/elements/.gitignore: * tests/check/elements/flvmux.c: checks: add basic unit test for flvmux, but disable it for now Basic unit test for flvmux. Fails miserably, hence disabled for now. 2009-07-31 23:28:12 +0100 Tim-Philipp Müller * tests/check/Makefile.am: * tests/check/elements/.gitignore: * tests/check/elements/flvdemux.c: * tests/files/Makefile.am: * tests/files/pcm16sine.flv: check: add basic unit test for flvdemux In particular, test re-use of flvdemux in both pull and push mode (see #583030). 2009-07-31 20:25:17 +0100 Tim-Philipp Müller * gst/flv/gstflvmux.c: flvmux: fix invalid write caused by using sizeof("string") as length sizeof("foo") includes the string's NUL-terminator in the size returned, but we're writing strings here with an explicit size at the beginning and no NUL-terminator. In most cases using sizeof("foo") as length in memcpy is not harmful, but it is where the string goes right at the end of our buffer to write, since we don't allocate space for that NUL terminator. 2009-07-27 18:44:45 +0200 Edward Hervey * ext/soup/gstsouphttpsrc.c: soup: Use "GET" instead of SOUP_METHOD_GET. Fixes build with libsoup-2.7.* This is due to a quality API change in libsoup 2.7. SOUP_METHOD_* are now integers and not strings... they could have changed the names. 2009-07-30 17:57:53 +0300 Stefan Kost * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: jpeg: use longer macro names to not clash with some stupid windows defines libjpeg headers pull some windows system inlcudes (on windows) that contain a define for DEFAULT_QUALITY. 2009-07-29 14:31:48 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Fix last commit and improve readability 2009-07-24 19:04:31 +0400 Руслан Ижбулатов * gst/avi/gstavidemux.c: Fixed the fix for TIME->DEFAULT conversion. Fixes bug #578052 again. 2009-07-29 13:38:03 +0200 Edward Hervey * gst/rtp/gstrtpsv3vdepay.c: rtpsv3depay: Fix width/height calculation, bring up to marginal rank. Based on documentation found on http://wiki.multimedia.cx/ 2009-07-29 12:13:20 +0200 Wim Taymans * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: pulse: conditionally compile newer stuff configured_sink/source_usec in the timing_info is only since 0.9.11 so conditionally compile this information. fixes #590038 2009-07-28 18:29:07 +0200 Wim Taymans * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: pulsesrc: cleanups Keep track of the paused state of the source and leave the read function when paused. don't wait for a latency update when the delay is not yet known but simply return 0 instead of blocking. Keep track of the corked state of the stream. Fix the state changes. 2009-07-28 16:11:18 +0200 Wim Taymans * ext/pulse/pulsesrc.c: pulsesrc: set maxlength always to -1 2009-07-28 15:53:57 +0200 Wim Taymans * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: pulsesrc; cleanups, report real latency Add some more debug info Avoid some type casts Report the real latency to the application. 2009-07-28 16:11:36 +0200 Mark Nauwelaerts * ext/jpeg/gstjpegdec.c: jpegdec: when scanning for 0xff marker ends, ensure desired result Otherwise, any non 0xff byte at end of data would be mistaken for a tag byte, and in case of a frame_len 0 tag subsequently lead to an infinite loop. 2009-07-28 00:30:43 -0300 Thiago Santos * gst/avi/gstavimux.c: avimux: adds support to wma 2009-07-28 00:07:15 -0300 Thiago Santos * gst/avi/gstavimux.c: avimux: adds support to wmv 2009-07-27 21:34:22 -0300 Thiago Santos * gst/qtdemux/qtdemux.c: qtdemux: Downgrade warning message to debug 2009-07-27 11:51:39 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: avoid using ivalid stream indexes when we get an invalid stream index from pulse because we were just starting, avoid using it for getting and setting the volume. Fixes #589365 2009-07-24 19:38:07 +0200 Sebastian Dröge * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstquark.c: * gst/effectv/gstradioac.c: * gst/effectv/gstripple.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gststreak.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: effectv: Don't allow caps changes for some effectv filters These filters use information from previous frames to generate the current frame and a caps change will make the effect start from the beginning again. 2009-07-24 19:37:09 +0200 Sebastian Dröge * gst/effectv/gstwarp.c: * gst/effectv/gstwarp.h: warptv: Make the sine table global instead of having it in every instance 2009-07-24 10:47:44 +0300 Stefan Kost * ext/jpeg/gstjpegenc.c: jpeg: make encoder work with libjpeg v7 We have to specify do_fancy_downsampling = FALSE in the encoder with did not exist before. 2009-07-24 00:42:33 +0300 Stefan Kost * common: Automatic update of common submodule From fedaaee to 94f95e3 2009-07-23 12:06:27 +0200 Sebastian Dröge * ext/flac/gstflacdec.c: flacdec: Implement SEEKING query Fixes bug #589423. 2009-07-22 11:16:06 +0100 Colin Guthrie * ext/pulse/pulsesink.c: pulsesink: Fix a couple error messages that mentioned incorrect function names. Fixes #589459. 2009-07-23 11:50:16 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: * gst/flv/gstflvparse.c: flvdemux: Implement SEEKING query Also add some more query types to the answer of the query type function. Fixes bug #589424. 2009-07-21 19:46:55 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: flacdec: fix intermittent FLAC__STREAM_DECODER_ABORTED errors when seeking When seeking in a local flac file (ie. operating pull-based), the decoder would often just error out after the loop function sees a DECODER_ABORTED status. This, however, is the read callback's way of telling our loop function that pull_range failed and streaming should stop, in this case because of the flush-start event that the seek handler pushed upstream from the seeking thread. Handle this slightly better by storing the last flow return from pull_range, so the loop function can evaluate it properly when it encounters a DECODER_ABORTED and take the right action. Fixes #578612. 2009-07-21 10:07:00 +0300 Stefan Kost * gst/interleave/interleave.c: interleave: fix indenting and upgrade two debugs to warnings. Fix newlines in variable decls. Change two debugs to become warnings as they indicate that things will not work. 2009-07-21 10:04:36 +0300 Stefan Kost * ext/jpeg/gstjpeg.c: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstjpegenc.h: jpeg: code cleanups for encoder Remove some disabled code in encoder. Try #if 0'ed code and add comments about why it is disabled. Move idct-method enum to jpeg.c and use in both encoder and decoder. Add idct-method property to encoder. 2009-07-21 07:50:46 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Answer SEEKING queries in the original format 2009-07-21 01:12:44 +0200 Josep Torra * gst/udp/gstudpnetutils.c: udputils: initialize struct content with 0. Fixes some random crashes. 2009-07-20 19:09:19 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: set some values to their defaults Set the minreq and maxlength buffer attributes to -1 to let puleseaudio select a sensible value. 2009-07-20 19:04:09 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: don't wait for posted message We can't wait for the ENTER/LEAVE messages to be be posted because the base class sometimes calls the start method with the object lock, which would block the message posting. Instead, just assume that the message will be posted soon and continue. We'll have to fix this in the base class. 2009-07-20 18:11:33 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: use relative seeks Use relative seeks because I was told that absolute seeks don't work. 2009-07-20 16:52:19 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Implement SEEKING query 2009-07-20 08:07:13 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Add support for ARGB/BGRA input Note that videotestsrc outputs 100% transparent video which will result in white output from cairorender. 2009-07-17 13:22:57 +0100 Elaine Xiong * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: v4l2: Fix v4l2src on OpenSolaris The v4l2 driver for USB webcams on OpenSolaris does not support select() calls. Detect when select() fails, and skip polling the device afterward, which restores the pre 0.10.14 behaviour on OpenSolaris. Signed-off-by: Jan Schmidt 2009-07-17 11:22:06 +0100 Jan Schmidt * tests/check/elements/.gitignore: * tests/examples/v4l2/.gitignore: gitignore: Ignore some new binaries 2009-07-17 13:49:21 +0200 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-cairo.xml: * ext/cairo/gstcairorender.c: cairorender: Add to the documentation 2009-07-17 13:42:49 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Return not-negotiated if we have no caps 2009-07-17 13:41:19 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: * ext/cairo/gstcairorender.h: cairorender: Fix caps and colorspace handling 2009-07-17 13:30:02 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Use correct mimetypes for PDF and SVG 2009-07-17 13:24:28 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Remove pull mode, it only adds complexity but not advantages 2009-07-16 21:55:31 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Fix caps negotiation and cairo surface creation 2009-07-16 21:42:21 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: cairorender: Correctly set srccaps 2009-07-16 21:31:43 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: * ext/cairo/gstcairorender.h: cairorender: Move instance/class struct definitions to the header 2009-07-16 21:30:00 +0200 Sebastian Dröge * ext/cairo/gstcairorender.c: * ext/cairo/gstcairorender.h: cairorender: Add Lutz' copyright to the file header 2009-07-16 21:27:45 +0200 Lutz Mueller * ext/cairo/Makefile.am: * ext/cairo/gstcairo.c: * ext/cairo/gstcairorender.c: * ext/cairo/gstcairorender.h: cairo: Add cairo-based PDF/PS/SVG encoder element Fixes bug #331420. 2009-07-16 20:44:40 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: * ext/flac/gstflacenc.h: flacenc: Optionally write a PADDING block The size of the PADDING block is specified by a new "padding" property. Fixes bug #588483. 2009-07-16 19:35:44 +0200 Sebastian Dröge * ext/soup/gstsouphttpsrc.c: souphttpsrc: Only assume seekability if the server provides Content-Length Previously seekability way always assumed until the first seek actually failed. Now we assume that all servers are not seekable unless they provide a Content-Length header. If a seek fails after that we continue to assume no seekability. Fixes bug #585576. 2009-07-16 15:14:43 +0200 Arnout Vandecappelle * ext/soup/gstsouphttpsrc.c: souphttpsrc: don't try to authenticate if no username/password is set. 2009-07-16 17:10:21 +0200 Sebastian Dröge * gst/effectv/gstwarp.c: effectv: Chain up finalize to the parent class in warptv Fixes a memory leak. 2009-07-16 12:55:49 +0200 Sebastian Dröge * tests/check/Makefile.am: * tests/check/pipelines/effectv.c: effectv: Add unit test for all effectv elements 2009-07-16 12:17:32 +0200 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-videomixer.xml: effectv: Add new effectv elements to the docs 2009-07-15 14:37:19 +0200 Sebastian Dröge * gst/effectv/Makefile.am: * gst/effectv/gsteffectv.c: * gst/effectv/gstripple.c: * gst/effectv/gstripple.h: effectv: Add rippletv element This produces a water ripple effect on the video input, based on motion or a rain drop algorithm. Kindly relicensed to LGPL2+ by Kentaro Fukuchi . Fixes bug #588695. 2009-07-12 15:42:35 +0200 Sebastian Dröge * gst/effectv/Makefile.am: * gst/effectv/gsteffectv.c: * gst/effectv/gststreak.c: * gst/effectv/gststreak.h: effectv: Add streaktv effect filter element This combines the StreakTV and BaltanTV filters from the effectv project. Kindly relicensed to LGPL2+ by Kentaro Fukuchi . Fixes bug #588368. 2009-07-12 12:31:15 +0200 Sebastian Dröge * gst/effectv/gstaging.c: * gst/effectv/gstedge.c: * gst/effectv/gstop.c: * gst/effectv/gstquark.c: * gst/effectv/gstradioac.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: effectv: Fix processing on big endian architectures 2009-07-12 11:52:04 +0200 Sebastian Dröge * gst/effectv/Makefile.am: * gst/effectv/gsteffectv.c: * gst/effectv/gstradioac.c: * gst/effectv/gstradioac.h: effectv: Add radioactv effect filter This filter adds a radiation-like motion blur effect to the video stream. Kindly relicensed to LGPL2+ by Kentaro Fukuchi . Fixes bug #588359. 2009-07-12 11:26:57 +0200 Sebastian Dröge * gst/effectv/gstop.c: * gst/effectv/gstop.h: effectv: Make the optv threshold property an uint 2009-07-12 10:39:02 +0200 Sebastian Dröge * gst/effectv/Makefile.am: * gst/effectv/gsteffectv.c: * gst/effectv/gstop.c: * gst/effectv/gstop.h: effect: Add optv effect filter from the effectv project This filter binarizes input frames and combines them with various optical pattern. Kindly relicensed to LGPL2+ by Kentaro Fukuchi . Fixes bug #588349. 2009-07-03 05:11:26 -0400 Olivier Crête * ext/pulse/pulsesink.c: pulsesink: Emit stream-status leave message Fixes #587695 2009-07-03 05:06:45 -0400 Olivier Crête * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: Emit stream-status enter message Emit stream-status messages for the pulse thread. Don't use our own GCond for signaling but simply use the pulse mainloop mechanisms for synchronisation. See #587695 2009-07-14 18:15:59 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: debug the latency update values 2009-07-14 16:12:55 +0200 Wim Taymans * configure.ac: * ext/pulse/pulsesink.c: * ext/pulse/pulseutil.c: pulsesink: add 24bit sample formats Add check for pulseaudio 0.9.15 and enable 24bits samples in that case. 2009-07-13 12:23:37 -0400 Olivier Crête * common: Automatic update of common submodule From 5845b63 to fedaaee 2009-07-13 17:53:25 +0200 Marc Leeman * gst/rtp/gstrtpmpvpay.c: mpvpay: Rework the timestamping Rework the timestamping in the mpv payloader so that the timestamps are more accurate. Fixes #587680 2009-07-03 08:47:12 +0200 Filippo Argiolas * configure.ac: * tests/examples/Makefile.am: * tests/examples/v4l2/Makefile.am: * tests/examples/v4l2/probe.c: v4l2src: add a simple test case for device probing 2009-07-03 08:38:43 +0200 Filippo Argiolas * configure.ac: * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2object.c: v4l2src: optional support for device probing with gudev Enumerate v4l2 devices using gudev if available. Fixes bug #583640. 2009-07-10 19:54:25 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Random cleanup 2009-07-10 19:54:13 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Send queries to the master pad by default instead of all pads 2009-07-10 19:34:41 +0200 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/blend_rgb.c: * gst/videomixer/videomixer.c: videomixer: Add RGB, BGR, xRGB, RGBx, xBGR, BGRx support 2009-07-10 17:43:07 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Clean up debugging a bit 2009-07-10 17:25:48 +0200 Sebastian Dröge * gst/videomixer/videomixer.c: videomixer: Remove some redundant checks and error out immediately if not negotiated Also stop leaking the output buffer in some error cases. 2009-07-10 17:23:03 +0200 Sebastian Dröge * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_i420.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Remove the calculate_frame_size() function and use libgstvideo instead 2009-06-30 15:13:44 +0200 Edward Hervey * gst/videomixer/videomixer.c: videomixer: Remove unused link/unlink pad methods 2009-06-30 12:43:04 +0200 Edward Hervey * gst/videomixer/blend_i420.c: videomixer: I420 mode: Add fast path for 0.0 and 1.0 alpha If the source alpha is 0.0, we take nothing. If the source alpha is 1.0, we overwrite everything. 2009-06-30 12:40:02 +0200 Edward Hervey * gst/videomixer/blend_i420.c: videomixer: I420 blending : Fix main algorithm. When blending a source layer with an alpha of 'a' on top of another destination layer we take the sum of: * 'a' percent of the source layer * (100 - 'a') percent of the destination layer (the remainder) 2009-06-30 12:39:19 +0200 Edward Hervey * gst/videomixer/blend_i420.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: * gst/videomixer/videomixerpad.h: videomixer: Make debugging category global to all the code. 2009-06-29 19:23:41 +0200 Edward Hervey * gst/videomixer/videomixer.c: videomixer: improve readability of debugging statements. 2009-07-08 13:38:53 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: do not leak timeout message 2009-07-09 07:14:23 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avi: Don't forward NEWSEGMENT events from upstream New ones are generated later and simply forwarding them can result in NEWSEGMENT events of different format going downstream. Fixes bug #587983. 2009-07-08 18:19:45 +0200 Sebastian Dröge * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_i420.c: videomixer: Make checker pattern lookup table constant 2009-07-08 18:17:48 +0200 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/blend_bgra.c: * gst/videomixer/videomixer.c: videomixer: Add support for ARGB And clean up the caps parsing. 2009-07-08 15:17:41 +0200 Benjamin Gaignard * gst/udp/gstudpnetutils.c: udp: Initialize pointer to NULL Otherwise we're calling free() with some random memory address in error cases. Fixes bug #587982. 2009-07-07 16:35:24 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: sprinkle some more const 2009-07-07 15:57:55 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: perform some more (careful) data buffering Once buffering has started (with an mdat atom), continue buffering until moov atom is reached, which handles cases with multiple mdat atoms. Also keep adapter/offset better in sync with upstream and fix some debug statements. Fixes #587426. 2009-07-06 10:40:31 +0200 Philip Jgenstedt * gst/avi/gstavidemux.c: avidemux: Replace deprecated GST_DISABLE_DEBUG with correct macro. Fixes #587826 2009-07-01 13:07:48 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: error out instead of dividing by 0 Error out if timescale is 0. 2009-07-01 09:32:42 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: Revert "qtdemux: Make sure we don't blacklist streams by wrongly comparing their" This reverts commit 5503a59a5779b67451d8a271000181790ee76bc7. Reverting this since it causes regressions with a lot of sample files I have, all of which worked fine with the last -good release (#586891). 2009-06-30 15:54:47 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: comment out unused structure 2009-06-30 13:12:09 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: more size checks, and use g_try_new0() instead of g_new0() Whenever we alloc something based on a user-supplied size, we should really use g_try_new(), otherwise we can easily be made to abort by passing a ridiculously large number to us for allocing. Fixes problems with some fuzzed files. 2009-06-29 18:58:33 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: guard against bogus atom sizes and short reads Check the possibly 64-bit atom size more carefully before casting it to an int and passing it to gst_pad_pull_range(), otherwise we might end up pulling 0 bytes, getting an empty buffer as requested and dereferencing not available data whilst thinking we actually asked for and got 0x1000000000000 bytes. Similar fix for push mode operation where neededbytes ends up being 0 bytes, which makes us assert. Fixes crash with broken or fuzzed file (NB #122378). 2009-06-29 16:52:41 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: use 0x prefix when logging numbers in hex 2009-07-01 08:40:40 +0200 Edward Hervey * ext/flac/gstflacdec.c: flacdec: Don't send empty string tags 2009-06-30 21:35:37 +0400 LRN * gst/udp/gstmultiudpsink.c: Don't use sendmsg()-dependent code on Windows Fixes #585842 2009-06-30 15:59:20 +0200 Wim Taymans * gst/law/alaw-decode.c: * gst/law/alaw-encode.c: * gst/law/alaw.c: * gst/law/mulaw-decode.c: * gst/law/mulaw-encode.c: * gst/law/mulaw.c: law: fix caps and negotiation Fix the caps to include the depth (instead of width twice) in the caps of audio/x-raw-int. Fix negotiation to not only copy the rate/channels of the first structure. 2009-06-30 14:48:09 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: include "1.0=100%" in volume and change upper limit Upper volume limmit was 1000. That appear unneceasrily high. It would also cause sever distortion if accidentialy used. Now its 10 (~ +15db) which is also in sync with volume and playbin2. 2009-06-29 15:39:43 +0200 Wim Taymans * ext/pulse/pulsesrc.c: pulse: some more trivial cleanups 2009-06-29 15:38:49 +0200 Wim Taymans * ext/pulse/pulsemixer.c: pulse: trivial cleanups 2009-06-29 15:20:31 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: clear ringbuffer when asked to Since we map the ringbuffer to the pulseaudio internal ringbuffer, flush the pulseaudio buffer when we are asked to clear the ringbuffer. This avoids some leftover audio after a seek. 2009-06-26 15:00:14 +0100 Jan Schmidt * autogen.sh: autogen.sh: Actually do the 'echo -n' -> printf change. 2009-06-26 14:40:14 +0100 Jan Schmidt * autogen.sh: autogen.sh: Use printf instead of 'echo -n'. Check for automake-1.1[01] Check for more automake command variants. Use printf instead of 'echo -n' for portability 2009-06-26 13:42:09 +0100 Jan Schmidt * common: Automatic update of common submodule From f810030 to 5845b63 2009-06-26 13:19:04 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: don't process track_num/track_count tags with a 0 value Number/count values of 0 mean they're not set. Don't put those in the taglist. 2009-06-25 18:51:12 +0100 Tim-Philipp Müller * sys/waveform/gstwaveformsink.c: waveformsink: use 'guint8' instead of 'byte' to fix compilation with MSVC8 We need a cast here for pointer arithmetic to work correctly, but some MSVC versions don't seem to like 'byte', so use guint8 here. Hopefully fixes #585361. 2009-06-25 19:39:37 +0300 Stefan Kost * sys/v4l2/v4l2_calls.c: v4l2src: set structs to zero before using them in ioctls This fixes valgrind warnings. 2009-06-25 13:23:40 +0200 Julien Moutte * gst/qtdemux/qtdemux.c: qtdemux: Make sure we don't blacklist streams by wrongly comparing their duration with entire clip duration. 2009-06-25 13:18:14 +0200 Krzysztof Błaszkowski * gst/rtsp/gstrtpdec.c: rtpdec: fix some buffer leaks 2009-06-25 08:11:09 +0200 Edward Hervey * gst/flv/gstflvparse.c: flvparse: Add missing break in switch/case. 2009-06-25 08:10:38 +0200 Edward Hervey * gst/flv/gstflvdemux.c: flvdemux: Remove unused variable, hint branch likeliness, add comments. 2009-06-25 08:09:57 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Removed unused variable 2009-06-25 07:41:07 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Remove dead assignments and unused variables. Also add branch likeliness macros. 2009-06-25 07:40:26 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Fix uninitialized variables. Fixes build on macosx 2009-06-24 17:43:25 +0300 Stefan Kost * ext/soup/gstsouphttpsrc.c: souphttpsrc: free memory in finalize finalize is called only once. no need to clear pointers there. dispose is for unreffing. 2009-06-24 15:14:14 +0100 Jan Schmidt * common: Automatic update of common submodule From 6ab11d1 to f810030 2009-06-08 14:46:48 +0100 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: short-circuit gst_avi_demux_src_convert() when parsing the index Don't call gst_avi_demux_src_convert() for each single index entry. Not only do we already have the pointer to the stream context, we also know the formats we want to convert from and to already, so we may just as well use optimised conversion routines that bypass some of the checks and lookups made in gst_avi_demux_src_convert(). 2009-06-17 16:39:36 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Another round of G_*LIKELY micro-optimisations. 2009-06-17 16:20:25 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Take last sample duration for dummy segment calculation. This fixes the cases where files without EDL wouldn't output their last buffer. 2009-06-24 12:36:31 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Sprinkle branch likeliness macros over the code. 2009-06-23 16:54:32 +0200 Edward Hervey * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: raw1394: sprinkle branch likeliness macros accross the code. 2009-06-14 10:36:17 +0200 Edward Hervey * gst/qtdemux/qtdemux.c: qtdemux: Add GST_MEMDUMP statements for unknown atoms. This is to help developers track down and implement unhandled atoms faster. 2009-06-23 17:51:32 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Remove the interlaced field from the output caps if deinterlacing is enabled 2009-06-23 17:48:47 +0200 Sebastian Dröge * gst/deinterlace/tvtime/greedyh.c: deinterlace: Copy the correct line from correct place in the history 2009-06-23 16:35:36 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: use same protocols after redirect After a redirect we want to use the same protocols that we were using for the current url. 2009-06-23 15:35:37 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: don't leak cover art 2009-06-23 14:10:10 +0100 Tim-Philipp Müller * gst/udp/gstudpnetutils.c: udp: fix compiler warning about EAI_ADDRFAMILY getting redefined in some cases Include the header from where we include all the system headers with the socket stuff before we try to define EAI_ADDRFAMILY ourselves, otherwise we define it ourselves and then get a compiler warning if a system header defines it as well without guarding against it being defined already. 2009-06-23 14:39:56 +0200 Wim Taymans * gst/matroska/matroska-ids.h: matroska: and the new headers too 2009-06-23 14:32:43 +0200 Wim Taymans * gst/matroska/matroska-demux.c: matroske: fix compiler error change gpointer to guint8 * for codec_state and codec_priv as some functions operate on those types and it avoids breaking strict-aliasing rules. 2009-06-23 12:42:33 +0200 Wim Taymans * gst/matroska/matroska-demux.c: matroskademux: avoid leaking buffers Don't leak buffers when resyncing to a keyframe. Avoid leaking buffers when exiting the loop on error conditions. Add some more debug info. Fixes #585911 2009-06-22 15:56:58 +0300 Stefan Kost * sys/v4l2/gstv4l2src.c: v4l2: open/close the device in READY This allows to query the device in READY. Before one need to switch it to PAUSED and that also starts streaming. 2009-06-20 15:41:44 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: qtdemux: use GST_MEMDUMP 2009-06-19 00:16:41 +0100 Tim-Philipp Müller * gst/apetag/Makefile.am: * gst/apetag/gstapedemux.c: apedemux: add container-format tag Use pbutils here because the string is translated. 2009-06-19 00:15:51 +0100 Tim-Philipp Müller * gst/id3demux/Makefile.am: * gst/id3demux/gstid3demux.c: id3demux: add container-format tag Using pbutils here because the string is translated. 2009-06-18 23:51:52 +0100 Tim-Philipp Müller * ext/dv/gstdvdemux.c: dvdemux: post container-format tag Also merge the two almost identical _add_*_pad() functions into one. 2009-06-18 23:43:49 +0100 Tim-Philipp Müller * ext/dv/gstdvdemux.c: dvdemux: don't screw up first audio buffer Query the audio format, esp. dvdemux->num_channels, before we use that variable to allocate the initial buffer. That way we don't accidentally push a zero-sized buffer as first audio buffer. 2009-06-18 23:38:30 +0100 Tim-Philipp Müller * gst/multipart/multipartdemux.c: multipartdemux: post container-format tag 2009-06-18 23:37:11 +0100 Tim-Philipp Müller * gst/matroska/matroska-demux.c: matroska-demux: post container-format tags 2009-06-18 23:36:28 +0100 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: post container-format tag 2009-06-18 23:35:29 +0100 Tim-Philipp Müller * gst/qtdemux/qtdemux.c: qtdemux: post container-format tags 2009-06-21 17:13:43 +0200 Sebastian Dröge * gst/audiofx/audioamplify.c: audioamplify: Fix integer overflows on 32 bit architectures 2009-06-21 09:50:54 +0200 Kipp Cannon * gst/audiofx/audioamplify.c: audioamplify: Don't declare a loop index static The previous patch to add support for additional sample formats possibly introduced a reentrancy bug: a variable used for a loop index was declared static. This patch fixes that, and also adds a "/* *INDENT-ON* */" annotation following the macro block. (I don't know what the annotation is for, but the adder, where I copied this from, has it). 2009-06-19 22:37:27 +0200 Sebastian Dröge * gst/audiofx/audioamplify.c: audioamplify: Fix off-by-one in wrap-positive mode 2009-06-19 22:20:45 +0200 Kipp Cannon * gst/audiofx/audioamplify.c: * gst/audiofx/audioamplify.h: audioamplify: Add noclip method and support for more formats Fixes bug #585828 and #585831. 2009-06-19 21:46:41 +0200 Koop Mast * gst/udp/gstudpnetutils.h: udp: Fix build on FreeBSD Fixes bug #586397. 2009-06-19 18:12:27 +0200 Ognyan Tonchev * tests/check/elements/rtp-payloading.c: tests: add unit tests for buffer-list payloaders See #585559 2009-06-19 18:00:35 +0200 Ognyan Tonchev * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: rtpmp4vpay: add support for buffer-list See #585559 2009-06-19 17:57:12 +0200 Ognyan Tonchev * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpjpegpay.h: rtpjpegpay: add support for buffer-lists See #585559 2009-06-19 17:53:32 +0200 Ognyan Tonchev * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: rtph264pay: add support for buffer-lists See #585559 2009-06-18 11:54:22 +0200 Wim Taymans * gst/udp/gstudpnetutils.c: udputils: don't free invalid memory As spotted by benjiG in IRC. don't free invalid memory when getaddrinfo failed. 2009-06-17 17:48:31 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulseink: don't leak device_description don't leak the device_description. some cleanups. 2009-06-19 14:44:40 +0100 Tim-Philipp Müller * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: update .po files for sunaudiomixer string changes 2009-06-18 16:58:26 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: streaming; adjust sizes to cater for padding in chunks 2009-06-17 11:54:53 +0200 Mark Nauwelaerts * gst/avi/gstavidemux.c: avidemux: streaming mode; handle data chunks grouped in rec lists. Fixes #567983. 2009-06-10 12:36:50 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: map some tags to COMPOSER rather than ARTIST 2009-06-10 12:34:43 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix some 3GP tag extraction (keywords, genre, location) 2009-06-09 15:36:50 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: extract pixel-aspect-ratio information 2009-06-17 07:14:09 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Fix leaking of the Matroska TITLE element 2009-06-16 20:38:42 +0200 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst/effectv/gstaging.c: * gst/effectv/gstaging.h: * gst/effectv/gstdice.c: * gst/effectv/gstdice.h: * gst/effectv/gstedge.c: * gst/effectv/gstedge.h: * gst/effectv/gstquark.c: * gst/effectv/gstquark.h: * gst/effectv/gstrev.c: * gst/effectv/gstrev.h: * gst/effectv/gstshagadelic.c: * gst/effectv/gstshagadelic.h: * gst/effectv/gstvertigo.c: * gst/effectv/gstvertigo.h: * gst/effectv/gstwarp.c: * gst/effectv/gstwarp.h: effectv: Add basic documentation for the effectv elements 2009-06-16 20:16:13 +0200 Sebastian Dröge * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gsteffectv.h: * gst/effectv/gstquark.c: * gst/effectv/gstshagadelic.c: effectv: Define the fast PRNG function at a central place 2009-06-16 20:13:35 +0200 Sebastian Dröge * gst/effectv/Makefile.am: * gst/effectv/gstaging.c: * gst/effectv/gstaging.h: * gst/effectv/gstdice.c: * gst/effectv/gstdice.h: * gst/effectv/gstedge.c: * gst/effectv/gstedge.h: * gst/effectv/gsteffectv.c: * gst/effectv/gsteffectv.h: * gst/effectv/gstquark.c: * gst/effectv/gstquark.h: * gst/effectv/gstrev.c: * gst/effectv/gstrev.h: * gst/effectv/gstshagadelic.c: * gst/effectv/gstshagadelic.h: * gst/effectv/gstvertigo.c: * gst/effectv/gstvertigo.h: * gst/effectv/gstwarp.c: * gst/effectv/gstwarp.h: effectv: Move type definitions into separate headers This is needed for the docs later. 2009-06-16 19:41:02 +0200 Sebastian Dröge * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstquark.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: effectv: Remove get_unit_size implementations The default on from GstVideoFilter handles this already. 2009-06-16 14:54:34 +0100 Tim-Philipp Müller * configure.ac: configure: bump core/base requirements to git Need git core for basesink bufferlist additions; -base requirement bumped gratuitously. 2009-06-16 15:25:54 +0200 Wim Taymans * tests/check/elements/udpsink.c: tests: add some debug, send newsegment 2009-06-16 15:06:50 +0200 Wim Taymans * gst/udp/gstudpsrc.c: udpsrc: add debug line for the socket 2009-06-16 15:06:25 +0200 Wim Taymans * tests/check/pipelines/flacdec.c: tests: turn g_print into debug 2009-06-16 15:04:15 +0200 Ognyan Tonchev * gst/udp/gstmultiudpsink.c: * tests/check/Makefile.am: * tests/check/elements/udpsink.c: multiudpsink: add support for buffer lists Add support for BufferList and add a unit test. Fixes #585842 2009-06-16 00:02:42 +0100 Tim-Philipp Müller * ext/soup/gstsouphttpsrc.c: souphttpsrc: reset session state when stopping Increases the chances that the element is actually reusable. 2009-06-15 23:49:48 +0100 Tim-Philipp Müller * ext/soup/gstsouphttpsrc.c: souphttpsrc: log response and request headers and fix some broken indenting 2009-06-15 22:40:35 +0200 Wim Taymans * gst/rtp/gstrtpmp4gdepay.c: mp4gdepay: guess constantDuration better Do a better job at guessing the constantDuration parameter when it is not present in the caps. Fixes #585205 2009-06-15 21:09:47 +0200 Sebastian Dröge * gst/effectv/gstwarp.c: warptv: Clean up warptv element and fix some minor bugs and leaks 2009-06-15 20:53:23 +0200 Sebastian Dröge * gst/effectv/gstvertigo.c: vertigotv: Clean up vertigotv element and fix some minor bugs and leaks 2009-06-15 20:38:01 +0200 Sebastian Dröge * gst/effectv/gstdice.c: dicetv: Use guint8 instead of char (which can be signed or unsigned) 2009-06-15 20:36:39 +0200 Sebastian Dröge * gst/effectv/gstshagadelic.c: shagadelictv: Use guint8/gint8 instead of char (which can be signed or unsigned) 2009-06-15 20:31:30 +0200 Sebastian Dröge * gst/effectv/gstshagadelic.c: shagadelictv: Clean up element and free all memory in finalize 2009-06-15 20:21:58 +0200 Sebastian Dröge * gst/effectv/gstrev.c: revtv: Clean up revtv element 2009-06-15 20:07:42 +0200 Sebastian Dröge * gst/effectv/gstquark.c: quarktv: Simplify some code 2009-06-15 20:07:10 +0200 Sebastian Dröge * gst/effectv/gstquark.c: quarktv: Use the input data if a NULL buffer is chosen instead of the value 0 2009-06-15 20:00:43 +0200 Sebastian Dröge * gst/effectv/gstquark.c: quarktv: Fix setting the planes property of quarktv Setting it to a value<16 would cause crashes before because current_plane was set to the old number of planes-1. Also fix calculations for non-2^n planes values. 2009-06-15 17:50:41 +0200 Sebastian Dröge * gst/effectv/gstquark.c: quarktv: Clean up the quarktv element 2009-06-15 17:39:20 +0200 Sebastian Dröge * gst/effectv/gsteffectv.c: effectv: Make elements list constant 2009-06-15 17:37:53 +0200 Sebastian Dröge * gst/effectv/gstedge.c: edgetv: Clean up edgetv element and fix memory leak 2009-06-15 17:21:58 +0200 Sebastian Dröge * gst/effectv/gstdice.c: dicetv: Clean up dicetv element and fix some smaller issues This fixes a memory leak (the dice map) and a crash when setting the square-bits property before caps are set. 2009-06-15 17:20:21 +0200 Sebastian Dröge * gst/effectv/Makefile.am: * gst/effectv/gstaging.c: agingtv: Actually use GstController for syncing the properties to timestamps 2009-06-15 17:03:38 +0200 Sebastian Dröge * gst/effectv/gstaging.c: agingtv: Export some more agingtv properties via GObject properties 2009-06-15 15:06:56 +0200 Sebastian Dröge * gst/effectv/gstaging.c: agingtv: General cleanup and updating of copyright Also make the scratch-lines property exported via a GObject property and initialize/reset the internal state correctly. 2009-06-15 15:05:58 +0200 Sebastian Dröge * gst/effectv/gstaging.c: agingtv: Store and update state inside the instance struct This makes the coloraging effect and pits effect visible. 2009-06-15 15:51:32 +0100 Tim-Philipp Müller * ext/pulse/pulsesink.c: pulsesink: ref custom ring buffer class and type in class_init Hack around thread-safety issues in GObject and our racy _get_type() functions (we could easily fix the _get_type() functions, but we still need to hack around the GObject class races until we require a newer GLib version, I think). 2009-06-14 19:19:19 +0100 Tim-Philipp Müller * ext/dv/demo-play.c: * tests/old/examples/Makefile.am: * tests/old/examples/level/Makefile.am: * tests/old/examples/level/README: * tests/old/examples/level/demo.c: * tests/old/examples/level/plot.c: * tests/old/examples/switch/.gitignore: * tests/old/examples/switch/Makefile.am: * tests/old/examples/switch/switcher.c: Remove a few old example apps from the 0.8 days Some have been replaced by newer ones, others are demoing elements that don't exist any longer (not in -good anyway), and others have not been touched in many years and it seem pointless to keep them around. Removing these files makes sure we don't have any code in our repository that uses Gtk+ symbols which are to be removed for GNOME3, and as such will make some script that greps for this kind of stuff give us a clean bill of code health. Fixes #585757. 2009-06-13 21:02:45 -0400 Olivier Crête * common: * gst/rtp/gstrtpsirenpay.c: rtpsirenpay: Remove deprecated symbol Patch by: Luis Menina 2009-06-13 10:43:55 +0200 Marvin Schmidt * tests/check/Makefile.am: tests: Don't run the flacdec test if the plugin isn't built. Fixes #585630 2009-06-12 16:06:28 +0200 Patrick Radizi * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: Add RTP blocksize functionality Add property to make the client suggest a blocksize to the server. Fixes #585549 2009-06-11 22:30:06 +0200 Wim Taymans * gst/rtp/README: rtp: update README, fix some typos, mention gstrtpbin 2009-06-11 19:10:53 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: handle border cases in resampler 2009-06-11 13:32:22 +0100 Jan Schmidt * common: * docs/Makefile.am: * docs/plugins/Makefile.am: * docs/upload.mak: docs: Bump common. Use upload-doc.mak instead of upload.mak Remove the local copy of upload.mak in favour of using the shared upload-doc.make in common/ 2009-06-11 11:39:25 +0100 Jan Schmidt * gst/goom/goom_config_param.h: * gst/videomixer/videomixer.c: docs: Quieten a couple more docs warnings 2009-06-11 11:27:26 +0100 Jan Schmidt * gst/matroska/lzo.c: docs: Remove gtk-doc comment marker These comment blocks aren't gtk-doc comments and cause annoying noise in the docs build. 2009-06-11 10:05:32 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Implement upstream negotation 2009-06-10 21:47:40 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Improve debugging and clean up some code 2009-06-10 14:55:18 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Clip buffers to the current segment if possible 2009-06-10 14:45:06 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Clean up includes and clean up order of instance struct fields 2009-06-10 16:09:56 -0400 Olivier Crête * gst/rtp/gstrtph263pay.h: rtph263pay: Default to doing A, B and C modes, not only A 2009-06-10 09:56:11 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Fix QoS calculations The diff is a signed integer, not an unsigned one of course. In modes other than GST_DEINTERLACE_ALL every frame has twice the duration of the field duration. 2009-06-09 14:13:31 -0400 Olivier Crête * gst/rtp/gstrtpsirenpay.c: rtpsirenpay: Put the bitrate in the RTP caps The MS code seems to require the bitrate to interoperate and draft-ietf-avt-rtp-g7221-00 also has it. 2009-06-09 19:55:36 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: Implement basic QoS This change is based on Tim's QoS implementation for jpegdec. 2009-06-09 19:29:51 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: Directly proxy events/queries to the peer pads This removes some overhead introduced by the default handlers that need to iterate over the other pads. 2009-06-09 10:38:52 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: debug_memdump() unknown tags. Refactor junk parsing code. This makes life slightly easier when debugging avi files. 2009-06-08 08:21:43 +0200 Edward Hervey * gst/rtp/Makefile.am: rtp: Don't forget to dist the headers for the CELT (de)payloaders. 2009-06-07 20:54:06 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: Revert "Revert "qtdemux: fill timestamp table completely"" This reverts commit 9f022c8a8503c2ce0fa617fdb50e41706dd412f5. Sorry, I was thinking about the wrong module. 2009-06-07 20:49:50 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: Revert "qtdemux: fill timestamp table completely" This reverts commit 790b050fc5302cae89cddcd23b258093967d05a9. I forgot we were frozen. 2009-06-07 20:46:45 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: fill timestamp table completely When there are less timestamps that there are samples, fill up the sample table with the last know timestamp. This situation can happen when the last sample does not decode and doesn't need a timestamp. We however calculate the total track length using the last sample timestamp so we need to have something sensible in there. Fixes #585056 2009-06-07 13:37:04 +0200 Wim Taymans * gst/wavparse/gstwavparse.c: wavparse: handle LIST INFO of 0 size Handle LIST INFO chunks of 0 size instead of causing errors. Fixes #584981 2009-06-07 13:24:45 +0200 Wim Taymans * gst/wavparse/gstwavparse.c: Revert "wavparse: Remove dead assignments, move variable to where it's needed." Reverts commit 44256a78f8dd79a91f3bb2ab7c3aa623c097bb8a and use the result in error reporting so that we can see what's going on. 2009-06-05 18:55:02 +0200 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpceltdepay.c: * gst/rtp/gstrtpceltdepay.h: celtdepay: add CELT depayloader 2009-06-05 15:30:51 +0200 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpceltpay.c: * gst/rtp/gstrtpceltpay.h: rtpceltpay: add CELT RTP payloader 2009-06-05 16:54:48 +0100 Jan Schmidt * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiomixeroptions.c: * sys/sunaudio/gstsunaudiomixertrack.c: sunaudio: Fix switch setting on some devices. Add debug. Fix a FIXME. Fix the setting of toggle switches on some broken audio drivers which report that no audio ports are settable by ignoring the mod_port field there. Add some debug statements. Fix a FIXME now that Good relies on a new enough gst-plugins-base. 2009-06-04 12:27:19 +0100 Jan Schmidt * sys/sunaudio/Makefile.am: * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiomixerctrl.h: * sys/sunaudio/gstsunaudiomixeroptions.c: * sys/sunaudio/gstsunaudiomixeroptions.h: * sys/sunaudio/gstsunaudiomixertrack.c: * sys/sunaudio/gstsunaudiomixertrack.h: sunaudio: Support new flags for options and actions Use new audio mixer flags added in Base 0.10.23 to expose flags and options on the SunAudio devices. Fixes: #583593 Patch By: Brian Cameron Patch By: Garrett D'Amore 2009-05-15 11:50:38 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: deinterlace: First try to handle DVD still frames correctly This helps a bit with bug #582740 but still doesn't make it work. 2009-06-04 17:37:03 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: only notify if all checks passed Replace goto done: with return, as those are checks when we don't want to flag a pending notify. 2009-06-04 15:19:05 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: set the right state on rtpbin We need to set the state of gstrtpbin to the same state as our source elements. This fixes fallback to TCP again. 2009-06-03 18:23:53 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: check pointer before accessing Move existing check a few lines up, so that we check before accessing fields. 2009-06-03 18:21:12 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: rename gst_pulse_sink_get_time to gst_pulsesink_get_time Rename internal method for consistency. 2009-06-03 18:19:22 +0300 Stefan Kost * ext/pulse/pulsesink.c: pulsesink: use values from pa_stream_get_buffer_attr() We were putting the requested values back into ringbuffer spec, instead of using the queried values. 2009-06-02 19:32:21 +0200 Wim Taymans * gst/rtp/gstrtpvrawpay.c: vrawpay: trim output buffers Remove the leftover unused bytes in the output buffer. Fixes #584613 2009-06-02 19:30:30 +0200 Wim Taymans * gst/rtp/gstrtpvrawdepay.c: vrawdepay: fix parsing of sampling field commit a12d9a80f225be97b3674b1a0506ac66544dbf49 broke the parsing of the sampling. 2009-05-27 17:06:34 +0100 Jan Schmidt * ext/libpng/gstpngdec.c: pngdec: Avoid possible overflow in calculations A malformed (or simply huge) PNG file can lead to integer overflow in calculating the size of the output buffer, leading to crashes or buffer overflows later. Fixes SA35205 security advisory. 2009-06-02 00:48:00 +0100 Tim-Philipp Müller * ext/flac/gstflacenc.c: flacenc: some more logging - dump header packets Also, the final fixing up of the headers is expected and not something we should warn about. 2009-06-02 00:37:15 +0100 Tim-Philipp Müller * ext/flac/gstflacenc.c: flacenc: never ever pass values >36bits to _set_total_samples_estimate() Let's be paranoid and make sure we never pass a number that takes up more than 36 bits to _set_total_samples_estimate(), since libFLAC expects all the other bits to be zero, and if this is not the case neighbouring fields in the global stream info header may get messed up inadvertently, so that flac -d refuses to decode the stream. See #584455. 2009-06-01 22:33:02 +0200 Thomas Vander Stichele * ext/flac/gstflacenc.c: Address bad FLAC sample length encoding of #5844455 Commit df707c666433a78d3878af6f055698d5756226c4 introduced an obvious bug in the sample length calculation, using the wrong macro for conversion. 2009-06-01 11:58:21 -0700 Brian Cameron * gst/deinterlace/tvtime/mmx.h: deinterlace: Fix spurious colons in asm code Fixes #584174. Signed-off-by: David Schleef 2009-06-01 00:40:55 +0100 Tim-Philipp Müller * gst/avi/gstavidemux.c: avidemux: skip JUNK chunks in data section in streaming mode Skip JUNK tags in streaming mode as well instead of EOSing prematurely. Fixes #564100. 2009-05-28 14:01:17 +0200 Sebastian Dröge * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_i420.c: * gst/videomixer/videomixer.c: videomixer: Don't use // comments 2009-05-28 13:56:15 +0200 Sebastian Dröge * gst/videomixer/blend_bgra.c: videomixer: Fix background blitting when a color mode is selected with BGRA 2009-05-28 13:54:14 +0200 Sebastian Dröge * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_i420.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Some cleanup and fix the calculation of the frame size in bytes 2009-05-28 13:35:52 +0200 Sebastian Dröge * gst/videomixer/blend_i420.c: videomixer: Fix I420 blending to actually do something For this we a) implement the checkers filling and b) actually blend the src/dest by using the src alpha value from the pad. 2009-05-28 13:14:13 +0200 Sebastian Dröge * gst/videomixer/blend_bgra.c: videomixer: Fix ARGB blending to actually work 2009-05-28 13:04:51 +0200 Sebastian Dröge * gst/videomixer/Makefile.am: * gst/videomixer/blend_bgra.c: videomixer: Blend BGRA ourselves instead of using Cairo 2009-05-28 12:55:16 +0200 Alex Ugarte * gst/videomixer/Makefile.am: * gst/videomixer/blend_ayuv.c: * gst/videomixer/blend_bgra.c: * gst/videomixer/blend_i420.c: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: videomixer: Add support for blending BGRA and AYUV Fixes bug #577017. 2009-05-28 12:39:46 +0200 Ghislain 'Aus' Lacroix * gst/equalizer/gstiirequalizer.c: equalizer: Use floating point arithmetic internally for the int16 mode By using int32 arithmetic we will introduce distortions as the IIR filter is very sensitive to rounding errors. Fixes bug #580214. 2009-05-28 10:55:16 +0100 Christian Schaller * gst-plugins-good.spec.in: Update spec file with latest plugins 2009-05-26 17:19:08 +0100 Jan Schmidt * common: Automatic update of common submodule From 888e0a2 to c572721 2009-05-26 16:20:35 +0300 Stefan Kost * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: v4l2: cleanup and commenting Remove newlines inserted by gst-indent once. Remove unused var from instance struct. Add comments. Add another #define for default property value. 2009-05-06 12:43:35 +0300 Stefan Kost * tests/check/Makefile.am: makefile: idea about makeing more sources/sinks testable again 2009-05-25 16:33:35 +0200 John Keeping * ext/libpng/gstpngdec.c: pngdec: match g_malloc() with g_free() Matching g_malloc() with a g_free() is important when a custom allocator is installed. Fixes #583803 2009-05-12 18:39:28 +0200 Wim Taymans * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: rtpmp4vpay: don't look for headers in some cases In some streams (starting with 00000100) don't look for the headers but push data as it is. Fixes #582153 2009-05-13 11:50:22 +0200 Patrick Radizi * gst/rtsp/gstrtspsrc.c: rtspsrc: fix memory leak of messages Free messages correctly. Fixes #577318 2009-05-24 19:32:17 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: make fakesrc silent Make the fakesrc that is responsible for sending dummy packets silent. 2009-05-24 16:33:42 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't send teardown before setup Don't send a TEARDOWN request when we did not manage to successfully setup a stream. 2009-05-14 14:46:14 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.h: matroskademux: Populate a GstIndex that is set on matroskademux 2009-05-14 10:35:22 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: flvmux: Get the max duration from upstream if there's no duration tag 2009-05-14 10:29:49 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: flvmux: Write an index table to the end of the file 2009-05-22 01:12:35 +0100 Tim-Philipp Müller * autogen.sh: * configure.ac: autotools: move the -Wno-portability from autogen.sh to configure.ac If we're lucky it'll get used on automatic rebuilds as well that way. 2009-05-22 01:10:12 +0100 Tim-Philipp Müller * common: * configure.ac: * m4/gst-fionread.m4: m4: fix 'suspicious cache id' warnings and update common to pull in a similar fix. Also check in configure whether the compiler supports do while macros (GLib wants this defined and it is needed to avoid warnings with some c++ compilers apparently). 2009-05-22 01:39:33 +0300 Zeeshan Ali (Khattak) * configure.ac: souphttpsrc: Bump-up libsoup-2.24 dep to >= 2.26 The helper function soup_message_headers_get_content_type that we now use was added in 2.26. 2009-05-20 17:57:59 +0300 Zeeshan Ali (Khattak) * ext/soup/gstsouphttpsrc.c: souphttpsrc: Set caps for audio/L16 content-type When "Content-Type" header is "audio/L16", we need to set the caps on the outgoing buffers so that downstream elements can have means to detect the stream type and handle it appropriately. Tested with HTTP stream provided by pulse-audio's http module (git master). 2009-05-20 15:06:25 +0300 Zeeshan Ali (Khattak) * ext/soup/gstsouphttpsrc.c: * ext/soup/gstsouphttpsrc.h: souphttpsrc: Rename icy_caps to src_caps 2009-05-21 23:39:13 +0200 Philippe Normand * ext/jpeg/gstjpegdec.c: jpegdec: bump max size to 65535x65535 Remove artificial jpeg image limits. Fixes #583048. 2009-05-21 21:36:02 +0100 Jan Schmidt * win32/common/config.h: win32: Update the win32 config.h 2009-05-19 15:12:09 +0100 Jan Schmidt * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: matroskademux: Recognise PGS subpicture streams - the bluray format. Recognise and apply appropriate caps to PGS (Presentation Graphic Stream) subpicture streams. 2009-05-15 10:42:19 +0100 Jan Schmidt * ext/pulse/pulsesink.c: pulsesink: Convert an erroneous assertion Occasionally, we get a change callback for an old stream, triggering the assertion unnecessarily. Just ignore such callbacks. 2009-05-20 16:14:40 -0400 Olivier Crête * ext/pulse/pulsesink.c: pulse: Print a warning on under/overflows 2009-05-20 18:45:45 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: parse in24 boxes to get endianness in24 samples are normally big-endian but an enda box can change this to little-endian. Recurse into the in24 box and find the enda box so that we get the endianness right. Fixes #582515 2009-05-20 14:14:31 +0200 Wim Taymans * gst/multipart/multipartdemux.c: multipartdemux: add proper padtemplate 2009-05-20 14:02:43 +0200 Wim Taymans * gst/multipart/multipartdemux.c: multipartdemux: add more mime types Add mime-type for Panasonic g726 and add more required caps properties for other G726 mime-types. Make mime-types case insensitive. See #582169 2009-05-20 13:47:52 +0200 Wim Taymans * gst/multipart/multipartdemux.c: * gst/multipart/multipartdemux.h: multipartdemux: add flow aggregation 2009-05-20 13:29:02 +0200 Arnout Vandecappelle * gst/multipart/multipartdemux.c: multipartdemux: allow content to be empty. gst_adapter_take_buffer doesn't allow buffer to be empty. Simply skip any part where the content is empty. Don't create a pad for it either. See #582169 2009-05-18 22:19:39 +0200 Wim Taymans * gst/rtp/gstrtpchannels.h: rtp: fix channel positions for mono 2009-05-21 21:02:11 +0100 Jan Schmidt * configure.ac: Back to hacking -> 0.10.15.1 === release 0.10.15 === 2009-05-20 22:34:18 +0100 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-deinterlace.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * docs/plugins/inspect/plugin-y4menc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.15 2009-05-20 22:03:21 +0100 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2009-05-16 02:59:14 +0100 Jan Schmidt * ChangeLog: * configure.ac: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: * win32/common/config.h: 0.10.14.3 pre-release 2009-05-16 02:37:06 +0100 Jan Schmidt * tests/check/pipelines/flacdec.c: check: Don't change directory in the test Changing directory invalidates the paths the registry has picked up for our plugins, because the test environment specifies relative paths. Fixing that is a separate problem, in the meantime, build a path to the test files instead of changing directory. Fixes the distcheck. 2009-05-16 01:53:46 +0100 Jan Schmidt * win32/MANIFEST: win32: Remove directdraw project files from the win32 manifest 2009-05-16 01:21:34 +0100 Jan Schmidt * tests/check/elements/rganalysis.c: check: Remove assertion that breaks check again git master Remove the assertion that the sender of the tags message is the element until we decide whether that's going to be true or not. 2009-05-16 01:11:33 +0100 Jan Schmidt * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-directdraw.xml: * sys/Makefile.am: * sys/directdraw/Makefile.am: * sys/directdraw/gstdirectdrawplugin.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: * win32/vs6/libgstdirectdraw.dsp: * win32/vs7/libgstdirectdraw.vcproj: * win32/vs8/libgstdirectdraw.vcproj: Moved 'directdraw' from -good to -bad 2009-05-16 00:18:34 +0100 Jan Schmidt * tests/check/pipelines/.gitignore: ignores: Ignore the flacdec check binary 2009-05-16 00:17:57 +0100 Jan Schmidt * docs/plugins/inspect/plugin-avi.xml: docs: Update inspection details for the avi plugin 2009-05-16 00:00:07 +0100 Jan Schmidt * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-y4menc.xml: * tests/check/Makefile.am: * tests/check/elements/.gitignore: * tests/check/elements/y4menc.c: Moved 'y4menc' from -bad to -good 2009-05-13 17:55:46 +0200 Wim Taymans * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] y4menc: change my email change my email to something more current See #580783 2009-05-13 17:54:47 +0200 Wim Taymans * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] y4menc: don't strip timestamps Fixes #582483 2008-11-04 12:42:30 +0000 Stefan Kost [MOVED FROM BAD] Don't install static libs for plugins. Fixes #550851 for -bad. Original commit message from CVS: * ext/alsaspdif/Makefile.am: * ext/amrwb/Makefile.am: * ext/apexsink/Makefile.am: * ext/arts/Makefile.am: * ext/artsd/Makefile.am: * ext/audiofile/Makefile.am: * ext/audioresample/Makefile.am: * ext/bz2/Makefile.am: * ext/cdaudio/Makefile.am: * ext/celt/Makefile.am: * ext/dc1394/Makefile.am: * ext/dirac/Makefile.am: * ext/directfb/Makefile.am: * ext/divx/Makefile.am: * ext/dts/Makefile.am: * ext/faac/Makefile.am: * ext/faad/Makefile.am: * ext/gsm/Makefile.am: * ext/hermes/Makefile.am: * ext/ivorbis/Makefile.am: * ext/jack/Makefile.am: * ext/jp2k/Makefile.am: * ext/ladspa/Makefile.am: * ext/lcs/Makefile.am: * ext/libfame/Makefile.am: * ext/libmms/Makefile.am: * ext/metadata/Makefile.am: * ext/mpeg2enc/Makefile.am: * ext/mplex/Makefile.am: * ext/musepack/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/mythtv/Makefile.am: * ext/nas/Makefile.am: * ext/neon/Makefile.am: * ext/ofa/Makefile.am: * ext/polyp/Makefile.am: * ext/resindvd/Makefile.am: * ext/sdl/Makefile.am: * ext/shout/Makefile.am: * ext/snapshot/Makefile.am: * ext/sndfile/Makefile.am: * ext/soundtouch/Makefile.am: * ext/spc/Makefile.am: * ext/swfdec/Makefile.am: * ext/tarkin/Makefile.am: * ext/theora/Makefile.am: * ext/timidity/Makefile.am: * ext/twolame/Makefile.am: * ext/x264/Makefile.am: * ext/xine/Makefile.am: * ext/xvid/Makefile.am: * gst-libs/gst/app/Makefile.am: * gst-libs/gst/dshow/Makefile.am: * gst/aiffparse/Makefile.am: * gst/app/Makefile.am: * gst/audiobuffer/Makefile.am: * gst/bayer/Makefile.am: * gst/cdxaparse/Makefile.am: * gst/chart/Makefile.am: * gst/colorspace/Makefile.am: * gst/dccp/Makefile.am: * gst/deinterlace/Makefile.am: * gst/deinterlace2/Makefile.am: * gst/dvdspu/Makefile.am: * gst/festival/Makefile.am: * gst/filter/Makefile.am: * gst/flacparse/Makefile.am: * gst/flv/Makefile.am: * gst/games/Makefile.am: * gst/h264parse/Makefile.am: * gst/librfb/Makefile.am: * gst/mixmatrix/Makefile.am: * gst/modplug/Makefile.am: * gst/mpeg1sys/Makefile.am: * gst/mpeg4videoparse/Makefile.am: * gst/mpegdemux/Makefile.am: * gst/mpegtsmux/Makefile.am: * gst/mpegvideoparse/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/nuvdemux/Makefile.am: * gst/overlay/Makefile.am: * gst/passthrough/Makefile.am: * gst/pcapparse/Makefile.am: * gst/playondemand/Makefile.am: * gst/rawparse/Makefile.am: * gst/real/Makefile.am: * gst/rtjpeg/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/scaletempo/Makefile.am: * gst/sdp/Makefile.am: * gst/selector/Makefile.am: * gst/smooth/Makefile.am: * gst/smoothwave/Makefile.am: * gst/speed/Makefile.am: * gst/speexresample/Makefile.am: * gst/stereo/Makefile.am: * gst/subenc/Makefile.am: * gst/tta/Makefile.am: * gst/vbidec/Makefile.am: * gst/videodrop/Makefile.am: * gst/videosignal/Makefile.am: * gst/virtualdub/Makefile.am: * gst/vmnc/Makefile.am: * gst/y4m/Makefile.am: * sys/acmenc/Makefile.am: * sys/cdrom/Makefile.am: * sys/dshowdecwrapper/Makefile.am: * sys/dshowsrcwrapper/Makefile.am: * sys/dvb/Makefile.am: * sys/dxr3/Makefile.am: * sys/fbdev/Makefile.am: * sys/oss4/Makefile.am: * sys/qcam/Makefile.am: * sys/qtwrapper/Makefile.am: * sys/vcd/Makefile.am: * sys/wininet/Makefile.am: * win32/common/config.h: Don't install static libs for plugins. Fixes #550851 for -bad. 2008-06-26 15:52:40 +0000 Mark Nauwelaerts [MOVED FROM BAD] Add documentation for YUV4MPEG2 encoder element. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * gst/y4m/gsty4mencode.c: Add documentation for YUV4MPEG2 encoder element. 2007-04-24 15:49:18 +0000 Tim-Philipp Müller [MOVED FROM BAD] Plug some leaks; try to make build bot happy again. Original commit message from CVS: * gst/y4m/gsty4mencode.c: (gst_y4m_encode_init), (gst_y4m_encode_setcaps): * tests/check/elements/y4menc.c: (GST_START_TEST): Plug some leaks; try to make build bot happy again. 2006-11-13 18:55:57 +0000 Mark Nauwelaerts [MOVED FROM BAD] configure.ac: Enable cdaudio and y4m. Original commit message from CVS: Patch by: Mark Nauwelaerts * configure.ac: Enable cdaudio and y4m. * gst/y4m/Makefile.am: * gst/y4m/gsty4mencode.c: (gst_y4m_encode_base_init), (gst_y4m_encode_class_init), (gst_y4m_encode_init), (gst_y4m_encode_reset), (gst_y4m_encode_setcaps), (gst_y4m_encode_get_stream_header), (gst_y4m_encode_get_frame_header), (gst_y4m_encode_chain), (gst_y4m_encode_set_property), (gst_y4m_encode_get_property), (gst_y4m_encode_change_state), (plugin_init): * gst/y4m/gsty4mencode.h: Port of y4mencode to 0.10. 2006-04-25 21:56:38 +0000 Stefan Kost [MOVED FROM BAD] Define GstElementDetails as const and also static (when defined as global) Original commit message from CVS: * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/arts/gst_arts.c: * ext/artsd/gstartsdsink.c: * ext/audiofile/gstafparse.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/audioresample/gstaudioresample.c: * ext/bz2/gstbz2dec.c: * ext/bz2/gstbz2enc.c: * ext/cdaudio/gstcdaudio.c: * ext/directfb/dfbvideosink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): * ext/faac/gstfaac.c: (gst_faac_base_init): * ext/faad/gstfaad.c: * ext/gsm/gstgsmdec.c: * ext/gsm/gstgsmenc.c: * ext/hermes/gsthermescolorspace.c: * ext/ivorbis/vorbisfile.c: * ext/lcs/gstcolorspace.c: * ext/libfame/gstlibfame.c: * ext/libmms/gstmms.c: (gst_mms_base_init): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): * ext/nas/nassink.c: (gst_nassink_base_init): * ext/neon/gstneonhttpsrc.c: * ext/sdl/sdlaudiosink.c: * ext/sdl/sdlvideosink.c: * ext/shout/gstshout.c: * ext/snapshot/gstsnapshot.c: * ext/sndfile/gstsf.c: * ext/swfdec/gstswfdec.c: * ext/tarkin/gsttarkindec.c: * ext/tarkin/gsttarkinenc.c: * ext/theora/theoradec.c: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): * gst/chart/gstchart.c: * gst/colorspace/gstcolorspace.c: * gst/deinterlace/gstdeinterlace.c: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): * gst/festival/gstfestival.c: * gst/filter/gstbpwsinc.c: * gst/filter/gstiir.c: * gst/filter/gstlpwsinc.c: * gst/freeze/gstfreeze.c: * gst/games/gstpuzzle.c: (gst_puzzle_base_init): * gst/librfb/gstrfbsrc.c: * gst/mixmatrix/mixmatrix.c: * gst/mpeg1sys/gstmpeg1systemencode.c: * gst/mpeg1videoparse/gstmp1videoparse.c: * gst/mpeg2sub/gstmpeg2subt.c: * gst/mpegaudioparse/gstmpegaudioparse.c: * gst/multifilesink/gstmultifilesink.c: * gst/overlay/gstoverlay.c: * gst/passthrough/gstpassthrough.c: * gst/playondemand/gstplayondemand.c: * gst/qtdemux/qtdemux.c: * gst/rtjpeg/gstrtjpegdec.c: * gst/rtjpeg/gstrtjpegenc.c: * gst/smooth/gstsmooth.c: * gst/smoothwave/gstsmoothwave.c: * gst/spectrum/gstspectrum.c: * gst/speed/gstspeed.c: * gst/stereo/gststereo.c: * gst/switch/gstswitch.c: * gst/tta/gstttadec.c: (gst_tta_dec_base_init): * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): * gst/vbidec/gstvbidec.c: * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/virtualdub/gstxsharpen.c: * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): * gst/y4m/gsty4mencode.c: * sys/cdrom/gstcdplayer.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directsound/gstdirectsoundsink.c: * sys/glsink/glimagesink.c: * sys/qcam/gstqcamsrc.c: * sys/v4l2/gstv4l2src.c: * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init): * sys/ximagesrc/ximagesrc.c: Define GstElementDetails as const and also static (when defined as global) 2006-04-08 21:48:01 +0000 Stefan Kost [MOVED FROM BAD] Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) Original commit message from CVS: * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): * ext/arts/gst_arts.c: (gst_arts_class_init): * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): * ext/audiofile/gstafsink.c: (gst_afsink_class_init): * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): * ext/audioresample/gstaudioresample.c: * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_class_init): * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): * ext/jack/gstjack.c: (gst_jack_class_init): * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): * ext/nas/nassink.c: (gst_nassink_class_init): * ext/shout/gstshout.c: (gst_icecastsend_class_init): * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): * ext/sndfile/gstsf.c: (gst_sf_class_init): * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), (gst_swfdec_class_init): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): * gst/chart/gstchart.c: (gst_chart_class_init): * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): * gst/festival/gstfestival.c: (gst_festival_class_init): * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): * gst/filter/gstiir.c: (gst_iir_class_init): * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): * gst/mpeg1sys/gstmpeg1systemencode.c: (gst_system_encode_class_init): * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_class_init): * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_class_init): * gst/overlay/gstoverlay.c: (gst_overlay_class_init): * gst/passthrough/gstpassthrough.c: (passthrough_class_init): * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): * gst/smooth/gstsmooth.c: (gst_smooth_class_init): * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): * gst/stereo/gststereo.c: (gst_stereo_class_init): * gst/switch/gstswitch.c: (gst_switch_class_init): * gst/tta/gstttadec.c: (gst_tta_dec_class_init): * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): * sys/directsound/gstdirectsoundsink.c: (gst_directsoundsink_class_init): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): * sys/v4l2/gstv4l2colorbalance.c: (gst_v4l2_color_balance_channel_class_init): * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), (gst_v4l2_tuner_norm_class_init): * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) 2006-04-08 19:04:01 +0000 Stefan Kost [MOVED FROM BAD] gst/: Fix more broken GObject macros Original commit message from CVS: * gst/colorspace/gstcolorspace.h: * gst/deinterlace/gstdeinterlace.h: * gst/passthrough/gstpassthrough.h: * gst/y4m/gsty4mencode.h: Fix more broken GObject macros 2006-04-06 11:35:26 +0000 j@bootlab.org [MOVED FROM BAD] Unify the long descriptions in the plugin details (#337263). Original commit message from CVS: Patch by: j^ * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/arts/gst_arts.c: * ext/artsd/gstartsdsink.c: * ext/audiofile/gstafparse.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/cdaudio/gstcdaudio.c: * ext/directfb/dfbvideosink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): * ext/faac/gstfaac.c: (gst_faac_base_init): * ext/faad/gstfaad.c: * ext/gsm/gstgsmdec.c: * ext/gsm/gstgsmenc.c: * ext/hermes/gsthermescolorspace.c: * ext/ivorbis/vorbisfile.c: * ext/lcs/gstcolorspace.c: * ext/libfame/gstlibfame.c: * ext/libmms/gstmms.c: (gst_mms_base_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): * ext/nas/nassink.c: (gst_nassink_base_init): * ext/neon/gstneonhttpsrc.c: * ext/polyp/polypsink.c: (gst_polypsink_base_init): * ext/sdl/sdlaudiosink.c: * ext/sdl/sdlvideosink.c: * ext/shout/gstshout.c: * ext/snapshot/gstsnapshot.c: * ext/sndfile/gstsf.c: * ext/tarkin/gsttarkindec.c: * ext/tarkin/gsttarkinenc.c: * ext/theora/theoradec.c: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): * gst/chart/gstchart.c: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): * gst/festival/gstfestival.c: * gst/filter/gstiir.c: * gst/filter/gstlpwsinc.c: * gst/freeze/gstfreeze.c: * gst/games/gstpuzzle.c: (gst_puzzle_base_init): * gst/mixmatrix/mixmatrix.c: * gst/mpeg1sys/gstmpeg1systemencode.c: * gst/mpeg1videoparse/gstmp1videoparse.c: * gst/mpeg2sub/gstmpeg2subt.c: * gst/mpegaudioparse/gstmpegaudioparse.c: * gst/multifilesink/gstmultifilesink.c: * gst/overlay/gstoverlay.c: * gst/passthrough/gstpassthrough.c: * gst/playondemand/gstplayondemand.c: * gst/qtdemux/qtdemux.c: * gst/rtjpeg/gstrtjpegdec.c: * gst/rtjpeg/gstrtjpegenc.c: * gst/smooth/gstsmooth.c: * gst/tta/gstttadec.c: (gst_tta_dec_base_init): * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/virtualdub/gstxsharpen.c: * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): * gst/y4m/gsty4mencode.c: Unify the long descriptions in the plugin details (#337263). 2006-04-01 10:09:11 +0000 Thomas Vander Stichele * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] rework build; add translations for v4l2 Original commit message from CVS: rework build; add translations for v4l2 2005-09-05 17:20:29 +0000 Jan Schmidt * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] Fix up all the state change functions. Original commit message from CVS: Fix up all the state change functions. 2005-07-05 10:51:49 +0000 Andy Wingo [MOVED FROM BAD] Way, way, way too many files: Remove crack comment from the 2000 era. Original commit message from CVS: 2005-07-05 Andy Wingo * Way, way, way too many files: Remove crack comment from the 2000 era. 2005-01-14 18:36:42 +0000 Stéphane Loeuillet [MOVED FROM BAD] I'm a bad boy. using /1001. to force C to do float division and not integer division (as it did in my last commit) Original commit message from CVS: * ext/dv/gstdvdec.c: * gst/subparse/gstsubparse.c: (parse_mdvdsub): * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): I'm a bad boy. using /1001. to force C to do float division and not integer division (as it did in my last commit) Thanks to David I. Lehn for pointing this mistake. 2005-01-14 12:27:22 +0000 Stéphane Loeuillet [MOVED FROM BAD] replace framerate aproximations by their real value (24000/1001, 30000/1001, 60000/1001) Original commit message from CVS: * ext/dv/gstdvdec.c: * ext/libfame/gstlibfame.c: * gst/subparse/gstsubparse.c: (parse_mdvdsub): * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): replace framerate aproximations by their real value (24000/1001, 30000/1001, 60000/1001) Finish fixing bug #164049 2004-07-27 21:41:30 +0000 Steve Lhomme * gst/y4m/y4menc.vcproj: [MOVED FROM BAD] more working plugins Original commit message from CVS: more working plugins 2004-07-27 09:57:33 +0000 Steve Lhomme * gst/y4m/y4menc.vcproj: [MOVED FROM BAD] rename GStreamer-0.8.lib to libgstreamer.lib Original commit message from CVS: rename GStreamer-0.8.lib to libgstreamer.lib 2004-07-27 09:48:51 +0000 Steve Lhomme * gst/y4m/y4menc.vcproj: [MOVED FROM BAD] avoid problems with math.h, fix release dependancy Original commit message from CVS: avoid problems with math.h, fix release dependancy 2004-07-26 13:20:11 +0000 Steve Lhomme * gst/y4m/y4menc.vcproj: [MOVED FROM BAD] more plugins supported under windows Original commit message from CVS: more plugins supported under windows 2004-04-01 11:48:27 +0000 Jan Schmidt * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] a52dec: Use a debug category, Output timestamps correctly Original commit message from CVS: a52dec: Use a debug category, Output timestamps correctly Emit tag info, Handle events, tell liba52dec about cpu capabilities so it can use MMX etc. dvdec: Fix a crasher accessing invalid memory dvdnavsrc:Some support for byte-format seeking. Small fixes for still frames and menu button overlays mpeg2dec: Use a debug category. Adjust the report level of several items to LOG. Call mpeg2_custom_fbuf to mark our buffers as 'custom buffers' so it doesn't lose the GstBuffer pointer navseek: Add the navseek debug element for seeking back and forth in a video stream using arrow keys. mpeg2subt:Pretty much a complete rewrite. Now a loopbased element. May still require work to properly synchronise subtitle buffers. mpegdemux: dvddemux: Don't attempt to create subbuffers of size 0 Reduce a couple of error outputs to warnings. y4mencode:Output the y4m frame header correctly 2004-03-15 19:32:27 +0000 Thomas Vander Stichele * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] don't mix tabs and spaces Original commit message from CVS: don't mix tabs and spaces 2004-03-15 16:32:54 +0000 Johan Dahlin [MOVED FROM BAD] *.h: Revert indenting Original commit message from CVS: * *.h: Revert indenting 2004-03-14 22:34:33 +0000 Thomas Vander Stichele * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: [MOVED FROM BAD] gst-indent Original commit message from CVS: gst-indent 2004-01-12 02:01:52 +0000 Benjamin Otte [MOVED FROM BAD] gst-libs/gst/video/video.h: Fix caps template names to be understandable. Original commit message from CVS: 2004-01-12 Benjamin Otte * gst-libs/gst/video/video.h: Fix caps template names to be understandable. Prefix everything with GST_VIDEO. * ext/aalib/gstaasink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/hermes/gstcolorspace.c: (gst_colorspace_base_init): * ext/jpeg/gstjpegdec.c: (raw_caps_factory): * ext/jpeg/gstjpegenc.c: (raw_caps_factory): * ext/libcaca/gstcacasink.c: * ext/libpng/gstpngenc.c: (raw_caps_factory): * ext/snapshot/gstsnapshot.c: * ext/swfdec/gstswfdec.c: * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/chart/gstchart.c: * gst/deinterlace/gstdeinterlace.c: * gst/effectv/gsteffectv.c: * gst/flx/gstflxdec.c: (gst_flxdec_loop): * gst/goom/gstgoom.c: * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), (gst_monoscope_srcconnect), (gst_monoscope_chain): * gst/overlay/gstoverlay.c: * gst/smooth/gstsmooth.c: * gst/smpte/gstsmpte.c: * gst/synaesthesia/gstsynaesthesia.c: * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/y4m/gsty4mencode.c: * sys/qcam/gstqcamsrc.c: * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps): Make them work with new video.h file. * sys/ximage/ximagesink.c: (gst_ximagesink_chain), (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): Make it work with new buffer allocation system. 2003-12-22 01:47:09 +0000 David Schleef * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] Merge CAPS branch Original commit message from CVS: Merge CAPS branch 2003-12-04 10:37:38 +0000 Andy Wingo * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] remove copyright field from plugins Original commit message from CVS: remove copyright field from plugins 2003-11-16 22:02:23 +0000 Leif Johnson * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] + checking in plugin category changes Original commit message from CVS: + checking in plugin category changes 2003-11-07 12:47:02 +0000 Ronald S. Bultje * gst/y4m/gsty4mencode.h: [MOVED FROM BAD] Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes fro... Original commit message from CVS: Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes from several source files 2003-11-02 19:17:27 +0000 Benjamin Otte * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] fix to new plugin system Original commit message from CVS: fix to new plugin system 2003-10-08 16:08:19 +0000 Andy Wingo * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. Original commit message from CVS: /GstBuffer/GstData/ in the API where you can pass events. Fix the plugins to deal with that. Fixes #113488. 2003-08-10 00:01:58 +0000 David Schleef * gst/y4m/Makefile.am: [MOVED FROM BAD] Remove redundant plugindir definition Original commit message from CVS: Remove redundant plugindir definition 2003-07-06 20:49:52 +0000 Ronald S. Bultje * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: [MOVED FROM BAD] New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as descri... Original commit message from CVS: New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs 2003-06-29 19:46:13 +0000 Benjamin Otte * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] compatibility fix for new GST_DEBUG stuff. Original commit message from CVS: compatibility fix for new GST_DEBUG stuff. Includes fixes for missing includes for config.h and unistd.h I only ensured for plugins I can build that they work, so if some of them are still broken, you gotta fix them yourselves unfortunately. 2003-01-10 13:38:32 +0000 Thomas Vander Stichele * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] PadConnect -> PadLink Original commit message from CVS: PadConnect -> PadLink 2003-01-10 10:22:25 +0000 Thomas Vander Stichele * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] another batch of connect->link fixes please let me know about issues and please refrain of making them yourself, so t... Original commit message from CVS: another batch of connect->link fixes please let me know about issues and please refrain of making them yourself, so that I don't spend double the time resolving conflicts 2002-12-08 14:50:10 +0000 Thomas Vander Stichele * gst/y4m/Makefile.am: [MOVED FROM BAD] parallel install fixes Original commit message from CVS: parallel install fixes 2002-09-18 19:02:52 +0000 Christian Schaller * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] plugins part of license field patch Original commit message from CVS: plugins part of license field patch 2002-06-17 10:29:30 +0000 Thomas Vander Stichele * gst/y4m/Makefile.am: [MOVED FROM BAD] cosmetic change Original commit message from CVS: cosmetic change 2002-05-03 09:59:10 +0000 Thomas Vander Stichele * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] various name fixes and sundry Original commit message from CVS: various name fixes and sundry 2002-04-20 21:42:51 +0000 Andy Wingo * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] a hack to work around intltool's brokenness a current check for mpeg2dec details->klass reorganizations an element br... Original commit message from CVS: * a hack to work around intltool's brokenness * a current check for mpeg2dec * details->klass reorganizations * an element browser that uses details->klass * separated cdxa parse out from the avi directory 2002-04-11 20:42:26 +0000 Andy Wingo * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE same with *factory and typefind. Original commit message from CVS: GstPadTemplate <-> gst_pad_template <-> GST_PAD_TEMPLATE same with *factory and typefind. also, some -Werror fixes. 2002-03-30 17:06:26 +0000 Wim Taymans * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] Changed to the new props API Original commit message from CVS: Changed to the new props API Other small tuff. 2002-03-20 21:45:04 +0000 Andy Wingo * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: [MOVED FROM BAD] s/Gnome-Streamer/GStreamer/ Original commit message from CVS: s/Gnome-Streamer/GStreamer/ 2002-03-19 04:10:06 +0000 Andy Wingo * gst/y4m/Makefile.am: * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: [MOVED FROM BAD] removal of //-style comments don't link plugins to core libs -- the versioning is done internally to the plugins with... Original commit message from CVS: * removal of //-style comments * don't link plugins to core libs -- the versioning is done internally to the plugins with the plugin_info struct, and symbol resolution is lazy, so we can always know if a plugin can be loaded by the plugin_info data. in theory. 2002-03-19 01:39:43 +0000 Andy Wingo * gst/y4m/Makefile.am: [MOVED FROM BAD] s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ @-substitued variables variables are defined as make variables automagi... Original commit message from CVS: s/@GST_PLUGIN_LDFLAGS@/$(GST_PLUGIN_LDFLAGS)/ @-substitued variables variables are defined as make variables automagically, and this gives the user the freedom to say make GST_PLUGIN_LDFLAGS=-myflag 2002-01-18 11:37:19 +0000 Wrobell * gst/y4m/Makefile.am: [MOVED FROM BAD] - plugins are built without versioning info Original commit message from CVS: - plugins are built without versioning info 2002-01-13 22:27:25 +0000 Wim Taymans * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] Bring the plugins in sync with the new core capsnego system. Original commit message from CVS: Bring the plugins in sync with the new core capsnego system. Added some features, enhancements... 2002-01-12 03:34:27 +0000 David I. Lehn * gst/y4m/Makefile.am: [MOVED FROM BAD] s/filter/plugin/ link plugins to GST_LIBS rearrange rules to a common format Original commit message from CVS: * s/filter/plugin/ * link plugins to GST_LIBS * rearrange rules to a common format 2001-12-23 20:21:20 +0000 Thomas Vander Stichele * gst/y4m/Makefile.am: * gst/y4m/gsty4mencode.c: [MOVED FROM BAD] more fixes Original commit message from CVS: more fixes 2001-12-23 13:17:36 +0000 Thomas Vander Stichele * gst/y4m/Makefile.am: * gst/y4m/gsty4mencode.c: * gst/y4m/gsty4mencode.h: [MOVED FROM BAD] BBB asked me to rename lav to y4m can someone who knows the plugin do this in the source as well ? Original commit message from CVS: BBB asked me to rename lav to y4m can someone who knows the plugin do this in the source as well ? 2009-05-15 18:17:35 +0100 Tim-Philipp Müller * po/Makevars: po: add Makevars magic so we don't get line numbers in *.po files This avoids the number one reason for local modifications in *.po files and and makes things less annoying when working with git (or any other VCS for that matter). 2009-05-15 17:11:27 +0100 Tim-Philipp Müller * tests/check/Makefile.am: * tests/check/audiotestsrc.flac: * tests/check/elements/id3demux.c: * tests/check/elements/souphttpsrc.c: * tests/check/pipelines/flacdec.c: * tests/check/test-cert.pem: * tests/check/test-key.pem: * tests/files/Makefile.am: * tests/files/audiotestsrc.flac: * tests/files/test-cert.pem: * tests/files/test-key.pem: checks: move files required by unit tests into tests/files and make sure they're disted Move unit test data into the directory where it belongs and make in particular the flacdec unit test cd into the directory with the test files instead of making assumptions about the current working directory in that unit test. As a side effect of movng those files, there's only one EXTRA_DIST in tests/check/Makefile.am now, which is likely to work better than having two. Hopefully fixes #582753. 2009-05-14 21:43:14 +0200 Sebastian Dröge * gst/deinterlace/gstdeinterlace.c: deinterlace: If the upstream max latency is unbound return unbound max latency Fixes bug #582661. 2009-05-15 08:44:39 +0200 James Andrewartha * gst/flv/gstflvmux.c: * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiomixertrack.c: * sys/sunaudio/gstsunaudiosrc.c: * sys/v4l2/v4l2_calls.c: Fix compiler warnings Fixes bug #582715. 2009-05-13 22:46:44 +0200 Josep Torra * configure.ac: Recovered debugutils line accidentally removed in deinterlace2 move. 2009-05-13 10:46:40 +0200 Sebastian Dröge * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-deinterlace.xml: * gst/deinterlace/Makefile.am: * gst/deinterlace/gstdeinterlace.c: * gst/deinterlace/gstdeinterlace.h: * gst/deinterlace/tvtime/greedy.c: * gst/deinterlace/tvtime/greedyh.asm: * gst/deinterlace/tvtime/greedyh.c: * gst/deinterlace/tvtime/greedyhmacros.h: * gst/deinterlace/tvtime/linear.c: * gst/deinterlace/tvtime/linearblend.c: * gst/deinterlace/tvtime/mmx.h: * gst/deinterlace/tvtime/plugins.h: * gst/deinterlace/tvtime/scalerbob.c: * gst/deinterlace/tvtime/sse.h: * gst/deinterlace/tvtime/tomsmocomp.c: * gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc: * gst/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc: * gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc: * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc: * gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc: * gst/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h: * gst/deinterlace/tvtime/vfir.c: * gst/deinterlace/tvtime/weave.c: * gst/deinterlace/tvtime/weavebff.c: * gst/deinterlace/tvtime/weavetff.c: * gst/deinterlace/tvtime/x86-64_macros.inc: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/greedyh.c: * gst/deinterlace2/tvtime/greedyhmacros.h: * gst/deinterlace2/tvtime/linear.c: * gst/deinterlace2/tvtime/linearblend.c: * gst/deinterlace2/tvtime/mmx.h: * gst/deinterlace2/tvtime/plugins.h: * gst/deinterlace2/tvtime/scalerbob.c: * gst/deinterlace2/tvtime/sse.h: * gst/deinterlace2/tvtime/tomsmocomp.c: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc: * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: * gst/deinterlace2/tvtime/vfir.c: * gst/deinterlace2/tvtime/weave.c: * gst/deinterlace2/tvtime/weavebff.c: * gst/deinterlace2/tvtime/weavetff.c: * gst/deinterlace2/tvtime/x86-64_macros.inc: Moved 'deinterlace2' from -bad to -good And rename it to deinterlace. 2009-05-08 15:39:24 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: * gst/deinterlace2/gstdeinterlace2.h: [MOVED FROM BAD 56/56] deinterlace2: Add a disabled mode for passthrough operation Also allow to change the mode in PAUSED and PLAYING by updating the caps if necessary. 2009-04-22 19:43:22 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: * gst/deinterlace2/gstdeinterlace2.h: [MOVED FROM BAD 55/56] deinterlace2: Add documentation and integrate into the build system 2009-04-19 17:18:35 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: [MOVED FROM BAD 54/56] deinterlace2: Make it possible to select interlacing autodetection or to enfore deinterlacing For this add a "mode" property that defaults to "interlaced" for now as most decoders/demuxers don't properly set the "interlaced" field on the caps yet. If this property is set to "auto" the element will work in passthrough mode unless the caps contain the "interlaced" field. 2009-04-17 15:39:59 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: [MOVED FROM BAD 53/56] deinterlace2: Use GST_(DEBUG|WARNING|ERROR)_OBJECT instead of the non-OBJECT ones 2009-04-17 15:39:36 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: [MOVED FROM BAD 52/56] deinterlace2: Reset history if DISCONT is set on the incoming buffer 2009-04-17 15:39:10 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: [MOVED FROM BAD 51/56] deinterlace2: Fix timestamps for buffers with RFF flag set 2009-04-16 17:41:37 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: * gst/deinterlace2/tvtime/greedyh.c: * gst/deinterlace2/tvtime/scalerbob.c: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/weave.c: * gst/deinterlace2/tvtime/weavebff.c: * gst/deinterlace2/tvtime/weavetff.c: [MOVED FROM BAD 50/56] deinterlace2: Rename line_length to row_stride and remove output_stride 2009-04-16 15:52:39 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: [MOVED FROM BAD 49/56] deinterlace2: Implement support for RFF and ONEFIELD buffer flags 2009-04-15 15:46:44 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: * gst/deinterlace2/tvtime/greedyh.c: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: [MOVED FROM BAD 48/56] deinterlace2: Move output buffer from the instance struct to a function parameter 2009-04-15 15:33:17 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: * gst/deinterlace2/gstdeinterlace2.h: [MOVED FROM BAD 47/56] deinterlace2: Add initial support for automatic detection of the field order 2009-04-15 14:47:49 +0200 Sebastian Dröge * gst/deinterlace2/gstdeinterlace2.c: [MOVED FROM BAD 46/56] deinterlace2: Add support for YVYU colorspace This is the same as YUY2 with just Cr and Cb swapped. As we don't make a difference between them when deinterlacing this works. 2008-11-06 14:05:55 +0000 Wim Taymans [MOVED FROM BAD 45/56] gst/deinterlace2/gstdeinterlace2.c: Bring properties into this century. Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_class_init), (gst_deinterlace2_init), (gst_deinterlace2_set_property), (gst_deinterlace2_get_property): Bring properties into this century. 2008-11-04 12:42:30 +0000 Stefan Kost [MOVED FROM BAD 44/56] Don't install static libs for plugins. Fixes #550851 for -bad. Original commit message from CVS: * ext/alsaspdif/Makefile.am: * ext/amrwb/Makefile.am: * ext/apexsink/Makefile.am: * ext/arts/Makefile.am: * ext/artsd/Makefile.am: * ext/audiofile/Makefile.am: * ext/audioresample/Makefile.am: * ext/bz2/Makefile.am: * ext/cdaudio/Makefile.am: * ext/celt/Makefile.am: * ext/dc1394/Makefile.am: * ext/dirac/Makefile.am: * ext/directfb/Makefile.am: * ext/divx/Makefile.am: * ext/dts/Makefile.am: * ext/faac/Makefile.am: * ext/faad/Makefile.am: * ext/gsm/Makefile.am: * ext/hermes/Makefile.am: * ext/ivorbis/Makefile.am: * ext/jack/Makefile.am: * ext/jp2k/Makefile.am: * ext/ladspa/Makefile.am: * ext/lcs/Makefile.am: * ext/libfame/Makefile.am: * ext/libmms/Makefile.am: * ext/metadata/Makefile.am: * ext/mpeg2enc/Makefile.am: * ext/mplex/Makefile.am: * ext/musepack/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/mythtv/Makefile.am: * ext/nas/Makefile.am: * ext/neon/Makefile.am: * ext/ofa/Makefile.am: * ext/polyp/Makefile.am: * ext/resindvd/Makefile.am: * ext/sdl/Makefile.am: * ext/shout/Makefile.am: * ext/snapshot/Makefile.am: * ext/sndfile/Makefile.am: * ext/soundtouch/Makefile.am: * ext/spc/Makefile.am: * ext/swfdec/Makefile.am: * ext/tarkin/Makefile.am: * ext/theora/Makefile.am: * ext/timidity/Makefile.am: * ext/twolame/Makefile.am: * ext/x264/Makefile.am: * ext/xine/Makefile.am: * ext/xvid/Makefile.am: * gst-libs/gst/app/Makefile.am: * gst-libs/gst/dshow/Makefile.am: * gst/aiffparse/Makefile.am: * gst/app/Makefile.am: * gst/audiobuffer/Makefile.am: * gst/bayer/Makefile.am: * gst/cdxaparse/Makefile.am: * gst/chart/Makefile.am: * gst/colorspace/Makefile.am: * gst/dccp/Makefile.am: * gst/deinterlace/Makefile.am: * gst/deinterlace2/Makefile.am: * gst/dvdspu/Makefile.am: * gst/festival/Makefile.am: * gst/filter/Makefile.am: * gst/flacparse/Makefile.am: * gst/flv/Makefile.am: * gst/games/Makefile.am: * gst/h264parse/Makefile.am: * gst/librfb/Makefile.am: * gst/mixmatrix/Makefile.am: * gst/modplug/Makefile.am: * gst/mpeg1sys/Makefile.am: * gst/mpeg4videoparse/Makefile.am: * gst/mpegdemux/Makefile.am: * gst/mpegtsmux/Makefile.am: * gst/mpegvideoparse/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/nuvdemux/Makefile.am: * gst/overlay/Makefile.am: * gst/passthrough/Makefile.am: * gst/pcapparse/Makefile.am: * gst/playondemand/Makefile.am: * gst/rawparse/Makefile.am: * gst/real/Makefile.am: * gst/rtjpeg/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/scaletempo/Makefile.am: * gst/sdp/Makefile.am: * gst/selector/Makefile.am: * gst/smooth/Makefile.am: * gst/smoothwave/Makefile.am: * gst/speed/Makefile.am: * gst/speexresample/Makefile.am: * gst/stereo/Makefile.am: * gst/subenc/Makefile.am: * gst/tta/Makefile.am: * gst/vbidec/Makefile.am: * gst/videodrop/Makefile.am: * gst/videosignal/Makefile.am: * gst/virtualdub/Makefile.am: * gst/vmnc/Makefile.am: * gst/y4m/Makefile.am: * sys/acmenc/Makefile.am: * sys/cdrom/Makefile.am: * sys/dshowdecwrapper/Makefile.am: * sys/dshowsrcwrapper/Makefile.am: * sys/dvb/Makefile.am: * sys/dxr3/Makefile.am: * sys/fbdev/Makefile.am: * sys/oss4/Makefile.am: * sys/qcam/Makefile.am: * sys/qtwrapper/Makefile.am: * sys/vcd/Makefile.am: * sys/wininet/Makefile.am: * win32/common/config.h: Don't install static libs for plugins. Fixes #550851 for -bad. 2008-10-09 19:38:52 +0000 Sebastian Dröge [MOVED FROM BAD 43/56] gst/deinterlace2/tvtime/tomsmocomp.c: Fix unused variable compiler warning when not building Original commit message from CVS: * gst/deinterlace2/tvtime/tomsmocomp.c: (gst_deinterlace_method_tomsmocomp_class_init): Fix unused variable compiler warning when not building X86 assembly. 2008-08-28 17:16:51 +0000 Jan Schmidt [MOVED FROM BAD 42/56] gst/dccp/: Fix compilation on Solaris by including filio.h as needed. Original commit message from CVS: * gst/dccp/gstdccp.c: * gst/dccp/gstdccpclientsrc.c: Fix compilation on Solaris by including filio.h as needed. * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: Fix compilation with Forte - apparently it hates concatenating a macro argument that starts with an underscore?? 2008-08-26 12:33:16 +0000 Sebastian Dröge [MOVED FROM BAD 41/56] gst/deinterlace2/tvtime/tomsmocomp/: Unroll the loop to handle two bytes at once. This should give a small speedup an... Original commit message from CVS: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: Unroll the loop to handle two bytes at once. This should give a small speedup and makes it possible to handle chroma and luma different which is needed later. 2008-08-25 14:37:45 +0000 Sebastian Dröge [MOVED FROM BAD 40/56] gst/deinterlace2/: First part of the C implementation of the tomsmocomp deinterlacing algorithm. This only supports s... Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_method_class_init): * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/tomsmocomp.c: (gst_deinterlace_method_tomsmocomp_class_init): * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: First part of the C implementation of the tomsmocomp deinterlacing algorithm. This only supports search-effort=0 currently, is painfully slow and needs some cleanup later when all search-effort settings are implemented in C. 2008-08-02 18:48:17 +0000 Sebastian Dröge [MOVED FROM BAD 39/56] gst/deinterlace2/: Use oil_memcpy() instead of memcpy() as it's faster for the sizes that are usually used here. Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_simple_method_interpolate_scanline), (gst_deinterlace_simple_method_copy_scanline), (gst_deinterlace_simple_method_deinterlace_frame): * gst/deinterlace2/tvtime/greedy.c: (deinterlace_frame_di_greedy): * gst/deinterlace2/tvtime/greedyh.c: (deinterlace_frame_di_greedyh): * gst/deinterlace2/tvtime/scalerbob.c: (deinterlace_scanline_scaler_bob): * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy): * gst/deinterlace2/tvtime/weave.c: (deinterlace_scanline_weave), (copy_scanline): * gst/deinterlace2/tvtime/weavebff.c: (deinterlace_scanline_weave), (copy_scanline): * gst/deinterlace2/tvtime/weavetff.c: (deinterlace_scanline_weave), (copy_scanline): Use oil_memcpy() instead of memcpy() as it's faster for the sizes that are usually used here. 2008-08-02 18:36:11 +0000 Sebastian Dröge [MOVED FROM BAD 38/56] gst/deinterlace2/: Add the remaining tvtime deinterlacing methods and fix the deinterlace_frame() implementation of G... Original commit message from CVS: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_simple_method_deinterlace_frame), (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method): * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/linear.c: (deinterlace_scanline_linear_c), (deinterlace_scanline_linear_mmx), (deinterlace_scanline_linear_mmxext), (gst_deinterlace_method_linear_class_init), (gst_deinterlace_method_linear_init): * gst/deinterlace2/tvtime/linearblend.c: (deinterlace_scanline_linear_blend_c), (deinterlace_scanline_linear_blend2_c), (deinterlace_scanline_linear_blend_mmx), (deinterlace_scanline_linear_blend2_mmx), (gst_deinterlace_method_linear_blend_class_init), (gst_deinterlace_method_linear_blend_init): * gst/deinterlace2/tvtime/plugins.h: * gst/deinterlace2/tvtime/scalerbob.c: (deinterlace_scanline_scaler_bob), (gst_deinterlace_method_scaler_bob_class_init), (gst_deinterlace_method_scaler_bob_init): * gst/deinterlace2/tvtime/weave.c: (deinterlace_scanline_weave), (copy_scanline), (gst_deinterlace_method_weave_class_init), (gst_deinterlace_method_weave_init): * gst/deinterlace2/tvtime/weavebff.c: (deinterlace_scanline_weave), (copy_scanline), (gst_deinterlace_method_weave_bff_class_init), (gst_deinterlace_method_weave_bff_init): * gst/deinterlace2/tvtime/weavetff.c: (deinterlace_scanline_weave), (copy_scanline), (gst_deinterlace_method_weave_tff_class_init), (gst_deinterlace_method_weave_tff_init): Add the remaining tvtime deinterlacing methods and fix the deinterlace_frame() implementation of GstDeinterlaceSimpleMethod. 2008-08-02 18:30:56 +0000 Sebastian Dröge [MOVED FROM BAD 37/56] gst/deinterlace2/tvtime/vfir.c: Implement the VFIR deinterlacing method as simple method. Original commit message from CVS: * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), (deinterlace_line_mmx), (gst_deinterlace_method_vfir_class_init): Implement the VFIR deinterlacing method as simple method. 2008-08-02 18:18:54 +0000 Sebastian Dröge [MOVED FROM BAD 36/56] gst/deinterlace2/gstdeinterlace2.*: Add a GstDeinterlaceSimpleMethod subclass of GstDeinterlaceMethod that can be use... Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_simple_method_interpolate_scanline), (gst_deinterlace_simple_method_copy_scanline), (gst_deinterlace_simple_method_deinterlace_frame), (gst_deinterlace_simple_method_class_init), (gst_deinterlace_simple_method_init): * gst/deinterlace2/gstdeinterlace2.h: Add a GstDeinterlaceSimpleMethod subclass of GstDeinterlaceMethod that can be used by simple deinterlacing methods. They only have to provide a function for interpolating a scanline or copying a scanline. 2008-08-02 18:15:49 +0000 Sebastian Dröge [MOVED FROM BAD 35/56] gst/deinterlace2/gstdeinterlace2.c: Respect the latency of the deinterlacing algorithm for the timestamps of every bu... Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_chain): Respect the latency of the deinterlacing algorithm for the timestamps of every buffer. 2008-08-02 18:13:20 +0000 Sebastian Dröge [MOVED FROM BAD 34/56] gst/deinterlace2/tvtime/: Add the MMX registers to the clobbered registers only if __MMX__ is defined. Original commit message from CVS: * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: Add the MMX registers to the clobbered registers only if __MMX__ is defined. 2008-08-02 18:09:56 +0000 Sebastian Dröge [MOVED FROM BAD 33/56] gst/deinterlace2/: Enable tomsmocomp again as the C port will be ready for the next release. Original commit message from CVS: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method), (gst_deinterlace2_class_init): Enable tomsmocomp again as the C port will be ready for the next release. 2008-08-02 18:02:44 +0000 Sebastian Dröge [MOVED FROM BAD 32/56] gst/deinterlace2/gstdeinterlace2.c: Don't use proxy_getcaps() but implement our own getcaps() function that doubles/h... Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_init), (gst_greatest_common_divisor), (gst_fraction_double), (gst_deinterlace2_getcaps), (gst_deinterlace2_setcaps): Don't use proxy_getcaps() but implement our own getcaps() function that doubles/halfs the framerate if all fields should be sent out. 2008-07-18 08:34:06 +0000 Sebastian Dröge [MOVED FROM BAD 31/56] Disable the tomsmocomp algorithm for this release as it's buggy and has no C implementation yet. Original commit message from CVS: * configure.ac: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), (gst_deinterlace2_init): * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: (gst_deinterlace_method_greedy_l_class_init): * gst/deinterlace2/tvtime/greedyh.c: (gst_deinterlace_method_greedy_h_class_init): * gst/deinterlace2/tvtime/vfir.c: (gst_deinterlace_method_vfir_class_init): Disable the tomsmocomp algorithm for this release as it's buggy and has no C implementation yet. Build the deinterlace2 plugin on all architectures but still mark it as experimental. Build the x86 inline assembly only if GCC inline assembly is supported and only on x86 or amd64. Fixes bug #543286. 2008-07-14 14:13:54 +0000 Edward Hervey [MOVED FROM BAD 30/56] gst/deinterlace2/tvtime/: Fix build on x86_64 Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (gst_deinterlace_method_greedy_l_class_init): * gst/deinterlace2/tvtime/greedyh.c: (gst_deinterlace_method_greedy_h_class_init): * gst/deinterlace2/tvtime/vfir.c: (gst_deinterlace_method_vfir_class_init): Fix build on x86_64 2008-07-13 10:56:45 +0000 Sebastian Dröge [MOVED FROM BAD 29/56] gst/deinterlace2/tvtime/greedyh.asm: Always use the C implementation if width is not a multiple of 4. The assembly op... Original commit message from CVS: * gst/deinterlace2/tvtime/greedyh.asm: Always use the C implementation if width is not a multiple of 4. The assembly optimized version only handle this and calling the C implementation for the remaining part doesn't work because it needs previous calculations. 2008-07-13 10:52:03 +0000 Sebastian Dröge [MOVED FROM BAD 28/56] gst/deinterlace2/tvtime/: Some cleanup, use 3DNOW instead of TDNOW in macros. Original commit message from CVS: * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/greedyh.c: * gst/deinterlace2/tvtime/greedyhmacros.h: Some cleanup, use 3DNOW instead of TDNOW in macros. * gst/deinterlace2/tvtime/tomsmocomp.c: (gst_deinterlace_method_tomsmocomp_class_init): * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: The SSE method in fact only needs MMXEXT, declare it as such. 2008-07-08 13:31:37 +0000 Sebastian Dröge [MOVED FROM BAD 27/56] Don't use declarations after statements in the remaining code. Original commit message from CVS: * ext/spc/gstspc.c: (spc_setup): * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: Don't use declarations after statements in the remaining code. 2008-07-06 20:43:58 +0000 Sebastian Dröge [MOVED FROM BAD 26/56] gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: Mark internal processing functions as static inline for quite ... Original commit message from CVS: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: Mark internal processing functions as static inline for quite some speedup as they're used only once and need to get many local variables passed as parameter. 2008-07-05 19:20:30 +0000 Sebastian Dröge [MOVED FROM BAD 25/56] gst/deinterlace2/gstdeinterlace2.*: Call the current instance "self" instead of "object". Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_method_deinterlace_frame), (gst_deinterlace2_set_method), (gst_deinterlace2_init), (gst_deinterlace2_reset_history), (gst_deinterlace2_reset), (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), (gst_deinterlace2_pop_history), (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), (gst_deinterlace2_chain), (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), (gst_deinterlace2_src_query): * gst/deinterlace2/gstdeinterlace2.h: Call the current instance "self" instead of "object". 2008-07-05 19:11:56 +0000 Sebastian Dröge [MOVED FROM BAD 24/56] gst/deinterlace2/gstdeinterlace2.*: Include latency of the method in the returned latency. Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_method_get_latency), (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), (gst_deinterlace2_push_history), (gst_deinterlace2_chain), (gst_deinterlace2_setcaps), (gst_deinterlace2_src_query): * gst/deinterlace2/gstdeinterlace2.h: Include latency of the method in the returned latency. Fix outputting of all fields, i.e. doubling of the framerate. 2008-07-05 16:47:32 +0000 Sebastian Dröge [MOVED FROM BAD 23/56] gst/deinterlace2/: Use a GstObject subtype for the deinterlacing methods and export the different settings for each d... Original commit message from CVS: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace_method_class_init), (gst_deinterlace_method_init), (gst_deinterlace_method_deinterlace_frame), (gst_deinterlace_method_get_fields_required), (gst_deinterlace2_methods_get_type), (_do_init), (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), (gst_deinterlace2_child_proxy_get_child_by_index), (gst_deinterlace2_child_proxy_get_children_count), (gst_deinterlace2_child_proxy_interface_init), (gst_deinterlace2_init), (gst_deinterlace2_finalize), (gst_deinterlace2_chain), (gst_deinterlace2_src_query): * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_c), (deinterlace_greedy_packed422_scanline_mmx), (deinterlace_greedy_packed422_scanline_mmxext), (deinterlace_frame_di_greedy), (gst_deinterlace_method_greedy_l_set_property), (gst_deinterlace_method_greedy_l_get_property), (gst_deinterlace_method_greedy_l_class_init), (gst_deinterlace_method_greedy_l_init): * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C), (deinterlace_frame_di_greedyh), (gst_deinterlace_method_greedy_h_set_property), (gst_deinterlace_method_greedy_h_get_property), (gst_deinterlace_method_greedy_h_class_init), (gst_deinterlace_method_greedy_h_init): * gst/deinterlace2/tvtime/greedyh.h: * gst/deinterlace2/tvtime/plugins.h: * gst/deinterlace2/tvtime/tomsmocomp.c: (gst_deinterlace_method_tomsmocomp_set_property), (gst_deinterlace_method_tomsmocomp_get_property), (gst_deinterlace_method_tomsmocomp_class_init), (gst_deinterlace_method_tomsmocomp_init): * gst/deinterlace2/tvtime/tomsmocomp.h: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir), (gst_deinterlace_method_vfir_class_init), (gst_deinterlace_method_vfir_init): Use a GstObject subtype for the deinterlacing methods and export the different settings for each deinterlacing method via GObject properties. Implement GstChildProxy interface to allow access to the used deinterlacing method and to allow adjusting the different settings. Move global variables of the tomsmocomp deinterlacing method into function local variables to make it possible to use this deinterlacing method from different instances. 2008-07-05 12:22:37 +0000 Sebastian Dröge [MOVED FROM BAD 22/56] gst/deinterlace2/tvtime/greedyh.asm: Support widths that are not a multiply of 4 when using the assembly optimized gr... Original commit message from CVS: * gst/deinterlace2/tvtime/greedyh.asm: Support widths that are not a multiply of 4 when using the assembly optimized greedyh implementations. 2008-07-04 18:54:15 +0000 Sebastian Dröge [MOVED FROM BAD 21/56] gst/deinterlace2/tvtime/greedyh.c: Only build the assembly optimized implementations on x86. Original commit message from CVS: * gst/deinterlace2/tvtime/greedyh.c: (deinterlace_frame_di_greedyh): Only build the assembly optimized implementations on x86. 2008-06-30 07:51:07 +0000 Sebastian Dröge [MOVED FROM BAD 20/56] gst/deinterlace2/: Remove useless file and mark everything possible as static. Original commit message from CVS: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/tvtime/tomsmocomp.c: (tomsmocomp_init), (tomsmocomp_filter_mmx), (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse), (deinterlace_frame_di_tomsmocomp): * gst/deinterlace2/tvtime/tomsmocomp.h: Remove useless file and mark everything possible as static. * gst/deinterlace2/tvtime/greedy.c: * gst/deinterlace2/tvtime/greedyh.c: Use "_stdint.h" instead of . 2008-06-29 10:56:47 +0000 Sebastian Dröge [MOVED FROM BAD 19/56] gst/deinterlace2/: Get rid of speedy.[ch] as we don't use most of it's code anyway and it doesn't seem to be relicens... Original commit message from CVS: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_init): * gst/deinterlace2/tvtime/greedy.c: (deinterlace_frame_di_greedy): * gst/deinterlace2/tvtime/greedyh.c: (deinterlace_frame_di_greedyh): * gst/deinterlace2/tvtime/speedtools.h: * gst/deinterlace2/tvtime/speedy.c: * gst/deinterlace2/tvtime/speedy.h: * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy): * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir): Get rid of speedy.[ch] as we don't use most of it's code anyway and it doesn't seem to be relicensed to LGPL. Use memcpy() instead of the speedy memcpy everywhere instead. * gst/deinterlace2/gstdeinterlace2.h: Remove many unused declarations. 2008-06-28 18:13:08 +0000 Sebastian Dröge [MOVED FROM BAD 18/56] gst/deinterlace2/gstdeinterlace2.c: Divide latency be 2 to convert from fields to frames. Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_src_query): Divide latency be 2 to convert from fields to frames. 2008-06-28 18:10:52 +0000 Sebastian Dröge [MOVED FROM BAD 17/56] gst/deinterlace2/tvtime/greedy.c: Don't use scanlines function from gstdeinterlace2 as it's not appropiate for this m... Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_c), (deinterlace_greedy_packed422_scanline_mmx), (deinterlace_greedy_packed422_scanline_mmxext), (deinterlace_frame_di_greedy): Don't use scanlines function from gstdeinterlace2 as it's not appropiate for this method. Instead implement deinterlace_frame function by taking the one from greedyh. * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C): Small fix for the C implementation. * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir): Don't use the scanlines function from gstdeinterlace2 as it's only used for this method and will be removed. Instead implement deinterlace_frame function and make it a bit more efficient. * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_class_init), (gst_deinterlace2_set_method), (gst_deinterlace2_push_history), (gst_deinterlace2_chain), (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), (gst_deinterlace2_src_query): Fix coding style and remove scanlines function as it's unused now. 2008-06-28 17:25:56 +0000 Sebastian Dröge [MOVED FROM BAD 16/56] gst/deinterlace2/tvtime/: Add a C implementation for the greedyh deinterlacing method, clean up the code a bit and ma... Original commit message from CVS: * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C), (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method): * gst/deinterlace2/tvtime/greedyhmacros.h: Add a C implementation for the greedyh deinterlacing method, clean up the code a bit and mark the SSE version as MMXEXT as it doesn't require any SSE instructions. 2008-06-27 13:22:34 +0000 Sebastian Dröge [MOVED FROM BAD 15/56] gst/deinterlace2/gstdeinterlace2.c: If we're outputting all fields the framerate has to be doubled. Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_set_property), (gst_deinterlace2_chain), (gst_deinterlace2_setcaps): If we're outputting all fields the framerate has to be doubled. Set duration on the outgoing buffers. 2008-06-25 16:05:08 +0000 Edward Hervey [MOVED FROM BAD 14/56] gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Remove unneeded macros that break build on macosx. Original commit message from CVS: * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Remove unneeded macros that break build on macosx. 2008-06-24 12:08:47 +0000 Sebastian Dröge [MOVED FROM BAD 13/56] gst/deinterlace2/tvtime/greedy.c: Optimize MMX/MMXEXT implementations a bit by requiring two less memory accesses and... Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_mmx), (deinterlace_greedy_packed422_scanline_mmxext): Optimize MMX/MMXEXT implementations a bit by requiring two less memory accesses and fix the workaround for the missing right shift on bytes to unset the highest bit of every byte. 2008-06-24 10:15:41 +0000 Sebastian Dröge [MOVED FROM BAD 12/56] gst/deinterlace2/tvtime/greedy.c: Remove sfence instruction as it's not needed and actually is an SSE instruction. Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_mmxext): Remove sfence instruction as it's not needed and actually is an SSE instruction. 2008-06-24 10:12:08 +0000 Sebastian Dröge [MOVED FROM BAD 11/56] gst/deinterlace2/tvtime/greedy.c: Add plain MMX implementation for the greedyl method. Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_mmx), (deinterlace_greedy_packed422_scanline): Add plain MMX implementation for the greedyl method. 2008-06-24 09:40:03 +0000 Sebastian Dröge [MOVED FROM BAD 10/56] gst/deinterlace2/Makefile.am: Move the assembly includes to noinst_HEADERS where they belong. Original commit message from CVS: * gst/deinterlace2/Makefile.am: Move the assembly includes to noinst_HEADERS where they belong. * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), (deinterlace_line_mmx): Fix C and MMX implementations a bit more. 2008-06-24 09:10:46 +0000 Sebastian Dröge [MOVED FROM BAD 09/56] gst/deinterlace2/tvtime/greedy.c: Fix the C implementation to produce correct results and optimize the Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_c), (deinterlace_greedy_packed422_scanline_mmxext), (deinterlace_greedy_packed422_scanline): Fix the C implementation to produce correct results and optimize the MMXEXT implementation. Handle odd widths and don't read over array boundaries in the MMXEXT implementation. * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), (deinterlace_line_mmx), (deinterlace_scanline_vfir): Fix a small rounding bug in the MMX implementation, the MMX implementation doesn't actually need MMXEXT instructions so don't mark it as such. Handle odd widths in both implementations. 2008-06-21 09:05:00 +0000 Sebastian Dröge [MOVED FROM BAD 08/56] gst/deinterlace2/tvtime/greedy.c: Implement a C version of the greedy low motion algorithm and mark the assembly opti... Original commit message from CVS: * gst/deinterlace2/tvtime/greedy.c: (deinterlace_greedy_packed422_scanline_sse), (deinterlace_greedy_packed422_scanline_c), (deinterlace_greedy_packed422_scanline): Implement a C version of the greedy low motion algorithm and mark the assembly optimized version as SSE as it uses SSE instructions additional to MMX instructions. 2008-06-20 14:48:40 +0000 Sebastian Dröge [MOVED FROM BAD 07/56] gst/deinterlace2/tvtime/vfir.c: Make it possible to use the vfir method on X86 CPUs without MMXEXT too but use the MM... Original commit message from CVS: * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_mmxext), (deinterlace_line_c), (deinterlace_scanline_vfir): Make it possible to use the vfir method on X86 CPUs without MMXEXT too but use the MMXEXT optimized code whenever possible. 2008-06-20 14:35:25 +0000 Sebastian Dröge [MOVED FROM BAD 06/56] gst/deinterlace2/gstdeinterlace2.*: Reset element state on PAUSED->READY properly, don't leak any buffers when finali... Original commit message from CVS: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_class_init), (gst_deinterlace2_init), (gst_deinterlace2_reset_history), (gst_deinterlace2_reset), (gst_deinterlace2_finalize), (gst_deinterlace2_chain), (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), (gst_deinterlace2_src_query): * gst/deinterlace2/gstdeinterlace2.h: Reset element state on PAUSED->READY properly, don't leak any buffers when finalizing, allocate buffers with gst_pad_alloc_buffer() and properly return flow returns from gst_pad_push() instead of ignoring them. 2008-06-20 13:45:08 +0000 Sebastian Dröge [MOVED FROM BAD 05/56] gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Add missing header. Original commit message from CVS: * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Add missing header. 2008-06-20 13:24:29 +0000 Sebastian Dröge [MOVED FROM BAD 04/56] Fix compilation on generic x86/amd64 and include deinterlace2 in the build system. Because of several bugs it's still... Original commit message from CVS: * configure.ac: * gst/deinterlace2/Makefile.am: * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: Fix compilation on generic x86/amd64 and include deinterlace2 in the build system. Because of several bugs it's still enabled only by --enable-experimental. 2008-06-18 06:31:13 +0000 Stefan Kost [MOVED FROM BAD 03/56] Fix gtk-doc warnings. Also don't misuse api-doc comments for normal comments. Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * examples/app/appsrc-ra.c: * examples/app/appsrc-seekable.c: * examples/app/appsrc-stream.c: * examples/app/appsrc-stream2.c: * ext/directfb/dfbvideosink.h: * ext/metadata/gstbasemetadata.c: * ext/metadata/gstbasemetadata.h: * ext/metadata/metadata.c: * ext/metadata/metadataexif.c: * ext/theora/theoradec.h: * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/speedy.c: * gst/deinterlace2/tvtime/speedy.h: * gst/deinterlace2/tvtime/vfir.c: Fix gtk-doc warnings. Also don't misuse api-doc comments for normal comments. 2008-06-11 11:12:49 +0000 Martin Eikermann [MOVED FROM BAD 02/56] gst/deinterlace2/: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL f... Original commit message from CVS: Based on a patch by: Martin Eikermann * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_method_get_type), (gst_deinterlace2_fields_get_type), (gst_deinterlace2_field_layout_get_type), (gst_deinterlace2_base_init), (gst_deinterlace2_class_init), (gst_deinterlace2_init), (gst_deinterlace2_set_method), (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), (gst_deinterlace2_finalize), (gst_deinterlace2_pop_history), (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), (gst_deinterlace2_deinterlace_scanlines), (gst_deinterlace2_chain), (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), (gst_deinterlace2_src_query), (gst_deinterlace2_src_query_types), (plugin_init): * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: (copy_scanline), (deinterlace_greedy_packed422_scanline_mmxext), (dscaler_greedyl_get_method): * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/greedyh.c: (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method), (greedyh_init), (greedyh_filter_mmx), (greedyh_filter_3dnow), (greedyh_filter_sse): * gst/deinterlace2/tvtime/greedyh.h: * gst/deinterlace2/tvtime/greedyhmacros.h: * gst/deinterlace2/tvtime/mmx.h: * gst/deinterlace2/tvtime/plugins.h: * gst/deinterlace2/tvtime/speedtools.h: * gst/deinterlace2/tvtime/speedy.c: (multiply_alpha), (clip255), (comb_factor_packed422_scanline_mmx), (diff_factor_packed422_scanline_c), (diff_factor_packed422_scanline_mmx), (diff_packed422_block8x8_mmx), (diff_packed422_block8x8_c), (packed444_to_packed422_scanline_c), (packed422_to_packed444_scanline_c), (packed422_to_packed444_rec601_scanline_c), (vfilter_chroma_121_packed422_scanline_mmx), (vfilter_chroma_121_packed422_scanline_c), (vfilter_chroma_332_packed422_scanline_mmx), (vfilter_chroma_332_packed422_scanline_c), (kill_chroma_packed422_inplace_scanline_mmx), (kill_chroma_packed422_inplace_scanline_c), (invert_colour_packed422_inplace_scanline_mmx), (invert_colour_packed422_inplace_scanline_c), (mirror_packed422_inplace_scanline_c), (interpolate_packed422_scanline_c), (convert_uyvy_to_yuyv_scanline_mmx), (convert_uyvy_to_yuyv_scanline_c), (interpolate_packed422_scanline_mmx), (interpolate_packed422_scanline_mmxext), (blit_colour_packed422_scanline_c), (blit_colour_packed422_scanline_mmx), (blit_colour_packed422_scanline_mmxext), (blit_colour_packed4444_scanline_c), (blit_colour_packed4444_scanline_mmx), (blit_colour_packed4444_scanline_mmxext), (small_memcpy), (speedy_memcpy_c), (speedy_memcpy_mmx), (speedy_memcpy_mmxext), (blit_packed422_scanline_c), (blit_packed422_scanline_mmx), (blit_packed422_scanline_mmxext), (composite_colour4444_alpha_to_packed422_scanline_c), (composite_colour4444_alpha_to_packed422_scanline_mmxext), (composite_packed4444_alpha_to_packed422_scanline_c), (composite_packed4444_alpha_to_packed422_scanline_mmxext), (composite_packed4444_to_packed422_scanline_c), (composite_packed4444_to_packed422_scanline_mmxext), (composite_alphamask_to_packed4444_scanline_c), (composite_alphamask_to_packed4444_scanline_mmxext), (composite_alphamask_alpha_to_packed4444_scanline_c), (premultiply_packed4444_scanline_c), (premultiply_packed4444_scanline_mmxext), (blend_packed422_scanline_c), (blend_packed422_scanline_mmxext), (quarter_blit_vertical_packed422_scanline_mmxext), (quarter_blit_vertical_packed422_scanline_c), (subpix_blit_vertical_packed422_scanline_c), (a8_subpix_blit_scanline_c), (myround), (init_RGB_to_YCbCr_tables), (init_YCbCr_to_RGB_tables), (rgb24_to_packed444_rec601_scanline_c), (rgba32_to_packed4444_rec601_scanline_c), (packed444_to_rgb24_rec601_scanline_c), (packed444_to_nonpremultiplied_packed4444_scanline_c), (aspect_adjust_packed4444_scanline_c), (setup_speedy_calls), (speedy_get_accel): * gst/deinterlace2/tvtime/speedy.h: * gst/deinterlace2/tvtime/sse.h: * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy), (deinterlace_frame_di_tomsmocomp), (dscaler_tomsmocomp_get_method), (tomsmocomp_init), (tomsmocomp_filter_mmx), (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse): * gst/deinterlace2/tvtime/tomsmocomp.h: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc: * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line), (deinterlace_scanline_vfir), (copy_scanline), (dscaler_vfir_get_method): * gst/deinterlace2/tvtime/x86-64_macros.inc: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL for GStreamer and in theory provides better and faster results than the simple deinterlace element. Fixes bug #163578. Ported to GStreamer 0.10 but still not enabled or included in the build system by default because of bad artefacts caused by a bug somewhere and as it can be only build on x86/amd64 ATM and requires special CFLAGS. Will be fixed soon. 2008-06-11 11:12:14 +0000 Martin Eikermann [MOVED FROM BAD 01/56] gst/deinterlace2/: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL f... Original commit message from CVS: Based on a patch by: Martin Eikermann * gst/deinterlace2/Makefile.am: * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_method_get_type), (gst_deinterlace2_fields_get_type), (gst_deinterlace2_field_layout_get_type), (gst_deinterlace2_base_init), (gst_deinterlace2_class_init), (gst_deinterlace2_init), (gst_deinterlace2_set_method), (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), (gst_deinterlace2_finalize), (gst_deinterlace2_pop_history), (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), (gst_deinterlace2_deinterlace_scanlines), (gst_deinterlace2_chain), (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), (gst_deinterlace2_src_query), (gst_deinterlace2_src_query_types), (plugin_init): * gst/deinterlace2/gstdeinterlace2.h: * gst/deinterlace2/tvtime/greedy.c: (copy_scanline), (deinterlace_greedy_packed422_scanline_mmxext), (dscaler_greedyl_get_method): * gst/deinterlace2/tvtime/greedyh.asm: * gst/deinterlace2/tvtime/greedyh.c: (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method), (greedyh_init), (greedyh_filter_mmx), (greedyh_filter_3dnow), (greedyh_filter_sse): * gst/deinterlace2/tvtime/greedyh.h: * gst/deinterlace2/tvtime/greedyhmacros.h: * gst/deinterlace2/tvtime/mmx.h: * gst/deinterlace2/tvtime/plugins.h: * gst/deinterlace2/tvtime/speedtools.h: * gst/deinterlace2/tvtime/speedy.c: (multiply_alpha), (clip255), (comb_factor_packed422_scanline_mmx), (diff_factor_packed422_scanline_c), (diff_factor_packed422_scanline_mmx), (diff_packed422_block8x8_mmx), (diff_packed422_block8x8_c), (packed444_to_packed422_scanline_c), (packed422_to_packed444_scanline_c), (packed422_to_packed444_rec601_scanline_c), (vfilter_chroma_121_packed422_scanline_mmx), (vfilter_chroma_121_packed422_scanline_c), (vfilter_chroma_332_packed422_scanline_mmx), (vfilter_chroma_332_packed422_scanline_c), (kill_chroma_packed422_inplace_scanline_mmx), (kill_chroma_packed422_inplace_scanline_c), (invert_colour_packed422_inplace_scanline_mmx), (invert_colour_packed422_inplace_scanline_c), (mirror_packed422_inplace_scanline_c), (interpolate_packed422_scanline_c), (convert_uyvy_to_yuyv_scanline_mmx), (convert_uyvy_to_yuyv_scanline_c), (interpolate_packed422_scanline_mmx), (interpolate_packed422_scanline_mmxext), (blit_colour_packed422_scanline_c), (blit_colour_packed422_scanline_mmx), (blit_colour_packed422_scanline_mmxext), (blit_colour_packed4444_scanline_c), (blit_colour_packed4444_scanline_mmx), (blit_colour_packed4444_scanline_mmxext), (small_memcpy), (speedy_memcpy_c), (speedy_memcpy_mmx), (speedy_memcpy_mmxext), (blit_packed422_scanline_c), (blit_packed422_scanline_mmx), (blit_packed422_scanline_mmxext), (composite_colour4444_alpha_to_packed422_scanline_c), (composite_colour4444_alpha_to_packed422_scanline_mmxext), (composite_packed4444_alpha_to_packed422_scanline_c), (composite_packed4444_alpha_to_packed422_scanline_mmxext), (composite_packed4444_to_packed422_scanline_c), (composite_packed4444_to_packed422_scanline_mmxext), (composite_alphamask_to_packed4444_scanline_c), (composite_alphamask_to_packed4444_scanline_mmxext), (composite_alphamask_alpha_to_packed4444_scanline_c), (premultiply_packed4444_scanline_c), (premultiply_packed4444_scanline_mmxext), (blend_packed422_scanline_c), (blend_packed422_scanline_mmxext), (quarter_blit_vertical_packed422_scanline_mmxext), (quarter_blit_vertical_packed422_scanline_c), (subpix_blit_vertical_packed422_scanline_c), (a8_subpix_blit_scanline_c), (myround), (init_RGB_to_YCbCr_tables), (init_YCbCr_to_RGB_tables), (rgb24_to_packed444_rec601_scanline_c), (rgba32_to_packed4444_rec601_scanline_c), (packed444_to_rgb24_rec601_scanline_c), (packed444_to_nonpremultiplied_packed4444_scanline_c), (aspect_adjust_packed4444_scanline_c), (setup_speedy_calls), (speedy_get_accel): * gst/deinterlace2/tvtime/speedy.h: * gst/deinterlace2/tvtime/sse.h: * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy), (deinterlace_frame_di_tomsmocomp), (dscaler_tomsmocomp_get_method), (tomsmocomp_init), (tomsmocomp_filter_mmx), (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse): * gst/deinterlace2/tvtime/tomsmocomp.h: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc: * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc: * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line), (deinterlace_scanline_vfir), (copy_scanline), (dscaler_vfir_get_method): * gst/deinterlace2/tvtime/x86-64_macros.inc: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL for GStreamer and in theory provides better and faster results than the simple deinterlace element. Fixes bug #163578. Ported to GStreamer 0.10 but still not enabled or included in the build system by default because of bad artefacts caused by a bug somewhere and as it can be only build on x86/amd64 ATM and requires special CFLAGS. Will be fixed soon. 2009-05-13 10:30:35 +0200 Sebastian Dröge * configure.ac: flv: Actually add the flv plugin to configure.ac 2009-05-13 09:24:26 +0100 Tim-Philipp Müller * tests/check/pipelines/flacdec.c: checks: fix flacdec unit tests on big-endian machines and under valgrind Flacdec outputs 16-bit samples, so let's check if the value of the first sample is what we expect rather than just the first byte, which may be different from what we expect depending on the host's endianness. Fixes the flacdec unit tests on PPC. Also fix a bunch of leaks in the unit tests to make valgrind happy. Fixes #582420. 2009-05-13 09:18:07 +0100 Tim-Philipp Müller * ext/flac/gstflacdec.c: flacdec: fix buffer leak gst_buffer_replace() will take its own ref, so we still have to unref the buffer if we don't need it any longer. 2009-05-12 21:20:04 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Fix pointer arithmetic This fixes a seeking regression, bug #134522. 2009-05-12 21:36:31 +0200 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flv.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Moved 'flv' from -bad to -good 2009-05-07 17:53:42 +0100 Christian Schaller * gst/flv/gstflvdemux.c: [MOVED FROM BAD 57/57] Add ranks to various muxers and encoders in -bad 2009-04-29 18:52:20 +0100 Tristan Matthews * gst/flv/gstflvmux.c: [MOVED FROM BAD 56/57] flvmux: init variable to NULL to fix compiler warning Fixes #580786. 2009-04-29 13:56:07 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: * gst/flv/gstflvparse.c: [MOVED FROM BAD 55/57] flv: Set/require the framed/parsed fields of the audio/mpeg caps to TRUE 2009-04-29 13:16:25 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: [MOVED FROM BAD 54/57] flv: Always write at least the minimal tags and write the PAR as tags 2009-04-29 13:03:46 +0200 Sebastian Dröge * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: [MOVED FROM BAD 53/57] flv: Add support for muxing some tags 2009-04-29 13:03:27 +0200 Sebastian Dröge * gst/flv/gstflvparse.c: [MOVED FROM BAD 52/57] flv: Add support for title tag 2009-04-29 09:40:41 +0200 Sebastian Dröge * gst/flv/gstflvparse.c: [MOVED FROM BAD 51/57] flv: Fix parsing of tags and add new mappings We shouldn't register a new GstTag for every unknown tag we find as this might lead to conflicts and also those tags are essentially unknown. Add mappings for some known tags and also convert string dates to GDate, as found in many FLV files. 2009-04-22 19:52:05 +0200 Sebastian Dröge * gst/flv/gstflvdemux.c: * gst/flv/gstflvdemux.h: * gst/flv/gstflvmux.c: * gst/flv/gstflvmux.h: [MOVED FROM BAD 50/57] flv: Add documentation to flvmux and flvdemux Partially fixes bug #573737. 2009-01-22 13:39:34 +0100 Jan Urbanski * gst/flv/gstflvparse.c: [MOVED FROM BAD 49/57] Add support for ECMA arrays in script tags. Fixes bug #567965. Add support for ECMA arrays in script tags. This fixes seeking on some files that have the seek table stored inside an ECMA array instead of the normal array. 2008-12-03 11:43:00 +0000 Sebastian Dröge [MOVED FROM BAD 48/57] gst/flv/gstflvparse.c: Check if strings are valid UTF8 before using them. Original commit message from CVS: * gst/flv/gstflvparse.c: (FLV_GET_STRING): Check if strings are valid UTF8 before using them. 2008-11-24 11:17:19 +0000 Julien Moutte [MOVED FROM BAD 47/57] gst/flv/gstflvdemux.c: Fix non key unit seeking by always going to the previous keyframe. Mark the discont flag when ... Original commit message from CVS: 2008-11-24 Julien Moutte * gst/flv/gstflvdemux.c: (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), (gst_flv_demux_handle_seek_pull): Fix non key unit seeking by always going to the previous keyframe. Mark the discont flag when we've moved in the file. * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): MP3 streams are parsed already, makes autoplugged pipelines shorter. 2008-11-04 12:42:30 +0000 Stefan Kost [MOVED FROM BAD 46/57] Don't install static libs for plugins. Fixes #550851 for -bad. Original commit message from CVS: * ext/alsaspdif/Makefile.am: * ext/amrwb/Makefile.am: * ext/apexsink/Makefile.am: * ext/arts/Makefile.am: * ext/artsd/Makefile.am: * ext/audiofile/Makefile.am: * ext/audioresample/Makefile.am: * ext/bz2/Makefile.am: * ext/cdaudio/Makefile.am: * ext/celt/Makefile.am: * ext/dc1394/Makefile.am: * ext/dirac/Makefile.am: * ext/directfb/Makefile.am: * ext/divx/Makefile.am: * ext/dts/Makefile.am: * ext/faac/Makefile.am: * ext/faad/Makefile.am: * ext/gsm/Makefile.am: * ext/hermes/Makefile.am: * ext/ivorbis/Makefile.am: * ext/jack/Makefile.am: * ext/jp2k/Makefile.am: * ext/ladspa/Makefile.am: * ext/lcs/Makefile.am: * ext/libfame/Makefile.am: * ext/libmms/Makefile.am: * ext/metadata/Makefile.am: * ext/mpeg2enc/Makefile.am: * ext/mplex/Makefile.am: * ext/musepack/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/mythtv/Makefile.am: * ext/nas/Makefile.am: * ext/neon/Makefile.am: * ext/ofa/Makefile.am: * ext/polyp/Makefile.am: * ext/resindvd/Makefile.am: * ext/sdl/Makefile.am: * ext/shout/Makefile.am: * ext/snapshot/Makefile.am: * ext/sndfile/Makefile.am: * ext/soundtouch/Makefile.am: * ext/spc/Makefile.am: * ext/swfdec/Makefile.am: * ext/tarkin/Makefile.am: * ext/theora/Makefile.am: * ext/timidity/Makefile.am: * ext/twolame/Makefile.am: * ext/x264/Makefile.am: * ext/xine/Makefile.am: * ext/xvid/Makefile.am: * gst-libs/gst/app/Makefile.am: * gst-libs/gst/dshow/Makefile.am: * gst/aiffparse/Makefile.am: * gst/app/Makefile.am: * gst/audiobuffer/Makefile.am: * gst/bayer/Makefile.am: * gst/cdxaparse/Makefile.am: * gst/chart/Makefile.am: * gst/colorspace/Makefile.am: * gst/dccp/Makefile.am: * gst/deinterlace/Makefile.am: * gst/deinterlace2/Makefile.am: * gst/dvdspu/Makefile.am: * gst/festival/Makefile.am: * gst/filter/Makefile.am: * gst/flacparse/Makefile.am: * gst/flv/Makefile.am: * gst/games/Makefile.am: * gst/h264parse/Makefile.am: * gst/librfb/Makefile.am: * gst/mixmatrix/Makefile.am: * gst/modplug/Makefile.am: * gst/mpeg1sys/Makefile.am: * gst/mpeg4videoparse/Makefile.am: * gst/mpegdemux/Makefile.am: * gst/mpegtsmux/Makefile.am: * gst/mpegvideoparse/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/nuvdemux/Makefile.am: * gst/overlay/Makefile.am: * gst/passthrough/Makefile.am: * gst/pcapparse/Makefile.am: * gst/playondemand/Makefile.am: * gst/rawparse/Makefile.am: * gst/real/Makefile.am: * gst/rtjpeg/Makefile.am: * gst/rtpmanager/Makefile.am: * gst/scaletempo/Makefile.am: * gst/sdp/Makefile.am: * gst/selector/Makefile.am: * gst/smooth/Makefile.am: * gst/smoothwave/Makefile.am: * gst/speed/Makefile.am: * gst/speexresample/Makefile.am: * gst/stereo/Makefile.am: * gst/subenc/Makefile.am: * gst/tta/Makefile.am: * gst/vbidec/Makefile.am: * gst/videodrop/Makefile.am: * gst/videosignal/Makefile.am: * gst/virtualdub/Makefile.am: * gst/vmnc/Makefile.am: * gst/y4m/Makefile.am: * sys/acmenc/Makefile.am: * sys/cdrom/Makefile.am: * sys/dshowdecwrapper/Makefile.am: * sys/dshowsrcwrapper/Makefile.am: * sys/dvb/Makefile.am: * sys/dxr3/Makefile.am: * sys/fbdev/Makefile.am: * sys/oss4/Makefile.am: * sys/qcam/Makefile.am: * sys/qtwrapper/Makefile.am: * sys/vcd/Makefile.am: * sys/wininet/Makefile.am: * win32/common/config.h: Don't install static libs for plugins. Fixes #550851 for -bad. 2008-10-28 18:44:44 +0000 Sebastian Dröge [MOVED FROM BAD 45/57] gst/flv/gstflvdemux.c: Implement position query in time format. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_query): Implement position query in time format. 2008-10-28 18:41:19 +0000 Sebastian Dröge [MOVED FROM BAD 44/57] gst/flv/: Put the GstSegment directly into the instance struct instead of allocating and free'ing it again. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), (gst_flv_demux_loop), (gst_flv_demux_handle_seek_push), (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), (gst_flv_demux_dispose), (gst_flv_demux_init): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp): Put the GstSegment directly into the instance struct instead of allocating and free'ing it again. Push tags already if only one pad was added, no need to wait for the second one. When generating our index set has_video and has_audio if we find video or audio in case the FLV header has incorrect data. 2008-10-27 09:45:04 +0000 Sebastian Dröge [MOVED FROM BAD 43/57] gst/flv/: Don't memcpy() all data we want to push downstream, instead just create subbuffers and push them downstream. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header), (gst_flv_demux_create_index): * gst/flv/gstflvparse.c: (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type), (gst_flv_parse_header): * gst/flv/gstflvparse.h: Don't memcpy() all data we want to push downstream, instead just create subbuffers and push them downstream. Fix some minor memory leaks. 2008-10-27 09:41:18 +0000 Sebastian Dröge [MOVED FROM BAD 42/57] gst/flv/Makefile.am: Fix (non-critical) syntax error and add all required CFLAGS and LIBS. Original commit message from CVS: * gst/flv/Makefile.am: Fix (non-critical) syntax error and add all required CFLAGS and LIBS. * gst/flv/gstflvparse.c: (FLV_GET_STRING), (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type): Rewrite the script tag parsing to make sure we don't try to read more data than we have. Also use GST_READ_UINT24_BE directly and fix some minor memory leaks. This should make all crashes on fuzzed FLV files disappear. 2008-10-27 09:37:21 +0000 Sebastian Dröge [MOVED FROM BAD 41/57] gst/flv/gstflvparse.c: Properly check everywhere that we have enough data to parse and don't read outside the allocat... Original commit message from CVS: * gst/flv/gstflvparse.c: (FLV_GET_STRING), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_type), (gst_flv_parse_header): Properly check everywhere that we have enough data to parse and don't read outside the allocated memory region. 2008-10-27 09:35:34 +0000 Sebastian Dröge [MOVED FROM BAD 40/57] gst/flv/gstflvparse.c: If the caps change during playback and negotiation fails error out instead of trying to continue. Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): If the caps change during playback and negotiation fails error out instead of trying to continue. 2008-10-27 09:33:40 +0000 Sebastian Dröge [MOVED FROM BAD 39/57] gst/flv/: Add support for Speex audio and allow buffers without valid timestamp in the muxer. Original commit message from CVS: * gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps), (gst_flv_mux_request_new_pad), (gst_flv_mux_write_buffer), (gst_flv_mux_collected): * gst/flv/gstflvmux.h: * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): Add support for Speex audio and allow buffers without valid timestamp in the muxer. 2008-10-27 09:32:03 +0000 Sebastian Dröge [MOVED FROM BAD 38/57] gst/flv/gstflvdemux.c: Don't post an error message on the bus if sending EOS downstream didn't work. Fixes bug #550454. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_loop), (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), (gst_flv_demux_handle_seek_pull): Don't post an error message on the bus if sending EOS downstream didn't work. Fixes bug #550454. Fix seek event handling to look at the flags of the seek event instead of assuming some random flags, don't send segment-start messages when operating in push mode and push seek events upstream if we couldn't handle them. 2008-10-27 09:27:18 +0000 Sebastian Dröge [MOVED FROM BAD 37/57] gst/flv/gstflvdemux.c: Error out early if pulling a tag failed. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): Error out early if pulling a tag failed. 2008-10-27 09:25:11 +0000 Sebastian Dröge [MOVED FROM BAD 36/57] gst/flv/: In pull mode we create our own index before doing anything else and don't use the index provided by some fi... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_create_index), (gst_flv_demux_loop): * gst/flv/gstflvparse.c: (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp): * gst/flv/gstflvparse.h: In pull mode we create our own index before doing anything else and don't use the index provided by some files (which are more than often incorrect and cause failed seeks). For push mode we still use the index provided by the file and extend it while doing the playback. 2008-10-27 09:20:01 +0000 Sebastian Dröge [MOVED FROM BAD 35/57] gst/flv/gstflvdemux.c: Instead of using gst_pad_event_default() use a small gst_pad_push_event() wrapper that only do... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_push_src_event), (gst_flv_demux_loop), (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event): Instead of using gst_pad_event_default() use a small gst_pad_push_event() wrapper that only does what we want and is much more simple. 2008-10-27 09:14:45 +0000 Sebastian Dröge [MOVED FROM BAD 34/57] gst/flv/gstflvdemux.*: If our index was created by the element and not provided from the outside we should destroy it... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_change_state), (gst_flv_demux_set_index), (gst_flv_demux_init): * gst/flv/gstflvdemux.h: If our index was created by the element and not provided from the outside we should destroy it when starting a new stream to get all old entries removed. 2008-10-27 09:12:33 +0000 Sebastian Dröge [MOVED FROM BAD 33/57] gst/flv/gstflvdemux.c: Improve debugging a bit when pulling a buffer from upstream fails. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range): Improve debugging a bit when pulling a buffer from upstream fails. 2008-10-27 09:10:54 +0000 Sebastian Dröge [MOVED FROM BAD 32/57] gst/flv/: Close the currently playing segment from the streaming thread instead of the thread where the seek event is... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), (gst_flv_demux_handle_seek_pull), (gst_flv_demux_dispose): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Close the currently playing segment from the streaming thread instead of the thread where the seek event is handled. 2008-10-16 15:21:15 +0000 Sebastian Dröge [MOVED FROM BAD 31/57] gst/flv/gstflvmux.c: Don't set video_codec to the value that actually should go into audio codec, otherwise we create... Original commit message from CVS: * gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps), (gst_flv_mux_write_buffer): Don't set video_codec to the value that actually should go into audio codec, otherwise we create invalid files. Fixes bug #556564. 2008-10-12 17:08:10 +0000 Sebastian Dröge [MOVED FROM BAD 30/57] gst/flv/gstflvdemux.c: Fix regression of handling flow returns in pull mode. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header): Fix regression of handling flow returns in pull mode. Fixes bug #556003. 2008-10-10 16:33:36 +0000 Sebastian Dröge [MOVED FROM BAD 29/57] gst/flv/gstflvparse.c: Use gst_pad_alloc_buffer_and_set_caps() to make sure we get a buffer with caps that we can wor... Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Use gst_pad_alloc_buffer_and_set_caps() to make sure we get a buffer with caps that we can work with (i.e. the pad's caps). Add non-keyframe video frames to the index too but without the keyframe flag. Add audio frames to the index only if we have no video stream. 2008-10-10 16:15:09 +0000 Sebastian Dröge [MOVED FROM BAD 28/57] gst/flv/gstflvparse.c: Create pads from the pad templates, use fixed caps on them and only activate them after the ca... Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Create pads from the pad templates, use fixed caps on them and only activate them after the caps are set. 2008-10-09 16:20:26 +0000 Sebastian Dröge [MOVED FROM BAD 27/57] gst/flv/: Get an approximate duration of the file by looking at the timestamp of the last tag in pull mode. If we get... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_loop): * gst/flv/gstflvparse.c: (gst_flv_parse_tag_timestamp): * gst/flv/gstflvparse.h: Get an approximate duration of the file by looking at the timestamp of the last tag in pull mode. If we get (maybe better) duration from metadata later we'll use that instead. 2008-10-09 15:43:02 +0000 Sebastian Dröge [MOVED FROM BAD 26/57] gst/flv/gstflvdemux.c: Refactor _pull_range() logic with checks into a seperate function to make things a bit more re... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range), (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header): Refactor _pull_range() logic with checks into a seperate function to make things a bit more readable. 2008-10-09 15:26:56 +0000 Sebastian Dröge [MOVED FROM BAD 25/57] gst/flv/gstflvdemux.c: Use gst_element_class_set_details_simple(). Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_chain), (gst_flv_demux_base_init): Use gst_element_class_set_details_simple(). If we get GST_FLOW_NOT_LINKED in the parse loop but at least one of the pads is linked continue the loop. 2008-10-09 10:00:51 +0000 Sebastian Dröge [MOVED FROM BAD 24/57] gst/flv/gstflvparse.c: Correct caps for video codec id 5: It's On2 VP6 with alpha channel which needs a different dec... Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate), (gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate): Correct caps for video codec id 5: It's On2 VP6 with alpha channel which needs a different decoder and has different caps. Add support for audio codec id 14, which is MP3 with 8kHz sampling rate. Fix endianness and signedness for raw audio codec ids. Add support for alaw and mulaw audio. 2008-10-09 09:48:46 +0000 Sebastian Dröge [MOVED FROM BAD 23/57] gst/flv/gstflvdemux.c: Go out of the parse loop as soon as we get an error instead of parsing until the GstAdapter is... Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_chain): Go out of the parse loop as soon as we get an error instead of parsing until the GstAdapter is empty. Add some explanations about the header and tag size. Don't print synchronizing message if everything is fine. 2008-10-09 09:26:58 +0000 Sebastian Dröge [MOVED FROM BAD 22/57] gst/flv/: Add first version of a FLV muxer. The only missing feature is writing of stream metadata. Original commit message from CVS: * gst/flv/Makefile.am: * gst/flv/gstflvdemux.c: (plugin_init): * gst/flv/gstflvmux.c: (gst_flv_mux_base_init), (gst_flv_mux_class_init), (gst_flv_mux_init), (gst_flv_mux_finalize), (gst_flv_mux_reset), (gst_flv_mux_handle_src_event), (gst_flv_mux_handle_sink_event), (gst_flv_mux_video_pad_setcaps), (gst_flv_mux_audio_pad_setcaps), (gst_flv_mux_request_new_pad), (gst_flv_mux_release_pad), (gst_flv_mux_write_header), (gst_flv_mux_write_buffer), (gst_flv_mux_collected), (gst_flv_mux_change_state): * gst/flv/gstflvmux.h: Add first version of a FLV muxer. The only missing feature is writing of stream metadata. 2008-06-13 22:46:43 +0000 Julien Moutte [MOVED FROM BAD 21/57] gst/flv/: Introduce demuxing support for AAC and Original commit message from CVS: 2008-06-14 Julien Moutte * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), (gst_flv_demux_dispose): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate), (gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate), (gst_flv_parse_tag_video): Introduce demuxing support for AAC and H.264/AVC inside FLV. * sys/dshowdecwrapper/gstdshowaudiodec.c: (gst_dshowaudiodec_init), (gst_dshowaudiodec_chain), (gst_dshowaudiodec_push_buffer), (gst_dshowaudiodec_sink_event), (gst_dshowaudiodec_setup_graph): * sys/dshowdecwrapper/gstdshowaudiodec.h: * sys/dshowdecwrapper/gstdshowvideodec.c: (gst_dshowvideodec_init), (gst_dshowvideodec_sink_event), (gst_dshowvideodec_chain), (gst_dshowvideodec_push_buffer), (gst_dshowvideodec_src_getcaps): * sys/dshowdecwrapper/gstdshowvideodec.h: Lot of random fixes to improve stability (ref counting, safety checks...) 2008-04-25 08:07:36 +0000 Wim Taymans [MOVED FROM BAD 20/57] gst/flv/gstflvdemux.c: Forward unknown queries upstream instead of returning FALSE on them. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_query): Forward unknown queries upstream instead of returning FALSE on them. 2008-04-11 23:19:21 +0000 Tim-Philipp Müller [MOVED FROM BAD 19/57] gst/flv/gstflvparse.c: Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes crash caused by a strlen on a... Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script): Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes crash caused by a strlen on a NULL string (#527622). 2007-12-11 11:54:43 +0000 Tim-Philipp Müller [MOVED FROM BAD 18/57] gst/flv/gstflvparse.c: Don't strdup (and thus leak) codec name strings when passing them to gst_tag_list_add(). Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Don't strdup (and thus leak) codec name strings when passing them to gst_tag_list_add(). 2007-12-09 19:37:53 +0000 Edward Hervey [MOVED FROM BAD 17/57] gst/flv/gstflvparse.c: Fix list of supported and known codecs. Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Fix list of supported and known codecs. Emit tag with the codec name so it gets properly reported in totem and other applications. 2007-11-25 10:45:09 +0000 Edward Hervey [MOVED FROM BAD 16/57] gst/flv/gstflvparse.c: Output segment with proper 'stop' value, makes flvdemux 100% compatible with gnonlin. Original commit message from CVS: * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Output segment with proper 'stop' value, makes flvdemux 100% compatible with gnonlin. 2007-11-12 19:22:24 +0000 Edward Hervey [MOVED FROM BAD 15/57] gst/flv/gstflvparse.c: Add mapping for Nellymoser ASAO audio codec. Original commit message from CVS: * gst/flv/gstflvparse.c: Add mapping for Nellymoser ASAO audio codec. (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Make sure we actually have data to read at the end of the tag. This avoids trying to allocate negative buffers. 2007-10-22 15:45:49 +0000 Julien Moutte [MOVED FROM BAD 14/57] gst/flv/gstflvparse.c: Don't emit no-more-pads for single pad scenarios as the header is definitely not reliable. We ... Original commit message from CVS: 2007-10-22 Julien MOUTTE * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_type): Don't emit no-more-pads for single pad scenarios as the header is definitely not reliable. We emit them for 2 pads scenarios though to speed up media discovery. 2007-09-27 10:06:23 +0000 Julien Moutte [MOVED FROM BAD 13/57] gst/flv/gstflvparse.c: I got it wrong again, audio rate was not detected correctly in all cases. Original commit message from CVS: 2007-09-27 Julien MOUTTE * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): I got it wrong again, audio rate was not detected correctly in all cases. 2007-09-26 16:30:50 +0000 Julien Moutte [MOVED FROM BAD 12/57] gst/flv/gstflvparse.c: codec_data is needed for every tag not just the first one. (Fix a stupid bug i introduced with... Original commit message from CVS: 2007-09-26 Julien MOUTTE * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): codec_data is needed for every tag not just the first one. (Fix a stupid bug i introduced without testing) 2007-09-26 11:17:08 +0000 Julien Moutte [MOVED FROM BAD 11/57] gst/flv/gstflvparse.c: Fix bit masks operations to be sure we detect the codec_tags and sample rates correctly. Original commit message from CVS: 2007-09-26 Julien MOUTTE * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Fix bit masks operations to be sure we detect the codec_tags and sample rates correctly. Fix raw audio caps generation. 2007-09-12 08:38:22 +0000 Peter Kjellerstedt [MOVED FROM BAD 10/57] gst/: Printf format fixes (#476128). Original commit message from CVS: Patch by: Peter Kjellerstedt * gst-libs/gst/app/gstappsink.c: * gst/flv/gstflvdemux.c: * gst/flv/gstflvparse.c: * gst/interleave/deinterleave.c: * gst/switch/gstswitch.c: Printf format fixes (#476128). 2007-08-27 14:56:05 +0000 Julien Moutte [MOVED FROM BAD 09/57] gst/flv/gstflvdemux.c: Make sure we initialize the seek result. Original commit message from CVS: 2007-08-27 Julien MOUTTE * gst/flv/gstflvdemux.c: (gst_flv_demux_handle_seek_pull): Make sure we initialize the seek result. 2007-08-24 17:03:15 +0000 Julien Moutte [MOVED FROM BAD 08/57] gst/flv/gstflvdemux.c: Remove some useless ifdef. Original commit message from CVS: 2007-08-24 Julien MOUTTE * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), (gst_flv_demux_src_event): Remove some useless ifdef. 2007-08-24 15:31:26 +0000 Julien Moutte [MOVED FROM BAD 07/57] gst/flv/gstflvdemux.c: Implement seeking in push mode. Original commit message from CVS: 2007-08-24 Julien MOUTTE * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), (gst_flv_demux_cleanup), (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), (gst_flv_demux_src_event): Implement seeking in push mode. * gst/flv/gstflvdemux.h: 2007-08-22 14:50:51 +0000 Julien Moutte [MOVED FROM BAD 06/57] gst/flv/: Handle pixel aspect ratio through metadata tags like ASF does. Fluendo muxer supports this and Original commit message from CVS: 2007-08-22 Julien MOUTTE * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), (gst_flv_demux_pull_tag): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Handle pixel aspect ratio through metadata tags like ASF does. Fluendo muxer supports this and Flash players can support it as well this way. 2007-08-22 14:03:42 +0000 Julien Moutte [MOVED FROM BAD 05/57] gst/flv/: Make sure we don't try filling up the index if no times object was parsed. Fix the way we decide to push ta... Original commit message from CVS: 2007-08-22 Julien MOUTTE * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Make sure we don't try filling up the index if no times object was parsed. Fix the way we decide to push tags and emit no-more-pads. Fix some printf typing in debugging. 2007-08-14 14:56:20 +0000 Wim Taymans [MOVED FROM BAD 04/57] gst/flv/gstflvdemux.c: Fix locking and refcounting on the index. Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_set_index), (gst_flv_demux_get_index): Fix locking and refcounting on the index. 2007-08-14 14:22:09 +0000 Julien Moutte [MOVED FROM BAD 03/57] gst/flv/gstflvdemux.c: First method for seeking in pull mode using the index built step by step or coming from metadata. Original commit message from CVS: 2007-08-14 Julien MOUTTE * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), (gst_flv_demux_adapter_flush), (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_do_seek), (gst_flv_demux_handle_seek), (gst_flv_demux_sink_event), (gst_flv_demux_src_event), (gst_flv_demux_query), (gst_flv_demux_change_state), (gst_flv_demux_set_index), (gst_flv_demux_get_index), (gst_flv_demux_dispose), (gst_flv_demux_class_init): First method for seeking in pull mode using the index built step by step or coming from metadata. * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (FLV_GET_STRING), (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Parse more metadata types and keyframes index. 2007-07-25 13:29:04 +0000 Julien Moutte [MOVED FROM BAD 02/57] gst/flv/: Handle not linked pads, try to make it reusable, more safety checks. Original commit message from CVS: 2007-07-25 Julien MOUTTE (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_change_state), (gst_flv_demux_dispose), (gst_flv_demux_init): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (FLV_GET_STRING), (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_header): * gst/flv/gstflvparse.h: Handle not linked pads, try to make it reusable, more safety checks. 2007-07-19 15:05:30 +0000 Julien Moutte [MOVED FROM BAD 01/57] Adds a first draft of an FLV demuxer. Original commit message from CVS: 2007-07-19 Julien MOUTTE * configure.ac: * gst/flv/Makefile.am: * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), (gst_flv_demux_cleanup), (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header), (gst_flv_demux_seek_to_prev_keyframe), (gst_flv_demux_loop), (gst_flv_demux_sink_activate), (gst_flv_demux_sink_activate_push), (gst_flv_demux_sink_activate_pull), (gst_flv_demux_sink_event), (gst_flv_demux_change_state), (gst_flv_demux_dispose), (gst_flv_demux_base_init), (gst_flv_demux_class_init), (gst_flv_demux_init), (plugin_init): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (FLV_GET_BEUI24), (FLV_GET_STRING), (gst_flv_demux_query_types), (gst_flv_demux_query), (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_tag_type), (gst_flv_parse_header): * gst/flv/gstflvparse.h: Adds a first draft of an FLV demuxer. It does not do seeking yet, it supports pull and push mode so YES you can use it to play youtube videos directly from an HTTP uri. Not so much testing done yet but it parses metadata, reply to duration queries, etc... 2009-05-12 13:00:46 +0200 Sebastian Dröge * gst/rtp/Makefile.am: rtp: Link to -lm Fixes bug #582281. 2009-05-12 11:16:48 +0200 Sebastian Dröge * tests/check/elements/rganalysis.c: rganalysis: Remove invalid unit test The test creates buffers with non-silence, sets the GAP flag on it and expects rganalysis to ignore the content and assume silence. That's not the way how GAP buffers should be used, if the GAP flag is set elements *can* assume that they only contain silence but they're not *required* to assume that. The GAP flag must only be set on silence buffers. Fixes bug #582252. 2009-05-12 00:48:49 +0100 Jan Schmidt * ChangeLog: * configure.ac: * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: * win32/common/config.h: 0.10.14.2 pre-release 2009-05-11 23:13:20 +0100 Jan Schmidt * tests/files/Makefile.am: checks: dist id3-577468-unsynced-tag.tag test file 2009-05-11 21:02:27 +0200 Tristan Matthews * gst/avi/gstavidemux.c: avidemux: initialize variable to 0 Fixes #582218. 2009-05-11 18:21:13 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Only search for the index entry once 2009-05-11 18:18:36 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Use the first index entry if it's after the seek position 2009-05-11 18:15:22 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Use the first entry for a given stream if the first entry is after the seek position 2009-05-11 16:50:48 +0200 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Use binary search for finding the requested index entry when seeking 2009-05-11 15:36:46 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: matroskademux: Improve/optimize seeking First of all a keyframe seek should be done to the keyframe right before the requested position and not to the keyframe that is nearest to the requested position. Use per track index arrays and use our new binary search function from core to speed up the search. 2009-05-11 15:36:36 +0200 Sebastian Dröge * configure.ac: Require released versions of core/base 2009-05-11 10:15:00 +0200 Sebastian Dröge * tests/check/Makefile.am: gdkpixbuf: Use the libs and cflags of gdk pixbuf instead of gtk This fixes the build if gdk-pixbuf is found but gtk isn't 2009-05-11 09:58:48 +0200 Sebastian Dröge * configure.ac: Always define the conditional HAVE_GTK to fix configure in some cases 2009-05-10 11:17:23 +0200 Marc-Andre Lureau * autogen.sh: Run libtoolize before aclocal This unbreaks the build in some cases. Fixes bug #582021 2009-05-09 10:50:45 -0700 David Schleef * gst/matroska/matroska-demux.c: matroska: fix printf format to agree with argument 2009-05-08 19:42:10 +0100 Tim-Philipp Müller * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: raw1394: include stdlib.h for strtol() Fixes compiler warning when compiling with xml stuff in core disabled. 2009-05-08 16:40:57 +0200 Edward Hervey * ext/flac/gstflacdec.c: flacdec: Actually output the pending buffer.. and not a blank one. It was previously sending the bogus buffer which was returned from the bufferalloc (required for reverse negotiation apparently) instead of the pending buffer. 2009-05-08 12:00:57 +0200 Sebastian Dröge * ext/soup/gstsouphttpsrc.c: souphttpsrc: Allow non-string fields in the extra-headers property 2009-05-08 11:35:02 +0200 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpj2kdepay.c: * gst/rtp/gstrtpj2kdepay.h: rtj2kdepay: add basic JPEG 2000 depayloader 2009-05-08 11:31:02 +0200 Wim Taymans * gst/rtp/gstrtpj2kpay.c: rtpj2kpay: set marker bit correctly 2009-05-08 11:29:04 +0200 Sebastian Dröge * ext/soup/gstsouphttpsrc.c: * ext/soup/gstsouphttpsrc.h: souphttpsrc: Add support for extra-headers appended to the HTTP request This allows to set the Referer header among other things by adding a "extra-headers" property that takes a GstStructure with field=string pairs. Fixes bug #581806. 2009-05-08 10:38:42 +0200 Wim Taymans * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpj2kpay.c: * gst/rtp/gstrtpj2kpay.h: rtpj2kpay: add a simple JPEG 2000 payloader 2009-05-08 10:31:12 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: we only need to swap bits on LE 2009-05-07 18:10:08 +0100 Christian Schaller * ext/flac/gstflac.c: * ext/jpeg/gstjpeg.c: * ext/libpng/gstpng.c: * ext/speex/gstspeex.c: * gst/avi/gstavi.c: * gst/matroska/matroska-mux.c: Add RANKS for various encoders and muxers 2009-05-07 17:09:44 +0200 Wim Taymans * gst/matroska/matroska-demux.c: matroskademux: add some debugging 2009-05-07 15:58:43 +0200 Wim Taymans * gst/matroska/matroska-demux.c: matroskademux: parse xiph headers length correctly See #580980 2009-05-07 16:25:41 +0200 Gabriel Bouvigne * gst/replaygain/gstrganalysis.c: * gst/replaygain/gstrganalysis.h: * gst/replaygain/rganalysis.c: * gst/replaygain/rganalysis.h: rganalysis: Add ability to post level messages Fixes bug #581568. 2009-05-06 23:56:44 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: refuse some unsupported jpeg formats 2009-05-06 18:06:49 +0200 Wim Taymans * gst/rtp/gstrtptheorapay.c: rtptheorapay: fix description 2009-05-06 16:09:13 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: rewrite quant table handling Rewrite the quant table parsing to also handle multiple tables in one JPEG HDQ segment. Handle more jpeg types by keeping track of the tables used per component and putting the used ones in the quant headers. 2009-04-18 17:23:51 +0100 Jan Schmidt * tests/check/elements/id3v2mux.c: id3v2mux: Make the test failure slightly more informative 2009-04-20 18:33:09 +0100 Jan Schmidt * ext/flac/gstflacdec.c: flac: Make buffers created during seek act like normal buffers. Store the offset and caps when allocating a buffer during seeking, and then allocate a new buffer with buffer_alloc before we push it out. This ensures that in all respects the first buffer decoded during seeking behaves like all other buffers, including allowing downstream re-negotiation. 2009-04-18 18:00:54 +0200 Thomas Vander Stichele * ext/flac/gstflacdec.c: flacdec: don't use pad_alloc when decoding while seeking. Fixes #579422 2009-05-06 13:22:51 +0200 Arnout Vandecappelle * ext/jpeg/gstjpegdec.c: jpegdec: refactored gst_jpeg_dec_parse_image_data Fixes #579808 2009-05-06 13:11:53 +0200 Arnout Vandecappelle * ext/jpeg/gstjpegdec.c: jpegdec: support additional 0xff before end marker. JPEG markers may be preceded by additional 0xff. jpegdec should skip over these, even before the end marker. See #579808 2009-05-06 12:54:22 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: rtpjpegpay: handle input with 1 quant table Also handle input with just one quant table, simply duplicate the quant table. Handle invalid SOF correctly and some small cleanups. Fixes #578257 2009-04-29 15:58:10 +0300 Marco Ballesio * gst/qtdemux/qtdemux.c: qtdemux: fix byte order swapping in 3GPP classification entity tag Fixes #580746. 2009-05-05 17:07:13 +0200 Arnout Vandecappelle * gst/multipart/multipartdemux.c: multipartdemux: avoid reading from inavlid memory Read the timestamp of the incomming buffer before we push it in the adapter and flush it out again as the buffer might be unreffed then and we read from invalid memory. Fixes #581444. 2009-05-05 17:03:29 +0200 Arnout Vandecappelle * gst/multipart/multipartdemux.c: multipartdemux: don't leak dynamic pads Free the dynamic pads data in finalize. Fixes #581432 2009-05-05 16:32:17 +0200 Wim Taymans * gst/rtp/gstrtpjpegpay.c: * gst/rtp/gstrtpjpegpay.h: rtpjpegpay: correctly set the type header Don't require width/height on the caps. Use the SOF header to find width/height and fall back to the caps if there is no SOF. Also use the SOF info to find the subsampling and quantization tables used. This allows us to set the right type value in the JPEG rtp header. Deprecate the quality property, it's unused now and it was used wrongly before. Always send full quant tables for now until we have some code to detect default ones. Fixes #580880 2009-05-05 16:28:44 +0200 Wim Taymans * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpjpegdepay.h: rtpjpegdepay: use width/height from payload Use the width and the height from the payload headers and set them on the output caps for added awesomeness. Fix quant parsing, we need to check the type in the lower 6 bits. Add first bits of caching quantization tables. 2009-05-05 16:24:16 +0200 Wim Taymans * ext/jpeg/gstjpegenc.c: jpegenc: set colorspace before _set_defaults() The libjpeg api says that we need to set the colorspace before we call _set_defaults(). Indeed, if we don't do that we end up with some very freaky non-standard quant table and huffman table indexes. 2009-05-05 13:19:19 +0100 Tim-Philipp Müller * tests/Makefile.am: tests: don't build examples if --disable-examples was passed to configure 2009-05-05 12:33:57 +0100 Tim-Philipp Müller * configure.ac: configure: clean up mess around gtk+ checking And don't check for gtk+ when it's not needed (ie. if examples are disabled) 2009-05-05 12:27:21 +0100 Tim-Philipp Müller * configure.ac: * ext/gdk_pixbuf/Makefile.am: * ext/gdk_pixbuf/pixbufscale.h: configure: make gdk-pixbuf plugin depend only on gdk-pixbuf, not gtk+ 2009-05-04 18:55:12 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: Fix find_stream_by_* functions Fix various version of find_stream_by_* by not trying to convert an int to a pointer and vice versa, for portability reasons. Fixes #581333 2009-05-04 18:32:05 +0200 Chris Winter * gst/rtsp/gstrtspsrc.c: rtspsrc: fix dummy nat packet logic Fix a typo in the dummy NAT packet sending code. Fixes #581329 2009-04-30 10:24:27 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: avoid errors after server eof Server eof (e.g. connection closed) is announced as connection closed, so better record state and act accordingly to prevent (read/write) errors during subsequent teardown/cleanup sequences. #Fixes 580851.(c). 2009-04-30 10:19:27 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: also set base_time on src after flush timestamps following flush/seek should be consistent between UDP and TCP interleaved case. Fixes #580851.(b). 2009-04-30 10:17:23 +0200 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: sanity checks on range info A max range that overflows should not be trusted, nor should a max range that equals the min range. Fixes #580851.(a). 2009-05-04 16:16:54 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: use SKIP flag to use SCALE headers We can use the SKIP seek flag to instruct the server to send data faster then normal but with the same bandwidth. Fixes #537609 2009-05-04 14:19:22 +0200 Alessandro Decina * ext/speex/gstspeexdec.c: speexdec: make speex_dec_convert work with same-format values when no data has been decoded. 2009-05-04 12:43:42 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: flac: Implement preset interface 2009-05-04 12:41:56 +0200 Sebastian Dröge * ext/speex/gstspeexenc.c: speex: Implement preset interface 2009-05-04 12:40:12 +0200 Sebastian Dröge * ext/wavpack/gstwavpackenc.c: wavpack: Implement preset interface 2009-05-04 12:35:19 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: use binary search for index Use the new binary search method for finding the right index entry faster. 2009-05-04 11:26:56 +0200 Wim Taymans * gst/videobox/gstvideobox.c: videobox: draw the complete U and V planes Round up the scaled U and V width and height so that we always draw the correct amount of pixels to fill the complete image. Fixes #569611 2009-05-01 19:35:11 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: add some more micro optimisations 2009-04-30 18:41:44 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: * gst/qtdemux/qtdemux_types.c: qtdemux: micro optimize qtdemux a little Sprinkle some G_LIKELY around. Avoid traversing and dumping the tree when debugging is not activated. 2009-04-30 14:22:27 +0200 Wim Taymans * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: add support for subtitle pictures Add support for subtitle pictures. Fixes #568278. 2009-04-30 10:32:39 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: make sure we always signal waiters Always signal the waiters in the async callbacks. Especially for the volume callbacks since this might cause deadlocks. 2009-04-29 18:09:07 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: release state lock before stopping task We need to release the state lock before trying to wait for the task to end because the task might also take the lock. Fixes #577671 2009-04-29 12:19:27 +0200 Hans de Goede * gst/qtdemux/qtdemux.c: qtdemux: handle ac-3 audio fix demuxing of m4v streams with ac-3 audio Fixes #580554 2009-04-29 11:12:36 +0200 Sebastian Dröge * ext/flac/gstflacenc.c: flacenc: Use the tag merge mode that was set on the interface for merging tag events 2009-04-25 09:43:38 +0200 Wim Taymans * gst/udp/gstudpsrc.c: udpsrc: fix getaddrinfo error reporting getaddrinfo errors should be reported with gai_strerror instead of errno as spotted by MikeS. 2009-04-27 10:08:39 +0200 Wim Taymans * gst/rtp/gstrtpg726pay.c: g726pay: fix compilation 2009-04-27 10:02:06 +0200 Wim Taymans * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg726pay.h: g726pay: add RFC compliant packetizing Shuffle the input bits according to RFC 3551 for G726 payloads. Add option to force the previous behaviour. Fixes #567140 2009-04-27 09:59:54 +0200 Wim Taymans * gst/rtp/gstrtpg726depay.c: g726depay: add debug category Add a debugging category, add some comments and remove _peek_parent(). 2009-04-26 15:59:50 +0100 Tim-Philipp Müller * configure.ac: id3v2mux: we need taglib 1.5 for ID3v2::RelativeVolumeFrame::setIdentification Bump taglib requirement. 2009-04-24 02:11:28 +0100 Tim-Philipp Müller * tests/check/elements/id3demux.c: * tests/files/id3-577468-unsynced-tag.tag: id3demux: add unit test file for unsynced id3 tags 2009-04-24 01:51:35 +0100 Tim-Philipp Müller * gst/id3demux/id3tags.c: id3demux: parse unsynchronised tags properly We didn't handle unsynchronization at all up to now, which might have caused frames to not be extracted - esp. frames after an APIC picture frame. Fixes #577468. 2009-04-24 01:01:53 +0100 Tim-Philipp Müller * gst/id3demux/id3tags.c: id3demux: pass the right size value for size of all frames to the parser Frame data size is tag size adjusted for size of the tag header and footer, not tag size including header and footer. 2009-04-22 15:24:55 +0200 Patrick Radizi * gst/rtsp/gstrtspsrc.c: rtspsrc: fix some more pad leaks Fix some pad leaks. See #577318. 2009-04-21 22:12:45 +0100 Jan Schmidt * common: Automatic update of common submodule From b3941ea to 6ab11d1 2009-04-21 14:02:01 -0700 Michael Smith * gst/qtdemux/qtdemux.c: qtdemux: override caps based on data from ESDS atoms in mpeg4. If the codec is actually something else (e.g. mjpeg) change the caps to match when parsing the ESDS atom. Also, for AAC, override rate and channels with correct values read from ESDS, since the rate/channels values elsewhere are often wrong. 2009-04-20 19:32:00 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: jpegdec: fix warning for still images by not trying to divide by 0 Don't pass a 0 divisor to gst_util_uint64_scale(), or it will complain in the single image case where fps=0/1 (are we supposed to differentiate between no fps=still image and fps=0/1=variable rate here btw?) 2009-04-20 17:25:34 +0100 Jan Schmidt * gst/udp/gstudpnetutils.c: udp: Fix a simple typo in the previous commit Use #ifdef instead of #if, to fix the build 2009-04-20 15:48:21 +0200 Andy Wingo fix format string in pngdec * ext/libpng/gstpngdec.c: Fix size_t vs unsigned int format in error message. 2009-04-20 15:46:03 +0200 Andy Wingo only use struct ip_mreqn if it is detected * configure.ac: Make an explicit check for struct ip_mreqn. * gst/udp/gstudpnetutils.c: Use HAVE_IP_MREQN instead of the ad-hoc checks. 2009-04-20 13:45:32 +0200 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: Fix push mode buffering sanity check to actually fit the description. 2009-04-18 19:11:06 +0200 Edward Hervey * gst/rtp/gstrtph263pay.c: rtph263pay: And let's not forget to remove the unused variable. 2009-04-18 18:50:32 +0200 Edward Hervey * gst/rtp/gstrtph263pay.c: rtph263pay: Remove dead assignments, the variables are never read after. 2009-04-18 18:49:49 +0200 Edward Hervey * gst/rtp/gstrtpmp4vpay.c: rtpmp4vpay: Remove dead assignment. The value is never read after. 2009-04-18 18:48:55 +0200 Edward Hervey * gst/rtsp/gstrtspsrc.c: rtspsrc: Remove dead assignment. t is being overwritten after, before it's used. 2009-04-18 18:48:06 +0200 Edward Hervey * gst/rtp/gstrtpamrdepay.c: rtpamrdepay: Remove unneeded variable, the value is only read once. 2009-04-18 18:47:05 +0200 Edward Hervey * gst/rtp/gstrtpamrpay.c: rtpamrpay: Remove unneeded variable, the value is only read once. 2009-04-18 18:46:12 +0200 Edward Hervey * gst/goom/filters.c: goom/filters: Remove dead assignment. Value overwritten just after. 2009-04-18 18:45:32 +0200 Edward Hervey * gst/rtp/gstrtpvorbispay.c: rtpvorbispay: Remove dead assignment. Value never read after. 2009-04-18 18:45:07 +0200 Edward Hervey * gst/rtp/gstrtptheorapay.c: rtptheorapay: Remove dead assignment. Value never read after. 2009-04-18 18:43:31 +0200 Edward Hervey * gst/rtp/gstrtptheoradepay.c: rtptheoradepay: Remove unused variable, it's never being read. 2009-04-18 18:42:45 +0200 Edward Hervey * gst/rtsp/gstrtspsrc.c: rtspsrc: Remove dead assignment. 'res' isn't read after. 2009-04-18 18:41:58 +0200 Edward Hervey * gst/rtsp/gstrtspsrc.c: rtspsrc: Remove unused variable. 'res' is never read. 2009-04-18 18:40:48 +0200 Edward Hervey * gst/rtsp/gstrtspsrc.c: rtspsrc: Remove dead variable. 'stream' is never read after. 2009-04-18 18:39:48 +0200 Edward Hervey * gst/videobox/gstvideobox.c: videbox: Remove dead assignments. These variables are never read after this point. 2009-04-18 18:38:29 +0200 Edward Hervey * gst/goom/convolve_fx.c: goom: ff and iff are only used in a '#ifdef DRAW_MOTIF' block. 2009-04-18 18:34:11 +0200 Edward Hervey * gst/wavparse/gstwavparse.c: wavparse: Remove dead assignment. res isn't read after this. 2009-04-18 18:32:03 +0200 Edward Hervey * gst/wavparse/gstwavparse.c: wavparse: Remove dead assignments, move variable to where it's needed. The header_read_error label will return GST_FLOW_ERROR 2009-04-18 18:21:22 +0200 Edward Hervey * gst/rtp/gstrtpvrawdepay.c: rtpvrawdepay: Remove dead assignment. The value of 'str' will never be used in these cases. 2009-04-18 18:19:12 +0200 Edward Hervey * gst/matroska/matroska-demux.c: matroskademux: Remove useless variable. iret was never read outside of that loop, and is always being exited if iret was != GST_FLOW_OK anyway. 2009-04-18 18:17:35 +0200 Edward Hervey * gst/avi/gstavidemux.c: avidemux: Move 'res' to where it's actually being used. res was never used outside of that block except for a dead assignment. 2009-04-18 18:16:33 +0200 Edward Hervey * gst/audiofx/audiochebband.c: * gst/audiofx/audiocheblimit.c: audiofx: Remove unused variable. rz is never used in these methods. 2009-04-18 18:15:39 +0200 Edward Hervey * sys/osxaudio/gstosxringbuffer.c: osxringbuffer: Run gst-indent. 2009-04-18 18:14:49 +0200 Edward Hervey * sys/ximage/gstximagesrc.c: ximage: Remove dead assignments. Those variables are not read after that point. 2009-04-18 18:11:00 +0200 Edward Hervey * ext/dv/gstdvdemux.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/libcaca/gstcacasink.c: * ext/libpng/gstpngdec.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: * ext/speex/gstspeexenc.c: * gst/alpha/gstalpha.c: * gst/alpha/gstalphacolor.c: * gst/apetag/gstapedemux.c: * gst/auparse/gstauparse.c: * gst/effectv/gstquark.c: * gst/flx/gstflxdec.c: * gst/icydemux/gsticydemux.c: * gst/interleave/interleave.c: * gst/matroska/matroska-mux.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/qtdemux/gstrtpxqtdepay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspsrc.c: * gst/smpte/gstsmptealpha.c: * gst/smpte/paint.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videomixer/videomixer.c: * gst/wavparse/gstwavparse.c: * sys/ximage/gstximagesrc.c: Remove trivial unused variables detected by CLang static analyzer. 2009-04-18 17:52:00 +0200 Edward Hervey * ext/gconf/gstswitchsink.c: * gst/qtdemux/gstrtpxqtdepay.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpjpegdepay.c: * gst/rtp/gstrtpmp1sdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtpvrawpay.c: Remove blank {set|get}_property/change_state/finalize methods. 2009-04-18 17:42:55 +0200 Edward Hervey * ext/cairo/gsttimeoverlay.c: * ext/esd/esdsink.c: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/pulse/pulsesink.c: * gst/alpha/gstalphacolor.c: * gst/cutter/gstcutter.c: * gst/debugutils/efence.c: * gst/debugutils/gstnavigationtest.c: * gst/debugutils/gsttaginject.c: * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdvdepay.c: * gst/rtp/gstrtpdvpay.c: * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpsirendepay.c: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbispay.c: * gst/rtp/gstrtpvrawdepay.c: * gst/smpte/gstsmptealpha.c: * gst/udp/gstudpsink.c: * gst/videofilter/gstvideobalance.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: Remove unused variables in _class_init Detected by LLVM's CLang static analyzer 2009-04-18 13:54:08 +0100 Jan Schmidt * tests/check/elements/souphttpsrc.c: check: Check whether threads are already initialised before g_thread_init() 2009-04-18 14:32:40 +0200 Josep Torra * gst/rtsp/gstrtspsrc.c: rtspsrc: mark discont on the streams as was said the debug line After a seek mark all streams with discont as it was said in the debug line. Fixes that buffers after a seek are generated without a valid timestamp. 2009-04-18 08:45:18 +0200 Josep Torra * gst/rtsp/gstrtspsrc.c: rtspsrc: map GST_RTSP_EEOF to EOS on server requests Permit properly handle the EOS condition when server report it in a request. 2009-04-18 08:39:57 +0200 Edward Hervey * gst/rtp/gstrtptheoradepay.c: rtptheoradepay: Fix build on macosx. Use G_GSIZE_FORMAT instead of u. 2009-04-16 22:50:59 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: fix sample offset calculation again 2009-04-15 19:32:18 +0100 Tim-Philipp Müller * sys/sunaudio/gstsunaudiomixerctrl.c: sunaudio: fix broken indentation of variable declarations 2009-04-15 19:28:53 +0100 James Andrewartha * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiosink.c: sunaudio: remove some unused variables and goto labels Fixes #579070. 2009-04-15 19:24:49 +0200 James Andrewartha * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pay.h: rtph263pay: fix compilation on big-endian Some semicolons were missing from the big-endian structs in gstrtph263pay.h. A GST_DEBUG call was missing a format specifier. Fixes #579069 2009-04-15 20:10:04 +0300 Marco Ballesio * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: * gst/qtdemux/quicktime.c: qtdemux: implement 3GPP (TS 26.244 V8.0.0) Asset metadata handling, Fixes #132193 Implements 3gpp iso metadata tags which are different from mov udta atoms. 2009-04-15 15:51:24 +0200 Peter Kjellerstedt * gst/debugutils/efence.h: debugutils: Use G_BEGIN_DECLS/G_END_DECLS. Use G_BEGIN_DECLS/G_END_DECLS to avoid gst-indent messing up the indentation due to extern "C" { }. 2009-04-15 16:03:27 +0300 Stefan Kost * configure.ac: * docs/plugins/Makefile.am: * gst/debug/Makefile.am: * gst/debug/breakmydata.c: * gst/debug/debug.vcproj: * gst/debug/efence.c: * gst/debug/efence.h: * gst/debug/efence.vcproj: * gst/debug/gstdebug.c: * gst/debug/gstnavigationtest.c: * gst/debug/gstnavigationtest.h: * gst/debug/gstnavseek.c: * gst/debug/gstnavseek.h: * gst/debug/gstpushfilesrc.c: * gst/debug/gstpushfilesrc.h: * gst/debug/gsttaginject.c: * gst/debug/gsttaginject.h: * gst/debug/navigationtest.vcproj: * gst/debug/negotiation.c: * gst/debug/progressreport.c: * gst/debug/progressreport.h: * gst/debug/rndbuffersize.c: * gst/debug/testplugin.c: * gst/debug/tests.c: * gst/debug/tests.h: * gst/debugutils/Makefile.am: * gst/debugutils/breakmydata.c: * gst/debugutils/debug.vcproj: * gst/debugutils/efence.c: * gst/debugutils/efence.h: * gst/debugutils/efence.vcproj: * gst/debugutils/gstdebug.c: * gst/debugutils/gstnavigationtest.c: * gst/debugutils/gstnavigationtest.h: * gst/debugutils/gstnavseek.c: * gst/debugutils/gstnavseek.h: * gst/debugutils/gstpushfilesrc.c: * gst/debugutils/gstpushfilesrc.h: * gst/debugutils/gsttaginject.c: * gst/debugutils/gsttaginject.h: * gst/debugutils/navigationtest.vcproj: * gst/debugutils/negotiation.c: * gst/debugutils/progressreport.c: * gst/debugutils/progressreport.h: * gst/debugutils/rndbuffersize.c: * gst/debugutils/testplugin.c: * gst/debugutils/tests.c: * gst/debugutils/tests.h: debug: rename debug to debugutils to avoid clash with --disable-debug. Fixes #562168 2009-04-15 15:43:04 +0300 Stefan Kost * gst/debug/efence.c: * gst/debug/efence.h: * gst/debug/gstnavigationtest.h: * gst/debug/gstnavseek.h: * gst/debug/gstpushfilesrc.h: * gst/debug/gsttaginject.h: * gst/debug/progressreport.h: * gst/debug/tests.h: debug: indent before renaming 2009-04-15 14:07:57 +0200 Wim Taymans * gst/rtp/gstrtpg726depay.c: g726depay: add property for aal2 force 2009-04-15 13:56:17 +0200 Wim Taymans * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726depay.h: g726depay: implement RFC3551 packing We implemented the AAL2 packing, add the encoding-name for those to the caps and a property to force AAL2 decoding (always TRUE for now). Implement RFC3551 unpacking for regular G726. See #567140. 2009-04-15 00:22:43 +0200 Wim Taymans * gst/rtp/gstrtph263pay.h: rtph263pay: fix build 2009-04-14 18:52:48 +0200 Youness Alaoui * gst/rtp/gstrtph263pay.c: h263pay: various fixes Re-enable mode A support and a property to control it. Fix memory leak of GstRtpH263PayBoundry objects. Fix marker. Fixes #509311 2009-04-14 18:44:51 +0200 Janin Kolenc * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pay.h: h263pay: Fix the payloader Fix the H263 payloader to be more RFC 2190 compliant. See #509311 2009-04-14 17:27:05 +0200 Wim Taymans * gst/avi/gstavidemux.c: avidemux: don't push EOS in streaming mode In streaming mode, avidemux is not supposed to send an EOS event downstream but it is supposed to return UNEXPECTED from the chain function instead so that upstream can do the right EOS handling. 2009-04-13 14:03:03 +0200 Sebastian Dröge * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: Add initial support for muxing/demuxing Speex audio Note: This is not in the Matroska spec yet Fixes bug #578310. 2009-04-10 21:31:06 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: handle NULL timing info Don't crash when the timing info is not yet available. 2009-04-10 21:42:13 +0300 Stefan Kost * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulse: make it work on 0.9.12 First we ignore request to fill the ringbuffer which are less then a segment. The small request where causing stutter. Then we disable flushing the stream when running against pa 0.9.12 as this triggers an assertiong in the sound server and terminates it. It does not happen with 0.9.10 and 0.9.14. 2009-04-10 14:18:48 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: handle server disconnect in get_time When the server is disconnected or when we are shut down, make our clock return an invalid time instead of erroring out. 2009-04-10 12:01:27 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: bps is signed int to avoid overflow Keep bps as gint instead of guint because we will be doing signed math with it later on and we don't want weird results. 2009-04-10 00:26:44 +0200 LRN * gst/avi/gstavidemux.c: avidemux: add convert query, fix duration query Fix the duration query so that it also works with formats other than TIME, such as DEFAULT to get the number of frames. Add a convert function. Fixes #578052. 2009-04-09 23:43:58 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: check for a stream Don't try to change the stream volume (and other things) when we don't have a stream yet. Just store the values for later. 2009-04-09 18:07:38 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: fix compilation for newer pulseaudio 2009-04-09 17:18:54 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: uncork fixes and use prebuf = 0 We can use prebuf = 0 to instruct pulse to not pause the stream on underflows. This way we can remove the underflow callback. We however have to manually uncork the stream now when we have no available space in the buffer or when we are writing too far away from the current read_index. 2009-04-09 14:38:17 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: handle write errors 2009-04-09 14:16:35 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: write silence on underflow Start filling up the buffer with empty samples when an underflow happens. We need to do this to keep pulseaudio reporting the right time for us. 2009-04-09 13:14:14 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: handle pull-based scheduling Use the default basesink methods for implementing pull based scheduling, it works fine for us. 2009-04-09 12:13:44 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: add beginnings of pull-based scheduling 2009-04-08 18:17:10 +0200 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: keep track of clock reset when we switch streams, the clock will reset to 0. Make sure that the provided clock doesn't get stuck when this happens by keeping an initial offset. We also need to make sure that we subtract this offset in samples when writing to the ringbuffer. 2009-04-08 13:52:41 +0200 Wim Taymans * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: rewrite pulsesink Derive from BaseAudioSink and implement our custom ringbuffer that maps to the internal pulseaudio ringbuffer. 2009-04-08 13:52:00 +0200 Wim Taymans * ext/pulse/pulseutil.c: pulse: remove some stray debug lines 2009-04-09 11:30:59 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: use slightly more adaptive formula for QoS Should work at least a tad better if the decoder can't keep up, and should also spread dropped frames a bit more evenly over time. 2009-04-07 22:35:31 +0300 Stefan Kost * gst/wavparse/gstwavparse.c: wavparse: don't leak pad-template gst_element_class_add_pad_template() does not take ownership. 2009-04-04 21:18:55 +0300 Felipe Contreras * common: Automatic update of common submodule From d0ea89e to b3941ea 2009-04-01 01:15:31 +0200 Thomas Vander Stichele * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: add pending_samples so that we only update segment's last stop after really sending the samples 2009-03-15 21:31:49 +0100 Thomas Vander Stichele * tests/check/pipelines/flacdec.c: add debug and an assert 2009-03-15 21:30:32 +0100 Thomas Vander Stichele * ext/flac/gstflacdec.c: add debugging 2009-03-03 10:14:02 +0100 Thomas Vander Stichele * tests/check/Makefile.am: * tests/check/audiotestsrc.flac: * tests/check/pipelines/flacdec.c: add a test to check that we get all decoded bytes from a 10-buffer audiotestsrc flac, in the case of: - a full decode - a decode of a seek for the full file - a decode of a seek for a small part, smaller than the first buffer The test fails because flacdec drops the first outgoing buffer on a seek 2009-03-03 10:06:52 +0100 Thomas Vander Stichele * ext/flac/gstflacdec.c: clipping should also work if it's done on the first buffer starting at 0 2009-04-04 14:54:01 +0200 Edward Hervey * common: Automatic update of common submodule From f8b3d91 to d0ea89e 2009-04-03 09:57:15 +0100 Zaheer Merali * gst/qtdemux/LEGAL: Fix grammar. 2009-04-02 22:41:01 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: allow http:// on the proxy setting Allow and ignore http:// at the start of the proxy setting, like souphttpsrc. Fixes #573173 2009-04-02 21:08:48 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't leak the udpsrc pad Fix memory leak in rtspsrc because we didn't unref the udpsrc pad. See #577318 2009-04-01 17:31:18 -0700 Michael Smith * gst/rtp/gstrtptheorapay.c: rtptheorapay: fix length encoding in packed headers. As for vorbis payloader; this by inspection had the same bug. 2009-04-01 17:23:33 -0700 Michael Smith * gst/rtp/gstrtpvorbispay.c: rtpvorbispay: in packed headers, properly flag multibyte lengths. In the sequence of header lengths, for headers >127 bytes, we use multiple bytes to encode the length. Bytes other than the last must have the top (flag) bit set. 2009-04-02 00:20:02 +0100 Jonathan Matthew * ext/taglib/gstid3v2mux.cc: * tests/check/elements/id3v2mux.c: id3v2mux: write RVA2 frames containing peak/gain volume data 2009-04-02 00:05:14 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: demote some log message from DEBUG to LOG And log decoder object. 2009-04-01 21:15:02 +0100 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: implement basic QoS Don't decode frames that are going to be too late anyway. 2009-04-01 12:26:12 +0100 Tim-Philipp Müller * gst/rtsp/gstrtspsrc.c: rtspsrc: don't emit ugly warnings with older rtpjitterbuffer versions The on-npt-stop signals was added only recently to rtpjitterbuffer in -bad, so check if the signal exists before g_signal_connect()ing to it, to avoid warnings. 2009-03-31 19:08:37 +0200 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: add proxy support 2009-03-31 17:16:04 +0300 Stefan Kost * gst/matroska/matroska-mux.c: matroska: don't leak serialized values when writing tags 2009-03-31 17:06:50 +0300 Stefan Kost * gst/matroska/matroska-demux.c: matroska: don't alter passed data and especialy don't leak. If we need different size, Make a copy, work with that and free it. 2009-03-31 16:42:15 +0300 Stefan Kost * gst/goom/plugin_info.c: goom: the structure is not fully initialized, but the copied. Set to fully to 0 to avoid creep of uninitialized values. 2009-03-31 16:25:58 +0300 Stefan Kost * gst/matroska/matroska-mux.c: matroska: init endianess as such and signedness as boolean. 2009-03-31 16:22:42 +0300 Stefan Kost * gst/qtdemux/qtdemux.c: qtdemux: don't use ininitialized var in debug log statement Also make the log statement useful by printing the human readable format name. 2009-03-31 12:01:21 +0300 Stefan Kost * gst/qtdemux/qtdemux.c: qtdemux: don't leak atom data in case of a wrong fourcc 2009-03-31 11:57:36 +0300 Stefan Kost * gst/matroska/matroska-demux.c: matroska: don't leak read data in demuxer 2009-03-31 11:50:41 +0300 Stefan Kost * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: udp: don't use protocol in debug message after freeing 2009-03-30 14:10:15 +0100 Tim-Philipp Müller * gst/rtp/gstrtpmp4adepay.c: rtpmp4adepay: output should be framed already 2009-03-27 21:17:05 +0000 Tim-Philipp Müller * configure.ac: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.c: * ext/flac/gstflacenc.h: flac: require a 'newer' flac and remove support for the legacy flac API 2009-03-27 17:48:13 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: link to the on_npt_stop signal to EOS Connect to the on_npt_stop signal of the session manager to schedule the EOS actions. 2009-03-26 14:39:06 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: some stream synchronization to aid seeking in unbalanced clips Some clips (trailers) may have (length-wise) unbalanced streams, which stalls the pipeline if seeking into that region. Additional stream synchronization can handle this, as well as sparse (subtitle) streams (at some later time ?) 2009-03-26 10:31:18 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: additional safety and sanity checks (push based mode) 2009-03-26 10:18:31 +0100 Wim Taymans * gst/videomixer/videomixer.c: videomixer: some more indent fixes 2009-03-24 16:00:58 +0100 Wim Taymans * gst/videomixer/videomixer.c: videomixer: fix gst-indent screwup 2009-03-25 17:54:35 +0000 Tim-Philipp Müller * gst/rtsp/gstrtsp.c: * gst/rtsp/gstrtspsrc.c: * po/POTFILES.in: rtspsrc: better error message when the RTSP extension for Real streams is missing Try to post a decent error message when it looks like we're failing because the Real RTSP extension plugin is missing. Also add i18n bits for rtspsrc so our error messages get translated. 2009-03-25 15:42:15 +0000 Tim-Philipp Müller * gst/avi/gstavi.c: * gst/qtdemux/quicktime.c: i18n: make sure gettext gives us UTF-8 at all times 2009-03-25 01:28:38 +0000 Tim-Philipp Müller * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4apay.c: rtpmp4apay,rtpmp4depay: fix buffer leaks in AAC payloader and depayloader 2009-03-25 01:22:17 +0000 Tim-Philipp Müller * gst/rtp/gstrtpmp4apay.c: rtpmp4apay: warn if input is unframed 2009-03-22 21:20:57 +0000 Tim-Philipp Müller * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegdec.h: jpegdec: put GstSegment inside the element struct instead of allocating it separately 2009-03-25 10:08:41 +0200 Stefan Kost * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: v4l2src: move duplicated timestamping and buffer metadata code to _create() This will include the latency changes also in the mmap case. 2009-03-25 10:06:48 +0200 Stefan Kost * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: v4l2src: remove win32 ifdefs introduced by commit cff3f46760eac74c9bbd7a36aca44fedf327424b V4l2src is under sys and does not exists/run under windows anyway. 2009-03-24 15:44:42 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: handle FLUSH_STOP event Clean up some state (most notably pad flow returns) to resume proper streaming following flushing seek. 2009-03-24 12:42:13 +0100 Alessandro Decina * gst/avi/gstavidemux.c: avidemux: don't post an error if EOS can't be pushed downstream. This aligns avidemux with other demuxers and fixes a bug using avidemux with a recent gnonlin. 2009-03-23 11:22:08 +0100 Wim Taymans * ext/pulse/pulsesink.c: pulsesink: clean up the state change function Make the state change function a bit more readable and only pause after the parent had a change to pause first. 2009-03-20 17:22:32 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: support seeking in push based mode 2009-03-20 17:11:39 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: align push based behaviour more with pull based Cater for DELTA_UNIT flag on buffers, keep track of current position, remove and warn about edit lists if any (as those as are de facto discarded anyway), add some debug statements and indent fixes. 2009-03-20 17:03:03 +0100 Mark Nauwelaerts * gst/qtdemux/qtdemux.c: qtdemux: fix mem leaks and prevent excessive buffering in push based mode 2009-03-20 13:27:59 +0000 Jan Schmidt * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: Track the corked/uncorked state ourselves Use an instance variable to track whether the stream is corked or not, instead of using PA API that was only introduced in 0.9.11 2009-03-19 18:39:04 +0000 Jan Schmidt * ext/pulse/pulsesink.c: pulse: Make sure the stream is uncorked in the write function If the caps changes, the sink is reset without transitioning through a PAUSED->PLAYING state change, resulting in a corked stream. This avoids the problem by checking that the stream is uncorked when writing samples to it. 2009-03-20 01:02:26 +0000 Tim-Philipp Müller * ext/speex/gstspeexenc.c: speexenc: fix direction of latency query and other upstream queries Don't send queries back to the element they just came from by sending them to the peer of the wrong pad. 2009-03-19 11:10:40 +0000 Tim-Philipp Müller * .gitignore: * tests/check/elements/.gitignore: .gitignore: ignore more 2009-03-18 16:55:27 +0000 Tim-Philipp Müller * gst/rtp/gstrtpmp4adepay.c: rtpmp4adepay: don't append an extra 0 byte to the codec data The audioMuxVersion structure is packed in such a way that the codec data does not start byte-aligned, which means there's an extra bit of padding at the end. We don't want that bit in the codec data, since some decoders seem get confused when they're fed with an extra codec data byte (also it's just not right of course). 2009-03-19 13:25:57 +0100 Wim Taymans * gst/rtp/gstrtph264depay.c: rtph264depay: fix base64 decoding We can't pass -1 to _decode_step, that functions returns 0 right away instead of decoding up to the string end. 2009-03-19 13:24:02 +0100 David Adam * gst/udp/gstudpnetutils.c: udp: Fix build if on Solaris This patch checks for Solaris and uses ip_mreq instead of ip_mreqn if on this platform. Fixes #575937. 2009-03-18 14:50:17 +0100 Sebastian Dröge * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbispay.c: rtp: Use GLib functions for encoding/decoding base64 2009-03-16 19:17:24 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: add some debug for the timestamps When timestamping in TCP mode, log the first timestamp we put on the buffers. 2009-03-15 23:26:56 +0200 Stefan Kost * sys/v4l2/v4l2src_calls.c: v4l2src: log details if we have them, needed for #575391 2009-03-13 18:32:47 +0100 Wim Taymans * gst/udp/gstudpsrc.c: udpsrc: convert _ in properties to - -- 2009-03-13 18:28:59 +0100 Edgar E. Iglesias * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpnetutils.c: * gst/udp/gstudpnetutils.h: * gst/udp/gstudpsrc.c: * gst/udp/gstudpsrc.h: udpsrc: Add network interface selection Add network interface selection when joining multicast groups. Useful when using the udpsrc on multihomed hosts. Fixes #575234. API: GstUDPSrc::multicast-iface 2009-03-13 15:43:52 +0000 Jan Schmidt * sys/v4l2/v4l2_calls.c: v4l2src: Prepend to lists and reverse them at the end. Gratuitous micro-optimisation - prepend to lists and reverse them, rather than appending to them each time. 2009-03-13 15:40:50 +0000 Jan Schmidt * ext/pulse/pulsesink.c: pulsesink: Wait until there is enough room to write an entire segment When trying to write out a segment, wait until there is enough free space for the entire segment. This helps to reduce ripple in the clock reporting, where the app might query the playback position while only half a segment has been written (and is therefore reported by _delay(), even though the ring buffer has not yet been advanced) 2009-03-12 20:38:42 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: don't send PAUSE when not connected don't send a PAUSE request when we are no longer connected. 2009-03-12 16:10:25 +0100 Laszlo Pandy * ext/flac/gstflacdec.c: Don't call FLAC__ methods before it's initialized. Fixes #516031 In the event handler, gst_flac_dec_sink_event(), two functions are called on the FLAC stream without checking if it has been initialized: FLAC__stream_decoder_flush() FLAC__stream_decoder_process_until_end_of_stream() Both these FLAC__*() functions modify the internal state of the FLAC stream. Later, when the buffers start flowing, gst_flac_dec_chain() tries to initialize the stream. the FLAC__stream_decoder_init_stream() call will fail because the previous calls to FLAC__*() changed the stream state so it is no longer in the initialized state. 2009-03-11 17:59:00 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix timeout check --- 2009-03-11 12:48:03 +0000 Tim-Philipp Müller * win32/MANIFEST: win32: update MANIFEST, fixing 'make dist' config.h.in no longer exists. 2009-03-10 21:14:43 +0200 Stefan Kost * gst/multipart/Makefile.am: makefile: fix typo in no-static plugins rule 2009-03-10 11:01:16 +0100 Wim Taymans * ext/libpng/gstpngdec.c: pngdec: various cleanups. Make some code more readable. Fix a leak when pull range returns a shot buffer. Push EOS after posting the error. 2009-03-10 10:16:27 +0100 Edward Hervey * gst/rtp/gstrtpvorbisdepay.c: gstrtpvorbisdepay: Fix build on macosx 2009-03-01 17:37:56 +0100 Edward Hervey * .gitignore: .gitignore: Ignore m4 directory 2009-03-09 23:12:33 +0000 Jan Schmidt * common: Automatic update of common submodule From 7032163 to f8b3d91 2009-03-09 18:07:20 +0100 Wim Taymans * gst/rtp/gstrtpvorbisdepay.c: vorbisdepay: fix some leaks And leak the codebooks. Use glib base64 decoders. Use subbuffers to avoid a memcpy of the headers. 2009-03-09 17:14:12 +0100 Wim Taymans * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: flacdec: don't lose the first buffer after a seek The flacdec API calls the write callback when performing a seek. We cannot yet push out a buffer at that time so we must keep it and push it out later. Flush out the upstream part of the pipeline when doing a seek. Fixes #574275. 2009-03-09 15:20:05 +0100 Wim Taymans * gst/qtdemux/qtdemux.c: qtdemux: sanitize tag names Sanitize the tag names before turning them into a structure name. We can only add alphanumeric values as the structure name. 2009-03-08 12:04:22 +0100 Sebastian Dröge * common: Automatic update of common submodule From ffa738d to 7032163 2009-03-08 11:19:56 +0100 Sebastian Dröge * common: Automatic update of common submodule From 3f13e4e to ffa738d 2009-03-07 11:45:35 +0100 Sebastian Dröge * common: Automatic update of common submodule From 3c7456b to 3f13e4e 2009-03-07 10:45:40 +0100 Sebastian Dröge * common: Automatic update of common submodule From 57c83f2 to 3c7456b 2009-03-06 21:56:26 +0200 Stefan Kost * sys/v4l2/v4l2src_calls.c: v4l2src: fix pads, so that they are subset of template caps Do not add w=0 | h=0. When we can't get a framerate add fraction range. 2009-03-05 14:08:14 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: fix range parsing Fix parsing of the range headers. 2009-02-10 17:20:57 +0000 Olivier Crête * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpsirendepay.c: * gst/rtp/gstrtpsirendepay.h: * gst/rtp/gstrtpsirenpay.c: * gst/rtp/gstrtpsirenpay.h: Move siren rtp pay/depay from gst-plugins-farsight 2009-03-04 16:25:34 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix memory leak in close Close the connection even when we fail to send the teardown message. Use the connection url (which is a copy of the src url). 2009-03-04 16:15:05 +0100 Peter Kjellerstedt * tests/check/Makefile.am: check: gst-plugins-good.supp needs to be distributed. 2009-03-04 12:29:50 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: fix do-rtcp property description --- 2009-03-03 12:20:27 +0100 Edward Hervey * ext/soup/gstsouphttpsrc.c: * ext/soup/gstsouphttpsrc.h: souphttpsrc: Expose the SoupSession 'timeout' property. 2009-03-02 15:07:24 +0100 Edward Hervey * .gitignore: .gitignore: Ignore the m4/ directory 2009-03-02 17:18:55 +0100 Wim Taymans * gst/rtp/gstrtpmp4vpay.c: rtpmp4vpay: Add support for more formats Hack around short header mpeg4 video files and put the short header as the config string. Fixes #572551. 2009-03-02 16:08:23 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: rtspsrc: add support for http tunneling Add support for http tunneling and a new rtsph:// uri for it. See #573173. 2009-03-02 09:43:30 +0100 Thomas Vander Stichele Merge branch 'master' of ssh://thomasvs@git.freedesktop.org/git/gstreamer/gst-plugins-good 2009-03-02 08:41:15 +0100 Thomas Vander Stichele * ext/flac/gstflacdec.c: Add/clarify/fix some logging. 2009-03-01 12:47:37 -0800 David Schleef * sys/osxvideo/Makefile.am: Remove hardcoded definition of OBJC 2009-03-01 19:55:26 +0100 Sjoerd Simons * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: Wait for a frame to become available before capturing it Use GstPoll to wait for the fd of the video device to become readable before trying to capture a frame. This speeds up stopping v4l2src a lot as it no longer has to wait for the next frame, especially when capturing with low framerates or when the video device just never generates a frame (which seems a common issue for uvcvideo devices) Fixes bug #563574. 2009-02-14 17:56:05 +0000 Tim-Philipp Müller * gst/law/alaw-decode.c: * gst/law/mulaw-decode.c: alawdec, mulawdec: demote some debug messages from ERROR to WARNING or DEBUG Non-ok flow returns may happen for a variety of perfectly legitimate and expected reasons (temporarily not linked, seeking, pipeline shutdown), so we really shouldn't spew ERROR debug messages to stderr in those cases. Fixes #570781. (Seems like someone already took care of some of these.) 2009-02-28 15:26:00 +0200 René Stadler * gst/replaygain/gstrgvolume.c: rgvolume: Improve log message for peak values >1.0 by clamping explicitly. 2009-02-27 23:25:32 -0800 David Schleef * ext/dv/gstdvdec.c: Fix the field dominance PAL is TFF, NTSC is BFF. Some day I will learn to keep this straight. 2009-02-27 20:40:31 +0100 LRN * sys/directdraw/gstdirectdrawsink.c: directdrawsink: Fix type mismatches Fixes bug #573343. 2009-02-27 20:28:27 +0100 Sebastian Dröge Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good 2009-02-27 20:24:53 +0100 LRN * gst/udp/gstudpnetutils.c: udp: Don't set errno to EAFNOSUPPORT unconditionally Fixes bug #573342. 2009-02-27 11:17:50 -0800 Michael Smith * gst/replaygain/gstrgvolume.c: rgvolume: ignore out-of-range peak values If the peak value is > 1 (and thus nonsensical) ignore it. Prevents rgvolume reducing volume to effectively silent on files with bogus peak values. 2009-02-27 13:29:41 +0100 Mark Nauwelaerts * gst/wavparse/gstwavparse.c: wavparse: Fix SEEK event handling in push mode, and SEEKABLY query handling Standard pull mode loop based SEEK handling fails in push mode, so convert the SEEK event appropriately and dispatch to upstream. Also cater for NEWSEGMENT event handling, and properly inform downstream and application of SEEKABLE capabilities, depending on scheduling mode and upstream. 2009-02-27 11:04:08 +0100 Edward Hervey * gst/matroska/matroska-demux.c: matroskademux: Remove gst_util_dump_mem() calls. 2009-02-26 19:07:35 +0100 Julien Moutte * gst/avi/gstavidemux.c: avidemux: fix SEEK event handling in push mode When in push mode we should not try to handle the SEEK event as there's no code to handle it properly. Propagate upstream. 2009-02-26 19:05:06 +0100 Patrick Radizi * gst/rtsp/gstrtspsrc.h: rtspsrc: add the .h file change too Add the .h file change for the new property. 2009-02-26 19:03:52 +0100 Patrick Radizi * gst/rtsp/gstrtspsrc.c: rtspsrc: add property to disable RTCP Some old servers don't like us doing RTCP and thus we need a property to disable it. See #573173. 2009-02-26 13:19:31 +0100 Jan Smout * gst/udp/gstudpnetutils.c: udp: fix gst_udp_set_loop_ttl() again Fix the gst_udp_set_loop_ttl() function that was commented out in a previous commit. See #573115. 2009-02-26 13:06:17 +0100 Wim Taymans * gst/rtp/gstrtpvrawdepay.c: rtpvrawdepay: fail on interlaced video Fail on interlaced video until we support it. 2009-02-26 13:00:58 +0100 Wim Taymans * gst/rtp/gstrtpvrawpay.c: rtpvrawpay: fail on interlaced video Detect and fail when trying to payload interlaced video. 2009-02-25 20:47:15 -0800 David Schleef * Makefile.am: * configure.ac: * win32/common/config.h.in: Change how win32/common/config.h is updated Generate win32/common/config.h-new directly from config.h.in, using shell variables in configure and some hard-coded information. Change top-level makefile so that 'make win32-update' copies the generated file to win32/common/config.h, which we keep in source control. It's kept in source control so that the git tree is buildable from VS. This change is similar to the one recently applied to GStreamer and gst-plugins-good. The previous config.h file in -good was in pretty bad shape, so unlike core and base, I didn't attempt to leave it strictly the same, but fixed it as necessary. Needs testing I cannot do myself. 2009-02-25 19:58:29 -0800 David Schleef * ext/dv/gstdvdec.c: * ext/dv/gstdvdec.h: dvdec: Add interlacing info to caps and buffers 2009-02-25 14:57:33 +0000 Jan Schmidt * common: * configure.ac: build: Update shave init statement for changes in common. Bump common. 2009-02-25 14:01:26 +0100 Wim Taymans * gst/udp/gstudpsrc.c: udpsrc: fix compilation Fix compilation on systems MSG_ERRQUEUE and IP_RECVERR. 2009-02-19 20:14:10 +0000 Tim-Philipp Müller * ext/jpeg/gstjpegenc.c: jpegenc: error out instead of crashing if no caps have been set Don't crash if we receive a buffer without caps. Fixes #572413. 2009-02-25 11:35:31 +0100 Peter Kjellerstedt * gst/udp/gstudpsrc.c: udpsrc: Make sure the sockaddr length used for recvfrom() is big enough. Previously the sockaddr length used for recvfrom() was calculated as sizeof (struct sockaddr). However, this is too little to hold an IPv6 address, so the full size of the gst_sockaddr union should be used instead. 2009-02-25 11:32:28 +0100 Peter Kjellerstedt * gst/udp/gstudpsrc.c: udpsrc: Unify the use of union gst_sockaddr. 2009-02-25 11:32:07 +0000 Jan Schmidt * common: Automatic update of common submodule From 9cf8c9b to a6ce5c6 2009-02-25 12:05:22 +0100 Wim Taymans * gst/avi/gstavidemux.c: avidemux: avoid crashing on subtitles Avoid a crash in avi with subtitles by only dereferencing the video description when we actually are dealing with video in the _invert function. 2009-02-24 17:58:32 +0000 Jan Schmidt * gst/udp/gstudpsrc.c: udp: Fix strict-aliasing warnings from gcc 4.4.0 Fix strict aliasing warnings by defining a union on the different sockaddr structs that we need. 2009-02-24 17:35:46 +0000 Tim-Philipp Müller * gst/rtp/gstrtph264pay.c: rtp: Fix compiler warning in h264 payloader Fix an undefined behaviour warning from gcc 4.4.0 Patch By: Tim-Philipp Müller Fixes: #570995 Signed-Off-By: Jan Schmidt 2009-02-22 17:23:09 +0000 Jan Schmidt * configure.ac: * docs/plugins/Makefile.am: Use shave for the build output 2009-02-24 14:55:28 +0100 Sebastian Dröge * ext/gconf/Makefile.am: * ext/gconf/gconf.c: * ext/gconf/gconf.h: * ext/gconf/gstgconf.c: * ext/gconf/gstgconf.h: * ext/gconf/gstgconfelements.h: gconf: Rename gconf.[ch] to gstgconf.[ch] to prevent name conflicts 2009-02-24 14:41:26 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: qtdemux: Also use "(c)inf" to fill the comment tag 2009-01-26 11:06:13 +0100 Mark Nauwelaerts * gst/rtsp/gstrtspsrc.c: rtspsrc: perform UDP SETUP according to MS RTSP spec MS RTSP spec states that the UDP port pair used in subsequent SETUP requests for various streams must be identical (since there will actually be only 1 stream of muxed asf packets). Following traditional specs and using different port pairs in the SETUPs for separate streams will result in all but the first one failing and only one stream being streamed. So, in appropriate circumstances, retry UDP SETUP using previously used port pair. Fixes #552650. 2009-02-23 20:49:37 +0100 Aurelien Grimaud * gst/udp/gstudpsrc.c: Read ICMP error messages instead of looping When we are dealing with connected sockets shared between a udpsrc and a udpsink we might receive ICMP connection refused error messages in udpsrc that will cause it to go into a bursty loop because the poll returns right away without a message to read. Instead of looping, read the error message from the error queue in udpsrc. Fixes #567857. 2009-02-23 19:53:58 +0100 Wim Taymans * sys/v4l2/gstv4l2src.c: Conditionally compile code for YVYU Only compile the code for the YVYU format when the format is actually defined. Spotted by tmatth on IRC. 2009-02-17 11:01:47 -0800 Levente Farkas * sys/v4l2/v4l2src_calls.c: v4l2src: Make sort_by_frame_size conditionally compiled sort_by_frame_size is declared static and only used inside an ifdef, so use the same ifdef to define the function. Fixes #572185 Signed-off-by: David Schleef 2009-02-23 17:05:43 +0100 Wim Taymans * sys/v4l2/gstv4l2src.c: Add YVYU format to caps Add YVYU format to the caps. We don't have anything to handle these caps yet, though. 2009-02-23 15:48:41 +0100 Wim Taymans * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstjpegenc.h: Some cleanups Remove some unused variables. Avoid a useless _resync call. Correctly use a gboolean. 2009-02-23 15:43:51 +0100 Wai-Ming Ho * gst/rtp/gstrtph264pay.c: Always add PPS to the sprop-parameters-set Rework the parsing code that under certain circumstances dropped the PPS from the sprop-parameters-set. Fixes #572854. 2009-02-23 12:14:23 +0100 Arnout Vandecappelle * gst/matroska/matroska-mux.c: Don't do crazy things with 0/1 framerates We use 0/1 framerates to mark variable framerates and matroskamux should not try to calculate a frame duration for it. Fixes #571294. 2009-02-23 11:45:50 +0100 Wim Taymans * configure.ac: Require newer gst-p-b for the RTSP extensions. -- 2009-02-23 11:42:53 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: Call new receive_request method Call the receive_request extension methods so that extensions can handle the server request if they want. 2009-02-23 11:13:30 +0100 Wim Taymans * gst/rtsp/gstrtspext.c: * gst/rtsp/gstrtspext.h: Add method for hadling server requests Add method to handle server requests on the list of RTSP extensions. 2009-02-13 14:39:29 +0100 Wim Taymans * gst/law/alaw-decode.c: * gst/law/mulaw-decode.c: Don't use GST_ERROR for non-error cases. Turn a GST_ERROR line into a GST_DEBUG line so that we don't spam the log with errors. Fixes #570781. 2009-02-22 19:30:32 +0100 Sjoerd Simons * ext/gconf/gstgconfvideosink.c: * ext/gconf/gstgconfvideosink.h: * ext/gconf/gstgconfvideosrc.c: * ext/gconf/gstgconfvideosrc.h: gconfvideo(src|sink): Disconnect GConf notifications Fixes bug #571321. 2009-02-22 19:25:39 +0100 Sebastian Dröge * gst/matroska/matroska-demux.c: matroskademux: Unref the buffer and not the memory address of the buffer 2009-02-22 18:47:35 +0100 Olivier Crete * gst/law/alaw-decode.c: * gst/law/mulaw-decode.c: alaw/mulaw: Implement _getcaps function for alaw/mulaw decoders Fixes bug #572358. 2009-02-22 18:46:03 +0100 Olivier Crete * gst/law/alaw-encode.c: * gst/law/mulaw-encode.c: alaw/mulaw: Don't require both, rate and channel, to be set in _getcaps Fixes bug #572358. 2009-02-22 18:32:02 +0100 Sebastian Dröge * gst/avi/gstavidemux.c: avidemux: Fix alignment issues by using GST_READ_* Reading integers from random memory addresses will result in SIGBUS on some architectures if the memory address is not correctly aligned. This can happen at two places in avidemux so we should use GST_READ_UINT32_LE and friends here. Fixes bug #572256. 2009-02-22 18:08:59 +0100 Sebastian Dröge * ext/pulse/pulsemixerctrl.c: pulsemixer: Don't use g_atomic_int_(get|set) for accessing the mixer track flags g_atomic_int_(get|set) only work on ints and the flags are an enum (which on most architectures is stored as an int). Also the way the flags were accessed atomically would still leave a possible race condition and we don't do it in any other mixer track implementation, let alone at any other place where an integer could be changed from different threads. Removing the g_atomic_int_(get|set) will only introduce a new race condition on architectures where integers could be half-written while reading them which shouldn't be the case for any modern architecture and if we really care about this we need to use g_atomic_int_(get|set) at many other places too. Apart from that g_atomic_int_(set|get) will result in aliasing warnings if their argument is explicitely casted to an int *. Fixes bug #571153. 2009-02-22 15:52:06 +0000 Jan Schmidt * common: Automatic update of common submodule From 5d7c9cc to 9cf8c9b 2009-02-22 12:41:53 +0100 Sebastian Dröge * ext/raw1394/gsthdv1394src.c: hdv1394src: Don't use void * pointer arithmetic 2009-02-21 11:13:43 -0800 David Schleef * common: Automatic update of common submodule From 80c627d to 5d7c9cc 2009-02-21 18:42:46 +0000 Jan Schmidt * configure.ac: Back to development -> 0.10.14.1 2009-02-21 12:47:00 +0100 Thomas Vander Stichele * ext/flac/gstflacdec.c: respect DEFAULT segment by clipping the last buffer to be sent === release 0.10.14 === 2009-02-19 20:09:07 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.14 2009-02-19 20:07:41 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files 2009-02-19 13:16:39 +0000 Jan Schmidt * gst/audiofx/audioecho.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautovideosrc.c: Update Since: tags in autodetect srcs and audioecho 2009-02-19 11:12:58 +0000 Jan Schmidt * ChangeLog: Update ChangeLog for 0.10.13.3 2009-02-19 11:09:03 +0000 Jan Schmidt * configure.ac: * win32/common/config.h: 0.10.13.3 pre-release 2009-02-10 11:25:49 +0100 Mark Nauwelaerts * ext/pulse/pulsemixerctrl.c: pulsemixer: Fix compiler warnings. Cast (enum *) to (int *), not necessarily technically right, but plugs #571153. 2009-02-13 18:03:14 +0100 Mark Nauwelaerts * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: pulsesink: Issue property change notification in streaming thread, rather than PA thread. pa_threaded_mainloop_lock() (a.o.) and by extension get_property should not be done from a PA thread, but the latter may occur as a result of a property change notification. Fixes #571204 (though current situation not ideal, e.g. post message rather than signal). 2009-02-10 11:27:51 +0100 Edward Hervey * gst/videocrop/gstaspectratiocrop.c: aspectratiocrop: Don't forget to call parent finalize implementation. This fixes a memory leak (leaking the contained elements of the bin). 2009-02-10 08:43:59 +0100 Edward Hervey * sys/osxvideo/osxvideosink.m: osxvideosink: Fix build. Fixes #571038 2009-02-09 12:18:36 +0100 Edward Hervey * common: Bump revision to use for common submodule. 2009-02-07 16:00:49 +0000 Jan Schmidt * ChangeLog: ChangeLog: Update ChangeLog for 0.10.13.2 2009-02-07 15:58:55 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/mt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: po: Update translations for 0.10.13.2 2009-02-07 15:46:07 +0000 Jan Schmidt * configure.ac: * win32/common/config.h: Release 0.10.13.2 2009-02-07 15:40:53 +0000 Jan Schmidt * po/LINGUAS: * po/mt.po: po: Add Maltese translation 2009-02-06 16:16:05 -0800 David Schleef * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_dump.c: * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: qtdemux: Add handling for stps atoms stps atoms contain "partial sync" information, which means that it's a sync point where pts != dts. This is needed to properly handle MPEG2, H.264, Dirac, etc., in quicktime. 2009-02-05 15:51:42 -0800 Michael Smith * ext/flac/gstflacdec.c: flacdec: if we aborted reading, don't do into an infinite loop. If our read callback ran out of data, so had to abort reading, we return GST_FLOW_ERROR instead of going into an infinite loop. 2009-02-05 10:19:37 -0800 Michael Smith * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: osxvideosink: remove non-embedded mode and fix memory management. Remove non-embedded mode. Embed mode becomes default and only mode. embed property is retained for binary compatibility. Added autorelease pools around all objc functions that might be called from a non-main thread. 2009-02-05 20:02:01 +0100 Thomas Vander Stichele * ext/flac/gstflacdec.c: debug on the object 2009-02-04 16:40:13 -0800 Michael Smith * sys/osxaudio/gstosxringbuffer.c: osxaudio fixes: multichannel and changing caps. Ensure we create the ringbuffer segment size as a multiple of the bytes per sample (fixes 6-channel output). Reset the segoffset when acquiring the ringbuffer, so we don't retain a bogus offset when caps change. 2009-02-04 11:38:30 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: rtspsrc: Keep track of connected state Keep track of the state of the connection and don't try to send TEARDOWN when the server has closed the connection. 2009-02-04 09:20:28 +0100 Robin Stocker * gst/matroska/matroska-demux.c: Read Matroska Title element for the TITLE tag Not all Matroska files have a Tags element which contains information about the title among other things. Most video Matroska files only contain the Title element so we should parse this too. Fixes bug #570435. 2009-02-03 22:34:38 +0000 Tim-Philipp Müller * configure.ac: configure.ac: bump core/base requirements to released versions 2009-02-03 17:10:30 +0100 Sebastian Dröge * tests/check/elements/audioecho.c: Fix audioecho unit test on 32 bit systems Cast the new value for the "delay" property to GstClockTime. Integers without type are passed to vararg functions with an integer type that can hold a pointer. 2009-02-03 14:09:26 +0200 Stefan Kost * gst/equalizer/gstiirequalizer.c: equalizer: Don't reset frequency bands from user settings. Fixes #570343. Move reallocating the history buffer out of _compute_frequencies() and call the right function as needed. Add some logging and tweak the formatting of existing logging. Simplify setting need_new_coefficients when changing properties. 2009-02-03 11:52:15 +0100 Sebastian Dröge * gst/audiofx/audioecho.c: Use guint64 instead of guint for storing guint64 2009-02-02 18:37:35 +0100 Jonathan Matthew * ext/soup/gstsouphttpsrc.c: Use correct flag for the GNOME proxy configuration Fixes bug #552140. 2009-02-02 13:08:14 +0100 Wim Taymans * tests/icles/v4l2src-test.c: Fix compiler warnings fix compiler warnings due to unused return values of scanf. 2009-01-31 11:08:30 +0100 Sebastian Dröge * tests/icles/v4l2src-test.c: Fix format string compiler warning 2009-01-30 22:24:14 +0200 Stefan Kost * docs/plugins/gst-plugins-good-plugins-docs.sgml: Add releaseinfo with online url. 2009-01-30 18:04:11 +0000 Jan Schmidt * tests/check/Makefile.am: * tests/icles/Makefile.am: Fix up some compile flags 2009-01-30 17:35:49 +0000 Jan Schmidt * gst/videocrop/gstvideocrop.c: Don't use Glib 2.16 function g_strcmp0. 2009-01-30 17:34:45 +0000 Jan Schmidt * gst/qtdemux/qtdemux.c: Don't do void pointer arithmetic 2009-01-30 17:26:19 +0000 Jan Schmidt * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: Fix Forte compiler warnings. Don't do void pointer arithmetic. Don't have an unreachable statement. 2009-01-30 17:29:45 +0000 Jan Schmidt * common: Bump common 2009-01-26 10:33:55 +0100 Edward Hervey * gst/avi/gstavidemux.c: Remove useless processing for non-raw formats 2009-01-30 15:34:31 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: Add support for the 'Requirement' and 'Encoder' tags 2009-01-30 15:33:19 +0100 Edward Hervey * gst/qtdemux/qtdemux.c: Modify private-tag name formatter so that it doesn't go mad at fourcc starting with '(c)'. 2009-01-30 14:40:51 +0100 Brijesh Singh * sys/v4l2/gstv4l2tuner.c: Fix comparison of the tuner norms The V4L2 tuner norms that a device supports could be a subset of some norm (e.g. NTSC instead of NTSC_M). The comparison should be done by & instead of ==. See http://www.linuxtv.org/downloads/video4linux/API/V4L2_API/spec-single/v4l2.html#STANDARD Fixes bug #569820. 2009-01-30 08:53:06 +0100 Edward Hervey * autogen.sh: * common: Use a symbolic link for the pre-commit client-side hook 2009-01-29 14:08:56 +0100 Thijs Vermeir * gst/videocrop/gstaspectratiocrop.c: Only unref the peer when there is one. 2009-01-29 11:07:59 +0200 Stefan Kost * gst/avi/gstavimux.c: * gst/interleave/deinterleave.c: * gst/interleave/interleave.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directsound/gstdirectsoundsink.c: * sys/osxvideo/osxvideosink.m: * sys/v4l2/gstv4l2src.c: * sys/waveform/gstwaveformsink.c: Remove version numbers from a few gst-launch examples. The majority of the examples doe not use -0.10 and this will also help us to maintain the docs. 2009-01-29 10:10:08 +0200 Stefan Kost * sys/directdraw/gstdirectdrawsink.c: * sys/directsound/gstdirectsoundsink.c: * sys/oss/gstossmixerelement.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxvideo/osxvideosink.m: * sys/sunaudio/gstsunaudiomixer.c: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosrc.c: * sys/v4l2/gstv4l2src.c: * sys/waveform/gstwaveformsink.c: * sys/ximage/gstximagesrc.c: Update and add documentation for platform specific plugins (sys). Link to properties. Correct titles for examples. Fix examples. 2009-01-29 09:45:25 +0200 Stefan Kost * gst/multipart/multipartmux.c: Add ' to framerate argument and remove the word 'simple' as all our pipelines are apparently simple. 2009-01-29 09:42:56 +0200 Stefan Kost * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: Add examples for the jpeg elements. 2009-01-28 21:40:11 +0000 Jan Schmidt * ext/pulse/pulsesink.c: Fix compile error in the last commit 2009-01-28 20:34:40 +0000 Jan Schmidt * configure.ac: * ext/pulse/pulseprobe.c: * ext/pulse/pulseprobe.h: * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: * ext/pulse/pulsesrc.c: * ext/pulse/pulsesrc.h: * ext/pulse/pulseutil.c: * ext/pulse/pulseutil.h: Rewrite the pulse plugin, conditionally enabling new behaviour with newer pulseaudio. Fixes: #567794 * Hook pulsesink's volume property up with the stream volume -- not the sink volume in PA. * Read the device description directly from the sink instead of going via the mixer. * Properly implement _reset() methods for both sink and source to avoid deadlocks when shutting down a pipeline. * Replace all simple pa_threaded_mainloop_wait() by proper loops to guarantee that we wait for the right event in case multiple events are fired. While this is not strictly necessary in many cases it certainly is more correct and makes me sleep better at night. * Replace CHECK_DEAD_GOTO macros with proper functions * Extend the number of supported channels to 32 since that is the actual limit in PA. * Get rid of _dispose() methods since we don't need them. * Increase the volume property upper limit of the sink to 1000. * Reset function pointers after we disconnect a stream/context. Better fix for bug 556986. * Reset the state of the element properly if open/prepare fails * Cork the PA stream when the pipeline is paused. This allows the PA * daemon to close audio device on pause and thus save a bit of power. * Set PA stream properties based on GST tags such as GST_TAG_TITLE, GST_TAG_ARTIST, and so on. Signed-off-by: Lennart Poettering 2009-01-28 17:46:06 +0200 Stefan Kost * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/aalib/gstaasink.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttimeoverlay.c: * ext/dv/gstdvdec.c: * ext/dv/gstdvdemux.c: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfaudiosrc.c: * ext/gconf/gstgconfvideosink.c: * ext/gconf/gstgconfvideosrc.c: * ext/gdk_pixbuf/gstgdkpixbufsink.c: * ext/hal/gsthalaudiosink.c: * ext/hal/gsthalaudiosrc.c: * ext/hal/hal.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokedec.c: * ext/jpeg/gstsmokeenc.c: * ext/libcaca/gstcacasink.c: * ext/libcaca/gstcacasink.h: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/pulse/pulsemixer.c: * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gsthdv1394src.c: * ext/soup/gstsouphttpsrc.c: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * ext/taglib/gstapev2mux.cc: * ext/taglib/gstid3v2mux.cc: * ext/wavpack/gstwavpackdec.c: * ext/wavpack/gstwavpackenc.c: * ext/wavpack/gstwavpackparse.c: * gst/matroska/matroska-mux.h: * gst/udp/gstudpsrc.c: Update and add documentation for plugins with deps (ext). Link to properties. Correct titles for examples. Document a few trivial cases. Keep lists in section file and docs/plugins/Makefile.am alphabetically ordered. Fix warnings that gtk-doc points out. 2009-01-28 15:57:20 +0100 Sebastian Dröge * gst/audiofx/audioecho.c: * gst/audiofx/audioecho.h: Limit the delay by a new max-delay property Introduce a new max-delay property that can only be set before going to PLAYING or PAUSED. This is used to limit the maximum delay and is set to the current delay by default. Using this will make sure that we have enough data in our internal ringbuffer for the echo. With dynamic reallocation of the ringbuffer as used before silence could've been used as the echo directly after setting a new delay. 2009-01-28 11:58:42 +0100 Edward Hervey * win32/common/config.h: Revert previous bogus commit 2009-01-28 12:29:42 +0200 Stefan Kost * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst/alpha/gstalphacolor.c: * gst/apetag/gstapedemux.c: * gst/audiofx/audioamplify.c: * gst/audiofx/audiochebband.c: * gst/audiofx/audiocheblimit.c: * gst/audiofx/audiodynamic.c: * gst/audiofx/audioecho.c: * gst/audiofx/audiofirfilter.c: * gst/audiofx/audioiirfilter.c: * gst/audiofx/audioinvert.c: * gst/audiofx/audiokaraoke.c: * gst/audiofx/audiopanorama.c: * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: * gst/auparse/gstauparse.c: * gst/avi/gstavidemux.c: * gst/avi/gstavimux.c: * gst/cutter/gstcutter.c: * gst/debug/gstpushfilesrc.c: * gst/debug/gsttaginject.c: * gst/debug/progressreport.c: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: * gst/equalizer/gstiirequalizernbands.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/goom2k1/gstgoom.c: * gst/icydemux/gsticydemux.c: * gst/id3demux/gstid3demux.c: * gst/law/alaw-decode.c: * gst/law/alaw-encode.c: * gst/law/mulaw-decode.c: * gst/law/mulaw-encode.c: * gst/law/mulaw.c: * gst/level/gstlevel.c: * gst/monoscope/gstmonoscope.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/qtdemux/qtdemux.c: * gst/rtp/gstrtpjpegpay.c: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspsrc.c: * gst/smpte/gstsmpte.c: * gst/smpte/gstsmptealpha.c: * gst/spectrum/gstspectrum.c: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: * gst/videobox/gstvideobox.c: * gst/videocrop/gstaspectratiocrop.c: * gst/videocrop/gstvideocrop.c: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videomixer/videomixer.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: * win32/common/config.h: Update and add documentation for plugins with no deps (gst). Link to properties. Correct titles for examples. Document a few trivial cases. Keep lists in section file and docs/plugins/Makefile.am alphabetically ordered. 2009-01-27 23:09:05 +0200 Stefan Kost * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: Fix example apps by drawing in the main-loop. 2009-01-27 20:33:02 +0000 Tim-Philipp Müller * tests/check/Makefile.am: tests: fix build of aspectratio crop unit test in uninstalled environment. 2009-01-27 20:30:02 +0000 Tim-Philipp Müller * .gitignore: Make git ignore backup files 2009-01-26 16:14:47 +0100 Peter Kjellerstedt * gst/multipart/multipartdemux.c: Plug a memory leak in a debug message. 2009-01-22 15:59:40 +0100 Peter Kjellerstedt * gst/udp/gstudpnetutils.c: Correct return value from gst_udp_get_addr() when no known family is found. 2009-01-26 09:51:36 +0100 Jonathan Matthew * configure.ac: * ext/soup/gstsouphttpsrc.c: Use libsoup-gnome for proxy configuration if available If libsoup-gnome is found use this as it will give us the GNOME proxy configuration. Otherwise use normal libsoup. The GNOME proxy configuration will only be used if the proxy properties are not set on souphttpsrc and if the http_proxy environment variable is not set. Fixes bug #552140. 2009-01-25 19:26:46 -0800 David Schleef * gst/qtdemux/qtdemux.c: Add a few more video fourcc's 2009-01-24 14:48:00 +0100 Thijs Vermeir * gst/videocrop/gstaspectratiocrop.c: * tests/check/Makefile.am: * tests/check/elements/aspectratiocrop.c: Add unit test for aspectratiocrop Fixes bug #527951 Add unit test for aspectratiocrop and refactor this element. Added finalize function to cleanup leaking mutex. 2009-01-25 14:34:09 +0000 Jan Schmidt * tests/check/elements/.gitignore: Ignore check binaries 2009-01-24 18:28:06 +0100 Sebastian Dröge * gst/audiofx/audioecho.c: Save some allocations if the echo delay is increased often Save some allocations if the echo delay is increased often during playback by always allocating enough memory to hold data up to the next complete second, i.e. in the worst case allocate memory for one additional second. 2009-01-24 14:25:08 +0100 Thijs Vermeir * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Update plugin version in documentation 2009-01-23 21:47:40 +0100 Thijs Vermeir * gst/videocrop/gstvideocrop.c: Fix link in documentation of videocrop element 2009-01-23 21:46:13 +0100 Thijs Vermeir * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-videocrop.xml: * gst/videocrop/gstaspectratiocrop.c: Add documentation for aspectratiocrop 2009-01-24 13:21:39 +0100 Sebastian Dröge * win32/common/config.h: Update win32/common/config.h for the new development cycle 2009-01-24 11:53:40 +0100 Sebastian Dröge * gst/audiofx/audioecho.c: Add note that audioecho's reverb sounds metallic Add a note to the docs that audioecho's reverb will sound metallic. This happens because for a real reverb filter additional filtering is necessary. Also note which values should be used for the delay property to get an echo effect. 2009-01-23 23:38:10 +0000 Jan Schmidt * .gitignore: * docs/plugins/.gitignore: * po/.gitignore: * tests/examples/audiofx/.gitignore: More entries for the gitignores 2009-01-23 20:36:27 +0100 Thijs Vermeir * tests/check/elements/videocrop.c: skip video/x-raw-gray in videocrop unit test A recent commit added video/x-raw-gray support to videocrop. However this lets the videocrop unit test fail. Because videotestsrc can't generate this format. 2009-01-23 15:39:46 +0100 Thijs Vermeir * gst/videocrop/Makefile.am: * gst/videocrop/gstaspectratiocrop.c: * gst/videocrop/gstaspectratiocrop.h: * gst/videocrop/gstvideocrop.c: Add aspectratiocrop element. Fixes bug #527951 Add new aspectratiocrop element that crops the video to a specified aspect ratio using videocrop. 2009-01-23 10:49:28 +0100 Thijs Vermeir * gst/videocrop/gstvideocrop.c: Fix navigation event forwarding while cropping. Fixes bug #567992. Fix the navigation event forwarding while cropping by adjusting the mouse position by the amount of cropped pixels. 2009-01-23 10:04:39 +0100 Brian Cameron * configure.ac: Fix linking on Solaris. Fixes bug #568809. Check for the socket library which is needed for socket() on Solaris. 2009-01-22 22:41:43 +0000 Jan Schmidt * configure.ac: Bump version number again -> 0.10.13.1 2009-01-22 22:41:01 +0000 Jan Schmidt * gst-plugins-good.doap: Add releases 0.10.12 and 0.10.13 to the doap file 2009-01-22 18:08:50 +0200 Stefan Kost * common: Update common snapshot. 2009-01-22 14:25:07 +0000 Jan Schmidt * configure.ac: * win32/common/config.h: Back to devel -> 0.10.12.1 2009-01-22 01:29:40 +0000 Jan Schmidt * configure.ac: Release 0.10.12 2009-01-21 17:22:39 -0800 David Schleef * gst/qtdemux/qtdemux.c: Fix for security advisory TKADV2009-0xx Fix potential buffer overflows while reading quicktime headers. Security issue noticed by Tobias Klein. 2009-01-21 12:56:55 +0000 Jan Schmidt * ext/flac/gstflacdec.c: Fix typo and small flaw in flac decoder 2009-01-22 13:49:35 +0100 Sebastian Dröge * common: Fix pre-commit hook 2009-01-22 10:40:34 +0100 Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-videocrop.xml: * gst/audiofx/Makefile.am: * gst/audiofx/audioecho.c: * gst/audiofx/audioecho.h: * gst/audiofx/audiofx.c: * gst/audiofx/audioreverb.c: * gst/audiofx/audioreverb.h: * tests/check/Makefile.am: * tests/check/elements/audioecho.c: * tests/check/elements/audioreverb.c: Rename audioreverb to audioecho. Fixes bug #568395. The element can add an echo and a simple reverb effect to an audio stream but for a real reverb filter it would need some additional filtering to prevent a metallic-sounding result. 2009-01-22 12:21:29 +0100 Wim Taymans * gst/rtsp/gstrtspsrc.c: Free leftover udp ports (if any) when a setup request fails. 2009-01-22 06:05:26 +0100 Edward Hervey * autogen.sh: * common: Install and use pre-commit indentation hook from common 2009-01-21 13:25:06 +0100 Wim Taymans * ext/flac/gstflacdec.c: Whitespace fixes and some improved debug lines. 2009-01-21 04:31:58 +0100 Edward Hervey * autogen.sh: autogen.sh : Use git submodule 2009-01-20 15:33:05 +0000 Tim-Philipp Müller sys/v4l2/gstv4l2src.c: Fix error code (the message string also needs love, but not today). Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read): Fix error code (the message string also needs love, but not today). 2009-01-19 11:44:36 +0000 Luotao Fu gst/videocrop/gstvideocrop.c: Add 8bit grayscale support to videocrop plugin. Fixes #567952. Original commit message from CVS: Patch by: Luotao Fu * gst/videocrop/gstvideocrop.c: (gst_video_crop_get_image_details_from_caps): Add 8bit grayscale support to videocrop plugin. Fixes #567952. 2009-01-19 11:22:06 +0000 Sebastian Dröge gst/audiofx/audioreverb.c: Set the default value in the instance init function. Original commit message from CVS: * gst/audiofx/audioreverb.c: (gst_audio_reverb_init): Set the default value in the instance init function. 2009-01-19 11:19:08 +0000 Sebastian Dröge Add an echo/reverb filter to the audiofx plugin, with configurable echo delay, intensity and feedback. Fixes bug #567... Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-spectrum.xml: * gst/audiofx/Makefile.am: * gst/audiofx/audiofx.c: (plugin_init): * gst/audiofx/audioreverb.c: (gst_audio_reverb_base_init), (gst_audio_reverb_class_init), (gst_audio_reverb_init), (gst_audio_reverb_finalize), (gst_audio_reverb_set_property), (gst_audio_reverb_get_property), (gst_audio_reverb_setup), (gst_audio_reverb_stop), (gst_audio_reverb_transform_ip): * gst/audiofx/audioreverb.h: * tests/check/Makefile.am: * tests/check/elements/audioreverb.c: (setup_reverb), (cleanup_reverb), (GST_START_TEST), (audioreverb_suite): Add an echo/reverb filter to the audiofx plugin, with configurable echo delay, intensity and feedback. Fixes bug #567874. 2009-01-19 10:13:53 +0000 Sebastian Dröge gst/spectrum/gstspectrum.*: Implement a simple compensation algorithm for rounding errors. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_reset_state), (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: Implement a simple compensation algorithm for rounding errors. This makes sure that a spectrum message is posted on the bus every interval nanoseconds. Fixes bug #567955. 2009-01-15 21:16:45 +0000 Michael Smith sys/osxaudio/Makefile.am: Link against CoreServices (needed for osx 10.4) and fix up the linker flags. Fixes #567853. Original commit message from CVS: * sys/osxaudio/Makefile.am: Link against CoreServices (needed for osx 10.4) and fix up the linker flags. Fixes #567853. 2009-01-15 14:53:18 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Catch invalid and commonly wrong playback rates in the elst atoms. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_segments): Catch invalid and commonly wrong playback rates in the elst atoms. Fixes #567800. 2009-01-15 11:40:23 +0000 Sebastian Dröge gst/spectrum/gstspectrum.c: Don't call gst_fft_f32_free() with NULL to prevent a crash. Fixes bug #567642. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_reset_state): Don't call gst_fft_f32_free() with NULL to prevent a crash. Fixes bug #567642. 2009-01-14 15:44:18 +0000 Sebastian Dröge gst/spectrum/gstspectrum.*: Use correct types for frame/fft counters and some minor cleanup. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: Use correct types for frame/fft counters and some minor cleanup. 2009-01-14 15:37:07 +0000 Lennart Poettering ext/pulse/pulseprobe.c: Fix refcount loop, resulting in a thread leak. Fixes bug #567746. Original commit message from CVS: Patch by: Lennart Poettering * ext/pulse/pulseprobe.c: (gst_pulseprobe_new), (gst_pulseprobe_free): Fix refcount loop, resulting in a thread leak. Fixes bug #567746. 2009-01-14 10:46:54 +0000 Sebastian Dröge gst/spectrum/: Post a spectrum message on the bus for every interval, even if the interval is small than the length o... Original commit message from CVS: * gst/spectrum/Makefile.am: * gst/spectrum/README: * gst/spectrum/gstspectrum.c: (gst_spectrum_base_init), (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_reset_state), (gst_spectrum_finalize), (gst_spectrum_set_property), (gst_spectrum_start), (gst_spectrum_stop), (gst_spectrum_setup), (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: Post a spectrum message on the bus for every interval, even if the interval is small than the length of the FFT. Fixes bug #567642. Major cleanup of the spectrum element. 2009-01-13 19:23:57 +0000 Sebastian Dröge Add audioiirfilter and audiofirfilter elements which allow generic IIR/FIR filters to be implemented by providing the... Original commit message from CVS: * configure.ac: * gst/audiofx/Makefile.am: * gst/audiofx/audiofirfilter.c: (gst_audio_fir_filter_base_init), (gst_audio_fir_filter_class_init), (gst_audio_fir_filter_update_kernel), (gst_audio_fir_filter_init), (gst_audio_fir_filter_setup), (gst_audio_fir_filter_finalize), (gst_audio_fir_filter_set_property), (gst_audio_fir_filter_get_property): * gst/audiofx/audiofirfilter.h: * gst/audiofx/audiofx.c: (plugin_init): * gst/audiofx/audioiirfilter.c: (gst_audio_iir_filter_base_init), (gst_audio_iir_filter_class_init), (gst_audio_iir_filter_update_coefficients), (gst_audio_iir_filter_init), (gst_audio_iir_filter_setup), (gst_audio_iir_filter_finalize), (gst_audio_iir_filter_set_property), (gst_audio_iir_filter_get_property): * gst/audiofx/audioiirfilter.h: Add audioiirfilter and audiofirfilter elements which allow generic IIR/FIR filters to be implemented by providing the filter coefficients. Fixes bug #567577. * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-wavparse.xml: Add documentation for the audioiirfilter and audiofirfilter elements. * tests/check/Makefile.am: * tests/check/elements/audiofirfilter.c: (on_message), (on_rate_changed), (on_handoff), (GST_START_TEST), (audiofirfilter_suite): * tests/check/elements/audioiirfilter.c: (on_message), (on_rate_changed), (on_handoff), (GST_START_TEST), (audioiirfilter_suite): * tests/examples/Makefile.am: * tests/examples/audiofx/Makefile.am: * tests/examples/audiofx/firfilter-example.c: (on_message), (on_rate_changed), (main): * tests/examples/audiofx/iirfilter-example.c: (on_message), (on_rate_changed), (main): Add unit tests and example applications for the two filter elements. 2009-01-13 19:09:19 +0000 Thiago Sousa Santos gst/qtdemux/qtdemux.c: Fix format string for guint64. Original commit message from CVS: Patch by: Thiago Sousa Santos * gst/qtdemux/qtdemux.c: Fix format string for guint64. 2009-01-13 19:04:09 +0000 Michael Smith sys/osxaudio/Makefile.am: osxaudio plugin now requires AudioUnit framework, so link against that. Original commit message from CVS: * sys/osxaudio/Makefile.am: osxaudio plugin now requires AudioUnit framework, so link against that. Clean up tabs v spaces while I'm there. 2009-01-13 17:49:07 +0000 Wim Taymans tests/examples/rtp/server-alsasrc-PCMA.c: Add some example code for printing the RTP manager stats. Original commit message from CVS: * tests/examples/rtp/server-alsasrc-PCMA.c: (print_source_stats), (print_stats), (main): Add some example code for printing the RTP manager stats. 2009-01-13 08:24:25 +0000 Sebastian Dröge gst/audiofx/: Use a custom mutex for protecting the instance fields instead of the GstObject lock. Using the latter c... Original commit message from CVS: * gst/audiofx/audiochebband.c: (gst_audio_cheb_band_class_init), (gst_audio_cheb_band_init), (gst_audio_cheb_band_finalize), (gst_audio_cheb_band_set_property): * gst/audiofx/audiochebband.h: * gst/audiofx/audiocheblimit.c: (gst_audio_cheb_limit_class_init), (gst_audio_cheb_limit_init), (gst_audio_cheb_limit_finalize), (gst_audio_cheb_limit_set_property): * gst/audiofx/audiocheblimit.h: * gst/audiofx/audiowsincband.c: (gst_audio_wsincband_class_init), (gst_audio_wsincband_init), (gst_audio_wsincband_finalize), (gst_audio_wsincband_set_property): * gst/audiofx/audiowsincband.h: * gst/audiofx/audiowsinclimit.c: (gst_audio_wsinclimit_class_init), (gst_audio_wsinclimit_init), (gst_audio_wsinclimit_finalize), (gst_audio_wsinclimit_set_property): * gst/audiofx/audiowsinclimit.h: Use a custom mutex for protecting the instance fields instead of the GstObject lock. Using the latter can lead to deadlocks, especially with the FIR filters when updating the latency. 2009-01-11 19:03:38 +0000 Sebastian Dröge gst/audiofx/: Implement a base class for generic audio FIR filters. Original commit message from CVS: * gst/audiofx/Makefile.am: * gst/audiofx/audiofxbasefirfilter.c: (gst_audio_fx_base_fir_filter_dispose), (gst_audio_fx_base_fir_filter_base_init), (gst_audio_fx_base_fir_filter_class_init), (gst_audio_fx_base_fir_filter_init), (gst_audio_fx_base_fir_filter_push_residue), (gst_audio_fx_base_fir_filter_setup), (gst_audio_fx_base_fir_filter_transform), (gst_audio_fx_base_fir_filter_start), (gst_audio_fx_base_fir_filter_stop), (gst_audio_fx_base_fir_filter_query), (gst_audio_fx_base_fir_filter_query_type), (gst_audio_fx_base_fir_filter_event), (gst_audio_fx_base_fir_filter_set_kernel): * gst/audiofx/audiofxbasefirfilter.h: * gst/audiofx/audiofxbaseiirfilter.c: Implement a base class for generic audio FIR filters. * gst/audiofx/audiowsincband.c: (gst_gst_audio_wsincband_mode_get_type), (gst_gst_audio_wsincband_window_get_type), (gst_audio_wsincband_base_init), (gst_audio_wsincband_class_init), (gst_audio_wsincband_init), (gst_audio_wsincband_build_kernel), (gst_audio_wsincband_setup), (gst_audio_wsincband_set_property), (gst_audio_wsincband_get_property): * gst/audiofx/audiowsincband.h: * gst/audiofx/audiowsinclimit.c: (gst_audio_wsinclimit_mode_get_type), (gst_audio_wsinclimit_window_get_type), (gst_audio_wsinclimit_base_init), (gst_audio_wsinclimit_class_init), (gst_audio_wsinclimit_init), (gst_audio_wsinclimit_build_kernel), (gst_audio_wsinclimit_setup), (gst_audio_wsinclimit_set_property), (gst_audio_wsinclimit_get_property): * gst/audiofx/audiowsinclimit.h: * tests/check/elements/audiowsincband.c: (GST_START_TEST): * tests/check/elements/audiowsinclimit.c: (GST_START_TEST): Use this new base class for audiowsincband and audiowsinclimit. Also cleanup both elements. 2009-01-08 18:17:13 +0000 Michael Smith gst/qtdemux/qtdemux.c: In push mode, error out if we get EOS before we've created any srcpads. Original commit message from CVS: * gst/qtdemux/qtdemux.c: In push mode, error out if we get EOS before we've created any srcpads. Handle (in pull mode) some files that have a truncated moov atom where the final sub-atom is a 'free' atom and the contents of that are not present in the file. 2009-01-08 15:56:46 +0000 Mark Nauwelaerts gst/matroska/: Some cleanups, refactoring and minor enhancements in caps handling. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): Some cleanups, refactoring and minor enhancements in caps handling. * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), (gst_matroska_mux_init), (gst_matroska_pad_reset), (gst_matroska_pad_free), (gst_matroska_mux_reset), (gst_matroska_mux_video_pad_setcaps), (gst_matroska_mux_request_new_pad): * tests/check/elements/matroskamux.c: (teardown_src_pad): Only remove, release or reset what is appropriate upon state change. 2009-01-07 20:38:50 +0000 Jan Schmidt ext/pulse/pulsesink.*: Use a mutex to protect the current stream pointer, and ignore callbacks for stream objects tha... Original commit message from CVS: * ext/pulse/pulsesink.c: * ext/pulse/pulsesink.h: Use a mutex to protect the current stream pointer, and ignore callbacks for stream objects that have been destroyed already. Fixes problems with unprepare/prepare cycles caused by the input caps changing, without reintroducing bug #556986. 2009-01-07 16:09:47 +0000 Jan Schmidt sys/v4l2/gstv4l2src.c: Remove () from translateable string, so that it makes more sense. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: Remove () from translateable string, so that it makes more sense. 2009-01-07 09:43:13 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Minor fix/cleanup in header field calculation. Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_audsink_set_caps): Minor fix/cleanup in header field calculation. 2009-01-06 17:48:10 +0000 Mark Nauwelaerts gst/matroska/matroska-mux.*: Remove internal taglist and fully use tagsetter interface. Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), (gst_matroska_mux_handle_sink_event), (gst_matroska_mux_finish): * gst/matroska/matroska-mux.h: Remove internal taglist and fully use tagsetter interface. 2009-01-06 14:50:29 +0000 Mark Nauwelaerts gst/avi/gstavimux.*: Ensure header size invariance during subsequent rewrite by using tags snapshot. Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_reset), (gst_avi_mux_riff_get_avi_header): * gst/avi/gstavimux.h: Ensure header size invariance during subsequent rewrite by using tags snapshot. 2009-01-05 17:31:13 +0000 Sebastian Dröge ext/pulse/pulsesink.c: Don't wait for the pulse mainloop when destroying the stream. Original commit message from CVS: * ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream): Don't wait for the pulse mainloop when destroying the stream. Fixes a deadlock when the pulsedaemon goes away while pulsesink is PLAYING. Fixes bug #556986. 2009-01-05 12:30:40 +0000 Sascha Hauer sys/v4l2/gstv4l2src.c: Add support for grayscale v4l2 devices. Fixes bug #566616. Original commit message from CVS: Patch by: Sascha Hauer Luotao Fu * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_structure), (gst_v4l2_get_caps_info): Add support for grayscale v4l2 devices. Fixes bug #566616. 2009-01-05 11:42:09 +0000 Mark Nauwelaerts gst/qtdemux/: Streamline tag handling and pass unparsed tags as binary blob in private tag. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_str), (qtdemux_tag_add_tmpo), (qtdemux_tag_add_covr), (qtdemux_tag_add_date), (qtdemux_tag_add_gnre), (qtdemux_tag_add_blob), (qtdemux_parse_udta): * gst/qtdemux/qtdemux.h: * gst/qtdemux/quicktime.c: (plugin_init): Streamline tag handling and pass unparsed tags as binary blob in private tag. 2009-01-05 10:13:29 +0000 Sebastian Dröge gst/audiofx/: Implement a base class for IIR filters. Original commit message from CVS: * gst/audiofx/Makefile.am: * gst/audiofx/audiofxbaseiirfilter.c: (gst_audio_fx_base_iir_filter_base_init), (gst_audio_fx_base_iir_filter_dispose), (gst_audio_fx_base_iir_filter_class_init), (gst_audio_fx_base_iir_filter_init), (gst_audio_fx_base_iir_filter_calculate_gain), (gst_audio_fx_base_iir_filter_set_coefficients), (gst_audio_fx_base_iir_filter_setup), (process), (gst_audio_fx_base_iir_filter_transform_ip), (gst_audio_fx_base_iir_filter_stop): * gst/audiofx/audiofxbaseiirfilter.h: Implement a base class for IIR filters. * gst/audiofx/audiochebband.c: (gst_audio_cheb_band_base_init), (gst_audio_cheb_band_class_init), (gst_audio_cheb_band_init), (generate_coefficients), (gst_audio_cheb_band_set_property), (gst_audio_cheb_band_setup): * gst/audiofx/audiochebband.h: * gst/audiofx/audiocheblimit.c: (gst_audio_cheb_limit_base_init), (gst_audio_cheb_limit_class_init), (gst_audio_cheb_limit_init), (generate_coefficients), (gst_audio_cheb_limit_set_property), (gst_audio_cheb_limit_setup): * gst/audiofx/audiocheblimit.h: Use the IIR filter base class for the chebyshev filters. 2009-01-02 20:39:34 +0000 Justin Karnegas sys/osxaudio/: Rewrite osxaudio to work more flexibly and more reliably, using a different abstraction layer of corea... Original commit message from CVS: Patch by: Justin Karnegas and Michael Smith * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudioelement.c: * sys/osxaudio/gstosxaudioelement.h: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosink.h: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxaudio/gstosxaudiosrc.h: * sys/osxaudio/gstosxringbuffer.c: * sys/osxaudio/gstosxringbuffer.h: Rewrite osxaudio to work more flexibly and more reliably, using a different abstraction layer of coreaudio that is the recommended way of doing low-level audio I/O on OSX. Fixes byg #564948. 2009-01-02 16:31:13 +0000 Wim Taymans tests/examples/rtp/server-decodebin-H263p-AMR.sh: Add example RTP transcoding pipeline from any file decodedable with... Original commit message from CVS: * tests/examples/rtp/server-decodebin-H263p-AMR.sh: Add example RTP transcoding pipeline from any file decodedable with uridecodebin. 2009-01-02 15:20:48 +0000 Wim Taymans tests/examples/rtp/: Add two C examples of using gstrtpbin as a sender and a receiver. Original commit message from CVS: * tests/examples/rtp/.cvsignore: * tests/examples/rtp/Makefile.am: * tests/examples/rtp/client-PCMA.c: (pad_added_cb), (main): * tests/examples/rtp/server-alsasrc-PCMA.c: (main): Add two C examples of using gstrtpbin as a sender and a receiver. 2008-12-31 11:20:55 +0000 Jan Schmidt ChangeLog: Remove conflict marker from ChangeLog Original commit message from CVS: * ChangeLog: Remove conflict marker from ChangeLog 2008-12-28 09:50:31 +0000 j^ gst/qtdemux/qtdemux.c: Add codec mapping for xvid, fmp4 and ac3 tracks. Original commit message from CVS: Patch by: j^ * gst/qtdemux/qtdemux.c: (qtdemux_video_caps), (qtdemux_audio_caps): Add codec mapping for xvid, fmp4 and ac3 tracks. Fixes #565850 2008-12-23 12:10:41 +0000 Wim Taymans ext/jpeg/gstsmokeenc.*: Implement getcaps function. Original commit message from CVS: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init), (gst_smokeenc_getcaps), (gst_smokeenc_setcaps), (gst_smokeenc_chain), (gst_smokeenc_change_state): * ext/jpeg/gstsmokeenc.h: Implement getcaps function. Set caps on the pad and on all outgoing buffers. Fixes #565441. 2008-12-19 09:36:45 +0000 Stefan Kost ext/pulse/pulsemixerctrl.c: And remove temporary comment pointing to the bug ticket. Original commit message from CVS: * ext/pulse/pulsemixerctrl.c: And remove temporary comment pointing to the bug ticket. * gst/avi/gstavimux.c: Move reoccuring logging to LOG and log instance too. 2008-12-17 17:28:39 +0000 Stefan Kost ext/pulse/pulsemixerctrl.c: Don't leak the pa_operation. Original commit message from CVS: * ext/pulse/pulsemixerctrl.c: Don't leak the pa_operation. 2008-12-16 16:19:26 +0000 Stefan Kost configure.ac: Require core cvs. Original commit message from CVS: * configure.ac: Require core cvs. 2008-12-16 16:07:48 +0000 Stefan Kost gst/avi/gstavimux.c: Rename api from _flush to _reset_tags. Original commit message from CVS: * gst/avi/gstavimux.c: Rename api from _flush to _reset_tags. 2008-12-16 14:22:51 +0000 Stefan Kost gst/avi/gstavimux.c: Use new tagsetter api to flush tags. Original commit message from CVS: * gst/avi/gstavimux.c: Use new tagsetter api to flush tags. 2008-12-16 13:14:39 +0000 Sebastian Dröge tests/check/elements/deinterleave.c: Increase timeout to 3 minutes to prevent timeouts. Original commit message from CVS: * tests/check/elements/deinterleave.c: (deinterleave_suite): Increase timeout to 3 minutes to prevent timeouts. 2008-12-16 12:52:24 +0000 Sebastian Dröge tests/check/elements/interleave.c: Increase timeout to 3 minutes to prevent timeouts. Original commit message from CVS: * tests/check/elements/interleave.c: (interleave_suite): Increase timeout to 3 minutes to prevent timeouts. 2008-12-16 11:57:01 +0000 Stefan Kost gst/avi/gstavimux.*: Totally remove the internal taglists and fully use tagsetter. Original commit message from CVS: * gst/avi/gstavimux.c: * gst/avi/gstavimux.h: Totally remove the internal taglists and fully use tagsetter. 2008-12-15 15:59:53 +0000 Stefan Kost gst/avi/gstavimux.c: Instead of filtering wrongly just use the mergemode. Applications is use KEEP_ALL if they want t... Original commit message from CVS: * gst/avi/gstavimux.c: Instead of filtering wrongly just use the mergemode. Applications is use KEEP_ALL if they want to supress tag-events. Fixes #563221 for avi for real (I hope). Everyone chime in, before I fix the others. 2008-12-15 12:45:35 +0000 Stefan Kost ext/pulse/pulsemixerctrl.c: Add note about memleak. Original commit message from CVS: * ext/pulse/pulsemixerctrl.c: Add note about memleak. 2008-12-13 16:23:09 +0000 Edward Hervey m4/Makefile.am: A couple more .m4 that aren't shipped anymore with gettext 0.17. Original commit message from CVS: * m4/Makefile.am: A couple more .m4 that aren't shipped anymore with gettext 0.17. 2008-12-13 15:34:01 +0000 Edward Hervey Switch to using GstStaticPadTemplate. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_base_init), (gst_flac_dec_init): * gst/law/alaw-decode.c: (gst_alaw_dec_base_init), (gst_alaw_dec_init): * gst/law/alaw-encode.c: (gst_alaw_enc_base_init), (gst_alaw_enc_init): * gst/law/alaw.c: (plugin_init): * gst/law/mulaw-decode.c: (gst_mulawdec_base_init), (gst_mulawdec_init): * gst/law/mulaw-encode.c: (gst_mulawenc_base_init), (gst_mulawenc_init): * gst/law/mulaw.c: (plugin_init): Switch to using GstStaticPadTemplate. * gst/udp/gstudpnetutils.c: (gst_udp_get_addr): Don't forget to free the addrinfo structure. * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), (gst_wavparse_sink_activate): Don't forget to unref the GstAdapter. 2008-12-13 12:58:24 +0000 Edward Hervey m4/Makefile.am: inttypes.m4 hasn't been available since gettext-0.15, and since we now require gettext >= 0.17 ... we... Original commit message from CVS: * m4/Makefile.am: inttypes.m4 hasn't been available since gettext-0.15, and since we now require gettext >= 0.17 ... we can remove it from the list of files to dist. 2008-12-10 15:03:23 +0000 Christian Schaller * gst-plugins-good.spec.in: smaller spec file updates Original commit message from CVS: smaller spec file updates 2008-12-09 17:55:22 +0000 Stefan Kost gst/avi/gstavidemux.c: More logging. Original commit message from CVS: * gst/avi/gstavidemux.c: More logging. * gst/avi/gstavimux.c: Handle more metadata fields. Better estimate of metadata size. Don't merge received tags, if application has specified tags using GST_TAG_MERGE_REPLACE_ALL. Fixes #563221 for avi. 2008-12-09 14:30:03 +0000 Sebastian Dröge tests/check/Makefile.am: Also ignore pulsemixer for the states unit test. Original commit message from CVS: * tests/check/Makefile.am: Also ignore pulsemixer for the states unit test. 2008-12-09 14:19:16 +0000 Wim Taymans gst/rtp/gstrtpjpegdepay.c: Add an EOI marker at the end of the jpeg frame when it's missing. Original commit message from CVS: * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_process): Add an EOI marker at the end of the jpeg frame when it's missing. Fixes #563056. 2008-12-09 10:47:14 +0000 Sebastian Dröge tests/check/elements/videocrop.c: Update the unit test for the new color values for BT.601 red. Original commit message from CVS: * tests/check/elements/videocrop.c: (check_1x1_buffer): Update the unit test for the new color values for BT.601 red. Fixes bug #563510. 2008-12-09 10:28:11 +0000 Tim-Philipp Müller ext/dv/gstdvdemux.c: Restore previous behaviour of not passing QoS and navigation events upstream, which presumably w... Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_src_event): Restore previous behaviour of not passing QoS and navigation events upstream, which presumably wasn't meant to be changed. 2008-12-09 09:39:53 +0000 Sebastian Dröge ext/dv/gstdvdemux.c: Add srcpads only when needed and remove them again when going back to READY. This prevents stall... Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_add_video_pad), (gst_dvdemux_add_audio_pad), (gst_dvdemux_remove_pads), (gst_dvdemux_demux_audio), (gst_dvdemux_demux_video), (gst_dvdemux_chain), (gst_dvdemux_loop), (gst_dvdemux_change_state): Add srcpads only when needed and remove them again when going back to READY. This prevents stalled pipelines if there's no audio inside the DV stream, which happens for many MXF files. 2008-12-09 09:09:25 +0000 Sebastian Dröge tests/check/elements/souphttpsrc.c: The ports in libsoup are unsigned integers and not signed integers. Original commit message from CVS: * tests/check/elements/souphttpsrc.c: (GST_START_TEST), (run_server): The ports in libsoup are unsigned integers and not signed integers. 2008-12-08 18:31:00 +0000 Sebastian Dröge ext/dv/gstdvdemux.c: Forward all events upstream unless it's something we really don't handle. This fixes latency con... Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_src_event): Forward all events upstream unless it's something we really don't handle. This fixes latency configuration of pipelines. 2008-12-08 18:24:21 +0000 Sebastian Dröge ext/dv/: Really call dv_init() exactly one time, not one time for the demuxer and one time for the decoder. Original commit message from CVS: * ext/dv/gstdv.c: (plugin_init): * ext/dv/gstdvdec.c: (gst_dvdec_class_init): * ext/dv/gstdvdemux.c: (gst_dvdemux_class_init): Really call dv_init() exactly one time, not one time for the demuxer and one time for the decoder. 2008-12-08 12:37:45 +0000 Wim Taymans gst/rtp/gstrtpmp4apay.c: Copy incomming timestamp to outgoing packets. Original commit message from CVS: * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_handle_buffer): Copy incomming timestamp to outgoing packets. 2008-12-08 12:36:21 +0000 Wim Taymans gst/rtp/gstrtpmp4vpay.c: Don't try to push packets before we could find a valid config startcode. Fixes #563509. Original commit message from CVS: * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush), (gst_rtp_mp4v_pay_event): Don't try to push packets before we could find a valid config startcode. Fixes #563509. 2008-12-07 19:22:48 +0000 Brian Cameron sys/sunaudio/gstsunaudiomixerctrl.c: Set the mixer fd before calling ioctl() on it. Fixes bug #563414. Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_open): Set the mixer fd before calling ioctl() on it. Fixes bug #563414. 2008-12-07 19:01:35 +0000 Alexandre Rostovtsev configure.ac: Make usage of libv4l optional by a configure parameter. Original commit message from CVS: Patch by: Alexandre Rostovtsev * configure.ac: Make usage of libv4l optional by a configure parameter. Fixes bug #563504. 2008-12-05 09:24:18 +0000 Sebastian Dröge Add documentation for matroskamux and matroskademux and update the inspection xml files. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: Add documentation for matroskamux and matroskademux and update the inspection xml files. 2008-12-04 20:10:58 +0000 Sebastian Dröge configure.ac: Apparently AC_CONFIG_MACRO_DIR breaks when using more than one macro directory, reverting last change. Original commit message from CVS: * configure.ac: Apparently AC_CONFIG_MACRO_DIR breaks when using more than one macro directory, reverting last change. 2008-12-04 19:47:21 +0000 Sebastian Dröge configure.ac: Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to our M4 macros. Original commit message from CVS: * configure.ac: Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to our M4 macros. 2008-11-30 16:24:45 +0000 Sebastian Dröge gst/udp/gstmultiudpsink.c: Provide the parameters that are required for the format string to fix a compiler warning. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): Provide the parameters that are required for the format string to fix a compiler warning. 2008-11-29 20:05:41 +0000 Stefan Kost gst/autodetect/gstautoaudiosrc.c: Fix classification. Original commit message from CVS: * gst/autodetect/gstautoaudiosrc.c: Fix classification. 2008-11-29 13:31:55 +0000 Sebastian Dröge Require gettext 0.17 because older versions don't mix with libtool 2.2. At build time an older gettext version will s... Original commit message from CVS: Patch by: Cygwin Ports maintainer * autogen.sh: * configure.ac: Require gettext 0.17 because older versions don't mix with libtool 2.2. At build time an older gettext version will still work. Fixes bug #556091. 2008-11-28 15:10:50 +0000 Peter Kjellerstedt gst/udp/gstmultiudpsink.c: Make gst_multiudpsink_render() ignore errors from sendto() instead of breaking streaming. ... Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): Make gst_multiudpsink_render() ignore errors from sendto() instead of breaking streaming. Emit a warning instead. Fixes #562572. 2008-11-27 16:43:24 +0000 Ron McOuat Add support for basic and digest authentication in souphttpsrc. Original commit message from CVS: Patch by: Ron McOuat * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), (gst_soup_http_src_init), (gst_soup_http_src_dispose), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), (gst_soup_http_src_authenticate_cb), (gst_soup_http_src_start): * ext/soup/gstsouphttpsrc.h: * tests/check/elements/souphttpsrc.c: (basic_auth_cb), (digest_auth_cb), (run_test), (GST_START_TEST), (souphttpsrc_suite), (run_server): Add support for basic and digest authentication in souphttpsrc. Fixes bug #561775. 2008-11-27 12:13:39 +0000 Sebastian Dröge gst/wavenc/: Add support for a-law and mu-law encoded wav files. Fixes bug #562434. Original commit message from CVS: Patch by: Pepijn Van Eeckhoudt * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), (gst_wavenc_sink_setcaps), (gst_wavenc_change_state): * gst/wavenc/gstwavenc.h: * gst/wavenc/riff.h: Add support for a-law and mu-law encoded wav files. Fixes bug #562434. 2008-11-27 11:22:56 +0000 이문형 gst/rtsp/gstrtspsrc.c: Prevent further read/write actions taken to the connect-failed socket by erroring out quickly.... Original commit message from CVS: Patch by: 이문형 * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp): Prevent further read/write actions taken to the connect-failed socket by erroring out quickly. See #562258. 2008-11-26 21:19:47 +0000 Stefan Kost tests/examples/level/level-example.c: Set fakesink to sync. Otherwise people might question the message interval. Nev... Original commit message from CVS: * tests/examples/level/level-example.c: Set fakesink to sync. Otherwise people might question the message interval. Nevertheless the timestamp in the message is what matters. 2008-11-25 18:13:25 +0000 Wim Taymans tests/icles/.cvsignore: cvsignore newly generated file. Original commit message from CVS: * tests/icles/.cvsignore: cvsignore newly generated file. 2008-11-25 18:03:02 +0000 Wim Taymans gst/rtp/: Fix the descriptions and fix some email addresses. Original commit message from CVS: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps): * gst/rtp/gstrtpac3depay.h: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps): * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps): * gst/rtp/gstrtph263depay.h: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpjpegdepay.h: * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps): * gst/rtp/gstrtpmp1sdepay.h: * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): * gst/rtp/gstrtpmp2tdepay.h: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp2tpay.h: * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps): * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4apay.h: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps): * gst/rtp/gstrtpmp4gdepay.h: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps): * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvdepay.h: * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtpsv3vdepay.h: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheoradepay.h: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtptheorapay.h: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbisdepay.h: * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): * gst/rtp/gstrtpvorbispay.h: * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): * gst/rtp/gstrtpvrawpay.c: Fix the descriptions and fix some email addresses. 2008-11-25 17:47:24 +0000 Julien Moutte gst/qtdemux/qtdemux.c: Add MPG1 and MPG2 fourcc to supported qtdemux video codecs as I found some video clips using t... Original commit message from CVS: 2008-11-25 Julien Moutte * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add MPG1 and MPG2 fourcc to supported qtdemux video codecs as I found some video clips using those. 2008-11-25 16:26:16 +0000 Wim Taymans gst/autodetect/: Post an error when we can't set the internal ghostpad target. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_detect): * gst/autodetect/gstautoaudiosrc.c: (gst_auto_audio_src_detect): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), (gst_auto_video_sink_detect): * gst/autodetect/gstautovideosrc.c: (gst_auto_video_src_detect): Post an error when we can't set the internal ghostpad target. 2008-11-25 16:06:22 +0000 Wim Taymans gst/videocrop/gstvideocrop.*: Fix renegotiation when changing properties using the new basetransform features. Fixes ... Original commit message from CVS: * gst/videocrop/gstvideocrop.c: (gst_video_crop_init), (gst_video_crop_transform), (gst_video_crop_transform_caps), (gst_video_crop_set_caps), (gst_video_crop_set_property): * gst/videocrop/gstvideocrop.h: Fix renegotiation when changing properties using the new basetransform features. Fixes #561502. * tests/icles/Makefile.am: * tests/icles/videocrop2-test.c: (make_pipeline), (main): Add crazy interactive test unit for dynamically changing properties. 2008-11-24 12:20:29 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Add some more debugging. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (new_session_pad), (gst_rtspsrc_parse_range): Add some more debugging. Use the reanges received from the server unconditionally. Fixes #561625. 2008-11-23 15:08:45 +0000 Stefan Kost ext/pulse/pulsesink.c: Change #if 0 to something more expresive and add pointer to related bug ticket. Original commit message from CVS: * ext/pulse/pulsesink.c: Change #if 0 to something more expresive and add pointer to related bug ticket. 2008-11-23 11:17:01 +0000 Sebastian Dröge * ChangeLog: ChangeLog surgery Original commit message from CVS: ChangeLog surgery 2008-11-23 11:14:42 +0000 Tal Shalif gst/qtdemux/qtdemux.c: Use G_{BIG,LITTLE}_ENDIAN instead of the non-GLib variants as the latter don't exist on some s... Original commit message from CVS: Patch by: Tal Shalif * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): Use G_{BIG,LITTLE}_ENDIAN instead of the non-GLib variants as the latter don't exist on some systems (mingw). Fixes bug #561992. 2008-11-21 13:43:29 +0000 Zeeshan Ali ext/soup/gstsouphttpsrc.c: Add transferMode.dnla.org header to HTTP requests as this is required by the DLNA specs an... Original commit message from CVS: Patch by: Zeeshan Ali * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_build_message): Add transferMode.dnla.org header to HTTP requests as this is required by the DLNA specs and doesn't hurt in other situations. Fixes bug #561802. 2008-11-20 23:59:07 +0000 Michael Smith sys/osxvideo/osxvideosink.*: Handle video window resizing more correctly, avoiding crashes when embedding the window ... Original commit message from CVS: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Handle video window resizing more correctly, avoiding crashes when embedding the window and resizing it. 2008-11-20 22:56:58 +0000 Michael Smith gst/udp/: Fix multiudpsink on OSX by passing the specific length of the socket, refactor that into a function shared ... Original commit message from CVS: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpnetutils.c: * gst/udp/gstudpnetutils.h: * gst/udp/gstudpsrc.c: Fix multiudpsink on OSX by passing the specific length of the socket, refactor that into a function shared with the same thing in udpsrc. 2008-11-20 20:07:26 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Fix the scaling code. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), (uint64_ceiling_scale), (gst_wavparse_calculate_duration), (gst_wavparse_stream_headers): Fix the scaling code. Fix parsing of the INFO chunks, we were reading the wrong number of bytes. Fixes #561580. 2008-11-20 14:30:40 +0000 Jan Schmidt gst/matroska/matroska-mux.c: Fix NULL pointer dereference of an unset codec_id in the recently added Dirac paths Original commit message from CVS: * gst/matroska/matroska-mux.c: Fix NULL pointer dereference of an unset codec_id in the recently added Dirac paths 2008-11-20 13:58:43 +0000 Jan Schmidt tests/check/Makefile.am: Just keep disabling elements that hang the states test until it works. Original commit message from CVS: * tests/check/Makefile.am: Just keep disabling elements that hang the states test until it works. 2008-11-20 13:46:47 +0000 Jan Schmidt ext/libpng/gstpngenc.c: Don't flush downstream after every buffer - that's not what this libpng callback is for at all! Original commit message from CVS: * ext/libpng/gstpngenc.c: Don't flush downstream after every buffer - that's not what this libpng callback is for at all! 2008-11-17 14:04:20 +0000 Tim-Philipp Müller sys/v4l2/v4l2src_calls.c: Turns out we don't always get the frame sizes in a predefined order from lowest to highest ... Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format_and_size), (sort_by_frame_size), (gst_v4l2src_probe_caps_for_format): Turns out we don't always get the frame sizes in a predefined order from lowest to highest resolution, so let's just sort the list by frame size once we've queried the possible resolutions rather than assume any particular order. Fixes probed caps for the camera in my HP2133 mini notebook and makes v4l2src default to a decent size. 2008-11-16 14:41:32 +0000 Edward Hervey gst/matroska/: Make mkvdemux aware of E-AC3. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): * gst/matroska/matroska-ids.h: Make mkvdemux aware of E-AC3. 2008-11-14 18:41:29 +0000 Wim Taymans gst/rtp/: Add a jpeg depayloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_base_init), (gst_rtp_jpeg_depay_class_init), (gst_rtp_jpeg_depay_init), (gst_rtp_jpeg_depay_finalize), (MakeTables), (MakeQuantHeader), (MakeHuffmanHeader), (MakeDRIHeader), (MakeHeaders), (gst_rtp_jpeg_depay_setcaps), (gst_rtp_jpeg_depay_process), (gst_rtp_jpeg_depay_change_state), (gst_rtp_jpeg_depay_plugin_init): * gst/rtp/gstrtpjpegdepay.h: Add a jpeg depayloader. * gst/rtp/gstrtpjpegpay.c: Set the default properties on the payloader to better defaults. 2008-11-14 15:42:32 +0000 Stefan Kost sys/v4l2/gstv4l2.c: Give it a primary rank for autovideosrc. Original commit message from CVS: * sys/v4l2/gstv4l2.c: Give it a primary rank for autovideosrc. 2008-11-14 11:41:55 +0000 Bjorn Ostby gst/rtp/: Add JPEG payloader. Fixes #560756. Original commit message from CVS: Patch by: Bjorn Ostby * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpjpegpay.c: (gst_rtp_jpeg_pay_base_init), (gst_rtp_jpeg_pay_class_init), (gst_rtp_jpeg_pay_init), (gst_rtp_jpeg_pay_setcaps), (gst_rtp_jpeg_pay_header_size), (gst_rtp_jpeg_pay_read_quant_table), (gst_rtp_jpeg_pay_scan_marker), (gst_rtp_jpeg_pay_handle_buffer), (gst_rtp_jpeg_pay_set_property), (gst_rtp_jpeg_pay_get_property), (gst_rtp_jpeg_pay_plugin_init): * gst/rtp/gstrtpjpegpay.h: Add JPEG payloader. Fixes #560756. 2008-11-13 17:45:59 +0000 Fabricio Godoy sys/: Fix some spelling mistakes. Fixes #556802. Original commit message from CVS: Patch by: Fabricio Godoy * sys/oss/gstosssink.c: (gst_oss_sink_open): * sys/oss/gstosssrc.c: (gst_oss_src_open): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_mmap): * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): Fix some spelling mistakes. Fixes #556802. 2008-11-13 16:24:59 +0000 Stefan Kost gst/equalizer/: Add presets for equalizer. Fixes #522183. Original commit message from CVS: * gst/equalizer/GstIirEqualizer10Bands.prs: * gst/equalizer/GstIirEqualizer3Bands.prs: * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: Add presets for equalizer. Fixes #522183. 2008-11-13 16:17:38 +0000 Wim Taymans gst/rtsp/: Remove google extension again, it's not needed anymore because we never send multiple transports anymore. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtsp.c: (plugin_init): * gst/rtsp/gstrtspgoogle.c: * gst/rtsp/gstrtspgoogle.h: Remove google extension again, it's not needed anymore because we never send multiple transports anymore. 2008-11-13 16:11:16 +0000 Eric Zhang gst/rtsp/gstrtspsrc.*: Add property to configure NAT traversal method. Original commit message from CVS: Based on patch by: Eric Zhang * gst/rtsp/gstrtspsrc.c: (gst_rtsp_nat_method_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (gst_rtspsrc_create_stream), (gst_rtspsrc_stream_free), (gst_rtspsrc_stream_configure_udp_sinks), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_send_dummy_packets), (gst_rtspsrc_create_transports_string), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Add property to configure NAT traversal method. Ignore EOS from the internal sinks. Implement sending dummy packets as a (simple) method to open up some firewalls. Send PLAY request to the server after we started the udp sources. Fixes #559545. 2008-11-13 14:04:40 +0000 Yotam gst/rtp/gstrtpmp4vpay.c: Flush the remaining frames on EOS. Fixes #560641. Original commit message from CVS: Patch by: Yotam * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): Flush the remaining frames on EOS. Fixes #560641. 2008-11-12 16:37:06 +0000 Jan Schmidt gst/rtp/gstrtpg729pay.c: Fix compiler warning about printf formatting. Original commit message from CVS: * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_handle_buffer): Fix compiler warning about printf formatting. 2008-11-12 11:55:14 +0000 Andy Wingo gst/qtdemux/qtdemux.*: Queue up new segment events instead of sending them from the seeking thread. Original commit message from CVS: * gst/qtdemux/qtdemux.h (struct _GstQTDemux): * gst/qtdemux/qtdemux.c (gst_qtdemux_do_seek): Queue up new segment events instead of sending them from the seeking thread. Fixes #559288. (gst_qtdemux_push_pending_newsegment): New helper, sends out queued newsegment events. (gst_qtdemux_loop_state_movie): Voilà, call it here. Only need to call it here, as we only seek when looping, and only push in the movie state. 2008-11-11 19:52:05 +0000 Mark Nauwelaerts gst/qtdemux/: Add cover and alternative copyright tag, and enhance some existing ones by marking them as container at... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_tmpo), (qtdemux_tag_add_covr), (qtdemux_parse_udta): * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: Add cover and alternative copyright tag, and enhance some existing ones by marking them as container atoms. 2008-11-11 17:33:00 +0000 Wim Taymans gst/rtp/gstrtpg729pay.c: Don't ignore the return value of setcaps. Original commit message from CVS: * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_set_caps): Don't ignore the return value of setcaps. 2008-11-11 17:29:03 +0000 Olivier Crete gst/rtp/gstrtpg729pay.*: Replace G729 payloader with an improved version. Fixes #532409. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_base_init), (gst_rtp_g729_pay_class_init), (gst_rtp_g729_pay_init), (gst_rtp_g729_pay_set_caps), (gst_rtp_g729_pay_handle_buffer): * gst/rtp/gstrtpg729pay.h: Replace G729 payloader with an improved version. Fixes #532409. 2008-11-11 16:00:48 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Only send one transport at a time for improved compatibility with some broken servers. See #53... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_transports_string), (gst_rtspsrc_change_state): Only send one transport at a time for improved compatibility with some broken servers. See #537832. 2008-11-11 15:16:31 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Only pause/play in the seek handler when the source was playing. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_do_seek), (gst_rtspsrc_perform_seek): Only pause/play in the seek handler when the source was playing. Fixes #529379. 2008-11-11 12:18:23 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Fix muxing of Dirac streams if the input already has the format we need, i.e. is the out... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_handle_dirac_packet): Fix muxing of Dirac streams if the input already has the format we need, i.e. is the output of matroskademux. 2008-11-11 10:06:01 +0000 Stefan Kost gst/avi/gstavimux.c: Don't segfault on string typed tags being NULL. Fixes #560155. Original commit message from CVS: * gst/avi/gstavimux.c: Don't segfault on string typed tags being NULL. Fixes #560155. 2008-11-10 16:44:45 +0000 Mark Nauwelaerts gst/matroska/matroska-mux.c: Fix mapping AAC profile to Matroska codec id. Original commit message from CVS: * gst/matroska/matroska-mux.c: (aac_codec_data_to_codec_id), (gst_matroska_mux_audio_pad_setcaps): Fix mapping AAC profile to Matroska codec id. 2008-11-10 16:36:09 +0000 Mark Nauwelaerts gst/qtdemux/qtdemux.c: Refactor some raw audio caps building, and handle >16-bit cases. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): Refactor some raw audio caps building, and handle >16-bit cases. Fix/replace building caps from a string description. 2008-11-10 13:59:27 +0000 Thomas Vander Stichele gst/: Make author name consistent with others. Original commit message from CVS: * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: * gst/cutter/gstcutter.c: Make author name consistent with others. 2008-11-10 12:13:21 +0000 Eric Zhang gst/rtsp/gstrtspsrc.c: Pause the RTSP stream before doing a new play request. Original commit message from CVS: Based on patch by: Eric Zhang * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_perform_seek), (gst_rtspsrc_stream_configure_udp_sink): Pause the RTSP stream before doing a new play request. Make sure that adding the udpsinks does not cause the rtspsrc to become a sink. Fixes #559547. 2008-11-05 14:42:35 +0000 Sebastian Dröge gst/matroska/: Implement Dirac muxing into Matroska comforming to the spec, i.e. put all Dirac packages up to a pictu... Original commit message from CVS: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_pad_free), (gst_matroska_mux_handle_dirac_packet), (gst_matroska_mux_write_data): Implement Dirac muxing into Matroska comforming to the spec, i.e. put all Dirac packages up to a picture into a Matroska block. TODO: Implement writing of the ReferenceBlock Matroska elements, currently the Dirac muxing is only 100% correct if Matroska version 2 is selected for muxing. 2008-11-04 12:32:48 +0000 Bastien Nocera Optionally use libv4l to access v4l2 devices. Fixes bug #545033. Original commit message from CVS: Patch by: Bastien Nocera , Hans de Goede * configure.ac: * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_close), (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), (gst_v4l2_get_input), (gst_v4l2_set_input): * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), (gst_v4l2_buffer_new), (gst_v4l2_buffer_pool_finalize), (gst_v4l2_buffer_pool_new), (gst_v4l2_buffer_pool_activate), (gst_v4l2src_fill_format_list), (gst_v4l2src_probe_caps_for_format_and_size), (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), (gst_v4l2src_get_nearest_size): Optionally use libv4l to access v4l2 devices. Fixes bug #545033. 2008-11-04 12:28:34 +0000 Stefan Kost Don't install static libs for plugins. Fixes #550851 for -good. Original commit message from CVS: * ext/aalib/Makefile.am: * ext/annodex/Makefile.am: * ext/cairo/Makefile.am: * ext/dv/Makefile.am: * ext/esd/Makefile.am: * ext/flac/Makefile.am: * ext/gconf/Makefile.am: * ext/gdk_pixbuf/Makefile.am: * ext/hal/Makefile.am: * ext/jpeg/Makefile.am: * ext/ladspa/Makefile.am: * ext/libcaca/Makefile.am: * ext/libmng/Makefile.am: * ext/libpng/Makefile.am: * ext/mikmod/Makefile.am: * ext/pulse/Makefile.am: * ext/raw1394/Makefile.am: * ext/shout2/Makefile.am: * ext/soup/Makefile.am: * ext/speex/Makefile.am: * ext/taglib/Makefile.am: * ext/wavpack/Makefile.am: * gst/alpha/Makefile.am: * gst/apetag/Makefile.am: * gst/audiofx/Makefile.am: * gst/auparse/Makefile.am: * gst/autodetect/Makefile.am: * gst/avi/Makefile.am: * gst/cutter/Makefile.am: * gst/debug/Makefile.am: * gst/effectv/Makefile.am: * gst/equalizer/Makefile.am: * gst/flx/Makefile.am: * gst/goom/Makefile.am: * gst/goom2k1/Makefile.am: * gst/icydemux/Makefile.am: * gst/id3demux/Makefile.am: * gst/interleave/Makefile.am: * gst/law/Makefile.am: * gst/level/Makefile.am: * gst/matroska/Makefile.am: * gst/median/Makefile.am: * gst/monoscope/Makefile.am: * gst/multifile/Makefile.am: * gst/multipart/Makefile.am: * gst/oldcore/Makefile.am: * gst/qtdemux/Makefile.am: * gst/replaygain/Makefile.am: * gst/rtp/Makefile.am: * gst/rtsp/Makefile.am: * gst/smpte/Makefile.am: * gst/spectrum/Makefile.am: * gst/udp/Makefile.am: * gst/videobox/Makefile.am: * gst/videocrop/Makefile.am: * gst/videofilter/Makefile.am: * gst/videomixer/Makefile.am: * gst/wavenc/Makefile.am: * gst/wavparse/Makefile.am: * sys/directdraw/Makefile.am: * sys/directsound/Makefile.am: * sys/oss/Makefile.am: * sys/osxaudio/Makefile.am: * sys/osxvideo/Makefile.am: * sys/sunaudio/Makefile.am: * sys/v4l2/Makefile.am: * sys/waveform/Makefile.am: * sys/ximage/Makefile.am: Don't install static libs for plugins. Fixes #550851 for -good. 2008-10-31 18:17:50 +0000 Sebastian Dröge ext/flac/Makefile.am: Include $(FLAC_CFLAGS) in CFLAGS to make sure to find the FLAC headers. Original commit message from CVS: * ext/flac/Makefile.am: Include $(FLAC_CFLAGS) in CFLAGS to make sure to find the FLAC headers. This fixes compilation if FLAC is installed in an uncommon location that is not already handled by other CFLAGS. Fixes bug #558711. 2008-10-31 10:08:50 +0000 Wim Taymans sys/v4l2/v4l2src_calls.c: Guard more uncommon formats with ifdefs so that we can compile on older versions. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_format_get_rank): Guard more uncommon formats with ifdefs so that we can compile on older versions. 2008-10-31 10:00:18 +0000 Nick Haddad gst/avi/gstavidemux.c: Invert other uncompressed RGB formats. Fixes #558554. Original commit message from CVS: Patch by: Nick Haddad * gst/avi/gstavidemux.c: (gst_avi_demux_is_uncompressed), (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): Invert other uncompressed RGB formats. Fixes #558554. 2008-10-30 15:08:49 +0000 Sebastian Dröge gst/wavenc/gstwavenc.*: Add support for float/double as input and remove the (nowadays) useless parsing of the depth ... Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), (gst_wavenc_sink_setcaps), (gst_wavenc_change_state): * gst/wavenc/gstwavenc.h: Add support for float/double as input and remove the (nowadays) useless parsing of the depth as we require width==depth. 2008-10-30 10:31:35 +0000 Wim Taymans gst/rtp/: Narrow down the caps of the mpeg audio pay/depayloaders to only accept mpeg version 1. Fixes #558427. Original commit message from CVS: * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps): * gst/rtp/gstrtpmpapay.c: Narrow down the caps of the mpeg audio pay/depayloaders to only accept mpeg version 1. Fixes #558427. 2008-10-29 18:28:25 +0000 Wim Taymans gst/rtp/gstrtpL16pay.c: Only put an integral amount of samples in the RTP packet. Original commit message from CVS: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_flush), (gst_rtp_L16_pay_getcaps): Only put an integral amount of samples in the RTP packet. Fixes #556641. 2008-10-28 17:42:02 +0000 Wim Taymans gst/rtp/gstrtpchannels.*: Add method to get possible channel positions. Original commit message from CVS: * gst/rtp/gstrtpchannels.c: (gst_rtp_channels_get_by_index): * gst/rtp/gstrtpchannels.h: Add method to get possible channel positions. 2008-10-28 17:39:48 +0000 Wim Taymans gst/rtp/Makefile.am: Also commit updated makefile Original commit message from CVS: * gst/rtp/Makefile.am: Also commit updated makefile 2008-10-28 14:56:08 +0000 Sebastian Dröge gst/wavenc/gstwavenc.c: Don't allow width=32,depth=24 as input. WAV requires that the width is the next integer multi... Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Don't allow width=32,depth=24 as input. WAV requires that the width is the next integer multiply of 8 from the depth. 2008-10-28 10:01:49 +0000 Wim Taymans gst/rtp/: Add mappings for multichannel support. Does not completely just work because the getcaps function does not ... Original commit message from CVS: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): * gst/rtp/gstrtpchannels.c: (check_channels), (gst_rtp_channels_get_by_pos), (gst_rtp_channels_get_by_order), (gst_rtp_channels_create_default): * gst/rtp/gstrtpchannels.h: Add mappings for multichannel support. Does not completely just work because the getcaps function does not yet return the allowed channel mappings. See #556641. 2008-10-28 06:50:57 +0000 Stefan Kost gst/goom/: Add license headers in all source files. Remove filter.c from Original commit message from CVS: * gst/goom/Makefile.am: * gst/goom/README: * gst/goom/config_param.c: * gst/goom/convolve_fx.c: * gst/goom/drawmethods.c: * gst/goom/drawmethods.h: * gst/goom/filters.c: * gst/goom/filters_mmx.s: * gst/goom/flying_stars_fx.c: * gst/goom/goom.h: * gst/goom/goom_config.h: * gst/goom/goom_config_param.h: * gst/goom/goom_core.c: * gst/goom/goom_filters.h: * gst/goom/goom_fx.h: * gst/goom/goom_graphic.h: * gst/goom/goom_plugin_info.h: * gst/goom/goom_tools.c: * gst/goom/goom_tools.h: * gst/goom/goom_typedefs.h: * gst/goom/goom_visual_fx.h: * gst/goom/graphic.c: * gst/goom/ifs.c: * gst/goom/ifs.h: * gst/goom/lines.c: * gst/goom/lines.h: * gst/goom/mathtools.c: * gst/goom/mathtools.h: * gst/goom/mmx.c: * gst/goom/motif_goom1.h: * gst/goom/motif_goom2.h: * gst/goom/plugin_info.c: * gst/goom/ppc_drawings.h: * gst/goom/ppc_zoom_ultimate.h: * gst/goom/sound_tester.c: * gst/goom/sound_tester.h: * gst/goom/surf3d.c: * gst/goom/surf3d.h: * gst/goom/tentacle3d.c: * gst/goom/tentacle3d.h: * gst/goom/v3d.c: * gst/goom/v3d.h: * gst/goom/xmmx.c: Add license headers in all source files. Remove filter.c from EXTRA_DIST, as its in SOURCES already. Mention the files in the REDME which are not used right now. Fixes #557709. 2008-10-27 11:28:30 +0000 Olivier Crete gst/rtp/gstrtpL16pay.c: Implement getcaps in rtpL16pay. Fixes #556484. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_class_init), (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): Implement getcaps in rtpL16pay. Fixes #556484. 2008-10-27 11:03:53 +0000 Wim Taymans gst/rtp/gstrtpL16depay.c: Check if clock-rate and channels are valid. Original commit message from CVS: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps), (gst_rtp_L16_depay_process): Check if clock-rate and channels are valid. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps), (gst_rtp_ac3_depay_process): Don't ignore the return value of set_caps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): * gst/rtp/gstrtpamrdepay.h: Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set output caps on the buffers, the base class does that for us. The subclass will make sure we are negotiated. * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps), (gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset): * gst/rtp/gstrtpdvdepay.h: Clean up caps negotiation. The subclass will make sure we are negotiated. * gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps), (gst_rtp_g726_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init), (gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process): * gst/rtp/gstrtpg729depay.h: The subclass will make sure we are negotiated. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps), (gst_rtp_gsm_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): Clean up caps negotiation. Don't ignore the return value of set_outcaps. * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps), (gst_rtp_h263_depay_process): Clean up caps negotiation. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps), (gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer): * gst/rtp/gstrtph263pay.h: Don't ignore the return value of set_outcaps. Do some more timestamps. * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), (gst_rtp_h263p_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush), (gst_rtp_h263p_pay_handle_buffer): * gst/rtp/gstrtph263ppay.h: Don't ignore the return value of set_outcaps. Do some more timestamps. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. Fix possible caps leak. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps): Add some more debug info. * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps), (gst_rtp_ilbc_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps): Clean up caps negotiation. * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps), (gst_rtp_mp1s_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps), (gst_rtp_mp4a_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps), (gst_rtp_mp4v_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps), (gst_rtp_mpv_depay_process): Clean up caps negotiation. Actually set output caps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps), (gst_rtp_pcma_depay_process): Clean up caps negotiation. Set output buffer duration because we can. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps), (gst_rtp_pcmu_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): Clean up caps negotiation. Set output caps on the pad and header buffers. Set duration on output buffers because we can. * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps), (gst_rtp_sv3v_depay_process): Clean up caps negotiation. No need to validate the buffer, the base class does that for us. No need to set caps out output buffers, subclass does that. * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps), (gst_rtp_theora_depay_process): Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init), (gst_rtp_theora_pay_flush_packet), (encode_base64), (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id), (gst_rtp_theora_pay_handle_buffer): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_process): Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): Clean up caps negotiation, don't ignore setcaps return. * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps): Don't ignore the return value of set_outcaps. 2008-10-27 10:35:07 +0000 Wim Taymans gst/matroska/matroska-demux.c: Forward unknown events upstream. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_src_event): Forward unknown events upstream. 2008-10-27 10:33:20 +0000 Wim Taymans tests/check/elements/icydemux.c: Add some refcount check Original commit message from CVS: * tests/check/elements/icydemux.c: (icydemux_found_pad): Add some refcount check * tests/check/elements/rtp-payloading.c: (rtp_pipeline_run): Don't ignore the result of write(), fixes a compiler warning for me. * tests/icles/videobox-test.c: (main): Make the output a little more pretty. 2008-10-27 09:26:19 +0000 Stefan Kost ext/esd/esdmon.c: Add doc blob. Original commit message from CVS: * ext/esd/esdmon.c: Add doc blob. 2008-10-27 09:21:44 +0000 Stefan Kost docs/plugins/: Add the docs of the new elements. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-autodetect.xml: Add the docs of the new elements. 2008-10-27 09:04:37 +0000 Sebastian Dröge gst/autodetect/: Fix "Since" tags in the documentation. Original commit message from CVS: * gst/autodetect/gstautoaudiosrc.c: (gst_auto_audio_src_class_init): * gst/autodetect/gstautovideosrc.c: (gst_auto_video_src_class_init): Fix "Since" tags in the documentation. 2008-10-27 09:00:29 +0000 Sjoerd Simons ext/soup/gstsouphttpsrc.c: Add support for souphttpsrc to act as a live source. This makes it possible to get timesta... Original commit message from CVS: Patch by: Sjoerd Simons * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property): Add support for souphttpsrc to act as a live source. This makes it possible to get timestamped buffers in combination with the "do-timestamp" property. Fixes bug #556019. 2008-10-27 08:54:30 +0000 Stefan Kost gst/autodetect/: Implement src plugins. Little code/string cleanup in the sinks. Original commit message from CVS: * gst/autodetect/Makefile.am: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautoaudiosrc.c: * gst/autodetect/gstautoaudiosrc.h: * gst/autodetect/gstautodetect.c: * gst/autodetect/gstautovideosink.c: * gst/autodetect/gstautovideosrc.c: * gst/autodetect/gstautovideosrc.h: Implement src plugins. Little code/string cleanup in the sinks. Fixes #523813. 2008-10-27 08:45:11 +0000 Peter Kjellerstedt gst/matroska/matroska-mux.c: Fix a memory leak when pads are requested but the pipeline never goes into PLAYING. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad): Fix a memory leak when pads are requested but the pipeline never goes into PLAYING. Correctly remove request pads, no matter if they have collected data or not. Fixes bug #557710. 2008-10-27 08:40:02 +0000 Sebastian Dröge gst/udp/gstudpnetutils.h: Define the correct WINVER so getaddinfo() can be used when using mingw32. Fixes bug #557294. Original commit message from CVS: Patch by: * gst/udp/gstudpnetutils.h: Define the correct WINVER so getaddinfo() can be used when using mingw32. Fixes bug #557294. 2008-10-27 08:36:43 +0000 Sebastian Dröge gst/udp/: Fix "argument type mismatch" compiler warnings on Windows. Original commit message from CVS: Patch by: * gst/udp/gstdynudpsink.c: (gst_dynudpsink_render): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Fix "argument type mismatch" compiler warnings on Windows. Fixes bug #557293. 2008-10-27 08:30:51 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Don't calculate the filter coefficients for every single buffer but only when it's n... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (update_coefficients): Don't calculate the filter coefficients for every single buffer but only when it's needed. Fixes bug #557260. 2008-10-26 20:05:43 +0000 Jan Schmidt configure.ac: Back to development -> 0.10.11.1 Original commit message from CVS: * configure.ac: Back to development -> 0.10.11.1 2008-10-26 20:04:21 +0000 Jan Schmidt gst-plugins-good.doap: Fix version number of 0.10.11 release in doap file Original commit message from CVS: * gst-plugins-good.doap: Fix version number of 0.10.11 release in doap file === release 0.10.11 === 2008-10-24 22:41:18 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.11 Original commit message from CVS: Release 0.10.11 2008-10-24 22:20:47 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/id.po: * po/it.po: * po/ja.po: * po/lt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files Original commit message from CVS: Update .po files 2008-10-24 16:30:53 +0000 Jan Schmidt configure.ac: Commit 0.10.10.4 pre-release Original commit message from CVS: * configure.ac: Commit 0.10.10.4 pre-release 2008-10-21 12:42:45 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Fix VPRP chunk setup in avimux. Original commit message from CVS: * gst/avi/gstavimux.c: Fix VPRP chunk setup in avimux. Fixes: #556010 Patch By: Mark Nauwelaerts 2008-10-21 12:38:35 +0000 Wim Taymans gst/videobox/gstvideobox.c: support dynamically changing properties in videobox Original commit message from CVS: * gst/videobox/gstvideobox.c: support dynamically changing properties in videobox Fixed: #557085 Patch By: Wim Taymans 2008-10-16 17:10:42 +0000 Jan Schmidt configure.ac: 0.10.10.3 pre-release Original commit message from CVS: * configure.ac: 0.10.10.3 pre-release 2008-10-16 15:30:22 +0000 Jan Schmidt tests/check/Makefile.am: Don't run the states test on pulsesrc and pulsesink Original commit message from CVS: * tests/check/Makefile.am: Don't run the states test on pulsesrc and pulsesink 2008-10-16 11:52:44 +0000 Jan Schmidt configure.ac: Commit 0.10.10.2 pre-release bump that actually went out on 2008-10-11 Original commit message from CVS: * configure.ac: Commit 0.10.10.2 pre-release bump that actually went out on 2008-10-11 2008-10-15 15:42:29 +0000 Edward Hervey gst/avi/gstavidemux.c: Skip entries for streams that don't have a output pad yet, thereby avoiding calling pad functi... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan): Skip entries for streams that don't have a output pad yet, thereby avoiding calling pad functions with a NULL pad. Fixes #556424 2008-10-15 09:39:27 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Remove previous wrong commit Original commit message from CVS: * gst/qtdemux/qtdemux.c: Remove previous wrong commit * tests/check/elements/icydemux.c: (icydemux_found_pad): Remove problematic and useless refcount check. Fixes #556381 2008-10-15 09:27:27 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Remove problematic and useless refcount check. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_node): Remove problematic and useless refcount check. Fixes #556381 2008-10-10 12:28:34 +0000 Jan Schmidt ext/flac/: Cast some size_t arguments to guint to avoid compiler warnings on 64-bit systems. Original commit message from CVS: * ext/flac/gstflacdec.c (gst_flac_dec_read_stream): * ext/flac/gstflacenc.c (gst_flac_enc_write_callback): Cast some size_t arguments to guint to avoid compiler warnings on 64-bit systems. 2008-10-09 14:27:12 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Return TRUE instead of FALSE from the event handler when we swallowed the event. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_event): Return TRUE instead of FALSE from the event handler when we swallowed the event. 2008-10-08 15:59:56 +0000 Christian Schaller * gst-plugins-good.spec.in: remove old CDIO plugin now in ugly Original commit message from CVS: remove old CDIO plugin now in ugly 2008-10-08 14:47:14 +0000 Wim Taymans gst/avi/gstavidemux.c: Reset header state. Fixes #555321. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_index): Reset header state. Fixes #555321. 2008-10-08 13:31:44 +0000 Wim Taymans gst/avi/gstavidemux.*: For timestamping audio packets we need to take into account the amount of blocks in one entry ... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index): * gst/avi/gstavidemux.h: For timestamping audio packets we need to take into account the amount of blocks in one entry using the blockalign. Fixes some sync issues with zero-padded audio blocks in the beginning of avi files. 2008-10-08 10:42:26 +0000 Wim Taymans gst/multifile/gstmultifilesrc.c: Implement DEFAULT and BUFFER position queries. See #555260. Original commit message from CVS: * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_class_init), (gst_multi_file_src_query): Implement DEFAULT and BUFFER position queries. See #555260. 2008-10-08 09:29:00 +0000 Edward Hervey sys/ximage/gstximagesrc.c: Fix build for systems that don't have XDamage. Original commit message from CVS: * sys/ximage/gstximagesrc.c: (gst_ximage_src_stop): Fix build for systems that don't have XDamage. 2008-10-07 09:58:13 +0000 Wim Taymans tests/examples/rtp/: Add some more H263p server and client examples. Original commit message from CVS: * tests/examples/rtp/client-H263p.sdp: * tests/examples/rtp/client-H263p.sh: * tests/examples/rtp/server-VTS-H263p.sh: Add some more H263p server and client examples. 2008-10-03 17:03:07 +0000 Tim-Philipp Müller configure.ac: Depend on released versions of core and base. Original commit message from CVS: * configure.ac:: Depend on released versions of core and base. 2008-10-03 16:13:32 +0000 Wim Taymans ext/pulse/: Return -1 instead of 0 in error cases. Fixes #554771. Original commit message from CVS: * ext/pulse/pulsesink.c: (gst_pulsesink_write): * ext/pulse/pulsesrc.c: (gst_pulsesrc_read): Return -1 instead of 0 in error cases. Fixes #554771. 2008-10-03 15:54:07 +0000 Wim Taymans sys/ximage/gstximagesrc.c: Stop leaking the cursor image. Original commit message from CVS: * sys/ximage/gstximagesrc.c: (gst_ximage_src_start), (gst_ximage_src_stop), (gst_ximage_src_ximage_get): Stop leaking the cursor image. Unref the last_ximage and the cached cursor image on shutdown. Fixes #551570. 2008-10-03 11:32:47 +0000 Wim Taymans sys/v4l2/gstv4l2object.h: Getting the Class from an instance is not just a matter of casting it to the class struct b... Original commit message from CVS: * sys/v4l2/gstv4l2object.h: Getting the Class from an instance is not just a matter of casting it to the class struct but it involves calling G_OBJECT_GET_CLASS on the instance. Fixes #549784. 2008-10-01 21:22:26 +0000 Michael Smith configure.ac: Fix libs for linking directsound. Original commit message from CVS: * configure.ac: Fix libs for linking directsound. * sys/directsound/gstdirectsoundsink.c: Fix buffer sizing to prevent racing the ringbuffer at startup. Add volume property. 2008-09-27 00:43:07 +0000 Jan Schmidt ext/pulse/pulsesink.c: Fix problems with pulsesink randomly erroring with code 'OK' after a format change on the stre... Original commit message from CVS: * ext/pulse/pulsesink.c: Fix problems with pulsesink randomly erroring with code 'OK' after a format change on the stream by waiting when disconnecting the stream. 2008-09-26 14:44:49 +0000 Wim Taymans gst/rtp/gstrtpamrdepay.c: Mark DISCONT on output buffers when the marker bit signals a new talk spurt. Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_class_init), (gst_rtp_amr_depay_process): Mark DISCONT on output buffers when the marker bit signals a new talk spurt. * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): Set the marker bit for buffers with a DISCONT flag to signal a talk spurt. 2008-09-26 13:55:48 +0000 Wim Taymans gst/rtp/: Added MP4A-LATM payloader to match the depayloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_get_type), (gst_rtp_mp4a_pay_base_init), (gst_rtp_mp4a_pay_class_init), (gst_rtp_mp4a_pay_init), (gst_rtp_mp4a_pay_finalize), (gst_rtp_mp4a_pay_parse_audio_config), (gst_rtp_mp4a_pay_new_caps), (gst_rtp_mp4a_pay_setcaps), (gst_rtp_mp4a_pay_handle_buffer), (gst_rtp_mp4a_pay_change_state), (gst_rtp_mp4a_pay_plugin_init): * gst/rtp/gstrtpmp4apay.h: Added MP4A-LATM payloader to match the depayloader. 2008-09-25 15:11:16 +0000 Wim Taymans gst/videomixer/videomixer.c: Handle segments a little better. Fixes #537361. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), (gst_videomixer_sink_event): Handle segments a little better. Fixes #537361. 2008-09-25 12:07:46 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Don't assume the server supports PAUSE by default. Fixes #551048. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_methods): Don't assume the server supports PAUSE by default. Fixes #551048. 2008-09-25 11:30:35 +0000 Wim Taymans gst/udp/gstudpsrc.c: Switch on the socket family to get the addrlen size right. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_set_uri), (gst_udpsrc_start): Switch on the socket family to get the addrlen size right. 2008-09-25 10:34:39 +0000 Daniel Franke gst/udp/gstudpsrc.c: OS X's bind() implementation is picky about its addrlen parameter and fails with EINVAL if it is... Original commit message from CVS: Patch by: Daniel Franke * gst/udp/gstudpsrc.c: (gst_udpsrc_create), (gst_udpsrc_start): OS X's bind() implementation is picky about its addrlen parameter and fails with EINVAL if it is larger than expected for the socket's address family. Set the length to the expected length instead. Fixes #553191. 2008-09-23 18:08:56 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Handle the case where we cannot do desribe or when the describe result does not contain a vali... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): Handle the case where we cannot do desribe or when the describe result does not contain a valid SDP message. 2008-09-23 17:31:22 +0000 Wim Taymans gst/udp/gstmultiudpsink.c: Fix setting the qos. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_set_property): Fix setting the qos. 2008-09-17 14:50:42 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Some 'broken' files out there have atom lengths of zero... which basically results in qtdemux ... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header), (gst_qtdemux_chain): Some 'broken' files out there have atom lengths of zero... which basically results in qtdemux consuming that atom again and again until the *end of night* ! Detect that and emits an adequate element error message. 2008-09-17 13:49:04 +0000 Jan Schmidt gst/: Fix build flags order. Original commit message from CVS: * gst/interleave/Makefile.am: * gst/matroska/Makefile.am: Fix build flags order. * tests/check/elements/audioamplify.c: (GST_START_TEST): * tests/check/elements/audiodynamic.c: (GST_START_TEST): * tests/check/elements/audioinvert.c: (GST_START_TEST): * tests/check/elements/audiopanorama.c: (GST_START_TEST): Format fixes. * tests/check/elements/multifile.c: Pull in unistd.h 2008-09-15 21:10:23 +0000 Wim Taymans gst/rtp/gstrtpmp4gdepay.*: Handle interleaved streams by reordering AU in a queue. Original commit message from CVS: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_finalize), (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_clear_queue), (gst_rtp_mp4g_depay_flush_queue), (gst_rtp_mp4g_depay_queue), (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_change_state): * gst/rtp/gstrtpmp4gdepay.h: Handle interleaved streams by reordering AU in a queue. 2008-09-15 16:04:26 +0000 Wim Taymans gst/rtp/gstrtpmp4gdepay.c: Change some of the ranges in the caps, mostly for the amount of bits we can use. Original commit message from CVS: * gst/rtp/gstrtpmp4gdepay.c: (gst_bs_parse_init), (gst_bs_parse_read), (gst_rtp_mp4g_depay_process): Change some of the ranges in the caps, mostly for the amount of bits we can use. Added a little bitstream parse and use it to parse the AU header fields. Check for malformed and wrongly sized packets better. Implement more header field parsing. Handle the size of fragmented packets correctly. 2008-09-14 11:32:15 +0000 Jonathan Matthew gst/qtdemux/qtdemux.c: Add mapping for 'tiff' => image/tiff Original commit message from CVS: Patch by: Jonathan Matthew * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add mapping for 'tiff' => image/tiff Fixes #552213 2008-09-11 11:26:06 +0000 Tim-Philipp Müller ext/raw1394/: Pretend to care about the result of write() which works around compiler warnings. Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (SEND_COMMAND): * ext/raw1394/gsthdv1394src.c: (SEND_COMMAND): Pretend to care about the result of write() which works around compiler warnings. 2008-09-04 09:25:59 +0000 Tim-Philipp Müller ext/flac/gstflacenc.c: Make sure the desired default values are actually set, not only registered as defaults (actual... Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_class_init): Make sure the desired default values are actually set, not only registered as defaults (actual problem is that the stereo-specific values are only updated if channels==2, which is not the case yet when the object is created, so the default values for the mid-side-stereo and loose-mid-side-stereo settings are never set in _update_quality()). Makes flacenc create smaller files by default (for stereo input), and fixes #550791. 2008-09-03 12:39:35 +0000 Mark Nauwelaerts gst/qtdemux/: Add support for video/mj2 mime-type and its additional atoms/boxes. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_loop_state_header), (qtdemux_parse_node), (qtdemux_parse_trak), (qtdemux_video_caps): * gst/qtdemux/qtdemux.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: Add support for video/mj2 mime-type and its additional atoms/boxes. Fixes #550646. 2008-09-03 11:10:25 +0000 Stefan Kost gst/debug/gsttaginject.c: Add warning when tags parameter is unparsable and give example for quoting in the docs. Original commit message from CVS: * gst/debug/gsttaginject.c: Add warning when tags parameter is unparsable and give example for quoting in the docs. 2008-09-02 15:27:49 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Add mapping for IMA Loki SDL MJPEG ADPCM codec. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): Add mapping for IMA Loki SDL MJPEG ADPCM codec. Add some alternative byteswapped mappings that seem to pop up sometimes. Fixes #550288. 2008-09-02 09:40:38 +0000 Tim-Philipp Müller po/: Add 'ca' to LINGUAS; add some more files with translations and some files which should be ignored by translation... Original commit message from CVS: * po/LINGUAS: * po/POTFILES.in: * po/POTFILES.skip: Add 'ca' to LINGUAS; add some more files with translations and some files which should be ignored by translation tools. 2008-09-02 08:51:04 +0000 Sebastian Dröge ext/speex/: Use integer encoding and decoding functions instead of converting the integer input to float in the eleme... Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): * ext/speex/gstspeexdec.h: * ext/speex/gstspeexenc.c: (gst_speex_enc_encode): * ext/speex/gstspeexenc.h: Use integer encoding and decoding functions instead of converting the integer input to float in the element. The libspeex integer functions are doing this for us already or, if libspeex was compiled in integer mode, they're doing everything using integer arithmetics. Also saves some copying around. 2008-09-01 13:29:29 +0000 Tim-Philipp Müller configure.ac: Fix --disable-external Original commit message from CVS: * configure.ac: Fix --disable-external 2008-08-31 17:09:18 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.*: Handle non-zero start timestamps and stream discontinuities correctly. This only has an ... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain): * ext/wavpack/gstwavpackenc.h: Handle non-zero start timestamps and stream discontinuities correctly. This only has an effect if we're muxing into a container format as the raw WavPack stream must contain continous sample numbers. 2008-08-31 15:02:09 +0000 Sebastian Dröge ext/speex/gstspeexenc.c: Correct the timestamp and granulepos calculation by one Speex frame. Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speex_enc_encode): Correct the timestamp and granulepos calculation by one Speex frame. 2008-08-31 14:39:57 +0000 Sebastian Dröge ext/speex/gstspeexdec.c: Correctly take the granulepos from upstream if possible and correctly handle the granulepos ... Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): Correctly take the granulepos from upstream if possible and correctly handle the granulepos in various calculations: the granulepos is the sample number of the _last_ sample in a frame, not the first. * ext/speex/gstspeexenc.c: (gst_speex_enc_sinkevent), (gst_speex_enc_encode), (gst_speex_enc_chain), (gst_speex_enc_change_state): * ext/speex/gstspeexenc.h: Handle non-zero start timestamps in the encoder and detect/handle stream discontinuities. Fixes bug #547075. 2008-08-31 08:32:45 +0000 Craig Keogh ext/annodex/gstcmmlparser.c: Fix compiler warnings caused by passing a string as format string instead of "%s" and th... Original commit message from CVS: Patch by: Craig Keogh * ext/annodex/gstcmmlparser.c: (gst_cmml_parser_parse_chunk): Fix compiler warnings caused by passing a string as format string instead of "%s" and then the string. This is only exposed by -Wformat=2 as used by default on Ubuntu. Fixes bug #550015. 2008-08-30 14:15:03 +0000 Tim-Philipp Müller Make stuff compile with GST_DISABLE_GST_DEBUG. Original commit message from CVS: * ext/raw1394/gsthdv1394src.c: (gst_hdv1394src_create): * gst/alpha/gstalpha.c: (gst_alpha_get_unit_size): * gst/audiofx/audiocheblimit.c: (generate_coefficients): * gst/avi/gstavidemux.c: (gst_avi_demux_src_convert): * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), (gst_ebml_read_element_length): * gst/matroska/matroska-demux.c: (gst_matroska_demux_check_subtitle_buffer): Make stuff compile with GST_DISABLE_GST_DEBUG. 2008-08-29 00:28:55 +0000 Michael Smith gst/law/: Ref caps before passing to gst_pad_template_new(), since that takes ownership. Original commit message from CVS: * gst/law/alaw.c: * gst/law/mulaw.c: Ref caps before passing to gst_pad_template_new(), since that takes ownership. 2008-08-28 10:09:16 +0000 Mersad Jelacic gst/multipart/: Convert audio/x-adpcm to and from the audio/G726-X in the muxer and demuxer. Fixes #549551. Original commit message from CVS: Patch by: Mersad Jelacic * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: (gst_multipart_mux_get_mime): Convert audio/x-adpcm to and from the audio/G726-X in the muxer and demuxer. Fixes #549551. 2008-08-27 16:12:39 +0000 Edward Hervey sys/osxaudio/: Fix the build on macosx. Original commit message from CVS: * sys/osxaudio/gstosxaudiosink.c: (gst_osx_audio_sink_select_device): * sys/osxaudio/gstosxaudiosrc.c: (gst_osx_audio_src_create_ringbuffer), (gst_osx_audio_src_select_device): * sys/osxaudio/gstosxringbuffer.c: (gst_osx_ring_buffer_acquire): Fix the build on macosx. 2008-08-27 15:42:11 +0000 Tim-Philipp Müller gst/icydemux/gsticydemux.c: Small docs fix: in the example pipeline, we need to pass iradio-mode=true to the source, ... Original commit message from CVS: * gst/icydemux/gsticydemux.c: Small docs fix: in the example pipeline, we need to pass iradio-mode=true to the source, so the server actually sends an ICY stream. 2008-08-27 00:08:20 +0000 Michael Smith sys/osxaudio/gstosxaudio.c: Oops. Revert more completely. Original commit message from CVS: * sys/osxaudio/gstosxaudio.c: Oops. Revert more completely. 2008-08-26 23:57:05 +0000 Michael Smith sys/osxaudio/gstosxaudio.c: Revert accidental element rename from testing. Original commit message from CVS: * sys/osxaudio/gstosxaudio.c: Revert accidental element rename from testing. 2008-08-26 23:53:40 +0000 Jan Schmidt gst-plugins-good.doap: Pull in 0.10.10 doap entry from release branch Original commit message from CVS: * gst-plugins-good.doap: Pull in 0.10.10 doap entry from release branch 2008-08-26 23:05:57 +0000 Jan Schmidt configure.ac: Update version number to reflect 0.10.10 release from branch. Original commit message from CVS: * configure.ac: Update version number to reflect 0.10.10 release from branch. 2008-08-26 21:13:08 +0000 Michael Smith sys/osxaudio/: Rewrite caps setting and ring buffer initialisation. Original commit message from CVS: * sys/osxaudio/Makefile.am: * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosink.h: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxaudio/gstosxaudiosrc.h: * sys/osxaudio/gstosxringbuffer.c: * sys/osxaudio/gstosxringbuffer.h: Rewrite caps setting and ring buffer initialisation. Previously we never told CoreAudio what format we were going to send it, so it only worked due to luck, and not at all on some hardware. Now we explicitly advertise what formats the hardware supports, and then configure the selected one correctly. 2008-08-26 12:27:11 +0000 Stefan Kost sys/v4l2/: Fix memory leaks. Small code cleanups : No need for empty _init(). No need to memset instance structures. ... Original commit message from CVS: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: Fix memory leaks. Small code cleanups : No need for empty _init(). No need to memset instance structures. Some more FIXME's. 2008-08-26 08:11:26 +0000 Stefan Kost tests/icles/.cvsignore: Ignore more. Original commit message from CVS: * tests/icles/.cvsignore: Ignore more. 2008-08-26 08:00:57 +0000 Stefan Kost gst/: Ignore files. Original commit message from CVS: * gst/goom/.cvsignore: * gst/goom2k1/.cvsignore: Ignore files. 2008-08-26 07:51:42 +0000 Stefan Kost ext/cairo/gsttextoverlay.c: Fix compiler warning. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: Fix compiler warning. 2008-08-26 05:42:15 +0000 David Schleef ext/cairo/gsttextoverlay.c: Fix obvious memleak. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: Fix obvious memleak. 2008-08-25 14:15:43 +0000 Edward Hervey gst/matroska/: Add Real[Audio|Video] support to Matroska containers. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_send_event), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps), (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_finish): Add Real[Audio|Video] support to Matroska containers. It works fine for: * decoding real audio/video streams contained in mkv * 'transmuxing' real (.rm) files into .mkv files It will not work though for encoding real[audio/video] streams that don't contain the 'mdpr_data' extra data on the caps. The reason why this will not work is because I never intended to duplicate virtually all the 'mdpr' block creation into mkvmux. Fixes #536067 2008-08-25 09:48:06 +0000 Wim Taymans gst/law/: The encoder can't really renegotiate at the time they perform a pad-alloc so make the srcpads use fixed caps. Original commit message from CVS: * gst/law/alaw-encode.c: (gst_alaw_enc_init), (gst_alaw_enc_chain): * gst/law/mulaw-conversion.c: * gst/law/mulaw-encode.c: (gst_mulawenc_init), (gst_mulawenc_chain): The encoder can't really renegotiate at the time they perform a pad-alloc so make the srcpads use fixed caps. Check the buffer size after a pad-alloc because the returned size might not be right when the downstream element does not know the size of the new buffer (capsfilter). Fixes #549073. 2008-08-23 15:43:49 +0000 Filippo Argiolas sys/v4l2/gstv4l2tuner.c: v4l2src doesn't have a property named "norm" so don't try to notify about changes to that pr... Original commit message from CVS: Patch by: Filippo Argiolas * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_set_norm_and_notify): v4l2src doesn't have a property named "norm" so don't try to notify about changes to that property. The "norm" property and related code are commented out currently. Fixes bug #549090. 2008-08-23 15:33:49 +0000 Mike Ruprecht sys/v4l2/gstv4l2object.c: Reprobe devices again instead of taking a cached list as new devices could've been plugged ... Original commit message from CVS: Patch by: Mike Ruprecht * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices): Reprobe devices again instead of taking a cached list as new devices could've been plugged in. Fixes bug #549062. 2008-08-22 16:04:02 +0000 Sebastian Dröge gst/autodetect/Makefile.am: Don't link the autodetect plugin with GConf as it doesn't use GConf. Fixes bug #545463. Original commit message from CVS: * gst/autodetect/Makefile.am: Don't link the autodetect plugin with GConf as it doesn't use GConf. Fixes bug #545463. 2008-08-22 12:24:23 +0000 Sebastian Dröge gst/matroska/ebml-read.c: Change some GST_ELEMENT_ERRORs to GST_ERROR_OBJECT to make it possible to ignore errors and... Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_read_uint), (gst_ebml_read_sint), (gst_ebml_read_float), (gst_ebml_read_header): Change some GST_ELEMENT_ERRORs to GST_ERROR_OBJECT to make it possible to ignore errors and not post any ERROR messages on the bus. * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_contents): Ignore any errors and not just EOS when parsing the contents of a SeekHead. Errors here are usually caused by truncated files and playback of the file works fine. Fixes playback of the audio_only_chapter_seekbroken.mka file from the MPlayer samples archive. 2008-08-22 11:29:26 +0000 Zaheer Abbas Merali gst/multipart/: Conform to RFC2046. audio/basic is mulaw 8000Hz mono. Original commit message from CVS: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: Conform to RFC2046. audio/basic is mulaw 8000Hz mono. 2008-08-21 21:56:19 +0000 Ole André Vadla Ravnås * ChangeLog: * sys/directdraw/gstdirectdrawsink.c: sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc, gst_directdraw_sink_bufferpool_clear): Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc, gst_directdraw_sink_bufferpool_clear): Fix two more buffer ref leaks. 2008-08-21 15:28:09 +0000 Ole André Vadla Ravnås sys/directdraw/gstdirectdrawsink.c: Fix buffer ref leak. Original commit message from CVS: Patch by: Ole André Vadla Ravnås * sys/directdraw/gstdirectdrawsink.c: (gst_directdraw_sink_show_frame): Fix buffer ref leak. 2008-08-21 13:27:12 +0000 Sebastian Dröge gst/wavenc/gstwavenc.c: Revert the last commit. wavenc still supports width!=depth for 32 bit width. Thanks Tim. Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Revert the last commit. wavenc still supports width!=depth for 32 bit width. Thanks Tim. 2008-08-21 13:22:06 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: If the duration of a block is unknown only use the timestamp for the first lace and us... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup_or_simpleblock): If the duration of a block is unknown only use the timestamp for the first lace and use GST_CLOCK_TIME_NONE as duration for the following laces. Otherwise every lace has the same timestamp which leads to various problems. Really fixes bug #548831. 2008-08-21 12:56:01 +0000 Sebastian Dröge gst/wavenc/gstwavenc.c: If we're not allowing width!=depth in wavenc we should also disable the code that was added t... Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): If we're not allowing width!=depth in wavenc we should also disable the code that was added to support width!=depth. 2008-08-21 12:52:47 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Don't calculate the default duration of a frame from the audio sampling rate. This onl... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): Don't calculate the default duration of a frame from the audio sampling rate. This only works for raw audio if every frame contains a single sample and results in broken buffer durations for other formats if no specified default duration is given or the blocks have no duration. Fixes bug #548831. 2008-08-21 12:34:33 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Allow zero sized blocks instead of returning GST_FLOW_OK. Such blocks are used for tex... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup_or_simpleblock): Allow zero sized blocks instead of returning GST_FLOW_OK. Such blocks are used for text/plain subtitles as a gap-filler in some files. 2008-08-21 12:12:00 +0000 Wim Taymans sys/v4l2/gstv4l2src.c: Add S910 and PWC formats with a low priority. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_structure), (gst_v4l2_get_caps_info): Add S910 and PWC formats with a low priority. * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_format_get_rank), (gst_v4l2src_probe_caps_for_format): Add more debugging. 2008-08-20 21:54:35 +0000 Tim-Philipp Müller ext/flac/gstflacenc.c: Fix compilation against older libflac versions. Original commit message from CVS: * ext/flac/gstflacenc.c: Fix compilation against older libflac versions. 2008-08-20 17:46:48 +0000 Sebastian Dröge ext/pulse/: Use GST_BOILERPLATE everywhere and fix coding style at some places. Original commit message from CVS: * ext/pulse/pulsemixer.c: (gst_pulsemixer_class_init), (gst_pulsemixer_set_property), (gst_pulsemixer_get_property): * ext/pulse/pulsemixerctrl.c: (gst_pulsemixer_ctrl_subscribe_cb), (gst_pulsemixer_ctrl_open), (gst_pulsemixer_ctrl_timeout_event), (gst_pulsemixer_ctrl_set_volume): * ext/pulse/pulsemixertrack.c: (gst_pulsemixer_track_new): * ext/pulse/pulseprobe.c: (gst_pulseprobe_open): * ext/pulse/pulsesink.c: (gst_pulsesink_class_init), (gst_pulsesink_init), (gst_pulsesink_open), (gst_pulsesink_prepare), (gst_pulsesink_write), (gst_pulsesink_delay), (gst_pulsesink_reset): * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), (gst_pulsesrc_init): Use GST_BOILERPLATE everywhere and fix coding style at some places. Fix a locking issue in pulsesink's prepare function. * ext/pulse/pulseutil.c: (gst_pulse_channel_map_to_gst): Check if the created channel layout is valid for GStreamer. 2008-08-20 17:42:21 +0000 Wim Taymans gst/rtsp/gstrtspgoogle.c: Things that can happen when your brain is in google mode trying to deal with their google r... Original commit message from CVS: * gst/rtsp/gstrtspgoogle.c: Things that can happen when your brain is in google mode trying to deal with their google rtsp server extensions and trying to type your google mail account. 2008-08-20 17:30:19 +0000 Wim Taymans gst/rtsp/: Add google RTSP extension, it can only handle udp and responds with unsupported if we do anything else. Fi... Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtsp.c: (plugin_init): * gst/rtsp/gstrtspgoogle.c: (gst_rtsp_google_before_send), (gst_rtsp_google_after_send), (gst_rtsp_google_get_transports), (_do_init), (gst_rtsp_google_base_init), (gst_rtsp_google_class_init), (gst_rtsp_google_init), (gst_rtsp_google_finalize), (gst_rtsp_google_change_state), (gst_rtsp_google_extension_init): * gst/rtsp/gstrtspgoogle.h: Add google RTSP extension, it can only handle udp and responds with unsupported if we do anything else. Fixes #546465. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_connection_send), (gst_rtspsrc_connection_receive), (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_create_transports_string), (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_pause): Make transport setup code a bit better using GString. Add some more debug. Check for closed connections before doing anything on them. 2008-08-20 17:17:55 +0000 Sebastian Dröge ext/pulse/: If downstream provides no channel layout and >2 channels should be used use the default layout that pulse... Original commit message from CVS: * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), (gst_pulsesrc_create_stream), (gst_pulsesrc_negotiate), (gst_pulsesrc_prepare): * ext/pulse/pulseutil.c: (gst_pulse_gst_to_channel_map), (gst_pulse_channel_map_to_gst): * ext/pulse/pulseutil.h: If downstream provides no channel layout and >2 channels should be used use the default layout that pulseaudio chooses and also add this layout to the caps. Fixes bug #547258. 2008-08-20 11:51:38 +0000 Peter Kjellerstedt gst/udp/: Avoid leaking internally allocated file descriptors when setting custom file descriptors. Fixes #543101. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/udp/gstdynudpsink.c: (gst_dynudpsink_init), (gst_dynudpsink_finalize), (gst_dynudpsink_set_property), (gst_dynudpsink_init_send), (gst_dynudpsink_close): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init), (gst_multiudpsink_finalize), (gst_multiudpsink_set_property): * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), (gst_udpsrc_set_property): Avoid leaking internally allocated file descriptors when setting custom file descriptors. Fixes #543101. 2008-08-20 11:48:46 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Don't try to configure RTCP back to the server when the server did not give us a valid port nu... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink): Don't try to configure RTCP back to the server when the server did not give us a valid port number. 2008-08-20 10:59:52 +0000 Wim Taymans gst/videobox/gstvideobox.c: Use new basetransform method to renegotiate. Fixes #544956. Original commit message from CVS: * gst/videobox/gstvideobox.c: (gst_video_box_set_property): Use new basetransform method to renegotiate. Fixes #544956. * tests/icles/Makefile.am: * tests/icles/videobox-test.c: (make_pipeline), (main): Add videobox renegotiation example. 2008-08-19 21:03:22 +0000 David Schleef gst/wavenc/gstwavenc.c: Remove depth ranges and replace with sane values. Fixes #548530. Original commit message from CVS: * gst/wavenc/gstwavenc.c: Remove depth ranges and replace with sane values. Fixes #548530. 2008-08-18 15:05:32 +0000 Sebastian Dröge ext/pulse/: The bytes_per_sample and silence_sample fields of the GstRingBufferSpec are already filled with the corre... Original commit message from CVS: * ext/pulse/pulsesink.c: (gst_pulsesink_prepare): * ext/pulse/pulsesrc.c: (gst_pulsesrc_prepare): The bytes_per_sample and silence_sample fields of the GstRingBufferSpec are already filled with the correct values by gst_ring_buffer_parse_caps() so there's no need to set them again with wrong values. 2008-08-16 14:54:56 +0000 Edward Hervey gst/avi/gstavidemux.c: Some AVI 2.0 (ODML) files don't respect the 'specifications' completely and instead of using t... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_read_subindexes_push): Some AVI 2.0 (ODML) files don't respect the 'specifications' completely and instead of using the 'ix##' nomenclature, use '##ix'. They're still valid though, this fixes the duration and indexes for virtually all the ODML files I have. 2008-08-15 17:26:18 +0000 Olivier Crete gst/rtp/: Update the vorbis RTP pay/depay to RFC 5215. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): Update the vorbis RTP pay/depay to RFC 5215. Fixes #547842. 2008-08-14 22:07:02 +0000 David Schleef gst/qtdemux/qtdemux.c: Add 'hdv6' as a HDV format for 1080i/60 with 3:2 pulldown, i.e., 24p. Original commit message from CVS: * gst/qtdemux/qtdemux.c: Add 'hdv6' as a HDV format for 1080i/60 with 3:2 pulldown, i.e., 24p. 2008-08-14 12:47:09 +0000 Wim Taymans tests/check/elements/level.c: Fix compilation some more. Original commit message from CVS: * tests/check/elements/level.c: (GST_START_TEST): Fix compilation some more. 2008-08-14 11:44:59 +0000 Tim-Philipp Müller configure.ac: Require -base CVS for wavparse acid chunk parsing. Original commit message from CVS: * configure.ac:: Require -base CVS for wavparse acid chunk parsing. 2008-08-13 13:57:01 +0000 Sebastian Dröge ext/pulse/pulsesink.*: Add "device-name" property to pulsesink too and currently commented out and not working suppor... Original commit message from CVS: * ext/pulse/pulsesink.c: (gst_pulsesink_class_init), (gst_pulsesink_init), (gst_pulsesink_finalize), (gst_pulsesink_set_volume), (gst_pulsesink_get_volume), (gst_pulsesink_set_property), (gst_pulsesink_get_property), (gst_pulsesink_prepare), (gst_pulsesink_change_state): * ext/pulse/pulsesink.h: Add "device-name" property to pulsesink too and currently commented out and not working support for a "volume" property. 2008-08-13 13:17:15 +0000 Thijs Vermeir configure.ac: Remove more cdio stuff (moved to ugly) Original commit message from CVS: * configure.ac: Remove more cdio stuff (moved to ugly) 2008-08-13 12:37:26 +0000 Laszlo Pandy ext/pulse/pulsesrc.c: Add "device-name" property, which provides a human readable string for the audio device, to mak... Original commit message from CVS: Patch by: Laszlo Pandy * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), (gst_pulsesrc_get_property): Add "device-name" property, which provides a human readable string for the audio device, to make it more consisten with other audio sources. Fixes bug #547519. 2008-08-13 12:34:13 +0000 Sebastian Dröge ext/pulse/: Improve debugging a bit by including the parent object in pulsemixerctrl and pulseprobe objects and using... Original commit message from CVS: * ext/pulse/pulsemixer.c: (gst_pulsemixer_change_state): * ext/pulse/pulsemixerctrl.c: (gst_pulsemixer_ctrl_subscribe_cb), (gst_pulsemixer_ctrl_open), (gst_pulsemixer_ctrl_new), (gst_pulsemixer_ctrl_free), (gst_pulsemixer_ctrl_timeout_event): * ext/pulse/pulsemixerctrl.h: * ext/pulse/pulseprobe.c: (gst_pulseprobe_open), (gst_pulseprobe_enumerate), (gst_pulseprobe_new), (gst_pulseprobe_free), (gst_pulseprobe_needs_probe), (gst_pulseprobe_probe_property), (gst_pulseprobe_get_values): * ext/pulse/pulseprobe.h: * ext/pulse/pulsesink.c: (gst_pulsesink_init): * ext/pulse/pulsesrc.c: (gst_pulsesrc_init), (gst_pulsesrc_delay), (gst_pulsesrc_change_state): Improve debugging a bit by including the parent object in pulsemixerctrl and pulseprobe objects and using GST_WARNING_OBJECT instead of GST_WARNING. Use the parent GObject subclass instead of a random struct as GObject parameter for G_OBJECT_WARN_INVALID_PROPERTY_ID. This fixes a crash when probing for another property than "device". 2008-08-13 12:21:22 +0000 Laszlo Pandy ext/pulse/pulsemixer.c: Fix property probing after the device property is set by calling set_server when the server p... Original commit message from CVS: Patch by: Laszlo Pandy * ext/pulse/pulsemixer.c: (gst_pulsemixer_set_property): Fix property probing after the device property is set by calling set_server when the server property changes. Fixes bug #547518. 2008-08-13 12:11:34 +0000 Laszlo Pandy ext/pulse/pulsemixer.c: Fix property probing after the device property is set by calling set_server when the server p... Original commit message from CVS: Patch by: Laszlo Pandy * ext/pulse/pulsemixer.c: (gst_pulsemixer_set_property): Fix property probing after the device property is set by calling set_server when the server property changes. Fixes bug #547518. 2008-08-13 12:01:01 +0000 Laszlo Pandy ext/pulse/: Implement GstPropertyProbe interface on pulsesink for detecting sink devices and on pulsesrc for detectin... Original commit message from CVS: Patch by: Laszlo Pandy * ext/pulse/pulsesink.c: (gst_pulsesink_interface_supported), (gst_pulsesink_implements_interface_init), (gst_pulsesink_init_interfaces), (gst_pulsesink_init), (gst_pulsesink_finalize), (gst_pulsesink_set_property), (gst_pulsesink_get_type): * ext/pulse/pulsesink.h: * ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported), (gst_pulsesrc_init_interfaces), (gst_pulsesrc_init), (gst_pulsesrc_finalize), (gst_pulsesrc_set_property): * ext/pulse/pulsesrc.h: Implement GstPropertyProbe interface on pulsesink for detecting sink devices and on pulsesrc for detecting source devices. Fixes bugs #547227 and #547217. 2008-08-13 09:17:20 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Don't terminate on fabs(in)>1.0. Init doubles as doubles. Original commit message from CVS: * gst/spectrum/gstspectrum.c: Don't terminate on fabs(in)>1.0. Init doubles as doubles. 2008-08-13 08:33:57 +0000 Edward Hervey sys/v4l2/gstv4l2src.c: Properly set the maximum latency value, in the same way it is done in v4lsrc. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_query): Properly set the maximum latency value, in the same way it is done in v4lsrc. * sys/v4l2/v4l2src_calls.c: Simplify fraction equality check, no need to use GValues for this. 2008-08-12 12:04:24 +0000 Edward Hervey sys/v4l2/gstv4l2src.c: Add warning messages stating exactly why the latency query failed. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_query): Add warning messages stating exactly why the latency query failed. * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): In some cases, the negotiated framerate might be the default one which is already set internally. But we still need to mark it down in fps_n and fps_d so that the latency query can happen properly. 2008-08-12 11:28:47 +0000 Edward Hervey docs/plugins/inspect/plugin-1394.xml: Whoops, forgot one doc file for people who can't/don't build the raw1394 plugin. Original commit message from CVS: * docs/plugins/inspect/plugin-1394.xml: Whoops, forgot one doc file for people who can't/don't build the raw1394 plugin. 2008-08-12 09:22:29 +0000 Jan Schmidt Pull changes from 0.10.9.2 pre-release branch moving the libcdio Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-cdio.xml: * ext/Makefile.am: * ext/cdio/Makefile.am: * ext/cdio/gstcdio.c: * ext/cdio/gstcdio.h: * ext/cdio/gstcdiocddasrc.c: * ext/cdio/gstcdiocddasrc.h: Pull changes from 0.10.9.2 pre-release branch moving the libcdio CDDA source to -ugly. * po/LINGUAS: * po/POTFILES.in: * po/id.po: Pull in new translation from 0.10.9.2 release branch. 2008-08-11 15:05:13 +0000 Edward Hervey docs/plugins/: Integrate documentation for new hdv1394src element. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: Integrate documentation for new hdv1394src element. 2008-08-11 14:36:13 +0000 Edward Hervey ext/raw1394/: mpeg2-ts (HDV) variant of firewire capture element. Original commit message from CVS: * ext/raw1394/Makefile.am: * ext/raw1394/gst1394.c: (plugin_init): * ext/raw1394/gsthdv1394src.c: (_do_init), (gst_hdv1394src_base_init), (gst_hdv1394src_class_init), (gst_hdv1394src_init), (gst_hdv1394src_dispose), (gst_hdv1394src_set_property), (gst_hdv1394src_get_property), (gst_hdv1394src_from_raw1394handle), (gst_hdv1394src_iec61883_receive), (gst_hdv1394src_bus_reset), (gst_hdv1394src_create), (gst_hdv1394src_discover_avc_node), (gst_hdv1394src_start), (gst_hdv1394src_stop), (gst_hdv1394src_unlock), (gst_hdv1394src_update_device_name), (gst_hdv1394src_uri_get_type), (gst_hdv1394src_uri_get_protocols), (gst_hdv1394src_uri_get_uri), (gst_hdv1394src_uri_set_uri), (gst_hdv1394src_uri_handler_init): * ext/raw1394/gsthdv1394src.h: mpeg2-ts (HDV) variant of firewire capture element. Fixes #350830 2008-08-11 10:53:06 +0000 Edward Hervey gst/level/gstlevel.c: Fix compilation (also known as the classic 'fix code that someone committed without compiling i... Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_message_new): Fix compilation (also known as the classic 'fix code that someone committed without compiling it first'). 2008-08-10 19:40:27 +0000 Stefan Kost tests/check/elements/level.c: Add a test for level in stereo mode. Original commit message from CVS: * tests/check/elements/level.c: Add a test for level in stereo mode. 2008-08-10 19:35:05 +0000 Stefan Kost tests/examples/spectrum/: Demo how to draw analyzer results synced to the clock. Original commit message from CVS: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: Demo how to draw analyzer results synced to the clock. 2008-08-10 15:52:42 +0000 Stefan Kost gst/level/gstlevel.c: Little renaming (l -> level). Original commit message from CVS: * gst/level/gstlevel.c: Little renaming (l -> level). * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: Also send full timestamp/duration details here. 2008-08-10 11:32:03 +0000 Stefan Kost gst/level/gstlevel.*: Send same timestamp/duration details as videoanalysis. This gives applications better chance to... Original commit message from CVS: * gst/level/gstlevel.c: * gst/level/gstlevel.h: Send same timestamp/duration details as videoanalysis. This gives applications better chance to sync analysis results with playback. 2008-08-09 14:02:27 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: We need to drop one additional buffer for FLAC as the fLaC marker and STREAMINFO block a... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_handle_sink_event), (flac_streamheader_to_codecdata): We need to drop one additional buffer for FLAC as the fLaC marker and STREAMINFO block are merged into one buffer in the caps. Also don't pretend to support NEWSEGMENT events, otherwise we will most probably write some invalid data. 2008-08-09 13:48:22 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Add support for muxing FLAC into Matroska containers. Original commit message from CVS: * gst/matroska/matroska-mux.c: (flac_streamheader_to_codecdata), (gst_matroska_mux_audio_pad_setcaps): Add support for muxing FLAC into Matroska containers. Fixes bug #311586. 2008-08-09 08:58:26 +0000 Sebastian Dröge ext/flac/gstflacenc.c: Actually provide the variables required for the format string. Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_check_discont): Actually provide the variables required for the format string. 2008-08-08 16:20:26 +0000 Sebastian Dröge gst/matroska/matroska-demux.*: Close the current segment if we're doing a non-flushing seek and send the close-segmen... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_element_send_event), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_loop): * gst/matroska/matroska-demux.h: Close the current segment if we're doing a non-flushing seek and send the close-segment and the new segment of the seek from the streaming thread. 2008-08-08 15:20:24 +0000 Sebastian Dröge ext/flac/gstflacenc.*: Handle non-zero start timestamps correctly, mark header packets as Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_write_callback), (gst_flac_enc_check_discont), (gst_flac_enc_chain), (gst_flac_enc_change_state): * ext/flac/gstflacenc.h: Handle non-zero start timestamps correctly, mark header packets as IN_CAPS and print a warning and suggest using audiorate if stream discontinuities are detected. When FLAC supports flushing the encoder somehow this should be done for discontinuities instead. Remove some unused variables from the instance struct. 2008-08-07 17:14:39 +0000 Christian Schaller * gst-plugins-good.spec.in: add pulseaudio to plugins list in spec file Original commit message from CVS: add pulseaudio to plugins list in spec file 2008-08-07 16:13:41 +0000 Sebastian Dröge ext/flac/gstflacenc.c: If seeking failed return the appropiate return value to FLAC. Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_seek_callback): If seeking failed return the appropiate return value to FLAC. Otherwise it thinks seeking was successfull and tries to rewrite parts of the headers which then get appended to the output. 2008-08-07 16:11:00 +0000 Frederic Crozat Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). Original commit message from CVS: Patch by: Frederic Crozat * ext/esd/gstesd.c: (plugin_init): * ext/flac/gstflac.c: (plugin_init): * ext/shout2/gstshout2.c: (plugin_init): * ext/wavpack/gstwavpack.c: (plugin_init): * sys/oss/gstossaudio.c: (plugin_init): * sys/v4l2/gstv4l2.c: (plugin_init): Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). 2008-08-07 14:40:13 +0000 Sebastian Dröge ext/flac/gstflacdec.c: Add FIXME for 0.11 to simply output everything with width=32 as given by FLAC and let audiocon... Original commit message from CVS: * ext/flac/gstflacdec.c: Add FIXME for 0.11 to simply output everything with width=32 as given by FLAC and let audioconvert handle the conversions instead of doing them in flacdec. 2008-08-07 10:22:32 +0000 Jan Schmidt sys/v4l2/v4l2src_calls.c: When outputting a pad template range for the size, include a framerate range too, to avoid ... Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): When outputting a pad template range for the size, include a framerate range too, to avoid 'not a real subset of template caps' errors. 2008-08-06 15:34:55 +0000 Jonathan Matthew ext/flac/: Port flactag to 0.10, add documentation for it and clean it up a bit. Original commit message from CVS: Based on a patch by: Jonathan Matthew * ext/flac/Makefile.am: * ext/flac/gstflac.c: (plugin_init): * ext/flac/gstflactag.c: (gst_flac_tag_setup_interfaces), (gst_flac_tag_base_init), (gst_flac_tag_class_init), (gst_flac_tag_dispose), (gst_flac_tag_init), (gst_flac_tag_sink_setcaps), (gst_flac_tag_chain), (gst_flac_tag_change_state): * ext/flac/gstflactag.h: Port flactag to 0.10, add documentation for it and clean it up a bit. Fixes bug #413841. * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-flac.xml: * ext/flac/gstflacdec.c: (gst_flac_dec_base_init): * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.c: (gst_flac_enc_base_init): * ext/flac/gstflacenc.h: Add flactag and flacenc to the documentation and mark the private parts of the flacdec instance structure as private. Also use gst_element_class_set_details_simple() in flacdec and flacenc. 2008-08-06 13:12:07 +0000 Stefan Kost gst/qtdemux/qtdemux.c: Use audio/x-qdm for caps. Collect some info - mplayer has a decoder for it but ffmpeg does not. Original commit message from CVS: * gst/qtdemux/qtdemux.c: Use audio/x-qdm for caps. Collect some info - mplayer has a decoder for it but ffmpeg does not. 2008-08-05 15:05:44 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Handle the list chunk and use gst_riff_parse_info() to parse the info sub-chunk. Original commit message from CVS: * gst/wavparse/gstwavparse.c: Handle the list chunk and use gst_riff_parse_info() to parse the info sub-chunk. 2008-08-05 14:22:12 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Handle the acid chunk and send tempo as part of tags. Other fields are interesting too, b... Original commit message from CVS: * gst/wavparse/gstwavparse.c: Handle the acid chunk and send tempo as part of tags. Other fields are interesting too, but need more tag-definitions. Fixes #545433. 2008-08-05 14:16:32 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Refactor wavparse. Call _reset() from dispose() and move old code from dispose into reset... Original commit message from CVS: * gst/wavparse/gstwavparse.c: Refactor wavparse. Call _reset() from dispose() and move old code from dispose into reset. This way we don't leak taglists when we abort parsing. Fix some comments. Move code for skipping a chunk into extra function. Replace chunk sizes with a const to ease readability. 2008-08-05 13:57:57 +0000 Aurelien Grimaud gst/rtsp/gstrtspsrc.c: Improve udp port setup. Fixes #545710. Original commit message from CVS: Patch by: Aurelien Grimaud * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_alloc_udp_ports): Improve udp port setup. Fixes #545710. 2008-08-05 13:54:18 +0000 Wim Taymans gst/rtp/: Add MP1S depayloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_base_init), (gst_rtp_mp1s_depay_class_init), (gst_rtp_mp1s_depay_init), (gst_rtp_mp1s_depay_setcaps), (gst_rtp_mp1s_depay_process), (gst_rtp_mp1s_depay_set_property), (gst_rtp_mp1s_depay_get_property), (gst_rtp_mp1s_depay_change_state), (gst_rtp_mp1s_depay_plugin_init): * gst/rtp/gstrtpmp1sdepay.h: Add MP1S depayloader. * gst/rtsp/URLS: Some more sample rtsp streams. 2008-08-05 08:43:45 +0000 Wim Taymans gst/rtsp/URLS: Add another URL. Original commit message from CVS: * gst/rtsp/URLS: Add another URL. * tests/check/elements/id3v2mux.c: (test_taglib_id3mux_with_tags): * tests/check/elements/rglimiter.c: (GST_START_TEST): Add some more debug info. 2008-08-04 09:16:40 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Provide cbSize field for audio extra_data size, and take care to pad extra_data. Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_riff_get_avi_header): Provide cbSize field for audio extra_data size, and take care to pad extra_data. 2008-08-04 07:23:07 +0000 Stefan Kost gst/qtdemux/qtdemux.c: Return the result of gst_pad_{start,stop}_task instead of hard-coded Original commit message from CVS: * gst/qtdemux/qtdemux.c: Return the result of gst_pad_{start,stop}_task instead of hard-coded TRUE. 2008-08-04 07:17:38 +0000 Stefan Kost gst/qtdemux/: Add keyword tag support. Fixes #520694 for qtdemux. Original commit message from CVS: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux_fourcc.h: Add keyword tag support. Fixes #520694 for qtdemux. 2008-08-04 07:05:33 +0000 Stefan Kost gst/qtdemux/qtdemux.c: Add support for tmpo tag (BPM). Original commit message from CVS: * gst/qtdemux/qtdemux.c: Add support for tmpo tag (BPM). 2008-08-03 12:23:49 +0000 Sebastian Dröge ext/flac/gstflacenc.c: Set an estimate for the total number of samples that will be encoded if possible to help decod... Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_query_peer_total_samples), (gst_flac_enc_sink_setcaps), (gst_flac_enc_write_callback): Set an estimate for the total number of samples that will be encoded if possible to help decoders if the streaminfo can't be rewritten later (like when muxing into Ogg containers). Add a warning if we get header packets after data packets as those will get lost when muxing into Ogg, i.e. rewriting the headers doesn't work. 2008-08-03 11:38:22 +0000 Sebastian Dröge ext/flac/gstflacdec.c: Support decoding of all depths between 4 and 32 bits and read the depth from the streaminfo he... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_metadata_callback), (gst_flac_dec_write): Support decoding of all depths between 4 and 32 bits and read the depth from the streaminfo header if needed. Also support all sampling rates between 1 and 655350 Hz. * ext/flac/gstflacenc.c: (gst_flac_enc_caps_append_structure_with_widths), (gst_flac_enc_sink_getcaps), (gst_flac_enc_sink_setcaps), (gst_flac_enc_chain): * ext/flac/gstflacenc.h: Support encoding in all bit depths supported by the streamable subformat (i.e. 8, 12, 16, 20 and 24 bits) and all sampling rates between 1 Hz and 655350 Hz. 2008-08-03 09:23:14 +0000 Sebastian Dröge ext/flac/gstflacenc.c: Support encoding of up to 8 channels. Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_init), (gst_flac_enc_sink_getcaps): Support encoding of up to 8 channels. 2008-08-02 21:39:01 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.*: Fix seeking race condition in #540300 Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: * ext/soup/gstsouphttpsrc.h: Fix seeking race condition in #540300 Patch By: Wouter Cloetens 2008-08-02 18:35:21 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: When receiving a SEEK event on a specific pad first search for a seek table entry for ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek), (gst_matroska_demux_element_send_event), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_handle_src_event): When receiving a SEEK event on a specific pad first search for a seek table entry for the stream of the pad and then fall back to an entry for a different stream. 2008-08-02 18:20:44 +0000 Sebastian Dröge Build depend on core CVS for the attachment tag. Original commit message from CVS: * configure.ac: * gst/matroska/matroska-ids.c: (gst_matroska_register_tags): * gst/matroska/matroska-ids.h: Build depend on core CVS for the attachment tag. 2008-08-02 18:18:05 +0000 Sebastian Dröge Decode the codec private data and following ContentEncoding if necessary. Original commit message from CVS: * configure.ac: * gst/matroska/Makefile.am: * gst/matroska/lzo.c: (get_byte), (get_len), (copy), (copy_backptr), (lzo1x_decode), (main): * gst/matroska/lzo.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_read_track_encoding), (gst_matroska_decompress_data), (gst_matroska_decode_data), (gst_matroska_decode_buffer), (gst_matroska_decode_content_encodings), (gst_matroska_demux_read_track_encodings), (gst_matroska_demux_add_stream), (gst_matroska_demux_parse_blockgroup_or_simpleblock): * gst/matroska/matroska-ids.h: Decode the codec private data and following ContentEncoding if necessary. Support bzip2, lzo and header stripped compression. For lzo use the ffmpeg lzo implementation as liblzo is GPL licensed. Fix zlib decompression. 2008-08-02 18:11:32 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Fix muxing of MP3/MP2 with different MPEG versions by calculating the duration of a fram... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_setcaps): Fix muxing of MP3/MP2 with different MPEG versions by calculating the duration of a frame with the new mpegaudioversion caps field. 2008-08-02 18:06:20 +0000 Sebastian Dröge gst/matroska/matroska-demux.*: Allow an infinite number of stream inside Matroska containers and use a GPtrArray for ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_finalize), (gst_matroska_demux_class_init), (gst_matroska_demux_init), (gst_matroska_demux_combine_flows), (gst_matroska_demux_reset), (gst_matroska_demux_stream_from_num), (gst_matroska_demux_tracknumber_unique), (gst_matroska_demux_add_stream), (gst_matroska_demux_send_event), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_sync_streams), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_loop): * gst/matroska/matroska-demux.h: Allow an infinite number of stream inside Matroska containers and use a GPtrArray for storing them instead of allowing "only" 127 streams. 2008-08-02 18:01:36 +0000 Sebastian Dröge gst/matroska/: Fix indention everywhere. A broken indent version has added newlines after every single declaration so... Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_class_init), (gst_ebml_read_change_state), (gst_ebml_read_element_level_up), (gst_ebml_read_peek_bytes), (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_peek_id), (gst_ebml_read_get_length), (gst_ebml_read_skip), (gst_ebml_read_buffer), (gst_ebml_read_bytes), (gst_ebml_read_uint), (gst_ebml_read_sint), (_ext2dbl), (gst_ebml_read_float), (gst_ebml_read_ascii), (gst_ebml_read_date), (gst_ebml_read_master), (gst_ebml_read_binary), (gst_ebml_read_header): * gst/matroska/ebml-write.c: (gst_ebml_write_element_id), (gst_ebml_write_element_size), (gst_ebml_write_uint), (gst_ebml_write_sint), (gst_ebml_write_ascii), (gst_ebml_write_master_start), (gst_ebml_write_master_finish), (gst_ebml_replace_uint): * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_read_track_encoding), (gst_matroska_demux_read_track_encodings), (gst_matroska_demux_add_stream), (gst_matroskademux_do_index_seek), (gst_matroska_demux_send_event), (gst_matroska_demux_element_send_event), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_handle_src_event), (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_tracks), (gst_matroska_demux_parse_index_cuetrack), (gst_matroska_demux_parse_index_pointentry), (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_metadata_id_simple_tag), (gst_matroska_demux_parse_metadata_id_tag), (gst_matroska_demux_parse_metadata), (gst_matroska_demux_parse_attached_file), (gst_matroska_demux_parse_attachments), (gst_matroska_demux_parse_chapters), (gst_matroska_ebmlnum_uint), (gst_matroska_ebmlnum_sint), (gst_matroska_demux_push_hdr_buf), (gst_matroska_demux_push_flac_codec_priv_data), (gst_matroska_demux_push_xiph_codec_priv_data), (gst_matroska_demux_push_dvd_clut_change_event), (gst_matroska_demux_add_mpeg_seq_header), (gst_matroska_demux_add_wvpk_header), (gst_matroska_demux_check_subtitle_buffer), (gst_matroska_decode_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_parse_cluster), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_parse_contents), (gst_matroska_demux_loop_stream_parse_id), (gst_matroska_demux_loop_stream), (gst_matroska_demux_loop), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), (gst_matroska_demux_subtitle_caps), (gst_matroska_demux_change_state): * gst/matroska/matroska-ids.c: * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), (gst_matroska_mux_reset), (gst_matroska_mux_handle_sink_event), (gst_matroska_mux_video_pad_setcaps), (xiph3_streamheader_to_codecdata), (vorbis_streamheader_to_codecdata), (theora_streamheader_to_codecdata), (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), (gst_matroska_mux_track_header), (gst_matroska_mux_start), (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish), (gst_matroska_mux_best_pad), (gst_matroska_mux_write_data), (gst_matroska_mux_collected), (gst_matroska_mux_change_state): Fix indention everywhere. A broken indent version has added newlines after every single declaration some time ago. 2008-08-02 17:59:05 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: If no Tracks are found error out instead of trying it again until the end of time. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_loop_stream_parse_id): If no Tracks are found error out instead of trying it again until the end of time. 2008-08-02 17:57:31 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Fix demuxing of raw integer audio. The samples are unsigned only for 8 bit and signed ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): Fix demuxing of raw integer audio. The samples are unsigned only for 8 bit and signed otherwise, not the other way around. 2008-08-02 17:54:04 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Add more raw YUV formats to the list of supported formats. Original commit message from CVS: * gst/matroska/matroska-mux.c: Add more raw YUV formats to the list of supported formats. 2008-08-02 17:52:16 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Add support for muxing raw float audio now that the spec defines the endianness and add ... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_setcaps): Add support for muxing raw float audio now that the spec defines the endianness and add support for muxing raw integer audio with 24 and 32 bits. Allow muxing of more than 8 audio channels. 2008-08-02 17:47:32 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Add locking to the global array of used track UIDs to prevent random crashes if more tha... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_uid), (gst_matroska_mux_reset), (gst_matroska_mux_start): Add locking to the global array of used track UIDs to prevent random crashes if more than a single matrosmux instance is used. Use 64 bit values for the track UIDs. Use the global GRandom of GLib instead of creating our own one for the few random numbers we need every single time. 2008-08-02 17:18:47 +0000 Sebastian Dröge ext/flac/gstflacdec.c: Always post the audio-codec tag, not only if other tags are present. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_setup_seekable_decoder), (gst_flac_dec_setup_stream_decoder), (gst_flac_dec_update_metadata): Always post the audio-codec tag, not only if other tags are present. 2008-08-01 23:26:50 +0000 Jan Schmidt configure.ac: Back to development -> 0.10.9.1 Original commit message from CVS: * configure.ac: Back to development -> 0.10.9.1 2008-08-01 15:58:47 +0000 Christian Schaller * gst-plugins-good.spec.in: add missing gstreamer plugins to spec file Original commit message from CVS: add missing gstreamer plugins to spec file === release 0.10.9 === 2008-07-31 22:10:17 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst-plugins-good.doap: * win32/common/config.h: Release 0.10.9 Original commit message from CVS: Release 0.10.9 2008-07-31 21:50:44 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/it.po: * po/ja.po: * po/lt.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/pt_BR.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files Original commit message from CVS: Update .po files 2008-07-31 21:26:48 +0000 Jan Schmidt ext/soup/gstsouphttpsrc.c: Don't throw an error when soup completes a msg with status 'cancelled', as that indicates ... Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: Don't throw an error when soup completes a msg with status 'cancelled', as that indicates we cancelled a request while shutting down or seeking, and it's not an error. Fixes: #540300 again. 2008-07-28 20:17:46 +0000 Jan Schmidt configure.ac: 0.10.8.4 pre-release Original commit message from CVS: * configure.ac: 0.10.8.4 pre-release 2008-07-25 14:50:03 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Fix segment-stop regression. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment): Fix segment-stop regression. Add documentation regarding segments in quicktime files by Wim Taymans. Fixes #544509 2008-07-24 23:55:58 +0000 Jan Schmidt configure.ac: 0.10.8.3 pre-release Original commit message from CVS: * configure.ac: 0.10.8.3 pre-release * po/LINGUAS: * po/pt_BR.po: Add pt_BR translation 2008-07-23 22:01:20 +0000 Michael Smith gst/goom/: Fix build with MSVC: include glib.h to define inline appropriately, use header guards where needed. Original commit message from CVS: * gst/goom/convolve_fx.c: * gst/goom/filters.c: * gst/goom/goom_config.h: * gst/goom/goom_core.c: * gst/goom/goom_tools.h: Fix build with MSVC: include glib.h to define inline appropriately, use header guards where needed. * gst/udp/gstudpnetutils.c: * gst/udp/gstudpsrc.c: Fix build with MSVC: use WSA* constants/functions where appropriate, use g_snprintf rather than snprintf. Fixes #544433. 2008-07-22 06:32:03 +0000 Stefan Kost gst/debug/gsttaginject.*: Sent tags in _transform_ip() instead of _start(). Fixes #543404 partially. Original commit message from CVS: * gst/debug/gsttaginject.c: * gst/debug/gsttaginject.h: Sent tags in _transform_ip() instead of _start(). Fixes #543404 partially. 2008-07-19 14:12:39 +0000 Jan Schmidt configure.ac: 0.10.8.2 pre-release Original commit message from CVS: * configure.ac: 0.10.8.2 pre-release 2008-07-19 13:50:53 +0000 Jan Schmidt ext/Makefile.am: Finish hooking up pulseaudio plugin to the build. Original commit message from CVS: * ext/Makefile.am: Finish hooking up pulseaudio plugin to the build. * ext/pulse/pulsemixerctrl.c: Fix compilation error. 2008-07-19 13:23:29 +0000 Jan Schmidt po/: Add new lithunian translation, and add french to the LINGUAS file. Original commit message from CVS: * po/LINGUAS: * po/lt.po: Add new lithunian translation, and add french to the LINGUAS file. 2008-07-19 13:08:42 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.c: Fix Soup HTTP source seeking. Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: Fix Soup HTTP source seeking. Patch By: Wouter Cloetens Fixes: #540300 * tests/check/elements/.cvsignore: Ignore new check programs. 2008-07-19 01:01:13 +0000 Jan Schmidt Move replaygain and interleave plugins from -bad. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-replaygain.xml: * tests/check/Makefile.am: Move replaygain and interleave plugins from -bad. Fixes: #543406 Fixes: #536228 2008-07-18 20:03:07 +0000 Mark Nauwelaerts gst/qtdemux/qtdemux.c: Revert ISO base media spec based pixel-aspect-ratio calculation. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse_trak): Revert ISO base media spec based pixel-aspect-ratio calculation. Fixes #543300. 2008-07-17 16:42:53 +0000 Edward Hervey sys/osxvideo/osxvideosink.m: Fix minor build issues on macosx. Original commit message from CVS: * sys/osxvideo/osxvideosink.m: Fix minor build issues on macosx. Fixes #543054 2008-07-17 14:40:51 +0000 Tim-Philipp Müller Only use -Wno-attributes (which is there to work around a bug in the taglib 1.5 headers) if the c++ compiler actually... Original commit message from CVS: * configure.ac:: * ext/taglib/Makefile.am:: Only use -Wno-attributes (which is there to work around a bug in the taglib 1.5 headers) if the c++ compiler actually supports it (#543255). 2008-07-17 13:54:38 +0000 Benoit Fouet sys/v4l2/gstv4l2src.c: Avoid compiler warning by initialising variable to NULL (#543259). Original commit message from CVS: Patch by: Benoit Fouet * sys/v4l2/gstv4l2src.c: (gst_v4l2src_negotiate): Avoid compiler warning by initialising variable to NULL (#543259). 2008-07-14 17:17:47 +0000 Sebastian Dröge gst/debug/gsttaginject.c: Don't pass NULL taglists to gst_tag_list_is_empty(). Original commit message from CVS: * gst/debug/gsttaginject.c: (gst_tag_inject_start): Don't pass NULL taglists to gst_tag_list_is_empty(). 2008-07-14 17:15:42 +0000 Sebastian Dröge tests/check/elements/: Don't use declarations after statements. Original commit message from CVS: * tests/check/elements/cmmldec.c: (GST_START_TEST): * tests/check/elements/rtp-payloading.c: (rtp_pipeline_create), (rtp_pipeline_run): * tests/check/elements/souphttpsrc.c: (souphttpsrc_suite): Don't use declarations after statements. 2008-07-14 16:28:25 +0000 Mark Nauwelaerts ext/jpeg/gstjpegdec.c: Align documentation with reality. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: Align documentation with reality. 2008-07-14 13:11:14 +0000 Sebastian Dröge gst/udp/gstudpnetutils.c: EAI_ADDRFAMILY was obsoleted in BSD at some point. Define it to the old value (1) if it's n... Original commit message from CVS: * gst/udp/gstudpnetutils.c: EAI_ADDRFAMILY was obsoleted in BSD at some point. Define it to the old value (1) if it's not defined which should not cause any problems as we're using it internal only anyway. 2008-07-14 13:02:48 +0000 Alessandro Decina gst/avi/gstavidemux.c: Fix build of avidemux on big endian architectures. Original commit message from CVS: Patch by: Alessandro Decina * gst/avi/gstavidemux.c: (gst_avi_demux_riff_parse_vprp): Fix build of avidemux on big endian architectures. 2008-07-10 20:47:56 +0000 Thiago Sousa Santos gst/qtdemux/qtdemux.c: Correctly distinguish 8bit vs 16bit raw audio. Fixes #542410. Original commit message from CVS: Patch by: Thiago Sousa Santos * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): Correctly distinguish 8bit vs 16bit raw audio. Fixes #542410. 2008-07-08 21:05:18 +0000 Mark Nauwelaerts gst/qtdemux/qtdemux.c: Set pixel-aspect-ratio in caps using display width and height provided in track. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse_trak): Set pixel-aspect-ratio in caps using display width and height provided in track. 2008-07-08 13:59:51 +0000 Sebastian Dröge configure.ac: Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include flags that are invalid for C++. Fixes bu... Original commit message from CVS: * configure.ac: Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include flags that are invalid for C++. Fixes bug #516509. 2008-07-08 12:51:34 +0000 Sebastian Dröge Don't use declarations after statements and variable length arrays. Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_uri_set_uri): * ext/speex/gstspeexenc.c: (gst_speex_enc_sink_getcaps): * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_set_wp_config): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_fixate): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): * tests/examples/equalizer/demo.c: (message_handler): * tests/examples/spectrum/demo-audiotest.c: (message_handler): * tests/examples/spectrum/demo-osssrc.c: (message_handler): Don't use declarations after statements and variable length arrays. 2008-07-07 21:28:58 +0000 Daniel Drake sys/v4l2/v4l2src_calls.c: Try progressive video if interlaced fails. Fixes bug #541956 and the usage of v4l2src on OLPC. Original commit message from CVS: Patch by: Daniel Drake * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture), (gst_v4l2src_get_nearest_size): Try progressive video if interlaced fails. Fixes bug #541956 and the usage of v4l2src on OLPC. 2008-07-07 15:34:12 +0000 Sebastian Dröge gst/rtp/gstrtpspeexdepay.*: Revert last change: Only the jitterbuffer is able to convert RTP to Original commit message from CVS: * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), (gst_rtp_speex_depay_process): * gst/rtp/gstrtpspeexdepay.h: Revert last change: Only the jitterbuffer is able to convert RTP to Gstreamer timestamps and normal (de)payloaders should simply copy it. Reopens bug #541787. 2008-07-07 10:30:51 +0000 Stefan Kost gst/rtp/gstrtpvrawdepay.c: Include stdlib.h for atoi(). Original commit message from CVS: * gst/rtp/gstrtpvrawdepay.c: Include stdlib.h for atoi(). * gst/rtsp/gstrtspsrc.c: Use floating point math for latencies < 0 sec in log output. 2008-07-07 10:16:07 +0000 Tomasz Grobelny gst/rtp/gstrtpspeexdepay.*: Take timestamp from the RTP packet as a first step to fix problems with transmission over... Original commit message from CVS: Patch by: Tomasz Grobelny * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), (gst_rtp_speex_depay_process): * gst/rtp/gstrtpspeexdepay.h: Take timestamp from the RTP packet as a first step to fix problems with transmission over RTP when the network is not reliable. Fixes bug #541787. 2008-07-05 19:01:28 +0000 Tero Saarni gst/udp/gstudpsrc.c: Fix parsing of udp:// URIs containing IPv6 addresses. Original commit message from CVS: Patch by: Tero Saarni * gst/udp/gstudpsrc.c: (gst_udpsrc_set_uri): Fix parsing of udp:// URIs containing IPv6 addresses. Fixes bug #541650. 2008-07-04 20:43:07 +0000 Mark Nauwelaerts ext/gdk_pixbuf/gstgdkpixbuf.c: Do not leak incoming buffers. Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): Do not leak incoming buffers. 2008-07-03 19:27:53 +0000 Damien Lespiau configure.ac: Fix build of the RTP plugin with mingw32 by linking to ws2_32 for htons() and htonl(). Fixes bug #541412. Original commit message from CVS: Patch by: Damien Lespiau * configure.ac: Fix build of the RTP plugin with mingw32 by linking to ws2_32 for htons() and htonl(). Fixes bug #541412. 2008-07-02 09:51:16 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Handle position and duration query in DEFAULT format if the pad's track has a default ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), (gst_matroska_demux_add_stream), (gst_matroska_demux_query), (gst_matroska_demux_element_query), (gst_matroska_demux_handle_src_query), (gst_matroska_demux_handle_seek_event): Handle position and duration query in DEFAULT format if the pad's track has a default frame duration set. Fix seeking now that the segment's duration doesn't contain the (possibly wrong or inaccurate) duration of the Matroska file. 2008-07-02 09:04:50 +0000 Sebastian Dröge gst/matroska/ebml-read.c: Use NAN constant instead of 0.0/0.0 if possible. NAN is defined in math.h except on MSVC wh... Original commit message from CVS: * gst/matroska/ebml-read.c: (_ext2dbl): Use NAN constant instead of 0.0/0.0 if possible. NAN is defined in math.h except on MSVC where it is defined in xmath.h. Fixes compilation with MSVC. 2008-07-02 08:57:04 +0000 Sebastian Dröge gst/matroska/matroska-demux.*: Don't set the segment duration to the duration from the Matroska header as this value ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_handle_src_query), (gst_matroska_demux_parse_info), (gst_matroska_demux_loop_stream_parse_id): * gst/matroska/matroska-demux.h: Don't set the segment duration to the duration from the Matroska header as this value could be wrong and is just informational. 2008-07-02 08:47:00 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: If no Tracks element is found until the first Cluster is found search it and error out... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_loop_stream_parse_id): If no Tracks element is found until the first Cluster is found search it and error out if none is found in the complete file. 2008-07-02 08:14:35 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Resync non-subtitle tracks too if a too large gap compared to other tracks is detected. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_sync_streams): Resync non-subtitle tracks too if a too large gap compared to other tracks is detected. 2008-07-01 13:28:02 +0000 Wim Taymans gst/rtp/: Add raw video pay and depayloaders, see RFC4175. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_base_init), (gst_rtp_vraw_depay_class_init), (gst_rtp_vraw_depay_init), (gst_rtp_vraw_depay_setcaps), (gst_rtp_vraw_depay_process), (gst_rtp_vraw_depay_change_state), (gst_rtp_vraw_depay_plugin_init): * gst/rtp/gstrtpvrawdepay.h: * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_get_type), (gst_rtp_vraw_pay_base_init), (gst_rtp_vraw_pay_class_init), (gst_rtp_vraw_pay_init), (gst_rtp_vraw_pay_finalize), (gst_rtp_vraw_pay_setcaps), (gst_rtp_vraw_pay_handle_buffer), (gst_rtp_vraw_pay_plugin_init): * gst/rtp/gstrtpvrawpay.h: Add raw video pay and depayloaders, see RFC4175. 2008-06-30 22:53:39 +0000 Jan Schmidt ext/libpng/gstpngdec.c: Don't return GST_FLOW_ERROR when buffer_alloc fails - return whatever it returned. Original commit message from CVS: * ext/libpng/gstpngdec.c: Don't return GST_FLOW_ERROR when buffer_alloc fails - return whatever it returned. 2008-06-29 19:52:51 +0000 Mark Nauwelaerts gst/avi/avi-ids.h: Add vprp chunk related structures. Original commit message from CVS: * gst/avi/avi-ids.h: Add vprp chunk related structures. * gst/avi/gstavidemux.c: (gst_avi_demux_riff_parse_vprp), (gst_avi_demux_parse_stream): Parse optional vprp chunk and add calculated pixel-aspect-ratio to caps. Fixes #539482. * gst/avi/gstavimux.h: * gst/avi/gstavimux.c: (gst_avi_mux_pad_reset), (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_riff_get_avi_header): Add a vprp chunk if non-trival pixel-aspect-ratio provided in caps. 2008-06-28 19:31:46 +0000 Mark Nauwelaerts tests/check/elements/avimux.c: Adjust avimux unit test according to increased streamheader size. Original commit message from CVS: * tests/check/elements/avimux.c: (check_avimux_pad): Adjust avimux unit test according to increased streamheader size. 2008-06-27 18:11:01 +0000 David Schleef gst/qtdemux/qtdemux.c: Add Dirac stream type Original commit message from CVS: * gst/qtdemux/qtdemux.c: Add Dirac stream type 2008-06-27 15:25:00 +0000 Mark Nauwelaerts gst/avi/gstavimux.*: Add 8 bytes to current streamheader to make for a complete one and to make more players happy. ... Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_riff_get_avi_header): * gst/avi/gstavimux.h: Add 8 bytes to current streamheader to make for a complete one and to make more players happy. Fixes #519460. 2008-06-26 16:36:47 +0000 Tim-Philipp Müller sys/v4l2/v4l2_calls.c: Don't include unused gstv4l2xoverlay.h. Fixes build in case where X11 headers are not installed. Original commit message from CVS: * sys/v4l2/v4l2_calls.c:: Don't include unused gstv4l2xoverlay.h. Fixes build in case where X11 headers are not installed. 2008-06-26 10:07:46 +0000 Wim Taymans ext/dv/gstdv.c: Fix compilation. Original commit message from CVS: * ext/dv/gstdv.c: (plugin_init): Fix compilation. 2008-06-26 09:37:23 +0000 Edward Hervey ext/dv/gstdv.c: Marking rank of dvdec as GST_RANK_MARGINAL since it's the slowest Original commit message from CVS: * ext/dv/gstdv.c: (plugin_init): Marking rank of dvdec as GST_RANK_MARGINAL since it's the slowest DV decoder available. Fixes #532393 2008-06-25 08:12:18 +0000 Sebastian Dröge gst/udp/gstudpsrc.c: Call getsockname() after the call to bind() to get updated values for the port, etc. This fixes ... Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Call getsockname() after the call to bind() to get updated values for the port, etc. This fixes the usage of udpsrc on anonymous binding and it's usage by rtspsrc. Fixes bugs #539372, #539548. Thanks to Aurelien Grimaud for pointing out the obvious fix. 2008-06-25 07:57:26 +0000 Sebastian Dröge tests/check/pipelines/wavpack.c: Remove workaround for a bug in identity that is fixed in 0.10.20. Original commit message from CVS: * tests/check/pipelines/wavpack.c: (bus_handler): Remove workaround for a bug in identity that is fixed in 0.10.20. 2008-06-25 06:36:58 +0000 Jason Donenfeld ext/soup/gstsouphttpsrc.c: Fix HTTP auth support with user/password passed via the URI. Original commit message from CVS: Patch by: Jason Donenfeld * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_headers_cb): Fix HTTP auth support with user/password passed via the URI. Fixes bug #540067. 2008-06-24 15:42:33 +0000 Tim-Philipp Müller configure.ac: Depend on released versions of core and -base. Original commit message from CVS: * configure.ac: Depend on released versions of core and -base. 2008-06-23 16:13:40 +0000 Julien Moutte gst/matroska/matroska-demux.c: Fix buggy format strings in macros. (makes it build on OS X again...) Original commit message from CVS: 2008-06-23 Julien Moutte * gst/matroska/matroska-demux.c: (gst_matroska_demux_read_track_encoding), (gst_matroska_demux_parse_blockgroup_or_simpleblock): Fix buggy format strings in macros. (makes it build on OS X again...) 2008-06-20 16:24:11 +0000 Thomas Vander Stichele gst/: Added debug. Original commit message from CVS: * gst/rtp/gstrtptheorapay.c: * gst/udp/gstmultiudpsink.c: Added debug. 2008-06-20 15:21:59 +0000 Christian Schaller * ChangeLog: * common: * configure.ac: switch v4l2src from experimental to normal build. Fixes #536831 Original commit message from CVS: switch v4l2src from experimental to normal build. Fixes #536831 2008-06-19 11:24:54 +0000 Wim Taymans gst/rtp/gstrtpg726pay.c: Remove unused variable so that we can compile again. Original commit message from CVS: * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): Remove unused variable so that we can compile again. 2008-06-19 11:06:29 +0000 Peter Kjellerstedt gst/rtp/gstrtpg726pay.c: No need to check for audio/G723 and audio/32KADPCM here as they are no longer supported. Original commit message from CVS: * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): No need to check for audio/G723 and audio/32KADPCM here as they are no longer supported. 2008-06-19 10:58:57 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Use G_GINT64_CONSTANT, this fixes the duration query on files without known length. Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), (gst_wavpack_parse_src_query), (gst_wavpack_parse_create_src_pad): Use G_GINT64_CONSTANT, this fixes the duration query on files without known length. 2008-06-19 10:48:57 +0000 Sebastian Dröge gst/matroska/: Fix demuxing of WavPack files. Muxing is still broken. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_wvpk_header), (gst_matroska_demux_audio_caps): * gst/matroska/matroska-ids.h: Fix demuxing of WavPack files. Muxing is still broken. 2008-06-19 09:12:55 +0000 Sebastian Dröge gst/matroska/: Add a "vfunc" to the track context for postprocessing frames and convert the wavpack and subtitle post... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_track_free), (gst_matroska_demux_add_mpeg_seq_header), (gst_matroska_demux_add_wvpk_header), (gst_matroska_demux_check_subtitle_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), (gst_matroska_demux_subtitle_caps): * gst/matroska/matroska-ids.h: Add a "vfunc" to the track context for postprocessing frames and convert the wavpack and subtitle postprocessing to this vfunc. Copy buffer flags in those functions to the new buffers too. Parse CodecState elements of Blocks. Add a postprocessing function for MPEG video that adds the sequence header from the codec private data or codec state to the frames if it's not already there. 2008-06-19 08:22:16 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: If a gap of more than 1/2 second is found in one stream send a Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup_or_simpleblock): If a gap of more than 1/2 second is found in one stream send a NEWSEGMENT event to not stall the pipeline if the gap is too large. This also fixes Matroska files where the first buffer doesn't start at timestamp 0. Fixes bug #429322. The duration of a block is the default duration multiplied with the number of laces. Every lace is one frame and the default duration is the duration of one frame. This fixes playback of files that use lacing for some tracks. 2008-06-18 20:09:28 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Update FIXME/TODOs and only ignore EOS at the central, important place instead of seve... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_contents_seekentry): Update FIXME/TODOs and only ignore EOS at the central, important place instead of several places. 2008-06-18 16:55:05 +0000 Wim Taymans gst/rtp/gstrtpg726pay.c: Fix caps, See #538891. Original commit message from CVS: * gst/rtp/gstrtpg726pay.c: Fix caps, See #538891. 2008-06-18 10:28:20 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: Improve debug output everywhere and fix the EOS logic. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_stream_from_num), (gst_matroska_demux_encoding_cmp), (gst_matroska_demux_encoding_order_unique), (gst_matroska_demux_read_track_encoding), (gst_matroska_demux_read_track_encodings), (gst_matroska_demux_tracknumber_unique), (gst_matroska_demux_add_stream), (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_tracks), (gst_matroska_demux_parse_index_cuetrack), (gst_matroska_demux_parse_index_pointentry), (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_metadata_id_simple_tag), (gst_matroska_demux_parse_metadata_id_tag), (gst_matroska_demux_parse_metadata), (gst_matroska_demux_parse_attached_file), (gst_matroska_demux_parse_attachments), (gst_matroska_demux_parse_chapters), (gst_matroska_demux_sync_streams), (gst_matroska_decode_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_parse_cluster), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_parse_contents), (gst_matroska_demux_loop_stream_parse_id), (gst_matroska_demux_loop): Improve debug output everywhere and fix the EOS logic. Check the values of the ContentEncoding elements more strictly and don't use tracks for which it's invalid. Check that the track number is unique for this stream. Check that seek positions are below G_MAXINT64 as our seeks are int64-based and overflows will fail badly. After seeks also don't push SimpleBlocks until the first one containing a keyframe is found. Before this was done only for normal Blocks. Update some FIXME/TODOs. * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), (gst_ebml_read_utf8), (gst_ebml_read_header): Improve debug output. * gst/matroska/matroska-ids.c: (gst_matroska_track_init_video_context): * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): Remove eye mode and don't parse it anymore. We can't use that information in GStreamer yet so it's useless. 2008-06-18 10:12:57 +0000 mersad gst/rtp/: Added G726 pay/depayloaders. Fixes #538891. Original commit message from CVS: Patch by: mersad * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_base_init), (gst_rtp_g726_depay_class_init), (gst_rtp_g726_depay_init), (gst_rtp_g726_depay_setcaps), (gst_rtp_g726_depay_process), (gst_rtp_g726_depay_plugin_init): * gst/rtp/gstrtpg726depay.h: * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_base_init), (gst_rtp_g726_pay_class_init), (gst_rtp_g726_pay_init), (gst_rtp_g726_pay_setcaps), (gst_rtp_g726_pay_plugin_init): * gst/rtp/gstrtpg726pay.h: Added G726 pay/depayloaders. Fixes #538891. 2008-06-17 10:14:47 +0000 Wim Taymans gst/rtsp/URLS: Some more urls. Original commit message from CVS: * gst/rtsp/URLS: Some more urls. * gst/smpte/barboxwipes.c: Add a comment * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: Fix typo, add audioresample to the pipeline. 2008-06-17 10:05:55 +0000 Wim Taymans ext/libmng/: Somewhat port mngenc and mngdec to 0.10. Does not work yet and has many bits ifdeffed out still. Original commit message from CVS: * ext/libmng/Makefile.am: * ext/libmng/gstmng.c: (plugin_init): * ext/libmng/gstmngdec.c: (gst_mng_dec_base_init), (gst_mng_dec_class_init), (gst_mng_dec_sink_setcaps), (gst_mng_dec_init), (gst_mng_dec_src_getcaps), (gst_mng_dec_loop), (gst_mng_dec_get_property), (gst_mng_dec_set_property), (mngdec_error), (mngdec_openstream), (mngdec_closestream), (gst_mng_dec_sink_event), (mngdec_readdata), (mngdec_settimer), (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), (gst_mng_dec_change_state): * ext/libmng/gstmngdec.h: * ext/libmng/gstmngenc.c: (gst_mng_enc_base_init), (gst_mng_enc_class_init), (gst_mng_enc_sink_setcaps), (gst_mng_enc_init), (gst_mng_enc_chain), (gst_mng_enc_get_property), (gst_mng_enc_set_property): * ext/libmng/gstmngenc.h: Somewhat port mngenc and mngdec to 0.10. Does not work yet and has many bits ifdeffed out still. 2008-06-16 11:34:54 +0000 Sebastian Dröge gst/matroska/matroska-demux.c: When comparing index elements with the same time compare their block number. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_index_compare): When comparing index elements with the same time compare their block number. 2008-06-16 11:31:06 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_attached_file) Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_attached_file) Init variable to NULL to avoid compiler warning. 2008-06-16 10:59:39 +0000 Sebastian Dröge gst/matroska/: Parse Attachments and post them as GST_TAG_IMAGE if we detect it as image and otherwise as GST_TAG_ATT... Original commit message from CVS: * gst/matroska/Makefile.am: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_parse_attached_file), (gst_matroska_demux_parse_attachments), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_loop_stream_parse_id): * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.c: (gst_matroska_register_tags): * gst/matroska/matroska-ids.h: * gst/matroska/matroska.c: (plugin_init): Parse Attachments and post them as GST_TAG_IMAGE if we detect it as image and otherwise as GST_TAG_ATTACHMENT. Include filename and description of the attachments in the caps. Fixes bug #537622. 2008-06-16 10:09:03 +0000 Wim Taymans ext/speex/gstspeexenc.c: Add mode property. Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speex_enc_mode_get_type), (gst_speex_enc_class_init), (gst_speex_enc_sink_getcaps), (gst_speex_enc_get_latency), (gst_speex_enc_get_query_types), (gst_speex_enc_src_query), (gst_speex_enc_init), (gst_speex_enc_setup), (gst_speex_enc_push_buffer), (gst_speex_enc_chain), (gst_speex_enc_get_property), (gst_speex_enc_set_property): Add mode property. Some cleanups, add more debug info. Add latency query. 2008-06-16 09:54:27 +0000 Sebastian Dröge gst/matroska/ebml-read.c: Return GST_FLOW_UNEXPECTED instead of GST_FLOW_ERROR on short reads. Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes): Return GST_FLOW_UNEXPECTED instead of GST_FLOW_ERROR on short reads. If we get less bytes than requested we can't do anything except doing our EOS logic. 2008-06-15 19:09:54 +0000 Sebastian Dröge gst/matroska/: Use a GArray for storing the Cue (i.e. seek) information, store the CueTrackPositions for every track,... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroskademux_do_index_seek), (gst_matroska_demux_parse_index_cuetrack), (gst_matroska_demux_parse_index_pointentry), (gst_matroska_index_compare), (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_metadata): * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.h: Use a GArray for storing the Cue (i.e. seek) information, store the CueTrackPositions for every track, store the block number and optimize searching in the array by sorting it after the last element was added. Fix a small memory leak when trying to parse a tags element that was already parsed. 2008-06-15 15:29:29 +0000 Sebastian Dröge gst/matroska/matroska-mux.*: Don't write another SeekHead which indexes all Clusters to the end of the file. This isn... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), (gst_matroska_mux_start), (gst_matroska_mux_finish), (gst_matroska_mux_write_data): * gst/matroska/matroska-mux.h: Don't write another SeekHead which indexes all Clusters to the end of the file. This isn't useful for anything and just increases filesize. 2008-06-15 15:01:30 +0000 Sebastian Dröge gst/matroska/ebml-read.c: Prevent unaligned memory access when reading floats. Original commit message from CVS: * gst/matroska/ebml-read.c: (_ext2dbl), (gst_ebml_read_float): Prevent unaligned memory access when reading floats. 2008-06-15 14:08:41 +0000 Sebastian Dröge gst/matroska/: Make sure that every Tags element is only parsed once and it's containing tags are only posted once. Original commit message from CVS: * gst/matroska/ebml-read.c: * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_parse_metadata): * gst/matroska/matroska-demux.h: Make sure that every Tags element is only parsed once and it's containing tags are only posted once. 2008-06-15 09:43:25 +0000 Sebastian Dröge gst/matroska/: Handle EBML elements like Void or CRC32 in the EbmlRead base class already. They're not useful in the ... Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_peek_id), (gst_ebml_read_header): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_parse_tracks), (gst_matroska_demux_parse_index_cuetrack), (gst_matroska_demux_parse_index_pointentry), (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_metadata_id_simple_tag), (gst_matroska_demux_parse_metadata_id_tag), (gst_matroska_demux_parse_metadata), (gst_matroska_demux_parse_attachments), (gst_matroska_demux_parse_chapters), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_parse_cluster), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_parse_contents), (gst_matroska_demux_loop_stream_parse_id): Handle EBML elements like Void or CRC32 in the EbmlRead base class already. They're not useful in the matroska parser and only cause additional code. 2008-06-14 15:51:25 +0000 Sebastian Dröge gst/matroska/: Reverse the level list as we usually are only interested in the first element or want to add a new fir... Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_level_free), (gst_ebml_finalize), (gst_ebml_read_change_state), (gst_ebml_read_element_level_up), (gst_ebml_read_master): * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_contents_seekentry): Reverse the level list as we usually are only interested in the first element or want to add a new first element. Having the first element stored at the end and calling g_list_last() and g_list_append() is more expensive. Also use GSlice for allocating the GstEbmlLevel structs. 2008-06-13 21:13:46 +0000 Tim-Philipp Müller gst/debug/gsttaginject.c: Don't unref NULL taglist in finalize. Don't use c++ style comments. Original commit message from CVS: * gst/debug/gsttaginject.c: (gst_tag_inject_finalize), (gst_tag_inject_class_init), (gst_tag_inject_init): Don't unref NULL taglist in finalize. Don't use c++ style comments. 2008-06-13 19:14:41 +0000 Sebastian Dröge gst/matroska/: Use gst_value_serialize() and gst_value_deserialize() for transforming tags from some GType to a strin... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_metadata_id_simple_tag): * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_write_data): Use gst_value_serialize() and gst_value_deserialize() for transforming tags from some GType to a string and the other way around. The default transformations in GLib don't include transformations from string to number types. 2008-06-13 19:07:03 +0000 Sebastian Dröge gst/matroska/matroska-demux.*: Only parse Tracks, SeekHead and SegmentInfo elements once but allow Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_parse_tracks), (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_attachments), (gst_matroska_demux_parse_chapters), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_loop_stream_parse_id): * gst/matroska/matroska-demux.h: Only parse Tracks, SeekHead and SegmentInfo elements once but allow Tags multiple times. The first ones can appear more than once but must contain the same content as the first for backup purposes so we ignore all but the first one. Tags can appear multiple times with different content. Jump to all elements except Clusters that are available from a SeekHead to make it more likely to have all required informations before getting to the first Clusters. Add dummy functions for parsing Attachments and Chapters. 2008-06-13 14:33:52 +0000 Stefan Kost gst/replaygain/: More doc updates. Original commit message from CVS: * gst/replaygain/gstrganalysis.c: * gst/replaygain/gstrglimiter.c: * gst/replaygain/gstrgvolume.c: More doc updates. 2008-06-13 11:59:23 +0000 Stefan Kost docs/plugins/: docs/plugins/inspect/plugin-mythtv.xml Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-alsaspdif.xml: * docs/plugins/inspect/plugin-amrwb.xml: * docs/plugins/inspect/plugin-app.xml: * docs/plugins/inspect/plugin-bayer.xml: * docs/plugins/inspect/plugin-bz2.xml: * docs/plugins/inspect/plugin-cdaudio.xml: * docs/plugins/inspect/plugin-cdxaparse.xml: * docs/plugins/inspect/plugin-dtsdec.xml: * docs/plugins/inspect/plugin-dvb.xml: * docs/plugins/inspect/plugin-dvdspu.xml: * docs/plugins/inspect/plugin-faac.xml: * docs/plugins/inspect/plugin-faad.xml: * docs/plugins/inspect/plugin-fbdevsink.xml: * docs/plugins/inspect/plugin-festival.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-flvdemux.xml: * docs/plugins/inspect/plugin-freeze.xml: * docs/plugins/inspect/plugin-gsm.xml: * docs/plugins/inspect/plugin-gstinterlace.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-h264parse.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-metadata.xml: * docs/plugins/inspect/plugin-mms.xml: * docs/plugins/inspect/plugin-modplug.xml: * docs/plugins/inspect/plugin-mpeg2enc.xml: * docs/plugins/inspect/plugin-mpeg4videoparse.xml: * docs/plugins/inspect/plugin-mpegtsparse.xml: * docs/plugins/inspect/plugin-mpegvideoparse.xml: * docs/plugins/inspect/plugin-musepack.xml: * docs/plugins/inspect/plugin-musicbrainz.xml: * docs/plugins/inspect/plugin-mve.xml: * docs/plugins/inspect/plugin-mythtv.xml * docs/plugins/inspect/plugin-nas.xml: * docs/plugins/inspect/plugin-neon.xml: * docs/plugins/inspect/plugin-nsfdec.xml: * docs/plugins/inspect/plugin-nuvdemux.xml: * docs/plugins/inspect/plugin-oss4.xml * docs/plugins/inspect/plugin-rawparse.xml: * docs/plugins/inspect/plugin-real.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rfbsrc.xml: * docs/plugins/inspect/plugin-sdl.xml: * docs/plugins/inspect/plugin-sdp.xml: * docs/plugins/inspect/plugin-selector.xml: * docs/plugins/inspect/plugin-sndfile.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-spcdec.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-speexresample.xml: * docs/plugins/inspect/plugin-stereo.xml: * docs/plugins/inspect/plugin-subenc.xml * docs/plugins/inspect/plugin-timidity.xml: * docs/plugins/inspect/plugin-tta.xml: * docs/plugins/inspect/plugin-vcdsrc.xml: * docs/plugins/inspect/plugin-videosignal.xml: * docs/plugins/inspect/plugin-vmnc.xml: * docs/plugins/inspect/plugin-wildmidi.xml: * docs/plugins/inspect/plugin-x264.xml: * docs/plugins/inspect/plugin-xvid.xml: * docs/plugins/inspect/plugin-y4menc.xml: * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/dc1394/gstdc1394.c: * ext/directfb/dfbvideosink.c: * ext/ivorbis/vorbisdec.c: * ext/jack/gstjackaudiosink.c: * ext/mpeg2enc/gstmpeg2enc.cc: * ext/mplex/gstmplex.cc: * ext/musicbrainz/gsttrm.c: * ext/mythtv/gstmythtvsrc.c: * ext/theora/theoradec.c: * ext/timidity/gsttimidity.c: * ext/timidity/gstwildmidi.c: * gst-libs/gst/app/gstappsink.c: * gst/deinterlace/gstdeinterlace.c: * gst/dvdspu/gstdvdspu.c: * gst/festival/gstfestival.c: * gst/freeze/gstfreeze.c: * gst/interleave/deinterleave.c: * gst/interleave/interleave.c: * gst/modplug/gstmodplug.cc: * gst/nuvdemux/gstnuvdemux.c: Add missing elements to docs. Fix doc-markup: use convinience syntax for examples (produces valid docbook), add several refsec2 when we have several titles. Fix some types. 2008-06-13 11:54:05 +0000 Wim Taymans gst/udp/gstudpsrc.*: Add property to control automatic join/leave of multicast groups. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Add property to control automatic join/leave of multicast groups. Add G_LIKELY. Remove setting caps on buffers explicitly, basesrc does that for us now. Improve debug info. Convert some non-fatal error into warnings. Use g_ntohs for better portability. Leave multicast groups when stopping. When using external sockets, use getsockname() on them to fill up the addr structure before calling methods that use the structure. Should all fix #536903. API: GstUDPSrc::auto-multicast property 2008-06-13 11:47:28 +0000 Wim Taymans gst/udp/gstudpnetutils.c: Use g_ntohl for better portability. Original commit message from CVS: * gst/udp/gstudpnetutils.c: (gst_udp_is_multicast): Use g_ntohl for better portability. 2008-06-13 11:45:54 +0000 Wim Taymans gst/udp/gstmultiudpsink.c: Fix a typo and do some small cleanups. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send), (gst_multiudpsink_remove): Fix a typo and do some small cleanups. 2008-06-13 09:39:41 +0000 Olivier Crete gst/rtp/gstrtptheoradepay.c: Make the delivery-method mandatory on the caps and only accept inline for now. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps): Make the delivery-method mandatory on the caps and only accept inline for now. Reverse strcmp checks for delivery-method. * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps): Make delivery method optional when parsing caps and note this in the caps. Reverse strcmp checks for delivery-method. * gst/rtp/gstrtpvorbispay.c: Update a comment to note that the delivery-method is optional, Fixes #537675. 2008-06-12 17:30:06 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Set udpsrc for receiving data from multicast groups to PAUSED instead of leaving them in READY... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_mcast): Set udpsrc for receiving data from multicast groups to PAUSED instead of leaving them in READY. Fixes #537832. 2008-06-12 12:14:38 +0000 Stefan Kost gst/avi/gstavimux.c: Simplify code. gst_tag_list_merge() does the NULL checks. Add a FIXME for a random constant in t... Original commit message from CVS: * gst/avi/gstavimux.c: Simplify code. gst_tag_list_merge() does the NULL checks. Add a FIXME for a random constant in tagmuxing code. 2008-06-11 14:28:44 +0000 Stefan Kost gst/debug/gsttaginject.*: Now actually adding the new element. Original commit message from CVS: * gst/debug/gsttaginject.c: * gst/debug/gsttaginject.h: Now actually adding the new element. 2008-06-11 14:11:16 +0000 Stefan Kost Remove dummy plugin_init. Remove some undefined entries from doc- section file. Add taginject element and rebuild doc... Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst/debug/Makefile.am: * gst/debug/breakmydata.c: * gst/debug/efence.c: * gst/debug/gstdebug.c: * gst/debug/gstnavseek.c: * gst/debug/gstpushfilesrc.c: * gst/debug/gstpushfilesrc.h: * gst/debug/negotiation.c: * gst/debug/progressreport.c: * gst/debug/progressreport.h: * gst/debug/rndbuffersize.c: * gst/debug/testplugin.c: Remove dummy plugin_init. Remove some undefined entries from doc- section file. Add taginject element and rebuild docs for it. 2008-06-11 11:27:46 +0000 Sebastian Dröge gst/matroska/matroska-mux.c: Update the counter for the number of streams when pads are added or removed. This will m... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), (gst_matroska_mux_write_data): Update the counter for the number of streams when pads are added or removed. This will make sure that a seek table is generated for files with just one audio stream. 2008-06-11 11:18:23 +0000 Sebastian Dröge gst/matroska/: Add some more tags, improve debugging a bit and make sure that Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_metadata_id_simple_tag): * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_simple_tag): Add some more tags, improve debugging a bit and make sure that GValue transformation has succeeded before using the result as a tag. 2008-06-11 08:56:16 +0000 Olivier Crete gst/rtp/gstrtptheorapay.c: The Theora RTP payloader only supports the "inline" delievery method so let's declare this... Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtptheorapay.c: The Theora RTP payloader only supports the "inline" delievery method so let's declare this on the caps of the static pad template. Fixes bug #537675. 2008-06-10 17:20:45 +0000 Wim Taymans gst/videomixer/videomixer.c: Remove bogus check. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), (gst_videomixer_update_queues): Remove bogus check. 2008-06-10 16:25:24 +0000 Wim Taymans gst/videomixer/videomixer.c: Use stream_time to synchronize the object properties. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers): Use stream_time to synchronize the object properties. Use running_time of the master pad to timestamp outgoing buffers. Fix the initial segment event to extend an unknown amount of time. Fixes #537361. 2008-06-10 11:05:30 +0000 Wim Taymans gst/avi/gstavidemux.c: Try to ignore unparsable/unknown streams and give a warning instead of erroring out. Fixes #53... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_header_pull): Try to ignore unparsable/unknown streams and give a warning instead of erroring out. Fixes #537377. 2008-06-10 10:44:53 +0000 Sebastian Dröge gst/matroska/ebml-write.c: Use GDOUBLE_TO_BE() instead of (probably slower) custom code. Original commit message from CVS: * gst/matroska/ebml-write.c: (gst_ebml_write_float): Use GDOUBLE_TO_BE() instead of (probably slower) custom code. * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init), (gst_matroska_demux_class_init), (gst_matroska_demux_init), (gst_matroska_track_free), (gst_matroska_demux_encoding_cmp), (gst_matroska_demux_read_track_encodings), (gst_matroska_demux_add_stream), (gst_matroska_demux_handle_src_query), (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_index_cuetrack), (gst_matroska_demux_parse_index_pointentry), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_metadata_id_simple_tag), (gst_matroska_demux_parse_metadata), (gst_matroska_demux_add_wvpk_header), (gst_matroska_decode_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_parse_cluster), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_loop_stream_parse_id), (gst_matroska_demux_loop), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), (gst_matroska_demux_subtitle_caps): * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.c: (gst_matroska_track_init_subtitle_context): * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init), (gst_matroska_mux_class_init), (gst_matroska_mux_init), (gst_matroska_mux_create_uid), (gst_matroska_mux_reset), (gst_matroska_mux_video_pad_setcaps), (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_subtitle_pad_setcaps), (gst_matroska_mux_request_new_pad), (gst_matroska_mux_track_header), (gst_matroska_mux_start), (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish), (gst_matroska_mux_write_data), (gst_matroska_mux_collected), (gst_matroska_mux_set_property): Add many FIXMEs/TODOs all over the matroska muxer and demuxer elements, do some checks for valid values in the demuxer, handle tracktimecodescale in the demuxer, set correct default values for all settings in the demuxer, review and add all missing matroska IDs and some more raw YUV formats, and some trivial cleanup. 2008-06-10 08:59:17 +0000 Sebastian Dröge ext/pulse/: Some smaller cleanup. Use G_PARAM_STATIC_STRINGS, gst_element_class_set_details_simple() and fix coding s... Original commit message from CVS: * ext/pulse/pulsemixer.c: (gst_pulsemixer_base_init), (gst_pulsemixer_class_init): * ext/pulse/pulsesink.c: (gst_pulsesink_base_init), (gst_pulsesink_class_init), (gst_pulsesink_prepare): * ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported), (gst_pulsesrc_base_init), (gst_pulsesrc_class_init), (gst_pulsesrc_prepare): Some smaller cleanup. Use G_PARAM_STATIC_STRINGS, gst_element_class_set_details_simple() and fix coding style a bit more. 2008-06-10 08:22:17 +0000 Sebastian Dröge Add documentation to the pulseaudio plugin and run make update in docs/plugins. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-pulseaudio.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * ext/pulse/plugin.c: * ext/pulse/pulsemixer.c: * ext/pulse/pulsesink.c: * ext/pulse/pulsesrc.c: Add documentation to the pulseaudio plugin and run make update in docs/plugins. 2008-06-10 06:52:44 +0000 Brian Cameron sys/sunaudio/gstsunaudiomixerctrl.c: Improvements for the SunAudio mixer by handling mute as no gain for tracks that ... Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_get_volume), (gst_sunaudiomixer_ctrl_set_volume): Improvements for the SunAudio mixer by handling mute as no gain for tracks that have a gain property but no mute property. Fixes bug #536067. 2008-06-10 06:45:33 +0000 Sebastian Dröge Add pulseaudio GStreamer element from gst-pulse. Development will continue here instead of pulseaudio SVN. Fixes bug ... Original commit message from CVS: * configure.ac: * ext/pulse/Makefile.am: * ext/pulse/plugin.c: (plugin_init): * ext/pulse/pulsemixer.c: (gst_pulsemixer_interface_supported), (gst_pulsemixer_implements_interface_init), (gst_pulsemixer_init_interfaces), (gst_pulsemixer_base_init), (gst_pulsemixer_class_init), (gst_pulsemixer_init), (gst_pulsemixer_finalize), (gst_pulsemixer_set_property), (gst_pulsemixer_get_property), (gst_pulsemixer_change_state): * ext/pulse/pulsemixer.h: * ext/pulse/pulsemixerctrl.c: (gst_pulsemixer_ctrl_context_state_cb), (gst_pulsemixer_ctrl_sink_info_cb), (gst_pulsemixer_ctrl_source_info_cb), (gst_pulsemixer_ctrl_subscribe_cb), (gst_pulsemixer_ctrl_success_cb), (gst_pulsemixer_ctrl_open), (gst_pulsemixer_ctrl_close), (gst_pulsemixer_ctrl_new), (gst_pulsemixer_ctrl_free), (gst_pulsemixer_ctrl_list_tracks), (gst_pulsemixer_ctrl_timeout_event), (restart_time_event), (gst_pulsemixer_ctrl_set_volume), (gst_pulsemixer_ctrl_get_volume), (gst_pulsemixer_ctrl_set_record), (gst_pulsemixer_ctrl_set_mute): * ext/pulse/pulsemixerctrl.h: * ext/pulse/pulsemixertrack.c: (gst_pulsemixer_track_class_init), (gst_pulsemixer_track_init), (gst_pulsemixer_track_new): * ext/pulse/pulsemixertrack.h: * ext/pulse/pulseprobe.c: (gst_pulseprobe_context_state_cb), (gst_pulseprobe_sink_info_cb), (gst_pulseprobe_source_info_cb), (gst_pulseprobe_invalidate), (gst_pulseprobe_open), (gst_pulseprobe_enumerate), (gst_pulseprobe_close), (gst_pulseprobe_new), (gst_pulseprobe_free), (gst_pulseprobe_get_properties), (gst_pulseprobe_needs_probe), (gst_pulseprobe_probe_property), (gst_pulseprobe_get_values), (gst_pulseprobe_set_server): * ext/pulse/pulseprobe.h: * ext/pulse/pulsesink.c: (gst_pulsesink_base_init), (gst_pulsesink_class_init), (gst_pulsesink_init), (gst_pulsesink_destroy_stream), (gst_pulsesink_destroy_context), (gst_pulsesink_finalize), (gst_pulsesink_dispose), (gst_pulsesink_set_property), (gst_pulsesink_get_property), (gst_pulsesink_context_state_cb), (gst_pulsesink_stream_state_cb), (gst_pulsesink_stream_request_cb), (gst_pulsesink_stream_latency_update_cb), (gst_pulsesink_open), (gst_pulsesink_close), (gst_pulsesink_prepare), (gst_pulsesink_unprepare), (gst_pulsesink_write), (gst_pulsesink_delay), (gst_pulsesink_success_cb), (gst_pulsesink_reset), (gst_pulsesink_change_title), (gst_pulsesink_event), (gst_pulsesink_get_type): * ext/pulse/pulsesink.h: * ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported), (gst_pulsesrc_implements_interface_init), (gst_pulsesrc_init_interfaces), (gst_pulsesrc_base_init), (gst_pulsesrc_class_init), (gst_pulsesrc_init), (gst_pulsesrc_destroy_stream), (gst_pulsesrc_destroy_context), (gst_pulsesrc_finalize), (gst_pulsesrc_dispose), (gst_pulsesrc_set_property), (gst_pulsesrc_get_property), (gst_pulsesrc_context_state_cb), (gst_pulsesrc_stream_state_cb), (gst_pulsesrc_stream_request_cb), (gst_pulsesrc_open), (gst_pulsesrc_close), (gst_pulsesrc_prepare), (gst_pulsesrc_unprepare), (gst_pulsesrc_read), (gst_pulsesrc_delay), (gst_pulsesrc_change_state), (gst_pulsesrc_get_type): * ext/pulse/pulsesrc.h: * ext/pulse/pulseutil.c: (gst_pulse_fill_sample_spec), (gst_pulse_client_name), (gst_pulse_gst_to_channel_map): * ext/pulse/pulseutil.h: Add pulseaudio GStreamer element from gst-pulse. Development will continue here instead of pulseaudio SVN. Fixes bug #400679. Only changes over gst-pulse SVN are added copyright to the top of files and coding style changes. 2008-06-09 20:02:05 +0000 Benjamin Kampmann ext/cdio/: Also extract album title and album genre from CD-TEXT if available (#537021). Original commit message from CVS: Patch by: Benjamin Kampmann * ext/cdio/gstcdio.c: (gst_cdio_get_cdtext), (gst_cdio_add_cdtext_album_tags): * ext/cdio/gstcdio.h: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): Also extract album title and album genre from CD-TEXT if available (#537021). 2008-06-09 08:52:04 +0000 Sjoerd Simons sys/v4l2/gstv4l2src.c: Improve negotiation a bit more by picking the smallest possible resolution that is larger than... Original commit message from CVS: Patch by: Sjoerd Simons * sys/v4l2/gstv4l2src.c: (gst_v4l2src_negotiate): Improve negotiation a bit more by picking the smallest possible resolution that is larger than the resolution specified in the first caps entry of the peer caps. Fixes bug #536994. 2008-06-09 08:42:49 +0000 Bastien Nocera sys/v4l2/: Fix compilation with newer GIT kernels that deprecated Original commit message from CVS: Patch by: Bastien Nocera * sys/v4l2/gstv4l2vidorient.c: * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): Fix compilation with newer GIT kernels that deprecated V4L2_CID_HCENTER and V4L2_CID_VCENTER. Fixes bug #536317. 2008-06-07 18:48:54 +0000 Tim-Philipp Müller Require libcdio >= 0.76. Original commit message from CVS: * configure.ac: * ext/cdio/gstcdio.c: * ext/cdio/gstcdio.h: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): Require libcdio >= 0.76. 2008-06-05 11:07:17 +0000 Sebastian Dröge gst/interleave/: Properly implement duration and position queries in bytes format. We have to take the upstream reply... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_add_new_pads), (gst_deinterleave_src_query): * gst/interleave/interleave.c: (gst_interleave_src_query_duration), (gst_interleave_src_query): Properly implement duration and position queries in bytes format. We have to take the upstream reply and divide/multiply it by the number of channels to get the correct result. 2008-06-05 09:45:00 +0000 Thijs Vermeir gst/avi/gstavidemux.c: Catch UNEXPECTED when downstream has reached end of segment in reverse mode. Original commit message from CVS: * gst/avi/gstavidemux.c: Catch UNEXPECTED when downstream has reached end of segment in reverse mode. 2008-06-04 18:08:35 +0000 Thijs Vermeir gst/avi/gstavidemux.c: Fix typo in comment Original commit message from CVS: * gst/avi/gstavidemux.c: Fix typo in comment 2008-06-04 18:03:24 +0000 Thijs Vermeir gst/avi/gstavidemux.c: Because we don't know the frame order we need to push till the next keyframe Original commit message from CVS: * gst/avi/gstavidemux.c: Because we don't know the frame order we need to push till the next keyframe 2008-06-04 17:39:31 +0000 Sjoerd Simons sys/v4l2/gstv4l2src.c: Provide a custom negotiation function to make sure to pick the highest possible framerate and ... Original commit message from CVS: Patch by: Sjoerd Simons * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), (gst_v4l2src_fixate), (gst_v4l2src_negotiate): Provide a custom negotiation function to make sure to pick the highest possible framerate and resolution. Fixes bug #536646. 2008-06-04 16:49:26 +0000 Thijs Vermeir gst/avi/gstavidemux.c: Set EOS when going out of the segment in reverse playback Original commit message from CVS: * gst/avi/gstavidemux.c: Set EOS when going out of the segment in reverse playback 2008-06-04 15:19:46 +0000 Tim-Philipp Müller ext/taglib/Makefile.am: Add -Wno-attributes to CXXFLAGS to suppress warning caused by taglib headers (with gcc 4.3.1). Original commit message from CVS: * ext/taglib/Makefile.am:: Add -Wno-attributes to CXXFLAGS to suppress warning caused by taglib headers (with gcc 4.3.1). 2008-06-04 11:59:18 +0000 Peter Kjellerstedt gst/rtsp/gstrtspsrc.c: Use the new gst_rtsp_connection_get_ip() to access the IP address of a GstRTSPConnection since... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink): Use the new gst_rtsp_connection_get_ip() to access the IP address of a GstRTSPConnection since it is a private member. 2008-06-04 10:42:46 +0000 Tim-Philipp Müller Use new utility functions in libgsttag to process coverart (#512333). Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_extract_picture_buffer): * gst/id3demux/id3v2frames.c: (parse_picture_frame): Use new utility functions in libgsttag to process coverart (#512333). 2008-06-04 08:54:09 +0000 Sebastian Dröge ext/flac/gstflacdec.c: We actually support left/side, right/side and mid/side files. The conversion to normal, interl... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_write): We actually support left/side, right/side and mid/side files. The conversion to normal, interleaved stereo is done by libflac. 2008-06-04 07:36:07 +0000 Sebastian Dröge gst/matroska/ebml-write.c: Unref the write cache in finalize if it was set and add add "FIXME" to a comment that need... Original commit message from CVS: * gst/matroska/ebml-write.c: (gst_ebml_write_finalize), (gst_ebml_write_set_cache): Unref the write cache in finalize if it was set and add add "FIXME" to a comment that needs it. 2008-06-04 06:48:46 +0000 Sebastian Dröge gst/interleave/interleave.*: Use an always increasing integer for the number in the name of the requested sink pads t... Original commit message from CVS: * gst/interleave/interleave.c: (gst_interleave_pad_get_type), (gst_interleave_pad_get_property), (gst_interleave_pad_class_init), (gst_interleave_request_new_pad), (gst_interleave_release_pad): * gst/interleave/interleave.h: Use an always increasing integer for the number in the name of the requested sink pads to guarantuee a unique name. Add a "channel" property to GstInterleavePad to make it possible for applications to retrieve the channel number in the output for every pad. Use g_type_register_static_simple() instead of g_type_register_static() to save some relocations. 2008-06-03 14:35:59 +0000 Sebastian Dröge gst/interleave/interleave.c: Stop GstCollectPads before calling the parent's state change function when going from PA... Original commit message from CVS: * gst/interleave/interleave.c: (gst_interleave_pad_get_type), (gst_interleave_change_state): Stop GstCollectPads before calling the parent's state change function when going from PAUSED to READY as we otherwise deadlock. Fixes bug #536258. 2008-06-03 09:03:19 +0000 Sebastian Dröge gst/interleave/interleave.c: Use new gst_audio_check_channel_positions() function and register the GstInterleavePad t... Original commit message from CVS: * gst/interleave/interleave.c: (gst_interleave_check_channel_positions), (gst_interleave_set_channel_positions), (gst_interleave_class_init): Use new gst_audio_check_channel_positions() function and register the GstInterleavePad type from a threadsafe context. 2008-06-02 16:10:00 +0000 Thijs Vermeir gst/avi/gstavidemux.*: Implement reverse playback. Fixes #535300. Original commit message from CVS: Patch by: Thijs Vermeir * gst/avi/gstavidemux.c: (gst_avi_demux_index_next), (gst_avi_demux_index_prev), (gst_avi_demux_index_entry_for_time), (gst_avi_demux_do_seek), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): * gst/avi/gstavidemux.h: Implement reverse playback. Fixes #535300. Small cleanups. 2008-06-02 12:42:14 +0000 Sebastian Dröge gst/interleave/interleave.*: Allow setting channel positions via a property and allow using the channel positions on ... Original commit message from CVS: * gst/interleave/interleave.c: (gst_interleave_pad_get_type), (gst_interleave_finalize), (gst_audio_check_channel_positions), (gst_interleave_set_channel_positions), (gst_interleave_class_init), (gst_interleave_init), (gst_interleave_set_property), (gst_interleave_get_property), (gst_interleave_request_new_pad), (gst_interleave_release_pad), (gst_interleave_sink_setcaps), (gst_interleave_src_query_duration), (gst_interleave_src_query_latency), (gst_interleave_collected): * gst/interleave/interleave.h: Allow setting channel positions via a property and allow using the channel positions on the input as the channel positions of the output. Fix some broken logic and memory leaks. * tests/check/Makefile.am: * tests/check/elements/interleave.c: (src_handoff_float32), (sink_handoff_float32), (GST_START_TEST), (interleave_suite): Add unit tests for checking correct handling of channel positions. 2008-06-02 12:22:56 +0000 Sebastian Dröge gst/videomixer/videomixer.c: When using gst_element_iterate_pads() one has to unref every pad after usage. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_query_duration), (gst_videomixer_query_latency): When using gst_element_iterate_pads() one has to unref every pad after usage. 2008-05-31 16:53:23 +0000 Bastien Nocera gst/qtdemux/: Improve meta-data handling, add 'comment', 'description' and 'copyright' tag handling. Original commit message from CVS: Patch by: Bastien Nocera * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_str), (qtdemux_parse_udta): * gst/qtdemux/qtdemux_fourcc.h: Improve meta-data handling, add 'comment', 'description' and 'copyright' tag handling. Fixes #535935 2008-05-31 15:30:41 +0000 Julien Moutte gst/qtdemux/qtdemux.c: Make sure we we don't clip the segment's stop using the main segment duration as that could cr... Original commit message from CVS: 2008-05-31 Julien Moutte * gst/qtdemux/qtdemux.c: (gst_qtdemux_find_keyframe), (gst_qtdemux_find_segment), (gst_qtdemux_perform_seek), (gst_qtdemux_seek_to_previous_keyframe), (gst_qtdemux_activate_segment), (gst_qtdemux_loop): Make sure we we don't clip the segment's stop using the main segment duration as that could crop quite some video frames. Make reverse playback support more robust and support edit lists. Support seeking to the last frame, and fix reverse looping playback. Add some debugging. * win32/common/config.h: Updated. 2008-05-31 08:37:00 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Don't clip float/double samples, correctly unset passthrough mode and use better rou... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_transform_ip): Don't clip float/double samples, correctly unset passthrough mode and use better rounding for integer samples. 2008-05-30 11:03:57 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.*: Update the filter coefficients only when needed in the transform_ip function and cor... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_init), (setup_filter), (set_passthrough), (update_coefficients), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_transform_ip): * gst/equalizer/gstiirequalizer.h: Update the filter coefficients only when needed in the transform_ip function and correctly set the element into passthrough mode if the gain of all bands is 0. 2008-05-29 11:30:16 +0000 Sebastian Keller gst/alpha/gstalpha.c: Try to skip pixels or areas that are too dark or too bright for us to do meaningfull color dete... Original commit message from CVS: Based on patch by: Sebastian Keller * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), (gst_alpha_get_property), (gst_alpha_chroma_key_ayuv), (gst_alpha_chromakey_row_i420): Try to skip pixels or areas that are too dark or too bright for us to do meaningfull color detection. Added properties to control the sensitivity to light and darkness. Added some small cleanups. Fixes #512345. 2008-05-28 20:01:32 +0000 Jan Schmidt Ignore some more generated things Original commit message from CVS: * docs/plugins/.cvsignore: * tests/check/elements/.cvsignore: Ignore some more generated things * tests/check/Makefile.am: Ignore OSS elements in the state changes test too. 2008-05-28 16:22:36 +0000 Wim Taymans docs/plugins/: Add SMPTE effect elements to docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Add SMPTE effect elements to docs. 2008-05-28 14:31:05 +0000 Stefan Kost Document whats first shown on the fdo plugin docs page :) Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/raw1394/gstdv1394src.c: Document whats first shown on the fdo plugin docs page :) 2008-05-28 14:07:21 +0000 Stefan Kost Rename audiovoice to audiokaraoke and add it to the docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-audiofx.xml: * gst/audiofx/Makefile.am: * gst/audiofx/audiofx.c: * gst/audiofx/audiokaraoke.c: * gst/audiofx/audiokaraoke.h: * gst/audiofx/audiovoice.c: * gst/audiofx/audiovoice.h: Rename audiovoice to audiokaraoke and add it to the docs. 2008-05-28 13:28:20 +0000 Stefan Kost Document aasink and cacasink. Original commit message from CVS: * REQUIREMENTS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * ext/aalib/gstaasink.c: * ext/libcaca/gstcacasink.c: Document aasink and cacasink. 2008-05-28 08:36:44 +0000 Sebastian Dröge gst/videomixer/videomixer.*: duration and latency queries. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_reset), (gst_videomixer_init), (gst_videomixer_query_duration), (gst_videomixer_query_latency), (gst_videomixer_query), (gst_videomixer_blend_buffers): * gst/videomixer/videomixer.h: Implement position (in time), duration and latency queries. 2008-05-28 08:14:16 +0000 Sebastian Dröge gst/interleave/interleave.c: Implement latency query. Original commit message from CVS: * gst/interleave/interleave.c: (gst_interleave_src_query_duration), (gst_interleave_src_query_latency), (gst_interleave_src_query): Implement latency query. 2008-05-27 17:55:30 +0000 Edward Hervey gst/videomixer/videomixer.*: Implement proper seek/newsegment handling. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_reset), (gst_videomixer_init), (gst_videomixer_request_new_pad), (gst_videomixer_fill_queues), (forward_event_func), (forward_event), (gst_videomixer_src_event), (gst_videomixer_sink_event): * gst/videomixer/videomixer.h: Implement proper seek/newsegment handling. Based on adder's implementation. Fixes #535121 2008-05-26 16:25:15 +0000 j^ gst/qtdemux/qtdemux.c: Add caps for DVCPRO50 and DVCPRO HD PAL/NTSC. See #526481. Original commit message from CVS: Patch by: j^ * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add caps for DVCPRO50 and DVCPRO HD PAL/NTSC. See #526481. 2008-05-26 15:51:41 +0000 Wim Taymans gst/audiofx/: Add simple voice removal element. Yay karaoke. Original commit message from CVS: * gst/audiofx/Makefile.am: * gst/audiofx/audiofx.c: (plugin_init): * gst/audiofx/audiovoice.c: (gst_audio_voice_base_init), (gst_audio_voice_class_init), (gst_audio_voice_init), (update_filter), (gst_audio_voice_set_property), (gst_audio_voice_get_property), (gst_audio_voice_setup), (gst_audio_voice_transform_int), (gst_audio_voice_transform_float), (gst_audio_voice_transform_ip): * gst/audiofx/audiovoice.h: Add simple voice removal element. Yay karaoke. 2008-05-26 15:39:26 +0000 William M. Brack sys/v4l2/v4l2src_calls.c: Fix potential caps leak. Original commit message from CVS: Patch by: William M. Brack * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): Fix potential caps leak. If we can't get the framerate with an ioctl, try to get it with the current norm. Fixes #520092. 2008-05-26 15:14:55 +0000 William M. Brack sys/v4l2/v4l2src_calls.c: If we fail to get the frame intervals, simply don't touch the framerates on the template ca... Original commit message from CVS: Patch by: William M. Brack * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format_and_size): If we fail to get the frame intervals, simply don't touch the framerates on the template caps instead of discarding the format. See #520092. 2008-05-26 14:52:51 +0000 William M. Brack sys/v4l2/gstv4l2src.c: Add NV12, NV21 and bayer support. See #520092. Original commit message from CVS: Patch by: William M. Brack * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_structure), (gst_v4l2_get_caps_info): Add NV12, NV21 and bayer support. See #520092. 2008-05-26 13:51:38 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Unbreak segment activation again. Fixes #531672. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_find_segment), (gst_qtdemux_activate_segment): Unbreak segment activation again. Fixes #531672. 2008-05-26 10:28:47 +0000 Sebastian Dröge gst/interleave/deinterleave.c: Add another example launch line. Original commit message from CVS: * gst/interleave/deinterleave.c: Add another example launch line. * gst/interleave/interleave.c: (interleave_24), (gst_interleave_finalize), (gst_interleave_base_init), (gst_interleave_class_init), (gst_interleave_init), (gst_interleave_request_new_pad), (gst_interleave_release_pad), (gst_interleave_change_state), (__remove_channels), (__set_channels), (gst_interleave_sink_getcaps), (gst_interleave_set_process_function), (gst_interleave_sink_setcaps), (gst_interleave_sink_event), (gst_interleave_src_query_duration), (gst_interleave_src_query), (forward_event_func), (forward_event), (gst_interleave_src_event), (gst_interleave_collected): * gst/interleave/interleave.h: Major rewrite of interleave using GstCollectpads. This new version also supports almost all raw audio formats and has better caps negotiation. Fixes bug #506594. Also update docs and add some more examples. * tests/check/elements/interleave.c: (interleave_chain_func), (GST_START_TEST), (src_handoff_float32), (sink_handoff_float32), (interleave_suite): Add some more extensive unit tests for interleave. 2008-05-26 09:57:40 +0000 Wim Taymans Don't use _gst_pad(). Original commit message from CVS: * examples/switch/switcher.c: (switch_timer): * gst/replaygain/gstrgvolume.c: (gst_rg_volume_init): * gst/rtpmanager/gstrtpclient.c: (create_stream): * gst/sdp/gstsdpdemux.c: (gst_sdp_demux_stream_configure_udp), (gst_sdp_demux_stream_configure_udp_sink): * tests/check/elements/deinterleave.c: (GST_START_TEST), (pad_added_setup_data_check_float32_8ch_cb): * tests/check/elements/rganalysis.c: (send_eos_event), (send_tag_event): Don't use _gst_pad(). 2008-05-25 16:09:39 +0000 Sebastian Dröge ext/flac/: Set the channel layout when decoding FLAC files with more than 2 channels as defined by the FLAC spec. Fix... Original commit message from CVS: * ext/flac/Makefile.am: * ext/flac/gstflacdec.c: (gst_flac_dec_write): Set the channel layout when decoding FLAC files with more than 2 channels as defined by the FLAC spec. Fixes bug #534570. Also don't try to decode left/side, right/side and mid/side files as we don't support this at all. 2008-05-24 12:55:39 +0000 Tim-Philipp Müller configure.ac: We need -base CVS (rtsp). Original commit message from CVS: * configure.ac: We need -base CVS (rtsp). 2008-05-22 19:47:53 +0000 Sebastian Dröge docs/plugins/: Add interleave/deinterleave to the docs and while at that run make update in docs/plugins. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-alsaspdif.xml: * docs/plugins/inspect/plugin-amrwb.xml: * docs/plugins/inspect/plugin-app.xml: * docs/plugins/inspect/plugin-bayer.xml: * docs/plugins/inspect/plugin-bz2.xml: * docs/plugins/inspect/plugin-cdaudio.xml: * docs/plugins/inspect/plugin-cdxaparse.xml: * docs/plugins/inspect/plugin-dfbvideosink.xml: * docs/plugins/inspect/plugin-dtsdec.xml: * docs/plugins/inspect/plugin-dvb.xml: * docs/plugins/inspect/plugin-dvdspu.xml: * docs/plugins/inspect/plugin-faac.xml: * docs/plugins/inspect/plugin-faad.xml: * docs/plugins/inspect/plugin-fbdevsink.xml: * docs/plugins/inspect/plugin-festival.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-flvdemux.xml: * docs/plugins/inspect/plugin-freeze.xml: * docs/plugins/inspect/plugin-gsm.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-h264parse.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-metadata.xml: * docs/plugins/inspect/plugin-mms.xml: * docs/plugins/inspect/plugin-modplug.xml: * docs/plugins/inspect/plugin-mpeg2enc.xml: * docs/plugins/inspect/plugin-mpeg4videoparse.xml: * docs/plugins/inspect/plugin-mpegtsparse.xml: * docs/plugins/inspect/plugin-mpegvideoparse.xml: * docs/plugins/inspect/plugin-musepack.xml: * docs/plugins/inspect/plugin-musicbrainz.xml: * docs/plugins/inspect/plugin-mve.xml: * docs/plugins/inspect/plugin-nas.xml: * docs/plugins/inspect/plugin-neon.xml: * docs/plugins/inspect/plugin-nsfdec.xml: * docs/plugins/inspect/plugin-nuvdemux.xml: * docs/plugins/inspect/plugin-rawparse.xml: * docs/plugins/inspect/plugin-real.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-rfbsrc.xml: * docs/plugins/inspect/plugin-sdl.xml: * docs/plugins/inspect/plugin-sdp.xml: * docs/plugins/inspect/plugin-selector.xml: * docs/plugins/inspect/plugin-sndfile.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-spcdec.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-speexresample.xml: * docs/plugins/inspect/plugin-stereo.xml: * docs/plugins/inspect/plugin-tta.xml: * docs/plugins/inspect/plugin-vcdsrc.xml: * docs/plugins/inspect/plugin-videosignal.xml: * docs/plugins/inspect/plugin-vmnc.xml: * docs/plugins/inspect/plugin-wildmidi.xml: * docs/plugins/inspect/plugin-x264.xml: * docs/plugins/inspect/plugin-xvid.xml: * docs/plugins/inspect/plugin-y4menc.xml: Add interleave/deinterleave to the docs and while at that run make update in docs/plugins. * gst/interleave/deinterleave.c: Add a parapraph about using a queue and audioconvert after the source pads to the docs. 2008-05-22 18:55:09 +0000 Sebastian Dröge gst/interleave/deinterleave.*: Don't set a getcaps() function on the src pads as it's not required and the default ge... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_base_init), (gst_deinterleave_class_init), (gst_deinterleave_init), (gst_deinterleave_add_new_pads), (gst_deinterleave_sink_getcaps): * gst/interleave/deinterleave.h: Don't set a getcaps() function on the src pads as it's not required and the default getcaps() function returns the correct results for our src pads. Complete documentation and add myself to the authors of the element. 2008-05-22 14:49:08 +0000 Tim-Philipp Müller gst/udp/Makefile.am: Add -D_GNU_SOURCE to CFLAGS so we get things like EAI_ADDRFAMILY when including netdb.h when bui... Original commit message from CVS: * gst/udp/Makefile.am: Add -D_GNU_SOURCE to CFLAGS so we get things like EAI_ADDRFAMILY when including netdb.h when building against glibc >= 2.8. 2008-05-22 11:19:03 +0000 Julien Moutte gst/smpte/gstsmptealpha.c: Fix debug statement arguments. Original commit message from CVS: 2008-05-22 Julien Moutte * gst/smpte/gstsmptealpha.c: (gst_smpte_alpha_setcaps): Fix debug statement arguments. * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_setup_qos_dscp): * gst/udp/gstudpnetutils.c: (gst_udp_join_group), (gst_udp_leave_group): Fix IP and IPV6 options to make it work on more platforms. 2008-05-21 17:51:09 +0000 Wim Taymans tests/check/elements/: Don't use gst_element_get_pad(), it's a bad, bad method. Original commit message from CVS: * tests/check/elements/avimux.c: (setup_src_pad), (teardown_src_pad): * tests/check/elements/icydemux.c: (icydemux_found_pad), (GST_START_TEST): * tests/check/elements/matroskamux.c: (setup_src_pad), (teardown_src_pad), (setup_sink_pad), (teardown_sink_pad): * tests/check/elements/videocrop.c: (video_crop_get_test_caps), (GST_START_TEST): * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad), (setup_wavpackparse), (cleanup_wavpackparse): Don't use gst_element_get_pad(), it's a bad, bad method. 2008-05-21 17:39:38 +0000 Wim Taymans Don't use gst_element_get_pad(), it's a bad method. Original commit message from CVS: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), (do_toggle_element): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), (do_toggle_element): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), (do_toggle_element): * ext/gconf/gstswitchsink.c: (gst_switch_commit_new_kid): * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_reset), (do_toggle_element): * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_reset), (do_toggle_element): * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), (gst_auto_audio_sink_detect): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), (gst_auto_video_sink_detect): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_stream_free), (gst_rtspsrc_stream_configure_udp), (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_skip_lws), (gst_rtspsrc_unskip_lws), (gst_rtspsrc_skip_commas), (gst_rtspsrc_skip_item), (gst_rtsp_decode_quoted_string), (gst_rtspsrc_parse_digest_challenge), (gst_rtspsrc_parse_auth_hdr): * tests/icles/videocrop-test.c: (test_with_caps), (video_crop_get_test_caps): Don't use gst_element_get_pad(), it's a bad method. 2008-05-21 17:35:50 +0000 Wim Taymans gst/udp/: Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separ... Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal): * gst/udp/gstudpnetutils.c: (gst_udp_set_loop_ttl), (gst_udp_join_group): * gst/udp/gstudpnetutils.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Joining a multicast group and setting the loop/ttl properties are totally unrelated tasks are must be separated. 2008-05-21 14:09:41 +0000 Stefan Kost gst/avi/gstavimux.c: Also support alaw/mulaw. Original commit message from CVS: * gst/avi/gstavimux.c: Also support alaw/mulaw. 2008-05-21 13:47:43 +0000 Wim Taymans gst/udp/gstmultiudpsink.*: Add a fixme for the auto-multicast property. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_setup_qos_dscp), (gst_multiudpsink_add_internal): * gst/udp/gstmultiudpsink.h: Add a fixme for the auto-multicast property. Fix some confusing debug messages. Disable setting a qos value by default. 2008-05-21 11:38:17 +0000 Gustaf Räntilä gst/udp/gstmultiudpsink.c: Ignore EPERM errors from sendto. Fixes #533619. Original commit message from CVS: Patch by: Gustaf Räntilä * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render): Ignore EPERM errors from sendto. Fixes #533619. 2008-05-21 10:51:52 +0000 Henrik Eriksson gst/udp/gstmultiudpsink.*: Add qos-dscp property to manage the Quality of service. Original commit message from CVS: Patch by: Henrik Eriksson * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_setup_qos_dscp), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal): * gst/udp/gstmultiudpsink.h: Add qos-dscp property to manage the Quality of service. 2008-05-21 10:09:23 +0000 Wim Taymans gst/rtp/gstrtptheoradepay.c: Improve debugging of the ident. Original commit message from CVS: * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_process): Improve debugging of the ident. 2008-05-21 09:56:02 +0000 Bruno Santos gst/udp/gstudpnetutils.*: Provide a bunch of helper methods to deal with IPv4 and IPv6 transparently. Original commit message from CVS: Patch by: Bruno Santos * gst/udp/gstudpnetutils.c: (gst_udp_get_addr), (gst_udp_join_group), (gst_udp_leave_group), (gst_udp_is_multicast): * gst/udp/gstudpnetutils.h: Provide a bunch of helper methods to deal with IPv4 and IPv6 transparently. * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (join_multicast), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), (gst_multiudpsink_remove): * gst/udp/gstmultiudpsink.h: Add multicast TTL and loopback properties. Use the helper methods to implement ip4 and ip6. * gst/udp/gstudpsrc.c: (gst_udpsrc_create), (gst_udpsrc_start): * gst/udp/gstudpsrc.h: Use the helper methods to implement ip4 and ip6. Fixes #515962. 2008-05-21 09:38:48 +0000 Patrick Radizi gst/multipart/multipartdemux.*: Don't blindly copy the mime-type as the caps name because they not always map directl... Original commit message from CVS: Patch by: Patrick Radizi * gst/multipart/multipartdemux.c: (gst_multipart_demux_class_init), (gst_multipart_demux_get_gstname), (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain): * gst/multipart/multipartdemux.h: Don't blindly copy the mime-type as the caps name because they not always map directly. Instead use a hashtable with common mappings. Fixes #533287. 2008-05-20 17:27:35 +0000 Michael Meeks ext/esd/esdsink.c: When we post an error, we must return -1 to let the parent know that we cannot write the segment e... Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_write): When we post an error, we must return -1 to let the parent know that we cannot write the segment else it will loop and continue to call us again forever. Patch by Michael Meeks. 2008-05-20 14:24:21 +0000 Stefan Kost gst/videomixer/videomixer.c: Add missing incudes. Original commit message from CVS: * gst/videomixer/videomixer.c: Add missing incudes. 2008-05-20 13:57:44 +0000 Peter Kjellerstedt gst/rtp/gstrtph264pay.*: Correct a typo (sinle -> single). Original commit message from CVS: * gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type), (gst_rtp_h264_pay_handle_buffer): * gst/rtp/gstrtph264pay.h: Correct a typo (sinle -> single). 2008-05-20 11:33:05 +0000 Wim Taymans gst/rtp/gstrtph264depay.*: Add experimental support for outputting quicktime-like AVC output in addition to the exist... Original commit message from CVS: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init), (gst_rtp_h264_depay_set_property), (gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): * gst/rtp/gstrtph264depay.h: Add experimental support for outputting quicktime-like AVC output in addition to the existing bytestream output. * gst/rtp/gstrtph264pay.c: (gst_h264_scan_mode_get_type), (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init), (gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_payload_nal), (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), (gst_rtp_h264_pay_get_property): * gst/rtp/gstrtph264pay.h: Make the parsing mode configurable, for some inputs we don't need to scan every byte for start codes. Only set the marker bit on ACCESS units. 2008-05-20 10:47:10 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Use a bigger type in integer mode for the intermediate results to prevent overflows.... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: Use a bigger type in integer mode for the intermediate results to prevent overflows. This fixes the crippled sound when using the equalizer in integer mode. Fixes bug #510865. 2008-05-20 10:42:33 +0000 Jan Schmidt gst/videomixer/videomixer.*: Instead of a random number for the request pad id's, use a counter. Original commit message from CVS: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: Instead of a random number for the request pad id's, use a counter. Register the videomixerpad class from the element's class_init where it's safer, and allows the docs generator to scan it. 2008-05-20 09:29:28 +0000 Wim Taymans gst/smpte/: Add new plugin that adds the SMPTE transition in the alpha channel of Original commit message from CVS: * gst/smpte/Makefile.am: * gst/smpte/gstsmpte.c: (gst_smpte_plugin_init): * gst/smpte/gstsmpte.h: * gst/smpte/gstsmptealpha.c: (gst_smpte_alpha_transition_type_get_type), (gst_smpte_alpha_get_type), (gst_smpte_alpha_base_init), (gst_smpte_alpha_class_init), (gst_smpte_alpha_update_mask), (gst_smpte_alpha_setcaps), (gst_smpte_alpha_get_unit_size), (gst_smpte_alpha_init), (gst_smpte_alpha_finalize), (gst_smpte_alpha_do_ayuv), (gst_smpte_alpha_do_i420), (gst_smpte_alpha_transform), (gst_smpte_alpha_set_property), (gst_smpte_alpha_get_property), (gst_smpte_alpha_plugin_init): * gst/smpte/gstsmptealpha.h: * gst/smpte/plugin.c: (plugin_init): Add new plugin that adds the SMPTE transition in the alpha channel of I420 and AYUV frames so that they can be blended with videomixer later on. Uses all niceties such as using base transform for efficient alloc and negotiation. It currently requires GstController to control the position in the transition effect. 2008-05-19 21:05:03 +0000 Stefan Kost Try using thaytans new mechanism to get extra classes into plugin docs. Aparently works for the Eq. For VideoMixer th... Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.types: * gst/videomixer/videomixer.c: Try using thaytans new mechanism to get extra classes into plugin docs. Aparently works for the Eq. For VideoMixer the GObject stuff is missing still. 2008-05-19 12:32:06 +0000 Sebastian Dröge tests/check/elements/deinterleave.c: Set keep-positions property to TRUE for the 8 channel test to ensure that the or... Original commit message from CVS: * tests/check/elements/deinterleave.c: (GST_START_TEST): Set keep-positions property to TRUE for the 8 channel test to ensure that the original channel position is set on the output. 2008-05-19 07:46:05 +0000 Sebastian Dröge gst/interleave/deinterleave.*: Add a property to select whether channel positions should be kept on the mono output b... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_class_init), (gst_deinterleave_init), (gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps), (gst_deinterleave_set_property), (gst_deinterleave_get_property): * gst/interleave/deinterleave.h: Add a property to select whether channel positions should be kept on the mono output buffers or should be dropped. 2008-05-18 19:27:59 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Set proper rate in avi stream header for PCM audio, and also do some more sanity checks on caps ... Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_audsink_set_caps): Set proper rate in avi stream header for PCM audio, and also do some more sanity checks on caps in this case. Fixes #511489. 2008-05-17 19:39:53 +0000 Sebastian Dröge gst/interleave/deinterleave.*: Queue events until src pads were added and they can be sent. Otherwise downstream will... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_finalize), (gst_deinterleave_init), (gst_deinterleave_sink_event), (gst_deinterleave_process), (gst_deinterleave_sink_activate_push): * gst/interleave/deinterleave.h: Queue events until src pads were added and they can be sent. Otherwise downstream will never get the first newsegment event. 2008-05-17 14:05:03 +0000 Sebastian Dröge gst/interleave/deinterleave.c: Always set the channel positions when gst_audio_get_channel_positions() returns someth... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_sink_setcaps), (gst_deinterleave_getcaps): Always set the channel positions when gst_audio_get_channel_positions() returns something, even if they're not set in the caps. This makes sure that the output channels can be interleaved again correctly in the mono/stereo cases too. Don't ask for the peercaps of the current pad in getcaps() as this might call getcaps() again and deadlock. 2008-05-17 10:38:18 +0000 Sebastian Dröge sys/v4l2/gstv4l2src.c: Don't include the gstv4l2xoverlay.h header as the XOverlay support isn't implemented at all ye... Original commit message from CVS: * sys/v4l2/gstv4l2src.c: Don't include the gstv4l2xoverlay.h header as the XOverlay support isn't implemented at all yet and this requires X headers to be installed. Fixes bug #533264. 2008-05-16 21:56:24 +0000 Sebastian Dröge gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing. Original commit message from CVS: * gst/interleave/Makefile.am: * gst/interleave/deinterleave.c: (deinterleave_24), (gst_deinterleave_finalize), (gst_deinterleave_base_init), (gst_deinterleave_class_init), (gst_deinterleave_init), (gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps), (gst_deinterleave_set_process_function), (gst_deinterleave_sink_setcaps), (__remove_channels), (__set_channels), (gst_deinterleave_getcaps), (gst_deinterleave_process), (gst_deinterleave_chain), (gst_deinterleave_sink_activate_push): * gst/interleave/deinterleave.h: Add support for all raw audio formats and provide better negotiation if the caps are changing. Don't allow changes of the channel positions and set the position of the corresponding channel on the src pad caps. General cleanup and smaller bugfixes. * tests/check/elements/deinterleave.c: (float_buffer_check_probe): Check the channel positions on the output buffer caps. 2008-05-16 17:50:20 +0000 Jan Schmidt Fix some compiler warnings. Original commit message from CVS: * ext/wavpack/gstwavpackstreamreader.c: * tests/examples/spectrum/demo-audiotest.c: * tests/examples/spectrum/demo-osssrc.c: Fix some compiler warnings. 2008-05-14 18:28:46 +0000 Wim Taymans gst/rtp/gstrtph264depay.c: Small comment added. Original commit message from CVS: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): Small comment added. * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_decode_nal), (gst_rtp_h264_pay_parse_sps_pps), (gst_rtp_h264_pay_payload_nal), (gst_rtp_h264_pay_handle_buffer): Debug string cleanups (remove trailing \n) Refactor and clean up the payloader a bit and make sure that we only put one NAL unit in an RTP packet even if the input buffer contains multiple NAL units. Add suport for AVC format input. 2008-05-14 17:58:50 +0000 Peter Kjellerstedt gst/rtp/gstrtph264pay.*: Make it possible to specify profile-level-id and sprop-parameter-sets using properties in ca... Original commit message from CVS: * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), (gst_rtp_h264_pay_get_property): * gst/rtp/gstrtph264pay.h: Make it possible to specify profile-level-id and sprop-parameter-sets using properties in case they are not available in-stream. 2008-05-14 14:19:47 +0000 Tim-Philipp Müller tests/check/Makefile.am: Add deinterleave unit test to VALGRIND_TO_FIX, since it causes weird invalid free errors in ... Original commit message from CVS: * tests/check/Makefile.am: Add deinterleave unit test to VALGRIND_TO_FIX, since it causes weird invalid free errors in valgrind/libc after _exit for some reason. * tests/check/elements/deinterleave.c: (pads_created), (set_channel_positions), (src_handoff_float32_8ch), (float_buffer_check_probe), (pad_added_setup_data_check_float32_8ch_cb), (make_fake_src_8chans_float32), (GST_START_TEST), (deinterleave_suite): Add some more deinterleave unit test bits I had locally. 2008-05-14 12:52:15 +0000 Stefan Kost docs/plugins/: Remove ladspa fro plugin-docs, its in gst-plugins-bad. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-ladspa.xml: Remove ladspa fro plugin-docs, its in gst-plugins-bad. 2008-05-14 07:32:44 +0000 Sebastian Dröge gst/interleave/: Split definitions into separate header files for better documentation generation. Original commit message from CVS: * gst/interleave/Makefile.am: * gst/interleave/deinterleave.h: * gst/interleave/interleave.h: * gst/interleave/plugin.h: Split definitions into separate header files for better documentation generation. * gst/interleave/deinterleave.c: (gst_deinterleave_base_init), (gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps), (gst_deinterleave_process): Don't use alloca, allow caps changes as long as the number of channels does not change, don't use g_warning, return NOT_NEGOTIATED as early as possible and some other cleanup. * gst/interleave/interleave.c: (gst_interleave_base_init), (gst_interleave_class_init): Do some random cleanup. * tests/check/Makefile.am: * tests/check/elements/deinterleave.c: (GST_START_TEST), (deinterleave_chain_func), (deinterleave_pad_added), (deinterleave_suite): Add unit tests for the deinterleave element. 2008-05-13 20:25:20 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Send an initial BYTE segment to inform downstream of later seeking, and to forego sync attempts. Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_start_file): Send an initial BYTE segment to inform downstream of later seeking, and to forego sync attempts. 2008-05-13 08:59:41 +0000 Wim Taymans gst/rtp/gstrtpg729depay.c: Fix wrong caps string. Original commit message from CVS: * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_setcaps): Fix wrong caps string. 2008-05-13 08:35:55 +0000 Olivier Crete gst/rtp/: Added G729 pay and depayloaders. Fixes #532409. Original commit message from CVS: Based on patch by: Olivier Crete * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_base_init), (gst_rtp_g729_depay_class_init), (gst_rtp_g729_depay_init), (gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process), (gst_rtp_g729_depay_plugin_init): * gst/rtp/gstrtpg729depay.h: * gst/rtp/gstrtpg729pay.c: (gst_rtpg729pay_base_init), (gst_rtpg729pay_class_init), (gst_rtpg729pay_init), (gst_rtpg729pay_setcaps), (gst_rtp_g729_pay_plugin_init): * gst/rtp/gstrtpg729pay.h: Added G729 pay and depayloaders. Fixes #532409. 2008-05-13 08:21:26 +0000 Wim Taymans ext/speex/gstspeexdec.c: Fix the calculation of the duration of the concealment packets. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_sink_event): Fix the calculation of the duration of the concealment packets. 2008-05-12 18:27:24 +0000 Olivier Crete gst/rtp/: Add DV pay and depayloaders. Fixes #532423. Original commit message from CVS: Based on patch by: Olivier Crete * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_base_init), (gst_rtp_dv_depay_class_init), (gst_rtp_dv_depay_init), (parse_encode), (gst_rtp_dv_depay_setcaps), (calculate_difblock_location), (gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset), (gst_rtp_dv_depay_change_state), (gst_rtp_dv_depay_plugin_init): * gst/rtp/gstrtpdvdepay.h: * gst/rtp/gstrtpdvpay.c: (gst_dv_pay_mode_get_type), (gst_rtp_dv_pay_base_init), (gst_rtp_dv_pay_class_init), (gst_rtp_dv_pay_init), (gst_dv_pay_set_property), (gst_dv_pay_get_property), (gst_rtp_dv_pay_setcaps), (gst_dv_pay_negotiate), (include_dif), (gst_rtp_dv_pay_handle_buffer), (gst_rtp_dv_pay_plugin_init): * gst/rtp/gstrtpdvpay.h: Add DV pay and depayloaders. Fixes #532423. 2008-05-12 16:35:39 +0000 Mark Nauwelaerts gst/matroska/matroska-demux.c: Convert subtitle palette info in VobSub private data from VobSub's (buggy) RGB to YUV. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_push_dvd_clut_change_event): Convert subtitle palette info in VobSub private data from VobSub's (buggy) RGB to YUV. 2008-05-12 15:26:01 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Do not leave fourcc stream header field empty upon reset. Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_pad_reset): Do not leave fourcc stream header field empty upon reset. Fixes #519301. 2008-05-11 14:43:26 +0000 Jan Schmidt Add goom2k1 into the docs. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-goom2k1.xml: * gst/goom/gstgoom.c: * gst/goom2k1/gstgoom.c: Add goom2k1 into the docs. 2008-05-08 16:58:02 +0000 Wouter Cloetens gst/rtsp/gstrtspsrc.c: Support Digest authentication. Fixes #532065. Original commit message from CVS: Based on patch by: Wouter Cloetens * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_skip_lws), (gst_rtspsrc_unskip_lws), (gst_rtspsrc_skip_commas), (gst_rtspsrc_skip_item), (gst_rtsp_decode_quoted_string), (gst_rtspsrc_parse_digest_challenge), (gst_rtspsrc_parse_auth_hdr), (gst_rtspsrc_setup_auth): Support Digest authentication. Fixes #532065. 2008-05-08 10:20:52 +0000 Stefan Kost gst/level/gstlevel.c: Also support 32bit (e.g. whe having it after 'mad'). Add more notes about whats needed for libo... Original commit message from CVS: * gst/level/gstlevel.c: Also support 32bit (e.g. whe having it after 'mad'). Add more notes about whats needed for liboil acceleration. Simplify docs a bit. 2008-05-08 08:15:34 +0000 Sjoerd Simons gst/matroska/matroska-mux.c: Update the track duration if the old one was invalid. Original commit message from CVS: Patch by: Sjoerd Simons * gst/matroska/matroska-mux.c: (gst_matroska_mux_collected): Update the track duration if the old one was invalid. Fixes bug #532117. 2008-05-07 16:36:04 +0000 Ole André Vadla Ravnås gst/rtp/gstrtph264pay.c (gst_rtp_h264_pay_parse_sps_pps): Use GST_STR_NULL when trying to print sps and pps strings t... Original commit message from CVS: * gst/rtp/gstrtph264pay.c (gst_rtp_h264_pay_parse_sps_pps): Use GST_STR_NULL when trying to print sps and pps strings that could be NULL, as this might crash on some platforms. 2008-05-07 15:33:52 +0000 Haakon Sporsheim sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_setup_ddraw): Do IDirectDrawClipper_SetHWnd() if the window I... Original commit message from CVS: patch by: Haakon Sporsheim * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_setup_ddraw): Do IDirectDrawClipper_SetHWnd() if the window ID has already been set after creating the clipper. 2008-05-07 15:28:06 +0000 Haakon Sporsheim sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame): Added checking of surface lost case after an uns... Original commit message from CVS: patch by: Haakon Sporsheim * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame): Added checking of surface lost case after an unsuccessful IDirectDrawSurface7_Lock() call. If surface is lost, return GST_FLOW_OK. 2008-05-07 15:19:47 +0000 Haakon Sporsheim * ChangeLog: * sys/directdraw/gstdirectdrawsink.c: sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, Original commit message from CVS: patch by: Haakon Sporsheim * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, WndProc, gst_directdraw_sink_window_thread): Improved Windows message loop and fixed window destruction issue. When the window which DirectDraw is rendering to is destroyed, the render/show_frame function will return GST_FLOW_ERROR. Partially fixes #520885. 2008-05-07 15:09:10 +0000 Haakon Sporsheim sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_set_caps): Fixed mid stream resolution change bug, the offscr... Original commit message from CVS: patch by: Haakon Sporsheim * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_set_caps): Fixed mid stream resolution change bug, the offscreen surface is now released when set_caps is called. Partially fixes #520885. 2008-05-07 14:56:22 +0000 Ole André Vadla Ravnås * ChangeLog: * sys/directdraw/gstdirectdrawsink.c: sys/directdraw/gstdirectdrawsink.c Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc): Make it so that gst_directdraw_sink_buffer_alloc uses the right width/height. Especially when looking through the pool of buffers, make sure that the width/height of caps is used instead of the already negotiated dimensions. For example if a buffer with different caps is requested, i.e. higher resolution, the caller would get a buffer with the old dimensions and thus corrupt the heap. 2008-05-07 14:43:39 +0000 Ole André Vadla Ravnås * sys/directdraw/gstdirectdrawsink.c: sys/directdraw/gstdirectdrawsink.c Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc): Clear the flags on recycled buffers from buffer_alloc. Partially fixes #520885. The right fix this time. 2008-05-07 14:39:45 +0000 Ole André Vadla Ravnås * sys/directdraw/gstdirectdrawsink.c: sys/directdraw/gstdirectdrawsink.c Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc): Reverting previous commit, it had it all mixed up, was for a different patch (major automation screw-up). Sorry! 2008-05-07 13:48:28 +0000 Ole André Vadla Ravnås * ChangeLog: * sys/directdraw/gstdirectdrawsink.c: sys/directdraw/gstdirectdrawsink.c Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc): Clear the flags on recycled buffers from buffer_alloc. Partially fixes #520885. 2008-05-07 11:22:51 +0000 Ole André Vadla Ravnås gst/rtp/gstrtpilbcpay.c: Added missing stdlib.h include for strtol(), and made include ordering and style consistent ... Original commit message from CVS: * gst/rtp/gstrtpilbcpay.c: Added missing stdlib.h include for strtol(), and made include ordering and style consistent with the corresponding depayloader. 2008-05-07 09:52:34 +0000 Ole André Vadla Ravnås gst/rtp/gstrtpilbcpay.c: Added missing stdlib.h include for strtol(), and made include ordering and style consistent ... Original commit message from CVS: * gst/rtp/gstrtpilbcpay.c: Added missing stdlib.h include for strtol(), and made include ordering and style consistent with the corresponding depayloader. 2008-05-07 08:03:51 +0000 Tim-Philipp Müller configure.ac: Error out if we don't have the required core/base versions. Original commit message from CVS: * configure.ac: Error out if we don't have the required core/base versions. 2008-05-06 09:33:46 +0000 Thijs Vermeir sys/osxvideo/cocoawindow.m: Fix compiler warnings on PPC64. Fixes bug #499318. Original commit message from CVS: Patch by: Thijs Vermeir * sys/osxvideo/cocoawindow.m: Fix compiler warnings on PPC64. Fixes bug #499318. 2008-05-05 11:19:13 +0000 Sjoerd Simons gst/rtsp/gstrtspsrc.c: Don't leak file descriptors on error. Fixes #531532. Original commit message from CVS: Patch by: Sjoerd Simons * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_open): Don't leak file descriptors on error. Fixes #531532. 2008-05-03 09:18:22 +0000 Sebastian Dröge ext/gconf/: When we can't create a fakesink/fakesrc complain instead of unreffing Original commit message from CVS: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), (gst_gconf_audio_src_change_state): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), (gst_gconf_video_sink_change_state): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), (gst_gconf_video_src_change_state): * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), (gst_switch_commit_new_kid), (gst_switch_sink_change_state): When we can't create a fakesink/fakesrc complain instead of unreffing NULL pointers and crashing later. See bug #530535. 2008-05-02 12:44:18 +0000 Wim Taymans gst/rtp/gstrtph263pdepay.c: Add some more debug info and guard against small payloads. Original commit message from CVS: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process): Add some more debug info and guard against small payloads. * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_process): Set duration on outgoing buffers because we can. 2008-05-02 12:39:03 +0000 Olivier Crete ext/speex/gstspeexenc.c: Add negotiation for the speex channels and rate. Fixes #465146. Original commit message from CVS: Patch by: Olivier Crete * ext/speex/gstspeexenc.c: (gst_speex_enc_sink_getcaps), (gst_speex_enc_init), (gst_speex_enc_chain): Add negotiation for the speex channels and rate. Fixes #465146. 2008-05-02 12:34:22 +0000 Olivier Crete gst/rtp/gstrtpspeexpay.c: Add negotiation for the speec channels and rate. See #465146. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_class_init), (gst_rtp_speex_pay_getcaps): Add negotiation for the speec channels and rate. See #465146. 2008-05-02 12:24:55 +0000 Olivier Crete gst/rtp/gstrtpilbcpay.c: Add negotiation for the ILBC mode. See #465146. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_class_init), (gst_rtpilbcpay_sink_setcaps), (gst_rtpilbcpay_sink_getcaps): Add negotiation for the ILBC mode. See #465146. 2008-05-02 11:32:31 +0000 Stefan Kost ext/soup/gstsouphttpsrc.c: Include stdlib to fix the build. Use g_free instead of free, libsoup uses glib. Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: Include stdlib to fix the build. Use g_free instead of free, libsoup uses glib. 2008-05-02 09:09:58 +0000 j^ gst/qtdemux/qtdemux.c: Add more mpeg2 variants. Fixes #530886. Original commit message from CVS: Patch by: j^ * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add more mpeg2 variants. Fixes #530886. 2008-05-01 10:52:11 +0000 Youness Alaoui gst/udp/gstudpsrc.c: Don't error out if we get an ICMP destination-unreachable message when trying to read packets on... Original commit message from CVS: Patch by: Youness Alaoui * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Don't error out if we get an ICMP destination-unreachable message when trying to read packets on win32 (#529454). 2008-04-30 12:18:41 +0000 Tim-Philipp Müller Use new error code for encrypted streams (which requires core CVS). Original commit message from CVS: * configure.ac: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Use new error code for encrypted streams (which requires core CVS). 2008-04-30 12:10:02 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix swapped pad template names, spotted by Thiago Sousa Santos. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_videosrc_template), (gst_qtdemux_audiosrc_template): Fix swapped pad template names, spotted by Thiago Sousa Santos. 2008-04-30 09:48:11 +0000 Wim Taymans ext/speex/gstspeexdec.c: Produce concealment data when time progresses in a segment update. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_sink_event), (speex_dec_chain_parse_data): Produce concealment data when time progresses in a segment update. 2008-04-29 14:11:45 +0000 Wim Taymans ext/speex/gstspeexdec.c: Try to preserve input timestamps when we can. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data), (speex_dec_chain): Try to preserve input timestamps when we can. Do beginnings of error concealment. 2008-04-28 22:38:11 +0000 Michael Smith gst/debug/gstnavigationtest.c: MSVC doesn't provide rint(), define an adequate replacement locally as elsewhere. Original commit message from CVS: * gst/debug/gstnavigationtest.c: MSVC doesn't provide rint(), define an adequate replacement locally as elsewhere. 2008-04-28 11:16:32 +0000 Julien Moutte gst/debug/rndbuffersize.c: Fix printf format to pacify Mac OSX's gcc. Original commit message from CVS: 2008-04-28 Julien Moutte * gst/debug/rndbuffersize.c: (gst_rnd_buffer_size_loop): Fix printf format to pacify Mac OSX's gcc. 2008-04-25 19:34:31 +0000 Tim-Philipp Müller gst/debug/rndbuffersize.c: Bring rndbuffersize element into a state that doesn't require us to move it to -bad immedi... Original commit message from CVS: * gst/debug/rndbuffersize.c: (DEFAULT_SEED), (DEFAULT_MIN), (DEFAULT_MAX), (src_template), (sink_template), (gst_rnd_buffer_size_base_init), (gst_rnd_buffer_size_class_init), (gst_rnd_buffer_size_init), (gst_rnd_buffer_size_activate), (gst_rnd_buffer_size_loop), (gst_rnd_buffer_size_plugin_init): Bring rndbuffersize element into a state that doesn't require us to move it to -bad immediately. For one, fix up default min/max values so that the element actuall works using the default values. Also, don't ignore flow return values and do some kind of minimal eos logic. Allow min=max to pull fixed-sized buffers. Bunch of other gratuitious clean-ups. 2008-04-25 19:24:00 +0000 Tim-Philipp Müller docs/plugins/: Add docs for gdkpixbufsink; update docs to CVS version. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Add docs for gdkpixbufsink; update docs to CVS version. 2008-04-25 18:45:33 +0000 Wim Taymans tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: Remove test sync-offset by default. Original commit message from CVS: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: Remove test sync-offset by default. 2008-04-25 13:31:48 +0000 Tim-Philipp Müller gst/: Use GLib versions of htonl, htons, ntohl and ntohs in order to avoid problems on win32 (#529707). Original commit message from CVS: * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_chain): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add_internal): * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Use GLib versions of htonl, htons, ntohl and ntohs in order to avoid problems on win32 (#529707). 2008-04-25 12:52:44 +0000 Jesús Corrius gst/goom/: Fix build with mingw32: use rand() instead of random() and replace bzero() with memset(). Fixes #529692. Original commit message from CVS: Patch by: Jesús Corrius * gst/goom/filters.c: (zoomVector): * gst/goom/goom_core.c: (init_buffers): Fix build with mingw32: use rand() instead of random() and replace bzero() with memset(). Fixes #529692. 2008-04-25 07:56:12 +0000 Wim Taymans gst/avi/gstavidemux.c: Fix typo in comments. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_combine_flows): Fix typo in comments. * tests/examples/rtp/client-H263p-PCMA.sdp: * tests/examples/rtp/client-H263p-PCMA.sh: * tests/examples/rtp/client-H264-PCMA.sdp: * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-H264.sdp: * tests/examples/rtp/client-H264.sh: * tests/examples/rtp/client-PCMA.sdp: * tests/examples/rtp/client-PCMA.sh: * tests/examples/rtp/server-alsasrc-PCMA.sh: * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: Add some more docs and fix examples. 2008-04-24 22:04:57 +0000 Sebastian Dröge tests/check/elements/multifile.c: Include stdlib.h and unistd.h for mkdtemp. Some platforms have it declared in the f... Original commit message from CVS: * tests/check/elements/multifile.c: Include stdlib.h and unistd.h for mkdtemp. Some platforms have it declared in the former, some have it declared in the latter. 2008-04-24 22:01:52 +0000 Sebastian Dröge Stop using deprecated GLib functions. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_set_property): * gst/debug/tests.c: (md5_get_value): * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps): Stop using deprecated GLib functions. 2008-04-24 21:17:42 +0000 Jan Schmidt configure.ac: Back to development -> 0.10.8.1 Original commit message from CVS: * configure.ac: Back to development -> 0.10.8.1 === release 0.10.8 === === release 0.10.8 === 2008-04-23 23:40:48 +0000 Jan Schmidt * NEWS: * RELEASE: Release 0.10.8 a little harder (edited the release notes) Original commit message from CVS: Release 0.10.8 a little harder (edited the release notes) 2008-04-23 23:26:24 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst-plugins-good.doap: * po/LINGUAS: * win32/common/config.h: Release 0.10.8 Original commit message from CVS: Release 0.10.8 2008-04-23 23:18:44 +0000 Jan Schmidt * common: * po/af.po: * po/az.po: * po/bg.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/fr.po: * po/hu.po: * po/it.po: * po/ja.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/ru.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files Original commit message from CVS: Update .po files 2008-04-22 00:29:00 +0000 Jan Schmidt configure.ac: 0.10.7.4 pre-release Original commit message from CVS: * configure.ac: 0.10.7.4 pre-release 2008-04-22 00:18:52 +0000 Jan Schmidt gst/goom/: Free a bunch of stuff, and initialise things to fix leaks and valgrind warnings in the testsuite. Original commit message from CVS: * gst/goom/config_param.c: (goom_plugin_parameters_free): * gst/goom/convolve_fx.c: (convolve_init), (convolve_free): * gst/goom/filters.c: (zoomFilterVisualFXWrapper_free): * gst/goom/flying_stars_fx.c: (fs_free): * gst/goom/goom_config_param.h: * gst/goom/goom_core.c: (goom_init), (goom_close): * gst/goom/goom_plugin_info.h: * gst/goom/gstgoom.c: (gst_goom_finalize): * gst/goom/lines.c: (goom_lines_free): * gst/goom/plugin_info.c: (plugin_info_init), (plugin_info_free): * gst/goom/surf3d.c: (grid3d_free): * gst/goom/surf3d.h: * gst/goom/tentacle3d.c: (tentacle_free): Free a bunch of stuff, and initialise things to fix leaks and valgrind warnings in the testsuite. Fixes: #529268 2008-04-21 21:54:11 +0000 Sebastian Dröge tests/check/elements/rganalysis.c: Don't leak a tag list. Fixes bug #529285. Original commit message from CVS: * tests/check/elements/rganalysis.c: (GST_START_TEST): Don't leak a tag list. Fixes bug #529285. 2008-04-21 08:21:14 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Ref caps as the return value for the request_pt_map signal. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (request_pt_map), (gst_rtspsrc_configure_caps): Ref caps as the return value for the request_pt_map signal. Remove some caps weirdness when configuring a stream. See #528245. 2008-04-18 18:47:43 +0000 Tim-Philipp Müller tests/icles/gdkpixbufsink-test.c: Add cast to placate gcc 4.1.2. Original commit message from CVS: * tests/icles/gdkpixbufsink-test.c: Add cast to placate gcc 4.1.2. 2008-04-17 23:00:29 +0000 Jan Schmidt configure.ac: 0.10.7.3 pre-release Original commit message from CVS: * configure.ac: 0.10.7.3 pre-release 2008-04-17 22:32:16 +0000 Jan Schmidt tests/check/Makefile.am: Disable some more elements in the state test. Original commit message from CVS: * tests/check/Makefile.am: Disable some more elements in the state test. Add a define so the soup test can find the test files it needs at runtime. * tests/check/elements/souphttpsrc.c: (run_server): Add a define so the soup test can find the test files it needs at runtime. 2008-04-17 18:08:53 +0000 Jan Schmidt gst/goom/convolve_fx.c: Don't ever draw the GOOM logo. Original commit message from CVS: * gst/goom/convolve_fx.c: (convolve_apply): Don't ever draw the GOOM logo. Fixes: #528615 2008-04-17 10:24:32 +0000 Edward Hervey ext/: gst_atomic_int_set ==> g_atomic_int_set Original commit message from CVS: * ext/cdio/gstcdiocddasrc.c: * ext/dv/gstdvdemux.c: gst_atomic_int_set ==> g_atomic_int_set 2008-04-16 10:31:17 +0000 Tim-Philipp Müller Strip out the config/script parsing stuff, we don't need it. Original commit message from CVS: * configure.ac: * gst/goom/Makefile.am: * gst/goom/convolve_fx.c: * gst/goom/default_scripts.h: * gst/goom/goom.h: * gst/goom/goom_core.c: (choose_a_goom_line): * gst/goom/goom_plugin_info.h: * gst/goom/goomsl.c: * gst/goom/goomsl.h: * gst/goom/goomsl_hash.c: * gst/goom/goomsl_hash.h: * gst/goom/goomsl_heap.c: * gst/goom/goomsl_heap.h: * gst/goom/goomsl_private.h: * gst/goom/plugin_info.c: Strip out the config/script parsing stuff, we don't need it. Fixes #527999. 2008-04-15 16:58:36 +0000 Tim-Philipp Müller gst/goom/plugin_info.c: Disable altivec optimisations for 32-bit PPC as well to make things build properly on all PPC... Original commit message from CVS: * gst/goom/plugin_info.c: (setOptimizedMethods): Disable altivec optimisations for 32-bit PPC as well to make things build properly on all PPC systems. Fixes #528143 2008-04-14 20:01:44 +0000 Tim-Philipp Müller gst-plugins-good.spec.in: Update for souphttpsrc plugin which has moved to -good. Original commit message from CVS: * gst-plugins-good.spec.in: Update for souphttpsrc plugin which has moved to -good. 2008-04-14 13:38:32 +0000 Mark Nauwelaerts gst/matroska/matroska-demux.c: Fix open-ended seeks in matroskademux Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_seek_event): Fix open-ended seeks in matroskademux Patch by: Mark Nauwelaerts Fixes: #526557 2008-04-13 23:13:32 +0000 Jan Schmidt tests/check/Makefile.am: Add soup test certificates to the dist. Original commit message from CVS: * tests/check/Makefile.am: Add soup test certificates to the dist. 2008-04-13 17:43:52 +0000 Jan Schmidt ext/Makefile.am: Remove LADSPA reference I missed. Original commit message from CVS: * ext/Makefile.am: Remove LADSPA reference I missed. 2008-04-13 13:06:39 +0000 Sebastian Dröge ext/soup/gstsouphttpsrc.c: Give souphttpsrc GST_RANK_PRIMARY to make it the default HTTP source over gnome-vfs and ev... Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: (plugin_init): Give souphttpsrc GST_RANK_PRIMARY to make it the default HTTP source over gnome-vfs and everything else. Fixes bug #527848. 2008-04-12 23:47:23 +0000 Jan Schmidt Remove LADSPA plugin. Fixes: #515978 Original commit message from CVS: * configure.ac: * ext/Makefile.am: Remove LADSPA plugin. Fixes: #515978 2008-04-12 23:30:54 +0000 Jan Schmidt Move soup plugin from -bad (Fixes: #523124) Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-soup.xml: * ext/Makefile.am: * tests/check/Makefile.am: Move soup plugin from -bad (Fixes: #523124) 2008-04-11 11:08:35 +0000 Jan Schmidt * ChangeLog: Fix the Changelog - actually speex <= 1.1.12 are vulnerable. Original commit message from CVS: Fix the Changelog - actually speex <= 1.1.12 are vulnerable. 2008-04-11 10:32:20 +0000 Jan Schmidt ext/speex/gstspeexdec.c: Fix bounds checking of mode in Speex header, which may produce negative numbers in speex < 1... Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_header): Fix bounds checking of mode in Speex header, which may produce negative numbers in speex < 1.1.12 2008-04-10 07:11:51 +0000 Sebastian Dröge tests/check/elements/souphttpsrc.c: Increase the timeout for the internet tests to 250 seconds and check for NULL cap... Original commit message from CVS: * tests/check/elements/souphttpsrc.c: (got_buffer), (souphttpsrc_suite): Increase the timeout for the internet tests to 250 seconds and check for NULL caps instead of just crashing. The real fix would be to implement an shoutcast server for the unit test instead of relying on a working internet connection. Fixes bug #521749. 2008-04-09 16:11:40 +0000 Tim-Philipp Müller gst/goom/: Remove a bunch of font/text related code that we don't need. Original commit message from CVS: * gst/goom/Makefile.am: * gst/goom/gfontlib.c: * gst/goom/gfontlib.h: * gst/goom/gfontrle.c: * gst/goom/gfontrle.h: * gst/goom/goom.h: * gst/goom/goom_core.c: (goom_update): * gst/goom/goom_plugin_info.h: * gst/goom/gstgoom.c: (gst_goom_chain): * gst/goom/plugin_info.c: Remove a bunch of font/text related code that we don't need. 2008-04-09 14:02:37 +0000 Tim-Philipp Müller gst/goom/: Change license of these files to LGPL, as permitted by the author, Guillaume Borios. See #515073. Original commit message from CVS: * gst/goom/ppc_drawings.s: * gst/goom/ppc_zoom_ultimate.s: Change license of these files to LGPL, as permitted by the author, Guillaume Borios. See #515073. 2008-04-09 13:31:22 +0000 Stefan Kost gst/goom/: As hinted in Bug #518213, revert one change and fix warnings properly. Original commit message from CVS: * gst/goom/convolve_fx.c: * gst/goom/motif_goom1.h: * gst/goom/motif_goom2.h: As hinted in Bug #518213, revert one change and fix warnings properly. This fixes both #518213 and #520073 for me. 2008-04-09 12:02:55 +0000 Jan Schmidt gst/matroska/: Fix the Forte build by making function declaration signatures match the implementations. Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_seek): * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_loop): Fix the Forte build by making function declaration signatures match the implementations. 2008-04-08 19:49:34 +0000 Tim-Philipp Müller sys/oss/: More logging when probing (see #518474), some comments in _reset(). Original commit message from CVS: * sys/oss/gstosshelper.c: (gst_oss_helper_rate_check_rate): * sys/oss/gstosssink.c: (gst_oss_sink_reset): * sys/oss/gstosssrc.c: (gst_oss_src_reset): More logging when probing (see #518474), some comments in _reset(). 2008-04-07 17:18:48 +0000 Julien Moutte gst/rtp/gstrtph264pay.c: Fix build because of a bad argument number. Original commit message from CVS: 2008-04-07 Julien Moutte * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps): Fix build because of a bad argument number. 2008-04-06 18:28:09 +0000 Tim-Philipp Müller tests/icles/: Interactive test app for gdkpixbufsink. Original commit message from CVS: * tests/icles/.cvsignore: * tests/icles/Makefile.am: * tests/icles/gdkpixbufsink-test.c: Interactive test app for gdkpixbufsink. 2008-04-06 09:01:42 +0000 Sjoerd Simons ext/soup/gstsouphttpsrc.c: Only ignore actual redirects not all responses when in state Original commit message from CVS: Patch by: Sjoerd Simons * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_response_cb): Only ignore actual redirects not all responses when in state GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING. Fixes bug #526337. 2008-04-06 08:57:59 +0000 Damien Lespiau configure.ac: Actually build dlls when cross-compiling with mingw32. Original commit message from CVS: Patch by: Damien Lespiau * configure.ac: Actually build dlls when cross-compiling with mingw32. Fixes bug #526247. 2008-04-05 12:00:46 +0000 Tim-Philipp Müller ext/hal/hal.c: Don't munge device string to 'default:x' for capture devices. Original commit message from CVS: * ext/hal/hal.c: (gst_hal_get_alsa_element): Don't munge device string to 'default:x' for capture devices. Fixes #525833. 2008-04-04 19:00:19 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Always use GSlice as we actually depend on GLib 2.12 already. Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_index_entry_free): Always use GSlice as we actually depend on GLib 2.12 already. 2008-04-04 11:26:40 +0000 Tim-Philipp Müller configure.ac: Require core/base 0.10.18 for ARGB caps parsing fixes in libgstvideo. Original commit message from CVS: * configure.ac: Require core/base 0.10.18 for ARGB caps parsing fixes in libgstvideo. Also bump the GLib requirement to the current de-facto requirement (ie. 2.12). 2008-04-04 10:32:21 +0000 Wim Taymans gst/rtp/gstrtph264pay.*: Parse codec_data for future AVC compatibility. Original commit message from CVS: * gst/rtp/gstrtph264pay.c: (encode_base64), (gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_handle_buffer): * gst/rtp/gstrtph264pay.h: Parse codec_data for future AVC compatibility. Fail when we encounter AVC data for now. 2008-04-04 09:50:10 +0000 Tim-Philipp Müller gst/spectrum/gstspectrum.c: Rename property enums and default defines for the properties to match the property names ... Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_set_property), (gst_spectrum_get_property), (gst_spectrum_message_new): Rename property enums and default defines for the properties to match the property names and rephrase property descriptions to make them a bit clearer (hopefully). See #518188. 2008-04-03 22:59:44 +0000 Tim-Philipp Müller tests/check/: Add unit test for gdkpixbufsink element. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/gdkpixbufsink.c: Add unit test for gdkpixbufsink element. 2008-04-03 22:50:48 +0000 Tim-Philipp Müller ext/gdk_pixbuf/: Add gdkpixbufsink element for easy snapshotting (#525946). Original commit message from CVS: * ext/gdk_pixbuf/Makefile.am: * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): * ext/gdk_pixbuf/gstgdkpixbufsink.c: (gst_gdk_pixbuf_sink_base_init), (gst_gdk_pixbuf_sink_class_init), (gst_gdk_pixbuf_sink_init), (gst_gdk_pixbuf_sink_start), (gst_gdk_pixbuf_sink_stop), (gst_gdk_pixbuf_sink_set_caps), (gst_gdk_pixbuf_sink_pixbuf_destroy_notify), (gst_gdk_pixbuf_sink_get_pixbuf_from_buffer), (gst_gdk_pixbuf_sink_handle_buffer), (gst_gdk_pixbuf_sink_preroll), (gst_gdk_pixbuf_sink_render), (gst_gdk_pixbuf_sink_set_property), (gst_gdk_pixbuf_sink_get_property): * ext/gdk_pixbuf/gstgdkpixbufsink.h: Add gdkpixbufsink element for easy snapshotting (#525946). 2008-04-03 20:25:34 +0000 Sebastian Dröge tests/check/pipelines/wavpack.c: Bump timeout from 3 to 60 seconds. Original commit message from CVS: * tests/check/pipelines/wavpack.c: (wavpack_suite): Bump timeout from 3 to 60 seconds. 2008-04-03 20:21:15 +0000 Sebastian Dröge tests/check/pipelines/.cvignore: Remove useless file. Original commit message from CVS: * tests/check/pipelines/.cvignore: Remove useless file. * tests/check/pipelines/.cvsignore: Add new test to .cvsignore. 2008-04-03 20:05:31 +0000 Sebastian Dröge tests/check/: Add unit test that encodes and decodes some data, checks that it is still the same and that all timesta... Original commit message from CVS: * tests/check/Makefile.am: * tests/check/pipelines/wavpack.c: (bus_handler), (identity_handoff), (fakesink_handoff), (GST_START_TEST), (wavpack_suite), (main): Add unit test that encodes and decodes some data, checks that it is still the same and that all timestamps/offsets are perfect. 2008-04-03 18:28:28 +0000 Sebastian Dröge ext/wavpack/: Use GSlice for allocating index entries and use gst_element_class_set_details_simple(). Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_index_entry_new), (gst_wavpack_parse_index_entry_free), (gst_wavpack_parse_base_init), (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset): Use GSlice for allocating index entries and use gst_element_class_set_details_simple(). 2008-04-02 22:37:29 +0000 Brian Cameron sys/sunaudio/: Fix up copyrights (#525860). Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudio.c: * sys/sunaudio/gstsunaudiomixer.c: * sys/sunaudio/gstsunaudiomixer.h: * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiomixerctrl.h: * sys/sunaudio/gstsunaudiomixertrack.c: * sys/sunaudio/gstsunaudiomixertrack.h: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosink.h: * sys/sunaudio/gstsunaudiosrc.c: * sys/sunaudio/gstsunaudiosrc.h: Fix up copyrights (#525860). 2008-04-02 16:10:33 +0000 Christian Schaller * gst-plugins-good.spec.in: add new goom plugin to spec file Original commit message from CVS: add new goom plugin to spec file 2008-04-02 15:42:27 +0000 Tim-Philipp Müller gst/goom/goomsl.c: Check return value of fread() to avoid compiler warnings. Original commit message from CVS: * gst/goom/goomsl.c: (gsl_read_file): Check return value of fread() to avoid compiler warnings. 2008-04-01 11:00:43 +0000 mersad gst/law/: Make negotiation a bit modern. Original commit message from CVS: Based on patch by: mersad * gst/law/alaw-decode.c: (gst_alaw_dec_sink_setcaps), (gst_alaw_dec_chain), (gst_alaw_dec_change_state): * gst/law/alaw-decode.h: * gst/law/alaw-encode.c: (gst_alaw_enc_chain): * gst/law/mulaw-decode.c: (mulawdec_sink_setcaps), (gst_mulawdec_chain), (gst_mulawdec_change_state): * gst/law/mulaw-decode.h: * gst/law/mulaw-encode.c: (gst_mulawenc_chain): Make negotiation a bit modern. Use pad_alloc. Fixes #525359. 2008-03-31 22:06:14 +0000 David Schleef gst/goom/xmmx.c: Fix constraints on asm code so that it compiles consistently. Fixes #522278. Original commit message from CVS: * gst/goom/xmmx.c: Fix constraints on asm code so that it compiles consistently. Fixes #522278. 2008-03-27 09:36:58 +0000 Brian Cameron sys/sunaudio/: Fix up the mixer tracks to use a volume range of 0-255, which is what the sun audio API uses. This sim... Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_get_volume), (gst_sunaudiomixer_ctrl_set_volume): * sys/sunaudio/gstsunaudiomixertrack.c: (gst_sunaudiomixer_track_new): Fix up the mixer tracks to use a volume range of 0-255, which is what the sun audio API uses. This simplifies the code and avoids rounding errors. Fixes #524593. 2008-03-26 15:10:08 +0000 Edgard Lima * ChangeLog: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: Add device-fd property to make it possible to apps to call ioctl's. Original commit message from CVS: Add device-fd property to make it possible to apps to call ioctl's. 2008-03-25 16:44:20 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Unbreak streaming mode again. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (next_entry_size): Unbreak streaming mode again. 2008-03-25 12:39:22 +0000 Tim-Philipp Müller sys/v4l2/v4l2src_calls.c: Remove superfluous DEBUG macro. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): Remove superfluous DEBUG macro. 2008-03-25 12:33:09 +0000 William M. Brack sys/v4l2/v4l2src_calls.c: Check whether the device supports setting the framerate before trying to set it and then po... Original commit message from CVS: Based on patch by: William M. Brack * sys/v4l2/v4l2src_calls.c: (fractions_are_equal), (gst_v4l2src_set_capture): Check whether the device supports setting the framerate before trying to set it and then posting a warning or error if it doesn't work (#516649, #520092). Also compare fractions more correctly. 2008-03-24 12:32:59 +0000 Rene Stadler Make rganalysis and rglimiter elements GAP-flag aware. Original commit message from CVS: * gst/replaygain/gstrganalysis.c (gst_rg_analysis_init), (gst_rg_analysis_transform_ip): * gst/replaygain/gstrglimiter.c (gst_rg_limiter_init), (gst_rg_limiter_transform_ip): Make rganalysis and rglimiter elements GAP-flag aware. * tests/check/elements/rganalysis.c: (test_gap_buffers), (rganalysis_suite): * tests/check/elements/rglimiter.c (test_gap), (rglimiter_suite): Add tests to verify gap-awareness. 2008-03-23 13:31:15 +0000 Tim-Philipp Müller gst/goom/Makefile.am: Remove ppc assembler optimisations from the build until they actually build (they also seem to ... Original commit message from CVS: * gst/goom/Makefile.am: Remove ppc assembler optimisations from the build until they actually build (they also seem to have GPL headers). 2008-03-23 12:48:44 +0000 Tim-Philipp Müller m4/Makefile.am: Better not dist files that don't exist any longer (lrint*m4). Original commit message from CVS: * m4/Makefile.am: Better not dist files that don't exist any longer (lrint*m4). 2008-03-22 19:26:04 +0000 Sebastian Dröge ext/soup/gstsouphttpsrc.c: Don't autoplug souphttpsrc for dav/davs. This is better handled by Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_headers_cb), (gst_soup_http_src_chunk_allocator), (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_uri_get_protocols): Don't autoplug souphttpsrc for dav/davs. This is better handled by GIO and GnomeVFS as they provide authentication. Don't leak the icy caps if we already set them and get a new icy-metaint header. Try harder to set the icy caps on the output buffer to have correct caps for the first buffer already. * tests/check/elements/souphttpsrc.c: (got_buffer), (GST_START_TEST): Check that we get a buffer with application/x-icy caps if iradio-mode is enabled and we have an icecast URL. 2008-03-22 18:18:46 +0000 Sebastian Dröge ext/soup/gstsouphttpsrc.c: Actually set the icy caps on our src pad if we have icecast data. Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_chunk_allocator): Actually set the icy caps on our src pad if we have icecast data. Fixes bug #523854. 2008-03-21 13:36:27 +0000 Sebastian Dröge Remove lrint/lrintf checks. We don't use it anywhere. Original commit message from CVS: * configure.ac: * m4/lrint.m4: * m4/lrintf.m4: Remove lrint/lrintf checks. We don't use it anywhere. 2008-03-19 19:56:59 +0000 Stefan Kost gst/freeze/: Add example to source code documentation blob and remove the 3 line Original commit message from CVS: * gst/freeze/FAQ: * gst/freeze/Makefile.am: * gst/freeze/gstfreeze.c: Add example to source code documentation blob and remove the 3 line FAQ. * gst/interleave/interleave.c: Add a source code documentation blob. 2008-03-18 15:03:06 +0000 Andy Wingo * ChangeLog: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) Original commit message from CVS: 2008-03-18 Andy Wingo * sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) (gst_osx_video_sink_osxwindow_new): Actually set a lock on the task, whoopdee. (cocoa_event_loop): Pacify the taymans by upping the usleepage to 2 ms. 2008-03-18 11:50:08 +0000 Andy Wingo sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) Original commit message from CVS: 2008-03-18 Andy Wingo * sys/osxvideo/osxvideosink.m (gst_osx_video_sink_osxwindow_destroy) (gst_osx_video_sink_osxwindow_new, cocoa_event_loop): * sys/osxvideo/osxvideosink.h (struct _GstOSXVideoSink): If we need to run an event loop, do so in a task instead of assuming that there will be a GMainLoop. Fixes #523134. 2008-03-17 19:50:58 +0000 William M. Brack sys/v4l2/v4l2src_calls.c: Make sure the probed frame sizes are reversed in the resulting caps also when using V4L2_FR... Original commit message from CVS: Patch by: William M. Brack * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format_and_size), (gst_v4l2src_probe_caps_for_format): Make sure the probed frame sizes are reversed in the resulting caps also when using V4L2_FRMSIZE_STEPWISE (so they end up highest resolution first); also remove unused variable. (Partly fixes #520092) 2008-03-17 15:56:01 +0000 Ole André Vadla Ravnås gst/rtsp/gstrtspsrc.c: Call WSAStartup() and WSACleanup before using the Winsock API. Original commit message from CVS: Patch by: Ole André Vadla Ravnås * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize): Call WSAStartup() and WSACleanup before using the Winsock API. See #520808. 2008-03-16 15:01:07 +0000 Stefan Kost gst/avi/gstavidemux.c: Erm, the buffer-size is just guint, no need for the special format specifier. Original commit message from CVS: * gst/avi/gstavidemux.c: Erm, the buffer-size is just guint, no need for the special format specifier. 2008-03-16 14:34:45 +0000 Tim-Philipp Müller gst/goom/: Small fixes to build more on PPC: ifdef out code that uses unknown define; add newline at end of header fi... Original commit message from CVS: * gst/goom/plugin_info.c: * gst/goom/ppc_zoom_ultimate.h: Small fixes to build more on PPC: ifdef out code that uses unknown define; add newline at end of header file to avoid compiler warning. Assembler code still doesn't build though. 2008-03-16 14:04:16 +0000 Stefan Kost gst/avi/gstavidemux.c: Fix up my last commit. Use G_GUINT32_FORMAT for the guint32 debug log. Original commit message from CVS: * gst/avi/gstavidemux.c: Fix up my last commit. Use G_GUINT32_FORMAT for the guint32 debug log. Also downgrade a GST_WARNING to GST_DEBUG and add a comment. 2008-03-15 22:10:38 +0000 Stefan Kost gst/avi/gstavidemux.c: Chunksize is uint32. Fix format specifier. Original commit message from CVS: * gst/avi/gstavidemux.c: Chunksize is uint32. Fix format specifier. 2008-03-14 15:53:01 +0000 Christian Schaller * ChangeLog: * gst/rtsp/COPYING.MIT: fix license file, remove extra line copied over by mistake Original commit message from CVS: fix license file, remove extra line copied over by mistake 2008-03-13 14:30:45 +0000 Sebastian Dröge gst/audiofx/audiofx.c: Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values. Original commit message from CVS: * gst/audiofx/audiofx.c: Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values. 2008-03-13 09:45:09 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.*: Try to resume on server disconnect. Fixes bug #522134. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_init), (gst_soup_http_src_finished_cb), (gst_soup_http_src_response_cb), (gst_soup_http_src_build_message), (gst_soup_http_src_create): * ext/soup/gstsouphttpsrc.h: Try to resume on server disconnect. Fixes bug #522134. 2008-03-11 23:12:04 +0000 Mark Nauwelaerts sys/oss/gstosssrc.*: Cache probed caps, so _get_caps() during recording doesn't cause ioctl calls which may disrupt t... Original commit message from CVS: Patch by: Mark Nauwelaerts * sys/oss/gstosssrc.c: (gst_oss_src_init), (gst_oss_src_getcaps), (gst_oss_src_close): * sys/oss/gstosssrc.h: Cache probed caps, so _get_caps() during recording doesn't cause ioctl calls which may disrupt the recording (fixes #521875). 2008-03-11 16:23:04 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Make sure we always send a DISCONT after a seek by setting the sample index to an undefined va... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), (gst_qtdemux_activate_segment), (gst_qtdemux_prepare_current_sample), (gst_qtdemux_loop_state_movie), (qtdemux_parse_trak): Make sure we always send a DISCONT after a seek by setting the sample index to an undefined value after a seek. 2008-03-11 15:18:43 +0000 Tim-Philipp Müller gst/avi/gstavisubtitle.h: Fix up IS_FOO macros, which makes gtk-doc much happier. Original commit message from CVS: * gst/avi/gstavisubtitle.h: (GST_IS_AVI_SUBTITLE), (GST_IS_AVI_SUBTITLE_CLASS): Fix up IS_FOO macros, which makes gtk-doc much happier. 2008-03-08 19:29:20 +0000 Tim-Philipp Müller tests/icles/Makefile.am: Move the -lgstfoo where it belongs. Original commit message from CVS: * tests/icles/Makefile.am: Move the -lgstfoo where it belongs. 2008-03-08 19:14:22 +0000 Tim-Philipp Müller * ChangeLog: ChangeLog surgery Original commit message from CVS: ChangeLog surgery 2008-03-08 04:40:32 +0000 Sebastian Dröge gst/matroska/ebml-ids.h: Add ID for EBML CRC32 elements. Original commit message from CVS: * gst/matroska/ebml-ids.h: Add ID for EBML CRC32 elements. * gst/matroska/Makefile.am: * gst/matroska/ebml-read.c: (gst_ebml_finalize), (gst_ebml_read_class_init), (gst_ebml_read_peek_bytes), (gst_ebml_read_get_length), (_ext2dbl), (gst_ebml_read_float), (gst_ebml_read_header): Support reading 80bit floats, add finalize method to clean up in any case, support reading length/id elements with any length as long as it's smaller than our supported maximum, don't leak buffers if reading as much data as we wanted failed and some smaller cleanup. 2008-03-08 04:21:34 +0000 Olivier Crete gst/rtp/gstrtph263pdepay.c: Check that a buffer is large enough before reading from it. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process): Check that a buffer is large enough before reading from it. Fixes bug #521102. 2008-03-07 15:54:09 +0000 Wim Taymans gst/udp/gstudpsrc.c: Fix compilation after removing the GstPollMode from the constructor. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Fix compilation after removing the GstPollMode from the constructor. 2008-03-07 13:08:42 +0000 Sebastian Dröge Check for sinh(), cosh() and asinh() and define our own implementations if they're not available. Fixes bug #520880. Original commit message from CVS: * configure.ac: * gst/audiofx/Makefile.am: * gst/audiofx/audiochebband.c: * gst/audiofx/audiocheblimit.c: * gst/audiofx/math_compat.h: Check for sinh(), cosh() and asinh() and define our own implementations if they're not available. Fixes bug #520880. 2008-03-07 12:40:18 +0000 Olivier Crete ext/speex/gstspeexenc.c: Unref the buffers only once when handling not-negotiated errors. Original commit message from CVS: Patch by: Olivier Crete * ext/speex/gstspeexenc.c: (gst_speex_enc_chain): Unref the buffers only once when handling not-negotiated errors. Fixes bug #520764. 2008-03-07 10:01:40 +0000 Ole André Vadla Ravnås gst/udp/gstudpsrc.c: Properly balance WSA_Cleanup with WSA_Startup. Original commit message from CVS: Patch by: Ole André Vadla Ravnås * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), (gst_udpsrc_start), (gst_udpsrc_stop): Properly balance WSA_Cleanup with WSA_Startup. Also make the poll controllable on windows. Fixes #520888. 2008-03-06 19:47:48 +0000 Wim Taymans gst/matroska/: Handle return values from pull_range in a more granular way to properly shut down on seeks. Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), (gst_ebml_read_pull_bytes), (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_peek_id), (gst_ebml_read_skip), (gst_ebml_read_buffer), (gst_ebml_read_bytes), (gst_ebml_read_uint), (gst_ebml_read_sint), (gst_ebml_read_float), (gst_ebml_read_ascii), (gst_ebml_read_utf8), (gst_ebml_read_date), (gst_ebml_read_master), (gst_ebml_read_binary), (gst_ebml_read_header): * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_combine_flows), (gst_matroska_demux_reset), (gst_matroska_demux_read_track_encodings), (gst_matroska_demux_add_stream), (gst_matroska_demux_handle_src_query), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_tracks), (gst_matroska_demux_parse_index_cuetrack), (gst_matroska_demux_parse_index_pointentry), (gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_metadata_id_simple_tag), (gst_matroska_demux_parse_metadata_id_tag), (gst_matroska_demux_parse_metadata), (gst_matroska_demux_sync_streams), (gst_matroska_demux_push_hdr_buf), (gst_matroska_demux_push_flac_codec_priv_data), (gst_matroska_demux_push_xiph_codec_priv_data), (gst_matroska_demux_add_wvpk_header), (gst_matroska_demux_check_subtitle_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_parse_cluster), (gst_matroska_demux_parse_contents_seekentry), (gst_matroska_demux_parse_contents), (gst_matroska_demux_loop_stream_parse_id), (gst_matroska_demux_loop_stream), (gst_matroska_demux_loop): * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.h: Handle return values from pull_range in a more granular way to properly shut down on seeks. Combine return values from push. Implement proper error handling. Prepare for handling seeking correctly. 2008-03-03 22:01:56 +0000 Jan Schmidt gst/matroska/ebml-read.c: Use GINT64 formatting constants from GLIB. Original commit message from CVS: * gst/matroska/ebml-read.c: Use GINT64 formatting constants from GLIB. * gst/matroska/matroska-demux.c: Add some guards to avoid a possible division by 0 and crashing with NULL events on some systems. Use gst_gdouble_to_guint64 somewhere instead of an implicit conversion. * gst/matroska/matroska-mux.c: Check for invalid timestamps in a bunch of places to avoid writing bogus durations into the output file. Fix some double<->gint64 conversions that weren't using gst_guint64_to_gdouble 2008-03-03 13:03:43 +0000 Peter Kjellerstedt configure.ac: Move the checks for bison, flex and as to the program section and the check for gcc inline asm to the c... Original commit message from CVS: * configure.ac: Move the checks for bison, flex and as to the program section and the check for gcc inline asm to the compiler characteristics section. 2008-03-03 12:10:55 +0000 Peter Kjellerstedt configure.ac: Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which plug-ins are included/excluded. (#4... Original commit message from CVS: * configure.ac: Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which plug-ins are included/excluded. (#498222) 2008-02-29 12:35:24 +0000 Michael Smith gst/videomixer/videomixer.c: Don't call gst_object_sync_values() unless we have a valid timestamp. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_blend_buffers): Don't call gst_object_sync_values() unless we have a valid timestamp. 2008-02-29 06:18:55 +0000 David Schleef gst/matroska/: Fix Dirac mapping. I had previously added a VfW-type mapping, but it looks like Dirac will get a nati... Original commit message from CVS: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: Fix Dirac mapping. I had previously added a VfW-type mapping, but it looks like Dirac will get a native Matroska mapping, and this is the most likely method. 2008-02-28 23:56:30 +0000 David Schleef gst/avi/gstavimux.c: Add Dirac encoding Original commit message from CVS: * gst/avi/gstavimux.c: Add Dirac encoding 2008-02-28 11:51:24 +0000 Peter Kjellerstedt gst/udp/gstudpsrc.*: Port to GstPoll. See #505417. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_unlock), (gst_udpsrc_unlock_stop), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Port to GstPoll. See #505417. 2008-02-28 08:37:44 +0000 Sebastian Dröge gst/law/mulaw-decode.c: Return GST_FLOW_NOT_NEGOTIATED when the caps are not set yet on the srcpad. We need rate and ... Original commit message from CVS: * gst/law/mulaw-decode.c: (gst_mulawdec_chain): Return GST_FLOW_NOT_NEGOTIATED when the caps are not set yet on the srcpad. We need rate and channels before we can do any processing. Fixes bug #519088. 2008-02-26 10:09:38 +0000 Jan Schmidt configure.ac: Detect and indicate if GCC inline assembly syntax is available. Original commit message from CVS: * configure.ac: Detect and indicate if GCC inline assembly syntax is available. * gst/goom/Makefile.am: * gst/goom/convolve_fx.c: * gst/goom/flying_stars_fx.c: * gst/goom/goom_config.h: * gst/goom/goom_core.c: * gst/goom/goomsl.c: * gst/goom/ifs.c: * gst/goom/mmx.c: * gst/goom/plugin_info.c: * gst/goom/xmmx.c: Fix various GCC-isms, and only build the inline assembly with compilers that support GCC inline assembly. Fix a couple of other warnings shown with Forte. 2008-02-26 05:36:17 +0000 Wouter Cloetens Add support for specifying a list of cookies to be passed in the HTTP request. Fixes bug #518722. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), (gst_soup_http_src_init), (gst_soup_http_src_dispose), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), (gst_soup_http_src_create): * ext/soup/gstsouphttpsrc.h: * tests/check/elements/souphttpsrc.c: (run_test), (GST_START_TEST), (souphttpsrc_suite): Add support for specifying a list of cookies to be passed in the HTTP request. Fixes bug #518722. 2008-02-25 12:03:46 +0000 Stefan Kost gst/goom/xmmx.c: Use 'emms' instead of 'femms' to not crash on cpus that do not implement this 3dnow specific instruc... Original commit message from CVS: * gst/goom/xmmx.c: Use 'emms' instead of 'femms' to not crash on cpus that do not implement this 3dnow specific instruction. 2008-02-25 10:32:35 +0000 Sebastian Dröge gst/goom/plugin_info.c: Use extended MMX for draw_line() too if available, not only normal MMX. Original commit message from CVS: * gst/goom/plugin_info.c: (setOptimizedMethods): Use extended MMX for draw_line() too if available, not only normal MMX. 2008-02-25 06:50:31 +0000 Sebastian Dröge ext/jpeg/gstjpeg.c: Remove (commented out) smoke typefinder. This is in base now. Original commit message from CVS: * ext/jpeg/gstjpeg.c: (plugin_init): Remove (commented out) smoke typefinder. This is in base now. 2008-02-23 15:02:15 +0000 Jan Schmidt gst/goom2k1/: Rename the installed library, and don't register the same Original commit message from CVS: * gst/goom2k1/Makefile.am: * gst/goom2k1/gstgoom.c: Rename the installed library, and don't register the same GType name as the new goom. 2008-02-23 12:23:38 +0000 Tim-Philipp Müller Check for and define ERROR_CXXFLAGS and use them when building Original commit message from CVS: * configure.ac: * ext/taglib/Makefile.am: Check for and define ERROR_CXXFLAGS and use them when building C++ code (#516509). 2008-02-23 12:10:16 +0000 Tim-Philipp Müller gst/goom/: Call oil_init(), otherwise oil_get_cpu_flags() won't return anything useful. Export goom debug category so... Original commit message from CVS: * gst/goom/gstgoom.c: (goom_debug), (plugin_init): * gst/goom/plugin_info.c: (goom_debug), (GST_CAT_DEFAULT), (setOptimizedMethods): Call oil_init(), otherwise oil_get_cpu_flags() won't return anything useful. Export goom debug category so we can get rid of the VERBOSE define and the printfs. 2008-02-23 11:53:27 +0000 Tim-Philipp Müller gst/goom/: Compile fixes for x86-64. Original commit message from CVS: * gst/goom/goomsl_heap.c: (align_it): * gst/goom/plugin_info.c: (setOptimizedMethods): Compile fixes for x86-64. 2008-02-23 03:10:55 +0000 Bastien Nocera gst/goom/Makefile.am: Don't compile lex or yacc outputs with warnings, but add other CFLAGS Original commit message from CVS: * gst/goom/Makefile.am: Don't compile lex or yacc outputs with warnings, but add other CFLAGS * gst/goom/goomsl.c (gsl_instr_set_namespace), (gsl_instr_add_param), (iflow_execute), (gsl_enternamespace), (calculate_labels), (gsl_read_file): * gst/goom/goomsl_lex.l: * gst/goom/goomsl_yacc.y: * gst/goom/plugin_info.c: Remove a few live printf, and fprintf, replace exit() calls with g_assert_not_reached() if it not optimal for a library 2008-02-23 02:38:03 +0000 Bastien Nocera gst/goom/Makefile.am: Remove the warnings being disabled, fix linkage on x86, spotted by Sebastian Dröge Original commit message from CVS: * gst/goom/Makefile.am: Remove the warnings being disabled, fix linkage on x86, spotted by Sebastian Dröge * gst/goom/convolve_fx.c (convolve_init), (create_output_with_brightness), (convolve_apply): * gst/goom/filters.c (zoomFilterVisualFXWrapper_create): * gst/goom/goomsl.c: * gst/goom/ifs.c (ifs_update), (ifs_visualfx_create): * gst/goom/plugin_info.c: * gst/goom/tentacle3d.c (tentacle_fx_create): Fix warnings, and disable the motifs in the convolve_fx plugin (they were causing warnings, and they were just "Goom" in funny letterring) 2008-02-23 01:51:37 +0000 Bastien Nocera configure.ac: Add checks for Flex/Yacc/Bison and other furry animals, for the new goom 2k4 based plugin Original commit message from CVS: 2008-02-23 Bastien Nocera * configure.ac: Add checks for Flex/Yacc/Bison and other furry animals, for the new goom 2k4 based plugin * gst/goom/*: Update to use goom 2k4, uses liboil to detect CPU optimisations (not working yet), move the old plugin to... * gst/goom2k1/*: ... here, in case somebody is sick enough Fixes #515073 2008-02-22 09:56:03 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Post the server response code in an error message instead of a generic 'error' message. Fixes ... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): Post the server response code in an error message instead of a generic 'error' message. Fixes #517237. 2008-02-22 07:20:03 +0000 Wouter Cloetens Implement zero-copy and make the buffer size configurable. Original commit message from CVS: Patch by: Wouter Cloetens * configure.ac: * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_cancel_message), (gst_soup_http_src_finished_cb), (gst_soup_http_src_chunk_free), (gst_soup_http_src_chunk_allocator), (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_create), (gst_soup_http_src_start), (gst_soup_http_src_set_proxy): * ext/soup/gstsouphttpsrc.h: Implement zero-copy and make the buffer size configurable. Prefix proxy URIs with "http://" if they don't start with it already and catch errors earlier, fixes hanging in some situations. Fixes bug #514948. 2008-02-22 06:22:39 +0000 Sebastian Dröge tests/check/Makefile.am: Ignore gconfaudiosrc for the states unit test too. It will fallback to alsasrc if the gconf ... Original commit message from CVS: * tests/check/Makefile.am: Ignore gconfaudiosrc for the states unit test too. It will fallback to alsasrc if the gconf settings can't be read and not everybody has alsa. 2008-02-22 06:06:06 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.*: Always report the duration if we know it in push mode and don't return 0 just to make ... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query), (gst_wavpack_parse_create_src_pad): * ext/wavpack/gstwavpackparse.h: Always report the duration if we know it in push mode and don't return 0 just to make totem believe we can't seek in push mode. Newer totem version use the SEEKING query which properly reports if we can seek or not. 2008-02-22 05:39:01 +0000 Jens Granseuer tests/examples/equalizer/demo.c: C89 fix, moving variable declarations to the beginning of the block. Fixes bug #517933. Original commit message from CVS: Patch by: Jens Granseuer * tests/examples/equalizer/demo.c: (main): C89 fix, moving variable declarations to the beginning of the block. Fixes bug #517933. 2008-02-21 23:47:37 +0000 Jan Schmidt configure.ac: Back to development... Original commit message from CVS: * configure.ac: Back to development... === release 0.10.7 === 2008-02-21 00:09:07 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.prerequisites: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multifile.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * gst-plugins-good.doap: * po/LINGUAS: * win32/common/config.h: Release 0.10.7 - Red Door Black Original commit message from CVS: Release 0.10.7 - Red Door Black 2008-02-20 22:51:08 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/bg.po: * po/ca.po: * po/cs.po: * po/da.po: * po/en_GB.po: * po/es.po: * po/eu.po: * po/fi.po: * po/hu.po: * po/it.po: * po/ja.po: * po/nb.po: * po/nl.po: * po/or.po: * po/pl.po: * po/sk.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * po/zh_CN.po: * po/zh_HK.po: * po/zh_TW.po: Update .po files Original commit message from CVS: Update .po files 2008-02-19 10:47:20 +0000 Sebastian Dröge gst/alpha/Makefile.am: Link alpha plugin with libgstbase. Fixes bug #517386. Original commit message from CVS: * gst/alpha/Makefile.am: Link alpha plugin with libgstbase. Fixes bug #517386. 2008-02-18 11:13:35 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Init values to -1 instead of the default 0 value. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream): Init values to -1 instead of the default 0 value. Fixes #516524. 2008-02-14 14:50:30 +0000 Stefan Kost tests/examples/spectrum/spectrum-example.c: Add missing include to fix compilation when libxml usage is disabled. Original commit message from CVS: * tests/examples/spectrum/spectrum-example.c: Add missing include to fix compilation when libxml usage is disabled. Fixes: #516371 2008-02-12 23:38:19 +0000 Wim Taymans fixes: #514889 Original commit message from CVS: patch by: Wim Taymans fixes: #514889 * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbispay.c: Fix various leaks shown up in valgrind - free sprops and buffer in error cases in H264 payloader - fix leak in mp4g depayloader when construction the caps - don't leak config string in the mp4g payloader - don't leak buffers and headers in theora and vorbis payloaders * tests/check/elements/rtp-payloading.c: Fix the RTP data test - Actually send valid amr data to the payloader instead of 20 zero-bytes - The mp4g payloader expects codec_data on the caps 2008-02-12 21:36:40 +0000 Sébastien Moutte win32/MANIFEST: Add libgstpng.dsp to MANIFEST. Original commit message from CVS: * win32/MANIFEST: Add libgstpng.dsp to MANIFEST. * win32/vs6/libgstaudiofx.dsp: Add new source files to VS project file. 2008-02-12 13:34:52 +0000 Jan Schmidt sys/ximage/gstximagesrc.c: Initialise variables when opening the X display rather than in _start(), as the display ca... Original commit message from CVS: * sys/ximage/gstximagesrc.c: Initialise variables when opening the X display rather than in _start(), as the display can be opened before that. Fixes: #515985 2008-02-12 12:22:48 +0000 Sebastian Dröge sys/directdraw/gstdirectdrawsink.c: Properly chain up finalize functions. Fixes bug #515980. Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c: (gst_ddrawsurface_class_init), (gst_ddrawsurface_finalize), (gst_directdraw_sink_finalize): Properly chain up finalize functions. Fixes bug #515980. 2008-02-12 11:38:54 +0000 Sebastian Dröge sys/v4l2/v4l2src_calls.c: Chain up the finalize functions. Fixes bug #515984. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), (gst_v4l2_buffer_class_init), (gst_v4l2_buffer_pool_finalize), (gst_v4l2_buffer_pool_class_init): Chain up the finalize functions. Fixes bug #515984. 2008-02-12 11:14:36 +0000 Sebastian Dröge sys/ximage/ximageutil.c: Chain up in the finalize function for our custom buffer sub-class. Original commit message from CVS: * sys/ximage/ximageutil.c: Chain up in the finalize function for our custom buffer sub-class. Patch by: Sebastian Dröge Fixes: #515706 2008-02-12 11:12:43 +0000 Sebastian Dröge gst/debug/efence.c: Properly chain up finalize method. Fixes bug #515979. Original commit message from CVS: * gst/debug/efence.c: (gst_fenced_buffer_finalize), (gst_fenced_buffer_class_init): Properly chain up finalize method. Fixes bug #515979. 2008-02-12 11:09:08 +0000 Jan Schmidt sys/ximage/gstximagesrc.c: Free allocated Damage memory before closing our connection to the Original commit message from CVS: * sys/ximage/gstximagesrc.c: Free allocated Damage memory before closing our connection to the X server. Fixes: #515706 2008-02-12 05:21:46 +0000 Sebastian Dröge tests/check/elements/souphttpsrc.c: Include glib/gprintf.h for g_vasprintf(). Fixes bug #515564. Original commit message from CVS: * tests/check/elements/souphttpsrc.c: Include glib/gprintf.h for g_vasprintf(). Fixes bug #515564. 2008-02-12 05:14:16 +0000 Sebastian Dröge Add a few libjpeg suppressions and initialize a variable to make smokeenc valgrind clean. Fixes bug #515701. Original commit message from CVS: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): * tests/check/Makefile.am: * tests/check/gst-plugins-good.supp: Add a few libjpeg suppressions and initialize a variable to make smokeenc valgrind clean. Fixes bug #515701. 2008-02-11 21:24:30 +0000 Jan Schmidt gst/avi/gstavidemux.c: Revert patch which sends timestamps only on keyframes, as it breaks playback with current gst-... Original commit message from CVS: * gst/avi/gstavidemux.c: Revert patch which sends timestamps only on keyframes, as it breaks playback with current gst-ffmpeg. Fixes: #515562 2008-02-11 14:01:52 +0000 Sebastian Dröge Close some memory leaks spotted by the unit test. Fixes bug #515697. Original commit message from CVS: * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): * tests/check/elements/multifile.c: (GST_START_TEST): Close some memory leaks spotted by the unit test. Fixes bug #515697. 2008-02-11 13:48:03 +0000 Sebastian Dröge ext/gconf/gconf.c: Use and unset the GError when pipeline creation fails instead of simply leaking it. Fixes bug #515... Original commit message from CVS: * ext/gconf/gconf.c: (gst_gconf_render_bin_with_default): Use and unset the GError when pipeline creation fails instead of simply leaking it. Fixes bug #515704. 2008-02-10 10:46:13 +0000 Sebastian Dröge gst/audiofx/: Fix long description of audiofx elements. Fixes bug #515457. Original commit message from CVS: * gst/audiofx/audioamplify.c: * gst/audiofx/audiochebband.c: * gst/audiofx/audiocheblimit.c: * gst/audiofx/audiodynamic.c: * gst/audiofx/audioinvert.c: * gst/audiofx/audiopanorama.c: * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsinclimit.c: Fix long description of audiofx elements. Fixes bug #515457. 2008-02-09 01:45:32 +0000 Jan Schmidt Add a simple example application for the spectrum element, include it in the docs, and fix some documentation ambigui... Original commit message from CVS: * docs/plugins/Makefile.am: * gst/spectrum/gstspectrum.c: * tests/examples/spectrum/.cvsignore: * tests/examples/spectrum/Makefile.am: * tests/examples/spectrum/spectrum-example.c: Add a simple example application for the spectrum element, include it in the docs, and fix some documentation ambiguities. Fixes: #348085 2008-02-09 00:15:25 +0000 Jan Schmidt gst/: Fix includes order Original commit message from CVS: * gst/equalizer/Makefile.am: * gst/spectrum/Makefile.am: Fix includes order * tests/check/Makefile.am: Exclude v4l2src from the states test - it takes too long to start. * tests/check/elements/spectrum.c: Make the test run properly with CK_FORK=no 2008-02-08 15:32:36 +0000 Christian Schaller * gst-plugins-good.spec.in: add 3 new plugins to spec file Original commit message from CVS: add 3 new plugins to spec file 2008-02-08 15:27:51 +0000 Christian Schaller * ChangeLog: * gst/audiofx/Makefile.am: add missing header files for disting Original commit message from CVS: add missing header files for disting 2008-02-08 15:20:31 +0000 Julien Moutte gst/matroska/matroska-demux.c: Flag keyframe and delta units correctly when dealign with a Original commit message from CVS: 2008-02-08 Julien Moutte * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup_or_simpleblock): Flag keyframe and delta units correctly when dealign with a BlockGroup. Fixes: #514397 2008-02-08 10:19:33 +0000 Jan Schmidt tests/check/elements/.cvsignore: Spell the new tests correctly in .cvsignore Original commit message from CVS: * tests/check/elements/.cvsignore: Spell the new tests correctly in .cvsignore 2008-02-08 10:09:33 +0000 Tim-Philipp Müller gst/multifile/gstmultifilesrc.c: Need to use gsize here for the size, fixes compiler warning. Original commit message from CVS: * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): Need to use gsize here for the size, fixes compiler warning. * tests/examples/equalizer/.cvsignore: * tests/examples/equalizer/Makefile.am: * tests/examples/spectrum/.cvsignore: * tests/examples/spectrum/Makefile.am: Add missing files to fix the build. 2008-02-08 04:25:32 +0000 Jan Schmidt Move multifile plugin from -bad. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-multifile.xml: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: Move multifile plugin from -bad. Fixes: #490283 2008-02-08 03:44:12 +0000 David Schleef gst/multifile/: Use g_file_[sg]et_contents() instead of using stdio functions. Original commit message from CVS: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: Use g_file_[sg]et_contents() instead of using stdio functions. Should be less error prone. * tests/check/elements/multifile.c: Create a temporary directory using standard functions instead of creating a directory in the current dir. 2008-02-08 03:28:57 +0000 Jan Schmidt Move spectrum plugin from -bad. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-spectrum.xml: * gst/spectrum/Makefile.am: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/examples/Makefile.am: Move spectrum plugin from -bad. Move examples into tests/examples/spectrum. 2008-02-08 02:56:12 +0000 Jan Schmidt * ChangeLog: Mention bug 415627 fixed with previous commit Original commit message from CVS: Mention bug 415627 fixed with previous commit 2008-02-08 02:49:20 +0000 Jan Schmidt Move the equalizer plugin across from -bad Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/inspect/plugin-equalizer.xml: * gst/equalizer/Makefile.am: * tests/check/Makefile.am: * tests/examples/Makefile.am: Move the equalizer plugin across from -bad * tests/check/elements/.cvsignore: Add equalizer, audiosincwband and audiosincwlimit * tests/check/elements/equalizer.c: Fix compiler warnings 2008-02-08 02:48:54 +0000 Jan Schmidt docs/plugins/gst-plugins-bad-plugins.*: Remove equalizer plugin docs Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: Remove equalizer plugin docs * tests/check/Makefile.am: Add GST_OPTION_CFLAGS, to get -Werror -Wall into the tests as for other modules. * tests/check/elements/multifile.c: * tests/check/elements/rganalysis.c: * tests/check/elements/rglimiter.c: Fix compiler warnings from -Wall -Werror 2008-02-08 01:07:02 +0000 Jan Schmidt configure.ac: Only build with DISABLE_DEPRECATED during the CVS cycle. Pre-releases are treated like releases and bui... Original commit message from CVS: * configure.ac: Only build with DISABLE_DEPRECATED during the CVS cycle. Pre-releases are treated like releases and build without it. 2008-02-07 21:57:54 +0000 Jan Schmidt Move the lpwsinc and bpwsinc elements from gst-plugins-bad into the audiofx plugin, and rename to audiowsinclimit and... Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-audiofx.xml: * gst/audiofx/Makefile.am: * gst/audiofx/audiofx.c: * gst/audiofx/audiowsincband.c: * gst/audiofx/audiowsincband.h: * gst/audiofx/audiowsinclimit.c: * gst/audiofx/audiowsinclimit.h: * tests/check/Makefile.am: * tests/check/elements/audiowsincband.c: * tests/check/elements/audiowsinclimit.c: Move the lpwsinc and bpwsinc elements from gst-plugins-bad into the audiofx plugin, and rename to audiowsinclimit and audiowsincband respectively. Fixes: #467666 2008-02-07 21:17:36 +0000 Tim-Philipp Müller Return GST_FLOW_NOT_NEGOTIATED if we get a buffer without caps, and add a somewhat useful debug message. Plus test. Original commit message from CVS: * gst/icydemux/gsticydemux.c: (gst_icydemux_chain): * tests/check/elements/icydemux.c: Return GST_FLOW_NOT_NEGOTIATED if we get a buffer without caps, and add a somewhat useful debug message. Plus test. 2008-02-07 19:13:56 +0000 Sébastien Moutte gst/rtsp/gstrtspsrc.c: Include unistd.h only if HAVE_UNISTD_H is defined Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: Include unistd.h only if HAVE_UNISTD_H is defined * win32/common/config.h.in: * win32/common/config.h: Define socklen_t as it seems it's not defined in default Visual Studio headers. * win32/vs6/libgstalpha.dsp: * win32/vs6/libgstapetag.dsp: * win32/vs6/libgstavi.dsp: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: * win32/vs6/libgstvideomixer.dsp: Update project file dependencies and add new source files 2008-02-07 16:38:55 +0000 Bjarne Rosengren gst/matroska/ebml-write.c: Don't leak buffers when we don't push them downstream. Original commit message from CVS: Patch by: Bjarne Rosengren * gst/matroska/ebml-write.c: (gst_ebml_write_element_push): Don't leak buffers when we don't push them downstream. Fixes bug #514965. 2008-02-07 13:48:20 +0000 Stefan Kost gst/multifile/gstmultifilesink.c: Add a fixme comment. Original commit message from CVS: * gst/multifile/gstmultifilesink.c: Add a fixme comment. * gst/selector/gstoutputselector.c: Fix same leak as in input-selector. * tests/icles/output-selector-test.c: Improve the test. 2008-02-07 13:41:11 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Improve the docs. Original commit message from CVS: * gst/spectrum/gstspectrum.c: Improve the docs. 2008-02-07 10:17:14 +0000 Tim-Philipp Müller configure.ac: Bump requirements to (good) released versions to avoid confusion and make implicit core requirement exp... Original commit message from CVS: * configure.ac: Bump requirements to (good) released versions to avoid confusion and make implicit core requirement explicit. 2008-02-07 10:04:01 +0000 Sebastian Dröge gst/filter/gstlpwsinc.c: Fix typo in the long description of the element. Original commit message from CVS: * gst/filter/gstlpwsinc.c: Fix typo in the long description of the element. 2008-02-06 23:44:43 +0000 Jan Schmidt Rename audiochebyshevfreqband -> audiochebband and audiochebyshevfreqlimit -> audiocheblimit and do the requisite CVS... Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-audiofx.xml: * gst/audiofx/Makefile.am: * gst/audiofx/audiochebband.c: * gst/audiofx/audiochebband.h: * gst/audiofx/audiocheblimit.c: * gst/audiofx/audiocheblimit.h: * gst/audiofx/audiochebyshevfreqband.c: * gst/audiofx/audiochebyshevfreqband.h: * gst/audiofx/audiochebyshevfreqlimit.c: * gst/audiofx/audiochebyshevfreqlimit.h: * gst/audiofx/audiofx.c: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/audiochebband.c: * tests/check/elements/audiocheblimit.c: * tests/check/elements/audiochebyshevfreqband.c: * tests/check/elements/audiochebyshevfreqlimit.c: Rename audiochebyshevfreqband -> audiochebband and audiochebyshevfreqlimit -> audiocheblimit and do the requisite CVS surgery. Closes: #491811 2008-02-06 11:07:47 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.c: Fix memory leak and improve debugging a bit. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_create): Fix memory leak and improve debugging a bit. 2008-02-05 17:59:24 +0000 orjan gst/multipart/multipartmux.c: Fix caps memory leak. Fixes #514573. Original commit message from CVS: Patch by: orjan * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): Fix caps memory leak. Fixes #514573. 2008-02-04 12:07:14 +0000 Edward Hervey gst/avi/gstavidemux.c: If there's no entries in the subindex, don't try to do anything stupid, just return. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex): If there's no entries in the subindex, don't try to do anything stupid, just return. 2008-02-02 19:47:50 +0000 John Millikin ext/flac/gstflacdec.c: Fix extraction of picture blocks with newer libflac versions again: Original commit message from CVS: Patch by: John Millikin * ext/flac/gstflacdec.c: (gst_flac_dec_scan_for_last_block), (gst_flac_extract_picture_buffer), (gst_flac_dec_metadata_callback): Fix extraction of picture blocks with newer libflac versions again: FLAC__METADATA_TYPE_PICTURE is an enum, not a define (#513628). 2008-02-02 18:06:19 +0000 Tim-Philipp Müller tests/check/Makefile.am: Add rtp-payloading test to VALGRIND_TO_FIX. Original commit message from CVS: * tests/check/Makefile.am: Add rtp-payloading test to VALGRIND_TO_FIX. * tests/check/elements/rtp-payloading.c: Add semicolons after GST_TEST_END so gst-indent gets the formatting right; make test less verbose in general, but more verbose in the error case (which should probably make the test fail anyway). 2008-02-01 18:29:21 +0000 Thijs Vermeir Add documentation for avisubtitle and change class to Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/avi/gstavisubtitle.c: Add documentation for avisubtitle and change class to Codec/Parser/Subtitle 2008-01-31 16:12:28 +0000 Jan Schmidt sys/v4l2/v4l2_calls.c: Treat ENOTTY (driver does not implement ioctl) the same as Original commit message from CVS: * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): Treat ENOTTY (driver does not implement ioctl) the same as EINVAL since it implies there are no available standards. * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_get_nearest_size): Replace gst_v4l2src_get_size_limits with 2 calls to new function gst_v4l2src_get_nearest_size, and get it to use VIDIOC_S_FMT to probe if the driver does not support VIDIOC_TRY_FMT for whatever reason, and if we aren't yet actively capturing. * sys/v4l2/v4l2src_calls.h: Remove replaced function declaration. 2008-01-31 16:03:48 +0000 Jan Schmidt configure.ac: Bump plugins-base requirement to 0.10.16 for the gst_video_format_* Original commit message from CVS: * configure.ac: Bump plugins-base requirement to 0.10.16 for the gst_video_format_* API. 2008-01-31 09:50:31 +0000 Sebastian Dröge ext/soup/gstsouphttpsrc.c: Add changes to gstsouphttpsrc.c that were missing from last commit. Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: (_do_init), (gst_soup_http_src_base_init), (gst_soup_http_src_class_init), (gst_soup_http_src_init), (gst_soup_http_src_dispose), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), (gst_soup_http_src_unicodify), (gst_soup_http_src_cancel_message), (gst_soup_http_src_queue_message), (gst_soup_http_src_add_range_header), (gst_soup_http_src_session_unpause_message), (gst_soup_http_src_session_pause_message), (gst_soup_http_src_session_close), (gst_soup_http_src_got_headers_cb), (gst_soup_http_src_got_body_cb), (gst_soup_http_src_finished_cb), (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_response_cb), (gst_soup_http_src_parse_status), (gst_soup_http_src_create), (gst_soup_http_src_start), (gst_soup_http_src_stop), (gst_soup_http_src_unlock), (gst_soup_http_src_unlock_stop), (gst_soup_http_src_get_size), (gst_soup_http_src_is_seekable), (gst_soup_http_src_do_seek), (gst_soup_http_src_set_location), (gst_soup_http_src_set_proxy), (gst_soup_http_src_uri_get_type), (gst_soup_http_src_uri_get_protocols), (gst_soup_http_src_uri_get_uri), (gst_soup_http_src_uri_set_uri), (gst_soup_http_src_uri_handler_init), (plugin_init): Add changes to gstsouphttpsrc.c that were missing from last commit. 2008-01-31 08:57:16 +0000 Wouter Cloetens Make coding style more consistent, including class renaming. Original commit message from CVS: Patch by: Wouter Cloetens * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/inspect/plugin-soup.xml: (gst_soup_http_src_base_init), (gst_soup_http_src_class_init), (gst_soup_http_src_init), (gst_soup_http_src_dispose), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), (gst_soup_http_src_unicodify), (gst_soup_http_src_cancel_message), (gst_soup_http_src_queue_message), (gst_soup_http_src_add_range_header), (gst_soup_http_src_session_unpause_message), (gst_soup_http_src_session_pause_message), (gst_soup_http_src_session_close), (gst_soup_http_src_got_headers_cb), (gst_soup_http_src_got_body_cb), (gst_soup_http_src_finished_cb), (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_response_cb), (gst_soup_http_src_parse_status), (gst_soup_http_src_create), (gst_soup_http_src_start), (gst_soup_http_src_stop), (gst_soup_http_src_unlock), (gst_soup_http_src_unlock_stop), (gst_soup_http_src_get_size), (gst_soup_http_src_is_seekable), (gst_soup_http_src_do_seek), (gst_soup_http_src_set_location), (gst_soup_http_src_set_proxy), (gst_soup_http_src_uri_get_type), (gst_soup_http_src_uri_get_protocols), (gst_soup_http_src_uri_get_uri), (gst_soup_http_src_uri_set_uri), (gst_soup_http_src_uri_handler_init), (plugin_init): * ext/soup/gstsouphttpsrc.h: Make coding style more consistent, including class renaming. 2008-01-31 00:03:26 +0000 Jan Schmidt configure.ac: Fix typo. Original commit message from CVS: * configure.ac: Fix typo. 2008-01-31 00:00:23 +0000 Jan Schmidt gst/alpha/: Re-write the 'alpha' plugin to be BaseTransform based, simplifying some stuff, and making buffer-alloc an... Original commit message from CVS: * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: Re-write the 'alpha' plugin to be BaseTransform based, simplifying some stuff, and making buffer-alloc and resizing work automatically. No longer crashes on odd frame widths and heights, although there seems to be a disagreement with ffmpegcolorspace about what size an AYUV frame with odd height should be. 2008-01-30 15:40:36 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.c: Update documentation a bit. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: Update documentation a bit. * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/inspect/plugin-alsaspdif.xml: * docs/plugins/inspect/plugin-dvb.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-glimagesink.xml: * docs/plugins/inspect/plugin-mpegvideoparse.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rawparse.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-sdl.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-soup.xml: * docs/plugins/inspect/plugin-spcdec.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-speexresample.xml: * docs/plugins/inspect/plugin-switch.xml: * docs/plugins/inspect/plugin-videocrop.xml: Regenerate everything for the documentation changes we had. 2008-01-30 13:29:15 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.c: Let the proxy property default to the content of the $http_proxy environment variable. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_init): Let the proxy property default to the content of the $http_proxy environment variable. 2008-01-30 13:08:45 +0000 Wouter Cloetens tests/check/: Add missing files for the unit test. Original commit message from CVS: Patch by: Wouter Cloetens * tests/check/test-cert.pem: * tests/check/test-key.pem: Add missing files for the unit test. 2008-01-30 13:06:01 +0000 Wouter Cloetens docs/plugins/: Add souphttpsrc to the docs. Original commit message from CVS: Patch by: Wouter Cloetens * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: Add souphttpsrc to the docs. * configure.ac: * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), (gst_souphttp_src_init), (gst_souphttp_src_dispose), (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), (gst_souphttp_src_cancel_message), (gst_souphttp_src_queue_message), (gst_souphttp_src_add_range_header), (gst_souphttp_src_session_unpause_message), (gst_souphttp_src_session_pause_message), (gst_souphttp_src_session_close), (gst_souphttp_src_got_headers_cb), (gst_souphttp_src_got_body_cb), (gst_souphttp_src_finished_cb), (gst_souphttp_src_got_chunk_cb), (gst_souphttp_src_response_cb), (gst_souphttp_src_parse_status), (gst_souphttp_src_create), (gst_souphttp_src_start), (gst_souphttp_src_stop), (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), (gst_souphttp_src_get_size), (gst_souphttp_src_is_seekable), (gst_souphttp_src_do_seek), (gst_souphttp_src_set_location), (gst_souphttp_src_set_proxy), (plugin_init): * ext/soup/gstsouphttpsrc.h: Add support for libsoup2.4 and require it. Also implement redirection and manual proxy specification. Fixes bug #510708. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/souphttpsrc.c: Add unit test for souphttpsrc. 2008-01-29 18:43:32 +0000 Alessandro Decina ext/libpng/gstpngenc.*: Preallocate the output buffer so that g_memdup() and gst_buffer_merge() aren't needed anymore... Original commit message from CVS: Patch by: Alessandro Decina * ext/libpng/gstpngenc.c: (user_write_data), (gst_pngenc_chain): * ext/libpng/gstpngenc.h: Preallocate the output buffer so that g_memdup() and gst_buffer_merge() aren't needed anymore. This greatly improves performances and fixes #512544. 2008-01-29 18:24:28 +0000 Wim Taymans gst/avi/gstavidemux.c: GStreamer timestamps are PTS values while AVI only knows about DTS timestamps. Make sure we on... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): GStreamer timestamps are PTS values while AVI only knows about DTS timestamps. Make sure we only copy the DTS as the buffer timestamp when we are dealing with a key frame. 2008-01-29 15:45:48 +0000 Stefan Kost tests/check/: Add add testsuite for the rtp-payloader that tries simulating dataflow. Needs more test data. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/rtp-payloading.c: Add add testsuite for the rtp-payloader that tries simulating dataflow. Needs more test data. 2008-01-29 15:27:02 +0000 Stefan Kost tests/check/elements/alphacolor.c: Remove two unused variables. Original commit message from CVS: * tests/check/elements/alphacolor.c: Remove two unused variables. 2008-01-28 12:17:02 +0000 Tim-Philipp Müller gst/rtsp/gstrtspsrc.c: Use g_ascii_strtoll() instead of atoll, which is only available in C99. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpinfo): Use g_ascii_strtoll() instead of atoll, which is only available in C99. 2008-01-26 16:19:26 +0000 Sebastian Dröge gst/filter/: Don't implement get_unit_size() ourselves, the GstAudioFilter base class already does this for us. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): Don't implement get_unit_size() ourselves, the GstAudioFilter base class already does this for us. 2008-01-25 10:53:17 +0000 Thijs Vermeir gst/rtp/: Add MPEG2 video payloader Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpmpvpay.c: * gst/rtp/gstrtpmpvpay.h: Add MPEG2 video payloader 2008-01-23 17:05:32 +0000 Sebastian Dröge gst/level/gstlevel.c: Use #include instead of #include "math.h". Original commit message from CVS: * gst/level/gstlevel.c: Use #include instead of #include "math.h". 2008-01-21 19:41:45 +0000 Jan Schmidt tests/check/Makefile.am: Fix up some CFLAGS sets. Original commit message from CVS: * tests/check/Makefile.am: Fix up some CFLAGS sets. Don't include gconfvideosrc in the states test. * tests/check/elements/autodetect.c: (GST_START_TEST): Add some error strings to fail_unless arguments to fix some weird compiler errors on Solaris. 2008-01-21 19:35:58 +0000 Brian Cameron configure.ac: Detect video4linux headers on Solaris too. Original commit message from CVS: * configure.ac: Detect video4linux headers on Solaris too. * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2object.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), (gst_v4l2_buffer_new): Make v4l2 build on Solaris. Patch by: Brian Cameron Fixes: #510505 2008-01-21 11:46:19 +0000 Stefan Kost docs/plugins/gst-plugins-good-plugins-docs.sgml: Update list from (still local) scanning script. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: Update list from (still local) scanning script. 2008-01-21 09:57:07 +0000 Stefan Kost docs/plugins/: Add symbols from -unused.txt to the right place. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-sections.txt: Add symbols from -unused.txt to the right place. * gst/dvdspu/gstdvdspu.c: * gst/dvdspu/gstdvdspu.h: Coherent namespace usage. * gst/spectrum/gstspectrum.c: Fix broken XML fragment in doc snippet even more. 2008-01-21 07:54:02 +0000 Stefan Kost docs/plugins/Makefile.am: Update include list. Original commit message from CVS: * docs/plugins/Makefile.am: Update include list. * docs/plugins/gst-plugins-bad-plugins-docs.sgml: Update xml includes. * docs/plugins/inspect/plugin-alsaspdif.xml: * docs/plugins/inspect/plugin-amrwb.xml: * docs/plugins/inspect/plugin-bayer.xml: * docs/plugins/inspect/plugin-bz2.xml: * docs/plugins/inspect/plugin-cdxaparse.xml: * docs/plugins/inspect/plugin-dtsdec.xml: * docs/plugins/inspect/plugin-dvbsrc.xml: * docs/plugins/inspect/plugin-dvdspu.xml: * docs/plugins/inspect/plugin-equalizer.xml: * docs/plugins/inspect/plugin-faac.xml: * docs/plugins/inspect/plugin-faad.xml: * docs/plugins/inspect/plugin-fbdevsink.xml: * docs/plugins/inspect/plugin-festival.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-flvdemux.xml: * docs/plugins/inspect/plugin-freeze.xml: * docs/plugins/inspect/plugin-gsm.xml: * docs/plugins/inspect/plugin-gstinterlace.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-h264parse.xml: * docs/plugins/inspect/plugin-interleave.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-metadata.xml: * docs/plugins/inspect/plugin-modplug.xml: * docs/plugins/inspect/plugin-mpeg4videoparse.xml: * docs/plugins/inspect/plugin-mpegtsparse.xml: * docs/plugins/inspect/plugin-mpegvideoparse.xml: * docs/plugins/inspect/plugin-musicbrainz.xml: * docs/plugins/inspect/plugin-mve.xml: * docs/plugins/inspect/plugin-nsfdec.xml: * docs/plugins/inspect/plugin-nuvdemux.xml: * docs/plugins/inspect/plugin-qtdemux.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-real.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-sdl.xml: * docs/plugins/inspect/plugin-sdp.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-speexresample.xml: * docs/plugins/inspect/plugin-stereo.xml: * docs/plugins/inspect/plugin-switch.xml: * docs/plugins/inspect/plugin-timidity.xml: * docs/plugins/inspect/plugin-tta.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoparse.xml: * docs/plugins/inspect/plugin-videosignal.xml: * docs/plugins/inspect/plugin-vmnc.xml: * docs/plugins/inspect/plugin-wildmidi.xml: * docs/plugins/inspect/plugin-x264.xml: * docs/plugins/inspect/plugin-xingheader.xml: * docs/plugins/inspect/plugin-xvid.xml: * docs/plugins/inspect/plugin-y4menc.xml: Regenerate files. * gst/spectrum/gstspectrum.c: Fix broken XML fragment in doc snippet. * tests/check/elements/.cvsignore: Add test binary to ignores. 2008-01-20 05:07:52 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.c: Report the size of the stream as the total size instead of the remaining Content-Length, w... Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (soup_got_headers): Report the size of the stream as the total size instead of the remaining Content-Length, which is wrong after a seek. 2008-01-19 14:59:08 +0000 Sebastian Dröge * ChangeLog: Add bug number to the latest entry Original commit message from CVS: Add bug number to the latest entry 2008-01-19 14:53:58 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Set variable to NULL after freeing it to prevent double frees or make failures by another... Original commit message from CVS: Based on a patch by: Victor STINNER * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Set variable to NULL after freeing it to prevent double frees or make failures by another use of it afterwards more obvious and fix use of it after the freeing. 2008-01-19 14:34:50 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.c: Correctly set duration on the GstBaseSrc segment when we know it to fix failing the durati... Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (soup_got_headers): Correctly set duration on the GstBaseSrc segment when we know it to fix failing the duration query. 2008-01-18 13:40:38 +0000 Thijs Vermeir gst/udp/gstmultiudpsink.c: use GST_WARNING for logging Original commit message from CVS: * gst/udp/gstmultiudpsink.c: use GST_WARNING for logging 2008-01-18 10:05:53 +0000 Sebastian Dröge gst/multifile/gstmultifilesrc.c: Fix memory leak spotted by the unit test. Original commit message from CVS: * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): Fix memory leak spotted by the unit test. 2008-01-18 10:04:25 +0000 Thijs Vermeir gst/udp/gstmultiudpsink.c: Don't try to leave a multicast group with an invalid socket Original commit message from CVS: * gst/udp/gstmultiudpsink.c: Don't try to leave a multicast group with an invalid socket 2008-01-18 08:49:59 +0000 Sebastian Dröge tests/check/: Add some minimal tests for the equalizer plugin. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/equalizer.c: (setup_equalizer), (cleanup_equalizer), (GST_START_TEST), (equalizer_suite), (main): Add some minimal tests for the equalizer plugin. 2008-01-18 07:03:23 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Unparent all bands from the equalizer when finalizing to stop leaking them. Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_finalize): Unparent all bands from the equalizer when finalizing to stop leaking them. 2008-01-18 05:32:26 +0000 Sebastian Dröge ext/soup/gstsouphttpsrc.c: Add support for WebDAV. Original commit message from CVS: * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_uri_get_protocols): Add support for WebDAV. 2008-01-18 05:24:39 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.*: Add support for seeking to souphttpsrc. Fixes bug #502335. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), (gst_souphttp_src_init), (gst_souphttp_src_create), (gst_souphttp_src_is_seekable), (gst_souphttp_src_do_seek), (soup_add_range_header), (soup_got_headers), (soup_got_chunk): * ext/soup/gstsouphttpsrc.h: Add support for seeking to souphttpsrc. Fixes bug #502335. 2008-01-17 21:23:32 +0000 Tim-Philipp Müller ext/flac/gstflacdec.c: where the picture metadata defines and structs don't exist yet. Original commit message from CVS: * ext/flac/gstflacdec.c: Fix compilation against flac 1.1.2 (as on debian stable), where the picture metadata defines and structs don't exist yet. Fixes #509301. 2008-01-17 11:13:16 +0000 Olivier Crete gst/udp/gstmultiudpsink.*: Add property to automatically join a multicast group or not. This can be useful when shari... Original commit message from CVS: Patch by: Olivier Crete * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), (gst_multiudpsink_remove): * gst/udp/gstmultiudpsink.h: Add property to automatically join a multicast group or not. This can be useful when sharing a socket between multiple elements. Fixes #509531. 2008-01-16 21:53:41 +0000 Stefan Kost gst/videomixer/Makefile.am: Add controller flags. Original commit message from CVS: * gst/videomixer/Makefile.am: Add controller flags. 2008-01-16 20:17:08 +0000 Stefan Kost gst/videomixer/videomixer.c: Also commit the missing gst_object_sync_values(). Original commit message from CVS: * gst/videomixer/videomixer.c: Also commit the missing gst_object_sync_values(). 2008-01-16 08:11:46 +0000 Stefan Kost docs/plugins/Makefile.am: Remove duplicate entry. Original commit message from CVS: * docs/plugins/Makefile.am: Remove duplicate entry. 2008-01-15 16:52:10 +0000 Stefan Kost docs/plugins/: Add 3 more plugins to docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-gamma.xml: * docs/plugins/inspect/plugin-monoscope.xml: * docs/plugins/inspect/plugin-video4linux2.xml: Add 3 more plugins to docs. 2008-01-15 16:04:44 +0000 Stefan Kost Revert previous change caused by a file that got stuck on an old revision. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-sections.txt: * sys/osxvideo/osxvideosink.h: Revert previous change caused by a file that got stuck on an old revision. 2008-01-15 15:40:58 +0000 Stefan Kost Re-add multipartdemux to the docs. Last round of section cleanup. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/multipart/Makefile.am: * gst/multipart/multipartdemux.c: * gst/multipart/multipartdemux.h: * gst/multipart/multipartmux.c: * gst/multipart/multipartmux.h: Re-add multipartdemux to the docs. Last round of section cleanup. 2008-01-15 15:22:41 +0000 Stefan Kost Managed to resolve most unused declarations. Filed a bug for one left. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-sections.txt: * sys/osxaudio/gstosxaudiosink.h: * sys/osxvideo/osxvideosink.h: Managed to resolve most unused declarations. Filed a bug for one left. 2008-01-15 08:03:49 +0000 Stefan Kost docs/plugins/gst-plugins-good-plugins-sections.txt: Cleanup section file. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-sections.txt: Cleanup section file. 2008-01-15 07:42:51 +0000 Stefan Kost docs/plugins/: Update plugin docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: Update plugin docs. * gst/videomixer/Makefile.am: * gst/videomixer/videomixer.c: * gst/videomixer/videomixer.h: * gst/videomixer/videomixerpad.h: Split out header to fix warnings from the doc-build. 2008-01-14 12:35:23 +0000 Wim Taymans As found by: Tommi Myöhänen Original commit message from CVS: As found by: Tommi Myöhänen * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpinfo): Use atoll to parse the rtptime with enough precision. Fixes #509329. 2008-01-14 12:11:43 +0000 Tim-Philipp Müller gst/: Initialise variables to work around (false) 'foo might be used uninitialized in this function' warnings by gcc-... Original commit message from CVS: * gst/avi/gstavisubtitle.c: (gst_avi_subtitle_extract_file): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send): Initialise variables to work around (false) 'foo might be used uninitialized in this function' warnings by gcc-3.3.3 (#509298). 2008-01-12 02:32:35 +0000 David Schleef Ignore more files for the buildbot. Original commit message from CVS: * docs/plugins/.cvsignore: * tests/check/pipelines/.cvsignore: Ignore more files for the buildbot. 2008-01-11 21:08:59 +0000 Jan Schmidt Generate the image-type values correctly. Leave them out of the caps when outputting a "preview image" tag, since it ... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_extract_picture_buffer): * gst/id3demux/id3v2frames.c: (parse_picture_frame): Generate the image-type values correctly. Leave them out of the caps when outputting a "preview image" tag, since it only makes sense to have one of those - the type is irrelevant. * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_open): If we can, mark the mixer multiple open when we use it, in case (for some reason) the process wants to open it again elsewhere. 2008-01-11 19:16:53 +0000 Tim-Philipp Müller tests/check/elements/: It's "endianness", not "endianess". Fixes unit tests. Original commit message from CVS: * tests/check/elements/rganalysis.c: (test_buffer_const_float_mono), (test_buffer_const_float_stereo), (test_buffer_const_int16_mono), (test_buffer_const_int16_stereo), (test_buffer_square_float_mono), (test_buffer_square_float_stereo), (test_buffer_square_int16_mono), (test_buffer_square_int16_stereo): * tests/check/elements/rglimiter.c: (create_test_buffer): * tests/check/elements/rgvolume.c: (test_buffer_new): It's "endianness", not "endianess". Fixes unit tests. 2008-01-11 18:56:06 +0000 Edward Hervey * tests/check/pipelines/.cvignore: ignore some more Original commit message from CVS: ignore some more 2008-01-11 18:54:31 +0000 Edward Hervey * tests/check/elements/.gitignore: ignore some more Original commit message from CVS: ignore some more 2008-01-11 17:21:30 +0000 Olivier Crete gst/rtp/: Fix the clock rate to 90000 as required by the RFC. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps): * gst/rtp/gstrtptheorapay.c: Fix the clock rate to 90000 as required by the RFC. Fixes #508644. 2008-01-11 17:12:37 +0000 Tim-Philipp Müller tests/check/elements/icydemux.c: Don't use deprecated GST_PLUGIN_DEFINE_STATIC. Original commit message from CVS: * tests/check/elements/icydemux.c: (GST_START_TEST), (icydemux_suite): Don't use deprecated GST_PLUGIN_DEFINE_STATIC. 2008-01-10 12:25:44 +0000 Sebastian Dröge autogen.sh: Add -Wno-portability to the automake parameters to stop warnings about GNU make extensions being used. We... Original commit message from CVS: * autogen.sh: Add -Wno-portability to the automake parameters to stop warnings about GNU make extensions being used. We require GNU make in almost every Makefile anyway. * configure.ac: Use AM_PROG_CC_C_O as a compiler that accepts both -c and -o at the same time is required for per target flags. 2008-01-09 15:28:29 +0000 Edward Hervey gst/videomixer/videomixer.c: Fix error from my last commit. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_init): Fix error from my last commit. 2008-01-09 15:20:19 +0000 Tommi Myöhänen gst/id3demux/id3v2frames.c: Make sure the ISO 639-X language code in ID3v2 COMM frames so we don't end up with non-UT... Original commit message from CVS: Based on patch by: Tommi Myöhänen * gst/id3demux/id3v2frames.c: (parse_comment_frame): Make sure the ISO 639-X language code in ID3v2 COMM frames is actually valid UTF-8 (or rather: ASCII), so we don't end up with non-UTF8 strings in tags if there's garbage in the language field. Also make sure the language code is always lower case. Fixes: #508291. 2008-01-09 13:55:28 +0000 Stefan Kost ChangeLog: Fix ChangeLog typo. Original commit message from CVS: * ChangeLog: Fix ChangeLog typo. 2008-01-09 13:50:09 +0000 Stefan Kost Makefile.am: Include lcov.mak to allow builging coverage reports. Guard check-torture target like in the other packages. Original commit message from CVS: * Makefile.am: Include lcov.mak to allow builging coverage reports. Guard check-torture target like in the other packages. 2008-01-09 12:33:58 +0000 Edward Hervey gst/videomixer/videomixer.c: Implement GstChildProxy interface. Original commit message from CVS: reviewed by: Edward Hervey * gst/videomixer/videomixer.c: (gst_videomixer_set_master_geometry), (_do_init), (gst_videomixer_child_proxy_get_child_by_index), (gst_videomixer_child_proxy_get_children_count), (gst_videomixer_child_proxy_init), (gst_videomixer_reset), (gst_videomixer_init), (gst_videomixer_request_new_pad), (gst_videomixer_release_pad), (gst_videomixer_fill_queues): Implement GstChildProxy interface. Send newsegment at the right moment Fixes #488879 2008-01-09 12:01:14 +0000 Edward Hervey gst/alpha/: Make the various properties of 'alpha' controllable. This allows doing niceties like fade-in/fade-out. Original commit message from CVS: * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_sink_event), (gst_alpha_chain), (gst_alpha_change_state), (plugin_init): Make the various properties of 'alpha' controllable. This allows doing niceties like fade-in/fade-out. 2008-01-09 11:11:01 +0000 Stefan Kost gst/rtp/: Remove copy/paste unused code (property setters and getter) found by the coverage suite (yay, saves ~20k on... Original commit message from CVS: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpac3depay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtph263depay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: Remove copy/paste unused code (property setters and getter) found by the coverage suite (yay, saves ~20k on disk). 2008-01-08 20:03:30 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: Also fix up pad templates to indicate that image/jpeg doesn't absolutely require the fra... Original commit message from CVS: * gst/matroska/matroska-mux.c: (COMMON_VIDEO_CAPS_NO_FRAMERATE), (videosink_templ): Also fix up pad templates to indicate that image/jpeg doesn't absolutely require the framerate property to be set (#504081). 2008-01-08 19:57:23 +0000 Wouter Cloetens gst/matroska/matroska-mux.*: Keep track of first and last timestamps for each incoming stream, so we can calculate th... Original commit message from CVS: Based on patch by: Wouter Cloetens * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps), (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), (gst_matroska_mux_finish), (gst_matroska_mux_collected): * gst/matroska/matroska-mux.h: Keep track of first and last timestamps for each incoming stream, so we can calculate the total duration for live sources and other input where we can't query the duration from the start or where there's no constant framerate from which we can deduce the duration; also use calculated/observed duration if it is bigger than the previously queried duration. Furthermore, use gst_pad_query_peer_duration() and take into account that it may return TRUE but still a duration of CLOCK_TIME_NONE, which easily screws up comparisons when using unsigned integers. Fixes #504081. 2008-01-08 14:58:18 +0000 Sebastian Dröge Make elements GST_BUFFER_FLAG_GAP aware and call gst_base_transform_set_gap_aware for this. Original commit message from CVS: * configure.ac: * gst/audiofx/audioamplify.c: (gst_audio_amplify_clipping_method_get_type), (gst_audio_amplify_init), (gst_audio_amplify_transform_ip): * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_init), (gst_audio_dynamic_transform_ip): * gst/audiofx/audioinvert.c: (gst_audio_invert_init), (gst_audio_invert_transform_ip): * gst/audiofx/audiopanorama.c: (gst_audio_panorama_init), (gst_audio_panorama_transform): * gst/level/gstlevel.c: (gst_level_init): Make elements GST_BUFFER_FLAG_GAP aware and call gst_base_transform_set_gap_aware for this. Bump core requirement to CVS. * gst/audiofx/audiochebyshevfreqband.c: (gst_audio_chebyshev_freq_band_transform_ip): * gst/audiofx/audiochebyshevfreqlimit.c: (gst_audio_chebyshev_freq_limit_transform_ip): Also sync GObject properties to the controller if operating in passthrough mode. 2008-01-07 16:41:00 +0000 Tim-Philipp Müller sys/directdraw/gstdirectdrawsink.c: FALSE is not a gpointer. Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c: (gst_directdraw_sink_window_thread): FALSE is not a gpointer. 2008-01-05 21:20:08 +0000 Julien Moutte sys/directdraw/gstdirectdrawsink.c: Make sure we create our internal window only when we need it. That will give a ch... Original commit message from CVS: 2008-01-05 Julien Moutte * sys/directdraw/gstdirectdrawsink.c: (gst_directdraw_sink_set_window_id), (gst_directdraw_sink_set_caps), (gst_directdraw_sink_change_state), (gst_directdraw_sink_buffer_alloc), (gst_directdraw_sink_draw_borders), (gst_directdraw_sink_show_frame), (gst_directdraw_sink_setup_ddraw), (gst_directdraw_sink_window_thread), (gst_directdraw_sink_get_ddrawcaps), (gst_directdraw_sink_surface_create): Make sure we create our internal window only when we need it. That will give a chance to the application to get the prepare-xwindow-id bus message. Draw black borders when keeping aspect ratio. Handle the case where our rendering window disappears (closed or errors) like other sinks do. Various 80 columns fixes, improve state change order. That element could need some more love. 2008-01-04 18:30:21 +0000 Sebastian Dröge ext/taglib/: Remove useless typedefs without new type name. Fixes a warning with gcc 4.3. Original commit message from CVS: * ext/taglib/gstapev2mux.h: * ext/taglib/gstid3v2mux.h: Remove useless typedefs without new type name. Fixes a warning with gcc 4.3. 2008-01-03 12:26:03 +0000 John Millikin ext/flac/gstflacdec.c: Emit metadata messages when a PICTURE block is encountered. Original commit message from CVS: Patch by: John Millikin * ext/flac/gstflacdec.c: (gst_flac_dec_setup_seekable_decoder), (gst_flac_dec_setup_stream_decoder), (gst_flac_normalize_picture_mime_type), (gst_flac_extract_picture_buffer), (gst_flac_dec_metadata_callback): Emit metadata messages when a PICTURE block is encountered. Fixes #506715. 2008-01-02 13:54:10 +0000 Thijs Vermeir gst/avi/gstavi.c: increase rank because no known issues anymore ... Original commit message from CVS: * gst/avi/gstavi.c: increase rank because no known issues anymore ... * gst/avi/gstavisubtitle.c: send subtitle name to the srcpad 2007-12-31 13:27:32 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Implement redirect for the DESCRIBE reply. Fixes #506025. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open): * gst/rtsp/gstrtspsrc.h: Implement redirect for the DESCRIBE reply. Fixes #506025. 2007-12-29 16:48:33 +0000 Sebastian Dröge ext/flac/gstflacdec.c: Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() ... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_write): Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() macro in GLib-2.15.x and don't abort() in any case but properly report the error. 2007-12-28 11:44:28 +0000 Tim-Philipp Müller ext/soup/: Use gst_tag_freeform_string_to_utf8() and post radio station info as tags on the bus. Original commit message from CVS: * ext/soup/Makefile.am: * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_get_property), (gst_souphttp_src_unicodify), (soup_got_headers): Use gst_tag_freeform_string_to_utf8() and post radio station info as tags on the bus. 2007-12-26 16:03:57 +0000 Tim-Philipp Müller Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() macro in GLib-2.15.x (i... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_loop): * gst/wavparse/gstwavparse.c: (gst_wavparse_chain): * sys/ximage/gstximagesrc.c: (composite_pixel): Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() macro in GLib-2.15.x (it's not really nice to abort in any case). Fixes #505745. 2007-12-20 17:07:22 +0000 Tim-Philipp Müller gst/: Ignore more. Original commit message from CVS: * gst/equalizer/.cvsignore: * gst/switch/.cvsignore: Ignore more. 2007-12-18 23:17:14 +0000 Tim-Philipp Müller tests/check/elements/avisubtitle.c: Small unit test fix (has no practical impact at the moment, since we're only feed... Original commit message from CVS: * tests/check/elements/avisubtitle.c: (check_correct_buffer): Small unit test fix (has no practical impact at the moment, since we're only feeding utf8 and hence just create a sub- buffer for the output). 2007-12-18 21:13:05 +0000 Thijs Vermeir Add seeking support for avi subtitle Original commit message from CVS: * gst/avi/gstavisubtitle.c: * tests/check/elements/avisubtitle.c: Add seeking support for avi subtitle 2007-12-18 17:40:34 +0000 Wim Taymans ext/flac/gstflacdec.*: Remove some unused vars. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_reset_decoders), (gst_flac_dec_update_metadata), (gst_flac_dec_metadata_callback), (gst_flac_dec_write): * ext/flac/gstflacdec.h: Remove some unused vars. Do more cleanup of leftover events and tags. Output tags after the segment event. Fixes #504018. 2007-12-18 14:31:36 +0000 Tim-Philipp Müller gst/avi/gstavisubtitle.c: Detect other UTF byte order markers and convert to UTF-8 as appropriate. Original commit message from CVS: * gst/avi/gstavisubtitle.c: (IS_BOM_UTF8), (IS_BOM_UTF16_BE), (IS_BOM_UTF16_LE), (IS_BOM_UTF32_BE), (IS_BOM_UTF32_LE), (gst_avi_subtitle_extract_file), (gst_avi_subtitle_parse_gab2_chunk): Detect other UTF byte order markers and convert to UTF-8 as appropriate. 2007-12-18 13:30:15 +0000 Tim-Philipp Müller gst/avi/gstavisubtitle.*: Refactor a bit; fix name extraction; don't assume all the data in the chunk is actually sub... Original commit message from CVS: * gst/avi/gstavisubtitle.c: (src_template), (gst_avi_subtitle_extract_utf8_file), (gst_avi_subtitle_parse_gab2_chunk), (gst_avi_subtitle_chain), (gst_avi_subtitle_base_init), (gst_avi_subtitle_class_init), (gst_avi_subtitle_init), (gst_avi_subtitle_change_state): * gst/avi/gstavisubtitle.h: Refactor a bit; fix name extraction; don't assume all the data in the chunk is actually subtitle data, there may be padding at the end; fix GST_ELEMENT_ERROR usage; store extracted subtitle file so it's there to send again after a seek (for future use). 2007-12-18 09:13:12 +0000 Thijs Vermeir Add avi subtitle element for bug #442034. Need seeking support and more support for character conversion. Original commit message from CVS: * gst/avi/Makefile.am: * gst/avi/gstavi.c: * gst/avi/gstavisubtitle.c: * gst/avi/gstavisubtitle.h: * tests/check/Makefile.am: * tests/check/elements/avisubtitle.c: * win32/common/config.h: Add avi subtitle element for bug #442034. Need seeking support and more support for character conversion. 2007-12-18 09:07:17 +0000 Tim-Philipp Müller Makefile.am: Include common/win32.mak for CRLF check of win32 project files (see #393626). Original commit message from CVS: * Makefile.am: Include common/win32.mak for CRLF check of win32 project files (see #393626). * win32/vs6/libgstpng.dsp: Fix line endings and do cvs admin -kb. 2007-12-17 21:12:28 +0000 David Schleef gst/multifile/gstmultifilesrc.*: When subsequent files are read, if the file doesn't exist, send an EOS instead of ca... Original commit message from CVS: * gst/multifile/gstmultifilesrc.c: * gst/multifile/gstmultifilesrc.h: When subsequent files are read, if the file doesn't exist, send an EOS instead of causing an error. 2007-12-16 23:43:46 +0000 Edward Hervey ext/jpeg/gstjpegdec.c: Actually drop the buffers which are outside the currently configured segment instead of just e... Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): Actually drop the buffers which are outside the currently configured segment instead of just emitting a WARNING. 2007-12-14 18:49:34 +0000 Wim Taymans ext/flac/gstflacdec.*: Send segments from the streaming thread. Fixes #502187. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_metadata_callback), (gst_flac_dec_write): * ext/flac/gstflacdec.h: Send segments from the streaming thread. Fixes #502187. Fix segment seeking and a bunch of other seeking cases. 2007-12-14 10:17:10 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Parse WOAF frames and put the result into GST_TAG_CONTACT, which is where it would end up... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_url_link_frame): Parse WOAF frames and put the result into GST_TAG_CONTACT, which is where it would end up if the same information was put in a vorbis comment (don't think it's worth adding a new URI tag for this). Fixes #488112. 2007-12-11 22:29:18 +0000 Tim-Philipp Müller configure.ac: We need core/base 0.10.15 or later. Original commit message from CVS: * configure.ac: We need core/base 0.10.15 or later. 2007-12-11 16:47:12 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Fix regression in stream numbering. Fixes #502655. Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/avi/gstavimux.c: (gst_avi_mux_start_file): Fix regression in stream numbering. Fixes #502655. 2007-12-11 16:39:39 +0000 Wouter Cloetens ext/soup/gstsouphttpsrc.*: Do not try to unpause I/O in the "queued" state. Original commit message from CVS: Patch by: Wouter Cloetens * ext/soup/gstsouphttpsrc.c: (_do_init), (gst_souphttp_src_class_init), (gst_souphttp_src_init), (gst_souphttp_src_dispose), (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), (unicodify), (gst_souphttp_src_unicodify), (gst_souphttp_src_create), (gst_souphttp_src_start), (gst_souphttp_src_stop), (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), (gst_souphttp_src_get_size), (gst_souphttp_src_is_seekable), (soup_got_headers), (soup_got_body), (soup_finished), (soup_got_chunk), (soup_response), (soup_parse_status), (gst_souphttp_src_uri_get_type), (gst_souphttp_src_uri_get_protocols), (gst_souphttp_src_uri_get_uri), (gst_souphttp_src_uri_set_uri), (gst_souphttp_src_uri_handler_init): * ext/soup/gstsouphttpsrc.h: Do not try to unpause I/O in the "queued" state. Reorganise a bunch of things and cleanups. Uses G_GUINT64_FORMAT instead of hard-coding %llu. See #502335. 2007-12-11 16:31:49 +0000 Wai-Ming Ho gst/rtp/gstrtph264pay.*: Use higher performance start-code searching. Original commit message from CVS: Patch by: Wai-Ming Ho * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_init), (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps), (next_start_code), (is_nal_equal), (gst_rtp_h264_pay_decode_nal), (encode_base64), (gst_rtp_h264_pay_parse_sps_pps), (gst_rtp_h264_pay_handle_buffer): * gst/rtp/gstrtph264pay.h: Use higher performance start-code searching. Parse NALs and store SPS, PPS and profile in the caps so that they can be used in the SDP. Fixes #502814. 2007-12-11 11:50:54 +0000 Tim-Philipp Müller sys/v4l2/: Init some structs to zero before we pass them to ioctl, which avoids valgrind warnings. Also fix a small ... Original commit message from CVS: * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list): Init some structs to zero before we pass them to ioctl, which avoids valgrind warnings. Also fix a small memory leak. 2007-12-11 11:05:57 +0000 Wouter Cloetens gst/multipart/multipartdemux.c: Copy timestamp from input to output. Not very perfect yet but better than nothing. Fi... Original commit message from CVS: Patch by: Wouter Cloetens * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): Copy timestamp from input to output. Not very perfect yet but better than nothing. Fixes #503023. 2007-12-09 16:49:09 +0000 Sebastian Dröge ext/wavpack/gstwavpackdec.c: Also print a useful error message with the old Wavpack API if possible. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): Also print a useful error message with the old Wavpack API if possible. 2007-12-09 16:34:08 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackdec.c: More build fixes for old libwavpack versions: include config.h so that WAVPACK_OLD_API i... Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: More build fixes for old libwavpack versions: include config.h so that WAVPACK_OLD_API is actually defined as detected; only use WavpackGetErrorMessage if it is available. This fixes the build on debian stable for me. 2007-12-09 16:21:02 +0000 Sebastian Dröge ext/wavpack/: Workaround the non-existance of WavpackGetChannelMask in Wavpack versions below 4.40.0. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_create_src_pad): Workaround the non-existance of WavpackGetChannelMask in Wavpack versions below 4.40.0. 2007-12-09 05:13:58 +0000 Sebastian Dröge configure.ac: And now do it right for real... Original commit message from CVS: * configure.ac: And now do it right for real... 2007-12-09 05:09:57 +0000 Sebastian Dröge configure.ac: Correctly reset $LIBS to not contain -lm. Original commit message from CVS: * configure.ac: Correctly reset $LIBS to not contain -lm. 2007-12-09 05:02:17 +0000 Kwang Yul Seo Fix compilation with MSVC by using gst_util_guint64_to_gdouble() and checking for rint() and implementing it ourself ... Original commit message from CVS: Based on a patch by: Kwang Yul Seo * configure.ac: * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_print_smpte_time): Fix compilation with MSVC by using gst_util_guint64_to_gdouble() and checking for rint() and implementing it ourself if it doesn't exist. 2007-12-09 04:29:08 +0000 Sebastian Dröge configure.ac: Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. Original commit message from CVS: * configure.ac: Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. 2007-12-08 16:47:33 +0000 Jan Schmidt sys/oss/gstosshelper.c: Verify that the format returned after the ioctl is the one we requested. It is valid for the ... Original commit message from CVS: * sys/oss/gstosshelper.c: Verify that the format returned after the ioctl is the one we requested. It is valid for the ioctl to succeed while substituting an alternate 'supported' sample format. 2007-12-07 20:07:49 +0000 Tim-Philipp Müller sys/oss/: Post decent (and translated) error message when we can't open the audio device for some reason. Original commit message from CVS: * sys/oss/gstossaudio.c: (plugin_init): * sys/oss/gstosssink.c: (gst_oss_sink_open): * sys/oss/gstosssrc.c: (gst_oss_src_open): Post decent (and translated) error message when we can't open the audio device for some reason. 2007-12-07 19:29:39 +0000 Jan Schmidt sys/oss/: Allow the AUDIODEV environment variable to redirect us to a different default OSS device, like sunaudiosink... Original commit message from CVS: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: Allow the AUDIODEV environment variable to redirect us to a different default OSS device, like sunaudiosink does on Solaris (makes audio play automatically on SunRays). 2007-12-06 12:45:50 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Fix compilation. Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_transform_ip): Fix compilation. 2007-12-06 12:42:11 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Don't process buffers in passthrough mode. Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_transform_ip): Don't process buffers in passthrough mode. 2007-12-06 12:37:43 +0000 Sebastian Dröge gst/filter/: The transform() methods are not called in passthrough mode so there's no need for checking if the elemen... Original commit message from CVS: * gst/filter/gstbpwsinc.c: (bpwsinc_transform): * gst/filter/gstlpwsinc.c: (lpwsinc_transform): The transform() methods are not called in passthrough mode so there's no need for checking if the element is in passthrough mode. 2007-12-06 12:29:26 +0000 Sebastian Dröge gst/filter/: Sync the GObject properties with the controller even in passthrough mode to get consistent property values. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (bpwsinc_transform): * gst/filter/gstlpwsinc.c: (lpwsinc_transform): Sync the GObject properties with the controller even in passthrough mode to get consistent property values. 2007-12-06 12:11:29 +0000 Sebastian Dröge gst/audiofx/: The transform_ip() methods should do nothing if in passthrough mode. Original commit message from CVS: * gst/audiofx/audioamplify.c: (gst_audio_amplify_transform_ip): * gst/audiofx/audiochebyshevfreqband.c: (gst_audio_chebyshev_freq_band_transform_ip): * gst/audiofx/audiochebyshevfreqlimit.c: (gst_audio_chebyshev_freq_limit_transform_ip): * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_transform_ip): * gst/audiofx/audioinvert.c: (gst_audio_invert_transform_ip): The transform_ip() methods should do nothing if in passthrough mode. It might get non-writable buffers in that case but the buffer might as well be writable. * gst/audiofx/audiopanorama.c: (gst_audio_panorama_transform): The transform() methods won't be called in passthrough mode and otherwise the buffer is always writable so don't check here. 2007-12-06 11:46:22 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: Fix seeking in .wav files again (#501775). Some people seem to think they don't need to ... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_srcpad_event): Fix seeking in .wav files again (#501775). Some people seem to think they don't need to test their changes when they're just 'reflowing' some code. 2007-12-05 16:04:47 +0000 Wim Taymans gst/autodetect/gstautovideosink.*: Fix docs. Original commit message from CVS: * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_class_init), (gst_auto_video_sink_dispose), (gst_auto_video_sink_init), (gst_auto_video_sink_create_element_with_pretty_name), (gst_auto_video_sink_find_best), (gst_auto_video_sink_set_property), (gst_auto_video_sink_get_property): * gst/autodetect/gstautovideosink.h: Fix docs. Use same error reporting code as autoaudiosink. Add property to filter sinks based on caps. Only select raw video sinks by default for backwards compat. API: GstAutoVideoSink::filter-caps 2007-12-05 16:02:15 +0000 Tommi Myöhänen gst/autodetect/gstautoaudiosink.*: Add property to filter sinks based on caps. Only select raw audio sinks by default... Original commit message from CVS: Patch by: Tommi Myöhänen * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_dispose), (gst_auto_audio_sink_init), (gst_auto_audio_sink_find_best), (gst_auto_audio_sink_set_property), (gst_auto_audio_sink_get_property): * gst/autodetect/gstautoaudiosink.h: Add property to filter sinks based on caps. Only select raw audio sinks by default for backwards compat. Fixes #417420. API: GstAutoAudioSink::filter-caps 2007-11-29 11:40:15 +0000 Arek Korbik gst/videobox/gstvideobox.c: Initialise liboil in plugin_init() Original commit message from CVS: Patch by: Arek Korbik * gst/videobox/gstvideobox.c: (plugin_init): Initialise liboil in plugin_init() 2007-11-29 10:49:18 +0000 Wouter Cloetens configure.ac: Bump libsoup requirement as libsoup does not support async client operation prior to version 2.2.104 an... Original commit message from CVS: Patch by: Wouter Cloetens * configure.ac: Bump libsoup requirement as libsoup does not support async client operation prior to version 2.2.104 and it has some leaks. * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), (gst_souphttp_src_init), (gst_souphttp_src_dispose), (gst_souphttp_src_set_property), (gst_souphttp_src_create), (gst_souphttp_src_start), (gst_souphttp_src_stop), (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), (gst_souphttp_src_get_size), (soup_got_headers), (soup_got_body), (soup_finished), (soup_got_chunk), (soup_response), (soup_session_close): * ext/soup/gstsouphttpsrc.h: Implement unlock(). Picks up the size from the Content-Length header and emit a duration message. Don't leak the GMainContext object. Fixes #500099. 2007-11-29 10:34:18 +0000 Wim Taymans ext/libpng/gstpngdec.c: Post error before sending EOS. Fixes #499178. Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_task): Post error before sending EOS. Fixes #499178. 2007-11-28 21:54:50 +0000 Sébastien Moutte win32/vs6/: Add a project file for libgstpng Original commit message from CVS: * win32/vs6/gst_plugins_good.dsw: * win32/vs6/libgstpng.dsp: Add a project file for libgstpng 2007-11-28 17:48:45 +0000 Edward Hervey gst/rtp/gstrtph263depay.c: Code beautification. Original commit message from CVS: * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_class_init), (gst_rtp_h263_depay_process): Code beautification. Added debug statements. Don't bit-shift everything, just do operations on last/first byte instead. 2007-11-27 11:11:08 +0000 Jayarama S. Santana gst/rtp/gstrtpmp4adepay.c: Fix wrong comparison in overrun check. Fixes #499239 some more. Original commit message from CVS: Patch by: Jayarama S. Santana * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_process): Fix wrong comparison in overrun check. Fixes #499239 some more. 2007-11-27 00:01:41 +0000 Edward Hervey gst/rtp/gstrtph263depay.*: Fix h263 depayloader so that ANY h263 decoder can handle the outgoing stream. Original commit message from CVS: * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_init), (gst_rtp_h263_depay_process): * gst/rtp/gstrtph263depay.h: Fix h263 depayloader so that ANY h263 decoder can handle the outgoing stream. 2007-11-26 19:17:10 +0000 Wim Taymans gst/rtp/gstrtpmp4adepay.*: Fix depayloading when multiple frames are inside one RTP packet. Original commit message from CVS: Based on Path by: Jayarama S. Santana * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): * gst/rtp/gstrtpmp4adepay.h: Fix depayloading when multiple frames are inside one RTP packet. Fixes #499239. 2007-11-26 12:26:20 +0000 Stefan Kost gst/level/gstlevel.c: Add GAP-flag support. Original commit message from CVS: * gst/level/gstlevel.c: Add GAP-flag support. 2007-11-26 12:01:11 +0000 Edward Hervey gst/rtp/gstrtph263depay.c: Read the I flag for Mode A h263 rtp stream and set the Original commit message from CVS: * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_process): Read the I flag for Mode A h263 rtp stream and set the GST_BUFFER_FLAG_DELTA_UNIT accordingly. Fixes #499383 2007-11-26 10:08:20 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Use dispose and finalize. Dispose can be called multiple times. Original commit message from CVS: * gst/spectrum/gstspectrum.c: Use dispose and finalize. Dispose can be called multiple times. 2007-11-26 10:04:49 +0000 Stefan Kost gst/level/gstlevel.c: Remove some dead code and do cleanups. Original commit message from CVS: * gst/level/gstlevel.c: Remove some dead code and do cleanups. 2007-11-26 09:13:48 +0000 Stefan Kost tests/check/pipelines/simple-launch-lines.c: Improve the tests by allowing to set a target state. Original commit message from CVS: * tests/check/pipelines/simple-launch-lines.c: Improve the tests by allowing to set a target state. 2007-11-26 09:04:17 +0000 Sebastian Dröge tests/check/elements/wavpackenc.c: Don't check the caps of the output buffer if they're equal some other caps. The ca... Original commit message from CVS: * tests/check/elements/wavpackenc.c: (GST_START_TEST): Don't check the caps of the output buffer if they're equal some other caps. The caps can change in a backward compatible way and did at this point. 2007-11-24 14:55:04 +0000 Julien Moutte gst/qtdemux/qtdemux.c: Implement reverse playback support. Original commit message from CVS: 2007-11-24 Julien MOUTTE * gst/qtdemux/qtdemux.c: (gst_qtdemux_find_segment), (gst_qtdemux_move_stream), (gst_qtdemux_do_seek), (gst_qtdemux_seek_to_previous_keyframe), (gst_qtdemux_activate_segment), (gst_qtdemux_advance_sample), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop): Implement reverse playback support. 2007-11-21 09:56:54 +0000 Sebastian Dröge gst/filter/: Post a GST_MESSAGE_LATENCY if the latency changes. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (bpwsinc_set_property): * gst/filter/gstlpwsinc.c: (lpwsinc_set_property): Post a GST_MESSAGE_LATENCY if the latency changes. 2007-11-21 08:21:10 +0000 Stefan Kost gst/equalizer/: Remove preset iface again. We'll re-add this after its been released in -good. Original commit message from CVS: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: Remove preset iface again. We'll re-add this after its been released in -good. 2007-11-20 13:14:40 +0000 Sebastian Dröge ext/wavpack/gstwavpackcommon.c: Also set the channel layout on the Wavpack caps if we're having a mono layout. Of cou... Original commit message from CVS: * ext/wavpack/gstwavpackcommon.c: (gst_wavpack_set_channel_layout): Also set the channel layout on the Wavpack caps if we're having a mono layout. Of course only do it for "audio/x-wavpack". 2007-11-20 13:08:45 +0000 Sebastian Dröge ext/wavpack/: Add support for encoding, parsing and decoding multichannel files with up to 8 channels. This also impr... Original commit message from CVS: * ext/wavpack/gstwavpackcommon.c: (gst_wavpack_get_default_channel_mask), (gst_wavpack_set_channel_layout), (gst_wavpack_get_default_channel_positions), (gst_wavpack_get_channel_mask_from_positions), (gst_wavpack_set_channel_mapping): * ext/wavpack/gstwavpackcommon.h: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), (gst_wavpack_dec_sink_set_caps), (gst_wavpack_dec_chain): * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), (gst_wavpack_enc_init), (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_push_block), (gst_wavpack_enc_fix_channel_order), (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), (gst_wavpack_enc_sink_event): * ext/wavpack/gstwavpackenc.h: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), (gst_wavpack_parse_scan_to_find_sample), (gst_wavpack_parse_sink_event), (gst_wavpack_parse_create_src_pad), (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_loop): * ext/wavpack/gstwavpackparse.h: Add support for encoding, parsing and decoding multichannel files with up to 8 channels. This also improves the robustness of parsing quite a bit. * ext/wavpack/gstwavpackstreamreader.c: (gst_wavpack_stream_reader_read_bytes), (gst_wavpack_stream_reader_get_pos), (gst_wavpack_stream_reader_set_pos_abs), (gst_wavpack_stream_reader_set_pos_rel), (gst_wavpack_stream_reader_push_back_byte), (gst_wavpack_stream_reader_get_length), (gst_wavpack_stream_reader_can_seek), (gst_wavpack_stream_reader_write_bytes): Improve debugging. 2007-11-20 12:20:38 +0000 Stefan Kost ext/libpng/gstpngdec.*: Don't release the png-memory from within the callback. Original commit message from CVS: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngdec.h: Don't release the png-memory from within the callback. 2007-11-20 12:11:13 +0000 René Stadler ext/libpng/gstpngenc.c: Don't leak buffer data memory. Fixes #498395. Original commit message from CVS: Patch by: René Stadler * ext/libpng/gstpngenc.c: Don't leak buffer data memory. Fixes #498395. 2007-11-20 11:46:28 +0000 René Stadler tests/check/pipelines/simple-launch-lines.c: Tests for #498395. Original commit message from CVS: Patch by: René Stadler * tests/check/pipelines/simple-launch-lines.c: Tests for #498395. 2007-11-20 11:41:13 +0000 Julien Moutte Fix build on Mac OS X 10.5 Original commit message from CVS: 2007-11-20 Julien MOUTTE * ext/taglib/gsttaglibmux.c: (gst_tag_lib_mux_render_tag), (gst_tag_lib_mux_adjust_event_offsets): * gst/qtdemux/qtdemux.c: (qtdemux_parse_theora_extension): * sys/osxaudio/Makefile.am: * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: Fix build on Mac OS X 10.5 2007-11-19 20:30:19 +0000 Stefan Kost gst/equalizer/: Activate preset iface and upload two presets here. Original commit message from CVS: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: Activate preset iface and upload two presets here. 2007-11-16 05:52:55 +0000 David Schleef ext/cairo/gsttextoverlay.c: Change strcasecmp() to g_strcasecmp(). Fixes #497292. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: Change strcasecmp() to g_strcasecmp(). Fixes #497292. 2007-11-15 18:19:19 +0000 Jordi Jaen Pallares gst/rtp/gstrtpmp2tpay.*: Fill the MTU with as many packets as possible. Fixes #491323. Original commit message from CVS: Patch by: Jordi Jaen Pallares * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_class_init), (gst_rtp_mp2t_pay_init), (gst_rtp_mp2t_pay_finalize), (gst_rtp_mp2t_pay_flush), (gst_rtp_mp2t_pay_handle_buffer): * gst/rtp/gstrtpmp2tpay.h: Fill the MTU with as many packets as possible. Fixes #491323. 2007-11-15 17:47:43 +0000 Tommi Myöhänen gst/rtsp/gstrtspsrc.c: Fix some more leaks. Fixes #497007. Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): Fix some more leaks. Fixes #497007. 2007-11-15 17:35:18 +0000 Tommi Myöhänen gst/rtsp/gstrtspsrc.c: Fix 3 pad leaks. Fixes #496983. Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_free), (gst_rtspsrc_stream_configure_tcp): Fix 3 pad leaks. Fixes #496983. 2007-11-15 17:26:25 +0000 Wouter Cloetens Added HTTP source based on libsoup. Fixes #497020. Original commit message from CVS: Patch by: Wouter Cloetens * configure.ac: * ext/Makefile.am: * ext/soup/Makefile.am: * ext/soup/gstsouphttpsrc.c: (_do_init), (gst_souphttp_src_base_init), (gst_souphttp_src_class_init), (gst_souphttp_src_init), (gst_souphttp_src_dispose), (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), (gst_souphttp_src_create), (gst_souphttp_src_start), (gst_souphttp_src_stop), (gst_souphttp_src_unlock), (gst_souphttp_src_set_location), (soup_got_chunk), (soup_response), (soup_session_close), (plugin_init): * ext/soup/gstsouphttpsrc.h: Added HTTP source based on libsoup. Fixes #497020. 2007-11-15 17:01:32 +0000 Tommi Myöhänen gst/rtp/gstrtph264depay.c: Fix small leak. Fixes #497017. Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): Fix small leak. Fixes #497017. 2007-11-15 16:31:32 +0000 Wim Taymans gst/qtdemux/: Add suppport for theora in quicktime according to XiphQT. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_prepare_current_sample), (gst_qtdemux_loop_state_movie), (qtdemux_parse_theora_extension), (qtdemux_parse_node), (qtdemux_parse_trak), (qtdemux_video_caps): * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: Add suppport for theora in quicktime according to XiphQT. 2007-11-15 12:22:10 +0000 Edgard Lima * ChangeLog: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2src_calls.c: Always copy buffers by default (handle safer with bugged drivers) and added a property to make it possible to use mma... Original commit message from CVS: Always copy buffers by default (handle safer with bugged drivers) and added a property to make it possible to use mmap effectively (no copy if possible) when application wants to. Fixes: #480557. 2007-11-14 21:39:47 +0000 Tim-Philipp Müller gst/id3demux/: We don't want the same string multiple times in a tag list for the same tag ever, for any tag, not jus... Original commit message from CVS: * gst/id3demux/id3tags.c: * gst/id3demux/id3tags.h: * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): We don't want the same string multiple times in a tag list for the same tag ever, for any tag, not just for GST_TAG_GENRE, so make sure this doesn't happen and remove special-case code for GST_TAG_GENRE. 2007-11-14 21:04:12 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: Write GST_TAG_MUSICBRAINZ_DISCID and GST_TAG_CDDA_CDDB_DISCID into ID3v2 TXXX frames (fixe... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: (add_musicbrainz_tag), (add_funcs): Write GST_TAG_MUSICBRAINZ_DISCID and GST_TAG_CDDA_CDDB_DISCID into ID3v2 TXXX frames (fixes #347848). 2007-11-14 20:34:24 +0000 Tim-Philipp Müller gst/rtsp/gstrtspsrc.c: Don't leak sdp message contents (fixes #496773). Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): Don't leak sdp message contents (fixes #496773). * gst/udp/gstudpsink.c: (gst_udpsink_finalize): Don't leak URI string. 2007-11-14 19:10:37 +0000 Julien Puydt ext/raw1394/: Implement GstPropertyProbe interface and add "device-name" property, so applications can use this to pr... Original commit message from CVS: Patch by: Julien Puydt * ext/raw1394/Makefile.am: * ext/raw1394/gst1394probe.c: (gst_1394_get_guid_array), (gst_1394_property_probe_get_properties), (gst_1394_property_probe_probe_property), (gst_1394_property_probe_needs_probe), (gst_1394_property_probe_get_values), (gst_1394_property_probe_interface_init), (gst_1394_type_add_property_probe_interface): * ext/raw1394/gst1394probe.h: (GST_1394_PROBE_H): * ext/raw1394/gstdv1394src.c: (_do_init), (gst_dv1394src_class_init), (gst_dv1394src_init), (gst_dv1394src_dispose), (gst_dv1394src_set_property), (gst_dv1394src_get_property), (gst_dv1394src_discover_avc_node), (gst_dv1394src_query), (gst_dv1394src_update_device_name): * ext/raw1394/gstdv1394src.h: Implement GstPropertyProbe interface and add "device-name" property, so applications can use this to probe for available devices in the same way they can already with v4lsrc and v4l2src (however horrible this property probe interface may be). Fixes #358841. 2007-11-14 17:03:18 +0000 Sebastian Dröge tests/check/elements/spectrum.c: Fix spectrum unit test for the latest spectrum changes. Original commit message from CVS: * tests/check/elements/spectrum.c: (GST_START_TEST): Fix spectrum unit test for the latest spectrum changes. 2007-11-14 15:29:05 +0000 Tommi Myöhänen gst/rtsp/gstrtspsrc.c: Don't leak event, don't leak range (fixes #496752). Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_event), (gst_rtspsrc_parse_range): Don't leak event, don't leak range (fixes #496752). 2007-11-14 10:22:41 +0000 Arek Korbik gst/alpha/gstalphacolor.c: Detect RGBA/BGRA correctly on little endian systems. Original commit message from CVS: Patch by: Arek Korbik * gst/alpha/gstalphacolor.c: (gst_alpha_color_set_caps): Detect RGBA/BGRA correctly on little endian systems. 2007-11-13 17:19:13 +0000 Tim-Philipp Müller sys/v4l2/v4l2src_calls.c: but the corresponding ioctl() call fails even though the driver claims to support this form... Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format): If VIDIOC_ENUM_FRAMESIZES is defined (= recent kernel), but the corresponding ioctl() call fails even though the driver claims to support this format, just fall back to the pre-2.6.19 kernel routine that creates caps with suitable height and width ranges (see #448278). 2007-11-13 17:01:07 +0000 Mark Nauwelaerts gst/matroska/: Extract palette data for dvd subpicture streams and send it downstream as custom gstreamer dvd event (... Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/matroska/matroska-demux.c: (gst_matroska_demux_push_dvd_clut_change_event), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_subtitle_caps): * gst/matroska/matroska-ids.h: Extract palette data for dvd subpicture streams and send it downstream as custom gstreamer dvd event (fixes #453417). 2007-11-13 14:51:30 +0000 Tim-Philipp Müller ext/cairo/gsttextoverlay.c: Implement minimal parsing of the passed pango font description string, so passing a font ... Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_font_init): Implement minimal parsing of the passed pango font description string, so passing a font size works the same as with the pango textoverlay plugin; fixes #455086. (Maybe we could just use pangocairo here at some point). 2007-11-13 06:55:28 +0000 Stefan Kost gst/: Return the result in _activate_pull(). Don't ref element there. Original commit message from CVS: * gst/avi/gstavidemux.c: * gst/wavparse/gstwavparse.c: Return the result in _activate_pull(). Don't ref element there. 2007-11-13 06:23:51 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Ref the element when we should, but not when we its not needed. Reflow the event_handling... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event): Ref the element when we should, but not when we its not needed. Reflow the event_handling to not leak the event. 2007-11-12 21:07:31 +0000 René Stadler gst/replaygain/rganalysis.c: Avoid slowdown from denormals when processing near-silence input data. Original commit message from CVS: Patch by: René Stadler * gst/replaygain/rganalysis.c: (yule_filter): Avoid slowdown from denormals when processing near-silence input data. Spotted by Gabriel Bouvigne. Fixes #494499. 2007-11-12 17:59:40 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Properly free QTDemuxSamples array. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (qtdemux_parse_samples): Properly free QTDemuxSamples array. Protect table write with a sensible check, some files apparently DO contain stts values starting with 0 :( 2007-11-12 17:21:59 +0000 Stefan Kost gst/: Drop EOS in _handle_src_event(). Fix the refcount in qtdemux that previous commit messed up. Original commit message from CVS: * gst/avi/gstavidemux.c: * gst/qtdemux/qtdemux.c: Drop EOS in _handle_src_event(). Fix the refcount in qtdemux that previous commit messed up. 2007-11-12 17:06:32 +0000 Stefan Kost gst/: Sync _handle_src_event() with oggdemux. In avidemux also ref the element when we should, but not when we its no... Original commit message from CVS: * gst/avi/gstavidemux.c: * gst/qtdemux/qtdemux.c: Sync _handle_src_event() with oggdemux. In avidemux also ref the element when we should, but not when we its not needed. 2007-11-11 21:12:10 +0000 Sebastian Dröge gst/: Change the meaning of the magnitude values given in the Original commit message from CVS: * gst/equalizer/demo.c: (draw_spectrum): * gst/spectrum/demo-audiotest.c: (draw_spectrum): * gst/spectrum/demo-osssrc.c: (draw_spectrum): * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): Change the meaning of the magnitude values given in the GstMessages by spectrum to decibel instead of decibel+threshold. 2007-11-11 13:55:27 +0000 Sebastian Dröge gst/equalizer/: And continue to update docs. Also include some sample code for the n-band equalizer in the docs. Original commit message from CVS: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: * gst/equalizer/gstiirequalizernbands.c: And continue to update docs. Also include some sample code for the n-band equalizer in the docs. 2007-11-11 12:54:31 +0000 Sebastian Dröge gst/equalizer/: Update docs and property ranges to the real values. Original commit message from CVS: * gst/equalizer/gstiirequalizer10bands.c: (gst_iir_equalizer_10bands_class_init): * gst/equalizer/gstiirequalizer3bands.c: (gst_iir_equalizer_3bands_class_init): * gst/equalizer/gstiirequalizernbands.c: Update docs and property ranges to the real values. 2007-11-09 17:27:00 +0000 Sebastian Dröge gst/spectrum/gstspectrum.c: Now do the scaling right for real. Also initialize a previously uninitialized variable. Original commit message from CVS: * gst/spectrum/gstspectrum.c: Now do the scaling right for real. Also initialize a previously uninitialized variable. 2007-11-08 15:56:46 +0000 Stefan Kost gst/equalizer/demo.c: Make default volume a bit less. Improve layout by giving more space to the slider with big-numb... Original commit message from CVS: * gst/equalizer/demo.c: Make default volume a bit less. Improve layout by giving more space to the slider with big-numbers and enable fill. 2007-11-08 15:00:40 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Return FALSE if we can't handle a query instead of changing the format. Ignore fact when ... Original commit message from CVS: * gst/wavparse/gstwavparse.c: Return FALSE if we can't handle a query instead of changing the format. Ignore fact when dealing with mpeg audio. 2007-11-06 12:23:35 +0000 Sebastian Dröge gst/spectrum/demo-audiotest.c: Use autoaudiosink instead of alsasink and use a sine wave. Original commit message from CVS: * gst/spectrum/demo-audiotest.c: (main): Use autoaudiosink instead of alsasink and use a sine wave. * gst/spectrum/gstspectrum.c: Fix the magnitude calculation. 2007-11-03 19:50:11 +0000 Sebastian Dröge gst/equalizer/: Allow setting 0 as bandwidth and handle this correctly. Original commit message from CVS: * gst/equalizer/demo.c: (main): * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_class_init), (setup_filter): Allow setting 0 as bandwidth and handle this correctly. Also handle a bandwidth of rate/2 properly. * gst/equalizer/gstiirequalizernbands.c: (gst_iir_equalizer_nbands_class_init): Make it possible to generate a N-band equalizer with 1 bands. The previous limit of 2 was caused by a nowadays replaced calculation doing a division by zero if number of bands was 1. 2007-11-02 21:16:09 +0000 Ole André Vadla Ravnås Fix includes for MSVC and GLib-2.14.0 (#492388). Original commit message from CVS: Patch by: Ole André Vadla Ravnås * configure.ac: * gst/udp/gstdynudpsink.c: * gst/udp/gstdynudpsink.h: * gst/udp/gstmultiudpsink.c: * gst/udp/gstmultiudpsink.h: * gst/udp/gstudpsink.c: * gst/udp/gstudpsink.h: Fix includes for MSVC and GLib-2.14.0 (#492388). * gst/udp/gstudpsrc.c: (gst_udpsrc_start): No more pipe define since GLib-2.14.0, need to use _pipe() directly. 2007-11-02 17:23:43 +0000 Edward Hervey gst/law/mulaw-decode.*: Calculate outgoing buffer duration if incoming buffer didn't have a valid duration. Original commit message from CVS: * gst/law/mulaw-decode.c: (mulawdec_sink_setcaps), (gst_mulawdec_chain): * gst/law/mulaw-decode.h: Calculate outgoing buffer duration if incoming buffer didn't have a valid duration. 2007-10-30 21:37:49 +0000 Sebastian Dröge gst/equalizer/: Add small demo application based on the spectrum demo applications that gets white noise as input, pu... Original commit message from CVS: * gst/equalizer/Makefile.am: * gst/equalizer/demo.c: (on_window_destroy), (on_configure_event), (on_gain_changed), (on_bandwidth_changed), (on_freq_changed), (draw_spectrum), (message_handler), (main): Add small demo application based on the spectrum demo applications that gets white noise as input, pushes it through an equalizer and paints the spectrum. For every equalizer band it's possible to set gain, bandwidth and frequency. * gst/equalizer/gstiirequalizer.c: (setup_filter): Add some guarding against too large or too small frequencies and bandwidths. Also improve debugging a bit. 2007-10-30 21:18:45 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Replace filters with a bit better filters for which we can actually find documentati... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_band_get_property), (gst_iir_equalizer_band_class_init), (arg_to_scale), (setup_filter), (gst_iir_equalizer_compute_frequencies): Replace filters with a bit better filters for which we can actually find documentation, which don't change anything on zero gain, etc. Make the frequency property of the bands writable, rename the band-width property to bandwidth and change the meaning to the frequency difference between bandedges, change the meaning of the gain property to dB instead of a weird scale between -1 and 1 that has no real meaning. 2007-10-30 12:29:46 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Smarter combine_flow code that also deals with downstream elements returning UNEXPECTED when t... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), (gst_qtdemux_combine_flows), (gst_qtdemux_loop_state_movie): Smarter combine_flow code that also deals with downstream elements returning UNEXPECTED when they receive data out of the segment boundaries. Fixes #491305. 2007-10-27 16:04:48 +0000 Tim-Philipp Müller gst/interleave/interleave.c: Let's not call every request pad we create "sink%d", that'll create problems if there's ... Original commit message from CVS: * gst/interleave/interleave.c: (gst_interleave_request_new_pad): Let's not call every request pad we create "sink%d", that'll create problems if there's to be more than one pad. Fixes #490682. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/interleave.c: Add unit test for the above. 2007-10-26 15:03:06 +0000 Tim-Philipp Müller sys/v4l2/v4l2src_calls.c: Fix 'unused variable' compiler warning when compiling against older kernel headers. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: Fix 'unused variable' compiler warning when compiling against older kernel headers. 2007-10-26 12:10:43 +0000 Christian Schaller * gst-plugins-good.spec.in: update spec file Original commit message from CVS: update spec file 2007-10-25 23:42:52 +0000 David Schleef Improve documentation, write some tests for multifilesrc/sink for upcoming ->good review. Original commit message from CVS: * gst/multifile/Makefile.am: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * tests/check/Makefile.am: * tests/check/elements/multifile.c: Improve documentation, write some tests for multifilesrc/sink for upcoming ->good review. 2007-10-25 15:00:15 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc (add_funcs): Map new SORTNAME tags to ID3v2 TSOP, TSOA and TSOT frames (#414539). Original commit message from CVS: * ext/taglib/gstid3v2mux.cc (add_funcs): Map new SORTNAME tags to ID3v2 TSOP, TSOA and TSOT frames (#414539). 2007-10-24 07:01:47 +0000 Stefan Kost tests/check/pipelines/simple-launch-lines.c: Improve the tests a little more. Original commit message from CVS: * tests/check/pipelines/simple-launch-lines.c: Improve the tests a little more. 2007-10-23 08:38:50 +0000 Yun Zheng Hu sys/osxaudio/gstosxaudiosrc.c: Use default input device instead of default output device and only memcpy actual avail... Original commit message from CVS: patch by: Yun Zheng Hu * sys/osxaudio/gstosxaudiosrc.c: Use default input device instead of default output device and only memcpy actual available bytes. 2007-10-22 19:14:08 +0000 Edgard Lima sys/v4l2/v4l2src_calls.c: Fixes "v4l2src ! queue ! xvimagesink". The queue ask for buffer too early. It is temporary ... Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_grab_frame): Fixes "v4l2src ! queue ! xvimagesink". The queue ask for buffer too early. It is temporary until we find something better. 2007-10-22 16:44:48 +0000 Tommi Myöhänen gst/rtsp/gstrtspsrc.c: Fix race when pausing a RTSP stream in interleaved. Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved): Fix race when pausing a RTSP stream in interleaved. Fixes #475784. 2007-10-22 09:53:16 +0000 Peter Kjellerstedt gst/rtp/gstrtpmp4vpay.c: Use correct unref function for buffers. #488844. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_finalize): Use correct unref function for buffers. #488844. 2007-10-19 19:33:16 +0000 Stefan Kost Add some debug and sync tests with the fix. Original commit message from CVS: * gst/avi/gstavimux.c: * tests/check/elements/avimux.c: Add some debug and sync tests with the fix. 2007-10-18 17:04:14 +0000 Laurent Glayal gst/udp/gstudpsrc.c: When the socket is used by the app for other purposes, don't generate an error if there is activ... Original commit message from CVS: Based on patch by: Laurent Glayal * gst/udp/gstudpsrc.c: (gst_udpsrc_create): When the socket is used by the app for other purposes, don't generate an error if there is activaty on the socket that is not data related. Fixes #487488. 2007-10-18 14:55:38 +0000 Wim Taymans sys/v4l2/v4l2src_calls.c: Add some more debug info. Generate an error when we run out of buffers for some reason. See... Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize), (gst_v4l2src_grab_frame): Add some more debug info. Generate an error when we run out of buffers for some reason. See #480557. 2007-10-18 08:27:56 +0000 Anders Skargren gst/rtp/gstrtph264pay.c: Set marker bit correctly. Original commit message from CVS: Patch by: Anders Skargren * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_handle_buffer): Set marker bit correctly. 2007-10-18 06:20:21 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.c: Add a missing break. Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property): Add a missing break. 2007-10-18 06:14:42 +0000 Sebastian Dröge gst/equalizer/gstiirequalizer.*: Move bandwidth property to the separate bands and add float64 support. Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_band_get_property), (gst_iir_equalizer_band_class_init), (gst_iir_equalizer_band_init), (gst_iir_equalizer_band_get_type), (gst_iir_equalizer_class_init), (setup_filter), (gst_iir_equalizer_setup): * gst/equalizer/gstiirequalizer.h: Move bandwidth property to the separate bands and add float64 support. 2007-10-17 15:08:02 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Use allowed name for the GstStructure. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): Use allowed name for the GstStructure. 2007-10-17 11:47:23 +0000 Tim-Philipp Müller Use new gst_bus_pop_filtered(). Original commit message from CVS: * ext/gconf/gstswitchsink.c: * gst/autodetect/gstautoaudiosink.c: Use new gst_bus_pop_filtered(). 2007-10-13 12:03:44 +0000 Tim-Philipp Müller sys/v4l2/: When probing the formats and sizes a camera supports, make sure the best ones (highest resolution, prefere... Original commit message from CVS: * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: When probing the formats and sizes a camera supports, make sure the best ones (highest resolution, prefered format) end up at the beginning of the probed caps and the less desirable ones at the end. This is important because the order within the caps matters for things like fixation and negotiation, ie. what format is chosen in the end. With recent kernels, the current probing code will end up querying the supported sizes from lowest resolution to highest resolution, adding them to the probed caps in that order, resulting to v4l2src fixating to the lowest possible resolution if downstream does not express a size preference. Also make up a somewhat random ranking of prefered output formats for the same reason. Fixes #485828. 2007-10-11 17:55:29 +0000 Jason Kivlighn gst/id3demux/id3v2frames.c: Extract license/copyright URIs from ID3v2 WCOP frames (Fixes #447000). Original commit message from CVS: Based on patch by: Jason Kivlighn * gst/id3demux/id3v2frames.c: Extract license/copyright URIs from ID3v2 WCOP frames (Fixes #447000). * tests/check/elements/id3demux.c: * tests/files/Makefile.am: * tests/files/id3-447000-wcop.tag: Add simple unit test. 2007-10-11 16:41:44 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: Add support for license/copyright URI tags (ID3v2 WCOP frame). Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Add support for license/copyright URI tags (ID3v2 WCOP frame). Prerequisite for #447000. 2007-10-08 17:44:42 +0000 Jan Schmidt gst/rtsp/gstrtspsrc.c: Fix compiler warning by using GST_CLOCK_TIME_NONE to initialise a GstClockTime. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush): Fix compiler warning by using GST_CLOCK_TIME_NONE to initialise a GstClockTime. 2007-10-08 11:58:51 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: More seeking fixes, mostly passing around the new playback segment in order to configure it pr... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush), (gst_rtspsrc_do_seek), (gst_rtspsrc_perform_seek), (gst_rtspsrc_configure_caps), (gst_rtspsrc_loop_udp), (gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_change_state): More seeking fixes, mostly passing around the new playback segment in order to configure it properly. Also reset base_time of udp sources when setting them back to PLAYING as a temporary hack until core supports seek in live sources properly. 2007-10-08 10:34:03 +0000 Wim Taymans gst/rtp/gstrtpmp4adepay.c: Fix caps as to not confuse autopluggers. Original commit message from CVS: * gst/rtp/gstrtpmp4adepay.c: Fix caps as to not confuse autopluggers. 2007-10-06 16:13:14 +0000 Tim-Philipp Müller gst/id3demux/: Port ID3 tag demuxer over to the new GstTagDemux in -base (now would be a good time to test re-importi... Original commit message from CVS: * gst/id3demux/gstid3demux.c: * gst/id3demux/gstid3demux.h: * gst/id3demux/id3tags.c: * gst/id3demux/id3tags.h: * gst/id3demux/id3v2frames.c: Port ID3 tag demuxer over to the new GstTagDemux in -base (now would be a good time to test re-importing your music collection). 2007-10-06 15:13:09 +0000 Tim-Philipp Müller gst/apetag/: Port APE tag demuxer over to the new GstTagDemux in -base. Original commit message from CVS: * gst/apetag/Makefile.am: * gst/apetag/gstapedemux.c: * gst/apetag/gstapedemux.h: * gst/apetag/gsttagdemux.c: * gst/apetag/gsttagdemux.h: Port APE tag demuxer over to the new GstTagDemux in -base. 2007-10-05 13:18:19 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Improve flushing behaviour. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush), (gst_rtspsrc_perform_seek), (gst_rtspsrc_handle_src_event), (gst_rtspsrc_handle_internal_src_query), (gst_rtspsrc_handle_src_query), (new_session_pad), (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_loop_send_cmd): Improve flushing behaviour. Set state of the udp sources to PAUSE/PLAYING correctly. Handle events and queries for UDP and TCP transport now. 2007-10-04 07:29:48 +0000 Stefan Kost gst/rtp/: Add log category. Original commit message from CVS: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: Add log category. 2007-10-04 07:24:02 +0000 Timo Hotti tests/check/: Add unit tests for payloaders/depayloaders. Original commit message from CVS: Patch by: Timo Hotti * tests/check/Makefile.am: * tests/check/pipelines/simple-launch-lines.c: Add unit tests for payloaders/depayloaders. 2007-10-02 10:49:03 +0000 Stefan Kost gst/avi/gstavimux.*: Also save codec data for audio streams. Fixes #482495. Original commit message from CVS: * gst/avi/gstavimux.c: * gst/avi/gstavimux.h: Also save codec data for audio streams. Fixes #482495. 2007-10-02 10:23:04 +0000 Stefan Kost gst/avi/gstavimux.c: Fix "Index entry has invalid stream nr 1". Original commit message from CVS: * gst/avi/gstavimux.c: Fix "Index entry has invalid stream nr 1". Add support for muxing aac - work in progress (see #482495). 2007-10-01 16:34:56 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Parse bandwidth modifiers, they are not yet configured in the session manager because we don't... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_bandwidth), (gst_rtspsrc_collect_bandwidth), (gst_rtspsrc_create_stream), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_loop_interleaved): * gst/rtsp/gstrtspsrc.h: Parse bandwidth modifiers, they are not yet configured in the session manager because we don't have an API for that yet. 2007-10-01 13:57:28 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Use shiny new function in -base to get the default clock-rate. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_loop_interleaved): Use shiny new function in -base to get the default clock-rate. Update some docs. 2007-09-29 12:50:36 +0000 Sébastien Moutte win32/MANIFEST: Add files to win32 manifest. Original commit message from CVS: * win32/MANIFEST: Add files to win32 manifest. * win32/vs6/libgstaudiofx.dsp: * win32/vs6/libgstqtdemux.dsp: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: Update project files. 2007-09-28 14:56:19 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: In TCP mode, only timestamp the first buffer. TCP is not real time and it does not make sense ... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_play): * gst/rtsp/gstrtspsrc.h: In TCP mode, only timestamp the first buffer. TCP is not real time and it does not make sense to try to skew compensate, also some servers send the first batch of data in a burst. 2007-09-27 15:00:30 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Fix setting the discont flag on the first buffer pushed downstream for formats with pr... Original commit message from CVS: * gst/matroska/matroska-demux.c: Fix setting the discont flag on the first buffer pushed downstream for formats with private codec data that needs to be deserialised into buffers (such as vorbis and FLAC when in a matroska container). 2007-09-27 11:10:12 +0000 Antoine Tremblay gst/rtp/gstrtpmp4vpay.*: Free the config string. Fixes #480707. Original commit message from CVS: Patch by: Antoine Tremblay * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_init), (gst_rtp_mp4v_pay_finalize), (gst_rtp_mp4v_pay_flush), (gst_rtp_mp4v_pay_handle_buffer): * gst/rtp/gstrtpmp4vpay.h: Free the config string. Fixes #480707. Clean up the timestamp code a little. 2007-09-26 20:12:52 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Set timestamps on RTP buffers in interleaved mode. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), (gst_rtspsrc_handle_src_query), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_close): * gst/rtsp/gstrtspsrc.h: Set timestamps on RTP buffers in interleaved mode. Mark first buffers with a DISCONT. Remove flush hack now that sync for live sources has been figured out. 2007-09-26 14:28:20 +0000 Wim Taymans gst/udp/gstudpsrc.c: Update documentation. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Update documentation. 2007-09-26 14:26:39 +0000 Wim Taymans gst/qtdemux/gstrtpxqtdepay.*: Fail if we don't know the quicktime format. Original commit message from CVS: * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), (gst_rtp_xqt_depay_change_state): * gst/qtdemux/gstrtpxqtdepay.h: Fail if we don't know the quicktime format. 2007-09-26 13:19:17 +0000 Tim-Philipp Müller ext/flac/gstflacenc.*: Save the flow return from the last gst_pad_push() and make sure we pass the right flow return ... Original commit message from CVS: * ext/flac/gstflacenc.c: * ext/flac/gstflacenc.h: Save the flow return from the last gst_pad_push() and make sure we pass the right flow return value upstream in the case of failure; minor clean-ups. 2007-09-25 19:09:33 +0000 Tim-Philipp Müller Add support for the new GST_TAG_COMPOSER (#459809). Original commit message from CVS: * ext/taglib/gstapev2mux.cc: * ext/taglib/gstid3v2mux.cc: * gst/apetag/gstapedemux.c: Add support for the new GST_TAG_COMPOSER (#459809). 2007-09-25 17:18:34 +0000 Tim-Philipp Müller gst/law/: Compulsive clean-ups: use boilerplate macros, add debug categories, fix up things to conform to symbol nome... Original commit message from CVS: * gst/law/alaw-decode.c: * gst/law/alaw-decode.h: * gst/law/alaw-encode.c: * gst/law/alaw-encode.h: * gst/law/alaw.c: * gst/law/mulaw-conversion.h: Compulsive clean-ups: use boilerplate macros, add debug categories, fix up things to conform to symbol nomenklatura, etc. 2007-09-25 16:05:29 +0000 Laurent Glayal gst/law/: Use static tables for A-Law decoding and encoding; this makes Original commit message from CVS: Based on patch by: Laurent Glayal * gst/law/alaw-decode.c: * gst/law/alaw-encode.c: Use static tables for A-Law decoding and encoding; this makes A-Law decoding and encoding less CPU-intensive, but increases the binary size a bit. Leaving old code around for now, selectable by a define in the code. Fixes #435435. 2007-09-25 08:51:36 +0000 Sebastian Dröge configure.ac: Use AG_GST_ARG_WITH_PLUGINS, AG_GST_ARG_ENABLE_EXTERNAL and Original commit message from CVS: * configure.ac: Use AG_GST_ARG_WITH_PLUGINS, AG_GST_ARG_ENABLE_EXTERNAL and AG_GST_ARG_ENABLE_EXPERIMENTAL instead of duplicating those macros in configure.ac. 2007-09-25 05:03:58 +0000 Sebastian Dröge gst/qtdemux/qtdemux.c: Add fourccs for MPEG2 HDV streams. Fixes #479960. Original commit message from CVS: Patch by: * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add fourccs for MPEG2 HDV streams. Fixes #479960. 2007-09-24 10:53:36 +0000 Stefan Kost Massive leak fixing, plus code cleanups. Original commit message from CVS: * ext/audioresample/gstaudioresample.c: * ext/x264/gstx264enc.c: * gst/dvdspu/gstdvdspu.c: * gst/dvdspu/gstdvdspu.h: * gst/festival/gstfestival.c: * gst/h264parse/gsth264parse.c: * gst/mpegtsparse/mpegtspacketizer.c: * gst/mpegtsparse/mpegtsparse.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/nuvdemux/gstnuvdemux.c: * sys/dshowsrcwrapper/gstdshowaudiosrc.c: * sys/dshowsrcwrapper/gstdshowvideosrc.c: * sys/vcd/vcdsrc.c: Massive leak fixing, plus code cleanups. 2007-09-23 18:57:14 +0000 Stefan Kost sys/oss/gstosshelper.c: Use GST_WARNING instead of a g_critical. This situation is not caused by the application. Original commit message from CVS: * sys/oss/gstosshelper.c: Use GST_WARNING instead of a g_critical. This situation is not caused by the application. 2007-09-22 18:15:12 +0000 Thomas Vander Stichele po/: Updated translations. Original commit message from CVS: * po/LINGUAS: * po/nl.po: Updated translations. 2007-09-22 18:13:58 +0000 Thomas Vander Stichele po/eu.po: Added Basque translation. Original commit message from CVS: translated by: Mikel Olasagasti * po/eu.po: Added Basque translation. 2007-09-22 18:13:10 +0000 Thomas Vander Stichele po/: Added Chinese (traditional and Hong Kong) translation. Original commit message from CVS: translated by: Abel Cheung * po/zh_HK.po: * po/zh_TW.po: Added Chinese (traditional and Hong Kong) translation. 2007-09-22 18:10:42 +0000 Thomas Vander Stichele po/pl.po: Added Polish translation. Original commit message from CVS: translated by: Jakub Bogusz * po/pl.po: Added Polish translation. 2007-09-22 18:09:59 +0000 Thomas Vander Stichele po/fi.po: Added Finnish translation. Original commit message from CVS: translated by: Ilkka Tuohela * po/fi.po: Added Finnish translation. 2007-09-22 18:09:09 +0000 Thomas Vander Stichele po/es.po: Added Spanish translation. Original commit message from CVS: translated by: Jorge González González * po/es.po: Added Spanish translation. 2007-09-22 18:08:13 +0000 Thomas Vander Stichele po/da.po: Added Danish translation. Original commit message from CVS: translated by: Mogens Jaeger * po/da.po: Added Danish translation. 2007-09-22 18:06:55 +0000 Thomas Vander Stichele po/zh_CN.po: Added Chinese (simplified) translation. Original commit message from CVS: translated by: Funda Wang * po/zh_CN.po: Added Chinese (simplified) translation. 2007-09-22 18:05:37 +0000 Thomas Vander Stichele po/bg.po: Added Bulgarian translation. Original commit message from CVS: translated by: Alexander Shopov * po/bg.po: Added Bulgarian translation. 2007-09-22 08:12:57 +0000 Thomas Vander Stichele * common: * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: fix header and comments Original commit message from CVS: fix header and comments 2007-09-21 11:34:34 +0000 Wim Taymans gst/rtp/gstrtpamrdepay.c: Set outgoing packet duration because we can. Fixes #478244 some more. Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_process): Set outgoing packet duration because we can. Fixes #478244 some more. 2007-09-20 13:35:34 +0000 Stefan Kost ext/cairo/gsttextoverlay.c: Add info about static leak. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: Add info about static leak. * tests/check/Makefile.am: * tests/check/generic/states.c: Improved state change unit test. 2007-09-19 18:19:49 +0000 Stefan Kost Ignore registries in any format. Original commit message from CVS: * docs/plugins/.cvsignore: * tests/check/.cvsignore: Ignore registries in any format. 2007-09-19 16:24:09 +0000 Wim Taymans gst/rtp/gstrtpL16pay.c: Removed some unused code. Original commit message from CVS: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_handle_buffer): Removed some unused code. * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_handle_buffer): * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_handle_buffer): * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_handle_buffer): * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_init_packet), (gst_rtp_theora_pay_flush_packet): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_flush_packet): Try to preserve the incomming buffer duration on the outgoing packets. Fixes #478244. 2007-09-19 10:22:40 +0000 Tim-Philipp Müller ext/taglib/: Work around compiler warnings with g++-4.2 when assigning a string constant to a gchar * (partially fixe... Original commit message from CVS: * ext/taglib/gstapev2mux.cc: * ext/taglib/gstid3v2mux.cc: Work around compiler warnings with g++-4.2 when assigning a string constant to a gchar * (partially fixes #478092). 2007-09-18 16:44:46 +0000 Tim-Philipp Müller configure.ac: We require core CVS now for gst_base_src_set_do_timestamp(). Original commit message from CVS: * configure.ac: We require core CVS now for gst_base_src_set_do_timestamp(). 2007-09-18 13:55:06 +0000 Stefan Kost gst/spectrum/: Handling window resize. Original commit message from CVS: * gst/spectrum/demo-audiotest.c: * gst/spectrum/demo-osssrc.c: Handling window resize. 2007-09-18 11:45:06 +0000 Stefan Kost ChangeLog: Add missing newline. Original commit message from CVS: * ChangeLog: Add missing newline. * gst/librfb/rfbdecoder.c: Fix the build (missing stdlib.h). * gst/spectrum/gstspectrum.c: * gst/spectrum/gstspectrum.h: Use basetransform segment so that it is correctly managed on flushes and start/stop. Report message timestamp as stream time, which is what an application can understand. (Yes these are adapted from wim recent level element changes) 2007-09-17 17:35:13 +0000 Jan Schmidt gst/: Fix compiler warnings shown with Forte. Original commit message from CVS: * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_class_init): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), (new_session_pad), (request_pt_map), (gst_rtspsrc_do_stream_eos), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_handle_message): Fix compiler warnings shown with Forte. 2007-09-17 02:05:14 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Give meaningfull error when all streams failed to configure for some reason. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams), (gst_rtspsrc_dup_printf): Give meaningfull error when all streams failed to configure for some reason. 2007-09-16 19:13:58 +0000 Wim Taymans gst/rtp/README: Update README with the design for synchronisation rules of RTP on sender and receiver. Original commit message from CVS: * gst/rtp/README: Update README with the design for synchronisation rules of RTP on sender and receiver. 2007-09-14 09:40:49 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Don't push EOS from the chain function, the element driving the pipeline is responsible f... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_loop), (gst_wavparse_chain): Don't push EOS from the chain function, the element driving the pipeline is responsible for this. The bug this was meant to fix seems to be queue not forwarding EOS in all cases (see #476514). 2007-09-13 17:31:16 +0000 Wim Taymans gst/level/gstlevel.*: Use basetransform segment so that it is correctly managed on flushes and start/stop. Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_class_init), (gst_level_start), (gst_level_transform_ip): * gst/level/gstlevel.h: Use basetransform segment so that it is correctly managed on flushes and start/stop. Report message timestamp as stream time, which is what an application can understand. 2007-09-13 15:04:15 +0000 Sebastian Dröge Update my mail address. Original commit message from CVS: * ext/taglib/gstapev2mux.cc: * ext/taglib/gstapev2mux.h: * ext/taglib/gsttaglibmux.c: * tests/check/elements/apev2mux.c: Update my mail address. 2007-09-13 12:37:56 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Add EOS logic for the push-based mode too. Fixes #476514. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_eos), (gst_wavparse_loop), (gst_wavparse_chain): Add EOS logic for the push-based mode too. Fixes #476514. 2007-09-12 22:01:59 +0000 Wim Taymans gst/law/: Fix law encoder timestamps. Original commit message from CVS: * gst/law/alaw-encode.c: (gst_alawenc_init), (gst_alawenc_chain): * gst/law/alaw-encode.h: * gst/law/mulaw-encode.c: (gst_mulawenc_init), (gst_mulawenc_chain): * gst/law/mulaw-encode.h: Fix law encoder timestamps. 2007-09-12 09:13:39 +0000 Stefan Kost ext/gconf/gstgconfaudiosink.c: Fix warning when building without debug. Original commit message from CVS: * ext/gconf/gstgconfaudiosink.c: Fix warning when building without debug. * sys/oss/gstossmixertrack.c: Use const like in alsamixertrack.c (fixes warnings). 2007-09-12 08:38:21 +0000 Peter Kjellerstedt gst/: Printf format fixes (#476128). Original commit message from CVS: Patch by: Peter Kjellerstedt * gst-libs/gst/app/gstappsink.c: * gst/flv/gstflvdemux.c: * gst/flv/gstflvparse.c: * gst/interleave/deinterleave.c: * gst/switch/gstswitch.c: Printf format fixes (#476128). 2007-09-11 15:37:55 +0000 Wim Taymans sys/v4l2/v4l2src_calls.c: Fix framerate detection code some more. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format_and_size): Fix framerate detection code some more. Handle the case where there is a weird step in the stepwise framerates. Don't overwrite the min interval with the framerate, use a temp variable instead. Use max in the Continuous framerate intervals instead of step, which is 1 according to the docs. Fixes #475424. 2007-09-10 19:53:28 +0000 Wim Taymans gst/udp/gstudpsrc.c: Make udpsrc timestamp outgoing buffers based on when they were received. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create): Make udpsrc timestamp outgoing buffers based on when they were received. Also make it output a segment in time. 2007-09-10 06:49:32 +0000 Stefan Kost gst/avi/gstavidemux.c: Plug a little leak. Little code cleanups. Original commit message from CVS: * gst/avi/gstavidemux.c: Plug a little leak. Little code cleanups. 2007-09-09 18:08:36 +0000 Tim-Philipp Müller configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for old flac versions, 's good for cross-compilation ... Original commit message from CVS: * configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for old flac versions, 's good for cross-compilation karma. 2007-09-07 18:04:41 +0000 Haakon Sporsheim gst/rtp/gstrtph263pay.c: Fix up header structure so that compilers don't add padding between the structure fields, si... Original commit message from CVS: Patch by: Haakon Sporsheim * gst/rtp/gstrtph263pay.c: Fix up header structure so that compilers don't add padding between the structure fields, since that would lead to us sending RTP packets with broken headers (as is currently the case when compiling with MSVC). Also see similar fixes in libgstrtp in gst-plugins-base. (#474616; #471194) 2007-09-07 16:04:14 +0000 Wim Taymans sys/v4l2/v4l2src_calls.c: Don't overwrite our GValue with 0 but instead use the previously computed value. Fixes #471... Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format_and_size): Don't overwrite our GValue with 0 but instead use the previously computed value. Fixes #471823 some more. 2007-09-07 15:54:38 +0000 Sebastian Dröge gst/spectrum/gstspectrum.c: Use the correct parameter order for the memset calls. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_start), (gst_spectrum_transform_ip): Use the correct parameter order for the memset calls. Thanks to Christian Schaller for noticing. 2007-09-06 12:00:36 +0000 Tim-Philipp Müller docs/plugins/gst-plugins-good-plugins.hierarchy: No tabs in this file please, or gtk-doc will end up documenting rath... Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins.hierarchy: No tabs in this file please, or gtk-doc will end up documenting rather absurd class hierarchies. 2007-09-06 10:48:56 +0000 Tim-Philipp Müller ext/gconf/gstswitchsink.c: If the new kid element fails to change state for some reason forward the error message it ... Original commit message from CVS: * ext/gconf/gstswitchsink.c: If the new kid element fails to change state for some reason (e.g. esdsink not being able to connect to the sound server), forward the error message it posted on the bus instead of just posting a generic 'Internal state change error: please file a bug' error message. Fixes #471364. 2007-09-06 07:21:22 +0000 Sebastian Dröge Port GstSpectrum to GstAudioFilter and libgstfft, add support for int32, float and double, use floats for the message... Original commit message from CVS: * configure.ac: * gst/spectrum/Makefile.am: * gst/spectrum/demo-audiotest.c: (draw_spectrum), (message_handler), (main): * gst/spectrum/demo-osssrc.c: (draw_spectrum), (message_handler): * gst/spectrum/gstspectrum.c: (gst_spectrum_base_init), (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_dispose), (gst_spectrum_set_property), (gst_spectrum_get_property), (gst_spectrum_start), (gst_spectrum_setup), (gst_spectrum_message_new), (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: Port GstSpectrum to GstAudioFilter and libgstfft, add support for int32, float and double, use floats for the message contents, average all FFTs done in one interval for better results, use a better windowing function, allow posting the phase in the message and actually do an FFT with the requested number of bands instead of interpolating. * tests/check/elements/spectrum.c: (GST_START_TEST), (spectrum_suite): Improve the units tests by checking for a 11025Hz sine wave and add unit tests for all 4 supported sample types. 2007-09-05 16:23:21 +0000 Tim-Philipp Müller gst/qtdemux/: Don't assume tags are encoded as UTF-8 (#473670). Original commit message from CVS: * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: Don't assume tags are encoded as UTF-8 (#473670). 2007-09-05 14:43:16 +0000 Tim-Philipp Müller sys/v4l2/: Implement LATENCY queries in the crudest way possible so I don't have to use sync=false any longer when te... Original commit message from CVS: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/v4l2src_calls.c: Implement LATENCY queries in the crudest way possible so I don't have to use sync=false any longer when testing with videosinks. 2007-09-05 09:25:23 +0000 Tim-Philipp Müller configure.ac: Fix build. Original commit message from CVS: * configure.ac: Fix build. 2007-09-05 00:12:46 +0000 Wim Taymans sys/v4l2/v4l2src_calls.c: Add some more debugging in the framerate function. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format_and_size): Add some more debugging in the framerate function. Iterate stepwise framerate up to and _including_ the max and if nothing was added to the list, add a dummy 0/1 to 100/1 framerate so that we don't end up with an empty list. 2007-09-04 22:42:21 +0000 Wim Taymans gst/udp/gstmultiudpsink.c: Add property do configure destination address/port pairs Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_set_clients_string), (gst_multiudpsink_get_clients_string), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add_internal), (gst_multiudpsink_add), (gst_multiudpsink_clear_internal), (gst_multiudpsink_clear): Add property do configure destination address/port pairs API:GstMultiUDPSink::clients 2007-09-04 18:30:22 +0000 Wim Taymans tests/examples/: Added some RTP example scripts for sending and receiving RTP streams. Original commit message from CVS: * tests/examples/Makefile.am: * tests/examples/rtp/Makefile.am: * tests/examples/rtp/client-H263p-AMR.sh: * tests/examples/rtp/client-H263p-PCMA.sdp: * tests/examples/rtp/client-H263p-PCMA.sh: * tests/examples/rtp/client-H264-PCMA.sdp: * tests/examples/rtp/client-H264-PCMA.sh: * tests/examples/rtp/client-PCMA.sh: * tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh: * tests/examples/rtp/server-alsasrc-PCMA.sh: * tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh: * tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh: Added some RTP example scripts for sending and receiving RTP streams. 2007-09-04 16:40:05 +0000 Wim Taymans sys/v4l2/gstv4l2src.c: Restructure the setcaps function so that we can also compute the expected GStreamer output siz... Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2_get_caps_info), (gst_v4l2src_set_caps), (gst_v4l2src_get_mmap): Restructure the setcaps function so that we can also compute the expected GStreamer output size of the video frames. Set frame_byte_size correctly so that read-based devices have a chance of working correctly. When grabbing a frame, discard frames that are not of the expected size. Some cameras don't output the right framesize for the first buffer. Try only a couple of times to get a valid frame, else error out. * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_get_input): Add some more debug info when scanning the device. * sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_new), (gst_v4l2_buffer_pool_new), (gst_v4l2_buffer_pool_activate), (gst_v4l2src_fill_format_list), (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init): Add some more debug info when dequeing a frame. 2007-09-04 14:37:22 +0000 Stefan Kost gst/wavparse/gstwavparse.c: More code cleanups. Add some more comment and improve debugs logs. Original commit message from CVS: * gst/wavparse/gstwavparse.c: More code cleanups. Add some more comment and improve debugs logs. 2007-09-04 07:58:36 +0000 Stefan Kost gst/wavparse/gstwavparse.*: Implement seek-query. Refactor duration calculations. Appropriate use of uint64_scale_int... Original commit message from CVS: * gst/wavparse/gstwavparse.c: * gst/wavparse/gstwavparse.h: Implement seek-query. Refactor duration calculations. Appropriate use of uint64_scale_int and uint64_scale. Move repeadedly calculated stuff out of loops. 2007-09-03 07:44:34 +0000 Stefan Kost gst/avi/gstavidemux.c: Implement seek-query. Original commit message from CVS: * gst/avi/gstavidemux.c: Implement seek-query. 2007-08-29 21:43:08 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Use new basesink async property to make sparse RTCP packet not wait for preroll. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_dup_printf): Use new basesink async property to make sparse RTCP packet not wait for preroll. 2007-08-27 14:44:19 +0000 Jan Schmidt gst/audiofx/Makefile.am: Dist the right file. Original commit message from CVS: * gst/audiofx/Makefile.am: Dist the right file. 2007-08-23 16:27:36 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Make sure we generate and parse floating point values in the POSIX locale instead of the curre... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_dup_printf), (gst_rtspsrc_get_float), (gst_rtspsrc_play): Make sure we generate and parse floating point values in the POSIX locale instead of the current locale. 2007-08-22 15:01:29 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Fix method detection again. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_do_seek), (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), (gst_rtspsrc_play): * gst/rtsp/gstrtspsrc.h: Fix method detection again. Keep track of when we must send a Range header. Use segment values for Range, Speed and Scale headers. Parse Speed and Scale headers to update the segment values. 2007-08-22 08:22:50 +0000 Mark Nauwelaerts sys/v4l2/v4l2src_calls.c: Handle optional v4l2 ioctls gracefully. Original commit message from CVS: patch by: Mark Nauwelaerts * sys/v4l2/v4l2src_calls.c: Handle optional v4l2 ioctls gracefully. 2007-08-20 16:52:03 +0000 Wim Taymans gst/rtp/: Added an H263 depayloader. Fixes #369392. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_base_init), (gst_rtp_h263_depay_class_init), (gst_rtp_h263_depay_init), (gst_rtp_h263_depay_finalize), (gst_rtp_h263_depay_setcaps), (gst_rtp_h263_depay_process), (gst_rtp_h263_depay_set_property), (gst_rtp_h263_depay_get_property), (gst_rtp_h263_depay_change_state), (gst_rtp_h263_depay_plugin_init): * gst/rtp/gstrtph263depay.h: Added an H263 depayloader. Fixes #369392. * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), (gst_rtp_h263p_depay_process): * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_flush): Make the H263+ pay/depayloader support H263-1998 and H263-2000 payloads. Also alow plain H263 on the h263p payloaders. Fixes #465040. 2007-08-19 19:16:33 +0000 Sebastian Dröge gst/filter/: Add small comparision with the chebyshev filters in the docs. Original commit message from CVS: * gst/filter/gstbpwsinc.c: * gst/filter/gstlpwsinc.c: Add small comparision with the chebyshev filters in the docs. 2007-08-19 19:11:04 +0000 Sebastian Dröge gst/audiofx/: Add small comparision with the windowed sinc filters in the docs. Original commit message from CVS: * gst/audiofx/audiochebyshevfreqband.c: * gst/audiofx/audiochebyshevfreqlimit.c: Add small comparision with the windowed sinc filters in the docs. 2007-08-19 19:01:45 +0000 Sebastian Dröge tests/check/elements/: Also test everything in 32 bit float mode. Original commit message from CVS: * tests/check/elements/bpwsinc.c: (GST_START_TEST), (bpwsinc_suite): * tests/check/elements/lpwsinc.c: (GST_START_TEST), (lpwsinc_suite): Also test everything in 32 bit float mode. 2007-08-19 18:47:19 +0000 Sebastian Dröge tests/check/elements/: Also test 32 bit float mode and the type 2 variants of the filters. Original commit message from CVS: * tests/check/elements/audiochebyshevfreqband.c: (GST_START_TEST), (audiochebyshevfreqband_suite): * tests/check/elements/audiochebyshevfreqlimit.c: (GST_START_TEST), (audiochebyshevfreqlimit_suite): Also test 32 bit float mode and the type 2 variants of the filters. 2007-08-18 19:44:55 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Refactor the udp and interleaved loop function a bit. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_loop): Refactor the udp and interleaved loop function a bit. 2007-08-17 17:08:11 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Protect connection activity with a new lock, avoids deadlocks when going to PAUSED. Fixes #455... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_connection_send), (gst_rtspsrc_connection_receive), (gst_rtspsrc_sink_chain), (gst_rtspsrc_handle_request), (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_pause): * gst/rtsp/gstrtspsrc.h: Protect connection activity with a new lock, avoids deadlocks when going to PAUSED. Fixes #455808. 2007-08-17 15:30:39 +0000 Wim Taymans gst/debug/rndbuffersize.c: Fix debug statement. Original commit message from CVS: * gst/debug/rndbuffersize.c: (gst_rnd_buffer_size_loop): Fix debug statement. 2007-08-17 15:28:40 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Fix stray %u in debug line as spotted by Saur on IRC. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_do_stream_eos): Fix stray %u in debug line as spotted by Saur on IRC. 2007-08-17 15:05:17 +0000 Sebastian Dröge Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GOb... Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), (bpwsinc_set_property), (bpwsinc_get_property): * gst/filter/gstbpwsinc.h: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), (gst_lpwsinc_init), (lpwsinc_build_kernel), (lpwsinc_set_property), (lpwsinc_get_property): * gst/filter/gstlpwsinc.h: * tests/check/elements/lpwsinc.c: (GST_START_TEST): Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GObject properties so automatically generated UIs can use sliders and change frequency properties to floats to save a bit of memory, even ints would in theory be enough. Also rename frequency to cutoff for consistency reasons. * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-gstrtpmanager.xml: Regenerated for the above changes. 2007-08-17 14:43:33 +0000 Sebastian Dröge gst/audiofx/: Use generator macros for the process functions for the different sample types, add lower upper boundari... Original commit message from CVS: * gst/audiofx/audiochebyshevfreqband.c: (gst_audio_chebyshev_freq_band_class_init): * gst/audiofx/audiochebyshevfreqlimit.c: (gst_audio_chebyshev_freq_limit_class_init): Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GObject properties so automatically generated UIs can use sliders and add a note about the number of poles as a too high number of poles combined with very low or very high frequencies will produce only noise. * docs/plugins/gst-plugins-good-plugins.args: Regenerated for the property changes. 2007-08-17 14:15:19 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Improve timeout handling. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_property), (gst_rtspsrc_flush), (gst_rtspsrc_sink_chain), (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_pause), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Improve timeout handling. Use the same socket for sending and receiving RTCP packets so that some servers can track clients better. Improve connection closed handling. Try to reconnect. Don't overwrite our content base with NULL. Improve debugging. Improve range parsing and handling. Remove flushing hack now that core does the right thing. 2007-08-17 13:59:15 +0000 Wim Taymans gst/udp/gstmultiudpsink.*: Add support for getting and setting the socket to use. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_init), (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_close), (gst_multiudpsink_add): * gst/udp/gstmultiudpsink.h: Add support for getting and setting the socket to use. * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_get_property): Add support for getting the currently used socket. 2007-08-16 19:22:48 +0000 Sebastian Dröge gst/filter/gstbpwsinc.*: Implement latency query and only forward those samples downstream that actually contain the ... Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), (gst_bpwsinc_init), (process_32), (process_64), (bpwsinc_build_kernel), (bpwsinc_push_residue), (bpwsinc_transform), (bpwsinc_start), (bpwsinc_query), (bpwsinc_query_type), (bpwsinc_event), (bpwsinc_set_property): * gst/filter/gstbpwsinc.h: Implement latency query and only forward those samples downstream that actually contain the data we want, i.e. drop kernel_length/2 in the beginning and append kernel_length/2 (created by convolving the filter kernel with zeroes) to the end. * tests/check/elements/bpwsinc.c: (GST_START_TEST): Adjust the unit test for this slightly changed behaviour. * gst/filter/gstlpwsinc.c: (lpwsinc_build_kernel): Reset residue length only when actually creating a residue. 2007-08-16 17:02:07 +0000 Sebastian Dröge gst/audiofx/: Add Chebyshev lowpass/highpass and bandpass/bandreject elements. Original commit message from CVS: reviewed by: Stefan Kost * gst/audiofx/Makefile.am: * gst/audiofx/audiochebyshevfreqband.c: (gst_audio_chebyshev_freq_band_mode_get_type), (gst_audio_chebyshev_freq_band_base_init), (gst_audio_chebyshev_freq_band_dispose), (gst_audio_chebyshev_freq_band_class_init), (gst_audio_chebyshev_freq_band_init), (generate_biquad_coefficients), (calculate_gain), (generate_coefficients), (gst_audio_chebyshev_freq_band_set_property), (gst_audio_chebyshev_freq_band_get_property), (gst_audio_chebyshev_freq_band_setup), (process), (process_64), (process_32), (gst_audio_chebyshev_freq_band_transform_ip), (gst_audio_chebyshev_freq_band_start): * gst/audiofx/audiochebyshevfreqband.h: * gst/audiofx/audiochebyshevfreqlimit.c: (gst_audio_chebyshev_freq_limit_mode_get_type), (gst_audio_chebyshev_freq_limit_base_init), (gst_audio_chebyshev_freq_limit_dispose), (gst_audio_chebyshev_freq_limit_class_init), (gst_audio_chebyshev_freq_limit_init), (generate_biquad_coefficients), (calculate_gain), (generate_coefficients), (gst_audio_chebyshev_freq_limit_set_property), (gst_audio_chebyshev_freq_limit_get_property), (gst_audio_chebyshev_freq_limit_setup), (process), (process_64), (process_32), (gst_audio_chebyshev_freq_limit_transform_ip), (gst_audio_chebyshev_freq_limit_start): * gst/audiofx/audiochebyshevfreqlimit.h: * gst/audiofx/audiofx.c: (plugin_init): Add Chebyshev lowpass/highpass and bandpass/bandreject elements. Fixes #464800. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/audiochebyshevfreqband.c: (setup_audiochebyshevfreqband), (cleanup_audiochebyshevfreqband), (GST_START_TEST), (audiochebyshevfreqband_suite), (main): * tests/check/elements/audiochebyshevfreqlimit.c: (setup_audiochebyshevfreqlimit), (cleanup_audiochebyshevfreqlimit), (GST_START_TEST), (audiochebyshevfreqlimit_suite), (main): Add unit tests for the chebyshev filters. * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-wavpack.xml: And add docs for the chebyshev filters. While doing that also run make update in docs/plugins. 2007-08-16 12:15:06 +0000 Stefan Kost Make ro memory to share. Original commit message from CVS: * ext/annodex/gstcmmltag.c: * gst/rtp/gstrtpvorbispay.c: Make ro memory to share. 2007-08-16 11:49:01 +0000 Wim Taymans gst/udp/gstudpsrc.c: Improve UDP performance by avoiding a select() when we have data available immediatly. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Improve UDP performance by avoiding a select() when we have data available immediatly. 2007-08-16 11:47:19 +0000 Wim Taymans gst/rtsp/gstrtpdec.*: Add (dummy) SSRC management signals. Original commit message from CVS: * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_VOID__UINT_UINT), (gst_rtp_dec_class_init): * gst/rtsp/gstrtpdec.h: Add (dummy) SSRC management signals. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (find_stream), (gst_rtspsrc_create_stream), (new_session_pad), (request_pt_map), (gst_rtspsrc_do_stream_eos), (on_bye_ssrc), (on_timeout), (gst_rtspsrc_stream_configure_manager), (gst_rtspsrc_stream_push_event), (gst_rtspsrc_push_event), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Add connection-speed property. Add find_stream helper functions. Handle stream EOS based on BYE messages or SSRC timeout. Returns SUCCESS from the state change function as we hide our async elements from the parent. 2007-08-16 09:48:27 +0000 Sebastian Dröge gst/filter/gstlpwsinc.*: Implement latency query and only forward those samples downstream that actually contain the ... Original commit message from CVS: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), (gst_lpwsinc_init), (process_32), (process_64), (lpwsinc_build_kernel), (lpwsinc_push_residue), (lpwsinc_transform), (lpwsinc_start), (lpwsinc_query), (lpwsinc_query_type), (lpwsinc_event), (lpwsinc_set_property): * gst/filter/gstlpwsinc.h: Implement latency query and only forward those samples downstream that actually contain the data we want, i.e. drop kernel_length/2 in the beginning and append kernel_length/2 (created by convolving the filter kernel with zeroes) to the end. * tests/check/elements/lpwsinc.c: (GST_START_TEST): Adjust the unit test for this slightly changed behaviour. 2007-08-16 07:40:48 +0000 Stefan Kost gst/debug/rndbuffersize.c: Fix da leak. Original commit message from CVS: * gst/debug/rndbuffersize.c: Fix da leak. 2007-08-14 13:50:43 +0000 Stefan Kost gst/debug/: Add new test element and clean-up the others a little. Original commit message from CVS: * gst/debug/Makefile.am: * gst/debug/breakmydata.c: * gst/debug/gstdebug.c: * gst/debug/negotiation.c: * gst/debug/progressreport.c: * gst/debug/rndbuffersize.c: * gst/debug/testplugin.c: Add new test element and clean-up the others a little. 2007-08-13 13:50:39 +0000 Sebastian Dröge Add docs for lpwsinc and bpwsinc and integrate them into the build system. While doing that also update all other doc... Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-bz2.xml: * docs/plugins/inspect/plugin-cdxaparse.xml: * docs/plugins/inspect/plugin-dtsdec.xml: * docs/plugins/inspect/plugin-faac.xml: * docs/plugins/inspect/plugin-faad.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-freeze.xml: * docs/plugins/inspect/plugin-gsm.xml: * docs/plugins/inspect/plugin-gstrtpmanager.xml: * docs/plugins/inspect/plugin-h264parse.xml: * docs/plugins/inspect/plugin-modplug.xml: * docs/plugins/inspect/plugin-mpeg2enc.xml: * docs/plugins/inspect/plugin-musepack.xml: * docs/plugins/inspect/plugin-musicbrainz.xml: * docs/plugins/inspect/plugin-nsfdec.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-spcdec.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-tta.xml: * docs/plugins/inspect/plugin-videosignal.xml: * docs/plugins/inspect/plugin-xingheader.xml: * docs/plugins/inspect/plugin-xvid.xml: * gst/filter/gstbpwsinc.c: * gst/filter/gstbpwsinc.h: * gst/filter/gstlpwsinc.c: * gst/filter/gstlpwsinc.h: Add docs for lpwsinc and bpwsinc and integrate them into the build system. While doing that also update all other docs via make update in docs/plugins. 2007-08-12 20:55:01 +0000 Sebastian Dröge tests/check/elements/bpwsinc.c: Make one test constraint a bit stricter. Original commit message from CVS: * tests/check/elements/bpwsinc.c: (GST_START_TEST): Make one test constraint a bit stricter. 2007-08-12 20:53:11 +0000 Sebastian Dröge tests/check/: Add unit tests for bpwsinc, testing fundamental functionality again. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/bpwsinc.c: (setup_bpwsinc), (cleanup_bpwsinc), (GST_START_TEST), (bpwsinc_suite), (main): Add unit tests for bpwsinc, testing fundamental functionality again. 2007-08-12 20:19:37 +0000 Sebastian Dröge tests/check/: Add unit tests for lpwsinc, testing fundamental functionality. Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/lpwsinc.c: (setup_lpwsinc), (cleanup_lpwsinc), (GST_START_TEST), (lpwsinc_suite), (main): Add unit tests for lpwsinc, testing fundamental functionality. 2007-08-12 15:41:57 +0000 Sebastian Dröge gst/filter/: Improve debugging a bit. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (bpwsinc_build_kernel): * gst/filter/gstlpwsinc.c: (lpwsinc_build_kernel): Improve debugging a bit. 2007-08-12 14:35:41 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Fix parsing of mp4a version 0 atoms. Fixes #465774. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_node): Fix parsing of mp4a version 0 atoms. Fixes #465774. 2007-08-12 12:46:20 +0000 Sebastian Dröge gst/filter/: Reset the residue in BaseTransform::start to get a clean residue on stream changes. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), (bpwsinc_start): * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), (lpwsinc_start): Reset the residue in BaseTransform::start to get a clean residue on stream changes. 2007-08-11 15:58:30 +0000 Sebastian Dröge gst/filter/: Fix processing with buffer sizes that are larger than the filter kernel size. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (process_32), (process_64): * gst/filter/gstlpwsinc.c: (process_32), (process_64): Fix processing with buffer sizes that are larger than the filter kernel size. 2007-08-10 17:08:01 +0000 Stefan Kost gst/rtp/gstrtpilbcdepay.c: Include stdlib. Original commit message from CVS: * gst/rtp/gstrtpilbcdepay.c: Include stdlib. 2007-08-10 16:10:47 +0000 Wim Taymans gst/rtp/gstrtpmpvdepay.c: Set the mpegversion in the caps so that autoplugging does not get confused. Original commit message from CVS: * gst/rtp/gstrtpmpvdepay.c: Set the mpegversion in the caps so that autoplugging does not get confused. 2007-08-10 05:51:40 +0000 Sebastian Dröge gst/filter/gstbpwsinc.c: Fix a segfault with more than one channel and don't rebuild the kernel & residue with every ... Original commit message from CVS: * gst/filter/gstbpwsinc.c: (bpwsinc_build_kernel): Fix a segfault with more than one channel and don't rebuild the kernel & residue with every buffer. 2007-08-10 05:35:25 +0000 Sebastian Dröge gst/filter/gstbpwsinc.*: Add support for a bandreject mode and allow specifying the window function that should be used. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_mode_get_type), (gst_bpwsinc_window_get_type), (gst_bpwsinc_class_init), (gst_bpwsinc_init), (bpwsinc_build_kernel), (bpwsinc_set_property), (bpwsinc_get_property): * gst/filter/gstbpwsinc.h: Add support for a bandreject mode and allow specifying the window function that should be used. * gst/filter/gstlpwsinc.c: And another small formatting fix. 2007-08-10 05:20:06 +0000 Sebastian Dröge gst/filter/gstbpwsinc.*: Apply the same changes to the bandpass filter: Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), (gst_bpwsinc_init), (process_32), (process_64), (bpwsinc_build_kernel), (bpwsinc_setup), (bpwsinc_get_unit_size), (bpwsinc_transform), (bpwsinc_set_property), (bpwsinc_get_property): * gst/filter/gstbpwsinc.h: Apply the same changes to the bandpass filter: - Support double input - Fix processing for input with >1 channels - Specify frequency in Hz - Specify actual filter kernel length - Use transform instead of transform_ip as we're working out of place anyway - Factor out filter kernel generation and update the filter kernel when the properties are set Fix bandpass filter kernel generation to actually generate a bandpass filter by creating a highpass instead of a second lowpass. * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): Small formatting fix. 2007-08-10 04:44:43 +0000 Sebastian Dröge gst/filter/gstlpwsinc.*: Specify the actual filter length instead of a weird 2N+1. Setting the property will round to... Original commit message from CVS: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), (gst_lpwsinc_init), (process_32), (process_64), (lpwsinc_build_kernel), (lpwsinc_set_property), (lpwsinc_get_property): * gst/filter/gstlpwsinc.h: Specify the actual filter length instead of a weird 2N+1. Setting the property will round to the next odd number. Also remove now obsolete FIXMEs. 2007-08-10 04:32:47 +0000 Sebastian Dröge gst/filter/gstlpwsinc.*: Allow choosing between hamming and blackman window. The blackman window provides a better st... Original commit message from CVS: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_window_get_type), (gst_lpwsinc_class_init), (gst_lpwsinc_init), (lpwsinc_build_kernel), (lpwsinc_set_property), (lpwsinc_get_property): * gst/filter/gstlpwsinc.h: Allow choosing between hamming and blackman window. The blackman window provides a better stopband attenuation but a bit slower rolloff. 2007-08-10 04:21:39 +0000 Sebastian Dröge gst/filter/gstlpwsinc.*: Add a highpass mode. Original commit message from CVS: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_mode_get_type), (gst_lpwsinc_class_init), (process_32), (process_64), (lpwsinc_build_kernel), (lpwsinc_set_property), (lpwsinc_get_property): * gst/filter/gstlpwsinc.h: Add a highpass mode. 2007-08-10 04:06:53 +0000 Sebastian Dröge gst/filter/gstlpwsinc.c: Fix processing if the input has more than one channel. Original commit message from CVS: * gst/filter/gstlpwsinc.c: (process_32), (process_64), (lpwsinc_build_kernel): Fix processing if the input has more than one channel. 2007-08-09 19:23:33 +0000 Sebastian Dröge gst/filter/gstbpwsinc.c: "this" is a C++ keyword, use "self" instead. Original commit message from CVS: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), (gst_bpwsinc_init), (bpwsinc_setup), (bpwsinc_transform_ip), (bpwsinc_set_property), (bpwsinc_get_property): "this" is a C++ keyword, use "self" instead. Add TODOs and FIXMEs and remove two wrong FIXMEs. * gst/filter/gstlpwsinc.c: Add FIXMEs and a new TODO. 2007-08-09 18:08:05 +0000 Sebastian Dröge gst/filter/gstlpwsinc.*: Add double support, replace "this" with "self" as the former is a C++ keyword. Original commit message from CVS: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), (gst_lpwsinc_class_init), (gst_lpwsinc_init), (process_32), (process_64), (lpwsinc_build_kernel), (lpwsinc_setup), (lpwsinc_get_unit_size), (lpwsinc_transform), (lpwsinc_set_property), (lpwsinc_get_property): * gst/filter/gstlpwsinc.h: Add double support, replace "this" with "self" as the former is a C++ keyword. Implement the frequency property in Hz instead of fraction of sampling frequency. Remove some unecessary FIXMEs and add some TODOs, add some required locking and refactor the kernel generation into a separate function that is also called when the properties change now. And use BaseTransform::transform instead of transform_ip as the convolution is done out of place anyway. Should be done in place later. 2007-08-09 10:54:05 +0000 Thomas Vander Stichele po/: Updated translations. Original commit message from CVS: * po/hu.po: * po/uk.po: * po/vi.po: Updated translations. 2007-08-08 20:47:33 +0000 Sebastian Dröge gst/filter/: Use GstAudioFilter as base class and don't leak the memory of the filter kernel and residue. Original commit message from CVS: * gst/filter/Makefile.am: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), (gst_bpwsinc_base_init), (gst_bpwsinc_class_init), (gst_bpwsinc_init), (bpwsinc_setup): * gst/filter/gstbpwsinc.h: * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), (gst_lpwsinc_base_init), (gst_lpwsinc_class_init), (gst_lpwsinc_init), (lpwsinc_setup): * gst/filter/gstlpwsinc.h: Use GstAudioFilter as base class and don't leak the memory of the filter kernel and residue. 2007-08-08 17:47:05 +0000 Michael Smith gst/videobox/gstvideobox.c: Render right border in the correct location. Original commit message from CVS: * gst/videobox/gstvideobox.c: (gst_video_box_ayuv_i420): Render right border in the correct location. 2007-08-08 10:54:50 +0000 Olivier Crete gst/rtp/: Make mode property a string. Fixes #464475. Original commit message from CVS: Patch by: Olivier Crete * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): Make mode property a string. Fixes #464475. 2007-08-05 14:58:20 +0000 Stefan Kost ext/flac/gstflacenc.c: Widen caps to match decoder a bit and add more FIXMEs. Original commit message from CVS: * ext/flac/gstflacenc.c: Widen caps to match decoder a bit and add more FIXMEs. 2007-08-05 14:53:36 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Fix ODML index tag numbering. Fixes #463624. Original commit message from CVS: patch by: Mark Nauwelaerts * gst/avi/gstavimux.c: Fix ODML index tag numbering. Fixes #463624. 2007-08-03 16:08:56 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Fix default clock-rate for realmedia. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (get_default_rate_for_pt), (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_stream_configure_udp_sink): Fix default clock-rate for realmedia. Fix parsing of transport. Don't try to link NULL pads. 2007-07-30 17:17:04 +0000 Tim-Philipp Müller po/POTFILES.skip: Add POTFILES.skip with list of source files that aren't disted at the moment but contain translatab... Original commit message from CVS: * po/POTFILES.skip: Add POTFILES.skip with list of source files that aren't disted at the moment but contain translatable strings. Should hopefully pacify broken tools and make it clearer that these files are left out intentionally (#461600). 2007-07-30 12:41:58 +0000 Edward Hervey gst/qtdemux/qtdemux.c: If the buffer was entirely clipped ... don't try sending it :) Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_movie): If the buffer was entirely clipped ... don't try sending it :) 2007-07-27 16:56:45 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: If we don't hav a session manager, set the caps on outgoing buffers ourselves. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_methods), (gst_rtspsrc_create_transports_string), (gst_rtspsrc_prepare_transports): If we don't hav a session manager, set the caps on outgoing buffers ourselves. Force PAUSE/PLAY methods for now until the extensions can overwrite. Append final bit of the transport string even when it does not contain a placeholder. 2007-07-27 11:21:20 +0000 Wim Taymans gst/rtsp/: Clean up the interface list. Original commit message from CVS: * gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_free), (gst_rtsp_ext_list_connect): * gst/rtsp/gstrtspext.h: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_send_cb): Clean up the interface list. Allow connecting to interface signals for the extensions. Remove old extension code. Free list on cleanup. Allow extensions to send additional RTSP messages. 2007-07-27 10:38:34 +0000 Jan Schmidt ext/gconf/gconf.c: Handle a NULL gconf key gracefully by rendering the default element. Original commit message from CVS: * ext/gconf/gconf.c: (gst_gconf_render_bin_with_default): Handle a NULL gconf key gracefully by rendering the default element. 2007-07-27 10:11:18 +0000 Wim Taymans gst/rtsp/gstrtspext.h: Fix include path for extension interface. Original commit message from CVS: * gst/rtsp/gstrtspext.h: Fix include path for extension interface. 2007-07-26 19:45:30 +0000 Sebastian Dröge gst/audiofx/audioamplify.h: Also remove a now unecessary variable here. Original commit message from CVS: * gst/audiofx/audioamplify.h: Also remove a now unecessary variable here. 2007-07-26 19:41:07 +0000 Sebastian Dröge gst/audiofx/: Don't save format information ourselves, this is already saved in Original commit message from CVS: * gst/audiofx/audioamplify.c: (gst_audio_amplify_init), (gst_audio_amplify_setup), (gst_audio_amplify_transform_ip): * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_set_process_function), (gst_audio_dynamic_init), (gst_audio_dynamic_setup), (gst_audio_dynamic_transform_ip): * gst/audiofx/audiodynamic.h: * gst/audiofx/audioinvert.c: (gst_audio_invert_init), (gst_audio_invert_setup), (gst_audio_invert_transform_ip): * gst/audiofx/audioinvert.h: Don't save format information ourselves, this is already saved in GstAudioFilter. 2007-07-26 15:48:47 +0000 Wim Taymans gst/rtsp/: Use rank to filter out extensions. Original commit message from CVS: * gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_filter), (gst_rtsp_ext_list_stream_select): * gst/rtsp/gstrtspext.h: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): Use rank to filter out extensions. Add url to stream_select interface call. 2007-07-25 18:50:08 +0000 Wim Taymans gst/rtsp/: Use shiny new RTSP and SDP library. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/base64.c: * gst/rtsp/base64.h: * gst/rtsp/gstrtspext.c: (gst_rtsp_ext_list_filter), (gst_rtsp_ext_list_init), (gst_rtsp_ext_list_get), (gst_rtsp_ext_list_detect_server), (gst_rtsp_ext_list_before_send), (gst_rtsp_ext_list_after_send), (gst_rtsp_ext_list_parse_sdp), (gst_rtsp_ext_list_setup_media), (gst_rtsp_ext_list_configure_stream), (gst_rtsp_ext_list_get_transports), (gst_rtsp_ext_list_stream_select): * gst/rtsp/gstrtspext.h: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_create_stream), (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_flush), (gst_rtspsrc_do_seek), (gst_rtspsrc_sink_chain), (gst_rtspsrc_stream_configure_manager), (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_stream_configure_mcast), (gst_rtspsrc_stream_configure_udp), (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_handle_request), (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), (gst_rtsp_auth_method_to_string), (gst_rtspsrc_parse_auth_hdr), (gst_rtspsrc_setup_auth), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_create_transports_string), (gst_rtspsrc_prepare_transports), (gst_rtspsrc_setup_streams), (gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_change_state), (gst_rtspsrc_uri_set_uri): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtsp.h: * gst/rtsp/rtspconnection.c: * gst/rtsp/rtspconnection.h: * gst/rtsp/rtspdefs.c: * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspext.h: * gst/rtsp/rtspextwms.c: * gst/rtsp/rtspextwms.h: * gst/rtsp/rtspmessage.c: * gst/rtsp/rtspmessage.h: * gst/rtsp/rtsprange.c: * gst/rtsp/rtsprange.h: * gst/rtsp/rtsptransport.c: * gst/rtsp/rtsptransport.h: * gst/rtsp/rtspurl.c: * gst/rtsp/rtspurl.h: * gst/rtsp/sdp.h: * gst/rtsp/sdpmessage.c: * gst/rtsp/sdpmessage.h: * gst/rtsp/test.c: Use shiny new RTSP and SDP library. Implement RTSP extensions using the new interface. Remove a lot of old code. 2007-07-24 14:31:56 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Add codec mapping for '2vuy' (Raw YUV produced by FCP) and 'divx'. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add codec mapping for '2vuy' (Raw YUV produced by FCP) and 'divx'. 2007-07-24 05:07:59 +0000 Sebastian Dröge ext/wavpack/gstwavpackdec.c: Don't unref the outgoing buffer twice when dropping it because it's outside of the segment. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): Don't unref the outgoing buffer twice when dropping it because it's outside of the segment. 2007-07-24 04:57:20 +0000 Sebastian Dröge Use the new buffer clipping function from gstaudio here and require gst-plugins-base CVS. Original commit message from CVS: * configure.ac: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), (gst_wavpack_dec_chain), (gst_wavpack_dec_sink_event): Use the new buffer clipping function from gstaudio here and require gst-plugins-base CVS. * tests/check/elements/wavpackdec.c: (GST_START_TEST): For framed Wavpack buffers we require a valid timestamp. 2007-07-23 18:03:54 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Clip raw audio and video when we can, keep track of current output segment. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), (gst_qtdemux_clip_buffer), (gst_qtdemux_loop_state_movie), (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): Clip raw audio and video when we can, keep track of current output segment. Don't leak buffers and events when there is no output pad. Improve debugging here and there. 2007-07-23 09:02:07 +0000 Stefan Kost configure.ac: Sync liboil check with plugins-base. Original commit message from CVS: * configure.ac: Sync liboil check with plugins-base. 2007-07-20 11:37:37 +0000 Stefan Kost gst/equalizer/: Better algorith for the center frequencies. Subtract band filters from input for negative gains. Rewo... Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_child_proxy_get_child_by_index), (gst_iir_equalizer_child_proxy_get_children_count), (gst_iir_equalizer_child_proxy_interface_init), (gst_iir_equalizer_class_init), (arg_to_scale), (setup_filter), (gst_iir_equalizer_compute_frequencies): * gst/equalizer/gstiirequalizer10bands.c: (gst_iir_equalizer_10bands_class_init): * gst/equalizer/gstiirequalizer3bands.c: (gst_iir_equalizer_3bands_class_init): * gst/equalizer/gstiirequalizernbands.c: Better algorith for the center frequencies. Subtract band filters from input for negative gains. Rework the gain mapping. 2007-07-20 07:41:58 +0000 Stefan Kost ext/annodex/Makefile.am: Fix CFLAGS/LIBS. Original commit message from CVS: * ext/annodex/Makefile.am: Fix CFLAGS/LIBS. * ext/cdio/gstcdiocddasrc.c: * ext/libpng/gstpngdec.c: (gst_pngdec_task): Include stdlib * ext/cairo/Makefile.am: * gst/videofilter/Makefile.am: * tests/examples/level/Makefile.am: Use $(LIBM) instead of -lm 2007-07-18 11:55:13 +0000 Stefan Kost sys/v4l2/gstv4l2src.c: Add another example pipeline. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: Add another example pipeline. 2007-07-18 11:42:33 +0000 Alexander Eichner sys/v4l2/gstv4l2src.c: Use define here. Original commit message from CVS: Patch by: Alexander Eichner * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): Use define here. * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_set_frequency_and_notify): Don't touch the property - its still disabled. * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame), (gst_v4l2src_get_size_limits): * sys/v4l2/v4l2src_calls.h: Improve fallback format negotionation. Fixes #451388 2007-07-18 10:33:39 +0000 Stefan Kost tests/check/elements/videocrop.c: Fix the test. Original commit message from CVS: * tests/check/elements/videocrop.c: (GST_START_TEST): Fix the test. 2007-07-18 09:21:23 +0000 Stefan Kost More docs. More logs in pngdec. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-png.xml: * ext/jpeg/gstjpegdec.c: * ext/libpng/gstpngdec.c: (gst_pngdec_task), (gst_pngdec_sink_setcaps): More docs. More logs in pngdec. 2007-07-18 07:51:11 +0000 Stefan Kost gst/multifile/gstmultifilesrc.c: Add example to the docs. Fix buffer-offset-end and add some debug. Original commit message from CVS: * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): Add example to the docs. Fix buffer-offset-end and add some debug. 2007-07-18 07:35:32 +0000 Stefan Kost Add stdlib include (free, atoi, exit). Original commit message from CVS: * examples/app/appsrc_ex.c: * examples/switch/switcher.c: * ext/neon/gstneonhttpsrc.c: * ext/timidity/gstwildmidi.c: * ext/x264/gstx264enc.c: * gst/mve/mveaudioenc.c: (mve_compress_audio): * gst/rtpmanager/gstrtpclient.c: * gst/rtpmanager/gstrtpjitterbuffer.c: * gst/spectrum/demo-audiotest.c: * gst/spectrum/demo-osssrc.c: * sys/dvb/gstdvbsrc.c: Add stdlib include (free, atoi, exit). 2007-07-17 11:35:29 +0000 Stefan Kost sys/v4l2/gstv4l2src.c: Initialize num_buffers with minimum value. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): Initialize num_buffers with minimum value. * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_probe_caps_for_format), (gst_v4l2src_grab_frame): Handle frame-size query failure gracefully. 2007-07-16 12:11:36 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Fix parsing of esds atoms inside mp4a atoms so that we can set correct codec_info for AAC audi... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_node): Fix parsing of esds atoms inside mp4a atoms so that we can set correct codec_info for AAC audio. Fixes #457097 along with a whole other bunch of qt/aac files. 2007-07-16 09:16:03 +0000 Sebastian Dröge ext/wavpack/gstwavpackdec.c: Fix buffer clipping to correctly clip to the segment stop. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_clip_outgoing_buffer): Fix buffer clipping to correctly clip to the segment stop. 2007-07-13 16:31:27 +0000 Jan Schmidt Remove bogus check for libcheck, since we check for gstreamer-check and it pulls in the required info from there, and... Original commit message from CVS: * configure.ac: * tests/Makefile.am: Remove bogus check for libcheck, since we check for gstreamer-check and it pulls in the required info from there, and we weren't actually _using_ the information for libcheck ourselves anyway. 2007-07-12 11:21:01 +0000 Stefan Kost configure.ac: Use pkg-config to locate check. Original commit message from CVS: * configure.ac: Use pkg-config to locate check. 2007-07-11 23:43:25 +0000 Tim-Philipp Müller gst/: Fix build against core CVS. Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_process): * gst/vmnc/vmncdec.c: (vmnc_make_buffer): Fix build against core CVS. 2007-07-11 22:31:06 +0000 Tim-Philipp Müller Fix build against core CVS. Original commit message from CVS: * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_transform): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): * ext/libpng/gstpngenc.c: (gst_pngenc_chain): * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): * gst/debug/gstnavigationtest.c: (gst_navigationtest_transform): * gst/effectv/gstaging.c: (gst_agingtv_transform): * gst/effectv/gstdice.c: (gst_dicetv_transform): * gst/effectv/gstedge.c: (gst_edgetv_transform): * gst/effectv/gstquark.c: (gst_quarktv_transform): * gst/effectv/gstrev.c: (gst_revtv_transform): * gst/effectv/gstshagadelic.c: (gst_shagadelictv_transform): * gst/effectv/gstvertigo.c: (gst_vertigotv_transform): * gst/effectv/gstwarp.c: (gst_warptv_transform): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_wvpk_header), (gst_matroska_demux_check_subtitle_buffer), (gst_matroska_decode_buffer): * gst/videofilter/gstvideoflip.c: (gst_video_flip_transform): Fix build against core CVS. 2007-07-10 10:16:38 +0000 Edward Hervey gst/id3demux/gstid3demux.c: Don't return GST_FLOW_ERROR when pushing an event returns FALSE. We don't have enough gra... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): Don't return GST_FLOW_ERROR when pushing an event returns FALSE. We don't have enough granularity to convert that boolean into a GstFlowReturn. 2007-07-06 15:00:47 +0000 Michael Smith gst/law/: Fix capsnego bogosity in *law decoders. Original commit message from CVS: * gst/law/alaw-decode.c: (alawdec_sink_setcaps), (gst_alawdec_class_init), (gst_alawdec_init), (gst_alawdec_chain), (gst_alawdec_change_state): * gst/law/alaw-decode.h: * gst/law/mulaw-decode.c: (mulawdec_sink_setcaps), (gst_mulawdec_class_init), (gst_mulawdec_init), (gst_mulawdec_chain), (gst_mulawdec_change_state): * gst/law/mulaw-decode.h: Fix capsnego bogosity in *law decoders. 2007-07-06 14:35:59 +0000 Michael Smith ext/jpeg/gstsmokeenc.*: Remove stupidity in get/set caps functions. Original commit message from CVS: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init), (gst_smokeenc_setcaps), (gst_smokeenc_chain), (gst_smokeenc_change_state): * ext/jpeg/gstsmokeenc.h: Remove stupidity in get/set caps functions. Fix some refcounting problems. 2007-07-06 11:42:53 +0000 Jan Schmidt ext/libpng/gstpngdec.c: Remove endianness-flipping hack that seems to have been required only because of a bug in ffm... Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_caps_create_and_set): Remove endianness-flipping hack that seems to have been required only because of a bug in ffmpegcolorspace. Partially Fixes: #451908 2007-07-05 08:44:11 +0000 Stefan Kost docs/plugins/Makefile.am: Simplify --extra-dir as gtkdoc scans recursively. Original commit message from CVS: * docs/plugins/Makefile.am: Simplify --extra-dir as gtkdoc scans recursively. 2007-07-03 09:59:46 +0000 Tommi Myöhänen gst/rtp/gstrtpilbcpay.c: Set the encoding-name in the rtp caps to all uppercase, as required by the caps spec. Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): Set the encoding-name in the rtp caps to all uppercase, as required by the caps spec. Some small cleanups in the error paths. Fixes #453037. 2007-07-03 08:01:18 +0000 Stefan Kost gst/multifile/: Add .h files to be able to add it to the docs. Original commit message from CVS: * gst/multifile/Makefile.am: * gst/multifile/gstmultifile.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesink.h: * gst/multifile/gstmultifilesrc.c: * gst/multifile/gstmultifilesrc.h: Add .h files to be able to add it to the docs. 2007-07-03 07:16:26 +0000 Stefan Kost gst/replaygain/gstrgvolume.h: Fix GObject macros. Original commit message from CVS: * gst/replaygain/gstrgvolume.h: Fix GObject macros. 2007-06-28 19:00:43 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.*: Use a GSList for the GArray that is used like a list anyway. Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_index_get_last_entry), (gst_wavpack_parse_index_get_entry_from_sample), (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), (gst_wavpack_parse_scan_to_find_sample): * ext/wavpack/gstwavpackparse.h: Use a GSList for the GArray that is used like a list anyway. 2007-06-28 13:25:05 +0000 Tim-Philipp Müller ext/gdk_pixbuf/gstgdkpixbuf.c: Add state change function where we set 0/1 as default framerate in case our setcaps fu... Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), (gst_gdk_pixbuf_class_init), (gst_gdk_pixbuf_flush), (gst_gdk_pixbuf_sink_event), (gst_gdk_pixbuf_change_state): Add state change function where we set 0/1 as default framerate in case our setcaps function isn't called, like it might not in a filesrc ! gdkpixbufdec scenario. Fixes assertion triggered by gdkpixbufdec trying to create caps with a 0/0 framerate. Also post an error message on the bus if gst_pad_push() fails when called from our sink event handler (+1 for flow returns for event functions in 0.11) instead of failing silently. 2007-06-27 11:36:24 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Cast stack args to the proper types. Fixes #451249. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_configure_caps): Cast stack args to the proper types. Fixes #451249. 2007-06-27 11:04:47 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: For container formats we only need to activate one of the streams so that we correctly signal ... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), (new_session_pad), (gst_rtspsrc_setup_streams): * gst/rtsp/gstrtspsrc.h: For container formats we only need to activate one of the streams so that we correctly signal no-more-pads. Fixes #451015. 2007-06-25 12:46:08 +0000 Stefan Kost docs/plugins/: Update docs with caps info. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Update docs with caps info. 2007-06-25 12:13:09 +0000 Tim-Philipp Müller po/POTFILES.in: Add more files with translatable strings (#450878). Original commit message from CVS: * po/POTFILES.in: Add more files with translatable strings (#450878). 2007-06-22 20:23:18 +0000 Jens Granseuer gst/: Build fixes for gcc-2.9x (no mid-block variable declarations etc.). Original commit message from CVS: Patch by: Jens Granseuer * gst/equalizer/gstiirequalizer.c: * gst/equalizer/gstiirequalizer10bands.c: * gst/equalizer/gstiirequalizer3bands.c: * gst/equalizer/gstiirequalizernbands.c: * gst/rtpmanager/async_jitter_queue.c: (async_jitter_queue_push_sorted): * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_chain): * gst/switch/gstswitch.c: (gst_switch_chain): Build fixes for gcc-2.9x (no mid-block variable declarations etc.). Fixes #450185. 2007-06-22 14:26:36 +0000 Jan Schmidt MAINTAINERS: Updating all the maintainers files Original commit message from CVS: * MAINTAINERS: Updating all the maintainers files 2007-06-22 10:12:15 +0000 Edward Hervey Fix memory leaks. Original commit message from CVS: * ext/flac/gstflactag.c: (gst_flac_tag_init): * gst/interleave/deinterleave.c: (deinterleave_init), (deinterleave_sink_link): * gst/interleave/interleave.c: (interleave_init): * gst/median/gstmedian.c: (gst_median_init): * gst/oldcore/gstmultifilesrc.c: (gst_multifilesrc_init): Fix memory leaks. * tests/check/elements/id3demux.c: (pad_added_cb): Remove unused variable. 2007-06-21 10:48:10 +0000 Damien Carbery ext/gconf/gconf.h: Make the prototype of gst_gconf_get_key_for_sink_profile match the implementation. Original commit message from CVS: * ext/gconf/gconf.h: Make the prototype of gst_gconf_get_key_for_sink_profile match the implementation. Patch by: Damien Carbery Fixes: #449747 2007-06-20 12:56:12 +0000 Michael Smith gst/rtp/gstrtpdepay.c: Fix description - rtpdepay is not a payloader. Original commit message from CVS: * gst/rtp/gstrtpdepay.c: Fix description - rtpdepay is not a payloader. 2007-06-20 10:15:00 +0000 Stefan Kost gst/equalizer/gstiirequalizer.c: Document parameter mapping. Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: Document parameter mapping. 2007-06-20 08:56:17 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Fix leaking buffers. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_event), (gst_spectrum_transform_ip): Fix leaking buffers. * tests/check/Makefile.am: * tests/check/elements/spectrum.c: (setup_spectrum), (cleanup_spectrum), (GST_START_TEST), (spectrum_suite), (main): Add simple test for spectrum element. 2007-06-20 08:26:21 +0000 Stefan Kost gst/qtdemux/: Add MJPG to the variants of motion jpeg. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_samples), (qtdemux_video_caps): * gst/qtdemux/qtdemux_fourcc.h: Add MJPG to the variants of motion jpeg. 2007-06-19 16:40:40 +0000 Tim-Philipp Müller tests/check/: Add GST_OPTION_CFLAGS to CFLAGS when building unit tests, so the error flags are included and it errors... Original commit message from CVS: * tests/check/Makefile.am: * tests/check/elements/audiopanorama.c: (GST_START_TEST): * tests/check/elements/videocrop.c: (GST_START_TEST): * tests/check/elements/videofilter.c: * tests/check/elements/wavpackdec.c: (GST_START_TEST): * tests/check/elements/wavpackparse.c: (GST_START_TEST): Add GST_OPTION_CFLAGS to CFLAGS when building unit tests, so the error flags are included and it errors out on compiler warnings for CVS builds; remove unused variables in various unit tests. 2007-06-19 14:48:03 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Use threadsafe inet_ntop to convert an ip number to a string. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), (rtsp_connection_close), (rtsp_connection_free): Use threadsafe inet_ntop to convert an ip number to a string. Fixes #447961. Don't leak fd (and ip) when freeing a connection without first closing it. 2007-06-19 14:11:49 +0000 Christian Schaller * gst/qtdemux/LEGAL: add 'LEGAL' file describing why this is in -good and under what circumstances it might need to move. Original commit message from CVS: add 'LEGAL' file describing why this is in -good and under what circumstances it might need to move. 2007-06-19 10:41:49 +0000 Jan Schmidt configure.ac: Back to CVS Original commit message from CVS: * configure.ac: Back to CVS * gst-plugins-good.doap: Add 0.10.6 to the doap file. === release 0.10.6 === 2007-06-19 10:24:55 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-quicktime.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * win32/common/config.h: Release 0.10.6 Original commit message from CVS: Release 0.10.6 2007-06-18 17:53:20 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/ja.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2007-06-17 12:35:03 +0000 Tim-Philipp Müller gst/rtsp/rtspconnection.c: Revert previous commit again, since we are frozen (sorry). Original commit message from CVS: * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), (rtsp_connection_free): Revert previous commit again, since we are frozen (sorry). 2007-06-17 12:24:58 +0000 Peter Kjellerstedt gst/rtsp/rtspconnection.c: inet_ntoa() uses a static buffer internally, so we need to copy the returned string if we ... Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), (rtsp_connection_free): inet_ntoa() uses a static buffer internally, so we need to copy the returned string if we want to store it for later (#447961). 2007-06-15 09:13:55 +0000 Jan Schmidt win32/vs6/: Mark *.dsp & *.dsw as binary files and convert to DOS line endings, as they don't load into VS6 correctly... Original commit message from CVS: * win32/vs6/autogen.dsp: * win32/vs6/gst_plugins_good.dsw: * win32/vs6/libgstalaw.dsp: * win32/vs6/libgstalpha.dsp: * win32/vs6/libgstalphacolor.dsp: * win32/vs6/libgstapetag.dsp: * win32/vs6/libgstaudiofx.dsp: * win32/vs6/libgstauparse.dsp: * win32/vs6/libgstautodetect.dsp: * win32/vs6/libgstavi.dsp: * win32/vs6/libgstcutter.dsp: * win32/vs6/libgstdirectdraw.dsp: * win32/vs6/libgstdirectsound.dsp: * win32/vs6/libgsteffectv.dsp: * win32/vs6/libgstflx.dsp: * win32/vs6/libgstgoom.dsp: * win32/vs6/libgsticydemux.dsp: * win32/vs6/libgstid3demux.dsp: * win32/vs6/libgstinterleave.dsp: * win32/vs6/libgstjpeg.dsp: * win32/vs6/libgstlevel.dsp: * win32/vs6/libgstmatroska.dsp: * win32/vs6/libgstmedian.dsp: * win32/vs6/libgstmonoscope.dsp: * win32/vs6/libgstmulaw.dsp: * win32/vs6/libgstmultipart.dsp: * win32/vs6/libgstqtdemux.dsp: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: * win32/vs6/libgstsmpte.dsp: * win32/vs6/libgstspeex.dsp: * win32/vs6/libgstudp.dsp: * win32/vs6/libgstvideobalance.dsp: * win32/vs6/libgstvideobox.dsp: * win32/vs6/libgstvideocrop.dsp: * win32/vs6/libgstvideoflip.dsp: * win32/vs6/libgstvideomixer.dsp: * win32/vs6/libgstwaveform.dsp: * win32/vs6/libgstwavenc.dsp: * win32/vs6/libgstwavparse.dsp: Mark *.dsp & *.dsw as binary files and convert to DOS line endings, as they don't load into VS6 correctly otherwise. 2007-06-15 08:32:52 +0000 Vincent Torri gst/rtsp/rtspconnection.c: Fix the MingW build. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_connect): Fix the MingW build. Patch By: Vincent Torri Fixes: #446981 2007-06-14 14:03:41 +0000 Jan Schmidt tests/: Hush the buildbots up Original commit message from CVS: * tests/check/elements/.cvsignore: * tests/icles/.cvsignore: Hush the buildbots up 2007-06-14 12:14:24 +0000 Jan Schmidt Make sure to dist everything needed for win32 builds. Original commit message from CVS: * configure.ac: * sys/Makefile.am: * sys/directdraw/Makefile.am: * sys/directsound/Makefile.am: * sys/waveform/Makefile.am: Make sure to dist everything needed for win32 builds. 2007-06-14 10:23:20 +0000 Edward Hervey gst/qtdemux/qtdemux.c: For AMR-NB streams, export the AMRSpecificBox as codec_data on the caps. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): For AMR-NB streams, export the AMRSpecificBox as codec_data on the caps. Fixes #447458 2007-06-13 17:11:24 +0000 Wim Taymans gst/rtp/gstrtph264depay.c: Make sure we allocate enough memory for the codec_data. Original commit message from CVS: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): Make sure we allocate enough memory for the codec_data. Fixes #447210. 2007-06-12 21:05:22 +0000 Sébastien Moutte win32/MANIFEST: Add videocrop project file to the win32 manifest. Original commit message from CVS: * win32/MANIFEST: Add videocrop project file to the win32 manifest. * win32/vs6/gst_plugins_good.dsw: Add qtdemux,videocrop and waveform projects to the workspace. * win32/vs6/libgstqtdemux.dsp: Add zlib to the link list of qtdemux. * win32/vs6/libgstvideocrop.dsp: Add a project file for videocrop. 2007-06-12 20:22:26 +0000 Jan Schmidt po/POTFILES.in: Add qtdemux for translation Original commit message from CVS: * po/POTFILES.in: Add qtdemux for translation 2007-06-12 20:15:29 +0000 Jan Schmidt Move videocrop and osxvideo from -bad. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-videocrop.xml: * gst-plugins-good.spec.in: * sys/Makefile.am: * tests/check/Makefile.am: * tests/icles/Makefile.am: * tests/icles/videocrop-test.c: Move videocrop and osxvideo from -bad. 2007-06-12 19:35:08 +0000 Jan Schmidt Move qtdemux from -bad. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-qtdemux.xml: * docs/plugins/inspect/plugin-quicktime.xml: * win32/MANIFEST: Move qtdemux from -bad. * gst-plugins-good.spec.in: Update spec file to reflect moving of qtdemux and wavpack 2007-06-12 19:01:41 +0000 Jan Schmidt * ChangeLog: * win32/MANIFEST: Fix typo in the changelog and commit the manifest too Original commit message from CVS: Fix typo in the changelog and commit the manifest too 2007-06-12 18:52:33 +0000 Jan Schmidt win32/MANIFEST Original commit message from CVS: * win32/MANIFEST * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-directdraw.xml: * docs/plugins/inspect/plugin-directsound.xml: * docs/plugins/inspect/plugin-waveform.xml: Move the waveform plugin from -bad too. Update the inspect xml files to mention Plugins Good instead of Plugins Bad. 2007-06-12 13:33:56 +0000 Andy Wingo * ChangeLog: * sys/v4l2/v4l2src_calls.c: Return a copy of the pool buffer if all mmap buffers have been dequeued. Original commit message from CVS: (gst_v4l2src_grab_frame): Return a copy of the pool buffer if all mmap buffers have been dequeued. 2007-06-12 11:23:01 +0000 Andy Wingo sys/v4l2/v4l2src_calls.c (gst_v4l2_buffer_finalize) (gst_v4l2_buffer_class_init, gst_v4l2_buffer_get_type) Original commit message from CVS: 2007-06-12 Andy Wingo * sys/v4l2/v4l2src_calls.c (gst_v4l2_buffer_finalize) (gst_v4l2_buffer_class_init, gst_v4l2_buffer_get_type) (gst_v4l2_buffer_new): Behave more like ximagesink's buffers, with finalization and resuscitation. No longer public. (gst_v4l2_buffer_pool_finalize, gst_v4l2_buffer_pool_init) (gst_v4l2_buffer_pool_class_init, gst_v4l2_buffer_pool_get_type) (gst_v4l2_buffer_pool_new, gst_v4l2_buffer_pool_activate) (gst_v4l2_buffer_pool_destroy): Make the pool follow common miniobject semantics, and be threadsafe. (gst_v4l2src_queue_frame): Remove this function, as we just call the ioctls directly in the two places where we queue buffers. (gst_v4l2src_grab_frame): Return a flowreturn and fill the buffer directly. (gst_v4l2src_capture_init): Use the new buffer_pool_new function to allocate the pool, which also preallocates the GstBuffers. (gst_v4l2src_capture_start): Call buffer_pool_activate instead of queueing the frames directly. * sys/v4l2/gstv4l2src.h (struct _GstV4l2BufferPool): Make this a real MiniObject instead of rolling our own refcounting and finalizing. Give it a lock. (struct _GstV4l2Buffer): Remove one intermediary object, having the buffers hold the struct v4l2_buffer directly. * sys/v4l2/gstv4l2src.c (gst_v4l2src_set_caps): Pass the caps to capture_init so that it can set them on the buffers that it will create. (gst_v4l2src_get_read): For better or for worse, include the timestamping and offsetting code here; really we should be using bufferalloc though. (gst_v4l2src_get_mmap): Just make grab_frame return one of our preallocated, mmap'd buffers. 2007-06-11 11:41:56 +0000 daniel fischer sys/ximage/gstximagesrc.c: Actually use the display_name property so that we can dump any available X display. Fixes ... Original commit message from CVS: Patch by: daniel fischer * sys/ximage/gstximagesrc.c: (gst_ximage_src_start), (gst_ximage_src_get_caps): Actually use the display_name property so that we can dump any available X display. Fixes #445905. 2007-06-11 10:21:13 +0000 Tommi Myöhänen gst/rtp/: Add missing rate fields to caps. Fixes #441118. Original commit message from CVS: Patch by: Tommi Myöhänen * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps): Add missing rate fields to caps. Fixes #441118. 2007-06-10 21:14:11 +0000 Sébastien Moutte win32/: Add DirectSound and DirectDraw sinks project files to workspace and solution files. Original commit message from CVS: * win32/vs6/gst_plugins_good.dsw: * win32/vs8/gst-plugins-good.sln: Add DirectSound and DirectDraw sinks project files to workspace and solution files. 2007-06-10 10:53:26 +0000 Josh Coalson Add support for flac >= 1.1.3 which changed the API. Fixes bug #385887. Original commit message from CVS: Patch by: Josh Coalson , updated by Alexis Ballier : * configure.ac: * ext/flac/gstflacdec.c: (gst_flac_dec_reset_decoders), (gst_flac_dec_setup_seekable_decoder), (gst_flac_dec_setup_stream_decoder), (gst_flac_dec_seek), (gst_flac_dec_tell), (gst_flac_dec_length), (gst_flac_dec_eof), (gst_flac_dec_read_seekable), (gst_flac_dec_read_stream): * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.c: (gst_flac_enc_init), (gst_flac_enc_finalize), (gst_flac_enc_set_metadata), (gst_flac_enc_sink_setcaps), (gst_flac_enc_update_quality), (gst_flac_enc_seek_callback), (gst_flac_enc_write_callback), (gst_flac_enc_tell_callback), (gst_flac_enc_sink_event), (gst_flac_enc_chain), (gst_flac_enc_set_property), (gst_flac_enc_get_property), (gst_flac_enc_change_state): * ext/flac/gstflacenc.h: Add support for flac >= 1.1.3 which changed the API. Fixes bug #385887. 2007-06-09 15:41:52 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.c: Remove workaround for bug #421543. This is fixed in core 0.10.13 and not necessary anymo... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_sink_set_caps): Remove workaround for bug #421543. This is fixed in core 0.10.13 and not necessary anymore as we need at least that core version. 2007-06-09 15:33:32 +0000 Sebastian Dröge ext/wavpack/: Improve discont handling by checking if the next Wavpack block has the expected, following block index. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), (gst_wavpack_dec_chain): * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), (gst_wavpack_parse_push_buffer): * ext/wavpack/gstwavpackparse.h: Improve discont handling by checking if the next Wavpack block has the expected, following block index. 2007-06-08 20:23:07 +0000 Thomas Vander Stichele * tests/check/elements/.gitignore: moap ignore Original commit message from CVS: moap ignore 2007-06-08 20:20:56 +0000 Thomas Vander Stichele gst/rtp/gstrtpmp4vpay.c (gst_rtp_mp4vpay_details): Fix element description. Original commit message from CVS: * gst/rtp/gstrtpmp4vpay.c (gst_rtp_mp4vpay_details): Fix element description. 2007-06-08 20:19:55 +0000 Thomas Vander Stichele move wavpack plugin. See #352605. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-wavpack.xml: * ext/Makefile.am: * tests/check/Makefile.am: move wavpack plugin. See #352605. 2007-06-08 19:45:43 +0000 Thomas Vander Stichele * docs/plugins/Makefile.am: the alphabet tripping up people since 10929BC Original commit message from CVS: the alphabet tripping up people since 10929BC 2007-06-08 17:37:02 +0000 Jan Schmidt Add DirectDraw & DirectSound plugins to the build and docs. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * sys/Makefile.am: * win32/MANIFEST: Add DirectDraw & DirectSound plugins to the build and docs. 2007-06-08 16:31:15 +0000 Jan Schmidt Rename the keep-aspect-ratio property to force-aspect-ratio to make it consistent with xvimagesink and ximagesink. Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins.args: * sys/directdraw/gstdirectdrawsink.c: (gst_directdraw_sink_class_init): Rename the keep-aspect-ratio property to force-aspect-ratio to make it consistent with xvimagesink and ximagesink. 2007-06-08 10:43:26 +0000 Tim-Philipp Müller ext/: When operating in pull mode, error out correct on not-linked. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_loop): * ext/libpng/gstpngdec.c: (user_read_data), (gst_pngdec_task): When operating in pull mode, error out correct on not-linked. 2007-06-08 08:12:43 +0000 Tim-Philipp Müller tests/icles/videocrop-test.c: Default to xvimagesink instead of autovideosink while autovideosink/ghostpads/whatever ... Original commit message from CVS: * tests/icles/videocrop-test.c: (main): Default to xvimagesink instead of autovideosink while autovideosink/ghostpads/whatever don't handle the way we use it in the way we expect it to. 2007-06-06 10:19:17 +0000 Andy Wingo * ChangeLog: * sys/v4l2/v4l2src_calls.c: sys/v4l2/v4l2src_calls.c (gst_v4l2src_probe_caps_for_format) Original commit message from CVS: 2007-06-06 Andy Wingo * sys/v4l2/v4l2src_calls.c (gst_v4l2src_probe_caps_for_format) (gst_v4l2src_probe_caps_for_format_and_size): Only probe for format and size if the ioctls are defined; should fix compilation on Linux < 2.16.19. 2007-06-06 08:53:12 +0000 Tim-Philipp Müller gst/videobox/gstvideobox.c: Printf fixes in debug statements; use LOG level for debug statements that are printed for... Original commit message from CVS: * gst/videobox/gstvideobox.c: (gst_video_box_ayuv_i420): Printf fixes in debug statements; use LOG level for debug statements that are printed for each and every frame; convert c++ comments to C-style comments; not much point using g_try_malloc() if we then not even check the return value. 2007-06-05 16:32:19 +0000 Tim-Philipp Müller configure.ac: Bump requirements to released versions (core and base 0.10.13). Original commit message from CVS: * configure.ac: Bump requirements to released versions (core and base 0.10.13). * gst/icydemux/gsticydemux.c: (gst_icydemux_unicodify): Use gst_tag_utf8_from_freeform_string() from libgsttag instead of own implementation. 2007-06-05 14:17:25 +0000 Andy Wingo sys/v4l2/gstv4l2src.c (gst_v4l2src_start, gst_v4l2src_stop): Add some useless comments. Original commit message from CVS: 2007-06-05 Andy Wingo * sys/v4l2/gstv4l2src.c (gst_v4l2src_start, gst_v4l2src_stop): Add some useless comments. * sys/v4l2/v4l2src_calls.c (gst_v4l2src_capture_init): Don't queue frames before calling STREAMON, that might leave them in a state where they can't be dequeued if we go back to NULL without calling STREAMON, according to the docs. (gst_v4l2src_capture_start): Enqueue buffers here instead, right before we call STREAMON. (gst_v4l2src_capture_deinit): Remove crack to work around dequeue failures. (For me this code hung.) The pool refcounting is still crack; added a note to that effect. 2007-06-05 09:11:41 +0000 Wim Taymans gst/multipart/multipartmux.c: Add support for mapping gst structure names to the MIME type equivalent. Original commit message from CVS: * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), (gst_multipart_mux_get_mime), (gst_multipart_mux_collected): Add support for mapping gst structure names to the MIME type equivalent. Implemented for audio/x-mulaw->audio/basic. Fixes #442874. 2007-06-03 11:21:44 +0000 Sebastian Dröge gst/wavenc/gstwavenc.*: Properly write wav files with width!=depth by having the depth most significant bytes set and... Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), (gst_wavenc_sink_setcaps), (gst_wavenc_format_samples), (gst_wavenc_chain), (gst_wavenc_change_state): * gst/wavenc/gstwavenc.h: Properly write wav files with width!=depth by having the depth most significant bytes set and all others zero. Fixes #442535. 2007-06-01 13:52:17 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Add include to make buildbot happy. Original commit message from CVS: * gst/rtsp/rtspconnection.c: Add include to make buildbot happy. 2007-06-01 13:07:11 +0000 Peter Kjellerstedt gst/rtsp/: Improves version checking, allowing an RTSP server to reply with "505 Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_connect), (add_date_header), (rtsp_connection_send), (parse_response_status), (parse_request_line), (parse_line), (rtsp_connection_receive): * gst/rtsp/rtspdefs.c: (rtsp_version_as_text): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspmessage.c: (key_value_foreach), (rtsp_message_init_request), (rtsp_message_init_response), (rtsp_message_remove_header), (rtsp_message_append_headers), (rtsp_message_dump): * gst/rtsp/rtspmessage.h: Improves version checking, allowing an RTSP server to reply with "505 RTSP Version not supported. Adds a Date header to all messages. Replies with RTSP_EPARSE rather than RTSP_EINVALID in cases where we want to be able to send a response even if something in the request was invalid. EINVAL is only used when passing wrong arguments to functions. Do not handle an invalid method in parse_request_line(). Defer this to the caller so it can respond with "405 Method Not Allowed". Improves parsing of the timeout parameter to the Session header, allowing whitespace after the semicolon. Avoids a compiler warning due to variables shadowing a function argument. 2007-06-01 11:16:17 +0000 Daniel Charles gst/rtp/: Add support for AMR-WB. Original commit message from CVS: Based on Patch by: Daniel Charles * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_base_init), (gst_rtp_amr_pay_class_init), (gst_rtp_amr_pay_init), (gst_rtp_amr_pay_setcaps), (gst_rtp_amr_pay_handle_buffer): * gst/rtp/gstrtpamrpay.h: Add support for AMR-WB. Small cleanups such as using BOILERPLATE. 2007-05-31 15:57:07 +0000 Wim Taymans gst/rtsp/rtspextwms.c: Fix compile warning when debug is disabled as spotted bu Saur on IRC. Original commit message from CVS: * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_configure_stream): Fix compile warning when debug is disabled as spotted bu Saur on IRC. 2007-05-30 14:57:44 +0000 Andy Wingo sys/v4l2/gstv4l2object.*: Revert some unintended changes. Original commit message from CVS: 2007-05-30 Andy Wingo * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2object.c (gst_v4l2_object_new): Revert some unintended changes. 2007-05-30 14:40:53 +0000 Andy Wingo sys/v4l2/v4l2src_calls.*: Store the format list in the order that the driver gives it to us. Original commit message from CVS: 2007-05-30 Andy Wingo * sys/v4l2/v4l2src_calls.h: * sys/v4l2/v4l2src_calls.c (gst_v4l2src_fill_format_list): Store the format list in the order that the driver gives it to us. (gst_v4l2src_probe_caps_for_format_and_size) (gst_v4l2src_probe_caps_for_format): New functions, fill GstCaps based on the capabilities of the device. (gst_v4l2src_grab_frame): Update for object variable renaming. (gst_v4l2src_set_capture): Update to be strict in its parameters, as in the set_caps below. (gst_v4l2src_capture_init): Update for object variable renaming, and reflow. (gst_v4l2src_capture_start, gst_v4l2src_capture_stop) (gst_v4l2src_capture_deinit): Update for object variable renaming. (gst_v4l2src_update_fps, gst_v4l2src_set_fps) (gst_v4l2src_get_fps): Remove; these functions don't have much meaning outside of an atomic set_caps method. (gst_v4l2src_buffer_new): Don't set buffer duration, it is not known. * sys/v4l2/gstv4l2tuner.c (gst_v4l2_tuner_set_channel): Remove call to update_fps; not sure about this change. (gst_v4l2_tuner_set_norm): Work around the fact that for the moment we don't have an update_fps_func. * sys/v4l2/gstv4l2src.h (struct _GstV4l2Src): Don't put v4l2 structures in the object, just store what we need. Do store the probed caps of the device. Don't store the current frame rate. * sys/v4l2/gstv4l2src.c (gst_v4l2src_init): Remove the update_fps_function, for now. Update for new object variable naming. (gst_v4l2src_set_property, gst_v4l2src_get_property): Update for new object variable naming. (gst_v4l2src_v4l2fourcc_to_structure): Rename from ..._to_caps. (gst_v4l2_structure_to_v4l2fourcc): Rename from ...caps_to_.... (gst_v4l2src_get_caps): Rework to probe the device for supported frame sizes and frame rates. (gst_v4l2src_set_caps): Rework to be strict in the given parameters: if someone asks us to have a certain size and rate, that is what we configure. (gst_v4l2src_get_read): Update for object variable naming. Don't leak buffers on short reads. (gst_v4l2src_get_mmap): Update for object variable naming, and add comments. (gst_v4l2src_create): Update for object variable naming. 2007-05-30 14:38:59 +0000 Tim-Philipp Müller gst/avi/gstavidemux.*: Parse subtitle text streams instead of erroring out (#442034). Still needs a parser for the su... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_base_init), (gst_avi_demux_reset), (gst_avi_demux_parse_stream): * gst/avi/gstavidemux.h: Parse subtitle text streams instead of erroring out (#442034). Still needs a parser for the subtitles to actually show up. 2007-05-30 12:46:32 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Make _push_event() return TRUE if the event could be pushed on at least one pad and not only i... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_push_event), (gst_avi_demux_loop): Make _push_event() return TRUE if the event could be pushed on at least one pad and not only if it could be pushed on all pads, otherwise we'll end up posting an error message on EOS if one or more source pads are not connected. 2007-05-28 16:39:09 +0000 Wim Taymans gst/rtsp/rtsptransport.c: Use renamed RTP bin. Original commit message from CVS: * gst/rtsp/rtsptransport.c: Use renamed RTP bin. 2007-05-28 15:01:33 +0000 Dejan Sakelšak gst/videobox/gstvideobox.c: Add AYUV->AYUV and AYUV->I420 formats. Original commit message from CVS: Based on patch by: Dejan Sakelšak * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_set_property), (gst_video_box_transform_caps), (video_box_recalc_transform), (gst_video_box_set_caps), (gst_video_box_get_unit_size), (gst_video_box_apply_alpha), (gst_video_box_ayuv_ayuv), (gst_video_box_clear), (UVfloor), (UVceil), (gst_video_box_ayuv_i420), (gst_video_box_i420_ayuv), (gst_video_box_i420_i420), (gst_video_box_transform), (plugin_init): Add AYUV->AYUV and AYUV->I420 formats. Fix negotiation and I420->AYUV conversion. Fixes #429329. 2007-05-26 15:25:18 +0000 Wim Taymans ext/speex/gstspeexdec.c: Use different variables for nested for loops so that the outer loop functions properly and s... Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_data): Use different variables for nested for loops so that the outer loop functions properly and speex files with multiple frames per buffer work properly. Fixes #441408. 2007-05-25 20:51:36 +0000 Tim-Philipp Müller gst/id3demux/gstid3demux.c: Don't leak newsegment events. Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_sink_event): Don't leak newsegment events. 2007-05-25 20:33:10 +0000 Tim-Philipp Müller gst/wavparse/Makefile.am: Add '-lm' to LIBS for ceil(), don't assume one of our dependencies drags it in. Original commit message from CVS: * gst/wavparse/Makefile.am: Add '-lm' to LIBS for ceil(), don't assume one of our dependencies drags it in. 2007-05-25 16:02:51 +0000 Tim-Philipp Müller ext/flac/gstflacenc.*: Collect headers, add "streamheader" field to output caps and set Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_init), (notgst_value_array_append_buffer), (gst_flac_enc_process_stream_headers), (gst_flac_enc_write_callback), (gst_flac_enc_chain), (gst_flac_enc_change_state): * ext/flac/gstflacenc.h: Collect headers, add "streamheader" field to output caps and set BUFFER_IN_CAPS flag on pushed header buffers. That way oggmux produces output according to the official FLAC-to-Ogg mapping instead of completely broken files. Fixes #426044. 2007-05-25 10:44:12 +0000 Jan Schmidt gst/: Handle and adjust new-segment events so that downstream really sees a stream with the tag pieces stripped off t... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_reset), (gst_id3demux_send_new_segment), (gst_id3demux_chain), (gst_id3demux_sink_event): * gst/id3demux/gstid3demux.h: * gst/apetag/gsttagdemux.c: (gst_tag_demux_reset), (gst_tag_demux_chain), (gst_tag_demux_sink_event), (gst_tag_demux_send_new_segment): Handle and adjust new-segment events so that downstream really sees a stream with the tag pieces stripped off the front and back. Fixes strangeness in seeking when mp3 decoders use the new-segment byte position to estimate their current playback position timestamp and then the arriving buffers don't match up. 2007-05-25 10:23:49 +0000 Jan Schmidt gst/autodetect/gstautoaudiosink.c: Don't unnecessarily perform a READY->NULL->READY transition on the detected audio ... Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_detect): Don't unnecessarily perform a READY->NULL->READY transition on the detected audio sink when starting up. Fixes: #440127 2007-05-24 17:00:21 +0000 Tim-Philipp Müller ext/flac/gstflacenc.c: Don't crash in chain function if setcaps hasn't been called. Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_sink_setcaps), (gst_flac_enc_chain): Don't crash in chain function if setcaps hasn't been called. 2007-05-24 08:35:23 +0000 Vincent Torri sys/directdraw/gstdirectdrawsink.*: Fix more warnings when compiling with MingW (#439914). Original commit message from CVS: Patch by: Vincent Torri * sys/directdraw/gstdirectdrawsink.c: (gst_directdraw_sink_buffer_alloc), (gst_directdraw_sink_show_frame), (gst_directdraw_sink_check_primary_surface), (gst_directdraw_sink_check_offscreen_surface), (EnumModesCallback2), (gst_directdraw_sink_get_ddrawcaps), (gst_directdraw_sink_surface_create): * sys/directdraw/gstdirectdrawsink.h: Fix more warnings when compiling with MingW (#439914). 2007-05-24 08:14:00 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Init value to avoid infinte loops. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_methods): Init value to avoid infinte loops. 2007-05-24 08:10:42 +0000 Peter Kjellerstedt gst/rtsp/: Fix for new API. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_auth), (gst_rtspsrc_try_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), (gst_rtspsrc_play): (rtsp_connection_send), (rtsp_connection_receive): * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_after_send): Fix for new API. * gst/rtsp/rtspconnection.c: (add_auth_header), Only add authorisation and session headers when sending messages. * gst/rtsp/rtspmessage.c: (key_value_foreach), (rtsp_message_init), (rtsp_message_init_request), (rtsp_message_init_response), (rtsp_message_unset), (rtsp_message_add_header), (rtsp_message_remove_header), (rtsp_message_get_header), (rtsp_message_append_headers), (dump_key_value), (rtsp_message_dump): * gst/rtsp/rtspmessage.h: Add support for multiple headers of the same type by storing the parsed headers in a GArray instaed of a hashtable. 2007-05-23 22:44:12 +0000 Sébastien Moutte docs/plugins/gst-plugins-bad-plugins.args: Remove directsoundsink property doc as this sink use the mixer interface now. Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins.args: Remove directsoundsink property doc as this sink use the mixer interface now. * docs/plugins/gst-plugins-bad-plugins.interfaces: Add interfaces implemented by Windows sinks. * sys/directsound/gstdirectsoundsink.c: * sys/directsound/gstdirectsoundsink.h: Remove directsoundsink property and implement the mixer interface. * win32/vs6/gst_plugins_bad.dsw: * win32/vs6/libgstdirectsound.dsp: Update project files. * gst-libs/gst/dshow/gstdshow.cpp: * gst-libs/gst/dshow/gstdshow.h: * gst-libs/gst/dshow/gstdshowfakesink.cpp: * gst-libs/gst/dshow/gstdshowfakesink.h: * gst-libs/gst/dshow/gstdshowfakesrc.cpp: * gst-libs/gst/dshow/gstdshowfakesrc.h: * gst-libs/gst/dshow/gstdshowinterface.cpp: * gst-libs/gst/dshow/gstdshowinterface.h: * win32/common/libgstdshow.def: * win32/vs6/libgstdshow.dsp: Add a new gst library which allow to create internal Direct Show graph (pipelines) to wrap Windows sources, decoders or encoders. It includes a DirectShow fake source and sink and utility functions. * sys/dshowsrcwrapper/gstdshowaudiosrc.c: * sys/dshowsrcwrapper/gstdshowaudiosrc.h: * sys/dshowsrcwrapper/gstdshowsrcwrapper.c: * sys/dshowsrcwrapper/gstdshowsrcwrapper.h: * sys/dshowsrcwrapper/gstdshowvideosrc.c: * sys/dshowsrcwrapper/gstdshowvideosrc.h: * win32/vs6/libdshowsrcwrapper.dsp: Add a new plugin to wrap DirectShow sources on Windows. It gets data from any webcam, dv cam, micro. We could add tv tunner card later. 2007-05-22 11:14:13 +0000 Stefan Kost configure.ac: Depend on gstreamer-0.10.12.1. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _Gs... Original commit message from CVS: * configure.ac: Depend on gstreamer-0.10.12.1. * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, parent_class, gst_iir_equalizer_band_set_property, gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, gst_iir_equalizer_child_proxy_get_child_by_index, gst_iir_equalizer_child_proxy_get_children_count, gst_iir_equalizer_child_proxy_interface_init, setup_filter, gst_iir_equalizer_compute_frequencies, gst_iir_equalizer_set_property, gst_iir_equalizer_get_property, plugin_init): * gst/equalizer/gstiirequalizer.h (audiofilter): * gst/equalizer/gstiirequalizernbands.c (ARG_NUM_BANDS, gst_iir_equalizer_nbands_base_init, gst_iir_equalizer_nbands_init, gst_iir_equalizer_nbands_set_property): Use new locking macros. * gst/filter/gstbpwsinc.c (bpwsinc_set_caps): Add fixme. * gst/spectrum/gstspectrum.c (SPECTRUM_WINDOW_BASE, SPECTRUM_WINDOW_LEN, gst_spectrum_init, gst_spectrum_set_property, gst_spectrum_event, gst_spectrum_transform_ip): Use new locking macros. Turn two fixed values into #defines. 2007-05-22 11:03:30 +0000 Edward Hervey docs/plugins/Makefile.am: Also look for .m (objectivec) files. Original commit message from CVS: * docs/plugins/Makefile.am: Also look for .m (objectivec) files. * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.args: * sys/osxvideo/osxvideosink.m: Add documentation for element and properties. 2007-05-21 14:01:16 +0000 Stefan Kost ChangeLog: ChangeLog surgery. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBa... Original commit message from CVS: * ChangeLog: ChangeLog surgery. * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, parent_class, gst_iir_equalizer_band_set_property, gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, gst_iir_equalizer_child_proxy_get_child_by_index, gst_iir_equalizer_child_proxy_get_children_count, gst_iir_equalizer_child_proxy_interface_init, setup_filter, gst_iir_equalizer_compute_frequencies, plugin_init): * tests/icles/equalizer-test.c: Add fixme and comment for example. 2007-05-21 12:43:37 +0000 Stefan Kost * gst/spectrum/gstspectrum.c: gst/spectrum/gstspectrum.c (gst_spectrum_set_property, gst_spectrum_event, gst_spectrum_transform_ip): Original commit message from CVS: * gst/spectrum/gstspectrum.c (gst_spectrum_set_property, gst_spectrum_event, gst_spectrum_transform_ip): Use lock to protect from concurrent access. 2007-05-21 11:37:16 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.c: Specify and use properties as unsigned int that are an unsigned int. Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): Specify and use properties as unsigned int that are an unsigned int. 2007-05-21 11:17:21 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.*: Fixup docs, make the bitrate property an int as it should be and allow to set the differ... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): * ext/wavpack/gstwavpackenc.h: Fixup docs, make the bitrate property an int as it should be and allow to set the different extra processing modes instead of only allowing none and the default one. 2007-05-21 10:07:05 +0000 Wim Taymans gst/udp/gstudpsrc.c: Since we depend on 0.10.13 -core, override the unlock_stop vmethod for safer shutdown. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_create), (gst_udpsrc_unlock), (gst_udpsrc_unlock_stop): Since we depend on 0.10.13 -core, override the unlock_stop vmethod for safer shutdown. 2007-05-21 10:03:42 +0000 Wim Taymans gst/rtsp/gstrtpdec.*: Added signal for backwards compat. Original commit message from CVS: * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_class_init): * gst/rtsp/gstrtpdec.h: Added signal for backwards compat. 2007-05-21 09:32:26 +0000 René Stadler Use audioconvert for converting from non-native endianness floats in auparse instead of doing it ourself. Fixes #424527. Original commit message from CVS: Patch by: René Stadler * configure.ac: * gst/auparse/gstauparse.c: (gst_au_parse_reset), (gst_au_parse_parse_header), (gst_au_parse_chain): * gst/auparse/gstauparse.h: Use audioconvert for converting from non-native endianness floats in auparse instead of doing it ourself. Fixes #424527. This needs the audioconvert from plugins-base CVS. 2007-05-21 09:29:30 +0000 Wim Taymans gst/rtp/gstrtph263ppay.c: Fix enum registration. Original commit message from CVS: * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), (gst_rtp_h263p_pay_flush): Fix enum registration. 2007-05-21 08:57:18 +0000 Antoine Tremblay gst/rtp/gstrtph263ppay.*: Add new fragmentation mode base on GOB headers. Fixes #438940. Original commit message from CVS: Patch by: Antoine Tremblay * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_init), (gst_rtp_h263p_pay_set_property), (gst_rtp_h263p_pay_get_property), (gst_rtp_h263p_pay_flush): * gst/rtp/gstrtph263ppay.h: Add new fragmentation mode base on GOB headers. Fixes #438940. 2007-05-20 21:31:58 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.c: Add missing audioconverts in the example pipelines of wavpackenc. As the wavpack stuff n... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: Add missing audioconverts in the example pipelines of wavpackenc. As the wavpack stuff now needs input with 32 bit width (and random depth) this is needed now. The example pipelines for the parser and decoder are still fine. 2007-05-20 14:59:46 +0000 Tim-Philipp Müller sys/directdraw/gstdirectdrawsink.c: Bunch of small fixes: remove static function that doesn't exist; declare another ... Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c: (gst_ddrawsurface_finalize), (gst_directdraw_sink_buffer_alloc), (gst_directdraw_sink_get_ddrawcaps), (gst_directdraw_sink_surface_create): Bunch of small fixes: remove static function that doesn't exist; declare another one that does; printf format fix; use right macro when specifying debug category; remove a bunch of unused variables; #if 0 out an unused chunk of code (partially fixes #439914). 2007-05-20 14:14:49 +0000 Tim-Philipp Müller gst/: Printf format fixes (#439910, #439911). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample): * gst/switch/gstswitch.c: (gst_switch_chain): Printf format fixes (#439910, #439911). 2007-05-20 14:05:42 +0000 Tim-Philipp Müller gst/rtsp/gstrtspsrc.c: Printf format fix. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp): Printf format fix. 2007-05-19 10:01:45 +0000 René Stadler Add replaygain playback elements (#412710). Original commit message from CVS: Patch by: René Stadler * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/inspect/plugin-replaygain.xml: * gst/replaygain/Makefile.am: * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_class_init), (gst_rg_analysis_start), (gst_rg_analysis_set_caps), (gst_rg_analysis_transform_ip), (gst_rg_analysis_event), (gst_rg_analysis_stop), (gst_rg_analysis_handle_tags), (gst_rg_analysis_handle_eos), (gst_rg_analysis_track_result), (gst_rg_analysis_album_result): * gst/replaygain/gstrganalysis.h: * gst/replaygain/gstrglimiter.c: (gst_rg_limiter_base_init), (gst_rg_limiter_class_init), (gst_rg_limiter_init), (gst_rg_limiter_set_property), (gst_rg_limiter_get_property), (gst_rg_limiter_transform_ip): * gst/replaygain/gstrglimiter.h: * gst/replaygain/gstrgvolume.c: (gst_rg_volume_base_init), (gst_rg_volume_class_init), (gst_rg_volume_init), (gst_rg_volume_set_property), (gst_rg_volume_get_property), (gst_rg_volume_dispose), (gst_rg_volume_change_state), (gst_rg_volume_sink_event), (gst_rg_volume_tag_event), (gst_rg_volume_reset), (gst_rg_volume_update_gain), (gst_rg_volume_determine_gain): * gst/replaygain/gstrgvolume.h: * gst/replaygain/replaygain.c: (plugin_init): * gst/replaygain/replaygain.h: * gst/replaygain/rganalysis.h: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/rganalysis.c: (send_eos_event), (GST_START_TEST): * tests/check/elements/rglimiter.c: (setup_rglimiter), (cleanup_rglimiter), (set_playing_state), (create_test_buffer), (verify_test_buffer), (GST_START_TEST), (rglimiter_suite), (main): * tests/check/elements/rgvolume.c: (event_func), (setup_rgvolume), (cleanup_rgvolume), (set_playing_state), (set_null_state), (send_eos_event), (send_tag_event), (test_buffer_new), (fail_unless_target_gain), (fail_unless_result_gain), (fail_unless_gain), (GST_START_TEST), (rgvolume_suite), (main): Add replaygain playback elements (#412710). 2007-05-18 13:27:39 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Don't crash when an unsupported transport error was returned by the server, just try to config... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_setup_streams): Don't crash when an unsupported transport error was returned by the server, just try to configure the next stream. Fixes #439255. 2007-05-18 11:39:12 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Add TCP timeout property and use it for all TCP connection. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (gst_rtspsrc_stream_configure_udp), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_setup_streams), (gst_rtspsrc_open): * gst/rtsp/gstrtspsrc.h: Add TCP timeout property and use it for all TCP connection. * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), (rtsp_connection_write), (rtsp_connection_next_timeout), (rtsp_connection_reset_timeout): Make connect and writes cancelable and make them use the timeout. 2007-05-18 10:36:12 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Refactor timeout handling. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_setup_streams): Refactor timeout handling. Also send keep-alive when dealing with TCP transport. * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_free), (rtsp_connection_next_timeout), (rtsp_connection_reset_timeout): * gst/rtsp/rtspconnection.h: Use a timer to handle the session timeouts, add some methods to deal with timeouts. 2007-05-17 14:56:39 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Ignore streams that fail the setup command, we will retry with a different transport later on. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_setup_streams): Ignore streams that fail the setup command, we will retry with a different transport later on. * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_parse_sdp), (rtsp_ext_wms_configure_stream): Fix encoding name case. 2007-05-17 10:59:00 +0000 Edward Hervey sys/osxvideo/osxvideosink.*: Remove the event-loop-in-separate-thread modifications, because MacOSX is $#@(*%$# ! For... Original commit message from CVS: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Remove the event-loop-in-separate-thread modifications, because MacOSX is $#@(*%$# ! For those wondering, the event handling needs to be done in the main thread after all.. 2007-05-17 09:41:48 +0000 Edward Hervey sys/osxvideo/osxvideosink.*: Fix a stupid #if vs #ifdef bug. Should use the proper colorspace now. Original commit message from CVS: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Fix a stupid #if vs #ifdef bug. Should use the proper colorspace now. Use a separate thread/task for the cocoa event_loop, else it wouldn't stop. 2007-05-16 16:50:23 +0000 Edward Hervey ext/libpng/gstpngdec.c: Fix build on macosx. Original commit message from CVS: * ext/libpng/gstpngdec.c: (user_endrow_callback), (user_read_data): Fix build on macosx. 2007-05-16 16:30:03 +0000 Sebastian Dröge ext/raw1394/gstdv1394src.c: Replace direct comparison of a string with the string literal "" with a comparison of the... Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_uri_set_uri): Replace direct comparison of a string with the string literal "" with a comparison of the first character with '\0'. Fixes #438926. 2007-05-15 17:22:58 +0000 Tim-Philipp Müller Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save and restore the various flags in the directdraw/dir... Original commit message from CVS: * configure.ac: * sys/directdraw/Makefile.am: * sys/directsound/Makefile.am: Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save and restore the various flags in the directdraw/directsound detection section. Apparently improves cross-compiling for win32 with mingw32 under some circumstances (#437539). 2007-05-15 11:18:33 +0000 Stefan Kost gst/debug/breakmydata.c (gst_break_my_data_init): One more try. This should be the proper fix now. Original commit message from CVS: * gst/debug/breakmydata.c (gst_break_my_data_init): One more try. This should be the proper fix now. 2007-05-15 06:41:58 +0000 Stefan Kost gst/debug/breakmydata.c: Ooops, no // comments please. Original commit message from CVS: * gst/debug/breakmydata.c: Ooops, no // comments please. 2007-05-15 06:34:48 +0000 Stefan Kost gst/debug/breakmydata.c: Fix gst_buffer_is_writable() assertion. Original commit message from CVS: * gst/debug/breakmydata.c: (gst_break_my_data_class_init), (gst_break_my_data_init): Fix gst_buffer_is_writable() assertion. 2007-05-15 02:56:23 +0000 David Schleef sys/v4l2/gstv4l2src.c: Add support for Bayer images as video/x-raw-bayer. Fixes #314160. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: Add support for Bayer images as video/x-raw-bayer. Fixes #314160. 2007-05-14 17:10:12 +0000 Wim Taymans gst/rtp/: Update theora pay/depayloader in a similar to vorbis. Original commit message from CVS: * gst/rtp/gstrtptheoradepay.c: (decode_base64), (gst_rtp_theora_depay_parse_configuration): * gst/rtp/gstrtptheorapay.c: (encode_base64), (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_handle_buffer): Update theora pay/depayloader in a similar to vorbis. * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_parse_configuration): Update docs. 2007-05-14 16:19:58 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: When we try to execute a method that is not supported by the server, don't error out but remov... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send): When we try to execute a method that is not supported by the server, don't error out but remove the method from the accepted methods so that we never try to perform this method again. 2007-05-14 14:47:26 +0000 Wim Taymans gst/rtp/gstrtpvorbisdepay.c: Remove annoying _dump_mem. Original commit message from CVS: * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): Remove annoying _dump_mem. 2007-05-14 11:11:42 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Parse range correctly. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_range): Parse range correctly. * gst/rtsp/rtspurl.c: (rtsp_url_get_request_uri): The baseurl now always has a '/' at the start. 2007-05-14 09:01:05 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Factor out caps configuration and configure more stuff such as the time ranges and speed/scale... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_configure_caps), (gst_rtspsrc_parse_range), (gst_rtspsrc_open), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play): Factor out caps configuration and configure more stuff such as the time ranges and speed/scale values. * gst/rtsp/rtsptransport.c: Add Copyright after non-trival fixes. 2007-05-13 19:57:45 +0000 David Schleef gst/replaygain/rganalysis.c: Fix wrong ifdef for visual C++. Fixes: #437403. Original commit message from CVS: * gst/replaygain/rganalysis.c: Fix wrong ifdef for visual C++. Fixes: #437403. By Ali Sabil . 2007-05-13 15:47:13 +0000 Sébastien Moutte gst/level/gstlevel.c: Use guint8 * instead of gpointer then vs6 can build in_data += (filter->width / 8). Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_transform_ip): Use guint8 * instead of gpointer then vs6 can build in_data += (filter->width / 8). 2007-05-12 16:37:50 +0000 Peter Kjellerstedt gst/rtsp/: Make channel guint8 where possible. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspconnection.c: (rtsp_connection_receive): * gst/rtsp/rtspmessage.c: (rtsp_message_init_data), (rtsp_message_get_header): * gst/rtsp/rtspmessage.h: Make channel guint8 where possible. Make rtsp_message_init_data() take the channel as a guint8. * gst/rtsp/rtspdefs.c: Fixed a typo: Timout -> Timeout * gst/rtsp/rtspdefs.h: Make RTSP_CHECK() behave as a statement. * gst/rtsp/sdpmessage.c: Avoid a compiler warning in INIT_ARRAY(). Fixes #437692. 2007-05-12 16:27:51 +0000 Peter Kjellerstedt gst/rtsp/rtspurl.*: Add support for query parameters to RTSP URLs. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free), (rtsp_url_get_request_uri): * gst/rtsp/rtspurl.h: Add support for query parameters to RTSP URLs. 2007-05-12 16:26:06 +0000 Peter Kjellerstedt gst/rtsp/rtsptransport.*: Add validation to rtsp_transport_parse(). Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/rtsptransport.c: (rtsp_transport_init), (parse_mode), (parse_range), (range_as_text), (rtsp_transport_mode_as_text), (rtsp_transport_profile_as_text), (rtsp_transport_ltrans_as_text), (rtsp_transport_parse), (rtsp_transport_as_text): * gst/rtsp/rtsptransport.h: Add validation to rtsp_transport_parse(). Add rtsp_transport_as_text() to generate an RTSP header from an RTSPTransport. Change ssrc to guint (was a string) since that is what it is, even though it is sent as a hex string. Correctly identify PLAY|RECORD mode parameters (the syntax in the RFC is incorrect, which can be seen when looking at the examples in the RFC). Fixes #437670. 2007-05-11 16:11:04 +0000 Eric Anholt * ChangeLog: * sys/ximage/gstximagesrc.c: sys/ximage/gstximagesrc.c (gst_ximage_src_open_display, gst_ximage_src_ximage_get): Original commit message from CVS: Patch by: Eric Anholt * sys/ximage/gstximagesrc.c (gst_ximage_src_open_display, gst_ximage_src_ximage_get): Use union of all damage between frames to make it faster. Fixes bug #342463. Also fix crasher when cursor is at bottom right of window. 2007-05-11 16:01:45 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: Skip LIST chunks before the fmt chunk (fixes #437499). Also fix streaming mode regression... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Skip LIST chunks before the fmt chunk (fixes #437499). Also fix streaming mode regression for file from #343837 with 'bext' chunk before the 'fmt' chunk. 2007-05-11 15:09:39 +0000 Wim Taymans gst/rtsp/: Preliminary seek support. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_flush), (gst_rtspsrc_do_seek), (gst_rtspsrc_perform_seek), (gst_rtspsrc_handle_src_event), (gst_rtspsrc_stream_configure_manager), (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_open), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspdefs.h: Preliminary seek support. Activate internal pads so that we can receive events on them. Don't try to parse a range string when it's NULL. 2007-05-11 15:04:38 +0000 Wim Taymans gst/rtp/README: Update README with new RTP variables that will be used for synchronisation. Original commit message from CVS: * gst/rtp/README: Update README with new RTP variables that will be used for synchronisation. * gst/rtp/gstrtpvorbisdepay.c: (decode_base64), (gst_rtp_vorbis_depay_parse_configuration), (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c: (encode_base64), (gst_rtp_vorbis_pay_finish_headers), (gst_rtp_vorbis_pay_handle_buffer): Update vorbis pay and depayloader to draft-04. 2007-05-11 11:24:13 +0000 Wim Taymans gst/rtsp/rtsptransport.c: UDP MCAST is actually the default for RTP/AVP. Original commit message from CVS: * gst/rtsp/rtsptransport.c: UDP MCAST is actually the default for RTP/AVP. 2007-05-11 10:31:27 +0000 Zaheer Abbas Merali sys/ximage/gstximagesrc.c (gst_ximage_src_start, gst_ximage_src_ximage_get): Original commit message from CVS: * sys/ximage/gstximagesrc.c (gst_ximage_src_start, gst_ximage_src_ximage_get): * sys/ximage/gstximagesrc.h (last_ximage): When using Damage actually keep the last frame, and not assume that the buffer we get already has the last frame on it. Copy the cursor over if we specify a non-zero start x and start y. 2007-05-11 09:12:55 +0000 Wim Taymans gst/rtsp/rtsptransport.c: Make UDP the default transport when not specified. Original commit message from CVS: * gst/rtsp/rtsptransport.c: Make UDP the default transport when not specified. 2007-05-10 14:02:07 +0000 Stefan Kost gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtde... Original commit message from CVS: * gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtdemux_prepare_current_sample, gst_qtdemux_combine_flows, gst_qtdemux_loop_state_movie, gst_qtdemux_loop, qtdemux_parse_segments, qtdemux_parse_trak): * gst/rtpmanager/rtpsession.c (rtp_session_get_bandwidth, rtp_session_get_rtcp_bandwidth, rtp_session_get_cname, rtp_session_get_name, rtp_session_get_email, rtp_session_get_phone, rtp_session_get_location, rtp_session_get_tool, rtp_session_process_bye, session_report_blocks): * gst/rtpmanager/rtpsource.c (rtp_source_process_rtp, rtp_source_send_rtp, rtp_source_process_sr, rtp_source_process_rb): More format arg fixing (spotted by Ali Sabil ). * gst/switch/Makefile.am: Add require libraries(spotted by Ali Sabil ). 2007-05-10 01:21:19 +0000 David Schleef gst/level/gstlevel.c: Revert last change. Original commit message from CVS: * gst/level/gstlevel.c: Revert last change. 2007-05-09 21:30:53 +0000 Sébastien Moutte gst/level/gstlevel.c: Use guint8 * instead of gpointer then vs6 know the size of data pointed when moving the pointer. Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_calculate_##TYPE), (gst_level_transform_ip): Use guint8 * instead of gpointer then vs6 know the size of data pointed when moving the pointer. * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_handle_buffer): Move instructions after variables declaration. * win32/vs6/autogen.dsp: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: Update vs6 project files. 2007-05-09 11:23:39 +0000 Wim Taymans gst/rtsp/: Add code to parse time ranges. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_query), (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_open): * gst/rtsp/rtsprange.c: (parse_npt_time), (parse_npt_range), (parse_clock_range), (parse_smpte_range), (rtsp_range_parse), (rtsp_range_free): * gst/rtsp/rtsprange.h: Add code to parse time ranges. Report DURATION on the stream when possible. 2007-05-08 15:49:01 +0000 Tim-Philipp Müller gst/videomixer/videomixer.c: Fix strides calculation for AYUV (it's just width*4) (#436910). Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_ayuv), (gst_videomixer_fill_checker), (gst_videomixer_fill_color), (gst_videomixer_collected): Fix strides calculation for AYUV (it's just width*4) (#436910). 2007-05-06 21:32:40 +0000 Sebastian Dröge gst/audiofx/: Sync the GObject properties before each processing step to properly work with the controller. Original commit message from CVS: * gst/audiofx/audioamplify.c: (gst_audio_amplify_transform_ip): * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_transform_ip): * gst/audiofx/audioinvert.c: (gst_audio_invert_transform_ip): Sync the GObject properties before each processing step to properly work with the controller. 2007-05-04 15:17:14 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Let more error state trickle down so that we can catch more error cases. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_udp), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_change_state): Let more error state trickle down so that we can catch more error cases. Handle keep-alive a little smarter by selecting a method the server actually supports. Fix a race in UDP streaming shutdown. 2007-05-04 13:04:31 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Ignore errors when trying to use the keep-alive messages. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send_keep_alive): Ignore errors when trying to use the keep-alive messages. 2007-05-04 12:31:32 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Send RTCP messages back to the server over the TCP connection. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_handle_src_event), (gst_rtspsrc_handle_src_query), (gst_rtspsrc_sink_chain), (gst_rtspsrc_stream_configure_manager), (gst_rtspsrc_stream_free_udp), (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_stream_configure_mcast), (gst_rtspsrc_stream_configure_udp), (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_stream_configure_transport): Send RTCP messages back to the server over the TCP connection. * gst/rtsp/rtspconnection.c: (rtsp_connection_write), (rtsp_connection_send), (rtsp_connection_read), (read_body), (rtsp_connection_receive): * gst/rtsp/rtspconnection.h: Factor out and expose lowlevel _write and _read methods. Implement sending data messages to the server. 2007-05-03 15:55:06 +0000 Wim Taymans gst/multipart/multipartmux.c: Fix timestamps on outgoing buffers. Original commit message from CVS: * gst/multipart/multipartmux.c: (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected): Fix timestamps on outgoing buffers. 2007-05-03 14:39:09 +0000 Wim Taymans gst/multipart/multipartmux.c: Emit NEWSEGMENT events before pushing the first buffer. Original commit message from CVS: * gst/multipart/multipartmux.c: (gst_multipart_mux_request_new_pad), (gst_multipart_mux_collected), (gst_multipart_mux_change_state): Emit NEWSEGMENT events before pushing the first buffer. 2007-05-03 13:48:54 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Refactor transport configuration code. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), (gst_rtspsrc_alloc_udp_ports), (gst_rtspsrc_handle_src_event), (gst_rtspsrc_handle_src_query), (gst_rtspsrc_stream_configure_manager), (gst_rtspsrc_stream_free_udp), (gst_rtspsrc_stream_configure_tcp), (gst_rtspsrc_stream_configure_mcast), (gst_rtspsrc_stream_configure_udp), (gst_rtspsrc_stream_configure_udp_sink), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_push_event), (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play), (gst_rtspsrc_pause): Refactor transport configuration code. Create internal pads for TCP transport so that we can implement events and queries. Handle events and queries. Parse range from the SDP. Fix race in pause handler where the connection could still be flushing. 2007-05-02 19:32:58 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Fix race when multiple udp sources post timeouts, just act on the first received timeout. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize), (new_session_pad), (request_pt_map), (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_try_send), (gst_rtspsrc_send), (gst_rtspsrc_async_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Fix race when multiple udp sources post timeouts, just act on the first received timeout. Protect stream list with a recursive lock to fix some races. Flush connection when we need to do a reconnect or stop. Make state lock recursive. * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), (rtsp_connection_close): Some small cleanups. 2007-05-02 18:31:16 +0000 Sebastian Dröge ext/wavpack/gstwavpack.c: Call bindtextdomain() to get localized strings. Original commit message from CVS: * ext/wavpack/gstwavpack.c: (plugin_init): Call bindtextdomain() to get localized strings. * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), (gst_wavpack_parse_handle_seek_event), (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_chain): * ext/wavpack/gstwavpackparse.h: Handle DISCONT buffers by correctly setting the DISCONT flag on outgoing buffers when necessary. * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_handle_seek_event) Send newsegment from the streaming thread. 2007-05-02 18:25:09 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Only set DISCONT when there actually is a discont or when we just started. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): Only set DISCONT when there actually is a discont or when we just started. 2007-05-02 18:01:52 +0000 Sebastian Dröge ext/flac/gstflac.c: Call bindtextdomain() to get localized strings. Original commit message from CVS: * ext/flac/gstflac.c: (plugin_init): Call bindtextdomain() to get localized strings. 2007-05-02 17:19:36 +0000 Wim Taymans gst/wavparse/gstwavparse.*: Be a bit more clever when dealing with VBR files with FACT tags, we don't want to timesta... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data): * gst/wavparse/gstwavparse.h: Be a bit more clever when dealing with VBR files with FACT tags, we don't want to timestamp buffers in that case but the estimated BPS can be used for seeking. Only send close segment in the streaming thread. 2007-05-02 17:08:09 +0000 Sebastian Dröge ext/flac/gstflacdec.c: Correctly post an error on the bus if something went wrong in the loop function. This fixes a ... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_loop): Correctly post an error on the bus if something went wrong in the loop function. This fixes a few cases where the task was paused and nothing happened anymore. 2007-05-02 16:58:06 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Remove old workaround that was needed when seeking after the last sample. With the fix... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_handle_seek_event): Remove old workaround that was needed when seeking after the last sample. With the fixed error handling this works now as expected without pushing the last sample although it wasn't requested. 2007-05-02 16:45:43 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Handle segment seeks in the seek event handler, correctly work with stop position == -... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_handle_seek_event): Handle segment seeks in the seek event handler, correctly work with stop position == -1 and instead of stopping the task on seek just pause it. 2007-05-02 16:19:58 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Add handling for segment seeks. Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_loop): Add handling for segment seeks. 2007-05-02 15:13:04 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Correctly handle errors, especially in the loop function. Before it was easy to get th... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_pull_buffer), (gst_wavpack_parse_create_src_pad), (gst_wavpack_parse_resync_loop), (gst_wavpack_parse_loop), (gst_wavpack_parse_chain): Correctly handle errors, especially in the loop function. Before it was easy to get the task paused but no error being posted on the bus. 2007-05-02 14:27:28 +0000 Wim Taymans gst/rtsp/test.c: Fix compilation of deprecated test just because I'm too lazy to delete it. Original commit message from CVS: * gst/rtsp/test.c: (main): Fix compilation of deprecated test just because I'm too lazy to delete it. 2007-05-02 13:32:57 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Fix sending RTCP to the right place. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_handle_request), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_send_keep_alive), (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_try_send), (gst_rtspsrc_open), (gst_rtspsrc_handle_message): * gst/rtsp/gstrtspsrc.h: Fix sending RTCP to the right place. Fix bug in reffing the wrong UDP element. Use new pad names for the session manager. Implement handling server requests in interleaved and UDP modes. Handle session keep-alive in UDP modes. Remove GCond for handling UDP timeouts. * gst/rtsp/rtspconnection.c: (rtsp_connection_connect), (rtsp_connection_send), (rtsp_connection_read), (read_body), (rtsp_connection_receive), (rtsp_connection_close): * gst/rtsp/rtspconnection.h: Store connection IP address for later. Add timeout args to all operations that might block forever. Parse session timeout. Only close sockets when not already closed. * gst/rtsp/rtspdefs.c: * gst/rtsp/rtspdefs.h: Add timeout return value and error string. * gst/rtsp/rtspmessage.c: (rtsp_message_init_response): Add small comment. 2007-05-01 16:13:58 +0000 Sjoerd Simons gst/rtp/gstrtpmp4vpay.*: Handle NEWSEGMENT and FLUSH events. Fixes #434824. Original commit message from CVS: Patch by: Sjoerd Simons * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_init), (gst_rtp_mp4v_pay_empty), (gst_rtp_mp4v_pay_event): * gst/rtp/gstrtpmp4vpay.h: Handle NEWSEGMENT and FLUSH events. Fixes #434824. 2007-04-30 11:15:58 +0000 Tim-Philipp Müller docs/plugins/gst-plugins-good-plugins-docs.sgml: Remove v4l2src from docs, since it breaks the docs build, and the pl... Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: Remove v4l2src from docs, since it breaks the docs build, and the plugin is only built if --enable-experimental is used anyway. * docs/plugins/Makefile.am: Spaces => tab. 2007-04-29 14:43:37 +0000 Wim Taymans gst/udp/gstmultiudpsink.c: Add code to drop membership of a multicast group. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (leave_multicast), (gst_multiudpsink_add), (gst_multiudpsink_remove): Add code to drop membership of a multicast group. * gst/udp/gstudpsink.c: (gst_udpsink_update_uri), (gst_udpsink_set_uri): Implement URI handler. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_parse_rtpinfo): Use URI handler to make udpsink instace. Improve code to configure port and destination. 2007-04-29 13:56:18 +0000 Thomas Vander Stichele * sys/directdraw/gstdirectdrawsink.c: * sys/osxvideo/osxvideosink.m: 80 char police Original commit message from CVS: 80 char police 2007-04-29 13:53:16 +0000 Thomas Vander Stichele autogen.sh: Require automake 1.7 Original commit message from CVS: * autogen.sh: Require automake 1.7 * ext/alsaspdif/Makefile.am: * ext/divx/Makefile.am: * ext/ivorbis/Makefile.am: * ext/musicbrainz/Makefile.am: * ext/neon/Makefile.am: * ext/sdl/Makefile.am: * ext/swfdec/Makefile.am: * ext/theora/Makefile.am: * ext/wavpack/Makefile.am: * ext/xvid/Makefile.am: * gst/modplug/Makefile.am: Fix up Makefile.am accordingly. 2007-04-29 13:49:02 +0000 Thomas Vander Stichele docs/plugins/inspect/: Add jack and update. Original commit message from CVS: * docs/plugins/inspect/plugin-alsaspdif.xml: * docs/plugins/inspect/plugin-bz2.xml: * docs/plugins/inspect/plugin-cdxaparse.xml: * docs/plugins/inspect/plugin-dfbvideosink.xml: * docs/plugins/inspect/plugin-faac.xml: * docs/plugins/inspect/plugin-faad.xml: * docs/plugins/inspect/plugin-filter.xml: * docs/plugins/inspect/plugin-freeze.xml: * docs/plugins/inspect/plugin-glimagesink.xml: * docs/plugins/inspect/plugin-gsm.xml: * docs/plugins/inspect/plugin-h264parse.xml: * docs/plugins/inspect/plugin-jack.xml: * docs/plugins/inspect/plugin-mms.xml: * docs/plugins/inspect/plugin-modplug.xml: * docs/plugins/inspect/plugin-musepack.xml: * docs/plugins/inspect/plugin-musicbrainz.xml: * docs/plugins/inspect/plugin-neon.xml: * docs/plugins/inspect/plugin-nsfdec.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-sdl.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-spectrum.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-tta.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-wavpack.xml: * docs/plugins/inspect/plugin-xingheader.xml: * docs/plugins/inspect/plugin-xvid.xml: Add jack and update. 2007-04-29 12:19:21 +0000 Wim Taymans gst/udp/gstmultiudpsink.c: Fix multicast detection. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): Fix multicast detection. Don't try to join a multicast group if the address is not multicast. * gst/udp/gstudpsrc.c: (gst_udpsrc_update_uri): Small debug improvement. 2007-04-27 16:44:17 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Ignore ASYNC state messages from the udpsink, it's irrelevant for the parent. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play), (gst_rtspsrc_handle_message): Ignore ASYNC state messages from the udpsink, it's irrelevant for the parent. 2007-04-27 15:30:39 +0000 Wim Taymans gst/rtp/gstrtpilbcdepay.h: Fix mode property when specified as an arg. Original commit message from CVS: * gst/rtp/gstrtpilbcdepay.h: Fix mode property when specified as an arg. 2007-04-26 15:08:20 +0000 Edward Hervey docs/plugins/: Add documentation for osxaudio plugin. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-osxaudio.xml: Add documentation for osxaudio plugin. 2007-04-26 14:31:32 +0000 Edward Hervey docs/plugins/: Add documentation for osxvideo Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/inspect/plugin-osxvideo.xml: Add documentation for osxvideo 2007-04-26 10:08:27 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Protect state changes with a lock. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play), (gst_rtspsrc_pause): * gst/rtsp/gstrtspsrc.h: Protect state changes with a lock. * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (parse_line): * gst/rtsp/rtspconnection.h: Remove some unused stuff. 2007-04-26 08:48:30 +0000 Wim Taymans gst/udp/gstudpsrc.c: Handle the case where there are exactly 0 bytes to read and the ioctl did not report an error. F... Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Handle the case where there are exactly 0 bytes to read and the ioctl did not report an error. Fixes #433530. 2007-04-26 08:39:49 +0000 Wim Taymans gst/wavparse/gstwavparse.*: Apply DISCONT to buffers. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): * gst/wavparse/gstwavparse.h: Apply DISCONT to buffers. Only apply timestamp to the first sample after a DISCONT, too many VBR files cause random jitter in the timestamps. Fixes #433119. 2007-04-25 15:55:32 +0000 Wim Taymans gst/rtsp/gstrtpdec.*: Add dummy latency property to be backwards compat with rtpbin. Original commit message from CVS: * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_class_init), (gst_rtp_dec_init), (gst_rtp_dec_set_property), (gst_rtp_dec_get_property): * gst/rtsp/gstrtpdec.h: Add dummy latency property to be backwards compat with rtpbin. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_parse_rtpinfo): * gst/rtsp/gstrtspsrc.h: Add latency property and configure in the session manager. Don't set invalid clock-base and seqnum-base on caps, some servers sometimes don't send them. 2007-04-25 15:31:53 +0000 Tim-Philipp Müller gst/alpha/gstalphacolor.c: Double-check that RGB input caps are really RGBA caps (apparently the core doesn't always ... Original commit message from CVS: * gst/alpha/gstalphacolor.c: (gst_alpha_color_base_init), (gst_alpha_color_transform_caps), (gst_alpha_color_set_caps): Double-check that RGB input caps are really RGBA caps (apparently the core doesn't always catch it if those caps aren't a subset of our template caps, also see #421543). Fixes #429319 in a way. Also, don't leak the pad template in the transform_caps function. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/alphacolor.c: (setup_alphacolor), (cleanup_alphacolor), (create_caps_rgb24), (create_caps_rgba32), (create_buffer_rgb24_3x4), (create_buffer_rgba32_3x4), (GST_START_TEST), (alphacolor_suite): Add some basic unit tests for alphacolor. 2007-04-25 15:08:22 +0000 Tim-Philipp Müller ext/libpng/gstpngdec.c: If we get a fatal flow return in the loop function, first post the error message and only the... Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_task): If we get a fatal flow return in the loop function, first post the error message and only then send the EOS event downstream, otherwise applications might get an eos message before the error message and think everything was ok (related to #429319). 2007-04-25 10:07:12 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Read the channel byte as an unsigned byte. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (rtsp_connection_receive): Read the channel byte as an unsigned byte. 2007-04-25 09:47:48 +0000 Wim Taymans gst/rtp/: Make sure we configure the clock_rate in the baseclass in the setcaps function. Fixes #431282. Original commit message from CVS: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_set_property): * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_init), (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_init), (gst_rtp_gsm_depay_setcaps): * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_class_init), (gst_rtp_ilbc_depay_init), (gst_rtp_ilbc_depay_setcaps), (gst_rtp_ilbc_depay_process), (gst_ilbc_depay_set_property), (gst_ilbc_depay_get_property): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_init), (gst_rtp_pcma_depay_setcaps): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_init), (gst_rtp_pcmu_depay_setcaps): Make sure we configure the clock_rate in the baseclass in the setcaps function. Fixes #431282. 2007-04-25 08:36:46 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Parse server address from SDP. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), (gst_rtspsrc_stream_free), (request_pt_map), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open): * gst/rtsp/gstrtspsrc.h: Parse server address from SDP. Hook up a udpsink to send RTCP back to the server. * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/rtsp/rtsptransport.h: Add some docs. 2007-04-25 06:52:09 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Make header field check conditional. Fixes #433135 Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Make header field check conditional. Fixes #433135 2007-04-24 09:12:42 +0000 Tim-Philipp Müller Add minimal docs blurb to alphacolor; split out headers into separate header file for gtk-doc. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-alphacolor.xml: * gst/alpha/Makefile.am: * gst/alpha/gstalphacolor.c: * gst/alpha/gstalphacolor.h: Add minimal docs blurb to alphacolor; split out headers into separate header file for gtk-doc. 2007-04-20 17:25:50 +0000 Tim-Philipp Müller gst/debug/progressreport.c: Don't try to post NULL message (in case we can't query upstream position or duration). Original commit message from CVS: * gst/debug/progressreport.c: (gst_progress_report_report): Don't try to post NULL message (in case we can't query upstream position or duration). 2007-04-18 12:36:37 +0000 Michael Smith gst/cutter/gstcutter.*: Fix some of the most obvious bugs in cutter. Now doesn't leak everything if input is silent. Original commit message from CVS: * gst/cutter/gstcutter.c: (gst_cutter_init), (gst_cutter_chain), (gst_cutter_get_caps): * gst/cutter/gstcutter.h: Fix some of the most obvious bugs in cutter. Now doesn't leak everything if input is silent. 2007-04-18 09:48:25 +0000 Sebastian Dröge gst/wavenc/gstwavenc.*: everything else results in a invalid block align and invalid files. Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), (gst_wavenc_sink_setcaps), (gst_wavenc_change_state): * gst/wavenc/gstwavenc.h: Wav apparently only supports width==GST_ROUND_UP(depth), everything else results in a invalid block align and invalid files. 2007-04-17 16:39:02 +0000 Snaik gst/smpte/barboxwipes.c: Add missing break statement for BOX_HORIZONTAL case. Original commit message from CVS: Patch by: Snaik * gst/smpte/barboxwipes.c: (gst_wipe_boxes_draw): Add missing break statement for BOX_HORIZONTAL case. 2007-04-17 10:14:43 +0000 Vincent Torri gst/wavparse/gstwavparse.c: Use correct format strings for integer types. Original commit message from CVS: Patch by: Vincent Torri * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Use correct format strings for integer types. 2007-04-17 02:51:02 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Use gst_riff_create_audio_template_caps () instead of the local caps. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_create_sourcepad): Use gst_riff_create_audio_template_caps () instead of the local caps. This makes updates of the local caps unecessary whenever libgstriff gets support for new formats. 2007-04-16 21:29:40 +0000 Brian Cameron sys/sunaudio/: Fix and/or update copyright attributions (#430228). Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudio.c: * sys/sunaudio/gstsunaudiomixer.c: * sys/sunaudio/gstsunaudiomixer.h: * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiomixerctrl.h: * sys/sunaudio/gstsunaudiomixertrack.h: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosink.h: * sys/sunaudio/gstsunaudiosrc.c: * sys/sunaudio/gstsunaudiosrc.h: Fix and/or update copyright attributions (#430228). 2007-04-14 17:18:14 +0000 Sébastien Moutte docs/plugins/inspect/: Add xml doc files for Windows sinks Original commit message from CVS: * docs/plugins/inspect/plugin-directdraw.xml: * docs/plugins/inspect/plugin-directsound.xml: * docs/plugins/inspect/plugin-waveform.xml: Add xml doc files for Windows sinks * win32/vs6/libgstqtdemux.dsp: * win32/vs6/libgstmpegvideoparse.dsp: * win32/vs6/gst_plugins_bad.dsw: Update projects files. 2007-04-13 09:32:21 +0000 Wim Taymans docs/plugins/gst-plugins-good-plugins-sections.txt: Fix docs. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-sections.txt: Fix docs. * gst/rtsp/URLS: Add some more example urls. * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_BOXED__UINT_UINT), (gst_rtp_dec_chain_rtp): Better debugging. * gst/rtsp/gstrtspsrc.c: (request_pt_map), (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_parse_rtpinfo): Remove unused code. 2007-04-13 08:19:35 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Relax the audio/mpeg caps again and add FIXME: comment. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): Relax the audio/mpeg caps again and add FIXME: comment. 2007-04-13 06:20:28 +0000 Stefan Kost gst/wavparse/gstwavparse.*: More sanity check for the header fields. Fix type for 'rate' header field. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): * gst/wavparse/gstwavparse.h: More sanity check for the header fields. Fix type for 'rate' header field. 2007-04-12 16:06:31 +0000 Tim-Philipp Müller gst/icydemux/gsticydemux.c: If the metadata strings we get in the stream are not UTF-8, try to interpret them accordi... Original commit message from CVS: * gst/icydemux/gsticydemux.c: (notgst_tag_freeform_string_to_utf8), (gst_icydemux_unicodify): If the metadata strings we get in the stream are not UTF-8, try to interpret them according to the character encodings specified in the GST_ICY_TAG_ENCODING and GST_TAG_ENCODING environment variables, and only fall back to locale/ISO-8859-1 if those aren't set or don't work. Should fix #428901. 2007-04-12 14:20:56 +0000 Wim Taymans gst/rtp/gstrtph264depay.c: Use the proper sync word for SPS and PPS. Original commit message from CVS: * gst/rtp/gstrtph264depay.c: Use the proper sync word for SPS and PPS. 2007-04-12 11:41:11 +0000 Thomas Vander Stichele gst/rtp/Makefile.am: gst/rtp/fnv1hash.c (MASK_24, FNV1_HASH_32_INIT, FNV1_HASH_32_PRIME, fnv1_hash_32_new, fnv1_hash_... Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/fnv1hash.c (MASK_24, FNV1_HASH_32_INIT, FNV1_HASH_32_PRIME, fnv1_hash_32_new, fnv1_hash_32_update, fnv1_hash_32_to_24): * gst/rtp/fnv1hash.h (__GST_FNV1_HASH_H__): Add a simple hashing implementation that we can use to generate a 24-bit ident value based on the codebooks for vorbis and theora. * gst/rtp/gstrtptheorapay.c (gst_rtp_theora_pay_finish_headers, gst_rtp_theora_pay_handle_buffer): * gst/rtp/gstrtpvorbisdepay.c (gst_rtp_vorbis_depay_parse_configuration, gst_rtp_vorbis_depay_switch_codebook, gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c (gst_rtp_vorbis_pay_reset_packet, gst_rtp_vorbis_pay_init_packet, gst_rtp_vorbis_pay_flush_packet, gst_rtp_vorbis_pay_finish_headers, gst_rtp_vorbis_pay_handle_buffer): Use the hashing function, ensuring that the same codebooks result in the same ident and thus the same SDP description. Various log fixes/changes. 2007-04-12 11:37:50 +0000 jerry tan sys/sunaudio/gstsunaudiosrc.c: it is the application's responsibility to make sure it open the device once. Original commit message from CVS: Patch by: jerry tan * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open): remove the call of ioctl (fd, AUDIO_MIXER_MULTIPLE_OPEN), it is the application's responsibility to make sure it open the device once. Remove a careless error if AUDIODEV is set. Fixes #392620. 2007-04-12 10:52:02 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Make timescale 32 bits again so we don't screw up the pts_offset calculations. Original commit message from CVS: * gst/qtdemux/qtdemux.c: Make timescale 32 bits again so we don't screw up the pts_offset calculations. 2007-04-12 08:21:28 +0000 Wim Taymans gst/rtsp/gstrtpdec.*: Make backward compat with rtpbin by adding the request-pt-map signals. Original commit message from CVS: * gst/rtsp/gstrtpdec.c: (gst_rtp_dec_marshal_BOXED__UINT_UINT), (gst_rtp_dec_class_init), (gst_rtp_dec_chain_rtp): * gst/rtsp/gstrtpdec.h: Make backward compat with rtpbin by adding the request-pt-map signals. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), (new_session_pad), (request_pt_map), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_stream_configure_caps), (gst_rtspsrc_activate_streams): * gst/rtsp/gstrtspsrc.h: Implement request-pt-map signals instead of setting caps on the buffers for the session manager. 2007-04-11 10:25:25 +0000 Wim Taymans gst/udp/gstudp.c: Register GstNetBuffer in plugin_init so that the type can be used from multiple threads without races. Original commit message from CVS: * gst/udp/gstudp.c: (plugin_init): Register GstNetBuffer in plugin_init so that the type can be used from multiple threads without races. 2007-04-11 10:19:06 +0000 Christian Schaller * gst-plugins-good.spec.in: update to spec file Original commit message from CVS: update to spec file 2007-04-11 09:53:38 +0000 Wim Taymans gst/qtdemux/: Handle version 1 mdhd atoms to get extended precision durations. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (qtdemux_parse_samples), (qtdemux_parse_segments), (qtdemux_parse_trak), (qtdemux_parse_tree): * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mdhd): Handle version 1 mdhd atoms to get extended precision durations. Fixes #426972. 2007-04-10 17:06:05 +0000 Wim Taymans gst/rtp/gstrtpamrdepay.c: Fix depayloader clock_rate and some cleanups. Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): Fix depayloader clock_rate and some cleanups. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_finalize), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): * gst/rtp/gstrtph264depay.h: Don't push codec_data in the adapter because it might get flushed when we get a discont. * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): Handle multiple AU per packet. * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process), (gst_rtp_sv3v_depay_plugin_init): Disable rank, this one does not work. Remove timestamping, base class does that. 2007-04-10 12:01:33 +0000 Stefan Kost gst/auparse/gstauparse.c: limit caps to the formats we announce in the template Original commit message from CVS: * gst/auparse/gstauparse.c: (gst_au_parse_parse_header): limit caps to the formats we announce in the template * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data): fix some crashers/asserts when dealing with broken files 2007-04-10 10:01:14 +0000 Peter Kjellerstedt gst/: Fix some compiler warnings. Fixes #428182. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_get_mode), (gst_rtp_speex_depay_setcaps): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_loop_udp): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init_send): Fix some compiler warnings. Fixes #428182. 2007-04-06 12:54:16 +0000 Wim Taymans gst/rtsp/: Morph RTPDec into something compatible with RTPBin as a fallback. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtpdec.c: (find_session_by_id), (create_session), (free_session), (gst_rtp_dec_base_init), (gst_rtp_dec_class_init), (gst_rtp_dec_init), (gst_rtp_dec_finalize), (gst_rtp_dec_query_src), (gst_rtp_dec_chain_rtp), (gst_rtp_dec_chain_rtcp), (gst_rtp_dec_set_property), (gst_rtp_dec_get_property), (gst_rtp_dec_provide_clock), (gst_rtp_dec_change_state), (create_recv_rtp), (create_recv_rtcp), (create_rtcp), (gst_rtp_dec_request_new_pad), (gst_rtp_dec_release_pad): * gst/rtsp/gstrtpdec.h: * gst/rtsp/gstrtsp.c: (plugin_init): Morph RTPDec into something compatible with RTPBin as a fallback. Various other style fixes. * gst/rtsp/gstrtspsrc.c: (find_stream_by_id), (find_stream_by_udpsrc), (gst_rtspsrc_stream_free), (gst_rtspsrc_cleanup), (gst_rtspsrc_media_to_caps), (new_session_pad), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_setup_auth), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Implement RTPBin session manager handling. Don't try to add empty properties to caps. Implement fallback session manager, handling. Don't combine errors from RTCP streams, just ignore them. * gst/rtsp/rtsptransport.c: (rtsp_transport_get_manager): * gst/rtsp/rtsptransport.h: Implement fallback session manager. Make RTPBin the default one when available. 2007-04-05 15:05:24 +0000 Wim Taymans gst/qtdemux/gstrtpxqtdepay.*: Try to recover from packet loss a little better. Original commit message from CVS: * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), (gst_rtp_xqt_depay_change_state): * gst/qtdemux/gstrtpxqtdepay.h: Try to recover from packet loss a little better. 2007-04-05 13:56:44 +0000 Wim Taymans gst/rtp/gstrtpmp4adepay.c: This element is ready to be autoplugged. Original commit message from CVS: * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_plugin_init): This element is ready to be autoplugged. 2007-04-05 11:26:25 +0000 Julien Moutte gst/avi/gstavidemux.c: Don't leave the offsets defined by upstream element on the compressed data buffer we are pushi... Original commit message from CVS: 2007-04-05 Julien MOUTTE * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Don't leave the offsets defined by upstream element on the compressed data buffer we are pushing downstream. Make them GST_BUFFER_OFFSET_NONE. 2007-04-04 12:39:41 +0000 Stefan Kost gst/avi/: Don't abort on out-of-memory. Use stream-nr as unsigned integer only. Original commit message from CVS: * gst/avi/README: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_header_pull), (gst_avi_demux_combine_flows), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): Don't abort on out-of-memory. Use stream-nr as unsigned integer only. 2007-04-03 09:55:45 +0000 Wim Taymans gst/smpte/barboxwipes.c: Original commit message from CVS: * gst/smpte/barboxwipes.c: Fix error as spotted by Snaik 2007-03-30 17:19:34 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Support audio/x-raw-float in wav files. This only works with plugins-base CVS, using an o... Original commit message from CVS: * gst/wavparse/gstwavparse.c: Support audio/x-raw-float in wav files. This only works with plugins-base CVS, using an older version doesn't have any disadvantages though. 2007-03-30 15:59:27 +0000 Sebastian Dröge Revert last change as we don't want plugins-good to depend on plugins-base CVS now. Original commit message from CVS: * configure.ac: * gst/auparse/gstauparse.c: (gst_au_parse_reset), (gst_au_parse_parse_header), (gst_au_parse_chain): * gst/auparse/gstauparse.h: Revert last change as we don't want plugins-good to depend on plugins-base CVS now. 2007-03-30 04:50:11 +0000 Sebastian Dröge ext/wavpack/: Don't play audioconvert. As wavpack wants/outputs all samples with width==32 and depth=[1,32] accept th... Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), (gst_wavpack_dec_init), (gst_wavpack_dec_sink_set_caps), (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_post_tags), (gst_wavpack_dec_chain): * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_chain): * ext/wavpack/gstwavpackenc.h: * ext/wavpack/gstwavpackparse.c: Don't play audioconvert. As wavpack wants/outputs all samples with width==32 and depth=[1,32] accept this and let audioconvert convert to accepted formats instead of doing it in the element for n*8 depths. This also adds support for non-n*8 depths and prevents some useless memory allocations. Fixes #421598 Also add a workaround for bug #421542 in wavpackenc for now... * tests/check/elements/wavpackdec.c: (GST_START_TEST): * tests/check/elements/wavpackenc.c: (GST_START_TEST): * tests/check/elements/wavpackparse.c: (GST_START_TEST): Consider the change above in the unit tests and test if the correct caps are accepted and set. Also check for GST_BUFFER_OFFSET_END in the wavpackparse unit test. * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_init), (gst_wavpack_dec_sink_set_caps): Set caps on the src pad as soon as possible. * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackcommon.h: * ext/wavpack/gstwavpackenc.h: * ext/wavpack/gstwavpackparse.h: Fix indention. gst-indent is now called by cicl. 2007-03-29 18:51:33 +0000 René Stadler configure.ac: Require gst-plugins-base CVS for audioconvert with non-native float support and width/depth fix in libg... Original commit message from CVS: * configure.ac: Require gst-plugins-base CVS for audioconvert with non-native float support and width/depth fix in libgstriff. Patch by: René Stadler * gst/auparse/gstauparse.c: (gst_au_parse_reset), (gst_au_parse_parse_header), (gst_au_parse_chain): * gst/auparse/gstauparse.h: Don't swap the floats ourself if they're not in native endianness. Instead let audioconvert handle this. Fixes #339838. 2007-03-29 14:40:35 +0000 Wim Taymans gst/rtp/: Flush adapter on disconts. Original commit message from CVS: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process), (gst_rtp_h263p_depay_change_state): * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), (gst_rtp_h264_depay_change_state): * gst/rtp/gstrtph264depay.h: * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): Flush adapter on disconts. 2007-03-29 14:03:21 +0000 Wim Taymans gst/rtp/: Use more efficient adapter and rtpbuffer methods when possible. Original commit message from CVS: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_process): * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_process): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_process): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_flush): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process): * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush): * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_process): * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_flush): * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_process): * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process): Use more efficient adapter and rtpbuffer methods when possible. 2007-03-29 12:14:22 +0000 Sebastian Dröge gst/wavenc/gstwavenc.c: Correctly handle width!=depth input. Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), (gst_wavenc_sink_setcaps): Correctly handle width!=depth input. * gst/wavparse/gstwavparse.c: Already export in the caps that width==8 uses unsigned samples and everything else uses signed samples. 2007-03-29 09:59:23 +0000 Laurent Glayal gst/udp/: Rework the socket allocation a bit based on the sockfd argument so that it becomes usable. Original commit message from CVS: Patch by: Laurent Glayal * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init), (gst_dynudpsink_init), (gst_dynudpsink_set_property), (gst_dynudpsink_get_property), (gst_dynudpsink_init_send), (gst_dynudpsink_close): * gst/udp/gstdynudpsink.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Rework the socket allocation a bit based on the sockfd argument so that it becomes usable. Add a closefd property to instruct the udp elements to close the custom file descriptors when going to READY. Fixes #423304. API:GstUDPSrc::closefd property API:GstDynUDPSink::closefd property 2007-03-29 08:08:49 +0000 Laurent Glayal gst/rtp/: Added H264 payloader. Fixes #423782. Original commit message from CVS: Patch by: Laurent Glayal * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_base_init), (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init), (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), (gst_rtp_h264_pay_get_property), (gst_rtp_h264_pay_change_state), (gst_rtp_h264_pay_plugin_init): * gst/rtp/gstrtph264pay.h: Added H264 payloader. Fixes #423782. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): Small fixes. 2007-03-28 22:27:36 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Actually support depths from 1 to 32, not only 8 to 32. Original commit message from CVS: * gst/wavparse/gstwavparse.c: Actually support depths from 1 to 32, not only 8 to 32. 2007-03-28 22:23:43 +0000 Sebastian Dröge gst/wavparse/gstwavparse.c: Add support for wav files containing audio/x-raw-int with random depths between 1 and 32 ... Original commit message from CVS: * gst/wavparse/gstwavparse.c: Add support for wav files containing audio/x-raw-int with random depths between 1 and 32 bits. 2007-03-28 18:40:12 +0000 Stefan Kost gst/rtp/: Added MP4A-LATM depayloader. Fixes #417792. Original commit message from CVS: Based on patch by: Stefan Kost * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_base_init), (gst_rtp_mp4a_depay_class_init), (gst_rtp_mp4a_depay_init), (gst_rtp_mp4a_depay_finalize), (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process), (gst_rtp_mp4a_depay_set_property), (gst_rtp_mp4a_depay_get_property), (gst_rtp_mp4a_depay_change_state), (gst_rtp_mp4a_depay_plugin_init): * gst/rtp/gstrtpmp4adepay.h: Added MP4A-LATM depayloader. Fixes #417792. * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process): Fixup depayloader, setting codec_data, using more efficient adaptor and rtpbuffer handling. * gst/rtsp/URLS: Add url to test above. 2007-03-28 15:17:27 +0000 Edward Hervey gst/qtdemux/: Process 'ctts' atoms, which are present in AVC ISO files (.mov files with h264 video). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample), (gst_qtdemux_chain), (qtdemux_parse_samples): * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_ctts): * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: Process 'ctts' atoms, which are present in AVC ISO files (.mov files with h264 video). Use the offset present in 'ctts' to calculate the PTS for each packet and set the PTS on outgoing buffers. Fixes #423283 2007-03-25 15:34:42 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Handle default clock-rates for static payload types, rearrange stuff so that the rtpmap field ... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (find_stream_by_setup), (gst_rtspsrc_create_stream), (gst_rtspsrc_stream_free), (get_default_rate_for_pt), (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_stream_configure_caps), (gst_rtspsrc_activate_streams), (gst_rtspsrc_parse_rtpinfo): * gst/rtsp/gstrtspsrc.h: Handle default clock-rates for static payload types, rearrange stuff so that the rtpmap field in the sdp can override the defaults. Parse RTP-Info field to get the seqnum and timebase fields that should go in the caps. Delay configuring caps after we got the RTP-Info from the PLAY reply from the server. 2007-03-24 19:46:59 +0000 Tim-Philipp Müller gst/interleave/deinterleave.c: Remove 'channel-positions' field when munging input caps into 1-channel output caps (I... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_sink_setcaps): Remove 'channel-positions' field when munging input caps into 1-channel output caps (I guess technically we should set the position for each channel on the output caps if it's non-NONE, but I'll save that as a task for another day). 2007-03-22 22:14:29 +0000 Tim-Philipp Müller gst/interleave/deinterleave.c: Don't leak input buffer in chain function; maintain our own list of source pads - ther... Original commit message from CVS: * gst/interleave/deinterleave.c: (gst_deinterleave_add_new_pads), (gst_deinterleave_remove_pads), (gst_deinterleave_process), (gst_deinterleave_chain): Don't leak input buffer in chain function; maintain our own list of source pads - there are no guarantees about the order of the list in the GstElement struct, and we want a very specific order; lastly, some more debugging. 2007-03-22 16:25:56 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Revert last commit, preventing infinite plugging loops with ranks is no clean solution... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): Revert last commit, preventing infinite plugging loops with ranks is no clean solution and in general there's no reason why one wants to parse framed wavpack data again. 2007-03-22 15:52:51 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.c: Send the new segment event in time format instead of bytes. This allows "wavpackenc ! wa... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block): Send the new segment event in time format instead of bytes. This allows "wavpackenc ! wavpackdec ! someaudiosink" pipelines. * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): Accept framed and non-framed input, wavpackparse doesn't care. To prevent "wavpackparse ! wavpackparse ! ..." pipelines lower the rank of wavpackparse by one. This allows "wavpackenc ! wavpackparse ! ..." pipelines. 2007-03-22 11:08:03 +0000 Sebastian Dröge ext/wavpack/gstwavpackdec.c: Revert to use gst_pad_alloc_buffer() here. We can and should use it. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): Revert to use gst_pad_alloc_buffer() here. We can and should use it. Thanks to Jan and Mike for noticing my mistake. 2007-03-22 09:44:17 +0000 Christophe Dehais ext/gconf/gconf.c: Accept complex pipeline descriptions as an audio profile instead of just a single element. Fixes #... Original commit message from CVS: Patch by: Christophe Dehais * ext/gconf/gconf.c: (gst_gconf_render_bin_with_default): Accept complex pipeline descriptions as an audio profile instead of just a single element. Fixes #420658. 2007-03-22 00:17:41 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.*: Put the write helpers into the GstWavpackEnc struct directly and not as a pointer to sav... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), (gst_wavpack_enc_init), (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block): * ext/wavpack/gstwavpackenc.h: Put the write helpers into the GstWavpackEnc struct directly and not as a pointer to save two small, but useless mallocs. This also makes it possible to drop the finalize method. * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_push_buffer): For consistency reasons also set GST_BUFFER_OFFSET_END on the outgoing buffers the same way wavpackenc does it. 2007-03-21 23:50:09 +0000 Sebastian Dröge ext/wavpack/gstwavpackdec.c: Don't use gst_pad_alloc_buffer() as we might clip the buffer later and Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): Don't use gst_pad_alloc_buffer() as we might clip the buffer later and BaseTransform-based elements will likely break because of wrong unit-size. Also plug a possible memleak that happens when decoding fails for some reason. 2007-03-21 11:49:32 +0000 Tim-Philipp Müller gst/apetag/gsttagdemux.c: Rename registered type in preparation of GstTagDemux moving to Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_get_type): Rename registered type in preparation of GstTagDemux moving to -base at some point in the future. 2007-03-19 10:29:19 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: Streaming mode fixes: don't unref buffer we don't own any longer; remove bogus adapter fl... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Streaming mode fixes: don't unref buffer we don't own any longer; remove bogus adapter flush. Fixes #419338. 2007-03-18 04:21:28 +0000 David Schleef REQUIREMENTS: Change the format to key/value, add a bunch of information, remove a bunch of requirements that are for... Original commit message from CVS: * REQUIREMENTS: Change the format to key/value, add a bunch of information, remove a bunch of requirements that are for other GStreamer packages. 2007-03-18 02:00:54 +0000 David Schleef REQUIREMENTS: Fix a few things. This file really needs a good once-over. Original commit message from CVS: * REQUIREMENTS: Fix a few things. This file really needs a good once-over. 2007-03-16 18:38:18 +0000 Edward Hervey sys/osxvideo/osxvideosink.m: Fix previous commit, we want to pass the NSView in the message. Original commit message from CVS: * sys/osxvideo/osxvideosink.m: Fix previous commit, we want to pass the NSView in the message. 2007-03-16 16:27:20 +0000 Edward Hervey sys/osxvideo/osxvideosink.m: Emit 'have-ns-view' message when working in embedded mode. The message will contain a po... Original commit message from CVS: * sys/osxvideo/osxvideosink.m: Emit 'have-ns-view' message when working in embedded mode. The message will contain a pointer to the newly created NSView. 2007-03-16 09:57:40 +0000 Stefan Kost gst/equalizer/gstiirequalizer10bands.c: A 10 band EQ should be initialized to 1 bands and not to 3. Original commit message from CVS: * gst/equalizer/gstiirequalizer10bands.c: (gst_iir_equalizer_10bands_init): A 10 band EQ should be initialized to 1 bands and not to 3. 2007-03-15 12:05:01 +0000 Edward Hervey sys/Makefile.am: Don't forget to distribute the sys/osxaudio/ directory. Original commit message from CVS: * sys/Makefile.am: Don't forget to distribute the sys/osxaudio/ directory. 2007-03-15 11:39:53 +0000 Edward Hervey Activate osxaudio in gst-plugins-good with proper build setup. Original commit message from CVS: * configure.ac: * sys/Makefile.am: * sys/osxaudio/Makefile.am: * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudiosink.c: (gst_osx_audio_sink_osxelement_do_init), (gst_osx_audio_sink_init), (gst_osx_audio_sink_getcaps), (gst_osx_audio_sink_create_ringbuffer), (plugin_init): * sys/osxaudio/gstosxaudiosrc.c: (gst_osx_audio_src_osxelement_do_init), (gst_osx_audio_src_init), (gst_osx_audio_src_create_ringbuffer): * sys/osxaudio/gstosxringbuffer.c: (gst_osx_ring_buffer_get_type), (gst_osx_ring_buffer_class_init), (gst_osx_ring_buffer_init), (gst_osx_ring_buffer_acquire), (gst_osx_ring_buffer_start), (gst_osx_ring_buffer_pause), (gst_osx_ring_buffer_stop): * sys/osxaudio/gstosxringbuffer.h: Activate osxaudio in gst-plugins-good with proper build setup. Add inlined documentation. Fix debug statements Fix ringbuffer when pausing. Fixes #323471 2007-03-14 22:21:26 +0000 Philippe Kalaf gst/rtp/: Ported mulaw and alaw payloaders to use new base class Original commit message from CVS: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmapay.h: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtppcmupay.h: Ported mulaw and alaw payloaders to use new base class 2007-03-14 16:30:19 +0000 Edward Hervey sys/osxvideo/: Fix leaks when running a NSApp. Original commit message from CVS: * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Fix leaks when running a NSApp. Accept any kind of resolutions. Works in fullscreen. Can maximize. Only thing left before being able to move this to -good is documentation and embedded window support. 2007-03-14 15:25:10 +0000 Thomas Vander Stichele po/: Update translations. Original commit message from CVS: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/it.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update translations. 2007-03-14 14:49:45 +0000 Tim-Philipp Müller configure.ac: Fix string replace error (AG_AG_GST_* => AG_GST_*). Original commit message from CVS: * configure.ac: Fix string replace error (AG_AG_GST_* => AG_GST_*). 2007-03-14 14:48:08 +0000 Stefan Kost gst/equalizer/: Add 3 and 10 band version and add missing gst_object_sync_values. Original commit message from CVS: * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer.c: (_do_init), (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_band_class_init), (gst_iir_equalizer_band_get_type), (gst_iir_equalizer_child_proxy_get_child_by_index), (gst_iir_equalizer_child_proxy_get_children_count), (gst_iir_equalizer_child_proxy_interface_init), (setup_filter), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_transform_ip), (plugin_init): * gst/equalizer/gstiirequalizer10bands.c: (gst_iir_equalizer_10bands_base_init), (gst_iir_equalizer_10bands_class_init), (gst_iir_equalizer_10bands_init), (gst_iir_equalizer_10bands_set_property), (gst_iir_equalizer_10bands_get_property): * gst/equalizer/gstiirequalizer10bands.h: * gst/equalizer/gstiirequalizer3bands.c: (gst_iir_equalizer_3bands_base_init), (gst_iir_equalizer_3bands_class_init), (gst_iir_equalizer_3bands_init), (gst_iir_equalizer_3bands_set_property), (gst_iir_equalizer_3bands_get_property): * gst/equalizer/gstiirequalizer3bands.h: * gst/equalizer/gstiirequalizernbands.c: (gst_iir_equalizer_nbands_base_init), (gst_iir_equalizer_nbands_init): Add 3 and 10 band version and add missing gst_object_sync_values. * gst/spectrum/gstspectrum.c: (gst_spectrum_event), (gst_spectrum_transform_ip): Add some comments about float support. 2007-03-12 17:56:54 +0000 Tim-Philipp Müller gst/apetag/gsttagdemux.c: Fix handling of -1 values for start and stop values when seeking, and SEEK_CUR+SEEK_END her... Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_srcpad_event): Fix handling of -1 values for start and stop values when seeking, and SEEK_CUR+SEEK_END here as well. 2007-03-12 17:24:23 +0000 Jan Schmidt gst/id3demux/gstid3demux.c: Fix handling of -1 values for start and stop values when seeking, and SEEK_CUR+SEEK_END. Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_srcpad_event): Fix handling of -1 values for start and stop values when seeking, and SEEK_CUR+SEEK_END. 2007-03-12 15:49:02 +0000 Jan Schmidt * ChangeLog: I'm too lazy to comment this Original commit message from CVS: Add Patch by: line for wim, since he's away 2007-03-12 13:28:29 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Fix parsing of ID3 v2.2.0 PIC frames. Only in version >= 2.3.0 is the image format a vari... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_picture_frame): Fix parsing of ID3 v2.2.0 PIC frames. Only in version >= 2.3.0 is the image format a variable-length NUL-terminated string; in versions before that the image format is a fixed-length string of 3 characters (see #348644 for a sample tag). Also make supplied mime type lower-case and fix up 'jpg' to 'jpeg'. 2007-03-11 22:23:04 +0000 Sébastien Moutte sys/directdraw/gstdirectdrawsink.*: Handle display mode changes during playback. Original commit message from CVS: * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: Handle display mode changes during playback. 2007-03-10 16:07:31 +0000 Sébastien Moutte win32/MANIFEST: Add new project files to MANIFEST. Original commit message from CVS: * win32/MANIFEST: Add new project files to MANIFEST. * win32/vs6/libgstaudiofx.dsp: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: Update project files. 2007-03-10 12:30:48 +0000 Tim-Philipp Müller Printf format fixes; also add some missing quotes in translated strings. Fixes #416728 and #416727. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_index): * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_grab_frame): Printf format fixes; also add some missing quotes in translated strings. Fixes #416728 and #416727. 2007-03-09 20:12:08 +0000 Jan Schmidt gst/autodetect/gstautoaudiosink.c: Tim and I can't think of any reason the child audio sink needs to be set back to N... Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_find_best): Tim and I can't think of any reason the child audio sink needs to be set back to NULL after successfully determining that it can reach READY - it gets immediately set back to READY by the caller anyway, causing an unnecessary close/open of any audio devices involved. 2007-03-09 19:51:27 +0000 Tim-Philipp Müller po/: Add ja.po file from #377306. Original commit message from CVS: * po/LINGUAS: * po/ja.po: Add ja.po file from #377306. 2007-03-09 19:44:30 +0000 Tim-Philipp Müller sys/sunaudio/: Actually translate sunaudio mixer track labels instead of just marking the strings as translatable (#3... Original commit message from CVS: * sys/sunaudio/gstsunaudio.c: (plugin_init): * sys/sunaudio/gstsunaudiomixertrack.c: (gst_sunaudiomixer_track_new): Actually translate sunaudio mixer track labels instead of just marking the strings as translatable (#377306); clean up weird label string mapping code that serves no apparent purpose. Also set the 'untranslated-label' property when creating mixer tracks if the GstMixerTrack base class supports this. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/sunaudio.c: (GST_START_TEST), (sunaudio_suite): Very minimalistic unit test for sunaudiomixer element (compiles, but not actually tested on a system where sunaudiomixer is available). 2007-03-09 18:49:37 +0000 Jan Schmidt tests/check/Makefile.am: Re-enable the states test and see if it works on the buildbots. Original commit message from CVS: * tests/check/Makefile.am: Re-enable the states test and see if it works on the buildbots. 2007-03-09 17:32:32 +0000 Wim Taymans ext/dv/gstdvdec.*: Infer pixel-aspect-ratio from the video frame format if it isn't provided by the container, as hap... Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_setcaps), (gst_dvdec_src_negotiate), (gst_dvdec_chain), (gst_dvdec_change_state): * ext/dv/gstdvdec.h: Infer pixel-aspect-ratio from the video frame format if it isn't provided by the container, as happens when playing DV from AVI or Quicktime containers. Patch by: Wim Taymans Fixes #380944 2007-03-09 17:05:17 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: When activated, remove the udpsrc timeout, we have dataflow and timeouts will later be handled... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_activate_streams): When activated, remove the udpsrc timeout, we have dataflow and timeouts will later be handled by the jitterbuffer. 2007-03-09 16:53:39 +0000 Wim Taymans ext/taglib/gstid3v2mux.cc: Add write support for GST_TAG_MUSICBRAINZ_SORTNAME (TSOP) tag. Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Add write support for GST_TAG_MUSICBRAINZ_SORTNAME (TSOP) tag. Fixes #414496. 2007-03-09 15:04:45 +0000 Wim Taymans gst/avi/gstavidemux.c: Fix stream position reporting after a seek. Fixes #416445. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_push_event), (gst_avi_demux_do_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_chain): Fix stream position reporting after a seek. Fixes #416445. 2007-03-09 08:58:26 +0000 Stefan Kost gst/equalizer/: Refactor plugin into a base class and a first subclass (nband eq). The nband eq uses GstChildProxy an... Original commit message from CVS: * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer.c: (_do_init), (gst_iir_equalizer_band_set_property), (gst_iir_equalizer_band_get_property), (gst_iir_equalizer_band_class_init), (gst_iir_equalizer_band_get_type), (gst_iir_equalizer_child_proxy_get_child_by_index), (gst_iir_equalizer_child_proxy_get_children_count), (gst_iir_equalizer_child_proxy_interface_init), (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), (gst_iir_equalizer_finalize), (setup_filter), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), (gst_iir_equalizer_setup), (plugin_init): * gst/equalizer/gstiirequalizer.h: * gst/equalizer/gstiirequalizernbands.c: (gst_iir_equalizer_nbands_base_init), (gst_iir_equalizer_nbands_class_init), (gst_iir_equalizer_nbands_init), (gst_iir_equalizer_nbands_set_property), (gst_iir_equalizer_nbands_get_property): * gst/equalizer/gstiirequalizernbands.h: Refactor plugin into a base class and a first subclass (nband eq). The nband eq uses GstChildProxy and is controlable. More subclasses will follow. 2007-03-08 16:01:42 +0000 René Stadler gst/avi/gstavidemux.c: Make avidemux accept optional header chunks in any order. Original commit message from CVS: Patch by: René Stadler * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_push_event), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_chain): Make avidemux accept optional header chunks in any order. Fixes #415446. 2007-03-08 12:23:57 +0000 Jan Schmidt tests/check/Makefile.am: Disable the states check until the remaining Valgrind errors are fixed or suppressed. Original commit message from CVS: * tests/check/Makefile.am: Disable the states check until the remaining Valgrind errors are fixed or suppressed. 2007-03-08 10:24:43 +0000 Sebastian Dröge tests/check/elements/.cvsignore: Add audiodynamic check to .cvsignore Original commit message from CVS: * tests/check/elements/.cvsignore: Add audiodynamic check to .cvsignore 2007-03-08 10:02:12 +0000 Sebastian Dröge gst/audiofx/: Add new audiodynamic element which can act as a compressor or expander. Supported are hard-knee and sof... Original commit message from CVS: reviewed by: Stefan Kost * gst/audiofx/Makefile.am: * gst/audiofx/audiodynamic.c: (gst_audio_dynamic_characteristics_get_type), (gst_audio_dynamic_mode_get_type), (gst_audio_dynamic_set_process_function), (gst_audio_dynamic_base_init), (gst_audio_dynamic_class_init), (gst_audio_dynamic_init), (gst_audio_dynamic_set_property), (gst_audio_dynamic_get_property), (gst_audio_dynamic_setup), (gst_audio_dynamic_transform_hard_knee_compressor_int), (gst_audio_dynamic_transform_hard_knee_compressor_float), (gst_audio_dynamic_transform_soft_knee_compressor_int), (gst_audio_dynamic_transform_soft_knee_compressor_float), (gst_audio_dynamic_transform_hard_knee_expander_int), (gst_audio_dynamic_transform_hard_knee_expander_float), (gst_audio_dynamic_transform_soft_knee_expander_int), (gst_audio_dynamic_transform_soft_knee_expander_float), (gst_audio_dynamic_transform_ip): * gst/audiofx/audiodynamic.h: * gst/audiofx/audiofx.c: (plugin_init): Add new audiodynamic element which can act as a compressor or expander. Supported are hard-knee and soft-knee operation modes with user-specified ratio and threshold. Attack and release parameters are not yet implemented but will follow. * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-audiofx.xml: Integrate audiodynamic into the docs. * tests/check/Makefile.am: * tests/check/elements/audiodynamic.c: (setup_dynamic), (cleanup_dynamic), (GST_START_TEST), (dynamic_suite), (main): Add unit test for audiodynamic. 2007-03-07 19:48:03 +0000 Jan Schmidt ext/raw1394/gstdv1394src.c: Free handles that we allocated when exiting via the error paths. Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_start): Free handles that we allocated when exiting via the error paths. 2007-03-07 12:07:07 +0000 Sebastian Dröge ext/wavpack/: Use a general wavpack debug category for common code. Original commit message from CVS: * ext/wavpack/gstwavpack.c: (plugin_init): * ext/wavpack/gstwavpackcommon.c: Use a general wavpack debug category for common code. * ext/wavpack/gstwavpackstreamreader.c: (gst_wavpack_stream_reader_set_pos_abs), (gst_wavpack_stream_reader_set_pos_rel), (gst_wavpack_stream_reader_write_bytes): Use the general wavpack debug category here too and add debug output to the functions that should not be called at all by the wavpack library. * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_plugin_init): * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_plugin_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): Change debugging category names to conform to the conventions. 2007-03-07 11:37:23 +0000 Edward Hervey gst/qtdemux/qtdemux.*: Share qtdemux debug category across all files, otherwise all debugging in files other than qtd... Original commit message from CVS: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: Share qtdemux debug category across all files, otherwise all debugging in files other than qtdemux.c would end up in the default category. 2007-03-07 11:24:05 +0000 Stefan Kost gst/level/gstlevel.*: Resolve message timestamps against the playback segment. Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_class_init), (gst_level_set_caps), (gst_level_start), (gst_level_event), (gst_level_transform_ip): * gst/level/gstlevel.h: Resolve message timestamps against the playback segment. 2007-03-07 11:23:20 +0000 Stefan Kost gst/spectrum/gstspectrum.*: One FIXME less, by resolving message timestamps against the playback segment. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_start), (gst_spectrum_event), (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: One FIXME less, by resolving message timestamps against the playback segment. 2007-03-06 23:21:41 +0000 Tim-Philipp Müller * ChangeLog: Fix ChangeLog message Original commit message from CVS: Fix ChangeLog message 2007-03-06 23:19:30 +0000 Tim-Philipp Müller gst/id3demux/gstid3demux.c: Don't leak caps: make gst_id3demux_add_srcpad() not take ownership of the caps passed to ... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad), (gst_id3demux_sink_activate): Don't leak caps: make gst_id3demux_add_srcpad() not take ownership of the caps passed to it (previouslly one code path assumes it takes ownership while another one assumes it doesn't). * configure.ac: * tests/files/Makefile.am: * tests/files/id3-407349-1.tag: * tests/files/id3-407349-2.tag: Add directory where data for unit tests can be stored. * tests/Makefile.am: * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/id3demux.c: (pad_added_cb), (error_cb), (read_tags_from_file), (run_check_for_file), (check_date_1977_06_23), (GST_START_TEST), (id3demux_suite): Add unit test for id3demux, and in particular for bug #407349. Only testing pull-mode for now; push mode doesn't work yet because the test files are smaller than ID3_TYPE_FIND_MIN_SIZE. 2007-03-06 22:14:59 +0000 Tim-Philipp Müller tests/check/Makefile.am: Add missing backslash at end of line. Original commit message from CVS: * tests/check/Makefile.am: Add missing backslash at end of line. 2007-03-06 18:36:09 +0000 Jan Schmidt * ChangeLog: * common: Trigger rebuild. Original commit message from CVS: Trigger rebuild. 2007-03-06 18:16:49 +0000 Tim-Philipp Müller gst/id3demux/: Do not convert obsolete TDA/TDAT frames to TDRC frames, otherwise the four-digit number will be interp... Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): * gst/id3demux/id3tags.h: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_obsolete_tdat_frame): Do not convert obsolete TDA/TDAT frames to TDRC frames, otherwise the four-digit number will be interpreted as a year, whereas it is month and day in DDMM format. Instead, parse TDAT frames and fix up the date in the GST_TAG_DATE tag later if we also extracted a year. Fixes #407349. 2007-03-06 14:53:04 +0000 Jan Schmidt ext/gconf/gstswitchsink.c: Fix up the dispose logic so it doesn't leak, and fix setting of the child state so that we... Original commit message from CVS: * ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose), (gst_switch_commit_new_kid): Fix up the dispose logic so it doesn't leak, and fix setting of the child state so that we don't set a child to our current state just as we are changing it to something else. 2007-03-06 13:57:55 +0000 Wim Taymans gst/spectrum/gstspectrum.c: Fix and cleanup default property values. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_set_property), (gst_spectrum_transform_ip): Fix and cleanup default property values. Add FIXMEs for stuff that looks rather wrong. 2007-03-06 13:21:23 +0000 Wim Taymans gst/goom/gstgoom.*: Document, fix and improve goom adapter behaviour. Original commit message from CVS: * gst/goom/gstgoom.c: (gst_goom_src_setcaps), (get_buffer), (gst_goom_chain): * gst/goom/gstgoom.h: Document, fix and improve goom adapter behaviour. Fixes #407006. 2007-03-05 18:43:29 +0000 Jan Schmidt ext/esd/esdsink.c: Unref static pad template after using it. Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_open): Unref static pad template after using it. 2007-03-05 17:17:04 +0000 Jan Schmidt ext/gconf/gstswitchsink.c: Fix up the reference counting of the child elements. Original commit message from CVS: * ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose), (gst_switch_commit_new_kid): Fix up the reference counting of the child elements. 2007-03-05 17:08:32 +0000 Wim Taymans gst/rtp/: Fix encoding-name case. Original commit message from CVS: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_setcaps): * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_finish_headers): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): Fix encoding-name case. 2007-03-05 16:39:29 +0000 Wim Taymans gst/rtp/: Fix speex (de)payloader. Fixes #358040. Original commit message from CVS: * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init), (gst_rtp_speex_depay_get_mode), (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_base_init), (gst_rtp_speex_pay_class_init), (gst_rtp_speex_pay_setcaps), (gst_rtp_speex_pay_parse_ident), (gst_rtp_speex_pay_handle_buffer), (gst_rtp_speex_pay_change_state): * gst/rtp/gstrtpspeexpay.h: Fix speex (de)payloader. Fixes #358040. 2007-03-05 15:42:58 +0000 Jan Schmidt ext/gconf/gstswitchsink.c: Install fakesink in NULL by fixing some broken logic. This obviates the need to manually s... Original commit message from CVS: * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), (gst_switch_commit_new_kid), (gst_switch_sink_set_child): Install fakesink in NULL by fixing some broken logic. This obviates the need to manually set _IS_SINK. Add some comments and remove a little cruft while I'm at it. 2007-03-05 14:46:43 +0000 Wim Taymans ext/gconf/gstswitchsink.c: Mark us as a sink when we have no fakesink in NULL. Fixes #414887. Original commit message from CVS: * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset): Mark us as a sink when we have no fakesink in NULL. Fixes #414887. 2007-03-05 08:30:52 +0000 Stefan Kost gst/spectrum/: Remove two obsolete and confusing comments. Original commit message from CVS: * gst/spectrum/demo-audiotest.c: (message_handler): * gst/spectrum/demo-osssrc.c: (message_handler): Remove two obsolete and confusing comments. 2007-03-04 18:52:12 +0000 Tim-Philipp Müller po/POTFILES.in: Update. Original commit message from CVS: * po/POTFILES.in: Update. 2007-03-04 17:33:34 +0000 Jan Schmidt tests/check/Makefile.am: Gah! Also disable gconfvideosink from the tests, otherwise it will instantiate autovideosink... Original commit message from CVS: * tests/check/Makefile.am: Gah! Also disable gconfvideosink from the tests, otherwise it will instantiate autovideosink, and dfbvideosink and leak on the buildbots. 2007-03-04 17:13:19 +0000 Jan Schmidt ext/cdio/gstcdiocddasrc.c: Make sure we always destroy our libcdio handle. Original commit message from CVS: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open), (gst_cdio_cdda_src_finalize): Make sure we always destroy our libcdio handle. 2007-03-04 17:05:58 +0000 Jan Schmidt tests/check/Makefile.am: Disable autovideosink so the buildbots don't barf over memory leaked in the directfb sink. Original commit message from CVS: * tests/check/Makefile.am: Disable autovideosink so the buildbots don't barf over memory leaked in the directfb sink. 2007-03-04 15:28:30 +0000 Jan Schmidt sys/ximage/gstximagesrc.c: Chain up in dispose Original commit message from CVS: * sys/ximage/gstximagesrc.c: (gst_ximage_src_dispose): Chain up in dispose 2007-03-04 15:07:15 +0000 Jan Schmidt gst/multipart/multipartdemux.c: Use gst_pad_new_from_static_template instead of static_pad_template_get+pad_new. Original commit message from CVS: * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), (gst_multipart_find_pad_by_mime): Use gst_pad_new_from_static_template instead of static_pad_template_get+pad_new. 2007-03-04 14:56:53 +0000 Jan Schmidt sys/ximage/gstximagesrc.c: Catch the case where no clock has been set. Original commit message from CVS: * sys/ximage/gstximagesrc.c: (gst_ximage_src_create): Catch the case where no clock has been set. 2007-03-04 13:52:03 +0000 Jan Schmidt Fix a bunch of leaks shown by the newly-added states test. Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flac_enc_finalize): * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_class_init), (gst_gconf_audio_sink_dispose), (gst_gconf_audio_sink_finalize): * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init), (gst_gconf_audio_src_class_init), (gst_gconf_audio_src_dispose), (gst_gconf_audio_src_finalize), (do_toggle_element): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init), (gst_gconf_video_sink_class_init), (gst_gconf_video_sink_finalize), (do_toggle_element): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init), (gst_gconf_video_src_class_init), (gst_gconf_video_src_dispose), (gst_gconf_video_src_finalize), (do_toggle_element): * ext/gconf/gstswitchsink.c: (gst_switch_sink_class_init), (gst_switch_sink_reset), (gst_switch_sink_set_child): * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): * ext/shout2/gstshout2.c: (gst_shout2send_class_init), (gst_shout2send_init), (gst_shout2send_finalize): * gst/debug/testplugin.c: (gst_test_class_init), (gst_test_finalize): * gst/flx/gstflxdec.c: (gst_flxdec_class_init), (gst_flxdec_dispose): * gst/multipart/multipartmux.c: (gst_multipart_mux_finalize): * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize): * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_free_context): * gst/rtsp/rtspextwms.h: * gst/smpte/gstsmpte.c: (gst_smpte_class_init), (gst_smpte_finalize): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_finalize): * gst/udp/gstudpsink.c: (gst_udpsink_class_init), (gst_udpsink_finalize): * gst/wavparse/gstwavparse.c: (gst_wavparse_dispose), (gst_wavparse_sink_activate): * sys/oss/gstosssink.c: (gst_oss_sink_finalise): * sys/oss/gstosssrc.c: (gst_oss_src_class_init), (gst_oss_src_finalize): * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_destroy): * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), (gst_v4l2src_finalize): * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get): Fix a bunch of leaks shown by the newly-added states test. 2007-03-04 13:41:00 +0000 Jan Schmidt ext/dv/gstdvdec.c: Use gst_pad_new_from_static_template instead of static_pad_template_get+pad_new. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_init): Use gst_pad_new_from_static_template instead of static_pad_template_get+pad_new. 2007-03-03 13:06:21 +0000 Loïc Minier Don't mix tabs and spaces (#414168). Original commit message from CVS: Patch by: Loïc Minier * ext/libcaca/Makefile.am: * gst/debug/Makefile.am: Don't mix tabs and spaces (#414168). 2007-03-02 21:35:11 +0000 Stefan Kost tests/check/generic/.cvsignore: Ignore files to please buildbot. Original commit message from CVS: * tests/check/generic/.cvsignore: Ignore files to please buildbot. 2007-03-02 21:01:19 +0000 Stefan Kost gst/wavparse/gstwavparse.c: Unbreak my previous commit (swapped nominator & denominator). Tim, thanks for spotting. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), (gst_wavparse_stream_data): Unbreak my previous commit (swapped nominator & denominator). Tim, thanks for spotting. 2007-03-02 16:08:17 +0000 Wim Taymans ext/cdio/gstcdiocddasrc.c: Small code cleanups. Original commit message from CVS: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_probe_devices), (gst_cdio_cdda_src_read_sector), (gst_cdio_cdda_src_open), (gst_cdio_cdda_src_finalize): Small code cleanups. Don't use pad_alloc as the base class cannot deal with the error codes. 2007-03-02 13:40:06 +0000 Wim Taymans gst/udp/gstudpsrc.c: Fix doc. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_create): Fix doc. 2007-03-02 13:29:25 +0000 René Stadler gst/wavparse/gstwavparse.c: Handle rounding better to not drop last sample frame. Fixes #356692 Original commit message from CVS: Patch by: René Stadler * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): Handle rounding better to not drop last sample frame. Fixes #356692 2007-03-02 13:19:57 +0000 Jan Schmidt tests/check/Makefile.am: Disable cacasink from the states check too - it also calls exit(1) on us when it can't find ... Original commit message from CVS: * tests/check/Makefile.am: Disable cacasink from the states check too - it also calls exit(1) on us when it can't find a terminal to talk to. 2007-03-02 12:56:13 +0000 Thijs Vermeir gst/udp/gstudpsrc.*: Add support to strip proprietary headers. Fixes #350296. Original commit message from CVS: Patch by: Thijs Vermeir * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property): * gst/udp/gstudpsrc.h: Add support to strip proprietary headers. Fixes #350296. 2007-03-02 12:52:56 +0000 Wim Taymans gst/rtp/gstrtpmp2tdepay.c: Fix compilation. Original commit message from CVS: * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): Fix compilation. 2007-03-02 12:16:16 +0000 Thijs Vermeir gst/rtp/gstrtpmp2tdepay.*: Add support to strip off proprietary headers. Fixes #350278. Original commit message from CVS: Patch by: Thijs Vermeir * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_process), (gst_rtp_mp2t_depay_set_property), (gst_rtp_mp2t_depay_get_property): * gst/rtp/gstrtpmp2tdepay.h: Add support to strip off proprietary headers. Fixes #350278. 2007-03-02 11:22:35 +0000 Wim Taymans ext/hal/hal.c: Fix compilation. Original commit message from CVS: * ext/hal/hal.c: Fix compilation. 2007-03-02 10:54:49 +0000 Wim Taymans sys/sunaudio/gstsunaudiosrc.*: Remove device-name from GstSunAudioSrc. Fixes #412597. Original commit message from CVS: * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_class_init), (gst_sunaudiosrc_init), (gst_sunaudiosrc_get_property), (gst_sunaudiosrc_open): * sys/sunaudio/gstsunaudiosrc.h: Remove device-name from GstSunAudioSrc. Fixes #412597. 2007-03-01 21:50:36 +0000 Sebastian Dröge ext/hal/: Having NULL as UDI previously selected the default sink/src. Change this back but mention it in the debug o... Original commit message from CVS: * ext/hal/gsthalaudiosink.c: (do_toggle_element): * ext/hal/gsthalaudiosrc.c: (do_toggle_element): Having NULL as UDI previously selected the default sink/src. Change this back but mention it in the debug output. * ext/hal/hal.c: (gst_hal_get_alsa_element), (gst_hal_get_oss_element), (gst_hal_get_string), (gst_hal_render_bin_from_udi), (gst_hal_get_audio_sink), (gst_hal_get_audio_src): * ext/hal/hal.h: Refactor a bit, check all error conditions, greatly improve debugging and fix some possible memory leaks. Also implement OSS support and allow specifying an UDI that points to a real device. For this the child device which supports ALSA (preferred) or OSS is used. As a side effect this makes it impossible now to get a alsasink in halaudiosrc and a alsasrc in halaudiosink. 2007-03-01 18:47:28 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Errors from the udp sources are not fatal unless all of them are in error. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (find_stream_by_channel), (find_stream_by_udpsrc), (gst_rtspsrc_handle_message): Errors from the udp sources are not fatal unless all of them are in error. 2007-03-01 18:14:42 +0000 Jan Schmidt tests/check/Makefile.am: Disable aasink in the states test. I suspect this is the element that is calling exit(1) whe... Original commit message from CVS: * tests/check/Makefile.am: Disable aasink in the states test. I suspect this is the element that is calling exit(1) when it can't proceed. 2007-03-01 17:26:30 +0000 Jan Schmidt tests/check/Makefile.am: Draw plugins in from the build tree sys/ dir, rather than picking up the already installed v... Original commit message from CVS: * tests/check/Makefile.am: Draw plugins in from the build tree sys/ dir, rather than picking up the already installed versions. 2007-03-01 10:44:36 +0000 Zaheer Abbas Merali sys/ximage/gstximagesrc.c: Error out correctly when getting xcontext fails. Original commit message from CVS: 2007-03-01 Zaheer Abbas Merali * sys/ximage/gstximagesrc.c: (gst_ximage_src_open_display): Error out correctly when getting xcontext fails. 2007-03-01 09:29:34 +0000 Wim Taymans gst/rtsp/gstrtpdec.c: Make state change to PAUSED NO_PREROLL because that's what it will be in the future and rtspsrc... Original commit message from CVS: * gst/rtsp/gstrtpdec.c: (gst_rtpdec_change_state): Make state change to PAUSED NO_PREROLL because that's what it will be in the future and rtspsrc relies on it. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_change_state): Don't error out when we don't get an error from the state change function. 2007-03-01 01:48:59 +0000 Sebastian Dröge ext/hal/: Check if the device UDI is set before trying to query HAL about it and give a useful error message if it wa... Original commit message from CVS: * ext/hal/gsthalaudiosink.c: (do_toggle_element): * ext/hal/gsthalaudiosrc.c: (do_toggle_element): Check if the device UDI is set before trying to query HAL about it and give a useful error message if it wasn't set. * ext/hal/hal.c: (gst_hal_get_string): Don't query HAL for NULL UDIs. Passing NULL as UDI to HAL gives an assertion failure in D-Bus when running with DBUS_FATAL_WARNINGS=1. 2007-02-28 19:29:42 +0000 Thomas Vander Stichele * win32/common/config.h: update config to trunk Original commit message from CVS: update config to trunk 2007-02-28 19:29:25 +0000 Thomas Vander Stichele configure.ac: Convert to new AG_GST style. Original commit message from CVS: * configure.ac: Convert to new AG_GST style. 2007-02-28 12:59:43 +0000 Thomas Vander Stichele tests/check/: add test for states Original commit message from CVS: * tests/check/Makefile.am: * tests/check/generic/states.c: (GST_START_TEST), (states_suite): add test for states 2007-02-28 10:58:10 +0000 Wim Taymans tests/check/elements/.cvsignore: Add new videofilter check to .cvsignore. Original commit message from CVS: * tests/check/elements/.cvsignore: Add new videofilter check to .cvsignore. 2007-02-28 10:54:55 +0000 Wim Taymans gst/avi/gstavidemux.c: Fix combined flow return. Fixes #412608. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_combine_flows), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop), (gst_avi_demux_chain): Fix combined flow return. Fixes #412608. 2007-02-28 10:41:14 +0000 Wim Taymans gst/videofilter/Makefile.am: Dist header.. Original commit message from CVS: * gst/videofilter/Makefile.am: Dist header.. 2007-02-28 10:29:08 +0000 Wim Taymans gst/videofilter/gstgamma.h: Add header too. Original commit message from CVS: * gst/videofilter/gstgamma.h: Add header too. 2007-02-28 10:17:15 +0000 Mark Nauwelaerts gst/videofilter/: Port gamma filter to 0.10. Fixes #412704. Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/videofilter/Makefile.am: * gst/videofilter/gstgamma.c: (gst_gamma_base_init), (gst_gamma_class_init), (gst_gamma_init), (gst_gamma_set_property), (gst_gamma_get_property), (gst_gamma_calculate_tables), (oil_tablelookup_u8), (gst_gamma_set_caps), (gst_gamma_planar411_ip), (gst_gamma_transform_ip), (plugin_init): Port gamma filter to 0.10. Fixes #412704. * tests/check/Makefile.am: * tests/check/elements/videofilter.c: (setup_filter), (cleanup_filter), (check_filter), (GST_START_TEST), (videobalance_suite), (videoflip_suite), (gamma_suite), (main): Add unit tests for videofilters. 2007-02-28 10:06:27 +0000 Wim Taymans gst/rtsp/URLS: Add another interesting test url. Original commit message from CVS: * gst/rtsp/URLS: Add another interesting test url. * gst/rtsp/rtspmessage.c: (rtsp_message_get_header): Don't allow getting header fields from data packets. 2007-02-27 23:43:08 +0000 Michael Smith ext/shout2/gstshout2.*: Add a property for username. Original commit message from CVS: * ext/shout2/gstshout2.c: (gst_shout2send_class_init), (gst_shout2send_init), (gst_shout2send_start), (gst_shout2send_set_property), (gst_shout2send_get_property): * ext/shout2/gstshout2.h: Add a property for username. 2007-02-27 12:02:03 +0000 Christian Schaller * sys/directdraw/gstdirectdrawplugin.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: * sys/directsound/gstdirectsoundplugin.c: * sys/directsound/gstdirectsoundsink.c: * sys/directsound/gstdirectsoundsink.h: * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: update copyright statements Original commit message from CVS: update copyright statements 2007-02-27 11:59:21 +0000 Christian Schaller * ChangeLog: * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudioelement.c: * sys/osxaudio/gstosxaudioelement.h: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosink.h: update copyright statement Original commit message from CVS: update copyright statement 2007-02-27 11:30:19 +0000 Edward Hervey sys/osxvideo/: Disable the cocoa event loop since it's a huge memory leak. Should only matter if the sink isn't used ... Original commit message from CVS: * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Disable the cocoa event loop since it's a huge memory leak. Should only matter if the sink isn't used within an NSApp (which has already got a coca event loop). Remove all unused code. 2007-02-26 12:07:14 +0000 Jan Schmidt gst/rtsp/Makefile.am: Fix make check too. Original commit message from CVS: * gst/rtsp/Makefile.am: Fix make check too. 2007-02-26 10:00:28 +0000 Jan Schmidt gst/rtsp/base64.*: Commit missing files for base64 encoding. Original commit message from CVS: * gst/rtsp/base64.c: (util_base64_encode): * gst/rtsp/base64.h: Commit missing files for base64 encoding. 2007-02-24 22:57:49 +0000 Loïc Minier Fix build with LDFLAGS='-Wl,-z,defs' (#410997) Original commit message from CVS: Patch by: Loïc Minier * configure.ac: * ext/annodex/Makefile.am: * ext/jpeg/Makefile.am: * ext/speex/Makefile.am: * gst/alpha/Makefile.am: * gst/cutter/Makefile.am: * gst/debug/Makefile.am: * gst/effectv/Makefile.am: * gst/goom/Makefile.am: * gst/level/Makefile.am: * gst/smpte/Makefile.am: * gst/videofilter/Makefile.am: Fix build with LDFLAGS='-Wl,-z,defs' (#410997) 2007-02-24 22:52:47 +0000 Tim-Philipp Müller Fix build with LDFLAGS='-Wl,-z,defs'. Original commit message from CVS: * configure.ac: * ext/gsm/Makefile.am: * ext/ladspa/Makefile.am: * ext/wavpack/Makefile.am: * gst/equalizer/Makefile.am: * gst/filter/Makefile.am: * gst/mve/Makefile.am: * gst/nsf/Makefile.am: * gst/replaygain/Makefile.am: * gst/speed/Makefile.am: Fix build with LDFLAGS='-Wl,-z,defs'. 2007-02-23 19:12:52 +0000 Jan Schmidt gst/rtsp/: g_base64_encode is a GLib 2.12 function. Use an equivalent taken from icecast to replace it. Relicensed fr... Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/rtspconnection.c: (append_auth_header), (rtsp_connection_send), (rtsp_connection_set_auth): g_base64_encode is a GLib 2.12 function. Use an equivalent taken from icecast to replace it. Relicensed from GPL courtesy of Mike Smith. 2007-02-23 18:12:27 +0000 Jan Schmidt gst/rtsp/: Implement simple Basic Authentication support so that urls like rtsp://user:pass@hostname/rtspstream work ... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), (gst_rtspsrc_create_stream), (rtsp_auth_method_to_string), (gst_rtspsrc_parse_auth_hdr), (gst_rtspsrc_setup_auth), (gst_rtspsrc_send), (gst_rtspsrc_try_send), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_uri_set_uri): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (append_auth_header), (rtsp_connection_send), (rtsp_connection_free), (rtsp_connection_set_auth): * gst/rtsp/rtspconnection.h: * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspurl.c: (rtsp_url_get_request_uri): * gst/rtsp/rtspurl.h: Implement simple Basic Authentication support so that urls like rtsp://user:pass@hostname/rtspstream work on hosts that require authentication. 2007-02-22 17:53:26 +0000 Edgard Lima * ChangeLog: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/v4l2_calls.c: Fix segfault when oppening a radio device. Original commit message from CVS: Fix segfault when oppening a radio device. 2007-02-22 14:35:28 +0000 Stefan Kost Fix level for multi-channel case. Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_set_caps), (gst_level_transform_ip): * sys/v4l2/README: * tests/check/elements/level.c: (GST_START_TEST): Fix level for multi-channel case. 2007-02-21 10:18:12 +0000 Stefan Kost gst/level/gstlevel.*: Use function pointer for process function and add process functions for float audio. Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), (gst_level_transform_ip): * gst/level/gstlevel.h: Use function pointer for process function and add process functions for float audio. 2007-02-20 21:34:00 +0000 Sébastien Moutte sys/directsound/gstdirectsoundsink.*: Remove include of unused headers. Original commit message from CVS: * sys/directsound/gstdirectsoundsink.c: * sys/directsound/gstdirectsoundsink.h: Remove include of unused headers. * sys/waveform/gstwaveformplugin.c: * sys/waveform/gstwaveformsink.c: * sys/waveform/gstwaveformsink.h: * win32/vs6/libgstwaveform.dsp: Add a new waveform plugin which includes an audio sink element using the WaveForm win32 API. * win32/MANIFEST: Add the new project file form waveform plugin. 2007-02-19 12:22:43 +0000 Stefan Kost sys/v4l2/v4l2src_calls.c: Readd GST_ELEMENT_ERROR if we can't reenque buffers after EIO, fixes #407369 Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init): Readd GST_ELEMENT_ERROR if we can't reenque buffers after EIO, fixes #407369 2007-02-18 18:00:51 +0000 Sébastien Moutte sys/directdraw/: Prepare the plugin to move to good: Original commit message from CVS: * sys/directdraw/gstdirectdrawplugin.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: Prepare the plugin to move to good: Remove unused/untested code (rendering to an extern surface, yuv format rendering).Use GST_(DEBUG/*)_OBJECT macros Rename all functions from gst_directdrawsink to gst_directdraw_sink. Add gtk doc section Fix a bug in gst_directdraw_sink_show_frame, memcpy line by line respecting destination surface stride. * sys/directsound/gstdirectsoundplugin.c: * sys/directsound/gstdirectsoundsink.c: * sys/directsound/gstdirectsoundsink.h: Prepare the plugin to move to good: Rename all functions from gst_directsoundsink to gst_directsound_sink. Add gtk doc section * win32/common/config.h.in: * win32/MANIFEST: Add config.h.in 2007-02-18 13:24:26 +0000 Wim Taymans gst/rtp/: Added simple mpeg transport stream payloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_base_init), (gst_rtp_mp2t_pay_class_init), (gst_rtp_mp2t_pay_init), (gst_rtp_mp2t_pay_setcaps), (gst_rtp_mp2t_pay_handle_buffer), (gst_rtp_mp2t_pay_plugin_init): * gst/rtp/gstrtpmp2tpay.h: Added simple mpeg transport stream payloader. 2007-02-16 12:32:01 +0000 Wim Taymans gst/rtsp/URLS: Add example H264 rtsp url. Original commit message from CVS: * gst/rtsp/URLS: Add example H264 rtsp url. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): Don't convert values to lowercase or we might mess up base64 encoded properties. 2007-02-16 12:30:22 +0000 Wim Taymans gst/rtp/README: Fix case of string params. Original commit message from CVS: * gst/rtp/README: Fix case of string params. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): Fix depayloader, support more packet types. Add sync codes to make sure the packetizer can do its job. * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): Fix caps case again. 2007-02-15 12:26:28 +0000 Wim Taymans gst/rtp/gstrtph264depay.c: Set right caps on output buffers. Original commit message from CVS: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): Set right caps on output buffers. 2007-02-14 17:04:47 +0000 Wim Taymans gst/rtsp/sdpmessage.c: Clear stack allocated SDPMedia struct before calling _init() on it. Original commit message from CVS: * gst/rtsp/sdpmessage.c: (sdp_parse_line): As spotted by: Peter Kjellerstedt : Clear stack allocated SDPMedia struct before calling _init() on it. Clarify this in the docs as well. 2007-02-14 17:01:25 +0000 Jan Schmidt ext/gconf/gstgconfaudiosink.c: Don't reset the profile when going switching states, as it makes the element non-reusa... Original commit message from CVS: * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), (do_change_child): Don't reset the profile when going switching states, as it makes the element non-reusable. 2007-02-14 15:24:50 +0000 jp.liu gst/rtsp/sdpmessage.*: Fix memory management of SDP messages. Fixes #407793. Original commit message from CVS: * gst/rtsp/sdpmessage.c: (sdp_origin_init), (sdp_connection_init), (sdp_bandwidth_init), (sdp_time_init), (sdp_zone_init), (sdp_key_init), (sdp_attribute_init), (sdp_message_init), (sdp_message_uninit), (sdp_message_free), (sdp_media_init), (sdp_media_uninit), (sdp_media_free), (sdp_message_add_media), (sdp_parse_line): * gst/rtsp/sdpmessage.h: Based on patch by: jp.liu Fix memory management of SDP messages. Fixes #407793. 2007-02-14 12:07:01 +0000 zhangfei gao gst/avi/gstavimux.c: Allow muxing video/x-h264 (was already in the caps). Fixes #407780. Original commit message from CVS: Patch by: zhangfei gao * gst/avi/gstavimux.c: (gst_avi_mux_vidsink_set_caps): Allow muxing video/x-h264 (was already in the caps). Fixes #407780. 2007-02-14 10:09:12 +0000 jp.liu gst/rtsp/rtspurl.c: Fix parsing of password field in url. Fixes #407797. Original commit message from CVS: Patch by: jp.liu * gst/rtsp/rtspurl.c: (rtsp_url_parse): Fix parsing of password field in url. Fixes #407797. 2007-02-14 09:55:47 +0000 Wim Taymans gst/wavparse/gstwavparse.*: Update docs. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_destroy_sourcepad), (gst_wavparse_fmt), (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), (gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info), (gst_wavparse_stream_headers), (gst_wavparse_parse_stream_init), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_chain), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event), (gst_wavparse_change_state), (plugin_init): * gst/wavparse/gstwavparse.h: Update docs. Use boilerplate. Various code cleanups. When the bitrate is not known (bps == 0 or compressed formats) let downstream element guestimate the duration and position and don't generate timestamps or durations. Fixes #405213. Fix EOS and ERROR conditions in chain mode, we just need to forward the error flowreturn upstream. 2007-02-13 16:01:29 +0000 Jan Schmidt Re-factor the gconfaudiosink into a "GstSwitchSink" base class and a child that implements the GConf key monitoring. ... Original commit message from CVS: * ext/gconf/Makefile.am: * ext/gconf/gconf.c: (gst_gconf_get_string), (gst_gconf_get_key_for_sink_profile), (gst_gconf_set_string), (gst_gconf_render_bin_with_default): * ext/gconf/gconf.h: * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init), (gst_gconf_audio_sink_reset), (gst_gconf_audio_sink_init), (gst_gconf_audio_sink_dispose), (do_change_child), (gst_gconf_switch_profile), (gst_gconf_audio_sink_set_property), (cb_change_child), (gst_gconf_audio_sink_change_state): * ext/gconf/gstgconfaudiosink.h: * ext/gconf/gstswitchsink.c: (gst_switch_sink_base_init), (gst_switch_sink_class_init), (gst_switch_sink_reset), (gst_switch_sink_init), (gst_switch_sink_dispose), (gst_switch_commit_new_kid), (gst_switch_sink_set_child), (gst_switch_sink_set_property), (gst_switch_sink_handle_event), (gst_switch_sink_get_property), (gst_switch_sink_change_state): * ext/gconf/gstswitchsink.h: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_dispose), (gst_auto_audio_sink_clear_kid), (gst_auto_audio_sink_reset), (gst_auto_audio_sink_detect): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_class_init), (gst_auto_video_sink_dispose), (gst_auto_video_sink_clear_kid), (gst_auto_video_sink_reset), (gst_auto_video_sink_detect): Re-factor the gconfaudiosink into a "GstSwitchSink" base class and a child that implements the GConf key monitoring. The end goal of this is an audio sink that can be changed on the fly, but at the moment it still only changes on the next READY transition. 2007-02-13 11:57:18 +0000 Stefan Kost gst/avi/gstavidemux.c: Put debug stuff into #ifndef GST_DISABLE_DEBUG #endif Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_push_event), (gst_avi_demux_stream_header_pull), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): Put debug stuff into #ifndef GST_DISABLE_DEBUG #endif 2007-02-13 09:46:26 +0000 Stefan Kost Add crossreferences to glib/gobject/gstream docs. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: Add crossreferences to glib/gobject/gstream docs. 2007-02-12 23:35:16 +0000 Tim-Philipp Müller gst/monoscope/: Fix copy'n'paste-o in docs chunk. Also add some missing CFLAGS (but no LIBS, since we only use define... Original commit message from CVS: * gst/monoscope/Makefile.am: * gst/monoscope/gstmonoscope.c: Fix copy'n'paste-o in docs chunk. Also add some missing CFLAGS (but no LIBS, since we only use defines from the headers). 2007-02-12 23:27:31 +0000 Jonathan Matthew gst/wavparse/gstwavparse.c: Fix massive memory leak when operating in streaming mode due to Original commit message from CVS: Based on patch by: Jonathan Matthew * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_stream_init), (gst_wavparse_stream_data): Fix massive memory leak when operating in streaming mode due to GST_BUFFER_MALLOCDATA() not being set on newly-created buffers. Fixes #407057. 2007-02-12 15:29:44 +0000 Stefan Kost gst/avi/gstavidemux.*: Save some memory (8%) by repacking the index entry structure (more to come). Add more FIXMEs t... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), (gst_avi_demux_reset), (gst_avi_demux_index_entry_for_time), (gst_avi_demux_handle_src_query), (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_push_event), (gst_avi_demux_stream_header_pull), (gst_avi_demux_do_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): * gst/avi/gstavidemux.h: Save some memory (8%) by repacking the index entry structure (more to come). Add more FIXMEs to questionable parts. 2007-02-12 12:57:22 +0000 Stefan Kost sys/v4l2/: More FIXME comments and messaging changes. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps), (gst_v4l2src_get_caps): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init): More FIXME comments and messaging changes. 2007-02-12 12:43:00 +0000 Stefan Kost gst/goom/gstgoom.*: Improved docs and use GST_DEBUG_FUNCPTR. Original commit message from CVS: * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), (gst_goom_change_state): * gst/goom/gstgoom.h: Improved docs and use GST_DEBUG_FUNCPTR. * gst/level/gstlevel.c: (gst_level_class_init): Use GST_DEBUG_FUNCPTR. * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), (gst_monoscope_chain), (gst_monoscope_change_state): Improved docs source cleanups. 2007-02-12 10:29:57 +0000 Tim-Philipp Müller gst/debug/: Add code for a pushfilesrc element that implements a pushfile:// URI handler, to make debugging push-mode... Original commit message from CVS: * gst/debug/Makefile.am: * gst/debug/gstdebug.c: (plugin_init): * gst/debug/gstpushfilesrc.c: * gst/debug/gstpushfilesrc.h: Add code for a pushfilesrc element that implements a pushfile:// URI handler, to make debugging push-mode operation of demuxer/decoders that support both easier in connection with seek/playbin/etc. The element isn't registered at the moment. 2007-02-11 15:26:49 +0000 Sébastien Moutte Makefile.am: Add win32 MANIFEST Original commit message from CVS: * Makefile.am: Add win32 MANIFEST * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: Clear unused code and add comments. Remove yuv from template caps, it only supports RGB actually. Implement XOverlay interface and remove window and fullscreen properties. Add debug logs. Test for blit capabilities to return only the current colorspace if the hardware can't blit for one colorspace to another. * sys/directsound/gstdirectsoundsink.c: Add some debugs. * win32/MANIFEST: Add VS7 project files and solution. * win32/vs6/gst_plugins_bad.dsw: * win32/vs6/libgstdirectdraw.dsp: * win32/vs6/libgstdirectsound.dsp: * win32/vs6/libgstqtdemux.dsp: Update project files. 2007-02-11 12:57:47 +0000 Sébastien Moutte gst/avi/gstavimux.c: Comment a #if 0 in caps template definition as VS6 seems to do not support it. Original commit message from CVS: * gst/avi/gstavimux.c: Comment a #if 0 in caps template definition as VS6 seems to do not support it. * gst/rtsp/gstrtspsrc.c:(gst_rtspsrc_loop_udp): Use gst_guint64_to_gdouble for conversion. * gst/rtsp/rtspconnection.c:(rtsp_connection_send): Move variables declaration before the first instruction. * gst/rtsp/rtspdefs.c:(rtsp_strresult): Don't use hstrerror for error log on G_OS_WIN32 build as it's not supported. And don't include netdb.h for G_OS_WIN32 * gst/rtsp/sdpmessage.c:(sdp_parse_line): This initialization SDPMedia nmedia = {.media = NULL }; is not supported by VS6 then use an other way to initialize SDPMedia structure. * gst/udp/gstdynudpsink.h: * gst/udp/gstdynudpnetutils.h: Do not include for G_OS_WIN32 * gst/udp/gstudpsrc.c: Define socklen_t as int for G_OS_WIN32 * win/common/config.h.in: Undef HAVE_NETINET_IN_H * win32/vs6/gst_plugins_good.dsw: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: * win32/vs6/libgstautogen.dsp: * win32/vs6/libgstaudiofx.dsp: * win32/vs6/libgstudp.dsp: Add and update project files. * win32/common/gstudp-enumtypes.c: * win32/common/gstudp-enumtypes.h: Add a copy of udp enumtypes to win32/common as in core and base. 2007-02-11 10:53:21 +0000 Stefan Kost configure.ac: Activate monoscope when building with --enable-experimental. Fix Original commit message from CVS: * configure.ac: Activate monoscope when building with --enable-experimental. Fix --enable-external configure switch description. * sys/sunaudio/gstsunaudiomixer.c: (gst_sunaudiomixer_base_init): * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_dispose): Help gst-indent. 2007-02-09 09:24:58 +0000 Tim-Philipp Müller gst/avi/gstavimux.c: Explicitly cast result of pointer arithmetic to integer in order to avoid compiler warnings on s... Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_riff_get_avi_header): Explicitly cast result of pointer arithmetic to integer in order to avoid compiler warnings on some 64-bit systems. Should fix #406018. 2007-02-08 11:09:15 +0000 Tim-Philipp Müller gst/debug/progressreport.c: Some more docs. Original commit message from CVS: * gst/debug/progressreport.c: Some more docs. 2007-02-07 21:09:45 +0000 Tim-Philipp Müller docs/plugins/inspect/plugin-rtp.xml: Update for new elements. Original commit message from CVS: * docs/plugins/inspect/plugin-rtp.xml: Update for new elements. * gst/debug/progressreport.h: Commit newly-created header file as well. 2007-02-07 20:39:16 +0000 Tim-Philipp Müller Make progressreport element post messages with the current progress on the bus. Also add some basic docs for it. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * gst/debug/Makefile.am: * gst/debug/progressreport.c: (gst_progress_report_post_progress), (gst_progress_report_do_query), (gst_progress_report_report): Make progressreport element post messages with the current progress on the bus. Also add some basic docs for it. 2007-02-07 13:08:34 +0000 Tim-Philipp Müller ext/hal/hal.*: Some small cleanups; deal with errors when parsing the HAL ALSA capabilities a bit better. Original commit message from CVS: * ext/hal/hal.c: (gst_hal_get_string): * ext/hal/hal.h: Some small cleanups; deal with errors when parsing the HAL ALSA capabilities a bit better. 2007-02-06 16:29:30 +0000 Tim-Philipp Müller gst/smpte/gstsmpte.c: Let's try this again and use the right cast this time. Original commit message from CVS: * gst/smpte/gstsmpte.c: (gst_smpte_transition_type_get_type): Let's try this again and use the right cast this time. 2007-02-06 16:24:57 +0000 Tim-Philipp Müller gst/smpte/gstsmpte.c: Add cast to avoid compiler warnings with older GLib versions where the nick/name members in GEn... Original commit message from CVS: * gst/smpte/gstsmpte.c: (gst_smpte_transition_type_get_type): Add cast to avoid compiler warnings with older GLib versions where the nick/name members in GEnumValue are not declared as constant strings. 2007-02-06 15:56:14 +0000 Tim-Philipp Müller ext/gconf/: In gconfaudiosink, get the right key as the old key in do_toggle (ie. one dependent on the profile select... Original commit message from CVS: * ext/gconf/gconf.c: (gst_gconf_get_key_for_sink_profile), (gst_gconf_render_bin_from_key), (gst_gconf_get_default_audio_sink): * ext/gconf/gconf.h: * ext/gconf/gstgconfaudiosink.c: (get_gconf_key_for_profile), (do_toggle_element), (gst_gconf_audio_sink_set_property), (gst_gconf_audio_sink_get_property): In gconfaudiosink, get the right key as the old key in do_toggle (ie. one dependent on the profile selected). Log some more stuff so we can see what's actually going on. 2007-02-06 11:16:49 +0000 Sebastian Dröge gst/audiofx/: Some small cleanups and port both elements to the new GstAudioFilter base class to save a few lines of ... Original commit message from CVS: * gst/audiofx/audioamplify.c: (gst_audio_amplify_base_init), (gst_audio_amplify_class_init), (gst_audio_amplify_init), (gst_audio_amplify_set_process_function), (gst_audio_amplify_setup): * gst/audiofx/audioamplify.h: * gst/audiofx/audioinvert.c: (gst_audio_invert_base_init), (gst_audio_invert_class_init), (gst_audio_invert_setup): * gst/audiofx/audioinvert.h: Some small cleanups and port both elements to the new GstAudioFilter base class to save a few lines of common code. * gst/audiofx/Makefile.am: Link against libgstaudio for the above changes 2007-02-03 23:35:26 +0000 Tim-Philipp Müller Fix up to use the newly ported (actually working) GstAudioFilter. Original commit message from CVS: * configure.ac: * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), (gst_iir_equalizer_init), (setup_filter), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), (gst_iir_equalizer_transform_ip), (gst_iir_equalizer_setup), (plugin_init): * gst/equalizer/gstiirequalizer.h: Fix up to use the newly ported (actually working) GstAudioFilter. Bump core/base requirements to CVS for this. * tests/icles/.cvsignore: * tests/icles/Makefile.am: * tests/icles/equalizer-test.c: (check_bus), (equalizer_set_band_value), (equalizer_set_all_band_values), (equalizer_set_band_value_and_wait), (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), (main): Add brain-dead interactive test for equalizer. 2007-02-02 18:36:28 +0000 Tim-Philipp Müller gst/equalizer/gstiirequalizer.c: Rename "values" property to "band-values" and change type into a Original commit message from CVS: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_class_init), (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), (gst_iir_equalizer_filter_inplace): Rename "values" property to "band-values" and change type into a GValueArray, so it's more easily bindable and the range of the values passed in is defined and checked etc.; also do some locking. 2007-02-02 17:39:21 +0000 James Doc Livingston Port equalizer plugin to 0.10 (#403572). Original commit message from CVS: Patch by: James "Doc" Livingston * configure.ac: * gst/equalizer/Makefile.am: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), (gst_iir_equalizer_compute_frequencies), (gst_iir_equalizer_set_property), (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), (plugin_init): Port equalizer plugin to 0.10 (#403572). 2007-01-31 08:32:59 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Fix a off by one that leads to the duration reported as one sample less than it is Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query), (gst_wavpack_parse_handle_seek_event), (gst_wavpack_parse_create_src_pad): Fix a off by one that leads to the duration reported as one sample less than it is 2007-01-30 17:19:33 +0000 Edward Hervey configure.ac: Check for an Objective C compiler Original commit message from CVS: * configure.ac: Check for an Objective C compiler * sys/Makefile.am: * sys/osxvideo/Makefile.am: * sys/osxvideo/cocoawindow.h: * sys/osxvideo/cocoawindow.m: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Port of osxvideo plugin to 0.10. Do NOT consider 100% stable ! Fixes #402470 2007-01-29 10:59:48 +0000 Wim Taymans tests/check/elements/.cvsignore: Some more ignores. Original commit message from CVS: * tests/check/elements/.cvsignore: Some more ignores. 2007-01-28 18:28:33 +0000 Tim-Philipp Müller gst/videocrop/gstvideocrop.c: Fix cropping for packed 4:2:2 formats YUYV/YUY2 and UYVY. Original commit message from CVS: * gst/videocrop/gstvideocrop.c: (gst_video_crop_get_image_details_from_caps), (gst_video_crop_transform_packed_complex): Fix cropping for packed 4:2:2 formats YUYV/YUY2 and UYVY. * tests/icles/videocrop-test.c: (check_bus_for_errors), (test_with_caps), (main): Block streaming thread before changing filter caps while the pipeline is running so that we don't get random not-negotiated errors just because GStreamer can't handle that yet. 2007-01-27 16:08:15 +0000 Tim-Philipp Müller tests/icles/videocrop-test.c: Catch errors while the test is running. Original commit message from CVS: * tests/icles/videocrop-test.c: (test_with_caps): Catch errors while the test is running. 2007-01-26 12:21:41 +0000 charles ext/shout2/gstshout2.*: Properly handle tags in shout2send. Fixes #399825. Original commit message from CVS: Patch by: charles * ext/shout2/gstshout2.c: (gst_shout2send_init), (set_shout_metadata), (gst_shout2send_event): * ext/shout2/gstshout2.h: Properly handle tags in shout2send. Fixes #399825. 2007-01-25 23:27:59 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Fix the SEEKING query. We can seek if we are in pull mode, not the other way around. A... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query): Fix the SEEKING query. We can seek if we are in pull mode, not the other way around. Also set the correct format in the seeking query and handle the case where the headers are not read yet and we can't say anything about our seeking capabilities. 2007-01-25 21:55:49 +0000 Sebastian Dröge ext/wavpack/: Fix spelling in 2 places: It's called Wavpack, not WavePack. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): Fix spelling in 2 places: It's called Wavpack, not WavePack. 2007-01-25 14:40:15 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Convert SDP fields to upper/lowercase following the rules in the SDP to caps document. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), (gst_rtspsrc_activate_streams): Convert SDP fields to upper/lowercase following the rules in the SDP to caps document. 2007-01-25 14:22:53 +0000 Wim Taymans gst/rtp/: Fix case of encoding-name and key/value pairs to match the document. Original commit message from CVS: * gst/rtp/README: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: Fix case of encoding-name and key/value pairs to match the document. This is to make interoperation with SDP case-insensitive as required by the relevant RFCs. 2007-01-25 12:05:11 +0000 Edward Hervey gst/: Use proper print statements. Original commit message from CVS: * gst/multifile/gstmultifilesink.c: (gst_multi_file_sink_class_init): * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_class_init): * gst/mve/gstmvedemux.c: (gst_mve_video_create_buffer), (gst_mve_video_palette), (gst_mve_video_code_map), (gst_mve_audio_init), (gst_mve_audio_data), (gst_mve_timer_create), (gst_mve_demux_chain): * gst/mve/gstmvemux.c: (gst_mve_mux_push_chunk): * gst/mve/mveaudioenc.c: (mve_compress_audio): * gst/mve/mvevideodec16.c: (ipvideo_copy_block): * gst/mve/mvevideodec8.c: (ipvideo_copy_block): * gst/mve/mvevideoenc16.c: (mve_encode_frame16): * gst/mve/mvevideoenc8.c: (mve_encode_frame8): Use proper print statements. Fixes build on mac os x. oo look at me my name is edward i'm hacking on macos wooo 2007-01-25 11:02:01 +0000 Wim Taymans configure.ac: Bump required -core/-base to CVS Original commit message from CVS: * configure.ac: Bump required -core/-base to CVS 2007-01-25 10:54:19 +0000 Wim Taymans gst/rtp/gstrtpL16pay.*: Fill up to MTU using adapter. Original commit message from CVS: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_flush), (gst_rtp_L16_pay_handle_buffer): * gst/rtp/gstrtpL16pay.h: Fill up to MTU using adapter. Timestamp rtp packets. 2007-01-25 10:36:35 +0000 Edward Hervey Use G_GSIZE_FORMAT in print statements for portability. Original commit message from CVS: * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): * sys/ximage/ximageutil.c: (ximageutil_check_xshm_calls): Use G_GSIZE_FORMAT in print statements for portability. Fixes build on macosx. 2007-01-24 18:20:14 +0000 Wim Taymans gst/rtp/: Port and enable raw audio payloader/depayloader. Needs a bit more work on the payloader side. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_base_init), (gst_rtp_L16_depay_class_init), (gst_rtp_L16_depay_init), (gst_rtp_L16_depay_parse_int), (gst_rtp_L16_depay_setcaps), (gst_rtp_L16_depay_process), (gst_rtp_L16_depay_set_property), (gst_rtp_L16_depay_get_property), (gst_rtp_L16_depay_change_state), (gst_rtp_L16_depay_plugin_init): * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_get_type), (gst_rtp_L16_pay_base_init), (gst_rtp_L16_pay_class_init), (gst_rtp_L16_pay_init), (gst_rtp_L16_pay_finalize), (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_handle_buffer), (gst_rtp_L16_pay_plugin_init): * gst/rtp/gstrtpL16pay.h: Port and enable raw audio payloader/depayloader. Needs a bit more work on the payloader side. 2007-01-24 16:25:55 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Only unblock the udp pads when we linked and activated them all. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (pad_blocked), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_udp): * gst/rtsp/gstrtspsrc.h: Only unblock the udp pads when we linked and activated them all. Fixes #395688. 2007-01-24 15:18:34 +0000 Wim Taymans gst/rtp/: Added simple AC3 depayloader (RFC 4184). Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_base_init), (gst_rtp_ac3_depay_class_init), (gst_rtp_ac3_depay_init), (gst_rtp_ac3_depay_setcaps), (gst_rtp_ac3_depay_process), (gst_rtp_ac3_depay_set_property), (gst_rtp_ac3_depay_get_property), (gst_rtp_ac3_depay_change_state), (gst_rtp_ac3_depay_plugin_init): * gst/rtp/gstrtpac3depay.h: Added simple AC3 depayloader (RFC 4184). * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): Fix a leak. 2007-01-24 12:41:03 +0000 Sebastian Dröge gst/audiofx/: Add new element "audioamplify". This allows scaling of raw audio samples, similar to the "volume" eleme... Original commit message from CVS: reviewed by: Stefan Kost * gst/audiofx/Makefile.am: * gst/audiofx/audioamplify.c: (gst_audio_amplify_clipping_method_get_type), (gst_audio_amplify_base_init), (gst_audio_amplify_class_init), (gst_audio_amplify_init), (gst_audio_amplify_set_process_function), (gst_audio_amplify_set_property), (gst_audio_amplify_get_property), (gst_audio_amplify_set_caps), (gst_audio_amplify_transform_int_clip), (gst_audio_amplify_transform_int_wrap_negative), (gst_audio_amplify_transform_int_wrap_positive), (gst_audio_amplify_transform_float_clip), (gst_audio_amplify_transform_float_wrap_negative), (gst_audio_amplify_transform_float_wrap_positive), (gst_audio_amplify_transform_ip): * gst/audiofx/audioamplify.h: * gst/audiofx/audiofx.c: (plugin_init): Add new element "audioamplify". This allows scaling of raw audio samples, similar to the "volume" element, but provides different modes for clipping and allows unlimited amplification. It's mainly targeted for creative sound design and not as a replacement of the "volume" element. Fixes #397162 * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-audiofx.xml: Add docs for audioamplify and integrate them into the build system * tests/check/Makefile.am: * tests/check/elements/audioamplify.c: (setup_amplify), (cleanup_amplify), (GST_START_TEST), (amplify_suite), (main): Add fairly extensive unit test suite for audioamplify 2007-01-24 12:26:41 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Unblock pads after adding the pads to the element so that autopluggers get a change to link so... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (pad_unblocked), (pad_blocked): Unblock pads after adding the pads to the element so that autopluggers get a change to link something. Possibly fixes #395688. 2007-01-24 12:22:51 +0000 Wim Taymans gst/rtp/: Fix caps with payload numbers. Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_class_init), (gst_rtp_mpa_depay_init), (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_class_init), (gst_rtp_mpv_depay_init), (gst_rtp_mpv_depay_process): * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: Fix caps with payload numbers. Add some fixed payload numbers to caps when possible. 2007-01-24 11:29:00 +0000 Wim Taymans gst/qtdemux/gstrtpxqtdepay.c: Fix caps on the depayloader. Original commit message from CVS: * gst/qtdemux/gstrtpxqtdepay.c: Fix caps on the depayloader. 2007-01-23 18:16:09 +0000 Sebastian Dröge gst/audiofx/: Add new audiofx element "audioinvert". This element swaps the upper and lower half of samples and can b... Original commit message from CVS: reviewed by: Stefan Kost * gst/audiofx/Makefile.am: * gst/audiofx/audiofx.c: (plugin_init): * gst/audiofx/audioinvert.c: (gst_audio_invert_base_init), (gst_audio_invert_class_init), (gst_audio_invert_init), (gst_audio_invert_set_property), (gst_audio_invert_get_property), (gst_audio_invert_set_caps), (gst_audio_invert_transform_int), (gst_audio_invert_transform_float), (gst_audio_invert_transform_ip): * gst/audiofx/audioinvert.h: Add new audiofx element "audioinvert". This element swaps the upper and lower half of samples and can be used for example for a wide-stereo effect. Fixes #396057 * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-audiofx.xml: Add docs for the audioinvert element and add them to the build system. * tests/check/Makefile.am: * tests/check/elements/audioinvert.c: (setup_invert), (cleanup_invert), (GST_START_TEST), (invert_suite), (main): Add unit test suite for the audioinvert element. 2007-01-23 17:36:32 +0000 Wim Taymans gst/rtp/gstrtpmp4gdepay.c: Parse config params as string and int. Original commit message from CVS: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_parse_int), (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process): Parse config params as string and int. Parse and use AU header length 2007-01-23 17:27:39 +0000 Wim Taymans gst/smpte/: constify some static structs. Original commit message from CVS: * gst/smpte/barboxwipes.c: (gst_wipe_boxes_draw), (gst_wipe_triangles_clock_draw), (gst_wipe_triangles_draw): * gst/smpte/gstmask.c: (_gst_mask_register): * gst/smpte/gstmask.h: * gst/smpte/gstsmpte.c: (gst_smpte_update_mask): * gst/smpte/paint.c: (gst_smpte_paint_hbox), (draw_bresenham_line), (gst_smpte_paint_triangle_clock): constify some static structs. Don't update the mask if nothing changed to the params. Make sure we never draw outside of the picture. Fixes #398325. 2007-01-22 13:06:43 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Error out properly when pull_range fails while we're reading the headers, instead of just paus... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header_pull): Error out properly when pull_range fails while we're reading the headers, instead of just pausing the task silently. Fixes #399338. 2007-01-19 13:06:07 +0000 Tim-Philipp Müller gst/smpte/gstsmpte.c: Some more sanity checks to make sure the input formats match and the input pads are actually ne... Original commit message from CVS: * gst/smpte/gstsmpte.c: (gst_smpte_collected): Some more sanity checks to make sure the input formats match and the input pads are actually negotiated, in case someone tries to feed buffers from fakesrc or filesrc. Fixes #398299. Also const-ify an array, just because we can. 2007-01-19 10:35:13 +0000 Edward Hervey gst/smpte/gstsmpte.c: Ignore previous commit, that was only valid for widths and heights that are multiples of 4. Original commit message from CVS: * gst/smpte/gstsmpte.c: (fill_i420), (gst_smpte_collected): Ignore previous commit, that was only valid for widths and heights that are multiples of 4. Copy over size/stride macros from jpegdec. This allows the element to work with any width,height... ... but puts in evidence that the actual transformations only work with width/height that are multiples of 4. 2007-01-19 09:48:47 +0000 Edward Hervey gst/smpte/gstsmpte.c: Allocate buffers of the right size. Original commit message from CVS: * gst/smpte/gstsmpte.c: (gst_smpte_collected): Allocate buffers of the right size. The proper size of a I420 buffer in bytes is: width * height * 3 ------------------ 2 2007-01-18 18:37:39 +0000 Tim-Philipp Müller gst/smpte/gstsmpte.c: Proxy getcaps on sink pads too, so that we either end up with the same dimensions on all pads o... Original commit message from CVS: * gst/smpte/gstsmpte.c: (gst_smpte_init): Proxy getcaps on sink pads too, so that we either end up with the same dimensions on all pads or error out if that's not possible (seems to work even!). Fixes #398086, I think. 2007-01-18 11:29:17 +0000 Tim-Philipp Müller docs/plugins/: Remove ladspa from docs; add hierarchy info for GstAudioPanorama; fix integer properties with -1 as mi... Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: Remove ladspa from docs; add hierarchy info for GstAudioPanorama; fix integer properties with -1 as minimum value. * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Update to CVS. 2007-01-18 11:23:36 +0000 Stefan Kost gst/audiofx/audiopanorama.c: Fix doc section name (Fixes #397946) Original commit message from CVS: * gst/audiofx/audiopanorama.c: Fix doc section name (Fixes #397946) 2007-01-18 10:33:50 +0000 Tim-Philipp Müller * ChangeLog: Remove bogus ChangeLog entry Original commit message from CVS: Remove bogus ChangeLog entry 2007-01-17 14:30:50 +0000 Stefan Kost sys/v4l2/: Fix EIO handing when capturing. Add new property to specify the number of buffers to enque (and remove the... Original commit message from CVS: * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_set_property_helper), (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults): * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), (gst_v4l2src_init), (gst_v4l2src_set_property), (gst_v4l2src_get_property), (gst_v4l2src_set_caps): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_grab_frame), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_deinit): Fix EIO handing when capturing. Add new property to specify the number of buffers to enque (and remove the borked num-buffers usage). 2007-01-16 08:29:11 +0000 Sebastian Dröge gst/audiofx/audiopanorama.c: Use a function array for process methods, add more docs and define the startindex of enums. Original commit message from CVS: Patch by: Sebastian Dröge * gst/audiofx/audiopanorama.c: (gst_audio_panorama_class_init), (gst_audio_panorama_set_process_function): Use a function array for process methods, add more docs and define the startindex of enums. 2007-01-14 17:55:33 +0000 Mark Nauwelaerts Add support for more than one audio stream; write better AVIX header; refactor code a bit; don't announce vorbis caps... Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/avi/gstavimux.c: (gst_avi_mux_finalize), (gst_avi_mux_pad_reset), (gst_avi_mux_reset), (gst_avi_mux_init), (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_audsink_set_caps), (gst_avi_mux_request_new_pad), (gst_avi_mux_release_pad), (gst_avi_mux_riff_get_avi_header), (gst_avi_mux_riff_get_avix_header), (gst_avi_mux_riff_get_header), (gst_avi_mux_write_avix_index), (gst_avi_mux_add_index), (gst_avi_mux_bigfile), (gst_avi_mux_start_file), (gst_avi_mux_stop_file), (gst_avi_mux_handle_event), (gst_avi_mux_do_buffer), (gst_avi_mux_do_one_buffer), (gst_avi_mux_change_state): * gst/avi/gstavimux.h: * tests/check/elements/avimux.c: (teardown_src_pad): Add support for more than one audio stream; write better AVIX header; refactor code a bit; don't announce vorbis caps on our audio sink pads since we don't support it anyway. Closes #379298. 2007-01-13 19:12:32 +0000 Andy Wingo gst/interleave/deinterleave.c (gst_deinterleave_add_new_pads): Use fixed caps on src pads. Original commit message from CVS: 2007-01-13 Andy Wingo * gst/interleave/deinterleave.c (gst_deinterleave_add_new_pads): Use fixed caps on src pads. (gst_deinterleave_remove_pads): Remove src pads, not sink pads. I seem to have reverse midas disease! (gst_deinterleave_process): Proxy timestamps, offsets, durations, and set caps on outgoing buffers. Fixes #395597, I think. 2007-01-13 18:01:41 +0000 Andy Wingo gst/interleave/interleave.c (gst_interleave_init): Init the activation mode properly. Original commit message from CVS: 2007-01-13 Andy Wingo * gst/interleave/interleave.c (gst_interleave_init): Init the activation mode properly. (gst_interleave_src_setcaps, gst_interleave_src_getcaps) (gst_interleave_init): Set a setcaps and getcaps function on the src pad, so that we can implement pull-mode negotiation. (gst_interleave_sink_setcaps): Renamed from gst_interleave_setcaps, as it only does the sink logic now. Implement both for pull-mode and push-mode. (gst_interleave_process): Set caps on our outgoing buffer. (gst_interleave_src_activate_pull): Fix some more bogus casts. What is up with this. 2007-01-13 15:52:18 +0000 Sebastian Dröge gst/audiofx/audiopanorama.*: Add 'method' property and provide a simple (non-psychoacustic) processing method (#394859). Original commit message from CVS: Patch by: Sebastian Dröge * gst/audiofx/audiopanorama.c: (gst_audio_panorama_method_get_type), (gst_audio_panorama_class_init), (gst_audio_panorama_init), (gst_audio_panorama_set_process_function), (gst_audio_panorama_set_property), (gst_audio_panorama_get_property), (gst_audio_panorama_set_caps), (gst_audio_panorama_transform_m2s_int_simple), (gst_audio_panorama_transform_s2s_int_simple), (gst_audio_panorama_transform_m2s_float_simple), (gst_audio_panorama_transform_s2s_float_simple): * gst/audiofx/audiopanorama.h: Add 'method' property and provide a simple (non-psychoacustic) processing method (#394859). * tests/check/elements/audiopanorama.c: (GST_START_TEST), (panorama_suite): Tests for new method. 2007-01-12 18:28:13 +0000 Christian Schaller * gst-plugins-good.spec.in: comment out LADSPA plugin for now Original commit message from CVS: comment out LADSPA plugin for now 2007-01-12 17:16:51 +0000 Wim Taymans gst/qtdemux/: Add X-QT depayloader that will eventually share code with the demuxer. Original commit message from CVS: * gst/qtdemux/Makefile.am: * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_base_init), (gst_rtp_xqt_depay_class_init), (gst_rtp_xqt_depay_init), (gst_rtp_xqt_depay_finalize), (gst_rtp_quicktime_parse_sd), (gst_rtp_xqt_depay_setcaps), (gst_rtp_xqt_depay_process), (gst_rtp_xqt_depay_set_property), (gst_rtp_xqt_depay_get_property), (gst_rtp_xqt_depay_change_state), (gst_rtp_xqt_depay_plugin_init): * gst/qtdemux/gstrtpxqtdepay.h: * gst/qtdemux/qtdemux.c: (gst_qtdemux_base_init), (gst_qtdemux_loop_state_header), (gst_qtdemux_loop), (qtdemux_parse_moov), (qtdemux_parse_container), (qtdemux_parse_node), (gst_qtdemux_add_stream), (qtdemux_parse_trak), (qtdemux_audio_caps): * gst/qtdemux/qtdemux.h: * gst/qtdemux/quicktime.c: (plugin_init): Add X-QT depayloader that will eventually share code with the demuxer. Make new plugin entry point with quicktime releated stuff. 2007-01-12 12:10:19 +0000 Tim-Philipp Müller gst/qtdemux/Makefile.am: Dist all new files. Original commit message from CVS: * gst/qtdemux/Makefile.am: Dist all new files. 2007-01-12 10:27:25 +0000 Wim Taymans docs/plugins/: Activate docs for jack, sdl and qtdemux. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-qtdemux.xml: Activate docs for jack, sdl and qtdemux. 2007-01-12 10:22:16 +0000 Wim Taymans gst/qtdemux/: Cleanup and refactor to make the code more readable. Original commit message from CVS: * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: (extract_initial_length_and_fourcc), (gst_qtdemux_loop_state_header), (gst_qtdemux_combine_flows), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), (gst_qtdemux_chain), (qtdemux_sink_activate_pull), (qtdemux_inflate), (qtdemux_parse_moov), (qtdemux_parse_container), (qtdemux_parse_node), (qtdemux_tree_get_child_by_type), (qtdemux_tree_get_sibling_by_type), (gst_qtdemux_add_stream), (qtdemux_parse_samples), (qtdemux_parse_segments), (qtdemux_parse_trak), (qtdemux_tag_add_str), (qtdemux_tag_add_num), (qtdemux_tag_add_date), (qtdemux_tag_add_gnre), (qtdemux_parse_udta), (qtdemux_redirects_sort_func), (qtdemux_process_redirects), (qtdemux_parse_redirects), (qtdemux_parse_tree), (gst_qtdemux_handle_esds), (qtdemux_video_caps), (qtdemux_audio_caps): * gst/qtdemux/qtdemux.h: * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), (qtdemux_dump_unknown), (qtdemux_node_dump_foreach), (qtdemux_node_dump): * gst/qtdemux/qtdemux_dump.h: * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: (qtdemux_type_get): * gst/qtdemux/qtdemux_types.h: * gst/qtdemux/qtpalette.h: Cleanup and refactor to make the code more readable. Move debugging/tables into separate files. Add 2/4/16 color palletee support. Fix raw 15 bit RGB handling. Use more FOURCC constants. Add some docs. 2007-01-11 19:51:04 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.c: Minor clean-up: use enum values instead of hardcoded constants (#395536). Original commit message from CVS: Patch by: Sebastian Dröge * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), (gst_wavpack_enc_correction_mode_get_type), (gst_wavpack_enc_joint_stereo_mode_get_type): Minor clean-up: use enum values instead of hardcoded constants (#395536). 2007-01-11 16:59:40 +0000 Tim-Philipp Müller gst/: Set correct caps on outgoing pulled buffers, or things blow up after recent core changes. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_read_range): * gst/id3demux/gstid3demux.c: (gst_id3demux_read_range): Set correct caps on outgoing pulled buffers, or things blow up after recent core changes. 2007-01-11 11:05:04 +0000 Jonas Holmberg gst/multipart/multipartmux.c: Return FLOW errors ASAP. Fixes #394977. Original commit message from CVS: Based on patch by: Jonas Holmberg * gst/multipart/multipartmux.c: (gst_multipart_mux_init), (gst_multipart_mux_request_new_pad), (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected), (gst_multipart_mux_change_state): Return FLOW errors ASAP. Fixes #394977. Misc cleanups. 2007-01-11 09:30:59 +0000 Lutz Mueller gst/rtsp/gstrtspsrc.c: Check for stream pad before activating. Original commit message from CVS: Patch by: Lutz Mueller * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_activate_streams): Check for stream pad before activating. 2007-01-10 15:19:48 +0000 Peter Kjellerstedt gst/rtsp/: Allow url to be NULL to be able to use it for server connections. Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/rtsp/COPYING.MIT: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), (gst_rtspsrc_stream_free), (gst_rtspsrc_cleanup), (gst_rtspsrc_alloc_udp_ports), (pad_unblocked), (pad_blocked), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_create_transports_string), (gst_rtspsrc_prepare_transports), (gst_rtspsrc_setup_streams), (gst_rtspsrc_open), (gst_rtspsrc_close): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_connect), (rtsp_connection_send), (read_line), (parse_request_line), (parse_line), (rtsp_connection_read), (rtsp_connection_close): * gst/rtsp/rtspdefs.c: (rtsp_init_status), (rtsp_strresult), (rtsp_method_as_text), (rtsp_header_as_text), (rtsp_status_as_text), (rtsp_find_header_field), (rtsp_find_method): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_after_send), (rtsp_ext_wms_configure_stream): * gst/rtsp/rtspmessage.c: (rtsp_message_new), (rtsp_message_init), (rtsp_message_new_request), (rtsp_message_init_request), (rtsp_message_new_response), (rtsp_message_init_response), (rtsp_message_init_data), (rtsp_message_unset), (rtsp_message_free), (rtsp_message_add_header), (rtsp_message_get_header), (rtsp_message_set_body), (rtsp_message_get_body), (dump_mem), (rtsp_message_dump): * gst/rtsp/rtspmessage.h: * gst/rtsp/sdpmessage.c: (sdp_message_get_attribute_val_n), (sdp_media_get_attribute_val_n), (read_string), (read_string_del), (sdp_parse_line), (sdp_message_parse_buffer), (print_media), (sdp_message_dump): Allow url to be NULL to be able to use it for server connections. Can now send responses as well as requests. No longer hangs in an endless loop if EOF is received. Can now convert a status code to a text string. Return RTSP_HDR_INVALID for unknown headers. Return RTSP_INVALID for unknown methods. Copy CSeq and Session headers from the request. Only free memory corresponding to the currently set message type. Added const to function arguments as appropriate. Avoid a compiler warning when initializing nmedia. Use guint rather than gint to avoid compiler warnings. Fix crasher in wms extension. Factor out stream setup from open_connection. Delay activation of streams when actual data is received from the server, this prepares us to do proper protocol switching. Added new license. Fixes #380895. 2007-01-10 09:47:43 +0000 Sebastian Dröge Some small docs fixes (#394851). Original commit message from CVS: Patch by: Sebastian Dröge * docs/plugins/Makefile.am: * gst/audiofx/audiopanorama.c: Some small docs fixes (#394851). 2007-01-09 12:25:26 +0000 Wim Taymans gst/avi/gstavidemux.c: Fix docs. Original commit message from CVS: * gst/avi/gstavidemux.c: Fix docs. 2007-01-09 12:23:48 +0000 Wim Taymans gst/rtp/: Added RFC 2250 MPEG Video Depayloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_base_init), (gst_rtp_mpv_depay_class_init), (gst_rtp_mpv_depay_init), (gst_rtp_mpv_depay_setcaps), (gst_rtp_mpv_depay_process), (gst_rtp_mpv_depay_set_property), (gst_rtp_mpv_depay_get_property), (gst_rtp_mpv_depay_change_state), (gst_rtp_mpv_depay_plugin_init): * gst/rtp/gstrtpmpvdepay.h: Added RFC 2250 MPEG Video Depayloader. * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), (gst_rtp_h263p_depay_process): Fix Header file. Small cleanups. * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init), (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_finalize), (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_change_state): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init), (gst_rtp_mp4v_depay_init), (gst_rtp_mp4v_depay_finalize), (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process), (gst_rtp_mp4v_depay_change_state): Remove usused code. Remove Adapter from state Change. Added debug. * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_base_init), (gst_rtp_mpa_depay_class_init), (gst_rtp_mpa_depay_init), (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): * gst/rtp/gstrtpmpadepay.h: Subclass base depayloader. Added debug. Support static payload type assignment as well. * gst/rtp/gstrtpmpapay.c: Fix caps. 2007-01-08 12:45:10 +0000 Vincent Torri ext/jpeg/: These libjpeg callbacks should return a 'boolean' (unsigned char apparently) and not a 'gboolean' (which m... Original commit message from CVS: Patch by: Vincent Torri * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/smokecodec.c: These libjpeg callbacks should return a 'boolean' (unsigned char apparently) and not a 'gboolean' (which maps to gint). Fixes warnings when compiling with MingW (#393427). * gst/rtsp/rtspconnection.c: (rtsp_connection_read): Use ioctlsocket on win32. * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Some printf format fixes for win32. 2007-01-07 22:03:54 +0000 Andy Wingo New elements interleave and deinterleave, implement channel interleaving and deinterleaving. Original commit message from CVS: 2007-01-07 Andy Wingo * configure.ac: * gst/interleave/Makefile.am: * gst/interleave/plugin.h: * gst/interleave/plugin.c: * gst/interleave/interleave.c: * gst/interleave/deinterleave.c: New elements interleave and deinterleave, implement channel interleaving and deinterleaving. The interleaver can operate in pull or push mode but the deinterleaver is more like a demuxer and can only operate in push mode. 2007-01-07 10:44:12 +0000 Sébastien Moutte gst/cutter/gstcutter.c: Use gst_guint64_to_gdouble for conversion. Original commit message from CVS: * gst/cutter/gstcutter.c: (gst_cutter_chain): Use gst_guint64_to_gdouble for conversion. * win32/vs6/libgstmatroska.dsp: Add zlib to the link. * win32/vs6/libgstvideobox.dsp: Update liboil library name (project is linked to liboil-0.3-0.lib now). 2007-01-05 18:32:03 +0000 Tim-Philipp Müller Check for zlib and if available pass it explicitly to the linker when linking qtdemux. If not available (or --disable... Original commit message from CVS: * configure.ac: * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: (qtdemux_parse_moov): Check for zlib and if available pass it explicitly to the linker when linking qtdemux. If not available (or --disable-external has been specified!), disable the bits in qtdemux that use it. Fixes build on MingW (#392856). 2007-01-05 17:23:04 +0000 Tim-Philipp Müller gst/matroska/Makefile.am: If zlib is available and used, we must link it explicitly for things to work on MingW (fixe... Original commit message from CVS: * gst/matroska/Makefile.am: If zlib is available and used, we must link it explicitly for things to work on MingW (fixes #392855). 2007-01-05 16:07:12 +0000 Tim-Philipp Müller tests/icles/videocrop-test.c: Call g_thread_init() right at the beginning. Remove superfluous gst_init() - we've alre... Original commit message from CVS: * tests/icles/videocrop-test.c: (main): Call g_thread_init() right at the beginning. Remove superfluous gst_init() - we've already been inited via the GOption stuff. 2007-01-04 11:02:29 +0000 Tim-Philipp Müller ext/esd/esdsink.c: Don't return bogus values when esd_get_delay() fails for some reason (#392189). Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_delay): Don't return bogus values when esd_get_delay() fails for some reason (#392189). 2007-01-04 09:44:57 +0000 Vincent Torri Add directsoundsink to build and dist it, so it gets built when compiling with MingW on win32 and the required header... Original commit message from CVS: Patch by: Vincent Torri * configure.ac: * sys/Makefile.am: * sys/directsound/Makefile.am: * sys/directsound/gstdirectsoundsink.c: (gst_directsoundsink_reset): Add directsoundsink to build and dist it, so it gets built when compiling with MingW on win32 and the required headers and libraries are available (fixes: #392638). Also simplify DirectDraw check a bit. * tests/check/elements/.cvsignore: Fix CVS ignore for neonhttpsrc test binary. 2007-01-03 19:54:33 +0000 Vincent Torri Add directdrawsink to build and dist it, so it gets built when compiling with MingW on win32 and the required headers... Original commit message from CVS: Patch by: Vincent Torri * configure.ac: * sys/Makefile.am: * sys/directdraw/Makefile.am: Add directdrawsink to build and dist it, so it gets built when compiling with MingW on win32 and the required headers and libraries are available (fixes: #392313). * sys/directdraw/gstdirectdrawsink.c: (gst_directdrawsink_center_rect), (gst_directdrawsink_show_frame), (gst_directdrawsink_setup_ddraw), (gst_directdrawsink_surface_create): Comment out some unused things and fix some printf format issues in order to avoid warnings when buildling with MingW (#392313). 2007-01-03 16:41:10 +0000 Jens Granseuer Fix build with gcc-2.x (declare variables at the beginning of a block etc.). Fixes #391971. Original commit message from CVS: Patch by: Jens Granseuer * ext/xvid/gstxvidenc.c: (gst_xvidenc_encode), (gst_xvidenc_get_property): * gst/filter/gstbpwsinc.c: (bpwsinc_transform_ip): * gst/filter/gstfilter.c: (plugin_init): * gst/filter/gstiir.c: (iir_transform_ip): * gst/filter/gstlpwsinc.c: (lpwsinc_transform_ip): * gst/modplug/gstmodplug.cc: * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_header_load), (gst_nuv_demux_stream_extend_header): Fix build with gcc-2.x (declare variables at the beginning of a block etc.). Fixes #391971. 2006-12-30 12:44:01 +0000 Tim-Philipp Müller tests/check/elements/videocrop.c: When we can't create an element needed for the test, print a message detailing whic... Original commit message from CVS: * tests/check/elements/videocrop.c: (GST_START_TEST), (videocrop_test_cropping_init_context): When we can't create an element needed for the test, print a message detailing which element it actually is that's missing (#390673). 2006-12-24 11:36:31 +0000 Tim-Philipp Müller sys/ximage/gstximagesrc.c: Fix presumably copy'n'pasto for 16bpp depth. Original commit message from CVS: * sys/ximage/gstximagesrc.c: (composite_pixel): Fix presumably copy'n'pasto for 16bpp depth. 2006-12-24 11:24:59 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: The "signed" field in audio caps is of boolean type, trying to use gst_structure_get_int... Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_setcaps): The "signed" field in audio caps is of boolean type, trying to use gst_structure_get_int() to extract it will fail. Fixing this makes matroskamux accept raw audio input (#387121) (use at your own risk though, due to the matroska spec being not entirely useful in this respect). Also fix up raw audio structures in template caps so that they represent what our setcaps function will actually accept, so that converters know what to convert to. Finally, don't fail if there isn't an "endianness" field in 8-bit PCM caps. 2006-12-22 10:15:24 +0000 Stefan Kost tests/check/elements/: reapply consistent pad (de)activation Original commit message from CVS: * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), (cleanup_mpeg2enc): * tests/check/elements/rganalysis.c: (cleanup_rganalysis): * tests/check/elements/wavpackdec.c: (setup_wavpackdec), (cleanup_wavpackdec): * tests/check/elements/wavpackenc.c: (setup_wavpackenc), (cleanup_wavpackenc): * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): reapply consistent pad (de)activation 2006-12-22 10:15:23 +0000 Stefan Kost tests/check/elements/: reapply consistent pad (de)activation Original commit message from CVS: * tests/check/elements/audiopanorama.c: (cleanup_panorama): * tests/check/elements/avimux.c: (setup_avimux), (cleanup_avimux): * tests/check/elements/cmmldec.c: (setup_cmmldec), (teardown_cmmldec): * tests/check/elements/cmmlenc.c: (setup_cmmlenc), (teardown_cmmlenc): * tests/check/elements/level.c: (setup_level), (cleanup_level): reapply consistent pad (de)activation 2006-12-21 17:03:39 +0000 Jan Schmidt configure.ac: Back to CVS Original commit message from CVS: * configure.ac: Back to CVS * gst-plugins-good.doap: Add 0.10.5 doap entry === release 0.10.4 === 2006-12-21 15:45:02 +0000 Jan Schmidt configure.ac: releasing 0.10.4, "Black Bugs" Original commit message from CVS: === release 0.10.4 === 2006-12-21 Jan Schmidt * configure.ac: releasing 0.10.4, "Black Bugs" === release 0.10.5 === 2006-12-21 15:40:55 +0000 Jan Schmidt configure.ac: releasing 0.10.5, "The Path of Thorns" Original commit message from CVS: === release 0.10.5 === 2006-12-21 Jan Schmidt * configure.ac: releasing 0.10.5, "The Path of Thorns" 2006-12-21 14:03:42 +0000 Stefan Kost tests/check/elements/mpeg2enc.c: (setup_mpeg2enc) Original commit message from CVS: * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc) (cleanup_mpeg2enc): * tests/check/elements/rganalysis.c: (cleanup_rganalysis): * tests/check/elements/wavpackdec.c: (setup_wavpackdec), (cleanup_wavpackdec): * tests/check/elements/wavpackenc.c: (setup_wavpackenc), (cleanup_wavpackenc): * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): revert my freeze breakage 2006-12-21 12:48:32 +0000 Stefan Kost tests/check/elements/: revert my freeze breakage Original commit message from CVS: * tests/check/elements/audiopanorama.c: (cleanup_panorama): * tests/check/elements/avimux.c: (setup_avimux), (cleanup_avimux): * tests/check/elements/cmmldec.c: (setup_cmmldec), (teardown_cmmldec): * tests/check/elements/cmmlenc.c: (setup_cmmlenc), (teardown_cmmlenc): * tests/check/elements/level.c: (setup_level), (cleanup_level): revert my freeze breakage 2006-12-21 08:20:10 +0000 Stefan Kost tests/check/elements/: consistent pad (de)activation Original commit message from CVS: * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), (cleanup_mpeg2enc): * tests/check/elements/rganalysis.c: (cleanup_rganalysis): * tests/check/elements/wavpackdec.c: (setup_wavpackdec), (cleanup_wavpackdec): * tests/check/elements/wavpackenc.c: (setup_wavpackenc), (cleanup_wavpackenc): * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): consistent pad (de)activation 2006-12-21 08:15:23 +0000 Stefan Kost tests/check/elements/: consistent pad (de)activation Original commit message from CVS: * tests/check/elements/audiopanorama.c: (cleanup_panorama): * tests/check/elements/avimux.c: (setup_avimux), (cleanup_avimux): * tests/check/elements/cmmldec.c: (setup_cmmldec), (teardown_cmmldec): * tests/check/elements/cmmlenc.c: (setup_cmmlenc), (teardown_cmmlenc): * tests/check/elements/level.c: (setup_level), (cleanup_level): consistent pad (de)activation 2006-12-18 17:11:49 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Don't post BUFFERING messages in streaming mode if the stream headers are behind the movie dat... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_post_progress), (gst_qtdemux_chain): Don't post BUFFERING messages in streaming mode if the stream headers are behind the movie data; instead, post "progress" element messages as a temporary solution. Apps might get confused and do silly things to the pipeline state if they see buffering messages from different sources and don't realize they come from different sources (#387160). 2006-12-18 16:46:17 +0000 Jan Schmidt Disable LADPSA, as it has moved to the -bad module for the duration. Original commit message from CVS: * configure.ac: * ext/Makefile.am: Disable LADPSA, as it has moved to the -bad module for the duration. 2006-12-18 15:51:54 +0000 Wim Taymans ext/ladspa/gstsignalprocessor.c: Reset flow_state back to _OK after a flush stop so that we exit our error state afte... Original commit message from CVS: * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setcaps), (gst_signal_processor_event): Reset flow_state back to _OK after a flush stop so that we exit our error state after the flush. Fixes #374213 2006-12-18 15:49:08 +0000 Jan Schmidt ChangeLog surgery on one of Stefan's commits from August: Original commit message from CVS: ChangeLog surgery on one of Stefan's commits from August: * ext/Makefile.am: Quietly (accidentally) enable LADSPA for building by default, despite the fact that it doesn't meet the plugin checklist. -- Added by Jan Schmidt 18 Dec 2006 2006-12-18 13:40:34 +0000 Jan Schmidt gst/qtdemux/qtdemux.c: Don't output g_warning for an unsupported format, just send a Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain), (gst_qtdemux_add_stream): Don't output g_warning for an unsupported format, just send a GST_ELEMENT_WARNING and don't add the pad. Fix the case where it doesn't check for a NULL pad in streaming mode. Fixes #387137 2006-12-18 12:27:32 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix crash dereferencing NULL pointer if there's no stco atom. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Fix crash dereferencing NULL pointer if there's no stco atom. Fixes #387122. 2006-12-18 10:02:56 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.h: Use local copy of md5.h, as it disappeared in recent wavpack installs. Original commit message from CVS: * ext/wavpack/gstwavpackenc.h: Use local copy of md5.h, as it disappeared in recent wavpack installs. Patch by: Sebastian Dröge Fixes: #387076 2006-12-17 19:42:05 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2006-12-17 06:11:39 +0000 David Schleef sys/osxvideo/osxvideosink.*: Decent effort at porting to 0.10. Needs cleanup on OS/X. Original commit message from CVS: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Decent effort at porting to 0.10. Needs cleanup on OS/X. 2006-12-17 05:07:07 +0000 Vijay Santhanam sys/osxvideo/: Preliminary patch for porting osxvideosink Original commit message from CVS: Patch by: Vijay Santhanam * sys/osxvideo/Makefile.am: * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: Preliminary patch for porting osxvideosink 2006-12-16 16:21:26 +0000 Sjoerd Simons gst/videomixer/videomixer.c: Introduce some locking around the videomixer state so that it does not crash when adding... Original commit message from CVS: Patch by: Sjoerd Simons * gst/videomixer/videomixer.c: (gst_videomixer_pad_set_property), (gst_videomixer_set_master_geometry), (gst_videomixer_pad_sink_setcaps), (gst_videomixer_collect_free), (gst_videomixer_reset), (gst_videomixer_init), (gst_videomixer_finalize), (gst_videomixer_request_new_pad), (gst_videomixer_release_pad), (gst_videomixer_collected), (gst_videomixer_change_state): Introduce some locking around the videomixer state so that it does not crash when adding/removing pads. Fixes #383043. 2006-12-16 15:25:23 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: We don't support seeking in streaming mode, so don't even try. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_query_types), (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event): We don't support seeking in streaming mode, so don't even try. Implement seeking query so apps can query seekability properly (see #365414). Fix duration query. 2006-12-16 11:42:56 +0000 Tim-Philipp Müller configure.ac: Make sure libcaca can actually be used instead of just checking for /usr/bin/caca-config, so we don't w... Original commit message from CVS: * configure.ac: Make sure libcaca can actually be used instead of just checking for /usr/bin/caca-config, so we don't wrongly try to build cacasink when cross-compiling (fixes #384587). 2006-12-15 10:54:28 +0000 Thomas Vander Stichele adding doap file Original commit message from CVS: * Makefile.am: * gst-plugins-good.doap: * gst-plugins-good.spec.in: adding doap file 2006-12-14 16:20:15 +0000 Tim-Philipp Müller configure.ac: libflac-1.1.3 changed API again, but we can't build against it yet, so make sure our check doesn't use ... Original commit message from CVS: * configure.ac: libflac-1.1.3 changed API again, but we can't build against it yet, so make sure our check doesn't use libflac-1.1.3 and add a comment to this effect. 2006-12-14 14:25:17 +0000 Tim-Philipp Müller gst/effectv/gstquark.c: Add some NULL pointer checks (possibly related to #385623). Original commit message from CVS: * gst/effectv/gstquark.c: (gst_quarktv_transform), (gst_quarktv_planetable_clear): Add some NULL pointer checks (possibly related to #385623). 2006-12-13 17:12:22 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Add AMR-WB to the list of supported formats. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), (qtdemux_audio_caps): Add AMR-WB to the list of supported formats. 2006-12-12 18:45:58 +0000 Tim-Philipp Müller gst/: In streaming mode, if the first buffer we get doesn't have an offset, fix it up to be 0, otherwise trimming won... Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain_parse_tag), (gst_tag_demux_chain): * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): In streaming mode, if the first buffer we get doesn't have an offset, fix it up to be 0, otherwise trimming won't work later on and we'll be typefinding application/x-id3, which may result in decodebin plugging an endless number of id3demux elements as a consequence. Fixes #385031. 2006-12-11 21:21:16 +0000 Jan Schmidt sys/sunaudio/gstsunaudiosink.c: Ignore the buffer_time the sound device reports. Turns out it is sometimes completely... Original commit message from CVS: * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_prepare): Ignore the buffer_time the sound device reports. Turns out it is sometimes completely bogus and we're better off without it. 2006-12-11 17:33:26 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix non-working redirects from inetfilm.com (handle 'alis' reference data type as well). Fixes... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): Fix non-working redirects from inetfilm.com (handle 'alis' reference data type as well). Fixes #378613. 2006-12-11 13:59:33 +0000 Tim-Philipp Müller gst/matroska/: Try harder to extract the framerate for video tracks correctly and save it directly instead of convert... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_video_caps): * gst/matroska/matroska-ids.c: (gst_matroska_track_init_video_context): * gst/matroska/matroska-ids.h: Try harder to extract the framerate for video tracks correctly and save it directly instead of converting it back and forth a few times. Mostly makes a difference for very small framerates (<1). Fixes #380199. 2006-12-11 11:41:18 +0000 Tim-Philipp Müller ext/gconf/gstgconfaudiosrc.*: Remove gconf notify hook when the gconfaudiosrc element is destroyed, otherwise the cal... Original commit message from CVS: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose), (do_toggle_element): * ext/gconf/gstgconfaudiosrc.h: Remove gconf notify hook when the gconfaudiosrc element is destroyed, otherwise the callback may be called on an already-destroyed instance and bad things happen. Should fix #378184. Also ignore gconf key changes when the source is already running. 2006-12-09 19:27:28 +0000 Sebastian Dröge gst/apetag/gstapedemux.c: We need to be able to read and parse any possible floating point string format ("1,234" or ... Original commit message from CVS: Patch by: Sebastian Dröge * gst/apetag/gstapedemux.c: (ape_demux_parse_tags): We need to be able to read and parse any possible floating point string format ("1,234" or "1.234") irrespective of the current locale. g_strod() will parse the former only in certain locales though, so we really need to canonicalise the separator to '.' and then use g_ascii_strtod() to make sure we can parse either version at all times. Fixes #382982 for real. 2006-12-09 16:17:33 +0000 Jan Schmidt sys/sunaudio/: Use the sunaudio debug category. Original commit message from CVS: * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiosrc.c: Use the sunaudio debug category. * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_finalize), (gst_sunaudiosink_class_init), (gst_sunaudiosink_init), (gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property), (gst_sunaudiosink_open), (gst_sunaudiosink_close), (gst_sunaudiosink_prepare), (gst_sunaudio_sink_do_delay), (gst_sunaudiosink_write), (gst_sunaudiosink_delay), (gst_sunaudiosink_reset): * sys/sunaudio/gstsunaudiosink.h: Uses the sunaudio debug category for all debug output Implements the _delay() callback to synchronise video playback better Change the segtotal and segsize values back to the parent class defaults (taken from buffer_time and latency_times of 200ms and 10ms respectively) Measure the samples written to the device vs. played. Keep track of segments in the device by writing empty eof frames, and sleep using a GCond when we get too far ahead and risk overrunning the sink's ringbuffer. Fixes: #360673 2006-12-08 21:12:47 +0000 Jan Schmidt * ChangeLog: Correct the attribution of the previous commit. The patch in question was written by Brian Cameron. Original commit message from CVS: Correct the attribution of the previous commit. The patch in question was written by Brian Cameron. 2006-12-08 17:06:43 +0000 René Stadler gst/qtdemux/qtdemux.c: Fix caps for 24 bit raw PCM audio (2). Original commit message from CVS: Patch by: René Stadler * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), (qtdemux_audio_caps): Fix caps for 24 bit raw PCM audio (2). Fixes #383471. 2006-12-08 16:38:18 +0000 Sebastian Dröge gst/audiofx/audiopanorama.*: Fix audiopanorame with float samples. Fixes #383726. Original commit message from CVS: Patch by: Sebastian Dröge * gst/audiofx/audiopanorama.c: (gst_audio_panorama_init), (gst_audio_panorama_set_caps), (gst_audio_panorama_transform): * gst/audiofx/audiopanorama.h: Fix audiopanorame with float samples. Fixes #383726. 2006-12-08 15:12:01 +0000 Padraig O'Briain sys/sunaudio/: Implement reset functions to unblock the src/sink more quickly on state change requests. Original commit message from CVS: * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_reset): * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open), (gst_sunaudiosrc_reset): Implement reset functions to unblock the src/sink more quickly on state change requests. Patch by: Padraig O'Briain 2006-12-08 14:42:42 +0000 Jerry Tan sys/sunaudio/gstsunaudiomixer.c: Construct the correct mixer device name when the AUDIODEV env var is set. Original commit message from CVS: * sys/sunaudio/gstsunaudiomixer.c: (gst_sunaudiomixer_change_state): Construct the correct mixer device name when the AUDIODEV env var is set. Patch by: Jerry Tan Fixes: #383596 2006-12-08 14:32:51 +0000 Jerry Tan sys/sunaudio/gstsunaudiosrc.c: Apply patch to open the mixer control and set the MULTIPLE_OPEN ioctl. On solaris, the... Original commit message from CVS: * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open): Apply patch to open the mixer control and set the MULTIPLE_OPEN ioctl. On solaris, the mixer device doesn't need opening non-blocking - it can be opened by multiple processes by default, but needs the ioctl for multiple opens within 1 process. Patch by: Jerry Tan Fixes: #349015 2006-12-07 17:30:03 +0000 Wim Taymans gst/smpte/: Port to 0.10 some more. Original commit message from CVS: * gst/smpte/gstmask.h: * gst/smpte/gstsmpte.c: (gst_smpte_class_init), (gst_smpte_setcaps), (gst_smpte_init), (gst_smpte_reset), (gst_smpte_collected), (gst_smpte_set_property), (gst_smpte_get_property), (gst_smpte_change_state), (plugin_init): * gst/smpte/gstsmpte.h: Port to 0.10 some more. Added duration property to specify the duration of the transition. Make framerate a fraction. Deprecate fps property, we only use negotiated fps. Added docs. Fix collectpad usage. Reset state in READY. Send NEWSEGMENT event. Fix racy updates of object properties. Added debug category. Fixes #383323. 2006-12-07 11:35:41 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Handle more H263 variants. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), (qtdemux_video_caps): Handle more H263 variants. 2006-12-06 15:06:04 +0000 Sjoerd Simons gst/videomixer/videomixer.c: Don't reset xpos and ypos in the setcaps function because causes unexpected behaviour. Original commit message from CVS: Patch by: Sjoerd Simons * gst/videomixer/videomixer.c: (gst_videomixer_set_master_geometry), (gst_videomixer_pad_sink_setcaps), (gst_videomixer_collect_free): Don't reset xpos and ypos in the setcaps function because causes unexpected behaviour. Fixes #382179. 2006-12-06 14:45:30 +0000 Wim Taymans gst/multipart/multipartmux.c: Keep track of the buffer timestamp in the collectdata member instead of modifying the b... Original commit message from CVS: * gst/multipart/multipartmux.c: (gst_multipart_mux_compare_pads), (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected): Keep track of the buffer timestamp in the collectdata member instead of modifying the buffer without making the metadata writable first. Fixes #382277. 2006-12-06 14:33:54 +0000 Rob Taylor gst/udp/gstudpsrc.c: If using multicast in udpsrc, bind to the multicast address rather than Original commit message from CVS: Patch by: Rob Taylor * gst/udp/gstudpsrc.c: (gst_udpsrc_start): If using multicast in udpsrc, bind to the multicast address rather than IN_ADDR_ANY. This allows the simultanous use of multiple udpsrcs listening on different multicat addresses. Without this all udpsrcs will receive all packets from all subscribed multicast addresses. Fixes #383001. 2006-12-06 13:35:52 +0000 Jonathan Matthew ext/taglib/gstid3v2mux.cc: Don't attempt to write a NULL frame into the ID3 tag set when the createFrame method retur... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Don't attempt to write a NULL frame into the ID3 tag set when the createFrame method returned NULL. Fixes: #381857 Patch by: Jonathan Matthew 2006-12-06 13:16:59 +0000 Sebastian Dröge gst/apetag/gstapedemux.c: Use g_strtod() instead of sscanf to parse doubles, so that it will try parsing in the C loc... Original commit message from CVS: * gst/apetag/gstapedemux.c: (ape_demux_parse_tags): Use g_strtod() instead of sscanf to parse doubles, so that it will try parsing in the C locale if the current locale fails. Fixes: #382982 Patch by: Sebastian Dröge 2006-12-01 10:31:46 +0000 Sergey Scobich win32/MANIFEST: Fix compilation on win32 under VS8 Original commit message from CVS: * win32/MANIFEST: Fix compilation on win32 under VS8 Patch by: Sergey Scobich Partially fixes #381175 2006-11-30 16:48:51 +0000 Stefan Kost gst/avi/gstavimux.c: accept all mpegversions,fixes #380825 spotted by: Jerome Alet Original commit message from CVS: * gst/avi/gstavimux.c: accept all mpegversions,fixes #380825 spotted by: Jerome Alet 2006-11-30 16:46:13 +0000 Stefan Kost sys/v4l2/v4l2src_calls.c: cleanup the error message a bit more Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_buffer_finalize): cleanup the error message a bit more 2006-11-30 15:08:08 +0000 René Stadler gst/replaygain/gstrganalysis.c: Call the base class handler. Fixes #380610. Original commit message from CVS: Patch by: René Stadler * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_event): Call the base class handler. Fixes #380610. 2006-11-28 12:30:10 +0000 Wim Taymans ext/libcaca/gstcacasink.c: Fix width and height properties. Original commit message from CVS: * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init): Fix width and height properties. * ext/libcaca/gstcacasink.h: Fix compilation on newer libcaca that require us to include a new header. Fixes #379918. 2006-11-28 11:52:27 +0000 Wim Taymans gst/rtsp/: Add method so that extensions can choose to disable the setup of a stream. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspext.h: * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_configure_stream), (rtsp_ext_wms_get_context): Add method so that extensions can choose to disable the setup of a stream. Make the WMS extension skip setup of x-wms-rtx streams. Fixes #377792. 2006-11-27 17:16:26 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Remove some asserts and replace them with a proper error message. Fixes #379261. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_trak): Remove some asserts and replace them with a proper error message. Fixes #379261. 2006-11-27 16:30:49 +0000 Wim Taymans * ChangeLog: mention bug fix Original commit message from CVS: mention bug fix 2006-11-27 16:29:07 +0000 Jonas Holmberg gst/multipart/multipartmux.c: Push header in a separate buffer instead of memcpy:ing all data Original commit message from CVS: Patch by: Jonas Holmberg * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): Push header in a separate buffer instead of memcpy:ing all data Change LF => CRLF in headers Move trailing LF to header 2006-11-27 16:26:50 +0000 Wim Taymans gst/rtp/gstrtpmpadepay.c: Small buffer overflow fix and improve debugging. Original commit message from CVS: * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_chain): Small buffer overflow fix and improve debugging. 2006-11-24 08:58:53 +0000 Stefan Kost ext/esd/: remove obsolete _factory_init protos Original commit message from CVS: * ext/esd/esdmon.h: * ext/esd/esdsink.h: remove obsolete _factory_init protos 2006-11-24 07:46:54 +0000 Stefan Kost gst/avi/gstavidemux.c: remove dead code, tweak debugs statements, add comments, use _uint64_scale instead _uint64_sca... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_index_entry_for_time), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_peek_chunk), (gst_avi_demux_parse_subindex), (gst_avi_demux_read_subindexes_push), (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_next_data_buffer), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header_pull), (gst_avi_demux_do_seek), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): remove dead code, tweak debugs statements, add comments, use _uint64_scale instead _uint64_scale_int when using guint64 values, small optimizations, reflow some error handling 2006-11-22 17:39:13 +0000 Edward Hervey po/.cvsignore: We never put .pot files in cvs. Let's ignore them all. Original commit message from CVS: * po/.cvsignore: We never put .pot files in cvs. Let's ignore them all. 2006-11-21 12:57:50 +0000 Christian Schaller * gst-plugins-good.spec.in: enalbe LADSPA plugin in spec file Original commit message from CVS: enalbe LADSPA plugin in spec file 2006-11-19 18:46:03 +0000 Tim-Philipp Müller po/POTFILES.in: ... but better exclude files that aren't disted. Original commit message from CVS: * po/POTFILES.in: ... but better exclude files that aren't disted. 2006-11-19 16:32:49 +0000 Tim-Philipp Müller po/POTFILES.in: Add v4l2 source files to list of files with translations, so the strings are actually extracted (howe... Original commit message from CVS: * po/POTFILES.in: Add v4l2 source files to list of files with translations, so the strings are actually extracted (however bad they still may be). 2006-11-19 16:30:19 +0000 Tim-Philipp Müller gst/videobox/gstvideobox.c: Minor clean-ups: const-ify static array, remove trailing comma from use GST_DEBUG_FUNCPTR. Original commit message from CVS: * gst/videobox/gstvideobox.c: (gst_video_box_class_init): Minor clean-ups: const-ify static array, remove trailing comma from last enum (gcc-2.9x trips over that), use GST_DEBUG_FUNCPTR. 2006-11-19 13:41:53 +0000 René Stadler gst/id3demux/id3v2frames.c: Make sure that g_free always gets called on the same pointer that was returned by g_mallo... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): Make sure that g_free always gets called on the same pointer that was returned by g_malloc. Fixes #376594. Do not leak memory if decompressed size is wrong. Remove unneeded check of return value of g_malloc. Patch by: René Stadler 2006-11-18 18:14:34 +0000 Tim-Philipp Müller sys/v4l2/v4l2src_calls.c: Add missing curly brackets. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_deinit): Add missing curly brackets. 2006-11-17 14:54:01 +0000 Edgard Lima * ChangeLog: * sys/v4l2/v4l2src_calls.c: Fix capture_deinit. Original commit message from CVS: Fix capture_deinit. 2006-11-16 15:36:48 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: Use GST_DEBUG_FUNCPTR; activate request pad before returning it. Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), (gst_matroska_mux_request_new_pad): Use GST_DEBUG_FUNCPTR; activate request pad before returning it. * tests/check/elements/matroskamux.c: (setup_src_pad), (setup_sink_pad), (GST_START_TEST): Activate pads before using them. 2006-11-16 15:04:55 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Initialise variable to get rid of bogus compiler warning. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan): Initialise variable to get rid of bogus compiler warning. 2006-11-16 07:26:17 +0000 Ville Syrjala gst/rtp/: Specify H.263 variant and version in the caps (fixes #361637) Original commit message from CVS: Patch by: Ville Syrjala * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: Specify H.263 variant and version in the caps (fixes #361637) 2006-11-15 17:44:01 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Don't set a data pointer to NULL and a size > 0 when we deal with empty packets. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (read_body): Don't set a data pointer to NULL and a size > 0 when we deal with empty packets. * gst/rtsp/rtspmessage.c: (rtsp_message_new_response), (rtsp_message_init_response), (rtsp_message_init_data), (rtsp_message_unset), (rtsp_message_free), (rtsp_message_take_body): Check that we can't create invalid empty packets. 2006-11-15 12:35:46 +0000 Sebastian Dröge ext/wavpack/: Some small clean-ups: use enums instead of hard-coded numbers, const-ify element details, re-factor som... Original commit message from CVS: Patch by: Sebastian Dröge * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), (gst_wavpack_dec_init), (gst_wavpack_dec_change_state): * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), (gst_wavpack_enc_class_init), (gst_wavpack_enc_reset), (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_change_state): * ext/wavpack/gstwavpackparse.c: Some small clean-ups: use enums instead of hard-coded numbers, const-ify element details, re-factor some code into _reset() functions (#352605). 2006-11-15 12:08:20 +0000 Mark Nauwelaerts gst/matroska/matroska-mux.*: Add basic tag writing support; implement releasing pads (#374658). Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/matroska/matroska-mux.c: (gst_matroska_mux_add_interfaces), (gst_matroska_mux_class_init), (gst_matroska_pad_free), (gst_matroska_mux_reset), (gst_matroska_mux_handle_sink_event), (gst_matroska_mux_request_new_pad), (gst_matroska_mux_release_pad), (gst_matroska_mux_track_header), (gst_matroska_mux_start), (gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish): * gst/matroska/matroska-mux.h: Add basic tag writing support; implement releasing pads (#374658). 2006-11-15 11:19:13 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Handle opaque/unspecified A_AAC audio codec ID (fixes #374737). Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_audio_caps): Handle opaque/unspecified A_AAC audio codec ID (fixes #374737). 2006-11-15 00:12:19 +0000 David Schleef gst/matroska/matroska-mux.c: Add Dirac fourcc. Original commit message from CVS: * gst/matroska/matroska-mux.c: Add Dirac fourcc. 2006-11-14 20:07:22 +0000 Sergey Scobich win32/vs8/: Make end-of-line returns unixy, so that when the files are checked out on win32 the line returns will be ... Original commit message from CVS: Patch by: Sergey Scobich * win32/vs8/gst-plugins-good.sln: * win32/vs8/libgst1394.vcproj: * win32/vs8/libgstaasink.vcproj: * win32/vs8/libgstalaw.vcproj: * win32/vs8/libgstalpha.vcproj: * win32/vs8/libgstalphacolor.vcproj: * win32/vs8/libgstannodex.vcproj: * win32/vs8/libgstapetag.vcproj: * win32/vs8/libgstaudiofx.vcproj: * win32/vs8/libgstauparse.vcproj: * win32/vs8/libgstautodetect.vcproj: * win32/vs8/libgstavi.vcproj: * win32/vs8/libgstcacasink.vcproj: * win32/vs8/libgstcdio.vcproj: * win32/vs8/libgstcutter.vcproj: * win32/vs8/libgstdv.vcproj: * win32/vs8/libgsteffectv.vcproj: * win32/vs8/libgstflac.vcproj: * win32/vs8/libgstflxdec.vcproj: * win32/vs8/libgstgoom.vcproj: * win32/vs8/libgsticydemux.vcproj: * win32/vs8/libgstid3demux.vcproj: * win32/vs8/libgstjpeg.vcproj: * win32/vs8/libgstladspa.vcproj: * win32/vs8/libgstlevel.vcproj: * win32/vs8/libgstmatroska.vcproj: * win32/vs8/libgstmikmod.vcproj: * win32/vs8/libgstmng.vcproj: * win32/vs8/libgstmonoscope.vcproj: * win32/vs8/libgstmulaw.vcproj: * win32/vs8/libgstmultipart.vcproj: * win32/vs8/libgstpng.vcproj: * win32/vs8/libgstrtp.vcproj: * win32/vs8/libgstrtsp.vcproj: * win32/vs8/libgstshout2.vcproj: * win32/vs8/libgstsmpte.vcproj: * win32/vs8/libgstspeex.vcproj: * win32/vs8/libgsttaglib.vcproj: * win32/vs8/libgstudp.vcproj: * win32/vs8/libgstvideobalance.vcproj: * win32/vs8/libgstvideobox.vcproj: * win32/vs8/libgstvideoflip.vcproj: * win32/vs8/libgstvideomixer.vcproj: * win32/vs8/libgstwavenc.vcproj: * win32/vs8/libgstwavparse.vcproj: Make end-of-line returns unixy, so that when the files are checked out on win32 the line returns will be 0d 0a and not 0d 0d 0a. Hopefully fixes #366492. 2006-11-14 15:55:32 +0000 Wim Taymans gst/avi/gstavidemux.c: Disable init_frames delay timestamp adjustment, it does not seem to be needed at all. Fixes #3... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): Disable init_frames delay timestamp adjustment, it does not seem to be needed at all. Fixes #369621. 2006-11-14 11:43:40 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Don't parse extra sample params for raw pcm. Fixes #374914. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_trak): Don't parse extra sample params for raw pcm. Fixes #374914. 2006-11-13 18:31:18 +0000 Mark Nauwelaerts gst/videomixer/videomixer.c: Fix memleak by unref'ing collectpads instance (when finalizing) Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/videomixer/videomixer.c: (gst_videomixer_set_master_geometry), (gst_videomixer_pad_sink_setcaps), (gst_videomixer_class_init), (gst_videomixer_collect_free), (gst_videomixer_reset), (gst_videomixer_init), (gst_videomixer_finalize), (gst_videomixer_request_new_pad), (gst_videomixer_release_pad), (gst_videomixer_collected), (gst_videomixer_change_state): Fix memleak by unref'ing collectpads instance (when finalizing) Implement releasing a request pad. Fixes #374479. 2006-11-10 20:08:42 +0000 Sergey Scobich win32/vs8/: Add VS8 project files (note that many of the plugins in ext are disabled by default). Fixes #366492. Original commit message from CVS: Patch by: Sergey Scobich * win32/vs8/gst-plugins-good.sln: * win32/vs8/libgst1394.vcproj: * win32/vs8/libgstaasink.vcproj: * win32/vs8/libgstalaw.vcproj: * win32/vs8/libgstalpha.vcproj: * win32/vs8/libgstalphacolor.vcproj: * win32/vs8/libgstannodex.vcproj: * win32/vs8/libgstapetag.vcproj: * win32/vs8/libgstaudiofx.vcproj: * win32/vs8/libgstauparse.vcproj: * win32/vs8/libgstautodetect.vcproj: * win32/vs8/libgstavi.vcproj: * win32/vs8/libgstcacasink.vcproj: * win32/vs8/libgstcdio.vcproj: * win32/vs8/libgstcutter.vcproj: * win32/vs8/libgstdv.vcproj: * win32/vs8/libgsteffectv.vcproj: * win32/vs8/libgstflac.vcproj: * win32/vs8/libgstflxdec.vcproj: * win32/vs8/libgstgoom.vcproj: * win32/vs8/libgsticydemux.vcproj: * win32/vs8/libgstid3demux.vcproj: * win32/vs8/libgstjpeg.vcproj: * win32/vs8/libgstladspa.vcproj: * win32/vs8/libgstlevel.vcproj: * win32/vs8/libgstmatroska.vcproj: * win32/vs8/libgstmikmod.vcproj: * win32/vs8/libgstmng.vcproj: * win32/vs8/libgstmonoscope.vcproj: * win32/vs8/libgstmulaw.vcproj: * win32/vs8/libgstmultipart.vcproj: * win32/vs8/libgstpng.vcproj: * win32/vs8/libgstrtp.vcproj: * win32/vs8/libgstrtsp.vcproj: * win32/vs8/libgstshout2.vcproj: * win32/vs8/libgstsmpte.vcproj: * win32/vs8/libgstspeex.vcproj: * win32/vs8/libgsttaglib.vcproj: * win32/vs8/libgstudp.vcproj: * win32/vs8/libgstvideobalance.vcproj: * win32/vs8/libgstvideobox.vcproj: * win32/vs8/libgstvideoflip.vcproj: * win32/vs8/libgstvideomixer.vcproj: * win32/vs8/libgstwavenc.vcproj: * win32/vs8/libgstwavparse.vcproj: Add VS8 project files (note that many of the plugins in ext are disabled by default). Fixes #366492. 2006-11-10 19:18:33 +0000 David Schleef gst/multifile/Makefile.am: Let's not depend on a file that doesn't exist. Original commit message from CVS: * gst/multifile/Makefile.am: Let's not depend on a file that doesn't exist. 2006-11-10 18:51:10 +0000 David Schleef Revive multifile[src|sink]. Original commit message from CVS: * configure.ac: * gst/multifile/Makefile.am: * gst/multifile/gstmultifile.c: * gst/multifile/gstmultifilesink.c: * gst/multifile/gstmultifilesrc.c: * gst/multifile/multifile.vproj: Revive multifile[src|sink]. 2006-11-10 08:09:05 +0000 Stefan Kost sys/v4l2/v4l2src_calls.c: we do not translate debug messages Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_grab_frame): we do not translate debug messages 2006-11-08 12:04:03 +0000 Stefan Kost gst/flx/gstflxdec.c: fix categorisation, make short desc more explicit, remove unused code Original commit message from CVS: * gst/flx/gstflxdec.c: (gst_flxdec_class_init): fix categorisation, make short desc more explicit, remove unused code Fixes #372021 2006-11-08 01:30:39 +0000 Christian Schaller gst/rtp/: Fix element descriptions. Original commit message from CVS: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: Fix element descriptions. 2006-11-08 01:29:51 +0000 Christian Schaller gst/rtp/: Fix description. Original commit message from CVS: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_handle_buffer): Fix description. Small cleanup in the payloader. 2006-11-08 01:28:00 +0000 Christian Schaller gst/rtp/: Add theora pay/depayloaders. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_base_init), (gst_rtp_theora_depay_class_init), (gst_rtp_theora_depay_init), (gst_rtp_theora_depay_finalize), (gst_rtp_theora_depay_parse_configuration), (gst_rtp_theora_depay_setcaps), (gst_rtp_theora_depay_switch_codebook), (gst_rtp_theora_depay_process), (gst_rtp_theora_depay_set_property), (gst_rtp_theora_depay_get_property), (gst_rtp_theora_depay_change_state), (gst_rtp_theora_depay_plugin_init): * gst/rtp/gstrtptheoradepay.h: * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_base_init), (gst_rtp_theora_pay_class_init), (gst_rtp_theora_pay_init), (gst_rtp_theora_pay_setcaps), (gst_rtp_theora_pay_reset_packet), (gst_rtp_theora_pay_init_packet), (gst_rtp_theora_pay_flush_packet), (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id), (gst_rtp_theora_pay_handle_buffer), (gst_rtp_theora_pay_plugin_init): * gst/rtp/gstrtptheorapay.h: Add theora pay/depayloaders. 2006-11-07 01:43:06 +0000 Christian Schaller gst/rtp/Makefile.am: We depend on gsttag to generate the vorbis comments. Original commit message from CVS: * gst/rtp/Makefile.am: We depend on gsttag to generate the vorbis comments. * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_parse_configuration), (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_switch_codebook), (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbisdepay.h: Parse configuration string in the depayloader. Implement selecting and switching to a new codebook. Receiving vorbis over RTP now works. * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_reset_packet), (gst_rtp_vorbis_pay_init_packet), (gst_rtp_vorbis_pay_finish_headers), (gst_rtp_vorbis_pay_handle_buffer): * gst/rtp/gstrtpvorbispay.h: Set timestamps on outgoing buffers and RTP packets. Fix configuration string, prepend number of Packet headers. Fix encoding of ident string. Add delivery-method to caps. Streaming vorbis over RTP now works. 2006-11-06 20:52:10 +0000 Christian Schaller gst/rtp/gstrtpvorbispay.*: Generate a valid configuration string in the caps based on the vorbis headers. Original commit message from CVS: * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_finish_headers), (gst_rtp_vorbis_pay_parse_id), (gst_rtp_vorbis_pay_handle_buffer): * gst/rtp/gstrtpvorbispay.h: Generate a valid configuration string in the caps based on the vorbis headers. 2006-11-02 20:13:26 +0000 Sebastian Dröge Fix enum nicks; only emit no-more-pads once; add support for very fast encoding mode in upcoming 4.40.0 release (#369... Original commit message from CVS: Patch by: Sebastian Dröge * configure.ac: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), (gst_wavpack_enc_correction_mode_get_type), (gst_wavpack_enc_joint_stereo_mode_get_type), (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config): Fix enum nicks; only emit no-more-pads once; add support for very fast encoding mode in upcoming 4.40.0 release (#369539). 2006-11-02 14:43:11 +0000 Tim-Philipp Müller ext/cdio/: Move CD-TEXT utility function into common file so it can also be used by a future cdioparanoiasrc. Original commit message from CVS: * ext/cdio/gstcdio.c: (gst_cdio_get_cdtext): * ext/cdio/gstcdio.h: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_open): Move CD-TEXT utility function into common file so it can also be used by a future cdioparanoiasrc. 2006-11-01 19:48:26 +0000 Edgard Lima * ChangeLog: * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: Improved comments in ELEMENT_ERROR/WARNING and added "#if 0" to xoverlay code that is still not implemented. Original commit message from CVS: Improved comments in ELEMENT_ERROR/WARNING and added "#if 0" to xoverlay code that is still not implemented. 2006-11-01 13:59:49 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: We require a -base more recent than 0.10.9, so it's safe to use Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_picture_frame): We require a -base more recent than 0.10.9, so it's safe to use GST_TYPE_TAG_IMAGE_TYPE unconditionally now. * ext/dv/gstdvdec.c: (gst_dvdec_sink_event): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_sink_event): Use _newsegment_full() now that we depend on a recent enough core. * gst/wavparse/gstwavparse.c: Remove cruft that we don't need any longer now that we depend on a recent enough -base. 2006-11-01 10:19:18 +0000 Sergey Scobich sys/: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523) Original commit message from CVS: Patch by: Sergey Scobich * sys/directdraw/gstdirectdrawsink.c: (gst_directdrawsink_window_thread), (gst_directdrawsink_create_default_window): * sys/directdraw/gstdirectdrawsink.h: * sys/directsound/gstdirectsoundsink.c: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523) * win32/vs8/libgstdirectdraw.vcproj: * win32/vs8/libgstdirectsound.vcproj: Update project files. 2006-10-31 10:52:31 +0000 Wim Taymans gst/rtp/: Fix and activate ILBC pay and depayloaders. Fixes #368162. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_init), (gst_rtpilbcpay_setcaps): Fix and activate ILBC pay and depayloaders. Fixes #368162. 2006-10-31 10:31:18 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Handle unbounded length streams a bit better. Fixes #367696. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (gst_qtdemux_handle_src_query), (qtdemux_parse_tree), (qtdemux_parse_trak): Handle unbounded length streams a bit better. Fixes #367696. 2006-10-31 09:44:39 +0000 Wim Taymans ext/speex/gstspeexdec.c: Some small cleanups, use _scale. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_convert), (speex_dec_sink_event), (speex_dec_chain_parse_header): Some small cleanups, use _scale. 2006-10-31 09:29:36 +0000 Wim Taymans gst/avi/gstavidemux.c: Use higher precision scale function. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): Use higher precision scale function. 2006-10-30 16:18:18 +0000 Michal Benes gst/matroska/matroska-demux.c: Fix several issues with encoded/compressed/encrypted/signed tracks; also, remove super... Original commit message from CVS: Patch by: Michal Benes * gst/matroska/matroska-demux.c: (gst_matroska_demux_encoding_cmp), (gst_matroska_demux_read_track_encodings), (gst_matroska_decode_buffer): Fix several issues with encoded/compressed/encrypted/signed tracks; also, remove superfluous newline characters from some debug statements. (#366155) 2006-10-30 09:24:53 +0000 Wim Taymans ext/jpeg/: Various cleanups, capsnego and leak fixes. Original commit message from CVS: * ext/jpeg/gstjpegenc.c: (gst_jpegenc_getcaps): * ext/jpeg/gstsmokedec.c: (gst_smokedec_class_init), (gst_smokedec_init), (gst_smokedec_finalize), (gst_smokedec_chain), (gst_smokedec_change_state): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), (gst_smokeenc_init), (gst_smokeenc_finalize), (gst_smokeenc_getcaps), (gst_smokeenc_setcaps), (gst_smokeenc_resync), (gst_smokeenc_chain), (gst_smokeenc_set_property), (gst_smokeenc_get_property), (gst_smokeenc_change_state): Various cleanups, capsnego and leak fixes. 2006-10-30 08:17:08 +0000 Mark Nauwelaerts gst/videomixer/videomixer.c: Fix videomixer so that it can handle any combination of framerates. Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/videomixer/videomixer.c: (gst_videomixer_update_queues): Fix videomixer so that it can handle any combination of framerates. Fixes #367221. 2006-10-28 16:37:20 +0000 Wim Taymans gst/avi/gstavidemux.c: Fix position query for audio. also fixes timestamps in streaming mode and bug #364958. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init_push), (gst_avi_demux_parse_stream), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_data), (gst_avi_demux_chain): Fix position query for audio. also fixes timestamps in streaming mode and bug #364958. Small cleanups. 2006-10-27 17:10:42 +0000 Wim Taymans ext/libpng/gstpngenc.*: Fix strides. Fixes #364856. Original commit message from CVS: * ext/libpng/gstpngenc.c: (gst_pngenc_setcaps), (gst_pngenc_chain): * ext/libpng/gstpngenc.h: Fix strides. Fixes #364856. Cleanup capsnego. Set caps on outgoing buffers. 2006-10-18 17:06:21 +0000 Ville Syrjala gst/rtp/: Add static payload numbers in addition to the dynamic ones. Original commit message from CVS: Patch by: Ville Syrjala * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), (gst_rtp_pcma_pay_handle_buffer): * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush): Add static payload numbers in addition to the dynamic ones. Fixes #361639. 2006-10-18 16:18:55 +0000 Wim Taymans gst/rtsp/: Reuse already existing enum for lower transport. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), (gst_rtspsrc_uri_get_protocols), (gst_rtspsrc_uri_set_uri): * gst/rtsp/rtspconnection.c: (rtsp_connection_create): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspurl.c: (rtsp_url_parse): * gst/rtsp/rtspurl.h: Reuse already existing enum for lower transport. Add rtspt and rtspu protocols. Send redirect to rtspt when udp times out. 2006-10-18 14:00:44 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Fix seeking some more, mostly for speed changes. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_data): Fix seeking some more, mostly for speed changes. 2006-10-18 11:28:05 +0000 Tim-Philipp Müller * ChangeLog: ChangeLog surgery: fix Fredrik's e-mail address Original commit message from CVS: ChangeLog surgery: fix Fredrik's e-mail address 2006-10-18 11:04:09 +0000 Fredrik Persson sys/v4l2/gstv4l2tuner.*: Fix _set_channel(): remove useless g_object_notify() for "channel" property that doesn't exi... Original commit message from CVS: Patch by: Fredrik Persson * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: Fix _set_channel(): remove useless g_object_notify() for "channel" property that doesn't exist any longer and therefore now also useless redirect (#338818). 2006-10-17 15:16:47 +0000 Tim-Philipp Müller Activate pads before adding them to running element. Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_set_wp_config): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_create_src_pad): * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_create_pads): * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad): Activate pads before adding them to running element. 2006-10-17 14:57:17 +0000 Josep Torra Valles gst/qtdemux/qtdemux.c: Make compile with Forte compiler, mostly don't do pointer arithmetic with void pointers (#3626... Original commit message from CVS: Patch by: Josep Torra Valles * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), (next_entry_size), (qtdemux_inflate), (qtdemux_parse_moov), (qtdemux_parse_tree), (qtdemux_parse_trak), (qtdemux_tag_add_str), (qtdemux_tag_add_num), (qtdemux_tag_add_date), (qtdemux_tag_add_gnre): Make compile with Forte compiler, mostly don't do pointer arithmetic with void pointers (#362626). 2006-10-17 14:37:49 +0000 Wim Taymans sys/oss/gstosssink.c: Some drivers do not support unsetting the non-blocking flag once the device is opened. In those... Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_prepare): Some drivers do not support unsetting the non-blocking flag once the device is opened. In those cases, close/open the device in non-blocking mode. Fixes #362673. 2006-10-17 13:44:14 +0000 Stefan Kost sys/v4l2/: dear stefan, framespersecond is not frameperiod, reverting but adding comment Original commit message from CVS: * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_fps), (gst_v4l2src_get_fps): dear stefan, framespersecond is not frameperiod, reverting but adding comment 2006-10-17 11:28:50 +0000 Stefan Kost sys/v4l2/: Numerator is numerator and denominator is denominator. Say that aloud 5 times and retry after next beer. Original commit message from CVS: * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_fps), (gst_v4l2src_get_fps): Numerator is numerator and denominator is denominator. Say that aloud 5 times and retry after next beer. 2006-10-17 10:59:55 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.*: Avoid void pointer usage, better use guint8 * instead. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_moov), (qtdemux_parse), (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), (qtdemux_dump_unknown), (qtdemux_tree_get_child_by_type), (qtdemux_tree_get_sibling_by_type): * gst/qtdemux/qtdemux.h: Avoid void pointer usage, better use guint8 * instead. 2006-10-16 18:22:47 +0000 Josep Torra Valles Fix a bunch of problems discovered by the Forte compiler, mostly type mixups and pointer arithmetics with void pointe... Original commit message from CVS: Patch by: Josep Torra Valles * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_transform): * ext/esd/esdsink.c: (gst_esdsink_write): * ext/flac/gstflacdec.c: (gst_flac_dec_length), (gst_flac_dec_read_seekable), (gst_flac_dec_chain), (gst_flac_dec_send_newsegment): * ext/flac/gstflacenc.c: (gst_flac_enc_seek_callback), (gst_flac_enc_tell_callback): * ext/jpeg/smokecodec.c: (find_best_size), (smokecodec_encode), (smokecodec_parse_header), (smokecodec_decode): * gst/avi/gstavimux.c: (gst_avi_mux_write_avix_index): * gst/debug/efence.c: (gst_fenced_buffer_alloc): * gst/goom/Makefile.am: * gst/goom/gstgoom.c: * gst/icydemux/gsticydemux.c: (gst_icydemux_typefind_or_forward): * gst/rtsp/gstrtspsrc.c: * gst/rtsp/rtspconnection.c: (rtsp_connection_read): * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: * gst/wavparse/gstwavparse.c: (gst_wavparse_change_state): * sys/sunaudio/gstsunaudiomixertrack.h: Fix a bunch of problems discovered by the Forte compiler, mostly type mixups and pointer arithmetics with void pointers. Fixes #362603. 2006-10-12 19:02:51 +0000 Tim-Philipp Müller ext/speex/: Miscellaneous clean-ups, among other things: speexenc => enc to enhance code readability; change speexenc... Original commit message from CVS: * ext/speex/gstspeex.c: (plugin_init): * ext/speex/gstspeexenc.c: (gst_speex_enc_get_formats), (gst_speex_enc_setup_interfaces), (gst_speex_enc_base_init), (gst_speex_enc_class_init), (gst_speex_enc_finalize), (gst_speex_enc_sink_setcaps), (gst_speex_enc_convert_src), (gst_speex_enc_convert_sink), (gst_speex_enc_get_query_types), (gst_speex_enc_src_query), (gst_speex_enc_sink_query), (gst_speex_enc_init), (gst_speex_enc_create_metadata_buffer), (gst_speex_enc_set_last_msg), (gst_speex_enc_setup), (gst_speex_enc_buffer_from_data), (gst_speex_enc_push_buffer), (gst_speex_enc_set_header_on_caps), (gst_speex_enc_sinkevent), (gst_speex_enc_chain), (gst_speex_enc_get_property), (gst_speex_enc_set_property), (gst_speex_enc_change_state): * ext/speex/gstspeexenc.h: Miscellaneous clean-ups, among other things: speexenc => enc to enhance code readability; change speexenc => speex_enc; in chain function unref input buffer in case of error; take reference in event function; use boilerplate macro; use gst_pad_query_peer_* convenience functions. 2006-10-12 18:35:10 +0000 Tim-Philipp Müller ext/speex/gstspeexenc.c: Fix some mem leaks. Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speexenc_finalize), (gst_speexenc_set_last_msg), (gst_speexenc_setup), (gst_speexenc_set_header_on_caps): Fix some mem leaks. 2006-10-11 16:21:53 +0000 Wim Taymans gst/rtsp/URLS: Added some other URL. Original commit message from CVS: * gst/rtsp/URLS: Added some other URL. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp), (gst_rtspsrc_handle_request), (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Work on fallback to TCP connection when the UDP socket times out. Handler server requests, just reply with OK for now. * gst/rtsp/rtspdefs.c: (rtsp_strresult): * gst/rtsp/rtspdefs.h: Added some more Real extension headers. * gst/rtsp/rtspurl.c: (rtsp_url_parse): Fix parsing of urls with a ':' that is not part of the hostname:port part of the url. 2006-10-11 13:49:26 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Add some fourcc for DV format. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add some fourcc for DV format. 2006-10-11 13:24:42 +0000 Tim-Philipp Müller gst/: Activate pad before adding it to the already-running element. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_add_srcpad): * gst/icydemux/gsticydemux.c: (gst_icydemux_add_srcpad): * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad): Activate pad before adding it to the already-running element. * tests/check/elements/icydemux.c: (icydemux_found_pad): Activate newly-created pad too. 2006-10-11 08:34:14 +0000 Sebastien Cote gst/udp/gstudpsrc.c: Fix some leaks in caps and uris. Fixes #361252. Original commit message from CVS: Patch by: Sebastien Cote * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_finalize), (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start): Fix some leaks in caps and uris. Fixes #361252. 2006-10-10 18:54:05 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Printf format fixes. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (extract_initial_length_and_fourcc), (gst_qtdemux_loop_state_header): Printf format fixes. * sys/dvb/gstdvbsrc.c: Use "_stdint.h". 2006-10-10 09:57:19 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Reorganise some stuff. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_push_event), (gst_qtdemux_do_seek), (gst_qtdemux_change_state), (extract_initial_length_and_fourcc), (gst_qtdemux_loop_state_header), (gst_qtdemux_activate_segment), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), (gst_qtdemux_post_buffering), (gst_qtdemux_chain), (gst_qtdemux_add_stream), (qtdemux_process_redirects), (qtdemux_parse_tree), (qtdemux_parse_trak): Reorganise some stuff. Parse RTSP redirection URLS. 2006-10-10 08:29:07 +0000 Tim-Philipp Müller gst/wavparse/Makefile.am: Fix copy'n'paste-o (spotted by Mark Nauwelaerts, #341489). Original commit message from CVS: * gst/wavparse/Makefile.am: Fix copy'n'paste-o (spotted by Mark Nauwelaerts, #341489). 2006-10-09 07:01:19 +0000 Jan Schmidt sys/v4l2/gstv4l2xoverlay.*: Fix build as per the patch in #338818 comment 36. Original commit message from CVS: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/gstv4l2xoverlay.h: Fix build as per the patch in #338818 comment 36. 2006-10-08 20:05:13 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: inspect updates Original commit message from CVS: inspect updates 2006-10-07 21:15:40 +0000 Tim-Philipp Müller gst/rtsp/gstrtspsrc.c: Activate pads before adding them to the source. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport): Activate pads before adding them to the source. 2006-10-07 11:37:59 +0000 Tim-Philipp Müller docs/plugins/: Add/update docs stuff. Original commit message from CVS: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/inspect/plugin-dtsdec.xml: * docs/plugins/inspect/plugin-mms.xml: * docs/plugins/inspect/plugin-mpeg2enc.xml: * docs/plugins/inspect/plugin-neon.xml: * docs/plugins/inspect/plugin-replaygain.xml: * docs/plugins/inspect/plugin-soundtouch.xml: * docs/plugins/inspect/plugin-spcdec.xml: * docs/plugins/inspect/plugin-swfdec.xml: * docs/plugins/inspect/plugin-videocrop.xml: * docs/plugins/inspect/plugin-wavpack.xml: Add/update docs stuff. 2006-10-06 17:00:14 +0000 Wim Taymans Activate pads before adding. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_add_pads), (gst_dvdemux_chain): * gst/auparse/gstauparse.c: (gst_au_parse_add_srcpad): Activate pads before adding. 2006-10-06 16:03:23 +0000 Wim Taymans gst/multipart/multipartdemux.c: Activate pads before adding. Original commit message from CVS: * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), (gst_multipart_find_pad_by_mime): Activate pads before adding. * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): BOILERPLATE sets parent_class for us. 2006-10-06 15:56:01 +0000 René Stadler Add ReplayGain analysis element (#357069). Original commit message from CVS: Patch by: René Stadler * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * gst/replaygain/Makefile.am: * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_base_init), (gst_rg_analysis_class_init), (gst_rg_analysis_init), (gst_rg_analysis_set_property), (gst_rg_analysis_get_property), (gst_rg_analysis_start), (gst_rg_analysis_set_caps), (gst_rg_analysis_transform_ip), (gst_rg_analysis_event), (gst_rg_analysis_stop), (gst_rg_analysis_handle_tags), (gst_rg_analysis_handle_eos), (gst_rg_analysis_track_result), (gst_rg_analysis_album_result), (plugin_init): * gst/replaygain/gstrganalysis.h: * gst/replaygain/rganalysis.c: (yule_filter), (butter_filter), (apply_filters), (reset_filters), (accumulator_add), (accumulator_clear), (accumulator_result), (rg_analysis_new), (rg_analysis_set_sample_rate), (rg_analysis_destroy), (rg_analysis_analyze_mono_float), (rg_analysis_analyze_stereo_float), (rg_analysis_analyze_mono_int16), (rg_analysis_analyze_stereo_int16), (rg_analysis_analyze), (rg_analysis_track_result), (rg_analysis_album_result), (rg_analysis_reset_album), (rg_analysis_reset): * gst/replaygain/rganalysis.h: Add ReplayGain analysis element (#357069). * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/rganalysis.c: (get_expected_gain), (setup_rganalysis), (cleanup_rganalysis), (set_playing_state), (send_eos_event), (send_tag_event), (poll_eos), (poll_tags), (fail_unless_track_gain), (fail_unless_track_peak), (fail_unless_album_gain), (fail_unless_album_peak), (fail_if_track_tags), (fail_if_album_tags), (fail_unless_num_tracks), (test_buffer_const_float_mono), (test_buffer_const_float_stereo), (test_buffer_const_int16_mono), (test_buffer_const_int16_stereo), (test_buffer_square_float_mono), (test_buffer_square_float_stereo), (test_buffer_square_int16_mono), (test_buffer_square_int16_stereo), (push_buffer), (GST_START_TEST), (rganalysis_suite), (main): Unit tests for the new replaygain element. 2006-10-06 15:49:39 +0000 Wim Taymans ext/faad/gstfaad.c: Some cleanups. Original commit message from CVS: * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_chain), (gst_faad_close_decoder): Some cleanups. Added some more debugging. Don't ever ignore unlinked, we're not a demuxer. * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): Activate pad before adding it to the element. 2006-10-06 12:55:53 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Rework how the transport string is constructed, try to share channels and udp ports. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_alloc_udp_ports), (gst_rtspsrc_stream_configure_transport), (find_stream_by_channel), (gst_rtspsrc_push_event), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_create_transports_string), (gst_rtspsrc_configure_transports), (gst_rtspsrc_open), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Rework how the transport string is constructed, try to share channels and udp ports. Make most of the stuff less dependant on RTP as we are also going to use it for RDT. Add support for transport specific session managers. * gst/rtsp/rtspconnection.c: (rtsp_connection_flush): Implement _flush(). * gst/rtsp/rtspdefs.c: (rtsp_strresult): * gst/rtsp/rtspdefs.h: Add generic error return code. * gst/rtsp/rtspext.h: Add support for pluggable tranport strings. * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_before_send), (rtsp_ext_wms_after_send), (rtsp_ext_wms_parse_sdp), (rtsp_ext_wms_get_context): Detect WMServer and activate the extension. * gst/rtsp/rtsptransport.c: (rtsp_transport_get_mime), (rtsp_transport_get_manager), (rtsp_transport_parse): * gst/rtsp/rtsptransport.h: Added methods to get mime/manager for certain transports. 2006-10-06 11:31:11 +0000 Tim-Philipp Müller gst/spectrum/gstspectrum.c: Fix mem leak, avoid unnecessary memcpy. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): Fix mem leak, avoid unnecessary memcpy. 2006-10-06 02:29:35 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Removed cruft code that was just commented out. Removed some obsolete debug logs statements. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_init), (gst_spectrum_transform_ip): Removed cruft code that was just commented out. Removed some obsolete debug logs statements. 2006-10-05 18:14:46 +0000 Tim-Philipp Müller Another batch of printf format fixes. Original commit message from CVS: * ext/dts/gstdtsdec.c: (gst_dtsdec_chain): * ext/musicbrainz/gsttrm.c: (gst_trm_setcaps): * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_sink_set_caps): * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain), (qtdemux_parse), (qtdemux_parse_trak): * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): Another batch of printf format fixes. 2006-10-05 16:37:33 +0000 Tim-Philipp Müller Printf format fixes. Original commit message from CVS: * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_update_font_height): * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_transform_caps): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_parse_image_data): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): * ext/libpng/gstpngdec.c: (user_endrow_callback): * gst/auparse/gstauparse.c: (gst_au_parse_parse_header): * gst/avi/gstavidemux.c: (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), (gst_avi_demux_stream_data): * gst/cutter/gstcutter.c: (gst_cutter_chain): * gst/debug/efence.c: (gst_efence_buffer_alloc), (gst_fenced_buffer_copy): * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_handle_message): * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): * sys/ximage/ximageutil.c: (ximageutil_xcontext_get): Printf format fixes. 2006-10-04 22:37:07 +0000 Tim-Philipp Müller gst/videocrop/gstvideocrop.*: Handle packed YUV formats (UYVY, YUY2, YUYV) separately; also, fix passthrough mode; la... Original commit message from CVS: * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init), (gst_video_crop_init), (gst_video_crop_get_image_details_from_caps), (gst_video_crop_transform_packed_complex), (gst_video_crop_transform_packed_simple), (gst_video_crop_transform), (gst_video_crop_transform_caps), (gst_video_crop_set_caps), (gst_videocrop_clear_negotiated_caps_locked), (gst_video_crop_set_property): * gst/videocrop/gstvideocrop.h: Handle packed YUV formats (UYVY, YUY2, YUYV) separately; also, fix passthrough mode; lastly, clear negotiated basetransform caps when the cropping changes in order to force renegotiation. 2006-10-04 20:05:07 +0000 Tim-Philipp Müller tests/icles/: Visual test for videocrop, shows that packed yuv doesn't work right yet. --with-ffmpegcolorspace option... Original commit message from CVS: * tests/icles/.cvsignore: * tests/icles/Makefile.am: * tests/icles/videocrop-test.c: (quit_mainloop), (tick_cb), (test_with_caps), (video_crop_get_test_caps), (main): Visual test for videocrop, shows that packed yuv doesn't work right yet. --with-ffmpegcolorspace option doesn't work yet for unknown reasons (another basetransform issue?) 2006-10-04 17:53:12 +0000 Wim Taymans gst/rtsp/Makefile.am: Dist new .h file too. Original commit message from CVS: * gst/rtsp/Makefile.am: Dist new .h file too. 2006-10-04 17:24:40 +0000 Wim Taymans gst/rtsp/: Factor out extension in separate module. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtpdec.c: (gst_rtpdec_getcaps), (gst_rtpdec_chain_rtp), (gst_rtpdec_chain_rtcp): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_create_stream), (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_handle_message): * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspdefs.c: (rtsp_strresult): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspext.h: * gst/rtsp/rtspextwms.c: (rtsp_ext_wms_parse_sdp), (rtsp_ext_wms_get_context): * gst/rtsp/rtspextwms.h: * gst/rtsp/rtsptransport.c: (rtsp_transport_init), (parse_mode), (rtsp_transport_parse): * gst/rtsp/rtsptransport.h: Factor out extension in separate module. Fix getcaps to filter against the padtemplate. Use Content-Base if the server gives one. Rework the transport parsing a bit for future extensions. Added some Real Header field definitions. 2006-10-04 10:29:11 +0000 Thomas Vander Stichele docs/plugins/: added v4l2 stubs Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: added v4l2 stubs * gst-plugins-good.spec.in: add v4l2 2006-10-04 10:24:49 +0000 Tim-Philipp Müller gst/apetag/gstapedemux.c: Extract disc/album/medium number and count and try harder to extract track number/count. Original commit message from CVS: * gst/apetag/gstapedemux.c: (ape_demux_parse_tags): Extract disc/album/medium number and count and try harder to extract track number/count. 2006-10-03 18:36:29 +0000 Thomas Vander Stichele * tests/icles/.gitignore: moap ignore Original commit message from CVS: moap ignore 2006-10-03 18:35:34 +0000 Thomas Vander Stichele * tests/icles/Makefile.am: add icle for v4l2 Original commit message from CVS: add icle for v4l2 2006-10-03 18:15:58 +0000 Thomas Vander Stichele add build stuff for v4l2, needs --enable-experimental until the last bits are resolved Original commit message from CVS: * configure.ac: * sys/Makefile.am: add build stuff for v4l2, needs --enable-experimental until the last bits are resolved 2006-10-03 13:47:10 +0000 Thomas Vander Stichele * sys/v4l2/gstv4l2object.c: comment out the notifies for removed properties Original commit message from CVS: comment out the notifies for removed properties 2006-10-03 13:30:48 +0000 Thomas Vander Stichele sys/v4l2/gstv4l2object.c: comment out the properties that are already part of the tuner interface. Original commit message from CVS: * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_install_properties_helper): comment out the properties that are already part of the tuner interface. 2006-10-03 13:18:59 +0000 Zaheer Abbas Merali sys/v4l2/gstv4l2src.c: Improve docs. Original commit message from CVS: 2006-10-03 Zaheer Abbas Merali * sys/v4l2/gstv4l2src.c: Improve docs. 2006-10-02 16:14:06 +0000 Christian Schaller * gst-plugins-good.spec.in: stop removing gdkpixbuf plugin from package Original commit message from CVS: stop removing gdkpixbuf plugin from package 2006-09-29 15:39:41 +0000 Tim-Philipp Müller tests/check/Makefile.am: Disable autodetect test temporarily, so that the build bots update -bad and the ranks of unr... Original commit message from CVS: * tests/check/Makefile.am: Disable autodetect test temporarily, so that the build bots update -bad and the ranks of unreliable video sinks in there. * tests/check/elements/autodetect.c: (GST_START_TEST): Skip test if no usable videosink is found. 2006-09-29 15:37:29 +0000 Wim Taymans gst/rtsp/URLS: Add some more URLs. Original commit message from CVS: * gst/rtsp/URLS: Add some more URLs. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_loop_send_cmd), (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_handle_message), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Add timeout property to control UDP timeouts. Fix error messages. Also start a loop function when operating in UDP mode so that we can do some more stuff async. Handle element messages from udpsrc to detect timeouts. If a timeout happens we currently generate an error. API: rtspsrc::timeout property. * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_create): Really implement the timeout in microseconds and not milliseconds. 2006-09-29 11:09:40 +0000 Wim Taymans gst/udp/gstudpsrc.*: Added property to post a message on timeout. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_unlock), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: Added property to post a message on timeout. Updated docs. When restarting the select, initialize the fdsets again. Init control sockets so we don't accidentally close a random socket. API: GstUDPSrc::timeout property 2006-09-29 08:15:05 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Fix flag registration. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type): Fix flag registration. * gst/rtsp/rtspconnection.c: (rtsp_connection_read): Reading 0 also means 'no more commands' 2006-09-29 08:09:24 +0000 Antoine Tremblay gst/udp/gstudpsrc.c: Fix possible infinite loop when shutting down, a read can also return 0 to indicate no more mess... Original commit message from CVS: Patch by: Antoine Tremblay * gst/udp/gstudpsrc.c: (gst_udpsrc_create): Fix possible infinite loop when shutting down, a read can also return 0 to indicate no more messages are available. Fixes #358156. 2006-09-28 17:08:47 +0000 Wim Taymans sys/v4l2/: Framerate can be 0/1 too. Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_all_caps), (gst_v4l2src_get_caps): * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): Framerate can be 0/1 too. Init framerate to 0/1 before querying it so that we can detect devices that don't know about a framerate. Add some more debugging info. 2006-09-28 14:31:41 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Add support for 'yv12' fourcc. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add support for 'yv12' fourcc. 2006-09-27 17:47:57 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * tests/icles/v4l2src-test.c: Removed set-undef-fps. Original commit message from CVS: Removed set-undef-fps. 2006-09-27 17:04:22 +0000 Wim Taymans sys/v4l2/: Renamed some properties to match the tuner interface naming. Original commit message from CVS: * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_new), (gst_v4l2_object_set_property_helper), (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults): * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), (gst_v4l2src_create): * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_contains_channel), (gst_v4l2_tuner_list_channels), (gst_v4l2_tuner_set_channel_and_notify), (gst_v4l2_tuner_get_channel), (gst_v4l2_tuner_contains_norm), (gst_v4l2_tuner_list_norms), (gst_v4l2_tuner_set_norm_and_notify), (gst_v4l2_tuner_get_norm): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_empty_lists): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_get_fps): Renamed some properties to match the tuner interface naming. 2006-09-27 16:14:18 +0000 Wim Taymans Small cleanups. Original commit message from CVS: * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_set_property_helper), (gst_v4l2_set_defaults): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), (gst_v4l2src_create): * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_set_norm), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), (gst_v4l2_get_input), (gst_v4l2_set_input): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), (gst_v4l2src_buffer_new): * tests/icles/v4l2src-test.c: (my_bus_callback), (main): Small cleanups. Fix error messages. Use locks when getting timestamps. Fix leaks in test. Add licensing header to tests. 2006-09-27 15:14:07 +0000 Edgard Lima * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: * tests/icles/v4l2src-test.c: Some cleanups and comments. Original commit message from CVS: Some cleanups and comments. 2006-09-27 13:41:35 +0000 Christian Schaller * gst-plugins-good.spec.in: add audiofx plugin Original commit message from CVS: add audiofx plugin 2006-09-26 14:17:54 +0000 Wim Taymans docs/plugins/: Add v4l2 plugin to the docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: Add v4l2 plugin to the docs. * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), (gst_v4l2src_get_mmap), (gst_v4l2src_create): * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2vidorient.c: Fix docs. Remove some more externs. 2006-09-26 13:18:06 +0000 Wim Taymans sys/v4l2/Makefile.am: Fix makefile, list libs in stack order. Original commit message from CVS: * sys/v4l2/Makefile.am: Fix makefile, list libs in stack order. * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2object.c: (gst_v4l2_device_get_type), (gst_v4l2_object_install_properties_helper): * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), (gst_v4l2src_get_mmap), (gst_v4l2src_create): * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/gstv4l2vidorient.h: * sys/v4l2/gstv4l2xoverlay.h: * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.h: Fix coding style: - Remove extern from functions. - Fix header indentation. Fix Flags, add defaults for properties. Remove unused enums. Fix TOO_LAZY in error messages. 2006-09-26 11:06:17 +0000 Wim Taymans sys/v4l2/: Fix pass at code cleanups, move errors cases out of the normal flow for additional code clarity. Original commit message from CVS: * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices), (gst_v4l2_probe_needs_probe), (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_new), (gst_v4l2_object_destroy), (gst_v4l2_object_set_property_helper), (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults), (gst_v4l2_object_start), (gst_v4l2_object_stop): * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), (gst_v4l2src_init), (gst_v4l2src_dispose), (gst_v4l2src_set_property), (gst_v4l2src_get_property), (gst_v4l2src_fixate), (gst_v4l2src_get_caps), (gst_v4l2src_set_caps), (gst_v4l2src_get_read), (gst_v4l2src_get_mmap), (gst_v4l2src_create): * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_open), (gst_v4l2_close), (gst_v4l2_get_norm), (gst_v4l2_set_norm), (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), (gst_v4l2_get_input), (gst_v4l2_set_input): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), (gst_v4l2src_capture_deinit), (gst_v4l2src_get_size_limits), (gst_v4l2src_set_fps), (gst_v4l2src_get_fps), (gst_v4l2src_buffer_finalize), (gst_v4l2src_buffer_new): Fix pass at code cleanups, move errors cases out of the normal flow for additional code clarity. 2006-09-25 13:55:44 +0000 Wim Taymans gst/autodetect/: Small cleanups. don't try to set "sync" property when it is not available. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_base_init), (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_find_best): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_detect): Small cleanups. don't try to set "sync" property when it is not available. 2006-09-25 11:47:42 +0000 Peter Kjellerstedt gst/: Include stdlib.h in some more places, makes things compile with uClibc and -Werror (#357592). Original commit message from CVS: Patch by: Peter Kjellerstedt * gst/alpha/gstalpha.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtsp/gstrtspsrc.c: * gst/udp/gstudpsrc.c: * gst/videomixer/videomixer.c: Include stdlib.h in some more places, makes things compile with uClibc and -Werror (#357592). 2006-09-25 09:15:10 +0000 Tim-Philipp Müller ext/jpeg/gstjpegdec.c: our code should handle that fine. Some of the buttons on the apple trailer site are apparently... Original commit message from CVS: * ext/jpeg/gstjpegdec.c: Set minimum height to 8 (from 16), our code should handle that fine. Some of the buttons on the apple trailer site are apparently only 15 pixels high (see #357470). 2006-09-23 15:31:56 +0000 Wim Taymans gst/rtsp/: Improve error reporting. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_open): * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_connect), (rtsp_connection_read), (read_body), (rtsp_connection_receive): * gst/rtsp/rtspdefs.c: (rtsp_strresult): * gst/rtsp/rtspdefs.h: Improve error reporting. 2006-09-23 15:30:40 +0000 Wim Taymans gst/rtp/: Fix klass typos. Original commit message from CVS: * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_plugin_init): * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_plugin_init): * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_plugin_init): * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_plugin_init): * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_plugin_init): * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_plugin_init): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_plugin_init): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_plugin_init): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_plugin_init): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_plugin_init): * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_plugin_init): * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_plugin_init): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_plugin_init): * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_plugin_init): * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_plugin_init): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_plugin_init): Fix klass typos. Mark RANK_MARGINAL, decodebin can handle the depayloaders fine. 2006-09-22 17:53:48 +0000 Tim-Philipp Müller configure.ac: Need -base CVS for gst_base_rtp_depayload_push_ts(). Original commit message from CVS: * configure.ac: Need -base CVS for gst_base_rtp_depayload_push_ts(). 2006-09-22 17:22:34 +0000 Wim Taymans gst/avi/gstavidemux.c: Don't check for a tag that is never there and check if we read the correct tag. Fixes seeking ... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index): Don't check for a tag that is never there and check if we read the correct tag. Fixes seeking again. We must post an error when all pads are unlinked. 2006-09-22 15:15:13 +0000 Wim Taymans gst/rtp/: More fixage, set endoder-params correctly in the payloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_reset_packet), (gst_rtp_vorbis_pay_init_packet), (gst_rtp_vorbis_pay_flush_packet), (gst_rtp_vorbis_pay_parse_id), (gst_rtp_vorbis_pay_handle_buffer): More fixage, set endoder-params correctly in the payloader. 2006-09-22 12:12:10 +0000 Tim-Philipp Müller gst/autodetect/: Make static pad templates static to appease valgrind's leak detector. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_base_init): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_base_init): Make static pad templates static to appease valgrind's leak detector. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/autodetect.c: (GST_START_TEST), (autodetect_suite): Add simple test for the ghostpad lockup on shutdown fixed in core CVS (audio bit disabled because it would need dozens of alsa suppressions and I'm too lazy to add those now). 2006-09-22 12:08:14 +0000 Wim Taymans gst/rtp/: Small cleanups. Original commit message from CVS: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_change_state): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init): Small cleanups. * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_base_init), (gst_rtp_vorbis_depay_class_init), (gst_rtp_vorbis_depay_init), (gst_rtp_vorbis_depay_finalize), (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_process), (gst_rtp_vorbis_depay_set_property), (gst_rtp_vorbis_depay_get_property), (gst_rtp_vorbis_depay_change_state), (gst_rtp_vorbis_depay_plugin_init): * gst/rtp/gstrtpvorbisdepay.h: * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_base_init), (gst_rtp_vorbis_pay_class_init), (gst_rtp_vorbis_pay_init), (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_init_packet), (gst_rtp_vorbis_pay_flush_packet), (gst_rtp_vorbis_pay_append_buffer), (gst_rtp_vorbis_pay_handle_buffer), (gst_rtp_vorbis_pay_plugin_init): * gst/rtp/gstrtpvorbispay.h: Add experimental vorbis pay and depayloaders. 2006-09-21 13:33:16 +0000 Wim Taymans gst/rtp/gstrtpmp4gpay.c: Fix profile-level-id parsing and setup. Original commit message from CVS: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_parse_audio_config): Fix profile-level-id parsing and setup. 2006-09-21 09:50:41 +0000 Wim Taymans gst/udp/: Update README, simple cleanup. Original commit message from CVS: * gst/udp/README: * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): Update README, simple cleanup. 2006-09-21 09:35:13 +0000 Wim Taymans gst/rtp/README: Update README with some examples. Original commit message from CVS: * gst/rtp/README: Update README with some examples. * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_init), (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_parse_video_config), (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps): * gst/rtp/gstrtpmp4gpay.h: Make optional RTP parameters of type STRING, as required by the application/x-rtp caps specification. 2006-09-20 19:37:45 +0000 Philippe Kalaf gst/rtp/: Correctly calculate size of each H263+ RTP buffer taking into account MTU and Original commit message from CVS: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: Correctly calculate size of each H263+ RTP buffer taking into account MTU and RTP header. 2006-09-20 16:41:48 +0000 Wim Taymans gst/rtp/Makefile.am: And makefile too. Original commit message from CVS: * gst/rtp/Makefile.am: And makefile too. 2006-09-20 16:09:03 +0000 Wim Taymans gst/rtp/: Added preliminary ASF depayloader. Original commit message from CVS: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpasfdepay.c: (gst_rtp_asf_depay_base_init), (gst_rtp_asf_depay_class_init), (gst_rtp_asf_depay_init), (decode_base64), (gst_rtp_asf_depay_setcaps), (gst_rtp_asf_depay_process), (gst_rtp_asf_depay_set_property), (gst_rtp_asf_depay_get_property), (gst_rtp_asf_depay_change_state), (gst_rtp_asf_depay_plugin_init): * gst/rtp/gstrtpasfdepay.h: Added preliminary ASF depayloader. * gst/rtp/gstrtph264depay.c: (decode_base64): Fix base64 decoding. 2006-09-20 16:06:27 +0000 Wim Taymans gst/rtsp/URLS: Added some test URLS. Original commit message from CVS: * gst/rtsp/URLS: Added some test URLS. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open): * gst/rtsp/gstrtspsrc.h: When creating streams, give access to the complete SDP. Fix some leaks. Collect and merge global stream properties in stream caps. Preliminary support for WMServer. * gst/rtsp/rtspconnection.c: (rtsp_connection_create), (rtsp_connection_connect), (rtsp_connection_read), (read_body), (rtsp_connection_receive): * gst/rtsp/rtspconnection.h: Make connection interruptable. Refactor to make it reconnectable. Don't fail on short reads when reading data packets. * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_set_port), (rtsp_url_get_port): * gst/rtsp/rtspurl.h: Add methods for getting/setting the port. * gst/rtsp/sdpmessage.c: (sdp_message_get_attribute_val_n), (sdp_message_get_attribute_val), (sdp_media_get_attribute), (sdp_media_get_attribute_val_n), (sdp_media_get_attribute_val), (sdp_media_get_format), (sdp_parse_line), (sdp_message_parse_buffer): Fix headers. Add methods for getting multiple attributes with the same name. Increase buffer size when parsing. Fix parsing of a=foo fields. * gst/rtsp/test.c: (main): Update to new connection API. * gst/rtsp/rtspmessage.c: (rtsp_message_new_response), (rtsp_message_init_response), (rtsp_message_init_data), (rtsp_message_unset), (rtsp_message_free), (rtsp_message_dump): * gst/rtsp/rtspmessage.h: * gst/rtsp/rtsptransport.c: (rtsp_transport_free): * gst/rtsp/rtsptransport.h: * gst/rtsp/sdp.h: * gst/rtsp/sdpmessage.h: * gst/rtsp/gstrtsp.c: * gst/rtsp/gstrtsp.h: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtpdec.h: * gst/rtsp/rtsp.h: * gst/rtsp/rtspdefs.c: * gst/rtsp/rtspdefs.h: Dual licensed under MIT and LGPL now. 2006-09-19 17:25:15 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Reorganize stream parsing and creation. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (find_stream_by_pt), (gst_rtspsrc_create_stream), (gst_rtspsrc_free_stream), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream_by_channel), (gst_rtspsrc_push_event), (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), (gst_rtspsrc_parse_rtpinfo), (gst_rtspsrc_play): * gst/rtsp/gstrtspsrc.h: Reorganize stream parsing and creation. Detect container formats in interleaved mode. Keep more state about the streams. Assume a server also supports PLAY if it does not say. Add unicast and interleaved properties to TCP transport requests to make some servers happy (WMServer). * gst/rtsp/sdpmessage.h: Add some defines for the standard Bandwidth types. 2006-09-19 16:24:10 +0000 Edgard Lima * tests/icles/v4l2src-test.c: Just a small fix to the app options. Original commit message from CVS: Just a small fix to the app options. 2006-09-19 13:08:35 +0000 Edgard Lima * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2vidorient.c: * sys/v4l2/gstv4l2vidorient.h: * tests/icles/v4l2src-test.c: Add Video Orientation interface support to v4l2src. Original commit message from CVS: Add Video Orientation interface support to v4l2src. 2006-09-19 10:53:56 +0000 Wim Taymans gst/rtsp/test.c: Fix build. Original commit message from CVS: * gst/rtsp/test.c: (main): Fix build. 2006-09-19 10:14:52 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Add ms-gsm to the src template. Original commit message from CVS: * gst/wavparse/gstwavparse.c: Add ms-gsm to the src template. 2006-09-18 17:37:46 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Small cleanups, added documentation. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), (gst_rtspsrc_send), (gst_rtspsrc_parse_methods), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), (gst_rtspsrc_change_state), (gst_rtspsrc_uri_get_uri), (gst_rtspsrc_uri_set_uri): * gst/rtsp/gstrtspsrc.h: Small cleanups, added documentation. Try to clean up the requests and responses. Refactor parsing the supported methods. * gst/rtsp/rtspconnection.c: (rtsp_connection_open), (rtsp_connection_create), (rtsp_connection_send), (parse_response_status), (parse_request_line), (rtsp_connection_receive), (rtsp_connection_close), (rtsp_connection_free): * gst/rtsp/rtsptransport.c: (rtsp_transport_new), (rtsp_transport_init), (rtsp_transport_parse), (rtsp_transport_free): * gst/rtsp/rtspurl.c: (rtsp_url_parse): * gst/rtsp/sdpmessage.c: (sdp_message_new), (sdp_message_init), (sdp_message_clean), (sdp_message_free), (sdp_media_new), (sdp_media_init), (sdp_message_parse_buffer), (sdp_message_dump): Use g_return_val some more. * gst/rtsp/rtspdefs.h: Add more enum values to track initial states. * gst/rtsp/rtspmessage.c: (rtsp_message_new_request), (rtsp_message_init_request), (rtsp_message_new_response), (rtsp_message_init_response), (rtsp_message_init_data), (rtsp_message_unset), (rtsp_message_free), (rtsp_message_add_header), (rtsp_message_remove_header), (rtsp_message_get_header), (rtsp_message_set_body), (rtsp_message_take_body), (rtsp_message_get_body), (rtsp_message_steal_body), (rtsp_message_dump): * gst/rtsp/rtspmessage.h: Reorder arguments, object goes as the first one. Use g_return_val some more. 2006-09-18 15:36:14 +0000 Edgard Lima * sys/v4l2/v4l2src_calls.c: Fix GST_BUFFER_DURATION. Original commit message from CVS: Fix GST_BUFFER_DURATION. 2006-09-18 14:00:41 +0000 Wim Taymans gst/rtsp/gstrtspsrc.*: Export sometimes source pad with correct caps on the template, create the ghostpad from the te... Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_base_init), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_push_event), (gst_rtspsrc_loop), (gst_rtspsrc_uri_set_uri): * gst/rtsp/gstrtspsrc.h: Export sometimes source pad with correct caps on the template, create the ghostpad from the template. Remove RTCP template as we never expose RTCP. Protect against invalid body size. Avoid memcpy when creating the output buffer. Properly post an error and send EOS when the loop function is shut down. 2006-09-18 11:29:12 +0000 Lutz Mueller gst/rtsp/gstrtspsrc.*: Make sure we can never set an invalid location. Original commit message from CVS: Based on patch by: Lutz Mueller * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_set_property), (gst_rtspsrc_open), (gst_rtspsrc_uri_get_uri), (gst_rtspsrc_uri_set_uri): * gst/rtsp/gstrtspsrc.h: Make sure we can never set an invalid location. * gst/rtsp/rtspmessage.c: (rtsp_message_steal_body): * gst/rtsp/rtspmessage.h: Added _steal_body method for future use. * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free): Make freeing of NULL url return immediatly. 2006-09-18 10:42:52 +0000 Lutz Mueller gst/rtsp/gstrtspsrc.*: Use boilerplate. Original commit message from CVS: Based on patch by: Lutz Mueller * gst/rtsp/gstrtspsrc.c: (_do_init), (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_play), (gst_rtspsrc_change_state): * gst/rtsp/gstrtspsrc.h: Use boilerplate. Make rtspsrc subclass GstBin to make state changes easier. Add Range header field on the PLAY request. 2006-09-18 08:59:17 +0000 Thijs Vermeir gst/rtsp/: Small cleanups. when multicast is selected as the transport, create UDP sources and connect to the multica... Original commit message from CVS: Based on patch by: Thijs Vermeir * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause): * gst/rtsp/rtspconnection.c: (inet_aton): Small cleanups. when multicast is selected as the transport, create UDP sources and connect to the multicast group. Move parsing and setting of caps to a common place. Fixes #349894. 2006-09-16 22:14:35 +0000 Stefan Kost More G_OBJECT macro fixing. Original commit message from CVS: * ext/hermes/gsthermescolorspace.c: * ext/ivorbis/vorbisfile.c: * ext/lcs/gstcolorspace.c: * ext/wavpack/gstwavpackenc.h: * ext/xine/xineaudiodec.c: * ext/xine/xineaudiosink.c: * ext/xine/xineinput.c: * gst/chart/gstchart.c: * gst/equalizer/gstiirequalizer.c: * gst/games/gstpuzzle.c: * gst/librfb/gstrfbsrc.c: * gst/mixmatrix/mixmatrix.c: * gst/nsf/gstnsf.h: * gst/vbidec/gstvbidec.c: * gst/virtualdub/gstxsharpen.c: More G_OBJECT macro fixing. 2006-09-16 21:57:29 +0000 Stefan Kost More G_OBJECT macro fixing. Original commit message from CVS: * ext/flac/gstflactag.c: * gst/alpha/gstalpha.c: * gst/debug/breakmydata.c: * gst/debug/negotiation.c: * gst/debug/testplugin.c: * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstquark.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideotemplate.c: * gst/videomixer/videomixer.c: * sys/sunaudio/gstsunaudiosrc.h: More G_OBJECT macro fixing. 2006-09-16 14:30:59 +0000 Yves Lefebvre gst/avi/gstavimux.c: Correctly set the dwLength in strh. Original commit message from CVS: Patch by: Yves Lefebvre * gst/avi/gstavimux.c: (gst_avi_mux_stop_file): Correctly set the dwLength in strh. With this patch, the file duration is now displayed correctly in window media player and the AVI plays completely. Fixes #356147 2006-09-15 19:11:00 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: * tests/icles/v4l2src-test.c: The test application and the plgind error messages has been improved. Original commit message from CVS: The test application and the plgind error messages has been improved. 2006-09-15 17:10:22 +0000 Darren Kenny sys/sunaudio/gstsunaudiomixerctrl.c: Set the output track as the MASTER so that the gnome-settings-daemon keybindings... Original commit message from CVS: Patch by: Darren Kenny * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_build_list): Set the output track as the MASTER so that the gnome-settings-daemon keybindings for changing the volume using the keyboard works. Fixes #356142. 2006-09-15 16:01:48 +0000 Wim Taymans gst/multipart/multipartdemux.c: Fix documentation, it is not possible to control the framerate of jpegdec using filte... Original commit message from CVS: * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): Fix documentation, it is not possible to control the framerate of jpegdec using filtered caps yet. Fixes #355210. Return the downstream GstFlowReturn instead of GST_FLOW_OK so that we stop when there is an error. 2006-09-14 11:05:35 +0000 Tim-Philipp Müller gst/: Don't interpret a first buffer with an offset of NONE as 'from the middle of the stream', but only a first buff... Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain_parse_tag): * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): Don't interpret a first buffer with an offset of NONE as 'from the middle of the stream', but only a first buffer that has a valid buffer offset that's non-zero (see #345449). 2006-09-14 10:38:42 +0000 Tim-Philipp Müller gst/icydemux/gsticydemux.*: When we merge/collect multiple incoming buffers for typefinding purposes, keep an initial... Original commit message from CVS: * gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_typefind_or_forward): * gst/icydemux/gsticydemux.h: When we merge/collect multiple incoming buffers for typefinding purposes, keep an initial 0 offset on the first outgoing buffer as well (otherwise id3demux won't work right). Fixes #345449. Also Make buffer metadata writable before setting buffer caps. * tests/check/elements/icydemux.c: (typefind_succeed), (cleanup_icydemux), (push_data), (GST_START_TEST), (icydemux_suite): Small test case for the above. 2006-09-13 13:26:15 +0000 Stefan Kost gst/avi/gstavidemux.c: More code reuse and better logging in _peek_chunk(). Reintroduce check for chunk sizes before ... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_peek_chunk), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_stream_header_push), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): More code reuse and better logging in _peek_chunk(). Reintroduce check for chunk sizes before reading them (avoid oom). Better handling for invalid chunksizes when streaming. 2006-09-12 20:18:55 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Implements stop() to clear the adapter and event() to clear the adapter on FLUSH_STOP and... Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), (gst_spectrum_start), (gst_spectrum_stop), (gst_spectrum_event): Implements stop() to clear the adapter and event() to clear the adapter on FLUSH_STOP and EOS. 2006-09-11 20:38:41 +0000 Stefan Kost gst/level/gstlevel.*: Fix type mixup in level->interval (gdouble<->guint64). Spotted by Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_set_property): * gst/level/gstlevel.h: Fix type mixup in level->interval (gdouble<->guint64). Spotted by René Stadler 2006-09-11 18:23:59 +0000 Stefan Kost gst/spectrum/gstspectrum.*: Fix type mixup in spectrum->interval (gdouble<->guint64). Spotted by Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_init), (gst_spectrum_set_property): * gst/spectrum/gstspectrum.h: Fix type mixup in spectrum->interval (gdouble<->guint64). Spotted by René Stadler 2006-09-11 18:02:39 +0000 Stefan Kost gst/spectrum/demo-osssrc.c: Use more defines Original commit message from CVS: * gst/spectrum/demo-osssrc.c: (draw_spectrum), (main): Use more defines * gst/spectrum/gstspectrum.c: (gst_spectrum_init), (gst_spectrum_dispose), (gst_spectrum_set_caps), (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: Apply some of the spectrum cleanup changes suggested in #348085. 2006-09-08 16:47:46 +0000 Tim-Philipp Müller configure.ac: Bump requirements of -base (videocrop test case needs this). Original commit message from CVS: * configure.ac: Bump requirements of -base (videocrop test case needs this). * gst/videocrop/gstvideocrop.c: Document sloppy handling of subsampled chroma planes if left/top cropping is an odd number. * tests/check/elements/videocrop.c: (handoff_cb), (videocrop_test_cropping_init_context), (videocrop_test_cropping_deinit_context), (videocrop_test_cropping), (check_1x1_buffer), (GST_START_TEST), (videocrop_suite), (main): Add another unit test that crops the input to 1x1 (and checks that that pixel has the expected values in a number of formats). 2006-09-08 11:04:24 +0000 Tim-Philipp Müller gst/videocrop/: Some quick tests indicate that it doesn't make a great deal of sense to use liboil here, at least not... Original commit message from CVS: * gst/videocrop/Makefile.am: * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init), (gst_video_crop_transform_packed), (gst_video_crop_transform_planar): Some quick tests indicate that it doesn't make a great deal of sense to use liboil here, at least not for the memcpy()s we do, so remove liboil usage until there is clear evidence it actually makes a positive difference somewhere. 2006-09-06 09:05:33 +0000 Stefan Kost gst/avi/gstavidemux.c: Revert one change to fix streaming avi (adapter size != data size). Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_sync), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_data): Revert one change to fix streaming avi (adapter size != data size). 2006-09-04 16:21:17 +0000 Frédéric Riss gst/matroska/: Add support for VOBSUB subtitle tracks and zlib-compressed tracks. Make sure we start on a keyframe af... Original commit message from CVS: Patch by: Frédéric Riss * gst/matroska/matroska-demux.c: (gst_matroska_track_free), (gst_matroska_demux_reset), (gst_matroska_demux_read_track_encodings), (gst_matroska_demux_add_stream), (gst_matroska_decode_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_subtitle_caps): * gst/matroska/matroska-ids.h: Add support for VOBSUB subtitle tracks and zlib-compressed tracks. Make sure we start on a keyframe after a seek. (#343348) 2006-09-04 15:06:25 +0000 Tim-Philipp Müller gst/matroska/: not perfect yet though, needs some tweaking in flacdec; also, seeking could be better. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_push_hdr_buf), (gst_matroska_demux_push_flac_codec_priv_data), (gst_matroska_demux_push_xiph_codec_priv_data), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): * gst/matroska/matroska-ids.h: Add basic FLAC support (#311586), not perfect yet though, needs some tweaking in flacdec; also, seeking could be better. Do better bounds checking when deserialising vorbis stream headers to make sure we don't read beyond the end of the buffer on bad input. 2006-09-04 09:34:25 +0000 Alessandro Decina ext/annodex/gstcmmldec.c: Seeking back in a file containing a CMML stream errors out if the seek goes back up to the ... Original commit message from CVS: Patch by: Alessandro Decina * ext/annodex/gstcmmldec.c: (gst_cmml_dec_chain): Seeking back in a file containing a CMML stream errors out if the seek goes back up to the CMML headers. This is because after the seek the xml processing instruction is submitted to the xml parser again, which results in an error. The attached patch fixes the problem. Fixes #353908. * ext/annodex/gstcmmlenc.h: Fix authors name. 2006-09-03 10:46:17 +0000 Tim-Philipp Müller tests/check/elements/videocrop.c: More tests: check passthrough mode and caps transform in both directions with fixed... Original commit message from CVS: * tests/check/elements/videocrop.c: (handoff_cb), (buffer_probe_cb), (test_caps_transform), (test_passthrough), (notgst_value_list_get_nth_int), (videocrop_suite): More tests: check passthrough mode and caps transform in both directions with fixed values, ranges and lists. 2006-09-02 18:49:01 +0000 Tim-Philipp Müller docs/plugins/: Add videocrop to docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.hierarchy: Add videocrop to docs. * gst/videocrop/Makefile.am: * gst/videocrop/gstvideocrop.c: * gst/videocrop/gstvideocrop.h: Move boilerplate stuff and structures into a header file. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/videocrop.c: (video_crop_get_test_caps), (test_unit_sizes), (videocrop_test_cropping_init_context), (videocrop_test_cropping_deinit_context), (videocrop_test_cropping), (test_cropping), (videocrop_suite): Add unit tests for videocrop. 2006-09-02 15:30:45 +0000 Tim-Philipp Müller Port/rewrite videocrop from scratch for GStreamer-0.10, and make it support all formats videoscale supports (#345653). Original commit message from CVS: * configure.ac: * gst/videocrop/Makefile.am: * gst/videocrop/gstvideocrop.c: (gst_video_crop_base_init), (gst_video_crop_class_init), (gst_video_crop_init), (gst_video_crop_get_image_details_from_caps), (gst_video_crop_get_unit_size), (gst_video_crop_transform_packed), (gst_video_crop_transform_planar), (gst_video_crop_transform), (gst_video_crop_transform_dimension), (gst_video_crop_transform_dimension_value), (gst_video_crop_transform_caps), (gst_video_crop_set_caps), (gst_video_crop_set_property), (gst_video_crop_get_property), (plugin_init): Port/rewrite videocrop from scratch for GStreamer-0.10, and make it support all formats videoscale supports (#345653). 2006-09-02 14:45:04 +0000 Stefan Kost sys/v4l2/: Whitespace cleanups, dashify property-names. Original commit message from CVS: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_install_properties_helper): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): * sys/v4l2/gstv4l2src.h: Whitespace cleanups, dashify property-names. 2006-09-02 14:28:55 +0000 Stefan Kost sys/v4l2/: Cleanup error messages and unify header comments Original commit message from CVS: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): * sys/v4l2/gstv4l2xoverlay.h: * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), (gst_v4l2_open): * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_queue_frame), (gst_v4l2src_capture_init): * sys/v4l2/v4l2src_calls.h: Cleanup error messages and unify header comments 2006-08-30 18:01:52 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: Another small fix to set_caps function. Original commit message from CVS: Another small fix to set_caps function. 2006-08-30 13:30:13 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: Send new_segment in GST_FORMAT_TIME instead of in GST_FORMAT_BYTES. Original commit message from CVS: Send new_segment in GST_FORMAT_TIME instead of in GST_FORMAT_BYTES. 2006-08-30 11:36:06 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: A small fix to set_caps function. Original commit message from CVS: A small fix to set_caps function. 2006-08-30 11:27:40 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Reset each streams last_flow to GST_FLOW_OK. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_do_seek): Reset each streams last_flow to GST_FLOW_OK. (gst_qtdemux_activate_segment): Removing mystic modifications for good. 2006-08-30 11:07:37 +0000 Stefan Kost gst/qtdemux/qtdemux.c: put back 'segment start<=stop' change that was mystically reverted by the last commit Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), (qtdemux_parse_tree): put back 'segment start<=stop' change that was mystically reverted by the last commit 2006-08-30 10:43:53 +0000 Stefan Kost gst/qtdemux/qtdemux.c: Fix the build for disabled debug Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), (qtdemux_parse_tree): Fix the build for disabled debug 2006-08-29 20:59:47 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: Fixed framerate negotiation. Original commit message from CVS: Fixed framerate negotiation. 2006-08-28 17:47:29 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Make sure segment start<=stop in weird quicktime files. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), (gst_qtdemux_add_stream), (qtdemux_parse_trak), (qtdemux_video_caps): Make sure segment start<=stop in weird quicktime files. 2006-08-28 16:59:13 +0000 Andy Wingo ext/raw1394/gstdv1394src.c (gst_dv1394src_from_raw1394handle): New helper function to lessen the ifdefs. Original commit message from CVS: 2006-08-28 Andy Wingo * ext/raw1394/gstdv1394src.c (gst_dv1394src_from_raw1394handle): New helper function to lessen the ifdefs. (GST_INFO_OBJECT): (gst_dv1394src_iso_receive): Use it. (gst_dv1394src_create): Also use the control sockets in iec61883 mode. (gst_dv1394src_start, gst_dv1394src_stop): Always use a separate handle for AVC operations; fixes #348233. 2006-08-28 14:59:05 +0000 Stefan Kost sys/v4l2/v4l2_calls.c: add comments and more debug logging Original commit message from CVS: * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): add comments and more debug logging 2006-08-27 17:14:06 +0000 Stefan Kost Rename again (audiofxgood -> audiofx). Original commit message from CVS: * configure.ac: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-audiofxgood.xml: * gst/audiofx/Makefile.am: * gst/audiofx/audiofx.c: * gst/audiofxgood/.cvsignore: * gst/audiofxgood/Makefile.am: * gst/audiofxgood/audiofx.c: * gst/audiofxgood/audiopanorama.c: * gst/audiofxgood/audiopanorama.h: Rename again (audiofxgood -> audiofx). 2006-08-27 13:12:52 +0000 Stefan Kost gst/avi/gstavidemux.c: Initialze variables. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan): Initialze variables. 2006-08-25 16:21:37 +0000 Wim Taymans gst/avi/gstavidemux.*: More attempts to turn this into readable code. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), (gst_avi_demux_init), (gst_avi_demux_finalize), (gst_avi_demux_reset), (gst_avi_demux_index_last), (gst_avi_demux_index_next), (gst_avi_demux_index_entry_for_time), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_peek_tag), (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header_pull), (gst_avi_demux_do_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_loop), (gst_avi_demux_chain), (gst_avi_demux_sink_activate), (gst_avi_demux_change_state): * gst/avi/gstavidemux.h: More attempts to turn this into readable code. Don't leak adapters. Calculate duration according to index more efficiently. Don't try to act like we drive the pipeline in chain mode. 2006-08-25 09:53:18 +0000 Wim Taymans ext/annodex/gstcmmlutils.c: Fix build. Original commit message from CVS: * ext/annodex/gstcmmlutils.c: (gst_cmml_clock_time_from_npt): Fix build. 2006-08-25 09:42:43 +0000 Alessandro Decina ext/annodex/gstannodex.c: Do some extra sanity checks. Original commit message from CVS: Patch by: Alessandro Decina * ext/annodex/gstannodex.c: (gst_annodex_granule_to_time): Do some extra sanity checks. Fixes #350340. * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_change_state), (gst_cmml_enc_parse_tag_head), (gst_cmml_enc_parse_tag_clip), (gst_cmml_enc_push_clip), (gst_cmml_enc_push): Check if clip->start_time is valid before adding the clip to the track list. Reset enc->preamble going from PAUSED to READY. Don't use GST_FLOW_UNEXPECTED for wrong usage of the element, it is only used for EOS. Only post an error message if we were the one that created the fatal GstFlowReturn value. * ext/annodex/gstcmmlutils.c: (gst_cmml_clock_time_from_npt), (gst_cmml_clock_time_to_granule), (gst_cmml_track_list_has_clip): Parse the seconds field of the npt-sec time format using %llu rather than %d and check that the value scaled by GST_SECOND doesn't overflow. Use guint64(s) to represent the keyindex and keyoffset fields of a granulepos. Lookup a clip's track with clip->track rather than clip->id which makes no sense. Identify a clip by its track and start time and not its xml id. do some more input checking and make sure we don't do undefined shifts. * tests/check/elements/cmmldec.c: (setup_cmmldec), (teardown_cmmldec), (check_output_buffer_is_equal), (push_data), (cmml_tag_message_pop), (check_headers), (push_clip_full), (push_clip), (push_empty_clip), (check_output_clip), (GST_START_TEST), (cmmldec_suite): * tests/check/elements/cmmlenc.c: (setup_cmmlenc), (teardown_cmmlenc), (check_output_buffer_is_equal), (push_data), (check_headers), (push_clip), (check_clip_times), (check_clip), (check_empty_clip), (GST_START_TEST), (cmmlenc_suite): Added some more checks. 2006-08-24 19:00:22 +0000 Stefan Kost Make also the pan-property float (saves scaling and yields better resolution) Original commit message from CVS: * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_class_init), (gst_audio_panorama_set_property), (gst_audio_panorama_get_property), (gst_audio_panorama_transform_m2s_int), (gst_audio_panorama_transform_s2s_int), (gst_audio_panorama_transform_m2s_float), (gst_audio_panorama_transform_s2s_float): * gst/audiofxgood/audiopanorama.h: * tests/check/elements/audiopanorama.c: (GST_START_TEST): Make also the pan-property float (saves scaling and yields better resolution) 2006-08-24 18:23:14 +0000 Stefan Kost gst/audiofxgood/audiopanorama.c: ChangeLog surgery to add cymax's real name Original commit message from CVS: * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_set_caps), (gst_audio_panorama_transform_m2s_float), (gst_audio_panorama_transform_s2s_float): ChangeLog surgery to add cymax's real name 2006-08-24 18:17:20 +0000 Stefan Kost gst/audiofxgood/audiopanorama.*: Added float support (thanks cymax) Original commit message from CVS: * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_set_caps), (gst_audio_panorama_transform_m2s_int), (gst_audio_panorama_transform_s2s_int), (gst_audio_panorama_transform_m2s_float), (gst_audio_panorama_transform_s2s_float), (gst_audio_panorama_transform): * gst/audiofxgood/audiopanorama.h: Added float support (thanks cymax) 2006-08-24 14:16:55 +0000 Stefan Kost gst/audiofxgood/audiopanorama.c: Fix docs & debug category. Add Fixme for volume pan levels. Original commit message from CVS: * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_transform_m2s): Fix docs & debug category. Add Fixme for volume pan levels. 2006-08-24 13:51:15 +0000 Stefan Kost gst/avi/gstavidemux.c: unbreak AVI index handling, some more debug, remove an obsolete adapter_flush that caused stre... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_sync), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_header_pull), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_chain): unbreak AVI index handling, some more debug, remove an obsolete adapter_flush that caused streaming to wander off in the wild 2006-08-24 11:21:06 +0000 Wim Taymans gst/avi/gstavidemux.*: Some more cleanups. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_header_pull): * gst/avi/gstavidemux.h: Some more cleanups. Fix totalFrames parsing in ODML. Disable use of index for length calculation in case of ODML as this is broken now. 2006-08-24 10:03:03 +0000 Tim-Philipp Müller ext/flac/gstflacdec.c: Use libgsttag helper function here too. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_update_metadata): Use libgsttag helper function here too. 2006-08-24 09:24:11 +0000 Sebastian Dröge ext/wavpack/gstwavpackdec.c: Post audio codec and average bitrate tags on bus (#344472). Original commit message from CVS: Patch by: Sebastian Dröge * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_post_tags), (gst_wavpack_dec_chain): Post audio codec and average bitrate tags on bus (#344472). * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), (gst_wavpack_parse_src_query): Forward queries in other formats (BYTE format in particular) upstream; add Sebastian to authors. 2006-08-24 00:40:07 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: Fix set_caps to set width and height to the values the driver is really working with. Original commit message from CVS: Fix set_caps to set width and height to the values the driver is really working with. 2006-08-23 15:33:47 +0000 Stefan Kost gst/avi/gstavidemux.*: Initial streaming support for avidemux (fixes #336465) Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), (gst_avi_demux_init), (gst_avi_demux_dispose), (gst_avi_demux_reset), (gst_avi_demux_index_next), (gst_avi_demux_index_entry_for_time), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_peek_chunk_info), (gst_avi_demux_peek_chunk), (gst_avi_demux_stream_init_push), (gst_avi_demux_stream_init_pull), (gst_avi_demux_parse_subindex), (gst_avi_demux_read_subindexes_push), (gst_avi_demux_read_subindexes_pull), (gst_avi_demux_parse_stream), (sort), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_peek_tag), (gst_avi_demux_massage_index), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_header_pull), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (push_tag_lists), (gst_avi_demux_loop), (gst_avi_demux_chain), (gst_avi_demux_sink_activate), (gst_avi_demux_activate_push), (gst_avi_demux_change_state): * gst/avi/gstavidemux.h: Initial streaming support for avidemux (fixes #336465) 2006-08-23 10:30:31 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackenc.c: Fix mem leak, send newsegment event on correction pad as well (#352476). Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block): Fix mem leak, send newsegment event on correction pad as well (#352476). * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): Restore original author (on Sebastian's request). * tests/check/Makefile.am: * tests/check/gst-plugins-bad.supp: Add (so far empty) suppression file for -bad. Remove wavpackenc test from VALGRIND_TO_FIX now that the leak is fixed. 2006-08-23 09:22:07 +0000 Sebastian Dröge tests/check/: Add unit tests for wavpack elements (#352476). Original commit message from CVS: Patch by: Sebastian Dröge * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/wavpackdec.c: (setup_wavpackdec), (cleanup_wavpackdec), (GST_START_TEST), (wavpackdec_suite), (main): * tests/check/elements/wavpackenc.c: (setup_wavpackenc), (cleanup_wavpackenc), (GST_START_TEST), (wavpackenc_suite), (main): * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad), (setup_wavpackparse), (cleanup_wavpackparse), (GST_START_TEST), (wavpackparse_suite), (main): Add unit tests for wavpack elements (#352476). 2006-08-23 08:52:50 +0000 Sebastian Dröge Add docs for wavpack elements (#352476). Original commit message from CVS: Patch by: Sebastian Dröge * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/inspect/plugin-wavpack.xml: * ext/wavpack/gstwavpackdec.c: * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackenc.c: * ext/wavpack/gstwavpackenc.h: * ext/wavpack/gstwavpackparse.c: * ext/wavpack/gstwavpackparse.h: Add docs for wavpack elements (#352476). 2006-08-22 20:39:26 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: Fixed query size to work with drivers that uses intermediate step like "width * height" to find closest size. Original commit message from CVS: Fixed query size to work with drivers that uses intermediate step like "width * height" to find closest size. 2006-08-22 17:20:41 +0000 Tim-Philipp Müller docs/plugins/gst-plugins-good-plugins-docs.sgml: There is no taglibmux element ... Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: There is no taglibmux element ... * gst/rtsp/gstrtspsrc.c: Use '%' rather than '&perc;' in gtk-doc blurb, docs build was complaining about unknown entity here. 2006-08-22 17:02:39 +0000 Wim Taymans gst/avi/gstavidemux.*: Mark DISCONT. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_do_seek), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): * gst/avi/gstavidemux.h: Mark DISCONT. Remove old unused fields and reorder the struct a bit. 2006-08-22 16:45:37 +0000 Wim Taymans Small documentation updates. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_media_to_caps), (gst_rtspsrc_send), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause): * gst/rtsp/gstrtspsrc.h: * sys/oss/gstosssink.c: (gst_oss_sink_open), (gst_oss_sink_prepare), (gst_oss_sink_unprepare): Small documentation updates. 2006-08-22 16:42:22 +0000 Wim Taymans gst/avi/gstavidemux.*: Precalc most of the duration query for each stream. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_index_entry_for_time), (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_stream_init), (gst_avi_demux_parse_stream), (gst_avi_demux_stream_index), (gst_avi_demux_peek_tag), (gst_avi_demux_next_data_buffer), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header), (gst_avi_demux_do_seek), (gst_avi_demux_handle_seek), (gst_avi_demux_aggregated_flow), (gst_avi_demux_process_next_entry), (gst_avi_demux_loop), (gst_avi_demux_sink_activate_pull), (gst_avi_demux_change_state): * gst/avi/gstavidemux.h: Precalc most of the duration query for each stream. Make seeking more correct. Use GstSegment to track position and duration. Code cleanups and leak fixes. Calculate correct total duration based on index length. 2006-08-22 13:53:34 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: If strings in text fields are marked ISO8859-1, but contain valid UTF-8 already, then han... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_text_identification_frame), (parse_insert_string_field): If strings in text fields are marked ISO8859-1, but contain valid UTF-8 already, then handle them as UTF-8 and ignore the encoding. (#351794) 2006-08-22 12:28:24 +0000 Tim-Philipp Müller ext/flac/gstflacdec.*: Make flac-in-ogg work (#352100). Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_scan_got_frame), (gst_flac_dec_write), (gst_flac_dec_loop), (gst_flac_dec_sink_event), (gst_flac_dec_chain), (gst_flac_dec_src_query): * ext/flac/gstflacdec.h: Make flac-in-ogg work (#352100). 2006-08-22 12:10:32 +0000 Tim-Philipp Müller gst/monoscope/gstmonoscope.c: Don't unref buffers of which we've already given away ownership to the adapter. Original commit message from CVS: * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): Don't unref buffers of which we've already given away ownership to the adapter. 2006-08-22 10:32:34 +0000 Tim-Philipp Müller ext/speex/gstspeexdec.c: Make metadata extraction actually work. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_chain_parse_comments): Make metadata extraction actually work. * ext/speex/gstspeexenc.c: (gst_speexenc_base_init), (gst_speexenc_init), (gst_speexenc_create_metadata_buffer), (gst_speexenc_chain): Fix metadata writing: replace old code which wrote completely broken tags with libgsttag-based code. Plus miscellaneous code cleanups (use static pad templates etc.) and a bunch of leak fixes. 2006-08-21 19:34:03 +0000 Stefan Kost gst/audiopanorama/: die! die! die! you should never have been there Original commit message from CVS: * gst/audiopanorama/.cvsignore: * gst/audiopanorama/Makefile.am: * gst/audiopanorama/audiofx.c: * gst/audiopanorama/audiopanorama.c: * gst/audiopanorama/audiopanorama.h: die! die! die! you should never have been there 2006-08-21 16:24:28 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Some more constification. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_node_dump_foreach), (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): Some more constification. Fix some paletted data formats again. Fix ulaw/alaw in qt. Set correct caps for raw RGB. Add support for yuv2, which is like Yuv2. Add support for raw audio with the NONE fourcc, which is like raw. 2006-08-21 13:59:52 +0000 Tim-Philipp Müller ext/wavpack/: More clean-ups: use shorter variable names to make code easier to read; prefix structures we define wit... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_init), (gst_wavpack_enc_finalize), (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_format_samples), (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), (gst_wavpack_enc_sink_event), (gst_wavpack_enc_change_state), (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): * ext/wavpack/gstwavpackenc.h: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), (gst_wavpack_parse_src_query), (gst_wavpack_parse_src_event), (gst_wavpack_parse_init), (gst_wavpack_parse_get_upstream_length), (gst_wavpack_parse_loop): More clean-ups: use shorter variable names to make code easier to read; prefix structures we define with 'Gst' to make it clearer where they come from. 2006-08-21 13:26:37 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackenc.c: Fix caps set on buffers and template caps (output is framed) and make them match (#35166... Original commit message from CVS: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), (gst_wavpack_enc_sink_event): Fix caps set on buffers and template caps (output is framed) and make them match (#351663); use GST_WARNING_OBJECT instead of GST_ELEMENT_WARNING; simplify push_block(); do some small clean-ups here and there; fix memleak (#351663). 2006-08-21 13:12:47 +0000 Jan Schmidt tests/check/elements/audiopanorama.c: Fix invalid memory access in audiopanorama test suite. Original commit message from CVS: * tests/check/elements/audiopanorama.c: (GST_START_TEST): Fix invalid memory access in audiopanorama test suite. 2006-08-21 11:34:41 +0000 Edward Hervey tests/check/elements/.cvsignore: ignore built file Original commit message from CVS: * tests/check/elements/.cvsignore: ignore built file 2006-08-21 10:46:21 +0000 Wim Taymans gst/rtp/Makefile.am: Fix the build again. Original commit message from CVS: * gst/rtp/Makefile.am: Fix the build again. 2006-08-21 09:21:27 +0000 Stefan Kost gst/audiofxgood/: resubmit with the desired name *again* Original commit message from CVS: * gst/audiofxgood/.cvsignore: * gst/audiofxgood/Makefile.am: * gst/audiofxgood/audiofx.c: (plugin_init): * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_base_init), (gst_audio_panorama_class_init), (gst_audio_panorama_init), (gst_audio_panorama_set_property), (gst_audio_panorama_get_property), (gst_audio_panorama_get_unit_size), (gst_audio_panorama_transform_caps), (gst_audio_panorama_set_caps), (gst_audio_panorama_transform_m2s), (gst_audio_panorama_transform_s2s), (gst_audio_panorama_transform): * gst/audiofxgood/audiopanorama.h: resubmit with the desired name *again* 2006-08-20 13:09:51 +0000 Stefan Kost use g_assert in _get_unit_size Original commit message from CVS: * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_get_unit_size): * gst/videobox/gstvideobox.c: (gst_video_box_get_unit_size): use g_assert in _get_unit_size 2006-08-20 13:06:44 +0000 Stefan Kost docs/plugins/: cleanup -unused.txt to make it useful, add previously missing docs Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-audiofxgood.xml: cleanup -unused.txt to make it useful, add previously missing docs * ext/Makefile.am: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/esd/gstesd.c: (plugin_init): reflow to get rid of two external symbols * gst/audiofxgood/audiofx.c: (plugin_init): re-add 2006-08-20 12:09:16 +0000 Stefan Kost gst/audiofxgood/audiofx.c Original commit message from CVS: * configure.ac: * gst/audiofxgood/.cvsignore: * gst/audiofxgood/Makefile.am: * gst/audiofxgood/audiofx.c * gst/audiofxgood/audiopanorama.c: (gst_audio_panorama_base_init), (gst_audio_panorama_class_init), (gst_audio_panorama_init), (gst_audio_panorama_set_property), (gst_audio_panorama_get_property), (gst_audio_panorama_get_unit_size), (gst_audio_panorama_transform_caps), (gst_audio_panorama_set_caps), (gst_audio_panorama_transform_m2s), (gst_audio_panorama_transform_s2s), (gst_audio_panorama_transform): * gst/audiofxgood/audiopanorama.h: * tests/check/Makefile.am: * tests/check/elements/audiopanorama.c: (setup_panorama_m), (setup_panorama_s), (cleanup_panorama), (GST_START_TEST), (panorama_suite), (main): Add audiofxgood plugin with audiopanorama element 2006-08-18 21:39:00 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.c: Fix resyncing in push mode not stopping re-syncing at embedded zeroes; skip garbage be... Original commit message from CVS: Based on patch by: Sebastian Dröge * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_sink_event), (gst_wavpack_parse_get_upstream_length), (gst_wavpack_parse_find_marker), (gst_wavpack_parse_resync_loop), (gst_wavpack_parse_loop), (gst_wavpack_parse_resync_adapter): Fix resyncing in push mode not stopping re-syncing at embedded zeroes; skip garbage between frames in pull mode as well if necessary; use gst_pad_query_peer_duration(); push EOS and NEWSEGMENT event in right direction (#351659). 2006-08-18 17:00:53 +0000 Wim Taymans docs/plugins/Makefile.am: More Oss docs fixage. Original commit message from CVS: * docs/plugins/Makefile.am: More Oss docs fixage. 2006-08-18 16:52:21 +0000 Wim Taymans gst/rtp/: Added experimental SVQ3 depayloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_base_init), (gst_rtp_sv3v_depay_class_init), (gst_rtp_sv3v_depay_init), (gst_rtp_sv3v_depay_finalize), (gst_rtp_sv3v_depay_setcaps), (gst_rtp_sv3v_depay_process), (gst_rtp_sv3v_depay_set_property), (gst_rtp_sv3v_depay_get_property), (gst_rtp_sv3v_depay_change_state), (gst_rtp_sv3v_depay_plugin_init): * gst/rtp/gstrtpsv3vdepay.h: Added experimental SVQ3 depayloader. 2006-08-18 13:25:06 +0000 Edward Hervey ext/dv/gstdvdemux.*: When handling seek requests, don't send the newsegment event from the calling thread. Instead sa... Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek), (gst_dvdemux_loop), (gst_dvdemux_change_state): * ext/dv/gstdvdemux.h: When handling seek requests, don't send the newsegment event from the calling thread. Instead save it so it can be sent from the streaming thread. 2006-08-17 15:51:50 +0000 Sjoerd Simons gst/multipart/multipartdemux.c: Accept leading whitespace before the boundary Original commit message from CVS: Patch by: Sjoerd Simons * gst/multipart/multipartdemux.c: (multipart_parse_header): Accept leading whitespace before the boundary This patch makes the demuxer allow some whitespace before the actual boundary. This makes the demuxer work with the ``old'' gstreamer multipartmuxer again (which placed an extra \n before the start of the stream) Fixes #349068. 2006-08-17 15:47:28 +0000 Wim Taymans gst/rtp/gstrtph264depay.c: Error out on non-implemented stuff. Original commit message from CVS: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): Error out on non-implemented stuff. 2006-08-16 16:50:00 +0000 Andy Wingo ext/ladspa/gstsignalprocessor.c: Make ladspa elements reusable. Fixes #350006. Original commit message from CVS: Patch by: Andy Wingo * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setup), (gst_signal_processor_start), (gst_signal_processor_stop), (gst_signal_processor_cleanup), (gst_signal_processor_setcaps), (gst_signal_processor_pen_buffer), (gst_signal_processor_flush), (gst_signal_processor_do_pulls), (gst_signal_processor_do_pushes), (gst_signal_processor_change_state): Make ladspa elements reusable. Fixes #350006. 2006-08-16 15:33:12 +0000 Wim Taymans ext/ladspa/gstladspa.c: Convert ' ' into '_'. Try to keep as many characters in the padtemplate names as possible. Original commit message from CVS: * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): Convert ' ' into '_'. Try to keep as many characters in the padtemplate names as possible. 2006-08-16 14:47:50 +0000 Wim Taymans ext/ladspa/gstsignalprocessor.c: A push() gives away our refcount so we should not use the buffer on the pen anymore. Original commit message from CVS: * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_flush), (gst_signal_processor_do_pushes): A push() gives away our refcount so we should not use the buffer on the pen anymore. 2006-08-16 13:48:00 +0000 Tim-Philipp Müller sys/oss/gstossmixerelement.c: Don't leak device string. Original commit message from CVS: * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), (gst_oss_mixer_element_finalize): Don't leak device string. 2006-08-16 13:01:32 +0000 Tim-Philipp Müller configure.ac: Require CVS of GStreamer core and -base (for Original commit message from CVS: * configure.ac: Require CVS of GStreamer core and -base (for GST_TAG_EXTENDED_COMMENT and gst_tag_parse_extended_comment()). * ext/taglib/gstid3v2mux.cc: Write extended comment tags properly (#348762). * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_comment_frame): Extract COMM frames into extended comments, which makes it easier to properly retain the description bit of the tag and maintain this information when re-tagging (#348762). 2006-08-16 12:02:48 +0000 Tim-Philipp Müller tests/check/Makefile.am: Don't try to run annodex unit tests if the annodex plugin has not been built (Fixes #351116). Original commit message from CVS: * tests/check/Makefile.am: Don't try to run annodex unit tests if the annodex plugin has not been built (Fixes #351116). 2006-08-16 10:53:32 +0000 Tim-Philipp Müller gst/autodetect/gstautoaudiosink.c: When we can't find a usable audiosink, don't error out, but use a fake sink instea... Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_find_best): When we can't find a usable audiosink, don't error out, but use a fake sink instead and post a warning message on the bus (#341278). 2006-08-16 10:40:04 +0000 Sebastian Dröge ext/wavpack/: In push mode, re-sync to next wavpack header if sync is lost (#351557). Also use hyphens instead of und... Original commit message from CVS: Patch by: Sebastian Dröge * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_resync_adapter), (gst_wavpack_parse_chain): In push mode, re-sync to next wavpack header if sync is lost (#351557). Also use hyphens instead of underscores in GObject property names. 2006-08-16 10:22:32 +0000 Tim-Philipp Müller sys/oss/: Document OSS elements; add gtk-doc blurb with 'Since 0.10.5' for ossmixer's new device property. Original commit message from CVS: * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init): * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: Document OSS elements; add gtk-doc blurb with 'Since 0.10.5' for ossmixer's new device property. * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Add docs for OSS elements. * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Update to CVS version. 2006-08-16 10:05:00 +0000 Wim Taymans gst/rtp/: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP. Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpmp4gdepay.c: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP. * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init), (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init), (gst_rtp_h264_depay_finalize), (decode_base64), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), (gst_rtp_h264_depay_set_property), (gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_change_state), (gst_rtp_h264_depay_plugin_init): * gst/rtp/gstrtph264depay.h: Added basic, not completely functional RFC 3984 H264 depayloader. 2006-08-16 09:48:26 +0000 Wim Taymans gst/rtsp/gstrtpdec.c: Add pads after setting them up. Original commit message from CVS: * gst/rtsp/gstrtpdec.c: (gst_rtpdec_init), (gst_rtpdec_getcaps): Add pads after setting them up. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init), (gst_rtspsrc_init), (gst_rtspsrc_finalize), (gst_rtspsrc_free_stream), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_combine_flows), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause): * gst/rtsp/gstrtspsrc.h: Fix interleaved mode. - Protect streaming with lock. - Combine flows - set caps on outgoing buffers. - strip trailing \0 from data packets. - Configure RTP/RTCP in stream. Use DEBUG_OBJECT more. 2006-08-16 09:29:20 +0000 Wim Taymans gst/udp/gstmultiudpsink.c: Turn a g_print into a DEBUG line. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_add): Turn a g_print into a DEBUG line. 2006-08-16 09:25:17 +0000 Wim Taymans sys/oss/: Small cleanups. Better error reporting. Original commit message from CVS: * sys/oss/gstossmixer.c: (gst_ossmixer_open), (gst_ossmixer_new): * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), (gst_oss_mixer_element_init), (gst_oss_mixer_element_set_property), (gst_oss_mixer_element_get_property), (gst_oss_mixer_element_change_state): * sys/oss/gstossmixerelement.h: Small cleanups. Better error reporting. Add device property for the mixer instead of the hardcoded /dev/mixer. Fixes #350785. API: GstOssMixerElement::device property 2006-08-15 22:44:27 +0000 Jens Granseuer gconf/Makefile.am: Make --disable-schemas work right (they still need to be copied to the installation directory, jus... Original commit message from CVS: Patch by: Jens Granseuer * gconf/Makefile.am: Make --disable-schemas work right (they still need to be copied to the installation directory, just not applied). Fixes #351347 (also #344100). 2006-08-15 20:29:45 +0000 Sebastian Dröge ext/wavpack/gstwavpackparse.*: Make wavpackparse also work in push-mode (not seekable yet though); some small clean-u... Original commit message from CVS: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_class_init), (gst_wavpack_parse_reset), (gst_wavpack_parse_get_src_query_types), (gst_wavpack_parse_src_query), (gst_wavpack_parse_handle_seek_event), (gst_wavpack_parse_sink_event), (gst_wavpack_parse_init), (gst_wavpack_parse_create_src_pad), (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_loop), (gst_wavpack_parse_chain), (gst_wavpack_parse_sink_activate), (gst_wavpack_parse_sink_activate_pull): * ext/wavpack/gstwavpackparse.h: Patch by: Sebastian Dröge Make wavpackparse also work in push-mode (not seekable yet though); some small clean-ups along the way; add support for SEEKING query and query types function. (#351495). 2006-08-14 11:37:10 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: * win32/common/config.h: back to HEAD Original commit message from CVS: back to HEAD 2006-08-14 11:14:43 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * win32/common/config.h: releasing 0.10.4 Original commit message from CVS: releasing 0.10.4 2006-08-14 10:06:55 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Extract all references/redirections if there is more than one and sort them; also extract mini... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_redirects_sort_func), (qtdemux_process_redirects), (qtdemux_parse_tree): Extract all references/redirections if there is more than one and sort them; also extract minimum required bitrate information if available. (#350399) 2006-08-10 14:10:28 +0000 Edward Hervey Send the newsegment event in the streaming thread. Original commit message from CVS: Patch by: Edward Hervey * configure.ac: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_data): Send the newsegment event in the streaming thread. Fixes #347529 2006-08-10 14:02:45 +0000 Thomas Vander Stichele * win32/common/config.h: bumped for prerel Original commit message from CVS: bumped for prerel 2006-08-10 13:10:38 +0000 Thomas Vander Stichele * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: update translations Original commit message from CVS: update translations 2006-08-08 14:55:53 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix silly typo. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): Fix silly typo. 2006-08-08 14:46:00 +0000 Tim-Philipp Müller * ChangeLog: ChangeLog surgery: mention bug number Original commit message from CVS: ChangeLog surgery: mention bug number 2006-08-08 14:40:47 +0000 Tim-Philipp Müller ext/jpeg/: Refuse sink caps in the encoder if width or height is not a multiple of 16, the encoder does not support t... Original commit message from CVS: * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_setcaps), (gst_smokeenc_resync), (gst_smokeenc_chain): Refuse sink caps in the encoder if width or height is not a multiple of 16, the encoder does not support that yet; along the same lines, check the return value of the encoder setup function; also remove some debug log clutter. 2006-08-04 11:38:54 +0000 Andy Wingo ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing whether a processor can work in place or not, and for... Original commit message from CVS: 2006-08-04 Andy Wingo * ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing whether a processor can work in place or not, and for keeping track of its state. Change the FlowReturn instance variable from "state" to "flow_state", all callers changed. * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setup) (gst_signal_processor_start, gst_signal_processor_stop) (gst_signal_processor_cleanup): New functions to manage the processor's state. (gst_signal_processor_setcaps): start() as well as setup() here. (gst_signal_processor_prepare): Respect CAN_PROCESS_IN_PLACE. (gst_signal_processor_change_state): Stop and cleanup the processor as we go to NULL. * ext/ladspa/gstladspa.c (gst_ladspa_base_init): Reuse buffers if INPLACE_BROKEN is not set. * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_prepare): Do the alloc_buffer in bytes, not frames. 2006-08-04 10:21:26 +0000 Zaheer Abbas Merali sys/ximage/ximageutil.c: Fix rgb masks when recording in < 24bpp. Original commit message from CVS: 2006-08-04 Zaheer Abbas Merali * sys/ximage/ximageutil.c: (ximageutil_xcontext_get): Fix rgb masks when recording in < 24bpp. 2006-08-04 09:20:26 +0000 Andy Wingo * ChangeLog: * ext/ladspa/gstsignalprocessor.c: BPB Original commit message from CVS: (gst_signal_processor_src_activate_pull): BPB 2006-08-04 09:05:53 +0000 Andy Wingo * ChangeLog: * ext/ladspa/gstsignalprocessor.c: ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setcaps) (gst_signal_processor_prepare) (gst_signal_processor_u... Original commit message from CVS: 2006-08-04 Andy Wingo * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setcaps) (gst_signal_processor_prepare) (gst_signal_processor_update_inputs) (gst_signal_processor_process, gst_signal_processor_pen_buffer) (gst_signal_processor_flush) (gst_signal_processor_sink_activate_push) (gst_signal_processor_src_activate_pull) (gst_signal_processor_change_state): Remove the last of the code that assumes that we process whole buffers at a time. Fix some debugging. Seems to work now in some cases. 2006-07-31 22:27:22 +0000 Andy Wingo ext/ladspa/gstsignalprocessor.c (gst_signal_processor_process): Fix nframes-choosing. Original commit message from CVS: 2006-08-01 Andy Wingo * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_process): Fix nframes-choosing. (gst_signal_processor_init): Init pending_in and pending_out. 2006-07-31 22:03:09 +0000 Andy Wingo ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): No more default sample rate, although we never check tha... Original commit message from CVS: 2006-08-01 Andy Wingo * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): No more default sample rate, although we never check that the sample rate actually gets set. Something for the future. (gst_signal_processor_setcaps): Some refcount fixes, flow fixes. (gst_signal_processor_event): Refcount fixen. (gst_signal_processor_process): Pull the number of frames to process from the sizes of the buffers in the input pens. (gst_signal_processor_pen_buffer): Remove an incorrect FIXME :) (gst_signal_processor_do_pulls): Add an nframes argument, and use it instead of buffer_frames. (gst_signal_processor_getrange): Refcount fixen, pass nframes on to do_pulls. (gst_signal_processor_chain) (gst_signal_processor_sink_activate_push) (gst_signal_processor_src_activate_pull): Refcount fixen. * ext/ladspa/gstsignalprocessor.h: No more buffer_frames, yay. 2006-07-31 19:44:18 +0000 Stefan Kost ext/ladspa/gstsignalprocessor.c: don't query buffer-frames from caps, add lots of debug-log, try fix for assert (#349... Original commit message from CVS: * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setcaps), (gst_signal_processor_process): don't query buffer-frames from caps, add lots of debug-log, try fix for assert (#349189) 2006-07-31 15:58:43 +0000 Wim Taymans gst/udp/gstudpsrc.c: Fix docs. Original commit message from CVS: * gst/udp/gstudpsrc.c: Fix docs. 2006-07-29 16:32:26 +0000 Stefan Kost ext/ladspa/gstsignalprocessor.c: Add debugs logs here and there, add more error handling, add some Original commit message from CVS: * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_add_pad_from_template), (gst_signal_processor_init), (gst_signal_processor_setcaps), (gst_signal_processor_process), (gst_signal_processor_pen_buffer), (gst_signal_processor_do_pulls), (gst_signal_processor_getrange), (gst_signal_processor_sink_activate_push), (gst_signal_processor_src_activate_pull), (gst_signal_processor_change_state): Add debugs logs here and there, add more error handling, add some FIXME comments, filed #349189 2006-07-29 11:22:47 +0000 Zaheer Abbas Merali ext/jpeg/gstsmokeenc.c: Set caps on buffer correctly. Fixes bug #349155. Original commit message from CVS: 2006-07-29 Zaheer Abbas Merali * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_getcaps), (gst_smokeenc_setcaps), (gst_smokeenc_chain): Set caps on buffer correctly. Fixes bug #349155. 2006-07-28 16:17:17 +0000 Sjoerd Simons gst/multipart/multipartdemux.c: Uses GstAdapter instead of own buffering. Original commit message from CVS: Patch by: Sjoerd Simons * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), (gst_multipart_demux_class_init), (gst_multipart_demux_init), (gst_multipart_demux_finalize), (get_line_end), (multipart_parse_header), (multipart_find_boundary), (gst_multipart_demux_chain), (gst_multipart_demux_change_state), (gst_multipart_set_property), (gst_multipart_get_property): Uses GstAdapter instead of own buffering. Actually parses the mime-type correctly (In tests the mime-type was always "" with the old version). Uses the Content-length header if available to speed up things. Reliably autoscans the boundary name by default. Fixes #349068. * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): Don't start the stream with a \n. 2006-07-28 08:32:47 +0000 Brian Cameron sys/sunaudio/gstsunaudiosrc.c: Open source with O_NONBLOCK (#349015). Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_open): Open source with O_NONBLOCK (#349015). 2006-07-28 08:21:27 +0000 Stefan Kost gst/avi/gstavidemux.*: Whitespace fixes and more debug Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), (gst_avi_demux_massage_index): * gst/avi/gstavidemux.h: Whitespace fixes and more debug 2006-07-27 11:21:53 +0000 Tim-Philipp Müller gst/autodetect/gstautoaudiosink.c: Get rid of old and unused magic sound-server properties stuff. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_create_element_with_pretty_name), (gst_auto_audio_sink_find_best), (gst_auto_audio_sink_change_state): Get rid of old and unused magic sound-server properties stuff. Add suffix to child sink's name that makes it easy to see from the name alone which type it actually is (alsa, oss, esd, etc.). 2006-07-27 10:05:27 +0000 Wim Taymans gst/udp/gstudpsrc.*: Rename "buffer" to "buffer-size" to make clear it is a size we set and not some sort of feature ... Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start): * gst/udp/gstudpsrc.h: Rename "buffer" to "buffer-size" to make clear it is a size we set and not some sort of feature we enable. 2006-07-27 10:01:49 +0000 Tim-Philipp Müller gst/udp/gstudpsrc.c: Use CLOSE_SOCKET() here instead of close() to maintain win32 workiness. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_start): Use CLOSE_SOCKET() here instead of close() to maintain win32 workiness. 2006-07-27 09:04:51 +0000 Thijs Vermeir gst/udp/gstudpsrc.*: Added "buffer" property to control the kernel receive buffer size. Original commit message from CVS: Patch by: Thijs Vermeir * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_set_property), (gst_udpsrc_get_property), (gst_udpsrc_start): * gst/udp/gstudpsrc.h: Added "buffer" property to control the kernel receive buffer size. Update documentation. Small cleanups. Fixes #348752. API: buffer property 2006-07-26 16:36:59 +0000 Kai Vehmanen gst/rtp/: Fix timestamp calculation on outgoing RTP packets. Original commit message from CVS: Patch by: Kai Vehmanen * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), (gst_rtp_pcma_pay_handle_buffer): * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush), (gst_rtp_pcmu_pay_handle_buffer): Fix timestamp calculation on outgoing RTP packets. Fixes #348675. 2006-07-26 10:07:29 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: is still sub-optimal though, since we don't retain or extract the comment descriptions pro... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Fix writing of comment frames (should be COMM not TCOM), is still sub-optimal though, since we don't retain or extract the comment descriptions properly (#334375, also see #334375). 2006-07-26 09:02:56 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: #define 'fact' RIFF chunk if we are not compiling against Original commit message from CVS: * gst/wavparse/gstwavparse.c: #define 'fact' RIFF chunk if we are not compiling against -base CVS (we don't want to depend on -base CVS for this one define only, and also not for release order reasons). 2006-07-26 08:17:45 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: Handle multiple tags of the same type properly. Re-inject unparsed ID3v2 frames that we ge... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Handle multiple tags of the same type properly. Re-inject unparsed ID3v2 frames that we get as binary blobs from id3demux into the tag again so we don't lose information when retagging (#334375). 2006-07-25 17:54:25 +0000 Tim-Philipp Müller sys/ximage/gstximagesrc.c: Document newly-added properties properly, so that there is a 'Since: 0.10.4' in the plugin... Original commit message from CVS: * sys/ximage/gstximagesrc.c: (gst_ximage_src_class_init): Document newly-added properties properly, so that there is a 'Since: 0.10.4' in the plugin docs. Convert some property names into canonical GObject style (GObject will do that internally anyway). 2006-07-25 16:47:04 +0000 Tim-Philipp Müller gst/id3demux/id3tags.c: Extract frames for ID3v2 versions prior to ID3v2.3.0 properly as well, and add the version to... Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_add_id3v2_frame_blob_to_taglist): Extract frames for ID3v2 versions prior to ID3v2.3.0 properly as well, and add the version to the blob's buffer caps, since that information will be needed for deserialisation later on (#348644). 2006-07-25 13:14:05 +0000 Stefan Kost gst/avi/gstavidemux.c: Moved win32 variant of GST_DEBUG_CATEGORY_EXTERN to gstinfo.h. Fixed indentation and spacing. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_read_subindexes), (gst_avi_demux_parse_stream): Moved win32 variant of GST_DEBUG_CATEGORY_EXTERN to gstinfo.h. Fixed indentation and spacing. 2006-07-24 21:43:06 +0000 Sébastien Moutte sys/directsound/gstdirectsoundsink.*: Add an attenuation property that will directly attenuate the directsound buffer. Original commit message from CVS: * sys/directsound/gstdirectsoundsink.h: * sys/directsound/gstdirectsoundsink.c: Add an attenuation property that will directly attenuate the directsound buffer. Change the size of the directsound secondary buffer to a half second. Add more debug logs. Add a lock to protect dsound buffer write access. Fix a bad implementation of reset. * sys/directsound/gstdirectdrawsink.c: * sys/directsound/gstdirectdrawsink.h: Add a keep_aspect_ratio property. Do not use overlay if not supported. Add more debug logs. Remove overwrite of WM_ERASEBKGND message handling. It was not redrawing border when keep_aspect_ratio was enabled. * win32/common/config.h: update version waiting an auto-generated config.h 2006-07-24 15:25:49 +0000 Tim-Philipp Müller docs/plugins/: Update files to CVS/Prerelease version, add esdsink docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: Update files to CVS/Prerelease version, add esdsink docs. * ext/esd/esdsink.c: Add gtk-doc blurb. * gst/rtp/gstrtpmp4vpay.c: Fix typo in element description. 2006-07-24 14:54:04 +0000 Tim-Philipp Müller * ChangeLog: ChangeLog surgery: fix Stefan's e-mail address Original commit message from CVS: ChangeLog surgery: fix Stefan's e-mail address 2006-07-24 14:49:19 +0000 Tim-Philipp Müller ext/esd/esdsink.c: Prevent libesd from auto-spawning a sound daemon if it is not already running. Now that we don't d... Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_open), (gst_esdsink_factory_init): Prevent libesd from auto-spawning a sound daemon if it is not already running. Now that we don't do evil stuff like that any longer we can give esdsink a rank so that autoaudiosink will try it as well if all other audio sinks fail (#343051). 2006-07-24 14:42:11 +0000 Tim-Philipp Müller ext/esd/Makefile.am: Oops, need to remove README from EXTRA_DIST as well. Original commit message from CVS: * ext/esd/Makefile.am: Oops, need to remove README from EXTRA_DIST as well. 2006-07-24 14:37:36 +0000 Tim-Philipp Müller ext/esd/README: Remove, it contains nothing useful anyway. Original commit message from CVS: * ext/esd/README: Remove, it contains nothing useful anyway. * ext/esd/esdsink.c: (gst_esdsink_init), (gst_esdsink_prepare), (gst_esdsink_delay): Some small clean-ups; use GST_BOILERPLATE etc. 2006-07-24 14:16:06 +0000 Wim Taymans gst/law/: Fix negotiation to deal with ANY/EMPTY caps instead of leaking. Original commit message from CVS: * gst/law/alaw-decode.c: (alawdec_getcaps): * gst/law/alaw-encode.c: (alawenc_getcaps), (gst_alawenc_chain): * gst/law/mulaw-decode.c: (mulawdec_getcaps): * gst/law/mulaw-encode.c: (mulawenc_getcaps): Fix negotiation to deal with ANY/EMPTY caps instead of leaking. 2006-07-24 13:40:56 +0000 Stefan Kost gst/wavparse/gstwavparse.*: Use information from 'fact' chunk for length calculation of compressed samples. Calculate... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), (gst_wavparse_other), (gst_wavparse_perform_seek), (gst_wavparse_get_upstream_size), (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), (gst_wavparse_pad_query): * gst/wavparse/gstwavparse.h: Use information from 'fact' chunk for length calculation of compressed samples. Calculate bps if bogus value is found in wav header (embeded mp2/mp3). 2006-07-24 11:48:03 +0000 Joni Valtanen Port udp plugin to win32 (#345288). Original commit message from CVS: Based on patch by: Joni Valtanen * configure.ac: * gst/udp/Makefile.am: * gst/udp/gstdynudpsink.c: (gst_dynudpsink_init), (gst_dynudpsink_finalize), (gst_dynudpsink_close): * gst/udp/gstdynudpsink.h: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init), (gst_multiudpsink_finalize), (gst_multiudpsink_close): * gst/udp/gstmultiudpsink.h: * gst/udp/gstudp.c: (plugin_init): * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_create), (gst_udpsrc_start), (gst_udpsrc_stop): * gst/udp/gstudpsrc.h: * gst/udp/gstudpnetutils.c: (gst_udp_net_utils_win32_inet_aton), (gst_udp_net_utils_win32_wsa_startup): * gst/udp/gstudpnetutils.h: Port udp plugin to win32 (#345288). 2006-07-24 11:00:34 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Remove unwanted DEBUG line. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (rtsp_connection_send): Remove unwanted DEBUG line. 2006-07-23 11:33:54 +0000 Tim-Philipp Müller gst/id3demux/: On second thought, it might be wiser and more efficient not to do tag registration from a streaming th... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (plugin_init): * gst/id3demux/id3tags.c: (id3demux_add_id3v2_frame_blob_to_taglist): * gst/id3demux/id3tags.h: On second thought, it might be wiser and more efficient not to do tag registration from a streaming thread. 2006-07-23 10:56:27 +0000 Tim-Philipp Müller gst/id3demux/id3tags.c: Put ID3v2 frames we can't parse as binary blobs into private tags, so that they are not lost ... Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_add_id3v2_frame_blob_to_taglist), (id3demux_id3v2_frames_to_tag_list): Put ID3v2 frames we can't parse as binary blobs into private tags, so that they are not lost when retagging, at least once id3v2mux has been taught to re-inject those frames again. See bug #334375. 2006-07-21 10:57:00 +0000 Wim Taymans gst/avi/gstavidemux.c: Fix some leaks. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_process_next_entry): Fix some leaks. * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): Don't use \n in debug lines. 2006-07-20 18:48:32 +0000 Stefan Kost docs/plugins/: Add annodex and icydemux, cleanup the sections a bit Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Add annodex and icydemux, cleanup the sections a bit 2006-07-19 14:36:00 +0000 Martin Szulecki sys/v4l2/gstv4l2object.c: If "device-name" is requested and the device is not open, try to temporarily open it to obt... Original commit message from CVS: Patch by: Martin Szulecki * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_get_property_helper): If "device-name" is requested and the device is not open, try to temporarily open it to obtain this information (#342494). 2006-07-19 11:52:53 +0000 Alex Lancaster ext/taglib/gstid3v2mux.cc: Write GST_TAG_ENCODER and GST_TAG_ENCODER_VERSION as Original commit message from CVS: Patch by: Alex Lancaster * ext/taglib/gstid3v2mux.cc: Write GST_TAG_ENCODER and GST_TAG_ENCODER_VERSION as ID3v2 TSSE frames (#347898). 2006-07-19 07:40:52 +0000 Tim-Philipp Müller * ChangeLog: ChangeLog surgery: mention fixed bug Original commit message from CVS: ChangeLog surgery: mention fixed bug 2006-07-18 19:59:01 +0000 Stefan Kost gst/avi/gstavimux.c: Respect mpegversion for "video/mpeg" and give message in case of unhandled versions. Original commit message from CVS: * gst/avi/gstavimux.c: (gst_avi_mux_vidsink_set_caps): Respect mpegversion for "video/mpeg" and give message in case of unhandled versions. 2006-07-18 18:05:15 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackdec.c: Fix caps after previous change to byte order endianness. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): Fix caps after previous change to byte order endianness. * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), (gst_wavpack_parse_sink_event), (gst_wavpack_parse_init), (gst_wavpack_parse_loop): * ext/wavpack/gstwavpackparse.h: Queue incoming events if there's no source pad yet and send them downstream later when the pad is there. 2006-07-18 16:47:25 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackdec.*: Output audio in native byte order (which is also how we get samples from wavpack); outpu... Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_init), (gst_wavpack_dec_format_samples), (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), (gst_wavpack_dec_change_state): * ext/wavpack/gstwavpackdec.h: Output audio in native byte order (which is also how we get samples from wavpack); output samples with 21-24 bit depth with 32 bit width (makes things easier for us). 2006-07-18 15:53:35 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackdec.*: More clean-ups: remove most of the disfunctional correction pad stuff for now, if it eve... Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init), (gst_wavpack_dec_class_init), (gst_wavpack_dec_init), (gst_wavpack_dec_finalize), (gst_wavpack_dec_format_samples), (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), (gst_wavpack_dec_sink_event), (gst_wavpack_dec_change_state): * ext/wavpack/gstwavpackdec.h: More clean-ups: remove most of the disfunctional correction pad stuff for now, if it ever gets implemented a lot of stuff will have to be rewritten anyway; redo chain function, move errors to end, error out instead of g_assert()ing. Also rename overly long variable 'wavpackdec' to just 'dec'; miscellaneous other small stuff. 2006-07-18 14:08:06 +0000 Sebastian Dröge configure.ac: Check for wavpack version and define WAVPACK_OLD_API if necessary. Original commit message from CVS: Patch by: Sebastian Dröge * configure.ac: Check for wavpack version and define WAVPACK_OLD_API if necessary. * ext/wavpack/Makefile.am: * ext/wavpack/gstwavpackcommon.c: (gst_wavpack_read_header), (gst_wavpack_read_metadata): * ext/wavpack/gstwavpackcommon.h: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init), (gst_wavpack_dec_class_init), (gst_wavpack_dec_init), (gst_wavpack_dec_finalize), (gst_wavpack_dec_format_samples), (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), (gst_wavpack_dec_sink_event), (gst_wavpack_dec_change_state), (gst_wavpack_dec_request_new_pad), (gst_wavpack_dec_plugin_init): * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), (gst_wavpack_enc_init), (gst_wavpack_enc_finalize), (gst_wavpack_enc_set_wp_config): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), (gst_wavpack_parse_finalize), (gst_wavpack_parse_class_init), (gst_wavpack_parse_index_get_entry_from_sample), (gst_wavpack_parse_scan_to_find_sample), (gst_wavpack_parse_handle_seek_event), (gst_wavpack_parse_create_src_pad): * ext/wavpack/gstwavpackstreamreader.c: * ext/wavpack/gstwavpackstreamreader.h: Port to new/official wavpack API, don't use API that was exported in wavpack header files and in the lib but meant to be private, at least not for recent wavpack versions; misc. 'cleanups' (#347443). 2006-07-17 10:25:57 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Store duration in uint64 too instead of clipping. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), (gst_qtdemux_prepare_current_sample), (gst_qtdemux_loop_state_movie): Store duration in uint64 too instead of clipping. When we do a keyframe seek and the requested time is at the keyframe, don't seek back to the beginning of the keyframe. Fixes #347439. 2006-07-17 10:22:54 +0000 Wim Taymans ext/libpng/gstpngdec.*: Use statically allocated segment instead of leaking. Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_init), (buffer_clip), (gst_pngdec_caps_create_and_set), (gst_pngdec_task), (gst_pngdec_chain), (gst_pngdec_sink_event), (gst_pngdec_libpng_init), (gst_pngdec_change_state), (gst_pngdec_sink_activate_push): * ext/libpng/gstpngdec.h: Use statically allocated segment instead of leaking. Various cleanups. Fix flush and seek handling. 2006-07-16 14:31:48 +0000 Wim Taymans gst/rtp/: Added simple generic mpeg4 depayloader. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_base_init), (gst_rtp_mp4g_depay_class_init), (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_set_property), (gst_rtp_mp4g_depay_get_property), (gst_rtp_mp4g_depay_change_state), (gst_rtp_mp4g_depay_plugin_init): * gst/rtp/gstrtpmp4gdepay.h: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init), (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_setcaps), (gst_rtp_mp4g_pay_flush): Added simple generic mpeg4 depayloader. Fix generic mpeg4 payloader. 2006-07-15 15:25:05 +0000 Tim-Philipp Müller gst/rtsp/gstrtspsrc.c: Don't try doing state changes on a NULL pointer. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state): Don't try doing state changes on a NULL pointer. 2006-07-15 11:50:25 +0000 Stefan Kost gst/spectrum/: Do not use deprecated gtk functions. Original commit message from CVS: * gst/spectrum/demo-audiotest.c: (main): * gst/spectrum/demo-osssrc.c: (main): Do not use deprecated gtk functions. 2006-07-14 13:33:54 +0000 Sebastien Cote gst/rtp/gstrtpamrdepay.*: rtpamrdec isn't a subclass of GstBaseRtpDepayload. Original commit message from CVS: Patch by: Sebastien Cote * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_base_init), (gst_rtp_amr_depay_class_init), (gst_rtp_amr_depay_init), (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): * gst/rtp/gstrtpamrdepay.h: rtpamrdec isn't a subclass of GstBaseRtpDepayload. Fixes #321191 2006-07-14 12:01:05 +0000 Zaheer Abbas Merali sys/ximage/gstximagesrc.c: Fix segfault when moving mouse pointer to the bottom right corner. Original commit message from CVS: 2006-07-14 Zaheer Abbas Merali * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), (gst_ximage_src_get_caps), (gst_ximage_src_class_init): Fix segfault when moving mouse pointer to the bottom right corner. 2006-07-13 15:22:20 +0000 Thomas Vander Stichele * common: * docs/plugins/inspect/plugin-qtdemux.xml: remove sdlvideosink plugin and update the rest Original commit message from CVS: remove sdlvideosink plugin and update the rest 2006-07-12 09:34:15 +0000 Wim Taymans gst/rtp/: Added mpeg2 TS depayloader. Closing #347234. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_base_init), (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_process), (gst_rtp_mp2t_depay_set_property), (gst_rtp_mp2t_depay_get_property), (gst_rtp_mp2t_depay_change_state), (gst_rtp_mp2t_depay_plugin_init): * gst/rtp/gstrtpmp2tdepay.h: Added mpeg2 TS depayloader. Closing #347234. 2006-07-12 09:28:46 +0000 Tim-Philipp Müller gst/spectrum/gstspectrum.c: Fix typo in property nick. Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): Fix typo in property nick. 2006-07-11 22:46:47 +0000 Tim-Philipp Müller ext/cdio/gstcdiocddasrc.c: Remove g_assert that shouldn't be there. Original commit message from CVS: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_close): Remove g_assert that shouldn't be there. 2006-07-10 20:11:34 +0000 Edward Hervey gst/avi/gstavidemux.*: Don't push tag events found by gst_riff_parse_info() before outputting Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_stream_header), (push_tag_lists): * gst/avi/gstavidemux.h: Don't push tag events found by gst_riff_parse_info() before outputting GST_EVENT_NEWSEGMENT. 2006-07-10 16:41:57 +0000 Wim Taymans gst/rtsp/: replaced closesocket and close in code with one CLOSE_SOCKET. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/rtspconnection.c: (rtsp_connection_send), (rtsp_connection_close): * gst/rtsp/rtspdefs.h: replaced closesocket and close in code with one CLOSE_SOCKET. Some more cleanups. Fixes #345301. 2006-07-10 15:26:39 +0000 Tim-Philipp Müller gst/autodetect/gstautoaudiosink.c: Fix example pipeline in docs. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: Fix example pipeline in docs. 2006-07-10 14:49:46 +0000 Wim Taymans gst/filter/: Don't forget new files. Original commit message from CVS: * gst/filter/gstbpwsinc.h: * gst/filter/gstiir.h: * gst/filter/gstlpwsinc.h: Don't forget new files. 2006-07-10 14:42:15 +0000 Mathis Hofer Ported the gstfilter plugin to GStreamer 0.10. Original commit message from CVS: Patch by: Mathis Hofer * configure.ac: * gst/filter/Makefile.am: * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), (gst_bpwsinc_base_init), (gst_bpwsinc_class_init), (gst_bpwsinc_init), (bpwsinc_set_caps), (bpwsinc_transform_ip), (bpwsinc_set_property), (bpwsinc_get_property): * gst/filter/gstfilter.c: (plugin_init): * gst/filter/gstfilter.h: * gst/filter/gstiir.c: (gst_iir_dispose), (gst_iir_base_init), (gst_iir_class_init), (gst_iir_init), (iir_set_caps), (iir_transform_ip), (iir_set_property), (iir_get_property): * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), (gst_lpwsinc_base_init), (gst_lpwsinc_class_init), (gst_lpwsinc_init), (lpwsinc_set_caps), (lpwsinc_transform_ip), (lpwsinc_set_property), (lpwsinc_get_property): Ported the gstfilter plugin to GStreamer 0.10. 2006-07-10 10:21:57 +0000 Rob Taylor gst/udp/gstmultiudpsink.c: If a destination is added before the stream is set to PAUSED, the multicast group is not j... Original commit message from CVS: Patch by: Rob Taylor * gst/udp/gstmultiudpsink.c: (join_multicast), (gst_multiudpsink_init_send), (gst_multiudpsink_add): If a destination is added before the stream is set to PAUSED, the multicast group is not joined as the socket is not created yet. Also TTL and LOOP should also be set. Fixes #346921. 2006-07-10 09:57:26 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Extract comment information!! Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): Extract comment information!! 2006-07-10 09:46:25 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Extract year/date information (fixes #347079). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), (qtdemux_tag_add_date): Extract year/date information (fixes #347079). 2006-07-08 22:41:25 +0000 Zaheer Abbas Merali sys/ximage/gstximagesrc.*: Fix use-damage property to actually work :) Original commit message from CVS: 2006-07-09 Zaheer Abbas Merali * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), (gst_ximage_src_set_property), (gst_ximage_src_get_property), (gst_ximage_src_get_caps), (gst_ximage_src_class_init), (gst_ximage_src_init): * sys/ximage/gstximagesrc.h: Fix use-damage property to actually work :) Add startx, starty, endx, endy properties so screencasts other than full screen ones can work. 2006-07-08 19:03:54 +0000 Zaheer Abbas Merali sys/ximage/gstximagesrc.*: Add use_damage property to offer ability to choose whether to use Original commit message from CVS: 2006-07-08 Zaheer Abbas Merali * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), (gst_ximage_src_set_property), (gst_ximage_src_get_property), (gst_ximage_src_class_init), (gst_ximage_src_init): * sys/ximage/gstximagesrc.h: Add use_damage property to offer ability to choose whether to use XDamage or not. 2006-07-07 15:04:29 +0000 Wim Taymans gst/goom/filters.c: Avoid goom coredumping by clearing memory. Original commit message from CVS: * gst/goom/filters.c: (zoomFilterSetResolution): Avoid goom coredumping by clearing memory. Fixes 345679. 2006-07-07 14:30:26 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Don't crash on twos/sowt/raw audio. #345830. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Don't crash on twos/sowt/raw audio. #345830. 2006-07-05 20:21:02 +0000 Sébastien Moutte win32/vs6/libgstid3demux.dsp: Add a link to libgsttag-0.10.lib. Original commit message from CVS: * win32/vs6/libgstid3demux.dsp: Add a link to libgsttag-0.10.lib. 2006-07-05 14:52:13 +0000 Tim-Philipp Müller gst/: Don't return FLOW_UNEXPECTED when a buffer is before the start of the stream (which might happen with large ID3... Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_trim_buffer), (gst_tag_demux_read_range): * gst/id3demux/gstid3demux.c: (gst_id3demux_trim_buffer), (gst_id3demux_read_range): Don't return FLOW_UNEXPECTED when a buffer is before the start of the stream (which might happen with large ID3v2 tags if the tag reading was done pullrange based and we then switched to push mode later on). Fixes regression introduced by commit from June 29th. 2006-07-05 10:14:16 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: Make UTF-8 the default encoding when writing string tags (before, our UTF-8 strings would ... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Make UTF-8 the default encoding when writing string tags (before, our UTF-8 strings would automatically be converted to ISO-8859-1 by taglib and written as ISO-8859-1 fields if that was possible). * tests/check/elements/id3v2mux.c: (utf8_string_in_buf), (test_taglib_id3mux_check_tag_buffer), (identity_cb), (test_taglib_id3mux_with_tags): Add test case that makes sure our UTF-8 strings have actually been written into the tag as UTF-8. 2006-07-04 16:00:26 +0000 Tim-Philipp Müller configure.ac: Let's try that again. Original commit message from CVS: * configure.ac: Let's try that again. 2006-07-04 15:40:47 +0000 Tim-Philipp Müller configure.ac: Disable monoscope plugin for now until it fulfills all the requirements. Original commit message from CVS: * configure.ac: Disable monoscope plugin for now until it fulfills all the requirements. 2006-07-03 20:35:45 +0000 Tim-Philipp Müller Port monoscope visualisation to 0.10. Original commit message from CVS: * configure.ac: * gst/monoscope/Makefile.am: * gst/monoscope/gstmonoscope.c: (gst_monoscope_base_init), (gst_monoscope_class_init), (gst_monoscope_init), (gst_monoscope_finalize), (gst_monoscope_reset), (gst_monoscope_sink_setcaps), (gst_monoscope_src_setcaps), (gst_monoscope_src_negotiate), (get_buffer), (gst_monoscope_chain), (gst_monoscope_sink_event), (gst_monoscope_src_event), (gst_monoscope_change_state), (plugin_init): * gst/monoscope/gstmonoscope.h: Port monoscope visualisation to 0.10. 2006-07-03 20:02:56 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix silly crasher in state change function; add Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (gst_qtdemux_loop_state_header), (qtdemux_video_caps): Fix silly crasher in state change function; add IV41 fourcc (see bug #171111); don't output confusing debug message when skipping atoms. 2006-07-03 16:43:10 +0000 Tim-Philipp Müller gst/: Return FLOW_UNEXPECTED when at the end of the file, not Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain): * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): Return FLOW_UNEXPECTED when at the end of the file, not FLOW_ERROR. Fixes 'internal stream error' errors that would sometimes occur in totem when scrubbing to the end of an ID3v1 tagged mp3 file. 2006-07-03 15:31:22 +0000 Edward Hervey ext/libpng/gstpngdec.*: Implement buffer clipping/dropping using GstSegment. Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_init), (user_info_callback), (buffer_clip), (user_end_callback), (gst_pngdec_chain), (gst_pngdec_sink_event), (gst_pngdec_change_state): * ext/libpng/gstpngdec.h: Implement buffer clipping/dropping using GstSegment. This provides accurate seeking. 2006-07-03 15:28:48 +0000 Edward Hervey gst/avi/gstavidemux.*: Proper aggregation of each stream's GstFlowReturn in order to figure out whether the task shou... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_read_subindexes), (gst_avi_demux_parse_stream), (gst_avi_demux_handle_seek), (gst_avi_demux_aggregated_flow), (gst_avi_demux_process_next_entry), (push_tag_lists), (gst_avi_demux_stream_data), (gst_avi_demux_loop): * gst/avi/gstavidemux.h: Proper aggregation of each stream's GstFlowReturn in order to figure out whether the task should stop or not. Don't send inline events before pushing out a NEW_SEGMENT, more specifically for GST_TAG_EVENT. Change a GST_ERROR to a GST_WARNING for a non-fatal situation in reading sub-indexes. 2006-06-30 07:11:24 +0000 Brian Cameron sys/sunaudio/gstsunaudiomixerctrl.c: Move "Monitor" slider to input tab so it works more like sdtaudiocontrol, which ... Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_build_list): Move "Monitor" slider to input tab so it works more like sdtaudiocontrol, which is what people on Solaris are used to using for their mixer program (#346259). 2006-06-29 14:50:18 +0000 Thomas Vander Stichele tests/check/elements/level.c: fix a leak, clean up at the end Original commit message from CVS: * tests/check/elements/level.c: (GST_START_TEST): fix a leak, clean up at the end 2006-06-29 11:41:55 +0000 Tim-Philipp Müller gst/matroska/: Send tag event after newsegment event. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_send_event), (gst_matroska_demux_loop_stream_parse_id): * gst/matroska/matroska-ids.h: Send tag event after newsegment event. 2006-06-29 11:11:50 +0000 Tim-Philipp Müller gst/id3demux/gstid3demux.c: Make sure we don't return GST_FLOW_OK with a NULL buffer in certain cases where a read be... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_trim_buffer), (gst_id3demux_read_range): Make sure we don't return GST_FLOW_OK with a NULL buffer in certain cases where a read beyond the end of the file is requested. Fixes #345930. * gst/apetag/gsttagdemux.c: (gst_tag_demux_trim_buffer), (gst_tag_demux_read_range): Fix same issue here as well. 2006-06-29 11:05:14 +0000 Zaheer Abbas Merali sys/ximage/gstximagesrc.c: Fix hypothetical crash. Original commit message from CVS: 2006-06-29 Zaheer Abbas Merali * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get): Fix hypothetical crash. 2006-06-28 08:36:30 +0000 Brian Cameron sys/sunaudio/gstsunaudiosink.c: Do not modify the ports value. If the user has turned off the built-in speakers, then... Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_prepare): Do not modify the ports value. If the user has turned off the built-in speakers, then we should not reset it in the prepare function, since this causes the built-in speakers to turn back on anytime the user changes a track in totem, rhythmbox, etc. (#346066). 2006-06-23 09:35:45 +0000 Wim Taymans gst/goom/gstgoom.c: Fix double caps unref when negotiation fails. Original commit message from CVS: * gst/goom/gstgoom.c: (gst_goom_src_negotiate): Fix double caps unref when negotiation fails. 2006-06-22 19:31:04 +0000 Tim-Philipp Müller Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) plus two minor macro fixes. Original commit message from CVS: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/annodex/gstcmmlparser.c: * ext/dv/gstdvdec.c: * ext/dv/gstdvdemux.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokedec.c: * ext/jpeg/gstsmokeenc.c: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/speex/gstspeexenc.c: * gst/alpha/gstalphacolor.c: * gst/cutter/gstcutter.c: * gst/debug/gstnavigationtest.c: * gst/icydemux/gsticydemux.c: * gst/level/gstlevel.c: * gst/multipart/multipart.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspsrc.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpsrc.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstvideoflip.c: Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) plus two minor macro fixes. 2006-06-22 16:27:03 +0000 Tim-Philipp Müller gst/matroska/: Try to fix up broken matroska files containing subtitle streams with non-UTF8 character encodings (cou... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_check_subtitle_buffer), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_subtitle_caps): * gst/matroska/matroska-ids.c: (gst_matroska_track_init_subtitle_context): * gst/matroska/matroska-ids.h: Try to fix up broken matroska files containing subtitle streams with non-UTF8 character encodings (courtesy of mkvmerge) using either the encoding specified in the GST_SUBTITLE_ENCODING environment variable or the current locale's character set if it is non-UTF8. Fixes #337076. 2006-06-22 12:17:13 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Set image type from APIC frame as "image-type" field of GST_TAG_IMAGE buffer caps (#344605). Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_picture_frame): Set image type from APIC frame as "image-type" field of GST_TAG_IMAGE buffer caps (#344605). 2006-06-20 19:40:29 +0000 Tim-Philipp Müller ext/flac/: Support chain-based operation, should make flac-over-DAAP work (#340492). Original commit message from CVS: * ext/flac/Makefile.am: * ext/flac/gstflacdec.c: (gst_flac_dec_init), (gst_flac_dec_reset_decoders), (gst_flac_dec_setup_seekable_decoder), (gst_flac_dec_setup_stream_decoder), (gst_flac_dec_finalize), (gst_flac_dec_metadata_callback), (gst_flac_dec_metadata_callback_seekable), (gst_flac_dec_metadata_callback_stream), (gst_flac_dec_error_callback), (gst_flac_dec_error_callback_seekable), (gst_flac_dec_error_callback_stream), (gst_flac_dec_read_seekable), (gst_flac_dec_read_stream), (gst_flac_dec_write), (gst_flac_dec_write_seekable), (gst_flac_dec_write_stream), (gst_flac_dec_loop), (gst_flac_dec_sink_event), (gst_flac_dec_chain), (gst_flac_dec_convert_sink), (gst_flac_dec_get_sink_query_types), (gst_flac_dec_sink_query), (gst_flac_dec_get_src_query_types), (gst_flac_dec_src_query), (gst_flac_dec_handle_seek_event), (gst_flac_dec_sink_activate), (gst_flac_dec_sink_activate_push), (gst_flac_dec_sink_activate_pull), (gst_flac_dec_change_state): * ext/flac/gstflacdec.h: Support chain-based operation, should make flac-over-DAAP work (#340492). 2006-06-20 15:35:05 +0000 Wim Taymans docs/plugins/gst-plugins-good-plugins-sections.txt: Doc updates, merge some unused symbols. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins-sections.txt: Doc updates, merge some unused symbols. 2006-06-20 14:57:09 +0000 Wim Taymans Added documentation for the rtsp plugin. Fixes #345393. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/rtsp/gstrtpdec.c: (gst_rtpdec_class_init): * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: Added documentation for the rtsp plugin. Fixes #345393. 2006-06-20 12:10:29 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Use better G_OS_* macros. Fixes #345301 some more. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (inet_aton), (rtsp_connection_send), (rtsp_connection_close), (rtsp_connection_free): Use better G_OS_* macros. Fixes #345301 some more. 2006-06-20 10:35:48 +0000 Brian Cameron sys/sunaudio/: Add a SunAudio source plugin. Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/Makefile.am: * sys/sunaudio/gstsunaudio.c: (plugin_init): * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_build_list), (gst_sunaudiomixer_ctrl_new), (gst_sunaudiomixer_ctrl_list_tracks), (gst_sunaudiomixer_ctrl_get_volume), (gst_sunaudiomixer_ctrl_set_volume), (gst_sunaudiomixer_ctrl_set_mute), (gst_sunaudiomixer_ctrl_set_record): * sys/sunaudio/gstsunaudiomixerctrl.h: * sys/sunaudio/gstsunaudiomixertrack.c: (gst_sunaudiomixer_track_init), (gst_sunaudiomixer_track_new): * sys/sunaudio/gstsunaudiomixertrack.h: * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_dispose), (gst_sunaudiosrc_base_init), (gst_sunaudiosrc_class_init), (gst_sunaudiosrc_init), (gst_sunaudiosrc_set_property), (gst_sunaudiosrc_get_property), (gst_sunaudiosrc_getcaps), (gst_sunaudiosrc_open), (gst_sunaudiosrc_close), (gst_sunaudiosrc_prepare), (gst_sunaudiosrc_unprepare), (gst_sunaudiosrc_read), (gst_sunaudiosrc_delay), (gst_sunaudiosrc_reset): * sys/sunaudio/gstsunaudiosrc.h: Add a SunAudio source plugin. Support stereo and right/left channel gain in the mixer plugin. Support the RECORD flag so that you can switch between line-input and microphone in gnome-volume-control. Code cleanups like using an enumerator for track number instead of an integer. Fixes #344923. 2006-06-20 10:31:41 +0000 Joni Valtanen gst/rtsp/rtspconnection.c: Make RTSP plugin compile on windows. Fixes #345301. Original commit message from CVS: Patch by: Joni Valtanen * gst/rtsp/rtspconnection.c: (inet_aton), (rtsp_connection_send), (rtsp_connection_close): Make RTSP plugin compile on windows. Fixes #345301. Some changes to original patch to catch errors better. use ifdef WIN32 instead of ifndef. 2006-06-19 10:00:18 +0000 Zaheer Abbas Merali configure.ac: If we have libraw1394 >= 1.2.1, then we need libiec61883. Original commit message from CVS: 2006-06-19 Zaheer Abbas Merali * configure.ac: If we have libraw1394 >= 1.2.1, then we need libiec61883. 2006-06-18 14:00:19 +0000 Edward Hervey ext/jpeg/gstjpegdec.c: After a failed buffer alloc, we need to abort the jpeg decoding (it started when parsing heade... Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): After a failed buffer alloc, we need to abort the jpeg decoding (it started when parsing headers to figure out how many bytes we need to request downstream). 2006-06-18 12:37:12 +0000 Mark Nauwelaerts gst/wavparse/gstwavparse.c: Make sure we don't read beyond the end of the file (#345232). Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek): Make sure we don't read beyond the end of the file (#345232). 2006-06-17 14:35:37 +0000 Tim-Philipp Müller configure.ac: Fix --disable-external (can't set conditionals conditionally, #343602). Original commit message from CVS: * configure.ac: Fix --disable-external (can't set conditionals conditionally, #343602). 2006-06-16 12:35:08 +0000 Zaheer Abbas Merali gst/spectrum/Makefile.am: Fix build. Original commit message from CVS: 2006-06-16 Zaheer Abbas Merali * gst/spectrum/Makefile.am: Fix build. 2006-06-16 10:56:24 +0000 Tim-Philipp Müller Use GST_PLUGIN_DOCS, --enable-plugin-docs etc. Original commit message from CVS: * autogen.sh: * configure.ac: * docs/Makefile.am: Use GST_PLUGIN_DOCS, --enable-plugin-docs etc. * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/inspect/plugin-taglib.xml: Add/fix apev2mux docs. 2006-06-16 09:49:07 +0000 Stefan Kost gst/spectrum/: port to use message to get results, cleanly exit when closing the window Original commit message from CVS: * gst/spectrum/demo-audiotest.c: (on_window_destroy), (draw_spectrum), (message_handler), (main): * gst/spectrum/demo-osssrc.c: (on_window_destroy), (draw_spectrum), (message_handler), (main): port to use message to get results, cleanly exit when closing the window * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_dispose), (gst_spectrum_set_property), (gst_spectrum_get_property), (gst_spectrum_set_caps), (gst_spectrum_start), (gst_spectrum_message_new), (gst_spectrum_transform_ip): * gst/spectrum/gstspectrum.h: port to derive from basetransform and send results via messages (like level element) 2006-06-15 15:58:09 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Combine return values from src pad pushes. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), (gst_qtdemux_combine_flows), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), (gst_qtdemux_chain), (qtdemux_parse_trak): Combine return values from src pad pushes. 2006-06-15 08:50:09 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Don't crash on files with 0 samples, EOS immediatly instead. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header), (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample), (gst_qtdemux_add_stream): Don't crash on files with 0 samples, EOS immediatly instead. Fixes #344944. 2006-06-14 15:59:56 +0000 Wim Taymans ext/dv/gstdvdec.c: Reset segment info on flush. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), (gst_dvdec_finalize), (gst_dvdec_sink_event), (gst_dvdec_change_state): Reset segment info on flush. Alloc segment in _init, free in _finalize. * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek): Don't send segments twice. 2006-06-14 15:07:22 +0000 Wim Taymans ext/dv/gstdvdemux.c: Respect segment.stop. Fixes #342592. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame): Respect segment.stop. Fixes #342592. 2006-06-14 11:28:41 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: No language specified means the implied language is English according to the matroska ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): No language specified means the implied language is English according to the matroska spec (partially fixes #344708); add some more debug output. 2006-06-14 09:32:27 +0000 Sebastian Dröge ext/wavpack/gstwavpackenc.*: Use bitrate property solely for bitrates and add new bits-per-sample property for the ot... Original commit message from CVS: Patch by: Sebastian Dröge * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), (gst_wavpack_enc_class_init), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_chain), (gst_wavpack_enc_sink_event), (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): * ext/wavpack/gstwavpackenc.h: Use bitrate property solely for bitrates and add new bits-per-sample property for the other stuff. Set duration to 'unknown' in initial header and resend header with proper duration on EOS; update Sebastian's e-mail address. 2006-06-14 08:06:43 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: When operating chain-based, don't make any assumptions about the chunking of the incoming... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_peek_chunk_info), (gst_wavparse_peek_chunk), (gst_wavparse_stream_headers), (gst_wavparse_chain): When operating chain-based, don't make any assumptions about the chunking of the incoming data and make streaming work on days other than the second Thursday after a full moon. Also fix up debug messages here and there and make use of the most excellent new gst_pad_query_peer_duration() utility function. Skip any 'bext' chunks in front of the 'fmt ' chunk. Fixes #343837. * gst/wavparse/gstwavparse.h: Remove trailing comma after last enum value, some compilers don't like that. 2006-06-13 17:05:25 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Handle premature EOS gracefully. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_data): Handle premature EOS gracefully. 2006-06-13 09:54:26 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Prevent out of bounds array access when scrubbing towards the end of the file between the last... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): Prevent out of bounds array access when scrubbing towards the end of the file between the last index entry and the end. Fixes occasional 'start <= stop' newsegment event assertions when scrubbing in MJPEG files. 2006-06-12 11:13:39 +0000 Tim-Philipp Müller tests/check/elements/.cvsignore: And another one. Original commit message from CVS: * tests/check/elements/.cvsignore: And another one. 2006-06-12 11:04:59 +0000 Tim-Philipp Müller gst/spectrum/.cvsignore: Ignore more. Original commit message from CVS: * gst/spectrum/.cvsignore: Ignore more. 2006-06-12 10:53:26 +0000 Tim-Philipp Müller ext/libmms/gstmms.c: Set caps on outgoing buffers. Original commit message from CVS: * ext/libmms/gstmms.c: (gst_mms_create): Set caps on outgoing buffers. * sys/directdraw/gstdirectdrawsink.c: (gst_directdrawsink_init): Comment out unused global instance variable. 2006-06-11 19:31:10 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Extract images from ID3v2 tags (APIC frames). Fixes #339704. Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (scan_encoded_string), (parse_picture_frame): Extract images from ID3v2 tags (APIC frames). Fixes #339704. * configure.ac: Require core >= 0.10.8 (for GST_TAG_IMAGE and GST_TAG_PPEVIEW_IMAGE used in the patch above). 2006-06-11 18:56:24 +0000 Thomas Vander Stichele * ext/raw1394/.gitignore: * ext/taglib/.gitignore: * tests/check/elements/.gitignore: * tests/examples/level/.gitignore: moap ignore Original commit message from CVS: moap ignore 2006-06-11 18:52:19 +0000 Thomas Vander Stichele ext/raw1394/gstdv1394src.c: gratuitous comment changes Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_discover_avc_node): gratuitous comment changes * tests/check/elements/level.c: (GST_START_TEST): fix level test leaks 2006-06-11 18:44:54 +0000 Thomas Vander Stichele * .gitignore: ignore more Original commit message from CVS: ignore more 2006-06-11 18:20:39 +0000 Tim-Philipp Müller gst/: Use gst_pad_query_peer_duration() utility function here. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_get_upstream_size): * gst/id3demux/gstid3demux.c: (id3demux_get_upstream_size): Use gst_pad_query_peer_duration() utility function here. 2006-06-11 13:57:19 +0000 Thomas Vander Stichele autogen.sh: require am17 Original commit message from CVS: * autogen.sh: require am17 * configure.ac: * ext/annodex/Makefile.am: * ext/cdio/Makefile.am: * ext/dv/Makefile.am: * ext/esd/Makefile.am: * ext/flac/Makefile.am: * ext/gdk_pixbuf/Makefile.am: * ext/ladspa/Makefile.am: * ext/libcaca/Makefile.am: * ext/speex/Makefile.am: * ext/taglib/Makefile.am: * sys/oss/Makefile.am: * sys/sunaudio/Makefile.am: * sys/ximage/Makefile.am: clean up build further 2006-06-11 13:55:34 +0000 Thomas Vander Stichele * common: * win32/common/config.h: update Original commit message from CVS: update 2006-06-10 15:33:18 +0000 Sebastian Dröge ext/wavpack/: Add wavpack encoder element (#343131). Original commit message from CVS: Patch by: Sebastian Dröge * ext/wavpack/Makefile.am: * ext/wavpack/gstwavpack.c: (plugin_init): * ext/wavpack/gstwavpackcommon.h: * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), (gst_wavpack_enc_correction_mode_get_type), (gst_wavpack_enc_joint_stereo_mode_get_type), (gst_wavpack_enc_base_init), (gst_wavpack_enc_class_init), (gst_wavpack_enc_init), (gst_wavpack_enc_dispose), (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_format_samples), (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), (gst_wavpack_enc_sink_event), (gst_wavpack_enc_change_state), (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property), (gst_wavpack_enc_plugin_init): * ext/wavpack/gstwavpackenc.h: * ext/wavpack/md5.c: * ext/wavpack/md5.h: Add wavpack encoder element (#343131). 2006-06-09 20:36:00 +0000 Tim-Philipp Müller gconf/Makefile.am: Honour --disable-schemas-install configure option. Fixes #344100. Original commit message from CVS: * gconf/Makefile.am: Honour --disable-schemas-install configure option. Fixes #344100. 2006-06-09 18:33:01 +0000 Tim-Philipp Müller tests/examples/level/Makefile.am: Add -lm to LIBS for pow() function, don't assume one of our dependencies (such as l... Original commit message from CVS: * tests/examples/level/Makefile.am: Add -lm to LIBS for pow() function, don't assume one of our dependencies (such as libxml-2.0) drags it in automatically (#343603). 2006-06-09 18:17:23 +0000 Peter Kjellerstedt configure.ac: We should use $SED and not $(SED) in configure.ac (#343678). Original commit message from CVS: Patch by: Peter Kjellerstedt * configure.ac: We should use $SED and not $(SED) in configure.ac (#343678). 2006-06-09 17:38:19 +0000 Tim-Philipp Müller configure.ac: Check for X before using X_CFLAGS in the check for opengl (#343866). Original commit message from CVS: * configure.ac: Check for X before using X_CFLAGS in the check for opengl (#343866). * ext/musepack/Makefile.am: * ext/wavpack/Makefile.am: * gst/speed/Makefile.am: Add missing GST_LIBS, fixes build on cygwin (#343866). 2006-06-09 17:29:08 +0000 Brian Cameron sys/sunaudio/: Attached find a patch that fixes a number of bugs with the SunAudio mixer plugin and fixes #344101: 1.... Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_open), (gst_sunaudiomixer_ctrl_build_list), (gst_sunaudiomixer_ctrl_new), (gst_sunaudiomixer_ctrl_set_volume), (gst_sunaudiomixer_ctrl_set_mute): * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_class_init), (gst_sunaudiosink_init), (gst_sunaudiosink_prepare), (gst_sunaudiosink_write): Attached find a patch that fixes a number of bugs with the SunAudio mixer plugin and fixes #344101: 1. The gst_sunaudiomixer_ctrl_build_list kept appending the same 3 tracks onto the tracklist causing gnome-volume-control's preferences dialog to be messed up and would core dump if you checked/unchecked any item. 2. We weren't previously setting the MUTE flag properly. Fixing this makes gnome-volume-control work better. 3. Now we properly define the input track to be GST_MIXER_TRACK_INPUT and the monitor to be GST_MIXER_TRACK_OUTPUT, so that makes gnome-volume-control look better. Also some minor cleanup in gstsunaudiosink.c. 2006-06-09 17:12:52 +0000 Wim Taymans ext/jpeg/gstjpegdec.*: API: Added IDCT method property Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_idct_method_get_type), (gst_jpeg_dec_class_init), (gst_jpeg_dec_init), (gst_jpeg_dec_decode_indirect), (gst_jpeg_dec_decode_direct), (gst_jpeg_dec_chain), (gst_jpeg_dec_sink_event), (gst_jpeg_dec_set_property), (gst_jpeg_dec_get_property): * ext/jpeg/gstjpegdec.h: API: Added IDCT method property Small cleanups. Avoid dynamic allocation of trivial fixed structure. Allocate enough space for temp 4:4:4 YUV buffers. Fixes #343661. 2006-06-07 09:25:16 +0000 Zaheer Abbas Merali configure.ac: We now require libraw1394 >= 1.1.0 and that version onwards all have .pc files. Original commit message from CVS: 2006-06-07 Zaheer Abbas Merali * configure.ac: We now require libraw1394 >= 1.1.0 and that version onwards all have .pc files. 2006-06-02 15:02:54 +0000 Edward Hervey gst/law/alaw-decode.c: Trying to get items from an ANY or EMPTY caps is ... stupid. Original commit message from CVS: * gst/law/alaw-decode.c: (alawdec_getcaps): Trying to get items from an ANY or EMPTY caps is ... stupid. 2006-06-02 11:33:18 +0000 Edward Hervey ext/dv/gstdvdec.*: Added GstSegment handling, now implements dropping/clipping. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_event), (gst_dvdec_chain), (gst_dvdec_change_state): * ext/dv/gstdvdec.h: Added GstSegment handling, now implements dropping/clipping. 2006-06-01 22:00:26 +0000 Stefan Kost Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass Original commit message from CVS: * ext/alsaspdif/alsaspdifsink.h: * ext/amrwb/gstamrwbdec.h: * ext/amrwb/gstamrwbenc.h: * ext/amrwb/gstamrwbparse.h: * ext/arts/gst_arts.h: * ext/artsd/gstartsdsink.h: * ext/audiofile/gstafparse.h: * ext/audiofile/gstafsink.h: * ext/audiofile/gstafsrc.h: * ext/audioresample/gstaudioresample.h: * ext/bz2/gstbz2dec.h: * ext/bz2/gstbz2enc.h: * ext/dirac/gstdiracdec.h: * ext/directfb/dfbvideosink.h: * ext/divx/gstdivxdec.h: * ext/divx/gstdivxenc.h: * ext/dts/gstdtsdec.h: * ext/faac/gstfaac.h: * ext/gsm/gstgsmdec.h: * ext/gsm/gstgsmenc.h: * ext/ivorbis/vorbisenc.h: * ext/libfame/gstlibfame.h: * ext/nas/nassink.h: * ext/neon/gstneonhttpsrc.h: * ext/polyp/polypsink.h: * ext/sdl/sdlaudiosink.h: * ext/sdl/sdlvideosink.h: * ext/shout/gstshout.h: * ext/snapshot/gstsnapshot.h: * ext/sndfile/gstsf.h: * ext/swfdec/gstswfdec.h: * ext/tarkin/gsttarkindec.h: * ext/tarkin/gsttarkinenc.h: * ext/theora/theoradec.h: * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackparse.h: * ext/xine/gstxine.h: * ext/xvid/gstxviddec.h: * ext/xvid/gstxvidenc.h: * gst/cdxaparse/gstcdxaparse.h: * gst/cdxaparse/gstcdxastrip.h: * gst/colorspace/gstcolorspace.h: * gst/festival/gstfestival.h: * gst/freeze/gstfreeze.h: * gst/gdp/gstgdpdepay.h: * gst/gdp/gstgdppay.h: * gst/modplug/gstmodplug.h: * gst/mpeg1sys/gstmpeg1systemencode.h: * gst/mpeg1videoparse/gstmp1videoparse.h: * gst/mpeg2sub/gstmpeg2subt.h: * gst/mpegaudioparse/gstmpegaudioparse.h: * gst/multifilesink/gstmultifilesink.h: * gst/overlay/gstoverlay.h: * gst/playondemand/gstplayondemand.h: * gst/qtdemux/qtdemux.h: * gst/rtjpeg/gstrtjpegdec.h: * gst/rtjpeg/gstrtjpegenc.h: * gst/smooth/gstsmooth.h: * gst/smoothwave/gstsmoothwave.h: * gst/spectrum/gstspectrum.h: * gst/speed/gstspeed.h: * gst/stereo/gststereo.h: * gst/switch/gstswitch.h: * gst/tta/gstttadec.h: * gst/tta/gstttaparse.h: * gst/videodrop/gstvideodrop.h: * gst/xingheader/gstxingmux.h: * sys/directdraw/gstdirectdrawsink.h: * sys/directsound/gstdirectsoundsink.h: * sys/dxr3/dxr3audiosink.h: * sys/dxr3/dxr3spusink.h: * sys/dxr3/dxr3videosink.h: * sys/qcam/gstqcamsrc.h: * sys/vcd/vcdsrc.h: Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass 2006-06-01 21:07:26 +0000 Stefan Kost Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass Original commit message from CVS: * ext/aalib/gstaasink.h: * ext/annodex/gstcmmldec.h: * ext/cairo/gsttimeoverlay.h: * ext/dv/gstdvdec.h: * ext/dv/gstdvdemux.h: * ext/esd/esdmon.h: * ext/esd/esdsink.h: * ext/flac/gstflacenc.h: * ext/gconf/gstgconfaudiosink.h: * ext/gconf/gstgconfaudiosrc.h: * ext/gconf/gstgconfvideosink.h: * ext/gconf/gstgconfvideosrc.h: * ext/gdk_pixbuf/gstgdkanimation.h: * ext/gdk_pixbuf/pixbufscale.h: * ext/hal/gsthalaudiosink.h: * ext/hal/gsthalaudiosrc.h: * ext/jpeg/gstjpegenc.h: * ext/jpeg/gstsmokedec.h: * ext/jpeg/gstsmokeenc.h: * ext/libcaca/gstcacasink.h: * ext/libmng/gstmngdec.h: * ext/libmng/gstmngenc.h: * ext/libpng/gstpngdec.h: * ext/libpng/gstpngenc.h: * ext/raw1394/gstdv1394src.h: * ext/speex/gstspeexenc.h: * gst/autodetect/gstautoaudiosink.h: * gst/autodetect/gstautovideosink.h: * gst/avi/gstavidemux.h: * gst/cutter/gstcutter.h: * gst/debug/efence.h: * gst/debug/gstnavigationtest.h: * gst/debug/gstnavseek.h: * gst/flx/gstflxdec.h: * gst/goom/gstgoom.h: * gst/icydemux/gsticydemux.h: * gst/id3demux/gstid3demux.h: * gst/law/alaw-decode.h: * gst/law/alaw-encode.h: * gst/law/mulaw-decode.h: * gst/law/mulaw-encode.h: * gst/matroska/matroska-mux.h: * gst/median/gstmedian.h: * gst/oldcore/gstaggregator.h: * gst/oldcore/gstfdsink.h: * gst/oldcore/gstmd5sink.h: * gst/oldcore/gstmultifilesrc.h: * gst/oldcore/gstpipefilter.h: * gst/oldcore/gstshaper.h: * gst/oldcore/gststatistics.h: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtppcmadepay.h: * gst/rtp/gstrtppcmapay.h: * gst/rtp/gstrtppcmudepay.h: * gst/rtp/gstrtppcmupay.h: * gst/rtp/gstrtpspeexdepay.h: * gst/rtp/gstrtpspeexpay.h: * gst/rtsp/gstrtpdec.h: * gst/rtsp/gstrtspsrc.h: * gst/smpte/gstsmpte.h: * gst/udp/gstdynudpsink.h: * gst/udp/gstmultiudpsink.h: * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.h: * gst/videofilter/gstvideobalance.h: * gst/videofilter/gstvideoflip.h: * sys/oss/gstossdmabuffer.h: * sys/oss/gstossmixerelement.h: * sys/oss/gstosssink.h: * sys/oss/gstosssrc.h: * sys/osxvideo/osxvideosink.h: * sys/sunaudio/gstsunaudiomixer.h: * sys/sunaudio/gstsunaudiosink.h: * sys/ximage/gstximagesrc.h: Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass 2006-05-31 16:23:54 +0000 Wim Taymans gst/goom/gstgoom.*: Handle QoS. Original commit message from CVS: * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), (gst_goom_finalize), (gst_goom_reset), (gst_goom_sink_setcaps), (gst_goom_src_setcaps), (gst_goom_src_event), (gst_goom_sink_event), (get_buffer), (gst_goom_chain), (gst_goom_change_state): * gst/goom/gstgoom.h: Handle QoS. Handle flushing, discont and events. Fix timestamps and various other cleanups. 2006-05-31 15:37:16 +0000 Zaheer Abbas Merali ext/raw1394/gstdv1394src.c: Fix bus reset when using libiec61883 Original commit message from CVS: 2006-05-31 Zaheer Abbas Merali * ext/raw1394/gstdv1394src.c: (gst_dv1394src_bus_reset): Fix bus reset when using libiec61883 2006-05-31 10:31:23 +0000 Zaheer Abbas Merali configure.ac: Detect libiec61883 and set necessary CFLAGS and LIBS for dv1394. Original commit message from CVS: 2006-05-31 Zaheer Abbas Merali * configure.ac: Detect libiec61883 and set necessary CFLAGS and LIBS for dv1394. * ext/raw1394/Makefile.am: Add CFLAGS. * ext/raw1394/gstdv1394src.c: (gst_dv1394src_iec61883_receive), New method, to receive using libiec61883. (gst_dv1394src_iso_receive), #ifdef'd out if libiec61883 is present. (gst_dv1394src_bus_reset), Get userdata correctly if using libiec61883. (gst_dv1394src_create), When using libiec61883, only poll one fd and no need to read. (gst_dv1394src_discover_avc_node), Replace g_warnings. (gst_dv1394src_start), Create new handle when we know which dv port. More reliable than setting port on an existing handle. Initialise libiec61883. (gst_dv1394src_stop): If using libiec61883, then cleanup its handle properly. * ext/raw1394/gstdv1394src.h: Add libiec61883 handle. 2006-05-30 21:07:38 +0000 Sébastien Moutte gst/avi/gstavidemux.c: add an explicit dll imported declaration for GST_CAT_EVENT+WIN32 Original commit message from CVS: * gst/avi/gstavidemux.c: add an explicit dll imported declaration for GST_CAT_EVENT+WIN32 * win32/MANIFEST: sort file listing * win32/vs6/libgstavi.dsp: add gstavimux.c to the project * win32/vs6/libgstid3demux.dsp: add link to zlib library * win32/vs6/libgstmatroska.dsp: add matroska-ids.c to the project 2006-05-30 14:35:18 +0000 Sebastian Dröge Add apev2mux element (#343122). Original commit message from CVS: Patch by: Sebastian Dröge * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/taglib/Makefile.am: * ext/taglib/gstapev2mux.cc: * ext/taglib/gstapev2mux.h: * ext/taglib/gstid3v2mux.cc: * ext/taglib/gsttaglibmux.c: (plugin_init): * ext/taglib/gsttaglibmux.h: Add apev2mux element (#343122). * tests/check/Makefile.am: * tests/check/elements/apev2mux.c: (test_taglib_apev2mux_create_tags), (test_taglib_apev2mux_check_tags), (fill_mp3_buffer), (got_buffer), (demux_pad_added), (test_taglib_apev2mux_check_output_buffer), (test_taglib_apev2mux_with_tags), (GST_START_TEST), (apev2mux_suite), (main): Add unit test for apev2mux element. 2006-05-28 17:33:13 +0000 Tim-Philipp Müller gst/: GST_PTR_FORMAT should be used to print caps in debug statements. Original commit message from CVS: * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps): * gst/debug/negotiation.c: (gst_negotiation_update_caps): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): GST_PTR_FORMAT should be used to print caps in debug statements. 2006-05-28 14:38:11 +0000 Sebastian Dröge gst/apetag/gstapedemux.c: Some clean-ups and additions: map APE 'file' tag to Original commit message from CVS: Patch by: Sebastian Dröge * gst/apetag/gstapedemux.c: (ape_demux_get_gst_tag_from_tag), (ape_demux_parse_tags): Some clean-ups and additions: map APE 'file' tag to GST_TAG_LOCATION (#343123); add support for extracting the track count and clean up parsing a bit (#343127). 2006-05-28 13:49:12 +0000 Edward Hervey ext/jpeg/gstjpegdec.c: Initialize segment to GST_FORMAT_UNDEFINED in READY->PAUSED. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_change_state): Initialize segment to GST_FORMAT_UNDEFINED in READY->PAUSED. 2006-05-28 13:30:13 +0000 Edward Hervey ext/jpeg/gstjpegdec.*: Clip outgoing buffers according to currently configured segment. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_finalize), (gst_jpeg_dec_init), (gst_jpeg_dec_chain), (gst_jpeg_dec_sink_event), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: Clip outgoing buffers according to currently configured segment. 2006-05-28 10:39:00 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: Handle writing of track-count or album-volume-count without track-number or albume-volume... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Handle writing of track-count or album-volume-count without track-number or albume-volume-number (in this case the number will just be set to 0). * tests/check/elements/id3v2mux.c: (test_taglib_id3mux_check_tags): It would be nice if we actually checked the values received for track/album-volume number/count in _check_tags(), rather than setting them again ... 2006-05-28 10:05:47 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: A track/volume number or count of 0 does not make sense, just ignore it along with negati... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): A track/volume number or count of 0 does not make sense, just ignore it along with negative numbers (a tag might only contain a track count without a track number). 2006-05-27 13:11:37 +0000 Edward Hervey ext/jpeg/gstjpegdec.c: Abort decompression when receiving FLUSH_STOP. This should avoid issues when interrupting deco... Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_sink_event): Abort decompression when receiving FLUSH_STOP. This should avoid issues when interrupting decoding with flushes. 2006-05-27 12:10:50 +0000 Tim-Philipp Müller ext/flac/gstflac.c: Don't #include file we don't dist any longer. Original commit message from CVS: * ext/flac/gstflac.c: Don't #include file we don't dist any longer. 2006-05-27 11:27:59 +0000 Tim-Philipp Müller README: Replace current README (containing the release notes from some 0.9.x version) with a proper README taken from... Original commit message from CVS: * README: Replace current README (containing the release notes from some 0.9.x version) with a proper README taken from the core. 2006-05-26 22:35:00 +0000 Stefan Kost gst/spectrum/: added another example Original commit message from CVS: * gst/spectrum/Makefile.am: * gst/spectrum/demo-audiotest.c: (on_frequency_changed), (spectrum_chain), (main): * gst/spectrum/demo-osssrc.c: added another example * sys/v4l2/gstv4l2src.c: fix typo 2006-05-26 13:16:54 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Clip the outputed NEWSEGMENT stop time to the configured segment stop time. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment): Clip the outputed NEWSEGMENT stop time to the configured segment stop time. 2006-05-26 11:48:44 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Don't clear the running variable in the seek code. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_do_seek): Don't clear the running variable in the seek code. 2006-05-24 16:03:40 +0000 Wim Taymans ext/dv/gstdvdemux.c: Implement EOS correctly by either posting Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_loop): Implement EOS correctly by either posting SEGMENT_DONE or pushing an EOS message depending on the seek type. Fixes #342592 2006-05-24 11:56:43 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Detect QCELP in mp4a descriptors. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_esds): Detect QCELP in mp4a descriptors. 2006-05-24 10:00:50 +0000 Wim Taymans gst/law/: Some cleanups in the chain functions. Original commit message from CVS: * gst/law/alaw-decode.c: (gst_alawdec_chain): * gst/law/alaw-decode.h: * gst/law/alaw-encode.c: (gst_alawenc_chain): * gst/law/alaw-encode.h: * gst/law/mulaw-decode.c: (gst_mulawdec_chain): * gst/law/mulaw-decode.h: * gst/law/mulaw-encode.c: (gst_mulawenc_chain): * gst/law/mulaw-encode.h: Some cleanups in the chain functions. Remove some GStreamer 0.0.2 bits. 2006-05-23 20:15:04 +0000 Mark Nauwelaerts gst/matroska/matroska-mux.c: gst_collect_pads_stop() needs to be called before chaining up to the parent class (#3427... Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/matroska/matroska-mux.c: (gst_matroska_mux_change_state): gst_collect_pads_stop() needs to be called before chaining up to the parent class (#342734). 2006-05-23 16:45:22 +0000 Tim-Philipp Müller ext/flac/: Remove backwards compatibility cruft for dealing with FLAC API changes in the 1.0.x series - we require 1.... Original commit message from CVS: * ext/flac/Makefile.am: * ext/flac/flac_compat.h: * ext/flac/gstflac.c: * ext/flac/gstflacdec.c: (gst_flac_dec_init): * ext/flac/gstflacenc.c: Remove backwards compatibility cruft for dealing with FLAC API changes in the 1.0.x series - we require 1.1.1 or newer these days. 2006-05-23 13:44:11 +0000 Tim-Philipp Müller gst/matroska/: Add support for muxing/demuxing theora video (#342448; too bad none of the usual linux players can act... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_push_xiph_codec_priv_data), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init), (gst_matroska_mux_video_pad_setcaps), (xiph3_streamheader_to_codecdata), (vorbis_streamheader_to_codecdata), (theora_streamheader_to_codecdata), (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_write_data): Add support for muxing/demuxing theora video (#342448; too bad none of the usual linux players can actually play this). Playback in GStreamer will require additional changes to theoradec in -base. Refactor streamheaders <=> CodecPrivateData code a bit; some small cleanups. 2006-05-22 18:00:52 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: po/POTFILES.in: Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (plugin_init): po/POTFILES.in: Throw an error when the file is encrypted. Move plugin_init stuff to the end of the file, add stuff for i18n, make debug category static. 2006-05-22 15:23:05 +0000 Tim-Philipp Müller ext/jpeg/gstjpegdec.c: Fix crashes when the horizontal subsampling is 1. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (hresamplecpy1), (gst_jpeg_dec_decode_indirect), (gst_jpeg_dec_chain): Fix crashes when the horizontal subsampling is 1. Fixes #342097. 2006-05-22 14:56:29 +0000 Thomas Vander Stichele * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.h: cover up the dirty truth Original commit message from CVS: cover up the dirty truth 2006-05-22 13:53:18 +0000 Mark Nauwelaerts gst/avi/gstavimux.*: - add odml (large file) index support Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/avi/gstavimux.c: (gst_avi_mux_finalize), (gst_avi_mux_init), (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_audsink_set_caps), (gst_avi_mux_write_tag), (gst_avi_mux_riff_get_avi_header), (gst_avi_mux_riff_get_avix_header), (gst_avi_mux_write_avix_index), (gst_avi_mux_add_index), (gst_avi_mux_bigfile), (gst_avi_mux_start_file), (gst_avi_mux_stop_file), (gst_avi_mux_handle_event), (gst_avi_mux_do_audio_buffer), (gst_avi_mux_do_video_buffer), (gst_avi_mux_do_one_buffer), (gst_avi_mux_change_state): * gst/avi/gstavimux.h: Some enhancements for avimux (#342526): - add odml (large file) index support - store codec init data (e.g. huffyuv) - miscellaneous other fixes/cleanups 2006-05-22 13:51:30 +0000 Thomas Vander Stichele * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: fix descriptions and license blocks cut and paste anyone ? Original commit message from CVS: fix descriptions and license blocks cut and paste anyone ? 2006-05-21 16:41:44 +0000 Stefan Kost gst/spectrum/gstspectrum.c: Use boilerplate macro, fix strings to match plugin-moval-requirements Original commit message from CVS: * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_set_sink_caps), (gst_spectrum_get_sink_caps), (gst_spectrum_chain): Use boilerplate macro, fix strings to match plugin-moval-requirements 2006-05-21 16:23:23 +0000 Stefan Kost gst/spectrum/Makefile.am: Link to base libraries Original commit message from CVS: * gst/spectrum/Makefile.am: Link to base libraries * gst/spectrum/demo-osssrc.c: (main): use new threshhold property * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_dispose), (gst_spectrum_set_property), (gst_spectrum_set_sink_caps), (gst_spectrum_get_sink_caps), (gst_spectrum_chain), (gst_spectrum_change_state): * gst/spectrum/gstspectrum.h: Use gst_adapter, support multiple-channels, add threshold property for result, add docs, fix resulting spectrum range (was including mirrored results) 2006-05-20 22:42:15 +0000 Stefan Kost Initial port of the spectrum element Original commit message from CVS: * configure.ac: * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main): * gst/spectrum/fix_fft.c: (gst_spectrum_fix_dot): * gst/spectrum/gstspectrum.c: (gst_spectrum_get_type), (gst_spectrum_base_init), (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_dispose), (gst_spectrum_set_property), (gst_spectrum_chain): * gst/spectrum/gstspectrum.h: Initial port of the spectrum element 2006-05-19 18:58:05 +0000 Edgard Lima * sys/v4l2/gstv4l2xoverlay.c: I forget to add sys/v4l2/gstv4l2xoverlay.c in las commit Original commit message from CVS: I forget to add sys/v4l2/gstv4l2xoverlay.c in las commit 2006-05-19 18:31:25 +0000 Edgard Lima * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: Some clean-ups requested by wingo in bug #338818. Original commit message from CVS: Some clean-ups requested by wingo in bug #338818. 2006-05-19 14:05:53 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Don't output any tag when we encounter a negative track number - the tag type is uint, so... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): Don't output any tag when we encounter a negative track number - the tag type is uint, so we end up outputting huge positive numbers instead. (Fixes: #342029) 2006-05-18 23:04:59 +0000 Thomas Vander Stichele configure.ac: update for new GSTPB_PLUGINS_DIR Original commit message from CVS: * configure.ac: update for new GSTPB_PLUGINS_DIR 2006-05-18 19:34:47 +0000 Stefan Kost configure.ac: Check for X11 Original commit message from CVS: * configure.ac: Check for X11 * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices): * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_iface_supported): * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): * sys/v4l2/gstv4l2xoverlay.h: Code cleanups, fix debug macros 2006-05-18 14:45:33 +0000 Philippe Kalaf rtp/gst/gstrtph263pay.c: Properly set static caps for H263 at 34. Original commit message from CVS: 2006-05-18 Philippe Kalaf * rtp/gst/gstrtph263pay.c: Properly set static caps for H263 at 34. 2006-05-18 12:46:08 +0000 James Doc Livingston ext/taglib/gsttaglibmux.c: Merge event tags and tag setter tags correctly (#339918). Also, don't leak taglist in case... Original commit message from CVS: Patch by: James "Doc" Livingston * ext/taglib/gsttaglibmux.c: (gst_tag_lib_mux_render_tag): Merge event tags and tag setter tags correctly (#339918). Also, don't leak taglist in case of an error. 2006-05-17 18:09:06 +0000 Philippe Kalaf * common: * gst/rtp/gstrtph263pay.c: Fixed caps for H263 (not the same as H263+) Original commit message from CVS: Fixed caps for H263 (not the same as H263+) 2006-05-17 12:36:26 +0000 Edward Hervey gst/law/mulaw-decode.c: We can only do caps intersection if the othercaps are non-empty and not Original commit message from CVS: * gst/law/mulaw-decode.c: (mulawdec_getcaps): We can only do caps intersection if the othercaps are non-empty and not ANY. Else we return the pad template (base_caps). 2006-05-17 11:20:44 +0000 Tim-Philipp Müller ext/jpeg/gstjpegdec.c: Fix crash when outputting debugging information for certain pictures (always good to use the r... Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): Fix crash when outputting debugging information for certain pictures (always good to use the right struct member for the number of records in an array). 2006-05-17 08:10:31 +0000 Jindrich Makovicka gst/matroska/ebml-read.c: Don't create unnecessary sub-buffers all the time. Dramatically improves performance with m... Original commit message from CVS: Patch by: Jindrich Makovicka * gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes), (gst_ebml_read_pull_bytes), (gst_ebml_read_element_id), (gst_ebml_read_element_length), (gst_ebml_read_buffer), (gst_ebml_read_bytes), (gst_ebml_read_uint), (gst_ebml_read_sint), (gst_ebml_read_float), (gst_ebml_read_ascii), (gst_ebml_read_binary): Don't create unnecessary sub-buffers all the time. Dramatically improves performance with multiple concurrently running matroskademux instances (#341818) (and avoids doing unnecessarily inefficient things in the general case). 2006-05-16 17:20:04 +0000 Edward Hervey ext/libpng/gstpngenc.c: In snapshot mode, we always return GST_FLOW_UNEXPECTED whatever the return value of gst_pad_p... Original commit message from CVS: * ext/libpng/gstpngenc.c: (gst_pngenc_chain): In snapshot mode, we always return GST_FLOW_UNEXPECTED whatever the return value of gst_pad_push_event(). 2006-05-16 14:07:29 +0000 Jan Schmidt gst/autodetect/: Make the name of the child element be based on the name of the parent, so that debug output is more ... Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_find_best): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_find_best): Make the name of the child element be based on the name of the parent, so that debug output is more useful. * gst/id3demux/id3v2frames.c: (find_utf16_bom), (parse_insert_string_field), (parse_split_strings): Rework string parsing to always walk over BOM markers in UTF16 strings, using the endianness indicated by the innermost one, then trying the opposite endianness if that fails to convert to valid UTF-8. Fixes #341774 2006-05-16 13:31:02 +0000 Zaheer Abbas Merali ext/libpng/Makefile.am: Add LIBPNG_CFLAGS. Original commit message from CVS: 2006-05-16 Zaheer Abbas Merali Patch from: Matthieu * ext/libpng/Makefile.am: Add LIBPNG_CFLAGS. 2006-05-15 11:20:21 +0000 Christian Schaller * gst-plugins-good.spec.in: update with latest changes Original commit message from CVS: update with latest changes 2006-05-15 09:00:42 +0000 Tim-Philipp Müller ext/taglib/gstid3v2mux.cc: Add support for writing images (APIC frames) into ID3v2 tags (picture type always set to '... Original commit message from CVS: * ext/taglib/gstid3v2mux.cc: Add support for writing images (APIC frames) into ID3v2 tags (picture type always set to 'other' for now though). 2006-05-14 12:50:07 +0000 Michael Smith gst/wavparse/gstwavparse.c: Update docs; wavparse implements push and pull modes. Original commit message from CVS: * gst/wavparse/gstwavparse.c: Update docs; wavparse implements push and pull modes. 2006-05-12 18:10:36 +0000 Wim Taymans gst/avi/gstavidemux.c: Ooops, bitten by the copy-and-paste design paradigm, fixes seek again. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_index_next), (gst_avi_demux_parse_index), (gst_avi_demux_massage_index), (gst_avi_demux_handle_seek), (gst_avi_demux_loop): Ooops, bitten by the copy-and-paste design paradigm, fixes seek again. 2006-05-12 18:04:22 +0000 Wim Taymans gst/avi/gstavidemux.*: Some cleanups, prepare to use GstSegment. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_index_next), (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_push_event), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): * gst/avi/gstavidemux.h: Some cleanups, prepare to use GstSegment. Fix error in entry walking code. Fix VBR detection. Smarter timestamp calculation code. Uniform error/eos handling. 2006-05-12 17:44:15 +0000 Michael Smith gst/wavparse/gstwavparse.c: Fix use of uninitialised values if we're NOT seeking in ready. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers): Fix use of uninitialised values if we're NOT seeking in ready. Fix typos. 2006-05-12 08:23:18 +0000 Tim-Philipp Müller gst/wavparse/Makefile.am: Add CFLAGS and LIBS for libgstbase, fixes build on Original commit message from CVS: * gst/wavparse/Makefile.am: Add CFLAGS and LIBS for libgstbase, fixes build on Cygwin (#341489). 2006-05-12 08:21:37 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Some more debug info. No need to check whether the string returned by g_convert() is real... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_insert_string_field): Some more debug info. No need to check whether the string returned by g_convert() is really UTF-8 - either it is or we get NULL returned. 2006-05-11 17:59:59 +0000 Edgard Lima * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2element.c: * sys/v4l2/gstv4l2element.h: * sys/v4l2/gstv4l2object.c: * sys/v4l2/gstv4l2object.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/gstv4l2xoverlay.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: Changes proposed by Wingo in bug #338818. Original commit message from CVS: Changes proposed by Wingo in bug #338818. 2006-05-11 09:09:49 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Figure out the real audio type in mp4a boxes by parsing the optional descriptors in the option... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_parse_trak), (gst_qtdemux_handle_esds): Figure out the real audio type in mp4a boxes by parsing the optional descriptors in the optional esds box. Promote the default AAC to mp3 when indicated. Fixes #330632. 2006-05-10 17:44:50 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Parse version 2 sample descriptions. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_dump_unknown), (qtdemux_parse_trak), (gst_qtdemux_handle_esds): Parse version 2 sample descriptions. Don't #define gst_util_dump_mem(), use something more specific instead to avoid confusion. 2006-05-10 13:51:01 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Fix parsing of numeric genre strings some more, by ensuring that we only try and parse st... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3v2_genre_fields_to_taglist): Fix parsing of numeric genre strings some more, by ensuring that we only try and parse strings that a) Start with '(' and b) Consist only of digits. Also, when finding an escaping '((' sequence, bust it back to '(' by swallowing the first parenthesis 2006-05-10 11:17:31 +0000 Tim-Philipp Müller ext/esd/esdsink.*: Move the esd_get_server_info() into gst_esdsink_open() and fail with a decent error message on err... Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_finalize), (gst_esdsink_getcaps), (gst_esdsink_open), (gst_esdsink_close): * ext/esd/esdsink.h: Move the esd_get_server_info() into gst_esdsink_open() and fail with a decent error message on errors. 2006-05-10 10:29:54 +0000 Tim-Philipp Müller Const-ify GEnumValue arrays. Original commit message from CVS: * ext/esd/esdmon.c: (gst_esdmon_depths_get_type), (gst_esdmon_channels_get_type): * ext/gconf/gstgconfaudiosink.c: (gst_gconf_profile_get_type): * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_method_get_type): * ext/libcaca/gstcacasink.c: (gst_cacasink_dither_get_type): * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type): * gst/alpha/gstalpha.c: (gst_alpha_method_get_type): * gst/rtp/gstrtpilbcdepay.c: (gst_ilbc_mode_get_type): * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type): * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type): * gst/videofilter/gstvideoflip.c: (gst_video_flip_method_get_type): * gst/videomixer/videomixer.c: (gst_video_mixer_background_get_type): Const-ify GEnumValue arrays. 2006-05-09 14:08:15 +0000 Mark Nauwelaerts gst/avi/gstavimux.c: Work around gst_buffer_make_metadata_writable() bug that results in avimux marking all frames in... Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/avi/gstavimux.c: (gst_avi_mux_do_audio_buffer), (gst_avi_mux_do_video_buffer): Work around gst_buffer_make_metadata_writable() bug that results in avimux marking all frames in the index as keyframes (#340859). 2006-05-08 19:21:18 +0000 Martin Rubli * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: Fix fourcc name printed out. Patch from Martin Rubli. Original commit message from CVS: Fix fourcc name printed out. Patch from Martin Rubli. 2006-05-08 15:20:10 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Don't cause side effects in a debugging function. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_query), (qtdemux_dump_mvhd): Don't cause side effects in a debugging function. Also report duration in push mode since we can. 2006-05-08 14:35:20 +0000 Wim Taymans gst/rtsp/rtspurl.c: Make parsing of urls suck slightly less. Original commit message from CVS: * gst/rtsp/rtspurl.c: (rtsp_url_parse): Make parsing of urls suck slightly less. 2006-05-08 11:53:03 +0000 Edward Hervey autogen.sh: libtoolize on Darwin/MacOSX is called glibtoolize. Original commit message from CVS: * autogen.sh: (CONFIGURE_DEF_OPT): libtoolize on Darwin/MacOSX is called glibtoolize. 2006-05-08 10:59:05 +0000 Jens Granseuer C89 compliance fixes. Fixes #340980 Original commit message from CVS: Patch by: Jens Granseuer * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_init): * gst/wavparse/gstwavparse.c: (gst_wavparse_dispose): C89 compliance fixes. Fixes #340980 2006-05-06 09:01:34 +0000 Tim-Philipp Müller ext/flac/gstflacdec.*: Handle segment seeks that include the end of the file as stop point properly: when the decoder... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_loop): * ext/flac/gstflacdec.h: Handle segment seeks that include the end of the file as stop point properly: when the decoder hits EOS we want to send a SEGMENT_DONE message instead of an EOS event in case we're in segment seek mode (fixes #340699). 2006-05-06 00:14:09 +0000 Maciej Katafiasz * ChangeLog: * ext/cairo/gsttextoverlay.c: * ext/flac/gstflacdec.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/wavpack/gstwavpackdec.c: * gst/apetag/gstapedemux.c: * gst/debug/breakmydata.c: * gst/debug/testplugin.c: * gst/matroska/ebml-write.c: * gst/multipart/multipartdemux.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: Add semicolons after GST_BOILERPLATE[_FULL] so that indent doesn't mess up following lines. Original commit message from CVS: Add semicolons after GST_BOILERPLATE[_FULL] so that indent doesn't mess up following lines. 2006-05-05 20:12:59 +0000 Martin Rubli * sys/v4l2/gstv4l2element.c: * sys/v4l2/gstv4l2element.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: * tests/icles/v4l2src-test.c: Some changes proposed by wingo in bug #338818 (but not everything yet). Patch from Martin Rubli to fix framerate dete... Original commit message from CVS: Some changes proposed by wingo in bug #338818 (but not everything yet). Patch from Martin Rubli to fix framerate detection. 2006-05-04 17:27:27 +0000 Michal Benes gst/matroska/matroska-demux.c: Don't leak caps when freeing the stream context (#340623). Original commit message from CVS: Patch by: Michal Benes * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset): Don't leak caps when freeing the stream context (#340623). 2006-05-04 15:40:18 +0000 Jan Schmidt configure.ac: Back to CVS Original commit message from CVS: * configure.ac: Back to CVS === release 0.10.3 === 2006-05-04 15:36:02 +0000 Jan Schmidt * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * win32/common/config.h: Really release 0.10.3 Original commit message from CVS: Really release 0.10.3 2006-05-04 15:28:53 +0000 Jan Schmidt * docs/plugins/inspect/plugin-qtdemux.xml: Really release 0.10.3 this time Original commit message from CVS: Really release 0.10.3 this time 2006-05-04 15:05:00 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-icydemux.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-qtdemux.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-taglib.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/plugins/inspect/plugin-ximagesrc.xml: * win32/common/config.h: Release 0.10.3 Original commit message from CVS: Release 0.10.3 2006-05-03 18:44:38 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2006-05-03 18:41:47 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: Don't strcmp() NULL strings. Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_stream_is_vorbis_header), (gst_matroska_mux_write_data): Don't strcmp() NULL strings. Only start new clusters on video keyframes, not on any random audio buffer that doesn't have the DELTA_UNIT flag set (fixes 'make check' again). 2006-05-03 14:51:50 +0000 Mark Nauwelaerts gst/matroska/matroska-mux.c: Don't misinterpret GST_CLOCK_TIME_NONE as very high timestamp value and then dead-lock w... Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/matroska/matroska-mux.c: (gst_matroska_mux_best_pad), (gst_matroska_mux_stream_is_vorbis_header), (gst_matroska_mux_write_data): Don't misinterpret GST_CLOCK_TIME_NONE as very high timestamp value and then dead-lock when muxing vorbis audio streams (the three vorbis header buffers carry no timestamp, and it would try to mux these after all video buffers). Fixes #340346. Improve clustering: start a new cluster also whenever we get a keyframe. 2006-05-03 14:30:21 +0000 Jan Schmidt gst/qtdemux/qtdemux.c: Clean up one piece of logic slightly and remove a dead code block. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Clean up one piece of logic slightly and remove a dead code block. 2006-05-03 14:28:57 +0000 Thomas Vander Stichele add win32 stuff Original commit message from CVS: * Makefile.am: * configure.ac: * win32/common/config.h.in: add win32 stuff 2006-05-03 14:26:51 +0000 Thomas Vander Stichele add win32 stuff Original commit message from CVS: * Makefile.am: * configure.ac: * win32/common/config.h.in: add win32 stuff 2006-05-02 22:34:52 +0000 Michael Smith ext/cairo/gsttimeoverlay.c: Fix timeoverlay for non-multiple-of-4 widths. This fourcc crap Original commit message from CVS: * ext/cairo/gsttimeoverlay.c: (gst_cairo_time_overlay_transform): Fix timeoverlay for non-multiple-of-4 widths. This fourcc crap SUCKS. 2006-05-02 21:52:48 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: Fix get_caps func to work when no framerate is available and the caps isn't simple. Original commit message from CVS: Fix get_caps func to work when no framerate is available and the caps isn't simple. 2006-05-02 18:50:23 +0000 Stefan Kost gst/: don't leak caps-string Original commit message from CVS: * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps): * gst/debug/negotiation.c: (gst_negotiation_update_caps): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): don't leak caps-string 2006-05-02 15:46:02 +0000 Tim-Philipp Müller gst/id3demux/gstid3demux.c: Let core insert default error message for TYPE_NOT_FOUND errors, it's just as good as our... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_chain), (gst_id3demux_sink_activate): Let core insert default error message for TYPE_NOT_FOUND errors, it's just as good as our own and has the added bonus of being translated. 2006-05-02 15:40:15 +0000 Tim-Philipp Müller gst/: Post an error message when we get an EOS event and were not able to find out the type of stream. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_init), (gst_tag_demux_sink_event): * gst/id3demux/gstid3demux.c: (gst_id3demux_init), (gst_id3demux_sink_event): Post an error message when we get an EOS event and were not able to find out the type of stream. * tests/check/elements/id3v2mux.c: (fill_mp3_buffer), (got_buffer), (test_taglib_id3mux_with_tags): Decrease num-buffers to 16 per iteration again, otherwise the many memcpy()s and reallocations in the test will hammer slow CPUs completely and make the test timeout. 2006-05-02 13:24:38 +0000 Thomas Vander Stichele configure.ac: figure out where plugins-base plugins are Original commit message from CVS: * configure.ac: figure out where plugins-base plugins are * tests/check/Makefile.am: use plugins-base plugins, so we have typefind functions * tests/check/elements/id3v2mux.c: (test_taglib_id3mux_with_tags): increase num-buffers, this makes sure the test errors out instead of timing out when no typefind functions are present 2006-05-02 13:01:50 +0000 Thomas Vander Stichele * gst/wavparse/gstwavparse.c: fix docs for wavparse Original commit message from CVS: fix docs for wavparse 2006-05-01 21:37:51 +0000 Edgard Lima * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/v4l2_calls.c: * tests/icles/v4l2src-test.c: Few improvements to move to good. Original commit message from CVS: Few improvements to move to good. 2006-05-01 11:46:33 +0000 Thomas Vander Stichele docs/plugins/Makefile.am: also check .cc files for gtk-doc markup Original commit message from CVS: * docs/plugins/Makefile.am: also check .cc files for gtk-doc markup * configure.ac: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * tests/check/Makefile.am: * tests/check/elements/id3v2mux.c: (id3v2mux_suite), (main): * ext/Makefile.am: * ext/taglib/Makefile.am: * ext/taglib/gstid3v2mux.h: * ext/taglib/gsttaglibmux.c: * ext/taglib/gsttaglibmux.h: move taglib-based id3v2muxer to -good. Fixes #336110. 2006-05-01 11:45:15 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-icydemux.xml: add icydemux inspection Original commit message from CVS: add icydemux inspection 2006-05-01 11:43:31 +0000 Thomas Vander Stichele * po/POTFILES.in: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: add ximagesrc for translation Original commit message from CVS: add ximagesrc for translation 2006-04-30 16:16:59 +0000 Thomas Vander Stichele * ext/taglib/gstid3v2mux.cc: * ext/taglib/gsttaglibmux.c: small cleanups Original commit message from CVS: small cleanups 2006-04-30 15:32:13 +0000 Thomas Vander Stichele * ext/taglib/gstid3v2mux.cc: fix docs Original commit message from CVS: fix docs 2006-04-30 14:55:15 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-qtdemux.xml: * docs/plugins/inspect/plugin-taglib.xml: update to latest version Original commit message from CVS: update to latest version 2006-04-29 18:46:36 +0000 Tim-Philipp Müller ext/taglib/gsttaglib.cc: Post an error message on the bus in the (extremely unlikely) case of an error. Original commit message from CVS: * ext/taglib/gsttaglib.cc: Post an error message on the bus in the (extremely unlikely) case of an error. 2006-04-29 18:18:24 +0000 Tim-Philipp Müller ext/taglib/: Split the actual ID3v2 tag rendering code into its own subclass. Original commit message from CVS: * ext/taglib/Makefile.am: * ext/taglib/gstid3v2mux.cc: * ext/taglib/gstid3v2mux.h: * ext/taglib/gsttaglib.cc: * ext/taglib/gsttaglib.h: Split the actual ID3v2 tag rendering code into its own subclass. 2006-04-29 16:14:20 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: ... and fix multichannel/WAVFORMATEX support again. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): ... and fix multichannel/WAVFORMATEX support again. 2006-04-28 23:09:17 +0000 Stefan Kost gst/wavparse/gstwavparse.*: Add push (streaming) mode to wavparse (fixes #337625) Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_class_init), (gst_wavparse_dispose), (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_create_sourcepad), (gst_wavparse_parse_adtl), (gst_wavparse_parse_cues), (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), (gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info), (gst_wavparse_peek_chunk), (gst_wavparse_stream_headers), (gst_wavparse_parse_stream_init), (gst_wavparse_send_event), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_chain), (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull), (gst_wavparse_change_state), (plugin_init): * gst/wavparse/gstwavparse.h: Add push (streaming) mode to wavparse (fixes #337625) 2006-04-28 21:43:07 +0000 Thomas Vander Stichele * tests/check/elements/id3v2mux.c: element renamed Original commit message from CVS: element renamed 2006-04-28 19:22:46 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-ximagesrc.xml: add plugin docs for ximagesrc Original commit message from CVS: add plugin docs for ximagesrc 2006-04-28 19:15:08 +0000 Thomas Vander Stichele add ximagesrc icles test Original commit message from CVS: * configure.ac: * tests/Makefile.am: add ximagesrc icles test 2006-04-28 18:57:09 +0000 Thomas Vander Stichele Move ximagesrc plug-in to good after review. Fixes #336756. Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_class_init), (gst_cmml_enc_push_clip): * sys/Makefile.am: * sys/ximage/Makefile.am: * sys/ximage/gstximagesrc.c: Move ximagesrc plug-in to good after review. Fixes #336756. 2006-04-28 16:51:33 +0000 Thomas Vander Stichele * sys/ximage/gstximagesrc.c: * sys/ximage/gstximagesrc.h: borgify naming Original commit message from CVS: borgify naming 2006-04-28 16:46:52 +0000 Thomas Vander Stichele * sys/ximage/gstximagesrc.c: doc tweaks Original commit message from CVS: doc tweaks 2006-04-28 16:15:20 +0000 Thomas Vander Stichele * sys/ximage/Makefile.am: * sys/ximage/gstximagesrc.c: clean up Makefile.am Original commit message from CVS: clean up Makefile.am 2006-04-28 15:33:09 +0000 Thomas Vander Stichele * ext/taglib/gsttaglibmux.c: * ext/taglib/gsttaglibmux.h: pedantic cleanups Original commit message from CVS: pedantic cleanups 2006-04-28 14:57:57 +0000 Michael Smith gst/icydemux/gsticydemux.*: Fix event handling: cache events when typefinding and forward later. Original commit message from CVS: * gst/icydemux/gsticydemux.c: (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps), (gst_icydemux_add_srcpad), (gst_icydemux_parse_and_send_tags), (gst_icydemux_handle_event), (gst_icydemux_send_cached_events), (gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta), (gst_icydemux_chain), (gst_icydemux_send_tag_event): * gst/icydemux/gsticydemux.h: Fix event handling: cache events when typefinding and forward later. 2006-04-28 14:55:20 +0000 Zaheer Abbas Merali sys/osxaudio/gstosxaudiosink.c: Register osxaudiosrc to the plugin. Original commit message from CVS: 2006-04-28 Zaheer Abbas Merali * sys/osxaudio/gstosxaudiosink.c: (plugin_init): Register osxaudiosrc to the plugin. * sys/osxaudio/gstosxaudiosrc.c: (gst_osx_audio_src_osxelement_do_init), (gst_osx_audio_src_base_init), (gst_osx_audio_src_class_init), (gst_osx_audio_src_init), (gst_osx_audio_src_set_property), (gst_osx_audio_src_get_property), (gst_osx_audio_src_create_ringbuffer), (gst_osx_audio_src_io_proc), (gst_osx_audio_src_osxelement_init): * sys/osxaudio/gstosxaudiosrc.h: Port of osxaudiosrc to 0.10. * sys/osxaudio/Makefile.am: Add osxaudiosrc 2006-04-28 12:00:39 +0000 Zaheer Abbas Merali * ChangeLog: commit Changelog for previous commit Original commit message from CVS: commit Changelog for previous commit 2006-04-28 11:57:39 +0000 Zaheer Abbas Merali * sys/osxaudio/gstosxringbuffer.c: * sys/osxaudio/gstosxringbuffer.h: Forgot to commit, quick commit be4 apple dies Original commit message from CVS: Forgot to commit, quick commit be4 apple dies 2006-04-28 11:37:22 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Recognise and skip any byte order marker (BOM) in Original commit message from CVS: * gst/id3demux/id3v2frames.c: (has_utf16_bom), (parse_split_strings): Recognise and skip any byte order marker (BOM) in UTF-16 strings. 2006-04-27 16:05:54 +0000 Tim-Philipp Müller Add docs for both avidemux and avimux. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-avi.xml: * gst/avi/gstavidemux.c: * gst/avi/gstavimux.c: Add docs for both avidemux and avimux. 2006-04-27 14:51:06 +0000 Mark Nauwelaerts gst/avi/: Port AVI muxer to GStreamer-0.10 (#332031). Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/avi/Makefile.am: * gst/avi/gstavi.c: (plugin_init): * gst/avi/gstavimux.c: (gst_avi_mux_get_type), (gst_avi_mux_base_init), (gst_avi_mux_finalize), (gst_avi_mux_class_init), (gst_avi_mux_init), (gst_avi_mux_vidsink_set_caps), (gst_avi_mux_audsink_set_caps), (gst_avi_mux_pad_link), (gst_avi_mux_pad_unlink), (gst_avi_mux_request_new_pad), (gst_avi_mux_release_pad), (gst_avi_mux_write_tag), (gst_avi_mux_riff_get_avi_header), (gst_avi_mux_riff_get_avix_header), (gst_avi_mux_riff_get_video_header), (gst_avi_mux_riff_get_audio_header), (gst_avi_mux_add_index), (gst_avi_mux_write_index), (gst_avi_mux_bigfile), (gst_avi_mux_start_file), (gst_avi_mux_stop_file), (gst_avi_mux_restart_file), (gst_avi_mux_handle_event), (gst_avi_mux_fill_queue), (gst_avi_mux_send_pad_data), (gst_avi_mux_strip_buffer), (gst_avi_mux_do_audio_buffer), (gst_avi_mux_do_video_buffer), (gst_avi_mux_do_one_buffer), (gst_avi_mux_loop), (gst_avi_mux_collect_pads), (gst_avi_mux_get_property), (gst_avi_mux_set_property), (gst_avi_mux_change_state): * gst/avi/gstavimux.h: Port AVI muxer to GStreamer-0.10 (#332031). * tests/check/Makefile.am: * tests/check/elements/avimux.c: * tests/check/elements/.cvsignore: Add unit test for AVI muxer. 2006-04-26 21:29:45 +0000 Stefan Kost gst/wavparse/gstwavparse.*: reverted patch #337625 for the price of 1 hour sleep Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_class_init), (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_create_sourcepad), (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_send_event), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull), (gst_wavparse_change_state), (plugin_init): * gst/wavparse/gstwavparse.h: reverted patch #337625 for the price of 1 hour sleep 2006-04-26 20:11:18 +0000 Stefan Kost gst/wavparse/gstwavparse.*: correct partial implementation of push mode (from my last commit) Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_class_init), (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_create_sourcepad), (gst_wavparse_parse_adtl), (gst_wavparse_parse_cues), (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_chain), (plugin_init): * gst/wavparse/gstwavparse.h: correct partial implementation of push mode (from my last commit) 2006-04-26 17:37:10 +0000 Wim Taymans ext/esd/esdsink.c: Fix compile problem by defining ESD_MAX_WRITE_SIZE if it is not in esd.h Original commit message from CVS: * ext/esd/esdsink.c: Fix compile problem by defining ESD_MAX_WRITE_SIZE if it is not in esd.h 2006-04-26 17:08:24 +0000 Tim-Philipp Müller gst/auparse/gstauparse.*: Rewrite auparse to suck a little bit less: make source pad dynamic, so decodebin/playbin wo... Original commit message from CVS: * gst/auparse/gstauparse.c: (gst_au_parse_base_init), (gst_au_parse_class_init), (gst_au_parse_init), (gst_au_parse_reset), (gst_au_parse_add_srcpad), (gst_au_parse_remove_srcpad), (gst_au_parse_parse_header), (gst_au_parse_chain), (gst_au_parse_src_convert), (gst_au_parse_src_query), (gst_au_parse_handle_seek), (gst_au_parse_sink_event), (gst_au_parse_src_event), (gst_au_parse_change_state): * gst/auparse/gstauparse.h: Rewrite auparse to suck a little bit less: make source pad dynamic, so decodebin/playbin work with non-raw formats like alaw/mulaw; add query function for duration/position queries; check whether we have enough data before attempting to parse the header (instead of crashing when that is not the case); work around audioconvert sucking by swapping endianness to the native endianness ourselves for float formats; send initial newsegment event. Fixes #161712. 2006-04-26 16:29:38 +0000 Zaheer Abbas Merali sys/osxaudio/: Port of osxaudiosink to 0.10 Original commit message from CVS: 2006-04-26 Zaheer Abbas Merali * sys/osxaudio/Makefile.am: * sys/osxaudio/gstosxaudioelement.c: (gst_osx_audio_element_get_type), (gst_osx_audio_element_class_init): * sys/osxaudio/gstosxaudioelement.h: * sys/osxaudio/gstosxaudiosink.c: (gst_osx_audio_sink_osxelement_do_init), (gst_osx_audio_sink_base_init), (gst_osx_audio_sink_class_init), (gst_osx_audio_sink_init), (gst_osx_audio_sink_set_property), (gst_osx_audio_sink_get_property), (gst_osx_audio_sink_getcaps), (gst_osx_audio_sink_create_ringbuffer), (gst_osx_audio_sink_io_proc), (gst_osx_audio_sink_osxelement_init), (plugin_init): * sys/osxaudio/gstosxaudiosink.h: Port of osxaudiosink to 0.10 2006-04-26 08:55:27 +0000 Wim Taymans ext/esd/esdsink.c: Always write ESD_BUF_SIZE bytes and use ESD_MAX_WRITE_SIZE as the size of the ringbuffer. This sho... Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_prepare), (gst_esdsink_delay): Always write ESD_BUF_SIZE bytes and use ESD_MAX_WRITE_SIZE as the size of the ringbuffer. This should fix hangs with older esd sound servers. 2006-04-25 21:56:38 +0000 Stefan Kost Define GstElementDetails as const and also static (when defined as global) Original commit message from CVS: * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/arts/gst_arts.c: * ext/artsd/gstartsdsink.c: * ext/audiofile/gstafparse.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/audioresample/gstaudioresample.c: * ext/bz2/gstbz2dec.c: * ext/bz2/gstbz2enc.c: * ext/cdaudio/gstcdaudio.c: * ext/directfb/dfbvideosink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): * ext/faac/gstfaac.c: (gst_faac_base_init): * ext/faad/gstfaad.c: * ext/gsm/gstgsmdec.c: * ext/gsm/gstgsmenc.c: * ext/hermes/gsthermescolorspace.c: * ext/ivorbis/vorbisfile.c: * ext/lcs/gstcolorspace.c: * ext/libfame/gstlibfame.c: * ext/libmms/gstmms.c: (gst_mms_base_init): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): * ext/nas/nassink.c: (gst_nassink_base_init): * ext/neon/gstneonhttpsrc.c: * ext/sdl/sdlaudiosink.c: * ext/sdl/sdlvideosink.c: * ext/shout/gstshout.c: * ext/snapshot/gstsnapshot.c: * ext/sndfile/gstsf.c: * ext/swfdec/gstswfdec.c: * ext/tarkin/gsttarkindec.c: * ext/tarkin/gsttarkinenc.c: * ext/theora/theoradec.c: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): * gst/chart/gstchart.c: * gst/colorspace/gstcolorspace.c: * gst/deinterlace/gstdeinterlace.c: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): * gst/festival/gstfestival.c: * gst/filter/gstbpwsinc.c: * gst/filter/gstiir.c: * gst/filter/gstlpwsinc.c: * gst/freeze/gstfreeze.c: * gst/games/gstpuzzle.c: (gst_puzzle_base_init): * gst/librfb/gstrfbsrc.c: * gst/mixmatrix/mixmatrix.c: * gst/mpeg1sys/gstmpeg1systemencode.c: * gst/mpeg1videoparse/gstmp1videoparse.c: * gst/mpeg2sub/gstmpeg2subt.c: * gst/mpegaudioparse/gstmpegaudioparse.c: * gst/multifilesink/gstmultifilesink.c: * gst/overlay/gstoverlay.c: * gst/passthrough/gstpassthrough.c: * gst/playondemand/gstplayondemand.c: * gst/qtdemux/qtdemux.c: * gst/rtjpeg/gstrtjpegdec.c: * gst/rtjpeg/gstrtjpegenc.c: * gst/smooth/gstsmooth.c: * gst/smoothwave/gstsmoothwave.c: * gst/spectrum/gstspectrum.c: * gst/speed/gstspeed.c: * gst/stereo/gststereo.c: * gst/switch/gstswitch.c: * gst/tta/gstttadec.c: (gst_tta_dec_base_init): * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): * gst/vbidec/gstvbidec.c: * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/virtualdub/gstxsharpen.c: * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): * gst/y4m/gsty4mencode.c: * sys/cdrom/gstcdplayer.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directsound/gstdirectsoundsink.c: * sys/glsink/glimagesink.c: * sys/qcam/gstqcamsrc.c: * sys/v4l2/gstv4l2src.c: * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init): * sys/ximagesrc/ximagesrc.c: Define GstElementDetails as const and also static (when defined as global) 2006-04-25 21:39:46 +0000 Stefan Kost Define GstElementDetails as const and also static (when defined as global) Original commit message from CVS: * ext/aalib/gstaasink.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttimeoverlay.c: * ext/cdio/gstcdiocddasrc.c: * ext/dv/gstdvdec.c: * ext/dv/gstdvdemux.c: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/flac/gstflacenc.c: * ext/flac/gstflactag.c: * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init): * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init): * ext/gdk_pixbuf/pixbufscale.c: * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokedec.c: * ext/jpeg/gstsmokeenc.c: * ext/libcaca/gstcacasink.c: * ext/libmng/gstmngdec.c: * ext/libmng/gstmngenc.c: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/mikmod/gstmikmod.c: * ext/raw1394/gstdv1394src.c: * ext/shout2/gstshout2.c: (gst_shout2send_init): * ext/shout2/gstshout2.h: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * gst/alpha/gstalpha.c: * gst/alpha/gstalphacolor.c: * gst/apetag/gstapedemux.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_base_init): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_base_init): * gst/avi/gstavidemux.c: (gst_avi_demux_base_init): * gst/avi/gstavimux.c: (gst_avimux_base_init): * gst/cutter/gstcutter.c: * gst/debug/breakmydata.c: * gst/debug/efence.c: * gst/debug/gstnavigationtest.c: * gst/debug/gstnavseek.c: * gst/debug/negotiation.c: * gst/debug/progressreport.c: * gst/debug/testplugin.c: * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstquark.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/icydemux/gsticydemux.c: * gst/id3demux/gstid3demux.c: * gst/interleave/deinterleave.c: * gst/interleave/interleave.c: * gst/law/alaw-decode.c: (gst_alawdec_base_init): * gst/law/alaw-encode.c: (gst_alawenc_base_init): * gst/law/mulaw-decode.c: (gst_mulawdec_base_init): * gst/law/mulaw-encode.c: (gst_mulawenc_base_init): * gst/level/gstlevel.c: * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init): * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init): * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/oldcore/gstaggregator.c: * gst/oldcore/gstfdsink.c: * gst/oldcore/gstmd5sink.c: * gst/oldcore/gstmultifilesrc.c: * gst/oldcore/gstpipefilter.c: * gst/oldcore/gstshaper.c: * gst/oldcore/gststatistics.c: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtsp/gstrtpdec.c: * gst/rtsp/gstrtspsrc.c: * gst/smpte/gstsmpte.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/udp/gstudpsink.c: * gst/udp/gstudpsrc.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstgamma.c: (gst_gamma_base_init): * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideotemplate.c: (gst_videotemplate_base_init): * gst/videomixer/videomixer.c: * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_class_init), (gst_wavparse_dispose), (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_perform_seek), (gst_wavparse_peek_chunk_info), (gst_wavparse_peek_chunk), (gst_wavparse_stream_headers), (gst_wavparse_parse_stream_init), (gst_wavparse_send_event), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), (gst_wavparse_chain), (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull), (gst_wavparse_change_state): * gst/wavparse/gstwavparse.h: * sys/oss/gstossmixerelement.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/osxaudio/gstosxaudioelement.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: * sys/sunaudio/gstsunaudiomixer.c: * sys/sunaudio/gstsunaudiosink.c: Define GstElementDetails as const and also static (when defined as global) 2006-04-25 17:57:23 +0000 Tim-Philipp Müller ext/jpeg/gstjpegdec.c: Source pad has fixed caps. If we don't set this, bad things happen when the window is resized. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): Source pad has fixed caps. If we don't set this, bad things happen when the window is resized. 2006-04-25 16:38:50 +0000 Tim-Philipp Müller gst/matroska/: Handle case where the TrackType ebml chunk does not come before the Original commit message from CVS: * gst/matroska/Makefile.am: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_handle_src_event): * gst/matroska/matroska-ids.c: (gst_matroska_track_init_video_context), (gst_matroska_track_init_audio_context), (gst_matroska_track_init_subtitle_context), (gst_matroska_track_init_complex_context): * gst/matroska/matroska-ids.h: Handle case where the TrackType ebml chunk does not come before the TrackInfoAudio or TrackInfoVideo ebml chunk (#339446). Ignore QoS events. 2006-04-25 16:09:55 +0000 Wim Taymans gst/rtp/: It's codec_data, not codec_info. Original commit message from CVS: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_setcaps): * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_setcaps): It's codec_data, not codec_info. 2006-04-25 11:45:00 +0000 Mark Nauwelaerts gst/matroska/matroska-demux.c: Handle codec_data for VfW compatibility codec IDs (#339451) Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): Handle codec_data for VfW compatibility codec IDs (#339451) * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): Same here, handle codec_data and add additional caps we can handle now to the pad template (huffyuv, dv and h263 video) (#339451) 2006-04-25 11:09:24 +0000 Josef Zlomek gst/matroska/matroska-mux.c: Fix timestamping of B-frames, use signed integers, do some rounding (#339678). Original commit message from CVS: Patch by: Josef Zlomek * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_buffer_header), (gst_matroska_mux_write_data): Fix timestamping of B-frames, use signed integers, do some rounding (#339678). 2006-04-24 18:30:55 +0000 Edgard Lima * ChangeLog: * ext/annodex/gstcmmlparser.c: just make it compile with --disable-gst-debug. Original commit message from CVS: just make it compile with --disable-gst-debug. 2006-04-23 15:55:30 +0000 Sébastien Moutte gst/matroska/matroska-demux.c: Fix a bad conversion using gst_guint64_to_gdouble. fabs ((gdouble) demux->index[entry]... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek): Fix a bad conversion using gst_guint64_to_gdouble. fabs ((gdouble) demux->index[entry].time - (gdouble) seek_pos) can not be replaced by fabs (gst_guint64_to_gdouble (demux->index[entry].time - seek_pos)) as the difference could be negative. fabs (gst_guint64_to_gdouble (demux->index[entry].time) - gst_guint64_to_gdouble (seek_pos)) is the good solution. Thanks to Tim who has seen my mistake. 2006-04-22 15:32:48 +0000 Sébastien Moutte gst/matroska/matroska-demux.c: Use gst_guint64_to_gdouble for conversions Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek): Use gst_guint64_to_gdouble for conversions * win32/vs6/gst_plugins_good.dsw: * win32/vs6/libgsticydemux.dsp: Add a project file for icydemux 2006-04-21 18:07:10 +0000 Fabrizio Gennari gst/avi/gstavidemux.c: When splitting audio chunks, the block alignment is not taken in consideration, so the smaller... Original commit message from CVS: Patch by: Fabrizio Gennari * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_massage_index): When splitting audio chunks, the block alignment is not taken in consideration, so the smaller chunks could be of size which is not a multiple of the block alignment. Fixes #336904 2006-04-21 17:59:03 +0000 Wim Taymans ext/raw1394/gstdv1394src.c: Use scale functions Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_convert): Use scale functions 2006-04-21 17:27:40 +0000 Tim-Philipp Müller ext/dv/gstdv.c: Fix build. Original commit message from CVS: * ext/dv/gstdv.c: (plugin_init): Fix build. 2006-04-21 17:15:29 +0000 Tim-Philipp Müller gst/debug/progressreport.c: Add 'format' property to force querying to a particular format. Original commit message from CVS: * gst/debug/progressreport.c: (gst_progress_report_finalize), (gst_progress_report_class_init), (gst_progress_report_init), (gst_progress_report_do_query), (gst_progress_report_report), (gst_progress_report_set_property), (gst_progress_report_get_property): Add 'format' property to force querying to a particular format. 2006-04-21 15:50:28 +0000 Andy Wingo ext/dv/gstdv.c (plugin_init): libdv is a marginal decoder, at best, on big endian systems. Drop its rank in that case... Original commit message from CVS: 2006-04-21 Andy Wingo * ext/dv/gstdv.c (plugin_init): libdv is a marginal decoder, at best, on big endian systems. Drop its rank in that case. OTOH on x86 it's quite fine. See changes from today in gst-ffmpeg as well. 2006-04-21 09:27:11 +0000 Michael Smith Add icydemux, and tests. Original commit message from CVS: * configure.ac: * gst/icydemux/Makefile.am: * gst/icydemux/gsticydemux.c: (gst_icydemux_get_type), (gst_icydemux_base_init), (gst_icydemux_class_init), (gst_icydemux_reset), (gst_icydemux_init), (gst_icydemux_sink_setcaps), (gst_icydemux_dispose), (gst_icydemux_add_srcpad), (gst_icydemux_remove_srcpad), (unicodify), (gst_icydemux_unicodify), (gst_icydemux_parse_and_send_tags), (gst_icydemux_typefind_or_forward), (gst_icydemux_add_meta), (gst_icydemux_chain), (gst_icydemux_change_state), (gst_icydemux_send_tag_event), (plugin_init): * gst/icydemux/gsticydemux.h: * tests/check/Makefile.am: * tests/check/elements/icydemux.c: (typefind_succeed), (plugin_init), (icydemux_found_pad), (create_icydemux), (cleanup_icydemux), (push_data), (GST_START_TEST), (icydemux_suite), (main): Add icydemux, and tests. 2006-04-20 17:48:29 +0000 Tim-Philipp Müller ext/flac/gstflacdec.c: Post SEGMENT_DONE message in TIME format. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_loop): Post SEGMENT_DONE message in TIME format. 2006-04-20 17:29:56 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: Added a couple of ifdefs to make it compile with other kernels. Original commit message from CVS: Added a couple of ifdefs to make it compile with other kernels. 2006-04-20 16:33:55 +0000 Fabrizio Gennari gst/avi/gstavidemux.c: Fix index creation when we have to scan the file to create an index. There may be other types ... Original commit message from CVS: Patch by: Fabrizio Gennari * gst/avi/gstavidemux.c: (gst_avi_demux_peek_tag), (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan): Fix index creation when we have to scan the file to create an index. There may be other types of RIFF 'LIST' chunks than 'movi' and we need to skip them properly as well or we'll end up reading garbage (#336889). Some other cosmetic changes. 2006-04-20 14:21:42 +0000 Tim-Philipp Müller ext/flac/gstflacdec.c: Add support for segment seeks (fixes #338290). Also demote some recurring debug message from D... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_loop), (gst_flac_dec_handle_seek_event): Add support for segment seeks (fixes #338290). Also demote some recurring debug message from DEBUG to LOG level. 2006-04-20 13:23:40 +0000 Tim-Philipp Müller gst/matroska/: Set DISCONT flag on first buffer after a discontinuity. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroskademux_do_index_seek), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_parse_blockgroup_or_simpleblock): * gst/matroska/matroska-ids.h: Set DISCONT flag on first buffer after a discontinuity. Fix newsegment events sent when seeking and honour KEY_UNIT seek flag. Create pad with bogus caps if we don't recognise the stream codec id. * gst/matroska/matroska-demux.h: Fix GObject macros. 2006-04-20 11:00:16 +0000 Mark Nauwelaerts gst/matroska/matroska-demux.c: Handle end of segment properly when set; don't dead-lock when posting start of segment... Original commit message from CVS: Patch by: Mark Nauwelaerts * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_loop): Handle end of segment properly when set; don't dead-lock when posting start of segment message when doing a segment seek. Fixes #338810. 2006-04-20 09:48:05 +0000 j^ gst/qtdemux/qtdemux.c: Never treat video streams as an audio stream. Original commit message from CVS: Patch by: j^ * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (qtdemux_video_caps): Never treat video streams as an audio stream. Add qtdrw mime type. Fixes #339041 2006-04-20 09:11:22 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Make mpeg2 aac audio work: create artificial private codec data chunk which faad2 seem... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps), (gst_matroska_demux_plugin_init): Make mpeg2 aac audio work: create artificial private codec data chunk which faad2 seems to require, just as we do for mpeg4 aac. Also call gst_riff_init(). Partially fixes #338767. 2006-04-19 15:16:33 +0000 Tim-Philipp Müller gst/wavenc/gstwavenc.*: Set caps on first outgoing buffer, so that it doesn't error out immediately with a non-negoti... Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_base_init), (gst_wavenc_class_init), (gst_wavenc_init), (gst_wavenc_create_header_buf), (gst_wavenc_push_header), (gst_wavenc_sink_setcaps), (get_id_from_name), (gst_wavenc_event), (gst_wavenc_chain), (gst_wavenc_change_state): * gst/wavenc/gstwavenc.h: Set caps on first outgoing buffer, so that it doesn't error out immediately with a non-negotiated error (#338716). Rewrite and clean up a bit; fix setcaps function to parse things properly; fix sink caps (8bit audio is unsigned and doesn't have depth); use boilerplate macros; remove unused properties stuff. 2006-04-19 09:27:00 +0000 Wim Taymans gst/qtdemux/qtdemux.c: For VBR audio, don't try to calculate the samples_per_frame. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): For VBR audio, don't try to calculate the samples_per_frame. Fixes #338935. 2006-04-18 18:14:34 +0000 Tim-Philipp Müller ext/gdk_pixbuf/gstgdkpixbuf.c: Leave JPEG decoding to our jpegdec plugin. gdkpixbufdec cannot handle MJPEG streams an... Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: Leave JPEG decoding to our jpegdec plugin. gdkpixbufdec cannot handle MJPEG streams and might be autoplugged for those if the user doesn't have jpegdec installed (resulting in a cryptic error message about huffman tables). Better to disable JPEG decoding here and let the user figure out that she needs to install jpegdec. 2006-04-18 18:04:48 +0000 Tim-Philipp Müller ext/gdk_pixbuf/gstgdkpixbuf.*: Make work with packetised/framed input (e.g. png-in-quicktime). Use Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), (gst_gdk_pixbuf_class_init), (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_flush), (gst_gdk_pixbuf_chain): * ext/gdk_pixbuf/gstgdkpixbuf.h: Make work with packetised/framed input (e.g. png-in-quicktime). Use GST_ELEMENT_ERROR when we return GST_FLOW_ERROR. Add some GST_DEBUG_FUNCPTR here and there. Use GST_LOG for recurring debug messages. Fix boilerplate macros. 2006-04-18 17:29:42 +0000 Tim-Philipp Müller ext/gdk_pixbuf/gstgdkpixbuf.c: No need to special-case for Gdk-2.0 any longer, we require Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_get_capslist), (gst_gdk_pixbuf_set_property), (gst_gdk_pixbuf_get_property): No need to special-case for Gdk-2.0 any longer, we require Gdk 2.2 or newer; minor clean-ups. 2006-04-18 17:17:55 +0000 Tim-Philipp Müller Rewrite a bit: use GstBaseSink::start and stop instead of a state change function; use GST_ELEMENT_ERROR for error re... Original commit message from CVS: * ext/shout2/gstshout2.c: (gst_shout2send_base_init), (gst_shout2send_class_init), (gst_shout2send_init), (set_shout_metadata), (gst_shout2send_set_metadata), (gst_shout2send_event), (gst_shout2send_start), (gst_shout2send_connect), (gst_shout2send_stop), (gst_shout2send_render), (gst_shout2send_set_property), (gst_shout2send_get_property), (gst_shout2send_setcaps), (plugin_init): * ext/shout2/gstshout2.h: * po/POTFILES.in: Rewrite a bit: use GstBaseSink::start and stop instead of a state change function; use GST_ELEMENT_ERROR for error reporting, not g_error() or GST_ERROR(); don't unref caps in setcaps function, will cause crashes or assertion failures; remove (unused) "sync" property, basesink already has such a property; misc. other minor fixes and cleanups. 2006-04-18 14:15:33 +0000 Tim-Philipp Müller Add translatable error message for when we cannot connect to the sound server, as "Cannot open resource for writing" ... Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_open), (gst_esdsink_prepare): * ext/esd/gstesd.c: (plugin_init): * po/POTFILES.in: Add translatable error message for when we cannot connect to the sound server, as "Cannot open resource for writing" isn't really an acceptable message to show to the user in this case. 2006-04-18 13:32:29 +0000 Tim-Philipp Müller sys/oss/gst-i18n-plugin.h: Remove bogus file that doesn't belong here. Original commit message from CVS: * sys/oss/gst-i18n-plugin.h: Remove bogus file that doesn't belong here. 2006-04-17 19:57:10 +0000 Philippe Valembois ext/shout2/gstshout2.*: Handle tags being received before the connection to the server is established properly (see #... Original commit message from CVS: Patch by: Philippe Valembois * ext/shout2/gstshout2.c: (gst_shout2send_init), (gst_shout2send_set_metadata), (gst_shout2send_event), (gst_shout2send_render), (gst_shout2send_change_state): * ext/shout2/gstshout2.h: Handle tags being received before the connection to the server is established properly (see #338636). 2006-04-17 19:43:32 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: Just added a gtk-doc comment. Original commit message from CVS: Just added a gtk-doc comment. 2006-04-17 19:12:36 +0000 Tim-Philipp Müller ext/shout2/gstshout2.c: Don't crash in case the connection to the server fails: don't set pointer to NULL by assignin... Original commit message from CVS: * ext/shout2/gstshout2.c: (gst_shout2send_render): Don't crash in case the connection to the server fails: don't set pointer to NULL by assigning FALSE; error out properly by using GST_ELEMENT_ERROR and returning GST_FLOW_ERROR (fixes #338636). Lastly, free connection before resetting the pointer. 2006-04-17 10:01:51 +0000 Alex Lancaster gst/id3demux/id3tags.c: (Fixes #338713) Original commit message from CVS: * gst/id3demux/id3tags.c: Recognise TCO (Genre) tags in ID3v2.2. Patch by Alex Lancaster (Fixes #338713) 2006-04-13 21:45:57 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: * sys/v4l2/v4l2src_calls.c: Fixed some memory leaks. Original commit message from CVS: Fixed some memory leaks. 2006-04-13 09:15:31 +0000 Thomas Vander Stichele * ChangeLog: * gst/rtp/Makefile.am: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtppcmadepay.h: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmapay.h: * gst/rtp/gstrtppcmudepay.h: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtppcmupay.h: * gst/rtp/gstrtpspeexdepay.h: * gst/rtp/gstrtpspeexpay.h: reverting rtp patches to fix freeze break on -base as explained on the list Original commit message from CVS: reverting rtp patches to fix freeze break on -base as explained on the list 2006-04-13 09:01:17 +0000 Tim-Philipp Müller gst/rtp/: Fix GObject macros. Original commit message from CVS: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtpilbcdepay.h: * gst/rtp/gstrtpilbcpay.h: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtppcmadepay.h: * gst/rtp/gstrtppcmapay.h: * gst/rtp/gstrtppcmudepay.h: * gst/rtp/gstrtppcmupay.h: * gst/rtp/gstrtpspeexdepay.h: * gst/rtp/gstrtpspeexpay.h: Fix GObject macros. 2006-04-13 03:42:51 +0000 Philippe Kalaf gst/rtp/: Ported mulaw and alaw payloaders to use new base class Original commit message from CVS: 2006-04-12 Philippe Kalaf * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmapay.h: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtppcmupay.h: Ported mulaw and alaw payloaders to use new base class * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpilbcpay.h: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcdepay.h: Added new iLBC payloader/depayloader. Payloader uses new audio payload base class. 2006-04-12 21:57:02 +0000 Edgard Lima * sys/v4l2/gstv4l2src.c: Fix to work in read mode. Original commit message from CVS: Fix to work in read mode. 2006-04-12 09:42:10 +0000 Wim Taymans ext/gdk_pixbuf/gstgdkpixbuf.c: Some cleanups. Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), (gst_gdk_pixbuf_get_capslist), (gst_gdk_pixbuf_sink_getcaps), (gst_gdk_pixbuf_class_init), (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_flush), (gst_gdk_pixbuf_sink_event), (gst_gdk_pixbuf_chain): Some cleanups. Added RGBA as a possible output format. Correctly free the supported mimetypes. deprecate silent arg, it's not used. Return result from _alloc_buffer to peer. 2006-04-11 18:03:36 +0000 Tim-Philipp Müller gst/rtp/gstrtpmp4vdepay.c: Don't leak memory allocated by gst_buffer_new_and_alloc() by overwriting GST_BUFFER_MALLOC... Original commit message from CVS: * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_process): Don't leak memory allocated by gst_buffer_new_and_alloc() by overwriting GST_BUFFER_MALLOCDATA. 2006-04-11 15:27:31 +0000 Christian Schaller * gst-plugins-good.spec.in: fix version number macro Original commit message from CVS: fix version number macro 2006-04-11 09:35:45 +0000 Tim-Philipp Müller ext/libpng/gstpngdec.*: Handle more than one frame if the content is framed, like with png-in-quicktime (#331917). Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_init), (user_endrow_callback), (user_end_callback), (gst_pngdec_caps_create_and_set), (gst_pngdec_chain), (gst_pngdec_sink_setcaps), (gst_pngdec_sink_event), (gst_pngdec_libpng_clear), (gst_pngdec_change_state): * ext/libpng/gstpngdec.h: Handle more than one frame if the content is framed, like with png-in-quicktime (#331917). 2006-04-10 19:55:31 +0000 Thomas Vander Stichele sys/oss/: - the user-visible error strings were in the wrong category Original commit message from CVS: * sys/oss/Makefile.am: * sys/oss/common.h: * sys/oss/gstosssink.c: (gst_oss_sink_init), (gst_oss_sink_open), (gst_oss_sink_prepare), (gst_oss_sink_unprepare): * sys/oss/gstosssrc.c: (gst_oss_src_prepare), (gst_oss_src_unprepare): - the user-visible error strings were in the wrong category - and the messages were not marked for translation - which is actually a good thing, because they were exactly the kind of message you would never want anyone to see - the macros were using variables that didn't exist in the macro arguments - and they were obviously copied from each other and then modified - so a common header makes sense 2006-04-10 17:16:09 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Fix parsing of newer stsd chunks again. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Fix parsing of newer stsd chunks again. 2006-04-10 16:09:03 +0000 Tim-Philipp Müller gst/matroska/ebml-read.c: Don't try to modify read-only data. Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_sint): Don't try to modify read-only data. * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup_or_simpleblock): Fix comment (won't crash any longer now). 2006-04-10 15:48:55 +0000 Michael Smith ext/annodex/gstcmmlenc.c: Use copies of header buffers for caps to avoid circular refcounting problems (as in theorad... Original commit message from CVS: * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_set_header_on_caps): Use copies of header buffers for caps to avoid circular refcounting problems (as in theoradec, vorbisdec). * tests/check/elements/cmmldec.c: (GST_START_TEST): Fix a typo in test that meant it was testing the wrong thing. * tests/check/elements/cmmlenc.c: (check_headers): Fix refcount checks now that we use buffer-copies for caps. 2006-04-10 15:43:54 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Use static pad templates with ANY caps for audio and video source pads and get rid of ... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), (gst_matroska_demux_subtitle_caps), (gst_matroska_demux_plugin_init): Use static pad templates with ANY caps for audio and video source pads and get rid of a lot of unnecessary (and partially broken) code for the template caps. Clean up caps finding functions. Fixes playback of audio files/streams that do not contain the sample rate and/or number of channels in the audio context (happens a lot with vorbis/mp3 .mka files it seems). Fixes #337183. Also add myself to copyright holders. 2006-04-10 15:29:21 +0000 Michael Smith ext/annodex/gstcmmlutils.c: Use g_list_delete_link () instead of g_list_remove_link () so that we free the link as we... Original commit message from CVS: * ext/annodex/gstcmmlutils.c: (gst_cmml_track_list_del_clip): Use g_list_delete_link () instead of g_list_remove_link () so that we free the link as well as the contained data. 2006-04-10 14:20:41 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Fix framerate calculation. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse_trak): Fix framerate calculation. 2006-04-10 10:10:55 +0000 Ryan Lortie (desrt) gst/avi/gstavidemux.c: Fix some crashers with empty chunks. (Fixes #337749) Original commit message from CVS: Patch by: Ryan Lortie (desrt) * gst/avi/gstavidemux.c: (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_stream_header): Fix some crashers with empty chunks. (Fixes #337749) 2006-04-10 08:31:40 +0000 Wim Taymans gst/qtdemux/qtdemux.c: force mono 8000 Hz on AMR samples. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): force mono 8000 Hz on AMR samples. 2006-04-09 18:30:51 +0000 Sébastien Moutte ext/neon/gstneonhttpsrc.c: remove atoll by using g_ascii_strtoull (atoll is not supported on WIN32) Original commit message from CVS: * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_start): remove atoll by using g_ascii_strtoull (atoll is not supported on WIN32) * sys/directdraw/gstdirectdrawsink.c: * sys/directsound/gstdirectsoundsink.c: done some cleans in sources * win32/vs6: add project files for neon, qtdemux 2006-04-09 17:31:37 +0000 Sébastien Moutte gst/level/gstlevel.c: use G_GINT64_CONSTANT for INT64 constants Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_set_caps),(gst_level_transform_ip): use G_GINT64_CONSTANT for INT64 constants * gst/videofilter/gstvideobalance.c: define rint for WIN32 #define rint(x) (floor((x)+0.5)) * win32/vs6/libgstavi.dsp: add missing libraries for the link and remove avimux.c from the project as it isn't ported to 0.10 yet 2006-04-09 14:00:32 +0000 Tim-Philipp Müller gst/matroska/ebml-read.c: Even better would be if we actually did the right thing here (also, G_GUINT64_CONSTANT only... Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_sint): Even better would be if we actually did the right thing here (also, G_GUINT64_CONSTANT only exists since GLib-2.10). 2006-04-09 13:52:03 +0000 Tim-Philipp Müller gst/matroska/ebml-read.c: Can't just replace 1LL with 1L here just because MSVC doesn't support it, as it might lead ... Original commit message from CVS: * gst/matroska/ebml-read.c: (gst_ebml_read_sint): Can't just replace 1LL with 1L here just because MSVC doesn't support it, as it might lead to incorrect results when doing the bitshifting here. Using GLib's G_GUINT64_CONSTANT() macro to force a 64-bit constant in a way that all compilers are happy with. 2006-04-08 21:48:01 +0000 Stefan Kost Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) Original commit message from CVS: * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): * ext/arts/gst_arts.c: (gst_arts_class_init): * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): * ext/audiofile/gstafsink.c: (gst_afsink_class_init): * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): * ext/audioresample/gstaudioresample.c: * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_class_init): * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): * ext/jack/gstjack.c: (gst_jack_class_init): * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): * ext/nas/nassink.c: (gst_nassink_class_init): * ext/shout/gstshout.c: (gst_icecastsend_class_init): * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): * ext/sndfile/gstsf.c: (gst_sf_class_init): * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), (gst_swfdec_class_init): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): * gst/chart/gstchart.c: (gst_chart_class_init): * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): * gst/festival/gstfestival.c: (gst_festival_class_init): * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): * gst/filter/gstiir.c: (gst_iir_class_init): * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): * gst/mpeg1sys/gstmpeg1systemencode.c: (gst_system_encode_class_init): * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_class_init): * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_class_init): * gst/overlay/gstoverlay.c: (gst_overlay_class_init): * gst/passthrough/gstpassthrough.c: (passthrough_class_init): * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): * gst/smooth/gstsmooth.c: (gst_smooth_class_init): * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): * gst/stereo/gststereo.c: (gst_stereo_class_init): * gst/switch/gstswitch.c: (gst_switch_class_init): * gst/tta/gstttadec.c: (gst_tta_dec_class_init): * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): * sys/directsound/gstdirectsoundsink.c: (gst_directsoundsink_class_init): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): * sys/v4l2/gstv4l2colorbalance.c: (gst_v4l2_color_balance_channel_class_init): * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), (gst_v4l2_tuner_norm_class_init): * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) 2006-04-08 21:21:45 +0000 Stefan Kost Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) Original commit message from CVS: * ext/aalib/gstaasink.c: (gst_aasink_class_init): * ext/esd/esdsink.c: (gst_esdsink_class_init): * ext/flac/gstflactag.c: (gst_flac_tag_class_init): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_class_init): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init): * ext/jpeg/gstsmokedec.c: (gst_smokedec_class_init): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init): * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init): * ext/libmng/gstmngdec.c: (gst_mngdec_class_init): * ext/libmng/gstmngenc.c: (gst_mngenc_class_init): * ext/libpng/gstpngdec.c: (gst_pngdec_class_init): * ext/libpng/gstpngenc.c: (gst_pngenc_class_init): * ext/mikmod/gstmikmod.c: (gst_mikmod_class_init): * ext/shout2/gstshout2.c: (gst_shout2send_class_init): * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): * gst/alpha/gstalpha.c: (gst_alpha_class_init): * gst/avi/gstavimux.c: (gst_avimux_class_init): * gst/debug/efence.c: (gst_efence_class_init): * gst/debug/negotiation.c: (gst_negotiation_class_init): * gst/flx/gstflxdec.c: (gst_flxdec_class_init): * gst/goom/gstgoom.c: (gst_goom_class_init): * gst/id3demux/gstid3demux.c: (gst_id3demux_class_init): * gst/interleave/deinterleave.c: (deinterleave_class_init): * gst/interleave/interleave.c: (interleave_class_init): * gst/law/alaw-decode.c: (gst_alawdec_class_init): * gst/law/alaw-encode.c: (gst_alawenc_class_init): * gst/law/mulaw-encode.c: (gst_mulawenc_class_init): * gst/median/gstmedian.c: (gst_median_class_init): * gst/monoscope/gstmonoscope.c: (gst_monoscope_class_init): * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init): * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_class_init): * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_class_init): * gst/rtp/gstrtpL16pay.c: (gst_rtpL16pay_class_init): * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_class_init): * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_class_init): * gst/rtp/gstrtpdepay.c: (gst_rtp_depay_class_init): * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_class_init): * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_class_init): * gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_class_init): * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_class_init): * gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init): * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_class_init): * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_class_init): * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_class_init): * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_class_init): * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_class_init): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_class_init): * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_class_init): * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init): * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_class_init): * gst/rtsp/gstrtpdec.c: (gst_rtpdec_class_init): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_class_init): * gst/smpte/gstsmpte.c: (gst_smpte_class_init): * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init): * gst/udp/gstudpsink.c: (gst_udpsink_class_init): * gst/videomixer/videomixer.c: (gst_videomixer_class_init): * gst/wavenc/gstwavenc.c: (gst_wavenc_class_init): * sys/oss/gstossdmabuffer.c: (gst_ossdmabuffer_class_init): * sys/oss/gstosssink.c: (gst_oss_sink_class_init): * sys/osxaudio/gstosxaudioelement.c: (gst_osxaudioelement_class_init): * sys/osxaudio/gstosxaudiosink.c: (gst_osxaudiosink_class_init): * sys/osxaudio/gstosxaudiosrc.c: (gst_osxaudiosrc_class_init): * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_class_init): Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) 2006-04-08 19:06:25 +0000 Stefan Kost Fix more broken GObject macros Original commit message from CVS: * ext/mikmod/gstmikmod.h: * gst/level/gstlevel.h: Fix more broken GObject macros 2006-04-08 18:41:07 +0000 Stefan Kost Fix broken GObject macros Original commit message from CVS: * ext/xine/gstxine.h: * gst-libs/gst/play/play.h: * sys/v4l2/gstv4l2element.h: * sys/ximagesrc/ximageutil.h: Fix broken GObject macros 2006-04-08 18:25:55 +0000 Stefan Kost Fix broken GObject macros Original commit message from CVS: * ext/annodex/gstcmmldec.h: * ext/annodex/gstcmmlenc.h: * ext/annodex/gstcmmltag.h: * ext/cairo/gsttextoverlay.h: * ext/ladspa/gstsignalprocessor.h: * gst/matroska/ebml-read.h: * gst/matroska/ebml-write.h: * sys/osxaudio/gstosxaudioelement.h: Fix broken GObject macros 2006-04-08 18:23:04 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Don't make rounding errors in timestamp/duration calculations. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample), (gst_qtdemux_chain), (gst_qtdemux_add_stream), (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_parse_trak): Don't make rounding errors in timestamp/duration calculations. Fix timestamps for AMR and IMA4. Fixes (#337436). Create a dummy segment even when there is no edit list. 2006-04-08 13:09:50 +0000 Tim-Philipp Müller ext/flac/gstflacdec.c: Don't try to seek beyond the end of the file (would occasionally display error dialogs in tote... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_handle_seek_event): Don't try to seek beyond the end of the file (would occasionally display error dialogs in totem when seeking to the end) (#335869). Will still throw an error though if the file is truncated and the total_samples value in the stream header is wrong. 2006-04-07 18:15:08 +0000 Tim-Philipp Müller ext/flac/gstflacdec.*: If the stream header doesn't contain the total number of samples, search for the last flac fra... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_calculate_crc8), (gst_flac_dec_scan_got_frame), (gst_flac_dec_scan_for_last_block), (gst_flac_dec_metadata_callback): * ext/flac/gstflacdec.h: If the stream header doesn't contain the total number of samples, search for the last flac frame at the end of the file and calculate the total duration from that frame's offset (fixes #337609). 2006-04-07 15:53:43 +0000 Zaheer Abbas Merali Typo fix, s/XFree86/X11 and added doc blurb saying that it fixates to 25fps Original commit message from CVS: 2006-04-07 Zaheer Abbas Merali * ext/amrwb/amrwb-code/Makefile.am: * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_recalc), (gst_ximagesrc_create), (gst_ximagesrc_set_property): Typo fix, s/XFree86/X11 and added doc blurb saying that it fixates to 25fps 2006-04-07 15:47:27 +0000 Zaheer Abbas Merali tests/icles/ximagesrc-test.c: Actually assert that pipeline goes to playing Original commit message from CVS: 2006-04-07 Zaheer Abbas Merali * tests/icles/ximagesrc-test.c: (main): Actually assert that pipeline goes to playing 2006-04-07 15:27:40 +0000 Zaheer Abbas Merali sys/ximagesrc/ximagesrc.c: Fix typo, C++ style comments and other small cleanups Original commit message from CVS: 2006-04-07 Zaheer Abbas Merali * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_recalc), (composite_pixel), (gst_ximagesrc_ximage_get), (gst_ximagesrc_create), (gst_ximagesrc_set_property): Fix typo, C++ style comments and other small cleanups 2006-04-07 10:48:19 +0000 Edward Hervey gst/avi/gstavidemux.c: Don't unref the GstPadTemplate returned by gst_element_class_get_pad_template(). Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream): Don't unref the GstPadTemplate returned by gst_element_class_get_pad_template(). 2006-04-06 19:16:02 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Added full edit list support. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_handle_src_query), (gst_qtdemux_find_index), (gst_qtdemux_find_keyframe), (gst_qtdemux_find_segment), (gst_qtdemux_move_stream), (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), (gst_qtdemux_change_state), (gst_qtdemux_activate_segment), (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), (qtdemux_parse_trak): Added full edit list support. Avoid overflows in prologue image detection code. Avoid roundoff errors in timestamp calculations. 2006-04-06 11:35:26 +0000 j^ Unify the long descriptions in the plugin details (#337263). Original commit message from CVS: Patch by: j^ * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/arts/gst_arts.c: * ext/artsd/gstartsdsink.c: * ext/audiofile/gstafparse.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/cdaudio/gstcdaudio.c: * ext/directfb/dfbvideosink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): * ext/faac/gstfaac.c: (gst_faac_base_init): * ext/faad/gstfaad.c: * ext/gsm/gstgsmdec.c: * ext/gsm/gstgsmenc.c: * ext/hermes/gsthermescolorspace.c: * ext/ivorbis/vorbisfile.c: * ext/lcs/gstcolorspace.c: * ext/libfame/gstlibfame.c: * ext/libmms/gstmms.c: (gst_mms_base_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): * ext/nas/nassink.c: (gst_nassink_base_init): * ext/neon/gstneonhttpsrc.c: * ext/polyp/polypsink.c: (gst_polypsink_base_init): * ext/sdl/sdlaudiosink.c: * ext/sdl/sdlvideosink.c: * ext/shout/gstshout.c: * ext/snapshot/gstsnapshot.c: * ext/sndfile/gstsf.c: * ext/tarkin/gsttarkindec.c: * ext/tarkin/gsttarkinenc.c: * ext/theora/theoradec.c: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): * gst/chart/gstchart.c: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): * gst/festival/gstfestival.c: * gst/filter/gstiir.c: * gst/filter/gstlpwsinc.c: * gst/freeze/gstfreeze.c: * gst/games/gstpuzzle.c: (gst_puzzle_base_init): * gst/mixmatrix/mixmatrix.c: * gst/mpeg1sys/gstmpeg1systemencode.c: * gst/mpeg1videoparse/gstmp1videoparse.c: * gst/mpeg2sub/gstmpeg2subt.c: * gst/mpegaudioparse/gstmpegaudioparse.c: * gst/multifilesink/gstmultifilesink.c: * gst/overlay/gstoverlay.c: * gst/passthrough/gstpassthrough.c: * gst/playondemand/gstplayondemand.c: * gst/qtdemux/qtdemux.c: * gst/rtjpeg/gstrtjpegdec.c: * gst/rtjpeg/gstrtjpegenc.c: * gst/smooth/gstsmooth.c: * gst/tta/gstttadec.c: (gst_tta_dec_base_init): * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/virtualdub/gstxsharpen.c: * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): * gst/y4m/gsty4mencode.c: Unify the long descriptions in the plugin details (#337263). 2006-04-06 09:14:30 +0000 Brian Cameron sys/sunaudio/gstsunaudiosink.*: Use spec->segsize and spec->segtotal in the prepare function to initialise the ring b... Original commit message from CVS: Patch by: Brian Cameron * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_init), (gst_sunaudiosink_prepare), (gst_sunaudiosink_write): * sys/sunaudio/gstsunaudiosink.h: Use spec->segsize and spec->segtotal in the prepare function to initialise the ring buffer instead of using the buffer-time property (#337421). 2006-04-06 08:52:51 +0000 Tim-Philipp Müller configure.ac: Bump core requirements to CVS for gst_pad_query_peer_duration() which is used by speexdec. Original commit message from CVS: * configure.ac: Bump core requirements to CVS for gst_pad_query_peer_duration() which is used by speexdec. 2006-04-05 18:27:22 +0000 Tim-Philipp Müller ext/speex/: Fix seeking and duration queries (#337033); clean up and refactor a bit. Original commit message from CVS: * ext/speex/gstspeex.c: (plugin_init): * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init), (gst_speex_dec_reset), (gst_speex_dec_init), (speex_dec_convert), (speex_get_sink_query_types), (speex_dec_sink_query), (speex_get_src_query_types), (speex_dec_src_query), (speex_dec_src_event), (speex_dec_sink_event), (speex_dec_chain_parse_header), (speex_dec_chain_parse_comments), (speex_dec_chain_parse_data), (speex_dec_chain), (gst_speex_dec_get_property), (gst_speex_dec_set_property), (speex_dec_change_state): * ext/speex/gstspeexdec.h: Fix seeking and duration queries (#337033); clean up and refactor a bit. 2006-04-05 12:41:14 +0000 Thomas Vander Stichele ext/raw1394/gstdv1394src.c: distinguish between device not found and could not open for reading Original commit message from CVS: * ext/raw1394/gstdv1394src.c: distinguish between device not found and could not open for reading 2006-04-05 08:36:55 +0000 Wim Taymans gst/qtdemux/qtdemux.c: Use duration as segment stop position if none is explicitly configured. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop): Use duration as segment stop position if none is explicitly configured. Also perform EOS when we run past the segment stop. 2006-04-04 11:20:58 +0000 Wim Taymans gst/qtdemux/qtdemux.c: More cleanups, added comments. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_go_back), (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), (gst_qtdemux_chain), (qtdemux_parse_tree), (qtdemux_parse_trak): More cleanups, added comments. Mark discontinuities on outgoing buffers. Post better errors when something goes wrong. Handle EOS and segment end properly. 2006-04-04 08:31:10 +0000 Wim Taymans gst/qtdemux/qtdemux.*: Handle stss boxes so we can mark and find keyframes. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_push_event), (gst_qtdemux_go_back), (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), (gst_qtdemux_handle_src_event), (plugin_init), (gst_qtdemux_change_state), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), (gst_qtdemux_chain), (qtdemux_sink_activate_pull), (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), (qtdemux_parse_trak), (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), (qtdemux_tag_add_gnre), (gst_qtdemux_handle_esds): * gst/qtdemux/qtdemux.h: Handle stss boxes so we can mark and find keyframes. Implement correct accurate and keyframe seeking. Use _DEBUG_OBJECT when possible. 2006-04-03 13:29:20 +0000 Thomas Vander Stichele * tests/check/elements/.gitignore: ignore more Original commit message from CVS: ignore more 2006-04-03 13:28:55 +0000 Thomas Vander Stichele * pkgconfig/Makefile.am: fix dist Original commit message from CVS: fix dist 2006-04-03 09:02:29 +0000 Thomas Vander Stichele add a .pc file so other modules can use good plugins in tests Original commit message from CVS: * Makefile.am: * configure.ac: * pkgconfig/.cvsignore: * pkgconfig/Makefile.am: * pkgconfig/gstreamer-plugins-good-uninstalled.pc.in: add a .pc file so other modules can use good plugins in tests 2006-04-01 16:50:49 +0000 Thomas Vander Stichele * common: * docs/plugins/inspect/plugin-qtdemux.xml: * docs/plugins/inspect/plugin-taglib.xml: * ext/taglib/gsttaglibmux.c: * tests/check/elements/id3v2mux.c: add taglib checks and docs Original commit message from CVS: add taglib checks and docs 2006-04-01 15:30:51 +0000 Thomas Vander Stichele * configure.ac: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/upload.mak: disable use of AS_LIBTOOL_TAGS, it doesn't work correctly Original commit message from CVS: disable use of AS_LIBTOOL_TAGS, it doesn't work correctly 2006-04-01 14:03:03 +0000 Thomas Vander Stichele * common: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-annodex.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-gdkpixbuf.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-halelements.xml: * docs/plugins/inspect/plugin-id3demux.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-ladspa.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-videobalance.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: adding inspect files Original commit message from CVS: adding inspect files 2006-04-01 10:15:33 +0000 Thomas Vander Stichele * tests/icles/ximagesrc-test.c: 5 second timeout Original commit message from CVS: 5 second timeout 2006-04-01 10:14:26 +0000 Thomas Vander Stichele * tests/icles/.gitignore: * tests/icles/Makefile.am: * tests/icles/ximagesrc-test.c: rename test Original commit message from CVS: rename test 2006-04-01 10:09:11 +0000 Thomas Vander Stichele * gst/equalizer/gstiirequalizer.c: * gst/qtdemux/qtdemux.c: * gst/spectrum/gstspectrum.c: * gst/videocrop/gstvideocrop.c: * sys/directdraw/gstdirectdrawplugin.c: * sys/directsound/gstdirectsoundplugin.c: * sys/v4l2/gstv4l2.c: * sys/ximage/gstximagesrc.c: rework build; add translations for v4l2 Original commit message from CVS: rework build; add translations for v4l2 2006-04-01 09:56:45 +0000 Thomas Vander Stichele configure.ac: clean up, use AS_VERSION and AS_NANO Original commit message from CVS: * configure.ac: clean up, use AS_VERSION and AS_NANO * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): use PACKAGE_VERSION define * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: updated 2006-03-31 17:52:36 +0000 Zaheer Abbas Merali Add tests and fix PAR caps issue to ximagesrc Original commit message from CVS: 2006-03-31 Zaheer Abbas Merali * Makefile.am: * configure.ac: * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_ximage_get), (gst_ximagesrc_get_caps), (gst_ximagesrc_class_init): * sys/ximagesrc/ximageutil.c: * tests/Makefile.am: * tests/icles/Makefile.am: * tests/icles/ximagesrc-test.c: (terminate_playback), (main): Add tests and fix PAR caps issue to ximagesrc 2006-03-31 16:32:47 +0000 Zaheer Abbas Merali sys/ximagesrc/ximagesrc.c: Add docs to ximagesrc Original commit message from CVS: 2006-03-31 Zaheer Abbas Merali * sys/ximagesrc/ximagesrc.c: Add docs to ximagesrc 2006-03-31 15:21:35 +0000 Zaheer Abbas Merali sys/ximagesrc/: Fix ximagesrc so a) the cursor doesnt trail and b) there are no yellow rectangles with the cursor Original commit message from CVS: 2006-03-31 Zaheer Abbas Merali * sys/ximagesrc/ximagesrc.c: (composite_pixel), (gst_ximagesrc_ximage_get), (gst_ximagesrc_set_property), (gst_ximagesrc_get_caps), (gst_ximagesrc_class_init): * sys/ximagesrc/ximagesrc.h: * sys/ximagesrc/ximageutil.c: (ximageutil_xcontext_get): * sys/ximagesrc/ximageutil.h: Fix ximagesrc so a) the cursor doesnt trail and b) there are no yellow rectangles with the cursor 2006-03-30 23:46:42 +0000 Sébastien Moutte * win32/vs6/gst_plugins_good.dsw: * win32/vs6/libgstalaw.dsp: * win32/vs6/libgstalpha.dsp: * win32/vs6/libgstalphacolor.dsp: * win32/vs6/libgstapetag.dsp: * win32/vs6/libgstauparse.dsp: * win32/vs6/libgstautodetect.dsp: * win32/vs6/libgstavi.dsp: * win32/vs6/libgstcutter.dsp: * win32/vs6/libgsteffectv.dsp: * win32/vs6/libgstflx.dsp: * win32/vs6/libgstgoom.dsp: * win32/vs6/libgstid3demux.dsp: * win32/vs6/libgstinterleave.dsp: * win32/vs6/libgstjpeg.dsp: * win32/vs6/libgstlevel.dsp: * win32/vs6/libgstmatroska.dsp: * win32/vs6/libgstmedian.dsp: * win32/vs6/libgstmonoscope.dsp: * win32/vs6/libgstmulaw.dsp: * win32/vs6/libgstmultipart.dsp: * win32/vs6/libgstrtp.dsp: * win32/vs6/libgstrtsp.dsp: * win32/vs6/libgstsmpte.dsp: * win32/vs6/libgstspeex.dsp: * win32/vs6/libgstvideobalance.dsp: * win32/vs6/libgstvideobox.dsp: * win32/vs6/libgstvideoflip.dsp: * win32/vs6/libgstvideomixer.dsp: * win32/vs6/libgstwavenc.dsp: * win32/vs6/libgstwavparse.dsp: I'm too lazy to comment this Original commit message from CVS: *** empty log message *** 2006-03-30 23:37:16 +0000 Sébastien Moutte ext\jpeg\smokecodec.c: use of GST_DEBUG instead of DEBUG(a...) for WIN32 Original commit message from CVS: * ext\jpeg\smokecodec.c: use of GST_DEBUG instead of DEBUG(a...) for WIN32 * ext\speex\gstspeexenc.c: (gst_speexenc_set_header_on_caps): move first instruction after all variables declarations * gst\alpha\gstalpha.c: * gst\effectv\gstshagadelic.c: * gst\smpte\paint.c: * gst\videofilter\gstvideobalance.c: define M_PI if it's not defined (it's not defined on WIN32) * gst\cutter\gstcutter.c: (gst_cutter_chain): * gst\id3demux\id3v2frames.c: (parse_relative_volume_adjustment_two): * gst\level\gstlevel.c: (gst_level_set_property), (gst_level_transform_ip): * gst\matroska\matroska-demux.c: (gst_matroska_demux_parse_info), (gst_matroska_demux_video_caps): * gst\matroska\matroska-mux.c: (gst_matroska_mux_start), (gst_matroska_mux_finish): * gst\wavparse\gstwavparse.c: (gst_wavparse_stream_data): use gst_guint64_to_gdouble for conversions * gst\goom\filters.c: (setPixelRGB_): fix a debug which was using undefined variable * gst\level\gstlevel.c: (gst_level_set_caps), (gst_level_transform_ip): * gst\matroska\ebml-read.c: (gst_ebml_read_sint): replace LL suffix with L suffix (LL isn't supported by MSVC6.0) * win32/vs6: add vs6 projects files for most of plugins-good 2006-03-30 15:37:05 +0000 Wim Taymans better/unified long descriptions Original commit message from CVS: * ext/aalib/gstaasink.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttimeoverlay.c: * ext/cdio/gstcdiocddasrc.c: * ext/dv/gstdvdec.c: * ext/esd/esdmon.c: * ext/esd/esdsink.c: * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: * ext/flac/gstflactag.c: * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init): * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init): * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init): * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init): * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokedec.c: * ext/jpeg/gstsmokeenc.c: * ext/libcaca/gstcacasink.c: * ext/libmng/gstmngdec.c: * ext/libmng/gstmngenc.c: * ext/libpng/gstpngdec.c: * ext/libpng/gstpngenc.c: * ext/mikmod/gstmikmod.c: * ext/raw1394/gstdv1394src.c: * ext/shout2/gstshout2.c: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * gst/alpha/gstalpha.c: * gst/alpha/gstalphacolor.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_base_init): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_base_init): * gst/avi/gstavimux.c: (gst_avimux_base_init): * gst/cutter/gstcutter.c: * gst/debug/breakmydata.c: * gst/debug/efence.c: * gst/debug/gstnavigationtest.c: * gst/debug/negotiation.c: * gst/debug/progressreport.c: * gst/debug/testplugin.c: * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstquark.c: * gst/effectv/gstrev.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/interleave/deinterleave.c: * gst/interleave/interleave.c: * gst/law/alaw-decode.c: (gst_alawdec_base_init): * gst/law/alaw-encode.c: (gst_alawenc_base_init): * gst/law/mulaw-decode.c: (gst_mulawdec_base_init): * gst/law/mulaw-encode.c: (gst_mulawenc_base_init): * gst/level/gstlevel.c: * gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init): * gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init): * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/oldcore/gstmd5sink.c: * gst/oldcore/gstmultifilesrc.c: * gst/oldcore/gstpipefilter.c: * gst/oldcore/gstshaper.c: * gst/oldcore/gststatistics.c: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtsp/gstrtpdec.c: * gst/smpte/gstsmpte.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstgamma.c: (gst_gamma_base_init): * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideotemplate.c: (gst_videotemplate_base_init): * gst/videomixer/videomixer.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init): better/unified long descriptions Fixed #336602 Some cleanups to auparse, don't send multiple newsegments. 2006-03-29 16:06:50 +0000 Michael Dominic K ext/dv/gstdvdemux.*: Seek in READY patch. Only works for pull based mode. Original commit message from CVS: From a patch by: Michael Dominic K. * ext/dv/gstdvdemux.c: (gst_dvdemux_class_init), (gst_dvdemux_reset), (gst_dvdemux_src_convert), (gst_dvdemux_send_event), (gst_dvdemux_flush), (gst_dvdemux_loop), (gst_dvdemux_sink_activate_pull), (gst_dvdemux_change_state): * ext/dv/gstdvdemux.h: Seek in READY patch. Only works for pull based mode. Fixes #323880 2006-03-27 17:06:45 +0000 Edgard Lima * sys/v4l2/v4l2src_calls.c: Small fix, now pwc driver can tell about its buffers. Original commit message from CVS: Small fix, now pwc driver can tell about its buffers. 2006-03-27 14:09:18 +0000 Tim-Philipp Müller ext/gdk_pixbuf/gstgdkpixbuf.c: Fix two crashers: don't unref the same caps twice, and set pixbuf loader to NULL after... Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_flush), (gst_gdk_pixbuf_event): Fix two crashers: don't unref the same caps twice, and set pixbuf loader to NULL after freeing it. 2006-03-27 14:00:02 +0000 Wim Taymans ext/speex/gstspeexenc.*: Don't leak adapter. Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speexenc_class_init), (gst_speexenc_finalize), (gst_speexenc_sink_setcaps), (gst_speexenc_chain): * ext/speex/gstspeexenc.h: Don't leak adapter. A push *always* takes ownership of the buffer, even on errors. Small cleanups. 2006-03-26 19:56:37 +0000 Tim-Philipp Müller ext/taglib/gsttaglib.*: Fix newsegment event handling a bit. We need to cache the first newsegment event, because we ... Original commit message from CVS: * ext/taglib/gsttaglib.cc: * ext/taglib/gsttaglib.h: Fix newsegment event handling a bit. We need to cache the first newsegment event, because we can't adjust offsets yet when we get it, as we don't know the size of the tag yet for sure at that point. Also do some minor cleaning up here and there and add some debug statements. 2006-03-26 12:24:56 +0000 Tim-Philipp Müller gst/id3demux/gstid3demux.c: Create source pad without leaking. Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad): Create source pad without leaking. 2006-03-25 21:57:24 +0000 Tim-Philipp Müller ext/taglib/gsttaglib.cc: We do not want to proxy the caps on the sink pad; our source pad should have application/x-i... Original commit message from CVS: * ext/taglib/gsttaglib.cc: We do not want to proxy the caps on the sink pad; our source pad should have application/x-id3 caps; also, don't use already-freed strings in debug messages; finally, adjust buffer offsets on buffers sent out. 2006-03-25 13:02:55 +0000 Tim-Philipp Müller sys/v4l2/gstv4l2src.c: Older kernels don't seem to have this particular v4l2 format, so comment out until this gets f... Original commit message from CVS: * sys/v4l2/gstv4l2src.c: Older kernels don't seem to have this particular v4l2 format, so comment out until this gets fixed properly (and make buildbots happy). 2006-03-25 05:31:28 +0000 Edgard Lima * common: * sys/v4l2/gstv4l2colorbalance.c: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2element.c: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: Just make few things more robust and also some identation. Original commit message from CVS: Just make few things more robust and also some identation. 2006-03-24 19:41:03 +0000 Wim Taymans ext/flac/: Spifify a bit. Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_handle_seek_event): * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.h: Spifify a bit. Fix deadly lock order error in seeking code, STREAM_LOCK cannot be taken within LOCK and the streaming variables are protected with the STREAM_LOCK anyway. 2006-03-24 18:56:16 +0000 Wim Taymans gst/avi/gstavidemux.c: this patch combines the global init_frames with the stream init_frames. Rationale being that t... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), (gst_avi_demux_handle_seek): this patch combines the global init_frames with the stream init_frames. Rationale being that the global delay should be subtracted from any stream delay. Fixes #335858. 2006-03-24 17:11:56 +0000 Stefan Kost gst/: use DEBUG_FUNCPTR for collectpads Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_init): * gst/multipart/multipartmux.c: (gst_multipart_mux_init): * gst/smpte/gstsmpte.c: (gst_smpte_init): * gst/videomixer/videomixer.c: (gst_videomixer_init): use DEBUG_FUNCPTR for collectpads 2006-03-24 09:54:00 +0000 Tim-Philipp Müller ext/jpeg/gstjpegenc.c: Don't crash when encoding images where the number of rows isn't a multiple of 2*DCTSIZE. Add s... Original commit message from CVS: * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init), (gst_jpegenc_chain): Don't crash when encoding images where the number of rows isn't a multiple of 2*DCTSIZE. Add some GST_DEBUG_FUNCPTR. 2006-03-23 21:28:06 +0000 Tim-Philipp Müller More state change function fixes. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_change_state): * gst/interleave/deinterleave.c: (deinterleave_change_state): * gst/interleave/interleave.c: (interleave_change_state): * gst/wavenc/gstwavenc.c: (gst_wavenc_change_state): More state change function fixes. 2006-03-23 20:12:47 +0000 Wim Taymans ext/esd/esdsink.*: Fix esd choppy playback by configuring audiosink correctly. Fixes #325191 Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_getcaps), (gst_esdsink_open), (gst_esdsink_close), (gst_esdsink_prepare), (gst_esdsink_unprepare), (gst_esdsink_delay), (gst_esdsink_reset): * ext/esd/esdsink.h: Fix esd choppy playback by configuring audiosink correctly. Fixes #325191 2006-03-23 19:57:34 +0000 Tim-Philipp Müller ext/libpng/gstpngdec.c: Make state change function thread-safe. Original commit message from CVS: * ext/libpng/gstpngdec.c: (gst_pngdec_change_state): Make state change function thread-safe. 2006-03-23 16:50:32 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: Don't try to read beyond the end of the file just because the header claims a bigger size... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_get_upstream_size), (gst_wavparse_stream_headers), (gst_wavparse_stream_data): Don't try to read beyond the end of the file just because the header claims a bigger size (like with truncated files). 2006-03-23 15:36:27 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.*: Delay source pad creation until we have the first chunk of media data, so the we can exam... Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data), (gst_wavparse_loop): * gst/wavparse/gstwavparse.h: Delay source pad creation until we have the first chunk of media data, so the we can examine the data and adjust the caps accordingly if required. This makes playback of .wav files with DTS-declared-as-PCM content work (#313266). 2006-03-22 19:50:56 +0000 Christian Schaller * gst-plugins-good.spec.in: add videobalance plugn Original commit message from CVS: add videobalance plugn 2006-03-22 13:02:11 +0000 Jan Schmidt * ChangeLog: mention fixed bug number in the changelog Original commit message from CVS: mention fixed bug number in the changelog 2006-03-22 13:00:34 +0000 Jan Schmidt gst/: Don't attempt typefinding on too-short buffers that have been completely trimmed away. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain): * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): Don't attempt typefinding on too-short buffers that have been completely trimmed away. * gst/id3demux/id3tags.c: (id3demux_read_id3v2_tag): Improve the debug output 2006-03-21 18:12:59 +0000 Wim Taymans ext/esd/esdsink.c: Some cleanups. Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), (gst_esdsink_finalize), (gst_esdsink_getcaps), (gst_esdsink_open), (gst_esdsink_close), (gst_esdsink_prepare), (gst_esdsink_write), (gst_esdsink_set_property), (gst_esdsink_get_property): Some cleanups. Reset fd to -1 when we close them. 2006-03-21 16:19:37 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: the OPTIONS request result is optional so don't fail on it. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open): the OPTIONS request result is optional so don't fail on it. 2006-03-21 14:53:36 +0000 Edward Hervey gst/: gcc 4.1 unreferenced pointer fixes. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_reset): * gst/id3demux/gstid3demux.c: (gst_id3demux_reset): * gst/wavparse/gstwavparse.c: (gst_wavparse_create_sourcepad), (gst_wavparse_stream_headers), (gst_wavparse_send_event), (gst_wavparse_change_state): gcc 4.1 unreferenced pointer fixes. 2006-03-21 13:07:31 +0000 Tommi Myöhänen gst/wavparse/gstwavparse.c: Fix block alignment calculation. Alignment should be done before adding the byte offset w... Original commit message from CVS: Patch by: Tommi Myöhänen * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek): Fix block alignment calculation. Alignment should be done before adding the byte offset where the data starts (#335231). 2006-03-20 18:34:21 +0000 Jan Schmidt gst/matroska/ebml-write.c: Ensure that we set correct caps on buffers that are transferred direct from the input. Original commit message from CVS: * gst/matroska/ebml-write.c: (gst_ebml_write_element_push): Ensure that we set correct caps on buffers that are transferred direct from the input. 2006-03-20 17:38:48 +0000 Jan Schmidt gst/goom/: Free filter data when cleaning up. (Fixes: #334995) Original commit message from CVS: * gst/goom/filters.c: (zoomFilterDestroy): * gst/goom/goom_core.c: (goom_close): Free filter data when cleaning up. (Fixes: #334995) 2006-03-20 08:59:29 +0000 Tim-Philipp Müller ext/taglib/gsttaglib.h: Fix left-over gst_my_filter_get_type. Original commit message from CVS: * ext/taglib/gsttaglib.h: Fix left-over gst_my_filter_get_type. 2006-03-17 16:34:36 +0000 Zaheer Abbas Merali * sys/ximage/gstximagesrc.c: Have a show mouse pointer property and use it if we can Original commit message from CVS: Have a show mouse pointer property and use it if we can 2006-03-17 15:33:08 +0000 Tim-Philipp Müller configure.ac: Don't compile udp and rtsp plugins on win32 (mingw) or other systems that don't have for... Original commit message from CVS: * configure.ac: Don't compile udp and rtsp plugins on win32 (mingw) or other systems that don't have for some reason (#316203). 2006-03-16 17:28:07 +0000 Zaheer Abbas Merali * ChangeLog: * ext/raw1394/gstdv1394src.c: * ext/raw1394/gstdv1394src.h: Change bus reset handler so it reports useful information such as whether the device being used connected or disconne... Original commit message from CVS: Change bus reset handler so it reports useful information such as whether the device being used connected or disconnected 2006-03-16 16:06:22 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: We only care about gain and peak data for the master volume. Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_relative_volume_adjustment_two): We only care about gain and peak data for the master volume. 2006-03-16 13:22:28 +0000 Tim-Philipp Müller gst/id3demux/id3v2frames.c: Read replay gain tags (#323721). Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_id_string), (parse_unique_file_identifier), (parse_relative_volume_adjustment_two), (id3v2_tag_to_taglist): Read replay gain tags (#323721). 2006-03-15 23:19:30 +0000 Tim-Philipp Müller configure.ac: Bump requirements to gst-plugins-base CVS because of buggy gst_tag_from_id3_user_tag() in 0.10.5. Original commit message from CVS: * configure.ac: Bump requirements to gst-plugins-base CVS because of buggy gst_tag_from_id3_user_tag() in 0.10.5. 2006-03-15 22:30:24 +0000 Philippe Kalaf * ChangeLog: * gst/rtp/gstrtppcmadepay.c: Fixed one of the caps in the code from mulaw to alaw. Original commit message from CVS: Fixed one of the caps in the code from mulaw to alaw. 2006-03-15 16:21:38 +0000 Jan Schmidt gst/apetag/gsttagdemux.c: Ensure that we set caps on the buffers we pass. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain): Ensure that we set caps on the buffers we pass. * gst/id3demux/gstid3demux.c: (gst_id3demux_chain), (gst_id3demux_sink_activate): Ensure that we set caps on the buffers we pass. Use STREAM, TYPE_NOT_FOUND as the error class when typefinding fails. 2006-03-15 16:17:12 +0000 Edward Hervey Fix memleak with gst_static_pad_template_get(). Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_init): * ext/dv/gstdvdemux.c: (gst_dvdemux_init), (gst_dvdemux_add_pads): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_setcaps): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init): * ext/jpeg/gstsmokedec.c: (gst_smokedec_init): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init): * ext/libmng/gstmngdec.c: (gst_mngdec_init), (gst_mngdec_src_getcaps): * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_caps_create_and_set): * ext/libpng/gstpngenc.c: (gst_pngenc_init): * ext/mikmod/gstmikmod.c: (gst_mikmod_init): * ext/speex/gstspeexdec.c: (gst_speex_dec_init): * gst/alpha/gstalpha.c: (gst_alpha_init): * gst/auparse/gstauparse.c: (gst_au_parse_init): * gst/avi/gstavidemux.c: (gst_avi_demux_init), (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream): * gst/cutter/gstcutter.c: (gst_cutter_init): * gst/debug/efence.c: (gst_efence_init), (gst_efence_getrange), (gst_efence_checkgetrange): * gst/debug/negotiation.c: (gst_negotiation_init): * gst/flx/gstflxdec.c: (gst_flxdec_init): * gst/goom/gstgoom.c: (gst_goom_init): * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_init): * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_init): * gst/rtp/gstrtpL16pay.c: (gst_rtpL16pay_init): * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_init): * gst/rtp/gstrtpdepay.c: (gst_rtp_depay_init): * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_init): * gst/rtsp/gstrtpdec.c: (gst_rtpdec_init): * gst/smpte/gstsmpte.c: (gst_smpte_init): * gst/wavparse/gstwavparse.c: (gst_wavparse_init), (gst_wavparse_create_sourcepad): Fix memleak with gst_static_pad_template_get(). This uses gst_pad_new_from_static_template() instead. Fixes #333512 2006-03-15 15:08:20 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Let's not forget to chain up to the parent dispose. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_dispose): Let's not forget to chain up to the parent dispose. 2006-03-15 14:39:25 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Series of memleak fixes: Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), (gst_qtdemux_init), (gst_qtdemux_dispose), (gst_qtdemux_add_stream), (qtdemux_parse_trak): Series of memleak fixes: - Unref the GstAdapter in finalize. - Use gst_pad_new_from_static_template(), shorter and safer. - Free unused QtDemuxStream when not used. 2006-03-14 17:56:02 +0000 Tim-Philipp Müller configure.ac: Bump -base requirement to 0.10.5 for gst_tag_from_id3_user_tag(), used by id3demux. Original commit message from CVS: * configure.ac: Bump -base requirement to 0.10.5 for gst_tag_from_id3_user_tag(), used by id3demux. * gst/id3demux/gstid3demux.c: (plugin_init): * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_user_text_identification_frame), (parse_unique_file_identifier): Add support for UFID and TXXX frames and extract musicbrainz tags. 2006-03-14 17:24:03 +0000 Edward Hervey sys/v4l2/gstv4l2src.c: Initialization of the debugging category should be as early as possible, moving it from _class... Original commit message from CVS: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_base_init), (gst_v4l2src_class_init): Initialization of the debugging category should be as early as possible, moving it from _class_init() to beginning of _base_init(). 2006-03-14 15:28:00 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Catch short reads, like they might happen with truncated files (see #305279); remove unnecessa... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Catch short reads, like they might happen with truncated files (see #305279); remove unnecessary indentation. 2006-03-14 14:18:16 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Fix DIB image inversion for pictures with a depth != 8 (#305279). Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_invert): Fix DIB image inversion for pictures with a depth != 8 (#305279). 2006-03-14 09:23:09 +0000 Tim-Philipp Müller ext/jpeg/gstjpegdec.*: Fix durations on outgoing buffers after seeking in MJPEG files (#334083); some minor clean-ups. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_class_init), (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: Fix durations on outgoing buffers after seeking in MJPEG files (#334083); some minor clean-ups. 2006-03-13 18:28:18 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Implement seek in READY (re-fixes #327658) Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), (gst_wavparse_change_state): Implement seek in READY (re-fixes #327658) 2006-03-13 17:22:19 +0000 Tim-Philipp Müller ext/taglib/gsttaglib.cc: Add gtk-doc blurb (unused for the time being); match registered plugin name to the filename ... Original commit message from CVS: * ext/taglib/gsttaglib.cc: Add gtk-doc blurb (unused for the time being); match registered plugin name to the filename of the plugin (taglibmux => taglib) 2006-03-13 15:49:08 +0000 Wim Taymans close #333784 unref the result of gst_pad_get_parent() by: Christophe Fergeau. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_setcaps): * ext/esd/esdmon.c: (gst_esdmon_get): * ext/flac/gstflactag.c: (gst_flac_tag_chain): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_setcaps), (gst_gdk_pixbuf_sink_getcaps): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_getcaps), (gst_jpegenc_setcaps): * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_getcaps), (gst_smokeenc_setcaps): * ext/libmng/gstmngdec.c: (gst_mngdec_sinklink), (gst_mngdec_src_getcaps): * ext/libmng/gstmngenc.c: (gst_mngenc_sinklink), (gst_mngenc_chain): * ext/libpng/gstpngenc.c: (gst_pngenc_setcaps): * ext/mikmod/gstmikmod.c: (gst_mikmod_srclink): * ext/speex/gstspeexdec.c: (speex_dec_convert), (speex_dec_src_event), (speex_dec_chain): * gst/avi/gstavimux.c: (gst_avimux_vidsinkconnect), (gst_avimux_audsinkconnect), (gst_avimux_handle_event): * gst/debug/negotiation.c: (gst_negotiation_getcaps), (gst_negotiation_pad_link), (gst_negotiation_chain): * gst/flx/gstflxdec.c: (gst_flxdec_src_query_handler), (gst_flxdec_chain): * gst/interleave/deinterleave.c: (deinterleave_sink_link), (deinterleave_chain): * gst/law/mulaw-encode.c: (mulawenc_setcaps): * gst/median/gstmedian.c: (gst_median_link): * gst/monoscope/gstmonoscope.c: (gst_monoscope_srcconnect), (gst_monoscope_chain): * gst/rtp/gstrtpL16pay.c: (gst_rtpL16pay_sinkconnect): * gst/wavenc/gstwavenc.c: (gst_wavenc_sink_setcaps): * sys/osxaudio/gstosxaudiosink.c: (gst_osxaudiosink_chain): * sys/osxaudio/gstosxaudiosrc.c: (gst_osxaudiosrc_get): close #333784 unref the result of gst_pad_get_parent() by: Christophe Fergeau. 2006-03-13 10:05:09 +0000 Julien Moutte Fix build of v4l2 (sigh) Original commit message from CVS: 2006-03-13 Julien MOUTTE * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: * sys/v4l2/Makefile.am: Fix build of v4l2 (sigh) 2006-03-12 15:33:00 +0000 Edward Hervey sys/v4l2/v4l2src_calls.c: g_atomic_int_set is only available in glib-0.10, use gst_atomic_int_et instead. Original commit message from CVS: * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), (gst_v4l2src_buffer_pool_free): g_atomic_int_set is only available in glib-0.10, use gst_atomic_int_et instead. 2006-03-12 15:25:51 +0000 Edward Hervey sys/v4l2/gstv4l2element.h: Remove tim's addition of "_stdint.h" since it doesn't make the PPC buildbot happy. Original commit message from CVS: * sys/v4l2/gstv4l2element.h: Remove tim's addition of "_stdint.h" since it doesn't make the PPC buildbot happy. I will just use the same comment Ronald used when he added these lines: Yet Another Hack (tm) for kernel header borkedness. 2006-03-12 15:02:02 +0000 Tim-Philipp Müller ext/taglib/: Add support for writing MusicBrainz IDs. Original commit message from CVS: * ext/taglib/Makefile.am: * ext/taglib/gsttaglib.cc: * ext/taglib/gsttaglib.h: Add support for writing MusicBrainz IDs. 2006-03-12 14:43:57 +0000 Tim-Philipp Müller sys/v4l2/gstv4l2element.h: Include "_stdint.h" in an attempt to make the Original commit message from CVS: * sys/v4l2/gstv4l2element.h: Include "_stdint.h" in an attempt to make the PPC-buildbot happy. 2006-03-11 22:50:03 +0000 Edgard Lima * sys/v4l2/Makefile.am: * sys/v4l2/gstv4l2.c: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2element.c: * sys/v4l2/gstv4l2element.h: * sys/v4l2/gstv4l2src.c: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.c: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/gstv4l2xoverlay.c: * sys/v4l2/gstv4l2xoverlay.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: V4L2 ported to 0.10. Original commit message from CVS: V4L2 ported to 0.10. 2006-03-11 10:58:08 +0000 Alex Lancaster ext/taglib/gsttaglib.cc: and add support for TCOP (copyright) Original commit message from CVS: 2006-03-11 Christophe Fergeau Patch by: Alex Lancaster * ext/taglib/gsttaglib.cc: fix writing of TPOS tags (album number), and add support for TCOP (copyright) 2006-03-09 20:02:44 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix build with gcc-4.1 (#327355). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_send_event): Fix build with gcc-4.1 (#327355). 2006-03-09 17:44:17 +0000 Christophe Fergeau new id3v2 muxer based on TagLib Original commit message from CVS: 2006-03-09 Christophe Fergeau reviewed by: Tim-Philipp Müller * configure.ac: * ext/Makefile.am: * ext/taglib/Makefile.am: * ext/taglib/gsttaglib.cc: * ext/taglib/gsttaglib.h: new id3v2 muxer based on TagLib 2006-03-09 11:47:32 +0000 Wim Taymans ext/dv/gstdvdemux.c: Handle events in push mode better, can now do non-flushing seeks in push mode as well. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event), (gst_dvdemux_convert_segment), (gst_dvdemux_demux_frame): Handle events in push mode better, can now do non-flushing seeks in push mode as well. 2006-03-08 12:16:14 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Extract disc number and count from files that use 'disk' instead of 'disc' as node identifier ... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): Extract disc number and count from files that use 'disk' instead of 'disc' as node identifier for that (fixes #332066). 2006-03-07 17:31:03 +0000 Wim Taymans gst/udp/gstdynudpsink.c: Applied patch from Kai Vehmanen, fixes #333624. Original commit message from CVS: * gst/udp/gstdynudpsink.c: (gst_dynudpsink_class_init): Applied patch from Kai Vehmanen, fixes #333624. 2006-03-06 22:22:45 +0000 Julien Moutte ext/libpng/gstpngdec.c: Implement paletted and grayscale png files handling. (#150363). Original commit message from CVS: 2006-03-06 Julien MOUTTE * ext/libpng/gstpngdec.c: (gst_pngdec_caps_create_and_set): Implement paletted and grayscale png files handling. (#150363). 2006-03-06 00:10:29 +0000 Thomas Vander Stichele ext/speex/gstspeexenc.c: fix a tag list assert follow gst-plugins-base/ext/ogg/README; set OFFSET and OFFSET_END. Mu... Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speexenc_set_header_on_caps), (gst_speexenc_chain): fix a tag list assert follow gst-plugins-base/ext/ogg/README; set OFFSET and OFFSET_END. Muxes correctly with gst-plugins-base > 0.9.3 2006-03-05 13:03:40 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Add support for '3IVD' fourcc (#333403). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add support for '3IVD' fourcc (#333403). 2006-03-04 20:11:35 +0000 Tim-Philipp Müller gst/id3demux/: Use new typefind helper functions here as well, and do typefinding in pull-mode if upstream supports t... Original commit message from CVS: * gst/id3demux/Makefile.am: * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad), (gst_id3demux_chain), (gst_id3demux_sink_activate): Use new typefind helper functions here as well, and do typefinding in pull-mode if upstream supports that. 2006-03-04 18:57:37 +0000 Benjamin Pineau sys/sunaudio/: Remove unused variables, breaks build from CVS Original commit message from CVS: * sys/sunaudio/gstsunaudiomixerctrl.c: (gst_sunaudiomixer_ctrl_get_volume), (gst_sunaudiomixer_ctrl_set_volume): * sys/sunaudio/gstsunaudiomixertrack.c: (gst_sunaudiomixer_track_new): Remove unused variables, breaks build from CVS with -Werror (#333392, patch by: Benjamin Pineau) 2006-03-03 23:45:23 +0000 Sébastien Moutte sys/: sinks are now using GST_RANK_PRIMARY to be used with autodectection Original commit message from CVS: * sys/directdraw: * sys/directsound: sinks are now using GST_RANK_PRIMARY to be used with autodectection * win32/vs6: project files updated to fix some bugs * win32/vs7: * win32/vs8: vs7 and vs8 project files added 2006-03-03 18:36:53 +0000 Wim Taymans docs/plugins/: Added wavparse docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Added wavparse docs. * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_create_sourcepad), (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_send_event), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate_pull), (gst_wavparse_change_state): * gst/wavparse/gstwavparse.h: Implement seek in READY (fixes #327658) Added docs and did some cleanups. 2006-03-03 17:51:16 +0000 Tim-Philipp Müller gst/avi/gstavidemux.*: If we have an index, use a duration based on the index instead of blindly trusting the informa... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header): * gst/avi/gstavidemux.h: If we have an index, use a duration based on the index instead of blindly trusting the information in the stream headers (fixes #331817). 2006-03-03 15:50:40 +0000 Wim Taymans docs/plugins/: Added smoke and jpeg to the docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: Added smoke and jpeg to the docs. * ext/jpeg/Makefile.am: * ext/jpeg/gstjpeg.c: (plugin_init): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): * ext/jpeg/gstjpegenc.h: * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), (gst_smokedec_chain): * ext/jpeg/gstsmokedec.h: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): * ext/jpeg/gstsmokeenc.h: * ext/jpeg/smokecodec.h: Port smokedec (fixes #331905). Added some docs. Some cleanups. 2006-03-03 14:39:55 +0000 Wim Taymans docs/plugins/: Added videobalance and videoflip to the docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: Added videobalance and videoflip to the docs. * gst/videofilter/Makefile.am: * gst/videofilter/gstvideobalance.c: (gst_video_balance_update_tables_planar411), (gst_video_balance_is_passthrough), (gst_video_balance_update_properties), (oil_tablelookup_u8), (gst_video_balance_planar411_ip), (gst_video_balance_set_caps), (gst_video_balance_transform_ip), (gst_video_balance_base_init), (gst_video_balance_finalize), (gst_video_balance_class_init), (gst_video_balance_init), (gst_video_balance_interface_supported), (gst_video_balance_interface_init), (gst_video_balance_colorbalance_list_channels), (gst_video_balance_colorbalance_set_value), (gst_video_balance_colorbalance_get_value), (gst_video_balance_colorbalance_init), (gst_video_balance_set_property), (gst_video_balance_get_property), (gst_video_balance_get_type), (plugin_init): * gst/videofilter/gstvideobalance.h: Ported to 0.10. (Fixes #326160) Added docs. * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideoflip.h: Added docs. 2006-03-03 11:07:41 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Use GST_WARNING instead of GST_ERROR for all the too short/long atoms when parsing. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_parse_trak): Use GST_WARNING instead of GST_ERROR for all the too short/long atoms when parsing. Also let's be a bit less vulgar in our warning messages :) 2006-03-02 15:14:22 +0000 Tim-Philipp Müller configure.ac: Bump requirements to current core and -base CVS (core for new typefind helper API, and -base for the Original commit message from CVS: * configure.ac: Bump requirements to current core and -base CVS (core for new typefind helper API, and -base for the WAVFORMATEX support that was added to libgstriff and is needed by wavparse). * gst/apetag/Makefile.am: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain), (gst_tag_demux_sink_activate): Use new typefind helpers for typefinding instead of our home-grown stuff; also, do typefinding in pull-mode if upstream supports that. 2006-02-28 11:59:49 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Can't divide through zero (suppress warning in case of stream with one single still picture) (... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Can't divide through zero (suppress warning in case of stream with one single still picture) (see #327083) 2006-02-28 10:40:01 +0000 Christian Schaller * ChangeLog: remove conflict indicator Original commit message from CVS: remove conflict indicator 2006-02-28 10:39:08 +0000 Christian Schaller * ChangeLog: add missing entry Original commit message from CVS: add missing entry 2006-02-28 10:29:16 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Use DEBUG_OBJECT more. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate), (gst_wavparse_sink_activate_pull): Use DEBUG_OBJECT more. 2006-02-28 10:22:11 +0000 Wim Taymans docs/plugins/: Added dvdec and dvdemux to docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Added dvdec and dvdemux to docs. * ext/dv/gstdvdec.c: (gst_dvdec_base_init), (gst_dvdec_chain): Added docs. Check frame sizes so we don't crash when don't have enough data. Send nice error messages on error. * ext/dv/gstdvdemux.c: (gst_dvdemux_base_init), (gst_dvdemux_class_init), (gst_dvdemux_init), (gst_dvdemux_finalize), (gst_dvdemux_reset), (gst_dvdemux_src_convert), (gst_dvdemux_sink_convert), (gst_dvdemux_src_query), (gst_dvdemux_sink_query), (gst_dvdemux_push_event), (gst_dvdemux_handle_sink_event), (gst_dvdemux_convert_src_pair), (gst_dvdemux_convert_sink_pair), (gst_dvdemux_convert_src_to_sink), (gst_dvdemux_handle_push_seek), (gst_dvdemux_do_seek), (gst_dvdemux_handle_pull_seek), (gst_dvdemux_handle_src_event), (gst_dvdemux_demux_audio), (gst_dvdemux_demux_video), (gst_dvdemux_demux_frame), (gst_dvdemux_flush), (gst_dvdemux_chain), (gst_dvdemux_loop), (gst_dvdemux_sink_activate_push), (gst_dvdemux_sink_activate_pull), (gst_dvdemux_sink_activate), (gst_dvdemux_change_state): * ext/dv/gstdvdemux.h: Added docs. Implement pull mode. Fix memleaks. Reduce memcpy for the video demuxing. 2006-02-28 09:21:27 +0000 Jan Schmidt ext/annodex/: Add a little extra debug. Make the decoder not return NOT_LINKED, as we want to continue decoding all C... Original commit message from CVS: * ext/annodex/gstcmmldec.c: (gst_cmml_dec_sink_event), (gst_cmml_dec_new_buffer), (gst_cmml_dec_parse_preamble), (gst_cmml_dec_parse_head), (gst_cmml_dec_push_clip): * ext/annodex/gstcmmlparser.c: (gst_cmml_parser_parse_chunk): Add a little extra debug. Make the decoder not return NOT_LINKED, as we want to continue decoding all CMML and emitting tags. 2006-02-27 14:37:29 +0000 Christian Schaller * gst-plugins-good.spec.in: add annodex plugin Original commit message from CVS: add annodex plugin 2006-02-27 14:00:18 +0000 Michael Smith ext/annodex/gstskeltag.*: Deleted; these files aren't used any more either. Original commit message from CVS: * ext/annodex/gstskeltag.c: * ext/annodex/gstskeltag.h: Deleted; these files aren't used any more either. 2006-02-25 20:37:29 +0000 Julien Moutte ext/Makefile.am: Fix dist-check. Original commit message from CVS: 2006-02-25 Julien MOUTTE * ext/Makefile.am: Fix dist-check. 2006-02-25 19:36:24 +0000 Julien Moutte ext/annodex/gstcmmlenc.c: Fix another memleak. Original commit message from CVS: 2006-02-25 Julien MOUTTE * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_push_clip): Fix another memleak. 2006-02-25 19:07:41 +0000 Julien Moutte Fix a memleak in gst_cmml_track_list_add_clip. Original commit message from CVS: 2006-02-25 Alessandro Decina * ext/annodex/Makefile.am: * ext/annodex/gstannodex.c: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmlenc.c: * ext/annodex/gstcmmlparser.c: * ext/annodex/gstcmmlparser.h: * ext/annodex/gstcmmlutils.c: * tests/check/elements/cmmldec.c: * tests/check/elements/cmmlenc.c: Fix a memleak in gst_cmml_track_list_add_clip. Handle overflows in clip's start and end times. Add the "encoded" parameter to cmmldec and cmmlenc caps. Do not parse junk at the end of a CMML preamble buffer. Register a libxml error handler to not print stuff on stderr. Check for bad clip start and end times in the testsuites. 2006-02-25 11:37:10 +0000 Julien Moutte ext/annodex/: Fix possible memleaks. Original commit message from CVS: 2006-02-25 Julien MOUTTE * ext/annodex/gstcmmldec.c: (gst_cmml_dec_class_init), (gst_cmml_dec_finalize), (gst_cmml_dec_change_state): * ext/annodex/gstcmmlenc.c: (gst_cmml_enc_class_init), (gst_cmml_enc_finalize), (gst_cmml_enc_change_state): * ext/annodex/gstcmmlutils.c: (gst_cmml_track_list_destroy): Fix possible memleaks. 2006-02-24 23:52:28 +0000 Julien Moutte tests/check/: Fix tests so that they use the plugins-base tags. Original commit message from CVS: 2006-02-25 Julien MOUTTE * tests/check/Makefile.am: * tests/check/elements/cmmldec.c: * tests/check/elements/cmmlenc.c: Fix tests so that they use the plugins-base tags. 2006-02-24 23:36:58 +0000 Julien Moutte ext/Makefile.am: Re-enable module. Original commit message from CVS: 2006-02-25 Julien MOUTTE * ext/Makefile.am: Re-enable module. 2006-02-24 23:32:14 +0000 Julien Moutte tests/check/Makefile.am: Forgot to remove that test. Original commit message from CVS: 2006-02-25 Julien MOUTTE * tests/check/Makefile.am: Forgot to remove that test. 2006-02-24 23:31:08 +0000 Julien Moutte Try to fix Annodex plugin. Original commit message from CVS: 2006-02-25 Julien MOUTTE * ext/annodex/Makefile.am: * ext/annodex/gstannodex.c: (plugin_init): * ext/annodex/gstcmmldec.c: * ext/annodex/gstskeldec.c: * ext/annodex/gstskeldec.h: * tests/check/Makefile.am: * tests/check/elements/skeldec.c: Try to fix Annodex plugin. 2006-02-24 23:06:27 +0000 Julien Moutte tests/check/Makefile.am: Disable those checks as well. Original commit message from CVS: 2006-02-25 Julien MOUTTE * tests/check/Makefile.am: Disable those checks as well. 2006-02-24 22:49:29 +0000 Julien Moutte ext/Makefile.am: Disable annodex for now until we figure out how to make it build. Original commit message from CVS: 2006-02-24 Julien MOUTTE * ext/Makefile.am: Disable annodex for now until we figure out how to make it build. * ext/gdk_pixbuf/Makefile.am: Note for Thomas : Add a rule to your checklist : "please try to at least build what you are going to commit into -good, or if you are too lazy to do that, please check that the buildbots are not crying because of your commit." 2006-02-24 19:51:29 +0000 Edgard Lima * ChangeLog: * configure.ac: * ext/Makefile.am: * ext/gdk_pixbuf/Makefile.am: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/gdk_pixbuf/gstgdkpixbuf.h: * ext/gdk_pixbuf/pixbufscale.c: * ext/gdk_pixbuf/pixbufscale.h: I'm too lazy to comment this Original commit message from CVS: Gdkpixbuf ported from 0.8 to 0.10 by Renato Filho . gst_loader and gdkpixbufanimation still need port. 2006-02-24 19:49:32 +0000 Fabrizio Gennari gst/qtdemux/qtdemux.c: Add support for palettised Apple SMC videos (#327075, based on Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse_trak), (qtdemux_video_caps): Add support for palettised Apple SMC videos (#327075, based on patch by: Fabrizio Gennari ). 2006-02-24 19:07:10 +0000 Michael Smith Add Annodex elements from Alessendro Decina: skeleton and CMML. Original commit message from CVS: * configure.ac: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/Makefile.am: * ext/annodex/Makefile.am: * ext/annodex/gstannodex.c: * ext/annodex/gstannodex.h: * ext/annodex/gstcmmldec.c: * ext/annodex/gstcmmldec.h: * ext/annodex/gstcmmlenc.c: * ext/annodex/gstcmmlenc.h: * ext/annodex/gstcmmlparser.c: * ext/annodex/gstcmmlparser.h: * ext/annodex/gstcmmltag.c: * ext/annodex/gstcmmltag.h: * ext/annodex/gstcmmlutils.c: * ext/annodex/gstcmmlutils.h: * ext/annodex/gstskeldec.c: * ext/annodex/gstskeldec.h: * ext/annodex/gstskeltag.c: * ext/annodex/gstskeltag.h: * tests/check/Makefile.am: * tests/check/elements/cmmldec.c: * tests/check/elements/cmmlenc.c: * tests/check/elements/skeldec.c: Add Annodex elements from Alessendro Decina: skeleton and CMML. Includes tests & docs, oh my! Passes Thomas's -good checklist entirely. Wow. 2006-02-24 17:09:56 +0000 Michael Smith autogen.sh: Check for automake 1.9 as well. Original commit message from CVS: * autogen.sh: Check for automake 1.9 as well. 2006-02-24 14:49:48 +0000 Tim-Philipp Müller ext/flac/gstflacenc.c: Change min. sample rate to 8kHz to match flacdec's. Original commit message from CVS: * ext/flac/gstflacenc.c: Change min. sample rate to 8kHz to match flacdec's. 2006-02-23 20:08:58 +0000 Tim-Philipp Müller ext/cdio/Makefile.am: Add GST_BASE_CFLAGS and GST_BASE_LIBS (seems to be required for Cygwin, see #317048) Original commit message from CVS: * ext/cdio/Makefile.am: Add GST_BASE_CFLAGS and GST_BASE_LIBS (seems to be required for Cygwin, see #317048) * gst/rtp/gstasteriskh263.c: Cygwin has includes for both the unix network socket API and the windows API, but only one can be included, so fix includes to only use one or the other, prefering the unxi one (#317048). 2006-02-23 12:21:25 +0000 Philippe Kalaf rtp/gst/: Separated the G711 payloaders/depayloaders into separate elements for mulaw/alaw. Also removed the old g711... Original commit message from CVS: 2006-02-23 Philippe Kalaf * rtp/gst/gstrtppcmadepay.c: * rtp/gst/gstrtppcmadepay.h: * rtp/gst/gstgstrtppcmapay.c: * rtp/gst/gstgstrtppcmapay.h: * rtp/gst/gstrtppcmudepay.c: * rtp/gst/gstrtppcmudepay.h: * rtp/gst/gstrtppcmupay.c: * rtp/gst/gstrtppcmupay.h: * rtp/gst/Makefile.am: * rtp/gst/gstrtp.c: * rtp/gst/README: Separated the G711 payloaders/depayloaders into separate elements for mulaw/alaw. Also removed the old g711 payloaders/depayloaders. 2006-02-22 20:22:25 +0000 Wim Taymans ext/dv/: Ueber spiffify some more, added debug category. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_base_init), (gst_dvdec_init), (gst_dvdec_change_state): * ext/dv/gstdvdec.h: * ext/dv/gstdvdemux.c: (gst_dvdemux_base_init), (gst_dvdemux_init), (gst_dvdemux_src_convert), (gst_dvdemux_sink_convert), (gst_dvdemux_src_query), (gst_dvdemux_sink_query), (gst_dvdemux_handle_sink_event), (gst_dvdemux_demux_frame), (gst_dvdemux_flush), (gst_dvdemux_chain), (gst_dvdemux_change_state): * ext/dv/gstdvdemux.h: Ueber spiffify some more, added debug category. Use _scale. Use segments, respect playback rate from newsegment. Fix refcount issue. 2006-02-22 09:33:25 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Add 'dvsd' and 'dv25' to list of possible fourcc values for DV Video. Original commit message from CVS: Reviewed by : Edward Hervey * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add 'dvsd' and 'dv25' to list of possible fourcc values for DV Video. Add image/png for fourcc 'png ' 2006-02-20 21:19:59 +0000 Jan Schmidt Port ximagesrc to 0.10 (Closes #304795) Original commit message from CVS: * configure.ac: * sys/Makefile.am: * sys/ximagesrc/Makefile.am: * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_return_buf), (gst_ximagesrc_open_display), (gst_ximagesrc_start), (gst_ximagesrc_stop), (gst_ximagesrc_unlock), (gst_ximagesrc_recalc), (composite_pixel), (gst_ximagesrc_ximage_get), (gst_ximagesrc_create), (gst_ximagesrc_set_property), (gst_ximagesrc_get_property), (gst_ximagesrc_clear_bufpool), (gst_ximagesrc_base_init), (gst_ximagesrc_dispose), (gst_ximagesrc_finalize), (gst_ximagesrc_get_caps), (gst_ximagesrc_set_caps), (gst_ximagesrc_fixate), (gst_ximagesrc_class_init), (gst_ximagesrc_init), (plugin_init): * sys/ximagesrc/ximagesrc.h: * sys/ximagesrc/ximageutil.c: (ximageutil_handle_xerror), (ximageutil_check_xshm_calls), (ximageutil_xcontext_get), (ximageutil_xcontext_clear), (ximageutil_calculate_pixel_aspect_ratio), (gst_ximagesrc_buffer_finalize), (gst_ximage_buffer_free), (gst_ximagesrc_buffer_init), (gst_ximagesrc_buffer_class_init), (gst_ximagesrc_buffer_get_type), (gst_ximageutil_ximage_new), (gst_ximageutil_ximage_destroy): * sys/ximagesrc/ximageutil.h: Port ximagesrc to 0.10 (Closes #304795) === release 0.10.1 === 2006-02-20 19:12:10 +0000 Jan Schmidt configure.ac: releasing 0.10.1, "Slimy - yet satisfying" Original commit message from CVS: 2006-02-20 Jan Schmidt * configure.ac: releasing 0.10.1, "Slimy - yet satisfying" 2006-02-20 13:08:50 +0000 Jan Schmidt ext/ladspa/gstsignalprocessor.c: Fix compilation of LADPSA. It doesn't seem to work, and isn't enabled for the build,... Original commit message from CVS: * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_event), (gst_signal_processor_process): Fix compilation of LADPSA. It doesn't seem to work, and isn't enabled for the build, but it helps me win the feature-count competitions ooh yeah. 2006-02-19 16:02:25 +0000 Wim Taymans gst/avi/gstavidemux.c: Use scaling code for added precission and more correct stop position in case scale==0. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init), (gst_avi_demux_parse_avih), (gst_avi_demux_parse_superindex), (gst_avi_demux_parse_subindex), (gst_avi_demux_parse_stream), (gst_avi_demux_stream_header), (gst_avi_demux_change_state): Use scaling code for added precission and more correct stop position in case scale==0. 2006-02-19 12:09:19 +0000 Wim Taymans gst/flx/gstflxdec.*: Implement DURATION query. Original commit message from CVS: * gst/flx/gstflxdec.c: (gst_flxdec_src_query_handler), (gst_flxdec_chain): * gst/flx/gstflxdec.h: Implement DURATION query. 2006-02-19 11:57:58 +0000 Wim Taymans gst/flx/: Set MALLOCDATA for the temp buffers so we don't leak. Original commit message from CVS: * gst/flx/flx_color.h: * gst/flx/flx_fmt.h: * gst/flx/gstflxdec.c: (gst_flxdec_init), (gst_flxdec_src_query_handler), (flx_decode_color), (gst_flxdec_chain): * gst/flx/gstflxdec.h: Set MALLOCDATA for the temp buffers so we don't leak. Some debug cleanups. Consume all data in the adapter before leaving the chain function. Fixes #330678. 2006-02-18 20:48:09 +0000 Jan Schmidt gst/id3demux/: Handle 0 data size in otherwise valid frames. Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): * gst/id3demux/id3v2frames.c: (id3v2_genre_fields_to_taglist): Handle 0 data size in otherwise valid frames. Handle numeric strings in 2.4.0 even when not in parentheses 2006-02-18 17:20:48 +0000 Tim-Philipp Müller gst/matroska/: Recognise SSA/ASS and USF subtitle formats and set proper caps when they are found. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_subtitle_caps), (gst_matroska_demux_plugin_init): * gst/matroska/matroska-ids.h: Recognise SSA/ASS and USF subtitle formats and set proper caps when they are found. 2006-02-17 18:25:42 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Don't GST_LOG timestamps from nonexistent index entries (#331582). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_movie): Don't GST_LOG timestamps from nonexistent index entries (#331582). 2006-02-17 17:54:05 +0000 Tim-Philipp Müller ext/jpeg/gstjpegdec.c: Fix invalid memory access for some odd-sized images (see image contained in quicktime stream i... Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_decode_direct), (gst_jpeg_dec_chain): Fix invalid memory access for some odd-sized images (see image contained in quicktime stream in #327083); use g_malloc() instead of g_alloca(). 2006-02-17 16:28:29 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Check that the size of the returned buffer is of the correct size because the parser assumes t... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header): Check that the size of the returned buffer is of the correct size because the parser assumes that. Fixes #331543. 2006-02-17 15:37:38 +0000 Wim Taymans gst/rtp/gstrtpamrdepay.c: Patch from Sebastien Cote, fixes #319884 Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_chain): Patch from Sebastien Cote, fixes #319884 2006-02-17 11:19:34 +0000 Tim-Philipp Müller ext/cdio/gstcdio.c: Init debug category (#331253). Original commit message from CVS: * ext/cdio/gstcdio.c: (plugin_init): Init debug category (#331253). 2006-02-17 10:53:38 +0000 Christian Schaller * ext/gconf/gconf.c: * ext/gconf/gconf.h: * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfaudiosink.h: * gconf/gstreamer.schemas.in: * gst-plugins-good.spec.in: add Jurg's patch for multidevice support Original commit message from CVS: add Jurg's patch for multidevice support 2006-02-16 20:30:13 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: Pass extra_data to gst_riff_create_audio_caps(), so that Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers): Pass extra_data to gst_riff_create_audio_caps(), so that WAVEFORMATEX stuff works. Post audio codec name and post it as taglist on the bus. Allow up to 8 channesl for raw PCM in the source pad template caps. 2006-02-16 16:53:52 +0000 Wim Taymans gst/multipart/multipartdemux.c: Applied #318663. Gives quite a few false positives in autoscan mode, but it's better ... Original commit message from CVS: * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), (gst_multipart_demux_class_init), (gst_multipart_demux_init), (gst_multipart_demux_finalize), (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), (gst_multipart_demux_change_state), (gst_multipart_set_property), (gst_multipart_get_property): Applied #318663. Gives quite a few false positives in autoscan mode, but it's better than nothing. Not closing yet. 2006-02-16 14:13:48 +0000 Wim Taymans Update documentation. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-udp.xml: * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_start): Update documentation. Fix args. 2006-02-16 14:02:57 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Don't stop the task if the pad isn't linked. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_event), (gst_qtdemux_loop), (qtdemux_sink_activate_pull): Don't stop the task if the pad isn't linked. 2006-02-16 10:58:18 +0000 Jan Schmidt gst/id3demux/id3tags.c: ID3 2.3.0 used synch-safe integers for the tag size, but not for the frame size. (Fixes #331368) Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_id3v2_frames_to_tag_list): ID3 2.3.0 used synch-safe integers for the tag size, but not for the frame size. (Fixes #331368) 2006-02-16 10:42:25 +0000 Wim Taymans gst/rtsp/README: Updated README. Original commit message from CVS: * gst/rtsp/README: Updated README. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), (gst_rtspsrc_stream_setup_rtp): * gst/rtsp/gstrtspsrc.h: Make sure the RTP port is an even port an try to allocate another if not. Added retry property to control max retries for port allocation. Make sure RTCP port is RTP port+1. Cleanup when port allocation fails. Fixes #319183. 2006-02-16 09:17:58 +0000 Wouter Paesen gst/alpha/gstalpha.c: Don't ignore return value of the parent class's state Original commit message from CVS: * gst/alpha/gstalpha.c: (gst_alpha_change_state): Don't ignore return value of the parent class's state change function (#331385, patch by: Wouter Paesen). 2006-02-15 12:17:28 +0000 Wim Taymans Add HAL sound device wrapper plugins. Closes #329106 Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * ext/Makefile.am: * ext/hal/Makefile.am: * ext/hal/gsthalaudiosink.c: (gst_hal_audio_sink_base_init), (gst_hal_audio_sink_class_init), (gst_hal_audio_sink_reset), (gst_hal_audio_sink_init), (gst_hal_audio_sink_dispose), (do_toggle_element), (gst_hal_audio_sink_set_property), (gst_hal_audio_sink_get_property), (gst_hal_audio_sink_change_state): * ext/hal/gsthalaudiosink.h: * ext/hal/gsthalaudiosrc.c: (gst_hal_audio_src_base_init), (gst_hal_audio_src_class_init), (gst_hal_audio_src_reset), (gst_hal_audio_src_init), (gst_hal_audio_src_dispose), (do_toggle_element), (gst_hal_audio_src_set_property), (gst_hal_audio_src_get_property), (gst_hal_audio_src_change_state): * ext/hal/gsthalaudiosrc.h: * ext/hal/gsthalelements.c: (plugin_init): * ext/hal/gsthalelements.h: * ext/hal/hal.c: (gst_hal_get_string), (gst_hal_render_bin_from_udi), (gst_hal_get_audio_sink), (gst_hal_get_audio_src): * ext/hal/hal.h: Add HAL sound device wrapper plugins. Closes #329106 2006-02-15 12:13:47 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: It appears 100% equals 1/1 and not 100/1 ... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain): It appears 100% equals 1/1 and not 100/1 ... 2006-02-15 10:15:47 +0000 Wim Taymans gst/avi/gstavidemux.c: Add comment in a fultile attempt to stop the copy-and-paste paradigm leading to duplication of... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): Add comment in a fultile attempt to stop the copy-and-paste paradigm leading to duplication of bad code. * gst/rtsp/rtsptransport.c: (rtsp_transport_parse): Mime parameters have to be checked case insensitive 2006-02-15 09:45:27 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: When buffering MDAT data, show the user something is happening by posting 'buffering' messages... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_post_buffering), (gst_qtdemux_chain): When buffering MDAT data, show the user something is happening by posting 'buffering' messages on the bus. 2006-02-14 23:23:08 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Advance stream time for lagging subtitle streams by sending newsegment events with the... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_sync_streams): Advance stream time for lagging subtitle streams by sending newsegment events with the update flag set. 2006-02-14 18:50:13 +0000 Edward Hervey gst/qtdemux/qtdemux.*: Make push-based work if mdat atom is before moov atom. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_handle_src_query), (gst_qtdemux_change_state), (next_entry_size), (gst_qtdemux_chain): * gst/qtdemux/qtdemux.h: Make push-based work if mdat atom is before moov atom. Don't answer duration query. This should be transformed into replying FALSE to seek events. 2006-02-14 16:58:30 +0000 Edward Hervey gst/avi/gstavidemux.c: There can be bogus data before the hdrl LIST tag in the RIFF header. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): There can be bogus data before the hdrl LIST tag in the RIFF header. It's hard to say if it's not respecting the AVI specifications or not, but since Google Video is producing AVIs like that and the other player don't seem to complain, I guess we should do the same. 2006-02-14 11:24:53 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Handle the case where data atoms are before moov atoms in push-based mode. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (next_entry_size), (gst_qtdemux_chain): Handle the case where data atoms are before moov atoms in push-based mode. Errors out gracefully. 2006-02-13 22:04:42 +0000 Edward Hervey gst/qtdemux/: QtDemux can now work push-based. Original commit message from CVS: * gst/qtdemux/Makefile.am: * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), (extract_initial_length_and_fourcc), (gst_qtdemux_loop_state_header), (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop_header), (next_entry_size), (gst_qtdemux_chain), (qtdemux_sink_activate), (qtdemux_sink_activate_pull), (qtdemux_sink_activate_push), (qtdemux_parse_trak): * gst/qtdemux/qtdemux.h: QtDemux can now work push-based. It still needs some love for seeking. 2006-02-13 12:00:51 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Add more validation to ensure that a char encoding conversion produced a valid UTF-8 string. Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_insert_string_field), (parse_split_strings): Add more validation to ensure that a char encoding conversion produced a valid UTF-8 string. 2006-02-13 10:43:15 +0000 Edward Hervey gst/avi/gstavidemux.c: Properly handle end of segment. Closes #330885. Original commit message from CVS: Reviewed by: Edward Hervey * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Properly handle end of segment. Closes #330885. 2006-02-13 10:36:23 +0000 Wim Taymans gst/rtp/gstrtpmp4gpay.h: For got to commit this one. Original commit message from CVS: * gst/rtp/gstrtpmp4gpay.h: For got to commit this one. 2006-02-12 18:59:36 +0000 Wim Taymans gst/rtp/gstrtpmp4gpay.*: Make more things work. Original commit message from CVS: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init), (gst_rtp_mp4g_pay_init), (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_parse_video_config), (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps), (gst_rtp_mp4g_pay_flush): * gst/rtp/gstrtpmp4gpay.h: Make more things work. Handle ACC config strings. 2006-02-12 13:10:20 +0000 Thomas Vander Stichele gst/rtp/gstrtpamrpay.c: set timestamps if no incoming timestamps set Original commit message from CVS: * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): set timestamps if no incoming timestamps set 2006-02-11 13:54:26 +0000 Tim-Philipp Müller gst/apetag/gsttagdemux.c: ... and fix the very same leaks in GstTagDemux. Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_get_upstream_size), (gst_tag_demux_do_typefind): ... and fix the very same leaks in GstTagDemux. 2006-02-11 13:35:13 +0000 Jon Trowbridge gst/id3demux/gstid3demux.c: Original commit message from CVS: * gst/id3demux/gstid3demux.c: (id3demux_get_upstream_size), (gst_id3demux_do_typefind): Fix a couple of mem leaks. (Patch by Jonathan Matthew ) 2006-02-10 17:37:39 +0000 Wim Taymans gst/rtp/gstrtpmp4vpay.c: First set options, then set caps or else the baseclass will not know about the options, duh. Original commit message from CVS: * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_setcaps): First set options, then set caps or else the baseclass will not know about the options, duh. 2006-02-10 17:16:55 +0000 Wim Taymans gst/rtp/gstrtpmp4vpay.c: Don't waste time looking for a config string if we have codec_info on the incomming caps. Original commit message from CVS: * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_class_init), (gst_rtp_mp4v_pay_setcaps): Don't waste time looking for a config string if we have codec_info on the incomming caps. 2006-02-10 16:40:58 +0000 Wim Taymans gst/rtp/README: Say something about case-sensitivity of caps vs mime-attributes. Original commit message from CVS: * gst/rtp/README: Say something about case-sensitivity of caps vs mime-attributes. * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_class_init), (gst_rtp_amr_pay_handle_buffer): * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_get_type), (gst_rtp_mp4g_pay_base_init), (gst_rtp_mp4g_pay_class_init), (gst_rtp_mp4g_pay_init), (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps), (gst_rtp_mp4g_pay_flush), (gst_rtp_mp4g_pay_handle_buffer), (gst_rtp_mp4g_pay_set_property), (gst_rtp_mp4g_pay_get_property), (gst_rtp_mp4g_pay_plugin_init): * gst/rtp/gstrtpmp4gpay.h: Added beginnings of mpeg4-generic payloader (RFC 3640) 2006-02-09 14:20:14 +0000 Wim Taymans gst/rtsp/: Resurected rtpdec to make rtspsrc happy again. Original commit message from CVS: * gst/rtsp/Makefile.am: * gst/rtsp/gstrtpdec.c: (gst_rtpdec_get_type), (gst_rtpdec_class_init), (gst_rtpdec_init), (gst_rtpdec_getcaps), (gst_rtpdec_chain_rtp), (gst_rtpdec_chain_rtcp), (gst_rtpdec_set_property), (gst_rtpdec_get_property), (gst_rtpdec_change_state): * gst/rtsp/gstrtpdec.h: * gst/rtsp/gstrtsp.c: (plugin_init): * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_transport): * gst/rtsp/rtspconnection.c: (read_body), (rtsp_connection_receive): * gst/rtsp/rtspmessage.c: (rtsp_message_dump): Resurected rtpdec to make rtspsrc happy again. Skip attributes from the session id. Don't crash when dumping a message with an empty body. 2006-02-09 14:14:07 +0000 Wim Taymans gst/rtp/gstrtpamrdepay.c: Added more meaningfull warnings when something goes wrong. Original commit message from CVS: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_chain): Added more meaningfull warnings when something goes wrong. Clear F bit on outgoing AMR packets. * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_class_init), (gst_rtp_amr_pay_handle_buffer): Added debugging category Support payloading of multiple AMR frames. * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_depay_data): Added some debugging. 2006-02-09 11:25:42 +0000 Jan Schmidt configure.ac: Back to CVS Original commit message from CVS: * configure.ac: Back to CVS === release 0.10.2 === 2006-02-09 11:22:38 +0000 Jan Schmidt * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-apetag.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cdio.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: Releasing 0.10.2 Original commit message from CVS: Releasing 0.10.2 2006-02-08 17:35:05 +0000 Jan Schmidt * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2006-02-08 17:18:20 +0000 Jan Schmidt * ChangeLog: Oops, jumping the gun with the ChangeLog entry Original commit message from CVS: Oops, jumping the gun with the ChangeLog entry 2006-02-08 17:16:46 +0000 Jan Schmidt configure.ac: Bump core and plugins-base requirement to 0.10.2.2 for API additions (and 1 migration of gst_bin_find_u... Original commit message from CVS: * configure.ac: Bump core and plugins-base requirement to 0.10.2.2 for API additions (and 1 migration of gst_bin_find_unconnected_pad) 2006-02-08 17:12:40 +0000 Tim-Philipp Müller ext/: Register musicbrainz tags. Original commit message from CVS: * ext/flac/gstflac.c: (plugin_init): * ext/speex/gstspeex.c: (plugin_init): Register musicbrainz tags. 2006-02-07 18:31:31 +0000 Thomas Vander Stichele * gst/qtdemux/qtdemux.c: remove unused var Original commit message from CVS: remove unused var 2006-02-07 18:01:17 +0000 Thomas Vander Stichele gst/qtdemux/qtdemux.c: use the correct variable to check if we can calculate the last chunk. Looks like an obvious b... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse_trak): use the correct variable to check if we can calculate the last chunk. Looks like an obvious bug, and makes the dump of offsets comparable to other tools 2006-02-07 17:54:42 +0000 Thomas Vander Stichele gst/qtdemux/qtdemux.c: clean up some debugging, using _OBJECT, moving recurring messages to LOG level Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse_trak): clean up some debugging, using _OBJECT, moving recurring messages to LOG level 2006-02-07 16:23:33 +0000 Tim-Philipp Müller ext/gconf/gconf.h: Remove declaration of function that no longer exists. Original commit message from CVS: * ext/gconf/gconf.h: Remove declaration of function that no longer exists. 2006-02-07 13:39:08 +0000 Zaheer Abbas Merali ext/shout2/gstshout2.c: Make shout2 work for non ogg streams Original commit message from CVS: 2006-02-07 Zaheer Abbas Merali * ext/shout2/gstshout2.c: (gst_shout2send_render), (gst_shout2send_setcaps), (gst_shout2send_change_state): Make shout2 work for non ogg streams 2006-02-06 17:26:43 +0000 Wim Taymans gst/udp/gstmultiudpsink.*: Updated docs. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_render), (gst_multiudpsink_get_property), (gst_multiudpsink_init_send), (gst_multiudpsink_add), (gst_multiudpsink_remove), (gst_multiudpsink_clear), (gst_multiudpsink_get_stats), (gst_multiudpsink_change_state): * gst/udp/gstmultiudpsink.h: Updated docs. Added properties bytes-served, bytes_to_serve. Post proper error messages, Emit client added signal too. 2006-02-06 15:41:25 +0000 Wim Taymans gst/qtdemux/qtdemux.*: Some QT demux loving. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), (gst_qtdemux_loop_header), (qtdemux_inflate), (qtdemux_parse), (qtdemux_parse_trak), (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), (qtdemux_tag_add_gnre), (gst_qtdemux_handle_esds), (qtdemux_video_caps), (qtdemux_audio_caps): * gst/qtdemux/qtdemux.h: Some QT demux loving. Handle seeking in a less broken way. Fix AMR caps to match the AMR decoder. Set first timestamp on AMR samples to 0 for now. Remove some \n in DEBUG strings. Use _scale_int for maximum precision. 2006-02-06 15:31:16 +0000 Thomas Vander Stichele * ChangeLog: * common: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/udp/gstmultiudpsink.c: adding docs for multiudpsink Original commit message from CVS: adding docs for multiudpsink 2006-02-06 15:28:56 +0000 Thomas Vander Stichele gst/level/gstlevel.c: peak below decay is not necessarily an error, so don't ERROR log Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_transform_ip): peak below decay is not necessarily an error, so don't ERROR log 2006-02-06 15:27:06 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: cvs versions Original commit message from CVS: cvs versions 2006-02-06 14:25:34 +0000 Tim-Philipp Müller gst/matroska/ebml-write.*: Make sure we send a newsegment event in BYTES format before sending buffers (#328531). Original commit message from CVS: * gst/matroska/ebml-write.c: (gst_ebml_write_reset), (gst_ebml_write_flush_cache), (gst_ebml_write_element_push), (gst_ebml_write_seek): * gst/matroska/ebml-write.h: Make sure we send a newsegment event in BYTES format before sending buffers (#328531). 2006-02-06 12:18:45 +0000 Tim-Philipp Müller Pass unhandled queries upstream instead of just dropping them (#326446). Update query type arrays here and there. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_src_query), (gst_dvdemux_sink_query): * ext/flac/gstflacdec.c: (gst_flac_dec_src_query): * ext/speex/gstspeexdec.c: (speex_get_query_types), (speex_dec_src_query): * ext/speex/gstspeexenc.c: (gst_speexenc_src_query), (gst_speexenc_sink_query): * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): * gst/matroska/matroska-demux.c: (gst_matroska_demux_get_src_query_types), (gst_matroska_demux_handle_src_query): * gst/wavparse/gstwavparse.c: (gst_wavparse_get_query_types), (gst_wavparse_pad_query): Pass unhandled queries upstream instead of just dropping them (#326446). Update query type arrays here and there. 2006-02-06 11:57:52 +0000 Tim-Philipp Müller tests/check/elements/matroskamux.c: Collectpads in core got changed and now also holds a reference to any pad that is... Original commit message from CVS: * tests/check/elements/matroskamux.c: (setup_src_pad): Collectpads in core got changed and now also holds a reference to any pad that is part of it. Fix refcount checks in test case accordingly. 2006-02-06 11:41:43 +0000 Tim-Philipp Müller gst/apetag/gstapedemux.h: Fix include, for now GstTagDemux is in the apetag dir. Original commit message from CVS: * gst/apetag/gstapedemux.h: Fix include, for now GstTagDemux is in the apetag dir. 2006-02-06 11:34:23 +0000 Tim-Philipp Müller docs/plugins/: Add cdio plugin to docs. Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-cdio.xml: Add cdio plugin to docs. * ext/cdio/gstcdiocddasrc.c: Add gtk-doc blurb. * ext/cdio/gstcdio.c: The plugin is called 'cdio' not 'cddio'. 2006-02-06 10:56:07 +0000 Tim-Philipp Müller Add APE tag demuxer (#325649). Original commit message from CVS: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-apetag.xml: * gst/apetag/Makefile.am: * gst/apetag/gstapedemux.c: * gst/apetag/gstapedemux.h: * gst/apetag/gsttagdemux.c: * gst/apetag/gsttagdemux.h: Add APE tag demuxer (#325649). 2006-02-05 22:22:56 +0000 Jan Schmidt ext/gconf/: Ignore changing the GConf key to "". Ignore GConf key updates that don't actually change the string. Original commit message from CVS: * ext/gconf/gconf.c: (gst_gconf_get_default_audio_sink), (gst_gconf_get_default_video_sink), (gst_gconf_get_default_audio_src), (gst_gconf_get_default_video_src): * ext/gconf/gconf.h: * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), (gst_gconf_audio_sink_init), (gst_gconf_audio_sink_dispose), (do_toggle_element): * ext/gconf/gstgconfaudiosink.h: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), (gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose), (do_toggle_element): * ext/gconf/gstgconfaudiosrc.h: * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), (gst_gconf_video_sink_init), (gst_gconf_video_sink_dispose), (do_toggle_element): * ext/gconf/gstgconfvideosink.h: * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), (gst_gconf_video_src_init), (gst_gconf_video_src_dispose), (do_toggle_element): * ext/gconf/gstgconfvideosrc.h: Ignore changing the GConf key to "". Ignore GConf key updates that don't actually change the string. For now, ignore the GConf key when the state is > READY, as it breaks streaming. Sometime it will be nice to bring the new sink online even mid-stream, by sending NEWSEGMENT info and possibly prerolling. (Fixes #326736) 2006-02-05 20:43:49 +0000 Jan Schmidt gst/goom/: Make goom reentrant by moving all important static variables into instance structures. Original commit message from CVS: * gst/goom/filters.c: (zoomFilterNew), (calculatePXandPY), (setPixelRGB), (setPixelRGB_), (getPixelRGB), (getPixelRGB_), (zoomFilterSetResolution), (zoomFilterDestroy), (zoomFilterFastRGB), (pointFilter): * gst/goom/filters.h: * gst/goom/goom_core.c: (goom_init), (goom_set_resolution), (goom_update), (goom_close): * gst/goom/goom_core.h: * gst/goom/goom_tools.h: * gst/goom/graphic.c: * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), (gst_goom_dispose), (gst_goom_src_setcaps), (gst_goom_chain): * gst/goom/gstgoom.h: * gst/goom/lines.c: (goom_lines): * gst/goom/lines.h: Make goom reentrant by moving all important static variables into instance structures. (Fixes #329181) 2006-02-04 15:41:43 +0000 Tim-Philipp Müller gst/avi/gstavidemux.*: Third attempt, use gst_pad_is_linked() this time. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_all_source_pads_unlinked), (gst_avi_demux_process_next_entry): * gst/avi/gstavidemux.h: Third attempt, use gst_pad_is_linked() this time. 2006-02-04 13:30:12 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Adjust for data length indicators when parsing (Fixes #329810) Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_split_strings): Adjust for data length indicators when parsing (Fixes #329810) Fix stupid bug parsing UTF-8 tag text. Output tag strings with multiple fields as multiple tags, so the app gets all the data. 2006-02-03 20:05:20 +0000 Edgard Lima * ChangeLog: * ext/flac/gstflacenc.c: Fixed a bug add in last commit, where no event is send. Thanks Tim to show me. Original commit message from CVS: Fixed a bug add in last commit, where no event is send. Thanks Tim to show me. 2006-02-03 18:07:35 +0000 Edgard Lima * ChangeLog: * ext/flac/gstflacenc.c: * gst/matroska/ebml-read.c: Just make it compile with --disable-gst-debug. Original commit message from CVS: Just make it compile with --disable-gst-debug. 2006-02-03 16:55:42 +0000 Christian Schaller * gst-plugins-good.spec.in: update spec file Original commit message from CVS: update spec file 2006-02-03 13:06:24 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Never output a tag with a null contents string. Original commit message from CVS: * gst/id3demux/id3v2frames.c: (parse_text_identification_frame), (id3v2_tag_to_taglist), (id3v2_genre_string_to_taglist), (id3v2_genre_fields_to_taglist): Never output a tag with a null contents string. 2006-02-02 21:00:16 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Only pause if all pads are unlinked AND we've tried to send data on all of them at least once. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_all_source_pads_unlinked): Only pause if all pads are unlinked AND we've tried to send data on all of them at least once. 2006-02-02 12:29:24 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Make loop function/task pause itself when all source pads are unlinked. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_all_source_pads_unlinked), (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): Make loop function/task pause itself when all source pads are unlinked. 2006-02-02 10:47:15 +0000 Tim-Philipp Müller Use new functions from core to render a bin from a string. Fixes build. Up requirements to core CVS. Original commit message from CVS: * configure.ac: * ext/gconf/gconf.c: (gst_gconf_render_bin_from_key): Use new functions from core to render a bin from a string. Fixes build. Up requirements to core CVS. 2006-02-01 11:01:04 +0000 Tim-Philipp Müller gst/auparse/gstauparse.c: Don't push buffers into the adapter that we are going to push downstream again without fram... Original commit message from CVS: * gst/auparse/gstauparse.c: (gst_au_parse_chain): Don't push buffers into the adapter that we are going to push downstream again without framing anyway. Also, the adaptor takes ownership of buffers put into it (fixes auparse pushing invalid buffers for .au files with ADPCM contents). Finally, set caps on all outgoing buffers. 2006-01-30 23:13:05 +0000 Jan Schmidt gst/id3demux/: Someone should kick my butt. Remove ID3v1 tags from the end of the file. Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_chain), (gst_id3demux_read_id3v1), (gst_id3demux_sink_activate), (gst_id3demux_send_tag_event): * gst/id3demux/id3tags.c: (id3demux_read_id3v1_tag): Someone should kick my butt. Remove ID3v1 tags from the end of the file. Improve error messages. Send the TAG message as soon as we complete typefinding, instead of waiting until we send the first buffer. Downstream tag event is still sent before the first buffer. 2006-01-29 20:07:49 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackdec.c: Add debug category, use boilerplate macros, fix handling of widths of 32 bits. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_setcaps), (gst_wavpack_dec_base_init), (gst_wavpack_dec_dispose), (gst_wavpack_dec_class_init), (gst_wavpack_dec_sink_event), (gst_wavpack_dec_init), (gst_wavpack_dec_format_samples), (gst_wavpack_dec_chain), (gst_wavpack_dec_plugin_init): Add debug category, use boilerplate macros, fix handling of widths of 32 bits. * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), (gst_wavpack_parse_dispose), (gst_wavpack_parse_class_init), (gst_wavpack_parse_index_get_last_entry), (gst_wavpack_parse_index_get_entry_from_sample), (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), (gst_wavpack_parse_src_query), (gst_wavpack_parse_scan_to_find_sample), (gst_wavpack_parse_send_newsegment), (gst_wavpack_parse_handle_seek_event), (gst_wavpack_parse_src_event), (gst_wavpack_parse_init), (gst_wavpack_parse_get_upstream_length), (gst_wavpack_parse_pull_buffer), (gst_wavpack_parse_create_src_pad), (gst_wavpack_parse_loop), (gst_wavpack_parse_change_state), (gst_wavepack_parse_sink_activate), (gst_wavepack_parse_sink_activate_pull), (gst_wavpack_parse_plugin_init): * ext/wavpack/gstwavpackparse.h: Rewrite a bit, mostly to fix flow logic and to make seeking work. Fix buffer/event refcounting. Add some debug statements. Add width of 32 to source pad template caps. Use boilerplate macros. 2006-01-27 12:17:56 +0000 Andy Wingo ext/dv/: Call dv_set_error_log (dv_decoder_t *, NULL); after dv_decoder_new to not have warings flooding stderr. this... Original commit message from CVS: 2006-01-27 Jan Gerber Reviewed by: Andy Wingo * ext/dv/gstdvdec.c (gst_dvdec_change_state): * ext/dv/gstdvdemux.c (gst_dvdemux_change_state): Call dv_set_error_log (dv_decoder_t *, NULL); after dv_decoder_new to not have warings flooding stderr. this is the suggested way also used in dvgrab and kino. (#328336) 2006-01-27 01:43:07 +0000 Jan Schmidt sys/oss/gstosssink.c: Free the device name string when finalised. Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_class_init), (gst_oss_sink_init), (gst_oss_sink_finalise): Free the device name string when finalised. 2006-01-26 16:23:42 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Fix wrong memcpy source pointer. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Fix wrong memcpy source pointer. 2006-01-25 22:05:28 +0000 Tim-Philipp Müller gst/id3demux/gstid3demux.c: Don't put function calls in g_return_if_fail() statements, or they'll be replaced with NO... Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_remove_srcpad): Don't put function calls in g_return_if_fail() statements, or they'll be replaced with NOOPs if someone compiles with G_DISABLE_CHECKS defined. 2006-01-25 20:33:05 +0000 Jan Schmidt * ChangeLog: changelog surgery Original commit message from CVS: changelog surgery 2006-01-25 18:23:05 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Never trust ANY information encoded in a media file, especially when it's giving you size... Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): Never trust ANY information encoded in a media file, especially when it's giving you sizes. (Fixes #328452) 2006-01-24 18:03:46 +0000 Edgard Lima * ChangeLog: * gst/rtp/gstrtpg711pay.c: I'm too lazy to comment this Original commit message from CVS: Patch written by Kai Vehmanen applied. See bug #325148. 2006-01-24 11:58:53 +0000 Edward Hervey gst/qtdemux/qtdemux.c: More coherent framerate setting on caps. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream), (qtdemux_parse_trak): More coherent framerate setting on caps. If sample_size is available, use that for the samples' duration in the index. This enables single frame streams to work (and I imagine fixes some other cases). Tested on testsuite, no regression. 2006-01-23 18:39:31 +0000 Edward Hervey gst/matroska/: Added recognition of Real Audio and Video streams in matroska demuxer. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), (gst_matroska_demux_plugin_init): * gst/matroska/matroska-ids.h: Added recognition of Real Audio and Video streams in matroska demuxer. 2006-01-23 15:10:55 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Added codec recognition for: _ VP31 : video/x-vp3 _ AVDJ : image/jpeg _ dvcp, dvc : video/x-d... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): Added codec recognition for: _ VP31 : video/x-vp3 _ AVDJ : image/jpeg _ dvcp, dvc : video/x-dv, systemstream=(boolean)false _ 0x6d730017 : audio/x-adpcm, layout=(string)quicktime 2006-01-23 14:32:47 +0000 Jan Schmidt gst/id3demux/id3v2frames.c: Remove errant break statement, and fix compilation with older GCC. Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3v2_tag_to_taglist): Remove errant break statement, and fix compilation with older GCC. 2006-01-23 12:04:12 +0000 Jan Schmidt * ChangeLog: Mention that my last commit fixes #328241 Original commit message from CVS: Mention that my last commit fixes #328241 2006-01-23 11:06:34 +0000 Tim-Philipp Müller sys/sunaudio/: Export functions that are needed in other parts of the code, makes the mixer actually work; adjust mag... Original commit message from CVS: Reviewed by: Tim-Philipp Müller * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_init): Export functions that are needed in other parts of the code, makes the mixer actually work; adjust magic minimum buffer-time value from 3ms to 5ms to work around stuttering during mp3 playback (#327765). 2006-01-23 10:44:03 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: Fix possible deadlock in matroska muxer (#327825). Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/matroska/matroska-mux.c: (gst_matroska_mux_best_pad), (gst_matroska_mux_write_data), (gst_matroska_mux_collected): Fix possible deadlock in matroska muxer (#327825). 2006-01-23 09:59:03 +0000 Jens Granseuer C89 fixes: declare variables at the beginning of a block and Original commit message from CVS: * ext/libpng/gstpngenc.c: (gst_pngenc_chain): * gst/avi/gstavidemux.c: (gst_avi_demux_invert): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps): * gst/rtsp/sdpmessage.h: * gst/udp/gstdynudpsink.c: (gst_dynudpsink_render): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_stats): C89 fixes: declare variables at the beginning of a block and make gcc-2.9x happy (#328264; patch by: Jens Granseuer ). 2006-01-23 09:22:17 +0000 Jan Schmidt gst/id3demux/: Rewrite parsing of text tags to handle multiple NULL terminated strings. Parse numeric genre strings a... Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_read_id3v2_tag): * gst/id3demux/id3tags.h: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_comment_frame), (parse_text_identification_frame), (id3v2_tag_to_taglist), (id3v2_are_digits), (id3v2_genre_string_to_taglist), (id3v2_genre_fields_to_taglist), (parse_split_strings), (free_tag_strings): Rewrite parsing of text tags to handle multiple NULL terminated strings. Parse numeric genre strings and ID3v2 type "(3)(6)Alternative" style genre strings. Parse dates that are only YYYY or YYYY-mm format. 2006-01-21 11:43:53 +0000 Fabrizio gst/qtdemux/qtdemux.c: 'twos' and 'sowt' fourcc can be 16bit or 8bit audio. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (qtdemux_audio_caps): 'twos' and 'sowt' fourcc can be 16bit or 8bit audio. Fix 8bit case (#327133, based on patch by: Fabrizio Gennari ). Also, "G_LITTLE_ENDIAN" and "G_BIG_ENDIAN" are not valid literals for endianness in caps strings, only "LITTLE_ENDIAN" and "BIG_ENDIAN" are valid. 2006-01-20 15:06:28 +0000 Christoph Burghardt gst/videobox/gstvideobox.c: Don't forget to initialize liboil, otherwise our oil functions Original commit message from CVS: * gst/videobox/gstvideobox.c: (gst_video_box_class_init): Don't forget to initialize liboil, otherwise our oil functions will crash (fixes #327871; patch by: Christoph Burghardt ). 2006-01-19 21:46:32 +0000 Tim-Philipp Müller * ChangeLog: ChangeLog surgery (last entry may have been slightly misleading) Original commit message from CVS: ChangeLog surgery (last entry may have been slightly misleading) 2006-01-19 21:00:50 +0000 Brian Cameron configure.ac: just like in the core and gst-plugins-base. Fixes build on Solaris (fixes Original commit message from CVS: * configure.ac: Use plain AS_LIBTOOL_TAGS instead of AS_LIBTOOL_TAGS([CXX]), just like in the core and gst-plugins-base. Fixes build on Solaris (fixes #326683; patch by: Brian Cameron ) 2006-01-19 00:10:51 +0000 Tim-Philipp Müller ext/cdio/: Fix build for libcdio versions >= 76; give slightly lower rank than cdparanoia. Original commit message from CVS: * ext/cdio/gstcdio.c: (gst_cdio_add_cdtext_field), (plugin_init): * ext/cdio/gstcdio.h: * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_get_cdtext): Fix build for libcdio versions >= 76; give slightly lower rank than cdparanoia. 2006-01-18 19:30:36 +0000 Tim-Philipp Müller Port libcdio cdda source, formerly known as cddasrc, now known as cdiocddasrc (fixes #323327). Should also read CD-TE... Original commit message from CVS: * configure.ac: * ext/Makefile.am: * ext/cdio/Makefile.am: * ext/cdio/gstcdio.c: * ext/cdio/gstcdio.h: * ext/cdio/gstcdiocddasrc.c: * ext/cdio/gstcdiocddasrc.h: Port libcdio cdda source, formerly known as cddasrc, now known as cdiocddasrc (fixes #323327). Should also read CD-TEXT if available, but that's not tested (fixes #317658). 2006-01-18 19:08:08 +0000 Tommi Myöhänen gst/wavparse/gstwavparse.c: Fix conversion from TIME to BYTES format (fixes #326864; Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_pad_convert): Fix conversion from TIME to BYTES format (fixes #326864; patch by: Tommi Myöhänen ) 2006-01-18 18:54:02 +0000 Edgard Lima * gst/qtdemux/qtdemux.c: Ronald's patch applied. see bug #326318. Original commit message from CVS: Ronald's patch applied. see bug #326318. 2006-01-17 16:45:43 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.*: Fix seeking for quicktime files. Could still use some more love and sophistication. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), (gst_qtdemux_send_event), (gst_qtdemux_handle_src_event), (gst_qtdemux_change_state), (gst_qtdemux_loop_header): * gst/qtdemux/qtdemux.h: Fix seeking for quicktime files. Could still use some more love and sophistication. 2006-01-16 10:23:47 +0000 Christian Schaller * gst-plugins-good.spec.in: update with love Original commit message from CVS: update with love 2006-01-15 20:21:48 +0000 Sergey Scobich gst/id3demux/id3v2frames.c: Fix compilation of id3demux when zlib is not present. Original commit message from CVS: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame): Fix compilation of id3demux when zlib is not present. (Fixes #326602; patch by: Sergey Scobich) 2006-01-15 14:12:12 +0000 Tim-Philipp Müller ext/esd/Makefile.am: otherwise build will fail for folks with libesd in a non-standard prefix (#327009). Original commit message from CVS: * ext/esd/Makefile.am: Add $(ESD_CFLAGS), otherwise build will fail for folks with libesd in a non-standard prefix (#327009). 2006-01-13 19:29:27 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: back to head Original commit message from CVS: back to head 2006-01-13 19:25:40 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * docs/upload.mak: releasing 0.10.1 Original commit message from CVS: releasing 0.10.1 2006-01-13 18:37:13 +0000 Wim Taymans ext/jpeg/gstsmokeenc.c: fix memleak. Fixes #326618 Original commit message from CVS: patch by: Wim Taymans * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): fix memleak. Fixes #326618 2006-01-13 18:35:00 +0000 Mike Smith gst/level/gstlevel.c: Fix memleak. Fixes #326612 Original commit message from CVS: 2006-01-13 Thomas Vander Stichele patch by: Mike Smith * gst/level/gstlevel.c: (gst_level_message_new), (gst_level_message_append_channel): Fix memleak. Fixes #326612 2006-01-11 11:39:10 +0000 Thomas Vander Stichele configure.ac: prereleasing Original commit message from CVS: * configure.ac: prereleasing * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: update translations 2006-01-11 11:04:03 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Add support for Indeo3 video in Quicktime files. Original commit message from CVS: reviewed by: Edward Hervey * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add support for Indeo3 video in Quicktime files. Closes #326524 2006-01-10 12:38:59 +0000 Michael Smith gst/level/gstlevel.c: Don't leak filter arrays. Original commit message from CVS: * gst/level/gstlevel.c: (gst_level_class_init), (gst_level_dispose): Don't leak filter arrays. 2006-01-09 17:04:52 +0000 Christian Schaller * ChangeLog: * configure.ac: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/upload.mak: * gst-plugins-good.spec.in: * sys/Makefile.am: * sys/sunaudio/Makefile.am: * sys/sunaudio/gstsunaudio.c: * sys/sunaudio/gstsunaudiomixer.c: * sys/sunaudio/gstsunaudiomixer.h: * sys/sunaudio/gstsunaudiomixerctrl.c: * sys/sunaudio/gstsunaudiomixerctrl.h: * sys/sunaudio/gstsunaudiomixertrack.c: * sys/sunaudio/gstsunaudiomixertrack.h: * sys/sunaudio/gstsunaudiosink.c: * sys/sunaudio/gstsunaudiosink.h: add Sun Audio plugin. Verified that nothing breaks and that make check works. Original commit message from CVS: add Sun Audio plugin. Verified that nothing breaks and that make check works. Don't think the docs gets properly built yet, but I don't understand exactly how to enable that. 2006-01-07 20:01:09 +0000 Philippe Kalaf gst-plugins-good/gst/udp/: Allow udpsrc and dynudpsink to take a sockfd as a parameter. For udpsrc, overrides the por... Original commit message from CVS: 2005-01-07 Philippe Khalaf * gst-plugins-good/gst/udp/gstdynudpsink.c: * gst-plugins-good/gst/udp/gstudpsrc.c: Allow udpsrc and dynudpsink to take a sockfd as a parameter. For udpsrc, overrides the port or multicast parameters. Fixes bugs #323021. 2006-01-06 16:28:30 +0000 Tim-Philipp Müller ext/gconf/: Add new gconfaudiosrc and gconfvideosrc elements (needed for gnome-sound-recorder). Original commit message from CVS: * ext/gconf/Makefile.am: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_base_init), (gst_gconf_audio_src_class_init), (gst_gconf_audio_src_reset), (gst_gconf_audio_src_init), (gst_gconf_audio_src_dispose), (do_toggle_element), (cb_toggle_element), (gst_gconf_audio_src_change_state): * ext/gconf/gstgconfaudiosrc.h: * ext/gconf/gstgconfelements.c: (plugin_init): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_base_init), (gst_gconf_video_src_class_init), (gst_gconf_video_src_reset), (gst_gconf_video_src_init), (gst_gconf_video_src_dispose), (do_toggle_element), (cb_toggle_element), (gst_gconf_video_src_change_state): * ext/gconf/gstgconfvideosrc.h: Add new gconfaudiosrc and gconfvideosrc elements (needed for gnome-sound-recorder). 2006-01-06 11:46:53 +0000 Edward Hervey gst/id3demux/gstid3demux.c: Add gst_element_no_more_pads() for proper decodebin behaviour. Original commit message from CVS: * gst/id3demux/gstid3demux.c: (gst_id3demux_add_srcpad): Add gst_element_no_more_pads() for proper decodebin behaviour. * gst/id3demux/id3v2frames.c: (parse_comment_frame), (parse_text_identification_frame), (parse_split_strings): Failure to decode some tags is not a GST_ERROR() but a GST_WARNING() When iterating over a chunk of text, check that we haven't gone too far. 2006-01-05 23:17:44 +0000 Sébastien Moutte * sys/directdraw/gstdirectdrawplugin.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directdraw/gstdirectdrawsink.h: * sys/directsound/gstdirectsoundplugin.c: * sys/directsound/gstdirectsoundsink.c: * sys/directsound/gstdirectsoundsink.h: * win32/vs6/libgstdirectdraw.dsp: * win32/vs6/libgstdirectsound.dsp: added sys/directdraw added sys/directsound added win32/vs6/gst_plugins_bad.dsw added win32/vs6/libgstdirectsound.dsp ... Original commit message from CVS: 2006-01-05 Sebastien Moutte * added sys/directdraw * added sys/directsound * added win32/vs6/gst_plugins_bad.dsw * added win32/vs6/libgstdirectsound.dsp * added win32/vs6/libgstdirectdraw.dsp * added win32/common/config.h 2006-01-05 17:03:45 +0000 Stefan Kost gst/videobox/gstvideobox.c: call oil_init() when using liboil Original commit message from CVS: * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (plugin_init): call oil_init() when using liboil 2006-01-04 17:28:49 +0000 Wim Taymans ext/jpeg/: Fix leaks. Original commit message from CVS: * ext/jpeg/gstsmokedec.c: (gst_smokedec_chain): * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_chain): Fix leaks. 2006-01-02 19:38:32 +0000 Tim-Philipp Müller ext/flac/gstflacdec.c: Don't g_assert() where we should just return FALSE; remove unnecessary g_assert(); initialize ... Original commit message from CVS: Reviewed by: Tim-Philipp Müller * ext/flac/gstflacdec.c: (gst_flac_dec_write), (gst_flac_dec_convert_src), (gst_flac_dec_src_query), (gst_flac_dec_change_state): Don't g_assert() where we should just return FALSE; remove unnecessary g_assert(); initialize some fields properly in state change function (fixes #325504). Also, use GST_DEBUG_OBJECT in two more places. 2005-12-30 15:51:05 +0000 Stefan Kost configure.ac: also remove smoothwave's Makefile.am Original commit message from CVS: * configure.ac: also remove smoothwave's Makefile.am * docs/plugins/Makefile.am: fix plugin docs 2005-12-30 15:39:17 +0000 Thomas Vander Stichele * gst/smoothwave/.gitignore: * gst/smoothwave/Makefile.am: * gst/smoothwave/README: * gst/smoothwave/demo-osssrc.c: * gst/smoothwave/gstsmoothwave.c: * gst/smoothwave/gstsmoothwave.h: remove old plugin that went bad Original commit message from CVS: remove old plugin that went bad 2005-12-30 15:34:18 +0000 Stefan Kost tests/examples/Makefile.am: added missing Makefile.am Original commit message from CVS: * tests/examples/Makefile.am: added missing Makefile.am 2005-12-30 15:28:44 +0000 Stefan Kost moved level-example to tests/examples/level-example Original commit message from CVS: * configure.ac: * gst/level/Makefile.am: * gst/level/level-example.c: * tests/Makefile.am: * tests/examples/level/Makefile.am: * tests/examples/level/level-example.c: (message_handler), (main): moved level-example to tests/examples/level-example * tests/old/examples/level/demo.c: (main): * tests/old/examples/level/plot.c: (main): some initial fixes 2005-12-29 16:36:19 +0000 Michael Smith gst/udp/gstmultiudpsink.*: Track packets sent per client in addition to bytes sent; provide this info through get-sta... Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render), (gst_multiudpsink_remove), (gst_multiudpsink_get_stats): * gst/udp/gstmultiudpsink.h: Track packets sent per client in addition to bytes sent; provide this info through get-stats signal 2005-12-29 11:26:12 +0000 Tim-Philipp Müller gst/auparse/gstauparse.c: Can't use gst_object_unref() on a GstAdapter (#325191). Original commit message from CVS: * gst/auparse/gstauparse.c: (gst_au_parse_dispose): Can't use gst_object_unref() on a GstAdapter (#325191). 2005-12-28 18:55:32 +0000 Jan Schmidt gst/id3demux/id3tags.c: If a broken tag has 0 bytes payload, at least still skip the 10 byte header Original commit message from CVS: * gst/id3demux/id3tags.c: (id3demux_read_id3v2_tag): If a broken tag has 0 bytes payload, at least still skip the 10 byte header 2005-12-22 15:00:41 +0000 Philippe Kalaf gst-plugins-good/gst/rtp/: Making these depayloaders (H263+ and mpeg4 video) inherit from Original commit message from CVS: 2005-12-22 Philippe Khalaf * gst-plugins-good/gst/rtp/gstrtph263pdepay.h: * gst-plugins-good/gst/rtp/gstrtph263pdepay.c: * gst-plugins-good/gst/rtp/gstrtpmp4vdepay.h: * gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c: Making these depayloaders (H263+ and mpeg4 video) inherit from RtpBaseDepayloaderClass. Fixes bugs #323922 and #323908. 2005-12-21 17:15:09 +0000 Jan Schmidt docs/plugins/gst-plugins-good-plugins.*: Regenerate the plugin hiearchy. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: Regenerate the plugin hiearchy. 2005-12-21 15:24:59 +0000 Jan Schmidt Add documentation for id3demux. Original commit message from CVS: 2005-12-21 Jan Schmidt * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * gst/id3demux/gstid3demux.c: (gst_id3demux_get_type), (gst_id3demux_base_init), (gst_id3demux_class_init), (gst_id3demux_chain): * gst/id3demux/gstid3demux.h: Add documentation for id3demux. Don't fail if the first buffer is not at offset 0, just attempt to typefind and do pass through Rename the gst_type function from gst_gst_id3demux.. 2005-12-20 12:44:25 +0000 Michael Smith gst/udp/gstmultiudpsink.*: Collect statistics; return them from get_stats. Original commit message from CVS: * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render), (gst_multiudpsink_add), (gst_multiudpsink_remove), (gst_multiudpsink_get_stats): * gst/udp/gstmultiudpsink.h: Collect statistics; return them from get_stats. 2005-12-19 15:43:30 +0000 Edward Hervey gst/avi/gstavidemux.c: Stupid signedness issue... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan): Stupid signedness issue... 2005-12-19 15:19:44 +0000 Edward Hervey ext/swfdec/gstswfdec.c: Add debugging category and return GstFlowReturn in the right places Original commit message from CVS: * ext/swfdec/gstswfdec.c: (gst_swfdec_class_init), (gst_swfdec_chain), (gst_swfdec_render): Add debugging category and return GstFlowReturn in the right places * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link): Get something from the peer pad once we've checked if there is a peer pad. * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), (qtdemux_tree_get_child_by_type), (qtdemux_parse_trak), (qtdemux_video_caps): Couple of fixes 2005-12-19 15:06:27 +0000 Edward Hervey gst/avi/gstavidemux.c: Construct index for indexless files. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), (gst_avi_demux_peek_tag), (gst_avi_demux_next_data_buffer), (gst_avi_demux_stream_scan), (gst_avi_demux_stream_header), (gst_avi_demux_loop): Construct index for indexless files. Make sure pad/buffers are correctly reset to NULL once we don't need them anymore, else we get lovely segfaults/assertions. * gst/wavparse/gstwavparse.c: Yes, you can have 96KHz audio and wma in wav :( 2005-12-18 15:14:44 +0000 Jan Schmidt configure.ac: Check for optional dependency on zlib for id3demux Original commit message from CVS: * configure.ac: Check for optional dependency on zlib for id3demux * gst/id3demux/Makefile.am: * gst/id3demux/gstid3demux.c: (gst_gst_id3demux_get_type), (gst_id3demux_base_init), (gst_id3demux_class_init), (gst_id3demux_reset), (gst_id3demux_init), (gst_id3demux_dispose), (gst_id3demux_add_srcpad), (gst_id3demux_remove_srcpad), (gst_id3demux_trim_buffer), (gst_id3demux_chain), (gst_id3demux_set_property), (gst_id3demux_get_property), (id3demux_get_upstream_size), (gst_id3demux_srcpad_event), (gst_id3demux_read_id3v1), (gst_id3demux_read_id3v2), (gst_id3demux_sink_activate), (gst_id3demux_src_activate_pull), (gst_id3demux_src_checkgetrange), (gst_id3demux_read_range), (gst_id3demux_src_getrange), (gst_id3demux_change_state), (gst_id3demux_pad_query), (gst_id3demux_get_query_types), (simple_find_peek), (simple_find_suggest), (gst_id3demux_do_typefind), (gst_id3demux_send_tag_event), (plugin_init): * gst/id3demux/gstid3demux.h: * gst/id3demux/id3tags.c: (read_synch_uint), (id3demux_read_id3v1_tag), (id3demux_read_id3v2_tag), (id3demux_id3v2_frame_hdr_size), (convert_fid_to_v240), (id3demux_id3v2_frames_to_tag_list): * gst/id3demux/id3tags.h: * gst/id3demux/id3v2.4.0-frames.txt: * gst/id3demux/id3v2.4.0-structure.txt: * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_comment_frame), (parse_text_identification_frame), (id3v2_tag_to_taglist), (parse_split_strings): All new LGPL id3 demuxer. Can use zlib for compressed frames, otherwise it discards them. Works on my test files. * gst/wavparse/gstwavparse.c: (gst_wavparse_loop): Don't send EOS to a non-existing srcpad The debug category can be static 2005-12-17 17:48:38 +0000 Julien Moutte docs/plugins/: Updates. Original commit message from CVS: 2005-12-17 Julien MOUTTE * docs/plugins/gst-plugins-bad-plugins-decl.txt: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/inspect/plugin-dfbvideosink.xml: * docs/plugins/inspect/plugin-qtdemux.xml: * docs/plugins/inspect/plugin-sdlvideosink.xml: * docs/plugins/inspect/plugin-speed.xml: * docs/plugins/inspect/plugin-tta.xml: Updates. * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_surface_create), (gst_dfbvideosink_event_thread), (gst_dfbvideosink_enum_vmodes), (gst_dfbvideosink_enum_devices), (gst_dfbvideosink_setup), (gst_dfbvideosink_cleanup), (gst_dfbvideosink_can_blit_from_format), (gst_dfbvideosink_get_best_vmode), (gst_dfbvideosink_getcaps), (gst_dfbvideosink_setcaps), (gst_dfbvideosink_show_frame), (gst_dfbvideosink_buffer_alloc), (gst_dfbsurface_finalize), (gst_dfbvideosink_interface_supported), (gst_dfbvideosink_navigation_send_event), (gst_dfbvideosink_update_colorbalance), (gst_dfbvideosink_colorbalance_list_channels), (gst_dfbvideosink_colorbalance_set_value), (gst_dfbvideosink_colorbalance_get_value), (gst_dfbvideosink_colorbalance_init), (gst_dfbvideosink_set_property), (gst_dfbvideosink_get_property), (gst_dfbvideosink_init), (gst_dfbvideosink_class_init): * ext/directfb/dfbvideosink.h: Implement vertical sync and color balance interface. 2005-12-16 21:57:51 +0000 Stefan Kost change some char* into char[] Original commit message from CVS: * ext/esd/esdmon.c: (gst_esdmon_open_audio): * ext/esd/esdsink.c: (gst_esdsink_prepare): * gst/multipart/multipartdemux.c: change some char* into char[] 2005-12-16 19:32:53 +0000 Wim Taymans gst/wavparse/gstwavparse.*: Use GstSegment to implement more seeking features. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), (gst_wavparse_other), (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event), (gst_wavparse_sink_activate_pull): * gst/wavparse/gstwavparse.h: Use GstSegment to implement more seeking features. 2005-12-16 12:25:38 +0000 Tim-Philipp Müller ext/wavpack/gstwavpackdec.c: Oops, remove trailing comma from caps string. Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: Oops, remove trailing comma from caps string. 2005-12-16 10:12:49 +0000 Benjamin Pineau gst/rtsp/rtspconnection.c: Add include and move include to make things work on OpenBSD a... Original commit message from CVS: * gst/rtsp/rtspconnection.c: Add include and move include to make things work on OpenBSD as well (fixes #323717; patch by: Benjamin Pineau) 2005-12-16 09:59:21 +0000 gcocatre@gmail.com ext/wavpack/: Wavpack supports samplerates from 6-192kHz, fix pad template remove buffer-frames from caps, they are g... Original commit message from CVS: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link): * ext/wavpack/gstwavpackparse.c: Wavpack supports samplerates from 6-192kHz, fix pad template caps (fixes #322973; patch by: gcocatre@gmail.com). Also remove buffer-frames from caps, they are gone in 0.10. 2005-12-14 20:05:45 +0000 Edgard Lima * ChangeLog: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: Set clock rate to be fixed in 8000. It fixes bug #324012. Original commit message from CVS: Set clock rate to be fixed in 8000. It fixes bug #324012. 2005-12-14 18:07:16 +0000 Philippe Kalaf gst-plugins-good/gst/rtp/: Fixed payload range in payloder caps. Removed payload range completly from depayloaders as... Original commit message from CVS: 2005-12-14 Philippe Khalaf * gst-plugins-good/gst/rtp/gstasteriskh263.c: * gst-plugins-good/gst/rtp/gstrtpamrdepay.c: * gst-plugins-good/gst/rtp/gstrtpamrpay.c: * gst-plugins-good/gst/rtp/gstrtpg711depay.c: * gst-plugins-good/gst/rtp/gstrtpg711depay.c: * gst-plugins-good/gst/rtp/gstrtpgsmdepay.c: * gst-plugins-good/gst/rtp/gstrtph263pay.c: * gst-plugins-good/gst/rtp/gstrtph263pdepay.c: * gst-plugins-good/gst/rtp/gstrtph263ppay.c: * gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c: * gst-plugins-good/gst/rtp/gstrtpmp4vpay.c: * gst-plugins-good/gst/rtp/gstrtpmpadepay.c: * gst-plugins-good/gst/rtp/gstrtpmpapay.c: * gst-plugins-good/gst/rtp/README: Fixed payload range in payloder caps. Removed payload range completly from depayloaders as they don't require payload type in their caps. In effect, there isn't any specific payload type for any given codec, only suggestions. Fixes bug #324011. 2005-12-13 21:58:42 +0000 Julien Moutte gst/videomixer/videomixer.c: Code cleanup and re-enabling queued time validity check for correct EOS handling. Original commit message from CVS: 2005-12-13 Julien MOUTTE * gst/videomixer/videomixer.c: (gst_videomixer_init), (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), (gst_videomixer_collected): Code cleanup and re-enabling queued time validity check for correct EOS handling. 2005-12-13 17:18:32 +0000 Tim-Philipp Müller sys/oss/gstossmixerelement.c: Add 'device-name' property and fix state change function. Original commit message from CVS: * sys/oss/gstossmixerelement.c: (gst_oss_mixer_element_class_init), (gst_oss_mixer_element_get_property), (gst_oss_mixer_element_change_state): Add 'device-name' property and fix state change function. 2005-12-13 10:45:04 +0000 Edward Hervey gst/flx/gstflxdec.c: If the speed of the file is null in the header, set the frame_time to the default setting of GST... Original commit message from CVS: * gst/flx/gstflxdec.c: (gst_flxdec_chain): If the speed of the file is null in the header, set the frame_time to the default setting of GST_SECOND / 70. Which is the default frame_delay for .fli files as stated in this document : http://www.compuphase.com/flic.htm Would be nice to have the time conversion done properly too (duration = flxh->frames * flxdec->frame_time) 2005-12-12 22:29:34 +0000 Julien Moutte Adding documentation for videomixer on my way with a funny sample pipeline. Original commit message from CVS: 2005-12-12 Julien MOUTTE * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * gst/videomixer/videomixer.c: (gst_videomixer_pad_sink_setcaps), (gst_videomixer_getcaps), (gst_videomixer_fill_queues), (gst_videomixer_update_queues), (gst_videomixer_collected): Adding documentation for videomixer on my way with a funny sample pipeline. 2005-12-12 21:43:00 +0000 Julien Moutte gst/videomixer/videomixer.c: Fix caps negotiation. (#323896) Original commit message from CVS: 2005-12-12 Julien MOUTTE * gst/videomixer/videomixer.c: (gst_videomixer_pad_sink_setcaps), (gst_videomixer_getcaps), (gst_videomixer_fill_queues), (gst_videomixer_update_queues), (gst_videomixer_collected): Fix caps negotiation. (#323896) 2005-12-12 18:14:58 +0000 Arwed v. Merkatz * ChangeLog: * gst/matroska/matroska-demux.c: Set correct timestamps on audio laces, fixes playback of mp3 from matroska. Original commit message from CVS: Set correct timestamps on audio laces, fixes playback of mp3 from matroska. 2005-12-12 10:40:42 +0000 Tim-Philipp Müller ext/: GstObjects must be unref'ed with gst_object_unref() instead of g_object_unref(), otherwise things break for GLi... Original commit message from CVS: * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): * ext/libmms/gstmms.c: (gst_mms_src_query), (gst_mms_create): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_src_query), (gst_musepackdec_loop): * ext/swfdec/gstswfdec.c: (gst_swfdec_video_link), (gst_swfdec_src_query): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query): GstObjects must be unref'ed with gst_object_unref() instead of g_object_unref(), otherwise things break for GLib-2.6 users. 2005-12-12 10:30:20 +0000 Tim-Philipp Müller gst/auparse/gstauparse.*: Use gst_object_unref() for GstObjects instead of g_object_unref() and fix a mem leak in a d... Original commit message from CVS: * gst/auparse/gstauparse.c: (gst_au_parse_base_init), (gst_au_parse_class_init), (gst_au_parse_init), (gst_au_parse_dispose), (gst_au_parse_chain), (gst_au_parse_change_state), (plugin_init): * gst/auparse/gstauparse.h: Use gst_object_unref() for GstObjects instead of g_object_unref() and fix a mem leak in a debug statement; while we're at it, also borgify, use boilerplate macros and clean up a little bit. 2005-12-11 20:27:06 +0000 Edward Hervey gst/debug/efence.c: Added pull mode. Original commit message from CVS: * gst/debug/efence.c: (gst_efence_init), (gst_efence_getrange), (gst_efence_checkgetrange), (gst_efence_activate_src_pull): Added pull mode. 2005-12-11 19:25:41 +0000 Tim-Philipp Müller gst/: Use audiotestsrc instead of sinesrc (#323798). Original commit message from CVS: * gst/goom/gstgoom.c: * gst/level/level-example.c: (main): * gst/smoothwave/demo-osssrc.c: (main): Use audiotestsrc instead of sinesrc (#323798). 2005-12-11 17:50:50 +0000 Stefan Kost sys/oss/gstosssink.c: more debug-func-ptr usage Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_class_init): more debug-func-ptr usage 2005-12-11 16:43:42 +0000 Zeeshan Ali * ChangeLog: * gst/flx/flx_color.c: * gst/flx/flx_color.h: * gst/flx/flx_fmt.h: * gst/flx/gstflxdec.c: * gst/flx/gstflxdec.h: Now flxdec works on big-endian machines as well. Original commit message from CVS: Now flxdec works on big-endian machines as well. 2005-12-11 16:14:22 +0000 Tim-Philipp Müller gst/debug/efence.c: Make sure GST_BUFFER_DATA is set on fenced copied buffers; fix Original commit message from CVS: * gst/debug/efence.c: (gst_efence_init), (gst_efence_chain), (gst_fenced_buffer_copy): Make sure GST_BUFFER_DATA is set on fenced copied buffers; fix GST_DEBUG crasher where GST_TIME_FORMAT was not used in conjunction with GST_TIME_ARGS. Also, don't leak pad templates and use GST_DEBUG_FUNCPTR for pad functions. 2005-12-10 20:26:33 +0000 Tim-Philipp Müller ext/flac/gstflacdec.*: Rewrite flacdec a bit, so that even seeking might work now. Most importantly, don't act upon a... Original commit message from CVS: * ext/flac/gstflacdec.c: (gst_flac_dec_base_init), (gst_flac_dec_class_init), (gst_flac_dec_init), (gst_flac_dec_metadata_callback), (gst_flac_dec_error_callback), (gst_flac_dec_eof), (gst_flac_dec_write), (gst_flac_dec_loop), (gst_flac_dec_convert_src), (gst_flac_dec_get_src_query_types), (gst_flac_dec_src_query), (gst_flac_dec_send_newsegment), (gst_flac_dec_handle_seek_event), (gst_flac_dec_src_event), (gst_flac_dec_change_state): * ext/flac/gstflacdec.h: Rewrite flacdec a bit, so that even seeking might work now. Most importantly, don't act upon any flow return values we get, just tell the decoder everything's dandy and act on the flow return values later on in the loop function. We don't want to mess up the internal decoder state for non-fatal things like flushing pads etc. Other than that, use GstSegment (segment seeks don't work yet though, but should be easy to add), use boilerplate macros, drop the superfluous 'flacdec:' from debug messages, use gst_util_uint64_scale_int, and lots of other things. 2005-12-10 14:57:48 +0000 Tim-Philipp Müller configure.ac: Update comment in OSS includes check. Original commit message from CVS: * configure.ac: Update comment in OSS includes check. * sys/oss/gstossdmabuffer.c: * sys/oss/gstosshelper.c: * sys/oss/gstossmixer.c: * sys/oss/gstossmixertrack.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: * sys/oss/oss_probe.c: Don't assume the OSS soundcard.h include is always in the sys/ directory. Instead, use the existing defines from config.h to include the right file. Fixes compilation on OpenBSD 3.8 (#323718). 2005-12-09 19:51:03 +0000 Thomas Vander Stichele * ChangeLog: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * ext/flac/gstflac.c: * ext/flac/gstflacdec.c: * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.c: * ext/flac/gstflacenc.h: borgify and fix up documentation Original commit message from CVS: borgify and fix up documentation 2005-12-09 15:30:21 +0000 Jan Schmidt ext/faad/gstfaad.c: Assume that an unknown channel mapping with 2 channels is stereo and play it that way instead of ... Original commit message from CVS: * ext/faad/gstfaad.c: (gst_faad_chanpos_to_gst), (gst_faad_update_caps): Assume that an unknown channel mapping with 2 channels is stereo and play it that way instead of erroring. * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream), (qtdemux_parse_trak): Handle e.g. jpeg streams with 0 duration frames as having 0 framerate. Debug fixes. Some 64 bit variable fixes 2005-12-09 11:12:48 +0000 Michael Smith ext/flac/gstflacdec.c: Accept a wider range of flac files, more closely matching flac sp Original commit message from CVS: * ext/flac/gstflacdec.c: (raw_caps_factory), (gst_flacdec_write): Accept a wider range of flac files, more closely matching flac sp 2005-12-08 16:27:12 +0000 Julien Moutte docs/plugins/Makefile.am: Add multipart elements. Original commit message from CVS: 2005-12-08 Julien MOUTTE * docs/plugins/Makefile.am: Add multipart elements. * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: Fix flac. * docs/plugins/gst-plugins-good-plugins.hierarchy: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: Add docs. 2005-12-07 11:46:15 +0000 Edward Hervey gst/qtdemux/qtdemux.c: Memleak fixes. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream): Memleak fixes. Send out EOS for valid reasons (couldn't pull_range() from upstream for example). 2005-12-07 11:40:46 +0000 Edward Hervey gst/avi/gstavidemux.c: Memleak and crasher fixes. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), (gst_avi_demux_parse_stream), (gst_avi_demux_stream_header), (gst_avi_demux_invert): Memleak and crasher fixes. * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), (gst_wavparse_create_sourcepad), (gst_wavparse_stream_headers): Memleak fixes 2005-12-06 19:55:58 +0000 Thomas Vander Stichele * gst/equalizer/gstiirequalizer.c: * gst/qtdemux/qtdemux.c: * gst/qtdemux/qtdemux.h: * sys/v4l2/gstv4l2colorbalance.h: * sys/v4l2/gstv4l2element.h: * sys/v4l2/gstv4l2src.h: * sys/v4l2/gstv4l2tuner.h: * sys/v4l2/gstv4l2xoverlay.h: * sys/v4l2/v4l2_calls.c: * sys/v4l2/v4l2_calls.h: * sys/v4l2/v4l2src_calls.c: * sys/v4l2/v4l2src_calls.h: expand tabs Original commit message from CVS: expand tabs 2005-12-06 19:44:58 +0000 Thomas Vander Stichele * ChangeLog: * ext/aalib/gstaasink.h: * ext/cairo/gsttextoverlay.h: * ext/dv/gstdvdec.h: * ext/dv/gstdvdemux.c: * ext/dv/gstdvdemux.h: * ext/esd/esdsink.h: * ext/flac/flac_compat.h: * ext/flac/gstflacdec.h: * ext/flac/gstflacenc.h: * ext/gconf/gconf.h: * ext/gconf/gstgconfaudiosink.h: * ext/gconf/gstgconfvideosink.h: * ext/gdk_pixbuf/gstgdkanimation.h: * ext/jpeg/gstjpegdec.h: * ext/jpeg/smokecodec.h: * ext/jpeg/smokeformat.h: * ext/ladspa/gstsignalprocessor.h: * ext/ladspa/search.c: * ext/ladspa/utils.h: * ext/libmng/gstmngdec.h: * ext/libmng/gstmngenc.c: * ext/libmng/gstmngenc.h: * ext/libpng/gstpngenc.c: * ext/libpng/gstpngenc.h: * ext/shout2/gstshout2.h: * ext/speex/gstspeexdec.h: * ext/speex/gstspeexenc.c: * ext/speex/gstspeexenc.h: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.h: * gst/autodetect/gstautovideosink.h: * gst/avi/gstavidemux.h: * gst/cutter/gstcutter.h: * gst/debug/tests.c: * gst/debug/tests.h: * gst/effectv/gstwarp.c: * gst/flx/flx_fmt.h: * gst/flx/gstflxdec.h: * gst/goom/filters.c: * gst/goom/filters.h: * gst/goom/goom_tools.h: * gst/law/alaw-encode.c: * gst/level/gstlevel.c: * gst/level/gstlevel.h: * gst/matroska/ebml-write.h: * gst/matroska/matroska-demux.h: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.h: * gst/monoscope/convolve.c: * gst/monoscope/convolve.h: * gst/multipart/multipartmux.c: * gst/oldcore/gstaggregator.c: * gst/oldcore/gstaggregator.h: * gst/oldcore/gstmd5sink.c: * gst/oldcore/gstmd5sink.h: * gst/oldcore/gstmultifilesrc.c: * gst/oldcore/gstmultifilesrc.h: * gst/oldcore/gstpipefilter.h: * gst/oldcore/gstshaper.h: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: * gst/rtsp/gstrtspsrc.c: * gst/rtsp/gstrtspsrc.h: * gst/rtsp/rtspconnection.h: * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspmessage.h: * gst/rtsp/rtsptransport.h: * gst/rtsp/rtspurl.c: * gst/rtsp/rtspurl.h: * gst/rtsp/sdpmessage.c: * gst/rtsp/sdpmessage.h: * gst/smpte/barboxwipes.c: * gst/smpte/gstmask.h: * gst/smpte/gstsmpte.h: * gst/smpte/paint.c: * gst/smpte/paint.h: * gst/udp/gstdynudpsink.h: * gst/udp/gstmultiudpsink.h: * gst/udp/gstudpsink.c: * gst/udp/gstudpsink.h: * gst/udp/gstudpsrc.c: * gst/videomixer/videomixer.c: * gst/wavenc/riff.h: * gst/wavparse/gstwavparse.h: * sys/oss/gstossdmabuffer.h: * sys/oss/gstossmixer.h: * sys/oss/gstossmixerelement.h: * sys/oss/gstossmixertrack.h: * sys/oss/gstosssink.c: * sys/oss/gstosssink.h: * sys/oss/gstosssrc.c: * sys/oss/gstosssrc.h: * sys/osxaudio/gstosxaudioelement.h: * sys/osxaudio/gstosxaudiosink.h: * sys/osxaudio/gstosxaudiosrc.h: expand tabs Original commit message from CVS: expand tabs 2005-12-05 18:12:07 +0000 Thomas Vander Stichele * configure.ac: back to HEAD Original commit message from CVS: back to HEAD === release 0.10.0 === 2005-12-05 18:03:23 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: releasing 0.10.0 Original commit message from CVS: releasing 0.10.0 2005-12-05 18:01:48 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-qtdemux.xml: releasing 0.10.0 Original commit message from CVS: releasing 0.10.0 2005-12-05 16:21:08 +0000 Thomas Vander Stichele * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2005-12-05 15:08:46 +0000 Thomas Vander Stichele * Makefile.am: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/it.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: update translations Original commit message from CVS: update translations 2005-12-05 13:04:22 +0000 Andy Wingo Update for alloc_buffer changes. Original commit message from CVS: 2005-12-05 Andy Wingo * ext/faac/gstfaac.c: (gst_faac_sink_event), (gst_faac_chain): * ext/faad/gstfaad.c: (gst_faad_chain): * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_chain): * ext/lcs/gstcolorspace.c: (gst_colorspace_chain): * ext/xine/xineinput.c: (gst_xine_input_get): * gst/colorspace/gstcolorspace.c: (gst_colorspace_chain): * gst/speed/gstspeed.c: (speed_chain): * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): Update for alloc_buffer changes. 2005-12-05 13:03:00 +0000 Andy Wingo Update for alloc_buffer changes. Original commit message from CVS: 2005-12-05 Andy Wingo * ext/dv/gstdvdec.c: (gst_dvdec_chain): * ext/flac/gstflacdec.c: (gst_flacdec_write): * ext/flac/gstflacenc.c: (gst_flacenc_write_callback): * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_chain): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_process): * ext/libpng/gstpngdec.c: (user_info_callback), (gst_pngdec_task): * ext/speex/gstspeexdec.c: (speex_dec_chain): * ext/speex/gstspeexenc.c: (gst_speexenc_chain): * gst/auparse/gstauparse.c: (gst_auparse_chain): * gst/flx/gstflxdec.c: (gst_flxdec_chain): * gst/goom/gstgoom.c: (gst_goom_chain): * gst/matroska/matroska-demux.c: (gst_matroska_demux_push_vorbis_codec_priv_data), (gst_matroska_demux_add_wvpk_header): * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): * gst/videomixer/videomixer.c: (gst_videomixer_collected): * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Update for alloc_buffer changes. 2005-12-05 12:23:22 +0000 Michael Smith docs/plugins/gst-plugins-good-plugins.args: Remove args for plugins that aren't in -good. Original commit message from CVS: * docs/plugins/gst-plugins-good-plugins.args: Remove args for plugins that aren't in -good. 2005-12-04 22:26:07 +0000 Christian Schaller * gst-plugins-good.spec.in: remove pango plugin as its gone into base Original commit message from CVS: remove pango plugin as its gone into base 2005-12-03 18:51:48 +0000 Thomas Vander Stichele * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpg711pay.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpspeexpay.c: fix element descriptions Original commit message from CVS: fix element descriptions 2005-12-03 18:50:12 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-fdsrc.xml: remove fdsrc docs Original commit message from CVS: remove fdsrc docs 2005-12-01 19:18:08 +0000 Thomas Vander Stichele * configure.ac: back to HEAD Original commit message from CVS: back to HEAD === release 0.9.7 === 2005-12-01 19:14:26 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cutter.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: releasing 0.9.7 Original commit message from CVS: releasing 0.9.7 2005-12-01 19:13:20 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-qtdemux.xml: releasing 0.9.7 Original commit message from CVS: releasing 0.9.7 2005-12-01 17:53:29 +0000 Thomas Vander Stichele * common: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2005-12-01 15:34:13 +0000 Thomas Vander Stichele * ChangeLog: * docs/plugins/.gitignore: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/inspect/plugin-multipart.xml: * docs/plugins/inspect/plugin-rtp.xml: add multipart plugin to docs Original commit message from CVS: add multipart plugin to docs 2005-12-01 15:22:25 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: * ext/Makefile.am: * ext/pango/Makefile.am: * ext/pango/gstclockoverlay.c: * ext/pango/gstclockoverlay.h: * ext/pango/gsttextoverlay.c: * ext/pango/gsttextoverlay.h: * ext/pango/gsttextrender.c: * ext/pango/gsttextrender.h: * ext/pango/gsttimeoverlay.c: * ext/pango/gsttimeoverlay.h: move pango to base Original commit message from CVS: move pango to base 2005-12-01 14:39:30 +0000 Thomas Vander Stichele gst/rtp/: parsers are depayers Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16parse.c: * gst/rtp/gstrtpL16parse.h: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmparse.h: parsers are depayers 2005-12-01 14:30:01 +0000 Thomas Vander Stichele * ChangeLog: * common: * gst/rtp/Makefile.am: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16enc.c: * gst/rtp/gstrtpL16enc.h: * gst/rtp/gstrtpL16parse.c: * gst/rtp/gstrtpL16parse.h: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpamrdec.c: * gst/rtp/gstrtpamrdec.h: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrenc.c: * gst/rtp/gstrtpamrenc.h: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpdec.c: * gst/rtp/gstrtpdec.h: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711dec.h: * gst/rtp/gstrtpg711depay.c: * gst/rtp/gstrtpg711depay.h: * gst/rtp/gstrtpg711enc.c: * gst/rtp/gstrtpg711enc.h: * gst/rtp/gstrtpg711pay.c: * gst/rtp/gstrtpg711pay.h: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmenc.h: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmparse.h: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263enc.c: * gst/rtp/gstrtph263enc.h: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdec.c: * gst/rtp/gstrtph263pdec.h: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263penc.c: * gst/rtp/gstrtph263penc.h: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtpmp4vdec.c: * gst/rtp/gstrtpmp4vdec.h: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4venc.c: * gst/rtp/gstrtpmp4venc.h: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadec.c: * gst/rtp/gstrtpmpadec.h: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpaenc.c: * gst/rtp/gstrtpmpaenc.h: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtpspeexdec.c: * gst/rtp/gstrtpspeexdec.h: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexdepay.h: * gst/rtp/gstrtpspeexenc.c: * gst/rtp/gstrtpspeexenc.h: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpspeexpay.h: Do burger's rename for rtp payloaders and depayloaders Original commit message from CVS: Do burger's rename for rtp payloaders and depayloaders 2005-11-30 19:02:35 +0000 Wim Taymans ext/dv/: Fix seeking in dvdemux again, add some more debug info. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_chain): * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame): * ext/dv/gstdvdemux.h: Fix seeking in dvdemux again, add some more debug info. 2005-11-30 18:48:56 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: fix tests Original commit message from CVS: fix tests 2005-11-30 18:40:19 +0000 Thomas Vander Stichele * Makefile.am: add tests subdir Original commit message from CVS: add tests subdir 2005-11-30 18:36:02 +0000 Thomas Vander Stichele * tests/check/Makefile.am: add Makefile.am Original commit message from CVS: add Makefile.am 2005-11-30 18:28:53 +0000 Thomas Vander Stichele move Original commit message from CVS: * PORTED_09: * docs/random/PORTED_09: move * tests/Makefile.am: add * win32/gst.sln: remove 2005-11-30 18:24:08 +0000 Thomas Vander Stichele * ChangeLog: * Makefile.am: * check/.gitignore: * check/Makefile.am: * check/elements/.gitignore: * check/elements/level.c: * check/elements/matroskamux.c: * configure.ac: * examples/Makefile.am: * examples/capsfilter/Makefile.am: * examples/capsfilter/capsfilter1.c: * examples/gob/Makefile.am: * examples/gob/gst-identity2.gob: * examples/gstplay/.gitignore: * examples/gstplay/Makefile.am: * examples/gstplay/player.c: * examples/indexing/.gitignore: * examples/indexing/Makefile.am: * examples/indexing/indexmpeg.c: * examples/level/Makefile.am: * examples/level/README: * examples/level/demo.c: * examples/level/plot.c: * examples/stats/Makefile.am: * examples/stats/mp2ogg.c: * examples/switch/.gitignore: * examples/switch/Makefile.am: * examples/switch/switcher.c: move under tests Original commit message from CVS: move under tests 2005-11-30 16:57:57 +0000 Christian Schaller * common: * gst-plugins-good.spec.in: update for latest changes Original commit message from CVS: update for latest changes 2005-11-30 14:53:29 +0000 Tim-Philipp Müller ext/pango/gsttextrender.*: Add missing files. Original commit message from CVS: * ext/pango/gsttextrender.c: (gst_text_render_base_init), (gst_text_render_class_init), (resize_bitmap), (gst_text_render_render_text), (gst_text_render_setcaps), (gst_text_render_fixate_caps), (gst_text_renderer_bitmap_to_ayuv), (gst_text_render_chain), (gst_text_render_finalize), (gst_text_render_init), (gst_text_render_set_property): * ext/pango/gsttextrender.h: Add missing files. 2005-11-30 13:20:57 +0000 Tim-Philipp Müller Port pango-based textoverlay, timeoverlay and textrender to 0.9 and add background shading and text wrapping modes. M... Original commit message from CVS: * configure.ac: * ext/Makefile.am: * ext/pango/Makefile.am: * ext/pango/gstclockoverlay.c: (gst_clock_overlay_base_init), (gst_clock_overlay_render_time), (gst_clock_overlay_get_text), (gst_clock_overlay_class_init), (gst_clock_overlay_init): * ext/pango/gstclockoverlay.h: * ext/pango/gsttextoverlay.c: (gst_text_overlay_base_init), (gst_text_overlay_get_text), (gst_text_overlay_class_init), (gst_text_overlay_finalize), (gst_text_overlay_init), (gst_text_overlay_update_wrap_mode), (gst_text_overlay_setcaps), (gst_text_overlay_text_pad_linked), (gst_text_overlay_text_pad_unlinked), (gst_text_overlay_set_property), (gst_text_overlay_getcaps), (gst_text_overlay_shade_y), (gst_text_overlay_blit_yuv420), (gst_text_overlay_resize_bitmap), (gst_text_overlay_render_text), (gst_text_overlay_push_frame), (gst_text_overlay_pop_video), (gst_text_overlay_pop_text), (gst_text_overlay_collected), (gst_text_overlay_change_state), (plugin_init): * ext/pango/gsttextoverlay.h: * ext/pango/gsttimeoverlay.c: (gst_time_overlay_base_init), (gst_time_overlay_render_time), (gst_time_overlay_get_text), (gst_time_overlay_class_init), (gst_time_overlay_init): * ext/pango/gsttimeoverlay.h: Port pango-based textoverlay, timeoverlay and textrender to 0.9 and add background shading and text wrapping modes. Make timoverlay derive from textoverlay. Also add new clockoverlay element. 2005-11-30 11:10:01 +0000 Julien Moutte gst/udp/Makefile.am: Moved to netbuffer. Original commit message from CVS: 2005-11-30 Julien MOUTTE * gst/udp/Makefile.am: Moved to netbuffer. 2005-11-30 10:18:42 +0000 Julien Moutte Ported multipart mux/demux to 0.9. Original commit message from CVS: 2005-11-30 Julien MOUTTE * configure.ac: * PORTED_O9: * gst/multipart/Makefile.am: * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), (gst_multipart_demux_class_init), (gst_multipart_demux_init), (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), (gst_multipart_demux_change_state), (gst_multipart_demux_plugin_init): * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), (gst_multipart_mux_init), (gst_multipart_mux_finalize), (gst_multipart_mux_sinkconnect), (gst_multipart_mux_request_new_pad), (gst_multipart_mux_handle_src_event), (gst_multipart_mux_queue_pads), (gst_multipart_mux_collected), (gst_multipart_mux_change_state): Ported multipart mux/demux to 0.9. 2005-11-30 08:26:47 +0000 Thomas Vander Stichele gst/: update for symbols change Original commit message from CVS: * gst/debug/gstnavigationtest.c: (gst_navigationtest_get_type): * gst/debug/gstnavigationtest.h: * gst/effectv/gstaging.c: (gst_agingtv_get_type): * gst/effectv/gstdice.c: (gst_dicetv_get_type): * gst/effectv/gstedge.c: (gst_edgetv_get_type): * gst/effectv/gstquark.c: (gst_quarktv_get_type): * gst/effectv/gstrev.c: (gst_revtv_get_type): * gst/effectv/gstshagadelic.c: (gst_shagadelictv_get_type): * gst/effectv/gstvertigo.c: (gst_vertigotv_get_type): * gst/effectv/gstwarp.c: (gst_warptv_get_type): * gst/videofilter/gstvideoflip.c: (gst_video_flip_set_property), (gst_video_flip_get_type): * gst/videofilter/gstvideoflip.h: update for symbols change 2005-11-29 17:46:04 +0000 Thomas Vander Stichele gst/udp/: the old gstnet lib was renamed gstnetbuffer (#322257) Original commit message from CVS: * gst/udp/gstdynudpsink.c: * gst/udp/gstudpsrc.c: the old gstnet lib was renamed gstnetbuffer (#322257) 2005-11-29 15:42:01 +0000 Tim-Philipp Müller ext/cairo/gsttextoverlay.c: Actually render the text from the text pad. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_render_text), (gst_text_overlay_collected): Actually render the text from the text pad. 2005-11-29 14:49:00 +0000 Edward Hervey gst/debug/: Update for GstBaseTransform event virtual method Original commit message from CVS: * gst/debug/gstnavseek.c: (gst_navseek_event): * gst/debug/progressreport.c: (gst_progress_report_event): Update for GstBaseTransform event virtual method 2005-11-29 10:55:09 +0000 Thomas Vander Stichele ext/cairo/Makefile.am: no need to link to videofilter Original commit message from CVS: 2005-11-29 Thomas Vander Stichele * ext/cairo/Makefile.am: no need to link to videofilter 2005-11-29 10:46:00 +0000 Thomas Vander Stichele * ChangeLog: * gst/debug/Makefile.am: * gst/debug/gstnavigationtest.h: * gst/effectv/Makefile.am: * gst/effectv/gstaging.c: * gst/effectv/gstdice.c: * gst/effectv/gstedge.c: * gst/effectv/gstquark.c: * gst/effectv/gstrev.c: * gst/effectv/gstshagadelic.c: * gst/effectv/gstvertigo.c: * gst/effectv/gstwarp.c: * gst/videofilter/Makefile.am: * gst/videofilter/gstvideofilter.c: * gst/videofilter/gstvideofilter.h: * gst/videofilter/gstvideoflip.h: remove the videofilter library and link to the one in base Original commit message from CVS: remove the videofilter library and link to the one in base 2005-11-29 01:30:40 +0000 Thomas Vander Stichele * common: * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideoflip.h: borgify Original commit message from CVS: borgify 2005-11-28 17:31:44 +0000 Edward Hervey gst/avi/gstavidemux.c: Useless check now we're setting the current entry correctly. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Useless check now we're setting the current entry correctly. 2005-11-28 16:54:03 +0000 Tim-Philipp Müller ext/jpeg/gstjpegenc.c: Don't leak input buffer in chain function (fixes #322667); make state change function thread-s... Original commit message from CVS: * ext/jpeg/gstjpegenc.c: (gst_jpegenc_resync), (gst_jpegenc_chain), (gst_jpegenc_set_property), (gst_jpegenc_get_property), (gst_jpegenc_change_state): Don't leak input buffer in chain function (fixes #322667); make state change function thread-safe; don't repeat the current function name in GST_DEBUG statements; use GST_ROUND_UP_* macros; use gst_pad_alloc_buffer(); misc. minor cleanups. 2005-11-28 15:43:29 +0000 Edward Hervey ext/faad/gstfaad.c: Handle gracefully the consequence of "Maximum number of scalefactor bands exceeded", which result... Original commit message from CVS: * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): Handle gracefully the consequence of "Maximum number of scalefactor bands exceeded", which results in 0 channels with samplerates of 0. * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state): Do upward transitions, then call parent state_change, then do downward transitions. 2005-11-28 15:13:22 +0000 Jan Schmidt gst/matroska/matroska-mux.c: Look for pixel-aspect-ratio in caps, not pixel_width and pixel_height (Fixes: #322645) Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): Look for pixel-aspect-ratio in caps, not pixel_width and pixel_height (Fixes: #322645) 2005-11-28 12:59:05 +0000 Jan Schmidt gst/matroska/matroska-mux.c: From Michal Benes: frame duration should be GST_SECOND / framerate, not Original commit message from CVS: * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): From Michal Benes: frame duration should be GST_SECOND / framerate, not GST_SECOND * framerate. (Fixes: #322643) 2005-11-27 17:02:53 +0000 Thomas Vander Stichele configure.ac: fix up GST_PLUGIN_LDFLAGS Original commit message from CVS: * configure.ac: fix up GST_PLUGIN_LDFLAGS * gst/rtsp/rtspconnection.c: fix includes (see #317043) * gst/videofilter/Makefile.am: stop installing this library 2005-11-27 15:30:25 +0000 Thomas Vander Stichele * configure.ac: no need for an AS_LIBTOOL call Original commit message from CVS: no need for an AS_LIBTOOL call 2005-11-27 14:33:31 +0000 Thomas Vander Stichele * Makefile.am: * common: * gst-plugins-good.spec.in: add ACLOCAL_AMFLAGS; remove old stuff from spec changelog Original commit message from CVS: add ACLOCAL_AMFLAGS; remove old stuff from spec changelog 2005-11-26 12:54:47 +0000 Edward Hervey ext/dv/gstdvdec.c: Handle the case where the incoming Video dv stream doesn't have a pixel aspect ratio set. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_sink_setcaps): Handle the case where the incoming Video dv stream doesn't have a pixel aspect ratio set. 2005-11-25 22:14:47 +0000 Thomas Vander Stichele * ChangeLog: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * ext/flac/gstflacdec.c: document flacdec Original commit message from CVS: document flacdec 2005-11-25 21:36:18 +0000 Thomas Vander Stichele * ChangeLog: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/inspect/plugin-autodetect.xml: * ext/cairo/gstcairo.c: * ext/cairo/gsttextoverlay.c: * ext/cairo/gsttextoverlay.h: * ext/cairo/gsttimeoverlay.c: * ext/cairo/gsttimeoverlay.h: do some name borgifying document Original commit message from CVS: do some name borgifying document 2005-11-25 21:02:16 +0000 Thomas Vander Stichele documenting auto*sink using strstr for the video sink lookup, class field is not ordered update other plugins Original commit message from CVS: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_base_init): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_base_init), (gst_auto_video_sink_factory_filter): documenting auto*sink using strstr for the video sink lookup, class field is not ordered update other plugins 2005-11-25 19:58:19 +0000 Edgard Lima * ext/wavpack/Makefile.am: * ext/wavpack/gstwavpackdec.c: * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackparse.c: * ext/wavpack/gstwavpackparse.h: Wavpack ported to 0.9. No support for correction file yet. Original commit message from CVS: Wavpack ported to 0.9. No support for correction file yet. 2005-11-25 18:15:51 +0000 Thomas Vander Stichele ext/wavpack/: put back wavpack - still needs porting Original commit message from CVS: * ext/wavpack/gstwavpackcommon.h: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link), (gst_wavpack_dec_wvclink), (gst_wavpack_dec_get_type), (gst_wavpack_dec_base_init), (gst_wavpack_dec_dispose), (gst_wavpack_dec_class_init), (gst_wavpack_dec_src_query), (gst_wavpack_dec_init), (gst_wavpack_dec_setup_context), (gst_wavpack_dec_format_samples), (gst_wavpack_dec_loop), (gst_wavpack_dec_plugin_init): * ext/wavpack/gstwavpackdec.h: * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_get_type), (gst_wavpack_parse_base_init), (gst_wavpack_parse_dispose), (gst_wavpack_parse_class_init), (gst_wavpack_parse_src_query), (gst_wavpack_parse_src_event), (find_header), (find_sample), (gst_wavpack_parse_seek), (gst_wavpack_parse_init), (gst_wavpack_parse_handle_event), (gst_wavpack_parse_loop), (gst_wavpack_parse_change_state), (gst_wavpack_parse_plugin_init): * ext/wavpack/gstwavpackparse.h: put back wavpack - still needs porting 2005-11-25 18:03:24 +0000 Sebastien Cote gst/udp/gstudpsrc.c: Patch from Sebastien Cote to close control sockets in udpsrc. Original commit message from CVS: * gst/udp/gstudpsrc.c: (gst_udpsrc_stop): Patch from Sebastien Cote to close control sockets in udpsrc. 2005-11-24 15:07:06 +0000 Julien Moutte gst/effectv/gstquark.c: Flush the planes list on reverse caps negotiation. This was crashing because of differently s... Original commit message from CVS: 2005-11-24 Julien MOUTTE * gst/effectv/gstquark.c: (gst_quarktv_set_caps), (gst_quarktv_get_unit_size), (gst_quarktv_transform), (gst_quarktv_planetable_clear), (gst_quarktv_change_state), (gst_quarktv_base_init), (gst_quarktv_class_init), (gst_quarktv_init): Flush the planes list on reverse caps negotiation. This was crashing because of differently sized buffers. 2005-11-24 12:50:28 +0000 Julien Moutte gst/: Handle strides correctly, fix identity flipping, convert navigation event correctly again. Original commit message from CVS: 2005-11-24 Julien MOUTTE * gst/debug/gstnavigationtest.c: (draw_box_planar411): * gst/videofilter/gstvideoflip.c: (gst_videoflip_method_get_type), (gst_videoflip_set_caps), (gst_videoflip_transform_caps), (gst_videoflip_get_unit_size), (gst_videoflip_flip), (gst_videoflip_transform), (gst_videoflip_handle_src_event), (gst_videoflip_set_property), (gst_videoflip_base_init), (gst_videoflip_class_init), (gst_videoflip_init): Handle strides correctly, fix identity flipping, convert navigation event correctly again. 2005-11-24 11:16:53 +0000 Michael Smith * README: Fix #320288: wrong readme in plugins-good Original commit message from CVS: Fix #320288: wrong readme in plugins-good 2005-11-24 11:06:29 +0000 Thomas Vander Stichele * Makefile.am: fix torture target Original commit message from CVS: fix torture target 2005-11-23 21:25:56 +0000 Thomas Vander Stichele * Makefile.am: add a torture target Original commit message from CVS: add a torture target 2005-11-23 20:05:26 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: back to HEAD Original commit message from CVS: back to HEAD === release 0.9.6 === 2005-11-23 19:57:49 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-qtdemux.xml: releasing 0.9.6 Original commit message from CVS: releasing 0.9.6 2005-11-23 19:56:31 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: releasing 0.9.6 Original commit message from CVS: releasing 0.9.6 2005-11-23 19:14:07 +0000 Thomas Vander Stichele * docs/plugins/inspect/plugin-cutter.xml: adding cutter Original commit message from CVS: adding cutter 2005-11-23 19:05:29 +0000 Thomas Vander Stichele * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2005-11-23 16:49:16 +0000 Jan Schmidt gst/debug/gstnavigationtest.c: Oops, initialise the framerate GValue Original commit message from CVS: * gst/debug/gstnavigationtest.c: (gst_navigationtest_init): Oops, initialise the framerate GValue 2005-11-23 15:50:51 +0000 Julien Moutte VideoFilter inherits from Original commit message from CVS: 2005-11-23 Julien MOUTTE * ext/cairo/gsttimeoverlay.c: (gst_timeoverlay_update_font_height), (gst_timeoverlay_set_caps), (gst_timeoverlay_get_unit_size), (gst_timeoverlay_transform), (gst_timeoverlay_base_init), (gst_timeoverlay_class_init), (gst_timeoverlay_init), (gst_timeoverlay_get_type): * ext/cairo/gsttimeoverlay.h: * gst/debug/Makefile.am: * gst/debug/gstnavigationtest.c: (gst_navigationtest_handle_src_event), (gst_navigationtest_get_unit_size), (gst_navigationtest_set_caps), (gst_navigationtest_transform), (gst_navigationtest_change_state), (gst_navigationtest_base_init), (gst_navigationtest_class_init), (gst_navigationtest_init), (gst_navigationtest_get_type), (plugin_init): * gst/debug/gstnavigationtest.h: * gst/effectv/Makefile.am: * gst/effectv/gstaging.c: (gst_agingtv_set_caps), (gst_agingtv_get_unit_size), (gst_agingtv_transform), (gst_agingtv_base_init), (gst_agingtv_class_init), (gst_agingtv_init), (gst_agingtv_get_type): * gst/effectv/gstdice.c: (gst_dicetv_set_caps), (gst_dicetv_get_unit_size), (gst_dicetv_transform), (gst_dicetv_base_init), (gst_dicetv_class_init), (gst_dicetv_init), (gst_dicetv_get_type): * gst/effectv/gstedge.c: (gst_edgetv_set_caps), (gst_edgetv_get_unit_size), (gst_edgetv_transform), (gst_edgetv_base_init), (gst_edgetv_class_init), (gst_edgetv_init), (gst_edgetv_get_type): * gst/effectv/gsteffectv.c: * gst/effectv/gsteffectv.h: * gst/effectv/gstquark.c: (gst_quarktv_set_caps), (gst_quarktv_get_unit_size), (fastrand), (gst_quarktv_transform), (gst_quarktv_change_state), (gst_quarktv_base_init), (gst_quarktv_class_init), (gst_quarktv_init), (gst_quarktv_get_type): * gst/effectv/gstrev.c: (gst_revtv_set_caps), (gst_revtv_get_unit_size), (gst_revtv_transform), (gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init), (gst_revtv_get_type): * gst/effectv/gstshagadelic.c: (gst_shagadelictv_set_caps), (gst_shagadelictv_get_unit_size), (gst_shagadelictv_transform), (gst_shagadelictv_base_init), (gst_shagadelictv_class_init), (gst_shagadelictv_init), (gst_shagadelictv_get_type): * gst/effectv/gstvertigo.c: (gst_vertigotv_set_caps), (gst_vertigotv_get_unit_size), (gst_vertigotv_transform), (gst_vertigotv_base_init), (gst_vertigotv_class_init), (gst_vertigotv_init), (gst_vertigotv_get_type): * gst/effectv/gstwarp.c: (gst_warptv_set_caps), (gst_warptv_get_unit_size), (gst_warptv_transform), (gst_warptv_base_init), (gst_warptv_class_init), (gst_warptv_init), (gst_warptv_get_type): * gst/videofilter/Makefile.am: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideobalance.h: * gst/videofilter/gstvideofilter.c: (gst_videofilter_get_type), (gst_videofilter_class_init), (gst_videofilter_init): * gst/videofilter/gstvideofilter.h: * gst/videofilter/gstvideoflip.c: (gst_videoflip_set_caps), (gst_videoflip_transform_caps), (gst_videoflip_get_unit_size), (gst_videoflip_flip), (gst_videoflip_transform), (gst_videoflip_handle_src_event), (gst_videoflip_set_property), (gst_videoflip_base_init), (gst_videoflip_class_init), (gst_videoflip_init), (plugin_init), (gst_videoflip_get_type): * gst/videofilter/gstvideoflip.h: VideoFilter inherits from BaseTransform, it's just a place holder for now and every video effect plugin has been ported to use BaseTransform features directly. QuarkTV was fixed too (was broken), navigationtest works and best for the end, videoflip converts navigation events depending on flip method ! Fixes #320953 2005-11-23 14:22:18 +0000 Jan Schmidt Fixes for API changes Original commit message from CVS: * ext/aalib/gstaasink.c: (gst_aasink_fixate): * ext/cairo/gsttextoverlay.c: (gst_text_overlay_collected): * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_chain): * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): * sys/osxvideo/osxvideosink.m: Fixes for API changes 2005-11-23 12:19:06 +0000 Christian Schaller * gst-plugins-good.spec.in: add cutter to spec in Original commit message from CVS: add cutter to spec in 2005-11-23 11:57:51 +0000 Jan Schmidt gst/qtdemux/qtdemux.c: Convert to fractional framerates Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream), (qtdemux_dump_mvhd), (qtdemux_parse_trak): Convert to fractional framerates 2005-11-22 23:58:14 +0000 Michael Smith ext/jpeg/: JPEG fractiony goodness. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: * ext/jpeg/gstjpegenc.c: (gst_jpegenc_setcaps): * ext/jpeg/gstjpegenc.h: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_setcaps), (gst_smokeenc_resync): * ext/jpeg/gstsmokeenc.h: JPEG fractiony goodness. 2005-11-22 22:35:57 +0000 Michael Smith * ChangeLog: * gst/goom/filters.c: * gst/goom/graphic.h: Fix for #321430: unresolved symbols due to incorrect linkage on inline functions in goom. Original commit message from CVS: Fix for #321430: unresolved symbols due to incorrect linkage on inline functions in goom. Does not, however, fix the general crackheadedness of goom (global variables, oh my!); this should be moved to -bad. 2005-11-22 22:21:37 +0000 Jan Schmidt More fractional framerate conversions Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_init), (gst_text_overlay_setcaps), (gst_text_overlay_collected): * ext/cairo/gsttextoverlay.h: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link): * ext/gdk_pixbuf/gstgdkpixbuf.h: * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_caps_create_and_set): * ext/libpng/gstpngdec.h: * ext/libpng/gstpngenc.c: (gst_pngenc_setcaps): * gst/alpha/gstalphacolor.c: (gst_alpha_color_set_caps): * gst/avi/gstavimux.c: (gst_avimux_init), (gst_avimux_vidsinkconnect): * gst/flx/gstflxdec.c: (gst_flxdec_chain): * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_chain): * gst/goom/gstgoom.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps): * sys/osxvideo/osxvideosink.h: * sys/osxvideo/osxvideosink.m: More fractional framerate conversions 2005-11-22 20:07:47 +0000 Jan Schmidt Convert to fractional framerates. Original commit message from CVS: * ext/aalib/gstaasink.c: (gst_aasink_fixate): * gst/debug/gstnavigationtest.c: (gst_navigationtest_handle_src_event): * gst/videofilter/gstvideofilter.c: (gst_videofilter_format_get_structure), (gst_videofilter_setcaps), (gst_videofilter_init): * gst/videofilter/gstvideofilter.h: Convert to fractional framerates. 2005-11-22 18:11:58 +0000 Thomas Vander Stichele * ChangeLog: * ext/aalib/gstaasink.c: * ext/dv/gstdvdec.c: * ext/esd/esdmon.c: * ext/flac/gstflacenc.c: * ext/gdk_pixbuf/pixbufscale.c: * ext/libcaca/gstcacasink.c: * ext/shout2/gstshout2.c: * gst/alpha/gstalpha.c: * gst/oldcore/gstaggregator.c: * gst/oldcore/gstshaper.c: * gst/smpte/barboxwipes.c: * gst/smpte/gstsmpte.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstvideoflip.c: * gst/videomixer/videomixer.c: fix up more enums Original commit message from CVS: fix up more enums 2005-11-22 17:39:11 +0000 Michael Smith gst/videomixer/videomixer.c: Fractional framerates, videomixer. Original commit message from CVS: * gst/videomixer/videomixer.c: (gst_videomixer_pad_sink_setcaps), (gst_videomixer_getcaps), (gst_videomixer_fill_queues), (gst_videomixer_update_queues): Fractional framerates, videomixer. 2005-11-22 17:09:36 +0000 Michael Smith ext/dv/: Fractional framerates for DV. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_setcaps): * ext/dv/gstdvdec.h: * ext/dv/gstdvdemux.c: (gst_dvdemux_init), (gst_dvdemux_src_convert), (gst_dvdemux_sink_convert), (gst_dvdemux_demux_video), (gst_dvdemux_demux_frame), (gst_dvdemux_flush): * ext/dv/gstdvdemux.h: Fractional framerates for DV. 2005-11-22 14:44:26 +0000 Tim-Philipp Müller gst/autodetect/: Use gst_plugin_feature_list_free() to free feature list and in the case of autovideosink free the li... Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_find_best), (gst_auto_audio_sink_detect): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): Use gst_plugin_feature_list_free() to free feature list and in the case of autovideosink free the list at all. Also miscellaneous cosmetic fixes. 2005-11-22 13:13:21 +0000 Thomas Vander Stichele gst/cutter/gstcutter.c: copy calculation code from level; remove use of some audio functions Original commit message from CVS: * gst/cutter/gstcutter.c: (gst_cutter_chain), (gst_cutter_set_property), (gst_cutter_get_caps): copy calculation code from level; remove use of some audio functions 2005-11-22 13:11:25 +0000 Thomas Vander Stichele * gst/level/gstlevel.c: various cosmetic fixes Original commit message from CVS: various cosmetic fixes 2005-11-22 12:48:10 +0000 Thomas Vander Stichele * gst/level/gstlevel.c: various cosmetic fixes Original commit message from CVS: various cosmetic fixes 2005-11-22 12:41:35 +0000 Thomas Vander Stichele * gst/level/gstlevel.c: various cosmetic fixes Original commit message from CVS: various cosmetic fixes 2005-11-22 12:38:33 +0000 Andy Wingo * ChangeLog: * ext/flac/gstflacenc.c: * ext/flac/gstflactag.c: * ext/shout2/gstshout2.c: * ext/speex/gstspeexenc.c: * gst/avi/gstavimux.c: Update for gst_tag_setter API changes. Original commit message from CVS: 2005-11-22 Andy Wingo * Update for gst_tag_setter API changes. 2005-11-22 11:57:51 +0000 Andy Wingo * gst/qtdemux/qtdemux.c: ext/faad/gstfaad.c (gst_faad_event) ext/ivorbis/vorbisfile.c (gst_ivorbisfile_loop) gst/qtdemux/qtdemux.c (gst_qtdemu... Original commit message from CVS: 2005-11-22 Andy Wingo * ext/faad/gstfaad.c (gst_faad_event) * ext/ivorbis/vorbisfile.c (gst_ivorbisfile_loop) * gst/qtdemux/qtdemux.c (gst_qtdemux_loop_header) * gst/speed/gstspeed.c (speed_sink_event) * gst/tta/gstttaparse.c (gst_tta_parse_src_event) (gst_tta_parse_parse_header): Run update-funcnames. 2005-11-22 11:53:34 +0000 Andy Wingo * ChangeLog: * ext/dv/gstdvdemux.c: * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfvideosink.c: * ext/libpng/gstpngdec.c: * ext/speex/gstspeexdec.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautovideosink.c: * gst/avi/gstavidemux.c: * gst/goom/gstgoom.c: * gst/matroska/ebml-write.c: * gst/matroska/matroska-demux.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: ext/dv/gstdvdemux.c (gst_dvdemux_handle_sink_event) (gst_dvdemux_demux_frame) ext/flac/gstflacdec.c (gst_flacdec_writ... Original commit message from CVS: 2005-11-22 Andy Wingo * ext/dv/gstdvdemux.c (gst_dvdemux_handle_sink_event) (gst_dvdemux_demux_frame) * ext/flac/gstflacdec.c (gst_flacdec_write) * ext/flac/gstflacenc.c (gst_flacenc_seek_callback) (gst_flacenc_sink_event) * ext/gconf/gstgconfaudiosink.c (gst_gconf_audio_sink_init) * ext/gconf/gstgconfvideosink.c (gst_gconf_video_sink_init) * ext/libpng/gstpngdec.c (gst_pngdec_caps_create_and_set) * ext/speex/gstspeexdec.c (speex_dec_event, speex_dec_chain) * gst/auparse/gstauparse.c (gst_auparse_chain) * gst/autodetect/gstautoaudiosink.c (gst_auto_audio_sink_init) * gst/autodetect/gstautovideosink.c (gst_auto_video_sink_init) * gst/avi/gstavidemux.c (gst_avi_demux_stream_header) (gst_avi_demux_handle_seek) * gst/goom/gstgoom.c (gst_goom_event) * gst/matroska/ebml-write.c (gst_ebml_write_seek) * gst/matroska/matroska-demux.c (gst_matroska_demux_handle_seek_event) (gst_matroska_demux_loop_stream_parse_id) * gst/wavenc/gstwavenc.c (gst_wavenc_stop_file) * gst/wavparse/gstwavparse.c (gst_wavparse_handle_seek) (gst_wavparse_stream_headers): Run update-funcnames. 2005-11-22 11:49:30 +0000 Edward Hervey URIHandler interface and element properties are now properly synchronized for DV1394src and UDPSrc Original commit message from CVS: * ext/raw1394/gstdv1394src.c: (gst_dv1394src_class_init), (gst_dv1394src_init), (gst_dv1394src_dispose), (gst_dv1394src_set_property), (gst_dv1394src_discover_avc_node), (gst_dv1394src_uri_set_uri): * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_update_uri), (gst_udpsrc_set_uri), (gst_udpsrc_set_property), (gst_udpsrc_uri_get_uri): URIHandler interface and element properties are now properly synchronized for DV1394src and UDPSrc 2005-11-22 11:36:04 +0000 Tim-Philipp Müller ext/: libgsttagedit has been renamed to libgsttag. Original commit message from CVS: * ext/flac/Makefile.am: * ext/speex/Makefile.am: libgsttagedit has been renamed to libgsttag. 2005-11-21 20:11:59 +0000 Wim Taymans gst/rtsp/rtspconnection.c: Apply patch from Sebastien Cote to fix #319184. Original commit message from CVS: * gst/rtsp/rtspconnection.c: (read_body): Apply patch from Sebastien Cote to fix #319184. 2005-11-21 19:50:25 +0000 Thomas Vander Stichele port cutter Original commit message from CVS: * configure.ac: * gst/cutter/Makefile.am: * gst/cutter/gstcutter.c: (gst_cutter_class_init), (gst_cutter_init), (gst_cutter_message_new), (gst_cutter_chain), (gst_cutter_set_property), (gst_cutter_get_property), (plugin_init), (gst_cutter_get_caps): port cutter * gst/level/gstlevel.c: fix up plugin details 2005-11-21 18:09:02 +0000 Tim-Philipp Müller Update for stream lock API changes: don't take stream log in sink event handlers any longer and change GST_STREAM_LOC... Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event): * ext/flac/gstflacdec.c: (gst_flacdec_loop), (gst_flacdec_src_event): * ext/flac/gstflacenc.c: (gst_flacenc_sink_event): * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_event), (gst_signal_processor_getrange), (gst_signal_processor_chain): * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): * gst/flx/gstflxdec.c: (gst_flxdec_src_event_handler), (gst_flxdec_sink_event_handler): * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_seek_event): * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek): Update for stream lock API changes: don't take stream log in sink event handlers any longer and change GST_STREAM_LOCK to GST_PAD_STREAM_LOCK. Don't leak references in flxdec event functions. 2005-11-21 17:52:15 +0000 Michael Smith * gst/auparse/Makefile.am: * gst/auparse/gstauparse.h: Forgot to commit header file changes, Makefile.am changes. Oops. Original commit message from CVS: Forgot to commit header file changes, Makefile.am changes. Oops. 2005-11-21 17:49:21 +0000 Michael Smith * ChangeLog: * gst/auparse/gstauparse.c: gst_object_unref, not g_object_unref Original commit message from CVS: gst_object_unref, not g_object_unref 2005-11-21 17:37:41 +0000 Wim Taymans Fix for stream lock updates. Original commit message from CVS: * ext/faac/gstfaac.c: (gst_faac_sink_event): * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_event): * gst/tta/gstttaparse.c: (gst_tta_parse_src_event): Fix for stream lock updates. 2005-11-21 17:23:46 +0000 Tim-Philipp Müller gst/wavparse/gstwavparse.c: Use GST_DEBUG_FUNCPTR; add debug message in pad activate function. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_init), (gst_wavparse_create_sourcepad), (gst_wavparse_sink_activate): Use GST_DEBUG_FUNCPTR; add debug message in pad activate function. 2005-11-21 17:18:01 +0000 Michael Smith gst/auparse/: Partially fix #161712. playbin still doesn't work on these files, (on the bug report, Andy says we aren... Original commit message from CVS: * gst/auparse/Makefile.am: * gst/auparse/gstauparse.c: (gst_auparse_class_init), (gst_auparse_init), (gst_auparse_dispose), (gst_auparse_chain), (gst_auparse_change_state): * gst/auparse/gstauparse.h: Partially fix #161712. playbin still doesn't work on these files, (on the bug report, Andy says we aren't typefinding it for some reason?) but at least auparse isn't totally busted like it was before. 2005-11-21 16:45:46 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: j@bootlab.org, #321903). Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add DX50, DIVX and DIV3 fourccs (patch by j@bootlab.org, #321903). 2005-11-21 16:36:05 +0000 Andy Wingo *.*: Ran scripts/update-macros. Oh yes. Original commit message from CVS: 2005-11-21 Andy Wingo * *.h: * *.c: Ran scripts/update-macros. Oh yes. 2005-11-21 15:06:35 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Filler events are gone for now, comment out section generating them. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_sync_streams): Filler events are gone for now, comment out section generating them. 2005-11-21 14:39:04 +0000 Tim-Philipp Müller Update for GST_FOURCC_FORMAT API change. Original commit message from CVS: * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_get_format_from_caps): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (qtdemux_parse), (qtdemux_type_get), (qtdemux_node_dump_foreach), (qtdemux_dump_hdlr), (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_dcom), (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), (gst_v4l2src_capture_init), (gst_v4l2src_get_size_limits): Update for GST_FOURCC_FORMAT API change. 2005-11-21 14:33:11 +0000 Jan Schmidt Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) Original commit message from CVS: * ext/audioresample/gstaudioresample.c: * ext/polyp/polypsink.c: (gst_polypsink_sink_fixate): * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_fixate): * gst/modplug/gstmodplug.cc: * sys/glsink/glimagesink.c: (gst_glimagesink_fixate): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_fixate): Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) 2005-11-21 14:31:05 +0000 Jan Schmidt Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) Original commit message from CVS: * ext/aalib/gstaasink.c: (gst_aasink_fixate): * ext/mikmod/gstmikmod.c: (gst_mikmod_srcfixate): * gst/goom/gstgoom.c: (gst_goom_src_negotiate): * sys/osxvideo/osxvideosink.m: Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) 2005-11-21 13:38:24 +0000 Tim-Philipp Müller Fixes for GST_FOURCC_FORMAT API change. Original commit message from CVS: * ext/aalib/gstaasink.c: (gst_aasink_setcaps): * gst/avi/gstavidemux.c: (gst_avi_demux_parse_file_header), (gst_avi_demux_read_subindexes), (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), (gst_avi_demux_stream_index), (gst_avi_demux_sync), (gst_avi_demux_stream_header), (gst_avi_demux_stream_data): * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): * gst/wavenc/gstwavenc.c: (write_metadata): * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_adtl), (gst_wavparse_parse_file_header), (gst_wavparse_stream_headers): Fixes for GST_FOURCC_FORMAT API change. 2005-11-21 12:13:48 +0000 Tim-Philipp Müller Fix for collect pads API change. Also fix textoverlay state change function. Original commit message from CVS: * ext/cairo/gsttextoverlay.c: (gst_text_overlay_finalize), (gst_text_overlay_init), (gst_text_overlay_text_pad_linked), (gst_text_overlay_text_pad_unlinked), (gst_text_overlay_pop_video), (gst_text_overlay_pop_text), (gst_text_overlay_collected), (gst_text_overlay_change_state): * gst/matroska/matroska-mux.c: (gst_matroska_mux_init), (gst_matroska_mux_reset), (gst_matroska_mux_request_new_pad), (gst_matroska_mux_best_pad), (gst_matroska_mux_change_state): * gst/smpte/gstsmpte.c: (gst_smpte_init), (gst_smpte_collected): * gst/videomixer/videomixer.c: (gst_videomixer_init), (gst_videomixer_request_new_pad), (gst_videomixer_fill_queues), (gst_videomixer_change_state): Fix for collect pads API change. Also fix textoverlay state change function. 2005-11-20 17:04:55 +0000 Julien Moutte gst/matroska/matroska-mux.c: Replace Original commit message from CVS: 2005-11-20 Julien MOUTTE * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): Replace GST_PAD_IS_USABLE by something approaching it. 2005-11-20 16:43:32 +0000 Julien Moutte gst/matroska/matroska-mux.c: Fix for Original commit message from CVS: 2005-11-20 Julien MOUTTE * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): Fix for API changes. * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Fix for API changes, but also fix the code that was not checking return values from pad_push neither using pad_alloc_buffer. 2005-11-18 18:19:21 +0000 Edward Hervey ext/libpng/gstpngenc.c: Added debug category Original commit message from CVS: * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), (gst_pngenc_chain): Added debug category Return GST_FLOW_UNEXPECTED when sending an EOS, so the whole pipeline goes to EOS. 2005-11-17 18:23:23 +0000 Edgard Lima * ChangeLog: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711depay.c: * gst/rtp/gstrtpg711enc.c: * gst/rtp/gstrtpg711enc.h: * gst/rtp/gstrtpg711pay.c: * gst/rtp/gstrtpg711pay.h: * gst/rtp/gstrtpspeexdec.c: * gst/rtp/gstrtpspeexdec.h: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexdepay.h: * gst/rtp/gstrtpspeexenc.c: * gst/rtp/gstrtpspeexenc.h: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpspeexpay.h: Created Speex payloader and depayloader; Optimize G711 payloader to use adapter and send packets until MTU size. Original commit message from CVS: Created Speex payloader and depayloader; Optimize G711 payloader to use adapter and send packets until MTU size. 2005-11-16 19:08:54 +0000 Wim Taymans check/elements/matroskamux.c: Fix leak in check. Original commit message from CVS: * check/elements/matroskamux.c: (setup_src_pad), (setup_sink_pad): Fix leak in check. 2005-11-16 17:00:32 +0000 Wim Taymans gst/flx/gstflxdec.c: Fix state change. Original commit message from CVS: * gst/flx/gstflxdec.c: (gst_flxdec_change_state): Fix state change. 2005-11-16 11:02:24 +0000 Andy Wingo * ChangeLog: * gst/udp/gstudpsrc.c: Move comment. Original commit message from CVS: (gst_udpsrc_create): Move comment. 2005-11-16 10:43:44 +0000 Andy Wingo gst/udp/gstudpsrc.c: Clean up with the boilerplate macro. Original commit message from CVS: 2005-11-16 Andy Wingo * gst/udp/gstudpsrc.c: Clean up with the boilerplate macro. 2005-11-15 19:41:21 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: When seeking, seek to closest index entry at or before the requested seek position, no... Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/matroska/matroska-demux.c: (gst_matroskademux_do_index_seek): When seeking, seek to closest index entry at or before the requested seek position, not just the closest one (#321001). 2005-11-15 12:16:00 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Invert DIB images again (see #132341). Original commit message from CVS: * gst/avi/gstavidemux.c: (swap_line), (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data): Invert DIB images again (see #132341). 2005-11-14 02:13:35 +0000 Thomas Vander Stichele * ChangeLog: * common: * configure.ac: * ext/aalib/gstaasink.c: * ext/cairo/gstcairo.c: * ext/dv/gstdv.c: * ext/esd/gstesd.c: * ext/flac/gstflac.c: * ext/gconf/gstgconfelements.c: * ext/gdk_pixbuf/gstgdkpixbuf.c: * ext/jpeg/gstjpeg.c: * ext/ladspa/gstladspa.c: * ext/libcaca/gstcacasink.c: * ext/libmng/gstmng.c: * ext/libpng/gstpng.c: * ext/mikmod/gstmikmod.c: * ext/pango/gsttextoverlay.c: * ext/pango/gsttimeoverlay.c: * ext/raw1394/gst1394.c: * ext/speex/gstspeex.c: * gst/alpha/Makefile.am: * gst/alpha/gstalpha.c: * gst/alpha/gstalphacolor.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautodetect.c: * gst/avi/gstavi.c: * gst/cutter/gstcutter.c: * gst/debug/efence.c: * gst/debug/gstdebug.c: * gst/debug/gstnavigationtest.c: * gst/effectv/gsteffectv.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/law/alaw.c: * gst/law/mulaw.c: * gst/level/gstlevel.c: * gst/matroska/matroska.c: * gst/median/gstmedian.c: * gst/monoscope/gstmonoscope.c: * gst/multipart/multipart.c: * gst/oldcore/gstelements.c: * gst/rtp/Makefile.am: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstrtp.c: * gst/rtsp/gstrtsp.c: * gst/smoothwave/gstsmoothwave.c: * gst/smpte/gstsmpte.c: * gst/udp/gstudp.c: * gst/videobox/gstvideobox.c: * gst/videofilter/gstgamma.c: * gst/videofilter/gstvideobalance.c: * gst/videofilter/gstvideoflip.c: * gst/videofilter/gstvideotemplate.c: * gst/videomixer/videomixer.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: * sys/oss/gstossaudio.c: * sys/osxaudio/gstosxaudio.c: rework configure.ac; make asterisk rtp stuff compile on mingw Original commit message from CVS: rework configure.ac; make asterisk rtp stuff compile on mingw 2005-11-12 13:31:56 +0000 Edward Hervey ext/jpeg/gstjpegdec.c: Only GST_DEBUG() information on the valid components. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): Only GST_DEBUG() information on the valid components. 2005-11-11 19:34:50 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: back to head Original commit message from CVS: back to head === release 0.9.5 === 2005-11-11 19:33:23 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: releasing 0.9.5 Original commit message from CVS: releasing 0.9.5 2005-11-11 18:33:21 +0000 Thomas Vander Stichele * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: Update .po files Original commit message from CVS: Update .po files 2005-11-11 16:48:58 +0000 Edward Hervey gst/avi/gstavidemux.*: Yeah, implement proper seeking. Exact seeking and segment seeking. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_reset), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_event), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): * gst/avi/gstavidemux.h: Yeah, implement proper seeking. Exact seeking and segment seeking. Still need to do some checks for segment_stop. 2005-11-11 15:17:44 +0000 Christian Schaller * gst-plugins-good.spec.in: fix Cairo entry Original commit message from CVS: fix Cairo entry 2005-11-10 12:34:26 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Add support for custom genre tags. Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): Add support for custom genre tags. 2005-11-10 12:22:30 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: Don't try to ready buffer duration from buffer that we don't own any longer and that mi... Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_data): Don't try to ready buffer duration from buffer that we don't own any longer and that might already have been unreffed. (#321136) 2005-11-09 21:35:29 +0000 Zeeshan Ali * ChangeLog: * gst/flx/gstflxdec.c: Attempting to optimize the code for embedded systems. Original commit message from CVS: Attempting to optimize the code for embedded systems. 2005-11-08 08:54:30 +0000 Tim-Philipp Müller sys/oss/gstosssink.c: Don't re-use already closed file descriptor. (#320920) Original commit message from CVS: Reviewed by: Tim-Philipp Müller * sys/oss/gstosssink.c: (gst_oss_sink_close): Don't re-use already closed file descriptor. (#320920) 2005-11-07 17:35:20 +0000 Tim-Philipp Müller sys/oss/gstosssink.*: Cache probed caps; fix debug output for SET_PARAM macros. Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_dispose), (gst_oss_sink_set_property), (gst_oss_sink_getcaps), (gst_oss_sink_prepare): * sys/oss/gstosssink.h: Cache probed caps; fix debug output for SET_PARAM macros. 2005-11-07 15:09:54 +0000 Tim-Philipp Müller ext/cairo/: Port cairo textoverlay plugin to 0.9. Add 'shaded-background' property and redo position. Doesn't handle ... Original commit message from CVS: * ext/cairo/Makefile.am: * ext/cairo/gstcairo.c: (plugin_init): * ext/cairo/gsttextoverlay.c: (gst_text_overlay_base_init), (gst_text_overlay_class_init), (gst_text_overlay_finalize), (gst_text_overlay_init), (gst_text_overlay_font_init), (gst_text_overlay_set_property), (gst_text_overlay_render_text), (gst_text_overlay_getcaps), (gst_text_overlay_setcaps), (gst_text_overlay_text_pad_linked), (gst_text_overlay_text_pad_unlinked), (gst_text_overlay_shade_y), (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), (gst_text_overlay_push_frame), (gst_text_overlay_pop_video), (gst_text_overlay_pop_text), (gst_text_overlay_collected), (gst_text_overlay_change_state): * ext/cairo/gsttextoverlay.h: Port cairo textoverlay plugin to 0.9. Add 'shaded-background' property and redo position. Doesn't handle upstream renegotiation yet though. 2005-11-07 10:31:32 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: No need to take the STREAM_LOCK in the loop function. Improve some debug messages. Don't leak ... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), (gst_avi_demux_loop): No need to take the STREAM_LOCK in the loop function. Improve some debug messages. Don't leak pad names in debug messages. 2005-11-07 10:27:00 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Don't error out when the source pad isn't linked. Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_push_vorbis_codec_priv_data), (gst_matroska_demux_add_wvpk_header): Don't error out when the source pad isn't linked. 2005-11-02 19:42:38 +0000 Tim-Philipp Müller ext/gconf/: Fix state change functions here as well and set kid to NULL state before removing it. Original commit message from CVS: * ext/gconf/gstgconfaudiosink.c: (do_toggle_element), (gst_gconf_audio_sink_change_state): * ext/gconf/gstgconfvideosink.c: (do_toggle_element), (gst_gconf_video_sink_change_state): Fix state change functions here as well and set kid to NULL state before removing it. 2005-11-02 16:48:55 +0000 Thomas Vander Stichele * check/elements/matroskamux.c: * common: * tests/check/elements/matroskamux.c: sigh, static pad templates aren't refcounted properly Original commit message from CVS: sigh, static pad templates aren't refcounted properly 2005-11-01 16:14:25 +0000 Thomas Vander Stichele * check/elements/.gitignore: * gst/level/.gitignore: * tests/check/elements/.gitignore: ignore more Original commit message from CVS: ignore more 2005-11-01 15:15:44 +0000 Edward Hervey gst/wavenc/gstwavenc.c: Added proper event handlind, made downstream newsegment event use GST_FORMAT_BYTES (otherwise... Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file), (gst_wavenc_init), (gst_wavenc_event), (gst_wavenc_chain): Added proper event handlind, made downstream newsegment event use GST_FORMAT_BYTES (otherwise it's ignored), and don't set a duration of 0 for buffers otherwise they are discarded by GstBaseSink. GstWavEnc needs some serious loving, after going through the code I'm really wondering how this can stay in -good ... 2005-11-01 15:11:16 +0000 Thomas Vander Stichele Fix leaks and invalid memory access as reported by valgrind Original commit message from CVS: * check/elements/matroskamux.c: (setup_src_pad), (setup_sink_pad), (setup_matroskamux), (check_buffer_data), (GST_START_TEST): * gst/matroska/matroska-mux.c: (gst_matroska_mux_finalize), (gst_matroska_mux_reset), (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_start), (gst_matroska_mux_write_data), (gst_matroska_mux_collected): Fix leaks and invalid memory access as reported by valgrind 2005-11-01 14:41:01 +0000 Thomas Vander Stichele * check/elements/matroskamux.c: * tests/check/elements/matroskamux.c: ... and add the missing file Original commit message from CVS: ... and add the missing file 2005-11-01 14:36:02 +0000 Michal Benes add a unit test for matroskamux fix the bugs that the unit test exposed Original commit message from CVS: Patch by: Michal Benes * check/Makefile.am: * gst/matroska/ebml-write.c: (gst_ebml_write_seek): * gst/matroska/matroska-mux.c: (gst_matroska_mux_handle_src_event), (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_start): add a unit test for matroskamux fix the bugs that the unit test exposed 2005-11-01 14:34:22 +0000 Thomas Vander Stichele * gst/rtp/Makefile.am: fix Makefile.am Original commit message from CVS: fix Makefile.am 2005-11-01 12:39:16 +0000 Tim-Philipp Müller gst/autodetect/: Fix state change function and use GST_DEBUG_FUNCPTR in class_init. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_class_init), (gst_auto_audio_sink_change_state): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_class_init), (gst_auto_video_sink_change_state): Fix state change function and use GST_DEBUG_FUNCPTR in class_init. 2005-11-01 12:35:39 +0000 Tim-Philipp Müller gst/matroska/: Set timestamps on outgoing ebml headers as well, so that the element after matroskamux can get the tim... Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/matroska/ebml-write.c: (gst_ebml_write_new), (gst_ebml_write_reset), (gst_ebml_write_element_new): * gst/matroska/ebml-write.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_write_data): Set timestamps on outgoing ebml headers as well, so that the element after matroskamux can get the timestamp already when reading the first ebml element and doesn't have to wait for the actual data buffer for that (#320308). 2005-10-31 22:08:52 +0000 Andy Wingo * ChangeLog: * gst/videomixer/videomixer.c: gst/videomixer/videomixer.c (gst_videomixer_pad_unlink) Original commit message from CVS: 2005-10-31 Andy Wingo * gst/videomixer/videomixer.c (gst_videomixer_pad_unlink) (gst_videomixer_pad_link): Kill some memleaks. (gst_videomixer_pad_get_property): Style fix. (gst_videomixer_pad_set_property): Style fix. (gst_videomixer_pad_init): Style fix. (gst_videomixer_update_queues): Kill memleak. (gst_videomixer_loop): Kill memleak. (gst_videomixer_collected): Kill memleak. 2005-10-31 19:08:27 +0000 Edgard Lima * ChangeLog: * gst/auparse/gstauparse.c: Just some cleanup. Original commit message from CVS: Just some cleanup. 2005-10-31 14:41:31 +0000 Edgard Lima * ChangeLog: * ext/speex/gstspeexenc.c: Add checks to GST_FLOW_NOT_LINKED for values returned from gst_pad_push. Original commit message from CVS: Add checks to GST_FLOW_NOT_LINKED for values returned from gst_pad_push. 2005-10-31 12:00:10 +0000 Zeeshan Ali * ChangeLog: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711depay.c: Payloader now sets some default caps on the srcpad if caps on the sinkpad are never set. This is important for the g7... Original commit message from CVS: Payloader now sets some default caps on the srcpad if caps on the sinkpad are never set. This is important for the g711 to work with burger's rtpbin element. 2005-10-28 19:19:40 +0000 Edgard Lima * ChangeLog: * common: * ext/speex/gstspeexenc.c: Add checks for return values from gst_pad_push and gst_pad_alloc_buffer. Original commit message from CVS: Add checks for return values from gst_pad_push and gst_pad_alloc_buffer. 2005-10-28 15:32:48 +0000 Tim-Philipp Müller gst/matroska/: Add SimpleBlock support to matroska demuxer and muxer (part of Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), (gst_matroska_demux_parse_info), (gst_matroska_demux_parse_blockgroup_or_simpleblock), (gst_matroska_demux_parse_cluster): * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init), (gst_matroska_mux_init), (gst_matroska_mux_start), (gst_matroska_mux_create_buffer_header), (gst_matroska_mux_write_data), (gst_matroska_mux_set_property), (gst_matroska_mux_get_property): * gst/matroska/matroska-mux.h: Add SimpleBlock support to matroska demuxer and muxer (part of Matroska v2). (#319731) 2005-10-28 13:24:40 +0000 Wim Taymans ext/jpeg/gstjpegdec.*: Cleanups. Don't create caps for every chain. Original commit message from CVS: * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_chain), (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.h: Cleanups. Don't create caps for every chain. 2005-10-27 18:46:32 +0000 Flavio Oliveira * ChangeLog: * gst/law/alaw-encode.c: * gst/law/alaw-encode.h: * gst/law/mulaw-encode.c: * gst/law/mulaw-encode.h: Fix to set timestamp on buffer, it was tested with RTP G711 elements. Original commit message from CVS: Fix to set timestamp on buffer, it was tested with RTP G711 elements. 2005-10-27 11:27:53 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.h: Remove got_redirect from class structure as well. Original commit message from CVS: * gst/qtdemux/qtdemux.h: Remove got_redirect from class structure as well. 2005-10-27 11:25:19 +0000 Tim-Philipp Müller gst/qtdemux/qtdemux.c: Remove 'got-redirect' signal and post element message on the bus instead. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), (qtdemux_parse_tree): Remove 'got-redirect' signal and post element message on the bus instead. 2005-10-27 11:00:40 +0000 Wim Taymans sys/oss/gstosssrc.c: Set correct format on oss instead of a silly value. Original commit message from CVS: * sys/oss/gstosssrc.c: (gst_oss_src_prepare): Set correct format on oss instead of a silly value. 2005-10-27 09:52:08 +0000 Julien Moutte gst/videobox/gstvideobox.c: Use liboil for Original commit message from CVS: 2005-10-27 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_transform_caps), (gst_video_box_set_caps), (gst_video_box_get_unit_size), (gst_video_box_copy_plane_i420), (gst_video_box_i420), (gst_video_box_ayuv): Use liboil for I420 rendering as well, doesn't bring much for my platform. Might help on some other platforms. 2005-10-26 21:47:36 +0000 Zeeshan Ali * ChangeLog: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmpay.c: Declaring the padtemplate correctly. Original commit message from CVS: Declaring the padtemplate correctly. 2005-10-26 20:28:32 +0000 Zeeshan Ali * ChangeLog: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711depay.c: * gst/rtp/gstrtpg711enc.c: * gst/rtp/gstrtpg711pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmpay.c: Setting the proper copyright notice. Original commit message from CVS: Setting the proper copyright notice. 2005-10-26 17:23:06 +0000 Julien Moutte gst/videobox/Makefile.am: Use liboil. Original commit message from CVS: 2005-10-26 Julien MOUTTE * gst/videobox/Makefile.am: Use liboil. * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_set_property), (gst_video_box_transform_caps), (gst_video_box_set_caps), (gst_video_box_get_unit_size), (gst_video_box_ayuv): Lot of optimization in AYUV rendering using liboil. Will dot the same to I420 border generation tomorrow. 2005-10-26 16:36:01 +0000 Thomas Vander Stichele * gst/rtp/Makefile.am: fix automake warnings Original commit message from CVS: fix automake warnings 2005-10-26 14:50:59 +0000 Zeeshan Ali * ChangeLog: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711dec.h: * gst/rtp/gstrtpg711depay.c: * gst/rtp/gstrtpg711depay.h: * gst/rtp/gstrtpg711enc.c: * gst/rtp/gstrtpg711pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmparse.h: * gst/rtp/gstrtpgsmpay.c: Hacked the G711 (de)payloader to try to make things right. rtpg711dec now inherits from the basertpdepayloader. Original commit message from CVS: Hacked the G711 (de)payloader to try to make things right. rtpg711dec now inherits from the basertpdepayloader. 2005-10-26 14:23:45 +0000 Julien Moutte gst/videobox/gstvideobox.c: Removing this forgotten debug. Original commit message from CVS: 2005-10-26 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_transform_caps), (gst_video_box_get_unit_size), (gst_video_box_ayuv): Removing this forgotten debug. 2005-10-26 14:08:49 +0000 Julien Moutte gst/videobox/gstvideobox.c: Fix the stride issue when boxing to AYUV. Original commit message from CVS: 2005-10-26 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_transform_caps), (gst_video_box_get_unit_size), (gst_video_box_ayuv): Fix the stride issue when boxing to AYUV. 2005-10-26 11:12:34 +0000 Tim-Philipp Müller sys/oss/: Actually use the 'oss' debug category we register. Original commit message from CVS: * sys/oss/gstossaudio.c: * sys/oss/gstossdmabuffer.c: * sys/oss/gstosshelper.c: * sys/oss/gstossmixer.c: * sys/oss/gstossmixerelement.c: * sys/oss/gstossmixertrack.c: * sys/oss/gstosssink.c: * sys/oss/gstosssrc.c: Actually use the 'oss' debug category we register. 2005-10-26 10:38:18 +0000 Julien Moutte gst/videomixer/videomixer.c: Use gst_pad_get_parent and drop the ref that was added through that call. Original commit message from CVS: 2005-10-26 Julien MOUTTE * gst/videomixer/videomixer.c: (gst_videomixer_pad_set_property), (gst_videomixer_pad_sink_setcaps), (gst_videomixer_getcaps): Use gst_pad_get_parent and drop the ref that was added through that call. 2005-10-26 10:03:02 +0000 Thomas Vander Stichele * ChangeLog: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmpay.c: fix compilation Original commit message from CVS: fix compilation 2005-10-25 21:09:36 +0000 Flavio Oliveira * ChangeLog: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711depay.c: Just removed a couple of lines of weird code used during development/test time. Original commit message from CVS: Just removed a couple of lines of weird code used during development/test time. 2005-10-25 19:19:38 +0000 Flavio Oliveira * ChangeLog: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpg711dec.c: * gst/rtp/gstrtpg711dec.h: * gst/rtp/gstrtpg711depay.c: * gst/rtp/gstrtpg711depay.h: * gst/rtp/gstrtpg711enc.c: * gst/rtp/gstrtpg711enc.h: * gst/rtp/gstrtpg711pay.c: * gst/rtp/gstrtpg711pay.h: G711 payloader and depayloader created by Edgard Lima (it supports mulaw and alaw (dec)encoders) Original commit message from CVS: G711 payloader and depayloader created by Edgard Lima (it supports mulaw and alaw (dec)encoders) 2005-10-25 17:55:19 +0000 Julien Moutte gst/videobox/gstvideobox.c: Doh ! I introduced wingo's bug again ! Sorry... Original commit message from CVS: 2005-10-25 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_transform_caps), (gst_video_box_get_unit_size): Doh ! I introduced wingo's bug again ! Sorry... 2005-10-25 16:02:38 +0000 Christian Schaller * ChangeLog: * gst/rtp/Makefile.am: add missing header files for disting Original commit message from CVS: add missing header files for disting 2005-10-25 15:07:02 +0000 Zeeshan Ali * ChangeLog: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmenc.h: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmparse.h: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtpgsmpay.h: Getting the GSM (de)payloader working and compatible with our plans for RTP. Original commit message from CVS: Getting the GSM (de)payloader working and compatible with our plans for RTP. 2005-10-25 13:03:04 +0000 Christian Schaller * gst/rtp/gstrtp.c: fix mistaken claim on GPL, its LGPL Original commit message from CVS: fix mistaken claim on GPL, its LGPL 2005-10-25 10:47:09 +0000 Julien Moutte ext/libpng/gstpngdec.c: Push a newsegment event, move some redundant code in a single place. Original commit message from CVS: 2005-10-25 Julien MOUTTE * ext/libpng/gstpngdec.c: (user_info_callback), (gst_pngdec_caps_create_and_set), (gst_pngdec_task): Push a newsegment event, move some redundant code in a single place. 2005-10-25 10:23:26 +0000 Julien Moutte ext/libpng/gstpngdec.c: Temporary hack to get correct colors order when we have a png image with alpha channel. Original commit message from CVS: 2005-10-25 Julien MOUTTE * ext/libpng/gstpngdec.c: (user_info_callback), (gst_pngdec_caps_create_and_set), (gst_pngdec_task): Temporary hack to get correct colors order when we have a png image with alpha channel. 2005-10-24 17:29:02 +0000 Edward Hervey ext/dv/gstdvdemux.c: Call gst_element_no_more_pads when there will be no more pads. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_add_pads): Call gst_element_no_more_pads when there will be no more pads. 2005-10-24 16:39:38 +0000 Wim Taymans gst/rtp/: Added two new payloaders, an RFC 2190 payloader for h263 and a payload convertor for an asterisk server. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_get_type), (gst_asteriskh263_base_init), (gst_asteriskh263_class_init), (gst_asteriskh263_init), (gst_asteriskh263_finalize), (gst_asteriskh263_chain), (gst_asteriskh263_set_property), (gst_asteriskh263_get_property), (gst_asteriskh263_change_state), (gst_asteriskh263_plugin_init): * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph263enc.c: (gst_rtph263enc_get_type), (gst_rtph263enc_base_init), (gst_rtph263enc_class_init), (gst_rtph263enc_init), (gst_rtph263enc_finalize), (gst_rtph263enc_setcaps), (gst_rtph263enc_gobfiner), (gst_rtph263enc_flush), (gst_rtph263enc_handle_buffer), (gst_rtph263enc_plugin_init): * gst/rtp/gstrtph263enc.h: Added two new payloaders, an RFC 2190 payloader for h263 and a payload convertor for an asterisk server. 2005-10-24 15:57:17 +0000 Tim-Philipp Müller sys/oss/gstosssrc.c: Set bytes_per_sample correctly (is not always 4, but depends on width and number of channels). Original commit message from CVS: * sys/oss/gstosssrc.c: (gst_oss_src_prepare): Set bytes_per_sample correctly (is not always 4, but depends on width and number of channels). 2005-10-24 15:50:06 +0000 Tim-Philipp Müller ext/flac/gstflacenc.*: Fix seeking, so that flacenc can rewrite the header with the correct duration and amount of sa... Original commit message from CVS: * ext/flac/gstflacenc.c: (gst_flacenc_base_init), (gst_flacenc_init), (gst_flacenc_sink_setcaps), (gst_flacenc_seek_callback), (gst_flacenc_write_callback), (gst_flacenc_sink_event), (gst_flacenc_chain), (gst_flacenc_set_property), (gst_flacenc_get_property), (gst_flacenc_change_state): * ext/flac/gstflacenc.h: Fix seeking, so that flacenc can rewrite the header with the correct duration and amount of samples and all that at EOS; also set timestamps and granulepos on outgoing buffers; add debug category; fix state change function. 2005-10-24 13:46:09 +0000 Julien Moutte gst/videomixer/videomixer.c: Don't restrict video geometry from 16 to 4096. Original commit message from CVS: 2005-10-24 Julien MOUTTE * gst/videomixer/videomixer.c: Don't restrict video geometry from 16 to 4096. 2005-10-24 13:22:14 +0000 Julien Moutte gst/videobox/gstvideobox.c: Fix caps negotiation correctly, add debugging category. Original commit message from CVS: 2005-10-24 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_transform_caps), (gst_video_box_get_unit_size): Fix caps negotiation correctly, add debugging category. 2005-10-24 13:02:47 +0000 Christian Schaller * ChangeLog: * configure.ac: port over plugin listing from base Original commit message from CVS: port over plugin listing from base 2005-10-24 08:59:24 +0000 Julien Moutte ext/libpng/gstpngdec.c: Don't use fixed caps on a sink pad. Original commit message from CVS: 2005-10-24 Julien MOUTTE * ext/libpng/gstpngdec.c: (gst_pngdec_init): Don't use fixed caps on a sink pad. 2005-10-23 23:05:59 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: * docs/upload.mak: back to HEAD Original commit message from CVS: back to HEAD === release 0.9.4 === 2005-10-23 22:43:08 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * RELEASE: * configure.ac: * docs/Makefile.am: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-alphacolor.xml: * docs/plugins/inspect/plugin-auparse.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-cairo.xml: * docs/plugins/inspect/plugin-debug.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-efence.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-flxdec.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-matroska.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-navigationtest.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-videomixer.xml: * docs/plugins/inspect/plugin-wavenc.xml: * docs/plugins/inspect/plugin-wavparse.xml: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: releasing 0.9.4 Original commit message from CVS: releasing 0.9.4 2005-10-23 11:07:10 +0000 Thomas Vander Stichele * ext/libpng/gstpngdec.c: * gst/wavparse/gstwavparse.c: * po/POTFILES.in: STOPPED->FAILED Original commit message from CVS: STOPPED->FAILED 2005-10-21 17:00:58 +0000 Tim-Philipp Müller ext/speex/gstspeexenc.c: Add position and duration query, fix query type function. Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speexenc_get_query_types), (gst_speexenc_src_query): Add position and duration query, fix query type function. * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps): Let's not set non-fixed caps on source pads. 2005-10-21 16:15:57 +0000 Wim Taymans Set correct stream_time in newsegment event. avi can also handle a duration query now. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame): * gst/avi/gstavidemux.c: (gst_avi_demux_get_src_query_types), (gst_avi_demux_handle_seek): Set correct stream_time in newsegment event. avi can also handle a duration query now. 2005-10-21 10:06:40 +0000 Christian Schaller * gst-plugins-good.spec.in: update for latest additions Original commit message from CVS: update for latest additions 2005-10-20 19:14:27 +0000 Tim-Philipp Müller gst/matroska/matroska-demux.c: Fix duration query; fix basetime in newsegment event after seek; fix duration in initi... Original commit message from CVS: * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_src_query), (gst_matroska_demux_handle_seek_event), (gst_matroska_demux_loop_stream_parse_id): Fix duration query; fix basetime in newsegment event after seek; fix duration in initial newsegment event. * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_setcaps), (gst_matroska_mux_start): Extract number of channels and samplerate from vorbis headers; add some debug messages when querying the durations of the input streams. 2005-10-20 11:50:53 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Set stream time correctly in newsegment. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event): Set stream time correctly in newsegment. 2005-10-20 11:39:40 +0000 Wim Taymans gst/avi/gstavidemux.c: Correctly fill in the stream time. Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): Correctly fill in the stream time. 2005-10-19 20:48:24 +0000 Thomas Vander Stichele * ChangeLog: * check/elements/level.c: * gst/level/gstlevel.c: * gst/level/level-example.c: * tests/check/elements/level.c: use ELEMENT messages instead Original commit message from CVS: use ELEMENT messages instead 2005-10-19 15:58:00 +0000 Wim Taymans gst/: API change fix. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_query_types), (gst_qtdemux_handle_src_query): * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query): * gst/tta/gstttaparse.c: (gst_tta_parse_src_event), (gst_tta_parse_get_query_types), (gst_tta_parse_query): API change fix. 2005-10-19 15:57:04 +0000 Wim Taymans API change fix. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_get_src_query_types), (gst_dvdemux_src_query): * ext/flac/gstflacdec.c: (gst_flacdec_length), (gst_flacdec_src_query): * ext/raw1394/gstdv1394src.c: (gst_dv1394src_query): * ext/speex/gstspeexdec.c: (speex_dec_src_query): * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): * gst/debug/gstnavseek.c: (gst_navseek_seek): * gst/debug/progressreport.c: (gst_progress_report_report): * gst/matroska/ebml-read.c: (gst_ebml_read_get_length): * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_src_query): * gst/matroska/matroska-mux.c: (gst_matroska_mux_start): * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event): API change fix. 2005-10-19 10:57:46 +0000 Tim-Philipp Müller gst/goom/: Make inline functions either 'static inline' or 'extern inline', otherwise the Forte compiler apparently w... Original commit message from CVS: * gst/goom/filters.c: * gst/goom/graphic.h: * gst/goom/lines.c: Make inline functions either 'static inline' or 'extern inline', otherwise the Forte compiler apparently won't inline them (#317300). 2005-10-18 22:50:11 +0000 Julien Moutte ext/libpng/gstpngdec.c: forgot the buffer unref in pull. Original commit message from CVS: 2005-10-19 Julien MOUTTE * ext/libpng/gstpngdec.c: forgot the buffer unref in pull. 2005-10-18 22:44:11 +0000 Julien Moutte ext/libpng/gstpngdec.*: Complete rewrite of pngdec. It's now very nice and handle push/pull based model. if you have ... Original commit message from CVS: 2005-10-19 Julien MOUTTE * ext/libpng/gstpngdec.c: (gst_pngdec_class_init), (gst_pngdec_init), (user_error_fn), (user_warning_fn), (user_info_callback), (user_endrow_callback), (user_end_callback), (user_read_data), (gst_pngdec_caps_create_and_set), (gst_pngdec_task), (gst_pngdec_chain), (gst_pngdec_sink_event), (gst_pngdec_libpng_clear), (gst_pngdec_libpng_init), (gst_pngdec_change_state), (gst_pngdec_sink_activate_push), (gst_pngdec_sink_activate_pull), (gst_pngdec_sink_activate): * ext/libpng/gstpngdec.h: Complete rewrite of pngdec. It's now very nice and handle push/pull based model. if you have filesrc connected to it, it will do random access to load the png file. If you have a network source that can't do _getrange, it does progressive loading through the chain function. * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps), (transform_rgb), (transform_bgr): Fix caps negotiation correctly thanks to Master Wim Taymans ;-) 2005-10-18 18:12:31 +0000 Tim-Philipp Müller gst/matroska/: Ported matroska demuxer to 0.9. Original commit message from CVS: * gst/matroska/Makefile.am: * gst/matroska/ebml-read.c: * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-demux.h: * gst/matroska/matroska.c: (plugin_init): Ported matroska demuxer to 0.9. 2005-10-18 18:06:14 +0000 Tim-Philipp Müller gst/matroska/matroska-mux.c: Fix mpeg4 input handling (#318847); also, while we're at it, fix media type for Motion-J... Original commit message from CVS: Reviewed by: Tim-Philipp Müller * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_setcaps), (gst_matroska_mux_audio_pad_setcaps): Fix mpeg4 input handling (#318847); also, while we're at it, fix media type for Motion-JPEG: should be image/jpeg. 2005-10-18 13:21:18 +0000 Wim Taymans gst/wavparse/gstwavparse.c: Fix for segment-start/stop API change. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event): Fix for segment-start/stop API change. 2005-10-17 17:18:56 +0000 Julien Moutte gst/alpha/gstalphacolor.c: Handle caps negotiation in a better way. Original commit message from CVS: 2005-10-17 Julien MOUTTE * gst/alpha/gstalphacolor.c: (gst_alpha_color_transform_caps), (transform_rgb), (transform_bgr): Handle caps negotiation in a better way. 2005-10-17 16:59:20 +0000 Julien Moutte gst/videobox/gstvideobox.c: Fix caps nego some more to get Original commit message from CVS: 2005-10-17 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_transform_caps), (gst_video_box_get_unit_size): Fix caps nego some more to get AYUV output declared in transform_caps. 2005-10-17 15:23:24 +0000 Julien Moutte ext/libpng/gstpngdec.c: We use fixed caps. Original commit message from CVS: 2005-10-17 Julien MOUTTE * ext/libpng/gstpngdec.c: (gst_pngdec_init): We use fixed caps. 2005-10-17 15:14:29 +0000 Julien Moutte gst/videobox/gstvideobox.c: Fix wrong size calculations and implement get_unit_size correctly. Original commit message from CVS: 2005-10-17 Julien MOUTTE * gst/videobox/gstvideobox.c: (gst_video_box_transform_caps), (gst_video_box_get_unit_size): Fix wrong size calculations and implement get_unit_size correctly. 2005-10-17 14:56:12 +0000 Tim-Philipp Müller configure.ac: Enable flx plugin. Original commit message from CVS: * configure.ac: Enable flx plugin. * gst/flx/gstflxdec.c: (flx_decode_chunks): Fix gcc4 signedness issue. 2005-10-17 08:46:30 +0000 Julien Moutte configure.ac: Adding videomixer. Original commit message from CVS: 2005-10-17 Julien MOUTTE * configure.ac: Adding videomixer. * ext/libpng/gstpngdec.c: (gst_pngdec_class_init), (user_read_data), (gst_pngdec_chain): More debugging. * gst/alpha/Makefile.am: Adding alphacolor * gst/alpha/gstalphacolor.c: (gst_alpha_color_base_init), (gst_alpha_color_class_init), (gst_alpha_color_init), (gst_alpha_color_transform_caps), (gst_alpha_color_set_caps), (transform_rgb), (transform_bgr), (gst_alpha_color_transform_ip), (plugin_init): Ported to 0.9 using in place base tranform. * gst/videomixer/Makefile.am: * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), (gst_videomixer_pad_class_init), (gst_videomixer_pad_sink_setcaps), (gst_videomixer_pad_link), (gst_videomixer_pad_unlink), (gst_videomixer_pad_init), (gst_videomixer_class_init), (gst_videomixer_init), (gst_videomixer_getcaps), (gst_videomixer_request_new_pad), (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), (gst_videomixer_collected), (gst_videomixer_change_state): Ported to 0.9 using collectpads. 2005-10-16 21:19:44 +0000 Zeeshan Ali * ChangeLog: * common: * configure.ac: * gst/flx/Makefile.am: * gst/flx/gstflxdec.c: * gst/flx/gstflxdec.h: flx plugin ported to 0.9 Original commit message from CVS: flx plugin ported to 0.9 2005-10-16 14:33:05 +0000 Thomas Vander Stichele * ChangeLog: * ext/shout2/gstshout2.c: use gst_version_string Original commit message from CVS: use gst_version_string 2005-10-16 13:17:11 +0000 Andy Wingo configure.ac: GLIB_CHECK. Original commit message from CVS: 2005-10-16 Andy Wingo * configure.ac: GLIB_CHECK. 2005-10-15 16:48:55 +0000 Julien Moutte ext/libpng/: Ported pngdec to 0.9 Original commit message from CVS: 2005-10-15 Julien MOUTTE * ext/libpng/Makefile.am: * ext/libpng/gstpng.c: (plugin_init): * ext/libpng/gstpngdec.c: (gst_pngdec_class_init), (gst_pngdec_init), (user_read_data), (gst_pngdec_chain): * ext/libpng/gstpngdec.h: Ported pngdec to 0.9 2005-10-14 12:43:30 +0000 Tim-Philipp Müller Port matroska muxer to 0.9 (#318847). Original commit message from CVS: Reviewed by: Tim-Philipp Müller * configure.ac: * gst/matroska/Makefile.am: * gst/matroska/ebml-ids.h: * gst/matroska/ebml-write.c: * gst/matroska/ebml-write.h: * gst/matroska/matroska-ids.h: * gst/matroska/matroska-mux.c: * gst/matroska/matroska-mux.h: * gst/matroska/matroska.c: (plugin_init): Port matroska muxer to 0.9 (#318847). 2005-10-13 18:59:35 +0000 Tim-Philipp Müller ext/speex/gstspeexenc.c: Fix handling of GST_TAG_DATE, which is now of GST_TYPE_DATE; use GST_READ_UINT32_LE() and fr... Original commit message from CVS: * ext/speex/gstspeexenc.c: (gst_speexenc_get_tag_value), (comment_init), (comment_add): Fix handling of GST_TAG_DATE, which is now of GST_TYPE_DATE; use GST_READ_UINT32_LE() and friends rather than the private implementation of those same macros. 2005-10-13 16:01:35 +0000 Thomas Vander Stichele * ext/cairo/Makefile.am: fix dist Original commit message from CVS: fix dist 2005-10-13 15:28:01 +0000 Stefan Kost examples/stats/mp2ogg.c: more typo fixes Original commit message from CVS: * examples/stats/mp2ogg.c: more typo fixes 2005-10-12 14:29:55 +0000 Stefan Kost renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition Original commit message from CVS: * examples/indexing/indexmpeg.c: (main): * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio), (gst_artsdsink_close_audio), (gst_artsdsink_change_state): * ext/artsd/gstartsdsink.h: * ext/audiofile/gstafparse.c: (gst_afparse_open_file), (gst_afparse_close_file): * ext/audiofile/gstafparse.h: * ext/audiofile/gstafsink.c: (gst_afsink_open_file), (gst_afsink_close_file), (gst_afsink_chain), (gst_afsink_change_state): * ext/audiofile/gstafsink.h: * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), (gst_afsrc_close_file), (gst_afsrc_change_state): * ext/audiofile/gstafsrc.h: * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_init): * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_init): * ext/dts/gstdtsdec.c: (gst_dtsdec_init): * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: (gst_jack_bin_init), (gst_jack_bin_change_state): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_init): * ext/nas/nassink.c: (gst_nassink_open_audio), (gst_nassink_close_audio), (gst_nassink_change_state): * ext/nas/nassink.h: * ext/polyp/polypsink.c: (gst_polypsink_init): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_change_state): * ext/sdl/sdlvideosink.h: * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): * ext/sndfile/gstsf.c: (gst_sf_set_property), (gst_sf_change_state), (gst_sf_release_request_pad), (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): * ext/sndfile/gstsf.h: * ext/swfdec/gstswfdec.c: (gst_swfdec_init): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_init): * gst/apetag/apedemux.c: (gst_ape_demux_init): * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): * gst/festival/gstfestival.c: (gst_festival_change_state): * gst/festival/gstfestival.h: * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_init), (gst_multifilesink_set_location), (gst_multifilesink_open_file), (gst_multifilesink_close_file), (gst_multifilesink_next_file), (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), (gst_multifilesink_chain), (gst_multifilesink_change_state): * gst/multifilesink/gstmultifilesink.h: * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): * sys/cdrom/gstcdplayer.c: (cdplayer_init): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init), (dxr3audiosink_open), (dxr3audiosink_close), (dxr3audiosink_chain_pcm), (dxr3audiosink_chain_ac3), (dxr3audiosink_change_state): * sys/dxr3/dxr3audiosink.h: * sys/dxr3/dxr3spusink.c: (dxr3spusink_init), (dxr3spusink_open), (dxr3spusink_close), (dxr3spusink_chain), (dxr3spusink_change_state): * sys/dxr3/dxr3spusink.h: * sys/dxr3/dxr3videosink.c: (dxr3videosink_init), (dxr3videosink_open), (dxr3videosink_close), (dxr3videosink_write_data), (dxr3videosink_change_state): * sys/dxr3/dxr3videosink.h: * sys/glsink/glimagesink.c: (gst_glimagesink_init): * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), (gst_qcamsrc_open), (gst_qcamsrc_close): * sys/qcam/gstqcamsrc.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): * sys/vcd/vcdsrc.c: (gst_vcdsrc_set_property), (gst_vcdsrc_get), (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), (gst_vcdsrc_change_state), (gst_vcdsrc_recalculate): * sys/vcd/vcdsrc.h: renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition 2005-10-12 14:29:43 +0000 Stefan Kost renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition Original commit message from CVS: * examples/indexing/indexmpeg.c: (main): * ext/esd/esdmon.c: (gst_esdmon_open_audio), (gst_esdmon_close_audio), (gst_esdmon_change_state): * ext/esd/esdmon.h: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init): * ext/pango/gsttextoverlay.c: (gst_textoverlay_init): * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_init): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_init): * gst/avi/gstavimux.c: (gst_avimux_init): * gst/matroska/matroska-demux.c: (gst_matroska_demux_init): * gst/multipart/multipartdemux.c: (gst_multipart_demux_init): * gst/multipart/multipartmux.c: (gst_multipart_mux_init): * gst/oldcore/gstmultifilesrc.c: (gst_multifilesrc_init), (gst_multifilesrc_get), (gst_multifilesrc_open_file), (gst_multifilesrc_close_file), (gst_multifilesrc_change_state): * gst/oldcore/gstmultifilesrc.h: * gst/oldcore/gstpipefilter.c: (gst_pipefilter_init), (gst_pipefilter_open_file), (gst_pipefilter_close_file), (gst_pipefilter_change_state): * gst/oldcore/gstpipefilter.h: * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): * gst/videomixer/videomixer.c: (gst_videomixer_init): * sys/osxaudio/gstosxaudiosink.c: (gst_osxaudiosink_init): * sys/osxaudio/gstosxaudiosink.h: * sys/osxaudio/gstosxaudiosrc.h: renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition 2005-10-12 03:14:57 +0000 Thomas Vander Stichele * ext/Makefile.am: dist cairo Original commit message from CVS: dist cairo 2005-10-12 03:12:57 +0000 Thomas Vander Stichele ext/: update of cairo-based timeoverlay to 1.0 Cairo API doesn't work yet for resizing of output sink Original commit message from CVS: * ext/Makefile.am: * ext/cairo/Makefile.am: * ext/cairo/gstcairo.c: (plugin_init): * ext/cairo/gsttextoverlay.c: (gst_textoverlay_change_state): * ext/cairo/gsttimeoverlay.c: (gst_timeoverlay_update_font_height), (gst_timeoverlay_setup), (gst_timeoverlay_planar411): * ext/cairo/gsttimeoverlay.h: update of cairo-based timeoverlay to 1.0 Cairo API doesn't work yet for resizing of output sink 2005-10-12 03:07:26 +0000 Thomas Vander Stichele * configure.ac: don't build checks if we don't have check Original commit message from CVS: don't build checks if we don't have check 2005-10-12 03:03:27 +0000 Thomas Vander Stichele * Makefile.am: * common: don't build checks if we don't have gstcheck Original commit message from CVS: don't build checks if we don't have gstcheck 2005-10-11 17:38:29 +0000 Wim Taymans ext/speex/gstspeexdec.c: newsegment API fix. Original commit message from CVS: * ext/speex/gstspeexdec.c: (speex_dec_event), (speex_dec_chain): newsegment API fix. 2005-10-11 16:34:36 +0000 Wim Taymans gst/: newsegment API update. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): * gst/tta/gstttaparse.c: (gst_tta_parse_src_event), (gst_tta_parse_parse_header): newsegment API update. 2005-10-11 16:33:08 +0000 Wim Taymans newsegment API update. Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event), (gst_dvdemux_demux_frame): * ext/flac/gstflacdec.c: (gst_flacdec_write): * gst/auparse/gstauparse.c: (gst_auparse_chain): * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek): * gst/goom/gstgoom.c: (gst_goom_event): * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file): * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_srcpad_event): newsegment API update. 2005-10-11 10:07:35 +0000 Andy Wingo ext/speex/gstspeexenc.c: Signedness cleanups. Original commit message from CVS: 2005-10-11 Andy Wingo * ext/speex/gstspeexenc.c: Signedness cleanups. 2005-10-10 19:57:40 +0000 Edgard Lima * ChangeLog: * PORTED_09: * ext/speex/Makefile.am: * ext/speex/gstspeex.c: * ext/speex/gstspeexenc.c: Speexenc ported to 0.9. Original commit message from CVS: Speexenc ported to 0.9. 2005-10-10 14:16:21 +0000 Wim Taymans sys/oss/: Cleanups, make device configurable in the sink, handle and report errors. Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_class_init), (gst_oss_sink_init), (gst_oss_sink_set_property), (gst_oss_sink_get_property), (gst_oss_sink_open), (gst_oss_sink_prepare), (gst_oss_sink_reset): * sys/oss/gstosssink.h: * sys/oss/gstosssrc.c: (gst_oss_src_class_init), (gst_oss_src_set_property), (gst_oss_src_init), (gst_oss_src_open), (gst_oss_src_prepare): Cleanups, make device configurable in the sink, handle and report errors. 2005-10-10 12:31:07 +0000 Wim Taymans ext/gconf/: Make sure element is NULL before removing from the bin. Original commit message from CVS: * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset): Make sure element is NULL before removing from the bin. 2005-10-07 16:28:24 +0000 Andy Wingo * ChangeLog: * ext/raw1394/gstdv1394src.c: Don't unref the message. Original commit message from CVS: (gst_dv1394src_bus_reset): Don't unref the message. 2005-10-07 16:22:59 +0000 Andy Wingo * ChangeLog: * ext/raw1394/gstdv1394src.c: Post a message when the cable is unplugged. Original commit message from CVS: (gst_dv1394src_bus_reset): Post a message when the cable is unplugged. (gst_dv1394src_create, gst_dv1394src_unlock): Remove some prints. 2005-10-07 15:24:24 +0000 Andy Wingo ext/raw1394/gstdv1394src.c: Make interruptible, so it won't block forever in a read(). Original commit message from CVS: 2005-10-07 Andy Wingo * ext/raw1394/gstdv1394src.c: Make interruptible, so it won't block forever in a read(). 2005-10-07 13:17:53 +0000 Andy Wingo ext/raw1394/gstdv1394src.c: Clean up for style before doing some hacking. The only change should be that the state ch... Original commit message from CVS: 2005-10-07 Andy Wingo * ext/raw1394/gstdv1394src.c: Clean up for style before doing some hacking. The only change should be that the state change stuff was put into basesrc's start() and stop() routines, which coalesces some steps. 2005-10-07 11:30:41 +0000 Tim-Philipp Müller configure.ac: Add check for mmap Original commit message from CVS: * configure.ac: Add check for mmap * gst/debug/Makefile.am: Only compile efence plugin on systems that have mmap. 2005-10-05 16:36:57 +0000 Christian Schaller * gst-plugins-good.spec.in: add latest files Original commit message from CVS: add latest files 2005-10-05 11:38:29 +0000 Tim-Philipp Müller gst/debug/: Port progressreport, navseek, navigationtest, testsink and breakmydata. Original commit message from CVS: * gst/debug/Makefile.am: * gst/debug/breakmydata.c: * gst/debug/gstdebug.c: * gst/debug/gstnavigationtest.c: * gst/debug/gstnavseek.c: * gst/debug/gstnavseek.h: * gst/debug/progressreport.c: * gst/debug/testplugin.c: Port progressreport, navseek, navigationtest, testsink and breakmydata. 2005-10-05 11:15:23 +0000 Edward Hervey ext/dv/gstdvdemux.c: Fixes for better conversion Original commit message from CVS: * ext/dv/gstdvdemux.c: (gst_dvdemux_src_convert), (gst_dvdemux_src_query): Fixes for better conversion 2005-10-04 17:58:40 +0000 Michael Smith gst/autodetect/: Set state of elements to NULL before removing from bins. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), (gst_auto_audio_sink_find_best), (gst_auto_audio_sink_detect): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): Set state of elements to NULL before removing from bins. Set state of test element to NULL if we failed to move it to READY 2005-10-04 17:44:43 +0000 Edward Hervey ext/dv/: Added DEFAULT <==> BYTES, TIME conversions on srcpad, Original commit message from CVS: * ext/dv/Makefile.am: * ext/dv/gstdvdemux.c: (gst_dvdemux_src_query), (gst_dvdemux_src_conver): Added DEFAULT <==> BYTES, TIME conversions on srcpad, Corrected the query function for position so it doesn't forget what format was asked, and calls the conversion functions on the correct pad. 2005-10-03 17:59:18 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: back to head Original commit message from CVS: back to head === release 0.9.3 === 2005-10-03 17:48:57 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * README: * configure.ac: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: release time Original commit message from CVS: release time 2005-10-02 23:08:35 +0000 Andy Wingo ext/flac/gstflacdec.c (gst_flacdec_write): Deal with pad_alloc error returns. Original commit message from CVS: 2005-10-03 Andy Wingo * ext/flac/gstflacdec.c (gst_flacdec_write): Deal with pad_alloc error returns. 2005-10-02 15:33:14 +0000 Andy Wingo configure.ac (GST_PLUGIN_LDFLAGS): Change to be like -base. Original commit message from CVS: 2005-10-02 Andy Wingo * configure.ac (GST_PLUGIN_LDFLAGS): Change to be like -base. * ext/flac/gstflacenc.c: Ported to 0.9. * ext/flac/gstflacdec.c (gst_flacdec_loop): Handle errors better. * ext/flac/Makefile.am: Add the GST_PLUGINS_BASE cflags and libs, and link to gsttagedit. Enable flacenc. * ext/flac/gstflacdec.c: Re-enable tag reading. 2005-09-30 16:36:49 +0000 Wim Taymans gst/rtp/: Various class and caps fixes from Andre Magalhaes (andrunko) Original commit message from CVS: * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_setcaps): * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtph263penc.c: * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), (gst_rtpmp4venc_set_property): * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_handle_buffer): Various class and caps fixes from Andre Magalhaes (andrunko) 2005-09-29 13:08:41 +0000 Wim Taymans gst/level/level-example.c: Update for new bus API. Original commit message from CVS: * gst/level/level-example.c: (main): Update for new bus API. 2005-09-28 13:38:02 +0000 Wim Taymans gst/qtdemux/qtdemux.c: No need to take stream lock here. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): No need to take stream lock here. 2005-09-28 09:45:00 +0000 Tim-Philipp Müller configure.ac: Fix unexpanded autoconf macro GST_DOC, which has been renamed to GST_DOCBOOK_CHECK (see common/m4/gst-d... Original commit message from CVS: * configure.ac: Fix unexpanded autoconf macro GST_DOC, which has been renamed to GST_DOCBOOK_CHECK (see common/m4/gst-doc.m4) (#316202). 2005-09-27 15:12:45 +0000 Tim-Philipp Müller sys/oss/gstosssink.c: Fix playback of mono streams (bytes_per_sample should be set from the sample width and the numb... Original commit message from CVS: * sys/oss/gstosssink.c: (gst_oss_sink_prepare): Fix playback of mono streams (bytes_per_sample should be set from the sample width and the number of channels negotiated, and not just be set to 4) (#317338) 2005-09-26 14:59:10 +0000 Christian Schaller * gst-plugins-good.spec.in: add auparse to plugins list Original commit message from CVS: add auparse to plugins list 2005-09-26 14:42:09 +0000 Wim Taymans gst/rtp/gstrtpmpaenc.c: Set buffer duration correctly. Original commit message from CVS: * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_flush), (gst_rtpmpaenc_handle_buffer): Set buffer duration correctly. 2005-09-26 13:06:27 +0000 Tim-Philipp Müller gst/avi/gstavidemux.c: Don't crash when encountering a stream with an unknown fourcc or codec id. Instead, create a p... Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_base_init), (gst_avi_demux_class_init), (gst_avi_demux_parse_stream), (gst_avi_demux_change_state): Don't crash when encountering a stream with an unknown fourcc or codec id. Instead, create a pad of type video/x-avi-unknown or audio/x-avi-unknown, which as a side-effect also results in less confusing error messages in players ('no decoder' vs. 'no streams'); minor fixes to state change function and class_init function. 2005-09-24 13:34:46 +0000 Thomas Vander Stichele * check/Makefile.am: * tests/check/Makefile.am: set up plugin paths properly Original commit message from CVS: set up plugin paths properly 2005-09-24 13:10:52 +0000 Wim Taymans gst/autodetect/: These are sinks. Original commit message from CVS: * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_init): * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_init): These are sinks. 2005-09-24 12:10:02 +0000 Thomas Vander Stichele check/elements/level.c: fix test for new GstClockTime use Original commit message from CVS: * check/elements/level.c: (GST_START_TEST): fix test for new GstClockTime use * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), (gst_level_transform_ip): * gst/level/gstlevel.h: fix up the decay peak, ensuring the decay peak is never lower than the peak for that interval 2005-09-23 18:23:04 +0000 Thomas Vander Stichele * ChangeLog: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-rtp.xml: * gst/level/gstlevel.c: updating docs Original commit message from CVS: updating docs 2005-09-23 18:15:51 +0000 Thomas Vander Stichele * ChangeLog: * Makefile.am: * check/elements/level.c: * common: * gst/level/Makefile.am: * gst/level/gstlevel.c: * gst/level/gstlevel.h: * gst/level/level-example.c: * tests/check/elements/level.c: convert to using GstClockTime for all time values, finally. Original commit message from CVS: convert to using GstClockTime for all time values, finally. 2005-09-23 15:01:00 +0000 Thomas Vander Stichele * gst/goom/Makefile.am: fix build of goom Original commit message from CVS: fix build of goom 2005-09-23 14:20:01 +0000 Thomas Vander Stichele * common: * gst/level/gstlevel.c: we handle more than two channels Original commit message from CVS: we handle more than two channels 2005-09-23 04:23:00 +0000 Thomas Vander Stichele * ChangeLog: * configure.ac: * ext/cairo/Makefile.am: * ext/dv/Makefile.am: * ext/esd/Makefile.am: * ext/flac/Makefile.am: * ext/gconf/Makefile.am: * ext/gdk_pixbuf/Makefile.am: * ext/jpeg/Makefile.am: * ext/ladspa/Makefile.am: * ext/libcaca/Makefile.am: * ext/libmng/Makefile.am: * ext/libpng/Makefile.am: * ext/mikmod/Makefile.am: * ext/pango/Makefile.am: * ext/raw1394/Makefile.am: * ext/shout2/Makefile.am: * ext/speex/Makefile.am: * gst/alpha/Makefile.am: * gst/auparse/Makefile.am: * gst/auparse/gstauparse.c: * gst/autodetect/Makefile.am: * gst/avi/Makefile.am: * gst/cutter/Makefile.am: * gst/debug/Makefile.am: * gst/effectv/Makefile.am: * gst/flx/Makefile.am: * gst/goom/Makefile.am: * gst/law/Makefile.am: * gst/matroska/Makefile.am: * gst/median/Makefile.am: * gst/monoscope/Makefile.am: * gst/multipart/Makefile.am: * gst/oldcore/Makefile.am: * gst/rtp/Makefile.am: * gst/rtsp/Makefile.am: * gst/smoothwave/Makefile.am: * gst/smpte/Makefile.am: * gst/videobox/Makefile.am: * gst/videofilter/Makefile.am: * gst/videomixer/Makefile.am: * gst/wavenc/Makefile.am: * gst/wavparse/Makefile.am: * sys/oss/Makefile.am: * sys/osxaudio/Makefile.am: fix build and use of GST_LIBS Original commit message from CVS: fix build and use of GST_LIBS 2005-09-22 22:38:48 +0000 Edgard Lima * ChangeLog: * PORTED_09: * configure.ac: * gst/auparse/gstauparse.c: * gst/auparse/gstauparse.h: Auparse ported to 0.9. Tested with filesrc ! auparse ! osssink and alsasink Original commit message from CVS: Auparse ported to 0.9. Tested with filesrc ! auparse ! osssink and alsasink 2005-09-22 14:13:36 +0000 Wim Taymans gst/rtp/: Use is_filled to both check MTU and max-ptime of base class. Original commit message from CVS: * gst/rtp/TODO: * gst/rtp/gstrtpdec.c: (gst_rtpdec_getcaps): * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), (gst_rtpmp4venc_set_property): * gst/rtp/gstrtpmp4venc.h: * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_handle_buffer): * gst/rtp/gstrtpmpaenc.h: Use is_filled to both check MTU and max-ptime of base class. 2005-09-22 11:28:23 +0000 Wim Taymans gst/rtp/gstrtpmp4venc.c: Don't fragment packets with multiple frames. Original commit message from CVS: * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), (gst_rtpmp4venc_set_property): Don't fragment packets with multiple frames. 2005-09-22 10:39:11 +0000 Wim Taymans gst/rtp/: Remove g_print. Original commit message from CVS: * gst/rtp/TODO: * gst/rtp/gstrtpmp4vdec.c: (gst_rtpmp4vdec_setcaps): * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_class_init), (gst_rtpmp4venc_init), (gst_rtpmp4venc_parse_data), (gst_rtpmp4venc_handle_buffer), (gst_rtpmp4venc_set_property), (gst_rtpmp4venc_get_property): * gst/rtp/gstrtpmp4venc.h: Remove g_print. Update TODO Make payload encoder a bit smarter and more correct with timestamps. Added option in payloader to include config string in-band. 2005-09-21 19:41:45 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: Strip spaces for key/value pairs. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send): Strip spaces for key/value pairs. 2005-09-21 17:53:26 +0000 Wim Taymans gst/rtsp/gstrtspsrc.c: More SDP parsing and caps setting. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_send), (gst_rtspsrc_change_state): More SDP parsing and caps setting. Do NO_PREROLL differently. add pads only after negotiated. * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), (gst_udpsrc_getcaps): Implement the getcaps function. 2005-09-21 17:50:29 +0000 Wim Taymans gst/rtp/gstrtpamrdec.c: Handle multiple AMr packets per payload. Handle CRC and parse ILL/ILP. Original commit message from CVS: * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): Handle multiple AMr packets per payload. Handle CRC and parse ILL/ILP. * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_setcaps): Make caps params strings for easy SDP mapping. * gst/rtp/gstrtpdec.c: (gst_rtpdec_init), (gst_rtpdec_getcaps): Handle capsnego better. * gst/rtp/gstrtpmp4vdec.c: (gst_rtpmp4vdec_setcaps): * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_new_caps): Generate and parse config string in the caps. 2005-09-21 12:19:24 +0000 Wim Taymans gst/rtp/README: Update README Original commit message from CVS: * gst/rtp/README: Update README * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_sink_setcaps): Make extra params as strings. * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state), (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send): Make state change return NO_PREROLL as this is a live source. * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): Don't unref old caps when NULL. 2005-09-20 17:35:11 +0000 Wim Taymans gst/rtsp/: Add URI handler. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_type), (gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send), (gst_rtspsrc_open), (gst_rtspsrc_uri_get_type), (gst_rtspsrc_uri_get_protocols), (gst_rtspsrc_uri_get_uri), (gst_rtspsrc_uri_set_uri), (gst_rtspsrc_uri_handler_init): * gst/rtsp/sdpmessage.c: (sdp_media_get_format): * gst/rtsp/sdpmessage.h: Add URI handler. Parse SDP and create caps. 2005-09-20 17:19:43 +0000 Christian Schaller * gst-plugins-good.spec.in: more spec file fixoring Original commit message from CVS: more spec file fixoring 2005-09-20 17:04:33 +0000 Christian Schaller * gst-plugins-good.spec.in: * gst-plugins.spec.in: fix spec files Original commit message from CVS: fix spec files 2005-09-20 10:51:51 +0000 Thomas Vander Stichele * gst/rtp/README: * gst/rtp/gstrtpamrdec.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrenc.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pdec.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263penc.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpmp4vdec.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4venc.c: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadec.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpaenc.c: * gst/rtp/gstrtpmpapay.c: don't use underscores Original commit message from CVS: don't use underscores 2005-09-20 07:30:31 +0000 Stefan Kost gst/alpha/gstalpha.c: fix element description Original commit message from CVS: * gst/alpha/gstalpha.c: fix element description 2005-09-19 17:57:06 +0000 Thomas Vander Stichele * docs/plugins/gst-plugins-good-plugins.prerequisites: prereqs as well Original commit message from CVS: prereqs as well 2005-09-19 17:53:42 +0000 Thomas Vander Stichele * docs/plugins/.gitignore: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.interfaces: * docs/plugins/gst-plugins-good-plugins.signals: commit result of scanobj step Original commit message from CVS: commit result of scanobj step 2005-09-19 17:03:55 +0000 Wim Taymans gst/rtp/gstrtph263pdec.c: Don't check payload for now. Original commit message from CVS: * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_chain): Don't check payload for now. 2005-09-19 16:43:56 +0000 Thomas Vander Stichele * Makefile.am: add check-valgrind target Original commit message from CVS: add check-valgrind target 2005-09-19 16:26:30 +0000 Wim Taymans gst/wavparse/gstwavparse.*: Fix wavparse some more. Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_reset), (gst_wavparse_init), (gst_wavparse_parse_file_header), (gst_wavparse_stream_init), (gst_wavparse_handle_seek), (gst_wavparse_stream_headers), (gst_wavparse_stream_data), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event), (gst_wavparse_change_state): * gst/wavparse/gstwavparse.h: Fix wavparse some more. 2005-09-19 11:48:13 +0000 Wim Taymans check/elements/level.c: Fix for bus API change. Original commit message from CVS: * check/elements/level.c: (GST_START_TEST): Fix for bus API change. 2005-09-19 11:38:10 +0000 Wim Taymans gst/level/level-example.c: Fix for new bus API. Original commit message from CVS: * gst/level/level-example.c: (main): Fix for new bus API. * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): Set caps on pads. 2005-09-19 11:06:05 +0000 Thomas Vander Stichele * gst/debug/Makefile.am: disable flags for unbuilt plugins Original commit message from CVS: disable flags for unbuilt plugins 2005-09-19 08:21:29 +0000 Thomas Vander Stichele * common: * docs/plugins/scanobj-build.stamp: normal builds shouldn't scan gobjects Original commit message from CVS: normal builds shouldn't scan gobjects 2005-09-16 00:38:50 +0000 Thomas Vander Stichele * check/Makefile.am: * common: * tests/check/Makefile.am: remove gst-register Original commit message from CVS: remove gst-register 2005-09-15 13:57:56 +0000 Wim Taymans * ChangeLog: * common: * gst/rtp/Makefile.am: * gst/rtp/README: * gst/rtp/gstrtp.c: * gst/rtp/gstrtpamrdec.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrenc.c: * gst/rtp/gstrtpamrenc.h: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmdepay.h: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmenc.h: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmparse.h: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtpgsmpay.h: * gst/rtp/gstrtph263pdec.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263penc.c: * gst/rtp/gstrtph263penc.h: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtpmp4vdec.c: * gst/rtp/gstrtpmp4vdepay.c: * gst/rtp/gstrtpmp4venc.c: * gst/rtp/gstrtpmp4venc.h: * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadec.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpaenc.c: * gst/rtp/gstrtpmpaenc.h: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpapay.h: Updates to payloader/depayloaders, make payloaders use the base classes. Original commit message from CVS: Updates to payloader/depayloaders, make payloaders use the base classes. Updated README with suggested RTP caps and how to convert to/from SDP. Added config descriptor in mp4v payloader. 2005-09-15 10:47:58 +0000 Andy Wingo gst/autodetect/gstautoaudiosink.c (gst_auto_audio_sink_find_best): gst/autodetect/gstautovideosink.c Original commit message from CVS: 2005-09-15 Andy Wingo * gst/autodetect/gstautoaudiosink.c (gst_auto_audio_sink_find_best): * gst/autodetect/gstautovideosink.c (gst_auto_video_sink_find_best): Update for new registry API. 2005-09-14 20:51:47 +0000 Thomas Vander Stichele common/: a simple py script to generate valid xml from a C example probably also need to strip an MIT license when we... Original commit message from CVS: * common/c-to-xml.py: * common/gtk-doc-plugins.mak: a simple py script to generate valid xml from a C example probably also need to strip an MIT license when we decide * docs/plugins/Makefile.am: * gst/level/Makefile.am: * gst/level/gstlevel.c: (gst_level_init): * gst/level/level-example.c: (message_handler), (main): add an example to level that will show up in the docs * gst/rtp/TODO: add a note for the future 2005-09-14 11:44:11 +0000 Michael Smith gst/wavenc/gstwavenc.c: Actually define the debug object being used in wavenc. Fixes #316205 Original commit message from CVS: * gst/wavenc/gstwavenc.c: (gst_wavenc_class_init): Actually define the debug object being used in wavenc. Fixes #316205 2005-09-14 11:23:44 +0000 Michael Smith * ChangeLog: * gst/smpte/Makefile.am: Link smpte plugin against GST_BASE_LIBS, to get libgstbase; needed to build on win32 as this plugin uses collectpads ... Original commit message from CVS: Link smpte plugin against GST_BASE_LIBS, to get libgstbase; needed to build on win32 as this plugin uses collectpads (bug 316204) 2005-09-12 16:37:05 +0000 Jan Schmidt * ChangeLog: Fix up bogus ChangeLog entry Original commit message from CVS: Fix up bogus ChangeLog entry 2005-09-12 16:14:48 +0000 Andy Wingo autogen.sh (package): Now type 'make' to build gst-plugins-good. Original commit message from CVS: 2005-09-12 Andy Wingo * autogen.sh (package): Now type 'make' to build gst-plugins-good. 2005-09-11 17:52:09 +0000 Thomas Vander Stichele * common: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-fdsrc.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-wavparse.xml: add source module to docs; reinspect Original commit message from CVS: add source module to docs; reinspect 2005-09-09 17:56:43 +0000 Jan Schmidt Move fdsrc back into gstreamer core elements. Original commit message from CVS: * configure.ac: * gst/fdsrc/Makefile.am: * gst/fdsrc/gstfdsrc.c: * gst/fdsrc/gstfdsrc.h: Move fdsrc back into gstreamer core elements. * gst/level/gstlevel.c: (gst_level_class_init), (gst_level_transform_ip): * gst/videobox/gstvideobox.c: (gst_video_box_set_property): Basetransform changes. 2005-09-09 16:11:48 +0000 Thomas Vander Stichele * ChangeLog: * ext/jpeg/gstsmokeenc.c: * ext/jpeg/smokecodec.c: fix compiler warnings Original commit message from CVS: fix compiler warnings 2005-09-09 11:09:49 +0000 Thomas Vander Stichele gst-plugins-good.spec.in: spec file fixes Original commit message from CVS: * gst-plugins-good.spec.in: spec file fixes * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init), (gst_multiudpsink_render), (gst_multiudpsink_add), (gst_multiudpsink_clear): it actually helps to actually stream if we hook up the add signal to an actual implementation * gst/udp/gstudpsrc.c: (gst_udpsrc_start): some debugging 2005-09-08 16:58:40 +0000 Flavio Oliveira * ext/jpeg/Makefile.am: * ext/jpeg/gstjpeg.c: * ext/jpeg/gstjpegenc.c: * ext/jpeg/gstsmokeenc.c: jpgenc ported to GSTreamer 0.9 Original commit message from CVS: jpgenc ported to GSTreamer 0.9 2005-09-08 16:26:17 +0000 Flavio Oliveira * ChangeLog: jpegenc ported to GStreamer 0.9 Original commit message from CVS: jpegenc ported to GStreamer 0.9 2005-09-07 13:49:37 +0000 Stefan Kost ext/: gsttaginterface.h -> gsttagsetter.h Original commit message from CVS: * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: * ext/flac/gstflactag.c: * ext/speex/gstspeexenc.c: gsttaginterface.h -> gsttagsetter.h 2005-09-06 23:30:03 +0000 Jan Schmidt Port to 0.9 and re-enable efence plugin. Original commit message from CVS: * configure.ac: * gst/debug/Makefile.am: * gst/debug/efence.c: (gst_efence_class_init), (gst_efence_init), (gst_efence_chain), (gst_efence_buffer_alloc), (plugin_init), (gst_fenced_buffer_finalize), (gst_fenced_buffer_copy), (gst_fenced_buffer_alloc), (gst_fenced_buffer_class_init), (gst_fenced_buffer_init), (gst_fenced_buffer_get_type): Port to 0.9 and re-enable efence plugin. 2005-09-06 21:31:25 +0000 Tim-Philipp Müller ext/flac/gstflacdec.*: Add support for flac files with 24/32 bits per sample; and misc. minor clean-ups. Seeking is s... Original commit message from CVS: * ext/flac/gstflacdec.c: (flac_caps_factory), (raw_caps_factory), (gst_flacdec_write), (gst_flacdec_convert_src): * ext/flac/gstflacdec.h: Add support for flac files with 24/32 bits per sample; and misc. minor clean-ups. Seeking is still partly broken (for me at least). 2005-09-06 15:50:58 +0000 Wim Taymans gst/rtp/: Added mpeg4 video payload encoder/decoder. Original commit message from CVS: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4vdec.c: (gst_rtpmp4vdec_get_type), (gst_rtpmp4vdec_base_init), (gst_rtpmp4vdec_class_init), (gst_rtpmp4vdec_init), (gst_rtpmp4vdec_setcaps), (gst_rtpmp4vdec_chain), (gst_rtpmp4vdec_set_property), (gst_rtpmp4vdec_get_property), (gst_rtpmp4vdec_change_state), (gst_rtpmp4vdec_plugin_init): * gst/rtp/gstrtpmp4vdec.h: * gst/rtp/gstrtpmp4venc.c: (gst_rtpmp4venc_get_type), (gst_rtpmp4venc_base_init), (gst_rtpmp4venc_class_init), (gst_rtpmp4venc_init), (gst_rtpmp4venc_setcaps), (gst_rtpmp4venc_flush), (gst_rtpmp4venc_chain), (gst_rtpmp4venc_set_property), (gst_rtpmp4venc_get_property), (gst_rtpmp4venc_change_state), (gst_rtpmp4venc_plugin_init): * gst/rtp/gstrtpmp4venc.h: * gst/rtp/gstrtpmpadec.c: (gst_rtpmpadec_chain): * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_flush): Added mpeg4 video payload encoder/decoder. Added some docs in mpa payloader. 2005-09-06 14:06:47 +0000 Thomas Vander Stichele * configure.ac: back to HEAD Original commit message from CVS: back to HEAD === release 0.9.1 === 2005-09-06 14:05:33 +0000 Thomas Vander Stichele * ChangeLog: * NEWS: * README: * RELEASE: * autogen.sh: * common: * configure.ac: releasing 0.9.2 Original commit message from CVS: releasing 0.9.2 2005-09-05 17:20:28 +0000 Jan Schmidt * gst/videocrop/gstvideocrop.c: * sys/v4l2/gstv4l2element.c: * sys/v4l2/gstv4l2src.c: Fix up all the state change functions. Original commit message from CVS: Fix up all the state change functions. 2005-09-05 16:28:16 +0000 Andy Wingo ext/dv/gstdvdemux.c (gst_dvdemux_chain): Move the pad adding here from the state change handler, so we fire signals w... Original commit message from CVS: 2005-09-05 Andy Wingo * ext/dv/gstdvdemux.c (gst_dvdemux_chain): Move the pad adding here from the state change handler, so we fire signals without holding the state lock. 2005-09-05 15:10:18 +0000 Thomas Vander Stichele * gst/qtdemux/qtdemux.c: cleaning up bad Original commit message from CVS: cleaning up bad 2005-09-05 13:18:42 +0000 Thomas Vander Stichele * docs/.gitignore: * docs/plugins/.gitignore: maintenance commits Original commit message from CVS: maintenance commits 2005-09-04 15:09:33 +0000 Thomas Vander Stichele * configure.ac: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/inspect-build.stamp: * docs/plugins/inspect.stamp: * docs/plugins/inspect/plugin-1394.xml: * docs/plugins/inspect/plugin-aasink.xml: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-alpha.xml: * docs/plugins/inspect/plugin-autodetect.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-cacasink.xml: * docs/plugins/inspect/plugin-dv.xml: * docs/plugins/inspect/plugin-effectv.xml: * docs/plugins/inspect/plugin-esdsink.xml: * docs/plugins/inspect/plugin-fdsrc.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-gconfelements.xml: * docs/plugins/inspect/plugin-goom.xml: * docs/plugins/inspect/plugin-jpeg.xml: * docs/plugins/inspect/plugin-level.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-ossaudio.xml: * docs/plugins/inspect/plugin-png.xml: * docs/plugins/inspect/plugin-rtp.xml: * docs/plugins/inspect/plugin-rtsp.xml: * docs/plugins/inspect/plugin-shout2send.xml: * docs/plugins/inspect/plugin-smpte.xml: * docs/plugins/inspect/plugin-speex.xml: * docs/plugins/inspect/plugin-udp.xml: * docs/plugins/inspect/plugin-videobox.xml: * docs/plugins/inspect/plugin-videoflip.xml: * docs/plugins/inspect/plugin-wavparse.xml: distcheck fixes Original commit message from CVS: distcheck fixes 2005-09-04 11:50:47 +0000 Thomas Vander Stichele * Makefile.am: * autogen.sh: * common: * docs/plugins/Makefile.am: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: fix distcheck Original commit message from CVS: fix distcheck 2005-09-02 15:56:52 +0000 Thomas Vander Stichele * gst-plugins-good.spec.in: various spec fixes Original commit message from CVS: various spec fixes 2005-09-02 15:44:50 +0000 Andy Wingo * check/elements/level.c: * examples/gstplay/player.c: * examples/stats/mp2ogg.c: * ext/aalib/gstaasink.c: * ext/cairo/gsttextoverlay.c: * ext/dv/gstdvdec.c: * ext/dv/gstdvdemux.c: * ext/esd/esdmon.c: * ext/flac/gstflacdec.c: * ext/flac/gstflacenc.c: * ext/flac/gstflactag.c: * ext/gconf/gstgconfaudiosink.c: * ext/gconf/gstgconfvideosink.c: * ext/gdk_pixbuf/gstgdkanimation.c: * ext/jpeg/gstjpegdec.c: * ext/jpeg/gstjpegenc.c: * ext/ladspa/gstsignalprocessor.c: * ext/libcaca/gstcacasink.c: * ext/libmng/gstmngdec.c: * ext/mikmod/gstmikmod.c: * ext/pango/gsttextoverlay.c: * ext/raw1394/gstdv1394src.c: * ext/shout2/gstshout2.c: * ext/speex/gstspeexdec.c: * ext/speex/gstspeexenc.c: * gst/alpha/gstalpha.c: * gst/auparse/gstauparse.c: * gst/autodetect/gstautoaudiosink.c: * gst/autodetect/gstautovideosink.c: * gst/avi/gstavidemux.c: * gst/avi/gstavimux.c: * gst/debug/breakmydata.c: * gst/debug/gstnavigationtest.c: * gst/effectv/gstquark.c: * gst/fdsrc/gstfdsrc.c: * gst/flx/gstflxdec.c: * gst/goom/gstgoom.c: * gst/matroska/ebml-read.c: * gst/matroska/ebml-write.c: * gst/matroska/matroska-demux.c: * gst/matroska/matroska-mux.c: * gst/multipart/multipartdemux.c: * gst/multipart/multipartmux.c: * gst/oldcore/gstmd5sink.c: * gst/oldcore/gstmultifilesrc.c: * gst/oldcore/gstpipefilter.c: * gst/rtp/gstrtpL16depay.c: * gst/rtp/gstrtpL16enc.c: * gst/rtp/gstrtpL16parse.c: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpamrdec.c: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrenc.c: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpdec.c: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmenc.c: * gst/rtp/gstrtpgsmparse.c: * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pdec.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263penc.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtpmpadec.c: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpaenc.c: * gst/rtp/gstrtpmpapay.c: * gst/rtsp/gstrtspsrc.c: * gst/smoothwave/gstsmoothwave.c: * gst/udp/gstdynudpsink.c: * gst/udp/gstmultiudpsink.c: * gst/videomixer/videomixer.c: * gst/wavenc/gstwavenc.c: * gst/wavparse/gstwavparse.c: * po/af.po: * po/az.po: * po/cs.po: * po/en_GB.po: * po/hu.po: * po/it.po: * po/nb.po: * po/nl.po: * po/or.po: * po/sq.po: * po/sr.po: * po/sv.po: * po/uk.po: * po/vi.po: * sys/oss/gstossmixerelement.c: * sys/osxaudio/gstosxaudioelement.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosrc.c: * tests/check/elements/level.c: All plugins updated for element state changes. Original commit message from CVS: 2005-09-02 Andy Wingo * All plugins updated for element state changes. 2005-09-01 21:24:57 +0000 Thomas Vander Stichele * ext/aalib/Makefile.am: fix build after cleaning up my vomit Original commit message from CVS: fix build after cleaning up my vomit 2005-09-01 21:23:09 +0000 Thomas Vander Stichele * ext/aalib/Makefile.am: fix build after cleaning up my vomit Original commit message from CVS: fix build after cleaning up my vomit 2005-09-01 21:20:45 +0000 Thomas Vander Stichele * gst/smpte/Makefile.am: fix build after cleaning up my vomit Original commit message from CVS: fix build after cleaning up my vomit 2005-09-01 21:15:30 +0000 Thomas Vander Stichele * gst/smpte/Makefile.am: fix build after cleaning up my vomit Original commit message from CVS: fix build after cleaning up my vomit 2005-09-01 20:23:22 +0000 Thomas Vander Stichele * ChangeLog: * Makefile.am: * check/.gitignore: * check/Makefile.am: * check/elements/.gitignore: * check/elements/level.c: * common: * configure.ac: * gst/level/gstlevel.c: * gst/level/gstlevel.h: * tests/check/.gitignore: * tests/check/Makefile.am: * tests/check/elements/.gitignore: * tests/check/elements/level.c: Andrewio Patrickoforus Wingonymus - 5 additional tests for your sins Original commit message from CVS: Andrewio Patrickoforus Wingonymus - 5 additional tests for your sins Add a regression test for level and fix a casting bug that made the additional channels turn out wrong 2005-09-01 17:55:14 +0000 Thomas Vander Stichele add docs to build Original commit message from CVS: * Makefile.am: * configure.ac: add docs to build * common/plugins.xsl: wrap Description into a refsect2 * docs/Makefile.am: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * gst/goom/Makefile.am: * gst/goom/gstgoom.c: (gst_goom_get_type), (gst_goom_base_init), (gst_goom_class_init), (gst_goom_init), (gst_goom_dispose), (gst_goom_sink_setcaps), (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_event), (gst_goom_chain), (gst_goom_change_state): * gst/goom/gstgoom.h: GstGOOM -> GstGoom add an example launch line * gst/level/gstlevel.h: * gst/monoscope/gstmonoscope.c: cleanups 2005-08-31 16:28:05 +0000 Thomas Vander Stichele * gst/dvdlpcmdec/.gitignore: * gst/dvdlpcmdec/Makefile.am: * gst/dvdlpcmdec/gstdvdlpcmdec.c: * gst/dvdlpcmdec/gstdvdlpcmdec.h: remove dvdlpcmdec, it's dvd stuff Original commit message from CVS: remove dvdlpcmdec, it's dvd stuff 2005-08-30 19:41:12 +0000 Thomas Vander Stichele * Makefile.am: * gst-libs/gst/gettext.h: * gst-libs/gst/gst-i18n-plugin.h: add some i18n headers Original commit message from CVS: add some i18n headers 2005-08-30 19:24:37 +0000 Thomas Vander Stichele * docs/plugins/.gitignore: ignore more Original commit message from CVS: ignore more 2005-08-30 19:24:03 +0000 Thomas Vander Stichele * docs/Makefile.am: Makefile.am Original commit message from CVS: Makefile.am 2005-08-30 19:20:02 +0000 Thomas Vander Stichele * docs/upload.mak: * docs/version.entities.in: commit new stuff Original commit message from CVS: commit new stuff 2005-08-30 19:01:18 +0000 Thomas Vander Stichele * ChangeLog: * common: * configure.ac: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.types: document elements and plugins. Shazam ! Original commit message from CVS: document elements and plugins. Shazam ! 2005-08-30 17:37:00 +0000 Thomas Vander Stichele * .gitignore: * COPYING: * RELEASE: * gst-plugins-good.spec.in: add some files Original commit message from CVS: add some files gst-plugins-good-0.10.31/tests/0000755000175000017500000000000011720565323013225 500000000000000gst-plugins-good-0.10.31/tests/Makefile.am0000644000175000017500000000047311671175354015213 00000000000000if HAVE_GST_CHECK SUBDIRS_CHECK = check files else SUBDIRS_CHECK = endif if USE_X SUBDIRS_ICLES = icles else SUBDIRS_ICLES = endif if BUILD_EXAMPLES SUBDIR_EXAMPLES = examples else SUBDIR_EXAMPLES = endif SUBDIRS = $(SUBDIRS_CHECK) $(SUBDIRS_ICLES) $(SUBDIR_EXAMPLES) DIST_SUBDIRS = check icles examples files gst-plugins-good-0.10.31/tests/check/0000755000175000017500000000000011720565323014302 500000000000000gst-plugins-good-0.10.31/tests/check/pipelines/0000755000175000017500000000000011720565323016272 500000000000000gst-plugins-good-0.10.31/tests/check/pipelines/simple-launch-lines.c0000644000175000017500000002326611671175355022247 00000000000000/* GStreamer * Copyright (C) 2005 Andy Wingo * * simple_launch_lines.c: Unit test for simple pipelines * * 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 #ifndef GST_DISABLE_PARSE static GstElement * setup_pipeline (const gchar * pipe_descr) { GstElement *pipeline; pipeline = gst_parse_launch (pipe_descr, NULL); g_return_val_if_fail (GST_IS_PIPELINE (pipeline), NULL); return pipeline; } /* * run_pipeline: * @pipe: the pipeline to run * @desc: the description for use in messages * @events: is a mask of expected events * @tevent: is the expected terminal event. * * the poll call will time out after half a second. */ static void run_pipeline (GstElement * pipe, const gchar * descr, GstMessageType events, GstMessageType tevent, GstState target_state) { GstBus *bus; GstMessage *message; GstMessageType revent; GstStateChangeReturn ret; g_assert (pipe); bus = gst_element_get_bus (pipe); g_assert (bus); fail_if (gst_element_set_state (pipe, target_state) == GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to playing", descr); ret = gst_element_get_state (pipe, NULL, NULL, 10 * GST_SECOND); if (ret == GST_STATE_CHANGE_ASYNC) { g_critical ("Pipeline '%s' failed to go to PAUSED fast enough", descr); goto done; } else if ((ret != GST_STATE_CHANGE_SUCCESS) && (ret != GST_STATE_CHANGE_NO_PREROLL)) { g_critical ("Pipeline '%s' failed to go into PAUSED state (%s)", descr, gst_element_state_change_return_get_name (ret)); goto done; } while (1) { message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2); /* always have to pop the message before getting back into poll */ if (message) { revent = GST_MESSAGE_TYPE (message); gst_message_unref (message); } else { revent = GST_MESSAGE_UNKNOWN; } if (revent == tevent) { break; } else if (revent == GST_MESSAGE_UNKNOWN) { g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s", tevent, descr); break; } else if (revent & events) { continue; } g_critical ("Unexpected message received of type %d, '%s', looking for %d: %s", revent, gst_message_type_get_name (revent), tevent, descr); } done: fail_if (gst_element_set_state (pipe, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to NULL", descr); gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); gst_object_unref (pipe); gst_bus_set_flushing (bus, TRUE); gst_object_unref (bus); } GST_START_TEST (test_rtp_payloaders) { const gchar *s; /* FIXME: going to playing would be nice, but thet leads to lot of failure */ GstState target_state = GST_STATE_PAUSED; /* we use is-live here to avoid preroll */ #define PIPELINE_STRING(bufcount, bufsize, pl, dpl) "fakesrc is-live=true num-buffers=" bufcount " filltype=2 sizetype=2 sizemax=" bufsize " ! " pl " ! " dpl " ! fakesink" #define DEFAULT_BUFCOUNT "5" #define DEFAULT_BUFSIZE "16" s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpilbcpay", "rtpilbcdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpgsmpay", "rtpgsmdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); /* This one needs a bit different buffer size than others or it doesn't work. */ s = PIPELINE_STRING (DEFAULT_BUFCOUNT, "52", "rtpamrpay", "rtpamrdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtppcmapay", "rtppcmadepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtppcmupay", "rtppcmudepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmpapay", "rtpmpadepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtph263ppay", "rtph263pdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtph263pay", "rtph263depay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtph264pay", "rtph264depay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpL16pay", "rtpL16depay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmp2tpay", "rtpmp2tdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmp4vpay", "rtpmp4vdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpmp4gpay", "rtpmp4gdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); /* Cannot be tested with fakesrc becouse speex payloader requires a valid header?! */ /* s = PIPELINE_STRING(DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpspeexpay", "rtpspeexdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); */ s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtptheorapay", "rtptheoradepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = PIPELINE_STRING (DEFAULT_BUFCOUNT, DEFAULT_BUFSIZE, "rtpvorbispay", "rtpvorbisdepay"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); /*s = FAKESRC " ! ! rtpac3depay ! " FAKESINK */ /*s = FAKESRC " ! ! asteriskh263 ! " FAKESINK; */ /*s = FAKESRC " ! ! rtpmpvdepay ! " FAKESINK; */ /*s = FAKESRC " ! ! rtpmp4adepay ! " FAKESINK; */ /*s = FAKESRC " ! ! rtpsv3vdepay ! " FAKESINK; */ } GST_END_TEST GST_START_TEST (test_video_encoders_decoders) { const gchar *s; GstState target_state = GST_STATE_PLAYING; /* no is-live on the source because we actually want to preroll since * run_pipeline only goes into PAUSED */ #define ENC_DEC_PIPELINE_STRING(bufcount, enc, dec) "videotestsrc num-buffers=" bufcount " ! " enc " ! " dec " ! fakesink" #define DEFAULT_BUFCOUNT "5" s = ENC_DEC_PIPELINE_STRING (DEFAULT_BUFCOUNT, "jpegenc", "jpegdec"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = ENC_DEC_PIPELINE_STRING (DEFAULT_BUFCOUNT, "pngenc", "pngdec"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); s = ENC_DEC_PIPELINE_STRING (DEFAULT_BUFCOUNT, "smokeenc", "smokedec"); run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN, target_state); } GST_END_TEST #endif /* #ifndef GST_DISABLE_PARSE */ static Suite * simple_launch_lines_suite (void) { Suite *s = suite_create ("Pipelines"); TCase *tc_chain = tcase_create ("linear"); /* time out after 60s, not the default 3 */ tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); #ifndef GST_DISABLE_PARSE tcase_add_test (tc_chain, test_rtp_payloaders); tcase_add_test (tc_chain, test_video_encoders_decoders); #endif return s; } int main (int argc, char **argv) { int nf; Suite *s = simple_launch_lines_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/pipelines/tagschecking.c0000644000175000017500000002375411671175355021032 00000000000000/* GStreamer * Copyright (C) 2008 Nokia Corporation. (contact ) * Copyright (C) 2010 Thiago Santos * * 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 static GstTagList *received_tags = NULL; static gboolean bus_handler (GstBus * bus, GstMessage * message, gpointer data) { GMainLoop *loop = (GMainLoop *) data; switch (message->type) { case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR:{ GError *gerror; gchar *debug; gst_message_parse_error (message, &gerror, &debug); gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); g_error_free (gerror); g_free (debug); g_main_loop_quit (loop); break; } case GST_MESSAGE_TAG:{ if (received_tags == NULL) { gst_message_parse_tag (message, &received_tags); } else { GstTagList *tl = NULL, *ntl = NULL; gst_message_parse_tag (message, &tl); if (tl) { ntl = gst_tag_list_merge (received_tags, tl, GST_TAG_MERGE_PREPEND); if (ntl) { GST_LOG ("taglists merged: %" GST_PTR_FORMAT, ntl); gst_tag_list_free (received_tags); received_tags = ntl; } gst_tag_list_free (tl); } } break; } default: break; } return TRUE; } /* * Creates a pipeline in the form: * fakesrc num-buffers=1 ! caps ! muxer ! filesink location=file * * And sets the tags in tag_str into the muxer via tagsetter. */ static void test_mux_tags (const gchar * tag_str, const gchar * caps, const gchar * muxer, const gchar * file) { GstElement *pipeline; GstBus *bus; GMainLoop *loop; GstTagList *sent_tags; GstElement *mux; GstTagSetter *setter; gchar *launch_str; guint bus_watch = 0; GST_DEBUG ("testing xmp muxing on : %s", muxer); launch_str = g_strdup_printf ("fakesrc num-buffers=1 ! %s ! %s name=mux ! " "filesink location=%s name=sink", caps, muxer, file); pipeline = gst_parse_launch (launch_str, NULL); g_free (launch_str); fail_unless (pipeline != NULL); mux = gst_bin_get_by_name (GST_BIN (pipeline), "mux"); fail_unless (mux != NULL); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); gst_element_set_state (pipeline, GST_STATE_READY); setter = GST_TAG_SETTER (mux); fail_unless (setter != NULL); sent_tags = gst_structure_from_string (tag_str, NULL); fail_unless (sent_tags != NULL); gst_tag_setter_merge_tags (setter, sent_tags, GST_TAG_MERGE_REPLACE); gst_tag_list_free (sent_tags); gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_unref (loop); g_object_unref (mux); g_object_unref (pipeline); g_source_remove (bus_watch); } /* * Makes a pipeline in the form: * filesrc location=file ! demuxer ! fakesink * * And gets the tags that are posted on the bus to compare * with the tags in 'tag_str' */ static void test_demux_tags (const gchar * tag_str, const gchar * demuxer, const gchar * file) { GstElement *pipeline; GstBus *bus; GMainLoop *loop; GstTagList *sent_tags; gint i, j, n_recv, n_sent; const gchar *name_sent, *name_recv; const GValue *value_sent, *value_recv; gboolean found; gint comparison; GstElement *demux; gchar *launch_str; guint bus_watch = 0; GST_DEBUG ("testing tags : %s", tag_str); if (received_tags) { gst_tag_list_free (received_tags); received_tags = NULL; } launch_str = g_strdup_printf ("filesrc location=%s ! %s name=demux ! " "fakesink", file, demuxer); pipeline = gst_parse_launch (launch_str, NULL); g_free (launch_str); fail_unless (pipeline != NULL); demux = gst_bin_get_by_name (GST_BIN (pipeline), "demux"); fail_unless (demux != NULL); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); sent_tags = gst_structure_from_string (tag_str, NULL); fail_unless (sent_tags != NULL); gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); GST_DEBUG ("mainloop done : %p", received_tags); /* verify tags */ fail_unless (received_tags != NULL); n_recv = gst_structure_n_fields (received_tags); n_sent = gst_structure_n_fields (sent_tags); fail_unless (n_recv >= n_sent); /* FIXME: compare taglits values */ for (i = 0; i < n_sent; i++) { name_sent = gst_structure_nth_field_name (sent_tags, i); value_sent = gst_structure_get_value (sent_tags, name_sent); found = FALSE; for (j = 0; j < n_recv; j++) { name_recv = gst_structure_nth_field_name (received_tags, j); if (!strcmp (name_sent, name_recv)) { value_recv = gst_structure_get_value (received_tags, name_recv); comparison = gst_value_compare (value_sent, value_recv); if (comparison != GST_VALUE_EQUAL) { gchar *vs = g_strdup_value_contents (value_sent); gchar *vr = g_strdup_value_contents (value_recv); GST_DEBUG ("sent = %s:'%s', recv = %s:'%s'", G_VALUE_TYPE_NAME (value_sent), vs, G_VALUE_TYPE_NAME (value_recv), vr); g_free (vs); g_free (vr); } fail_unless (comparison == GST_VALUE_EQUAL, "tag item %s has been received with different type or value", name_sent); found = TRUE; break; } } fail_unless (found, "tag item %s is lost", name_sent); } gst_tag_list_free (received_tags); received_tags = NULL; gst_tag_list_free (sent_tags); gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_unref (loop); g_object_unref (demux); g_object_unref (pipeline); g_source_remove (bus_watch); } /* * Tests if the muxer/demuxer pair can serialize the tags in 'tag_str' * to a file and recover them correctly. * * 'caps' are used to assure the muxer accepts the fake buffer fakesrc * will send to it. */ static void test_tags (const gchar * tag_str, const gchar * caps, const gchar * muxer, const gchar * demuxer) { gchar *tmpfile; gchar *tmp; tmp = g_strdup_printf ("%s%d", "gst-check-xmp-test-", g_random_int ()); tmpfile = g_build_filename (g_get_tmp_dir (), tmp, NULL); g_free (tmp); GST_DEBUG ("testing tags : %s", tag_str); test_mux_tags (tag_str, caps, muxer, tmpfile); test_demux_tags (tag_str, demuxer, tmpfile); g_free (tmpfile); } #define H264_CAPS "video/x-h264, width=(int)320, height=(int)240," \ " framerate=(fraction)30/1, codec_data=(buffer)" \ "01401592ffe10017674d401592540a0fd8088000000300" \ "8000001e478b175001000468ee3c80, stream-format=(string)avc" #define COMMON_TAGS \ "taglist,title=test_title," \ "artist=test_artist," \ "keywords=\"key1,key2\"," \ "description=test_desc" GST_START_TEST (test_common_tags) { if (!gst_default_registry_check_feature_version ("qtdemux", 0, 10, 23)) { GST_INFO ("Skipping test, qtdemux either not available or too old"); return; } test_tags (COMMON_TAGS, H264_CAPS, "qtmux", "qtdemux"); test_tags (COMMON_TAGS, H264_CAPS, "mp4mux", "qtdemux"); test_tags (COMMON_TAGS, H264_CAPS, "gppmux", "qtdemux"); } GST_END_TEST; #define GEO_LOCATION_TAGS \ "taglist,geo-location-country=Brazil," \ "geo-location-city=\"Campina Grande\"," \ "geo-location-sublocation=Bodocongo," \ "geo-location-latitude=-12.125," \ "geo-location-longitude=56.75," \ "geo-location-elevation=327.5" GST_START_TEST (test_geo_location_tags) { if (!gst_default_registry_check_feature_version ("qtdemux", 0, 10, 23)) { GST_INFO ("Skipping test, qtdemux either not available or too old"); return; } test_tags (GEO_LOCATION_TAGS, H264_CAPS, "qtmux", "qtdemux"); test_tags (GEO_LOCATION_TAGS, H264_CAPS, "mp4mux", "qtdemux"); test_tags (GEO_LOCATION_TAGS, H264_CAPS, "gppmux", "qtdemux"); } GST_END_TEST; #define USER_TAGS \ "taglist,user-rating=(uint)85" GST_START_TEST (test_user_tags) { if (!gst_default_registry_check_feature_version ("qtdemux", 0, 10, 23)) { GST_INFO ("Skipping test, qtdemux either not available or too old"); return; } test_tags (USER_TAGS, H264_CAPS, "qtmux", "qtdemux"); test_tags (USER_TAGS, H264_CAPS, "mp4mux", "qtdemux"); test_tags (USER_TAGS, H264_CAPS, "gppmux", "qtdemux"); } GST_END_TEST; static Suite * metadata_suite (void) { Suite *s = suite_create ("tagschecking"); TCase *tc_chain = tcase_create ("general"); /* time out after 60s, not the default 3 */ tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_common_tags); tcase_add_test (tc_chain, test_geo_location_tags); tcase_add_test (tc_chain, test_user_tags); return s; } int main (int argc, char **argv) { int nf; Suite *s = metadata_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/pipelines/wavenc.c0000644000175000017500000001334611705514141017643 00000000000000/* GStreamer * * unit test for wavenc * * Copyright (C) <2010> Stefan Kost * * 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 #include static gboolean bus_handler (GstBus * bus, GstMessage * message, gpointer data) { GMainLoop *loop = (GMainLoop *) data; switch (message->type) { case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR:{ GError *gerror; gchar *debug; gst_message_parse_error (message, &gerror, &debug); gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); gst_message_unref (message); g_error_free (gerror); g_free (debug); g_main_loop_quit (loop); break; } default: break; } return TRUE; } /* * gst-launch \ * audiotestsrc freq=440 num-buffers=100 ! interleave name=i ! audioconvert ! wavenc ! filesink location=/tmp/mc.wav \ * audiotestsrc freq=880 num-buffers=100 ! i. * ... * * http://www.microsoft.com/whdc/device/audio/multichaud.mspx */ static void make_n_channel_wav (const gint channels, const GValueArray * arr) { GstElement *pipeline; GstElement **audiotestsrc, *interleave, *wavenc, *conv, *fakesink; GstBus *bus; GMainLoop *loop; guint i; guint bus_watch = 0; audiotestsrc = g_new0 (GstElement *, channels); pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL); interleave = gst_element_factory_make ("interleave", NULL); fail_unless (interleave != NULL); g_object_set (interleave, "channel-positions", arr, NULL); gst_bin_add (GST_BIN (pipeline), interleave); if (G_BYTE_ORDER == G_BIG_ENDIAN) { /* we're not here to test orc; audioconvert misbehaves on ppc32 */ g_setenv ("ORC_CODE", "backup", 1); conv = gst_element_factory_make ("audioconvert", NULL); } else { conv = gst_element_factory_make ("identity", NULL); } fail_unless (conv != NULL); gst_bin_add (GST_BIN (pipeline), conv); fail_unless (gst_element_link (interleave, conv)); wavenc = gst_element_factory_make ("wavenc", NULL); fail_unless (wavenc != NULL); gst_bin_add (GST_BIN (pipeline), wavenc); fail_unless (gst_element_link (conv, wavenc)); fakesink = gst_element_factory_make ("fakesink", NULL); fail_unless (fakesink != NULL); gst_bin_add (GST_BIN (pipeline), fakesink); fail_unless (gst_element_link (wavenc, fakesink)); for (i = 0; i < channels; i++) { audiotestsrc[i] = gst_element_factory_make ("audiotestsrc", NULL); fail_unless (audiotestsrc[i] != NULL); g_object_set (G_OBJECT (audiotestsrc[i]), "wave", 0, "freq", 440.0 * i, "num-buffers", 100, NULL); gst_bin_add (GST_BIN (pipeline), audiotestsrc[i]); fail_unless (gst_element_link (audiotestsrc[i], interleave)); } loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_free (audiotestsrc); g_main_loop_unref (loop); g_source_remove (bus_watch); } GST_START_TEST (test_encode_stereo) { GValueArray *arr; GValue val = { 0, }; arr = g_value_array_new (2); g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT); g_value_array_append (arr, &val); g_value_unset (&val); make_n_channel_wav (2, arr); g_value_array_free (arr); } GST_END_TEST; #if 0 GST_START_TEST (test_encode_multichannel) { GValueArray *arr; GValue val = { 0, }; arr = g_value_array_new (6); g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_LFE); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT); g_value_array_append (arr, &val); g_value_unset (&val); make_n_channel_wav (6); } GST_END_TEST; #endif static Suite * wavenc_suite (void) { Suite *s = suite_create ("wavenc"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_encode_stereo); /* FIXME: improve wavenc tcase_add_test (tc_chain, test_encode_multichannel); */ return s; } GST_CHECK_MAIN (wavenc); gst-plugins-good-0.10.31/tests/check/pipelines/effectv.c0000644000175000017500000000726611671175355020022 00000000000000/* GStreamer * * Copyright (C) <2009> Sebastian Dröge * * 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 #include typedef struct { GMainLoop *loop; gboolean eos; } OnMessageUserData; static void on_message_cb (GstBus * bus, GstMessage * message, gpointer user_data) { OnMessageUserData *d = user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: case GST_MESSAGE_WARNING: g_assert_not_reached (); break; case GST_MESSAGE_EOS: g_main_loop_quit (d->loop); d->eos = TRUE; break; default: break; } } static void run_test (const gchar * pipeline_string) { GstElement *pipeline; GstBus *bus; GMainLoop *loop; OnMessageUserData omud = { NULL, }; GstStateChangeReturn ret; GST_DEBUG ("Testing pipeline '%s'", pipeline_string); pipeline = gst_parse_launch (pipeline_string, NULL); fail_unless (pipeline != NULL); g_object_set (G_OBJECT (pipeline), "async-handling", TRUE, NULL); loop = g_main_loop_new (NULL, FALSE); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); gst_bus_add_signal_watch (bus); omud.loop = loop; omud.eos = FALSE; g_signal_connect (bus, "message", (GCallback) on_message_cb, &omud); gst_object_unref (bus); ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); fail_unless (ret == GST_STATE_CHANGE_SUCCESS || ret == GST_STATE_CHANGE_ASYNC); g_main_loop_run (loop); fail_unless (gst_element_set_state (pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); fail_unless (omud.eos == TRUE); gst_object_unref (pipeline); g_main_loop_unref (loop); } #define CREATE_TEST(element) \ GST_START_TEST (test_##element) \ { \ gchar *pipeline; \ \ pipeline = g_strdup_printf ("videotestsrc num-buffers=100 ! " \ "ffmpegcolorspace ! " \ " %s ! " \ " fakesink", #element); \ \ run_test (pipeline); \ g_free (pipeline); \ } \ \ GST_END_TEST; CREATE_TEST (agingtv); CREATE_TEST (dicetv); CREATE_TEST (edgetv); CREATE_TEST (optv); CREATE_TEST (quarktv); CREATE_TEST (radioactv); CREATE_TEST (revtv); CREATE_TEST (rippletv); CREATE_TEST (shagadelictv); CREATE_TEST (streaktv); CREATE_TEST (vertigotv); CREATE_TEST (warptv); static Suite * effectv_suite (void) { Suite *s = suite_create ("effectv"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_set_timeout (tc_chain, 180); tcase_add_test (tc_chain, test_agingtv); tcase_add_test (tc_chain, test_dicetv); tcase_add_test (tc_chain, test_edgetv); tcase_add_test (tc_chain, test_optv); tcase_add_test (tc_chain, test_quarktv); tcase_add_test (tc_chain, test_radioactv); tcase_add_test (tc_chain, test_revtv); tcase_add_test (tc_chain, test_rippletv); tcase_add_test (tc_chain, test_shagadelictv); tcase_add_test (tc_chain, test_streaktv); tcase_add_test (tc_chain, test_vertigotv); tcase_add_test (tc_chain, test_warptv); return s; } GST_CHECK_MAIN (effectv); gst-plugins-good-0.10.31/tests/check/pipelines/wavpack.c0000644000175000017500000001465211671175355020031 00000000000000/* GStreamer * Copyright (C) 2008 Sebastian Dröge * * 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 #include static gboolean bus_handler (GstBus * bus, GstMessage * message, gpointer data) { GMainLoop *loop = (GMainLoop *) data; switch (message->type) { case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR:{ GError *gerror; gchar *debug; gst_message_parse_error (message, &gerror, &debug); gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); gst_message_unref (message); g_error_free (gerror); g_free (debug); g_main_loop_quit (loop); break; } case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); fail_unless (strcmp (name, "imperfect-timestamp") != 0); fail_unless (strcmp (name, "imperfect-offset") != 0); break; } default: break; } return TRUE; } static gboolean had_first_buffer = FALSE; static void identity_handoff (GstElement * object, GstBuffer * buffer, gpointer user_data) { GstAdapter *adapter = GST_ADAPTER (user_data); gst_adapter_push (adapter, gst_buffer_ref (buffer)); } static void fakesink_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { GstAdapter *adapter = GST_ADAPTER (user_data); /* Don't allow the second buffer with offset=0 as it's the decoded * rewrite of the first */ if (had_first_buffer == FALSE && GST_BUFFER_OFFSET (buffer) == 0) had_first_buffer = TRUE; else if (GST_BUFFER_OFFSET (buffer) == 0) return; gst_adapter_push (adapter, gst_buffer_ref (buffer)); } GST_START_TEST (test_encode_decode) { GstElement *pipeline; GstElement *audiotestsrc, *identity1, *wavpackenc, *identity2, *wavpackdec, *identity3, *fakesink; GstAdapter *srcadapter, *sinkadapter; GstBus *bus; GMainLoop *loop; GstBuffer *in, *out; guint bus_watch = 0; srcadapter = gst_adapter_new (); fail_unless (srcadapter != NULL); sinkadapter = gst_adapter_new (); fail_unless (sinkadapter != NULL); pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL); audiotestsrc = gst_element_factory_make ("audiotestsrc", "src"); fail_unless (audiotestsrc != NULL); g_object_set (G_OBJECT (audiotestsrc), "wave", 0, "freq", 440.0, "num-buffers", 2000, NULL); identity1 = gst_element_factory_make ("identity", "identity1"); fail_unless (identity1 != NULL); g_object_set (G_OBJECT (identity1), "signal-handoffs", TRUE, NULL); g_signal_connect (G_OBJECT (identity1), "handoff", G_CALLBACK (identity_handoff), srcadapter); wavpackenc = gst_element_factory_make ("wavpackenc", "enc"); fail_unless (wavpackenc != NULL); identity2 = gst_element_factory_make ("identity", "identity2"); fail_unless (identity2 != NULL); g_object_set (G_OBJECT (identity2), "check-imperfect-timestamp", TRUE, "check-imperfect-offset", TRUE, NULL); wavpackdec = gst_element_factory_make ("wavpackdec", "dec"); fail_unless (wavpackdec != NULL); identity3 = gst_element_factory_make ("identity", "identity3"); fail_unless (identity3 != NULL); g_object_set (G_OBJECT (identity3), "check-imperfect-timestamp", TRUE, "check-imperfect-offset", TRUE, NULL); fakesink = gst_element_factory_make ("fakesink", "sink"); fail_unless (fakesink != NULL); g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL); g_signal_connect (G_OBJECT (fakesink), "handoff", G_CALLBACK (fakesink_handoff), sinkadapter); gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, identity1, wavpackenc, identity2, wavpackdec, identity3, fakesink, NULL); fail_unless (gst_element_link_many (audiotestsrc, identity1, wavpackenc, identity2, wavpackdec, identity3, fakesink, NULL)); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); had_first_buffer = FALSE; gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); fail_unless (had_first_buffer == TRUE); fail_unless (gst_adapter_available (srcadapter) > 0); fail_unless (gst_adapter_available (sinkadapter) > 0); fail_unless_equals_int (gst_adapter_available (srcadapter), gst_adapter_available (sinkadapter)); in = gst_adapter_take_buffer (srcadapter, gst_adapter_available (srcadapter)); fail_unless (in != NULL); out = gst_adapter_take_buffer (sinkadapter, gst_adapter_available (sinkadapter)); fail_unless (out != NULL); fail_unless_equals_int (GST_BUFFER_SIZE (in), GST_BUFFER_SIZE (out)); fail_unless (memcmp (GST_BUFFER_DATA (in), GST_BUFFER_DATA (out), GST_BUFFER_SIZE (in)) == 0); gst_buffer_unref (in); gst_buffer_unref (out); g_object_unref (pipeline); g_main_loop_unref (loop); g_object_unref (srcadapter); g_object_unref (sinkadapter); g_source_remove (bus_watch); } GST_END_TEST; static Suite * wavpack_suite (void) { Suite *s = suite_create ("Wavpack"); TCase *tc_chain = tcase_create ("linear"); /* time out after 60s, not the default 3 */ tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_encode_decode); return s; } int main (int argc, char **argv) { int nf; Suite *s = wavpack_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/pipelines/flacdec.c0000644000175000017500000001610311671175355017747 00000000000000/* GStreamer * Copyright (C) 2009 Thomas Vander Stichele * * 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 #include static guint16 buffer_get_first_sample (GstBuffer * buf) { GstStructure *s; gint w, d, c, r, e; fail_unless (buf != NULL, "NULL buffer"); fail_unless (GST_BUFFER_CAPS (buf) != NULL, "buffer without caps"); /* log buffer details */ GST_DEBUG ("buffer with size=%u, caps=%" GST_PTR_FORMAT, GST_BUFFER_SIZE (buf), GST_BUFFER_CAPS (buf)); GST_MEMDUMP ("buffer data from decoder", GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); /* make sure it's the format we expect */ s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); fail_unless_equals_string (gst_structure_get_name (s), "audio/x-raw-int"); fail_unless (gst_structure_get_int (s, "width", &w)); fail_unless_equals_int (w, 16); fail_unless (gst_structure_get_int (s, "depth", &d)); fail_unless_equals_int (d, 16); fail_unless (gst_structure_get_int (s, "rate", &r)); fail_unless_equals_int (r, 44100); fail_unless (gst_structure_get_int (s, "channels", &c)); fail_unless_equals_int (c, 1); fail_unless (gst_structure_get_int (s, "endianness", &e)); if (e == G_BIG_ENDIAN) return GST_READ_UINT16_BE (GST_BUFFER_DATA (buf)); else return GST_READ_UINT16_LE (GST_BUFFER_DATA (buf)); } GST_START_TEST (test_decode) { GstElement *pipeline; GstElement *appsink; GstBuffer *buffer = NULL; guint16 first_sample = 0; guint size = 0; gchar *path = g_build_filename (GST_TEST_FILES_PATH, "audiotestsrc.flac", NULL); gchar *pipe_desc = g_strdup_printf ("filesrc location=\"%s\" ! flacdec ! appsink name=sink", path); pipeline = gst_parse_launch (pipe_desc, NULL); fail_unless (pipeline != NULL); g_free (path); g_free (pipe_desc); appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); fail_unless (appsink != NULL); gst_element_set_state (pipeline, GST_STATE_PLAYING); do { g_signal_emit_by_name (appsink, "pull-buffer", &buffer); if (buffer == NULL) break; if (first_sample == 0) first_sample = buffer_get_first_sample (buffer); GST_DEBUG ("buffer: %d\n", buffer->size); GST_DEBUG ("buffer: %04x\n", buffer_get_first_sample (buffer)); size += buffer->size; gst_buffer_unref (buffer); buffer = NULL; } while (TRUE); /* audiotestsrc with samplesperbuffer 1024 and 10 num-buffers */ fail_unless_equals_int (size, 20480); fail_unless_equals_int (first_sample, 0x066a); gst_element_set_state (pipeline, GST_STATE_NULL); g_object_unref (pipeline); g_object_unref (appsink); } GST_END_TEST; GST_START_TEST (test_decode_seek_full) { GstElement *pipeline; GstElement *appsink; GstEvent *event; GstBuffer *buffer = NULL; guint16 first_sample = 0; guint size = 0; gchar *path = g_build_filename (GST_TEST_FILES_PATH, "audiotestsrc.flac", NULL); gchar *pipe_desc = g_strdup_printf ("filesrc location=\"%s\" ! flacdec ! appsink name=sink", path); pipeline = gst_parse_launch (pipe_desc, NULL); fail_unless (pipeline != NULL); g_free (pipe_desc); g_free (path); appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); fail_unless (appsink != NULL); gst_element_set_state (pipeline, GST_STATE_PAUSED); gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); /* do a seek that should give us the complete output */ event = gst_event_new_seek (1.0, GST_FORMAT_DEFAULT, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 20480); fail_unless (gst_element_send_event (appsink, event)); gst_element_set_state (pipeline, GST_STATE_PLAYING); do { g_signal_emit_by_name (appsink, "pull-buffer", &buffer); if (buffer == NULL) break; if (first_sample == 0) first_sample = buffer_get_first_sample (buffer); size += buffer->size; gst_buffer_unref (buffer); buffer = NULL; } while (TRUE); /* file was generated with audiotestsrc * with 1024 samplesperbuffer and 10 num-buffers in 16 bit audio */ fail_unless_equals_int (size, 20480); fail_unless_equals_int (first_sample, 0x066a); gst_element_set_state (pipeline, GST_STATE_NULL); g_object_unref (pipeline); g_object_unref (appsink); } GST_END_TEST; GST_START_TEST (test_decode_seek_partial) { GstElement *pipeline; GstElement *appsink; GstEvent *event; GstBuffer *buffer = NULL; guint size = 0; guint16 first_sample = 0; gchar *path = g_build_filename (GST_TEST_FILES_PATH, "audiotestsrc.flac", NULL); gchar *pipe_desc = g_strdup_printf ("filesrc location=\"%s\" ! flacdec ! appsink name=sink", path); pipeline = gst_parse_launch (pipe_desc, NULL); fail_unless (pipeline != NULL); g_free (path); g_free (pipe_desc); appsink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); fail_unless (appsink != NULL); gst_element_set_state (pipeline, GST_STATE_PAUSED); gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE); /* do a partial seek to get the first 1024 samples or 2048 bytes */ event = gst_event_new_seek (1.0, GST_FORMAT_DEFAULT, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 1024); GST_DEBUG ("seeking"); fail_unless (gst_element_send_event (appsink, event)); GST_DEBUG ("seeked"); gst_element_set_state (pipeline, GST_STATE_PLAYING); do { GST_DEBUG ("pulling buffer"); g_signal_emit_by_name (appsink, "pull-buffer", &buffer); GST_DEBUG ("pulled buffer %p", buffer); if (buffer == NULL) break; if (first_sample == 0) { fail_unless_equals_int (GST_BUFFER_OFFSET (buffer), 0L); first_sample = buffer_get_first_sample (buffer); } size += buffer->size; gst_buffer_unref (buffer); buffer = NULL; } while (TRUE); fail_unless_equals_int (size, 2048); fail_unless_equals_int (first_sample, 0x066a); gst_element_set_state (pipeline, GST_STATE_NULL); g_object_unref (pipeline); g_object_unref (appsink); } GST_END_TEST; static Suite * flacdec_suite (void) { Suite *s = suite_create ("flacdec"); TCase *tc_chain = tcase_create ("linear"); /* time out after 60s, not the default 3 */ tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_decode); tcase_add_test (tc_chain, test_decode_seek_full); tcase_add_test (tc_chain, test_decode_seek_partial); return s; } GST_CHECK_MAIN (flacdec); gst-plugins-good-0.10.31/tests/check/Makefile.am0000644000175000017500000002202311677341661016265 00000000000000include $(top_srcdir)/common/check.mak CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg TEST_FILES_DIRECTORY = $(top_srcdir)/tests/files REGISTRY_ENVIRONMENT = \ GST_REGISTRY=$(CHECK_REGISTRY) TESTS_ENVIRONMENT = \ $(REGISTRY_ENVIRONMENT) \ GST_PLUGIN_SYSTEM_PATH= \ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/ext:$(top_builddir)/sys:$(GSTPB_PLUGINS_DIR):$(GST_PLUGINS_DIR) \ GST_PLUGIN_LOADING_WHITELIST="gstreamer@$(GST_PLUGINS_DIR):gst-plugins-base@$(GSTPB_PLUGINS_DIR):gst-plugins-good@$(top_builddir)" \ GST_STATE_IGNORE_ELEMENTS="aasink autoaudiosrc autoaudiosink autovideosrc autovideosink \ cacasink cairotextoverlay gconfaudiosrc gconfvideosrc gconfaudiosink gconfvideosink \ halaudiosrc halaudiosink jackaudiosrc jackaudiosink \ osssrc osssink osxaudiosink osxaudiosrc osxvideosrc osxvideosink \ pulsesink pulsesrc pulsemixer v4l2src" # fake device drivers: we could run hardware element tests against dummy drivers # v4l2: vivo (part of normal kernel) # modprobe vivo; # gst-launch v4l2src device="/dev/video1" ! xvimagesink; # rmmod vivo # # alsa: snd-dummy (part of normal alsa, not removable) # modprobe snd-dummy; # gst-launch alsasrc device="hw:2" ! fakesink # gst-launch fakesrc ! alsasink device="hw:2" # # need a way to figure out value for the device property # the core dumps of some machines have PIDs appended CLEANFILES = core.* test-registry.* clean-local: clean-local-check clean-local-orc if USE_ANNODEX check_annodex = \ elements/cmmldec \ elements/cmmlenc else check_annodex = endif if USE_FLAC check_flac = pipelines/flacdec else check_flac = endif if USE_GDK_PIXBUF check_gdkpixbuf = elements/gdkpixbufsink else check_gdkpixbuf = endif if USE_JPEG check_jpeg = elements/jpegenc else check_jpeg = endif if USE_SOUP check_soup = elements/souphttpsrc else check_soup = endif if USE_SUNAUDIO check_sunaudio = elements/sunaudio else check_sunaudio = endif if USE_TAGLIB check_taglib = \ elements/id3v2mux \ elements/apev2mux else check_taglib = endif if USE_WAVPACK check_wavpack = \ elements/wavpackparse \ elements/wavpackdec \ elements/wavpackenc \ pipelines/wavpack else check_wavpack = endif if HAVE_ORC check_orc = orc/deinterlace orc/videomixer orc/videobox else check_orc = endif check_PROGRAMS = \ generic/index \ generic/states \ elements/aacparse \ elements/ac3parse \ elements/amrparse \ $(check_annodex) \ elements/alphacolor \ elements/aspectratiocrop \ elements/audioamplify \ elements/audiochebband \ elements/audiocheblimit \ elements/audiodynamic \ elements/audioecho \ elements/audiofirfilter \ elements/audioiirfilter \ elements/audioinvert \ elements/audiopanorama \ elements/audiowsincband \ elements/audiowsinclimit \ elements/avimux \ elements/avisubtitle \ elements/capssetter \ elements/deinterlace \ elements/deinterleave \ elements/equalizer \ elements/flacparse \ elements/flvdemux \ elements/flvmux \ elements/icydemux \ elements/id3demux \ elements/imagefreeze \ elements/interleave \ elements/level \ elements/matroskamux \ elements/matroskaparse \ elements/mpegaudioparse \ elements/multifile \ elements/qtmux \ elements/rganalysis \ elements/rglimiter \ elements/rgvolume \ elements/rtp-payloading \ elements/rtpbin \ elements/rtpbin_buffer_list \ elements/rtpjitterbuffer \ elements/shapewipe \ elements/spectrum \ elements/udpsink \ elements/videocrop \ elements/videofilter \ elements/y4menc \ pipelines/simple-launch-lines \ pipelines/effectv \ pipelines/tagschecking \ pipelines/wavenc \ $(check_flac) \ $(check_gdkpixbuf) \ $(check_jpeg) \ $(check_soup) \ $(check_sunaudio) \ $(check_taglib) \ $(check_wavpack) \ $(check_orc) VALGRIND_TO_FIX = \ elements/rtp-payloading TESTS = $(check_PROGRAMS) # these tests don't even pass # autodetect: temporarily disabled because of broken videosinks in -bad noinst_PROGRAMS = \ elements/autodetect AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) \ $(GST_OPTION_CFLAGS) -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS LDADD = $(GST_OBJ_LIBS) $(GST_CHECK_LIBS) $(CHECK_LIBS) # valgrind testing # videocrop disabled since it takes way too long in valgrind VALGRIND_TESTS_DISABLE = \ elements/videocrop \ $(VALGRIND_TO_FIX) SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-good.supp # parser unit test convenience lib noinst_LTLIBRARIES = libparser.la libparser_la_SOURCES = elements/parser.c elements/parser.h libparser_la_CFLAGS = \ -I$(top_srcdir)/tests/check \ $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) elements_aacparse_LDADD = libparser.la $(LDADD) elements_ac3parse_LDADD = libparser.la $(LDADD) elements_amrparse_LDADD = libparser.la $(LDADD) elements_flacparse_LDADD = libparser.la $(LDADD) elements_mpegaudioparse_LDADD = libparser.la $(LDADD) elements_aspectratiocrop_LDADD = $(LDADD) elements_aspectratiocrop_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_audiopanorama_LDADD = \ $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ $(LDADD) elements_audiopanorama_CFLAGS = \ $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ $(CFLAGS) $(AM_CFLAGS) elements_cmmldec_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_cmmlenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_alphacolor_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_deinterlace_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_deinterlace_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) elements_deinterleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_deinterleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) elements_interleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_interleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) elements_imagefreeze_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_imagefreeze_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LDADD) elements_jpegenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_jpegenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstapp-0.10 $(GST_BASE_LIBS) $(LDADD) elements_level_LDADD = $(LDADD) $(LIBM) elements_matroskamux_LDADD = $(GST_BASE_LIBS) $(LDADD) $(LIBM) elements_multifile_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) elements_multifile_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(LDADD) $(LIBM) elements_qtmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) elements_qtmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) elements_rtpbin_buffer_list_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ $(WARNING_CFLAGS) $(ERROR_CFLAGS) $(GST_CHECK_CFLAGS) $(AM_CFLAGS) elements_rtpbin_buffer_list_LDADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) elements_rtpbin_buffer_list_SOURCES = elements/rtpbin_buffer_list.c elements_souphttpsrc_CFLAGS = $(SOUP_CFLAGS) $(AM_CFLAGS) elements_souphttpsrc_LDADD = $(SOUP_LIBS) $(LDADD) elements_sunaudio_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) \ $(AM_CFLAGS) elements_sunaudio_LDADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-@GST_MAJORMINOR@ \ $(LDADD) elements_videocrop_LDADD = $(GST_BASE_LIBS) $(LDADD) elements_videocrop_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_videofilter_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_videofilter_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) # FIXME: configure should check for gdk-pixbuf not gtk # only need video.h header, not the lib elements_gdkpixbufsink_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) $(GDK_PIXBUF_CFLAGS) elements_gdkpixbufsink_LDADD = \ $(LDADD) $(GDK_PIXBUF_LIBS) pipelines_wavenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) pipelines_wavenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) pipelines_wavpack_LDADD = $(LDADD) $(GST_BASE_LIBS) pipelines_wavpack_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) orc_deinterlace_CFLAGS = $(ORC_CFLAGS) orc_deinterlace_LDADD = $(ORC_LIBS) -lorc-test-0.4 nodist_orc_deinterlace_SOURCES = orc/deinterlace.c orc_videomixer_CFLAGS = $(ORC_CFLAGS) orc_videomixer_LDADD = $(ORC_LIBS) -lorc-test-0.4 nodist_orc_videomixer_SOURCES = orc/videomixer.c orc_videobox_CFLAGS = $(ORC_CFLAGS) orc_videobox_LDADD = $(ORC_LIBS) -lorc-test-0.4 nodist_orc_videobox_SOURCES = orc/videobox.c orc/deinterlace.c: $(top_srcdir)/gst/deinterlace/tvtime.orc $(MKDIR_P) orc/ $(ORCC) --test -o $@ $< orc/videomixer.c: $(top_srcdir)/gst/videomixer/blendorc.orc $(MKDIR_P) orc/ $(ORCC) --test -o $@ $< orc/videobox.c: $(top_srcdir)/gst/videobox/gstvideoboxorc.orc $(MKDIR_P) orc/ $(ORCC) --test -o $@ $< clean-local-orc: rm -rf orc EXTRA_DIST = gst-plugins-good.supp gst-plugins-good-0.10.31/tests/check/elements/0000755000175000017500000000000011720565323016116 500000000000000gst-plugins-good-0.10.31/tests/check/elements/mpegaudioparse.c0000644000175000017500000001017411717042114021204 00000000000000/* * GStreamer * * unit test for aacparse * * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #include "parser.h" #define SRC_CAPS_TMPL "audio/mpeg, parsed=(boolean)false, mpegversion=(int)1" #define SINK_CAPS_TMPL "audio/mpeg, parsed=(boolean)true, mpegversion=(int)1" GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS_TMPL) ); GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS_TMPL) ); /* some data */ static guint8 mp3_frame[384] = { 0xff, 0xfb, 0x94, 0xc4, 0xff, 0x83, 0xc0, 0x00, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x34, 0x80, 0x00, 0x00, 0x04, 0x00, }; static guint8 garbage_frame[] = { 0xff, 0xff, 0xff, 0xff, 0xff }; GST_START_TEST (test_parse_normal) { gst_parser_test_normal (mp3_frame, sizeof (mp3_frame)); } GST_END_TEST; GST_START_TEST (test_parse_drain_single) { gst_parser_test_drain_single (mp3_frame, sizeof (mp3_frame)); } GST_END_TEST; GST_START_TEST (test_parse_drain_garbage) { gst_parser_test_drain_garbage (mp3_frame, sizeof (mp3_frame), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_split) { gst_parser_test_split (mp3_frame, sizeof (mp3_frame)); } GST_END_TEST; GST_START_TEST (test_parse_skip_garbage) { gst_parser_test_skip_garbage (mp3_frame, sizeof (mp3_frame), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; #define structure_get_int(s,f) \ (g_value_get_int(gst_structure_get_value(s,f))) #define fail_unless_structure_field_int_equals(s,field,num) \ fail_unless_equals_int (structure_get_int(s,field), num) GST_START_TEST (test_parse_detect_stream) { GstStructure *s; GstCaps *caps; caps = gst_parser_test_get_output_caps (mp3_frame, sizeof (mp3_frame), NULL); fail_unless (caps != NULL); GST_LOG ("mpegaudio output caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); fail_unless (gst_structure_has_name (s, "audio/mpeg")); fail_unless_structure_field_int_equals (s, "mpegversion", 1); fail_unless_structure_field_int_equals (s, "layer", 3); fail_unless_structure_field_int_equals (s, "channels", 1); fail_unless_structure_field_int_equals (s, "rate", 48000); gst_caps_unref (caps); } GST_END_TEST; static Suite * mpegaudioparse_suite (void) { Suite *s = suite_create ("mpegaudioparse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_parse_normal); tcase_add_test (tc_chain, test_parse_drain_single); tcase_add_test (tc_chain, test_parse_drain_garbage); tcase_add_test (tc_chain, test_parse_split); tcase_add_test (tc_chain, test_parse_skip_garbage); tcase_add_test (tc_chain, test_parse_detect_stream); return s; } /* * TODO: * - Both push- and pull-modes need to be tested * * Pull-mode & EOS */ int main (int argc, char **argv) { int nf; Suite *s = mpegaudioparse_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); /* init test context */ ctx_factory = "mpegaudioparse"; ctx_sink_template = &sinktemplate; ctx_src_template = &srctemplate; srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/avimux.c0000644000175000017500000002101511671175354017520 00000000000000/* GStreamer * * unit test for avimux * * Copyright (C) <2006> Mark Nauwelaerts * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; #define AUDIO_CAPS_STRING "audio/x-ac3, " \ "channels = (int) 1, " \ "rate = (int) 8000" #define VIDEO_CAPS_STRING "video/x-xvid, " \ "width = (int) 384, " \ "height = (int) 288, " \ "framerate = (fraction) 25/1" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-msvideo")); static GstStaticPadTemplate srcvideotemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_STRING)); static GstStaticPadTemplate srcaudiotemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (AUDIO_CAPS_STRING)); /* setup and teardown needs some special handling for muxer */ static GstPad * setup_src_pad (GstElement * element, GstStaticPadTemplate * template, GstCaps * caps, const gchar * sinkname) { GstPad *srcpad, *sinkpad; GST_DEBUG_OBJECT (element, "setting up sending pad"); /* sending pad */ srcpad = gst_pad_new_from_static_template (template, "src"); fail_if (srcpad == NULL, "Could not create a srcpad"); ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); if (!(sinkpad = gst_element_get_static_pad (element, sinkname))) sinkpad = gst_element_get_request_pad (element, sinkname); fail_if (sinkpad == NULL, "Could not get sink pad from %s", GST_ELEMENT_NAME (element)); /* references are owned by: 1) us, 2) avimux, 3) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); if (caps) fail_unless (gst_pad_set_caps (srcpad, caps)); fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); gst_object_unref (sinkpad); /* because we got it higher up */ /* references are owned by: 1) avimux, 2) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); return srcpad; } static void teardown_src_pad (GstElement * element, const gchar * sinkname) { GstPad *srcpad, *sinkpad; gchar *padname; /* clean up floating src pad */ /* hm, avimux uses _00 as suffixes for padnames */ padname = g_strdup (sinkname); memcpy (strchr (padname, '%'), "00", 2); if (!(sinkpad = gst_element_get_static_pad (element, padname))) sinkpad = gst_element_get_request_pad (element, padname); g_free (padname); /* pad refs held by 1) avimux 2) collectpads and 3) us (through _get) */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); srcpad = gst_pad_get_peer (sinkpad); gst_pad_unlink (srcpad, sinkpad); /* after unlinking, pad refs still held by * 1) avimux and 2) collectpads and 3) us (through _get) */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); gst_object_unref (sinkpad); /* one more ref is held by element itself */ /* pad refs held by both creator and this function (through _get_peer) */ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); gst_object_unref (srcpad); gst_object_unref (srcpad); } static GstElement * setup_avimux (GstStaticPadTemplate * srctemplate, const gchar * sinkname) { GstElement *avimux; GST_DEBUG ("setup_avimux"); avimux = gst_check_setup_element ("avimux"); mysrcpad = setup_src_pad (avimux, srctemplate, NULL, sinkname); mysinkpad = gst_check_setup_sink_pad (avimux, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return avimux; } static void cleanup_avimux (GstElement * avimux, const gchar * sinkname) { GST_DEBUG ("cleanup_avimux"); gst_element_set_state (avimux, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); teardown_src_pad (avimux, sinkname); gst_check_teardown_sink_pad (avimux); gst_check_teardown_element (avimux); } static void check_avimux_pad (GstStaticPadTemplate * srctemplate, const gchar * src_caps_string, const gchar * chunk_id, const gchar * sinkname) { GstElement *avimux; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; int num_buffers; int i; guint8 data0[4] = "RIFF"; guint8 data1[8] = "AVI LIST"; guint8 data2[8] = "hdrlavih"; guint8 data3[4] = "LIST"; guint8 data4[8] = "strlstrh"; guint8 data5[4] = "strf"; guint8 data6[4] = "LIST"; guint8 data7[4] = "movi"; avimux = setup_avimux (srctemplate, sinkname); fail_unless (gst_element_set_state (avimux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); caps = gst_caps_from_string (src_caps_string); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); /* at least expect avi header, chunk header, chunk and padding */ fail_unless (num_buffers >= 4); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); switch (i) { case 0:{ /* check riff header */ /* avi header */ guint8 *data = GST_BUFFER_DATA (outbuffer); fail_unless (memcmp (data, data0, sizeof (data0)) == 0); fail_unless (memcmp (data + 8, data1, sizeof (data1)) == 0); fail_unless (memcmp (data + 20, data2, sizeof (data2)) == 0); /* video or audio header */ data += 32 + 56; fail_unless (memcmp (data, data3, sizeof (data3)) == 0); fail_unless (memcmp (data + 8, data4, sizeof (data4)) == 0); fail_unless (memcmp (data + 76, data5, sizeof (data5)) == 0); /* avi data header */ data = GST_BUFFER_DATA (outbuffer); data += GST_BUFFER_SIZE (outbuffer) - 12; fail_unless (memcmp (data, data6, sizeof (data6)) == 0); data += 8; fail_unless (memcmp (data, data7, sizeof (data7)) == 0); break; } case 1: /* chunk header */ fail_unless (GST_BUFFER_SIZE (outbuffer) == 8); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), chunk_id, 4) == 0); break; case 2: fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); break; case 3: /* buffer we put in, must be padded to even size */ fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); break; default: break; } ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } cleanup_avimux (avimux, sinkname); g_list_free (buffers); buffers = NULL; } GST_START_TEST (test_video_pad) { check_avimux_pad (&srcvideotemplate, VIDEO_CAPS_STRING, "00db", "video_%d"); } GST_END_TEST; GST_START_TEST (test_audio_pad) { check_avimux_pad (&srcaudiotemplate, AUDIO_CAPS_STRING, "00wb", "audio_%d"); } GST_END_TEST; static Suite * avimux_suite (void) { Suite *s = suite_create ("avimux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_video_pad); tcase_add_test (tc_chain, test_audio_pad); return s; } int main (int argc, char **argv) { int nf; Suite *s = avimux_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/rtpbin_buffer_list.c0000644000175000017500000002201311671175354022070 00000000000000/* GStreamer * * Unit test for gstrtpbin sending rtp packets using GstBufferList. * Copyright (C) 2009 Branko Subasic * * 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 #include /* This test makes sure that RTP packets sent as buffer lists are sent through * the rtpbin as they are supposed to, and not corrupted in any way. */ #define TEST_CAPS \ "application/x-rtp, " \ "media=(string)video, " \ "clock-rate=(int)90000, " \ "encoding-name=(string)H264, " \ "profile-level-id=(string)4d4015, " \ "payload=(int)96, " \ "ssrc=(guint)2633237432, " \ "clock-base=(guint)1868267015, " \ "seqnum-base=(guint)54229" /* RTP headers and the first 2 bytes of the payload (FU indicator and FU header) */ static const guint8 rtp_header[2][14] = { {0x80, 0x60, 0xbb, 0xb7, 0x5c, 0xe9, 0x09, 0x0d, 0xf5, 0x9c, 0x43, 0x55, 0x1c, 0x86}, {0x80, 0x60, 0xbb, 0xb8, 0x5c, 0xe9, 0x09, 0x0d, 0xf5, 0x9c, 0x43, 0x55, 0x1c, 0x46} }; static const guint rtp_header_len[] = { sizeof rtp_header[0], sizeof rtp_header[1] }; static GstBuffer *header_buffer[2] = { NULL, NULL }; /* Some payload. */ static const char *payload = "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" "0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF0123456789ABSDEF" "0123456789ABSDEF0123456"; static const guint payload_offset[] = { 0, 498 }; static const guint payload_len[] = { 498, 5 }; static GstBuffer *original_buffer = NULL; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp")); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp")); static GstBuffer * _create_original_buffer (void) { GstCaps *caps; if (original_buffer != NULL) return original_buffer; original_buffer = gst_buffer_new (); fail_unless (original_buffer != NULL); gst_buffer_set_data (original_buffer, (guint8 *) payload, strlen (payload)); GST_BUFFER_TIMESTAMP (original_buffer) = gst_clock_get_internal_time (gst_system_clock_obtain ()); caps = gst_caps_from_string (TEST_CAPS); fail_unless (caps != NULL); gst_buffer_set_caps (original_buffer, caps); gst_caps_unref (caps); return original_buffer; } static GstBufferList * _create_buffer_list (void) { GstBufferList *list; GstBufferListIterator *it; GstBuffer *orig_buffer; GstBuffer *buffer; orig_buffer = _create_original_buffer (); fail_if (orig_buffer == NULL); list = gst_buffer_list_new (); fail_if (list == NULL); it = gst_buffer_list_iterate (list); fail_if (it == NULL); /*** First group, i.e. first packet. **/ gst_buffer_list_iterator_add_group (it); /* Create buffer with RTP header and add it to the 1st group */ buffer = gst_buffer_new (); GST_BUFFER_MALLOCDATA (buffer) = g_memdup (&rtp_header[0], rtp_header_len[0]); GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); GST_BUFFER_SIZE (buffer) = rtp_header_len[0]; gst_buffer_copy_metadata (buffer, orig_buffer, GST_BUFFER_COPY_ALL); header_buffer[0] = buffer; gst_buffer_list_iterator_add (it, buffer); /* Create the payload buffer and add it to the 1st group */ buffer = gst_buffer_create_sub (orig_buffer, payload_offset[0], payload_len[0]); fail_if (buffer == NULL); gst_buffer_list_iterator_add (it, buffer); /*** Second group, i.e. second packet. ***/ /* Create a new group to hold the rtp header and the payload */ gst_buffer_list_iterator_add_group (it); /* Create buffer with RTP header and add it to the 2nd group */ buffer = gst_buffer_new (); GST_BUFFER_MALLOCDATA (buffer) = g_memdup (&rtp_header[1], rtp_header_len[1]); GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer); GST_BUFFER_SIZE (buffer) = rtp_header_len[1]; gst_buffer_copy_metadata (buffer, orig_buffer, GST_BUFFER_COPY_ALL); header_buffer[1] = buffer; /* Add the rtp header to the buffer list */ gst_buffer_list_iterator_add (it, buffer); /* Create the payload buffer and add it to the 2d group */ buffer = gst_buffer_create_sub (orig_buffer, payload_offset[1], payload_len[1]); fail_if (buffer == NULL); gst_buffer_list_iterator_add (it, buffer); gst_buffer_list_iterator_free (it); return list; } static void _check_header (GstBuffer * buffer, guint index) { guint8 *data; fail_if (buffer == NULL); fail_unless (index < 2); fail_unless (GST_BUFFER_SIZE (buffer) == rtp_header_len[index]); /* Can't do a memcmp() on the whole header, cause the SSRC (bytes 8-11) will * most likely be changed in gstrtpbin. */ fail_unless ((data = GST_BUFFER_DATA (buffer)) != NULL); fail_unless_equals_uint64 (*(guint64 *) data, *(guint64 *) rtp_header[index]); fail_unless (*(guint16 *) (data + 12) == *(guint16 *) (rtp_header[index] + 12)); } static void _check_payload (GstBuffer * buffer, guint index) { fail_if (buffer == NULL); fail_unless (index < 2); fail_unless (GST_BUFFER_SIZE (buffer) == payload_len[index]); fail_if (GST_BUFFER_DATA (buffer) != (gpointer) (payload + payload_offset[index])); fail_if (memcmp (GST_BUFFER_DATA (buffer), payload + payload_offset[index], payload_len[index])); } static void _check_group (GstBufferListIterator * it, guint index, GstCaps * caps) { GstBuffer *buffer; fail_unless (it != NULL); fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2); fail_unless (caps != NULL); fail_unless ((buffer = gst_buffer_list_iterator_next (it)) != NULL); fail_unless (GST_BUFFER_TIMESTAMP (buffer) == GST_BUFFER_TIMESTAMP (original_buffer)); fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (original_buffer), GST_BUFFER_CAPS (buffer))); _check_header (buffer, index); fail_unless ((buffer = gst_buffer_list_iterator_next (it)) != NULL); _check_payload (buffer, index); } static GstFlowReturn _sink_chain_list (GstPad * pad, GstBufferList * list) { GstCaps *caps; GstBufferListIterator *it; caps = gst_caps_from_string (TEST_CAPS); fail_unless (caps != NULL); fail_unless (GST_IS_BUFFER_LIST (list)); fail_unless (gst_buffer_list_n_groups (list) == 2); it = gst_buffer_list_iterate (list); fail_if (it == NULL); fail_unless (gst_buffer_list_iterator_next_group (it)); _check_group (it, 0, caps); fail_unless (gst_buffer_list_iterator_next_group (it)); _check_group (it, 1, caps); gst_caps_unref (caps); gst_buffer_list_iterator_free (it); gst_buffer_list_unref (list); return GST_FLOW_OK; } static void _set_chain_functions (GstPad * pad) { gst_pad_set_chain_list_function (pad, _sink_chain_list); } GST_START_TEST (test_bufferlist) { GstElement *rtpbin; GstPad *sinkpad; GstPad *srcpad; GstBufferList *list; list = _create_buffer_list (); fail_unless (list != NULL); rtpbin = gst_check_setup_element ("gstrtpbin"); srcpad = gst_check_setup_src_pad_by_name (rtpbin, &srctemplate, "send_rtp_sink_0"); fail_if (srcpad == NULL); sinkpad = gst_check_setup_sink_pad_by_name (rtpbin, &sinktemplate, "send_rtp_src_0"); fail_if (sinkpad == NULL); _set_chain_functions (sinkpad); gst_pad_set_active (sinkpad, TRUE); gst_element_set_state (rtpbin, GST_STATE_PLAYING); fail_unless (gst_pad_push_list (srcpad, list) == GST_FLOW_OK); gst_pad_set_active (sinkpad, FALSE); gst_check_teardown_pad_by_name (rtpbin, "send_rtp_src_0"); gst_check_teardown_pad_by_name (rtpbin, "send_rtp_sink_0"); gst_check_teardown_element (rtpbin); } GST_END_TEST; static Suite * bufferlist_suite (void) { Suite *s = suite_create ("BufferList"); TCase *tc_chain = tcase_create ("general"); /* time out after 30s. */ tcase_set_timeout (tc_chain, 10); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_bufferlist); return s; } GST_CHECK_MAIN (bufferlist); gst-plugins-good-0.10.31/tests/check/elements/udpsink.c0000644000175000017500000001344611671175354017675 00000000000000/* GStreamer RTP payloader unit tests * Copyright (C) 2009 Axis Communications * @author Ognyan Tonchev * * 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 #include #include #include static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); #define RTP_HEADER_SIZE 12 #define RTP_PAYLOAD_SIZE 1024 /* * Number of bytes received in the render function when using buffer lists */ static guint render_list_bytes_received; /* * Render function for testing udpsink with buffer lists */ static GstFlowReturn udpsink_render (GstBaseSink * sink, GstBufferList * list) { GstBufferListIterator *it; fail_if (!list); /* * Count the size of the rtp header and the payload in the buffer list. */ it = gst_buffer_list_iterate (list); /* Loop through all groups */ while (gst_buffer_list_iterator_next_group (it)) { GstBuffer *buf; /* Loop through all buffers in the current group */ while ((buf = gst_buffer_list_iterator_next (it))) { guint size; size = GST_BUFFER_SIZE (buf); GST_DEBUG ("rendered %u bytes", size); render_list_bytes_received += size; } } gst_buffer_list_iterator_free (it); return GST_FLOW_OK; } static void _set_render_function (GstElement * bsink) { GstBaseSinkClass *bsclass; bsclass = GST_BASE_SINK_GET_CLASS ((GstBaseSink *) bsink); /* Add callback function for the buffer list tests */ bsclass->render_list = udpsink_render; } static GstBufferList * _create_buffer_list (guint * data_size) { GstBufferList *list; GstBufferListIterator *it; GstBuffer *rtp_buffer; GstBuffer *data_buffer; list = gst_buffer_list_new (); it = gst_buffer_list_iterate (list); /*** First group, i.e. first packet. **/ /* Create the RTP header buffer */ rtp_buffer = gst_buffer_new (); GST_BUFFER_MALLOCDATA (rtp_buffer) = g_malloc (RTP_HEADER_SIZE); GST_BUFFER_DATA (rtp_buffer) = GST_BUFFER_MALLOCDATA (rtp_buffer); GST_BUFFER_SIZE (rtp_buffer) = RTP_HEADER_SIZE; memset (GST_BUFFER_DATA (rtp_buffer), 0, RTP_HEADER_SIZE); /* Create the buffer that holds the payload */ data_buffer = gst_buffer_new (); GST_BUFFER_MALLOCDATA (data_buffer) = g_malloc (RTP_PAYLOAD_SIZE); GST_BUFFER_DATA (data_buffer) = GST_BUFFER_MALLOCDATA (data_buffer); GST_BUFFER_SIZE (data_buffer) = RTP_PAYLOAD_SIZE; memset (GST_BUFFER_DATA (data_buffer), 0, RTP_PAYLOAD_SIZE); /* Create a new group to hold the rtp header and the payload */ gst_buffer_list_iterator_add_group (it); gst_buffer_list_iterator_add (it, rtp_buffer); gst_buffer_list_iterator_add (it, data_buffer); /*** Second group, i.e. second packet. ***/ /* Create the RTP header buffer */ rtp_buffer = gst_buffer_new (); GST_BUFFER_MALLOCDATA (rtp_buffer) = g_malloc (RTP_HEADER_SIZE); GST_BUFFER_DATA (rtp_buffer) = GST_BUFFER_MALLOCDATA (rtp_buffer); GST_BUFFER_SIZE (rtp_buffer) = RTP_HEADER_SIZE; memset (GST_BUFFER_DATA (rtp_buffer), 0, RTP_HEADER_SIZE); /* Create the buffer that holds the payload */ data_buffer = gst_buffer_new (); GST_BUFFER_MALLOCDATA (data_buffer) = g_malloc (RTP_PAYLOAD_SIZE); GST_BUFFER_DATA (data_buffer) = GST_BUFFER_MALLOCDATA (data_buffer); GST_BUFFER_SIZE (data_buffer) = RTP_PAYLOAD_SIZE; memset (GST_BUFFER_DATA (data_buffer), 0, RTP_PAYLOAD_SIZE); /* Create a new group to hold the rtp header and the payload */ gst_buffer_list_iterator_add_group (it); gst_buffer_list_iterator_add (it, rtp_buffer); gst_buffer_list_iterator_add (it, data_buffer); /* Calculate the size of the data */ *data_size = 2 * RTP_HEADER_SIZE + 2 * RTP_PAYLOAD_SIZE; gst_buffer_list_iterator_free (it); return list; } static void udpsink_test (gboolean use_buffer_lists) { GstElement *udpsink; GstPad *srcpad; GstBufferList *list; guint data_size; list = _create_buffer_list (&data_size); udpsink = gst_check_setup_element ("udpsink"); if (use_buffer_lists) _set_render_function (udpsink); srcpad = gst_check_setup_src_pad_by_name (udpsink, &srctemplate, "sink"); gst_element_set_state (udpsink, GST_STATE_PLAYING); gst_pad_push_event (srcpad, gst_event_new_new_segment_full (FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0, -1, 0)); gst_pad_push_list (srcpad, list); gst_check_teardown_pad_by_name (udpsink, "sink"); gst_check_teardown_element (udpsink); if (use_buffer_lists) fail_unless_equals_int (data_size, render_list_bytes_received); } GST_START_TEST (test_udpsink) { udpsink_test (FALSE); } GST_END_TEST; GST_START_TEST (test_udpsink_bufferlist) { udpsink_test (TRUE); } GST_END_TEST; /* * Creates the test suite. * * Returns: pointer to the test suite. */ static Suite * udpsink_suite (void) { Suite *s = suite_create ("udpsink_test"); TCase *tc_chain = tcase_create ("linear"); /* Set timeout to 60 seconds. */ tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_udpsink); tcase_add_test (tc_chain, test_udpsink_bufferlist); return s; } GST_CHECK_MAIN (udpsink) gst-plugins-good-0.10.31/tests/check/elements/autodetect.c0000644000175000017500000001273411705527475020363 00000000000000/* GStreamer unit test for the autodetect elements * * Copyright (C) <2006> Tim-Philipp Müller * * 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 #endif #include GST_START_TEST (test_autovideosink_ghostpad_error_case) { GstStateChangeReturn state_ret; GstElement *pipeline, *src, *filter, *sink; GstCaps *caps; /* check that there's a usable video sink (think of build bot case) */ sink = gst_element_factory_make ("autovideosink", NULL); state_ret = gst_element_set_state (sink, GST_STATE_READY); /* need to set state back to NULL, or our test won't work since we * already have detected the real caps in ready and then linking fails */ gst_element_set_state (sink, GST_STATE_NULL); if (state_ret != GST_STATE_CHANGE_SUCCESS) { GST_WARNING ("No usable video sink, skipping test"); gst_object_unref (sink); return; } pipeline = gst_pipeline_new ("pipeline"); src = gst_element_factory_make ("fakesrc", NULL); filter = gst_element_factory_make ("capsfilter", NULL); caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('A', 'C', 'D', 'C'), NULL); g_object_set (filter, "caps", caps, NULL); gst_caps_unref (caps); gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); fail_unless (gst_element_link (src, filter), "Failed to link src to filter"); fail_unless (gst_element_link (filter, sink), "Failed to link filter to sink"); /* this should fail, there's no such format */ state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); if (state_ret == GST_STATE_CHANGE_ASYNC) { /* make sure we wait for the actual success/failure to happen */ GstState state; state_ret = gst_element_get_state (pipeline, &state, &state, GST_CLOCK_TIME_NONE); } fail_unless (state_ret == GST_STATE_CHANGE_FAILURE, "pipeline _set_state() to PAUSED succeeded but should have failed"); /* so, we hit an error and try to shut down the pipeline; this shouldn't * deadlock or block anywhere when autovideosink resets the ghostpad * targets etc. */ state_ret = gst_element_set_state (pipeline, GST_STATE_NULL); fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS, "State change on pipeline failed"); /* clean up */ gst_object_unref (pipeline); } GST_END_TEST; /* disable this for now, too many valgrind suppressions needed for libasound */ #if 0 GST_START_TEST (test_autoaudiosink_ghostpad_error_case) { GstStateChangeReturn state_ret; GstElement *pipeline, *src, *filter, *sink; GstCaps *caps; /* check that there's a usable audio sink (think of build bot case) */ sink = gst_element_factory_make ("autoaudiosink", NULL); state_ret = gst_element_set_state (sink, GST_STATE_READY); /* need to set state back to NULL, or our test won't work since we * already have detected the real caps in ready and then linking fails */ gst_element_set_state (sink, GST_STATE_NULL); if (state_ret != GST_STATE_CHANGE_SUCCESS) { GST_WARNING ("No usable audio sink, skipping test"); gst_object_unref (sink); return; } pipeline = gst_pipeline_new ("pipeline"); src = gst_element_factory_make ("fakesrc", NULL); filter = gst_element_factory_make ("capsfilter", NULL); caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 42, NULL); g_object_set (filter, "caps", caps, NULL); gst_caps_unref (caps); gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); fail_unless (gst_element_link (src, filter)); fail_unless (gst_element_link (filter, sink)); /* this should fail, there's no such width (hopefully) */ state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); fail_unless (state_ret == GST_STATE_CHANGE_FAILURE, "pipeline _set_state() to PAUSED succeeded but should have failed"); /* so, we hit an error and try to shut down the pipeline; this shouldn't * deadlock or block anywhere when autoaudiosink resets the ghostpad * targets etc. */ state_ret = gst_element_set_state (pipeline, GST_STATE_NULL); fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS); /* clean up */ gst_object_unref (pipeline); } GST_END_TEST; #endif static Suite * autodetect_suite (void) { guint maj, min, mic, nano; Suite *s = suite_create ("autodetect"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); gst_version (&maj, &min, &mic, &nano); /* requires fixes from 0.10.10.1, but don't want to add a hard dependency * in configure.ac just for this yet */ if (maj > 0 || min > 10 || mic > 10 || (mic == 10 && nano > 0)) { tcase_add_test (tc_chain, test_autovideosink_ghostpad_error_case); /* tcase_add_test (tc_chain, test_autoaudiosink_ghostpad_error_case); */ } return s; } GST_CHECK_MAIN (autodetect); gst-plugins-good-0.10.31/tests/check/elements/audioecho.c0000644000175000017500000001736611671175354020165 00000000000000/* GStreamer * * Copyright (C) 2009 Sebastian Dröge * * 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 gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define ECHO_CAPS_STRING \ "audio/x-raw-float, " \ "channels = (int) 2, " \ "rate = (int) 100000, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) [ 1, 2 ], " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) [ 1, 2 ], " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") ); static GstElement * setup_echo (void) { GstElement *echo; GST_DEBUG ("setup_echo"); echo = gst_check_setup_element ("audioecho"); mysrcpad = gst_check_setup_src_pad (echo, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (echo, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return echo; } static void cleanup_echo (GstElement * echo) { GST_DEBUG ("cleanup_echo"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (echo); gst_check_teardown_sink_pad (echo); gst_check_teardown_element (echo); } GST_START_TEST (test_passthrough) { GstElement *echo; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble in[] = { 1.0, -1.0, 0.0, 0.5, -0.5, 0.0 }; gdouble *res; echo = setup_echo (); g_object_set (G_OBJECT (echo), "delay", (GstClockTime) 1, "intensity", 0.0, "feedback", 0.0, NULL); fail_unless (gst_element_set_state (echo, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (sizeof (in)); memcpy (GST_BUFFER_DATA (inbuffer), in, sizeof (in)); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, sizeof (in)) == 0); caps = gst_caps_from_string (ECHO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+lf %+lf %+lf %+lf %+lf %+lf real %+lf %+lf %+lf %+lf %+lf %+lf", in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, sizeof (in)) == 0); /* cleanup */ cleanup_echo (echo); } GST_END_TEST; GST_START_TEST (test_echo) { GstElement *echo; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble in[] = { 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, }; gdouble out[] = { 1.0, -1.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0 }; gdouble *res; echo = setup_echo (); g_object_set (G_OBJECT (echo), "delay", (GstClockTime) 20000, "intensity", 1.0, "feedback", 0.0, NULL); fail_unless (gst_element_set_state (echo, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (sizeof (in)); memcpy (GST_BUFFER_DATA (inbuffer), in, sizeof (in)); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, sizeof (in)) == 0); caps = gst_caps_from_string (ECHO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf real %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf", out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], res[0], res[1], res[2], res[3], res[4], res[5], res[6], res[7], res[8], res[9]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, sizeof (out)) == 0); /* cleanup */ cleanup_echo (echo); } GST_END_TEST; GST_START_TEST (test_feedback) { GstElement *echo; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble in[] = { 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, }; gdouble out[] = { 1.0, -1.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, -1.0 }; gdouble *res; echo = setup_echo (); g_object_set (G_OBJECT (echo), "delay", (GstClockTime) 20000, "intensity", 1.0, "feedback", 1.0, NULL); fail_unless (gst_element_set_state (echo, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (sizeof (in)); memcpy (GST_BUFFER_DATA (inbuffer), in, sizeof (in)); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, sizeof (in)) == 0); caps = gst_caps_from_string (ECHO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf real %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf %+lf", out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], res[0], res[1], res[2], res[3], res[4], res[5], res[6], res[7], res[8], res[9]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, sizeof (out)) == 0); /* cleanup */ cleanup_echo (echo); } GST_END_TEST; static Suite * audioecho_suite (void) { Suite *s = suite_create ("audioecho"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_passthrough); tcase_add_test (tc_chain, test_echo); tcase_add_test (tc_chain, test_feedback); return s; } GST_CHECK_MAIN (audioecho); gst-plugins-good-0.10.31/tests/check/elements/audiochebband.c0000644000175000017500000014063411671175354020770 00000000000000/* GStreamer * * Copyright (C) 2007 Sebastian Dröge * * audiochebband.c: Unit test for the audiochebband element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define BUFFER_CAPS_STRING_32 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 32" \ #define BUFFER_CAPS_STRING_64 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" \ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") ); static GstElement * setup_audiochebband (void) { GstElement *audiochebband; GST_DEBUG ("setup_audiochebband"); audiochebband = gst_check_setup_element ("audiochebband"); mysrcpad = gst_check_setup_src_pad (audiochebband, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (audiochebband, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return audiochebband; } static void cleanup_audiochebband (GstElement * audiochebband) { GST_DEBUG ("cleanup_audiochebband"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (audiochebband); gst_check_teardown_sink_pad (audiochebband); gst_check_teardown_element (audiochebband); } /* Test if data containing only one frequency component * at 0 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_32_bp_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is preserved with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_32_bp_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.6); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_32_bp_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_32_br_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is erased with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_32_br_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_32_br_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_64_bp_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is preserved with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_64_bp_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.6); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_64_bp_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_64_br_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is erased with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_64_br_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type1_64_br_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 1, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_32_bp_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is preserved with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_32_bp_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.6); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_32_bp_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_32_br_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is erased with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_32_br_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_32_br_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_64_bp_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is preserved with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_64_bp_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.6); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_64_bp_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiochebband), "mode", 0, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_64_br_0hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at band center is erased with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_64_br_11025hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_type2_64_br_22050hz) { GstElement *audiochebband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiochebband = setup_audiochebband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiochebband), "mode", 1, NULL); g_object_set (G_OBJECT (audiochebband), "poles", 8, NULL); g_object_set (G_OBJECT (audiochebband), "type", 2, NULL); g_object_set (G_OBJECT (audiochebband), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiochebband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiochebband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiochebband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 1024; i++) rms += res[i] * res[i]; rms = sqrt (rms / 1024.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiochebband (audiochebband); } GST_END_TEST; static Suite * audiochebband_suite (void) { Suite *s = suite_create ("audiochebband"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_type1_32_bp_0hz); tcase_add_test (tc_chain, test_type1_32_bp_11025hz); tcase_add_test (tc_chain, test_type1_32_bp_22050hz); tcase_add_test (tc_chain, test_type1_32_br_0hz); tcase_add_test (tc_chain, test_type1_32_br_11025hz); tcase_add_test (tc_chain, test_type1_32_br_22050hz); tcase_add_test (tc_chain, test_type1_64_bp_0hz); tcase_add_test (tc_chain, test_type1_64_bp_11025hz); tcase_add_test (tc_chain, test_type1_64_bp_22050hz); tcase_add_test (tc_chain, test_type1_64_br_0hz); tcase_add_test (tc_chain, test_type1_64_br_11025hz); tcase_add_test (tc_chain, test_type1_64_br_22050hz); tcase_add_test (tc_chain, test_type2_32_bp_0hz); tcase_add_test (tc_chain, test_type2_32_bp_11025hz); tcase_add_test (tc_chain, test_type2_32_bp_22050hz); tcase_add_test (tc_chain, test_type2_32_br_0hz); tcase_add_test (tc_chain, test_type2_32_br_11025hz); tcase_add_test (tc_chain, test_type2_32_br_22050hz); tcase_add_test (tc_chain, test_type2_64_bp_0hz); tcase_add_test (tc_chain, test_type2_64_bp_11025hz); tcase_add_test (tc_chain, test_type2_64_bp_22050hz); tcase_add_test (tc_chain, test_type2_64_br_0hz); tcase_add_test (tc_chain, test_type2_64_br_11025hz); tcase_add_test (tc_chain, test_type2_64_br_22050hz); return s; } int main (int argc, char **argv) { int nf; Suite *s = audiochebband_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/wavpackenc.c0000644000175000017500000001304111671175354020331 00000000000000/* GStreamer * * unit test for wavpackenc * * Copyright (c) 2006 Sebastian Dröge * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; static GstBus *bus; #define RAW_CAPS_STRING "audio/x-raw-int, " \ "width = (int) 32, " \ "depth = (int) 16, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "signed = (boolean) true" #define WAVPACK_CAPS_STRING "audio/x-wavpack, " \ "width = (int) 16, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "framed = (boolean) true" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack, " "width = (int) 16, " "channels = (int) 1, " "rate = (int) 44100, " "framed = (boolean) true")); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "width = (int) 32, " "depth = (int) 16, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) true")); static GstElement * setup_wavpackenc (void) { GstElement *wavpackenc; GST_DEBUG ("setup_wavpackenc"); wavpackenc = gst_check_setup_element ("wavpackenc"); mysrcpad = gst_check_setup_src_pad (wavpackenc, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (wavpackenc, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); fail_unless (gst_element_set_state (wavpackenc, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); bus = gst_bus_new (); return wavpackenc; } static void cleanup_wavpackenc (GstElement * wavpackenc) { GST_DEBUG ("cleanup_wavpackenc"); gst_bus_set_flushing (bus, TRUE); gst_element_set_bus (wavpackenc, NULL); gst_object_unref (GST_OBJECT (bus)); gst_element_set_state (wavpackenc, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (wavpackenc); gst_check_teardown_sink_pad (wavpackenc); gst_check_teardown_element (wavpackenc); } GST_START_TEST (test_encode_silence) { GstElement *wavpackenc; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; GstEvent *eos = gst_event_new_eos (); int i, num_buffers; wavpackenc = setup_wavpackenc (); inbuffer = gst_buffer_new_and_alloc (1000); for (i = 0; i < 1000; i++) GST_BUFFER_DATA (inbuffer)[i] = 0; caps = gst_caps_from_string (RAW_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_ref (inbuffer); gst_element_set_bus (wavpackenc, bus); fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_unref (inbuffer); fail_if (gst_pad_push_event (mysrcpad, eos) != TRUE); /* check first buffer */ outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 0); fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 0); fail_unless_equals_int (GST_BUFFER_DURATION (outbuffer), 5668934); fail_unless_equals_int (GST_BUFFER_OFFSET_END (outbuffer), 250); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), "wvpk", 4) == 0, "Failed to encode to valid Wavpack frames"); /* free all buffers */ num_buffers = g_list_length (buffers); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); gst_buffer_unref (outbuffer); outbuffer = NULL; } g_list_free (buffers); buffers = NULL; cleanup_wavpackenc (wavpackenc); } GST_END_TEST; static Suite * wavpackenc_suite (void) { Suite *s = suite_create ("wavpackenc"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_encode_silence); return s; } int main (int argc, char **argv) { int nf; Suite *s = wavpackenc_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/audiofirfilter.c0000644000175000017500000001072111671175354021221 00000000000000/* GStreamer * * Copyright (C) 2009 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include static gboolean have_eos = FALSE; static gboolean on_message (GstBus * bus, GstMessage * message, gpointer user_data) { GMainLoop *loop = (GMainLoop *) user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: case GST_MESSAGE_WARNING: g_assert_not_reached (); g_main_loop_quit (loop); break; case GST_MESSAGE_EOS: have_eos = TRUE; g_main_loop_quit (loop); break; default: break; } return TRUE; } static void on_rate_changed (GstElement * element, gint rate, gpointer user_data) { GValueArray *va; GValue v = { 0, }; fail_unless (rate > 0); va = g_value_array_new (6); g_value_init (&v, G_TYPE_DOUBLE); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 1.0); g_value_array_append (va, &v); g_value_reset (&v); g_object_set (G_OBJECT (element), "kernel", va, NULL); g_value_array_free (va); } static gboolean have_data = FALSE; static void on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { if (!have_data) { gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer); fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble)); fail_unless (data[0] == 0.0); fail_unless (data[1] == 0.0); fail_unless (data[2] == 0.0); fail_unless (data[3] == 0.0); fail_unless (data[4] == 0.0); fail_unless (data[5] != 0.0); have_data = TRUE; } } GST_START_TEST (test_pipeline) { GstElement *pipeline, *src, *filter, *sink; GstBus *bus; GMainLoop *loop; have_data = FALSE; have_eos = FALSE; pipeline = gst_element_factory_make ("pipeline", NULL); fail_unless (pipeline != NULL); src = gst_element_factory_make ("audiotestsrc", NULL); fail_unless (src != NULL); g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL); filter = gst_element_factory_make ("audiofirfilter", NULL); fail_unless (filter != NULL); g_signal_connect (G_OBJECT (filter), "rate-changed", G_CALLBACK (on_rate_changed), NULL); sink = gst_element_factory_make ("fakesink", NULL); fail_unless (sink != NULL); g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL); gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); fail_unless (gst_element_link_many (src, filter, sink, NULL)); loop = g_main_loop_new (NULL, FALSE); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); fail_if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); g_main_loop_run (loop); fail_unless (have_data); fail_unless (have_eos); fail_unless (gst_element_set_state (pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); g_main_loop_unref (loop); gst_object_unref (pipeline); } GST_END_TEST; static Suite * audiofirfilter_suite (void) { Suite *s = suite_create ("audiofirfilter"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_pipeline); return s; } GST_CHECK_MAIN (audiofirfilter); gst-plugins-good-0.10.31/tests/check/elements/qtmux.c0000644000175000017500000006501011701111632017347 00000000000000/* GStreamer * * unit test for qtmux * * Copyright (C) <2008> Mark Nauwelaerts * * 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 #endif #ifdef HAVE_UNISTD_H #include #endif #include #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; #define AUDIO_CAPS_STRING "audio/mpeg, " \ "mpegversion = (int) 1, " \ "layer = (int) 3, " \ "channels = (int) 2, " \ "rate = (int) 48000" #define AUDIO_AAC_CAPS_STRING "audio/mpeg, " \ "mpegversion=(int)4, " \ "channels=(int)1, " \ "rate=(int)44100, " \ "stream-format=(string)raw, " \ "level=(string)2, " \ "base-profile=(string)lc, " \ "profile=(string)lc, " \ "codec_data=(buffer)1208" #define VIDEO_CAPS_STRING "video/mpeg, " \ "mpegversion = (int) 4, " \ "systemstream = (boolean) false, " \ "width = (int) 384, " \ "height = (int) 288, " \ "framerate = (fraction) 25/1" #define VIDEO_CAPS_H264_STRING "video/x-h264, " \ "width=(int)320, " \ "height=(int)240, " \ "framerate=(fraction)30/1, " \ "pixel-aspect-ratio=(fraction)1/1, " \ "codec_data=(buffer)01640014ffe1001867640014a" \ "cd94141fb0110000003001773594000f14299600" \ "1000568ebecb22c, " \ "stream-format=(string)avc, " \ "alignment=(string)au, " \ "level=(string)2, " \ "profile=(string)high" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/quicktime")); static GstStaticPadTemplate srcvideotemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_STRING)); static GstStaticPadTemplate srcvideoh264template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_H264_STRING)); static GstStaticPadTemplate srcaudiotemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (AUDIO_CAPS_STRING)); static GstStaticPadTemplate srcaudioaactemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (AUDIO_AAC_CAPS_STRING)); /* setup and teardown needs some special handling for muxer */ static GstPad * setup_src_pad (GstElement * element, GstStaticPadTemplate * template, GstCaps * caps, const gchar * sinkname) { GstPad *srcpad, *sinkpad; GST_DEBUG_OBJECT (element, "setting up sending pad"); /* sending pad */ srcpad = gst_pad_new_from_static_template (template, "src"); fail_if (srcpad == NULL, "Could not create a srcpad"); ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); if (!(sinkpad = gst_element_get_static_pad (element, sinkname))) sinkpad = gst_element_get_request_pad (element, sinkname); fail_if (sinkpad == NULL, "Could not get sink pad from %s", GST_ELEMENT_NAME (element)); /* references are owned by: 1) us, 2) qtmux, 3) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); if (caps) fail_unless (gst_pad_set_caps (srcpad, caps)); fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); gst_object_unref (sinkpad); /* because we got it higher up */ /* references are owned by: 1) qtmux, 2) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); return srcpad; } static void teardown_src_pad (GstPad * srcpad) { GstPad *sinkpad; /* clean up floating src pad */ sinkpad = gst_pad_get_peer (srcpad); fail_if (sinkpad == NULL); /* pad refs held by 1) qtmux 2) collectpads and 3) us (through _get_peer) */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); gst_pad_unlink (srcpad, sinkpad); /* after unlinking, pad refs still held by * 1) qtmux and 2) collectpads and 3) us (through _get_peer) */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); gst_object_unref (sinkpad); /* one more ref is held by element itself */ /* pad refs held by creator */ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); gst_object_unref (srcpad); } static GstElement * setup_qtmux (GstStaticPadTemplate * srctemplate, const gchar * sinkname) { GstElement *qtmux; GST_DEBUG ("setup_qtmux"); qtmux = gst_check_setup_element ("qtmux"); mysrcpad = setup_src_pad (qtmux, srctemplate, NULL, sinkname); mysinkpad = gst_check_setup_sink_pad (qtmux, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return qtmux; } static void cleanup_qtmux (GstElement * qtmux, const gchar * sinkname) { GST_DEBUG ("cleanup_qtmux"); gst_element_set_state (qtmux, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); teardown_src_pad (mysrcpad); gst_check_teardown_sink_pad (qtmux); gst_check_teardown_element (qtmux); } static void check_qtmux_pad (GstStaticPadTemplate * srctemplate, const gchar * sinkname, guint32 dts_method) { GstElement *qtmux; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; int num_buffers; int i; guint8 data0[12] = "\000\000\000\024ftypqt "; guint8 data1[8] = "\000\000\000\001mdat"; guint8 data2[4] = "moov"; qtmux = setup_qtmux (srctemplate, sinkname); g_object_set (qtmux, "dts-method", dts_method, NULL); fail_unless (gst_element_set_state (qtmux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; GST_BUFFER_DURATION (inbuffer) = 40 * GST_MSECOND; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* send eos to have moov written */ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); num_buffers = g_list_length (buffers); /* at least expect ftyp, mdat header, buffer chunk and moov */ fail_unless (num_buffers >= 4); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); switch (i) { case 0: { /* ftyp header */ guint8 *data = GST_BUFFER_DATA (outbuffer); fail_unless (GST_BUFFER_SIZE (outbuffer) >= 20); fail_unless (memcmp (data, data0, sizeof (data0)) == 0); fail_unless (memcmp (data + 16, data0 + 8, 4) == 0); break; } case 1: /* mdat header */ fail_unless (GST_BUFFER_SIZE (outbuffer) == 16); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), data1, sizeof (data1)) == 0); break; case 2: /* buffer we put in */ fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); break; case 3: /* moov */ fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data2, sizeof (data2)) == 0); break; default: break; } ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } g_list_free (buffers); buffers = NULL; cleanup_qtmux (qtmux, sinkname); } static void check_qtmux_pad_fragmented (GstStaticPadTemplate * srctemplate, const gchar * sinkname, guint32 dts_method, gboolean streamable) { GstElement *qtmux; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; int num_buffers; int i; guint8 data0[12] = "\000\000\000\024ftypqt "; guint8 data1[4] = "mdat"; guint8 data2[4] = "moov"; guint8 data3[4] = "moof"; guint8 data4[4] = "mfra"; qtmux = setup_qtmux (srctemplate, sinkname); g_object_set (qtmux, "dts-method", dts_method, NULL); g_object_set (qtmux, "fragment-duration", 2000, NULL); g_object_set (qtmux, "streamable", streamable, NULL); fail_unless (gst_element_set_state (qtmux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; GST_BUFFER_DURATION (inbuffer) = 40 * GST_MSECOND; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* send eos to have all written */ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); num_buffers = g_list_length (buffers); /* at least expect ftyp, moov, moof, mdat header, buffer chunk * and optionally mfra */ fail_unless (num_buffers >= 5); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); switch (i) { case 0: { /* ftyp header */ guint8 *data = GST_BUFFER_DATA (outbuffer); fail_unless (GST_BUFFER_SIZE (outbuffer) >= 20); fail_unless (memcmp (data, data0, sizeof (data0)) == 0); fail_unless (memcmp (data + 16, data0 + 8, 4) == 0); break; } case 1: /* moov */ fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data2, sizeof (data2)) == 0); break; case 2: /* moof */ fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data3, sizeof (data3)) == 0); break; case 3: /* mdat header */ fail_unless (GST_BUFFER_SIZE (outbuffer) == 8); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data1, sizeof (data1)) == 0); break; case 4: /* buffer we put in */ fail_unless (GST_BUFFER_SIZE (outbuffer) == 1); break; case 5: /* mfra */ fail_unless (GST_BUFFER_SIZE (outbuffer) > 8); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer) + 4, data4, sizeof (data4)) == 0); break; default: break; } ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } g_list_free (buffers); buffers = NULL; cleanup_qtmux (qtmux, sinkname); } /* dts-method dd */ GST_START_TEST (test_video_pad_dd) { check_qtmux_pad (&srcvideotemplate, "video_%d", 0); } GST_END_TEST; GST_START_TEST (test_audio_pad_dd) { check_qtmux_pad (&srcaudiotemplate, "audio_%d", 0); } GST_END_TEST; GST_START_TEST (test_video_pad_frag_dd) { check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 0, FALSE); } GST_END_TEST; GST_START_TEST (test_audio_pad_frag_dd) { check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 0, FALSE); } GST_END_TEST; GST_START_TEST (test_video_pad_frag_dd_streamable) { check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 0, TRUE); } GST_END_TEST; GST_START_TEST (test_audio_pad_frag_dd_streamable) { check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 0, TRUE); } GST_END_TEST; /* dts-method reorder */ GST_START_TEST (test_video_pad_reorder) { check_qtmux_pad (&srcvideotemplate, "video_%d", 1); } GST_END_TEST; GST_START_TEST (test_audio_pad_reorder) { check_qtmux_pad (&srcaudiotemplate, "audio_%d", 1); } GST_END_TEST; GST_START_TEST (test_video_pad_frag_reorder) { check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 1, FALSE); } GST_END_TEST; GST_START_TEST (test_audio_pad_frag_reorder) { check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 1, FALSE); } GST_END_TEST; GST_START_TEST (test_video_pad_frag_reorder_streamable) { check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 1, TRUE); } GST_END_TEST; GST_START_TEST (test_audio_pad_frag_reorder_streamable) { check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 1, TRUE); } GST_END_TEST; /* dts-method asc */ GST_START_TEST (test_video_pad_asc) { check_qtmux_pad (&srcvideotemplate, "video_%d", 2); } GST_END_TEST; GST_START_TEST (test_audio_pad_asc) { check_qtmux_pad (&srcaudiotemplate, "audio_%d", 2); } GST_END_TEST; GST_START_TEST (test_video_pad_frag_asc) { check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 2, FALSE); } GST_END_TEST; GST_START_TEST (test_audio_pad_frag_asc) { check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 2, FALSE); } GST_END_TEST; GST_START_TEST (test_video_pad_frag_asc_streamable) { check_qtmux_pad_fragmented (&srcvideotemplate, "video_%d", 2, TRUE); } GST_END_TEST; GST_START_TEST (test_audio_pad_frag_asc_streamable) { check_qtmux_pad_fragmented (&srcaudiotemplate, "audio_%d", 2, TRUE); } GST_END_TEST; GST_START_TEST (test_reuse) { GstElement *qtmux = setup_qtmux (&srcvideotemplate, "video_%d"); GstBuffer *inbuffer; GstCaps *caps; gst_element_set_state (qtmux, GST_STATE_PLAYING); gst_element_set_state (qtmux, GST_STATE_NULL); gst_element_set_state (qtmux, GST_STATE_PLAYING); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); inbuffer = gst_buffer_new_and_alloc (1); fail_unless (inbuffer != NULL); caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; GST_BUFFER_DURATION (inbuffer) = 40 * GST_MSECOND; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* send eos to have all written */ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); cleanup_qtmux (qtmux, "video_%d"); } GST_END_TEST; static GstEncodingContainerProfile * create_qtmux_profile (const gchar * variant) { GstEncodingContainerProfile *cprof; GstCaps *caps; if (variant == NULL) { caps = gst_caps_new_simple ("video/quicktime", NULL); } else { caps = gst_caps_new_simple ("video/quicktime", "variant", G_TYPE_STRING, variant, NULL); } cprof = gst_encoding_container_profile_new ("Name", "blah", caps, NULL); gst_caps_unref (caps); caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, 4321, "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, 44100, "signed", G_TYPE_BOOLEAN, TRUE, NULL); gst_encoding_container_profile_add_profile (cprof, GST_ENCODING_PROFILE (gst_encoding_audio_profile_new (caps, NULL, NULL, 1))); gst_caps_unref (caps); return cprof; } GST_START_TEST (test_encodebin_qtmux) { GstEncodingContainerProfile *cprof; GstElement *enc; GstPad *pad; enc = gst_element_factory_make ("encodebin", NULL); if (enc == NULL) return; /* Make sure encodebin finds a muxer for a profile with a variant field .. */ cprof = create_qtmux_profile ("apple"); g_object_set (enc, "profile", cprof, NULL); gst_encoding_profile_unref (cprof); /* should have created a pad after setting the profile */ pad = gst_element_get_static_pad (enc, "audio_0"); fail_unless (pad != NULL); gst_object_unref (pad); gst_object_unref (enc); /* ... and for a profile without a variant field */ enc = gst_element_factory_make ("encodebin", NULL); cprof = create_qtmux_profile (NULL); g_object_set (enc, "profile", cprof, NULL); gst_encoding_profile_unref (cprof); /* should have created a pad after setting the profile */ pad = gst_element_get_static_pad (enc, "audio_0"); fail_unless (pad != NULL); gst_object_unref (pad); gst_object_unref (enc); } GST_END_TEST; /* Fake mp3 encoder for test */ typedef GstElement TestMp3Enc; typedef GstElementClass TestMp3EncClass; static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, mpegversion=1, layer=[1,3]") ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int") ); static GType test_mp3_enc_get_type (void); GST_BOILERPLATE (TestMp3Enc, test_mp3_enc, GstElement, GST_TYPE_ELEMENT); static void test_mp3_enc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "MPEG1 Audio Encoder", "Codec/Encoder/Audio", "Pretends to encode mp3", "Foo Bar "); } static void test_mp3_enc_class_init (TestMp3EncClass * klass) { /* doesn't actually need to do anything for this test */ } static void test_mp3_enc_init (TestMp3Enc * mp3enc, TestMp3EncClass * klass) { GstPad *pad; pad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_element_add_pad (mp3enc, pad); pad = gst_pad_new_from_static_template (&src_template, "src"); gst_element_add_pad (mp3enc, pad); } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "testmp3enc", GST_RANK_NONE, test_mp3_enc_get_type ()); } static GstEncodingContainerProfile * create_mp4mux_profile (void) { GstEncodingContainerProfile *cprof; GstCaps *caps; caps = gst_caps_new_simple ("video/quicktime", "variant", G_TYPE_STRING, "iso", NULL); cprof = gst_encoding_container_profile_new ("Name", "blah", caps, NULL); gst_caps_unref (caps); caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, 44100, NULL); gst_encoding_container_profile_add_profile (cprof, GST_ENCODING_PROFILE (gst_encoding_audio_profile_new (caps, NULL, NULL, 1))); gst_caps_unref (caps); return cprof; } GST_START_TEST (test_encodebin_mp4mux) { GstEncodingContainerProfile *cprof; GstPluginFeature *feature; GstElement *enc, *mux; GstPad *pad; /* need a fake mp3 encoder because mp4 only accepts encoded formats */ gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR, "fakemp3enc", "fakemp3enc", plugin_init, VERSION, "LGPL", "gst-plugins-good", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); feature = gst_default_registry_find_feature ("testmp3enc", GST_TYPE_ELEMENT_FACTORY); gst_plugin_feature_set_rank (feature, GST_RANK_PRIMARY + 100); enc = gst_element_factory_make ("encodebin", NULL); if (enc == NULL) return; /* Make sure encodebin finds mp4mux even though qtmux outputs a superset */ cprof = create_mp4mux_profile (); g_object_set (enc, "profile", cprof, NULL); gst_encoding_profile_unref (cprof); /* should have created a pad after setting the profile */ pad = gst_element_get_static_pad (enc, "audio_0"); fail_unless (pad != NULL); gst_object_unref (pad); mux = gst_bin_get_by_interface (GST_BIN (enc), GST_TYPE_TAG_SETTER); fail_unless (mux != NULL); { GstElementFactory *f = gst_element_get_factory (mux); /* make sure we got mp4mux for variant=iso */ GST_INFO ("muxer: %s", G_OBJECT_TYPE_NAME (mux)); fail_unless_equals_string (GST_PLUGIN_FEATURE_NAME (f), "mp4mux"); } gst_object_unref (mux); gst_object_unref (enc); gst_plugin_feature_set_rank (feature, GST_RANK_NONE); gst_object_unref (feature); } GST_END_TEST; static gboolean extract_tags (const gchar * location, GstTagList ** taglist) { gboolean ret = TRUE; GstElement *src; GstBus *bus; GstElement *pipeline = gst_parse_launch ("filesrc name=src ! qtdemux ! fakesink", NULL); src = gst_bin_get_by_name (GST_BIN (pipeline), "src"); g_object_set (src, "location", location, NULL); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); fail_unless (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE); if (*taglist == NULL) { *taglist = gst_tag_list_new (); } while (1) { GstMessage *msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_TAG | GST_MESSAGE_ERROR | GST_MESSAGE_EOS); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { gst_message_unref (msg); break; } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { ret = FALSE; gst_message_unref (msg); break; } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_TAG) { GstTagList *tags; gst_message_parse_tag (msg, &tags); gst_tag_list_insert (*taglist, tags, GST_TAG_MERGE_REPLACE); gst_tag_list_free (tags); } gst_message_unref (msg); } gst_object_unref (bus); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (src); gst_object_unref (pipeline); return ret; } static void test_average_bitrate_custom (const gchar * elementname, GstStaticPadTemplate * tmpl, const gchar * sinkpadname) { gchar *location; GstElement *qtmux; GstElement *filesink; GstBuffer *inbuffer; GstCaps *caps; int i; gint bytes[] = { 16, 22, 12 }; gint64 durations[] = { GST_SECOND * 3, GST_SECOND * 5, GST_SECOND * 2 }; gint64 total_bytes = 0; GstClockTime total_duration = 0; location = g_strdup_printf ("%s/%s-%d", g_get_tmp_dir (), "qtmuxtest", g_random_int ()); GST_INFO ("Using location %s for bitrate test", location); qtmux = gst_check_setup_element (elementname); filesink = gst_element_factory_make ("filesink", NULL); g_object_set (filesink, "location", location, NULL); gst_element_link (qtmux, filesink); mysrcpad = setup_src_pad (qtmux, tmpl, NULL, sinkpadname); fail_unless (mysrcpad != NULL); gst_pad_set_active (mysrcpad, TRUE); fail_unless (gst_element_set_state (filesink, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set filesink to playing"); fail_unless (gst_element_set_state (qtmux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); for (i = 0; i < 3; i++) { inbuffer = gst_buffer_new_and_alloc (bytes[i]); caps = gst_caps_copy (gst_pad_get_pad_template_caps (mysrcpad)); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = total_duration; GST_BUFFER_DURATION (inbuffer) = (GstClockTime) durations[i]; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); total_bytes += GST_BUFFER_SIZE (inbuffer); total_duration += GST_BUFFER_DURATION (inbuffer); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); } /* send eos to have moov written */ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); gst_element_set_state (qtmux, GST_STATE_NULL); gst_element_set_state (filesink, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); teardown_src_pad (mysrcpad); gst_object_unref (filesink); gst_check_teardown_element (qtmux); /* check the bitrate tag */ { GstTagList *taglist = NULL; guint bitrate = 0; guint expected; fail_unless (extract_tags (location, &taglist)); fail_unless (gst_tag_list_get_uint (taglist, GST_TAG_BITRATE, &bitrate)); expected = (guint) gst_util_uint64_scale_round ((guint64) total_bytes, (guint64) 8 * GST_SECOND, (guint64) total_duration); fail_unless (bitrate == expected); gst_tag_list_free (taglist); } /* delete file */ g_unlink (location); g_free (location); } GST_START_TEST (test_average_bitrate) { test_average_bitrate_custom ("mp4mux", &srcaudioaactemplate, "audio_%d"); test_average_bitrate_custom ("mp4mux", &srcvideoh264template, "video_%d"); test_average_bitrate_custom ("qtmux", &srcaudioaactemplate, "audio_%d"); test_average_bitrate_custom ("qtmux", &srcvideoh264template, "video_%d"); } GST_END_TEST; static Suite * qtmux_suite (void) { Suite *s = suite_create ("qtmux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_video_pad_dd); tcase_add_test (tc_chain, test_audio_pad_dd); tcase_add_test (tc_chain, test_video_pad_frag_dd); tcase_add_test (tc_chain, test_audio_pad_frag_dd); tcase_add_test (tc_chain, test_video_pad_frag_dd_streamable); tcase_add_test (tc_chain, test_audio_pad_frag_dd_streamable); tcase_add_test (tc_chain, test_video_pad_reorder); tcase_add_test (tc_chain, test_audio_pad_reorder); tcase_add_test (tc_chain, test_video_pad_frag_reorder); tcase_add_test (tc_chain, test_audio_pad_frag_reorder); tcase_add_test (tc_chain, test_video_pad_frag_reorder_streamable); tcase_add_test (tc_chain, test_audio_pad_frag_reorder_streamable); tcase_add_test (tc_chain, test_video_pad_asc); tcase_add_test (tc_chain, test_audio_pad_asc); tcase_add_test (tc_chain, test_video_pad_frag_asc); tcase_add_test (tc_chain, test_audio_pad_frag_asc); tcase_add_test (tc_chain, test_video_pad_frag_asc_streamable); tcase_add_test (tc_chain, test_audio_pad_frag_asc_streamable); tcase_add_test (tc_chain, test_average_bitrate); tcase_add_test (tc_chain, test_reuse); tcase_add_test (tc_chain, test_encodebin_qtmux); tcase_add_test (tc_chain, test_encodebin_mp4mux); return s; } GST_CHECK_MAIN (qtmux) gst-plugins-good-0.10.31/tests/check/elements/audioamplify.c0000644000175000017500000003700511671175354020700 00000000000000/* GStreamer * * unit test for audioamplify * * Copyright (C) 2007 Sebastian Dröge * * Greatly based on the audiopanorama unit test * Copyright (C) 2006 Stefan Kost * * 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 #include #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define AMPLIFY_CAPS_STRING \ "audio/x-raw-int, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (bool) TRUE" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstElement * setup_amplify (void) { GstElement *amplify; GST_DEBUG ("setup_amplify"); amplify = gst_check_setup_element ("audioamplify"); mysrcpad = gst_check_setup_src_pad (amplify, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (amplify, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return amplify; } static void cleanup_amplify (GstElement * amplify) { GST_DEBUG ("cleanup_amplify"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (amplify); gst_check_teardown_sink_pad (amplify); gst_check_teardown_element (amplify); } GST_START_TEST (test_passthrough) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 *res; amplify = setup_amplify (); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_zero) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { 0, 0, 0, 0, 0, 0 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 0.0, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_050_clip) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_200_clip) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { G_MAXINT16, -32768, 512, -256, 0, G_MININT16 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_050_wrap_negative) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL); g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_200_wrap_negative) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { -16384, -32768, 512, -256, 0, 16384 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL); g_object_set (G_OBJECT (amplify), "clipping-method", 1, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_050_wrap_positive) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { 12288, -8192, 128, -64, 0, -12288 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 0.5, NULL); g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; GST_START_TEST (test_200_wrap_positive) { GstElement *amplify; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 out[6] = { 16382, -32768, 512, -256, 0, -16384 }; gint16 *res; amplify = setup_amplify (); g_object_set (G_OBJECT (amplify), "amplification", 2.0, NULL); g_object_set (G_OBJECT (amplify), "clipping-method", 2, NULL); fail_unless (gst_element_set_state (amplify, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (AMPLIFY_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], out[4], out[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 12) == 0); /* cleanup */ cleanup_amplify (amplify); } GST_END_TEST; static Suite * amplify_suite (void) { Suite *s = suite_create ("amplify"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_passthrough); tcase_add_test (tc_chain, test_zero); tcase_add_test (tc_chain, test_050_clip); tcase_add_test (tc_chain, test_200_clip); tcase_add_test (tc_chain, test_050_wrap_negative); tcase_add_test (tc_chain, test_200_wrap_negative); tcase_add_test (tc_chain, test_050_wrap_positive); tcase_add_test (tc_chain, test_200_wrap_positive); return s; } int main (int argc, char **argv) { int nf; Suite *s = amplify_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/avisubtitle.c0000644000175000017500000002343411671175354020551 00000000000000/* GStreamer * * unit test for avisubtitle * * Copyright (C) <2007> Thijs Vermeir * * 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. */ /* Element-Checklist-Version: 5 */ #include #include #include GstPad *mysinkpad; GstPad *mysrcpad; guint8 avisub_utf_8_with_bom[] = { 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62, 0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38, 0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, 0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d, 0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, 0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a }; static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-subtitle") ); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-subtitle-avi") ); static GstElement * setup_avisubtitle (void) { GstElement *avisubtitle; GstCaps *caps; GST_DEBUG ("setup_avisubtitle"); avisubtitle = gst_check_setup_element ("avisubtitle"); caps = gst_caps_new_simple ("application/x-subtitle", NULL); mysinkpad = gst_check_setup_sink_pad (avisubtitle, &sink_template, caps); gst_caps_unref (caps); caps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); mysrcpad = gst_check_setup_src_pad (avisubtitle, &src_template, caps); gst_caps_unref (caps); gst_pad_set_active (mysinkpad, TRUE); gst_pad_set_active (mysrcpad, TRUE); return avisubtitle; } static void cleanup_avisubtitle (GstElement * avisubtitle) { gst_pad_set_active (mysinkpad, FALSE); gst_pad_set_active (mysrcpad, FALSE); gst_check_teardown_sink_pad (avisubtitle); gst_check_teardown_src_pad (avisubtitle); gst_check_teardown_element (avisubtitle); } static void check_wrong_buffer (guint8 * data, guint length) { GstBuffer *buffer = gst_buffer_new (); GstElement *avisubtitle = setup_avisubtitle (); gst_buffer_set_data (buffer, data, length); fail_unless (gst_element_set_state (avisubtitle, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); gst_buffer_ref (buffer); ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 2); /* push the broken buffer */ fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_ERROR, "accepted a broken buffer"); /* check if we have unreffed this buffer on failure */ ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); gst_buffer_unref (buffer); fail_unless (gst_element_set_state (avisubtitle, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); cleanup_avisubtitle (avisubtitle); } static void check_correct_buffer (guint8 * src_data, guint src_size, guint8 * dst_data, guint dst_size) { GstBuffer *buffer = gst_buffer_new (); GstBuffer *newBuffer; GstElement *avisubtitle = setup_avisubtitle (); GstEvent *event; fail_unless (g_list_length (buffers) == 0, "Buffers list needs to be empty"); gst_buffer_set_data (buffer, src_data, src_size); fail_unless (gst_element_set_state (avisubtitle, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); ASSERT_BUFFER_REFCOUNT (buffer, "inbuffer", 1); event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 2 * GST_SECOND, GST_SEEK_TYPE_SET, 5 * GST_SECOND); fail_unless (gst_element_send_event (avisubtitle, event) == FALSE, "Seeking is not possible when there is no buffer yet"); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK, "not accepted a correct buffer"); /* we gave away our reference to the buffer, don't assume anything */ buffer = NULL; /* a new buffer is created in the list */ fail_unless (g_list_length (buffers) == 1, "No new buffer in the buffers list"); event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 2 * GST_SECOND, GST_SEEK_TYPE_SET, 5 * GST_SECOND); fail_unless (gst_element_send_event (avisubtitle, event) == TRUE, "seeking should be working now"); fail_unless (g_list_length (buffers) == 2, "After seeking we need another buffer in the buffers"); newBuffer = GST_BUFFER (buffers->data); buffers = g_list_remove (buffers, newBuffer); fail_unless (g_list_length (buffers) == 1, "Buffers list needs to be empty"); fail_unless (GST_BUFFER_SIZE (newBuffer) == dst_size, "size of the new buffer is wrong ( %d != %d)", GST_BUFFER_SIZE (newBuffer), dst_size); fail_unless (memcmp (GST_BUFFER_DATA (newBuffer), dst_data, dst_size) == 0, "data of the buffer is not correct"); gst_buffer_unref (newBuffer); /* free the buffer from seeking */ gst_buffer_unref (GST_BUFFER (buffers->data)); buffers = g_list_remove (buffers, buffers->data); fail_unless (gst_element_set_state (avisubtitle, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); cleanup_avisubtitle (avisubtitle); } GST_START_TEST (test_avisubtitle_negative) { guint8 wrong_magic[] = { 0x47, 0x41, 0x41, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; guint8 wrong_fixed_word_2[] = { 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68 }; guint8 wrong_length_after_name[] = { 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68 }; guint8 wrong_fixed_word_4[] = { 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x04, 0x01, 0x8e, 0x00, 0x00, 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30 }; guint8 wrong_total_length[] = { 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8e, 0x00, 0x00, 0x00, 0xef, 0xbb, 0xbf, 0x31, 0x0d, 0x0a, 0x30 }; /* size of the buffer must be larger than 11 */ check_wrong_buffer (avisub_utf_8_with_bom, 11); /* buffer must start with 'GAB2\0' */ check_wrong_buffer (wrong_magic, 14); /* next word must be 2 */ check_wrong_buffer (wrong_fixed_word_2, 24); /* length must be larger than the length of the name + 17 */ check_wrong_buffer (wrong_length_after_name, 24); /* next word must be 4 */ check_wrong_buffer (wrong_fixed_word_4, 36); /* check wrong total length */ check_wrong_buffer (wrong_total_length, 36); } GST_END_TEST; GST_START_TEST (test_avisubtitle_positive) { guint8 avisub_utf_8_without_bom[] = { 0x47, 0x41, 0x42, 0x32, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x31, 0x0d, 0x0a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x3c, 0x62, 0x3e, 0x41, 0x6e, 0x20, 0x55, 0x54, 0x46, 0x38, 0x20, 0x53, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, 0x4f, 0x4d, 0x3c, 0x2f, 0x62, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x32, 0x0d, 0x0a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x32, 0x2c, 0x31, 0x30, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x34, 0x2c, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x6e, 0x41, 0x53, 0x43, 0x49, 0x49, 0x20, 0x2d, 0x20, 0xc2, 0xb5, 0xc3, 0xb6, 0xc3, 0xa4, 0xc3, 0xbc, 0xc3, 0x9f, 0x0d, 0x0a, 0x0d, 0x0a }; check_correct_buffer (avisub_utf_8_with_bom, 175, avisub_utf_8_with_bom + 36, 139); check_correct_buffer (avisub_utf_8_without_bom, 172, avisub_utf_8_without_bom + 33, 139); } GST_END_TEST; static Suite * avisubtitle_suite (void) { Suite *s = suite_create ("avisubtitle"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_avisubtitle_negative); tcase_add_test (tc_chain, test_avisubtitle_positive); return s; } GST_CHECK_MAIN (avisubtitle); gst-plugins-good-0.10.31/tests/check/elements/matroskamux.c0000644000175000017500000003346611671175354020577 00000000000000/* GStreamer * * unit test for matroskamux * * Copyright (C) <2005> Michal Benes * * 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 #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define AC3_CAPS_STRING "audio/x-ac3, " \ "channels = (int) 1, " \ "rate = (int) 8000" #define VORBIS_CAPS_STRING "audio/x-vorbis, " \ "channels = (int) 1, " \ "rate = (int) 8000, " \ "streamheader=(buffer)<10, 2020, 303030>" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-matroska")); static GstStaticPadTemplate srcvorbistemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VORBIS_CAPS_STRING)); static GstStaticPadTemplate srcac3template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (AC3_CAPS_STRING)); static GstPad * setup_src_pad (GstElement * element, GstStaticPadTemplate * template, GstCaps * caps) { GstPad *srcpad, *sinkpad; GST_DEBUG_OBJECT (element, "setting up sending pad"); /* sending pad */ srcpad = gst_pad_new_from_static_template (template, "src"); fail_if (srcpad == NULL, "Could not create a srcpad"); ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); gst_pad_set_active (srcpad, TRUE); if (!(sinkpad = gst_element_get_static_pad (element, "audio_%d"))) sinkpad = gst_element_get_request_pad (element, "audio_%d"); fail_if (sinkpad == NULL, "Could not get sink pad from %s", GST_ELEMENT_NAME (element)); /* references are owned by: 1) us, 2) matroskamux, 3) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); if (caps) fail_unless (gst_pad_set_caps (srcpad, caps)); fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); gst_object_unref (sinkpad); /* because we got it higher up */ /* references are owned by: 1) matroskamux, 2) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); return srcpad; } static void teardown_src_pad (GstElement * element) { GstPad *srcpad, *sinkpad; /* clean up floating src pad */ if (!(sinkpad = gst_element_get_static_pad (element, "audio_0"))) sinkpad = gst_element_get_request_pad (element, "audio_0"); /* references are owned by: 1) us, 2) matroskamux, 3) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); srcpad = gst_pad_get_peer (sinkpad); gst_pad_unlink (srcpad, sinkpad); /* references are owned by: 1) us, 2) matroskamux, 3) collect pads */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 3); gst_object_unref (sinkpad); /* one more ref is held by element itself */ /* pad refs held by both creator and this function (through _get_peer) */ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); gst_object_unref (srcpad); gst_object_unref (srcpad); } static GstPad * setup_sink_pad (GstElement * element, GstStaticPadTemplate * template, GstCaps * caps) { GstPad *srcpad, *sinkpad; GST_DEBUG_OBJECT (element, "setting up receiving pad"); /* receiving pad */ sinkpad = gst_pad_new_from_static_template (template, "sink"); fail_if (sinkpad == NULL, "Could not create a sinkpad"); gst_pad_set_active (sinkpad, TRUE); srcpad = gst_element_get_static_pad (element, "src"); fail_if (srcpad == NULL, "Could not get source pad from %s", GST_ELEMENT_NAME (element)); if (caps) fail_unless (gst_pad_set_caps (sinkpad, caps)); gst_pad_set_chain_function (sinkpad, gst_check_chain_func); fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, "Could not link %s source and sink pads", GST_ELEMENT_NAME (element)); gst_object_unref (srcpad); /* because we got it higher up */ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); return sinkpad; } static void teardown_sink_pad (GstElement * element) { GstPad *srcpad, *sinkpad; /* clean up floating sink pad */ srcpad = gst_element_get_static_pad (element, "src"); sinkpad = gst_pad_get_peer (srcpad); gst_pad_unlink (srcpad, sinkpad); /* pad refs held by both creator and this function (through _get_pad) */ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 3); gst_object_unref (srcpad); /* one more ref is held by element itself */ /* pad refs held by both creator and this function (through _get_peer) */ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); gst_object_unref (sinkpad); gst_object_unref (sinkpad); } static GstElement * setup_matroskamux (GstStaticPadTemplate * srctemplate) { GstElement *matroskamux; GST_DEBUG ("setup_matroskamux"); matroskamux = gst_check_setup_element ("matroskamux"); g_object_set (matroskamux, "version", 1, NULL); mysrcpad = setup_src_pad (matroskamux, srctemplate, NULL); mysinkpad = setup_sink_pad (matroskamux, &sinktemplate, NULL); return matroskamux; } static void cleanup_matroskamux (GstElement * matroskamux) { GST_DEBUG ("cleanup_matroskamux"); gst_element_set_state (matroskamux, GST_STATE_NULL); teardown_src_pad (matroskamux); teardown_sink_pad (matroskamux); gst_check_teardown_element (matroskamux); } static void check_buffer_data (GstBuffer * buffer, void *data, size_t data_size) { fail_unless (GST_BUFFER_SIZE (buffer) == data_size); fail_unless (memcmp (data, GST_BUFFER_DATA (buffer), data_size) == 0); } GST_START_TEST (test_ebml_header) { GstElement *matroskamux; GstBuffer *inbuffer, *outbuffer; GstAdapter *adapter; int num_buffers; int i; gint available; guint8 data[] = { 0x1a, 0x45, 0xdf, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x42, 0x82, 0x89, 0x6d, 0x61, 0x74, 0x72, 0x6f, 0x73, 0x6b, 0x61, 0x00, 0x42, 0x87, 0x81, 0x01, 0x42, 0x85, 0x81, 0x01 }; matroskamux = setup_matroskamux (&srcac3template); fail_unless (gst_element_set_state (matroskamux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); fail_unless (num_buffers >= 1, "expected at least 5 buffers, but got only %d", num_buffers); adapter = gst_adapter_new (); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_adapter_push (adapter, outbuffer); } available = gst_adapter_available (adapter); fail_unless (available >= sizeof (data)); outbuffer = gst_adapter_take_buffer (adapter, sizeof (data)); g_object_unref (adapter); check_buffer_data (outbuffer, data, sizeof (data)); gst_buffer_unref (outbuffer); cleanup_matroskamux (matroskamux); g_list_free (buffers); buffers = NULL; } GST_END_TEST; GST_START_TEST (test_vorbis_header) { GstElement *matroskamux; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; int num_buffers; int i; gboolean vorbis_header_found = FALSE; guint8 data[12] = { 0x63, 0xa2, 0x89, 0x02, 0x01, 0x02, 0x10, 0x20, 0x20, 0x30, 0x30, 0x30 }; matroskamux = setup_matroskamux (&srcvorbistemplate); fail_unless (gst_element_set_state (matroskamux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); caps = gst_caps_from_string (VORBIS_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); for (i = 0; i < num_buffers; ++i) { gint j; outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); if (!vorbis_header_found && GST_BUFFER_SIZE (outbuffer) >= sizeof (data)) { for (j = 0; j <= GST_BUFFER_SIZE (outbuffer) - sizeof (data); j++) { if (memcmp (GST_BUFFER_DATA (outbuffer) + j, data, sizeof (data)) == 0) { vorbis_header_found = TRUE; break; } } } ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } fail_unless (vorbis_header_found); cleanup_matroskamux (matroskamux); g_list_free (buffers); buffers = NULL; } GST_END_TEST; GST_START_TEST (test_block_group) { GstElement *matroskamux; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; int num_buffers; int i; guint8 data0[] = { 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xa1, 0x85, 0x81, 0x00, 0x01, 0x00 }; guint8 data1[] = { 0x42 }; matroskamux = setup_matroskamux (&srcac3template); fail_unless (gst_element_set_state (matroskamux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* Generate the header */ inbuffer = gst_buffer_new_and_alloc (1); GST_BUFFER_TIMESTAMP (inbuffer) = 0; caps = gst_caps_from_string (AC3_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); num_buffers = g_list_length (buffers); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } g_list_free (buffers); buffers = NULL; /* Now push a buffer */ inbuffer = gst_buffer_new_and_alloc (1); GST_BUFFER_DATA (inbuffer)[0] = 0x42; GST_BUFFER_TIMESTAMP (inbuffer) = 1000000; caps = gst_caps_from_string (AC3_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); fail_unless (num_buffers >= 2); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); switch (i) { case 0: check_buffer_data (outbuffer, data0, sizeof (data0)); break; case 1: check_buffer_data (outbuffer, data1, sizeof (data1)); break; default: break; } ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } g_list_free (buffers); buffers = NULL; cleanup_matroskamux (matroskamux); } GST_END_TEST; GST_START_TEST (test_reset) { GstElement *matroskamux; GstBuffer *inbuffer; GstBuffer *outbuffer; int num_buffers; int i; matroskamux = setup_matroskamux (&srcac3template); fail_unless (gst_element_set_state (matroskamux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); fail_unless (num_buffers >= 1, "expected at least 1 buffer, but got only %d", num_buffers); fail_unless (gst_element_set_state (matroskamux, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); fail_unless (gst_element_set_state (matroskamux, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); fail_unless (num_buffers >= 2, "expected at least 2 buffers, but got only %d", num_buffers); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); buffers = g_list_remove (buffers, outbuffer); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); } cleanup_matroskamux (matroskamux); g_list_free (buffers); buffers = NULL; } GST_END_TEST; static Suite * matroskamux_suite (void) { Suite *s = suite_create ("matroskamux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_ebml_header); tcase_add_test (tc_chain, test_vorbis_header); tcase_add_test (tc_chain, test_block_group); tcase_add_test (tc_chain, test_reset); return s; } int main (int argc, char **argv) { int nf; Suite *s = matroskamux_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/audiocheblimit.c0000644000175000017500000007607311671175354021207 00000000000000/* GStreamer * * Copyright (C) 2007 Sebastian Dröge * * audiocheblimit.c: Unit test for the audiocheblimit element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define BUFFER_CAPS_STRING_32 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 32" \ #define BUFFER_CAPS_STRING_64 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" \ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 }") ); static GstElement * setup_audiocheblimit (void) { GstElement *audiocheblimit; GST_DEBUG ("setup_audiocheblimit"); audiocheblimit = gst_check_setup_element ("audiocheblimit"); mysrcpad = gst_check_setup_src_pad (audiocheblimit, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (audiocheblimit, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return audiocheblimit; } static void cleanup_audiocheblimit (GstElement * audiocheblimit) { GST_DEBUG ("cleanup_audiocheblimit"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (audiocheblimit); gst_check_teardown_sink_pad (audiocheblimit); gst_check_teardown_element (audiocheblimit); } /* Test if data containing only one frequency component * at 0 is preserved with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_32_lp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_32_lp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_32_hp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_32_hp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_64_lp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_64_lp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_64_hp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type1_64_hp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 0.25, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_32_lp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_32_lp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_32_hp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_32_hp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_64_lp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_64_lp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_64_hp_0hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms <= 0.1); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_type2_64_hp_22050hz) { GstElement *audiocheblimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; audiocheblimit = setup_audiocheblimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiocheblimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiocheblimit), "poles", 8, NULL); g_object_set (G_OBJECT (audiocheblimit), "type", 2, NULL); g_object_set (G_OBJECT (audiocheblimit), "ripple", 40.0, NULL); fail_unless (gst_element_set_state (audiocheblimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiocheblimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (BUFFER_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); rms = 0.0; for (i = 0; i < 128; i++) rms += res[i] * res[i]; rms = sqrt (rms / 128.0); fail_unless (rms >= 0.9); /* cleanup */ cleanup_audiocheblimit (audiocheblimit); } GST_END_TEST; static Suite * audiocheblimit_suite (void) { Suite *s = suite_create ("audiocheblimit"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_type1_32_lp_0hz); tcase_add_test (tc_chain, test_type1_32_lp_22050hz); tcase_add_test (tc_chain, test_type1_32_hp_0hz); tcase_add_test (tc_chain, test_type1_32_hp_22050hz); tcase_add_test (tc_chain, test_type1_64_lp_0hz); tcase_add_test (tc_chain, test_type1_64_lp_22050hz); tcase_add_test (tc_chain, test_type1_64_hp_0hz); tcase_add_test (tc_chain, test_type1_64_hp_22050hz); tcase_add_test (tc_chain, test_type2_32_lp_0hz); tcase_add_test (tc_chain, test_type2_32_lp_22050hz); tcase_add_test (tc_chain, test_type2_32_hp_0hz); tcase_add_test (tc_chain, test_type2_32_hp_22050hz); tcase_add_test (tc_chain, test_type2_64_lp_0hz); tcase_add_test (tc_chain, test_type2_64_lp_22050hz); tcase_add_test (tc_chain, test_type2_64_hp_0hz); tcase_add_test (tc_chain, test_type2_64_hp_22050hz); return s; } int main (int argc, char **argv) { int nf; Suite *s = audiocheblimit_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/equalizer.c0000644000175000017500000002235611671175354020221 00000000000000/* GStreamer * * Copyright (C) 2008 Sebastian Dröge * * equalizer.c: Unit test for the equalizer element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define EQUALIZER_CAPS_STRING \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 48000, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" \ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 48000, " "endianness = (int) BYTE_ORDER, " "width = (int) 64 ") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 48000, " "endianness = (int) BYTE_ORDER, " "width = (int) 64 ") ); static GstElement * setup_equalizer (void) { GstElement *equalizer; GST_DEBUG ("setup_equalizer"); equalizer = gst_check_setup_element ("equalizer-nbands"); mysrcpad = gst_check_setup_src_pad (equalizer, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (equalizer, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return equalizer; } static void cleanup_equalizer (GstElement * equalizer) { GST_DEBUG ("cleanup_equalizer"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (equalizer); gst_check_teardown_sink_pad (equalizer); gst_check_teardown_element (equalizer); } GST_START_TEST (test_equalizer_5bands_passthrough) { GstElement *equalizer; GstBuffer *inbuffer; GstCaps *caps; gdouble *in, *res; gint i; equalizer = setup_equalizer (); g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY (equalizer)), 5); fail_unless (gst_element_set_state (equalizer, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = g_random_double_range (-1.0, 1.0); caps = gst_caps_from_string (EQUALIZER_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) == 1); res = (gdouble *) GST_BUFFER_DATA (GST_BUFFER (buffers->data)); for (i = 0; i < 1024; i++) fail_unless_equals_float (in[i], res[i]); /* cleanup */ cleanup_equalizer (equalizer); } GST_END_TEST; GST_START_TEST (test_equalizer_5bands_minus_24) { GstElement *equalizer; GstBuffer *inbuffer; GstCaps *caps; gdouble *in, *res, rms_in, rms_out; gint i; equalizer = setup_equalizer (); g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY (equalizer)), 5); for (i = 0; i < 5; i++) { GstObject *band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); fail_unless (band != NULL); g_object_set (G_OBJECT (band), "gain", -24.0, NULL); g_object_unref (G_OBJECT (band)); } fail_unless (gst_element_set_state (equalizer, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = g_random_double_range (-1.0, 1.0); rms_in = 0.0; for (i = 0; i < 1024; i++) rms_in += in[i] * in[i]; rms_in = sqrt (rms_in / 1024); caps = gst_caps_from_string (EQUALIZER_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) == 1); res = (gdouble *) GST_BUFFER_DATA (GST_BUFFER (buffers->data)); rms_out = 0.0; for (i = 0; i < 1024; i++) rms_out += res[i] * res[i]; rms_out = sqrt (rms_out / 1024); fail_unless (rms_in > rms_out); /* cleanup */ cleanup_equalizer (equalizer); } GST_END_TEST; GST_START_TEST (test_equalizer_5bands_plus_12) { GstElement *equalizer; GstBuffer *inbuffer; GstCaps *caps; gdouble *in, *res, rms_in, rms_out; gint i; equalizer = setup_equalizer (); g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY (equalizer)), 5); for (i = 0; i < 5; i++) { GstObject *band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); fail_unless (band != NULL); g_object_set (G_OBJECT (band), "gain", 12.0, NULL); g_object_unref (G_OBJECT (band)); } fail_unless (gst_element_set_state (equalizer, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = g_random_double_range (-1.0, 1.0); rms_in = 0.0; for (i = 0; i < 1024; i++) rms_in += in[i] * in[i]; rms_in = sqrt (rms_in / 1024); caps = gst_caps_from_string (EQUALIZER_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) == 1); res = (gdouble *) GST_BUFFER_DATA (GST_BUFFER (buffers->data)); rms_out = 0.0; for (i = 0; i < 1024; i++) rms_out += res[i] * res[i]; rms_out = sqrt (rms_out / 1024); fail_unless (rms_in < rms_out); /* cleanup */ cleanup_equalizer (equalizer); } GST_END_TEST; GST_START_TEST (test_equalizer_band_number_changing) { GstElement *equalizer; gint i; equalizer = setup_equalizer (); g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY (equalizer)), 5); for (i = 0; i < 5; i++) { GstObject *band; band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); fail_unless (band != NULL); gst_object_unref (band); } g_object_set (G_OBJECT (equalizer), "num-bands", 10, NULL); fail_unless_equals_int (gst_child_proxy_get_children_count (GST_CHILD_PROXY (equalizer)), 10); for (i = 0; i < 10; i++) { GstObject *band; band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); fail_unless (band != NULL); gst_object_unref (band); } /* cleanup */ cleanup_equalizer (equalizer); } GST_END_TEST; static Suite * equalizer_suite (void) { Suite *s = suite_create ("equalizer"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_equalizer_5bands_passthrough); tcase_add_test (tc_chain, test_equalizer_5bands_minus_24); tcase_add_test (tc_chain, test_equalizer_5bands_plus_12); tcase_add_test (tc_chain, test_equalizer_band_number_changing); return s; } int main (int argc, char **argv) { int nf; Suite *s = equalizer_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/imagefreeze.c0000644000175000017500000004367611671175354020513 00000000000000/* GStreamer * Copyright (C) 2010 Sebastian Dröge * * 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 #include #include static gboolean bus_handler (GstBus * bus, GstMessage * message, gpointer data) { GMainLoop *loop = (GMainLoop *) data; switch (message->type) { case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR:{ GError *gerror; gchar *debug; if (message->type == GST_MESSAGE_WARNING) gst_message_parse_warning (message, &gerror, &debug); else gst_message_parse_error (message, &gerror, &debug); g_error ("error from %s: %s (%s)\n", GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)), gerror->message, GST_STR_NULL (debug)); gst_message_unref (message); g_error_free (gerror); g_free (debug); g_main_loop_quit (loop); break; } default: break; } return TRUE; } static GstElement * setup_imagefreeze (const GstCaps * caps1, const GstCaps * caps2, GCallback sink_handoff, gpointer sink_handoff_data) { GstElement *pipeline; GstElement *videotestsrc, *capsfilter1, *imagefreeze, *capsfilter2, *fakesink; pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL); videotestsrc = gst_element_factory_make ("videotestsrc", "src"); fail_unless (videotestsrc != NULL); g_object_set (videotestsrc, "num-buffers", 1, NULL); capsfilter1 = gst_element_factory_make ("capsfilter", "filter1"); fail_unless (capsfilter1 != NULL); g_object_set (capsfilter1, "caps", caps1, NULL); imagefreeze = gst_element_factory_make ("imagefreeze", "freeze"); fail_unless (imagefreeze != NULL); capsfilter2 = gst_element_factory_make ("capsfilter", "filter2"); fail_unless (capsfilter2 != NULL); g_object_set (capsfilter2, "caps", caps2, NULL); fakesink = gst_element_factory_make ("fakesink", "sink"); fail_unless (fakesink != NULL); g_object_set (fakesink, "signal-handoffs", TRUE, "async", FALSE, NULL); if (sink_handoff) g_signal_connect (fakesink, "handoff", sink_handoff, sink_handoff_data); gst_bin_add_many (GST_BIN (pipeline), videotestsrc, capsfilter1, imagefreeze, capsfilter2, fakesink, NULL); fail_unless (gst_element_link_pads (videotestsrc, "src", capsfilter1, "sink")); fail_unless (gst_element_link_pads (capsfilter1, "src", imagefreeze, "sink")); fail_unless (gst_element_link_pads (imagefreeze, "src", capsfilter2, "sink")); fail_unless (gst_element_link_pads (capsfilter2, "src", fakesink, "sink")); return pipeline; } static void sink_handoff_cb_0_1 (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { guint *n_buffers = (guint *) user_data; if (*n_buffers == G_MAXUINT) return; fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 0); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), GST_CLOCK_TIME_NONE); fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 0); fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), 1); *n_buffers = *n_buffers + 1; } GST_START_TEST (test_imagefreeze_0_1) { GstElement *pipeline; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; guint n_buffers = G_MAXUINT; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 0, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_0_1), &n_buffers); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); n_buffers = 0; fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless_equals_int (n_buffers, 1); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; static void sink_handoff_cb_25_1_0ms_400ms (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { guint *n_buffers = (guint *) user_data; if (*n_buffers == G_MAXUINT) return; fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), *n_buffers * 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), *n_buffers); fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), *n_buffers + 1); *n_buffers = *n_buffers + 1; } GST_START_TEST (test_imagefreeze_25_1_0ms_400ms) { GstElement *pipeline; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; guint n_buffers = G_MAXUINT; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_25_1_0ms_400ms), &n_buffers); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); n_buffers = 0; fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless_equals_int (n_buffers, 10); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; static void sink_handoff_cb_25_1_200ms_400ms (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { guint *n_buffers = (guint *) user_data; if (*n_buffers == G_MAXUINT) return; fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 5 + *n_buffers); fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), 5 + *n_buffers + 1); *n_buffers = *n_buffers + 1; } GST_START_TEST (test_imagefreeze_25_1_200ms_400ms) { GstElement *pipeline; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; guint n_buffers = G_MAXUINT; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_25_1_200ms_400ms), &n_buffers); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 200 * GST_MSECOND, GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); n_buffers = 0; fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless_equals_int (n_buffers, 5); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; static void sink_handoff_cb_25_1_400ms_0ms (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { guint *n_buffers = (guint *) user_data; if (*n_buffers == G_MAXUINT) return; fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 400 * GST_MSECOND - (*n_buffers + 1) * 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 10 - (*n_buffers + 1)); fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), 10 - (*n_buffers + 1) + 1); *n_buffers = *n_buffers + 1; } GST_START_TEST (test_imagefreeze_25_1_400ms_0ms) { GstElement *pipeline; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; guint n_buffers = G_MAXUINT; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_25_1_400ms_0ms), &n_buffers); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_seek (pipeline, -1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); n_buffers = 0; fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless_equals_int (n_buffers, 10); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; static void sink_handoff_cb_25_1_220ms_380ms (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { guint *n_buffers = (guint *) user_data; if (*n_buffers == G_MAXUINT) return; if (*n_buffers == 0) { fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 220 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 20 * GST_MSECOND); } else if (*n_buffers == 4) { fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 360 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 20 * GST_MSECOND); } else { fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND); fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); } fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 5 + *n_buffers); fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), 5 + *n_buffers + 1); *n_buffers = *n_buffers + 1; } GST_START_TEST (test_imagefreeze_25_1_220ms_380ms) { GstElement *pipeline; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; guint n_buffers = G_MAXUINT; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_25_1_220ms_380ms), &n_buffers); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 220 * GST_MSECOND, GST_SEEK_TYPE_SET, 380 * GST_MSECOND)); n_buffers = 0; fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless_equals_int (n_buffers, 5); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; static GstBuffer *test_buffer = NULL; static GstFlowReturn test_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { fail_if (test_buffer != NULL); test_buffer = gst_buffer_new_and_alloc (size); gst_buffer_set_caps (test_buffer, caps); *buf = gst_buffer_ref (test_buffer); return GST_FLOW_OK; } static void sink_handoff_cb_bufferalloc (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { guint *n_buffers = (guint *) user_data; if (*n_buffers == G_MAXUINT) return; fail_unless (buffer->parent != NULL); fail_unless (test_buffer != NULL); fail_unless (buffer->parent == test_buffer); *n_buffers = *n_buffers + 1; } GST_START_TEST (test_imagefreeze_bufferalloc) { GstElement *pipeline; GstElement *sink; GstPad *sinkpad; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; guint n_buffers = G_MAXUINT; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_bufferalloc), &n_buffers); sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); fail_unless (sink != NULL); sinkpad = gst_element_get_static_pad (sink, "sink"); fail_unless (sinkpad != NULL); gst_pad_set_bufferalloc_function (sinkpad, test_bufferalloc); gst_object_unref (sinkpad); gst_object_unref (sink); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); n_buffers = 0; fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless (test_buffer != NULL); fail_unless (n_buffers >= 1); gst_element_set_state (pipeline, GST_STATE_NULL); gst_buffer_unref (test_buffer); test_buffer = NULL; gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; GST_START_TEST (test_imagefreeze_eos) { GstElement *pipeline; GstElement *src; GstCaps *caps1, *caps2; GstBus *bus; GMainLoop *loop; GstFormat fmt = GST_FORMAT_TIME; gint64 position; guint bus_watch = 0; caps1 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); caps2 = gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); pipeline = setup_imagefreeze (caps1, caps2, NULL, NULL); src = gst_bin_get_by_name (GST_BIN (pipeline), "src"); fail_unless (src != NULL); g_object_set (src, "num-buffers", 100, NULL); loop = g_main_loop_new (NULL, TRUE); fail_unless (loop != NULL); bus = gst_element_get_bus (pipeline); fail_unless (bus != NULL); bus_watch = gst_bus_add_watch (bus, bus_handler, loop); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED), GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); g_main_loop_run (loop); fail_unless (gst_element_query_position (src, &fmt, &position)); fail_unless_equals_uint64 (position, 40 * GST_MSECOND); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (src); gst_object_unref (pipeline); g_main_loop_unref (loop); gst_caps_unref (caps1); gst_caps_unref (caps2); g_source_remove (bus_watch); } GST_END_TEST; static Suite * imagefreeze_suite (void) { Suite *s = suite_create ("imagefreeze"); TCase *tc_chain = tcase_create ("linear"); /* time out after 120s, not the default 3 */ tcase_set_timeout (tc_chain, 120); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_imagefreeze_0_1); tcase_add_test (tc_chain, test_imagefreeze_25_1_0ms_400ms); tcase_add_test (tc_chain, test_imagefreeze_25_1_200ms_400ms); tcase_add_test (tc_chain, test_imagefreeze_25_1_400ms_0ms); tcase_add_test (tc_chain, test_imagefreeze_25_1_220ms_380ms); tcase_add_test (tc_chain, test_imagefreeze_bufferalloc); tcase_add_test (tc_chain, test_imagefreeze_eos); return s; } GST_CHECK_MAIN (imagefreeze); gst-plugins-good-0.10.31/tests/check/elements/cmmldec.c0000644000175000017500000004137011677341661017623 00000000000000/* * cmmldec.c - GStreamer CMML decoder test suite * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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 #include #define SINK_CAPS "text/x-cmml" #define SRC_CAPS "text/x-cmml, encoded=(boolean)TRUE" #define IDENT_HEADER \ "CMML\x00\x00\x00\x00"\ "\x03\x00\x00\x00"\ "\xe8\x03\x00\x00\x00\x00\x00\x00"\ "\x01\x00\x00\x00\x00\x00\x00\x00"\ "\x20" #define IDENT_HEADER_SIZE 29 #define PREAMBLE_NO_PI \ "\n"\ "\n" #define PREAMBLE PREAMBLE_NO_PI "" #define PREAMBLE_DECODED PREAMBLE_NO_PI "" #define HEAD_TAG \ ""\ "The Research Hunter"\ ""\ ""\ ""\ ""\ ""\ "" #define HEAD_TAG_DECODED HEAD_TAG #define CLIP_TEMPLATE \ ""\ "http://www.csiro.au"\ ""\ "Welcome to CSIRO"\ ""\ "" #define CLIP_TEMPLATE_DECODED \ ""\ "http://www.csiro.au"\ ""\ "Welcome to CSIRO"\ ""\ "" #define EMPTY_CLIP_TEMPLATE \ "" #define END_TAG \ "" #define fail_unless_equals_flow_return(a, b) \ G_STMT_START { \ gchar *a_up = g_ascii_strup (gst_flow_get_name (a), -1); \ gchar *b_up = g_ascii_strup (gst_flow_get_name (b), -1); \ fail_unless (a == b, \ "'" #a "' (GST_FLOW_%s) is not equal to '" #b "' (GST_FLOW_%s)", \ a_up, b_up); \ g_free (a_up); \ g_free (b_up); \ } G_STMT_END; static GstElement *cmmldec; static GstBus *bus; static GstFlowReturn flow; static GList *current_buf; static gint64 granulerate; static guint8 granuleshift; static GstPad *srcpad, *sinkpad; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS) ); static GstBuffer * buffer_new (const gchar * buffer_data, guint size) { GstBuffer *buffer; GstCaps *caps; buffer = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); caps = gst_caps_from_string (SRC_CAPS); gst_buffer_set_caps (buffer, caps); gst_caps_unref (caps); return buffer; } static void buffer_unref (void *buffer, void *user_data) { ASSERT_OBJECT_REFCOUNT (buffer, "buf", 1); gst_buffer_unref (GST_BUFFER (buffer)); } static void setup_cmmldec (void) { GST_DEBUG ("setup_cmmldec"); cmmldec = gst_check_setup_element ("cmmldec"); srcpad = gst_check_setup_src_pad (cmmldec, &srctemplate, NULL); sinkpad = gst_check_setup_sink_pad (cmmldec, &sinktemplate, NULL); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); bus = gst_bus_new (); gst_element_set_bus (cmmldec, bus); fail_unless (gst_element_set_state (cmmldec, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); granulerate = GST_SECOND / 1000; granuleshift = 32; buffers = NULL; } static void teardown_cmmldec (void) { g_list_foreach (buffers, buffer_unref, NULL); g_list_free (buffers); buffers = NULL; current_buf = NULL; gst_bus_set_flushing (bus, TRUE); gst_object_unref (bus); GST_DEBUG ("teardown_cmmldec"); gst_pad_set_active (srcpad, FALSE); gst_pad_set_active (sinkpad, FALSE); gst_check_teardown_src_pad (cmmldec); gst_check_teardown_sink_pad (cmmldec); gst_check_teardown_element (cmmldec); } static void check_output_buffer_is_equal (const gchar * name, const gchar * data, gint refcount) { GstBuffer *buffer; if (current_buf == NULL) current_buf = buffers; else current_buf = g_list_next (current_buf); fail_unless (current_buf != NULL); buffer = GST_BUFFER (current_buf->data); ASSERT_OBJECT_REFCOUNT (buffer, name, refcount); fail_unless (memcmp (GST_BUFFER_DATA (buffer), data, GST_BUFFER_SIZE (buffer)) == 0, "'%s' (%s) is not equal to (%s)", name, GST_BUFFER_DATA (buffer), data); } static GstFlowReturn push_data (const gchar * name, const gchar * data, gint size, gint64 granulepos) { GstBuffer *buffer; buffer = buffer_new (data, size); GST_BUFFER_OFFSET_END (buffer) = granulepos; return gst_pad_push (srcpad, buffer); } static GObject * cmml_tag_message_pop (GstBus * bus, const gchar * tag) { GstMessage *message; GstTagList *taglist; const GValue *value; GObject *obj; message = gst_bus_poll (bus, GST_MESSAGE_TAG, 0); if (message == NULL) return NULL; gst_message_parse_tag (message, &taglist); value = gst_tag_list_get_value_index (taglist, tag, 0); if (value == NULL) { gst_message_unref (message); gst_tag_list_free (taglist); return NULL; } obj = g_value_dup_object (value); gst_message_unref (message); gst_tag_list_free (taglist); return obj; } static void check_headers (void) { GObject *head_tag; gchar *title, *base; GValueArray *meta; /* push the ident header */ flow = push_data ("ident-header", IDENT_HEADER, IDENT_HEADER_SIZE, 0); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* push the cmml preamble */ flow = push_data ("preamble", PREAMBLE, strlen (PREAMBLE), 0); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* push the head tag */ flow = push_data ("head", HEAD_TAG, strlen (HEAD_TAG), 0); fail_unless_equals_flow_return (flow, GST_FLOW_OK); fail_unless_equals_int (g_list_length (buffers), 2); /* check the decoded preamble */ check_output_buffer_is_equal ("cmml-preamble-buffer", PREAMBLE_DECODED, 1); /* check the decoded head tag */ check_output_buffer_is_equal ("head-tag-buffer", HEAD_TAG_DECODED, 1); /* check the GstCmmlTagHead tag object */ head_tag = cmml_tag_message_pop (bus, GST_TAG_CMML_HEAD); fail_unless (head_tag != NULL); g_object_get (head_tag, "title", &title, "base-uri", &base, "meta", &meta, NULL); fail_unless_equals_string ("The Research Hunter", title); fail_unless (base == NULL); fail_unless (meta != NULL); fail_unless_equals_int (meta->n_values, 10); g_free (title); g_free (base); g_value_array_free (meta); g_object_unref (head_tag); } static GstFlowReturn push_clip_full (const gchar * name, const gchar * track, const gchar * template, GstClockTime prev, GstClockTime start) { gchar *clip; gint64 keyindex, keyoffset, granulepos; GstFlowReturn res; if (track == NULL) track = "default"; if (prev == GST_CLOCK_TIME_NONE) prev = 0; keyindex = prev / granulerate << granuleshift; keyoffset = (start - prev) / granulerate; granulepos = keyindex + keyoffset; clip = g_strdup_printf (template, name, track); res = push_data (name, clip, strlen (clip), granulepos); g_free (clip); return res; } static GstFlowReturn push_clip (const gchar * name, const gchar * track, GstClockTime prev, GstClockTime start) { return push_clip_full (name, track, CLIP_TEMPLATE, prev, start); } static GstFlowReturn push_empty_clip (const gchar * name, const gchar * track, GstClockTime start) { return push_clip_full (name, track, EMPTY_CLIP_TEMPLATE, GST_CLOCK_TIME_NONE, start); } static void check_output_clip (const gchar * name, const gchar * track, const gchar * start, const gchar * end) { gchar *decoded_clip; if (track == NULL) track = "default"; decoded_clip = g_strdup_printf (CLIP_TEMPLATE_DECODED, name, track, start); check_output_buffer_is_equal (name, decoded_clip, 1); g_free (decoded_clip); } GST_START_TEST (test_dec) { GstClockTime clip1_start = 1 * GST_SECOND + 234 * GST_MSECOND; GstClockTime clip2_start = clip1_start; GstClockTime clip3_start = ((100 * 3600) + (59 * 60) + 59) * GST_SECOND + 678 * GST_MSECOND; check_headers (); flow = push_clip ("clip-1", "default", GST_CLOCK_TIME_NONE, clip1_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); flow = push_clip ("clip-2", "othertrack", GST_CLOCK_TIME_NONE, clip2_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); flow = push_clip ("clip-3", "default", clip1_start, clip3_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* send EOS to flush clip-2 and clip-3 */ gst_pad_send_event (GST_PAD_PEER (srcpad), gst_event_new_eos ()); check_output_clip ("clip-1", "default", "0:00:01.234", NULL); check_output_clip ("clip-2", "othertrack", "0:00:01.234", NULL); check_output_clip ("clip-3", "default", "100:59:59.678", NULL); check_output_buffer_is_equal ("cmml-end-tag", END_TAG, 1); } GST_END_TEST; GST_START_TEST (test_preamble_no_pi) { flow = push_data ("ident-header", IDENT_HEADER, IDENT_HEADER_SIZE, 0); fail_unless_equals_flow_return (flow, GST_FLOW_OK); fail_unless_equals_int (g_list_length (buffers), 0); flow = push_data ("preamble-no-pi", PREAMBLE_NO_PI, strlen (PREAMBLE_NO_PI), 0); fail_unless_equals_flow_return (flow, GST_FLOW_OK); fail_unless_equals_int (g_list_length (buffers), 1); check_output_buffer_is_equal ("cmml-preamble-buffer", PREAMBLE_NO_PI "", 1); } GST_END_TEST; GST_START_TEST (test_tags) { GObject *tag; gboolean empty; gchar *id, *track; gint64 start_time, end_time; gchar *anchor_href, *anchor_text; gchar *img_src, *img_alt; gchar *desc; GValueArray *meta; GstClockTime clip1_start; check_headers (); clip1_start = 1 * GST_SECOND + 234 * GST_MSECOND; flow = push_clip ("clip-1", "default", 0, clip1_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); fail_unless (tag != NULL); g_object_get (tag, "id", &id, "empty", &empty, "track", &track, "start-time", &start_time, "end-time", &end_time, "anchor-uri", &anchor_href, "anchor-text", &anchor_text, "img-uri", &img_src, "img-alt", &img_alt, "description", &desc, "meta", &meta, NULL); fail_unless (empty == FALSE); fail_unless_equals_string (id, "clip-1"); fail_unless_equals_string (track, "default"); fail_unless_equals_int (start_time, 1 * GST_SECOND + 234 * GST_MSECOND); fail_unless_equals_uint64 (end_time, GST_CLOCK_TIME_NONE); fail_unless_equals_string (anchor_href, "http://www.csiro.au/"); fail_unless_equals_string (anchor_text, "http://www.csiro.au"); fail_unless_equals_string (img_src, "images/index1.jpg"); fail_unless (img_alt == NULL); fail_unless_equals_string (desc, "Welcome to CSIRO"); fail_unless (meta != NULL); fail_unless_equals_int (meta->n_values, 2); g_free (id); g_free (track); g_free (anchor_href); g_free (anchor_text); g_free (img_src); g_free (img_alt); g_free (desc); g_value_array_free (meta); g_object_unref (tag); } GST_END_TEST; GST_START_TEST (test_wait_clip_end) { GObject *tag; gchar *id; GstClockTime end_time = 0; GstClockTime clip1_start = 1 * GST_SECOND + 234 * GST_MSECOND; GstClockTime clip2_start = 2 * GST_SECOND + 234 * GST_MSECOND; GstClockTime clip3_start = 3 * GST_SECOND + 234 * GST_MSECOND; GstClockTime clip3_end = 4 * GST_SECOND + 234 * GST_MSECOND; GstClockTime clip4_start = 5 * GST_SECOND + 234 * GST_MSECOND; g_object_set (cmmldec, "wait-clip-end-time", TRUE, NULL); check_headers (); flow = push_clip ("clip-1", "default", 0, clip1_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* no tag has been posted yet */ fail_unless (cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP) == NULL); flow = push_clip ("clip-2", "default", clip1_start, clip2_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); fail_unless (tag != NULL); g_object_get (tag, "id", &id, "end-time", &end_time, NULL); /* clip-1 is posted when clip-2 is decoded. clip-1 ends when clip-2 starts */ fail_unless_equals_string (id, "clip-1"); fail_unless_equals_int (end_time, clip2_start); g_free (id); g_object_unref (tag); flow = push_clip ("clip-3", "default", clip2_start, clip3_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); fail_unless (tag != NULL); g_object_get (tag, "id", &id, "end-time", &end_time, NULL); /* clip-2 is posted when clip-3 is decoded. It ends when clip-3 starts */ fail_unless_equals_string (id, "clip-2"); fail_unless_equals_int (end_time, clip3_start); g_free (id); g_object_unref (tag); flow = push_empty_clip ("empty-clip", "default", clip3_end); tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); fail_unless (tag != NULL); g_object_get (tag, "id", &id, "end-time", &end_time, NULL); /* clip-3 ends when empty-clip is decoded */ fail_unless_equals_string (id, "clip-3"); fail_unless_equals_int (end_time, clip3_end); g_free (id); g_object_unref (tag); flow = push_clip ("clip-4", "default", clip3_start, clip4_start); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* an empty clip just marks the end of the previous one, so no tag is posted * for empty-clip */ fail_unless (cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP) == NULL); /* send EOS to flush clip-4 */ gst_pad_send_event (GST_PAD_PEER (srcpad), gst_event_new_eos ()); tag = cmml_tag_message_pop (bus, GST_TAG_CMML_CLIP); fail_unless (tag != NULL); g_object_get (tag, "id", &id, NULL); fail_unless_equals_string (id, "clip-4"); g_free (id); g_object_unref (tag); } GST_END_TEST; GST_START_TEST (test_weird_input) { const gchar *bad_xml = ""; /* malformed ident header */ flow = push_data ("bad-ident-header", "CMML\0\0\0\0garbage", 15, 0); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); /* push invalid xml */ flow = push_data ("bad-xml", bad_xml, strlen (bad_xml), 0); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); /* and now for something completely different: an empty buffer. This is valid * as 'NIL' EOS pages are allowed */ flow = push_data ("empty-eos", NULL, 0, 0); fail_unless_equals_flow_return (flow, GST_FLOW_OK); } GST_END_TEST; GST_START_TEST (test_sink_query_convert) { guint64 keyindex, keyoffset, granulepos; GstClockTime index_time, offset_time; GstFormat dstfmt = GST_FORMAT_TIME; gint64 dstval; /* send headers to set the granulerate */ check_headers (); /* create a 1|1 granulepos */ index_time = 1 * GST_SECOND; offset_time = 1 * GST_SECOND; keyindex = (index_time / granulerate) << granuleshift; keyoffset = offset_time / granulerate; granulepos = keyindex + keyoffset; fail_unless (gst_pad_query_convert (GST_PAD_PEER (srcpad), GST_FORMAT_DEFAULT, granulepos, &dstfmt, &dstval)); fail_unless (dstfmt == GST_FORMAT_TIME); /* fail unless dstval == index + offset */ fail_unless_equals_int (2 * GST_SECOND, dstval); } GST_END_TEST; static Suite * cmmldec_suite (void) { Suite *s = suite_create ("cmmldec"); TCase *tc_general = tcase_create ("general"); suite_add_tcase (s, tc_general); tcase_add_checked_fixture (tc_general, setup_cmmldec, teardown_cmmldec); tcase_add_test (tc_general, test_dec); tcase_add_test (tc_general, test_tags); tcase_add_test (tc_general, test_preamble_no_pi); tcase_add_test (tc_general, test_wait_clip_end); tcase_add_test (tc_general, test_sink_query_convert); tcase_add_test (tc_general, test_weird_input); return s; } GST_CHECK_MAIN (cmmldec); gst-plugins-good-0.10.31/tests/check/elements/interleave.c0000644000175000017500000005727411671175354020365 00000000000000/* GStreamer unit tests for the interleave element * Copyright (C) 2007 Tim-Philipp Müller * Copyright (C) 2008 Sebastian Dröge * * 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 #include GST_START_TEST (test_create_and_unref) { GstElement *interleave; interleave = gst_element_factory_make ("interleave", NULL); fail_unless (interleave != NULL); gst_element_set_state (interleave, GST_STATE_NULL); gst_object_unref (interleave); } GST_END_TEST; GST_START_TEST (test_request_pads) { GstElement *interleave; GstPad *pad1, *pad2; interleave = gst_element_factory_make ("interleave", NULL); fail_unless (interleave != NULL); pad1 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (pad1 != NULL); fail_unless_equals_string (GST_OBJECT_NAME (pad1), "sink0"); pad2 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (pad2 != NULL); fail_unless_equals_string (GST_OBJECT_NAME (pad2), "sink1"); gst_element_release_request_pad (interleave, pad2); gst_object_unref (pad2); gst_element_release_request_pad (interleave, pad1); gst_object_unref (pad1); gst_element_set_state (interleave, GST_STATE_NULL); gst_object_unref (interleave); } GST_END_TEST; static GstPad **mysrcpads, *mysinkpad; static GstBus *bus; static GstElement *interleave; static gint have_data; static gfloat input[2]; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, " "channels = (int) 2, " "rate = (int) 48000, " "endianness = (int) BYTE_ORDER")); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, " "channels = (int) 1, " "rate = (int) 48000, " "endianness = (int) BYTE_ORDER")); #define CAPS_48khz \ "audio/x-raw-float, " \ "width = (int) 32, " \ "channels = (int) 1, " \ "rate = (int) 48000, " \ "endianness = (int) BYTE_ORDER" static GstFlowReturn interleave_chain_func (GstPad * pad, GstBuffer * buffer) { gfloat *outdata; gint i; fail_unless (GST_IS_BUFFER (buffer)); fail_unless_equals_int (GST_BUFFER_SIZE (buffer), 48000 * 2 * sizeof (gfloat)); fail_unless (GST_BUFFER_DATA (buffer) != NULL); outdata = (gfloat *) GST_BUFFER_DATA (buffer); for (i = 0; i < 48000 * 2; i += 2) { fail_unless_equals_float (outdata[i], input[0]); fail_unless_equals_float (outdata[i + 1], input[1]); } have_data++; gst_buffer_unref (buffer); return GST_FLOW_OK; } GST_START_TEST (test_interleave_2ch) { GstElement *queue; GstPad *sink0, *sink1, *src, *tmp; GstCaps *caps; gint i; GstBuffer *inbuf; gfloat *indata; mysrcpads = g_new0 (GstPad *, 2); have_data = 0; interleave = gst_element_factory_make ("interleave", NULL); fail_unless (interleave != NULL); queue = gst_element_factory_make ("queue", "queue"); fail_unless (queue != NULL); sink0 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sink0 != NULL); fail_unless_equals_string (GST_OBJECT_NAME (sink0), "sink0"); sink1 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sink1 != NULL); fail_unless_equals_string (GST_OBJECT_NAME (sink1), "sink1"); mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0"); fail_unless (mysrcpads[0] != NULL); caps = gst_caps_from_string (CAPS_48khz); fail_unless (gst_pad_set_caps (mysrcpads[0], caps)); gst_pad_use_fixed_caps (mysrcpads[0]); mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1"); fail_unless (mysrcpads[1] != NULL); fail_unless (gst_pad_set_caps (mysrcpads[1], caps)); gst_pad_use_fixed_caps (mysrcpads[1]); tmp = gst_element_get_static_pad (queue, "sink"); fail_unless (gst_pad_link (mysrcpads[0], tmp) == GST_PAD_LINK_OK); gst_object_unref (tmp); tmp = gst_element_get_static_pad (queue, "src"); fail_unless (gst_pad_link (tmp, sink0) == GST_PAD_LINK_OK); gst_object_unref (tmp); fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK); mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); fail_unless (mysinkpad != NULL); gst_pad_set_chain_function (mysinkpad, interleave_chain_func); gst_pad_set_active (mysinkpad, TRUE); src = gst_element_get_static_pad (interleave, "src"); fail_unless (src != NULL); fail_unless (gst_pad_link (src, mysinkpad) == GST_PAD_LINK_OK); gst_object_unref (src); bus = gst_bus_new (); gst_element_set_bus (interleave, bus); fail_unless (gst_element_set_state (interleave, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_set_state (queue, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); input[0] = -1.0; inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = -1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK); input[1] = 1.0; inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = 1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = -1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK); inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = 1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); fail_unless (have_data == 2); gst_element_set_state (interleave, GST_STATE_NULL); gst_element_set_state (queue, GST_STATE_NULL); gst_object_unref (mysrcpads[0]); gst_object_unref (mysrcpads[1]); gst_object_unref (mysinkpad); gst_element_release_request_pad (interleave, sink0); gst_object_unref (sink0); gst_element_release_request_pad (interleave, sink1); gst_object_unref (sink1); gst_object_unref (interleave); gst_object_unref (queue); gst_object_unref (bus); gst_caps_unref (caps); g_free (mysrcpads); } GST_END_TEST; GST_START_TEST (test_interleave_2ch_1eos) { GstElement *queue; GstPad *sink0, *sink1, *src, *tmp; GstCaps *caps; gint i; GstBuffer *inbuf; gfloat *indata; mysrcpads = g_new0 (GstPad *, 2); have_data = 0; interleave = gst_element_factory_make ("interleave", NULL); fail_unless (interleave != NULL); queue = gst_element_factory_make ("queue", "queue"); fail_unless (queue != NULL); sink0 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sink0 != NULL); fail_unless_equals_string (GST_OBJECT_NAME (sink0), "sink0"); sink1 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sink1 != NULL); fail_unless_equals_string (GST_OBJECT_NAME (sink1), "sink1"); mysrcpads[0] = gst_pad_new_from_static_template (&srctemplate, "src0"); fail_unless (mysrcpads[0] != NULL); caps = gst_caps_from_string (CAPS_48khz); fail_unless (gst_pad_set_caps (mysrcpads[0], caps)); gst_pad_use_fixed_caps (mysrcpads[0]); mysrcpads[1] = gst_pad_new_from_static_template (&srctemplate, "src1"); fail_unless (mysrcpads[1] != NULL); fail_unless (gst_pad_set_caps (mysrcpads[1], caps)); gst_pad_use_fixed_caps (mysrcpads[1]); tmp = gst_element_get_static_pad (queue, "sink"); fail_unless (gst_pad_link (mysrcpads[0], tmp) == GST_PAD_LINK_OK); gst_object_unref (tmp); tmp = gst_element_get_static_pad (queue, "src"); fail_unless (gst_pad_link (tmp, sink0) == GST_PAD_LINK_OK); gst_object_unref (tmp); fail_unless (gst_pad_link (mysrcpads[1], sink1) == GST_PAD_LINK_OK); mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); fail_unless (mysinkpad != NULL); gst_pad_set_chain_function (mysinkpad, interleave_chain_func); gst_pad_set_active (mysinkpad, TRUE); src = gst_element_get_static_pad (interleave, "src"); fail_unless (src != NULL); fail_unless (gst_pad_link (src, mysinkpad) == GST_PAD_LINK_OK); gst_object_unref (src); bus = gst_bus_new (); gst_element_set_bus (interleave, bus); fail_unless (gst_element_set_state (interleave, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); fail_unless (gst_element_set_state (queue, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); input[0] = -1.0; inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = -1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[0], inbuf) == GST_FLOW_OK); input[1] = 1.0; inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = 1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); input[0] = 0.0; gst_pad_push_event (mysrcpads[0], gst_event_new_eos ()); input[1] = 1.0; inbuf = gst_buffer_new_and_alloc (48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 48000; i++) indata[i] = 1.0; gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpads[1], inbuf) == GST_FLOW_OK); fail_unless (have_data == 2); gst_element_set_state (interleave, GST_STATE_NULL); gst_element_set_state (queue, GST_STATE_NULL); gst_object_unref (mysrcpads[0]); gst_object_unref (mysrcpads[1]); gst_object_unref (mysinkpad); gst_element_release_request_pad (interleave, sink0); gst_object_unref (sink0); gst_element_release_request_pad (interleave, sink1); gst_object_unref (sink1); gst_object_unref (interleave); gst_object_unref (queue); gst_object_unref (bus); gst_caps_unref (caps); g_free (mysrcpads); } GST_END_TEST; static void src_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad, gpointer user_data) { gint n = GPOINTER_TO_INT (user_data); GstCaps *caps; gfloat *data; gint i; if (GST_PAD_CAPS (pad)) caps = gst_caps_ref (GST_PAD_CAPS (pad)); else { caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); if (n == 2) { GstAudioChannelPosition pos[1] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } else if (n == 3) { GstAudioChannelPosition pos[1] = { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } } data = g_new (gfloat, 48000); GST_BUFFER_MALLOCDATA (buffer) = (guint8 *) data; GST_BUFFER_DATA (buffer) = (guint8 *) data; GST_BUFFER_SIZE (buffer) = 48000 * sizeof (gfloat); GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_DURATION (buffer) = GST_SECOND; GST_BUFFER_CAPS (buffer) = caps; for (i = 0; i < 48000; i++) data[i] = (n % 2 == 0) ? -1.0 : 1.0; } static void sink_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad, gpointer user_data) { gint i; gfloat *data; GstCaps *caps; gint n = GPOINTER_TO_INT (user_data); fail_unless (GST_IS_BUFFER (buffer)); fail_unless_equals_int (GST_BUFFER_SIZE (buffer), 48000 * 2 * sizeof (gfloat)); fail_unless_equals_int (GST_BUFFER_DURATION (buffer), GST_SECOND); caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); if (n == 0) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } else if (n == 1) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } else if (n == 2) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } fail_unless (gst_caps_is_equal (caps, GST_BUFFER_CAPS (buffer))); gst_caps_unref (caps); data = (gfloat *) GST_BUFFER_DATA (buffer); for (i = 0; i < 48000 * 2; i += 2) { fail_unless_equals_float (data[i], -1.0); fail_unless_equals_float (data[i + 1], 1.0); } have_data++; } GST_START_TEST (test_interleave_2ch_pipeline) { GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink; GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2; GstMessage *msg; have_data = 0; pipeline = (GstElement *) gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL); src1 = gst_element_factory_make ("fakesrc", "src1"); fail_unless (src1 != NULL); g_object_set (src1, "num-buffers", 4, NULL); g_object_set (src1, "signal-handoffs", TRUE, NULL); g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32), GINT_TO_POINTER (0)); gst_bin_add (GST_BIN (pipeline), src1); src2 = gst_element_factory_make ("fakesrc", "src2"); fail_unless (src2 != NULL); g_object_set (src2, "num-buffers", 4, NULL); g_object_set (src2, "signal-handoffs", TRUE, NULL); g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32), GINT_TO_POINTER (1)); gst_bin_add (GST_BIN (pipeline), src2); queue = gst_element_factory_make ("queue", "queue"); fail_unless (queue != NULL); gst_bin_add (GST_BIN (pipeline), queue); interleave = gst_element_factory_make ("interleave", "interleave"); fail_unless (interleave != NULL); gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave)); sinkpad0 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sinkpad0 != NULL); tmp = gst_element_get_static_pad (src1, "src"); fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK); gst_object_unref (tmp); sinkpad1 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sinkpad1 != NULL); tmp = gst_element_get_static_pad (src2, "src"); tmp2 = gst_element_get_static_pad (queue, "sink"); fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); gst_object_unref (tmp); gst_object_unref (tmp2); tmp = gst_element_get_static_pad (queue, "src"); fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK); gst_object_unref (tmp); sink = gst_element_factory_make ("fakesink", "sink"); fail_unless (sink != NULL); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32), GINT_TO_POINTER (0)); gst_bin_add (GST_BIN (pipeline), sink); tmp = gst_element_get_static_pad (interleave, "src"); tmp2 = gst_element_get_static_pad (sink, "sink"); fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); gst_object_unref (tmp); gst_object_unref (tmp2); gst_element_set_state (pipeline, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); gst_message_unref (msg); fail_unless (have_data == 4); gst_element_set_state (pipeline, GST_STATE_NULL); gst_element_release_request_pad (interleave, sinkpad0); gst_object_unref (sinkpad0); gst_element_release_request_pad (interleave, sinkpad1); gst_object_unref (sinkpad1); gst_object_unref (interleave); gst_object_unref (pipeline); } GST_END_TEST; GST_START_TEST (test_interleave_2ch_pipeline_input_chanpos) { GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink; GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2; GstMessage *msg; have_data = 0; pipeline = (GstElement *) gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL); src1 = gst_element_factory_make ("fakesrc", "src1"); fail_unless (src1 != NULL); g_object_set (src1, "num-buffers", 4, NULL); g_object_set (src1, "signal-handoffs", TRUE, NULL); g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32), GINT_TO_POINTER (2)); gst_bin_add (GST_BIN (pipeline), src1); src2 = gst_element_factory_make ("fakesrc", "src2"); fail_unless (src2 != NULL); g_object_set (src2, "num-buffers", 4, NULL); g_object_set (src2, "signal-handoffs", TRUE, NULL); g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32), GINT_TO_POINTER (3)); gst_bin_add (GST_BIN (pipeline), src2); queue = gst_element_factory_make ("queue", "queue"); fail_unless (queue != NULL); gst_bin_add (GST_BIN (pipeline), queue); interleave = gst_element_factory_make ("interleave", "interleave"); fail_unless (interleave != NULL); g_object_set (interleave, "channel-positions-from-input", TRUE, NULL); gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave)); sinkpad0 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sinkpad0 != NULL); tmp = gst_element_get_static_pad (src1, "src"); fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK); gst_object_unref (tmp); sinkpad1 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sinkpad1 != NULL); tmp = gst_element_get_static_pad (src2, "src"); tmp2 = gst_element_get_static_pad (queue, "sink"); fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); gst_object_unref (tmp); gst_object_unref (tmp2); tmp = gst_element_get_static_pad (queue, "src"); fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK); gst_object_unref (tmp); sink = gst_element_factory_make ("fakesink", "sink"); fail_unless (sink != NULL); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32), GINT_TO_POINTER (1)); gst_bin_add (GST_BIN (pipeline), sink); tmp = gst_element_get_static_pad (interleave, "src"); tmp2 = gst_element_get_static_pad (sink, "sink"); fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); gst_object_unref (tmp); gst_object_unref (tmp2); gst_element_set_state (pipeline, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); gst_message_unref (msg); fail_unless (have_data == 4); gst_element_set_state (pipeline, GST_STATE_NULL); gst_element_release_request_pad (interleave, sinkpad0); gst_object_unref (sinkpad0); gst_element_release_request_pad (interleave, sinkpad1); gst_object_unref (sinkpad1); gst_object_unref (interleave); gst_object_unref (pipeline); } GST_END_TEST; GST_START_TEST (test_interleave_2ch_pipeline_custom_chanpos) { GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink; GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2; GstMessage *msg; GValueArray *arr; GValue val = { 0, }; have_data = 0; pipeline = (GstElement *) gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL); src1 = gst_element_factory_make ("fakesrc", "src1"); fail_unless (src1 != NULL); g_object_set (src1, "num-buffers", 4, NULL); g_object_set (src1, "signal-handoffs", TRUE, NULL); g_signal_connect (src1, "handoff", G_CALLBACK (src_handoff_float32), GINT_TO_POINTER (0)); gst_bin_add (GST_BIN (pipeline), src1); src2 = gst_element_factory_make ("fakesrc", "src2"); fail_unless (src2 != NULL); g_object_set (src2, "num-buffers", 4, NULL); g_object_set (src2, "signal-handoffs", TRUE, NULL); g_signal_connect (src2, "handoff", G_CALLBACK (src_handoff_float32), GINT_TO_POINTER (1)); gst_bin_add (GST_BIN (pipeline), src2); queue = gst_element_factory_make ("queue", "queue"); fail_unless (queue != NULL); gst_bin_add (GST_BIN (pipeline), queue); interleave = gst_element_factory_make ("interleave", "interleave"); fail_unless (interleave != NULL); g_object_set (interleave, "channel-positions-from-input", FALSE, NULL); arr = g_value_array_new (2); g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER); g_value_array_append (arr, &val); g_value_reset (&val); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER); g_value_array_append (arr, &val); g_value_unset (&val); g_object_set (interleave, "channel-positions", arr, NULL); g_value_array_free (arr); gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave)); sinkpad0 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sinkpad0 != NULL); tmp = gst_element_get_static_pad (src1, "src"); fail_unless (gst_pad_link (tmp, sinkpad0) == GST_PAD_LINK_OK); gst_object_unref (tmp); sinkpad1 = gst_element_get_request_pad (interleave, "sink%d"); fail_unless (sinkpad1 != NULL); tmp = gst_element_get_static_pad (src2, "src"); tmp2 = gst_element_get_static_pad (queue, "sink"); fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); gst_object_unref (tmp); gst_object_unref (tmp2); tmp = gst_element_get_static_pad (queue, "src"); fail_unless (gst_pad_link (tmp, sinkpad1) == GST_PAD_LINK_OK); gst_object_unref (tmp); sink = gst_element_factory_make ("fakesink", "sink"); fail_unless (sink != NULL); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "handoff", G_CALLBACK (sink_handoff_float32), GINT_TO_POINTER (2)); gst_bin_add (GST_BIN (pipeline), sink); tmp = gst_element_get_static_pad (interleave, "src"); tmp2 = gst_element_get_static_pad (sink, "sink"); fail_unless (gst_pad_link (tmp, tmp2) == GST_PAD_LINK_OK); gst_object_unref (tmp); gst_object_unref (tmp2); gst_element_set_state (pipeline, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); gst_message_unref (msg); fail_unless (have_data == 4); gst_element_set_state (pipeline, GST_STATE_NULL); gst_element_release_request_pad (interleave, sinkpad0); gst_object_unref (sinkpad0); gst_element_release_request_pad (interleave, sinkpad1); gst_object_unref (sinkpad1); gst_object_unref (interleave); gst_object_unref (pipeline); } GST_END_TEST; static Suite * interleave_suite (void) { Suite *s = suite_create ("interleave"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_set_timeout (tc_chain, 180); tcase_add_test (tc_chain, test_create_and_unref); tcase_add_test (tc_chain, test_request_pads); tcase_add_test (tc_chain, test_interleave_2ch); tcase_add_test (tc_chain, test_interleave_2ch_1eos); tcase_add_test (tc_chain, test_interleave_2ch_pipeline); tcase_add_test (tc_chain, test_interleave_2ch_pipeline_input_chanpos); tcase_add_test (tc_chain, test_interleave_2ch_pipeline_custom_chanpos); return s; } GST_CHECK_MAIN (interleave); gst-plugins-good-0.10.31/tests/check/elements/aacparse.c0000644000175000017500000001467711671175354020006 00000000000000/* * GStreamer * * unit test for aacparse * * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #include "parser.h" #define SRC_CAPS_CDATA "audio/mpeg, framed=(boolean)false, codec_data=(buffer)1190" #define SRC_CAPS_TMPL "audio/mpeg, framed=(boolean)false, mpegversion=(int){2,4}" #define SINK_CAPS \ "audio/mpeg, framed=(boolean)true" #define SINK_CAPS_MPEG2 \ "audio/mpeg, framed=(boolean)true, mpegversion=2, rate=48000, channels=2" #define SINK_CAPS_MPEG4 \ "audio/mpeg, framed=(boolean)true, mpegversion=4, rate=96000, channels=2" #define SINK_CAPS_TMPL "audio/mpeg, framed=(boolean)true, mpegversion=(int){2,4}" GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS_TMPL) ); GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS_TMPL) ); /* some data */ static guint8 adif_header[] = { 'A', 'D', 'I', 'F' }; static guint8 adts_frame_mpeg2[] = { 0xff, 0xf9, 0x4c, 0x80, 0x01, 0xff, 0xfc, 0x21, 0x10, 0xd3, 0x20, 0x0c, 0x32, 0x00, 0xc7 }; static guint8 adts_frame_mpeg4[] = { 0xff, 0xf1, 0x4c, 0x80, 0x01, 0xff, 0xfc, 0x21, 0x10, 0xd3, 0x20, 0x0c, 0x32, 0x00, 0xc7 }; static guint8 garbage_frame[] = { 0xff, 0xff, 0xff, 0xff, 0xff }; /* * Test if the parser pushes data with ADIF header properly and detects the * stream to MPEG4 properly. */ GST_START_TEST (test_parse_adif_normal) { GstParserTest ptest; /* ADIF header */ gst_parser_test_init (&ptest, adif_header, sizeof (adif_header), 1); /* well, no garbage, followed by random data */ ptest.series[2].size = 100; ptest.series[2].num = 3; /* and we do not really expect output frames */ ptest.framed = FALSE; /* Check that the negotiated caps are as expected */ /* For ADIF parser assumes that data is always version 4 */ ptest.sink_caps = gst_caps_from_string (SINK_CAPS_MPEG4 ", stream-format=(string)adif"); gst_parser_test_run (&ptest, NULL); gst_caps_unref (ptest.sink_caps); } GST_END_TEST; GST_START_TEST (test_parse_adts_normal) { gst_parser_test_normal (adts_frame_mpeg4, sizeof (adts_frame_mpeg4)); } GST_END_TEST; GST_START_TEST (test_parse_adts_drain_single) { gst_parser_test_drain_single (adts_frame_mpeg4, sizeof (adts_frame_mpeg4)); } GST_END_TEST; GST_START_TEST (test_parse_adts_drain_garbage) { gst_parser_test_drain_garbage (adts_frame_mpeg4, sizeof (adts_frame_mpeg4), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_adts_split) { gst_parser_test_split (adts_frame_mpeg4, sizeof (adts_frame_mpeg4)); } GST_END_TEST; GST_START_TEST (test_parse_adts_skip_garbage) { gst_parser_test_skip_garbage (adts_frame_mpeg4, sizeof (adts_frame_mpeg4), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; /* * Test if the src caps are set according to stream format (MPEG version). */ GST_START_TEST (test_parse_adts_detect_mpeg_version) { gst_parser_test_output_caps (adts_frame_mpeg2, sizeof (adts_frame_mpeg2), NULL, SINK_CAPS_MPEG2 ", stream-format=(string)adts"); } GST_END_TEST; #define structure_get_int(s,f) \ (g_value_get_int(gst_structure_get_value(s,f))) #define fail_unless_structure_field_int_equals(s,field,num) \ fail_unless_equals_int (structure_get_int(s,field), num) /* * Test if the parser handles raw stream and codec_data info properly. */ GST_START_TEST (test_parse_handle_codec_data) { GstCaps *caps; GstStructure *s; const gchar *stream_format; /* Push random data. It should get through since the parser should be * initialized because it got codec_data in the caps */ caps = gst_parser_test_get_output_caps (NULL, 100, SRC_CAPS_CDATA); fail_unless (caps != NULL); /* Check that the negotiated caps are as expected */ /* When codec_data is present, parser assumes that data is version 4 */ GST_LOG ("aac output caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); fail_unless (gst_structure_has_name (s, "audio/mpeg")); fail_unless_structure_field_int_equals (s, "mpegversion", 4); fail_unless_structure_field_int_equals (s, "channels", 2); fail_unless_structure_field_int_equals (s, "rate", 48000); fail_unless (gst_structure_has_field (s, "codec_data")); fail_unless (gst_structure_has_field (s, "stream-format")); stream_format = gst_structure_get_string (s, "stream-format"); fail_unless (strcmp (stream_format, "raw") == 0); gst_caps_unref (caps); } GST_END_TEST; static Suite * aacparse_suite (void) { Suite *s = suite_create ("aacparse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); /* ADIF tests */ tcase_add_test (tc_chain, test_parse_adif_normal); /* ADTS tests */ tcase_add_test (tc_chain, test_parse_adts_normal); tcase_add_test (tc_chain, test_parse_adts_drain_single); tcase_add_test (tc_chain, test_parse_adts_drain_garbage); tcase_add_test (tc_chain, test_parse_adts_split); tcase_add_test (tc_chain, test_parse_adts_skip_garbage); tcase_add_test (tc_chain, test_parse_adts_detect_mpeg_version); /* Other tests */ tcase_add_test (tc_chain, test_parse_handle_codec_data); return s; } /* * TODO: * - Both push- and pull-modes need to be tested * * Pull-mode & EOS */ int main (int argc, char **argv) { int nf; Suite *s = aacparse_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); /* init test context */ ctx_factory = "aacparse"; ctx_sink_template = &sinktemplate; ctx_src_template = &srctemplate; srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/rganalysis.c0000644000175000017500000017335211671175354020377 00000000000000/* GStreamer ReplayGain analysis * * Copyright (C) 2006 Rene Stadler * * rganalysis.c: Unit test for the rganalysis element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /* Some things to note about the RMS window length of the analysis algorithm and * thus the implementation used in the element: Processing divides input data * into 50ms windows at some point. Some details about this that normally do * not matter: * * 1. At the end of a stream, the remainder of data that did not fill up the * last 50ms window is simply discarded. * * 2. If the sample rate changes during a stream, the currently running window * is discarded and the equal loudness filter gets reset as if a new stream * started. * * 3. For the album gain, it is not entirely correct to think of obtaining it * like "as if all the tracks are analyzed as one track". There isn't a * separate window being tracked for album processing, so at stream (track) * end, the remaining unfilled window does not contribute to the album gain * either. * * 4. If a waveform with a result gain G is concatenated to itself and the * result processed as a track, the gain can be different from G if and only * if the duration of the original waveform is not an integer multiple of * 50ms. If the original waveform gets processed as a single track and then * the same data again as a subsequent track, the album result gain will * always match G (this is implied by 3.). * * 5. A stream shorter than 50ms cannot be analyzed. At 8000 and 48000 Hz, * this corresponds to 400 resp. 2400 frames. If a stream is shorter than * 50ms, the element will not generate tags at EOS (only if an album * finished, but only album tags are generated then). This is not an * erroneous condition, the element should behave normally. * * The limitations outlined in 1.-4. do not apply to the peak values. Every * single sample is accounted for when looking for the peak. Thus the album * peak is guaranteed to be the maximum value of all track peaks. * * In normal day-to-day use, these little facts are unlikely to be relevant, but * they have to be kept in mind for writing the tests here. */ #include /* For ease of programming we use globals to keep refs for our floating src and * sink pads we create; otherwise we always have to do get_pad, get_peer, and * then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; /* Mapping from supported sample rates to the correct result gain for the * following test waveform: 20 * 512 samples with a quarter-full amplitude of * toggling sign, changing every 48 samples and starting with the positive * value. * * Even if we would generate a wave describing a signal with the same frequency * at each sampling rate, the results would vary (slightly). Hence the simple * generation method, since we cannot use a constant value as expected result * anyways. For all sample rates, changing the sign every 48 frames gives a * sane frequency. Buffers containing data that forms such a waveform is * created using the test_buffer_square_{float,int16}_{mono,stereo} functions * below. * * The results have been checked against what the metaflac and wavegain programs * generate for such a stream. If you want to verify these, be sure that the * metaflac program does not produce incorrect results in your environment: I * found a strange bug in the (defacto) reference code for the analysis that * sometimes leads to incorrect RMS window lengths. */ struct rate_test { guint sample_rate; gdouble gain; }; static const struct rate_test supported_rates[] = { {8000, -0.91}, {11025, -2.80}, {12000, -3.13}, {16000, -4.26}, {22050, -5.64}, {24000, -5.87}, {32000, -6.03}, {44100, -6.20}, {48000, -6.14} }; /* Lookup the correct gain adjustment result in above array. */ static gdouble get_expected_gain (guint sample_rate) { gint i; for (i = G_N_ELEMENTS (supported_rates); i--;) if (supported_rates[i].sample_rate == sample_rate) return supported_rates[i].gain; g_return_val_if_reached (0.0); } #define SILENCE_GAIN 64.82 #define REPLAY_GAIN_CAPS \ "channels = (int) { 1, 2 }, " \ "rate = (int) { 8000, 11025, 12000, 16000, 22050, " \ "24000, 32000, 44100, 48000 }" #define RG_ANALYSIS_CAPS_TEMPLATE_STRING \ "audio/x-raw-float, " \ "width = (int) 32, " \ "endianness = (int) BYTE_ORDER, " \ REPLAY_GAIN_CAPS \ "; " \ "audio/x-raw-int, " \ "width = (int) 16, " \ "depth = (int) [ 1, 16 ], " \ "signed = (boolean) true, " \ "endianness = (int) BYTE_ORDER, " \ REPLAY_GAIN_CAPS static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (RG_ANALYSIS_CAPS_TEMPLATE_STRING) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (RG_ANALYSIS_CAPS_TEMPLATE_STRING) ); static GstElement * setup_rganalysis (void) { GstElement *analysis; GstBus *bus; GST_DEBUG ("setup_rganalysis"); analysis = gst_check_setup_element ("rganalysis"); mysrcpad = gst_check_setup_src_pad (analysis, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (analysis, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); bus = gst_bus_new (); gst_element_set_bus (analysis, bus); /* gst_element_set_bus does not steal a reference. */ gst_object_unref (bus); return analysis; } static void cleanup_rganalysis (GstElement * element) { GST_DEBUG ("cleanup_rganalysis"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; /* The bus owns references to the element: */ gst_element_set_bus (element, NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (element); gst_check_teardown_sink_pad (element); gst_check_teardown_element (element); } static void set_playing_state (GstElement * element) { fail_unless (gst_element_set_state (element, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "Could not set state to PLAYING"); } static void send_eos_event (GstElement * element) { GstBus *bus = gst_element_get_bus (element); GstPad *pad = gst_element_get_static_pad (element, "sink"); GstEvent *event = gst_event_new_eos (); fail_unless (gst_pad_send_event (pad, event), "Cannot send EOS event: Not handled."); /* There is no sink element, so _we_ post the EOS message on the bus here. Of * course we generate any EOS ourselves, but this allows us to poll for the * EOS message in poll_eos if we expect the element to _not_ generate a TAG * message. That's better than waiting for a timeout to lapse. */ fail_unless (gst_bus_post (bus, gst_message_new_eos (NULL))); gst_object_unref (bus); gst_object_unref (pad); } static void send_tag_event (GstElement * element, GstTagList * tag_list) { GstPad *pad = gst_element_get_static_pad (element, "sink"); GstEvent *event = gst_event_new_tag (tag_list); fail_unless (gst_pad_send_event (pad, event), "Cannot send TAG event: Not handled."); gst_object_unref (pad); } static void poll_eos (GstElement * element) { GstBus *bus = gst_element_get_bus (element); GstMessage *message; message = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_TAG, GST_SECOND); fail_unless (message != NULL, "Could not poll for EOS message: Timed out"); fail_unless (message->type == GST_MESSAGE_EOS, "Could not poll for eos message: got message of type %s instead", gst_message_type_get_name (message->type)); gst_message_unref (message); gst_object_unref (bus); } /* This also polls for EOS since the TAG message comes right before the end of * streams. */ static GstTagList * poll_tags (GstElement * element) { GstBus *bus = gst_element_get_bus (element); GstTagList *tag_list; GstMessage *message; message = gst_bus_poll (bus, GST_MESSAGE_TAG, GST_SECOND); fail_unless (message != NULL, "Could not poll for TAG message: Timed out"); gst_message_parse_tag (message, &tag_list); gst_message_unref (message); gst_object_unref (bus); poll_eos (element); return tag_list; } #define MATCH_PEAK(p1, p2) ((p1 < p2 + 1e-6) && (p2 < p1 + 1e-6)) #define MATCH_GAIN(g1, g2) ((g1 < g2 + 1e-13) && (g2 < g1 + 1e-13)) static void fail_unless_track_gain (const GstTagList * tag_list, gdouble gain) { gdouble result; fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &result), "Tag list contains no track gain value"); fail_unless (MATCH_GAIN (gain, result), "Track gain %+.2f does not match, expected %+.2f", result, gain); } static void fail_unless_track_peak (const GstTagList * tag_list, gdouble peak) { gdouble result; fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &result), "Tag list contains no track peak value"); fail_unless (MATCH_PEAK (peak, result), "Track peak %f does not match, expected %f", result, peak); } static void fail_unless_album_gain (const GstTagList * tag_list, gdouble gain) { gdouble result; fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &result), "Tag list contains no album gain value"); fail_unless (MATCH_GAIN (result, gain), "Album gain %+.2f does not match, expected %+.2f", result, gain); } static void fail_unless_album_peak (const GstTagList * tag_list, gdouble peak) { gdouble result; fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &result), "Tag list contains no album peak value"); fail_unless (MATCH_PEAK (peak, result), "Album peak %f does not match, expected %f", result, peak); } static void fail_if_track_tags (const GstTagList * tag_list) { gdouble result; fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &result), "Tag list contains track gain value (but should not)"); fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &result), "Tag list contains track peak value (but should not)"); } static void fail_if_album_tags (const GstTagList * tag_list) { gdouble result; fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &result), "Tag list contains album gain value (but should not)"); fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &result), "Tag list contains album peak value (but should not)"); } static void fail_unless_num_tracks (GstElement * element, guint num_tracks) { guint current; g_object_get (element, "num-tracks", ¤t, NULL); fail_unless (current == num_tracks, "num-tracks property has incorrect value %u, expected %u", current, num_tracks); } /* Functions that create buffers with constant sample values, for peak * tests. */ static GstBuffer * test_buffer_const_float_mono (gint sample_rate, gsize n_frames, gfloat value) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat)); gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) *data++ = value; caps = gst_caps_new_simple ("audio/x-raw-float", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static GstBuffer * test_buffer_const_float_stereo (gint sample_rate, gsize n_frames, gfloat value_l, gfloat value_r) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat) * 2); gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) { *data++ = value_l; *data++ = value_r; } caps = gst_caps_new_simple ("audio/x-raw-float", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static GstBuffer * test_buffer_const_int16_mono (gint sample_rate, gint depth, gsize n_frames, gint16 value) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16)); gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) *data++ = value; caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static GstBuffer * test_buffer_const_int16_stereo (gint sample_rate, gint depth, gsize n_frames, gint16 value_l, gint16 value_r) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16) * 2); gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) { *data++ = value_l; *data++ = value_r; } caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } /* Functions that create data buffers containing square signal * waveforms. */ static GstBuffer * test_buffer_square_float_mono (gint * accumulator, gint sample_rate, gsize n_frames, gfloat value) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat)); gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) { *accumulator += 1; *accumulator %= 96; if (*accumulator < 48) *data++ = value; else *data++ = -value; } caps = gst_caps_new_simple ("audio/x-raw-float", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static GstBuffer * test_buffer_square_float_stereo (gint * accumulator, gint sample_rate, gsize n_frames, gfloat value_l, gfloat value_r) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gfloat) * 2); gfloat *data = (gfloat *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) { *accumulator += 1; *accumulator %= 96; if (*accumulator < 48) { *data++ = value_l; *data++ = value_r; } else { *data++ = -value_l; *data++ = -value_r; } } caps = gst_caps_new_simple ("audio/x-raw-float", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static GstBuffer * test_buffer_square_int16_mono (gint * accumulator, gint sample_rate, gint depth, gsize n_frames, gint16 value) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16)); gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) { *accumulator += 1; *accumulator %= 96; if (*accumulator < 48) *data++ = value; else *data++ = -MAX (value, -32767); } caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 1, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static GstBuffer * test_buffer_square_int16_stereo (gint * accumulator, gint sample_rate, gint depth, gsize n_frames, gint16 value_l, gint16 value_r) { GstBuffer *buf = gst_buffer_new_and_alloc (n_frames * sizeof (gint16) * 2); gint16 *data = (gint16 *) GST_BUFFER_DATA (buf); GstCaps *caps; gint i; for (i = n_frames; i--;) { *accumulator += 1; *accumulator %= 96; if (*accumulator < 48) { *data++ = value_l; *data++ = value_r; } else { *data++ = -MAX (value_l, -32767); *data++ = -MAX (value_r, -32767); } } caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, 2, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, depth, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static void push_buffer (GstBuffer * buf) { /* gst_pad_push steals a reference. */ fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); } /*** Start of the tests. ***/ /* This test looks redundant, but early versions of the element * crashed when doing, well, nothing: */ GST_START_TEST (test_no_buffer) { GstElement *element = setup_rganalysis (); set_playing_state (element); send_eos_event (element); poll_eos (element); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_no_buffer_album_1) { GstElement *element = setup_rganalysis (); set_playing_state (element); /* Single track: */ send_eos_event (element); poll_eos (element); /* First album: */ g_object_set (element, "num-tracks", 3, NULL); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 2); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 1); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 0); /* Second album: */ g_object_set (element, "num-tracks", 2, NULL); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 1); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 0); /* Single track: */ send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 0); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_no_buffer_album_2) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "num-tracks", 3, NULL); set_playing_state (element); /* No buffer for the first track. */ send_eos_event (element); /* No tags should be posted, there was nothing to analyze: */ poll_eos (element); fail_unless_num_tracks (element, 2); /* A test waveform with known gain result as second track: */ for (i = 20; i--;) push_buffer (test_buffer_square_float_mono (&accumulator, 44100, 512, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, -6.20); /* Album is not finished yet: */ fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); /* No buffer for the last track. */ send_eos_event (element); tag_list = poll_tags (element); fail_unless_album_peak (tag_list, 0.25); fail_unless_album_gain (tag_list, -6.20); /* No track tags should be posted, as there was no data for it: */ fail_if_track_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 0); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_empty_buffers) { GstElement *element = setup_rganalysis (); set_playing_state (element); /* Single track: */ push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); send_eos_event (element); poll_eos (element); /* First album: */ g_object_set (element, "num-tracks", 2, NULL); push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 1); push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 0); /* Second album, with a single track: */ g_object_set (element, "num-tracks", 1, NULL); push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 0); /* Single track: */ push_buffer (test_buffer_const_float_stereo (44100, 0, 0.0, 0.0)); send_eos_event (element); poll_eos (element); cleanup_rganalysis (element); } GST_END_TEST; /* Tests for correctness of the peak values. */ /* Float peak test. For stereo, one channel has the constant value of -1.369, * the other one 0.0. This tests many things: The result peak value should * occur on any channel. The peak is of course the absolute amplitude, so 1.369 * should be the result. This will also detect if the code uses the absolute * value during the comparison. If it is buggy it will return 0.0 since 0.0 > * -1.369. Furthermore, this makes sure that there is no problem with headroom * (exceeding 0dBFS). In the wild you get float samples > 1.0 from stuff like * vorbis. */ GST_START_TEST (test_peak_float) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; set_playing_state (element); push_buffer (test_buffer_const_float_stereo (8000, 512, -1.369, 0.0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.369); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, -1.369)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.369); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_float_mono (8000, 512, -1.369)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.369); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_peak_int16_16) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; set_playing_state (element); /* Half amplitude. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 1 << 14, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, 1 << 14)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 16, 512, 1 << 14)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Half amplitude, negative variant. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, -1 << 14, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, -1 << 14)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 16, 512, -1 << 14)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Now check for correct normalization of the peak value: Sample * values of this format range from -32768 to 32767. So for the * highest positive amplitude we do not reach 1.0, only for * -32768! */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 32767, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 32767. / 32768.); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, 32767)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 32767. / 32768.); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 16, 512, 32767)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 32767. / 32768.); gst_tag_list_free (tag_list); /* Negative variant, reaching 1.0. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, -32768, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 16, 512, 0, -32768)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 16, 512, -32768)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; /* Same as the test before, but with 8 bits (packed into 16 bits). */ GST_START_TEST (test_peak_int16_8) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; set_playing_state (element); /* Half amplitude. */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 1 << 6, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, 1 << 6)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 8, 512, 1 << 6)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Half amplitude, negative variant. */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, -1 << 6, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, -1 << 6)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 8, 512, -1 << 6)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); gst_tag_list_free (tag_list); /* Almost full amplitude (maximum positive value). */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, (1 << 7) - 1, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.9921875); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, (1 << 7) - 1)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.9921875); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 8, 512, (1 << 7) - 1)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.9921875); gst_tag_list_free (tag_list); /* Full amplitude (maximum negative value). */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, -1 << 7, 0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); gst_tag_list_free (tag_list); /* Swapped channels. */ push_buffer (test_buffer_const_int16_stereo (8000, 8, 512, 0, -1 << 7)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); gst_tag_list_free (tag_list); /* Mono. */ push_buffer (test_buffer_const_int16_mono (8000, 8, 512, -1 << 7)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_peak_album) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; g_object_set (element, "num-tracks", 2, NULL); set_playing_state (element); push_buffer (test_buffer_const_float_stereo (8000, 1024, 1.0, 0.0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.0, 0.5)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); fail_unless_album_peak (tag_list, 1.0); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 0); /* Try a second album: */ g_object_set (element, "num-tracks", 3, NULL); push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.4, 0.4)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.4); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 2); push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.45, 0.45)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.45); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.2, 0.2)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.2); fail_unless_album_peak (tag_list, 0.45); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 0); /* And now a single track, not in album mode (num-tracks is 0 * now): */ push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.1, 0.1)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.1); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; /* Switching from track to album mode. */ GST_START_TEST (test_peak_track_album) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; set_playing_state (element); push_buffer (test_buffer_const_float_mono (8000, 1024, 1.0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); g_object_set (element, "num-tracks", 1, NULL); push_buffer (test_buffer_const_float_mono (8000, 1024, 0.5)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); fail_unless_album_peak (tag_list, 0.5); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 0); cleanup_rganalysis (element); } GST_END_TEST; /* Disabling album processing before the end of the album. Probably a rare edge * case and applications should not rely on this to work. They need to send the * element to the READY state to clear up after an aborted album anyway since * they might need to process another album afterwards. */ GST_START_TEST (test_peak_album_abort_to_track) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; g_object_set (element, "num-tracks", 2, NULL); set_playing_state (element); push_buffer (test_buffer_const_float_stereo (8000, 1024, 1.0, 0.0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 1.0); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); g_object_set (element, "num-tracks", 0, NULL); push_buffer (test_buffer_const_float_stereo (8000, 1024, 0.0, 0.5)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_gain_album) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator; gint i; g_object_set (element, "num-tracks", 3, NULL); set_playing_state (element); /* The three tracks are constructed such that if any of these is in fact * ignored for the album gain, the album gain will differ. */ accumulator = 0; for (i = 8; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.75, 0.75)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.75); fail_unless_track_gain (tag_list, -15.70); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); accumulator = 0; for (i = 12; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.5, 0.5)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.5); fail_unless_track_gain (tag_list, -12.22); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); accumulator = 0; for (i = 180; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, -6.20); fail_unless_album_peak (tag_list, 0.75); /* Strangely, wavegain reports -12.17 for the album, but the fixed * metaflac agrees to us. Could be a 32767 vs. 32768 issue. */ fail_unless_album_gain (tag_list, -12.18); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; /* Checks ensuring that the "forced" property works as advertised. */ GST_START_TEST (test_forced) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "forced", FALSE, NULL); set_playing_state (element); tag_list = gst_tag_list_new (); /* Provided values are totally arbitrary. */ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 1.0, GST_TAG_TRACK_GAIN, 2.21, NULL); send_tag_event (element, tag_list); for (i = 20; i--;) push_buffer (test_buffer_const_float_stereo (44100, 512, 0.5, 0.5)); send_eos_event (element); /* This fails if a tag message is generated: */ poll_eos (element); /* Now back to a track without tags. */ for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100)); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; /* Sending track gain and peak in separate tag lists. */ GST_START_TEST (test_forced_separate) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "forced", FALSE, NULL); set_playing_state (element); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_GAIN, 2.21, NULL); send_tag_event (element, tag_list); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 1.0, NULL); send_tag_event (element, tag_list); for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.5, 0.5)); send_eos_event (element); /* This fails if a tag message is generated: */ poll_eos (element); /* Now a track without tags. */ accumulator = 0; for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100)); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; /* A TAG event is sent _after_ data has already been processed. In real * pipelines, this could happen if there is more than one rganalysis element (by * accident). While it would have analyzed all the data prior to receiving the * event, I expect it to not post its results if not forced. This test is * almost equivalent to test_forced. */ GST_START_TEST (test_forced_after_data) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "forced", FALSE, NULL); set_playing_state (element); for (i = 20; i--;) push_buffer (test_buffer_const_float_stereo (8000, 512, 0.5, 0.5)); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 1.0, GST_TAG_TRACK_GAIN, 2.21, NULL); send_tag_event (element, tag_list); send_eos_event (element); poll_eos (element); /* Now back to a normal track, this one has no tags: */ for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (8000)); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; /* Like test_forced, but *analyze* an album afterwards. The two tests following * this one check the *skipping* of albums. */ GST_START_TEST (test_forced_album) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator; gint i; g_object_set (element, "forced", FALSE, NULL); set_playing_state (element); tag_list = gst_tag_list_new (); /* Provided values are totally arbitrary. */ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 1.0, GST_TAG_TRACK_GAIN, 2.21, NULL); send_tag_event (element, tag_list); accumulator = 0; for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.5, 0.5)); send_eos_event (element); /* This fails if a tag message is generated: */ poll_eos (element); /* Now an album without tags. */ g_object_set (element, "num-tracks", 2, NULL); accumulator = 0; for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100)); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); accumulator = 0; for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100)); fail_unless_album_peak (tag_list, 0.25); fail_unless_album_gain (tag_list, get_expected_gain (44100)); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 0); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_forced_album_skip) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL); set_playing_state (element); tag_list = gst_tag_list_new (); /* Provided values are totally arbitrary. */ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 0.75, GST_TAG_TRACK_GAIN, 2.21, GST_TAG_ALBUM_PEAK, 0.80, GST_TAG_ALBUM_GAIN, -0.11, NULL); send_tag_event (element, tag_list); for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, 0.25)); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 1); /* This track has no tags, but needs to be skipped anyways since we * are in album processing mode. */ for (i = 20; i--;) push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0)); send_eos_event (element); poll_eos (element); fail_unless_num_tracks (element, 0); /* Normal track after the album. Of course not to be skipped. */ accumulator = 0; for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (8000)); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_forced_album_no_skip) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL); set_playing_state (element); for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (8000)); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); /* The second track has indeed full tags, but although being not forced, this * one has to be processed because album processing is on. */ tag_list = gst_tag_list_new (); /* Provided values are totally arbitrary. */ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 0.75, GST_TAG_TRACK_GAIN, 2.21, GST_TAG_ALBUM_PEAK, 0.80, GST_TAG_ALBUM_GAIN, -0.11, NULL); send_tag_event (element, tag_list); for (i = 20; i--;) push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.0); fail_unless_track_gain (tag_list, SILENCE_GAIN); /* Second track was just silence so the album peak equals the first * track's peak. */ fail_unless_album_peak (tag_list, 0.25); /* Statistical processing leads to the second track being * ignored for the gain (because it is so short): */ fail_unless_album_gain (tag_list, get_expected_gain (8000)); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 0); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_forced_abort_album_no_skip) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i; g_object_set (element, "forced", FALSE, "num-tracks", 2, NULL); set_playing_state (element); for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 8000, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (8000)); fail_if_album_tags (tag_list); gst_tag_list_free (tag_list); fail_unless_num_tracks (element, 1); /* Disabling album processing before end of album: */ g_object_set (element, "num-tracks", 0, NULL); /* Processing a track that has to be skipped. */ tag_list = gst_tag_list_new (); /* Provided values are totally arbitrary. */ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, 0.75, GST_TAG_TRACK_GAIN, 2.21, GST_TAG_ALBUM_PEAK, 0.80, GST_TAG_ALBUM_GAIN, -0.11, NULL); send_tag_event (element, tag_list); for (i = 20; i--;) push_buffer (test_buffer_const_float_stereo (8000, 512, 0.0, 0.0)); send_eos_event (element); poll_eos (element); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_reference_level) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gdouble ref_level; gint accumulator = 0; gint i; set_playing_state (element); for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100)); fail_if_album_tags (tag_list); fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, &ref_level) && MATCH_GAIN (ref_level, 89.), "Incorrect reference level tag"); gst_tag_list_free (tag_list); g_object_set (element, "reference-level", 83., "num-tracks", 2, NULL); for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100) - 6.); fail_if_album_tags (tag_list); fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, &ref_level) && MATCH_GAIN (ref_level, 83.), "Incorrect reference level tag"); gst_tag_list_free (tag_list); accumulator = 0; for (i = 20; i--;) push_buffer (test_buffer_square_float_stereo (&accumulator, 44100, 512, 0.25, 0.25)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, get_expected_gain (44100) - 6.); fail_unless_album_peak (tag_list, 0.25); /* We provided the same waveform twice, with a reset separating * them. Therefore, the album gain matches the track gain. */ fail_unless_album_gain (tag_list, get_expected_gain (44100) - 6.); fail_unless (gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, &ref_level) && MATCH_GAIN (ref_level, 83.), "Incorrect reference level tag"); gst_tag_list_free (tag_list); cleanup_rganalysis (element); } GST_END_TEST; GST_START_TEST (test_all_formats) { GstElement *element = setup_rganalysis (); GstTagList *tag_list; gint accumulator = 0; gint i, j; set_playing_state (element); for (i = G_N_ELEMENTS (supported_rates); i--;) { accumulator = 0; for (j = 0; j < 4; j++) push_buffer (test_buffer_square_float_stereo (&accumulator, supported_rates[i].sample_rate, 512, 0.25, 0.25)); for (j = 0; j < 3; j++) push_buffer (test_buffer_square_float_mono (&accumulator, supported_rates[i].sample_rate, 512, 0.25)); for (j = 0; j < 4; j++) push_buffer (test_buffer_square_int16_stereo (&accumulator, supported_rates[i].sample_rate, 16, 512, 1 << 13, 1 << 13)); for (j = 0; j < 3; j++) push_buffer (test_buffer_square_int16_mono (&accumulator, supported_rates[i].sample_rate, 16, 512, 1 << 13)); for (j = 0; j < 3; j++) push_buffer (test_buffer_square_int16_stereo (&accumulator, supported_rates[i].sample_rate, 8, 512, 1 << 5, 1 << 5)); for (j = 0; j < 3; j++) push_buffer (test_buffer_square_int16_mono (&accumulator, supported_rates[i].sample_rate, 8, 512, 1 << 5)); send_eos_event (element); tag_list = poll_tags (element); fail_unless_track_peak (tag_list, 0.25); fail_unless_track_gain (tag_list, supported_rates[i].gain); gst_tag_list_free (tag_list); } cleanup_rganalysis (element); } GST_END_TEST; /* Checks ensuring all advertised supported sample rates are really * accepted, for integer and float, mono and stereo. This also * verifies that the correct gain is computed for all formats (except * odd bit depths). */ #define MAKE_GAIN_TEST_FLOAT_MONO(sample_rate) \ GST_START_TEST (test_gain_float_mono_##sample_rate) \ { \ GstElement *element = setup_rganalysis (); \ GstTagList *tag_list; \ gint accumulator = 0; \ gint i; \ \ set_playing_state (element); \ \ for (i = 0; i < 20; i++) \ push_buffer (test_buffer_square_float_mono (&accumulator, \ sample_rate, 512, 0.25)); \ send_eos_event (element); \ tag_list = poll_tags (element); \ fail_unless_track_peak (tag_list, 0.25); \ fail_unless_track_gain (tag_list, \ get_expected_gain (sample_rate)); \ gst_tag_list_free (tag_list); \ \ cleanup_rganalysis (element); \ } \ \ GST_END_TEST; #define MAKE_GAIN_TEST_FLOAT_STEREO(sample_rate) \ GST_START_TEST (test_gain_float_stereo_##sample_rate) \ { \ GstElement *element = setup_rganalysis (); \ GstTagList *tag_list; \ gint accumulator = 0; \ gint i; \ \ set_playing_state (element); \ \ for (i = 0; i < 20; i++) \ push_buffer (test_buffer_square_float_stereo (&accumulator, \ sample_rate, 512, 0.25, 0.25)); \ send_eos_event (element); \ tag_list = poll_tags (element); \ fail_unless_track_peak (tag_list, 0.25); \ fail_unless_track_gain (tag_list, \ get_expected_gain (sample_rate)); \ gst_tag_list_free (tag_list); \ \ cleanup_rganalysis (element); \ } \ \ GST_END_TEST; #define MAKE_GAIN_TEST_INT16_MONO(sample_rate, depth) \ GST_START_TEST (test_gain_int16_##depth##_mono_##sample_rate) \ { \ GstElement *element = setup_rganalysis (); \ GstTagList *tag_list; \ gint accumulator = 0; \ gint i; \ \ set_playing_state (element); \ \ for (i = 0; i < 20; i++) \ push_buffer (test_buffer_square_int16_mono (&accumulator, \ sample_rate, depth, 512, 1 << (13 + depth - 16))); \ \ send_eos_event (element); \ tag_list = poll_tags (element); \ fail_unless_track_peak (tag_list, 0.25); \ fail_unless_track_gain (tag_list, \ get_expected_gain (sample_rate)); \ gst_tag_list_free (tag_list); \ \ cleanup_rganalysis (element); \ } \ \ GST_END_TEST; #define MAKE_GAIN_TEST_INT16_STEREO(sample_rate, depth) \ GST_START_TEST (test_gain_int16_##depth##_stereo_##sample_rate) \ { \ GstElement *element = setup_rganalysis (); \ GstTagList *tag_list; \ gint accumulator = 0; \ gint i; \ \ set_playing_state (element); \ \ for (i = 0; i < 20; i++) \ push_buffer (test_buffer_square_int16_stereo (&accumulator, \ sample_rate, depth, 512, 1 << (13 + depth - 16), \ 1 << (13 + depth - 16))); \ send_eos_event (element); \ tag_list = poll_tags (element); \ fail_unless_track_peak (tag_list, 0.25); \ fail_unless_track_gain (tag_list, \ get_expected_gain (sample_rate)); \ gst_tag_list_free (tag_list); \ \ cleanup_rganalysis (element); \ } \ \ GST_END_TEST; MAKE_GAIN_TEST_FLOAT_MONO (8000); MAKE_GAIN_TEST_FLOAT_MONO (11025); MAKE_GAIN_TEST_FLOAT_MONO (12000); MAKE_GAIN_TEST_FLOAT_MONO (16000); MAKE_GAIN_TEST_FLOAT_MONO (22050); MAKE_GAIN_TEST_FLOAT_MONO (24000); MAKE_GAIN_TEST_FLOAT_MONO (32000); MAKE_GAIN_TEST_FLOAT_MONO (44100); MAKE_GAIN_TEST_FLOAT_MONO (48000); MAKE_GAIN_TEST_FLOAT_STEREO (8000); MAKE_GAIN_TEST_FLOAT_STEREO (11025); MAKE_GAIN_TEST_FLOAT_STEREO (12000); MAKE_GAIN_TEST_FLOAT_STEREO (16000); MAKE_GAIN_TEST_FLOAT_STEREO (22050); MAKE_GAIN_TEST_FLOAT_STEREO (24000); MAKE_GAIN_TEST_FLOAT_STEREO (32000); MAKE_GAIN_TEST_FLOAT_STEREO (44100); MAKE_GAIN_TEST_FLOAT_STEREO (48000); MAKE_GAIN_TEST_INT16_MONO (8000, 16); MAKE_GAIN_TEST_INT16_MONO (11025, 16); MAKE_GAIN_TEST_INT16_MONO (12000, 16); MAKE_GAIN_TEST_INT16_MONO (16000, 16); MAKE_GAIN_TEST_INT16_MONO (22050, 16); MAKE_GAIN_TEST_INT16_MONO (24000, 16); MAKE_GAIN_TEST_INT16_MONO (32000, 16); MAKE_GAIN_TEST_INT16_MONO (44100, 16); MAKE_GAIN_TEST_INT16_MONO (48000, 16); MAKE_GAIN_TEST_INT16_STEREO (8000, 16); MAKE_GAIN_TEST_INT16_STEREO (11025, 16); MAKE_GAIN_TEST_INT16_STEREO (12000, 16); MAKE_GAIN_TEST_INT16_STEREO (16000, 16); MAKE_GAIN_TEST_INT16_STEREO (22050, 16); MAKE_GAIN_TEST_INT16_STEREO (24000, 16); MAKE_GAIN_TEST_INT16_STEREO (32000, 16); MAKE_GAIN_TEST_INT16_STEREO (44100, 16); MAKE_GAIN_TEST_INT16_STEREO (48000, 16); MAKE_GAIN_TEST_INT16_MONO (8000, 8); MAKE_GAIN_TEST_INT16_MONO (11025, 8); MAKE_GAIN_TEST_INT16_MONO (12000, 8); MAKE_GAIN_TEST_INT16_MONO (16000, 8); MAKE_GAIN_TEST_INT16_MONO (22050, 8); MAKE_GAIN_TEST_INT16_MONO (24000, 8); MAKE_GAIN_TEST_INT16_MONO (32000, 8); MAKE_GAIN_TEST_INT16_MONO (44100, 8); MAKE_GAIN_TEST_INT16_MONO (48000, 8); MAKE_GAIN_TEST_INT16_STEREO (8000, 8); MAKE_GAIN_TEST_INT16_STEREO (11025, 8); MAKE_GAIN_TEST_INT16_STEREO (12000, 8); MAKE_GAIN_TEST_INT16_STEREO (16000, 8); MAKE_GAIN_TEST_INT16_STEREO (22050, 8); MAKE_GAIN_TEST_INT16_STEREO (24000, 8); MAKE_GAIN_TEST_INT16_STEREO (32000, 8); MAKE_GAIN_TEST_INT16_STEREO (44100, 8); MAKE_GAIN_TEST_INT16_STEREO (48000, 8); static Suite * rganalysis_suite (void) { Suite *s = suite_create ("rganalysis"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_no_buffer); tcase_add_test (tc_chain, test_no_buffer_album_1); tcase_add_test (tc_chain, test_no_buffer_album_2); tcase_add_test (tc_chain, test_empty_buffers); tcase_add_test (tc_chain, test_peak_float); tcase_add_test (tc_chain, test_peak_int16_16); tcase_add_test (tc_chain, test_peak_int16_8); tcase_add_test (tc_chain, test_peak_album); tcase_add_test (tc_chain, test_peak_track_album); tcase_add_test (tc_chain, test_peak_album_abort_to_track); tcase_add_test (tc_chain, test_gain_album); tcase_add_test (tc_chain, test_forced); tcase_add_test (tc_chain, test_forced_separate); tcase_add_test (tc_chain, test_forced_after_data); tcase_add_test (tc_chain, test_forced_album); tcase_add_test (tc_chain, test_forced_album_skip); tcase_add_test (tc_chain, test_forced_album_no_skip); tcase_add_test (tc_chain, test_forced_abort_album_no_skip); tcase_add_test (tc_chain, test_reference_level); tcase_add_test (tc_chain, test_all_formats); tcase_add_test (tc_chain, test_gain_float_mono_8000); tcase_add_test (tc_chain, test_gain_float_mono_11025); tcase_add_test (tc_chain, test_gain_float_mono_12000); tcase_add_test (tc_chain, test_gain_float_mono_16000); tcase_add_test (tc_chain, test_gain_float_mono_22050); tcase_add_test (tc_chain, test_gain_float_mono_24000); tcase_add_test (tc_chain, test_gain_float_mono_32000); tcase_add_test (tc_chain, test_gain_float_mono_44100); tcase_add_test (tc_chain, test_gain_float_mono_48000); tcase_add_test (tc_chain, test_gain_float_stereo_8000); tcase_add_test (tc_chain, test_gain_float_stereo_11025); tcase_add_test (tc_chain, test_gain_float_stereo_12000); tcase_add_test (tc_chain, test_gain_float_stereo_16000); tcase_add_test (tc_chain, test_gain_float_stereo_22050); tcase_add_test (tc_chain, test_gain_float_stereo_24000); tcase_add_test (tc_chain, test_gain_float_stereo_32000); tcase_add_test (tc_chain, test_gain_float_stereo_44100); tcase_add_test (tc_chain, test_gain_float_stereo_48000); tcase_add_test (tc_chain, test_gain_int16_16_mono_8000); tcase_add_test (tc_chain, test_gain_int16_16_mono_11025); tcase_add_test (tc_chain, test_gain_int16_16_mono_12000); tcase_add_test (tc_chain, test_gain_int16_16_mono_16000); tcase_add_test (tc_chain, test_gain_int16_16_mono_22050); tcase_add_test (tc_chain, test_gain_int16_16_mono_24000); tcase_add_test (tc_chain, test_gain_int16_16_mono_32000); tcase_add_test (tc_chain, test_gain_int16_16_mono_44100); tcase_add_test (tc_chain, test_gain_int16_16_mono_48000); tcase_add_test (tc_chain, test_gain_int16_16_stereo_8000); tcase_add_test (tc_chain, test_gain_int16_16_stereo_11025); tcase_add_test (tc_chain, test_gain_int16_16_stereo_12000); tcase_add_test (tc_chain, test_gain_int16_16_stereo_16000); tcase_add_test (tc_chain, test_gain_int16_16_stereo_22050); tcase_add_test (tc_chain, test_gain_int16_16_stereo_24000); tcase_add_test (tc_chain, test_gain_int16_16_stereo_32000); tcase_add_test (tc_chain, test_gain_int16_16_stereo_44100); tcase_add_test (tc_chain, test_gain_int16_16_stereo_48000); tcase_add_test (tc_chain, test_gain_int16_8_mono_8000); tcase_add_test (tc_chain, test_gain_int16_8_mono_11025); tcase_add_test (tc_chain, test_gain_int16_8_mono_12000); tcase_add_test (tc_chain, test_gain_int16_8_mono_16000); tcase_add_test (tc_chain, test_gain_int16_8_mono_22050); tcase_add_test (tc_chain, test_gain_int16_8_mono_24000); tcase_add_test (tc_chain, test_gain_int16_8_mono_32000); tcase_add_test (tc_chain, test_gain_int16_8_mono_44100); tcase_add_test (tc_chain, test_gain_int16_8_mono_48000); tcase_add_test (tc_chain, test_gain_int16_8_stereo_8000); tcase_add_test (tc_chain, test_gain_int16_8_stereo_11025); tcase_add_test (tc_chain, test_gain_int16_8_stereo_12000); tcase_add_test (tc_chain, test_gain_int16_8_stereo_16000); tcase_add_test (tc_chain, test_gain_int16_8_stereo_22050); tcase_add_test (tc_chain, test_gain_int16_8_stereo_24000); tcase_add_test (tc_chain, test_gain_int16_8_stereo_32000); tcase_add_test (tc_chain, test_gain_int16_8_stereo_44100); tcase_add_test (tc_chain, test_gain_int16_8_stereo_48000); return s; } int main (int argc, char **argv) { gint nf; Suite *s = rganalysis_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_ENV); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/parser.h0000644000175000017500000000602311671175354017512 00000000000000/* * GStreamer * * unit test for (audio) parser * * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #define MAX_HEADERS 10 typedef struct { guint8 *data; guint size; } datablob; /* context state variables; to be set by test using this helper */ /* mandatory */ extern const gchar *ctx_factory; extern GstStaticPadTemplate *ctx_sink_template; extern GstStaticPadTemplate *ctx_src_template; /* optional */ extern GstCaps *ctx_input_caps; extern GstCaps *ctx_output_caps; extern guint ctx_discard; extern datablob ctx_headers[MAX_HEADERS]; extern gboolean ctx_no_metadata; /* no refs taken/kept, all up to caller */ typedef struct { const gchar *factory; GstStaticPadTemplate *sink_template; GstStaticPadTemplate *src_template; /* caps that go into element */ GstCaps *src_caps; /* optional: output caps to verify */ GstCaps *sink_caps; /* initial headers */ datablob headers[MAX_HEADERS]; /* initial (header) output to forego checking */ guint discard; /* series of buffers; middle series considered garbage */ struct { /* data and size */ guint8 *data; guint size; /* num of frames with above data per buffer */ guint fpb; /* num of buffers */ guint num; } series[3]; /* sigh, weird cases */ gboolean framed; guint dropped; gboolean no_metadata; } GstParserTest; void gst_parser_test_init (GstParserTest * ptest, guint8 * data, guint size, guint num); void gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps); void gst_parser_test_normal (guint8 *data, guint size); void gst_parser_test_drain_single (guint8 *data, guint size); void gst_parser_test_drain_garbage (guint8 *data, guint size, guint8 *garbage, guint gsize); void gst_parser_test_split (guint8 *data, guint size); void gst_parser_test_skip_garbage (guint8 *data, guint size, guint8 *garbage, guint gsize); void gst_parser_test_output_caps (guint8 *data, guint size, const gchar * input_caps, const gchar * output_caps); GstCaps *gst_parser_test_get_output_caps (guint8 *data, guint size, const gchar * input_caps); gst-plugins-good-0.10.31/tests/check/elements/souphttpsrc.c0000644000175000017500000004230111677341661020610 00000000000000/* GStreamer unit tests for the souphttpsrc element * Copyright (C) 2006-2007 Tim-Philipp Müller * Copyright (C) 2008 Wouter Cloetens * Copyright (C) 2001-2003, Ximian, Inc. * * 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 #include #include #include #include #include #include #include #include #include #include static guint http_port = 0, https_port = 0; gboolean redirect = TRUE; static const char **cookies = NULL; /* Variables for authentication tests */ static const char *user_id = NULL; static const char *user_pw = NULL; static const char *good_user = "good_user"; static const char *bad_user = "bad_user"; static const char *good_pw = "good_pw"; static const char *bad_pw = "bad_pw"; static const char *realm = "SOUPHTTPSRC_REALM"; static const char *basic_auth_path = "/basic_auth"; static const char *digest_auth_path = "/digest_auth"; static int run_server (guint * http_port, guint * https_port); static void stop_server (void); static void handoff_cb (GstElement * fakesink, GstBuffer * buf, GstPad * pad, GstBuffer ** p_outbuf) { GST_LOG ("handoff, buf = %p", buf); if (*p_outbuf == NULL) *p_outbuf = gst_buffer_ref (buf); } static gboolean basic_auth_cb (SoupAuthDomain * domain, SoupMessage * msg, const char *username, const char *password, gpointer user_data) { /* There is only one good login for testing */ return (strcmp (username, good_user) == 0) && (strcmp (password, good_pw) == 0); } static char * digest_auth_cb (SoupAuthDomain * domain, SoupMessage * msg, const char *username, gpointer user_data) { /* There is only one good login for testing */ if (strcmp (username, good_user) == 0) return soup_auth_domain_digest_encode_password (good_user, realm, good_pw); return NULL; } static int run_test (const char *format, ...) { GstStateChangeReturn ret; GstElement *pipe, *src, *sink; GstBuffer *buf = NULL; GstMessage *msg; gchar *url; va_list args; int rc = -1; pipe = gst_pipeline_new (NULL); src = gst_element_factory_make ("souphttpsrc", NULL); fail_unless (src != NULL); sink = gst_element_factory_make ("fakesink", NULL); fail_unless (sink != NULL); gst_bin_add (GST_BIN (pipe), src); gst_bin_add (GST_BIN (pipe), sink); fail_unless (gst_element_link (src, sink)); if (http_port == 0) { GST_DEBUG ("failed to start soup http server"); } fail_unless (http_port != 0); va_start (args, format); g_vasprintf (&url, format, args); va_end (args); fail_unless (url != NULL); g_object_set (src, "location", url, NULL); g_free (url); g_object_set (src, "automatic-redirect", redirect, NULL); if (cookies != NULL) g_object_set (src, "cookies", cookies, NULL); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "preroll-handoff", G_CALLBACK (handoff_cb), &buf); if (user_id != NULL) g_object_set (src, "user-id", user_id, NULL); if (user_pw != NULL) g_object_set (src, "user-pw", user_pw, NULL); ret = gst_element_set_state (pipe, GST_STATE_PAUSED); if (ret != GST_STATE_CHANGE_ASYNC) { GST_DEBUG ("failed to start up soup http src, ret = %d", ret); goto done; } gst_element_set_state (pipe, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { gchar *debug = NULL; GError *err = NULL; gst_message_parse_error (msg, &err, &debug); GST_INFO ("error: %s", err->message); if (g_str_has_suffix (err->message, "Not Found")) rc = 404; else if (g_str_has_suffix (err->message, "Forbidden")) rc = 403; else if (g_str_has_suffix (err->message, "Unauthorized")) rc = 401; else if (g_str_has_suffix (err->message, "Found")) rc = 302; GST_INFO ("debug: %s", debug); g_error_free (err); g_free (debug); gst_message_unref (msg); goto done; } gst_message_unref (msg); /* don't wait for more than 10 seconds */ ret = gst_element_get_state (pipe, NULL, NULL, 10 * GST_SECOND); GST_LOG ("ret = %u", ret); if (buf == NULL) { /* we want to test the buffer offset, nothing else; if there's a failure * it might be for lots of reasons (no network connection, whatever), we're * not interested in those */ GST_DEBUG ("didn't manage to get data within 10 seconds, skipping test"); goto done; } GST_DEBUG ("buffer offset = %" G_GUINT64_FORMAT, GST_BUFFER_OFFSET (buf)); /* first buffer should have a 0 offset */ fail_unless (GST_BUFFER_OFFSET (buf) == 0); gst_buffer_unref (buf); rc = 0; done: gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); return rc; } GST_START_TEST (test_first_buffer_has_offset) { fail_unless (run_test ("http://127.0.0.1:%u/", http_port) == 0); } GST_END_TEST; GST_START_TEST (test_not_found) { fail_unless (run_test ("http://127.0.0.1:%u/404", http_port) == 404); } GST_END_TEST; GST_START_TEST (test_forbidden) { fail_unless (run_test ("http://127.0.0.1:%u/403", http_port) == 403); } GST_END_TEST; GST_START_TEST (test_redirect_no) { redirect = FALSE; fail_unless (run_test ("http://127.0.0.1:%u/302", http_port) == 302); } GST_END_TEST; GST_START_TEST (test_redirect_yes) { redirect = TRUE; fail_unless (run_test ("http://127.0.0.1:%u/302", http_port) == 0); } GST_END_TEST; GST_START_TEST (test_https) { if (!https_port) GST_INFO ("Failed to start an HTTPS server; let's just skip this test."); else fail_unless (run_test ("https://127.0.0.1:%u/", https_port) == 0); } GST_END_TEST; GST_START_TEST (test_cookies) { static const char *biscotti[] = { "delacre=yummie", "koekje=lu", NULL }; int rc; cookies = biscotti; rc = run_test ("http://127.0.0.1:%u/", http_port); cookies = NULL; fail_unless (rc == 0); } GST_END_TEST; GST_START_TEST (test_good_user_basic_auth) { int res; user_id = good_user; user_pw = good_pw; res = run_test ("http://127.0.0.1:%u%s", http_port, basic_auth_path); GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res); user_id = user_pw = NULL; fail_unless (res == 0); } GST_END_TEST; GST_START_TEST (test_bad_user_basic_auth) { int res; user_id = bad_user; user_pw = good_pw; res = run_test ("http://127.0.0.1:%u%s", http_port, basic_auth_path); GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res); user_id = user_pw = NULL; fail_unless (res == 401); } GST_END_TEST; GST_START_TEST (test_bad_password_basic_auth) { int res; user_id = good_user; user_pw = bad_pw; res = run_test ("http://127.0.0.1:%u%s", http_port, basic_auth_path); GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res); user_id = user_pw = NULL; fail_unless (res == 401); } GST_END_TEST; GST_START_TEST (test_good_user_digest_auth) { int res; user_id = good_user; user_pw = good_pw; res = run_test ("http://127.0.0.1:%u%s", http_port, digest_auth_path); GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res); user_id = user_pw = NULL; fail_unless (res == 0); } GST_END_TEST; GST_START_TEST (test_bad_user_digest_auth) { int res; user_id = bad_user; user_pw = good_pw; res = run_test ("http://127.0.0.1:%u%s", http_port, digest_auth_path); GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res); user_id = user_pw = NULL; fail_unless (res == 401); } GST_END_TEST; GST_START_TEST (test_bad_password_digest_auth) { int res; user_id = good_user; user_pw = bad_pw; res = run_test ("http://127.0.0.1:%u%s", http_port, digest_auth_path); GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res); user_id = user_pw = NULL; fail_unless (res == 401); } GST_END_TEST; static gboolean icy_caps = FALSE; static void got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, gpointer user_data) { GstStructure *s; /* Caps can be anything if we don't except icy caps */ if (!icy_caps) return; /* Otherwise they _must_ be "application/x-icy" */ fail_unless (GST_BUFFER_CAPS (buf) != NULL); s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); fail_unless_equals_string (gst_structure_get_name (s), "application/x-icy"); } GST_START_TEST (test_icy_stream) { GstElement *pipe, *src, *sink; GstMessage *msg; pipe = gst_pipeline_new (NULL); src = gst_element_factory_make ("souphttpsrc", NULL); fail_unless (src != NULL); g_object_set (src, "iradio-mode", TRUE, NULL); sink = gst_element_factory_make ("fakesink", NULL); fail_unless (sink != NULL); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "handoff", G_CALLBACK (got_buffer), NULL); gst_bin_add (GST_BIN (pipe), src); gst_bin_add (GST_BIN (pipe), sink); fail_unless (gst_element_link (src, sink)); /* First try Virgin Radio Ogg stream, to see if there's connectivity and all * (which is an attempt to work around the completely horrid error reporting * and that we can't distinguish different types of failures here). */ g_object_set (src, "location", "http://ogg2.smgradio.com/vr32.ogg", NULL); g_object_set (src, "num-buffers", 1, NULL); icy_caps = FALSE; gst_element_set_state (pipe, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GST_INFO ("looks like there's no net connectivity or sgmradio.com is " "down. In any case, let's just skip this test"); gst_message_unref (msg); goto done; } gst_message_unref (msg); msg = NULL; gst_element_set_state (pipe, GST_STATE_NULL); /* Now, if the ogg stream works, the mp3 shoutcast stream should work as * well (time will tell if that's true) */ /* Virgin Radio 32kbps mp3 shoutcast stream */ g_object_set (src, "location", "http://mp3-vr-32.smgradio.com:80/", NULL); /* EOS after the first buffer */ g_object_set (src, "num-buffers", 1, NULL); icy_caps = TRUE; gst_element_set_state (pipe, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { GST_DEBUG ("success, we're done here"); gst_message_unref (msg); goto done; } { GError *err = NULL; gst_message_parse_error (msg, &err, NULL); gst_message_unref (msg); g_error ("Error with ICY mp3 shoutcast stream: %s", err->message); g_error_free (err); } done: icy_caps = FALSE; gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); } GST_END_TEST; static Suite * souphttpsrc_suite (void) { Suite *s; TCase *tc_chain, *tc_internet; g_type_init (); #if !GLIB_CHECK_VERSION (2, 31, 0) if (!g_thread_supported ()) g_thread_init (NULL); #endif s = suite_create ("souphttpsrc"); tc_chain = tcase_create ("general"); tc_internet = tcase_create ("internet"); suite_add_tcase (s, tc_chain); run_server (&http_port, &https_port); atexit (stop_server); tcase_add_test (tc_chain, test_first_buffer_has_offset); tcase_add_test (tc_chain, test_redirect_yes); tcase_add_test (tc_chain, test_redirect_no); tcase_add_test (tc_chain, test_not_found); tcase_add_test (tc_chain, test_forbidden); tcase_add_test (tc_chain, test_cookies); tcase_add_test (tc_chain, test_good_user_basic_auth); tcase_add_test (tc_chain, test_bad_user_basic_auth); tcase_add_test (tc_chain, test_bad_password_basic_auth); tcase_add_test (tc_chain, test_good_user_digest_auth); tcase_add_test (tc_chain, test_bad_user_digest_auth); tcase_add_test (tc_chain, test_bad_password_digest_auth); if (soup_ssl_supported) tcase_add_test (tc_chain, test_https); suite_add_tcase (s, tc_internet); tcase_set_timeout (tc_internet, 250); tcase_add_test (tc_internet, test_icy_stream); return s; } GST_CHECK_MAIN (souphttpsrc); static void do_get (SoupMessage * msg, const char *path) { char *uri; int buflen = 4096; SoupKnownStatusCode status = SOUP_STATUS_OK; uri = soup_uri_to_string (soup_message_get_uri (msg), FALSE); GST_DEBUG ("request: \"%s\"", uri); if (!strcmp (path, "/301")) status = SOUP_STATUS_MOVED_PERMANENTLY; else if (!strcmp (path, "/302")) status = SOUP_STATUS_MOVED_TEMPORARILY; else if (!strcmp (path, "/307")) status = SOUP_STATUS_TEMPORARY_REDIRECT; else if (!strcmp (path, "/403")) status = SOUP_STATUS_FORBIDDEN; else if (!strcmp (path, "/404")) status = SOUP_STATUS_NOT_FOUND; if (SOUP_STATUS_IS_REDIRECTION (status)) { char *redir_uri; redir_uri = g_strdup_printf ("%s-redirected", uri); soup_message_headers_append (msg->response_headers, "Location", redir_uri); g_free (redir_uri); } if (status != SOUP_STATUS_OK) goto leave; if (msg->method == SOUP_METHOD_GET) { char *buf; buf = g_malloc (buflen); memset (buf, 0, buflen); soup_message_body_append (msg->response_body, SOUP_MEMORY_TAKE, buf, buflen); } else { /* msg->method == SOUP_METHOD_HEAD */ char *length; /* We could just use the same code for both GET and * HEAD. But we'll optimize and avoid the extra * malloc. */ length = g_strdup_printf ("%lu", (gulong) buflen); soup_message_headers_append (msg->response_headers, "Content-Length", length); g_free (length); } leave: soup_message_set_status (msg, status); g_free (uri); } static void print_header (const char *name, const char *value, gpointer data) { GST_DEBUG ("header: %s: %s", name, value); } static void server_callback (SoupServer * server, SoupMessage * msg, const char *path, GHashTable * query, SoupClientContext * context, gpointer data) { GST_DEBUG ("%s %s HTTP/1.%d", msg->method, path, soup_message_get_http_version (msg)); soup_message_headers_foreach (msg->request_headers, print_header, NULL); if (msg->request_body->length) GST_DEBUG ("%s", msg->request_body->data); if (msg->method == SOUP_METHOD_GET || msg->method == SOUP_METHOD_HEAD) do_get (msg, path); else soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); GST_DEBUG (" -> %d %s", msg->status_code, msg->reason_phrase); } static SoupServer *server; /* NULL */ static SoupServer *ssl_server; /* NULL */ int run_server (guint * http_port, guint * https_port) { guint port = SOUP_ADDRESS_ANY_PORT; guint ssl_port = SOUP_ADDRESS_ANY_PORT; const char *ssl_cert_file = GST_TEST_FILES_PATH "/test-cert.pem"; const char *ssl_key_file = GST_TEST_FILES_PATH "/test-key.pem"; static int server_running = 0; SoupAuthDomain *domain = NULL; if (server_running) return 0; server_running = 1; *http_port = *https_port = 0; server = soup_server_new (SOUP_SERVER_PORT, port, NULL); if (!server) { GST_DEBUG ("Unable to bind to server port %u", port); return 1; } *http_port = soup_server_get_port (server); GST_INFO ("HTTP server listening on port %u", *http_port); soup_server_add_handler (server, NULL, server_callback, NULL, NULL); domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, realm, SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, basic_auth_cb, SOUP_AUTH_DOMAIN_ADD_PATH, basic_auth_path, NULL); soup_server_add_auth_domain (server, domain); g_object_unref (domain); domain = soup_auth_domain_digest_new (SOUP_AUTH_DOMAIN_REALM, realm, SOUP_AUTH_DOMAIN_DIGEST_AUTH_CALLBACK, digest_auth_cb, SOUP_AUTH_DOMAIN_ADD_PATH, digest_auth_path, NULL); soup_server_add_auth_domain (server, domain); g_object_unref (domain); soup_server_run_async (server); if (ssl_cert_file && ssl_key_file) { ssl_server = soup_server_new (SOUP_SERVER_PORT, ssl_port, SOUP_SERVER_SSL_CERT_FILE, ssl_cert_file, SOUP_SERVER_SSL_KEY_FILE, ssl_key_file, NULL); if (!ssl_server) { GST_DEBUG ("Unable to bind to SSL server port %u", ssl_port); return 1; } *https_port = soup_server_get_port (ssl_server); GST_INFO ("HTTPS server listening on port %u", *https_port); soup_server_add_handler (ssl_server, NULL, server_callback, NULL, NULL); soup_server_run_async (ssl_server); } return 0; } static void stop_server (void) { GST_INFO ("cleaning up"); if (server) { g_object_unref (server); server = NULL; } if (ssl_server) { g_object_unref (ssl_server); ssl_server = NULL; } } gst-plugins-good-0.10.31/tests/check/elements/apev2mux.c0000644000175000017500000002717011671175354017766 00000000000000/* GStreamer * * unit test for the taglib-based apev2mux element * * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Sebastian Dröge * * 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 #include #include #define TEST_ARTIST "Ar T\303\255st" #define TEST_TITLE "M\303\274llermilch!" #define TEST_ALBUM "Boom" #define TEST_DATE g_date_new_dmy(1,1,2006) #define TEST_TRACK_NUMBER 7 #define TEST_TRACK_COUNT 19 #define TEST_TRACK_GAIN 1.45 #define TEST_ALBUM_GAIN 0.78 /* for dummy mp3 frame sized MP3_FRAME_SIZE bytes, * start: ff fb b0 44 00 00 08 00 00 4b 00 00 00 00 00 00 */ static const guint8 mp3_dummyhdr[] = { 0xff, 0xfb, 0xb0, 0x44, 0x00, 0x00, 0x08, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 }; #define MP3_FRAME_SIZE 626 static GstTagList * test_taglib_apev2mux_create_tags (guint32 mask) { GstTagList *tags; tags = gst_tag_list_new (); if (mask & (1 << 0)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ARTIST, TEST_ARTIST, NULL); } if (mask & (1 << 1)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TITLE, TEST_TITLE, NULL); } if (mask & (1 << 2)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM, TEST_ALBUM, NULL); } if (mask & (1 << 3)) { GDate *date; date = TEST_DATE; gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_DATE, date, NULL); g_date_free (date); } if (mask & (1 << 4)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_NUMBER, TEST_TRACK_NUMBER, NULL); } if (mask & (1 << 5)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_COUNT, TEST_TRACK_COUNT, NULL); } if (mask & (1 << 6)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_GAIN, TEST_TRACK_GAIN, NULL); } if (mask & (1 << 7)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM_GAIN, TEST_ALBUM_GAIN, NULL); } if (mask & (1 << 8)) { } if (mask & (1 << 9)) { } if (mask & (1 << 10)) { } if (mask & (1 << 11)) { } if (mask & (1 << 12)) { } if (mask & (1 << 13)) { } return tags; } static void test_taglib_apev2mux_check_tags (GstTagList * tags, guint32 mask) { if (mask & (1 << 0)) { gchar *s = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s)); fail_unless (g_str_equal (s, TEST_ARTIST)); g_free (s); } if (mask & (1 << 1)) { gchar *s = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s)); fail_unless (g_str_equal (s, TEST_TITLE)); g_free (s); } if (mask & (1 << 2)) { gchar *s = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s)); fail_unless (g_str_equal (s, TEST_ALBUM)); g_free (s); } if (mask & (1 << 3)) { GDate *shouldbe, *date = NULL; shouldbe = TEST_DATE; fail_unless (gst_tag_list_get_date (tags, GST_TAG_DATE, &date)); fail_unless (g_date_compare (shouldbe, date) == 0); g_date_free (shouldbe); g_date_free (date); } if (mask & (1 << 4)) { guint num; fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_NUMBER, &num)); fail_unless (num == TEST_TRACK_NUMBER); } if (mask & (1 << 5)) { guint count; fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_COUNT, &count)); fail_unless (count == TEST_TRACK_COUNT); } if (mask & (1 << 6)) { gdouble gain; fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &gain)); fail_unless (gain == TEST_TRACK_GAIN); } if (mask & (1 << 7)) { gdouble gain; fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_GAIN, &gain)); fail_unless (gain == TEST_ALBUM_GAIN); } if (mask & (1 << 8)) { } if (mask & (1 << 9)) { } if (mask & (1 << 10)) { } if (mask & (1 << 11)) { } if (mask & (1 << 12)) { } if (mask & (1 << 13)) { } } static void fill_mp3_buffer (GstElement * fakesrc, GstBuffer * buf, GstPad * pad, guint64 * p_offset) { fail_unless (GST_BUFFER_SIZE (buf) == MP3_FRAME_SIZE); GST_LOG ("filling buffer with fake mp3 data, offset = %" G_GUINT64_FORMAT, *p_offset); memcpy (GST_BUFFER_DATA (buf), mp3_dummyhdr, sizeof (mp3_dummyhdr)); /* can't use gst_buffer_set_caps() here because the metadata isn't writable * because of the extra refcounts taken by the signal emission mechanism; * we know it's fine to use GST_BUFFER_CAPS() here though */ GST_BUFFER_CAPS (buf) = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL); GST_BUFFER_OFFSET (buf) = *p_offset; *p_offset += GST_BUFFER_SIZE (buf); } static void got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, GstBuffer ** p_buf) { gint64 off; guint size; off = GST_BUFFER_OFFSET (buf); size = GST_BUFFER_SIZE (buf); GST_LOG ("got buffer, size=%u, offset=%" G_GINT64_FORMAT, size, off); fail_unless (GST_BUFFER_OFFSET_IS_VALID (buf)); if (*p_buf == NULL || (off + size) > GST_BUFFER_SIZE (*p_buf)) { GstBuffer *newbuf; /* not very elegant, but who cares */ newbuf = gst_buffer_new_and_alloc (off + size); if (*p_buf) { memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (*p_buf), GST_BUFFER_SIZE (*p_buf)); } memcpy (GST_BUFFER_DATA (newbuf) + off, GST_BUFFER_DATA (buf), size); if (*p_buf) gst_buffer_unref (*p_buf); *p_buf = newbuf; } else { memcpy (GST_BUFFER_DATA (*p_buf) + off, GST_BUFFER_DATA (buf), size); } } static void demux_pad_added (GstElement * apedemux, GstPad * srcpad, GstBuffer ** p_outbuf) { GstElement *fakesink, *pipeline; GST_LOG ("apedemux added source pad with caps %" GST_PTR_FORMAT, GST_PAD_CAPS (srcpad)); pipeline = apedemux; while (GST_OBJECT_PARENT (pipeline) != NULL) pipeline = (GstElement *) GST_OBJECT_PARENT (pipeline); fakesink = gst_element_factory_make ("fakesink", "fakesink"); g_assert (fakesink != NULL); /* set up sink */ g_object_set (fakesink, "signal-handoffs", TRUE, NULL); g_signal_connect (fakesink, "handoff", G_CALLBACK (got_buffer), p_outbuf); gst_bin_add (GST_BIN (pipeline), fakesink); gst_element_set_state (fakesink, GST_STATE_PLAYING); fail_unless (gst_element_link (apedemux, fakesink)); } static void test_taglib_apev2mux_check_output_buffer (GstBuffer * buf) { guint8 *data = GST_BUFFER_DATA (buf); guint size = GST_BUFFER_SIZE (buf); guint off; g_assert (size % MP3_FRAME_SIZE == 0); for (off = 0; off < size; off += MP3_FRAME_SIZE) { fail_unless (memcmp (data + off, mp3_dummyhdr, sizeof (mp3_dummyhdr)) == 0); } } static void test_taglib_apev2mux_with_tags (GstTagList * tags, guint32 mask) { GstMessage *msg; GstTagList *tags_read = NULL; GstElement *pipeline, *apev2mux, *apedemux, *fakesrc; GstBus *bus; guint64 offset; GstBuffer *outbuf = NULL; pipeline = gst_pipeline_new ("pipeline"); g_assert (pipeline != NULL); fakesrc = gst_element_factory_make ("fakesrc", "fakesrc"); g_assert (fakesrc != NULL); apev2mux = gst_element_factory_make ("apev2mux", "apev2mux"); g_assert (apev2mux != NULL); apedemux = gst_element_factory_make ("apedemux", "apedemux"); g_assert (apedemux != NULL); outbuf = NULL; g_signal_connect (apedemux, "pad-added", G_CALLBACK (demux_pad_added), &outbuf); gst_bin_add (GST_BIN (pipeline), fakesrc); gst_bin_add (GST_BIN (pipeline), apev2mux); gst_bin_add (GST_BIN (pipeline), apedemux); gst_tag_setter_merge_tags (GST_TAG_SETTER (apev2mux), tags, GST_TAG_MERGE_APPEND); gst_element_link_many (fakesrc, apev2mux, apedemux, NULL); /* set up source */ g_object_set (fakesrc, "signal-handoffs", TRUE, "can-activate-pull", FALSE, "filltype", 2, "sizetype", 2, "sizemax", MP3_FRAME_SIZE, "num-buffers", 16, NULL); offset = 0; g_signal_connect (fakesrc, "handoff", G_CALLBACK (fill_mp3_buffer), &offset); gst_element_set_state (pipeline, GST_STATE_PLAYING); fail_unless (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_SUCCESS); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); GST_LOG ("Waiting for tag ..."); msg = gst_bus_poll (bus, GST_MESSAGE_TAG | GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err; gchar *dbg; gst_message_parse_error (msg, &err, &dbg); g_printerr ("ERROR from element %s: %s\n%s\n", GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); g_error_free (err); g_free (dbg); } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { g_printerr ("EOS message, but were waiting for TAGS!\n"); } fail_unless (msg->type == GST_MESSAGE_TAG); gst_message_parse_tag (msg, &tags_read); gst_message_unref (msg); GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags_read); test_taglib_apev2mux_check_tags (tags_read, mask); gst_tag_list_free (tags_read); GST_LOG ("Waiting for EOS ..."); msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err; gchar *dbg; gst_message_parse_error (msg, &err, &dbg); g_printerr ("ERROR from element %s: %s\n%s\n", GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); g_error_free (err); g_free (dbg); } fail_unless (msg->type == GST_MESSAGE_EOS); gst_message_unref (msg); gst_object_unref (bus); GST_LOG ("Got EOS, shutting down ..."); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); test_taglib_apev2mux_check_output_buffer (outbuf); gst_buffer_unref (outbuf); GST_LOG ("Done"); } GST_START_TEST (test_apev2mux) { GstTagList *tags; gint i; g_random_set_seed (247166295); /* internal consistency check */ tags = test_taglib_apev2mux_create_tags (0xFFFFFFFF); test_taglib_apev2mux_check_tags (tags, 0xFFFFFFFF); gst_tag_list_free (tags); /* now the real tests */ for (i = 0; i < 50; ++i) { guint32 mask; mask = g_random_int (); GST_LOG ("tag mask = %08x (i=%d)", mask, i); if (mask == 0) continue; /* create tags */ tags = test_taglib_apev2mux_create_tags (mask); GST_LOG ("tags for mask %08x = %" GST_PTR_FORMAT, mask, tags); /* double-check for internal consistency */ test_taglib_apev2mux_check_tags (tags, mask); /* test with pipeline */ test_taglib_apev2mux_with_tags (tags, mask); /* free tags */ gst_tag_list_free (tags); } } GST_END_TEST; static Suite * apev2mux_suite (void) { Suite *s = suite_create ("apev2mux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_apev2mux); return s; } int main (int argc, char **argv) { int nf; Suite *s = apev2mux_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/cmmlenc.c0000644000175000017500000003643011677341661017636 00000000000000/* * cmmlenc.c - GStreamer CMML decoder test suite * Copyright (C) 2005 Alessandro Decina * * Authors: * Alessandro Decina * * 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 #include #define SINK_CAPS "text/x-cmml" #define SRC_CAPS "text/x-cmml,encoded=(boolean)FALSE" #define IDENT_HEADER \ "CMML\x00\x00\x00\x00"\ "\x03\x00\x00\x00"\ "\xe8\x03\x00\x00\x00\x00\x00\x00"\ "\x01\x00\x00\x00\x00\x00\x00\x00"\ "\x20" #define XML_PREAMBLE \ "\n"\ "\n" #define START_TAG \ "" #define PROCESSING_INSTRUCTION \ "" #define PREAMBLE \ XML_PREAMBLE START_TAG #define PREAMBLE_ENCODED \ XML_PREAMBLE PROCESSING_INSTRUCTION #define STREAM_TAG \ ""\ ""\ ""\ "" #define STREAM_TAG_ENCODED STREAM_TAG #define HEAD_TAG \ ""\ "The Research Hunter"\ ""\ ""\ ""\ ""\ ""\ "" #define HEAD_TAG_ENCODED HEAD_TAG #define CLIP_TEMPLATE \ ""\ "http://www.annodex.org"\ ""\ "Annodex Foundation"\ ""\ "" #define ENDED_CLIP_TEMPLATE \ ""\ "http://www.annodex.org"\ ""\ "Annodex Foundation"\ ""\ "" #define CLIP_TEMPLATE_ENCODED \ ""\ "http://www.annodex.org"\ ""\ "Annodex Foundation"\ ""\ "" #define EMPTY_CLIP_TEMPLATE_ENCODED \ "" #define fail_unless_equals_flow_return(a, b) \ G_STMT_START { \ gchar *a_up = g_ascii_strup (gst_flow_get_name (a), -1); \ gchar *b_up = g_ascii_strup (gst_flow_get_name (b), -1); \ fail_unless (a == b, \ "'" #a "' (GST_FLOW_%s) is not equal to '" #b "' (GST_FLOW_%s)", \ a_up, b_up); \ g_free (a_up); \ g_free (b_up); \ } G_STMT_END; static GList *current_buf; static guint64 granulerate; static guint8 granuleshift; static GstElement *cmmlenc; static GstBus *bus; static GstFlowReturn flow; static GstPad *srcpad, *sinkpad; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS) ); static GstBuffer * buffer_new (const gchar * buffer_data, guint size) { GstBuffer *buffer; GstCaps *caps; buffer = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); caps = gst_caps_from_string (SRC_CAPS); gst_buffer_set_caps (buffer, caps); gst_caps_unref (caps); return buffer; } static void buffer_unref (void *buffer, void *user_data) { gst_buffer_unref (GST_BUFFER (buffer)); } static void setup_cmmlenc (void) { guint64 granulerate_n, granulerate_d; GST_DEBUG ("setup_cmmlenc"); cmmlenc = gst_check_setup_element ("cmmlenc"); srcpad = gst_check_setup_src_pad (cmmlenc, &srctemplate, NULL); sinkpad = gst_check_setup_sink_pad (cmmlenc, &sinktemplate, NULL); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); bus = gst_bus_new (); gst_element_set_bus (cmmlenc, bus); fail_unless (gst_element_set_state (cmmlenc, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); g_object_get (cmmlenc, "granule-rate-numerator", &granulerate_n, "granule-rate-denominator", &granulerate_d, "granule-shift", &granuleshift, NULL); granulerate = GST_SECOND * granulerate_d / granulerate_n; } static void teardown_cmmlenc (void) { /* free encoded buffers */ g_list_foreach (buffers, buffer_unref, NULL); g_list_free (buffers); buffers = NULL; current_buf = NULL; gst_bus_set_flushing (bus, TRUE); gst_object_unref (bus); GST_DEBUG ("teardown_cmmlenc"); gst_pad_set_active (srcpad, FALSE); gst_pad_set_active (sinkpad, FALSE); gst_check_teardown_src_pad (cmmlenc); gst_check_teardown_sink_pad (cmmlenc); gst_check_teardown_element (cmmlenc); } static void check_output_buffer_is_equal (const gchar * name, const gchar * data, gint refcount) { GstBuffer *buffer; if (current_buf == NULL) current_buf = buffers; else current_buf = g_list_next (current_buf); fail_unless (current_buf != NULL); buffer = GST_BUFFER (current_buf->data); ASSERT_OBJECT_REFCOUNT (buffer, name, refcount); fail_unless (memcmp (GST_BUFFER_DATA (buffer), data, GST_BUFFER_SIZE (buffer)) == 0, "'%s' (%s) is not equal to (%s)", name, GST_BUFFER_DATA (buffer), data); } static GstFlowReturn push_data (const gchar * name, const gchar * data, gint size) { GstBuffer *buffer; GstFlowReturn res; buffer = buffer_new (data, size); res = gst_pad_push (srcpad, buffer); return res; } static void check_headers (void) { /* push the cmml start tag */ flow = push_data ("preamble", PREAMBLE, strlen (PREAMBLE)); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* push the stream tag */ flow = push_data ("stream", STREAM_TAG, strlen (STREAM_TAG)); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* push the head tag */ flow = push_data ("head", HEAD_TAG, strlen (HEAD_TAG)); fail_unless_equals_flow_return (flow, GST_FLOW_OK); /* should output 3 buffers: the ident, preamble and head headers */ fail_unless_equals_int (g_list_length (buffers), 3); /* check the ident header */ check_output_buffer_is_equal ("cmml-ident-buffer", IDENT_HEADER, 1); /* check the cmml processing instruction */ check_output_buffer_is_equal ("cmml-preamble-buffer", PREAMBLE_ENCODED, 1); /* check the encoded head tag */ check_output_buffer_is_equal ("head-tag-buffer", HEAD_TAG_ENCODED, 1); } static GstFlowReturn push_clip (const gchar * name, const gchar * track, const gchar * start, const gchar * end) { gchar *clip; GstFlowReturn res; if (end != NULL) clip = g_strdup_printf (ENDED_CLIP_TEMPLATE, name, track, start, end); else clip = g_strdup_printf (CLIP_TEMPLATE, name, track, start); res = push_data (name, clip, strlen (clip)); g_free (clip); return res; } static void check_clip_times (GstBuffer * buffer, GstClockTime start, GstClockTime prev) { guint64 keyindex, keyoffset, granulepos; granulepos = GST_BUFFER_OFFSET_END (buffer); if (granuleshift == 0 || granuleshift == 64) keyindex = 0; else keyindex = granulepos >> granuleshift; keyoffset = granulepos - (keyindex << granuleshift); fail_unless_equals_uint64 (keyindex * granulerate, prev); fail_unless_equals_uint64 ((keyindex + keyoffset) * granulerate, start); } static void check_clip (const gchar * name, const gchar * track, GstClockTime start, GstClockTime prev) { gchar *encoded_clip; GstBuffer *buffer; encoded_clip = g_strdup_printf (CLIP_TEMPLATE_ENCODED, name, track); check_output_buffer_is_equal (name, encoded_clip, 1); g_free (encoded_clip); buffer = GST_BUFFER (current_buf->data); check_clip_times (buffer, start, prev); } static void check_empty_clip (const gchar * name, const gchar * track, GstClockTime start, GstClockTime prev) { gchar *encoded_clip; GstBuffer *buffer; encoded_clip = g_strdup_printf (EMPTY_CLIP_TEMPLATE_ENCODED, track); check_output_buffer_is_equal (name, encoded_clip, 1); g_free (encoded_clip); buffer = GST_BUFFER (current_buf->data); check_clip_times (buffer, start, prev); } GST_START_TEST (test_enc) { check_headers (); flow = push_clip ("clip-1", "default", "1.234", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-1", "default", 1 * GST_SECOND + 234 * GST_MSECOND, 0); flow = push_clip ("clip-2", "default", "5.678", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-2", "default", 5 * GST_SECOND + 678 * GST_MSECOND, 1 * GST_SECOND + 234 * GST_MSECOND); flow = push_clip ("clip-3", "othertrack", "9.123", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-3", "othertrack", 9 * GST_SECOND + 123 * GST_MSECOND, 0); flow = push_data ("end-tag", "", strlen ("")); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_output_buffer_is_equal ("cmml-eos", NULL, 1); } GST_END_TEST; GST_START_TEST (test_clip_end_time) { check_headers (); /* push a clip that starts at 1.234 an ends at 2.234 */ flow = push_clip ("clip-1", "default", "1.234", "2.234"); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-1", "default", 1 * GST_SECOND + 234 * GST_MSECOND, 0); /* now check that the encoder created an empty clip starting at 2.234 to mark * the end of clip-1 */ check_empty_clip ("clip-1-end", "default", 2 * GST_SECOND + 234 * GST_MSECOND, 1 * GST_SECOND + 234 * GST_MSECOND); /* now push another clip on the same track and check that the keyindex part of * the granulepos points to clip-1 and not to the empty clip */ flow = push_clip ("clip-2", "default", "5", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-2", "default", 5 * GST_SECOND, 1 * GST_SECOND + 234 * GST_MSECOND); } GST_END_TEST; GST_START_TEST (test_time_order) { check_headers (); /* clips belonging to the same track must have start times in non decreasing * order */ flow = push_clip ("clip-1", "default", "1000:00:00.000", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-1", "default", 3600 * 1000 * GST_SECOND, 0); /* this will make the encoder throw an error message */ flow = push_clip ("clip-2", "default", "5.678", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); flow = push_clip ("clip-3", "default", "1000:00:00.001", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-3", "default", 3600 * 1000 * GST_SECOND + 1 * GST_MSECOND, 3600 * 1000 * GST_SECOND); /* tracks don't interfere with each other */ flow = push_clip ("clip-4", "othertrack", "9.123", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("clip-4", "othertrack", 9 * GST_SECOND + 123 * GST_MSECOND, 0); } GST_END_TEST; GST_START_TEST (test_time_parsing) { check_headers (); flow = push_clip ("bad-msecs", "default", "0.1000", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); flow = push_clip ("bad-secs", "default", "00:00:60.123", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); flow = push_clip ("bad-minutes", "default", "00:60:12.345", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); /* this fails since we can't store 5124096 * 3600 * GST_SECOND in a * GstClockTime */ flow = push_clip ("bad-hours", "default", "5124096:00:00.000", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); } GST_END_TEST; GST_START_TEST (test_time_limits) { check_headers (); /* ugly hack to make sure that the following checks actually overflow parsing * the times in gst_cmml_clock_time_from_npt rather than converting them to * granulepos in gst_cmml_clock_time_to_granule */ granuleshift = 64; g_object_set (cmmlenc, "granule-shift", granuleshift, NULL); /* 5124095:34:33.709 is the max npt-hhmmss time representable with * GstClockTime */ flow = push_clip ("max-npt-hhmmss", "foo", "5124095:34:33.709", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("max-npt-hhmmss", "foo", (GstClockTime) 5124095 * 3600 * GST_SECOND + 34 * 60 * GST_SECOND + 33 * GST_SECOND + 709 * GST_MSECOND, 0); flow = push_clip ("overflow-max-npt-hhmmss", "overflows", "5124095:34:33.710", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); /* 18446744073.709 is the max ntp-sec time */ flow = push_clip ("max-npt-secs", "bar", "18446744073.709", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("max-npt-secs", "bar", (GstClockTime) 5124095 * 3600 * GST_SECOND + 34 * 60 * GST_SECOND + 33 * GST_SECOND + 709 * GST_MSECOND, 0); /* overflow doing 18446744074 * GST_SECOND */ flow = push_clip ("overflow-max-npt-secs", "overflows", "18446744074.000", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); /* overflow doing seconds + milliseconds */ flow = push_clip ("overflow-max-npt-secs-msecs", "overflows", "18446744073.710", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); /* reset granuleshift to 32 to check keyoffset overflows in * gst_cmml_clock_time_to_granule */ granuleshift = 32; g_object_set (cmmlenc, "granule-shift", granuleshift, NULL); /* 1193:02:47.295 is the max time we can encode in the keyoffset part of a * granulepos given a granuleshift of 32 */ flow = push_clip ("max-granule-keyoffset", "baz", "1193:02:47.295", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_OK); check_clip ("max-granule-keyoffset", "baz", 1193 * 3600 * GST_SECOND + 2 * 60 * GST_SECOND + 47 * GST_SECOND + 295 * GST_MSECOND, 0); flow = push_clip ("overflow-max-granule-keyoffset", "overflows", "1193:02:47.296", NULL); fail_unless_equals_flow_return (flow, GST_FLOW_ERROR); } GST_END_TEST; static Suite * cmmlenc_suite (void) { Suite *s = suite_create ("cmmlenc"); TCase *tc_general = tcase_create ("general"); suite_add_tcase (s, tc_general); tcase_add_checked_fixture (tc_general, setup_cmmlenc, teardown_cmmlenc); tcase_add_test (tc_general, test_enc); tcase_add_test (tc_general, test_clip_end_time); tcase_add_test (tc_general, test_time_order); tcase_add_test (tc_general, test_time_parsing); tcase_add_test (tc_general, test_time_limits); return s; } GST_CHECK_MAIN (cmmlenc); gst-plugins-good-0.10.31/tests/check/elements/alphacolor.c0000644000175000017500000002213511671175354020337 00000000000000/* GStreamer unit test for the alphacolor element * * Copyright (C) 2007 Tim-Philipp Müller * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV")) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGB) ); static GstElement * setup_alphacolor (void) { GstElement *alphacolor; alphacolor = gst_check_setup_element ("alphacolor"); mysrcpad = gst_check_setup_src_pad (alphacolor, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (alphacolor, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return alphacolor; } static void cleanup_alphacolor (GstElement * alphacolor) { GST_DEBUG ("cleaning up"); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (alphacolor); gst_check_teardown_sink_pad (alphacolor); gst_check_teardown_element (alphacolor); } #define WIDTH 3 #define HEIGHT 4 static GstCaps * create_caps_rgb24 (void) { GstCaps *caps; caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 3, "height", G_TYPE_INT, 4, "bpp", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24, "framerate", GST_TYPE_FRACTION, 0, 1, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 0x00ff0000, "green_mask", G_TYPE_INT, 0x0000ff00, "blue_mask", G_TYPE_INT, 0x000000ff, NULL); return caps; } static GstCaps * create_caps_rgba32 (void) { GstCaps *caps; caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 3, "height", G_TYPE_INT, 4, "bpp", G_TYPE_INT, 32, "depth", G_TYPE_INT, 32, "framerate", GST_TYPE_FRACTION, 0, 1, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 0xff000000, "green_mask", G_TYPE_INT, 0x00ff0000, "blue_mask", G_TYPE_INT, 0x0000ff00, "alpha_mask", G_TYPE_INT, 0x000000ff, NULL); return caps; } static GstBuffer * create_buffer_rgb24_3x4 (void) { /* stride is rounded up to multiple of 4, so 3 bytes padding for each row */ const guint8 rgb24_3x4_img[HEIGHT * GST_ROUND_UP_4 (WIDTH * 3)] = { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00 }; guint rowstride = GST_ROUND_UP_4 (WIDTH * 3); GstBuffer *buf; GstCaps *caps; buf = gst_buffer_new_and_alloc (HEIGHT * rowstride); fail_unless_equals_int (GST_BUFFER_SIZE (buf), sizeof (rgb24_3x4_img)); memcpy (GST_BUFFER_DATA (buf), rgb24_3x4_img, sizeof (rgb24_3x4_img)); caps = create_caps_rgb24 (); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); return buf; } static GstBuffer * create_buffer_rgba32_3x4 (void) { /* stride is rounded up to multiple of 4, so 3 bytes padding for each row */ /* should be: RED BLUE WHITE where 'nothing' is fully transparent * GREEN RED BLUE and all other colours are fully * NOTHING GREEN RED opaque. * BLACK NOTHING GREEN */ const guint8 rgba32_3x4_img[HEIGHT * WIDTH * 4] = { 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff }; guint rowstride = WIDTH * 4; GstBuffer *buf; GstCaps *caps; buf = gst_buffer_new_and_alloc (HEIGHT * rowstride); fail_unless_equals_int (GST_BUFFER_SIZE (buf), sizeof (rgba32_3x4_img)); memcpy (GST_BUFFER_DATA (buf), rgba32_3x4_img, sizeof (rgba32_3x4_img)); caps = create_caps_rgba32 (); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); return buf; } GST_START_TEST (test_rgb24) { GstElement *alphacolor; GstBuffer *inbuffer; GstCaps *incaps; incaps = create_caps_rgb24 (); alphacolor = setup_alphacolor (); fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); inbuffer = create_buffer_rgb24_3x4 (); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away reference; this should error out with a not-negotiated * error, alphacolor should only accept RGBA caps, not but plain RGB24 caps */ GST_DEBUG ("push it"); fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_NOT_NEGOTIATED); GST_DEBUG ("pushed it"); fail_unless (g_list_length (buffers) == 0); fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); /* cleanup */ GST_DEBUG ("cleanup alphacolor"); cleanup_alphacolor (alphacolor); GST_DEBUG ("cleanup, unref incaps"); ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1); gst_caps_unref (incaps); } GST_END_TEST; /* these macros assume WIDTH and HEIGHT is fixed to what's defined above */ #define fail_unless_ayuv_pixel_has_alpha(ayuv,x,y,a) \ { \ guint8 *pixel; \ pixel = ((guint8*)(ayuv) + ((WIDTH * 4) * (y)) + ((x) * 4)); \ fail_unless_equals_int (pixel[0], a); \ } GST_START_TEST (test_rgba32) { GstElement *alphacolor; GstBuffer *inbuffer; GstBuffer *outbuffer; GstCaps *incaps; guint8 *ayuv; guint outlength; incaps = create_caps_rgba32 (); alphacolor = setup_alphacolor (); fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); inbuffer = create_buffer_rgba32_3x4 (); GST_DEBUG ("Created buffer of %d bytes", GST_BUFFER_SIZE (inbuffer)); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away reference */ GST_DEBUG ("push it"); fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); GST_DEBUG ("pushed it"); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) == 1); outbuffer = (GstBuffer *) buffers->data; fail_if (outbuffer == NULL); fail_unless (GST_IS_BUFFER (outbuffer)); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); outlength = WIDTH * HEIGHT * 4; /* output is AYUV */ fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer), outlength); ayuv = GST_BUFFER_DATA (outbuffer); /* check alpha values (0x00 = totally transparent, 0xff = totally opaque) */ fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 0, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 0, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 0, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 1, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 1, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 1, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 2, 0x00); fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 2, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 2, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 0, 3, 0xff); fail_unless_ayuv_pixel_has_alpha (ayuv, 1, 3, 0x00); fail_unless_ayuv_pixel_has_alpha (ayuv, 2, 3, 0xff); /* we don't check the YUV data, because apparently results differ slightly * depending on whether we run in valgrind or not */ buffers = g_list_remove (buffers, outbuffer); gst_buffer_unref (outbuffer); fail_unless_equals_int (gst_element_set_state (alphacolor, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); /* cleanup */ GST_DEBUG ("cleanup alphacolor"); cleanup_alphacolor (alphacolor); GST_DEBUG ("cleanup, unref incaps"); ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1); gst_caps_unref (incaps); } GST_END_TEST; static Suite * alphacolor_suite (void) { Suite *s = suite_create ("alphacolor"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_rgb24); tcase_add_test (tc_chain, test_rgba32); return s; } GST_CHECK_MAIN (alphacolor); gst-plugins-good-0.10.31/tests/check/elements/wavpackparse.c0000644000175000017500000002200711671175354020700 00000000000000/* GStreamer * * unit test for wavpackparse * * Copyright (c) 2006 Sebastian Dröge * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; static GstBus *bus; static GstElement *wavpackparse; /* Wavpack file with 2 frames of silence */ guint8 test_file[] = { 0x77, 0x76, 0x70, 0x6B, 0x62, 0x00, 0x00, 0x00, /* first frame */ 0x04, 0x04, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, /* include RIFF header */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x05, 0x18, 0x80, 0x04, 0xFF, 0xAF, 0x80, 0x60, 0x21, 0x16, 0x52, 0x49, 0x46, 0x46, 0x24, 0x90, 0x01, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x88, 0x58, 0x01, 0x00, 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x90, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x02, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0xE4, 0x77, 0x76, 0x70, 0x6B, 0x2E, 0x00, 0x00, 0x00, /* second frame */ 0x04, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x05, 0x18, 0x80, 0x04, 0xFF, 0xAF, 0x80, 0x60, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x02, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0xE4, }; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack, " "width = (int) 16, " "channels = (int) 1, " "rate = (int) 44100, " "framed = (boolean) TRUE")); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack")); static void wavpackparse_found_pad (GstElement * src, GstPad * pad, gpointer data) { GstPad *srcpad; mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); fail_if (mysinkpad == NULL, "Couldn't create sinkpad"); srcpad = gst_element_get_static_pad (wavpackparse, "src"); fail_if (srcpad == NULL, "Failed to get srcpad from wavpackparse"); gst_pad_set_chain_function (mysinkpad, gst_check_chain_func); fail_unless (gst_pad_link (srcpad, mysinkpad) == GST_PAD_LINK_OK, "Failed to link pads"); gst_pad_set_active (mysinkpad, TRUE); gst_object_unref (srcpad); } static void setup_wavpackparse (void) { GstPad *sinkpad; GST_DEBUG ("setup_wavpackparse"); wavpackparse = gst_element_factory_make ("wavpackparse", "wavpackparse"); fail_if (wavpackparse == NULL, "Could not create wavpackparse"); mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); fail_if (mysrcpad == NULL, "Could not create srcpad"); sinkpad = gst_element_get_static_pad (wavpackparse, "sink"); fail_if (sinkpad == NULL, "Failed to get sinkpad from wavpackparse"); fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK, "Failed to link pads"); gst_object_unref (sinkpad); g_signal_connect (wavpackparse, "pad-added", G_CALLBACK (wavpackparse_found_pad), NULL); bus = gst_bus_new (); gst_element_set_bus (wavpackparse, bus); fail_unless (gst_element_set_state (wavpackparse, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); } static void cleanup_wavpackparse (void) { GstPad *sinkpad, *srcpad; GST_DEBUG ("cleanup_wavpackparse"); gst_bus_set_flushing (bus, TRUE); gst_element_set_bus (wavpackparse, NULL); gst_object_unref (GST_OBJECT (bus)); sinkpad = gst_element_get_static_pad (wavpackparse, "sink"); fail_if (sinkpad == NULL, "Failed to get sinkpad from wavpackparse"); fail_unless (gst_pad_unlink (mysrcpad, sinkpad), "Failed to unlink pads"); gst_pad_set_caps (mysrcpad, NULL); gst_object_unref (sinkpad); gst_object_unref (mysrcpad); srcpad = gst_element_get_static_pad (wavpackparse, "src"); fail_if (srcpad == NULL, "Failed to get srcpad from wavpackparse"); fail_unless (gst_pad_unlink (srcpad, mysinkpad), "Failed to unlink pads"); gst_pad_set_caps (mysinkpad, NULL); gst_object_unref (srcpad); gst_object_unref (mysinkpad); fail_unless (gst_element_set_state (wavpackparse, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); gst_object_unref (wavpackparse); } GST_START_TEST (test_parsing_valid_frames) { GstBuffer *inbuffer, *outbuffer; int i, num_buffers; GstFormat format = GST_FORMAT_DEFAULT; gint64 pos; setup_wavpackparse (); inbuffer = gst_buffer_new_and_alloc (sizeof (test_file)); memcpy (GST_BUFFER_DATA (inbuffer), test_file, sizeof (test_file)); gst_buffer_ref (inbuffer); /* should decode the buffer without problems */ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); gst_buffer_unref (inbuffer); num_buffers = g_list_length (buffers); /* should get 2 buffers, each one complete wavpack frame */ fail_unless_equals_int (num_buffers, 2); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), "wvpk", 4) == 0, "Buffer contains no Wavpack frame"); fail_unless_equals_int (GST_BUFFER_DURATION (outbuffer), 580498866); switch (i) { case 0:{ fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 0); fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 0); fail_unless_equals_int (GST_BUFFER_OFFSET_END (outbuffer), 25600); break; } case 1:{ fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 580498866); fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 25600); fail_unless_equals_int (GST_BUFFER_OFFSET_END (outbuffer), 51200); break; } } buffers = g_list_remove (buffers, outbuffer); gst_buffer_unref (outbuffer); outbuffer = NULL; } fail_unless (gst_element_query_position (wavpackparse, &format, &pos), "Position query failed"); fail_unless_equals_int (pos, 51200); fail_unless (gst_element_query_duration (wavpackparse, &format, NULL), "Duration query failed"); g_list_free (buffers); buffers = NULL; cleanup_wavpackparse (); } GST_END_TEST; GST_START_TEST (test_parsing_invalid_first_header) { GstBuffer *inbuffer, *outbuffer; int i, num_buffers; setup_wavpackparse (); inbuffer = gst_buffer_new_and_alloc (sizeof (test_file)); memcpy (GST_BUFFER_DATA (inbuffer), test_file, sizeof (test_file)); GST_BUFFER_DATA (inbuffer)[0] = 'k'; gst_buffer_ref (inbuffer); /* should decode the buffer without problems */ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); gst_buffer_unref (inbuffer); num_buffers = g_list_length (buffers); /* should get 1 buffers, the second non-broken one */ fail_unless_equals_int (num_buffers, 1); for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), "wvpk", 4) == 0, "Buffer contains no Wavpack frame"); fail_unless_equals_int (GST_BUFFER_DURATION (outbuffer), 580498866); switch (i) { case 0:{ fail_unless_equals_int (GST_BUFFER_TIMESTAMP (outbuffer), 580498866); fail_unless_equals_int (GST_BUFFER_OFFSET (outbuffer), 25600); break; } } buffers = g_list_remove (buffers, outbuffer); gst_buffer_unref (outbuffer); outbuffer = NULL; } g_list_free (buffers); buffers = NULL; cleanup_wavpackparse (); } GST_END_TEST; static Suite * wavpackparse_suite (void) { Suite *s = suite_create ("wavpackparse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_parsing_valid_frames); tcase_add_test (tc_chain, test_parsing_invalid_first_header); return s; } int main (int argc, char **argv) { int nf; Suite *s = wavpackparse_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/shapewipe.c0000644000175000017500000002274611671175354020210 00000000000000/* GStreamer * * Copyright (C) 2009 Sebastian Dröge * * 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 #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *myvideosrcpad, *mymasksrcpad, *mysinkpad; #define SHAPEWIPE_VIDEO_CAPS_STRING \ "video/x-raw-yuv, " \ "format = (GstFourcc)AYUV, " \ "width = 400, " \ "height = 400, " \ "framerate = 0/1" #define SHAPEWIPE_MASK_CAPS_STRING \ "video/x-raw-gray, " \ "bpp = 8, " \ "depth = 8, " \ "width = 400, " \ "height = 400, " \ "framerate = 0/1" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SHAPEWIPE_VIDEO_CAPS_STRING) ); static GstStaticPadTemplate videosrctemplate = GST_STATIC_PAD_TEMPLATE ("videosrc", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SHAPEWIPE_VIDEO_CAPS_STRING) ); static GstStaticPadTemplate masksrctemplate = GST_STATIC_PAD_TEMPLATE ("masksrc", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SHAPEWIPE_MASK_CAPS_STRING) ); static GstBuffer *output = NULL; static GstFlowReturn on_chain (GstPad * pad, GstBuffer * buffer) { g_return_val_if_fail (output == NULL, GST_FLOW_ERROR); output = buffer; return GST_FLOW_OK; } GST_START_TEST (test_general) { GstElement *shapewipe; GstPad *p; GstCaps *caps; GstBuffer *mask, *input; guint i, j; guint8 *data; myvideosrcpad = gst_pad_new_from_static_template (&videosrctemplate, "videosrc"); gst_pad_set_active (myvideosrcpad, TRUE); caps = gst_caps_from_string (SHAPEWIPE_VIDEO_CAPS_STRING); gst_pad_set_caps (myvideosrcpad, caps); gst_caps_unref (caps); mymasksrcpad = gst_pad_new_from_static_template (&masksrctemplate, "masksrc"); gst_pad_set_active (mymasksrcpad, TRUE); caps = gst_caps_from_string (SHAPEWIPE_MASK_CAPS_STRING); gst_pad_set_caps (mymasksrcpad, caps); gst_caps_unref (caps); mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); gst_pad_set_chain_function (mysinkpad, on_chain); gst_pad_set_active (mysinkpad, TRUE); caps = gst_caps_from_string (SHAPEWIPE_VIDEO_CAPS_STRING); gst_pad_set_caps (mysinkpad, caps); gst_caps_unref (caps); shapewipe = gst_element_factory_make ("shapewipe", NULL); fail_unless (shapewipe != NULL); p = gst_element_get_static_pad (shapewipe, "video_sink"); fail_unless (gst_pad_link (myvideosrcpad, p) == GST_PAD_LINK_OK); gst_object_unref (p); p = gst_element_get_static_pad (shapewipe, "mask_sink"); fail_unless (gst_pad_link (mymasksrcpad, p) == GST_PAD_LINK_OK); gst_object_unref (p); p = gst_element_get_static_pad (shapewipe, "src"); fail_unless (gst_pad_link (p, mysinkpad) == GST_PAD_LINK_OK); gst_object_unref (p); fail_unless (gst_element_set_state (shapewipe, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); mask = gst_buffer_new_and_alloc (400 * 400); caps = gst_caps_from_string (SHAPEWIPE_MASK_CAPS_STRING); gst_buffer_set_caps (mask, caps); gst_caps_unref (caps); data = GST_BUFFER_DATA (mask); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { if (i < 100 && j < 100) data[0] = 0; else if (i < 200 && j < 200) data[0] = 85; else if (i < 300 && j < 300) data[0] = 170; else data[0] = 254; data++; } } fail_unless (gst_pad_push (mymasksrcpad, mask) == GST_FLOW_OK); input = gst_buffer_new_and_alloc (400 * 400 * 4); caps = gst_caps_from_string (SHAPEWIPE_VIDEO_CAPS_STRING); gst_buffer_set_caps (input, caps); gst_caps_unref (caps); data = GST_BUFFER_DATA (input); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { /* This is green */ data[0] = 255; /* A */ data[1] = 173; /* Y */ data[2] = 42; /* U */ data[3] = 26; /* V */ data += 4; } } g_object_set (G_OBJECT (shapewipe), "position", 0.0, NULL); output = NULL; fail_unless (gst_pad_push (myvideosrcpad, gst_buffer_ref (input)) == GST_FLOW_OK); fail_unless (output != NULL); data = GST_BUFFER_DATA (output); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { fail_unless_equals_int (data[0], 255); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ data += 4; } } gst_buffer_unref (output); output = NULL; g_object_set (G_OBJECT (shapewipe), "position", 0.1, NULL); output = NULL; fail_unless (gst_pad_push (myvideosrcpad, gst_buffer_ref (input)) == GST_FLOW_OK); fail_unless (output != NULL); data = GST_BUFFER_DATA (output); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { if (i < 100 && j < 100) { fail_unless_equals_int (data[0], 0); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ } else { fail_unless_equals_int (data[0], 255); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ } data += 4; } } gst_buffer_unref (output); output = NULL; g_object_set (G_OBJECT (shapewipe), "position", 0.34, NULL); output = NULL; fail_unless (gst_pad_push (myvideosrcpad, gst_buffer_ref (input)) == GST_FLOW_OK); fail_unless (output != NULL); data = GST_BUFFER_DATA (output); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { if (i < 200 && j < 200) { fail_unless_equals_int (data[0], 0); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ } else { fail_unless_equals_int (data[0], 255); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ } data += 4; } } gst_buffer_unref (output); output = NULL; g_object_set (G_OBJECT (shapewipe), "position", 0.67, NULL); output = NULL; fail_unless (gst_pad_push (myvideosrcpad, gst_buffer_ref (input)) == GST_FLOW_OK); fail_unless (output != NULL); data = GST_BUFFER_DATA (output); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { if (i < 300 && j < 300) { fail_unless_equals_int (data[0], 0); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ } else { fail_unless_equals_int (data[0], 255); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ } data += 4; } } gst_buffer_unref (output); output = NULL; g_object_set (G_OBJECT (shapewipe), "position", 1.0, NULL); output = NULL; fail_unless (gst_pad_push (myvideosrcpad, gst_buffer_ref (input)) == GST_FLOW_OK); fail_unless (output != NULL); data = GST_BUFFER_DATA (output); for (i = 0; i < 400; i++) { for (j = 0; j < 400; j++) { fail_unless_equals_int (data[0], 0); /* A */ fail_unless_equals_int (data[1], 173); /* Y */ fail_unless_equals_int (data[2], 42); /* U */ fail_unless_equals_int (data[3], 26); /* V */ data += 4; } } gst_buffer_unref (output); output = NULL; gst_buffer_unref (input); fail_unless (gst_element_set_state (shapewipe, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); p = gst_element_get_static_pad (shapewipe, "video_sink"); fail_unless (gst_pad_unlink (myvideosrcpad, p)); gst_object_unref (p); p = gst_element_get_static_pad (shapewipe, "mask_sink"); fail_unless (gst_pad_unlink (mymasksrcpad, p)); gst_object_unref (p); p = gst_element_get_static_pad (shapewipe, "src"); fail_unless (gst_pad_unlink (p, mysinkpad)); gst_object_unref (p); gst_object_unref (myvideosrcpad); gst_object_unref (mymasksrcpad); gst_object_unref (mysinkpad); gst_object_unref (shapewipe); } GST_END_TEST; static Suite * shapewipe_suite (void) { Suite *s = suite_create ("shapewipe"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_set_timeout (tc_chain, 180); tcase_add_test (tc_chain, test_general); return s; } GST_CHECK_MAIN (shapewipe); gst-plugins-good-0.10.31/tests/check/elements/id3demux.c0000644000175000017500000002125711671175354017741 00000000000000/* GStreamer unit tests for id3demux * * Copyright (C) 2007 Tim-Philipp Müller * * 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 #include typedef void (CheckTagsFunc) (const GstTagList * tags, const gchar * file); static void pad_added_cb (GstElement * id3demux, GstPad * pad, GstBin * pipeline) { GstElement *sink; sink = gst_bin_get_by_name (pipeline, "fakesink"); fail_unless (gst_element_link (id3demux, sink)); gst_object_unref (sink); gst_element_set_state (sink, GST_STATE_PAUSED); } static GstBusSyncReply error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) { if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { const gchar *file = (const gchar *) user_data; GError *err = NULL; gchar *dbg = NULL; gst_message_parse_error (msg, &err, &dbg); g_error ("ERROR for %s: %s\n%s\n", file, err->message, dbg); } return GST_BUS_PASS; } static GstTagList * read_tags_from_file (const gchar * file, gboolean push_mode) { GstStateChangeReturn state_ret; GstTagList *tags = NULL; GstMessage *msg; GstElement *src, *sep, *sink, *id3demux, *pipeline; GstBus *bus; gchar *path; pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL, "Failed to create pipeline!"); bus = gst_element_get_bus (pipeline); /* kids, don't use a sync handler for this at home, really; we do because * we just want to abort and nothing else */ gst_bus_set_sync_handler (bus, error_cb, (gpointer) file); src = gst_element_factory_make ("filesrc", "filesrc"); fail_unless (src != NULL, "Failed to create 'filesrc' element!"); if (push_mode) { sep = gst_element_factory_make ("queue", "queue"); fail_unless (sep != NULL, "Failed to create 'queue' element"); } else { sep = gst_element_factory_make ("identity", "identity"); fail_unless (sep != NULL, "Failed to create 'identity' element"); } id3demux = gst_element_factory_make ("id3demux", "id3demux"); fail_unless (id3demux != NULL, "Failed to create 'id3demux' element!"); sink = gst_element_factory_make ("fakesink", "fakesink"); fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); gst_bin_add_many (GST_BIN (pipeline), src, sep, id3demux, sink, NULL); fail_unless (gst_element_link (src, sep)); fail_unless (gst_element_link (sep, id3demux)); /* can't link id3demux and sink yet, do that later */ g_signal_connect (id3demux, "pad-added", G_CALLBACK (pad_added_cb), pipeline); path = g_build_filename (GST_TEST_FILES_PATH, file, NULL); GST_LOG ("reading file '%s'", path); g_object_set (src, "location", path, NULL); state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); if (state_ret == GST_STATE_CHANGE_ASYNC) { GST_LOG ("waiting for pipeline to reach PAUSED state"); state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); } GST_LOG ("PAUSED, let's retrieve our tags"); msg = gst_bus_poll (bus, GST_MESSAGE_TAG, -1); fail_unless (msg != NULL, "Expected TAG message on bus! (%s)", file); gst_message_parse_tag (msg, &tags); fail_unless (tags != NULL, "TAG message did not contain taglist! (%s)", file); gst_message_unref (msg); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); gst_object_unref (pipeline); g_free (path); GST_INFO ("%s: tags = %" GST_PTR_FORMAT, file, tags); return tags; } static void run_check_for_file (const gchar * filename, CheckTagsFunc * check_func) { GstTagList *tags; /* first, pull-based */ tags = read_tags_from_file (filename, FALSE); fail_unless (tags != NULL, "Failed to extract tags from '%s'", filename); check_func (tags, filename); gst_tag_list_free (tags); /* FIXME: need to fix id3demux for short content in push mode */ #if 0 /* now try push-based */ tags = read_tags_from_file (filename, TRUE); fail_unless (tags != NULL, "Failed to extract tags from '%s'", filename); check_func (tags, filename); gst_tag_list_free (tags); #endif } static void check_date_1977_06_23 (const GstTagList * tags, const gchar * file) { GDate *date = NULL; gst_tag_list_get_date (tags, GST_TAG_DATE, &date); fail_unless (date != NULL, "Tags from %s should contain a GST_TAG_DATE tag"); fail_unless_equals_int (g_date_get_year (date), 1977); fail_unless_equals_int (g_date_get_month (date), 6); fail_unless_equals_int (g_date_get_day (date), 23); g_date_free (date); } GST_START_TEST (test_tdat_tyer) { run_check_for_file ("id3-407349-1.tag", check_date_1977_06_23); run_check_for_file ("id3-407349-2.tag", check_date_1977_06_23); } GST_END_TEST; static void check_wcop (const GstTagList * tags, const gchar * file) { gchar *copyright = NULL; gchar *uri = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_LICENSE_URI, &uri)); fail_unless (uri != NULL); fail_unless_equals_string (uri, "http://creativecommons.org/licenses/by/3.0/"); g_free (uri); fail_unless (gst_tag_list_get_string (tags, GST_TAG_COPYRIGHT, ©right)); fail_unless (copyright != NULL); fail_unless_equals_string (copyright, " Steadman. Licensed to the public under http://creativecommons.org/licenses/by/3.0/ verify at http://test.com"); g_free (copyright); } GST_START_TEST (test_wcop) { run_check_for_file ("id3-447000-wcop.tag", check_wcop); } GST_END_TEST; static void check_unsync_v23 (const GstTagList * tags, const gchar * file) { gchar *album = NULL; gchar *title = NULL; gchar *artist = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &title)); fail_unless (title != NULL); fail_unless_equals_string (title, "ARTIST"); /* sic */ g_free (title); fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &album)); fail_unless (album != NULL); fail_unless_equals_string (album, "Album"); g_free (album); fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &artist)); fail_unless (artist != NULL); fail_unless_equals_string (artist, "藝人"); g_free (artist); } GST_START_TEST (test_unsync_v23) { run_check_for_file ("id3-577468-unsynced-tag.tag", check_unsync_v23); } GST_END_TEST; static void check_unsync_v24 (const GstTagList * tags, const gchar * file) { const GValue *val; GstBuffer *buf; gchar *album = NULL; gchar *title = NULL; gchar *artist = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &title)); fail_unless (title != NULL); fail_unless_equals_string (title, "Starlight"); g_free (title); fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &album)); fail_unless (album != NULL); fail_unless_equals_string (album, "L'albumRockVol.4 CD1"); g_free (album); fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &artist)); fail_unless (artist != NULL); fail_unless_equals_string (artist, "Muse"); g_free (artist); val = gst_tag_list_get_value_index (tags, GST_TAG_IMAGE, 0); fail_unless (val != NULL); fail_unless (GST_VALUE_HOLDS_BUFFER (val)); buf = gst_value_get_buffer (val); fail_unless (buf != NULL); fail_unless (GST_BUFFER_CAPS (buf) != NULL); fail_unless_equals_int (GST_BUFFER_SIZE (buf), 38022); /* check for jpeg start/end markers */ fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 0xff); fail_unless_equals_int (GST_BUFFER_DATA (buf)[1], 0xd8); fail_unless_equals_int (GST_BUFFER_DATA (buf)[38020], 0xff); fail_unless_equals_int (GST_BUFFER_DATA (buf)[38021], 0xd9); } GST_START_TEST (test_unsync_v24) { run_check_for_file ("id3-588148-unsynced-v24.tag", check_unsync_v24); } GST_END_TEST; static Suite * id3demux_suite (void) { Suite *s = suite_create ("id3demux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_tdat_tyer); tcase_add_test (tc_chain, test_wcop); tcase_add_test (tc_chain, test_unsync_v23); tcase_add_test (tc_chain, test_unsync_v24); return s; } GST_CHECK_MAIN (id3demux) gst-plugins-good-0.10.31/tests/check/elements/audiowsincband.c0000644000175000017500000007630411671175354021214 00000000000000/* GStreamer * * Copyright (C) 2007 Sebastian Dröge * * audiowsincband.c: Unit test for the audiowsincband element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define AUDIO_WSINC_BAND_CAPS_STRING_32 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 32" \ #define AUDIO_WSINC_BAND_CAPS_STRING_64 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" \ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") ); static GstElement * setup_audiowsincband (void) { GstElement *audiowsincband; GST_DEBUG ("setup_audiowsincband"); audiowsincband = gst_check_setup_element ("audiowsincband"); mysrcpad = gst_check_setup_src_pad (audiowsincband, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (audiowsincband, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return audiowsincband; } static void cleanup_audiowsincband (GstElement * audiowsincband) { GST_DEBUG ("cleanup_audiowsincband"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (audiowsincband); gst_check_teardown_sink_pad (audiowsincband); gst_check_teardown_element (audiowsincband); } /* Test if data containing only one frequency component * at rate/2 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_32_bp_0hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.1); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at the band center is preserved with bandreject mode * and a 2000Hz frequency band around rate/4 */ GST_START_TEST (test_32_bp_11025hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.4); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_32_bp_22050hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.3); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_32_br_0hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at the band center is erased with bandreject mode * and a 2000Hz frequency band around rate/4 */ GST_START_TEST (test_32_br_11025hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.35); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_32_br_22050hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if buffers smaller than the kernel size are handled * correctly without accessing wrong memory areas */ GST_START_TEST (test_32_small_buffer) { GstElement *audiowsincband; GstBuffer *inbuffer; GstCaps *caps; gfloat *in; gint i; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 101, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 44100 / 16.0, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 44100 / 16.0, NULL); inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 20; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandpass mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_64_bp_0hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.1); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at the band center is preserved with bandreject mode * and a 2000Hz frequency band around rate/4 */ GST_START_TEST (test_64_bp_11025hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.4); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_64_bp_22050hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.3); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_64_br_0hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at the band center is erased with bandreject mode * and a 2000Hz frequency band around rate/4 */ GST_START_TEST (test_64_br_11025hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 4) { in[i] = 0.0; in[i + 1] = 1.0; in[i + 2] = 0.0; in[i + 3] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.35); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with bandreject mode and a * 2000Hz frequency band around rate/4 */ GST_START_TEST (test_64_br_22050hz) { GstElement *audiowsincband; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsincband = setup_audiowsincband (); /* Set to bandreject */ g_object_set (G_OBJECT (audiowsincband), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 31, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 1000, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 1000, NULL); inbuffer = gst_buffer_new_and_alloc (1024 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 1024; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; /* Test if buffers smaller than the kernel size are handled * correctly without accessing wrong memory areas */ GST_START_TEST (test_64_small_buffer) { GstElement *audiowsincband; GstBuffer *inbuffer; GstCaps *caps; gdouble *in; gint i; audiowsincband = setup_audiowsincband (); /* Set to bandpass */ g_object_set (G_OBJECT (audiowsincband), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsincband), "length", 101, NULL); fail_unless (gst_element_set_state (audiowsincband, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsincband), "lower-frequency", 44100 / 4.0 - 44100 / 16.0, NULL); g_object_set (G_OBJECT (audiowsincband), "upper-frequency", 44100 / 4.0 + 44100 / 16.0, NULL); inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 20; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_BAND_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); /* cleanup */ cleanup_audiowsincband (audiowsincband); } GST_END_TEST; static Suite * audiowsincband_suite (void) { Suite *s = suite_create ("audiowsincband"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_32_bp_0hz); tcase_add_test (tc_chain, test_32_bp_11025hz); tcase_add_test (tc_chain, test_32_bp_22050hz); tcase_add_test (tc_chain, test_32_br_0hz); tcase_add_test (tc_chain, test_32_br_11025hz); tcase_add_test (tc_chain, test_32_br_22050hz); tcase_add_test (tc_chain, test_32_small_buffer); tcase_add_test (tc_chain, test_64_bp_0hz); tcase_add_test (tc_chain, test_64_bp_11025hz); tcase_add_test (tc_chain, test_64_bp_22050hz); tcase_add_test (tc_chain, test_64_br_0hz); tcase_add_test (tc_chain, test_64_br_11025hz); tcase_add_test (tc_chain, test_64_br_22050hz); tcase_add_test (tc_chain, test_64_small_buffer); return s; } int main (int argc, char **argv) { int nf; Suite *s = audiowsincband_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/ac3parse.c0000644000175000017500000000774211677341661017725 00000000000000/* * GStreamer * * unit test for ac3parse * * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #include "parser.h" #define SRC_CAPS_TMPL "audio/x-ac3, framed=(boolean)false" #define SINK_CAPS_TMPL "audio/x-ac3, framed=(boolean)true" GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS_TMPL) ); GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS_TMPL) ); /* some data */ static guint8 ac3_frame[512] = { 0x0b, 0x77, 0xb6, 0xa8, 0x10, 0x40, 0x2f, 0x84, 0x29, 0xcb, 0xfe, 0x75, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x7c, 0xf9, 0xf3, 0xe7, 0xcf, 0x9f, 0x3e, 0x32, 0xd3, 0xff, 0xc0, 0x06, 0xe9, 0x40, 0x00, 0x6e, 0x94, 0x00, 0x06, 0xe9, 0x40, 0x00, 0x6e, 0x94, 0x00, 0x06, 0xe9, 0x40, 0x00, 0x6e, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static guint8 garbage_frame[] = { 0xff, 0xff, 0xff, 0xff, 0xff }; GST_START_TEST (test_parse_normal) { gst_parser_test_normal (ac3_frame, sizeof (ac3_frame)); } GST_END_TEST; GST_START_TEST (test_parse_drain_single) { gst_parser_test_drain_single (ac3_frame, sizeof (ac3_frame)); } GST_END_TEST; GST_START_TEST (test_parse_drain_garbage) { gst_parser_test_drain_garbage (ac3_frame, sizeof (ac3_frame), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_split) { gst_parser_test_split (ac3_frame, sizeof (ac3_frame)); } GST_END_TEST; GST_START_TEST (test_parse_skip_garbage) { gst_parser_test_skip_garbage (ac3_frame, sizeof (ac3_frame), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_detect_stream) { gst_parser_test_output_caps (ac3_frame, sizeof (ac3_frame), NULL, SINK_CAPS_TMPL ",channels=1,rate=48000,alignment=frame"); } GST_END_TEST; static Suite * ac3parse_suite (void) { Suite *s = suite_create ("ac3parse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_parse_normal); tcase_add_test (tc_chain, test_parse_drain_single); tcase_add_test (tc_chain, test_parse_drain_garbage); tcase_add_test (tc_chain, test_parse_split); tcase_add_test (tc_chain, test_parse_skip_garbage); tcase_add_test (tc_chain, test_parse_detect_stream); return s; } /* * TODO: * - Both push- and pull-modes need to be tested * * Pull-mode & EOS */ int main (int argc, char **argv) { int nf; Suite *s = ac3parse_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); /* init test context */ ctx_factory = "ac3parse"; ctx_sink_template = &sinktemplate; ctx_src_template = &srctemplate; srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/spectrum.c0000644000175000017500000004574511671175354020071 00000000000000/* GStreamer * * unit test for spectrum * * Copyright (C) <2007> Stefan Kost * * 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 #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define SPECT_CAPS_TEMPLATE_STRING \ "audio/x-raw-int, " \ " width = (int) 16, " \ " depth = (int) 16, " \ " signed = (boolean) true, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]; " \ "audio/x-raw-int, " \ " width = (int) 32, " \ " depth = (int) 32, " \ " signed = (boolean) true, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]; " \ "audio/x-raw-float, " \ " width = (int) { 32, 64 }, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]" #define SPECT_CAPS_STRING_S16 \ "audio/x-raw-int, " \ "rate = (int) 44100, " \ "channels = (int) 1, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (boolean) true" #define SPECT_CAPS_STRING_S32 \ "audio/x-raw-int, " \ "rate = (int) 44100, " \ "channels = (int) 1, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 32, " \ "depth = (int) 32, " \ "signed = (boolean) true" #define SPECT_CAPS_STRING_F32 \ "audio/x-raw-float, " \ " width = (int) 32, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) 44100, " \ " channels = (int) 1" #define SPECT_CAPS_STRING_F64 \ "audio/x-raw-float, " \ " width = (int) 64, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) 44100, " \ " channels = (int) 1" #define SPECT_BANDS 256 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SPECT_CAPS_TEMPLATE_STRING) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SPECT_CAPS_TEMPLATE_STRING) ); /* takes over reference for outcaps */ static GstElement * setup_spectrum (void) { GstElement *spectrum; GST_DEBUG ("setup_spectrum"); spectrum = gst_check_setup_element ("spectrum"); mysrcpad = gst_check_setup_src_pad (spectrum, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (spectrum, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return spectrum; } static void cleanup_spectrum (GstElement * spectrum) { GST_DEBUG ("cleanup_spectrum"); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (spectrum); gst_check_teardown_sink_pad (spectrum); gst_check_teardown_element (spectrum); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; } GST_START_TEST (test_int16) { GstElement *spectrum; GstBuffer *inbuffer, *outbuffer; GstBus *bus; GstCaps *caps; GstMessage *message; const GstStructure *structure; int i, j; gint16 *data; const GValue *list, *value; GstClockTime endtime; gfloat level; spectrum = setup_spectrum (); g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, "bands", SPECT_BANDS, "threshold", -80, NULL); fail_unless (gst_element_set_state (spectrum, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* create a 1 sec buffer with an 11025 Hz sine wave */ inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gint16)); data = (gint16 *) GST_BUFFER_DATA (inbuffer); for (j = 0; j < 44100; j += 4) { *data = 0; ++data; *data = 32767; ++data; *data = 0; ++data; *data = -32767; ++data; } caps = gst_caps_from_string (SPECT_CAPS_STRING_S16); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* create a bus to get the spectrum message on */ bus = gst_bus_new (); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_element_set_bus (spectrum, bus); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); ASSERT_OBJECT_REFCOUNT (message, "message", 1); fail_unless (message != NULL); fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); structure = gst_message_get_structure (message); fail_if (structure == NULL); fail_unless_equals_string ((char *) gst_structure_get_name (structure), "spectrum"); fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); list = gst_structure_get_value (structure, "magnitude"); for (i = 0; i < SPECT_BANDS; ++i) { value = gst_value_list_get_value (list, i); level = g_value_get_float (value); GST_DEBUG ("band[%3d] is %.2f", i, level); /* Only the bands in the middle should have a level above 60 */ fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) && level < -20.0); fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) && level > -20.0); } fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); /* clean up */ /* flush current messages,and future state change messages */ gst_bus_set_flushing (bus, TRUE); /* message has a ref to the element */ ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); gst_message_unref (message); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); gst_element_set_bus (spectrum, NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_object_unref (bus); fail_unless (gst_element_set_state (spectrum, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); cleanup_spectrum (spectrum); } GST_END_TEST; GST_START_TEST (test_int32) { GstElement *spectrum; GstBuffer *inbuffer, *outbuffer; GstBus *bus; GstCaps *caps; GstMessage *message; const GstStructure *structure; int i, j; gint32 *data; const GValue *list, *value; GstClockTime endtime; gfloat level; spectrum = setup_spectrum (); g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, "bands", SPECT_BANDS, "threshold", -80, NULL); fail_unless (gst_element_set_state (spectrum, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* create a 1 sec buffer with an 11025 Hz sine wave */ inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gint32)); data = (gint32 *) GST_BUFFER_DATA (inbuffer); for (j = 0; j < 44100; j += 4) { *data = 0; ++data; *data = 2147483647; ++data; *data = 0; ++data; *data = -2147483647; ++data; } caps = gst_caps_from_string (SPECT_CAPS_STRING_S32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* create a bus to get the spectrum message on */ bus = gst_bus_new (); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_element_set_bus (spectrum, bus); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); ASSERT_OBJECT_REFCOUNT (message, "message", 1); fail_unless (message != NULL); fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); structure = gst_message_get_structure (message); fail_if (structure == NULL); fail_unless_equals_string ((char *) gst_structure_get_name (structure), "spectrum"); fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); list = gst_structure_get_value (structure, "magnitude"); for (i = 0; i < SPECT_BANDS; ++i) { value = gst_value_list_get_value (list, i); level = g_value_get_float (value); GST_DEBUG ("band[%3d] is %.2f", i, level); /* Only the bands in the middle should have a level above 60 */ fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) && level < -20.0); fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) && level > -20.0); } fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); /* clean up */ /* flush current messages,and future state change messages */ gst_bus_set_flushing (bus, TRUE); /* message has a ref to the element */ ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); gst_message_unref (message); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); gst_element_set_bus (spectrum, NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_object_unref (bus); fail_unless (gst_element_set_state (spectrum, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); cleanup_spectrum (spectrum); } GST_END_TEST; GST_START_TEST (test_float32) { GstElement *spectrum; GstBuffer *inbuffer, *outbuffer; GstBus *bus; GstCaps *caps; GstMessage *message; const GstStructure *structure; int i, j; gfloat *data; const GValue *list, *value; GstClockTime endtime; gfloat level; spectrum = setup_spectrum (); g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, "bands", SPECT_BANDS, "threshold", -80, NULL); fail_unless (gst_element_set_state (spectrum, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* create a 1 sec buffer with an 11025 Hz sine wave */ inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gfloat)); data = (gfloat *) GST_BUFFER_DATA (inbuffer); for (j = 0; j < 44100; j += 4) { *data = 0.0; ++data; *data = 1.0; ++data; *data = 0.0; ++data; *data = -1.0; ++data; } caps = gst_caps_from_string (SPECT_CAPS_STRING_F32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* create a bus to get the spectrum message on */ bus = gst_bus_new (); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_element_set_bus (spectrum, bus); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); ASSERT_OBJECT_REFCOUNT (message, "message", 1); fail_unless (message != NULL); fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); structure = gst_message_get_structure (message); fail_if (structure == NULL); fail_unless_equals_string ((char *) gst_structure_get_name (structure), "spectrum"); fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); list = gst_structure_get_value (structure, "magnitude"); for (i = 0; i < SPECT_BANDS; ++i) { value = gst_value_list_get_value (list, i); level = g_value_get_float (value); GST_DEBUG ("band[%3d] is %.2f", i, level); /* Only the bands in the middle should have a level above 60 */ fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) && level < -20.0); fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) && level > -20.0); } fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); /* clean up */ /* flush current messages,and future state change messages */ gst_bus_set_flushing (bus, TRUE); /* message has a ref to the element */ ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); gst_message_unref (message); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); gst_element_set_bus (spectrum, NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_object_unref (bus); fail_unless (gst_element_set_state (spectrum, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); cleanup_spectrum (spectrum); } GST_END_TEST; GST_START_TEST (test_float64) { GstElement *spectrum; GstBuffer *inbuffer, *outbuffer; GstBus *bus; GstCaps *caps; GstMessage *message; const GstStructure *structure; int i, j; gdouble *data; const GValue *list, *value; GstClockTime endtime; gfloat level; spectrum = setup_spectrum (); g_object_set (spectrum, "message", TRUE, "interval", GST_SECOND / 100, "bands", SPECT_BANDS, "threshold", -80, NULL); fail_unless (gst_element_set_state (spectrum, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* create a 1 sec buffer with an 11025 Hz sine wave */ inbuffer = gst_buffer_new_and_alloc (44100 * sizeof (gdouble)); data = (gdouble *) GST_BUFFER_DATA (inbuffer); for (j = 0; j < 44100; j += 4) { *data = 0.0; ++data; *data = 1.0; ++data; *data = 0.0; ++data; *data = -1.0; ++data; } caps = gst_caps_from_string (SPECT_CAPS_STRING_F64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* create a bus to get the spectrum message on */ bus = gst_bus_new (); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_element_set_bus (spectrum, bus); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); ASSERT_OBJECT_REFCOUNT (message, "message", 1); fail_unless (message != NULL); fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (spectrum)); fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); structure = gst_message_get_structure (message); fail_if (structure == NULL); fail_unless_equals_string ((char *) gst_structure_get_name (structure), "spectrum"); fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); list = gst_structure_get_value (structure, "magnitude"); for (i = 0; i < SPECT_BANDS; ++i) { value = gst_value_list_get_value (list, i); level = g_value_get_float (value); GST_DEBUG ("band[%3d] is %.2f", i, level); /* Only the bands in the middle should have a level above 60 */ fail_if ((i == SPECT_BANDS / 2 || i == SPECT_BANDS / 2 - 1) && level < -20.0); fail_if ((i != SPECT_BANDS / 2 && i != SPECT_BANDS / 2 - 1) && level > -20.0); } fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); /* clean up */ /* flush current messages,and future state change messages */ gst_bus_set_flushing (bus, TRUE); /* message has a ref to the element */ ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 2); gst_message_unref (message); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); gst_element_set_bus (spectrum, NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_object_unref (bus); fail_unless (gst_element_set_state (spectrum, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); ASSERT_OBJECT_REFCOUNT (spectrum, "spectrum", 1); cleanup_spectrum (spectrum); } GST_END_TEST; static Suite * spectrum_suite (void) { Suite *s = suite_create ("spectrum"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_int16); tcase_add_test (tc_chain, test_int32); tcase_add_test (tc_chain, test_float32); tcase_add_test (tc_chain, test_float64); return s; } int main (int argc, char **argv) { int nf; Suite *s = spectrum_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/audioinvert.c0000644000175000017500000002155511671175354020551 00000000000000/* GStreamer * * unit test for audioinvert * * Copyright (C) 2007 Sebastian Dröge * * Greatly based on the audiopanorama unit test * Copyright (C) 2006 Stefan Kost * * 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 #include #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define INVERT_CAPS_STRING \ "audio/x-raw-int, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (bool) TRUE" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstElement * setup_invert (void) { GstElement *invert; GST_DEBUG ("setup_invert"); invert = gst_check_setup_element ("audioinvert"); mysrcpad = gst_check_setup_src_pad (invert, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (invert, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return invert; } static void cleanup_invert (GstElement * invert) { GST_DEBUG ("cleanup_invert"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (invert); gst_check_teardown_sink_pad (invert); gst_check_teardown_element (invert); } GST_START_TEST (test_passthrough) { GstElement *invert; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 128, -512 }; gint16 *res; invert = setup_invert (); fail_unless (gst_element_set_state (invert, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (INVERT_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 8) == 0); /* cleanup */ cleanup_invert (invert); } GST_END_TEST; GST_START_TEST (test_zero) { GstElement *invert; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 128, -512 }; gint16 out[4] = { 0, 0, 0, 0 }; gint16 *res; invert = setup_invert (); g_object_set (G_OBJECT (invert), "degree", 0.5, NULL); fail_unless (gst_element_set_state (invert, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (INVERT_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_invert (invert); } GST_END_TEST; GST_START_TEST (test_full_inverse) { GstElement *invert; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 128, -512 }; gint16 out[4] = { -16385, 255, -129, 511 }; gint16 *res; invert = setup_invert (); g_object_set (G_OBJECT (invert), "degree", 1.0, NULL); fail_unless (gst_element_set_state (invert, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (INVERT_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_invert (invert); } GST_END_TEST; GST_START_TEST (test_25_inverse) { GstElement *invert; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 128, -512 }; gint16 out[4] = { 8191, -128, 63, -256 }; gint16 *res; invert = setup_invert (); g_object_set (G_OBJECT (invert), "degree", 0.25, NULL); fail_unless (gst_element_set_state (invert, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (INVERT_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_invert (invert); } GST_END_TEST; static Suite * invert_suite (void) { Suite *s = suite_create ("invert"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_passthrough); tcase_add_test (tc_chain, test_zero); tcase_add_test (tc_chain, test_full_inverse); tcase_add_test (tc_chain, test_25_inverse); return s; } int main (int argc, char **argv) { int nf; Suite *s = invert_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/parser.c0000644000175000017500000002762711677341661017524 00000000000000/* * GStreamer * * unit test for (audio) parser * * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #include "elements/parser.h" /* context state variables */ const gchar *ctx_factory; GstStaticPadTemplate *ctx_sink_template; GstStaticPadTemplate *ctx_src_template; GstCaps *ctx_input_caps; GstCaps *ctx_output_caps; guint ctx_discard = 0; datablob ctx_headers[MAX_HEADERS] = { {NULL, 0}, }; gboolean ctx_no_metadata = FALSE; /* helper variables */ GList *current_buf = NULL; GstPad *srcpad, *sinkpad; guint dataoffset = 0; GstClockTime ts_counter = 0; gint64 offset_counter = 0; guint buffer_counter = 0; typedef struct { guint discard; guint buffers_before_offset_skip; guint offset_skip_amount; const guint8 *data_to_verify; guint data_to_verify_size; GstCaps *caps; gboolean no_metadata; } buffer_verify_data_s; /* takes a copy of the passed buffer data */ static GstBuffer * buffer_new (const unsigned char *buffer_data, guint size) { GstBuffer *buffer; buffer = gst_buffer_new_and_alloc (size); if (buffer_data) { memcpy (GST_BUFFER_DATA (buffer), buffer_data, size); } else { guint i; /* Create a recognizable pattern (loop 0x00 -> 0xff) in the data block */ for (i = 0; i < size; i++) { GST_BUFFER_DATA (buffer)[i] = i % 0x100; } } gst_buffer_set_caps (buffer, GST_PAD_CAPS (srcpad)); GST_BUFFER_OFFSET (buffer) = dataoffset; dataoffset += size; return buffer; } /* * Adds buffer sizes together. */ static void buffer_count_size (void *buffer, void *user_data) { guint *sum = (guint *) user_data; *sum += GST_BUFFER_SIZE (buffer); } /* * Verify that given buffer contains predefined ADTS frame. */ static void buffer_verify_data (void *buffer, void *user_data) { buffer_verify_data_s *vdata; if (!user_data) { return; } vdata = (buffer_verify_data_s *) user_data; GST_DEBUG ("discard: %d", vdata->discard); if (vdata->discard) { buffer_counter++; if (buffer_counter == vdata->discard) { buffer_counter = 0; vdata->discard = 0; } return; } fail_unless (GST_BUFFER_SIZE (buffer) == vdata->data_to_verify_size); fail_unless (memcmp (GST_BUFFER_DATA (buffer), vdata->data_to_verify, vdata->data_to_verify_size) == 0); if (vdata->buffers_before_offset_skip) { /* This is for skipping the garbage in some test cases */ if (buffer_counter == vdata->buffers_before_offset_skip) { offset_counter += vdata->offset_skip_amount; } } if (!vdata->no_metadata) { fail_unless (GST_BUFFER_TIMESTAMP (buffer) == ts_counter); fail_unless (GST_BUFFER_DURATION (buffer) != 0); fail_unless (GST_BUFFER_OFFSET (buffer) == offset_counter); } if (vdata->caps) { GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?", GST_BUFFER_CAPS (buffer), vdata->caps); fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), vdata->caps)); } ts_counter += GST_BUFFER_DURATION (buffer); offset_counter += GST_BUFFER_SIZE (buffer); buffer_counter++; } static GstElement * setup_element (const gchar * factory, GstStaticPadTemplate * sink_template, GstCaps * sink_caps, GstStaticPadTemplate * src_template, GstCaps * src_caps) { GstElement *element; GstBus *bus; element = gst_check_setup_element (factory); srcpad = gst_check_setup_src_pad (element, src_template, src_caps); sinkpad = gst_check_setup_sink_pad (element, sink_template, sink_caps); gst_pad_set_active (srcpad, TRUE); gst_pad_set_active (sinkpad, TRUE); bus = gst_bus_new (); gst_element_set_bus (element, bus); fail_unless (gst_element_set_state (element, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); ts_counter = offset_counter = buffer_counter = 0; buffers = NULL; return element; } static void cleanup_element (GstElement * element) { GstBus *bus; /* Free parsed buffers */ gst_check_drop_buffers (); bus = GST_ELEMENT_BUS (element); gst_bus_set_flushing (bus, TRUE); gst_object_unref (bus); gst_pad_set_active (srcpad, FALSE); gst_pad_set_active (sinkpad, FALSE); gst_check_teardown_src_pad (element); gst_check_teardown_sink_pad (element); gst_check_teardown_element (element); } /* inits a standard test */ void gst_parser_test_init (GstParserTest * ptest, guint8 * data, guint size, guint num) { /* need these */ fail_unless (ctx_factory != NULL); fail_unless (ctx_src_template != NULL); fail_unless (ctx_sink_template != NULL); /* basics */ memset (ptest, 0, sizeof (*ptest)); ptest->factory = ctx_factory; ptest->sink_template = ctx_sink_template; ptest->src_template = ctx_src_template; ptest->framed = TRUE; /* could be NULL if not relevant/needed */ ptest->src_caps = ctx_input_caps; ptest->sink_caps = ctx_output_caps; memcpy (ptest->headers, ctx_headers, sizeof (ptest->headers)); ptest->discard = ctx_discard; /* some data that pleases caller */ ptest->series[0].data = data; ptest->series[0].size = size; ptest->series[0].num = num; ptest->series[0].fpb = 1; ptest->series[1].fpb = 1; ptest->series[2].fpb = 1; ptest->no_metadata = ctx_no_metadata; } /* * Test if the parser pushes clean data properly. */ void gst_parser_test_run (GstParserTest * test, GstCaps ** out_caps) { buffer_verify_data_s vdata = { 0, 0, 0, NULL, 0, NULL, FALSE }; GstElement *element; GstBuffer *buffer = NULL; GstCaps *src_caps; guint i, j, k; guint frames = 0, size = 0; element = setup_element (test->factory, test->sink_template, NULL, test->src_template, test->src_caps); /* push some setup headers */ for (j = 0; j < G_N_ELEMENTS (test->headers) && test->headers[j].data; j++) { buffer = buffer_new (test->headers[j].data, test->headers[j].size); fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK); } for (j = 0; j < 3; j++) { for (i = 0; i < test->series[j].num; i++) { /* sanity enforcing */ for (k = 0; k < MAX (1, test->series[j].fpb); k++) { if (!k) buffer = buffer_new (test->series[j].data, test->series[j].size); else { GstCaps *caps = gst_buffer_get_caps (buffer); buffer = gst_buffer_join (buffer, buffer_new (test->series[j].data, test->series[j].size)); if (caps) { gst_buffer_set_caps (buffer, caps); gst_caps_unref (caps); } } } fail_unless_equals_int (gst_pad_push (srcpad, buffer), GST_FLOW_OK); if (j == 0) vdata.buffers_before_offset_skip++; else if (j == 1) vdata.offset_skip_amount += test->series[j].size * test->series[j].fpb; if (j != 1) { frames += test->series[j].fpb; size += test->series[j].size * test->series[j].fpb; } } } gst_pad_push_event (srcpad, gst_event_new_eos ()); if (G_LIKELY (test->framed)) fail_unless_equals_int (g_list_length (buffers) - test->discard, frames); /* if all frames are identical, do extended test, * otherwise only verify total data size */ if (test->series[0].data && (!test->series[2].size || (test->series[0].size == test->series[2].size && test->series[2].data && !memcmp (test->series[0].data, test->series[2].data, test->series[0].size)))) { vdata.data_to_verify = test->series[0].data; vdata.data_to_verify_size = test->series[0].size; vdata.caps = test->sink_caps; vdata.discard = test->discard; vdata.no_metadata = test->no_metadata; g_list_foreach (buffers, buffer_verify_data, &vdata); } else { guint datasum = 0; g_list_foreach (buffers, buffer_count_size, &datasum); size -= test->dropped; fail_unless_equals_int (datasum, size); } src_caps = gst_pad_get_negotiated_caps (sinkpad); GST_LOG ("output caps: %" GST_PTR_FORMAT, src_caps); if (test->sink_caps) { GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?", src_caps, test->sink_caps); fail_unless (gst_caps_is_equal (src_caps, test->sink_caps)); } if (out_caps) *out_caps = src_caps; else gst_caps_unref (src_caps); cleanup_element (element); } /* * Test if the parser pushes clean data properly. */ void gst_parser_test_normal (guint8 * data, guint size) { GstParserTest ptest; gst_parser_test_init (&ptest, data, size, 10); gst_parser_test_run (&ptest, NULL); } /* * Test if parser drains its buffers properly. Even one single frame * should be drained and pushed forward when EOS occurs. This single frame * case is special, since normally the parser needs more data to be sure * about stream format. But it should still push the frame forward in EOS. */ void gst_parser_test_drain_single (guint8 * data, guint size) { GstParserTest ptest; gst_parser_test_init (&ptest, data, size, 1); gst_parser_test_run (&ptest, NULL); } /* * Make sure that parser does not drain garbage when EOS occurs. */ void gst_parser_test_drain_garbage (guint8 * data, guint size, guint8 * garbage, guint gsize) { GstParserTest ptest; /* provide enough initial frames since it may take some parsers some * time to be convinced of proper sync */ gst_parser_test_init (&ptest, data, size, 10); ptest.series[1].data = garbage; ptest.series[1].size = gsize; ptest.series[1].num = 1; gst_parser_test_run (&ptest, NULL); } /* * Test if parser splits a buffer that contains two frames into two * separate buffers properly. */ void gst_parser_test_split (guint8 * data, guint size) { GstParserTest ptest; gst_parser_test_init (&ptest, data, size, 10); ptest.series[0].fpb = 2; gst_parser_test_run (&ptest, NULL); } /* * Test if the parser skips garbage between frames properly. */ void gst_parser_test_skip_garbage (guint8 * data, guint size, guint8 * garbage, guint gsize) { GstParserTest ptest; gst_parser_test_init (&ptest, data, size, 10); ptest.series[1].data = garbage; ptest.series[1].size = gsize; ptest.series[1].num = 1; ptest.series[2].data = data; ptest.series[2].size = size; ptest.series[2].num = 10; gst_parser_test_run (&ptest, NULL); } /* * Test if the src caps are set according to stream format. */ void gst_parser_test_output_caps (guint8 * data, guint size, const gchar * input_caps, const gchar * output_caps) { GstParserTest ptest; gst_parser_test_init (&ptest, data, size, 10); if (input_caps) { ptest.src_caps = gst_caps_from_string (input_caps); fail_unless (ptest.src_caps != NULL); } if (output_caps) { ptest.sink_caps = gst_caps_from_string (output_caps); fail_unless (ptest.sink_caps != NULL); } gst_parser_test_run (&ptest, NULL); if (ptest.sink_caps) gst_caps_unref (ptest.sink_caps); if (ptest.src_caps) gst_caps_unref (ptest.src_caps); } /* * Test if the src caps are set according to stream format. */ GstCaps * gst_parser_test_get_output_caps (guint8 * data, guint size, const gchar * input_caps) { GstParserTest ptest; GstCaps *out_caps; gst_parser_test_init (&ptest, data, size, 10); if (input_caps) { ptest.src_caps = gst_caps_from_string (input_caps); fail_unless (ptest.src_caps != NULL); } gst_parser_test_run (&ptest, &out_caps); if (ptest.src_caps) gst_caps_unref (ptest.src_caps); return out_caps; } gst-plugins-good-0.10.31/tests/check/elements/icydemux.c0000644000175000017500000001631111671175354020041 00000000000000/* * icydemux.c - Test icydemux element * Copyright (C) 2006 Michael Smith * * 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 /* Chunk of data: 8 bytes, followed by a metadata-length byte of 2, followed by * some metadata (32 bytes), then some more data. */ #define TEST_METADATA \ "Test metadata" #define ICY_METADATA \ "StreamTitle='" TEST_METADATA "';\0\0\0\0" #define ICY_DATA \ "aaaaaaaa" \ "\x02" \ ICY_METADATA \ "bbbbbbbb" #define ICYCAPS "application/x-icy, metadata-interval = (int)8" #define SRC_CAPS "application/x-icy, metadata-interval = (int)[0, MAX]" #define SINK_CAPS "ANY" static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS) ); static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS) ); static GstElement *icydemux; static GstBus *bus; GstPad *srcpad, *sinkpad; static GstStaticCaps typefind_caps = GST_STATIC_CAPS ("application/octet-stream"); static gboolean fake_typefind_caps; /* FALSE */ static void typefind_succeed (GstTypeFind * tf, gpointer private) { if (fake_typefind_caps) { gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, gst_static_caps_get (&typefind_caps)); } } static void icydemux_found_pad (GstElement * src, GstPad * pad, gpointer data) { GST_DEBUG ("got new pad %" GST_PTR_FORMAT, pad); /* Turns out that this asserts a refcount which is wrong for this * case (adding the pad from a pad-added callback), so just do the same * thing inline... */ /* sinkpad = gst_check_setup_sink_pad (icydemux, &sinktemplate, NULL); */ sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); fail_if (sinkpad == NULL, "Couldn't create sinkpad"); srcpad = gst_element_get_static_pad (icydemux, "src"); fail_if (srcpad == NULL, "Failed to get srcpad from icydemux"); gst_pad_set_chain_function (sinkpad, gst_check_chain_func); GST_DEBUG ("checking srcpad %p refcount", srcpad); /* 1 from element, 1 from signal, 1 from us */ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 3); GST_DEBUG ("linking srcpad"); fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK, "Failed to link pads"); gst_object_unref (srcpad); gst_pad_set_active (sinkpad, TRUE); } static GstElement * create_icydemux (void) { icydemux = gst_check_setup_element ("icydemux"); srcpad = gst_check_setup_src_pad (icydemux, &srctemplate, NULL); g_signal_connect (icydemux, "pad-added", G_CALLBACK (icydemux_found_pad), NULL); bus = gst_bus_new (); gst_element_set_bus (icydemux, bus); fail_unless (gst_element_set_state (icydemux, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, "could not set to playing"); return icydemux; } static void cleanup_icydemux (void) { gst_bus_set_flushing (bus, TRUE); gst_object_unref (bus); bus = NULL; gst_check_teardown_src_pad (icydemux); if (sinkpad) gst_check_teardown_sink_pad (icydemux); gst_check_teardown_element (icydemux); srcpad = NULL; sinkpad = NULL; icydemux = NULL; } static void push_data (const guint8 * data, int len, GstCaps * caps, gint64 offset) { GstFlowReturn res; GstBuffer *buffer = gst_buffer_new_and_alloc (len); memcpy (GST_BUFFER_DATA (buffer), data, len); gst_buffer_set_caps (buffer, caps); GST_BUFFER_OFFSET (buffer) = offset; res = gst_pad_push (srcpad, buffer); fail_unless (res == GST_FLOW_OK, "Failed pushing buffer: %d", res); } GST_START_TEST (test_demux) { GstMessage *message; GstTagList *tags; const GValue *tag_val; const gchar *tag; GstCaps *caps; fail_unless (gst_type_find_register (NULL, "success", GST_RANK_PRIMARY, typefind_succeed, NULL, gst_static_caps_get (&typefind_caps), NULL, NULL)); fake_typefind_caps = TRUE; caps = gst_caps_from_string (ICYCAPS); create_icydemux (); push_data ((guint8 *) ICY_DATA, sizeof (ICY_DATA), caps, -1); message = gst_bus_poll (bus, GST_MESSAGE_TAG, -1); fail_unless (message != NULL); gst_message_parse_tag (message, &tags); fail_unless (tags != NULL); tag_val = gst_tag_list_get_value_index (tags, GST_TAG_TITLE, 0); fail_unless (tag_val != NULL); tag = g_value_get_string (tag_val); fail_unless (tag != NULL); fail_unless_equals_string (TEST_METADATA, (char *) tag); gst_tag_list_free (tags); gst_message_unref (message); gst_caps_unref (caps); cleanup_icydemux (); fake_typefind_caps = FALSE; } GST_END_TEST; /* run this test first before the custom typefind function is set up */ GST_START_TEST (test_first_buf_offset_when_merged_for_typefinding) { const guint8 buf1[] = { 'M' }; const guint8 buf2[] = { 'P', '+', 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; GstCaps *icy_caps; GstPad *icy_srcpad; fake_typefind_caps = FALSE; create_icydemux (); icy_caps = gst_caps_from_string (ICYCAPS); push_data (buf1, G_N_ELEMENTS (buf1), icy_caps, 0); /* one byte isn't really enough for typefinding, can't have a srcpad yet */ fail_unless (gst_element_get_static_pad (icydemux, "src") == NULL); push_data (buf2, G_N_ELEMENTS (buf2), icy_caps, -1); /* should have been enough to create a audio/x-musepack source pad .. */ icy_srcpad = gst_element_get_static_pad (icydemux, "src"); fail_unless (icy_srcpad != NULL); gst_object_unref (icy_srcpad); fail_unless (g_list_length (buffers) > 0); /* first buffer should have offset 0 even after it was merged with 2nd buf */ fail_unless (GST_BUFFER_OFFSET (GST_BUFFER_CAST (buffers->data)) == 0); /* first buffer should have caps set */ fail_unless (GST_BUFFER_CAPS (GST_BUFFER_CAST (buffers->data)) != NULL); gst_caps_unref (icy_caps); cleanup_icydemux (); } GST_END_TEST; GST_START_TEST (test_not_negotiated) { GstBuffer *buf; create_icydemux (); buf = gst_buffer_new_and_alloc (0); GST_BUFFER_OFFSET (buf) = 0; fail_unless_equals_int (gst_pad_push (srcpad, buf), GST_FLOW_NOT_NEGOTIATED); buf = NULL; cleanup_icydemux (); } GST_END_TEST; static Suite * icydemux_suite (void) { Suite *s = suite_create ("icydemux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_demux); tcase_add_test (tc_chain, test_first_buf_offset_when_merged_for_typefinding); tcase_add_test (tc_chain, test_not_negotiated); return s; } GST_CHECK_MAIN (icydemux) gst-plugins-good-0.10.31/tests/check/elements/level.c0000644000175000017500000002365511671175354017332 00000000000000/* GStreamer * * unit test for level * * Copyright (C) <2005> Thomas Vander Stichele * * 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 #include #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define LEVEL_CAPS_TEMPLATE_STRING \ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 8 ], " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) {8, 16}, " \ "depth = (int) {8, 16}, " \ "signed = (boolean) true" #define LEVEL_CAPS_STRING \ "audio/x-raw-int, " \ "rate = (int) 1000, " \ "channels = (int) 2, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (boolean) true" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (LEVEL_CAPS_TEMPLATE_STRING) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (LEVEL_CAPS_TEMPLATE_STRING) ); /* takes over reference for outcaps */ static GstElement * setup_level (void) { GstElement *level; GST_DEBUG ("setup_level"); level = gst_check_setup_element ("level"); mysrcpad = gst_check_setup_src_pad (level, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (level, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return level; } static void cleanup_level (GstElement * level) { GST_DEBUG ("cleanup_level"); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (level); gst_check_teardown_sink_pad (level); gst_check_teardown_element (level); } GST_START_TEST (test_int16) { GstElement *level; GstBuffer *inbuffer, *outbuffer; GstBus *bus; GstCaps *caps; GstMessage *message; const GstStructure *structure; int i, j; gint16 *data; const GValue *list, *value; GstClockTime endtime; gdouble dB; level = setup_level (); g_object_set (level, "message", TRUE, "interval", GST_SECOND / 10, NULL); fail_unless (gst_element_set_state (level, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* create a fake 0.1 sec buffer with a half-amplitude block signal */ inbuffer = gst_buffer_new_and_alloc (400); data = (gint16 *) GST_BUFFER_DATA (inbuffer); for (j = 0; j < 200; ++j) { *data = 16536; ++data; } caps = gst_caps_from_string (LEVEL_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* create a bus to get the level message on */ bus = gst_bus_new (); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_element_set_bus (level, bus); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); ASSERT_OBJECT_REFCOUNT (message, "message", 1); fail_unless (message != NULL); fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (level)); fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); structure = gst_message_get_structure (message); fail_if (structure == NULL); fail_unless_equals_string ((char *) gst_structure_get_name (structure), "level"); fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); /* block wave of half amplitude has -5.94 dB for rms, peak and decay */ for (i = 0; i < 2; ++i) { const gchar *fields[3] = { "rms", "peak", "decay" }; for (j = 0; j < 3; ++j) { list = gst_structure_get_value (structure, fields[j]); value = gst_value_list_get_value (list, i); dB = g_value_get_double (value); GST_DEBUG ("%s is %lf", fields[j], dB); fail_if (dB < -6.0); fail_if (dB > -5.9); } } fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); /* clean up */ /* flush current messages,and future state change messages */ gst_bus_set_flushing (bus, TRUE); /* message has a ref to the element */ ASSERT_OBJECT_REFCOUNT (level, "level", 2); gst_message_unref (message); ASSERT_OBJECT_REFCOUNT (level, "level", 1); gst_element_set_bus (level, NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_object_unref (bus); gst_buffer_unref (outbuffer); fail_unless (gst_element_set_state (level, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); ASSERT_OBJECT_REFCOUNT (level, "level", 1); cleanup_level (level); } GST_END_TEST; GST_START_TEST (test_int16_panned) { GstElement *level; GstBuffer *inbuffer, *outbuffer; GstBus *bus; GstCaps *caps; GstMessage *message; const GstStructure *structure; int j; gint16 *data; const GValue *list, *value; GstClockTime endtime; gdouble dB; const gchar *fields[3] = { "rms", "peak", "decay" }; level = setup_level (); g_object_set (level, "message", TRUE, "interval", GST_SECOND / 10, NULL); fail_unless (gst_element_set_state (level, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* create a fake 0.1 sec buffer with a half-amplitude block signal */ inbuffer = gst_buffer_new_and_alloc (400); data = (gint16 *) GST_BUFFER_DATA (inbuffer); for (j = 0; j < 100; ++j) { *data = 0; ++data; *data = 16536; ++data; } caps = gst_caps_from_string (LEVEL_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* create a bus to get the level message on */ bus = gst_bus_new (); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_element_set_bus (level, bus); ASSERT_OBJECT_REFCOUNT (bus, "bus", 2); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); message = gst_bus_poll (bus, GST_MESSAGE_ELEMENT, -1); ASSERT_OBJECT_REFCOUNT (message, "message", 1); fail_unless (message != NULL); fail_unless (GST_MESSAGE_SRC (message) == GST_OBJECT (level)); fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT); structure = gst_message_get_structure (message); fail_if (structure == NULL); fail_unless_equals_string ((char *) gst_structure_get_name (structure), "level"); fail_unless (gst_structure_get_clock_time (structure, "endtime", &endtime)); /* silence has 0 dB for rms, peak and decay */ for (j = 0; j < 3; ++j) { list = gst_structure_get_value (structure, fields[j]); value = gst_value_list_get_value (list, 0); dB = g_value_get_double (value); GST_DEBUG ("%s[0] is %lf", fields[j], dB); #ifdef HAVE_ISINF fail_unless (isinf (dB)); #elif defined (HAVE_FPCLASS) fail_unless (fpclass (dB) == FP_NINF); #endif } /* block wave of half amplitude has -5.94 dB for rms, peak and decay */ for (j = 0; j < 3; ++j) { list = gst_structure_get_value (structure, fields[j]); value = gst_value_list_get_value (list, 1); dB = g_value_get_double (value); GST_DEBUG ("%s[1] is %lf", fields[j], dB); fail_if (dB < -6.0); fail_if (dB > -5.9); } fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); fail_unless (inbuffer == outbuffer); /* clean up */ /* flush current messages,and future state change messages */ gst_bus_set_flushing (bus, TRUE); /* message has a ref to the element */ ASSERT_OBJECT_REFCOUNT (level, "level", 2); gst_message_unref (message); ASSERT_OBJECT_REFCOUNT (level, "level", 1); gst_element_set_bus (level, NULL); ASSERT_OBJECT_REFCOUNT (bus, "bus", 1); gst_object_unref (bus); gst_buffer_unref (outbuffer); fail_unless (gst_element_set_state (level, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); ASSERT_OBJECT_REFCOUNT (level, "level", 1); cleanup_level (level); } GST_END_TEST; static Suite * level_suite (void) { Suite *s = suite_create ("level"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_int16); tcase_add_test (tc_chain, test_int16_panned); return s; } int main (int argc, char **argv) { int nf; Suite *s = level_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/audiopanorama.c0000644000175000017500000005605011671175354021036 00000000000000/* GStreamer * * unit test for audiopanorama * * Copyright (C) 2006 Stefan Kost * * 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 #include #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define PANORAMA_MONO_CAPS_STRING \ "audio/x-raw-int, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (bool) TRUE" #define PANORAMA_STEREO_CAPS_STRING \ "audio/x-raw-int, " \ "channels = (int) 2, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (bool) TRUE" #define PANORAMA_WRONG_CAPS_STRING \ "audio/x-raw-int, " \ "channels = (int) 5, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (bool) FALSE" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 2, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstStaticPadTemplate msrctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstStaticPadTemplate ssrctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 2, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstElement * setup_panorama_m (void) { GstElement *panorama; GST_DEBUG ("setup_panorama"); panorama = gst_check_setup_element ("audiopanorama"); mysrcpad = gst_check_setup_src_pad (panorama, &msrctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return panorama; } static GstElement * setup_panorama_s (void) { GstElement *panorama; GST_DEBUG ("setup_panorama"); panorama = gst_check_setup_element ("audiopanorama"); mysrcpad = gst_check_setup_src_pad (panorama, &ssrctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (panorama, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return panorama; } static void cleanup_panorama (GstElement * panorama) { GST_DEBUG ("cleanup_panorama"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (panorama); gst_check_teardown_sink_pad (panorama); gst_check_teardown_element (panorama); } GST_START_TEST (test_mono_middle) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[2] = { 16384, -256 }; gint16 out[4] = { 8192, 8192, -128, -128 }; gint16 *res; panorama = setup_panorama_m (); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_mono_left) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[2] = { 16384, -256 }; gint16 out[4] = { 16384, 0, -256, 0 }; gint16 *res; panorama = setup_panorama_m (); g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_mono_right) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[2] = { 16384, -256 }; gint16 out[4] = { 0, 16384, 0, -256 }; gint16 *res; panorama = setup_panorama_m (); g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_stereo_middle) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 8192, 128 }; gint16 *res; panorama = setup_panorama_s (); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... so keep an extra one */ gst_buffer_ref (inbuffer); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (inbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 8) == 0); /* cleanup */ gst_buffer_unref (inbuffer); cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_stereo_left) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 8192, 128 }; gint16 out[4] = { 16384 - 256, 0, 8192 + 128, 0 }; gint16 *res; panorama = setup_panorama_s (); g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_stereo_right) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 8192, 128 }; gint16 out[4] = { 0, -256 + 16384, 0, 128 + 8192 }; gint16 *res; panorama = setup_panorama_s (); g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_mono_middle_simple) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[2] = { 16384, -256 }; gint16 out[4] = { 16384, 16384, -256, -256 }; gint16 *res; panorama = setup_panorama_m (); g_object_set (G_OBJECT (panorama), "method", 1, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_mono_left_simple) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[2] = { 16384, -256 }; gint16 out[4] = { 16384, 0, -256, 0 }; gint16 *res; panorama = setup_panorama_m (); g_object_set (G_OBJECT (panorama), "method", 1, NULL); g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_mono_right_simple) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[2] = { 16384, -256 }; gint16 out[4] = { 0, 16384, 0, -256 }; gint16 *res; panorama = setup_panorama_m (); g_object_set (G_OBJECT (panorama), "method", 1, NULL); g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 4) == 0); caps = gst_caps_from_string (PANORAMA_MONO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_stereo_middle_simple) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 8192, 128 }; gint16 *res; panorama = setup_panorama_s (); g_object_set (G_OBJECT (panorama), "method", 1, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... so keep an extra one */ gst_buffer_ref (inbuffer); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (inbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 8) == 0); /* cleanup */ gst_buffer_unref (inbuffer); cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_stereo_left_simple) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 8192, 128 }; gint16 out[4] = { 16384, 0, 8192, 0 }; gint16 *res; panorama = setup_panorama_s (); g_object_set (G_OBJECT (panorama), "method", 1, NULL); g_object_set (G_OBJECT (panorama), "panorama", -1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_stereo_right_simple) { GstElement *panorama; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[4] = { 16384, -256, 8192, 128 }; gint16 out[4] = { 0, -256, 0, 128 }; gint16 *res; panorama = setup_panorama_s (); g_object_set (G_OBJECT (panorama), "method", 1, NULL); g_object_set (G_OBJECT (panorama), "panorama", 1.0, NULL); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (8); memcpy (GST_BUFFER_DATA (inbuffer), in, 8); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 8) == 0); caps = gst_caps_from_string (PANORAMA_STEREO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d", out[0], out[1], out[2], out[3], res[0], res[1], res[2], res[3]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, 8) == 0); /* cleanup */ cleanup_panorama (panorama); } GST_END_TEST; GST_START_TEST (test_wrong_caps) { GstElement *panorama; GstBuffer *inbuffer; gint16 in[2] = { 16384, -256 }; GstBus *bus; GstMessage *message; GstCaps *caps; panorama = setup_panorama_m (); bus = gst_bus_new (); fail_unless (gst_element_set_state (panorama, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (inbuffer), in, 4); caps = gst_caps_from_string (PANORAMA_WRONG_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_ref (inbuffer); /* set a bus here so we avoid getting state change messages */ gst_element_set_bus (panorama, bus); /* pushing gives an error because it can't negotiate with wrong caps */ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_NOT_NEGOTIATED); /* ... and the buffer would have been lost if we didn't ref it ourselves */ ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_unref (inbuffer); fail_unless_equals_int (g_list_length (buffers), 0); /* panorama_set_caps should not have been called since basetransform caught * the negotiation problem */ fail_if ((message = gst_bus_pop (bus)) != NULL); /* cleanup */ gst_element_set_bus (panorama, NULL); gst_object_unref (GST_OBJECT (bus)); cleanup_panorama (panorama); } GST_END_TEST; static Suite * panorama_suite (void) { Suite *s = suite_create ("panorama"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_mono_middle); tcase_add_test (tc_chain, test_mono_left); tcase_add_test (tc_chain, test_mono_right); tcase_add_test (tc_chain, test_stereo_middle); tcase_add_test (tc_chain, test_stereo_left); tcase_add_test (tc_chain, test_stereo_right); tcase_add_test (tc_chain, test_mono_middle_simple); tcase_add_test (tc_chain, test_mono_left_simple); tcase_add_test (tc_chain, test_mono_right_simple); tcase_add_test (tc_chain, test_stereo_middle_simple); tcase_add_test (tc_chain, test_stereo_left_simple); tcase_add_test (tc_chain, test_stereo_right_simple); tcase_add_test (tc_chain, test_wrong_caps); return s; } int main (int argc, char **argv) { int nf; Suite *s = panorama_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/rglimiter.c0000644000175000017500000001662311671175354020216 00000000000000/* GStreamer ReplayGain limiter * * Copyright (C) 2007 Rene Stadler * * rglimiter.c: Unit test for the rglimiter element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; #define RG_LIMITER_CAPS_TEMPLATE_STRING \ "audio/x-raw-float, " \ "width = (int) 32, " \ "endianness = (int) BYTE_ORDER, " \ "channels = (int) [ 1, MAX ], " \ "rate = (int) [ 1, MAX ]" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (RG_LIMITER_CAPS_TEMPLATE_STRING) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (RG_LIMITER_CAPS_TEMPLATE_STRING) ); static GstElement * setup_rglimiter (void) { GstElement *element; GST_DEBUG ("setup_rglimiter"); element = gst_check_setup_element ("rglimiter"); mysrcpad = gst_check_setup_src_pad (element, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return element; } static void cleanup_rglimiter (GstElement * element) { GST_DEBUG ("cleanup_rglimiter"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_check_teardown_src_pad (element); gst_check_teardown_sink_pad (element); gst_check_teardown_element (element); } static void set_playing_state (GstElement * element) { fail_unless (gst_element_set_state (element, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "Could not set state to PLAYING"); } static const gfloat test_input[] = { -2.0, -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0, 2.0 }; static const gfloat test_output[] = { -0.99752737684336523, /* -2.0 */ -0.88079707797788243, /* -1.0 */ -0.7310585786300049, /* -0.75 */ -0.5, -0.25, 0.0, 0.25, 0.5, 0.7310585786300049, /* 0.75 */ 0.88079707797788243, /* 1.0 */ 0.99752737684336523, /* 2.0 */ }; static GstBuffer * create_test_buffer (void) { GstBuffer *buf = gst_buffer_new_and_alloc (sizeof (test_input)); GstCaps *caps; memcpy (GST_BUFFER_DATA (buf), test_input, sizeof (test_input)); caps = gst_caps_new_simple ("audio/x-raw-float", "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 1, "endianness", G_TYPE_INT, G_BYTE_ORDER, "width", G_TYPE_INT, 32, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } static void verify_test_buffer (GstBuffer * buf) { gfloat *output = (gfloat *) GST_BUFFER_DATA (buf); gint i; fail_unless (GST_BUFFER_SIZE (buf) == sizeof (test_output)); for (i = 0; i < G_N_ELEMENTS (test_input); i++) fail_unless (ABS (output[i] - test_output[i]) < 1.e-6, "Incorrect output value %.6f for input %.2f, expected %.6f", output[i], test_input[i], test_output[i]); } /* Start of tests. */ GST_START_TEST (test_no_buffer) { GstElement *element = setup_rglimiter (); set_playing_state (element); cleanup_rglimiter (element); } GST_END_TEST; GST_START_TEST (test_disabled) { GstElement *element = setup_rglimiter (); GstBuffer *buf, *out_buf; g_object_set (element, "enabled", FALSE, NULL); set_playing_state (element); buf = create_test_buffer (); fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); fail_unless (g_list_length (buffers) == 1); out_buf = buffers->data; fail_if (out_buf == NULL); buffers = g_list_remove (buffers, out_buf); ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); fail_unless (buf == out_buf); gst_buffer_unref (out_buf); cleanup_rglimiter (element); } GST_END_TEST; GST_START_TEST (test_limiting) { GstElement *element = setup_rglimiter (); GstBuffer *buf, *out_buf; set_playing_state (element); /* Mutable variant. */ buf = create_test_buffer (); GST_DEBUG ("push mutable buffer"); fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); fail_unless (g_list_length (buffers) == 1); out_buf = buffers->data; fail_if (out_buf == NULL); ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); verify_test_buffer (out_buf); /* Immutable variant. */ buf = create_test_buffer (); /* Extra ref: */ gst_buffer_ref (buf); ASSERT_BUFFER_REFCOUNT (buf, "buf", 2); GST_DEBUG ("push immutable buffer"); fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); fail_unless (g_list_length (buffers) == 2); out_buf = g_list_last (buffers)->data; fail_if (out_buf == NULL); ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); fail_unless (buf != out_buf); /* Drop our extra ref: */ gst_buffer_unref (buf); verify_test_buffer (out_buf); cleanup_rglimiter (element); } GST_END_TEST; GST_START_TEST (test_gap) { GstElement *element = setup_rglimiter (); GstBuffer *buf, *out_buf; set_playing_state (element); buf = create_test_buffer (); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_GAP); fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); fail_unless (g_list_length (buffers) == 1); out_buf = buffers->data; fail_if (out_buf == NULL); ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1); /* Verify that the baseclass does not lift the GAP flag: */ fail_unless (GST_BUFFER_FLAG_IS_SET (out_buf, GST_BUFFER_FLAG_GAP)); g_assert (GST_BUFFER_SIZE (out_buf) == GST_BUFFER_SIZE (buf)); /* We cheated by passing an input buffer with non-silence that has the GAP * flag set. The element cannot know that however and must have skipped * adjusting the buffer because of the flag, which we can easily verify: */ fail_if (memcmp (GST_BUFFER_DATA (out_buf), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (out_buf)) != 0); cleanup_rglimiter (element); } GST_END_TEST; static Suite * rglimiter_suite (void) { Suite *s = suite_create ("rglimiter"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_no_buffer); tcase_add_test (tc_chain, test_disabled); tcase_add_test (tc_chain, test_limiting); tcase_add_test (tc_chain, test_gap); return s; } int main (int argc, char **argv) { gint nf; Suite *s = rglimiter_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_ENV); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/rtp-payloading.c0000644000175000017500000005605011671175354021150 00000000000000/* GStreamer RTP payloader unit tests * Copyright (C) 2008 Nokia Corporation and its subsidary(-ies) * contact: * * 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 #include #include #define RELEASE_ELEMENT(x) if(x) {gst_object_unref(x); x = NULL;} #define LOOP_COUNT 1 /* * RTP pipeline structure to store the required elements. */ typedef struct { GstElement *pipeline; GstElement *fdsrc; GstElement *capsfilter; GstElement *rtppay; GstElement *rtpdepay; GstElement *fakesink; int fd[2]; const char *frame_data; int frame_data_size; int frame_count; } rtp_pipeline; /* * Number of bytes received in the chain list function when using buffer lists */ static guint chain_list_bytes_received; /* * Chain list function for testing buffer lists */ static GstFlowReturn rtp_pipeline_chain_list (GstPad * pad, GstBufferList * list) { GstBufferListIterator *it; fail_if (!list); it = gst_buffer_list_iterate (list); /* * Count the size of the payload in the buffer list. */ /* Loop through all groups */ while (gst_buffer_list_iterator_next_group (it)) { GstBuffer *paybuf; /* Skip the first buffer in the group, its the RTP header */ fail_if (!gst_buffer_list_iterator_next (it)); /* Loop through all payload buffers in the current group */ while ((paybuf = gst_buffer_list_iterator_next (it))) { chain_list_bytes_received += GST_BUFFER_SIZE (paybuf); } } gst_buffer_list_iterator_free (it); gst_buffer_list_unref (list); return GST_FLOW_OK; } /* * RTP bus callback. */ static gboolean rtp_bus_callback (GstBus * bus, GstMessage * message, gpointer data) { GMainLoop *mainloop = (GMainLoop *) data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: { GError *err; gchar *debug; gchar *element_name; element_name = (message->src) ? gst_object_get_name (message->src) : NULL; gst_message_parse_error (message, &err, &debug); /* FIXME: should we fail the test here? */ g_print ("\nError from element %s: %s\n%s\n\n", GST_STR_NULL (element_name), err->message, (debug) ? debug : ""); g_error_free (err); g_free (debug); g_free (element_name); g_main_loop_quit (mainloop); } break; case GST_MESSAGE_EOS: { g_main_loop_quit (mainloop); } break; break; default: { } break; } return TRUE; } /* * Creates a RTP pipeline for one test. * @param frame_data Pointer to the frame data which is used to pass thru pay/depayloaders. * @param frame_data_size Frame data size in bytes. * @param frame_count Frame count. * @param filtercaps Caps filters. * @param pay Payloader name. * @param depay Depayloader name. * @return * Returns pointer to the RTP pipeline. * The user must free the RTP pipeline when it's not used anymore. */ static rtp_pipeline * rtp_pipeline_create (const char *frame_data, int frame_data_size, int frame_count, const char *filtercaps, const char *pay, const char *depay) { gchar *pipeline_name; rtp_pipeline *p; GstCaps *caps; /* Check parameters. */ if (!frame_data || !pay || !depay) { return NULL; } /* Allocate memory for the RTP pipeline. */ p = (rtp_pipeline *) malloc (sizeof (rtp_pipeline)); p->frame_data = frame_data; p->frame_data_size = frame_data_size; p->frame_count = frame_count; /* Create elements. */ pipeline_name = g_strdup_printf ("%s-%s-pipeline", pay, depay); p->pipeline = gst_pipeline_new (pipeline_name); g_free (pipeline_name); p->fdsrc = gst_element_factory_make ("fdsrc", NULL); p->capsfilter = gst_element_factory_make ("capsfilter", NULL); p->rtppay = gst_element_factory_make (pay, NULL); p->rtpdepay = gst_element_factory_make (depay, NULL); p->fakesink = gst_element_factory_make ("fakesink", NULL); /* One or more elements are not created successfully or failed to create p? */ if (!p->pipeline || !p->fdsrc || !p->capsfilter || !p->rtppay || !p->rtpdepay || !p->fakesink || pipe (p->fd) == -1) { /* Release created elements. */ RELEASE_ELEMENT (p->pipeline); RELEASE_ELEMENT (p->fdsrc); RELEASE_ELEMENT (p->capsfilter); RELEASE_ELEMENT (p->rtppay); RELEASE_ELEMENT (p->rtpdepay); RELEASE_ELEMENT (p->fakesink); /* Close pipe. */ if (p->fd[0]) { close (p->fd[0]); } if (p->fd[1]) { close (p->fd[1]); } /* Release allocated memory. */ free (p); return NULL; } /* Set fdsrc properties. */ g_object_set (p->fdsrc, "fd", p->fd[0], NULL); g_object_set (p->fdsrc, "do-timestamp", TRUE, NULL); g_object_set (p->fdsrc, "blocksize", p->frame_data_size, NULL); g_object_set (p->fdsrc, "num-buffers", p->frame_count * LOOP_COUNT, NULL); /* Set caps filters. */ caps = gst_caps_from_string (filtercaps); g_object_set (p->capsfilter, "caps", caps, NULL); gst_caps_unref (caps); /* Add elements to the pipeline. */ gst_bin_add (GST_BIN (p->pipeline), p->fdsrc); gst_bin_add (GST_BIN (p->pipeline), p->capsfilter); gst_bin_add (GST_BIN (p->pipeline), p->rtppay); gst_bin_add (GST_BIN (p->pipeline), p->rtpdepay); gst_bin_add (GST_BIN (p->pipeline), p->fakesink); /* Link elements. */ gst_element_link (p->fdsrc, p->capsfilter); gst_element_link (p->capsfilter, p->rtppay); gst_element_link (p->rtppay, p->rtpdepay); gst_element_link (p->rtpdepay, p->fakesink); return p; } /* * Destroys the RTP pipeline. * @param p Pointer to the RTP pipeline. */ static void rtp_pipeline_destroy (rtp_pipeline * p) { /* Check parameters. */ if (p == NULL) { return; } /* Release pipeline. */ RELEASE_ELEMENT (p->pipeline); /* Close pipe. */ if (p->fd[0]) { close (p->fd[0]); } if (p->fd[1]) { close (p->fd[1]); } /* Release allocated memory. */ free (p); } /* * Runs the RTP pipeline. * @param p Pointer to the RTP pipeline. */ static void rtp_pipeline_run (rtp_pipeline * p) { GMainLoop *mainloop = NULL; GstBus *bus; gint i; /* Check parameters. */ if (p == NULL) { return; } /* Create mainloop. */ mainloop = g_main_loop_new (NULL, FALSE); if (!mainloop) { return; } /* Add bus callback. */ bus = gst_pipeline_get_bus (GST_PIPELINE (p->pipeline)); gst_bus_add_watch (bus, rtp_bus_callback, (gpointer) mainloop); gst_object_unref (bus); /* Set pipeline to PLAYING. */ gst_element_set_state (p->pipeline, GST_STATE_PLAYING); /* TODO: Writing may need some changes... */ for (i = 0; i < LOOP_COUNT; i++) { const char *frame_data_pointer = p->frame_data; int res; int frame_count = p->frame_count; /* Write in to the pipe. */ while (frame_count > 0) { res = write (p->fd[1], frame_data_pointer, p->frame_data_size); fail_unless_equals_int (res, p->frame_data_size); frame_data_pointer += p->frame_data_size; frame_count--; } } /* Run mainloop. */ g_main_loop_run (mainloop); /* Set pipeline to NULL. */ gst_element_set_state (p->pipeline, GST_STATE_NULL); /* Release mainloop. */ g_main_loop_unref (mainloop); } /* * Enables buffer lists. Sets the buffer-list property of the payloader * and adds a chain_list_function to the depayloader. * @param p Pointer to the RTP pipeline. */ static void rtp_pipeline_enable_lists (rtp_pipeline * p, guint mtu_size) { GstPad *pad; /* use buffer lists */ g_object_set (p->rtppay, "buffer-list", TRUE, NULL); /* set mtu size if needed */ if (mtu_size) { g_object_set (p->rtppay, "mtu", mtu_size, NULL); } /* Add chain list function for the buffer list tests */ pad = gst_element_get_static_pad (p->rtpdepay, "sink"); gst_pad_set_chain_list_function (pad, GST_DEBUG_FUNCPTR (rtp_pipeline_chain_list)); gst_object_unref (pad); } /* * Creates the RTP pipeline and runs the test using the pipeline. * @param frame_data Pointer to the frame data which is used to pass thru pay/depayloaders. * @param frame_data_size Frame data size in bytes. * @param frame_count Frame count. * @param filtercaps Caps filters. * @param pay Payloader name. * @param depay Depayloader name. * @bytes_sent bytes that will be sent, used when testing buffer lists * @mtu_size set mtu size when testing lists * @use_lists enable buffer lists */ static void rtp_pipeline_test (const char *frame_data, int frame_data_size, int frame_count, const char *filtercaps, const char *pay, const char *depay, guint bytes_sent, guint mtu_size, gboolean use_lists) { /* Create RTP pipeline. */ rtp_pipeline *p = rtp_pipeline_create (frame_data, frame_data_size, frame_count, filtercaps, pay, depay); if (p == NULL) { return; } if (use_lists) { rtp_pipeline_enable_lists (p, mtu_size); chain_list_bytes_received = 0; } /* Run RTP pipeline. */ rtp_pipeline_run (p); /* Destroy RTP pipeline. */ rtp_pipeline_destroy (p); if (use_lists) { /* 'next NAL' indicator is 4 bytes */ fail_if (chain_list_bytes_received != bytes_sent * LOOP_COUNT); } } static char rtp_ilbc_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_ilbc_frame_data_size = 20; static int rtp_ilbc_frame_count = 1; GST_START_TEST (rtp_ilbc) { rtp_pipeline_test (rtp_ilbc_frame_data, rtp_ilbc_frame_data_size, rtp_ilbc_frame_count, "audio/x-iLBC,mode=20", "rtpilbcpay", "rtpilbcdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_gsm_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_gsm_frame_data_size = 20; static int rtp_gsm_frame_count = 1; GST_START_TEST (rtp_gsm) { rtp_pipeline_test (rtp_gsm_frame_data, rtp_gsm_frame_data_size, rtp_gsm_frame_count, "audio/x-gsm,rate=8000,channels=1", "rtpgsmpay", "rtpgsmdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_amr_frame_data[] = { 0x3c, 0x24, 0x03, 0xb3, 0x48, 0x10, 0x68, 0x46, 0x6c, 0xec, 0x03, 0x7a, 0x37, 0x16, 0x41, 0x41, 0xc0, 0x00, 0x0d, 0xcd, 0x12, 0xed, 0xad, 0x80, 0x00, 0x00, 0x11, 0x31, 0x00, 0x00, 0x0d, 0xa0 }; static int rtp_amr_frame_data_size = 32; static int rtp_amr_frame_count = 1; GST_START_TEST (rtp_amr) { rtp_pipeline_test (rtp_amr_frame_data, rtp_amr_frame_data_size, rtp_amr_frame_count, "audio/AMR,channels=1,rate=8000", "rtpamrpay", "rtpamrdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_pcma_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_pcma_frame_data_size = 20; static int rtp_pcma_frame_count = 1; GST_START_TEST (rtp_pcma) { rtp_pipeline_test (rtp_pcma_frame_data, rtp_pcma_frame_data_size, rtp_pcma_frame_count, "audio/x-alaw,channels=1,rate=8000", "rtppcmapay", "rtppcmadepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_pcmu_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_pcmu_frame_data_size = 20; static int rtp_pcmu_frame_count = 1; GST_START_TEST (rtp_pcmu) { rtp_pipeline_test (rtp_pcmu_frame_data, rtp_pcmu_frame_data_size, rtp_pcmu_frame_count, "audio/x-mulaw,channels=1,rate=8000", "rtppcmupay", "rtppcmudepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_mpa_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_mpa_frame_data_size = 20; static int rtp_mpa_frame_count = 1; GST_START_TEST (rtp_mpa) { rtp_pipeline_test (rtp_mpa_frame_data, rtp_mpa_frame_data_size, rtp_mpa_frame_count, "audio/mpeg", "rtpmpapay", "rtpmpadepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_h263_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_h263_frame_data_size = 20; static int rtp_h263_frame_count = 1; GST_START_TEST (rtp_h263) { rtp_pipeline_test (rtp_h263_frame_data, rtp_h263_frame_data_size, rtp_h263_frame_count, "video/x-h263,variant=itu,h263version=h263", "rtph263pay", "rtph263depay", 0, 0, FALSE); } GST_END_TEST; static char rtp_h263p_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_h263p_frame_data_size = 20; static int rtp_h263p_frame_count = 1; GST_START_TEST (rtp_h263p) { rtp_pipeline_test (rtp_h263p_frame_data, rtp_h263p_frame_data_size, rtp_h263p_frame_count, "video/x-h263,variant=itu", "rtph263ppay", "rtph263pdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_h264_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_h264_frame_data_size = 20; static int rtp_h264_frame_count = 1; GST_START_TEST (rtp_h264) { rtp_pipeline_test (rtp_h264_frame_data, rtp_h264_frame_data_size, rtp_h264_frame_count, "video/x-h264", "rtph264pay", "rtph264depay", 0, 0, FALSE); } GST_END_TEST; static char rtp_h264_list_lt_mtu_frame_data[] = /* not packetized, next NAL starts with 0001 */ { 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xad, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00 }; static int rtp_h264_list_lt_mtu_frame_data_size = 16; static int rtp_h264_list_lt_mtu_frame_count = 2; /* NAL = 4 bytes */ static int rtp_h264_list_lt_mtu_bytes_sent = 2 * (16 - 4); static int rtp_h264_list_lt_mtu_mtu_size = 1024; GST_START_TEST (rtp_h264_list_lt_mtu) { rtp_pipeline_test (rtp_h264_list_lt_mtu_frame_data, rtp_h264_list_lt_mtu_frame_data_size, rtp_h264_list_lt_mtu_frame_count, "video/x-h264", "rtph264pay", "rtph264depay", rtp_h264_list_lt_mtu_bytes_sent, rtp_h264_list_lt_mtu_mtu_size, TRUE); } GST_END_TEST; static char rtp_h264_list_gt_mtu_frame_data[] = /* not packetized, next NAL starts with 0001 */ { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_h264_list_gt_mtu_frame_data_size = 64; static int rtp_h264_list_gt_mtu_frame_count = 1; /* NAL = 4 bytes. When data does not fit into 1 mtu, 1 byte will be skipped */ static int rtp_h264_list_gt_mtu_bytes_sent = 1 * (64 - 4) - 1; static int rtp_h264_list_gt_mtu_mty_size = 28; GST_START_TEST (rtp_h264_list_gt_mtu) { rtp_pipeline_test (rtp_h264_list_gt_mtu_frame_data, rtp_h264_list_gt_mtu_frame_data_size, rtp_h264_list_gt_mtu_frame_count, "video/x-h264", "rtph264pay", "rtph264depay", rtp_h264_list_gt_mtu_bytes_sent, rtp_h264_list_gt_mtu_mty_size, TRUE); } GST_END_TEST; static char rtp_L16_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_L16_frame_data_size = 20; static int rtp_L16_frame_count = 1; GST_START_TEST (rtp_L16) { rtp_pipeline_test (rtp_L16_frame_data, rtp_L16_frame_data_size, rtp_L16_frame_count, "audio/x-raw-int,endianess=4321,signed=true,width=16,depth=16,rate=1,channels=1", "rtpL16pay", "rtpL16depay", 0, 0, FALSE); } GST_END_TEST; static char rtp_mp2t_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_mp2t_frame_data_size = 20; static int rtp_mp2t_frame_count = 1; GST_START_TEST (rtp_mp2t) { rtp_pipeline_test (rtp_mp2t_frame_data, rtp_mp2t_frame_data_size, rtp_mp2t_frame_count, "video/mpegts,packetsize=188,systemstream=true", "rtpmp2tpay", "rtpmp2tdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_mp4v_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_mp4v_frame_data_size = 20; static int rtp_mp4v_frame_count = 1; GST_START_TEST (rtp_mp4v) { rtp_pipeline_test (rtp_mp4v_frame_data, rtp_mp4v_frame_data_size, rtp_mp4v_frame_count, "video/mpeg,mpegversion=4,systemstream=false", "rtpmp4vpay", "rtpmp4vdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_mp4v_list_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_mp4v_list_frame_data_size = 20; static int rtp_mp4v_list_frame_count = 1; static int rtp_mp4v_list_bytes_sent = 1 * 20; GST_START_TEST (rtp_mp4v_list) { rtp_pipeline_test (rtp_mp4v_list_frame_data, rtp_mp4v_list_frame_data_size, rtp_mp4v_list_frame_count, "video/mpeg,mpegversion=4,codec_data=(buffer)000001b001", "rtpmp4vpay", "rtpmp4vdepay", rtp_mp4v_list_bytes_sent, 0, TRUE); } GST_END_TEST; static char rtp_mp4g_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_mp4g_frame_data_size = 20; static int rtp_mp4g_frame_count = 1; GST_START_TEST (rtp_mp4g) { rtp_pipeline_test (rtp_mp4g_frame_data, rtp_mp4g_frame_data_size, rtp_mp4g_frame_count, "video/mpeg,mpegversion=4,codec_data=(buffer)000001b001", "rtpmp4gpay", "rtpmp4gdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_theora_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_theora_frame_data_size = 20; static int rtp_theora_frame_count = 1; GST_START_TEST (rtp_theora) { rtp_pipeline_test (rtp_theora_frame_data, rtp_theora_frame_data_size, rtp_theora_frame_count, "video/x-theora", "rtptheorapay", "rtptheoradepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_vorbis_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_vorbis_frame_data_size = 20; static int rtp_vorbis_frame_count = 1; GST_START_TEST (rtp_vorbis) { rtp_pipeline_test (rtp_vorbis_frame_data, rtp_vorbis_frame_data_size, rtp_vorbis_frame_count, "audio/x-vorbis", "rtpvorbispay", "rtpvorbisdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_jpeg_frame_data[] = { /* SOF */ 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08, 0x03, 0x00, 0x21, 0x08, 0x01, 0x11, 0x08, 0x02, 0x11, 0x08, /* DQT */ 0xFF, 0xDB, 0x00, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* DATA */ 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_jpeg_frame_data_size = sizeof (rtp_jpeg_frame_data); static int rtp_jpeg_frame_count = 1; GST_START_TEST (rtp_jpeg) { rtp_pipeline_test (rtp_jpeg_frame_data, rtp_jpeg_frame_data_size, rtp_jpeg_frame_count, "video/x-jpeg,height=640,width=480", "rtpjpegpay", "rtpjpegdepay", 0, 0, FALSE); } GST_END_TEST; static char rtp_jpeg_list_frame_data[] = { /* SOF */ 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08, 0x03, 0x00, 0x21, 0x08, 0x01, 0x11, 0x08, 0x02, 0x11, 0x08, /* DQT */ 0xFF, 0xDB, 0x00, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* DATA */ 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_jpeg_list_frame_data_size = sizeof (rtp_jpeg_list_frame_data); static int rtp_jpeg_list_frame_count = 1; static int rtp_jpeg_list_bytes_sent = 1 * sizeof (rtp_jpeg_list_frame_data); GST_START_TEST (rtp_jpeg_list) { rtp_pipeline_test (rtp_jpeg_list_frame_data, rtp_jpeg_list_frame_data_size, rtp_jpeg_list_frame_count, "video/x-jpeg,height=640,width=480", "rtpjpegpay", "rtpjpegdepay", rtp_jpeg_list_bytes_sent, 0, TRUE); } GST_END_TEST; static char rtp_g729_frame_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int rtp_g729_frame_data_size = 22; static int rtp_g729_frame_count = 1; GST_START_TEST (rtp_g729) { rtp_pipeline_test (rtp_g729_frame_data, rtp_g729_frame_data_size, rtp_g729_frame_count, "audio/G729", "rtpg729pay", "rtpg729depay", 0, 0, FALSE); } GST_END_TEST; /* * Creates the test suite. * * Returns: pointer to the test suite. */ static Suite * rtp_payloading_suite (void) { Suite *s = suite_create ("rtp_data_test"); TCase *tc_chain = tcase_create ("linear"); /* Set timeout to 60 seconds. */ tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, rtp_ilbc); tcase_add_test (tc_chain, rtp_gsm); tcase_add_test (tc_chain, rtp_amr); tcase_add_test (tc_chain, rtp_pcma); tcase_add_test (tc_chain, rtp_pcmu); tcase_add_test (tc_chain, rtp_mpa); tcase_add_test (tc_chain, rtp_h263); tcase_add_test (tc_chain, rtp_h263p); tcase_add_test (tc_chain, rtp_h264); tcase_add_test (tc_chain, rtp_h264_list_lt_mtu); tcase_add_test (tc_chain, rtp_h264_list_gt_mtu); tcase_add_test (tc_chain, rtp_L16); tcase_add_test (tc_chain, rtp_mp2t); tcase_add_test (tc_chain, rtp_mp4v); tcase_add_test (tc_chain, rtp_mp4v_list); tcase_add_test (tc_chain, rtp_mp4g); tcase_add_test (tc_chain, rtp_theora); tcase_add_test (tc_chain, rtp_vorbis); tcase_add_test (tc_chain, rtp_jpeg); tcase_add_test (tc_chain, rtp_jpeg_list); tcase_add_test (tc_chain, rtp_g729); return s; } GST_CHECK_MAIN (rtp_payloading) gst-plugins-good-0.10.31/tests/check/elements/id3v2mux.c0000644000175000017500000003575211671175354017705 00000000000000/* GStreamer * * unit test for the taglib-based id3v2mux element * * Copyright (C) 2006 Tim-Philipp Müller * * 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 #include #include #define TEST_ARTIST "Ar T\303\255st" #define TEST_TITLE "M\303\274llermilch!" #define TEST_ALBUM "Boom" #define TEST_DATE g_date_new_dmy(1,1,2006) #define TEST_TRACK_NUMBER 7 #define TEST_TRACK_COUNT 19 #define TEST_VOLUME_NUMBER 2 #define TEST_VOLUME_COUNT 3 #define TEST_TRACK_GAIN 1.45 #define TEST_ALBUM_GAIN 0.78 #define TEST_TRACK_PEAK 0.83 #define TEST_ALBUM_PEAK 0.18 #define TEST_BPM 113.0 /* for dummy mp3 frame sized MP3_FRAME_SIZE bytes, * start: ff fb b0 44 00 00 08 00 00 4b 00 00 00 00 00 00 */ static const guint8 mp3_dummyhdr[] = { 0xff, 0xfb, 0xb0, 0x44, 0x00, 0x00, 0x08, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 }; #define MP3_FRAME_SIZE 626 /* the peak and gain values are stored pretty roughly, so check that they're * within 2% of the expected value. */ #define fail_unless_sorta_equals_float(a, b) \ G_STMT_START { \ double first = a; \ double second = b; \ fail_unless(fabs (first - second) < (0.02 * fabs (first)), \ "'" #a "' (%g) is not equal to '" #b "' (%g)", first, second); \ } G_STMT_END; static GstTagList * test_taglib_id3mux_create_tags (guint32 mask) { GstTagList *tags; tags = gst_tag_list_new (); if (mask & (1 << 0)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ARTIST, TEST_ARTIST, NULL); } if (mask & (1 << 1)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TITLE, TEST_TITLE, NULL); } if (mask & (1 << 2)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM, TEST_ALBUM, NULL); } if (mask & (1 << 3)) { GDate *date; date = TEST_DATE; gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_DATE, date, NULL); g_date_free (date); } if (mask & (1 << 4)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_NUMBER, TEST_TRACK_NUMBER, NULL); } if (mask & (1 << 5)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_COUNT, TEST_TRACK_COUNT, NULL); } if (mask & (1 << 6)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM_VOLUME_NUMBER, TEST_VOLUME_NUMBER, NULL); } if (mask & (1 << 7)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM_VOLUME_COUNT, TEST_VOLUME_COUNT, NULL); } if (mask & (1 << 8)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_GAIN, TEST_TRACK_GAIN, NULL); } if (mask & (1 << 9)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM_GAIN, TEST_ALBUM_GAIN, NULL); } if (mask & (1 << 10)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_TRACK_PEAK, TEST_TRACK_PEAK, NULL); } if (mask & (1 << 11)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_ALBUM_PEAK, TEST_ALBUM_PEAK, NULL); } if (mask & (1 << 12)) { gst_tag_list_add (tags, GST_TAG_MERGE_KEEP, GST_TAG_BEATS_PER_MINUTE, TEST_BPM, NULL); } if (mask & (1 << 13)) { } return tags; } static gboolean utf8_string_in_buf (GstBuffer * buf, const gchar * s) { gint i, len; len = strlen (s); for (i = 0; i < (GST_BUFFER_SIZE (buf) - len); ++i) { if (memcmp (GST_BUFFER_DATA (buf) + i, s, len) == 0) { return TRUE; } } return FALSE; } static void test_taglib_id3mux_check_tag_buffer (GstBuffer * buf, guint32 mask) { /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */ if (mask & (1 << 0)) { fail_unless (utf8_string_in_buf (buf, TEST_ARTIST)); } /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */ if (mask & (1 << 1)) { fail_unless (utf8_string_in_buf (buf, TEST_TITLE)); } /* make sure our UTF-8 string hasn't been put into the tag as ISO-8859-1 */ if (mask & (1 << 2)) { fail_unless (utf8_string_in_buf (buf, TEST_ALBUM)); } } static void test_taglib_id3mux_check_tags (GstTagList * tags, guint32 mask) { if (mask & (1 << 0)) { gchar *s = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s)); fail_unless (g_str_equal (s, TEST_ARTIST)); g_free (s); } if (mask & (1 << 1)) { gchar *s = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s)); fail_unless (g_str_equal (s, TEST_TITLE)); g_free (s); } if (mask & (1 << 2)) { gchar *s = NULL; fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s)); fail_unless (g_str_equal (s, TEST_ALBUM)); g_free (s); } if (mask & (1 << 3)) { GDate *shouldbe, *date = NULL; shouldbe = TEST_DATE; fail_unless (gst_tag_list_get_date (tags, GST_TAG_DATE, &date)); fail_unless (g_date_compare (shouldbe, date) == 0); g_date_free (shouldbe); g_date_free (date); } if (mask & (1 << 4)) { guint num; fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_NUMBER, &num)); fail_unless (num == TEST_TRACK_NUMBER); } if (mask & (1 << 5)) { guint count; fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_COUNT, &count)); fail_unless (count == TEST_TRACK_COUNT); } if (mask & (1 << 6)) { guint num; fail_unless (gst_tag_list_get_uint (tags, GST_TAG_ALBUM_VOLUME_NUMBER, &num)); fail_unless (num == TEST_VOLUME_NUMBER); } if (mask & (1 << 7)) { guint count; fail_unless (gst_tag_list_get_uint (tags, GST_TAG_ALBUM_VOLUME_COUNT, &count)); fail_unless (count == TEST_VOLUME_COUNT); } if (mask & (1 << 8)) { gdouble gain; fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &gain)); fail_unless_sorta_equals_float (gain, TEST_TRACK_GAIN); } if (mask & (1 << 9)) { gdouble gain; fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_GAIN, &gain)); fail_unless_sorta_equals_float (gain, TEST_ALBUM_GAIN); } if (mask & (1 << 10)) { gdouble peak; fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_PEAK, &peak)); fail_unless_sorta_equals_float (peak, TEST_TRACK_PEAK); } if (mask & (1 << 11)) { gdouble peak; fail_unless (gst_tag_list_get_double (tags, GST_TAG_ALBUM_PEAK, &peak)); fail_unless_sorta_equals_float (peak, TEST_ALBUM_PEAK); } if (mask & (1 << 12)) { gdouble bpm; fail_unless (gst_tag_list_get_double (tags, GST_TAG_BEATS_PER_MINUTE, &bpm)); fail_unless_sorta_equals_float (bpm, TEST_BPM); } if (mask & (1 << 13)) { } } static void fill_mp3_buffer (GstElement * fakesrc, GstBuffer * buf, GstPad * pad, guint64 * p_offset) { fail_unless (GST_BUFFER_SIZE (buf) == MP3_FRAME_SIZE); GST_LOG ("filling buffer with fake mp3 data, offset = %" G_GUINT64_FORMAT, *p_offset); memcpy (GST_BUFFER_DATA (buf), mp3_dummyhdr, sizeof (mp3_dummyhdr)); /* can't use gst_buffer_set_caps() here because the metadata isn't writable * because of the extra refcounts taken by the signal emission mechanism; * we know it's fine to use GST_BUFFER_CAPS() here though */ GST_BUFFER_CAPS (buf) = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL); GST_BUFFER_OFFSET (buf) = *p_offset; *p_offset += GST_BUFFER_SIZE (buf); } static void got_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, GstBuffer ** p_buf) { gint64 off; guint size; off = GST_BUFFER_OFFSET (buf); size = GST_BUFFER_SIZE (buf); GST_LOG ("got buffer, size=%u, offset=%" G_GINT64_FORMAT, size, off); fail_unless (GST_BUFFER_OFFSET_IS_VALID (buf)); if (*p_buf == NULL || (off + size) > GST_BUFFER_SIZE (*p_buf)) { GstBuffer *newbuf; /* not very elegant, but who cares */ newbuf = gst_buffer_new_and_alloc (off + size); if (*p_buf) { memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (*p_buf), GST_BUFFER_SIZE (*p_buf)); } memcpy (GST_BUFFER_DATA (newbuf) + off, GST_BUFFER_DATA (buf), size); if (*p_buf) gst_buffer_unref (*p_buf); *p_buf = newbuf; } else { memcpy (GST_BUFFER_DATA (*p_buf) + off, GST_BUFFER_DATA (buf), size); } } static void demux_pad_added (GstElement * id3demux, GstPad * srcpad, GstBuffer ** p_outbuf) { GstElement *fakesink, *pipeline; GST_LOG ("id3demux added source pad with caps %" GST_PTR_FORMAT, GST_PAD_CAPS (srcpad)); pipeline = id3demux; while (GST_OBJECT_PARENT (pipeline) != NULL) pipeline = (GstElement *) GST_OBJECT_PARENT (pipeline); fakesink = gst_element_factory_make ("fakesink", "fakesink"); g_assert (fakesink != NULL); /* set up sink */ g_object_set (fakesink, "signal-handoffs", TRUE, NULL); g_signal_connect (fakesink, "handoff", G_CALLBACK (got_buffer), p_outbuf); gst_bin_add (GST_BIN (pipeline), fakesink); gst_element_set_state (fakesink, GST_STATE_PLAYING); fail_unless (gst_element_link (id3demux, fakesink)); } static void test_taglib_id3mux_check_output_buffer (GstBuffer * buf) { guint8 *data = GST_BUFFER_DATA (buf); guint size = GST_BUFFER_SIZE (buf); guint off; g_assert (size % MP3_FRAME_SIZE == 0); for (off = 0; off < size; off += MP3_FRAME_SIZE) { fail_unless (memcmp (data + off, mp3_dummyhdr, sizeof (mp3_dummyhdr)) == 0); } } static void identity_cb (GstElement * identity, GstBuffer * buf, GstBuffer ** p_tagbuf) { if (*p_tagbuf == NULL) { *p_tagbuf = gst_buffer_ref (buf); } } static void test_taglib_id3mux_with_tags (GstTagList * tags, guint32 mask) { GstMessage *msg; GstTagList *tags_read = NULL; GstElement *pipeline, *id3mux, *id3demux, *fakesrc, *identity; GstBus *bus; guint64 offset; GstBuffer *outbuf = NULL; GstBuffer *tagbuf = NULL; GstStateChangeReturn state_result; pipeline = gst_pipeline_new ("pipeline"); g_assert (pipeline != NULL); fakesrc = gst_element_factory_make ("fakesrc", "fakesrc"); g_assert (fakesrc != NULL); id3mux = gst_element_factory_make ("id3v2mux", "id3v2mux"); g_assert (id3mux != NULL); identity = gst_element_factory_make ("identity", "identity"); g_assert (identity != NULL); id3demux = gst_element_factory_make ("id3demux", "id3demux"); g_assert (id3demux != NULL); outbuf = NULL; g_signal_connect (id3demux, "pad-added", G_CALLBACK (demux_pad_added), &outbuf); gst_bin_add (GST_BIN (pipeline), fakesrc); gst_bin_add (GST_BIN (pipeline), id3mux); gst_bin_add (GST_BIN (pipeline), identity); gst_bin_add (GST_BIN (pipeline), id3demux); gst_tag_setter_merge_tags (GST_TAG_SETTER (id3mux), tags, GST_TAG_MERGE_APPEND); gst_element_link_many (fakesrc, id3mux, identity, id3demux, NULL); /* set up source */ g_object_set (fakesrc, "signal-handoffs", TRUE, "can-activate-pull", FALSE, "filltype", 2, "sizetype", 2, "sizemax", MP3_FRAME_SIZE, "num-buffers", 16, NULL); offset = 0; g_signal_connect (fakesrc, "handoff", G_CALLBACK (fill_mp3_buffer), &offset); /* set up identity to catch tag buffer */ g_signal_connect (identity, "handoff", G_CALLBACK (identity_cb), &tagbuf); GST_LOG ("setting and getting state ..."); gst_element_set_state (pipeline, GST_STATE_PLAYING); state_result = gst_element_get_state (pipeline, NULL, NULL, -1); fail_unless (state_result == GST_STATE_CHANGE_SUCCESS, "Unexpected result from get_state(). Expected success, got %d", state_result); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); GST_LOG ("Waiting for tag ..."); msg = gst_bus_poll (bus, GST_MESSAGE_TAG | GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err; gchar *dbg; gst_message_parse_error (msg, &err, &dbg); g_printerr ("ERROR from element %s: %s\n%s\n", GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); g_error_free (err); g_free (dbg); } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { g_printerr ("EOS message, but were waiting for TAGS!\n"); } fail_unless (msg->type == GST_MESSAGE_TAG); gst_message_parse_tag (msg, &tags_read); gst_message_unref (msg); GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags_read); test_taglib_id3mux_check_tags (tags_read, mask); gst_tag_list_free (tags_read); fail_unless (tagbuf != NULL); test_taglib_id3mux_check_tag_buffer (tagbuf, mask); gst_buffer_unref (tagbuf); GST_LOG ("Waiting for EOS ..."); msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err; gchar *dbg; gst_message_parse_error (msg, &err, &dbg); g_printerr ("ERROR from element %s: %s\n%s\n", GST_OBJECT_NAME (msg->src), err->message, GST_STR_NULL (dbg)); g_error_free (err); g_free (dbg); } fail_unless (msg->type == GST_MESSAGE_EOS); gst_message_unref (msg); gst_object_unref (bus); GST_LOG ("Got EOS, shutting down ..."); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); test_taglib_id3mux_check_output_buffer (outbuf); gst_buffer_unref (outbuf); GST_LOG ("Done"); } GST_START_TEST (test_id3v2mux) { GstTagList *tags; gint i; g_random_set_seed (247166295); /* internal consistency check */ tags = test_taglib_id3mux_create_tags (0xFFFFFFFF); test_taglib_id3mux_check_tags (tags, 0xFFFFFFFF); gst_tag_list_free (tags); /* now the real tests */ for (i = 0; i < 50; ++i) { guint32 mask; mask = g_random_int (); GST_LOG ("tag mask = %08x (i=%d)", mask, i); if (mask == 0) continue; /* create tags */ tags = test_taglib_id3mux_create_tags (mask); GST_LOG ("tags for mask %08x = %" GST_PTR_FORMAT, mask, tags); /* double-check for internal consistency */ test_taglib_id3mux_check_tags (tags, mask); /* test with pipeline */ test_taglib_id3mux_with_tags (tags, mask); /* free tags */ gst_tag_list_free (tags); } } GST_END_TEST; static Suite * id3v2mux_suite (void) { Suite *s = suite_create ("id3v2mux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_id3v2mux); return s; } int main (int argc, char **argv) { int nf; Suite *s = id3v2mux_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/flvdemux.c0000644000175000017500000001226111671175354020044 00000000000000/* GStreamer unit tests for flvdemux * * Copyright (C) 2009 Tim-Philipp Müller * * 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 #include static void pad_added_cb (GstElement * flvdemux, GstPad * pad, GstBin * pipeline) { GstElement *sink; sink = gst_bin_get_by_name (pipeline, "fakesink"); fail_unless (gst_element_link (flvdemux, sink)); gst_object_unref (sink); gst_element_set_state (sink, GST_STATE_PAUSED); } static GstBusSyncReply error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) { if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { const gchar *file = (const gchar *) user_data; GError *err = NULL; gchar *dbg = NULL; gst_message_parse_error (msg, &err, &dbg); g_error ("ERROR for %s: %s\n%s\n", file, err->message, dbg); } return GST_BUS_PASS; } static void handoff_cb (GstElement * element, GstBuffer * buf, GstPad * pad, gint * p_counter) { *p_counter += 1; GST_LOG ("counter = %d", *p_counter); fail_unless (GST_BUFFER_CAPS (buf) != NULL); } static void process_file (const gchar * file, gboolean push_mode, gint repeat, gint num_buffers) { GstElement *src, *sep, *sink, *flvdemux, *pipeline; GstBus *bus; gchar *path; gint counter; pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL, "Failed to create pipeline!"); bus = gst_element_get_bus (pipeline); /* kids, don't use a sync handler for this at home, really; we do because * we just want to abort and nothing else */ gst_bus_set_sync_handler (bus, error_cb, (gpointer) file); src = gst_element_factory_make ("filesrc", "filesrc"); fail_unless (src != NULL, "Failed to create 'filesrc' element!"); if (push_mode) { sep = gst_element_factory_make ("queue", "queue"); fail_unless (sep != NULL, "Failed to create 'queue' element"); } else { sep = gst_element_factory_make ("identity", "identity"); fail_unless (sep != NULL, "Failed to create 'identity' element"); } flvdemux = gst_element_factory_make ("flvdemux", "flvdemux"); fail_unless (flvdemux != NULL, "Failed to create 'flvdemux' element!"); sink = gst_element_factory_make ("fakesink", "fakesink"); fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "handoff", G_CALLBACK (handoff_cb), &counter); gst_bin_add_many (GST_BIN (pipeline), src, sep, flvdemux, sink, NULL); fail_unless (gst_element_link (src, sep)); fail_unless (gst_element_link (sep, flvdemux)); /* can't link flvdemux and sink yet, do that later */ g_signal_connect (flvdemux, "pad-added", G_CALLBACK (pad_added_cb), pipeline); path = g_build_filename (GST_TEST_FILES_PATH, file, NULL); GST_LOG ("processing file '%s'", path); g_object_set (src, "location", path, NULL); do { GstStateChangeReturn state_ret; GstMessage *msg; GST_LOG ("repeat=%d", repeat); counter = 0; state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); if (state_ret == GST_STATE_CHANGE_ASYNC) { GST_LOG ("waiting for pipeline to reach PAUSED state"); state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); } GST_LOG ("PAUSED, let's read all of it"); state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); msg = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); fail_unless (msg != NULL, "Expected EOS message on bus! (%s)", file); gst_message_unref (msg); if (num_buffers >= 0) { fail_unless_equals_int (counter, num_buffers); } fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); --repeat; } while (repeat > 0); gst_object_unref (bus); gst_object_unref (pipeline); g_free (path); } GST_START_TEST (test_reuse_pull) { process_file ("pcm16sine.flv", FALSE, 3, 129); gst_task_cleanup_all (); } GST_END_TEST; GST_START_TEST (test_reuse_push) { process_file ("pcm16sine.flv", TRUE, 3, 129); gst_task_cleanup_all (); } GST_END_TEST; static Suite * flvdemux_suite (void) { Suite *s = suite_create ("flvdemux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_reuse_push); tcase_add_test (tc_chain, test_reuse_pull); return s; } GST_CHECK_MAIN (flvdemux) gst-plugins-good-0.10.31/tests/check/elements/gdkpixbufsink.c0000644000175000017500000002131011671175354021055 00000000000000/* GStreamer unit test for the gdkpixbufsink element * Copyright (C) 2008 Tim-Philipp Müller * * 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 #include #include #define WxH ",width=(int)319,height=(int)241" #define N_BUFFERS 5 typedef struct { GstElement *pipe; GstElement *src; GstElement *filter; GstElement *sink; } GstGdkPixbufSinkTestContext; static void gdkpixbufsink_init_test_context (GstGdkPixbufSinkTestContext * ctx, const gchar * filter_caps_string, gint num_buffers) { GstCaps *caps; fail_unless (ctx != NULL); ctx->pipe = gst_pipeline_new ("pipeline"); fail_unless (ctx->pipe != NULL); ctx->src = gst_element_factory_make ("videotestsrc", "src"); fail_unless (ctx->src != NULL, "Failed to create videotestsrc element"); ctx->filter = gst_element_factory_make ("capsfilter", "filter"); fail_unless (ctx->filter != NULL, "Failed to create capsfilter element"); ctx->sink = gst_element_factory_make ("gdkpixbufsink", "sink"); fail_unless (ctx->sink != NULL, "Failed to create gdkpixbufsink element"); caps = gst_caps_from_string (filter_caps_string); fail_unless (caps != NULL); g_object_set (ctx->filter, "caps", caps, NULL); gst_caps_unref (caps); if (num_buffers > 0) g_object_set (ctx->src, "num-buffers", num_buffers, NULL); fail_unless (gst_bin_add (GST_BIN (ctx->pipe), ctx->src)); fail_unless (gst_bin_add (GST_BIN (ctx->pipe), ctx->filter)); fail_unless (gst_bin_add (GST_BIN (ctx->pipe), ctx->sink)); fail_unless (gst_element_link (ctx->src, ctx->filter)); fail_unless (gst_element_link (ctx->filter, ctx->sink)); } static void gdkpixbufsink_unset_test_context (GstGdkPixbufSinkTestContext * ctx) { gst_element_set_state (ctx->pipe, GST_STATE_NULL); gst_object_unref (ctx->pipe); memset (ctx, 0, sizeof (GstGdkPixbufSinkTestContext)); } static gboolean check_last_pixbuf (GstGdkPixbufSinkTestContext * ctx, gpointer pixbuf) { gpointer last_pb = NULL; gboolean ret; g_object_get (ctx->sink, "last-pixbuf", &last_pb, NULL); ret = (last_pb == pixbuf); if (last_pb) g_object_unref (last_pb); return ret; } /* doesn't return a ref to the pixbuf */ static GdkPixbuf * check_message_pixbuf (GstMessage * msg, const gchar * name, gint channels, gboolean has_alpha) { GdkPixbuf *pixbuf; GstStructure *s; fail_unless (msg->structure != NULL); s = msg->structure; fail_unless_equals_string (gst_structure_get_name (s), name); fail_unless (gst_structure_has_field (s, "pixbuf")); fail_unless (gst_structure_has_field_typed (s, "pixel-aspect-ratio", GST_TYPE_FRACTION)); pixbuf = GDK_PIXBUF (g_value_get_object (gst_structure_get_value (s, "pixbuf"))); fail_unless (GDK_IS_PIXBUF (pixbuf)); fail_unless_equals_int (gdk_pixbuf_get_n_channels (pixbuf), channels); fail_unless_equals_int (gdk_pixbuf_get_has_alpha (pixbuf), has_alpha); fail_unless_equals_int (gdk_pixbuf_get_width (pixbuf), 319); fail_unless_equals_int (gdk_pixbuf_get_height (pixbuf), 241); return pixbuf; } GST_START_TEST (test_rgb) { GstGdkPixbufSinkTestContext ctx; GstMessage *msg; GdkPixbuf *pixbuf; GstBus *bus; gint i; gdkpixbufsink_init_test_context (&ctx, GST_VIDEO_CAPS_RGB WxH, N_BUFFERS); fail_unless (check_last_pixbuf (&ctx, NULL)); /* start prerolling */ fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PAUSED), GST_STATE_CHANGE_ASYNC); /* wait until prerolled */ fail_unless_equals_int (gst_element_get_state (ctx.pipe, NULL, NULL, -1), GST_STATE_CHANGE_SUCCESS); bus = gst_element_get_bus (ctx.pipe); /* find element message from our gdkpixbufsink, ignore element messages from * other elemements (which just seems prudent to do, we don't expect any) */ while (1) { msg = gst_bus_pop_filtered (bus, GST_MESSAGE_ELEMENT); fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); if (msg->src == GST_OBJECT (ctx.sink)) break; } pixbuf = check_message_pixbuf (msg, "preroll-pixbuf", 3, FALSE); fail_unless (check_last_pixbuf (&ctx, pixbuf)); gst_message_unref (msg); pixbuf = NULL; /* and go! */ fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); /* This is racy, supposed to make sure locking and refcounting works at * least to some extent */ for (i = 0; i < 10000; ++i) { gpointer obj = NULL; g_object_get (ctx.sink, "last-pixbuf", &obj, NULL); fail_unless (obj == NULL || GDK_IS_PIXBUF (obj)); if (obj) g_object_unref (obj); } /* there should be as many pixbuf messages as buffers */ for (i = 0; i < N_BUFFERS; ++i) { /* find element message from our gdkpixbufsink, ignore element messages from * other elemements (which just seems prudent to do, we don't expect any) */ while (1) { msg = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_ELEMENT); fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); if (msg->src == GST_OBJECT (ctx.sink)) break; } pixbuf = check_message_pixbuf (msg, "pixbuf", 3, FALSE); gst_message_unref (msg); } /* note: we don't hold a ref to pixbuf any longer here, but it should be ok */ fail_unless (check_last_pixbuf (&ctx, pixbuf)); pixbuf = NULL; gdkpixbufsink_unset_test_context (&ctx); gst_object_unref (bus); } GST_END_TEST; GST_START_TEST (test_rgba) { GstGdkPixbufSinkTestContext ctx; GstMessage *msg; GdkPixbuf *pixbuf; GstBus *bus; gint i; gdkpixbufsink_init_test_context (&ctx, GST_VIDEO_CAPS_RGBA WxH, N_BUFFERS); fail_unless (check_last_pixbuf (&ctx, NULL)); /* start prerolling */ fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PAUSED), GST_STATE_CHANGE_ASYNC); /* wait until prerolled */ fail_unless_equals_int (gst_element_get_state (ctx.pipe, NULL, NULL, -1), GST_STATE_CHANGE_SUCCESS); bus = gst_element_get_bus (ctx.pipe); /* find element message from our gdkpixbufsink, ignore element messages from * other elemements (which just seems prudent to do, we don't expect any) */ while (1) { msg = gst_bus_pop_filtered (bus, GST_MESSAGE_ELEMENT); fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); if (msg->src == GST_OBJECT (ctx.sink)) break; } pixbuf = check_message_pixbuf (msg, "preroll-pixbuf", 4, TRUE); fail_unless (check_last_pixbuf (&ctx, pixbuf)); gst_message_unref (msg); pixbuf = NULL; /* and go! */ fail_unless_equals_int (gst_element_set_state (ctx.pipe, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); /* This is racy, supposed to make sure locking and refcounting works at * least to some extent */ for (i = 0; i < 10000; ++i) { gpointer obj = NULL; g_object_get (ctx.sink, "last-pixbuf", &obj, NULL); fail_unless (obj == NULL || GDK_IS_PIXBUF (obj)); if (obj) g_object_unref (obj); } /* there should be as many pixbuf messages as buffers */ for (i = 0; i < N_BUFFERS; ++i) { /* find element message from our gdkpixbufsink, ignore element messages from * other elemements (which just seems prudent to do, we don't expect any) */ while (1) { msg = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_ELEMENT); fail_if (msg == NULL, "Expected element message from gdkpixbufsink"); if (msg->src == GST_OBJECT (ctx.sink)) break; } pixbuf = check_message_pixbuf (msg, "pixbuf", 4, TRUE); gst_message_unref (msg); } /* note: we don't hold a ref to pixbuf any longer here, but it should be ok */ fail_unless (check_last_pixbuf (&ctx, pixbuf)); pixbuf = NULL; gdkpixbufsink_unset_test_context (&ctx); gst_object_unref (bus); } GST_END_TEST; static Suite * gdkpixbufsink_suite (void) { Suite *s = suite_create ("gdkpixbufsink"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_rgb); tcase_add_test (tc_chain, test_rgba); return s; } GST_CHECK_MAIN (gdkpixbufsink); gst-plugins-good-0.10.31/tests/check/elements/flvmux.c0000644000175000017500000001140211677341661017531 00000000000000/* GStreamer unit tests for flvmux * * Copyright (C) 2009 Tim-Philipp Müller * * 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 #include static GstBusSyncReply error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) { if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err = NULL; gchar *dbg = NULL; gst_message_parse_error (msg, &err, &dbg); g_error ("ERROR: %s\n%s\n", err->message, dbg); } return GST_BUS_PASS; } static void handoff_cb (GstElement * element, GstBuffer * buf, GstPad * pad, gint * p_counter) { *p_counter += 1; GST_LOG ("counter = %d", *p_counter); fail_unless (GST_BUFFER_CAPS (buf) != NULL); } static void mux_pcm_audio (guint num_buffers, guint repeat) { GstElement *src, *sink, *flvmux, *conv, *pipeline; GstPad *sinkpad, *srcpad; gint counter; GST_LOG ("num_buffers = %u", num_buffers); pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL, "Failed to create pipeline!"); /* kids, don't use a sync handler for this at home, really; we do because * we just want to abort and nothing else */ gst_bus_set_sync_handler (GST_ELEMENT_BUS (pipeline), error_cb, NULL); src = gst_element_factory_make ("audiotestsrc", "audiotestsrc"); fail_unless (src != NULL, "Failed to create 'audiotestsrc' element!"); g_object_set (src, "num-buffers", num_buffers, NULL); conv = gst_element_factory_make ("audioconvert", "audioconvert"); fail_unless (conv != NULL, "Failed to create 'audioconvert' element!"); flvmux = gst_element_factory_make ("flvmux", "flvmux"); fail_unless (flvmux != NULL, "Failed to create 'flvmux' element!"); sink = gst_element_factory_make ("fakesink", "fakesink"); fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); g_object_set (sink, "signal-handoffs", TRUE, NULL); g_signal_connect (sink, "handoff", G_CALLBACK (handoff_cb), &counter); gst_bin_add_many (GST_BIN (pipeline), src, conv, flvmux, sink, NULL); fail_unless (gst_element_link (src, conv)); fail_unless (gst_element_link (flvmux, sink)); /* now link the elements */ sinkpad = gst_element_get_request_pad (flvmux, "audio"); fail_unless (sinkpad != NULL, "Could not get audio request pad"); srcpad = gst_element_get_static_pad (conv, "src"); fail_unless (srcpad != NULL, "Could not get audioconvert's source pad"); fail_unless_equals_int (gst_pad_link (srcpad, sinkpad), GST_PAD_LINK_OK); gst_object_unref (srcpad); gst_object_unref (sinkpad); do { GstStateChangeReturn state_ret; GstMessage *msg; GST_LOG ("repeat=%d", repeat); counter = 0; state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); if (state_ret == GST_STATE_CHANGE_ASYNC) { GST_LOG ("waiting for pipeline to reach PAUSED state"); state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); } GST_LOG ("PAUSED, let's do the rest of it"); state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); fail_unless (msg != NULL, "Expected EOS message on bus!"); GST_LOG ("EOS"); gst_message_unref (msg); /* should have some output */ fail_unless (counter > 2); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); /* repeat = test re-usability */ --repeat; } while (repeat > 0); gst_object_unref (pipeline); } GST_START_TEST (test_index_writing) { /* note: there's a magic 128 value in flvmux when doing index writing */ if ((__i__ % 33) == 1) mux_pcm_audio (__i__, 2); } GST_END_TEST; static Suite * flvmux_suite (void) { Suite *s = suite_create ("flvmux"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_loop_test (tc_chain, test_index_writing, 1, 499); return s; } GST_CHECK_MAIN (flvmux) gst-plugins-good-0.10.31/tests/check/elements/jpegenc.c0000644000175000017500000001600611671175354017626 00000000000000/* GStreamer * * unit test for jpegenc * * Copyright (C) <2010> Thiago Santos * * 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 #include #include /* For ease of programming we use globals to keep refs for our floating * sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysinkpad; static GstPad *mysrcpad; #define JPEG_CAPS_STRING "image/jpeg" #define JPEG_CAPS_RESTRICTIVE "image/jpeg, " \ "width = (int) [100, 200], " \ "framerate = (fraction) 25/1, " \ "extraparameter = (string) { abc, def }" static GstStaticPadTemplate jpeg_sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (JPEG_CAPS_STRING)); static GstStaticPadTemplate any_sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate jpeg_restrictive_sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (JPEG_CAPS_RESTRICTIVE)); static GstStaticPadTemplate any_srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstElement * setup_jpegenc (GstStaticPadTemplate * sinktemplate) { GstElement *jpegenc; GST_DEBUG ("setup_jpegenc"); jpegenc = gst_check_setup_element ("jpegenc"); mysinkpad = gst_check_setup_sink_pad (jpegenc, sinktemplate, NULL); mysrcpad = gst_check_setup_src_pad (jpegenc, &any_srctemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return jpegenc; } static void cleanup_jpegenc (GstElement * jpegenc) { GST_DEBUG ("cleanup_jpegenc"); gst_element_set_state (jpegenc, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_sink_pad (jpegenc); gst_check_teardown_src_pad (jpegenc); gst_check_teardown_element (jpegenc); } static GstBuffer * create_video_buffer (GstCaps * caps) { GstElement *pipeline; GstElement *cf; GstElement *sink; GstBuffer *buffer; pipeline = gst_parse_launch ("videotestsrc num-buffers=1 ! capsfilter name=cf ! appsink name=sink", NULL); g_assert (pipeline != NULL); cf = gst_bin_get_by_name (GST_BIN (pipeline), "cf"); sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); g_object_set (G_OBJECT (cf), "caps", caps, NULL); gst_element_set_state (pipeline, GST_STATE_PLAYING); buffer = gst_app_sink_pull_buffer (GST_APP_SINK (sink)); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); gst_object_unref (sink); gst_object_unref (cf); return buffer; } GST_START_TEST (test_jpegenc_getcaps) { GstElement *jpegenc; GstPad *sinkpad; GstCaps *caps; GstStructure *structure; gint fps_n; gint fps_d; const GValue *value; /* we are going to do some get caps to confirm it doesn't return non-subset * caps */ jpegenc = setup_jpegenc (&any_sinktemplate); sinkpad = gst_element_get_static_pad (jpegenc, "sink"); /* this should assert if non-subset */ caps = gst_pad_get_caps (sinkpad); gst_caps_unref (caps); gst_object_unref (sinkpad); cleanup_jpegenc (jpegenc); jpegenc = setup_jpegenc (&jpeg_sinktemplate); sinkpad = gst_element_get_static_pad (jpegenc, "sink"); /* this should assert if non-subset */ caps = gst_pad_get_caps (sinkpad); gst_caps_unref (caps); gst_object_unref (sinkpad); cleanup_jpegenc (jpegenc); /* now use a more restricted one and check the resulting caps */ jpegenc = setup_jpegenc (&jpeg_restrictive_sinktemplate); sinkpad = gst_element_get_static_pad (jpegenc, "sink"); /* this should assert if non-subset */ caps = gst_pad_get_caps (sinkpad); structure = gst_caps_get_structure (caps, 0); /* check the width */ value = gst_structure_get_value (structure, "width"); fail_unless (gst_value_get_int_range_min (value) == 100); fail_unless (gst_value_get_int_range_max (value) == 200); fail_unless (gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d)); fail_unless (fps_n == 25); fail_unless (fps_d == 1); gst_caps_unref (caps); gst_object_unref (sinkpad); cleanup_jpegenc (jpegenc); } GST_END_TEST; GST_START_TEST (test_jpegenc_different_caps) { GstElement *jpegenc; GstBuffer *buffer; GstCaps *caps; GstCaps *allowed_caps; /* now use a more restricted one and check the resulting caps */ jpegenc = setup_jpegenc (&any_sinktemplate); gst_element_set_state (jpegenc, GST_STATE_PLAYING); /* push first buffer with 800x600 resolution */ caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, 800, "height", G_TYPE_INT, 600, "framerate", GST_TYPE_FRACTION, 1, 1, "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); buffer = create_video_buffer (caps); gst_caps_unref (caps); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); /* check the allowed caps to see if a second buffer with a different * caps could be negotiated */ allowed_caps = gst_pad_get_allowed_caps (mysrcpad); /* the caps we want to negotiate to */ caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, 640, "height", G_TYPE_INT, 480, "framerate", GST_TYPE_FRACTION, 1, 1, "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); fail_unless (gst_caps_can_intersect (allowed_caps, caps)); /* push second buffer with 640x480 resolution */ buffer = create_video_buffer (caps); gst_caps_unref (caps); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); gst_caps_unref (allowed_caps); gst_element_set_state (jpegenc, GST_STATE_NULL); cleanup_jpegenc (jpegenc); } GST_END_TEST; static Suite * jpegenc_suite (void) { Suite *s = suite_create ("jpegenc"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_jpegenc_getcaps); tcase_add_test (tc_chain, test_jpegenc_different_caps); return s; } int main (int argc, char **argv) { int nf; Suite *s = jpegenc_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/flacparse.c0000644000175000017500000002400311717042125020135 00000000000000/* * GStreamer * * unit test for flacparse * * Copyright (C) 2010 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #include "parser.h" #define SRC_CAPS_TMPL "audio/x-flac, framed=(boolean)false" #define SINK_CAPS_TMPL "audio/x-flac, framed=(boolean)true" GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS_TMPL) ); GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS_TMPL) ); /* some data */ static guint8 streaminfo_header[] = { 0x7f, 0x46, 0x4c, 0x41, 0x43, 0x01, 0x00, 0x00, 0x02, 0x66, 0x4c, 0x61, 0x43, 0x00, 0x00, 0x00, 0x22, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xc4, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static guint8 comment_header[] = { 0x84, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static guint8 flac_frame[] = { 0xff, 0xf8, 0xa9, 0x08, 0x00, 0x50, 0x18, 0x06, 0x6a, 0x0c, 0xce, 0x13, 0x24, 0x19, 0x68, 0x00, 0x46, 0x23, 0x08, 0xca, 0xcb, 0x58, 0x9c, 0x26, 0x92, 0x30, 0xa6, 0x29, 0x8a, 0xca, 0xd1, 0x18, 0xae, 0x26, 0x5c, 0x90, 0x60, 0xbf, 0x11, 0xad, 0x43, 0x02, 0x06, 0x26, 0xbd, 0x35, 0xdd, 0xa3, 0x11, 0xa6, 0x4d, 0x18, 0x8c, 0x9a, 0xe4, 0x62, 0xd9, 0x23, 0x11, 0x8b, 0xcb, 0x56, 0x55, 0x45, 0xc2, 0x18, 0x56, 0xa2, 0xe2, 0xe1, 0x18, 0x99, 0x54, 0x98, 0x46, 0x4d, 0x08, 0x70, 0x9a, 0x64, 0xc4, 0x18, 0x4f, 0x27, 0x64, 0x31, 0x66, 0x27, 0x79, 0x19, 0x3c, 0x8c, 0x8c, 0xa3, 0x44, 0x18, 0x23, 0xd2, 0x6b, 0x8b, 0x64, 0x8c, 0x21, 0x84, 0xd6, 0x23, 0x13, 0x13, 0x2d, 0x44, 0xca, 0x5a, 0x23, 0x09, 0x93, 0x25, 0x18, 0x10, 0x61, 0x38, 0xb4, 0x60, 0x8f, 0x2c, 0x8d, 0x26, 0xb4, 0xc9, 0xd9, 0x19, 0x19, 0x34, 0xd7, 0x31, 0x06, 0x10, 0xc4, 0x30, 0x83, 0x17, 0xe2, 0x0c, 0x2c, 0xc4, 0xc8, 0xc9, 0x3c, 0x5e, 0x93, 0x11, 0x8a, 0x62, 0x64, 0x8c, 0x26, 0x23, 0x22, 0x30, 0x9a, 0x58, 0x86, 0x04, 0x18, 0x4c, 0xab, 0x2b, 0x26, 0x5c, 0x46, 0x88, 0xcb, 0xb1, 0x0d, 0x26, 0xbb, 0x5e, 0x8c, 0xa7, 0x64, 0x31, 0x3d, 0x31, 0x06, 0x26, 0x43, 0x17, 0xa3, 0x08, 0x61, 0x06, 0x17, 0xc4, 0x62, 0xec, 0x4d, 0x4b, 0x2e, 0x2d, 0x4a, 0x94, 0xa4, 0xc2, 0x31, 0x4c, 0x4c, 0x20, 0xc0, 0x83, 0x14, 0x8c, 0x27, 0x8b, 0x31, 0x23, 0x2f, 0x23, 0x11, 0x91, 0x94, 0x65, 0x1a, 0x20, 0xc2, 0x18, 0x86, 0x51, 0x88, 0x62, 0x7c, 0x43, 0x2e, 0xa3, 0x04, 0x18, 0x8c, 0x20, 0xc2, 0xf5, 0xaa, 0x94, 0xc2, 0x31, 0x32, 0xd2, 0xb2, 0xa2, 0x30, 0xba, 0x10, 0xc2, 0xb5, 0x89, 0xa5, 0x18, 0x10, 0x62, 0x9a, 0x10, 0x61, 0x19, 0x72, 0x71, 0x1a, 0xb9, 0x0c, 0x23, 0x46, 0x10, 0x62, 0x78, 0x81, 0x82, 0x3d, 0x75, 0xea, 0x6b, 0x51, 0x8b, 0x61, 0x06, 0x08, 0x62, 0x32, 0x5e, 0x84, 0x18, 0x27, 0x25, 0xc2, 0x6a, 0x4b, 0x51, 0x31, 0x34, 0x5e, 0x29, 0xa1, 0x3c, 0x4d, 0x26, 0x23, 0x10, 0xc2, 0x6b, 0xb1, 0x0d, 0x11, 0xae, 0x46, 0x88, 0x31, 0x35, 0xb1, 0x06, 0x08, 0x79, 0x7e, 0x4f, 0x53, 0x23, 0x29, 0xa4, 0x30, 0x20, 0x30, 0x23, 0x5a, 0xb2, 0xc8, 0x60, 0x9c, 0x93, 0x13, 0x17, 0x92, 0x98, 0x46, 0x13, 0x54, 0x53, 0x08, 0xcb, 0x13, 0xa1, 0x1a, 0x89, 0xe5, 0x46, 0x08, 0x18, 0x10, 0x30, 0x9d, 0x68, 0xc2, 0x1c, 0x46, 0x46, 0xae, 0x62, 0x1a, 0x46, 0x4e, 0x4d, 0x34, 0x8c, 0xbd, 0x26, 0xc0, 0x40, 0x62, 0xc9, 0xa9, 0x31, 0x74, 0xa8, 0x99, 0x52, 0xb0, 0x8c, 0xa9, 0x29, 0x84, 0x61, 0x19, 0x54, 0x43, 0x02, 0x06, 0x04, 0x32, 0xe5, 0x18, 0x21, 0x91, 0x8b, 0xf2, 0xcc, 0x10, 0x30, 0x8e, 0x23, 0xc4, 0x76, 0x43, 0x08, 0x30, 0x83, 0x08, 0x62, 0x6c, 0x4e, 0xe2, 0x35, 0x96, 0xd0, 0x8e, 0x89, 0x97, 0x42, 0x18, 0x91, 0x84, 0x61, 0x3c, 0x26, 0xa5, 0x2c, 0x4e, 0x17, 0x94, 0xb8, 0xb5, 0xa4, 0xcb, 0x88, 0xc9, 0x84, 0x18, 0xb9, 0x84, 0x19, 0x23, 0x2d, 0xa4, 0x64, 0x62, 0x18, 0x86, 0x53, 0x93, 0xcb, 0x30, 0x8f, 0x2f, 0x93, 0x55, 0xc4, 0xd7, 0x08, 0x62, 0xb8, 0x46, 0x84, 0x68, 0xa3, 0x02, 0xaf, 0x33 }; static guint8 garbage_frame[] = { 0xff, 0xff, 0xff, 0xff, 0xff }; GST_START_TEST (test_parse_flac_normal) { gst_parser_test_normal (flac_frame, sizeof (flac_frame)); } GST_END_TEST; GST_START_TEST (test_parse_flac_drain_single) { gst_parser_test_drain_single (flac_frame, sizeof (flac_frame)); } GST_END_TEST; GST_START_TEST (test_parse_flac_drain_garbage) { /* We always output the after frame garbage too because we * have no way of detecting it */ #if 0 gst_parser_test_drain_garbage (flac_frame, sizeof (flac_frame), garbage_frame, sizeof (garbage_frame)); #endif guint8 frame[sizeof (flac_frame) + sizeof (garbage_frame)]; memcpy (frame, flac_frame, sizeof (flac_frame)); memcpy (frame + sizeof (flac_frame), garbage_frame, sizeof (garbage_frame)); gst_parser_test_drain_single (frame, sizeof (frame)); } GST_END_TEST; GST_START_TEST (test_parse_flac_split) { gst_parser_test_split (flac_frame, sizeof (flac_frame)); } GST_END_TEST; GST_START_TEST (test_parse_flac_skip_garbage) { /* We always include the garbage into the frame because * we have no easy way for finding the real end of the * frame. The decoder will later skip the garbage */ #if 0 gst_parser_test_skip_garbage (flac_frame, sizeof (flac_frame), garbage_frame, sizeof (garbage_frame)); #endif guint8 frame[sizeof (flac_frame) + sizeof (garbage_frame)]; memcpy (frame, flac_frame, sizeof (flac_frame)); memcpy (frame + sizeof (flac_frame), garbage_frame, sizeof (garbage_frame)); gst_parser_test_normal (frame, sizeof (frame)); } GST_END_TEST; #define structure_get_int(s,f) \ (g_value_get_int(gst_structure_get_value(s,f))) #define fail_unless_structure_field_int_equals(s,field,num) \ fail_unless_equals_int (structure_get_int(s,field), num) /* * Test if the parser handles raw stream and codec_data info properly. */ GST_START_TEST (test_parse_flac_detect_stream) { GstCaps *caps; GstStructure *s; const GValue *streamheader; GArray *bufarr; gint i; /* Push random data. It should get through since the parser should be * initialized because it got codec_data in the caps */ caps = gst_parser_test_get_output_caps (flac_frame, sizeof (flac_frame), SRC_CAPS_TMPL); fail_unless (caps != NULL); /* Check that the negotiated caps are as expected */ /* When codec_data is present, parser assumes that data is version 4 */ GST_LOG ("flac output caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); fail_unless (gst_structure_has_name (s, "audio/x-flac")); fail_unless_structure_field_int_equals (s, "channels", 1); fail_unless_structure_field_int_equals (s, "rate", 44100); fail_unless (gst_structure_has_field (s, "streamheader")); streamheader = gst_structure_get_value (s, "streamheader"); fail_unless (G_VALUE_TYPE (streamheader) == GST_TYPE_ARRAY); bufarr = g_value_peek_pointer (streamheader); fail_unless (bufarr->len == 2); for (i = 0; i < bufarr->len; i++) { GstBuffer *buf; GValue *bufval = &g_array_index (bufarr, GValue, i); fail_unless (G_VALUE_TYPE (bufval) == GST_TYPE_BUFFER); buf = g_value_peek_pointer (bufval); if (i == 0) { fail_unless (GST_BUFFER_SIZE (buf) == sizeof (streaminfo_header)); fail_unless (memcmp (GST_BUFFER_DATA (buf), streaminfo_header, sizeof (streaminfo_header)) == 0); } else if (i == 1) { fail_unless (GST_BUFFER_SIZE (buf) == sizeof (comment_header)); fail_unless (memcmp (GST_BUFFER_DATA (buf), comment_header, sizeof (comment_header)) == 0); } } gst_caps_unref (caps); } GST_END_TEST; GST_START_TEST (test_parse_flac_set_index) { GstElement *parse; GstIndex *idx; idx = gst_index_factory_make ("memindex"); if (idx == NULL) return; parse = gst_element_factory_make ("flacparse", NULL); fail_unless (parse != NULL); gst_object_ref_sink (idx); gst_element_set_index (parse, GST_INDEX (idx)); gst_object_unref (idx); gst_object_unref (parse); } GST_END_TEST; static Suite * flacparse_suite (void) { Suite *s = suite_create ("flacparse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_parse_flac_normal); tcase_add_test (tc_chain, test_parse_flac_drain_single); tcase_add_test (tc_chain, test_parse_flac_drain_garbage); tcase_add_test (tc_chain, test_parse_flac_split); tcase_add_test (tc_chain, test_parse_flac_skip_garbage); /* Other tests */ tcase_add_test (tc_chain, test_parse_flac_detect_stream); tcase_add_test (tc_chain, test_parse_flac_set_index); return s; } /* * TODO: * - Both push- and pull-modes need to be tested * * Pull-mode & EOS */ int main (int argc, char **argv) { int nf; Suite *s = flacparse_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); /* init test context */ ctx_factory = "flacparse"; ctx_sink_template = &sinktemplate; ctx_src_template = &srctemplate; ctx_discard = 3; ctx_headers[0].data = streaminfo_header; ctx_headers[0].size = sizeof (streaminfo_header); ctx_headers[1].data = comment_header; ctx_headers[1].size = sizeof (comment_header); /* custom offsets, and ts always repeatedly 0 */ ctx_no_metadata = TRUE; srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/rtpbin.c0000644000175000017500000003035611671175354017515 00000000000000/* GStreamer * * unit test for gstrtpbin * * Copyright (C) <2009> Wim Taymans * * 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 GST_START_TEST (test_cleanup_send) { GstElement *rtpbin; GstPad *rtp_sink, *rtp_src, *rtcp_src; GObject *session; gint count = 2; rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); while (count--) { /* request session 0 */ rtp_sink = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0"); fail_unless (rtp_sink != NULL); ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 2); /* this static pad should be created automatically now */ rtp_src = gst_element_get_static_pad (rtpbin, "send_rtp_src_0"); fail_unless (rtp_src != NULL); ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 2); /* we should be able to get an internal session 0 now */ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session); fail_unless (session != NULL); g_object_unref (session); /* get the send RTCP pad too */ rtcp_src = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0"); fail_unless (rtcp_src != NULL); ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtcp_src", 2); gst_element_release_request_pad (rtpbin, rtp_sink); /* we should only have our refs to the pads now */ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 1); ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 1); ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtp_src", 2); /* the other pad should be gone now */ fail_unless (gst_element_get_static_pad (rtpbin, "send_rtp_src_0") == NULL); /* internal session should still be there */ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session); fail_unless (session != NULL); g_object_unref (session); /* release the RTCP pad */ gst_element_release_request_pad (rtpbin, rtcp_src); /* we should only have our refs to the pads now */ ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 1); ASSERT_OBJECT_REFCOUNT (rtp_src, "rtp_src", 1); ASSERT_OBJECT_REFCOUNT (rtcp_src, "rtp_src", 1); /* the session should be gone now */ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session); fail_unless (session == NULL); /* unref the request pad and the static pad */ gst_object_unref (rtp_sink); gst_object_unref (rtp_src); gst_object_unref (rtcp_src); } gst_object_unref (rtpbin); } GST_END_TEST; typedef struct { guint16 seqnum; gboolean pad_added; GstPad *pad; GMutex *lock; GCond *cond; GstPad *sinkpad; GList *pads; } CleanupData; static void init_data (CleanupData * data) { data->seqnum = 10; data->pad_added = FALSE; data->lock = g_mutex_new (); data->cond = g_cond_new (); data->pads = NULL; } static void clean_data (CleanupData * data) { g_list_foreach (data->pads, (GFunc) gst_object_unref, NULL); g_list_free (data->pads); g_mutex_free (data->lock); g_cond_free (data->cond); } static guint8 rtp_packet[] = { 0x80, 0x60, 0x94, 0xbc, 0x8f, 0x37, 0x4e, 0xb8, 0x44, 0xa8, 0xf3, 0x7c, 0x06, 0x6a, 0x0c, 0xce, 0x13, 0x25, 0x19, 0x69, 0x1f, 0x93, 0x25, 0x9d, 0x2b, 0x82, 0x31, 0x3b, 0x36, 0xc1, 0x3c, 0x13 }; static GstBuffer * make_rtp_packet (CleanupData * data) { static GstCaps *caps = NULL; GstBuffer *result; guint8 *datap; if (caps == NULL) { caps = gst_caps_from_string ("application/x-rtp," "media=(string)audio, clock-rate=(int)44100, " "encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1"); data->seqnum = 0; } result = gst_buffer_new_and_alloc (sizeof (rtp_packet)); datap = GST_BUFFER_DATA (result); memcpy (datap, rtp_packet, sizeof (rtp_packet)); datap[2] = (data->seqnum >> 8) & 0xff; datap[3] = data->seqnum & 0xff; data->seqnum++; gst_buffer_set_caps (result, caps); return result; } static GstFlowReturn dummy_chain (GstPad * pad, GstBuffer * buffer) { gst_buffer_unref (buffer); return GST_FLOW_OK; } static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp")); static GstPad * make_sinkpad (CleanupData * data) { GstPad *pad; pad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_pad_set_chain_function (pad, dummy_chain); gst_pad_set_active (pad, TRUE); data->pads = g_list_prepend (data->pads, pad); return pad; } static void pad_added_cb (GstElement * rtpbin, GstPad * pad, CleanupData * data) { GstPad *sinkpad; GST_DEBUG ("pad added %s:%s\n", GST_DEBUG_PAD_NAME (pad)); if (GST_PAD_IS_SINK (pad)) return; fail_unless (data->pad_added == FALSE); sinkpad = make_sinkpad (data); fail_unless (gst_pad_link (pad, sinkpad) == GST_PAD_LINK_OK); g_mutex_lock (data->lock); data->pad_added = TRUE; data->pad = pad; g_cond_signal (data->cond); g_mutex_unlock (data->lock); } static void pad_removed_cb (GstElement * rtpbin, GstPad * pad, CleanupData * data) { GST_DEBUG ("pad removed %s:%s\n", GST_DEBUG_PAD_NAME (pad)); if (data->pad != pad) return; fail_unless (data->pad_added == TRUE); g_mutex_lock (data->lock); data->pad_added = FALSE; g_cond_signal (data->cond); g_mutex_unlock (data->lock); } GST_START_TEST (test_cleanup_recv) { GstElement *rtpbin; GstPad *rtp_sink; CleanupData data; GstStateChangeReturn ret; GstFlowReturn res; GstBuffer *buffer; gint count = 2; init_data (&data); rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); g_signal_connect (rtpbin, "pad-added", (GCallback) pad_added_cb, &data); g_signal_connect (rtpbin, "pad-removed", (GCallback) pad_removed_cb, &data); ret = gst_element_set_state (rtpbin, GST_STATE_PLAYING); fail_unless (ret == GST_STATE_CHANGE_SUCCESS); while (count--) { /* request session 0 */ rtp_sink = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0"); fail_unless (rtp_sink != NULL); ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 2); /* no sourcepads are created yet */ fail_unless (rtpbin->numsinkpads == 1); fail_unless (rtpbin->numsrcpads == 0); buffer = make_rtp_packet (&data); res = gst_pad_chain (rtp_sink, buffer); GST_DEBUG ("res %d, %s\n", res, gst_flow_get_name (res)); fail_unless (res == GST_FLOW_OK); buffer = make_rtp_packet (&data); res = gst_pad_chain (rtp_sink, buffer); GST_DEBUG ("res %d, %s\n", res, gst_flow_get_name (res)); fail_unless (res == GST_FLOW_OK); /* we wait for the new pad to appear now */ g_mutex_lock (data.lock); while (!data.pad_added) g_cond_wait (data.cond, data.lock); g_mutex_unlock (data.lock); /* sourcepad created now */ fail_unless (rtpbin->numsinkpads == 1); fail_unless (rtpbin->numsrcpads == 1); /* remove the session */ gst_element_release_request_pad (rtpbin, rtp_sink); gst_object_unref (rtp_sink); /* pad should be gone now */ g_mutex_lock (data.lock); while (data.pad_added) g_cond_wait (data.cond, data.lock); g_mutex_unlock (data.lock); /* nothing left anymore now */ fail_unless (rtpbin->numsinkpads == 0); fail_unless (rtpbin->numsrcpads == 0); } ret = gst_element_set_state (rtpbin, GST_STATE_NULL); fail_unless (ret == GST_STATE_CHANGE_SUCCESS); gst_object_unref (rtpbin); clean_data (&data); } GST_END_TEST; GST_START_TEST (test_cleanup_recv2) { GstElement *rtpbin; GstPad *rtp_sink; CleanupData data; GstStateChangeReturn ret; GstFlowReturn res; GstBuffer *buffer; gint count = 2; init_data (&data); rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); g_signal_connect (rtpbin, "pad-added", (GCallback) pad_added_cb, &data); g_signal_connect (rtpbin, "pad-removed", (GCallback) pad_removed_cb, &data); ret = gst_element_set_state (rtpbin, GST_STATE_PLAYING); fail_unless (ret == GST_STATE_CHANGE_SUCCESS); /* request session 0 */ rtp_sink = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0"); fail_unless (rtp_sink != NULL); ASSERT_OBJECT_REFCOUNT (rtp_sink, "rtp_sink", 2); while (count--) { /* no sourcepads are created yet */ fail_unless (rtpbin->numsinkpads == 1); fail_unless (rtpbin->numsrcpads == 0); buffer = make_rtp_packet (&data); res = gst_pad_chain (rtp_sink, buffer); GST_DEBUG ("res %d, %s\n", res, gst_flow_get_name (res)); fail_unless (res == GST_FLOW_OK); buffer = make_rtp_packet (&data); res = gst_pad_chain (rtp_sink, buffer); GST_DEBUG ("res %d, %s\n", res, gst_flow_get_name (res)); fail_unless (res == GST_FLOW_OK); /* we wait for the new pad to appear now */ g_mutex_lock (data.lock); while (!data.pad_added) g_cond_wait (data.cond, data.lock); g_mutex_unlock (data.lock); /* sourcepad created now */ fail_unless (rtpbin->numsinkpads == 1); fail_unless (rtpbin->numsrcpads == 1); /* change state */ ret = gst_element_set_state (rtpbin, GST_STATE_NULL); fail_unless (ret == GST_STATE_CHANGE_SUCCESS); /* pad should be gone now */ g_mutex_lock (data.lock); while (data.pad_added) g_cond_wait (data.cond, data.lock); g_mutex_unlock (data.lock); /* back to playing for the next round */ ret = gst_element_set_state (rtpbin, GST_STATE_PLAYING); fail_unless (ret == GST_STATE_CHANGE_SUCCESS); } /* remove the session */ gst_element_release_request_pad (rtpbin, rtp_sink); gst_object_unref (rtp_sink); /* nothing left anymore now */ fail_unless (rtpbin->numsinkpads == 0); fail_unless (rtpbin->numsrcpads == 0); ret = gst_element_set_state (rtpbin, GST_STATE_NULL); fail_unless (ret == GST_STATE_CHANGE_SUCCESS); gst_object_unref (rtpbin); clean_data (&data); } GST_END_TEST; GST_START_TEST (test_request_pad_by_template_name) { GstElement *rtpbin; GstPad *rtp_sink1, *rtp_sink2, *rtp_sink3; rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); rtp_sink1 = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_%d"); fail_unless (rtp_sink1 != NULL); fail_unless_equals_string (GST_PAD_NAME (rtp_sink1), "recv_rtp_sink_0"); ASSERT_OBJECT_REFCOUNT (rtp_sink1, "rtp_sink1", 2); rtp_sink2 = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_%d"); fail_unless (rtp_sink2 != NULL); fail_unless_equals_string (GST_PAD_NAME (rtp_sink2), "recv_rtp_sink_1"); ASSERT_OBJECT_REFCOUNT (rtp_sink2, "rtp_sink2", 2); rtp_sink3 = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_%d"); fail_unless (rtp_sink3 != NULL); fail_unless_equals_string (GST_PAD_NAME (rtp_sink3), "recv_rtp_sink_2"); ASSERT_OBJECT_REFCOUNT (rtp_sink3, "rtp_sink3", 2); gst_element_release_request_pad (rtpbin, rtp_sink2); gst_element_release_request_pad (rtpbin, rtp_sink1); gst_element_release_request_pad (rtpbin, rtp_sink3); ASSERT_OBJECT_REFCOUNT (rtp_sink3, "rtp_sink3", 1); ASSERT_OBJECT_REFCOUNT (rtp_sink2, "rtp_sink2", 1); ASSERT_OBJECT_REFCOUNT (rtp_sink1, "rtp_sink", 1); gst_object_unref (rtp_sink1); gst_object_unref (rtp_sink2); gst_object_unref (rtp_sink3); gst_object_unref (rtpbin); } GST_END_TEST; static Suite * gstrtpbin_suite (void) { Suite *s = suite_create ("gstrtpbin"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_cleanup_send); tcase_add_test (tc_chain, test_cleanup_recv); tcase_add_test (tc_chain, test_cleanup_recv2); tcase_add_test (tc_chain, test_request_pad_by_template_name); return s; } int main (int argc, char **argv) { int nf; Suite *s = gstrtpbin_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/videofilter.c0000644000175000017500000001454611671175354020536 00000000000000/* GStreamer * * unit test for videofilter elements * * Copyright (C) <2006> Mark Nauwelaerts * * 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 #include #include #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define VIDEO_CAPS_TEMPLATE_STRING \ GST_VIDEO_CAPS_YUV ("I420") ";" \ GST_VIDEO_CAPS_YUV ("AYUV") ";" \ GST_VIDEO_CAPS_YUV ("YUY2") ";" \ GST_VIDEO_CAPS_YUV ("UYVY") ";" \ GST_VIDEO_CAPS_YUV ("YVYU") ";" \ GST_VIDEO_CAPS_xRGB static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_TEMPLATE_STRING) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_TEMPLATE_STRING) ); /* takes over reference for outcaps */ static GstElement * setup_filter (const gchar * name, const gchar * prop, va_list var_args) { GstElement *element; GST_DEBUG ("setup_element"); element = gst_check_setup_element (name); g_object_set_valist (G_OBJECT (element), prop, var_args); mysrcpad = gst_check_setup_src_pad (element, &srctemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate, NULL); gst_pad_set_active (mysinkpad, TRUE); return element; } static void cleanup_filter (GstElement * filter) { GST_DEBUG ("cleanup_element"); gst_check_teardown_src_pad (filter); gst_check_teardown_sink_pad (filter); gst_check_teardown_element (filter); } static void check_filter_caps (const gchar * name, GstCaps * caps, gint size, gint num_buffers, const gchar * prop, va_list varargs) { GstElement *filter; GstBuffer *inbuffer, *outbuffer; gint i; filter = setup_filter (name, prop, varargs); fail_unless (gst_element_set_state (filter, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); for (i = 0; i < num_buffers; ++i) { inbuffer = gst_buffer_new_and_alloc (size); /* makes valgrind's memcheck happier */ memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer)); gst_buffer_set_caps (inbuffer, caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); } fail_unless (g_list_length (buffers) == num_buffers); /* clean up buffers */ for (i = 0; i < num_buffers; ++i) { outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); switch (i) { case 0: fail_unless (GST_BUFFER_SIZE (outbuffer) == size); /* no check on filter operation itself */ break; default: break; } buffers = g_list_remove (buffers, outbuffer); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } cleanup_filter (filter); g_list_free (buffers); buffers = NULL; } static void check_filter (const gchar * name, gint num_buffers, const gchar * prop, ...) { static const struct { const int width, height; } resolutions[] = { { 384, 288}, { 385, 289}, { 385, 385}}; gint i, n, r; GstVideoFormat format; gint size; GstCaps *templ = gst_caps_from_string (VIDEO_CAPS_TEMPLATE_STRING); va_list varargs; n = gst_caps_get_size (templ); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (templ, i); GstCaps *caps = gst_caps_new_empty (); gst_caps_append_structure (caps, gst_structure_copy (s)); /* try various resolutions */ for (r = 0; r < G_N_ELEMENTS (resolutions); ++r) { caps = gst_caps_make_writable (caps); gst_caps_set_simple (caps, "width", G_TYPE_INT, resolutions[r].width, "height", G_TYPE_INT, resolutions[r].height, "framerate", GST_TYPE_FRACTION, 25, 1, NULL); GST_DEBUG ("Testing with caps: %" GST_PTR_FORMAT, caps); gst_video_format_parse_caps (caps, &format, NULL, NULL); size = gst_video_format_get_size (format, resolutions[r].width, resolutions[r].height); va_start (varargs, prop); check_filter_caps (name, caps, size, num_buffers, prop, varargs); va_end (varargs); } gst_caps_unref (caps); } gst_caps_unref (templ); } GST_START_TEST (test_videobalance) { check_filter ("videobalance", 2, NULL); check_filter ("videobalance", 2, "saturation", 0.5, "hue", 0.8, NULL); } GST_END_TEST; GST_START_TEST (test_videoflip) { /* these we can handle with the caps */ check_filter ("videoflip", 2, "method", 0, NULL); check_filter ("videoflip", 2, "method", 2, NULL); check_filter ("videoflip", 2, "method", 4, NULL); check_filter ("videoflip", 2, "method", 5, NULL); } GST_END_TEST; GST_START_TEST (test_gamma) { check_filter ("gamma", 2, NULL); check_filter ("gamma", 2, "gamma", 2.0, NULL); } GST_END_TEST; static Suite * videofilter_suite (void) { Suite *s = suite_create ("videofilter"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_videobalance); tcase_add_test (tc_chain, test_videoflip); tcase_add_test (tc_chain, test_gamma); return s; } int main (int argc, char **argv) { int nf; Suite *s = videofilter_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/deinterlace.c0000644000175000017500000003155111671175354020474 00000000000000/* GStreamer unit tests for the deinterlace element * Copyright (C) 2010 Thiago Santos * * 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 #include #include static gboolean gst_caps_is_interlaced (GstCaps * caps) { GstStructure G_GNUC_UNUSED *structure; gboolean interlaced = FALSE; fail_unless (gst_caps_is_fixed (caps)); structure = gst_caps_get_structure (caps, 0); fail_unless (gst_video_format_parse_caps_interlaced (caps, &interlaced)); return interlaced; } GST_START_TEST (test_create_and_unref) { GstElement *deinterlace; deinterlace = gst_element_factory_make ("deinterlace", NULL); fail_unless (deinterlace != NULL); gst_element_set_state (deinterlace, GST_STATE_NULL); gst_object_unref (deinterlace); } GST_END_TEST; #define CAPS_VIDEO_COMMON \ "width=(int)800, height=(int)600, framerate=(fraction)15/1" #define CAPS_IMAGE_COMMON \ "width=(int)3200, height=(int)3400, framerate=(fraction)0/1" #define CAPS_YUY2 \ "video/x-raw-yuv, " \ CAPS_VIDEO_COMMON ", " \ "format=(fourcc)YUY2" #define CAPS_YUY2_INTERLACED \ CAPS_YUY2 ", " \ "interlaced=(boolean)true" #define CAPS_YVYU \ "video/x-raw-yuv, " \ CAPS_VIDEO_COMMON ", " \ "format=(fourcc)YVYU" #define CAPS_YVYU_INTERLACED \ CAPS_YVYU ", " \ "interlaced=(boolean)true" #define CAPS_YUY2_IMAGE \ "video/x-raw-yuv, " \ CAPS_IMAGE_COMMON ", " \ "format=(fourcc)YUY2" #define CAPS_YUY2_INTERLACED_IMAGE \ CAPS_YUY2_IMAGE ", " \ "interlaced=(boolean)true" #define CAPS_YVYU_IMAGE \ "video/x-raw-yuv, " \ CAPS_IMAGE_COMMON ", " \ "format=(fourcc)YVYU" #define CAPS_YVYU_INTERLACED_IMAGE \ CAPS_YVYU_IMAGE ", " \ "interlaced=(boolean)true" static GstElement *deinterlace; static GstPad *srcpad; static GstPad *sinkpad; static GstElement *pipeline; /* sets up deinterlace and shortcut pointers to its pads */ static void setup_deinterlace (void) { deinterlace = gst_element_factory_make ("deinterlace", NULL); fail_unless (deinterlace != NULL); sinkpad = gst_element_get_static_pad (deinterlace, "sink"); fail_unless (sinkpad != NULL); srcpad = gst_element_get_static_pad (deinterlace, "src"); fail_unless (srcpad != NULL); } /* sets up a basic test pipeline containing: * * videotestsrc ! capsfilter ! deinterlace ! fakesink * * The parameters set the capsfilter caps and the num-buffers * property of videotestsrc * * It is useful for adding buffer probes to deinterlace pads * and validating inputs/outputs */ static void setup_test_pipeline (gint mode, GstCaps * infiltercaps, GstCaps * outfiltercaps, gint numbuffers) { GstElement *src; GstElement *infilter; GstElement *outfilter; GstElement *sink; setup_deinterlace (); pipeline = gst_pipeline_new ("pipeline"); src = gst_element_factory_make ("videotestsrc", NULL); infilter = gst_element_factory_make ("capsfilter", "infilter"); outfilter = gst_element_factory_make ("capsfilter", "outfilter"); sink = gst_element_factory_make ("fakesink", NULL); fail_if (src == NULL); fail_if (infilter == NULL); fail_if (outfilter == NULL); fail_if (sink == NULL); fail_unless (gst_bin_add (GST_BIN (pipeline), src)); fail_unless (gst_bin_add (GST_BIN (pipeline), infilter)); fail_unless (gst_bin_add (GST_BIN (pipeline), deinterlace)); fail_unless (gst_bin_add (GST_BIN (pipeline), outfilter)); fail_unless (gst_bin_add (GST_BIN (pipeline), sink)); /* set the properties */ g_object_set (deinterlace, "mode", mode, NULL); if (numbuffers > 0) g_object_set (src, "num-buffers", numbuffers, NULL); if (infiltercaps) g_object_set (infilter, "caps", infiltercaps, NULL); if (outfiltercaps) g_object_set (outfilter, "caps", outfiltercaps, NULL); fail_unless (gst_element_link_many (src, infilter, deinterlace, outfilter, sink, NULL)); if (infiltercaps) gst_caps_unref (infiltercaps); if (outfiltercaps) gst_caps_unref (outfiltercaps); } /* * Checks if 2 buffers are equal * * Equals means same caps and same data */ static gboolean test_buffer_equals (GstBuffer * buf_a, GstBuffer * buf_b) { GstCaps *caps_a; GstCaps *caps_b; if (GST_BUFFER_SIZE (buf_a) != GST_BUFFER_SIZE (buf_b)) return FALSE; caps_a = gst_buffer_get_caps (buf_a); caps_b = gst_buffer_get_caps (buf_b); if (!gst_caps_is_equal (caps_a, caps_b)) return FALSE; gst_caps_unref (caps_a); gst_caps_unref (caps_b); return memcmp (GST_BUFFER_DATA (buf_a), GST_BUFFER_DATA (buf_b), GST_BUFFER_SIZE (buf_a)) == 0; } static gboolean sinkpad_enqueue_buffer (GstPad * pad, GstBuffer * buf, gpointer data) { GQueue *queue = (GQueue *) data; /* enqueue a copy for being compared later */ g_queue_push_tail (queue, gst_buffer_copy (buf)); return TRUE; } /* * pad buffer probe that compares the buffer with the top one * in the GQueue passed as the user data */ static gboolean srcpad_dequeue_and_compare_buffer (GstPad * pad, GstBuffer * buf, gpointer data) { GQueue *queue = (GQueue *) data; GstBuffer *queue_buf; queue_buf = (GstBuffer *) g_queue_pop_head (queue); fail_if (queue_buf == NULL); fail_unless (test_buffer_equals (buf, queue_buf)); gst_buffer_unref (queue_buf); return TRUE; } /* * Utility function that sets up a pipeline with deinterlace for * validanting that it operates in passthrough mode when receiving * data with 'infiltercaps' as the input caps and operating in 'mode' mode */ static void deinterlace_check_passthrough (gint mode, const gchar * infiltercaps) { GstMessage *msg; GQueue *queue; GstCaps *incaps = NULL; if (infiltercaps) incaps = gst_caps_from_string (infiltercaps); setup_test_pipeline (mode, incaps, NULL, 20); queue = g_queue_new (); /* set up probes for testing */ gst_pad_add_buffer_probe (sinkpad, (GCallback) sinkpad_enqueue_buffer, queue); gst_pad_add_buffer_probe (srcpad, (GCallback) srcpad_dequeue_and_compare_buffer, queue); fail_unless (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); gst_message_unref (msg); /* queue should be empty */ fail_unless (g_queue_is_empty (queue)); fail_unless (gst_element_set_state (pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (pipeline); g_queue_free (queue); } /* * Sets the caps on deinterlace sinkpad and validates the * caps that is set on the srcpad */ static void deinterlace_set_caps_and_check (GstCaps * input, gboolean must_deinterlace) { GstCaps *othercaps = NULL; fail_unless (gst_pad_set_caps (sinkpad, input)); g_object_get (srcpad, "caps", &othercaps, NULL); if (must_deinterlace) { fail_if (gst_caps_is_interlaced (othercaps)); } else { GstStructure *s; fail_unless (gst_caps_is_interlaced (input) == gst_caps_is_interlaced (othercaps)); othercaps = gst_caps_make_writable (othercaps); s = gst_caps_get_structure (othercaps, 0); gst_structure_remove_field (s, "interlaced"); input = gst_caps_make_writable (input); s = gst_caps_get_structure (input, 0); gst_structure_remove_field (s, "interlaced"); fail_unless (gst_caps_is_equal (input, othercaps)); } gst_caps_unref (input); gst_caps_unref (othercaps); } static void deinterlace_set_string_caps_and_check (const gchar * input, gboolean must_deinterlace) { deinterlace_set_caps_and_check (gst_caps_from_string (input), must_deinterlace); } GST_START_TEST (test_mode_auto_accept_caps) { setup_deinterlace (); /* auto mode */ g_object_set (deinterlace, "mode", 0, NULL); fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); /* try to set non interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2, FALSE); deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, FALSE); /* now try to set interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, TRUE); /* cleanup */ gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); } GST_END_TEST; GST_START_TEST (test_mode_forced_accept_caps) { setup_deinterlace (); /* forced mode */ g_object_set (deinterlace, "mode", 1, NULL); fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); /* try to set non interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2, TRUE); deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, TRUE); /* now try to set interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, TRUE); deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, TRUE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, TRUE); /* cleanup */ gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); } GST_END_TEST; GST_START_TEST (test_mode_disabled_accept_caps) { setup_deinterlace (); /* disabled mode */ g_object_set (deinterlace, "mode", 2, NULL); fail_unless (gst_element_set_state (deinterlace, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); /* try to set non interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2, FALSE); deinterlace_set_string_caps_and_check (CAPS_YVYU_IMAGE, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_IMAGE, FALSE); /* now try to set interlaced caps */ deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED, FALSE); deinterlace_set_string_caps_and_check (CAPS_YVYU_INTERLACED_IMAGE, FALSE); deinterlace_set_string_caps_and_check (CAPS_YUY2_INTERLACED_IMAGE, FALSE); /* cleanup */ gst_object_unref (sinkpad); gst_object_unref (srcpad); fail_unless (gst_element_set_state (deinterlace, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); gst_object_unref (deinterlace); } GST_END_TEST; GST_START_TEST (test_mode_disabled_passthrough) { /* 2 is disabled mode */ deinterlace_check_passthrough (2, CAPS_YUY2_INTERLACED); deinterlace_check_passthrough (2, CAPS_YVYU_INTERLACED); deinterlace_check_passthrough (2, CAPS_YUY2); deinterlace_check_passthrough (2, CAPS_YVYU); deinterlace_check_passthrough (2, CAPS_YUY2_INTERLACED_IMAGE); deinterlace_check_passthrough (2, CAPS_YVYU_INTERLACED_IMAGE); deinterlace_check_passthrough (2, CAPS_YUY2_IMAGE); deinterlace_check_passthrough (2, CAPS_YVYU_IMAGE); } GST_END_TEST; GST_START_TEST (test_mode_auto_deinterlaced_passthrough) { /* 0 is auto mode */ deinterlace_check_passthrough (0, CAPS_YUY2); deinterlace_check_passthrough (0, CAPS_YVYU); deinterlace_check_passthrough (0, CAPS_YUY2_IMAGE); deinterlace_check_passthrough (0, CAPS_YVYU_IMAGE); } GST_END_TEST; static Suite * deinterlace_suite (void) { Suite *s = suite_create ("deinterlace"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_set_timeout (tc_chain, 180); tcase_add_test (tc_chain, test_create_and_unref); tcase_add_test (tc_chain, test_mode_auto_accept_caps); tcase_add_test (tc_chain, test_mode_forced_accept_caps); tcase_add_test (tc_chain, test_mode_disabled_accept_caps); tcase_add_test (tc_chain, test_mode_disabled_passthrough); tcase_add_test (tc_chain, test_mode_auto_deinterlaced_passthrough); return s; } GST_CHECK_MAIN (deinterlace); gst-plugins-good-0.10.31/tests/check/elements/amrparse.c0000644000175000017500000001706011671175354020026 00000000000000/* * GStreamer * * unit test for amrparse * * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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 #include "parser.h" #define SRC_CAPS_NB "audio/x-amr-nb-sh" #define SRC_CAPS_WB "audio/x-amr-wb-sh" #define SRC_CAPS_ANY "ANY" #define SINK_CAPS_NB "audio/AMR, rate=8000 , channels=1" #define SINK_CAPS_WB "audio/AMR-WB, rate=16000 , channels=1" #define SINK_CAPS_ANY "ANY" #define AMR_FRAME_DURATION (GST_SECOND/50) static GstStaticPadTemplate sinktemplate_nb = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS_NB) ); static GstStaticPadTemplate sinktemplate_wb = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS_WB) ); static GstStaticPadTemplate srctemplate_nb = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS_NB) ); static GstStaticPadTemplate srctemplate_wb = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (SRC_CAPS_WB) ); /* some data */ static guint8 frame_data_nb[] = { 0x0c, 0x56, 0x3c, 0x52, 0xe0, 0x61, 0xbc, 0x45, 0x0f, 0x98, 0x2e, 0x01, 0x42, 0x02 }; static guint8 frame_data_wb[] = { 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; static guint8 frame_hdr_nb[] = { '#', '!', 'A', 'M', 'R', '\n' }; static guint8 frame_hdr_wb[] = { '#', '!', 'A', 'M', 'R', '-', 'W', 'B', '\n' }; static guint8 garbage_frame[] = { 0xff, 0xff, 0xff, 0xff, 0xff }; GST_START_TEST (test_parse_nb_normal) { gst_parser_test_normal (frame_data_nb, sizeof (frame_data_nb)); } GST_END_TEST; GST_START_TEST (test_parse_nb_drain_single) { gst_parser_test_drain_single (frame_data_nb, sizeof (frame_data_nb)); } GST_END_TEST; GST_START_TEST (test_parse_nb_drain_garbage) { gst_parser_test_drain_garbage (frame_data_nb, sizeof (frame_data_nb), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_nb_split) { gst_parser_test_split (frame_data_nb, sizeof (frame_data_nb)); } GST_END_TEST; GST_START_TEST (test_parse_nb_skip_garbage) { gst_parser_test_skip_garbage (frame_data_nb, sizeof (frame_data_nb), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_nb_detect_stream) { GstParserTest ptest; GstCaps *old_ctx_caps; /* no input caps, override ctx */ old_ctx_caps = ctx_input_caps; ctx_input_caps = NULL; /* AMR-NB header */ gst_parser_test_init (&ptest, frame_hdr_nb, sizeof (frame_hdr_nb), 1); /* well, no garbage, followed by real data */ ptest.series[2].data = frame_data_nb; ptest.series[2].size = sizeof (frame_data_nb); ptest.series[2].num = 10; /* header gets dropped, so ... */ /* buffer count will not match */ ptest.framed = FALSE; /* total size a bit less */ ptest.dropped = sizeof (frame_hdr_nb); /* Check that the negotiated caps are as expected */ ptest.sink_caps = gst_caps_from_string (SINK_CAPS_NB); gst_parser_test_run (&ptest, NULL); gst_caps_unref (ptest.sink_caps); ctx_input_caps = old_ctx_caps; } GST_END_TEST; GST_START_TEST (test_parse_wb_normal) { gst_parser_test_normal (frame_data_wb, sizeof (frame_data_wb)); } GST_END_TEST; GST_START_TEST (test_parse_wb_drain_single) { gst_parser_test_drain_single (frame_data_wb, sizeof (frame_data_wb)); } GST_END_TEST; GST_START_TEST (test_parse_wb_drain_garbage) { gst_parser_test_drain_garbage (frame_data_wb, sizeof (frame_data_wb), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_wb_split) { gst_parser_test_split (frame_data_wb, sizeof (frame_data_wb)); } GST_END_TEST; GST_START_TEST (test_parse_wb_skip_garbage) { gst_parser_test_skip_garbage (frame_data_wb, sizeof (frame_data_wb), garbage_frame, sizeof (garbage_frame)); } GST_END_TEST; GST_START_TEST (test_parse_wb_detect_stream) { GstParserTest ptest; GstCaps *old_ctx_caps; /* no input caps, override ctx */ old_ctx_caps = ctx_input_caps; ctx_input_caps = NULL; /* AMR-WB header */ gst_parser_test_init (&ptest, frame_hdr_wb, sizeof (frame_hdr_wb), 1); /* well, no garbage, followed by real data */ ptest.series[2].data = frame_data_wb; ptest.series[2].size = sizeof (frame_data_wb); ptest.series[2].num = 10; /* header gets dropped, so ... */ /* buffer count will not match */ ptest.framed = FALSE; /* total size a bit less */ ptest.dropped = sizeof (frame_hdr_wb); /* Check that the negotiated caps are as expected */ ptest.sink_caps = gst_caps_from_string (SINK_CAPS_WB); gst_parser_test_run (&ptest, NULL); gst_caps_unref (ptest.sink_caps); ctx_input_caps = old_ctx_caps; } GST_END_TEST; /* * Create test suite. */ static Suite * amrnb_parse_suite (void) { Suite *s = suite_create ("amrwb_parse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); /* AMR-NB tests */ tcase_add_test (tc_chain, test_parse_nb_normal); tcase_add_test (tc_chain, test_parse_nb_drain_single); tcase_add_test (tc_chain, test_parse_nb_drain_garbage); tcase_add_test (tc_chain, test_parse_nb_split); tcase_add_test (tc_chain, test_parse_nb_detect_stream); tcase_add_test (tc_chain, test_parse_nb_skip_garbage); return s; } static Suite * amrwb_parse_suite (void) { Suite *s = suite_create ("amrnb_parse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); /* AMR-WB tests */ tcase_add_test (tc_chain, test_parse_wb_normal); tcase_add_test (tc_chain, test_parse_wb_drain_single); tcase_add_test (tc_chain, test_parse_wb_drain_garbage); tcase_add_test (tc_chain, test_parse_wb_split); tcase_add_test (tc_chain, test_parse_wb_detect_stream); tcase_add_test (tc_chain, test_parse_wb_skip_garbage); return s; } /* * TODO: * - Both push- and pull-modes need to be tested * * Pull-mode & EOS */ int main (int argc, char **argv) { int nf; GstCaps *caps; Suite *s = amrnb_parse_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); /* init test context */ ctx_factory = "amrparse"; ctx_sink_template = &sinktemplate_nb; ctx_src_template = &srctemplate_nb; caps = gst_caps_from_string (SRC_CAPS_NB); g_assert (caps); ctx_input_caps = caps; srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); gst_caps_unref (caps); s = amrwb_parse_suite (); sr = srunner_create (s); ctx_sink_template = &sinktemplate_wb; ctx_src_template = &srctemplate_wb; caps = gst_caps_from_string (SRC_CAPS_WB); g_assert (caps); ctx_input_caps = caps; srunner_run_all (sr, CK_NORMAL); nf += srunner_ntests_failed (sr); srunner_free (sr); gst_caps_unref (caps); return nf; } gst-plugins-good-0.10.31/tests/check/elements/sunaudio.c0000644000175000017500000000551311671175354020043 00000000000000/* GStreamer unit tests for the sun audio elements * * Copyright (C) 2007 Tim-Philipp Müller * * 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 #include #include #include GST_START_TEST (test_sun_audio_mixer_track) { GstStateChangeReturn state_ret; GstElement *mixer; GList *tracks, *l; mixer = gst_element_factory_make ("sunaudiomixer", "sunaudiomixer"); fail_unless (mixer != NULL, "Failed to create 'sunaudiomixer' element!"); state_ret = gst_element_set_state (mixer, GST_STATE_READY); if (state_ret != GST_STATE_CHANGE_SUCCESS) { gst_object_unref (mixer); return; } GST_LOG ("opened sunaudiomixer"); fail_unless (GST_IS_MIXER (mixer), "is not a GstMixer?!"); tracks = (GList *) gst_mixer_list_tracks (GST_MIXER (mixer)); for (l = tracks; l != NULL; l = l->next) { GObjectClass *klass; GstMixerTrack *track; gchar *ulabel = NULL, *label = NULL; track = GST_MIXER_TRACK (l->data); g_object_get (track, "label", &label, NULL); fail_unless (label == NULL || g_utf8_validate (label, -1, NULL)); /* FIXME: remove this check once we depend on -base >= 0.10.12.1 */ klass = G_OBJECT_GET_CLASS (track); if (g_object_class_find_property (klass, "untranslated-label")) { g_object_get (track, "untranslated-label", &ulabel, NULL); } if (ulabel != NULL) { gchar *p; for (p = ulabel; p != NULL && *p != '\0'; ++p) { fail_unless (g_ascii_isprint (*p), "untranslated label '%s' not printable ASCII", ulabel); } } GST_DEBUG ("%s: %s", GST_STR_NULL (ulabel), GST_STR_NULL (label)); g_free (label); g_free (ulabel); } fail_unless_equals_int (gst_element_set_state (mixer, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); gst_object_unref (mixer); } GST_END_TEST; static Suite * sunaudio_suite (void) { Suite *s = suite_create ("sunaudio"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_sun_audio_mixer_track); return s; } GST_CHECK_MAIN (sunaudio) gst-plugins-good-0.10.31/tests/check/elements/rgvolume.c0000644000175000017500000004547411677341661020070 00000000000000/* GStreamer ReplayGain volume adjustment * * Copyright (C) 2007 Rene Stadler * * rgvolume.c: Unit test for the rgvolume element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include GList *events = NULL; /* For ease of programming we use globals to keep refs for our floating src and * sink pads we create; otherwise we always have to do get_pad, get_peer, and * then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; #define RG_VOLUME_CAPS_TEMPLATE_STRING \ "audio/x-raw-float, " \ "width = (int) 32, " \ "endianness = (int) BYTE_ORDER, " \ "channels = (int) [ 1, MAX ], " \ "rate = (int) [ 1, MAX ]" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (RG_VOLUME_CAPS_TEMPLATE_STRING) ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (RG_VOLUME_CAPS_TEMPLATE_STRING) ); static GstBuffer *test_buffer_new (gfloat value); /* gstcheck sets up a chain function that appends buffers to a global list. * This is our equivalent of that for event handling. */ static gboolean event_func (GstPad * pad, GstEvent * event) { events = g_list_append (events, event); return TRUE; } static GstElement * setup_rgvolume (void) { GstElement *element; GST_DEBUG ("setup_rgvolume"); element = gst_check_setup_element ("rgvolume"); mysrcpad = gst_check_setup_src_pad (element, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate, NULL); /* Capture events, to test tag filtering behavior: */ gst_pad_set_event_function (mysinkpad, event_func); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return element; } static void send_newsegment_and_empty_buffer (void) { GstBuffer *buf; GstEvent *ev; fail_unless (g_list_length (events) == 0); ev = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0); fail_unless (gst_pad_push_event (mysrcpad, ev), "Pushing newsegment event failed"); buf = test_buffer_new (0.0); GST_BUFFER_SIZE (buf) = 0; GST_BUFFER_DURATION (buf) = 0; GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET (buf); fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK); fail_unless (g_list_length (events) == 1); fail_unless (events->data == ev); gst_mini_object_unref ((GstMiniObject *) events->data); events = g_list_remove (events, ev); fail_unless (g_list_length (buffers) == 1); fail_unless (buffers->data == buf); gst_mini_object_unref ((GstMiniObject *) buffers->data); buffers = g_list_remove (buffers, buf); } static void cleanup_rgvolume (GstElement * element) { GST_DEBUG ("cleanup_rgvolume"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; g_list_foreach (events, (GFunc) gst_mini_object_unref, NULL); g_list_free (events); events = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (element); gst_check_teardown_sink_pad (element); gst_check_teardown_element (element); } static void set_playing_state (GstElement * element) { fail_unless (gst_element_set_state (element, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "Could not set state to PLAYING"); } static void set_null_state (GstElement * element) { fail_unless (gst_element_set_state (element, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "Could not set state to NULL"); } static void send_eos_event (GstElement * element) { GstEvent *event = gst_event_new_eos (); fail_unless (g_list_length (events) == 0); fail_unless (gst_pad_push_event (mysrcpad, event), "Pushing EOS event failed"); fail_unless (g_list_length (events) == 1); fail_unless (events->data == event); gst_mini_object_unref ((GstMiniObject *) events->data); events = g_list_remove (events, event); } static GstEvent * send_tag_event (GstElement * element, GstEvent * event) { g_return_val_if_fail (event->type == GST_EVENT_TAG, NULL); fail_unless (g_list_length (events) == 0); fail_unless (gst_pad_push_event (mysrcpad, event), "Pushing tag event failed"); if (g_list_length (events) == 0) { /* Event got filtered out. */ event = NULL; } else { GstTagList *tag_list; gdouble dummy; event = events->data; events = g_list_remove (events, event); fail_unless (event->type == GST_EVENT_TAG); gst_event_parse_tag (event, &tag_list); /* The element is supposed to filter out ReplayGain related tags. */ fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &dummy), "tag event still contains track gain tag"); fail_if (gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &dummy), "tag event still contains track peak tag"); fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &dummy), "tag event still contains album gain tag"); fail_if (gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &dummy), "tag event still contains album peak tag"); } return event; } static GstBuffer * test_buffer_new (gfloat value) { GstBuffer *buf; GstCaps *caps; gfloat *data; gint i; buf = gst_buffer_new_and_alloc (8 * sizeof (gfloat)); data = (gfloat *) GST_BUFFER_DATA (buf); for (i = 0; i < 8; i++) data[i] = value; caps = gst_caps_from_string ("audio/x-raw-float, " "rate = 8000, channels = 1, endianness = BYTE_ORDER, width = 32"); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (buf, "buf", 1); return buf; } #define MATCH_GAIN(g1, g2) ((g1 < g2 + 1e-6) && (g2 < g1 + 1e-6)) static void fail_unless_target_gain (GstElement * element, gdouble expected_gain) { gdouble prop_gain; g_object_get (element, "target-gain", &prop_gain, NULL); fail_unless (MATCH_GAIN (prop_gain, expected_gain), "Target gain is %.2f dB, expected %.2f dB", prop_gain, expected_gain); } static void fail_unless_result_gain (GstElement * element, gdouble expected_gain) { GstBuffer *input_buf, *output_buf; gfloat input_sample, output_sample; gdouble gain, prop_gain; gboolean is_passthrough, expect_passthrough; gint i; fail_unless (g_list_length (buffers) == 0); input_sample = 1.0; input_buf = test_buffer_new (input_sample); /* We keep an extra reference to detect passthrough mode. */ gst_buffer_ref (input_buf); /* Pushing steals a reference. */ fail_unless (gst_pad_push (mysrcpad, input_buf) == GST_FLOW_OK); gst_buffer_unref (input_buf); /* The output buffer ends up on the global buffer list. */ fail_unless (g_list_length (buffers) == 1); output_buf = buffers->data; fail_if (output_buf == NULL); buffers = g_list_remove (buffers, output_buf); ASSERT_BUFFER_REFCOUNT (output_buf, "output_buf", 1); fail_unless_equals_int (GST_BUFFER_SIZE (output_buf), 8 * sizeof (gfloat)); output_sample = *((gfloat *) GST_BUFFER_DATA (output_buf)); fail_if (output_sample == 0.0, "First output sample is zero"); for (i = 1; i < 8; i++) { gfloat output = ((gfloat *) GST_BUFFER_DATA (output_buf))[i]; fail_unless (output_sample == output, "Output samples not uniform"); }; gain = 20. * log10 (output_sample / input_sample); fail_unless (MATCH_GAIN (gain, expected_gain), "Applied gain is %.2f dB, expected %.2f dB", gain, expected_gain); g_object_get (element, "result-gain", &prop_gain, NULL); fail_unless (MATCH_GAIN (prop_gain, expected_gain), "Result gain is %.2f dB, expected %.2f dB", prop_gain, expected_gain); is_passthrough = (output_buf == input_buf); expect_passthrough = MATCH_GAIN (expected_gain, +0.00); fail_unless (is_passthrough == expect_passthrough, expect_passthrough ? "Expected operation in passthrough mode" : "Incorrect passthrough behaviour"); gst_buffer_unref (output_buf); } static void fail_unless_gain (GstElement * element, gdouble expected_gain) { fail_unless_target_gain (element, expected_gain); fail_unless_result_gain (element, expected_gain); } /* Start of tests. */ GST_START_TEST (test_no_buffer) { GstElement *element = setup_rgvolume (); set_playing_state (element); set_null_state (element); set_playing_state (element); send_eos_event (element); cleanup_rgvolume (element); } GST_END_TEST; GST_START_TEST (test_events) { GstElement *element = setup_rgvolume (); GstEvent *event; GstEvent *new_event; GstTagList *tag_list; gchar *artist; set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, +4.95, GST_TAG_TRACK_PEAK, 0.59463, GST_TAG_ALBUM_GAIN, -1.54, GST_TAG_ALBUM_PEAK, 0.693415, GST_TAG_ARTIST, "Foobar", NULL); event = gst_event_new_tag (tag_list); new_event = send_tag_event (element, event); /* Expect the element to modify the writable event. */ fail_unless (event == new_event, "Writable tag event not reused"); gst_event_parse_tag (new_event, &tag_list); fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &artist)); fail_unless (g_str_equal (artist, "Foobar")); g_free (artist); gst_event_unref (new_event); /* Same as above, but with a non-writable event. */ tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, +4.95, GST_TAG_TRACK_PEAK, 0.59463, GST_TAG_ALBUM_GAIN, -1.54, GST_TAG_ALBUM_PEAK, 0.693415, GST_TAG_ARTIST, "Foobar", NULL); event = gst_event_new_tag (tag_list); /* Holding an extra ref makes the event unwritable: */ gst_event_ref (event); new_event = send_tag_event (element, event); fail_unless (event != new_event, "Unwritable tag event reused"); gst_event_parse_tag (new_event, &tag_list); fail_unless (gst_tag_list_get_string (tag_list, GST_TAG_ARTIST, &artist)); fail_unless (g_str_equal (artist, "Foobar")); g_free (artist); gst_event_unref (event); gst_event_unref (new_event); cleanup_rgvolume (element); } GST_END_TEST; GST_START_TEST (test_simple) { GstElement *element = setup_rgvolume (); GstTagList *tag_list; g_object_set (element, "album-mode", FALSE, "headroom", +0.00, "pre-amp", -6.00, "fallback-gain", +1.23, NULL); set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, -3.45, GST_TAG_TRACK_PEAK, 1.0, GST_TAG_ALBUM_GAIN, +2.09, GST_TAG_ALBUM_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_gain (element, -9.45); /* pre-amp + track gain */ send_eos_event (element); g_object_set (element, "album-mode", TRUE, NULL); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, -3.45, GST_TAG_TRACK_PEAK, 1.0, GST_TAG_ALBUM_GAIN, +2.09, GST_TAG_ALBUM_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_gain (element, -3.91); /* pre-amp + album gain */ /* Switching back to track mode in the middle of a stream: */ g_object_set (element, "album-mode", FALSE, NULL); fail_unless_gain (element, -9.45); /* pre-amp + track gain */ send_eos_event (element); cleanup_rgvolume (element); } GST_END_TEST; /* If there are no gain tags at all, the fallback gain is used. */ GST_START_TEST (test_fallback_gain) { GstElement *element = setup_rgvolume (); GstTagList *tag_list; /* First some track where fallback does _not_ apply. */ g_object_set (element, "album-mode", FALSE, "headroom", 10.00, "pre-amp", -6.00, "fallback-gain", -3.00, NULL); set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, +3.5, GST_TAG_TRACK_PEAK, 1.0, GST_TAG_ALBUM_GAIN, -0.5, GST_TAG_ALBUM_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_gain (element, -2.50); /* pre-amp + track gain */ send_eos_event (element); /* Now a track completely missing tags. */ fail_unless_gain (element, -9.00); /* pre-amp + fallback-gain */ /* Changing the fallback gain in the middle of a stream, going to pass-through * mode: */ g_object_set (element, "fallback-gain", +6.00, NULL); fail_unless_gain (element, +0.00); /* pre-amp + fallback-gain */ send_eos_event (element); /* Verify that result gain is set to +0.00 with pre-amp + fallback-gain > * +0.00 and no headroom. */ g_object_set (element, "fallback-gain", +12.00, "headroom", +0.00, NULL); fail_unless_target_gain (element, +6.00); /* pre-amp + fallback-gain */ fail_unless_result_gain (element, +0.00); send_eos_event (element); cleanup_rgvolume (element); } GST_END_TEST; /* If album gain is to be preferred but not available, the track gain is to be * taken instead. */ GST_START_TEST (test_fallback_track) { GstElement *element = setup_rgvolume (); GstTagList *tag_list; g_object_set (element, "album-mode", TRUE, "headroom", +0.00, "pre-amp", -6.00, "fallback-gain", +1.23, NULL); set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, +2.11, GST_TAG_TRACK_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_gain (element, -3.89); /* pre-amp + track gain */ send_eos_event (element); cleanup_rgvolume (element); } GST_END_TEST; /* If track gain is to be preferred but not available, the album gain is to be * taken instead. */ GST_START_TEST (test_fallback_album) { GstElement *element = setup_rgvolume (); GstTagList *tag_list; g_object_set (element, "album-mode", FALSE, "headroom", +0.00, "pre-amp", -6.00, "fallback-gain", +1.23, NULL); set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_ALBUM_GAIN, +3.73, GST_TAG_ALBUM_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_gain (element, -2.27); /* pre-amp + album gain */ send_eos_event (element); cleanup_rgvolume (element); } GST_END_TEST; GST_START_TEST (test_headroom) { GstElement *element = setup_rgvolume (); GstTagList *tag_list; g_object_set (element, "album-mode", FALSE, "headroom", +0.00, "pre-amp", +0.00, "fallback-gain", +1.23, NULL); set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, +3.50, GST_TAG_TRACK_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_target_gain (element, +3.50); /* pre-amp + track gain */ fail_unless_result_gain (element, +0.00); send_eos_event (element); g_object_set (element, "headroom", +2.00, NULL); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, +9.18, GST_TAG_TRACK_PEAK, 0.687149, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_target_gain (element, +9.18); /* pre-amp + track gain */ /* Result is 20. * log10 (1. / peak) + headroom. */ fail_unless_result_gain (element, 5.2589816238303335); send_eos_event (element); g_object_set (element, "album-mode", TRUE, NULL); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_ALBUM_GAIN, +5.50, GST_TAG_ALBUM_PEAK, 1.0, NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_target_gain (element, +5.50); /* pre-amp + album gain */ fail_unless_result_gain (element, +2.00); /* headroom */ send_eos_event (element); cleanup_rgvolume (element); } GST_END_TEST; GST_START_TEST (test_reference_level) { GstElement *element = setup_rgvolume (); GstTagList *tag_list; g_object_set (element, "album-mode", FALSE, "headroom", +0.00, "pre-amp", +0.00, "fallback-gain", +1.23, NULL); set_playing_state (element); send_newsegment_and_empty_buffer (); tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, 0.00, GST_TAG_TRACK_PEAK, 0.2, GST_TAG_REFERENCE_LEVEL, 83., NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); /* Because our authorative reference is 89 dB, we bump it up by +6 dB. */ fail_unless_gain (element, +6.00); /* pre-amp + track gain */ send_eos_event (element); g_object_set (element, "album-mode", TRUE, NULL); /* Same as above, but with album gain. */ tag_list = gst_tag_list_new (); gst_tag_list_add (tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, 1.23, GST_TAG_TRACK_PEAK, 0.1, GST_TAG_ALBUM_GAIN, 0.00, GST_TAG_ALBUM_PEAK, 0.2, GST_TAG_REFERENCE_LEVEL, 83., NULL); fail_unless (send_tag_event (element, gst_event_new_tag (tag_list)) == NULL); fail_unless_gain (element, +6.00); /* pre-amp + album gain */ cleanup_rgvolume (element); } GST_END_TEST; static Suite * rgvolume_suite (void) { Suite *s = suite_create ("rgvolume"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_no_buffer); tcase_add_test (tc_chain, test_events); tcase_add_test (tc_chain, test_simple); tcase_add_test (tc_chain, test_fallback_gain); tcase_add_test (tc_chain, test_fallback_track); tcase_add_test (tc_chain, test_fallback_album); tcase_add_test (tc_chain, test_headroom); tcase_add_test (tc_chain, test_reference_level); return s; } int main (int argc, char **argv) { gint nf; Suite *s = rgvolume_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_ENV); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/matroskaparse.c0000644000175000017500000000732011677341661021070 00000000000000/* GStreamer unit tests for matroskaparse * Copyright (C) 2011 Tim-Philipp Müller * * 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 #include static void run_check_for_file (const gchar * file_name, gboolean push_mode) { GstStateChangeReturn state_ret; GstMessage *msg; GstElement *src, *sep, *sink, *matroskaparse, *pipeline; GstBus *bus; gchar *path; pipeline = gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL, "Failed to create pipeline!"); bus = gst_element_get_bus (pipeline); src = gst_element_factory_make ("filesrc", "filesrc"); fail_unless (src != NULL, "Failed to create 'filesrc' element!"); if (push_mode) { sep = gst_element_factory_make ("queue", "queue"); fail_unless (sep != NULL, "Failed to create 'queue' element"); } else { sep = gst_element_factory_make ("identity", "identity"); fail_unless (sep != NULL, "Failed to create 'identity' element"); } matroskaparse = gst_element_factory_make ("matroskaparse", "matroskaparse"); fail_unless (matroskaparse != NULL, "Failed to create matroskaparse element"); sink = gst_element_factory_make ("fakesink", "fakesink"); fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); gst_bin_add_many (GST_BIN (pipeline), src, sep, matroskaparse, sink, NULL); fail_unless (gst_element_link (src, sep)); fail_unless (gst_element_link (sep, matroskaparse)); fail_unless (gst_element_link (matroskaparse, sink)); path = g_build_filename (GST_TEST_FILES_PATH, file_name, NULL); GST_LOG ("reading file '%s'", path); g_object_set (src, "location", path, NULL); state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); if (state_ret == GST_STATE_CHANGE_ASYNC) { GST_LOG ("waiting for pipeline to reach PAUSED state"); state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); } GST_LOG ("PAUSED, let's play a little.."); state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); msg = gst_bus_poll (bus, GST_MESSAGE_EOS, -1); fail_unless (msg != NULL, "Expected EOS message on bus! (%s)", file_name); gst_message_unref (msg); gst_object_unref (bus); fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); gst_object_unref (pipeline); g_free (path); } GST_START_TEST (test_parse_file_pull) { run_check_for_file ("pinknoise-vorbis.mkv", TRUE); } GST_END_TEST; GST_START_TEST (test_parse_file_push) { run_check_for_file ("pinknoise-vorbis.mkv", FALSE); } GST_END_TEST; static Suite * matroskaparse_suite (void) { Suite *s = suite_create ("matroskaparse"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_parse_file_pull); tcase_add_test (tc_chain, test_parse_file_push); return s; } GST_CHECK_MAIN (matroskaparse) gst-plugins-good-0.10.31/tests/check/elements/rtpjitterbuffer.c0000644000175000017500000002432411671175354021436 00000000000000/* GStreamer * * Copyright (C) 2009 Nokia Corporation and its subsidary(-ies) * contact: * * 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 /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; /* we also have a list of src buffers */ static GList *inbuffers = NULL; static gint num_dropped = 0; #define RTP_CAPS_STRING \ "application/x-rtp, " \ "media = (string)audio, " \ "payload = (int) 0, " \ "clock-rate = (int) 8000, " \ "encoding-name = (string)PCMU" #define RTP_FRAME_SIZE 20 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "clock-rate = (int) [ 1, 2147483647 ]") ); static void buffer_dropped (gpointer mem) { if (mem) { GST_DEBUG ("dropping buffer: data=%p", mem); g_free (mem); num_dropped++; } } static GstElement * setup_jitterbuffer (gint num_buffers) { GstElement *jitterbuffer; GstClock *clock; GstBuffer *buffer; GstCaps *caps; /* a 20 sample audio block (2,5 ms) generated with * gst-launch audiotestsrc wave=silence blocksize=40 num-buffers=3 ! * "audio/x-raw-int,channels=1,rate=8000" ! mulawenc ! rtppcmupay ! * fakesink dump=1 */ guint8 in[] = { /* first 4 bytes are rtp-header, next 4 bytes are timestamp */ 0x80, 0x80, 0x1c, 0x24, 0x46, 0xcd, 0xb7, 0x11, 0x3c, 0x3a, 0x7c, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; GstClockTime ts = G_GUINT64_CONSTANT (0); GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); /*guint latency = GST_TIME_AS_MSECONDS (num_buffers * tso); */ gint i; GST_DEBUG ("setup_jitterbuffer"); jitterbuffer = gst_check_setup_element ("gstrtpjitterbuffer"); /* we need a clock here */ clock = gst_system_clock_obtain (); gst_element_set_clock (jitterbuffer, clock); gst_object_unref (clock); /* setup latency */ /* latency would be 7 for 3 buffers here, default is 200 g_object_set (G_OBJECT (jitterbuffer), "latency", latency, NULL); GST_INFO_OBJECT (jitterbuffer, "set latency to %u ms", latency); */ mysrcpad = gst_check_setup_src_pad (jitterbuffer, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (jitterbuffer, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); /* create n buffers */ caps = gst_caps_from_string (RTP_CAPS_STRING); for (i = 0; i < num_buffers; i++) { buffer = gst_buffer_new_and_alloc (sizeof (in)); memcpy (GST_BUFFER_DATA (buffer), in, sizeof (in)); gst_buffer_set_caps (buffer, caps); GST_BUFFER_TIMESTAMP (buffer) = ts; GST_BUFFER_DURATION (buffer) = tso; GST_BUFFER_FREE_FUNC (buffer) = buffer_dropped; GST_DEBUG ("created buffer: %p, data=%p", buffer, GST_BUFFER_DATA (buffer)); if (!i) GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); inbuffers = g_list_append (inbuffers, buffer); /* hackish way to update the rtp header */ in[1] = 0x00; in[3]++; /* seqnumber */ in[7] += RTP_FRAME_SIZE; /* inc. timestamp with framesize */ ts += tso; } gst_caps_unref (caps); num_dropped = 0; return jitterbuffer; } static GstStateChangeReturn start_jitterbuffer (GstElement * jitterbuffer) { GstStateChangeReturn ret; GstClockTime now; GstClock *clock; clock = gst_element_get_clock (jitterbuffer); now = gst_clock_get_time (clock); gst_object_unref (clock); gst_element_set_base_time (jitterbuffer, now); ret = gst_element_set_state (jitterbuffer, GST_STATE_PLAYING); return ret; } static void cleanup_jitterbuffer (GstElement * jitterbuffer) { GST_DEBUG ("cleanup_jitterbuffer"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; g_list_free (inbuffers); inbuffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (jitterbuffer); gst_check_teardown_sink_pad (jitterbuffer); gst_check_teardown_element (jitterbuffer); } static void check_jitterbuffer_results (GstElement * jitterbuffer, gint num_buffers) { GstBuffer *buffer; GList *node; GstClockTime ts = G_GUINT64_CONSTANT (0); GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); guint8 *data; guint16 prev_sn = 0, cur_sn; guint32 prev_ts = 0, cur_ts; /* sleep for twice the latency */ g_usleep (400 * 1000); GST_INFO ("of %d buffer %d/%d received/dropped", num_buffers, g_list_length (buffers), num_dropped); /* if this fails, not all buffers have been processed */ fail_unless_equals_int ((g_list_length (buffers) + num_dropped), num_buffers); /* check the buffer list */ fail_unless_equals_int (g_list_length (buffers), num_buffers); for (node = buffers; node; node = g_list_next (node)) { fail_if ((buffer = (GstBuffer *) node->data) == NULL); fail_if (GST_BUFFER_TIMESTAMP (buffer) != ts); data = GST_BUFFER_DATA (buffer); cur_sn = ((guint16) data[2] << 8) | data[3]; cur_ts = ((guint32) data[4] << 24) | ((guint32) data[5] << 16) | ((guint32) data[6] << 8) | data[7]; if (node != buffers) { fail_unless (cur_sn > prev_sn); fail_unless (cur_ts > prev_ts); prev_sn = cur_sn; prev_ts = cur_ts; } ts += tso; } } GST_START_TEST (test_push_forward_seq) { GstElement *jitterbuffer; const guint num_buffers = 3; GstBuffer *buffer; GList *node; jitterbuffer = setup_jitterbuffer (num_buffers); fail_unless (start_jitterbuffer (jitterbuffer) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* push buffers: 0,1,2, */ for (node = inbuffers; node; node = g_list_next (node)) { buffer = (GstBuffer *) node->data; fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); } /* check the buffer list */ check_jitterbuffer_results (jitterbuffer, num_buffers); /* cleanup */ cleanup_jitterbuffer (jitterbuffer); } GST_END_TEST; GST_START_TEST (test_push_backward_seq) { GstElement *jitterbuffer; const guint num_buffers = 4; GstBuffer *buffer; GList *node; jitterbuffer = setup_jitterbuffer (num_buffers); fail_unless (start_jitterbuffer (jitterbuffer) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* push buffers: 0,3,2,1 */ buffer = (GstBuffer *) inbuffers->data; fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); for (node = g_list_last (inbuffers); node != inbuffers; node = g_list_previous (node)) { buffer = (GstBuffer *) node->data; fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); } /* check the buffer list */ check_jitterbuffer_results (jitterbuffer, num_buffers); /* cleanup */ cleanup_jitterbuffer (jitterbuffer); } GST_END_TEST; GST_START_TEST (test_push_unordered) { GstElement *jitterbuffer; const guint num_buffers = 4; GstBuffer *buffer; jitterbuffer = setup_jitterbuffer (num_buffers); fail_unless (start_jitterbuffer (jitterbuffer) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* push buffers; 0,2,1,3 */ buffer = (GstBuffer *) inbuffers->data; fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); buffer = g_list_nth_data (inbuffers, 2); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); buffer = g_list_nth_data (inbuffers, 1); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); buffer = g_list_nth_data (inbuffers, 3); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); /* check the buffer list */ check_jitterbuffer_results (jitterbuffer, num_buffers); /* cleanup */ cleanup_jitterbuffer (jitterbuffer); } GST_END_TEST; GST_START_TEST (test_basetime) { GstElement *jitterbuffer; const guint num_buffers = 3; GstBuffer *buffer; GList *node; GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); jitterbuffer = setup_jitterbuffer (num_buffers); fail_unless (start_jitterbuffer (jitterbuffer) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* push buffers: 2,1,0 */ for (node = g_list_last (inbuffers); node; node = g_list_previous (node)) { buffer = (GstBuffer *) node->data; fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); } /* sleep for twice the latency */ g_usleep (400 * 1000); /* if this fails, not all buffers have been processed */ fail_unless_equals_int ((g_list_length (buffers) + num_dropped), num_buffers); buffer = (GstBuffer *) buffers->data; fail_unless (GST_BUFFER_TIMESTAMP (buffer) != (num_buffers * tso)); /* cleanup */ cleanup_jitterbuffer (jitterbuffer); } GST_END_TEST; static Suite * rtpjitterbuffer_suite (void) { Suite *s = suite_create ("rtpjitterbuffer"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_push_forward_seq); tcase_add_test (tc_chain, test_push_backward_seq); tcase_add_test (tc_chain, test_push_unordered); tcase_add_test (tc_chain, test_basetime); /* FIXME: test buffer lists */ return s; } GST_CHECK_MAIN (rtpjitterbuffer); gst-plugins-good-0.10.31/tests/check/elements/multifile.c0000644000175000017500000001665011677341661020214 00000000000000/* GStreamer unit test for multifile plugin * * Copyright (C) 2007 David A. Schleef * * 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 #include #include #include #include #include static void run_pipeline (GstElement * pipeline) { gst_element_set_state (pipeline, GST_STATE_PAUSED); gst_element_get_state (pipeline, NULL, NULL, -1); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* FIXME too lazy */ g_usleep (1000000); gst_element_set_state (pipeline, GST_STATE_NULL); } #if !GLIB_CHECK_VERSION(2,30,0) static gchar * g_mkdtemp (gchar * template) { gchar *tmpdir; tmpdir = mkdtemp (template); if (tmpdir == NULL) { g_free (template); } return tmpdir; } #endif GST_START_TEST (test_multifilesink_key_frame) { GstElement *pipeline; GstElement *mfs; int i; const gchar *tmpdir; gchar *my_tmpdir; gchar *template; gchar *mfs_pattern; tmpdir = g_get_tmp_dir (); template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); my_tmpdir = g_mkdtemp (template); fail_if (my_tmpdir == NULL); pipeline = gst_parse_launch ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink name=mfs", NULL); fail_if (pipeline == NULL); mfs = gst_bin_get_by_name (GST_BIN (pipeline), "mfs"); fail_if (mfs == NULL); mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL); g_object_unref (mfs); run_pipeline (pipeline); gst_object_unref (pipeline); for (i = 0; i < 10; i++) { char *s; s = g_strdup_printf (mfs_pattern, i); fail_if (g_remove (s) != 0); g_free (s); } fail_if (g_remove (my_tmpdir) != 0); g_free (mfs_pattern); g_free (my_tmpdir); } GST_END_TEST; GST_START_TEST (test_multifilesink_max_files) { GstElement *pipeline; GstElement *mfs; int i; const gchar *tmpdir; gchar *my_tmpdir; gchar *template; gchar *mfs_pattern; tmpdir = g_get_tmp_dir (); template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); my_tmpdir = g_mkdtemp (template); fail_if (my_tmpdir == NULL); pipeline = gst_parse_launch ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink name=mfs", NULL); fail_if (pipeline == NULL); mfs = gst_bin_get_by_name (GST_BIN (pipeline), "mfs"); fail_if (mfs == NULL); mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); g_object_set (G_OBJECT (mfs), "location", mfs_pattern, "max-files", 3, NULL); g_object_unref (mfs); run_pipeline (pipeline); gst_object_unref (pipeline); for (i = 0; i < 7; i++) { char *s; s = g_strdup_printf (mfs_pattern, i); fail_unless (g_remove (s) != 0); g_free (s); } for (i = 7; i < 10; i++) { char *s; s = g_strdup_printf (mfs_pattern, i); fail_if (g_remove (s) != 0); g_free (s); } fail_if (g_remove (my_tmpdir) != 0); g_free (mfs_pattern); g_free (my_tmpdir); } GST_END_TEST; GST_START_TEST (test_multifilesink_key_unit) { GstElement *mfs; int i; const gchar *tmpdir; gchar *my_tmpdir; gchar *template; gchar *mfs_pattern; GstBuffer *buf; GstPad *sink; tmpdir = g_get_tmp_dir (); template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); my_tmpdir = g_mkdtemp (template); fail_if (my_tmpdir == NULL); mfs = gst_element_factory_make ("multifilesink", NULL); fail_if (mfs == NULL); mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); g_object_set (G_OBJECT (mfs), "location", mfs_pattern, "next-file", 3, NULL); fail_if (gst_element_set_state (mfs, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); sink = gst_element_get_static_pad (mfs, "sink"); buf = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (buf), "foo", 4); fail_if (gst_pad_chain (sink, gst_buffer_ref (buf)) != GST_FLOW_OK); memcpy (GST_BUFFER_DATA (buf), "bar", 4); fail_if (gst_pad_chain (sink, gst_buffer_ref (buf)) != GST_FLOW_OK); fail_unless (gst_pad_send_event (sink, gst_video_event_new_downstream_force_key_unit (GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE, TRUE, 1))); memcpy (GST_BUFFER_DATA (buf), "baz", 4); fail_if (gst_pad_chain (sink, buf) != GST_FLOW_OK); fail_if (gst_element_set_state (mfs, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE); for (i = 0; i < 2; i++) { char *s; s = g_strdup_printf (mfs_pattern, i); fail_if (g_remove (s) != 0); g_free (s); } fail_if (g_remove (my_tmpdir) != 0); g_free (mfs_pattern); g_free (my_tmpdir); gst_object_unref (sink); gst_object_unref (mfs); } GST_END_TEST; GST_START_TEST (test_multifilesrc) { GstElement *pipeline; GstElement *mfs; int i; const gchar *tmpdir; gchar *my_tmpdir; gchar *template; gchar *mfs_pattern; tmpdir = g_get_tmp_dir (); template = g_build_filename (tmpdir, "multifile-test-XXXXXX", NULL); my_tmpdir = g_mkdtemp (template); fail_if (my_tmpdir == NULL); pipeline = gst_parse_launch ("videotestsrc num-buffers=10 ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! multifilesink name=mfs", NULL); fail_if (pipeline == NULL); mfs = gst_bin_get_by_name (GST_BIN (pipeline), "mfs"); fail_if (mfs == NULL); mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL); g_free (mfs_pattern); g_object_unref (mfs); run_pipeline (pipeline); gst_object_unref (pipeline); pipeline = gst_parse_launch ("multifilesrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=10/1 ! fakesink", NULL); fail_if (pipeline == NULL); mfs = gst_bin_get_by_name (GST_BIN (pipeline), "multifilesrc0"); fail_if (mfs == NULL); mfs_pattern = g_build_filename (my_tmpdir, "%05d", NULL); g_object_set (G_OBJECT (mfs), "location", mfs_pattern, NULL); g_object_unref (mfs); run_pipeline (pipeline); gst_object_unref (pipeline); for (i = 0; i < 10; i++) { char *s; s = g_strdup_printf (mfs_pattern, i); fail_if (g_remove (s) != 0); g_free (s); } fail_if (g_remove (my_tmpdir) != 0); g_free (mfs_pattern); g_free (my_tmpdir); } GST_END_TEST; static Suite * libvisual_suite (void) { Suite *s = suite_create ("multifile"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_multifilesink_key_frame); tcase_add_test (tc_chain, test_multifilesink_max_files); tcase_add_test (tc_chain, test_multifilesink_key_unit); tcase_add_test (tc_chain, test_multifilesrc); return s; } GST_CHECK_MAIN (libvisual); gst-plugins-good-0.10.31/tests/check/elements/audioiirfilter.c0000644000175000017500000001122411671175354021223 00000000000000/* GStreamer * * Copyright (C) 2009 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include static gboolean have_eos = FALSE; static gboolean on_message (GstBus * bus, GstMessage * message, gpointer user_data) { GMainLoop *loop = (GMainLoop *) user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: case GST_MESSAGE_WARNING: g_assert_not_reached (); g_main_loop_quit (loop); break; case GST_MESSAGE_EOS: have_eos = TRUE; g_main_loop_quit (loop); break; default: break; } return TRUE; } static void on_rate_changed (GstElement * element, gint rate, gpointer user_data) { GValueArray *va; GValue v = { 0, }; fail_unless (rate > 0); va = g_value_array_new (6); g_value_init (&v, G_TYPE_DOUBLE); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_value_set_double (&v, 1.0); g_value_array_append (va, &v); g_value_reset (&v); g_object_set (G_OBJECT (element), "a", va, NULL); g_value_array_free (va); va = g_value_array_new (6); g_value_set_double (&v, 0.0); g_value_array_append (va, &v); g_value_reset (&v); g_object_set (G_OBJECT (element), "b", va, NULL); g_value_array_free (va); } static gboolean have_data = FALSE; static void on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad, gpointer user_data) { if (!have_data) { gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer); fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble)); fail_unless (data[0] == 0.0); fail_unless (data[1] == 0.0); fail_unless (data[2] == 0.0); fail_unless (data[3] == 0.0); fail_unless (data[4] == 0.0); fail_unless (data[5] != 0.0); have_data = TRUE; } } GST_START_TEST (test_pipeline) { GstElement *pipeline, *src, *filter, *sink; GstBus *bus; GMainLoop *loop; have_data = FALSE; have_eos = FALSE; pipeline = gst_element_factory_make ("pipeline", NULL); fail_unless (pipeline != NULL); src = gst_element_factory_make ("audiotestsrc", NULL); fail_unless (src != NULL); g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL); filter = gst_element_factory_make ("audioiirfilter", NULL); fail_unless (filter != NULL); g_signal_connect (G_OBJECT (filter), "rate-changed", G_CALLBACK (on_rate_changed), NULL); sink = gst_element_factory_make ("fakesink", NULL); fail_unless (sink != NULL); g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL); gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL); fail_unless (gst_element_link_many (src, filter, sink, NULL)); loop = g_main_loop_new (NULL, FALSE); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); fail_if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); g_main_loop_run (loop); fail_unless (have_data); fail_unless (have_eos); fail_unless (gst_element_set_state (pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); g_main_loop_unref (loop); gst_object_unref (pipeline); } GST_END_TEST; static Suite * audioiirfilter_suite (void) { Suite *s = suite_create ("audioiirfilter"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_pipeline); return s; } GST_CHECK_MAIN (audioiirfilter); gst-plugins-good-0.10.31/tests/check/elements/aspectratiocrop.c0000644000175000017500000001617611671175354021425 00000000000000/* GStreamer unit test for the aspectratiocrop element * Copyright (C) 2009 Thijs Vermeir * * 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 #include #include #define ASPECT_RATIO_CROP_CAPS \ GST_VIDEO_CAPS_RGBx ";" \ GST_VIDEO_CAPS_xRGB ";" \ GST_VIDEO_CAPS_BGRx ";" \ GST_VIDEO_CAPS_xBGR ";" \ GST_VIDEO_CAPS_RGBA ";" \ GST_VIDEO_CAPS_ARGB ";" \ GST_VIDEO_CAPS_BGRA ";" \ GST_VIDEO_CAPS_ABGR ";" \ GST_VIDEO_CAPS_RGB ";" \ GST_VIDEO_CAPS_BGR ";" \ GST_VIDEO_CAPS_YUV ("AYUV") ";" \ GST_VIDEO_CAPS_YUV ("YUY2") ";" \ GST_VIDEO_CAPS_YUV ("YVYU") ";" \ GST_VIDEO_CAPS_YUV ("UYVY") ";" \ GST_VIDEO_CAPS_YUV ("Y800") ";" \ GST_VIDEO_CAPS_YUV ("I420") ";" \ GST_VIDEO_CAPS_YUV ("YV12") ";" \ GST_VIDEO_CAPS_RGB_16 ";" \ GST_VIDEO_CAPS_RGB_15 static GstBuffer * make_buffer_with_caps (const gchar * caps_string, int buffer_size) { GstCaps *caps; GstBuffer *temp; caps = gst_caps_from_string (caps_string); temp = gst_buffer_new_and_alloc (buffer_size); fail_if (caps == NULL); fail_if (temp == NULL); gst_buffer_set_caps (temp, caps); gst_caps_unref (caps); return temp; } static void check_aspectratiocrop (const gchar * in_string, const gchar * out_string, gint in_size, gint out_size, gint ar_n, gint ar_d) { GstElement *element; GstPad *pad_peer; GstPad *sink_pad = NULL; GstPad *src_pad; GstBuffer *new; GstBuffer *buffer; GstBuffer *buffer_out; GstCaps *sink_caps; buffer = make_buffer_with_caps (in_string, in_size); buffer_out = make_buffer_with_caps (out_string, out_size); /* check that there are no buffers waiting */ gst_check_drop_buffers (); /* create the element */ element = gst_check_setup_element ("aspectratiocrop"); /* set the requested aspect ratio */ g_object_set (G_OBJECT (element), "aspect-ratio", ar_n, ar_d, NULL); /* create the src pad */ src_pad = gst_pad_new (NULL, GST_PAD_SRC); gst_pad_set_caps (src_pad, GST_BUFFER_CAPS (buffer)); pad_peer = gst_element_get_static_pad (element, "sink"); fail_if (pad_peer == NULL); fail_unless (gst_pad_link (src_pad, pad_peer) == GST_PAD_LINK_OK, "Could not link source and %s sink pads", GST_ELEMENT_NAME (element)); gst_object_unref (pad_peer); gst_pad_set_active (src_pad, TRUE); /* create the sink pad */ pad_peer = gst_element_get_static_pad (element, "src"); sink_caps = gst_caps_from_string (ASPECT_RATIO_CROP_CAPS); sink_pad = gst_pad_new (NULL, GST_PAD_SINK); GST_PAD_CAPS (sink_pad) = sink_caps; fail_unless (gst_pad_link (pad_peer, sink_pad) == GST_PAD_LINK_OK, "Could not link sink and %s source pads", GST_ELEMENT_NAME (element)); gst_object_unref (pad_peer); gst_pad_set_chain_function (sink_pad, gst_check_chain_func); gst_pad_set_active (sink_pad, TRUE); /* configure the sink pad */ fail_unless (gst_element_set_state (element, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); fail_unless (gst_pad_push (src_pad, buffer) == GST_FLOW_OK, "Failed to push buffer"); fail_unless (gst_element_set_state (element, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null"); /* check the result */ fail_unless (g_list_length (buffers) == 1); new = GST_BUFFER (buffers->data); buffers = g_list_remove (buffers, new); fail_unless (GST_BUFFER_SIZE (buffer_out) == GST_BUFFER_SIZE (new), "size of the buffers are not the same"); gst_check_caps_equal (GST_BUFFER_CAPS (buffer_out), GST_BUFFER_CAPS (new)); gst_buffer_unref (new); gst_buffer_unref (buffer_out); /* teardown the element and pads */ gst_pad_set_active (src_pad, FALSE); gst_check_teardown_src_pad (element); gst_pad_set_active (sink_pad, FALSE); gst_check_teardown_sink_pad (element); gst_check_teardown_element (element); } GST_START_TEST (test_no_cropping) { check_aspectratiocrop ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1", "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1", 153600, 153600, 4, 3); check_aspectratiocrop ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)320, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)320, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", 204800, 204800, 4, 3); } GST_END_TEST; GST_START_TEST (test_autocropping) { check_aspectratiocrop ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)240, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)4/3", 153600, 115200, 4, 3); check_aspectratiocrop ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/9", "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)180, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/9", 153600, 86400, 4, 3); check_aspectratiocrop ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/15", "video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)192, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)16/15", 153600, 122880, 16, 9); } GST_END_TEST; static Suite * aspectratiocrop_suite (void) { Suite *s = suite_create ("aspectratiocrop"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_no_cropping); tcase_add_test (tc_chain, test_autocropping); return s; } int main (int argc, char **argv) { int nf; Suite *s = aspectratiocrop_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/audiowsinclimit.c0000644000175000017500000005365511671175354021432 00000000000000/* GStreamer * * Copyright (C) 2007 Sebastian Dröge * * audiowsinclimit.c: Unit test for the audiowsinclimit element * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define AUDIO_WSINC_LIMIT_CAPS_STRING_32 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 32" \ #define AUDIO_WSINC_LIMIT_CAPS_STRING_64 \ "audio/x-raw-float, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64" \ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "width = (int) { 32, 64 } ") ); static GstElement * setup_audiowsinclimit (void) { GstElement *audiowsinclimit; GST_DEBUG ("setup_audiowsinclimit"); audiowsinclimit = gst_check_setup_element ("audiowsinclimit"); mysrcpad = gst_check_setup_src_pad (audiowsinclimit, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (audiowsinclimit, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return audiowsinclimit; } static void cleanup_audiowsinclimit (GstElement * audiowsinclimit) { GST_DEBUG ("cleanup_audiowsinclimit"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (audiowsinclimit); gst_check_teardown_sink_pad (audiowsinclimit); gst_check_teardown_element (audiowsinclimit); } /* Test if data containing only one frequency component * at 0 is preserved with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_32_lp_0hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* cutoff = sampling rate / 4, data = 0 */ g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_32_lp_22050hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.1); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_32_hp_0hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.1); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_32_hp_22050hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gfloat *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gfloat); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if buffers smaller than the kernel size are handled * correctly without accessing wrong memory areas */ GST_START_TEST (test_32_small_buffer) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gfloat *in; gint i; audiowsinclimit = setup_audiowsinclimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 101, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gfloat)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gfloat *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 20; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_32); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is preserved with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_64_lp_0hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* cutoff = sampling rate / 4, data = 0 */ g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is erased with lowpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_64_lp_22050hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.1); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at 0 is erased with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_64_hp_0hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms <= 0.1); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if data containing only one frequency component * at rate/2 is preserved with highpass mode and a cutoff * at rate/4 */ GST_START_TEST (test_64_hp_22050hz) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in, *res, rms; gint i; GList *node; audiowsinclimit = setup_audiowsinclimit (); /* Set to highpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 1, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 21, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (128 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 128; i += 2) { in[i] = 1.0; in[i + 1] = -1.0; } caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); for (node = buffers; node; node = node->next) { gint buffer_length; fail_if ((outbuffer = (GstBuffer *) node->data) == NULL); res = (gdouble *) GST_BUFFER_DATA (outbuffer); buffer_length = GST_BUFFER_SIZE (outbuffer) / sizeof (gdouble); rms = 0.0; for (i = 0; i < buffer_length; i++) rms += res[i] * res[i]; rms = sqrt (rms / buffer_length); fail_unless (rms >= 0.9); } /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; /* Test if buffers smaller than the kernel size are handled * correctly without accessing wrong memory areas */ GST_START_TEST (test_64_small_buffer) { GstElement *audiowsinclimit; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gdouble *in; gint i; audiowsinclimit = setup_audiowsinclimit (); /* Set to lowpass */ g_object_set (G_OBJECT (audiowsinclimit), "mode", 0, NULL); g_object_set (G_OBJECT (audiowsinclimit), "length", 101, NULL); fail_unless (gst_element_set_state (audiowsinclimit, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); g_object_set (G_OBJECT (audiowsinclimit), "cutoff", 44100 / 4.0, NULL); inbuffer = gst_buffer_new_and_alloc (20 * sizeof (gdouble)); GST_BUFFER_TIMESTAMP (inbuffer) = 0; in = (gdouble *) GST_BUFFER_DATA (inbuffer); for (i = 0; i < 20; i++) in[i] = 1.0; caps = gst_caps_from_string (AUDIO_WSINC_LIMIT_CAPS_STRING_64); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); /* ... and puts a new buffer on the global list */ fail_unless (g_list_length (buffers) >= 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); /* cleanup */ cleanup_audiowsinclimit (audiowsinclimit); } GST_END_TEST; static Suite * audiowsinclimit_suite (void) { Suite *s = suite_create ("audiowsinclimit"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_32_lp_0hz); tcase_add_test (tc_chain, test_32_lp_22050hz); tcase_add_test (tc_chain, test_32_hp_0hz); tcase_add_test (tc_chain, test_32_hp_22050hz); tcase_add_test (tc_chain, test_32_small_buffer); tcase_add_test (tc_chain, test_64_lp_0hz); tcase_add_test (tc_chain, test_64_lp_22050hz); tcase_add_test (tc_chain, test_64_hp_0hz); tcase_add_test (tc_chain, test_64_hp_22050hz); tcase_add_test (tc_chain, test_64_small_buffer); return s; } int main (int argc, char **argv) { int nf; Suite *s = audiowsinclimit_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/capssetter.c0000644000175000017500000001477311671175354020401 00000000000000/* GStreamer * * unit test for capssetter * * Copyright (C) <2009> Mark Nauwelaerts * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstElement * setup_capssetter (void) { GstElement *capssetter; GST_DEBUG ("setup_capssetter"); capssetter = gst_check_setup_element ("capssetter"); mysrcpad = gst_check_setup_src_pad (capssetter, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (capssetter, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return capssetter; } static void cleanup_capssetter (GstElement * capssetter) { GST_DEBUG ("cleanup_capssetter"); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (capssetter); gst_check_teardown_sink_pad (capssetter); gst_check_teardown_element (capssetter); } static void push_and_test (GstCaps * prop_caps, gboolean join, gboolean replace, GstCaps * in_caps, GstCaps * out_caps) { GstElement *capssetter; GstBuffer *buffer; capssetter = setup_capssetter (); fail_unless (gst_element_set_state (capssetter, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); buffer = gst_buffer_new_and_alloc (4); ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1); memcpy (GST_BUFFER_DATA (buffer), "data", 4); gst_buffer_set_caps (buffer, in_caps); gst_caps_unref (in_caps); g_object_set (capssetter, "join", join, NULL); g_object_set (capssetter, "replace", replace, NULL); g_object_set (capssetter, "caps", prop_caps, NULL); gst_caps_unref (prop_caps); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK, "Failed pushing buffer to capssetter"); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()) == TRUE); /* ... but it should end up being collected on the global buffer list */ fail_unless (g_list_length (buffers) == 1); buffer = g_list_first (buffers)->data; ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1); fail_unless (gst_caps_is_equal (out_caps, GST_BUFFER_CAPS (buffer))); gst_caps_unref (out_caps); /* cleanup */ cleanup_capssetter (capssetter); } #define SRC_WIDTH 8 #define SRC_HEIGHT 12 static GstCaps * make_src_caps (void) { return gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, SRC_WIDTH, "height", G_TYPE_INT, SRC_HEIGHT, NULL); } /* don't try these caps mutations at home, folks */ GST_START_TEST (test_n_join_n_replace) { GstCaps *in_caps, *prop_caps, *out_caps; in_caps = make_src_caps (); prop_caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); out_caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 2 * SRC_WIDTH, "height", G_TYPE_INT, SRC_HEIGHT, NULL); push_and_test (prop_caps, FALSE, FALSE, in_caps, out_caps); } GST_END_TEST; GST_START_TEST (test_n_join_replace) { GstCaps *in_caps, *prop_caps, *out_caps; in_caps = make_src_caps (); prop_caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); out_caps = gst_caps_copy (prop_caps); push_and_test (prop_caps, FALSE, TRUE, in_caps, out_caps); } GST_END_TEST; GST_START_TEST (test_join_n_replace_n_match) { GstCaps *in_caps, *prop_caps, *out_caps; /* non joining caps */ in_caps = make_src_caps (); prop_caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); out_caps = gst_caps_copy (in_caps); push_and_test (prop_caps, TRUE, FALSE, in_caps, out_caps); } GST_END_TEST; GST_START_TEST (test_join_n_replace_match) { GstCaps *in_caps, *prop_caps, *out_caps; /* joining caps */ in_caps = make_src_caps (); prop_caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); out_caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, 2 * SRC_WIDTH, "height", G_TYPE_INT, SRC_HEIGHT, NULL); push_and_test (prop_caps, TRUE, FALSE, in_caps, out_caps); } GST_END_TEST; GST_START_TEST (test_join_replace_n_match) { GstCaps *in_caps, *prop_caps, *out_caps; /* non joining caps */ in_caps = make_src_caps (); prop_caps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); out_caps = gst_caps_copy (in_caps); push_and_test (prop_caps, TRUE, TRUE, in_caps, out_caps); } GST_END_TEST; GST_START_TEST (test_join_replace_match) { GstCaps *in_caps, *prop_caps, *out_caps; /* joining caps */ in_caps = make_src_caps (); prop_caps = gst_caps_new_simple ("video/x-raw-yuv", "width", G_TYPE_INT, 2 * SRC_WIDTH, NULL); out_caps = gst_caps_copy (prop_caps); push_and_test (prop_caps, TRUE, TRUE, in_caps, out_caps); } GST_END_TEST; static Suite * capssetter_suite (void) { Suite *s = suite_create ("capssetter"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_n_join_n_replace); tcase_add_test (tc_chain, test_n_join_replace); tcase_add_test (tc_chain, test_join_n_replace_n_match); tcase_add_test (tc_chain, test_join_n_replace_match); tcase_add_test (tc_chain, test_join_replace_n_match); tcase_add_test (tc_chain, test_join_replace_match); return s; } GST_CHECK_MAIN (capssetter); gst-plugins-good-0.10.31/tests/check/elements/deinterleave.c0000644000175000017500000003712511671175354020667 00000000000000/* GStreamer unit tests for the interleave element * Copyright (C) 2008 Sebastian Dröge * * 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 #include #include GST_START_TEST (test_create_and_unref) { GstElement *deinterleave; deinterleave = gst_element_factory_make ("deinterleave", NULL); fail_unless (deinterleave != NULL); gst_element_set_state (deinterleave, GST_STATE_NULL); gst_object_unref (deinterleave); } GST_END_TEST; static GstPad *mysrcpad, **mysinkpads; static gint nsinkpads; static GstBus *bus; static GstElement *deinterleave; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, " "channels = (int) 1, " "rate = (int) {32000, 48000}, " "endianness = (int) BYTE_ORDER")); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, " "channels = (int) { 2, 3 }, " "rate = (int) {32000, 48000}, " "endianness = (int) BYTE_ORDER")); #define CAPS_32khz \ "audio/x-raw-float, " \ "width = (int) 32, " \ "channels = (int) 2, " \ "rate = (int) 32000, " \ "endianness = (int) BYTE_ORDER" #define CAPS_48khz \ "audio/x-raw-float, " \ "width = (int) 32, " \ "channels = (int) 2, " \ "rate = (int) 48000, " \ "endianness = (int) BYTE_ORDER" #define CAPS_48khz_3CH \ "audio/x-raw-float, " \ "width = (int) 32, " \ "channels = (int) 3, " \ "rate = (int) 48000, " \ "endianness = (int) BYTE_ORDER" static GstFlowReturn deinterleave_chain_func (GstPad * pad, GstBuffer * buffer) { gint i; gfloat *indata; fail_unless (GST_IS_BUFFER (buffer)); fail_unless_equals_int (GST_BUFFER_SIZE (buffer), 48000 * sizeof (gfloat)); fail_unless (GST_BUFFER_DATA (buffer) != NULL); indata = (gfloat *) GST_BUFFER_DATA (buffer); if (strcmp (GST_PAD_NAME (pad), "sink0") == 0) { for (i = 0; i < 48000; i++) fail_unless_equals_float (indata[i], -1.0); } else if (strcmp (GST_PAD_NAME (pad), "sink1") == 0) { for (i = 0; i < 48000; i++) fail_unless_equals_float (indata[i], 1.0); } else { g_assert_not_reached (); } gst_buffer_unref (buffer); return GST_FLOW_OK; } static void deinterleave_pad_added (GstElement * src, GstPad * pad, gpointer data) { gchar *name; gint link = GPOINTER_TO_INT (data); if (nsinkpads >= link) return; name = g_strdup_printf ("sink%d", nsinkpads); mysinkpads[nsinkpads] = gst_pad_new_from_static_template (&sinktemplate, name); g_free (name); fail_if (mysinkpads[nsinkpads] == NULL); gst_pad_set_chain_function (mysinkpads[nsinkpads], deinterleave_chain_func); fail_unless (gst_pad_link (pad, mysinkpads[nsinkpads]) == GST_PAD_LINK_OK); gst_pad_set_active (mysinkpads[nsinkpads], TRUE); nsinkpads++; } GST_START_TEST (test_2_channels) { GstPad *sinkpad; gint i; GstBuffer *inbuf; GstCaps *caps; gfloat *indata; mysinkpads = g_new0 (GstPad *, 2); nsinkpads = 0; deinterleave = gst_element_factory_make ("deinterleave", NULL); fail_unless (deinterleave != NULL); mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); fail_unless (mysrcpad != NULL); caps = gst_caps_from_string (CAPS_48khz); fail_unless (gst_pad_set_caps (mysrcpad, caps)); gst_pad_use_fixed_caps (mysrcpad); sinkpad = gst_element_get_static_pad (deinterleave, "sink"); fail_unless (sinkpad != NULL); fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK); g_object_unref (sinkpad); g_signal_connect (deinterleave, "pad-added", G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (2)); bus = gst_bus_new (); gst_element_set_bus (deinterleave, bus); fail_unless (gst_element_set_state (deinterleave, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 2 * 48000; i += 2) { indata[i] = -1.0; indata[i + 1] = 1.0; } gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); fail_unless (gst_element_set_state (deinterleave, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); for (i = 0; i < nsinkpads; i++) g_object_unref (mysinkpads[i]); g_free (mysinkpads); mysinkpads = NULL; g_object_unref (deinterleave); g_object_unref (bus); gst_caps_unref (caps); } GST_END_TEST; GST_START_TEST (test_2_channels_1_linked) { GstPad *sinkpad; gint i; GstBuffer *inbuf; GstCaps *caps; gfloat *indata; nsinkpads = 0; mysinkpads = g_new0 (GstPad *, 2); deinterleave = gst_element_factory_make ("deinterleave", NULL); fail_unless (deinterleave != NULL); mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); fail_unless (mysrcpad != NULL); caps = gst_caps_from_string (CAPS_48khz); fail_unless (gst_pad_set_caps (mysrcpad, caps)); gst_pad_use_fixed_caps (mysrcpad); sinkpad = gst_element_get_static_pad (deinterleave, "sink"); fail_unless (sinkpad != NULL); fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK); g_object_unref (sinkpad); g_signal_connect (deinterleave, "pad-added", G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (1)); bus = gst_bus_new (); gst_element_set_bus (deinterleave, bus); fail_unless (gst_element_set_state (deinterleave, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 2 * 48000; i += 2) { indata[i] = -1.0; indata[i + 1] = 1.0; } gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); fail_unless (gst_element_set_state (deinterleave, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); for (i = 0; i < nsinkpads; i++) g_object_unref (mysinkpads[i]); g_free (mysinkpads); mysinkpads = NULL; g_object_unref (deinterleave); g_object_unref (bus); gst_caps_unref (caps); } GST_END_TEST; GST_START_TEST (test_2_channels_caps_change) { GstPad *sinkpad; GstCaps *caps, *caps2; gint i; GstBuffer *inbuf; gfloat *indata; nsinkpads = 0; mysinkpads = g_new0 (GstPad *, 2); deinterleave = gst_element_factory_make ("deinterleave", NULL); fail_unless (deinterleave != NULL); mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src"); fail_unless (mysrcpad != NULL); caps = gst_caps_from_string (CAPS_48khz); fail_unless (gst_pad_set_caps (mysrcpad, caps)); gst_pad_use_fixed_caps (mysrcpad); sinkpad = gst_element_get_static_pad (deinterleave, "sink"); fail_unless (sinkpad != NULL); fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK); g_object_unref (sinkpad); g_signal_connect (deinterleave, "pad-added", G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (2)); bus = gst_bus_new (); gst_element_set_bus (deinterleave, bus); fail_unless (gst_element_set_state (deinterleave, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS); inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 2 * 48000; i += 2) { indata[i] = -1.0; indata[i + 1] = 1.0; } gst_buffer_set_caps (inbuf, caps); fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); caps2 = gst_caps_from_string (CAPS_32khz); gst_pad_set_caps (mysrcpad, caps2); inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 2 * 48000; i += 2) { indata[i] = -1.0; indata[i + 1] = 1.0; } gst_buffer_set_caps (inbuf, caps2); /* Should work fine because the caps changed in a compatible way */ fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); gst_caps_unref (caps2); caps2 = gst_caps_from_string (CAPS_48khz_3CH); gst_pad_set_caps (mysrcpad, caps2); inbuf = gst_buffer_new_and_alloc (3 * 48000 * sizeof (gfloat)); indata = (gfloat *) GST_BUFFER_DATA (inbuf); for (i = 0; i < 3 * 48000; i += 3) { indata[i] = -1.0; indata[i + 1] = 1.0; indata[i + 2] = 0.0; } gst_buffer_set_caps (inbuf, caps2); /* Should break because the caps changed in an incompatible way */ fail_if (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK); fail_unless (gst_element_set_state (deinterleave, GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS); for (i = 0; i < nsinkpads; i++) g_object_unref (mysinkpads[i]); g_free (mysinkpads); mysinkpads = NULL; g_object_unref (deinterleave); g_object_unref (bus); gst_caps_unref (caps); gst_caps_unref (caps2); } GST_END_TEST; #define SAMPLES_PER_BUFFER 10 #define NUM_CHANNELS 8 #define SAMPLE_RATE 44100 static guint pads_created; static void set_channel_positions (GstCaps * caps, int channels, GstAudioChannelPosition * channelpositions) { GValue chanpos = { 0 }; GValue pos = { 0 }; GstStructure *structure = gst_caps_get_structure (caps, 0); int c; 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, channelpositions[c]); gst_value_array_append_value (&chanpos, &pos); } g_value_unset (&pos); gst_structure_set_value (structure, "channel-positions", &chanpos); g_value_unset (&chanpos); } static void src_handoff_float32_8ch (GstElement * src, GstBuffer * buf, GstPad * pad, gpointer user_data) { GstAudioChannelPosition layout[NUM_CHANNELS]; GstCaps *caps; gfloat *data; guint size, i, c; caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, "depth", G_TYPE_INT, 32, "channels", G_TYPE_INT, NUM_CHANNELS, "rate", G_TYPE_INT, SAMPLE_RATE, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); for (i = 0; i < NUM_CHANNELS; ++i) layout[i] = GST_AUDIO_CHANNEL_POSITION_NONE; set_channel_positions (caps, NUM_CHANNELS, layout); size = sizeof (gfloat) * SAMPLES_PER_BUFFER * NUM_CHANNELS; data = (gfloat *) g_malloc (size); GST_BUFFER_MALLOCDATA (buf) = (guint8 *) data; GST_BUFFER_DATA (buf) = (guint8 *) data; GST_BUFFER_SIZE (buf) = size; GST_BUFFER_OFFSET (buf) = 0; GST_BUFFER_TIMESTAMP (buf) = 0; GST_BUFFER_CAPS (buf) = caps; for (i = 0; i < SAMPLES_PER_BUFFER; ++i) { for (c = 0; c < NUM_CHANNELS; ++c) { *data = (gfloat) ((i * NUM_CHANNELS) + c); ++data; } } } static gboolean float_buffer_check_probe (GstPad * pad, GstBuffer * buf, gpointer userdata) { gfloat *data; guint padnum, numpads; guint num, i; GstCaps *caps; GstStructure *s; GstAudioChannelPosition *pos; gint channels; fail_unless_equals_int (sscanf (GST_PAD_NAME (pad), "src%u", &padnum), 1); numpads = pads_created; /* Check caps */ caps = GST_BUFFER_CAPS (buf); fail_unless (caps != NULL); s = gst_caps_get_structure (caps, 0); fail_unless (gst_structure_get_int (s, "channels", &channels)); fail_unless_equals_int (channels, 1); fail_unless (gst_structure_has_field (s, "channel-positions")); pos = gst_audio_get_channel_positions (s); fail_unless (pos != NULL && pos[0] == GST_AUDIO_CHANNEL_POSITION_NONE); g_free (pos); data = (gfloat *) GST_BUFFER_DATA (buf); num = GST_BUFFER_SIZE (buf) / sizeof (gfloat); /* Check buffer content */ for (i = 0; i < num; ++i) { guint val, rest; val = (guint) data[i]; GST_LOG ("%s[%u]: %8f", GST_PAD_NAME (pad), i, data[i]); /* can't use the modulo operator in the assertion statement, since due to * the way it gets expanded it would be interpreted as a printf operator * in the failure case, which will result in segfaults */ rest = val % numpads; /* check that the first channel is on pad src0, the second on src1 etc. */ fail_unless_equals_int (rest, padnum); } return TRUE; /* don't drop data */ } static void pad_added_setup_data_check_float32_8ch_cb (GstElement * deinterleave, GstPad * pad, GstElement * pipeline) { GstElement *queue, *sink; GstPad *sinkpad; queue = gst_element_factory_make ("queue", NULL); fail_unless (queue != NULL); sink = gst_element_factory_make ("fakesink", NULL); fail_unless (sink != NULL); gst_bin_add_many (GST_BIN (pipeline), queue, sink, NULL); fail_unless (gst_element_link_many (queue, sink, NULL)); sinkpad = gst_element_get_static_pad (queue, "sink"); fail_unless_equals_int (gst_pad_link (pad, sinkpad), GST_PAD_LINK_OK); gst_object_unref (sinkpad); gst_pad_add_buffer_probe (pad, G_CALLBACK (float_buffer_check_probe), NULL); gst_element_set_state (sink, GST_STATE_PLAYING); gst_element_set_state (queue, GST_STATE_PLAYING); GST_LOG ("new pad: %s", GST_PAD_NAME (pad)); ++pads_created; } static GstElement * make_fake_src_8chans_float32 (void) { GstElement *src; src = gst_element_factory_make ("fakesrc", "src"); fail_unless (src != NULL, "failed to create fakesrc element"); g_object_set (src, "num-buffers", 1, NULL); g_object_set (src, "signal-handoffs", TRUE, NULL); g_signal_connect (src, "handoff", G_CALLBACK (src_handoff_float32_8ch), NULL); return src; } GST_START_TEST (test_8_channels_float32) { GstElement *pipeline, *src, *deinterleave; GstMessage *msg; pipeline = (GstElement *) gst_pipeline_new ("pipeline"); fail_unless (pipeline != NULL, "failed to create pipeline"); src = make_fake_src_8chans_float32 (); deinterleave = gst_element_factory_make ("deinterleave", "deinterleave"); fail_unless (deinterleave != NULL, "failed to create deinterleave element"); g_object_set (deinterleave, "keep-positions", TRUE, NULL); gst_bin_add_many (GST_BIN (pipeline), src, deinterleave, NULL); fail_unless (gst_element_link (src, deinterleave), "failed to link src <=> deinterleave"); g_signal_connect (deinterleave, "pad-added", G_CALLBACK (pad_added_setup_data_check_float32_8ch_cb), pipeline); pads_created = 0; gst_element_set_state (pipeline, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); gst_message_unref (msg); fail_unless_equals_int (pads_created, NUM_CHANNELS); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); } GST_END_TEST; static Suite * deinterleave_suite (void) { Suite *s = suite_create ("deinterleave"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_set_timeout (tc_chain, 180); tcase_add_test (tc_chain, test_create_and_unref); tcase_add_test (tc_chain, test_2_channels); tcase_add_test (tc_chain, test_2_channels_1_linked); tcase_add_test (tc_chain, test_2_channels_caps_change); tcase_add_test (tc_chain, test_8_channels_float32); return s; } GST_CHECK_MAIN (deinterleave); gst-plugins-good-0.10.31/tests/check/elements/wavpackdec.c0000644000175000017500000001671011671175354020325 00000000000000/* GStreamer * * unit test for wavpackdec * * Copyright (c) 2006 Sebastian Dröge * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; guint8 test_frame[] = { 0x77, 0x76, 0x70, 0x6B, /* "wvpk" */ 0x2E, 0x00, 0x00, 0x00, /* ckSize */ 0x04, 0x04, /* version */ 0x00, /* track_no */ 0x00, /* index_no */ 0x00, 0x64, 0x00, 0x00, /* total_samples */ 0x00, 0x00, 0x00, 0x00, /* block_index */ 0x00, 0x64, 0x00, 0x00, /* block_samples */ 0x05, 0x18, 0x80, 0x04, /* flags */ 0xFF, 0xAF, 0x80, 0x60, /* crc */ 0x02, 0x00, 0x03, 0x00, /* data */ 0x04, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x02, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0xE4, }; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "width = (int) 32, " "depth = (int) 16, " "channels = (int) 1, " "rate = (int) 44100, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) true") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wavpack, " "width = (int) 16, " "channels = (int) 1, " "rate = (int) 44100, " "framed = (boolean) true") ); static GstElement * setup_wavpackdec (void) { GstElement *wavpackdec; GST_DEBUG ("setup_wavpackdec"); wavpackdec = gst_check_setup_element ("wavpackdec"); mysrcpad = gst_check_setup_src_pad (wavpackdec, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (wavpackdec, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return wavpackdec; } static void cleanup_wavpackdec (GstElement * wavpackdec) { GST_DEBUG ("cleanup_wavpackdec"); gst_element_set_state (wavpackdec, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (wavpackdec); gst_check_teardown_sink_pad (wavpackdec); gst_check_teardown_element (wavpackdec); } GST_START_TEST (test_decode_frame) { GstElement *wavpackdec; GstBuffer *inbuffer, *outbuffer; GstBus *bus; int i; wavpackdec = setup_wavpackdec (); fail_unless (gst_element_set_state (wavpackdec, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); bus = gst_bus_new (); inbuffer = gst_buffer_new_and_alloc (sizeof (test_frame)); memcpy (GST_BUFFER_DATA (inbuffer), test_frame, sizeof (test_frame)); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); GST_BUFFER_TIMESTAMP (inbuffer) = 0; gst_buffer_ref (inbuffer); gst_element_set_bus (wavpackdec, bus); /* should decode the buffer without problems */ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_OK); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_unref (inbuffer); outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); /* uncompressed data should be 102400 bytes */ fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer), 102400); /* and all 102400 bytes must be 0, i.e. silence */ for (i = 0; i < 102400; i++) fail_unless_equals_int (GST_BUFFER_DATA (outbuffer)[i], 0); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; g_list_free (buffers); buffers = NULL; gst_bus_set_flushing (bus, TRUE); gst_element_set_bus (wavpackdec, NULL); gst_object_unref (GST_OBJECT (bus)); cleanup_wavpackdec (wavpackdec); } GST_END_TEST; GST_START_TEST (test_decode_frame_with_broken_header) { GstElement *wavpackdec; GstBuffer *inbuffer; GstBus *bus; GstMessage *message; wavpackdec = setup_wavpackdec (); fail_unless (gst_element_set_state (wavpackdec, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); bus = gst_bus_new (); inbuffer = gst_buffer_new_and_alloc (sizeof (test_frame)); memcpy (GST_BUFFER_DATA (inbuffer), test_frame, sizeof (test_frame)); /* break header */ GST_BUFFER_DATA (inbuffer)[2] = 'e'; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); GST_BUFFER_TIMESTAMP (inbuffer) = 0; gst_buffer_ref (inbuffer); gst_element_set_bus (wavpackdec, bus); /* should fail gracefully */ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_ERROR); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_unref (inbuffer); fail_if ((message = gst_bus_pop (bus)) == NULL); fail_unless_message_error (message, STREAM, DECODE); gst_message_unref (message); gst_element_set_bus (wavpackdec, NULL); gst_object_unref (GST_OBJECT (bus)); cleanup_wavpackdec (wavpackdec); } GST_END_TEST; GST_START_TEST (test_decode_frame_with_incomplete_frame) { GstElement *wavpackdec; GstBuffer *inbuffer; GstBus *bus; GstMessage *message; wavpackdec = setup_wavpackdec (); fail_unless (gst_element_set_state (wavpackdec, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); bus = gst_bus_new (); inbuffer = gst_buffer_new_and_alloc (sizeof (test_frame) - 2); memcpy (GST_BUFFER_DATA (inbuffer), test_frame, sizeof (test_frame) - 2); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); GST_BUFFER_TIMESTAMP (inbuffer) = 0; gst_buffer_ref (inbuffer); gst_element_set_bus (wavpackdec, bus); /* should fail gracefully */ fail_unless_equals_int (gst_pad_push (mysrcpad, inbuffer), GST_FLOW_ERROR); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); gst_buffer_unref (inbuffer); fail_if ((message = gst_bus_pop (bus)) == NULL); fail_unless_message_error (message, STREAM, DECODE); gst_message_unref (message); gst_element_set_bus (wavpackdec, NULL); gst_object_unref (GST_OBJECT (bus)); cleanup_wavpackdec (wavpackdec); } GST_END_TEST; static Suite * wavpackdec_suite (void) { Suite *s = suite_create ("wavpackdec"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_decode_frame); tcase_add_test (tc_chain, test_decode_frame_with_broken_header); tcase_add_test (tc_chain, test_decode_frame_with_incomplete_frame); return s; } int main (int argc, char **argv) { int nf; Suite *s = wavpackdec_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/audiodynamic.c0000644000175000017500000003505511671175354020666 00000000000000/* GStreamer * * unit test for audiodynamic * * Copyright (C) 2007 Sebastian Dröge * * Greatly based on the audiopanorama unit test * Copyright (C) 2006 Stefan Kost * * 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 #include #include gboolean have_eos = FALSE; /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ GstPad *mysrcpad, *mysinkpad; #define DYNAMIC_CAPS_STRING \ "audio/x-raw-int, " \ "channels = (int) 1, " \ "rate = (int) 44100, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (bool) TRUE" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) 1, " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE") ); static GstElement * setup_dynamic (void) { GstElement *dynamic; GST_DEBUG ("setup_dynamic"); dynamic = gst_check_setup_element ("audiodynamic"); mysrcpad = gst_check_setup_src_pad (dynamic, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (dynamic, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return dynamic; } static void cleanup_dynamic (GstElement * dynamic) { GST_DEBUG ("cleanup_dynamic"); g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL); g_list_free (buffers); buffers = NULL; gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (dynamic); gst_check_teardown_sink_pad (dynamic); gst_check_teardown_element (dynamic); } GST_START_TEST (test_passthrough) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[6] = { 24576, -16384, 256, -128, 0, -24576 }; gint16 *res; dynamic = setup_dynamic (); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (12); memcpy (GST_BUFFER_DATA (inbuffer), in, 12); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 12) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... but it ends up being collected on the global buffer list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); GST_INFO ("expected %+5d %+5d %+5d %+5d %+5d %+5d real %+5d %+5d %+5d %+5d %+5d %+5d", in[0], in[1], in[2], in[3], in[4], in[5], res[0], res[1], res[2], res[3], res[4], res[5]); fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), in, 12) == 0); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; GST_START_TEST (test_compress_hard_50_50) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 }; gint16 *res; dynamic = setup_dynamic (); g_object_set (G_OBJECT (dynamic), "mode", 0, NULL); g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL); g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (16); memcpy (GST_BUFFER_DATA (inbuffer), in, 16); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); fail_unless (res[0] > in[0]); fail_unless (res[1] < in[1]); fail_unless (res[2] == in[2]); fail_unless (res[3] == in[3]); fail_unless (res[4] == in[4]); fail_unless (res[5] == in[5]); fail_unless (res[6] > in[6]); fail_unless (res[7] < in[7]); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; GST_START_TEST (test_compress_soft_50_50) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 }; gint16 *res; dynamic = setup_dynamic (); g_object_set (G_OBJECT (dynamic), "mode", 0, NULL); g_object_set (G_OBJECT (dynamic), "characteristics", 1, NULL); g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL); g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (16); memcpy (GST_BUFFER_DATA (inbuffer), in, 16); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); fail_unless (res[0] > in[0]); fail_unless (res[1] < in[1]); fail_unless (res[2] == in[2]); fail_unless (res[3] == in[3]); fail_unless (res[4] == in[4]); fail_unless (res[5] == in[5]); fail_unless (res[6] > in[6]); fail_unless (res[7] < in[7]); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; GST_START_TEST (test_compress_hard_100_50) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[8] = { -30000, 24576, -16384, 256, -128, 0, -24576, 30000 }; gint16 *res; dynamic = setup_dynamic (); g_object_set (G_OBJECT (dynamic), "mode", 0, NULL); g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); g_object_set (G_OBJECT (dynamic), "ratio", 0.5, NULL); g_object_set (G_OBJECT (dynamic), "threshold", 1.0, NULL); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (16); memcpy (GST_BUFFER_DATA (inbuffer), in, 16); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); fail_unless (res[0] == in[0]); fail_unless (res[1] == in[1]); fail_unless (res[2] == in[2]); fail_unless (res[3] == in[3]); fail_unless (res[4] == in[4]); fail_unless (res[5] == in[5]); fail_unless (res[6] == in[6]); fail_unless (res[7] == in[7]); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; GST_START_TEST (test_expand_hard_50_200) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 }; gint16 *res; dynamic = setup_dynamic (); g_object_set (G_OBJECT (dynamic), "mode", 1, NULL); g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL); g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (16); memcpy (GST_BUFFER_DATA (inbuffer), in, 16); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); fail_unless (res[0] == in[0]); fail_unless (res[1] == in[1]); fail_unless (res[2] > in[2]); fail_unless (res[3] < in[3]); fail_unless (res[4] > in[4]); fail_unless (res[5] == in[5]); fail_unless (res[6] == in[6]); fail_unless (res[7] == in[7]); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; GST_START_TEST (test_expand_soft_50_200) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 }; gint16 *res; dynamic = setup_dynamic (); g_object_set (G_OBJECT (dynamic), "mode", 1, NULL); g_object_set (G_OBJECT (dynamic), "characteristics", 1, NULL); g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL); g_object_set (G_OBJECT (dynamic), "threshold", 0.5, NULL); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (16); memcpy (GST_BUFFER_DATA (inbuffer), in, 16); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); fail_unless (res[0] == in[0]); fail_unless (res[1] == in[1]); fail_unless (res[2] > in[2]); fail_unless (res[3] < in[3]); fail_unless (res[4] > in[4]); fail_unless (res[5] == in[5]); fail_unless (res[6] == in[6]); fail_unless (res[7] == in[7]); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; GST_START_TEST (test_expand_hard_0_200) { GstElement *dynamic; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint16 in[8] = { -30000, 24576, -16383, 256, -128, 0, -24576, 30000 }; gint16 *res; dynamic = setup_dynamic (); g_object_set (G_OBJECT (dynamic), "mode", 1, NULL); g_object_set (G_OBJECT (dynamic), "characteristics", 0, NULL); g_object_set (G_OBJECT (dynamic), "ratio", 2.0, NULL); g_object_set (G_OBJECT (dynamic), "threshold", 0.0, NULL); fail_unless (gst_element_set_state (dynamic, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); inbuffer = gst_buffer_new_and_alloc (16); memcpy (GST_BUFFER_DATA (inbuffer), in, 16); fail_unless (memcmp (GST_BUFFER_DATA (inbuffer), in, 16) == 0); caps = gst_caps_from_string (DYNAMIC_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); /* pushing gives away my reference ... */ fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); /* ... and puts a new buffer on the global list */ fail_unless_equals_int (g_list_length (buffers), 1); fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL); res = (gint16 *) GST_BUFFER_DATA (outbuffer); fail_unless (res[0] == in[0]); fail_unless (res[1] == in[1]); fail_unless (res[2] == in[2]); fail_unless (res[3] == in[3]); fail_unless (res[4] == in[4]); fail_unless (res[5] == in[5]); fail_unless (res[6] == in[6]); fail_unless (res[7] == in[7]); /* cleanup */ cleanup_dynamic (dynamic); } GST_END_TEST; static Suite * dynamic_suite (void) { Suite *s = suite_create ("dynamic"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_passthrough); tcase_add_test (tc_chain, test_compress_hard_50_50); tcase_add_test (tc_chain, test_compress_soft_50_50); tcase_add_test (tc_chain, test_compress_hard_100_50); tcase_add_test (tc_chain, test_expand_hard_50_200); tcase_add_test (tc_chain, test_expand_soft_50_200); tcase_add_test (tc_chain, test_expand_hard_0_200); return s; } int main (int argc, char **argv) { int nf; Suite *s = dynamic_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/y4menc.c0000644000175000017500000001232211671175354017407 00000000000000/* GStreamer * * unit test for y4menc * * Copyright (C) <2006> Mark Nauwelaerts * * 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 #include /* For ease of programming we use globals to keep refs for our floating * src and sink pads we create; otherwise we always have to do get_pad, * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; #define VIDEO_CAPS_STRING "video/x-raw-yuv, " \ "format = (fourcc) I420, "\ "width = (int) 384, " \ "height = (int) 288, " \ "framerate = (fraction) 25/1, " \ "pixel-aspect-ratio = (fraction) 1/1" #define Y4M_CAPS_STRING "application/x-yuv4mpeg, " \ "y4mversion = (int) 2" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (Y4M_CAPS_STRING)); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CAPS_STRING)); static GstElement * setup_y4menc (void) { GstElement *y4menc; GST_DEBUG ("setup_y4menc"); y4menc = gst_check_setup_element ("y4menc"); mysrcpad = gst_check_setup_src_pad (y4menc, &srctemplate, NULL); mysinkpad = gst_check_setup_sink_pad (y4menc, &sinktemplate, NULL); gst_pad_set_active (mysrcpad, TRUE); gst_pad_set_active (mysinkpad, TRUE); return y4menc; } static void cleanup_y4menc (GstElement * y4menc) { GST_DEBUG ("cleanup_y4menc"); gst_element_set_state (y4menc, GST_STATE_NULL); gst_pad_set_active (mysrcpad, FALSE); gst_pad_set_active (mysinkpad, FALSE); gst_check_teardown_src_pad (y4menc); gst_check_teardown_sink_pad (y4menc); gst_check_teardown_element (y4menc); } GST_START_TEST (test_y4m) { GstElement *y4menc; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; int i, num_buffers, size; const gchar *data0 = "YUV4MPEG2 W384 H288 Ip F25:1 A1:1\n"; const gchar *data1 = "YUV4MPEG2 C420 W384 H288 Ip F25:1 A1:1\n"; const gchar *data2 = "FRAME\n"; y4menc = setup_y4menc (); fail_unless (gst_element_set_state (y4menc, GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS, "could not set to playing"); /* corresponds to I420 buffer for the size mentioned in the caps */ size = 384 * 288 * 3 / 2; inbuffer = gst_buffer_new_and_alloc (size); /* makes valgrind's memcheck happier */ memset (GST_BUFFER_DATA (inbuffer), 0, GST_BUFFER_SIZE (inbuffer)); caps = gst_caps_from_string (VIDEO_CAPS_STRING); gst_buffer_set_caps (inbuffer, caps); gst_caps_unref (caps); GST_BUFFER_TIMESTAMP (inbuffer) = 0; ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1); fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK); num_buffers = g_list_length (buffers); fail_unless (num_buffers == 1); /* clean up buffers */ for (i = 0; i < num_buffers; ++i) { gchar *data; outbuffer = GST_BUFFER (buffers->data); fail_if (outbuffer == NULL); switch (i) { case 0: fail_unless (GST_BUFFER_SIZE (outbuffer) > size); fail_unless (memcmp (data0, GST_BUFFER_DATA (outbuffer), strlen (data0)) == 0 || memcmp (data1, GST_BUFFER_DATA (outbuffer), strlen (data1)) == 0); /* so we know there is a newline */ data = (gchar *) GST_BUFFER_DATA (outbuffer); data = strchr (data, '\n'); fail_unless (data != NULL); data++; fail_unless (memcmp (data2, data, strlen (data2)) == 0); data += strlen (data2); /* remainder must be frame data */ fail_unless ((data - (gchar *) GST_BUFFER_DATA (outbuffer)) + size == GST_BUFFER_SIZE (outbuffer)); break; default: break; } buffers = g_list_remove (buffers, outbuffer); ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1); gst_buffer_unref (outbuffer); outbuffer = NULL; } cleanup_y4menc (y4menc); g_list_free (buffers); buffers = NULL; } GST_END_TEST; static Suite * y4menc_suite (void) { Suite *s = suite_create ("y4menc"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_y4m); return s; } int main (int argc, char **argv) { int nf; Suite *s = y4menc_suite (); SRunner *sr = srunner_create (s); gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/elements/videocrop.c0000644000175000017500000006647711705514327020221 00000000000000/* GStreamer unit test for the videocrop element * Copyright (C) 2006 Tim-Philipp Müller * * 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 #ifdef HAVE_VALGRIND # include #endif #include #include #include /* return a list of caps where we only need to set * width and height to get fixed caps */ static GList * video_crop_get_test_caps (GstElement * videocrop) { const GstCaps *allowed_caps; GstPad *srcpad; GList *list = NULL; guint i; srcpad = gst_element_get_static_pad (videocrop, "src"); fail_unless (srcpad != NULL); allowed_caps = gst_pad_get_pad_template_caps (srcpad); fail_unless (allowed_caps != NULL); for (i = 0; i < gst_caps_get_size (allowed_caps); ++i) { GstStructure *new_structure; GstCaps *single_caps; single_caps = gst_caps_new_empty (); new_structure = gst_structure_copy (gst_caps_get_structure (allowed_caps, i)); gst_structure_set (new_structure, "framerate", GST_TYPE_FRACTION, 1, 1, NULL); gst_structure_remove_field (new_structure, "width"); gst_structure_remove_field (new_structure, "height"); gst_caps_append_structure (single_caps, new_structure); /* should be fixed without width/height */ fail_unless (gst_caps_is_fixed (single_caps)); list = g_list_prepend (list, single_caps); } gst_object_unref (srcpad); return list; } GST_START_TEST (test_unit_sizes) { GstBaseTransformClass *csp_klass, *vcrop_klass; GstElement *videocrop, *csp; GList *caps_list, *l; videocrop = gst_element_factory_make ("videocrop", "videocrop"); fail_unless (videocrop != NULL, "Failed to create videocrop element"); vcrop_klass = GST_BASE_TRANSFORM_GET_CLASS (videocrop); csp = gst_element_factory_make ("ffmpegcolorspace", "csp"); fail_unless (csp != NULL, "Failed to create ffmpegcolorspace element"); csp_klass = GST_BASE_TRANSFORM_GET_CLASS (csp); caps_list = video_crop_get_test_caps (videocrop); for (l = caps_list; l != NULL; l = l->next) { const struct { gint width, height; } sizes_to_try[] = { { 160, 120}, { 161, 120}, { 160, 121}, { 161, 121}, { 159, 120}, { 160, 119}, { 159, 119}, { 159, 121} }; GstStructure *s; GstCaps *caps; gint i; caps = gst_caps_copy (GST_CAPS (l->data)); s = gst_caps_get_structure (caps, 0); fail_unless (s != NULL); for (i = 0; i < G_N_ELEMENTS (sizes_to_try); ++i) { gchar *caps_str; guint csp_size = 0; guint vc_size = 0; gst_structure_set (s, "width", G_TYPE_INT, sizes_to_try[i].width, "height", G_TYPE_INT, sizes_to_try[i].height, NULL); caps_str = gst_caps_to_string (caps); GST_INFO ("Testing unit size for %s", caps_str); /* skip if ffmpegcolorspace doesn't support these caps * (only works with gst-plugins-base 0.10.9.1 or later) */ if (!csp_klass->get_unit_size ((GstBaseTransform *) csp, caps, &csp_size)) { GST_INFO ("ffmpegcolorspace does not support format %s", caps_str); g_free (caps_str); continue; } fail_unless (vcrop_klass->get_unit_size ((GstBaseTransform *) videocrop, caps, &vc_size)); fail_unless (vc_size == csp_size, "videocrop and ffmpegcolorspace return different unit sizes for " "caps %s: vc_size=%d, csp_size=%d", caps_str, vc_size, csp_size); g_free (caps_str); } gst_caps_unref (caps); } g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); g_list_free (caps_list); gst_object_unref (csp); gst_object_unref (videocrop); } GST_END_TEST; typedef struct { GstElement *pipeline; GstElement *src; GstElement *filter; GstElement *crop; GstElement *sink; GstBuffer *last_buf; } GstVideoCropTestContext; static void handoff_cb (GstElement * sink, GstBuffer * buf, GstPad * pad, GstBuffer ** p_buf) { gst_buffer_replace (p_buf, buf); } static void videocrop_test_cropping_init_context (GstVideoCropTestContext * ctx) { fail_unless (ctx != NULL); ctx->pipeline = gst_pipeline_new ("pipeline"); fail_unless (ctx->pipeline != NULL); ctx->src = gst_element_factory_make ("videotestsrc", "src"); fail_unless (ctx->src != NULL, "Failed to create videotestsrc element"); ctx->filter = gst_element_factory_make ("capsfilter", "filter"); fail_unless (ctx->filter != NULL, "Failed to create capsfilter element"); ctx->crop = gst_element_factory_make ("videocrop", "crop"); fail_unless (ctx->crop != NULL, "Failed to create videocrop element"); ctx->sink = gst_element_factory_make ("fakesink", "sink"); fail_unless (ctx->sink != NULL, "Failed to create fakesink element"); gst_bin_add_many (GST_BIN (ctx->pipeline), ctx->src, ctx->filter, ctx->crop, ctx->sink, NULL); gst_element_link_many (ctx->src, ctx->filter, ctx->crop, ctx->sink, NULL); /* set pattern to 'red' - for our purposes it doesn't matter anyway */ g_object_set (ctx->src, "pattern", 4, NULL); g_object_set (ctx->sink, "signal-handoffs", TRUE, NULL); g_signal_connect (ctx->sink, "preroll-handoff", G_CALLBACK (handoff_cb), &ctx->last_buf); ctx->last_buf = NULL; GST_LOG ("context inited"); } static void videocrop_test_cropping_deinit_context (GstVideoCropTestContext * ctx) { GST_LOG ("deiniting context"); gst_element_set_state (ctx->pipeline, GST_STATE_NULL); gst_object_unref (ctx->pipeline); gst_buffer_replace (&ctx->last_buf, NULL); memset (ctx, 0x00, sizeof (GstVideoCropTestContext)); } typedef void (*GstVideoCropTestBufferFunc) (GstBuffer * buffer); static void videocrop_test_cropping (GstVideoCropTestContext * ctx, GstCaps * in_caps, gint left, gint right, gint top, gint bottom, GstVideoCropTestBufferFunc func) { GST_LOG ("lrtb = %03u %03u %03u %03u, caps = %" GST_PTR_FORMAT, left, right, top, bottom, in_caps); g_object_set (ctx->filter, "caps", in_caps, NULL); g_object_set (ctx->crop, "left", left, "right", right, "top", top, "bottom", bottom, NULL); /* this will fail if videotestsrc doesn't support our format; we need * videotestsrc from -base CVS 0.10.9.1 with RGBA and AYUV support */ fail_unless (gst_element_set_state (ctx->pipeline, GST_STATE_PAUSED) != GST_STATE_CHANGE_FAILURE); fail_unless (gst_element_get_state (ctx->pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_SUCCESS); if (func != NULL) { func (ctx->last_buf); } gst_element_set_state (ctx->pipeline, GST_STATE_NULL); } static void check_1x1_buffer (GstBuffer * buf) { GstStructure *s; fail_unless (buf != NULL); fail_unless (GST_BUFFER_CAPS (buf) != NULL); s = gst_caps_get_structure (GST_BUFFER_CAPS (buf), 0); if (gst_structure_has_name (s, "video/x-raw-yuv")) { guint32 format = 0; fail_unless (gst_structure_get_fourcc (s, "format", &format)); /* the exact values we check for come from videotestsrc */ switch (format) { case GST_MAKE_FOURCC ('I', '4', '2', '0'): fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 81); fail_unless_equals_int (GST_BUFFER_DATA (buf)[8], 90); fail_unless_equals_int (GST_BUFFER_DATA (buf)[12], 240); break; case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 81); fail_unless_equals_int (GST_BUFFER_DATA (buf)[8], 240); fail_unless_equals_int (GST_BUFFER_DATA (buf)[12], 90); break; case GST_MAKE_FOURCC ('Y', '8', '0', '0'): fail_unless_equals_int (GST_BUFFER_DATA (buf)[0], 81); /* no chroma planes */ break; case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): fail_unless_equals_int (GST_BUFFER_DATA (buf)[1], 81); fail_unless_equals_int (GST_BUFFER_DATA (buf)[2], 90); fail_unless_equals_int (GST_BUFFER_DATA (buf)[3], 240); /* no chroma planes */ break; default: GST_LOG ("not checking %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format)); break; } } else if (gst_structure_has_name (s, "video/x-raw-rgb")) { guint32 pixel; gint rmask = 0, bmask = 0, gmask = 0, endianness = 0, bpp = 0; gint rshift, gshift, bshift; fail_unless (gst_structure_get_int (s, "red_mask", &rmask)); fail_unless (gst_structure_get_int (s, "blue_mask", &bmask)); fail_unless (gst_structure_get_int (s, "green_mask", &gmask)); fail_unless (gst_structure_get_int (s, "bpp", &bpp)); fail_unless (gst_structure_get_int (s, "endianness", &endianness)); fail_unless (rmask != 0); fail_unless (gmask != 0); fail_unless (bmask != 0); fail_unless (bpp != 0); fail_unless (endianness != 0); rshift = g_bit_nth_lsf (rmask, -1); gshift = g_bit_nth_lsf (gmask, -1); bshift = g_bit_nth_lsf (bmask, -1); switch (bpp) { case 32:{ if (endianness == G_LITTLE_ENDIAN) pixel = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); else pixel = GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)); break; } case 24:{ if (endianness == G_BIG_ENDIAN) { pixel = (GST_READ_UINT8 (GST_BUFFER_DATA (buf)) << 16) | (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 1) << 8) | (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 2) << 0); } else { pixel = (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 2) << 16) | (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 1) << 8) | (GST_READ_UINT8 (GST_BUFFER_DATA (buf) + 0) << 0); } break; } default:{ GST_LOG ("not checking RGB-format buffer with %ubpp", bpp); return; } } fail_unless_equals_int ((pixel & rmask) >> rshift, 0xff); fail_unless_equals_int ((pixel & gmask) >> gshift, 0x00); fail_unless_equals_int ((pixel & bmask) >> bshift, 0x00); } } GST_START_TEST (test_crop_to_1x1) { GstVideoCropTestContext ctx; GList *caps_list, *node; videocrop_test_cropping_init_context (&ctx); caps_list = video_crop_get_test_caps (ctx.crop); for (node = caps_list; node != NULL; node = node->next) { GstStructure *s; GstCaps *caps; caps = gst_caps_copy (GST_CAPS (node->data)); s = gst_caps_get_structure (caps, 0); fail_unless (s != NULL); if (g_strcmp0 (gst_structure_get_name (s), "video/x-raw-gray") == 0) { /* videotestsrc does not support this format */ gst_caps_unref (caps); continue; } GST_INFO ("testing format: %" GST_PTR_FORMAT, caps); gst_structure_set (s, "width", G_TYPE_INT, 160, "height", G_TYPE_INT, 160, NULL); videocrop_test_cropping (&ctx, caps, 159, 0, 159, 0, check_1x1_buffer); /* commented out because they don't really add anything useful check-wise: videocrop_test_cropping (&ctx, caps, 0, 159, 0, 159, check_1x1_buffer); videocrop_test_cropping (&ctx, caps, 159, 0, 0, 159, check_1x1_buffer); videocrop_test_cropping (&ctx, caps, 0, 159, 159, 0, check_1x1_buffer); */ gst_caps_unref (caps); } g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); g_list_free (caps_list); videocrop_test_cropping_deinit_context (&ctx); } GST_END_TEST; GST_START_TEST (test_cropping) { GstVideoCropTestContext ctx; struct { gint width, height; } sizes_to_try[] = { { 160, 160}, { 161, 160}, { 160, 161}, { 161, 161}, { 159, 160}, { 160, 159}, { 159, 159}, { 159, 161} }; GList *caps_list, *node; gint i; videocrop_test_cropping_init_context (&ctx); caps_list = video_crop_get_test_caps (ctx.crop); node = g_list_nth (caps_list, __i__); if (node != NULL) { GstStructure *s; GstCaps *caps; caps = gst_caps_copy (GST_CAPS (node->data)); s = gst_caps_get_structure (caps, 0); fail_unless (s != NULL); /* videotestsrc does not support this format, so ignore it */ if (!g_str_equal (gst_structure_get_name (s), "video/x-raw-gray")) { GST_INFO ("testing format: %" GST_PTR_FORMAT, caps); for (i = 0; i < G_N_ELEMENTS (sizes_to_try); ++i) { GstCaps *in_caps; GST_INFO (" - %d x %d", sizes_to_try[i].width, sizes_to_try[i].height); gst_structure_set (s, "width", G_TYPE_INT, sizes_to_try[i].width, "height", G_TYPE_INT, sizes_to_try[i].height, NULL); in_caps = gst_caps_copy (caps); videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 1, 0, 0, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 1, 0, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 0, 1, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 1, NULL); videocrop_test_cropping (&ctx, in_caps, 63, 0, 0, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 63, 0, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 0, 63, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 63, NULL); videocrop_test_cropping (&ctx, in_caps, 63, 0, 0, 1, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 63, 1, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 1, 63, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 1, 0, 0, 63, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 0, 0, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 32, 0, 0, 128, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 32, 128, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 0, 128, 32, 0, NULL); videocrop_test_cropping (&ctx, in_caps, 128, 0, 0, 32, NULL); videocrop_test_cropping (&ctx, in_caps, 1, 1, 1, 1, NULL); videocrop_test_cropping (&ctx, in_caps, 63, 63, 63, 63, NULL); videocrop_test_cropping (&ctx, in_caps, 64, 64, 64, 64, NULL); gst_caps_unref (in_caps); } } gst_caps_unref (caps); } else { GST_INFO ("no caps #%d", __i__); } g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); g_list_free (caps_list); videocrop_test_cropping_deinit_context (&ctx); } GST_END_TEST; static gboolean buffer_probe_cb (GstPad * pad, GstBuffer * buf, GstBuffer ** p_buf) { gst_buffer_replace (p_buf, buf); return TRUE; /* keep data */ } GST_START_TEST (test_passthrough) { GstStateChangeReturn state_ret; GstVideoCropTestContext ctx; GstPad *srcpad; GstBuffer *gen_buf = NULL; /* buffer generated by videotestsrc */ videocrop_test_cropping_init_context (&ctx); g_object_set (ctx.src, "num-buffers", 1, NULL); srcpad = gst_element_get_static_pad (ctx.src, "src"); fail_unless (srcpad != NULL); gst_pad_add_buffer_probe (srcpad, G_CALLBACK (buffer_probe_cb), &gen_buf); gst_object_unref (srcpad); g_object_set (ctx.crop, "left", 0, "right", 0, "top", 0, "bottom", 0, NULL); state_ret = gst_element_set_state (ctx.pipeline, GST_STATE_PAUSED); fail_unless (state_ret != GST_STATE_CHANGE_FAILURE, "couldn't set pipeline to PAUSED state"); state_ret = gst_element_get_state (ctx.pipeline, NULL, NULL, -1); fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS, "pipeline failed to go to PAUSED state"); fail_unless (gen_buf != NULL); fail_unless (ctx.last_buf != NULL); /* pass through should do nothing */ fail_unless (gen_buf == ctx.last_buf); videocrop_test_cropping_deinit_context (&ctx); fail_unless_equals_int (GST_MINI_OBJECT_REFCOUNT_VALUE (gen_buf), 1); gst_buffer_unref (gen_buf); } GST_END_TEST; static gint notgst_value_list_get_nth_int (const GValue * list_val, guint n) { const GValue *v; fail_unless (GST_VALUE_HOLDS_LIST (list_val)); fail_unless (n < gst_value_list_get_size (list_val)); v = gst_value_list_get_value (list_val, n); fail_unless (G_VALUE_HOLDS_INT (v)); return g_value_get_int (v); } GST_START_TEST (test_caps_transform) { GstVideoCropTestContext ctx; GstBaseTransformClass *klass; GstBaseTransform *crop; const GValue *w_val; const GValue *h_val; GstCaps *caps, *adj_caps; videocrop_test_cropping_init_context (&ctx); crop = GST_BASE_TRANSFORM (ctx.crop); klass = GST_BASE_TRANSFORM_GET_CLASS (ctx.crop); fail_unless (klass != NULL); caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), "framerate", GST_TYPE_FRACTION, 1, 1, "width", G_TYPE_INT, 200, "height", G_TYPE_INT, 100, NULL); /* by default, it should be no cropping and hence passthrough */ adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_is_equal (adj_caps, caps)); gst_caps_unref (adj_caps); adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_is_equal (adj_caps, caps)); gst_caps_unref (adj_caps); /* make sure that's still true after changing properties back and forth */ g_object_set (ctx.crop, "left", 1, "right", 3, "top", 5, "bottom", 7, NULL); g_object_set (ctx.crop, "left", 0, "right", 0, "top", 0, "bottom", 0, NULL); adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_is_equal (adj_caps, caps)); gst_caps_unref (adj_caps); adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_is_equal (adj_caps, caps)); gst_caps_unref (adj_caps); /* now check adjustments made ... */ g_object_set (ctx.crop, "left", 1, "right", 3, "top", 5, "bottom", 7, NULL); /* ========= (1) fixed value ============================================= */ /* sink => source, source must be bigger if we crop stuff off */ adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (G_VALUE_HOLDS_INT (w_val)); fail_unless_equals_int (g_value_get_int (w_val), 200 + (1 + 3)); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (G_VALUE_HOLDS_INT (h_val)); fail_unless_equals_int (g_value_get_int (h_val), 100 + (5 + 7)); gst_caps_unref (adj_caps); /* source => sink becomes smaller */ adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (G_VALUE_HOLDS_INT (w_val)); fail_unless_equals_int (g_value_get_int (w_val), 200 - (1 + 3)); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (G_VALUE_HOLDS_INT (h_val)); fail_unless_equals_int (g_value_get_int (h_val), 100 - (5 + 7)); gst_caps_unref (adj_caps); /* ========= (2) range (simple adjustment) =============================== */ gst_structure_set (gst_caps_get_structure (caps, 0), "width", GST_TYPE_INT_RANGE, 1000, 2000, "height", GST_TYPE_INT_RANGE, 3000, 4000, NULL); /* sink => source, source must be bigger if we crop stuff off */ adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); fail_unless_equals_int (gst_value_get_int_range_min (w_val), 1000 + (1 + 3)); fail_unless_equals_int (gst_value_get_int_range_max (w_val), 2000 + (1 + 3)); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); fail_unless_equals_int (gst_value_get_int_range_min (h_val), 3000 + (5 + 7)); fail_unless_equals_int (gst_value_get_int_range_max (h_val), 4000 + (5 + 7)); gst_caps_unref (adj_caps); /* source => sink becomes smaller */ adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); fail_unless_equals_int (gst_value_get_int_range_min (w_val), 1000 - (1 + 3)); fail_unless_equals_int (gst_value_get_int_range_max (w_val), 2000 - (1 + 3)); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); fail_unless_equals_int (gst_value_get_int_range_min (h_val), 3000 - (5 + 7)); fail_unless_equals_int (gst_value_get_int_range_max (h_val), 4000 - (5 + 7)); gst_caps_unref (adj_caps); /* ========= (3) range (adjustment at boundary) ========================== */ gst_structure_set (gst_caps_get_structure (caps, 0), "width", GST_TYPE_INT_RANGE, 2, G_MAXINT, "height", GST_TYPE_INT_RANGE, 2, G_MAXINT, NULL); /* sink => source, source must be bigger if we crop stuff off */ adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); fail_unless_equals_int (gst_value_get_int_range_min (w_val), 2 + (1 + 3)); fail_unless_equals_int (gst_value_get_int_range_max (w_val), G_MAXINT); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); fail_unless_equals_int (gst_value_get_int_range_min (h_val), 2 + (5 + 7)); fail_unless_equals_int (gst_value_get_int_range_max (h_val), G_MAXINT); gst_caps_unref (adj_caps); /* source => sink becomes smaller */ adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (w_val)); fail_unless_equals_int (gst_value_get_int_range_min (w_val), 1); fail_unless_equals_int (gst_value_get_int_range_max (w_val), G_MAXINT - (1 + 3)); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (GST_VALUE_HOLDS_INT_RANGE (h_val)); fail_unless_equals_int (gst_value_get_int_range_min (h_val), 1); fail_unless_equals_int (gst_value_get_int_range_max (h_val), G_MAXINT - (5 + 7)); gst_caps_unref (adj_caps); /* ========= (4) list of values ========================================== */ { GValue list = { 0, }; GValue ival = { 0, }; g_value_init (&ival, G_TYPE_INT); g_value_init (&list, GST_TYPE_LIST); g_value_set_int (&ival, 2); gst_value_list_append_value (&list, &ival); g_value_set_int (&ival, G_MAXINT); gst_value_list_append_value (&list, &ival); gst_structure_set_value (gst_caps_get_structure (caps, 0), "width", &list); g_value_unset (&list); g_value_unset (&ival); g_value_init (&ival, G_TYPE_INT); g_value_init (&list, GST_TYPE_LIST); g_value_set_int (&ival, 5); gst_value_list_append_value (&list, &ival); g_value_set_int (&ival, 1000); gst_value_list_append_value (&list, &ival); gst_structure_set_value (gst_caps_get_structure (caps, 0), "height", &list); g_value_unset (&list); g_value_unset (&ival); } /* sink => source, source must be bigger if we crop stuff off */ adj_caps = klass->transform_caps (crop, GST_PAD_SRC, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (GST_VALUE_HOLDS_LIST (w_val)); fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 0), 2 + (1 + 3)); fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 1), G_MAXINT); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (GST_VALUE_HOLDS_LIST (h_val)); fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 0), 5 + (5 + 7)); fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 1), 1000 + (5 + 7)); gst_caps_unref (adj_caps); /* source => sink becomes smaller */ adj_caps = klass->transform_caps (crop, GST_PAD_SINK, caps); fail_unless (adj_caps != NULL); fail_unless (gst_caps_get_size (adj_caps) == 1); w_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "width"); fail_unless (w_val != NULL); fail_unless (GST_VALUE_HOLDS_LIST (w_val)); fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 0), 1); fail_unless_equals_int (notgst_value_list_get_nth_int (w_val, 1), G_MAXINT - (1 + 3)); h_val = gst_structure_get_value (gst_caps_get_structure (adj_caps, 0), "height"); fail_unless (h_val != NULL); fail_unless (GST_VALUE_HOLDS_LIST (h_val)); fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 0), 1); fail_unless_equals_int (notgst_value_list_get_nth_int (h_val, 1), 1000 - (5 + 7)); gst_caps_unref (adj_caps); gst_caps_unref (caps); videocrop_test_cropping_deinit_context (&ctx); } GST_END_TEST; static Suite * videocrop_suite (void) { Suite *s = suite_create ("videocrop"); TCase *tc_chain = tcase_create ("general"); #ifdef HAVE_VALGRIND if (RUNNING_ON_VALGRIND) { /* our tests take quite a long time, so increase * timeout (~25 minutes on my 1.6GHz AMD K7) */ tcase_set_timeout (tc_chain, 30 * 60); } else #endif { /* increase timeout, these tests take a long time (60 secs here) */ tcase_set_timeout (tc_chain, 2 * 60); } suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_crop_to_1x1); tcase_add_test (tc_chain, test_caps_transform); tcase_add_test (tc_chain, test_passthrough); tcase_add_test (tc_chain, test_unit_sizes); tcase_add_loop_test (tc_chain, test_cropping, 0, 25); return s; } int main (int argc, char **argv) { int nf; Suite *s = videocrop_suite (); SRunner *sr = srunner_create (s); #ifdef HAVE_VALGRIND if (RUNNING_ON_VALGRIND) { /* otherwise valgrind errors out when liboil probes CPU extensions * in oil_init() during which it causes SIGILLs etc. to be fired */ g_setenv ("OIL_CPU_FLAGS", "0", 0); } #endif gst_check_init (&argc, &argv); srunner_run_all (sr, CK_NORMAL); nf = srunner_ntests_failed (sr); srunner_free (sr); return nf; } gst-plugins-good-0.10.31/tests/check/Makefile.in0000644000175000017500000070611611720560242016275 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/common/check.mak check_PROGRAMS = generic/index$(EXEEXT) generic/states$(EXEEXT) \ elements/aacparse$(EXEEXT) elements/ac3parse$(EXEEXT) \ elements/amrparse$(EXEEXT) $(am__EXEEXT_1) \ elements/alphacolor$(EXEEXT) elements/aspectratiocrop$(EXEEXT) \ elements/audioamplify$(EXEEXT) elements/audiochebband$(EXEEXT) \ elements/audiocheblimit$(EXEEXT) \ elements/audiodynamic$(EXEEXT) elements/audioecho$(EXEEXT) \ elements/audiofirfilter$(EXEEXT) \ elements/audioiirfilter$(EXEEXT) elements/audioinvert$(EXEEXT) \ elements/audiopanorama$(EXEEXT) \ elements/audiowsincband$(EXEEXT) \ elements/audiowsinclimit$(EXEEXT) elements/avimux$(EXEEXT) \ elements/avisubtitle$(EXEEXT) elements/capssetter$(EXEEXT) \ elements/deinterlace$(EXEEXT) elements/deinterleave$(EXEEXT) \ elements/equalizer$(EXEEXT) elements/flacparse$(EXEEXT) \ elements/flvdemux$(EXEEXT) elements/flvmux$(EXEEXT) \ elements/icydemux$(EXEEXT) elements/id3demux$(EXEEXT) \ elements/imagefreeze$(EXEEXT) elements/interleave$(EXEEXT) \ elements/level$(EXEEXT) elements/matroskamux$(EXEEXT) \ elements/matroskaparse$(EXEEXT) \ elements/mpegaudioparse$(EXEEXT) elements/multifile$(EXEEXT) \ elements/qtmux$(EXEEXT) elements/rganalysis$(EXEEXT) \ elements/rglimiter$(EXEEXT) elements/rgvolume$(EXEEXT) \ elements/rtp-payloading$(EXEEXT) elements/rtpbin$(EXEEXT) \ elements/rtpbin_buffer_list$(EXEEXT) \ elements/rtpjitterbuffer$(EXEEXT) elements/shapewipe$(EXEEXT) \ elements/spectrum$(EXEEXT) elements/udpsink$(EXEEXT) \ elements/videocrop$(EXEEXT) elements/videofilter$(EXEEXT) \ elements/y4menc$(EXEEXT) \ pipelines/simple-launch-lines$(EXEEXT) \ pipelines/effectv$(EXEEXT) pipelines/tagschecking$(EXEEXT) \ pipelines/wavenc$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) \ $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) noinst_PROGRAMS = elements/autodetect$(EXEEXT) subdir = tests/check ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libparser_la_LIBADD = am_libparser_la_OBJECTS = libparser_la-parser.lo libparser_la_OBJECTS = $(am_libparser_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libparser_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libparser_la_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @USE_ANNODEX_TRUE@am__EXEEXT_1 = elements/cmmldec$(EXEEXT) \ @USE_ANNODEX_TRUE@ elements/cmmlenc$(EXEEXT) @USE_FLAC_TRUE@am__EXEEXT_2 = pipelines/flacdec$(EXEEXT) @USE_GDK_PIXBUF_TRUE@am__EXEEXT_3 = elements/gdkpixbufsink$(EXEEXT) @USE_JPEG_TRUE@am__EXEEXT_4 = elements/jpegenc$(EXEEXT) @USE_SOUP_TRUE@am__EXEEXT_5 = elements/souphttpsrc$(EXEEXT) @USE_SUNAUDIO_TRUE@am__EXEEXT_6 = elements/sunaudio$(EXEEXT) @USE_TAGLIB_TRUE@am__EXEEXT_7 = elements/id3v2mux$(EXEEXT) \ @USE_TAGLIB_TRUE@ elements/apev2mux$(EXEEXT) @USE_WAVPACK_TRUE@am__EXEEXT_8 = elements/wavpackparse$(EXEEXT) \ @USE_WAVPACK_TRUE@ elements/wavpackdec$(EXEEXT) \ @USE_WAVPACK_TRUE@ elements/wavpackenc$(EXEEXT) \ @USE_WAVPACK_TRUE@ pipelines/wavpack$(EXEEXT) @HAVE_ORC_TRUE@am__EXEEXT_9 = orc/deinterlace$(EXEEXT) \ @HAVE_ORC_TRUE@ orc/videomixer$(EXEEXT) orc/videobox$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) elements_aacparse_SOURCES = elements/aacparse.c elements_aacparse_OBJECTS = aacparse.$(OBJEXT) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) elements_aacparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) am__dirstamp = $(am__leading_dot)dirstamp elements_ac3parse_SOURCES = elements/ac3parse.c elements_ac3parse_OBJECTS = ac3parse.$(OBJEXT) elements_ac3parse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) elements_alphacolor_SOURCES = elements/alphacolor.c elements_alphacolor_OBJECTS = \ elements_alphacolor-alphacolor.$(OBJEXT) elements_alphacolor_LDADD = $(LDADD) elements_alphacolor_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_alphacolor_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_alphacolor_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_amrparse_SOURCES = elements/amrparse.c elements_amrparse_OBJECTS = amrparse.$(OBJEXT) elements_amrparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) elements_apev2mux_SOURCES = elements/apev2mux.c elements_apev2mux_OBJECTS = apev2mux.$(OBJEXT) elements_apev2mux_LDADD = $(LDADD) elements_apev2mux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_aspectratiocrop_SOURCES = elements/aspectratiocrop.c elements_aspectratiocrop_OBJECTS = \ elements_aspectratiocrop-aspectratiocrop.$(OBJEXT) elements_aspectratiocrop_DEPENDENCIES = $(am__DEPENDENCIES_2) elements_aspectratiocrop_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_audioamplify_SOURCES = elements/audioamplify.c elements_audioamplify_OBJECTS = audioamplify.$(OBJEXT) elements_audioamplify_LDADD = $(LDADD) elements_audioamplify_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audiochebband_SOURCES = elements/audiochebband.c elements_audiochebband_OBJECTS = audiochebband.$(OBJEXT) elements_audiochebband_LDADD = $(LDADD) elements_audiochebband_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audiocheblimit_SOURCES = elements/audiocheblimit.c elements_audiocheblimit_OBJECTS = audiocheblimit.$(OBJEXT) elements_audiocheblimit_LDADD = $(LDADD) elements_audiocheblimit_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audiodynamic_SOURCES = elements/audiodynamic.c elements_audiodynamic_OBJECTS = audiodynamic.$(OBJEXT) elements_audiodynamic_LDADD = $(LDADD) elements_audiodynamic_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audioecho_SOURCES = elements/audioecho.c elements_audioecho_OBJECTS = audioecho.$(OBJEXT) elements_audioecho_LDADD = $(LDADD) elements_audioecho_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audiofirfilter_SOURCES = elements/audiofirfilter.c elements_audiofirfilter_OBJECTS = audiofirfilter.$(OBJEXT) elements_audiofirfilter_LDADD = $(LDADD) elements_audiofirfilter_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audioiirfilter_SOURCES = elements/audioiirfilter.c elements_audioiirfilter_OBJECTS = audioiirfilter.$(OBJEXT) elements_audioiirfilter_LDADD = $(LDADD) elements_audioiirfilter_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audioinvert_SOURCES = elements/audioinvert.c elements_audioinvert_OBJECTS = audioinvert.$(OBJEXT) elements_audioinvert_LDADD = $(LDADD) elements_audioinvert_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audiopanorama_SOURCES = elements/audiopanorama.c elements_audiopanorama_OBJECTS = \ elements_audiopanorama-audiopanorama.$(OBJEXT) elements_audiopanorama_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) elements_audiopanorama_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_audiopanorama_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_audiowsincband_SOURCES = elements/audiowsincband.c elements_audiowsincband_OBJECTS = audiowsincband.$(OBJEXT) elements_audiowsincband_LDADD = $(LDADD) elements_audiowsincband_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_audiowsinclimit_SOURCES = elements/audiowsinclimit.c elements_audiowsinclimit_OBJECTS = audiowsinclimit.$(OBJEXT) elements_audiowsinclimit_LDADD = $(LDADD) elements_audiowsinclimit_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_autodetect_SOURCES = elements/autodetect.c elements_autodetect_OBJECTS = autodetect.$(OBJEXT) elements_autodetect_LDADD = $(LDADD) elements_autodetect_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_avimux_SOURCES = elements/avimux.c elements_avimux_OBJECTS = avimux.$(OBJEXT) elements_avimux_LDADD = $(LDADD) elements_avimux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_avisubtitle_SOURCES = elements/avisubtitle.c elements_avisubtitle_OBJECTS = avisubtitle.$(OBJEXT) elements_avisubtitle_LDADD = $(LDADD) elements_avisubtitle_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_capssetter_SOURCES = elements/capssetter.c elements_capssetter_OBJECTS = capssetter.$(OBJEXT) elements_capssetter_LDADD = $(LDADD) elements_capssetter_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_cmmldec_SOURCES = elements/cmmldec.c elements_cmmldec_OBJECTS = elements_cmmldec-cmmldec.$(OBJEXT) elements_cmmldec_LDADD = $(LDADD) elements_cmmldec_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_cmmldec_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_cmmldec_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ elements_cmmlenc_SOURCES = elements/cmmlenc.c elements_cmmlenc_OBJECTS = elements_cmmlenc-cmmlenc.$(OBJEXT) elements_cmmlenc_LDADD = $(LDADD) elements_cmmlenc_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_cmmlenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_cmmlenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ elements_deinterlace_SOURCES = elements/deinterlace.c elements_deinterlace_OBJECTS = \ elements_deinterlace-deinterlace.$(OBJEXT) elements_deinterlace_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_deinterlace_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_deinterlace_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_deinterleave_SOURCES = elements/deinterleave.c elements_deinterleave_OBJECTS = \ elements_deinterleave-deinterleave.$(OBJEXT) elements_deinterleave_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_deinterleave_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_deinterleave_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_equalizer_SOURCES = elements/equalizer.c elements_equalizer_OBJECTS = equalizer.$(OBJEXT) elements_equalizer_LDADD = $(LDADD) elements_equalizer_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_flacparse_SOURCES = elements/flacparse.c elements_flacparse_OBJECTS = flacparse.$(OBJEXT) elements_flacparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2) elements_flvdemux_SOURCES = elements/flvdemux.c elements_flvdemux_OBJECTS = flvdemux.$(OBJEXT) elements_flvdemux_LDADD = $(LDADD) elements_flvdemux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_flvmux_SOURCES = elements/flvmux.c elements_flvmux_OBJECTS = flvmux.$(OBJEXT) elements_flvmux_LDADD = $(LDADD) elements_flvmux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_gdkpixbufsink_SOURCES = elements/gdkpixbufsink.c elements_gdkpixbufsink_OBJECTS = \ elements_gdkpixbufsink-gdkpixbufsink.$(OBJEXT) elements_gdkpixbufsink_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) elements_gdkpixbufsink_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_icydemux_SOURCES = elements/icydemux.c elements_icydemux_OBJECTS = icydemux.$(OBJEXT) elements_icydemux_LDADD = $(LDADD) elements_icydemux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_id3demux_SOURCES = elements/id3demux.c elements_id3demux_OBJECTS = id3demux.$(OBJEXT) elements_id3demux_LDADD = $(LDADD) elements_id3demux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_id3v2mux_SOURCES = elements/id3v2mux.c elements_id3v2mux_OBJECTS = id3v2mux.$(OBJEXT) elements_id3v2mux_LDADD = $(LDADD) elements_id3v2mux_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_imagefreeze_SOURCES = elements/imagefreeze.c elements_imagefreeze_OBJECTS = \ elements_imagefreeze-imagefreeze.$(OBJEXT) elements_imagefreeze_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) elements_imagefreeze_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_imagefreeze_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_interleave_SOURCES = elements/interleave.c elements_interleave_OBJECTS = \ elements_interleave-interleave.$(OBJEXT) elements_interleave_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_interleave_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_interleave_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_jpegenc_SOURCES = elements/jpegenc.c elements_jpegenc_OBJECTS = elements_jpegenc-jpegenc.$(OBJEXT) elements_jpegenc_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) elements_jpegenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_jpegenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ elements_level_SOURCES = elements/level.c elements_level_OBJECTS = level.$(OBJEXT) elements_level_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) elements_matroskamux_SOURCES = elements/matroskamux.c elements_matroskamux_OBJECTS = matroskamux.$(OBJEXT) elements_matroskamux_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) elements_matroskaparse_SOURCES = elements/matroskaparse.c elements_matroskaparse_OBJECTS = matroskaparse.$(OBJEXT) elements_matroskaparse_LDADD = $(LDADD) elements_matroskaparse_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_mpegaudioparse_SOURCES = elements/mpegaudioparse.c elements_mpegaudioparse_OBJECTS = mpegaudioparse.$(OBJEXT) elements_mpegaudioparse_DEPENDENCIES = libparser.la \ $(am__DEPENDENCIES_2) elements_multifile_SOURCES = elements/multifile.c elements_multifile_OBJECTS = elements_multifile-multifile.$(OBJEXT) elements_multifile_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) elements_multifile_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_multifile_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_qtmux_SOURCES = elements/qtmux.c elements_qtmux_OBJECTS = elements_qtmux-qtmux.$(OBJEXT) elements_qtmux_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) elements_qtmux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_qtmux_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ elements_rganalysis_SOURCES = elements/rganalysis.c elements_rganalysis_OBJECTS = rganalysis.$(OBJEXT) elements_rganalysis_LDADD = $(LDADD) elements_rganalysis_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_rglimiter_SOURCES = elements/rglimiter.c elements_rglimiter_OBJECTS = rglimiter.$(OBJEXT) elements_rglimiter_LDADD = $(LDADD) elements_rglimiter_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_rgvolume_SOURCES = elements/rgvolume.c elements_rgvolume_OBJECTS = rgvolume.$(OBJEXT) elements_rgvolume_LDADD = $(LDADD) elements_rgvolume_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_rtp_payloading_SOURCES = elements/rtp-payloading.c elements_rtp_payloading_OBJECTS = rtp-payloading.$(OBJEXT) elements_rtp_payloading_LDADD = $(LDADD) elements_rtp_payloading_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_rtpbin_SOURCES = elements/rtpbin.c elements_rtpbin_OBJECTS = rtpbin.$(OBJEXT) elements_rtpbin_LDADD = $(LDADD) elements_rtpbin_DEPENDENCIES = $(am__DEPENDENCIES_1) am_elements_rtpbin_buffer_list_OBJECTS = \ elements_rtpbin_buffer_list-rtpbin_buffer_list.$(OBJEXT) elements_rtpbin_buffer_list_OBJECTS = \ $(am_elements_rtpbin_buffer_list_OBJECTS) elements_rtpbin_buffer_list_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) elements_rtpbin_buffer_list_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_rtpjitterbuffer_SOURCES = elements/rtpjitterbuffer.c elements_rtpjitterbuffer_OBJECTS = rtpjitterbuffer.$(OBJEXT) elements_rtpjitterbuffer_LDADD = $(LDADD) elements_rtpjitterbuffer_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_shapewipe_SOURCES = elements/shapewipe.c elements_shapewipe_OBJECTS = shapewipe.$(OBJEXT) elements_shapewipe_LDADD = $(LDADD) elements_shapewipe_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_souphttpsrc_SOURCES = elements/souphttpsrc.c elements_souphttpsrc_OBJECTS = \ elements_souphttpsrc-souphttpsrc.$(OBJEXT) elements_souphttpsrc_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_souphttpsrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_souphttpsrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_spectrum_SOURCES = elements/spectrum.c elements_spectrum_OBJECTS = spectrum.$(OBJEXT) elements_spectrum_LDADD = $(LDADD) elements_spectrum_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_sunaudio_SOURCES = elements/sunaudio.c elements_sunaudio_OBJECTS = elements_sunaudio-sunaudio.$(OBJEXT) elements_sunaudio_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_sunaudio_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_sunaudio_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ elements_udpsink_SOURCES = elements/udpsink.c elements_udpsink_OBJECTS = udpsink.$(OBJEXT) elements_udpsink_LDADD = $(LDADD) elements_udpsink_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_videocrop_SOURCES = elements/videocrop.c elements_videocrop_OBJECTS = elements_videocrop-videocrop.$(OBJEXT) elements_videocrop_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_videocrop_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_videocrop_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_videofilter_SOURCES = elements/videofilter.c elements_videofilter_OBJECTS = \ elements_videofilter-videofilter.$(OBJEXT) elements_videofilter_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) elements_videofilter_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_videofilter_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ elements_wavpackdec_SOURCES = elements/wavpackdec.c elements_wavpackdec_OBJECTS = wavpackdec.$(OBJEXT) elements_wavpackdec_LDADD = $(LDADD) elements_wavpackdec_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_wavpackenc_SOURCES = elements/wavpackenc.c elements_wavpackenc_OBJECTS = wavpackenc.$(OBJEXT) elements_wavpackenc_LDADD = $(LDADD) elements_wavpackenc_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_wavpackparse_SOURCES = elements/wavpackparse.c elements_wavpackparse_OBJECTS = wavpackparse.$(OBJEXT) elements_wavpackparse_LDADD = $(LDADD) elements_wavpackparse_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_y4menc_SOURCES = elements/y4menc.c elements_y4menc_OBJECTS = y4menc.$(OBJEXT) elements_y4menc_LDADD = $(LDADD) elements_y4menc_DEPENDENCIES = $(am__DEPENDENCIES_1) generic_index_SOURCES = generic/index.c generic_index_OBJECTS = index.$(OBJEXT) generic_index_LDADD = $(LDADD) generic_index_DEPENDENCIES = $(am__DEPENDENCIES_1) generic_states_SOURCES = generic/states.c generic_states_OBJECTS = states.$(OBJEXT) generic_states_LDADD = $(LDADD) generic_states_DEPENDENCIES = $(am__DEPENDENCIES_1) nodist_orc_deinterlace_OBJECTS = \ orc_deinterlace-deinterlace.$(OBJEXT) orc_deinterlace_OBJECTS = $(nodist_orc_deinterlace_OBJECTS) orc_deinterlace_DEPENDENCIES = $(am__DEPENDENCIES_1) orc_deinterlace_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(orc_deinterlace_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ nodist_orc_videobox_OBJECTS = orc_videobox-videobox.$(OBJEXT) orc_videobox_OBJECTS = $(nodist_orc_videobox_OBJECTS) orc_videobox_DEPENDENCIES = $(am__DEPENDENCIES_1) orc_videobox_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(orc_videobox_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ nodist_orc_videomixer_OBJECTS = orc_videomixer-videomixer.$(OBJEXT) orc_videomixer_OBJECTS = $(nodist_orc_videomixer_OBJECTS) orc_videomixer_DEPENDENCIES = $(am__DEPENDENCIES_1) orc_videomixer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(orc_videomixer_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ pipelines_effectv_SOURCES = pipelines/effectv.c pipelines_effectv_OBJECTS = effectv.$(OBJEXT) pipelines_effectv_LDADD = $(LDADD) pipelines_effectv_DEPENDENCIES = $(am__DEPENDENCIES_1) pipelines_flacdec_SOURCES = pipelines/flacdec.c pipelines_flacdec_OBJECTS = flacdec.$(OBJEXT) pipelines_flacdec_LDADD = $(LDADD) pipelines_flacdec_DEPENDENCIES = $(am__DEPENDENCIES_1) pipelines_simple_launch_lines_SOURCES = \ pipelines/simple-launch-lines.c pipelines_simple_launch_lines_OBJECTS = simple-launch-lines.$(OBJEXT) pipelines_simple_launch_lines_LDADD = $(LDADD) pipelines_simple_launch_lines_DEPENDENCIES = $(am__DEPENDENCIES_1) pipelines_tagschecking_SOURCES = pipelines/tagschecking.c pipelines_tagschecking_OBJECTS = tagschecking.$(OBJEXT) pipelines_tagschecking_LDADD = $(LDADD) pipelines_tagschecking_DEPENDENCIES = $(am__DEPENDENCIES_1) pipelines_wavenc_SOURCES = pipelines/wavenc.c pipelines_wavenc_OBJECTS = pipelines_wavenc-wavenc.$(OBJEXT) pipelines_wavenc_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) pipelines_wavenc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(pipelines_wavenc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ pipelines_wavpack_SOURCES = pipelines/wavpack.c pipelines_wavpack_OBJECTS = pipelines_wavpack-wavpack.$(OBJEXT) pipelines_wavpack_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) pipelines_wavpack_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(pipelines_wavpack_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libparser_la_SOURCES) elements/aacparse.c \ elements/ac3parse.c elements/alphacolor.c elements/amrparse.c \ elements/apev2mux.c elements/aspectratiocrop.c \ elements/audioamplify.c elements/audiochebband.c \ elements/audiocheblimit.c elements/audiodynamic.c \ elements/audioecho.c elements/audiofirfilter.c \ elements/audioiirfilter.c elements/audioinvert.c \ elements/audiopanorama.c elements/audiowsincband.c \ elements/audiowsinclimit.c elements/autodetect.c \ elements/avimux.c elements/avisubtitle.c elements/capssetter.c \ elements/cmmldec.c elements/cmmlenc.c elements/deinterlace.c \ elements/deinterleave.c elements/equalizer.c \ elements/flacparse.c elements/flvdemux.c elements/flvmux.c \ elements/gdkpixbufsink.c elements/icydemux.c \ elements/id3demux.c elements/id3v2mux.c elements/imagefreeze.c \ elements/interleave.c elements/jpegenc.c elements/level.c \ elements/matroskamux.c elements/matroskaparse.c \ elements/mpegaudioparse.c elements/multifile.c \ elements/qtmux.c elements/rganalysis.c elements/rglimiter.c \ elements/rgvolume.c elements/rtp-payloading.c \ elements/rtpbin.c $(elements_rtpbin_buffer_list_SOURCES) \ elements/rtpjitterbuffer.c elements/shapewipe.c \ elements/souphttpsrc.c elements/spectrum.c elements/sunaudio.c \ elements/udpsink.c elements/videocrop.c elements/videofilter.c \ elements/wavpackdec.c elements/wavpackenc.c \ elements/wavpackparse.c elements/y4menc.c generic/index.c \ generic/states.c $(nodist_orc_deinterlace_SOURCES) \ $(nodist_orc_videobox_SOURCES) \ $(nodist_orc_videomixer_SOURCES) pipelines/effectv.c \ pipelines/flacdec.c pipelines/simple-launch-lines.c \ pipelines/tagschecking.c pipelines/wavenc.c \ pipelines/wavpack.c DIST_SOURCES = $(libparser_la_SOURCES) elements/aacparse.c \ elements/ac3parse.c elements/alphacolor.c elements/amrparse.c \ elements/apev2mux.c elements/aspectratiocrop.c \ elements/audioamplify.c elements/audiochebband.c \ elements/audiocheblimit.c elements/audiodynamic.c \ elements/audioecho.c elements/audiofirfilter.c \ elements/audioiirfilter.c elements/audioinvert.c \ elements/audiopanorama.c elements/audiowsincband.c \ elements/audiowsinclimit.c elements/autodetect.c \ elements/avimux.c elements/avisubtitle.c elements/capssetter.c \ elements/cmmldec.c elements/cmmlenc.c elements/deinterlace.c \ elements/deinterleave.c elements/equalizer.c \ elements/flacparse.c elements/flvdemux.c elements/flvmux.c \ elements/gdkpixbufsink.c elements/icydemux.c \ elements/id3demux.c elements/id3v2mux.c elements/imagefreeze.c \ elements/interleave.c elements/jpegenc.c elements/level.c \ elements/matroskamux.c elements/matroskaparse.c \ elements/mpegaudioparse.c elements/multifile.c \ elements/qtmux.c elements/rganalysis.c elements/rglimiter.c \ elements/rgvolume.c elements/rtp-payloading.c \ elements/rtpbin.c $(elements_rtpbin_buffer_list_SOURCES) \ elements/rtpjitterbuffer.c elements/shapewipe.c \ elements/souphttpsrc.c elements/spectrum.c elements/sunaudio.c \ elements/udpsink.c elements/videocrop.c elements/videofilter.c \ elements/wavpackdec.c elements/wavpackenc.c \ elements/wavpackparse.c elements/y4menc.c generic/index.c \ generic/states.c pipelines/effectv.c pipelines/flacdec.c \ pipelines/simple-launch-lines.c pipelines/tagschecking.c \ pipelines/wavenc.c pipelines/wavpack.c ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LOOPS = 10 # inspect every plugin feature GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_MAJORMINOR) CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg TEST_FILES_DIRECTORY = $(top_srcdir)/tests/files REGISTRY_ENVIRONMENT = \ GST_REGISTRY=$(CHECK_REGISTRY) TESTS_ENVIRONMENT = \ $(REGISTRY_ENVIRONMENT) \ GST_PLUGIN_SYSTEM_PATH= \ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/ext:$(top_builddir)/sys:$(GSTPB_PLUGINS_DIR):$(GST_PLUGINS_DIR) \ GST_PLUGIN_LOADING_WHITELIST="gstreamer@$(GST_PLUGINS_DIR):gst-plugins-base@$(GSTPB_PLUGINS_DIR):gst-plugins-good@$(top_builddir)" \ GST_STATE_IGNORE_ELEMENTS="aasink autoaudiosrc autoaudiosink autovideosrc autovideosink \ cacasink cairotextoverlay gconfaudiosrc gconfvideosrc gconfaudiosink gconfvideosink \ halaudiosrc halaudiosink jackaudiosrc jackaudiosink \ osssrc osssink osxaudiosink osxaudiosrc osxvideosrc osxvideosink \ pulsesink pulsesrc pulsemixer v4l2src" # fake device drivers: we could run hardware element tests against dummy drivers # v4l2: vivo (part of normal kernel) # modprobe vivo; # gst-launch v4l2src device="/dev/video1" ! xvimagesink; # rmmod vivo # # alsa: snd-dummy (part of normal alsa, not removable) # modprobe snd-dummy; # gst-launch alsasrc device="hw:2" ! fakesink # gst-launch fakesrc ! alsasink device="hw:2" # # need a way to figure out value for the device property # the core dumps of some machines have PIDs appended CLEANFILES = core.* test-registry.* @USE_ANNODEX_FALSE@check_annodex = @USE_ANNODEX_TRUE@check_annodex = \ @USE_ANNODEX_TRUE@ elements/cmmldec \ @USE_ANNODEX_TRUE@ elements/cmmlenc @USE_FLAC_FALSE@check_flac = @USE_FLAC_TRUE@check_flac = pipelines/flacdec @USE_GDK_PIXBUF_FALSE@check_gdkpixbuf = @USE_GDK_PIXBUF_TRUE@check_gdkpixbuf = elements/gdkpixbufsink @USE_JPEG_FALSE@check_jpeg = @USE_JPEG_TRUE@check_jpeg = elements/jpegenc @USE_SOUP_FALSE@check_soup = @USE_SOUP_TRUE@check_soup = elements/souphttpsrc @USE_SUNAUDIO_FALSE@check_sunaudio = @USE_SUNAUDIO_TRUE@check_sunaudio = elements/sunaudio @USE_TAGLIB_FALSE@check_taglib = @USE_TAGLIB_TRUE@check_taglib = \ @USE_TAGLIB_TRUE@ elements/id3v2mux \ @USE_TAGLIB_TRUE@ elements/apev2mux @USE_WAVPACK_FALSE@check_wavpack = @USE_WAVPACK_TRUE@check_wavpack = \ @USE_WAVPACK_TRUE@ elements/wavpackparse \ @USE_WAVPACK_TRUE@ elements/wavpackdec \ @USE_WAVPACK_TRUE@ elements/wavpackenc \ @USE_WAVPACK_TRUE@ pipelines/wavpack @HAVE_ORC_FALSE@check_orc = @HAVE_ORC_TRUE@check_orc = orc/deinterlace orc/videomixer orc/videobox VALGRIND_TO_FIX = \ elements/rtp-payloading TESTS = $(check_PROGRAMS) AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) \ $(GST_OPTION_CFLAGS) -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \ -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS LDADD = $(GST_OBJ_LIBS) $(GST_CHECK_LIBS) $(CHECK_LIBS) # valgrind testing # videocrop disabled since it takes way too long in valgrind VALGRIND_TESTS_DISABLE = \ elements/videocrop \ $(VALGRIND_TO_FIX) SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-good.supp # parser unit test convenience lib noinst_LTLIBRARIES = libparser.la libparser_la_SOURCES = elements/parser.c elements/parser.h libparser_la_CFLAGS = \ -I$(top_srcdir)/tests/check \ $(GST_CHECK_CFLAGS) $(GST_OPTION_CFLAGS) elements_aacparse_LDADD = libparser.la $(LDADD) elements_ac3parse_LDADD = libparser.la $(LDADD) elements_amrparse_LDADD = libparser.la $(LDADD) elements_flacparse_LDADD = libparser.la $(LDADD) elements_mpegaudioparse_LDADD = libparser.la $(LDADD) elements_aspectratiocrop_LDADD = $(LDADD) elements_aspectratiocrop_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_audiopanorama_LDADD = \ $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ $(LDADD) elements_audiopanorama_CFLAGS = \ $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ $(CFLAGS) $(AM_CFLAGS) elements_cmmldec_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_cmmlenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_alphacolor_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_deinterlace_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_deinterlace_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) elements_deinterleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_deinterleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) elements_interleave_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_interleave_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) elements_imagefreeze_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_imagefreeze_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LDADD) elements_jpegenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_jpegenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstapp-0.10 $(GST_BASE_LIBS) $(LDADD) elements_level_LDADD = $(LDADD) $(LIBM) elements_matroskamux_LDADD = $(GST_BASE_LIBS) $(LDADD) $(LIBM) elements_multifile_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) elements_multifile_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(LDADD) $(LIBM) elements_qtmux_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) elements_qtmux_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) elements_rtpbin_buffer_list_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ $(WARNING_CFLAGS) $(ERROR_CFLAGS) $(GST_CHECK_CFLAGS) $(AM_CFLAGS) elements_rtpbin_buffer_list_LDADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(GST_CHECK_LIBS) elements_rtpbin_buffer_list_SOURCES = elements/rtpbin_buffer_list.c elements_souphttpsrc_CFLAGS = $(SOUP_CFLAGS) $(AM_CFLAGS) elements_souphttpsrc_LDADD = $(SOUP_LIBS) $(LDADD) elements_sunaudio_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) \ $(AM_CFLAGS) elements_sunaudio_LDADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-@GST_MAJORMINOR@ \ $(LDADD) elements_videocrop_LDADD = $(GST_BASE_LIBS) $(LDADD) elements_videocrop_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_videofilter_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) elements_videofilter_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(LDADD) # FIXME: configure should check for gdk-pixbuf not gtk # only need video.h header, not the lib elements_gdkpixbufsink_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) $(GDK_PIXBUF_CFLAGS) elements_gdkpixbufsink_LDADD = \ $(LDADD) $(GDK_PIXBUF_LIBS) pipelines_wavenc_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) pipelines_wavenc_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LDADD) pipelines_wavpack_LDADD = $(LDADD) $(GST_BASE_LIBS) pipelines_wavpack_CFLAGS = $(GST_BASE_CFLAGS) $(CFLAGS) $(AM_CFLAGS) orc_deinterlace_CFLAGS = $(ORC_CFLAGS) orc_deinterlace_LDADD = $(ORC_LIBS) -lorc-test-0.4 nodist_orc_deinterlace_SOURCES = orc/deinterlace.c orc_videomixer_CFLAGS = $(ORC_CFLAGS) orc_videomixer_LDADD = $(ORC_LIBS) -lorc-test-0.4 nodist_orc_videomixer_SOURCES = orc/videomixer.c orc_videobox_CFLAGS = $(ORC_CFLAGS) orc_videobox_LDADD = $(ORC_LIBS) -lorc-test-0.4 nodist_orc_videobox_SOURCES = orc/videobox.c EXTRA_DIST = gst-plugins-good.supp all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/check.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/check/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/check/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/check.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libparser.la: $(libparser_la_OBJECTS) $(libparser_la_DEPENDENCIES) $(EXTRA_libparser_la_DEPENDENCIES) $(AM_V_CCLD)$(libparser_la_LINK) $(libparser_la_OBJECTS) $(libparser_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list elements/$(am__dirstamp): @$(MKDIR_P) elements @: > elements/$(am__dirstamp) elements/aacparse$(EXEEXT): $(elements_aacparse_OBJECTS) $(elements_aacparse_DEPENDENCIES) $(EXTRA_elements_aacparse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/aacparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_aacparse_OBJECTS) $(elements_aacparse_LDADD) $(LIBS) elements/ac3parse$(EXEEXT): $(elements_ac3parse_OBJECTS) $(elements_ac3parse_DEPENDENCIES) $(EXTRA_elements_ac3parse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/ac3parse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_ac3parse_OBJECTS) $(elements_ac3parse_LDADD) $(LIBS) elements/alphacolor$(EXEEXT): $(elements_alphacolor_OBJECTS) $(elements_alphacolor_DEPENDENCIES) $(EXTRA_elements_alphacolor_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/alphacolor$(EXEEXT) $(AM_V_CCLD)$(elements_alphacolor_LINK) $(elements_alphacolor_OBJECTS) $(elements_alphacolor_LDADD) $(LIBS) elements/amrparse$(EXEEXT): $(elements_amrparse_OBJECTS) $(elements_amrparse_DEPENDENCIES) $(EXTRA_elements_amrparse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/amrparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_amrparse_OBJECTS) $(elements_amrparse_LDADD) $(LIBS) elements/apev2mux$(EXEEXT): $(elements_apev2mux_OBJECTS) $(elements_apev2mux_DEPENDENCIES) $(EXTRA_elements_apev2mux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/apev2mux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_apev2mux_OBJECTS) $(elements_apev2mux_LDADD) $(LIBS) elements/aspectratiocrop$(EXEEXT): $(elements_aspectratiocrop_OBJECTS) $(elements_aspectratiocrop_DEPENDENCIES) $(EXTRA_elements_aspectratiocrop_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/aspectratiocrop$(EXEEXT) $(AM_V_CCLD)$(elements_aspectratiocrop_LINK) $(elements_aspectratiocrop_OBJECTS) $(elements_aspectratiocrop_LDADD) $(LIBS) elements/audioamplify$(EXEEXT): $(elements_audioamplify_OBJECTS) $(elements_audioamplify_DEPENDENCIES) $(EXTRA_elements_audioamplify_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audioamplify$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audioamplify_OBJECTS) $(elements_audioamplify_LDADD) $(LIBS) elements/audiochebband$(EXEEXT): $(elements_audiochebband_OBJECTS) $(elements_audiochebband_DEPENDENCIES) $(EXTRA_elements_audiochebband_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiochebband$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audiochebband_OBJECTS) $(elements_audiochebband_LDADD) $(LIBS) elements/audiocheblimit$(EXEEXT): $(elements_audiocheblimit_OBJECTS) $(elements_audiocheblimit_DEPENDENCIES) $(EXTRA_elements_audiocheblimit_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiocheblimit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audiocheblimit_OBJECTS) $(elements_audiocheblimit_LDADD) $(LIBS) elements/audiodynamic$(EXEEXT): $(elements_audiodynamic_OBJECTS) $(elements_audiodynamic_DEPENDENCIES) $(EXTRA_elements_audiodynamic_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiodynamic$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audiodynamic_OBJECTS) $(elements_audiodynamic_LDADD) $(LIBS) elements/audioecho$(EXEEXT): $(elements_audioecho_OBJECTS) $(elements_audioecho_DEPENDENCIES) $(EXTRA_elements_audioecho_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audioecho$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audioecho_OBJECTS) $(elements_audioecho_LDADD) $(LIBS) elements/audiofirfilter$(EXEEXT): $(elements_audiofirfilter_OBJECTS) $(elements_audiofirfilter_DEPENDENCIES) $(EXTRA_elements_audiofirfilter_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiofirfilter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audiofirfilter_OBJECTS) $(elements_audiofirfilter_LDADD) $(LIBS) elements/audioiirfilter$(EXEEXT): $(elements_audioiirfilter_OBJECTS) $(elements_audioiirfilter_DEPENDENCIES) $(EXTRA_elements_audioiirfilter_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audioiirfilter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audioiirfilter_OBJECTS) $(elements_audioiirfilter_LDADD) $(LIBS) elements/audioinvert$(EXEEXT): $(elements_audioinvert_OBJECTS) $(elements_audioinvert_DEPENDENCIES) $(EXTRA_elements_audioinvert_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audioinvert$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audioinvert_OBJECTS) $(elements_audioinvert_LDADD) $(LIBS) elements/audiopanorama$(EXEEXT): $(elements_audiopanorama_OBJECTS) $(elements_audiopanorama_DEPENDENCIES) $(EXTRA_elements_audiopanorama_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiopanorama$(EXEEXT) $(AM_V_CCLD)$(elements_audiopanorama_LINK) $(elements_audiopanorama_OBJECTS) $(elements_audiopanorama_LDADD) $(LIBS) elements/audiowsincband$(EXEEXT): $(elements_audiowsincband_OBJECTS) $(elements_audiowsincband_DEPENDENCIES) $(EXTRA_elements_audiowsincband_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiowsincband$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audiowsincband_OBJECTS) $(elements_audiowsincband_LDADD) $(LIBS) elements/audiowsinclimit$(EXEEXT): $(elements_audiowsinclimit_OBJECTS) $(elements_audiowsinclimit_DEPENDENCIES) $(EXTRA_elements_audiowsinclimit_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/audiowsinclimit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_audiowsinclimit_OBJECTS) $(elements_audiowsinclimit_LDADD) $(LIBS) elements/autodetect$(EXEEXT): $(elements_autodetect_OBJECTS) $(elements_autodetect_DEPENDENCIES) $(EXTRA_elements_autodetect_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/autodetect$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_autodetect_OBJECTS) $(elements_autodetect_LDADD) $(LIBS) elements/avimux$(EXEEXT): $(elements_avimux_OBJECTS) $(elements_avimux_DEPENDENCIES) $(EXTRA_elements_avimux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/avimux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_avimux_OBJECTS) $(elements_avimux_LDADD) $(LIBS) elements/avisubtitle$(EXEEXT): $(elements_avisubtitle_OBJECTS) $(elements_avisubtitle_DEPENDENCIES) $(EXTRA_elements_avisubtitle_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/avisubtitle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_avisubtitle_OBJECTS) $(elements_avisubtitle_LDADD) $(LIBS) elements/capssetter$(EXEEXT): $(elements_capssetter_OBJECTS) $(elements_capssetter_DEPENDENCIES) $(EXTRA_elements_capssetter_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/capssetter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_capssetter_OBJECTS) $(elements_capssetter_LDADD) $(LIBS) elements/cmmldec$(EXEEXT): $(elements_cmmldec_OBJECTS) $(elements_cmmldec_DEPENDENCIES) $(EXTRA_elements_cmmldec_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/cmmldec$(EXEEXT) $(AM_V_CCLD)$(elements_cmmldec_LINK) $(elements_cmmldec_OBJECTS) $(elements_cmmldec_LDADD) $(LIBS) elements/cmmlenc$(EXEEXT): $(elements_cmmlenc_OBJECTS) $(elements_cmmlenc_DEPENDENCIES) $(EXTRA_elements_cmmlenc_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/cmmlenc$(EXEEXT) $(AM_V_CCLD)$(elements_cmmlenc_LINK) $(elements_cmmlenc_OBJECTS) $(elements_cmmlenc_LDADD) $(LIBS) elements/deinterlace$(EXEEXT): $(elements_deinterlace_OBJECTS) $(elements_deinterlace_DEPENDENCIES) $(EXTRA_elements_deinterlace_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/deinterlace$(EXEEXT) $(AM_V_CCLD)$(elements_deinterlace_LINK) $(elements_deinterlace_OBJECTS) $(elements_deinterlace_LDADD) $(LIBS) elements/deinterleave$(EXEEXT): $(elements_deinterleave_OBJECTS) $(elements_deinterleave_DEPENDENCIES) $(EXTRA_elements_deinterleave_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/deinterleave$(EXEEXT) $(AM_V_CCLD)$(elements_deinterleave_LINK) $(elements_deinterleave_OBJECTS) $(elements_deinterleave_LDADD) $(LIBS) elements/equalizer$(EXEEXT): $(elements_equalizer_OBJECTS) $(elements_equalizer_DEPENDENCIES) $(EXTRA_elements_equalizer_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/equalizer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_equalizer_OBJECTS) $(elements_equalizer_LDADD) $(LIBS) elements/flacparse$(EXEEXT): $(elements_flacparse_OBJECTS) $(elements_flacparse_DEPENDENCIES) $(EXTRA_elements_flacparse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/flacparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_flacparse_OBJECTS) $(elements_flacparse_LDADD) $(LIBS) elements/flvdemux$(EXEEXT): $(elements_flvdemux_OBJECTS) $(elements_flvdemux_DEPENDENCIES) $(EXTRA_elements_flvdemux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/flvdemux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_flvdemux_OBJECTS) $(elements_flvdemux_LDADD) $(LIBS) elements/flvmux$(EXEEXT): $(elements_flvmux_OBJECTS) $(elements_flvmux_DEPENDENCIES) $(EXTRA_elements_flvmux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/flvmux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_flvmux_OBJECTS) $(elements_flvmux_LDADD) $(LIBS) elements/gdkpixbufsink$(EXEEXT): $(elements_gdkpixbufsink_OBJECTS) $(elements_gdkpixbufsink_DEPENDENCIES) $(EXTRA_elements_gdkpixbufsink_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/gdkpixbufsink$(EXEEXT) $(AM_V_CCLD)$(elements_gdkpixbufsink_LINK) $(elements_gdkpixbufsink_OBJECTS) $(elements_gdkpixbufsink_LDADD) $(LIBS) elements/icydemux$(EXEEXT): $(elements_icydemux_OBJECTS) $(elements_icydemux_DEPENDENCIES) $(EXTRA_elements_icydemux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/icydemux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_icydemux_OBJECTS) $(elements_icydemux_LDADD) $(LIBS) elements/id3demux$(EXEEXT): $(elements_id3demux_OBJECTS) $(elements_id3demux_DEPENDENCIES) $(EXTRA_elements_id3demux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/id3demux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_id3demux_OBJECTS) $(elements_id3demux_LDADD) $(LIBS) elements/id3v2mux$(EXEEXT): $(elements_id3v2mux_OBJECTS) $(elements_id3v2mux_DEPENDENCIES) $(EXTRA_elements_id3v2mux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/id3v2mux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_id3v2mux_OBJECTS) $(elements_id3v2mux_LDADD) $(LIBS) elements/imagefreeze$(EXEEXT): $(elements_imagefreeze_OBJECTS) $(elements_imagefreeze_DEPENDENCIES) $(EXTRA_elements_imagefreeze_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/imagefreeze$(EXEEXT) $(AM_V_CCLD)$(elements_imagefreeze_LINK) $(elements_imagefreeze_OBJECTS) $(elements_imagefreeze_LDADD) $(LIBS) elements/interleave$(EXEEXT): $(elements_interleave_OBJECTS) $(elements_interleave_DEPENDENCIES) $(EXTRA_elements_interleave_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/interleave$(EXEEXT) $(AM_V_CCLD)$(elements_interleave_LINK) $(elements_interleave_OBJECTS) $(elements_interleave_LDADD) $(LIBS) elements/jpegenc$(EXEEXT): $(elements_jpegenc_OBJECTS) $(elements_jpegenc_DEPENDENCIES) $(EXTRA_elements_jpegenc_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/jpegenc$(EXEEXT) $(AM_V_CCLD)$(elements_jpegenc_LINK) $(elements_jpegenc_OBJECTS) $(elements_jpegenc_LDADD) $(LIBS) elements/level$(EXEEXT): $(elements_level_OBJECTS) $(elements_level_DEPENDENCIES) $(EXTRA_elements_level_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/level$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_level_OBJECTS) $(elements_level_LDADD) $(LIBS) elements/matroskamux$(EXEEXT): $(elements_matroskamux_OBJECTS) $(elements_matroskamux_DEPENDENCIES) $(EXTRA_elements_matroskamux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/matroskamux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_matroskamux_OBJECTS) $(elements_matroskamux_LDADD) $(LIBS) elements/matroskaparse$(EXEEXT): $(elements_matroskaparse_OBJECTS) $(elements_matroskaparse_DEPENDENCIES) $(EXTRA_elements_matroskaparse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/matroskaparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_matroskaparse_OBJECTS) $(elements_matroskaparse_LDADD) $(LIBS) elements/mpegaudioparse$(EXEEXT): $(elements_mpegaudioparse_OBJECTS) $(elements_mpegaudioparse_DEPENDENCIES) $(EXTRA_elements_mpegaudioparse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/mpegaudioparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_mpegaudioparse_OBJECTS) $(elements_mpegaudioparse_LDADD) $(LIBS) elements/multifile$(EXEEXT): $(elements_multifile_OBJECTS) $(elements_multifile_DEPENDENCIES) $(EXTRA_elements_multifile_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/multifile$(EXEEXT) $(AM_V_CCLD)$(elements_multifile_LINK) $(elements_multifile_OBJECTS) $(elements_multifile_LDADD) $(LIBS) elements/qtmux$(EXEEXT): $(elements_qtmux_OBJECTS) $(elements_qtmux_DEPENDENCIES) $(EXTRA_elements_qtmux_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/qtmux$(EXEEXT) $(AM_V_CCLD)$(elements_qtmux_LINK) $(elements_qtmux_OBJECTS) $(elements_qtmux_LDADD) $(LIBS) elements/rganalysis$(EXEEXT): $(elements_rganalysis_OBJECTS) $(elements_rganalysis_DEPENDENCIES) $(EXTRA_elements_rganalysis_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rganalysis$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_rganalysis_OBJECTS) $(elements_rganalysis_LDADD) $(LIBS) elements/rglimiter$(EXEEXT): $(elements_rglimiter_OBJECTS) $(elements_rglimiter_DEPENDENCIES) $(EXTRA_elements_rglimiter_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rglimiter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_rglimiter_OBJECTS) $(elements_rglimiter_LDADD) $(LIBS) elements/rgvolume$(EXEEXT): $(elements_rgvolume_OBJECTS) $(elements_rgvolume_DEPENDENCIES) $(EXTRA_elements_rgvolume_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rgvolume$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_rgvolume_OBJECTS) $(elements_rgvolume_LDADD) $(LIBS) elements/rtp-payloading$(EXEEXT): $(elements_rtp_payloading_OBJECTS) $(elements_rtp_payloading_DEPENDENCIES) $(EXTRA_elements_rtp_payloading_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rtp-payloading$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_rtp_payloading_OBJECTS) $(elements_rtp_payloading_LDADD) $(LIBS) elements/rtpbin$(EXEEXT): $(elements_rtpbin_OBJECTS) $(elements_rtpbin_DEPENDENCIES) $(EXTRA_elements_rtpbin_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rtpbin$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_rtpbin_OBJECTS) $(elements_rtpbin_LDADD) $(LIBS) elements/rtpbin_buffer_list$(EXEEXT): $(elements_rtpbin_buffer_list_OBJECTS) $(elements_rtpbin_buffer_list_DEPENDENCIES) $(EXTRA_elements_rtpbin_buffer_list_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rtpbin_buffer_list$(EXEEXT) $(AM_V_CCLD)$(elements_rtpbin_buffer_list_LINK) $(elements_rtpbin_buffer_list_OBJECTS) $(elements_rtpbin_buffer_list_LDADD) $(LIBS) elements/rtpjitterbuffer$(EXEEXT): $(elements_rtpjitterbuffer_OBJECTS) $(elements_rtpjitterbuffer_DEPENDENCIES) $(EXTRA_elements_rtpjitterbuffer_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/rtpjitterbuffer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_rtpjitterbuffer_OBJECTS) $(elements_rtpjitterbuffer_LDADD) $(LIBS) elements/shapewipe$(EXEEXT): $(elements_shapewipe_OBJECTS) $(elements_shapewipe_DEPENDENCIES) $(EXTRA_elements_shapewipe_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/shapewipe$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_shapewipe_OBJECTS) $(elements_shapewipe_LDADD) $(LIBS) elements/souphttpsrc$(EXEEXT): $(elements_souphttpsrc_OBJECTS) $(elements_souphttpsrc_DEPENDENCIES) $(EXTRA_elements_souphttpsrc_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/souphttpsrc$(EXEEXT) $(AM_V_CCLD)$(elements_souphttpsrc_LINK) $(elements_souphttpsrc_OBJECTS) $(elements_souphttpsrc_LDADD) $(LIBS) elements/spectrum$(EXEEXT): $(elements_spectrum_OBJECTS) $(elements_spectrum_DEPENDENCIES) $(EXTRA_elements_spectrum_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/spectrum$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_spectrum_OBJECTS) $(elements_spectrum_LDADD) $(LIBS) elements/sunaudio$(EXEEXT): $(elements_sunaudio_OBJECTS) $(elements_sunaudio_DEPENDENCIES) $(EXTRA_elements_sunaudio_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/sunaudio$(EXEEXT) $(AM_V_CCLD)$(elements_sunaudio_LINK) $(elements_sunaudio_OBJECTS) $(elements_sunaudio_LDADD) $(LIBS) elements/udpsink$(EXEEXT): $(elements_udpsink_OBJECTS) $(elements_udpsink_DEPENDENCIES) $(EXTRA_elements_udpsink_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/udpsink$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_udpsink_OBJECTS) $(elements_udpsink_LDADD) $(LIBS) elements/videocrop$(EXEEXT): $(elements_videocrop_OBJECTS) $(elements_videocrop_DEPENDENCIES) $(EXTRA_elements_videocrop_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/videocrop$(EXEEXT) $(AM_V_CCLD)$(elements_videocrop_LINK) $(elements_videocrop_OBJECTS) $(elements_videocrop_LDADD) $(LIBS) elements/videofilter$(EXEEXT): $(elements_videofilter_OBJECTS) $(elements_videofilter_DEPENDENCIES) $(EXTRA_elements_videofilter_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/videofilter$(EXEEXT) $(AM_V_CCLD)$(elements_videofilter_LINK) $(elements_videofilter_OBJECTS) $(elements_videofilter_LDADD) $(LIBS) elements/wavpackdec$(EXEEXT): $(elements_wavpackdec_OBJECTS) $(elements_wavpackdec_DEPENDENCIES) $(EXTRA_elements_wavpackdec_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/wavpackdec$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_wavpackdec_OBJECTS) $(elements_wavpackdec_LDADD) $(LIBS) elements/wavpackenc$(EXEEXT): $(elements_wavpackenc_OBJECTS) $(elements_wavpackenc_DEPENDENCIES) $(EXTRA_elements_wavpackenc_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/wavpackenc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_wavpackenc_OBJECTS) $(elements_wavpackenc_LDADD) $(LIBS) elements/wavpackparse$(EXEEXT): $(elements_wavpackparse_OBJECTS) $(elements_wavpackparse_DEPENDENCIES) $(EXTRA_elements_wavpackparse_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/wavpackparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_wavpackparse_OBJECTS) $(elements_wavpackparse_LDADD) $(LIBS) elements/y4menc$(EXEEXT): $(elements_y4menc_OBJECTS) $(elements_y4menc_DEPENDENCIES) $(EXTRA_elements_y4menc_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/y4menc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(elements_y4menc_OBJECTS) $(elements_y4menc_LDADD) $(LIBS) generic/$(am__dirstamp): @$(MKDIR_P) generic @: > generic/$(am__dirstamp) generic/index$(EXEEXT): $(generic_index_OBJECTS) $(generic_index_DEPENDENCIES) $(EXTRA_generic_index_DEPENDENCIES) generic/$(am__dirstamp) @rm -f generic/index$(EXEEXT) $(AM_V_CCLD)$(LINK) $(generic_index_OBJECTS) $(generic_index_LDADD) $(LIBS) generic/states$(EXEEXT): $(generic_states_OBJECTS) $(generic_states_DEPENDENCIES) $(EXTRA_generic_states_DEPENDENCIES) generic/$(am__dirstamp) @rm -f generic/states$(EXEEXT) $(AM_V_CCLD)$(LINK) $(generic_states_OBJECTS) $(generic_states_LDADD) $(LIBS) orc/$(am__dirstamp): @$(MKDIR_P) orc @: > orc/$(am__dirstamp) orc/deinterlace$(EXEEXT): $(orc_deinterlace_OBJECTS) $(orc_deinterlace_DEPENDENCIES) $(EXTRA_orc_deinterlace_DEPENDENCIES) orc/$(am__dirstamp) @rm -f orc/deinterlace$(EXEEXT) $(AM_V_CCLD)$(orc_deinterlace_LINK) $(orc_deinterlace_OBJECTS) $(orc_deinterlace_LDADD) $(LIBS) orc/videobox$(EXEEXT): $(orc_videobox_OBJECTS) $(orc_videobox_DEPENDENCIES) $(EXTRA_orc_videobox_DEPENDENCIES) orc/$(am__dirstamp) @rm -f orc/videobox$(EXEEXT) $(AM_V_CCLD)$(orc_videobox_LINK) $(orc_videobox_OBJECTS) $(orc_videobox_LDADD) $(LIBS) orc/videomixer$(EXEEXT): $(orc_videomixer_OBJECTS) $(orc_videomixer_DEPENDENCIES) $(EXTRA_orc_videomixer_DEPENDENCIES) orc/$(am__dirstamp) @rm -f orc/videomixer$(EXEEXT) $(AM_V_CCLD)$(orc_videomixer_LINK) $(orc_videomixer_OBJECTS) $(orc_videomixer_LDADD) $(LIBS) pipelines/$(am__dirstamp): @$(MKDIR_P) pipelines @: > pipelines/$(am__dirstamp) pipelines/effectv$(EXEEXT): $(pipelines_effectv_OBJECTS) $(pipelines_effectv_DEPENDENCIES) $(EXTRA_pipelines_effectv_DEPENDENCIES) pipelines/$(am__dirstamp) @rm -f pipelines/effectv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pipelines_effectv_OBJECTS) $(pipelines_effectv_LDADD) $(LIBS) pipelines/flacdec$(EXEEXT): $(pipelines_flacdec_OBJECTS) $(pipelines_flacdec_DEPENDENCIES) $(EXTRA_pipelines_flacdec_DEPENDENCIES) pipelines/$(am__dirstamp) @rm -f pipelines/flacdec$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pipelines_flacdec_OBJECTS) $(pipelines_flacdec_LDADD) $(LIBS) pipelines/simple-launch-lines$(EXEEXT): $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_DEPENDENCIES) $(EXTRA_pipelines_simple_launch_lines_DEPENDENCIES) pipelines/$(am__dirstamp) @rm -f pipelines/simple-launch-lines$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_LDADD) $(LIBS) pipelines/tagschecking$(EXEEXT): $(pipelines_tagschecking_OBJECTS) $(pipelines_tagschecking_DEPENDENCIES) $(EXTRA_pipelines_tagschecking_DEPENDENCIES) pipelines/$(am__dirstamp) @rm -f pipelines/tagschecking$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pipelines_tagschecking_OBJECTS) $(pipelines_tagschecking_LDADD) $(LIBS) pipelines/wavenc$(EXEEXT): $(pipelines_wavenc_OBJECTS) $(pipelines_wavenc_DEPENDENCIES) $(EXTRA_pipelines_wavenc_DEPENDENCIES) pipelines/$(am__dirstamp) @rm -f pipelines/wavenc$(EXEEXT) $(AM_V_CCLD)$(pipelines_wavenc_LINK) $(pipelines_wavenc_OBJECTS) $(pipelines_wavenc_LDADD) $(LIBS) pipelines/wavpack$(EXEEXT): $(pipelines_wavpack_OBJECTS) $(pipelines_wavpack_DEPENDENCIES) $(EXTRA_pipelines_wavpack_DEPENDENCIES) pipelines/$(am__dirstamp) @rm -f pipelines/wavpack$(EXEEXT) $(AM_V_CCLD)$(pipelines_wavpack_LINK) $(pipelines_wavpack_OBJECTS) $(pipelines_wavpack_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aacparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ac3parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amrparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apev2mux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioamplify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiochebband.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiocheblimit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiodynamic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioecho.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiofirfilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioiirfilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audioinvert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiowsincband.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audiowsinclimit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autodetect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avimux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avisubtitle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capssetter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/effectv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_alphacolor-alphacolor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_audiopanorama-audiopanorama.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_cmmldec-cmmldec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_cmmlenc-cmmlenc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_deinterlace-deinterlace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_deinterleave-deinterleave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_imagefreeze-imagefreeze.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_interleave-interleave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_jpegenc-jpegenc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_multifile-multifile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_qtmux-qtmux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_souphttpsrc-souphttpsrc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_sunaudio-sunaudio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_videocrop-videocrop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_videofilter-videofilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equalizer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flacdec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flacparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flvdemux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flvmux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icydemux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3demux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3v2mux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/index.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/level.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libparser_la-parser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matroskamux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matroskaparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpegaudioparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_deinterlace-deinterlace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_videobox-videobox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orc_videomixer-videomixer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_wavenc-wavenc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipelines_wavpack-wavpack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rganalysis.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rglimiter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgvolume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtp-payloading.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpbin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpjitterbuffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shapewipe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-launch-lines.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spectrum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/states.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tagschecking.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udpsink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavpackdec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavpackenc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavpackparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/y4menc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libparser_la-parser.lo: elements/parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libparser_la_CFLAGS) $(CFLAGS) -MT libparser_la-parser.lo -MD -MP -MF $(DEPDIR)/libparser_la-parser.Tpo -c -o libparser_la-parser.lo `test -f 'elements/parser.c' || echo '$(srcdir)/'`elements/parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libparser_la-parser.Tpo $(DEPDIR)/libparser_la-parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/parser.c' object='libparser_la-parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libparser_la_CFLAGS) $(CFLAGS) -c -o libparser_la-parser.lo `test -f 'elements/parser.c' || echo '$(srcdir)/'`elements/parser.c aacparse.o: elements/aacparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT aacparse.o -MD -MP -MF $(DEPDIR)/aacparse.Tpo -c -o aacparse.o `test -f 'elements/aacparse.c' || echo '$(srcdir)/'`elements/aacparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aacparse.Tpo $(DEPDIR)/aacparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aacparse.c' object='aacparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o aacparse.o `test -f 'elements/aacparse.c' || echo '$(srcdir)/'`elements/aacparse.c aacparse.obj: elements/aacparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT aacparse.obj -MD -MP -MF $(DEPDIR)/aacparse.Tpo -c -o aacparse.obj `if test -f 'elements/aacparse.c'; then $(CYGPATH_W) 'elements/aacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/aacparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/aacparse.Tpo $(DEPDIR)/aacparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aacparse.c' object='aacparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o aacparse.obj `if test -f 'elements/aacparse.c'; then $(CYGPATH_W) 'elements/aacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/aacparse.c'; fi` ac3parse.o: elements/ac3parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ac3parse.o -MD -MP -MF $(DEPDIR)/ac3parse.Tpo -c -o ac3parse.o `test -f 'elements/ac3parse.c' || echo '$(srcdir)/'`elements/ac3parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ac3parse.Tpo $(DEPDIR)/ac3parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/ac3parse.c' object='ac3parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ac3parse.o `test -f 'elements/ac3parse.c' || echo '$(srcdir)/'`elements/ac3parse.c ac3parse.obj: elements/ac3parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ac3parse.obj -MD -MP -MF $(DEPDIR)/ac3parse.Tpo -c -o ac3parse.obj `if test -f 'elements/ac3parse.c'; then $(CYGPATH_W) 'elements/ac3parse.c'; else $(CYGPATH_W) '$(srcdir)/elements/ac3parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ac3parse.Tpo $(DEPDIR)/ac3parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/ac3parse.c' object='ac3parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ac3parse.obj `if test -f 'elements/ac3parse.c'; then $(CYGPATH_W) 'elements/ac3parse.c'; else $(CYGPATH_W) '$(srcdir)/elements/ac3parse.c'; fi` elements_alphacolor-alphacolor.o: elements/alphacolor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -MT elements_alphacolor-alphacolor.o -MD -MP -MF $(DEPDIR)/elements_alphacolor-alphacolor.Tpo -c -o elements_alphacolor-alphacolor.o `test -f 'elements/alphacolor.c' || echo '$(srcdir)/'`elements/alphacolor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_alphacolor-alphacolor.Tpo $(DEPDIR)/elements_alphacolor-alphacolor.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/alphacolor.c' object='elements_alphacolor-alphacolor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -c -o elements_alphacolor-alphacolor.o `test -f 'elements/alphacolor.c' || echo '$(srcdir)/'`elements/alphacolor.c elements_alphacolor-alphacolor.obj: elements/alphacolor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -MT elements_alphacolor-alphacolor.obj -MD -MP -MF $(DEPDIR)/elements_alphacolor-alphacolor.Tpo -c -o elements_alphacolor-alphacolor.obj `if test -f 'elements/alphacolor.c'; then $(CYGPATH_W) 'elements/alphacolor.c'; else $(CYGPATH_W) '$(srcdir)/elements/alphacolor.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_alphacolor-alphacolor.Tpo $(DEPDIR)/elements_alphacolor-alphacolor.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/alphacolor.c' object='elements_alphacolor-alphacolor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_alphacolor_CFLAGS) $(CFLAGS) -c -o elements_alphacolor-alphacolor.obj `if test -f 'elements/alphacolor.c'; then $(CYGPATH_W) 'elements/alphacolor.c'; else $(CYGPATH_W) '$(srcdir)/elements/alphacolor.c'; fi` amrparse.o: elements/amrparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT amrparse.o -MD -MP -MF $(DEPDIR)/amrparse.Tpo -c -o amrparse.o `test -f 'elements/amrparse.c' || echo '$(srcdir)/'`elements/amrparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/amrparse.Tpo $(DEPDIR)/amrparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/amrparse.c' object='amrparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o amrparse.o `test -f 'elements/amrparse.c' || echo '$(srcdir)/'`elements/amrparse.c amrparse.obj: elements/amrparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT amrparse.obj -MD -MP -MF $(DEPDIR)/amrparse.Tpo -c -o amrparse.obj `if test -f 'elements/amrparse.c'; then $(CYGPATH_W) 'elements/amrparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/amrparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/amrparse.Tpo $(DEPDIR)/amrparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/amrparse.c' object='amrparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o amrparse.obj `if test -f 'elements/amrparse.c'; then $(CYGPATH_W) 'elements/amrparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/amrparse.c'; fi` apev2mux.o: elements/apev2mux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT apev2mux.o -MD -MP -MF $(DEPDIR)/apev2mux.Tpo -c -o apev2mux.o `test -f 'elements/apev2mux.c' || echo '$(srcdir)/'`elements/apev2mux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/apev2mux.Tpo $(DEPDIR)/apev2mux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/apev2mux.c' object='apev2mux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o apev2mux.o `test -f 'elements/apev2mux.c' || echo '$(srcdir)/'`elements/apev2mux.c apev2mux.obj: elements/apev2mux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT apev2mux.obj -MD -MP -MF $(DEPDIR)/apev2mux.Tpo -c -o apev2mux.obj `if test -f 'elements/apev2mux.c'; then $(CYGPATH_W) 'elements/apev2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/apev2mux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/apev2mux.Tpo $(DEPDIR)/apev2mux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/apev2mux.c' object='apev2mux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o apev2mux.obj `if test -f 'elements/apev2mux.c'; then $(CYGPATH_W) 'elements/apev2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/apev2mux.c'; fi` elements_aspectratiocrop-aspectratiocrop.o: elements/aspectratiocrop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -MT elements_aspectratiocrop-aspectratiocrop.o -MD -MP -MF $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo -c -o elements_aspectratiocrop-aspectratiocrop.o `test -f 'elements/aspectratiocrop.c' || echo '$(srcdir)/'`elements/aspectratiocrop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aspectratiocrop.c' object='elements_aspectratiocrop-aspectratiocrop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -c -o elements_aspectratiocrop-aspectratiocrop.o `test -f 'elements/aspectratiocrop.c' || echo '$(srcdir)/'`elements/aspectratiocrop.c elements_aspectratiocrop-aspectratiocrop.obj: elements/aspectratiocrop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -MT elements_aspectratiocrop-aspectratiocrop.obj -MD -MP -MF $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo -c -o elements_aspectratiocrop-aspectratiocrop.obj `if test -f 'elements/aspectratiocrop.c'; then $(CYGPATH_W) 'elements/aspectratiocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/aspectratiocrop.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Tpo $(DEPDIR)/elements_aspectratiocrop-aspectratiocrop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/aspectratiocrop.c' object='elements_aspectratiocrop-aspectratiocrop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_aspectratiocrop_CFLAGS) $(CFLAGS) -c -o elements_aspectratiocrop-aspectratiocrop.obj `if test -f 'elements/aspectratiocrop.c'; then $(CYGPATH_W) 'elements/aspectratiocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/aspectratiocrop.c'; fi` audioamplify.o: elements/audioamplify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioamplify.o -MD -MP -MF $(DEPDIR)/audioamplify.Tpo -c -o audioamplify.o `test -f 'elements/audioamplify.c' || echo '$(srcdir)/'`elements/audioamplify.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioamplify.Tpo $(DEPDIR)/audioamplify.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioamplify.c' object='audioamplify.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioamplify.o `test -f 'elements/audioamplify.c' || echo '$(srcdir)/'`elements/audioamplify.c audioamplify.obj: elements/audioamplify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioamplify.obj -MD -MP -MF $(DEPDIR)/audioamplify.Tpo -c -o audioamplify.obj `if test -f 'elements/audioamplify.c'; then $(CYGPATH_W) 'elements/audioamplify.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioamplify.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioamplify.Tpo $(DEPDIR)/audioamplify.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioamplify.c' object='audioamplify.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioamplify.obj `if test -f 'elements/audioamplify.c'; then $(CYGPATH_W) 'elements/audioamplify.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioamplify.c'; fi` audiochebband.o: elements/audiochebband.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiochebband.o -MD -MP -MF $(DEPDIR)/audiochebband.Tpo -c -o audiochebband.o `test -f 'elements/audiochebband.c' || echo '$(srcdir)/'`elements/audiochebband.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiochebband.Tpo $(DEPDIR)/audiochebband.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiochebband.c' object='audiochebband.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiochebband.o `test -f 'elements/audiochebband.c' || echo '$(srcdir)/'`elements/audiochebband.c audiochebband.obj: elements/audiochebband.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiochebband.obj -MD -MP -MF $(DEPDIR)/audiochebband.Tpo -c -o audiochebband.obj `if test -f 'elements/audiochebband.c'; then $(CYGPATH_W) 'elements/audiochebband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiochebband.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiochebband.Tpo $(DEPDIR)/audiochebband.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiochebband.c' object='audiochebband.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiochebband.obj `if test -f 'elements/audiochebband.c'; then $(CYGPATH_W) 'elements/audiochebband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiochebband.c'; fi` audiocheblimit.o: elements/audiocheblimit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiocheblimit.o -MD -MP -MF $(DEPDIR)/audiocheblimit.Tpo -c -o audiocheblimit.o `test -f 'elements/audiocheblimit.c' || echo '$(srcdir)/'`elements/audiocheblimit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiocheblimit.Tpo $(DEPDIR)/audiocheblimit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiocheblimit.c' object='audiocheblimit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiocheblimit.o `test -f 'elements/audiocheblimit.c' || echo '$(srcdir)/'`elements/audiocheblimit.c audiocheblimit.obj: elements/audiocheblimit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiocheblimit.obj -MD -MP -MF $(DEPDIR)/audiocheblimit.Tpo -c -o audiocheblimit.obj `if test -f 'elements/audiocheblimit.c'; then $(CYGPATH_W) 'elements/audiocheblimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiocheblimit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiocheblimit.Tpo $(DEPDIR)/audiocheblimit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiocheblimit.c' object='audiocheblimit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiocheblimit.obj `if test -f 'elements/audiocheblimit.c'; then $(CYGPATH_W) 'elements/audiocheblimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiocheblimit.c'; fi` audiodynamic.o: elements/audiodynamic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiodynamic.o -MD -MP -MF $(DEPDIR)/audiodynamic.Tpo -c -o audiodynamic.o `test -f 'elements/audiodynamic.c' || echo '$(srcdir)/'`elements/audiodynamic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiodynamic.Tpo $(DEPDIR)/audiodynamic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiodynamic.c' object='audiodynamic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiodynamic.o `test -f 'elements/audiodynamic.c' || echo '$(srcdir)/'`elements/audiodynamic.c audiodynamic.obj: elements/audiodynamic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiodynamic.obj -MD -MP -MF $(DEPDIR)/audiodynamic.Tpo -c -o audiodynamic.obj `if test -f 'elements/audiodynamic.c'; then $(CYGPATH_W) 'elements/audiodynamic.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiodynamic.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiodynamic.Tpo $(DEPDIR)/audiodynamic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiodynamic.c' object='audiodynamic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiodynamic.obj `if test -f 'elements/audiodynamic.c'; then $(CYGPATH_W) 'elements/audiodynamic.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiodynamic.c'; fi` audioecho.o: elements/audioecho.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioecho.o -MD -MP -MF $(DEPDIR)/audioecho.Tpo -c -o audioecho.o `test -f 'elements/audioecho.c' || echo '$(srcdir)/'`elements/audioecho.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioecho.Tpo $(DEPDIR)/audioecho.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioecho.c' object='audioecho.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioecho.o `test -f 'elements/audioecho.c' || echo '$(srcdir)/'`elements/audioecho.c audioecho.obj: elements/audioecho.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioecho.obj -MD -MP -MF $(DEPDIR)/audioecho.Tpo -c -o audioecho.obj `if test -f 'elements/audioecho.c'; then $(CYGPATH_W) 'elements/audioecho.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioecho.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioecho.Tpo $(DEPDIR)/audioecho.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioecho.c' object='audioecho.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioecho.obj `if test -f 'elements/audioecho.c'; then $(CYGPATH_W) 'elements/audioecho.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioecho.c'; fi` audiofirfilter.o: elements/audiofirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiofirfilter.o -MD -MP -MF $(DEPDIR)/audiofirfilter.Tpo -c -o audiofirfilter.o `test -f 'elements/audiofirfilter.c' || echo '$(srcdir)/'`elements/audiofirfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiofirfilter.Tpo $(DEPDIR)/audiofirfilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiofirfilter.c' object='audiofirfilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiofirfilter.o `test -f 'elements/audiofirfilter.c' || echo '$(srcdir)/'`elements/audiofirfilter.c audiofirfilter.obj: elements/audiofirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiofirfilter.obj -MD -MP -MF $(DEPDIR)/audiofirfilter.Tpo -c -o audiofirfilter.obj `if test -f 'elements/audiofirfilter.c'; then $(CYGPATH_W) 'elements/audiofirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiofirfilter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiofirfilter.Tpo $(DEPDIR)/audiofirfilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiofirfilter.c' object='audiofirfilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiofirfilter.obj `if test -f 'elements/audiofirfilter.c'; then $(CYGPATH_W) 'elements/audiofirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiofirfilter.c'; fi` audioiirfilter.o: elements/audioiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioiirfilter.o -MD -MP -MF $(DEPDIR)/audioiirfilter.Tpo -c -o audioiirfilter.o `test -f 'elements/audioiirfilter.c' || echo '$(srcdir)/'`elements/audioiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioiirfilter.Tpo $(DEPDIR)/audioiirfilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioiirfilter.c' object='audioiirfilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioiirfilter.o `test -f 'elements/audioiirfilter.c' || echo '$(srcdir)/'`elements/audioiirfilter.c audioiirfilter.obj: elements/audioiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioiirfilter.obj -MD -MP -MF $(DEPDIR)/audioiirfilter.Tpo -c -o audioiirfilter.obj `if test -f 'elements/audioiirfilter.c'; then $(CYGPATH_W) 'elements/audioiirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioiirfilter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioiirfilter.Tpo $(DEPDIR)/audioiirfilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioiirfilter.c' object='audioiirfilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioiirfilter.obj `if test -f 'elements/audioiirfilter.c'; then $(CYGPATH_W) 'elements/audioiirfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioiirfilter.c'; fi` audioinvert.o: elements/audioinvert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioinvert.o -MD -MP -MF $(DEPDIR)/audioinvert.Tpo -c -o audioinvert.o `test -f 'elements/audioinvert.c' || echo '$(srcdir)/'`elements/audioinvert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioinvert.Tpo $(DEPDIR)/audioinvert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioinvert.c' object='audioinvert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioinvert.o `test -f 'elements/audioinvert.c' || echo '$(srcdir)/'`elements/audioinvert.c audioinvert.obj: elements/audioinvert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audioinvert.obj -MD -MP -MF $(DEPDIR)/audioinvert.Tpo -c -o audioinvert.obj `if test -f 'elements/audioinvert.c'; then $(CYGPATH_W) 'elements/audioinvert.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioinvert.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audioinvert.Tpo $(DEPDIR)/audioinvert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audioinvert.c' object='audioinvert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audioinvert.obj `if test -f 'elements/audioinvert.c'; then $(CYGPATH_W) 'elements/audioinvert.c'; else $(CYGPATH_W) '$(srcdir)/elements/audioinvert.c'; fi` elements_audiopanorama-audiopanorama.o: elements/audiopanorama.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -MT elements_audiopanorama-audiopanorama.o -MD -MP -MF $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo -c -o elements_audiopanorama-audiopanorama.o `test -f 'elements/audiopanorama.c' || echo '$(srcdir)/'`elements/audiopanorama.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo $(DEPDIR)/elements_audiopanorama-audiopanorama.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiopanorama.c' object='elements_audiopanorama-audiopanorama.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -c -o elements_audiopanorama-audiopanorama.o `test -f 'elements/audiopanorama.c' || echo '$(srcdir)/'`elements/audiopanorama.c elements_audiopanorama-audiopanorama.obj: elements/audiopanorama.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -MT elements_audiopanorama-audiopanorama.obj -MD -MP -MF $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo -c -o elements_audiopanorama-audiopanorama.obj `if test -f 'elements/audiopanorama.c'; then $(CYGPATH_W) 'elements/audiopanorama.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiopanorama.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_audiopanorama-audiopanorama.Tpo $(DEPDIR)/elements_audiopanorama-audiopanorama.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiopanorama.c' object='elements_audiopanorama-audiopanorama.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiopanorama_CFLAGS) $(CFLAGS) -c -o elements_audiopanorama-audiopanorama.obj `if test -f 'elements/audiopanorama.c'; then $(CYGPATH_W) 'elements/audiopanorama.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiopanorama.c'; fi` audiowsincband.o: elements/audiowsincband.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsincband.o -MD -MP -MF $(DEPDIR)/audiowsincband.Tpo -c -o audiowsincband.o `test -f 'elements/audiowsincband.c' || echo '$(srcdir)/'`elements/audiowsincband.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsincband.Tpo $(DEPDIR)/audiowsincband.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsincband.c' object='audiowsincband.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsincband.o `test -f 'elements/audiowsincband.c' || echo '$(srcdir)/'`elements/audiowsincband.c audiowsincband.obj: elements/audiowsincband.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsincband.obj -MD -MP -MF $(DEPDIR)/audiowsincband.Tpo -c -o audiowsincband.obj `if test -f 'elements/audiowsincband.c'; then $(CYGPATH_W) 'elements/audiowsincband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsincband.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsincband.Tpo $(DEPDIR)/audiowsincband.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsincband.c' object='audiowsincband.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsincband.obj `if test -f 'elements/audiowsincband.c'; then $(CYGPATH_W) 'elements/audiowsincband.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsincband.c'; fi` audiowsinclimit.o: elements/audiowsinclimit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsinclimit.o -MD -MP -MF $(DEPDIR)/audiowsinclimit.Tpo -c -o audiowsinclimit.o `test -f 'elements/audiowsinclimit.c' || echo '$(srcdir)/'`elements/audiowsinclimit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsinclimit.Tpo $(DEPDIR)/audiowsinclimit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsinclimit.c' object='audiowsinclimit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsinclimit.o `test -f 'elements/audiowsinclimit.c' || echo '$(srcdir)/'`elements/audiowsinclimit.c audiowsinclimit.obj: elements/audiowsinclimit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT audiowsinclimit.obj -MD -MP -MF $(DEPDIR)/audiowsinclimit.Tpo -c -o audiowsinclimit.obj `if test -f 'elements/audiowsinclimit.c'; then $(CYGPATH_W) 'elements/audiowsinclimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsinclimit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audiowsinclimit.Tpo $(DEPDIR)/audiowsinclimit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/audiowsinclimit.c' object='audiowsinclimit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o audiowsinclimit.obj `if test -f 'elements/audiowsinclimit.c'; then $(CYGPATH_W) 'elements/audiowsinclimit.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiowsinclimit.c'; fi` autodetect.o: elements/autodetect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT autodetect.o -MD -MP -MF $(DEPDIR)/autodetect.Tpo -c -o autodetect.o `test -f 'elements/autodetect.c' || echo '$(srcdir)/'`elements/autodetect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autodetect.Tpo $(DEPDIR)/autodetect.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/autodetect.c' object='autodetect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o autodetect.o `test -f 'elements/autodetect.c' || echo '$(srcdir)/'`elements/autodetect.c autodetect.obj: elements/autodetect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT autodetect.obj -MD -MP -MF $(DEPDIR)/autodetect.Tpo -c -o autodetect.obj `if test -f 'elements/autodetect.c'; then $(CYGPATH_W) 'elements/autodetect.c'; else $(CYGPATH_W) '$(srcdir)/elements/autodetect.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/autodetect.Tpo $(DEPDIR)/autodetect.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/autodetect.c' object='autodetect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o autodetect.obj `if test -f 'elements/autodetect.c'; then $(CYGPATH_W) 'elements/autodetect.c'; else $(CYGPATH_W) '$(srcdir)/elements/autodetect.c'; fi` avimux.o: elements/avimux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avimux.o -MD -MP -MF $(DEPDIR)/avimux.Tpo -c -o avimux.o `test -f 'elements/avimux.c' || echo '$(srcdir)/'`elements/avimux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avimux.Tpo $(DEPDIR)/avimux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avimux.c' object='avimux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avimux.o `test -f 'elements/avimux.c' || echo '$(srcdir)/'`elements/avimux.c avimux.obj: elements/avimux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avimux.obj -MD -MP -MF $(DEPDIR)/avimux.Tpo -c -o avimux.obj `if test -f 'elements/avimux.c'; then $(CYGPATH_W) 'elements/avimux.c'; else $(CYGPATH_W) '$(srcdir)/elements/avimux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avimux.Tpo $(DEPDIR)/avimux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avimux.c' object='avimux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avimux.obj `if test -f 'elements/avimux.c'; then $(CYGPATH_W) 'elements/avimux.c'; else $(CYGPATH_W) '$(srcdir)/elements/avimux.c'; fi` avisubtitle.o: elements/avisubtitle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avisubtitle.o -MD -MP -MF $(DEPDIR)/avisubtitle.Tpo -c -o avisubtitle.o `test -f 'elements/avisubtitle.c' || echo '$(srcdir)/'`elements/avisubtitle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avisubtitle.Tpo $(DEPDIR)/avisubtitle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avisubtitle.c' object='avisubtitle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avisubtitle.o `test -f 'elements/avisubtitle.c' || echo '$(srcdir)/'`elements/avisubtitle.c avisubtitle.obj: elements/avisubtitle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avisubtitle.obj -MD -MP -MF $(DEPDIR)/avisubtitle.Tpo -c -o avisubtitle.obj `if test -f 'elements/avisubtitle.c'; then $(CYGPATH_W) 'elements/avisubtitle.c'; else $(CYGPATH_W) '$(srcdir)/elements/avisubtitle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/avisubtitle.Tpo $(DEPDIR)/avisubtitle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/avisubtitle.c' object='avisubtitle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avisubtitle.obj `if test -f 'elements/avisubtitle.c'; then $(CYGPATH_W) 'elements/avisubtitle.c'; else $(CYGPATH_W) '$(srcdir)/elements/avisubtitle.c'; fi` capssetter.o: elements/capssetter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT capssetter.o -MD -MP -MF $(DEPDIR)/capssetter.Tpo -c -o capssetter.o `test -f 'elements/capssetter.c' || echo '$(srcdir)/'`elements/capssetter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/capssetter.Tpo $(DEPDIR)/capssetter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/capssetter.c' object='capssetter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o capssetter.o `test -f 'elements/capssetter.c' || echo '$(srcdir)/'`elements/capssetter.c capssetter.obj: elements/capssetter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT capssetter.obj -MD -MP -MF $(DEPDIR)/capssetter.Tpo -c -o capssetter.obj `if test -f 'elements/capssetter.c'; then $(CYGPATH_W) 'elements/capssetter.c'; else $(CYGPATH_W) '$(srcdir)/elements/capssetter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/capssetter.Tpo $(DEPDIR)/capssetter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/capssetter.c' object='capssetter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o capssetter.obj `if test -f 'elements/capssetter.c'; then $(CYGPATH_W) 'elements/capssetter.c'; else $(CYGPATH_W) '$(srcdir)/elements/capssetter.c'; fi` elements_cmmldec-cmmldec.o: elements/cmmldec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -MT elements_cmmldec-cmmldec.o -MD -MP -MF $(DEPDIR)/elements_cmmldec-cmmldec.Tpo -c -o elements_cmmldec-cmmldec.o `test -f 'elements/cmmldec.c' || echo '$(srcdir)/'`elements/cmmldec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmldec-cmmldec.Tpo $(DEPDIR)/elements_cmmldec-cmmldec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmldec.c' object='elements_cmmldec-cmmldec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -c -o elements_cmmldec-cmmldec.o `test -f 'elements/cmmldec.c' || echo '$(srcdir)/'`elements/cmmldec.c elements_cmmldec-cmmldec.obj: elements/cmmldec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -MT elements_cmmldec-cmmldec.obj -MD -MP -MF $(DEPDIR)/elements_cmmldec-cmmldec.Tpo -c -o elements_cmmldec-cmmldec.obj `if test -f 'elements/cmmldec.c'; then $(CYGPATH_W) 'elements/cmmldec.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmldec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmldec-cmmldec.Tpo $(DEPDIR)/elements_cmmldec-cmmldec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmldec.c' object='elements_cmmldec-cmmldec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmldec_CFLAGS) $(CFLAGS) -c -o elements_cmmldec-cmmldec.obj `if test -f 'elements/cmmldec.c'; then $(CYGPATH_W) 'elements/cmmldec.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmldec.c'; fi` elements_cmmlenc-cmmlenc.o: elements/cmmlenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -MT elements_cmmlenc-cmmlenc.o -MD -MP -MF $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo -c -o elements_cmmlenc-cmmlenc.o `test -f 'elements/cmmlenc.c' || echo '$(srcdir)/'`elements/cmmlenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo $(DEPDIR)/elements_cmmlenc-cmmlenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmlenc.c' object='elements_cmmlenc-cmmlenc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -c -o elements_cmmlenc-cmmlenc.o `test -f 'elements/cmmlenc.c' || echo '$(srcdir)/'`elements/cmmlenc.c elements_cmmlenc-cmmlenc.obj: elements/cmmlenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -MT elements_cmmlenc-cmmlenc.obj -MD -MP -MF $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo -c -o elements_cmmlenc-cmmlenc.obj `if test -f 'elements/cmmlenc.c'; then $(CYGPATH_W) 'elements/cmmlenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmlenc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_cmmlenc-cmmlenc.Tpo $(DEPDIR)/elements_cmmlenc-cmmlenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/cmmlenc.c' object='elements_cmmlenc-cmmlenc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_cmmlenc_CFLAGS) $(CFLAGS) -c -o elements_cmmlenc-cmmlenc.obj `if test -f 'elements/cmmlenc.c'; then $(CYGPATH_W) 'elements/cmmlenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/cmmlenc.c'; fi` elements_deinterlace-deinterlace.o: elements/deinterlace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -MT elements_deinterlace-deinterlace.o -MD -MP -MF $(DEPDIR)/elements_deinterlace-deinterlace.Tpo -c -o elements_deinterlace-deinterlace.o `test -f 'elements/deinterlace.c' || echo '$(srcdir)/'`elements/deinterlace.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterlace-deinterlace.Tpo $(DEPDIR)/elements_deinterlace-deinterlace.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterlace.c' object='elements_deinterlace-deinterlace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -c -o elements_deinterlace-deinterlace.o `test -f 'elements/deinterlace.c' || echo '$(srcdir)/'`elements/deinterlace.c elements_deinterlace-deinterlace.obj: elements/deinterlace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -MT elements_deinterlace-deinterlace.obj -MD -MP -MF $(DEPDIR)/elements_deinterlace-deinterlace.Tpo -c -o elements_deinterlace-deinterlace.obj `if test -f 'elements/deinterlace.c'; then $(CYGPATH_W) 'elements/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterlace.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterlace-deinterlace.Tpo $(DEPDIR)/elements_deinterlace-deinterlace.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterlace.c' object='elements_deinterlace-deinterlace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterlace_CFLAGS) $(CFLAGS) -c -o elements_deinterlace-deinterlace.obj `if test -f 'elements/deinterlace.c'; then $(CYGPATH_W) 'elements/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterlace.c'; fi` elements_deinterleave-deinterleave.o: elements/deinterleave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -MT elements_deinterleave-deinterleave.o -MD -MP -MF $(DEPDIR)/elements_deinterleave-deinterleave.Tpo -c -o elements_deinterleave-deinterleave.o `test -f 'elements/deinterleave.c' || echo '$(srcdir)/'`elements/deinterleave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterleave-deinterleave.Tpo $(DEPDIR)/elements_deinterleave-deinterleave.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterleave.c' object='elements_deinterleave-deinterleave.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -c -o elements_deinterleave-deinterleave.o `test -f 'elements/deinterleave.c' || echo '$(srcdir)/'`elements/deinterleave.c elements_deinterleave-deinterleave.obj: elements/deinterleave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -MT elements_deinterleave-deinterleave.obj -MD -MP -MF $(DEPDIR)/elements_deinterleave-deinterleave.Tpo -c -o elements_deinterleave-deinterleave.obj `if test -f 'elements/deinterleave.c'; then $(CYGPATH_W) 'elements/deinterleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterleave.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_deinterleave-deinterleave.Tpo $(DEPDIR)/elements_deinterleave-deinterleave.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/deinterleave.c' object='elements_deinterleave-deinterleave.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_deinterleave_CFLAGS) $(CFLAGS) -c -o elements_deinterleave-deinterleave.obj `if test -f 'elements/deinterleave.c'; then $(CYGPATH_W) 'elements/deinterleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/deinterleave.c'; fi` equalizer.o: elements/equalizer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT equalizer.o -MD -MP -MF $(DEPDIR)/equalizer.Tpo -c -o equalizer.o `test -f 'elements/equalizer.c' || echo '$(srcdir)/'`elements/equalizer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/equalizer.Tpo $(DEPDIR)/equalizer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/equalizer.c' object='equalizer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o equalizer.o `test -f 'elements/equalizer.c' || echo '$(srcdir)/'`elements/equalizer.c equalizer.obj: elements/equalizer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT equalizer.obj -MD -MP -MF $(DEPDIR)/equalizer.Tpo -c -o equalizer.obj `if test -f 'elements/equalizer.c'; then $(CYGPATH_W) 'elements/equalizer.c'; else $(CYGPATH_W) '$(srcdir)/elements/equalizer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/equalizer.Tpo $(DEPDIR)/equalizer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/equalizer.c' object='equalizer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o equalizer.obj `if test -f 'elements/equalizer.c'; then $(CYGPATH_W) 'elements/equalizer.c'; else $(CYGPATH_W) '$(srcdir)/elements/equalizer.c'; fi` flacparse.o: elements/flacparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacparse.o -MD -MP -MF $(DEPDIR)/flacparse.Tpo -c -o flacparse.o `test -f 'elements/flacparse.c' || echo '$(srcdir)/'`elements/flacparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacparse.Tpo $(DEPDIR)/flacparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flacparse.c' object='flacparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacparse.o `test -f 'elements/flacparse.c' || echo '$(srcdir)/'`elements/flacparse.c flacparse.obj: elements/flacparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacparse.obj -MD -MP -MF $(DEPDIR)/flacparse.Tpo -c -o flacparse.obj `if test -f 'elements/flacparse.c'; then $(CYGPATH_W) 'elements/flacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/flacparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacparse.Tpo $(DEPDIR)/flacparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flacparse.c' object='flacparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacparse.obj `if test -f 'elements/flacparse.c'; then $(CYGPATH_W) 'elements/flacparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/flacparse.c'; fi` flvdemux.o: elements/flvdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvdemux.o -MD -MP -MF $(DEPDIR)/flvdemux.Tpo -c -o flvdemux.o `test -f 'elements/flvdemux.c' || echo '$(srcdir)/'`elements/flvdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvdemux.Tpo $(DEPDIR)/flvdemux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvdemux.c' object='flvdemux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvdemux.o `test -f 'elements/flvdemux.c' || echo '$(srcdir)/'`elements/flvdemux.c flvdemux.obj: elements/flvdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvdemux.obj -MD -MP -MF $(DEPDIR)/flvdemux.Tpo -c -o flvdemux.obj `if test -f 'elements/flvdemux.c'; then $(CYGPATH_W) 'elements/flvdemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvdemux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvdemux.Tpo $(DEPDIR)/flvdemux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvdemux.c' object='flvdemux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvdemux.obj `if test -f 'elements/flvdemux.c'; then $(CYGPATH_W) 'elements/flvdemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvdemux.c'; fi` flvmux.o: elements/flvmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvmux.o -MD -MP -MF $(DEPDIR)/flvmux.Tpo -c -o flvmux.o `test -f 'elements/flvmux.c' || echo '$(srcdir)/'`elements/flvmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvmux.Tpo $(DEPDIR)/flvmux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvmux.c' object='flvmux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvmux.o `test -f 'elements/flvmux.c' || echo '$(srcdir)/'`elements/flvmux.c flvmux.obj: elements/flvmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flvmux.obj -MD -MP -MF $(DEPDIR)/flvmux.Tpo -c -o flvmux.obj `if test -f 'elements/flvmux.c'; then $(CYGPATH_W) 'elements/flvmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvmux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flvmux.Tpo $(DEPDIR)/flvmux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/flvmux.c' object='flvmux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flvmux.obj `if test -f 'elements/flvmux.c'; then $(CYGPATH_W) 'elements/flvmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/flvmux.c'; fi` elements_gdkpixbufsink-gdkpixbufsink.o: elements/gdkpixbufsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -MT elements_gdkpixbufsink-gdkpixbufsink.o -MD -MP -MF $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo -c -o elements_gdkpixbufsink-gdkpixbufsink.o `test -f 'elements/gdkpixbufsink.c' || echo '$(srcdir)/'`elements/gdkpixbufsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/gdkpixbufsink.c' object='elements_gdkpixbufsink-gdkpixbufsink.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -c -o elements_gdkpixbufsink-gdkpixbufsink.o `test -f 'elements/gdkpixbufsink.c' || echo '$(srcdir)/'`elements/gdkpixbufsink.c elements_gdkpixbufsink-gdkpixbufsink.obj: elements/gdkpixbufsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -MT elements_gdkpixbufsink-gdkpixbufsink.obj -MD -MP -MF $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo -c -o elements_gdkpixbufsink-gdkpixbufsink.obj `if test -f 'elements/gdkpixbufsink.c'; then $(CYGPATH_W) 'elements/gdkpixbufsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/gdkpixbufsink.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Tpo $(DEPDIR)/elements_gdkpixbufsink-gdkpixbufsink.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/gdkpixbufsink.c' object='elements_gdkpixbufsink-gdkpixbufsink.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_gdkpixbufsink_CFLAGS) $(CFLAGS) -c -o elements_gdkpixbufsink-gdkpixbufsink.obj `if test -f 'elements/gdkpixbufsink.c'; then $(CYGPATH_W) 'elements/gdkpixbufsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/gdkpixbufsink.c'; fi` icydemux.o: elements/icydemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT icydemux.o -MD -MP -MF $(DEPDIR)/icydemux.Tpo -c -o icydemux.o `test -f 'elements/icydemux.c' || echo '$(srcdir)/'`elements/icydemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/icydemux.Tpo $(DEPDIR)/icydemux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/icydemux.c' object='icydemux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o icydemux.o `test -f 'elements/icydemux.c' || echo '$(srcdir)/'`elements/icydemux.c icydemux.obj: elements/icydemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT icydemux.obj -MD -MP -MF $(DEPDIR)/icydemux.Tpo -c -o icydemux.obj `if test -f 'elements/icydemux.c'; then $(CYGPATH_W) 'elements/icydemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/icydemux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/icydemux.Tpo $(DEPDIR)/icydemux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/icydemux.c' object='icydemux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o icydemux.obj `if test -f 'elements/icydemux.c'; then $(CYGPATH_W) 'elements/icydemux.c'; else $(CYGPATH_W) '$(srcdir)/elements/icydemux.c'; fi` id3demux.o: elements/id3demux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3demux.o -MD -MP -MF $(DEPDIR)/id3demux.Tpo -c -o id3demux.o `test -f 'elements/id3demux.c' || echo '$(srcdir)/'`elements/id3demux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3demux.Tpo $(DEPDIR)/id3demux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3demux.c' object='id3demux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3demux.o `test -f 'elements/id3demux.c' || echo '$(srcdir)/'`elements/id3demux.c id3demux.obj: elements/id3demux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3demux.obj -MD -MP -MF $(DEPDIR)/id3demux.Tpo -c -o id3demux.obj `if test -f 'elements/id3demux.c'; then $(CYGPATH_W) 'elements/id3demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3demux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3demux.Tpo $(DEPDIR)/id3demux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3demux.c' object='id3demux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3demux.obj `if test -f 'elements/id3demux.c'; then $(CYGPATH_W) 'elements/id3demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3demux.c'; fi` id3v2mux.o: elements/id3v2mux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3v2mux.o -MD -MP -MF $(DEPDIR)/id3v2mux.Tpo -c -o id3v2mux.o `test -f 'elements/id3v2mux.c' || echo '$(srcdir)/'`elements/id3v2mux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3v2mux.Tpo $(DEPDIR)/id3v2mux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3v2mux.c' object='id3v2mux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3v2mux.o `test -f 'elements/id3v2mux.c' || echo '$(srcdir)/'`elements/id3v2mux.c id3v2mux.obj: elements/id3v2mux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT id3v2mux.obj -MD -MP -MF $(DEPDIR)/id3v2mux.Tpo -c -o id3v2mux.obj `if test -f 'elements/id3v2mux.c'; then $(CYGPATH_W) 'elements/id3v2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3v2mux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/id3v2mux.Tpo $(DEPDIR)/id3v2mux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/id3v2mux.c' object='id3v2mux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o id3v2mux.obj `if test -f 'elements/id3v2mux.c'; then $(CYGPATH_W) 'elements/id3v2mux.c'; else $(CYGPATH_W) '$(srcdir)/elements/id3v2mux.c'; fi` elements_imagefreeze-imagefreeze.o: elements/imagefreeze.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -MT elements_imagefreeze-imagefreeze.o -MD -MP -MF $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo -c -o elements_imagefreeze-imagefreeze.o `test -f 'elements/imagefreeze.c' || echo '$(srcdir)/'`elements/imagefreeze.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo $(DEPDIR)/elements_imagefreeze-imagefreeze.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/imagefreeze.c' object='elements_imagefreeze-imagefreeze.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -c -o elements_imagefreeze-imagefreeze.o `test -f 'elements/imagefreeze.c' || echo '$(srcdir)/'`elements/imagefreeze.c elements_imagefreeze-imagefreeze.obj: elements/imagefreeze.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -MT elements_imagefreeze-imagefreeze.obj -MD -MP -MF $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo -c -o elements_imagefreeze-imagefreeze.obj `if test -f 'elements/imagefreeze.c'; then $(CYGPATH_W) 'elements/imagefreeze.c'; else $(CYGPATH_W) '$(srcdir)/elements/imagefreeze.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_imagefreeze-imagefreeze.Tpo $(DEPDIR)/elements_imagefreeze-imagefreeze.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/imagefreeze.c' object='elements_imagefreeze-imagefreeze.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_imagefreeze_CFLAGS) $(CFLAGS) -c -o elements_imagefreeze-imagefreeze.obj `if test -f 'elements/imagefreeze.c'; then $(CYGPATH_W) 'elements/imagefreeze.c'; else $(CYGPATH_W) '$(srcdir)/elements/imagefreeze.c'; fi` elements_interleave-interleave.o: elements/interleave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -MT elements_interleave-interleave.o -MD -MP -MF $(DEPDIR)/elements_interleave-interleave.Tpo -c -o elements_interleave-interleave.o `test -f 'elements/interleave.c' || echo '$(srcdir)/'`elements/interleave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_interleave-interleave.Tpo $(DEPDIR)/elements_interleave-interleave.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/interleave.c' object='elements_interleave-interleave.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -c -o elements_interleave-interleave.o `test -f 'elements/interleave.c' || echo '$(srcdir)/'`elements/interleave.c elements_interleave-interleave.obj: elements/interleave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -MT elements_interleave-interleave.obj -MD -MP -MF $(DEPDIR)/elements_interleave-interleave.Tpo -c -o elements_interleave-interleave.obj `if test -f 'elements/interleave.c'; then $(CYGPATH_W) 'elements/interleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/interleave.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_interleave-interleave.Tpo $(DEPDIR)/elements_interleave-interleave.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/interleave.c' object='elements_interleave-interleave.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_interleave_CFLAGS) $(CFLAGS) -c -o elements_interleave-interleave.obj `if test -f 'elements/interleave.c'; then $(CYGPATH_W) 'elements/interleave.c'; else $(CYGPATH_W) '$(srcdir)/elements/interleave.c'; fi` elements_jpegenc-jpegenc.o: elements/jpegenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -MT elements_jpegenc-jpegenc.o -MD -MP -MF $(DEPDIR)/elements_jpegenc-jpegenc.Tpo -c -o elements_jpegenc-jpegenc.o `test -f 'elements/jpegenc.c' || echo '$(srcdir)/'`elements/jpegenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_jpegenc-jpegenc.Tpo $(DEPDIR)/elements_jpegenc-jpegenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/jpegenc.c' object='elements_jpegenc-jpegenc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -c -o elements_jpegenc-jpegenc.o `test -f 'elements/jpegenc.c' || echo '$(srcdir)/'`elements/jpegenc.c elements_jpegenc-jpegenc.obj: elements/jpegenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -MT elements_jpegenc-jpegenc.obj -MD -MP -MF $(DEPDIR)/elements_jpegenc-jpegenc.Tpo -c -o elements_jpegenc-jpegenc.obj `if test -f 'elements/jpegenc.c'; then $(CYGPATH_W) 'elements/jpegenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/jpegenc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_jpegenc-jpegenc.Tpo $(DEPDIR)/elements_jpegenc-jpegenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/jpegenc.c' object='elements_jpegenc-jpegenc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_jpegenc_CFLAGS) $(CFLAGS) -c -o elements_jpegenc-jpegenc.obj `if test -f 'elements/jpegenc.c'; then $(CYGPATH_W) 'elements/jpegenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/jpegenc.c'; fi` level.o: elements/level.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT level.o -MD -MP -MF $(DEPDIR)/level.Tpo -c -o level.o `test -f 'elements/level.c' || echo '$(srcdir)/'`elements/level.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level.Tpo $(DEPDIR)/level.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/level.c' object='level.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o level.o `test -f 'elements/level.c' || echo '$(srcdir)/'`elements/level.c level.obj: elements/level.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT level.obj -MD -MP -MF $(DEPDIR)/level.Tpo -c -o level.obj `if test -f 'elements/level.c'; then $(CYGPATH_W) 'elements/level.c'; else $(CYGPATH_W) '$(srcdir)/elements/level.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level.Tpo $(DEPDIR)/level.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/level.c' object='level.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o level.obj `if test -f 'elements/level.c'; then $(CYGPATH_W) 'elements/level.c'; else $(CYGPATH_W) '$(srcdir)/elements/level.c'; fi` matroskamux.o: elements/matroskamux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskamux.o -MD -MP -MF $(DEPDIR)/matroskamux.Tpo -c -o matroskamux.o `test -f 'elements/matroskamux.c' || echo '$(srcdir)/'`elements/matroskamux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskamux.Tpo $(DEPDIR)/matroskamux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskamux.c' object='matroskamux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskamux.o `test -f 'elements/matroskamux.c' || echo '$(srcdir)/'`elements/matroskamux.c matroskamux.obj: elements/matroskamux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskamux.obj -MD -MP -MF $(DEPDIR)/matroskamux.Tpo -c -o matroskamux.obj `if test -f 'elements/matroskamux.c'; then $(CYGPATH_W) 'elements/matroskamux.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskamux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskamux.Tpo $(DEPDIR)/matroskamux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskamux.c' object='matroskamux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskamux.obj `if test -f 'elements/matroskamux.c'; then $(CYGPATH_W) 'elements/matroskamux.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskamux.c'; fi` matroskaparse.o: elements/matroskaparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskaparse.o -MD -MP -MF $(DEPDIR)/matroskaparse.Tpo -c -o matroskaparse.o `test -f 'elements/matroskaparse.c' || echo '$(srcdir)/'`elements/matroskaparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskaparse.Tpo $(DEPDIR)/matroskaparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskaparse.c' object='matroskaparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskaparse.o `test -f 'elements/matroskaparse.c' || echo '$(srcdir)/'`elements/matroskaparse.c matroskaparse.obj: elements/matroskaparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matroskaparse.obj -MD -MP -MF $(DEPDIR)/matroskaparse.Tpo -c -o matroskaparse.obj `if test -f 'elements/matroskaparse.c'; then $(CYGPATH_W) 'elements/matroskaparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskaparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matroskaparse.Tpo $(DEPDIR)/matroskaparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/matroskaparse.c' object='matroskaparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matroskaparse.obj `if test -f 'elements/matroskaparse.c'; then $(CYGPATH_W) 'elements/matroskaparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/matroskaparse.c'; fi` mpegaudioparse.o: elements/mpegaudioparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpegaudioparse.o -MD -MP -MF $(DEPDIR)/mpegaudioparse.Tpo -c -o mpegaudioparse.o `test -f 'elements/mpegaudioparse.c' || echo '$(srcdir)/'`elements/mpegaudioparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpegaudioparse.Tpo $(DEPDIR)/mpegaudioparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/mpegaudioparse.c' object='mpegaudioparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpegaudioparse.o `test -f 'elements/mpegaudioparse.c' || echo '$(srcdir)/'`elements/mpegaudioparse.c mpegaudioparse.obj: elements/mpegaudioparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpegaudioparse.obj -MD -MP -MF $(DEPDIR)/mpegaudioparse.Tpo -c -o mpegaudioparse.obj `if test -f 'elements/mpegaudioparse.c'; then $(CYGPATH_W) 'elements/mpegaudioparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/mpegaudioparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpegaudioparse.Tpo $(DEPDIR)/mpegaudioparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/mpegaudioparse.c' object='mpegaudioparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mpegaudioparse.obj `if test -f 'elements/mpegaudioparse.c'; then $(CYGPATH_W) 'elements/mpegaudioparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/mpegaudioparse.c'; fi` elements_multifile-multifile.o: elements/multifile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -MT elements_multifile-multifile.o -MD -MP -MF $(DEPDIR)/elements_multifile-multifile.Tpo -c -o elements_multifile-multifile.o `test -f 'elements/multifile.c' || echo '$(srcdir)/'`elements/multifile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_multifile-multifile.Tpo $(DEPDIR)/elements_multifile-multifile.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/multifile.c' object='elements_multifile-multifile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -c -o elements_multifile-multifile.o `test -f 'elements/multifile.c' || echo '$(srcdir)/'`elements/multifile.c elements_multifile-multifile.obj: elements/multifile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -MT elements_multifile-multifile.obj -MD -MP -MF $(DEPDIR)/elements_multifile-multifile.Tpo -c -o elements_multifile-multifile.obj `if test -f 'elements/multifile.c'; then $(CYGPATH_W) 'elements/multifile.c'; else $(CYGPATH_W) '$(srcdir)/elements/multifile.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_multifile-multifile.Tpo $(DEPDIR)/elements_multifile-multifile.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/multifile.c' object='elements_multifile-multifile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_multifile_CFLAGS) $(CFLAGS) -c -o elements_multifile-multifile.obj `if test -f 'elements/multifile.c'; then $(CYGPATH_W) 'elements/multifile.c'; else $(CYGPATH_W) '$(srcdir)/elements/multifile.c'; fi` elements_qtmux-qtmux.o: elements/qtmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -MT elements_qtmux-qtmux.o -MD -MP -MF $(DEPDIR)/elements_qtmux-qtmux.Tpo -c -o elements_qtmux-qtmux.o `test -f 'elements/qtmux.c' || echo '$(srcdir)/'`elements/qtmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_qtmux-qtmux.Tpo $(DEPDIR)/elements_qtmux-qtmux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/qtmux.c' object='elements_qtmux-qtmux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -c -o elements_qtmux-qtmux.o `test -f 'elements/qtmux.c' || echo '$(srcdir)/'`elements/qtmux.c elements_qtmux-qtmux.obj: elements/qtmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -MT elements_qtmux-qtmux.obj -MD -MP -MF $(DEPDIR)/elements_qtmux-qtmux.Tpo -c -o elements_qtmux-qtmux.obj `if test -f 'elements/qtmux.c'; then $(CYGPATH_W) 'elements/qtmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/qtmux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_qtmux-qtmux.Tpo $(DEPDIR)/elements_qtmux-qtmux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/qtmux.c' object='elements_qtmux-qtmux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_qtmux_CFLAGS) $(CFLAGS) -c -o elements_qtmux-qtmux.obj `if test -f 'elements/qtmux.c'; then $(CYGPATH_W) 'elements/qtmux.c'; else $(CYGPATH_W) '$(srcdir)/elements/qtmux.c'; fi` rganalysis.o: elements/rganalysis.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rganalysis.o -MD -MP -MF $(DEPDIR)/rganalysis.Tpo -c -o rganalysis.o `test -f 'elements/rganalysis.c' || echo '$(srcdir)/'`elements/rganalysis.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rganalysis.Tpo $(DEPDIR)/rganalysis.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rganalysis.c' object='rganalysis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rganalysis.o `test -f 'elements/rganalysis.c' || echo '$(srcdir)/'`elements/rganalysis.c rganalysis.obj: elements/rganalysis.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rganalysis.obj -MD -MP -MF $(DEPDIR)/rganalysis.Tpo -c -o rganalysis.obj `if test -f 'elements/rganalysis.c'; then $(CYGPATH_W) 'elements/rganalysis.c'; else $(CYGPATH_W) '$(srcdir)/elements/rganalysis.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rganalysis.Tpo $(DEPDIR)/rganalysis.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rganalysis.c' object='rganalysis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rganalysis.obj `if test -f 'elements/rganalysis.c'; then $(CYGPATH_W) 'elements/rganalysis.c'; else $(CYGPATH_W) '$(srcdir)/elements/rganalysis.c'; fi` rglimiter.o: elements/rglimiter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rglimiter.o -MD -MP -MF $(DEPDIR)/rglimiter.Tpo -c -o rglimiter.o `test -f 'elements/rglimiter.c' || echo '$(srcdir)/'`elements/rglimiter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rglimiter.Tpo $(DEPDIR)/rglimiter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rglimiter.c' object='rglimiter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rglimiter.o `test -f 'elements/rglimiter.c' || echo '$(srcdir)/'`elements/rglimiter.c rglimiter.obj: elements/rglimiter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rglimiter.obj -MD -MP -MF $(DEPDIR)/rglimiter.Tpo -c -o rglimiter.obj `if test -f 'elements/rglimiter.c'; then $(CYGPATH_W) 'elements/rglimiter.c'; else $(CYGPATH_W) '$(srcdir)/elements/rglimiter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rglimiter.Tpo $(DEPDIR)/rglimiter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rglimiter.c' object='rglimiter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rglimiter.obj `if test -f 'elements/rglimiter.c'; then $(CYGPATH_W) 'elements/rglimiter.c'; else $(CYGPATH_W) '$(srcdir)/elements/rglimiter.c'; fi` rgvolume.o: elements/rgvolume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rgvolume.o -MD -MP -MF $(DEPDIR)/rgvolume.Tpo -c -o rgvolume.o `test -f 'elements/rgvolume.c' || echo '$(srcdir)/'`elements/rgvolume.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rgvolume.Tpo $(DEPDIR)/rgvolume.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rgvolume.c' object='rgvolume.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rgvolume.o `test -f 'elements/rgvolume.c' || echo '$(srcdir)/'`elements/rgvolume.c rgvolume.obj: elements/rgvolume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rgvolume.obj -MD -MP -MF $(DEPDIR)/rgvolume.Tpo -c -o rgvolume.obj `if test -f 'elements/rgvolume.c'; then $(CYGPATH_W) 'elements/rgvolume.c'; else $(CYGPATH_W) '$(srcdir)/elements/rgvolume.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rgvolume.Tpo $(DEPDIR)/rgvolume.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rgvolume.c' object='rgvolume.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rgvolume.obj `if test -f 'elements/rgvolume.c'; then $(CYGPATH_W) 'elements/rgvolume.c'; else $(CYGPATH_W) '$(srcdir)/elements/rgvolume.c'; fi` rtp-payloading.o: elements/rtp-payloading.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtp-payloading.o -MD -MP -MF $(DEPDIR)/rtp-payloading.Tpo -c -o rtp-payloading.o `test -f 'elements/rtp-payloading.c' || echo '$(srcdir)/'`elements/rtp-payloading.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtp-payloading.Tpo $(DEPDIR)/rtp-payloading.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtp-payloading.c' object='rtp-payloading.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtp-payloading.o `test -f 'elements/rtp-payloading.c' || echo '$(srcdir)/'`elements/rtp-payloading.c rtp-payloading.obj: elements/rtp-payloading.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtp-payloading.obj -MD -MP -MF $(DEPDIR)/rtp-payloading.Tpo -c -o rtp-payloading.obj `if test -f 'elements/rtp-payloading.c'; then $(CYGPATH_W) 'elements/rtp-payloading.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtp-payloading.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtp-payloading.Tpo $(DEPDIR)/rtp-payloading.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtp-payloading.c' object='rtp-payloading.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtp-payloading.obj `if test -f 'elements/rtp-payloading.c'; then $(CYGPATH_W) 'elements/rtp-payloading.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtp-payloading.c'; fi` rtpbin.o: elements/rtpbin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpbin.o -MD -MP -MF $(DEPDIR)/rtpbin.Tpo -c -o rtpbin.o `test -f 'elements/rtpbin.c' || echo '$(srcdir)/'`elements/rtpbin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpbin.Tpo $(DEPDIR)/rtpbin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin.c' object='rtpbin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpbin.o `test -f 'elements/rtpbin.c' || echo '$(srcdir)/'`elements/rtpbin.c rtpbin.obj: elements/rtpbin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpbin.obj -MD -MP -MF $(DEPDIR)/rtpbin.Tpo -c -o rtpbin.obj `if test -f 'elements/rtpbin.c'; then $(CYGPATH_W) 'elements/rtpbin.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpbin.Tpo $(DEPDIR)/rtpbin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin.c' object='rtpbin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpbin.obj `if test -f 'elements/rtpbin.c'; then $(CYGPATH_W) 'elements/rtpbin.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin.c'; fi` elements_rtpbin_buffer_list-rtpbin_buffer_list.o: elements/rtpbin_buffer_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -MT elements_rtpbin_buffer_list-rtpbin_buffer_list.o -MD -MP -MF $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.o `test -f 'elements/rtpbin_buffer_list.c' || echo '$(srcdir)/'`elements/rtpbin_buffer_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin_buffer_list.c' object='elements_rtpbin_buffer_list-rtpbin_buffer_list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.o `test -f 'elements/rtpbin_buffer_list.c' || echo '$(srcdir)/'`elements/rtpbin_buffer_list.c elements_rtpbin_buffer_list-rtpbin_buffer_list.obj: elements/rtpbin_buffer_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -MT elements_rtpbin_buffer_list-rtpbin_buffer_list.obj -MD -MP -MF $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.obj `if test -f 'elements/rtpbin_buffer_list.c'; then $(CYGPATH_W) 'elements/rtpbin_buffer_list.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin_buffer_list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Tpo $(DEPDIR)/elements_rtpbin_buffer_list-rtpbin_buffer_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpbin_buffer_list.c' object='elements_rtpbin_buffer_list-rtpbin_buffer_list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtpbin_buffer_list_CFLAGS) $(CFLAGS) -c -o elements_rtpbin_buffer_list-rtpbin_buffer_list.obj `if test -f 'elements/rtpbin_buffer_list.c'; then $(CYGPATH_W) 'elements/rtpbin_buffer_list.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpbin_buffer_list.c'; fi` rtpjitterbuffer.o: elements/rtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpjitterbuffer.o -MD -MP -MF $(DEPDIR)/rtpjitterbuffer.Tpo -c -o rtpjitterbuffer.o `test -f 'elements/rtpjitterbuffer.c' || echo '$(srcdir)/'`elements/rtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpjitterbuffer.Tpo $(DEPDIR)/rtpjitterbuffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpjitterbuffer.c' object='rtpjitterbuffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpjitterbuffer.o `test -f 'elements/rtpjitterbuffer.c' || echo '$(srcdir)/'`elements/rtpjitterbuffer.c rtpjitterbuffer.obj: elements/rtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtpjitterbuffer.obj -MD -MP -MF $(DEPDIR)/rtpjitterbuffer.Tpo -c -o rtpjitterbuffer.obj `if test -f 'elements/rtpjitterbuffer.c'; then $(CYGPATH_W) 'elements/rtpjitterbuffer.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpjitterbuffer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpjitterbuffer.Tpo $(DEPDIR)/rtpjitterbuffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/rtpjitterbuffer.c' object='rtpjitterbuffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtpjitterbuffer.obj `if test -f 'elements/rtpjitterbuffer.c'; then $(CYGPATH_W) 'elements/rtpjitterbuffer.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtpjitterbuffer.c'; fi` shapewipe.o: elements/shapewipe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shapewipe.o -MD -MP -MF $(DEPDIR)/shapewipe.Tpo -c -o shapewipe.o `test -f 'elements/shapewipe.c' || echo '$(srcdir)/'`elements/shapewipe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe.Tpo $(DEPDIR)/shapewipe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/shapewipe.c' object='shapewipe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shapewipe.o `test -f 'elements/shapewipe.c' || echo '$(srcdir)/'`elements/shapewipe.c shapewipe.obj: elements/shapewipe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shapewipe.obj -MD -MP -MF $(DEPDIR)/shapewipe.Tpo -c -o shapewipe.obj `if test -f 'elements/shapewipe.c'; then $(CYGPATH_W) 'elements/shapewipe.c'; else $(CYGPATH_W) '$(srcdir)/elements/shapewipe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe.Tpo $(DEPDIR)/shapewipe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/shapewipe.c' object='shapewipe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shapewipe.obj `if test -f 'elements/shapewipe.c'; then $(CYGPATH_W) 'elements/shapewipe.c'; else $(CYGPATH_W) '$(srcdir)/elements/shapewipe.c'; fi` elements_souphttpsrc-souphttpsrc.o: elements/souphttpsrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -MT elements_souphttpsrc-souphttpsrc.o -MD -MP -MF $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo -c -o elements_souphttpsrc-souphttpsrc.o `test -f 'elements/souphttpsrc.c' || echo '$(srcdir)/'`elements/souphttpsrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/souphttpsrc.c' object='elements_souphttpsrc-souphttpsrc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -c -o elements_souphttpsrc-souphttpsrc.o `test -f 'elements/souphttpsrc.c' || echo '$(srcdir)/'`elements/souphttpsrc.c elements_souphttpsrc-souphttpsrc.obj: elements/souphttpsrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -MT elements_souphttpsrc-souphttpsrc.obj -MD -MP -MF $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo -c -o elements_souphttpsrc-souphttpsrc.obj `if test -f 'elements/souphttpsrc.c'; then $(CYGPATH_W) 'elements/souphttpsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/souphttpsrc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Tpo $(DEPDIR)/elements_souphttpsrc-souphttpsrc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/souphttpsrc.c' object='elements_souphttpsrc-souphttpsrc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_souphttpsrc_CFLAGS) $(CFLAGS) -c -o elements_souphttpsrc-souphttpsrc.obj `if test -f 'elements/souphttpsrc.c'; then $(CYGPATH_W) 'elements/souphttpsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/souphttpsrc.c'; fi` spectrum.o: elements/spectrum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spectrum.o -MD -MP -MF $(DEPDIR)/spectrum.Tpo -c -o spectrum.o `test -f 'elements/spectrum.c' || echo '$(srcdir)/'`elements/spectrum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum.Tpo $(DEPDIR)/spectrum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/spectrum.c' object='spectrum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spectrum.o `test -f 'elements/spectrum.c' || echo '$(srcdir)/'`elements/spectrum.c spectrum.obj: elements/spectrum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spectrum.obj -MD -MP -MF $(DEPDIR)/spectrum.Tpo -c -o spectrum.obj `if test -f 'elements/spectrum.c'; then $(CYGPATH_W) 'elements/spectrum.c'; else $(CYGPATH_W) '$(srcdir)/elements/spectrum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum.Tpo $(DEPDIR)/spectrum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/spectrum.c' object='spectrum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spectrum.obj `if test -f 'elements/spectrum.c'; then $(CYGPATH_W) 'elements/spectrum.c'; else $(CYGPATH_W) '$(srcdir)/elements/spectrum.c'; fi` elements_sunaudio-sunaudio.o: elements/sunaudio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -MT elements_sunaudio-sunaudio.o -MD -MP -MF $(DEPDIR)/elements_sunaudio-sunaudio.Tpo -c -o elements_sunaudio-sunaudio.o `test -f 'elements/sunaudio.c' || echo '$(srcdir)/'`elements/sunaudio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_sunaudio-sunaudio.Tpo $(DEPDIR)/elements_sunaudio-sunaudio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/sunaudio.c' object='elements_sunaudio-sunaudio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -c -o elements_sunaudio-sunaudio.o `test -f 'elements/sunaudio.c' || echo '$(srcdir)/'`elements/sunaudio.c elements_sunaudio-sunaudio.obj: elements/sunaudio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -MT elements_sunaudio-sunaudio.obj -MD -MP -MF $(DEPDIR)/elements_sunaudio-sunaudio.Tpo -c -o elements_sunaudio-sunaudio.obj `if test -f 'elements/sunaudio.c'; then $(CYGPATH_W) 'elements/sunaudio.c'; else $(CYGPATH_W) '$(srcdir)/elements/sunaudio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_sunaudio-sunaudio.Tpo $(DEPDIR)/elements_sunaudio-sunaudio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/sunaudio.c' object='elements_sunaudio-sunaudio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_sunaudio_CFLAGS) $(CFLAGS) -c -o elements_sunaudio-sunaudio.obj `if test -f 'elements/sunaudio.c'; then $(CYGPATH_W) 'elements/sunaudio.c'; else $(CYGPATH_W) '$(srcdir)/elements/sunaudio.c'; fi` udpsink.o: elements/udpsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT udpsink.o -MD -MP -MF $(DEPDIR)/udpsink.Tpo -c -o udpsink.o `test -f 'elements/udpsink.c' || echo '$(srcdir)/'`elements/udpsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/udpsink.Tpo $(DEPDIR)/udpsink.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/udpsink.c' object='udpsink.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o udpsink.o `test -f 'elements/udpsink.c' || echo '$(srcdir)/'`elements/udpsink.c udpsink.obj: elements/udpsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT udpsink.obj -MD -MP -MF $(DEPDIR)/udpsink.Tpo -c -o udpsink.obj `if test -f 'elements/udpsink.c'; then $(CYGPATH_W) 'elements/udpsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/udpsink.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/udpsink.Tpo $(DEPDIR)/udpsink.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/udpsink.c' object='udpsink.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o udpsink.obj `if test -f 'elements/udpsink.c'; then $(CYGPATH_W) 'elements/udpsink.c'; else $(CYGPATH_W) '$(srcdir)/elements/udpsink.c'; fi` elements_videocrop-videocrop.o: elements/videocrop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -MT elements_videocrop-videocrop.o -MD -MP -MF $(DEPDIR)/elements_videocrop-videocrop.Tpo -c -o elements_videocrop-videocrop.o `test -f 'elements/videocrop.c' || echo '$(srcdir)/'`elements/videocrop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videocrop-videocrop.Tpo $(DEPDIR)/elements_videocrop-videocrop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videocrop.c' object='elements_videocrop-videocrop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -c -o elements_videocrop-videocrop.o `test -f 'elements/videocrop.c' || echo '$(srcdir)/'`elements/videocrop.c elements_videocrop-videocrop.obj: elements/videocrop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -MT elements_videocrop-videocrop.obj -MD -MP -MF $(DEPDIR)/elements_videocrop-videocrop.Tpo -c -o elements_videocrop-videocrop.obj `if test -f 'elements/videocrop.c'; then $(CYGPATH_W) 'elements/videocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/videocrop.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videocrop-videocrop.Tpo $(DEPDIR)/elements_videocrop-videocrop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videocrop.c' object='elements_videocrop-videocrop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videocrop_CFLAGS) $(CFLAGS) -c -o elements_videocrop-videocrop.obj `if test -f 'elements/videocrop.c'; then $(CYGPATH_W) 'elements/videocrop.c'; else $(CYGPATH_W) '$(srcdir)/elements/videocrop.c'; fi` elements_videofilter-videofilter.o: elements/videofilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -MT elements_videofilter-videofilter.o -MD -MP -MF $(DEPDIR)/elements_videofilter-videofilter.Tpo -c -o elements_videofilter-videofilter.o `test -f 'elements/videofilter.c' || echo '$(srcdir)/'`elements/videofilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videofilter-videofilter.Tpo $(DEPDIR)/elements_videofilter-videofilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videofilter.c' object='elements_videofilter-videofilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -c -o elements_videofilter-videofilter.o `test -f 'elements/videofilter.c' || echo '$(srcdir)/'`elements/videofilter.c elements_videofilter-videofilter.obj: elements/videofilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -MT elements_videofilter-videofilter.obj -MD -MP -MF $(DEPDIR)/elements_videofilter-videofilter.Tpo -c -o elements_videofilter-videofilter.obj `if test -f 'elements/videofilter.c'; then $(CYGPATH_W) 'elements/videofilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/videofilter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_videofilter-videofilter.Tpo $(DEPDIR)/elements_videofilter-videofilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/videofilter.c' object='elements_videofilter-videofilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videofilter_CFLAGS) $(CFLAGS) -c -o elements_videofilter-videofilter.obj `if test -f 'elements/videofilter.c'; then $(CYGPATH_W) 'elements/videofilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/videofilter.c'; fi` wavpackdec.o: elements/wavpackdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackdec.o -MD -MP -MF $(DEPDIR)/wavpackdec.Tpo -c -o wavpackdec.o `test -f 'elements/wavpackdec.c' || echo '$(srcdir)/'`elements/wavpackdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackdec.Tpo $(DEPDIR)/wavpackdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackdec.c' object='wavpackdec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackdec.o `test -f 'elements/wavpackdec.c' || echo '$(srcdir)/'`elements/wavpackdec.c wavpackdec.obj: elements/wavpackdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackdec.obj -MD -MP -MF $(DEPDIR)/wavpackdec.Tpo -c -o wavpackdec.obj `if test -f 'elements/wavpackdec.c'; then $(CYGPATH_W) 'elements/wavpackdec.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackdec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackdec.Tpo $(DEPDIR)/wavpackdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackdec.c' object='wavpackdec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackdec.obj `if test -f 'elements/wavpackdec.c'; then $(CYGPATH_W) 'elements/wavpackdec.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackdec.c'; fi` wavpackenc.o: elements/wavpackenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackenc.o -MD -MP -MF $(DEPDIR)/wavpackenc.Tpo -c -o wavpackenc.o `test -f 'elements/wavpackenc.c' || echo '$(srcdir)/'`elements/wavpackenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackenc.Tpo $(DEPDIR)/wavpackenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackenc.c' object='wavpackenc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackenc.o `test -f 'elements/wavpackenc.c' || echo '$(srcdir)/'`elements/wavpackenc.c wavpackenc.obj: elements/wavpackenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackenc.obj -MD -MP -MF $(DEPDIR)/wavpackenc.Tpo -c -o wavpackenc.obj `if test -f 'elements/wavpackenc.c'; then $(CYGPATH_W) 'elements/wavpackenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackenc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackenc.Tpo $(DEPDIR)/wavpackenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackenc.c' object='wavpackenc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackenc.obj `if test -f 'elements/wavpackenc.c'; then $(CYGPATH_W) 'elements/wavpackenc.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackenc.c'; fi` wavpackparse.o: elements/wavpackparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackparse.o -MD -MP -MF $(DEPDIR)/wavpackparse.Tpo -c -o wavpackparse.o `test -f 'elements/wavpackparse.c' || echo '$(srcdir)/'`elements/wavpackparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackparse.Tpo $(DEPDIR)/wavpackparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackparse.c' object='wavpackparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackparse.o `test -f 'elements/wavpackparse.c' || echo '$(srcdir)/'`elements/wavpackparse.c wavpackparse.obj: elements/wavpackparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wavpackparse.obj -MD -MP -MF $(DEPDIR)/wavpackparse.Tpo -c -o wavpackparse.obj `if test -f 'elements/wavpackparse.c'; then $(CYGPATH_W) 'elements/wavpackparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wavpackparse.Tpo $(DEPDIR)/wavpackparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/wavpackparse.c' object='wavpackparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wavpackparse.obj `if test -f 'elements/wavpackparse.c'; then $(CYGPATH_W) 'elements/wavpackparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/wavpackparse.c'; fi` y4menc.o: elements/y4menc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT y4menc.o -MD -MP -MF $(DEPDIR)/y4menc.Tpo -c -o y4menc.o `test -f 'elements/y4menc.c' || echo '$(srcdir)/'`elements/y4menc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/y4menc.Tpo $(DEPDIR)/y4menc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/y4menc.c' object='y4menc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o y4menc.o `test -f 'elements/y4menc.c' || echo '$(srcdir)/'`elements/y4menc.c y4menc.obj: elements/y4menc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT y4menc.obj -MD -MP -MF $(DEPDIR)/y4menc.Tpo -c -o y4menc.obj `if test -f 'elements/y4menc.c'; then $(CYGPATH_W) 'elements/y4menc.c'; else $(CYGPATH_W) '$(srcdir)/elements/y4menc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/y4menc.Tpo $(DEPDIR)/y4menc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='elements/y4menc.c' object='y4menc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o y4menc.obj `if test -f 'elements/y4menc.c'; then $(CYGPATH_W) 'elements/y4menc.c'; else $(CYGPATH_W) '$(srcdir)/elements/y4menc.c'; fi` index.o: generic/index.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT index.o -MD -MP -MF $(DEPDIR)/index.Tpo -c -o index.o `test -f 'generic/index.c' || echo '$(srcdir)/'`generic/index.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/index.Tpo $(DEPDIR)/index.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/index.c' object='index.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o index.o `test -f 'generic/index.c' || echo '$(srcdir)/'`generic/index.c index.obj: generic/index.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT index.obj -MD -MP -MF $(DEPDIR)/index.Tpo -c -o index.obj `if test -f 'generic/index.c'; then $(CYGPATH_W) 'generic/index.c'; else $(CYGPATH_W) '$(srcdir)/generic/index.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/index.Tpo $(DEPDIR)/index.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/index.c' object='index.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o index.obj `if test -f 'generic/index.c'; then $(CYGPATH_W) 'generic/index.c'; else $(CYGPATH_W) '$(srcdir)/generic/index.c'; fi` states.o: generic/states.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT states.o -MD -MP -MF $(DEPDIR)/states.Tpo -c -o states.o `test -f 'generic/states.c' || echo '$(srcdir)/'`generic/states.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/states.Tpo $(DEPDIR)/states.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/states.c' object='states.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o states.o `test -f 'generic/states.c' || echo '$(srcdir)/'`generic/states.c states.obj: generic/states.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT states.obj -MD -MP -MF $(DEPDIR)/states.Tpo -c -o states.obj `if test -f 'generic/states.c'; then $(CYGPATH_W) 'generic/states.c'; else $(CYGPATH_W) '$(srcdir)/generic/states.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/states.Tpo $(DEPDIR)/states.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generic/states.c' object='states.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o states.obj `if test -f 'generic/states.c'; then $(CYGPATH_W) 'generic/states.c'; else $(CYGPATH_W) '$(srcdir)/generic/states.c'; fi` orc_deinterlace-deinterlace.o: orc/deinterlace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -MT orc_deinterlace-deinterlace.o -MD -MP -MF $(DEPDIR)/orc_deinterlace-deinterlace.Tpo -c -o orc_deinterlace-deinterlace.o `test -f 'orc/deinterlace.c' || echo '$(srcdir)/'`orc/deinterlace.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_deinterlace-deinterlace.Tpo $(DEPDIR)/orc_deinterlace-deinterlace.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/deinterlace.c' object='orc_deinterlace-deinterlace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -c -o orc_deinterlace-deinterlace.o `test -f 'orc/deinterlace.c' || echo '$(srcdir)/'`orc/deinterlace.c orc_deinterlace-deinterlace.obj: orc/deinterlace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -MT orc_deinterlace-deinterlace.obj -MD -MP -MF $(DEPDIR)/orc_deinterlace-deinterlace.Tpo -c -o orc_deinterlace-deinterlace.obj `if test -f 'orc/deinterlace.c'; then $(CYGPATH_W) 'orc/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/orc/deinterlace.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_deinterlace-deinterlace.Tpo $(DEPDIR)/orc_deinterlace-deinterlace.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/deinterlace.c' object='orc_deinterlace-deinterlace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_deinterlace_CFLAGS) $(CFLAGS) -c -o orc_deinterlace-deinterlace.obj `if test -f 'orc/deinterlace.c'; then $(CYGPATH_W) 'orc/deinterlace.c'; else $(CYGPATH_W) '$(srcdir)/orc/deinterlace.c'; fi` orc_videobox-videobox.o: orc/videobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -MT orc_videobox-videobox.o -MD -MP -MF $(DEPDIR)/orc_videobox-videobox.Tpo -c -o orc_videobox-videobox.o `test -f 'orc/videobox.c' || echo '$(srcdir)/'`orc/videobox.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videobox-videobox.Tpo $(DEPDIR)/orc_videobox-videobox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videobox.c' object='orc_videobox-videobox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -c -o orc_videobox-videobox.o `test -f 'orc/videobox.c' || echo '$(srcdir)/'`orc/videobox.c orc_videobox-videobox.obj: orc/videobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -MT orc_videobox-videobox.obj -MD -MP -MF $(DEPDIR)/orc_videobox-videobox.Tpo -c -o orc_videobox-videobox.obj `if test -f 'orc/videobox.c'; then $(CYGPATH_W) 'orc/videobox.c'; else $(CYGPATH_W) '$(srcdir)/orc/videobox.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videobox-videobox.Tpo $(DEPDIR)/orc_videobox-videobox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videobox.c' object='orc_videobox-videobox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videobox_CFLAGS) $(CFLAGS) -c -o orc_videobox-videobox.obj `if test -f 'orc/videobox.c'; then $(CYGPATH_W) 'orc/videobox.c'; else $(CYGPATH_W) '$(srcdir)/orc/videobox.c'; fi` orc_videomixer-videomixer.o: orc/videomixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -MT orc_videomixer-videomixer.o -MD -MP -MF $(DEPDIR)/orc_videomixer-videomixer.Tpo -c -o orc_videomixer-videomixer.o `test -f 'orc/videomixer.c' || echo '$(srcdir)/'`orc/videomixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videomixer-videomixer.Tpo $(DEPDIR)/orc_videomixer-videomixer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videomixer.c' object='orc_videomixer-videomixer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -c -o orc_videomixer-videomixer.o `test -f 'orc/videomixer.c' || echo '$(srcdir)/'`orc/videomixer.c orc_videomixer-videomixer.obj: orc/videomixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -MT orc_videomixer-videomixer.obj -MD -MP -MF $(DEPDIR)/orc_videomixer-videomixer.Tpo -c -o orc_videomixer-videomixer.obj `if test -f 'orc/videomixer.c'; then $(CYGPATH_W) 'orc/videomixer.c'; else $(CYGPATH_W) '$(srcdir)/orc/videomixer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/orc_videomixer-videomixer.Tpo $(DEPDIR)/orc_videomixer-videomixer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='orc/videomixer.c' object='orc_videomixer-videomixer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(orc_videomixer_CFLAGS) $(CFLAGS) -c -o orc_videomixer-videomixer.obj `if test -f 'orc/videomixer.c'; then $(CYGPATH_W) 'orc/videomixer.c'; else $(CYGPATH_W) '$(srcdir)/orc/videomixer.c'; fi` effectv.o: pipelines/effectv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT effectv.o -MD -MP -MF $(DEPDIR)/effectv.Tpo -c -o effectv.o `test -f 'pipelines/effectv.c' || echo '$(srcdir)/'`pipelines/effectv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/effectv.Tpo $(DEPDIR)/effectv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/effectv.c' object='effectv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o effectv.o `test -f 'pipelines/effectv.c' || echo '$(srcdir)/'`pipelines/effectv.c effectv.obj: pipelines/effectv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT effectv.obj -MD -MP -MF $(DEPDIR)/effectv.Tpo -c -o effectv.obj `if test -f 'pipelines/effectv.c'; then $(CYGPATH_W) 'pipelines/effectv.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/effectv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/effectv.Tpo $(DEPDIR)/effectv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/effectv.c' object='effectv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o effectv.obj `if test -f 'pipelines/effectv.c'; then $(CYGPATH_W) 'pipelines/effectv.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/effectv.c'; fi` flacdec.o: pipelines/flacdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacdec.o -MD -MP -MF $(DEPDIR)/flacdec.Tpo -c -o flacdec.o `test -f 'pipelines/flacdec.c' || echo '$(srcdir)/'`pipelines/flacdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacdec.Tpo $(DEPDIR)/flacdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/flacdec.c' object='flacdec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacdec.o `test -f 'pipelines/flacdec.c' || echo '$(srcdir)/'`pipelines/flacdec.c flacdec.obj: pipelines/flacdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flacdec.obj -MD -MP -MF $(DEPDIR)/flacdec.Tpo -c -o flacdec.obj `if test -f 'pipelines/flacdec.c'; then $(CYGPATH_W) 'pipelines/flacdec.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/flacdec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flacdec.Tpo $(DEPDIR)/flacdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/flacdec.c' object='flacdec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flacdec.obj `if test -f 'pipelines/flacdec.c'; then $(CYGPATH_W) 'pipelines/flacdec.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/flacdec.c'; fi` simple-launch-lines.o: pipelines/simple-launch-lines.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple-launch-lines.o -MD -MP -MF $(DEPDIR)/simple-launch-lines.Tpo -c -o simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple-launch-lines.Tpo $(DEPDIR)/simple-launch-lines.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/simple-launch-lines.c' object='simple-launch-lines.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c simple-launch-lines.obj: pipelines/simple-launch-lines.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple-launch-lines.obj -MD -MP -MF $(DEPDIR)/simple-launch-lines.Tpo -c -o simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple-launch-lines.Tpo $(DEPDIR)/simple-launch-lines.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/simple-launch-lines.c' object='simple-launch-lines.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi` tagschecking.o: pipelines/tagschecking.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tagschecking.o -MD -MP -MF $(DEPDIR)/tagschecking.Tpo -c -o tagschecking.o `test -f 'pipelines/tagschecking.c' || echo '$(srcdir)/'`pipelines/tagschecking.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tagschecking.Tpo $(DEPDIR)/tagschecking.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/tagschecking.c' object='tagschecking.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tagschecking.o `test -f 'pipelines/tagschecking.c' || echo '$(srcdir)/'`pipelines/tagschecking.c tagschecking.obj: pipelines/tagschecking.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tagschecking.obj -MD -MP -MF $(DEPDIR)/tagschecking.Tpo -c -o tagschecking.obj `if test -f 'pipelines/tagschecking.c'; then $(CYGPATH_W) 'pipelines/tagschecking.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/tagschecking.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tagschecking.Tpo $(DEPDIR)/tagschecking.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/tagschecking.c' object='tagschecking.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tagschecking.obj `if test -f 'pipelines/tagschecking.c'; then $(CYGPATH_W) 'pipelines/tagschecking.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/tagschecking.c'; fi` pipelines_wavenc-wavenc.o: pipelines/wavenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -MT pipelines_wavenc-wavenc.o -MD -MP -MF $(DEPDIR)/pipelines_wavenc-wavenc.Tpo -c -o pipelines_wavenc-wavenc.o `test -f 'pipelines/wavenc.c' || echo '$(srcdir)/'`pipelines/wavenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavenc-wavenc.Tpo $(DEPDIR)/pipelines_wavenc-wavenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavenc.c' object='pipelines_wavenc-wavenc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -c -o pipelines_wavenc-wavenc.o `test -f 'pipelines/wavenc.c' || echo '$(srcdir)/'`pipelines/wavenc.c pipelines_wavenc-wavenc.obj: pipelines/wavenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -MT pipelines_wavenc-wavenc.obj -MD -MP -MF $(DEPDIR)/pipelines_wavenc-wavenc.Tpo -c -o pipelines_wavenc-wavenc.obj `if test -f 'pipelines/wavenc.c'; then $(CYGPATH_W) 'pipelines/wavenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavenc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavenc-wavenc.Tpo $(DEPDIR)/pipelines_wavenc-wavenc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavenc.c' object='pipelines_wavenc-wavenc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavenc_CFLAGS) $(CFLAGS) -c -o pipelines_wavenc-wavenc.obj `if test -f 'pipelines/wavenc.c'; then $(CYGPATH_W) 'pipelines/wavenc.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavenc.c'; fi` pipelines_wavpack-wavpack.o: pipelines/wavpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -MT pipelines_wavpack-wavpack.o -MD -MP -MF $(DEPDIR)/pipelines_wavpack-wavpack.Tpo -c -o pipelines_wavpack-wavpack.o `test -f 'pipelines/wavpack.c' || echo '$(srcdir)/'`pipelines/wavpack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavpack-wavpack.Tpo $(DEPDIR)/pipelines_wavpack-wavpack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavpack.c' object='pipelines_wavpack-wavpack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -c -o pipelines_wavpack-wavpack.o `test -f 'pipelines/wavpack.c' || echo '$(srcdir)/'`pipelines/wavpack.c pipelines_wavpack-wavpack.obj: pipelines/wavpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -MT pipelines_wavpack-wavpack.obj -MD -MP -MF $(DEPDIR)/pipelines_wavpack-wavpack.Tpo -c -o pipelines_wavpack-wavpack.obj `if test -f 'pipelines/wavpack.c'; then $(CYGPATH_W) 'pipelines/wavpack.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavpack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pipelines_wavpack-wavpack.Tpo $(DEPDIR)/pipelines_wavpack-wavpack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pipelines/wavpack.c' object='pipelines_wavpack-wavpack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pipelines_wavpack_CFLAGS) $(CFLAGS) -c -o pipelines_wavpack-wavpack.obj `if test -f 'pipelines/wavpack.c'; then $(CYGPATH_W) 'pipelines/wavpack.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/wavpack.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf elements/.libs elements/_libs -rm -rf generic/.libs generic/_libs -rm -rf orc/.libs orc/_libs -rm -rf pipelines/.libs pipelines/_libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f elements/$(am__dirstamp) -rm -f generic/$(am__dirstamp) -rm -f orc/$(am__dirstamp) -rm -f pipelines/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # keep target around, since it's referenced in the modules' Makefiles clean-local-check: @echo # hangs spectacularly on some machines, so let's not do this by default yet @HAVE_VALGRIND_TRUE@check-valgrind: @HAVE_VALGRIND_TRUE@ $(MAKE) valgrind @HAVE_VALGRIND_FALSE@check-valgrind: @HAVE_VALGRIND_FALSE@ @true # run any given test by running make test.check # if the test fails, run it again at at least debug level 2 %.check: % @$(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=20 \ $* || \ $(TESTS_ENVIRONMENT) \ GST_DEBUG=$$GST_DEBUG,*:2 \ CK_DEFAULT_TIMEOUT=20 \ $* # run any given test in a loop %.torture: % @for i in `seq 1 $(LOOPS)`; do \ $(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=20 \ $*; done # run any given test in an infinite loop %.forever: % @while true; do \ $(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=20 \ $* || break; done # valgrind any given test by running make test.valgrind %.valgrind: % @$(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=360 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ $(VALGRIND_PATH) -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ --leak-resolution=high --num-callers=20 \ ./$* 2>&1 | tee valgrind.log @if grep "==" valgrind.log > /dev/null 2>&1; then \ rm valgrind.log; \ exit 1; \ fi @rm valgrind.log # valgrind any given test and generate suppressions for it %.valgrind.gen-suppressions: % @$(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=360 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ $(VALGRIND_PATH) -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ --leak-resolution=high --num-callers=20 \ --gen-suppressions=all \ ./$* 2>&1 | tee suppressions.log # valgrind any given test until failure by running make test.valgrind-forever %.valgrind-forever: % @while $(MAKE) $*.valgrind; do \ true; done # gdb any given test by running make test.gdb %.gdb: % @$(TESTS_ENVIRONMENT) \ CK_FORK=no \ $(LIBTOOL) --mode=execute \ gdb $* # torture tests torture: $(TESTS) -rm test-registry.xml @echo "Torturing tests ..." @for i in `seq 1 $(LOOPS)`; do \ $(MAKE) check || \ (echo "Failure after $$i runs"; exit 1) || \ exit 1; \ done @banner="All $(LOOPS) loops passed"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo $$dashes; echo $$banner; echo $$dashes # forever tests forever: $(TESTS) -rm test-registry.xml @echo "Forever tests ..." @while true; do \ $(MAKE) check || \ (echo "Failure"; exit 1) || \ exit 1; \ done # valgrind all tests valgrind: $(TESTS) @echo "Valgrinding tests ..." @failed=0; \ for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ $(MAKE) $$t.valgrind; \ if test "$$?" -ne 0; then \ echo "Valgrind error for test $$t"; \ failed=`expr $$failed + 1`; \ whicht="$$whicht $$t"; \ fi; \ done; \ if test "$$failed" -ne 0; then \ echo "$$failed tests had leaks or errors under valgrind:"; \ echo "$$whicht"; \ false; \ fi # valgrind all tests and generate suppressions valgrind.gen-suppressions: $(TESTS) @echo "Valgrinding tests ..." @failed=0; \ for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ $(MAKE) $$t.valgrind.gen-suppressions; \ if test "$$?" -ne 0; then \ echo "Valgrind error for test $$t"; \ failed=`expr $$failed + 1`; \ whicht="$$whicht $$t"; \ fi; \ done; \ if test "$$failed" -ne 0; then \ echo "$$failed tests had leaks or errors under valgrind:"; \ echo "$$whicht"; \ false; \ fi inspect: @echo "Inspecting features ..." @for e in `$(TESTS_ENVIRONMENT) $(GST_INSPECT) | head -n -2 \ | cut -d: -f2`; \ do echo Inspecting $$e; \ $(GST_INSPECT) $$e > /dev/null 2>&1; done help: @echo @echo "make check -- run all checks" @echo "make torture -- run all checks $(LOOPS) times" @echo "make (dir)/(test).check -- run the given check once" @echo "make (dir)/(test).forever -- run the given check forever" @echo "make (dir)/(test).torture -- run the given check $(LOOPS) times" @echo @echo "make (dir)/(test).gdb -- start up gdb for the given test" @echo @echo "make valgrind -- valgrind all tests" @echo "make valgrind.gen-suppressions -- generate suppressions for all tests" @echo " and save to suppressions.log" @echo "make (dir)/(test).valgrind -- valgrind the given test" @echo "make (dir)/(test).valgrind-forever -- valgrind the given test forever" @echo "make (dir)/(test).valgrind.gen-suppressions -- generate suppressions" @echo " and save to suppressions.log" @echo "make inspect -- inspect all plugin features" @echo @echo @echo "Additionally, you can use the GST_CHECKS environment variable to" @echo "specify which test(s) should be run. This is useful if you are" @echo "debugging a failure in one particular test, or want to reproduce" @echo "a race condition in a single test." @echo @echo "Examples:" @echo @echo " GST_CHECKS=test_this,test_that make element/foobar.check" @echo " GST_CHECKS=test_many_threads make element/foobar.forever" @echo clean-local: clean-local-check clean-local-orc orc/deinterlace.c: $(top_srcdir)/gst/deinterlace/tvtime.orc $(MKDIR_P) orc/ $(ORCC) --test -o $@ $< orc/videomixer.c: $(top_srcdir)/gst/videomixer/blendorc.orc $(MKDIR_P) orc/ $(ORCC) --test -o $@ $< orc/videobox.c: $(top_srcdir)/gst/videobox/gstvideoboxorc.orc $(MKDIR_P) orc/ $(ORCC) --test -o $@ $< clean-local-orc: rm -rf orc # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/check/gst-plugins-good.supp0000644000175000017500000000546611671175355020357 00000000000000{ Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_finish_decompress } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_consume_input fun:jpeg_read_header } { Memcheck:Cond fun:jpeg_fill_bit_buffer fun:jpeg_huff_decode obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_read_raw_data } { Memcheck:Cond fun:jpeg_fill_bit_buffer obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_read_raw_data } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_consume_input fun:jpeg_read_header } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* fun:jpeg_finish_compress } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_finish_compress } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_finish_compress } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_write_raw_data } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_write_raw_data } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_write_raw_data } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jpeg_write_raw_data } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jinit_compress_master fun:jpeg_start_compress } { Memcheck:Cond obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* obj:/usr/lib/libjpeg.so.* fun:jinit_compress_master fun:jpeg_start_compress } gst-plugins-good-0.10.31/tests/check/generic/0000755000175000017500000000000011720565323015716 500000000000000gst-plugins-good-0.10.31/tests/check/generic/index.c0000644000175000017500000000716111671175354017124 00000000000000/* GStreamer * unit test for index setting on all elements * Copyright (C) 2005 Thomas Vander Stichele * Copyright (C) 2011 Tim-Philipp Müller * * 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 static GList *elements = NULL; static void setup (void) { GList *features, *f; GList *plugins, *p; gchar **ignorelist = NULL; const gchar *INDEX_IGNORE_ELEMENTS = NULL; GST_DEBUG ("getting elements for package %s", PACKAGE); INDEX_IGNORE_ELEMENTS = g_getenv ("GST_INDEX_IGNORE_ELEMENTS"); if (!g_getenv ("GST_NO_INDEX_IGNORE_ELEMENTS") && INDEX_IGNORE_ELEMENTS) { GST_DEBUG ("Will ignore element factories: '%s'", INDEX_IGNORE_ELEMENTS); ignorelist = g_strsplit (INDEX_IGNORE_ELEMENTS, " ", 0); } plugins = gst_registry_get_plugin_list (gst_registry_get_default ()); for (p = plugins; p; p = p->next) { GstPlugin *plugin = p->data; if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0) continue; features = gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), gst_plugin_get_name (plugin)); for (f = features; f; f = f->next) { GstPluginFeature *feature = f->data; const gchar *name = gst_plugin_feature_get_name (feature); gboolean ignore = FALSE; if (!GST_IS_ELEMENT_FACTORY (feature)) continue; if (ignorelist) { gchar **s; for (s = ignorelist; s && *s; ++s) { if (g_str_has_prefix (name, *s)) { GST_DEBUG ("ignoring element %s", name); ignore = TRUE; } } if (ignore) continue; } GST_DEBUG ("adding element %s", name); elements = g_list_prepend (elements, (gpointer) g_strdup (name)); } gst_plugin_feature_list_free (features); } gst_plugin_list_free (plugins); g_strfreev (ignorelist); } static void teardown (void) { GList *e; for (e = elements; e; e = e->next) { g_free (e->data); } g_list_free (elements); elements = NULL; } GST_START_TEST (test_set_index) { GstElement *element; GstIndex *idx; GList *e; idx = gst_index_factory_make ("memindex"); if (idx == NULL) return; gst_object_ref_sink (idx); for (e = elements; e; e = e->next) { const gchar *name = e->data; GST_INFO ("testing element %s", name); element = gst_element_factory_make (name, name); fail_if (element == NULL, "Could not make element from factory %s", name); gst_element_set_index (element, idx); gst_object_unref (element); } gst_object_unref (idx); } GST_END_TEST; static Suite * index_suite (void) { Suite *s = suite_create ("index"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_checked_fixture (tc_chain, setup, teardown); tcase_add_test (tc_chain, test_set_index); return s; } GST_CHECK_MAIN (index); gst-plugins-good-0.10.31/tests/check/generic/states.c0000644000175000017500000001443111671175355017317 00000000000000/* GStreamer * * unit test for state changes on all elements * * Copyright (C) <2005> Thomas Vander Stichele * * 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 #include static GList *elements = NULL; static void setup (void) { GList *features, *f; GList *plugins, *p; gchar **ignorelist = NULL; const gchar *STATE_IGNORE_ELEMENTS = NULL; GST_DEBUG ("getting elements for package %s", PACKAGE); STATE_IGNORE_ELEMENTS = g_getenv ("GST_STATE_IGNORE_ELEMENTS"); if (!g_getenv ("GST_NO_STATE_IGNORE_ELEMENTS") && STATE_IGNORE_ELEMENTS) { GST_DEBUG ("Will ignore element factories: '%s'", STATE_IGNORE_ELEMENTS); ignorelist = g_strsplit (STATE_IGNORE_ELEMENTS, " ", 0); } plugins = gst_registry_get_plugin_list (gst_registry_get_default ()); for (p = plugins; p; p = p->next) { GstPlugin *plugin = p->data; if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0) continue; features = gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), gst_plugin_get_name (plugin)); for (f = features; f; f = f->next) { GstPluginFeature *feature = f->data; const gchar *name = gst_plugin_feature_get_name (feature); gboolean ignore = FALSE; if (!GST_IS_ELEMENT_FACTORY (feature)) continue; if (ignorelist) { gchar **s; for (s = ignorelist; s && *s; ++s) { if (g_str_has_prefix (name, *s)) { GST_DEBUG ("ignoring element %s", name); ignore = TRUE; } } if (ignore) continue; } GST_DEBUG ("adding element %s", name); elements = g_list_prepend (elements, (gpointer) g_strdup (name)); } gst_plugin_feature_list_free (features); } gst_plugin_list_free (plugins); g_strfreev (ignorelist); } static void teardown (void) { GList *e; for (e = elements; e; e = e->next) { g_free (e->data); } g_list_free (elements); elements = NULL; } GST_START_TEST (test_state_changes_up_and_down_seq) { GstElement *element; GList *e; for (e = elements; e; e = e->next) { const gchar *name = e->data; GST_INFO ("testing element %s", name); element = gst_element_factory_make (name, name); fail_if (element == NULL, "Could not make element from factory %s", name); if (GST_IS_PIPELINE (element)) { GST_DEBUG ("element %s is a pipeline", name); } gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_PLAYING); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_NULL); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_PLAYING); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_NULL); gst_object_unref (GST_OBJECT (element)); } } GST_END_TEST; GST_START_TEST (test_state_changes_up_seq) { GstElement *element; GList *e; for (e = elements; e; e = e->next) { const gchar *name = e->data; GST_INFO ("testing element %s", name); element = gst_element_factory_make (name, name); fail_if (element == NULL, "Could not make element from factory %s", name); if (GST_IS_PIPELINE (element)) { GST_DEBUG ("element %s is a pipeline", name); } gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_PLAYING); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_NULL); gst_object_unref (GST_OBJECT (element)); } } GST_END_TEST; GST_START_TEST (test_state_changes_down_seq) { GstElement *element; GList *e; for (e = elements; e; e = e->next) { const gchar *name = e->data; GST_INFO ("testing element %s", name); element = gst_element_factory_make (name, name); fail_if (element == NULL, "Could not make element from factory %s", name); if (GST_IS_PIPELINE (element)) { GST_DEBUG ("element %s is a pipeline", name); } gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_PLAYING); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_PLAYING); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_PLAYING); gst_element_set_state (element, GST_STATE_PAUSED); gst_element_set_state (element, GST_STATE_READY); gst_element_set_state (element, GST_STATE_NULL); gst_object_unref (GST_OBJECT (element)); } } GST_END_TEST; static Suite * states_suite (void) { Suite *s = suite_create ("states"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_checked_fixture (tc_chain, setup, teardown); tcase_add_test (tc_chain, test_state_changes_up_and_down_seq); tcase_add_test (tc_chain, test_state_changes_up_seq); tcase_add_test (tc_chain, test_state_changes_down_seq); return s; } GST_CHECK_MAIN (states); gst-plugins-good-0.10.31/tests/files/0000755000175000017500000000000011720565324014330 500000000000000gst-plugins-good-0.10.31/tests/files/id3-407349-1.tag0000644000175000017500000000046011671175355016340 00000000000000ID3TDAT2306TYER1977Pgst-plugins-good-0.10.31/tests/files/pcm16sine.flv0000644000175000017500000001055311671175355016600 00000000000000FLV d onMetaDatametadatacreatorGStreamer FLV muxer creationdateFri Jul 31 19:55:0 2009 o >j $h >%+:1 >6<%AE >JNRTV >Y\_Ka >cde,f >ef7fed >Hca__\ >YV#S;O >KFA< >^71*,J& >D   >$Q >M  >(jɆ >k >ǣ >, >ᙜ >G6C >^٢ >pO >Ȁ >. / >m" >[  >.@$.*/ >5:@D >IMQU >X[^` >bafKfed >ca_t] >Z|WS%P >KGB= >8"3z-' >!J >0_ >o >}ִ˸ > >ުxl >iy >š >4֝ >۟@# >g >< >ѱ׫ >O > E >"(. >D49>C >{HLPT >)X@[]X` >Tbc!ee >XfYfe'e >c^be` ^ >Q[LHC> >9d4.( >#j > ; >t$ >] >  >~6 >O= ># >o >][f >ɪ >r >ZLa >: > s% >a!'X- >3x8=B >qGKPS >iWZe]_ >acde >Ifbff^e >Cdb`^ >[XUQ >MIE @ >;50P* >c$R" > G >S/ >,PӠ$ >ٽ >gå >kN >=K >ߙ  > > >vOhĽ >I >)n+ >b  > '&, >1?7dFJ#O S >VY\Q_ >ya?cde >5fef.fe >d#cWa(_ >\YhVR >NJFBA >/<6[1+ >%I > % >X >ڡ_ > $ >T`v > >yי >ǙYQ >p >4Ǭ >f/: >εӓٙ >T >  H >$* >u06[;x@ >SEI4N1R onMetaDatatimes A?8Go*ZG?8KBt?j9?8M6?ap3?j:э%?QDB?8N6?Xu?ap3?kņ@j:э%@ݿη@QDB@ M@8N6@a@@ Xu@ ݽؕ@ b4~9@y1@l.C@x@j;q@#>5@g@hp@QE@ Jw@ M@~GA@8N6@D@a@@eAD@Xu@? ?@ݽؕ@L/+g@bw\@$Y@ytf@3@lr"@ SxW)@ x]@! Y[@!j;q@!S@"#>5@"҈p@"g@#:Q@#hp@#cϳ1@$QE@$&NHbo@% l @%gO@%=.@&!)@&~i/n@&mz-@'8Nğ filepositions A@c@i@o@r@u@x@{@~@@@@@@@@@@@@@@@@@@`@ @@@`@ @@@`@ @@@`@ @@@`@ @@@0@@@P@@@p@@0@@@P@@@p@@0@@@P@@@p@@0gst-plugins-good-0.10.31/tests/files/Makefile.am0000644000175000017500000000035311677341661016314 00000000000000 EXTRA_DIST = \ audiotestsrc.flac \ id3-407349-1.tag \ id3-407349-2.tag \ id3-447000-wcop.tag \ id3-577468-unsynced-tag.tag \ id3-588148-unsynced-v24.tag \ pcm16sine.flv \ pinknoise-vorbis.mkv \ test-cert.pem \ test-key.pem gst-plugins-good-0.10.31/tests/files/id3-447000-wcop.tag0000644000175000017500000000055011671175355017134 00000000000000ID3VTALBLoser FriendlyTCON Acoustic PopTIT2 Cut Me LooseTPE1 SteadmanTRCK1TXXXCT_GAPLESS_DATA0TCOPn Steadman. Licensed to the public under http://creativecommons.org/licenses/by/3.0/ verify at http://test.comWCOP+http://creativecommons.org/licenses/by/3.0/WOAFhttp://test.comgst-plugins-good-0.10.31/tests/files/id3-577468-unsynced-tag.tag0000644000175000017500000002600011671175355020611 00000000000000ID3VJAPIC&image/gifGIF89a0777yyy FFF ִ{P4ΒeȹVVVgggɵܢ sX&&' ШR ʬoر핆lUҖ “/֚ 򁁁jCڝ h衡vKŵ2liW6N Sŋ ߥ ʎ ēܢʌ >( Ĉ_l+ݪ ۴ whK͙ z uӔԙ w\ÜGܾw ]>jٞܭ0޴N  p ' ĸ آ ۧqü y ^I$ןx[# ߯ ĉe]^^ͩ   }4 rT  >>>,,,ppp~NNN111 ƞ ߹\ݹjL {lM'خ !,I H*\ȰÇ#JHd3btVǏ +^̈ğ`V10cʜ8ғd]`y3УDdf*]t$@HJj adʵ+E$JNllʶdn^3K,jupc-1%;1W㪮" 2Yy+VLXUn-LZb@e2-Ӂ SmVػ Pl\o+7xQޭH;R3hK{pW ok,o7v@" !2n6pmb_Yt0@xuSwN ?,H<9XzIA3uxX2;t bU$YxRͣ2 70+SFeLE\T S;mU`0PJaLci_PR#yR }ތ'WѼٖi52LYQ kt`v@VvV ҇P((v6 ȁw N@ƹ: ̠@Jq 6Jh,Cd5H( G =pt7}06O ߇`%H1Nf n wt2{p @mz 1  HCɠ >'|P  p P :(9+Pzt~A@DR!Ƞ(I 9vٗ% Ѐ F1U7 dt0&%p4 n! Ivx(a T pm0 !%hex mPx P޷HҰ m@*W ՠ1 Ї x(I S5 5 "'q, ڀOP qȠP }؇}  O`; `\&$Hzt 7 䨏 m% & PmPFJ n@% `=7Xa"  Y W TΧ E (`Vɗ%3cY np 3p1)%ٛHzJ 8 ۮ*:Ϻ p"Jh7.̀ڽ{`4pк^;ꟊe1+ 6" д! ]*Њ*۽.Ͱ `uKł/MS= h<;콠 .Q^q;-0MpȿTj۟p\ܟ T:"fqnRx\B2NJ .HǁMHc+&.NT܀H- ,N(xy[Ѡu"$"A%9'Srp{ .rm+[~Z[` #;ep^ 0 cpZg"*%p*-[OiBk:,K"pNm&O4B-H ҇zΠ *| *͐ K0p`S =^Tz&ާڝq@q02` k˯nSpKP?k Mm:ή/Nݟ+㣺 W~ k@ ms?t P>|M`HEHPe!PӐ vP- `<1da 6TJXH^P{u  T\p t`nɐ{%0ǐc~(+]4،}TP wP8%i.PX [g lO d ,r |ݽJ  z #0t I@w.@. .0 `UP! %K6̠Ad" GdNТŊJ<=A"DL&D TdRe-C&N2R9u34" JG{Rptj~ZuTxZ0 jP#Z˒EC0 JXcm( =lB)LN#ň9Yϟ,ylŅh&mlƮ}b, F7 0aBeb95QA 09R<&TMIŋ -HL-X8Bffb F( ?ވA1ƘT"fReD" 8gnDX&A%Zie૪*nI'-ri\k&Zf! L+he0z +X "A$  Z SHLEz# ?YC"xa*L. 'v{6jKKe. ?8 =@0@P#BYŠx;\ÓET(1X6=4~jBFE$/a$hKDuRd Kzfg|# x tg,1G= g m]cI&e%AgKG7H͖9B-N2ߊkz0YB#P_V`餓IXC>N&+&řl8"D(F-[ VX%tJӵ02Sm&{Q] VSP,pq,p Zj~`ÊIff0ރT!dcA+}4 Ipx\뉞%7h!Pbz'o!784gÔ>~iF'xPԹMtm71`ЕorMA)6Y_xXPd4+DA-xRpA5oXBg"Z(粓 b[>0*4@4t` ̀<pаA)e: QhT@A}:Za-AɸƱ%.Ll#(Y֖('k[4 xu 8`68 #T8DB70ZTP'ā 鬲EFQu/dTDẠ9Dw2CHD#Ed0QaFx9c.^[A#FvA$OhV8$C8>D6 #%sDHQzo5V ^ P"0_UNZMk= (VxbULgpX c8UJ4sS!A0t7AVo. Կ$XID]no(nYa K9~ QoW݂ 8C6oݓ6]w6oK0*0|PSnܢ1""IG)C-8z9%@J9i uVSل.ܐ[KYYaZ,oIRcNep$ Jp6UjȮ/8 0iy`! cXjeO>öXX @ `3&,v-|EBQBaɱyrdă.>䞗݆H&Ҁ<% (* eY=3H{l`(đ ^<\m>Cd/C@3Ѭ|oC9P@8wL:(pVRO=@թp-elB u(CF۷s#S)H0q@$̈́ETՊ_ C*Rq^H@ޓo/ ~&;1N&\ Rf\;l>> qz]娃~/!QPP< Ա~@Pv0o8t84c c{x>D#h6#4Ȇm`) )9z3B6B[> yw(alXhPEr3#1(Ls2Ždx[35&r(*g,a9XăJB>T \) xB cS>0뉋=X3{Dh&zr?D 3=p *>Cz]Q+>@%`+ @`0A!Or@=06S +xN\6ˑ3pK(H#Y\GDȕP֋/=:0@Cfdys qiTIj":z\q xuvԁ)Pzbab_ȜoAxTHiHɘ+¢ *?@UA Ȃ"HG $lǖSȧ+TeJ+pƱkDɺlH @Yx,JʦDi r nF{7s+R⋆#o'& RɜK葞=L|Qd5fhhՁ"hʦĤJu*@0*uFŎHg _Є+,M)p-W7͆8-U`<QQ,xMU!͂ (49(OxSSp0KMcͥU|Xd_V: pU\M09i9x9XL\~ћ%kTXZ0Z-UG{GNJlp95`GZT~W$՚+d؆m[VF ;TALBAlbumTCONPopTIT2ARTISTTPE1݅NTXXX!Tagging time2009-04-02T15:47:57HLAME3.93UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULAME3.93UUUUUUUUUUU;HUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULAME3.93UUUUUUUUUUUvHUUUUUUUUUUUUUUUgst-plugins-good-0.10.31/tests/files/test-key.pem0000644000175000017500000000156711671175355016537 00000000000000-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQDDNP9bF91epvaFvKNBq/cW03u0vGPdRtkoIoNiWLMGw0vFv17F 95uFXiEKgBxpI28tSeTe0BeeT4EOwgLVXhJvCodhHXs+c7dhnx+Q3CHlEZnA3H7N p918XK77dKH6YTTduWOkOVOyA8vwKIUJ3rww9Ge4egq3mJOlLIsLoN/SpwIDAQAB AoGAOGAi6zzuKrrPcXo0L/ApEQeMr3rE4I/ogUXOaeWx9l8KkBafmU7UNGUl57Fu AxM/tXWkypCQcaEGZau0Q8jCS5wKgynNi72F4OzBqgjgW4vvtrjfC1LagnCd2ZMX V5XVECjO/sEDg0hJeOsXlKbECAgvHMU3dSCGO7DmuG9tIxkCQQDsth1VvVjOdfp6 klOfYzbAM1p9HIcNPJMeuBFqq//UHX4aPqh/6G6W06TOTN+bjZBmitG9yjV958t2 rPxl64f7AkEA0x0WOLm5S0LNsv7zwjXuTcj+NCHL36b3dK90oxX8Gq69PANL/EJY ItpHNLgzzo4DRmQy8q0WZlC9HYk1YljERQJAEN7+AkFnlfeErb3GJgMNQO+oEGi7 G29o0PSvkRnHNxgPB9HVcqBfWXKmOWnzOgQB+b0FK/DAlUOzFbdImf8KhwJAFLty hzeV/tIcqUtoXNY3BOSMMkpvXxNikc75QVrTWzt10gLw32EUjreo7oB4dfx0TeFh L3vYC0w6hkAHQhU9kQJAPSEQ+Bqzlk6BrQNrNFEVzi1Rwpz7LOzhOjuYW6bsiAdX axA4r6Xh25x08ZU7cqX7gwVLHL6pgrEKuUs0Nc5Klg== -----END RSA PRIVATE KEY----- gst-plugins-good-0.10.31/tests/files/id3-407349-2.tag0000644000175000017500000000046011671175355016341 00000000000000ID3TYER1977TDAT2306Pgst-plugins-good-0.10.31/tests/files/pinknoise-vorbis.mkv0000644000175000017500000001255611677341661020310 00000000000000EߣBmatroskaBBSgBMtpMSIfS|MSTkSMSSkSMSTgS,Ifrsٿp1M%kV*ױB@D@]bKMGStreamer plugin version 0.10.30.1WAGStreamer Matroska muxerDau Tk 6 -ׁsňD Q @刀A_VORBIScL[vorbisD8vorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)DESCRIPTION=audiotest wavevorbis"BCV@$s*FsBPBkBL2L[%s!B[(АU@AxA!%=X'=!9xiA!B!B!E9h'A08 8E9X'A B9!$5HP9,(05(0ԃ BI5gAxiA!$AHAFAX9A*9 4d((  @Qqɑɱ  YHHH$Y%Y%Y扪,˲,˲,2 HPQ Eq Yd8Xh爎4CS# G,]6MuC74ӴmUut]_uhPTU]WeUW}[}UUYՖa} Uum]X~2tu[h뺱̾L(CLABH)R9)sRB)RR9&%sNJ(PJKB)RZl՚Z5Z(PJ[k5FAȜ9'Z(9*:)Z,)X9'%J!JL%C*b,)ZlŘs(ŒJl%X[L9s9'%sNJ(RRksR:)eJ*)XJJ1sNJ!BJ%SJRb+)XJjŘsK1PR%KJ1snAh-c(%cC)b,)cŘs(%ƒJ%X[sNZkmsЩZSLsYsZ(PJZ[9Rb+)XJŘskPJ%XKJ5k5ZŘkjs1Sk5kNZsc&BCVQ!J1A141朔1 R1R2 RRR RkRRj4%(4d% `pA'@pBdH4,1$&(@Et.:B H 7<'RpFGHH!DD4SnAudioCul7rGᄀόMo!6ZtIe :Nim@,5(-. ]kޢ6UOAhɼsMے= z|I#;ƓmXț@'KQ H#m!%Ci-1(+o7uuZڎ~^q %ɒmbVD8>-F|sWVAq2x'nY!L燍?7M`]0Ke6CDXa6>nլj4ըY`O!wR9N+]Rtȑ>' ,ֆZכ@с>6ZU,VޔD˞16Cka$ԋIp/ן7kF]HR>ԗֹ_Im9L:68ިIʙ4G/wX*A"*m>csfU[6dz ҪnQY$:hUp7 S; DJs1VHe=5wu'x0Zk;:kMsȕbwƚF+ Vd_y!Hkle *f;tͰR,cTa1F~&hn݅Ԏ |$/fT_ /k} lTg,hTal;;Ak\N'?ػJy]q;A,kT_LmO}v3A?hbضu3nT]lmlo=rMSWiy9jmv7q,SCD'4sAJ4i~Gm%,G%B\-rYSkl<<<<'<><U<b<e<h<k<n<q<Tg ssgst-plugins-good-0.10.31/tests/files/audiotestsrc.flac0000644000175000017500000001114411671175355017617 00000000000000fLaC" @([=sٝzEF reference libFLAC 1.2.1 20070917DESCRIPTION=audiotest waveY<j $h F#X&0)&\`C&5ݣMb#VUEVTFMpdO'd1f'yʚֳV􋦨VT"ԋʋ5 e^B+KK(LYfK7g2Ԋc]&v}-%]vs;)ME"#`)bb144C `FQeiɮԌNH`Ťa20FZ# --K/Ԙ'&MMS!! [#(e- 0YdL bL'd221a [$嗡 ☘&&F$a5D0FL8#ɈerrvruMZi[$b&XZkd(#֚#e0#X&0)&\`C&5ݣMbŒ1eT\!j..IdЇ LAvCbw4A=&HMb112L02QFkLMsa C1~ L1&Hb2# `AʲehkvCbd1z0a|F.ԲԩJL# 1Hx21FQ !e'20A /ZL#-+*# +XQ)'4a'#^`#%Ar\&Eb1 &hCy~OS#)0 0#Z`FTSF0hFFbFNM4&@bɩ1tR)aTC2!0#vC0blN5ЎBa<&,NˈɄ#-dbS0/UbFh&$0 5I11   ]'ii2L!18MbZ)dŰG)`G0 0- SxQrʲĚ.)a `d֜qh!0'B]f\ob[S:*O(*9۷kSNE'$Te=I\xj!dHl,J+ʒFD0 `C.Q,k yNNyPJKHK-7K%cw$ne ~_IggSSNպ+i(zQ(@(/G0y|m5WɔF]ѵJrޗE2%'v"~WU{J/wj ufTd( vkt|FU$brףW:),,_1 쏪V{S#Ჟg5pF<̣RQ#wmc[Rz ˇ[9xΧ;NCnU紵r(TyɆ \߲3gjC`ө(ueNך0@2 xP-ʁ`P0;(JGǾ{.T9PF€)h-ƒ <=jD1F$n!ԟ $#T@Q(mpܯW(0R?qc~ rj{mK(O?eiQ4jRhAA/ZtrUY??U u|Fqa@ƂEG8󨥷36 U3ANtUm(TS~7QGv;*?MX=q&-TΠTC"x_ >W(*y|t]T裬lg .>=sejZݷy'`7Kn9!ҢTJїԟuqaڈjڛ{r „cNBl#8gQ#sc;w6Ɩn\ܢ6-lV3YMi1x~;Ip!1Oִv| Y15\8ՙc U")Iv!_Hh rNʃpѿV±11u)guH36V^RM5=ta&Z:ĜJqiM -Yd*KW[*H;la^Uߢ"viz%jJ)'!^cT [/ v/S=/t|;n_rǻO/JWl]>s/׊*}\ܟ/ H) \9}u3Eh .|9 preڏ_N-OhZNE|S>^['} /˛Sܧ4}UAWT Pz7u N[tеsTGwՒ9WL Iu@#z& )~O Lkvm7O/oi g;#~1L)?)o ?Ʌ'G9p~=2aOQsdɅiRؿnDj.gXFLQp6?ЦL6#ݧ=\Gg)iL_ihN杖s2auU/])\R!YCNjOx1/=4BJTeG`X+b-`sHY;3뱘;Ptum3N"'"݊@%,z:.㵸Bw޹&-k>zWIt|dAհ6Nl2>5 c]RJ7[!M>N x$r>swgDVXW޼/k HiGm3NuYSȶ'\6NZtR)y m?}Zd9+('?0SUgd>ܒif2`nY M^0XT(RD޲SߢTB oqlJF}qRc#/錳7W5:.溷3& nŵiyP5 mX|`cIb1Սt1;0ʌiGwkJҼ{’H *lY@P:ȍ>lc5L2יԳ>ʜNjvc-\PV`):z¨0 T PWP =Os{6?J(KۛĔ+ܡ3"Nf}$49ɕpyZ@ΞBsPUoá ֋}5hNs'8 Q$ A/G2&-c^!摨n>h,o4;}\C֭#*!`7: 1[q$dnaC):8#ʨ"rDU! m9Ak~.q6ES+~YӫuXΓP:d^[c.nڤgHS°mVPj`1[;NJUM02/-/-1+7`O yvQ,n^~{]npȍM9DJC!}2V/ ڨPS@PnH|SMzk<1-RήA:%wԫIʓ2Ս_Wl8S?~XW"d9wa,HYҟö`h˵>laFSI S{wiu)Kʳ gGmzO\fJ痰 4=,0?s?* -2mnG4r xG1XML’nO l)2{a6k8by*}4uAG(l{ SVXUKkj M8!6_e^(>-7!#:j*( @P( @I;Ao?śBoEPΪ8oʕm00jJÝtQss:GHQ=깠4ϔ7 F=̐ѢƒB%d5yjҧbԏTBOgj }=khCн(y[egCTroBHl.R srJ̓;ӟj%ky ! ҄))FNhZ/p8hIjSzښˉC#?UQ0{?$/ _@8r*}M9qEԐ\N9ڛp82cWX9 suJZF{dUQ:X!0gBjk5*vF_gDf[W[4s6{Ȏy/RcUX7!y; #\^wGþ2BO45WLCB1q}h6m#>Σ#a؝\ J+:씘@iǡ$ (c<]joG;*>aZuպˎu:ROz&*(ǖmC!j(ZO*m٣qm.گꅥc!θfۣ ۣ uq(yX2:|[%unh. )ƸDžy.a@~~gMAIT@AVMy>4 ԵI8s&OF- | Tq?4v$ "pGFq$qmd(-c+~:vH]8C B $sH46ts+,t6Nv^7! o<)zLvR|{AT=47I=]Gy*fn@I|ahVȉ-Y=Z-I(VOҠp#zQ \tr%Ɉ.}I-,SuKS=w $' wЄλqb*#NΏR3:RrjNѸv' AòfFLK+RT;$Q8ިR6$3u9#}YY ;V> Y5žlbQӺШKZA JuGšMASUǩZu~V\Hs\l%sAqЖYpsBHP#ׯY`k%L}!G39is[(( !|է>ׇIZYnI|tlQOۚ(la)ŕBr6 uLֵRTyD/ !P0hy4BԞ>&0QP"wT T(;uET =InP-;K.~ڨtͷM?6y ,AnwF։g:1X-^ўA4mэ92"qgvJP0TBl/$pwBVNq[H3ʹ*BHm"T #^Qr.L9+_ Uު9?%Cnn o#RRt)Cu0\7fKV$Q +Ӓ-A[Uo{UwkLy6Q:%(8ʹTxG'7rk.wFssiRG8TlGUl}뺑@hիCPESd\Ү÷`O7pZmC5J)SOcVKiSUPOET|·Qau~ a0춮w#5Dw7`VH>TʀA\#FFdn6X/( 젪wɠGU[Kdj#Ujӵrkk8)TAx(Pپy:\^cp^4dAV[qYSnʲ)]-+Z %P+F;= 3/N',pYv2- J S̃?r5sM .²30]C(LUCvӈZjs JTDqޖ:@[E8v~^ta!ǂ(S+➗ˇUN^m1t/2zr-8N@pJ\wƼQ}oDcC,ޥ.eE}lz$nx\.?rG}ȳN5/ ui)֤Tu|w򪄬sPsAW븰}w(P*ElV ()?lNhmu[ Gmޑmq}SqZ)%5Sj[Azw?:\ige[JEmO a)Xk6@Q j 4( (*cqA\Syd &l3%36ZA{hqh/if¢ }vPg؈էgV4יcM|Uy8EtEs_QU4PP1T*P*@+N?*P@B$4ty#llI # oETrkAs/|QN-˶j"֓rCZR4i)OJVFj8廫V!%XOGuAt|u pZi;֕iH#ޘ\OBg;ƒnxmCv"Jy"|/S%QKv;:HQSIsaLeM\+t6S IJbk.ezT2s*t[.;̡_=Բ\quTT3Lc7Y̷)ÎALV֥^^zy+ э804" eJ TrcH|'[ڞ+ҋh2QJ p}\ZGw*~Ϯ˗j)Ҹ?:Xx\y GQd'X+cUæm1]貥qNEyl8Tө=EIiOMAEMIvxX\G63TC;8~+2o;KK^HcEjEq< VEETuwQ(@P]gb+l:9̲RVJtiiqJ Ms]^R!ΎI#B{J*V-4by8N.-0`)}$Osܞ/oT{V-PAPP2r06 z 3(x55CO:_&{oNG`jr3JP#(|m2=r]Ƞ}~4j߶;AUe=Rpos&񊹝*)Pll_݊JkK~?banW8&D#TGµr)ºk^Zw;bC"OⳞ߽}¸jj[92荰L!him$ZR$|s_:8r㖯GsFui=c]ΡT*wPcmkBtkING1Q TE p-rKg.#ҮIˬVM9zn+Ą;!T+RҰp*g;j䟒S[ ?G;E"‪ P&4~t t @P &uAT5Px㺢~C‚eg4 PSȠ@~_fs@)GǺÊsEx抦adV.}$,~]Yy!}w:7F4vE`mg6? >5zr6noBf q (@}pL2D gZݳ\QOi;-uw)qeMSN*#aLH~:Υ0댩C`KK('5DU\ހ &@jƄwX{}=:qZ/U>uhv:_Ijg=iJzΌh/Vli$yP_vLv<:ZFVlFM&}+폘^oYѨj,ASⱼ-3ꏜZz$v s'Ҙ1_֣JeyHXOqڨBX C:  lAG.CPp3AGv>qڂ#?*~uTdE$(sNTuMGt%GzFz{z3:ڼ眸(h #EpN-rve67TE('?O.7vٻbX,x`@PgE7 aGQ pq5:#źW:B֕Azk碪.~Et:†g/_6?f5y0kK@T[:yo@wP4C*KQc2侠 4rJ7$u~N -oژR rZKJNG#E'UPPzqlEm 3F۲:eY]H%Y86ʒ]*tFm'd^uwezf\>Z*%}RQ*TWj9*mx:Iv7nxnvF7\qZq3[:Vtu(%}_d+Oar&cfLӳg]l5fR}toh$iRG=iIҎ wCtN}>.Qe0)N(#PQǺoh6֎8Vkq+Ѹ +jC~|RFJ|h*q3mТ;љl-9oFA%@97^Q)'!n};ܤHQ>S?/]HTT4+Εc>a#~HrXC[zm-h4= ׇYn)gu8ݪ64o%ke֯eE->V>qj2<ծ:cK(G/tkv֤V}e9ꎶO?[&{jB 0XZ=Xx*ڨ_ p80Hɴ{M'"ޚ ß"SzTSa[t83; \aEEܥ*%ƖrWU2P8=[(1"D2SQ"2(6 gR3A}欁qa:M̸rATUg8m*}`06C(*? DԹ2IY]vtYJj J06@+ؑ^6q eGR~Ś)k\n/AҸ3{40?7+T,(D#C3Imlrzgdi|O>~~MlE:h)P-( X4GO:#:t1<ڽ1^[6:;X^zu%h'Ġ(*DfAWuHV ã0^[3^AQh^2ۧܮvwJsJ_aÁ⡔qrR(nYBT^ ]GjƖ'mώ-SҞ.CwhD*c9'= t ;#>dYi)$G<򭶪˧M]4N|Cz4LK]rRGxd(aaܑ+mڳLKS_\r}} lYPNd̄':Zw>VޘLxE/pQ̬imB\gNY RJš̵QwqN>q QУuKwS\O'n5t΃:ܨ_RdN9\neVNs=8ug<=xm\4!Dzdǃ#!N}\FTw O/q^!wu%:B"yG~15E<0-[ &+6 \7opKfHRGW3Q;uSŎW;b( 6AR ԣ rO 1A7L .Pݨ_ry]tyJPr|며 Un/dXPq I+QNic_'@蟠@™pxv090r*ѯ6Za݀$O:2VPPRh,AX6%í,E`j-mNR!;H1nqnonDVli- #WTd/J'6ێ4)23{2[$[tTZAv0luۨV7#ǺT  mMl༿I|Hٔ~hʽ抽%#6H|Oy zDj@P>:)Q@Pb|.'Iס3Z~9ib[T|3XJm BZBXа$h[mkel[!8t%Q g 9eUSz^H> m@P@_e@P?* Cq=&U뙍3fm2Kg+ uB6VIJFTO1$vO7!Du}kIVZRpqYDæqJ:a ?ZN-y>Wl ( CL0/qku?k].]e+sþ2j>itGl>vK@Y'RgՍnw?^qO&6d6;w GcA߸"n)jޡ,l|ʿfiiHyu f-oDxvz7l יW,'J,A=GtO/竖#W̼De*fӒ`+@#Sn?BY%C~'WRSQ, [oJ=3:*(oBB+6Lܗ ZutJ&#gPS,x-)XP".cd (ekrz +lঃ]@^t:|hY%:)_ S:*bl`Pb@6T A)KS$:pBeLe3T9OK:^wC-\cgZV(TXQ.]6ƕ ]dIi d# u% (a:tJVl|bt3ܼ"q7mìDu[tI(Fp*ޫl3 ю۝i)@#ϺS<&>*Ip3ߧ:~DK3"|ah @b/ 92?2|Py}\q/YutbxrEz,I3[ϐ+u3W(.hq*l'F=G'#o%:(Ͼ‚u~OY y$#?]pxUr0Eߤ;O ww- ߫oW;Vf&Q z2x/μӶ"3ga)@~6RDUJ]Ҁ(-/?x5㨹9|zDBR-q{(Qc"䘫cy)떷Ҥu~ rHPm=b}["B2nGԇP q' d]kꛑ5@JgbN}R:mTGv<1mv,sܤ<P)tAPS ^,+L[LY.Ƒ{ -cRv899Peؕb7GQNyH!)VA+ eFR2RfSGZTPˑOGZ J2X] ,Pi[_L+>20Ϻ@P@g€eJ <EJHRIJr'NdWVGVmS1 ժEljq΄cNq˝mQ9[p4vHO'+|]ǖ~$H.x1 !88hԤ>9TӗM5W*.1tKH[kz3Nl12p([|<' @D(Xt ~#]|d]Mc*o{I2<]s-np˜ pϪ}G3ԵSNS!!-!-$+ ^uPwQUm wƨ3QSN'W5m>+}Tw|TtE;iJ'(}b!#~'$_FoSPy֖w? L#HТ=5gXG|41&6,V-Ԑ -4/)*R;ZVφS^8#NY01B Pg1|0[|ˊ[ۗ͹{bm+MN ΎDP⓲[eҞa=LN⾤N7F|)9^KJVy*O 25ny1AăF<:|TNxlnhxÌfHI[OU\K c+Vܳwd84ϏⓎy>iE)UQ!O!fBV? oa }r%`Ty)!lzCN0F 8i5ch(t (@Q['JG~'mP`QO-CXdrWfWc ,MMVվ4r]4՝Ҟ(d)H쀑+& @b P((gDH 8{^쭴׶^K@3>РIzsx㭤c3{.83gaЮd {~qʉm6RJY9U91( @PPJYX`Κ:}]vrt.\8Cq`%!nM5, u MhS콤]Xf;]LtZqX{g,/ bM.!uN%ƀ* NT tWnWs&`L[>y8Njw:«Kvo6~;Vno@Qp1I PfǛwSsjth~? C*|D})Z҄)A(PiOSvWVQz!+YґJI6 }ԡ XKd% XV7VIڵWDU0s7 $1_=DV)ɏUE/\!D _u_)ԣF3. \KDi-mϣFynpe~MS)><j1P3@PInM7f7?CWDuYJ`T~5y3HG"cL"Ld#N sm25<{&F"S<5vJR7Q;Έ a=2洮 b)V \cnZS)C&+ȅbJW9cZbcH +zF,T[ZKv凮aۊ}V&'30;D5|VKib  ΄ ⽔'s2A[ ѯDw*x9"8~࢐;9$(D ((@ Ek/FDu7:JH0cT{U\yZҪi3Zbe2"֔+uWU柰]6gm;Xݿ lzQD0(``Q0FynڄpdN-G`^ohQj#5mWÜtn:k厰yYĘEzҔ}qI-|@!֩ςqQͪLp.~u3c;~2vVz,QmϳO\_P4z^3Y`X6Qqyz2{M,FmvRPt Ez"Ҟ-wB#Cos7>sOc3jȼ-r'quBy<~Xlg^הT 4bT nڻVePy-Gq}BU+|X+MJvnEwIJR#gL"l=b*NVvBܙ{P0l}:|\r)PFsޢR})ZښҫGeN *F)9?M[ĕpa . )kC~Nu$%N;ըU ksH%b,jv~V#:.,FgP JHNrI>Jh/j%<|pk@9#bh 4 @P( ܹMJq!j8Tm?5ʼNj0@sUEHx=ϟBV?5X[KzSϯS[b@`xMw&bB{JcZ}whޯ~Tty|%wDt_p$#tS՟MȚs5gngL*Cv]Zrϑu$RevE:H\>Xy^a‡.#IҤ) j{gN;6}#Zx ^jWecߐ{Cϝk<^[ oGnkhocfE|-?,4mXw:i|NN6 mE!\Ҥ$MXNIV6=e|eTvˁu| y{'ڂ?:䤴[LxQRO5q^տmU(6I6-ݶI2Xz|R%H\.)n+`9Q6|;w4OP`3ln#A>@;rT"(t@P=pt7!:IoAmܩDpp v=8SϠ.@ PP̲ҝya-\Z=b$ :BH%TH$nkEUқv>/~NyŹ|\ҩ+Ҽkø[6FHxµ-ZX>yv2> rE-ѵIuZCjY䐵).io.: ~EN.M `;Q5;;3Wur^~mvW[[lA3KL'}g+tܹr(jP8v:żmӗ:+5ʧ3.;{xUHSj+%)R7{4nظ%)БEU;|:Ny%<8b/Kh9}gy/YE,&S^׆xI2/]Ze,ҁyQ+Qf zF૲KHQf3;'TkF8II }S}դPAnzRjh@8rh&$DTB^%~JKe&AKؠa-ĎҴ윓x~[PУԭC,ZF}rP6S#KK5iar$X8-1:S8ɪ"3ʛ ȔZ!(NB0IS4Y2"y昙>/=bAr,Y4Vz䝀fOz4x f ZJʾ QgP(@P:(*NN2Mz&M 8E nݷ/ިtt;{ n&S@l7qmf帄0pFA$7]}~ce5]*{ #xoGvPl'>g:ƪ(W>.\?vB}39|ƣU]_.|Cil#vZsI}p5;#OMYwtw 91 d@Y+(!ƇOj3W'Co+-*Ouc7<:\'?eMToBKjG!ĀXqK˧UvZ$΅%6[{$.Jzc(ZOik.StGvϻF#]Fdnn`%$VSV]}W-3ϯL4/=mr\fN:Ɨd?ak:+g0D9[B]mY(u>JQ\UYo>-)TArqWRy_C\IvFQ QlFAA7ڛhY-cͥjoQM\0]8m#j;Qxdzdϗ?24DZ VIUu4jqHKR$#rOfiuG3 8mCI!9<FU.)׉fn-hz}W^nwj;Ksre̙+M␒!_չ8=Bat~}Jz< ',p$NG}TcFzC9*!TUBPT@JT+zTE>zO:[hm0(FS%eZ-gN2 ALVr bDҥro#!}"( NN3IN=g@P@@ PT7eV.1M-xXB@՜$+Ma12/i57r8ˌ81P۵AGfM_)BFE1͍z;6#7g޾v3~%\FվawB6BS+ÓYii?g[T4[p:䷺UۨRwx-Ut$zw}(2Niflq2= ~٪>OVR4y7 -PS] NUΙq)Z씎j>_9fLWue>$OjЄ!)d<*|2;9'wy΢;GM߉Y2k'aSҟ U9$5oYR0É#A[;J 8 1}1 Р2GפJ8BZR;렘=bd9Hg=ZW]MC >k٢tⴸN~>*=FJh AeV!04 n<v;Kh$sѭyu,縜٢18'A=)۽NnCD| U. ,[N ϭ!gPc^!"Ӎ6>GR+kӫЏBwWgmGGx_͠gX$}*.Tx)ԱyÄ&jF.E=1Mykcz{Cg)lxe^>M|:|)ۅRq_֣2rO']TY|SL #~n19?VuU;Q?MXFG#Eb$ɔzKk) l Hm Pܐ(j@PU@@Fbd ycm('8ÉcY!;.Yvq;ޢO雈,3cglF.ߔ֬26q{ak.~8XҤݪtpy=+wqp{@?_:2u:UbmQ2<( *+A<rr),ōnR}4~e* wV΍(*D5kbNubI$JtJAY[NcO-E&&n .íˊm[o6JJJvM1;O&w,+8^m(:>sN#5"4VU5QZ}lcyg*%$Uk0} mbdIHڐ͍?:5#jO*/juLUlF TyoqeR=_ zzJM*RR)4/SHY0Qx;h%T1pN_E}, v#b+e^4!I JP%+D[RԾd%#` Hj#cdnX]}ȋã>")Kd㴵OO$r֙ҕ-%0ٿHmY TuVo_p en@ɍmJtZqpZz6ҹ/QTZ,ڞg H)9_ypD搭L(RD8,*SJ~w7_t"b.%JӥΤ3ui_mNT6͔C}Ns.(NrǞ6`Bڕj .: ֿ2,d q iV݆@ɸGw'Kt+!.1ees}P8㎭N8+qիRIܓM(A; (zü: JC HiBM%DiIAv|ht\P?mo,̨uQaC# ކ#28qve8C'Yԯl6ɢ0% H`6rx{AúNAF\cʚ;2/ a(}q]uEo:TG%JQܒy&VsD*emn3۠_11n,#UWxE0xvm0׎t[Vo_i[ʙ9+keםKL^_i+Y%9&Dfy$z5iXŭl$Rbk(pWzz>[G +͌խXszY’;OD]L:(rvp1H(u:[*н'gZ[N3eQITqߔ N͂n¥F*4GgKdhe|$2q8J s*;5(/Jkf7'O1QYkJ$(P؃WM=qEb#q:Sqz¥o+|V;Շ7ݽ\pYqרmհ;^=CQbF!>7B&rn6OreO(_)Jqe08S'`^եהn5[Icd!PT7*3&GRlOi}d&4y2+n֛_em#=A88eS)#IdBq?`1aQ(@f1Vw`;$BB{*εg;Q6m%J[m m)JR (Fdc=&Kȏ:PKmԵK]6M;g)|4st?73[yǾA־MqԩTha K@y!KðkV]H5lYSv$gz=%8C`VN"gjj{:Ѧsv[ lQ\d9hyVj55ݜ9|M89Ps8eҙ O}?Sk*avOgϴݎ_}ٽ{(ȥSWm~bǧJV 'WfR$%YLZrɮTxA@QJcpA=T* JKM$!XJFʛ*;x5 pGI)1-ӯNPܫєo!Xq##6A6 ZT8=d8:Jtj0 KUDkݴgn]$WhиS@Gv>qA)GwrIR(i%(V 0JԷ9uq$(ւ}-JQc2t5ϫAKS-reXԳ̓mNH-|uiXOe>VE.)TI1}$\'i2c+5pcEZ~C>̛%+J?q]H,;ZsC>%"\eA6^Q%Mp @P*]UPOYA;F=r|maF;Fa=[IW^s̡Kie&y*㻗tAպa+q c~i$YanwOyH2 iiPe!# BR6B%Mwyoޖ]y99,B1{GIr~{TE$wxP P: 4伔}5Gyʤswۍ s]tI%F@PP#tnm6hKm6l6JR9F*'j[X®&P}cҼV!vvoտC8뎸]ZyT(G[cm$96k )۟x+ TsnQCG8,ƽT[@]A^Dja ;5>%6^.Yx}G5e/53ϫNW ΎYX[^2.`7|8$Z2W:Z߇&e;wU-r1jZ\iYqsSÅHV$7ޥR'Zp!=; "Um .i%he/,@2Hc2W'Ȕ`u¥7 crcu9Fphq"յ %%\k{j Rcf=Cu~ё՟uCO͗|vNwɪ@1kSϹ*z \.ۋlsJt%hwQ; tAX^S<=! >#kvފ-4hi%HCmHPRTM:}<?9XD8̬YvUK_BЅa:呵VwWjq^QKLr mi)W8SL8;1AN<Tt'&PAP%;z''>E~'HcD9aךr,)[}';N@NB{JmcgJΥ84ͭn,+N?lɑ^d\ajORǏIRT+!(@PP:@PLQCC1>շ Wku)rV?t$w |EFVk<4̹t̥jcrczo? ˅ #,aœ1S%m׎9*PNHBrQoMnf""^AnhE@i~(>d|`{&KǼcxZuBC!W\ٖ+Am6:Le>Yn8u)_]hʀݣőrx:cuԯf`wfy6(:ɾZ Le[!r%4fG**Ep//8LbOZ}چ {ԽVtDz,E"z׿5Nޞ~%?dʱy@G0A8l;sWꮽ:AEP {\!z⋨ R@\l ܻFdz?8VE지닀_P6޼f>Ux~eHfq JWW~JHG3"56㩘'T6X:~kbv.䐣ʣa5^i >ؐ3 s 9%K;:W-Vis1xnKzH1Zi=1A'+qlҘXBNU!GKwf .jΫ!9 JhFa[P֯aխIJo((ydŒe[AєUwQy$bg"%E/}feT? iJRIgKQnhJ~(;G "[ k|OjNuД 4QQn p噬pZevWUzHTׁzQ=`EծGzqg|O`W]sTFQQ%nLGXݛ_Νndojsp!L'olS. ط(w3OXmcq)^XurUnjp::# RbxC{uN*ÒSMi%Qi}"`' HQ}K\!?{n%F5:Am%ZS;7AcԶqhG%d8mJTjTuuVq-ŽS^NKO eI惾9dț-nL}YZZvXԫ.WtL ;%hv倜 ;uΨU)j9R;Q@@ PP(ރc.+sR|UjR<\4y'Z/$gmjG\B$lTڰ<+ wT{ Mh|m³}8;WCzq=463)5G+xSiĭ ]/n`0A+?9'Xg!VΩQ[ΨZ&N+Ij,vL/!PKRr@68#~T{{FJ~+t۞YR_? (=͖Rʂ11[uGUK! jȸ sʽMPc|ѧC/f~ bWi-Ȗ[UM%u(aWQ OtvgZVd(ga*VC}[a$#JJϯ^$e.;GYs*IդmnF5KcK_t49%B8JB)]yˏ:]Yԥ($f;`} 4g( \Kmŝ(BFTOb2&=­)7hh_!^;6إJk \YBxJс\Z cI#$V}dQç^Pw.V9((z[Z?g=OWopg)kѱgj;SNƸAIPZX؎+{JS=zkjL8l 4U+qZ%<`IRCꞒ!)J5oRA֬v`׎1ŹHNuok+3cl8Tqqee˴AJ:e+8J@}&RV6֮YDgkdIu%p]|tHQFi;Ղw>z~gYB0%AQ:VJ(H!& :]{ Fh=[ܧ*-m'4CTy𓓗9=&PTGUbdߚ@P@bP%ΐ#ou[(YD8@[KzXò<ҏ?ezVE>mӆj Ʊ:M7&ё<+G I-Wxt/5*\Z ftSdDn[ܔU((.ŊFR׋d`sf@ UX6TVh,=zڣ:Xt^֧vq]nuՕaBpڈc mIv-Kh)wGNܥ^ile 9C\?%tl/m>$dXpBLf[DXa-424!@RsŬYaaR%8–j}a@ .$@0֘o{m $՝)D%ns-y7BZDZȻ@{(LX( ?M(Fet|(?=!^?jmjkeAZc\>uz4[cf،2[AX}uHOFa_nSsƸ@^sSÁv(>R9>߲Κc-Wtߢn6 dp()Сww:§ۗm/?6]ېopC(N)J°P^u+ugR֣'ΈlB4 Pe?1 ihp<ϕ'L' 'yP#!|o{/YS"Y )ߗܧ<I2$Ȓd:O<ԥ(U;Ar'&BSL\$f|(IE#-Y=' ]Q绯FW՝/mGmt0@ҩ,<e]'~O((9*E$j8Ua5I%͘uMnxlWuzr(%x#|#n1$-=:swm6;6޼뷦D EڍA]m|B"@r$p'yPr7~S<,XnsqHC#P:J6Ivbe7aA#[P!n#8vCkh*8K.<ͭӗ娍i~zՕe8NT:jt)qMlFRF%)kpғX`"SSS6@!)OT@I4L3f͵/Jk$6i.N-Uxn7 \6D<69{}jfZsD( ECF/܈}M@wp͎-:ivvc6aBy|ЈڹY(:O2]u%X09dȎCG=v|qFN' )WILbwiG`K;h 5dPJxkW(&]U1Uߕ!XUS[ޮ?3u6|ڤ{Xۺ|Rd `4UT@okqDrYxk>Q'Uq. bndj.i1ui\!}ֻ$zYmܒJFJV>q@QO]J(=VJA[Xϯ^ub?4JH*ʵ$nW\s@;Zb(e(K,AOiIVs޿;˜yvs%)+& R4g=*wcPSP zʊp2i)gq_s'˙:~|Jg'`v1]̓U=T}O5?/}Uë|V9=Mْ2}tK{O5%J:R2I<rMfJWmI'e,xL%o2HSDMA֏7}~Hj QZy/x`%B*j"7I> '.TJWk8dgs^+ {*ZHZe49!<&ZBh2QmJkd(҂0)Čz!:cĶ<4%`s ~(=})BZ~,xֽp-E.܆?aCᅸ<dw!f\]yռ򋎸u8T{5X)I=ɠ{v r3APW:Cm Z҄$j:P$x MLC^)`BΟ6iI3Ϊ ?s@$:Ahd<fߣ4%H%e,k[ =c2ʔ^7'`9זEsL8i۸z1I%_ɰ6*Ww`Tn)mo^.:iݸ⯰S*eA@P4Jp<d zXt6wJ< *9:u,- {J4riP-CAQ9)ϤDQ^XN!MvUUuslU ;Pv?$57XDiQ'  pP:Ernl2`RB}ԟͬ}7`6~>˟.KՕi|Tx\v{8PP*MBAʺV u֋)nw˺qǮ]̷ׁ ۄ}rYrLNޣc #Qxo@(AVoVOVJu!)-oH:w JUBtIZ,!Wu+)cONAXٌX0*PQX@S@c}QYaə!16]y^Gy'Κft Ƶzry=jp*h4_c7nO֎)F!ע{+WNSbŸipX<=:?5ăՕO[lbktXxꂂְ;(rI;;WҮo;+;B/U*j ;Pz⨒q_ʼ,}Qhҏ;E  m50(M;P/*@9AiL?GR¾Q[mښDe6V:x^Ww'*-1lF!U'Ph@X%]]|VH=ߊ+w֛ע2e(sp4†TX3}\9y5Ne.BH_Ze<X*FnuUğ(%m2PʕGU+<ɑP5F=%C(gG'9ܹe\+.笵}w;V+"*d+p9-jMF'@ WFNm+_⺮P{Au/@ w1A/DWIl%#@T?6zN덿X~qT$)'tr >VYM o\nRT%ӄ ~O <0]ˊU:V,rl2?;=rU P(+<*bb(PFmA/݉o_P).XҌ}f!1B (|A`@4qz ?P`( 'j@~K p %gst-plugins-good-0.10.31/tests/files/Makefile.in0000644000175000017500000004327211720560244016321 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests/files DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ audiotestsrc.flac \ id3-407349-1.tag \ id3-407349-2.tag \ id3-447000-wcop.tag \ id3-577468-unsynced-tag.tag \ id3-588148-unsynced-v24.tag \ pcm16sine.flv \ pinknoise-vorbis.mkv \ test-cert.pem \ test-key.pem all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/files/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/files/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/files/test-cert.pem0000644000175000017500000000241611671175355016676 00000000000000-----BEGIN CERTIFICATE----- MIIDjzCCAvigAwIBAgIBADANBgkqhkiG9w0BAQQFADCBkjELMAkGA1UEBhMCVVMx FjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjEPMA0GA1UE ChMGWGltaWFuMRUwEwYDVQQLEwxTb3VwIEtpdGNoZW4xEjAQBgNVBAMTCWxvY2Fs aG9zdDEeMBwGCSqGSIb3DQEJARYPc291cEB4aW1pYW4uY29tMB4XDTAzMDkyMzE4 Mzc0MVoXDTEzMDkyMzE4Mzc0MVowgZIxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1N YXNzYWNodXNldHRzMQ8wDQYDVQQHEwZCb3N0b24xDzANBgNVBAoTBlhpbWlhbjEV MBMGA1UECxMMU291cCBLaXRjaGVuMRIwEAYDVQQDEwlsb2NhbGhvc3QxHjAcBgkq hkiG9w0BCQEWD3NvdXBAeGltaWFuLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAwzT/WxfdXqb2hbyjQav3FtN7tLxj3UbZKCKDYlizBsNLxb9exfebhV4h CoAcaSNvLUnk3tAXnk+BDsIC1V4SbwqHYR17PnO3YZ8fkNwh5RGZwNx+zafdfFyu +3Sh+mE03bljpDlTsgPL8CiFCd68MPRnuHoKt5iTpSyLC6Df0qcCAwEAAaOB8jCB 7zAdBgNVHQ4EFgQU9A9omrgBK5Kkl6FRxrgJU2voj4Uwgb8GA1UdIwSBtzCBtIAU 9A9omrgBK5Kkl6FRxrgJU2voj4WhgZikgZUwgZIxCzAJBgNVBAYTAlVTMRYwFAYD VQQIEw1NYXNzYWNodXNldHRzMQ8wDQYDVQQHEwZCb3N0b24xDzANBgNVBAoTBlhp bWlhbjEVMBMGA1UECxMMU291cCBLaXRjaGVuMRIwEAYDVQQDEwlsb2NhbGhvc3Qx HjAcBgkqhkiG9w0BCQEWD3NvdXBAeGltaWFuLmNvbYIBADAMBgNVHRMEBTADAQH/ MA0GCSqGSIb3DQEBBAUAA4GBAGCV56N7bEDNdE76T8i68gS00NIVVosVQjS39Ojd ED+rvq0YYvuc2UXlzAonuCJfwFc73g4wSIjS0xijF5rnugZ+aay0LNv2y+Rf34CQ RNswrwurFjlxgTOO+Wx2IM64mAnBfj43M8uKEZFqAiGKrZZ0xIqyUMlku0FgXDH2 Jvpg -----END CERTIFICATE----- gst-plugins-good-0.10.31/tests/Makefile.in0000644000175000017500000006151411720560241015213 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_GST_CHECK_FALSE@SUBDIRS_CHECK = @HAVE_GST_CHECK_TRUE@SUBDIRS_CHECK = check files @USE_X_FALSE@SUBDIRS_ICLES = @USE_X_TRUE@SUBDIRS_ICLES = icles @BUILD_EXAMPLES_FALSE@SUBDIR_EXAMPLES = @BUILD_EXAMPLES_TRUE@SUBDIR_EXAMPLES = examples SUBDIRS = $(SUBDIRS_CHECK) $(SUBDIRS_ICLES) $(SUBDIR_EXAMPLES) DIST_SUBDIRS = check icles examples files all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/icles/0000755000175000017500000000000011720565323014324 500000000000000gst-plugins-good-0.10.31/tests/icles/videocrop-test.c0000644000175000017500000002546511677341661017403 00000000000000/* GStreamer interactive test for the videocrop element * Copyright (C) 2006 Tim-Philipp Müller * * 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 #include #include GST_DEBUG_CATEGORY_STATIC (videocrop_test_debug); #define GST_CAT_DEFAULT videocrop_test_debug #define OUT_WIDTH 640 #define OUT_HEIGHT 480 #define TIME_PER_TEST 10 /* seconds each format is tested */ #define FRAMERATE 15 /* frames per second */ #ifndef DEFAULT_VIDEOSINK #define DEFAULT_VIDEOSINK "xvimagesink" #endif static gboolean check_bus_for_errors (GstBus * bus, GstClockTime max_wait_time) { GstMessage *msg; msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, max_wait_time); if (msg) { GError *err = NULL; gchar *debug = NULL; g_assert (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR); gst_message_parse_error (msg, &err, &debug); GST_ERROR ("ERROR: %s [%s]", err->message, debug); g_print ("\n===========> ERROR: %s\n%s\n\n", err->message, debug); g_error_free (err); g_free (debug); gst_message_unref (msg); } return (msg != NULL); } static void test_with_caps (GstElement * src, GstElement * videocrop, GstCaps * caps) { GstClockTime time_run; GstElement *pipeline; GTimer *timer; GstBus *bus; GstPad *pad; guint hcrop; guint vcrop; /* caps must be writable, we can't check that here though */ g_assert (GST_CAPS_REFCOUNT_VALUE (caps) == 1); timer = g_timer_new (); vcrop = 0; hcrop = 0; pipeline = GST_ELEMENT (gst_element_get_parent (videocrop)); g_assert (GST_IS_PIPELINE (pipeline)); /* at this point the pipeline is in PLAYING state; we only want to capture * errors resulting from our on-the-fly changing of the filtercaps */ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); /* pad to block */ pad = gst_element_get_static_pad (src, "src"); time_run = 0; do { GstClockTime wait_time, waited_for_block; if (check_bus_for_errors (bus, 0)) break; wait_time = GST_SECOND / FRAMERATE; GST_LOG ("hcrop = %3d, vcrop = %3d", vcrop, hcrop); g_timer_reset (timer); /* need to block the streaming thread while changing these properties, * otherwise we might get random not-negotiated errors (when caps are * changed in between upstream calling pad_alloc_buffer() and pushing * the processed buffer?) */ gst_pad_set_blocked (pad, TRUE); g_object_set (videocrop, "left", hcrop, "top", vcrop, NULL); gst_pad_set_blocked (pad, FALSE); waited_for_block = g_timer_elapsed (timer, NULL) * (double) GST_SECOND; /* GST_LOG ("waited: %" GST_TIME_FORMAT ", frame len: %" GST_TIME_FORMAT, GST_TIME_ARGS (waited_for_block), GST_TIME_ARGS (wait_time)); */ ++vcrop; ++hcrop; if (wait_time > waited_for_block) { g_usleep ((wait_time - waited_for_block) / GST_MSECOND); } time_run += wait_time; } while (time_run < (TIME_PER_TEST * GST_SECOND)); g_timer_destroy (timer); gst_object_unref (bus); gst_object_unref (pad); } /* return a list of caps where we only need to set * width and height to get fixed caps */ static GList * video_crop_get_test_caps (GstElement * videocrop) { const GstCaps *allowed_caps; GstPad *srcpad; GList *list = NULL; guint i; srcpad = gst_element_get_static_pad (videocrop, "src"); g_assert (srcpad != NULL); allowed_caps = gst_pad_get_pad_template_caps (srcpad); g_assert (allowed_caps != NULL); for (i = 0; i < gst_caps_get_size (allowed_caps); ++i) { GstStructure *new_structure; GstCaps *single_caps; single_caps = gst_caps_new_empty (); new_structure = gst_structure_copy (gst_caps_get_structure (allowed_caps, i)); gst_structure_set (new_structure, "framerate", GST_TYPE_FRACTION, FRAMERATE, 1, NULL); gst_structure_remove_field (new_structure, "width"); gst_structure_remove_field (new_structure, "height"); gst_caps_append_structure (single_caps, new_structure); /* should be fixed without width/height */ g_assert (gst_caps_is_fixed (single_caps)); list = g_list_prepend (list, single_caps); } gst_object_unref (srcpad); return list; } static gchar *opt_videosink_str; /* NULL */ static gchar *opt_filtercaps_str; /* NULL */ static gboolean opt_with_ffmpegcolorspace; /* FALSE */ int main (int argc, char **argv) { static const GOptionEntry test_goptions[] = { {"videosink", '\0', 0, G_OPTION_ARG_STRING, &opt_videosink_str, "videosink to use (default: " DEFAULT_VIDEOSINK ")", NULL}, {"caps", '\0', 0, G_OPTION_ARG_STRING, &opt_filtercaps_str, "filter caps to narrow down formats to test", NULL}, {"with-ffmpegcolorspace", '\0', 0, G_OPTION_ARG_NONE, &opt_with_ffmpegcolorspace, "whether to add an ffmpegcolorspace element in front of the sink", NULL}, {NULL, '\0', 0, 0, NULL, NULL, NULL} }; GOptionContext *ctx; GError *opt_err = NULL; GstElement *pipeline, *src, *filter1, *crop, *scale, *filter2, *csp, *sink; GstCaps *filter_caps = NULL; GList *caps_list, *l; #if !GLIB_CHECK_VERSION (2, 31, 0) if (!g_thread_supported ()) g_thread_init (NULL); #endif /* command line option parsing */ ctx = g_option_context_new (""); g_option_context_add_group (ctx, gst_init_get_option_group ()); g_option_context_add_main_entries (ctx, test_goptions, NULL); if (!g_option_context_parse (ctx, &argc, &argv, &opt_err)) { g_error ("Error parsing command line options: %s", opt_err->message); return -1; } GST_DEBUG_CATEGORY_INIT (videocrop_test_debug, "videocroptest", 0, "vctest"); pipeline = gst_pipeline_new ("pipeline"); src = gst_element_factory_make ("videotestsrc", "videotestsrc"); g_assert (src != NULL); filter1 = gst_element_factory_make ("capsfilter", "capsfilter1"); g_assert (filter1 != NULL); crop = gst_element_factory_make ("videocrop", "videocrop"); g_assert (crop != NULL); scale = gst_element_factory_make ("videoscale", "videoscale"); g_assert (scale != NULL); filter2 = gst_element_factory_make ("capsfilter", "capsfilter2"); g_assert (filter2 != NULL); if (opt_with_ffmpegcolorspace) { g_print ("Adding ffmpegcolorspace\n"); csp = gst_element_factory_make ("ffmpegcolorspace", "colorspace"); } else { csp = gst_element_factory_make ("identity", "colorspace"); } g_assert (csp != NULL); if (opt_filtercaps_str) { filter_caps = gst_caps_from_string (opt_filtercaps_str); if (filter_caps == NULL) { g_error ("Invalid filter caps string '%s'", opt_filtercaps_str); } else { g_print ("Using filter caps '%s'\n", opt_filtercaps_str); } } if (opt_videosink_str) { g_print ("Trying videosink '%s' ...", opt_videosink_str); sink = gst_element_factory_make (opt_videosink_str, "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } else { sink = NULL; } if (sink == NULL) { g_print ("Trying videosink '%s' ...", DEFAULT_VIDEOSINK); sink = gst_element_factory_make (DEFAULT_VIDEOSINK, "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } if (sink == NULL) { g_print ("Trying videosink '%s' ...", "xvimagesink"); sink = gst_element_factory_make ("xvimagesink", "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } if (sink == NULL) { g_print ("Trying videosink '%s' ...", "ximagesink"); sink = gst_element_factory_make ("ximagesink", "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } g_assert (sink != NULL); gst_bin_add_many (GST_BIN (pipeline), src, filter1, crop, scale, filter2, csp, sink, NULL); if (!gst_element_link (src, filter1)) g_error ("Failed to link videotestsrc to capsfilter1"); if (!gst_element_link (filter1, crop)) g_error ("Failed to link capsfilter1 to videocrop"); if (!gst_element_link (crop, scale)) g_error ("Failed to link videocrop to videoscale"); if (!gst_element_link (scale, filter2)) g_error ("Failed to link videoscale to capsfilter2"); if (!gst_element_link (filter2, csp)) g_error ("Failed to link capsfilter2 to ffmpegcolorspace"); if (!gst_element_link (csp, sink)) g_error ("Failed to link ffmpegcolorspace to video sink"); caps_list = video_crop_get_test_caps (crop); for (l = caps_list; l != NULL; l = l->next) { GstStateChangeReturn ret; GstCaps *caps, *out_caps; gboolean skip = FALSE; gchar *s; if (filter_caps) { GstCaps *icaps; icaps = gst_caps_intersect (filter_caps, GST_CAPS (l->data)); skip = gst_caps_is_empty (icaps); gst_caps_unref (icaps); } /* this is the size of our window (stays fixed) */ out_caps = gst_caps_copy (GST_CAPS (l->data)); gst_structure_set (gst_caps_get_structure (out_caps, 0), "width", G_TYPE_INT, OUT_WIDTH, "height", G_TYPE_INT, OUT_HEIGHT, NULL); g_object_set (filter2, "caps", out_caps, NULL); /* filter1 gets these too to prevent videotestsrc from renegotiating */ g_object_set (filter1, "caps", out_caps, NULL); gst_caps_unref (out_caps); caps = gst_caps_copy (GST_CAPS (l->data)); GST_INFO ("testing format: %" GST_PTR_FORMAT, caps); s = gst_caps_to_string (caps); if (skip) { g_print ("Skipping format: %s\n", s); g_free (s); continue; } g_print ("Format: %s\n", s); caps = gst_caps_make_writable (caps); /* FIXME: check return values */ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); if (ret != GST_STATE_CHANGE_FAILURE) { ret = gst_element_get_state (pipeline, NULL, NULL, -1); if (ret != GST_STATE_CHANGE_FAILURE) { test_with_caps (src, crop, caps); } else { g_print ("Format: %s not supported (failed to go to PLAYING)\n", s); } } else { g_print ("Format: %s not supported\n", s); } gst_element_set_state (pipeline, GST_STATE_NULL); gst_caps_unref (caps); g_free (s); } g_list_foreach (caps_list, (GFunc) gst_caps_unref, NULL); g_list_free (caps_list); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; } gst-plugins-good-0.10.31/tests/icles/videocrop2-test.c0000644000175000017500000000620311671175355017451 00000000000000/* GStreamer interactive videocrop test * * Copyright (C) 2008 Wim Taymans * * 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 #include static GstElement * make_pipeline (gint type) { GstElement *result; gchar *pstr; switch (type) { case 0: pstr = g_strdup_printf ("videotestsrc ! videocrop name=crop ! " "xvimagesink"); break; default: return NULL; } result = gst_parse_launch_full (pstr, NULL, GST_PARSE_FLAG_NONE, NULL); g_print ("created test %d: \"%s\"\n", type, pstr); g_free (pstr); return result; } #define MAX_ROUND 500 int main (int argc, char **argv) { GstElement *pipe, *crop; gint left, right; gint top, bottom; gint ldir, rdir; gint tdir, bdir; gint round, type, stop; gst_init (&argc, &argv); type = 0; stop = -1; if (argc > 1) { type = atoi (argv[1]); stop = type + 1; } while (TRUE) { GstMessage *message; pipe = make_pipeline (type); if (pipe == NULL) break; crop = gst_bin_get_by_name (GST_BIN (pipe), "crop"); g_assert (crop); top = bottom = left = right = 0; tdir = bdir = 10; ldir = rdir = 10; for (round = 0; round < MAX_ROUND; round++) { g_print ("crop to %4d %4d %4d %4d (%d/%d) \r", top, bottom, left, right, round, MAX_ROUND); g_object_set (crop, "top", top, "bottom", bottom, "left", left, "right", right, NULL); if (round == 0) gst_element_set_state (pipe, GST_STATE_PLAYING); top += tdir; if (top >= 80) tdir = -10; else if (top < 10) tdir = 10; bottom += bdir; if (bottom >= 60) bdir = -10; else if (bottom < 10) bdir = 10; left += ldir; if (left >= 100) ldir = -10; else if (left < 10) ldir = 10; right += rdir; if (right >= 80) rdir = -10; else if (right < 10) rdir = 10; message = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, 50 * GST_MSECOND); if (message) { g_print ("got error \n"); gst_message_unref (message); } } g_print ("test %d done \n", type); gst_object_unref (crop); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); type++; if (type == stop) break; } return 0; } gst-plugins-good-0.10.31/tests/icles/Makefile.am0000644000175000017500000000300311671175355016303 00000000000000if HAVE_GTK GTK_TESTS = gdkpixbufsink-test gdkpixbufsink_test_SOURCES = gdkpixbufsink-test.c gdkpixbufsink_test_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) gdkpixbufsink_test_LDADD = $(GST_LIBS) $(GTK_LIBS) else GTK_TESTS = endif if USE_GST_V4L2 V4L2_TESTS = v4l2src-test v4l2src_test_SOURCES = v4l2src-test.c v4l2src_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) v4l2src_test_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) $(GST_LIBS) else V4L2_TESTS = endif if USE_OSS4 OSS4_TESTS=test-oss4 test_oss4_SOURCES = test-oss4.c test_oss4_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) test_oss4_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_LIBS) test_oss4_LDFLAGS = $(GST_PLUGIN_LDFLAGS) else OSS4_TESTS= endif if USE_X X_TESTS = ximagesrc-test ximagesrc_test_SOURCES = ximagesrc-test.c ximagesrc_test_CFLAGS = $(GST_CFLAGS) ximagesrc_test_LDADD = $(GST_LIBS) else X_TESTS = endif equalizer_test_SOURCES = equalizer-test.c equalizer_test_CFLAGS = $(GST_CFLAGS) equalizer_test_LDADD = $(GST_LIBS) videocrop_test_SOURCES = videocrop-test.c videocrop_test_CFLAGS = $(GST_CFLAGS) videocrop_test_LDADD = $(GST_LIBS) videobox_test_SOURCES = videobox-test.c videobox_test_CFLAGS = $(GST_CFLAGS) videobox_test_LDADD = $(GST_LIBS) videocrop2_test_SOURCES = videocrop2-test.c videocrop2_test_CFLAGS = $(GST_CFLAGS) videocrop2_test_LDADD = $(GST_LIBS) noinst_PROGRAMS = $(GTK_TESTS) $(OSS4_TESTS) $(V4L2_TESTS) $(X_TESTS) equalizer-test videocrop-test videobox-test videocrop2-test gst-plugins-good-0.10.31/tests/icles/equalizer-test.c0000644000175000017500000001771711677341661017413 00000000000000/* GStreamer test for the equalizer element * Copyright (C) 2007 Tim-Philipp Müller * * 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. */ /* * Will tests the equalizer by fading all bands in and out one by one and * finaly all together. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include GST_DEBUG_CATEGORY_STATIC (equalizer_test_debug); #define GST_CAT_DEFAULT equalizer_test_debug static GstBus *pipeline_bus; static gboolean check_bus (GstClockTime max_wait_time) { GstMessage *msg; msg = gst_bus_poll (pipeline_bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS, max_wait_time); if (msg == NULL) return FALSE; if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err = NULL; gchar *debug = NULL; g_assert (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR); gst_message_parse_error (msg, &err, &debug); GST_ERROR ("ERROR: %s [%s]", err->message, debug); g_print ("\n===========> ERROR: %s\n%s\n\n", err->message, debug); g_error_free (err); g_free (debug); } if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { g_print ("\n === EOS ===\n\n"); } gst_message_unref (msg); return TRUE; } // fix below static void equalizer_set_band_value (GstElement * eq, guint band, gdouble val) { GstObject *child; child = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (eq), band); g_object_set (child, "gain", val, NULL); gst_object_unref (child); g_print ("Band %2d: %.2f\n", band, val); } static void equalizer_set_all_band_values (GstElement * eq, guint num, gdouble val) { gint i; GstObject *child; for (i = 0; i < num; i++) { child = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (eq), i); g_object_set (child, "gain", val, NULL); gst_object_unref (child); } g_print ("All bands: %.2f\n", val); } // fix above static gboolean equalizer_set_band_value_and_wait (GstElement * eq, guint band, gdouble val) { equalizer_set_band_value (eq, band, val); return check_bus (100 * GST_MSECOND); } static gboolean equalizer_set_all_band_values_and_wait (GstElement * eq, guint num, gdouble val) { equalizer_set_all_band_values (eq, num, val); return check_bus (100 * GST_MSECOND); } static void do_slider_fiddling (GstElement * playbin, GstElement * eq) { gboolean stop; guint num_bands, i; gdouble d, step = 0.5; stop = FALSE; g_object_get (eq, "num-bands", &num_bands, NULL); g_print ("%u bands.\n", num_bands); while (!stop) { for (i = 0; !stop && i < num_bands; ++i) { d = -24.0; while (!stop && d <= 12.0) { stop = equalizer_set_band_value_and_wait (eq, i, d); d += step; } d = 12.0; while (!stop && d >= -24.0) { stop = equalizer_set_band_value_and_wait (eq, i, d); d -= step; } d = -24.0; while (!stop && d <= 12.0) { stop = equalizer_set_band_value_and_wait (eq, i, d); d += step; } } d = 0.0; while (!stop && d <= 12.0) { stop = equalizer_set_all_band_values_and_wait (eq, num_bands, d); d += step; } d = 12.0; while (!stop && d >= -24.0) { stop = equalizer_set_all_band_values_and_wait (eq, num_bands, d); d -= step; } d = -24.0; while (!stop && d <= 0.0) { stop = equalizer_set_all_band_values_and_wait (eq, num_bands, d); d += step; } } } int main (int argc, char **argv) { gchar *opt_audiosink_str = NULL; gchar **filenames = NULL; const GOptionEntry test_goptions[] = { {"audiosink", '\0', 0, G_OPTION_ARG_STRING, &opt_audiosink_str, "audiosink to use (default: autoaudiosink)", NULL}, {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}, {NULL, '\0', 0, 0, NULL, NULL, NULL} }; GOptionContext *ctx; GError *opt_err = NULL; GstStateChangeReturn ret; GstElement *playbin, *sink, *bin, *eq, *auconv; GstPad *eq_sinkpad; gchar *uri; #if !GLIB_CHECK_VERSION (2, 31, 0) if (!g_thread_supported ()) g_thread_init (NULL); #endif /* command line option parsing */ ctx = g_option_context_new ("FILENAME"); g_option_context_add_group (ctx, gst_init_get_option_group ()); g_option_context_add_main_entries (ctx, test_goptions, NULL); if (!g_option_context_parse (ctx, &argc, &argv, &opt_err)) { g_error ("Error parsing command line options: %s", opt_err->message); return -1; } GST_DEBUG_CATEGORY_INIT (equalizer_test_debug, "equalizertest", 0, "eqtest"); if (filenames == NULL || *filenames == NULL) { g_printerr ("Please specify a file to play back\n"); return -1; } playbin = gst_element_factory_make ("playbin", "playbin"); if (playbin == NULL) { g_error ("Couldn't create 'playbin' element"); return -1; } if (opt_audiosink_str) { g_print ("Trying audiosink '%s' ...", opt_audiosink_str); sink = gst_element_factory_make (opt_audiosink_str, "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } else { sink = NULL; } if (sink == NULL) { g_print ("Trying audiosink '%s' ...", "autoaudiosink"); sink = gst_element_factory_make ("autoaudiosink", "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } if (sink == NULL) { g_print ("Trying audiosink '%s' ...", "alsasink"); sink = gst_element_factory_make ("alsasink", "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } if (sink == NULL) { g_print ("Trying audiosink '%s' ...", "osssink"); sink = gst_element_factory_make ("osssink", "sink"); g_print ("%s\n", (sink) ? "ok" : "element couldn't be created"); } g_assert (sink != NULL); bin = gst_bin_new ("ausinkbin"); g_assert (bin != NULL); eq = gst_element_factory_make ("equalizer-nbands", "equalizer"); g_assert (eq != NULL); auconv = gst_element_factory_make ("audioconvert", "eqauconv"); g_assert (auconv != NULL); gst_bin_add_many (GST_BIN (bin), eq, auconv, sink, NULL); if (!gst_element_link (eq, auconv)) g_error ("Failed to link equalizer to audioconvert"); if (!gst_element_link (auconv, sink)) g_error ("Failed to link audioconvert to audio sink"); eq_sinkpad = gst_element_get_static_pad (eq, "sink"); g_assert (eq_sinkpad != NULL); gst_element_add_pad (bin, gst_ghost_pad_new (NULL, eq_sinkpad)); gst_object_unref (eq_sinkpad); g_object_set (playbin, "audio-sink", bin, NULL); /* won't work: uri = gst_uri_construct ("file", filenames[0]); */ uri = g_strdup_printf ("file://%s", filenames[0]); g_object_set (playbin, "uri", uri, NULL); g_free (uri); pipeline_bus = GST_ELEMENT_BUS (playbin); ret = gst_element_set_state (playbin, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr ("Failed to set playbin to PLAYING\n"); check_bus (1 * GST_SECOND); return -1; } ret = gst_element_get_state (playbin, NULL, NULL, 5 * GST_SECOND); if (ret == GST_STATE_CHANGE_ASYNC) { g_printerr ("Failed to go to PLAYING in 5 seconds, bailing out\n"); return -1; } else if (ret != GST_STATE_CHANGE_SUCCESS) { g_printerr ("State change to PLAYING failed\n"); check_bus (1 * GST_SECOND); return -1; } g_print ("Playing ...\n"); do_slider_fiddling (playbin, eq); gst_element_set_state (playbin, GST_STATE_NULL); gst_object_unref (playbin); return 0; } gst-plugins-good-0.10.31/tests/icles/test-oss4.c0000644000175000017500000001576211677341661016300 00000000000000/* GStreamer OSS4 audio tests * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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 #endif #include #include #include #include #include static gboolean opt_show_mixer_messages = FALSE; #define WAIT_TIME 60.0 /* in seconds */ static void show_mixer_messages (GstElement * element) { GstMessage *msg; GstBus *bus; GTimer *t; t = g_timer_new (); bus = gst_bus_new (); gst_element_set_bus (element, bus); g_print ("\nShowing mixer messages for %u seconds ...\n", (guint) WAIT_TIME); while (g_timer_elapsed (t, NULL) < WAIT_TIME) { gdouble remaining = WAIT_TIME - g_timer_elapsed (t, NULL); gint64 maxwait = GST_SECOND * gst_util_gdouble_to_guint64 (MAX (0.0, remaining)); gchar *s = NULL; msg = gst_bus_timed_pop (bus, maxwait); if (!msg) break; if (msg->structure) s = gst_structure_to_string (msg->structure); g_print ("%s message: %s\n", GST_MESSAGE_TYPE_NAME (msg), s); gst_message_unref (msg); g_free (s); } gst_element_set_bus (element, NULL); gst_object_unref (bus); g_timer_destroy (t); } static void probe_mixer_tracks (GstElement * element) { const GList *tracks, *t; GstMixer *mixer; guint count; if (!GST_IS_MIXER (element)) return; mixer = GST_MIXER (element); tracks = gst_mixer_list_tracks (mixer); count = g_list_length ((GList *) tracks); g_print (" %d mixer tracks%c\n", count, (count == 0) ? '.' : ':'); for (t = tracks; t != NULL; t = t->next) { GstMixerTrack *track; gchar *label = NULL; guint flags = 0; track = GST_MIXER_TRACK (t->data); g_object_get (track, "label", &label, "flags", &flags, NULL); if (GST_IS_MIXER_OPTIONS (track)) { GString *s; GList *vals, *v; vals = gst_mixer_options_get_values (GST_MIXER_OPTIONS (track)); s = g_string_new ("options: "); for (v = vals; v != NULL; v = v->next) { if (v->prev != NULL) g_string_append (s, ", "); g_string_append (s, (const gchar *) v->data); } g_print (" [%s] flags=0x%08x, %s\n", label, flags, s->str); g_string_free (s, TRUE); } else if (track->num_channels == 0) { g_print (" [%s] flags=0x%08x, switch\n", label, flags); } else if (track->num_channels > 0) { g_print (" [%s] flags=0x%08x, slider (%d channels)\n", label, flags, track->num_channels); } else { g_print (" [%s] flags=0x%08x, UNKNOWN TYPE\n", label, flags); } g_free (label); } /* for testing the mixer watch thread / auto-notifications */ if (strstr (GST_ELEMENT_NAME (element), "mixer") != NULL && opt_show_mixer_messages) { show_mixer_messages (element); } } static void probe_pad (GstElement * element, const gchar * pad_name) { GstCaps *caps = NULL; GstPad *pad; guint i; pad = gst_element_get_static_pad (element, pad_name); if (pad == NULL) return; caps = gst_pad_get_caps (pad); g_return_if_fail (caps != NULL); for (i = 0; i < gst_caps_get_size (caps); ++i) { gchar *s; s = gst_structure_to_string (gst_caps_get_structure (caps, i)); g_print (" %4s[%d]: %s\n", GST_PAD_NAME (pad), i, s); g_free (s); } gst_caps_unref (caps); gst_object_unref (pad); } static void probe_details (GstElement * element) { GstStateChangeReturn ret; ret = gst_element_set_state (element, GST_STATE_READY); if (ret == GST_STATE_CHANGE_FAILURE) { g_print ("Could not set element %s to READY.", GST_ELEMENT_NAME (element)); return; } probe_pad (element, "sink"); probe_pad (element, "src"); probe_mixer_tracks (element); gst_element_set_state (element, GST_STATE_NULL); } static void probe_element (const gchar * name) { GstPropertyProbe *probe; GValueArray *arr; GstElement *element; gchar *devname = NULL; gint i; element = gst_element_factory_make (name, name); /* make sure we don't deadlock on GST_ELEMENT_ERROR or do other silly things * if we try to query the "device-name" property when the device isn't open */ g_object_set (element, "device", "/dev/does/not/exist", NULL); g_object_get (element, "device-name", &devname, NULL); GST_LOG ("devname: '%s'", GST_STR_NULL (devname)); g_assert (devname == NULL || *devname == '\0'); /* and now for real */ probe = GST_PROPERTY_PROBE (element); arr = gst_property_probe_probe_and_get_values_name (probe, "device"); for (i = 0; arr != NULL && i < arr->n_values; ++i) { GValue *val; gchar *dev_name = NULL; g_print ("\n"); /* we assume the element supports getting the device-name in NULL state */ val = g_value_array_get_nth (arr, i); g_object_set (element, "device", g_value_get_string (val), NULL); g_object_get (element, "device-name", &dev_name, NULL); g_print ("%-10s device[%d] = %s (%s)\n", GST_OBJECT_NAME (element), i, g_value_get_string (val), dev_name); if (strstr (dev_name, "/usb")) { g_print ("\n\nWARNING: going to probe USB audio device. OSS4 USB support" " is still\npretty shaky, so bad things may happen (e.g. kernel " "lockup).\nPress Control-C NOW if you don't want to continue. " "(waiting 5secs)\n\n"); g_usleep (5 * G_USEC_PER_SEC); } g_free (dev_name); probe_details (element); } if (arr) { g_value_array_free (arr); } gst_object_unref (element); } int main (int argc, char **argv) { GOptionEntry options[] = { {"show-mixer-messages", 'm', 0, G_OPTION_ARG_NONE, &opt_show_mixer_messages, "For mixer elements, wait 60 seconds and show any mixer messages " "(for debugging auto-notifications)", NULL}, {NULL,} }; GOptionContext *ctx; GError *err = NULL; #if !GLIB_CHECK_VERSION (2, 31, 0) if (!g_thread_supported ()) g_thread_init (NULL); #endif ctx = g_option_context_new (""); g_option_context_add_main_entries (ctx, options, NULL); g_option_context_add_group (ctx, gst_init_get_option_group ()); if (!g_option_context_parse (ctx, &argc, &argv, &err)) { g_print ("Error initializing: %s\n", err->message); exit (1); } g_option_context_free (ctx); probe_element ("oss4sink"); probe_element ("oss4src"); probe_element ("oss4mixer"); return 0; } gst-plugins-good-0.10.31/tests/icles/ximagesrc-test.c0000644000175000017500000000363011671175355017360 00000000000000/* GStreamer * Copyright (C) <2006> Zaheer Abbas Merali * * 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 static GMainLoop *loop; static gboolean terminate_playback (GstElement * pipeline) { g_print ("Terminating playback\n"); g_main_loop_quit (loop); return FALSE; } int main (int argc, char **argv) { GstElement *pipeline; #ifndef G_DISABLE_ASSERT GstState state, pending; #endif GError *error = NULL; gst_init (&argc, &argv); pipeline = gst_parse_launch ("ximagesrc ! fakesink", &error); if (error) { g_print ("Error while parsing pipeline description: %s\n", error->message); return -1; } loop = g_main_loop_new (NULL, FALSE); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* lets check it gets to PLAYING */ g_assert (gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE) != GST_STATE_CHANGE_FAILURE); g_assert (state == GST_STATE_PLAYING || pending == GST_STATE_PLAYING); /* We want to get out after 5 seconds */ g_timeout_add (5000, (GSourceFunc) terminate_playback, pipeline); g_main_loop_run (loop); g_main_loop_unref (loop); return 0; } gst-plugins-good-0.10.31/tests/icles/videobox-test.c0000644000175000017500000000617511671175355017224 00000000000000/* GStreamer interactive videobox test * * Copyright (C) 2008 Wim Taymans * * 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 #include static GstElement * make_pipeline (gint type) { GstElement *result; gchar *pstr; switch (type) { case 0: pstr = g_strdup_printf ("videotestsrc ! videobox name=box ! " "xvimagesink"); break; default: return NULL; } result = gst_parse_launch_full (pstr, NULL, GST_PARSE_FLAG_NONE, NULL); g_print ("created test %d: \"%s\"\n", type, pstr); g_free (pstr); return result; } #define MAX_ROUND 500 int main (int argc, char **argv) { GstElement *pipe, *box; gint left, right; gint top, bottom; gint ldir, rdir; gint tdir, bdir; gint round, type, stop; gst_init (&argc, &argv); type = 0; stop = -1; if (argc > 1) { type = atoi (argv[1]); stop = type + 1; } while (TRUE) { GstMessage *message; pipe = make_pipeline (type); if (pipe == NULL) break; box = gst_bin_get_by_name (GST_BIN (pipe), "box"); g_assert (box); top = bottom = left = right = 0; tdir = bdir = -10; ldir = rdir = 10; for (round = 0; round < MAX_ROUND; round++) { g_print ("box to %4d %4d %4d %4d (%d/%d) \r", top, bottom, left, right, round, MAX_ROUND); g_object_set (box, "top", top, "bottom", bottom, "left", left, "right", right, NULL); if (round == 0) gst_element_set_state (pipe, GST_STATE_PLAYING); top += tdir; if (top >= 50) tdir = -10; else if (top < -50) tdir = 10; bottom += bdir; if (bottom >= 40) bdir = -10; else if (bottom < -60) bdir = 10; left += ldir; if (left >= 60) ldir = -10; else if (left < -80) ldir = 10; right += rdir; if (right >= 80) rdir = -10; else if (right < -90) rdir = 10; message = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, 50 * GST_MSECOND); if (message) { g_print ("got error \n"); gst_message_unref (message); } } g_print ("test %d done \n", type); gst_object_unref (box); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); type++; if (type == stop) break; } return 0; } gst-plugins-good-0.10.31/tests/icles/gdkpixbufsink-test.c0000644000175000017500000002331611677341661020252 00000000000000/* GStreamer interactive test for the gdkpixbufsink element * Copyright (C) 2008 Tim-Philipp Müller * * 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 #include typedef struct { GstElement *pipe; GstElement *sink; gboolean got_video; GtkWidget *win; GtkWidget *img; GtkWidget *slider; GtkWidget *accurate_cb; gboolean accurate; /* whether to try accurate seeks */ gint64 cur_pos; gboolean prerolled; } AppInfo; static void seek_to (AppInfo * info, gdouble percent); static GstElement * create_element (const gchar * factory_name) { GstElement *element; element = gst_element_factory_make (factory_name, NULL); if (element == NULL) g_error ("Failed to create '%s' element", factory_name); return element; } static void new_decoded_pad (GstElement * dec, GstPad * new_pad, gboolean last, AppInfo * info) { const gchar *sname; GstElement *csp, *scale, *filter; GstStructure *s; GstCaps *caps; GstPad *sinkpad; /* already found a video stream? */ if (info->got_video) return; /* FIXME: is this racy or does decodebin2 make sure caps are always * negotiated at this point? */ caps = gst_pad_get_caps (new_pad); g_return_if_fail (caps != NULL); s = gst_caps_get_structure (caps, 0); sname = gst_structure_get_name (s); if (!g_str_has_prefix (sname, "video/x-raw-")) goto not_video; csp = create_element ("ffmpegcolorspace"); scale = create_element ("videoscale"); filter = create_element ("capsfilter"); info->sink = create_element ("gdkpixbufsink"); g_object_set (info->sink, "qos", FALSE, "max-lateness", (gint64) - 1, NULL); gst_bin_add_many (GST_BIN (info->pipe), csp, scale, filter, info->sink, NULL); sinkpad = gst_element_get_static_pad (csp, "sink"); if (GST_PAD_LINK_FAILED (gst_pad_link (new_pad, sinkpad))) g_error ("Can't link new decoded pad to ffmpegcolorspace's sink pad"); gst_object_unref (sinkpad); if (!gst_element_link (csp, scale)) g_error ("Can't link ffmpegcolorspace to videoscale"); if (!gst_element_link (scale, filter)) g_error ("Can't link videoscale to capsfilter"); if (!gst_element_link (filter, info->sink)) g_error ("Can't link capsfilter to gdkpixbufsink"); gst_element_set_state (info->sink, GST_STATE_PAUSED); gst_element_set_state (filter, GST_STATE_PAUSED); gst_element_set_state (scale, GST_STATE_PAUSED); gst_element_set_state (csp, GST_STATE_PAUSED); info->got_video = TRUE; return; not_video: { if (last) { g_error ("This file does not contain a video track, or you do not have " "the necessary decoder(s) installed"); } } } static void bus_message_cb (GstBus * bus, GstMessage * msg, AppInfo * info) { switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_ASYNC_DONE:{ GstFormat fmt = GST_FORMAT_TIME; /* only interested in async-done messages from the top-level pipeline */ if (msg->src != GST_OBJECT_CAST (info->pipe)) break; if (!info->prerolled) { /* make slider visible if it's not visible already */ gtk_widget_show (info->slider); /* initial frame is often black, so seek to beginning plus a bit */ seek_to (info, 0.001); info->prerolled = TRUE; } /* update position */ if (!gst_element_query_position (info->pipe, &fmt, &info->cur_pos)) info->cur_pos = -1; break; } case GST_MESSAGE_ELEMENT:{ const GValue *val; GdkPixbuf *pixbuf = NULL; /* only interested in element messages from our gdkpixbufsink */ if (msg->src != GST_OBJECT_CAST (info->sink)) break; /* only interested in these two messages */ if (!gst_structure_has_name (msg->structure, "preroll-pixbuf") && !gst_structure_has_name (msg->structure, "pixbuf")) { break; } g_print ("pixbuf\n"); val = gst_structure_get_value (msg->structure, "pixbuf"); g_return_if_fail (val != NULL); pixbuf = GDK_PIXBUF (g_value_dup_object (val)); gtk_image_set_from_pixbuf (GTK_IMAGE (info->img), pixbuf); g_object_unref (pixbuf); break; } case GST_MESSAGE_ERROR:{ GError *err = NULL; gchar *dbg = NULL; gst_message_parse_error (msg, &err, &dbg); g_error ("Error: %s\n%s\n", err->message, (dbg) ? dbg : ""); g_error_free (err); g_free (dbg); break; } default: break; } } static gboolean create_pipeline (AppInfo * info, const gchar * filename) { GstElement *src, *dec; GstBus *bus; info->pipe = gst_pipeline_new ("pipeline"); src = create_element ("filesrc"); g_object_set (src, "location", filename, NULL); dec = create_element ("decodebin2"); gst_bin_add_many (GST_BIN (info->pipe), src, dec, NULL); if (!gst_element_link (src, dec)) g_error ("Can't link filesrc to decodebin2"); g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (new_decoded_pad), info); /* set up bus */ bus = gst_element_get_bus (info->pipe); gst_bus_add_signal_watch (bus); g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), info); gst_object_unref (bus); return TRUE; } static void seek_to (AppInfo * info, gdouble percent) { GstSeekFlags seek_flags; GstFormat fmt = GST_FORMAT_TIME; gint64 seek_pos, dur = -1; if (!gst_element_query_duration (info->pipe, &fmt, &dur) || dur <= 0) { g_printerr ("Could not query duration\n"); return; } seek_pos = gst_gdouble_to_guint64 (gst_guint64_to_gdouble (dur) * percent); g_print ("Seeking to %" GST_TIME_FORMAT ", accurate: %d\n", GST_TIME_ARGS (seek_pos), info->accurate); seek_flags = GST_SEEK_FLAG_FLUSH; if (info->accurate) seek_flags |= GST_SEEK_FLAG_ACCURATE; else seek_flags |= GST_SEEK_FLAG_KEY_UNIT; if (!gst_element_seek_simple (info->pipe, GST_FORMAT_TIME, seek_flags, seek_pos)) { g_printerr ("Seek failed.\n"); return; } } static void slider_cb (GtkRange * range, AppInfo * info) { gdouble val; val = gtk_range_get_value (range); seek_to (info, val); } static gchar * slider_format_value_cb (GtkScale * scale, gdouble value, AppInfo * info) { gchar s[64]; if (info->cur_pos < 0) return g_strdup_printf ("%0.1g%%", value * 100.0); g_snprintf (s, 64, "%" GST_TIME_FORMAT, GST_TIME_ARGS (info->cur_pos)); s[10] = '\0'; return g_strdup (s); } static void accurate_toggled_cb (GtkToggleButton * toggle, AppInfo * info) { info->accurate = gtk_toggle_button_get_active (toggle); } static void run_gui (const gchar * filename) { GtkWidget *vbox, *hbox; AppInfo *info; info = g_new0 (AppInfo, 1); /* create pipeline */ if (!create_pipeline (info, filename)) goto done; /* create window */ info->win = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (info->win, "delete-event", G_CALLBACK (gtk_main_quit), NULL); vbox = gtk_vbox_new (FALSE, 6); gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); gtk_container_add (GTK_CONTAINER (info->win), vbox); info->img = gtk_image_new (); gtk_box_pack_start (GTK_BOX (vbox), info->img, FALSE, FALSE, 6); hbox = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 6); info->accurate_cb = gtk_check_button_new_with_label ("accurate seek " "(might not work reliably with all demuxers)"); gtk_box_pack_start (GTK_BOX (hbox), info->accurate_cb, FALSE, FALSE, 6); g_signal_connect (info->accurate_cb, "toggled", G_CALLBACK (accurate_toggled_cb), info); info->slider = gtk_hscale_new_with_range (0.0, 1.0, 0.001); gtk_box_pack_start (GTK_BOX (vbox), info->slider, FALSE, FALSE, 6); g_signal_connect (info->slider, "value-changed", G_CALLBACK (slider_cb), info); g_signal_connect (info->slider, "format-value", G_CALLBACK (slider_format_value_cb), info); /* and go! */ gst_element_set_state (info->pipe, GST_STATE_PAUSED); gtk_widget_show_all (info->win); gtk_widget_hide (info->slider); /* hide until we're prerolled */ gtk_main (); done: g_free (info); } static gchar **filenames = NULL; int main (int argc, char **argv) { static const GOptionEntry test_goptions[] = { {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}, {NULL, '\0', 0, 0, NULL, NULL, NULL} }; GOptionContext *ctx; GError *opt_err = NULL; #if !GLIB_CHECK_VERSION (2, 31, 0) if (!g_thread_supported ()) g_thread_init (NULL); #endif gtk_init (&argc, &argv); /* command line option parsing */ ctx = g_option_context_new (" VIDEOFILE"); g_option_context_add_group (ctx, gst_init_get_option_group ()); g_option_context_add_main_entries (ctx, test_goptions, NULL); if (!g_option_context_parse (ctx, &argc, &argv, &opt_err)) { g_error ("Error parsing command line options: %s", opt_err->message); return -1; } if (filenames == NULL || filenames[0] == NULL || filenames[0][0] == '\0') { g_printerr ("Please specify a path to a video file\n\n"); return -1; } run_gui (filenames[0]); g_free (filenames); g_option_context_free (ctx); return 0; } gst-plugins-good-0.10.31/tests/icles/Makefile.in0000644000175000017500000013530011720560245016311 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ $(am__EXEEXT_4) equalizer-test$(EXEEXT) \ videocrop-test$(EXEEXT) videobox-test$(EXEEXT) \ videocrop2-test$(EXEEXT) subdir = tests/icles DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTK_TRUE@am__EXEEXT_1 = gdkpixbufsink-test$(EXEEXT) @USE_OSS4_TRUE@am__EXEEXT_2 = test-oss4$(EXEEXT) @USE_GST_V4L2_TRUE@am__EXEEXT_3 = v4l2src-test$(EXEEXT) @USE_X_TRUE@am__EXEEXT_4 = ximagesrc-test$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_equalizer_test_OBJECTS = equalizer_test-equalizer-test.$(OBJEXT) equalizer_test_OBJECTS = $(am_equalizer_test_OBJECTS) am__DEPENDENCIES_1 = equalizer_test_DEPENDENCIES = $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent equalizer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(equalizer_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ am__gdkpixbufsink_test_SOURCES_DIST = gdkpixbufsink-test.c @HAVE_GTK_TRUE@am_gdkpixbufsink_test_OBJECTS = gdkpixbufsink_test-gdkpixbufsink-test.$(OBJEXT) gdkpixbufsink_test_OBJECTS = $(am_gdkpixbufsink_test_OBJECTS) @HAVE_GTK_TRUE@gdkpixbufsink_test_DEPENDENCIES = \ @HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) gdkpixbufsink_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(gdkpixbufsink_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__test_oss4_SOURCES_DIST = test-oss4.c @USE_OSS4_TRUE@am_test_oss4_OBJECTS = test_oss4-test-oss4.$(OBJEXT) test_oss4_OBJECTS = $(am_test_oss4_OBJECTS) @USE_OSS4_TRUE@test_oss4_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @USE_OSS4_TRUE@ $(am__DEPENDENCIES_1) test_oss4_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_oss4_CFLAGS) \ $(CFLAGS) $(test_oss4_LDFLAGS) $(LDFLAGS) -o $@ am__v4l2src_test_SOURCES_DIST = v4l2src-test.c @USE_GST_V4L2_TRUE@am_v4l2src_test_OBJECTS = \ @USE_GST_V4L2_TRUE@ v4l2src_test-v4l2src-test.$(OBJEXT) v4l2src_test_OBJECTS = $(am_v4l2src_test_OBJECTS) @USE_GST_V4L2_TRUE@v4l2src_test_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @USE_GST_V4L2_TRUE@ $(am__DEPENDENCIES_1) v4l2src_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(v4l2src_test_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_videobox_test_OBJECTS = videobox_test-videobox-test.$(OBJEXT) videobox_test_OBJECTS = $(am_videobox_test_OBJECTS) videobox_test_DEPENDENCIES = $(am__DEPENDENCIES_1) videobox_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(videobox_test_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_videocrop_test_OBJECTS = videocrop_test-videocrop-test.$(OBJEXT) videocrop_test_OBJECTS = $(am_videocrop_test_OBJECTS) videocrop_test_DEPENDENCIES = $(am__DEPENDENCIES_1) videocrop_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(videocrop_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ am_videocrop2_test_OBJECTS = \ videocrop2_test-videocrop2-test.$(OBJEXT) videocrop2_test_OBJECTS = $(am_videocrop2_test_OBJECTS) videocrop2_test_DEPENDENCIES = $(am__DEPENDENCIES_1) videocrop2_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(videocrop2_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ am__ximagesrc_test_SOURCES_DIST = ximagesrc-test.c @USE_X_TRUE@am_ximagesrc_test_OBJECTS = \ @USE_X_TRUE@ ximagesrc_test-ximagesrc-test.$(OBJEXT) ximagesrc_test_OBJECTS = $(am_ximagesrc_test_OBJECTS) @USE_X_TRUE@ximagesrc_test_DEPENDENCIES = $(am__DEPENDENCIES_1) ximagesrc_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ximagesrc_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(equalizer_test_SOURCES) $(gdkpixbufsink_test_SOURCES) \ $(test_oss4_SOURCES) $(v4l2src_test_SOURCES) \ $(videobox_test_SOURCES) $(videocrop_test_SOURCES) \ $(videocrop2_test_SOURCES) $(ximagesrc_test_SOURCES) DIST_SOURCES = $(equalizer_test_SOURCES) \ $(am__gdkpixbufsink_test_SOURCES_DIST) \ $(am__test_oss4_SOURCES_DIST) $(am__v4l2src_test_SOURCES_DIST) \ $(videobox_test_SOURCES) $(videocrop_test_SOURCES) \ $(videocrop2_test_SOURCES) $(am__ximagesrc_test_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_GTK_FALSE@GTK_TESTS = @HAVE_GTK_TRUE@GTK_TESTS = gdkpixbufsink-test @HAVE_GTK_TRUE@gdkpixbufsink_test_SOURCES = gdkpixbufsink-test.c @HAVE_GTK_TRUE@gdkpixbufsink_test_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) @HAVE_GTK_TRUE@gdkpixbufsink_test_LDADD = $(GST_LIBS) $(GTK_LIBS) @USE_GST_V4L2_FALSE@V4L2_TESTS = @USE_GST_V4L2_TRUE@V4L2_TESTS = v4l2src-test @USE_GST_V4L2_TRUE@v4l2src_test_SOURCES = v4l2src-test.c @USE_GST_V4L2_TRUE@v4l2src_test_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) @USE_GST_V4L2_TRUE@v4l2src_test_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) $(GST_LIBS) @USE_OSS4_FALSE@OSS4_TESTS = @USE_OSS4_TRUE@OSS4_TESTS = test-oss4 @USE_OSS4_TRUE@test_oss4_SOURCES = test-oss4.c @USE_OSS4_TRUE@test_oss4_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) @USE_OSS4_TRUE@test_oss4_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_LIBS) @USE_OSS4_TRUE@test_oss4_LDFLAGS = $(GST_PLUGIN_LDFLAGS) @USE_X_FALSE@X_TESTS = @USE_X_TRUE@X_TESTS = ximagesrc-test @USE_X_TRUE@ximagesrc_test_SOURCES = ximagesrc-test.c @USE_X_TRUE@ximagesrc_test_CFLAGS = $(GST_CFLAGS) @USE_X_TRUE@ximagesrc_test_LDADD = $(GST_LIBS) equalizer_test_SOURCES = equalizer-test.c equalizer_test_CFLAGS = $(GST_CFLAGS) equalizer_test_LDADD = $(GST_LIBS) videocrop_test_SOURCES = videocrop-test.c videocrop_test_CFLAGS = $(GST_CFLAGS) videocrop_test_LDADD = $(GST_LIBS) videobox_test_SOURCES = videobox-test.c videobox_test_CFLAGS = $(GST_CFLAGS) videobox_test_LDADD = $(GST_LIBS) videocrop2_test_SOURCES = videocrop2-test.c videocrop2_test_CFLAGS = $(GST_CFLAGS) videocrop2_test_LDADD = $(GST_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/icles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/icles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list equalizer-test$(EXEEXT): $(equalizer_test_OBJECTS) $(equalizer_test_DEPENDENCIES) $(EXTRA_equalizer_test_DEPENDENCIES) @rm -f equalizer-test$(EXEEXT) $(AM_V_CCLD)$(equalizer_test_LINK) $(equalizer_test_OBJECTS) $(equalizer_test_LDADD) $(LIBS) gdkpixbufsink-test$(EXEEXT): $(gdkpixbufsink_test_OBJECTS) $(gdkpixbufsink_test_DEPENDENCIES) $(EXTRA_gdkpixbufsink_test_DEPENDENCIES) @rm -f gdkpixbufsink-test$(EXEEXT) $(AM_V_CCLD)$(gdkpixbufsink_test_LINK) $(gdkpixbufsink_test_OBJECTS) $(gdkpixbufsink_test_LDADD) $(LIBS) test-oss4$(EXEEXT): $(test_oss4_OBJECTS) $(test_oss4_DEPENDENCIES) $(EXTRA_test_oss4_DEPENDENCIES) @rm -f test-oss4$(EXEEXT) $(AM_V_CCLD)$(test_oss4_LINK) $(test_oss4_OBJECTS) $(test_oss4_LDADD) $(LIBS) v4l2src-test$(EXEEXT): $(v4l2src_test_OBJECTS) $(v4l2src_test_DEPENDENCIES) $(EXTRA_v4l2src_test_DEPENDENCIES) @rm -f v4l2src-test$(EXEEXT) $(AM_V_CCLD)$(v4l2src_test_LINK) $(v4l2src_test_OBJECTS) $(v4l2src_test_LDADD) $(LIBS) videobox-test$(EXEEXT): $(videobox_test_OBJECTS) $(videobox_test_DEPENDENCIES) $(EXTRA_videobox_test_DEPENDENCIES) @rm -f videobox-test$(EXEEXT) $(AM_V_CCLD)$(videobox_test_LINK) $(videobox_test_OBJECTS) $(videobox_test_LDADD) $(LIBS) videocrop-test$(EXEEXT): $(videocrop_test_OBJECTS) $(videocrop_test_DEPENDENCIES) $(EXTRA_videocrop_test_DEPENDENCIES) @rm -f videocrop-test$(EXEEXT) $(AM_V_CCLD)$(videocrop_test_LINK) $(videocrop_test_OBJECTS) $(videocrop_test_LDADD) $(LIBS) videocrop2-test$(EXEEXT): $(videocrop2_test_OBJECTS) $(videocrop2_test_DEPENDENCIES) $(EXTRA_videocrop2_test_DEPENDENCIES) @rm -f videocrop2-test$(EXEEXT) $(AM_V_CCLD)$(videocrop2_test_LINK) $(videocrop2_test_OBJECTS) $(videocrop2_test_LDADD) $(LIBS) ximagesrc-test$(EXEEXT): $(ximagesrc_test_OBJECTS) $(ximagesrc_test_DEPENDENCIES) $(EXTRA_ximagesrc_test_DEPENDENCIES) @rm -f ximagesrc-test$(EXEEXT) $(AM_V_CCLD)$(ximagesrc_test_LINK) $(ximagesrc_test_OBJECTS) $(ximagesrc_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equalizer_test-equalizer-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_oss4-test-oss4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v4l2src_test-v4l2src-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/videobox_test-videobox-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/videocrop2_test-videocrop2-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/videocrop_test-videocrop-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ximagesrc_test-ximagesrc-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< equalizer_test-equalizer-test.o: equalizer-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(equalizer_test_CFLAGS) $(CFLAGS) -MT equalizer_test-equalizer-test.o -MD -MP -MF $(DEPDIR)/equalizer_test-equalizer-test.Tpo -c -o equalizer_test-equalizer-test.o `test -f 'equalizer-test.c' || echo '$(srcdir)/'`equalizer-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/equalizer_test-equalizer-test.Tpo $(DEPDIR)/equalizer_test-equalizer-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='equalizer-test.c' object='equalizer_test-equalizer-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(equalizer_test_CFLAGS) $(CFLAGS) -c -o equalizer_test-equalizer-test.o `test -f 'equalizer-test.c' || echo '$(srcdir)/'`equalizer-test.c equalizer_test-equalizer-test.obj: equalizer-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(equalizer_test_CFLAGS) $(CFLAGS) -MT equalizer_test-equalizer-test.obj -MD -MP -MF $(DEPDIR)/equalizer_test-equalizer-test.Tpo -c -o equalizer_test-equalizer-test.obj `if test -f 'equalizer-test.c'; then $(CYGPATH_W) 'equalizer-test.c'; else $(CYGPATH_W) '$(srcdir)/equalizer-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/equalizer_test-equalizer-test.Tpo $(DEPDIR)/equalizer_test-equalizer-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='equalizer-test.c' object='equalizer_test-equalizer-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(equalizer_test_CFLAGS) $(CFLAGS) -c -o equalizer_test-equalizer-test.obj `if test -f 'equalizer-test.c'; then $(CYGPATH_W) 'equalizer-test.c'; else $(CYGPATH_W) '$(srcdir)/equalizer-test.c'; fi` gdkpixbufsink_test-gdkpixbufsink-test.o: gdkpixbufsink-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdkpixbufsink_test_CFLAGS) $(CFLAGS) -MT gdkpixbufsink_test-gdkpixbufsink-test.o -MD -MP -MF $(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Tpo -c -o gdkpixbufsink_test-gdkpixbufsink-test.o `test -f 'gdkpixbufsink-test.c' || echo '$(srcdir)/'`gdkpixbufsink-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Tpo $(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gdkpixbufsink-test.c' object='gdkpixbufsink_test-gdkpixbufsink-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdkpixbufsink_test_CFLAGS) $(CFLAGS) -c -o gdkpixbufsink_test-gdkpixbufsink-test.o `test -f 'gdkpixbufsink-test.c' || echo '$(srcdir)/'`gdkpixbufsink-test.c gdkpixbufsink_test-gdkpixbufsink-test.obj: gdkpixbufsink-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdkpixbufsink_test_CFLAGS) $(CFLAGS) -MT gdkpixbufsink_test-gdkpixbufsink-test.obj -MD -MP -MF $(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Tpo -c -o gdkpixbufsink_test-gdkpixbufsink-test.obj `if test -f 'gdkpixbufsink-test.c'; then $(CYGPATH_W) 'gdkpixbufsink-test.c'; else $(CYGPATH_W) '$(srcdir)/gdkpixbufsink-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Tpo $(DEPDIR)/gdkpixbufsink_test-gdkpixbufsink-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gdkpixbufsink-test.c' object='gdkpixbufsink_test-gdkpixbufsink-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdkpixbufsink_test_CFLAGS) $(CFLAGS) -c -o gdkpixbufsink_test-gdkpixbufsink-test.obj `if test -f 'gdkpixbufsink-test.c'; then $(CYGPATH_W) 'gdkpixbufsink-test.c'; else $(CYGPATH_W) '$(srcdir)/gdkpixbufsink-test.c'; fi` test_oss4-test-oss4.o: test-oss4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_oss4_CFLAGS) $(CFLAGS) -MT test_oss4-test-oss4.o -MD -MP -MF $(DEPDIR)/test_oss4-test-oss4.Tpo -c -o test_oss4-test-oss4.o `test -f 'test-oss4.c' || echo '$(srcdir)/'`test-oss4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_oss4-test-oss4.Tpo $(DEPDIR)/test_oss4-test-oss4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-oss4.c' object='test_oss4-test-oss4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_oss4_CFLAGS) $(CFLAGS) -c -o test_oss4-test-oss4.o `test -f 'test-oss4.c' || echo '$(srcdir)/'`test-oss4.c test_oss4-test-oss4.obj: test-oss4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_oss4_CFLAGS) $(CFLAGS) -MT test_oss4-test-oss4.obj -MD -MP -MF $(DEPDIR)/test_oss4-test-oss4.Tpo -c -o test_oss4-test-oss4.obj `if test -f 'test-oss4.c'; then $(CYGPATH_W) 'test-oss4.c'; else $(CYGPATH_W) '$(srcdir)/test-oss4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_oss4-test-oss4.Tpo $(DEPDIR)/test_oss4-test-oss4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-oss4.c' object='test_oss4-test-oss4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_oss4_CFLAGS) $(CFLAGS) -c -o test_oss4-test-oss4.obj `if test -f 'test-oss4.c'; then $(CYGPATH_W) 'test-oss4.c'; else $(CYGPATH_W) '$(srcdir)/test-oss4.c'; fi` v4l2src_test-v4l2src-test.o: v4l2src-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(v4l2src_test_CFLAGS) $(CFLAGS) -MT v4l2src_test-v4l2src-test.o -MD -MP -MF $(DEPDIR)/v4l2src_test-v4l2src-test.Tpo -c -o v4l2src_test-v4l2src-test.o `test -f 'v4l2src-test.c' || echo '$(srcdir)/'`v4l2src-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/v4l2src_test-v4l2src-test.Tpo $(DEPDIR)/v4l2src_test-v4l2src-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2src-test.c' object='v4l2src_test-v4l2src-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(v4l2src_test_CFLAGS) $(CFLAGS) -c -o v4l2src_test-v4l2src-test.o `test -f 'v4l2src-test.c' || echo '$(srcdir)/'`v4l2src-test.c v4l2src_test-v4l2src-test.obj: v4l2src-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(v4l2src_test_CFLAGS) $(CFLAGS) -MT v4l2src_test-v4l2src-test.obj -MD -MP -MF $(DEPDIR)/v4l2src_test-v4l2src-test.Tpo -c -o v4l2src_test-v4l2src-test.obj `if test -f 'v4l2src-test.c'; then $(CYGPATH_W) 'v4l2src-test.c'; else $(CYGPATH_W) '$(srcdir)/v4l2src-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/v4l2src_test-v4l2src-test.Tpo $(DEPDIR)/v4l2src_test-v4l2src-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2src-test.c' object='v4l2src_test-v4l2src-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(v4l2src_test_CFLAGS) $(CFLAGS) -c -o v4l2src_test-v4l2src-test.obj `if test -f 'v4l2src-test.c'; then $(CYGPATH_W) 'v4l2src-test.c'; else $(CYGPATH_W) '$(srcdir)/v4l2src-test.c'; fi` videobox_test-videobox-test.o: videobox-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videobox_test_CFLAGS) $(CFLAGS) -MT videobox_test-videobox-test.o -MD -MP -MF $(DEPDIR)/videobox_test-videobox-test.Tpo -c -o videobox_test-videobox-test.o `test -f 'videobox-test.c' || echo '$(srcdir)/'`videobox-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/videobox_test-videobox-test.Tpo $(DEPDIR)/videobox_test-videobox-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videobox-test.c' object='videobox_test-videobox-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videobox_test_CFLAGS) $(CFLAGS) -c -o videobox_test-videobox-test.o `test -f 'videobox-test.c' || echo '$(srcdir)/'`videobox-test.c videobox_test-videobox-test.obj: videobox-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videobox_test_CFLAGS) $(CFLAGS) -MT videobox_test-videobox-test.obj -MD -MP -MF $(DEPDIR)/videobox_test-videobox-test.Tpo -c -o videobox_test-videobox-test.obj `if test -f 'videobox-test.c'; then $(CYGPATH_W) 'videobox-test.c'; else $(CYGPATH_W) '$(srcdir)/videobox-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/videobox_test-videobox-test.Tpo $(DEPDIR)/videobox_test-videobox-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videobox-test.c' object='videobox_test-videobox-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videobox_test_CFLAGS) $(CFLAGS) -c -o videobox_test-videobox-test.obj `if test -f 'videobox-test.c'; then $(CYGPATH_W) 'videobox-test.c'; else $(CYGPATH_W) '$(srcdir)/videobox-test.c'; fi` videocrop_test-videocrop-test.o: videocrop-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop_test_CFLAGS) $(CFLAGS) -MT videocrop_test-videocrop-test.o -MD -MP -MF $(DEPDIR)/videocrop_test-videocrop-test.Tpo -c -o videocrop_test-videocrop-test.o `test -f 'videocrop-test.c' || echo '$(srcdir)/'`videocrop-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/videocrop_test-videocrop-test.Tpo $(DEPDIR)/videocrop_test-videocrop-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videocrop-test.c' object='videocrop_test-videocrop-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop_test_CFLAGS) $(CFLAGS) -c -o videocrop_test-videocrop-test.o `test -f 'videocrop-test.c' || echo '$(srcdir)/'`videocrop-test.c videocrop_test-videocrop-test.obj: videocrop-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop_test_CFLAGS) $(CFLAGS) -MT videocrop_test-videocrop-test.obj -MD -MP -MF $(DEPDIR)/videocrop_test-videocrop-test.Tpo -c -o videocrop_test-videocrop-test.obj `if test -f 'videocrop-test.c'; then $(CYGPATH_W) 'videocrop-test.c'; else $(CYGPATH_W) '$(srcdir)/videocrop-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/videocrop_test-videocrop-test.Tpo $(DEPDIR)/videocrop_test-videocrop-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videocrop-test.c' object='videocrop_test-videocrop-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop_test_CFLAGS) $(CFLAGS) -c -o videocrop_test-videocrop-test.obj `if test -f 'videocrop-test.c'; then $(CYGPATH_W) 'videocrop-test.c'; else $(CYGPATH_W) '$(srcdir)/videocrop-test.c'; fi` videocrop2_test-videocrop2-test.o: videocrop2-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop2_test_CFLAGS) $(CFLAGS) -MT videocrop2_test-videocrop2-test.o -MD -MP -MF $(DEPDIR)/videocrop2_test-videocrop2-test.Tpo -c -o videocrop2_test-videocrop2-test.o `test -f 'videocrop2-test.c' || echo '$(srcdir)/'`videocrop2-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/videocrop2_test-videocrop2-test.Tpo $(DEPDIR)/videocrop2_test-videocrop2-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videocrop2-test.c' object='videocrop2_test-videocrop2-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop2_test_CFLAGS) $(CFLAGS) -c -o videocrop2_test-videocrop2-test.o `test -f 'videocrop2-test.c' || echo '$(srcdir)/'`videocrop2-test.c videocrop2_test-videocrop2-test.obj: videocrop2-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop2_test_CFLAGS) $(CFLAGS) -MT videocrop2_test-videocrop2-test.obj -MD -MP -MF $(DEPDIR)/videocrop2_test-videocrop2-test.Tpo -c -o videocrop2_test-videocrop2-test.obj `if test -f 'videocrop2-test.c'; then $(CYGPATH_W) 'videocrop2-test.c'; else $(CYGPATH_W) '$(srcdir)/videocrop2-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/videocrop2_test-videocrop2-test.Tpo $(DEPDIR)/videocrop2_test-videocrop2-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videocrop2-test.c' object='videocrop2_test-videocrop2-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(videocrop2_test_CFLAGS) $(CFLAGS) -c -o videocrop2_test-videocrop2-test.obj `if test -f 'videocrop2-test.c'; then $(CYGPATH_W) 'videocrop2-test.c'; else $(CYGPATH_W) '$(srcdir)/videocrop2-test.c'; fi` ximagesrc_test-ximagesrc-test.o: ximagesrc-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ximagesrc_test_CFLAGS) $(CFLAGS) -MT ximagesrc_test-ximagesrc-test.o -MD -MP -MF $(DEPDIR)/ximagesrc_test-ximagesrc-test.Tpo -c -o ximagesrc_test-ximagesrc-test.o `test -f 'ximagesrc-test.c' || echo '$(srcdir)/'`ximagesrc-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ximagesrc_test-ximagesrc-test.Tpo $(DEPDIR)/ximagesrc_test-ximagesrc-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ximagesrc-test.c' object='ximagesrc_test-ximagesrc-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ximagesrc_test_CFLAGS) $(CFLAGS) -c -o ximagesrc_test-ximagesrc-test.o `test -f 'ximagesrc-test.c' || echo '$(srcdir)/'`ximagesrc-test.c ximagesrc_test-ximagesrc-test.obj: ximagesrc-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ximagesrc_test_CFLAGS) $(CFLAGS) -MT ximagesrc_test-ximagesrc-test.obj -MD -MP -MF $(DEPDIR)/ximagesrc_test-ximagesrc-test.Tpo -c -o ximagesrc_test-ximagesrc-test.obj `if test -f 'ximagesrc-test.c'; then $(CYGPATH_W) 'ximagesrc-test.c'; else $(CYGPATH_W) '$(srcdir)/ximagesrc-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ximagesrc_test-ximagesrc-test.Tpo $(DEPDIR)/ximagesrc_test-ximagesrc-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ximagesrc-test.c' object='ximagesrc_test-ximagesrc-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ximagesrc_test_CFLAGS) $(CFLAGS) -c -o ximagesrc_test-ximagesrc-test.obj `if test -f 'ximagesrc-test.c'; then $(CYGPATH_W) 'ximagesrc-test.c'; else $(CYGPATH_W) '$(srcdir)/ximagesrc-test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/icles/v4l2src-test.c0000644000175000017500000003400611677341661016677 00000000000000/* GStreamer * * Copyright (C) 2006 Edgard Lima * * 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 #include #include #include #include #include #include #include GstElement *pipeline, *source, *sink; GMainLoop *loop; volatile int exit_read = 0; static void print_options (void) { printf ("\nf - to change the fequency\n"); printf ("i - to change the input\n"); printf ("n - to change the norm\n"); printf ("c - list color balance\n"); printf ("v - change video orientarion\n"); printf ("e - to exit\n"); } static void run_options (char opt) { int res; switch (opt) { case 'f': { GstTuner *tuner = GST_TUNER (source); GstTunerChannel *channel; guint freq; channel = gst_tuner_get_channel (tuner); freq = gst_tuner_get_frequency (tuner, channel); printf ("\ntype the new frequency (current = %u) (-1 to cancel): ", freq); res = scanf ("%u", &freq); if (res != 1 || freq != -1) gst_tuner_set_frequency (tuner, channel, freq); } break; case 'n': { GstTuner *tuner = GST_TUNER (source); const GList *item, *list; const GstTunerNorm *current_norm; GstTunerNorm *norm = NULL; gint index, next_norm; list = gst_tuner_list_norms (tuner); current_norm = gst_tuner_get_norm (tuner); printf ("\nlist of norms:\n"); for (item = list, index = 0; item != NULL; item = item->next, ++index) { norm = item->data; if (current_norm == norm) { printf (" * %u - %s\n", index, norm->label); } else { printf (" %u - %s\n", index, norm->label); } } printf ("\ntype the number of norm you want (-1 to cancel): "); res = scanf ("%d", &next_norm); if (res != 1 || next_norm < 0) { break; } if (index <= next_norm) { printf ("Norm %d not available\n", next_norm); break; } for (item = list, index = 0; item != NULL && index <= next_norm; item = item->next, ++index) { norm = item->data; } if (norm) gst_tuner_set_norm (tuner, norm); } break; case 'i': { GstTuner *tuner = GST_TUNER (source); const GList *item, *list; const GstTunerChannel *current_channel; GstTunerChannel *channel = NULL; gint index, next_channel; list = gst_tuner_list_channels (tuner); current_channel = gst_tuner_get_channel (tuner); printf ("\nlist of inputs:\n"); for (item = list, index = 0; item != NULL; item = item->next, ++index) { channel = item->data; if (current_channel == channel) { printf (" * %u - %s\n", index, channel->label); } else { printf (" %u - %s\n", index, channel->label); } } printf ("\ntype the number of input you want (-1 to cancel): "); res = scanf ("%d", &next_channel); if (res != 1 || next_channel < 0) { break; } if (index <= next_channel) { printf ("Input %d not available\n", next_channel); break; } for (item = list, index = 0; item != NULL && index <= next_channel; item = item->next, ++index) { channel = item->data; } if (channel) gst_tuner_set_channel (tuner, channel); } break; case 'e': gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_quit (loop); printf ("Bye\n"); g_thread_exit (0); break; case 'c': { GstColorBalance *balance = GST_COLOR_BALANCE (source); const GList *controls; GstColorBalanceChannel *channel; const GList *item; gint index, new_value; controls = gst_color_balance_list_channels (balance); printf ("\n"); if (controls == NULL) { printf ("There is no list of colorbalance controls\n"); goto done; } if (controls) { printf ("list of controls:\n"); for (item = controls, index = 0; item != NULL; item = item->next, ++index) { channel = item->data; printf (" %u - %s (%d - %d) = %d\n", index, channel->label, channel->min_value, channel->max_value, gst_color_balance_get_value (balance, channel)); } printf ("\ntype the number of color control you want (-1 to cancel): "); res = scanf ("%d", &new_value); if (res != 1 || new_value == -1) break; for (item = controls, index = 0; item != NULL && index <= new_value; item = item->next, ++index) { channel = item->data; } printf (" %u - %s (%d - %d) = %d, type the new value: ", index - 1, channel->label, channel->min_value, channel->max_value, gst_color_balance_get_value (balance, channel)); res = scanf ("%d", &new_value); if (res != 1 || new_value == -1) break; gst_color_balance_set_value (balance, channel, new_value); } } case 'v': { GstVideoOrientation *vidorient = GST_VIDEO_ORIENTATION (source); gboolean flip = FALSE; gint center = 0; printf ("\n"); if (gst_video_orientation_get_hflip (vidorient, &flip)) { gint new_value; printf ("Horizontal flip is %s\n", flip ? "on" : "off"); printf ("\ntype 1 to toggle (-1 to cancel): "); res = scanf ("%d", &new_value); if (res != 1 || new_value == 1) { flip = !flip; if (gst_video_orientation_set_hflip (vidorient, flip)) { gst_video_orientation_get_hflip (vidorient, &flip); printf ("Now horizontal flip is %s\n", flip ? "on" : "off"); } else { printf ("Error toggling horizontal flip\n"); } } else { } } else { printf ("Horizontal flip control not available\n"); } if (gst_video_orientation_get_vflip (vidorient, &flip)) { gint new_value; printf ("\nVertical flip is %s\n", flip ? "on" : "off"); printf ("\ntype 1 to toggle (-1 to cancel): "); res = scanf ("%d", &new_value); if (res != 1 || new_value == 1) { flip = !flip; if (gst_video_orientation_set_vflip (vidorient, flip)) { gst_video_orientation_get_vflip (vidorient, &flip); printf ("Now vertical flip is %s\n", flip ? "on" : "off"); } else { printf ("Error toggling vertical flip\n"); } } else { } } else { printf ("Vertical flip control not available\n"); } if (gst_video_orientation_get_hcenter (vidorient, ¢er)) { printf ("Horizontal center is %d\n", center); printf ("\ntype the new horizontal center value (-1 to cancel): "); res = scanf ("%d", ¢er); if (res != 1 || center != -1) { if (gst_video_orientation_set_hcenter (vidorient, center)) { gst_video_orientation_get_hcenter (vidorient, ¢er); printf ("Now horizontal center is %d\n", center); } else { printf ("Error setting horizontal center\n"); } } else { } } else { printf ("Horizontal center control not available\n"); } if (gst_video_orientation_get_vcenter (vidorient, ¢er)) { printf ("Vertical center is %d\n", center); printf ("\ntype the new vertical center value (-1 to cancel): "); res = scanf ("%d", ¢er); if (res != 1 || center != -1) { if (gst_video_orientation_set_vcenter (vidorient, center)) { gst_video_orientation_get_vcenter (vidorient, ¢er); printf ("Now vertical center is %d\n", center); } else { printf ("Error setting vertical center\n"); } } else { } } else { printf ("Vertical center control not available\n"); } } break; break; default: if (opt != 10) printf ("error: invalid option %c", opt); break; } done: return; } static gpointer read_user (gpointer data) { char opt; while (!exit_read) { print_options (); do { opt = getchar (); if (exit_read) { break; } } while (opt == '\n'); run_options (opt); } return NULL; } static gboolean my_bus_callback (GstBus * bus, GstMessage * message, gpointer data) { switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR:{ GError *err; gchar *debug; gchar *str; gst_message_parse_error (message, &err, &debug); str = gst_element_get_name (message->src); g_print ("%s error: %s\n", str, err->message); g_free (str); g_print ("Debug: %s\n", debug); g_error_free (err); g_free (debug); printf ("presse key to exit\n"); exit_read = 1; g_main_loop_quit (loop); break; case GST_MESSAGE_EOS: /* end-of-stream */ printf ("presse any key to exit\n"); exit_read = 1; g_main_loop_quit (loop); break; default: break; } } return TRUE; } int main (int argc, char *argv[]) { GThread *input_thread; gint numbuffers = -1; gchar device[128] = { '\0' }; gchar input[128] = { '\0' }; gulong frequency = 0; GstBus *bus; /* see for input option */ int c; while (1) { static char long_options_desc[][64] = { {"Number of buffers to output before sending EOS"}, {"Device location. Common in /dev/video0"}, {"input/output (channel) to switch to"}, {"frequency to tune to (in Hz)"}, {0, 0, 0, 0} }; static struct option long_options[] = { {"numbuffers", 1, 0, 'n'}, {"device", 1, 0, 'd'}, {"input", 1, 0, 'i'}, {"frequency", 1, 0, 'f'}, {0, 0, 0, 0} }; /* getopt_long stores the option index here. */ int option_index = 0; c = getopt_long (argc, argv, "n:d:i:f:h", long_options, &option_index); /* Detect the end of the options. */ if (c == -1) { printf ("tip: use -h to see help message.\n"); break; } switch (c) { case 0: /* If this option set a flag, do nothing else now. */ if (long_options[option_index].flag != 0) break; printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case 'n': numbuffers = atoi (optarg); break; case 'd': strncpy (device, optarg, sizeof (device) / sizeof (device[0])); break; case 'i': strncpy (input, optarg, sizeof (input) / sizeof (input[0])); break; case 'f': frequency = atol (optarg); break; case 'h': printf ("Usage: v4l2src-test [OPTION]...\n"); for (c = 0; long_options[c].name; ++c) { printf ("-%c, --%s\r\t\t\t\t%s\n", long_options[c].val, long_options[c].name, long_options_desc[c]); } exit (0); break; case '?': /* getopt_long already printed an error message. */ printf ("Use -h to see help message.\n"); break; default: abort (); } } /* Print any remaining command line arguments (not options). */ if (optind < argc) { printf ("Use -h to see help message.\n" "non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); putchar ('\n'); } /* init */ gst_init (&argc, &argv); /* create elements */ if (!(pipeline = gst_pipeline_new ("my_pipeline"))) { fprintf (stderr, "error: gst_pipeline_new return NULL"); return -1; } if (!(source = gst_element_factory_make ("v4l2src", NULL))) { fprintf (stderr, "error: gst_element_factory_make (\"v4l2src\", NULL) return NULL"); return -1; } if (!(sink = gst_element_factory_make ("xvimagesink", NULL))) { fprintf (stderr, "error: gst_element_factory_make (\"xvimagesink\", NULL) return NULL"); return -1; } if (numbuffers > -1) { g_object_set (source, "num-buffers", numbuffers, NULL); } if (device[0]) { g_object_set (source, "device", device, NULL); } if (input[0]) { g_object_set (source, "input", input, NULL); } if (frequency) { g_object_set (source, "frequency", frequency, NULL); } /* you would normally check that the elements were created properly */ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_watch (bus, my_bus_callback, NULL); /* put together a pipeline */ gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL); gst_element_link_pads (source, "src", sink, "sink"); /* start the pipeline */ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); loop = g_main_loop_new (NULL, FALSE); #if !GLIB_CHECK_VERSION (2, 31, 0) input_thread = g_thread_create (read_user, source, TRUE, NULL); #else input_thread = g_thread_try_new ("v4l2src-test", read_user, source, NULL); #endif if (input_thread == NULL) { fprintf (stderr, "error: g_thread_create return NULL"); return -1; } g_main_loop_run (loop); g_thread_join (input_thread); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); gst_object_unref (bus); gst_object_unref (pipeline); gst_deinit (); return 0; } gst-plugins-good-0.10.31/tests/examples/0000755000175000017500000000000011720565323015043 500000000000000gst-plugins-good-0.10.31/tests/examples/audiofx/0000755000175000017500000000000011720565324016503 500000000000000gst-plugins-good-0.10.31/tests/examples/audiofx/Makefile.am0000644000175000017500000000046411671175355020471 00000000000000noinst_PROGRAMS = firfilter-example iirfilter-example firfilter_example_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) firfilter_example_LDADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstfft-@GST_MAJORMINOR@ $(LIBM) iirfilter_example_CFLAGS = $(GST_CFLAGS) iirfilter_example_LDADD = $(GST_LIBS) $(LIBM) gst-plugins-good-0.10.31/tests/examples/audiofx/firfilter-example.c0000644000175000017500000001104411671175355022214 00000000000000/* GStreamer * Copyright (C) 2009 Sebastian Droege * * 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. */ /* This small sample application creates a bandpass FIR filter * by transforming the frequency response to the filter kernel. */ #include #include #include #include static gboolean on_message (GstBus * bus, GstMessage * message, gpointer user_data) { GMainLoop *loop = (GMainLoop *) user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: g_error ("Got ERROR"); g_main_loop_quit (loop); break; case GST_MESSAGE_WARNING: g_warning ("Got WARNING"); g_main_loop_quit (loop); break; case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; default: break; } return TRUE; } static void on_rate_changed (GstElement * element, gint rate, gpointer user_data) { GValueArray *va; GValue v = { 0, }; GstFFTF64 *fft; GstFFTF64Complex frequency_response[17]; gdouble tmp[32]; gdouble filter_kernel[32]; guint i; /* Create the frequency response: zero outside * a small frequency band */ for (i = 0; i < 17; i++) { if (i < 5 || i > 11) frequency_response[i].r = 0.0; else frequency_response[i].r = 1.0; frequency_response[i].i = 0.0; } /* Calculate the inverse FT of the frequency response */ fft = gst_fft_f64_new (32, TRUE); gst_fft_f64_inverse_fft (fft, frequency_response, tmp); gst_fft_f64_free (fft); /* Shift the inverse FT of the frequency response by 16, * i.e. the half of the kernel length to get the * impulse response. See http://www.dspguide.com/ch17/1.htm * for more information. */ for (i = 0; i < 32; i++) filter_kernel[i] = tmp[(i + 16) % 32]; /* Apply the hamming window to the impulse response to get * a better result than given from the rectangular window */ for (i = 0; i < 32; i++) filter_kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / 32)); va = g_value_array_new (1); g_value_init (&v, G_TYPE_DOUBLE); for (i = 0; i < 32; i++) { g_value_set_double (&v, filter_kernel[i]); g_value_array_append (va, &v); g_value_reset (&v); } g_object_set (G_OBJECT (element), "kernel", va, NULL); /* Latency is 1/2 of the kernel length for this method of * calculating a filter kernel from the frequency response */ g_object_set (G_OBJECT (element), "latency", (gint64) (32 / 2), NULL); g_value_array_free (va); } gint main (gint argc, gchar * argv[]) { GstElement *pipeline, *src, *filter, *conv, *sink; GstBus *bus; GMainLoop *loop; gst_init (NULL, NULL); pipeline = gst_element_factory_make ("pipeline", NULL); src = gst_element_factory_make ("audiotestsrc", NULL); g_object_set (G_OBJECT (src), "wave", 5, NULL); filter = gst_element_factory_make ("audiofirfilter", NULL); g_signal_connect (G_OBJECT (filter), "rate-changed", G_CALLBACK (on_rate_changed), NULL); conv = gst_element_factory_make ("audioconvert", NULL); sink = gst_element_factory_make ("autoaudiosink", NULL); g_return_val_if_fail (sink != NULL, -1); gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL); if (!gst_element_link_many (src, filter, conv, sink, NULL)) { g_error ("Failed to link elements"); return -2; } loop = g_main_loop_new (NULL, FALSE); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); return -3; } g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_unref (loop); gst_object_unref (pipeline); return 0; } gst-plugins-good-0.10.31/tests/examples/audiofx/Makefile.in0000644000175000017500000007055011720560242020471 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = firfilter-example$(EXEEXT) \ iirfilter-example$(EXEEXT) subdir = tests/examples/audiofx DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) firfilter_example_SOURCES = firfilter-example.c firfilter_example_OBJECTS = \ firfilter_example-firfilter-example.$(OBJEXT) am__DEPENDENCIES_1 = firfilter_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent firfilter_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(firfilter_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ iirfilter_example_SOURCES = iirfilter-example.c iirfilter_example_OBJECTS = \ iirfilter_example-iirfilter-example.$(OBJEXT) iirfilter_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) iirfilter_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(iirfilter_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = firfilter-example.c iirfilter-example.c DIST_SOURCES = firfilter-example.c iirfilter-example.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ firfilter_example_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) firfilter_example_LDADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstfft-@GST_MAJORMINOR@ $(LIBM) iirfilter_example_CFLAGS = $(GST_CFLAGS) iirfilter_example_LDADD = $(GST_LIBS) $(LIBM) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/audiofx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/audiofx/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list firfilter-example$(EXEEXT): $(firfilter_example_OBJECTS) $(firfilter_example_DEPENDENCIES) $(EXTRA_firfilter_example_DEPENDENCIES) @rm -f firfilter-example$(EXEEXT) $(AM_V_CCLD)$(firfilter_example_LINK) $(firfilter_example_OBJECTS) $(firfilter_example_LDADD) $(LIBS) iirfilter-example$(EXEEXT): $(iirfilter_example_OBJECTS) $(iirfilter_example_DEPENDENCIES) $(EXTRA_iirfilter_example_DEPENDENCIES) @rm -f iirfilter-example$(EXEEXT) $(AM_V_CCLD)$(iirfilter_example_LINK) $(iirfilter_example_OBJECTS) $(iirfilter_example_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/firfilter_example-firfilter-example.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iirfilter_example-iirfilter-example.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< firfilter_example-firfilter-example.o: firfilter-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -MT firfilter_example-firfilter-example.o -MD -MP -MF $(DEPDIR)/firfilter_example-firfilter-example.Tpo -c -o firfilter_example-firfilter-example.o `test -f 'firfilter-example.c' || echo '$(srcdir)/'`firfilter-example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/firfilter_example-firfilter-example.Tpo $(DEPDIR)/firfilter_example-firfilter-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='firfilter-example.c' object='firfilter_example-firfilter-example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -c -o firfilter_example-firfilter-example.o `test -f 'firfilter-example.c' || echo '$(srcdir)/'`firfilter-example.c firfilter_example-firfilter-example.obj: firfilter-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -MT firfilter_example-firfilter-example.obj -MD -MP -MF $(DEPDIR)/firfilter_example-firfilter-example.Tpo -c -o firfilter_example-firfilter-example.obj `if test -f 'firfilter-example.c'; then $(CYGPATH_W) 'firfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/firfilter-example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/firfilter_example-firfilter-example.Tpo $(DEPDIR)/firfilter_example-firfilter-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='firfilter-example.c' object='firfilter_example-firfilter-example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(firfilter_example_CFLAGS) $(CFLAGS) -c -o firfilter_example-firfilter-example.obj `if test -f 'firfilter-example.c'; then $(CYGPATH_W) 'firfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/firfilter-example.c'; fi` iirfilter_example-iirfilter-example.o: iirfilter-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -MT iirfilter_example-iirfilter-example.o -MD -MP -MF $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo -c -o iirfilter_example-iirfilter-example.o `test -f 'iirfilter-example.c' || echo '$(srcdir)/'`iirfilter-example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo $(DEPDIR)/iirfilter_example-iirfilter-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iirfilter-example.c' object='iirfilter_example-iirfilter-example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -c -o iirfilter_example-iirfilter-example.o `test -f 'iirfilter-example.c' || echo '$(srcdir)/'`iirfilter-example.c iirfilter_example-iirfilter-example.obj: iirfilter-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -MT iirfilter_example-iirfilter-example.obj -MD -MP -MF $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo -c -o iirfilter_example-iirfilter-example.obj `if test -f 'iirfilter-example.c'; then $(CYGPATH_W) 'iirfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/iirfilter-example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iirfilter_example-iirfilter-example.Tpo $(DEPDIR)/iirfilter_example-iirfilter-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iirfilter-example.c' object='iirfilter_example-iirfilter-example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iirfilter_example_CFLAGS) $(CFLAGS) -c -o iirfilter_example-iirfilter-example.obj `if test -f 'iirfilter-example.c'; then $(CYGPATH_W) 'iirfilter-example.c'; else $(CYGPATH_W) '$(srcdir)/iirfilter-example.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/audiofx/iirfilter-example.c0000644000175000017500000000721011671175355022217 00000000000000/* GStreamer * Copyright (C) 2009 Sebastian Droege * * 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. */ /* This small sample application creates a lowpass IIR filter * and applies it to white noise. * See http://www.dspguide.com/ch19/2.htm for a description * of the IIR filter that is used. */ #include #include #include /* Cutoff of 4000 Hz */ #define CUTOFF (4000.0) static gboolean on_message (GstBus * bus, GstMessage * message, gpointer user_data) { GMainLoop *loop = (GMainLoop *) user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: g_error ("Got ERROR"); g_main_loop_quit (loop); break; case GST_MESSAGE_WARNING: g_warning ("Got WARNING"); g_main_loop_quit (loop); break; case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; default: break; } return TRUE; } static void on_rate_changed (GstElement * element, gint rate, gpointer user_data) { GValueArray *va; GValue v = { 0, }; gdouble x; if (rate / 2.0 > CUTOFF) x = exp (-2.0 * G_PI * (CUTOFF / rate)); else x = 0.0; va = g_value_array_new (1); g_value_init (&v, G_TYPE_DOUBLE); g_value_set_double (&v, 1.0 - x); g_value_array_append (va, &v); g_value_reset (&v); g_object_set (G_OBJECT (element), "a", va, NULL); g_value_array_free (va); va = g_value_array_new (1); g_value_set_double (&v, x); g_value_array_append (va, &v); g_value_reset (&v); g_object_set (G_OBJECT (element), "b", va, NULL); g_value_array_free (va); } gint main (gint argc, gchar * argv[]) { GstElement *pipeline, *src, *filter, *conv, *sink; GstBus *bus; GMainLoop *loop; gst_init (NULL, NULL); pipeline = gst_element_factory_make ("pipeline", NULL); src = gst_element_factory_make ("audiotestsrc", NULL); g_object_set (G_OBJECT (src), "wave", 5, NULL); filter = gst_element_factory_make ("audioiirfilter", NULL); g_signal_connect (G_OBJECT (filter), "rate-changed", G_CALLBACK (on_rate_changed), NULL); conv = gst_element_factory_make ("audioconvert", NULL); sink = gst_element_factory_make ("autoaudiosink", NULL); g_return_val_if_fail (sink != NULL, -1); gst_bin_add_many (GST_BIN (pipeline), src, filter, conv, sink, NULL); if (!gst_element_link_many (src, filter, conv, sink, NULL)) { g_error ("Failed to link elements"); return -2; } loop = g_main_loop_new (NULL, FALSE); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); return -3; } g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_unref (loop); gst_object_unref (pipeline); return 0; } gst-plugins-good-0.10.31/tests/examples/spectrum/0000755000175000017500000000000011720565324016706 500000000000000gst-plugins-good-0.10.31/tests/examples/spectrum/Makefile.am0000644000175000017500000000114611671175355020672 00000000000000if HAVE_GTK noinst_PROGRAMS = demo-osssrc demo-audiotest spectrum-example endif demo_osssrc_SOURCES = demo-osssrc.c demo_osssrc_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) demo_osssrc_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) demo_audiotest_SOURCES = demo-audiotest.c demo_audiotest_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) demo_audiotest_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) spectrum_example_SOURCES = spectrum-example.c spectrum_example_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) spectrum_example_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) gst-plugins-good-0.10.31/tests/examples/spectrum/demo-audiotest.c0000644000175000017500000001564311671175355021734 00000000000000/* GStreamer * Copyright (C) 2006 Stefan Kost * * 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. */ /* TODO: add wave selection */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #ifndef DEFAULT_AUDIOSINK #define DEFAULT_AUDIOSINK "autoaudiosink" #endif static guint spect_height = 64; static guint spect_bands = 256; static gfloat height_scale = 1.0; static GtkWidget *drawingarea = NULL; static GstClock *sync_clock = NULL; static void on_window_destroy (GObject * object, gpointer user_data) { drawingarea = NULL; gtk_main_quit (); } /* control audiotestsrc frequency */ static void on_frequency_changed (GtkRange * range, gpointer user_data) { GstElement *machine = GST_ELEMENT (user_data); gdouble value = gtk_range_get_value (range); g_object_set (machine, "freq", value, NULL); } static gboolean on_configure_event (GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) { GstElement *spectrum = GST_ELEMENT (user_data); /*GST_INFO ("%d x %d", event->width, event->height); */ spect_height = event->height; height_scale = event->height / 64.0; spect_bands = event->width; g_object_set (G_OBJECT (spectrum), "bands", spect_bands, NULL); return FALSE; } /* draw frequency spectrum as a bunch of bars */ static void draw_spectrum (gfloat * data) { gint i; GdkRectangle rect = { 0, 0, spect_bands, spect_height }; cairo_t *cr; if (!drawingarea) return; gdk_window_begin_paint_rect (gtk_widget_get_window (drawingarea), &rect); cr = gdk_cairo_create (gtk_widget_get_window (drawingarea)); cairo_set_source_rgb (cr, 0, 0, 0); cairo_rectangle (cr, 0, 0, spect_bands, spect_height); cairo_fill (cr); cairo_set_source_rgb (cr, 1, 1, 1); for (i = 0; i < spect_bands; i++) { cairo_rectangle (cr, i, -data[i], 1, spect_height + data[i]); cairo_fill (cr); } cairo_destroy (cr); gdk_window_end_paint (gtk_widget_get_window (drawingarea)); } /* process delayed message */ static gboolean delayed_idle_spectrum_update (gpointer user_data) { draw_spectrum ((gfloat *) user_data); g_free (user_data); return (FALSE); } static gboolean delayed_spectrum_update (GstClock * sync_clock, GstClockTime time, GstClockID id, gpointer user_data) { if (GST_CLOCK_TIME_IS_VALID (time)) g_idle_add (delayed_idle_spectrum_update, user_data); else g_free (user_data); return (TRUE); } /* receive spectral data from element message */ static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) { if (message->type == GST_MESSAGE_ELEMENT) { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); if (strcmp (name, "spectrum") == 0) { GstElement *spectrum = GST_ELEMENT (GST_MESSAGE_SRC (message)); GstClockTime timestamp, duration; GstClockTime waittime = GST_CLOCK_TIME_NONE; if (gst_structure_get_clock_time (s, "running-time", ×tamp) && gst_structure_get_clock_time (s, "duration", &duration)) { /* wait for middle of buffer */ waittime = timestamp + duration / 2; } else if (gst_structure_get_clock_time (s, "endtime", ×tamp)) { waittime = timestamp; } if (GST_CLOCK_TIME_IS_VALID (waittime)) { GstClockID clock_id; GstClockTime basetime = gst_element_get_base_time (spectrum); gfloat *spect = g_new (gfloat, spect_bands); const GValue *list; const GValue *value; guint i; list = gst_structure_get_value (s, "magnitude"); for (i = 0; i < spect_bands; ++i) { value = gst_value_list_get_value (list, i); spect[i] = height_scale * g_value_get_float (value); } clock_id = gst_clock_new_single_shot_id (sync_clock, waittime + basetime); gst_clock_id_wait_async (clock_id, delayed_spectrum_update, (gpointer) spect); gst_clock_id_unref (clock_id); } } } return TRUE; } int main (int argc, char *argv[]) { GstElement *bin; GstElement *src, *spectrum, *audioconvert, *sink; GstBus *bus; GtkWidget *appwindow, *vbox, *widget; gst_init (&argc, &argv); gtk_init (&argc, &argv); bin = gst_pipeline_new ("bin"); src = gst_element_factory_make ("audiotestsrc", "src"); g_object_set (G_OBJECT (src), "wave", 0, NULL); spectrum = gst_element_factory_make ("spectrum", "spectrum"); g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, "message", TRUE, NULL); audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); sink = gst_element_factory_make (DEFAULT_AUDIOSINK, "sink"); gst_bin_add_many (GST_BIN (bin), src, spectrum, audioconvert, sink, NULL); if (!gst_element_link_many (src, spectrum, audioconvert, sink, NULL)) { fprintf (stderr, "can't link elements\n"); exit (1); } bus = gst_element_get_bus (bin); gst_bus_add_watch (bus, message_handler, NULL); gst_object_unref (bus); sync_clock = gst_pipeline_get_clock (GST_PIPELINE (bin)); appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (appwindow), "destroy", G_CALLBACK (on_window_destroy), NULL); vbox = gtk_vbox_new (FALSE, 6); widget = gtk_hscale_new_with_range (50.0, 20000.0, 10); gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); gtk_range_set_value (GTK_RANGE (widget), 440.0); g_signal_connect (G_OBJECT (widget), "value-changed", G_CALLBACK (on_frequency_changed), (gpointer) src); gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0); drawingarea = gtk_drawing_area_new (); gtk_widget_set_size_request (drawingarea, spect_bands, spect_height); g_signal_connect (G_OBJECT (drawingarea), "configure-event", G_CALLBACK (on_configure_event), (gpointer) spectrum); gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (appwindow), vbox); gtk_widget_show_all (appwindow); gst_element_set_state (bin, GST_STATE_PLAYING); gtk_main (); gst_element_set_state (bin, GST_STATE_NULL); gst_object_unref (sync_clock); gst_object_unref (bin); return 0; } gst-plugins-good-0.10.31/tests/examples/spectrum/demo-osssrc.c0000644000175000017500000001371011671175355021240 00000000000000/* GStreamer * Copyright (C) 2006 Stefan Kost * * 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 #include #include #include #include #include #ifndef DEFAULT_AUDIOSRC #define DEFAULT_AUDIOSRC "alsasrc" #endif static guint spect_height = 64; static guint spect_bands = 256; static gfloat height_scale = 1.0; static GtkWidget *drawingarea = NULL; static GstClock *sync_clock = NULL; static void on_window_destroy (GObject * object, gpointer user_data) { drawingarea = NULL; gtk_main_quit (); } static gboolean on_configure_event (GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) { GstElement *spectrum = GST_ELEMENT (user_data); /*GST_INFO ("%d x %d", event->width, event->height); */ spect_height = event->height; height_scale = event->height / 64.0; spect_bands = event->width; g_object_set (G_OBJECT (spectrum), "bands", spect_bands, NULL); return FALSE; } /* draw frequency spectrum as a bunch of bars */ static void draw_spectrum (gfloat * data) { gint i; GdkRectangle rect = { 0, 0, spect_bands, spect_height }; cairo_t *cr; if (!drawingarea) return; gdk_window_begin_paint_rect (gtk_widget_get_window (drawingarea), &rect); cr = gdk_cairo_create (gtk_widget_get_window (drawingarea)); cairo_set_source_rgb (cr, 0, 0, 0); cairo_rectangle (cr, 0, 0, spect_bands, spect_height); cairo_fill (cr); cairo_set_source_rgb (cr, 1, 1, 1); for (i = 0; i < spect_bands; i++) { cairo_rectangle (cr, i, -data[i], 1, spect_height + data[i]); cairo_fill (cr); } cairo_destroy (cr); gdk_window_end_paint (gtk_widget_get_window (drawingarea)); } /* process delayed message */ static gboolean delayed_idle_spectrum_update (gpointer user_data) { draw_spectrum ((gfloat *) user_data); g_free (user_data); return (FALSE); } static gboolean delayed_spectrum_update (GstClock * sync_clock, GstClockTime time, GstClockID id, gpointer user_data) { if (GST_CLOCK_TIME_IS_VALID (time)) g_idle_add (delayed_idle_spectrum_update, user_data); else g_free (user_data); return (TRUE); } /* receive spectral data from element message */ static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) { if (message->type == GST_MESSAGE_ELEMENT) { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); if (strcmp (name, "spectrum") == 0) { GstElement *spectrum = GST_ELEMENT (GST_MESSAGE_SRC (message)); GstClockTime timestamp, duration; GstClockTime waittime = GST_CLOCK_TIME_NONE; if (gst_structure_get_clock_time (s, "running-time", ×tamp) && gst_structure_get_clock_time (s, "duration", &duration)) { /* wait for middle of buffer */ waittime = timestamp + duration / 2; } else if (gst_structure_get_clock_time (s, "endtime", ×tamp)) { waittime = timestamp; } if (GST_CLOCK_TIME_IS_VALID (waittime)) { GstClockID clock_id; GstClockTime basetime = gst_element_get_base_time (spectrum); gfloat *spect = g_new (gfloat, spect_bands); const GValue *list; const GValue *value; guint i; list = gst_structure_get_value (s, "magnitude"); for (i = 0; i < spect_bands; ++i) { value = gst_value_list_get_value (list, i); spect[i] = height_scale * g_value_get_float (value); } clock_id = gst_clock_new_single_shot_id (sync_clock, waittime + basetime); gst_clock_id_wait_async (clock_id, delayed_spectrum_update, (gpointer) spect); gst_clock_id_unref (clock_id); } } } return TRUE; } int main (int argc, char *argv[]) { GstElement *bin; GstElement *src, *spectrum, *sink; GstBus *bus; GtkWidget *appwindow; gst_init (&argc, &argv); gtk_init (&argc, &argv); bin = gst_pipeline_new ("bin"); src = gst_element_factory_make (DEFAULT_AUDIOSRC, "src"); spectrum = gst_element_factory_make ("spectrum", "spectrum"); g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, "message", TRUE, NULL); sink = gst_element_factory_make ("fakesink", "sink"); gst_bin_add_many (GST_BIN (bin), src, spectrum, sink, NULL); if (!gst_element_link_many (src, spectrum, sink, NULL)) { fprintf (stderr, "can't link elements\n"); exit (1); } bus = gst_element_get_bus (bin); gst_bus_add_watch (bus, message_handler, NULL); gst_object_unref (bus); sync_clock = gst_pipeline_get_clock (GST_PIPELINE (bin)); appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (appwindow), "destroy", G_CALLBACK (on_window_destroy), NULL); drawingarea = gtk_drawing_area_new (); gtk_widget_set_size_request (drawingarea, spect_bands, spect_height); g_signal_connect (G_OBJECT (drawingarea), "configure-event", G_CALLBACK (on_configure_event), (gpointer) spectrum); gtk_container_add (GTK_CONTAINER (appwindow), drawingarea); gtk_widget_show_all (appwindow); gst_element_set_state (bin, GST_STATE_PLAYING); gtk_main (); gst_element_set_state (bin, GST_STATE_NULL); gst_object_unref (sync_clock); gst_object_unref (bin); return 0; } gst-plugins-good-0.10.31/tests/examples/spectrum/spectrum-example.c0000644000175000017500000000743711671175355022306 00000000000000/* GStreamer * Copyright (C) 2006 Stefan Kost * Copyright (C) 2008 Jan Schmidt * * 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 #include #include #include static guint spect_bands = 20; #define AUDIOFREQ 32000 /* receive spectral data from element message */ static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) { if (message->type == GST_MESSAGE_ELEMENT) { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); GstClockTime endtime; if (strcmp (name, "spectrum") == 0) { const GValue *magnitudes; const GValue *phases; const GValue *mag, *phase; gdouble freq; guint i; if (!gst_structure_get_clock_time (s, "endtime", &endtime)) endtime = GST_CLOCK_TIME_NONE; g_print ("New spectrum message, endtime %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (endtime)); magnitudes = gst_structure_get_value (s, "magnitude"); phases = gst_structure_get_value (s, "phase"); for (i = 0; i < spect_bands; ++i) { freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) / spect_bands; mag = gst_value_list_get_value (magnitudes, i); phase = gst_value_list_get_value (phases, i); if (mag != NULL && phase != NULL) { g_print ("band %d (freq %g): magnitude %f dB phase %f\n", i, freq, g_value_get_float (mag), g_value_get_float (phase)); } } g_print ("\n"); } } return TRUE; } int main (int argc, char *argv[]) { GstElement *bin; GstElement *src, *audioconvert, *spectrum, *sink; GstBus *bus; GstCaps *caps; GMainLoop *loop; gst_init (&argc, &argv); bin = gst_pipeline_new ("bin"); src = gst_element_factory_make ("audiotestsrc", "src"); g_object_set (G_OBJECT (src), "wave", 0, "freq", 6000.0, NULL); audioconvert = gst_element_factory_make ("audioconvert", NULL); g_assert (audioconvert); spectrum = gst_element_factory_make ("spectrum", "spectrum"); g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, "message", TRUE, "message-phase", TRUE, NULL); sink = gst_element_factory_make ("fakesink", "sink"); g_object_set (G_OBJECT (sink), "sync", TRUE, NULL); gst_bin_add_many (GST_BIN (bin), src, audioconvert, spectrum, sink, NULL); caps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, AUDIOFREQ, NULL); if (!gst_element_link (src, audioconvert) || !gst_element_link_filtered (audioconvert, spectrum, caps) || !gst_element_link (spectrum, sink)) { fprintf (stderr, "can't link elements\n"); exit (1); } gst_caps_unref (caps); bus = gst_element_get_bus (bin); gst_bus_add_watch (bus, message_handler, NULL); gst_object_unref (bus); gst_element_set_state (bin, GST_STATE_PLAYING); /* we need to run a GLib main loop to get the messages */ loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); gst_element_set_state (bin, GST_STATE_NULL); gst_object_unref (bin); return 0; } gst-plugins-good-0.10.31/tests/examples/spectrum/Makefile.in0000644000175000017500000007622111720560244020677 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTK_TRUE@noinst_PROGRAMS = demo-osssrc$(EXEEXT) \ @HAVE_GTK_TRUE@ demo-audiotest$(EXEEXT) \ @HAVE_GTK_TRUE@ spectrum-example$(EXEEXT) subdir = tests/examples/spectrum DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_demo_audiotest_OBJECTS = demo_audiotest-demo-audiotest.$(OBJEXT) demo_audiotest_OBJECTS = $(am_demo_audiotest_OBJECTS) am__DEPENDENCIES_1 = demo_audiotest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent demo_audiotest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(demo_audiotest_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ am_demo_osssrc_OBJECTS = demo_osssrc-demo-osssrc.$(OBJEXT) demo_osssrc_OBJECTS = $(am_demo_osssrc_OBJECTS) demo_osssrc_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) demo_osssrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(demo_osssrc_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_spectrum_example_OBJECTS = \ spectrum_example-spectrum-example.$(OBJEXT) spectrum_example_OBJECTS = $(am_spectrum_example_OBJECTS) spectrum_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) spectrum_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(spectrum_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(demo_audiotest_SOURCES) $(demo_osssrc_SOURCES) \ $(spectrum_example_SOURCES) DIST_SOURCES = $(demo_audiotest_SOURCES) $(demo_osssrc_SOURCES) \ $(spectrum_example_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ demo_osssrc_SOURCES = demo-osssrc.c demo_osssrc_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) demo_osssrc_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) demo_audiotest_SOURCES = demo-audiotest.c demo_audiotest_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) demo_audiotest_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) spectrum_example_SOURCES = spectrum-example.c spectrum_example_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) spectrum_example_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/spectrum/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/spectrum/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list demo-audiotest$(EXEEXT): $(demo_audiotest_OBJECTS) $(demo_audiotest_DEPENDENCIES) $(EXTRA_demo_audiotest_DEPENDENCIES) @rm -f demo-audiotest$(EXEEXT) $(AM_V_CCLD)$(demo_audiotest_LINK) $(demo_audiotest_OBJECTS) $(demo_audiotest_LDADD) $(LIBS) demo-osssrc$(EXEEXT): $(demo_osssrc_OBJECTS) $(demo_osssrc_DEPENDENCIES) $(EXTRA_demo_osssrc_DEPENDENCIES) @rm -f demo-osssrc$(EXEEXT) $(AM_V_CCLD)$(demo_osssrc_LINK) $(demo_osssrc_OBJECTS) $(demo_osssrc_LDADD) $(LIBS) spectrum-example$(EXEEXT): $(spectrum_example_OBJECTS) $(spectrum_example_DEPENDENCIES) $(EXTRA_spectrum_example_DEPENDENCIES) @rm -f spectrum-example$(EXEEXT) $(AM_V_CCLD)$(spectrum_example_LINK) $(spectrum_example_OBJECTS) $(spectrum_example_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_audiotest-demo-audiotest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_osssrc-demo-osssrc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spectrum_example-spectrum-example.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< demo_audiotest-demo-audiotest.o: demo-audiotest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -MT demo_audiotest-demo-audiotest.o -MD -MP -MF $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo -c -o demo_audiotest-demo-audiotest.o `test -f 'demo-audiotest.c' || echo '$(srcdir)/'`demo-audiotest.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo $(DEPDIR)/demo_audiotest-demo-audiotest.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-audiotest.c' object='demo_audiotest-demo-audiotest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -c -o demo_audiotest-demo-audiotest.o `test -f 'demo-audiotest.c' || echo '$(srcdir)/'`demo-audiotest.c demo_audiotest-demo-audiotest.obj: demo-audiotest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -MT demo_audiotest-demo-audiotest.obj -MD -MP -MF $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo -c -o demo_audiotest-demo-audiotest.obj `if test -f 'demo-audiotest.c'; then $(CYGPATH_W) 'demo-audiotest.c'; else $(CYGPATH_W) '$(srcdir)/demo-audiotest.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_audiotest-demo-audiotest.Tpo $(DEPDIR)/demo_audiotest-demo-audiotest.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-audiotest.c' object='demo_audiotest-demo-audiotest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_audiotest_CFLAGS) $(CFLAGS) -c -o demo_audiotest-demo-audiotest.obj `if test -f 'demo-audiotest.c'; then $(CYGPATH_W) 'demo-audiotest.c'; else $(CYGPATH_W) '$(srcdir)/demo-audiotest.c'; fi` demo_osssrc-demo-osssrc.o: demo-osssrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -MT demo_osssrc-demo-osssrc.o -MD -MP -MF $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo -c -o demo_osssrc-demo-osssrc.o `test -f 'demo-osssrc.c' || echo '$(srcdir)/'`demo-osssrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo $(DEPDIR)/demo_osssrc-demo-osssrc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-osssrc.c' object='demo_osssrc-demo-osssrc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -c -o demo_osssrc-demo-osssrc.o `test -f 'demo-osssrc.c' || echo '$(srcdir)/'`demo-osssrc.c demo_osssrc-demo-osssrc.obj: demo-osssrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -MT demo_osssrc-demo-osssrc.obj -MD -MP -MF $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo -c -o demo_osssrc-demo-osssrc.obj `if test -f 'demo-osssrc.c'; then $(CYGPATH_W) 'demo-osssrc.c'; else $(CYGPATH_W) '$(srcdir)/demo-osssrc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo_osssrc-demo-osssrc.Tpo $(DEPDIR)/demo_osssrc-demo-osssrc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo-osssrc.c' object='demo_osssrc-demo-osssrc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_osssrc_CFLAGS) $(CFLAGS) -c -o demo_osssrc-demo-osssrc.obj `if test -f 'demo-osssrc.c'; then $(CYGPATH_W) 'demo-osssrc.c'; else $(CYGPATH_W) '$(srcdir)/demo-osssrc.c'; fi` spectrum_example-spectrum-example.o: spectrum-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -MT spectrum_example-spectrum-example.o -MD -MP -MF $(DEPDIR)/spectrum_example-spectrum-example.Tpo -c -o spectrum_example-spectrum-example.o `test -f 'spectrum-example.c' || echo '$(srcdir)/'`spectrum-example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum_example-spectrum-example.Tpo $(DEPDIR)/spectrum_example-spectrum-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spectrum-example.c' object='spectrum_example-spectrum-example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -c -o spectrum_example-spectrum-example.o `test -f 'spectrum-example.c' || echo '$(srcdir)/'`spectrum-example.c spectrum_example-spectrum-example.obj: spectrum-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -MT spectrum_example-spectrum-example.obj -MD -MP -MF $(DEPDIR)/spectrum_example-spectrum-example.Tpo -c -o spectrum_example-spectrum-example.obj `if test -f 'spectrum-example.c'; then $(CYGPATH_W) 'spectrum-example.c'; else $(CYGPATH_W) '$(srcdir)/spectrum-example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spectrum_example-spectrum-example.Tpo $(DEPDIR)/spectrum_example-spectrum-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spectrum-example.c' object='spectrum_example-spectrum-example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(spectrum_example_CFLAGS) $(CFLAGS) -c -o spectrum_example-spectrum-example.obj `if test -f 'spectrum-example.c'; then $(CYGPATH_W) 'spectrum-example.c'; else $(CYGPATH_W) '$(srcdir)/spectrum-example.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/equalizer/0000755000175000017500000000000011720565324017045 500000000000000gst-plugins-good-0.10.31/tests/examples/equalizer/demo.c0000644000175000017500000001717511671175355020076 00000000000000#include #include #include #include #include #define NBANDS 10 static GtkWidget *drawingarea = NULL; static guint spect_height = 128; static guint spect_bands = 256; static gfloat height_scale = 2.0; static void on_window_destroy (GObject * object, gpointer user_data) { drawingarea = NULL; gtk_main_quit (); } static gboolean on_configure_event (GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) { GstElement *spectrum = GST_ELEMENT (user_data); /*GST_INFO ("%d x %d", event->width, event->height); */ spect_height = event->height; height_scale = event->height / 64.0; spect_bands = event->width; g_object_set (G_OBJECT (spectrum), "bands", spect_bands, NULL); return FALSE; } /* control gains */ static void on_gain_changed (GtkRange * range, gpointer user_data) { GstObject *band = GST_OBJECT (user_data); gdouble value = gtk_range_get_value (range); g_object_set (band, "gain", value, NULL); } /* control bandwidths */ static void on_bandwidth_changed (GtkRange * range, gpointer user_data) { GstObject *band = GST_OBJECT (user_data); gdouble value = gtk_range_get_value (range); g_object_set (band, "bandwidth", value, NULL); } /* control frequency */ static void on_freq_changed (GtkRange * range, gpointer user_data) { GstObject *band = GST_OBJECT (user_data); gdouble value = gtk_range_get_value (range); /* hbox */ GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (range)); /* frame */ GtkWidget *parent_parent = gtk_widget_get_parent (parent); gchar *label = g_strdup_printf ("%d Hz", (int) (value + 0.5)); gtk_frame_set_label (GTK_FRAME (parent_parent), label); g_free (label); g_object_set (band, "freq", value, NULL); } /* draw frequency spectrum as a bunch of bars */ static void draw_spectrum (gfloat * data) { gint i; GdkRectangle rect = { 0, 0, spect_bands, spect_height }; cairo_t *cr; if (!drawingarea) return; gdk_window_begin_paint_rect (gtk_widget_get_window (drawingarea), &rect); cr = gdk_cairo_create (gtk_widget_get_window (drawingarea)); cairo_set_source_rgb (cr, 0, 0, 0); cairo_rectangle (cr, 0, 0, spect_bands, spect_height); cairo_fill (cr); for (i = 0; i < spect_bands; i++) { cairo_set_source_rgb (cr, 1, 1, 1); cairo_rectangle (cr, i, -data[i], 1, spect_height + data[i]); cairo_fill (cr); } cairo_destroy (cr); gdk_window_end_paint (gtk_widget_get_window (drawingarea)); } /* receive spectral data from element message */ static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) { if (message->type == GST_MESSAGE_ELEMENT) { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); if (strcmp (name, "spectrum") == 0) { gfloat *spect = g_new (gfloat, spect_bands); const GValue *list; const GValue *value; guint i; list = gst_structure_get_value (s, "magnitude"); for (i = 0; i < spect_bands; ++i) { value = gst_value_list_get_value (list, i); spect[i] = height_scale * g_value_get_float (value); } draw_spectrum (spect); g_free (spect); } } return TRUE; } int main (int argc, char *argv[]) { GstElement *bin; GstElement *src, *capsfilter, *equalizer, *spectrum, *audioconvert, *sink; GstCaps *caps; GstBus *bus; GtkWidget *appwindow, *vbox, *hbox, *widget; int i; gst_init (&argc, &argv); gtk_init (&argc, &argv); bin = gst_pipeline_new ("bin"); /* White noise */ src = gst_element_factory_make ("audiotestsrc", "src"); g_object_set (G_OBJECT (src), "wave", 5, "volume", 0.8, NULL); /* Force float32 samples */ capsfilter = gst_element_factory_make ("capsfilter", "capsfilter"); caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, NULL); g_object_set (capsfilter, "caps", caps, NULL); equalizer = gst_element_factory_make ("equalizer-nbands", "equalizer"); g_object_set (G_OBJECT (equalizer), "num-bands", NBANDS, NULL); spectrum = gst_element_factory_make ("spectrum", "spectrum"); g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80, "message", TRUE, "interval", 500 * GST_MSECOND, NULL); audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); sink = gst_element_factory_make ("autoaudiosink", "sink"); gst_bin_add_many (GST_BIN (bin), src, capsfilter, equalizer, spectrum, audioconvert, sink, NULL); if (!gst_element_link_many (src, capsfilter, equalizer, spectrum, audioconvert, sink, NULL)) { fprintf (stderr, "can't link elements\n"); exit (1); } bus = gst_element_get_bus (bin); gst_bus_add_watch (bus, message_handler, NULL); gst_object_unref (bus); appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (appwindow), "destroy", G_CALLBACK (on_window_destroy), NULL); vbox = gtk_vbox_new (FALSE, 6); drawingarea = gtk_drawing_area_new (); gtk_widget_set_size_request (drawingarea, spect_bands, spect_height); g_signal_connect (G_OBJECT (drawingarea), "configure-event", G_CALLBACK (on_configure_event), (gpointer) spectrum); gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0); hbox = gtk_hbox_new (FALSE, 20); for (i = 0; i < NBANDS; i++) { GstObject *band; gdouble freq; gdouble bw; gdouble gain; gchar *label; GtkWidget *frame, *scales_hbox; band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); g_assert (band != NULL); g_object_get (G_OBJECT (band), "freq", &freq, NULL); g_object_get (G_OBJECT (band), "bandwidth", &bw, NULL); g_object_get (G_OBJECT (band), "gain", &gain, NULL); label = g_strdup_printf ("%d Hz", (int) (freq + 0.5)); frame = gtk_frame_new (label); g_free (label); scales_hbox = gtk_hbox_new (FALSE, 6); widget = gtk_vscale_new_with_range (-24.0, 12.0, 0.5); gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); gtk_range_set_value (GTK_RANGE (widget), gain); gtk_widget_set_size_request (widget, 25, 150); g_signal_connect (G_OBJECT (widget), "value-changed", G_CALLBACK (on_gain_changed), (gpointer) band); gtk_box_pack_start (GTK_BOX (scales_hbox), widget, FALSE, FALSE, 0); widget = gtk_vscale_new_with_range (0.0, 20000.0, 5.0); gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); gtk_range_set_value (GTK_RANGE (widget), bw); gtk_widget_set_size_request (widget, 25, 150); g_signal_connect (G_OBJECT (widget), "value-changed", G_CALLBACK (on_bandwidth_changed), (gpointer) band); gtk_box_pack_start (GTK_BOX (scales_hbox), widget, TRUE, TRUE, 0); widget = gtk_vscale_new_with_range (20.0, 20000.0, 5.0); gtk_scale_set_draw_value (GTK_SCALE (widget), TRUE); gtk_scale_set_value_pos (GTK_SCALE (widget), GTK_POS_TOP); gtk_range_set_value (GTK_RANGE (widget), freq); gtk_widget_set_size_request (widget, 25, 150); g_signal_connect (G_OBJECT (widget), "value-changed", G_CALLBACK (on_freq_changed), (gpointer) band); gtk_box_pack_start (GTK_BOX (scales_hbox), widget, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (frame), scales_hbox); gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); } gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (appwindow), vbox); gtk_widget_show_all (appwindow); gst_element_set_state (bin, GST_STATE_PLAYING); gtk_main (); gst_element_set_state (bin, GST_STATE_NULL); gst_object_unref (bin); return 0; } gst-plugins-good-0.10.31/tests/examples/equalizer/Makefile.am0000644000175000017500000000026511671175355021032 00000000000000if HAVE_GTK noinst_PROGRAMS = demo endif demo_SOURCES = demo.c demo_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) demo_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) gst-plugins-good-0.10.31/tests/examples/equalizer/Makefile.in0000644000175000017500000006054711720560242021040 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTK_TRUE@noinst_PROGRAMS = demo$(EXEEXT) subdir = tests/examples/equalizer DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_demo_OBJECTS = demo-demo.$(OBJEXT) demo_OBJECTS = $(am_demo_OBJECTS) am__DEPENDENCIES_1 = demo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent demo_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(demo_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(demo_SOURCES) DIST_SOURCES = $(demo_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ demo_SOURCES = demo.c demo_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GTK_CFLAGS) demo_LDADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/equalizer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/equalizer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list demo$(EXEEXT): $(demo_OBJECTS) $(demo_DEPENDENCIES) $(EXTRA_demo_DEPENDENCIES) @rm -f demo$(EXEEXT) $(AM_V_CCLD)$(demo_LINK) $(demo_OBJECTS) $(demo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo-demo.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< demo-demo.o: demo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -MT demo-demo.o -MD -MP -MF $(DEPDIR)/demo-demo.Tpo -c -o demo-demo.o `test -f 'demo.c' || echo '$(srcdir)/'`demo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo-demo.Tpo $(DEPDIR)/demo-demo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo.c' object='demo-demo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -c -o demo-demo.o `test -f 'demo.c' || echo '$(srcdir)/'`demo.c demo-demo.obj: demo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -MT demo-demo.obj -MD -MP -MF $(DEPDIR)/demo-demo.Tpo -c -o demo-demo.obj `if test -f 'demo.c'; then $(CYGPATH_W) 'demo.c'; else $(CYGPATH_W) '$(srcdir)/demo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/demo-demo.Tpo $(DEPDIR)/demo-demo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='demo.c' object='demo-demo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(demo_CFLAGS) $(CFLAGS) -c -o demo-demo.obj `if test -f 'demo.c'; then $(CYGPATH_W) 'demo.c'; else $(CYGPATH_W) '$(srcdir)/demo.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/Makefile.am0000644000175000017500000000052711671175355017032 00000000000000if USE_JACK JACK_DIR=jack else JACK_DIR= endif if USE_CAIRO_GOBJECT CAIRO_DIR=cairo else CAIRO_DIR= endif SUBDIRS = audiofx equalizer $(JACK_DIR) level pulse \ rtp shapewipe spectrum v4l2 $(CAIRO_DIR) DIST_SUBDIRS = audiofx equalizer jack level pulse \ rtp shapewipe spectrum v4l2 cairo include $(top_srcdir)/common/parallel-subdirs.mak gst-plugins-good-0.10.31/tests/examples/v4l2/0000755000175000017500000000000011720565324015633 500000000000000gst-plugins-good-0.10.31/tests/examples/v4l2/camctrl.c0000644000175000017500000001463111671175355017357 00000000000000/* GStreamer * Copyright (C) 2010 Stefan Kost * * 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. */ /* demo for using gstcontroler with camera capture for e.g. bracketing * * gcc `pkg-config --cflags --libs gstreamer-0.10 gstreamer-controller-0.10` camctrl.c -o camctrl * * TODO: * - handle stream status and switch capture thread to SCHED_RR/FIFO * - the queue-size controls the controler offset * - right now we work with 1 queued picture and thus active settings for next * frame * - we want some feedback about how precisely a program can be realized * - we might want to adjust the framerate to handle hardware limmits * - we e.g. can't change resolution per frame right now */ #include #include #include static void event_loop (GstElement * bin) { GstBus *bus; GstMessage *message = NULL; bus = gst_element_get_bus (GST_ELEMENT (bin)); while (TRUE) { message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1); switch (message->type) { case GST_MESSAGE_EOS: gst_message_unref (message); return; case GST_MESSAGE_WARNING: case GST_MESSAGE_ERROR:{ GError *gerror; gchar *debug; gst_message_parse_error (message, &gerror, &debug); gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); gst_message_unref (message); g_error_free (gerror); g_free (debug); return; } default: gst_message_unref (message); break; } } } static void set_program (GstController * ctrl, GstStructure * prog) { const GstStructure *s; GstInterpolationControlSource *cs; GstClockTime ts, dur; GValue val = { 0, }; gint v; const GValue *frame; GHashTable *css; gint i, j; const gchar *name; css = g_hash_table_new (g_str_hash, g_str_equal); g_value_init (&val, G_TYPE_INT); ts = 0; dur = gst_util_uint64_scale_int (GST_SECOND, 1, 15); /* loop over each image in prog */ for (i = 0; i < gst_structure_n_fields (prog); i++) { GST_DEBUG ("ctrl on %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); frame = gst_structure_get_value (prog, gst_structure_nth_field_name (prog, i)); s = gst_value_get_structure (frame); for (j = 0; j < gst_structure_n_fields (s); j++) { name = gst_structure_nth_field_name (s, j); cs = g_hash_table_lookup (css, name); if (!cs) { cs = gst_interpolation_control_source_new (); gst_controller_set_control_source (ctrl, name, GST_CONTROL_SOURCE (cs)); gst_interpolation_control_source_set_interpolation_mode (cs, GST_INTERPOLATE_NONE); g_hash_table_insert (css, (gpointer) name, cs); g_object_unref (cs); } gst_structure_get_int (s, name, &v); g_value_set_int (&val, v); gst_interpolation_control_source_set (cs, ts, &val); GST_DEBUG (" %s = %d", name, v); } ts += dur; } g_value_unset (&val); g_hash_table_unref (css); } gint main (gint argc, gchar ** argv) { GstElement *bin; GstElement *src, *fmt, *enc, *sink; GstCaps *caps; GstController *ctrl; GstStructure *prog; /* init gstreamer */ gst_init (&argc, &argv); gst_controller_init (&argc, &argv); /* create a new bin to hold the elements */ bin = gst_pipeline_new ("camera"); /* create elements */ if (!(sink = gst_element_factory_make ("multifilesink", NULL))) { GST_WARNING ("Can't create element \"multifilesink\""); return -1; } g_object_set (sink, "location", "image%02d.jpg", NULL); if (!(enc = gst_element_factory_make ("jpegenc", NULL))) { GST_WARNING ("Can't create element \"jpegenc\""); return -1; } if (!(fmt = gst_element_factory_make ("capsfilter", NULL))) { GST_WARNING ("Can't create element \"capsfilter\""); return -1; } caps = gst_caps_from_string ("video/x-raw-yuv, width=640, height=480, framerate=(fraction)15/1"); g_object_set (fmt, "caps", caps, NULL); if (!(src = gst_element_factory_make ("v4l2src", NULL))) { GST_WARNING ("Can't create element \"v4l2src\""); return -1; } g_object_set (src, "queue-size", 1, NULL); /* add objects to the main bin */ gst_bin_add_many (GST_BIN (bin), src, fmt, enc, sink, NULL); /* link elements */ if (!gst_element_link_many (src, fmt, enc, sink, NULL)) { GST_WARNING ("Can't link elements"); return -1; } /* get the controller */ if (!(ctrl = gst_controller_new (G_OBJECT (src), "brightness", "contrast", "saturation", NULL))) { GST_WARNING ("can't control source element"); return -1; } /* programm a pattern of events */ #if 0 prog = gst_structure_from_string ("program" ", image00=(structure)\"image\\,contrast\\=0\\;\"" ", image01=(structure)\"image\\,contrast\\=79\\;\"" ", image02=(structure)\"image\\,contrast\\=255\\;\"" ", image03=(structure)\"image\\,contrast\\=15\\;\";", NULL); #endif #if 1 prog = gst_structure_from_string ("program" ", image00=(structure)\"image\\,brightness\\=255\\,contrast\\=0\\;\"" ", image01=(structure)\"image\\,brightness\\=127\\,contrast\\=79\\;\"" ", image02=(structure)\"image\\,brightness\\=64\\,contrast\\=255\\;\"" ", image03=(structure)\"image\\,brightness\\=0\\,contrast\\=15\\;\";", NULL); #endif set_program (ctrl, prog); g_object_set (src, "num-buffers", gst_structure_n_fields (prog), NULL); /* prepare playback */ gst_element_set_state (bin, GST_STATE_PAUSED); /* play and wait */ gst_element_set_state (bin, GST_STATE_PLAYING); /* mainloop and wait for eos */ event_loop (bin); /* stop and cleanup */ gst_element_set_state (bin, GST_STATE_NULL); gst_object_unref (GST_OBJECT (bin)); return 0; } gst-plugins-good-0.10.31/tests/examples/v4l2/probe.c0000644000175000017500000000514211671175355017036 00000000000000/* GStreamer * Copyright (C) 2009 Filippo Argiolas * * 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 #include #include int main (int argc, char *argv[]) { GstElement *src, *sink; GstElement *bin; GstPropertyProbe *probe = NULL; const GParamSpec *pspec = NULL; GValueArray *array = NULL; gint i, ret; GValue *value; const gchar *device; gchar *name; guint flags; gst_init (&argc, &argv); bin = gst_pipeline_new ("pipeline"); g_assert (bin); src = gst_element_factory_make ("v4l2src", "v4l2_source"); g_assert (src); sink = gst_element_factory_make ("fakesink", "fake_sink"); g_assert (sink); /* add objects to the main pipeline */ gst_bin_add_many (GST_BIN (bin), src, sink, NULL); /* link the elements */ gst_element_link_many (src, sink, NULL); /* probe devices */ g_print ("Probing devices with propertyprobe...\n"); probe = GST_PROPERTY_PROBE (src); pspec = gst_property_probe_get_property (probe, "device"); array = gst_property_probe_probe_and_get_values (probe, pspec); if (!array) { g_print ("No device found\n"); exit (1); } for (i = 0; i < array->n_values; i++) { value = g_value_array_get_nth (array, i); device = g_value_get_string (value); g_print ("Device: %s\n", device); g_object_set_property (G_OBJECT (src), "device", value); gst_element_set_state (bin, GST_STATE_READY); ret = gst_element_get_state (bin, NULL, NULL, 10 * GST_SECOND); if (ret != GST_STATE_CHANGE_SUCCESS) { g_print ("Couldn't set STATE_READY\n"); continue; } g_object_get (G_OBJECT (src), "device-name", &name, NULL); g_print ("Name: %s\n", name); g_free (name); g_object_get (G_OBJECT (src), "flags", &flags, NULL); g_print ("Flags: 0x%08X\n", flags); gst_element_set_state (bin, GST_STATE_NULL); g_print ("\n"); } exit (0); } gst-plugins-good-0.10.31/tests/examples/v4l2/Makefile.am0000644000175000017500000000061411671175355017616 00000000000000noinst_PROGRAMS = probe camctrl camctrl_SOURCES = camctrl.c camctrl_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) camctrl_LDADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) probe_SOURCES = probe.c probe_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) probe_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) gst-plugins-good-0.10.31/tests/examples/v4l2/Makefile.in0000644000175000017500000006576711720560244017641 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = probe$(EXEEXT) camctrl$(EXEEXT) subdir = tests/examples/v4l2 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_camctrl_OBJECTS = camctrl-camctrl.$(OBJEXT) camctrl_OBJECTS = $(am_camctrl_OBJECTS) am__DEPENDENCIES_1 = camctrl_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent camctrl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(camctrl_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_probe_OBJECTS = probe-probe.$(OBJEXT) probe_OBJECTS = $(am_probe_OBJECTS) probe_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) probe_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(probe_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(camctrl_SOURCES) $(probe_SOURCES) DIST_SOURCES = $(camctrl_SOURCES) $(probe_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ camctrl_SOURCES = camctrl.c camctrl_CFLAGS = $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) camctrl_LDADD = $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) probe_SOURCES = probe.c probe_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) probe_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/v4l2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/v4l2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list camctrl$(EXEEXT): $(camctrl_OBJECTS) $(camctrl_DEPENDENCIES) $(EXTRA_camctrl_DEPENDENCIES) @rm -f camctrl$(EXEEXT) $(AM_V_CCLD)$(camctrl_LINK) $(camctrl_OBJECTS) $(camctrl_LDADD) $(LIBS) probe$(EXEEXT): $(probe_OBJECTS) $(probe_DEPENDENCIES) $(EXTRA_probe_DEPENDENCIES) @rm -f probe$(EXEEXT) $(AM_V_CCLD)$(probe_LINK) $(probe_OBJECTS) $(probe_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camctrl-camctrl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/probe-probe.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< camctrl-camctrl.o: camctrl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -MT camctrl-camctrl.o -MD -MP -MF $(DEPDIR)/camctrl-camctrl.Tpo -c -o camctrl-camctrl.o `test -f 'camctrl.c' || echo '$(srcdir)/'`camctrl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/camctrl-camctrl.Tpo $(DEPDIR)/camctrl-camctrl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='camctrl.c' object='camctrl-camctrl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -c -o camctrl-camctrl.o `test -f 'camctrl.c' || echo '$(srcdir)/'`camctrl.c camctrl-camctrl.obj: camctrl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -MT camctrl-camctrl.obj -MD -MP -MF $(DEPDIR)/camctrl-camctrl.Tpo -c -o camctrl-camctrl.obj `if test -f 'camctrl.c'; then $(CYGPATH_W) 'camctrl.c'; else $(CYGPATH_W) '$(srcdir)/camctrl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/camctrl-camctrl.Tpo $(DEPDIR)/camctrl-camctrl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='camctrl.c' object='camctrl-camctrl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(camctrl_CFLAGS) $(CFLAGS) -c -o camctrl-camctrl.obj `if test -f 'camctrl.c'; then $(CYGPATH_W) 'camctrl.c'; else $(CYGPATH_W) '$(srcdir)/camctrl.c'; fi` probe-probe.o: probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -MT probe-probe.o -MD -MP -MF $(DEPDIR)/probe-probe.Tpo -c -o probe-probe.o `test -f 'probe.c' || echo '$(srcdir)/'`probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/probe-probe.Tpo $(DEPDIR)/probe-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='probe.c' object='probe-probe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -c -o probe-probe.o `test -f 'probe.c' || echo '$(srcdir)/'`probe.c probe-probe.obj: probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -MT probe-probe.obj -MD -MP -MF $(DEPDIR)/probe-probe.Tpo -c -o probe-probe.obj `if test -f 'probe.c'; then $(CYGPATH_W) 'probe.c'; else $(CYGPATH_W) '$(srcdir)/probe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/probe-probe.Tpo $(DEPDIR)/probe-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='probe.c' object='probe-probe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(probe_CFLAGS) $(CFLAGS) -c -o probe-probe.obj `if test -f 'probe.c'; then $(CYGPATH_W) 'probe.c'; else $(CYGPATH_W) '$(srcdir)/probe.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/level/0000755000175000017500000000000011720565324016153 500000000000000gst-plugins-good-0.10.31/tests/examples/level/level-example.c0000644000175000017500000001053611671175355021012 00000000000000/* GStreamer * Copyright (C) 2000,2001,2002,2003,2005 * Thomas Vander Stichele * * 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 #include #include static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) { if (message->type == GST_MESSAGE_ELEMENT) { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); if (strcmp (name, "level") == 0) { gint channels; GstClockTime endtime; gdouble rms_dB, peak_dB, decay_dB; gdouble rms; const GValue *list; const GValue *value; gint i; if (!gst_structure_get_clock_time (s, "endtime", &endtime)) g_warning ("Could not parse endtime"); /* we can get the number of channels as the length of any of the value * lists */ list = gst_structure_get_value (s, "rms"); channels = gst_value_list_get_size (list); g_print ("endtime: %" GST_TIME_FORMAT ", channels: %d\n", GST_TIME_ARGS (endtime), channels); for (i = 0; i < channels; ++i) { g_print ("channel %d\n", i); list = gst_structure_get_value (s, "rms"); value = gst_value_list_get_value (list, i); rms_dB = g_value_get_double (value); list = gst_structure_get_value (s, "peak"); value = gst_value_list_get_value (list, i); peak_dB = g_value_get_double (value); list = gst_structure_get_value (s, "decay"); value = gst_value_list_get_value (list, i); decay_dB = g_value_get_double (value); g_print (" RMS: %f dB, peak: %f dB, decay: %f dB\n", rms_dB, peak_dB, decay_dB); /* converting from dB to normal gives us a value between 0.0 and 1.0 */ rms = pow (10, rms_dB / 20); g_print (" normalized rms value: %f\n", rms); } } } /* we handled the message we want, and ignored the ones we didn't want. * so the core can unref the message for us */ return TRUE; } int main (int argc, char *argv[]) { GstElement *audiotestsrc, *audioconvert, *level, *fakesink; GstElement *pipeline; GstCaps *caps; GstBus *bus; guint watch_id; GMainLoop *loop; gst_init (&argc, &argv); caps = gst_caps_from_string ("audio/x-raw-int,channels=2"); pipeline = gst_pipeline_new (NULL); g_assert (pipeline); audiotestsrc = gst_element_factory_make ("audiotestsrc", NULL); g_assert (audiotestsrc); audioconvert = gst_element_factory_make ("audioconvert", NULL); g_assert (audioconvert); level = gst_element_factory_make ("level", NULL); g_assert (level); fakesink = gst_element_factory_make ("fakesink", NULL); g_assert (fakesink); gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, audioconvert, level, fakesink, NULL); if (!gst_element_link (audiotestsrc, audioconvert)) g_error ("Failed to link audiotestsrc and audioconvert"); if (!gst_element_link_filtered (audioconvert, level, caps)) g_error ("Failed to link audioconvert and level"); if (!gst_element_link (level, fakesink)) g_error ("Failed to link level and fakesink"); /* make sure we'll get messages */ g_object_set (G_OBJECT (level), "message", TRUE, NULL); /* run synced and not as fast as we can */ g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL); bus = gst_element_get_bus (pipeline); watch_id = gst_bus_add_watch (bus, message_handler, NULL); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* we need to run a GLib main loop to get the messages */ loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_source_remove (watch_id); g_main_loop_unref (loop); return 0; } gst-plugins-good-0.10.31/tests/examples/level/Makefile.am0000644000175000017500000000016011671175355020132 00000000000000noinst_PROGRAMS = level-example level_example_CFLAGS = $(GST_CFLAGS) level_example_LDADD = $(GST_LIBS) $(LIBM) gst-plugins-good-0.10.31/tests/examples/level/Makefile.in0000644000175000017500000006153211720560243020142 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = level-example$(EXEEXT) subdir = tests/examples/level DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) level_example_SOURCES = level-example.c level_example_OBJECTS = level_example-level-example.$(OBJEXT) am__DEPENDENCIES_1 = level_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent level_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(level_example_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = level-example.c DIST_SOURCES = level-example.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ level_example_CFLAGS = $(GST_CFLAGS) level_example_LDADD = $(GST_LIBS) $(LIBM) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/level/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/level/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list level-example$(EXEEXT): $(level_example_OBJECTS) $(level_example_DEPENDENCIES) $(EXTRA_level_example_DEPENDENCIES) @rm -f level-example$(EXEEXT) $(AM_V_CCLD)$(level_example_LINK) $(level_example_OBJECTS) $(level_example_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/level_example-level-example.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< level_example-level-example.o: level-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -MT level_example-level-example.o -MD -MP -MF $(DEPDIR)/level_example-level-example.Tpo -c -o level_example-level-example.o `test -f 'level-example.c' || echo '$(srcdir)/'`level-example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level_example-level-example.Tpo $(DEPDIR)/level_example-level-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='level-example.c' object='level_example-level-example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -c -o level_example-level-example.o `test -f 'level-example.c' || echo '$(srcdir)/'`level-example.c level_example-level-example.obj: level-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -MT level_example-level-example.obj -MD -MP -MF $(DEPDIR)/level_example-level-example.Tpo -c -o level_example-level-example.obj `if test -f 'level-example.c'; then $(CYGPATH_W) 'level-example.c'; else $(CYGPATH_W) '$(srcdir)/level-example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/level_example-level-example.Tpo $(DEPDIR)/level_example-level-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='level-example.c' object='level_example-level-example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(level_example_CFLAGS) $(CFLAGS) -c -o level_example-level-example.obj `if test -f 'level-example.c'; then $(CYGPATH_W) 'level-example.c'; else $(CYGPATH_W) '$(srcdir)/level-example.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/jack/0000755000175000017500000000000011720565324015754 500000000000000gst-plugins-good-0.10.31/tests/examples/jack/jack_client.c0000644000175000017500000000372311671175355020321 00000000000000/* This app demonstrates the creation and use of a jack client in conjunction * with the jack plugins. This way, an application can control the jack client * directly. */ #include #include #include static gboolean quit_cb (gpointer data) { gtk_main_quit (); return FALSE; } int main (int argc, char **argv) { jack_client_t *src_client, *sink_client; jack_status_t status; GstElement *pipeline, *src, *sink; GstStateChangeReturn ret; gst_init (&argc, &argv); /* create jack clients */ src_client = jack_client_open ("src_client", JackNoStartServer, &status); if (src_client == NULL) { if (status & JackServerFailed) g_print ("JACK server not running\n"); else g_print ("jack_client_open() failed, status = 0x%2.0x\n", status); return 1; } sink_client = jack_client_open ("sink_client", JackNoStartServer, &status); if (sink_client == NULL) { if (status & JackServerFailed) g_print ("JACK server not running\n"); else g_print ("jack_client_open() failed, status = 0x%2.0x\n", status); return 1; } /* create gst elements */ pipeline = gst_pipeline_new ("my_pipeline"); src = gst_element_factory_make ("jackaudiosrc", NULL); sink = gst_element_factory_make ("jackaudiosink", NULL); g_object_set (src, "client", src_client, NULL); g_object_set (sink, "client", sink_client, NULL); gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL); /* link everything together */ if (!gst_element_link (src, sink)) { g_print ("Failed to link elements!\n"); return 1; } /* run */ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_print ("Failed to start up pipeline!\n"); return 1; } /* quit after 5 seconds */ g_timeout_add (5000, (GSourceFunc) quit_cb, NULL); gtk_main (); /* clean up */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; } gst-plugins-good-0.10.31/tests/examples/jack/Makefile.am0000644000175000017500000000040211671175355017732 00000000000000if HAVE_GTK GTK_EXAMPLES=jack_client else GTK_EXAMPLES= endif noinst_PROGRAMS = $(GTK_EXAMPLES) jack_client_SOURCES = jack_client.c jack_client_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) $(JACK_CFLAGS) jack_client_LDFLAGS = $(GST_LIBS) $(GTK_LIBS) $(JACK_LIBS) gst-plugins-good-0.10.31/tests/examples/jack/Makefile.in0000644000175000017500000006157111720560242017745 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) subdir = tests/examples/jack DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTK_TRUE@am__EXEEXT_1 = jack_client$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_jack_client_OBJECTS = jack_client-jack_client.$(OBJEXT) jack_client_OBJECTS = $(am_jack_client_OBJECTS) jack_client_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent jack_client_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(jack_client_CFLAGS) \ $(CFLAGS) $(jack_client_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(jack_client_SOURCES) DIST_SOURCES = $(jack_client_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_GTK_FALSE@GTK_EXAMPLES = @HAVE_GTK_TRUE@GTK_EXAMPLES = jack_client jack_client_SOURCES = jack_client.c jack_client_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS) $(JACK_CFLAGS) jack_client_LDFLAGS = $(GST_LIBS) $(GTK_LIBS) $(JACK_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/jack/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/jack/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list jack_client$(EXEEXT): $(jack_client_OBJECTS) $(jack_client_DEPENDENCIES) $(EXTRA_jack_client_DEPENDENCIES) @rm -f jack_client$(EXEEXT) $(AM_V_CCLD)$(jack_client_LINK) $(jack_client_OBJECTS) $(jack_client_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jack_client-jack_client.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< jack_client-jack_client.o: jack_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -MT jack_client-jack_client.o -MD -MP -MF $(DEPDIR)/jack_client-jack_client.Tpo -c -o jack_client-jack_client.o `test -f 'jack_client.c' || echo '$(srcdir)/'`jack_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jack_client-jack_client.Tpo $(DEPDIR)/jack_client-jack_client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jack_client.c' object='jack_client-jack_client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -c -o jack_client-jack_client.o `test -f 'jack_client.c' || echo '$(srcdir)/'`jack_client.c jack_client-jack_client.obj: jack_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -MT jack_client-jack_client.obj -MD -MP -MF $(DEPDIR)/jack_client-jack_client.Tpo -c -o jack_client-jack_client.obj `if test -f 'jack_client.c'; then $(CYGPATH_W) 'jack_client.c'; else $(CYGPATH_W) '$(srcdir)/jack_client.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jack_client-jack_client.Tpo $(DEPDIR)/jack_client-jack_client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jack_client.c' object='jack_client-jack_client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(jack_client_CFLAGS) $(CFLAGS) -c -o jack_client-jack_client.obj `if test -f 'jack_client.c'; then $(CYGPATH_W) 'jack_client.c'; else $(CYGPATH_W) '$(srcdir)/jack_client.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/pulse/0000755000175000017500000000000011720565324016174 500000000000000gst-plugins-good-0.10.31/tests/examples/pulse/Makefile.am0000644000175000017500000000027611671175355020163 00000000000000noinst_PROGRAMS = pulse pulse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) pulse_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) gst-plugins-good-0.10.31/tests/examples/pulse/pulse.c0000644000175000017500000000401711671175355017420 00000000000000/* GStreamer * Copyright (C) 2010 Wim Taymans * * 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 #include static void test_element (const gchar * name) { GstElement *element; GstPropertyProbe *probe = NULL; const GParamSpec *pspec = NULL; GValueArray *array = NULL; guint i; g_print ("testing element %s\n", name); element = gst_element_factory_make (name, NULL); g_assert (element); gst_element_set_state (element, GST_STATE_READY); probe = GST_PROPERTY_PROBE (element); pspec = gst_property_probe_get_property (probe, "device"); array = gst_property_probe_probe_and_get_values (probe, pspec); g_assert (array); for (i = 0; i < array->n_values; i++) { GValue *device = NULL; gchar *name = NULL; device = g_value_array_get_nth (array, i); g_object_set_property (G_OBJECT (element), "device", device); g_object_get (G_OBJECT (element), "device-name", &name, NULL); g_print ("device: %s (%s)\n", g_value_get_string (device), GST_STR_NULL (name)); } g_value_array_free (array); gst_element_set_state (element, GST_STATE_NULL); gst_object_unref (GST_OBJECT (element)); } int main (int argc, char *argv[]) { gst_init (&argc, &argv); test_element ("pulsesink"); test_element ("pulsesrc"); return 0; } gst-plugins-good-0.10.31/tests/examples/pulse/Makefile.in0000644000175000017500000006061511720560243020164 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = pulse$(EXEEXT) subdir = tests/examples/pulse DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) pulse_SOURCES = pulse.c pulse_OBJECTS = pulse-pulse.$(OBJEXT) am__DEPENDENCIES_1 = pulse_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent pulse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pulse_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = pulse.c DIST_SOURCES = pulse.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pulse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) pulse_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-0.10 $(GST_BASE_LIBS) $(GST_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/pulse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/pulse/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list pulse$(EXEEXT): $(pulse_OBJECTS) $(pulse_DEPENDENCIES) $(EXTRA_pulse_DEPENDENCIES) @rm -f pulse$(EXEEXT) $(AM_V_CCLD)$(pulse_LINK) $(pulse_OBJECTS) $(pulse_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pulse-pulse.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< pulse-pulse.o: pulse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -MT pulse-pulse.o -MD -MP -MF $(DEPDIR)/pulse-pulse.Tpo -c -o pulse-pulse.o `test -f 'pulse.c' || echo '$(srcdir)/'`pulse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pulse-pulse.Tpo $(DEPDIR)/pulse-pulse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse.c' object='pulse-pulse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -c -o pulse-pulse.o `test -f 'pulse.c' || echo '$(srcdir)/'`pulse.c pulse-pulse.obj: pulse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -MT pulse-pulse.obj -MD -MP -MF $(DEPDIR)/pulse-pulse.Tpo -c -o pulse-pulse.obj `if test -f 'pulse.c'; then $(CYGPATH_W) 'pulse.c'; else $(CYGPATH_W) '$(srcdir)/pulse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pulse-pulse.Tpo $(DEPDIR)/pulse-pulse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse.c' object='pulse-pulse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulse_CFLAGS) $(CFLAGS) -c -o pulse-pulse.obj `if test -f 'pulse.c'; then $(CYGPATH_W) 'pulse.c'; else $(CYGPATH_W) '$(srcdir)/pulse.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/cairo/0000755000175000017500000000000011720565324016141 500000000000000gst-plugins-good-0.10.31/tests/examples/cairo/Makefile.am0000644000175000017500000000043211677341661020123 00000000000000if USE_CAIRO_GOBJECT noinst_PROGRAMS = cairo_overlay endif cairo_overlay_SOURCES = cairo_overlay.c cairo_overlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(CAIRO_CFLAGS) cairo_overlay_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(CAIRO_LIBS) gst-plugins-good-0.10.31/tests/examples/cairo/Makefile.in0000644000175000017500000006207011720560242020125 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @USE_CAIRO_GOBJECT_TRUE@noinst_PROGRAMS = cairo_overlay$(EXEEXT) subdir = tests/examples/cairo DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_cairo_overlay_OBJECTS = cairo_overlay-cairo_overlay.$(OBJEXT) cairo_overlay_OBJECTS = $(am_cairo_overlay_OBJECTS) am__DEPENDENCIES_1 = cairo_overlay_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent cairo_overlay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(cairo_overlay_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(cairo_overlay_SOURCES) DIST_SOURCES = $(cairo_overlay_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ cairo_overlay_SOURCES = cairo_overlay.c cairo_overlay_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(CAIRO_CFLAGS) cairo_overlay_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_LIBS) $(CAIRO_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/cairo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/cairo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list cairo_overlay$(EXEEXT): $(cairo_overlay_OBJECTS) $(cairo_overlay_DEPENDENCIES) $(EXTRA_cairo_overlay_DEPENDENCIES) @rm -f cairo_overlay$(EXEEXT) $(AM_V_CCLD)$(cairo_overlay_LINK) $(cairo_overlay_OBJECTS) $(cairo_overlay_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_overlay-cairo_overlay.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< cairo_overlay-cairo_overlay.o: cairo_overlay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -MT cairo_overlay-cairo_overlay.o -MD -MP -MF $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo -c -o cairo_overlay-cairo_overlay.o `test -f 'cairo_overlay.c' || echo '$(srcdir)/'`cairo_overlay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo $(DEPDIR)/cairo_overlay-cairo_overlay.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo_overlay.c' object='cairo_overlay-cairo_overlay.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -c -o cairo_overlay-cairo_overlay.o `test -f 'cairo_overlay.c' || echo '$(srcdir)/'`cairo_overlay.c cairo_overlay-cairo_overlay.obj: cairo_overlay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -MT cairo_overlay-cairo_overlay.obj -MD -MP -MF $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo -c -o cairo_overlay-cairo_overlay.obj `if test -f 'cairo_overlay.c'; then $(CYGPATH_W) 'cairo_overlay.c'; else $(CYGPATH_W) '$(srcdir)/cairo_overlay.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_overlay-cairo_overlay.Tpo $(DEPDIR)/cairo_overlay-cairo_overlay.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo_overlay.c' object='cairo_overlay-cairo_overlay.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_overlay_CFLAGS) $(CFLAGS) -c -o cairo_overlay-cairo_overlay.obj `if test -f 'cairo_overlay.c'; then $(CYGPATH_W) 'cairo_overlay.c'; else $(CYGPATH_W) '$(srcdir)/cairo_overlay.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/cairo/cairo_overlay.c0000644000175000017500000001154711671175355021101 00000000000000/* GStreamer * Copyright (C) 2011 Jon Nordby * * 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. */ /* * Example showing usage of the cairooverlay element */ #include #include #include #include #include static gboolean on_message (GstBus * bus, GstMessage * message, gpointer user_data) { GMainLoop *loop = (GMainLoop *) user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR:{ GError *err = NULL; gchar *debug; gst_message_parse_error (message, &err, &debug); g_critical ("Got ERROR: %s (%s)", err->message, GST_STR_NULL (debug)); g_main_loop_quit (loop); break; } case GST_MESSAGE_WARNING:{ GError *err = NULL; gchar *debug; gst_message_parse_warning (message, &err, &debug); g_warning ("Got WARNING: %s (%s)", err->message, GST_STR_NULL (debug)); g_main_loop_quit (loop); break; } case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; default: break; } return TRUE; } /* Datastructure to share the state we are interested in between * prepare and render function. */ typedef struct { gboolean valid; int width; int height; } CairoOverlayState; /* Store the information from the caps that we are interested in. */ static void prepare_overlay (GstElement * overlay, GstCaps * caps, gpointer user_data) { CairoOverlayState *state = (CairoOverlayState *) user_data; gst_video_format_parse_caps (caps, NULL, &state->width, &state->height); state->valid = TRUE; } /* Draw the overlay. * This function draws a cute "beating" heart. */ static void draw_overlay (GstElement * overlay, cairo_t * cr, guint64 timestamp, guint64 duration, gpointer user_data) { CairoOverlayState *s = (CairoOverlayState *) user_data; double scale; if (!s->valid) return; scale = 2 * (((timestamp / (int) 1e7) % 70) + 30) / 100.0; cairo_translate (cr, s->width / 2, (s->height / 2) - 30); cairo_scale (cr, scale, scale); cairo_move_to (cr, 0, 0); cairo_curve_to (cr, 0, -30, -50, -30, -50, 0); cairo_curve_to (cr, -50, 30, 0, 35, 0, 60); cairo_curve_to (cr, 0, 35, 50, 30, 50, 0); cairo_curve_to (cr, 50, -30, 0, -30, 0, 0); cairo_set_source_rgba (cr, 0.9, 0.0, 0.1, 0.7); cairo_fill (cr); } static GstElement * setup_gst_pipeline (CairoOverlayState * overlay_state) { GstElement *pipeline; GstElement *cairo_overlay; GstElement *source, *adaptor1, *adaptor2, *sink; pipeline = gst_pipeline_new ("cairo-overlay-example"); /* Adaptors needed because cairooverlay only supports ARGB data */ source = gst_element_factory_make ("videotestsrc", "source"); adaptor1 = gst_element_factory_make ("ffmpegcolorspace", "adaptor1"); cairo_overlay = gst_element_factory_make ("cairooverlay", "overlay"); adaptor2 = gst_element_factory_make ("ffmpegcolorspace", "adaptor2"); sink = gst_element_factory_make ("autovideosink", "sink"); /* If failing, the element could not be created */ g_assert (cairo_overlay); /* Hook up the neccesary signals for cairooverlay */ g_signal_connect (cairo_overlay, "draw", G_CALLBACK (draw_overlay), overlay_state); g_signal_connect (cairo_overlay, "caps-changed", G_CALLBACK (prepare_overlay), overlay_state); gst_bin_add_many (GST_BIN (pipeline), source, adaptor1, cairo_overlay, adaptor2, sink, NULL); if (!gst_element_link_many (source, adaptor1, cairo_overlay, adaptor2, sink, NULL)) { g_warning ("Failed to link elements!"); } return pipeline; } int main (int argc, char **argv) { GMainLoop *loop; GstElement *pipeline; GstBus *bus; CairoOverlayState overlay_state = { FALSE, 0, 0 }; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); pipeline = setup_gst_pipeline (&overlay_state); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; } gst-plugins-good-0.10.31/tests/examples/Makefile.in0000644000175000017500000006260611720560242017035 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # include this at the end of $MODULE/ext/Makefile.am to force make to # build subdirectories in parallel when make -jN is used. We will end up # descending into all subdirectories a second time, but only after the first # (parallel) run has finished, so it should go right through the second time. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/common/parallel-subdirs.mak subdir = tests/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @USE_JACK_FALSE@JACK_DIR = @USE_JACK_TRUE@JACK_DIR = jack @USE_CAIRO_GOBJECT_FALSE@CAIRO_DIR = @USE_CAIRO_GOBJECT_TRUE@CAIRO_DIR = cairo SUBDIRS = audiofx equalizer $(JACK_DIR) level pulse \ rtp shapewipe spectrum v4l2 $(CAIRO_DIR) DIST_SUBDIRS = audiofx equalizer jack level pulse \ rtp shapewipe spectrum v4l2 cairo all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/parallel-subdirs.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: independent-subdirs $(SUBDIRS) independent-subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ all-recursive: independent-subdirs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/rtp/0000755000175000017500000000000011720565324015651 500000000000000gst-plugins-good-0.10.31/tests/examples/rtp/server-alsasrc-PCMA.c0000644000175000017500000001732111671175355021421 00000000000000/* GStreamer * Copyright (C) 2009 Wim Taymans * * 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 #include #include /* * A simple RTP server * sends the output of alsasrc as alaw encoded RTP on port 5002, RTCP is sent on * port 5003. The destination is 127.0.0.1. * the receiver RTCP reports are received on port 5007 * * .-------. .-------. .-------. .----------. .-------. * |alsasrc| |alawenc| |pcmapay| | rtpbin | |udpsink| RTP * | src->sink src->sink src->send_rtp send_rtp->sink | port=5002 * '-------' '-------' '-------' | | '-------' * | | * | | .-------. * | | |udpsink| RTCP * | send_rtcp->sink | port=5003 * .-------. | | '-------' sync=false * RTCP |udpsrc | | | async=false * port=5007 | src->recv_rtcp | * '-------' '----------' */ /* change this to send the RTP data and RTCP to another host */ #define DEST_HOST "127.0.0.1" /* #define AUDIO_SRC "alsasrc" */ #define AUDIO_SRC "audiotestsrc" /* the encoder and payloader elements */ #define AUDIO_ENC "alawenc" #define AUDIO_PAY "rtppcmapay" /* print the stats of a source */ static void print_source_stats (GObject * source) { GstStructure *stats; gchar *str; /* get the source stats */ g_object_get (source, "stats", &stats, NULL); /* simply dump the stats structure */ str = gst_structure_to_string (stats); g_print ("source stats: %s\n", str); gst_structure_free (stats); g_free (str); } /* this function is called every second and dumps the RTP manager stats */ static gboolean print_stats (GstElement * rtpbin) { GObject *session; GValueArray *arr; GValue *val; guint i; g_print ("***********************************\n"); /* get session 0 */ g_signal_emit_by_name (rtpbin, "get-internal-session", 0, &session); /* print all the sources in the session, this includes the internal source */ g_object_get (session, "sources", &arr, NULL); for (i = 0; i < arr->n_values; i++) { GObject *source; val = g_value_array_get_nth (arr, i); source = g_value_get_object (val); print_source_stats (source); } g_value_array_free (arr); g_object_unref (session); return TRUE; } /* build a pipeline equivalent to: * * gst-launch -v gstrtpbin name=rtpbin \ * $AUDIO_SRC ! audioconvert ! audioresample ! $AUDIO_ENC ! $AUDIO_PAY ! rtpbin.send_rtp_sink_0 \ * rtpbin.send_rtp_src_0 ! udpsink port=5002 host=$DEST \ * rtpbin.send_rtcp_src_0 ! udpsink port=5003 host=$DEST sync=false async=false \ * udpsrc port=5007 ! rtpbin.recv_rtcp_sink_0 */ int main (int argc, char *argv[]) { GstElement *audiosrc, *audioconv, *audiores, *audioenc, *audiopay; GstElement *rtpbin, *rtpsink, *rtcpsink, *rtcpsrc; GstElement *pipeline; GMainLoop *loop; GstPad *srcpad, *sinkpad; /* always init first */ gst_init (&argc, &argv); /* the pipeline to hold everything */ pipeline = gst_pipeline_new (NULL); g_assert (pipeline); /* the audio capture and format conversion */ audiosrc = gst_element_factory_make (AUDIO_SRC, "audiosrc"); g_assert (audiosrc); audioconv = gst_element_factory_make ("audioconvert", "audioconv"); g_assert (audioconv); audiores = gst_element_factory_make ("audioresample", "audiores"); g_assert (audiores); /* the encoding and payloading */ audioenc = gst_element_factory_make (AUDIO_ENC, "audioenc"); g_assert (audioenc); audiopay = gst_element_factory_make (AUDIO_PAY, "audiopay"); g_assert (audiopay); /* add capture and payloading to the pipeline and link */ gst_bin_add_many (GST_BIN (pipeline), audiosrc, audioconv, audiores, audioenc, audiopay, NULL); if (!gst_element_link_many (audiosrc, audioconv, audiores, audioenc, audiopay, NULL)) { g_error ("Failed to link audiosrc, audioconv, audioresample, " "audio encoder and audio payloader"); } /* the rtpbin element */ rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); g_assert (rtpbin); gst_bin_add (GST_BIN (pipeline), rtpbin); /* the udp sinks and source we will use for RTP and RTCP */ rtpsink = gst_element_factory_make ("udpsink", "rtpsink"); g_assert (rtpsink); g_object_set (rtpsink, "port", 5002, "host", DEST_HOST, NULL); rtcpsink = gst_element_factory_make ("udpsink", "rtcpsink"); g_assert (rtcpsink); g_object_set (rtcpsink, "port", 5003, "host", DEST_HOST, NULL); /* no need for synchronisation or preroll on the RTCP sink */ g_object_set (rtcpsink, "async", FALSE, "sync", FALSE, NULL); rtcpsrc = gst_element_factory_make ("udpsrc", "rtcpsrc"); g_assert (rtcpsrc); g_object_set (rtcpsrc, "port", 5007, NULL); gst_bin_add_many (GST_BIN (pipeline), rtpsink, rtcpsink, rtcpsrc, NULL); /* now link all to the rtpbin, start by getting an RTP sinkpad for session 0 */ sinkpad = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0"); srcpad = gst_element_get_static_pad (audiopay, "src"); if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) g_error ("Failed to link audio payloader to rtpbin"); gst_object_unref (srcpad); /* get the RTP srcpad that was created when we requested the sinkpad above and * link it to the rtpsink sinkpad*/ srcpad = gst_element_get_static_pad (rtpbin, "send_rtp_src_0"); sinkpad = gst_element_get_static_pad (rtpsink, "sink"); if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) g_error ("Failed to link rtpbin to rtpsink"); gst_object_unref (srcpad); gst_object_unref (sinkpad); /* get an RTCP srcpad for sending RTCP to the receiver */ srcpad = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0"); sinkpad = gst_element_get_static_pad (rtcpsink, "sink"); if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) g_error ("Failed to link rtpbin to rtcpsink"); gst_object_unref (sinkpad); /* we also want to receive RTCP, request an RTCP sinkpad for session 0 and * link it to the srcpad of the udpsrc for RTCP */ srcpad = gst_element_get_static_pad (rtcpsrc, "src"); sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtcp_sink_0"); if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) g_error ("Failed to link rtcpsrc to rtpbin"); gst_object_unref (srcpad); /* set the pipeline to playing */ g_print ("starting sender pipeline\n"); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* print stats every second */ g_timeout_add (1000, (GSourceFunc) print_stats, rtpbin); /* we need to run a GLib main loop to get the messages */ loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_print ("stopping sender pipeline\n"); gst_element_set_state (pipeline, GST_STATE_NULL); return 0; } gst-plugins-good-0.10.31/tests/examples/rtp/server-v4l2-H263p-alsasrc-AMR.sh0000755000175000017500000000227611671175355023103 00000000000000#!/bin/sh # # A simple RTP server # # change these to change the server sync. This causes the server to send the # packets largly out-of-sync, the client should use the RTCP SR packets to # restore proper lip-sync between the streams. AOFFSET=0 VOFFSET=0 VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1" #DEST=192.168.1.126 DEST=localhost gst-launch -v gstrtpbin name=rtpbin \ v4l2src ! videorate ! ffmpegcolorspace ! $VCAPS ! ffenc_h263p ! rtph263ppay ! rtpbin.send_rtp_sink_0 \ rtpbin.send_rtp_src_0 ! queue ! udpsink host=$DEST port=5000 ts-offset=$AOFFSET \ rtpbin.send_rtcp_src_0 ! udpsink host=$DEST port=5001 sync=false async=false \ udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ autoaudiosrc ! audioconvert ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1 \ rtpbin.send_rtp_src_1 ! queue ! udpsink host=$DEST port=5002 ts-offset=$VOFFSET \ rtpbin.send_rtcp_src_1 ! udpsink host=$DEST port=5003 sync=false async=false \ udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1 gst-plugins-good-0.10.31/tests/examples/rtp/server-v4l2-H264-alsasrc-PCMA.sh0000755000175000017500000001003611671175355023016 00000000000000#!/bin/sh # # A simple RTP server # sends the output of v4l2src as h264 encoded RTP on port 5000, RTCP is sent on # port 5001. The destination is 127.0.0.1. # the video receiver RTCP reports are received on port 5005 # sends the output of autoaudiosrc as alaw encoded RTP on port 5002, RTCP is sent on # port 5003. The destination is 127.0.0.1. # the receiver RTCP reports are received on port 5007 # # .-------. .-------. .-------. .----------. .-------. # |v4lssrc| |h264enc| |h264pay| | rtpbin | |udpsink| RTP # | src->sink src->sink src->send_rtp send_rtp->sink | port=5000 # '-------' '-------' '-------' | | '-------' # | | # | | .-------. # | | |udpsink| RTCP # | send_rtcp->sink | port=5001 # .-------. | | '-------' sync=false # RTCP |udpsrc | | | async=false # port=5005 | src->recv_rtcp | # '-------' | | # | | # .--------. .-------. .-------. | | .-------. # |audiosrc| |alawenc| |pcmapay| | rtpbin | |udpsink| RTP # | src->sink src->sink src->send_rtp send_rtp->sink | port=5002 # '--------' '-------' '-------' | | '-------' # | | # | | .-------. # | | |udpsink| RTCP # | send_rtcp->sink | port=5003 # .-------. | | '-------' sync=false # RTCP |udpsrc | | | async=false # port=5007 | src->recv_rtcp | # '-------' '----------' # # ideally we should transport the properties on the RTP udpsink pads to the # receiver in order to transmit the SPS and PPS earlier. # change this to send the RTP data and RTCP to another host DEST=127.0.0.1 # tuning parameters to make the sender send the streams out of sync. Can be used # ot test the client RTCP synchronisation. #VOFFSET=900000000 VOFFSET=0 AOFFSET=0 # H264 encode from the source VELEM="v4l2src" #VELEM="videotestsrc is-live=1" VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1" VSOURCE="$VELEM ! queue ! videorate ! ffmpegcolorspace ! $VCAPS" VENC="x264enc tune=zerolatency byte-stream=true bitrate=300 ! rtph264pay" VRTPSINK="udpsink port=5000 host=$DEST ts-offset=$VOFFSET name=vrtpsink" VRTCPSINK="udpsink port=5001 host=$DEST sync=false async=false name=vrtcpsink" VRTCPSRC="udpsrc port=5005 name=vrtpsrc" # PCMA encode from the source AELEM="autoaudiosrc" #AELEM="audiotestsrc is-live=1" ASOURCE="$AELEM ! queue ! audioresample ! audioconvert" AENC="alawenc ! rtppcmapay" ARTPSINK="udpsink port=5002 host=$DEST ts-offset=$AOFFSET name=artpsink" ARTCPSINK="udpsink port=5003 host=$DEST sync=false async=false name=artcpsink" ARTCPSRC="udpsrc port=5007 name=artpsrc" gst-launch -v gstrtpbin name=rtpbin \ $VSOURCE ! $VENC ! rtpbin.send_rtp_sink_0 \ rtpbin.send_rtp_src_0 ! $VRTPSINK \ rtpbin.send_rtcp_src_0 ! $VRTCPSINK \ $VRTCPSRC ! rtpbin.recv_rtcp_sink_0 \ $ASOURCE ! $AENC ! rtpbin.send_rtp_sink_1 \ rtpbin.send_rtp_src_1 ! $ARTPSINK \ rtpbin.send_rtcp_src_1 ! $ARTCPSINK \ $ARTCPSRC ! rtpbin.recv_rtcp_sink_1 gst-plugins-good-0.10.31/tests/examples/rtp/client-PCMA.sh0000755000175000017500000000354611671175355020142 00000000000000#!/bin/sh # # A simple RTP receiver # # receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. # the receiver RTCP reports are sent to port 5007 # # .-------. .----------. .---------. .-------. .-------------. # RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |autoaudiosink| # port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | # '-------' | | '---------' '-------' '-------------' # | | # | | .-------. # | | |udpsink| RTCP # | send_rtcp->sink | port=5007 # .-------. | | '-------' sync=false # RTCP |udpsrc | | | async=false # port=5003 | src->recv_rtcp | # '-------' '----------' # the caps of the sender RTP stream. This is usually negotiated out of band with # SDP or RTSP. AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" AUDIO_DEC="rtppcmadepay ! alawdec" AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" # the destination machine to send RTCP to. This is the address of the sender and # is used to send back the RTCP reports of this receiver. If the data is sent # from another machine, change this address. DEST=127.0.0.1 gst-launch -v gstrtpbin name=rtpbin \ udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_0 \ rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ udpsrc port=5003 ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0 ! udpsink port=5007 host=$DEST sync=false async=false gst-plugins-good-0.10.31/tests/examples/rtp/Makefile.am0000644000175000017500000000133211671175355017632 00000000000000noinst_PROGRAMS = server-alsasrc-PCMA client-PCMA server_alsasrc_PCMA_SOURCES = server-alsasrc-PCMA.c server_alsasrc_PCMA_CFLAGS = $(GST_CFLAGS) server_alsasrc_PCMA_LDADD = $(GST_LIBS) $(LIBM) client_PCMA_SOURCES = client-PCMA.c client_PCMA_CFLAGS = $(GST_CFLAGS) client_PCMA_LDADD = $(GST_LIBS) $(LIBM) noinst_SCRIPTS=client-H263p-AMR.sh \ client-H263p-PCMA.sh \ client-H264-PCMA.sh \ client-PCMA.sh \ server-alsasrc-PCMA.sh \ server-v4l2-H263p-alsasrc-AMR.sh \ server-v4l2-H264-alsasrc-PCMA.sh \ server-VTS-H263p-ATS-PCMA.sh EXTRA_DIST= $(noinst_SCRIPTS) \ client-H263p-PCMA.sdp \ client-H264-PCMA.sdp gst-plugins-good-0.10.31/tests/examples/rtp/client-PCMA.c0000644000175000017500000002057211671175355017745 00000000000000/* GStreamer * Copyright (C) 2009 Wim Taymans * * 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 #include #include /* * A simple RTP receiver * * receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. * the receiver RTCP reports are sent to port 5007 * * .-------. .----------. .---------. .-------. .--------. * RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |alsasink| * port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | * '-------' | | '---------' '-------' '--------' * | | * | | .-------. * | | |udpsink| RTCP * | send_rtcp->sink | port=5007 * .-------. | | '-------' sync=false * RTCP |udpsrc | | | async=false * port=5003 | src->recv_rtcp | * '-------' '----------' */ /* the caps of the sender RTP stream. This is usually negotiated out of band with * SDP or RTSP. */ #define AUDIO_CAPS "application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" #define AUDIO_DEPAY "rtppcmadepay" #define AUDIO_DEC "alawdec" #define AUDIO_SINK "autoaudiosink" /* the destination machine to send RTCP to. This is the address of the sender and * is used to send back the RTCP reports of this receiver. If the data is sent * from another machine, change this address. */ #define DEST_HOST "127.0.0.1" /* print the stats of a source */ static void print_source_stats (GObject * source) { GstStructure *stats; gchar *str; g_return_if_fail (source != NULL); /* get the source stats */ g_object_get (source, "stats", &stats, NULL); /* simply dump the stats structure */ str = gst_structure_to_string (stats); g_print ("source stats: %s\n", str); gst_structure_free (stats); g_free (str); } /* will be called when gstrtpbin signals on-ssrc-active. It means that an RTCP * packet was received from another source. */ static void on_ssrc_active_cb (GstElement * rtpbin, guint sessid, guint ssrc, GstElement * depay) { GObject *session, *isrc, *osrc; g_print ("got RTCP from session %u, SSRC %u\n", sessid, ssrc); /* get the right session */ g_signal_emit_by_name (rtpbin, "get-internal-session", sessid, &session); /* get the internal source (the SSRC allocated to us, the receiver */ g_object_get (session, "internal-source", &isrc, NULL); print_source_stats (isrc); /* get the remote source that sent us RTCP */ g_signal_emit_by_name (session, "get-source-by-ssrc", ssrc, &osrc); print_source_stats (osrc); } /* will be called when rtpbin has validated a payload that we can depayload */ static void pad_added_cb (GstElement * rtpbin, GstPad * new_pad, GstElement * depay) { GstPad *sinkpad; GstPadLinkReturn lres; g_print ("new payload on pad: %s\n", GST_PAD_NAME (new_pad)); sinkpad = gst_element_get_static_pad (depay, "sink"); g_assert (sinkpad); lres = gst_pad_link (new_pad, sinkpad); g_assert (lres == GST_PAD_LINK_OK); gst_object_unref (sinkpad); } /* build a pipeline equivalent to: * * gst-launch -v gstrtpbin name=rtpbin \ * udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_0 \ * rtpbin. ! rtppcmadepay ! alawdec ! audioconvert ! audioresample ! alsasink \ * udpsrc port=5003 ! rtpbin.recv_rtcp_sink_0 \ * rtpbin.send_rtcp_src_0 ! udpsink port=5007 host=$DEST sync=false async=false */ int main (int argc, char *argv[]) { GstElement *rtpbin, *rtpsrc, *rtcpsrc, *rtcpsink; GstElement *audiodepay, *audiodec, *audiores, *audioconv, *audiosink; GstElement *pipeline; GMainLoop *loop; GstCaps *caps; gboolean res; GstPadLinkReturn lres; GstPad *srcpad, *sinkpad; /* always init first */ gst_init (&argc, &argv); /* the pipeline to hold everything */ pipeline = gst_pipeline_new (NULL); g_assert (pipeline); /* the udp src and source we will use for RTP and RTCP */ rtpsrc = gst_element_factory_make ("udpsrc", "rtpsrc"); g_assert (rtpsrc); g_object_set (rtpsrc, "port", 5002, NULL); /* we need to set caps on the udpsrc for the RTP data */ caps = gst_caps_from_string (AUDIO_CAPS); g_object_set (rtpsrc, "caps", caps, NULL); gst_caps_unref (caps); rtcpsrc = gst_element_factory_make ("udpsrc", "rtcpsrc"); g_assert (rtcpsrc); g_object_set (rtcpsrc, "port", 5003, NULL); rtcpsink = gst_element_factory_make ("udpsink", "rtcpsink"); g_assert (rtcpsink); g_object_set (rtcpsink, "port", 5007, "host", DEST_HOST, NULL); /* no need for synchronisation or preroll on the RTCP sink */ g_object_set (rtcpsink, "async", FALSE, "sync", FALSE, NULL); gst_bin_add_many (GST_BIN (pipeline), rtpsrc, rtcpsrc, rtcpsink, NULL); /* the depayloading and decoding */ audiodepay = gst_element_factory_make (AUDIO_DEPAY, "audiodepay"); g_assert (audiodepay); audiodec = gst_element_factory_make (AUDIO_DEC, "audiodec"); g_assert (audiodec); /* the audio playback and format conversion */ audioconv = gst_element_factory_make ("audioconvert", "audioconv"); g_assert (audioconv); audiores = gst_element_factory_make ("audioresample", "audiores"); g_assert (audiores); audiosink = gst_element_factory_make (AUDIO_SINK, "audiosink"); g_assert (audiosink); /* add depayloading and playback to the pipeline and link */ gst_bin_add_many (GST_BIN (pipeline), audiodepay, audiodec, audioconv, audiores, audiosink, NULL); res = gst_element_link_many (audiodepay, audiodec, audioconv, audiores, audiosink, NULL); g_assert (res == TRUE); /* the rtpbin element */ rtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin"); g_assert (rtpbin); gst_bin_add (GST_BIN (pipeline), rtpbin); /* now link all to the rtpbin, start by getting an RTP sinkpad for session 0 */ srcpad = gst_element_get_static_pad (rtpsrc, "src"); sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0"); lres = gst_pad_link (srcpad, sinkpad); g_assert (lres == GST_PAD_LINK_OK); gst_object_unref (srcpad); /* get an RTCP sinkpad in session 0 */ srcpad = gst_element_get_static_pad (rtcpsrc, "src"); sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtcp_sink_0"); lres = gst_pad_link (srcpad, sinkpad); g_assert (lres == GST_PAD_LINK_OK); gst_object_unref (srcpad); gst_object_unref (sinkpad); /* get an RTCP srcpad for sending RTCP back to the sender */ srcpad = gst_element_get_request_pad (rtpbin, "send_rtcp_src_0"); sinkpad = gst_element_get_static_pad (rtcpsink, "sink"); lres = gst_pad_link (srcpad, sinkpad); g_assert (lres == GST_PAD_LINK_OK); gst_object_unref (sinkpad); /* the RTP pad that we have to connect to the depayloader will be created * dynamically so we connect to the pad-added signal, pass the depayloader as * user_data so that we can link to it. */ g_signal_connect (rtpbin, "pad-added", G_CALLBACK (pad_added_cb), audiodepay); /* give some stats when we receive RTCP */ g_signal_connect (rtpbin, "on-ssrc-active", G_CALLBACK (on_ssrc_active_cb), audiodepay); /* set the pipeline to playing */ g_print ("starting receiver pipeline\n"); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* we need to run a GLib main loop to get the messages */ loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_print ("stopping receiver pipeline\n"); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; } gst-plugins-good-0.10.31/tests/examples/rtp/client-H263p-AMR.sh0000755000175000017500000000227011671175355020632 00000000000000#!/bin/sh # # A simple RTP receiver # VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" VIDEO_DEC="rtph263pdepay ! ffdec_h263" AUDIO_DEC="rtpamrdepay ! amrnbdec" VIDEO_SINK="ffmpegcolorspace ! autovideosink" AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" gst-launch -v gstrtpbin name=rtpbin latency=100 \ udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0 \ rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK \ udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false \ udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1 \ rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false gst-plugins-good-0.10.31/tests/examples/rtp/client-H263p-PCMA.sh0000755000175000017500000000235511671175355020737 00000000000000#!/bin/sh # # A simple RTP receiver # VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" #DEST=192.168.1.126 DEST=localhost VIDEO_DEC="rtph263pdepay ! ffdec_h263" AUDIO_DEC="rtppcmadepay ! alawdec" VIDEO_SINK="ffmpegcolorspace ! autovideosink" AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" LATENCY=100 gst-launch -v gstrtpbin name=rtpbin latency=$LATENCY \ udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0 \ rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK \ udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0 ! udpsink host=$DEST port=5005 sync=false async=false \ udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1 \ rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ rtpbin.send_rtcp_src_1 ! udpsink host=$DEST port=5007 sync=false async=false gst-plugins-good-0.10.31/tests/examples/rtp/client-H264-PCMA.sdp0000644000175000017500000000035411671175355020726 00000000000000v=0 o=- 1188340656180883 1 IN IP4 127.0.0.1 s=Session streamed by GStreamer i=server.sh t=0 0 a=tool:GStreamer a=type:broadcast m=video 5000 RTP/AVP 96 c=IN IP4 127.0.0.1 a=rtpmap:96 H264/90000 m=audio 5002 RTP/AVP 8 c=IN IP4 127.0.0.1 gst-plugins-good-0.10.31/tests/examples/rtp/client-H263p-PCMA.sdp0000644000175000017500000000036111671175355021103 00000000000000v=0 o=- 1188340656180883 1 IN IP4 127.0.0.1 s=Session streamed by GStreamer i=server.sh t=0 0 a=tool:GStreamer a=type:broadcast m=video 5000 RTP/AVP 96 c=IN IP4 127.0.0.1 a=rtpmap:96 H263-1998/90000 m=audio 5002 RTP/AVP 8 c=IN IP4 127.0.0.1 gst-plugins-good-0.10.31/tests/examples/rtp/server-VTS-H263p-ATS-PCMA.sh0000755000175000017500000000154211671175355022063 00000000000000#!/bin/sh # # A simple RTP server # VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1" gst-launch -v gstrtpbin name=rtpbin \ videotestsrc ! $VCAPS ! ffenc_h263p ! rtph263ppay ! rtpbin.send_rtp_sink_0 \ rtpbin.send_rtp_src_0 ! udpsink port=5000 \ rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false \ udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ audiotestsrc samplesperbuffer=1000 ! alawenc ! rtppcmapay ! rtpbin.send_rtp_sink_1 \ rtpbin.send_rtp_src_1 ! udpsink port=5002 \ rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false \ udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1 gst-plugins-good-0.10.31/tests/examples/rtp/client-H264-PCMA.sh0000755000175000017500000000702511671175355020557 00000000000000#!/bin/sh # # A simple RTP receiver # # receives H264 encoded RTP video on port 5000, RTCP is received on port 5001. # the receiver RTCP reports are sent to port 5005 # receives alaw encoded RTP audio on port 5002, RTCP is received on port 5003. # the receiver RTCP reports are sent to port 5007 # # .-------. .----------. .---------. .-------. .-----------. # RTP |udpsrc | | rtpbin | |h264depay| |h264dec| |xvimagesink| # port=5000 | src->recv_rtp recv_rtp->sink src->sink src->sink | # '-------' | | '---------' '-------' '-----------' # | | # | | .-------. # | | |udpsink| RTCP # | send_rtcp->sink | port=5005 # .-------. | | '-------' sync=false # RTCP |udpsrc | | | async=false # port=5001 | src->recv_rtcp | # '-------' | | # | | # .-------. | | .---------. .-------. .-------------. # RTP |udpsrc | | rtpbin | |pcmadepay| |alawdec| |autoaudiosink| # port=5002 | src->recv_rtp recv_rtp->sink src->sink src->sink | # '-------' | | '---------' '-------' '-------------' # | | # | | .-------. # | | |udpsink| RTCP # | send_rtcp->sink | port=5007 # .-------. | | '-------' sync=false # RTCP |udpsrc | | | async=false # port=5003 | src->recv_rtcp | # '-------' '----------' # the destination machine to send RTCP to. This is the address of the sender and # is used to send back the RTCP reports of this receiver. If the data is sent # from another machine, change this address. DEST=127.0.0.1 # this adjusts the latency in the receiver LATENCY=200 # the caps of the sender RTP stream. This is usually negotiated out of band with # SDP or RTSP. normally these caps will also include SPS and PPS but we don't # have a mechanism to get this from the sender with a -launch line. VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA" VIDEO_DEC="rtph264depay ! ffdec_h264" AUDIO_DEC="rtppcmadepay ! alawdec" VIDEO_SINK="ffmpegcolorspace ! autovideosink" AUDIO_SINK="audioconvert ! audioresample ! autoaudiosink" gst-launch -v gstrtpbin name=rtpbin latency=$LATENCY \ udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0 \ rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK \ udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0 ! udpsink port=5005 host=$DEST sync=false async=false \ udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1 \ rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK \ udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ rtpbin.send_rtcp_src_1 ! udpsink port=5007 host=$DEST sync=false async=false gst-plugins-good-0.10.31/tests/examples/rtp/Makefile.in0000644000175000017500000007106411720560243017641 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = server-alsasrc-PCMA$(EXEEXT) client-PCMA$(EXEEXT) subdir = tests/examples/rtp DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_client_PCMA_OBJECTS = client_PCMA-client-PCMA.$(OBJEXT) client_PCMA_OBJECTS = $(am_client_PCMA_OBJECTS) am__DEPENDENCIES_1 = client_PCMA_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent client_PCMA_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(client_PCMA_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_server_alsasrc_PCMA_OBJECTS = \ server_alsasrc_PCMA-server-alsasrc-PCMA.$(OBJEXT) server_alsasrc_PCMA_OBJECTS = $(am_server_alsasrc_PCMA_OBJECTS) server_alsasrc_PCMA_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) server_alsasrc_PCMA_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SCRIPTS = $(noinst_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(client_PCMA_SOURCES) $(server_alsasrc_PCMA_SOURCES) DIST_SOURCES = $(client_PCMA_SOURCES) $(server_alsasrc_PCMA_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ server_alsasrc_PCMA_SOURCES = server-alsasrc-PCMA.c server_alsasrc_PCMA_CFLAGS = $(GST_CFLAGS) server_alsasrc_PCMA_LDADD = $(GST_LIBS) $(LIBM) client_PCMA_SOURCES = client-PCMA.c client_PCMA_CFLAGS = $(GST_CFLAGS) client_PCMA_LDADD = $(GST_LIBS) $(LIBM) noinst_SCRIPTS = client-H263p-AMR.sh \ client-H263p-PCMA.sh \ client-H264-PCMA.sh \ client-PCMA.sh \ server-alsasrc-PCMA.sh \ server-v4l2-H263p-alsasrc-AMR.sh \ server-v4l2-H264-alsasrc-PCMA.sh \ server-VTS-H263p-ATS-PCMA.sh EXTRA_DIST = $(noinst_SCRIPTS) \ client-H263p-PCMA.sdp \ client-H264-PCMA.sdp all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/rtp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/rtp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list client-PCMA$(EXEEXT): $(client_PCMA_OBJECTS) $(client_PCMA_DEPENDENCIES) $(EXTRA_client_PCMA_DEPENDENCIES) @rm -f client-PCMA$(EXEEXT) $(AM_V_CCLD)$(client_PCMA_LINK) $(client_PCMA_OBJECTS) $(client_PCMA_LDADD) $(LIBS) server-alsasrc-PCMA$(EXEEXT): $(server_alsasrc_PCMA_OBJECTS) $(server_alsasrc_PCMA_DEPENDENCIES) $(EXTRA_server_alsasrc_PCMA_DEPENDENCIES) @rm -f server-alsasrc-PCMA$(EXEEXT) $(AM_V_CCLD)$(server_alsasrc_PCMA_LINK) $(server_alsasrc_PCMA_OBJECTS) $(server_alsasrc_PCMA_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_PCMA-client-PCMA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< client_PCMA-client-PCMA.o: client-PCMA.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -MT client_PCMA-client-PCMA.o -MD -MP -MF $(DEPDIR)/client_PCMA-client-PCMA.Tpo -c -o client_PCMA-client-PCMA.o `test -f 'client-PCMA.c' || echo '$(srcdir)/'`client-PCMA.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/client_PCMA-client-PCMA.Tpo $(DEPDIR)/client_PCMA-client-PCMA.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-PCMA.c' object='client_PCMA-client-PCMA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -c -o client_PCMA-client-PCMA.o `test -f 'client-PCMA.c' || echo '$(srcdir)/'`client-PCMA.c client_PCMA-client-PCMA.obj: client-PCMA.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -MT client_PCMA-client-PCMA.obj -MD -MP -MF $(DEPDIR)/client_PCMA-client-PCMA.Tpo -c -o client_PCMA-client-PCMA.obj `if test -f 'client-PCMA.c'; then $(CYGPATH_W) 'client-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/client-PCMA.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/client_PCMA-client-PCMA.Tpo $(DEPDIR)/client_PCMA-client-PCMA.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client-PCMA.c' object='client_PCMA-client-PCMA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(client_PCMA_CFLAGS) $(CFLAGS) -c -o client_PCMA-client-PCMA.obj `if test -f 'client-PCMA.c'; then $(CYGPATH_W) 'client-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/client-PCMA.c'; fi` server_alsasrc_PCMA-server-alsasrc-PCMA.o: server-alsasrc-PCMA.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -MT server_alsasrc_PCMA-server-alsasrc-PCMA.o -MD -MP -MF $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.o `test -f 'server-alsasrc-PCMA.c' || echo '$(srcdir)/'`server-alsasrc-PCMA.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='server-alsasrc-PCMA.c' object='server_alsasrc_PCMA-server-alsasrc-PCMA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.o `test -f 'server-alsasrc-PCMA.c' || echo '$(srcdir)/'`server-alsasrc-PCMA.c server_alsasrc_PCMA-server-alsasrc-PCMA.obj: server-alsasrc-PCMA.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -MT server_alsasrc_PCMA-server-alsasrc-PCMA.obj -MD -MP -MF $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.obj `if test -f 'server-alsasrc-PCMA.c'; then $(CYGPATH_W) 'server-alsasrc-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/server-alsasrc-PCMA.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Tpo $(DEPDIR)/server_alsasrc_PCMA-server-alsasrc-PCMA.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='server-alsasrc-PCMA.c' object='server_alsasrc_PCMA-server-alsasrc-PCMA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(server_alsasrc_PCMA_CFLAGS) $(CFLAGS) -c -o server_alsasrc_PCMA-server-alsasrc-PCMA.obj `if test -f 'server-alsasrc-PCMA.c'; then $(CYGPATH_W) 'server-alsasrc-PCMA.c'; else $(CYGPATH_W) '$(srcdir)/server-alsasrc-PCMA.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/rtp/server-alsasrc-PCMA.sh0000755000175000017500000000311711671175355021612 00000000000000#!/bin/sh # # A simple RTP server # sends the output of autoaudiosrc as alaw encoded RTP on port 5002, RTCP is sent on # port 5003. The destination is 127.0.0.1. # the receiver RTCP reports are received on port 5007 # # .--------. .-------. .-------. .----------. .-------. # |audiosrc| |alawenc| |pcmapay| | rtpbin | |udpsink| RTP # | src->sink src->sink src->send_rtp send_rtp->sink | port=5002 # '--------' '-------' '-------' | | '-------' # | | # | | .-------. # | | |udpsink| RTCP # | send_rtcp->sink | port=5003 # .-------. | | '-------' sync=false # RTCP |udpsrc | | | async=false # port=5007 | src->recv_rtcp | # '-------' '----------' # change this to send the RTP data and RTCP to another host DEST=127.0.0.1 #AELEM=autoaudiosrc AELEM=audiotestsrc # PCMA encode from an the source ASOURCE="$AELEM ! audioconvert" AENC="alawenc ! rtppcmapay" gst-launch -v gstrtpbin name=rtpbin \ $ASOURCE ! $AENC ! rtpbin.send_rtp_sink_0 \ rtpbin.send_rtp_src_0 ! udpsink port=5002 host=$DEST \ rtpbin.send_rtcp_src_0 ! udpsink port=5003 host=$DEST sync=false async=false \ udpsrc port=5007 ! rtpbin.recv_rtcp_sink_0 gst-plugins-good-0.10.31/tests/examples/shapewipe/0000755000175000017500000000000011720565324017031 500000000000000gst-plugins-good-0.10.31/tests/examples/shapewipe/Makefile.am0000644000175000017500000000035011671175355021011 00000000000000noinst_PROGRAMS = shapewipe-example shapewipe_example_SOURCES = shapewipe-example.c shapewipe_example_CFLAGS = $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) shapewipe_example_LDADD = $(GST_CONTROLLER_LIBS) $(GST_LIBS) noinst_HEADERS = gst-plugins-good-0.10.31/tests/examples/shapewipe/Makefile.in0000644000175000017500000006253111720560243021020 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = shapewipe-example$(EXEEXT) subdir = tests/examples/shapewipe DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_shapewipe_example_OBJECTS = \ shapewipe_example-shapewipe-example.$(OBJEXT) shapewipe_example_OBJECTS = $(am_shapewipe_example_OBJECTS) am__DEPENDENCIES_1 = shapewipe_example_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent shapewipe_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(shapewipe_example_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(shapewipe_example_SOURCES) DIST_SOURCES = $(shapewipe_example_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ shapewipe_example_SOURCES = shapewipe-example.c shapewipe_example_CFLAGS = $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) shapewipe_example_LDADD = $(GST_CONTROLLER_LIBS) $(GST_LIBS) noinst_HEADERS = all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/shapewipe/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/examples/shapewipe/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list shapewipe-example$(EXEEXT): $(shapewipe_example_OBJECTS) $(shapewipe_example_DEPENDENCIES) $(EXTRA_shapewipe_example_DEPENDENCIES) @rm -f shapewipe-example$(EXEEXT) $(AM_V_CCLD)$(shapewipe_example_LINK) $(shapewipe_example_OBJECTS) $(shapewipe_example_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shapewipe_example-shapewipe-example.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< shapewipe_example-shapewipe-example.o: shapewipe-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -MT shapewipe_example-shapewipe-example.o -MD -MP -MF $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo -c -o shapewipe_example-shapewipe-example.o `test -f 'shapewipe-example.c' || echo '$(srcdir)/'`shapewipe-example.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo $(DEPDIR)/shapewipe_example-shapewipe-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shapewipe-example.c' object='shapewipe_example-shapewipe-example.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -c -o shapewipe_example-shapewipe-example.o `test -f 'shapewipe-example.c' || echo '$(srcdir)/'`shapewipe-example.c shapewipe_example-shapewipe-example.obj: shapewipe-example.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -MT shapewipe_example-shapewipe-example.obj -MD -MP -MF $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo -c -o shapewipe_example-shapewipe-example.obj `if test -f 'shapewipe-example.c'; then $(CYGPATH_W) 'shapewipe-example.c'; else $(CYGPATH_W) '$(srcdir)/shapewipe-example.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shapewipe_example-shapewipe-example.Tpo $(DEPDIR)/shapewipe_example-shapewipe-example.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shapewipe-example.c' object='shapewipe_example-shapewipe-example.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(shapewipe_example_CFLAGS) $(CFLAGS) -c -o shapewipe_example-shapewipe-example.obj `if test -f 'shapewipe-example.c'; then $(CYGPATH_W) 'shapewipe-example.c'; else $(CYGPATH_W) '$(srcdir)/shapewipe-example.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/tests/examples/shapewipe/shapewipe-example.c0000644000175000017500000001026511671175355022545 00000000000000/* GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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 #include #include #include static gboolean on_message (GstBus * bus, GstMessage * message, gpointer user_data) { GMainLoop *loop = (GMainLoop *) user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR:{ GError *err = NULL; gchar *debug = NULL; g_warning ("Got ERROR"); gst_message_parse_error (message, &err, &debug); g_warning ("%s: %s", err->message, debug); g_main_loop_quit (loop); break; } case GST_MESSAGE_WARNING:{ GError *err = NULL; gchar *debug = NULL; g_warning ("Got WARNING"); gst_message_parse_error (message, &err, &debug); g_warning ("%s: %s", err->message, debug); g_main_loop_quit (loop); break; } case GST_MESSAGE_EOS: g_main_loop_quit (loop); break; default: break; } return TRUE; } gint main (gint argc, gchar ** argv) { GstElement *pipeline; GstElement *shapewipe; GstController *ctrl; GstLFOControlSource *csource; GValue val = { 0, }; GMainLoop *loop; GstBus *bus; gchar *pipeline_string; gfloat border = 0.05; if (argc < 2) { g_print ("Usage: shapewipe mask.png \n"); return -1; } gst_init (&argc, &argv); gst_controller_init (&argc, &argv); if (argc > 2) { border = atof (argv[2]); } pipeline_string = g_strdup_printf ("videotestsrc ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! shapewipe name=shape border=%f ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink filesrc location=%s ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink videotestsrc pattern=snow ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! queue ! mixer.", border, argv[1]); pipeline = gst_parse_launch (pipeline_string, NULL); g_free (pipeline_string); if (pipeline == NULL) { g_print ("Failed to create pipeline\n"); return -2; } shapewipe = gst_bin_get_by_name (GST_BIN (pipeline), "shape"); if (!(ctrl = gst_controller_new (G_OBJECT (shapewipe), "position", NULL))) { g_print ("can't control shapewipe element\n"); return -3; } csource = gst_lfo_control_source_new (); gst_controller_set_control_source (ctrl, "position", GST_CONTROL_SOURCE (csource)); g_value_init (&val, G_TYPE_FLOAT); g_value_set_float (&val, 0.5); g_object_set (G_OBJECT (csource), "amplitude", &val, NULL); g_value_set_float (&val, 0.5); g_object_set (G_OBJECT (csource), "offset", &val, NULL); g_value_unset (&val); g_object_set (G_OBJECT (csource), "frequency", 0.25, NULL); g_object_set (G_OBJECT (csource), "timeshift", 500 * GST_MSECOND, NULL); g_object_unref (csource); loop = g_main_loop_new (NULL, FALSE); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); return -4; } g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_unref (loop); g_object_unref (G_OBJECT (ctrl)); gst_object_unref (G_OBJECT (pipeline)); return 0; } gst-plugins-good-0.10.31/pkgconfig/0000755000175000017500000000000011720565345014036 500000000000000gst-plugins-good-0.10.31/pkgconfig/Makefile.am0000644000175000017500000000172411671175354016020 00000000000000### all of the standard pc files we need to generate pcverfiles = \ gstreamer-plugins-good-@GST_MAJORMINOR@.pc pcverfiles_uninstalled = \ gstreamer-plugins-good-@GST_MAJORMINOR@-uninstalled.pc ### all-local: $(pcverfiles) $(pcverfiles_uninstalled) all-local: $(pcverfiles_uninstalled) cp_verbose = $(cp_verbose_$(V)) cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY)) cp_verbose_0 = @echo " CP $@"; ### how to generate versioned .pc files from .pc files in this dir %-@GST_MAJORMINOR@.pc: %.pc $(cp_verbose)cp $< $@ %-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc $(cp_verbose)cp $< $@ # do not install for now # pkgconfigdir = $(libdir)/pkgconfig # pkgconfig_DATA = $(pcverfiles) CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled) # pcinfiles = \ # gstreamer-plugins-good.pc.in gstreamer-plugins-good-uninstalled.pc.in pcinfiles = \ gstreamer-plugins-good-uninstalled.pc.in DISTCLEANFILES = $(pcinfiles:.in=) EXTRA_DIST = $(pcinfiles) gst-plugins-good-0.10.31/pkgconfig/gstreamer-plugins-good-uninstalled.pc.in0000644000175000017500000000053711671175354023634 00000000000000prefix= exec_prefix= libdir=@abs_top_builddir@/gst-libs/gst includedir=@abs_top_builddir@/gst-libs pluginsdir=@abs_top_builddir@ Name: GStreamer Good Plugins, Uninstalled Description: Streaming media framework, good plugins, uninstalled Version: @VERSION@ Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-plugins-base-@GST_MAJORMINOR@ Libs: Cflags: gst-plugins-good-0.10.31/pkgconfig/Makefile.in0000644000175000017500000004546011720560240016021 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = pkgconfig DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/gstreamer-plugins-good-uninstalled.pc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = gstreamer-plugins-good-uninstalled.pc CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ### all of the standard pc files we need to generate pcverfiles = \ gstreamer-plugins-good-@GST_MAJORMINOR@.pc pcverfiles_uninstalled = \ gstreamer-plugins-good-@GST_MAJORMINOR@-uninstalled.pc cp_verbose = $(cp_verbose_$(V)) cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY)) cp_verbose_0 = @echo " CP $@"; # do not install for now # pkgconfigdir = $(libdir)/pkgconfig # pkgconfig_DATA = $(pcverfiles) CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled) # pcinfiles = \ # gstreamer-plugins-good.pc.in gstreamer-plugins-good-uninstalled.pc.in pcinfiles = \ gstreamer-plugins-good-uninstalled.pc.in DISTCLEANFILES = $(pcinfiles:.in=) EXTRA_DIST = $(pcinfiles) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pkgconfig/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu pkgconfig/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): gstreamer-plugins-good-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-plugins-good-uninstalled.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am ### all-local: $(pcverfiles) $(pcverfiles_uninstalled) all-local: $(pcverfiles_uninstalled) ### how to generate versioned .pc files from .pc files in this dir %-@GST_MAJORMINOR@.pc: %.pc $(cp_verbose)cp $< $@ %-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc $(cp_verbose)cp $< $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/INSTALL0000644000175000017500000001722711671175352013051 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. gst-plugins-good-0.10.31/compile0000755000175000017500000001533711720560223013364 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-01-04.17; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free # Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l*) lib=${1#-l} found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes set x "$@" "$dir/$lib.dll.lib" break fi if test -f "$dir/$lib.lib"; then found=yes set x "$@" "$dir/$lib.lib" break fi done IFS=$save_IFS test "$found" != yes && set x "$@" "$lib.lib" shift ;; -L*) func_file_conv "${1#-L}" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gst-plugins-good-0.10.31/common/0000755000175000017500000000000011720565344013356 500000000000000gst-plugins-good-0.10.31/common/po.mak0000644000175000017500000000023011671200067014372 00000000000000# rule to download the latest .po files download-po: $(top_srcdir)/common/download-translations $(top_srcdir)/common/download-translations $(PACKAGE) gst-plugins-good-0.10.31/common/gst.supp0000644000175000017500000021354411701411037015001 00000000000000### this file contains suppressions for valgrind when running ### the gstreamer unit tests ### it might be useful for wider use as well ### syscall suppressions { Memcheck:Param clone(parent_tidptr) fun:clone fun:clone } { Memcheck:Param clone(child_tidptr) fun:clone fun:clone } { Memcheck:Param clone(tlsinfo) fun:clone fun:clone } ### glibc suppressions { Memcheck:Cond obj:/lib/ld-2.*.so fun:dl_open_worker obj:/lib/ld-2.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.*.so fun:_dlerror_run fun:dlopen fun:g_module_open fun:gst_plugin_load_file } { Memcheck:Cond fun:strlen fun:fillin_rpath fun:_dl_init_paths fun:dl_main fun:_dl_sysdep_start fun:_dl_start obj:/lib64/ld-2.*.so obj:* obj:* } { Memcheck:Cond fun:_dl_relocate_object fun:dl_main fun:_dl_sysdep_start fun:_dl_start } { Memcheck:Cond fun:* fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } # glibc does not deallocate thread-local storage { Memcheck:Leak fun:calloc fun:_dl_allocate_tls fun:pthread_create@@* } # I get an extra stack entry on x86/dapper { Memcheck:Leak fun:calloc obj:/lib/ld-2.3.*.so fun:_dl_allocate_tls fun:pthread_create@@* } { Memcheck:Cond fun:strstr fun:__pthread_initialize_minimal obj:/lib/libpthread-*.so obj:/lib/libpthread-*.so fun:call_init fun:_dl_init obj:/lib/ld-*.so } # a thread-related free problem in glibc from Edgard { __libc_freeres_rw_acess Memcheck:Addr4 obj:* obj:* obj:* obj:* obj:* fun:__libc_freeres } { Memcheck:Cond obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so } # g_module_open-related problems { Memcheck:Addr2 fun:memcpy fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open fun:gst_plugin_load_file fun:gst_registry_scan_path_level fun:gst_registry_scan_path_level fun:gst_registry_scan_path_level fun:init_post fun:g_option_context_parse fun:gst_init_check fun:gst_init fun:gst_check_init fun:main } { Memcheck:Addr4 fun:memcpy fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open fun:gst_plugin_load_file fun:gst_registry_scan_path_level fun:gst_registry_scan_path_level fun:gst_registry_scan_path_level fun:init_post fun:g_option_context_parse fun:gst_init_check fun:gst_init fun:gst_check_init fun:main } { Memcheck:Cond obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:do_sym fun:_dl_sym fun:dlsym_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlsym fun:g_module_symbol fun:g_module_open fun:gst_plugin_load_file } { Memcheck:Cond obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open fun:gst_plugin_load_file } { Memcheck:Cond obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open fun:gst_plugin_load_file fun:gst_plugin_load_by_name fun:gst_plugin_feature_load } { Memcheck:Leak fun:malloc obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open fun:gst_plugin_load_file fun:gst_plugin_load_by_name } { Memcheck:Addr4 obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so } { Memcheck:Addr4 obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run } { Memcheck:Addr4 obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:dl_open_worker obj:/lib/ld-2.3.*.so fun:_dl_open fun:dlopen_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so fun:do_sym fun:_dl_sym fun:dlsym_doit obj:/lib/ld-2.3.*.so fun:_dlerror_run fun:dlsym fun:g_module_symbol fun:g_module_open } { Memcheck:Param futex(uaddr2) fun:pthread_once obj:/lib/libc-2.3.*.so obj:/lib/libc-2.3.*.so fun:mbsnrtowcs fun:vfprintf fun:vsprintf fun:sprintf obj:/lib/libc-2.3.*.so fun:tmpfile fun:setup_pipe fun:setup_messaging_with_key fun:setup_messaging } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libc-2.7.so fun:_dl_sym obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlsym fun:g_module_symbol fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so fun:iconv_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so obj:/lib/i686/cmov/libc-2.7.so fun:iconv_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so fun:iconv_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so obj:/lib/libc-2.7.so fun:iconv_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode } { Memcheck:Cond obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/i686/cmov/libdl-2.7.so fun:dlopen } # suppression for a glibc bug: # http://valgrind.org/docs/manual/faq.html#faq.exit_errors> { Memcheck:Free fun:free obj:*libc-*.so fun:__libc_freeres fun:* fun:_Exit } # same as above, just so it works for tpm on gutsy/x86-64 { Memcheck:Free fun:free fun:free_mem fun:__libc_freeres } # valgrind doesn't allow me to specify a suppression for Addr1, Addr2, Addr4 # as Addr*, so 3 copies for that; and then 2 of each for that pesky memcpy { Memcheck:Addr1 fun:_dl_signal_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr2 fun:_dl_signal_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr4 fun:_dl_signal_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr1 fun:memcpy fun:_dl_signal_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr2 fun:memcpy fun:_dl_signal_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr4 fun:memcpy fun:_dl_signal_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.1 fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/libc-2.3.*.so obj:/lib/ld-2.3.*.so fun:_dl_open obj:/lib/libdl-2.3.*.so obj:/lib/ld-2.3.*.so } { Memcheck:Cond obj:/lib/ld-2.3.*.so obj:/lib/libc-2.3.*.so obj:/lib/ld-2.3.*.so fun:_dl_open obj:/lib/libdl-2.3.*.so obj:/lib/ld-2.3.*.so obj:/lib/libdl-2.3.*.so fun:dlopen fun:g_module_open fun:gst_plugin_load_file fun:gst_plugin_load_by_name fun:gst_plugin_feature_load } { Memcheck:Addr4 obj:/lib/ld-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/tls/i686/cmov/libc-2.3.6.so obj:/lib/ld-2.3.6.so fun:_dl_open obj:/lib/tls/i686/cmov/libdl-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/tls/i686/cmov/libdl-2.3.6.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.3.6.so obj:/lib/tls/i686/cmov/libc-2.3.6.so obj:/lib/ld-2.3.6.so fun:_dl_open obj:/lib/tls/i686/cmov/libdl-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/tls/i686/cmov/libdl-2.3.6.so fun:dlopen } { Memcheck:Cond obj:/lib/ld-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/tls/i686/cmov/libc-2.3.6.so obj:/lib/ld-2.3.6.so fun:_dl_open obj:/lib/tls/i686/cmov/libdl-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/tls/i686/cmov/libdl-2.3.6.so fun:dlopen } ### glib suppressions { Memcheck:Cond fun:g_parse_debug_string obj:/usr/lib*/libglib-2.0.so.* fun:g_slice_alloc fun:g_slice_alloc0 } { Memcheck:Leak fun:*alloc ... fun:g_type_init* fun:init_pre* } { Memcheck:Leak fun:*alloc ... fun:g_type_register_fundamental } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:type_node_any_new_W } { Memcheck:Leak fun:realloc fun:g_realloc fun:type_node_any_new_W } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:g_type_class_ref } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:type_add_flags_W } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:type_add_flags_W } #pthread memleaks { Thread creation leak Memcheck:Leak fun:calloc fun:allocate_dtv fun:_dl_allocate* fun:_dl_allocate* fun:__pthread_initialize_minimal } { Thread management leak Memcheck:Leak fun:calloc fun:allocate_dtv fun:_dl_allocate* fun:_dl_allocate* fun:__pthread_* } { Thread management leak 2 Memcheck:Leak fun:memalign fun:_dl_allocate* fun:_dl_allocate* fun:__pthread_* } { pthread_create Syscall param write(buf) points to uninitialised byte(s) Memcheck:Param write(buf) fun:pthread_create@@GLIBC_2.2.5 fun:g_thread_create* } # nss_parse_* memleak (used by g_option_context_parse) { nss_parse_* memleak Memcheck:Leak fun:malloc fun:nss_parse_service_list fun:__nss_database_lookup } # liboil suppressions { Memcheck:Value8 obj:/usr/lib/liboil-0.3.so.0.1.0 obj:/usr/lib/liboil-0.3.so.0.1.0 obj:/usr/lib/liboil-0.3.so.0.1.0 fun:oil_cpu_fault_check_try fun:oil_test_check_impl fun:oil_class_optimize fun:oil_optimize_all fun:oil_init } { Memcheck:Addr8 obj:/lib/ld-2.3.6.so } { Memcheck:Param futex(uaddr2) fun:pthread_once obj:/lib/libc-2.3.6.so obj:/lib/libc-2.3.6.so fun:setlocale fun:init_pre fun:g_option_context_parse fun:gst_init_check fun:gst_init fun:gst_check_init fun:main } { Memcheck:Cond obj:/lib/ld-2.3.6.so obj:/lib/ld-2.3.6.so fun:_dl_open obj:/lib/libdl-2.3.6.so obj:/lib/ld-2.3.6.so obj:/lib/libdl-2.3.6.so fun:dlopen fun:g_module_open fun:gst_plugin_load_file } # this exists in a bunch of different variations, hence the short tail/trace { Memcheck:Addr4 obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so } { Memcheck:Addr8 obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so } # More edgy suppressions (Mike) { Memcheck:Cond obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so fun:dlopen_doit obj:/lib/ld-2.4.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 } { Memcheck:Cond obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so fun:dlopen_doit obj:/lib/ld-2.4.so fun:_dlerror_run fun:dlopen@@GLIBC_2.1 } { Memcheck:Cond obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so fun:do_sym fun:_dl_sym } # This one's overly general, but there's zero other information in the stack # trace - just these five lines! { Memcheck:Cond obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so obj:/lib/ld-2.4.so } { Memcheck:Leak fun:calloc obj:/lib/ld-2.4.so fun:_dl_allocate_tls fun:pthread_create@@GLIBC_2.1 } # TLS leaks for feisty/x86 { Memcheck:Leak fun:calloc fun:allocate_dtv fun:_dl_allocate_tls fun:pthread_create@@GLIBC_2.1 } { Memcheck:Leak fun:calloc obj:/usr/lib/libcdio.so.6.0.1 fun:cdio_open_am_linux obj:/usr/lib/libcdio.so.6.0.1 fun:cdio_open_am } { Memcheck:Addr8 obj:/lib/ld-2.5.so } { Memcheck:Cond fun:snd_pcm_direct_shm_create_or_connect fun:snd_pcm_dsnoop_open fun:_snd_pcm_dsnoop_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_plug_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_asym_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 } { Memcheck:Cond fun:snd*_pcm_hw_param_set_near } { Memcheck:Cond ... fun:snd*_pcm_hw_param_set_near } { Memcheck:Cond obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_close obj:/*lib/libasound.so.2.0.0 } { Memcheck:Cond fun:snd_pcm_direct_shm_create_or_connect fun:snd_pcm_dmix_open fun:_snd_pcm_dmix_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_softvol_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_plug_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_asym_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 } { Memcheck:Leak fun:malloc fun:strdup fun:snd_dlobj_cache_add obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:snd_pcm_dsnoop_open fun:_snd_pcm_dsnoop_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_plug_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_asym_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 } # Catch about 15 variations on inserting info into an ALSA # internal cache { Memcheck:Leak fun:malloc ... fun:snd*_dlobj_cache_add obj:/*lib*/libasound.so.2.0.0 } { Memcheck:Leak fun:*alloc ... fun:snd_pcm_open_conf } { Memcheck:Leak fun:*alloc obj:/*lib*/libasound.so.2.0.0 ... fun:snd_config_hook_load } { Memcheck:Leak fun:*alloc obj:/*lib*/libasound.so.2.0.0 ... fun:snd_config_update_r fun:snd_config_update } { Memcheck:Leak fun:*alloc fun:strdup ... fun:snd_config_update_r fun:snd_config_update } { Memcheck:Leak fun:malloc obj:/lib/libc*.so fun:__nss_database_lookup obj:* obj:* fun:getgrnam_r fun:getgrnam fun:snd_pcm_direct_parse_open_conf } { Memcheck:Leak fun:calloc fun:_XCBInitDisplayLock fun:XOpenDisplay } # GConf internal initialisations related to getting the default client. { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval obj:/usr/lib/libORBit-2.so.* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so.* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so.* obj:/usr/lib/libgconf-2.so.* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval obj:* fun:PortableServer_POA_servant_to_reference fun:* fun:* fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval obj:/usr/lib/libORBit-2.so.* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so.* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so.* obj:/usr/lib/libgconf-2.so.* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:ORBit_demarshal_value fun:* fun:ORBit_small_invoke_stub fun:ConfigServer_get_default_database fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:* fun:IOP_generate_profiles fun:ORBit_marshal_object fun:ORBit_marshal_value fun:* fun:ORBit_small_invoke_stub fun:ConfigServer_add_client fun:* fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_by_tc fun:* fun:PortableServer_POA_servant_to_reference fun:* fun:* fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_by_tc obj:/usr/lib/libORBit-2.so.* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so.* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so.* obj:/usr/lib/libgconf-2.so.* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:* fun:* fun:gconf_activate_server } # Some libORBit/bonobo initialisation stuff { Memcheck:Leak fun:malloc fun:g_malloc fun:ORBit_alloc_string fun:CORBA_string_dup fun:Bonobo_ActivationEnvValue_set fun:bonobo_activation_init_activation_env fun:bonobo_activation_orb_init fun:bonobo_activation_init } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:PortableServer_POA_servant_to_reference obj:/usr/lib/libbonobo-2.so* } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval fun:ORBit_small_allocbuf fun:ORBit_adaptor_setup obj:/usr/lib/libORBit-2.so* fun:ORBit_POA_setup_root fun:ORBit_init_internals fun:CORBA_ORB_init } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval fun:ORBit_adaptor_setup fun:* fun:ORBit_POA_setup_root fun:ORBit_init_internals fun:CORBA_ORB_init } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_allocbuf fun:bonobo_activation_init_activation_env fun:bonobo_activation_orb_init fun:bonobo_activation_init } # More GConf stuff from the FC5 buildbot, mostly variations on the # above stack traces { Memcheck:Param writev(vector[...]) fun:writev obj:/usr/lib/libORBit-2.so* fun:link_connection_writev fun:giop_send_buffer_write obj:/usr/lib/libORBit-2.so* fun:ORBit_small_invoke_stub fun:ORBit_small_invoke_stub_n fun:ORBit_c_stub_invoke fun:ConfigServer_ping fun:gconf_activate_server obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:PortableServer_POA_servant_to_reference obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc obj:/usr/lib/libORBit-2.so* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:ORBit_demarshal_value obj:/usr/lib/libORBit-2.so* fun:ORBit_small_invoke_stub fun:ORBit_small_invoke_stub_n fun:ORBit_c_stub_invoke fun:ConfigServer_get_default_database obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:ORBit_OAObject_object_to_objkey fun:IOP_generate_profiles fun:ORBit_marshal_object fun:ORBit_marshal_value obj:/usr/lib/libORBit-2.so* fun:ORBit_small_invoke_stub fun:ORBit_small_invoke_stub_n fun:ORBit_c_stub_invoke fun:ConfigServer_add_client obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.* fun:g_get_home_dir } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.* fun:g_get_user_name } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.* fun:g_get_tmp_dir } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.0.* fun:g_get_host_name } ## Some Fontconfig errors. { Memcheck:Leak fun:malloc fun:FcPatternObjectInsertElt fun:FcPatternObjectAddWithBinding fun:FcPatternAppend fun:FcEndElement obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* fun:XML_ParseBuffer fun:FcConfigParseAndLoad fun:FcConfigParseAndLoad fun:FcParseInclude fun:FcEndElement obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* fun:XML_ParseBuffer fun:FcConfigParseAndLoad } { Memcheck:Leak fun:*alloc ... fun:FcInitLoadConfig } # Issues with ubuntu Hardy, same crack as for previous ubuntus { Memcheck:Leak fun:calloc obj:* fun:_dl_allocate_tls fun:pthread_create@@* obj:/usr/lib/libgthread* fun:g_thread_* } # I've made this version generic, so that it covers future modifications # of library names { Memcheck:Leak fun:calloc obj:* fun:_dl_allocate_tls fun:pthread_create@@* fun:g_thread_* } # series of invalid read of size 4 in g_module_open for ubuntu # hardy x86/32bit { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open fun:gst_plugin_load_* } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open fun:gst_plugin_load_* } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open fun:gst_plugin_load_* } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open fun:gst_plugin_load_* } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so fun:dlopen fun:g_module_open fun:gst_plugin_load* } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libc-2.7.so fun:_dl_sym obj:/lib/tls/i686/cmov/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libdl-2.7.so fun:dlsym fun:g_module_symbol fun:g_module_open fun:gst_plugin_load_* } # series of invalid read of size 8 in g_module_open for ubuntu # hardy x86/64bit { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlopen fun:g_module_open } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libc-2.7.so obj:/lib/libdl-2.7.so obj:/lib/ld-2.7.so obj:/lib/libdl-2.7.so fun:dlsym fun:g_module_symbol fun:g_module_open } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/i686/cmov/libc-2.7.so fun:__nss_passwd_lookup fun:getpwnam_r } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/i686/cmov/libc-2.7.so fun:__nss_passwd_lookup fun:getpwnam_r } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/i686/cmov/libnss_compat-2.7.so fun:_nss_compat_getpwnam_r fun:getpwnam_r } { Memcheck:Addr4 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/tls/i686/cmov/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/i686/cmov/libnss_compat-2.7.so fun:_nss_compat_getpwnam_r fun:getpwnam_r } { Memcheck:Addr8 obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/ld-2.7.so obj:/lib/libc-2.7.so obj:/lib/ld-2.7.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/libc-2.7.so fun:getpwnam_r } ## Leaks in ALSA (variations of leak from snd_config_load1) { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:malloc fun:snd1_dlobj_cache_add fun:snd_ctl_open_noupdate } { Memcheck:Leak fun:malloc fun:* fun:snd1_dlobj_cache_add fun:snd_ctl_open_noupdate } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } # The following are leaks of caps that need to be created dynamically # in the type registration of the plugin (used for pad templates). { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_new_simple fun:* fun:g_type_class_ref fun:gst_element_register } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:* fun:* fun:g_type_class_ref fun:gst_element_register fun:gst_ogm_parse_plugin_init fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_video_test_src_base_init fun:g_type_class_ref fun:gst_element_register } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_video_test_src_getcaps fun:gst_video_test_src_base_init fun:g_type_class_ref fun:gst_element_register } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_ffmpegcsp_codectype_to_caps fun:gst_ffmpegcolorspace_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_ffmpegcolorspace_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_new_any fun:gst_ffmpegdemux_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:realloc fun:g_realloc fun:g_ptr_array_maybe_expand fun:g_ptr_array_add fun:gst_caps_append fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_ptr_array_maybe_expand fun:g_ptr_array_add fun:gst_caps_append fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_ptr_array_maybe_expand fun:g_ptr_array_add fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_ptr_array_sized_new fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_array_maybe_expand fun:g_array_sized_new fun:* fun:* fun:* fun:gst_value_init_and_copy fun:gst_structure_copy fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_array_maybe_expand fun:g_array_sized_new fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_array_sized_new fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_riff_create_*_template_caps } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:* fun:* fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_caps_append fun:gst_riff_create_*_template_caps } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_array_sized_new fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_caps_append fun:gst_riff_create_*_template_caps } ## Leaks in pango (bilboed: gentoo unstable amd64) { Memcheck:Leak fun:*alloc ... fun:pango_layout_get_pixel_extents } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:pango_language_from_string fun:pango_language_get_default fun:pango_context_init fun:g_type_create_instance fun:g_object_constructor fun:g_object_newv fun:g_object_new_valist fun:g_object_new fun:pango_font_map_create_context } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:pango_language_from_string } ## Leak of property_list in gstffmpegcfg.c ## This list is created in gst_ffmpegcsp_init(), called from ## gst_ffmpegenc_register. { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_datalist_id_set_data_full fun:gst_ffmpeg_cfg_init fun:gst_ffmpegenc_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_datalist_id_set_data_full fun:g_param_spec_set_qdata_full fun:gst_ffmpeg_cfg_init fun:gst_ffmpegenc_register fun:plugin_init } { Memcheck:Leak fun:*alloc fun:* fun:gst_ffmpeg_cfg_init fun:gst_ffmpegenc_register } ## Leak of GIO module through gnomevfs { Memcheck:Leak fun:malloc fun:g_malloc fun:* fun:* fun:g_type_create_instance fun:* fun:* fun:* fun:* fun:g_io_module_new fun:g_io_modules_load_all_in_directory fun:* fun:get_default_vfs } ## Conditional jump in getaddrinfo (bilboed, gentoo ~amd64, Dec 13 2008) { Memcheck:Cond fun:gaih_inet fun:getaddrinfo } ## Dynamic pad templates in mxfmux { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_from_string fun:mxf_*_init fun:plugin_init } ## We don't know if ffmpeg frees this or not and better pass a copy for safety { Memcheck:Leak fun:malloc fun:g_malloc fun:g_strdup fun:gst_ffmpeg_cfg_fill_context fun:gst_ffmpegenc_setcaps fun:gst_pad_set_caps } ## Leak/overreads with glibc-2.10 { Memcheck:Value8 fun:do_sym fun:dlsym_doit fun:_dl_catch_error fun:_dlerror_run fun:dlsym } { Memcheck:Cond fun:do_sym fun:dlsym_doit fun:_dl_catch_error fun:_dlerror_run fun:dlsym } { Memcheck:Value8 fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Value8 fun:_dl_relocate_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Value8 fun:_dl_check_map_versions fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Cond fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Cond fun:_dl_relocate_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Cond fun:_dl_check_map_versions fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Cond fun:_dl_map_object* fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Value8 fun:_dl_map_object* fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Value8 fun:_dl_check_caller fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Cond fun:_dl_check_caller fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen* } { Memcheck:Value8 obj:/lib*/libc-2.10.*.so obj:/lib*/libc-2.10.*.so fun:_vgnU_freeres } { Memcheck:Cond obj:/lib*/libc-2.10.*.so obj:/lib*/libc-2.10.*.so fun:_vgnU_freeres } { Memcheck:Free fun:free obj:/lib*/libc-2.10.*.so obj:/lib*/libc-2.10.*.so fun:_vgnU_freeres } { Memcheck:Value8 fun:_dl_fini fun:__run_exit_handlers fun:exit } { Memcheck:Cond fun:_dl_fini fun:__run_exit_handlers fun:exit } { Memcheck:Value8 fun:_dl_sort_fini fun:_dl_fini fun:__run_exit_handlers fun:exit } { Memcheck:Cond fun:_dl_sort_fini fun:_dl_fini fun:__run_exit_handlers fun:exit } # glibc-2.10 dl overreads { Memcheck:Value8 fun:_dl_fixup fun:_dl_runtime_resolve } { Memcheck:Cond fun:_dl_fixup fun:_dl_runtime_resolve } { Memcheck:Value8 fun:_dl_lookup_symbol_x fun:_dl_fixup fun:_dl_runtime_resolve } { Memcheck:Cond fun:_dl_lookup_symbol_x fun:_dl_fixup fun:_dl_runtime_resolve } { Memcheck:Value8 fun:call_init fun:_dl_init } { Memcheck:Value8 fun:_dl_init } { Memcheck:Value8 fun:do_lookup_x fun:_dl_lookup_symbol_x fun:_dl_relocate_object fun:dl_main } { Memcheck:Cond fun:do_lookup_x fun:_dl_lookup_symbol_x fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:_dl_lookup_symbol_x fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:dl_main fun:_dl_sysdep_start fun:_dl_start } { Memcheck:Cond fun:dl_main fun:_dl_sysdep_start fun:_dl_start } { Memcheck:Cond fun:* fun:do_lookup_x fun:_dl_lookup_symbol_x fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:* fun:do_lookup_x fun:_dl_lookup_symbol_x fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:_dl_check_map_versions fun:_dl_check_all_versions fun:version_check_doit fun:_dl_receive_error fun:dl_main } { Memcheck:Cond fun:_dl_check_map_versions fun:_dl_check_all_versions fun:version_check_doit fun:_dl_receive_error fun:dl_main } { Memcheck:Value8 fun:_dl_check_all_versions fun:version_check_doit fun:_dl_receive_error fun:dl_main } { Memcheck:Cond fun:_dl_check_all_versions fun:version_check_doit fun:_dl_receive_error fun:dl_main } { Memcheck:Value8 fun:* fun:_dl_check_map_versions fun:_dl_check_all_versions fun:version_check_doit fun:_dl_receive_error fun:dl_main } { Memcheck:Cond fun:* fun:_dl_check_map_versions fun:_dl_check_all_versions fun:version_check_doit fun:_dl_receive_error fun:dl_main } { Memcheck:Value8 fun:init_tls fun:dl_main } { Memcheck:Cond fun:init_tls fun:dl_main } { Memcheck:Cond fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:_dl_protect_relro fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:* fun:do_lookup_x fun:_dl_lookup_symbol_x fun:_dl_relocate_object fun:dl_main } { Memcheck:Value8 fun:_dl_setup_hash fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Value8 fun:* fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Cond fun:* fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Value8 fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:* fun:_dl_map_object } { Memcheck:Cond fun:* fun:_dl_map_object } { Memcheck:Cond fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Cond fun:* fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:* fun:open_path fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Cond fun:* fun:open_path fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Cond fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Value8 fun:* fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Value8 fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Cond fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object } { Memcheck:Value8 fun:* fun:_dl_name_match_p fun:_dl_map_object } { Memcheck:Cond fun:* fun:* fun:_dl_map_object } { Memcheck:Value8 fun:* fun:_dl_name_match_p fun:_dl_check_map_versions fun:_dl_check_all_versions } { Memcheck:Value8 fun:* fun:* fun:do_lookup_x fun:_dl_lookup_symbol_x } { Memcheck:Cond fun:do_lookup_x fun:_dl_lookup_symbol_x } { Memcheck:Value8 fun:do_lookup_x fun:_dl_lookup_symbol_x } { Memcheck:Value8 fun:* fun:do_lookup_x fun:_dl_lookup_symbol_x } { Memcheck:Cond fun:* fun:do_lookup_x fun:_dl_lookup_symbol_x } { Memcheck:Value8 fun:_dl_name_match_p fun:_dl_map_object fun:dl_open_worker } { Memcheck:Cond fun:_dl_name_match_p fun:_dl_map_object fun:dl_open_worker } { Memcheck:Value8 fun:* fun:_dl_name_match_p fun:_dl_map_object fun:dl_open_worker } { Memcheck:Cond fun:* fun:_dl_name_match_p fun:_dl_map_object fun:dl_open_worker } { Memcheck:Value8 fun:_dl_lookup_symbol_x fun:_dl_relocate_object } { Memcheck:Cond fun:_dl_lookup_symbol_x fun:_dl_relocate_object } { Memcheck:Value8 fun:* fun:* fun:_dl_check_map_versions } { Memcheck:Value8 fun:* fun:_dl_check_map_versions } { Memcheck:Cond fun:* fun:* fun:_dl_check_map_versions } { Memcheck:Cond fun:* fun:_dl_check_map_versions } { Memcheck:Value8 fun:openaux } { Memcheck:Value8 fun:_dl_name_match_p fun:_dl_map_object } { Memcheck:Cond fun:_dl_close_worker fun:_dl_close fun:_dl_catch_error fun:dlerror_run } { Memcheck:Value8 fun:_dl_close_worker fun:_dl_close fun:_dl_catch_error fun:dlerror_run } { Memcheck:Cond fun:* fun:_dl_close_worker fun:_dl_close fun:_dl_catch_error fun:dlerror_run } { Memcheck:Value8 fun:* fun:_dl_close_worker fun:_dl_close fun:_dl_catch_error fun:dlerror_run } { Memcheck:Cond fun:fillin_rpath fun:_dl_init_paths fun:dl_main } { Memcheck:Value8 fun:fillin_rpath fun:_dl_init_paths fun:dl_main } { Memcheck:Cond fun:* fun:fillin_rpath fun:_dl_init_paths fun:dl_main } { Memcheck:Value8 fun:* fun:fillin_rpath fun:_dl_init_paths fun:dl_main } { Memcheck:Cond fun:_dl_map_object fun:map_doit fun:_dl_catch_error fun:do_preload fun:dl_main } { Memcheck:Value8 fun:_dl_map_object fun:map_doit fun:_dl_catch_error fun:do_preload fun:dl_main } { Memcheck:Param open(filename) fun:open fun:open_verify fun:_dl_map_object fun:map_doit fun:_dl_catch_error fun:do_preload fun:dl_main } { Memcheck:Param stat(file_name) fun:_xstat fun:open_path fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_open_worker } { Memcheck:Cond fun:* fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:* fun:_dl_map_object_deps fun:dl_main } { Memcheck:Value8 fun:* fun:* fun:_dl_map_object_deps fun:dl_main } # glibc-2.10 tls issues { Memcheck:Cond fun:* fun:init_tls fun:dl_main } { Memcheck:Value8 fun:* fun:init_tls fun:dl_main } { Memcheck:Cond fun:* fun:* fun:init_tls fun:dl_main } { Memcheck:Value8 fun:* fun:* fun:init_tls fun:dl_main } { Memcheck:Cond fun:_dl_allocate_tls_init fun:dl_main } { Memcheck:Value8 fun:_dl_allocate_tls_init fun:dl_main } { Memcheck:Cond fun:* fun:_dl_allocate_tls_init fun:dl_main } { Memcheck:Value8 fun:* fun:_dl_allocate_tls_init fun:dl_main } { Memcheck:Cond fun:__tls* obj:* obj:* fun:_vgnU_freeres } { Memcheck:Param arch_prctl(arg2) fun:init_tls } # GLib caching tmp/home directories (glibc-2.10 variants) { Memcheck:Cond fun:* fun:dl_open_worker fun:* fun:* fun:* fun:_dl_catch_error fun:dlerror_run fun:* fun:__nss_lookup_function fun:__nss_lookup fun:getpwnam* } { Memcheck:Value8 fun:* fun:dl_open_worker fun:* fun:* fun:* fun:_dl_catch_error fun:dlerror_run fun:* fun:__nss_lookup_function fun:__nss_lookup fun:getpwnam* } { Memcheck:Cond fun:dl_open_worker fun:* fun:* fun:do_dlopen fun:* fun:dlerror_run fun:* fun:__nss_lookup_function fun:__nss_lookup fun:getpwnam* } { Memcheck:Value8 fun:dl_open_worker fun:* fun:* fun:do_dlopen fun:* fun:dlerror_run fun:* fun:__nss_lookup_function fun:__nss_lookup fun:getpwnam* } { Memcheck:Value8 fun:_dl_add_to_slotinfo fun:dl_main } { Memcheck:Param open(filename) fun:open fun:open_verify fun:open_path fun:_dl_map_object } # GModule issues with glibc-2.10 { Memcheck:Value8 fun:* fun:* fun:dlsym fun:g_module_symbol } { Memcheck:Value8 fun:g_module_* fun:gst_plugin* } { Memcheck:Value8 fun:* fun:g_module_* fun:gst_plugin* } { Memcheck:Value8 fun:* fun:* fun:dlopen* fun:g_module_open } { Memcheck:Value8 fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:dlsym fun:g_module_symbol } { Memcheck:Value8 fun:* fun:* fun:* fun:* fun:* fun:dlopen* fun:g_module_open } # Leak in GSlice { Memcheck:Value8 fun:g_parse_debug_string fun:slice_config_init fun:g_slice_init_nomessage fun:_g_slice_thread_init_nomessage fun:g_thread_init_glib } # 2.10 pthread issues { Memcheck:Value8 fun:__pthread_initialize_minimal } # glibc 2.11 conditional { Memcheck:Cond fun:_dl_relocate_object fun:dl_main fun:_dl_sysdep_start fun:_dl_start obj:/lib64/ld-2.11.so } # glibc 2.11 Leak { Memcheck:Leak fun:*alloc fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } { Memcheck:Leak fun:*alloc fun:_dl_* fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } { Memcheck:Leak fun:*alloc fun:_dl_* fun:_dl_* fun:_dl_* fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } { Memcheck:Leak fun:*alloc fun:* fun:_dl_* fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } { Memcheck:Leak fun:*alloc fun:* fun:_dl_map_object fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } { Memcheck:Leak fun:*alloc fun:_dl_new_object fun:_dl_map_object_from_fd fun:_dl_map_object fun:openaux fun:_dl_catch_error fun:_dl_map_object_deps fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } { Memcheck:Leak fun:*alloc fun:* fun:_dl_* fun:_dl_* fun:_dl_* fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error fun:_dlerror_run fun:dlopen@@GLIBC_2.2.5 } # glib type leaks { Memcheck:Leak fun:*alloc ... fun:g_type_register_static } # new registry system # all of this will only be created once when loading registry. { Memcheck:Leak fun:*alloc ... fun:_priv_gst_registry_chunks_load_plugin } # system-wide tags # these tags are registered once { Memcheck:Leak fun:*alloc fun:* fun:* fun:gst_tag_register fun:_gst_tag_initialize } # system-wide type classes that we keep referenced { Memcheck:Leak fun:*alloc ... fun:g_type_class_ref } # leaking cached queries which are only initialized once { Memcheck:Leak fun:*alloc ... fun:_gst_query_initialize fun:init_post } # macosx (leopard) library loader leak { Memcheck:Leak fun:_Znwm fun:_ZNSs4_Rep9_S_createEmmRKSaIcE fun:_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag fun:_ZNSsC2EPKcRKSaIcE fun:_Z41__static_initialization_and_destruction_0ii fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE } # GObject type registration { Memcheck:Leak fun:*alloc ... fun:_g_atomic_array_copy } { Memcheck:Leak fun:*alloc fun:getdelim obj:*libselinux* } { Memcheck:Leak fun:*alloc ... obj:*/sed } { Memcheck:Addr8 ... obj:*/sed } # GLib 2.23 interface vtable { Memcheck:Leak fun:*alloc ... fun:g_type_add_interface_static } { Memcheck:Leak fun:*alloc obj:*/dash } # libtool/gentoo fake leak # it actually runs bash and valgrind complains { Memcheck:Leak fun:*alloc obj:/bin/bash } { Memcheck:Leak fun:*alloc ... fun:_gst_plugin_loader_client_run fun:main } { Memcheck:Cond fun:*strcasecmp* ... fun:__dcigettext } { Memcheck:Value8 fun:*strcasecmp* ... fun:__dcigettext } { Memcheck:Leak fun:malloc ... fun:gst_poll_new fun:gst_poll_new_timer fun:gst_system_clock_init } gst-plugins-good-0.10.31/common/download-translations0000755000175000017500000001130111671200067017537 00000000000000#!/bin/sh # Shell script to download the latest translations for a given GStreamer # package from translationproject.org # DOMAINS based on http://translationproject.org/extra/matrix.html # We need to check all domains, not only po/LINGUAS, since there might be # new translations DOMAINS=\ "af am ar az be bg pt_BR bs ca zh_CN cs cy da de el eo es et eu fa fi fr "\ "ga en_GB gl gu he hi zh_HK hr hu id is it ja ko ku ky lg lt lv mk mn ms "\ "mt nb ne nl nn or pa pl pt rm ro ru rw sk sl sq sr sv ta tq th tk "\ "tr zh_TW uk ven vi wa xh zu" # for testing/debugging: #DOMAINS="es fr hu sv pl xx" # check for 'diff' program diff --version 2>/dev/null >/dev/null if [ ! $? ]; then echo "==== You must have the 'diff' program installed for this script ====" exit 1 fi # check for 'wget' program wget --version 2>/dev/null >/dev/null if [ ! $? ]; then echo "==== You must have the 'wget' program installed for this script ====" exit 1 fi # make sure we're in the top-level directory if [ ! -d ./po ]; then echo "==== No ./po directory in the current working directory ====" exit 1 fi # make sure a package argument was passed to us if [ -z "$1" ]; then echo "Usage: $0 PACKAGE, e.g. $0 gst-plugins-good" exit 1 fi if test "$1" != "gstreamer" -a \ "$1" != "gst-plugins-base" -a \ "$1" != "gst-plugins-good" -a \ "$1" != "gst-plugins-ugly" -a \ "$1" != "gst-plugins-bad"; then echo "Unexpected package '$1' ?!" exit 1 fi PACKAGE="$1" DOMAINS_TO_ADD="" DOMAINS_UPDATED="" DOMAINS_NOT_IN_LINGUAS="" echo "Downloading latest translation files for package $PACKAGE ..." echo for d in $DOMAINS do PACKAGE_PO_URL_BASE="http://translationproject.org/latest/$PACKAGE" PO_URL="$PACKAGE_PO_URL_BASE/$d.po" PO_FILENAME="$PACKAGE.$d.po" if wget -q -nc -O $PO_FILENAME $PO_URL; then # we want all .po files in UTF-8 format really, so convert if needed.. CHARSET=`grep Content-Type $PO_FILENAME | sed -e 's/.*charset=\(.*\)\\\\n.*/\1/'` if test "x$CHARSET" != "xUTF-8" -a "x$CHARSET" != "xutf-8"; then # note: things like the bugs address will be added back by make update-po if msguniq $PO_FILENAME --no-location \ --output-file=$PO_FILENAME.utf8 \ --to-code=UTF-8; then mv $PO_FILENAME.utf8 $PO_FILENAME else echo "**** $d: conversion from $CHARSET to UTF-8 failed ****" fi fi if [ -f "po/$d.po" ]; then # ./po/foo.po exists, so let's check if ours matches the latest from the # translation project website REVDATE_NEW=`grep PO-Revision-Date $PO_FILENAME`; REVDATE_OLD=`grep PO-Revision-Date po/$d.po`; CHARSET_OLD=`grep Content-Type po/$d.po | sed -e 's/.*charset=\(.*\)\\\\n.*/\1/'` if test "x$REVDATE_NEW" = "x$REVDATE_OLD" -a "x$CHARSET_OLD" = "xUTF-8"; then # note: source code line markers will be removed later by make upload-po echo "$d.po: up-to-date" rm -f $PO_FILENAME else mv $PO_FILENAME "po/$d.po" if test "x$CHARSET_OLD" != "xUTF-8" -a "x$CHARSET_OLD" != "xutf-8"; then echo "$d.po: update (and charset converted from $CHARSET_OLD to UTF-8)" else echo "$d.po: updated" fi DOMAINS_UPDATED="$DOMAINS_UPDATED $d" fi # make sure domain is listed in LINGUAS if ! grep $d "po/LINGUAS" >/dev/null 2>/dev/null; then DOMAINS_NOT_IN_LINGUAS="$DOMAINS_NOT_IN_LINGUAS $d" fi else # ./po/foo.po doesn't exist, but foo.po exists on the translation project # website, so it's probably a new translation echo "$d.po: new language" mv $PO_FILENAME "po/$d.po" DOMAINS_UPDATED="$DOMAINS_UPDATED $d" DOMAINS_TO_ADD="$DOMAINS_TO_ADD $d" fi else rm -f $PO_FILENAME echo "$d.po: failure (does probably not exist)" fi done if [ -n "$DOMAINS_UPDATED" ]; then echo "====================================================================" echo echo "Language domains updated :$DOMAINS_UPDATED" echo "Language domains to git add :$DOMAINS_TO_ADD" echo echo "Source: http://translationproject.org/latest/$PACKAGE/" echo if [ -n "$DOMAINS_TO_ADD" ]; then CMD_STRING="git add" for d in $DOMAINS_TO_ADD; do CMD_STRING="$CMD_STRING po/$d.po" done echo "Please run" echo echo " $CMD_STRING" echo echo "now and add the following domains to the po/LINGUAS file:" echo echo " $DOMAINS_TO_ADD" echo echo fi echo "====================================================================" fi if [ -n "$DOMAINS_NOT_IN_LINGUAS" ]; then echo echo "Existing domains missing from the po/LINGUAS file:" echo echo " $DOMAINS_NOT_IN_LINGUAS" echo echo fi gst-plugins-good-0.10.31/common/gst-indent0000755000175000017500000000222711671200067015274 00000000000000#!/bin/sh # # Check that the code follows a consistant code style # # Check for existence of indent, and error out if not present. # On some *bsd systems the binary seems to be called gnunindent, # so check for that first. version=`gnuindent --version 2>/dev/null` if test "x$version" = "x"; then version=`indent --version 2>/dev/null` if test "x$version" = "x"; then echo "GStreamer git pre-commit hook:" echo "Did not find GNU indent, please install it before continuing." exit 1 fi INDENT=indent else INDENT=gnuindent fi case `$INDENT --version` in GNU*) ;; default) echo "GStreamer git pre-commit hook:" echo "Did not find GNU indent, please install it before continuing." echo "(Found $INDENT, but it doesn't seem to be GNU indent)" exit 1 ;; esac INDENT_PARAMETERS="--braces-on-if-line \ --case-brace-indentation0 \ --case-indentation2 \ --braces-after-struct-decl-line \ --line-length80 \ --no-tabs \ --cuddle-else \ --dont-line-up-parentheses \ --continuation-indentation4 \ --honour-newlines \ --tab-size8 \ --indent-level2 \ --leave-preprocessor-space" $INDENT ${INDENT_PARAMETERS} $@ gst-plugins-good-0.10.31/common/Makefile.am0000644000175000017500000000102711671200067015323 00000000000000SUBDIRS = m4 EXTRA_DIST = \ ChangeLog \ gettext.patch \ glib-gen.mak gtk-doc.mak upload-doc.mak \ cruft.mak release.mak win32.mak po.mak \ parallel-subdirs.mak \ gst-autogen.sh \ check-exports \ c-to-xml.py mangle-tmpl.py scangobj-merge.py \ gtk-doc-plugins.mak \ plugins.xsl gstdoc-scangobj \ gst.supp check.mak \ coverage/lcov.mak \ coverage/coverage-report.pl \ coverage/coverage-report.xsl \ coverage/coverage-report-entry.pl \ download-translations \ extract-release-date-from-doap-file \ gst-indent \ orc.mak gst-plugins-good-0.10.31/common/win32.mak0000644000175000017500000000472711671200067014735 00000000000000# various tests to make sure we dist the win32 stuff (for MSVC builds) right # the MANIFEST contains all win32 related files that should be disted win32 = $(shell cat $(top_srcdir)/win32/MANIFEST) # wildcard is apparently not portable to other makes, hence the use of find # these are library .def files with the symbols to export win32defs = $(shell find $(top_srcdir)/win32/common -name '*.def') # wildcard is apparently not portable to other makes, hence the use of find # these are files that need to be disted with CRLF line endings: win32crlf = $(shell find $(top_srcdir)/win32 -name '*.dsw' -o -name '*.dsp') win32-debug: @echo; \ echo win32 = $(win32); \ echo; \ echo win32defs = $(win32defs); \ echo; \ echo win32crlf = $(win32crlf); \ echo win32-check-crlf: @echo Checking win32 files for CR LF line endings ...; \ fail=0 ; \ for each in $(win32crlf) ; do \ result=`perl -e 'print grep(/\r\n/,<>)' "$$each" | wc -l`; \ if test "$$result" = 0 ; then \ echo $$each must be fixed to have CRLF line endings ; \ fail=1; \ fi ; \ done ; \ exit $$fail # make sure all symbols we export on linux are defined in the win32 .def too # (don't care about other unixes for now, it's enough if it works on one of # the linux build bots; we assume .so ) check-exports: @fail=0 ; \ for l in $(win32defs); do \ libbase=`basename "$$l" ".def"`; \ libso=`find "$(top_builddir)" -name "$$libbase-@GST_MAJORMINOR@.so" | grep -v /_build/ | head -n1`; \ libdef="$(top_srcdir)/win32/common/$$libbase.def"; \ if test "x$$libso" != "x"; then \ echo Checking symbols in $$libso; \ if ! ($(top_srcdir)/common/check-exports $$libdef $$libso) ; then \ fail=1; \ fi; \ fi; \ done ; \ if test $$fail != 0; then \ echo '-----------------------------------------------------------'; \ echo 'Run this to update the .def files:'; \ echo 'make check-exports 2>&1 | patch -p1'; \ echo '-----------------------------------------------------------'; \ fi; \ exit $$fail # complain about nonportable printf format strings (%lld, %llu, %zu etc.) check-nonportable-print-format: @fail=0 ; \ loc=`find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'`; \ if test "x$$loc" != "x"; then \ echo "Please fix the following print format strings:" ; \ find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'; \ fail=1; \ fi; \ exit $$fail dist-hook: check-exports win32-check-crlf gst-plugins-good-0.10.31/common/coverage/0000755000175000017500000000000011720565344015151 500000000000000gst-plugins-good-0.10.31/common/coverage/coverage-report.pl0000644000175000017500000001042711671200067020527 00000000000000#!/usr/bin/perl # # Copyright (C) 2006 Daniel Berrange # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA use warnings; use strict; my %coverage = ( functions => {}, files => {} ); my %filemap; my $type; my $name; my @functions; while (<>) { if (/^Function '(.*)'\s*$/) { $type = "function"; $name = $1; $coverage{$type}->{$name} = {}; push @functions, $name; } elsif (/^File '(.*?)'\s*$/) { $type = "file"; $name = $1; $coverage{$type}->{$name} = {}; foreach my $func (@functions) { $coverage{"function"}->{$func}->{file} = $name; } @functions = (); } elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) { $coverage{$type}->{$name}->{lines} = $2; $coverage{$type}->{$name}->{linesCoverage} = $1; } elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) { $coverage{$type}->{$name}->{branches} = $2; $coverage{$type}->{$name}->{branchesCoverage} = $1; } elsif (/^Taken at least once:(.*)%\s*of\s*(\d+)\s*$/) { $coverage{$type}->{$name}->{conds} = $2; $coverage{$type}->{$name}->{condsCoverage} = $1; } elsif (/^Calls executed:(.*)%\s*of\s*(\d+)\s*$/) { $coverage{$type}->{$name}->{calls} = $2; $coverage{$type}->{$name}->{callsCoverage} = $1; } elsif (/^No branches$/) { $coverage{$type}->{$name}->{branches} = 0; $coverage{$type}->{$name}->{branchesCoverage} = "100.00"; $coverage{$type}->{$name}->{conds} = 0; $coverage{$type}->{$name}->{condsCoverage} = "100.00"; } elsif (/^No calls$/) { $coverage{$type}->{$name}->{calls} = 0; $coverage{$type}->{$name}->{callsCoverage} = "100.00"; } elsif (/^\s*(.*):creating '(.*)'\s*$/) { $filemap{$1} = $2; } elsif (/^\s*$/) { # nada } else { warn "Shit [$_]\n"; } } my %summary; foreach my $type ("function", "file") { $summary{$type} = {}; foreach my $m ("lines", "branches", "conds", "calls") { my $totalGot = 0; my $totalMiss = 0; my $count = 0; foreach my $func (keys %{$coverage{function}}) { $count++; my $got = $coverage{function}->{$func}->{$m}; $totalGot += $got; my $miss = $got * $coverage{function}->{$func}->{$m ."Coverage"} / 100; $totalMiss += $miss; } $summary{$type}->{$m} = sprintf("%d", $totalGot); $summary{$type}->{$m . "Coverage"} = sprintf("%.2f", $totalMiss / $totalGot * 100); } } print "\n"; foreach my $type ("function", "file") { printf "<%ss>\n", $type; foreach my $name (sort { $a cmp $b } keys %{$coverage{$type}}) { my $rec = $coverage{$type}->{$name}; printf " \n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}}); printf " \n", $rec->{lines}, $rec->{linesCoverage}; if (exists $rec->{branches}) { printf " \n", $rec->{branches}, $rec->{branchesCoverage}; } if (exists $rec->{conds}) { printf " \n", $rec->{conds}, $rec->{condsCoverage}; } if (exists $rec->{calls}) { printf " \n", $rec->{calls}, $rec->{callsCoverage}; } print " \n"; } printf " \n"; printf " \n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage}; printf " \n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage}; printf " \n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage}; printf " \n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage}; printf " \n"; printf "\n", $type; } print "\n"; gst-plugins-good-0.10.31/common/coverage/coverage-report-entry.pl0000644000175000017500000000360211671200067021663 00000000000000#!/usr/bin/perl # # Copyright (C) 2006 Daniel Berrange # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA print < Coverage report for $ARGV[0]

Coverage report for $ARGV[0]

EOF


while (<>) {
    s/&/&/g;
    s//>/g;

    if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
	my $class = $2 > 0 ? "perfect" : "terrible";
	$_ = "$_";
    } elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
	my $class = $1 > 0 ? "perfect" : "terrible";
	$_ = "$_";
    } elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
	my $class = "terrible";
	$_ = "$_";
    } elsif (/^\s*call\s+\d+\s+never executed.*$/) {
	my $class = "terrible";
	$_ = "$_";
    } elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
	my $class = $1 > 0 ? "perfect" : "terrible";
	$_ = "$_";
    }

    print;
}

print <


EOF
gst-plugins-good-0.10.31/common/coverage/coverage-report.xsl0000644000175000017500000001551611671200067020726 00000000000000



  

  
    
      
        Coverage report
        
      
      
        

Coverage report

Function coverage

File coverage

odd even odd even
Name Lines Branches Conditions Calls
Summary perfect excellant good poor bad terrible % of gst-plugins-good-0.10.31/common/coverage/lcov.mak0000644000175000017500000000251611671200067016523 00000000000000## .PHONY so it always rebuilds it .PHONY: lcov-reset lcov lcov-run lcov-report lcov-upload # run lcov from scratch, always lcov-reset: $(MAKE) lcov-run $(MAKE) lcov-report # run lcov from scratch if the dir is not there lcov: $(MAKE) lcov-reset if GST_GCOV_ENABLED # reset run coverage tests lcov-run: @-rm -rf lcov lcov --directory . --zerocounters -if test -d tests/check; then $(MAKE) -C tests/check inspect; fi -$(MAKE) check # generate report based on current coverage data lcov-report: mkdir lcov lcov --compat-libtool --directory . --capture --output-file lcov/lcov.info lcov --list-full-path -l lcov/lcov.info | grep -v "`cd $(top_srcdir) && pwd`" | cut -d\| -f1 > lcov/remove lcov --list-full-path -l lcov/lcov.info | grep "tests/check/" | cut -d\| -f1 >> lcov/remove lcov --list-full-path -l lcov/lcov.info | grep "docs/plugins/" | cut -d\| -f1 >> lcov/remove lcov -r lcov/lcov.info `cat lcov/remove` > lcov/lcov.cleaned.info rm lcov/remove mv lcov/lcov.cleaned.info lcov/lcov.info genhtml -t "$(PACKAGE_STRING)" -o lcov --num-spaces 2 lcov/lcov.info lcov-upload: lcov rsync -rvz -e ssh --delete lcov/* gstreamer.freedesktop.org:/srv/gstreamer.freedesktop.org/www/data/coverage/lcov/$(PACKAGE) else lcov-run: echo "Need to reconfigure with --enable-gcov" lcov-report: echo "Need to reconfigure with --enable-gcov" endif gst-plugins-good-0.10.31/common/parallel-subdirs.mak0000644000175000017500000000066311671200067017233 00000000000000# include this at the end of $MODULE/ext/Makefile.am to force make to # build subdirectories in parallel when make -jN is used. We will end up # descending into all subdirectories a second time, but only after the first # (parallel) run has finished, so it should go right through the second time. .PHONY: independent-subdirs $(SUBDIRS) independent-subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ all-recursive: independent-subdirs gst-plugins-good-0.10.31/common/scangobj-merge.py0000755000175000017500000002241311677341671016546 00000000000000#!/usr/bin/python # -*- Mode: Python -*- # vi:si:et:sw=4:sts=4:ts=4 """ parse, merge and write gstdoc-scanobj files """ import sys import os def debug(*args): pass # OrderedDict class based on # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 # Licensed under the Python License class OrderedDict(dict): def __init__(self): self._keys = [] dict.__init__(self) def __delitem__(self, key): dict.__delitem__(self, key) self._keys.remove(key) def __setitem__(self, key, item): dict.__setitem__(self, key, item) if key not in self._keys: self._keys.append(key) def clear(self): dict.clear(self) self._keys = [] def copy(self): dict = dict.copy(self) dict._keys = self._keys[:] return dict def items(self): return zip(self._keys, self.values()) def keys(self): return self._keys def popitem(self): try: key = self._keys[-1] except IndexError: raise KeyError('dictionary is empty') val = self[key] del self[key] return (key, val) def setdefault(self, key, failobj = None): dict.setdefault(self, key, failobj) if key not in self._keys: self._keys.append(key) def update(self, dict): dict.update(self, dict) for key in dict.keys(): if key not in self._keys: self._keys.append(key) def values(self): return map(self.get, self._keys) class Object: def __init__(self, name): self._signals = OrderedDict() self._args = OrderedDict() self.name = name def __repr__(self): return "" % self.name def add_signal(self, signal, overwrite=True): if not overwrite and self._signals.has_key(signal.name): raise IndexError, "signal %s already in %r" % (signal.name, self) self._signals[signal.name] = signal def add_arg(self, arg, overwrite=True): if not overwrite and self._args.has_key(arg.name): raise IndexError, "arg %s already in %r" % (arg.name, self) self._args[arg.name] = arg class Docable: def __init__(self, **kwargs): for key in self.attrs: setattr(self, key, kwargs[key]) self.dict = kwargs def __repr__(self): return "<%r %s>" % (str(self.__class__), self.name) class Signal(Docable): attrs = ['name', 'returns', 'args'] class Arg(Docable): attrs = ['name', 'type', 'range', 'flags', 'nick', 'blurb', 'default'] class GDoc: def load_file(self, filename): try: lines = open(filename).readlines() self.load_data("".join(lines)) except IOError: print "WARNING - could not read from %s" % filename def save_file(self, filename, backup=False): """ Save the information to the given file if the file content changed. """ olddata = None try: lines = open(filename).readlines() olddata = "".join(lines) except IOError: print "WARNING - could not read from %s" % filename newdata = self.get_data() if olddata and olddata == newdata: return if olddata: if backup: os.rename(filename, filename + '.bak') handle = open(filename, "w") handle.write(newdata) handle.close() class Signals(GDoc): def __init__(self): self._objects = OrderedDict() def load_data(self, data): """ Load the .signals lines, creating our list of objects and signals. """ import re smatcher = re.compile( '(?s)' # make . match \n '\n(.*?)\n' ) nmatcher = re.compile( '' '(?P\S*)' # store object '::' '(?P\S*)' # store signal '' ) rmatcher = re.compile( '(?s)' # make . match \n '(?P\S*)\n' # store returns '(?P.*)' # store args ) for block in smatcher.findall(data): nmatch = nmatcher.search(block) if nmatch: o = nmatch.group('object') debug("Found object", o) debug("Found signal", nmatch.group('signal')) if not self._objects.has_key(o): object = Object(o) self._objects[o] = object rmatch = rmatcher.search(block) if rmatch: dict = rmatch.groupdict().copy() dict['name'] = nmatch.group('signal') signal = Signal(**dict) self._objects[o].add_signal(signal) def get_data(self): lines = [] for o in self._objects.values(): for s in o._signals.values(): block = """ %(object)s::%(name)s %(returns)s %(args)s """ d = s.dict.copy() d['object'] = o.name lines.append(block % d) return "\n".join(lines) + '\n' class Args(GDoc): def __init__(self): self._objects = OrderedDict() def load_data(self, data): """ Load the .args lines, creating our list of objects and args. """ import re amatcher = re.compile( '(?s)' # make . match \n '\n(.*?)\n' ) nmatcher = re.compile( '' '(?P\S*)' # store object '::' '(?P\S*)' # store arg '' ) rmatcher = re.compile( '(?s)' # make . match \n '(?P\S*)\n' # store type '(?P.*?)\n' # store range '(?P\S*)\n' # store flags '(?P.*?)\n' # store nick '(?P.*?)\n' # store blurb '(?P.*?)\n' # store default ) for block in amatcher.findall(data): nmatch = nmatcher.search(block) if nmatch: o = nmatch.group('object') debug("Found object", o) debug("Found arg", nmatch.group('arg')) if not self._objects.has_key(o): object = Object(o) self._objects[o] = object rmatch = rmatcher.search(block) if rmatch: dict = rmatch.groupdict().copy() dict['name'] = nmatch.group('arg') arg = Arg(**dict) self._objects[o].add_arg(arg) else: print "ERROR: could not match arg from block %s" % block def get_data(self): lines = [] for o in self._objects.values(): for a in o._args.values(): block = """ %(object)s::%(name)s %(type)s %(range)s %(flags)s %(nick)s %(blurb)s %(default)s """ d = a.dict.copy() d['object'] = o.name lines.append(block % d) return "\n".join(lines) + '\n' class SingleLine(GDoc): def __init__(self): self._objects = [] def load_data(self, data): """ Load the .interfaces/.prerequisites lines, merge duplicates """ # split data on '\n' lines = data.splitlines(); # merge them into self._objects for line in lines: if line not in self._objects: self._objects.append(line) def get_data(self): lines = sorted(self._objects) return "\n".join(lines) + '\n' def main(argv): modulename = None try: modulename = argv[1] except IndexError: sys.stderr.write('Please provide a documentation module name\n') sys.exit(1) signals = Signals() signals.load_file(modulename + '.signals') signals.load_file(modulename + '.signals.new') signals.save_file(modulename + '.signals', backup=True) os.unlink(modulename + '.signals.new') args = Args() args.load_file(modulename + '.args') args.load_file(modulename + '.args.new') args.save_file(modulename + '.args', backup=True) os.unlink(modulename + '.args.new') ifaces = SingleLine() ifaces.load_file(modulename + '.interfaces') ifaces.load_file(modulename + '.interfaces.new') ifaces.save_file(modulename + '.interfaces', backup=True) os.unlink(modulename + '.interfaces.new') prereq = SingleLine() prereq.load_file(modulename + '.prerequisites') prereq.load_file(modulename + '.prerequisites.new') prereq.save_file(modulename + '.prerequisites', backup=True) os.unlink(modulename + '.prerequisites.new') main(sys.argv) gst-plugins-good-0.10.31/common/gst-autogen.sh0000644000175000017500000002435711671200067016073 00000000000000# a silly hack that generates autoregen.sh but it's handy # Remove the old autoregen.sh first to create a new file, # as the current one may be being read by the shell executing # this script. if [ -f "autoregen.sh" ]; then rm autoregen.sh fi echo "#!/bin/sh" > autoregen.sh echo "./autogen.sh $@ \$@" >> autoregen.sh chmod +x autoregen.sh # helper functions for autogen.sh debug () # print out a debug message if DEBUG is a defined variable { if test ! -z "$DEBUG" then echo "DEBUG: $1" fi } version_get () # based on the command's version output, set variables # _MAJOR, _MINOR, _MICRO, _VERSION, using the given prefix as variable prefix # # arg 1: command binary name # arg 2: (uppercased) variable name prefix { COMMAND=$1 VARPREFIX=`echo $2 | tr .,- _` # strip everything that's not a digit, then use cut to get the first field pkg_version=`$COMMAND --version|head -n 1|sed 's/^.*)[^0-9]*//'|cut -d' ' -f1` debug "pkg_version $pkg_version" # remove any non-digit characters from the version numbers to permit numeric # comparison pkg_major=`echo $pkg_version | cut -d. -f1 | sed s/[a-zA-Z\-].*//g` pkg_minor=`echo $pkg_version | cut -d. -f2 | sed s/[a-zA-Z\-].*//g` pkg_micro=`echo $pkg_version | cut -d. -f3 | sed s/[a-zA-Z\-].*//g` test -z "$pkg_major" && pkg_major=0 test -z "$pkg_minor" && pkg_minor=0 test -z "$pkg_micro" && pkg_micro=0 debug "found major $pkg_major minor $pkg_minor micro $pkg_micro" eval ${VARPREFIX}_MAJOR=$pkg_major eval ${VARPREFIX}_MINOR=$pkg_minor eval ${VARPREFIX}_MICRO=$pkg_micro eval ${VARPREFIX}_VERSION=$pkg_version } version_compare () # Checks whether the version of VARPREFIX is equal to or # newer than the requested version # arg1: VARPREFIX # arg2: MAJOR # arg3: MINOR # arg4: MICRO { VARPREFIX=`echo $1 | tr .,- _` MAJOR=$2 MINOR=$3 MICRO=$4 eval pkg_major=\$${VARPREFIX}_MAJOR; eval pkg_minor=\$${VARPREFIX}_MINOR; eval pkg_micro=\$${VARPREFIX}_MICRO; #start checking the version debug "version_compare: $VARPREFIX against $MAJOR.$MINOR.$MICRO" # reset check WRONG= if [ ! "$pkg_major" -gt "$MAJOR" ]; then debug "major: $pkg_major <= $MAJOR" if [ "$pkg_major" -lt "$MAJOR" ]; then debug "major: $pkg_major < $MAJOR" WRONG=1 elif [ ! "$pkg_minor" -gt "$MINOR" ]; then debug "minor: $pkg_minor <= $MINOR" if [ "$pkg_minor" -lt "$MINOR" ]; then debug "minor: $pkg_minor < $MINOR" WRONG=1 elif [ "$pkg_micro" -lt "$MICRO" ]; then debug "micro: $pkg_micro < $MICRO" WRONG=1 fi fi fi if test ! -z "$WRONG"; then debug "version_compare: $VARPREFIX older than $MAJOR.$MINOR.$MICRO" return 1 fi debug "version_compare: $VARPREFIX equal to/newer than $MAJOR.$MINOR.$MICRO" return 0 } version_check () # check the version of a package # first argument : package name (executable) # second argument : optional path where to look for it instead # third argument : source download url # rest of arguments : major, minor, micro version # all consecutive ones : suggestions for binaries to use # (if not specified in second argument) { PACKAGE=$1 PKG_PATH=$2 URL=$3 MAJOR=$4 MINOR=$5 MICRO=$6 # for backwards compatibility, we let PKG_PATH=PACKAGE when PKG_PATH null if test -z "$PKG_PATH"; then PKG_PATH=$PACKAGE; fi debug "major $MAJOR minor $MINOR micro $MICRO" VERSION=$MAJOR if test ! -z "$MINOR"; then VERSION=$VERSION.$MINOR; else MINOR=0; fi if test ! -z "$MICRO"; then VERSION=$VERSION.$MICRO; else MICRO=0; fi debug "major $MAJOR minor $MINOR micro $MICRO" for SUGGESTION in $PKG_PATH; do COMMAND="$SUGGESTION" # don't check if asked not to test -z "$NOCHECK" && { printf " checking for $COMMAND >= $VERSION ... " } || { # we set a var with the same name as the package, but stripped of # unwanted chars VAR=`echo $PACKAGE | sed 's/-//g'` debug "setting $VAR" eval $VAR="$COMMAND" return 0 } which $COMMAND > /dev/null 2>&1 if test $? -eq 1; then debug "$COMMAND not found" continue fi VARPREFIX=`echo $COMMAND | sed 's/-//g' | tr [:lower:] [:upper:]` version_get $COMMAND $VARPREFIX version_compare $VARPREFIX $MAJOR $MINOR $MICRO if test $? -ne 0; then echo "found $pkg_version, not ok !" continue else echo "found $pkg_version, ok." # we set a var with the same name as the package, but stripped of # unwanted chars VAR=`echo $PACKAGE | sed 's/-//g'` debug "setting $VAR" eval $VAR="$COMMAND" return 0 fi done echo "$PACKAGE not found !" echo "You must have $PACKAGE installed to compile $package." echo "Download the appropriate package for your distribution," echo "or get the source tarball at $URL" return 1; } aclocal_check () { # normally aclocal is part of automake # so we expect it to be in the same place as automake # so if a different automake is supplied, we need to adapt as well # so how's about replacing automake with aclocal in the set var, # and saving that in $aclocal ? # note, this will fail if the actual automake isn't called automake* # or if part of the path before it contains it if [ -z "$automake" ]; then echo "Error: no automake variable set !" return 1 else aclocal=`echo $automake | sed s/automake/aclocal/` debug "aclocal: $aclocal" if [ "$aclocal" != "aclocal" ]; then CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-aclocal=$aclocal" fi if [ ! -x `which $aclocal` ]; then echo "Error: cannot execute $aclocal !" return 1 fi fi } autoheader_check () { # same here - autoheader is part of autoconf # use the same voodoo if [ -z "$autoconf" ]; then echo "Error: no autoconf variable set !" return 1 else autoheader=`echo $autoconf | sed s/autoconf/autoheader/` debug "autoheader: $autoheader" if [ "$autoheader" != "autoheader" ]; then CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader" fi if [ ! -x `which $autoheader` ]; then echo "Error: cannot execute $autoheader !" return 1 fi fi } autoconf_2_52d_check () { # autoconf 2.52d has a weird issue involving a yes:no error # so don't allow it's use test -z "$NOCHECK" && { ac_version=`$autoconf --version|head -n 1|sed 's/^[a-zA-Z\.\ ()]*//;s/ .*$//'` if test "$ac_version" = "2.52d"; then echo "autoconf 2.52d has an issue with our current build." echo "We don't know who's to blame however. So until we do, get a" echo "regular version. RPM's of a working version are on the gstreamer site." exit 1 fi } return 0 } libtool_2_2_gettext_check () { # libtool 2.2 needs autopoint 0.17 or higher version_compare LIBTOOLIZE 2 2 0 if test $? -eq 0 then version_compare AUTOPOINT 0 17 0 if test $? -ne 0 then echo "libtool 2.2 requires autopoint 0.17 or higher" return 1 fi fi return 0 } die_check () { # call with $DIE # if set to 1, we need to print something helpful then die DIE=$1 if test "x$DIE" = "x1"; then echo echo "- Please get the right tools before proceeding." echo "- Alternatively, if you're sure we're wrong, run with --nocheck." exit 1 fi } autogen_options () { if test "x$1" = "x"; then return 0 fi while test "x$1" != "x" ; do optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` case "$1" in --noconfigure) NOCONFIGURE=defined AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --noconfigure" echo "+ configure run disabled" shift ;; --nocheck) AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --nocheck" NOCHECK=defined echo "+ autotools version check disabled" shift ;; -d|--debug) DEBUG=defined AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug" echo "+ debug output enabled" shift ;; -h|--help) echo "autogen.sh (autogen options) -- (configure options)" echo "autogen.sh help options: " echo " --noconfigure don't run the configure script" echo " --nocheck don't do version checks" echo " --debug debug the autogen process" echo echo " --with-autoconf PATH use autoconf in PATH" echo " --with-automake PATH use automake in PATH" echo echo "Any argument either not in the above list or after a '--' will be " echo "passed to ./configure." exit 1 ;; --with-automake=*) AUTOMAKE=$optarg echo "+ using alternate automake in $optarg" CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-automake=$AUTOMAKE" shift ;; --with-autoconf=*) AUTOCONF=$optarg echo "+ using alternate autoconf in $optarg" CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF" shift ;; --) shift ; break ;; *) echo "+ passing argument $1 to configure" CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1" shift ;; esac done for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done if test ! -z "$CONFIGURE_EXT_OPT" then echo "+ options passed to configure: $CONFIGURE_EXT_OPT" fi } toplevel_check () { srcfile=$1 test -f $srcfile || { echo "You must run this script in the top-level $package directory" exit 1 } } tool_run () { tool=$1 options=$2 run_if_fail=$3 echo "+ running $tool $options..." $tool $options || { echo echo $tool failed eval $run_if_fail exit 1 } } install_git_hooks () { if test -d .git; then # install pre-commit hook for doing clean commits for hook in pre-commit; do if test ! \( -x .git/hooks/$hook -a -L .git/hooks/$hook \); then echo "+ Installing git $hook hook" rm -f .git/hooks/$hook ln -s ../../common/hooks/$hook.hook .git/hooks/$hook || { # if we couldn't create a symbolic link, try doing a plain cp if cp common/hooks/pre-commit.hook .git/hooks/pre-commit; then chmod +x .git/hooks/pre-commit; else echo "********** Couldn't install git $hook hook **********"; fi } fi done fi } gst-plugins-good-0.10.31/common/check-exports0000755000175000017500000000411111701411037015764 00000000000000#!/bin/sh # check-exports # # quick'n'dirty script that retrieves the list of exported symbols of a given # library using 'nm', and compares that against the list of symbols-to-export # of our win32/common/libfoo.def files. if [ $# -ne 2 ]; then echo "Usage: $0 library.def library.so" exit 1 fi def_path="$1" def_name="$(basename $def_path)" lib_path="$2" lib_result="`mktemp /tmp/defname.XXXXXX`" LC_ALL=C export LC_ALL # On Solaris, add -p to get the correct output format NMARGS= if nm -V 2>&1 |grep Solaris > /dev/null; then NMARGS=-p fi # FIXME 0.11: in 0.11, we should change the export filter to only export # _gst_foo, but not __gst_foo (we can't change this now, since we added # __gst_debug_min and __gst_debug_enabled at some point and need to keep # ABI compatibility). So below we special-case some symbols that shouldn't # really be exported, either because we're too lazy to rename them to something # that's not exported (like the _gst_parse_* stuff) or because we had them in # public headers at some point although they shouldn't be and so we need to # keep them exported now (like _gst_debug_init, # __gst_element_factory_add_interface or # __gst_element_factory_add_static_pad_template). We suppress them here to # make sure they're at least not exported in the windows msvc build (they # were never in the .def file, so they never got exported). # _end is special cased because for some reason it is reported as an exported # BSS symbol, unlike on linux where it's a local absolute symbol. nm $NMARGS $lib_path | awk \ '{ if ($3 !~ /^_gst_[a-z]*_init/ && \ $3 !~ /^__gst_element_details_/ && \ $3 !~ /^__gst_element_factory_add_/ && \ $3 !~ /^gst_interfaces_marshal/ && \ $3 ~ /^[_]*(gst_|Gst|GST_).*/) { if ($2 ~ /^[BSDG]$/) print "\t" $3 " DATA" else if ($2 == "T") print "\t" $3 } }' | sort | awk '{ if (NR == 1) print "EXPORTS"; print $0; }' \ > $lib_result diffoutput=`diff -u $def_path $lib_result` diffresult=$? rm $lib_result if test "$diffresult" -eq 0; then exit 0; else echo -n "$diffoutput" >&2 echo >&2 exit 1; fi gst-plugins-good-0.10.31/common/plugins.xsl0000644000175000017500000001774111671200067015512 00000000000000 -plugins- Element Information plugin plugin- author class Element Pads name direction presence details -plugins-plugin- 3 FIXME Library plugin- Plugin Information filename version run-time license package origin Elements gst-plugins-good-0.10.31/common/gettext.patch0000644000175000017500000000047511671200067016002 00000000000000--- po/Makefile.in.in.orig 2006-01-07 12:03:45.000000000 +0100 +++ po/Makefile.in.in 2006-01-07 12:04:23.000000000 +0100 @@ -11,6 +11,9 @@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ +# thomas: add GETTEXT_PACKAGE substitution as used in Makevars +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ + SHELL = /bin/sh @SET_MAKE@ gst-plugins-good-0.10.31/common/ChangeLog0000644000175000017500000014331311671200067015046 000000000000002008-12-17 Edward Hervey * gst.supp: And yet another variation of the GstAudioFilter leak. 2008-12-15 Sebastian Dröge Patch by: Roland Illig * m4/gst-parser.m4: Fix AG_GST_BISON_CHECK to handle version numbers with more than two components (i.e. 2.4.1). Fixes bug #564507. 2008-12-14 Edward Hervey * gst.supp: And yet another variant of the GstAudioFilter leak. 2008-12-13 Edward Hervey * gst.supp: Added variants of leaks of dynamic pad templates created in GstAudioFilter. Add conditional jump triggered by getaddrinfo (maybe glibc-2.9). 2008-12-12 Edward Hervey * gst.supp: Fix leak in GIO called by gnomevfs. Nothing we can do about this. 2008-12-12 Edward Hervey * gst.supp: Added another suppression for dynamic pad templates, in this case GstAudioFilter. Added suppression for PangoLanguage which can never be freed according to the Pango API. 2008-12-12 Edward Hervey * gst.supp: A whole bunch of suppressions detected on latest gentoo ~amd64. Make some existing suppressions more generic (for subtle dependecy code changes). Added suppressions for glibc-2.9. Added suppressions for new variants of ALSA leaks. Added suppressions for a series of leaks in plugins registrations due to some pad templates' caps calculated at runtime. Added suppressions for variants of some leaks in pango/fontconfig. Added suppressions for leak in gstffmpegcsp.c (nothing we can do about it, but will only exist once). 2008-12-04 Sebastian Dröge * m4/gst-plugin-docs.m4: Remove the check if $have_gtk_doc equals yes as it's not defined and $enable_gtk_doc should be good enough. Also this restores the build of the plugin documentation. 2008-12-01 Mark Nauwelaerts * gst.supp: Add suppression variant for Ubuntu Hardy x86/64bit. 2008-12-01 Stefan Kost * gtk-doc-plugins.mak: * gtk-doc.mak: Simplily uninstall rule. Its closer to upstream and fixes #150331. 2008-11-29 Sebastian Dröge * m4/glib-gettext.m4: Update glib-gettext.m4 from latest stable GLib release. 2008-11-29 Sebastian Dröge Patch by: Cygwin Ports maintainer * gettext.patch: Update the gettext patch for use with gettext 0.17 which is required to build with libtool 2.2 because of conflicts. First part of bug #556091. 2008-11-29 Sebastian Dröge * m4/gtk-doc.m4: * m4/pkg.m4: Update gtk-doc and pkg-config m4 macros from their latest releases. 2008-11-20 Michael Smith * m4/as-objc.m4: Fix objective C test macro when none of the compilers are found at all. 2008-10-30 Stefan Kost * gtk-doc.mak: Also cp the entities here to all xinlcude based docs (workaround for not being able to set up a search path). 2008-10-17 Jan Schmidt * gtk-doc.mak: Don't clobber the real registry cache file when building docs. 2008-10-07 Jan Schmidt - Sun Microsystems * m4/gst-error.m4: Also disable the bogus "loop not entered at top" warnings appearing on Sparc Forte builds. 2008-10-06 Stefan Kost * gtk-doc.mak: Apply the same fix as below to gtk-doc.mak. Somehow did not end up in CVS. 2008-09-05 David Schleef * gtk-doc-plugins.mak: Fix the check for gtkdoc-rebase: don't pass the 'which' error back to make. This fix is more specific than what is in upstream. 2008-09-05 David Schleef * gtk-doc.mak: Fix the check for gtkdoc-rebase: don't pass the 'which' error back to make. This fix is more specific than what is in upstream. 2008-09-04 Stefan Kost * gtk-doc-plugins.mak: * gtk-doc.mak: Get closer to upstream makefiles. Don't install index.sgml twice. Call gtkdoc-rebase (if exists). 2008-08-21 Stefan Kost * gtk-doc-plugins.mak: Revert $(top_builddir) -> $(builddir) change of rev. 1.39 as there is no variable called builddir. 2008-07-31 Mark Nauwelaerts * gst.supp: Add suppressions for Ubunty Hardy x86/64bit, similar to earlier versions and 32bit variant. 2008-07-31 Sebastian Dröge * m4/gst-feature.m4: Remove GST_DISABLE_(ENUMTYPES|INDEX|URI). 2008-07-21 Tim-Philipp Müller * m4/gst-error.m4:: When checking for GST_ERROR_CXXFLAGS, check each compiler flag individually, not all together. 2008-07-20 Tim-Philipp Müller * m4/gst-parser.m4:: Fix bison version number detection for older --version output format (as bison 1.28 on OSX 10.4 outputs). Fixes #543853. 2008-07-12 Stefan Kost * plugins.xsl: Split refsect2 also here to make "Element Pads" subtitle visible. 2008-07-08 Sebastian Dröge * m4/gst-error.m4: Add compiler flags to warn if declarations after statements or variable length arrays are used. These are C99/GCC extensions and are not supported by some compilers we want to support. 2008-07-02 Mark Nauwelaerts * gtk-doc-plugins.mak: Only clean doc maintainer stamps in maintainer-clean. Fixes #539977. 2008-06-20 Sebastian Dröge * gstdoc-scangobj: Always use format strings for printf-like functions, even if they just print a string. Fixes bug #536981. 2008-06-20 Sebastian Dröge * gtk-doc-plugins.mak: * gtk-doc.mak: Include CFLAGS and LDFLAGS in GTKDOC_CFLAGS and GTKDOC_LDFLAGS, otherwise the values passed to configure are ignored. Fixes bug #536978. 2008-06-05 Tim-Philipp Müller * m4/gst-error.m4: Add -fno-strict-aliasing when compiling with -Werror, to work around warnings caused by G_LOCK with recent GLib versions (2.16.x) (#316221). 2008-06-05 Jan Schmidt * gtk-doc.mak: Don't copy html/*.png files unless they don't already exist in the destdir. Fixes distcheck failure caused by permissions problems trying to copy a file into the destdir when it already exists. 2008-05-28 Stefan Kost * plugins.xsl: The class was not shown in plugin docs. Fix typo in changelog below. 2008-05-22 Jan Schmidt * gstdoc-scangobj: Emit warnings if one of the GTypes we're expecting is 0 when scanning. 2008-05-21 Felipe Contreras * gtk-doc-plugins.mak: * gtk-doc.mak: Fix installing png images when gtk-doc is disabled. 2008-05-21 Felipe Contreras * gtk-doc-plugins.mak: * gtk-doc.mak: Fix make clean when gtk-doc is disabled and other cleanups. 2008-05-17 Jan Schmidt * gtk-doc-plugins.mak: Be more quiet when the files don't yet exist. 2008-05-16 Jan Schmidt * gstdoc-scangobj: Add a mechanism for adding 'implicitly created' GTypes into the scan, allowing for documenting plugin-private base classes that provide signals or properties for public elements. * gtk-doc-plugins.mak: Use $(builddir) instead of $(top_builddir) in a few places - there's no need to hard code 'docs/plugins' as the only useable path. 2008-05-14 Peter Kjellerstedt * m4/gst-feature.m4: Report plug-ins without external dependencies that will not be built even when the name of the plug-in is a substring of another plug-in, e.g., goom vs. goom2k1. 2008-05-14 Tim-Philipp Müller * gst.supp: Add suppression for glibc bug on gutsy/x86-64 2008-05-12 Stefan Kost * plugins.xsl: Improve the layout of the caps, but splitting them on ";". 2008-05-09 Sebastian Dröge Patch by: Brian Cameron * m4/gst-default.m4: Don't set the default audio sink to the default visualizer. Fixes bug #532295. 2008-05-07 Tim-Philipp Müller * check.mak: (help): Document GST_CHECKS environment variable in checks 'make help'. 2008-05-06 Sebastian Dröge Patch by: Marc-Andre Lureau * scangobj-merge.py: Don't depend on Twisted just for the OrderedDict but implement our own ordered dictionary class. Fixes bug #531577. 2008-04-23 Edward Hervey * gst.supp: Re-arrange latest suppressions. Add all known suppressions for ubuntu hardy. Same as for older ubuntus, but with different codepaths. 2008-04-22 Edward Hervey * gst.supp: Make tls leak suppression a bit more generic. 2008-04-22 Edward Hervey * gst.supp: Fix ommission in latest commit. Make tls leak suppression more generic in order to cover more distributions (and hopefully also future distributions). 2008-04-22 Edward Hervey * gst.supp: Add suppressions for Hardy. They're just the newer versions of similar suppressions we had for the previous versions of ubuntu. 2008-04-15 Sebastian Dröge * Makefile.am: * m4/Makefile.am: Dist all files in common. Fixes bug #527984. 2008-04-14 Tim-Philipp Müller * m4/gst-function.m4: Rename AC_CACHE_VAL cache-ids to contain '_cv_' in order to make autoconf-2.62 complain less. 2008-04-13 Tim-Philipp Müller * m4/gst-args.m4: * m4/gst-valgrind.m4: Bump valgrind requirement to 3.0 (which was released in August 2005). Fixes #489269. Also, check for version >=REQ and not >REQ. 2008-04-09 Tim-Philipp Müller * m4/gst-default.m4: Add --with-default-{audiosink|audiosrc|videosink|videosrc|visualizer} configure switches (#519417). 2008-04-03 Tim-Philipp Müller * m4/gst-args.m4: Add --disable-foo switch for dependency-less plugins (#525586). 2008-04-01 Sebastian Dröge * m4/gst-parser.m4: Unconditionally require flex 2.5.31 and bison 1.875. 2008-03-23 Sebastian Dröge * m4/gst-arch.m4: amd64/x86_64 allows unaligned memory access too. 2008-03-21 Sebastian Dröge * m4/gst-dowhile.m4: Add macro that checks if the compiler supports do {} while (0) macros and define HAVE_DOWHILE_MACROS if it does. This is needed by glib/gmacros.h to use something else than if (1) else for G_STMT_START/END when compling C++, which causes compiler warnings because of ambigious else with g++ 4.3. 2008-03-21 Sebastian Dröge * m4/gst-plugin-docs.m4: * mangle-tmpl.py: Don't depend on PyXML and use only XML modules that are shipped with python. Fixes bug #519635. 2008-03-07 Edward Hervey * m4/gtk-doc.m4: (GTK_DOC_CHECK): The previous commit to this file by Stefan Kost mentionned checking for SED, but NOT checking for gtkdoc-check (wth is that doing there ??). Therefore, removing the check for gtkdoc-check 2008-03-03 David Schleef * m4/ax_create_stdint_h.m4: Oops, checked in the wrong copy of this file. (Update from upstream) 2008-03-03 David Schleef * m4/ax_create_stdint_h.m4: Update from upstream. Fixes a bug compiling with MSVC. 2008-03-03 Edward Hervey * m4/pkg.m4: Allow override of pkg-config results, as proposed by configure --help. This is in fact just a backport from upstream pkg.m4. Fixes #518892 2008-03-03 Peter Kjellerstedt * ChangeLog: Changelog surgery of my previous commit to add bugzilla reference. * m4/gst-args.m4: Add AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to make it easier to include and exclude plug-ins without external references, i.e., plug-ins listed in GST_PLUGINS_SELECTED. (#498222) 2008-03-03 Sebastian Dröge * gst.supp: Add another glibc suppression. 2008-02-29 Peter Kjellerstedt * m4/gst-feature.m4: Make the comment before defines generated via AG_GST_CHECK_FEATURE look nicer. (#498222) 2008-02-26 Jan Schmidt * m4/Makefile.am: * m4/as-gcc-inline-assembly.m4: Add Dave Schleef's GCC inline assembly detection macro for using in gst-plugins-good in the goom 2k4 plugin. 2008-02-25 Andy Wingo * gst-autogen.sh: Instead of only passing certain arguments to configure, pass anything that we didn't handle. Much friendlier. Fixes #34412. 2008-02-23 Jan Schmidt * m4/gst-error.m4: Store the detected compiler flags into ERROR_CFLAGS rather than ERROR_CXXFLAGS, and use the macro that checks the C compiler, not the C++ one. 2008-02-23 Tim-Philipp Müller * m4/gst-error.m4: Reflow checks for additional warning flags so they're not nested, which fixes the result reporting in the configure output. 2008-02-22 Tim-Philipp Müller * m4/as-compiler-flag.m4: Add AS_CXX_COMPILER_FLAG * m4/gst-error.m4: Add AG_GST_SET_ERROR_CXXFLAGS (Forte bits need testing) 2008-02-22 Tim-Philipp Müller * gtk-doc-plugins.mak: Add 'check-inspected-versions' target; this helps identify files that should have been removed or where the version number should (ideally) be updated before a release (which doesn't happen automatically if the releaser doesn't build that plugin locally). Not adding at a distcheck hook yet though, because it's not really that important and would probably also be a problem on buildbots. 2008-02-22 Sebastian Dröge * gst.supp: Add even more glibc 2.7 suppressions. 2008-02-22 Sebastian Dröge * gst.supp: Add another suppression for GLib caching some values after the first call. 2008-02-12 Sebastian Dröge Patch by: Tim Mooney * m4/gst-error.m4: Use no%E_MACRO_REDEFINED on Solaris to prevent compiler warnings. Fixes bug #515905. 2008-02-11 Sebastian Dröge * gst.supp: Add a few more glibc 2.7 suppressions to make the avisubtitle unit test valgrind clean. Fixes bug #515703. 2008-02-08 Stefan Kost * ChangeLog: Changelog surgery for last commit. 2008-02-08 Stefan Kost * m4/gtk-doc.m4: Conditionally check for SED. Also sync a bit with upstream macro. 2008-02-08 Stefan Kost * gtk-doc-plugins.mak: * gtk-doc.mak: Use '$(SED)' instead of 'sed'. Don't use -i for in-place as its gnu only, move to a temp file instead. 2008-02-06 Stefan Kost * gtk-doc-plugins.mak: * gtk-doc.mak: As our docs are versioned, we need to patch the index.sgml file to have correct paths there, unless we also want to fork gtk-doc's xsl (which we don't). This hopefully fixes xrefs between modules. 2008-02-02 Sebastian Dröge * m4/gst-feature.m4: Use printf instead of echo as "echo -e" isn't POSIX and doesn't work with strict POSIX shells like tcsh or dash and also not every platform has a /bin/echo that supports it. 2008-01-24 Stefan Kost * ChangeLog: ChangeLog surgery. * gstdoc-scangobj: Sync the object scanner with gtk-doc fixes. Update args and hierarchy files. 2008-01-20 Sebastian Dröge * check.mak: * coverage/lcov.mak: * gtk-doc-plugins.mak: * release.mak: Use $(MAKE) instead of make to fix the build if GNU make is called something else on the system. * m4/as-docbook.m4: Fix path for docbook.xsl if we have no /etc/xml/catalog and add a docbook-xsl search path for FreeBSD. 2008-01-18 Sebastian Dröge * gst.supp: Add a suppression for a glibc bug: http://valgrind.org/docs/manual/faq.html#faq.exit_errors> 2008-01-18 Sebastian Dröge * gst.supp: Add some more glibc 2.7 suppressions and make the GLib suppressions for the home/tmp/etc directory caching a bit more generic. 2008-01-18 Sebastian Dröge * gst.supp: Add some glibc 2.7 supressions as found on Debian/unstable. 2008-01-14 Jan Schmidt * download-translations: Apparently I have problems with leaving things commented out when I edit shell scripts. 2008-01-12 Jan Schmidt * download-translations: Remove bash-isms 2008-01-12 Jan Schmidt * check-exports: Restore the cleanup rm of our tmp file which I didn't mean to leave commented out. 2008-01-12 Jan Schmidt * check-exports: Fixes to make check-export work on both Solaris and Linux * m4/gst-error.m4: Disable extra warning category (argument mismatch) as an error on Forte, as it prevents the libcheck fail_if macros from compiling. * win32.mak: Substitute the GStreamer version so things will keep working in 0.11 2008-01-11 Tim-Philipp Müller Patch by: Peter Kjellerstedt * m4/gst-glib2.m4: * m4/gst-libxml2.m4: Improve/fix output from configure if either glib-2.0 or libxml2 are not installed (#498222). 2008-01-09 Stefan Kost * coverage/lcov.mak: Update coverage make-rules: use them conditionaly, use libtool mode and use lcov to cleanup. 2007-12-18 Sebastian Dröge * glib-gen.mak: Also use #include "header" instead of #include
for the headers that were used to generate the source files for the same reason as below. Remove whitespace before #include. 2007-12-18 Sebastian Dröge * glib-gen.mak: Use #include "header" instead of #include
for the generated enum C files as the file will always be in the same directory and some compilers seem to be a bit strict about that unless . is added to the include path. Include all headers that were used to generate the source files in the C file as they're used there. 2007-12-17 Tim-Philipp Müller * win32.mak: (win32), (win32defs), (win32crlf): Make check for CR LF in Visual C++ 6.0 project files work, based on patch by David Schleef (#496722, #393626). 2007-12-17 Tim-Philipp Müller * Makefile.am: Don't forget to dist the new win32.mak. 2007-12-17 Tim-Philipp Müller * win32.mak: (win32), (win32defs): Move common win32 Makefile foo into this new file. 2007-12-15 Stefan Kost * gtk-doc-plugins.mak: * gtk-doc.mak: We should have never forked this that much :/. 2007-12-13 Tim-Philipp Müller * check-exports: Fix build on the ppc64 build bot. 2007-12-13 Tim-Philipp Müller * check-exports: Suppress more unintentional exports (too much hassle to rename them, since the win32 project files would need changing too). 2007-12-12 Tim-Philipp Müller * Makefile.am: check-exports should be disted. 2007-12-12 Tim-Philipp Müller * check-exports: Add quick'n'dirty script to check the exported symbols of a library against the symbols in the corresponding .def file (#493983). Based on script by Ole André Vadla Ravnås. 2007-11-06 Jan Schmidt * gtk-doc-plugins.mak: Fix distcheck by making sure the types files are treated like the other gtkdoc-scangobj generated files. 2007-09-21 Sebastian Dröge * m4/gst-args.m4: Let the AG_GST_ARG_ENABLE_EXPERIMENTAL macro default to disable building of experimental plugins. Nobody uses it yet and the --enable--experimental stuff from gst-plugins-good defaults to disable too. 2007-09-06 Tim-Philipp Müller * gtk-doc-plugins.mak: Just use the normal 'check' target and avoid a circular dependency. 2007-09-06 Tim-Philipp Müller * gtk-doc-plugins.mak: Add rule to error out if .hierarchy file contains tabs. 2007-08-20 Tim-Philipp Müller * download-translations: * po.mak: If there are new languages, they need to be added to po/LINGUAS. 2007-08-20 Tim-Philipp Müller * download-translations: * po.mak: Fix up 'download-po' a bit, so that we find new translations for languages that aren't in our po/LINGUAS file yet too. 2007-07-16 Jan Schmidt * gst.supp: Add a suppression for GLib caching the tmp dir seen on an Ubuntu Feisty system. 2007-07-13 Jan Schmidt * m4/gst-feature.m4: If we want to use 'echo -e', call /bin/echo instead of the shell's since -e is a bash extension, and our /bin/sh might not be being provided by bash. 2007-07-01 Thomas Vander Stichele * po.mak: Translation project has moved. Also, no idea how this used to work given that we weren't downloading a .po file. 2007-06-25 Stefan Kost * gst-xmlinspect.py: * plugins.xsl: Also extract element caps for plugin-docs. Fixes parts of #117692. 2007-06-21 Tim-Philipp Müller Patch by: Andreas Schwab * m4/gst-feature.m4: Fix quoting (#449493). 2007-06-10 Sebastian Dröge * m4/gst-parser.m4: Only generate the parser if bison >= 1.875 _and_ flex >= 2.5.31 is installed and use pre-generated sources otherwise. Fixes bug #444820. 2007-05-11 Michael Smith * gst.supp: Suppression variant for our good friend the TLS leak, this time for Ubuntu Feisty/x86. 2007-05-09 Tim-Philipp Müller * gtk-doc-plugins.mak: Fix make distcheck again; change some spaces to tabs in makefile. 2007-04-29 Thomas Vander Stichele * gtk-doc-plugins.mak (-module): Error out when the html build step gives warnings, so they get fixed properly. 2007-04-23 Stefan Kost * m4/gst-feature.m4: Add macro AG_GST_PARSE_SUBSYSTEM_DISABLES that checks the defines in the configuration header and AC_DEFINES the setings. 2007-04-19 Sebastian Dröge Patch by: Vincent Torri * m4/gst-parser.m4: Put the AC_MSG_RESULT output in brackets to get it properly written to the terminal. 2007-04-18 Sebastian Dröge * m4/gst-parser.m4: Check for flex >= 2.5.31 and set GENERATE_PARSER if we have at least that version. Otherwise use pre-generated parser sources as we can't raise the required flex version. HAVE_MT_SAVE_FLEX is obsolete now as we use a new enough flex version anyway. First part of #349180 2007-04-10 Thomas Vander Stichele * m4/gst-check.m4: Allow pre-setting the GST(PB)_TOOLS/PLUGINS_DIR variables to help builds against older GStreamer. 2007-03-25 Sebastian Dröge * m4/gst-parser.m4: Fix the flex version check. It ignored the micro version before. 2007-03-09 Jan Schmidt * check.mak: Use the same timeout when generating valgrind suppressions as running the valgrind test. * gst.supp: Add some more suppressions and stuff. 2007-03-08 Jan Schmidt * check.mak: Make sure GSlice is disabled when building suppressions too. * gst.supp: Add around *850* lines of suppressions for one-time initialisations inside libasound and gconf/bonobo/ORBit. I feel so dirty. 2007-03-07 Jan Schmidt * gst.supp: add a suppression for this GConf flup on the FC5 buildbot. 2007-03-06 Jan Schmidt * gst.supp: Make the suppression a little more generic, to catch the FC5 backtrace too. 2007-03-06 Jan Schmidt * gst.supp: Add a suppression for libcdio 0.76. It leaks an internal struct when the CD-ROM device is not accessible. 2007-02-28 Thomas Vander Stichele * m4/gst-arch.m4: Move a line that was in the wrong macro 2007-02-28 Thomas Vander Stichele * m4/gst.m4: Add * m4/gst-arch.m4: * m4/gst-args.m4: * m4/gst-check.m4: * m4/gst-debuginfo.m4: * m4/gst-default.m4: * m4/gst-doc.m4: * m4/gst-error.m4: * m4/gst-feature.m4: * m4/gst-function.m4: * m4/gst-gettext.m4: * m4/gst-glib2.m4: * m4/gst-libxml2.m4: * m4/gst-parser.m4: * m4/gst-plugin-docs.m4: * m4/gst-plugindir.m4: * m4/gst-valgrind.m4: * m4/gst-x11.m4: Convert all macros to use AG_GST style so we can properly warn when they're missing if configure.ac calls AG_GST_INIT Will require update in all GStreamer modules. 2007-02-11 Stefan Kost * m4/gst-args.m4: Remove 'enable' from configure switch description as this leads to confusing lines like "disable enable builing ...". * m4/gst-feature.m4: Fix comment to sound less horrible. 2007-02-07 Tim-Philipp Müller Patch by: Will Newton * m4/gst-check.m4: Use $PKG_CONFIG rather than pkg-config directly, the one in our path might not be the one we want, like when cross-compiling. Also, other macros such as PKG_CHECK_MODULES use $PKG_CONFIG, so we should probably too just for consistency. Fixes #405288. 2007-01-08 Tim-Philipp Müller * m4/gst-parser.m4: Need to use double square brackets again so m4 doesn't remove them (fixes #378931). * m4/gst-args.m4: Use double square brackets here as well, for the same reason. 2007-01-05 Tim-Philipp Müller * m4/gst-parser.m4: Use 'sed' rather than 'tr' to strip trailing letters from version numbers, since 'tr' might not be available and we know sed is (#378931). 2006-10-21 Tim-Philipp Müller * check.mak: Increase default timeout under valgrind, 60 is just too short and some tests take a bit longer these days and not everyone has a beefy machine. 2006-09-29 Michael Smith * gst.supp: More suppressions for edgy. 2006-09-28 Jan Schmidt * m4/gst-glib2.m4: Use gmodule-no-export-2.0.pc instead of gmodule-2.0.pc - we neither want nor need --export-dynamic (which ends up making us export a bunch of unneeded symbols) 2006-09-14 Tim-Philipp Müller * gst.supp: Some suppressions for the more recent ld.so in ubuntu edgy. 2006-08-23 Tim-Philipp Müller * gst.supp: Shorten function trail so the suppression works on my ubuntu dapper system with core cvs as well. 2006-07-28 Jan Schmidt * gst.supp: Extra suppressions from my Ubuntu x86_64 machine 2006-07-24 Tim-Philipp Müller Patch by: Frederic Peters * m4/gst-parser.m4: Need to double square brackets in .m4 files. Should fix bison version detection with version numbers like 1.23a (#348354). 2006-07-24 Jan Schmidt * check.mak: Valgrind fails to find tests written in tests/check/ directly (rather than a subdir) - because valgrind gets run with a filename that doesn't contain a relative path, it goes searching /usr/bin instead. Run with ./.... to make things work either way. * gtk-doc-plugins.mak: Add $(top_builddir)/src as a place to look for plugins when building too, since that's where gst-template keeps things 2006-07-23 Stefan Kost Patch by: Frederic Peters * m4/gst-parser.m4: Fix bison detection (#348354) 2006-07-21 Stefan Kost * m4/gst-parser.m4: check for bison and flex 2006-07-13 Thomas Vander Stichele * m4/gst-plugin-docs.m4: remove the configure argument for enabling plugin doc build; having gtk-doc enabled and pyxml present is enough of a trigger 2006-07-03 Thomas Vander Stichele * coverage/lcov.mak: fix up rules to work with gst-python as well run "make lcov" to test and generate the reports run "make lcov-reset" to redo it after that 2006-07-02 Thomas Vander Stichele * Makefile.am: * check.mak: add an inspect target that inspects every element feature, so we can have that added for coverage * coverage/lcov.mak: add support for lcov 2006-07-02 Thomas Vander Stichele * m4/gst-args.m4: when building with gcov, reset CFLAGS and friends to O0 2006-07-02 Thomas Vander Stichele * m4/gst-args.m4: Find the gcov that matches the gcc version Only allow gcov if we use gcc 2006-07-02 Thomas Vander Stichele * Makefile.am: * coverage/coverage-report-entry.pl: * coverage/coverage-report.pl: * coverage/coverage-report.xsl: copy coverage reporting files from dbus 2006-07-01 Thomas Vander Stichele * m4/gst-args.m4: libtool strips gcov's -f flags, so libgcov does not get linked in. Setting GCOV_LIBS with -lgcov fixes libtool's stripping also show what pkg-config-path we set 2006-06-22 Tim-Philipp Müller Patch by: Peter Kjellerstedt * m4/gst-feature.m4: Show list of plugins without external dependencies that will not be built as well (#344136). 2006-06-15 Tim-Philipp Müller * m4/gst-plugin-docs.m4: add GST_PLUGIN_DOCS, which checks for everything needed to build the plugin docs (namely gtk-doc and pyxml); also adds a new --enable-plugin-docs configure switch; will set ENABLE_PLUGIN_DOCS conditional for use in Makefile.am files (see #344039). 2006-06-11 Thomas Vander Stichele * m4/gst-check.m4: add GST_PKG_CHECK_MODULES, which in the normal case of checking for a dependency lib for a plug-in only needs two arguments to do the right thing. * m4/gst-feature.m4: clean up output a little of feature checking; also deal with non-plug-in feature checks * m4/Makefile.am: * m4/gst-gstreamer.m4: remove this file; it's a useless check 2006-06-06 Thomas Vander Stichele * m4/gst-arch.m4: add PPC64 so we can have separate structure sizes for it 2006-06-05 Edward Hervey * gtk-doc.mak: Check for the proper .devhelp2 file to remove. 2006-05-31 Thomas Vander Stichele * gtk-doc.mak: allow a magic variable to suppress errors from docbuilding 2006-05-30 Thomas Vander Stichele * gtk-doc.mak: error out if gtkdoc-mktmpl finds unused declarations 2006-05-28 Edward Hervey * gst.supp: Reverting previous commit. That's good to know, Edward, but why ? 2006-05-28 Edward Hervey * gst.supp: Added suppresion for memleak in g_option_context_parse on fc5-64 2006-05-19 Thomas Vander Stichele * m4/gst-check.m4: set GSTPB_PLUGINS_DIR just like GST_PLUGINS_DIR 2006-05-18 Tim-Philipp Müller * check.mak: Fix 'make help' in check directories, it should be 'valgrind.gen-suppressions' not 'valgrind-gen-suppressions' (not changing target to match help string on purpose to keep scripts etc. functional). 2006-05-18 Thomas Vander Stichele Patch by: Peter Kjellerstedt * m4/gst-arch.m4: add support for CRIS and CRISv32. 2006-05-17 Jan Schmidt * m4/gst-args.m4: Fix the macros for command-line supplied package and origin names so they don't end up being configure as "" (Fixes #341479) 2006-05-14 Jan Schmidt * gtk-doc.mak: Add uninstall rule to remove .devhelp2 files. 2006-05-09 Edward Hervey * gst.supp: Add suppression for GSlice version of g_type_init calloc leak 2006-04-05 Michael Smith * gst.supp: Delete a bogus suppression for the registry code. Generalise a suppression for a glib bug (see #337404) 2006-04-04 Michael Smith * gst.supp: Add a leak suppression: the existing glibc-doesn't-free-TLS one wasn't triggering here. 2006-04-04 Michael Smith * gst.supp: Add some minimally-neccesary suppressions for my x86/dapper system. 2006-04-01 Thomas Vander Stichele * plugins.xsl: Do not display an origin link if origin does not start with http See #323798 2006-04-01 Thomas Vander Stichele * m4/gst-args.m4: * m4/gst-feature.m4: add more macros * m4/gst-x11.m4: X11-related checks 2006-04-01 Thomas Vander Stichele * m4/as-version.m4: newer version * m4/gst-args.m4: * m4/gst-doc.m4: update and add other macros to be shared across projects 2006-03-24 Thomas Vander Stichele * gst.supp: add a suppression for g_parse_debug_string 2006-03-23 Stefan Kost * gstdoc-scangobj: sync fully with gtkdoc-0.15 2006-03-23 Stefan Kost * gstdoc-scangobj: * gtk-doc.mak: sync a little with gtk-doc mainline 2006-03-17 Wim Taymans * gst.supp: add another clone suppression change all glibc suppressions to match 2.3.* 2006-03-09 Thomas Vander Stichele * m4/check.m4: fix test so it actually works when the normal check is used over debian's/ubuntu's 2006-03-08 Jan Schmidt * check.mak: Set G_SLICE=always-malloc when valgrinding tests (closes #333272) 2006-02-21 Jan Schmidt * m4/gst-glib2.m4: Fix debug output when the GLib version prerequisite is not found 2006-02-13 Andy Wingo * m4/check.m4: Hack around Debian/Ubuntu's broken installation of the PIC version of check as libcheck_pic.a. Should work with cross-compilation too. Grr. 2006-02-06 Thomas Vander Stichele * m4/gst-default.m4: switch to auto* sinks for defaults 2006-02-02 Wim Taymans * check.mak: add a .valgrind.gen-suppressions target to aid in generating suppressions * gst.supp: add more repressions from my debian glibc as of today 2006-02-02 Thomas Vander Stichele * gtk-doc-plugins.mak: only add srcdir/gst if it exists 2006-01-30 Thomas Vander Stichele * release.mak: don't complain about disted enums in win32 2006-01-20 Thomas Vander Stichele * m4/gst-check.m4: AC_SUBST CFLAGS and LIBS do a non-command because something is stripping out our AC_SUBST 2006-01-20 Thomas Vander Stichele * m4/gst-args.m4: * m4/gst-valgrind.m4: properly give a "no" result manually when providing a not-found action to fix configure output 2006-01-20 Thomas Vander Stichele * m4/pkg.m4: update with a more recent version 2006-01-07 Thomas Vander Stichele * gettext.patch: make Makefile depend on LINGUAS, so rebuilds work when adding a language 2006-01-03 Michael Smith * check.mak: Clarify error message from valgrind test runs. 2005-12-16 Thomas Vander Stichele * m4/gst-arch.m4: define HOST_CPU 2005-11-29 Thomas Vander Stichele * check.mak: add a valgrind-forever target for tests 2005-11-28 Thomas Vander Stichele * check.mak: when a "make test.check" run fails, make it rerun the test with at least debug level 2 2005-11-14 Thomas Vander Stichele * m4/Makefile.am: * m4/gst-check.m4: fix check for base plugins * m4/gst-default.m4: add m4 to set default elements 2005-10-18 Thomas Vander Stichele * m4/gst-check.m4: check for tools correctly 2005-10-18 Thomas Vander Stichele * gtk-doc.mak: only enable breaking on new API when make distcheck passes, not before 2005-10-18 Thomas Vander Stichele * m4/gst-check.m4: Resurrect Julien's dead body and wipe his mind clean 2005-10-18 Thomas Vander Stichele * m4/gst-check.m4: Kill Julien 2005-10-17 Julien MOUTTE * m4/gst-check.m4: I know Thomas will kill me but this ifelse statement seems incorrect as it is always setting required to "yes". With this one it seems to work. Fixes build of gst-plugins-base on my setup where gstreamer-check is definitely not present/required. 2005-10-18 Stefan Kost * gtk-doc.mak: make build break on new api that has not been added to the sections file 2005-10-17 Thomas Vander Stichele * m4/gst-glib2.m4: * m4/Makefile.am: * m4/gst-check.m4: add macro for easy checks for GStreamer libs 2005-10-16 Thomas Vander Stichele * m4/gst-glib2.m4: update, warn in error cases 2005-10-16 Thomas Vander Stichele * m4/gst-error.m4: add GST_SET_DEFAULT_LEVEL 2005-10-16 Thomas Vander Stichele * m4/Makefile.am: * m4/gst-gettext.m4: remove the AM_GNU_GETTEXT* calls, they need to be in configure.ac * m4/gst-glib2.m4: clean up and re-use in core soon * m4/gst-plugindir.m4: macro to set up PLUGINDIR and plugindir define/var 2005-10-15 Thomas Vander Stichele * m4/Makefile.am: * m4/gst-gettext.m4: add macro for setting up gettext 2005-10-15 Thomas Vander Stichele * m4/gst-args.m4: add some .m4's for argument checking that can be shared among modules 2005-10-15 Thomas Vander Stichele * m4/as-libtool.m4: set _LT_LDFLAGS * m4/gst-libxml2.m4: document 2005-10-15 Thomas Vander Stichele * m4/gst-arch.m4: indent a little add AC_REQUIRE * m4/gst-error.m4: clean up 2005-10-12 Thomas Vander Stichele * gst-autogen.sh: update version detection expression to catch stuff like Libtool (libtool15) 1.5.0 2005-10-11 Thomas Vander Stichele * gst.supp: commit 6 new suppressions related to g_module_open; can these really not be folded into one ? 2005-10-11 Edward Hervey * gst.supp: made the suppression more generic Added pthread memleak suppresions Added nss_parse_* memleak suppresion (used by g_option_context_parse) 2005-10-11 Thomas Vander Stichele * check.mak: be more strict, more leak resolution * gst.supp: clean up the g_type_init suppressions 2005-10-07 Thomas Vander Stichele * m4/Makefile.am: * m4/gst-valgrind.m4: put the valgrind detection in an .m4 2005-09-29 Thomas Vander Stichele * check.mak: add some more targets, like "help", but also more intensive tests 2005-09-23 Thomas Vander Stichele * gtk-doc.mak: make certain doc warnings fatal so people maintain docs again 2005-09-23 Thomas Vander Stichele * Makefile.am: * gtk-doc-plugins.mak: * scangobj-merge.py: merge additions from the .signals.new and .args.new file in the original ones, only updating if necessary 2005-09-23 Thomas Vander Stichele * gst-xmlinspect.py: * gstdoc-scangobj: * gtk-doc-plugins.mak: fix properly for new API; make update in plugins dir now works 2005-09-20 Thomas Vander Stichele * gst-xmlinspect.py: * gstdoc-scangobj: some fixes for new API * gtk-doc-plugins.mak: set environment properly 2005-09-17 David Schleef * gtk-doc-plugins.mak: Use new environment variables. 2005-09-16 Michael Smith * gstdoc-scangobj: Make the scanobj code reflect registry/plugin API changes 2005-09-15 Thomas Vander Stichele * gtk-doc-plugins.mak: split out scanobj step (which will be run by doc maintainer) from scan step (which will be run on every build) clean up some of the commands for make distcheck 2005-09-15 Thomas Vander Stichele * gtk-doc-plugins.mak: * mangle-tmpl.py: first stab at reorganizing the plugins build so we can maintain element docs 2005-09-14 David Schleef * as-libtool.mak: Remove * m4/as-libtool.m4: The libtool bug that this worked around has been fixed. * m4/as-version.m4: Don't define GST_RELEASE, since it causes config.h to be regenerated needlessly, and we don't use it. 2005-09-14 Thomas Vander Stichele * gtk-doc-plugins.mak: error out on inspect failure 2005-09-14 Michael Smith * glib-gen.mak: Don't call glib-mkenums with arguments that confuse/break MinGW, fixes 316155. 2005-09-03 Thomas Vander Stichele * gtk-doc-plugins.mak: * gtk-doc.mak: * m4/gst-doc.m4: separate out gtk-doc and docbook stuff have two separate --enable configure flags 2005-08-26 Thomas Vander Stichele * check.mak: add a .gdb target; rebuild registry for each target, otherwise a code rebuild always triggers a reg rebuild, and it's just too annoying * gstdoc-scangobj: 2005-08-21 Thomas Vander Stichele * check.mak: separate out REGISTRY_ENVIRONMENT; we want to use that from our valgrind runs, but we also want TESTS_ENVIRONMENT to contain everything that the first test, gst-register, needs 2005-08-21 Thomas Vander Stichele * check.mak: parse output of valgrind and check for definitely lost, and error out; somehow I was led to believe valgrind returns non-zero for leaks, but I can't make it do that, so let's parse 2005-08-20 Thomas Vander Stichele * check.mak: for some weird reason valgrind does not report actual memleaks if GST_PLUGIN_PATH is set to anything but the core gstreamer dir while valgrind is running. Since the registry is going to go anyway, I don't want to waste any more time on this; I just run valgrind without GST_PLUGIN_PATH set. Since the registry loading doesn't check if GST_PLUGIN_PATH got changed as a reason to rebuild the registry, that's actually fine. 2005-08-15 Thomas Vander Stichele * mangle-tmpl.py: keep original Long_Description; only insert an include if it's not already the first line in there * plugins.xsl: output more information for plugins, including an origin hyperlink 2005-08-15 Thomas Vander Stichele * gst-xmlinspect.py: a first stab at inspecting plugins and outputting an xml description * gtk-doc-plugins.mak: a gtk-doc using snippet for plugins documentation * plugins.xsl: a stylesheet to convert gst-xmlinspect.py output to docbook output for inclusion in the gtk-doc stuff 2005-07-20 Ronald S. Bultje * m4/gst-doc.m4: s/pdf/eps/ in test for whether we output EPS images (#309379). 2005-07-18 Andy Wingo * m4/as-libtool-tags.m4: Ooh, backported from libtool 1.6. Much better. Thanks, Paolo Bonzini! * m4/Makefile.am (EXTRA_DIST): * m4/as-libtool-tags.m4: New file, tries to disable some CXX and fortran checks. 2005-07-08 Thomas Vander Stichele * m4/gst-error.m4: add macro to set ERROR_CFLAGS 2005-06-30 Jan Schmidt * gst-autogen.sh: Remove the old autoregen.sh if it exists before recreating it, to prevent confusing any shell process that might be reading it currently. 2005-06-29 Thomas Vander Stichele * m4/gtk-doc.m4: added 2005-06-03 Stefan Kost * gst-autogen.sh: create autoregen.sh *before* shifting the options 2005-05-17 Thomas Vander Stichele * gst-autogen.sh: only update autoregen.sh on actual runs 2005-03-11 Thomas Vander Stichele * m4/check.m4: m4 from the check unit test suite 2004-12-14 David Schleef * m4/gst-arch.m4: remove MMX stuff, since it doesn't work and isn't needed anywhere 2004-12-08 Thomas Vander Stichele * gst-autogen.sh: allow failure command to be run so we can clean upfrom autopoint 2004-09-03 Zeeshan Ali Khattak * m4/gst-feature.m4: Trying to correct the GST_CHECK_CONFIGPROG macro 2004-07-21 Benjamin Otte * m4/.cvsignore: exciting updates for libtool m4 files 2004-07-12 David Schleef * m4/as-objc.m4: Add a macro to test for objective C 2004-06-12 Thomas Vander Stichele * m4/gst-feature.m4: not all of them support --plugin-libs, so redirect stderr 2004-06-12 Thomas Vander Stichele * m4/as-scrub-include.m4: sync with upstream to 0.1.4. Fixes #132440 2004-06-07 Benjamin Otte * m4/gst-feature.m4: write a big marker into configure output when checking next plugin to allow easier parsing of why plugins are(n't) built. 2004-06-01 Thomas Vander Stichele * m4/as-compiler-flag.m4: * m4/as-compiler.m4: * m4/as-libtool.m4: * m4/as-version.m4: sync with upstream, change sticky options to -ko 2004-05-24 Thomas Vander Stichele * m4/as-scrub-include.m4: synced with upstream 2004-05-03 Thomas Vander Stichele * po.mak: snippet for updating .po files 2004-03-18 Thomas Vander Stichele * Makefile.am: * m4/Makefile.am: integrate these with the dist 2004-03-17 Thomas Vander Stichele * release.mak: add a release target 2004-03-09 Thomas Vander Stichele patch by: Stephane Loeuillet * m4/ax_create_stdint_h.m4: use head -n instead of head - (#136500) 2004-03-05 Thomas Vander Stichele * m4/gst-doc.m4: don't build PS without dvips binary 2004-02-22 Julio M. Merino Vidal reviewed by: Benjamin Otte * m4/as-docbook.m4: don't use == operator with test(1) (fixes #135115) 2004-02-16 Thomas Vander Stichele * common/m4/gst-arch.m4: x86_64 is x86 too (clue from Fedora 2 test) 2004-02-13 Thomas Vander Stichele * m4/gst-feature.m4: remove AM_CONDITIONAL for the subsystem since automake 1.6.x requires that call be in configure.ac 2004-02-13 Thomas Vander Stichele * m4/gst-libxml2.m4: take required version as argument, and default to 2.4.9 if not specified 2004-02-12 Thomas Vander Stichele * m4/gst-feature.m4: rename and fix up GST_CHECK_DISABLE_SUBSYSTEM 2004-02-11 Thomas Vander Stichele * common/m4/as-ac-expand.m4: * common/m4/as-auto-alt.m4: * common/m4/as-compiler-flag.m4: * common/m4/as-compiler.m4: * common/m4/as-docbook.m4: * common/m4/as-libtool.m4: * common/m4/as-scrub-include.m4: * common/m4/as-version.m4: * common/m4/glib-gettext.m4: * common/m4/gst-arch.m4: * common/m4/gst-debuginfo.m4: * common/m4/gst-doc.m4: * common/m4/gst-feature.m4: * common/m4/gst-function.m4: * common/m4/gst-glib2.m4: * common/m4/gst-gstreamer.m4: * common/m4/gst-libxml2.m4: * common/m4/gst-makecontext.m4: * common/m4/gst-mcsc.m4: * common/m4/pkg.m4: fix underquoted macros as reported by automake 1.8.x (#133800) 2004-02-11 Johan Dahlin * gst-autogen.sh: Use A-Z instead of A-z in sed expression to avoid a warning 2004-02-05 Thomas Vander Stichele * m4/gst-doc.m4: we use --output-format=xml and --ingnore-files options to gtkdoc-mkdb, which got added between 0.9 and 1.0 2004-02-04 Thomas Vander Stichele * m4/as-libtool.m4: remove AM_PROG_LIBTOOL so it can move back to configure.ac to shut up libtoolize 2004-02-03 Thomas Vander Stichele * glib-gen.mak: added; used to generate enums and marshal code 2004-01-13 Thomas Vander Stichele * gettext.patch: added; used by autogen.sh to make sure GETTEXT_PACKAGE is understood from po/Makefile.in.in -> po/Makefile.in gst-plugins-good-0.10.31/common/check.mak0000644000175000017500000001303111671200067015034 00000000000000# keep target around, since it's referenced in the modules' Makefiles clean-local-check: @echo if HAVE_VALGRIND # hangs spectacularly on some machines, so let's not do this by default yet check-valgrind: $(MAKE) valgrind else check-valgrind: @true endif LOOPS = 10 # run any given test by running make test.check # if the test fails, run it again at at least debug level 2 %.check: % @$(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=20 \ $* || \ $(TESTS_ENVIRONMENT) \ GST_DEBUG=$$GST_DEBUG,*:2 \ CK_DEFAULT_TIMEOUT=20 \ $* # run any given test in a loop %.torture: % @for i in `seq 1 $(LOOPS)`; do \ $(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=20 \ $*; done # run any given test in an infinite loop %.forever: % @while true; do \ $(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=20 \ $* || break; done # valgrind any given test by running make test.valgrind %.valgrind: % @$(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=360 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ $(VALGRIND_PATH) -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ --leak-resolution=high --num-callers=20 \ ./$* 2>&1 | tee valgrind.log @if grep "==" valgrind.log > /dev/null 2>&1; then \ rm valgrind.log; \ exit 1; \ fi @rm valgrind.log # valgrind any given test and generate suppressions for it %.valgrind.gen-suppressions: % @$(TESTS_ENVIRONMENT) \ CK_DEFAULT_TIMEOUT=360 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ $(VALGRIND_PATH) -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ --leak-resolution=high --num-callers=20 \ --gen-suppressions=all \ ./$* 2>&1 | tee suppressions.log # valgrind any given test until failure by running make test.valgrind-forever %.valgrind-forever: % @while $(MAKE) $*.valgrind; do \ true; done # gdb any given test by running make test.gdb %.gdb: % @$(TESTS_ENVIRONMENT) \ CK_FORK=no \ $(LIBTOOL) --mode=execute \ gdb $* # torture tests torture: $(TESTS) -rm test-registry.xml @echo "Torturing tests ..." @for i in `seq 1 $(LOOPS)`; do \ $(MAKE) check || \ (echo "Failure after $$i runs"; exit 1) || \ exit 1; \ done @banner="All $(LOOPS) loops passed"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo $$dashes; echo $$banner; echo $$dashes # forever tests forever: $(TESTS) -rm test-registry.xml @echo "Forever tests ..." @while true; do \ $(MAKE) check || \ (echo "Failure"; exit 1) || \ exit 1; \ done # valgrind all tests valgrind: $(TESTS) @echo "Valgrinding tests ..." @failed=0; \ for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ $(MAKE) $$t.valgrind; \ if test "$$?" -ne 0; then \ echo "Valgrind error for test $$t"; \ failed=`expr $$failed + 1`; \ whicht="$$whicht $$t"; \ fi; \ done; \ if test "$$failed" -ne 0; then \ echo "$$failed tests had leaks or errors under valgrind:"; \ echo "$$whicht"; \ false; \ fi # valgrind all tests and generate suppressions valgrind.gen-suppressions: $(TESTS) @echo "Valgrinding tests ..." @failed=0; \ for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ $(MAKE) $$t.valgrind.gen-suppressions; \ if test "$$?" -ne 0; then \ echo "Valgrind error for test $$t"; \ failed=`expr $$failed + 1`; \ whicht="$$whicht $$t"; \ fi; \ done; \ if test "$$failed" -ne 0; then \ echo "$$failed tests had leaks or errors under valgrind:"; \ echo "$$whicht"; \ false; \ fi # inspect every plugin feature GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_MAJORMINOR) inspect: @echo "Inspecting features ..." @for e in `$(TESTS_ENVIRONMENT) $(GST_INSPECT) | head -n -2 \ | cut -d: -f2`; \ do echo Inspecting $$e; \ $(GST_INSPECT) $$e > /dev/null 2>&1; done help: @echo @echo "make check -- run all checks" @echo "make torture -- run all checks $(LOOPS) times" @echo "make (dir)/(test).check -- run the given check once" @echo "make (dir)/(test).forever -- run the given check forever" @echo "make (dir)/(test).torture -- run the given check $(LOOPS) times" @echo @echo "make (dir)/(test).gdb -- start up gdb for the given test" @echo @echo "make valgrind -- valgrind all tests" @echo "make valgrind.gen-suppressions -- generate suppressions for all tests" @echo " and save to suppressions.log" @echo "make (dir)/(test).valgrind -- valgrind the given test" @echo "make (dir)/(test).valgrind-forever -- valgrind the given test forever" @echo "make (dir)/(test).valgrind.gen-suppressions -- generate suppressions" @echo " and save to suppressions.log" @echo "make inspect -- inspect all plugin features" @echo @echo @echo "Additionally, you can use the GST_CHECKS environment variable to" @echo "specify which test(s) should be run. This is useful if you are" @echo "debugging a failure in one particular test, or want to reproduce" @echo "a race condition in a single test." @echo @echo "Examples:" @echo @echo " GST_CHECKS=test_this,test_that make element/foobar.check" @echo " GST_CHECKS=test_many_threads make element/foobar.forever" @echo gst-plugins-good-0.10.31/common/gtk-doc-plugins.mak0000644000175000017500000003025011677341671017005 00000000000000# This is an include file specifically tuned for building documentation # for GStreamer plug-ins help: @echo @echo "If you are a doc maintainer, run 'make update' to update" @echo "the documentation files maintained in git" @echo @echo Other useful make targets: @echo @echo check-inspected-versions: make sure the inspected plugin info @echo is up to date before a release @echo # update the stuff maintained by doc maintainers update: $(MAKE) scanobj-update $(MAKE) check-outdated-docs # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) # thomas: make docs parallel installable TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ MAINTAINER_DOC_STAMPS = \ scanobj-build.stamp EXTRA_DIST = \ $(MAINTAINER_DOC_STAMPS) \ $(srcdir)/inspect/*.xml \ $(SCANOBJ_FILES) \ $(content_files) \ $(extra_files) \ $(HTML_IMAGES) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_OVERRIDES) \ $(DOC_MODULE)-sections.txt # we don't add scanobj-build.stamp here since they are built manually by docs # maintainers and result is commited to git DOC_STAMPS = \ scan-build.stamp \ tmpl-build.stamp \ sgml-build.stamp \ html-build.stamp \ scan.stamp \ tmpl.stamp \ sgml.stamp \ html.stamp # files generated/updated by gtkdoc-scangobj SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals \ $(DOC_MODULE).types SCANOBJ_FILES_O = \ .libs/$(DOC_MODULE)-scan.o # files generated/updated by gtkdoc-scan SCAN_FILES = \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt \ $(DOC_MODULE)-decl.txt \ $(DOC_MODULE)-decl-list.txt REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = \ $(SCANOBJ_FILES_O) \ $(REPORT_FILES) \ $(DOC_STAMPS) \ inspect-registry.xml INSPECT_DIR = inspect if ENABLE_GTK_DOC all-local: html-build.stamp ### inspect GStreamer plug-ins; done by documentation maintainer ### # only look at the plugins in this module when building inspect .xml stuff INSPECT_REGISTRY=$(top_builddir)/docs/plugins/inspect-registry.xml INSPECT_ENVIRONMENT=\ LC_ALL=C \ GST_PLUGIN_SYSTEM_PATH= \ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \ GST_REGISTRY=$(INSPECT_REGISTRY) \ PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \ $(INSPECT_EXTRA_ENVIRONMENT) #### scan gobjects; done by documentation maintainer #### scanobj-update: -rm scanobj-build.stamp $(MAKE) scanobj-build.stamp # gstdoc-scanobj produces 5 output files (.new) # scangobj-merge.py merges them into the file which we commit later # TODO: also merge the hierarchy scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles) @echo " DOC Introspecting gobjects" @if test x"$(srcdir)" != x. ; then \ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ do \ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ done; \ fi; \ mkdir -p $(INSPECT_DIR); \ scanobj_options=""; \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ $(INSPECT_ENVIRONMENT) \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS) $(WARNING_CFLAGS)" \ LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ $(GST_DOC_SCANOBJ) $$scanobj_options --type-init-func="gst_init(NULL,NULL)" \ --module=$(DOC_MODULE) --source=$(PACKAGE) --inspect-dir=$(INSPECT_DIR) && \ echo " DOC Merging introspection data" && \ $(PYTHON) \ $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE); \ if test x"$(srcdir)" != x. ; then \ for f in $(SCANOBJ_FILES); \ do \ cmp -s ./$$f $(srcdir)/$$f || cp ./$$f $(srcdir)/ ; \ done; \ fi; \ touch scanobj-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(SCANOBJ_FILES_O): scan-build.stamp @true ### scan headers; done on every build ### scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp @echo ' DOC Scanning header files' @if test x"$(srcdir)" != x. ; then \ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ do \ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ done; \ fi @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan \ $(SCAN_OPTIONS) $(EXTRA_HFILES) \ --module=$(DOC_MODULE) \ $${_source_dir} \ --ignore-headers="$(IGNORE_HFILES)"; \ touch scan-build.stamp #### update templates; done on every build #### # in a non-srcdir build, we need to copy files from the previous step # and the files from previous runs of this step tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES) @echo ' DOC Rebuilding template files' @if test x"$(srcdir)" != x. ; then \ for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ do \ if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi; \ done; \ fi @gtkdoc-mktmpl --module=$(DOC_MODULE) @$(PYTHON) \ $(top_srcdir)/common/mangle-tmpl.py $(srcdir)/$(INSPECT_DIR) tmpl @touch tmpl-build.stamp tmpl.stamp: tmpl-build.stamp @true #### xml #### sgml-build.stamp: tmpl.stamp scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl $(expand_content_files) @echo ' DOC Building XML' @-mkdir -p xml @for a in $(srcdir)/$(INSPECT_DIR)/*.xml; do \ xsltproc --stringparam module $(MODULE) \ $(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done @for f in $(EXAMPLE_CFILES); do \ $(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done @gtkdoc-mkdb \ --module=$(DOC_MODULE) \ --source-dir=$(DOC_SOURCE_DIR) \ --expand-content-files="$(expand_content_files)" \ --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \ --output-format=xml \ --ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \ $(MKDB_OPTIONS) @cp ../version.entities xml @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building HTML' @rm -rf html @mkdir html @cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html @for f in $(content_files); do cp $(srcdir)/$$f html; done @cp -pr xml html @cp ../version.entities html @mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) @mv html/index.sgml html/index.sgml.bak @$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml @rm -f html/index.sgml.bak @rm -f html/$(DOC_MAIN_SGML_FILE) @rm -rf html/xml @rm -f html/version.entities @test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \ if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp clean-local-gtkdoc: @rm -rf xml tmpl html # clean files copied for nonsrcdir templates build @if test x"$(srcdir)" != x. ; then \ rm -rf $(SCANOBJ_FILES) $(SCAN_FILES) $(REPORT_FILES) \ $(MAINTAINER_DOC_STAMPS); \ fi else all-local: clean-local-gtkdoc: endif clean-local: clean-local-gtkdoc @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -f $(REPORT_FILES) \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @rm -rf tmpl/*.sgml.bak @rm -f $(DOC_MODULE).hierarchy @rm -f *.stamp || true @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(DOC_MODULE)-docs.sgml ; \ rm -f $(DOC_MODULE).types ; \ rm -f $(DOC_MODULE).interfaces ; \ rm -f $(DOC_MODULE)-overrides.txt ; \ rm -f $(DOC_MODULE).prerequisites ; \ rm -f $(DOC_MODULE)-sections.txt ; \ rm -rf tmpl/*.sgml ; \ rm -rf $(INSPECT_DIR); \ fi @rm -rf *.o MAINTAINERCLEANFILES = $(MAINTAINER_DOC_STAMPS) # thomas: make docs parallel installable; devhelp requires majorminor too install-data-local: (installfiles=`echo $(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css`; \ if test "$$installfiles" = '$(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css'; \ then echo '-- Nothing to install' ; \ else \ $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ for i in $$installfiles; do \ echo '-- Installing '$$i ; \ $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ done; \ pngfiles=`echo ./html/*.png`; \ if test "$$pngfiles" != './html/*.png'; then \ for i in $$pngfiles; do \ echo '-- Installing '$$i ; \ $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ done; \ fi; \ echo '-- Installing $(builddir)/html/$(DOC_MODULE).devhelp2' ; \ if test -e $(builddir)/html/$(DOC_MODULE).devhelp2; then \ $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \ $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ fi; \ (which gtkdoc-rebase >/dev/null && \ gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \ fi) uninstall-local: if test -d $(DESTDIR)$(TARGET_DIR); then \ rm -rf $(DESTDIR)$(TARGET_DIR)/*; \ rmdir -p $(DESTDIR)$(TARGET_DIR) 2>/dev/null || true; \ else \ echo '-- Nothing to uninstall' ; \ fi; # # Checks # if ENABLE_GTK_DOC check-hierarchy: $(DOC_MODULE).hierarchy @if grep ' ' $(DOC_MODULE).hierarchy; then \ echo "$(DOC_MODULE).hierarchy contains tabs, please fix"; \ /bin/false; \ fi check: check-hierarchy endif # wildcard is apparently not portable to other makes, hence the use of find inspect_files = $(shell find $(srcdir)/$(INSPECT_DIR) -name '*.xml') check-inspected-versions: @echo Checking plugin versions of inspected plugin data ...; \ fail=0 ; \ for each in $(inspect_files) ; do \ if (grep -H '' $$each | grep -v '$(VERSION)'); then \ echo $$each should be fixed to say version $(VERSION) or be removed ; \ echo "sed -i -e 's//$(VERSION)<\/version>/'" $$each; \ echo ; \ fail=1; \ fi ; \ done ; \ exit $$fail check-outdated-docs: $(AM_V_GEN)echo Checking for outdated plugin inspect data ...; \ fail=0 ; \ if [ -d $(top_srcdir)/.git/ ]; then \ files=`find $(srcdir)/inspect/ -name '*xml'`; \ for f in $$files; do \ ver=`grep '$(PACKAGE_VERSION)' $$f`; \ if test "x$$ver" = "x"; then \ plugin=`echo $$f | sed -e 's/^.*plugin-//' -e 's/.xml//'`; \ # echo "Checking $$plugin $$f"; \ pushd "$(top_srcdir)" >/dev/null; \ pinit=`git grep -A3 GST_PLUGIN_DEFINE -- ext/ gst/ sys/ | grep "\"$$plugin\""`; \ popd >/dev/null; \ # echo "[$$pinit]"; \ if test "x$$pinit" = "x"; then \ printf " **** outdated docs for plugin %-15s: %s\n" $$plugin $$f; \ fail=1; \ fi; \ fi; \ done; \ fi ; \ exit $$fail # # Require gtk-doc when making dist # if ENABLE_GTK_DOC dist-check-gtkdoc: else dist-check-gtkdoc: @echo "*** gtk-doc must be installed and enabled in order to make dist" @false endif # FIXME: decide whether we want to dist generated html or not # also this only works, if the project has been build before # we could dist html only if its there, but that might lead to missing html in # tarballs dist-hook: dist-check-gtkdoc dist-hook-local mkdir $(distdir)/html cp html/* $(distdir)/html -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ cd $(distdir) && rm -f $(DISTCLEANFILES) -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs check-outdated-docs inspect # avoid spurious build errors when distchecking with -jN .NOTPARALLEL: gst-plugins-good-0.10.31/common/orc.mak0000644000175000017500000000470511671200067014552 00000000000000# # This is a makefile.am fragment to build Orc code. # # Define ORC_SOURCE and then include this file, such as: # # ORC_SOURCE=gstadderorc # include $(top_srcdir)/common/orc.mak # # This fragment will create tmp-orc.c and gstadderorc.h from # gstadderorc.orc. # # When 'make dist' is run at the top level, or 'make orc-update' # in a directory including this fragment, the generated source # files will be copied to $(ORC_SOURCE)-dist.[ch]. These files # should be checked in to git, since they are used if Orc is # disabled. # # Note that this file defines BUILT_SOURCES, so any later usage # of BUILT_SOURCES in the Makefile.am that includes this file # must use '+='. # EXTRA_DIST = $(ORC_SOURCE).orc ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h orc-update: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h orcc_v_gen = $(orcc_v_gen_$(V)) orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) orcc_v_gen_0 = @echo " ORCC $@"; cp_v_gen = $(cp_v_gen_$(V)) cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) cp_v_gen_0 = @echo " CP $@"; if HAVE_ORCC tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc $(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc else tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c $(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h endif clean-local: clean-orc .PHONY: clean-orc clean-orc: rm -f tmp-orc.c $(ORC_SOURCE).h dist-hook: dist-hook-orc .PHONY: dist-hook-orc # we try and copy updated orc -dist files below, but don't fail if it # doesn't work as the srcdir might not be writable dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c rm -f tmp-orc.c~ cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h gst-plugins-good-0.10.31/common/extract-release-date-from-doap-file0000755000175000017500000000132711671200067022022 00000000000000#!/bin/sh # Shell script to extract the date given a release version and a .doap file if test "x$1" = "x" -o "x$2" = "x" -o ! -s "$2"; then echo "Usage: $0 RELEASE-VERSION-NUMBER DOAP-FILE" >&2; exit 1 fi if ! grep '/dev/null ; then echo "$2 does not look lika a .doap file" >&2; exit 1 fi if ! grep "$1" "$2" >/dev/null ; then echo "$2 contains no reference to a version $1" >&2; exit 1 fi awk 'BEGIN {x=0} { if ($0~"") {x=1; chunk=""} if (x==1) { if ($0~"") { chunk = chunk $0 } if ($0~"") { chunk = chunk $0 } } if ($0~"") {x=0; print chunk} }' < "$2" | \ \ grep ''"$1"'' | \ \ sed -e 's/^.*//' -e 's/<\/created>.*$//' gst-plugins-good-0.10.31/common/release.mak0000644000175000017500000000164611671200067015410 00000000000000# include this snippet to add a common release: target by using # include $(top_srcdir)/common/release.mak # make bz2 as well AUTOMAKE_OPTIONS = dist-bzip2 release: dist $(MAKE) $(PACKAGE)-$(VERSION).tar.gz.md5 $(MAKE) $(PACKAGE)-$(VERSION).tar.bz2.md5 # generate md5 sum files %.md5: % md5sum $< > $@ # check that no marshal or enumtypes files are included # this in turn ensures that distcheck fails for missing .list files which is currently # shadowed when the corresponding .c and .h files are included. distcheck-hook: @test "x" = "x`find $(distdir) -name \*-enumtypes.[ch] | grep -v win32`" && \ test "x" = "x`find $(distdir) -name \*-marshal.[ch]`" || \ ( $(ECHO) "*** Leftover enumtypes or marshal files in the tarball." && \ $(ECHO) "*** Make sure the following files are not disted:" && \ find $(distdir) -name \*-enumtypes.[ch] | grep -v win32 && \ find $(distdir) -name \*-marshal.[ch] && \ false ) gst-plugins-good-0.10.31/common/c-to-xml.py0000644000175000017500000000146011671200067015302 00000000000000# -*- Mode: Python -*- # vi:si:et:sw=4:sts=4:ts=4 """ Convert a C program to valid XML to be included in docbook """ import sys import os from xml.sax import saxutils def main(): if len(sys.argv) == 1: sys.stderr.write("Please specify a source file to convert") sys.exit(1) source = sys.argv[1] if not os.path.exists(source): sys.stderr.write("%s does not exist.\n" % source) sys.exit(1) content = open(source, "r").read() # print header print '' print '' print print '' # print content print saxutils.escape(content).encode('UTF-8') print '' main() gst-plugins-good-0.10.31/common/gstdoc-scangobj0000755000175000017500000013107511677341671016310 00000000000000#!/usr/bin/env perl # -*- cperl -*- # # gtk-doc - GTK DocBook documentation generator. # Copyright (C) 1998 Damon Chaplin # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # # This gets information about object hierarchies and signals # by compiling a small C program. CFLAGS and LDFLAGS must be # set appropriately before running this script. # use Getopt::Long; my $GTK_DOC_PREFIX=`pkg-config --variable prefix gtk-doc`; if ($GTK_DOC_PREFIX) { chomp $GTK_DOC_PREFIX; #print "Adding $GTK_DOC_PREFIX/share/gtk-doc/data to \@INC\n"; unshift @INC, "$GTK_DOC_PREFIX/share/gtk-doc/data"; } else { unshift @INC, '/usr/share/gtk-doc/data'; } require "gtkdoc-common.pl"; # Options # name of documentation module my $MODULE; my $OUTPUT_DIR; my $INSPECT_DIR; my $VERBOSE; my $PRINT_VERSION; my $PRINT_HELP; my $TYPE_INIT_FUNC="g_type_init ()"; # --nogtkinit is deprecated, as it is the default now anyway. %optctl = (module => \$MODULE, source => \$SOURCE, types => \$TYPES_FILE, nogtkinit => \$NO_GTK_INIT, 'type-init-func' => \$TYPE_INIT_FUNC, 'output-dir' => \$OUTPUT_DIR, 'inspect-dir' => \$INSPECT_DIR, 'verbose' => \$VERBOSE, 'version' => \$PRINT_VERSION, 'help' => \$PRINT_HELP); GetOptions(\%optctl, "module=s", "source=s", "types:s", "output-dir:s", "inspect-dir:s", "nogtkinit", "type-init-func:s", "verbose", "version", "help"); if ($NO_GTK_INIT) { # Do nothing. This just avoids a warning. # the option is not used anymore } if ($PRINT_VERSION) { print "1.5\n"; exit 0; } if (!$MODULE) { $PRINT_HELP = 1; } if ($PRINT_HELP) { print <$MODULE-scan.c") || die "Cannot open $MODULE-scan.c: $!\n"; my $old_signals_filename = "$OUTPUT_DIR/$MODULE.signals"; my $new_signals_filename = "$OUTPUT_DIR/$MODULE.signals.new"; my $old_hierarchy_filename = "$OUTPUT_DIR/$MODULE.hierarchy"; my $new_hierarchy_filename = "$OUTPUT_DIR/$MODULE.hierarchy.new"; my $old_interfaces_filename = "$OUTPUT_DIR/$MODULE.interfaces"; my $new_interfaces_filename = "$OUTPUT_DIR/$MODULE.interfaces.new"; my $old_prerequisites_filename = "$OUTPUT_DIR/$MODULE.prerequisites"; my $new_prerequisites_filename = "$OUTPUT_DIR/$MODULE.prerequisites.new"; my $old_args_filename = "$OUTPUT_DIR/$MODULE.args"; my $new_args_filename = "$OUTPUT_DIR/$MODULE.args.new"; my $debug_log="g_message"; if (!defined($VERBOSE) or $VERBOSE eq "0") { $debug_log="//$debug_log"; } # write a C program to scan the types $includes = ""; @types = (); @impl_types = (); for () { if (/^#include/) { $includes .= $_; } elsif (/^%/) { next; } elsif (/^\s*$/) { next; } elsif (/^type:(.*)$/) { $t = $1; chomp $t; push @impl_types, $t; } else { chomp; push @types, $_; } } $ntypes = @types + @impl_types + 1; print OUTPUT < #include #include #include $includes #ifdef GTK_IS_WIDGET_CLASS #include #endif static GType *object_types = NULL; static GString *xmlstr = NULL; static const gchar* xmlprint (gint indent, const gchar *tag, const gchar *data) { const gchar indent_str[] = " "; /* reset */ g_string_truncate (xmlstr, 0); g_string_append_len (xmlstr, indent_str, MIN (indent, strlen (indent_str))); g_string_append_printf (xmlstr, "<%s>", tag); if (data) { gchar *s; s = g_markup_escape_text (data, -1); g_string_append (xmlstr, s); g_free (s); } g_string_append_printf (xmlstr, "\\n", tag); return xmlstr->str; } static gint gst_feature_sort_compare (gconstpointer a, gconstpointer b) { return strcmp (((GstPluginFeature *)a)->name, ((GstPluginFeature *)b)->name); } static gint static_pad_template_compare (gconstpointer a, gconstpointer b) { GstStaticPadTemplate *spt_a = (GstStaticPadTemplate *) a; GstStaticPadTemplate *spt_b = (GstStaticPadTemplate *) b; /* we want SINK before SRC (enum is UNKNOWN, SRC, SINK) */ if (spt_a->direction != spt_b->direction) return spt_b->direction - spt_a->direction; /* we want ALWAYS first, SOMETIMES second, REQUEST last * (enum is ALWAYS, SOMETIMES, REQUEST) */ if (spt_a->presence != spt_b->presence) return spt_a->presence - spt_b->presence; return strcmp (spt_a->name_template, spt_b->name_template); } static GType * get_object_types (void) { gpointer g_object_class; GList *plugins = NULL; GList *factories = NULL; GList *l; GstElementFactory *factory = NULL; GType type; gint i = 0; gboolean reinspect; /* get a list of features from plugins in our source module */ plugins = gst_registry_get_plugin_list (gst_registry_get_default()); xmlstr = g_string_new (""); reinspect = !g_file_test ("scanobj-build.stamp", G_FILE_TEST_EXISTS); while (plugins) { GList *features; GstPlugin *plugin; const gchar *source; FILE *inspect = NULL; gchar *inspect_name; plugin = (GstPlugin *) (plugins->data); plugins = g_list_next (plugins); source = gst_plugin_get_source (plugin); if (!source || strcmp (source, "$SOURCE") != 0) { continue; } /* skip static coreelements plugin with pipeline and bin element factory */ if (gst_plugin_get_filename (plugin) == NULL) continue; $debug_log ("plugin: %s source: %s", plugin->desc.name, source); if (reinspect) { inspect_name = g_strdup_printf ("$INSPECT_DIR" G_DIR_SEPARATOR_S "plugin-%s.xml", plugin->desc.name); inspect = fopen (inspect_name, "w"); if (inspect == NULL) { g_error ("Could not open %s for writing: %s\\n", inspect_name, g_strerror (errno)); } g_free (inspect_name); /* output plugin data */ fputs ("\\n",inspect); fputs (xmlprint(2, "name", plugin->desc.name),inspect); fputs (xmlprint(2, "description", plugin->desc.description),inspect); fputs (xmlprint(2, "filename", plugin->filename),inspect); fputs (xmlprint(2, "basename", plugin->basename),inspect); fputs (xmlprint(2, "version", plugin->desc.version),inspect); fputs (xmlprint(2, "license", plugin->desc.license),inspect); fputs (xmlprint(2, "source", plugin->desc.source),inspect); fputs (xmlprint(2, "package", plugin->desc.package),inspect); fputs (xmlprint(2, "origin", plugin->desc.origin),inspect); fputs (" \\n", inspect); } features = gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), plugin->desc.name); /* sort factories by feature->name */ features = g_list_sort (features, gst_feature_sort_compare); while (features) { GstPluginFeature *feature; feature = GST_PLUGIN_FEATURE (features->data); feature = gst_plugin_feature_load (feature); if (!feature) { g_warning ("Could not load plugin feature %s", gst_plugin_feature_get_name (feature)); } if (GST_IS_ELEMENT_FACTORY (feature)) { const gchar *pad_dir[] = { "unknown","source","sink" }; const gchar *pad_pres[] = { "always","sometimes","request" }; GList *pads, *pad; $debug_log (" feature: %s", feature->name); factory = GST_ELEMENT_FACTORY (feature); factories = g_list_prepend (factories, factory); if (reinspect) { /* output element data */ fputs (" \\n", inspect); fputs (xmlprint(6, "name", feature->name),inspect); fputs (xmlprint(6, "longname", gst_element_factory_get_longname (factory)),inspect); fputs (xmlprint(6, "class", gst_element_factory_get_klass (factory)),inspect); fputs (xmlprint(6, "description", gst_element_factory_get_description (factory)),inspect); fputs (xmlprint(6, "author", gst_element_factory_get_author (factory)),inspect); fputs (" \\n", inspect); /* output pad-template data */ pads = g_list_copy ((GList *) gst_element_factory_get_static_pad_templates (factory)); pads = g_list_sort (pads, static_pad_template_compare); for (pad = pads; pad != NULL; pad = pad->next) { GstStaticPadTemplate *pt = pad->data; fputs (" \\n", inspect); fputs (xmlprint(10, "name", pt->name_template),inspect); fputs (xmlprint(10, "direction", pad_dir[pt->direction]),inspect); fputs (xmlprint(10, "presence", pad_pres[pt->presence]),inspect); fputs (xmlprint(10, "details", pt->static_caps.string),inspect); fputs (" \\n", inspect); } g_list_free (pads); fputs (" \\n \\n", inspect); } } features = g_list_next (features); } if (reinspect) { fputs (" \\n", inspect); fclose (inspect); } } g_string_free (xmlstr, TRUE); $debug_log ("number of element factories: %d", g_list_length (factories)); /* allocate the object_types array to hold them */ object_types = g_new0 (GType, g_list_length (factories)+$ntypes+1); l = factories; i = 0; /* fill it */ while (l) { factory = GST_ELEMENT_FACTORY (l->data); type = gst_element_factory_get_element_type (factory); if (type != 0) { $debug_log ("adding type for factory %s", gst_element_factory_get_longname (factory)); object_types[i++] = type; } else { g_message ("type info for factory %s not found", gst_element_factory_get_longname (factory)); } l = g_list_next (l); } EOT # get_type functions: for (@types) { print OUTPUT < uppercase with '_' * GFileMonitor -> file_monitor * GIOExtensionPoint -> extension_point * GtkTreeView -> tree_view * if 2nd char is upper case too * search for first lower case and go back one char * else * search for next upper case */ if (!strncmp (object_name, "Gtk", 3)) object_arg = object_name + 3; else if (!strncmp (object_name, "Gnome", 5)) object_arg = object_name + 5; else object_arg = object_name; object_arg_lower = g_ascii_strdown (object_arg, -1); sprintf (pos, "*%s\\n", object_arg_lower); pos += strlen (pos); if (!strncmp (object_arg_lower, "widget", 6)) widget_num = 2; g_free(object_arg_lower); /* Convert signal name to use underscores rather than dashes '-'. */ strncpy (signal_name, query_info.signal_name, 127); signal_name[127] = '\\0'; for (i = 0; signal_name[i]; i++) { if (signal_name[i] == '-') signal_name[i] = '_'; } /* Output the signal parameters. */ for (param = 0; param < query_info.n_params; param++) { type_name = get_type_name (query_info.param_types[param] & ~G_SIGNAL_TYPE_STATIC_SCOPE, &is_pointer); /* Most arguments to the callback are called "arg1", "arg2", etc. GtkWidgets are called "widget", "widget2", ... GtkCallbacks are called "callback", "callback2", ... */ if (!strcmp (type_name, "GtkWidget")) { arg_name = "widget"; arg_num = &widget_num; } else if (!strcmp (type_name, "GtkCallback") || !strcmp (type_name, "GtkCCallback")) { arg_name = "callback"; arg_num = &callback_num; } else { arg_name = "arg"; arg_num = ¶m_num; } sprintf (pos, "%s ", type_name); pos += strlen (pos); if (!arg_num || *arg_num == 0) sprintf (pos, "%s%s\\n", is_pointer ? "*" : " ", arg_name); else sprintf (pos, "%s%s%i\\n", is_pointer ? "*" : " ", arg_name, *arg_num); pos += strlen (pos); if (arg_num) { if (*arg_num == 0) *arg_num = 2; else *arg_num += 1; } } pos = flags; /* We use one-character flags for simplicity. */ if (query_info.signal_flags & G_SIGNAL_RUN_FIRST) *pos++ = 'f'; if (query_info.signal_flags & G_SIGNAL_RUN_LAST) *pos++ = 'l'; if (query_info.signal_flags & G_SIGNAL_RUN_CLEANUP) *pos++ = 'c'; if (query_info.signal_flags & G_SIGNAL_NO_RECURSE) *pos++ = 'r'; if (query_info.signal_flags & G_SIGNAL_DETAILED) *pos++ = 'd'; if (query_info.signal_flags & G_SIGNAL_ACTION) *pos++ = 'a'; if (query_info.signal_flags & G_SIGNAL_NO_HOOKS) *pos++ = 'h'; *pos = 0; /* Output the return type and function name. */ ret_type = get_type_name (query_info.return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE, &is_pointer); fprintf (fp, "\\n%s::%s\\n%s%s\\n%s\\n%s\\n\\n", object_name, query_info.signal_name, ret_type, is_pointer ? "*" : "", flags, buffer); } /* Returns the type name to use for a signal argument or return value, given the GtkType from the signal info. It also sets is_pointer to TRUE if the argument needs a '*' since it is a pointer. */ static const gchar * get_type_name (GType type, gboolean * is_pointer) { const gchar *type_name; *is_pointer = FALSE; type_name = g_type_name (type); switch (type) { case G_TYPE_NONE: case G_TYPE_CHAR: case G_TYPE_UCHAR: case G_TYPE_BOOLEAN: case G_TYPE_INT: case G_TYPE_UINT: case G_TYPE_LONG: case G_TYPE_ULONG: case G_TYPE_FLOAT: case G_TYPE_DOUBLE: case G_TYPE_POINTER: /* These all have normal C type names so they are OK. */ return type_name; case G_TYPE_STRING: /* A GtkString is really a gchar*. */ *is_pointer = TRUE; return "gchar"; case G_TYPE_ENUM: case G_TYPE_FLAGS: /* We use a gint for both of these. Hopefully a subtype with a decent name will be registered and used instead, as GTK+ does itself. */ return "gint"; case G_TYPE_BOXED: /* The boxed type shouldn't be used itself, only subtypes. Though we return 'gpointer' just in case. */ return "gpointer"; case G_TYPE_PARAM: /* A GParam is really a GParamSpec*. */ *is_pointer = TRUE; return "GParamSpec"; #if GLIB_CHECK_VERSION (2, 25, 9) case G_TYPE_VARIANT: *is_pointer = TRUE; return "GVariant"; #endif default: break; } /* For all GObject subclasses we can use the class name with a "*", e.g. 'GtkWidget *'. */ if (g_type_is_a (type, G_TYPE_OBJECT)) *is_pointer = TRUE; /* Also catch non GObject root types */ if (G_TYPE_IS_CLASSED (type)) *is_pointer = TRUE; /* All boxed subtypes will be pointers as well. */ /* Exception: GStrv */ if (g_type_is_a (type, G_TYPE_BOXED) && !g_type_is_a (type, G_TYPE_STRV)) *is_pointer = TRUE; /* All pointer subtypes will be pointers as well. */ if (g_type_is_a (type, G_TYPE_POINTER)) *is_pointer = TRUE; /* But enums are not */ if (g_type_is_a (type, G_TYPE_ENUM) || g_type_is_a (type, G_TYPE_FLAGS)) *is_pointer = FALSE; return type_name; } /* This outputs the hierarchy of all objects which have been initialized, i.e. by calling their XXX_get_type() initialization function. */ static void output_object_hierarchy (void) { FILE *fp; gint i,j; GType root, type; GType root_types[$ntypes] = { G_TYPE_INVALID, }; fp = fopen (hierarchy_filename, "w"); if (fp == NULL) { g_warning ("Couldn't open output file: %s : %s", hierarchy_filename, g_strerror(errno)); return; } output_hierarchy (fp, G_TYPE_OBJECT, 0); output_hierarchy (fp, G_TYPE_INTERFACE, 0); for (i=0; object_types[i]; i++) { root = object_types[i]; while ((type = g_type_parent (root))) { root = type; } if ((root != G_TYPE_OBJECT) && (root != G_TYPE_INTERFACE)) { for (j=0; root_types[j]; j++) { if (root == root_types[j]) { root = G_TYPE_INVALID; break; } } if(root) { root_types[j] = root; output_hierarchy (fp, root, 0); } } } fclose (fp); } static int compare_types (const void *a, const void *b) { const char *na = g_type_name (*((GType *)a)); const char *nb = g_type_name (*((GType *)b)); return g_strcmp0 (na, nb); } /* This is called recursively to output the hierarchy of a object. */ static void output_hierarchy (FILE *fp, GType type, guint level) { guint i; GType *children; guint n_children; if (!type) return; for (i = 0; i < level; i++) fprintf (fp, " "); fprintf (fp, "%s\\n", g_type_name (type)); children = g_type_children (type, &n_children); qsort (children, n_children, sizeof (GType), compare_types); for (i=0; i < n_children; i++) output_hierarchy (fp, children[i], level + 1); g_free (children); } static void output_object_interfaces (void) { guint i; FILE *fp; fp = fopen (interfaces_filename, "w"); if (fp == NULL) { g_warning ("Couldn't open output file: %s : %s", interfaces_filename, g_strerror(errno)); return; } output_interfaces (fp, G_TYPE_OBJECT); for (i = 0; object_types[i]; i++) { if (!g_type_parent (object_types[i]) && (object_types[i] != G_TYPE_OBJECT) && G_TYPE_IS_INSTANTIATABLE (object_types[i])) { output_interfaces (fp, object_types[i]); } } fclose (fp); } static void output_interfaces (FILE *fp, GType type) { guint i; GType *children, *interfaces; guint n_children, n_interfaces; if (!type) return; interfaces = g_type_interfaces (type, &n_interfaces); if (n_interfaces > 0) { fprintf (fp, "%s", g_type_name (type)); for (i=0; i < n_interfaces; i++) fprintf (fp, " %s", g_type_name (interfaces[i])); fprintf (fp, "\\n"); } g_free (interfaces); children = g_type_children (type, &n_children); for (i=0; i < n_children; i++) output_interfaces (fp, children[i]); g_free (children); } static void output_interface_prerequisites (void) { FILE *fp; fp = fopen (prerequisites_filename, "w"); if (fp == NULL) { g_warning ("Couldn't open output file: %s : %s", prerequisites_filename, g_strerror(errno)); return; } output_prerequisites (fp, G_TYPE_INTERFACE); fclose (fp); } static void output_prerequisites (FILE *fp, GType type) { #if GLIB_CHECK_VERSION(2,1,0) guint i; GType *children, *prerequisites; guint n_children, n_prerequisites; if (!type) return; prerequisites = g_type_interface_prerequisites (type, &n_prerequisites); if (n_prerequisites > 0) { fprintf (fp, "%s", g_type_name (type)); for (i=0; i < n_prerequisites; i++) fprintf (fp, " %s", g_type_name (prerequisites[i])); fprintf (fp, "\\n"); } g_free (prerequisites); children = g_type_children (type, &n_children); for (i=0; i < n_children; i++) output_prerequisites (fp, children[i]); g_free (children); #endif } static void output_args (void) { FILE *fp; gint i; fp = fopen (args_filename, "w"); if (fp == NULL) { g_warning ("Couldn't open output file: %s : %s", args_filename, g_strerror(errno)); return; } for (i = 0; object_types[i]; i++) { output_object_args (fp, object_types[i]); } fclose (fp); } static gint compare_param_specs (const void *a, const void *b) { GParamSpec *spec_a = *(GParamSpec **)a; GParamSpec *spec_b = *(GParamSpec **)b; return strcmp (g_param_spec_get_name (spec_a), g_param_spec_get_name (spec_b)); } /* Its common to have unsigned properties restricted * to the signed range. Therefore we make this look * a bit nicer by spelling out the max constants. */ /* Don't use "==" with floats, it might trigger a gcc warning. */ #define GTKDOC_COMPARE_FLOAT(x, y) (x <= y && x >= y) static gchar* describe_double_constant (gdouble value) { gchar *desc; if (GTKDOC_COMPARE_FLOAT (value, G_MAXDOUBLE)) desc = g_strdup ("G_MAXDOUBLE"); else if (GTKDOC_COMPARE_FLOAT (value, G_MINDOUBLE)) desc = g_strdup ("G_MINDOUBLE"); else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXDOUBLE)) desc = g_strdup ("-G_MAXDOUBLE"); else if (GTKDOC_COMPARE_FLOAT (value, G_MAXFLOAT)) desc = g_strdup ("G_MAXFLOAT"); else if (GTKDOC_COMPARE_FLOAT (value, G_MINFLOAT)) desc = g_strdup ("G_MINFLOAT"); else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXFLOAT)) desc = g_strdup ("-G_MAXFLOAT"); else{ /* make sure floats are output with a decimal dot irrespective of * current locale. Use formatd since we want human-readable numbers * and do not need the exact same bit representation when deserialising */ desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE, "%g", value); } return desc; } static gchar* describe_signed_constant (gsize size, gint64 value) { gchar *desc = NULL; switch (size) { case 8: if (value == G_MAXINT64) desc = g_strdup ("G_MAXINT64"); else if (value == G_MININT64) desc = g_strdup ("G_MININT64"); /* fall through */ case 4: if (sizeof (int) == 4) { if (value == G_MAXINT) desc = g_strdup ("G_MAXINT"); else if (value == G_MININT) desc = g_strdup ("G_MININT"); else if (value == (gint64)G_MAXUINT) desc = g_strdup ("G_MAXUINT"); } if (value == G_MAXLONG) desc = g_strdup ("G_MAXLONG"); else if (value == G_MINLONG) desc = g_strdup ("G_MINLONG"); else if (value == (gint64)G_MAXULONG) desc = g_strdup ("G_MAXULONG"); /* fall through */ case 2: if (sizeof (int) == 2) { if (value == G_MAXINT) desc = g_strdup ("G_MAXINT"); else if (value == G_MININT) desc = g_strdup ("G_MININT"); else if (value == (gint64)G_MAXUINT) desc = g_strdup ("G_MAXUINT"); } break; default: break; } if (!desc) desc = g_strdup_printf ("%" G_GINT64_FORMAT, value); return desc; } static gchar* describe_unsigned_constant (gsize size, guint64 value) { gchar *desc = NULL; switch (size) { case 8: if (value == G_MAXINT64) desc = g_strdup ("G_MAXINT64"); else if (value == G_MAXUINT64) desc = g_strdup ("G_MAXUINT64"); /* fall through */ case 4: if (sizeof (int) == 4) { if (value == (guint64)G_MAXINT) desc = g_strdup ("G_MAXINT"); else if (value == G_MAXUINT) desc = g_strdup ("G_MAXUINT"); } if (value == (guint64)G_MAXLONG) desc = g_strdup ("G_MAXLONG"); else if (value == G_MAXULONG) desc = g_strdup ("G_MAXULONG"); /* fall through */ case 2: if (sizeof (int) == 2) { if (value == (guint64)G_MAXINT) desc = g_strdup ("G_MAXINT"); else if (value == G_MAXUINT) desc = g_strdup ("G_MAXUINT"); } break; default: break; } if (!desc) desc = g_strdup_printf ("%" G_GUINT64_FORMAT, value); return desc; } static gchar* describe_type (GParamSpec *spec) { gchar *desc; gchar *lower; gchar *upper; if (G_IS_PARAM_SPEC_CHAR (spec)) { GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec); lower = describe_signed_constant (sizeof(gchar), pspec->minimum); upper = describe_signed_constant (sizeof(gchar), pspec->maximum); if (pspec->minimum == G_MININT8 && pspec->maximum == G_MAXINT8) desc = g_strdup (""); else if (pspec->minimum == G_MININT8) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXINT8) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_UCHAR (spec)) { GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec); lower = describe_unsigned_constant (sizeof(guchar), pspec->minimum); upper = describe_unsigned_constant (sizeof(guchar), pspec->maximum); if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT8) desc = g_strdup (""); else if (pspec->minimum == 0) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXUINT8) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_INT (spec)) { GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec); lower = describe_signed_constant (sizeof(gint), pspec->minimum); upper = describe_signed_constant (sizeof(gint), pspec->maximum); if (pspec->minimum == G_MININT && pspec->maximum == G_MAXINT) desc = g_strdup (""); else if (pspec->minimum == G_MININT) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXINT) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_UINT (spec)) { GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec); lower = describe_unsigned_constant (sizeof(guint), pspec->minimum); upper = describe_unsigned_constant (sizeof(guint), pspec->maximum); if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT) desc = g_strdup (""); else if (pspec->minimum == 0) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXUINT) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_LONG (spec)) { GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec); lower = describe_signed_constant (sizeof(glong), pspec->minimum); upper = describe_signed_constant (sizeof(glong), pspec->maximum); if (pspec->minimum == G_MINLONG && pspec->maximum == G_MAXLONG) desc = g_strdup (""); else if (pspec->minimum == G_MINLONG) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXLONG) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_ULONG (spec)) { GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec); lower = describe_unsigned_constant (sizeof(gulong), pspec->minimum); upper = describe_unsigned_constant (sizeof(gulong), pspec->maximum); if (pspec->minimum == 0 && pspec->maximum == G_MAXULONG) desc = g_strdup (""); else if (pspec->minimum == 0) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXULONG) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_INT64 (spec)) { GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec); lower = describe_signed_constant (sizeof(gint64), pspec->minimum); upper = describe_signed_constant (sizeof(gint64), pspec->maximum); if (pspec->minimum == G_MININT64 && pspec->maximum == G_MAXINT64) desc = g_strdup (""); else if (pspec->minimum == G_MININT64) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXINT64) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_UINT64 (spec)) { GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec); lower = describe_unsigned_constant (sizeof(guint64), pspec->minimum); upper = describe_unsigned_constant (sizeof(guint64), pspec->maximum); if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT64) desc = g_strdup (""); else if (pspec->minimum == 0) desc = g_strdup_printf ("<= %s", upper); else if (pspec->maximum == G_MAXUINT64) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_FLOAT (spec)) { GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec); lower = describe_double_constant (pspec->minimum); upper = describe_double_constant (pspec->maximum); if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXFLOAT)) { if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)) desc = g_strdup (""); else desc = g_strdup_printf ("<= %s", upper); } else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } else if (G_IS_PARAM_SPEC_DOUBLE (spec)) { GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec); lower = describe_double_constant (pspec->minimum); upper = describe_double_constant (pspec->maximum); if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXDOUBLE)) { if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)) desc = g_strdup (""); else desc = g_strdup_printf ("<= %s", upper); } else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)) desc = g_strdup_printf (">= %s", lower); else desc = g_strdup_printf ("[%s,%s]", lower, upper); g_free (lower); g_free (upper); } #if GLIB_CHECK_VERSION (2, 12, 0) else if (G_IS_PARAM_SPEC_GTYPE (spec)) { GParamSpecGType *pspec = G_PARAM_SPEC_GTYPE (spec); gboolean is_pointer; desc = g_strdup (get_type_name (pspec->is_a_type, &is_pointer)); } #endif #if GLIB_CHECK_VERSION (2, 25, 9) else if (G_IS_PARAM_SPEC_VARIANT (spec)) { GParamSpecVariant *pspec = G_PARAM_SPEC_VARIANT (spec); gchar *variant_type; variant_type = g_variant_type_dup_string (pspec->type); desc = g_strdup_printf ("GVariant<%s>", variant_type); g_free (variant_type); } #endif else { desc = g_strdup (""); } return desc; } static gchar* describe_default (GParamSpec *spec) { gchar *desc; if (G_IS_PARAM_SPEC_CHAR (spec)) { GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec); desc = g_strdup_printf ("%d", pspec->default_value); } else if (G_IS_PARAM_SPEC_UCHAR (spec)) { GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec); desc = g_strdup_printf ("%u", pspec->default_value); } else if (G_IS_PARAM_SPEC_BOOLEAN (spec)) { GParamSpecBoolean *pspec = G_PARAM_SPEC_BOOLEAN (spec); desc = g_strdup_printf ("%s", pspec->default_value ? "TRUE" : "FALSE"); } else if (G_IS_PARAM_SPEC_INT (spec)) { GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec); desc = g_strdup_printf ("%d", pspec->default_value); } else if (G_IS_PARAM_SPEC_UINT (spec)) { GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec); desc = g_strdup_printf ("%u", pspec->default_value); } else if (G_IS_PARAM_SPEC_LONG (spec)) { GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec); desc = g_strdup_printf ("%ld", pspec->default_value); } else if (G_IS_PARAM_SPEC_LONG (spec)) { GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec); desc = g_strdup_printf ("%lu", pspec->default_value); } else if (G_IS_PARAM_SPEC_INT64 (spec)) { GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec); desc = g_strdup_printf ("%" G_GINT64_FORMAT, pspec->default_value); } else if (G_IS_PARAM_SPEC_UINT64 (spec)) { GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec); desc = g_strdup_printf ("%" G_GUINT64_FORMAT, pspec->default_value); } else if (G_IS_PARAM_SPEC_UNICHAR (spec)) { GParamSpecUnichar *pspec = G_PARAM_SPEC_UNICHAR (spec); if (g_unichar_isprint (pspec->default_value)) desc = g_strdup_printf ("'%c'", pspec->default_value); else desc = g_strdup_printf ("%u", pspec->default_value); } else if (G_IS_PARAM_SPEC_ENUM (spec)) { GParamSpecEnum *pspec = G_PARAM_SPEC_ENUM (spec); GEnumValue *value = g_enum_get_value (pspec->enum_class, pspec->default_value); if (value) desc = g_strdup_printf ("%s", value->value_name); else desc = g_strdup_printf ("%d", pspec->default_value); } else if (G_IS_PARAM_SPEC_FLAGS (spec)) { GParamSpecFlags *pspec = G_PARAM_SPEC_FLAGS (spec); guint default_value; GString *acc; default_value = pspec->default_value; acc = g_string_new (""); while (default_value) { GFlagsValue *value = g_flags_get_first_value (pspec->flags_class, default_value); if (!value) break; if (acc->len > 0) g_string_append (acc, "|"); g_string_append (acc, value->value_name); default_value &= ~value->value; } if (default_value == 0) desc = g_string_free (acc, FALSE); else { desc = g_strdup_printf ("%d", pspec->default_value); g_string_free (acc, TRUE); } } else if (G_IS_PARAM_SPEC_FLOAT (spec)) { GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec); /* make sure floats are output with a decimal dot irrespective of * current locale. Use formatd since we want human-readable numbers * and do not need the exact same bit representation when deserialising */ desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE, "%g", pspec->default_value); } else if (G_IS_PARAM_SPEC_DOUBLE (spec)) { GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec); /* make sure floats are output with a decimal dot irrespective of * current locale. Use formatd since we want human-readable numbers * and do not need the exact same bit representation when deserialising */ desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE); g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE, "%g", pspec->default_value); } else if (G_IS_PARAM_SPEC_STRING (spec)) { GParamSpecString *pspec = G_PARAM_SPEC_STRING (spec); if (pspec->default_value) { gchar *esc = g_strescape (pspec->default_value, NULL); desc = g_strdup_printf ("\\"%s\\"", esc); g_free (esc); } else desc = g_strdup_printf ("NULL"); } else { desc = g_strdup (""); } return desc; } static void output_object_args (FILE *fp, GType object_type) { gpointer class; const gchar *object_class_name; guint arg; gchar flags[16], *pos; GParamSpec **properties; guint n_properties; gboolean child_prop; gboolean style_prop; gboolean is_pointer; const gchar *type_name; gchar *type_desc; gchar *default_value; if (G_TYPE_IS_OBJECT (object_type)) { class = g_type_class_peek (object_type); if (!class) return; properties = g_object_class_list_properties (class, &n_properties); } #if GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 3) else if (G_TYPE_IS_INTERFACE (object_type)) { class = g_type_default_interface_ref (object_type); if (!class) return; properties = g_object_interface_list_properties (class, &n_properties); } #endif else return; object_class_name = g_type_name (object_type); child_prop = FALSE; style_prop = FALSE; while (TRUE) { qsort (properties, n_properties, sizeof (GParamSpec *), compare_param_specs); for (arg = 0; arg < n_properties; arg++) { GParamSpec *spec = properties[arg]; const gchar *nick, *blurb, *dot; if (spec->owner_type != object_type) continue; pos = flags; /* We use one-character flags for simplicity. */ if (child_prop && !style_prop) *pos++ = 'c'; if (style_prop) *pos++ = 's'; if (spec->flags & G_PARAM_READABLE) *pos++ = 'r'; if (spec->flags & G_PARAM_WRITABLE) *pos++ = 'w'; if (spec->flags & G_PARAM_CONSTRUCT) *pos++ = 'x'; if (spec->flags & G_PARAM_CONSTRUCT_ONLY) *pos++ = 'X'; *pos = 0; nick = g_param_spec_get_nick (spec); blurb = g_param_spec_get_blurb (spec); dot = ""; if (blurb) { int str_len = strlen (blurb); if (str_len > 0 && blurb[str_len - 1] != '.') dot = "."; } type_desc = describe_type (spec); default_value = describe_default (spec); type_name = get_type_name (spec->value_type, &is_pointer); fprintf (fp, "\\n%s::%s\\n%s%s\\n%s\\n%s\\n%s\\n%s%s\\n%s\\n\\n\\n", object_class_name, g_param_spec_get_name (spec), type_name, is_pointer ? "*" : "", type_desc, flags, nick ? nick : "(null)", blurb ? blurb : "(null)", dot, default_value); g_free (type_desc); g_free (default_value); } g_free (properties); #ifdef GTK_IS_CONTAINER_CLASS if (!child_prop && GTK_IS_CONTAINER_CLASS (class)) { properties = gtk_container_class_list_child_properties (class, &n_properties); child_prop = TRUE; continue; } #endif #ifdef GTK_IS_CELL_AREA_CLASS if (!child_prop && GTK_IS_CELL_AREA_CLASS (class)) { properties = gtk_cell_area_class_list_cell_properties (class, &n_properties); child_prop = TRUE; continue; } #endif #ifdef GTK_IS_WIDGET_CLASS #if GTK_CHECK_VERSION(2,1,0) if (!style_prop && GTK_IS_WIDGET_CLASS (class)) { properties = gtk_widget_class_list_style_properties (GTK_WIDGET_CLASS (class), &n_properties); style_prop = TRUE; continue; } #endif #endif break; } } EOT close OUTPUT; # Compile and run our file $CC = $ENV{CC} ? $ENV{CC} : "gcc"; $LD = $ENV{LD} ? $ENV{LD} : $CC; $CFLAGS = $ENV{CFLAGS} ? "$ENV{CFLAGS}" : ""; $LDFLAGS = $ENV{LDFLAGS} ? $ENV{LDFLAGS} : ""; my $o_file; if ($CC =~ /libtool/) { $o_file = "$MODULE-scan.lo" } else { $o_file = "$MODULE-scan.o" } my $stdout=""; if (!defined($VERBOSE) or $VERBOSE eq "0") { $stdout=">/dev/null"; } # Compiling scanner $command = "$CC $stdout $CFLAGS -c -o $o_file $MODULE-scan.c"; system("($command)") == 0 or die "Compilation of scanner failed: $!\n"; # Linking scanner $command = "$LD $stdout -o $MODULE-scan $o_file $LDFLAGS"; system($command) == 0 or die "Linking of scanner failed: $!\n"; # Running scanner $MODULE-scan "; system("sh -c ./$MODULE-scan") == 0 or die "Scan failed: $!\n"; if (!defined($ENV{"GTK_DOC_KEEP_INTERMEDIATE"})) { unlink "./$MODULE-scan.c", "./$MODULE-scan.o", "./$MODULE-scan.lo", "./$MODULE-scan"; } &UpdateFileIfChanged ($old_hierarchy_filename, $new_hierarchy_filename, 0); # we will merge these in scangobj-merge.py #&UpdateFileIfChanged ($old_interfaces_filename, $new_interfaces_filename, 0); #&UpdateFileIfChanged ($old_prerequisites_filename, $new_prerequisites_filename, 0); #&UpdateFileIfChanged ($old_signals_filename, $new_signals_filename, 0); #&UpdateFileIfChanged ($old_args_filename, $new_args_filename, 0); gst-plugins-good-0.10.31/common/mangle-tmpl.py0000644000175000017500000001162411671200067016062 00000000000000# -*- Mode: Python -*- # vi:si:et:sw=4:sts=4:ts=4 """ use the output from gst-xmlinspect.py to mangle tmpl/*.sgml and insert/overwrite Short Description and Long Description """ # FIXME: right now it uses pygst and scans on its own; # we really should use inspect/*.xml instead since the result of # gst-xmlinspect.py is committed by the docs maintainer, who can be # expected to have pygst, but this step should be done for every docs build, # so no pygst allowed # read in inspect/*.xml # for every tmpl/element-(name).xml: mangle with details from element import glob import re import sys import os class Tmpl: def __init__(self, filename): self.filename = filename self._sectionids = [] self._sections = {} def read(self): """ Read and parse the sections from the given file. """ lines = open(self.filename).readlines() matcher = re.compile("\n") id = None for line in lines: match = matcher.search(line) if match: id = match.expand("\\1") self._sectionids.append(id) self._sections[id] = [] else: if not id: sys.stderr.write( "WARNING: line before a SECTION header: %s" % line) else: self._sections[id].append(line) def get_section(self, id): """ Get the content from the given section. """ return self._sections[id] def set_section(self, id, content): """ Replace the given section id with the given content. """ self._sections[id] = content def output(self): """ Return the output of the current template in the tmpl/*.sgml format. """ lines = [] for id in self._sectionids: lines.append("\n" % id) for line in self._sections[id]: lines.append(line) return "".join(lines) def write(self, backup=False): """ Write out the template file again, backing up the previous one. """ if backup: target = self.filename + ".mangle.bak" os.rename(self.filename, target) handle = open(self.filename, "w") handle.write(self.output()) handle.close() import xml.dom.minidom def get_elements(file): elements = {} doc = xml.dom.minidom.parse(file) elem = None for e in doc.childNodes: if e.nodeType == e.ELEMENT_NODE and e.localName == 'plugin': elem = e break if elem == None: return None elem2 = None for e in elem.childNodes: if e.nodeType == e.ELEMENT_NODE and e.localName == 'elements': elem2 = e break if elem2 == None: return None elem = elem2 for e in elem.childNodes: if e.nodeType == e.ELEMENT_NODE and e.localName == 'element': name = None description = None for e2 in e.childNodes: if e2.nodeType == e2.ELEMENT_NODE and e2.localName == 'name': name = e2.childNodes[0].nodeValue.encode("UTF-8") elif e2.nodeType == e2.ELEMENT_NODE and e2.localName == 'description': if e2.childNodes: description = e2.childNodes[0].nodeValue.encode("UTF-8") else: description = 'No description' if name != None and description != None: elements[name] = {'description': description} return elements def main(): if not len(sys.argv) == 3: sys.stderr.write('Please specify the inspect/ dir and the tmpl/ dir') sys.exit(1) inspectdir = sys.argv[1] tmpldir = sys.argv[2] # parse all .xml files; build map of element name -> short desc #for file in glob.glob("inspect/plugin-*.xml"): elements = {} for file in glob.glob("%s/plugin-*.xml" % inspectdir): elements.update(get_elements(file)) for file in glob.glob("%s/element-*.sgml" % tmpldir): base = os.path.basename(file) element = base[len("element-"):-len(".sgml")] tmpl = Tmpl(file) tmpl.read() if element in elements.keys(): description = elements[element]['description'] tmpl.set_section("Short_Description", "%s\n\n" % description) # put in an include if not yet there line = '' + \ '' + \ '\n' section = tmpl.get_section("Long_Description") if not section[0] == line: section.insert(0, line) tmpl.set_section("Long_Description", section) tmpl.write() main() gst-plugins-good-0.10.31/common/gtk-doc.mak0000644000175000017500000001657211677341671015341 00000000000000########################################################################### # Everything below here is generic and you shouldn't need to change it. ########################################################################### # thomas: except of course that we did # thomas: copied from glib-2 # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) # thomas: make docs parallel installable TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ EXTRA_DIST = \ $(content_files) \ $(extra_files) \ $(HTML_IMAGES) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE).types \ $(DOC_OVERRIDES) \ $(DOC_MODULE)-sections.txt DOC_STAMPS = \ setup-build.stamp \ scan-build.stamp \ sgml-build.stamp \ html-build.stamp \ sgml.stamp \ html.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals \ .libs/$(DOC_MODULE)-scan.o REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) doc-registry.xml if ENABLE_GTK_DOC all-local: html-build.stamp #### setup #### setup-build.stamp: $(content_files) -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(DOC_MAIN_SGML_FILE) $(DOC_OVERRIDES) $(DOC_MODULE)-sections.txt $(DOC_MODULE).types $(content_files)`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### # in the case of non-srcdir builds, the built gst directory gets added # to gtk-doc scanning; but only then, to avoid duplicates scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan \ $(SCAN_OPTIONS) $(EXTRA_HFILES) \ --module=$(DOC_MODULE) \ $${_source_dir} \ --ignore-headers="$(IGNORE_HFILES)" @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null; then \ echo " DOC Introspecting gobjects"; \ GST_PLUGIN_SYSTEM_PATH=`cd $(top_builddir) && pwd` \ GST_PLUGIN_PATH= \ GST_REGISTRY=doc-registry.xml \ $(GTKDOC_EXTRA_ENVIRONMENT) \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" \ LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj --type-init-func="gst_init(NULL,NULL)" \ --module=$(DOC_MODULE) ; \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(expand_content_files) @echo ' DOC Building XML' @gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS) @cp ../version.entities xml @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building HTML' @rm -rf html @mkdir html @cp -pr xml html @cp ../version.entities ./ @mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ @gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$(?)" = "0"; then \ mkhtml_options=--path="$(abs_srcdir)"; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) @mv html/index.sgml html/index.sgml.bak @$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml @rm -f html/index.sgml.bak @rm -rf html/xml @rm -f version.entities @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) $(abs_builddir)/html ) @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp clean-local-gtkdoc: @rm -rf xml tmpl html # clean files copied for nonsrcdir templates build @if test x"$(srcdir)" != x. ; then \ rm -rf $(DOC_MODULE).types; \ fi else all-local: clean-local-gtkdoc: endif clean-local: clean-local-gtkdoc @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -f $(REPORT_FILES) \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @rm -rf tmpl/*.sgml.bak @rm -f $(DOC_MODULE).hierarchy @rm -f *.stamp || true @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(DOC_MAIN_SGML_FILE) ; \ rm -f $(DOC_OVERRIDES) ; \ rm -f $(DOC_MODULE).types ; \ rm -f $(DOC_MODULE).interfaces ; \ rm -f $(DOC_MODULE).prerequisites ; \ rm -f $(DOC_MODULE)-sections.txt ; \ rm -f $(content_files) ; \ rm -rf tmpl/*.sgml ; \ fi @rm -rf *.o maintainer-clean-local: clean @cd $(srcdir) && rm -rf html \ xml $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt # thomas: make docs parallel installable; devhelp requires majorminor too install-data-local: (installfiles=`echo $(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css`; \ if test "$$installfiles" = '$(builddir)/html/*.sgml $(builddir)/html/*.html $(builddir)/html/*.png $(builddir)/html/*.css'; \ then echo '-- Nothing to install' ; \ else \ $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ for i in $$installfiles; do \ echo '-- Installing '$$i ; \ $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ done; \ echo '-- Installing $(builddir)/html/$(DOC_MODULE).devhelp2' ; \ if test -e $(builddir)/html/$(DOC_MODULE).devhelp2; then \ $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \ $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ fi; \ (which gtkdoc-rebase >/dev/null && \ gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \ fi) uninstall-local: if test -d $(DESTDIR)$(TARGET_DIR); then \ rm -rf $(DESTDIR)$(TARGET_DIR)/*; \ rmdir -p $(DESTDIR)$(TARGET_DIR) 2>/dev/null || true; \ else \ echo '-- Nothing to uninstall' ; \ fi; # # Require gtk-doc when making dist # if ENABLE_GTK_DOC dist-check-gtkdoc: else dist-check-gtkdoc: @echo "*** gtk-doc must be installed and enabled in order to make dist" @false endif dist-hook: dist-check-gtkdoc dist-hook-local mkdir $(distdir)/html cp html/* $(distdir)/html -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ cd $(distdir) && rm -f $(DISTCLEANFILES) -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs # avoid spurious build errors when distchecking with -jN .NOTPARALLEL: gst-plugins-good-0.10.31/common/cruft.mak0000644000175000017500000000312211671200067015102 00000000000000# checks for left-over files in the (usually uninstalled) tree, ie. for # stuff that best be deleted to avoid problems like having old plugin binaries # lying around. # # set CRUFT_FILES and/or CRUFT_DIRS in your Makefile.am when you include this check-cruft: @cruft_files=""; cruft_dirs=""; \ for f in $(CRUFT_FILES); do \ if test -e $$f; then \ cruft_files="$$cruft_files $$f"; \ fi \ done; \ for d in $(CRUFT_DIRS); do \ if test -e $$d; then \ cruft_dirs="$$cruft_dirs $$d"; \ fi \ done; \ if test "x$$cruft_files$$cruft_dirs" != x; then \ echo; \ echo "**** CRUFT ALERT *****"; \ echo; \ echo "The following files and directories may not be needed any "; \ echo "longer (usually because a plugin has been merged into "; \ echo "another plugin, moved to a different module, or been "; \ echo "renamed), and you probably want to clean them up if you "; \ echo "don't have local changes: "; \ echo; \ for f in $$cruft_files; do echo "file $$f"; done; \ echo; \ for d in $$cruft_dirs; do echo "directory $$d"; done; \ echo; \ echo "'make clean-cruft' will remove these for you."; \ echo; \ fi clean-cruft-dirs: @for d in $(CRUFT_DIRS); do \ if test -e $$d; then \ rm -r "$$d" && echo "Removed directory $$d"; \ fi \ done clean-cruft-files: @for f in $(CRUFT_FILES); do \ if test -e $$f; then \ rm "$$f" && echo "Removed file $$f"; \ fi \ done clean-cruft: clean-cruft-dirs clean-cruft-files # also might want to add this to your Makefile.am: # # all-local: check-cruft gst-plugins-good-0.10.31/common/Makefile.in0000644000175000017500000006206011720560223015336 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = common DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = m4 EXTRA_DIST = \ ChangeLog \ gettext.patch \ glib-gen.mak gtk-doc.mak upload-doc.mak \ cruft.mak release.mak win32.mak po.mak \ parallel-subdirs.mak \ gst-autogen.sh \ check-exports \ c-to-xml.py mangle-tmpl.py scangobj-merge.py \ gtk-doc-plugins.mak \ plugins.xsl gstdoc-scangobj \ gst.supp check.mak \ coverage/lcov.mak \ coverage/coverage-report.pl \ coverage/coverage-report.xsl \ coverage/coverage-report-entry.pl \ download-translations \ extract-release-date-from-doap-file \ gst-indent \ orc.mak all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/common/upload-doc.mak0000644000175000017500000000567611671200067016026 00000000000000# this snippet is to be included by both our docbook manuals # and gtk-doc API references # it adds an upload target to each of these dir's Makefiles # each Makefile.am should define the following variables: # - DOC: the base name of the documentation # (faq, manual, pwg, gstreamer, gstreamer-libs) # - FORMATS: the formats in which DOC is output # (html ps pdf) # if you want to use it, make sure your $HOME/.ssh/config file contains the # correct User entry for the Host entry for the DOC_SERVER # these variables define the location of the online docs DOC_SERVER = gstreamer.freedesktop.org DOC_BASE = /srv/gstreamer.freedesktop.org/www/data/doc DOC_URL = $(DOC_SERVER):$(DOC_BASE) upload: $(FORMATS) @if echo $(FORMATS) | grep html > /dev/null; then \ echo "Preparing docs for upload (rebasing cross-references) ..." ; \ if test x$(builddir) != x$(srcdir); then \ echo "make upload can only be used if srcdir == builddir"; \ exit 1; \ fi; \ # gtkdoc-rebase sometimes gets confused, so reset everything to \ # local links before rebasing to online links \ gtkdoc-rebase --html-dir=$(builddir)/html 2>/dev/null 2>/dev/null ; \ rebase=`gtkdoc-rebase --verbose --online --html-dir=$(builddir)/html` ; \ echo "$$rebase" | grep -e "On-*line"; \ for req in glib gobject gstreamer gstreamer-libs gst-plugins-base-libs; do \ if ! ( echo "$$rebase" | grep -i -e "On-*line.*/$$req/" ); then \ echo "===============================================================================" ; \ echo " Could not determine online location for $$req docs. Cross-referencing will be " ; \ echo " broken, so not uploading. Make sure the library's gtk-doc documentation is " ; \ echo " installed somewhere in /usr/share/gtk-doc. " ; \ echo "===============================================================================" ; \ exit 1; \ fi; \ done; \ export SRC="$$SRC html"; \ fi; \ if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \ if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \ \ # upload releases to both 0.10.X/ and head/ subdirectories \ if test "x$(PACKAGE_VERSION_NANO)" = x0; then \ export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) mkdir -p $$DIR; \ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ fi; \ \ export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) mkdir -p $$DIR; \ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ \ if echo $(FORMATS) | grep html > /dev/null; then \ echo "Un-preparing docs for upload (rebasing cross-references) ..." ; \ gtkdoc-rebase --html-dir=$(builddir)/html ; \ fi; \ echo Done gst-plugins-good-0.10.31/common/m4/0000755000175000017500000000000011720565345013677 500000000000000gst-plugins-good-0.10.31/common/m4/glib-gettext.m40000644000175000017500000003250311671200067016453 00000000000000# Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.in. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_in,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) gst-plugins-good-0.10.31/common/m4/gst-function.m40000644000175000017500000000402711671200067016474 00000000000000dnl dnl Check for compiler mechanism to show functions in debugging dnl copied from an Ali patch floating on the internet dnl AC_DEFUN([AG_GST_CHECK_FUNCTION],[ dnl #1: __PRETTY_FUNCTION__ AC_MSG_CHECKING(whether $CC implements __PRETTY_FUNCTION__) AC_CACHE_VAL(gst_cv_have_pretty_function,[ AC_TRY_LINK([#include ], [printf("%s", __PRETTY_FUNCTION__);], gst_cv_have_pretty_function=yes, gst_cv_have_pretty_function=no) ]) AC_MSG_RESULT($gst_cv_have_pretty_function) if test "$gst_cv_have_pretty_function" = yes; then AC_DEFINE(HAVE_PRETTY_FUNCTION, 1, [defined if the compiler implements __PRETTY_FUNCTION__]) fi dnl #2: __FUNCTION__ AC_MSG_CHECKING(whether $CC implements __FUNCTION__) AC_CACHE_VAL(gst_cv_have_function,[ AC_TRY_LINK([#include ], [printf("%s", __FUNCTION__);], gst_cv_have_function=yes, gst_cv_have_function=no) ]) AC_MSG_RESULT($gst_cv_have_function) if test "$gst_cv_have_function" = yes; then AC_DEFINE(HAVE_FUNCTION, 1, [defined if the compiler implements __FUNCTION__]) fi dnl #3: __func__ AC_MSG_CHECKING(whether $CC implements __func__) AC_CACHE_VAL(gst_cv_have_func,[ AC_TRY_LINK([#include ], [printf("%s", __func__);], gst_cv_have_func=yes, gst_cv_have_func=no) ]) AC_MSG_RESULT($gst_cv_have_func) if test "$gst_cv_have_func" = yes; then AC_DEFINE(HAVE_FUNC, 1, [defined if the compiler implements __func__]) fi dnl now define FUNCTION to whatever works, and fallback to "" if test "$gst_cv_have_pretty_function" = yes; then function=__PRETTY_FUNCTION__ else if test "$gst_cv_have_function" = yes; then function=__FUNCTION__ else if test "$gst_cv_have_func" = yes; then function=__func__ else function=\"\" fi fi fi AC_DEFINE_UNQUOTED(GST_FUNCTION, $function, [macro to use to show function name]) ]) gst-plugins-good-0.10.31/common/m4/as-python.m40000644000175000017500000001175011671200067015777 00000000000000## ------------------------ ## Python file handling ## From Andrew Dalke ## Updated by James Henstridge ## Updated by Andy Wingo to loop through possible pythons ## ------------------------ # AS_PATH_PYTHON([MINIMUM-VERSION]) # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # If the MINIMUM-VERSION argument is passed, AS_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. # Updated to loop over all possible python binaries by Andy Wingo # # Updated to only warn and unset PYTHON if no good one is found AC_DEFUN([AS_PATH_PYTHON], [ dnl Find a version of Python. I could check for python versions 1.4 dnl or earlier, but the default installation locations changed from dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages dnl in 1.5, and I don't want to maintain that logic. dnl should we do the version check? PYTHON_CANDIDATES="python python2.2 python2.1 python2.0 python2 \ python1.6 python1.5" ifelse([$1],[], [AC_PATH_PROG(PYTHON, $PYTHON_CANDIDATES)], [ AC_MSG_NOTICE(Looking for Python version >= $1) changequote(<<, >>)dnl prog=" import sys, string minver = '$1' # split string by '.' and convert to numeric minver_info = map(string.atoi, string.split(minver, '.')) # we can now do comparisons on the two lists: if sys.version_info >= tuple(minver_info): sys.exit(0) else: sys.exit(1)" changequote([, ])dnl python_good=false for python_candidate in $PYTHON_CANDIDATES; do unset PYTHON AC_PATH_PROG(PYTHON, $python_candidate) 1> /dev/null 2> /dev/null if test "x$PYTHON" = "x"; then continue; fi if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then AC_MSG_CHECKING(["$PYTHON":]) AC_MSG_RESULT([okay]) python_good=true break; else dnl clear the cache val unset ac_cv_path_PYTHON fi done ]) if test "$python_good" != "true"; then AC_MSG_WARN([No suitable version of python found]) PYTHON= else AC_MSG_CHECKING([local Python configuration]) dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. Need to change quote character because of [:3] AC_SUBST(PYTHON_VERSION) changequote(<<, >>)dnl PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"` changequote([, ])dnl dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST(PYTHON_PREFIX) PYTHON_PREFIX='${prefix}' AC_SUBST(PYTHON_EXEC_PREFIX) PYTHON_EXEC_PREFIX='${exec_prefix}' dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_SUBST(PYTHON_PLATFORM) PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"` dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behaviour dnl is more consistent with lispdir.m4 for example. dnl dnl Also, if the package prefix isn't the same as python's prefix, dnl then the old $(pythondir) was pretty useless. AC_SUBST(pythondir) pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. dnl Maybe this should be put in python.am? AC_SUBST(pkgpythondir) pkgpythondir=\${pythondir}/$PACKAGE dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) Was PYTHON_SITE_EXEC in previous betas. AC_SUBST(pyexecdir) pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) dnl Maybe this should be put in python.am? AC_SUBST(pkgpyexecdir) pkgpyexecdir=\${pyexecdir}/$PACKAGE AC_MSG_RESULT([looks good]) fi ]) gst-plugins-good-0.10.31/common/m4/gst-doc.m40000644000175000017500000001220711671200067015413 00000000000000AC_DEFUN([AG_GST_DOCBOOK_CHECK], [ dnl choose a location to install docbook docs in if test "x$PACKAGE_TARNAME" = "x" then AC_MSG_ERROR([Internal error - PACKAGE_TARNAME not set]) fi docdir="\$(datadir)/doc/$PACKAGE_TARNAME-$GST_MAJORMINOR" dnl enable/disable docbook documentation building AC_ARG_ENABLE(docbook, AC_HELP_STRING([--enable-docbook], [use docbook to build documentation [default=no]]),, enable_docbook=no) have_docbook=no if test x$enable_docbook = xyes; then dnl check if we actually have everything we need dnl check for docbook tools AC_CHECK_PROG(HAVE_DOCBOOK2PS, docbook2ps, yes, no) AC_CHECK_PROG(HAVE_DOCBOOK2HTML, docbook2html, yes, no) AC_CHECK_PROG(HAVE_JADETEX, jadetex, yes, no) AC_CHECK_PROG(HAVE_PS2PDF, ps2pdf, yes, no) # -V option appeared in 0.6.10 docbook2html_min_version=0.6.10 if test "x$HAVE_DOCBOOK2HTML" != "xno"; then docbook2html_version=`docbook2html --version` AC_MSG_CHECKING([docbook2html version ($docbook2html_version) >= $docbook2html_min_version]) if perl -w < \$min_version_major) || ((\$docbook2html_version_major == \$min_version_major) && (\$docbook2html_version_minor >= \$min_version_minor)) || ((\$docbook2html_version_major == \$min_version_major) && (\$docbook2html_version_minor >= \$min_version_minor) && (\$docbook2html_version_micro >= \$min_version_micro))) ? 0 : 1); EOF then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) HAVE_DOCBOOK2HTML=no fi fi dnl check if we can process docbook stuff AS_DOCBOOK(have_docbook=yes, have_docbook=no) dnl check for extra tools AC_CHECK_PROG(HAVE_DVIPS, dvips, yes, no) AC_CHECK_PROG(HAVE_XMLLINT, xmllint, yes, no) dnl check for image conversion tools AC_CHECK_PROG(HAVE_FIG2DEV, fig2dev, yes, no) if test "x$HAVE_FIG2DEV" = "xno" ; then AC_MSG_WARN([Did not find fig2dev (from xfig), images will not be generated.]) fi dnl The following is a hack: if fig2dev doesn't display an error message dnl for the desired type, we assume it supports it. HAVE_FIG2DEV_EPS=no if test "x$HAVE_FIG2DEV" = "xyes" ; then fig2dev_quiet=`fig2dev -L eps &1 >/dev/null` if test "x$fig2dev_quiet" = "x" ; then HAVE_FIG2DEV_EPS=yes fi fi HAVE_FIG2DEV_PNG=no if test "x$HAVE_FIG2DEV" = "xyes" ; then fig2dev_quiet=`fig2dev -L png &1 >/dev/null` if test "x$fig2dev_quiet" = "x" ; then HAVE_FIG2DEV_PNG=yes fi fi HAVE_FIG2DEV_PDF=no if test "x$HAVE_FIG2DEV" = "xyes" ; then fig2dev_quiet=`fig2dev -L pdf &1 >/dev/null` if test "x$fig2dev_quiet" = "x" ; then HAVE_FIG2DEV_PDF=yes fi fi AC_CHECK_PROG(HAVE_PNGTOPNM, pngtopnm, yes, no) AC_CHECK_PROG(HAVE_PNMTOPS, pnmtops, yes, no) AC_CHECK_PROG(HAVE_EPSTOPDF, epstopdf, yes, no) dnl check if we can generate HTML if test "x$HAVE_DOCBOOK2HTML" = "xyes" && \ test "x$enable_docbook" = "xyes" && \ test "x$HAVE_XMLLINT" = "xyes" && \ test "x$HAVE_FIG2DEV_PNG" = "xyes"; then DOC_HTML=yes AC_MSG_NOTICE(Will output HTML documentation) else DOC_HTML=no AC_MSG_NOTICE(Will not output HTML documentation) fi dnl check if we can generate PS if test "x$HAVE_DOCBOOK2PS" = "xyes" && \ test "x$enable_docbook" = "xyes" && \ test "x$HAVE_XMLLINT" = "xyes" && \ test "x$HAVE_JADETEX" = "xyes" && \ test "x$HAVE_FIG2DEV_EPS" = "xyes" && \ test "x$HAVE_DVIPS" = "xyes" && \ test "x$HAVE_PNGTOPNM" = "xyes" && \ test "x$HAVE_PNMTOPS" = "xyes"; then DOC_PS=yes AC_MSG_NOTICE(Will output PS documentation) else DOC_PS=no AC_MSG_NOTICE(Will not output PS documentation) fi dnl check if we can generate PDF - using only ps2pdf if test "x$DOC_PS" = "xyes" && \ test "x$enable_docbook" = "xyes" && \ test "x$HAVE_XMLLINT" = "xyes" && \ test "x$HAVE_PS2PDF" = "xyes"; then DOC_PDF=yes AC_MSG_NOTICE(Will output PDF documentation) else DOC_PDF=no AC_MSG_NOTICE(Will not output PDF documentation) fi dnl if we don't have everything, we should disable if test "x$have_docbook" != "xyes"; then enable_docbook=no fi fi dnl if we're going to install documentation, tell us where if test "x$have_docbook" = "xyes"; then AC_MSG_NOTICE(Installing documentation in $docdir) AC_SUBST(docdir) fi AM_CONDITIONAL(ENABLE_DOCBOOK, test x$enable_docbook = xyes) AM_CONDITIONAL(DOC_HTML, test x$DOC_HTML = xyes) AM_CONDITIONAL(DOC_PDF, test x$DOC_PDF = xyes) AM_CONDITIONAL(DOC_PS, test x$DOC_PS = xyes) ]) gst-plugins-good-0.10.31/common/m4/gst-feature.m40000644000175000017500000002214411701411037016275 00000000000000dnl Perform a check for a feature for GStreamer dnl Richard Boulton dnl Thomas Vander Stichele added useful stuff dnl Last modification: 25/06/2001 dnl dnl AG_GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION, dnl DEPENDENT-PLUGINS, TEST-FOR-FEATURE, dnl DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE) dnl dnl This macro adds a command line argument to allow the user to enable dnl or disable a feature, and if the feature is enabled, performs a supplied dnl test to check if the feature is available. dnl dnl The test should define HAVE_ to "yes" or "no" depending dnl on whether the feature is available. dnl dnl The macro will set USE_ to "yes" or "no" depending on dnl whether the feature is to be used. dnl Thomas changed this, so that when USE_ was already set dnl to no, then it stays that way. dnl dnl The macro will call AM_CONDITIONAL(USE_, ...) to allow dnl the feature to control what is built in Makefile.ams. If you want dnl additional actions resulting from the test, you can add them with the dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters. dnl dnl FEATURE-NAME is the name of the feature, and should be in dnl purely upper case characters. dnl FEATURE-DESCRIPTION is used to describe the feature in help text for dnl the command line argument. dnl DEPENDENT-PLUGINS lists any plug-ins which depend on this feature. dnl TEST-FOR-FEATURE is a test which sets HAVE_ to "yes" dnl or "no" depending on whether the feature is dnl available. dnl DISABLE-BY-DEFAULT if "disabled", the feature is disabled by default, dnl if any other value, the feature is enabled by default. dnl ACTION-IF-USE any extra actions to perform if the feature is to be dnl used. dnl ACTION-IF-NOTUSE any extra actions to perform if the feature is not to dnl be used. dnl dnl dnl thomas : dnl we also added a history. dnl GST_PLUGINS_YES will contain all plugins to be built dnl that were checked through AG_GST_CHECK_FEATURE dnl GST_PLUGINS_NO will contain those that won't be built AC_DEFUN([AG_GST_CHECK_FEATURE], [echo AC_MSG_NOTICE(*** checking feature: [$2] ***) if test "x[$3]" != "x" then AC_MSG_NOTICE(*** for plug-ins: [$3] ***) fi dnl builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl dnl if it is set to NO, then don't even consider it for building NOUSE= if test "x$USE_[$1]" = "xno"; then NOUSE="yes" fi AC_ARG_ENABLE(translit([$1], A-Z, a-z), [ ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])), [ case "${enableval}" in yes) USE_[$1]=yes;; no) USE_[$1]=no;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; esac], [ USE_$1=]ifelse($5, [disabled], [no], [yes])) dnl DEFAULT dnl *** set it back to no if it was preset to no if test "x$NOUSE" = "xyes"; then USE_[$1]="no" AC_MSG_WARN(*** $3 pre-configured not to be built) fi NOUSE= dnl *** If it's enabled if test x$USE_[$1] = xyes; then dnl save compile variables before the test gst_check_save_LIBS=$LIBS gst_check_save_LDFLAGS=$LDFLAGS gst_check_save_CFLAGS=$CFLAGS gst_check_save_CPPFLAGS=$CPPFLAGS gst_check_save_CXXFLAGS=$CXXFLAGS HAVE_[$1]=no dnl TEST_FOR_FEATURE $4 LIBS=$gst_check_save_LIBS LDFLAGS=$gst_check_save_LDFLAGS CFLAGS=$gst_check_save_CFLAGS CPPFLAGS=$gst_check_save_CPPFLAGS CXXFLAGS=$gst_check_save_CXXFLAGS dnl If it isn't found, unset USE_[$1] if test x$HAVE_[$1] = xno; then USE_[$1]=no else ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will be built: [$3])]) fi fi dnl *** Warn if it's disabled or not found if test x$USE_[$1] = xyes; then ifelse([$6], , :, [$6]) if test "x$3" != "x"; then GST_PLUGINS_YES="\t[$3]\n$GST_PLUGINS_YES" fi AC_DEFINE(HAVE_[$1], , [Define to enable $2]ifelse($3,,, [ (used by $3)]).) else ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will not be built: [$3])]) if test "x$3" != "x"; then GST_PLUGINS_NO="\t[$3]\n$GST_PLUGINS_NO" fi ifelse([$7], , :, [$7]) fi dnl *** Define the conditional as appropriate AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes) ]) dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once dnl sets HAVE_module if we have it dnl Richard Boulton dnl Last modification: 26/06/2001 dnl AG_GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, dnl HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) dnl dnl This check was written for GStreamer: it should be renamed and checked dnl for portability if you decide to use it elsewhere. dnl AC_DEFUN([AG_GST_CHECK_LIBHEADER], [ AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4]) if test "x$HAVE_[$1]" = "xyes"; then AC_CHECK_HEADER([$5], :, HAVE_[$1]=no) if test "x$HAVE_[$1]" = "xyes"; then dnl execute what needs to be ifelse([$6], , :, [$6]) else ifelse([$7], , :, [$7]) fi else ifelse([$7], , :, [$7]) fi AC_SUBST(HAVE_[$1]) ] ) dnl 2004-02-14 Thomas - changed to get set properly and use proper output dnl 2003-06-27 Benjamin Otte - changed to make this work with gstconfig.h dnl dnl Add a subsystem --disable flag and all the necessary symbols and substitions dnl dnl AG_GST_CHECK_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name]) dnl AC_DEFUN([AG_GST_CHECK_SUBSYSTEM_DISABLE], [ dnl this define will replace each literal subsys_def occurrence with dnl the lowercase hyphen-separated subsystem dnl e.g. if $1 is GST_DEBUG then subsys_def will be a macro with gst-debug define([subsys_def],translit([$1], _A-Z, -a-z)) AC_ARG_ENABLE(subsys_def, AC_HELP_STRING(--disable-subsys_def, [disable $2]), [ case "${enableval}" in yes) GST_DISABLE_[$1]=no ;; no) GST_DISABLE_[$1]=yes ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-subsys_def]) ;; esac ], [GST_DISABLE_[$1]=no]) dnl Default value if test x$GST_DISABLE_[$1] = xyes; then AC_MSG_NOTICE([disabled subsystem [$2]]) GST_DISABLE_[$1]_DEFINE="#define GST_DISABLE_$1 1" else GST_DISABLE_[$1]_DEFINE="/* #undef GST_DISABLE_$1 */" fi AC_SUBST(GST_DISABLE_[$1]_DEFINE) undefine([subsys_def]) ]) dnl Parse gstconfig.h for feature and defines add the symbols and substitions dnl dnl AG_GST_PARSE_SUBSYSTEM_DISABLE(GST_CONFIGPATH, FEATURE) dnl AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLE], [ grep >/dev/null "#undef GST_DISABLE_$2" $1 if test $? = 0; then GST_DISABLE_[$2]=0 else GST_DISABLE_[$2]=1 fi AC_SUBST(GST_DISABLE_[$2]) ]) dnl Parse gstconfig.h and defines add the symbols and substitions dnl dnl GST_CONFIGPATH=`$PKG_CONFIG --variable=includedir gstreamer-0.10`"/gst/gstconfig.h" dnl AG_GST_PARSE_SUBSYSTEM_DISABLES(GST_CONFIGPATH) dnl AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLES], [ AG_GST_PARSE_SUBSYSTEM_DISABLE($1,GST_DEBUG) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,LOADSAVE) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PARSE) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,TRACE) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,ALLOC_TRACE) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,REGISTRY) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PLUGIN) AG_GST_PARSE_SUBSYSTEM_DISABLE($1,XML) ]) dnl AG_GST_CHECK_GST_DEBUG_DISABLED(ACTION-IF-DISABLED, ACTION-IF-NOT-DISABLED) dnl dnl Checks if the GStreamer debugging system is disabled in the core version dnl we are compiling against (by checking gstconfig.h) dnl AC_DEFUN([AG_GST_CHECK_GST_DEBUG_DISABLED], [ AC_REQUIRE([AG_GST_CHECK_GST]) AC_MSG_CHECKING([whether the GStreamer debugging system is enabled]) AC_LANG_PUSH([C]) save_CFLAGS="$CFLAGS" CFLAGS="$GST_CFLAGS $CFLAGS" AC_COMPILE_IFELSE([ #include #ifdef GST_DISABLE_GST_DEBUG #error "debugging disabled, make compiler fail" #endif], [ debug_system_enabled=yes], [debug_system_enabled=no]) CFLAGS="$save_CFLAGS" AC_LANG_POP([C]) AC_MSG_RESULT([$debug_system_enabled]) if test "x$debug_system_enabled" = "xyes" ; then $2 true else $1 true fi ]) dnl relies on GST_PLUGINS_ALL, GST_PLUGINS_SELECTED, GST_PLUGINS_YES, dnl GST_PLUGINS_NO, and BUILD_EXTERNAL AC_DEFUN([AG_GST_OUTPUT_PLUGINS], [ printf "configure: *** Plug-ins without external dependencies that will be built:\n" ( for i in $GST_PLUGINS_SELECTED; do printf '\t'$i'\n'; done ) | sort printf "\n" printf "configure: *** Plug-ins without external dependencies that will NOT be built:\n" ( for i in $GST_PLUGINS_ALL; do case " $GST_PLUGINS_SELECTED " in *\ $i\ *) ;; *) printf '\t'$i'\n' ;; esac done ) | sort printf "\n" if test "x$BUILD_EXTERNAL" = "xno"; then printf "configure: *** No plug-ins with external dependencies will be built\n" else printf "configure: *** Plug-ins with dependencies that will be built:" printf "$GST_PLUGINS_YES\n" | sort printf "\n" printf "configure: *** Plug-ins with dependencies that will NOT be built:" printf "$GST_PLUGINS_NO\n" | sort printf "\n" fi ]) gst-plugins-good-0.10.31/common/m4/gst-error.m40000644000175000017500000001642011671200067016000 00000000000000dnl handle various error-related things dnl Thomas Vander Stichele dnl Tim-Philipp Müller dnl Last modification: 2008-02-18 dnl AG_GST_SET_ERROR_CFLAGS([ADD-WERROR], [MORE_FLAGS]) dnl AG_GST_SET_ERROR_CXXFLAGS([ADD-WERROR], [MORE_FLAGS]) dnl AG_GST_SET_LEVEL_DEFAULT([IS-GIT-VERSION]) dnl Sets WARNING_CFLAGS and ERROR_CFLAGS to something the compiler dnl will accept and AC_SUBST them so they are available in Makefile dnl dnl WARNING_CFLAGS will contain flags to make the compiler emit more dnl warnings. dnl ERROR_CFLAGS will contain flags to make those warnings fatal, dnl unless ADD-WERROR is set to "no" dnl dnl If MORE_FLAGS is set, tries to add each of the given flags dnl to WARNING_CFLAGS if the compiler supports them. Each flag is dnl tested separately. dnl dnl These flags can be overridden at make time: dnl make ERROR_CFLAGS= AC_DEFUN([AG_GST_SET_ERROR_CFLAGS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AS_COMPILER_FLAG]) WARNING_CFLAGS="" ERROR_CFLAGS="" dnl if we support -Wall, set it unconditionally AS_COMPILER_FLAG(-Wall, WARNING_CFLAGS="$WARNING_CFLAGS -Wall") dnl Warn if declarations after statements are used (C99 extension) AS_COMPILER_FLAG(-Wdeclaration-after-statement, WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement") dnl Warn if variable length arrays are used (C99 extension) AS_COMPILER_FLAG(-Wvla, WARNING_CFLAGS="$WARNING_CFLAGS -Wvla") dnl Warn for invalid pointer arithmetic AS_COMPILER_FLAG(-Wpointer-arith, WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith") dnl if asked for, add -Werror if supported if test "x$1" != "xno" then AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror") dnl if -Werror isn't suported, try -errwarn=%all (Sun Forte case) if test "x$ERROR_CFLAGS" = "x" then AS_COMPILER_FLAG([-errwarn=%all], [ ERROR_CFLAGS="-errwarn=%all" dnl try -errwarn=%all,no%E_EMPTY_DECLARATION, dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH, dnl no%E_MACRO_REDEFINED (Sun Forte case) dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon dnl "statement not reached" disabled because there is g_assert_not_reached () in some places dnl "macro redefined" because of gst/gettext.h dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'? for f in 'no%E_EMPTY_DECLARATION' \ 'no%E_STATEMENT_NOT_REACHED' \ 'no%E_ARGUEMENT_MISMATCH' \ 'no%E_MACRO_REDEFINED' \ 'no%E_LOOP_NOT_ENTERED_AT_TOP' do AS_COMPILER_FLAG([-errwarn=%all,$f], [ ERROR_CFLAGS="$ERROR_CFLAGS,$f" ]) done ]) else dnl Add -fno-strict-aliasing for GLib versions before 2.19.8 dnl as before G_LOCK and friends caused strict aliasing compiler dnl warnings. PKG_CHECK_EXISTS([glib-2.0 < 2.19.8], [ AS_COMPILER_FLAG(-fno-strict-aliasing, ERROR_CFLAGS="$ERROR_CFLAGS -fno-strict-aliasing") ]) fi fi if test "x$2" != "x" then UNSUPPORTED="" list="$2" for each in $list do AS_COMPILER_FLAG($each, WARNING_CFLAGS="$WARNING_CFLAGS $each", UNSUPPORTED="$UNSUPPORTED $each") done if test "X$UNSUPPORTED" != X ; then AC_MSG_NOTICE([unsupported compiler flags: $UNSUPPORTED]) fi fi AC_SUBST(WARNING_CFLAGS) AC_SUBST(ERROR_CFLAGS) AC_MSG_NOTICE([set WARNING_CFLAGS to $WARNING_CFLAGS]) AC_MSG_NOTICE([set ERROR_CFLAGS to $ERROR_CFLAGS]) ]) dnl Sets WARNING_CXXFLAGS and ERROR_CXXFLAGS to something the compiler dnl will accept and AC_SUBST them so they are available in Makefile dnl dnl WARNING_CXXFLAGS will contain flags to make the compiler emit more dnl warnings. dnl ERROR_CXXFLAGS will contain flags to make those warnings fatal, dnl unless ADD-WERROR is set to "no" dnl dnl If MORE_FLAGS is set, tries to add each of the given flags dnl to WARNING_CFLAGS if the compiler supports them. Each flag is dnl tested separately. dnl dnl These flags can be overridden at make time: dnl make ERROR_CXXFLAGS= AC_DEFUN([AG_GST_SET_ERROR_CXXFLAGS], [ AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AS_CXX_COMPILER_FLAG]) ERROR_CXXFLAGS="" WARNING_CXXFLAGS="" dnl if we support -Wall, set it unconditionally AS_CXX_COMPILER_FLAG(-Wall, WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Wall") dnl if asked for, add -Werror if supported if test "x$1" != "xno" then AS_CXX_COMPILER_FLAG(-Werror, ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror") if test "x$ERROR_CXXFLAGS" != "x" then dnl add exceptions AS_CXX_COMPILER_FLAG([-Wno-non-virtual-dtor], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Wno-non-virtual-dtor") dnl Add -fno-strict-aliasing for GLib versions before 2.19.8 dnl as before G_LOCK and friends caused strict aliasing compiler dnl warnings. PKG_CHECK_EXISTS([glib-2.0 < 2.19.8], [ AS_CXX_COMPILER_FLAG([-fno-strict-aliasing], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing") ]) else dnl if -Werror isn't suported, try -errwarn=%all AS_CXX_COMPILER_FLAG([-errwarn=%all], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all") if test "x$ERROR_CXXFLAGS" != "x"; then dnl try -errwarn=%all,no%E_EMPTY_DECLARATION, dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH, dnl no%E_MACRO_REDEFINED (Sun Forte case) dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon dnl "statement not reached" disabled because there is g_assert_not_reached () in some places dnl "macro redefined" because of gst/gettext.h dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'? dnl FIXME: do any of these work with the c++ compiler? if not, why dnl do we check at all? for f in 'no%E_EMPTY_DECLARATION' \ 'no%E_STATEMENT_NOT_REACHED' \ 'no%E_ARGUEMENT_MISMATCH' \ 'no%E_MACRO_REDEFINED' \ 'no%E_LOOP_NOT_ENTERED_AT_TOP' do AS_CXX_COMPILER_FLAG([-errwarn=%all,$f], ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f") done fi fi fi if test "x$2" != "x" then UNSUPPORTED="" list="$2" for each in $list do AS_CXX_COMPILER_FLAG($each, WARNING_CXXFLAGS="$WARNING_CXXFLAGS $each", UNSUPPORTED="$UNSUPPORTED $each") done if test "X$UNSUPPORTED" != X ; then AC_MSG_NOTICE([unsupported compiler flags: $UNSUPPORTED]) fi fi AC_SUBST(WARNING_CXXFLAGS) AC_SUBST(ERROR_CXXFLAGS) AC_MSG_NOTICE([set WARNING_CXXFLAGS to $WARNING_CXXFLAGS]) AC_MSG_NOTICE([set ERROR_CXXFLAGS to $ERROR_CXXFLAGS]) ]) dnl Sets the default error level for debugging messages AC_DEFUN([AG_GST_SET_LEVEL_DEFAULT], [ dnl define correct errorlevel for debugging messages. We want to have dnl GST_ERROR messages printed when running cvs builds if test "x[$1]" = "xyes"; then GST_LEVEL_DEFAULT=GST_LEVEL_ERROR else GST_LEVEL_DEFAULT=GST_LEVEL_NONE fi AC_DEFINE_UNQUOTED(GST_LEVEL_DEFAULT, $GST_LEVEL_DEFAULT, [Default errorlevel to use]) dnl AC_SUBST so we can use it for win32/common/config.h AC_SUBST(GST_LEVEL_DEFAULT) ]) gst-plugins-good-0.10.31/common/m4/gst-libxml2.m40000644000175000017500000000317311671200067016221 00000000000000dnl call this macro with the minimum required version as an argument dnl this macro sets and AC_SUBSTs XML_CFLAGS and XML_LIBS dnl it also sets LIBXML_PKG, used for the pkg-config file AC_DEFUN([AG_GST_LIBXML2_CHECK], [ dnl Minimum required version of libxml2 dnl default to 2.4.9 if not specified LIBXML2_REQ=ifelse([$1],,2.4.9,[$1]) AC_SUBST(LIBXML2_REQ) dnl check for libxml2 PKG_CHECK_MODULES(XML, libxml-2.0 >= $LIBXML2_REQ, HAVE_LIBXML2=yes, [ AC_MSG_RESULT(no) HAVE_LIBXML2=no ]) if test "x$HAVE_LIBXML2" = "xyes"; then AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 is available]) else AC_MSG_ERROR([ Need libxml2 and development headers/files to build GStreamer. You can do without libxml2 if you pass --disable-loadsave to configure, but that breaks ABI, so don't do that unless you are building for an embedded setup and know what you are doing. ]) fi dnl this is for the .pc file LIBXML_PKG=', libxml-2.0' AC_SUBST(LIBXML_PKG) AC_SUBST(XML_LIBS) AC_SUBST(XML_CFLAGS) dnl XML_LIBS might pull in -lz without zlib actually being on the system, so dnl try linking with these LIBS and CFLAGS ac_save_CFLAGS=$CFLAGS ac_save_LIBS=$LIBS CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$LIBS $XML_LIBS" AC_TRY_LINK([ #include #include ],[ /* function body */ ], AC_MSG_NOTICE([Test xml2 program linked]), AC_MSG_ERROR([Could not link libxml2 test program. Check if you have the necessary dependencies.]) ) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" ]) gst-plugins-good-0.10.31/common/m4/as-auto-alt.m40000644000175000017500000000300411671200067016175 00000000000000dnl as-auto-alt.m4 0.0.2 dnl autostars m4 macro for supplying alternate autotools versions to configure dnl thomas@apestaart.org dnl dnl AS_AUTOTOOLS_ALTERNATE() dnl dnl supplies --with arguments for autoconf, autoheader, automake, aclocal AC_DEFUN([AS_AUTOTOOLS_ALTERNATE], [ dnl allow for different autoconf version AC_ARG_WITH(autoconf, AC_HELP_STRING([--with-autoconf], [use a different autoconf for regeneration of Makefiles]), [ unset AUTOCONF AM_MISSING_PROG(AUTOCONF, ${withval}) AC_MSG_NOTICE([Using $AUTOCONF as autoconf]) ]) dnl allow for different autoheader version AC_ARG_WITH(autoheader, AC_HELP_STRING([--with-autoheader], [use a different autoheader for regeneration of Makefiles]), [ unset AUTOHEADER AM_MISSING_PROG(AUTOHEADER, ${withval}) AC_MSG_NOTICE([Using $AUTOHEADER as autoheader]) ]) dnl allow for different automake version AC_ARG_WITH(automake, AC_HELP_STRING([--with-automake], [use a different automake for regeneration of Makefiles]), [ unset AUTOMAKE AM_MISSING_PROG(AUTOMAKE, ${withval}) AC_MSG_NOTICE([Using $AUTOMAKE as automake]) ]) dnl allow for different aclocal version AC_ARG_WITH(aclocal, AC_HELP_STRING([--with-aclocal], [use a different aclocal for regeneration of Makefiles]), [ unset ACLOCAL AM_MISSING_PROG(ACLOCAL, ${withval}) AC_MSG_NOTICE([Using $ACLOCAL as aclocal]) ]) ]) gst-plugins-good-0.10.31/common/m4/gst-plugin-docs.m40000644000175000017500000000123011671200067017064 00000000000000dnl AG_GST_PLUGIN_DOCS([MINIMUM-GTK-DOC-VERSION],[MINIMUM-PYTHON-VERSION]) dnl dnl checks for prerequisites for the common/mangle-tmpl.py script dnl used when building the plugin documentation AC_DEFUN([AG_GST_PLUGIN_DOCS], [ AC_BEFORE([GTK_DOC_CHECK],[$0])dnl check for gtk-doc first AC_BEFORE([AS_PATH_PYTHON],[$1])dnl find python first build_plugin_docs=no AC_MSG_CHECKING([whether to build plugin documentation]) if test x$enable_gtk_doc = xyes; then build_plugin_docs=yes AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no (gtk-doc disabled or not available)]) fi AM_CONDITIONAL(ENABLE_PLUGIN_DOCS, test x$build_plugin_docs = xyes) ]) gst-plugins-good-0.10.31/common/m4/check.m40000644000175000017500000001333511671200067015133 00000000000000dnl _AM_TRY_CHECK(MINIMUM-VERSION, EXTRA-CFLAGS, EXTRA-LIBS, CHECK-LIB-NAME dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS dnl Done this way because of the brokenness that is dnl https://launchpad.net/distros/ubuntu/+source/check/+bug/5840 dnl AC_DEFUN([_AM_TRY_CHECK], [ min_check_version=$1 extra_cflags=$2 extra_libs=$3 check_lib_name=$4 CHECK_CFLAGS="$extra_cflags" CHECK_LIBS="$extra_libs -l$check_lib_name" ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $CHECK_CFLAGS" LIBS="$CHECK_LIBS $LIBS" AC_MSG_CHECKING(for check named $check_lib_name - version >= $min_check_version) rm -f conf.check-test dnl unset no_check, since in our second run it would have been set to yes dnl before no_check= AC_TRY_RUN([ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.check-test"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = strdup("$min_check_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_check_version"); return 1; } if ((CHECK_MAJOR_VERSION != check_major_version) || (CHECK_MINOR_VERSION != check_minor_version) || (CHECK_MICRO_VERSION != check_micro_version)) { printf("\n*** The check header file (version %d.%d.%d) does not match\n", CHECK_MAJOR_VERSION, CHECK_MINOR_VERSION, CHECK_MICRO_VERSION); printf("*** the check library (version %d.%d.%d).\n", check_major_version, check_minor_version, check_micro_version); return 1; } if ((check_major_version > major) || ((check_major_version == major) && (check_minor_version > minor)) || ((check_major_version == major) && (check_minor_version == minor) && (check_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of check (%d.%d.%d) was found.\n", check_major_version, check_minor_version, check_micro_version); printf("*** You need a version of check being at least %d.%d.%d.\n", major, minor, micro); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the check library and header\n"); printf("*** file is being found. Rerun configure with the --with-check=PATH option\n"); printf("*** to specify the prefix where the correct version was installed.\n"); } return 1; } ],, no_check=yes, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" if test "x$no_check" = x ; then AC_MSG_RESULT(yes) ifelse([$5], , :, [$5]) else AC_MSG_RESULT(no) if test -f conf.check-test ; then : else echo "*** Could not run check test program, checking why..." CFLAGS="$CFLAGS $CHECK_CFLAGS" LIBS="$CHECK_LIBS $LIBS" AC_TRY_LINK([ #include #include #include ], , [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding check. You'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for" echo "*** the exact error that occured." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi CHECK_CFLAGS="" CHECK_LIBS="" rm -f conf.check-test ifelse([$6], , AC_MSG_ERROR([check not found]), [$6]) fi ]) dnl AM_PATH_CHECK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS dnl AC_DEFUN([AM_PATH_CHECK], [ AC_ARG_WITH(check, [ --with-check=PATH prefix where check is installed [default=auto]]) AC_ARG_WITH(checklibname, AC_HELP_STRING([--with-check-lib-name=NAME], [name of the PIC check library (default=check)])) min_check_version=ifelse([$1], ,0.8.2,$1) if test x$with_check = xno; then AC_MSG_RESULT(disabled) ifelse([$3], , AC_MSG_ERROR([disabling check is not supported]), [$3]) else if test "x$with_check" != x; then CHECK_EXTRA_CFLAGS="-I$with_check/include" CHECK_EXTRA_LIBS="-L$with_check/lib" else CHECK_EXTRA_CFLAGS="" CHECK_EXTRA_LIBS="" fi if test x$with_checklibname = x; then _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, check_pic, [have_check=true], [have_check=false]) if test x$have_check = xtrue; then ifelse([$2], , :, [$2]) else _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, check, [have_check=true], [have_check=false]) if test x$have_check = xtrue; then ifelse([$2], , :, [$2]) else ifelse([$3], , AC_MSG_ERROR([check not found]), [$3]) fi fi else _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, $with_checklibname, [have_check=true], [have_check=false]) if test x$have_check = xtrue; then ifelse([$2], , :, [$2]) else ifelse([$3], , AC_MSG_ERROR([check not found]), [$3]) fi fi AC_SUBST(CHECK_CFLAGS) AC_SUBST(CHECK_LIBS) rm -f conf.check-test fi ]) gst-plugins-good-0.10.31/common/m4/gst-debuginfo.m40000644000175000017500000000306311671200067016610 00000000000000AC_DEFUN([AG_GST_DEBUGINFO], [ AC_ARG_ENABLE(debug, AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]), [case "${enableval}" in yes) USE_DEBUG=yes ;; no) USE_DEBUG=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac], [USE_DEBUG=yes]) dnl Default value AC_ARG_ENABLE(DEBUG, AC_HELP_STRING([--disable-DEBUG],[disables compilation of debugging messages]), [case "${enableval}" in yes) ENABLE_DEBUG=yes ;; no) ENABLE_DEBUG=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-DEBUG) ;; esac], [ENABLE_DEBUG=yes]) dnl Default value if test x$ENABLE_DEBUG = xyes; then AC_DEFINE(GST_DEBUG_ENABLED, 1, [Define if DEBUG statements should be compiled in]) fi AC_ARG_ENABLE(INFO, AC_HELP_STRING([--disable-INFO],[disables compilation of informational messages]), [case "${enableval}" in yes) ENABLE_INFO=yes ;; no) ENABLE_INFO=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-INFO) ;; esac], [ENABLE_INFO=yes]) dnl Default value if test x$ENABLE_INFO = xyes; then AC_DEFINE(GST_INFO_ENABLED, 1, [Define if INFO statements should be compiled in]) fi AC_ARG_ENABLE(debug-color, AC_HELP_STRING([--disable-debug-color],[disables color output of DEBUG and INFO output]), [case "${enableval}" in yes) ENABLE_DEBUG_COLOR=yes ;; no) ENABLE_DEBUG_COLOR=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug-color) ;; esac], [ENABLE_DEBUG_COLOR=yes]) dnl Default value if test "x$ENABLE_DEBUG_COLOR" = xyes; then AC_DEFINE(GST_DEBUG_COLOR, 1, [Define if debugging messages should be colorized]) fi ]) gst-plugins-good-0.10.31/common/m4/Makefile.am0000644000175000017500000000134711671200067015650 00000000000000EXTRA_DIST = \ README \ as-ac-expand.m4 \ as-auto-alt.m4 \ as-compiler-flag.m4 \ as-compiler.m4 \ as-docbook.m4 \ as-gcc-inline-assembly.m4 \ as-libtool.m4 \ as-libtool-tags.m4 \ as-objc.m4 \ as-python.m4 \ as-scrub-include.m4 \ as-version.m4 \ ax_create_stdint_h.m4 \ glib-gettext.m4 \ gst-arch.m4 \ gst-args.m4 \ gst-check.m4 \ gst-debuginfo.m4 \ gst-default.m4 \ gst-doc.m4 \ gst-dowhile.m4 \ gst-error.m4 \ gst-feature.m4 \ gst-function.m4 \ gst-gettext.m4 \ gst-glib2.m4 \ gst-libxml2.m4 \ gst-parser.m4 \ gst-package-release-datetime.m4 \ gst-platform.m4 \ gst-plugindir.m4 \ gst-plugin-docs.m4 \ gst-valgrind.m4 \ gst-x11.m4 \ gst.m4 \ gtk-doc.m4 \ introspection.m4 \ pkg.m4 \ check.m4 \ orc.m4 gst-plugins-good-0.10.31/common/m4/gst-check.m40000644000175000017500000002377011671200067015732 00000000000000dnl pkg-config-based checks for GStreamer modules and dependency modules dnl generic: dnl AG_GST_PKG_CHECK_MODULES([PREFIX], [WHICH], [REQUIRED]) dnl sets HAVE_[$PREFIX], [$PREFIX]_* dnl AG_GST_CHECK_MODULES([PREFIX], [MODULE], [MINVER], [NAME], [REQUIRED]) dnl sets HAVE_[$PREFIX], [$PREFIX]_* dnl specific: dnl AG_GST_CHECK_GST([MAJMIN], [MINVER], [REQUIRED]) dnl also sets/ACSUBSTs GST_TOOLS_DIR and GST_PLUGINS_DIR dnl AG_GST_CHECK_GST_BASE([MAJMIN], [MINVER], [REQUIRED]) dnl AG_GST_CHECK_GST_GDP([MAJMIN], [MINVER], [REQUIRED]) dnl AG_GST_CHECK_GST_CONTROLLER([MAJMIN], [MINVER], [REQUIRED]) dnl AG_GST_CHECK_GST_CHECK([MAJMIN], [MINVER], [REQUIRED]) dnl AG_GST_CHECK_GST_PLUGINS_BASE([MAJMIN], [MINVER], [REQUIRED]) dnl also sets/ACSUBSTs GSTPB_PLUGINS_DIR AC_DEFUN([AG_GST_PKG_CHECK_MODULES], [ which="[$2]" dnl not required by default, since we use this mostly for plugin deps required=ifelse([$3], , "no", [$3]) PKG_CHECK_MODULES([$1], $which, [ HAVE_[$1]="yes" ], [ HAVE_[$1]="no" if test "x$required" = "xyes"; then AC_MSG_ERROR($[$1]_PKG_ERRORS) else AC_MSG_NOTICE($[$1]_PKG_ERRORS) fi ]) dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7 dnl It gets done automatically in automake >= 1.7, which we now require ])) AC_DEFUN([AG_GST_CHECK_MODULES], [ module=[$2] minver=[$3] name="[$4]" required=ifelse([$5], , "yes", [$5]) dnl required by default PKG_CHECK_MODULES([$1], $module >= $minver, [ HAVE_[$1]="yes" ], [ HAVE_[$1]="no" AC_MSG_NOTICE($[$1]_PKG_ERRORS) if test "x$required" = "xyes"; then AC_MSG_ERROR([no $module >= $minver ($name) found]) else AC_MSG_NOTICE([no $module >= $minver ($name) found]) fi ]) dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7 dnl It gets done automatically in automake >= 1.7, which we now require ])) AC_DEFUN([AG_GST_CHECK_GST], [ AG_GST_CHECK_MODULES(GST, gstreamer-[$1], [$2], [GStreamer], [$3]) dnl allow setting before calling this macro to override if test -z $GST_TOOLS_DIR; then GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-[$1]` if test -z $GST_TOOLS_DIR; then AC_MSG_ERROR( [no tools dir set in GStreamer pkg-config file, core upgrade needed.]) fi fi AC_MSG_NOTICE([using GStreamer tools in $GST_TOOLS_DIR]) AC_SUBST(GST_TOOLS_DIR) dnl check for where core plug-ins got installed dnl this is used for unit tests dnl allow setting before calling this macro to override if test -z $GST_PLUGINS_DIR; then GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-[$1]` if test -z $GST_PLUGINS_DIR; then AC_MSG_ERROR( [no pluginsdir set in GStreamer pkg-config file, core upgrade needed.]) fi fi AC_MSG_NOTICE([using GStreamer plug-ins in $GST_PLUGINS_DIR]) AC_SUBST(GST_PLUGINS_DIR) ]) AC_DEFUN([AG_GST_CHECK_GST_BASE], [ AG_GST_CHECK_MODULES(GST_BASE, gstreamer-base-[$1], [$2], [GStreamer Base Libraries], [$3]) ]) AC_DEFUN([AG_GST_CHECK_GST_GDP], [ AG_GST_CHECK_MODULES(GST_GDP, gstreamer-dataprotocol-[$1], [$2], [GStreamer Data Protocol Library], [$3]) ]) AC_DEFUN([AG_GST_CHECK_GST_CONTROLLER], [ AG_GST_CHECK_MODULES(GST_CONTROLLER, gstreamer-controller-[$1], [$2], [GStreamer Controller Library], [$3]) ]) AC_DEFUN([AG_GST_CHECK_GST_CHECK], [ AG_GST_CHECK_MODULES(GST_CHECK, gstreamer-check-[$1], [$2], [GStreamer Check unittest Library], [$3]) ]) dnl =========================================================================== dnl AG_GST_CHECK_GST_PLUGINS_BASE([GST-MAJORMINOR], [MIN-VERSION], [REQUIRED]) dnl dnl Sets GST_PLUGINS_BASE_CFLAGS and GST_PLUGINS_BASE_LIBS. dnl dnl Also sets GSTPB_PLUGINS_DIR (and for consistency also GST_PLUGINS_BASE_DIR) dnl for use in Makefile.am. This is only really needed/useful in uninstalled dnl setups, since in an installed setup all plugins will be found in dnl GST_PLUGINS_DIR anyway. dnl =========================================================================== AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_BASE], [ AG_GST_CHECK_MODULES(GST_PLUGINS_BASE, gstreamer-plugins-base-[$1], [$2], [GStreamer Base Plugins], [$3]) if test "x$HAVE_GST_PLUGINS_BASE" = "xyes"; then dnl check for where base plugins got installed dnl this is used for unit tests dnl allow setting before calling this macro to override if test -z $GSTPB_PLUGINS_DIR; then GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-[$1]` if test -z $GSTPB_PLUGINS_DIR; then AC_MSG_ERROR( [no pluginsdir set in GStreamer Base Plugins pkg-config file]) fi fi AC_MSG_NOTICE([using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR]) GST_PLUGINS_BASE_DIR="$GSTPB_PLUGINS_DIR/gst:$GSTPB_PLUGINS_DIR/sys:$GSTPB_PLUGINS_DIR/ext" AC_SUBST(GST_PLUGINS_BASE_DIR) AC_SUBST(GSTPB_PLUGINS_DIR) fi ]) dnl =========================================================================== dnl AG_GST_CHECK_GST_PLUGINS_GOOD([GST-MAJORMINOR], [MIN-VERSION]) dnl dnl Will set GST_PLUGINS_GOOD_DIR for use in Makefile.am. Note that this will dnl only be set in an uninstalled setup, since -good ships no .pc file and in dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. dnl =========================================================================== AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_GOOD], [ AG_GST_CHECK_MODULES(GST_PLUGINS_GOOD, gstreamer-plugins-good-[$1], [$2], [GStreamer Good Plugins], [no]) if test "x$HAVE_GST_PLUGINS_GOOD" = "xyes"; then dnl check for where good plugins got installed dnl this is used for unit tests dnl allow setting before calling this macro to override if test -z $GST_PLUGINS_GOOD_DIR; then GST_PLUGINS_GOOD_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-good-[$1]` if test -z $GST_PLUGINS_GOOD_DIR; then AC_MSG_ERROR([no pluginsdir set in GStreamer Good Plugins pkg-config file]) fi fi AC_MSG_NOTICE([using GStreamer Good Plugins in $GST_PLUGINS_GOOD_DIR]) GST_PLUGINS_GOOD_DIR="$GST_PLUGINS_GOOD_DIR/gst:$GST_PLUGINS_GOOD_DIR/sys:$GST_PLUGINS_GOOD_DIR/ext" AC_SUBST(GST_PLUGINS_GOOD_DIR) fi ]) dnl =========================================================================== dnl AG_GST_CHECK_GST_PLUGINS_UGLY([GST-MAJORMINOR], [MIN-VERSION]) dnl dnl Will set GST_PLUGINS_UGLY_DIR for use in Makefile.am. Note that this will dnl only be set in an uninstalled setup, since -bad ships no .pc file and in dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. dnl =========================================================================== AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_UGLY], [ AG_GST_CHECK_MODULES(GST_PLUGINS_UGLY, gstreamer-plugins-ugly-[$1], [$2], [GStreamer Ugly Plugins], [no]) if test "x$HAVE_GST_PLUGINS_UGLY" = "xyes"; then dnl check for where ugly plugins got installed dnl this is used for unit tests dnl allow setting before calling this macro to override if test -z $GST_PLUGINS_UGLY_DIR; then GST_PLUGINS_UGLY_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-ugly-[$1]` if test -z $GST_PLUGINS_UGLY_DIR; then AC_MSG_ERROR([no pluginsdir set in GStreamer Ugly Plugins pkg-config file]) fi fi AC_MSG_NOTICE([using GStreamer Ugly Plugins in $GST_PLUGINS_UGLY_DIR]) GST_PLUGINS_UGLY_DIR="$GST_PLUGINS_UGLY_DIR/gst:$GST_PLUGINS_UGLY_DIR/sys:$GST_PLUGINS_UGLY_DIR/ext" AC_SUBST(GST_PLUGINS_UGLY_DIR) fi ]) dnl =========================================================================== dnl AG_GST_CHECK_GST_PLUGINS_BAD([GST-MAJORMINOR], [MIN-VERSION]) dnl dnl Will set GST_PLUGINS_BAD_DIR for use in Makefile.am. Note that this will dnl only be set in an uninstalled setup, since -ugly ships no .pc file and in dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. dnl =========================================================================== AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_BAD], [ AG_GST_CHECK_MODULES(GST_PLUGINS_BAD, gstreamer-plugins-bad-[$1], [$2], [GStreamer Bad Plugins], [no]) if test "x$HAVE_GST_PLUGINS_BAD" = "xyes"; then dnl check for where bad plugins got installed dnl this is used for unit tests dnl allow setting before calling this macro to override if test -z $GST_PLUGINS_BAD_DIR; then GST_PLUGINS_BAD_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-bad-[$1]` if test -z $GST_PLUGINS_BAD_DIR; then AC_MSG_ERROR([no pluginsdir set in GStreamer Bad Plugins pkg-config file]) fi fi AC_MSG_NOTICE([using GStreamer Bad Plugins in $GST_PLUGINS_BAD_DIR]) GST_PLUGINS_BAD_DIR="$GST_PLUGINS_BAD_DIR/gst:$GST_PLUGINS_BAD_DIR/sys:$GST_PLUGINS_BAD_DIR/ext" AC_SUBST(GST_PLUGINS_BAD_DIR) fi ]) dnl =========================================================================== dnl AG_GST_CHECK_GST_PLUGINS_FFMPEG([GST-MAJORMINOR], [MIN-VERSION]) dnl dnl Will set GST_PLUGINS_FFMPEG_DIR for use in Makefile.am. Note that this will dnl only be set in an uninstalled setup, since -ffmpeg ships no .pc file and in dnl an installed setup all plugins will be found in GST_PLUGINS_DIR anyway. dnl =========================================================================== AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_FFMPEG], [ AG_GST_CHECK_MODULES(GST_PLUGINS_FFMPEG, gstreamer-plugins-ffmpeg-[$1], [$2], [GStreamer FFmpeg Plugins], [no]) if test "x$HAVE_GST_PLUGINS_FFMPEG" = "xyes"; then dnl check for where ffmpeg plugins got installed dnl this is used for unit tests dnl allow setting before calling this macro to override if test -z $GST_PLUGINS_FFMPEG_DIR; then GST_PLUGINS_FFMPEG_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-ffmpeg-[$1]` if test -z $GST_PLUGINS_FFMPEG_DIR; then AC_MSG_ERROR([no pluginsdir set in GStreamer FFmpeg Plugins pkg-config file]) fi fi GST_PLUGINS_FFMPEG_DIR="$GST_PLUGINS_FFMPEG_DIR/ext/ffmpeg" AC_MSG_NOTICE([using GStreamer FFmpeg Plugins in $GST_PLUGINS_FFMPEG_DIR]) AC_SUBST(GST_PLUGINS_FFMPEG_DIR) fi ]) gst-plugins-good-0.10.31/common/m4/gst-platform.m40000644000175000017500000000427011671200067016473 00000000000000dnl AG_GST_PLATFORM dnl Check for platform specific features and define some variables dnl dnl GST_EXTRA_MODULE_SUFFIX: contains a platform specific dnl extra module suffix additional to G_MODULE_SUFFIX dnl dnl HAVE_OSX: Defined if compiling for OS X dnl dnl GST_HAVE_UNSAFE_FORK: Defined if fork is unsafe (Windows) dnl dnl HAVE_WIN32: Defined if compiling on Win32 dnl AC_DEFUN([AG_GST_PLATFORM], [ AC_REQUIRE([AC_CANONICAL_HOST]) case $host_os in rhapsody*) AC_DEFINE_UNQUOTED(GST_EXTRA_MODULE_SUFFIX, [".dylib"], [Extra platform specific plugin suffix]) ;; darwin*) AC_DEFINE_UNQUOTED(GST_EXTRA_MODULE_SUFFIX, [".dylib"], [Extra platform specific plugin suffix]) AC_DEFINE_UNQUOTED(HAVE_OSX, 1, [Defined if compiling for OSX]) ;; cygwin*) AC_DEFINE_UNQUOTED(GST_HAVE_UNSAFE_FORK, 1, [Defined when registry scanning through fork is unsafe]) ;; mingw* | msvc* | mks*) dnl HAVE_WIN32 currently means "disable POSIXisms". AC_DEFINE_UNQUOTED(HAVE_WIN32, 1, [Defined if compiling for Windows]) dnl define __MSVCRT_VERSION__ version if not set already by the dnl compiler (ie. mostly for mingw). This is needed for things like dnl __stat64 to be available. If set by the compiler, ensure it's dnl new enough - we need at least WinXP SP2. AC_TRY_COMPILE([ ], [ return __MSVCRT_VERSION__; ], [ AC_TRY_COMPILE([ ], [ #if __MSVCRT_VERSION__ < 0x0601 #error "MSVCRT too old" #endif ], [ AC_MSG_NOTICE([MSVCRT version looks ok]) ], [ AC_MSG_ERROR([MSVCRT version too old, need at least WinXP SP2]) ]) ], [ AC_MSG_NOTICE([Setting MSVCRT version to 0x0601]) AC_DEFINE_UNQUOTED(__MSVCRT_VERSION__, 0x0601, [We need at least WinXP SP2 for __stat64]) ]) ;; *) ;; esac ]) AC_DEFUN([AG_GST_LIBTOOL_PREPARE], [ dnl Persuade libtool to also link (-l) a 'pure' (DirectX) static lib, dnl i.e. as opposed to only import lib with dll counterpart. dnl Needs to be tweaked before libtool's checks. case $host_os in cygwin* | mingw*) lt_cv_deplibs_check_method=pass_all ;; esac ])gst-plugins-good-0.10.31/common/m4/gst-arch.m40000644000175000017500000001201011671200067015553 00000000000000dnl AG_GST_ARCH dnl sets up defines and automake conditionals for host architecture dnl checks endianness dnl defines HOST_CPU AC_DEFUN([AG_GST_ARCH], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use host_ variables dnl Determine CPU case "x${host_cpu}" in xi?86 | xk? | xi?86_64) case $host_os in solaris*) AC_CHECK_DECL([__i386], [I386_ABI="yes"], [I386_ABI="no"]) AC_CHECK_DECL([__amd64], [AMD64_ABI="yes"], [AMD64_ABI="no"]) if test "x$I386_ABI" = "xyes" ; then HAVE_CPU_I386=yes AC_DEFINE(HAVE_CPU_I386, 1, [Define if the host CPU is an x86]) fi if test "x$AMD64_ABI" = "xyes" ; then HAVE_CPU_X86_64=yes AC_DEFINE(HAVE_CPU_X86_64, 1, [Define if the host CPU is a x86_64]) fi ;; *) HAVE_CPU_I386=yes AC_DEFINE(HAVE_CPU_I386, 1, [Define if the host CPU is an x86]) dnl FIXME could use some better detection dnl (ie CPUID) case "x${host_cpu}" in xi386 | xi486) ;; *) AC_DEFINE(HAVE_RDTSC, 1, [Define if RDTSC is available]) ;; esac ;; esac ;; xpowerpc) HAVE_CPU_PPC=yes AC_DEFINE(HAVE_CPU_PPC, 1, [Define if the host CPU is a PowerPC]) ;; xpowerpc64) HAVE_CPU_PPC64=yes AC_DEFINE(HAVE_CPU_PPC64, 1, [Define if the host CPU is a 64 bit PowerPC]) ;; xalpha*) HAVE_CPU_ALPHA=yes AC_DEFINE(HAVE_CPU_ALPHA, 1, [Define if the host CPU is an Alpha]) ;; xarm*) HAVE_CPU_ARM=yes AC_DEFINE(HAVE_CPU_ARM, 1, [Define if the host CPU is an ARM]) ;; xsparc*) HAVE_CPU_SPARC=yes AC_DEFINE(HAVE_CPU_SPARC, 1, [Define if the host CPU is a SPARC]) ;; xmips*) HAVE_CPU_MIPS=yes AC_DEFINE(HAVE_CPU_MIPS, 1, [Define if the host CPU is a MIPS]) ;; xhppa*) HAVE_CPU_HPPA=yes AC_DEFINE(HAVE_CPU_HPPA, 1, [Define if the host CPU is a HPPA]) ;; xs390*) HAVE_CPU_S390=yes AC_DEFINE(HAVE_CPU_S390, 1, [Define if the host CPU is a S390]) ;; xia64*) HAVE_CPU_IA64=yes AC_DEFINE(HAVE_CPU_IA64, 1, [Define if the host CPU is a IA64]) ;; xm68k*) HAVE_CPU_M68K=yes AC_DEFINE(HAVE_CPU_M68K, 1, [Define if the host CPU is a M68K]) ;; xx86_64) HAVE_CPU_X86_64=yes AC_DEFINE(HAVE_CPU_X86_64, 1, [Define if the host CPU is a x86_64]) ;; xcris) HAVE_CPU_CRIS=yes AC_DEFINE(HAVE_CPU_CRIS, 1, [Define if the host CPU is a CRIS]) ;; xcrisv32) HAVE_CPU_CRISV32=yes AC_DEFINE(HAVE_CPU_CRISV32, 1, [Define if the host CPU is a CRISv32]) ;; esac dnl Determine endianness AC_C_BIGENDIAN AM_CONDITIONAL(HAVE_CPU_I386, test "x$HAVE_CPU_I386" = "xyes") AM_CONDITIONAL(HAVE_CPU_PPC, test "x$HAVE_CPU_PPC" = "xyes") AM_CONDITIONAL(HAVE_CPU_PPC64, test "x$HAVE_CPU_PPC64" = "xyes") AM_CONDITIONAL(HAVE_CPU_ALPHA, test "x$HAVE_CPU_ALPHA" = "xyes") AM_CONDITIONAL(HAVE_CPU_ARM, test "x$HAVE_CPU_ARM" = "xyes") AM_CONDITIONAL(HAVE_CPU_SPARC, test "x$HAVE_CPU_SPARC" = "xyes") AM_CONDITIONAL(HAVE_CPU_HPPA, test "x$HAVE_CPU_HPPA" = "xyes") AM_CONDITIONAL(HAVE_CPU_MIPS, test "x$HAVE_CPU_MIPS" = "xyes") AM_CONDITIONAL(HAVE_CPU_S390, test "x$HAVE_CPU_S390" = "xyes") AM_CONDITIONAL(HAVE_CPU_IA64, test "x$HAVE_CPU_IA64" = "xyes") AM_CONDITIONAL(HAVE_CPU_M68K, test "x$HAVE_CPU_M68K" = "xyes") AM_CONDITIONAL(HAVE_CPU_X86_64, test "x$HAVE_CPU_X86_64" = "xyes") AM_CONDITIONAL(HAVE_CPU_CRIS, test "x$HAVE_CPU_CRIS" = "xyes") AM_CONDITIONAL(HAVE_CPU_CRISV32, test "x$HAVE_CPU_CRISV32" = "xyes") AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu", [the host CPU]) ]) dnl check if unaligned memory access works correctly AC_DEFUN([AG_GST_UNALIGNED_ACCESS], [ AC_MSG_CHECKING([if unaligned memory access works correctly]) if test x"$as_cv_unaligned_access" = x ; then case $host in alpha*|arm*|hp*|mips*|sh*|sparc*|ia64*) _AS_ECHO_N([(blacklisted) ]) as_cv_unaligned_access=no ;; i?86*|x86_64*|amd64*|powerpc*|m68k*|cris*) _AS_ECHO_N([(whitelisted) ]) as_cv_unaligned_access=yes ;; esac else _AS_ECHO_N([(cached) ]) fi if test x"$as_cv_unaligned_access" = x ; then AC_TRY_RUN([ int main(int argc, char **argv) { char array[] = "ABCDEFGH"; unsigned int iarray[2]; memcpy(iarray,array,8); #define GET(x) (*(unsigned int *)((char *)iarray + (x))) if(GET(0) != 0x41424344 && GET(0) != 0x44434241) return 1; if(GET(1) != 0x42434445 && GET(1) != 0x45444342) return 1; if(GET(2) != 0x43444546 && GET(2) != 0x46454443) return 1; if(GET(3) != 0x44454647 && GET(3) != 0x47464544) return 1; return 0; } ], as_cv_unaligned_access="yes", as_cv_unaligned_access="no") fi AC_MSG_RESULT($as_cv_unaligned_access) if test "$as_cv_unaligned_access" = "yes"; then AC_DEFINE_UNQUOTED(HAVE_UNALIGNED_ACCESS, 1, [defined if unaligned memory access works correctly]) fi ]) gst-plugins-good-0.10.31/common/m4/gst-valgrind.m40000644000175000017500000000173311671200067016456 00000000000000AC_DEFUN([AG_GST_VALGRIND_CHECK], [ dnl valgrind inclusion AC_ARG_ENABLE(valgrind, AC_HELP_STRING([--disable-valgrind], [disable run-time valgrind detection]), [ case "${enableval}" in yes) USE_VALGRIND="$USE_DEBUG" ;; no) USE_VALGRIND=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;; esac], [ USE_VALGRIND="$USE_DEBUG" ]) dnl Default value VALGRIND_REQ="3.0" if test "x$USE_VALGRIND" = xyes; then PKG_CHECK_MODULES(VALGRIND, valgrind >= $VALGRIND_REQ, USE_VALGRIND="yes", [ USE_VALGRIND="no" AC_MSG_RESULT([no]) ]) fi if test "x$USE_VALGRIND" = xyes; then AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used]) AC_MSG_NOTICE(Using extra code paths for valgrind) fi AC_SUBST(VALGRIND_CFLAGS) AC_SUBST(VALGRIND_LIBS) AC_PATH_PROG(VALGRIND_PATH, valgrind, no) AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") ]) gst-plugins-good-0.10.31/common/m4/as-libtool.m40000644000175000017500000000212511671200067016116 00000000000000dnl as-libtool.m4 0.1.4 dnl autostars m4 macro for libtool versioning dnl Thomas Vander Stichele dnl $Id: as-libtool.m4,v 1.10 2005/10/15 13:44:23 thomasvs Exp $ dnl AS_LIBTOOL(PREFIX, CURRENT, REVISION, AGE, [RELEASE]) dnl example dnl AS_LIBTOOL(GST, 2, 0, 0) dnl this macro dnl - defines [$PREFIX]_CURRENT, REVISION and AGE dnl - defines [$PREFIX]_LIBVERSION dnl - defines [$PREFIX]_LT_LDFLAGS to set versioning dnl - AC_SUBST's them all dnl if RELEASE is given, then add a -release option to the LDFLAGS dnl with the given release version dnl then use [$PREFIX]_LT_LDFLAGS in the relevant Makefile.am's dnl call AM_PROG_LIBTOOL after this call AC_DEFUN([AS_LIBTOOL], [ [$1]_CURRENT=[$2] [$1]_REVISION=[$3] [$1]_AGE=[$4] [$1]_LIBVERSION=[$2]:[$3]:[$4] AC_SUBST([$1]_CURRENT) AC_SUBST([$1]_REVISION) AC_SUBST([$1]_AGE) AC_SUBST([$1]_LIBVERSION) [$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -version-info $[$1]_LIBVERSION" if test ! -z "[$5]" then [$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -release [$5]" fi AC_SUBST([$1]_LT_LDFLAGS) AC_LIBTOOL_DLOPEN ]) gst-plugins-good-0.10.31/common/m4/gst-glib2.m40000644000175000017500000000430311701411037015636 00000000000000dnl check for a minimum version of GLib dnl AG_GST_GLIB_CHECK([minimum-version-required]) AC_DEFUN([AG_GST_GLIB_CHECK], [ AC_REQUIRE([AS_NANO]) dnl Minimum required version of GLib GLIB_REQ=[$1] if test "x$GLIB_REQ" = "x" then AC_MSG_ERROR([Please specify a required version for GLib 2.0]) fi AC_SUBST(GLIB_REQ) dnl Check for glib with everything AG_GST_PKG_CHECK_MODULES(GLIB, glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0) if test "x$HAVE_GLIB" = "xno"; then AC_MSG_ERROR([This package requires GLib >= $GLIB_REQ to compile.]) fi dnl Add define to tell GLib that threading is always enabled within GStreamer dnl code (optimisation, bypasses checks if the threading system is enabled dnl when using threading primitives) GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_THREADS_MANDATORY" dnl Define G_DISABLE_DEPRECATED for GIT versions if test "x$PACKAGE_VERSION_NANO" = "x1"; then GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_DEPRECATED" fi AC_ARG_ENABLE(gobject-cast-checks, AS_HELP_STRING([--enable-gobject-cast-checks[=@<:@no/auto/yes@:>@]], [Enable GObject cast checks]),, [enable_gobject_cast_checks=auto]) if test "x$enable_gobject_cast_checks" = "xauto"; then dnl For releases, turn off the cast checks if test "x$PACKAGE_VERSION_NANO" = "x1"; then enable_gobject_cast_checks=yes else enable_gobject_cast_checks=no fi fi if test "x$enable_gobject_cast_checks" = "xno"; then GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_CAST_CHECKS" fi AC_ARG_ENABLE(glib-asserts, AS_HELP_STRING([--enable-glib-asserts[=@<:@no/auto/yes@:>@]], [Enable GLib assertion]),, [enable_glib_assertions=auto]) if test "x$enable_glib_assertions" = "xauto"; then dnl For releases, turn off the assertions if test "x$PACKAGE_VERSION_NANO" = "x1"; then enable_glib_assertions=yes else enable_glib_assertions=no fi fi if test "x$enable_glib_assertions" = "xno"; then GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT" fi dnl for the poor souls who for example have glib in /usr/local AS_SCRUB_INCLUDE(GLIB_CFLAGS) AC_SUBST(GLIB_EXTRA_CFLAGS) ]) gst-plugins-good-0.10.31/common/m4/as-scrub-include.m40000644000175000017500000000221411671200067017210 00000000000000dnl as-scrub-include.m4 0.0.4 dnl autostars m4 macro for scrubbing CFLAGS of system include dirs dnl because gcc 3.x complains about including system including dirs dnl Thomas Vander Stichele dnl $Id: as-scrub-include.m4,v 1.7 2004/06/12 08:30:20 thomasvs Exp $ dnl This macro uses output of cpp -v and expects it to contain text that dnl looks a little bit like this: dnl #include <...> search starts here: dnl /usr/local/include dnl /usr/lib/gcc-lib/i386-redhat-linux/3.2/include dnl /usr/include dnl End of search list. dnl AS_SCRUB_INCLUDE(VAR) dnl example dnl AS_SCRUB_INCLUDE(CFLAGS) dnl will remove all system include dirs from the given CFLAGS AC_DEFUN([AS_SCRUB_INCLUDE], [ GIVEN_CFLAGS=$[$1] INCLUDE_DIRS=`echo | cpp -v 2>&1` dnl remove everything from this output between the "starts here" and "End of" dnl line INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do dnl use "" as the sed script so $dir gets expanded GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` done [$1]=$GIVEN_CFLAGS ]) gst-plugins-good-0.10.31/common/m4/pkg.m40000644000175000017500000001214111671200067014631 00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES gst-plugins-good-0.10.31/common/m4/gst-default.m40000644000175000017500000000776411671200067016306 00000000000000dnl default elements used for tests and such dnl AG_GST_DEFAULT_ELEMENTS AC_DEFUN([AG_GST_DEFAULT_ELEMENTS], [ dnl decide on default elements dnl FIXME: describe where exactly this gets used dnl FIXME: decide if it's a problem that this could point to sinks from dnl depending plugin modules dnl FIXME: when can we just use autoaudiosrc and autovideosrc? DEFAULT_AUDIOSINK="autoaudiosink" DEFAULT_VIDEOSINK="autovideosink" DEFAULT_AUDIOSRC="alsasrc" DEFAULT_VIDEOSRC="v4l2src" DEFAULT_VISUALIZER="goom" case "$host" in *-sun-* | *pc-solaris* ) DEFAULT_AUDIOSRC="sunaudiosrc" ;; *-darwin* ) DEFAULT_AUDIOSRC="osxaudiosrc" ;; esac dnl Default audio sink AC_ARG_WITH(default-audiosink, AC_HELP_STRING([--with-default-audiosink], [specify default audio sink]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosink) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosink) ;; *) DEFAULT_AUDIOSINK="${withval}" ;; esac ], [ DEFAULT_AUDIOSINK="$DEFAULT_AUDIOSINK" ] dnl Default value as determined above ) AC_MSG_NOTICE(Using $DEFAULT_AUDIOSINK as default audio sink) AC_SUBST(DEFAULT_AUDIOSINK) AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSINK, "$DEFAULT_AUDIOSINK", [Default audio sink]) dnl Default audio source AC_ARG_WITH(default-audiosrc, AC_HELP_STRING([--with-default-audiosrc], [specify default audio source]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosrc) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-default-audiosrc) ;; *) DEFAULT_AUDIOSRC="${withval}" ;; esac ], [ DEFAULT_AUDIOSRC="$DEFAULT_AUDIOSRC" ] dnl Default value as determined above ) AC_MSG_NOTICE(Using $DEFAULT_AUDIOSRC as default audio source) AC_SUBST(DEFAULT_AUDIOSRC) AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSRC, "$DEFAULT_AUDIOSRC", [Default audio source]) dnl Default video sink AC_ARG_WITH(default-videosink, AC_HELP_STRING([--with-default-videosink], [specify default video sink]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-default-videosink) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-default-videosink) ;; *) DEFAULT_VIDEOSINK="${withval}" ;; esac ], [ DEFAULT_VIDEOSINK="$DEFAULT_VIDEOSINK" ] dnl Default value as determined above ) AC_MSG_NOTICE(Using $DEFAULT_VIDEOSINK as default video sink) AC_SUBST(DEFAULT_VIDEOSINK) AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSINK, "$DEFAULT_VIDEOSINK", [Default video sink]) dnl Default video source AC_ARG_WITH(default-videosrc, AC_HELP_STRING([--with-default-videosrc], [specify default video source]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-default-videosrc) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-default-videosrc) ;; *) DEFAULT_VIDEOSRC="${withval}" ;; esac ], [ DEFAULT_VIDEOSRC="$DEFAULT_VIDEOSRC" ] dnl Default value as determined above ) AC_MSG_NOTICE(Using $DEFAULT_VIDEOSRC as default video source) AC_SUBST(DEFAULT_VIDEOSRC) AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSRC, "$DEFAULT_VIDEOSRC", [Default video source]) dnl Default visualizer AC_ARG_WITH(default-visualizer, AC_HELP_STRING([--with-default-visualizer], [specify default visualizer]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-default-visualizer) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-default-visualizer) ;; *) DEFAULT_VISUALIZER="${withval}" ;; esac ], [ DEFAULT_VISUALIZER="$DEFAULT_VISUALIZER" ] dnl Default value as determined above ) AC_MSG_NOTICE(Using $DEFAULT_VISUALIZER as default visualizer) AC_SUBST(DEFAULT_VISUALIZER) AC_DEFINE_UNQUOTED(DEFAULT_VISUALIZER, "$DEFAULT_VISUALIZER", [Default visualizer]) ]) gst-plugins-good-0.10.31/common/m4/gst.m40000644000175000017500000000215211671200067014646 00000000000000dnl AG_GST_INIT dnl sets up use of GStreamer configure.ac macros dnl all GStreamer autoconf macros are prefixed dnl with AG_GST_ for public macros dnl with _AG_GST_ for private macros AC_DEFUN([AG_GST_INIT], [ m4_pattern_forbid(^_?AG_GST_) ]) dnl AG_GST_PKG_CONFIG_PATH dnl dnl sets up a GST_PKG_CONFIG_PATH variable for use in Makefile.am dnl which contains the path of the in-tree pkgconfig directory first dnl and then any paths specified in PKG_CONFIG_PATH. dnl dnl We do this mostly so we don't have to use unportable shell constructs dnl such as ${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH} in Makefile.am to handle dnl the case where the environment variable is not set, but also in order dnl to avoid a trailing ':' in the PKG_CONFIG_PATH which apparently causes dnl problems with pkg-config on windows with msys/mingw. AC_DEFUN([AG_GST_PKG_CONFIG_PATH], [ GST_PKG_CONFIG_PATH="\$(top_builddir)/pkgconfig" if test "x$PKG_CONFIG_PATH" != "x"; then GST_PKG_CONFIG_PATH="$GST_PKG_CONFIG_PATH:$PKG_CONFIG_PATH" fi AC_SUBST([GST_PKG_CONFIG_PATH]) AC_MSG_NOTICE([Using GST_PKG_CONFIG_PATH = $GST_PKG_CONFIG_PATH]) ]) gst-plugins-good-0.10.31/common/m4/as-libtool-tags.m40000644000175000017500000000476511671200067017066 00000000000000dnl as-libtool-tags.m4 0.1.4 dnl autostars m4 macro for selecting libtool "tags" (languages) dnl Andy Wingo does not claim credit for this macro dnl backported from libtool 1.6 by Paolo Bonzini dnl see http://lists.gnu.org/archive/html/libtool/2003-12/msg00007.html dnl $Id$ dnl AS_LIBTOOL_TAGS([tags...]) dnl example dnl AS_LIBTOOL_TAGS([]) for only C (no fortran, etc) dnl When AC_LIBTOOL_TAGS is used, I redefine _LT_AC_TAGCONFIG dnl to be more similar to the libtool 1.6 implementation, which dnl uses an m4 loop and m4 case instead of a shell loop. This dnl way the CXX/GCJ/F77/RC tests are not always expanded. dnl AS_LIBTOOL_TAGS dnl --------------- dnl tags to enable AC_DEFUN([AS_LIBTOOL_TAGS], [m4_define([_LT_TAGS],[$1]) m4_define([_LT_AC_TAGCONFIG], [ # redefined LT AC TAGCONFIG if test -f "$ltmain"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi AC_FOREACH([_LT_TAG], _LT_TAGS, echo THOMAS: tag _LT_TAG [m4_case(_LT_TAG, [CXX], [ if test -n "$CXX" && test "X$CXX" != "Xno"; then echo "THOMAS: YAY CXX" AC_LIBTOOL_LANG_CXX_CONFIG available_tags="$available_tags _LT_TAG" fi], [F77], [ if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG available_tags="$available_tags _LT_TAG" fi], [GCJ], [ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG available_tags="$available_tags _LT_TAG" fi], [RC], [ if test -n "$RC" && test "X$RC" != "Xno"; then AC_LIBTOOL_LANG_RC_CONFIG available_tags="$available_tags _LT_TAG" fi], [m4_errprintn(m4_location[: error: invalid tag name: ]"_LT_TAG") m4_exit(1)]) ]) echo THOMAS: available tags: $available_tags fi # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" AC_MSG_NOTICE([updated available libtool tags with $available_tags.]) else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi ])dnl _LT_AC_TAG_CONFIG ]) gst-plugins-good-0.10.31/common/m4/ax_create_stdint_h.m40000644000175000017500000006151511671200067017710 00000000000000##### http://autoconf-archive.cryp.to/ax_create_stdint_h.html # # SYNOPSIS # # AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])] # # DESCRIPTION # # the "ISO C9X: 7.18 Integer types " section requires the # existence of an include file that defines a set of # typedefs, especially uint8_t,int32_t,uintptr_t. Many older # installations will not provide this file, but some will have the # very same definitions in . In other enviroments we can # use the inet-types in which would define the typedefs # int8_t and u_int8_t respectivly. # # This macros will create a local "_stdint.h" or the headerfile given # as an argument. In many cases that file will just "#include # " or "#include ", while in other environments # it will provide the set of basic 'stdint's definitions/typedefs: # # int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t # int_least32_t.. int_fast32_t.. intmax_t # # which may or may not rely on the definitions of other files, or # using the AC_CHECK_SIZEOF macro to determine the actual sizeof each # type. # # if your header files require the stdint-types you will want to # create an installable file mylib-int.h that all your other # installable header may include. So if you have a library package # named "mylib", just use # # AX_CREATE_STDINT_H(mylib-int.h) # # in configure.ac and go to install that very header file in # Makefile.am along with the other headers (mylib.h) - and the # mylib-specific headers can simply use "#include " to # obtain the stdint-types. # # Remember, if the system already had a valid , the # generated file will include it directly. No need for fuzzy # HAVE_STDINT_H things... (oops, GCC 4.2.x has deliberatly disabled # its stdint.h for non-c99 compilation and the c99-mode is not the # default. Therefore this macro will not use the compiler's stdint.h # - please complain to the GCC developers). # # LAST MODIFICATION # # 2007-06-27 # # COPYLEFT # # Copyright (c) 2007 Guido U. Draheim # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # # As a special exception, the respective Autoconf Macro's copyright # owner gives unlimited permission to copy, distribute and modify the # configure scripts that are the output of Autoconf when processing # the Macro. You need not follow the terms of the GNU General Public # License when using or distributing such scripts, even though # portions of the text of the Macro appear in them. The GNU General # Public License (GPL) does govern all other use of the material that # constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the # Autoconf Macro released by the Autoconf Macro Archive. When you # make and distribute a modified version of the Autoconf Macro, you # may extend this special exception to the GPL to apply to your # modified version as well. AC_DEFUN([AX_CHECK_DATA_MODEL],[ AC_CHECK_SIZEOF(char) AC_CHECK_SIZEOF(short) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(void*) ac_cv_char_data_model="" ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" ac_cv_long_data_model="" ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" AC_MSG_CHECKING([data model]) case "$ac_cv_char_data_model/$ac_cv_long_data_model" in 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; 222/*|333/*|444/*|666/*|888/*) : ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; *) ac_cv_data_model="none" ; n="very unusual model" ;; esac AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)]) ]) dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF]) AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[ AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[ ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) AC_MSG_RESULT([(..)]) for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h]) do unset ac_cv_type_uintptr_t unset ac_cv_type_uint64_t AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>]) AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) m4_ifvaln([$2],[$2]) break done AC_MSG_CHECKING([for stdint uintptr_t]) ]) ]) AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[ AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[ ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) AC_MSG_RESULT([(..)]) for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h]) do unset ac_cv_type_uint32_t unset ac_cv_type_uint64_t AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>]) AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) m4_ifvaln([$2],[$2]) break break; done AC_MSG_CHECKING([for stdint uint32_t]) ]) ]) AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[ AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[ ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) AC_MSG_RESULT([(..)]) for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do unset ac_cv_type_u_int32_t unset ac_cv_type_u_int64_t AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>]) AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>]) m4_ifvaln([$2],[$2]) break break; done AC_MSG_CHECKING([for stdint u_int32_t]) ]) ]) AC_DEFUN([AX_CREATE_STDINT_H], [# ------ AX CREATE STDINT H ------------------------------------- AC_MSG_CHECKING([for stdint types]) ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)` # try to shortcircuit - if the default include path of the compiler # can find a "stdint.h" header then we assume that all compilers can. AC_CACHE_VAL([ac_cv_header_stdint_t],[ old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" old_CFLAGS="$CFLAGS" ; CFLAGS="" AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], [ac_cv_stdint_result="(assuming C99 compatible system)" ac_cv_header_stdint_t="stdint.h"; ], [ac_cv_header_stdint_t=""]) if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then CFLAGS="-std=c99" AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], [AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)]) fi CXXFLAGS="$old_CXXFLAGS" CPPFLAGS="$old_CPPFLAGS" CFLAGS="$old_CFLAGS" ]) v="... $ac_cv_header_stdint_h" if test "$ac_stdint_h" = "stdint.h" ; then AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)]) elif test "$ac_stdint_h" = "inttypes.h" ; then AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)]) elif test "_$ac_cv_header_stdint_t" = "_" ; then AC_MSG_RESULT([(putting them into $ac_stdint_h)$v]) else ac_cv_header_stdint="$ac_cv_header_stdint_t" AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)]) fi if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. dnl .....intro message done, now do a few system checks..... dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type, dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW dnl instead that is triggered with 3 or more arguments (see types.m4) inttype_headers=`echo $2 | sed -e 's/,/ /g'` ac_cv_stdint_result="(no helpful system typedefs seen)" AX_CHECK_HEADER_STDINT_X(dnl stdint.h inttypes.h sys/inttypes.h $inttype_headers, ac_cv_stdint_result="(seen uintptr_t$and64 in $i)") if test "_$ac_cv_header_stdint_x" = "_" ; then AX_CHECK_HEADER_STDINT_O(dnl, inttypes.h sys/inttypes.h stdint.h $inttype_headers, ac_cv_stdint_result="(seen uint32_t$and64 in $i)") fi if test "_$ac_cv_header_stdint_x" = "_" ; then if test "_$ac_cv_header_stdint_o" = "_" ; then AX_CHECK_HEADER_STDINT_U(dnl, sys/types.h inttypes.h sys/inttypes.h $inttype_headers, ac_cv_stdint_result="(seen u_int32_t$and64 in $i)") fi fi dnl if there was no good C99 header file, do some typedef checks... if test "_$ac_cv_header_stdint_x" = "_" ; then AC_MSG_CHECKING([for stdint datatype model]) AC_MSG_RESULT([(..)]) AX_CHECK_DATA_MODEL fi if test "_$ac_cv_header_stdint_x" != "_" ; then ac_cv_header_stdint="$ac_cv_header_stdint_x" elif test "_$ac_cv_header_stdint_o" != "_" ; then ac_cv_header_stdint="$ac_cv_header_stdint_o" elif test "_$ac_cv_header_stdint_u" != "_" ; then ac_cv_header_stdint="$ac_cv_header_stdint_u" else ac_cv_header_stdint="stddef.h" fi AC_MSG_CHECKING([for extra inttypes in chosen header]) AC_MSG_RESULT([($ac_cv_header_stdint)]) dnl see if int_least and int_fast types are present in _this_ header. unset ac_cv_type_int_least32_t unset ac_cv_type_int_fast32_t AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>]) AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>]) AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>]) fi # shortcircut to system "stdint.h" # ------------------ PREPARE VARIABLES ------------------------------ if test "$GCC" = "yes" ; then ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` else ac_cv_stdint_message="using $CC" fi AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl $ac_cv_stdint_result]) dnl ----------------------------------------------------------------- # ----------------- DONE inttypes.h checks START header ------------- AC_CONFIG_COMMANDS([$ac_stdint_h],[ AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h) ac_stdint=$tmp/_stdint.h echo "#ifndef" $_ac_stdint_h >$ac_stdint echo "#define" $_ac_stdint_h "1" >>$ac_stdint echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint if test "_$ac_cv_header_stdint_t" != "_" ; then echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint echo "#include " >>$ac_stdint echo "#endif" >>$ac_stdint echo "#endif" >>$ac_stdint else cat >>$ac_stdint < #else #include /* .................... configured part ............................ */ STDINT_EOF echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint if test "_$ac_cv_header_stdint_x" != "_" ; then ac_header="$ac_cv_header_stdint_x" echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint else echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint fi echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint if test "_$ac_cv_header_stdint_o" != "_" ; then ac_header="$ac_cv_header_stdint_o" echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint else echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint fi echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint if test "_$ac_cv_header_stdint_u" != "_" ; then ac_header="$ac_cv_header_stdint_u" echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint else echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint fi echo "" >>$ac_stdint if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then echo "#include <$ac_header>" >>$ac_stdint echo "" >>$ac_stdint fi fi echo "/* which 64bit typedef has been found */" >>$ac_stdint if test "$ac_cv_type_uint64_t" = "yes" ; then echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint fi if test "$ac_cv_type_u_int64_t" = "yes" ; then echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint fi echo "" >>$ac_stdint echo "/* which type model has been detected */" >>$ac_stdint if test "_$ac_cv_char_data_model" != "_" ; then echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint else echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint fi echo "" >>$ac_stdint echo "/* whether int_least types were detected */" >>$ac_stdint if test "$ac_cv_type_int_least32_t" = "yes"; then echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint fi echo "/* whether int_fast types were detected */" >>$ac_stdint if test "$ac_cv_type_int_fast32_t" = "yes"; then echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint fi echo "/* whether intmax_t type was detected */" >>$ac_stdint if test "$ac_cv_type_intmax_t" = "yes"; then echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint else echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint fi echo "" >>$ac_stdint cat >>$ac_stdint <= 199901L #define _HAVE_UINT64_T #define _HAVE_LONGLONG_UINT64_T typedef long long int64_t; typedef unsigned long long uint64_t; #elif !defined __STRICT_ANSI__ #if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ #define _HAVE_UINT64_T typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ /* note: all ELF-systems seem to have loff-support which needs 64-bit */ #if !defined _NO_LONGLONG #define _HAVE_UINT64_T #define _HAVE_LONGLONG_UINT64_T typedef long long int64_t; typedef unsigned long long uint64_t; #endif #elif defined __alpha || (defined __mips && defined _ABIN32) #if !defined _NO_LONGLONG typedef long int64_t; typedef unsigned long uint64_t; #endif /* compiler/cpu type to define int64_t */ #endif #endif #endif #if defined _STDINT_HAVE_U_INT_TYPES /* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ typedef u_int8_t uint8_t; typedef u_int16_t uint16_t; typedef u_int32_t uint32_t; /* glibc compatibility */ #ifndef __int8_t_defined #define __int8_t_defined #endif #endif #ifdef _STDINT_NEED_INT_MODEL_T /* we must guess all the basic types. Apart from byte-adressable system, */ /* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ /* (btw, those nibble-addressable systems are way off, or so we assume) */ dnl /* have a look at "64bit and data size neutrality" at */ dnl /* http://unix.org/version2/whatsnew/login_64bit.html */ dnl /* (the shorthand "ILP" types always have a "P" part) */ #if defined _STDINT_BYTE_MODEL #if _STDINT_LONG_MODEL+0 == 242 /* 2:4:2 = IP16 = a normal 16-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef long int32_t; #endif #elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 /* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ /* 4:4:4 = ILP32 = a normal 32-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif #elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 /* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ /* 4:8:8 = LP64 = a normal 64-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif /* this system has a "long" of 64bit */ #ifndef _HAVE_UINT64_T #define _HAVE_UINT64_T typedef unsigned long uint64_t; typedef long int64_t; #endif #elif _STDINT_LONG_MODEL+0 == 448 /* LLP64 a 64-bit system derived from a 32-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif /* assuming the system has a "long long" */ #ifndef _HAVE_UINT64_T #define _HAVE_UINT64_T #define _HAVE_LONGLONG_UINT64_T typedef unsigned long long uint64_t; typedef long long int64_t; #endif #else #define _STDINT_NO_INT32_T #endif #else #define _STDINT_NO_INT8_T #define _STDINT_NO_INT32_T #endif #endif /* * quote from SunOS-5.8 sys/inttypes.h: * Use at your own risk. As of February 1996, the committee is squarely * behind the fixed sized types; the "least" and "fast" types are still being * discussed. The probability that the "fast" types may be removed before * the standard is finalized is high enough that they are not currently * implemented. */ #if defined _STDINT_NEED_INT_LEAST_T typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; #ifdef _HAVE_UINT64_T typedef int64_t int_least64_t; #endif typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; #ifdef _HAVE_UINT64_T typedef uint64_t uint_least64_t; #endif /* least types */ #endif #if defined _STDINT_NEED_INT_FAST_T typedef int8_t int_fast8_t; typedef int int_fast16_t; typedef int32_t int_fast32_t; #ifdef _HAVE_UINT64_T typedef int64_t int_fast64_t; #endif typedef uint8_t uint_fast8_t; typedef unsigned uint_fast16_t; typedef uint32_t uint_fast32_t; #ifdef _HAVE_UINT64_T typedef uint64_t uint_fast64_t; #endif /* fast types */ #endif #ifdef _STDINT_NEED_INTMAX_T #ifdef _HAVE_UINT64_T typedef int64_t intmax_t; typedef uint64_t uintmax_t; #else typedef long intmax_t; typedef unsigned long uintmax_t; #endif #endif #ifdef _STDINT_NEED_INTPTR_T #ifndef __intptr_t_defined #define __intptr_t_defined /* we encourage using "long" to store pointer values, never use "int" ! */ #if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 typedef unsigned int uintptr_t; typedef int intptr_t; #elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 typedef unsigned long uintptr_t; typedef long intptr_t; #elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ typedef unsigned long uintptr_t; typedef long intptr_t; #endif #endif #endif /* The ISO C99 standard specifies that in C++ implementations these should only be defined if explicitly requested. */ #if !defined __cplusplus || defined __STDC_CONSTANT_MACROS #ifndef UINT32_C /* Signed. */ # define INT8_C(c) c # define INT16_C(c) c # define INT32_C(c) c # ifdef _HAVE_LONGLONG_UINT64_T # define INT64_C(c) c ## L # else # define INT64_C(c) c ## LL # endif /* Unsigned. */ # define UINT8_C(c) c ## U # define UINT16_C(c) c ## U # define UINT32_C(c) c ## U # ifdef _HAVE_LONGLONG_UINT64_T # define UINT64_C(c) c ## UL # else # define UINT64_C(c) c ## ULL # endif /* Maximal type. */ # ifdef _HAVE_LONGLONG_UINT64_T # define INTMAX_C(c) c ## L # define UINTMAX_C(c) c ## UL # else # define INTMAX_C(c) c ## LL # define UINTMAX_C(c) c ## ULL # endif /* literalnumbers */ #endif #endif /* These limits are merily those of a two complement byte-oriented system */ /* Minimum of signed integral types. */ # define INT8_MIN (-128) # define INT16_MIN (-32767-1) # define INT32_MIN (-2147483647-1) # define INT64_MIN (-__INT64_C(9223372036854775807)-1) /* Maximum of signed integral types. */ # define INT8_MAX (127) # define INT16_MAX (32767) # define INT32_MAX (2147483647) # define INT64_MAX (__INT64_C(9223372036854775807)) /* Maximum of unsigned integral types. */ # define UINT8_MAX (255) # define UINT16_MAX (65535) # define UINT32_MAX (4294967295U) # define UINT64_MAX (__UINT64_C(18446744073709551615)) /* Minimum of signed integral types having a minimum size. */ # define INT_LEAST8_MIN INT8_MIN # define INT_LEAST16_MIN INT16_MIN # define INT_LEAST32_MIN INT32_MIN # define INT_LEAST64_MIN INT64_MIN /* Maximum of signed integral types having a minimum size. */ # define INT_LEAST8_MAX INT8_MAX # define INT_LEAST16_MAX INT16_MAX # define INT_LEAST32_MAX INT32_MAX # define INT_LEAST64_MAX INT64_MAX /* Maximum of unsigned integral types having a minimum size. */ # define UINT_LEAST8_MAX UINT8_MAX # define UINT_LEAST16_MAX UINT16_MAX # define UINT_LEAST32_MAX UINT32_MAX # define UINT_LEAST64_MAX UINT64_MAX /* shortcircuit*/ #endif /* once */ #endif #endif STDINT_EOF fi if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then AC_MSG_NOTICE([$ac_stdint_h is unchanged]) else ac_dir=`AS_DIRNAME(["$ac_stdint_h"])` AS_MKDIR_P(["$ac_dir"]) rm -f $ac_stdint_h mv $ac_stdint $ac_stdint_h fi ],[# variables for create stdint.h replacement PACKAGE="$PACKAGE" VERSION="$VERSION" ac_stdint_h="$ac_stdint_h" _ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h) ac_cv_stdint_message="$ac_cv_stdint_message" ac_cv_header_stdint_t="$ac_cv_header_stdint_t" ac_cv_header_stdint_x="$ac_cv_header_stdint_x" ac_cv_header_stdint_o="$ac_cv_header_stdint_o" ac_cv_header_stdint_u="$ac_cv_header_stdint_u" ac_cv_type_uint64_t="$ac_cv_type_uint64_t" ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" ac_cv_char_data_model="$ac_cv_char_data_model" ac_cv_long_data_model="$ac_cv_long_data_model" ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" ac_cv_type_intmax_t="$ac_cv_type_intmax_t" ]) ]) gst-plugins-good-0.10.31/common/m4/gst-parser.m40000644000175000017500000000362711671200067016150 00000000000000AC_DEFUN([AG_GST_BISON_CHECK], [ dnl FIXME: check if AC_PROG_YACC is suitable here dnl FIXME: make precious AC_PATH_PROG(BISON_PATH, bison, no) if test x$BISON_PATH = xno; then AC_MSG_ERROR(Could not find bison) fi dnl check bison version dnl we need version >= 1.875 for the reentrancy support dnl in the parser. dnl First lines observed: 'bison (GNU Bison) 2.3' or 'GNU Bison version 1.28' bison_min_version=1.875 bison_version=`$BISON_PATH --version | head -n 1 | sed 's/^[[^0-9]]*//' | sed 's/[[^0-9]]*$//' | cut -d' ' -f1` AC_MSG_CHECKING([bison version $bison_version >= $bison_min_version]) if perl -we "exit ((v$bison_version ge v$bison_min_version) ? 0 : 1)"; then AC_MSG_RESULT([yes]) else AC_MSG_ERROR([no]) fi ]) AC_DEFUN([AG_GST_FLEX_CHECK], [ dnl we require flex for building the parser AC_PATH_PROG(FLEX_PATH, flex, no) if test x$FLEX_PATH = xno; then AC_MSG_ERROR(Could not find flex) fi dnl check flex version dnl we need version >= 2.5.31 for the reentrancy support dnl in the parser. flex_min_version=2.5.31 flex_version=`$FLEX_PATH --version | head -n 1 | sed 's/^.* //' | sed 's/[[a-zA-Z]]*$//' | cut -d' ' -f1` AC_MSG_CHECKING([flex version $flex_version >= $flex_min_version]) if perl -w < \$min_version_major) || ((\$flex_version_major == \$min_version_major) && (\$flex_version_minor > \$min_version_minor)) || ((\$flex_version_major == \$min_version_major) && (\$flex_version_minor == \$min_version_minor) && (\$flex_version_micro >= \$min_version_micro))) ? 0 : 1); EOF then AC_MSG_RESULT(yes) else AC_MSG_ERROR([no]) fi ]) gst-plugins-good-0.10.31/common/m4/gst-args.m40000644000175000017500000002347111677341671015624 00000000000000dnl configure-time options shared among gstreamer modules dnl AG_GST_ARG_DEBUG dnl AG_GST_ARG_PROFILING dnl AG_GST_ARG_VALGRIND dnl AG_GST_ARG_GCOV dnl AG_GST_ARG_EXAMPLES dnl AG_GST_ARG_WITH_PKG_CONFIG_PATH dnl AG_GST_ARG_WITH_PACKAGE_NAME dnl AG_GST_ARG_WITH_PACKAGE_ORIGIN dnl AG_GST_ARG_WITH_PLUGINS dnl AG_GST_CHECK_PLUGIN dnl AG_GST_DISABLE_PLUGIN dnl AG_GST_ARG_ENABLE_EXTERNAL dnl AG_GST_ARG_ENABLE_EXPERIMENTAL dnl AG_GST_ARG_ENABLE_BROKEN AC_DEFUN([AG_GST_ARG_DEBUG], [ dnl debugging stuff AC_ARG_ENABLE(debug, AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]), [ case "${enableval}" in yes) USE_DEBUG=yes ;; no) USE_DEBUG=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac ], [USE_DEBUG=yes]) dnl Default value ]) AC_DEFUN([AG_GST_ARG_PROFILING], [ AC_ARG_ENABLE(profiling, AC_HELP_STRING([--enable-profiling], [adds -pg to compiler commandline, for profiling]), [ case "${enableval}" in yes) USE_PROFILING=yes ;; no) USE_PROFILING=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-profiling) ;; esac ], [USE_PROFILING=no]) dnl Default value ]) AC_DEFUN([AG_GST_ARG_VALGRIND], [ dnl valgrind inclusion AC_ARG_ENABLE(valgrind, AC_HELP_STRING([--disable-valgrind],[disable run-time valgrind detection]), [ case "${enableval}" in yes) USE_VALGRIND="$USE_DEBUG" ;; no) USE_VALGRIND=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;; esac ], [USE_VALGRIND="$USE_DEBUG"]) dnl Default value VALGRIND_REQ="3.0" if test "x$USE_VALGRIND" = xyes; then PKG_CHECK_MODULES(VALGRIND, valgrind >= $VALGRIND_REQ, USE_VALGRIND="yes", USE_VALGRIND="no") fi if test "x$USE_VALGRIND" = xyes; then AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used]) AC_MSG_NOTICE(Using extra code paths for valgrind) fi ]) AC_DEFUN([AG_GST_ARG_GCOV], [ AC_ARG_ENABLE(gcov, AC_HELP_STRING([--enable-gcov], [compile with coverage profiling instrumentation (gcc only)]), enable_gcov=$enableval, enable_gcov=no) if test x$enable_gcov = xyes ; then if test "x$GCC" != "xyes" then AC_MSG_ERROR([gcov only works if gcc is used]) fi AS_COMPILER_FLAG(["-fprofile-arcs"], [GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs"], true) AS_COMPILER_FLAG(["-ftest-coverage"], [GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage"], true) dnl remove any -O flags - FIXME: is this needed ? GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[[0-9]]*//g'` dnl libtool 1.5.22 and lower strip -fprofile-arcs from the flags dnl passed to the linker, which is a bug; -fprofile-arcs implicitly dnl links in -lgcov, so we do it explicitly here for the same effect GCOV_LIBS=-lgcov AC_SUBST(GCOV_CFLAGS) AC_SUBST(GCOV_LIBS) GCOV=`echo $CC | sed s/gcc/gcov/g` AC_SUBST(GCOV) GST_GCOV_ENABLED=yes AC_DEFINE_UNQUOTED(GST_GCOV_ENABLED, 1, [Defined if gcov is enabled to force a rebuild due to config.h changing]) dnl if gcov is used, we do not want default -O2 CFLAGS if test "x$GST_GCOV_ENABLED" = "xyes" then CFLAGS="-O0" AC_SUBST(CFLAGS) CXXFLAGS="-O0" AC_SUBST(CXXFLAGS) FFLAGS="-O0" AC_SUBST(FFLAGS) CCASFLAGS="-O0" AC_SUBST(CCASFLAGS) AC_MSG_NOTICE([gcov enabled, setting CFLAGS and friends to $CFLAGS]) fi fi AM_CONDITIONAL(GST_GCOV_ENABLED, test x$enable_gcov = xyes) ]) AC_DEFUN([AG_GST_ARG_EXAMPLES], [ AC_ARG_ENABLE(examples, AC_HELP_STRING([--disable-examples], [disable building examples]), [ case "${enableval}" in yes) BUILD_EXAMPLES=yes ;; no) BUILD_EXAMPLES=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --disable-examples) ;; esac ], [BUILD_EXAMPLES=yes]) dnl Default value AM_CONDITIONAL(BUILD_EXAMPLES, test "x$BUILD_EXAMPLES" = "xyes") ]) AC_DEFUN([AG_GST_ARG_WITH_PKG_CONFIG_PATH], [ dnl possibly modify pkg-config path AC_ARG_WITH(pkg-config-path, AC_HELP_STRING([--with-pkg-config-path], [colon-separated list of pkg-config(1) dirs]), [ export PKG_CONFIG_PATH=${withval} AC_MSG_NOTICE(Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH) ]) ]) dnl This macro requires that GST_GIT or GST_CVS is set to yes or no (release) AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_NAME], [ dnl package name in plugins AC_ARG_WITH(package-name, AC_HELP_STRING([--with-package-name], [specify package name to use in plugins]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; *) GST_PACKAGE_NAME="${withval}" ;; esac ], [ P=$1 if test "x$P" = "x" then P=$PACKAGE_NAME fi if test "x$PACKAGE_VERSION_NANO" = "x0" then GST_PACKAGE_NAME="$P source release" else if test "x$PACKAGE_VERSION_NANO" = "x1" then GST_PACKAGE_NAME="$P git" else GST_PACKAGE_NAME="$P prerelease" fi fi ] ) AC_MSG_NOTICE(Using $GST_PACKAGE_NAME as package name) AC_DEFINE_UNQUOTED(GST_PACKAGE_NAME, "$GST_PACKAGE_NAME", [package name in plugins]) AC_SUBST(GST_PACKAGE_NAME) ]) AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_ORIGIN], [ dnl package origin URL AC_ARG_WITH(package-origin, AC_HELP_STRING([--with-package-origin], [specify package origin URL to use in plugins]), [ case "${withval}" in yes) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;; *) GST_PACKAGE_ORIGIN="${withval}" ;; esac ], [GST_PACKAGE_ORIGIN="[Unknown package origin]"] dnl Default value ) AC_MSG_NOTICE(Using $GST_PACKAGE_ORIGIN as package origin) AC_DEFINE_UNQUOTED(GST_PACKAGE_ORIGIN, "$GST_PACKAGE_ORIGIN", [package origin]) AC_SUBST(GST_PACKAGE_ORIGIN) ]) dnl sets WITH_PLUGINS to the list of plug-ins given as an argument dnl also clears GST_PLUGINS_ALL and GST_PLUGINS_SELECTED AC_DEFUN([AG_GST_ARG_WITH_PLUGINS], [ AC_ARG_WITH(plugins, AC_HELP_STRING([--with-plugins], [comma-separated list of dependencyless plug-ins to compile]), [WITH_PLUGINS=$withval], [WITH_PLUGINS=]) GST_PLUGINS_ALL="" GST_PLUGINS_SELECTED="" AC_SUBST(GST_PLUGINS_ALL) AC_SUBST(GST_PLUGINS_SELECTED) ]) dnl AG_GST_CHECK_PLUGIN(PLUGIN-NAME) dnl dnl This macro adds the plug-in to GST_PLUGINS_ALL. Then it dnl checks if WITH_PLUGINS is empty or the plugin is present in WITH_PLUGINS, dnl and if so adds it to GST_PLUGINS_SELECTED. Then it checks if the plugin dnl is present in WITHOUT_PLUGINS (ie. was disabled specifically) and if so dnl removes it from GST_PLUGINS_SELECTED. dnl dnl The macro will call AM_CONDITIONAL(USE_PLUGIN_, ...) to allow dnl control of what is built in Makefile.ams. AC_DEFUN([AG_GST_CHECK_PLUGIN], [ GST_PLUGINS_ALL="$GST_PLUGINS_ALL [$1]" define([pname_def],translit([$1], -a-z, _a-z)) AC_ARG_ENABLE([$1], AC_HELP_STRING([--disable-[$1]], [disable dependency-less $1 plugin]), [ case "${enableval}" in yes) [gst_use_]pname_def=yes ;; no) [gst_use_]pname_def=no ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-$1]) ;; esac ], [[gst_use_]pname_def=yes]) dnl Default value if test x$[gst_use_]pname_def = xno; then AC_MSG_NOTICE(disabling dependency-less plugin $1) WITHOUT_PLUGINS="$WITHOUT_PLUGINS [$1]" fi undefine([pname_def]) if [[ -z "$WITH_PLUGINS" ]] || echo " [$WITH_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED [$1]" fi if echo " [$WITHOUT_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ [$1] / /'` fi AM_CONDITIONAL([USE_PLUGIN_]translit([$1], a-z, A-Z), echo " $GST_PLUGINS_SELECTED " | grep -i " [$1] " > /dev/null) ]) dnl AG_GST_DISABLE_PLUGIN(PLUGIN-NAME) dnl dnl This macro disables the plug-in by removing it from dnl GST_PLUGINS_SELECTED. AC_DEFUN([AG_GST_DISABLE_PLUGIN], [ GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ [$1] / /'` AM_CONDITIONAL([USE_PLUGIN_]translit([$1], a-z, A-Z), false) ]) AC_DEFUN([AG_GST_ARG_ENABLE_EXTERNAL], [ AG_GST_CHECK_FEATURE(EXTERNAL, [building of plug-ins with external deps],, HAVE_EXTERNAL=yes, enabled, [ AC_MSG_NOTICE(building external plug-ins) BUILD_EXTERNAL="yes" ],[ AC_MSG_WARN(all plug-ins with external dependencies will not be built) BUILD_EXTERNAL="no" ]) # make BUILD_EXTERNAL available to Makefile.am AM_CONDITIONAL(BUILD_EXTERNAL, test "x$BUILD_EXTERNAL" = "xyes") ]) dnl experimental plug-ins; stuff that hasn't had the dust settle yet dnl read 'builds, but might not work' AC_DEFUN([AG_GST_ARG_ENABLE_EXPERIMENTAL], [ AG_GST_CHECK_FEATURE(EXPERIMENTAL, [building of experimental plug-ins],, HAVE_EXPERIMENTAL=yes, disabled, [ AC_MSG_WARN(building experimental plug-ins) BUILD_EXPERIMENTAL="yes" ],[ AC_MSG_NOTICE(not building experimental plug-ins) BUILD_EXPERIMENTAL="no" ]) # make BUILD_EXPERIMENTAL available to Makefile.am AM_CONDITIONAL(BUILD_EXPERIMENTAL, test "x$BUILD_EXPERIMENTAL" = "xyes") ]) dnl broken plug-ins; stuff that doesn't seem to build at the moment AC_DEFUN([AG_GST_ARG_ENABLE_BROKEN], [ AG_GST_CHECK_FEATURE(BROKEN, [building of broken plug-ins],, HAVE_BROKEN=yes, disabled, [ AC_MSG_WARN([building broken plug-ins -- no bug reports on these, only patches ...]) ],[ AC_MSG_NOTICE([not building broken plug-ins]) ]) ]) gst-plugins-good-0.10.31/common/m4/gst-x11.m40000644000175000017500000000433611671200067015263 00000000000000dnl macros for X-related detections dnl AC_SUBST's HAVE_X, X_CFLAGS, X_LIBS AC_DEFUN([AG_GST_CHECK_X], [ AC_PATH_XTRA ac_cflags_save="$CFLAGS" ac_cppflags_save="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" dnl now try to find the HEADER AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no") if test "x$HAVE_X" = "xno" then AC_MSG_NOTICE([cannot find X11 development files]) else dnl this is much more than we want X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" dnl AC_PATH_XTRA only defines the path needed to find the X libs, dnl it does not add the libs; therefore we add them here X_LIBS="$X_LIBS -lX11" AC_SUBST(X_CFLAGS) AC_SUBST(X_LIBS) fi AC_SUBST(HAVE_X) CFLAGS="$ac_cflags_save" CPPFLAGS="$ac_cppflags_save" ]) dnl *** XVideo *** dnl Look for the PIC library first, Debian requires it. dnl Check debian-devel archives for gory details. dnl 20020110: dnl At the moment XFree86 doesn't distribute shared libXv due dnl to unstable API. On many platforms you CAN NOT link a shared dnl lib to a static non-PIC lib. This is what the xvideo GStreamer dnl plug-in wants to do. So Debian distributes a PIC compiled dnl version of the static lib for plug-ins to link to when it is dnl inappropriate to link the main application to libXv directly. dnl FIXME: add check if this platform can support linking to a dnl non-PIC libXv, if not then don not use Xv. dnl FIXME: perhaps warn user if they have a shared libXv since dnl this is an error until XFree86 starts shipping one AC_DEFUN([AG_GST_CHECK_XV], [ if test x$HAVE_X = xyes; then AC_CHECK_LIB(Xv_pic, XvQueryExtension, HAVE_XVIDEO="yes", HAVE_XVIDEO="no", $X_LIBS -lXext) if test x$HAVE_XVIDEO = xyes; then XVIDEO_LIBS="-lXv_pic -lXext" AC_SUBST(XVIDEO_LIBS) else dnl try again using something else if we didn't find it first if test x$HAVE_XVIDEO = xno; then AC_CHECK_LIB(Xv, XvQueryExtension, HAVE_XVIDEO="yes", HAVE_XVIDEO="no", $X_LIBS -lXext) if test x$HAVE_XVIDEO = xyes; then XVIDEO_LIBS="-lXv -lXext" AC_SUBST(XVIDEO_LIBS) fi fi fi fi ]) gst-plugins-good-0.10.31/common/m4/README0000644000175000017500000000032611671200067014470 00000000000000All aclocal .m4 files we need are put here and cat'd to acinclude.m4 in the source root. Official ones (taken from the relevant devel packages) are named as-is, unofficial ones (or changed ones) get a gst-prefix. gst-plugins-good-0.10.31/common/m4/as-compiler.m40000644000175000017500000000141411671200067016264 00000000000000dnl as-compiler.m4 0.1.0 dnl autostars m4 macro for detection of compiler flavor dnl Thomas Vander Stichele dnl $Id: as-compiler.m4,v 1.4 2004/06/01 09:44:19 thomasvs Exp $ dnl AS_COMPILER(COMPILER) dnl will set variable COMPILER to dnl - gcc dnl - forte dnl - (empty) if no guess could be made AC_DEFUN([AS_COMPILER], [ as_compiler= AC_MSG_CHECKING(for compiler flavour) dnl is it gcc ? if test "x$GCC" = "xyes"; then as_compiler="gcc" fi dnl is it forte ? AC_TRY_RUN([ int main (int argc, char *argv[]) { #ifdef __sun return 0; #else return 1; #endif } ], as_compiler="forte", ,) if test "x$as_compiler" = "x"; then AC_MSG_RESULT([unknown !]) else AC_MSG_RESULT($as_compiler) fi [$1]=$as_compiler ]) gst-plugins-good-0.10.31/common/m4/as-version.m40000644000175000017500000000414111671200067016137 00000000000000dnl as-version.m4 0.2.0 dnl autostars m4 macro for versioning dnl Thomas Vander Stichele dnl $Id: as-version.m4,v 1.15 2006/04/01 09:40:24 thomasvs Exp $ dnl AS_VERSION dnl example dnl AS_VERSION dnl this macro dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO dnl - AC_SUBST's PACKAGE_VERSION_RELEASE, dnl which can be used for rpm release fields dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents dnl maintainer mode from running correctly dnl dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h dnl if you use acconfig.h AC_DEFUN([AS_VERSION], [ PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1) PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2) PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3) AC_SUBST(PACKAGE_VERSION_MAJOR) AC_SUBST(PACKAGE_VERSION_MINOR) AC_SUBST(PACKAGE_VERSION_MICRO) ]) dnl AS_NANO(ACTION-IF-NANO-NON-NULL, [ACTION-IF-NANO-NULL]) dnl requires AC_INIT to be called before dnl For projects using a fourth or nano number in your versioning to indicate dnl development or prerelease snapshots, this macro allows the build to be dnl set up differently accordingly. dnl this macro: dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number dnl - sets the variable PACKAGE_VERSION_NANO dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used dnl for rpm release fields dnl - executes ACTION-IF-NANO-NON-NULL or ACTION-IF-NANO-NULL dnl example: dnl AS_NANO(RELEASE="yes", RELEASE="no") AC_DEFUN([AS_NANO], [ AC_MSG_CHECKING(nano version) NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4) if test x"$NANO" = x || test "x$NANO" = "x0" ; then AC_MSG_RESULT([0 (release)]) NANO=0 PACKAGE_VERSION_RELEASE=1 ifelse([$1], , :, [$1]) else AC_MSG_RESULT($NANO) PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` if test "x$NANO" != "x1" ; then ifelse([$1], , :, [$1]) else ifelse([$2], , :, [$2]) fi fi PACKAGE_VERSION_NANO=$NANO AC_SUBST(PACKAGE_VERSION_NANO) AC_SUBST(PACKAGE_VERSION_RELEASE) ]) gst-plugins-good-0.10.31/common/m4/as-ac-expand.m40000644000175000017500000000210511671200067016310 00000000000000dnl as-ac-expand.m4 0.2.0 dnl autostars m4 macro for expanding directories using configure's prefix dnl thomas@apestaart.org dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR) dnl example dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir) dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local AC_DEFUN([AS_AC_EXPAND], [ EXP_VAR=[$1] FROM_VAR=[$2] dnl first expand prefix and exec_prefix if necessary prefix_save=$prefix exec_prefix_save=$exec_prefix dnl if no prefix given, then use /usr/local, the default prefix if test "x$prefix" = "xNONE"; then prefix="$ac_default_prefix" fi dnl if no exec_prefix given, then use prefix if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi full_var="$FROM_VAR" dnl loop until it doesn't change anymore while true; do new_full_var="`eval echo $full_var`" if test "x$new_full_var" = "x$full_var"; then break; fi full_var=$new_full_var done dnl clean up full_var=$new_full_var AC_SUBST([$1], "$full_var") dnl restore prefix and exec_prefix prefix=$prefix_save exec_prefix=$exec_prefix_save ]) gst-plugins-good-0.10.31/common/m4/as-objc.m40000644000175000017500000000145311671200067015372 00000000000000 # AC_PROG_OBJC([LIST-OF-COMPILERS]) # AC_DEFUN([AS_PROG_OBJC], [ AC_CHECK_TOOLS(OBJC, [m4_default([$1], [objcc objc gcc cc CC])], none) AC_SUBST(OBJC) OBJC_LDFLAGS="-lobjc" AC_SUBST(OBJC_LDFLAGS) if test "x$OBJC" != xnone ; then _AM_DEPENDENCIES(OBJC) AC_MSG_CHECKING([if Objective C compiler works]) cat >>conftest.m < @interface Moo:Object { } - moo; int main(); @end @implementation Moo - moo { exit(0); } int main() { id moo; moo = [[Moo new]]; [[moo moo]]; return 1; } @end EOF ${OBJC} conftest.m ${OBJC_LDFLAGS} >&5 2>&5 if test -f a.out -o -f a.exe ; then result=yes else result=no echo failed program is: >&5 cat conftest.m >&5 fi rm -f conftest.m a.out a.exe AC_MSG_RESULT([$result]) else _AM_DEPENDENCIES(OBJC) fi ]) gst-plugins-good-0.10.31/common/m4/gst-plugindir.m40000644000175000017500000000113011671200067016634 00000000000000dnl AG_GST_SET_PLUGINDIR dnl AC_DEFINE PLUGINDIR to the full location where plug-ins will be installed dnl AC_SUBST plugindir, to be used in Makefile.am's AC_DEFUN([AG_GST_SET_PLUGINDIR], [ dnl define location of plugin directory AS_AC_EXPAND(PLUGINDIR, ${libdir}/gstreamer-$GST_MAJORMINOR) AC_DEFINE_UNQUOTED(PLUGINDIR, "$PLUGINDIR", [directory where plugins are located]) AC_MSG_NOTICE([Using $PLUGINDIR as the plugin install location]) dnl plugin directory configure-time variable for use in Makefile.am plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" AC_SUBST(plugindir) ]) gst-plugins-good-0.10.31/common/m4/orc.m40000644000175000017500000000415011677341671014651 00000000000000dnl pkg-config-based checks for Orc dnl specific: dnl ORC_CHECK([REQUIRED_VERSION]) AC_DEFUN([ORC_CHECK], [ ORC_REQ=ifelse([$1], , "0.4.6", [$1]) AC_ARG_ENABLE(orc, AC_HELP_STRING([--enable-orc],[use Orc if installed]), [case "${enableval}" in auto) enable_orc=auto ;; yes) enable_orc=yes ;; no) enable_orc=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-orc) ;; esac ], [enable_orc=auto]) dnl Default value if test "x$enable_orc" != "xno" ; then PKG_CHECK_MODULES(ORC, orc-0.4 >= $ORC_REQ, [ AC_DEFINE(HAVE_ORC, 1, [Use Orc]) HAVE_ORC=yes if test "x$ORCC" = "x" ; then AC_MSG_CHECKING(for usable orcc) ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` dnl check whether the orcc found by pkg-config can be run from the build environment dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`]) AC_MSG_RESULT($ORCC) fi AC_SUBST(ORCC) ORCC_FLAGS="--compat $ORC_REQ" AC_SUBST(ORCC_FLAGS) AS_IF([test "x$ORCC" = "x"], [HAVE_ORCC=no], [HAVE_ORCC=yes]) ], [ if test "x$enable_orc" = "xyes" ; then AC_MSG_ERROR([--enable-orc specified, but Orc >= $ORC_REQ not found]) fi AC_DEFINE(DISABLE_ORC, 1, [Disable Orc]) HAVE_ORC=no HAVE_ORCC=no ]) else AC_DEFINE(DISABLE_ORC, 1, [Disable Orc]) HAVE_ORC=no HAVE_ORCC=no fi AM_CONDITIONAL(HAVE_ORC, [test "x$HAVE_ORC" = "xyes"]) AM_CONDITIONAL(HAVE_ORCC, [test "x$HAVE_ORCC" = "xyes"]) ])) AC_DEFUN([ORC_OUTPUT], [ if test "$HAVE_ORC" = yes ; then printf "configure: *** Orc acceleration enabled.\n" else if test "x$enable_orc" = "xno" ; then printf "configure: *** Orc acceleration disabled by --disable-orc. Slower code paths\n" printf " will be used.\n" else printf "configure: *** Orc acceleration disabled. Requires Orc >= $ORC_REQ, which was\n" printf " not found. Slower code paths will be used.\n" fi fi printf "\n" ]) gst-plugins-good-0.10.31/common/m4/as-compiler-flag.m40000644000175000017500000000255411671200067017201 00000000000000dnl as-compiler-flag.m4 0.1.0 dnl autostars m4 macro for detection of compiler flags dnl David Schleef dnl Tim-Philipp Müller dnl AS_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) dnl Tries to compile with the given CFLAGS. dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, dnl and ACTION-IF-NOT-ACCEPTED otherwise. AC_DEFUN([AS_COMPILER_FLAG], [ AC_MSG_CHECKING([to see if compiler understands $1]) save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $1" AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) CFLAGS="$save_CFLAGS" if test "X$flag_ok" = Xyes ; then $2 true else $3 true fi AC_MSG_RESULT([$flag_ok]) ]) dnl AS_CXX_COMPILER_FLAG(CPPFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) dnl Tries to compile with the given CPPFLAGS. dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, dnl and ACTION-IF-NOT-ACCEPTED otherwise. AC_DEFUN([AS_CXX_COMPILER_FLAG], [ AC_REQUIRE([AC_PROG_CXX]) AC_MSG_CHECKING([to see if c++ compiler understands $1]) save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $1" AC_LANG_PUSH(C++) AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) CPPFLAGS="$save_CPPFLAGS" if test "X$flag_ok" = Xyes ; then $2 true else $3 true fi AC_LANG_POP(C++) AC_MSG_RESULT([$flag_ok]) ]) gst-plugins-good-0.10.31/common/m4/introspection.m40000644000175000017500000000661411701411037016753 00000000000000dnl -*- mode: autoconf -*- dnl Copyright 2009 Johan Dahlin dnl dnl This file is free software; the author(s) gives unlimited dnl permission to copy and/or distribute it, with or without dnl modifications, as long as this notice is preserved. dnl # serial 1 m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], [ AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([LT_INIT],[$0])dnl setup libtool first dnl enable/disable introspection m4_if([$2], [require], [dnl enable_introspection=yes ],[dnl AC_ARG_ENABLE(introspection, AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]], [Enable introspection for this build]),, [enable_introspection=auto]) ])dnl AC_MSG_CHECKING([for gobject-introspection]) dnl presence/version checking AS_CASE([$enable_introspection], [no], [dnl found_introspection="no (disabled, use --enable-introspection to enable)" ],dnl [yes],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0],, AC_MSG_ERROR([gobject-introspection-1.0 is not installed])) PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME])) ],dnl [auto],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) ],dnl [dnl AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) ])dnl AC_MSG_RESULT([$found_introspection]) INTROSPECTION_SCANNER= INTROSPECTION_COMPILER= INTROSPECTION_GENERATE= INTROSPECTION_GIRDIR= INTROSPECTION_TYPELIBDIR= if test "x$found_introspection" = "xyes"; then INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection fi AC_SUBST(INTROSPECTION_SCANNER) AC_SUBST(INTROSPECTION_COMPILER) AC_SUBST(INTROSPECTION_GENERATE) AC_SUBST(INTROSPECTION_GIRDIR) AC_SUBST(INTROSPECTION_TYPELIBDIR) AC_SUBST(INTROSPECTION_CFLAGS) AC_SUBST(INTROSPECTION_LIBS) AC_SUBST(INTROSPECTION_MAKEFILE) AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") ]) dnl Usage: dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version]) AC_DEFUN([GOBJECT_INTROSPECTION_CHECK], [ _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1]) ]) dnl Usage: dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version]) AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], [ _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) ]) gst-plugins-good-0.10.31/common/m4/gtk-doc.m40000644000175000017500000000254111671200067015403 00000000000000dnl -*- mode: autoconf -*- # serial 1 dnl Usage: dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) AC_DEFUN([GTK_DOC_CHECK], [ AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first dnl for overriding the documentation installation directory AC_ARG_WITH([html-dir], AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, [with_html_dir='${datadir}/gtk-doc/html']) HTML_DIR="$with_html_dir" AC_SUBST([HTML_DIR]) dnl enable/disable documentation building AC_ARG_ENABLE([gtk-doc], AS_HELP_STRING([--enable-gtk-doc], [use gtk-doc to build documentation [[default=no]]]),, [enable_gtk_doc=no]) if test x$enable_gtk_doc = xyes; then ifelse([$1],[], [PKG_CHECK_EXISTS([gtk-doc],, AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], [PKG_CHECK_EXISTS([gtk-doc >= $1],, AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build gtk-doc]))]) if test -z "$SED"; then AC_PROG_SED fi fi AC_MSG_CHECKING([whether to build gtk-doc documentation]) AC_MSG_RESULT($enable_gtk_doc) AC_PATH_PROGS(GTKDOC_CHECK,gtkdoc-check,) AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) ]) gst-plugins-good-0.10.31/common/m4/as-gcc-inline-assembly.m40000644000175000017500000000212411671200067020276 00000000000000dnl as-gcc-inline-assembly.m4 0.1.0 dnl autostars m4 macro for detection of gcc inline assembly dnl David Schleef dnl $Id$ dnl AS_COMPILER_FLAG(ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) dnl Tries to compile with the given CFLAGS. dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, dnl and ACTION-IF-NOT-ACCEPTED otherwise. AC_DEFUN([AS_GCC_INLINE_ASSEMBLY], [ AC_MSG_CHECKING([if compiler supports gcc-style inline assembly]) AC_TRY_COMPILE([], [ #ifdef __GNUC_MINOR__ #if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 #error GCC before 3.4 has critical bugs compiling inline assembly #endif #endif __asm__ (""::) ], [flag_ok=yes], [flag_ok=no]) if test "X$flag_ok" = Xyes ; then $1 true else $2 true fi AC_MSG_RESULT([$flag_ok]) ]) AC_DEFUN([AS_GCC_ASM_POWERPC_FPU], [ AC_MSG_CHECKING([if compiler supports FPU instructions on PowerPC]) AC_TRY_COMPILE([], [__asm__ ("fadd 0,0,0"::) ], [flag_ok=yes], [flag_ok=no]) if test "X$flag_ok" = Xyes ; then $1 true else $2 true fi AC_MSG_RESULT([$flag_ok]) ]) gst-plugins-good-0.10.31/common/m4/as-docbook.m40000644000175000017500000000371511671200067016100 00000000000000dnl AS_DOCBOOK([, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl checks if xsltproc can build docbook documentation dnl (which is possible if the catalog is set up properly dnl I also tried checking for a specific version and type of docbook dnl but xsltproc seemed to happily run anyway, so we can't check for that dnl and version dnl this macro takes inspiration from dnl http://www.movement.uklinux.net/docs/docbook-autotools/configure.html AC_DEFUN([AS_DOCBOOK], [ XSLTPROC_FLAGS=--nonet DOCBOOK_ROOT= TYPE_LC=xml TYPE_UC=XML DOCBOOK_VERSION=4.1.2 if test ! -f /etc/xml/catalog; then for i in /usr/share/sgml/docbook/stylesheet/xsl/nwalsh /usr/share/sgml/docbook/xsl-stylesheets/ /usr/local/share/xsl/docbook ; do if test -d "$i"; then DOCBOOK_ROOT=$i fi done else XML_CATALOG=/etc/xml/catalog CAT_ENTRY_START='' fi dnl We need xsltproc to process the test AC_CHECK_PROG(XSLTPROC,xsltproc,xsltproc,) XSLTPROC_WORKS=no if test -n "$XSLTPROC"; then AC_MSG_CHECKING([whether xsltproc docbook processing works]) if test -n "$XML_CATALOG"; then DB_FILE="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl" else DB_FILE="$DOCBOOK_ROOT/xhtml/docbook.xsl" fi $XSLTPROC $XSLTPROC_FLAGS $DB_FILE >/dev/null 2>&1 << END END if test "$?" = 0; then XSLTPROC_WORKS=yes fi AC_MSG_RESULT($XSLTPROC_WORKS) fi if test "x$XSLTPROC_WORKS" = "xyes"; then dnl execute ACTION-IF-FOUND ifelse([$1], , :, [$1]) else dnl execute ACTION-IF-NOT-FOUND ifelse([$2], , :, [$2]) fi AC_SUBST(XML_CATALOG) AC_SUBST(XSLTPROC_FLAGS) AC_SUBST(DOCBOOK_ROOT) AC_SUBST(CAT_ENTRY_START) AC_SUBST(CAT_ENTRY_END) ]) gst-plugins-good-0.10.31/common/m4/Makefile.in0000644000175000017500000004427111720560224015663 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = common/m4 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ README \ as-ac-expand.m4 \ as-auto-alt.m4 \ as-compiler-flag.m4 \ as-compiler.m4 \ as-docbook.m4 \ as-gcc-inline-assembly.m4 \ as-libtool.m4 \ as-libtool-tags.m4 \ as-objc.m4 \ as-python.m4 \ as-scrub-include.m4 \ as-version.m4 \ ax_create_stdint_h.m4 \ glib-gettext.m4 \ gst-arch.m4 \ gst-args.m4 \ gst-check.m4 \ gst-debuginfo.m4 \ gst-default.m4 \ gst-doc.m4 \ gst-dowhile.m4 \ gst-error.m4 \ gst-feature.m4 \ gst-function.m4 \ gst-gettext.m4 \ gst-glib2.m4 \ gst-libxml2.m4 \ gst-parser.m4 \ gst-package-release-datetime.m4 \ gst-platform.m4 \ gst-plugindir.m4 \ gst-plugin-docs.m4 \ gst-valgrind.m4 \ gst-x11.m4 \ gst.m4 \ gtk-doc.m4 \ introspection.m4 \ pkg.m4 \ check.m4 \ orc.m4 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu common/m4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/common/m4/gst-gettext.m40000644000175000017500000000102611671200067016327 00000000000000dnl gettext setup dnl AG_GST_GETTEXT([gettext-package]) dnl defines GETTEXT_PACKAGE and LOCALEDIR AC_DEFUN([AG_GST_GETTEXT], [ if test "$USE_NLS" = "yes"; then GETTEXT_PACKAGE=[$1] else GETTEXT_PACKAGE=[NULL] fi AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], "$GETTEXT_PACKAGE", [gettext package name]) dnl define LOCALEDIR in config.h AS_AC_EXPAND(LOCALEDIR, $datadir/locale) AC_DEFINE_UNQUOTED([LOCALEDIR], "$LOCALEDIR", [gettext locale dir]) ]) gst-plugins-good-0.10.31/common/m4/gst-dowhile.m40000644000175000017500000000152511671200067016302 00000000000000dnl dnl Check for working do while(0) macros. This is used by G_STMT_START dnl and G_STMT_END in glib/gmacros.h. Without having this defined we dnl get "ambigious if-else" compiler warnings when compling C++ code. dnl dnl Copied from GLib's configure.in dnl AC_DEFUN([AG_GST_CHECK_DOWHILE_MACROS],[ dnl *** check for working do while(0) macros *** AC_CACHE_CHECK([for working do while(0) macros], _cv_g_support_dowhile_macros, [ AC_TRY_COMPILE([],[ #define STMT_START do #define STMT_END while(0) #define STMT_TEST STMT_START { i = 0; } STMT_END int main(void) { int i = 1; STMT_TEST; return i; }], [_cv_g_support_dowhile_macros=yes], [_cv_g_support_dowhile_macros=no], [_cv_g_support_dowhile_macros=yes]) ]) if test x$_cv_g_support_dowhile_macros = xyes; then AC_DEFINE(HAVE_DOWHILE_MACROS, 1, [define for working do while(0) macros]) fi ]) gst-plugins-good-0.10.31/common/m4/gst-package-release-datetime.m40000644000175000017500000000733211671200067021454 00000000000000dnl macros to set GST_PACKAGE_RELEASE_DATETIME dnl =========================================================================== dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME dnl dnl Usage: dnl dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME() dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...) dnl sets the release datetime to the current date dnl (no = this is not a release, but git or prerelease) dnl dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD]) dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD]) dnl sets the release datetime to the specified date (and time, if given) dnl (yes = this is a release, not git or prerelease) dnl dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION]) dnl sets the release date to the release date associated with version dnl RELEASE-VERSION in the .doap file DOAP-FILE dnl (yes = this is a release, not git or prerelease) dnl dnl We need to treat pre-releases like git because there won't be an entry dnl in the .doap file for pre-releases yet, and we don't want to use the dnl date of the last release either. dnl =========================================================================== AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME], [ dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME() dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes]...) if test "x$1" = "xno" -o "x$1" = "x"; then GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"` elif test "x$1" = "xyes"; then dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], ["YYYY-MM-DD"]) dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], [DOAP-FILE], [RELEASE-VERSION]) if ( echo $1 | grep -e '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then GST_PACKAGE_RELEASE_DATETIME=$1 else dnl we assume the .doap file contains the date as YYYY-MM-DD YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $3 $2`; if test "x$YYYY_MM_DD" != "x"; then GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD else AC_MSG_ERROR([SET_PACKAGE_RELEASE_DATETIME: could not extract release date for release version $3 from $2]) GST_PACKAGE_RELEASE_DATETIME="" fi fi dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD]) elif ( echo $1 | grep -e '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then GST_PACKAGE_RELEASE_DATETIME=$1 else AC_MSG_WARN([SET_PACKAGE_RELEASE_DATETIME: invalid first argument]) GST_PACKAGE_RELEASE_DATETIME="" fi if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then AC_MSG_WARN([Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME]) else AC_MSG_NOTICE([Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME]) AC_DEFINE_UNQUOTED([GST_PACKAGE_RELEASE_DATETIME], ["$GST_PACKAGE_RELEASE_DATETIME"], [GStreamer package release date/time for plugins as YYYY-MM-DD]) fi ]) dnl =========================================================================== dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO dnl dnl Usage: dnl dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([NANO-VERSION], [DOAP-FILE], [RELEASE-VERSION]) dnl if NANO-VERSION is 0, sets the release date to the release date associated dnl with version RELEASE-VERSION in the .doap file DOAP-FILE, otherwise sets dnl the release date and time to the current date/time. dnl dnl We need to treat pre-releases like git because there won't be an entry dnl in the .doap file for pre-releases yet, and we don't want to use the dnl date of the last release either. dnl =========================================================================== AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO], [ if test "x$1" = "x0"; then AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [ $2 ], [ $3 ]) else AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]) fi ]) gst-plugins-good-0.10.31/common/glib-gen.mak0000644000175000017500000000422511671200067015450 00000000000000# these are the variables your Makefile.am should set # the example is based on the colorbalance interface #glib_enum_headers=$(colorbalance_headers) #glib_enum_define=GST_COLOR_BALANCE #glib_enum_prefix=gst_color_balance enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") # these are all the rules generating the relevant files %-marshal.h: %-marshal.list $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_enum_prefix)_marshal $^ > $*-marshal.h.tmp && \ mv $*-marshal.h.tmp $*-marshal.h %-marshal.c: %-marshal.list $(AM_V_GEN)echo "#include \"$*-marshal.h\"" >> $*-marshal.c.tmp && \ glib-genmarshal --body --prefix=$(glib_enum_prefix)_marshal $^ >> $*-marshal.c.tmp && \ mv $*-marshal.c.tmp $*-marshal.c %-enumtypes.h: $(glib_enum_headers) $(AM_V_GEN)glib-mkenums \ --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ --fprod "\n/* enumerations from \"@filename@\" */\n" \ --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ $^ > $@ %-enumtypes.c: $(glib_enum_headers) @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi $(AM_V_GEN)glib-mkenums \ --fhead "#include \"$*-enumtypes.h\"\n$(enum_headers)" \ --fprod "\n/* enumerations from \"@filename@\" */" \ --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ $^ > $@ # a hack rule to make sure .Plo files exist because they get include'd # from Makefile's .deps/%-marshal.Plo: @touch $@ .deps/%-enumtypes.Plo: @touch $@ gst-plugins-good-0.10.31/common/gst-glib-gen.mak0000644000175000017500000000470611671200067016247 00000000000000# these are the variables your Makefile.am should set # the example is based on the colorbalance interface #glib_enum_headers=$(colorbalance_headers) #glib_enum_define=GST_COLOR_BALANCE #glib_gen_prefix=gst_color_balance #glib_gen_basename=colorbalance enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") # these are all the rules generating the relevant files $(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h $(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c $(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) $(AM_V_GEN)glib-mkenums \ --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ --fprod "\n/* enumerations from \"@filename@\" */\n" \ --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ $^ > $@ $(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi $(AM_V_GEN)glib-mkenums \ --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ --fprod "\n/* enumerations from \"@filename@\" */" \ --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ $^ > $@ # a hack rule to make sure .Plo files exist because they get include'd # from Makefile's .deps/%-marshal.Plo: @touch $@ .deps/%-enumtypes.Plo: @touch $@ gst-plugins-good-0.10.31/config.sub0000755000175000017500000010460611720560223013767 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011 Free Software Foundation, Inc. timestamp='2011-03-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile-* | tilegx-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; # This must be matched before tile*. tilegx*) basic_machine=tilegx-unknown os=-linux-gnu ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gst-plugins-good-0.10.31/autogen.sh0000755000175000017500000000720211671175352014011 00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. DIE=0 package=gst-plugins-good srcfile=gst/law/alaw.c # Make sure we have common if test ! -f common/gst-autogen.sh; then echo "+ Setting up common submodule" git submodule init fi git submodule update # source helper functions if test ! -f common/gst-autogen.sh; then echo There is something wrong with your source tree. echo You are missing common/gst-autogen.sh exit 1 fi . common/gst-autogen.sh # install pre-commit hook for doing clean commits if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \); then rm -f .git/hooks/pre-commit ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit fi CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' autogen_options $@ printf "+ check for build tools" if test ! -z "$NOCHECK"; then echo " skipped"; else echo; fi version_check "autoconf" "$AUTOCONF autoconf autoconf270 autoconf269 autoconf268 autoconf267 autoconf266 autoconf265 autoconf264 autoconf263 autoconf262 autoconf261 autoconf260" \ "ftp://ftp.gnu.org/pub/gnu/autoconf/" 2 60 || DIE=1 version_check "automake" "$AUTOMAKE automake automake-1.11 automake-1.10" \ "ftp://ftp.gnu.org/pub/gnu/automake/" 1 10 || DIE=1 version_check "autopoint" "autopoint" \ "ftp://ftp.gnu.org/pub/gnu/gettext/" 0 17 || DIE=1 version_check "libtoolize" "$LIBTOOLIZE libtoolize glibtoolize" \ "ftp://ftp.gnu.org/pub/gnu/libtool/" 1 5 0 || DIE=1 version_check "pkg-config" "" \ "http://www.freedesktop.org/software/pkgconfig" 0 8 0 || DIE=1 die_check $DIE aclocal_check || DIE=1 autoheader_check || DIE=1 die_check $DIE # if no arguments specified then this will be printed if test -z "$*"; then echo "+ checking for autogen.sh options" echo " This autogen script will automatically run ./configure as:" echo " ./configure $CONFIGURE_DEF_OPT" echo " To pass any additional options, please specify them on the $0" echo " command line." fi toplevel_check $srcfile # autopoint # older autopoint (< 0.12) has a tendency to complain about mkinstalldirs if test -x mkinstalldirs; then rm mkinstalldirs; fi # first remove patch if necessary, then run autopoint, then reapply if test -f po/Makefile.in.in; then patch -p0 -R < common/gettext.patch fi tool_run "$autopoint --force" patch -p0 < common/gettext.patch tool_run "$libtoolize" "--copy --force" tool_run "$aclocal" "-I m4 -I common/m4 $ACLOCAL_FLAGS" tool_run "$autoheader" # touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode echo timestamp > stamp-h.in 2> /dev/null tool_run "$autoconf" tool_run "$automake" "-a -c" # if enable exists, add an -enable option for each of the lines in that file if test -f enable; then for a in `cat enable`; do CONFIGURE_FILE_OPT="--enable-$a" done fi # if disable exists, add an -disable option for each of the lines in that file if test -f disable; then for a in `cat disable`; do CONFIGURE_FILE_OPT="$CONFIGURE_FILE_OPT --disable-$a" done fi test -n "$NOCONFIGURE" && { echo "+ skipping configure stage for package $package, as requested." echo "+ autogen.sh done." exit 0 } echo "+ running configure ... " test ! -z "$CONFIGURE_DEF_OPT" && echo " ./configure default flags: $CONFIGURE_DEF_OPT" test ! -z "$CONFIGURE_EXT_OPT" && echo " ./configure external flags: $CONFIGURE_EXT_OPT" test ! -z "$CONFIGURE_FILE_OPT" && echo " ./configure enable/disable flags: $CONFIGURE_FILE_OPT" echo ./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT $CONFIGURE_FILE_OPT || { echo " configure failed" exit 1 } echo "Now type 'make' to compile $package." gst-plugins-good-0.10.31/sys/0000755000175000017500000000000011720565316012703 500000000000000gst-plugins-good-0.10.31/sys/waveform/0000755000175000017500000000000011720565321014525 500000000000000gst-plugins-good-0.10.31/sys/waveform/Makefile.am0000644000175000017500000000145311671175354016514 00000000000000plugin_LTLIBRARIES = libgstwaveformsink.la # FIXME: Replace DIRECTSOUND CFLAGS+LIBS with waveform related ones and fix # the configure.ac + sys/Makefile.am to get this stuff building in MingW # For now, it's just disted for use in the VS builds. libgstwaveformsink_la_SOURCES = gstwaveformsink.c gstwaveformplugin.c libgstwaveformsink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTSOUND_CFLAGS) libgstwaveformsink_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(DIRECTSOUND_LIBS) libgstwaveformsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) libgstwaveformsink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstwaveformsink.h gst-plugins-good-0.10.31/sys/waveform/gstwaveformsink.c0000644000175000017500000004615611705514260020055 00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * * gstwaveformsink.c: * * 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-waveformsink * * This element lets you output sound using the Windows WaveForm API. * * Note that you should almost always use generic audio conversion elements * like audioconvert and audioresample in front of an audiosink to make sure * your pipeline works under all circumstances (those conversion elements will * act in passthrough-mode if no conversion is necessary). * * * Example pipelines * |[ * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! waveformsink * ]| will output a sine wave (continuous beep sound) to your sound card (with * a very low volume as precaution). * |[ * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! waveformsink * ]| will play an Ogg/Vorbis audio file and output it. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstwaveformsink.h" GST_DEBUG_CATEGORY_STATIC (waveformsink_debug); static void gst_waveform_sink_base_init (gpointer g_class); static void gst_waveform_sink_class_init (GstWaveFormSinkClass * klass); static void gst_waveform_sink_init (GstWaveFormSink * wfsink, GstWaveFormSinkClass * g_class); static void gst_waveform_sink_finalise (GObject * object); static void gst_waveform_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_waveform_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_waveform_sink_getcaps (GstBaseSink * bsink); /************************************************************************/ /* GstAudioSink functions */ /************************************************************************/ static gboolean gst_waveform_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); static gboolean gst_waveform_sink_unprepare (GstAudioSink * asink); static gboolean gst_waveform_sink_open (GstAudioSink * asink); static gboolean gst_waveform_sink_close (GstAudioSink * asink); static guint gst_waveform_sink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_waveform_sink_delay (GstAudioSink * asink); static void gst_waveform_sink_reset (GstAudioSink * asink); /************************************************************************/ /* Utils */ /************************************************************************/ GstCaps *gst_waveform_sink_create_caps (gint rate, gint channels, gint bits_per_sample); WAVEHDR *bufferpool_get_buffer (GstWaveFormSink * wfsink, gpointer data, guint length); void CALLBACK waveOutProc (HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2); static GstStaticPadTemplate waveformsink_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " "audio/x-raw-int, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]")); GST_BOILERPLATE (GstWaveFormSink, gst_waveform_sink, GstAudioSink, GST_TYPE_AUDIO_SINK); static void gst_waveform_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "WaveForm Audio Sink", "Sink/Audio", "Output to a sound card via WaveForm API", "Sebastien Moutte "); gst_element_class_add_static_pad_template (element_class, &waveformsink_sink_factory); } static void gst_waveform_sink_class_init (GstWaveFormSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; GstBaseAudioSinkClass *gstbaseaudiosink_class; GstAudioSinkClass *gstaudiosink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; gstaudiosink_class = (GstAudioSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_waveform_sink_finalise; gobject_class->get_property = gst_waveform_sink_get_property; gobject_class->set_property = gst_waveform_sink_set_property; gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_waveform_sink_getcaps); gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_waveform_sink_prepare); gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_waveform_sink_unprepare); gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_waveform_sink_open); gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_waveform_sink_close); gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_waveform_sink_write); gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_waveform_sink_delay); gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_waveform_sink_reset); GST_DEBUG_CATEGORY_INIT (waveformsink_debug, "waveformsink", 0, "Waveform sink"); } static void gst_waveform_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_waveform_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_waveform_sink_init (GstWaveFormSink * wfsink, GstWaveFormSinkClass * g_class) { /* initialize members */ wfsink->hwaveout = NULL; wfsink->cached_caps = NULL; wfsink->wave_buffers = NULL; wfsink->write_buffer = 0; wfsink->buffer_count = BUFFER_COUNT; wfsink->buffer_size = BUFFER_SIZE; wfsink->free_buffers_count = wfsink->buffer_count; wfsink->bytes_in_queue = 0; InitializeCriticalSection (&wfsink->critic_wave); } static void gst_waveform_sink_finalise (GObject * object) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (object); if (wfsink->cached_caps) { gst_caps_unref (wfsink->cached_caps); wfsink->cached_caps = NULL; } DeleteCriticalSection (&wfsink->critic_wave); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_waveform_sink_getcaps (GstBaseSink * bsink) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (bsink); MMRESULT mmresult; WAVEOUTCAPS wocaps; GstCaps *caps, *caps_temp; /* return the cached caps if already defined */ if (wfsink->cached_caps) { return gst_caps_ref (wfsink->cached_caps); } /* get the default device caps */ mmresult = waveOutGetDevCaps (WAVE_MAPPER, &wocaps, sizeof (wocaps)); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_ELEMENT_ERROR (wfsink, RESOURCE, SETTINGS, ("gst_waveform_sink_getcaps: waveOutGetDevCaps failed error=>%s", wfsink->error_string), (NULL)); return NULL; } caps = gst_caps_new_empty (); /* create a caps for all wave formats supported by the device starting by the best quality format */ if (wocaps.dwFormats & WAVE_FORMAT_96S16) { caps_temp = gst_waveform_sink_create_caps (96000, 2, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_96S08) { caps_temp = gst_waveform_sink_create_caps (96000, 2, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_96M16) { caps_temp = gst_waveform_sink_create_caps (96000, 1, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_96M08) { caps_temp = gst_waveform_sink_create_caps (96000, 1, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_4S16) { caps_temp = gst_waveform_sink_create_caps (44100, 2, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_4S08) { caps_temp = gst_waveform_sink_create_caps (44100, 2, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_4M16) { caps_temp = gst_waveform_sink_create_caps (44100, 1, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_4M08) { caps_temp = gst_waveform_sink_create_caps (44100, 1, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_2S16) { caps_temp = gst_waveform_sink_create_caps (22050, 2, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_2S08) { caps_temp = gst_waveform_sink_create_caps (22050, 2, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_2M16) { caps_temp = gst_waveform_sink_create_caps (22050, 1, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_2M08) { caps_temp = gst_waveform_sink_create_caps (22050, 1, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_1S16) { caps_temp = gst_waveform_sink_create_caps (11025, 2, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_1S08) { caps_temp = gst_waveform_sink_create_caps (11025, 2, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_1M16) { caps_temp = gst_waveform_sink_create_caps (11025, 1, 16); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (wocaps.dwFormats & WAVE_FORMAT_1M08) { caps_temp = gst_waveform_sink_create_caps (11025, 1, 8); if (caps_temp) { gst_caps_append (caps, caps_temp); } } if (gst_caps_is_empty (caps)) { gst_caps_unref (caps); caps = NULL; } else { wfsink->cached_caps = gst_caps_ref (caps); } GST_CAT_LOG_OBJECT (waveformsink_debug, wfsink, "Returning caps %s", gst_caps_to_string (caps)); return caps; } static gboolean gst_waveform_sink_open (GstAudioSink * asink) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); /* nothing to do here as the device needs to be opened with the format we will use */ return TRUE; } static gboolean gst_waveform_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); WAVEFORMATEX wfx; MMRESULT mmresult; guint index; /* setup waveformex struture with the input ringbuffer specs */ memset (&wfx, 0, sizeof (wfx)); wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = spec->channels; wfx.nSamplesPerSec = spec->rate; wfx.wBitsPerSample = (spec->bytes_per_sample * 8) / wfx.nChannels; wfx.nBlockAlign = spec->bytes_per_sample; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; /* save bytes per sample to use it in delay */ wfsink->bytes_per_sample = spec->bytes_per_sample; /* open the default audio device with the given caps */ mmresult = waveOutOpen (&wfsink->hwaveout, WAVE_MAPPER, &wfx, (DWORD_PTR) waveOutProc, (DWORD_PTR) wfsink, CALLBACK_FUNCTION); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_ELEMENT_ERROR (wfsink, RESOURCE, OPEN_WRITE, ("gst_waveform_sink_prepare: waveOutOpen failed error=>%s", wfsink->error_string), (NULL)); return FALSE; } /* evaluate the buffer size and the number of buffers needed */ wfsink->free_buffers_count = wfsink->buffer_count; /* allocate wave buffers */ wfsink->wave_buffers = (WAVEHDR *) g_new0 (WAVEHDR, wfsink->buffer_count); if (!wfsink->wave_buffers) { GST_ELEMENT_ERROR (wfsink, RESOURCE, OPEN_WRITE, ("gst_waveform_sink_prepare: Failed to allocate wave buffer headers (buffer count=%d)", wfsink->buffer_count), (NULL)); return FALSE; } memset (wfsink->wave_buffers, 0, sizeof (WAVEHDR) * wfsink->buffer_count); /* setup headers */ for (index = 0; index < wfsink->buffer_count; index++) { wfsink->wave_buffers[index].dwBufferLength = wfsink->buffer_size; wfsink->wave_buffers[index].lpData = g_new0 (gchar, wfsink->buffer_size); } return TRUE; } static gboolean gst_waveform_sink_unprepare (GstAudioSink * asink) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); /* free wave buffers */ if (wfsink->wave_buffers) { guint index; for (index = 0; index < wfsink->buffer_count; index++) { if (wfsink->wave_buffers[index].dwFlags & WHDR_PREPARED) { MMRESULT mmresult = waveOutUnprepareHeader (wfsink->hwaveout, &wfsink->wave_buffers[index], sizeof (WAVEHDR)); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, "gst_waveform_sink_unprepare: Error unpreparing buffer => %s", wfsink->error_string); } } g_free (wfsink->wave_buffers[index].lpData); } g_free (wfsink->wave_buffers); wfsink->wave_buffers = NULL; } /* close waveform-audio output device */ if (wfsink->hwaveout) { waveOutClose (wfsink->hwaveout); wfsink->hwaveout = NULL; } return TRUE; } static gboolean gst_waveform_sink_close (GstAudioSink * asink) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); return TRUE; } static guint gst_waveform_sink_write (GstAudioSink * asink, gpointer data, guint length) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); WAVEHDR *waveheader; MMRESULT mmresult; guint bytes_to_write = length; guint remaining_length = length; wfsink->bytes_in_queue += length; while (remaining_length > 0) { if (wfsink->free_buffers_count == 0) { /* no free buffer available, wait for one */ Sleep (10); continue; } /* get the current write buffer header */ waveheader = &wfsink->wave_buffers[wfsink->write_buffer]; /* unprepare the header if needed */ if (waveheader->dwFlags & WHDR_PREPARED) { mmresult = waveOutUnprepareHeader (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, "Error unpreparing buffer => %s", wfsink->error_string); } } if (wfsink->buffer_size - waveheader->dwUser >= remaining_length) bytes_to_write = remaining_length; else bytes_to_write = wfsink->buffer_size - waveheader->dwUser; memcpy (waveheader->lpData + waveheader->dwUser, data, bytes_to_write); waveheader->dwUser += bytes_to_write; remaining_length -= bytes_to_write; data = (guint8 *) data + bytes_to_write; if (waveheader->dwUser == wfsink->buffer_size) { /* we have filled a buffer, let's prepare it and next write it to the device */ mmresult = waveOutPrepareHeader (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, "gst_waveform_sink_write: Error preparing header => %s", wfsink->error_string); } mmresult = waveOutWrite (wfsink->hwaveout, waveheader, sizeof (WAVEHDR)); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, "gst_waveform_sink_write: Error writting buffer to the device => %s", wfsink->error_string); } EnterCriticalSection (&wfsink->critic_wave); wfsink->free_buffers_count--; LeaveCriticalSection (&wfsink->critic_wave); wfsink->write_buffer++; wfsink->write_buffer %= wfsink->buffer_count; waveheader->dwUser = 0; wfsink->bytes_in_queue = 0; GST_CAT_LOG_OBJECT (waveformsink_debug, wfsink, "gst_waveform_sink_write: Writting a buffer to the device (free buffers remaining=%d, write buffer=%d)", wfsink->free_buffers_count, wfsink->write_buffer); } } return length; } static guint gst_waveform_sink_delay (GstAudioSink * asink) { /* return the number of samples in queue (device+internal queue) */ GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); guint bytes_in_device = (wfsink->buffer_count - wfsink->free_buffers_count) * wfsink->buffer_size; guint delay = (bytes_in_device + wfsink->bytes_in_queue) / wfsink->bytes_per_sample; return delay; } static void gst_waveform_sink_reset (GstAudioSink * asink) { GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink); MMRESULT mmresult = waveOutReset (wfsink->hwaveout); if (mmresult != MMSYSERR_NOERROR) { waveOutGetErrorText (mmresult, wfsink->error_string, ERROR_LENGTH - 1); GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink, "gst_waveform_sink_reset: Error reseting waveform-audio device => %s", wfsink->error_string); } } GstCaps * gst_waveform_sink_create_caps (gint rate, gint channels, gint bits_per_sample) { GstCaps *caps = NULL; caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, bits_per_sample, "depth", G_TYPE_INT, bits_per_sample, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); return caps; } void CALLBACK waveOutProc (HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { GstWaveFormSink *wfsink = (GstWaveFormSink *) dwInstance; if (uMsg == WOM_DONE) { EnterCriticalSection (&wfsink->critic_wave); wfsink->free_buffers_count++; LeaveCriticalSection (&wfsink->critic_wave); } } gst-plugins-good-0.10.31/sys/waveform/gstwaveformsink.h0000644000175000017500000000637311705514260020057 00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * * gstwaveformsink.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_WAVEFORMSINK_H__ #define __GST_WAVEFORMSINK_H__ #include #include #include #include #ifndef WAVE_FORMAT_96M08 #define WAVE_FORMAT_96M08 0x00001000 /* 96 kHz, Mono, 8-bit */ #endif #ifndef WAVE_FORMAT_96S08 #define WAVE_FORMAT_96S08 0x00002000 /* 96 kHz, Stereo, 8-bit */ #endif #ifndef WAVE_FORMAT_96M16 #define WAVE_FORMAT_96M16 0x00004000 /* 96 kHz, Mono, 16-bit */ #endif #ifndef WAVE_FORMAT_96S16 #define WAVE_FORMAT_96S16 0x00008000 /* 96 kHz, Stereo, 16-bit */ #endif #define ERROR_LENGTH MAXERRORLENGTH+50 #define BUFFER_COUNT 20 #define BUFFER_SIZE 8192 G_BEGIN_DECLS #define GST_TYPE_WAVEFORM_SINK (gst_waveform_sink_get_type()) #define GST_WAVEFORM_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVEFORM_SINK,GstWaveFormSink)) #define GST_WAVEFORM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVEFORM_SINK,GstWaveFormSinkClass)) #define GST_IS_WAVEFORM_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVEFORM_SINK)) #define GST_IS_WAVEFORM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVEFORM_SINK)) typedef struct _GstWaveFormSink GstWaveFormSink; typedef struct _GstWaveFormSinkClass GstWaveFormSinkClass; struct _GstWaveFormSink { /* parent object */ GstAudioSink sink; /* supported caps */ GstCaps *cached_caps; /* handle to the waveform-audio output device */ HWAVEOUT hwaveout; /* table of buffer headers */ WAVEHDR *wave_buffers; /* critical section protecting access to the number of free buffers */ CRITICAL_SECTION critic_wave; /* number of free buffers available */ guint free_buffers_count; /* current free buffer where you have to write incoming data */ guint write_buffer; /* size of buffers streamed to the device */ guint buffer_size; /* number of buffers streamed to the device */ guint buffer_count; /* total of bytes in queue before they are written to the device */ guint bytes_in_queue; /* bytes per sample from setcaps used to evaluate the number samples returned by delay */ guint bytes_per_sample; /* wave form error string */ gchar error_string[ERROR_LENGTH]; }; struct _GstWaveFormSinkClass { GstAudioSinkClass parent_class; }; GType gst_waveform_sink_get_type (void); G_END_DECLS #endif /* __GST_WAVEFORMSINK_H__ */ gst-plugins-good-0.10.31/sys/waveform/gstwaveformplugin.c0000644000175000017500000000240711671175354020407 00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * * gstwaveformplugin.c: * * 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 "gstwaveformsink.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "waveformsink", GST_RANK_PRIMARY, GST_TYPE_WAVEFORM_SINK)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "waveform", "WaveForm win32 API plugin", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/waveform/Makefile.in0000644000175000017500000007161211720560241016515 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/waveform DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstwaveformsink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstwaveformsink_la_OBJECTS = \ libgstwaveformsink_la-gstwaveformsink.lo \ libgstwaveformsink_la-gstwaveformplugin.lo libgstwaveformsink_la_OBJECTS = $(am_libgstwaveformsink_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstwaveformsink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) \ $(libgstwaveformsink_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstwaveformsink_la_SOURCES) DIST_SOURCES = $(libgstwaveformsink_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstwaveformsink.la # FIXME: Replace DIRECTSOUND CFLAGS+LIBS with waveform related ones and fix # the configure.ac + sys/Makefile.am to get this stuff building in MingW # For now, it's just disted for use in the VS builds. libgstwaveformsink_la_SOURCES = gstwaveformsink.c gstwaveformplugin.c libgstwaveformsink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTSOUND_CFLAGS) libgstwaveformsink_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(DIRECTSOUND_LIBS) libgstwaveformsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) libgstwaveformsink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstwaveformsink.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/waveform/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/waveform/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstwaveformsink.la: $(libgstwaveformsink_la_OBJECTS) $(libgstwaveformsink_la_DEPENDENCIES) $(EXTRA_libgstwaveformsink_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstwaveformsink_la_LINK) -rpath $(plugindir) $(libgstwaveformsink_la_OBJECTS) $(libgstwaveformsink_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstwaveformsink_la-gstwaveformsink.lo: gstwaveformsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -MT libgstwaveformsink_la-gstwaveformsink.lo -MD -MP -MF $(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Tpo -c -o libgstwaveformsink_la-gstwaveformsink.lo `test -f 'gstwaveformsink.c' || echo '$(srcdir)/'`gstwaveformsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Tpo $(DEPDIR)/libgstwaveformsink_la-gstwaveformsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwaveformsink.c' object='libgstwaveformsink_la-gstwaveformsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaveformsink_la-gstwaveformsink.lo `test -f 'gstwaveformsink.c' || echo '$(srcdir)/'`gstwaveformsink.c libgstwaveformsink_la-gstwaveformplugin.lo: gstwaveformplugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -MT libgstwaveformsink_la-gstwaveformplugin.lo -MD -MP -MF $(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Tpo -c -o libgstwaveformsink_la-gstwaveformplugin.lo `test -f 'gstwaveformplugin.c' || echo '$(srcdir)/'`gstwaveformplugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Tpo $(DEPDIR)/libgstwaveformsink_la-gstwaveformplugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwaveformplugin.c' object='libgstwaveformsink_la-gstwaveformplugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwaveformsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwaveformsink_la_CFLAGS) $(CFLAGS) -c -o libgstwaveformsink_la-gstwaveformplugin.lo `test -f 'gstwaveformplugin.c' || echo '$(srcdir)/'`gstwaveformplugin.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/sunaudio/0000755000175000017500000000000011720565320014525 500000000000000gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixeroptions.c0000644000175000017500000001104211671175354021646 00000000000000/* * GStreamer SunAudio mixer track implementation * Copyright (C) 2009 Sun Microsystems, Inc., * Brian Cameron * Garrett D'Amore * * gstsunaudiomixeroptions.c: Sun Audio mixer options object * * 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 #include #include #include #include #include #include #include #include #include #include "gstsunaudiomixeroptions.h" #include "gstsunaudiomixertrack.h" GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); #define GST_CAT_DEFAULT sunaudio_debug static void gst_sunaudiomixer_options_init (GstSunAudioMixerOptions * sun_opts); static void gst_sunaudiomixer_options_class_init (gpointer g_class, gpointer class_data); static GstMixerOptionsClass *parent_class = NULL; GType gst_sunaudiomixer_options_get_type (void) { static GType opts_type = 0; if (!opts_type) { static const GTypeInfo opts_info = { sizeof (GstSunAudioMixerOptionsClass), NULL, NULL, gst_sunaudiomixer_options_class_init, NULL, NULL, sizeof (GstSunAudioMixerOptions), 0, (GInstanceInitFunc) gst_sunaudiomixer_options_init, }; opts_type = g_type_register_static (GST_TYPE_MIXER_OPTIONS, "GstSunAudioMixerOptions", &opts_info, 0); } return opts_type; } static void gst_sunaudiomixer_options_class_init (gpointer g_class, gpointer class_data) { parent_class = g_type_class_peek_parent (g_class); } static void gst_sunaudiomixer_options_init (GstSunAudioMixerOptions * sun_opts) { } GstMixerOptions * gst_sunaudiomixer_options_new (GstSunAudioMixerCtrl * mixer, gint track_num) { GstMixerOptions *opts; GstSunAudioMixerOptions *sun_opts; GstMixerTrack *track; const gchar *label; gint i; struct audio_info audioinfo; if ((mixer == NULL) || (mixer->mixer_fd == -1)) { g_warning ("mixer not initialized"); return NULL; } if (track_num != GST_SUNAUDIO_TRACK_RECSRC) { g_warning ("invalid options track"); return (NULL); } label = N_("Record Source"); opts = g_object_new (GST_TYPE_SUNAUDIO_MIXER_OPTIONS, "untranslated-label", label, NULL); sun_opts = GST_SUNAUDIO_MIXER_OPTIONS (opts); track = GST_MIXER_TRACK (opts); GST_DEBUG_OBJECT (opts, "New mixer options, track %d: %s", track_num, GST_STR_NULL (label)); /* save off names for the record sources */ sun_opts->names[0] = g_quark_from_string (_("Microphone")); sun_opts->names[1] = g_quark_from_string (_("Line In")); sun_opts->names[2] = g_quark_from_string (_("Internal CD")); sun_opts->names[3] = g_quark_from_string (_("SPDIF In")); sun_opts->names[4] = g_quark_from_string (_("AUX 1 In")); sun_opts->names[5] = g_quark_from_string (_("AUX 2 In")); sun_opts->names[6] = g_quark_from_string (_("Codec Loopback")); sun_opts->names[7] = g_quark_from_string (_("SunVTS Loopback")); /* set basic information */ track->label = g_strdup (_(label)); track->num_channels = 0; track->min_volume = 0; track->max_volume = 0; track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_WHITELIST | GST_MIXER_TRACK_NO_RECORD; if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { g_warning ("Error getting audio device settings"); g_object_unref (G_OBJECT (sun_opts)); return NULL; } sun_opts->avail = audioinfo.record.avail_ports; sun_opts->track_num = track_num; for (i = 0; i < 8; i++) { if ((1 << i) & audioinfo.record.avail_ports) { const char *s = g_quark_to_string (sun_opts->names[i]); opts->values = g_list_append (opts->values, g_strdup (s)); GST_DEBUG_OBJECT (opts, "option for track %d: %s", track_num, GST_STR_NULL (s)); } } return opts; } gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiosink.c0000644000175000017500000004643111677341660020065 00000000000000/* * GStreamer - SunAudio sink * Copyright (C) 2004 David A. Schleef * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * Copyright (C) 2006 Jan Schmidt * * 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-sunaudiosink * * sunaudiosink is an audio sink designed to work with the Sun Audio * interface available in Solaris. * * * Example launch line * |[ * gst-launch audiotestsrc volume=0.5 ! sunaudiosink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "gstsunaudiosink.h" GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); #define GST_CAT_DEFAULT sunaudio_debug static void gst_sunaudiosink_base_init (gpointer g_class); static void gst_sunaudiosink_class_init (GstSunAudioSinkClass * klass); static void gst_sunaudiosink_init (GstSunAudioSink * filter); static void gst_sunaudiosink_dispose (GObject * object); static void gst_sunaudiosink_finalize (GObject * object); static void gst_sunaudiosink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_sunaudiosink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_sunaudiosink_getcaps (GstBaseSink * bsink); static gboolean gst_sunaudiosink_open (GstAudioSink * asink); static gboolean gst_sunaudiosink_close (GstAudioSink * asink); static gboolean gst_sunaudiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); static gboolean gst_sunaudiosink_unprepare (GstAudioSink * asink); static guint gst_sunaudiosink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_sunaudiosink_delay (GstAudioSink * asink); static void gst_sunaudiosink_reset (GstAudioSink * asink); #define DEFAULT_DEVICE "/dev/audio" enum { PROP_0, PROP_DEVICE, }; static GstStaticPadTemplate gst_sunaudiosink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " /* [5510,48000] seems to be a Solaris limit */ "rate = (int) [ 5510, 48000 ], " "channels = (int) [ 1, 2 ]") ); static GstElementClass *parent_class = NULL; GType gst_sunaudiosink_get_type (void) { static GType plugin_type = 0; if (!plugin_type) { static const GTypeInfo plugin_info = { sizeof (GstSunAudioSinkClass), gst_sunaudiosink_base_init, NULL, (GClassInitFunc) gst_sunaudiosink_class_init, NULL, NULL, sizeof (GstSunAudioSink), 0, (GInstanceInitFunc) gst_sunaudiosink_init, }; plugin_type = g_type_register_static (GST_TYPE_AUDIO_SINK, "GstSunAudioSink", &plugin_info, 0); } return plugin_type; } static void gst_sunaudiosink_dispose (GObject * object) { G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_sunaudiosink_finalize (GObject * object) { GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (object); g_mutex_free (sunaudiosink->write_mutex); g_cond_free (sunaudiosink->sleep_cond); g_free (sunaudiosink->device); if (sunaudiosink->fd != -1) { close (sunaudiosink->fd); sunaudiosink->fd = -1; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_sunaudiosink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_sunaudiosink_factory); gst_element_class_set_details_simple (element_class, "Sun Audio Sink", "Sink/Audio", "Audio sink for Sun Audio devices", "David A. Schleef , " "Brian Cameron "); } static void gst_sunaudiosink_class_init (GstSunAudioSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; GstBaseAudioSinkClass *gstbaseaudiosink_class; GstAudioSinkClass *gstaudiosink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; gstaudiosink_class = (GstAudioSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = gst_sunaudiosink_dispose; gobject_class->finalize = gst_sunaudiosink_finalize; gobject_class->set_property = gst_sunaudiosink_set_property; gobject_class->get_property = gst_sunaudiosink_get_property; gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_sunaudiosink_getcaps); gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_sunaudiosink_open); gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_sunaudiosink_close); gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_sunaudiosink_prepare); gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_sunaudiosink_unprepare); gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_sunaudiosink_write); gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_sunaudiosink_delay); gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_sunaudiosink_reset); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "Audio Device (/dev/audio)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_sunaudiosink_init (GstSunAudioSink * sunaudiosink) { const char *audiodev; GST_DEBUG_OBJECT (sunaudiosink, "initializing sunaudiosink"); sunaudiosink->fd = -1; audiodev = g_getenv ("AUDIODEV"); if (audiodev == NULL) audiodev = DEFAULT_DEVICE; sunaudiosink->device = g_strdup (audiodev); /* mutex and gcond used to control the write method */ sunaudiosink->write_mutex = g_mutex_new (); sunaudiosink->sleep_cond = g_cond_new (); } static void gst_sunaudiosink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSunAudioSink *sunaudiosink; sunaudiosink = GST_SUNAUDIO_SINK (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (sunaudiosink); g_free (sunaudiosink->device); sunaudiosink->device = g_strdup (g_value_get_string (value)); GST_OBJECT_UNLOCK (sunaudiosink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_sunaudiosink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSunAudioSink *sunaudiosink; sunaudiosink = GST_SUNAUDIO_SINK (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (sunaudiosink); g_value_set_string (value, sunaudiosink->device); GST_OBJECT_UNLOCK (sunaudiosink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_sunaudiosink_getcaps (GstBaseSink * bsink) { GstPadTemplate *pad_template; GstCaps *caps = NULL; GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (bsink); GST_DEBUG_OBJECT (sunaudiosink, "getcaps called"); pad_template = gst_static_pad_template_get (&gst_sunaudiosink_factory); caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); gst_object_unref (pad_template); return caps; } static gboolean gst_sunaudiosink_open (GstAudioSink * asink) { GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); int fd, ret; /* First try to open non-blocking */ GST_OBJECT_LOCK (sunaudiosink); fd = open (sunaudiosink->device, O_WRONLY | O_NONBLOCK); if (fd >= 0) { close (fd); fd = open (sunaudiosink->device, O_WRONLY); } if (fd == -1) { GST_OBJECT_UNLOCK (sunaudiosink); goto open_failed; } sunaudiosink->fd = fd; GST_OBJECT_UNLOCK (sunaudiosink); ret = ioctl (fd, AUDIO_GETDEV, &sunaudiosink->dev); if (ret == -1) goto ioctl_error; GST_DEBUG_OBJECT (sunaudiosink, "name %s", sunaudiosink->dev.name); GST_DEBUG_OBJECT (sunaudiosink, "version %s", sunaudiosink->dev.version); GST_DEBUG_OBJECT (sunaudiosink, "config %s", sunaudiosink->dev.config); ret = ioctl (fd, AUDIO_GETINFO, &sunaudiosink->info); if (ret == -1) goto ioctl_error; GST_DEBUG_OBJECT (sunaudiosink, "monitor_gain %d", sunaudiosink->info.monitor_gain); GST_DEBUG_OBJECT (sunaudiosink, "output_muted %d", sunaudiosink->info.output_muted); GST_DEBUG_OBJECT (sunaudiosink, "hw_features %08x", sunaudiosink->info.hw_features); GST_DEBUG_OBJECT (sunaudiosink, "sw_features %08x", sunaudiosink->info.sw_features); GST_DEBUG_OBJECT (sunaudiosink, "sw_features_enabled %08x", sunaudiosink->info.sw_features_enabled); return TRUE; open_failed: GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, OPEN_WRITE, (NULL), ("can't open connection to Sun Audio device %s", sunaudiosink->device)); return FALSE; ioctl_error: close (sunaudiosink->fd); GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } static gboolean gst_sunaudiosink_close (GstAudioSink * asink) { GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); if (sunaudiosink->fd != -1) { close (sunaudiosink->fd); sunaudiosink->fd = -1; } return TRUE; } static gboolean gst_sunaudiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) { GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); audio_info_t ainfo; int ret; int ports; ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } if (spec->width != 16) return FALSE; ports = ainfo.play.port; AUDIO_INITINFO (&ainfo); ainfo.play.sample_rate = spec->rate; ainfo.play.channels = spec->channels; ainfo.play.precision = spec->width; ainfo.play.encoding = AUDIO_ENCODING_LINEAR; ainfo.play.port = ports; /* buffer_time for playback is not implemented in Solaris at the moment, but at some point in the future, it might be */ ainfo.play.buffer_size = gst_util_uint64_scale (spec->rate * spec->bytes_per_sample, spec->buffer_time, GST_SECOND / GST_USECOND); spec->silence_sample[0] = 0; spec->silence_sample[1] = 0; spec->silence_sample[2] = 0; spec->silence_sample[3] = 0; ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } /* Now read back the info to find out the actual buffer size and set segtotal */ AUDIO_INITINFO (&ainfo); ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } #if 0 /* We don't actually use the buffer_size from the sound device, because * it seems it's just bogus sometimes */ sunaudiosink->segtotal = spec->segtotal = ainfo.play.buffer_size / spec->segsize; #else sunaudiosink->segtotal = spec->segtotal; #endif sunaudiosink->segtotal_samples = spec->segtotal * spec->segsize / spec->bytes_per_sample; sunaudiosink->segs_written = (gint) ainfo.play.eof; sunaudiosink->samples_written = ainfo.play.samples; sunaudiosink->bytes_per_sample = spec->bytes_per_sample; GST_DEBUG_OBJECT (sunaudiosink, "Got device buffer_size of %u", ainfo.play.buffer_size); return TRUE; } static gboolean gst_sunaudiosink_unprepare (GstAudioSink * asink) { return TRUE; } #define LOOP_WHILE_EINTR(v,func) do { (v) = (func); } \ while ((v) == -1 && errno == EINTR); /* Called with the write_mutex held */ static void gst_sunaudio_sink_do_delay (GstSunAudioSink * sink) { GstBaseAudioSink *ba_sink = GST_BASE_AUDIO_SINK (sink); GstClockTime total_sleep; GstClockTime max_sleep; gint sleep_usecs; GTimeVal sleep_end; gint err; audio_info_t ainfo; guint diff; /* This code below ensures that we don't race any further than buffer_time * ahead of the audio output, by sleeping if the next write call would cause * us to advance too far in the ring-buffer */ LOOP_WHILE_EINTR (err, ioctl (sink->fd, AUDIO_GETINFO, &ainfo)); if (err < 0) goto write_error; /* Compute our offset from the output (copes with overflow) */ diff = (guint) (sink->segs_written) - ainfo.play.eof; if (diff > sink->segtotal) { /* This implies that reset did a flush just as the sound device aquired * some buffers internally, and it causes us to be out of sync with the * eof measure. This corrects it */ sink->segs_written = ainfo.play.eof; diff = 0; } if (diff + 1 < sink->segtotal) return; /* no need to sleep at all */ /* Never sleep longer than the initial number of undrained segments in the device plus one */ total_sleep = 0; max_sleep = (diff + 1) * (ba_sink->latency_time * GST_USECOND); /* sleep for a segment period between .eof polls */ sleep_usecs = ba_sink->latency_time; /* Current time is our reference point */ g_get_current_time (&sleep_end); /* If the next segment would take us too far along the ring buffer, * sleep for a bit to free up a slot. If there were a way to find out * when the eof field actually increments, we could use, but the only * notification mechanism seems to be SIGPOLL, which we can't use from * a support library */ while (diff + 1 >= sink->segtotal && total_sleep < max_sleep) { GST_LOG_OBJECT (sink, "need to block to drain segment(s). " "Sleeping for %d us", sleep_usecs); g_time_val_add (&sleep_end, sleep_usecs); if (g_cond_timed_wait (sink->sleep_cond, sink->write_mutex, &sleep_end)) { GST_LOG_OBJECT (sink, "Waking up early due to reset"); return; /* Got told to wake up */ } total_sleep += (sleep_usecs * GST_USECOND); LOOP_WHILE_EINTR (err, ioctl (sink->fd, AUDIO_GETINFO, &ainfo)); if (err < 0) goto write_error; /* Compute our (new) offset from the output (copes with overflow) */ diff = (guint) g_atomic_int_get (&sink->segs_written) - ainfo.play.eof; } return; write_error: GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL), ("Playback error on device '%s': %s", sink->device, strerror (errno))); return; } static guint gst_sunaudiosink_write (GstAudioSink * asink, gpointer data, guint length) { GstSunAudioSink *sink = GST_SUNAUDIO_SINK (asink); gint bytes_written, err; g_mutex_lock (sink->write_mutex); if (sink->flushing) { /* Exit immediately if reset tells us to */ g_mutex_unlock (sink->write_mutex); return length; } LOOP_WHILE_EINTR (bytes_written, write (sink->fd, data, length)); if (bytes_written < 0) { err = bytes_written; goto write_error; } /* Increment our sample counter, for delay calcs */ g_atomic_int_add (&sink->samples_written, length / sink->bytes_per_sample); /* Don't consider the segment written if we didn't output the whole lot yet */ if (bytes_written < length) { g_mutex_unlock (sink->write_mutex); return (guint) bytes_written; } /* Write a zero length output to trigger increment of the eof field */ LOOP_WHILE_EINTR (err, write (sink->fd, NULL, 0)); if (err < 0) goto write_error; /* Count this extra segment we've written */ sink->segs_written += 1; /* Now delay so we don't overrun the ring buffer */ gst_sunaudio_sink_do_delay (sink); g_mutex_unlock (sink->write_mutex); return length; write_error: g_mutex_unlock (sink->write_mutex); GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL), ("Playback error on device '%s': %s", sink->device, strerror (errno))); return length; /* Say we wrote the segment to let the ringbuffer exit */ } /* * Provide the current number of unplayed samples that have been written * to the device */ static guint gst_sunaudiosink_delay (GstAudioSink * asink) { GstSunAudioSink *sink = GST_SUNAUDIO_SINK (asink); audio_info_t ainfo; gint ret; guint offset; ret = ioctl (sink->fd, AUDIO_GETINFO, &ainfo); if (G_UNLIKELY (ret == -1)) return 0; offset = (g_atomic_int_get (&sink->samples_written) - ainfo.play.samples); /* If the offset is larger than the total ringbuffer size, then we asked between the write call and when samples_written is updated */ if (G_UNLIKELY (offset > sink->segtotal_samples)) return 0; return offset; } static void gst_sunaudiosink_reset (GstAudioSink * asink) { /* Get current values */ GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink); audio_info_t ainfo; int ret; ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo); if (ret == -1) { /* * Should never happen, but if we couldn't getinfo, then no point * trying to setinfo */ GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return; } /* * Pause the audio - so audio stops playing immediately rather than * waiting for the ringbuffer to empty. */ ainfo.play.pause = !NULL; ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } /* Flush the audio */ ret = ioctl (sunaudiosink->fd, I_FLUSH, FLUSHW); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } /* Now, we take the write_mutex and signal to ensure the write thread * is not busy, and we signal the condition to wake up any sleeper, * then we flush again in case the write wrote something after we flushed, * and finally release the lock and unpause */ g_mutex_lock (sunaudiosink->write_mutex); sunaudiosink->flushing = TRUE; g_cond_signal (sunaudiosink->sleep_cond); ret = ioctl (sunaudiosink->fd, I_FLUSH, FLUSHW); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } /* unpause the audio */ ainfo.play.pause = NULL; ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } /* After flushing the audio device, we need to remeasure the sample count * and segments written count so we're in sync with the device */ sunaudiosink->segs_written = ainfo.play.eof; g_atomic_int_set (&sunaudiosink->samples_written, ainfo.play.samples); sunaudiosink->flushing = FALSE; g_mutex_unlock (sunaudiosink->write_mutex); } gst-plugins-good-0.10.31/sys/sunaudio/Makefile.am0000644000175000017500000000171011671175354016511 00000000000000plugin_LTLIBRARIES = libgstsunaudio.la libgstsunaudio_la_SOURCES = gstsunaudio.c \ gstsunaudiosink.c \ gstsunaudiomixerctrl.c \ gstsunaudiomixer.c \ gstsunaudiomixertrack.c \ gstsunaudiomixeroptions.c \ gstsunaudiosrc.c libgstsunaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstsunaudio_la_LIBADD = \ -lgstinterfaces-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_LIBS) libgstsunaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsunaudio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstsunaudiosink.h \ gstsunaudiomixer.h \ gstsunaudiomixerctrl.h \ gstsunaudiomixertrack.h \ gstsunaudiomixeroptions.h \ gstsunaudiosrc.h gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixerctrl.c0000644000175000017500000004011411671175354021121 00000000000000/* * GStreamer - SunAudio mixer interface element * Copyright (C) 2005,2006,2008,2009 Sun Microsystems, Inc., * Brian Cameron * Copyright (C) 2008 Sun Microsystems, Inc., * Jan Schmidt * Copyright (C) 2009 Sun Microsystems, Inc., * Garrett D'Amore * * 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 #include #include #include #include #include #include #include #include #include #include "gstsunaudiomixerctrl.h" #include "gstsunaudiomixertrack.h" #include "gstsunaudiomixeroptions.h" GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); #define GST_CAT_DEFAULT sunaudio_debug static gboolean gst_sunaudiomixer_ctrl_open (GstSunAudioMixerCtrl * mixer) { int fd; /* First try to open non-blocking */ fd = open (mixer->device, O_RDWR | O_NONBLOCK); if (fd >= 0) { close (fd); fd = open (mixer->device, O_WRONLY); } if (fd == -1) { GST_DEBUG_OBJECT (mixer, "Failed to open mixer device %s, mixing disabled: %s", mixer->device, strerror (errno)); return FALSE; } mixer->mixer_fd = fd; /* Try to set the multiple open flag if we can, but ignore errors */ ioctl (mixer->mixer_fd, AUDIO_MIXER_MULTIPLE_OPEN); GST_DEBUG_OBJECT (mixer, "Opened mixer device %s", mixer->device); return TRUE; } void gst_sunaudiomixer_ctrl_build_list (GstSunAudioMixerCtrl * mixer) { GstMixerTrack *track; GstMixerOptions *options; struct audio_info audioinfo; /* * Do not continue appending the same 3 static tracks onto the list */ if (mixer->tracklist == NULL) { g_return_if_fail (mixer->mixer_fd != -1); /* query available ports */ if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { g_warning ("Error getting audio device volume"); return; } /* Output & should be MASTER when it's the only one. */ track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_OUTPUT); mixer->tracklist = g_list_append (mixer->tracklist, track); /* Input */ track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_RECORD); mixer->tracklist = g_list_append (mixer->tracklist, track); /* Monitor */ track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_MONITOR); mixer->tracklist = g_list_append (mixer->tracklist, track); if (audioinfo.play.avail_ports & AUDIO_SPEAKER) { track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_SPEAKER); mixer->tracklist = g_list_append (mixer->tracklist, track); } if (audioinfo.play.avail_ports & AUDIO_HEADPHONE) { track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_HP); mixer->tracklist = g_list_append (mixer->tracklist, track); } if (audioinfo.play.avail_ports & AUDIO_LINE_OUT) { track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_LINEOUT); mixer->tracklist = g_list_append (mixer->tracklist, track); } if (audioinfo.play.avail_ports & AUDIO_SPDIF_OUT) { track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_SPDIFOUT); mixer->tracklist = g_list_append (mixer->tracklist, track); } if (audioinfo.play.avail_ports & AUDIO_AUX1_OUT) { track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_AUX1OUT); mixer->tracklist = g_list_append (mixer->tracklist, track); } if (audioinfo.play.avail_ports & AUDIO_AUX2_OUT) { track = gst_sunaudiomixer_track_new (GST_SUNAUDIO_TRACK_AUX2OUT); mixer->tracklist = g_list_append (mixer->tracklist, track); } if (audioinfo.record.avail_ports != AUDIO_NONE) { options = gst_sunaudiomixer_options_new (mixer, GST_SUNAUDIO_TRACK_RECSRC); mixer->tracklist = g_list_append (mixer->tracklist, options); } } } GstSunAudioMixerCtrl * gst_sunaudiomixer_ctrl_new (const char *device) { GstSunAudioMixerCtrl *ret = NULL; g_return_val_if_fail (device != NULL, NULL); ret = g_new0 (GstSunAudioMixerCtrl, 1); ret->device = g_strdup (device); ret->mixer_fd = -1; ret->tracklist = NULL; if (!gst_sunaudiomixer_ctrl_open (ret)) goto error; return ret; error: if (ret) gst_sunaudiomixer_ctrl_free (ret); return NULL; } void gst_sunaudiomixer_ctrl_free (GstSunAudioMixerCtrl * mixer) { g_return_if_fail (mixer != NULL); if (mixer->device) { g_free (mixer->device); mixer->device = NULL; } if (mixer->tracklist) { g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL); g_list_free (mixer->tracklist); mixer->tracklist = NULL; } if (mixer->mixer_fd != -1) { close (mixer->mixer_fd); mixer->mixer_fd = -1; } g_free (mixer); } GstMixerFlags gst_sunaudiomixer_ctrl_get_mixer_flags (GstSunAudioMixerCtrl * mixer) { return GST_MIXER_FLAG_HAS_WHITELIST | GST_MIXER_FLAG_GROUPING; } const GList * gst_sunaudiomixer_ctrl_list_tracks (GstSunAudioMixerCtrl * mixer) { gst_sunaudiomixer_ctrl_build_list (mixer); return (const GList *) mixer->tracklist; } void gst_sunaudiomixer_ctrl_get_volume (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gint * volumes) { gint gain, balance; float ratio; struct audio_info audioinfo; GstSunAudioMixerTrack *sunaudiotrack; g_return_if_fail (GST_IS_SUNAUDIO_MIXER_TRACK (track)); sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track); g_return_if_fail (mixer->mixer_fd != -1); if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { g_warning ("Error getting audio device volume"); return; } balance = AUDIO_MID_BALANCE; gain = 0; switch (sunaudiotrack->track_num) { case GST_SUNAUDIO_TRACK_OUTPUT: gain = (int) audioinfo.play.gain; balance = audioinfo.play.balance; break; case GST_SUNAUDIO_TRACK_RECORD: gain = (int) audioinfo.record.gain; balance = audioinfo.record.balance; break; case GST_SUNAUDIO_TRACK_MONITOR: gain = (int) audioinfo.monitor_gain; balance = audioinfo.record.balance; break; case GST_SUNAUDIO_TRACK_SPEAKER: if (audioinfo.play.port & AUDIO_SPEAKER) gain = AUDIO_MAX_GAIN; break; case GST_SUNAUDIO_TRACK_HP: if (audioinfo.play.port & AUDIO_HEADPHONE) gain = AUDIO_MAX_GAIN; break; case GST_SUNAUDIO_TRACK_LINEOUT: if (audioinfo.play.port & AUDIO_LINE_OUT) gain = AUDIO_MAX_GAIN; break; case GST_SUNAUDIO_TRACK_SPDIFOUT: if (audioinfo.play.port & AUDIO_SPDIF_OUT) gain = AUDIO_MAX_GAIN; break; case GST_SUNAUDIO_TRACK_AUX1OUT: if (audioinfo.play.port & AUDIO_AUX1_OUT) gain = AUDIO_MAX_GAIN; break; case GST_SUNAUDIO_TRACK_AUX2OUT: if (audioinfo.play.port & AUDIO_AUX2_OUT) gain = AUDIO_MAX_GAIN; break; default: break; } switch (track->num_channels) { case 2: if (balance == AUDIO_MID_BALANCE) { volumes[0] = gain; volumes[1] = gain; } else if (balance < AUDIO_MID_BALANCE) { volumes[0] = gain; ratio = 1 - (float) (AUDIO_MID_BALANCE - balance) / (float) AUDIO_MID_BALANCE; volumes[1] = (int) ((float) gain * ratio + 0.5); } else { volumes[1] = gain; ratio = 1 - (float) (balance - AUDIO_MID_BALANCE) / (float) AUDIO_MID_BALANCE; volumes[0] = (int) ((float) gain * ratio + 0.5); } break; case 1: volumes[0] = gain; break; } /* Likewise reset MUTE */ if ((sunaudiotrack->track_num == GST_SUNAUDIO_TRACK_OUTPUT && audioinfo.output_muted == 1) || (sunaudiotrack->track_num != GST_SUNAUDIO_TRACK_OUTPUT && gain == 0)) { /* * If MUTE is set, then gain is always 0, so don't bother * resetting our internal value. */ track->flags |= GST_MIXER_TRACK_MUTE; } else { sunaudiotrack->gain = gain; sunaudiotrack->balance = balance; track->flags &= ~GST_MIXER_TRACK_MUTE; } } void gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gint * volumes) { gint gain; gint balance; gint l_real_gain; gint r_real_gain; float ratio; struct audio_info audioinfo; GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track); l_real_gain = volumes[0]; r_real_gain = volumes[1]; if (l_real_gain == r_real_gain) { gain = l_real_gain; balance = AUDIO_MID_BALANCE; } else if (l_real_gain < r_real_gain) { gain = r_real_gain; ratio = (float) l_real_gain / (float) r_real_gain; balance = AUDIO_RIGHT_BALANCE - (int) (ratio * (float) AUDIO_MID_BALANCE + 0.5); } else { gain = l_real_gain; ratio = (float) r_real_gain / (float) l_real_gain; balance = AUDIO_LEFT_BALANCE + (int) (ratio * (float) AUDIO_MID_BALANCE + 0.5); } sunaudiotrack->gain = gain; sunaudiotrack->balance = balance; if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE)) { if (sunaudiotrack->track_num == GST_SUNAUDIO_TRACK_OUTPUT) { return; } else if (gain == 0) { return; } else { /* * If the volume is set to a non-zero value for LINE_IN * or MONITOR, then unset MUTE. */ track->flags &= ~GST_MIXER_TRACK_MUTE; } } /* Set the volume */ AUDIO_INITINFO (&audioinfo); switch (sunaudiotrack->track_num) { case GST_SUNAUDIO_TRACK_OUTPUT: audioinfo.play.gain = gain; audioinfo.play.balance = balance; break; case GST_SUNAUDIO_TRACK_RECORD: audioinfo.record.gain = gain; audioinfo.record.balance = balance; break; case GST_SUNAUDIO_TRACK_MONITOR: audioinfo.monitor_gain = gain; audioinfo.record.balance = balance; break; default: break; } g_return_if_fail (mixer->mixer_fd != -1); if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) { g_warning ("Error setting audio device volume"); return; } } void gst_sunaudiomixer_ctrl_set_mute (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gboolean mute) { struct audio_info audioinfo; struct audio_info oldinfo; GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track); gint volume, balance; AUDIO_INITINFO (&audioinfo); if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &oldinfo) < 0) { g_warning ("Error getting audio device volume"); return; } if (mute) { volume = 0; track->flags |= GST_MIXER_TRACK_MUTE; } else { volume = sunaudiotrack->gain; track->flags &= ~GST_MIXER_TRACK_MUTE; } balance = sunaudiotrack->balance; switch (sunaudiotrack->track_num) { case GST_SUNAUDIO_TRACK_OUTPUT: if (mute) audioinfo.output_muted = 1; else audioinfo.output_muted = 0; audioinfo.play.gain = volume; audioinfo.play.balance = balance; break; case GST_SUNAUDIO_TRACK_RECORD: audioinfo.record.gain = volume; audioinfo.record.balance = balance; break; case GST_SUNAUDIO_TRACK_MONITOR: audioinfo.monitor_gain = volume; audioinfo.record.balance = balance; break; case GST_SUNAUDIO_TRACK_SPEAKER: if (mute) { audioinfo.play.port = oldinfo.play.port & ~AUDIO_SPEAKER; } else { audioinfo.play.port = oldinfo.play.port | AUDIO_SPEAKER; } break; case GST_SUNAUDIO_TRACK_HP: if (mute) { audioinfo.play.port = oldinfo.play.port & ~AUDIO_HEADPHONE; } else { audioinfo.play.port = oldinfo.play.port | AUDIO_HEADPHONE; } break; case GST_SUNAUDIO_TRACK_LINEOUT: if (mute) { audioinfo.play.port = oldinfo.play.port & ~AUDIO_LINE_OUT; } else { audioinfo.play.port = oldinfo.play.port | AUDIO_LINE_OUT; } break; case GST_SUNAUDIO_TRACK_SPDIFOUT: if (mute) { audioinfo.play.port = oldinfo.play.port & ~AUDIO_SPDIF_OUT; } else { audioinfo.play.port = oldinfo.play.port | AUDIO_SPDIF_OUT; } break; case GST_SUNAUDIO_TRACK_AUX1OUT: if (mute) { audioinfo.play.port = oldinfo.play.port & ~AUDIO_AUX1_OUT; } else { audioinfo.play.port = oldinfo.play.port | AUDIO_AUX1_OUT; } break; case GST_SUNAUDIO_TRACK_AUX2OUT: if (mute) { audioinfo.play.port = oldinfo.play.port & ~AUDIO_AUX2_OUT; } else { audioinfo.play.port = oldinfo.play.port | AUDIO_AUX2_OUT; } break; default: break; } if (audioinfo.play.port != ((unsigned) ~0)) { /* mask off ports we can't modify. Hack for broken drivers where mod_ports == 0 */ if (oldinfo.play.mod_ports != 0) { audioinfo.play.port &= oldinfo.play.mod_ports; /* and add in any that are forced to be on */ audioinfo.play.port |= (oldinfo.play.port & ~oldinfo.play.mod_ports); } } g_return_if_fail (mixer->mixer_fd != -1); if (audioinfo.play.port != (guint) (-1) && audioinfo.play.port != oldinfo.play.port) GST_LOG_OBJECT (mixer, "Changing play port mask to 0x%08x", audioinfo.play.port); if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) { g_warning ("Error setting audio settings"); return; } } void gst_sunaudiomixer_ctrl_set_record (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gboolean record) { } void gst_sunaudiomixer_ctrl_set_option (GstSunAudioMixerCtrl * mixer, GstMixerOptions * options, gchar * value) { struct audio_info audioinfo; GstMixerTrack *track; GstSunAudioMixerOptions *opts; GQuark q; int i; g_return_if_fail (mixer != NULL); g_return_if_fail (mixer->mixer_fd != -1); g_return_if_fail (value != NULL); g_return_if_fail (GST_IS_SUNAUDIO_MIXER_OPTIONS (options)); track = GST_MIXER_TRACK (options); opts = GST_SUNAUDIO_MIXER_OPTIONS (options); if (opts->track_num != GST_SUNAUDIO_TRACK_RECSRC) { g_warning ("set_option not supported on track %s", track->label); return; } q = g_quark_try_string (value); if (q == 0) { g_warning ("unknown option '%s'", value); return; } for (i = 0; i < 8; i++) { if (opts->names[i] == q) { break; } } if (((1 << (i)) & opts->avail) == 0) { g_warning ("Record port %s not available", g_quark_to_string (q)); return; } AUDIO_INITINFO (&audioinfo); audioinfo.record.port = (1 << (i)); if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) { g_warning ("Error setting audio record port"); } } const gchar * gst_sunaudiomixer_ctrl_get_option (GstSunAudioMixerCtrl * mixer, GstMixerOptions * options) { GstMixerTrack *track; GstSunAudioMixerOptions *opts; struct audio_info audioinfo; int i; g_return_val_if_fail (mixer != NULL, NULL); g_return_val_if_fail (mixer->fd != -1, NULL); g_return_val_if_fail (GST_IS_SUNAUDIO_MIXER_OPTIONS (options), NULL); track = GST_MIXER_TRACK (options); opts = GST_SUNAUDIO_MIXER_OPTIONS (options); g_return_val_if_fail (opts->track_num == GST_SUNAUDIO_TRACK_RECSRC, NULL); if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { g_warning ("Error getting audio device settings"); return (NULL); } for (i = 0; i < 8; i++) { if ((1 << i) == audioinfo.record.port) { const gchar *s = g_quark_to_string (opts->names[i]); GST_DEBUG_OBJECT (mixer, "Getting value for option %d: %s", opts->track_num, s); return (s); } } GST_DEBUG_OBJECT (mixer, "Unable to get value for option %d", opts->track_num); g_warning ("Record port value %d seems illegal", audioinfo.record.port); return (NULL); } gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixertrack.h0000644000175000017500000000514111671175354021267 00000000000000/* * GStreamer SunAudio mixer track implementation * Copyright (C) 2005,2006,2009 Sun Microsystems, Inc., * Brian Cameron * Copyright (C) 2009 Sun Microsystems, Inc., * Garrett D'Amore * * gstsunaudiomixertrack.h: SunAudio mixer tracks * * 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_SUNAUDIO_MIXER_TRACK_H__ #define __GST_SUNAUDIO_MIXER_TRACK_H__ #include #include G_BEGIN_DECLS typedef enum { GST_SUNAUDIO_TRACK_OUTPUT = 0, GST_SUNAUDIO_TRACK_RECORD, GST_SUNAUDIO_TRACK_MONITOR, GST_SUNAUDIO_TRACK_SPEAKER, GST_SUNAUDIO_TRACK_HP, GST_SUNAUDIO_TRACK_LINEOUT, GST_SUNAUDIO_TRACK_SPDIFOUT, GST_SUNAUDIO_TRACK_AUX1OUT, GST_SUNAUDIO_TRACK_AUX2OUT, GST_SUNAUDIO_TRACK_RECSRC } GstSunAudioTrackType; #define GST_TYPE_SUNAUDIO_MIXER_TRACK \ (gst_sunaudiomixer_track_get_type ()) #define GST_SUNAUDIO_MIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SUNAUDIO_MIXER_TRACK, \ GstSunAudioMixerTrack)) #define GST_SUNAUDIO_MIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SUNAUDIO_MIXER_TRACK, \ GstSunAudioMixerTrackClass)) #define GST_IS_SUNAUDIO_MIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SUNAUDIO_MIXER_TRACK)) #define GST_IS_SUNAUDIO_MIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SUNAUDIO_MIXER_TRACK)) typedef struct _GstSunAudioMixerTrack { GstMixerTrack parent; gint gain; gint balance; GstSunAudioTrackType track_num; } GstSunAudioMixerTrack; typedef struct _GstSunAudioMixerTrackClass { GstMixerTrackClass parent; } GstSunAudioMixerTrackClass; GType gst_sunaudiomixer_track_get_type (void); GstMixerTrack* gst_sunaudiomixer_track_new (GstSunAudioTrackType track_num); G_END_DECLS #endif /* __GST_SUNAUDIO_MIXER_TRACK_H__ */ gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiosink.h0000644000175000017500000000470411677341661020070 00000000000000/* * GStreamer - SunAudio sink * Copyright (C) 2004 David A. Schleef * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * Copyright (C) 2006 Jan Schmidt * * gstsunaudiosink.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_SUNAUDIO_SINK_H__ #define __GST_SUNAUDIO_SINK_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_SUNAUDIO_SINK (gst_sunaudiosink_get_type()) #define GST_SUNAUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_SINK,GstSunAudioSink)) #define GST_SUNAUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_SINK,GstSunAudioSinkClass)) #define GST_IS_SUNAUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_SINK)) #define GST_IS_SUNAUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_SINK)) typedef struct _GstSunAudioSink GstSunAudioSink; typedef struct _GstSunAudioSinkClass GstSunAudioSinkClass; struct _GstSunAudioSink { GstAudioSink sink; gchar *device; gint fd; audio_device_t dev; audio_info_t info; /* Number of segments the ringbuffer is configured for */ guint segtotal; guint segtotal_samples; /* Number of segments written to the device */ gint segs_written; /* Number of samples written to the device */ gint samples_written; guint bytes_per_sample; /* mutex and gcond used to control the write method */ GMutex *write_mutex; GCond *sleep_cond; gboolean flushing; }; struct _GstSunAudioSinkClass { GstAudioSinkClass parent_class; }; GType gst_sunaudiosink_get_type(void); G_END_DECLS #endif /* __GST_SUNAUDIO_SINK_H__ */ gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixeroptions.h0000644000175000017500000000454511671175354021665 00000000000000/* * GStreamer SunAudio mixer track implementation * Copyright (C) 2009 Sun Microsystems, Inc., * Brian Cameron * Garrett D'Amore * * gstsunaudiomixeroptions.h: Sun Audio mixer options object * * 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, */ #ifndef __GST_SUNAUDIO_MIXER_OPTIONS_H__ #define __GST_SUNAUDIO_MIXER_OPTIONS_H__ #include "gstsunaudiomixer.h" #include G_BEGIN_DECLS #define GST_SUNAUDIO_MIXER_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_MIXER_OPTIONS, GstSunAudioMixerOptions)) #define GST_SUNAUDIO_MIXER_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_MIXER_OPTIONS, GstSunAudioMixerOptionsClass)) #define GST_IS_SUNAUDIO_MIXER_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_MIXER_OPTIONS)) #define GST_IS_SUNAUDIO_MIXER_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_MIXER_OPTIONS)) #define GST_TYPE_SUNAUDIO_MIXER_OPTIONS (gst_sunaudiomixer_options_get_type()) typedef struct _GstSunAudioMixerOptions GstSunAudioMixerOptions; typedef struct _GstSunAudioMixerOptionsClass GstSunAudioMixerOptionsClass; struct _GstSunAudioMixerOptions { GstMixerOptions parent; gint track_num; GQuark names[8]; /* only 8 possible */ gint avail; /* mask of avail */ }; struct _GstSunAudioMixerOptionsClass { GstMixerOptionsClass parent; }; GType gst_sunaudiomixer_options_get_type (void); GstMixerOptions *gst_sunaudiomixer_options_new (GstSunAudioMixerCtrl *mixer, gint track_num); G_END_DECLS #endif /* __GST_SUNAUDIO_MIXER_OPTIONS_H__ */ gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudio.c0000644000175000017500000000371411671175354017174 00000000000000/* * GStreamer - SunAudio plugin * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include "gstsunaudiomixer.h" #include "gstsunaudiosink.h" #include "gstsunaudiosrc.h" extern gchar *__gst_oss_plugin_dir; GST_DEBUG_CATEGORY (sunaudio_debug); static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "sunaudiomixer", GST_RANK_NONE, GST_TYPE_SUNAUDIO_MIXER) || !gst_element_register (plugin, "sunaudiosink", GST_RANK_SECONDARY, GST_TYPE_SUNAUDIO_SINK) || !gst_element_register (plugin, "sunaudiosrc", GST_RANK_SECONDARY, GST_TYPE_SUNAUDIO_SRC)) { return FALSE; } GST_DEBUG_CATEGORY_INIT (sunaudio_debug, "sunaudio", 0, "sunaudio elements"); #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "sunaudio", "Sun Audio support for GStreamer", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixer.h0000644000175000017500000000346411671175354020250 00000000000000/* * GStreamer - SunAudio mixer * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __GST_SUNAUDIO_MIXER_H__ #define __GST_SUNAUDIO_MIXER_H__ #include "gstsunaudiomixerctrl.h" G_BEGIN_DECLS #define GST_SUNAUDIO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_MIXER,GstSunAudioMixer)) #define GST_SUNAUDIO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_MIXER,GstSunAudioMixerClass)) #define GST_IS_SUNAUDIO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_MIXER)) #define GST_IS_SUNAUDIO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_MIXER)) #define GST_TYPE_SUNAUDIO_MIXER (gst_sunaudiomixer_get_type()) typedef struct _GstSunAudioMixer GstSunAudioMixer; typedef struct _GstSunAudioMixerClass GstSunAudioMixerClass; struct _GstSunAudioMixer { GstElement parent; GstSunAudioMixerCtrl *mixer; }; struct _GstSunAudioMixerClass { GstElementClass parent; }; GType gst_sunaudiomixer_get_type (void); G_END_DECLS #endif /* __GST_SUNAUDIO_MIXER_H__ */ gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixer.c0000644000175000017500000000606511671175354020243 00000000000000/* * GStreamer - SunAudio mixer * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * * 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-sunaudiomixer * * sunaudiomixer is an mixer that controls the sound input and output * levels with the Sun Audio interface available in Solaris. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstsunaudiomixer.h" GST_BOILERPLATE_WITH_INTERFACE (GstSunAudioMixer, gst_sunaudiomixer, GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, gst_sunaudiomixer); GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS (GstSunAudioMixer, gst_sunaudiomixer); static GstStateChangeReturn gst_sunaudiomixer_change_state (GstElement * element, GstStateChange transition); static void gst_sunaudiomixer_base_init (gpointer klass) { gst_element_class_set_details_simple (GST_ELEMENT_CLASS (klass), "Sun Audio Mixer", "Generic/Audio", "Control sound input and output levels with Sun Audio", "Brian Cameron "); } static void gst_sunaudiomixer_class_init (GstSunAudioMixerClass * klass) { GstElementClass *element_class; element_class = (GstElementClass *) klass; element_class->change_state = gst_sunaudiomixer_change_state; } static void gst_sunaudiomixer_init (GstSunAudioMixer * this, GstSunAudioMixerClass * g_class) { this->mixer = NULL; } static GstStateChangeReturn gst_sunaudiomixer_change_state (GstElement * element, GstStateChange transition) { GstSunAudioMixer *this = GST_SUNAUDIO_MIXER (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!this->mixer) { const char *audiodev; audiodev = g_getenv ("AUDIODEV"); if (audiodev == NULL) { this->mixer = gst_sunaudiomixer_ctrl_new ("/dev/audioctl"); } else { gchar *device = g_strdup_printf ("%sctl", audiodev); this->mixer = gst_sunaudiomixer_ctrl_new (device); g_free (device); } } break; case GST_STATE_CHANGE_READY_TO_NULL: if (this->mixer) { gst_sunaudiomixer_ctrl_free (this->mixer); this->mixer = NULL; } break; default: break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return GST_STATE_CHANGE_SUCCESS; } gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiosrc.c0000644000175000017500000002761111677341661017710 00000000000000/* * GStreamer - SunAudio source * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * * gstsunaudiosrc.c: * * 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-sunaudiosrc * * sunaudiosrc is an audio source designed to work with the Sun Audio * interface available in Solaris. * * * Example launch line * |[ * gst-launch sunaudiosrc ! wavenc ! filesink location=audio.wav * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "gstsunaudiosrc.h" GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); #define GST_CAT_DEFAULT sunaudio_debug static void gst_sunaudiosrc_base_init (gpointer g_class); static void gst_sunaudiosrc_class_init (GstSunAudioSrcClass * klass); static void gst_sunaudiosrc_init (GstSunAudioSrc * sunaudiosrc, GstSunAudioSrcClass * g_class); static void gst_sunaudiosrc_dispose (GObject * object); static void gst_sunaudiosrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_sunaudiosrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_sunaudiosrc_getcaps (GstBaseSrc * bsrc); static gboolean gst_sunaudiosrc_open (GstAudioSrc * asrc); static gboolean gst_sunaudiosrc_close (GstAudioSrc * asrc); static gboolean gst_sunaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec); static gboolean gst_sunaudiosrc_unprepare (GstAudioSrc * asrc); static guint gst_sunaudiosrc_read (GstAudioSrc * asrc, gpointer data, guint length); static guint gst_sunaudiosrc_delay (GstAudioSrc * asrc); static void gst_sunaudiosrc_reset (GstAudioSrc * asrc); #define DEFAULT_DEVICE "/dev/audio" enum { PROP_0, PROP_DEVICE }; GST_BOILERPLATE_WITH_INTERFACE (GstSunAudioSrc, gst_sunaudiosrc, GstAudioSrc, GST_TYPE_AUDIO_SRC, GstMixer, GST_TYPE_MIXER, gst_sunaudiosrc); GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS (GstSunAudioSrc, gst_sunaudiosrc); static GstStaticPadTemplate gst_sunaudiosrc_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " /* [5510,48000] seems to be a Solaris limit */ "rate = (int) [ 5510, 48000 ], " "channels = (int) [ 1, 2 ]") ); static void gst_sunaudiosrc_dispose (GObject * object) { G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_sunaudiosrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_sunaudiosrc_factory); gst_element_class_set_details_simple (element_class, "Sun Audio Source", "Source/Audio", "Audio source for Sun Audio devices", "Brian Cameron "); } static void gst_sunaudiosrc_class_init (GstSunAudioSrcClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSrcClass *gstbasesrc_class; GstBaseAudioSrcClass *gstbaseaudiosrc_class; GstAudioSrcClass *gstaudiosrc_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; gstaudiosrc_class = (GstAudioSrcClass *) klass; gobject_class->dispose = gst_sunaudiosrc_dispose; gobject_class->get_property = gst_sunaudiosrc_get_property; gobject_class->set_property = gst_sunaudiosrc_set_property; gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_getcaps); gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_open); gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_prepare); gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_unprepare); gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_close); gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_read); gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_delay); gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_sunaudiosrc_reset); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "SunAudio device (usually /dev/audio)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_sunaudiosrc_init (GstSunAudioSrc * sunaudiosrc, GstSunAudioSrcClass * g_class) { const char *audiodev; GST_DEBUG_OBJECT (sunaudiosrc, "initializing sunaudiosrc"); sunaudiosrc->fd = -1; audiodev = g_getenv ("AUDIODEV"); if (audiodev == NULL) audiodev = DEFAULT_DEVICE; sunaudiosrc->device = g_strdup (audiodev); } static void gst_sunaudiosrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSunAudioSrc *sunaudiosrc; sunaudiosrc = GST_SUNAUDIO_SRC (object); switch (prop_id) { case PROP_DEVICE: if (sunaudiosrc->device) g_free (sunaudiosrc->device); sunaudiosrc->device = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_sunaudiosrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSunAudioSrc *sunaudiosrc; sunaudiosrc = GST_SUNAUDIO_SRC (object); switch (prop_id) { case PROP_DEVICE: g_value_set_string (value, sunaudiosrc->device); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_sunaudiosrc_getcaps (GstBaseSrc * bsrc) { GstPadTemplate *pad_template; GstCaps *caps = NULL; GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (bsrc); GST_DEBUG_OBJECT (sunaudiosrc, "getcaps called"); pad_template = gst_static_pad_template_get (&gst_sunaudiosrc_factory); caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); gst_object_unref (pad_template); return caps; } static gboolean gst_sunaudiosrc_open (GstAudioSrc * asrc) { GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); int fd, ret; fd = open (sunaudiosrc->device, O_RDONLY); if (fd == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, OPEN_READ, (NULL), ("can't open connection to Sun Audio device %s", sunaudiosrc->device)); return FALSE; } sunaudiosrc->fd = fd; ret = ioctl (fd, AUDIO_GETDEV, &sunaudiosrc->dev); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } GST_DEBUG_OBJECT (sunaudiosrc, "name %s", sunaudiosrc->dev.name); GST_DEBUG_OBJECT (sunaudiosrc, "version %s", sunaudiosrc->dev.version); GST_DEBUG_OBJECT (sunaudiosrc, "config %s", sunaudiosrc->dev.config); ret = ioctl (fd, AUDIO_GETINFO, &sunaudiosrc->info); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } GST_DEBUG_OBJECT (sunaudiosrc, "monitor_gain %d", sunaudiosrc->info.monitor_gain); GST_DEBUG_OBJECT (sunaudiosrc, "output_muted %d", sunaudiosrc->info.output_muted); GST_DEBUG_OBJECT (sunaudiosrc, "hw_features %08x", sunaudiosrc->info.hw_features); GST_DEBUG_OBJECT (sunaudiosrc, "sw_features %08x", sunaudiosrc->info.sw_features); GST_DEBUG_OBJECT (sunaudiosrc, "sw_features_enabled %08x", sunaudiosrc->info.sw_features_enabled); if (!sunaudiosrc->mixer) { const char *audiodev; audiodev = g_getenv ("AUDIODEV"); if (audiodev == NULL) { sunaudiosrc->mixer = gst_sunaudiomixer_ctrl_new ("/dev/audioctl"); } else { gchar *device = g_strdup_printf ("%sctl", audiodev); sunaudiosrc->mixer = gst_sunaudiomixer_ctrl_new (device); g_free (device); } } return TRUE; } static gboolean gst_sunaudiosrc_close (GstAudioSrc * asrc) { GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); close (sunaudiosrc->fd); sunaudiosrc->fd = -1; if (sunaudiosrc->mixer) { gst_sunaudiomixer_ctrl_free (sunaudiosrc->mixer); sunaudiosrc->mixer = NULL; } return TRUE; } static gboolean gst_sunaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) { GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); audio_info_t ainfo; int ret; GstSunAudioMixerCtrl *mixer; struct audio_info audioinfo; ret = ioctl (sunaudiosrc->fd, AUDIO_GETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } if (spec->width != 16) return FALSE; AUDIO_INITINFO (&ainfo); ainfo.record.sample_rate = spec->rate; ainfo.record.precision = spec->width; ainfo.record.channels = spec->channels; ainfo.record.encoding = AUDIO_ENCODING_LINEAR; ainfo.record.buffer_size = spec->buffer_time; mixer = sunaudiosrc->mixer; if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) { g_warning ("Error getting audio device volume"); } ainfo.record.port = audioinfo.record.port; ainfo.record.gain = audioinfo.record.gain; ainfo.record.balance = audioinfo.record.balance; spec->segsize = 128; spec->segtotal = spec->buffer_time / 128; spec->silence_sample[0] = 0; spec->silence_sample[1] = 0; spec->silence_sample[2] = 0; spec->silence_sample[3] = 0; ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return FALSE; } ioctl (sunaudiosrc->fd, I_FLUSH, FLUSHR); return TRUE; } static gboolean gst_sunaudiosrc_unprepare (GstAudioSrc * asrc) { return TRUE; } static guint gst_sunaudiosrc_read (GstAudioSrc * asrc, gpointer data, guint length) { return read (GST_SUNAUDIO_SRC (asrc)->fd, data, length); } static guint gst_sunaudiosrc_delay (GstAudioSrc * asrc) { return 0; } static void gst_sunaudiosrc_reset (GstAudioSrc * asrc) { /* Get current values */ GstSunAudioSrc *sunaudiosrc = GST_SUNAUDIO_SRC (asrc); audio_info_t ainfo; int ret; ret = ioctl (sunaudiosrc->fd, AUDIO_GETINFO, &ainfo); if (ret == -1) { /* * Should never happen, but if we couldn't getinfo, then no point * trying to setinfo */ GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); return; } /* * Pause the audio - so audio stops playing immediately rather than * waiting for the ringbuffer to empty. */ ainfo.record.pause = !NULL; ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } /* Flush the audio */ ret = ioctl (sunaudiosrc->fd, I_FLUSH, FLUSHR); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } /* unpause the audio */ ainfo.record.pause = NULL; ret = ioctl (sunaudiosrc->fd, AUDIO_SETINFO, &ainfo); if (ret == -1) { GST_ELEMENT_ERROR (sunaudiosrc, RESOURCE, SETTINGS, (NULL), ("%s", strerror (errno))); } } gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixerctrl.h0000644000175000017500000002742311671175354021136 00000000000000/* * GStreamer - SunAudio mixer interface element. * Copyright (C) 2005,2006,2009 Sun Microsystems, Inc., * Brian Cameron * Copyright (C) 2009 Sun Microsystems, Inc., * Garrett D'Amore * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __GST_SUNAUDIO_MIXER_CTRL_H #define __GST_SUNAUDIO_MIXER_CTRL_H #include #include #include G_BEGIN_DECLS #define GST_SUNAUDIO_MIXER_CTRL(obj) ((GstSunAudioMixerCtrl*)(obj)) typedef struct _GstSunAudioMixerCtrl GstSunAudioMixerCtrl; struct _GstSunAudioMixerCtrl { GList * tracklist; /* list of available tracks */ gint fd; gint mixer_fd; gchar * device; }; GstSunAudioMixerCtrl* gst_sunaudiomixer_ctrl_new (const gchar *device); void gst_sunaudiomixer_ctrl_free (GstSunAudioMixerCtrl *mixer); const GList* gst_sunaudiomixer_ctrl_list_tracks (GstSunAudioMixerCtrl * mixer); void gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gint * volumes); void gst_sunaudiomixer_ctrl_get_volume (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gint * volumes); void gst_sunaudiomixer_ctrl_set_record (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gboolean record); void gst_sunaudiomixer_ctrl_set_mute (GstSunAudioMixerCtrl * mixer, GstMixerTrack * track, gboolean mute); void gst_sunaudiomixer_ctrl_set_option (GstSunAudioMixerCtrl * mixer, GstMixerOptions * options, gchar * value); const gchar * gst_sunaudiomixer_ctrl_get_option (GstSunAudioMixerCtrl * mixer, GstMixerOptions * options); GstMixerFlags gst_sunaudiomixer_ctrl_get_mixer_flags (GstSunAudioMixerCtrl *mixer); #define GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS(Type, interface_as_function) \ static gboolean \ interface_as_function ## _supported (Type *this, GType iface_type) \ { \ g_assert (iface_type == GST_TYPE_MIXER); \ \ return (this->mixer != NULL); \ } \ \ static const GList* \ interface_as_function ## _list_tracks (GstMixer * mixer) \ { \ Type *this = (Type*) mixer; \ \ g_return_val_if_fail (this != NULL, NULL); \ g_return_val_if_fail (this->mixer != NULL, NULL); \ \ return gst_sunaudiomixer_ctrl_list_tracks (this->mixer); \ } \ \ static void \ interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ gint * volumes) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_sunaudiomixer_ctrl_set_volume (this->mixer, track, volumes); \ } \ \ static void \ interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ gint * volumes) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_sunaudiomixer_ctrl_get_volume (this->mixer, track, volumes); \ } \ \ static void \ interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ gboolean record) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_sunaudiomixer_ctrl_set_record (this->mixer, track, record); \ } \ \ static void \ interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ gboolean mute) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_sunaudiomixer_ctrl_set_mute (this->mixer, track, mute); \ } \ \ static const gchar * \ interface_as_function ## _get_option (GstMixer * mixer, GstMixerOptions * opts) \ { \ Type *this = (Type*) mixer; \ \ g_return_val_if_fail (this != NULL, NULL); \ g_return_val_if_fail (this->mixer != NULL, NULL); \ \ return gst_sunaudiomixer_ctrl_get_option (this->mixer, opts); \ } \ \ static void \ interface_as_function ## _set_option (GstMixer * mixer, GstMixerOptions * opts, \ gchar * value) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_sunaudiomixer_ctrl_set_option (this->mixer, opts, value); \ } \ \ static GstMixerFlags \ interface_as_function ## _get_mixer_flags (GstMixer * mixer) \ { \ Type *this = (Type*) mixer; \ \ g_return_val_if_fail (this != NULL, GST_MIXER_FLAG_NONE); \ g_return_val_if_fail (this->mixer != NULL, GST_MIXER_FLAG_NONE); \ \ return gst_sunaudiomixer_ctrl_get_mixer_flags (this->mixer); \ } \ \ static void \ interface_as_function ## _interface_init (GstMixerClass * klass) \ { \ GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ \ /* set up the interface hooks */ \ klass->list_tracks = interface_as_function ## _list_tracks; \ klass->set_volume = interface_as_function ## _set_volume; \ klass->get_volume = interface_as_function ## _get_volume; \ klass->set_mute = interface_as_function ## _set_mute; \ klass->set_record = interface_as_function ## _set_record; \ klass->get_option = interface_as_function ## _get_option; \ klass->set_option = interface_as_function ## _set_option; \ klass->get_mixer_flags = interface_as_function ## _get_mixer_flags; \ } G_END_DECLS #endif gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiomixertrack.c0000644000175000017500000001146511671175354021270 00000000000000/* * GStreamer * Copyright (C) 2005,2008, 2009 Sun Microsystems, Inc., * Brian Cameron * Copyright (C) 2009 Sun Microsystems, Inc., * Garrett D'Amore * * gstsunaudiomixer.c: mixer interface implementation for OSS * * 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 #include #include #include #include #include #include #include #include #include "gstsunaudiomixertrack.h" GST_DEBUG_CATEGORY_EXTERN (sunaudio_debug); #define GST_CAT_DEFAULT sunaudio_debug #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) G_DEFINE_TYPE (GstSunAudioMixerTrack, gst_sunaudiomixer_track, GST_TYPE_MIXER_TRACK); static void gst_sunaudiomixer_track_class_init (GstSunAudioMixerTrackClass * klass) { /* nop */ } static void gst_sunaudiomixer_track_init (GstSunAudioMixerTrack * track) { track->gain = 0; track->balance = AUDIO_MID_BALANCE; track->track_num = 0; } GstMixerTrack * gst_sunaudiomixer_track_new (GstSunAudioTrackType track_num) { const gchar *labels[] = { N_("Volume"), N_("Gain"), N_("Monitor"), N_("Built-in Speaker"), N_("Headphone"), N_("Line Out"), N_("SPDIF Out"), N_("AUX 1 Out"), N_("AUX 2 Out"), }; GstSunAudioMixerTrack *sunaudiotrack; GstMixerTrack *track; const gchar *untranslated_label; if ((guint) track_num < G_N_ELEMENTS (labels)) untranslated_label = labels[track_num]; else untranslated_label = NULL; sunaudiotrack = g_object_new (GST_TYPE_SUNAUDIO_MIXER_TRACK, "untranslated-label", untranslated_label, NULL); GST_DEBUG_OBJECT (sunaudiotrack, "Creating new mixer track of type %d: %s", track_num, GST_STR_NULL (untranslated_label)); switch (track_num) { case GST_SUNAUDIO_TRACK_OUTPUT: /* these are sliders */ track = GST_MIXER_TRACK (sunaudiotrack); track->label = g_strdup (_(untranslated_label)); track->num_channels = 2; track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST | GST_MIXER_TRACK_MASTER; track->min_volume = 0; track->max_volume = 255; sunaudiotrack->track_num = track_num; sunaudiotrack->gain = (0 & 0xff); sunaudiotrack->balance = AUDIO_MID_BALANCE; break; case GST_SUNAUDIO_TRACK_RECORD: /* these are sliders */ track = GST_MIXER_TRACK (sunaudiotrack); track->label = g_strdup (_(untranslated_label)); track->num_channels = 2; track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD | GST_MIXER_TRACK_WHITELIST; track->min_volume = 0; track->max_volume = 255; sunaudiotrack->track_num = track_num; sunaudiotrack->gain = (0 & 0xff); sunaudiotrack->balance = AUDIO_MID_BALANCE; break; case GST_SUNAUDIO_TRACK_MONITOR: /* these are sliders */ track = GST_MIXER_TRACK (sunaudiotrack); track->label = g_strdup (_(untranslated_label)); track->num_channels = 2; track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD; track->min_volume = 0; track->max_volume = 255; sunaudiotrack->track_num = track_num; sunaudiotrack->gain = (0 & 0xff); sunaudiotrack->balance = AUDIO_MID_BALANCE; break; case GST_SUNAUDIO_TRACK_SPEAKER: case GST_SUNAUDIO_TRACK_HP: case GST_SUNAUDIO_TRACK_LINEOUT: case GST_SUNAUDIO_TRACK_SPDIFOUT: case GST_SUNAUDIO_TRACK_AUX1OUT: case GST_SUNAUDIO_TRACK_AUX2OUT: /* these are switches */ track = GST_MIXER_TRACK (sunaudiotrack); track->label = g_strdup (_(untranslated_label)); track->num_channels = 0; track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST; track->min_volume = 0; track->max_volume = 255; sunaudiotrack->track_num = track_num; sunaudiotrack->gain = (0 & 0xff); sunaudiotrack->balance = AUDIO_MID_BALANCE; break; default: g_warning ("Unknown sun audio track num %d", track_num); track = NULL; } return track; } gst-plugins-good-0.10.31/sys/sunaudio/Makefile.in0000644000175000017500000010741211720560241016514 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/sunaudio DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstsunaudio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstsunaudio_la_OBJECTS = libgstsunaudio_la-gstsunaudio.lo \ libgstsunaudio_la-gstsunaudiosink.lo \ libgstsunaudio_la-gstsunaudiomixerctrl.lo \ libgstsunaudio_la-gstsunaudiomixer.lo \ libgstsunaudio_la-gstsunaudiomixertrack.lo \ libgstsunaudio_la-gstsunaudiomixeroptions.lo \ libgstsunaudio_la-gstsunaudiosrc.lo libgstsunaudio_la_OBJECTS = $(am_libgstsunaudio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstsunaudio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) \ $(libgstsunaudio_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstsunaudio_la_SOURCES) DIST_SOURCES = $(libgstsunaudio_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstsunaudio.la libgstsunaudio_la_SOURCES = gstsunaudio.c \ gstsunaudiosink.c \ gstsunaudiomixerctrl.c \ gstsunaudiomixer.c \ gstsunaudiomixertrack.c \ gstsunaudiomixeroptions.c \ gstsunaudiosrc.c libgstsunaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstsunaudio_la_LIBADD = \ -lgstinterfaces-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_LIBS) libgstsunaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsunaudio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstsunaudiosink.h \ gstsunaudiomixer.h \ gstsunaudiomixerctrl.h \ gstsunaudiomixertrack.h \ gstsunaudiomixeroptions.h \ gstsunaudiosrc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/sunaudio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/sunaudio/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstsunaudio.la: $(libgstsunaudio_la_OBJECTS) $(libgstsunaudio_la_DEPENDENCIES) $(EXTRA_libgstsunaudio_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstsunaudio_la_LINK) -rpath $(plugindir) $(libgstsunaudio_la_OBJECTS) $(libgstsunaudio_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstsunaudio_la-gstsunaudio.lo: gstsunaudio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudio.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudio.Tpo -c -o libgstsunaudio_la-gstsunaudio.lo `test -f 'gstsunaudio.c' || echo '$(srcdir)/'`gstsunaudio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudio.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudio.c' object='libgstsunaudio_la-gstsunaudio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudio.lo `test -f 'gstsunaudio.c' || echo '$(srcdir)/'`gstsunaudio.c libgstsunaudio_la-gstsunaudiosink.lo: gstsunaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Tpo -c -o libgstsunaudio_la-gstsunaudiosink.lo `test -f 'gstsunaudiosink.c' || echo '$(srcdir)/'`gstsunaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiosink.c' object='libgstsunaudio_la-gstsunaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiosink.lo `test -f 'gstsunaudiosink.c' || echo '$(srcdir)/'`gstsunaudiosink.c libgstsunaudio_la-gstsunaudiomixerctrl.lo: gstsunaudiomixerctrl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixerctrl.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Tpo -c -o libgstsunaudio_la-gstsunaudiomixerctrl.lo `test -f 'gstsunaudiomixerctrl.c' || echo '$(srcdir)/'`gstsunaudiomixerctrl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixerctrl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixerctrl.c' object='libgstsunaudio_la-gstsunaudiomixerctrl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixerctrl.lo `test -f 'gstsunaudiomixerctrl.c' || echo '$(srcdir)/'`gstsunaudiomixerctrl.c libgstsunaudio_la-gstsunaudiomixer.lo: gstsunaudiomixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixer.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Tpo -c -o libgstsunaudio_la-gstsunaudiomixer.lo `test -f 'gstsunaudiomixer.c' || echo '$(srcdir)/'`gstsunaudiomixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixer.c' object='libgstsunaudio_la-gstsunaudiomixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixer.lo `test -f 'gstsunaudiomixer.c' || echo '$(srcdir)/'`gstsunaudiomixer.c libgstsunaudio_la-gstsunaudiomixertrack.lo: gstsunaudiomixertrack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixertrack.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Tpo -c -o libgstsunaudio_la-gstsunaudiomixertrack.lo `test -f 'gstsunaudiomixertrack.c' || echo '$(srcdir)/'`gstsunaudiomixertrack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixertrack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixertrack.c' object='libgstsunaudio_la-gstsunaudiomixertrack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixertrack.lo `test -f 'gstsunaudiomixertrack.c' || echo '$(srcdir)/'`gstsunaudiomixertrack.c libgstsunaudio_la-gstsunaudiomixeroptions.lo: gstsunaudiomixeroptions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiomixeroptions.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Tpo -c -o libgstsunaudio_la-gstsunaudiomixeroptions.lo `test -f 'gstsunaudiomixeroptions.c' || echo '$(srcdir)/'`gstsunaudiomixeroptions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiomixeroptions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiomixeroptions.c' object='libgstsunaudio_la-gstsunaudiomixeroptions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiomixeroptions.lo `test -f 'gstsunaudiomixeroptions.c' || echo '$(srcdir)/'`gstsunaudiomixeroptions.c libgstsunaudio_la-gstsunaudiosrc.lo: gstsunaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -MT libgstsunaudio_la-gstsunaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Tpo -c -o libgstsunaudio_la-gstsunaudiosrc.lo `test -f 'gstsunaudiosrc.c' || echo '$(srcdir)/'`gstsunaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Tpo $(DEPDIR)/libgstsunaudio_la-gstsunaudiosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsunaudiosrc.c' object='libgstsunaudio_la-gstsunaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsunaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsunaudio_la_CFLAGS) $(CFLAGS) -c -o libgstsunaudio_la-gstsunaudiosrc.lo `test -f 'gstsunaudiosrc.c' || echo '$(srcdir)/'`gstsunaudiosrc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/sunaudio/gstsunaudiosrc.h0000644000175000017500000000400711671175354017705 00000000000000/* GStreamer - SunAudio source * Copyright (C) 2005,2006 Sun Microsystems, Inc., * Brian Cameron * * gstsunaudiosrc.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_SUNAUDIO_SRC_H__ #define __GST_SUNAUDIO_SRC_H__ #include #include #include #include "gstsunaudiomixerctrl.h" G_BEGIN_DECLS #define GST_TYPE_SUNAUDIO_SRC (gst_sunaudiosrc_get_type()) #define GST_SUNAUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_SRC,GstSunAudioSrc)) #define GST_SUNAUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_SRC,GstSunAudioSrcClass)) #define GST_IS_SUNAUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_SRC)) #define GST_IS_SUNAUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_SRC)) typedef struct _GstSunAudioSrc GstSunAudioSrc; typedef struct _GstSunAudioSrcClass GstSunAudioSrcClass; struct _GstSunAudioSrc { GstAudioSrc src; gchar *device; gint fd; gint control_fd; audio_device_t dev; audio_info_t info; gint bytes_per_sample; GstSunAudioMixerCtrl *mixer; }; struct _GstSunAudioSrcClass { GstAudioSrcClass parent_class; }; GType gst_sunaudiosrc_get_type(void); G_END_DECLS #endif /* __GST_SUNAUDIO_SRC_H__ */ gst-plugins-good-0.10.31/sys/oss4/0000755000175000017500000000000011720565320013566 500000000000000gst-plugins-good-0.10.31/sys/oss4/oss4-source.h0000644000175000017500000000651711671175354016067 00000000000000/* GStreamer OSS4 audio source * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_SOURCE_H #define GST_OSS4_SOURCE_H #include #include #include G_BEGIN_DECLS #define GST_TYPE_OSS4_SOURCE (gst_oss4_source_get_type()) #define GST_OSS4_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_SOURCE,GstOss4Source)) #define GST_OSS4_SOURCE_CAST(obj) ((GstOss4Source *)(obj)) #define GST_OSS4_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_SOURCE,GstOss4SourceClass)) #define GST_IS_OSS4_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_SOURCE)) #define GST_IS_OSS4_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_SOURCE)) typedef struct _GstOss4Source GstOss4Source; typedef struct _GstOss4SourceClass GstOss4SourceClass; struct _GstOss4Source { GstAudioSrc audiosrc; gchar * device; /* NULL if none was set */ gchar * open_device; /* the device we opened */ gchar * device_name; /* set if the device is open */ gint fd; /* -1 if not open */ gint bytes_per_sample; GstCaps * probed_caps; /* property probe interface */ GList * property_probe_list; /* mixer interface */ GList * tracks; gboolean tracks_static; /* FALSE if the list of inputs may change */ }; struct _GstOss4SourceClass { GstAudioSrcClass audiosrc_class; }; GType gst_oss4_source_get_type (void); /* our mixer track for input selection */ #define GST_TYPE_OSS4_SOURCE_INPUT (gst_oss4_source_input_get_type()) #define GST_OSS4_SOURCE_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_SOURCE_INPUT,GstOss4SourceInput)) #define GST_OSS4_SOURCE_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_SOURCE_INPUT,GstOss4SourceInputClass)) #define GST_IS_OSS4_SOURCE_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_SOURCE_INPUT)) #define GST_IS_OSS4_SOURCE_INPUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_SOURCE_INPUT)) typedef struct _GstOss4SourceInput GstOss4SourceInput; typedef struct _GstOss4SourceInputClass GstOss4SourceInputClass; struct _GstOss4SourceInput { GstMixerTrack mixer_track; int route; /* number for SNDCTL_DSP_SET_RECSRC etc. */ }; struct _GstOss4SourceInputClass { GstMixerTrackClass mixer_track_class; }; GType gst_oss4_source_input_get_type (void); G_END_DECLS #endif /* GST_OSS4_SOURCE_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-property-probe.c0000644000175000017500000002655111671175354017553 00000000000000/* GStreamer OSS4 audio property probe interface implementation * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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 #endif #include #define NO_LEGACY_MIXER #include "oss4-audio.h" #include "oss4-mixer.h" #include "oss4-sink.h" #include "oss4-source.h" #include "oss4-soundcard.h" #include "oss4-property-probe.h" #include #include #include #include #include #include #include GST_DEBUG_CATEGORY_EXTERN (oss4_debug); #define GST_CAT_DEFAULT oss4_debug static const GList * gst_oss4_property_probe_get_properties (GstPropertyProbe * probe) { GObjectClass *klass = G_OBJECT_GET_CLASS (probe); GList *list; GST_OBJECT_LOCK (GST_OBJECT (probe)); /* we create a new list and store it in the instance struct, since apparently * we forgot to update the API for 0.10 (and why don't we mark probable * properties with a flag instead anyway?). A bit hackish, but what can you * do (can't really use a static variable since the pspec will be different * for src and sink class); this isn't particularly pretty, but the best * we can do given that we can't create a common base class (we could do * fancy things with the interface, or use g_object_set_data instead, but * it's not really going to make it much better) */ if (GST_IS_AUDIO_SINK_CLASS (klass)) { list = GST_OSS4_SINK (probe)->property_probe_list; } else if (GST_IS_AUDIO_SRC_CLASS (klass)) { list = GST_OSS4_SOURCE (probe)->property_probe_list; } else if (GST_IS_OSS4_MIXER_CLASS (klass)) { list = GST_OSS4_MIXER (probe)->property_probe_list; } else { GST_OBJECT_UNLOCK (GST_OBJECT (probe)); g_return_val_if_reached (NULL); } if (list == NULL) { GParamSpec *pspec; pspec = g_object_class_find_property (klass, "device"); list = g_list_prepend (NULL, pspec); if (GST_IS_AUDIO_SINK_CLASS (klass)) { GST_OSS4_SINK (probe)->property_probe_list = list; } else if (GST_IS_AUDIO_SRC_CLASS (klass)) { GST_OSS4_SOURCE (probe)->property_probe_list = list; } else if (GST_IS_OSS4_MIXER_CLASS (klass)) { GST_OSS4_MIXER (probe)->property_probe_list = list; } } GST_OBJECT_UNLOCK (GST_OBJECT (probe)); return list; } static void gst_oss4_property_probe_probe_property (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec) { if (!g_str_equal (pspec->name, "device")) { G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); } } static gboolean gst_oss4_property_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec) { /* don't cache probed data */ return TRUE; } static gint oss4_mixerinfo_priority_cmp (struct oss_mixerinfo *mi1, struct oss_mixerinfo *mi2) { /* return negative vaue if mi1 comes before mi2 */ if (mi1->priority != mi2->priority) return mi2->priority - mi1->priority; return strcmp (mi1->devnode, mi2->devnode); } /* caller must ensure LOCK is taken (e.g. if ioctls need to be serialised) */ gboolean gst_oss4_property_probe_find_device_name (GstObject * obj, int fd, const gchar * device_handle, gchar ** device_name) { struct oss_sysinfo si = { {0,}, }; gchar *name = NULL; if (ioctl (fd, SNDCTL_SYSINFO, &si) == 0) { int i; for (i = 0; i < si.numaudios; ++i) { struct oss_audioinfo ai = { 0, }; ai.dev = i; if (ioctl (fd, SNDCTL_AUDIOINFO, &ai) == -1) { GST_DEBUG_OBJECT (obj, "AUDIOINFO ioctl for device %d failed", i); continue; } if (strcmp (ai.devnode, device_handle) == 0) { name = g_strdup (ai.name); break; } } } else { GST_WARNING_OBJECT (obj, "SYSINFO ioctl failed: %s", g_strerror (errno)); } /* try ENGINEINFO as fallback (which is better than nothing) */ if (name == NULL) { struct oss_audioinfo ai = { 0, }; GST_LOG_OBJECT (obj, "device %s not listed in AUDIOINFO", device_handle); ai.dev = -1; if (ioctl (fd, SNDCTL_ENGINEINFO, &ai) == 0) name = g_strdup (ai.name); } GST_DEBUG_OBJECT (obj, "Device name: %s", GST_STR_NULL (name)); if (name != NULL) *device_name = name; return (name != NULL); } gboolean gst_oss4_property_probe_find_device_name_nofd (GstObject * obj, const gchar * device_handle, gchar ** device_name) { gboolean res; int fd; fd = open ("/dev/mixer", O_RDONLY); if (fd < 0) return FALSE; res = gst_oss4_property_probe_find_device_name (obj, fd, device_handle, device_name); close (fd); return res; } static GList * gst_oss4_property_probe_get_mixer_devices (GstObject * obj, int fd, struct oss_sysinfo *si) { GList *m, *mixers = NULL; GList *devices = NULL; int i; GST_LOG_OBJECT (obj, "%d mixer devices", si->nummixers); /* first, find suitable mixer devices and sort by priority */ for (i = 0; i < si->nummixers; ++i) { struct oss_mixerinfo mi = { 0, }; mi.dev = i; if (ioctl (fd, SNDCTL_MIXERINFO, &mi) == -1) { GST_DEBUG_OBJECT (obj, "MIXERINFO ioctl for device %d failed", i); continue; } GST_INFO_OBJECT (obj, "mixer device %d:", i); GST_INFO_OBJECT (obj, " enabled : %s", (mi.enabled) ? "yes" : "no (powered off or unplugged)"); GST_INFO_OBJECT (obj, " priority : %d", mi.priority); GST_INFO_OBJECT (obj, " devnode : %s", mi.devnode); GST_INFO_OBJECT (obj, " handle : %s", mi.handle); GST_INFO_OBJECT (obj, " caps : 0x%02x", mi.caps); GST_INFO_OBJECT (obj, " name : %s", mi.name); if (!mi.enabled) { GST_DEBUG_OBJECT (obj, "mixer device is not usable/enabled, skipping"); continue; } /* only want mixers that control hardware directly */ if ((mi.caps & MIXER_CAP_VIRTUAL)) { GST_DEBUG_OBJECT (obj, "mixer device is a virtual device, skipping"); continue; } mixers = g_list_insert_sorted (mixers, g_memdup (&mi, sizeof (mi)), (GCompareFunc) oss4_mixerinfo_priority_cmp); } /* then create device list according to priority */ for (m = mixers; m != NULL; m = m->next) { struct oss_mixerinfo *mi = (struct oss_mixerinfo *) m->data; GST_LOG_OBJECT (obj, "mixer device: '%s'", mi->devnode); devices = g_list_prepend (devices, g_strdup (mi->devnode)); g_free (m->data); } g_list_free (mixers); mixers = NULL; return g_list_reverse (devices); } static GList * gst_oss4_property_probe_get_audio_devices (GstObject * obj, int fd, struct oss_sysinfo *si, int cap_mask) { GList *devices = NULL; int i; GST_LOG_OBJECT (obj, "%d audio/dsp devices", si->numaudios); for (i = 0; i < si->numaudios; ++i) { struct oss_audioinfo ai = { 0, }; ai.dev = i; if (ioctl (fd, SNDCTL_AUDIOINFO, &ai) == -1) { GST_DEBUG_OBJECT (obj, "AUDIOINFO ioctl for device %d failed", i); continue; } if ((ai.caps & cap_mask) == 0) { GST_DEBUG_OBJECT (obj, "audio device %d is not an %s device", i, (cap_mask == PCM_CAP_OUTPUT) ? "output" : "input"); continue; } if (!ai.enabled) { GST_DEBUG_OBJECT (obj, "audio device %d is not usable/enabled", i); continue; } GST_DEBUG_OBJECT (obj, "audio device %d looks ok: %s (\"%s\")", i, ai.devnode, ai.name); devices = g_list_prepend (devices, g_strdup (ai.devnode)); } return g_list_reverse (devices); } static GValueArray * gst_oss4_property_probe_get_values (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec) { struct oss_sysinfo si = { {0,}, }; GValueArray *array = NULL; GstObject *obj; GList *devices, *l; int cap_mask, fd = -1; if (!g_str_equal (pspec->name, "device")) { G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); return NULL; } obj = GST_OBJECT (probe); GST_OBJECT_LOCK (obj); /* figure out whether the element is a source or sink */ if (GST_IS_OSS4_SINK (probe)) { GST_DEBUG_OBJECT (probe, "probing available output devices"); cap_mask = PCM_CAP_OUTPUT; fd = GST_OSS4_SINK (probe)->fd; } else if (GST_IS_OSS4_SOURCE (probe)) { GST_DEBUG_OBJECT (probe, "probing available input devices"); cap_mask = PCM_CAP_INPUT; fd = GST_OSS4_SOURCE (probe)->fd; } else if (GST_IS_OSS4_MIXER (probe)) { fd = GST_OSS4_MIXER (probe)->fd; cap_mask = 0; } else { GST_OBJECT_UNLOCK (obj); g_return_val_if_reached (NULL); } /* copy fd if it's open, so we can just unconditionally close() later */ if (fd != -1) fd = dup (fd); /* this will also catch the unlikely case where the above dup() failed */ if (fd == -1) { fd = open ("/dev/mixer", O_RDONLY | O_NONBLOCK, 0); if (fd < 0) goto open_failed; else if (!gst_oss4_audio_check_version (GST_OBJECT (probe), fd)) goto legacy_oss; } if (ioctl (fd, SNDCTL_SYSINFO, &si) == -1) goto no_sysinfo; if (cap_mask != 0) { devices = gst_oss4_property_probe_get_audio_devices (obj, fd, &si, cap_mask); } else { devices = gst_oss4_property_probe_get_mixer_devices (obj, fd, &si); } if (devices == NULL) { GST_DEBUG_OBJECT (obj, "No devices found"); goto done; } array = g_value_array_new (1); for (l = devices; l != NULL; l = l->next) { GValue val = { 0, }; g_value_init (&val, G_TYPE_STRING); g_value_take_string (&val, (gchar *) l->data); l->data = NULL; g_value_array_append (array, &val); g_value_unset (&val); } GST_OBJECT_UNLOCK (obj); g_list_free (devices); done: close (fd); return array; /* ERRORS */ open_failed: { GST_OBJECT_UNLOCK (GST_OBJECT (probe)); GST_WARNING_OBJECT (probe, "Can't open file descriptor to probe " "available devices: %s", g_strerror (errno)); return NULL; } legacy_oss: { close (fd); GST_OBJECT_UNLOCK (GST_OBJECT (probe)); GST_DEBUG_OBJECT (probe, "Legacy OSS (ie. not OSSv4), not supported"); return NULL; } no_sysinfo: { close (fd); GST_OBJECT_UNLOCK (GST_OBJECT (probe)); GST_WARNING_OBJECT (probe, "Can't open file descriptor to probe " "available devices: %s", g_strerror (errno)); return NULL; } } static void gst_oss4_property_probe_interface_init (GstPropertyProbeInterface * iface) { iface->get_properties = gst_oss4_property_probe_get_properties; iface->probe_property = gst_oss4_property_probe_probe_property; iface->needs_probe = gst_oss4_property_probe_needs_probe; iface->get_values = gst_oss4_property_probe_get_values; } void gst_oss4_add_property_probe_interface (GType type) { static const GInterfaceInfo probe_iface_info = { (GInterfaceInitFunc) gst_oss4_property_probe_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &probe_iface_info); } gst-plugins-good-0.10.31/sys/oss4/oss4-property-probe.h0000644000175000017500000000316111671175354017550 00000000000000/* GStreamer OSS4 audio property probe interface implementation * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_PROPERTY_PROBE_H #define GST_OSS4_PROPERTY_PROBE_H #include void gst_oss4_add_property_probe_interface (GType type); gboolean gst_oss4_property_probe_find_device_name (GstObject * obj, int fd, const gchar * device_handle, gchar ** device_name); gboolean gst_oss4_property_probe_find_device_name_nofd (GstObject * obj, const gchar * device_handle, gchar ** device_name); #endif /* GST_OSS4_PROPERTY_PROBE_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-mixer.c0000644000175000017500000015417611677341660015714 00000000000000/* GStreamer OSS4 mixer implementation * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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 mixer library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:element-oss4mixer * * This element lets you adjust sound input and output levels with the * Open Sound System (OSS) version 4. It supports the GstMixer interface, which * can be used to obtain a list of available mixer tracks. Set the mixer * element to READY state before using the GstMixer interface on it. * * * Example pipelines * * oss4mixer can't be used in a sensible way in gst-launch. * * * * Since: 0.10.7 */ /* Note: ioctl calls on the same open mixer device are serialised via * the object lock to make sure we don't do concurrent ioctls from two * different threads (e.g. app thread and mixer watch thread), since that * will probably confuse OSS. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include "gst/glib-compat-private.h" #include #define NO_LEGACY_MIXER #include "oss4-audio.h" #include "oss4-mixer.h" #include "oss4-mixer-enum.h" #include "oss4-mixer-slider.h" #include "oss4-mixer-switch.h" #include "oss4-property-probe.h" #include "oss4-soundcard.h" #define GST_OSS4_MIXER_WATCH_INTERVAL 500 /* in millisecs, ie. 0.5s */ GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); #define GST_CAT_DEFAULT oss4mixer_debug #define DEFAULT_DEVICE NULL #define DEFAULT_DEVICE_NAME NULL enum { PROP_0, PROP_DEVICE, PROP_DEVICE_NAME }; static void gst_oss4_mixer_init_interfaces (GType type); GST_BOILERPLATE_FULL (GstOss4Mixer, gst_oss4_mixer, GstElement, GST_TYPE_ELEMENT, gst_oss4_mixer_init_interfaces); static GstStateChangeReturn gst_oss4_mixer_change_state (GstElement * element, GstStateChange transition); static void gst_oss4_mixer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_oss4_mixer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_oss4_mixer_finalize (GObject * object); static gboolean gst_oss4_mixer_open (GstOss4Mixer * mixer, gboolean silent_errors); static void gst_oss4_mixer_close (GstOss4Mixer * mixer); static gboolean gst_oss4_mixer_enum_control_update_enum_list (GstOss4Mixer * m, GstOss4MixerControl * mc); #ifndef GST_DISABLE_GST_DEBUG static const gchar *mixer_ext_type_get_name (gint type); static const gchar *mixer_ext_flags_get_string (gint flags); #endif static void gst_oss4_mixer_base_init (gpointer klass) { gst_element_class_set_details_simple (GST_ELEMENT_CLASS (klass), "OSS v4 Audio Mixer", "Generic/Audio", "Control sound input and output levels with OSS4", "Tim-Philipp Müller "); } static void gst_oss4_mixer_class_init (GstOss4MixerClass * klass) { GstElementClass *element_class; GObjectClass *gobject_class; element_class = (GstElementClass *) klass; gobject_class = (GObjectClass *) klass; gobject_class->finalize = gst_oss4_mixer_finalize; gobject_class->set_property = gst_oss4_mixer_set_property; gobject_class->get_property = gst_oss4_mixer_get_property; /** * GstOss4Mixer:device * * OSS4 mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) * **/ g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "OSS mixer device (e.g. /dev/oss/hdaudio0/mix0 or /dev/mixerN) " "(NULL = use first mixer device found)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstOss4Mixer:device-name * * Human-readable name of the sound device. May be NULL if the device is * not open (ie. when the mixer is in NULL state) * **/ g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); element_class->change_state = GST_DEBUG_FUNCPTR (gst_oss4_mixer_change_state); } static void gst_oss4_mixer_finalize (GObject * obj) { GstOss4Mixer *mixer = GST_OSS4_MIXER (obj); g_free (mixer->device); G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_oss4_mixer_reset (GstOss4Mixer * mixer) { mixer->fd = -1; mixer->need_update = TRUE; memset (&mixer->last_mixext, 0, sizeof (oss_mixext)); } static void gst_oss4_mixer_init (GstOss4Mixer * mixer, GstOss4MixerClass * g_class) { mixer->device = g_strdup (DEFAULT_DEVICE); mixer->device_name = NULL; gst_oss4_mixer_reset (mixer); } static void gst_oss4_mixer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOss4Mixer *mixer = GST_OSS4_MIXER (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (mixer); if (!GST_OSS4_MIXER_IS_OPEN (mixer)) { g_free (mixer->device); mixer->device = g_value_dup_string (value); /* unset any cached device-name */ g_free (mixer->device_name); mixer->device_name = NULL; } else { g_warning ("%s: can't change \"device\" property while mixer is open", GST_OBJECT_NAME (mixer)); } GST_OBJECT_UNLOCK (mixer); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss4_mixer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOss4Mixer *mixer = GST_OSS4_MIXER (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (mixer); g_value_set_string (value, mixer->device); GST_OBJECT_UNLOCK (mixer); break; case PROP_DEVICE_NAME: GST_OBJECT_LOCK (mixer); /* If device is set, try to retrieve the name even if we're not open */ if (mixer->fd == -1 && mixer->device != NULL) { if (gst_oss4_mixer_open (mixer, TRUE)) { g_value_set_string (value, mixer->device_name); gst_oss4_mixer_close (mixer); } else { g_value_set_string (value, mixer->device_name); } } else { g_value_set_string (value, mixer->device_name); } GST_OBJECT_UNLOCK (mixer); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_oss4_mixer_open (GstOss4Mixer * mixer, gboolean silent_errors) { struct oss_mixerinfo mi = { 0, }; gchar *device; g_return_val_if_fail (!GST_OSS4_MIXER_IS_OPEN (mixer), FALSE); if (mixer->device) device = g_strdup (mixer->device); else device = gst_oss4_audio_find_device (GST_OBJECT_CAST (mixer)); /* desperate times, desperate measures */ if (device == NULL) device = g_strdup ("/dev/mixer"); GST_INFO_OBJECT (mixer, "Trying to open OSS4 mixer device '%s'", device); mixer->fd = open (device, O_RDWR, 0); if (mixer->fd < 0) goto open_failed; /* Make sure it's OSS4. If it's old OSS, let the old ossmixer handle it */ if (!gst_oss4_audio_check_version (GST_OBJECT (mixer), mixer->fd)) goto legacy_oss; GST_INFO_OBJECT (mixer, "Opened mixer device '%s', which is mixer %d", device, mi.dev); /* Get device name for currently open fd */ mi.dev = -1; if (ioctl (mixer->fd, SNDCTL_MIXERINFO, &mi) == 0) { mixer->modify_counter = mi.modify_counter; if (mi.name[0] != '\0') { mixer->device_name = g_strdup (mi.name); } } else { mixer->modify_counter = 0; } if (mixer->device_name == NULL) { mixer->device_name = g_strdup ("Unknown"); } GST_INFO_OBJECT (mixer, "device name = '%s'", mixer->device_name); mixer->open_device = device; return TRUE; /* ERRORS */ open_failed: { if (!silent_errors) { GST_ELEMENT_ERROR (mixer, RESOURCE, OPEN_READ_WRITE, (_("Could not open audio device for mixer control handling.")), GST_ERROR_SYSTEM); } else { GST_DEBUG_OBJECT (mixer, "open failed: %s (ignoring errors)", g_strerror (errno)); } g_free (device); return FALSE; } legacy_oss: { gst_oss4_mixer_close (mixer); if (!silent_errors) { GST_ELEMENT_ERROR (mixer, RESOURCE, OPEN_READ_WRITE, (_("Could not open audio device for mixer control handling. " "This version of the Open Sound System is not supported by this " "element.")), ("Try the 'ossmixer' element instead")); } else { GST_DEBUG_OBJECT (mixer, "open failed: legacy oss (ignoring errors)"); } g_free (device); return FALSE; } } static void gst_oss4_mixer_control_free (GstOss4MixerControl * mc) { g_list_free (mc->children); g_list_free (mc->mute_group); g_free (mc->enum_vals); memset (mc, 0, sizeof (GstOss4MixerControl)); g_free (mc); } static void gst_oss4_mixer_free_tracks (GstOss4Mixer * mixer) { g_list_foreach (mixer->tracks, (GFunc) g_object_unref, NULL); g_list_free (mixer->tracks); mixer->tracks = NULL; g_list_foreach (mixer->controls, (GFunc) gst_oss4_mixer_control_free, NULL); g_list_free (mixer->controls); mixer->controls = NULL; } static void gst_oss4_mixer_close (GstOss4Mixer * mixer) { g_free (mixer->device_name); mixer->device_name = NULL; g_free (mixer->open_device); mixer->open_device = NULL; gst_oss4_mixer_free_tracks (mixer); if (mixer->fd != -1) { close (mixer->fd); mixer->fd = -1; } gst_oss4_mixer_reset (mixer); } static void gst_oss4_mixer_watch_process_changes (GstOss4Mixer * mixer) { GList *c, *t, *tracks = NULL; GST_INFO_OBJECT (mixer, "mixer interface or control changed"); /* this is all with the mixer object lock held */ /* we go through the list backwards so we can bail out faster when the entire * interface needs to be rebuilt */ for (c = g_list_last (mixer->controls); c != NULL; c = c->prev) { GstOss4MixerControl *mc = c->data; oss_mixer_value ossval = { 0, }; mc->changed = FALSE; mc->list_changed = FALSE; /* not interested in controls we don't expose in the mixer interface */ if (!mc->used) continue; /* don't try to read a value from controls that don't have one */ if (mc->mixext.type == MIXT_DEVROOT || mc->mixext.type == MIXT_GROUP) continue; /* is this an enum control whose list may change? */ if (mc->mixext.type == MIXT_ENUM && mc->enum_version != 0) { if (gst_oss4_mixer_enum_control_update_enum_list (mixer, mc)) mc->list_changed = TRUE; } ossval.dev = mc->mixext.dev; ossval.ctrl = mc->mixext.ctrl; ossval.timestamp = mc->mixext.timestamp; if (ioctl (mixer->fd, SNDCTL_MIX_READ, &ossval) == -1) { if (errno == EIDRM || errno == EFAULT) { GST_DEBUG ("%s has disappeared", mc->mixext.extname); goto mixer_changed; } GST_WARNING_OBJECT (mixer, "MIX_READ failed: %s", g_strerror (errno)); /* just ignore, move on to next one */ continue; } if (ossval.value == mc->last_val) { /* no change */ /* GST_LOG_OBJECT (mixer, "%s hasn't changed", mc->mixext.extname); */ continue; } mc->last_val = ossval.value; GST_LOG_OBJECT (mixer, "%s changed value to %u 0x%08x", mc->mixext.extname, ossval.value, ossval.value); mc->changed = TRUE; } /* copy list and take track refs, so we can safely drop the object lock, * which we need to do to be able to post messages on the bus */ tracks = g_list_copy (mixer->tracks); g_list_foreach (tracks, (GFunc) g_object_ref, NULL); GST_OBJECT_UNLOCK (mixer); /* since we don't know (or want to know exactly) which controls belong to * which track, we just go through the tracks one-by-one now and make them * check themselves if any of their controls have changed and which messages * to post on the bus as a result */ for (t = tracks; t != NULL; t = t->next) { GstMixerTrack *track = t->data; if (GST_IS_OSS4_MIXER_SLIDER (track)) { gst_oss4_mixer_slider_process_change_unlocked (track); } else if (GST_IS_OSS4_MIXER_SWITCH (track)) { gst_oss4_mixer_switch_process_change_unlocked (track); } else if (GST_IS_OSS4_MIXER_ENUM (track)) { gst_oss4_mixer_enum_process_change_unlocked (track); } g_object_unref (track); } g_list_free (tracks); GST_OBJECT_LOCK (mixer); return; mixer_changed: { GST_OBJECT_UNLOCK (mixer); gst_mixer_mixer_changed (GST_MIXER (mixer)); GST_OBJECT_LOCK (mixer); return; } } /* This thread watches the mixer for changes in a somewhat inefficient way * (running an ioctl every half second or so). This is still better and * cheaper than apps polling all tracks for changes a few times a second * though. Needs more thought. There's probably (hopefully) a way to get * notifications via the fd directly somehow. */ static gpointer gst_oss4_mixer_watch_thread (gpointer thread_data) { GstOss4Mixer *mixer = GST_OSS4_MIXER_CAST (thread_data); GST_DEBUG_OBJECT (mixer, "watch thread running"); GST_OBJECT_LOCK (mixer); while (!mixer->watch_shutdown) { oss_mixerinfo mi = { 0, }; GTimeVal tv; mi.dev = -1; if (ioctl (mixer->fd, SNDCTL_MIXERINFO, &mi) == 0) { if (mixer->modify_counter != mi.modify_counter) { /* GST_LOG ("processing changes"); */ gst_oss4_mixer_watch_process_changes (mixer); mixer->modify_counter = mi.modify_counter; } else { /* GST_LOG ("no changes"); */ } } else { GST_WARNING_OBJECT (mixer, "MIXERINFO failed: %s", g_strerror (errno)); } /* we could move the _get_current_time out of the loop and just do the * add in ever iteration, which would be less exact, but who cares */ g_get_current_time (&tv); g_time_val_add (&tv, GST_OSS4_MIXER_WATCH_INTERVAL * 1000); (void) g_cond_timed_wait (mixer->watch_cond, GST_OBJECT_GET_LOCK (mixer), &tv); } GST_OBJECT_UNLOCK (mixer); GST_DEBUG_OBJECT (mixer, "watch thread done"); gst_object_unref (mixer); return NULL; } /* call with object lock held */ static void gst_oss4_mixer_wake_up_watch_task (GstOss4Mixer * mixer) { GST_LOG_OBJECT (mixer, "signalling watch thread to wake up"); g_cond_signal (mixer->watch_cond); } static void gst_oss4_mixer_stop_watch_task (GstOss4Mixer * mixer) { if (mixer->watch_thread) { GST_OBJECT_LOCK (mixer); mixer->watch_shutdown = TRUE; GST_LOG_OBJECT (mixer, "signalling watch thread to stop"); g_cond_signal (mixer->watch_cond); GST_OBJECT_UNLOCK (mixer); GST_LOG_OBJECT (mixer, "waiting for watch thread to join"); g_thread_join (mixer->watch_thread); GST_DEBUG_OBJECT (mixer, "watch thread stopped"); mixer->watch_thread = NULL; } if (mixer->watch_cond) { g_cond_free (mixer->watch_cond); mixer->watch_cond = NULL; } } static void gst_oss4_mixer_start_watch_task (GstOss4Mixer * mixer) { GError *err = NULL; mixer->watch_cond = g_cond_new (); mixer->watch_shutdown = FALSE; #if !GLIB_CHECK_VERSION (2, 31, 0) mixer->watch_thread = g_thread_create (gst_oss4_mixer_watch_thread, gst_object_ref (mixer), TRUE, &err); #else mixer->watch_thread = g_thread_try_new ("oss4-mixer-thread", gst_oss4_mixer_watch_thread, gst_object_ref (mixer), &err); #endif if (mixer->watch_thread == NULL) { GST_ERROR_OBJECT (mixer, "Could not create watch thread: %s", err->message); g_cond_free (mixer->watch_cond); mixer->watch_cond = NULL; g_error_free (err); } } static GstStateChangeReturn gst_oss4_mixer_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstOss4Mixer *mixer = GST_OSS4_MIXER (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_oss4_mixer_open (mixer, FALSE)) return GST_STATE_CHANGE_FAILURE; gst_oss4_mixer_start_watch_task (mixer); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_oss4_mixer_stop_watch_task (mixer); gst_oss4_mixer_close (mixer); break; default: break; } return ret; } /* === GstMixer interface === */ static inline gboolean gst_oss4_mixer_contains_track (GstMixer * mixer, GstMixerTrack * track) { return (g_list_find (GST_OSS4_MIXER (mixer)->tracks, track) != NULL); } static inline gboolean gst_oss4_mixer_contains_options (GstMixer * mixer, GstMixerOptions * options) { return (g_list_find (GST_OSS4_MIXER (mixer)->tracks, options) != NULL); } static void gst_oss4_mixer_post_mixer_changed_msg (GstOss4Mixer * mixer) { /* only post mixer-changed message once */ if (!mixer->need_update) { gst_mixer_mixer_changed (GST_MIXER (mixer)); mixer->need_update = TRUE; } } /* call with mixer object lock held to serialise ioctl */ gboolean gst_oss4_mixer_get_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc, int *val) { oss_mixer_value ossval = { 0, }; if (GST_OBJECT_TRYLOCK (mixer)) { GST_ERROR ("must be called with mixer lock held"); GST_OBJECT_UNLOCK (mixer); } ossval.dev = mc->mixext.dev; ossval.ctrl = mc->mixext.ctrl; ossval.timestamp = mc->mixext.timestamp; if (ioctl (mixer->fd, SNDCTL_MIX_READ, &ossval) == -1) { if (errno == EIDRM) { GST_DEBUG_OBJECT (mixer, "MIX_READ failed: mixer interface has changed"); gst_oss4_mixer_post_mixer_changed_msg (mixer); } else { GST_WARNING_OBJECT (mixer, "MIX_READ failed: %s", g_strerror (errno)); } *val = 0; mc->last_val = 0; return FALSE; } *val = ossval.value; mc->last_val = ossval.value; GST_LOG_OBJECT (mixer, "got value 0x%08x from %s)", *val, mc->mixext.extname); return TRUE; } /* call with mixer object lock held to serialise ioctl */ gboolean gst_oss4_mixer_set_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc, int val) { oss_mixer_value ossval = { 0, }; ossval.dev = mc->mixext.dev; ossval.ctrl = mc->mixext.ctrl; ossval.timestamp = mc->mixext.timestamp; ossval.value = val; if (GST_OBJECT_TRYLOCK (mixer)) { GST_ERROR ("must be called with mixer lock held"); GST_OBJECT_UNLOCK (mixer); } if (ioctl (mixer->fd, SNDCTL_MIX_WRITE, &ossval) == -1) { if (errno == EIDRM) { GST_LOG_OBJECT (mixer, "MIX_WRITE failed: mixer interface has changed"); gst_oss4_mixer_post_mixer_changed_msg (mixer); } else { GST_WARNING_OBJECT (mixer, "MIX_WRITE failed: %s", g_strerror (errno)); } return FALSE; } mc->last_val = val; GST_LOG_OBJECT (mixer, "set value 0x%08x on %s", val, mc->mixext.extname); return TRUE; } #if 0 static gchar * gst_oss4_mixer_control_get_pretty_name (GstOss4MixerControl * mc) { gchar *name; const gchar *name, *u; /* "The id field is the original name given by the driver when it called * mixer_ext_create_control. This name can be used by fully featured GUI * mixers. However this name should be downshifted and cut before the last * underscore ("_") to get the proper name. For example mixer control name * created as "MYDRV_MAINVOL" will become just "mainvol" after this * transformation." */ name = mc->mixext.extname; u = MAX (strrchr (name, '_'), strrchr (name, '.')); if (u != NULL) name = u + 1; /* maybe capitalize the first letter? */ return g_ascii_strdown (name, -1); /* the .id thing doesn't really seem to work right, ie. for some sliders * it's just '-' so you have to use the name of the parent control etc. * let's not use it for now, much too painful. */ if (g_str_has_prefix (mc->mixext.extname, "misc.")) name = g_strdup (mc->mixext.extname + 5); else name = g_strdup (mc->mixext.extname); /* chop off trailing digit (only one for now) */ if (strlen (name) > 0 && g_ascii_isdigit (name[strlen (name) - 1])) name[strlen (name) - 1] = '\0'; g_strdelimit (name, ".", ' '); return name; } #endif /* these translations are a bit ad-hoc and horribly incomplete; it is not * really going to work this way with all the different chipsets and drivers. * We also use these for translating option values. */ static struct { const gchar oss_name[32]; const gchar *label; } labels[] = { { "volume", N_("Volume")}, { "master", N_("Master")}, { "front", N_("Front")}, { "rear", N_("Rear")}, { "headphones", N_("Headphones")}, { "center", N_("Center")}, { "lfe", N_("LFE")}, { "surround", N_("Surround")}, { "side", N_("Side")}, { "speaker", N_("Built-in Speaker")}, { "aux1-out", N_("AUX 1 Out")}, { "aux2-out", N_("AUX 2 Out")}, { "aux-out", N_("AUX Out")}, { "bass", N_("Bass")}, { "treble", N_("Treble")}, { "3d-depth", N_("3D Depth")}, { "3d-center", N_("3D Center")}, { "3d-enhance", N_("3D Enhance")}, { "phone", N_("Telephone")}, { "mic", N_("Microphone")}, { "line-out", N_("Line Out")}, { "line-in", N_("Line In")}, { "linein", N_("Line In")}, { "cd", N_("Internal CD")}, { "video", N_("Video In")}, { "aux1-in", N_("AUX 1 In")}, { "aux2-in", N_("AUX 2 In")}, { "aux-in", N_("AUX In")}, { "pcm", N_("PCM")}, { "record-gain", N_("Record Gain")}, { "igain", N_("Record Gain")}, { "ogain", N_("Output Gain")}, { "micboost", N_("Microphone Boost")}, { "loopback", N_("Loopback")}, { "diag", N_("Diagnostic")}, { "loudness", N_("Bass Boost")}, { "outputs", N_("Playback Ports")}, { "input", N_("Input")}, { "inputs", N_("Record Source")}, { "record-source", N_("Record Source")}, { "monitor-source", N_("Monitor Source")}, { "beep", N_("Keyboard Beep")}, { "monitor-gain", N_("Monitor")}, { "stereo-simulate", N_("Simulate Stereo")}, { "stereo", N_("Stereo")}, { "multich", N_("Surround Sound")}, { "mic-gain", N_("Microphone Gain")}, { "speaker-source", N_("Speaker Source")}, { "mic-source", N_("Microphone Source")}, { "jack", N_("Jack")}, { "center/lfe", N_("Center / LFE")}, { "stereo-mix", N_("Stereo Mix")}, { "mono-mix", N_("Mono Mix")}, { "input-mix", N_("Input Mix")}, { "spdif-in", N_("SPDIF In")}, { "spdif-out", N_("SPDIF Out")}, { "mic1", N_("Microphone 1")}, { "mic2", N_("Microphone 2")}, { "digital-out", N_("Digital Out")}, { "digital-in", N_("Digital In")}, { "hdmi", N_("HDMI")}, { "modem", N_("Modem")}, { "handset", N_("Handset")}, { "other", N_("Other")}, { "stereo", N_("Stereo")}, { "none", N_("None")}, { "on", N_("On")}, { "off", N_("Off")}, { "mute", N_("Mute")}, { "fast", N_("Fast")}, { /* TRANSLATORS: "Very Low" is a quality setting here */ "very-low", N_("Very Low")}, { /* TRANSLATORS: "Low" is a quality setting here */ "low", N_("Low")}, { /* TRANSLATORS: "Medium" is a quality setting here */ "medium", N_("Medium")}, { /* TRANSLATORS: "High" is a quality setting here */ "high", N_("High")}, { /* TRANSLATORS: "Very High" is a quality setting here */ "very-high", N_("Very High")}, { "high+", N_("Very High")}, { /* TRANSLATORS: "Production" is a quality setting here */ "production", N_("Production")}, { "fp-mic", N_("Front Panel Microphone")}, { "fp-linein", N_("Front Panel Line In")}, { "fp-headphones", N_("Front Panel Headphones")}, { "fp-lineout", N_("Front Panel Line Out")}, { "green", N_("Green Connector")}, { "pink", N_("Pink Connector")}, { "blue", N_("Blue Connector")}, { "white", N_("White Connector")}, { "black", N_("Black Connector")}, { "gray", N_("Gray Connector")}, { "orange", N_("Orange Connector")}, { "red", N_("Red Connector")}, { "yellow", N_("Yellow Connector")}, { "fp-green", N_("Green Front Panel Connector")}, { "fp-pink", N_("Pink Front Panel Connector")}, { "fp-blue", N_("Blue Front Panel Connector")}, { "fp-white", N_("White Front Panel Connector")}, { "fp-black", N_("Black Front Panel Connector")}, { "fp-gray", N_("Gray Front Panel Connector")}, { "fp-orange", N_("Orange Front Panel Connector")}, { "fp-red", N_("Red Front Panel Connector")}, { "fp-yellow", N_("Yellow Front Panel Connector")}, { "spread", N_("Spread Output")}, { "downmix", N_("Downmix")}, /* FIXME translate Audigy NX USB labels) */ /* { "rec.src", N_("Record Source") }, { "output.mute", N_("Mute output") } headph (Controller group) headph.src (Enumeration control) headph.mute (On/Off switch) digital2 (Controller group) digital2.src (Enumeration control) digital2.mute (On/Off switch) digital (Controller group) digital.mute1 (On/Off switch) digital.vol (Controller group) digital.vol.front (Stereo slider (0-255)) digital.vol.surr (Stereo slider (0-255)) digital.vol.c/l (Stereo slider (0-255)) digital.vol.center (Stereo slider (0-255)) digital.mute2 (On/Off switch) digital.vol (Stereo slider (0-255)) line (Controller group) line.mute (On/Off switch) line.vol (Stereo slider (0-255)) play-altset (Enumeration control) rec-altset (Enumeration control) */ }; /* Decent i18n is pretty much impossible with OSS's way of providing us with * mixer labels (and the fact that they are pretty much random), but that * doesn't mean we shouldn't at least try. */ static gchar * gst_oss4_mixer_control_get_translated_name (GstOss4MixerControl * mc) { gchar name[128] = { 0, }; gchar vmix_str[32] = { '\0', }; gchar *ptr; int dummy, i; int num = -1; gboolean function_suffix = FALSE; /* main virtual mixer controls (we hide the stream volumes) */ if (sscanf (mc->mixext.extname, "vmix%d-%32c", &dummy, vmix_str) == 2) { if (strcmp (vmix_str, "src") == 0) return g_strdup (_("Virtual Mixer Input")); else if (strcmp (vmix_str, "vol") == 0) return g_strdup (_("Virtual Mixer Output")); else if (strcmp (vmix_str, "channels") == 0) return g_strdup (_("Virtual Mixer Channels")); } g_strlcpy (name, mc->mixext.extname, sizeof (name)); /* we deal with either "connector." or "jack." */ if ((g_str_has_prefix (name, "connector.")) || (g_str_has_prefix (name, "jack."))) { ptr = strchr (mc->mixext.extname, '.'); ptr++; g_strlcpy (name, ptr, sizeof (name)); } /* special handling for jack retasking suffixes */ if (g_str_has_suffix (name, ".function") || g_str_has_suffix (name, ".mode")) { function_suffix = TRUE; ptr = strrchr (name, '.'); *ptr = 0; } /* parse off trailing numbers */ i = strlen (name); while ((i > 0) && (g_ascii_isdigit (name[i - 1]))) { i--; } /* the check catches the case where the control name is just a number */ if ((i > 0) && (name[i] != '\0')) { num = atoi (name + i); name[i] = '\0'; } /* look for a match, progressively skipping '.' delimited prefixes as we go */ ptr = name; do { if (*ptr == '.') ptr++; for (i = 0; i < G_N_ELEMENTS (labels); ++i) { if (g_ascii_strcasecmp (ptr, labels[i].oss_name) == 0) { g_strlcpy (name, _(labels[i].label), sizeof (name)); goto append_suffixes; } } } while ((ptr = strchr (ptr, '.')) != NULL); /* failing that, just replace periods with spaces */ g_strdelimit (name, ".", ' '); append_suffixes: if (num > -1) { if (function_suffix) { /* TRANSLATORS: name + number of a volume mixer control */ return g_strdup_printf (_("%s %d Function"), name, num); } else { return g_strdup_printf ("%s %d", name, num); } } else { if (function_suffix) { /* TRANSLATORS: name of a volume mixer control */ return g_strdup_printf (_("%s Function"), name); } else { return g_strdup (name); } } } static const gchar * gst_oss4_mixer_control_get_translated_option (const gchar * name) { int i; for (i = 0; i < G_N_ELEMENTS (labels); ++i) { if (g_ascii_strcasecmp (name, labels[i].oss_name) == 0) { return _(labels[i].label); } } return (name); } #ifndef GST_DISABLE_GST_DEBUG static const gchar * mixer_ext_type_get_name (gint type) { switch (type) { case MIXT_DEVROOT: return "Device root entry"; case MIXT_GROUP: return "Controller group"; case MIXT_ONOFF: return "On/Off switch"; case MIXT_ENUM: return "Enumeration control"; case MIXT_MONOSLIDER: return "Mono slider (0-255)"; case MIXT_STEREOSLIDER: return "Stereo slider (0-255)"; case MIXT_MESSAGE: return "Textual message"; /* whatever this is */ case MIXT_MONOVU: return "Mono VU meter value"; case MIXT_STEREOVU: return "Stereo VU meter value"; case MIXT_MONOPEAK: return "Mono VU meter peak value"; case MIXT_STEREOPEAK: return "Stereo VU meter peak value"; case MIXT_RADIOGROUP: return "Radio button group"; case MIXT_MARKER: /* Separator between normal and extension entries */ return "Separator"; case MIXT_VALUE: return "Decimal value entry"; case MIXT_HEXVALUE: return "Hex value entry"; case MIXT_SLIDER: return "Mono slider (31-bit value range)"; case MIXT_3D: return "3D"; /* what's this? */ case MIXT_MONOSLIDER16: return "Mono slider (0-32767)"; case MIXT_STEREOSLIDER16: return "Stereo slider (0-32767)"; case MIXT_MUTE: return "Mute switch"; default: break; } return "unknown"; } #endif /* GST_DISABLE_GST_DEBUG */ #ifndef GST_DISABLE_GST_DEBUG static const gchar * mixer_ext_flags_get_string (gint flags) { struct { gint flag; gchar nick[16]; } all_flags[] = { /* first the important ones */ { MIXF_MAINVOL, "MAINVOL"}, { MIXF_PCMVOL, "PCMVOL"}, { MIXF_RECVOL, "RECVOL"}, { MIXF_MONVOL, "MONVOL"}, { MIXF_DESCR, "DESCR"}, /* now the rest in the right order */ { MIXF_READABLE, "READABLE"}, { MIXF_WRITEABLE, "WRITABLE"}, { MIXF_POLL, "POLL"}, { MIXF_HZ, "HZ"}, { MIXF_STRING, "STRING"}, { MIXF_DYNAMIC, "DYNAMIC"}, { MIXF_OKFAIL, "OKFAIL"}, { MIXF_FLAT, "FLAT"}, { MIXF_LEGACY, "LEGACY"}, { MIXF_CENTIBEL, "CENTIBEL"}, { MIXF_DECIBEL, "DECIBEL"}, { MIXF_WIDE, "WIDE"} }; GString *s; GQuark q; gint i; if (flags == 0) return "None"; s = g_string_new (""); for (i = 0; i < G_N_ELEMENTS (all_flags); ++i) { if ((flags & all_flags[i].flag)) { if (s->len > 0) g_string_append (s, " | "); g_string_append (s, all_flags[i].nick); flags &= ~all_flags[i].flag; /* unset */ } } /* unknown flags? */ if (flags != 0) { if (s->len > 0) g_string_append (s, " | "); g_string_append (s, "???"); } /* we'll just put it into the global quark table (cheeky, eh?) */ q = g_quark_from_string (s->str); g_string_free (s, TRUE); return g_quark_to_string (q); } #endif /* GST_DISABLE_GST_DEBUG */ #ifndef GST_DISABLE_GST_DEBUG static void gst_oss4_mixer_control_dump_tree (GstOss4MixerControl * mc, gint depth) { GList *c; gchar spaces[64]; gint i; depth = MIN (sizeof (spaces) - 1, depth); for (i = 0; i < depth; ++i) spaces[i] = ' '; spaces[i] = '\0'; GST_LOG ("%s%s (%s)", spaces, mc->mixext.extname, mixer_ext_type_get_name (mc->mixext.type)); for (c = mc->children; c != NULL; c = c->next) { GstOss4MixerControl *child_mc = (GstOss4MixerControl *) c->data; gst_oss4_mixer_control_dump_tree (child_mc, depth + 2); } } #endif /* GST_DISABLE_GST_DEBUG */ static GList * gst_oss4_mixer_get_controls (GstOss4Mixer * mixer) { GstOss4MixerControl *root_mc = NULL; oss_mixerinfo mi = { 0, }; GList *controls = NULL; GList *l; guint i; /* Get info for currently open fd */ mi.dev = -1; if (ioctl (mixer->fd, SNDCTL_MIXERINFO, &mi) == -1) goto no_mixerinfo; if (mi.nrext <= 0) { GST_DEBUG ("mixer %s has no controls", mi.id); return NULL; } GST_INFO ("Reading controls for mixer %s", mi.id); for (i = 0; i < mi.nrext; ++i) { GstOss4MixerControl *mc; oss_mixext mix_ext = { 0, }; mix_ext.dev = mi.dev; mix_ext.ctrl = i; if (ioctl (mixer->fd, SNDCTL_MIX_EXTINFO, &mix_ext) == -1) { GST_DEBUG ("SNDCTL_MIX_EXTINFO failed on mixer %s, control %d: %s", mi.id, i, g_strerror (errno)); continue; } /* if this is the last one, save it for is-interface-up-to-date checking */ if (i == mi.nrext) mixer->last_mixext = mix_ext; mc = g_new0 (GstOss4MixerControl, 1); mc->mixext = mix_ext; /* both control_no and desc fields are pretty useless, ie. not always set, * if ever, so not listed here */ GST_INFO ("Control %d", mix_ext.ctrl); GST_INFO (" name : %s", mix_ext.extname); GST_INFO (" type : %s (%d)", mixer_ext_type_get_name (mix_ext.type), mix_ext.type); GST_INFO (" flags : %s (0x%04x)", mixer_ext_flags_get_string (mix_ext.flags), mix_ext.flags); GST_INFO (" parent : %d", mix_ext.parent); if (!MIXEXT_IS_ROOT (mix_ext)) { /* find parent (we assume it comes in the list before the child) */ for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *parent_mc = (GstOss4MixerControl *) l->data; if (parent_mc->mixext.ctrl == mix_ext.parent) { mc->parent = parent_mc; parent_mc->children = g_list_append (parent_mc->children, mc); break; } } if (mc->parent == NULL) { GST_ERROR_OBJECT (mixer, "couldn't find parent for control %d", i); g_free (mc); continue; } } else if (root_mc == NULL) { root_mc = mc; } else { GST_WARNING_OBJECT (mixer, "two root controls?!"); } controls = g_list_prepend (controls, mc); } #ifndef GST_DISABLE_GST_DEBUG gst_oss4_mixer_control_dump_tree (root_mc, 0); #endif return g_list_reverse (controls); /* ERRORS */ no_mixerinfo: { GST_WARNING ("SNDCTL_MIXERINFO failed on mixer device %s: %s", mi.id, g_strerror (errno)); return NULL; } } static void gst_oss4_mixer_controls_guess_master (GstOss4Mixer * mixer, const GList * controls) { GstOss4MixerControl *master_mc = NULL; const GList *l; for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; /* do we need to check if it's a slider type here? */ if ((mc->mixext.flags & MIXF_PCMVOL)) { GST_INFO_OBJECT (mixer, "First PCM control: %s", mc->mixext.extname); master_mc = mc; break; } if (((mc->mixext.flags & MIXF_MAINVOL)) && master_mc == NULL) { GST_INFO_OBJECT (mixer, "First main volume control: %s", mc->mixext.extname); master_mc = mc; } } if (master_mc != NULL) master_mc->is_master = TRUE; } /* type: -1 for all types, otherwise just return siblings with requested type */ static GList * gst_oss4_mixer_control_get_siblings (GstOss4MixerControl * mc, gint type) { GList *s, *siblings = NULL; if (mc->parent == NULL) return NULL; for (s = mc->parent->children; s != NULL; s = s->next) { GstOss4MixerControl *sibling = (GstOss4MixerControl *) s->data; if (mc != sibling && (type < 0 || sibling->mixext.type == type)) siblings = g_list_append (siblings, sibling); } return siblings; } static void gst_oss4_mixer_controls_find_sliders (GstOss4Mixer * mixer, const GList * controls) { const GList *l; for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; GList *s, *siblings; if (!MIXEXT_IS_SLIDER (mc->mixext) || mc->parent == NULL || mc->used) continue; mc->is_slider = TRUE; mc->used = TRUE; siblings = gst_oss4_mixer_control_get_siblings (mc, -1); /* Note: the names can be misleading and may not reflect the actual * hierarchy of the controls, e.g. it's possible that a slider is called * connector.green and the mute control then connector.green.mute, but * both controls are in fact siblings and both children of the group * 'green' instead of mute being a child of connector.green as the naming * would seem to suggest */ GST_LOG ("Slider: %s, parent=%s, %d siblings", mc->mixext.extname, mc->parent->mixext.extname, g_list_length (siblings)); for (s = siblings; s != NULL; s = s->next) { GstOss4MixerControl *sibling = (GstOss4MixerControl *) s->data; GST_LOG (" %s (%s)", sibling->mixext.extname, mixer_ext_type_get_name (sibling->mixext.type)); if (sibling->mixext.type == MIXT_MUTE || g_str_has_suffix (sibling->mixext.extname, ".mute")) { /* simple case: slider with single mute sibling. We assume the .mute * suffix in the name won't change - can't really do much else anyway */ if (sibling->mixext.type == MIXT_ONOFF || sibling->mixext.type == MIXT_MUTE) { GST_LOG (" mute control for %s is %s", mc->mixext.extname, sibling->mixext.extname); mc->mute = sibling; sibling->used = TRUE; } /* a group of .mute controls. We assume they are all switches here */ if (sibling->mixext.type == MIXT_GROUP) { GList *m; for (m = sibling->children; m != NULL; m = m->next) { GstOss4MixerControl *grouped_sibling = m->data; if (grouped_sibling->mixext.type == MIXT_ONOFF || grouped_sibling->mixext.type == MIXT_MUTE) { GST_LOG (" %s is grouped mute control for %s", grouped_sibling->mixext.extname, mc->mixext.extname); mc->mute_group = g_list_append (mc->mute_group, grouped_sibling); } } GST_LOG (" %s has a group of %d mute controls", mc->mixext.extname, g_list_length (mc->mute_group)); /* we don't mark the individual mute controls as used, only the * group control, as we still want individual switches for the * individual controls */ sibling->used = TRUE; } } } g_list_free (siblings); } } /* should be called with the mixer object lock held because of the ioctl; * returns TRUE if the list was read the first time or modified */ static gboolean gst_oss4_mixer_enum_control_update_enum_list (GstOss4Mixer * mixer, GstOss4MixerControl * mc) { oss_mixer_enuminfo ei = { 0, }; guint num_existing = 0; int i; /* count and existing values */ while (mc->enum_vals != NULL && mc->enum_vals[num_existing] != 0) ++num_existing; ei.dev = mc->mixext.dev; ei.ctrl = mc->mixext.ctrl; /* if we have create a generic list with numeric IDs already and the * number of values hasn't changed, then there's not much to do here */ if (mc->no_list && mc->enum_vals != NULL && num_existing == mc->mixext.maxvalue) { return FALSE; } /* if we have a list and it doesn't change, there's nothing to do either */ if (mc->enum_vals != NULL && mc->enum_version == 0) return FALSE; if (ioctl (mixer->fd, SNDCTL_MIX_ENUMINFO, &ei) == -1) { g_free (mc->enum_vals); mc->enum_vals = g_new0 (GQuark, mc->mixext.maxvalue + 1); GST_DEBUG ("no enum info available, creating numeric values from 0-%d", mc->mixext.maxvalue - 1); /* "It is possible that some enum controls don't have any name list * available. In this case the application should automatically generate * list of numbers (0 to N-1)" */ for (i = 0; i < mc->mixext.maxvalue; ++i) { gchar num_str[8]; g_snprintf (num_str, sizeof (num_str), "%d", i); mc->enum_vals[i] = g_quark_from_string (num_str); } mc->enum_version = 0; /* the only way to change is via maxvalue */ } else { /* old list same as current list? */ if (mc->enum_vals != NULL && mc->enum_version == ei.version) return FALSE; /* no list yet, or the list has changed */ GST_LOG ("%s", (mc->enum_vals) ? "enum list has changed" : "reading list"); if (ei.nvalues != mc->mixext.maxvalue) { GST_WARNING_OBJECT (mixer, "Enum: %s, nvalues %d != maxvalue %d", mc->mixext.extname, ei.nvalues, mc->mixext.maxvalue); mc->mixext.maxvalue = MIN (ei.nvalues, mc->mixext.maxvalue); } mc->mixext.maxvalue = MIN (mc->mixext.maxvalue, OSS_ENUM_MAXVALUE); g_free (mc->enum_vals); mc->enum_vals = g_new0 (GQuark, mc->mixext.maxvalue + 1); for (i = 0; i < mc->mixext.maxvalue; ++i) { GST_LOG (" %s", ei.strings + ei.strindex[i]); mc->enum_vals[i] = g_quark_from_string (gst_oss4_mixer_control_get_translated_option (ei.strings + ei.strindex[i])); } } return TRUE; } static void gst_oss4_mixer_controls_find_enums (GstOss4Mixer * mixer, const GList * controls) { const GList *l; for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; if (mc->mixext.type != MIXT_ENUM || mc->used) continue; mc->is_enum = TRUE; mc->used = TRUE; /* Note: enums are special: for most controls, the maxvalue is inclusive, * but for enum controls it's actually exclusive (boggle), so that * mixext.maxvalue = num_values */ GST_LOG ("Enum: %s, parent=%s, num_enums=%d", mc->mixext.extname, mc->parent->mixext.extname, mc->mixext.maxvalue); gst_oss4_mixer_enum_control_update_enum_list (mixer, mc); } } static void gst_oss4_mixer_controls_find_switches (GstOss4Mixer * mixer, const GList * controls) { const GList *l; for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; if (mc->used) continue; if (mc->mixext.type != MIXT_ONOFF && mc->mixext.type != MIXT_MUTE) continue; mc->is_switch = TRUE; mc->used = TRUE; GST_LOG ("Switch: %s, parent=%s", mc->mixext.extname, mc->parent->mixext.extname); } } static void gst_oss4_mixer_controls_find_virtual (GstOss4Mixer * mixer, const GList * controls) { const GList *l; for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; /* or sscanf (mc->mixext.extname, "vmix%d-out.", &n) == 1 ? */ /* for now we just flag all virtual controls with managed labels, those * are really more appropriate for a pavucontrol-type control thing than * the (more hardware-oriented) mixer interface */ if (mc->mixext.id[0] == '@') { mc->is_virtual = TRUE; GST_LOG ("%s is virtual control with managed label", mc->mixext.extname); } } } static void gst_oss4_mixer_controls_dump_unused (GstOss4Mixer * mixer, const GList * controls) { const GList *l; for (l = controls; l != NULL; l = l->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) l->data; if (mc->used) continue; switch (mc->mixext.type) { case MIXT_DEVROOT: case MIXT_GROUP: case MIXT_MESSAGE: case MIXT_MONOVU: case MIXT_STEREOVU: case MIXT_MONOPEAK: case MIXT_STEREOPEAK: case MIXT_MARKER: continue; /* not interested in these types of controls */ case MIXT_MONODB: case MIXT_STEREODB: GST_DEBUG ("obsolete control type %d", mc->mixext.type); continue; case MIXT_MONOSLIDER: case MIXT_STEREOSLIDER: case MIXT_SLIDER: case MIXT_MONOSLIDER16: case MIXT_STEREOSLIDER16: /* this shouldn't happen */ GST_ERROR ("unused slider control?!"); continue; case MIXT_VALUE: case MIXT_HEXVALUE: /* value entry, not sure what to do with that, skip for now */ continue; case MIXT_ONOFF: case MIXT_MUTE: case MIXT_ENUM: case MIXT_3D: case MIXT_RADIOGROUP: GST_DEBUG ("FIXME: handle %s %s", mixer_ext_type_get_name (mc->mixext.type), mc->mixext.extname); break; default: GST_WARNING ("unknown control type %d", mc->mixext.type); continue; } } } static GList * gst_oss4_mixer_create_tracks (GstOss4Mixer * mixer, const GList * controls) { const GList *c; GList *tracks = NULL; for (c = controls; c != NULL; c = c->next) { GstOss4MixerControl *mc = (GstOss4MixerControl *) c->data; GstMixerTrack *track = NULL; if (mc->is_virtual) continue; if (mc->is_slider) { track = gst_oss4_mixer_slider_new (mixer, mc); } else if (mc->is_enum) { track = gst_oss4_mixer_enum_new (mixer, mc); } else if (mc->is_switch) { track = gst_oss4_mixer_switch_new (mixer, mc); } if (track == NULL) continue; track->label = gst_oss4_mixer_control_get_translated_name (mc); track->flags = 0; GST_LOG ("translated label: %s [%s] = %s", track->label, mc->mixext.id, track->label); /* This whole 'a track is either INPUT or OUTPUT' model is just flawed, * esp. if a slider's role can be changed on the fly, like when you change * function of a connector. What should we do in that case? Change the flag * and make the app rebuild the interface? Ignore it? */ if (mc->mixext.flags & (MIXF_MAINVOL | MIXF_PCMVOL)) { track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST; } else if (mc->mixext.flags & MIXF_RECVOL) { /* record gain whitelisted by default */ track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD | GST_MIXER_TRACK_WHITELIST; } else if (mc->mixext.flags & MIXF_MONVOL) { /* monitor sources not whitelisted by default */ track->flags = GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD; } /* * The kernel may give us better clues about the scope of a control. * If so, try to honor it. */ switch (mc->mixext.desc & MIXEXT_SCOPE_MASK) { case MIXEXT_SCOPE_INPUT: case MIXEXT_SCOPE_RECSWITCH: track->flags |= GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD | GST_MIXER_TRACK_WHITELIST; break; case MIXEXT_SCOPE_MONITOR: /* don't whitelist monitor tracks by default */ track->flags |= GST_MIXER_TRACK_INPUT | GST_MIXER_TRACK_NO_RECORD; break; case MIXEXT_SCOPE_OUTPUT: track->flags = GST_MIXER_TRACK_OUTPUT | GST_MIXER_TRACK_WHITELIST; break; } if (mc->is_master) { track->flags |= GST_MIXER_TRACK_OUTPUT; } if (mc->is_master) track->flags |= GST_MIXER_TRACK_MASTER; tracks = g_list_append (tracks, track); } return tracks; } static void gst_oss4_mixer_update_tracks (GstOss4Mixer * mixer) { GList *controls, *tracks; /* read and process controls */ controls = gst_oss4_mixer_get_controls (mixer); gst_oss4_mixer_controls_guess_master (mixer, controls); gst_oss4_mixer_controls_find_sliders (mixer, controls); gst_oss4_mixer_controls_find_enums (mixer, controls); gst_oss4_mixer_controls_find_switches (mixer, controls); gst_oss4_mixer_controls_find_virtual (mixer, controls); gst_oss4_mixer_controls_dump_unused (mixer, controls); tracks = gst_oss4_mixer_create_tracks (mixer, controls); /* free old tracks and controls */ gst_oss4_mixer_free_tracks (mixer); /* replace old with new */ mixer->tracks = tracks; mixer->controls = controls; } static const GList * gst_oss4_mixer_list_tracks (GstMixer * mixer_iface) { GstOss4Mixer *mixer = GST_OSS4_MIXER (mixer_iface); g_return_val_if_fail (mixer != NULL, NULL); g_return_val_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer), NULL); GST_OBJECT_LOCK (mixer); /* Do a read on the last control to check if the interface has changed */ if (!mixer->need_update && mixer->last_mixext.ctrl > 0) { GstOss4MixerControl mc = { {0,} , }; int val; mc.mixext = mixer->last_mixext; gst_oss4_mixer_get_control_val (mixer, &mc, &val); } if (mixer->need_update || mixer->tracks == NULL) { gst_oss4_mixer_update_tracks (mixer); mixer->need_update = FALSE; } GST_OBJECT_UNLOCK (mixer); return (const GList *) mixer->tracks; } static void gst_oss4_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes) { GstOss4Mixer *oss; g_return_if_fail (mixer != NULL); g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); g_return_if_fail (volumes != NULL); oss = GST_OSS4_MIXER (mixer); GST_OBJECT_LOCK (oss); if (GST_IS_OSS4_MIXER_SLIDER (track)) { gst_oss4_mixer_slider_set_volume (GST_OSS4_MIXER_SLIDER (track), volumes); } GST_OBJECT_UNLOCK (oss); } static void gst_oss4_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes) { GstOss4Mixer *oss; g_return_if_fail (mixer != NULL); g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); g_return_if_fail (volumes != NULL); oss = GST_OSS4_MIXER (mixer); GST_OBJECT_LOCK (oss); memset (volumes, 0, track->num_channels * sizeof (gint)); if (GST_IS_OSS4_MIXER_SWITCH (track)) { gboolean enabled = FALSE; gst_oss4_mixer_switch_get (GST_OSS4_MIXER_SWITCH (track), &enabled); } if (GST_IS_OSS4_MIXER_SLIDER (track)) { gst_oss4_mixer_slider_get_volume (GST_OSS4_MIXER_SLIDER (track), volumes); } GST_OBJECT_UNLOCK (oss); } static void gst_oss4_mixer_set_record (GstMixer * mixer, GstMixerTrack * track, gboolean record) { GstOss4Mixer *oss; g_return_if_fail (mixer != NULL); g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); oss = GST_OSS4_MIXER (mixer); GST_OBJECT_LOCK (oss); if (GST_IS_OSS4_MIXER_SLIDER (track)) { gst_oss4_mixer_slider_set_record (GST_OSS4_MIXER_SLIDER (track), record); } else if (GST_IS_OSS4_MIXER_SWITCH (track)) { if ((track->flags & GST_MIXER_TRACK_INPUT)) { gst_oss4_mixer_switch_set (GST_OSS4_MIXER_SWITCH (track), record); } else { GST_WARNING_OBJECT (track, "set_record called on non-INPUT track"); } } GST_OBJECT_UNLOCK (oss); } static void gst_oss4_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute) { GstOss4Mixer *oss; g_return_if_fail (mixer != NULL); g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); g_return_if_fail (gst_oss4_mixer_contains_track (mixer, track)); oss = GST_OSS4_MIXER (mixer); GST_OBJECT_LOCK (oss); if (GST_IS_OSS4_MIXER_SLIDER (track)) { gst_oss4_mixer_slider_set_mute (GST_OSS4_MIXER_SLIDER (track), mute); } else if (GST_IS_OSS4_MIXER_SWITCH (track)) { gst_oss4_mixer_switch_set (GST_OSS4_MIXER_SWITCH (track), mute); } GST_OBJECT_UNLOCK (oss); } static void gst_oss4_mixer_set_option (GstMixer * mixer, GstMixerOptions * options, gchar * value) { GstOss4Mixer *oss; g_return_if_fail (mixer != NULL); g_return_if_fail (value != NULL); g_return_if_fail (GST_IS_OSS4_MIXER (mixer)); g_return_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer)); g_return_if_fail (GST_IS_OSS4_MIXER_ENUM (options)); g_return_if_fail (gst_oss4_mixer_contains_options (mixer, options)); oss = GST_OSS4_MIXER (mixer); GST_OBJECT_LOCK (oss); if (!gst_oss4_mixer_enum_set_option (GST_OSS4_MIXER_ENUM (options), value)) { /* not much we can do here but wake up the watch thread early, so it * can do its thing and post messages if anything has changed */ gst_oss4_mixer_wake_up_watch_task (oss); } GST_OBJECT_UNLOCK (oss); } static const gchar * gst_oss4_mixer_get_option (GstMixer * mixer, GstMixerOptions * options) { GstOss4Mixer *oss; const gchar *current_val; g_return_val_if_fail (mixer != NULL, NULL); g_return_val_if_fail (GST_IS_OSS4_MIXER (mixer), NULL); g_return_val_if_fail (GST_OSS4_MIXER_IS_OPEN (mixer), NULL); g_return_val_if_fail (GST_IS_OSS4_MIXER_ENUM (options), NULL); g_return_val_if_fail (gst_oss4_mixer_contains_options (mixer, options), NULL); oss = GST_OSS4_MIXER (mixer); GST_OBJECT_LOCK (oss); current_val = gst_oss4_mixer_enum_get_option (GST_OSS4_MIXER_ENUM (options)); if (current_val == NULL) { /* not much we can do here but wake up the watch thread early, so it * can do its thing and post messages if anything has changed */ gst_oss4_mixer_wake_up_watch_task (oss); } GST_OBJECT_UNLOCK (oss); return current_val; } static GstMixerFlags gst_oss4_mixer_get_mixer_flags (GstMixer * mixer) { return GST_MIXER_FLAG_AUTO_NOTIFICATIONS | GST_MIXER_FLAG_HAS_WHITELIST | GST_MIXER_FLAG_GROUPING; } static void gst_oss4_mixer_interface_init (GstMixerClass * klass) { GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; klass->list_tracks = gst_oss4_mixer_list_tracks; klass->set_volume = gst_oss4_mixer_set_volume; klass->get_volume = gst_oss4_mixer_get_volume; klass->set_mute = gst_oss4_mixer_set_mute; klass->set_record = gst_oss4_mixer_set_record; klass->set_option = gst_oss4_mixer_set_option; klass->get_option = gst_oss4_mixer_get_option; klass->get_mixer_flags = gst_oss4_mixer_get_mixer_flags; } /* Implement the horror that is GstImplementsInterface */ static gboolean gst_oss4_mixer_supported (GstImplementsInterface * iface, GType iface_type) { GstOss4Mixer *mixer; g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); mixer = GST_OSS4_MIXER (iface); return GST_OSS4_MIXER_IS_OPEN (mixer); } static void gst_oss4_mixer_implements_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_oss4_mixer_supported; } static void gst_oss4_mixer_init_interfaces (GType type) { static const GInterfaceInfo implements_iface_info = { (GInterfaceInitFunc) gst_oss4_mixer_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo mixer_iface_info = { (GInterfaceInitFunc) gst_oss4_mixer_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_iface_info); g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); gst_oss4_add_property_probe_interface (type); } gst-plugins-good-0.10.31/sys/oss4/oss4-audio.c0000644000175000017500000005365511671175354015670 00000000000000/* GStreamer OSS4 audio plugin * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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 #include #include #include #include #include #include "gst/gst-i18n-plugin.h" #include #include "oss4-audio.h" #include "oss4-mixer.h" #include "oss4-property-probe.h" #include "oss4-sink.h" #include "oss4-source.h" #include "oss4-soundcard.h" GST_DEBUG_CATEGORY (oss4mixer_debug); GST_DEBUG_CATEGORY (oss4sink_debug); GST_DEBUG_CATEGORY (oss4src_debug); GST_DEBUG_CATEGORY (oss4_debug); #define GST_CAT_DEFAULT oss4_debug typedef struct { const GstBufferFormat gst_fmt; const gint oss_fmt; const gchar name[16]; const gint depth; const gint width; const gint endianness; const gboolean signedness; } GstOss4AudioFormat; /* *INDENT-OFF* */ static const GstOss4AudioFormat fmt_map[] = { /* note: keep sorted by preference, prefered formats first */ { GST_MU_LAW, AFMT_MU_LAW, "audio/x-mulaw", 0, 0, 0, FALSE}, { GST_A_LAW, AFMT_A_LAW, "audio/x-alaw", 0, 0, 0, FALSE}, { GST_S32_LE, AFMT_S32_LE, "audio/x-raw-int", 32, 32, G_LITTLE_ENDIAN, TRUE}, { GST_S32_BE, AFMT_S32_BE, "audio/x-raw-int", 32, 32, G_BIG_ENDIAN, TRUE}, { GST_S24_LE, AFMT_S24_LE, "audio/x-raw-int", 24, 32, G_LITTLE_ENDIAN, TRUE}, { GST_S24_BE, AFMT_S24_BE, "audio/x-raw-int", 24, 32, G_BIG_ENDIAN, TRUE}, { GST_S24_3LE, AFMT_S24_PACKED, "audio/x-raw-int", 24, 24, G_LITTLE_ENDIAN, TRUE}, { GST_S16_LE, AFMT_S16_LE, "audio/x-raw-int", 16, 16, G_LITTLE_ENDIAN, TRUE}, { GST_S16_BE, AFMT_S16_BE, "audio/x-raw-int", 16, 16, G_BIG_ENDIAN, TRUE}, { GST_U16_LE, AFMT_U16_LE, "audio/x-raw-int", 16, 16, G_LITTLE_ENDIAN, FALSE}, { GST_U16_BE, AFMT_U16_BE, "audio/x-raw-int", 16, 16, G_BIG_ENDIAN, FALSE}, { GST_S8, AFMT_S8, "audio/x-raw-int", 8, 8, 0, TRUE}, { GST_U8, AFMT_U8, "audio/x-raw-int", 8, 8, 0, FALSE} }; /* *INDENT-ON* */ /* formats we assume the OSS4 layer can always handle and convert internally */ #define CONVERTIBLE_FORMATS ( \ AFMT_MU_LAW | AFMT_A_LAW | \ AFMT_S32_LE | AFMT_S32_BE | \ AFMT_S24_LE | AFMT_S24_BE | \ AFMT_S24_PACKED | \ AFMT_S16_LE | AFMT_S16_BE | \ AFMT_U16_LE | AFMT_U16_BE | \ AFMT_S8 | AFMT_U8 ) static void gst_oss4_append_format_to_caps (const GstOss4AudioFormat * fmt, GstCaps * caps) { GstStructure *s; s = gst_structure_empty_new (fmt->name); if (fmt->width != 0 && fmt->depth != 0) { gst_structure_set (s, "width", G_TYPE_INT, fmt->width, "depth", G_TYPE_INT, fmt->depth, "signed", G_TYPE_BOOLEAN, fmt->signedness, NULL); } if (fmt->endianness != 0) { gst_structure_set (s, "endianness", G_TYPE_INT, fmt->endianness, NULL); } gst_caps_append_structure (caps, s); } static gint gst_oss4_audio_get_oss_format (GstBufferFormat fmt) { guint i; for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { if (fmt_map[i].gst_fmt == fmt) return fmt_map[i].oss_fmt; } return 0; } /* These are pretty random */ #define GST_OSS4_MIN_SAMPLE_RATE 1 #define GST_OSS4_MAX_SAMPLE_RATE 192000 static gboolean gst_oss4_audio_detect_rates (GstObject * obj, oss_audioinfo * ai, GstCaps * caps) { GValue val = { 0, }; int minrate, maxrate, i; minrate = ai->min_rate; maxrate = ai->max_rate; /* sanity check */ if (minrate > maxrate) { GST_WARNING_OBJECT (obj, "min_rate %d > max_rate %d (buggy driver?)", minrate, maxrate); maxrate = ai->min_rate; /* swap */ minrate = ai->max_rate; } /* limit to something sensible */ if (minrate < GST_OSS4_MIN_SAMPLE_RATE) minrate = GST_OSS4_MIN_SAMPLE_RATE; if (maxrate > GST_OSS4_MAX_SAMPLE_RATE) maxrate = GST_OSS4_MAX_SAMPLE_RATE; if (maxrate < GST_OSS4_MIN_SAMPLE_RATE) { GST_WARNING_OBJECT (obj, "max_rate < %d, which makes no sense", GST_OSS4_MIN_SAMPLE_RATE); return FALSE; } GST_LOG_OBJECT (obj, "min_rate %d, max_rate %d (originally: %d, %d)", minrate, maxrate, ai->min_rate, ai->max_rate); if ((ai->caps & PCM_CAP_FREERATE)) { GST_LOG_OBJECT (obj, "device supports any sample rate between min and max"); if (minrate == maxrate) { g_value_init (&val, G_TYPE_INT); g_value_set_int (&val, maxrate); } else { g_value_init (&val, GST_TYPE_INT_RANGE); gst_value_set_int_range (&val, minrate, maxrate); } } else { GST_LOG_OBJECT (obj, "%d sample rates:", ai->nrates); g_value_init (&val, GST_TYPE_LIST); for (i = 0; i < ai->nrates; ++i) { GST_LOG_OBJECT (obj, " rate: %d", ai->rates[i]); if (ai->rates[i] >= minrate && ai->rates[i] <= maxrate) { GValue rate_val = { 0, }; g_value_init (&rate_val, G_TYPE_INT); g_value_set_int (&rate_val, ai->rates[i]); gst_value_list_append_value (&val, &rate_val); g_value_unset (&rate_val); } } if (gst_value_list_get_size (&val) == 0) { g_value_unset (&val); return FALSE; } } for (i = 0; i < gst_caps_get_size (caps); ++i) { GstStructure *s; s = gst_caps_get_structure (caps, i); gst_structure_set_value (s, "rate", &val); } g_value_unset (&val); return TRUE; } static void gst_oss4_audio_add_channel_layout (GstObject * obj, guint64 layout, guint num_channels, GstStructure * s) { const GstAudioChannelPosition pos_map[16] = { GST_AUDIO_CHANNEL_POSITION_NONE, /* 0 = dunno */ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, /* 1 = left */ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, /* 2 = right */ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, /* 3 = center */ GST_AUDIO_CHANNEL_POSITION_LFE, /* 4 = lfe */ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, /* 5 = left surround */ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, /* 6 = right surround */ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, /* 7 = left rear */ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, /* 8 = right rear */ GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE }; GstAudioChannelPosition ch_layout[8] = { 0, }; guint speaker_pos; /* speaker position as defined by OSS */ guint i; g_return_if_fail (num_channels <= G_N_ELEMENTS (ch_layout)); for (i = 0; i < num_channels; ++i) { /* layout contains up to 16 speaker positions, with each taking up 4 bits */ speaker_pos = (guint) ((layout >> (i * 4)) & 0x0f); /* if it's a channel position that's unknown to us, set all to NONE and * bail out */ if (G_UNLIKELY (pos_map[speaker_pos] == GST_AUDIO_CHANNEL_POSITION_NONE)) goto no_layout; ch_layout[i] = pos_map[speaker_pos]; } gst_audio_set_channel_positions (s, ch_layout); return; no_layout: { /* only warn if it's really unknown, position 0 is ok and represents NONE * (in which case we also just set all others to NONE ignoring the other * positions in the OSS-given layout, because that's what we currently * require in GStreamer) */ if (speaker_pos != 0) { GST_WARNING_OBJECT (obj, "unknown OSS channel position %x", ch_layout[i]); } for (i = 0; i < num_channels; ++i) { ch_layout[i] = GST_AUDIO_CHANNEL_POSITION_NONE; } gst_audio_set_channel_positions (s, ch_layout); return; } } /* arbitrary max. limit */ #define GST_OSS4_MIN_CHANNELS 1 #define GST_OSS4_MAX_CHANNELS 4096 /* takes ownership of the input caps */ static GstCaps * gst_oss4_audio_detect_channels (GstObject * obj, int fd, oss_audioinfo * ai, GstCaps * in_caps) { const gchar *forced_layout; GstStructure *s = NULL; guint64 layout = 0; GstCaps *chan_caps = NULL; GstCaps *out_caps = NULL; int minchans, maxchans; int c, i, j; /* GST_OSS4_CHANNEL_LAYOUT environment variable: may be used to force a * particular channel layout (if it contains an odd number of channel * positions it will also make us advertise a channel layout for that * channel count, even if we'd usually skip it; this is especially useful * for folks with 2.1 speakers, I guess) */ forced_layout = g_getenv ("GST_OSS4_CHANNEL_LAYOUT"); minchans = ai->min_channels; maxchans = ai->max_channels; /* sanity check */ if (minchans > maxchans) { GST_WARNING_OBJECT (obj, "min_chans %d > max_chans %d (buggy driver?)", minchans, maxchans); maxchans = ai->min_channels; /* swap */ minchans = ai->max_channels; } /* limit to something sensible */ if (minchans < GST_OSS4_MIN_CHANNELS) minchans = GST_OSS4_MIN_CHANNELS; if (maxchans > GST_OSS4_MAX_CHANNELS) maxchans = GST_OSS4_MAX_CHANNELS; if (maxchans < GST_OSS4_MIN_CHANNELS) { GST_WARNING_OBJECT (obj, "max_chans < %d, which makes no sense", GST_OSS4_MIN_CHANNELS); gst_caps_unref (in_caps); return NULL; } GST_LOG_OBJECT (obj, "min_channels %d, max_channels %d (originally: %d, %d)", minchans, maxchans, ai->min_channels, ai->max_channels); chan_caps = gst_caps_new_empty (); /* first do the simple cases: mono + stereo (channel layout implied) */ if (minchans == 1 && maxchans == 1) s = gst_structure_new ("x", "channels", G_TYPE_INT, 1, NULL); else if (minchans == 2 && maxchans >= 2) s = gst_structure_new ("x", "channels", G_TYPE_INT, 2, NULL); else if (minchans == 1 && maxchans >= 2) s = gst_structure_new ("x", "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); gst_caps_append_structure (chan_caps, s); s = NULL; /* TODO: we assume all drivers use a left/right layout for stereo here */ if (maxchans <= 2) goto done; if (ioctl (fd, SNDCTL_DSP_GET_CHNORDER, &layout) == -1) { GST_WARNING_OBJECT (obj, "couldn't query channel layout, assuming default"); layout = CHNORDER_NORMAL; } GST_DEBUG_OBJECT (obj, "channel layout: %08" G_GINT64_MODIFIER "x", layout); /* e.g. forced 2.1 layout would be GST_OSS4_CHANNEL_LAYOUT=421 */ if (forced_layout != NULL && *forced_layout != '\0') { guint layout_len; layout_len = strlen (forced_layout); if (layout_len >= minchans && layout_len <= maxchans) { layout = g_ascii_strtoull (forced_layout, NULL, 16); maxchans = layout_len; GST_DEBUG_OBJECT (obj, "forced channel layout: %08" G_GINT64_MODIFIER "x" " ('%s'), maxchans now %d", layout, forced_layout, maxchans); } else { GST_WARNING_OBJECT (obj, "ignoring forced channel layout: layout has %d " "channel positions but maxchans is %d", layout_len, maxchans); } } /* need to advertise channel layouts for anything >2 and <=8 channels */ for (c = MAX (3, minchans); c <= MIN (maxchans, 8); c++) { /* "The min_channels and max_channels fields define the limits for the * number of channels. However some devices don't support all channels * within this range. It's possible that the odd values (3, 5, 7, 9, etc). * are not supported. There is currently no way to check for this other * than checking if SNDCTL_DSP_CHANNELS accepts the requested value. * Another approach is trying to avoid using odd number of channels." * * So, we don't know for sure if these odd values are supported: */ if ((c == 3 || c == 5 || c == 7) && (c != maxchans)) { GST_LOG_OBJECT (obj, "not adding layout with %d channels", c); continue; } s = gst_structure_new ("x", "channels", G_TYPE_INT, c, NULL); gst_oss4_audio_add_channel_layout (obj, layout, c, s); GST_LOG_OBJECT (obj, "c=%u, appending struct %" GST_PTR_FORMAT, c, s); gst_caps_append_structure (chan_caps, s); s = NULL; } if (maxchans <= 8) goto done; /* for everything >8 channels, CHANNEL_POSITION_NONE is implied. */ if (minchans == maxchans || maxchans == 9) { s = gst_structure_new ("x", "channels", G_TYPE_INT, maxchans, NULL); } else { s = gst_structure_new ("x", "channels", GST_TYPE_INT_RANGE, MAX (9, minchans), maxchans, NULL); } gst_caps_append_structure (chan_caps, s); s = NULL; done: GST_LOG_OBJECT (obj, "channel structures: %" GST_PTR_FORMAT, chan_caps); out_caps = gst_caps_new_empty (); /* combine each structure in the input caps with each channel caps struct */ for (i = 0; i < gst_caps_get_size (in_caps); ++i) { const GstStructure *in_s; in_s = gst_caps_get_structure (in_caps, i); for (j = 0; j < gst_caps_get_size (chan_caps); ++j) { const GstStructure *chan_s; const GValue *val; s = gst_structure_copy (in_s); chan_s = gst_caps_get_structure (chan_caps, j); if ((val = gst_structure_get_value (chan_s, "channels"))) gst_structure_set_value (s, "channels", val); if ((val = gst_structure_get_value (chan_s, "channel-positions"))) gst_structure_set_value (s, "channel-positions", val); gst_caps_append_structure (out_caps, s); s = NULL; } } gst_caps_unref (in_caps); gst_caps_unref (chan_caps); return out_caps; } GstCaps * gst_oss4_audio_probe_caps (GstObject * obj, int fd) { oss_audioinfo ai = { 0, }; gboolean output; GstCaps *caps; int nonnative_formats = 0; int formats, i; output = GST_IS_OSS4_SINK (obj); /* -1 = get info for currently open device (fd). This will fail with * OSS build <= 1013 because of a bug in OSS */ ai.dev = -1; if (ioctl (fd, SNDCTL_ENGINEINFO, &ai) == -1) goto engineinfo_failed; formats = (output) ? ai.oformats : ai.iformats; GST_LOG_OBJECT (obj, "%s formats : 0x%08x", (output) ? "out" : "in", formats); caps = gst_caps_new_empty (); /* first list all the formats natively supported */ for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { if ((formats & fmt_map[i].oss_fmt)) { gst_oss4_append_format_to_caps (&fmt_map[i], caps); } else if ((fmt_map[i].oss_fmt & CONVERTIBLE_FORMATS)) { nonnative_formats |= fmt_map[i].oss_fmt; } } GST_LOG_OBJECT (obj, "adding non-native %s formats : 0x%08x", (output) ? "out" : "in", nonnative_formats); /* now append non-native formats for which conversion would be needed */ for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { if ((nonnative_formats & fmt_map[i].oss_fmt)) { gst_oss4_append_format_to_caps (&fmt_map[i], caps); } } gst_caps_do_simplify (caps); GST_LOG_OBJECT (obj, "formats: %" GST_PTR_FORMAT, caps); if (!gst_oss4_audio_detect_rates (obj, &ai, caps)) goto detect_rates_failed; caps = gst_oss4_audio_detect_channels (obj, fd, &ai, caps); if (caps == NULL) goto detect_channels_failed; GST_LOG_OBJECT (obj, "probed caps: %" GST_PTR_FORMAT, caps); return caps; /* ERRORS */ engineinfo_failed: { GST_WARNING ("ENGINEINFO supported formats probe failed: %s", g_strerror (errno)); return NULL; } detect_rates_failed: { GST_WARNING_OBJECT (obj, "failed to detect supported sample rates"); gst_caps_unref (caps); return NULL; } detect_channels_failed: { GST_WARNING_OBJECT (obj, "failed to detect supported channels"); gst_caps_unref (caps); return NULL; } } GstCaps * gst_oss4_audio_get_template_caps (void) { GstCaps *caps; gint i; caps = gst_caps_new_empty (); for (i = 0; i < G_N_ELEMENTS (fmt_map); ++i) { gst_oss4_append_format_to_caps (&fmt_map[i], caps); } gst_caps_do_simplify (caps); for (i = 0; i < gst_caps_get_size (caps); ++i) { GstStructure *s; s = gst_caps_get_structure (caps, i); gst_structure_set (s, "rate", GST_TYPE_INT_RANGE, GST_OSS4_MIN_SAMPLE_RATE, GST_OSS4_MAX_SAMPLE_RATE, "channels", GST_TYPE_INT_RANGE, GST_OSS4_MIN_CHANNELS, GST_OSS4_MAX_CHANNELS, NULL); } return caps; } /* called by gst_oss4_sink_prepare() and gst_oss4_source_prepare() */ gboolean gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec) { struct audio_buf_info info = { 0, }; int fmt, chans, rate; fmt = gst_oss4_audio_get_oss_format (spec->format); if (fmt == 0) goto wrong_format; if (spec->type == GST_BUFTYPE_LINEAR && spec->width != 32 && spec->width != 24 && spec->width != 16 && spec->width != 8) { goto dodgy_width; } /* format */ GST_LOG_OBJECT (obj, "setting format: %d", fmt); if (ioctl (fd, SNDCTL_DSP_SETFMT, &fmt) == -1) goto set_format_failed; /* channels */ GST_LOG_OBJECT (obj, "setting channels: %d", spec->channels); chans = spec->channels; if (ioctl (fd, SNDCTL_DSP_CHANNELS, &chans) == -1) goto set_channels_failed; /* rate */ GST_LOG_OBJECT (obj, "setting rate: %d", spec->rate); rate = spec->rate; if (ioctl (fd, SNDCTL_DSP_SPEED, &rate) == -1) goto set_rate_failed; GST_DEBUG_OBJECT (obj, "effective format : %d", fmt); GST_DEBUG_OBJECT (obj, "effective channels : %d", chans); GST_DEBUG_OBJECT (obj, "effective rate : %d", rate); /* make sure format, channels, and rate are the ones we requested */ if (fmt != gst_oss4_audio_get_oss_format (spec->format) || chans != spec->channels || rate != spec->rate) { /* This shouldn't happen, but hey */ goto format_not_what_was_requested; } if (GST_IS_OSS4_SOURCE (obj)) { if (ioctl (fd, SNDCTL_DSP_GETISPACE, &info) == -1) goto get_ispace_failed; } else { if (ioctl (fd, SNDCTL_DSP_GETOSPACE, &info) == -1) goto get_ospace_failed; } spec->segsize = info.fragsize; /* we add some extra fragments -- this helps us account for delays due to * conversion buffer, streams queueing, etc. It is important that these * be taken into account because otherwise the delay counter can wind up * being too large, and the buffer will wrap. */ spec->segtotal = info.fragstotal + 4; spec->bytes_per_sample = (spec->width / 8) * spec->channels; GST_DEBUG_OBJECT (obj, "got segsize: %d, segtotal: %d, value: %08x", spec->segsize, spec->segtotal, info.fragsize); return TRUE; /* ERRORS */ wrong_format: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("Unable to get format %d", spec->format)); return FALSE; } dodgy_width: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("unexpected width %d", spec->width)); return FALSE; } set_format_failed: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("DSP_SETFMT(%d) failed: %s", fmt, g_strerror (errno))); return FALSE; } set_channels_failed: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("DSP_CHANNELS(%d) failed: %s", chans, g_strerror (errno))); return FALSE; } set_rate_failed: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("DSP_SPEED(%d) failed: %s", rate, g_strerror (errno))); return FALSE; } get_ospace_failed: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("DSP_GETOSPACE failed: %s", g_strerror (errno))); return FALSE; } get_ispace_failed: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("DSP_GETISPACE failed: %s", g_strerror (errno))); return FALSE; } format_not_what_was_requested: { GST_ELEMENT_ERROR (obj, RESOURCE, SETTINGS, (NULL), ("Format actually configured wasn't the one we requested. This is " "probably either a bug in the driver or in the format probing code.")); return FALSE; } } int gst_oss4_audio_get_version (GstObject * obj, int fd) { gint ver = 0; /* we use the old ioctl here on purpose instead of SNDCTL_SYSINFO */ if (ioctl (fd, OSS_GETVERSION, &ver) < 0) { GST_LOG_OBJECT (obj, "OSS_GETVERSION failed: %s", g_strerror (errno)); return -1; } GST_LOG_OBJECT (obj, "OSS version: 0x%08x", ver); return ver; } gboolean gst_oss4_audio_check_version (GstObject * obj, int fd) { return (gst_oss4_audio_get_version (obj, fd) >= GST_MIN_OSS4_VERSION); } gchar * gst_oss4_audio_find_device (GstObject * oss) { GValueArray *arr; gchar *ret = NULL; arr = gst_property_probe_probe_and_get_values_name (GST_PROPERTY_PROBE (oss), "device"); if (arr != NULL) { if (arr->n_values > 0) { const GValue *val; val = g_value_array_get_nth (arr, 0); ret = g_value_dup_string (val); } g_value_array_free (arr); } GST_LOG_OBJECT (oss, "first device found: %s", GST_STR_NULL (ret)); return ret; } static gboolean plugin_init (GstPlugin * plugin) { gint rank; GST_DEBUG_CATEGORY_INIT (oss4sink_debug, "oss4sink", 0, "OSS4 audio sink"); GST_DEBUG_CATEGORY_INIT (oss4src_debug, "oss4src", 0, "OSS4 audio src"); GST_DEBUG_CATEGORY_INIT (oss4mixer_debug, "oss4mixer", 0, "OSS4 mixer"); GST_DEBUG_CATEGORY_INIT (oss4_debug, "oss4", 0, "OSS4 plugin"); #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* we want a higher rank than the legacy OSS elements have now */ rank = GST_RANK_SECONDARY + 1; if (!gst_element_register (plugin, "oss4sink", rank, GST_TYPE_OSS4_SINK) || !gst_element_register (plugin, "oss4src", rank, GST_TYPE_OSS4_SOURCE) || !gst_element_register (plugin, "oss4mixer", rank, GST_TYPE_OSS4_MIXER)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "oss4", "Open Sound System (OSS) version 4 support for GStreamer", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/oss4/Makefile.am0000644000175000017500000000146711671175354015563 00000000000000plugin_LTLIBRARIES = libgstoss4audio.la libgstoss4audio_la_SOURCES = \ oss4-audio.c \ oss4-mixer.c \ oss4-mixer-enum.c \ oss4-mixer-slider.c \ oss4-mixer-switch.c \ oss4-property-probe.c \ oss4-sink.c \ oss4-source.c libgstoss4audio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstoss4audio_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstinterfaces-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_LIBS) libgstoss4audio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstoss4audio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ oss4-audio.h \ oss4-mixer.h \ oss4-mixer-enum.h \ oss4-mixer-slider.h \ oss4-mixer-switch.h \ oss4-property-probe.h \ oss4-sink.h \ oss4-soundcard.h \ oss4-source.h gst-plugins-good-0.10.31/sys/oss4/oss4-mixer-enum.c0000644000175000017500000001657511671175354016655 00000000000000/* GStreamer OSS4 mixer enumeration control * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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. */ /* An 'enum' in gnome-volume-control / GstMixer is represented by a * GstMixerOptions object */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #define NO_LEGACY_MIXER #include "oss4-mixer.h" #include "oss4-mixer-enum.h" #include "oss4-soundcard.h" GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); #define GST_CAT_DEFAULT oss4mixer_debug static GList *gst_oss4_mixer_enum_get_values (GstMixerOptions * options); /* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ G_DEFINE_TYPE (GstOss4MixerEnum, gst_oss4_mixer_enum, GST_TYPE_MIXER_OPTIONS); static void gst_oss4_mixer_enum_init (GstOss4MixerEnum * e) { e->need_update = TRUE; } static void gst_oss4_mixer_enum_dispose (GObject * obj) { GstMixerOptions *options = GST_MIXER_OPTIONS (obj); /* our list is a flat list with constant strings, but the GstMixerOptions * dispose will try to g_free the contained strings, so clean up the list * before chaining up to GstMixerOptions */ g_list_free (options->values); options->values = NULL; G_OBJECT_CLASS (gst_oss4_mixer_enum_parent_class)->dispose (obj); } static void gst_oss4_mixer_enum_class_init (GstOss4MixerEnumClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstMixerOptionsClass *mixeroptions_class = (GstMixerOptionsClass *) klass; gobject_class->dispose = gst_oss4_mixer_enum_dispose; mixeroptions_class->get_values = gst_oss4_mixer_enum_get_values; } static GList * gst_oss4_mixer_enum_get_values_locked (GstMixerOptions * options) { GstOss4MixerEnum *e = GST_OSS4_MIXER_ENUM_CAST (options); GList *oldlist, *list = NULL; int i; /* if current list of values is empty, update/re-check in any case */ if (!e->need_update && options->values != NULL) return options->values; GST_LOG_OBJECT (e, "updating available values for %s", e->mc->mixext.extname); for (i = 0; i < e->mc->mixext.maxvalue; ++i) { const gchar *s; s = g_quark_to_string (e->mc->enum_vals[i]); if (MIXEXT_ENUM_IS_AVAILABLE (e->mc->mixext, i)) { GST_LOG_OBJECT (e, "option '%s' is available", s); list = g_list_prepend (list, (gpointer) s); } else { GST_LOG_OBJECT (e, "option '%s' is currently not available", s); } } list = g_list_reverse (list); /* this is not thread-safe, but then the entire GstMixer API isn't really, * since we return foo->list and not a copy and don't take any locks, so * not much we can do here but pray; we're usually either called from _new() * or from within _get_values() though, so it should be okay. We could use * atomic ops here, but I'm not sure how much more that really buys us.*/ oldlist = options->values; /* keep window small */ options->values = list; g_list_free (oldlist); e->need_update = FALSE; return options->values; } static GList * gst_oss4_mixer_enum_get_values (GstMixerOptions * options) { GstOss4MixerEnum *e = GST_OSS4_MIXER_ENUM (options); GList *list; /* we take the lock here mostly to serialise ioctls with the watch thread */ GST_OBJECT_LOCK (e->mixer); list = gst_oss4_mixer_enum_get_values_locked (options); GST_OBJECT_UNLOCK (e->mixer); return list; } static const gchar * gst_oss4_mixer_enum_get_current_value (GstOss4MixerEnum * e) { const gchar *cur_val = NULL; if (e->mc->enum_vals != NULL && e->mc->last_val < e->mc->mixext.maxvalue) { cur_val = g_quark_to_string (e->mc->enum_vals[e->mc->last_val]); } return cur_val; } static gboolean gst_oss4_mixer_enum_update_current (GstOss4MixerEnum * e) { int cur = -1; if (!gst_oss4_mixer_get_control_val (e->mixer, e->mc, &cur)) return FALSE; if (cur < 0 || cur >= e->mc->mixext.maxvalue) { GST_WARNING_OBJECT (e, "read value %d out of bounds [0-%d]", cur, e->mc->mixext.maxvalue - 1); e->mc->last_val = 0; return FALSE; } return TRUE; } gboolean gst_oss4_mixer_enum_set_option (GstOss4MixerEnum * e, const gchar * value) { GQuark q; int i; q = g_quark_try_string (value); if (q == 0) { GST_WARNING_OBJECT (e, "unknown option '%s'", value); return FALSE; } for (i = 0; i < e->mc->mixext.maxvalue; ++i) { if (q == e->mc->enum_vals[i]) break; } if (i >= e->mc->mixext.maxvalue) { GST_WARNING_OBJECT (e, "option '%s' is not valid for this control", value); return FALSE; } GST_LOG_OBJECT (e, "option '%s' = %d", value, i); if (!MIXEXT_ENUM_IS_AVAILABLE (e->mc->mixext, i)) { GST_WARNING_OBJECT (e, "option '%s' is not selectable currently", value); return FALSE; } if (!gst_oss4_mixer_set_control_val (e->mixer, e->mc, i)) { GST_WARNING_OBJECT (e, "could not set option '%s' (%d)", value, i); return FALSE; } /* and re-read current value with sanity checks (or could just assign here) */ gst_oss4_mixer_enum_update_current (e); return TRUE; } const gchar * gst_oss4_mixer_enum_get_option (GstOss4MixerEnum * e) { const gchar *cur_str = NULL; if (!gst_oss4_mixer_enum_update_current (e)) { GST_WARNING_OBJECT (e, "failed to read current value"); return NULL; } cur_str = gst_oss4_mixer_enum_get_current_value (e); GST_LOG_OBJECT (e, "%s (%d)", GST_STR_NULL (cur_str), e->mc->last_val); return cur_str; } GstMixerTrack * gst_oss4_mixer_enum_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) { GstOss4MixerEnum *e; GstMixerTrack *track; e = g_object_new (GST_TYPE_OSS4_MIXER_ENUM, "untranslated-label", mc->mixext.extname, NULL); e->mixer = mixer; e->mc = mc; track = GST_MIXER_TRACK (e); /* caller will set track->label and track->flags */ track->num_channels = 0; track->min_volume = 0; track->max_volume = 0; (void) gst_oss4_mixer_enum_get_values_locked (GST_MIXER_OPTIONS (track)); if (!gst_oss4_mixer_enum_update_current (e)) { GST_WARNING_OBJECT (track, "failed to read current value, returning NULL"); g_object_unref (track); track = NULL; } GST_LOG_OBJECT (e, "current value: %d (%s)", e->mc->last_val, gst_oss4_mixer_enum_get_current_value (e)); return track; } /* This is called from the watch thread */ void gst_oss4_mixer_enum_process_change_unlocked (GstMixerTrack * track) { GstOss4MixerEnum *e = GST_OSS4_MIXER_ENUM_CAST (track); gchar *cur; if (!e->mc->changed && !e->mc->list_changed) return; if (e->mc->list_changed) { gst_mixer_options_list_changed (GST_MIXER (e->mixer), GST_MIXER_OPTIONS (e)); } GST_OBJECT_LOCK (e->mixer); cur = (gchar *) gst_oss4_mixer_enum_get_current_value (e); GST_OBJECT_UNLOCK (e->mixer); gst_mixer_option_changed (GST_MIXER (e->mixer), GST_MIXER_OPTIONS (e), cur); } gst-plugins-good-0.10.31/sys/oss4/oss4-mixer-slider.h0000644000175000017500000000531511671175354017166 00000000000000/* GStreamer OSS4 mixer slider control * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_MIXER_SLIDER_H #define GST_OSS4_MIXER_SLIDER_H #include #include #include "oss4-mixer.h" G_BEGIN_DECLS #define GST_TYPE_OSS4_MIXER_SLIDER (gst_oss4_mixer_slider_get_type()) #define GST_OSS4_MIXER_SLIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER_SLIDER,GstOss4MixerSlider)) #define GST_OSS4_MIXER_SLIDER_CAST(obj) ((GstOss4MixerSlider *)(obj)) #define GST_OSS4_MIXER_SLIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER_SLIDER,GstOss4MixerSliderClass)) #define GST_IS_OSS4_MIXER_SLIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER_SLIDER)) #define GST_IS_OSS4_MIXER_SLIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER_SLIDER)) typedef struct _GstOss4MixerSlider GstOss4MixerSlider; typedef struct _GstOss4MixerSliderClass GstOss4MixerSliderClass; struct _GstOss4MixerSlider { GstMixerTrack mixer_track; GstOss4MixerControl * mc; GstOss4Mixer * mixer; /* the mixer we belong to (no ref taken) */ gint volumes[2]; /* left/mono, right */ }; struct _GstOss4MixerSliderClass { GstMixerTrackClass mixer_track_class; }; GType gst_oss4_mixer_slider_get_type (void); GstMixerTrack * gst_oss4_mixer_slider_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc); gboolean gst_oss4_mixer_slider_get_volume (GstOss4MixerSlider * s, gint * volumes); gboolean gst_oss4_mixer_slider_set_volume (GstOss4MixerSlider * s, const gint * volumes); gboolean gst_oss4_mixer_slider_set_record (GstOss4MixerSlider * s, gboolean record); gboolean gst_oss4_mixer_slider_set_mute (GstOss4MixerSlider * s, gboolean mute); void gst_oss4_mixer_slider_process_change_unlocked (GstMixerTrack * track); G_END_DECLS #endif /* GST_OSS4_MIXER_SLIDER_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-mixer-enum.h0000644000175000017500000000465611671175354016657 00000000000000/* GStreamer OSS4 mixer on/off enum control * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_MIXER_ENUM_H #define GST_OSS4_MIXER_ENUM_H #include #include #include "oss4-mixer.h" G_BEGIN_DECLS #define GST_TYPE_OSS4_MIXER_ENUM (gst_oss4_mixer_enum_get_type()) #define GST_OSS4_MIXER_ENUM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER_ENUM,GstOss4MixerEnum)) #define GST_OSS4_MIXER_ENUM_CAST(obj) ((GstOss4MixerEnum *)(obj)) #define GST_OSS4_MIXER_ENUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER_ENUM,GstOss4MixerEnumClass)) #define GST_IS_OSS4_MIXER_ENUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER_ENUM)) #define GST_IS_OSS4_MIXER_ENUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER_ENUM)) typedef struct _GstOss4MixerEnum GstOss4MixerEnum; typedef struct _GstOss4MixerEnumClass GstOss4MixerEnumClass; struct _GstOss4MixerEnum { GstMixerOptions mixer_option; GstOss4MixerControl * mc; GstOss4Mixer * mixer; /* the mixer we belong to (no ref taken) */ gboolean need_update; }; struct _GstOss4MixerEnumClass { GstMixerOptionsClass mixer_option_class; }; GType gst_oss4_mixer_enum_get_type (void); gboolean gst_oss4_mixer_enum_set_option (GstOss4MixerEnum * e, const gchar * value); const gchar * gst_oss4_mixer_enum_get_option (GstOss4MixerEnum * e); GstMixerTrack * gst_oss4_mixer_enum_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc); void gst_oss4_mixer_enum_process_change_unlocked (GstMixerTrack * track); G_END_DECLS #endif /* GST_OSS4_MIXER_ENUM_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-mixer-switch.h0000644000175000017500000000471711671175354017212 00000000000000/* GStreamer OSS4 mixer on/off switch control * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_MIXER_SWITCH_H #define GST_OSS4_MIXER_SWITCH_H #include #include #include "oss4-mixer.h" G_BEGIN_DECLS #define GST_TYPE_OSS4_MIXER_SWITCH (gst_oss4_mixer_switch_get_type()) #define GST_OSS4_MIXER_SWITCH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER_SWITCH,GstOss4MixerSwitch)) #define GST_OSS4_MIXER_SWITCH_CAST(obj) ((GstOss4MixerSwitch *)(obj)) #define GST_OSS4_MIXER_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER_SWITCH,GstOss4MixerSwitchClass)) #define GST_IS_OSS4_MIXER_SWITCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER_SWITCH)) #define GST_IS_OSS4_MIXER_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER_SWITCH)) typedef struct _GstOss4MixerSwitch GstOss4MixerSwitch; typedef struct _GstOss4MixerSwitchClass GstOss4MixerSwitchClass; struct _GstOss4MixerSwitch { GstMixerTrack mixer_track; GstOss4MixerControl * mc; GstOss4Mixer * mixer; /* the mixer we belong to (no ref taken) */ }; struct _GstOss4MixerSwitchClass { GstMixerTrackClass mixer_track_class; }; GType gst_oss4_mixer_switch_get_type (void); gboolean gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean enabled); gboolean gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * enabled); GstMixerTrack * gst_oss4_mixer_switch_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc); void gst_oss4_mixer_switch_process_change_unlocked (GstMixerTrack * track); G_END_DECLS #endif /* GST_OSS4_MIXER_SWITCH_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-mixer.h0000644000175000017500000001267011671175354015710 00000000000000/* GStreamer OSS4 mixer implementation * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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 OSS4_MIXER_H #define OSS4_MIXER_H #include #include "oss4-soundcard.h" #define GST_OSS4_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_MIXER,GstOss4Mixer)) #define GST_OSS4_MIXER_CAST(obj) ((GstOss4Mixer *)(obj)) #define GST_OSS4_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_MIXER,GstOss4MixerClass)) #define GST_IS_OSS4_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_MIXER)) #define GST_IS_OSS4_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_MIXER)) #define GST_TYPE_OSS4_MIXER (gst_oss4_mixer_get_type()) #define GST_OSS4_MIXER_IS_OPEN(obj) (GST_OSS4_MIXER(obj)->fd != -1) typedef struct _GstOss4Mixer GstOss4Mixer; typedef struct _GstOss4MixerClass GstOss4MixerClass; struct _GstOss4Mixer { GstElement element; /*< private >*/ /* element bits'n'bops */ gchar * device; /* mixer details */ gint fd; /* file descriptor if open, or -1 */ gchar * device_name; /* device description, or NULL */ gchar * open_device; /* the device we opened */ GList * tracks; /* list of available tracks */ GList * controls; /* list of available controls */ gboolean need_update; /* re-read list of available tracks? */ oss_mixext last_mixext; /* we keep this around so we can * easily check if the mixer * interface has changed */ GThread * watch_thread; /* thread watching for value changes */ GCond * watch_cond; gint watch_shutdown; gint modify_counter; /* from MIXERINFO */ /* for property probe interface */ GList * property_probe_list; }; struct _GstOss4MixerClass { GstElementClass element_class; }; /* helper struct holding info about one control */ typedef struct _GstOss4MixerControl GstOss4MixerControl; struct _GstOss4MixerControl { oss_mixext mixext; GstOss4MixerControl *parent; /* NULL if root */ GstOss4MixerControl *mute; /* sibling with mute function, or NULL */ GList *mute_group; /* group of mute controls, or NULL */ GList *children; /* GstOss4MixerControls (no ownership) */ GQuark *enum_vals; /* 0-terminated array of values or NULL */ int enum_version; /* 0 = list won't change */ int last_val; /* last value seen */ gboolean is_virtual : 1; /* is a vmix control with dynamic label */ gboolean is_master : 1; gboolean is_slider : 1; /* represent as slider */ gboolean is_switch : 1; /* represent as switch */ gboolean is_enum : 1; /* represent as combo/enumeration */ gboolean no_list : 1; /* enumeration with no list available */ gboolean is_input : 1; /* is an input-related control */ gboolean is_output : 1; /* is an output-related control */ gboolean used : 1; /* whether we know what to do with this */ gboolean changed : 1; /* transient flag used by watch thread */ gboolean list_changed : 1; /* transient flag used by watch thread */ }; /* header says parent=-1 means root, but it can also be parent=ctrl */ #define MIXEXT_IS_ROOT(me) ((me).parent == -1 || (me).parent == (me).ctrl) #define MIXEXT_IS_SLIDER(me) ((me).type == MIXT_MONOSLIDER || \ (me).type == MIXT_STEREOSLIDER || (me).type == MIXT_MONOSLIDER16 || \ (me).type == MIXT_STEREOSLIDER16 || (me).type == MIXT_SLIDER) #define MIXEXT_HAS_DESCRIPTION(me) (((me).flags & MIXF_DESCR) != 0) #define MIXEXT_ENUM_IS_AVAILABLE(me,num) \ (((me).enum_present[num/8]) & (1 << (num % 8))) GType gst_oss4_mixer_get_type (void); gboolean gst_oss4_mixer_get_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc, int * val); gboolean gst_oss4_mixer_set_control_val (GstOss4Mixer * mixer, GstOss4MixerControl * mc, int val); G_END_DECLS #endif /* OSS4_MIXER_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-sink.h0000644000175000017500000000422711671175354015527 00000000000000/* GStreamer OSS4 audio sink * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_SINK_H #define GST_OSS4_SINK_H #include #include G_BEGIN_DECLS #define GST_TYPE_OSS4_SINK (gst_oss4_sink_get_type()) #define GST_OSS4_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS4_SINK,GstOss4Sink)) #define GST_OSS4_SINK_CAST(obj) ((GstOss4Sink *)(obj)) #define GST_OSS4_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS4_SINK,GstOss4SinkClass)) #define GST_IS_OSS4_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS4_SINK)) #define GST_IS_OSS4_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS4_SINK)) typedef struct _GstOss4Sink GstOss4Sink; typedef struct _GstOss4SinkClass GstOss4SinkClass; struct _GstOss4Sink { GstAudioSink audio_sink; gchar * device; /* NULL if none was set */ gchar * open_device; /* the device we opened */ gchar * device_name; /* set if the device is open */ gint fd; /* -1 if not open */ gint bytes_per_sample; gint mute_volume; GstCaps * probed_caps; GList * property_probe_list; }; struct _GstOss4SinkClass { GstAudioSinkClass audio_sink_class; }; GType gst_oss4_sink_get_type (void); G_END_DECLS #endif /* GST_OSS4_SINK_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-audio.h0000644000175000017500000000270211671175354015660 00000000000000/* GStreamer OSS4 audio plugin * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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_OSS4_AUDIO_H #define GST_OSS4_AUDIO_H_ #include #include /* This is the minimum version we require */ #define GST_MIN_OSS4_VERSION 0x040003 int gst_oss4_audio_get_version (GstObject * obj, int fd); gboolean gst_oss4_audio_check_version (GstObject * obj, int fd); GstCaps * gst_oss4_audio_probe_caps (GstObject * obj, int fd); gboolean gst_oss4_audio_set_format (GstObject * obj, int fd, GstRingBufferSpec * spec); GstCaps * gst_oss4_audio_get_template_caps (void); gchar * gst_oss4_audio_find_device (GstObject * oss); #endif /* GST_OSS4_AUDIO_H */ gst-plugins-good-0.10.31/sys/oss4/oss4-soundcard.h0000644000175000017500000022306011671175354016543 00000000000000/* * Purpose: The C/C++ header file that defines the OSS API. * Description: * This header file contains all the declarations required to compile OSS * programs. The latest version is always installed together with OSS * use of the latest version is strongly recommended. * * {!notice This header file contains many obsolete definitions * (for compatibility with older applications that still ned them). * Do not use this file as a reference manual of OSS. * Please check the OSS Programmer's guide for descriptions * of the supported API details (http://manuals.opensound.com/developer).} */ #ifndef SOUNDCARD_H #define SOUNDCARD_H #define COPYING40 Copyright (C) 4Front Technologies 2000-2006. Released under the BSD license. #if defined(__cplusplus) #define EXTERNC extern "C" #else #define EXTERNC extern #endif /* EXTERN_C_WRAPPERS */ #define OSS_VERSION 0x040090 // Pre 4.1 #define SOUND_VERSION OSS_VERSION #define OPEN_SOUND_SYSTEM #if defined(__hpux) && !defined(_HPUX_SOURCE) # error "-D_HPUX_SOURCE must be used when compiling OSS applications" #endif #ifdef __hpux #include #endif #ifdef linux /* In Linux we need to be prepared for cross compiling */ #include #else # ifdef __FreeBSD__ # include # else # include # endif #endif #ifndef __SIOWR #if defined(__hpux) || (defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__INCioctlh) && !defined(__Lynx__)))) /* * Make sure the ioctl macros are compatible with the ones already used * by this operating system. */ #define SIOCPARM_MASK IOCPARM_MASK #define SIOC_VOID IOC_VOID #define SIOC_OUT IOC_OUT #define SIOC_IN IOC_IN #define SIOC_INOUT IOC_INOUT #define __SIOC_SIZE _IOC_SIZE #define __SIOC_DIR _IOC_DIR #define __SIOC_NONE _IOC_NONE #define __SIOC_READ _IOC_READ #define __SIOC_WRITE _IOC_WRITE #define __SIO _IO #define __SIOR _IOR #define __SIOW _IOW #define __SIOWR _IOWR #else /* #define SIOCTYPE (0xff<<8) */ #define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */ #define SIOC_VOID 0x00000000 /* no parameters */ #define SIOC_OUT 0x20000000 /* copy out parameters */ #define SIOC_IN 0x40000000 /* copy in parameters */ #define SIOC_INOUT (SIOC_IN|SIOC_OUT) #define __SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y)) #define __SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) #define __SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) #define __SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) #define __SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK) #define __SIOC_DIR(x) (x & 0xf0000000) #define __SIOC_NONE SIOC_VOID #define __SIOC_READ SIOC_OUT #define __SIOC_WRITE SIOC_IN # endif /* _IOWR */ #endif /* !__SIOWR */ #define OSS_LONGNAME_SIZE 64 #define OSS_LABEL_SIZE 16 #define OSS_DEVNODE_SIZE 32 typedef char oss_longname_t[OSS_LONGNAME_SIZE]; typedef char oss_label_t[OSS_LABEL_SIZE]; typedef char oss_devnode_t[OSS_DEVNODE_SIZE]; #ifndef DISABLE_SEQUENCER /* **************************************************************************** * IOCTL Commands for /dev/sequencer and /dev/music (AKA /dev/sequencer2) * * Note that this interface is obsolete and no longer developed. New * applications should use /dev/midi instead. ****************************************************************************/ #define SNDCTL_SEQ_RESET __SIO ('Q', 0) #define SNDCTL_SEQ_SYNC __SIO ('Q', 1) #define SNDCTL_SYNTH_INFO __SIOWR('Q', 2, struct synth_info) #define SNDCTL_SEQ_CTRLRATE __SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */ #define SNDCTL_SEQ_GETOUTCOUNT __SIOR ('Q', 4, int) #define SNDCTL_SEQ_GETINCOUNT __SIOR ('Q', 5, int) #define SNDCTL_SEQ_PERCMODE __SIOW ('Q', 6, int) #define SNDCTL_FM_LOAD_INSTR __SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */ #define SNDCTL_SEQ_TESTMIDI __SIOW ('Q', 8, int) #define SNDCTL_SEQ_RESETSAMPLES __SIOW ('Q', 9, int) #define SNDCTL_SEQ_NRSYNTHS __SIOR ('Q',10, int) #define SNDCTL_SEQ_NRMIDIS __SIOR ('Q',11, int) #define SNDCTL_MIDI_INFO __SIOWR('Q',12, struct midi_info) /* OBSOLETE - use SNDCTL_MIDIINFO instead */ #define SNDCTL_SEQ_THRESHOLD __SIOW ('Q',13, int) #define SNDCTL_SYNTH_MEMAVL __SIOWR('Q',14, int) /* in=dev#, out=memsize */ #define SNDCTL_FM_4OP_ENABLE __SIOW ('Q',15, int) /* in=dev# */ #define SNDCTL_SEQ_PANIC __SIO ('Q',17) #define SNDCTL_SEQ_OUTOFBAND __SIOW ('Q',18, struct seq_event_rec) #define SNDCTL_SEQ_GETTIME __SIOR ('Q',19, int) #define SNDCTL_SYNTH_ID __SIOWR('Q',20, struct synth_info) #define SNDCTL_SYNTH_CONTROL __SIOWR('Q',21, struct synth_control) #define SNDCTL_SYNTH_REMOVESAMPLE __SIOWR('Q',22, struct remove_sample) /* Reserved for future use */ #define SNDCTL_SEQ_TIMING_ENABLE __SIO ('Q', 23) /* Enable incoming MIDI timing messages */ #define SNDCTL_SEQ_ACTSENSE_ENABLE __SIO ('Q', 24) /* Enable incoming active sensing messages */ #define SNDCTL_SEQ_RT_ENABLE __SIO ('Q', 25) /* Enable other incoming realtime messages */ typedef struct synth_control { int devno; /* Synthesizer # */ char data[4000]; /* Device spesific command/data record */ } synth_control; typedef struct remove_sample { int devno; /* Synthesizer # */ int bankno; /* MIDI bank # (0=General MIDI) */ int instrno; /* MIDI instrument number */ } remove_sample; typedef struct seq_event_rec { unsigned char arr[8]; } seq_event_rec; #define SNDCTL_TMR_TIMEBASE __SIOWR('T', 1, int) #define SNDCTL_TMR_START __SIO ('T', 2) #define SNDCTL_TMR_STOP __SIO ('T', 3) #define SNDCTL_TMR_CONTINUE __SIO ('T', 4) #define SNDCTL_TMR_TEMPO __SIOWR('T', 5, int) #define SNDCTL_TMR_SOURCE __SIOWR('T', 6, int) # define TMR_INTERNAL 0x00000001 # define TMR_EXTERNAL 0x00000002 # define TMR_MODE_MIDI 0x00000010 # define TMR_MODE_FSK 0x00000020 # define TMR_MODE_CLS 0x00000040 # define TMR_MODE_SMPTE 0x00000080 #define SNDCTL_TMR_METRONOME __SIOW ('T', 7, int) #define SNDCTL_TMR_SELECT __SIOW ('T', 8, int) /* * Sample loading mechanism for internal synthesizers (/dev/sequencer) * (for the .PAT format). */ struct patch_info { unsigned short key; /* Use WAVE_PATCH here */ #define WAVE_PATCH _PATCHKEY(0x04) #define GUS_PATCH WAVE_PATCH #define WAVEFRONT_PATCH _PATCHKEY(0x06) short device_no; /* Synthesizer number */ short instr_no; /* Midi pgm# */ unsigned int mode; /* * The least significant byte has the same format than the GUS .PAT * files */ #define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ #define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ #define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ #define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ #define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ #define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3) */ #define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ #define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */ /* (use the env_rate/env_offs fields). */ /* Linux specific bits */ #define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ #define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ #define WAVE_SCALE 0x00040000 /* The scaling info is valid */ #define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */ /* Reserved bits */ #define WAVE_ROM 0x40000000 /* For future use */ #define WAVE_MULAW 0x20000000 /* For future use */ /* Other bits must be zeroed */ int len; /* Size of the wave data in bytes */ int loop_start, loop_end; /* Byte offsets from the beginning */ /* * The base_freq and base_note fields are used when computing the * playback speed for a note. The base_note defines the tone frequency * which is heard if the sample is played using the base_freq as the * playback speed. * * The low_note and high_note fields define the minimum and maximum note * frequencies for which this sample is valid. It is possible to define * more than one samples for an instrument number at the same time. The * low_note and high_note fields are used to select the most suitable one. * * The fields base_note, high_note and low_note should contain * the note frequency multiplied by 1000. For example value for the * middle A is 440*1000. */ unsigned int base_freq; unsigned int base_note; unsigned int high_note; unsigned int low_note; int panning; /* -128=left, 127=right */ int detuning; /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ unsigned char env_rate[6]; /* GUS HW ramping rate */ unsigned char env_offset[6]; /* 255 == 100% */ /* * The tremolo, vibrato and scale info are not supported yet. * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or * WAVE_SCALE */ unsigned char tremolo_sweep; unsigned char tremolo_rate; unsigned char tremolo_depth; unsigned char vibrato_sweep; unsigned char vibrato_rate; unsigned char vibrato_depth; int scale_frequency; unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */ int volume; int fractions; int reserved1; int spare[2]; char data[1]; /* The waveform data starts here */ }; struct sysex_info { short key; /* Use SYSEX_PATCH or MAUI_PATCH here */ #define SYSEX_PATCH _PATCHKEY(0x05) #define MAUI_PATCH _PATCHKEY(0x06) short device_no; /* Synthesizer number */ int len; /* Size of the sysex data in bytes */ unsigned char data[1]; /* Sysex data starts here */ }; /* * /dev/sequencer input events. * * The data written to the /dev/sequencer is a stream of events. Events * are records of 4 or 8 bytes. The first byte defines the size. * Any number of events can be written with a write call. There * is a set of macros for sending these events. Use these macros if you * want to maximize portability of your program. * * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. * (All input events are currently 4 bytes long. Be prepared to support * 8 byte events also. If you receive any event having first byte >= 128, * it's a 8 byte event. * * The events are documented at the end of this file. * * Normal events (4 bytes) * There is also a 8 byte version of most of the 4 byte events. The * 8 byte one is recommended. * * NOTE! All 4 byte events are now obsolete. Applications should not write * them. However 4 byte events are still used as inputs from * /dev/sequencer (/dev/music uses only 8 byte ones). */ #define SEQ_NOTEOFF 0 #define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ #define SEQ_NOTEON 1 #define SEQ_FMNOTEON SEQ_NOTEON #define SEQ_WAIT TMR_WAIT_ABS #define SEQ_PGMCHANGE 3 #define SEQ_FMPGMCHANGE SEQ_PGMCHANGE #define SEQ_SYNCTIMER TMR_START #define SEQ_MIDIPUTC 5 #define SEQ_DRUMON 6 /*** OBSOLETE ***/ #define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ #define SEQ_ECHO TMR_ECHO /* For synching programs with output */ #define SEQ_AFTERTOUCH 9 #define SEQ_CONTROLLER 10 #define SEQ_BALANCE 11 #define SEQ_VOLMODE 12 /************************************ * Midi controller numbers * ************************************/ /* * Controllers 0 to 31 (0x00 to 0x1f) and * 32 to 63 (0x20 to 0x3f) are continuous * controllers. * In the MIDI 1.0 these controllers are sent using * two messages. Controller numbers 0 to 31 are used * to send the MSB and the controller numbers 32 to 63 * are for the LSB. Note that just 7 bits are used in MIDI bytes. */ #define CTL_BANK_SELECT 0x00 #define CTL_MODWHEEL 0x01 #define CTL_BREATH 0x02 /* undefined 0x03 */ #define CTL_FOOT 0x04 #define CTL_PORTAMENTO_TIME 0x05 #define CTL_DATA_ENTRY 0x06 #define CTL_MAIN_VOLUME 0x07 #define CTL_BALANCE 0x08 /* undefined 0x09 */ #define CTL_PAN 0x0a #define CTL_EXPRESSION 0x0b /* undefined 0x0c */ /* undefined 0x0d */ /* undefined 0x0e */ /* undefined 0x0f */ #define CTL_GENERAL_PURPOSE1 0x10 #define CTL_GENERAL_PURPOSE2 0x11 #define CTL_GENERAL_PURPOSE3 0x12 #define CTL_GENERAL_PURPOSE4 0x13 /* undefined 0x14 - 0x1f */ /* undefined 0x20 */ /* The controller numbers 0x21 to 0x3f are reserved for the */ /* least significant bytes of the controllers 0x00 to 0x1f. */ /* These controllers are not recognised by the driver. */ /* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */ /* 0=OFF and 127=ON (intermediate values are possible) */ #define CTL_DAMPER_PEDAL 0x40 #define CTL_SUSTAIN 0x40 /* Alias */ #define CTL_HOLD 0x40 /* Alias */ #define CTL_PORTAMENTO 0x41 #define CTL_SOSTENUTO 0x42 #define CTL_SOFT_PEDAL 0x43 /* undefined 0x44 */ #define CTL_HOLD2 0x45 /* undefined 0x46 - 0x4f */ #define CTL_GENERAL_PURPOSE5 0x50 #define CTL_GENERAL_PURPOSE6 0x51 #define CTL_GENERAL_PURPOSE7 0x52 #define CTL_GENERAL_PURPOSE8 0x53 /* undefined 0x54 - 0x5a */ #define CTL_EXT_EFF_DEPTH 0x5b #define CTL_TREMOLO_DEPTH 0x5c #define CTL_CHORUS_DEPTH 0x5d #define CTL_DETUNE_DEPTH 0x5e #define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */ #define CTL_PHASER_DEPTH 0x5f #define CTL_DATA_INCREMENT 0x60 #define CTL_DATA_DECREMENT 0x61 #define CTL_NONREG_PARM_NUM_LSB 0x62 #define CTL_NONREG_PARM_NUM_MSB 0x63 #define CTL_REGIST_PARM_NUM_LSB 0x64 #define CTL_REGIST_PARM_NUM_MSB 0x65 /* undefined 0x66 - 0x78 */ /* reserved 0x79 - 0x7f */ /* Pseudo controllers (not midi compatible) */ #define CTRL_PITCH_BENDER 255 #define CTRL_PITCH_BENDER_RANGE 254 #define CTRL_EXPRESSION 253 /* Obsolete */ #define CTRL_MAIN_VOLUME 252 /* Obsolete */ /* * Volume mode defines how volumes are used */ #define VOL_METHOD_ADAGIO 1 #define VOL_METHOD_LINEAR 2 /* * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as * input events. */ /* * Event codes 0xf0 to 0xfc are reserved for future extensions. */ #define SEQ_FULLSIZE 0xfd /* Long events */ /* * SEQ_FULLSIZE events are used for loading patches/samples to the * synthesizer devices. These events are passed directly to the driver * of the associated synthesizer device. There is no limit to the size * of the extended events. These events are not queued but executed * immediately when the write() is called (execution can take several * seconds of time). * * When a SEQ_FULLSIZE message is written to the device, it must * be written using exactly one write() call. Other events cannot * be mixed to the same write. * * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the * /dev/sequencer. Don't write other data together with the instrument structure * Set the key field of the structure to FM_PATCH. The device field is used to * route the patch to the corresponding device. * * For wave table use struct patch_info. Initialize the key field * to WAVE_PATCH. */ #define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ #define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ /* * Record for FM patches */ typedef unsigned char sbi_instr_data[32]; struct sbi_instrument { unsigned short key; /* FM_PATCH or OPL3_PATCH */ #define FM_PATCH _PATCHKEY(0x01) #define OPL3_PATCH _PATCHKEY(0x03) short device; /* Synth# (0-4) */ int channel; /* Program# to be initialized */ sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ }; struct synth_info { /* Read only */ char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ int synth_type; #define SYNTH_TYPE_FM 0 #define SYNTH_TYPE_SAMPLE 1 #define SYNTH_TYPE_MIDI 2 /* Midi interface */ int synth_subtype; #define FM_TYPE_ADLIB 0x00 #define FM_TYPE_OPL3 0x01 #define MIDI_TYPE_MPU401 0x401 #define SAMPLE_TYPE_BASIC 0x10 #define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC #define SAMPLE_TYPE_WAVEFRONT 0x11 int perc_mode; /* No longer supported */ int nr_voices; int nr_drums; /* Obsolete field */ int instr_bank_size; unsigned int capabilities; #define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ #define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ #define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ int dummies[19]; /* Reserve space */ }; struct sound_timer_info { char name[32]; int caps; }; struct midi_info /* OBSOLETE */ { char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ unsigned int capabilities; /* To be defined later */ int dev_type; int dummies[18]; /* Reserve space */ }; /* * Level 2 event types for /dev/sequencer */ /* * The 4 most significant bits of byte 0 specify the class of * the event: * * 0x8X = system level events, * 0x9X = device/port specific events, event[1] = device/port, * The last 4 bits give the subtype: * 0x02 = Channel event (event[3] = chn). * 0x01 = note event (event[4] = note). * (0x01 is not used alone but always with bit 0x02). * event[2] = MIDI message code (0x80=note off etc.) * */ #define EV_SEQ_LOCAL 0x80 #define EV_TIMING 0x81 #define EV_CHN_COMMON 0x92 #define EV_CHN_VOICE 0x93 #define EV_SYSEX 0x94 #define EV_SYSTEM 0x95 /* MIDI system and real time messages (input only) */ /* * Event types 200 to 220 are reserved for application use. * These numbers will not be used by the driver. */ /* * Events for event type EV_CHN_VOICE */ #define MIDI_NOTEOFF 0x80 #define MIDI_NOTEON 0x90 #define MIDI_KEY_PRESSURE 0xA0 /* * Events for event type EV_CHN_COMMON */ #define MIDI_CTL_CHANGE 0xB0 #define MIDI_PGM_CHANGE 0xC0 #define MIDI_CHN_PRESSURE 0xD0 #define MIDI_PITCH_BEND 0xE0 #define MIDI_SYSTEM_PREFIX 0xF0 /* * Timer event types */ #define TMR_WAIT_REL 1 /* Time relative to the prev time */ #define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ #define TMR_STOP 3 #define TMR_START 4 #define TMR_CONTINUE 5 #define TMR_TEMPO 6 #define TMR_ECHO 8 #define TMR_CLOCK 9 /* MIDI clock */ #define TMR_SPP 10 /* Song position pointer */ #define TMR_TIMESIG 11 /* Time signature */ /* * Local event types */ #define LOCL_STARTAUDIO 1 #define LOCL_STARTAUDIO2 2 #define LOCL_STARTAUDIO3 3 #define LOCL_STARTAUDIO4 4 #if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS) /* * Some convenience macros to simplify programming of the * /dev/sequencer interface * * These macros define the API which should be used when possible. */ #define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() void seqbuf_dump (void); /* This function must be provided by programs */ EXTERNC int OSS_init (int seqfd, int buflen); EXTERNC void OSS_seqbuf_dump (int fd, unsigned char *buf, int buflen); EXTERNC void OSS_seq_advbuf (int len, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_seq_needbuf (int len, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_patch_caching (int dev, int chn, int patch, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_drum_caching (int dev, int chn, int patch, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_write_patch (int fd, unsigned char *buf, int len); EXTERNC int OSS_write_patch2 (int fd, unsigned char *buf, int len); #define SEQ_PM_DEFINES int __foo_bar___ #ifdef OSSLIB # define SEQ_USE_EXTBUF() \ EXTERNC unsigned char *_seqbuf; \ EXTERNC int _seqbuflen;EXTERNC int _seqbufptr # define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len # define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen) # define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen) # define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen) # define SEQ_LOAD_GMINSTR(dev, instr) \ OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen) # define SEQ_LOAD_GMDRUM(dev, drum) \ OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen) #else /* !OSSLIB */ # define SEQ_LOAD_GMINSTR(dev, instr) # define SEQ_LOAD_GMDRUM(dev, drum) # define SEQ_USE_EXTBUF() \ EXTERNC unsigned char _seqbuf[]; \ EXTERNC int _seqbuflen;EXTERNC int _seqbufptr #ifndef USE_SIMPLE_MACROS /* Sample seqbuf_dump() implementation: * * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes * * int seqfd; -- The file descriptor for /dev/sequencer. * * void * seqbuf_dump () * { * if (_seqbufptr) * if (write (seqfd, _seqbuf, _seqbufptr) == -1) * { * perror ("write /dev/sequencer"); * exit (-1); * } * _seqbufptr = 0; * } */ #define SEQ_DEFINEBUF(len) \ unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 #define _SEQ_NEEDBUF(len) \ if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump() #define _SEQ_ADVBUF(len) _seqbufptr += len #define SEQ_DUMPBUF seqbuf_dump #else /* * This variation of the sequencer macros is used just to format one event * using fixed buffer. * * The program using the macro library must define the following macros before * using this library. * * #define _seqbuf name of the buffer (unsigned char[]) * #define _SEQ_ADVBUF(len) If the applic needs to know the exact * size of the event, this macro can be used. * Otherwise this must be defined as empty. * #define _seqbufptr Define the name of index variable or 0 if * not required. */ #define _SEQ_NEEDBUF(len) /* empty */ #endif #endif /* !OSSLIB */ #define SEQ_VOLUME_MODE(dev, mode) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (mode);\ _seqbuf[_seqbufptr+4] = 0;\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} /* * Midi voice messages */ #define _CHN_VOICE(dev, event, chn, note, parm) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (note);\ _seqbuf[_seqbufptr+5] = (parm);\ _seqbuf[_seqbufptr+6] = (0);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} #define SEQ_START_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) #define SEQ_STOP_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) #define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) /* * Midi channel messages */ #define _CHN_COMMON(dev, event, chn, p1, p2, w14) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (p1);\ _seqbuf[_seqbufptr+5] = (p2);\ *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ _SEQ_ADVBUF(8);} /* * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits * sending any MIDI bytes but it's absolutely not possible. Trying to do * so _will_ cause problems with MPU401 intelligent mode). * * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be * sent by calling SEQ_SYSEX() several times (there must be no other events * between them). First sysex fragment must have 0xf0 in the first byte * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte * between these sysex start and end markers cannot be larger than 0x7f. Also * lengths of each fragments (except the last one) must be 6. * * Breaking the above rules may work with some MIDI ports but is likely to * cause fatal problems with some other devices (such as MPU401). */ #define SEQ_SYSEX(dev, buf, len) \ {int ii, ll=(len); \ unsigned char *bufp=buf;\ if (ll>6)ll=6;\ _SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_SYSEX;\ _seqbuf[_seqbufptr+1] = (dev);\ for(ii=0;ii>8)&0xff);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} /* * The following 5 macros are incorrectly implemented and obsolete. * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead. */ #define SEQ_PITCHBEND(dev, voice, value) \ SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value) #define SEQ_BENDER_RANGE(dev, voice, value) \ SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value) #define SEQ_EXPRESSION(dev, voice, value) \ SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128) #define SEQ_MAIN_VOLUME(dev, voice, value) \ SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100) #define SEQ_PANNING(dev, voice, pos) \ SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2) /* * Timing and syncronization macros */ #define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr+0] = EV_TIMING; \ _seqbuf[_seqbufptr+1] = (ev); \ _seqbuf[_seqbufptr+2] = 0;\ _seqbuf[_seqbufptr+3] = 0;\ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ _SEQ_ADVBUF(8);} #define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0) #define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0) #define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0) #define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks) #define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks) #define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key) #define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value) #define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos) #define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig) /* * Local control events */ #define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \ _seqbuf[_seqbufptr+1] = (ev); \ _seqbuf[_seqbufptr+2] = 0;\ _seqbuf[_seqbufptr+3] = 0;\ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ _SEQ_ADVBUF(8);} #define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask) #define SEQ_PLAYAUDIO2(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO2, devmask) #define SEQ_PLAYAUDIO3(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO3, devmask) #define SEQ_PLAYAUDIO4(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO4, devmask) /* * Events for the level 1 interface only */ #define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ _seqbuf[_seqbufptr+1] = (byte);\ _seqbuf[_seqbufptr+2] = (device);\ _seqbuf[_seqbufptr+3] = 0;\ _SEQ_ADVBUF(4);} /* * Patch loading. */ #ifdef OSSLIB # define SEQ_WRPATCH(patchx, len) \ OSS_write_patch(seqfd, (char*)(patchx), len) # define SEQ_WRPATCH2(patchx, len) \ OSS_write_patch2(seqfd, (char*)(patchx), len) #else # define SEQ_WRPATCH(patchx, len) \ {if (_seqbufptr) SEQ_DUMPBUF();\ if (write(seqfd, (char*)(patchx), len)==-1) \ perror("Write patch: /dev/sequencer");} # define SEQ_WRPATCH2(patchx, len) \ (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len)) #endif #endif #endif /* ifndef DISABLE_SEQUENCER */ /* **************************************************************************** * ioctl commands for the /dev/midi## ****************************************************************************/ #define SNDCTL_MIDI_PRETIME __SIOWR('m', 0, int) #if 0 /* * The SNDCTL_MIDI_MPUMODE and SNDCTL_MIDI_MPUCMD calls * are completely obsolete. The hardware device (MPU-401 "intelligent mode" * and compatibles) has disappeared from the market 10 years ago so there * is no need for this stuff. The MPU-401 "UART" mode devices don't support * this stuff. */ typedef struct { unsigned char cmd; char nr_args, nr_returns; unsigned char data[30]; } mpu_command_rec; #define SNDCTL_MIDI_MPUMODE __SIOWR('m', 1, int) #define SNDCTL_MIDI_MPUCMD __SIOWR('m', 2, mpu_command_rec) #endif /* * SNDCTL_MIDI_MTCINPUT turns on a mode where OSS automatically inserts * MTC quarter frame messages (F1 xx) to the input. * The argument is the MTC mode: * * -1 = Turn MTC messages OFF (default) * 24 = 24 FPS * 25 = 25 FPS * 29 = 30 FPS drop frame * 30 = 30 FPS * * Note that 25 FPS mode is probably the only mode that is supported. Other * modes may be supported in the future versions of OSS, 25 FPS is handy * because it generates 25*4=100 quarter frame messages per second which * matches the usual 100 HZ system timer rate). * * The quarter frame timer will be reset to 0:00:00:00.0 at the moment this * ioctl is made. */ #define SNDCTL_MIDI_MTCINPUT __SIOWR('m', 3, int) /* * MTC/SMPTE time code record (for future use) */ typedef struct { unsigned char hours, minutes, seconds, frames, qframes; char direction; #define MTC_DIR_STOPPED 0 #define MTC_DIR_FORWARD 1 #define MTC_DIR_BACKWARD -1 unsigned char time_code_type; unsigned int flags; } oss_mtc_data_t; #define SNDCTL_MIDI_SETMODE __SIOWR('m', 6, int) # define MIDI_MODE_TRADITIONAL 0 # define MIDI_MODE_TIMED 1 /* Input times are in MIDI ticks */ # define MIDI_MODE_TIMED_ABS 2 /* Input times are absolute (usecs) */ /* * Packet header for MIDI_MODE_TIMED and MIDI_MODE_TIMED_ABS */ typedef unsigned long long oss_midi_time_t; /* Variable type for MIDI time (clock ticks) */ typedef struct { int magic; /* Initialize to MIDI_HDR_MAGIC */ #define MIDI_HDR_MAGIC -1 unsigned short event_type; #define MIDI_EV_WRITE 0 /* Write or read (with payload) */ #define MIDI_EV_TEMPO 1 #define MIDI_EV_ECHO 2 #define MIDI_EV_START 3 #define MIDI_EV_STOP 4 #define MIDI_EV_CONTINUE 5 #define MIDI_EV_XPRESSWRITE 6 #define MIDI_EV_TIMEBASE 7 #define MIDI_EV_DEVCTL 8 /* Device control read/write */ unsigned short options; #define MIDI_OPT_NONE 0x0000 #define MIDI_OPT_TIMED 0x0001 #define MIDI_OPT_CONTINUATION 0x0002 #define MIDI_OPT_USECTIME 0x0004 /* Time is absolute (in usecs) */ #define MIDI_OPT_BUSY 0x0008 /* Reserved for internal use */ oss_midi_time_t time; int parm; int filler[3]; /* Fur future expansion - init to zeros */ } midi_packet_header_t; /* * MIDI_PAYLOAD_SIZE is the maximum size of one MIDI input chunk. It must be * less (or equal) than 1024 which is the read size recommended in the * documentation. TODO: Explain this better. */ #define MIDI_PAYLOAD_SIZE 1000 typedef struct { midi_packet_header_t hdr; unsigned char payload[MIDI_PAYLOAD_SIZE]; } midi_packet_t; #define SNDCTL_MIDI_TIMEBASE __SIOWR('m', 7, int) #define SNDCTL_MIDI_TEMPO __SIOWR('m', 8, int) /* * User land MIDI servers (synths) can use SNDCTL_MIDI_SET_LATENCY * to request MIDI events to be sent to them in advance. The parameter * (in microseconds) tells how much before the events are submitted. * * This feature is only valid for loopback devices and possibly some other * types of virtual devices. */ #define SNDCTL_MIDI_SET_LATENCY __SIOW ('m', 9, int) /* **************************************************************************** * IOCTL commands for /dev/dsp ****************************************************************************/ #define SNDCTL_DSP_HALT __SIO ('P', 0) #define SNDCTL_DSP_RESET SNDCTL_DSP_HALT /* Old name */ #define SNDCTL_DSP_SYNC __SIO ('P', 1) #define SNDCTL_DSP_SPEED __SIOWR('P', 2, int) /* SNDCTL_DSP_STEREO is obsolete - use SNDCTL_DSP_CHANNELS instead */ #define SNDCTL_DSP_STEREO __SIOWR('P', 3, int) /* SNDCTL_DSP_STEREO is obsolete - use SNDCTL_DSP_CHANNELS instead */ #define SNDCTL_DSP_GETBLKSIZE __SIOWR('P', 4, int) #define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT #define SNDCTL_DSP_CHANNELS __SIOWR('P', 6, int) #define SNDCTL_DSP_POST __SIO ('P', 8) #define SNDCTL_DSP_SUBDIVIDE __SIOWR('P', 9, int) #define SNDCTL_DSP_SETFRAGMENT __SIOWR('P',10, int) /* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */ #define SNDCTL_DSP_GETFMTS __SIOR ('P',11, int) /* Returns a mask */ #define SNDCTL_DSP_SETFMT __SIOWR('P',5, int) /* Selects ONE fmt */ # define AFMT_QUERY 0x00000000 /* Return current fmt */ # define AFMT_MU_LAW 0x00000001 # define AFMT_A_LAW 0x00000002 # define AFMT_IMA_ADPCM 0x00000004 # define AFMT_U8 0x00000008 # define AFMT_S16_LE 0x00000010 /* Little endian signed 16 */ # define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */ # define AFMT_S8 0x00000040 # define AFMT_U16_LE 0x00000080 /* Little endian U16 */ # define AFMT_U16_BE 0x00000100 /* Big endian U16 */ # define AFMT_MPEG 0x00000200 /* MPEG (2) audio */ /* AC3 _compressed_ bitstreams (See Programmer's Guide for details). */ # define AFMT_AC3 0x00000400 /* Ogg Vorbis _compressed_ bit streams */ # define AFMT_VORBIS 0x00000800 /* 32 bit formats (MSB aligned) formats */ # define AFMT_S32_LE 0x00001000 # define AFMT_S32_BE 0x00002000 /* Reserved for _native_ endian double precision IEEE floating point */ # define AFMT_FLOAT 0x00004000 /* 24 bit formats (LSB aligned in 32 bit word) formats */ # define AFMT_S24_LE 0x00008000 # define AFMT_S24_BE 0x00010000 /* * S/PDIF raw format. In this format the S/PDIF frames (including all * control and user bits) are included in the data stream. Each sample * is stored in a 32 bit frame (see IEC-958 for more info). This format * is supported by very few devices and it's only usable for purposes * where full access to the control/user bits is required (real time control). */ # define AFMT_SPDIF_RAW 0x00020000 /* 24 bit packed (3 byte) little endian format (USB compatibility) */ # define AFMT_S24_PACKED 0x00040000 /* * Some big endian/little endian handling macros (native endian and opposite * endian formats). The usage of these macros is described in the OSS * Programmer's Manual. */ #if defined(_AIX) || defined(AIX) || defined(sparc) || defined(__hppa) || defined(PPC) || defined(__powerpc__) && !defined(i386) && !defined(__i386) && !defined(__i386__) /* Big endian machines */ # define _PATCHKEY(id) (0xfd00|id) # define AFMT_S16_NE AFMT_S16_BE # define AFMT_U16_NE AFMT_U16_BE # define AFMT_S32_NE AFMT_S32_BE # define AFMT_S24_NE AFMT_S24_BE # define AFMT_S16_OE AFMT_S16_LE # define AFMT_S32_OE AFMT_S32_LE # define AFMT_S24_OE AFMT_S24_LE #else # define _PATCHKEY(id) ((id<<8)|0xfd) # define AFMT_S16_NE AFMT_S16_LE # define AFMT_U16_NE AFMT_U16_LE # define AFMT_S32_NE AFMT_S32_LE # define AFMT_S24_NE AFMT_S24_LE # define AFMT_S16_OE AFMT_S16_BE # define AFMT_S32_OE AFMT_S32_BE # define AFMT_S24_OE AFMT_S24_BE #endif /* * Buffer status queries. */ typedef struct audio_buf_info { int fragments; /* # of available fragments (partially usend ones not counted) */ int fragstotal; /* Total # of fragments allocated */ int fragsize; /* Size of a fragment in bytes */ int bytes; /* Available space in bytes (includes partially used fragments) */ /* Note! 'bytes' could be more than fragments*fragsize */ } audio_buf_info; #define SNDCTL_DSP_GETOSPACE __SIOR ('P',12, audio_buf_info) #define SNDCTL_DSP_GETISPACE __SIOR ('P',13, audio_buf_info) #define SNDCTL_DSP_GETCAPS __SIOR ('P',15, int) # define PCM_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */ # define PCM_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ # define PCM_CAP_REALTIME 0x00000200 /* Not in use */ # define PCM_CAP_BATCH 0x00000400 /* Device has some kind of */ /* internal buffers which may */ /* cause some delays and */ /* decrease precision of timing */ # define PCM_CAP_COPROC 0x00000800 /* Has a coprocessor */ /* Sometimes it's a DSP */ /* but usually not */ # define PCM_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ # define PCM_CAP_MMAP 0x00002000 /* Supports mmap() */ # define PCM_CAP_MULTI 0x00004000 /* Supports multiple open */ # define PCM_CAP_BIND 0x00008000 /* Supports binding to front/rear/center/lfe */ # define PCM_CAP_INPUT 0x00010000 /* Supports recording */ # define PCM_CAP_OUTPUT 0x00020000 /* Supports playback */ # define PCM_CAP_VIRTUAL 0x00040000 /* Virtual device */ /* 0x00040000 and 0x00080000 reserved for future use */ /* Analog/digital control capabilities */ # define PCM_CAP_ANALOGOUT 0x00100000 # define PCM_CAP_ANALOGIN 0x00200000 # define PCM_CAP_DIGITALOUT 0x00400000 # define PCM_CAP_DIGITALIN 0x00800000 # define PCM_CAP_ADMASK 0x00f00000 /* * NOTE! (capabilities & PCM_CAP_ADMASK)==0 means just that the * digital/analog interface control features are not supported by the * device/driver. However the device still supports analog, digital or * both inputs/outputs (depending on the device). See the OSS Programmer's * Guide for full details. */ # define PCM_CAP_SHADOW 0x01000000 /* "Shadow" device */ /* * Preferred channel usage. These bits can be used to * give recommendations to the application. Used by few drivers. * For example if ((caps & DSP_CH_MASK) == DSP_CH_MONO) means that * the device works best in mono mode. However it doesn't necessarily mean * that the device cannot be used in stereo. These bits should only be used * by special applications such as multi track hard disk recorders to find * out the initial setup. However the user should be able to override this * selection. * * To find out which modes are actually supported the application should * try to select them using SNDCTL_DSP_CHANNELS. */ # define DSP_CH_MASK 0x06000000 /* Mask */ # define DSP_CH_ANY 0x00000000 /* No preferred mode */ # define DSP_CH_MONO 0x02000000 # define DSP_CH_STEREO 0x04000000 # define DSP_CH_MULTI 0x06000000 /* More than two channels */ # define PCM_CAP_HIDDEN 0x08000000 /* Hidden device */ # define PCM_CAP_FREERATE 0x10000000 # define PCM_CAP_MODEM 0x20000000 /* Modem device */ # define PCM_CAP_DEFAULT 0x40000000 /* "Default" device */ /* * The PCM_CAP_* capability names were known as DSP_CAP_* prior OSS 4.0 * so it's necessary to define the older names too. */ #define DSP_CAP_ADMASK PCM_CAP_ADMASK #define DSP_CAP_ANALOGIN PCM_CAP_ANALOGIN #define DSP_CAP_ANALOGOUT PCM_CAP_ANALOGOUT #define DSP_CAP_BATCH PCM_CAP_BATCH #define DSP_CAP_BIND PCM_CAP_BIND #define DSP_CAP_COPROC PCM_CAP_COPROC #define DSP_CAP_DEFAULT PCM_CAP_DEFAULT #define DSP_CAP_DIGITALIN PCM_CAP_DIGITALIN #define DSP_CAP_DIGITALOUT PCM_CAP_DIGITALOUT #define DSP_CAP_DUPLEX PCM_CAP_DUPLEX #define DSP_CAP_FREERATE PCM_CAP_FREERATE #define DSP_CAP_HIDDEN PCM_CAP_HIDDEN #define DSP_CAP_INPUT PCM_CAP_INPUT #define DSP_CAP_MMAP PCM_CAP_MMAP #define DSP_CAP_MODEM PCM_CAP_MODEM #define DSP_CAP_MULTI PCM_CAP_MULTI #define DSP_CAP_OUTPUT PCM_CAP_OUTPUT #define DSP_CAP_REALTIME PCM_CAP_REALTIME #define DSP_CAP_REVISION PCM_CAP_REVISION #define DSP_CAP_SHADOW PCM_CAP_SHADOW #define DSP_CAP_TRIGGER PCM_CAP_TRIGGER #define DSP_CAP_VIRTUAL PCM_CAP_VIRTUAL #define SNDCTL_DSP_GETTRIGGER __SIOR ('P',16, int) #define SNDCTL_DSP_SETTRIGGER __SIOW ('P',16, int) # define PCM_ENABLE_INPUT 0x00000001 # define PCM_ENABLE_OUTPUT 0x00000002 typedef struct count_info { unsigned int bytes; /* Total # of bytes processed */ int blocks; /* # of fragment transitions since last time */ int ptr; /* Current DMA pointer value */ } count_info; #define SNDCTL_DSP_GETIPTR __SIOR ('P',17, count_info) #define SNDCTL_DSP_GETOPTR __SIOR ('P',18, count_info) typedef struct buffmem_desc { unsigned *buffer; int size; } buffmem_desc; #define SNDCTL_DSP_SETSYNCRO __SIO ('P', 21) #define SNDCTL_DSP_SETDUPLEX __SIO ('P', 22) #define SNDCTL_DSP_PROFILE __SIOW ('P', 23, int) /* OBSOLETE */ #define APF_NORMAL 0 /* Normal applications */ #define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */ #define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */ #define SNDCTL_DSP_GETODELAY __SIOR ('P', 23, int) typedef struct audio_errinfo { int play_underruns; int rec_overruns; unsigned int play_ptradjust; unsigned int rec_ptradjust; int play_errorcount; int rec_errorcount; int play_lasterror; int rec_lasterror; int play_errorparm; int rec_errorparm; int filler[16]; } audio_errinfo; #define SNDCTL_DSP_GETPLAYVOL __SIOR ('P', 24, int) #define SNDCTL_DSP_SETPLAYVOL __SIOWR('P', 24, int) #define SNDCTL_DSP_GETERROR __SIOR ('P', 25, audio_errinfo) /* **************************************************************************** * Digital interface (S/PDIF) control interface */ typedef struct oss_digital_control { unsigned int caps; #define DIG_CBITIN_NONE 0x00000000 #define DIG_CBITIN_LIMITED 0x00000001 #define DIG_CBITIN_DATA 0x00000002 #define DIG_CBITIN_BYTE0 0x00000004 #define DIG_CBITIN_FULL 0x00000008 #define DIG_CBITIN_MASK 0x0000000f #define DIG_CBITOUT_NONE 0x00000000 #define DIG_CBITOUT_LIMITED 0x00000010 #define DIG_CBITOUT_BYTE0 0x00000020 #define DIG_CBITOUT_FULL 0x00000040 #define DIG_CBITOUT_DATA 0x00000080 #define DIG_CBITOUT_MASK 0x000000f0 #define DIG_UBITIN 0x00000100 #define DIG_UBITOUT 0x00000200 #define DIG_VBITOUT 0x00000400 #define DIG_OUTRATE 0x00000800 #define DIG_INRATE 0x00001000 #define DIG_INBITS 0x00002000 #define DIG_OUTBITS 0x00004000 #define DIG_EXACT 0x00010000 #define DIG_PRO 0x00020000 #define DIG_CONSUMER 0x00040000 #define DIG_PASSTHROUGH 0x00080000 #define DIG_OUTSEL 0x00100000 unsigned int valid; #define VAL_CBITIN 0x00000001 #define VAL_UBITIN 0x00000002 #define VAL_CBITOUT 0x00000004 #define VAL_UBITOUT 0x00000008 #define VAL_ISTATUS 0x00000010 #define VAL_IRATE 0x00000020 #define VAL_ORATE 0x00000040 #define VAL_INBITS 0x00000080 #define VAL_OUTBITS 0x00000100 #define VAL_REQUEST 0x00000200 #define VAL_OUTSEL 0x00000400 #define VAL_OUTMASK (VAL_CBITOUT|VAL_UBITOUT|VAL_ORATE|VAL_OUTBITS|VAL_OUTSEL) unsigned int request, param; #define SPD_RQ_PASSTHROUGH 1 unsigned char cbitin[24]; unsigned char ubitin[24]; unsigned char cbitout[24]; unsigned char ubitout[24]; unsigned int outsel; #define OUTSEL_DIGITAL 1 #define OUTSEL_ANALOG 2 #define OUTSEL_BOTH (OUTSEL_DIGITAL|OUTSEL_ANALOG) int in_data; /* Audio/data if autodetectable by the receiver */ #define IND_UNKNOWN 0 #define IND_AUDIO 1 #define IND_DATA 2 int in_locked; /* Receiver locked */ #define LOCK_NOT_INDICATED 0 #define LOCK_UNLOCKED 1 #define LOCK_LOCKED 2 int in_quality; /* Input signal quality */ #define IN_QUAL_NOT_INDICATED 0 #define IN_QUAL_POOR 1 #define IN_QUAL_GOOD 2 int in_vbit, out_vbit; /* V bits */ #define VBIT_NOT_INDICATED 0 #define VBIT_OFF 1 #define VBIT_ON 2 unsigned int in_errors; /* Various input error conditions */ #define INERR_CRC 0x0001 #define INERR_QCODE_CRC 0x0002 #define INERR_PARITY 0x0004 #define INERR_BIPHASE 0x0008 int srate_in, srate_out; int bits_in, bits_out; int filler[32]; } oss_digital_control; #define SNDCTL_DSP_READCTL __SIOWR('P', 26, oss_digital_control) #define SNDCTL_DSP_WRITECTL __SIOWR('P', 27, oss_digital_control) /* **************************************************************************** * Sync groups for audio devices */ typedef struct oss_syncgroup { int id; int mode; int filler[16]; } oss_syncgroup; #define SNDCTL_DSP_SYNCGROUP __SIOWR('P', 28, oss_syncgroup) #define SNDCTL_DSP_SYNCSTART __SIOW ('P', 29, int) /* ************************************************************************** * "cooked" mode enables software based conversions for sample rate, sample * format (bits) and number of channels (mono/stereo). These conversions are * required with some devices that support only one sample rate or just stereo * to let the applications to use other formats. The cooked mode is enabled by * default. However it's necessary to disable this mode when mmap() is used or * when very deterministic timing is required. SNDCTL_DSP_COOKEDMODE is an * optional call introduced in OSS 3.9.6f. It's _error return must be ignored_ * since normally this call will return erno=EINVAL. * * SNDCTL_DSP_COOKEDMODE must be called immediately after open before doing * anything else. Otherwise the call will not have any effect. */ #define SNDCTL_DSP_COOKEDMODE __SIOW ('P', 30, int) /* ************************************************************************** * SNDCTL_DSP_SILENCE and SNDCTL_DSP_SKIP are new calls in OSS 3.99.0 * that can be used to implement pause/continue during playback (no effect * on recording). */ #define SNDCTL_DSP_SILENCE __SIO ('P', 31) #define SNDCTL_DSP_SKIP __SIO ('P', 32) /* **************************************************************************** * Abort transfer (reset) functions for input and output */ #define SNDCTL_DSP_HALT_INPUT __SIO ('P', 33) #define SNDCTL_DSP_RESET_INPUT SNDCTL_DSP_HALT_INPUT /* Old name */ #define SNDCTL_DSP_HALT_OUTPUT __SIO ('P', 34) #define SNDCTL_DSP_RESET_OUTPUT SNDCTL_DSP_HALT_OUTPUT /* Old name */ /* **************************************************************************** * Low water level control */ #define SNDCTL_DSP_LOW_WATER __SIOW ('P', 34, int) /* **************************************************************************** * 64 bit pointer support. Only available in environments that support * the 64 bit (long long) integer type. */ #ifndef OSS_NO_LONG_LONG typedef struct { long long samples; int fifo_samples; int filler[32]; /* For future use */ } oss_count_t; #define SNDCTL_DSP_CURRENT_IPTR __SIOR ('P', 35, oss_count_t) #define SNDCTL_DSP_CURRENT_OPTR __SIOR ('P', 36, oss_count_t) #endif /* **************************************************************************** * Interface for selecting recording sources and playback output routings. */ #define SNDCTL_DSP_GET_RECSRC_NAMES __SIOR ('P', 37, oss_mixer_enuminfo) #define SNDCTL_DSP_GET_RECSRC __SIOR ('P', 38, int) #define SNDCTL_DSP_SET_RECSRC __SIOWR('P', 38, int) #define SNDCTL_DSP_GET_PLAYTGT_NAMES __SIOR ('P', 39, oss_mixer_enuminfo) #define SNDCTL_DSP_GET_PLAYTGT __SIOR ('P', 40, int) #define SNDCTL_DSP_SET_PLAYTGT __SIOWR('P', 40, int) #define SNDCTL_DSP_GETRECVOL __SIOR ('P', 41, int) #define SNDCTL_DSP_SETRECVOL __SIOWR('P', 41, int) /* *************************************************************************** * Some calls for setting the channel assignment with multi channel devices * (see the manual for details). */ #ifndef OSS_NO_LONG_LONG #define SNDCTL_DSP_GET_CHNORDER __SIOR ('P', 42, unsigned long long) #define SNDCTL_DSP_SET_CHNORDER __SIOWR('P', 42, unsigned long long) # define CHID_UNDEF 0 # define CHID_L 1 # define CHID_R 2 # define CHID_C 3 # define CHID_LFE 4 # define CHID_LS 5 # define CHID_RS 6 # define CHID_LR 7 # define CHID_RR 8 #define CHNORDER_UNDEF 0x0000000000000000ULL #define CHNORDER_NORMAL 0x0000000087654321ULL #endif #define MAX_PEAK_CHANNELS 128 typedef unsigned short oss_peaks_t[MAX_PEAK_CHANNELS]; #define SNDCTL_DSP_GETIPEAKS __SIOR('P', 43, oss_peaks_t) #define SNDCTL_DSP_GETOPEAKS __SIOR('P', 44, oss_peaks_t) #define SNDCTL_DSP_POLICY __SIOW('P', 45, int) /* See the manual */ /* **************************************************************************** * Few ioctl calls that are not official parts of OSS. They have been used * by few freeware implementations of OSS. */ #define SNDCTL_DSP_GETCHANNELMASK __SIOWR('P', 64, int) #define SNDCTL_DSP_BIND_CHANNEL __SIOWR('P', 65, int) # define DSP_BIND_QUERY 0x00000000 # define DSP_BIND_FRONT 0x00000001 # define DSP_BIND_SURR 0x00000002 # define DSP_BIND_CENTER_LFE 0x00000004 # define DSP_BIND_HANDSET 0x00000008 # define DSP_BIND_MIC 0x00000010 # define DSP_BIND_MODEM1 0x00000020 # define DSP_BIND_MODEM2 0x00000040 # define DSP_BIND_I2S 0x00000080 # define DSP_BIND_SPDIF 0x00000100 # define DSP_BIND_REAR 0x00000200 #ifdef sun /* Not part of OSS. Reserved for internal use by Solaris */ #define X_SADA_GET_PLAYTGT_MASK __SIOR ('P', 66, int) #define X_SADA_GET_PLAYTGT __SIOR ('P', 67, int) #define X_SADA_SET_PLAYTGT __SIOWR('P', 68, int) #endif #ifndef NO_LEGACY_MIXER /* **************************************************************************** * IOCTL commands for the "legacy " /dev/mixer API (obsolete) * * Mixer controls * * There can be up to 20 different analog mixer channels. The * SOUND_MIXER_NRDEVICES gives the currently supported maximum. * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells * the devices supported by the particular mixer. * * {!notice This "legacy" mixer API is obsolete. It has been superceded * by a new one (see below). */ #define SOUND_MIXER_NRDEVICES 28 #define SOUND_MIXER_VOLUME 0 #define SOUND_MIXER_BASS 1 #define SOUND_MIXER_TREBLE 2 #define SOUND_MIXER_SYNTH 3 #define SOUND_MIXER_PCM 4 #define SOUND_MIXER_SPEAKER 5 #define SOUND_MIXER_LINE 6 #define SOUND_MIXER_MIC 7 #define SOUND_MIXER_CD 8 #define SOUND_MIXER_IMIX 9 /* Recording monitor */ #define SOUND_MIXER_ALTPCM 10 #define SOUND_MIXER_RECLEV 11 /* Recording level */ #define SOUND_MIXER_IGAIN 12 /* Input gain */ #define SOUND_MIXER_OGAIN 13 /* Output gain */ /* * Some soundcards have three line level inputs (line, aux1 and aux2). * Since each card manufacturer has assigned different meanings to * these inputs, it's impractical to assign specific meanings * (eg line, cd, synth etc.) to them. */ #define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ #define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ #define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ #define SOUND_MIXER_DIGITAL1 17 /* Digital I/O 1 */ #define SOUND_MIXER_DIGITAL2 18 /* Digital I/O 2 */ #define SOUND_MIXER_DIGITAL3 19 /* Digital I/O 3 */ #define SOUND_MIXER_PHONE 20 /* Phone */ #define SOUND_MIXER_MONO 21 /* Mono Output */ #define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ #define SOUND_MIXER_RADIO 23 /* Radio in */ #define SOUND_MIXER_DEPTH 24 /* Surround depth */ #define SOUND_MIXER_REARVOL 25 /* Rear/Surround speaker vol */ #define SOUND_MIXER_CENTERVOL 26 /* Center/LFE speaker vol */ #define SOUND_MIXER_SIDEVOL 27 /* Side-Surround (8speaker) vol */ /* * Warning: SOUND_MIXER_SURRVOL is an old name of SOUND_MIXER_SIDEVOL. * They are both assigned to the same mixer control. Don't * use both control names in the same program/driver. */ #define SOUND_MIXER_SURRVOL SOUND_MIXER_SIDEVOL /* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ /* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ #define SOUND_ONOFF_MIN 28 #define SOUND_ONOFF_MAX 30 /* Note! Number 31 cannot be used since the sign bit is reserved */ #define SOUND_MIXER_NONE 31 /* * The following unsupported macros are no longer functional. * Use SOUND_MIXER_PRIVATE# macros in future. */ #define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE #define SOUND_MIXER_MUTE SOUND_MIXER_NONE #define SOUND_MIXER_LOUD SOUND_MIXER_NONE #define SOUND_DEVICE_LABELS \ {"Vol ", "Bass ", "Treble", "Synth", "Pcm ", "Speaker ", "Line ", \ "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ "Aux1", "Aux2", "Aux3", "Digital1", "Digital2", "Digital3", \ "Phone", "Mono", "Video", "Radio", "Depth", \ "Rear", "Center", "Side"} #define SOUND_DEVICE_NAMES \ {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ "aux1", "aux2", "aux3", "dig1", "dig2", "dig3", \ "phone", "mono", "video", "radio", "depth", \ "rear", "center", "side"} /* Device bitmask identifiers */ #define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ #define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ #define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ #define SOUND_MIXER_CAPS 0xfc # define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ # define SOUND_CAP_NOLEGACY 0x00000004 /* For internal use only */ # define SOUND_CAP_NORECSRC 0x00000008 #define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ /* OSS/Free ONLY */ #define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */ #define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */ /* OSS/Free ONLY */ /* Device mask bits */ #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) #define SOUND_MASK_CD (1 << SOUND_MIXER_CD) #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) #define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) #define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) #define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) #define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) #define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) #define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) #define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) #define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) #define SOUND_MASK_MONO (1 << SOUND_MIXER_MONO) #define SOUND_MASK_PHONE (1 << SOUND_MIXER_PHONE) #define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) #define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) #define SOUND_MASK_DEPTH (1 << SOUND_MIXER_DEPTH) #define SOUND_MASK_REARVOL (1 << SOUND_MIXER_REARVOL) #define SOUND_MASK_CENTERVOL (1 << SOUND_MIXER_CENTERVOL) #define SOUND_MASK_SIDEVOL (1 << SOUND_MIXER_SIDEVOL) /* Note! SOUND_MASK_SURRVOL is alias of SOUND_MASK_SIDEVOL */ #define SOUND_MASK_SURRVOL (1 << SOUND_MIXER_SIDEVOL) /* Obsolete macros */ #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) #define MIXER_READ(dev) __SIOR('M', dev, int) #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) #define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) #define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) #define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) #define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) #define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) /* Obsolete macros */ #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) #define MIXER_WRITE(dev) __SIOWR('M', dev, int) #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) #define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) #define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) #define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) #define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) #define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) /* Obsolete macros */ #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) typedef struct mixer_info /* OBSOLETE */ { char id[16]; char name[32]; int modify_counter; int card_number; int port_number; char handle[32]; } mixer_info; /* SOUND_MIXER_INFO is obsolete - use SNDCTL_MIXERINFO instead */ #define SOUND_MIXER_INFO __SIOR ('M', 101, mixer_info) /* * Two ioctls for special souncard function (OSS/Free only) */ #define SOUND_MIXER_AGC _SIOWR('M', 103, int) #define SOUND_MIXER_3DSE _SIOWR('M', 104, int) /* * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers. * These features can be used when accessing device specific features. */ #define SOUND_MIXER_PRIVATE1 __SIOWR('M', 111, int) #define SOUND_MIXER_PRIVATE2 __SIOWR('M', 112, int) #define SOUND_MIXER_PRIVATE3 __SIOWR('M', 113, int) #define SOUND_MIXER_PRIVATE4 __SIOWR('M', 114, int) #define SOUND_MIXER_PRIVATE5 __SIOWR('M', 115, int) /* The following two controls were never implemented and they should not be used. */ #define SOUND_MIXER_READ_MAINVOL __SIOR ('M', 116, int) #define SOUND_MIXER_WRITE_MAINVOL __SIOWR('M', 116, int) /* * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used * for querying current mixer settings from the driver and for loading * default volume settings _prior_ activating the mixer (loading * doesn't affect current state of the mixer hardware). These calls * are for internal use by the driver software only. */ typedef struct mixer_vol_table { int num; /* Index to volume table */ char name[32]; int levels[32]; } mixer_vol_table; #define SOUND_MIXER_GETLEVELS __SIOWR('M', 116, mixer_vol_table) #define SOUND_MIXER_SETLEVELS __SIOWR('M', 117, mixer_vol_table) #define OSS_GETVERSION __SIOR ('M', 118, int) /* * Calls to set/get the recording gain for the currently active * recording source. These calls automatically map to the right control. * Note that these calls are not supported by all drivers. In this case * the call will return -1 with errno set to EINVAL * * The _MONGAIN work in similar way but set/get the monitoring gain for * the currently selected recording source. */ #define SOUND_MIXER_READ_RECGAIN __SIOR ('M', 119, int) #define SOUND_MIXER_WRITE_RECGAIN __SIOWR('M', 119, int) #define SOUND_MIXER_READ_MONGAIN __SIOR ('M', 120, int) #define SOUND_MIXER_WRITE_MONGAIN __SIOWR('M', 120, int) /* The following call is for driver development time purposes. It's not * present in any released drivers. */ typedef unsigned char oss_reserved_t[512]; #define SOUND_MIXER_RESERVED __SIOWR('M', 121, oss_reserved_t) #endif /* ifndef NO_LEGACY_MIXER */ /* ************************************************************************* * The "new" mixer API of OSS 4.0 and later. * * This improved mixer API makes it possible to access every possible feature * of every possible device. However you should read the mixer programming * section of the OSS API Developer's Manual. There is no chance that you * could use this interface correctly just by examining this header. */ typedef struct oss_sysinfo { char product[32]; /* For example OSS/Free, OSS/Linux or OSS/Solaris */ char version[32]; /* For example 4.0a */ int versionnum; /* See OSS_GETVERSION */ char options[128]; /* Reserved */ int numaudios; /* # of audio/dsp devices */ int openedaudio[8]; /* Bit mask telling which audio devices are busy */ int numsynths; /* # of availavle synth devices */ int nummidis; /* # of available MIDI ports */ int numtimers; /* # of available timer devices */ int nummixers; /* # of mixer devices */ int openedmidi[8]; /* Bit mask telling which midi devices are busy */ int numcards; /* Number of sound cards in the system */ int numaudioengines; /* Number of audio engines in the system */ char license[16]; /* For example "GPL" or "CDDL" */ int filler[236]; /* For future expansion (set to -1) */ } oss_sysinfo; typedef struct oss_mixext { int dev; /* Mixer device number */ int ctrl; /* Controller number */ int type; /* Entry type */ # define MIXT_DEVROOT 0 /* Device root entry */ # define MIXT_GROUP 1 /* Controller group */ # define MIXT_ONOFF 2 /* OFF (0) or ON (1) */ # define MIXT_ENUM 3 /* Enumerated (0 to maxvalue) */ # define MIXT_MONOSLIDER 4 /* Mono slider (0 to 255) */ # define MIXT_STEREOSLIDER 5 /* Stereo slider (dual 0 to 255) */ # define MIXT_MESSAGE 6 /* (Readable) textual message */ # define MIXT_MONOVU 7 /* VU meter value (mono) */ # define MIXT_STEREOVU 8 /* VU meter value (stereo) */ # define MIXT_MONOPEAK 9 /* VU meter peak value (mono) */ # define MIXT_STEREOPEAK 10 /* VU meter peak value (stereo) */ # define MIXT_RADIOGROUP 11 /* Radio button group */ # define MIXT_MARKER 12 /* Separator between normal and extension entries */ # define MIXT_VALUE 13 /* Decimal value entry */ # define MIXT_HEXVALUE 14 /* Hexadecimal value entry */ # define MIXT_MONODB 15 /* OBSOLETE */ # define MIXT_STEREODB 16 /* OBSOLETE */ # define MIXT_SLIDER 17 /* Slider (mono) with full (31 bit) postitive integer range */ # define MIXT_3D 18 /* * Sliders with range expanded to 15 bits per channel (0-32767) */ # define MIXT_MONOSLIDER16 19 # define MIXT_STEREOSLIDER16 20 # define MIXT_MUTE 21 /* Mute=1, unmute=0 */ /**************************************************************/ /* Possible value range (minvalue to maxvalue) */ /* Note that maxvalue may also be smaller than minvalue */ int maxvalue; int minvalue; int flags; # define MIXF_READABLE 0x00000001 /* Has readable value */ # define MIXF_WRITEABLE 0x00000002 /* Has writeable value */ # define MIXF_POLL 0x00000004 /* May change itself */ # define MIXF_HZ 0x00000008 /* Herz scale */ # define MIXF_STRING 0x00000010 /* Use dynamic extensions for value */ # define MIXF_DYNAMIC 0x00000010 /* Supports dynamic extensions */ # define MIXF_OKFAIL 0x00000020 /* Interpret value as 1=OK, 0=FAIL */ # define MIXF_FLAT 0x00000040 /* Flat vertical space requirements */ # define MIXF_LEGACY 0x00000080 /* Legacy mixer control group */ # define MIXF_CENTIBEL 0x00000100 /* Centibel (0.1 dB) step size */ # define MIXF_DECIBEL 0x00000200 /* Step size of 1 dB */ # define MIXF_MAINVOL 0x00000400 /* Main volume control */ # define MIXF_PCMVOL 0x00000800 /* PCM output volume control */ # define MIXF_RECVOL 0x00001000 /* PCM recording volume control */ # define MIXF_MONVOL 0x00002000 /* Input->output monitor volume */ # define MIXF_WIDE 0x00004000 /* Enum control has wide labels */ # define MIXF_DESCR 0x00008000 /* Description (tooltip) available */ char id[16]; /* Mnemonic ID (mainly for internal use) */ int parent; /* Entry# of parent (group) node (-1 if root) */ int dummy; /* Internal use */ int timestamp; char data[64]; /* Misc data (entry type dependent) */ unsigned char enum_present[32]; /* Mask of allowed enum values */ int control_no; /* SOUND_MIXER_VOLUME..SOUND_MIXER_MIDI */ /* (-1 means not indicated) */ /* * The desc field is reserved for internal purposes of OSS. It should not be * used by applications. */ unsigned int desc; #define MIXEXT_SCOPE_MASK 0x0000003f #define MIXEXT_SCOPE_OTHER 0x00000000 #define MIXEXT_SCOPE_INPUT 0x00000001 #define MIXEXT_SCOPE_OUTPUT 0x00000002 #define MIXEXT_SCOPE_MONITOR 0x00000003 #define MIXEXT_SCOPE_RECSWITCH 0x00000004 char extname[32]; int update_counter; int rgbcolor; /* 0 means default color (not black) . Otherwise 24 bit RGB color */ int filler[6]; } oss_mixext; /* * Recommended colors to be used in the rgbcolor field. These match the * colors used as the audio jack colors in HD audio motherboards. */ #define OSS_RGB_BLUE 0x7aabde // Light blue #define OSS_RGB_GREEN 0xb3c98c // Lime green #define OSS_RGB_PINK 0xe88c99 #define OSS_RGB_GRAY 0xd1ccc4 #define OSS_RGB_BLACK 0x2b2926 // Light black #define OSS_RGB_ORANGE 0xe89e47 #define OSS_RGB_RED 0xff0000 #define OSS_RGB_YELLOW 0xffff00 #define OSS_RGB_PURPLE 0x800080 #define OSS_RGB_WHITE 0xf8f8ff typedef struct oss_mixext_root { char id[16]; char name[48]; } oss_mixext_root; typedef struct oss_mixer_value { int dev; int ctrl; int value; int flags; /* Reserved for future use. Initialize to 0 */ int timestamp; /* Must be set to oss_mixext.timestamp */ int filler[8]; /* Reserved for future use. Initialize to 0 */ } oss_mixer_value; #define OSS_ENUM_MAXVALUE 255 #define OSS_ENUM_STRINGSIZE 3000 typedef struct oss_mixer_enuminfo { int dev; int ctrl; int nvalues; int version; /* Read the manual */ short strindex[OSS_ENUM_MAXVALUE]; char strings[OSS_ENUM_STRINGSIZE]; } oss_mixer_enuminfo; #define OPEN_READ PCM_ENABLE_INPUT #define OPEN_WRITE PCM_ENABLE_OUTPUT #define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) typedef struct oss_audioinfo { int dev; /* Audio device number */ char name[64]; int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ int pid; int caps; /* PCM_CAP_INPUT, PCM_CAP_OUTPUT */ int iformats, oformats; int magic; /* Reserved for internal use */ char cmd[64]; /* Command using the device (if known) */ int card_number; int port_number; int mixer_dev; int legacy_device; /* Obsolete field. Replaced by devnode */ int enabled; /* 1=enabled, 0=device not ready at this moment */ int flags; /* For internal use only - no practical meaning */ int min_rate, max_rate; /* Sample rate limits */ int min_channels, max_channels; /* Number of channels supported */ int binding; /* DSP_BIND_FRONT, etc. 0 means undefined */ int rate_source; char handle[32]; #define OSS_MAX_SAMPLE_RATES 20 /* Cannot be changed */ unsigned int nrates, rates[OSS_MAX_SAMPLE_RATES]; /* Please read the manual before using these */ oss_longname_t song_name; /* Song name (if given) */ oss_label_t label; /* Device label (if given) */ int latency; /* In usecs, -1=unknown */ oss_devnode_t devnode; /* Device special file name (absolute path) */ int next_play_engine; /* Read the documentation for more info */ int next_rec_engine; /* Read the documentation for more info */ int filler[184]; } oss_audioinfo; typedef struct oss_mixerinfo { int dev; char id[16]; char name[32]; int modify_counter; int card_number; int port_number; char handle[32]; int magic; /* Reserved */ int enabled; /* Reserved */ int caps; #define MIXER_CAP_VIRTUAL 0x00000001 #define MIXER_CAP_LAYOUT_B 0x00000002 /* For internal use only */ #define MIXER_CAP_NARROW 0x00000004 /* Conserve horiz space */ int flags; /* Reserved */ int nrext; /* * The priority field can be used to select the default (motherboard) * mixer device. The mixer with the highest priority is the * most preferred one. -2 or less means that this device cannot be used * as the default mixer. */ int priority; oss_devnode_t devnode; /* Device special file name (absolute path) */ int legacy_device; int filler[245]; /* Reserved */ } oss_mixerinfo; typedef struct oss_midi_info { int dev; /* Midi device number */ char name[64]; int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ int pid; char cmd[64]; /* Command using the device (if known) */ int caps; #define MIDI_CAP_MPU401 0x00000001 /**** OBSOLETE ****/ #define MIDI_CAP_INPUT 0x00000002 #define MIDI_CAP_OUTPUT 0x00000004 #define MIDI_CAP_INOUT (MIDI_CAP_INPUT|MIDI_CAP_OUTPUT) #define MIDI_CAP_VIRTUAL 0x00000008 /* Pseudo device */ #define MIDI_CAP_MTCINPUT 0x00000010 /* Supports SNDCTL_MIDI_MTCINPUT */ #define MIDI_CAP_CLIENT 0x00000020 /* Virtual client side device */ #define MIDI_CAP_SERVER 0x00000040 /* Virtual server side device */ #define MIDI_CAP_INTERNAL 0x00000080 /* Internal (synth) device */ #define MIDI_CAP_EXTERNAL 0x00000100 /* external (MIDI port) device */ #define MIDI_CAP_PTOP 0x00000200 /* Point to point link to one device */ #define MIDI_CAP_MTC 0x00000400 /* MTC/SMPTE (control) device */ int magic; /* Reserved for internal use */ int card_number; int port_number; int enabled; /* 1=enabled, 0=device not ready at this moment */ int flags; /* For internal use only - no practical meaning */ char handle[32]; oss_longname_t song_name; /* Song name (if known) */ oss_label_t label; /* Device label (if given) */ int latency; /* In usecs, -1=unknown */ oss_devnode_t devnode; /* Device special file name (absolute path) */ int legacy_device; /* Legacy device mapping */ int filler[235]; } oss_midi_info; typedef struct oss_card_info { int card; char shortname[16]; char longname[128]; int flags; char hw_info[400]; int intr_count, ack_count; int filler[154]; } oss_card_info; #define SNDCTL_SYSINFO __SIOR ('X', 1, oss_sysinfo) #define OSS_SYSINFO SNDCTL_SYSINFO /* Old name */ #define SNDCTL_MIX_NRMIX __SIOR ('X', 2, int) #define SNDCTL_MIX_NREXT __SIOWR('X', 3, int) #define SNDCTL_MIX_EXTINFO __SIOWR('X', 4, oss_mixext) #define SNDCTL_MIX_READ __SIOWR('X', 5, oss_mixer_value) #define SNDCTL_MIX_WRITE __SIOWR('X', 6, oss_mixer_value) #define SNDCTL_AUDIOINFO __SIOWR('X', 7, oss_audioinfo) #define SNDCTL_MIX_ENUMINFO __SIOWR('X', 8, oss_mixer_enuminfo) #define SNDCTL_MIDIINFO __SIOWR('X', 9, oss_midi_info) #define SNDCTL_MIXERINFO __SIOWR('X',10, oss_mixerinfo) #define SNDCTL_CARDINFO __SIOWR('X',11, oss_card_info) #define SNDCTL_ENGINEINFO __SIOWR('X',12, oss_audioinfo) #define SNDCTL_AUDIOINFO_EX __SIOWR('X',13, oss_audioinfo) #define SNDCTL_MIX_DESCRIPTION __SIOWR('X',14, oss_mixer_enuminfo) /* ioctl codes 'X', 200-255 are reserved for internal use */ /* * Few more "globally" available ioctl calls. */ #define SNDCTL_SETSONG __SIOW ('Y', 2, oss_longname_t) #define SNDCTL_GETSONG __SIOR ('Y', 2, oss_longname_t) #define SNDCTL_SETNAME __SIOW ('Y', 3, oss_longname_t) #define SNDCTL_SETLABEL __SIOW ('Y', 4, oss_label_t) #define SNDCTL_GETLABEL __SIOR ('Y', 4, oss_label_t) /* * The "new" mixer API definitions end here. *************************************** */ /* ********************************************************* * Few routines that are included in -lOSSlib * * At this moment this interface is not used. OSSlib contains just * stubs that call the related system calls directly. */ #ifdef OSSLIB extern int osslib_open (const char *path, int flags, int dummy); extern void osslib_close (int fd); extern int osslib_write (int fd, const void *buf, int count); extern int osslib_read (int fd, void *buf, int count); extern int osslib_ioctl (int fd, unsigned int request, void *arg); #else # define osslib_open open # define osslib_close close # define osslib_write write # define osslib_read read # define osslib_ioctl ioctl #endif #if 1 #define SNDCTL_DSP_NONBLOCK __SIO ('P',14) /* Obsolete. Not supported any more */ #endif #if 1 /* * Some obsolete macros that are not part of Open Sound System API. */ #define SOUND_PCM_READ_RATE SOUND_PCM_READ_RATE_is_obsolete #define SOUND_PCM_READ_BITS SOUND_PCM_READ_BITS_is_obsolete #define SOUND_PCM_READ_CHANNELS SOUND_PCM_READ_CHANNELS_is_obsolete #define SOUND_PCM_WRITE_RATE SOUND_PCM_WRITE_RATE_is_obsolet_use_SNDCTL_DSP_SPEED_instead #define SOUND_PCM_WRITE_CHANNELS SOUND_PCM_WRITE_CHANNELS_is_obsolete_use_SNDCTL_DSP_CHANNELS_instead #define SOUND_PCM_WRITE_BITS SOUND_PCM_WRITE_BITS_is_obsolete_use_SNDCTL_DSP_SETFMT_instead #define SOUND_PCM_POST SOUND_PCM_POST_is_obsolete_use_SNDCTL_DSP_POST_instead #define SOUND_PCM_RESET SOUND_PCM_RESET_is_obsolete_use_SNDCTL_DSP_HALT_instead #define SOUND_PCM_SYNC SOUND_PCM_SYNC_is_obsolete_use_SNDCTL_DSP_SYNC_instead #define SOUND_PCM_SUBDIVIDE SOUND_PCM_SUBDIVIDE_is_obsolete_use_SNDCTL_DSP_SUBDIVIDE_instead #define SOUND_PCM_SETFRAGMENT SOUND_PCM_SETFRAGMENT_is_obsolete_use_SNDCTL_DSP_SETFRAGMENT_instead #define SOUND_PCM_GETFMTS SOUND_PCM_GETFMTS_is_obsolete_use_SNDCTL_DSP_GETFMTS_instead #define SOUND_PCM_SETFMT SOUND_PCM_SETFMT_is_obsolete_use_SNDCTL_DSP_SETFMT_instead #define SOUND_PCM_GETOSPACE SOUND_PCM_GETOSPACE_is_obsolete_use_SNDCTL_DSP_GETOSPACE_instead #define SOUND_PCM_GETISPACE SOUND_PCM_GETISPACE_is_obsolete_use_SNDCTL_DSP_GETISPACE_instead #define SOUND_PCM_NONBLOCK SOUND_PCM_NONBLOCK_is_obsolete_use_SNDCTL_DSP_NONBLOCK_instead #define SOUND_PCM_GETCAPS SOUND_PCM_GETCAPS_is_obsolete_use_SNDCTL_DSP_GETCAPS_instead #define SOUND_PCM_GETTRIGGER SOUND_PCM_GETTRIGGER_is_obsolete_use_SNDCTL_DSP_GETTRIGGER_instead #define SOUND_PCM_SETTRIGGER SOUND_PCM_SETTRIGGER_is_obsolete_use_SNDCTL_DSP_SETTRIGGER_instead #define SOUND_PCM_SETSYNCRO SOUND_PCM_SETSYNCRO_is_obsolete_use_SNDCTL_DSP_SETSYNCRO_instead #define SOUND_PCM_GETIPTR SOUND_PCM_GETIPTR_is_obsolete_use_SNDCTL_DSP_GETIPTR_instead #define SOUND_PCM_GETOPTR SOUND_PCM_GETOPTR_is_obsolete_use_SNDCTL_DSP_GETOPTR_instead #define SOUND_PCM_MAPINBUF SOUND_PCM_MAPINBUF_is_obsolete_use_SNDCTL_DSP_MAPINBUF_instead #define SOUND_PCM_MAPOUTBUF SOUND_PCM_MAPOUTBUF_is_obsolete_use_SNDCTL_DSP_MAPOUTBUF_instead #endif #endif gst-plugins-good-0.10.31/sys/oss4/oss4-sink.c0000644000175000017500000004717711705514370015526 00000000000000/* GStreamer OSS4 audio sink * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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-oss4sink * * This element lets you output sound using the Open Sound System (OSS) * version 4. * * Note that you should almost always use generic audio conversion elements * like audioconvert and audioresample in front of an audiosink to make sure * your pipeline works under all circumstances (those conversion elements will * act in passthrough-mode if no conversion is necessary). * * * Example pipelines * |[ * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! oss4sink * ]| will output a sine wave (continuous beep sound) to your sound card (with * a very low volume as precaution). * |[ * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! oss4sink * ]| will play an Ogg/Vorbis audio file and output it using the Open Sound System * version 4. * * * Since: 0.10.7 */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #define NO_LEGACY_MIXER #include "oss4-audio.h" #include "oss4-sink.h" #include "oss4-property-probe.h" #include "oss4-soundcard.h" GST_DEBUG_CATEGORY_EXTERN (oss4sink_debug); #define GST_CAT_DEFAULT oss4sink_debug static void gst_oss4_sink_init_interfaces (GType type); static void gst_oss4_sink_dispose (GObject * object); static void gst_oss4_sink_finalize (GObject * object); static void gst_oss4_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_oss4_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static GstCaps *gst_oss4_sink_getcaps (GstBaseSink * bsink); static gboolean gst_oss4_sink_open (GstAudioSink * asink, gboolean silent_errors); static gboolean gst_oss4_sink_open_func (GstAudioSink * asink); static gboolean gst_oss4_sink_close (GstAudioSink * asink); static gboolean gst_oss4_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); static gboolean gst_oss4_sink_unprepare (GstAudioSink * asink); static guint gst_oss4_sink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_oss4_sink_delay (GstAudioSink * asink); static void gst_oss4_sink_reset (GstAudioSink * asink); #define DEFAULT_DEVICE NULL #define DEFAULT_DEVICE_NAME NULL #define DEFAULT_MUTE FALSE #define DEFAULT_VOLUME 1.0 #define MAX_VOLUME 10.0 enum { PROP_0, PROP_DEVICE, PROP_DEVICE_NAME, PROP_VOLUME, PROP_MUTE, PROP_LAST }; GST_BOILERPLATE_FULL (GstOss4Sink, gst_oss4_sink, GstAudioSink, GST_TYPE_AUDIO_SINK, gst_oss4_sink_init_interfaces); static void gst_oss4_sink_dispose (GObject * object) { GstOss4Sink *osssink = GST_OSS4_SINK (object); if (osssink->probed_caps) { gst_caps_unref (osssink->probed_caps); osssink->probed_caps = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_oss4_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstPadTemplate *templ; gst_element_class_set_details_simple (element_class, "OSS v4 Audio Sink", "Sink/Audio", "Output to a sound card via OSS version 4", "Tim-Philipp Müller "); templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, gst_oss4_audio_get_template_caps ()); gst_element_class_add_pad_template (element_class, templ); gst_object_unref (templ); } static void gst_oss4_sink_class_init (GstOss4SinkClass * klass) { GstAudioSinkClass *audiosink_class = (GstAudioSinkClass *) klass; GstBaseSinkClass *basesink_class = (GstBaseSinkClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->dispose = gst_oss4_sink_dispose; gobject_class->finalize = gst_oss4_sink_finalize; gobject_class->get_property = gst_oss4_sink_get_property; gobject_class->set_property = gst_oss4_sink_set_property; g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) " "(NULL = use first available playback device)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_VOLUME, g_param_spec_double ("volume", "Volume", "Linear volume of this stream, 1.0=100%", 0.0, MAX_VOLUME, DEFAULT_VOLUME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MUTE, g_param_spec_boolean ("mute", "Mute", "Mute state of this stream", DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss4_sink_getcaps); audiosink_class->open = GST_DEBUG_FUNCPTR (gst_oss4_sink_open_func); audiosink_class->close = GST_DEBUG_FUNCPTR (gst_oss4_sink_close); audiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_oss4_sink_prepare); audiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss4_sink_unprepare); audiosink_class->write = GST_DEBUG_FUNCPTR (gst_oss4_sink_write); audiosink_class->delay = GST_DEBUG_FUNCPTR (gst_oss4_sink_delay); audiosink_class->reset = GST_DEBUG_FUNCPTR (gst_oss4_sink_reset); } static void gst_oss4_sink_init (GstOss4Sink * osssink, GstOss4SinkClass * klass) { const gchar *device; device = g_getenv ("AUDIODEV"); if (device == NULL) device = DEFAULT_DEVICE; osssink->device = g_strdup (device); osssink->fd = -1; osssink->bytes_per_sample = 0; osssink->probed_caps = NULL; osssink->device_name = NULL; osssink->mute_volume = 100 | (100 << 8); } static void gst_oss4_sink_finalize (GObject * object) { GstOss4Sink *osssink = GST_OSS4_SINK (object); g_free (osssink->device); osssink->device = NULL; g_list_free (osssink->property_probe_list); osssink->property_probe_list = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_oss4_sink_set_volume (GstOss4Sink * oss, gdouble volume) { int ivol; volume = volume * 100.0; ivol = (int) volume | ((int) volume << 8); GST_OBJECT_LOCK (oss); if (ioctl (oss->fd, SNDCTL_DSP_SETPLAYVOL, &ivol) < 0) { GST_LOG_OBJECT (oss, "SETPLAYVOL failed"); } GST_OBJECT_UNLOCK (oss); } static gdouble gst_oss4_sink_get_volume (GstOss4Sink * oss) { int ivol, lvol, rvol; gdouble dvol = DEFAULT_VOLUME; GST_OBJECT_LOCK (oss); if (ioctl (oss->fd, SNDCTL_DSP_GETPLAYVOL, &ivol) < 0) { GST_LOG_OBJECT (oss, "GETPLAYVOL failed"); } else { /* Return the higher of the two volume channels, if different */ lvol = ivol & 0xff; rvol = (ivol >> 8) & 0xff; dvol = MAX (lvol, rvol) / 100.0; } GST_OBJECT_UNLOCK (oss); return dvol; } static void gst_oss4_sink_set_mute (GstOss4Sink * oss, gboolean mute) { int ivol; if (mute) { /* * OSSv4 does not have a per-channel mute, so simulate by setting * the value to 0. Save the volume before doing a mute so we can * reset the value when the user un-mutes. */ ivol = 0; GST_OBJECT_LOCK (oss); if (ioctl (oss->fd, SNDCTL_DSP_GETPLAYVOL, &oss->mute_volume) < 0) { GST_LOG_OBJECT (oss, "GETPLAYVOL failed"); } if (ioctl (oss->fd, SNDCTL_DSP_SETPLAYVOL, &ivol) < 0) { GST_LOG_OBJECT (oss, "SETPLAYVOL failed"); } GST_OBJECT_UNLOCK (oss); } else { /* * If the saved volume is 0, then reset it to 100. Otherwise the mute * can get stuck. This can happen, for example, due to rounding * errors in converting from the float to an integer. */ if (oss->mute_volume == 0) { oss->mute_volume = 100 | (100 << 8); } GST_OBJECT_LOCK (oss); if (ioctl (oss->fd, SNDCTL_DSP_SETPLAYVOL, &oss->mute_volume) < 0) { GST_LOG_OBJECT (oss, "SETPLAYVOL failed"); } GST_OBJECT_UNLOCK (oss); } } static gboolean gst_oss4_sink_get_mute (GstOss4Sink * oss) { int ivol, lvol, rvol; GST_OBJECT_LOCK (oss); if (ioctl (oss->fd, SNDCTL_DSP_GETPLAYVOL, &ivol) < 0) { GST_LOG_OBJECT (oss, "GETPLAYVOL failed"); lvol = rvol = 100; } else { lvol = ivol & 0xff; rvol = (ivol >> 8) & 0xff; } GST_OBJECT_UNLOCK (oss); return (lvol == 0 && rvol == 0); } static void gst_oss4_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOss4Sink *oss = GST_OSS4_SINK (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (oss); if (oss->fd == -1) { g_free (oss->device); oss->device = g_value_dup_string (value); if (oss->probed_caps) { gst_caps_unref (oss->probed_caps); oss->probed_caps = NULL; } g_free (oss->device_name); oss->device_name = NULL; } else { g_warning ("%s: can't change \"device\" property while audio sink " "is open", GST_OBJECT_NAME (oss)); } GST_OBJECT_UNLOCK (oss); break; case PROP_VOLUME: gst_oss4_sink_set_volume (oss, g_value_get_double (value)); break; case PROP_MUTE: gst_oss4_sink_set_mute (oss, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss4_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOss4Sink *oss = GST_OSS4_SINK (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (oss); g_value_set_string (value, oss->device); GST_OBJECT_UNLOCK (oss); break; case PROP_DEVICE_NAME: GST_OBJECT_LOCK (oss); if (oss->fd == -1 && oss->device != NULL) { /* If device is set, try to retrieve the name even if we're not open */ if (gst_oss4_sink_open (GST_AUDIO_SINK (oss), TRUE)) { g_value_set_string (value, oss->device_name); gst_oss4_sink_close (GST_AUDIO_SINK (oss)); } else { gchar *name = NULL; gst_oss4_property_probe_find_device_name_nofd (GST_OBJECT (oss), oss->device, &name); g_value_set_string (value, name); g_free (name); } } else { g_value_set_string (value, oss->device_name); } GST_OBJECT_UNLOCK (oss); break; case PROP_VOLUME: g_value_set_double (value, gst_oss4_sink_get_volume (oss)); break; case PROP_MUTE: g_value_set_boolean (value, gst_oss4_sink_get_mute (oss)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_oss4_sink_getcaps (GstBaseSink * bsink) { GstOss4Sink *oss; GstCaps *caps; oss = GST_OSS4_SINK (bsink); if (oss->fd == -1) { caps = gst_oss4_audio_get_template_caps (); } else if (oss->probed_caps) { caps = gst_caps_copy (oss->probed_caps); } else { caps = gst_oss4_audio_probe_caps (GST_OBJECT (oss), oss->fd); if (caps != NULL && !gst_caps_is_empty (caps)) { oss->probed_caps = gst_caps_copy (caps); } } return caps; } /* note: we must not take the object lock here unless we fix up get_property */ static gboolean gst_oss4_sink_open (GstAudioSink * asink, gboolean silent_errors) { GstOss4Sink *oss; gchar *device; int mode; oss = GST_OSS4_SINK (asink); if (oss->device) device = g_strdup (oss->device); else device = gst_oss4_audio_find_device (GST_OBJECT_CAST (oss)); /* desperate times, desperate measures */ if (device == NULL) device = g_strdup ("/dev/dsp0"); GST_INFO_OBJECT (oss, "Trying to open OSS4 device '%s'", device); /* we open in non-blocking mode even if we don't really want to do writes * non-blocking because we can't be sure that this is really a genuine * OSS4 device with well-behaved drivers etc. We really don't want to * hang forever under any circumstances. */ oss->fd = open (device, O_WRONLY | O_NONBLOCK, 0); if (oss->fd == -1) { switch (errno) { case EBUSY: goto busy; case EACCES: goto no_permission; default: goto open_failed; } } GST_INFO_OBJECT (oss, "Opened device '%s'", device); /* Make sure it's OSS4. If it's old OSS, let osssink handle it */ if (!gst_oss4_audio_check_version (GST_OBJECT_CAST (oss), oss->fd)) goto legacy_oss; /* now remove the non-blocking flag. */ mode = fcntl (oss->fd, F_GETFL); mode &= ~O_NONBLOCK; if (fcntl (oss->fd, F_SETFL, mode) < 0) { /* some drivers do no support unsetting the non-blocking flag, try to * close/open the device then. This is racy but we error out properly. */ GST_WARNING_OBJECT (oss, "failed to unset O_NONBLOCK (buggy driver?), " "will try to re-open device now"); gst_oss4_sink_close (asink); if ((oss->fd = open (device, O_WRONLY, 0)) == -1) goto non_block; } oss->open_device = device; /* not using ENGINEINFO here because it sometimes returns a different and * less useful name than AUDIOINFO for the same device */ if (!gst_oss4_property_probe_find_device_name (GST_OBJECT (oss), oss->fd, oss->open_device, &oss->device_name)) { oss->device_name = NULL; } /* list output routings, for informational purposes only so far */ { oss_mixer_enuminfo routings = { 0, }; guint i; if (ioctl (oss->fd, SNDCTL_DSP_GET_PLAYTGT_NAMES, &routings) != -1) { GST_LOG_OBJECT (oss, "%u output routings (static list: %d)", routings.nvalues, !!(routings.version == 0)); for (i = 0; i < routings.nvalues; ++i) { GST_LOG_OBJECT (oss, " output routing %d: %s", i, &routings.strings[routings.strindex[i]]); } } } return TRUE; /* ERRORS */ busy: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, (_("Could not open audio device for playback. " "Device is being used by another application.")), (NULL)); } g_free (device); return FALSE; } no_permission: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, (_("Could not open audio device for playback. " "You don't have permission to open the device.")), GST_ERROR_SYSTEM); } g_free (device); return FALSE; } open_failed: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, (_("Could not open audio device for playback.")), GST_ERROR_SYSTEM); } g_free (device); return FALSE; } legacy_oss: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, (_("Could not open audio device for playback. " "This version of the Open Sound System is not supported by this " "element.")), ("Try the 'osssink' element instead")); } gst_oss4_sink_close (asink); g_free (device); return FALSE; } non_block: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), ("Unable to set device %s into non-blocking mode: %s", oss->device, g_strerror (errno))); } g_free (device); return FALSE; } } static gboolean gst_oss4_sink_open_func (GstAudioSink * asink) { return gst_oss4_sink_open (asink, FALSE); } static gboolean gst_oss4_sink_close (GstAudioSink * asink) { GstOss4Sink *oss = GST_OSS4_SINK (asink); if (oss->fd != -1) { GST_DEBUG_OBJECT (oss, "closing device"); close (oss->fd); oss->fd = -1; } oss->bytes_per_sample = 0; /* we keep the probed caps cached, at least until the device changes */ g_free (oss->open_device); oss->open_device = NULL; g_free (oss->device_name); oss->device_name = NULL; if (oss->probed_caps) { gst_caps_unref (oss->probed_caps); oss->probed_caps = NULL; } return TRUE; } static gboolean gst_oss4_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) { GstOss4Sink *oss; oss = GST_OSS4_SINK (asink); if (!gst_oss4_audio_set_format (GST_OBJECT_CAST (oss), oss->fd, spec)) { GST_WARNING_OBJECT (oss, "Couldn't set requested format %" GST_PTR_FORMAT, spec->caps); return FALSE; } oss->bytes_per_sample = spec->bytes_per_sample; return TRUE; } static gboolean gst_oss4_sink_unprepare (GstAudioSink * asink) { /* could do a SNDCTL_DSP_HALT, but the OSS manual recommends a close/open, * since HALT won't properly reset some devices, apparently */ if (!gst_oss4_sink_close (asink)) goto couldnt_close; if (!gst_oss4_sink_open_func (asink)) goto couldnt_reopen; return TRUE; /* ERRORS */ couldnt_close: { GST_DEBUG_OBJECT (asink, "Couldn't close the audio device"); return FALSE; } couldnt_reopen: { GST_DEBUG_OBJECT (asink, "Couldn't reopen the audio device"); return FALSE; } } static guint gst_oss4_sink_write (GstAudioSink * asink, gpointer data, guint length) { GstOss4Sink *oss; int n; oss = GST_OSS4_SINK_CAST (asink); n = write (oss->fd, data, length); GST_LOG_OBJECT (asink, "wrote %d/%d samples, %d bytes", n / oss->bytes_per_sample, length / oss->bytes_per_sample, n); if (G_UNLIKELY (n < 0)) { switch (errno) { case ENOTSUP: case EACCES:{ /* This is the most likely cause, I think */ GST_ELEMENT_ERROR (asink, RESOURCE, WRITE, (_("Playback is not supported by this audio device.")), ("write: %s (device: %s) (maybe this is an input-only device?)", g_strerror (errno), oss->open_device)); break; } default:{ GST_ELEMENT_ERROR (asink, RESOURCE, WRITE, (_("Audio playback error.")), ("write: %s (device: %s)", g_strerror (errno), oss->open_device)); break; } } } return n; } static guint gst_oss4_sink_delay (GstAudioSink * asink) { GstOss4Sink *oss; gint delay = -1; oss = GST_OSS4_SINK_CAST (asink); GST_OBJECT_LOCK (oss); if (ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay) < 0 || delay < 0) { GST_LOG_OBJECT (oss, "GETODELAY failed"); } GST_OBJECT_UNLOCK (oss); if (G_UNLIKELY (delay < 0)) /* error case */ return 0; return delay / oss->bytes_per_sample; } static void gst_oss4_sink_reset (GstAudioSink * asink) { /* There's nothing we can do here really: OSS can't handle access to the * same device/fd from multiple threads and might deadlock or blow up in * other ways if we try an ioctl SNDCTL_DSP_HALT or similar */ } static void gst_oss4_sink_init_interfaces (GType type) { static const GInterfaceInfo svol_iface_info = { NULL, NULL, NULL }; g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info); gst_oss4_add_property_probe_interface (type); } gst-plugins-good-0.10.31/sys/oss4/Makefile.in0000644000175000017500000011124211720560240015550 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/oss4 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstoss4audio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstoss4audio_la_OBJECTS = libgstoss4audio_la-oss4-audio.lo \ libgstoss4audio_la-oss4-mixer.lo \ libgstoss4audio_la-oss4-mixer-enum.lo \ libgstoss4audio_la-oss4-mixer-slider.lo \ libgstoss4audio_la-oss4-mixer-switch.lo \ libgstoss4audio_la-oss4-property-probe.lo \ libgstoss4audio_la-oss4-sink.lo \ libgstoss4audio_la-oss4-source.lo libgstoss4audio_la_OBJECTS = $(am_libgstoss4audio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstoss4audio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) \ $(libgstoss4audio_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstoss4audio_la_SOURCES) DIST_SOURCES = $(libgstoss4audio_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstoss4audio.la libgstoss4audio_la_SOURCES = \ oss4-audio.c \ oss4-mixer.c \ oss4-mixer-enum.c \ oss4-mixer-slider.c \ oss4-mixer-switch.c \ oss4-property-probe.c \ oss4-sink.c \ oss4-source.c libgstoss4audio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstoss4audio_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstinterfaces-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_LIBS) libgstoss4audio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstoss4audio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ oss4-audio.h \ oss4-mixer.h \ oss4-mixer-enum.h \ oss4-mixer-slider.h \ oss4-mixer-switch.h \ oss4-property-probe.h \ oss4-sink.h \ oss4-soundcard.h \ oss4-source.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/oss4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/oss4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstoss4audio.la: $(libgstoss4audio_la_OBJECTS) $(libgstoss4audio_la_DEPENDENCIES) $(EXTRA_libgstoss4audio_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstoss4audio_la_LINK) -rpath $(plugindir) $(libgstoss4audio_la_OBJECTS) $(libgstoss4audio_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-audio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-mixer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-sink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstoss4audio_la-oss4-source.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstoss4audio_la-oss4-audio.lo: oss4-audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-audio.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-audio.Tpo -c -o libgstoss4audio_la-oss4-audio.lo `test -f 'oss4-audio.c' || echo '$(srcdir)/'`oss4-audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-audio.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-audio.c' object='libgstoss4audio_la-oss4-audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-audio.lo `test -f 'oss4-audio.c' || echo '$(srcdir)/'`oss4-audio.c libgstoss4audio_la-oss4-mixer.lo: oss4-mixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer.Tpo -c -o libgstoss4audio_la-oss4-mixer.lo `test -f 'oss4-mixer.c' || echo '$(srcdir)/'`oss4-mixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer.c' object='libgstoss4audio_la-oss4-mixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer.lo `test -f 'oss4-mixer.c' || echo '$(srcdir)/'`oss4-mixer.c libgstoss4audio_la-oss4-mixer-enum.lo: oss4-mixer-enum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer-enum.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Tpo -c -o libgstoss4audio_la-oss4-mixer-enum.lo `test -f 'oss4-mixer-enum.c' || echo '$(srcdir)/'`oss4-mixer-enum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer-enum.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer-enum.c' object='libgstoss4audio_la-oss4-mixer-enum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer-enum.lo `test -f 'oss4-mixer-enum.c' || echo '$(srcdir)/'`oss4-mixer-enum.c libgstoss4audio_la-oss4-mixer-slider.lo: oss4-mixer-slider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer-slider.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Tpo -c -o libgstoss4audio_la-oss4-mixer-slider.lo `test -f 'oss4-mixer-slider.c' || echo '$(srcdir)/'`oss4-mixer-slider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer-slider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer-slider.c' object='libgstoss4audio_la-oss4-mixer-slider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer-slider.lo `test -f 'oss4-mixer-slider.c' || echo '$(srcdir)/'`oss4-mixer-slider.c libgstoss4audio_la-oss4-mixer-switch.lo: oss4-mixer-switch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-mixer-switch.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Tpo -c -o libgstoss4audio_la-oss4-mixer-switch.lo `test -f 'oss4-mixer-switch.c' || echo '$(srcdir)/'`oss4-mixer-switch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-mixer-switch.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-mixer-switch.c' object='libgstoss4audio_la-oss4-mixer-switch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-mixer-switch.lo `test -f 'oss4-mixer-switch.c' || echo '$(srcdir)/'`oss4-mixer-switch.c libgstoss4audio_la-oss4-property-probe.lo: oss4-property-probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-property-probe.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Tpo -c -o libgstoss4audio_la-oss4-property-probe.lo `test -f 'oss4-property-probe.c' || echo '$(srcdir)/'`oss4-property-probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-property-probe.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-property-probe.c' object='libgstoss4audio_la-oss4-property-probe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-property-probe.lo `test -f 'oss4-property-probe.c' || echo '$(srcdir)/'`oss4-property-probe.c libgstoss4audio_la-oss4-sink.lo: oss4-sink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-sink.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-sink.Tpo -c -o libgstoss4audio_la-oss4-sink.lo `test -f 'oss4-sink.c' || echo '$(srcdir)/'`oss4-sink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-sink.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-sink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-sink.c' object='libgstoss4audio_la-oss4-sink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-sink.lo `test -f 'oss4-sink.c' || echo '$(srcdir)/'`oss4-sink.c libgstoss4audio_la-oss4-source.lo: oss4-source.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -MT libgstoss4audio_la-oss4-source.lo -MD -MP -MF $(DEPDIR)/libgstoss4audio_la-oss4-source.Tpo -c -o libgstoss4audio_la-oss4-source.lo `test -f 'oss4-source.c' || echo '$(srcdir)/'`oss4-source.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstoss4audio_la-oss4-source.Tpo $(DEPDIR)/libgstoss4audio_la-oss4-source.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='oss4-source.c' object='libgstoss4audio_la-oss4-source.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstoss4audio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstoss4audio_la_CFLAGS) $(CFLAGS) -c -o libgstoss4audio_la-oss4-source.lo `test -f 'oss4-source.c' || echo '$(srcdir)/'`oss4-source.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/oss4/oss4-mixer-slider.c0000644000175000017500000002112411671175354017155 00000000000000/* GStreamer OSS4 mixer slider control * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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. */ /* A 'slider' in gnome-volume-control / GstMixer is represented by a * GstMixerTrack with one or more channels. * * A slider should be either flagged as INPUT or OUTPUT (mostly because of * gnome-volume-control being littered with g_asserts for everything it doesn't * expect). * * From mixertrack.h: * "Input tracks can have 'recording' enabled, which means that any input will * be hearable into the speakers that are attached to the output. Mute is * obvious." */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #define NO_LEGACY_MIXER #include "oss4-mixer-slider.h" GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); #define GST_CAT_DEFAULT oss4mixer_debug /* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ G_DEFINE_TYPE (GstOss4MixerSlider, gst_oss4_mixer_slider, GST_TYPE_MIXER_TRACK); static void gst_oss4_mixer_slider_class_init (GstOss4MixerSliderClass * klass) { /* nothing to do here */ } static void gst_oss4_mixer_slider_init (GstOss4MixerSlider * s) { /* nothing to do here */ } static int gst_oss4_mixer_slider_pack_volume (GstOss4MixerSlider * s, const gint * volumes) { int val = 0; switch (s->mc->mixext.type) { case MIXT_MONOSLIDER: case MIXT_MONOSLIDER16: case MIXT_SLIDER: val = volumes[0]; break; case MIXT_STEREOSLIDER: val = ((volumes[1] & 0xff) << 8) | (volumes[0] & 0xff); break; case MIXT_STEREOSLIDER16: val = ((volumes[1] & 0xffff) << 16) | (volumes[0] & 0xffff); break; default: g_return_val_if_reached (0); } return val; } static void gst_oss4_mixer_slider_unpack_volume (GstOss4MixerSlider * s, int v, gint * volumes) { guint32 val; /* use uint so bitshifting the highest bit works right */ val = (guint32) v; switch (s->mc->mixext.type) { case MIXT_SLIDER: volumes[0] = val; break; case MIXT_MONOSLIDER: /* oss repeats the value in the upper bits, as if it was stereo */ volumes[0] = val & 0x00ff; break; case MIXT_MONOSLIDER16: /* oss repeats the value in the upper bits, as if it was stereo */ volumes[0] = val & 0x0000ffff; break; case MIXT_STEREOSLIDER: volumes[0] = (val & 0x00ff); volumes[1] = (val & 0xff00) >> 8; break; case MIXT_STEREOSLIDER16: volumes[0] = (val & 0x0000ffff); volumes[1] = (val & 0xffff0000) >> 16; break; default: g_return_if_reached (); } } gboolean gst_oss4_mixer_slider_get_volume (GstOss4MixerSlider * s, gint * volumes) { GstMixerTrack *track = GST_MIXER_TRACK (s); int v = 0; /* if we're supposed to be muted, and don't have an actual mute control * (ie. 'simulate' the mute), then just return the volume as saved, not * the actually set volume which is most likely 0 */ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE) && !s->mc->mute) { volumes[0] = s->volumes[0]; if (track->num_channels == 2) volumes[1] = s->volumes[1]; return TRUE; } if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &v)) return FALSE; gst_oss4_mixer_slider_unpack_volume (s, v, volumes); if (track->num_channels > 1) { GST_LOG_OBJECT (s, "volume: left=%d, right=%d", volumes[0], volumes[1]); } else { GST_LOG_OBJECT (s, "volume: mono=%d", volumes[0]); } return TRUE; } gboolean gst_oss4_mixer_slider_set_volume (GstOss4MixerSlider * s, const gint * volumes) { GstMixerTrack *track = GST_MIXER_TRACK (s); int val = 0; /* if we're supposed to be muted, and are 'simulating' the mute because * we don't have a mute control, don't actually change the volume, just * save it as the new desired volume for later when we get unmuted again */ if (!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_NO_MUTE)) { if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE) && !s->mc->mute) goto done; } val = gst_oss4_mixer_slider_pack_volume (s, volumes); if (track->num_channels > 1) { GST_LOG_OBJECT (s, "left=%d, right=%d", volumes[0], volumes[1]); } else { GST_LOG_OBJECT (s, "mono=%d", volumes[0]); } if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, val)) return FALSE; done: s->volumes[0] = volumes[0]; if (track->num_channels == 2) s->volumes[1] = volumes[1]; return TRUE; } gboolean gst_oss4_mixer_slider_set_record (GstOss4MixerSlider * s, gboolean record) { /* There doesn't seem to be a way to do this using the OSS4 mixer API, so * just do nothing here for now. */ return FALSE; } gboolean gst_oss4_mixer_slider_set_mute (GstOss4MixerSlider * s, gboolean mute) { GstMixerTrack *track = GST_MIXER_TRACK (s); gboolean ret; /* if the control does not support muting, then do not do anything */ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_NO_MUTE)) { return TRUE; } /* If we do not have a mute control, simulate mute (which is a bit broken, * since we can not differentiate between capture/playback volume etc., so * we just assume that setting the volume to 0 would be the same as muting * this control) */ if (s->mc->mute == NULL) { int volume; if (mute) { /* make sure the current volume values get saved. */ gst_oss4_mixer_slider_get_volume (s, s->volumes); volume = 0; } else { volume = gst_oss4_mixer_slider_pack_volume (s, s->volumes); } ret = gst_oss4_mixer_set_control_val (s->mixer, s->mc, volume); } else { ret = gst_oss4_mixer_set_control_val (s->mixer, s->mc->mute, ! !mute); } if (mute) { track->flags |= GST_MIXER_TRACK_MUTE; } else { track->flags &= ~GST_MIXER_TRACK_MUTE; } return ret; } GstMixerTrack * gst_oss4_mixer_slider_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) { GstOss4MixerSlider *s; GstMixerTrack *track; gint volumes[2] = { 0, }; s = g_object_new (GST_TYPE_OSS4_MIXER_SLIDER, "untranslated-label", mc->mixext.extname, NULL); track = GST_MIXER_TRACK (s); /* caller will set track->label and track->flags */ s->mc = mc; s->mixer = mixer; /* we don't do value scaling but just present a scale of 0-maxvalue */ track->min_volume = 0; track->max_volume = mc->mixext.maxvalue; switch (mc->mixext.type) { case MIXT_MONOSLIDER: case MIXT_MONOSLIDER16: case MIXT_SLIDER: track->num_channels = 1; break; case MIXT_STEREOSLIDER: case MIXT_STEREOSLIDER16: track->num_channels = 2; break; default: g_return_val_if_reached (NULL); } GST_LOG_OBJECT (track, "min=%d, max=%d, channels=%d", track->min_volume, track->max_volume, track->num_channels); if (!gst_oss4_mixer_slider_get_volume (s, volumes)) { GST_WARNING_OBJECT (track, "failed to read volume, returning NULL"); g_object_unref (track); track = NULL; } return track; } /* This is called from the watch thread */ void gst_oss4_mixer_slider_process_change_unlocked (GstMixerTrack * track) { GstOss4MixerSlider *s = GST_OSS4_MIXER_SLIDER_CAST (track); if (s->mc->mute != NULL && s->mc->mute->changed) { gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, ! !s->mc->mute->last_val); } else { /* nothing to do here, since we don't/can't easily implement the record * flag */ } if (s->mc->changed) { gint volumes[2] = { 0, 0 }; gst_oss4_mixer_slider_unpack_volume (s, s->mc->last_val, volumes); /* if we 'simulate' the mute, update flag when the volume changes */ if (s->mc->mute == NULL) { if (volumes[0] == 0 && volumes[1] == 0) { track->flags |= GST_MIXER_TRACK_MUTE; } else { track->flags &= ~GST_MIXER_TRACK_MUTE; } } gst_mixer_volume_changed (GST_MIXER (s->mixer), track, volumes); } } gst-plugins-good-0.10.31/sys/oss4/oss4-mixer-switch.c0000644000175000017500000000731611671175354017203 00000000000000/* GStreamer OSS4 mixer on/off switch control * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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. */ /* A simple ON/OFF 'switch' in gnome-volume-control / GstMixer is represented * by a GstMixerTrack with no channels. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #define NO_LEGACY_MIXER #include "oss4-mixer-switch.h" #include "oss4-soundcard.h" GST_DEBUG_CATEGORY_EXTERN (oss4mixer_debug); #define GST_CAT_DEFAULT oss4mixer_debug /* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ G_DEFINE_TYPE (GstOss4MixerSwitch, gst_oss4_mixer_switch, GST_TYPE_MIXER_TRACK); static void gst_oss4_mixer_switch_class_init (GstOss4MixerSwitchClass * klass) { /* nothing to do here */ } static void gst_oss4_mixer_switch_init (GstOss4MixerSwitch * s) { /* nothing to do here */ } gboolean gst_oss4_mixer_switch_set (GstOss4MixerSwitch * s, gboolean disabled) { GstMixerTrack *track; int newval; track = GST_MIXER_TRACK (s); newval = disabled ? GST_MIXER_TRACK_MUTE : 0; if (newval == (track->flags & GST_MIXER_TRACK_MUTE)) { GST_LOG_OBJECT (s, "switch is already %d, doing nothing", newval); return TRUE; } if (!gst_oss4_mixer_set_control_val (s->mixer, s->mc, !disabled)) { GST_WARNING_OBJECT (s, "could not set switch to %d", !disabled); return FALSE; } if (disabled) { track->flags |= GST_MIXER_TRACK_MUTE; } else { track->flags &= ~GST_MIXER_TRACK_MUTE; } GST_LOG_OBJECT (s, "set switch to %d", newval); return TRUE; } gboolean gst_oss4_mixer_switch_get (GstOss4MixerSwitch * s, gboolean * disabled) { GstMixerTrack *track; int enabled = -1; track = GST_MIXER_TRACK (s); if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &enabled) || (enabled < 0)) { GST_WARNING_OBJECT (s, "could not get switch state"); return FALSE; } if (enabled) { track->flags &= ~GST_MIXER_TRACK_MUTE; } else { track->flags |= GST_MIXER_TRACK_MUTE; } *disabled = (enabled == 0); return TRUE; } GstMixerTrack * gst_oss4_mixer_switch_new (GstOss4Mixer * mixer, GstOss4MixerControl * mc) { GstOss4MixerSwitch *s; GstMixerTrack *track; int cur = -1; s = g_object_new (GST_TYPE_OSS4_MIXER_SWITCH, "untranslated-label", mc->mixext.extname, NULL); s->mixer = mixer; s->mc = mc; track = GST_MIXER_TRACK (s); /* caller will set track->label and track->flags */ track->num_channels = 0; track->min_volume = 0; track->max_volume = 0; if (!gst_oss4_mixer_get_control_val (s->mixer, s->mc, &cur) || cur < 0) return NULL; if (cur) { track->flags &= ~GST_MIXER_TRACK_MUTE; } else { track->flags |= GST_MIXER_TRACK_MUTE; } return track; } /* This is called from the watch thread */ void gst_oss4_mixer_switch_process_change_unlocked (GstMixerTrack * track) { GstOss4MixerSwitch *s = GST_OSS4_MIXER_SWITCH_CAST (track); if (!s->mc->changed) return; gst_mixer_mute_toggled (GST_MIXER (s->mixer), track, !s->mc->last_val); } gst-plugins-good-0.10.31/sys/oss4/oss4-source.c0000644000175000017500000006723011705514370016052 00000000000000/* GStreamer OSS4 audio source * Copyright (C) 2007-2008 Tim-Philipp Müller * * 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-oss4src * * This element lets you record sound using the Open Sound System (OSS) * version 4. * * * Example pipelines * |[ * gst-launch -v oss4src ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=mymusic.ogg * ]| will record sound from your sound card using OSS4 and encode it to an * Ogg/Vorbis file (this will only work if your mixer settings are right * and the right inputs areenabled etc.) * * * Since: 0.10.7 */ /* FIXME: make sure we're not doing ioctls from the app thread (e.g. via the * mixer interface) while recording */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #define NO_LEGACY_MIXER #include "oss4-audio.h" #include "oss4-source.h" #include "oss4-property-probe.h" #include "oss4-soundcard.h" #define GST_OSS4_SOURCE_IS_OPEN(src) (GST_OSS4_SOURCE(src)->fd != -1) GST_DEBUG_CATEGORY_EXTERN (oss4src_debug); #define GST_CAT_DEFAULT oss4src_debug #define DEFAULT_DEVICE NULL #define DEFAULT_DEVICE_NAME NULL enum { PROP_0, PROP_DEVICE, PROP_DEVICE_NAME }; static void gst_oss4_source_init_interfaces (GType type); GST_BOILERPLATE_FULL (GstOss4Source, gst_oss4_source, GstAudioSrc, GST_TYPE_AUDIO_SRC, gst_oss4_source_init_interfaces); static void gst_oss4_source_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_oss4_source_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_oss4_source_dispose (GObject * object); static void gst_oss4_source_finalize (GstOss4Source * osssrc); static GstCaps *gst_oss4_source_getcaps (GstBaseSrc * bsrc); static gboolean gst_oss4_source_open (GstAudioSrc * asrc, gboolean silent_errors); static gboolean gst_oss4_source_open_func (GstAudioSrc * asrc); static gboolean gst_oss4_source_close (GstAudioSrc * asrc); static gboolean gst_oss4_source_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec); static gboolean gst_oss4_source_unprepare (GstAudioSrc * asrc); static guint gst_oss4_source_read (GstAudioSrc * asrc, gpointer data, guint length); static guint gst_oss4_source_delay (GstAudioSrc * asrc); static void gst_oss4_source_reset (GstAudioSrc * asrc); static void gst_oss4_source_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstPadTemplate *templ; gst_element_class_set_details_simple (element_class, "OSS v4 Audio Source", "Source/Audio", "Capture from a sound card via OSS version 4", "Tim-Philipp Müller "); templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_oss4_audio_get_template_caps ()); gst_element_class_add_pad_template (element_class, templ); gst_object_unref (templ); } static void gst_oss4_source_class_init (GstOss4SourceClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; GstAudioSrcClass *gstaudiosrc_class; gobject_class = (GObjectClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstaudiosrc_class = (GstAudioSrcClass *) klass; gobject_class->dispose = gst_oss4_source_dispose; gobject_class->finalize = (GObjectFinalizeFunc) gst_oss4_source_finalize; gobject_class->get_property = gst_oss4_source_get_property; gobject_class->set_property = gst_oss4_source_set_property; gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss4_source_getcaps); gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_oss4_source_open_func); gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_oss4_source_prepare); gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss4_source_unprepare); gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_oss4_source_close); gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_oss4_source_read); gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_oss4_source_delay); gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_oss4_source_reset); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "OSS4 device (e.g. /dev/oss/hdaudio0/pcm0 or /dev/dspN) " "(NULL = use first available device)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } static void gst_oss4_source_init (GstOss4Source * osssrc, GstOss4SourceClass * g_class) { const gchar *device; device = g_getenv ("AUDIODEV"); if (device == NULL) device = DEFAULT_DEVICE; osssrc->fd = -1; osssrc->device = g_strdup (device); osssrc->device_name = g_strdup (DEFAULT_DEVICE_NAME); osssrc->device_name = NULL; } static void gst_oss4_source_finalize (GstOss4Source * oss) { g_free (oss->device); oss->device = NULL; g_list_free (oss->property_probe_list); oss->property_probe_list = NULL; G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (oss)); } static void gst_oss4_source_dispose (GObject * object) { GstOss4Source *oss = GST_OSS4_SOURCE (object); if (oss->probed_caps) { gst_caps_unref (oss->probed_caps); oss->probed_caps = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_oss4_source_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOss4Source *oss; oss = GST_OSS4_SOURCE (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (oss); if (oss->fd == -1) { g_free (oss->device); oss->device = g_value_dup_string (value); g_free (oss->device_name); oss->device_name = NULL; } else { g_warning ("%s: can't change \"device\" property while audio source " "is open", GST_OBJECT_NAME (oss)); } GST_OBJECT_UNLOCK (oss); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss4_source_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOss4Source *oss; oss = GST_OSS4_SOURCE (object); switch (prop_id) { case PROP_DEVICE: GST_OBJECT_LOCK (oss); g_value_set_string (value, oss->device); GST_OBJECT_UNLOCK (oss); break; case PROP_DEVICE_NAME: GST_OBJECT_LOCK (oss); /* If device is set, try to retrieve the name even if we're not open */ if (oss->fd == -1 && oss->device != NULL) { if (gst_oss4_source_open (GST_AUDIO_SRC (oss), TRUE)) { g_value_set_string (value, oss->device_name); gst_oss4_source_close (GST_AUDIO_SRC (oss)); } else { gchar *name = NULL; gst_oss4_property_probe_find_device_name_nofd (GST_OBJECT (oss), oss->device, &name); g_value_set_string (value, name); g_free (name); } } else { g_value_set_string (value, oss->device_name); } GST_OBJECT_UNLOCK (oss); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_oss4_source_getcaps (GstBaseSrc * bsrc) { GstOss4Source *oss; GstCaps *caps; oss = GST_OSS4_SOURCE (bsrc); if (oss->fd == -1) { caps = gst_oss4_audio_get_template_caps (); } else if (oss->probed_caps) { caps = gst_caps_copy (oss->probed_caps); } else { caps = gst_oss4_audio_probe_caps (GST_OBJECT (oss), oss->fd); if (caps != NULL && !gst_caps_is_empty (caps)) { oss->probed_caps = gst_caps_copy (caps); } } return caps; } /* note: we must not take the object lock here unless we fix up get_property */ static gboolean gst_oss4_source_open (GstAudioSrc * asrc, gboolean silent_errors) { GstOss4Source *oss; gchar *device; int mode; oss = GST_OSS4_SOURCE (asrc); if (oss->device) device = g_strdup (oss->device); else device = gst_oss4_audio_find_device (GST_OBJECT_CAST (oss)); /* desperate times, desperate measures */ if (device == NULL) device = g_strdup ("/dev/dsp0"); GST_INFO_OBJECT (oss, "Trying to open OSS4 device '%s'", device); /* we open in non-blocking mode even if we don't really want to do writes * non-blocking because we can't be sure that this is really a genuine * OSS4 device with well-behaved drivers etc. We really don't want to * hang forever under any circumstances. */ oss->fd = open (device, O_RDONLY | O_NONBLOCK, 0); if (oss->fd == -1) { switch (errno) { case EBUSY: goto busy; case EACCES: goto no_permission; default: goto open_failed; } } GST_INFO_OBJECT (oss, "Opened device"); /* Make sure it's OSS4. If it's old OSS, let osssink handle it */ if (!gst_oss4_audio_check_version (GST_OBJECT_CAST (oss), oss->fd)) goto legacy_oss; /* now remove the non-blocking flag. */ mode = fcntl (oss->fd, F_GETFL); mode &= ~O_NONBLOCK; if (fcntl (oss->fd, F_SETFL, mode) < 0) { /* some drivers do no support unsetting the non-blocking flag, try to * close/open the device then. This is racy but we error out properly. */ GST_WARNING_OBJECT (oss, "failed to unset O_NONBLOCK (buggy driver?), " "will try to re-open device now"); gst_oss4_source_close (asrc); if ((oss->fd = open (device, O_RDONLY, 0)) == -1) goto non_block; } oss->open_device = device; /* not using ENGINEINFO here because it sometimes returns a different and * less useful name than AUDIOINFO for the same device */ if (!gst_oss4_property_probe_find_device_name (GST_OBJECT (oss), oss->fd, oss->open_device, &oss->device_name)) { oss->device_name = NULL; } return TRUE; /* ERRORS */ busy: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, (_("Could not open audio device for playback. " "Device is being used by another application.")), (NULL)); } g_free (device); return FALSE; } no_permission: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, (_("Could not open audio device for playback. " "You don't have permission to open the device.")), GST_ERROR_SYSTEM); } g_free (device); return FALSE; } open_failed: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, (_("Could not open audio device for playback.")), GST_ERROR_SYSTEM); } g_free (device); return FALSE; } legacy_oss: { gst_oss4_source_close (asrc); if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, (_("Could not open audio device for playback. " "This version of the Open Sound System is not supported by this " "element.")), ("Try the 'osssink' element instead")); } g_free (device); return FALSE; } non_block: { if (!silent_errors) { GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), ("Unable to set device %s into non-blocking mode: %s", oss->device, g_strerror (errno))); } g_free (device); return FALSE; } } static gboolean gst_oss4_source_open_func (GstAudioSrc * asrc) { return gst_oss4_source_open (asrc, FALSE); } static void gst_oss4_source_free_mixer_tracks (GstOss4Source * oss) { g_list_foreach (oss->tracks, (GFunc) g_object_unref, NULL); g_list_free (oss->tracks); oss->tracks = NULL; } static gboolean gst_oss4_source_close (GstAudioSrc * asrc) { GstOss4Source *oss; oss = GST_OSS4_SOURCE (asrc); if (oss->fd != -1) { GST_DEBUG_OBJECT (oss, "closing device"); close (oss->fd); oss->fd = -1; } oss->bytes_per_sample = 0; gst_caps_replace (&oss->probed_caps, NULL); g_free (oss->open_device); oss->open_device = NULL; g_free (oss->device_name); oss->device_name = NULL; gst_oss4_source_free_mixer_tracks (oss); return TRUE; } static gboolean gst_oss4_source_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) { GstOss4Source *oss; oss = GST_OSS4_SOURCE (asrc); if (!gst_oss4_audio_set_format (GST_OBJECT_CAST (oss), oss->fd, spec)) { GST_WARNING_OBJECT (oss, "Couldn't set requested format %" GST_PTR_FORMAT, spec->caps); return FALSE; } oss->bytes_per_sample = spec->bytes_per_sample; return TRUE; } static gboolean gst_oss4_source_unprepare (GstAudioSrc * asrc) { /* could do a SNDCTL_DSP_HALT, but the OSS manual recommends a close/open, * since HALT won't properly reset some devices, apparently */ if (!gst_oss4_source_close (asrc)) goto couldnt_close; if (!gst_oss4_source_open_func (asrc)) goto couldnt_reopen; return TRUE; /* ERRORS */ couldnt_close: { GST_DEBUG_OBJECT (asrc, "Couldn't close the audio device"); return FALSE; } couldnt_reopen: { GST_DEBUG_OBJECT (asrc, "Couldn't reopen the audio device"); return FALSE; } } static guint gst_oss4_source_read (GstAudioSrc * asrc, gpointer data, guint length) { GstOss4Source *oss; int n; oss = GST_OSS4_SOURCE_CAST (asrc); n = read (oss->fd, data, length); GST_LOG_OBJECT (asrc, "%u bytes, %u samples", n, n / oss->bytes_per_sample); if (G_UNLIKELY (n < 0)) { switch (errno) { case ENOTSUP: case EACCES:{ /* This is the most likely cause, I think */ GST_ELEMENT_ERROR (asrc, RESOURCE, READ, (_("Recording is not supported by this audio device.")), ("read: %s (device: %s) (maybe this is an output-only device?)", g_strerror (errno), oss->open_device)); break; } default:{ GST_ELEMENT_ERROR (asrc, RESOURCE, READ, (_("Error recording from audio device.")), ("read: %s (device: %s)", g_strerror (errno), oss->open_device)); break; } } } return (guint) n; } static guint gst_oss4_source_delay (GstAudioSrc * asrc) { audio_buf_info info = { 0, }; GstOss4Source *oss; guint delay; oss = GST_OSS4_SOURCE_CAST (asrc); if (ioctl (oss->fd, SNDCTL_DSP_GETISPACE, &info) == -1) { GST_LOG_OBJECT (oss, "GETISPACE failed: %s", g_strerror (errno)); return 0; } delay = (info.fragstotal * info.fragsize) - info.bytes; GST_LOG_OBJECT (oss, "fragstotal:%d, fragsize:%d, bytes:%d, delay:%d", info.fragstotal, info.fragsize, info.bytes, delay); return delay; } static void gst_oss4_source_reset (GstAudioSrc * asrc) { /* There's nothing we can do here really: OSS can't handle access to the * same device/fd from multiple threads and might deadlock or blow up in * other ways if we try an ioctl SNDCTL_DSP_HALT or similar */ } /* GstMixer interface, which we abuse here for input selection, because we * don't have a proper interface for that and because that's what * gnome-sound-recorder does. */ /* GstMixerTrack is a plain GObject, so let's just use the GLib macro here */ G_DEFINE_TYPE (GstOss4SourceInput, gst_oss4_source_input, GST_TYPE_MIXER_TRACK); static void gst_oss4_source_input_class_init (GstOss4SourceInputClass * klass) { /* nothing to do here */ } static void gst_oss4_source_input_init (GstOss4SourceInput * i) { /* nothing to do here */ } #if 0 static void gst_ossmixer_ensure_track_list (GstOssMixer * mixer) { gint i, master = -1; g_return_if_fail (mixer->fd != -1); if (mixer->tracklist) return; /* find master volume */ if (mixer->devmask & SOUND_MASK_VOLUME) master = SOUND_MIXER_VOLUME; else if (mixer->devmask & SOUND_MASK_PCM) master = SOUND_MIXER_PCM; else if (mixer->devmask & SOUND_MASK_SPEAKER) master = SOUND_MIXER_SPEAKER; /* doubtful... */ /* else: no master, so we won't set any */ /* build track list */ for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { if (mixer->devmask & (1 << i)) { GstMixerTrack *track; gboolean input = FALSE, stereo = FALSE, record = FALSE; /* track exists, make up capabilities */ if (MASK_BIT_IS_SET (mixer->stereomask, i)) stereo = TRUE; if (MASK_BIT_IS_SET (mixer->recmask, i)) input = TRUE; if (MASK_BIT_IS_SET (mixer->recdevs, i)) record = TRUE; /* do we want mixer in our list? */ if (!((mixer->dir & GST_OSS_MIXER_CAPTURE && input == TRUE) || (mixer->dir & GST_OSS_MIXER_PLAYBACK && i != SOUND_MIXER_PCM))) /* the PLAYBACK case seems hacky, but that's how 0.8 had it */ continue; /* add track to list */ track = gst_ossmixer_track_new (mixer->fd, i, stereo ? 2 : 1, (record ? GST_MIXER_TRACK_RECORD : 0) | (input ? GST_MIXER_TRACK_INPUT : GST_MIXER_TRACK_OUTPUT) | ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); mixer->tracklist = g_list_append (mixer->tracklist, track); } } } /* unused with G_DISABLE_* */ static G_GNUC_UNUSED gboolean gst_ossmixer_contains_track (GstOssMixer * mixer, GstOssMixerTrack * osstrack) { const GList *item; for (item = mixer->tracklist; item != NULL; item = item->next) if (item->data == osstrack) return TRUE; return FALSE; } const GList * gst_ossmixer_list_tracks (GstOssMixer * mixer) { gst_ossmixer_ensure_track_list (mixer); return (const GList *) mixer->tracklist; } void gst_ossmixer_get_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes) { gint volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); g_return_if_fail (mixer->fd != -1); g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); if (track->flags & GST_MIXER_TRACK_MUTE) { volumes[0] = osstrack->lvol; if (track->num_channels == 2) { volumes[1] = osstrack->rvol; } } else { /* get */ if (ioctl (mixer->fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting recording device (%d) volume: %s", osstrack->track_num, g_strerror (errno)); volume = 0; } osstrack->lvol = volumes[0] = (volume & 0xff); if (track->num_channels == 2) { osstrack->rvol = volumes[1] = ((volume >> 8) & 0xff); } } } void gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, gboolean mute) { int volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); g_return_if_fail (mixer->fd != -1); g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); if (mute) { volume = 0; } else { volume = (osstrack->lvol & 0xff); if (MASK_BIT_IS_SET (mixer->stereomask, osstrack->track_num)) { volume |= ((osstrack->rvol & 0xff) << 8); } } if (ioctl (mixer->fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting mixer recording device volume (0x%x): %s", volume, g_strerror (errno)); return; } if (mute) { track->flags |= GST_MIXER_TRACK_MUTE; } else { track->flags &= ~GST_MIXER_TRACK_MUTE; } } #endif static gint gst_oss4_source_mixer_get_current_input (GstOss4Source * oss) { int cur = -1; if (ioctl (oss->fd, SNDCTL_DSP_GET_RECSRC, &cur) == -1 || cur < 0) return -1; return cur; } static const gchar * gst_oss4_source_mixer_update_record_flags (GstOss4Source * oss, gint cur_route) { const gchar *cur_name = ""; GList *t; for (t = oss->tracks; t != NULL; t = t->next) { GstMixerTrack *track = t->data; if (GST_OSS4_SOURCE_INPUT (track)->route == cur_route) { if (!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) { track->flags |= GST_MIXER_TRACK_RECORD; /* no point in sending a mixer-record-changes message here */ } cur_name = track->label; } else { if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) { track->flags &= ~GST_MIXER_TRACK_RECORD; /* no point in sending a mixer-record-changes message here */ } } } return cur_name; } static const GList * gst_oss4_source_mixer_list_tracks (GstMixer * mixer) { oss_mixer_enuminfo names = { 0, }; GstOss4Source *oss; const gchar *cur_name; GList *tracks = NULL; gint i, cur; g_return_val_if_fail (mixer != NULL, NULL); g_return_val_if_fail (GST_IS_OSS4_SOURCE (mixer), NULL); g_return_val_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer), NULL); oss = GST_OSS4_SOURCE (mixer); if (oss->tracks != NULL && oss->tracks_static) goto done; if (ioctl (oss->fd, SNDCTL_DSP_GET_RECSRC_NAMES, &names) == -1) goto get_recsrc_names_error; oss->tracks_static = (names.version == 0); GST_INFO_OBJECT (oss, "%d inputs (list is static: %s):", names.nvalues, (oss->tracks_static) ? "yes" : "no"); for (i = 0; i < MIN (names.nvalues, OSS_ENUM_MAXVALUE + 1); ++i) { GstMixerTrack *track; track = g_object_new (GST_TYPE_OSS4_SOURCE_INPUT, NULL); track->label = g_strdup (&names.strings[names.strindex[i]]); track->flags = GST_MIXER_TRACK_INPUT; track->num_channels = 2; track->min_volume = 0; track->max_volume = 100; GST_OSS4_SOURCE_INPUT (track)->route = i; GST_INFO_OBJECT (oss, " [%d] %s", i, track->label); tracks = g_list_append (tracks, track); } gst_oss4_source_free_mixer_tracks (oss); oss->tracks = tracks; done: /* update RECORD flags */ cur = gst_oss4_source_mixer_get_current_input (oss); cur_name = gst_oss4_source_mixer_update_record_flags (oss, cur); GST_DEBUG_OBJECT (oss, "current input route: %d (%s)", cur, cur_name); return (const GList *) oss->tracks; /* ERRORS */ get_recsrc_names_error: { GST_WARNING_OBJECT (oss, "GET_RECSRC_NAMES failed: %s", g_strerror (errno)); return NULL; } } static void gst_oss4_source_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes) { GstOss4Source *oss; int new_vol, cur; g_return_if_fail (mixer != NULL); g_return_if_fail (track != NULL); g_return_if_fail (GST_IS_MIXER_TRACK (track)); g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); oss = GST_OSS4_SOURCE (mixer); cur = gst_oss4_source_mixer_get_current_input (oss); if (cur != GST_OSS4_SOURCE_INPUT (track)->route) { GST_DEBUG_OBJECT (oss, "track not selected input route, ignoring request"); return; } new_vol = (volumes[1] << 8) | volumes[0]; if (ioctl (oss->fd, SNDCTL_DSP_SETRECVOL, &new_vol) == -1) { GST_WARNING_OBJECT (oss, "SETRECVOL failed: %s", g_strerror (errno)); } } static void gst_oss4_source_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes) { GstOss4Source *oss; int cur; g_return_if_fail (mixer != NULL); g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); oss = GST_OSS4_SOURCE (mixer); cur = gst_oss4_source_mixer_get_current_input (oss); if (cur != GST_OSS4_SOURCE_INPUT (track)->route) { volumes[0] = 0; volumes[1] = 0; } else { int vol = -1; if (ioctl (oss->fd, SNDCTL_DSP_GETRECVOL, &vol) == -1 || vol < 0) { GST_WARNING_OBJECT (oss, "GETRECVOL failed: %s", g_strerror (errno)); volumes[0] = 100; volumes[1] = 100; } else { volumes[0] = MIN (100, vol & 0xff); volumes[1] = MIN (100, (vol >> 8) & 0xff); } } } static void gst_oss4_source_mixer_set_record (GstMixer * mixer, GstMixerTrack * track, gboolean record) { GstOss4Source *oss; const gchar *cur_name; gint cur; g_return_if_fail (mixer != NULL); g_return_if_fail (track != NULL); g_return_if_fail (GST_IS_MIXER_TRACK (track)); g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); oss = GST_OSS4_SOURCE (mixer); cur = gst_oss4_source_mixer_get_current_input (oss); /* stop recording for an input that's not selected anyway => nothing to do */ if (!record && cur != GST_OSS4_SOURCE_INPUT (track)->route) goto done; /* select recording for an input that's already selected => nothing to do * (or should we mess with the recording volume in this case maybe?) */ if (record && cur == GST_OSS4_SOURCE_INPUT (track)->route) goto done; /* make current input stop recording: we can't really make an input stop * recording, we can only select an input FOR recording, so we'll just ignore * all requests to stop for now */ if (!record) { GST_WARNING_OBJECT (oss, "Can't un-select an input as such, only switch " "to a different input source"); /* FIXME: set recording volume to 0 maybe? */ } else { int new_route = GST_OSS4_SOURCE_INPUT (track)->route; /* select this input for recording */ if (ioctl (oss->fd, SNDCTL_DSP_SET_RECSRC, &new_route) == -1) { GST_WARNING_OBJECT (oss, "Could not select input %d for recording: %s", new_route, g_strerror (errno)); } else { cur = new_route; } } done: cur_name = gst_oss4_source_mixer_update_record_flags (oss, cur); GST_DEBUG_OBJECT (oss, "active input route: %d (%s)", cur, cur_name); } static void gst_oss4_source_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute) { g_return_if_fail (mixer != NULL); g_return_if_fail (track != NULL); g_return_if_fail (GST_IS_MIXER_TRACK (track)); g_return_if_fail (GST_IS_OSS4_SOURCE (mixer)); g_return_if_fail (GST_OSS4_SOURCE_IS_OPEN (mixer)); /* FIXME: implement gst_oss4_source_mixer_set_mute() - what to do here? */ /* oss4_mixer_set_mute (mixer->mixer, track, mute); */ } static void gst_oss4_source_mixer_interface_init (GstMixerClass * klass) { GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; klass->list_tracks = gst_oss4_source_mixer_list_tracks; klass->set_volume = gst_oss4_source_mixer_set_volume; klass->get_volume = gst_oss4_source_mixer_get_volume; klass->set_mute = gst_oss4_source_mixer_set_mute; klass->set_record = gst_oss4_source_mixer_set_record; } /* Implement the horror that is GstImplementsInterface */ static gboolean gst_oss4_source_mixer_supported (GstImplementsInterface * iface, GType iface_type) { GstOss4Source *oss; gboolean is_open; g_return_val_if_fail (GST_IS_OSS4_SOURCE (iface), FALSE); g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); oss = GST_OSS4_SOURCE (iface); GST_OBJECT_LOCK (oss); is_open = GST_OSS4_SOURCE_IS_OPEN (iface); GST_OBJECT_UNLOCK (oss); return is_open; } static void gst_oss4_source_mixer_implements_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_oss4_source_mixer_supported; } static void gst_oss4_source_init_interfaces (GType type) { static const GInterfaceInfo implements_iface_info = { (GInterfaceInitFunc) gst_oss4_source_mixer_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo mixer_iface_info = { (GInterfaceInitFunc) gst_oss4_source_mixer_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_iface_info); g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_iface_info); gst_oss4_add_property_probe_interface (type); } gst-plugins-good-0.10.31/sys/ximage/0000755000175000017500000000000011720565321014151 500000000000000gst-plugins-good-0.10.31/sys/ximage/Makefile.am0000644000175000017500000000102311671175354016131 00000000000000plugin_LTLIBRARIES = libgstximagesrc.la libgstximagesrc_la_SOURCES = gstximagesrc.c ximageutil.c libgstximagesrc_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(X_CFLAGS) $(XFIXES_CFLAGS) $(XDAMAGE_CFLAGS) libgstximagesrc_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(X_LIBS) $(XSHM_LIBS) $(XFIXES_LIBS) $(XDAMAGE_LIBS) libgstximagesrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstximagesrc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstximagesrc.h ximageutil.h gst-plugins-good-0.10.31/sys/ximage/ximageutil.h0000644000175000017500000001277011671175354016431 00000000000000/* GStreamer * Copyright (C) <2005> Luca Ognibene * * 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_XIMAGEUTIL_H__ #define __GST_XIMAGEUTIL_H__ #include #ifdef HAVE_XSHM #include #include #include #endif /* HAVE_XSHM */ #include #include #ifdef HAVE_XSHM #include #endif /* HAVE_XSHM */ #include #include G_BEGIN_DECLS typedef struct _GstXContext GstXContext; typedef struct _GstXWindow GstXWindow; typedef struct _GstXImage GstXImage; typedef struct _GstXImageSrcBuffer GstXImageSrcBuffer; /* Global X Context stuff */ /** * GstXContext: * @disp: the X11 Display of this context * @screen: the default Screen of Display @disp * @screen_num: the Screen number of @screen * @visual: the default Visual of Screen @screen * @root: the root Window of Display @disp * @white: the value of a white pixel on Screen @screen * @black: the value of a black pixel on Screen @screen * @depth: the color depth of Display @disp * @bpp: the number of bits per pixel on Display @disp * @endianness: the endianness of image bytes on Display @disp * @width: the width in pixels of Display @disp * @height: the height in pixels of Display @disp * @widthmm: the width in millimeters of Display @disp * @heightmm: the height in millimeters of Display @disp * @par: the pixel aspect ratio calculated from @width, @widthmm and @height, * @heightmm ratio * @use_xshm: used to known wether of not XShm extension is usable or not even * if the Extension is present * @caps: the #GstCaps that Display @disp can accept * * Structure used to store various informations collected/calculated for a * Display. */ struct _GstXContext { Display *disp; Screen *screen; gint screen_num; Visual *visual; Window root; gulong white, black; gint depth; gint bpp; gint endianness; gint width, height; gint widthmm, heightmm; /* these are the output masks * for buffers from ximagesrc * and are in big endian */ guint32 r_mask_output, g_mask_output, b_mask_output; GValue *par; /* calculated pixel aspect ratio */ gboolean use_xshm; GstCaps *caps; }; /** * GstXWindow: * @win: the Window ID of this X11 window * @width: the width in pixels of Window @win * @height: the height in pixels of Window @win * @internal: used to remember if Window @win was created internally or passed * through the #GstXOverlay interface * @gc: the Graphical Context of Window @win * * Structure used to store informations about a Window. */ struct _GstXWindow { Window win; gint width, height; gboolean internal; GC gc; }; gboolean ximageutil_check_xshm_calls (GstXContext * xcontext); GstXContext *ximageutil_xcontext_get (GstElement *parent, const gchar *display_name); void ximageutil_xcontext_clear (GstXContext *xcontext); void ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext); /* custom ximagesrc buffer, copied from ximagesink */ /* BufferReturnFunc is called when a buffer is finalised */ typedef void (*BufferReturnFunc) (GstElement *parent, GstXImageSrcBuffer *buf); /** * GstXImageSrcBuffer: * @parent: a reference to the element we belong to * @ximage: the XImage of this buffer * @width: the width in pixels of XImage @ximage * @height: the height in pixels of XImage @ximage * @size: the size in bytes of XImage @ximage * * Subclass of #GstBuffer containing additional information about an XImage. */ struct _GstXImageSrcBuffer { GstBuffer buffer; /* Reference to the ximagesrc we belong to */ GstElement *parent; XImage *ximage; #ifdef HAVE_XSHM XShmSegmentInfo SHMInfo; #endif /* HAVE_XSHM */ gint width, height; size_t size; BufferReturnFunc return_func; }; GstXImageSrcBuffer *gst_ximageutil_ximage_new (GstXContext *xcontext, GstElement *parent, int width, int height, BufferReturnFunc return_func); void gst_ximageutil_ximage_destroy (GstXContext *xcontext, GstXImageSrcBuffer * ximage); /* Call to manually release a buffer */ void gst_ximage_buffer_free (GstXImageSrcBuffer *ximage); #define GST_TYPE_XIMAGESRC_BUFFER (gst_ximagesrc_buffer_get_type()) #define GST_IS_XIMAGESRC_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_XIMAGESRC_BUFFER)) #define GST_IS_XIMAGESRC_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_XIMAGESRC_BUFFER)) #define GST_XIMAGESRC_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_XIMAGESRC_BUFFER, GstXImageSrcBuffer)) #define GST_XIMAGESRC_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_XIMAGESRC_BUFFER, GstXImageSrcBufferClass)) #define GST_XIMAGESRC_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_XIMAGESRC_BUFFER, GstXImageSrcBufferClass)) G_END_DECLS #endif /* __GST_XIMAGEUTIL_H__ */ gst-plugins-good-0.10.31/sys/ximage/ximageutil.c0000644000175000017500000003454011677341661016425 00000000000000/* GStreamer * Copyright (C) <2005> Luca Ognibene * * 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 "ximageutil.h" #ifdef HAVE_XSHM static gboolean error_caught = FALSE; static int ximageutil_handle_xerror (Display * display, XErrorEvent * xevent) { char error_msg[1024]; XGetErrorText (display, xevent->error_code, error_msg, 1024); GST_DEBUG ("ximageutil failed to use XShm calls. error: %s", error_msg); error_caught = TRUE; return 0; } /* This function checks that it is actually really possible to create an image using XShm */ gboolean ximageutil_check_xshm_calls (GstXContext * xcontext) { XImage *ximage; XShmSegmentInfo SHMInfo; size_t size; int (*handler) (Display *, XErrorEvent *); gboolean result = FALSE; gboolean did_attach = FALSE; g_return_val_if_fail (xcontext != NULL, FALSE); /* Sync to ensure any older errors are already processed */ XSync (xcontext->disp, FALSE); /* Set defaults so we don't free these later unnecessarily */ SHMInfo.shmaddr = ((void *) -1); SHMInfo.shmid = -1; /* Setting an error handler to catch failure */ error_caught = FALSE; handler = XSetErrorHandler (ximageutil_handle_xerror); /* Trying to create a 1x1 ximage */ GST_DEBUG ("XShmCreateImage of 1x1"); ximage = XShmCreateImage (xcontext->disp, xcontext->visual, xcontext->depth, ZPixmap, NULL, &SHMInfo, 1, 1); /* Might cause an error, sync to ensure it is noticed */ XSync (xcontext->disp, FALSE); if (!ximage || error_caught) { GST_WARNING ("could not XShmCreateImage a 1x1 image"); goto beach; } size = ximage->height * ximage->bytes_per_line; SHMInfo.shmid = shmget (IPC_PRIVATE, size, IPC_CREAT | 0777); if (SHMInfo.shmid == -1) { GST_WARNING ("could not get shared memory of %" G_GSIZE_FORMAT " bytes", size); goto beach; } SHMInfo.shmaddr = shmat (SHMInfo.shmid, 0, 0); if (SHMInfo.shmaddr == ((void *) -1)) { GST_WARNING ("Failed to shmat: %s", g_strerror (errno)); goto beach; } /* Delete the SHM segment. It will actually go away automatically * when we detach now */ shmctl (SHMInfo.shmid, IPC_RMID, 0); ximage->data = SHMInfo.shmaddr; SHMInfo.readOnly = FALSE; if (XShmAttach (xcontext->disp, &SHMInfo) == 0) { GST_WARNING ("Failed to XShmAttach"); goto beach; } /* Sync to ensure we see any errors we caused */ XSync (xcontext->disp, FALSE); if (!error_caught) { did_attach = TRUE; /* store whether we succeeded in result */ result = TRUE; } beach: /* Sync to ensure we swallow any errors we caused and reset error_caught */ XSync (xcontext->disp, FALSE); error_caught = FALSE; XSetErrorHandler (handler); if (did_attach) { XShmDetach (xcontext->disp, &SHMInfo); XSync (xcontext->disp, FALSE); } if (SHMInfo.shmaddr != ((void *) -1)) shmdt (SHMInfo.shmaddr); if (ximage) XDestroyImage (ximage); return result; } #endif /* HAVE_XSHM */ /* This function gets the X Display and global info about it. Everything is stored in our object and will be cleaned when the object is disposed. Note here that caps for supported format are generated without any window or image creation */ GstXContext * ximageutil_xcontext_get (GstElement * parent, const gchar * display_name) { GstXContext *xcontext = NULL; XPixmapFormatValues *px_formats = NULL; gint nb_formats = 0, i; xcontext = g_new0 (GstXContext, 1); xcontext->disp = XOpenDisplay (display_name); GST_DEBUG_OBJECT (parent, "opened display %p", xcontext->disp); if (!xcontext->disp) { g_free (xcontext); return NULL; } xcontext->screen = DefaultScreenOfDisplay (xcontext->disp); xcontext->screen_num = DefaultScreen (xcontext->disp); xcontext->visual = DefaultVisual (xcontext->disp, xcontext->screen_num); xcontext->root = DefaultRootWindow (xcontext->disp); xcontext->white = XWhitePixel (xcontext->disp, xcontext->screen_num); xcontext->black = XBlackPixel (xcontext->disp, xcontext->screen_num); xcontext->depth = DefaultDepthOfScreen (xcontext->screen); xcontext->width = DisplayWidth (xcontext->disp, xcontext->screen_num); xcontext->height = DisplayHeight (xcontext->disp, xcontext->screen_num); xcontext->widthmm = DisplayWidthMM (xcontext->disp, xcontext->screen_num); xcontext->heightmm = DisplayHeightMM (xcontext->disp, xcontext->screen_num); xcontext->caps = NULL; GST_DEBUG_OBJECT (parent, "X reports %dx%d pixels and %d mm x %d mm", xcontext->width, xcontext->height, xcontext->widthmm, xcontext->heightmm); ximageutil_calculate_pixel_aspect_ratio (xcontext); /* We get supported pixmap formats at supported depth */ px_formats = XListPixmapFormats (xcontext->disp, &nb_formats); if (!px_formats) { XCloseDisplay (xcontext->disp); g_free (xcontext); return NULL; } /* We get bpp value corresponding to our running depth */ for (i = 0; i < nb_formats; i++) { if (px_formats[i].depth == xcontext->depth) xcontext->bpp = px_formats[i].bits_per_pixel; } XFree (px_formats); xcontext->endianness = (ImageByteOrder (xcontext->disp) == LSBFirst) ? G_LITTLE_ENDIAN : G_BIG_ENDIAN; #ifdef HAVE_XSHM /* Search for XShm extension support */ if (XShmQueryExtension (xcontext->disp) && ximageutil_check_xshm_calls (xcontext)) { xcontext->use_xshm = TRUE; GST_DEBUG ("ximageutil is using XShm extension"); } else { xcontext->use_xshm = FALSE; GST_DEBUG ("ximageutil is not using XShm extension"); } #endif /* HAVE_XSHM */ /* our caps system handles 24/32bpp RGB as big-endian. */ if ((xcontext->bpp == 24 || xcontext->bpp == 32) && xcontext->endianness == G_LITTLE_ENDIAN) { xcontext->endianness = G_BIG_ENDIAN; xcontext->r_mask_output = GUINT32_TO_BE (xcontext->visual->red_mask); xcontext->g_mask_output = GUINT32_TO_BE (xcontext->visual->green_mask); xcontext->b_mask_output = GUINT32_TO_BE (xcontext->visual->blue_mask); if (xcontext->bpp == 24) { xcontext->r_mask_output >>= 8; xcontext->g_mask_output >>= 8; xcontext->b_mask_output >>= 8; } } else { xcontext->r_mask_output = xcontext->visual->red_mask; xcontext->g_mask_output = xcontext->visual->green_mask; xcontext->b_mask_output = xcontext->visual->blue_mask; } return xcontext; } /* This function cleans the X context. Closing the Display and unrefing the caps for supported formats. */ void ximageutil_xcontext_clear (GstXContext * xcontext) { g_return_if_fail (xcontext != NULL); if (xcontext->caps != NULL) gst_caps_unref (xcontext->caps); if (xcontext->par) { g_value_unset (xcontext->par); g_free (xcontext->par); } XCloseDisplay (xcontext->disp); g_free (xcontext); } /* This function calculates the pixel aspect ratio based on the properties * in the xcontext structure and stores it there. */ void ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext) { gint par[][2] = { {1, 1}, /* regular screen */ {16, 15}, /* PAL TV */ {11, 10}, /* 525 line Rec.601 video */ {54, 59} /* 625 line Rec.601 video */ }; gint i; gint index; gdouble ratio; gdouble delta; #define DELTA(idx) (ABS (ratio - ((gdouble) par[idx][0] / par[idx][1]))) /* first calculate the "real" ratio based on the X values; * which is the "physical" w/h divided by the w/h in pixels of the display */ ratio = (gdouble) (xcontext->widthmm * xcontext->height) / (xcontext->heightmm * xcontext->width); /* DirectFB's X in 720x576 reports the physical dimensions wrong, so * override here */ if (xcontext->width == 720 && xcontext->height == 576) { ratio = 4.0 * 576 / (3.0 * 720); } GST_DEBUG ("calculated pixel aspect ratio: %f", ratio); /* now find the one from par[][2] with the lowest delta to the real one */ delta = DELTA (0); index = 0; for (i = 1; i < sizeof (par) / (sizeof (gint) * 2); ++i) { gdouble this_delta = DELTA (i); if (this_delta < delta) { index = i; delta = this_delta; } } GST_DEBUG ("Decided on index %d (%d/%d)", index, par[index][0], par[index][1]); if (xcontext->par) g_free (xcontext->par); xcontext->par = g_new0 (GValue, 1); g_value_init (xcontext->par, GST_TYPE_FRACTION); gst_value_set_fraction (xcontext->par, par[index][0], par[index][1]); GST_DEBUG ("set xcontext PAR to %d/%d\n", gst_value_get_fraction_numerator (xcontext->par), gst_value_get_fraction_denominator (xcontext->par)); } static GstBufferClass *ximagesrc_buffer_parent_class = NULL; static void gst_ximagesrc_buffer_finalize (GstXImageSrcBuffer * ximage) { GstElement *parent; g_return_if_fail (ximage != NULL); parent = ximage->parent; if (parent == NULL) { g_warning ("XImageSrcBuffer->ximagesrc == NULL"); goto beach; } if (ximage->return_func) ximage->return_func (parent, ximage); beach: GST_MINI_OBJECT_CLASS (ximagesrc_buffer_parent_class)->finalize (GST_MINI_OBJECT (ximage)); return; } void gst_ximage_buffer_free (GstXImageSrcBuffer * ximage) { /* make sure it is not recycled */ ximage->width = -1; ximage->height = -1; gst_buffer_unref (GST_BUFFER (ximage)); } static void gst_ximagesrc_buffer_init (GstXImageSrcBuffer * ximage_buffer, gpointer g_class) { #ifdef HAVE_XSHM ximage_buffer->SHMInfo.shmaddr = ((void *) -1); ximage_buffer->SHMInfo.shmid = -1; #endif } static void gst_ximagesrc_buffer_class_init (gpointer g_class, gpointer class_data) { GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); ximagesrc_buffer_parent_class = g_type_class_peek_parent (g_class); mini_object_class->finalize = (GstMiniObjectFinalizeFunction) gst_ximagesrc_buffer_finalize; } static GType gst_ximagesrc_buffer_get_type (void) { static GType _gst_ximagesrc_buffer_type; if (G_UNLIKELY (_gst_ximagesrc_buffer_type == 0)) { static const GTypeInfo ximagesrc_buffer_info = { sizeof (GstBufferClass), NULL, NULL, gst_ximagesrc_buffer_class_init, NULL, NULL, sizeof (GstXImageSrcBuffer), 0, (GInstanceInitFunc) gst_ximagesrc_buffer_init, NULL }; _gst_ximagesrc_buffer_type = g_type_register_static (GST_TYPE_BUFFER, "GstXImageSrcBuffer", &ximagesrc_buffer_info, 0); } return _gst_ximagesrc_buffer_type; } /* This function handles GstXImageSrcBuffer creation depending on XShm availability */ GstXImageSrcBuffer * gst_ximageutil_ximage_new (GstXContext * xcontext, GstElement * parent, int width, int height, BufferReturnFunc return_func) { GstXImageSrcBuffer *ximage = NULL; gboolean succeeded = FALSE; ximage = (GstXImageSrcBuffer *) gst_mini_object_new (GST_TYPE_XIMAGESRC_BUFFER); ximage->width = width; ximage->height = height; #ifdef HAVE_XSHM if (xcontext->use_xshm) { ximage->ximage = XShmCreateImage (xcontext->disp, xcontext->visual, xcontext->depth, ZPixmap, NULL, &ximage->SHMInfo, ximage->width, ximage->height); if (!ximage->ximage) { GST_WARNING_OBJECT (parent, "could not XShmCreateImage a %dx%d image", ximage->width, ximage->height); /* Retry without XShm */ xcontext->use_xshm = FALSE; goto no_xshm; } /* we have to use the returned bytes_per_line for our shm size */ ximage->size = ximage->ximage->bytes_per_line * ximage->ximage->height; ximage->SHMInfo.shmid = shmget (IPC_PRIVATE, ximage->size, IPC_CREAT | 0777); if (ximage->SHMInfo.shmid == -1) goto beach; ximage->SHMInfo.shmaddr = shmat (ximage->SHMInfo.shmid, 0, 0); if (ximage->SHMInfo.shmaddr == ((void *) -1)) goto beach; /* Delete the SHM segment. It will actually go away automatically * when we detach now */ shmctl (ximage->SHMInfo.shmid, IPC_RMID, 0); ximage->ximage->data = ximage->SHMInfo.shmaddr; ximage->SHMInfo.readOnly = FALSE; if (XShmAttach (xcontext->disp, &ximage->SHMInfo) == 0) goto beach; XSync (xcontext->disp, FALSE); } else no_xshm: #endif /* HAVE_XSHM */ { ximage->ximage = XCreateImage (xcontext->disp, xcontext->visual, xcontext->depth, ZPixmap, 0, NULL, ximage->width, ximage->height, xcontext->bpp, 0); if (!ximage->ximage) goto beach; /* we have to use the returned bytes_per_line for our image size */ ximage->size = ximage->ximage->bytes_per_line * ximage->ximage->height; ximage->ximage->data = g_malloc (ximage->size); XSync (xcontext->disp, FALSE); } succeeded = TRUE; GST_BUFFER_DATA (ximage) = (guchar *) ximage->ximage->data; GST_BUFFER_SIZE (ximage) = ximage->size; /* Keep a ref to our src */ ximage->parent = gst_object_ref (parent); ximage->return_func = return_func; beach: if (!succeeded) { gst_ximage_buffer_free (ximage); ximage = NULL; } return ximage; } /* This function destroys a GstXImageBuffer handling XShm availability */ void gst_ximageutil_ximage_destroy (GstXContext * xcontext, GstXImageSrcBuffer * ximage) { /* We might have some buffers destroyed after changing state to NULL */ if (!xcontext) goto beach; g_return_if_fail (ximage != NULL); #ifdef HAVE_XSHM if (xcontext->use_xshm) { if (ximage->SHMInfo.shmaddr != ((void *) -1)) { XShmDetach (xcontext->disp, &ximage->SHMInfo); XSync (xcontext->disp, 0); shmdt (ximage->SHMInfo.shmaddr); } if (ximage->ximage) XDestroyImage (ximage->ximage); } else #endif /* HAVE_XSHM */ { if (ximage->ximage) { XDestroyImage (ximage->ximage); } } XSync (xcontext->disp, FALSE); beach: if (ximage->parent) { /* Release the ref to our parent */ gst_object_unref (ximage->parent); ximage->parent = NULL; } return; } gst-plugins-good-0.10.31/sys/ximage/gstximagesrc.h0000644000175000017500000000543411677341661016762 00000000000000/* screenshotsrc: Screenshot plugin for GStreamer * * 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_XIMAGE_SRC_H__ #define __GST_XIMAGE_SRC_H__ #include #include #include "ximageutil.h" #ifdef HAVE_XFIXES #include #endif #ifdef HAVE_XDAMAGE #include #endif G_BEGIN_DECLS #define GST_TYPE_XIMAGE_SRC (gst_ximage_src_get_type()) #define GST_XIMAGE_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_XIMAGE_SRC,GstXImageSrc)) #define GST_XIMAGE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_XIMAGE_SRC,GstXImageSrc)) #define GST_IS_XIMAGE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_XIMAGE_SRC)) #define GST_IS_XIMAGE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_XIMAGE_SRC)) typedef struct _GstXImageSrc GstXImageSrc; typedef struct _GstXImageSrcClass GstXImageSrcClass; GType gst_ximage_src_get_type (void) G_GNUC_CONST; struct _GstXImageSrc { GstPushSrc parent; /* Information on display */ GstXContext *xcontext; gint width; gint height; Window xwindow; gchar *display_name; guint screen_num; /* Window selection */ guint64 xid; gchar *xname; /* Desired output framerate */ gint fps_n; gint fps_d; /* for framerate sync */ GstClockID clock_id; gint64 last_frame_no; /* Protect X Windows calls */ GMutex *x_lock; /* Gathered pool of emitted buffers */ GMutex *pool_lock; GSList *buffer_pool; /* XFixes and XDamage support */ gboolean have_xfixes; gboolean have_xdamage; gboolean show_pointer; gboolean use_damage; /* co-ordinates for start and end */ guint startx; guint starty; guint endx; guint endy; /* whether to use remote friendly calls */ gboolean remote; #ifdef HAVE_XFIXES int fixes_event_base; XFixesCursorImage *cursor_image; #endif #ifdef HAVE_XDAMAGE Damage damage; int damage_event_base; XserverRegion damage_region; GC damage_copy_gc; GstXImageSrcBuffer *last_ximage; #endif }; struct _GstXImageSrcClass { GstPushSrcClass parent_class; }; G_END_DECLS #endif /* __GST_XIMAGE_SRC_H__ */ gst-plugins-good-0.10.31/sys/ximage/gstximagesrc.c0000644000175000017500000012172311677341661016755 00000000000000/* GStreamer * * Copyright (C) 2006 Zaheer Merali * * 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-ximagesrc * * This element captures your X Display and creates raw RGB video. It uses * the XDamage extension if available to only capture areas of the screen that * have changed since the last frame. It uses the XFixes extension if * available to also capture your mouse pointer. By default it will fixate to * 25 frames per second. * * * Example pipelines * |[ * gst-launch ximagesrc ! video/x-raw-rgb,framerate=5/1 ! ffmpegcolorspace ! theoraenc ! oggmux ! filesink location=desktop.ogg * ]| Encodes your X display to an Ogg theora video at 5 frames per second. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstximagesrc.h" #include #include #include #include #include #include #include "gst/glib-compat-private.h" GST_DEBUG_CATEGORY_STATIC (gst_debug_ximage_src); #define GST_CAT_DEFAULT gst_debug_ximage_src static GstStaticPadTemplate t = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-rgb, " "framerate = (fraction) [ 0, MAX ], " "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ], " "pixel-aspect-ratio = (fraction) [ 0, MAX ]")); enum { PROP_0, PROP_DISPLAY_NAME, PROP_SCREEN_NUM, PROP_SHOW_POINTER, PROP_USE_DAMAGE, PROP_STARTX, PROP_STARTY, PROP_ENDX, PROP_ENDY, PROP_REMOTE, PROP_XID, PROP_XNAME, }; GST_BOILERPLATE (GstXImageSrc, gst_ximage_src, GstPushSrc, GST_TYPE_PUSH_SRC); static void gst_ximage_src_fixate (GstPad * pad, GstCaps * caps); static void gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc); /* Called when a buffer is returned from the pipeline */ static void gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, GstXImageSrcBuffer * ximage) { /* If our geometry changed we can't reuse that image. */ if ((ximage->width != ximagesrc->width) || (ximage->height != ximagesrc->height)) { GST_DEBUG_OBJECT (ximagesrc, "destroy image %p as its size changed %dx%d vs current %dx%d", ximage, ximage->width, ximage->height, ximagesrc->width, ximagesrc->height); g_mutex_lock (ximagesrc->x_lock); gst_ximageutil_ximage_destroy (ximagesrc->xcontext, ximage); g_mutex_unlock (ximagesrc->x_lock); } else { /* In that case we can reuse the image and add it to our image pool. */ GST_LOG_OBJECT (ximagesrc, "recycling image %p in pool", ximage); /* need to increment the refcount again to recycle */ gst_buffer_ref (GST_BUFFER (ximage)); g_mutex_lock (ximagesrc->pool_lock); GST_BUFFER_FLAGS (GST_BUFFER (ximage)) = 0; /* clear out any flags from the previous use */ ximagesrc->buffer_pool = g_slist_prepend (ximagesrc->buffer_pool, ximage); g_mutex_unlock (ximagesrc->pool_lock); } } static Window gst_ximage_src_find_window (GstXImageSrc * src, Window root, const char *name) { Window *children; Window window = 0, root_return, parent_return; unsigned int nchildren; char *tmpname; int n, status; status = XFetchName (src->xcontext->disp, root, &tmpname); if (status && !strcmp (name, tmpname)) return root; status = XQueryTree (src->xcontext->disp, root, &root_return, &parent_return, &children, &nchildren); if (!status || !children) return (Window) 0; for (n = 0; n < nchildren; ++n) { window = gst_ximage_src_find_window (src, children[n], name); if (window != 0) break; } XFree (children); return window; } static gboolean gst_ximage_src_open_display (GstXImageSrc * s, const gchar * name) { g_return_val_if_fail (GST_IS_XIMAGE_SRC (s), FALSE); if (s->xcontext != NULL) return TRUE; g_mutex_lock (s->x_lock); s->xcontext = ximageutil_xcontext_get (GST_ELEMENT (s), name); if (s->xcontext == NULL) { g_mutex_unlock (s->x_lock); GST_ELEMENT_ERROR (s, RESOURCE, OPEN_READ, ("Could not open X display for reading"), ("NULL returned from getting xcontext")); return FALSE; } s->width = s->xcontext->width; s->height = s->xcontext->height; s->xwindow = s->xcontext->root; if (s->xid != 0 || s->xname) { int status; XWindowAttributes attrs; Window window; if (s->xid != 0) { status = XGetWindowAttributes (s->xcontext->disp, s->xid, &attrs); if (status) { GST_DEBUG_OBJECT (s, "Found window XID %" G_GUINT64_FORMAT, s->xid); s->xwindow = s->xid; goto window_found; } else { GST_WARNING_OBJECT (s, "Failed to get window %" G_GUINT64_FORMAT " attributes", s->xid); } } if (s->xname) { GST_DEBUG_OBJECT (s, "Looking for window %s", s->xname); window = gst_ximage_src_find_window (s, s->xcontext->root, s->xname); if (window != 0) { GST_DEBUG_OBJECT (s, "Found window named %s, ", s->xname); status = XGetWindowAttributes (s->xcontext->disp, window, &attrs); if (status) { s->xwindow = window; goto window_found; } else { GST_WARNING_OBJECT (s, "Failed to get window attributes for " "window named %s", s->xname); } } } GST_INFO_OBJECT (s, "Using root window"); goto use_root_window; window_found: g_assert (s->xwindow != 0); s->width = attrs.width; s->height = attrs.height; GST_INFO_OBJECT (s, "Using default window size of %dx%d", s->width, s->height); } use_root_window: #ifdef HAVE_XFIXES /* check if xfixes supported */ { int error_base; if (XFixesQueryExtension (s->xcontext->disp, &s->fixes_event_base, &error_base)) { s->have_xfixes = TRUE; GST_DEBUG_OBJECT (s, "X Server supports XFixes"); } else { GST_DEBUG_OBJECT (s, "X Server does not support XFixes"); } } #ifdef HAVE_XDAMAGE /* check if xdamage is supported */ { int error_base; long evmask = NoEventMask; s->have_xdamage = FALSE; s->damage = None; s->damage_copy_gc = None; s->damage_region = None; if (XDamageQueryExtension (s->xcontext->disp, &s->damage_event_base, &error_base)) { s->damage = XDamageCreate (s->xcontext->disp, s->xwindow, XDamageReportNonEmpty); if (s->damage != None) { s->damage_region = XFixesCreateRegion (s->xcontext->disp, NULL, 0); if (s->damage_region != None) { XGCValues values; GST_DEBUG_OBJECT (s, "Using XDamage extension"); values.subwindow_mode = IncludeInferiors; s->damage_copy_gc = XCreateGC (s->xcontext->disp, s->xwindow, GCSubwindowMode, &values); XSelectInput (s->xcontext->disp, s->xwindow, evmask); s->have_xdamage = TRUE; } else { XDamageDestroy (s->xcontext->disp, s->damage); s->damage = None; } } else GST_DEBUG_OBJECT (s, "Could not attach to XDamage"); } else { GST_DEBUG_OBJECT (s, "X Server does not have XDamage extension"); } } #endif #endif g_mutex_unlock (s->x_lock); if (s->xcontext == NULL) return FALSE; return TRUE; } static gboolean gst_ximage_src_start (GstBaseSrc * basesrc) { GstXImageSrc *s = GST_XIMAGE_SRC (basesrc); s->last_frame_no = -1; #ifdef HAVE_XDAMAGE if (s->last_ximage) gst_buffer_unref (GST_BUFFER_CAST (s->last_ximage)); s->last_ximage = NULL; #endif return gst_ximage_src_open_display (s, s->display_name); } static gboolean gst_ximage_src_stop (GstBaseSrc * basesrc) { GstXImageSrc *src = GST_XIMAGE_SRC (basesrc); #ifdef HAVE_XDAMAGE if (src->last_ximage) gst_buffer_unref (GST_BUFFER_CAST (src->last_ximage)); src->last_ximage = NULL; #endif gst_ximage_src_clear_bufpool (src); #ifdef HAVE_XFIXES if (src->cursor_image) XFree (src->cursor_image); src->cursor_image = NULL; #endif if (src->xcontext) { g_mutex_lock (src->x_lock); #ifdef HAVE_XDAMAGE if (src->damage_copy_gc != None) { XFreeGC (src->xcontext->disp, src->damage_copy_gc); src->damage_copy_gc = None; } if (src->damage_region != None) { XFixesDestroyRegion (src->xcontext->disp, src->damage_region); src->damage_region = None; } if (src->damage != None) { XDamageDestroy (src->xcontext->disp, src->damage); src->damage = None; } #endif ximageutil_xcontext_clear (src->xcontext); src->xcontext = NULL; g_mutex_unlock (src->x_lock); } return TRUE; } static gboolean gst_ximage_src_unlock (GstBaseSrc * basesrc) { GstXImageSrc *src = GST_XIMAGE_SRC (basesrc); /* Awaken the create() func if it's waiting on the clock */ GST_OBJECT_LOCK (src); if (src->clock_id) { GST_DEBUG_OBJECT (src, "Waking up waiting clock"); gst_clock_id_unschedule (src->clock_id); } GST_OBJECT_UNLOCK (src); return TRUE; } static gboolean gst_ximage_src_recalc (GstXImageSrc * src) { if (!src->xcontext) return FALSE; /* Maybe later we can check the display hasn't changed size */ /* We could use XQueryPointer to get only the current window. */ return TRUE; } #ifdef HAVE_XFIXES static void composite_pixel (GstXContext * xcontext, guchar * dest, guchar * src) { guint8 r = src[2]; guint8 g = src[1]; guint8 b = src[0]; guint8 a = src[3]; guint8 dr, dg, db; guint32 color; gint r_shift, r_max, r_shift_out; gint g_shift, g_max, g_shift_out; gint b_shift, b_max, b_shift_out; switch (xcontext->bpp) { case 8: color = *dest; break; case 16: color = GUINT16_FROM_LE (*(guint16 *) (dest)); break; case 32: color = GUINT32_FROM_LE (*(guint32 *) (dest)); break; default: /* Should not reach here */ g_return_if_reached (); } /* possible optimisation: * move the code that finds shift and max in the _link function */ for (r_shift = 0; !(xcontext->visual->red_mask & (1 << r_shift)); r_shift++); for (g_shift = 0; !(xcontext->visual->green_mask & (1 << g_shift)); g_shift++); for (b_shift = 0; !(xcontext->visual->blue_mask & (1 << b_shift)); b_shift++); for (r_shift_out = 0; !(xcontext->visual->red_mask & (1 << r_shift_out)); r_shift_out++); for (g_shift_out = 0; !(xcontext->visual->green_mask & (1 << g_shift_out)); g_shift_out++); for (b_shift_out = 0; !(xcontext->visual->blue_mask & (1 << b_shift_out)); b_shift_out++); r_max = (xcontext->visual->red_mask >> r_shift); b_max = (xcontext->visual->blue_mask >> b_shift); g_max = (xcontext->visual->green_mask >> g_shift); #define RGBXXX_R(x) (((x)>>r_shift) & (r_max)) #define RGBXXX_G(x) (((x)>>g_shift) & (g_max)) #define RGBXXX_B(x) (((x)>>b_shift) & (b_max)) dr = (RGBXXX_R (color) * 255) / r_max; dg = (RGBXXX_G (color) * 255) / g_max; db = (RGBXXX_B (color) * 255) / b_max; dr = (r * a + (0xff - a) * dr) / 0xff; dg = (g * a + (0xff - a) * dg) / 0xff; db = (b * a + (0xff - a) * db) / 0xff; color = (((dr * r_max) / 255) << r_shift_out) + (((dg * g_max) / 255) << g_shift_out) + (((db * b_max) / 255) << b_shift_out); switch (xcontext->bpp) { case 8: *dest = color; break; case 16: *(guint16 *) (dest) = color; break; case 32: *(guint32 *) (dest) = color; break; default: g_warning ("bpp %d not supported\n", xcontext->bpp); } } #endif /* Retrieve an XImageSrcBuffer, preferably from our * pool of existing images and populate it from the window */ static GstXImageSrcBuffer * gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) { GstXImageSrcBuffer *ximage = NULL; g_mutex_lock (ximagesrc->pool_lock); while (ximagesrc->buffer_pool != NULL) { ximage = ximagesrc->buffer_pool->data; if ((ximage->width != ximagesrc->width) || (ximage->height != ximagesrc->height)) { gst_ximage_buffer_free (ximage); } ximagesrc->buffer_pool = g_slist_delete_link (ximagesrc->buffer_pool, ximagesrc->buffer_pool); } g_mutex_unlock (ximagesrc->pool_lock); if (ximage == NULL) { GstXContext *xcontext; GstCaps *caps = NULL; GST_DEBUG_OBJECT (ximagesrc, "creating image (%dx%d)", ximagesrc->width, ximagesrc->height); g_mutex_lock (ximagesrc->x_lock); ximage = gst_ximageutil_ximage_new (ximagesrc->xcontext, GST_ELEMENT (ximagesrc), ximagesrc->width, ximagesrc->height, (BufferReturnFunc) (gst_ximage_src_return_buf)); if (ximage == NULL) { GST_ELEMENT_ERROR (ximagesrc, RESOURCE, WRITE, (NULL), ("could not create a %dx%d ximage", ximagesrc->width, ximagesrc->height)); g_mutex_unlock (ximagesrc->x_lock); return NULL; } xcontext = ximagesrc->xcontext; caps = gst_caps_new_simple ("video/x-raw-rgb", "bpp", G_TYPE_INT, xcontext->bpp, "depth", G_TYPE_INT, xcontext->depth, "endianness", G_TYPE_INT, xcontext->endianness, "red_mask", G_TYPE_INT, xcontext->r_mask_output, "green_mask", G_TYPE_INT, xcontext->g_mask_output, "blue_mask", G_TYPE_INT, xcontext->b_mask_output, "width", G_TYPE_INT, ximagesrc->width, "height", G_TYPE_INT, ximagesrc->height, "framerate", GST_TYPE_FRACTION, ximagesrc->fps_n, ximagesrc->fps_d, "pixel-aspect-ratio", GST_TYPE_FRACTION, gst_value_get_fraction_numerator (xcontext->par), gst_value_get_fraction_denominator (xcontext->par), NULL); gst_buffer_set_caps (GST_BUFFER (ximage), caps); g_mutex_unlock (ximagesrc->x_lock); gst_caps_unref (caps); } g_return_val_if_fail (GST_IS_XIMAGE_SRC (ximagesrc), NULL); #ifdef HAVE_XDAMAGE if (ximagesrc->have_xdamage && ximagesrc->use_damage && ximagesrc->last_ximage != NULL) { XEvent ev; /* have_frame is TRUE when either the entire screen has been * grabbed or when the last image has been copied */ gboolean have_frame = FALSE; GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XDamage"); do { XNextEvent (ximagesrc->xcontext->disp, &ev); if (ev.type == ximagesrc->damage_event_base + XDamageNotify) { XserverRegion parts; XRectangle *rects; int nrects; parts = XFixesCreateRegion (ximagesrc->xcontext->disp, 0, 0); XDamageSubtract (ximagesrc->xcontext->disp, ximagesrc->damage, None, parts); /* Now copy out all of the damaged rectangles. */ rects = XFixesFetchRegion (ximagesrc->xcontext->disp, parts, &nrects); if (rects != NULL) { int i; if (!have_frame) { GST_LOG_OBJECT (ximagesrc, "Copying from last frame ximage->size: %d", GST_BUFFER_SIZE (GST_BUFFER (ximage))); memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), GST_BUFFER_SIZE (GST_BUFFER (ximage))); have_frame = TRUE; } for (i = 0; i < nrects; i++) { GST_LOG_OBJECT (ximagesrc, "Damaged sub-region @ %d,%d size %dx%d reported", rects[i].x, rects[i].y, rects[i].width, rects[i].height); /* if we only want a small area, clip this damage region to * area we want */ if (ximagesrc->endx > ximagesrc->startx && ximagesrc->endy > ximagesrc->starty) { /* see if damage area intersects */ if (rects[i].x + rects[i].width - 1 < ximagesrc->startx || rects[i].x > ximagesrc->endx) { /* trivial reject */ } else if (rects[i].y + rects[i].height - 1 < ximagesrc->starty || rects[i].y > ximagesrc->endy) { /* trivial reject */ } else { /* find intersect region */ int startx, starty, width, height; startx = (rects[i].x < ximagesrc->startx) ? ximagesrc->startx : rects[i].x; starty = (rects[i].y < ximagesrc->starty) ? ximagesrc->starty : rects[i].y; width = (rects[i].x + rects[i].width - 1 < ximagesrc->endx) ? rects[i].x + rects[i].width - startx : ximagesrc->endx - startx + 1; height = (rects[i].y + rects[i].height - 1 < ximagesrc->endy) ? rects[i].y + rects[i].height - starty : ximagesrc->endy - starty + 1; GST_LOG_OBJECT (ximagesrc, "Retrieving damaged sub-region @ %d,%d size %dx%d as intersect region", startx, starty, width, height); XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, startx, starty, width, height, AllPlanes, ZPixmap, ximage->ximage, startx - ximagesrc->startx, starty - ximagesrc->starty); } } else { GST_LOG_OBJECT (ximagesrc, "Retrieving damaged sub-region @ %d,%d size %dx%d", rects[i].x, rects[i].y, rects[i].width, rects[i].height); XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, rects[i].x, rects[i].y, rects[i].width, rects[i].height, AllPlanes, ZPixmap, ximage->ximage, rects[i].x, rects[i].y); } } free (rects); } } } while (XPending (ximagesrc->xcontext->disp)); if (!have_frame) { GST_LOG_OBJECT (ximagesrc, "Copying from last frame ximage->size: %d", GST_BUFFER_SIZE (GST_BUFFER (ximage))); memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), GST_BUFFER_SIZE (GST_BUFFER (ximage))); } #ifdef HAVE_XFIXES /* re-get area where last mouse pointer was but only if in our clipping * bounds */ if (ximagesrc->cursor_image) { gint x, y, width, height; x = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot; y = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot; width = ximagesrc->cursor_image->width; height = ximagesrc->cursor_image->height; /* bounds checking */ if (x < 0) x = 0; if (y < 0) y = 0; if (x + width > ximagesrc->xcontext->width) width = ximagesrc->xcontext->width - x; if (y + height > ximagesrc->xcontext->height) height = ximagesrc->xcontext->height - y; g_assert (x >= 0); g_assert (y >= 0); GST_DEBUG_OBJECT (ximagesrc, "Cursor was at (%d,%d) width: %d, height: %d and our range is: (%d,%d) - (%d,%d)", x, y, width, height, ximagesrc->startx, ximagesrc->starty, ximagesrc->endx, ximagesrc->endy); /* only get where cursor last was, if it is in our range */ if (ximagesrc->endx > ximagesrc->startx && ximagesrc->endy > ximagesrc->starty) { /* check bounds */ if (x + width < ximagesrc->startx || x > ximagesrc->endx) { /* trivial reject */ } else if (y + height < ximagesrc->starty || y > ximagesrc->endy) { /* trivial reject */ } else { /* find intersect region */ int startx, starty, iwidth, iheight; startx = (x < ximagesrc->startx) ? ximagesrc->startx : x; starty = (y < ximagesrc->starty) ? ximagesrc->starty : y; iwidth = (x + width < ximagesrc->endx) ? x + width - startx : ximagesrc->endx - startx; iheight = (y + height < ximagesrc->endy) ? y + height - starty : ximagesrc->endy - starty; GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y); XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, startx, starty, iwidth, iheight, AllPlanes, ZPixmap, ximage->ximage, startx - ximagesrc->startx, starty - ximagesrc->starty); } } else { GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y); XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, x, y, width, height, AllPlanes, ZPixmap, ximage->ximage, x, y); } } #endif } else { #endif #ifdef HAVE_XSHM if (ximagesrc->xcontext->use_xshm) { GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XShm"); XShmGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, ximage->ximage, ximagesrc->startx, ximagesrc->starty, AllPlanes); } else #endif /* HAVE_XSHM */ { GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XGetImage"); if (ximagesrc->remote) { XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, ximagesrc->startx, ximagesrc->starty, ximagesrc->width, ximagesrc->height, AllPlanes, ZPixmap, ximage->ximage, 0, 0); } else { ximage->ximage = XGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow, ximagesrc->startx, ximagesrc->starty, ximagesrc->width, ximagesrc->height, AllPlanes, ZPixmap); } } #ifdef HAVE_XDAMAGE } #endif #ifdef HAVE_XFIXES if (ximagesrc->show_pointer && ximagesrc->have_xfixes) { GST_DEBUG_OBJECT (ximagesrc, "Using XFixes to draw cursor"); /* get cursor */ if (ximagesrc->cursor_image) XFree (ximagesrc->cursor_image); ximagesrc->cursor_image = XFixesGetCursorImage (ximagesrc->xcontext->disp); if (ximagesrc->cursor_image != NULL) { int cx, cy, i, j, count; int startx, starty, iwidth, iheight; gboolean cursor_in_image = TRUE; cx = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot; if (cx < 0) cx = 0; cy = ximagesrc->cursor_image->y - ximagesrc->cursor_image->yhot; if (cy < 0) cy = 0; count = ximagesrc->cursor_image->width * ximagesrc->cursor_image->height; /* only get where cursor last was, if it is in our range */ if (ximagesrc->endx > ximagesrc->startx && ximagesrc->endy > ximagesrc->starty) { /* check bounds */ if (cx + ximagesrc->cursor_image->width < ximagesrc->startx || cx > ximagesrc->endx) { /* trivial reject */ cursor_in_image = FALSE; } else if (cy + ximagesrc->cursor_image->height < ximagesrc->starty || cy > ximagesrc->endy) { /* trivial reject */ cursor_in_image = FALSE; } else { /* find intersect region */ startx = (cx < ximagesrc->startx) ? ximagesrc->startx : cx; starty = (cy < ximagesrc->starty) ? ximagesrc->starty : cy; iwidth = (cx + ximagesrc->cursor_image->width < ximagesrc->endx) ? cx + ximagesrc->cursor_image->width - startx : ximagesrc->endx - startx; iheight = (cy + ximagesrc->cursor_image->height < ximagesrc->endy) ? cy + ximagesrc->cursor_image->height - starty : ximagesrc->endy - starty; } } else { startx = cx; starty = cy; iwidth = ximagesrc->cursor_image->width; iheight = ximagesrc->cursor_image->height; } if (cursor_in_image) { GST_DEBUG_OBJECT (ximagesrc, "Cursor is in image so trying to draw it"); for (i = 0; i < count; i++) ximagesrc->cursor_image->pixels[i] = GUINT_TO_LE (ximagesrc->cursor_image->pixels[i]); /* copy those pixels across */ for (j = starty; j < starty + iheight && j < ximagesrc->starty + ximagesrc->height; j++) { for (i = startx; i < startx + iwidth && i < ximagesrc->startx + ximagesrc->width; i++) { guint8 *src, *dest; src = (guint8 *) & (ximagesrc->cursor_image->pixels[((j - cy) * ximagesrc->cursor_image->width + (i - cx))]); dest = (guint8 *) & (ximage->ximage->data[((j - ximagesrc->starty) * ximagesrc->width + (i - ximagesrc->startx)) * (ximagesrc->xcontext->bpp / 8)]); composite_pixel (ximagesrc->xcontext, (guint8 *) dest, (guint8 *) src); } } } } } #endif #ifdef HAVE_XDAMAGE if (ximagesrc->have_xdamage && ximagesrc->use_damage) { /* need to ref ximage to put in last_ximage */ gst_buffer_ref (GST_BUFFER (ximage)); if (ximagesrc->last_ximage) { gst_buffer_unref (GST_BUFFER (ximagesrc->last_ximage)); } ximagesrc->last_ximage = ximage; GST_LOG_OBJECT (ximagesrc, "reffing current buffer for last_ximage"); } #endif return ximage; } static GstFlowReturn gst_ximage_src_create (GstPushSrc * bs, GstBuffer ** buf) { GstXImageSrc *s = GST_XIMAGE_SRC (bs); GstXImageSrcBuffer *image; GstClockTime base_time; GstClockTime next_capture_ts; GstClockTime dur; gint64 next_frame_no; if (!gst_ximage_src_recalc (s)) { GST_ELEMENT_ERROR (s, RESOURCE, FAILED, (_("Changing resolution at runtime is not yet supported.")), (NULL)); return GST_FLOW_ERROR; } if (s->fps_n <= 0 || s->fps_d <= 0) return GST_FLOW_NOT_NEGOTIATED; /* FPS must be > 0 */ /* Now, we might need to wait for the next multiple of the fps * before capturing */ GST_OBJECT_LOCK (s); if (GST_ELEMENT_CLOCK (s) == NULL) { GST_OBJECT_UNLOCK (s); GST_ELEMENT_ERROR (s, RESOURCE, FAILED, (_("Cannot operate without a clock")), (NULL)); return GST_FLOW_ERROR; } base_time = GST_ELEMENT_CAST (s)->base_time; next_capture_ts = gst_clock_get_time (GST_ELEMENT_CLOCK (s)); next_capture_ts -= base_time; /* Figure out which 'frame number' position we're at, based on the cur time * and frame rate */ next_frame_no = gst_util_uint64_scale (next_capture_ts, s->fps_n, GST_SECOND * s->fps_d); if (next_frame_no == s->last_frame_no) { GstClockID id; GstClockReturn ret; /* Need to wait for the next frame */ next_frame_no += 1; /* Figure out what the next frame time is */ next_capture_ts = gst_util_uint64_scale (next_frame_no, s->fps_d * GST_SECOND, s->fps_n); id = gst_clock_new_single_shot_id (GST_ELEMENT_CLOCK (s), next_capture_ts + base_time); s->clock_id = id; /* release the object lock while waiting */ GST_OBJECT_UNLOCK (s); GST_DEBUG_OBJECT (s, "Waiting for next frame time %" G_GUINT64_FORMAT, next_capture_ts); ret = gst_clock_id_wait (id, NULL); GST_OBJECT_LOCK (s); gst_clock_id_unref (id); s->clock_id = NULL; if (ret == GST_CLOCK_UNSCHEDULED) { /* Got woken up by the unlock function */ GST_OBJECT_UNLOCK (s); return GST_FLOW_WRONG_STATE; } /* Duration is a complete 1/fps frame duration */ dur = gst_util_uint64_scale_int (GST_SECOND, s->fps_d, s->fps_n); } else { GstClockTime next_frame_ts; GST_DEBUG_OBJECT (s, "No need to wait for next frame time %" G_GUINT64_FORMAT " next frame = %" G_GINT64_FORMAT " prev = %" G_GINT64_FORMAT, next_capture_ts, next_frame_no, s->last_frame_no); next_frame_ts = gst_util_uint64_scale (next_frame_no + 1, s->fps_d * GST_SECOND, s->fps_n); /* Frame duration is from now until the next expected capture time */ dur = next_frame_ts - next_capture_ts; } s->last_frame_no = next_frame_no; GST_OBJECT_UNLOCK (s); image = gst_ximage_src_ximage_get (s); if (!image) return GST_FLOW_ERROR; *buf = GST_BUFFER (image); GST_BUFFER_TIMESTAMP (*buf) = next_capture_ts; GST_BUFFER_DURATION (*buf) = dur; return GST_FLOW_OK; } static void gst_ximage_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstXImageSrc *src = GST_XIMAGE_SRC (object); switch (prop_id) { case PROP_DISPLAY_NAME: g_free (src->display_name); src->display_name = g_strdup (g_value_get_string (value)); break; case PROP_SCREEN_NUM: src->screen_num = g_value_get_uint (value); break; case PROP_SHOW_POINTER: src->show_pointer = g_value_get_boolean (value); break; case PROP_USE_DAMAGE: src->use_damage = g_value_get_boolean (value); break; case PROP_STARTX: src->startx = g_value_get_uint (value); break; case PROP_STARTY: src->starty = g_value_get_uint (value); break; case PROP_ENDX: src->endx = g_value_get_uint (value); break; case PROP_ENDY: src->endy = g_value_get_uint (value); break; case PROP_REMOTE: src->remote = g_value_get_boolean (value); break; case PROP_XID: if (src->xcontext != NULL) { g_warning ("ximagesrc window ID must be set before opening display"); break; } src->xid = g_value_get_uint64 (value); break; case PROP_XNAME: if (src->xcontext != NULL) { g_warning ("ximagesrc window name must be set before opening display"); break; } g_free (src->xname); src->xname = g_strdup (g_value_get_string (value)); break; default: break; } } static void gst_ximage_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstXImageSrc *src = GST_XIMAGE_SRC (object); switch (prop_id) { case PROP_DISPLAY_NAME: if (src->xcontext) g_value_set_string (value, DisplayString (src->xcontext->disp)); else g_value_set_string (value, src->display_name); break; case PROP_SCREEN_NUM: g_value_set_uint (value, src->screen_num); break; case PROP_SHOW_POINTER: g_value_set_boolean (value, src->show_pointer); break; case PROP_USE_DAMAGE: g_value_set_boolean (value, src->use_damage); break; case PROP_STARTX: g_value_set_uint (value, src->startx); break; case PROP_STARTY: g_value_set_uint (value, src->starty); break; case PROP_ENDX: g_value_set_uint (value, src->endx); break; case PROP_ENDY: g_value_set_uint (value, src->endy); break; case PROP_REMOTE: g_value_set_boolean (value, src->remote); break; case PROP_XID: g_value_set_uint64 (value, src->xid); break; case PROP_XNAME: g_value_set_string (value, src->xname); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc) { g_mutex_lock (ximagesrc->pool_lock); while (ximagesrc->buffer_pool != NULL) { GstXImageSrcBuffer *ximage = ximagesrc->buffer_pool->data; gst_ximage_buffer_free (ximage); ximagesrc->buffer_pool = g_slist_delete_link (ximagesrc->buffer_pool, ximagesrc->buffer_pool); } g_mutex_unlock (ximagesrc->pool_lock); } static void gst_ximage_src_base_init (gpointer g_class) { GstElementClass *ec = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (ec, "Ximage video source", "Source/Video", "Creates a screenshot video stream", "Lutz Mueller , " "Jan Schmidt , " "Zaheer Merali "); gst_element_class_add_static_pad_template (ec, &t); } static void gst_ximage_src_dispose (GObject * object) { /* Drop references in the buffer_pool */ gst_ximage_src_clear_bufpool (GST_XIMAGE_SRC (object)); G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_ximage_src_finalize (GObject * object) { GstXImageSrc *src = GST_XIMAGE_SRC (object); if (src->xcontext) ximageutil_xcontext_clear (src->xcontext); g_free (src->xname); g_mutex_free (src->pool_lock); g_mutex_free (src->x_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_ximage_src_get_caps (GstBaseSrc * bs) { GstXImageSrc *s = GST_XIMAGE_SRC (bs); GstXContext *xcontext; gint width, height; if ((!s->xcontext) && (!gst_ximage_src_open_display (s, s->display_name))) return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC (s)->srcpad)); if (!gst_ximage_src_recalc (s)) return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC (s)->srcpad)); xcontext = s->xcontext; width = s->xcontext->width; height = s->xcontext->height; if (s->xwindow != 0) { XWindowAttributes attrs; int status = XGetWindowAttributes (s->xcontext->disp, s->xwindow, &attrs); if (status) { width = attrs.width; height = attrs.height; } } /* property comments say 0 means right/bottom, means we can't capture the top left pixel alone */ if (s->endx == 0) s->endx = width - 1; if (s->endy == 0) s->endy = height - 1; if (s->endx >= s->startx && s->endy >= s->starty) { /* this means user has put in values */ if (s->startx < xcontext->width && s->endx < xcontext->width && s->starty < xcontext->height && s->endy < xcontext->height && s->startx >= 0 && s->starty >= 0) { /* values are fine */ s->width = width = s->endx - s->startx + 1; s->height = height = s->endy - s->starty + 1; } else { GST_WARNING ("User put in co-ordinates overshooting the X resolution, setting to full screen"); s->startx = 0; s->starty = 0; s->endx = width - 1; s->endy = height - 1; } } else { GST_WARNING ("User put in bogus co-ordinates, setting to full screen"); s->startx = 0; s->starty = 0; s->endx = width - 1; s->endy = height - 1; } GST_DEBUG ("width = %d, height=%d", width, height); return gst_caps_new_simple ("video/x-raw-rgb", "bpp", G_TYPE_INT, xcontext->bpp, "depth", G_TYPE_INT, xcontext->depth, "endianness", G_TYPE_INT, xcontext->endianness, "red_mask", G_TYPE_INT, xcontext->r_mask_output, "green_mask", G_TYPE_INT, xcontext->g_mask_output, "blue_mask", G_TYPE_INT, xcontext->b_mask_output, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, "pixel-aspect-ratio", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL); } static gboolean gst_ximage_src_set_caps (GstBaseSrc * bs, GstCaps * caps) { GstXImageSrc *s = GST_XIMAGE_SRC (bs); GstStructure *structure; const GValue *new_fps; /* If not yet opened, disallow setcaps until later */ if (!s->xcontext) return FALSE; /* The only thing that can change is the framerate downstream wants */ structure = gst_caps_get_structure (caps, 0); new_fps = gst_structure_get_value (structure, "framerate"); if (!new_fps) return FALSE; /* Store this FPS for use when generating buffers */ s->fps_n = gst_value_get_fraction_numerator (new_fps); s->fps_d = gst_value_get_fraction_denominator (new_fps); GST_DEBUG_OBJECT (s, "peer wants %d/%d fps", s->fps_n, s->fps_d); return TRUE; } static void gst_ximage_src_fixate (GstPad * pad, GstCaps * caps) { gint i; GstStructure *structure; for (i = 0; i < gst_caps_get_size (caps); ++i) { structure = gst_caps_get_structure (caps, i); gst_structure_fixate_field_nearest_fraction (structure, "framerate", 25, 1); } } static void gst_ximage_src_class_init (GstXImageSrcClass * klass) { GObjectClass *gc = G_OBJECT_CLASS (klass); GstBaseSrcClass *bc = GST_BASE_SRC_CLASS (klass); GstPushSrcClass *push_class = GST_PUSH_SRC_CLASS (klass); gc->set_property = gst_ximage_src_set_property; gc->get_property = gst_ximage_src_get_property; gc->dispose = gst_ximage_src_dispose; gc->finalize = gst_ximage_src_finalize; g_object_class_install_property (gc, PROP_DISPLAY_NAME, g_param_spec_string ("display-name", "Display", "X Display Name", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gc, PROP_SCREEN_NUM, g_param_spec_uint ("screen-num", "Screen number", "X Screen Number", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gc, PROP_SHOW_POINTER, g_param_spec_boolean ("show-pointer", "Show Mouse Pointer", "Show mouse pointer (if XFixes extension enabled)", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstXImageSrc:use-damage * * Use XDamage (if the XDamage extension is enabled) * * Since: 0.10.4 **/ g_object_class_install_property (gc, PROP_USE_DAMAGE, g_param_spec_boolean ("use-damage", "Use XDamage", "Use XDamage (if XDamage extension enabled)", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstXImageSrc:startx * * X coordinate of top left corner of area to be recorded * (0 for top left of screen) * * Since: 0.10.4 **/ g_object_class_install_property (gc, PROP_STARTX, g_param_spec_uint ("startx", "Start X co-ordinate", "X coordinate of top left corner of area to be recorded (0 for top left of screen)", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstXImageSrc:starty * * Y coordinate of top left corner of area to be recorded * (0 for top left of screen) * * Since: 0.10.4 **/ g_object_class_install_property (gc, PROP_STARTY, g_param_spec_uint ("starty", "Start Y co-ordinate", "Y coordinate of top left corner of area to be recorded (0 for top left of screen)", 0, G_MAXINT, 0, G_PARAM_READWRITE)); /** * GstXImageSrc:endx * * X coordinate of bottom right corner of area to be recorded * (0 for bottom right of screen) * * Since: 0.10.4 **/ g_object_class_install_property (gc, PROP_ENDX, g_param_spec_uint ("endx", "End X", "X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen)", 0, G_MAXINT, 0, G_PARAM_READWRITE)); /** * GstXImageSrc:endy * * Y coordinate of bottom right corner of area to be recorded * (0 for bottom right of screen) * * Since: 0.10.4 **/ g_object_class_install_property (gc, PROP_ENDY, g_param_spec_uint ("endy", "End Y", "Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen)", 0, G_MAXINT, 0, G_PARAM_READWRITE)); /** * GstXImageSrc:remote * * Whether the X display is remote. The element will try to use alternate calls * known to work better with remote displays. * * Since: 0.10.26 **/ g_object_class_install_property (gc, PROP_REMOTE, g_param_spec_boolean ("remote", "Remote dispay", "Whether the display is remote", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstXImageSrc:xid * * The XID of the window to capture. 0 for the root window (default). * * Since: 0.10.31 **/ g_object_class_install_property (gc, PROP_XID, g_param_spec_uint64 ("xid", "Window XID", "Window XID to capture from", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstXImageSrc:xname * * The name of the window to capture, if any. * * Since: 0.10.31 **/ g_object_class_install_property (gc, PROP_XNAME, g_param_spec_string ("xname", "Window name", "Window name to capture from", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); parent_class = g_type_class_peek_parent (klass); push_class->create = gst_ximage_src_create; bc->get_caps = gst_ximage_src_get_caps; bc->set_caps = gst_ximage_src_set_caps; bc->start = gst_ximage_src_start; bc->stop = gst_ximage_src_stop; bc->unlock = gst_ximage_src_unlock; } static void gst_ximage_src_init (GstXImageSrc * ximagesrc, GstXImageSrcClass * klass) { gst_base_src_set_format (GST_BASE_SRC (ximagesrc), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (ximagesrc), TRUE); gst_pad_set_fixatecaps_function (GST_BASE_SRC_PAD (ximagesrc), gst_ximage_src_fixate); ximagesrc->pool_lock = g_mutex_new (); ximagesrc->x_lock = g_mutex_new (); ximagesrc->show_pointer = TRUE; ximagesrc->use_damage = TRUE; ximagesrc->startx = 0; ximagesrc->starty = 0; ximagesrc->endx = 0; ximagesrc->endy = 0; ximagesrc->remote = FALSE; } static gboolean plugin_init (GstPlugin * plugin) { gboolean ret; GST_DEBUG_CATEGORY_INIT (gst_debug_ximage_src, "ximagesrc", 0, "ximagesrc element debug"); ret = gst_element_register (plugin, "ximagesrc", GST_RANK_NONE, GST_TYPE_XIMAGE_SRC); return ret; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "ximagesrc", "X11 video input plugin using standard Xlib calls", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/sys/ximage/Makefile.in0000644000175000017500000007056211720560241016144 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/ximage DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstximagesrc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstximagesrc_la_OBJECTS = libgstximagesrc_la-gstximagesrc.lo \ libgstximagesrc_la-ximageutil.lo libgstximagesrc_la_OBJECTS = $(am_libgstximagesrc_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstximagesrc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) \ $(libgstximagesrc_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstximagesrc_la_SOURCES) DIST_SOURCES = $(libgstximagesrc_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstximagesrc.la libgstximagesrc_la_SOURCES = gstximagesrc.c ximageutil.c libgstximagesrc_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(X_CFLAGS) $(XFIXES_CFLAGS) $(XDAMAGE_CFLAGS) libgstximagesrc_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(X_LIBS) $(XSHM_LIBS) $(XFIXES_LIBS) $(XDAMAGE_LIBS) libgstximagesrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstximagesrc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstximagesrc.h ximageutil.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/ximage/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/ximage/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstximagesrc.la: $(libgstximagesrc_la_OBJECTS) $(libgstximagesrc_la_DEPENDENCIES) $(EXTRA_libgstximagesrc_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstximagesrc_la_LINK) -rpath $(plugindir) $(libgstximagesrc_la_OBJECTS) $(libgstximagesrc_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesrc_la-gstximagesrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstximagesrc_la-ximageutil.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstximagesrc_la-gstximagesrc.lo: gstximagesrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -MT libgstximagesrc_la-gstximagesrc.lo -MD -MP -MF $(DEPDIR)/libgstximagesrc_la-gstximagesrc.Tpo -c -o libgstximagesrc_la-gstximagesrc.lo `test -f 'gstximagesrc.c' || echo '$(srcdir)/'`gstximagesrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesrc_la-gstximagesrc.Tpo $(DEPDIR)/libgstximagesrc_la-gstximagesrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstximagesrc.c' object='libgstximagesrc_la-gstximagesrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -c -o libgstximagesrc_la-gstximagesrc.lo `test -f 'gstximagesrc.c' || echo '$(srcdir)/'`gstximagesrc.c libgstximagesrc_la-ximageutil.lo: ximageutil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -MT libgstximagesrc_la-ximageutil.lo -MD -MP -MF $(DEPDIR)/libgstximagesrc_la-ximageutil.Tpo -c -o libgstximagesrc_la-ximageutil.lo `test -f 'ximageutil.c' || echo '$(srcdir)/'`ximageutil.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstximagesrc_la-ximageutil.Tpo $(DEPDIR)/libgstximagesrc_la-ximageutil.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ximageutil.c' object='libgstximagesrc_la-ximageutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstximagesrc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstximagesrc_la_CFLAGS) $(CFLAGS) -c -o libgstximagesrc_la-ximageutil.lo `test -f 'ximageutil.c' || echo '$(srcdir)/'`ximageutil.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/Makefile.am0000644000175000017500000000177511671175354014675 00000000000000# if USE_DXR3 # DXR3_DIR=dxr3 # else # DXR3_DIR= # endif if USE_OSS OSS_DIR=oss else OSS_DIR= endif if USE_OSS4 OSS4_DIR=oss4 else OSS4_DIR= endif if USE_DIRECTSOUND DIRECTSOUND_DIR=directsound else DIRECTSOUND_DIR= endif if USE_SUNAUDIO SUNAUDIO_DIR=sunaudio else SUNAUDIO_DIR= endif if USE_OSX_AUDIO OSX_AUDIO_DIR=osxaudio else OSX_AUDIO_DIR= endif if USE_OSX_VIDEO OSX_VIDEO_DIR=osxvideo else OSX_VIDEO_DIR= endif # if USE_QCAM # QCAM_DIR=qcam # else # QCAM_DIR= # endif if USE_GST_V4L2 V4L2_DIR=v4l2 else V4L2_DIR= endif # if USE_VCD # VCD_DIR=vcd # else # VCD_DIR= # endif # if USE_CDROM # CDROM_DIR=cdrom # else # CDROM_DIR= # endif # if USE_OPENGL # GL_DIR=glsink # else # GL_DIR= # endif if USE_X XIMAGE_DIR=ximage else XIMAGE_DIR= endif SUBDIRS=$(DIRECTSOUND_DIR) $(OSS_DIR) $(OSS4_DIR) $(OSX_AUDIO_DIR) $(OSX_VIDEO_DIR) $(SUNAUDIO_DIR) $(V4L2_DIR) $(XIMAGE_DIR) DIST_SUBDIRS=directsound oss oss4 osxaudio osxvideo sunaudio v4l2 waveform ximage include $(top_srcdir)/common/parallel-subdirs.mak gst-plugins-good-0.10.31/sys/v4l2/0000755000175000017500000000000011720565320013465 500000000000000gst-plugins-good-0.10.31/sys/v4l2/gstv4l2tuner.h0000644000175000017500000002741711677341661016167 00000000000000/* GStreamer * * Copyright (C) 2003 Ronald Bultje * 2006 Edgard Lima * * gstv4l2tuner.h: tuner interface implementation for V4L2 * * 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_V4L2_TUNER_H__ #define __GST_V4L2_TUNER_H__ #include #include #include "gstv4l2object.h" G_BEGIN_DECLS #define GST_TYPE_V4L2_TUNER_CHANNEL \ (gst_v4l2_tuner_channel_get_type ()) #define GST_V4L2_TUNER_CHANNEL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_TUNER_CHANNEL, \ GstV4l2TunerChannel)) #define GST_V4L2_TUNER_CHANNEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_TUNER_CHANNEL, \ GstV4l2TunerChannelClass)) #define GST_IS_V4L2_TUNER_CHANNEL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_TUNER_CHANNEL)) #define GST_IS_V4L2_TUNER_CHANNEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_TUNER_CHANNEL)) typedef struct _GstV4l2TunerChannel { GstTunerChannel parent; guint32 index; guint32 tuner; guint32 audio; } GstV4l2TunerChannel; typedef struct _GstV4l2TunerChannelClass { GstTunerChannelClass parent; } GstV4l2TunerChannelClass; #define GST_TYPE_V4L2_TUNER_NORM \ (gst_v4l2_tuner_norm_get_type ()) #define GST_V4L2_TUNER_NORM(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_TUNER_NORM, \ GstV4l2TunerNorm)) #define GST_V4L2_TUNER_NORM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_TUNER_NORM, \ GstV4l2TunerNormClass)) #define GST_IS_V4L2_TUNER_NORM(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_TUNER_NORM)) #define GST_IS_V4L2_TUNER_NORM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_TUNER_NORM)) typedef struct _GstV4l2TunerNorm { GstTunerNorm parent; v4l2_std_id index; } GstV4l2TunerNorm; typedef struct _GstV4l2TunerNormClass { GstTunerNormClass parent; } GstV4l2TunerNormClass; GType gst_v4l2_tuner_channel_get_type (void); GType gst_v4l2_tuner_norm_get_type (void); /* channels */ const GList* gst_v4l2_tuner_list_channels (GstV4l2Object * v4l2object); GstTunerChannel* gst_v4l2_tuner_get_channel (GstV4l2Object * v4l2object); gboolean gst_v4l2_tuner_set_channel (GstV4l2Object * v4l2object, GstTunerChannel * channel); /* norms */ const GList* gst_v4l2_tuner_list_norms (GstV4l2Object * v4l2object); void gst_v4l2_tuner_set_norm_and_notify (GstV4l2Object * v4l2object, GstTunerNorm * norm); GstTunerNorm* gst_v4l2_tuner_get_norm (GstV4l2Object * v4l2object); gboolean gst_v4l2_tuner_set_norm (GstV4l2Object * v4l2object, GstTunerNorm * norm); GstTunerNorm* gst_v4l2_tuner_get_norm_by_std_id (GstV4l2Object * v4l2object, v4l2_std_id norm); v4l2_std_id gst_v4l2_tuner_get_std_id_by_norm (GstV4l2Object * v4l2object, GstTunerNorm * norm); /* frequency */ void gst_v4l2_tuner_set_frequency_and_notify (GstV4l2Object * v4l2object, GstTunerChannel * channel, gulong frequency); gint gst_v4l2_tuner_signal_strength (GstV4l2Object * v4l2object, GstTunerChannel * channel); gulong gst_v4l2_tuner_get_frequency (GstV4l2Object * v4l2object, GstTunerChannel * channel); gboolean gst_v4l2_tuner_set_frequency (GstV4l2Object * v4l2object, GstTunerChannel * channel, gulong frequency); #define GST_IMPLEMENT_V4L2_TUNER_METHODS(Type, interface_as_function) \ \ static const GList * \ interface_as_function ## _tuner_list_channels (GstTuner * mixer) \ { \ Type *this = (Type*) mixer; \ return gst_v4l2_tuner_list_channels (this->v4l2object); \ } \ \ static void \ interface_as_function ## _tuner_set_channel (GstTuner * mixer, \ GstTunerChannel * channel) \ { \ Type *this = (Type*) mixer; \ gst_v4l2_tuner_set_channel (this->v4l2object, channel); \ } \ static GstTunerChannel * \ interface_as_function ## _tuner_get_channel (GstTuner * mixer) \ { \ Type *this = (Type*) mixer; \ return gst_v4l2_tuner_get_channel (this->v4l2object); \ } \ static const GList * \ interface_as_function ## _tuner_list_norms (GstTuner * mixer) \ { \ Type *this = (Type*) mixer; \ return gst_v4l2_tuner_list_norms (this->v4l2object); \ } \ static void \ interface_as_function ## _tuner_set_norm_and_notify (GstTuner * mixer, \ GstTunerNorm * norm) \ { \ Type *this = (Type*) mixer; \ gst_v4l2_tuner_set_norm_and_notify (this->v4l2object, norm); \ } \ static GstTunerNorm * \ interface_as_function ## _tuner_get_norm (GstTuner * mixer) \ { \ Type *this = (Type*) mixer; \ return gst_v4l2_tuner_get_norm (this->v4l2object); \ } \ \ static void \ interface_as_function ## _tuner_set_frequency_and_notify (GstTuner * mixer, \ GstTunerChannel * channel, \ gulong frequency) \ { \ Type *this = (Type*) mixer; \ gst_v4l2_tuner_set_frequency_and_notify (this->v4l2object, channel, frequency); \ } \ \ static gulong \ interface_as_function ## _tuner_get_frequency (GstTuner * mixer, \ GstTunerChannel * channel) \ { \ Type *this = (Type*) mixer; \ return gst_v4l2_tuner_get_frequency (this->v4l2object, channel); \ } \ \ static gint \ interface_as_function ## _tuner_signal_strength (GstTuner * mixer, \ GstTunerChannel * channel) \ { \ Type *this = (Type*) mixer; \ return gst_v4l2_tuner_signal_strength (this->v4l2object, channel); \ } \ \ static void \ interface_as_function ## _tuner_interface_init (GstTunerClass * klass) \ { \ /* default virtual functions */ \ klass->list_channels = interface_as_function ## _tuner_list_channels; \ klass->set_channel = interface_as_function ## _tuner_set_channel; \ klass->get_channel = interface_as_function ## _tuner_get_channel; \ \ klass->list_norms = interface_as_function ## _tuner_list_norms; \ klass->set_norm = interface_as_function ## _tuner_set_norm_and_notify; \ klass->get_norm = interface_as_function ## _tuner_get_norm; \ \ klass->set_frequency = interface_as_function ## _tuner_set_frequency_and_notify; \ klass->get_frequency = interface_as_function ## _tuner_get_frequency; \ klass->signal_strength = interface_as_function ## _tuner_signal_strength; \ } \ #endif /* __GST_V4L2_TUNER_H__ */ gst-plugins-good-0.10.31/sys/v4l2/gstv4l2radio.h0000644000175000017500000000355411671175354016122 00000000000000/* GStreamer v4l2 radio tuner element * Copyright (C) 2010, 2011 Alexey Chernov <4ernov@gmail.com> * * gstv4l2radio.h - V4L2 radio tuner element * * 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_V4L2RADIO_H__ #define __GST_V4L2RADIO_H__ #include "gstv4l2object.h" G_BEGIN_DECLS #define GST_TYPE_V4L2RADIO \ (gst_v4l2radio_get_type()) #define GST_V4L2RADIO(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2RADIO,GstV4l2Radio)) #define GST_V4L2RADIO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2RADIO,GstV4l2RadioClass)) #define GST_IS_V4L2RADIO(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2RADIO)) #define GST_IS_V4L2RADIO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2RADIO)) typedef struct _GstV4l2Radio GstV4l2Radio; typedef struct _GstV4l2RadioClass GstV4l2RadioClass; /** * GstV4l2Radio: * * Opaque video4linux2 radio tuner element */ struct _GstV4l2Radio { GstElement element; /*< private >*/ GstV4l2Object * v4l2object; }; struct _GstV4l2RadioClass { GstElementClass parent_class; GList *v4l2_class_devices; }; GType gst_v4l2radio_get_type (void); G_END_DECLS #endif /* __GST_V4L2RADIO_H__ */ gst-plugins-good-0.10.31/sys/v4l2/gstv4l2sink.c0000644000175000017500000007514211677341661015767 00000000000000/* GStreamer * * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/ * * Description: V4L2 sink element * Created on: Jul 2, 2009 * Author: Rob Clark * * 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-v4l2sink * * v4l2sink can be used to display video to v4l2 devices (screen overlays * provided by the graphics hardware, tv-out, etc) * * * Example launch lines * |[ * gst-launch videotestsrc ! v4l2sink device=/dev/video1 * ]| This pipeline displays a test pattern on /dev/video1 * |[ * gst-launch -v videotestsrc ! navigationtest ! v4l2sink * ]| A pipeline to test navigation events. * While moving the mouse pointer over the test signal you will see a black box * following the mouse pointer. If you press the mouse button somewhere on the * video and release it somewhere else a green box will appear where you pressed * the button and a red one where you released it. (The navigationtest element * is part of gst-plugins-good.) You can observe here that even if the images * are scaled through hardware the pointer coordinates are converted back to the * original video frame geometry so that the box can be drawn to the correct * position. This also handles borders correctly, limiting coordinates to the * image area * */ #ifdef HAVE_CONFIG_H #include #endif #include "gstv4l2colorbalance.h" #include "gstv4l2tuner.h" #ifdef HAVE_XVIDEO #include "gstv4l2xoverlay.h" #endif #include "gstv4l2vidorient.h" #include "gstv4l2sink.h" #include "gst/gst-i18n-plugin.h" #include GST_DEBUG_CATEGORY (v4l2sink_debug); #define GST_CAT_DEFAULT v4l2sink_debug #define PROP_DEF_QUEUE_SIZE 12 #define PROP_DEF_MIN_QUEUED_BUFS 1 #define DEFAULT_PROP_DEVICE "/dev/video1" enum { PROP_0, V4L2_STD_OBJECT_PROPS, PROP_QUEUE_SIZE, PROP_MIN_QUEUED_BUFS, PROP_OVERLAY_TOP, PROP_OVERLAY_LEFT, PROP_OVERLAY_WIDTH, PROP_OVERLAY_HEIGHT, PROP_CROP_TOP, PROP_CROP_LEFT, PROP_CROP_WIDTH, PROP_CROP_HEIGHT, }; GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SinkClass, gst_v4l2sink); GST_IMPLEMENT_V4L2_COLOR_BALANCE_METHODS (GstV4l2Sink, gst_v4l2sink); GST_IMPLEMENT_V4L2_TUNER_METHODS (GstV4l2Sink, gst_v4l2sink); #ifdef HAVE_XVIDEO GST_IMPLEMENT_V4L2_XOVERLAY_METHODS (GstV4l2Sink, gst_v4l2sink); #endif GST_IMPLEMENT_V4L2_VIDORIENT_METHODS (GstV4l2Sink, gst_v4l2sink); static gboolean gst_v4l2sink_iface_supported (GstImplementsInterface * iface, GType iface_type) { GstV4l2Object *v4l2object = GST_V4L2SINK (iface)->v4l2object; #ifdef HAVE_XVIDEO g_assert (iface_type == GST_TYPE_X_OVERLAY || iface_type == GST_TYPE_NAVIGATION || iface_type == GST_TYPE_COLOR_BALANCE || iface_type == GST_TYPE_VIDEO_ORIENTATION || iface_type == GST_TYPE_TUNER); #else g_assert (iface_type == GST_TYPE_COLOR_BALANCE || iface_type == GST_TYPE_VIDEO_ORIENTATION || iface_type == GST_TYPE_TUNER); #endif if (v4l2object->video_fd == -1) return FALSE; #ifdef HAVE_XVIDEO if (!GST_V4L2_IS_OVERLAY (v4l2object)) { if (iface_type == GST_TYPE_X_OVERLAY || iface_type == GST_TYPE_NAVIGATION) return FALSE; } #endif return TRUE; } static void gst_v4l2sink_interface_init (GstImplementsInterfaceClass * klass) { /* * default virtual functions */ klass->supported = gst_v4l2sink_iface_supported; } #ifdef HAVE_XVIDEO static void gst_v4l2sink_navigation_send_event (GstNavigation * navigation, GstStructure * structure); static void gst_v4l2sink_navigation_init (GstNavigationInterface * iface) { iface->send_event = gst_v4l2sink_navigation_send_event; } #endif static void gst_v4l2sink_init_interfaces (GType type) { static const GInterfaceInfo v4l2iface_info = { (GInterfaceInitFunc) gst_v4l2sink_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_tuner_info = { (GInterfaceInitFunc) gst_v4l2sink_tuner_interface_init, NULL, NULL, }; #ifdef HAVE_XVIDEO static const GInterfaceInfo v4l2_xoverlay_info = { (GInterfaceInitFunc) gst_v4l2sink_xoverlay_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_navigation_info = { (GInterfaceInitFunc) gst_v4l2sink_navigation_init, NULL, NULL, }; #endif static const GInterfaceInfo v4l2_colorbalance_info = { (GInterfaceInitFunc) gst_v4l2sink_color_balance_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_videoorientation_info = { (GInterfaceInitFunc) gst_v4l2sink_video_orientation_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_propertyprobe_info = { (GInterfaceInitFunc) gst_v4l2sink_property_probe_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2iface_info); g_type_add_interface_static (type, GST_TYPE_TUNER, &v4l2_tuner_info); #ifdef HAVE_XVIDEO g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, &v4l2_xoverlay_info); g_type_add_interface_static (type, GST_TYPE_NAVIGATION, &v4l2_navigation_info); #endif g_type_add_interface_static (type, GST_TYPE_COLOR_BALANCE, &v4l2_colorbalance_info); g_type_add_interface_static (type, GST_TYPE_VIDEO_ORIENTATION, &v4l2_videoorientation_info); g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &v4l2_propertyprobe_info); } GST_BOILERPLATE_FULL (GstV4l2Sink, gst_v4l2sink, GstVideoSink, GST_TYPE_VIDEO_SINK, gst_v4l2sink_init_interfaces); static void gst_v4l2sink_dispose (GObject * object); static void gst_v4l2sink_finalize (GstV4l2Sink * v4l2sink); /* GObject methods: */ static void gst_v4l2sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_v4l2sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* GstElement methods: */ static GstStateChangeReturn gst_v4l2sink_change_state (GstElement * element, GstStateChange transition); /* GstBaseSink methods: */ static GstCaps *gst_v4l2sink_get_caps (GstBaseSink * bsink); static gboolean gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps); static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf); static void gst_v4l2sink_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); GstV4l2SinkClass *gstv4l2sink_class = GST_V4L2SINK_CLASS (g_class); GstPadTemplate *pad_template; gstv4l2sink_class->v4l2_class_devices = NULL; GST_DEBUG_CATEGORY_INIT (v4l2sink_debug, "v4l2sink", 0, "V4L2 sink element"); gst_element_class_set_details_simple (gstelement_class, "Video (video4linux2) Sink", "Sink/Video", "Displays frames on a video4linux2 device", "Rob Clark ,"); pad_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, gst_v4l2_object_get_all_caps ()); gst_element_class_add_pad_template (gstelement_class, pad_template); gst_object_unref (pad_template); } static void gst_v4l2sink_class_init (GstV4l2SinkClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class; GstBaseSinkClass *basesink_class; gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); basesink_class = GST_BASE_SINK_CLASS (klass); gobject_class->dispose = gst_v4l2sink_dispose; gobject_class->finalize = (GObjectFinalizeFunc) gst_v4l2sink_finalize; gobject_class->set_property = gst_v4l2sink_set_property; gobject_class->get_property = gst_v4l2sink_get_property; element_class->change_state = gst_v4l2sink_change_state; gst_v4l2_object_install_properties_helper (gobject_class, DEFAULT_PROP_DEVICE); g_object_class_install_property (gobject_class, PROP_QUEUE_SIZE, g_param_spec_uint ("queue-size", "Queue size", "Number of buffers to be enqueud in the driver in streaming mode", GST_V4L2_MIN_BUFFERS, GST_V4L2_MAX_BUFFERS, PROP_DEF_QUEUE_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MIN_QUEUED_BUFS, g_param_spec_uint ("min-queued-bufs", "Minimum queued bufs", "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)", 0, GST_V4L2_MAX_BUFFERS, PROP_DEF_MIN_QUEUED_BUFS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OVERLAY_TOP, g_param_spec_int ("overlay-top", "Overlay top", "The topmost (y) coordinate of the video overlay; top left corner of screen is 0,0", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OVERLAY_LEFT, g_param_spec_int ("overlay-left", "Overlay left", "The leftmost (x) coordinate of the video overlay; top left corner of screen is 0,0", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OVERLAY_WIDTH, g_param_spec_uint ("overlay-width", "Overlay width", "The width of the video overlay; default is equal to negotiated image width", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OVERLAY_HEIGHT, g_param_spec_uint ("overlay-height", "Overlay height", "The height of the video overlay; default is equal to negotiated image height", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CROP_TOP, g_param_spec_int ("crop-top", "Crop top", "The topmost (y) coordinate of the video crop; top left corner of image is 0,0", 0x80000000, 0x7fffffff, 0, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_CROP_LEFT, g_param_spec_int ("crop-left", "Crop left", "The leftmost (x) coordinate of the video crop; top left corner of image is 0,0", 0x80000000, 0x7fffffff, 0, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_CROP_WIDTH, g_param_spec_uint ("crop-width", "Crop width", "The width of the video crop; default is equal to negotiated image width", 0, 0xffffffff, 0, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_CROP_HEIGHT, g_param_spec_uint ("crop-height", "Crop height", "The height of the video crop; default is equal to negotiated image height", 0, 0xffffffff, 0, G_PARAM_READWRITE)); basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_get_caps); basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2sink_set_caps); basesink_class->buffer_alloc = GST_DEBUG_FUNCPTR (gst_v4l2sink_buffer_alloc); basesink_class->render = GST_DEBUG_FUNCPTR (gst_v4l2sink_show_frame); } static void gst_v4l2sink_init (GstV4l2Sink * v4l2sink, GstV4l2SinkClass * klass) { v4l2sink->v4l2object = gst_v4l2_object_new (GST_ELEMENT (v4l2sink), V4L2_BUF_TYPE_VIDEO_OUTPUT, DEFAULT_PROP_DEVICE, gst_v4l2_get_output, gst_v4l2_set_output, NULL); /* same default value for video output device as is used for * v4l2src/capture is no good.. so lets set a saner default * (which can be overridden by the one creating the v4l2sink * after the constructor returns) */ g_object_set (v4l2sink, "device", "/dev/video1", NULL); /* number of buffers requested */ v4l2sink->num_buffers = PROP_DEF_QUEUE_SIZE; v4l2sink->min_queued_bufs = PROP_DEF_MIN_QUEUED_BUFS; v4l2sink->probed_caps = NULL; v4l2sink->current_caps = NULL; v4l2sink->overlay_fields_set = 0; v4l2sink->crop_fields_set = 0; v4l2sink->state = 0; } static void gst_v4l2sink_dispose (GObject * object) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (object); if (v4l2sink->probed_caps) { gst_caps_unref (v4l2sink->probed_caps); } if (v4l2sink->current_caps) { gst_caps_unref (v4l2sink->current_caps); } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_v4l2sink_finalize (GstV4l2Sink * v4l2sink) { gst_v4l2_object_destroy (v4l2sink->v4l2object); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (v4l2sink)); } /* * State values */ enum { STATE_OFF = 0, STATE_PENDING_STREAMON, STATE_STREAMING }; /* * flags to indicate which overlay/crop properties the user has set (and * therefore which ones should override the defaults from the driver) */ enum { RECT_TOP_SET = 0x01, RECT_LEFT_SET = 0x02, RECT_WIDTH_SET = 0x04, RECT_HEIGHT_SET = 0x08 }; static void gst_v4l2sink_sync_overlay_fields (GstV4l2Sink * v4l2sink) { if (!v4l2sink->overlay_fields_set) return; if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { gint fd = v4l2sink->v4l2object->video_fd; struct v4l2_format format; memset (&format, 0x00, sizeof (struct v4l2_format)); format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; if (v4l2_ioctl (fd, VIDIOC_G_FMT, &format) < 0) { GST_WARNING_OBJECT (v4l2sink, "VIDIOC_G_FMT failed"); return; } GST_DEBUG_OBJECT (v4l2sink, "setting overlay: overlay_fields_set=0x%02x, top=%d, left=%d, width=%d, height=%d", v4l2sink->overlay_fields_set, v4l2sink->overlay.top, v4l2sink->overlay.left, v4l2sink->overlay.width, v4l2sink->overlay.height); if (v4l2sink->overlay_fields_set & RECT_TOP_SET) format.fmt.win.w.top = v4l2sink->overlay.top; if (v4l2sink->overlay_fields_set & RECT_LEFT_SET) format.fmt.win.w.left = v4l2sink->overlay.left; if (v4l2sink->overlay_fields_set & RECT_WIDTH_SET) format.fmt.win.w.width = v4l2sink->overlay.width; if (v4l2sink->overlay_fields_set & RECT_HEIGHT_SET) format.fmt.win.w.height = v4l2sink->overlay.height; if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0) { GST_WARNING_OBJECT (v4l2sink, "VIDIOC_S_FMT failed"); return; } v4l2sink->overlay_fields_set = 0; v4l2sink->overlay = format.fmt.win.w; } } static void gst_v4l2sink_sync_crop_fields (GstV4l2Sink * v4l2sink) { if (!v4l2sink->crop_fields_set) return; if (GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { gint fd = v4l2sink->v4l2object->video_fd; struct v4l2_crop crop; memset (&crop, 0x00, sizeof (struct v4l2_crop)); crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; if (v4l2_ioctl (fd, VIDIOC_G_CROP, &crop) < 0) { GST_WARNING_OBJECT (v4l2sink, "VIDIOC_G_CROP failed"); return; } GST_DEBUG_OBJECT (v4l2sink, "setting crop: crop_fields_set=0x%02x, top=%d, left=%d, width=%d, height=%d", v4l2sink->crop_fields_set, v4l2sink->crop.top, v4l2sink->crop.left, v4l2sink->crop.width, v4l2sink->crop.height); if (v4l2sink->crop_fields_set & RECT_TOP_SET) crop.c.top = v4l2sink->crop.top; if (v4l2sink->crop_fields_set & RECT_LEFT_SET) crop.c.left = v4l2sink->crop.left; if (v4l2sink->crop_fields_set & RECT_WIDTH_SET) crop.c.width = v4l2sink->crop.width; if (v4l2sink->crop_fields_set & RECT_HEIGHT_SET) crop.c.height = v4l2sink->crop.height; if (v4l2_ioctl (fd, VIDIOC_S_CROP, &crop) < 0) { GST_WARNING_OBJECT (v4l2sink, "VIDIOC_S_CROP failed"); return; } v4l2sink->crop_fields_set = 0; v4l2sink->crop = crop.c; } } static void gst_v4l2sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (object); if (!gst_v4l2_object_set_property_helper (v4l2sink->v4l2object, prop_id, value, pspec)) { switch (prop_id) { case PROP_QUEUE_SIZE: v4l2sink->num_buffers = g_value_get_uint (value); break; case PROP_MIN_QUEUED_BUFS: v4l2sink->min_queued_bufs = g_value_get_uint (value); break; case PROP_OVERLAY_TOP: v4l2sink->overlay.top = g_value_get_int (value); v4l2sink->overlay_fields_set |= RECT_TOP_SET; gst_v4l2sink_sync_overlay_fields (v4l2sink); break; case PROP_OVERLAY_LEFT: v4l2sink->overlay.left = g_value_get_int (value); v4l2sink->overlay_fields_set |= RECT_LEFT_SET; gst_v4l2sink_sync_overlay_fields (v4l2sink); break; case PROP_OVERLAY_WIDTH: v4l2sink->overlay.width = g_value_get_uint (value); v4l2sink->overlay_fields_set |= RECT_WIDTH_SET; gst_v4l2sink_sync_overlay_fields (v4l2sink); break; case PROP_OVERLAY_HEIGHT: v4l2sink->overlay.height = g_value_get_uint (value); v4l2sink->overlay_fields_set |= RECT_HEIGHT_SET; gst_v4l2sink_sync_overlay_fields (v4l2sink); break; case PROP_CROP_TOP: v4l2sink->crop.top = g_value_get_int (value); v4l2sink->crop_fields_set |= RECT_TOP_SET; gst_v4l2sink_sync_crop_fields (v4l2sink); break; case PROP_CROP_LEFT: v4l2sink->crop.left = g_value_get_int (value); v4l2sink->crop_fields_set |= RECT_LEFT_SET; gst_v4l2sink_sync_crop_fields (v4l2sink); break; case PROP_CROP_WIDTH: v4l2sink->crop.width = g_value_get_uint (value); v4l2sink->crop_fields_set |= RECT_WIDTH_SET; gst_v4l2sink_sync_crop_fields (v4l2sink); break; case PROP_CROP_HEIGHT: v4l2sink->crop.height = g_value_get_uint (value); v4l2sink->crop_fields_set |= RECT_HEIGHT_SET; gst_v4l2sink_sync_crop_fields (v4l2sink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } } static void gst_v4l2sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (object); if (!gst_v4l2_object_get_property_helper (v4l2sink->v4l2object, prop_id, value, pspec)) { switch (prop_id) { case PROP_QUEUE_SIZE: g_value_set_uint (value, v4l2sink->num_buffers); break; case PROP_MIN_QUEUED_BUFS: g_value_set_uint (value, v4l2sink->min_queued_bufs); break; case PROP_OVERLAY_TOP: g_value_set_int (value, v4l2sink->overlay.top); break; case PROP_OVERLAY_LEFT: g_value_set_int (value, v4l2sink->overlay.left); break; case PROP_OVERLAY_WIDTH: g_value_set_uint (value, v4l2sink->overlay.width); break; case PROP_OVERLAY_HEIGHT: g_value_set_uint (value, v4l2sink->overlay.height); break; case PROP_CROP_TOP: g_value_set_int (value, v4l2sink->crop.top); break; case PROP_CROP_LEFT: g_value_set_int (value, v4l2sink->crop.left); break; case PROP_CROP_WIDTH: g_value_set_uint (value, v4l2sink->crop.width); break; case PROP_CROP_HEIGHT: g_value_set_uint (value, v4l2sink->crop.height); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } } static GstStateChangeReturn gst_v4l2sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstV4l2Sink *v4l2sink = GST_V4L2SINK (element); GST_DEBUG_OBJECT (v4l2sink, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: /* open the device */ if (!gst_v4l2_object_start (v4l2sink->v4l2object)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: if (v4l2sink->state == STATE_STREAMING) { if (!gst_v4l2_object_stop_streaming (v4l2sink->v4l2object)) { return GST_STATE_CHANGE_FAILURE; } v4l2sink->state = STATE_PENDING_STREAMON; } break; case GST_STATE_CHANGE_READY_TO_NULL: if (NULL != v4l2sink->pool) gst_v4l2_buffer_pool_destroy (v4l2sink->pool); v4l2sink->pool = NULL; /* close the device */ if (!gst_v4l2_object_stop (v4l2sink->v4l2object)) return GST_STATE_CHANGE_FAILURE; v4l2sink->state = STATE_OFF; break; default: break; } return ret; } static GstCaps * gst_v4l2sink_get_caps (GstBaseSink * bsink) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); GstCaps *ret; GSList *walk; GSList *formats; if (!GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { /* FIXME: copy? */ GST_DEBUG_OBJECT (v4l2sink, "device is not open"); return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (v4l2sink))); } if (v4l2sink->probed_caps) { LOG_CAPS (v4l2sink, v4l2sink->probed_caps); return gst_caps_ref (v4l2sink->probed_caps); } formats = gst_v4l2_object_get_format_list (v4l2sink->v4l2object); ret = gst_caps_new_empty (); for (walk = formats; walk; walk = walk->next) { struct v4l2_fmtdesc *format; GstStructure *template; format = (struct v4l2_fmtdesc *) walk->data; template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat); if (template) { GstCaps *tmp; tmp = gst_v4l2_object_probe_caps_for_format (v4l2sink->v4l2object, format->pixelformat, template); if (tmp) gst_caps_append (ret, tmp); gst_structure_free (template); } else { GST_DEBUG_OBJECT (v4l2sink, "unknown format %u", format->pixelformat); } } v4l2sink->probed_caps = gst_caps_ref (ret); GST_INFO_OBJECT (v4l2sink, "probed caps: %p", ret); LOG_CAPS (v4l2sink, ret); return ret; } static gboolean gst_v4l2sink_set_caps (GstBaseSink * bsink, GstCaps * caps) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); gint w = 0, h = 0; gboolean interlaced; struct v4l2_fmtdesc *format; guint fps_n, fps_d; guint size; LOG_CAPS (v4l2sink, caps); if (!GST_V4L2_IS_OPEN (v4l2sink->v4l2object)) { GST_DEBUG_OBJECT (v4l2sink, "device is not open"); return FALSE; } if (v4l2sink->current_caps) { GST_DEBUG_OBJECT (v4l2sink, "already have caps set.. are they equal?"); LOG_CAPS (v4l2sink, v4l2sink->current_caps); if (gst_caps_is_equal (v4l2sink->current_caps, caps)) { GST_DEBUG_OBJECT (v4l2sink, "yes they are!"); return TRUE; } GST_DEBUG_OBJECT (v4l2sink, "no they aren't!"); } if (v4l2sink->pool) { /* TODO: if we've already allocated buffers, we probably need to * do something here to free and reallocate.... * * gst_v4l2_object_stop_streaming() * gst_v4l2_buffer_pool_destroy() * */ GST_DEBUG_OBJECT (v4l2sink, "warning, changing caps not supported yet"); return FALSE; } /* we want our own v4l2 type of fourcc codes */ if (!gst_v4l2_object_get_caps_info (v4l2sink->v4l2object, caps, &format, &w, &h, &interlaced, &fps_n, &fps_d, &size)) { GST_DEBUG_OBJECT (v4l2sink, "can't get capture format from caps %p", caps); return FALSE; } if (!format) { GST_DEBUG_OBJECT (v4l2sink, "unrecognized caps!!"); return FALSE; } if (!gst_v4l2_object_set_format (v4l2sink->v4l2object, format->pixelformat, w, h, interlaced)) { /* error already posted */ return FALSE; } v4l2sink->video_width = w; v4l2sink->video_height = h; /* TODO: videosink width/height should be scaled according to * pixel-aspect-ratio */ GST_VIDEO_SINK_WIDTH (v4l2sink) = w; GST_VIDEO_SINK_HEIGHT (v4l2sink) = h; v4l2sink->current_caps = gst_caps_ref (caps); return TRUE; } /* buffer alloc function to implement pad_alloc for upstream element */ static GstFlowReturn gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); GstV4l2Buffer *v4l2buf; if (v4l2sink->v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) { /* initialize the buffer pool if not initialized yet (first buffer): */ if (G_UNLIKELY (!v4l2sink->pool)) { /* set_caps() might not be called yet.. so just to make sure: */ if (!gst_v4l2sink_set_caps (bsink, caps)) { return GST_FLOW_ERROR; } GST_V4L2_CHECK_OPEN (v4l2sink->v4l2object); if (!(v4l2sink->pool = gst_v4l2_buffer_pool_new (GST_ELEMENT (v4l2sink), v4l2sink->v4l2object->video_fd, v4l2sink->num_buffers, caps, FALSE, V4L2_BUF_TYPE_VIDEO_OUTPUT))) { return GST_FLOW_ERROR; } gst_v4l2sink_sync_overlay_fields (v4l2sink); gst_v4l2sink_sync_crop_fields (v4l2sink); #ifdef HAVE_XVIDEO gst_v4l2_xoverlay_prepare_xwindow_id (v4l2sink->v4l2object, TRUE); #endif v4l2sink->state = STATE_PENDING_STREAMON; GST_INFO_OBJECT (v4l2sink, "outputting buffers via mmap()"); if (v4l2sink->num_buffers != v4l2sink->pool->buffer_count) { v4l2sink->num_buffers = v4l2sink->pool->buffer_count; g_object_notify (G_OBJECT (v4l2sink), "queue-size"); } } v4l2buf = gst_v4l2_buffer_pool_get (v4l2sink->pool, TRUE); if (G_LIKELY (v4l2buf)) { GST_DEBUG_OBJECT (v4l2sink, "allocated buffer: %p", v4l2buf); *buf = GST_BUFFER (v4l2buf); return GST_FLOW_OK; } else { GST_DEBUG_OBJECT (v4l2sink, "failed to allocate buffer"); return GST_FLOW_ERROR; } } else { GST_ERROR_OBJECT (v4l2sink, "only supporting streaming mode for now..."); return GST_FLOW_ERROR; } } /* called after A/V sync to render frame */ static GstFlowReturn gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); GstBuffer *newbuf = NULL; GST_DEBUG_OBJECT (v4l2sink, "render buffer: %p", buf); if (!GST_IS_V4L2_BUFFER (buf)) { GstFlowReturn ret; /* special case check for sub-buffers: In certain cases, places like * GstBaseTransform, which might check that the buffer is writable * before copying metadata, timestamp, and such, will find that the * buffer has more than one reference to it. In these cases, they * will create a sub-buffer with an offset=0 and length equal to the * original buffer size. * * This could happen in two scenarios: (1) a tee in the pipeline, and * (2) because the refcnt is incremented in gst_mini_object_free() * before the finalize function is called, and decremented after it * returns.. but returning this buffer to the buffer pool in the * finalize function, could wake up a thread blocked in _buffer_alloc() * which could run and get a buffer w/ refcnt==2 before the thread * originally unref'ing the buffer returns from finalize function and * decrements the refcnt back to 1! */ if (buf->parent && (GST_BUFFER_DATA (buf) == GST_BUFFER_DATA (buf->parent)) && (GST_BUFFER_SIZE (buf) == GST_BUFFER_SIZE (buf->parent))) { GST_DEBUG_OBJECT (v4l2sink, "I have a sub-buffer!"); return gst_v4l2sink_show_frame (bsink, buf->parent); } GST_DEBUG_OBJECT (v4l2sink, "slow-path.. I got a %s so I need to memcpy", g_type_name (G_OBJECT_TYPE (buf))); ret = gst_v4l2sink_buffer_alloc (bsink, GST_BUFFER_OFFSET (buf), GST_BUFFER_SIZE (buf), GST_BUFFER_CAPS (buf), &newbuf); if (GST_FLOW_OK != ret) { GST_DEBUG_OBJECT (v4l2sink, "dropping frame! Consider increasing 'queue-size' property!"); return GST_FLOW_OK; } memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (buf), MIN (GST_BUFFER_SIZE (newbuf), GST_BUFFER_SIZE (buf))); GST_DEBUG_OBJECT (v4l2sink, "render copied buffer: %p", newbuf); buf = newbuf; } if (!gst_v4l2_buffer_pool_qbuf (v4l2sink->pool, GST_V4L2_BUFFER (buf))) { return GST_FLOW_ERROR; } if (v4l2sink->state == STATE_PENDING_STREAMON) { if (!gst_v4l2_object_start_streaming (v4l2sink->v4l2object)) { return GST_FLOW_ERROR; } v4l2sink->state = STATE_STREAMING; } if (!newbuf) { gst_buffer_ref (buf); } /* if the driver has more than one buffer, ie. more than just the one we * just queued, then dequeue one immediately to make it available via * _buffer_alloc(): */ if (gst_v4l2_buffer_pool_available_buffers (v4l2sink->pool) > v4l2sink->min_queued_bufs) { GstV4l2Buffer *v4l2buf = gst_v4l2_buffer_pool_dqbuf (v4l2sink->pool); /* note: if we get a buf, we don't want to use it directly (because * someone else could still hold a ref).. but instead we release our * reference to it, and if no one else holds a ref it will be returned * to the pool of available buffers.. and if not, we keep looping. */ if (v4l2buf) { gst_buffer_unref (GST_BUFFER (v4l2buf)); } } return GST_FLOW_OK; } #ifdef HAVE_XVIDEO static void gst_v4l2sink_navigation_send_event (GstNavigation * navigation, GstStructure * structure) { GstV4l2Sink *v4l2sink = GST_V4L2SINK (navigation); GstV4l2Xv *xv = v4l2sink->v4l2object->xv; GstPad *peer; if (!xv) return; if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (v4l2sink)))) { GstVideoRectangle rect; gdouble x, y, xscale = 1.0, yscale = 1.0; gst_v4l2_xoverlay_get_render_rect (v4l2sink->v4l2object, &rect); /* We calculate scaling using the original video frames geometry to * include pixel aspect ratio scaling. */ xscale = (gdouble) v4l2sink->video_width / rect.w; yscale = (gdouble) v4l2sink->video_height / rect.h; /* Converting pointer coordinates to the non scaled geometry */ if (gst_structure_get_double (structure, "pointer_x", &x)) { x = MIN (x, rect.x + rect.w); x = MAX (x - rect.x, 0); gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, (gdouble) x * xscale, NULL); } if (gst_structure_get_double (structure, "pointer_y", &y)) { y = MIN (y, rect.y + rect.h); y = MAX (y - rect.y, 0); gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, (gdouble) y * yscale, NULL); } gst_pad_send_event (peer, gst_event_new_navigation (structure)); gst_object_unref (peer); } } #endif gst-plugins-good-0.10.31/sys/v4l2/gstv4l2colorbalance.c0000644000175000017500000000576511671175354017451 00000000000000/* GStreamer * * Copyright (C) 2003 Ronald Bultje * 2006 Edgard Lima * * gstv4l2colorbalance.c: color balance interface implementation for V4L2 * * 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 #include "gstv4l2colorbalance.h" #include "gstv4l2object.h" GST_BOILERPLATE (GstV4l2ColorBalanceChannel, gst_v4l2_color_balance_channel, GstColorBalanceChannel, GST_TYPE_COLOR_BALANCE_CHANNEL); static void gst_v4l2_color_balance_channel_base_init (gpointer g_class) { } static void gst_v4l2_color_balance_channel_class_init (GstV4l2ColorBalanceChannelClass * klass) { } static void gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel * channel, GstV4l2ColorBalanceChannelClass * klass) { channel->id = (guint32) - 1; } static G_GNUC_UNUSED gboolean gst_v4l2_color_balance_contains_channel (GstV4l2Object * v4l2object, GstV4l2ColorBalanceChannel * v4l2channel) { const GList *item; for (item = v4l2object->colors; item != NULL; item = item->next) if (item->data == v4l2channel) return TRUE; return FALSE; } const GList * gst_v4l2_color_balance_list_channels (GstV4l2Object * v4l2object) { return v4l2object->colors; } void gst_v4l2_color_balance_set_value (GstV4l2Object * v4l2object, GstColorBalanceChannel * channel, gint value) { GstV4l2ColorBalanceChannel *v4l2channel = GST_V4L2_COLOR_BALANCE_CHANNEL (channel); /* assert that we're opened and that we're using a known item */ g_return_if_fail (GST_V4L2_IS_OPEN (v4l2object)); g_return_if_fail (gst_v4l2_color_balance_contains_channel (v4l2object, v4l2channel)); gst_v4l2_set_attribute (v4l2object, v4l2channel->id, value); } gint gst_v4l2_color_balance_get_value (GstV4l2Object * v4l2object, GstColorBalanceChannel * channel) { GstV4l2ColorBalanceChannel *v4l2channel = GST_V4L2_COLOR_BALANCE_CHANNEL (channel); gint value; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0); g_return_val_if_fail (gst_v4l2_color_balance_contains_channel (v4l2object, v4l2channel), 0); if (!gst_v4l2_get_attribute (v4l2object, v4l2channel->id, &value)) return 0; return value; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2src.h0000644000175000017500000000501411671175354015604 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * * gstv4l2src.h: BT8x8/V4L2 source element * * 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_V4L2SRC_H__ #define __GST_V4L2SRC_H__ #include #include GST_DEBUG_CATEGORY_EXTERN (v4l2src_debug); G_BEGIN_DECLS #define GST_TYPE_V4L2SRC \ (gst_v4l2src_get_type()) #define GST_V4L2SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2SRC,GstV4l2Src)) #define GST_V4L2SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2SRC,GstV4l2SrcClass)) #define GST_IS_V4L2SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2SRC)) #define GST_IS_V4L2SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2SRC)) typedef struct _GstV4l2Src GstV4l2Src; typedef struct _GstV4l2SrcClass GstV4l2SrcClass; typedef GstFlowReturn (*GstV4l2SrcGetFunc)(GstV4l2Src * v4l2src, GstBuffer ** buf); /** * GstV4l2Src: * * Opaque object. */ struct _GstV4l2Src { GstPushSrc pushsrc; /*< private >*/ GstV4l2Object * v4l2object; /* pads */ GstCaps *probed_caps; /* buffer handling */ GstV4l2BufferPool *pool; guint32 num_buffers; gboolean use_mmap; guint32 frame_byte_size; /* if the buffer will be or not used from directly mmap */ gboolean always_copy; int decimate; /* True if we want to stop */ gboolean quit; gboolean is_capturing; guint64 offset; gint fps_d, fps_n; /* framerate if device is open */ GstClockTime duration; /* duration of one frame */ GstClockTime ctrl_time; GstV4l2SrcGetFunc get_frame; }; struct _GstV4l2SrcClass { GstPushSrcClass parent_class; GList *v4l2_class_devices; }; GType gst_v4l2src_get_type (void); G_END_DECLS #endif /* __GST_V4L2SRC_H__ */ gst-plugins-good-0.10.31/sys/v4l2/v4l2src_calls.h0000644000175000017500000000344011671175354016245 00000000000000/* GStreamer * * Copyright (C) 2002 Ronald Bultje * 2006 Edgard Lima * * v4l2src.h - system calls * * 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 __V4L2SRC_CALLS_H__ #define __V4L2SRC_CALLS_H__ #include "gstv4l2src.h" #include "v4l2_calls.h" gboolean gst_v4l2src_get_capture (GstV4l2Src * v4l2src); gboolean gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat, guint32 width, guint32 height, gboolean interlaced, guint32 fps_n, guint32 fps_d); gboolean gst_v4l2src_capture_init (GstV4l2Src * v4l2src, GstCaps *caps); gboolean gst_v4l2src_capture_start (GstV4l2Src * v4l2src); GstFlowReturn gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer **buf); gboolean gst_v4l2src_capture_stop (GstV4l2Src * v4l2src); gboolean gst_v4l2src_capture_deinit (GstV4l2Src * v4l2src); #endif /* __V4L2SRC_CALLS_H__ */ gst-plugins-good-0.10.31/sys/v4l2/gstv4l2xoverlay.h0000644000175000017500000000621011671175354016665 00000000000000/* GStreamer * * Copyright (C) 2003 Ronald Bultje * 2006 Edgard Lima * * gstv4l2xoverlay.h: tv mixer interface implementation for V4L2 * * 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_V4L2_X_OVERLAY_H__ #define __GST_V4L2_X_OVERLAY_H__ #include #include #include #include #include /* for GstVideoRectange */ #include "gstv4l2object.h" G_BEGIN_DECLS void gst_v4l2_xoverlay_start (GstV4l2Object *v4l2object); void gst_v4l2_xoverlay_stop (GstV4l2Object *v4l2object); gboolean gst_v4l2_xoverlay_get_render_rect (GstV4l2Object *v4l2object, GstVideoRectangle *rect); void gst_v4l2_xoverlay_interface_init (GstXOverlayClass * klass); void gst_v4l2_xoverlay_set_window_handle (GstV4l2Object * v4l2object, guintptr id); void gst_v4l2_xoverlay_prepare_xwindow_id (GstV4l2Object * v4l2object, gboolean required); #define GST_IMPLEMENT_V4L2_XOVERLAY_METHODS(Type, interface_as_function) \ \ static void \ interface_as_function ## _xoverlay_set_window_handle (GstXOverlay * xoverlay, \ guintptr id) \ { \ Type *this = (Type*) xoverlay; \ gst_v4l2_xoverlay_set_window_handle (this->v4l2object, id); \ } \ \ static void \ interface_as_function ## _xoverlay_interface_init (GstXOverlayClass * klass) \ { \ /* default virtual functions */ \ klass->set_window_handle = interface_as_function ## _xoverlay_set_window_handle; \ \ gst_v4l2_xoverlay_interface_init(klass); \ } \ #endif /* __GST_V4L2_X_OVERLAY_H__ */ gst-plugins-good-0.10.31/sys/v4l2/v4l2src_calls.c0000644000175000017500000003032411677341661016243 00000000000000/* GStreamer * * Copyright (C) 2002 Ronald Bultje * 2006 Edgard Lima * * v4l2src.c - system calls * * 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 #include #include #include #include #include #include #include #include "v4l2src_calls.h" #include #include #ifdef __sun /* Needed on older Solaris Nevada builds (72 at least) */ #include #include #endif #include "gstv4l2tuner.h" #include "gstv4l2bufferpool.h" #include "gst/gst-i18n-plugin.h" #define GST_CAT_DEFAULT v4l2src_debug GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE); /* lalala... */ #define GST_V4L2_SET_ACTIVE(element) (element)->buffer = GINT_TO_POINTER (-1) #define GST_V4L2_SET_INACTIVE(element) (element)->buffer = NULL /* On some systems MAP_FAILED seems to be missing */ #ifndef MAP_FAILED #define MAP_FAILED ((caddr_t) -1) #endif /* Local functions */ static gboolean gst_v4l2src_buffer_pool_activate (GstV4l2BufferPool * pool, GstV4l2Src * v4l2src) { GstV4l2Buffer *buf; while ((buf = gst_v4l2_buffer_pool_get (pool, FALSE)) != NULL) if (!gst_v4l2_buffer_pool_qbuf (pool, buf)) goto queue_failed; return TRUE; /* ERRORS */ queue_failed: { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (_("Could not enqueue buffers in device '%s'."), v4l2src->v4l2object->videodev), ("enqueing buffer %d/%d failed: %s", buf->vbuffer.index, v4l2src->num_buffers, g_strerror (errno))); return FALSE; } } /****************************************************** * gst_v4l2src_grab_frame (): * grab a frame for capturing * return value: GST_FLOW_OK, GST_FLOW_WRONG_STATE or GST_FLOW_ERROR ******************************************************/ GstFlowReturn gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf) { #define NUM_TRIALS 50 GstV4l2Object *v4l2object; GstV4l2BufferPool *pool; gint32 trials = NUM_TRIALS; GstBuffer *pool_buffer; gboolean need_copy; gint ret; v4l2object = v4l2src->v4l2object; pool = v4l2src->pool; if (!pool) goto no_buffer_pool; GST_DEBUG_OBJECT (v4l2src, "grab frame"); for (;;) { if (v4l2object->can_poll_device) { ret = gst_poll_wait (v4l2object->poll, GST_CLOCK_TIME_NONE); if (G_UNLIKELY (ret < 0)) { if (errno == EBUSY) goto stopped; if (errno == ENXIO) { GST_DEBUG_OBJECT (v4l2src, "v4l2 device doesn't support polling. Disabling"); v4l2object->can_poll_device = FALSE; } else { if (errno != EAGAIN && errno != EINTR) goto select_error; } } } pool_buffer = GST_BUFFER (gst_v4l2_buffer_pool_dqbuf (pool)); if (pool_buffer) break; GST_WARNING_OBJECT (pool->v4l2elem, "trials=%d", trials); /* if the sync() got interrupted, we can retry */ switch (errno) { case EINVAL: case ENOMEM: /* fatal */ return GST_FLOW_ERROR; case EAGAIN: case EIO: case EINTR: default: /* try again, until too many trials */ break; } /* check nr. of attempts to capture */ if (--trials == -1) { goto too_many_trials; } } /* if we are handing out the last buffer in the pool, we need to make a * copy and bring the buffer back in the pool. */ need_copy = v4l2src->always_copy || !gst_v4l2_buffer_pool_available_buffers (pool); if (G_UNLIKELY (need_copy)) { if (!v4l2src->always_copy) { GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, v4l2src, "running out of buffers, making a copy to reuse current one"); } *buf = gst_buffer_copy (pool_buffer); GST_BUFFER_FLAG_UNSET (*buf, GST_BUFFER_FLAG_READONLY); /* this will requeue */ gst_buffer_unref (pool_buffer); } else { *buf = pool_buffer; } /* we set the buffer metadata in gst_v4l2src_create() */ return GST_FLOW_OK; /* ERRORS */ no_buffer_pool: { GST_DEBUG ("no buffer pool"); return GST_FLOW_WRONG_STATE; } select_error: { GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, READ, (NULL), ("select error %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } stopped: { GST_DEBUG ("stop called"); return GST_FLOW_WRONG_STATE; } too_many_trials: { GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, (_("Failed trying to get video frames from device '%s'."), v4l2object->videodev), (_("Failed after %d tries. device %s. system error: %s"), NUM_TRIALS, v4l2object->videodev, g_strerror (errno))); return GST_FLOW_ERROR; } } /****************************************************** * gst_v4l2src_set_capture(): * set capture parameters * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat, guint32 width, guint32 height, gboolean interlaced, guint fps_n, guint fps_d) { gint fd = v4l2src->v4l2object->video_fd; struct v4l2_streamparm stream; if (pixelformat == GST_MAKE_FOURCC ('M', 'P', 'E', 'G')) return TRUE; if (!gst_v4l2_object_set_format (v4l2src->v4l2object, pixelformat, width, height, interlaced)) { /* error already reported */ return FALSE; } /* Is there a reason we require the caller to always specify a framerate? */ GST_DEBUG_OBJECT (v4l2src, "Desired framerate: %u/%u", fps_n, fps_d); memset (&stream, 0x00, sizeof (struct v4l2_streamparm)); stream.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (v4l2_ioctl (fd, VIDIOC_G_PARM, &stream) < 0) { GST_ELEMENT_WARNING (v4l2src, RESOURCE, SETTINGS, (_("Could not get parameters on device '%s'"), v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM); goto done; } /* We used to skip frame rate setup if the camera was already setup with the requested frame rate. This breaks some cameras though, causing them to not output data (several models of Thinkpad cameras have this problem at least). So, don't skip. */ /* We want to change the frame rate, so check whether we can. Some cheap USB * cameras don't have the capability */ if ((stream.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) == 0) { GST_DEBUG_OBJECT (v4l2src, "Not setting framerate (not supported)"); goto done; } GST_LOG_OBJECT (v4l2src, "Setting framerate to %u/%u", fps_n, fps_d); /* Note: V4L2 wants the frame interval, we have the frame rate */ stream.parm.capture.timeperframe.numerator = fps_d; stream.parm.capture.timeperframe.denominator = fps_n; /* some cheap USB cam's won't accept any change */ if (v4l2_ioctl (fd, VIDIOC_S_PARM, &stream) < 0) { GST_ELEMENT_WARNING (v4l2src, RESOURCE, SETTINGS, (_("Video input device did not accept new frame rate setting.")), GST_ERROR_SYSTEM); goto done; } v4l2src->fps_n = fps_n; v4l2src->fps_d = fps_d; /* if we have a framerate pre-calculate duration */ if (fps_n > 0 && fps_d > 0) { v4l2src->duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n); } else { v4l2src->duration = GST_CLOCK_TIME_NONE; } GST_INFO_OBJECT (v4l2src, "Set framerate to %u/%u and duration to %" GST_TIME_FORMAT, fps_n, fps_d, GST_TIME_ARGS (v4l2src->duration)); done: return TRUE; } /****************************************************** * gst_v4l2src_capture_init(): * initialize the capture system * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2src_capture_init (GstV4l2Src * v4l2src, GstCaps * caps) { GST_DEBUG_OBJECT (v4l2src, "initializing the capture system"); GST_V4L2_CHECK_OPEN (v4l2src->v4l2object); GST_V4L2_CHECK_NOT_ACTIVE (v4l2src->v4l2object); if (v4l2src->v4l2object->vcap.capabilities & V4L2_CAP_STREAMING) { /* Map the buffers */ GST_LOG_OBJECT (v4l2src, "initiating buffer pool"); if (!(v4l2src->pool = gst_v4l2_buffer_pool_new (GST_ELEMENT (v4l2src), v4l2src->v4l2object->video_fd, v4l2src->num_buffers, caps, TRUE, V4L2_BUF_TYPE_VIDEO_CAPTURE))) goto buffer_pool_new_failed; GST_INFO_OBJECT (v4l2src, "capturing buffers via mmap()"); v4l2src->use_mmap = TRUE; if (v4l2src->num_buffers != v4l2src->pool->buffer_count) { v4l2src->num_buffers = v4l2src->pool->buffer_count; g_object_notify (G_OBJECT (v4l2src), "queue-size"); } } else if (v4l2src->v4l2object->vcap.capabilities & V4L2_CAP_READWRITE) { GST_INFO_OBJECT (v4l2src, "capturing buffers via read()"); v4l2src->use_mmap = FALSE; v4l2src->pool = NULL; } else { goto no_supported_capture_method; } GST_V4L2_SET_ACTIVE (v4l2src->v4l2object); return TRUE; /* ERRORS */ buffer_pool_new_failed: { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (_("Could not map buffers from device '%s'"), v4l2src->v4l2object->videodev), ("Failed to create buffer pool: %s", g_strerror (errno))); return FALSE; } no_supported_capture_method: { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (_("The driver of device '%s' does not support any known capture " "method."), v4l2src->v4l2object->videodev), (NULL)); return FALSE; } } /****************************************************** * gst_v4l2src_capture_start(): * start streaming capture * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2src_capture_start (GstV4l2Src * v4l2src) { GST_DEBUG_OBJECT (v4l2src, "starting the capturing"); //GST_V4L2_CHECK_OPEN (v4l2src->v4l2object); GST_V4L2_CHECK_ACTIVE (v4l2src->v4l2object); v4l2src->quit = FALSE; if (v4l2src->use_mmap) { if (!gst_v4l2src_buffer_pool_activate (v4l2src->pool, v4l2src)) { return FALSE; } if (!gst_v4l2_object_start_streaming (v4l2src->v4l2object)) { return FALSE; } } v4l2src->is_capturing = TRUE; return TRUE; } /****************************************************** * gst_v4l2src_capture_stop(): * stop streaming capture * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2src_capture_stop (GstV4l2Src * v4l2src) { GST_DEBUG_OBJECT (v4l2src, "stopping capturing"); if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) { goto done; } if (!GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) { goto done; } if (v4l2src->use_mmap) { /* we actually need to sync on all queued buffers but not * on the non-queued ones */ if (!gst_v4l2_object_stop_streaming (v4l2src->v4l2object)) { return FALSE; } } done: /* make an optional pending wait stop */ v4l2src->quit = TRUE; v4l2src->is_capturing = FALSE; return TRUE; } /****************************************************** * gst_v4l2src_capture_deinit(): * deinitialize the capture system * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2src_capture_deinit (GstV4l2Src * v4l2src) { GST_DEBUG_OBJECT (v4l2src, "deinitting capture system"); if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) { return TRUE; } if (!GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) { return TRUE; } if (v4l2src->pool) { gst_v4l2_buffer_pool_destroy (v4l2src->pool); v4l2src->pool = NULL; } GST_V4L2_SET_INACTIVE (v4l2src->v4l2object); return TRUE; } gst-plugins-good-0.10.31/sys/v4l2/Makefile.am0000644000175000017500000000251011671175354015450 00000000000000plugin_LTLIBRARIES = libgstvideo4linux2.la if USE_XVIDEO xv_source = gstv4l2xoverlay.c xv_libs = $(X_LIBS) $(XVIDEO_LIBS) else xv_source = xv_libs = endif libgstvideo4linux2_la_SOURCES = gstv4l2.c \ gstv4l2colorbalance.c \ gstv4l2object.c \ gstv4l2bufferpool.c \ gstv4l2src.c \ gstv4l2radio.c \ gstv4l2tuner.c \ gstv4l2vidorient.c \ v4l2_calls.c \ v4l2src_calls.c \ $(xv_source) if BUILD_EXPERIMENTAL libgstvideo4linux2_la_SOURCES += gstv4l2sink.c endif libgstvideo4linux2_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_CFLAGS) \ $(X_CFLAGS) \ $(LIBV4L2_CFLAGS) \ $(GUDEV_CFLAGS) libgstvideo4linux2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideo4linux2_la_LIBTOOLFLAGS = --tag=disable-static libgstvideo4linux2_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-$(GST_MAJORMINOR) \ -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_LIBS) \ $(xv_libs) \ $(LIBV4L2_LIBS) \ $(GUDEV_LIBS) noinst_HEADERS = \ gstv4l2bufferpool.h \ gstv4l2colorbalance.h \ gstv4l2object.h \ gstv4l2sink.h \ gstv4l2src.h \ gstv4l2radio.h \ gstv4l2tuner.h \ gstv4l2vidorient.h \ gstv4l2xoverlay.h \ v4l2_calls.h \ v4l2src_calls.h gst-plugins-good-0.10.31/sys/v4l2/gstv4l2object.c0000644000175000017500000020106511677341661016264 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * * gstv4l2object.c: base class for V4L2 elements * * 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 #endif #include #include #include #include #include #ifdef HAVE_GUDEV #include #endif #include "v4l2_calls.h" #include "gstv4l2tuner.h" #ifdef HAVE_XVIDEO #include "gstv4l2xoverlay.h" #endif #include "gstv4l2colorbalance.h" #include "gst/gst-i18n-plugin.h" /* videodev2.h is not versioned and we can't easily check for the presence * of enum values at compile time, but the V4L2_CAP_VIDEO_OUTPUT_OVERLAY define * was added in the same commit as V4L2_FIELD_INTERLACED_{TB,BT} (b2787845) */ #ifndef V4L2_CAP_VIDEO_OUTPUT_OVERLAY #define V4L2_FIELD_INTERLACED_TB 8 #define V4L2_FIELD_INTERLACED_BT 9 #endif GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); #define GST_CAT_DEFAULT v4l2_debug #define DEFAULT_PROP_DEVICE_NAME NULL #define DEFAULT_PROP_DEVICE_FD -1 #define DEFAULT_PROP_FLAGS 0 #define DEFAULT_PROP_TV_NORM 0 #define DEFAULT_PROP_CHANNEL NULL #define DEFAULT_PROP_FREQUENCY 0 enum { PROP_0, V4L2_STD_OBJECT_PROPS, }; G_LOCK_DEFINE_STATIC (probe_lock); const GList * gst_v4l2_probe_get_properties (GstPropertyProbe * probe) { GObjectClass *klass = G_OBJECT_GET_CLASS (probe); static GList *list = NULL; /* well, not perfect, but better than no locking at all. * In the worst case we leak a list node, so who cares? */ G_LOCK (probe_lock); if (!list) { list = g_list_append (NULL, g_object_class_find_property (klass, "device")); } G_UNLOCK (probe_lock); return list; } static gboolean init = FALSE; static GList *devices = NULL; #ifdef HAVE_GUDEV static gboolean gst_v4l2_class_probe_devices_with_udev (GstElementClass * klass, gboolean check, GList ** klass_devices) { GUdevClient *client = NULL; GList *item; if (!check) { while (devices) { gchar *device = devices->data; devices = g_list_remove (devices, device); g_free (device); } GST_INFO ("Enumerating video4linux devices from udev"); client = g_udev_client_new (NULL); if (!client) { GST_WARNING ("Failed to initialize gudev client"); goto finish; } item = g_udev_client_query_by_subsystem (client, "video4linux"); while (item) { GUdevDevice *device = item->data; gchar *devnode = g_strdup (g_udev_device_get_device_file (device)); gint api = g_udev_device_get_property_as_int (device, "ID_V4L_VERSION"); GST_INFO ("Found new device: %s, API: %d", devnode, api); /* Append v4l2 devices only. If api is 0 probably v4l_id has been stripped out of the current udev installation, append anyway */ if (api == 0) { GST_WARNING ("Couldn't retrieve ID_V4L_VERSION, silly udev installation?"); } if ((api == 2 || api == 0)) { devices = g_list_append (devices, devnode); } else { g_free (devnode); } g_object_unref (device); item = item->next; } g_list_free (item); init = TRUE; } finish: if (client) { g_object_unref (client); } *klass_devices = devices; return init; } #endif /* HAVE_GUDEV */ static gboolean gst_v4l2_class_probe_devices (GstElementClass * klass, gboolean check, GList ** klass_devices) { if (!check) { const gchar *dev_base[] = { "/dev/video", "/dev/v4l2/video", NULL }; gint base, n, fd; while (devices) { gchar *device = devices->data; devices = g_list_remove (devices, device); g_free (device); } /* * detect /dev entries */ for (n = 0; n < 64; n++) { for (base = 0; dev_base[base] != NULL; base++) { struct stat s; gchar *device = g_strdup_printf ("%s%d", dev_base[base], n); /* * does the /dev/ entry exist at all? */ if (stat (device, &s) == 0) { /* * yes: is a device attached? */ if (S_ISCHR (s.st_mode)) { if ((fd = open (device, O_RDWR | O_NONBLOCK)) > 0 || errno == EBUSY) { if (fd > 0) close (fd); devices = g_list_append (devices, device); break; } } } g_free (device); } } init = TRUE; } *klass_devices = devices; return init; } void gst_v4l2_probe_probe_property (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec, GList ** klass_devices) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); switch (prop_id) { case PROP_DEVICE: #ifdef HAVE_GUDEV if (!gst_v4l2_class_probe_devices_with_udev (klass, FALSE, klass_devices)) gst_v4l2_class_probe_devices (klass, FALSE, klass_devices); #else /* !HAVE_GUDEV */ gst_v4l2_class_probe_devices (klass, FALSE, klass_devices); #endif /* HAVE_GUDEV */ break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); break; } } gboolean gst_v4l2_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec, GList ** klass_devices) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); gboolean ret = FALSE; switch (prop_id) { case PROP_DEVICE: #ifdef HAVE_GUDEV ret = !gst_v4l2_class_probe_devices_with_udev (klass, FALSE, klass_devices); #else /* !HAVE_GUDEV */ ret = !gst_v4l2_class_probe_devices (klass, TRUE, klass_devices); #endif /* HAVE_GUDEV */ break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); break; } return ret; } static GValueArray * gst_v4l2_class_list_devices (GstElementClass * klass, GList ** klass_devices) { GValueArray *array; GValue value = { 0 }; GList *item; if (!*klass_devices) return NULL; array = g_value_array_new (g_list_length (*klass_devices)); item = *klass_devices; g_value_init (&value, G_TYPE_STRING); while (item) { gchar *device = item->data; g_value_set_string (&value, device); g_value_array_append (array, &value); item = item->next; } g_value_unset (&value); return array; } GValueArray * gst_v4l2_probe_get_values (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec, GList ** klass_devices) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); GValueArray *array = NULL; switch (prop_id) { case PROP_DEVICE: array = gst_v4l2_class_list_devices (klass, klass_devices); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); break; } return array; } #define GST_TYPE_V4L2_DEVICE_FLAGS (gst_v4l2_device_get_type ()) static GType gst_v4l2_device_get_type (void) { static GType v4l2_device_type = 0; if (v4l2_device_type == 0) { static const GFlagsValue values[] = { {V4L2_CAP_VIDEO_CAPTURE, "Device supports video capture", "capture"}, {V4L2_CAP_VIDEO_OUTPUT, "Device supports video playback", "output"}, {V4L2_CAP_VIDEO_OVERLAY, "Device supports video overlay", "overlay"}, {V4L2_CAP_VBI_CAPTURE, "Device supports the VBI capture", "vbi-capture"}, {V4L2_CAP_VBI_OUTPUT, "Device supports the VBI output", "vbi-output"}, {V4L2_CAP_TUNER, "Device has a tuner or modulator", "tuner"}, {V4L2_CAP_AUDIO, "Device has audio inputs or outputs", "audio"}, {0, NULL, NULL} }; v4l2_device_type = g_flags_register_static ("GstV4l2DeviceTypeFlags", values); } return v4l2_device_type; } #define GST_TYPE_V4L2_TV_NORM (gst_v4l2_tv_norm_get_type ()) static GType gst_v4l2_tv_norm_get_type (void) { static GType v4l2_tv_norm = 0; if (!v4l2_tv_norm) { static const GEnumValue tv_norms[] = { {0, "none", "none"}, {V4L2_STD_NTSC, "NTSC", "NTSC"}, {V4L2_STD_NTSC_M, "NTSC-M", "NTSC-M"}, {V4L2_STD_NTSC_M_JP, "NTSC-M-JP", "NTSC-M-JP"}, {V4L2_STD_NTSC_M_KR, "NTSC-M-KR", "NTSC-M-KR"}, {V4L2_STD_NTSC_443, "NTSC-443", "NTSC-443"}, {V4L2_STD_PAL, "PAL", "PAL"}, {V4L2_STD_PAL_BG, "PAL-BG", "PAL-BG"}, {V4L2_STD_PAL_B, "PAL-B", "PAL-B"}, {V4L2_STD_PAL_B1, "PAL-B1", "PAL-B1"}, {V4L2_STD_PAL_G, "PAL-G", "PAL-G"}, {V4L2_STD_PAL_H, "PAL-H", "PAL-H"}, {V4L2_STD_PAL_I, "PAL-I", "PAL-I"}, {V4L2_STD_PAL_DK, "PAL-DK", "PAL-DK"}, {V4L2_STD_PAL_D, "PAL-D", "PAL-D"}, {V4L2_STD_PAL_D1, "PAL-D1", "PAL-D1"}, {V4L2_STD_PAL_K, "PAL-K", "PAL-K"}, {V4L2_STD_PAL_M, "PAL-M", "PAL-M"}, {V4L2_STD_PAL_N, "PAL-N", "PAL-N"}, {V4L2_STD_PAL_Nc, "PAL-Nc", "PAL-Nc"}, {V4L2_STD_PAL_60, "PAL-60", "PAL-60"}, {V4L2_STD_SECAM, "SECAM", "SECAM"}, {V4L2_STD_SECAM_B, "SECAM-B", "SECAM-B"}, {V4L2_STD_SECAM_G, "SECAM-G", "SECAM-G"}, {V4L2_STD_SECAM_H, "SECAM-H", "SECAM-H"}, {V4L2_STD_SECAM_DK, "SECAM-DK", "SECAM-DK"}, {V4L2_STD_SECAM_D, "SECAM-D", "SECAM-D"}, {V4L2_STD_SECAM_K, "SECAM-K", "SECAM-K"}, {V4L2_STD_SECAM_K1, "SECAM-K1", "SECAM-K1"}, {V4L2_STD_SECAM_L, "SECAM-L", "SECAM-L"}, {V4L2_STD_SECAM_LC, "SECAM-Lc", "SECAM-Lc"}, {0, NULL, NULL} }; v4l2_tv_norm = g_enum_register_static ("V4L2_TV_norms", tv_norms); } return v4l2_tv_norm; } void gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, const char *default_device) { g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "Device location", default_device, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Name of the device", DEFAULT_PROP_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_FD, g_param_spec_int ("device-fd", "File descriptor", "File descriptor of the device", -1, G_MAXINT, DEFAULT_PROP_DEVICE_FD, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FLAGS, g_param_spec_flags ("flags", "Flags", "Device type flags", GST_TYPE_V4L2_DEVICE_FLAGS, DEFAULT_PROP_FLAGS, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * GstV4l2Src:brightness * * Picture brightness, or more precisely, the black level * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_BRIGHTNESS, g_param_spec_int ("brightness", "Brightness", "Picture brightness, or more precisely, the black level", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); /** * GstV4l2Src:contrast * * Picture contrast or luma gain * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_CONTRAST, g_param_spec_int ("contrast", "Contrast", "Picture contrast or luma gain", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); /** * GstV4l2Src:saturation * * Picture color saturation or chroma gain * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_SATURATION, g_param_spec_int ("saturation", "Saturation", "Picture color saturation or chroma gain", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); /** * GstV4l2Src:hue * * Hue or color balance * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_HUE, g_param_spec_int ("hue", "Hue", "Hue or color balance", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); /** * GstV4l2Src:norm * * TV norm * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_TV_NORM, g_param_spec_enum ("norm", "TV norm", "video standard", GST_TYPE_V4L2_TV_NORM, DEFAULT_PROP_TV_NORM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } GstV4l2Object * gst_v4l2_object_new (GstElement * element, enum v4l2_buf_type type, const char *default_device, GstV4l2GetInOutFunction get_in_out_func, GstV4l2SetInOutFunction set_in_out_func, GstV4l2UpdateFpsFunction update_fps_func) { GstV4l2Object *v4l2object; /* * some default values */ v4l2object = g_new0 (GstV4l2Object, 1); v4l2object->type = type; v4l2object->formats = NULL; v4l2object->element = element; v4l2object->get_in_out_func = get_in_out_func; v4l2object->set_in_out_func = set_in_out_func; v4l2object->update_fps_func = update_fps_func; v4l2object->video_fd = -1; v4l2object->poll = gst_poll_new (TRUE); v4l2object->buffer = NULL; v4l2object->videodev = g_strdup (default_device); v4l2object->norms = NULL; v4l2object->channels = NULL; v4l2object->colors = NULL; v4l2object->xwindow_id = 0; return v4l2object; } static gboolean gst_v4l2_object_clear_format_list (GstV4l2Object * v4l2object); void gst_v4l2_object_destroy (GstV4l2Object * v4l2object) { g_return_if_fail (v4l2object != NULL); if (v4l2object->videodev) g_free (v4l2object->videodev); if (v4l2object->poll) gst_poll_free (v4l2object->poll); if (v4l2object->channel) g_free (v4l2object->channel); if (v4l2object->formats) { gst_v4l2_object_clear_format_list (v4l2object); } g_free (v4l2object); } static gboolean gst_v4l2_object_clear_format_list (GstV4l2Object * v4l2object) { g_slist_foreach (v4l2object->formats, (GFunc) g_free, NULL); g_slist_free (v4l2object->formats); v4l2object->formats = NULL; return TRUE; } static gint gst_v4l2_object_prop_to_cid (guint prop_id) { gint cid = -1; switch (prop_id) { case PROP_BRIGHTNESS: cid = V4L2_CID_BRIGHTNESS; break; case PROP_CONTRAST: cid = V4L2_CID_CONTRAST; break; case PROP_SATURATION: cid = V4L2_CID_SATURATION; break; case PROP_HUE: cid = V4L2_CID_HUE; break; default: GST_WARNING ("unmapped property id: %d", prop_id); } return cid; } gboolean gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object, guint prop_id, const GValue * value, GParamSpec * pspec) { switch (prop_id) { case PROP_DEVICE: g_free (v4l2object->videodev); v4l2object->videodev = g_value_dup_string (value); break; case PROP_BRIGHTNESS: case PROP_CONTRAST: case PROP_SATURATION: case PROP_HUE: { gint cid = gst_v4l2_object_prop_to_cid (prop_id); if (cid != -1) { if (GST_V4L2_IS_OPEN (v4l2object)) { gst_v4l2_set_attribute (v4l2object, cid, g_value_get_int (value)); } } return TRUE; } break; case PROP_TV_NORM: v4l2object->tv_norm = g_value_get_enum (value); break; #if 0 case PROP_CHANNEL: if (GST_V4L2_IS_OPEN (v4l2object)) { GstTuner *tuner = GST_TUNER (v4l2object->element); GstTunerChannel *channel = gst_tuner_find_channel_by_name (tuner, (gchar *) g_value_get_string (value)); if (channel) { /* like gst_tuner_set_channel (tuner, channel) without g_object_notify */ gst_v4l2_tuner_set_channel (v4l2object, channel); } } else { g_free (v4l2object->channel); v4l2object->channel = g_value_dup_string (value); } break; case PROP_FREQUENCY: if (GST_V4L2_IS_OPEN (v4l2object)) { GstTuner *tuner = GST_TUNER (v4l2object->element); GstTunerChannel *channel = gst_tuner_get_channel (tuner); if (channel && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { /* like gst_tuner_set_frequency (tuner, channel, g_value_get_ulong (value)) without g_object_notify */ gst_v4l2_tuner_set_frequency (v4l2object, channel, g_value_get_ulong (value)); } } else { v4l2object->frequency = g_value_get_ulong (value); } break; #endif default: return FALSE; break; } return TRUE; } gboolean gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object, guint prop_id, GValue * value, GParamSpec * pspec) { switch (prop_id) { case PROP_DEVICE: g_value_set_string (value, v4l2object->videodev); break; case PROP_DEVICE_NAME: { const guchar *new = NULL; if (GST_V4L2_IS_OPEN (v4l2object)) { new = v4l2object->vcap.card; } else if (gst_v4l2_open (v4l2object)) { new = v4l2object->vcap.card; gst_v4l2_close (v4l2object); } g_value_set_string (value, (gchar *) new); break; } case PROP_DEVICE_FD: { if (GST_V4L2_IS_OPEN (v4l2object)) g_value_set_int (value, v4l2object->video_fd); else g_value_set_int (value, DEFAULT_PROP_DEVICE_FD); break; } case PROP_FLAGS: { guint flags = 0; if (GST_V4L2_IS_OPEN (v4l2object)) { flags |= v4l2object->vcap.capabilities & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VBI_OUTPUT | V4L2_CAP_TUNER | V4L2_CAP_AUDIO); } g_value_set_flags (value, flags); break; } case PROP_BRIGHTNESS: case PROP_CONTRAST: case PROP_SATURATION: case PROP_HUE: { gint cid = gst_v4l2_object_prop_to_cid (prop_id); if (cid != -1) { if (GST_V4L2_IS_OPEN (v4l2object)) { gint v; if (gst_v4l2_get_attribute (v4l2object, cid, &v)) { g_value_set_int (value, v); } } } return TRUE; } break; case PROP_TV_NORM: g_value_set_enum (value, v4l2object->tv_norm); break; default: return FALSE; break; } return TRUE; } static void gst_v4l2_set_defaults (GstV4l2Object * v4l2object) { GstTunerNorm *norm = NULL; GstTunerChannel *channel = NULL; GstTuner *tuner; if (!GST_IS_TUNER (v4l2object->element)) return; tuner = GST_TUNER (v4l2object->element); if (v4l2object->tv_norm) norm = gst_v4l2_tuner_get_norm_by_std_id (v4l2object, v4l2object->tv_norm); GST_DEBUG_OBJECT (v4l2object->element, "tv_norm=0x%" G_GINT64_MODIFIER "x, " "norm=%p", (guint64) v4l2object->tv_norm, norm); if (norm) { gst_tuner_set_norm (tuner, norm); } else { norm = GST_TUNER_NORM (gst_tuner_get_norm (GST_TUNER (v4l2object->element))); if (norm) { v4l2object->tv_norm = gst_v4l2_tuner_get_std_id_by_norm (v4l2object, norm); gst_tuner_norm_changed (tuner, norm); } } if (v4l2object->channel) channel = gst_tuner_find_channel_by_name (tuner, v4l2object->channel); if (channel) { gst_tuner_set_channel (tuner, channel); } else { channel = GST_TUNER_CHANNEL (gst_tuner_get_channel (GST_TUNER (v4l2object->element))); if (channel) { g_free (v4l2object->channel); v4l2object->channel = g_strdup (channel->label); gst_tuner_channel_changed (tuner, channel); } } if (channel && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { if (v4l2object->frequency != 0) { gst_tuner_set_frequency (tuner, channel, v4l2object->frequency); } else { v4l2object->frequency = gst_tuner_get_frequency (tuner, channel); if (v4l2object->frequency == 0) { /* guess */ gst_tuner_set_frequency (tuner, channel, 1000); } else { } } } } gboolean gst_v4l2_object_start (GstV4l2Object * v4l2object) { if (gst_v4l2_open (v4l2object)) gst_v4l2_set_defaults (v4l2object); else return FALSE; #ifdef HAVE_XVIDEO gst_v4l2_xoverlay_start (v4l2object); #endif return TRUE; } gboolean gst_v4l2_object_stop (GstV4l2Object * v4l2object) { #ifdef HAVE_XVIDEO gst_v4l2_xoverlay_stop (v4l2object); #endif if (!gst_v4l2_close (v4l2object)) return FALSE; if (v4l2object->formats) { gst_v4l2_object_clear_format_list (v4l2object); } return TRUE; } /* * common format / caps utilities: */ typedef struct { guint32 format; gboolean dimensions; } GstV4L2FormatDesc; static const GstV4L2FormatDesc gst_v4l2_formats[] = { /* from Linux 2.6.15 videodev2.h */ {V4L2_PIX_FMT_RGB332, TRUE}, {V4L2_PIX_FMT_RGB555, TRUE}, {V4L2_PIX_FMT_RGB565, TRUE}, {V4L2_PIX_FMT_RGB555X, TRUE}, {V4L2_PIX_FMT_RGB565X, TRUE}, {V4L2_PIX_FMT_BGR24, TRUE}, {V4L2_PIX_FMT_RGB24, TRUE}, {V4L2_PIX_FMT_BGR32, TRUE}, {V4L2_PIX_FMT_RGB32, TRUE}, {V4L2_PIX_FMT_GREY, TRUE}, {V4L2_PIX_FMT_YVU410, TRUE}, {V4L2_PIX_FMT_YVU420, TRUE}, {V4L2_PIX_FMT_YUYV, TRUE}, {V4L2_PIX_FMT_UYVY, TRUE}, {V4L2_PIX_FMT_YUV422P, TRUE}, {V4L2_PIX_FMT_YUV411P, TRUE}, {V4L2_PIX_FMT_Y41P, TRUE}, /* two planes -- one Y, one Cr + Cb interleaved */ {V4L2_PIX_FMT_NV12, TRUE}, {V4L2_PIX_FMT_NV21, TRUE}, /* The following formats are not defined in the V4L2 specification */ {V4L2_PIX_FMT_YUV410, TRUE}, {V4L2_PIX_FMT_YUV420, TRUE}, {V4L2_PIX_FMT_YYUV, TRUE}, {V4L2_PIX_FMT_HI240, TRUE}, /* see http://www.siliconimaging.com/RGB%20Bayer.htm */ #ifdef V4L2_PIX_FMT_SBGGR8 {V4L2_PIX_FMT_SBGGR8, TRUE}, #endif /* compressed formats */ {V4L2_PIX_FMT_MJPEG, TRUE}, {V4L2_PIX_FMT_JPEG, TRUE}, #ifdef V4L2_PIX_FMT_PJPG {V4L2_PIX_FMT_PJPG, TRUE}, #endif {V4L2_PIX_FMT_DV, TRUE}, {V4L2_PIX_FMT_MPEG, FALSE}, /* Vendor-specific formats */ {V4L2_PIX_FMT_WNVA, TRUE}, #ifdef V4L2_PIX_FMT_SN9C10X {V4L2_PIX_FMT_SN9C10X, TRUE}, #endif #ifdef V4L2_PIX_FMT_PWC1 {V4L2_PIX_FMT_PWC1, TRUE}, #endif #ifdef V4L2_PIX_FMT_PWC2 {V4L2_PIX_FMT_PWC2, TRUE}, #endif #ifdef V4L2_PIX_FMT_YVYU {V4L2_PIX_FMT_YVYU, TRUE}, #endif }; #define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats)) static struct v4l2_fmtdesc * gst_v4l2_object_get_format_from_fourcc (GstV4l2Object * v4l2object, guint32 fourcc) { struct v4l2_fmtdesc *fmt; GSList *walk; if (fourcc == 0) return NULL; walk = gst_v4l2_object_get_format_list (v4l2object); while (walk) { fmt = (struct v4l2_fmtdesc *) walk->data; if (fmt->pixelformat == fourcc) return fmt; /* special case for jpeg */ if (fmt->pixelformat == V4L2_PIX_FMT_MJPEG || fmt->pixelformat == V4L2_PIX_FMT_JPEG #ifdef V4L2_PIX_FMT_PJPG || fmt->pixelformat == V4L2_PIX_FMT_PJPG #endif ) { if (fourcc == V4L2_PIX_FMT_JPEG || fourcc == V4L2_PIX_FMT_MJPEG #ifdef V4L2_PIX_FMT_PJPG || fourcc == V4L2_PIX_FMT_PJPG #endif ) { return fmt; } } walk = g_slist_next (walk); } return NULL; } /* complete made up ranking, the values themselves are meaningless */ /* These ranks MUST be X such that X<<15 fits on a signed int - see the comment at the end of gst_v4l2_object_format_get_rank. */ #define YUV_BASE_RANK 1000 #define JPEG_BASE_RANK 500 #define DV_BASE_RANK 200 #define RGB_BASE_RANK 100 #define YUV_ODD_BASE_RANK 50 #define RGB_ODD_BASE_RANK 25 #define BAYER_BASE_RANK 15 #define S910_BASE_RANK 10 #define GREY_BASE_RANK 5 #define PWC_BASE_RANK 1 /* This flag is already used by libv4l2 although * it was added to the Linux kernel in 2.6.32 */ #ifndef V4L2_FMT_FLAG_EMULATED #define V4L2_FMT_FLAG_EMULATED 0x0002 #endif static gint gst_v4l2_object_format_get_rank (const struct v4l2_fmtdesc *fmt) { guint32 fourcc = fmt->pixelformat; gboolean emulated = ((fmt->flags & V4L2_FMT_FLAG_EMULATED) != 0); gint rank = 0; switch (fourcc) { case V4L2_PIX_FMT_MJPEG: #ifdef V4L2_PIX_FMT_PJPG case V4L2_PIX_FMT_PJPG: rank = JPEG_BASE_RANK; break; #endif case V4L2_PIX_FMT_JPEG: rank = JPEG_BASE_RANK + 1; break; case V4L2_PIX_FMT_MPEG: /* MPEG */ rank = JPEG_BASE_RANK + 2; break; case V4L2_PIX_FMT_RGB332: case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555X: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565X: rank = RGB_ODD_BASE_RANK; break; case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: rank = RGB_BASE_RANK - 1; break; case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_BGR32: rank = RGB_BASE_RANK; break; case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ rank = GREY_BASE_RANK; break; case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ rank = YUV_ODD_BASE_RANK; break; case V4L2_PIX_FMT_YVU410: /* YVU9, 9 bits per pixel */ rank = YUV_BASE_RANK + 3; break; case V4L2_PIX_FMT_YUV410: /* YUV9, 9 bits per pixel */ rank = YUV_BASE_RANK + 2; break; case V4L2_PIX_FMT_YUV420: /* I420, 12 bits per pixel */ rank = YUV_BASE_RANK + 7; break; case V4L2_PIX_FMT_YUYV: /* YUY2, 16 bits per pixel */ rank = YUV_BASE_RANK + 10; break; case V4L2_PIX_FMT_YVU420: /* YV12, 12 bits per pixel */ rank = YUV_BASE_RANK + 6; break; case V4L2_PIX_FMT_UYVY: /* UYVY, 16 bits per pixel */ rank = YUV_BASE_RANK + 9; break; case V4L2_PIX_FMT_Y41P: /* Y41P, 12 bits per pixel */ rank = YUV_BASE_RANK + 5; break; case V4L2_PIX_FMT_YUV411P: /* Y41B, 12 bits per pixel */ rank = YUV_BASE_RANK + 4; break; case V4L2_PIX_FMT_YUV422P: /* Y42B, 16 bits per pixel */ rank = YUV_BASE_RANK + 8; break; case V4L2_PIX_FMT_DV: rank = DV_BASE_RANK; break; case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ rank = 0; break; #ifdef V4L2_PIX_FMT_SBGGR8 case V4L2_PIX_FMT_SBGGR8: rank = BAYER_BASE_RANK; break; #endif #ifdef V4L2_PIX_FMT_SN9C10X case V4L2_PIX_FMT_SN9C10X: rank = S910_BASE_RANK; break; #endif #ifdef V4L2_PIX_FMT_PWC1 case V4L2_PIX_FMT_PWC1: rank = PWC_BASE_RANK; break; #endif #ifdef V4L2_PIX_FMT_PWC2 case V4L2_PIX_FMT_PWC2: rank = PWC_BASE_RANK; break; #endif default: rank = 0; break; } /* All ranks are below 1<<15 so a shift by 15 * will a) make all non-emulated formats larger * than emulated and b) will not overflow */ if (!emulated) rank <<= 15; return rank; } static gint format_cmp_func (gconstpointer a, gconstpointer b) { const struct v4l2_fmtdesc *fa = a; const struct v4l2_fmtdesc *fb = b; if (fa->pixelformat == fb->pixelformat) return 0; return gst_v4l2_object_format_get_rank (fb) - gst_v4l2_object_format_get_rank (fa); } /****************************************************** * gst_v4l2_object_fill_format_list(): * create list of supported capture formats * return value: TRUE on success, FALSE on error ******************************************************/ static gboolean gst_v4l2_object_fill_format_list (GstV4l2Object * v4l2object) { gint n; struct v4l2_fmtdesc *format; GST_DEBUG_OBJECT (v4l2object->element, "getting src format enumerations"); /* format enumeration */ for (n = 0;; n++) { format = g_new0 (struct v4l2_fmtdesc, 1); format->index = n; format->type = v4l2object->type; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUM_FMT, format) < 0) { if (errno == EINVAL) { g_free (format); break; /* end of enumeration */ } else { goto failed; } } GST_LOG_OBJECT (v4l2object->element, "index: %u", format->index); GST_LOG_OBJECT (v4l2object->element, "type: %d", format->type); GST_LOG_OBJECT (v4l2object->element, "flags: %08x", format->flags); GST_LOG_OBJECT (v4l2object->element, "description: '%s'", format->description); GST_LOG_OBJECT (v4l2object->element, "pixelformat: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format->pixelformat)); /* sort formats according to our preference; we do this, because caps * are probed in the order the formats are in the list, and the order of * formats in the final probed caps matters for things like fixation */ v4l2object->formats = g_slist_insert_sorted (v4l2object->formats, format, (GCompareFunc) format_cmp_func); } #ifndef GST_DISABLE_GST_DEBUG { GSList *l; GST_INFO_OBJECT (v4l2object->element, "got %d format(s):", n); for (l = v4l2object->formats; l != NULL; l = l->next) { format = l->data; GST_INFO_OBJECT (v4l2object->element, " %" GST_FOURCC_FORMAT "%s", GST_FOURCC_ARGS (format->pixelformat), ((format->flags & V4L2_FMT_FLAG_EMULATED)) ? " (emulated)" : ""); } } #endif return TRUE; /* ERRORS */ failed: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to enumerate possible video formats device '%s' can work with"), v4l2object->videodev), ("Failed to get number %d in pixelformat enumeration for %s. (%d - %s)", n, v4l2object->videodev, errno, g_strerror (errno))); g_free (format); return FALSE; } } /* * Get the list of supported capture formats, a list of * struct v4l2_fmtdesc. */ GSList * gst_v4l2_object_get_format_list (GstV4l2Object * v4l2object) { if (!v4l2object->formats) gst_v4l2_object_fill_format_list (v4l2object); return v4l2object->formats; } GstStructure * gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc) { GstStructure *structure = NULL; switch (fourcc) { case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */ #ifdef V4L2_PIX_FMT_PJPG case V4L2_PIX_FMT_PJPG: /* Progressive-JPEG */ #endif case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */ structure = gst_structure_new ("image/jpeg", NULL); break; case V4L2_PIX_FMT_RGB332: case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555X: case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565X: case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_BGR32:{ guint depth = 0, bpp = 0; gint endianness = 0; guint32 r_mask = 0, b_mask = 0, g_mask = 0; switch (fourcc) { case V4L2_PIX_FMT_RGB332: bpp = depth = 8; endianness = G_BYTE_ORDER; /* 'like, whatever' */ r_mask = 0xe0; g_mask = 0x1c; b_mask = 0x03; break; case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555X: bpp = 16; depth = 15; endianness = fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; r_mask = 0x7c00; g_mask = 0x03e0; b_mask = 0x001f; break; case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565X: bpp = depth = 16; endianness = fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN; r_mask = 0xf800; g_mask = 0x07e0; b_mask = 0x001f; break; case V4L2_PIX_FMT_RGB24: bpp = depth = 24; endianness = G_BIG_ENDIAN; r_mask = 0xff0000; g_mask = 0x00ff00; b_mask = 0x0000ff; break; case V4L2_PIX_FMT_BGR24: bpp = depth = 24; endianness = G_BIG_ENDIAN; r_mask = 0x0000ff; g_mask = 0x00ff00; b_mask = 0xff0000; break; case V4L2_PIX_FMT_RGB32: bpp = depth = 32; endianness = G_BIG_ENDIAN; r_mask = 0xff000000; g_mask = 0x00ff0000; b_mask = 0x0000ff00; break; case V4L2_PIX_FMT_BGR32: bpp = depth = 32; endianness = G_BIG_ENDIAN; r_mask = 0x000000ff; g_mask = 0x0000ff00; b_mask = 0x00ff0000; break; default: g_assert_not_reached (); break; } structure = gst_structure_new ("video/x-raw-rgb", "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, "red_mask", G_TYPE_INT, r_mask, "green_mask", G_TYPE_INT, g_mask, "blue_mask", G_TYPE_INT, b_mask, "endianness", G_TYPE_INT, endianness, NULL); break; } case V4L2_PIX_FMT_GREY: /* 8 Greyscale */ structure = gst_structure_new ("video/x-raw-gray", "bpp", G_TYPE_INT, 8, NULL); break; case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */ case V4L2_PIX_FMT_HI240: /* 8 8-bit color */ /* FIXME: get correct fourccs here */ break; case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */ case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */ case V4L2_PIX_FMT_YVU410: case V4L2_PIX_FMT_YUV410: case V4L2_PIX_FMT_YUV420: /* I420/IYUV */ case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YVU420: case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_Y41P: case V4L2_PIX_FMT_YUV422P: #ifdef V4L2_PIX_FMT_YVYU case V4L2_PIX_FMT_YVYU: #endif case V4L2_PIX_FMT_YUV411P:{ guint32 fcc = 0; switch (fourcc) { case V4L2_PIX_FMT_NV12: fcc = GST_MAKE_FOURCC ('N', 'V', '1', '2'); break; case V4L2_PIX_FMT_NV21: fcc = GST_MAKE_FOURCC ('N', 'V', '2', '1'); break; case V4L2_PIX_FMT_YVU410: fcc = GST_MAKE_FOURCC ('Y', 'V', 'U', '9'); break; case V4L2_PIX_FMT_YUV410: fcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9'); break; case V4L2_PIX_FMT_YUV420: fcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); break; case V4L2_PIX_FMT_YUYV: fcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); break; case V4L2_PIX_FMT_YVU420: fcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); break; case V4L2_PIX_FMT_UYVY: fcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); break; case V4L2_PIX_FMT_Y41P: fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'P'); break; case V4L2_PIX_FMT_YUV411P: fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); break; case V4L2_PIX_FMT_YUV422P: fcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B'); break; #ifdef V4L2_PIX_FMT_YVYU case V4L2_PIX_FMT_YVYU: fcc = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'); break; #endif default: g_assert_not_reached (); break; } structure = gst_structure_new ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, fcc, NULL); break; } case V4L2_PIX_FMT_DV: structure = gst_structure_new ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); break; case V4L2_PIX_FMT_MPEG: /* MPEG */ structure = gst_structure_new ("video/mpegts", NULL); break; case V4L2_PIX_FMT_WNVA: /* Winnov hw compres */ break; #ifdef V4L2_PIX_FMT_SBGGR8 case V4L2_PIX_FMT_SBGGR8: structure = gst_structure_new ("video/x-raw-bayer", NULL); break; #endif #ifdef V4L2_PIX_FMT_SN9C10X case V4L2_PIX_FMT_SN9C10X: structure = gst_structure_new ("video/x-sonix", NULL); break; #endif #ifdef V4L2_PIX_FMT_PWC1 case V4L2_PIX_FMT_PWC1: structure = gst_structure_new ("video/x-pwc1", NULL); break; #endif #ifdef V4L2_PIX_FMT_PWC2 case V4L2_PIX_FMT_PWC2: structure = gst_structure_new ("video/x-pwc2", NULL); break; #endif default: GST_DEBUG ("Unknown fourcc 0x%08x %" GST_FOURCC_FORMAT, fourcc, GST_FOURCC_ARGS (fourcc)); break; } return structure; } GstCaps * gst_v4l2_object_get_all_caps (void) { static GstCaps *caps = NULL; if (caps == NULL) { GstStructure *structure; guint i; caps = gst_caps_new_empty (); for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) { structure = gst_v4l2_object_v4l2fourcc_to_structure (gst_v4l2_formats[i].format); if (structure) { if (gst_v4l2_formats[i].dimensions) { gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE, "height", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL); } gst_caps_append_structure (caps, structure); } } } return gst_caps_ref (caps); } /* collect data for the given caps * @caps: given input caps * @format: location for the v4l format * @w/@h: location for width and height * @fps_n/@fps_d: location for framerate * @size: location for expected size of the frame or 0 if unknown */ gboolean gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, struct v4l2_fmtdesc ** format, gint * w, gint * h, gboolean * interlaced, guint * fps_n, guint * fps_d, guint * size) { GstStructure *structure; const GValue *framerate; guint32 fourcc; const gchar *mimetype; guint outsize; /* default unknown values */ fourcc = 0; outsize = 0; structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); if (strcmp (mimetype, "video/mpegts") == 0) { fourcc = V4L2_PIX_FMT_MPEG; *fps_n = 0; *fps_d = 1; goto done; } if (!gst_structure_get_int (structure, "width", w)) return FALSE; if (!gst_structure_get_int (structure, "height", h)) return FALSE; if (!gst_structure_get_boolean (structure, "interlaced", interlaced)) *interlaced = FALSE; framerate = gst_structure_get_value (structure, "framerate"); if (!framerate) return FALSE; *fps_n = gst_value_get_fraction_numerator (framerate); *fps_d = gst_value_get_fraction_denominator (framerate); if (!strcmp (mimetype, "video/x-raw-yuv")) { gst_structure_get_fourcc (structure, "format", &fourcc); switch (fourcc) { case GST_MAKE_FOURCC ('I', '4', '2', '0'): case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): fourcc = V4L2_PIX_FMT_YUV420; outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * (GST_ROUND_UP_2 (*h) / 2)); break; case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): fourcc = V4L2_PIX_FMT_YUYV; outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; break; case GST_MAKE_FOURCC ('Y', '4', '1', 'P'): fourcc = V4L2_PIX_FMT_Y41P; outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; break; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): fourcc = V4L2_PIX_FMT_UYVY; outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; break; case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): fourcc = V4L2_PIX_FMT_YVU420; outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * (GST_ROUND_UP_2 (*h) / 2)); break; case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): fourcc = V4L2_PIX_FMT_YUV411P; outsize = GST_ROUND_UP_4 (*w) * *h; outsize += 2 * ((GST_ROUND_UP_8 (*w) / 4) * *h); break; case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): fourcc = V4L2_PIX_FMT_YUV422P; outsize = GST_ROUND_UP_4 (*w) * *h; outsize += 2 * ((GST_ROUND_UP_8 (*w) / 2) * *h); break; case GST_MAKE_FOURCC ('N', 'V', '1', '2'): fourcc = V4L2_PIX_FMT_NV12; outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; break; case GST_MAKE_FOURCC ('N', 'V', '2', '1'): fourcc = V4L2_PIX_FMT_NV21; outsize = GST_ROUND_UP_4 (*w) * GST_ROUND_UP_2 (*h); outsize += (GST_ROUND_UP_4 (*w) * *h) / 2; break; #ifdef V4L2_PIX_FMT_YVYU case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): fourcc = V4L2_PIX_FMT_YVYU; outsize = (GST_ROUND_UP_2 (*w) * 2) * *h; break; #endif } } else if (!strcmp (mimetype, "video/x-raw-rgb")) { gint depth, endianness, r_mask; gst_structure_get_int (structure, "depth", &depth); gst_structure_get_int (structure, "endianness", &endianness); gst_structure_get_int (structure, "red_mask", &r_mask); switch (depth) { case 8: fourcc = V4L2_PIX_FMT_RGB332; break; case 15: fourcc = (endianness == G_LITTLE_ENDIAN) ? V4L2_PIX_FMT_RGB555 : V4L2_PIX_FMT_RGB555X; break; case 16: fourcc = (endianness == G_LITTLE_ENDIAN) ? V4L2_PIX_FMT_RGB565 : V4L2_PIX_FMT_RGB565X; break; case 24: fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR24 : V4L2_PIX_FMT_RGB24; break; case 32: fourcc = (r_mask == 0xFF) ? V4L2_PIX_FMT_BGR32 : V4L2_PIX_FMT_RGB32; break; } } else if (strcmp (mimetype, "video/x-dv") == 0) { fourcc = V4L2_PIX_FMT_DV; } else if (strcmp (mimetype, "image/jpeg") == 0) { fourcc = V4L2_PIX_FMT_JPEG; #ifdef V4L2_PIX_FMT_SBGGR8 } else if (strcmp (mimetype, "video/x-raw-bayer") == 0) { fourcc = V4L2_PIX_FMT_SBGGR8; #endif #ifdef V4L2_PIX_FMT_SN9C10X } else if (strcmp (mimetype, "video/x-sonix") == 0) { fourcc = V4L2_PIX_FMT_SN9C10X; #endif #ifdef V4L2_PIX_FMT_PWC1 } else if (strcmp (mimetype, "video/x-pwc1") == 0) { fourcc = V4L2_PIX_FMT_PWC1; #endif #ifdef V4L2_PIX_FMT_PWC2 } else if (strcmp (mimetype, "video/x-pwc2") == 0) { fourcc = V4L2_PIX_FMT_PWC2; #endif } else if (strcmp (mimetype, "video/x-raw-gray") == 0) { fourcc = V4L2_PIX_FMT_GREY; } if (fourcc == 0) return FALSE; done: *format = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc); *size = outsize; return TRUE; } static gboolean gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, guint32 pixelformat, gint * width, gint * height, gboolean * interlaced); /* The frame interval enumeration code first appeared in Linux 2.6.19. */ #ifdef VIDIOC_ENUM_FRAMEINTERVALS static GstStructure * gst_v4l2_object_probe_caps_for_format_and_size (GstV4l2Object * v4l2object, guint32 pixelformat, guint32 width, guint32 height, const GstStructure * template) { gint fd = v4l2object->video_fd; struct v4l2_frmivalenum ival; guint32 num, denom; GstStructure *s; GValue rates = { 0, }; gboolean interlaced; gint int_width = width; gint int_height = height; /* interlaced detection using VIDIOC_TRY/S_FMT */ if (!gst_v4l2_object_get_nearest_size (v4l2object, pixelformat, &int_width, &int_height, &interlaced)) return NULL; memset (&ival, 0, sizeof (struct v4l2_frmivalenum)); ival.index = 0; ival.pixel_format = pixelformat; ival.width = width; ival.height = height; GST_LOG_OBJECT (v4l2object->element, "get frame interval for %ux%u, %" GST_FOURCC_FORMAT, width, height, GST_FOURCC_ARGS (pixelformat)); /* keep in mind that v4l2 gives us frame intervals (durations); we invert the * fraction to get framerate */ if (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMEINTERVALS, &ival) < 0) goto enum_frameintervals_failed; if (ival.type == V4L2_FRMIVAL_TYPE_DISCRETE) { GValue rate = { 0, }; g_value_init (&rates, GST_TYPE_LIST); g_value_init (&rate, GST_TYPE_FRACTION); do { num = ival.discrete.numerator; denom = ival.discrete.denominator; if (num > G_MAXINT || denom > G_MAXINT) { /* let us hope we don't get here... */ num >>= 1; denom >>= 1; } GST_LOG_OBJECT (v4l2object->element, "adding discrete framerate: %d/%d", denom, num); /* swap to get the framerate */ gst_value_set_fraction (&rate, denom, num); gst_value_list_append_value (&rates, &rate); ival.index++; } while (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMEINTERVALS, &ival) >= 0); } else if (ival.type == V4L2_FRMIVAL_TYPE_STEPWISE) { GValue min = { 0, }; GValue step = { 0, }; GValue max = { 0, }; gboolean added = FALSE; guint32 minnum, mindenom; guint32 maxnum, maxdenom; g_value_init (&rates, GST_TYPE_LIST); g_value_init (&min, GST_TYPE_FRACTION); g_value_init (&step, GST_TYPE_FRACTION); g_value_init (&max, GST_TYPE_FRACTION); /* get the min */ minnum = ival.stepwise.min.numerator; mindenom = ival.stepwise.min.denominator; if (minnum > G_MAXINT || mindenom > G_MAXINT) { minnum >>= 1; mindenom >>= 1; } GST_LOG_OBJECT (v4l2object->element, "stepwise min frame interval: %d/%d", minnum, mindenom); gst_value_set_fraction (&min, minnum, mindenom); /* get the max */ maxnum = ival.stepwise.max.numerator; maxdenom = ival.stepwise.max.denominator; if (maxnum > G_MAXINT || maxdenom > G_MAXINT) { maxnum >>= 1; maxdenom >>= 1; } GST_LOG_OBJECT (v4l2object->element, "stepwise max frame interval: %d/%d", maxnum, maxdenom); gst_value_set_fraction (&max, maxnum, maxdenom); /* get the step */ num = ival.stepwise.step.numerator; denom = ival.stepwise.step.denominator; if (num > G_MAXINT || denom > G_MAXINT) { num >>= 1; denom >>= 1; } if (num == 0 || denom == 0) { /* in this case we have a wrong fraction or no step, set the step to max * so that we only add the min value in the loop below */ num = maxnum; denom = maxdenom; } /* since we only have gst_value_fraction_subtract and not add, negate the * numerator */ GST_LOG_OBJECT (v4l2object->element, "stepwise step frame interval: %d/%d", num, denom); gst_value_set_fraction (&step, -num, denom); while (gst_value_compare (&min, &max) != GST_VALUE_GREATER_THAN) { GValue rate = { 0, }; num = gst_value_get_fraction_numerator (&min); denom = gst_value_get_fraction_denominator (&min); GST_LOG_OBJECT (v4l2object->element, "adding stepwise framerate: %d/%d", denom, num); /* invert to get the framerate */ g_value_init (&rate, GST_TYPE_FRACTION); gst_value_set_fraction (&rate, denom, num); gst_value_list_append_value (&rates, &rate); added = TRUE; /* we're actually adding because step was negated above. This is because * there is no _add function... */ if (!gst_value_fraction_subtract (&min, &min, &step)) { GST_WARNING_OBJECT (v4l2object->element, "could not step fraction!"); break; } } if (!added) { /* no range was added, leave the default range from the template */ GST_WARNING_OBJECT (v4l2object->element, "no range added, leaving default"); g_value_unset (&rates); } } else if (ival.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { guint32 maxnum, maxdenom; g_value_init (&rates, GST_TYPE_FRACTION_RANGE); num = ival.stepwise.min.numerator; denom = ival.stepwise.min.denominator; if (num > G_MAXINT || denom > G_MAXINT) { num >>= 1; denom >>= 1; } maxnum = ival.stepwise.max.numerator; maxdenom = ival.stepwise.max.denominator; if (maxnum > G_MAXINT || maxdenom > G_MAXINT) { maxnum >>= 1; maxdenom >>= 1; } GST_LOG_OBJECT (v4l2object->element, "continuous frame interval %d/%d to %d/%d", maxdenom, maxnum, denom, num); gst_value_set_fraction_range_full (&rates, maxdenom, maxnum, denom, num); } else { goto unknown_type; } return_data: s = gst_structure_copy (template); gst_structure_set (s, "width", G_TYPE_INT, (gint) width, "height", G_TYPE_INT, (gint) height, "interlaced", G_TYPE_BOOLEAN, interlaced, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); if (G_IS_VALUE (&rates)) { /* only change the framerate on the template when we have a valid probed new * value */ gst_structure_set_value (s, "framerate", &rates); g_value_unset (&rates); } else { gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL); } return s; /* ERRORS */ enum_frameintervals_failed: { GST_DEBUG_OBJECT (v4l2object->element, "Unable to enumerate intervals for %" GST_FOURCC_FORMAT "@%ux%u", GST_FOURCC_ARGS (pixelformat), width, height); goto return_data; } unknown_type: { /* I don't see how this is actually an error, we ignore the format then */ GST_WARNING_OBJECT (v4l2object->element, "Unknown frame interval type at %" GST_FOURCC_FORMAT "@%ux%u: %u", GST_FOURCC_ARGS (pixelformat), width, height, ival.type); return NULL; } } #endif /* defined VIDIOC_ENUM_FRAMEINTERVALS */ #ifdef VIDIOC_ENUM_FRAMESIZES static gint sort_by_frame_size (GstStructure * s1, GstStructure * s2) { int w1, h1, w2, h2; gst_structure_get_int (s1, "width", &w1); gst_structure_get_int (s1, "height", &h1); gst_structure_get_int (s2, "width", &w2); gst_structure_get_int (s2, "height", &h2); /* I think it's safe to assume that this won't overflow for a while */ return ((w2 * h2) - (w1 * h1)); } #endif GstCaps * gst_v4l2_object_probe_caps_for_format (GstV4l2Object * v4l2object, guint32 pixelformat, const GstStructure * template) { GstCaps *ret = gst_caps_new_empty (); GstStructure *tmp; #ifdef VIDIOC_ENUM_FRAMESIZES gint fd = v4l2object->video_fd; struct v4l2_frmsizeenum size; GList *results = NULL; guint32 w, h; if (pixelformat == GST_MAKE_FOURCC ('M', 'P', 'E', 'G')) return gst_caps_new_simple ("video/mpegts", NULL); memset (&size, 0, sizeof (struct v4l2_frmsizeenum)); size.index = 0; size.pixel_format = pixelformat; GST_DEBUG_OBJECT (v4l2object->element, "Enumerating frame sizes"); if (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMESIZES, &size) < 0) goto enum_framesizes_failed; if (size.type == V4L2_FRMSIZE_TYPE_DISCRETE) { do { GST_LOG_OBJECT (v4l2object->element, "got discrete frame size %dx%d", size.discrete.width, size.discrete.height); w = MIN (size.discrete.width, G_MAXINT); h = MIN (size.discrete.height, G_MAXINT); if (w && h) { tmp = gst_v4l2_object_probe_caps_for_format_and_size (v4l2object, pixelformat, w, h, template); if (tmp) results = g_list_prepend (results, tmp); } size.index++; } while (v4l2_ioctl (fd, VIDIOC_ENUM_FRAMESIZES, &size) >= 0); GST_DEBUG_OBJECT (v4l2object->element, "done iterating discrete frame sizes"); } else if (size.type == V4L2_FRMSIZE_TYPE_STEPWISE) { GST_DEBUG_OBJECT (v4l2object->element, "we have stepwise frame sizes:"); GST_DEBUG_OBJECT (v4l2object->element, "min width: %d", size.stepwise.min_width); GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", size.stepwise.min_height); GST_DEBUG_OBJECT (v4l2object->element, "max width: %d", size.stepwise.max_width); GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", size.stepwise.max_height); GST_DEBUG_OBJECT (v4l2object->element, "step width: %d", size.stepwise.step_width); GST_DEBUG_OBJECT (v4l2object->element, "step height: %d", size.stepwise.step_height); for (w = size.stepwise.min_width, h = size.stepwise.min_height; w <= size.stepwise.max_width && h <= size.stepwise.max_height; w += size.stepwise.step_width, h += size.stepwise.step_height) { if (w == 0 || h == 0) continue; tmp = gst_v4l2_object_probe_caps_for_format_and_size (v4l2object, pixelformat, w, h, template); if (tmp) results = g_list_prepend (results, tmp); } GST_DEBUG_OBJECT (v4l2object->element, "done iterating stepwise frame sizes"); } else if (size.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { guint32 maxw, maxh; GST_DEBUG_OBJECT (v4l2object->element, "we have continuous frame sizes:"); GST_DEBUG_OBJECT (v4l2object->element, "min width: %d", size.stepwise.min_width); GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", size.stepwise.min_height); GST_DEBUG_OBJECT (v4l2object->element, "max width: %d", size.stepwise.max_width); GST_DEBUG_OBJECT (v4l2object->element, "min height: %d", size.stepwise.max_height); w = MAX (size.stepwise.min_width, 1); h = MAX (size.stepwise.min_height, 1); maxw = MIN (size.stepwise.max_width, G_MAXINT); maxh = MIN (size.stepwise.max_height, G_MAXINT); tmp = gst_v4l2_object_probe_caps_for_format_and_size (v4l2object, pixelformat, w, h, template); if (tmp) { gst_structure_set (tmp, "width", GST_TYPE_INT_RANGE, (gint) w, (gint) maxw, "height", GST_TYPE_INT_RANGE, (gint) h, (gint) maxh, NULL); /* no point using the results list here, since there's only one struct */ gst_caps_append_structure (ret, tmp); } } else { goto unknown_type; } /* we use an intermediary list to store and then sort the results of the * probing because we can't make any assumptions about the order in which * the driver will give us the sizes, but we want the final caps to contain * the results starting with the highest resolution and having the lowest * resolution last, since order in caps matters for things like fixation. */ results = g_list_sort (results, (GCompareFunc) sort_by_frame_size); while (results != NULL) { gst_caps_append_structure (ret, GST_STRUCTURE (results->data)); results = g_list_delete_link (results, results); } if (gst_caps_is_empty (ret)) goto enum_framesizes_no_results; return ret; /* ERRORS */ enum_framesizes_failed: { /* I don't see how this is actually an error */ GST_DEBUG_OBJECT (v4l2object->element, "Failed to enumerate frame sizes for pixelformat %" GST_FOURCC_FORMAT " (%s)", GST_FOURCC_ARGS (pixelformat), g_strerror (errno)); goto default_frame_sizes; } enum_framesizes_no_results: { /* it's possible that VIDIOC_ENUM_FRAMESIZES is defined but the driver in * question doesn't actually support it yet */ GST_DEBUG_OBJECT (v4l2object->element, "No results for pixelformat %" GST_FOURCC_FORMAT " enumerating frame sizes, trying fallback", GST_FOURCC_ARGS (pixelformat)); goto default_frame_sizes; } unknown_type: { GST_WARNING_OBJECT (v4l2object->element, "Unknown frame sizeenum type for pixelformat %" GST_FOURCC_FORMAT ": %u", GST_FOURCC_ARGS (pixelformat), size.type); goto default_frame_sizes; } default_frame_sizes: #endif /* defined VIDIOC_ENUM_FRAMESIZES */ { gint min_w, max_w, min_h, max_h, fix_num = 0, fix_denom = 0; gboolean interlaced; /* This code is for Linux < 2.6.19 */ min_w = min_h = 1; max_w = max_h = GST_V4L2_MAX_SIZE; if (!gst_v4l2_object_get_nearest_size (v4l2object, pixelformat, &min_w, &min_h, &interlaced)) { GST_WARNING_OBJECT (v4l2object->element, "Could not probe minimum capture size for pixelformat %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (pixelformat)); } if (!gst_v4l2_object_get_nearest_size (v4l2object, pixelformat, &max_w, &max_h, &interlaced)) { GST_WARNING_OBJECT (v4l2object->element, "Could not probe maximum capture size for pixelformat %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (pixelformat)); } /* Since we can't get framerate directly, try to use the current norm */ if (v4l2object->tv_norm && v4l2object->norms) { GList *norms; GstTunerNorm *norm = NULL; GstTunerNorm *current = gst_v4l2_tuner_get_norm_by_std_id (v4l2object, v4l2object->tv_norm); for (norms = v4l2object->norms; norms != NULL; norms = norms->next) { norm = (GstTunerNorm *) norms->data; if (!strcmp (norm->label, current->label)) break; } /* If it's possible, set framerate to that (discrete) value */ if (norm) { fix_num = gst_value_get_fraction_numerator (&norm->framerate); fix_denom = gst_value_get_fraction_denominator (&norm->framerate); } } tmp = gst_structure_copy (template); if (fix_num) { gst_structure_set (tmp, "framerate", GST_TYPE_FRACTION, fix_num, fix_denom, NULL); } else { /* if norm can't be used, copy the template framerate */ gst_structure_set (tmp, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL); } if (min_w == max_w) gst_structure_set (tmp, "width", G_TYPE_INT, max_w, NULL); else gst_structure_set (tmp, "width", GST_TYPE_INT_RANGE, min_w, max_w, NULL); if (min_h == max_h) gst_structure_set (tmp, "height", G_TYPE_INT, max_h, NULL); else gst_structure_set (tmp, "height", GST_TYPE_INT_RANGE, min_h, max_h, NULL); gst_structure_set (tmp, "interlaced", G_TYPE_BOOLEAN, interlaced, NULL); gst_structure_set (tmp, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); gst_caps_append_structure (ret, tmp); return ret; } } static gboolean gst_v4l2_object_get_nearest_size (GstV4l2Object * v4l2object, guint32 pixelformat, gint * width, gint * height, gboolean * interlaced) { struct v4l2_format fmt, prevfmt; int fd; int r; int prevfmt_valid; g_return_val_if_fail (width != NULL, FALSE); g_return_val_if_fail (height != NULL, FALSE); GST_LOG_OBJECT (v4l2object->element, "getting nearest size to %dx%d with format %" GST_FOURCC_FORMAT, *width, *height, GST_FOURCC_ARGS (pixelformat)); fd = v4l2object->video_fd; /* Some drivers are buggy and will modify the currently set format when processing VIDIOC_TRY_FMT, so we remember what is set at the minute, and will reset it when done. */ prevfmt_valid = (v4l2_ioctl (fd, VIDIOC_G_FMT, &prevfmt) >= 0); /* get size delimiters */ memset (&fmt, 0, sizeof (fmt)); fmt.type = v4l2object->type; fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; fmt.fmt.pix.pixelformat = pixelformat; fmt.fmt.pix.field = V4L2_FIELD_NONE; r = v4l2_ioctl (fd, VIDIOC_TRY_FMT, &fmt); if (r < 0 && errno == EINVAL) { /* try again with interlaced video */ fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; fmt.fmt.pix.pixelformat = pixelformat; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; r = v4l2_ioctl (fd, VIDIOC_TRY_FMT, &fmt); } if (r < 0) { /* The driver might not implement TRY_FMT, in which case we will try S_FMT to probe */ if (errno != ENOTTY) goto error; /* Only try S_FMT if we're not actively capturing yet, which we shouldn't be, because we're still probing */ if (GST_V4L2_IS_ACTIVE (v4l2object)) goto error; GST_LOG_OBJECT (v4l2object->element, "Failed to probe size limit with VIDIOC_TRY_FMT, trying VIDIOC_S_FMT"); fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; r = v4l2_ioctl (fd, VIDIOC_S_FMT, &fmt); if (r < 0 && errno == EINVAL) { /* try again with progressive video */ fmt.fmt.pix.width = *width; fmt.fmt.pix.height = *height; fmt.fmt.pix.pixelformat = pixelformat; fmt.fmt.pix.field = V4L2_FIELD_NONE; r = v4l2_ioctl (fd, VIDIOC_S_FMT, &fmt); } if (r < 0) goto error; } GST_LOG_OBJECT (v4l2object->element, "got nearest size %dx%d", fmt.fmt.pix.width, fmt.fmt.pix.height); *width = fmt.fmt.pix.width; *height = fmt.fmt.pix.height; switch (fmt.fmt.pix.field) { case V4L2_FIELD_ANY: case V4L2_FIELD_NONE: *interlaced = FALSE; break; case V4L2_FIELD_INTERLACED: case V4L2_FIELD_INTERLACED_TB: case V4L2_FIELD_INTERLACED_BT: *interlaced = TRUE; break; default: GST_WARNING_OBJECT (v4l2object->element, "Unsupported field type for %" GST_FOURCC_FORMAT "@%ux%u", GST_FOURCC_ARGS (pixelformat), *width, *height); goto error; } if (prevfmt_valid) v4l2_ioctl (fd, VIDIOC_S_FMT, &prevfmt); return TRUE; error: if (prevfmt_valid) v4l2_ioctl (fd, VIDIOC_S_FMT, &prevfmt); return FALSE; } gboolean gst_v4l2_object_set_format (GstV4l2Object * v4l2object, guint32 pixelformat, guint32 width, guint32 height, gboolean interlaced) { gint fd = v4l2object->video_fd; struct v4l2_format format; enum v4l2_field field; if (interlaced) { GST_DEBUG_OBJECT (v4l2object->element, "interlaced video"); /* ideally we would differentiate between types of interlaced video * but there is not sufficient information in the caps.. */ field = V4L2_FIELD_INTERLACED; } else { GST_DEBUG_OBJECT (v4l2object->element, "progressive video"); field = V4L2_FIELD_NONE; } GST_DEBUG_OBJECT (v4l2object->element, "Setting format to %dx%d, format " "%" GST_FOURCC_FORMAT, width, height, GST_FOURCC_ARGS (pixelformat)); GST_V4L2_CHECK_OPEN (v4l2object); GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); /* Only unconditionally accept mpegts for sources */ if ((v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) && (pixelformat == GST_MAKE_FOURCC ('M', 'P', 'E', 'G'))) return TRUE; memset (&format, 0x00, sizeof (struct v4l2_format)); format.type = v4l2object->type; if (v4l2_ioctl (fd, VIDIOC_G_FMT, &format) < 0) goto get_fmt_failed; if (format.type == v4l2object->type && format.fmt.pix.width == width && format.fmt.pix.height == height && format.fmt.pix.pixelformat == pixelformat && format.fmt.pix.field == field) { /* Nothing to do. We want to succeed immediately * here because setting the same format back * can still fail due to EBUSY. By short-circuiting * here, we allow pausing and re-playing pipelines * with changed caps, as long as the changed caps * do not change the webcam's format. Otherwise, * any caps change would require us to go to NULL * state to close the device and set format. */ return TRUE; } format.type = v4l2object->type; format.fmt.pix.width = width; format.fmt.pix.height = height; format.fmt.pix.pixelformat = pixelformat; format.fmt.pix.field = field; if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0) { goto set_fmt_failed; } if (format.fmt.pix.width != width || format.fmt.pix.height != height) goto invalid_dimensions; if (format.fmt.pix.pixelformat != pixelformat) goto invalid_pixelformat; return TRUE; /* ERRORS */ get_fmt_failed: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, (_("Device '%s' does not support video capture"), v4l2object->videodev), ("Call to G_FMT failed: (%s)", g_strerror (errno))); return FALSE; } set_fmt_failed: { if (errno == EBUSY) { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, BUSY, (_("Device '%s' is busy"), v4l2object->videodev), ("Call to S_FMT failed for %" GST_FOURCC_FORMAT " @ %dx%d: %s", GST_FOURCC_ARGS (pixelformat), width, height, g_strerror (errno))); } else { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, (_("Device '%s' cannot capture at %dx%d"), v4l2object->videodev, width, height), ("Call to S_FMT failed for %" GST_FOURCC_FORMAT " @ %dx%d: %s", GST_FOURCC_ARGS (pixelformat), width, height, g_strerror (errno))); } return FALSE; } invalid_dimensions: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, (_("Device '%s' cannot capture at %dx%d"), v4l2object->videodev, width, height), ("Tried to capture at %dx%d, but device returned size %dx%d", width, height, format.fmt.pix.width, format.fmt.pix.height)); return FALSE; } invalid_pixelformat: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, (_("Device '%s' cannot capture in the specified format"), v4l2object->videodev), ("Tried to capture in %" GST_FOURCC_FORMAT ", but device returned format" " %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (pixelformat), GST_FOURCC_ARGS (format.fmt.pix.pixelformat))); return FALSE; } } gboolean gst_v4l2_object_start_streaming (GstV4l2Object * v4l2object) { if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_STREAMON, &(v4l2object->type)) < 0) { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ, (_("Error starting streaming on device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } return TRUE; } gboolean gst_v4l2_object_stop_streaming (GstV4l2Object * v4l2object) { if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_STREAMOFF, &(v4l2object->type)) < 0) { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ, (_("Error stopping streaming on device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } return TRUE; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2tuner.c0000644000175000017500000002340711677341661016155 00000000000000/* GStreamer * * Copyright (C) 2003 Ronald Bultje * 2006 Edgard Lima * * gstv4l2tuner.c: tuner interface implementation for V4L2 * * 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 #include "gstv4l2tuner.h" #include "gstv4l2object.h" #include "v4l2_calls.h" #include "v4l2src_calls.h" static void gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass * klass); static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel); static void gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass); static void gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm); static GstTunerNormClass *norm_parent_class = NULL; static GstTunerChannelClass *channel_parent_class = NULL; GType gst_v4l2_tuner_channel_get_type (void) { static GType gst_v4l2_tuner_channel_type = 0; if (!gst_v4l2_tuner_channel_type) { static const GTypeInfo v4l2_tuner_channel_info = { sizeof (GstV4l2TunerChannelClass), NULL, NULL, (GClassInitFunc) gst_v4l2_tuner_channel_class_init, NULL, NULL, sizeof (GstV4l2TunerChannel), 0, (GInstanceInitFunc) gst_v4l2_tuner_channel_init, NULL }; gst_v4l2_tuner_channel_type = g_type_register_static (GST_TYPE_TUNER_CHANNEL, "GstV4l2TunerChannel", &v4l2_tuner_channel_info, 0); } return gst_v4l2_tuner_channel_type; } static void gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass * klass) { channel_parent_class = g_type_class_peek_parent (klass); } static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel) { channel->index = (guint32) - 1; channel->tuner = (guint32) - 1; channel->audio = (guint32) - 1; } GType gst_v4l2_tuner_norm_get_type (void) { static GType gst_v4l2_tuner_norm_type = 0; if (!gst_v4l2_tuner_norm_type) { static const GTypeInfo v4l2_tuner_norm_info = { sizeof (GstV4l2TunerNormClass), NULL, NULL, (GClassInitFunc) gst_v4l2_tuner_norm_class_init, NULL, NULL, sizeof (GstV4l2TunerNorm), 0, (GInstanceInitFunc) gst_v4l2_tuner_norm_init, NULL }; gst_v4l2_tuner_norm_type = g_type_register_static (GST_TYPE_TUNER_NORM, "GstV4l2TunerNorm", &v4l2_tuner_norm_info, 0); } return gst_v4l2_tuner_norm_type; } static void gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass) { norm_parent_class = g_type_class_peek_parent (klass); } static void gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm) { norm->index = 0; } static G_GNUC_UNUSED gboolean gst_v4l2_tuner_contains_channel (GstV4l2Object * v4l2object, GstV4l2TunerChannel * v4l2channel) { const GList *item; for (item = v4l2object->channels; item != NULL; item = item->next) if (item->data == v4l2channel) return TRUE; return FALSE; } const GList * gst_v4l2_tuner_list_channels (GstV4l2Object * v4l2object) { return v4l2object->channels; } gboolean gst_v4l2_tuner_set_channel (GstV4l2Object * v4l2object, GstTunerChannel * channel) { GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE); g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, v4l2channel), FALSE); if (v4l2object->set_in_out_func (v4l2object, v4l2channel->index)) { gst_tuner_channel_changed (GST_TUNER (v4l2object->element), channel); /* can FPS change here? */ return TRUE; } return FALSE; } GstTunerChannel * gst_v4l2_tuner_get_channel (GstV4l2Object * v4l2object) { GList *item; gint channel; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), NULL); if (v4l2object->get_in_out_func (v4l2object, &channel)) { for (item = v4l2object->channels; item != NULL; item = item->next) { if (channel == GST_V4L2_TUNER_CHANNEL (item->data)->index) return (GstTunerChannel *) item->data; } } return NULL; } static G_GNUC_UNUSED gboolean gst_v4l2_tuner_contains_norm (GstV4l2Object * v4l2object, GstV4l2TunerNorm * v4l2norm) { const GList *item; for (item = v4l2object->norms; item != NULL; item = item->next) if (item->data == v4l2norm) return TRUE; return FALSE; } const GList * gst_v4l2_tuner_list_norms (GstV4l2Object * v4l2object) { return v4l2object->norms; } void gst_v4l2_tuner_set_norm_and_notify (GstV4l2Object * v4l2object, GstTunerNorm * norm) { if (gst_v4l2_tuner_set_norm (v4l2object, norm)) { #if 0 g_object_notify (G_OBJECT (v4l2object->element), "norm"); #endif } } gboolean gst_v4l2_tuner_set_norm (GstV4l2Object * v4l2object, GstTunerNorm * norm) { GstV4l2TunerNorm *v4l2norm = GST_V4L2_TUNER_NORM (norm); /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE); g_return_val_if_fail (gst_v4l2_tuner_contains_norm (v4l2object, v4l2norm), FALSE); if (gst_v4l2_set_norm (v4l2object, v4l2norm->index)) { gst_tuner_norm_changed (GST_TUNER (v4l2object->element), norm); if (v4l2object->update_fps_func) v4l2object->update_fps_func (v4l2object); return TRUE; } return FALSE; } GstTunerNorm * gst_v4l2_tuner_get_norm (GstV4l2Object * v4l2object) { v4l2_std_id norm; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), NULL); gst_v4l2_get_norm (v4l2object, &norm); return gst_v4l2_tuner_get_norm_by_std_id (v4l2object, norm); } GstTunerNorm * gst_v4l2_tuner_get_norm_by_std_id (GstV4l2Object * v4l2object, v4l2_std_id norm) { GList *item; for (item = v4l2object->norms; item != NULL; item = item->next) { if (norm & GST_V4L2_TUNER_NORM (item->data)->index) return (GstTunerNorm *) item->data; } return NULL; } v4l2_std_id gst_v4l2_tuner_get_std_id_by_norm (GstV4l2Object * v4l2object, GstTunerNorm * norm) { GList *item; for (item = v4l2object->norms; item != NULL; item = item->next) { if (norm == GST_TUNER_NORM (item->data)) return GST_V4L2_TUNER_NORM (item->data)->index; } return 0; } void gst_v4l2_tuner_set_frequency_and_notify (GstV4l2Object * v4l2object, GstTunerChannel * channel, gulong frequency) { if (gst_v4l2_tuner_set_frequency (v4l2object, channel, frequency)) { #if 0 g_object_notify (G_OBJECT (v4l2object->element), "frequency"); #endif } } gboolean gst_v4l2_tuner_set_frequency (GstV4l2Object * v4l2object, GstTunerChannel * channel, gulong frequency) { GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); gint chan; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE); g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY), FALSE); g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, v4l2channel), FALSE); if (v4l2object->get_in_out_func (v4l2object, &chan)) { if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { if (gst_v4l2_set_frequency (v4l2object, v4l2channel->tuner, frequency)) { gst_tuner_frequency_changed (GST_TUNER (v4l2object->element), channel, frequency); return TRUE; } } } return FALSE; } gulong gst_v4l2_tuner_get_frequency (GstV4l2Object * v4l2object, GstTunerChannel * channel) { GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); gint chan; gulong frequency = 0; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0); g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY), 0); g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, v4l2channel), 0); if (v4l2object->get_in_out_func (v4l2object, &chan)) { if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { gst_v4l2_get_frequency (v4l2object, v4l2channel->tuner, &frequency); } } return frequency; } gint gst_v4l2_tuner_signal_strength (GstV4l2Object * v4l2object, GstTunerChannel * channel) { GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel); gint chan; gulong signal = 0; /* assert that we're opened and that we're using a known item */ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0); g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY), 0); g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object, v4l2channel), 0); if (v4l2object->get_in_out_func (v4l2object, &chan)) { if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { gst_v4l2_signal_strength (v4l2object, v4l2channel->tuner, &signal); } } return signal; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2object.h0000644000175000017500000002462711677341661016300 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * * gstv4l2object.h: base class for V4L2 elements * * 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_V4L2_OBJECT_H__ #define __GST_V4L2_OBJECT_H__ /* Because of some really cool feature in video4linux1, also known as * 'not including sys/types.h and sys/time.h', we had to include it * ourselves. In all their intelligence, these people decided to fix * this in the next version (video4linux2) in such a cool way that it * breaks all compilations of old stuff... * The real problem is actually that linux/time.h doesn't use proper * macro checks before defining types like struct timeval. The proper * fix here is to either fuck the kernel header (which is what we do * by defining _LINUX_TIME_H, an innocent little hack) or by fixing it * upstream, which I'll consider doing later on. If you get compiler * errors here, check your linux/time.h && sys/time.h header setup. */ #include #include #ifndef __sun #include #define _LINUX_TIME_H #define __user #include #else #include #endif #include #include #include #include /* size of v4l2 buffer pool in streaming case */ #define GST_V4L2_MAX_BUFFERS 16 #define GST_V4L2_MIN_BUFFERS 1 /* max frame width/height */ #define GST_V4L2_MAX_SIZE (1<<15) /* 2^15 == 32768 */ G_BEGIN_DECLS #define GST_V4L2_OBJECT(obj) (GstV4l2Object *)(obj) typedef struct _GstV4l2Object GstV4l2Object; typedef struct _GstV4l2ObjectClassHelper GstV4l2ObjectClassHelper; typedef struct _GstV4l2Xv GstV4l2Xv; typedef gboolean (*GstV4l2GetInOutFunction) (GstV4l2Object * v4l2object, gint * input); typedef gboolean (*GstV4l2SetInOutFunction) (GstV4l2Object * v4l2object, gint input); typedef gboolean (*GstV4l2UpdateFpsFunction) (GstV4l2Object * v4l2object); struct _GstV4l2Object { GstElement * element; /* the video device */ char *videodev; /* the video-device's file descriptor */ gint video_fd; GstPoll * poll; gboolean can_poll_device; /* the video buffer (mmap()'ed) */ guint8 **buffer; enum v4l2_buf_type type; /* V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_OUTPUT */ /* the video device's capabilities */ struct v4l2_capability vcap; /* the video device's window properties */ struct v4l2_window vwin; /* some more info about the current input's capabilities */ struct v4l2_input vinput; /* lists... */ GSList *formats; /* list of available capture formats */ GList *colors; GList *norms; GList *channels; /* properties */ v4l2_std_id tv_norm; gchar *channel; gulong frequency; /* X-overlay */ GstV4l2Xv *xv; gulong xwindow_id; /* funcs */ GstV4l2GetInOutFunction get_in_out_func; GstV4l2SetInOutFunction set_in_out_func; GstV4l2UpdateFpsFunction update_fps_func; }; struct _GstV4l2ObjectClassHelper { /* probed devices */ GList *devices; }; GType gst_v4l2_object_get_type (void); #define V4L2_STD_OBJECT_PROPS \ PROP_DEVICE, \ PROP_DEVICE_NAME, \ PROP_DEVICE_FD, \ PROP_FLAGS, \ PROP_BRIGHTNESS, \ PROP_CONTRAST, \ PROP_SATURATION, \ PROP_HUE, \ PROP_TV_NORM /* create/destroy */ GstV4l2Object * gst_v4l2_object_new (GstElement * element, enum v4l2_buf_type type, const char *default_device, GstV4l2GetInOutFunction get_in_out_func, GstV4l2SetInOutFunction set_in_out_func, GstV4l2UpdateFpsFunction update_fps_func); void gst_v4l2_object_destroy (GstV4l2Object * v4l2object); /* properties */ void gst_v4l2_object_install_properties_helper (GObjectClass *gobject_class, const char *default_device); gboolean gst_v4l2_object_set_property_helper (GstV4l2Object *v4l2object, guint prop_id, const GValue * value, GParamSpec * pspec); gboolean gst_v4l2_object_get_property_helper (GstV4l2Object *v4l2object, guint prop_id, GValue * value, GParamSpec * pspec); /* starting/stopping */ gboolean gst_v4l2_object_start (GstV4l2Object *v4l2object); gboolean gst_v4l2_object_stop (GstV4l2Object *v4l2object); /* probing */ const GList* gst_v4l2_probe_get_properties (GstPropertyProbe * probe); void gst_v4l2_probe_probe_property (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec, GList ** klass_devices); gboolean gst_v4l2_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec, GList ** klass_devices); GValueArray* gst_v4l2_probe_get_values (GstPropertyProbe * probe, guint prop_id, const GParamSpec * pspec, GList ** klass_devices); GstCaps* gst_v4l2_object_probe_caps_for_format (GstV4l2Object *v4l2object, guint32 pixelformat, const GstStructure * template); gboolean gst_v4l2_object_get_caps_info (GstV4l2Object *v4l2object, GstCaps *caps, struct v4l2_fmtdesc **format, gint *w, gint *h, gboolean * interlaced, guint *fps_n, guint *fps_d, guint *size); GSList* gst_v4l2_object_get_format_list (GstV4l2Object *v4l2object); GstCaps* gst_v4l2_object_get_all_caps (void); GstStructure* gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc); gboolean gst_v4l2_object_set_format (GstV4l2Object *v4l2object, guint32 pixelformat, guint32 width, guint32 height, gboolean interlaced); gboolean gst_v4l2_object_start_streaming (GstV4l2Object *v4l2object); gboolean gst_v4l2_object_stop_streaming (GstV4l2Object *v4l2object); #define GST_IMPLEMENT_V4L2_PROBE_METHODS(Type_Class, interface_as_function) \ \ static void \ interface_as_function ## _probe_probe_property (GstPropertyProbe * probe, \ guint prop_id, \ const GParamSpec * pspec) \ { \ Type_Class *this_class = (Type_Class*) G_OBJECT_GET_CLASS (probe); \ gst_v4l2_probe_probe_property (probe, prop_id, pspec, \ &this_class->v4l2_class_devices); \ } \ \ static gboolean \ interface_as_function ## _probe_needs_probe (GstPropertyProbe * probe, \ guint prop_id, \ const GParamSpec * pspec) \ { \ Type_Class *this_class = (Type_Class*) G_OBJECT_GET_CLASS (probe); \ return gst_v4l2_probe_needs_probe (probe, prop_id, pspec, \ &this_class->v4l2_class_devices); \ } \ \ static GValueArray * \ interface_as_function ## _probe_get_values (GstPropertyProbe * probe, \ guint prop_id, \ const GParamSpec * pspec) \ { \ Type_Class *this_class = (Type_Class*) G_OBJECT_GET_CLASS (probe); \ return gst_v4l2_probe_get_values (probe, prop_id, pspec, \ &this_class->v4l2_class_devices); \ } \ \ static void \ interface_as_function ## _property_probe_interface_init (GstPropertyProbeInterface * iface) \ { \ iface->get_properties = gst_v4l2_probe_get_properties; \ iface->probe_property = interface_as_function ## _probe_probe_property; \ iface->needs_probe = interface_as_function ## _probe_needs_probe; \ iface->get_values = interface_as_function ## _probe_get_values; \ } G_END_DECLS #endif /* __GST_V4L2_OBJECT_H__ */ gst-plugins-good-0.10.31/sys/v4l2/v4l2_calls.c0000644000175000017500000006541111717430217015527 00000000000000/* GStreamer * * Copyright (C) 2002 Ronald Bultje * 2006 Edgard Lima * * v4l2_calls.c - generic V4L2 calls handling * * 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 #endif #include #include #include #include #include #include #include #include #ifdef __sun /* Needed on older Solaris Nevada builds (72 at least) */ #include #include #endif #include "v4l2_calls.h" #include "gstv4l2tuner.h" #if 0 #include "gstv4l2xoverlay.h" #endif #include "gstv4l2colorbalance.h" #include "gstv4l2src.h" #ifdef HAVE_EXPERIMENTAL #include "gstv4l2sink.h" #endif #include "gst/gst-i18n-plugin.h" /* Those are ioctl calls */ #ifndef V4L2_CID_HCENTER #define V4L2_CID_HCENTER V4L2_CID_HCENTER_DEPRECATED #endif #ifndef V4L2_CID_VCENTER #define V4L2_CID_VCENTER V4L2_CID_VCENTER_DEPRECATED #endif GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); #define GST_CAT_DEFAULT v4l2_debug /****************************************************** * gst_v4l2_get_capabilities(): * get the device's capturing capabilities * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_get_capabilities (GstV4l2Object * v4l2object) { GstElement *e; e = v4l2object->element; GST_DEBUG_OBJECT (e, "getting capabilities"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &v4l2object->vcap) < 0) goto cap_failed; GST_LOG_OBJECT (e, "driver: '%s'", v4l2object->vcap.driver); GST_LOG_OBJECT (e, "card: '%s'", v4l2object->vcap.card); GST_LOG_OBJECT (e, "bus_info: '%s'", v4l2object->vcap.bus_info); GST_LOG_OBJECT (e, "version: %08x", v4l2object->vcap.version); GST_LOG_OBJECT (e, "capabilites: %08x", v4l2object->vcap.capabilities); return TRUE; /* ERRORS */ cap_failed: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, (_("Error getting capabilities for device '%s': " "It isn't a v4l2 driver. Check if it is a v4l1 driver."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } /****************************************************** * gst_v4l2_empty_lists() and gst_v4l2_fill_lists(): * fill/empty the lists of enumerations * return value: TRUE on success, FALSE on error ******************************************************/ static gboolean gst_v4l2_fill_lists (GstV4l2Object * v4l2object) { gint n; GstElement *e; e = v4l2object->element; GST_DEBUG_OBJECT (e, "getting enumerations"); GST_V4L2_CHECK_OPEN (v4l2object); GST_DEBUG_OBJECT (e, " channels"); /* and now, the channels */ for (n = 0;; n++) { struct v4l2_input input; GstV4l2TunerChannel *v4l2channel; GstTunerChannel *channel; memset (&input, 0, sizeof (input)); input.index = n; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUMINPUT, &input) < 0) { if (errno == EINVAL) break; /* end of enumeration */ else { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Failed to query attributes of input %d in device %s"), n, v4l2object->videodev), ("Failed to get %d in input enumeration for %s. (%d - %s)", n, v4l2object->videodev, errno, strerror (errno))); return FALSE; } } GST_LOG_OBJECT (e, " index: %d", input.index); GST_LOG_OBJECT (e, " name: '%s'", input.name); GST_LOG_OBJECT (e, " type: %08x", input.type); GST_LOG_OBJECT (e, " audioset: %08x", input.audioset); GST_LOG_OBJECT (e, " std: %016x", (guint) input.std); GST_LOG_OBJECT (e, " status: %08x", input.status); v4l2channel = g_object_new (GST_TYPE_V4L2_TUNER_CHANNEL, NULL); channel = GST_TUNER_CHANNEL (v4l2channel); channel->label = g_strdup ((const gchar *) input.name); channel->flags = GST_TUNER_CHANNEL_INPUT; v4l2channel->index = n; if (input.type == V4L2_INPUT_TYPE_TUNER) { struct v4l2_tuner vtun; v4l2channel->tuner = input.tuner; channel->flags |= GST_TUNER_CHANNEL_FREQUENCY; vtun.index = input.tuner; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &vtun) < 0) { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Failed to get setting of tuner %d on device '%s'."), input.tuner, v4l2object->videodev), GST_ERROR_SYSTEM); g_object_unref (G_OBJECT (channel)); return FALSE; } channel->freq_multiplicator = 62.5 * ((vtun.capability & V4L2_TUNER_CAP_LOW) ? 1 : 1000); channel->min_frequency = vtun.rangelow * channel->freq_multiplicator; channel->max_frequency = vtun.rangehigh * channel->freq_multiplicator; channel->min_signal = 0; channel->max_signal = 0xffff; } if (input.audioset) { /* we take the first. We don't care for * the others for now */ while (!(input.audioset & (1 << v4l2channel->audio))) v4l2channel->audio++; channel->flags |= GST_TUNER_CHANNEL_AUDIO; } v4l2object->channels = g_list_prepend (v4l2object->channels, (gpointer) channel); } v4l2object->channels = g_list_reverse (v4l2object->channels); GST_DEBUG_OBJECT (e, " norms"); /* norms... */ for (n = 0;; n++) { struct v4l2_standard standard = { 0, }; GstV4l2TunerNorm *v4l2norm; GstTunerNorm *norm; /* fill in defaults */ standard.frameperiod.numerator = 1; standard.frameperiod.denominator = 0; standard.index = n; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_ENUMSTD, &standard) < 0) { if (errno == EINVAL || errno == ENOTTY) break; /* end of enumeration */ else { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Failed to query norm on device '%s'."), v4l2object->videodev), ("Failed to get attributes for norm %d on devide '%s'. (%d - %s)", n, v4l2object->videodev, errno, strerror (errno))); return FALSE; } } GST_DEBUG_OBJECT (e, " '%s', fps: %d / %d", standard.name, standard.frameperiod.denominator, standard.frameperiod.numerator); v4l2norm = g_object_new (GST_TYPE_V4L2_TUNER_NORM, NULL); norm = GST_TUNER_NORM (v4l2norm); norm->label = g_strdup ((const gchar *) standard.name); gst_value_set_fraction (&norm->framerate, standard.frameperiod.denominator, standard.frameperiod.numerator); v4l2norm->index = standard.id; GST_DEBUG_OBJECT (v4l2object->element, "index=%08x, label=%s", (unsigned int) v4l2norm->index, norm->label); v4l2object->norms = g_list_prepend (v4l2object->norms, (gpointer) norm); } v4l2object->norms = g_list_reverse (v4l2object->norms); GST_DEBUG_OBJECT (e, " controls+menus"); /* and lastly, controls+menus (if appropriate) */ for (n = V4L2_CID_BASE;; n++) { struct v4l2_queryctrl control = { 0, }; GstV4l2ColorBalanceChannel *v4l2channel; GstColorBalanceChannel *channel; /* when we reached the last official CID, continue with private CIDs */ if (n == V4L2_CID_LASTP1) { GST_DEBUG_OBJECT (e, "checking private CIDs"); n = V4L2_CID_PRIVATE_BASE; } GST_DEBUG_OBJECT (e, "checking control %08x", n); control.id = n; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCTRL, &control) < 0) { if (errno == EINVAL || errno == ENOTTY || errno == EIO) { if (n < V4L2_CID_PRIVATE_BASE) { GST_DEBUG_OBJECT (e, "skipping control %08x", n); /* continue so that we also check private controls */ continue; } else { GST_DEBUG_OBJECT (e, "controls finished"); break; } } else { GST_WARNING_OBJECT (e, "Failed querying control %d on device '%s'. " "(%d - %s)", n, v4l2object->videodev, errno, strerror (errno)); continue; } } if (control.flags & V4L2_CTRL_FLAG_DISABLED) { GST_DEBUG_OBJECT (e, "skipping disabled control"); continue; } switch (n) { case V4L2_CID_BRIGHTNESS: case V4L2_CID_CONTRAST: case V4L2_CID_SATURATION: case V4L2_CID_HUE: case V4L2_CID_BLACK_LEVEL: case V4L2_CID_AUTO_WHITE_BALANCE: case V4L2_CID_DO_WHITE_BALANCE: case V4L2_CID_RED_BALANCE: case V4L2_CID_BLUE_BALANCE: case V4L2_CID_GAMMA: case V4L2_CID_EXPOSURE: case V4L2_CID_AUTOGAIN: case V4L2_CID_GAIN: #ifdef V4L2_CID_SHARPNESS case V4L2_CID_SHARPNESS: #endif /* we only handle these for now (why?) */ break; case V4L2_CID_HFLIP: case V4L2_CID_VFLIP: case V4L2_CID_HCENTER: case V4L2_CID_VCENTER: #ifdef V4L2_CID_PAN_RESET case V4L2_CID_PAN_RESET: #endif #ifdef V4L2_CID_TILT_RESET case V4L2_CID_TILT_RESET: #endif /* not handled here, handled by VideoOrientation interface */ control.id++; break; case V4L2_CID_AUDIO_VOLUME: case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_BASS: case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_MUTE: case V4L2_CID_AUDIO_LOUDNESS: /* FIXME: We should implement GstMixer interface */ /* fall through */ default: GST_DEBUG_OBJECT (e, "ControlID %s (%x) unhandled, FIXME", control.name, n); control.id++; break; } if (n != control.id) continue; GST_DEBUG_OBJECT (e, "Adding ControlID %s (%x)", control.name, n); v4l2channel = g_object_new (GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, NULL); channel = GST_COLOR_BALANCE_CHANNEL (v4l2channel); channel->label = g_strdup ((const gchar *) control.name); v4l2channel->id = n; #if 0 /* FIXME: it will be need just when handling private controls *(currently none of base controls are of this type) */ if (control.type == V4L2_CTRL_TYPE_MENU) { struct v4l2_querymenu menu, *mptr; int i; menu.id = n; for (i = 0;; i++) { menu.index = i; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYMENU, &menu) < 0) { if (errno == EINVAL) break; /* end of enumeration */ else { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Failed getting controls attributes on device '%s'."), v4l2object->videodev), ("Failed to get %d in menu enumeration for %s. (%d - %s)", n, v4l2object->videodev, errno, strerror (errno))); return FALSE; } } mptr = g_malloc (sizeof (menu)); memcpy (mptr, &menu, sizeof (menu)); menus = g_list_append (menus, mptr); } } v4l2object->menus = g_list_append (v4l2object->menus, menus); #endif switch (control.type) { case V4L2_CTRL_TYPE_INTEGER: channel->min_value = control.minimum; channel->max_value = control.maximum; break; case V4L2_CTRL_TYPE_BOOLEAN: channel->min_value = FALSE; channel->max_value = TRUE; break; default: /* FIXME we should find out how to handle V4L2_CTRL_TYPE_BUTTON. BUTTON controls like V4L2_CID_DO_WHITE_BALANCE can just be set (1) or unset (0), but can't be queried */ GST_DEBUG_OBJECT (e, "Control with non supported type %s (%x), type=%d", control.name, n, control.type); channel->min_value = channel->max_value = 0; break; } v4l2object->colors = g_list_prepend (v4l2object->colors, (gpointer) channel); } v4l2object->colors = g_list_reverse (v4l2object->colors); GST_DEBUG_OBJECT (e, "done"); return TRUE; } static void gst_v4l2_empty_lists (GstV4l2Object * v4l2object) { GST_DEBUG_OBJECT (v4l2object->element, "deleting enumerations"); g_list_foreach (v4l2object->channels, (GFunc) g_object_unref, NULL); g_list_free (v4l2object->channels); v4l2object->channels = NULL; g_list_foreach (v4l2object->norms, (GFunc) g_object_unref, NULL); g_list_free (v4l2object->norms); v4l2object->norms = NULL; g_list_foreach (v4l2object->colors, (GFunc) g_object_unref, NULL); g_list_free (v4l2object->colors); v4l2object->colors = NULL; } /****************************************************** * gst_v4l2_open(): * open the video device (v4l2object->videodev) * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_open (GstV4l2Object * v4l2object) { struct stat st; int libv4l2_fd; GstPollFD pollfd = GST_POLL_FD_INIT; GST_DEBUG_OBJECT (v4l2object->element, "Trying to open device %s", v4l2object->videodev); GST_V4L2_CHECK_NOT_OPEN (v4l2object); GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); /* be sure we have a device */ if (!v4l2object->videodev) v4l2object->videodev = g_strdup ("/dev/video"); /* check if it is a device */ if (stat (v4l2object->videodev, &st) == -1) goto stat_failed; if (!S_ISCHR (st.st_mode)) goto no_device; /* open the device */ v4l2object->video_fd = open (v4l2object->videodev, O_RDWR /* | O_NONBLOCK */ ); if (!GST_V4L2_IS_OPEN (v4l2object)) goto not_open; libv4l2_fd = v4l2_fd_open (v4l2object->video_fd, V4L2_ENABLE_ENUM_FMT_EMULATION); /* Note the v4l2_xxx functions are designed so that if they get passed an unknown fd, the will behave exactly as their regular xxx counterparts, so if v4l2_fd_open fails, we continue as normal (missing the libv4l2 custom cam format to normal formats conversion). Chances are big we will still fail then though, as normally v4l2_fd_open only fails if the device is not a v4l2 device. */ if (libv4l2_fd != -1) v4l2object->video_fd = libv4l2_fd; v4l2object->can_poll_device = TRUE; /* get capabilities, error will be posted */ if (!gst_v4l2_get_capabilities (v4l2object)) goto error; /* do we need to be a capture device? */ if (GST_IS_V4L2SRC (v4l2object->element) && !(v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) goto not_capture; #ifdef HAVE_EXPERIMENTAL if (GST_IS_V4L2SINK (v4l2object->element) && !(v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) goto not_output; #endif /* create enumerations, posts errors. */ if (!gst_v4l2_fill_lists (v4l2object)) goto error; GST_INFO_OBJECT (v4l2object->element, "Opened device '%s' (%s) successfully", v4l2object->vcap.card, v4l2object->videodev); pollfd.fd = v4l2object->video_fd; gst_poll_add_fd (v4l2object->poll, &pollfd); gst_poll_fd_ctl_read (v4l2object->poll, &pollfd, TRUE); return TRUE; /* ERRORS */ stat_failed: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, (_("Cannot identify device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); goto error; } no_device: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, (_("This isn't a device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); goto error; } not_open: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, OPEN_READ_WRITE, (_("Could not open device '%s' for reading and writing."), v4l2object->videodev), GST_ERROR_SYSTEM); goto error; } not_capture: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, (_("Device '%s' is not a capture device."), v4l2object->videodev), ("Capabilities: 0x%x", v4l2object->vcap.capabilities)); goto error; } #ifdef HAVE_EXPERIMENTAL not_output: { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, (_("Device '%s' is not a output device."), v4l2object->videodev), ("Capabilities: 0x%x", v4l2object->vcap.capabilities)); goto error; } #endif error: { if (GST_V4L2_IS_OPEN (v4l2object)) { /* close device */ v4l2_close (v4l2object->video_fd); v4l2object->video_fd = -1; } /* empty lists */ gst_v4l2_empty_lists (v4l2object); return FALSE; } } /****************************************************** * gst_v4l2_close(): * close the video device (v4l2object->video_fd) * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_close (GstV4l2Object * v4l2object) { GstPollFD pollfd = GST_POLL_FD_INIT; GST_DEBUG_OBJECT (v4l2object->element, "Trying to close %s", v4l2object->videodev); GST_V4L2_CHECK_OPEN (v4l2object); GST_V4L2_CHECK_NOT_ACTIVE (v4l2object); /* close device */ v4l2_close (v4l2object->video_fd); pollfd.fd = v4l2object->video_fd; gst_poll_remove_fd (v4l2object->poll, &pollfd); v4l2object->video_fd = -1; /* empty lists */ gst_v4l2_empty_lists (v4l2object); return TRUE; } /****************************************************** * gst_v4l2_get_norm() * Get the norm of the current device * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_get_norm (GstV4l2Object * v4l2object, v4l2_std_id * norm) { GST_DEBUG_OBJECT (v4l2object->element, "getting norm"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_STD, norm) < 0) goto std_failed; return TRUE; /* ERRORS */ std_failed: { GST_DEBUG ("Failed to get the current norm for device %s", v4l2object->videodev); return FALSE; } } /****************************************************** * gst_v4l2_set_norm() * Set the norm of the current device * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_set_norm (GstV4l2Object * v4l2object, v4l2_std_id norm) { GST_DEBUG_OBJECT (v4l2object->element, "trying to set norm to " "%" G_GINT64_MODIFIER "x", (guint64) norm); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_STD, &norm) < 0) goto std_failed; return TRUE; /* ERRORS */ std_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to set norm for device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } /****************************************************** * gst_v4l2_get_frequency(): * get the current frequency * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_get_frequency (GstV4l2Object * v4l2object, gint tunernum, gulong * frequency) { struct v4l2_frequency freq = { 0, }; GstTunerChannel *channel; GST_DEBUG_OBJECT (v4l2object->element, "getting current tuner frequency"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; channel = gst_tuner_get_channel (GST_TUNER (v4l2object->element)); freq.tuner = tunernum; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq) < 0) goto freq_failed; *frequency = freq.frequency * channel->freq_multiplicator; return TRUE; /* ERRORS */ freq_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to get current tuner frequency for device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } /****************************************************** * gst_v4l2_set_frequency(): * set frequency * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_set_frequency (GstV4l2Object * v4l2object, gint tunernum, gulong frequency) { struct v4l2_frequency freq = { 0, }; GstTunerChannel *channel; GST_DEBUG_OBJECT (v4l2object->element, "setting current tuner frequency to %lu", frequency); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; channel = gst_tuner_get_channel (GST_TUNER (v4l2object->element)); freq.tuner = tunernum; /* fill in type - ignore error */ v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_FREQUENCY, &freq); freq.frequency = frequency / channel->freq_multiplicator; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_FREQUENCY, &freq) < 0) goto freq_failed; return TRUE; /* ERRORS */ freq_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to set current tuner frequency for device '%s' to %lu Hz."), v4l2object->videodev, frequency), GST_ERROR_SYSTEM); return FALSE; } } /****************************************************** * gst_v4l2_signal_strength(): * get the strength of the signal on the current input * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_signal_strength (GstV4l2Object * v4l2object, gint tunernum, gulong * signal_strength) { struct v4l2_tuner tuner = { 0, }; GST_DEBUG_OBJECT (v4l2object->element, "trying to get signal strength"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; tuner.index = tunernum; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &tuner) < 0) goto tuner_failed; *signal_strength = tuner.signal; return TRUE; /* ERRORS */ tuner_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to get signal strength for device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } /****************************************************** * gst_v4l2_get_attribute(): * try to get the value of one specific attribute * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_get_attribute (GstV4l2Object * v4l2object, int attribute_num, int *value) { struct v4l2_control control = { 0, }; GST_DEBUG_OBJECT (v4l2object->element, "getting value of attribute %d", attribute_num); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; control.id = attribute_num; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_CTRL, &control) < 0) goto ctrl_failed; *value = control.value; return TRUE; /* ERRORS */ ctrl_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to get value for control %d on device '%s'."), attribute_num, v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } /****************************************************** * gst_v4l2_set_attribute(): * try to set the value of one specific attribute * return value: TRUE on success, FALSE on error ******************************************************/ gboolean gst_v4l2_set_attribute (GstV4l2Object * v4l2object, int attribute_num, const int value) { struct v4l2_control control = { 0, }; GST_DEBUG_OBJECT (v4l2object->element, "setting value of attribute %d to %d", attribute_num, value); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; control.id = attribute_num; control.value = value; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_CTRL, &control) < 0) goto ctrl_failed; return TRUE; /* ERRORS */ ctrl_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to set value %d for control %d on device '%s'."), value, attribute_num, v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } gboolean gst_v4l2_get_input (GstV4l2Object * v4l2object, gint * input) { gint n; GST_DEBUG_OBJECT (v4l2object->element, "trying to get input"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_INPUT, &n) < 0) goto input_failed; *input = n; GST_DEBUG_OBJECT (v4l2object->element, "input: %d", n); return TRUE; /* ERRORS */ input_failed: if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { /* only give a warning message if driver actually claims to have tuner * support */ GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to get current input on device '%s'. May be it is a radio device"), v4l2object->videodev), GST_ERROR_SYSTEM); } return FALSE; } gboolean gst_v4l2_set_input (GstV4l2Object * v4l2object, gint input) { GST_DEBUG_OBJECT (v4l2object->element, "trying to set input to %d", input); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_INPUT, &input) < 0) goto input_failed; return TRUE; /* ERRORS */ input_failed: if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { /* only give a warning message if driver actually claims to have tuner * support */ GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to set input %d on device %s."), input, v4l2object->videodev), GST_ERROR_SYSTEM); } return FALSE; } gboolean gst_v4l2_get_output (GstV4l2Object * v4l2object, gint * output) { gint n; GST_DEBUG_OBJECT (v4l2object->element, "trying to get output"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_OUTPUT, &n) < 0) goto output_failed; *output = n; GST_DEBUG_OBJECT (v4l2object->element, "output: %d", n); return TRUE; /* ERRORS */ output_failed: if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { /* only give a warning message if driver actually claims to have tuner * support */ GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to get current output on device '%s'. May be it is a radio device"), v4l2object->videodev), GST_ERROR_SYSTEM); } return FALSE; } gboolean gst_v4l2_set_output (GstV4l2Object * v4l2object, gint output) { GST_DEBUG_OBJECT (v4l2object->element, "trying to set output to %d", output); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_S_OUTPUT, &output) < 0) goto output_failed; return TRUE; /* ERRORS */ output_failed: if (v4l2object->vcap.capabilities & V4L2_CAP_TUNER) { /* only give a warning message if driver actually claims to have tuner * support */ GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to set output %d on device %s."), output, v4l2object->videodev), GST_ERROR_SYSTEM); } return FALSE; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2vidorient.c0000644000175000017500000000554411671175354017023 00000000000000/* GStreamer * * Copyright (C) 2006 Edgard Lima * * gstv4l2vidorient.c: video orientation interface implementation for V4L2 * * 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 #include "gstv4l2vidorient.h" #include "gstv4l2object.h" #include "v4l2_calls.h" #include "v4l2src_calls.h" GST_DEBUG_CATEGORY_STATIC (v4l2vo_debug); #define GST_CAT_DEFAULT v4l2vo_debug /* Those are deprecated calls that have been replaced */ #ifndef V4L2_CID_HCENTER #define V4L2_CID_HCENTER V4L2_CID_PAN_RESET #endif #ifndef V4L2_CID_VCENTER #define V4L2_CID_VCENTER V4L2_CID_TILT_RESET #endif void gst_v4l2_video_orientation_interface_init (GstVideoOrientationInterface * klass) { GST_DEBUG_CATEGORY_INIT (v4l2vo_debug, "v4l2vo", 0, "V4L2 VideoOrientation interface debugging"); } gboolean gst_v4l2_video_orientation_get_hflip (GstV4l2Object * v4l2object, gboolean * flip) { return gst_v4l2_get_attribute (v4l2object, V4L2_CID_HFLIP, flip); } gboolean gst_v4l2_video_orientation_get_vflip (GstV4l2Object * v4l2object, gboolean * flip) { return gst_v4l2_get_attribute (v4l2object, V4L2_CID_VFLIP, flip); } gboolean gst_v4l2_video_orientation_get_hcenter (GstV4l2Object * v4l2object, gint * center) { return gst_v4l2_get_attribute (v4l2object, V4L2_CID_HCENTER, center); } gboolean gst_v4l2_video_orientation_get_vcenter (GstV4l2Object * v4l2object, gint * center) { return gst_v4l2_get_attribute (v4l2object, V4L2_CID_VCENTER, center); } gboolean gst_v4l2_video_orientation_set_hflip (GstV4l2Object * v4l2object, gboolean flip) { return gst_v4l2_set_attribute (v4l2object, V4L2_CID_HFLIP, flip); } gboolean gst_v4l2_video_orientation_set_vflip (GstV4l2Object * v4l2object, gboolean flip) { return gst_v4l2_set_attribute (v4l2object, V4L2_CID_VFLIP, flip); } gboolean gst_v4l2_video_orientation_set_hcenter (GstV4l2Object * v4l2object, gint center) { return gst_v4l2_set_attribute (v4l2object, V4L2_CID_HCENTER, center); } gboolean gst_v4l2_video_orientation_set_vcenter (GstV4l2Object * v4l2object, gint center) { return gst_v4l2_set_attribute (v4l2object, V4L2_CID_VCENTER, center); } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2sink.h0000644000175000017500000000511011671175354015756 00000000000000/* GStreamer * * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/ * * Description: V4L2 sink element * Created on: Jul 2, 2009 * Author: Rob Clark * * 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 __GSTV4L2SINK_H__ #define __GSTV4L2SINK_H__ #include #include #include GST_DEBUG_CATEGORY_EXTERN (v4l2sink_debug); G_BEGIN_DECLS #define GST_TYPE_V4L2SINK \ (gst_v4l2sink_get_type()) #define GST_V4L2SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_V4L2SINK, GstV4l2Sink)) #define GST_V4L2SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_V4L2SINK, GstV4l2SinkClass)) #define GST_IS_V4L2SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_V4L2SINK)) #define GST_IS_V4L2SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_V4L2SINK)) typedef struct _GstV4l2Sink GstV4l2Sink; typedef struct _GstV4l2SinkClass GstV4l2SinkClass; struct _GstV4l2Sink { GstVideoSink videosink; /*< private >*/ GstV4l2Object * v4l2object; GstCaps *probed_caps; /* all supported caps of underlying v4l2 device */ GstCaps *current_caps; /* the current negotiated caps */ GstV4l2BufferPool *pool; guint32 num_buffers; guint32 min_queued_bufs; gint video_width, video_height; /* original (unscaled) video w/h */ /* * field to store requested overlay and crop top/left/width/height props: * note, could maybe be combined with 'vwin' field in GstV4l2Object? */ struct v4l2_rect overlay, crop; /* * bitmask to track which overlay and crop fields user has requested by * setting properties: */ guint8 overlay_fields_set, crop_fields_set; guint8 state; }; struct _GstV4l2SinkClass { GstVideoSinkClass parent_class; GList *v4l2_class_devices; }; GType gst_v4l2sink_get_type(void); G_END_DECLS #endif /* __GSTV4L2SINK_H__ */ gst-plugins-good-0.10.31/sys/v4l2/gstv4l2colorbalance.h0000644000175000017500000001340411671175354017443 00000000000000/* GStreamer * * Copyright (C) 2003 Ronald Bultje * 2006 Edgard Lima * * gstv4l2colorbalance.h: color balance interface implementation for V4L2 * * 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_V4L2_COLOR_BALANCE_H__ #define __GST_V4L2_COLOR_BALANCE_H__ #include #include #include "v4l2_calls.h" G_BEGIN_DECLS #define GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL \ (gst_v4l2_color_balance_channel_get_type ()) #define GST_V4L2_COLOR_BALANCE_CHANNEL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, \ GstV4l2ColorBalanceChannel)) #define GST_V4L2_COLOR_BALANCE_CHANNEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL, \ GstV4l2ColorBalanceChannelClass)) #define GST_IS_V4L2_COLOR_BALANCE_CHANNEL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL)) #define GST_IS_V4L2_COLOR_BALANCE_CHANNEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_COLOR_BALANCE_CHANNEL)) typedef struct _GstV4l2ColorBalanceChannel { GstColorBalanceChannel parent; guint32 id; } GstV4l2ColorBalanceChannel; typedef struct _GstV4l2ColorBalanceChannelClass { GstColorBalanceChannelClass parent; } GstV4l2ColorBalanceChannelClass; GType gst_v4l2_color_balance_channel_get_type (void); const GList * gst_v4l2_color_balance_list_channels (GstV4l2Object * v4l2object); void gst_v4l2_color_balance_set_value (GstV4l2Object * v4l2object, GstColorBalanceChannel * channel, gint value); gint gst_v4l2_color_balance_get_value (GstV4l2Object * v4l2object, GstColorBalanceChannel * channel); #define GST_IMPLEMENT_V4L2_COLOR_BALANCE_METHODS(Type, interface_as_function) \ \ static const GList * \ interface_as_function ## _color_balance_list_channels (GstColorBalance * balance) \ { \ Type *this = (Type*) balance; \ return gst_v4l2_color_balance_list_channels(this->v4l2object); \ } \ \ static void \ interface_as_function ## _color_balance_set_value (GstColorBalance * balance, \ GstColorBalanceChannel * channel, \ gint value) \ { \ Type *this = (Type*) balance; \ gst_v4l2_color_balance_set_value(this->v4l2object, channel, value); \ } \ \ static gint \ interface_as_function ## _color_balance_get_value (GstColorBalance * balance, \ GstColorBalanceChannel * channel) \ { \ Type *this = (Type*) balance; \ return gst_v4l2_color_balance_get_value(this->v4l2object, channel); \ } \ \ static void \ interface_as_function ## _color_balance_interface_init (GstColorBalanceClass * klass) \ { \ GST_COLOR_BALANCE_TYPE (klass) = GST_COLOR_BALANCE_HARDWARE; \ \ /* default virtual functions */ \ klass->list_channels = interface_as_function ## _color_balance_list_channels; \ klass->set_value = interface_as_function ## _color_balance_set_value; \ klass->get_value = interface_as_function ## _color_balance_get_value; \ } \ #endif /* __GST_V4L2_COLOR_BALANCE_H__ */ gst-plugins-good-0.10.31/sys/v4l2/gstv4l2src.c0000644000175000017500000007347211705514352015605 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * * gstv4l2src.c: Video4Linux2 source element * * 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-v4l2src * * v4l2src can be used to capture video from v4l2 devices, like webcams and tv * cards. * * * Example launch lines * |[ * gst-launch v4l2src ! xvimagesink * ]| This pipeline shows the video captured from /dev/video0 tv card and for * webcams. * |[ * gst-launch v4l2src ! jpegdec ! xvimagesink * ]| This pipeline shows the video captured from a webcam that delivers jpeg * images. * */ #ifdef HAVE_CONFIG_H #include #endif #undef HAVE_XVIDEO #include #include #include "v4l2src_calls.h" #include #include "gstv4l2colorbalance.h" #include "gstv4l2tuner.h" #ifdef HAVE_XVIDEO #include "gstv4l2xoverlay.h" #endif #include "gstv4l2vidorient.h" #include "gst/gst-i18n-plugin.h" GST_DEBUG_CATEGORY (v4l2src_debug); #define GST_CAT_DEFAULT v4l2src_debug #define PROP_DEF_QUEUE_SIZE 2 #define PROP_DEF_ALWAYS_COPY TRUE #define PROP_DEF_DECIMATE 1 #define DEFAULT_PROP_DEVICE "/dev/video0" enum { PROP_0, V4L2_STD_OBJECT_PROPS, PROP_QUEUE_SIZE, PROP_ALWAYS_COPY, PROP_DECIMATE }; GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SrcClass, gst_v4l2src); GST_IMPLEMENT_V4L2_COLOR_BALANCE_METHODS (GstV4l2Src, gst_v4l2src); GST_IMPLEMENT_V4L2_TUNER_METHODS (GstV4l2Src, gst_v4l2src); #ifdef HAVE_XVIDEO GST_IMPLEMENT_V4L2_XOVERLAY_METHODS (GstV4l2Src, gst_v4l2src); #endif GST_IMPLEMENT_V4L2_VIDORIENT_METHODS (GstV4l2Src, gst_v4l2src); static void gst_v4l2src_uri_handler_init (gpointer g_iface, gpointer iface_data); static gboolean gst_v4l2src_iface_supported (GstImplementsInterface * iface, GType iface_type) { GstV4l2Object *v4l2object = GST_V4L2SRC (iface)->v4l2object; #ifdef HAVE_XVIDEO if (!(iface_type == GST_TYPE_TUNER || iface_type == GST_TYPE_X_OVERLAY || iface_type == GST_TYPE_COLOR_BALANCE || iface_type == GST_TYPE_VIDEO_ORIENTATION)) return FALSE; #else if (!(iface_type == GST_TYPE_TUNER || iface_type == GST_TYPE_COLOR_BALANCE || iface_type == GST_TYPE_VIDEO_ORIENTATION)) return FALSE; #endif if (v4l2object->video_fd == -1) return FALSE; #ifdef HAVE_XVIDEO if (iface_type == GST_TYPE_X_OVERLAY && !GST_V4L2_IS_OVERLAY (v4l2object)) return FALSE; #endif return TRUE; } static void gst_v4l2src_interface_init (GstImplementsInterfaceClass * klass) { /* * default virtual functions */ klass->supported = gst_v4l2src_iface_supported; } static void gst_v4l2src_init_interfaces (GType type) { static const GInterfaceInfo urihandler_info = { gst_v4l2src_uri_handler_init, NULL, NULL }; static const GInterfaceInfo v4l2iface_info = { (GInterfaceInitFunc) gst_v4l2src_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_tuner_info = { (GInterfaceInitFunc) gst_v4l2src_tuner_interface_init, NULL, NULL, }; #ifdef HAVE_XVIDEO /* FIXME: does GstXOverlay for v4l2src make sense in a GStreamer context? */ static const GInterfaceInfo v4l2_xoverlay_info = { (GInterfaceInitFunc) gst_v4l2src_xoverlay_interface_init, NULL, NULL, }; #endif static const GInterfaceInfo v4l2_colorbalance_info = { (GInterfaceInitFunc) gst_v4l2src_color_balance_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_videoorientation_info = { (GInterfaceInitFunc) gst_v4l2src_video_orientation_interface_init, NULL, NULL, }; static const GInterfaceInfo v4l2_propertyprobe_info = { (GInterfaceInitFunc) gst_v4l2src_property_probe_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2iface_info); g_type_add_interface_static (type, GST_TYPE_TUNER, &v4l2_tuner_info); #ifdef HAVE_XVIDEO g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, &v4l2_xoverlay_info); #endif g_type_add_interface_static (type, GST_TYPE_COLOR_BALANCE, &v4l2_colorbalance_info); g_type_add_interface_static (type, GST_TYPE_VIDEO_ORIENTATION, &v4l2_videoorientation_info); g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &v4l2_propertyprobe_info); } GST_BOILERPLATE_FULL (GstV4l2Src, gst_v4l2src, GstPushSrc, GST_TYPE_PUSH_SRC, gst_v4l2src_init_interfaces); static void gst_v4l2src_dispose (GObject * object); static void gst_v4l2src_finalize (GstV4l2Src * v4l2src); /* element methods */ static GstStateChangeReturn gst_v4l2src_change_state (GstElement * element, GstStateChange transition); /* basesrc methods */ static gboolean gst_v4l2src_start (GstBaseSrc * src); static gboolean gst_v4l2src_unlock (GstBaseSrc * src); static gboolean gst_v4l2src_unlock_stop (GstBaseSrc * src); static gboolean gst_v4l2src_stop (GstBaseSrc * src); static gboolean gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps); static GstCaps *gst_v4l2src_get_caps (GstBaseSrc * src); static gboolean gst_v4l2src_query (GstBaseSrc * bsrc, GstQuery * query); static GstFlowReturn gst_v4l2src_create (GstPushSrc * src, GstBuffer ** out); static void gst_v4l2src_fixate (GstBaseSrc * basesrc, GstCaps * caps); static gboolean gst_v4l2src_negotiate (GstBaseSrc * basesrc); static void gst_v4l2src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_v4l2src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* get_frame io methods */ static GstFlowReturn gst_v4l2src_get_read (GstV4l2Src * v4l2src, GstBuffer ** buf); static GstFlowReturn gst_v4l2src_get_mmap (GstV4l2Src * v4l2src, GstBuffer ** buf); static void gst_v4l2src_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); GstV4l2SrcClass *gstv4l2src_class = GST_V4L2SRC_CLASS (g_class); GstPadTemplate *pad_template; gstv4l2src_class->v4l2_class_devices = NULL; GST_DEBUG_CATEGORY_INIT (v4l2src_debug, "v4l2src", 0, "V4L2 source element"); gst_element_class_set_details_simple (gstelement_class, "Video (video4linux2) Source", "Source/Video", "Reads frames from a Video4Linux2 device", "Edgard Lima ," " Stefan Kost "); pad_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_v4l2_object_get_all_caps ()); gst_element_class_add_pad_template (gstelement_class, pad_template); gst_object_unref (pad_template); } static void gst_v4l2src_class_init (GstV4l2SrcClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class; GstBaseSrcClass *basesrc_class; GstPushSrcClass *pushsrc_class; gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); basesrc_class = GST_BASE_SRC_CLASS (klass); pushsrc_class = GST_PUSH_SRC_CLASS (klass); gobject_class->dispose = gst_v4l2src_dispose; gobject_class->finalize = (GObjectFinalizeFunc) gst_v4l2src_finalize; gobject_class->set_property = gst_v4l2src_set_property; gobject_class->get_property = gst_v4l2src_get_property; element_class->change_state = gst_v4l2src_change_state; gst_v4l2_object_install_properties_helper (gobject_class, DEFAULT_PROP_DEVICE); g_object_class_install_property (gobject_class, PROP_QUEUE_SIZE, g_param_spec_uint ("queue-size", "Queue size", "Number of buffers to be enqueud in the driver in streaming mode", GST_V4L2_MIN_BUFFERS, GST_V4L2_MAX_BUFFERS, PROP_DEF_QUEUE_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_ALWAYS_COPY, g_param_spec_boolean ("always-copy", "Always Copy", "If the buffer will or not be used directly from mmap", PROP_DEF_ALWAYS_COPY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstV4l2Src:decimate * * Only use every nth frame * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_DECIMATE, g_param_spec_int ("decimate", "Decimate", "Only use every nth frame", 1, G_MAXINT, PROP_DEF_DECIMATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_get_caps); basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_set_caps); basesrc_class->start = GST_DEBUG_FUNCPTR (gst_v4l2src_start); basesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_v4l2src_unlock); basesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_v4l2src_unlock_stop); basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_v4l2src_stop); basesrc_class->query = GST_DEBUG_FUNCPTR (gst_v4l2src_query); basesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_v4l2src_fixate); basesrc_class->negotiate = GST_DEBUG_FUNCPTR (gst_v4l2src_negotiate); pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_v4l2src_create); } static void gst_v4l2src_init (GstV4l2Src * v4l2src, GstV4l2SrcClass * klass) { /* fixme: give an update_fps_function */ v4l2src->v4l2object = gst_v4l2_object_new (GST_ELEMENT (v4l2src), V4L2_BUF_TYPE_VIDEO_CAPTURE, DEFAULT_PROP_DEVICE, gst_v4l2_get_input, gst_v4l2_set_input, NULL); /* number of buffers requested */ v4l2src->num_buffers = PROP_DEF_QUEUE_SIZE; v4l2src->always_copy = PROP_DEF_ALWAYS_COPY; v4l2src->decimate = PROP_DEF_DECIMATE; v4l2src->is_capturing = FALSE; gst_base_src_set_format (GST_BASE_SRC (v4l2src), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (v4l2src), TRUE); v4l2src->fps_d = 0; v4l2src->fps_n = 0; } static void gst_v4l2src_dispose (GObject * object) { GstV4l2Src *v4l2src = GST_V4L2SRC (object); if (v4l2src->probed_caps) { gst_caps_unref (v4l2src->probed_caps); } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_v4l2src_finalize (GstV4l2Src * v4l2src) { gst_v4l2_object_destroy (v4l2src->v4l2object); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (v4l2src)); } static void gst_v4l2src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstV4l2Src *v4l2src = GST_V4L2SRC (object); if (!gst_v4l2_object_set_property_helper (v4l2src->v4l2object, prop_id, value, pspec)) { switch (prop_id) { case PROP_QUEUE_SIZE: v4l2src->num_buffers = g_value_get_uint (value); break; case PROP_ALWAYS_COPY: v4l2src->always_copy = g_value_get_boolean (value); break; case PROP_DECIMATE: v4l2src->decimate = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } } static void gst_v4l2src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstV4l2Src *v4l2src = GST_V4L2SRC (object); if (!gst_v4l2_object_get_property_helper (v4l2src->v4l2object, prop_id, value, pspec)) { switch (prop_id) { case PROP_QUEUE_SIZE: g_value_set_uint (value, v4l2src->num_buffers); break; case PROP_ALWAYS_COPY: g_value_set_boolean (value, v4l2src->always_copy); break; case PROP_DECIMATE: g_value_set_int (value, v4l2src->decimate); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } } /* this function is a bit of a last resort */ static void gst_v4l2src_fixate (GstBaseSrc * basesrc, GstCaps * caps) { GstStructure *structure; gint i; GST_DEBUG_OBJECT (basesrc, "fixating caps %" GST_PTR_FORMAT, caps); for (i = 0; i < gst_caps_get_size (caps); ++i) { const GValue *v; structure = gst_caps_get_structure (caps, i); /* FIXME such sizes? we usually fixate to something in the 320x200 * range... */ /* We are fixating to greater possble size (limited to GST_V4L2_MAX_SIZE) and the maximum framerate resolution for that size */ gst_structure_fixate_field_nearest_int (structure, "width", GST_V4L2_MAX_SIZE); gst_structure_fixate_field_nearest_int (structure, "height", GST_V4L2_MAX_SIZE); gst_structure_fixate_field_nearest_fraction (structure, "framerate", G_MAXINT, 1); v = gst_structure_get_value (structure, "format"); if (v && G_VALUE_TYPE (v) != GST_TYPE_FOURCC) { guint32 fourcc; g_return_if_fail (G_VALUE_TYPE (v) == GST_TYPE_LIST); fourcc = gst_value_get_fourcc (gst_value_list_get_value (v, 0)); gst_structure_set (structure, "format", GST_TYPE_FOURCC, fourcc, NULL); } } GST_DEBUG_OBJECT (basesrc, "fixated caps %" GST_PTR_FORMAT, caps); } static gboolean gst_v4l2src_negotiate (GstBaseSrc * basesrc) { GstCaps *thiscaps; GstCaps *caps = NULL; GstCaps *peercaps = NULL; gboolean result = FALSE; /* first see what is possible on our source pad */ thiscaps = gst_pad_get_caps (GST_BASE_SRC_PAD (basesrc)); GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps); LOG_CAPS (basesrc, thiscaps); /* nothing or anything is allowed, we're done */ if (thiscaps == NULL || gst_caps_is_any (thiscaps)) goto no_nego_needed; /* get the peer caps */ peercaps = gst_pad_peer_get_caps (GST_BASE_SRC_PAD (basesrc)); GST_DEBUG_OBJECT (basesrc, "caps of peer: %" GST_PTR_FORMAT, peercaps); LOG_CAPS (basesrc, peercaps); if (peercaps && !gst_caps_is_any (peercaps)) { GstCaps *icaps = NULL; int i; /* Prefer the first caps we are compatible with that the peer proposed */ for (i = 0; i < gst_caps_get_size (peercaps); i++) { /* get intersection */ GstCaps *ipcaps = gst_caps_copy_nth (peercaps, i); GST_DEBUG_OBJECT (basesrc, "peer: %" GST_PTR_FORMAT, ipcaps); LOG_CAPS (basesrc, ipcaps); icaps = gst_caps_intersect (thiscaps, ipcaps); gst_caps_unref (ipcaps); if (!gst_caps_is_empty (icaps)) break; gst_caps_unref (icaps); icaps = NULL; } GST_DEBUG_OBJECT (basesrc, "intersect: %" GST_PTR_FORMAT, icaps); LOG_CAPS (basesrc, icaps); if (icaps) { /* If there are multiple intersections pick the one with the smallest * resolution strictly bigger then the first peer caps */ if (gst_caps_get_size (icaps) > 1) { GstStructure *s = gst_caps_get_structure (peercaps, 0); int best = 0; int twidth, theight; int width = G_MAXINT, height = G_MAXINT; if (gst_structure_get_int (s, "width", &twidth) && gst_structure_get_int (s, "height", &theight)) { /* Walk the structure backwards to get the first entry of the * smallest resolution bigger (or equal to) the preferred resolution) */ for (i = gst_caps_get_size (icaps) - 1; i >= 0; i--) { GstStructure *is = gst_caps_get_structure (icaps, i); int w, h; if (gst_structure_get_int (is, "width", &w) && gst_structure_get_int (is, "height", &h)) { if (w >= twidth && w <= width && h >= theight && h <= height) { width = w; height = h; best = i; } } } } caps = gst_caps_copy_nth (icaps, best); gst_caps_unref (icaps); } else { caps = icaps; } } gst_caps_unref (thiscaps); } else { /* no peer or peer have ANY caps, work with our own caps then */ caps = thiscaps; } if (peercaps) gst_caps_unref (peercaps); if (caps) { caps = gst_caps_make_writable (caps); gst_caps_truncate (caps); /* now fixate */ if (!gst_caps_is_empty (caps)) { gst_pad_fixate_caps (GST_BASE_SRC_PAD (basesrc), caps); GST_DEBUG_OBJECT (basesrc, "fixated to: %" GST_PTR_FORMAT, caps); LOG_CAPS (basesrc, caps); if (gst_caps_is_any (caps)) { /* hmm, still anything, so element can do anything and * nego is not needed */ result = TRUE; } else if (gst_caps_is_fixed (caps)) { /* yay, fixed caps, use those then */ if (gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), caps)) result = TRUE; } } gst_caps_unref (caps); } return result; no_nego_needed: { GST_DEBUG_OBJECT (basesrc, "no negotiation needed"); if (thiscaps) gst_caps_unref (thiscaps); return TRUE; } } static GstCaps * gst_v4l2src_get_caps (GstBaseSrc * src) { GstV4l2Src *v4l2src = GST_V4L2SRC (src); GstCaps *ret; GSList *walk; GSList *formats; if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) { /* FIXME: copy? */ return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (v4l2src))); } if (v4l2src->probed_caps) return gst_caps_ref (v4l2src->probed_caps); formats = gst_v4l2_object_get_format_list (v4l2src->v4l2object); ret = gst_caps_new_empty (); for (walk = formats; walk; walk = walk->next) { struct v4l2_fmtdesc *format; GstStructure *template; format = (struct v4l2_fmtdesc *) walk->data; template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat); if (template) { GstCaps *tmp; tmp = gst_v4l2_object_probe_caps_for_format (v4l2src->v4l2object, format->pixelformat, template); if (tmp) gst_caps_append (ret, tmp); gst_structure_free (template); } else { GST_DEBUG_OBJECT (v4l2src, "unknown format %u", format->pixelformat); } } v4l2src->probed_caps = gst_caps_ref (ret); GST_INFO_OBJECT (v4l2src, "probed caps: %" GST_PTR_FORMAT, ret); return ret; } static gboolean gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps) { GstV4l2Src *v4l2src; gint w = 0, h = 0; gboolean interlaced; struct v4l2_fmtdesc *format; guint fps_n, fps_d; guint size; v4l2src = GST_V4L2SRC (src); /* if we're not open, punt -- we'll get setcaps'd later via negotiate */ if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) return FALSE; /* make sure we stop capturing and dealloc buffers */ if (GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) { /* both will throw an element-error on failure */ if (!gst_v4l2src_capture_stop (v4l2src)) return FALSE; if (!gst_v4l2src_capture_deinit (v4l2src)) return FALSE; } /* we want our own v4l2 type of fourcc codes */ if (!gst_v4l2_object_get_caps_info (v4l2src->v4l2object, caps, &format, &w, &h, &interlaced, &fps_n, &fps_d, &size)) { GST_INFO_OBJECT (v4l2src, "can't get capture format from caps %" GST_PTR_FORMAT, caps); return FALSE; } GST_DEBUG_OBJECT (v4l2src, "trying to set_capture %dx%d at %d/%d fps, " "format %s", w, h, fps_n, fps_d, format->description); if (!gst_v4l2src_set_capture (v4l2src, format->pixelformat, w, h, interlaced, fps_n, fps_d)) /* error already posted */ return FALSE; if (!gst_v4l2src_capture_init (v4l2src, caps)) return FALSE; if (v4l2src->use_mmap) { v4l2src->get_frame = gst_v4l2src_get_mmap; } else { v4l2src->get_frame = gst_v4l2src_get_read; } if (!gst_v4l2src_capture_start (v4l2src)) return FALSE; /* now store the expected output size */ v4l2src->frame_byte_size = size; return TRUE; } static gboolean gst_v4l2src_query (GstBaseSrc * bsrc, GstQuery * query) { GstV4l2Src *src; gboolean res = FALSE; src = GST_V4L2SRC (bsrc); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY:{ GstClockTime min_latency, max_latency; /* device must be open */ if (!GST_V4L2_IS_OPEN (src->v4l2object)) { GST_WARNING_OBJECT (src, "Can't give latency since device isn't open !"); goto done; } /* we must have a framerate */ if (src->fps_n <= 0 || src->fps_d <= 0) { GST_WARNING_OBJECT (src, "Can't give latency since framerate isn't fixated !"); goto done; } /* min latency is the time to capture one frame */ min_latency = gst_util_uint64_scale_int (GST_SECOND, src->fps_d, src->fps_n); /* max latency is total duration of the frame buffer */ max_latency = src->num_buffers * min_latency; GST_DEBUG_OBJECT (bsrc, "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); /* we are always live, the min latency is 1 frame and the max latency is * the complete buffer of frames. */ gst_query_set_latency (query, TRUE, min_latency, max_latency); res = TRUE; break; } default: res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); break; } done: return res; } /* start and stop are not symmetric -- start will open the device, but not start * capture. it's setcaps that will start capture, which is called via basesrc's * negotiate method. stop will both stop capture and close the device. */ static gboolean gst_v4l2src_start (GstBaseSrc * src) { GstV4l2Src *v4l2src = GST_V4L2SRC (src); v4l2src->offset = 0; /* activate settings for first frame */ v4l2src->ctrl_time = 0; gst_object_sync_values (G_OBJECT (src), v4l2src->ctrl_time); return TRUE; } static gboolean gst_v4l2src_unlock (GstBaseSrc * src) { GstV4l2Src *v4l2src = GST_V4L2SRC (src); GST_LOG_OBJECT (src, "Flushing"); gst_poll_set_flushing (v4l2src->v4l2object->poll, TRUE); return TRUE; } static gboolean gst_v4l2src_unlock_stop (GstBaseSrc * src) { GstV4l2Src *v4l2src = GST_V4L2SRC (src); GST_LOG_OBJECT (src, "No longer flushing"); gst_poll_set_flushing (v4l2src->v4l2object->poll, FALSE); return TRUE; } static gboolean gst_v4l2src_stop (GstBaseSrc * src) { GstV4l2Src *v4l2src = GST_V4L2SRC (src); if (GST_V4L2_IS_ACTIVE (v4l2src->v4l2object) && !gst_v4l2src_capture_stop (v4l2src)) return FALSE; if (v4l2src->v4l2object->buffer != NULL) { if (!gst_v4l2src_capture_deinit (v4l2src)) return FALSE; } v4l2src->fps_d = 0; v4l2src->fps_n = 0; return TRUE; } static GstStateChangeReturn gst_v4l2src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstV4l2Src *v4l2src = GST_V4L2SRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: /* open the device */ if (!gst_v4l2_object_start (v4l2src->v4l2object)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: /* close the device */ if (!gst_v4l2_object_stop (v4l2src->v4l2object)) return GST_STATE_CHANGE_FAILURE; if (v4l2src->probed_caps) { gst_caps_unref (v4l2src->probed_caps); v4l2src->probed_caps = NULL; } break; default: break; } return ret; } static GstFlowReturn gst_v4l2src_get_read (GstV4l2Src * v4l2src, GstBuffer ** buf) { gint amount; gint ret; gint buffersize; buffersize = v4l2src->frame_byte_size; /* In case the size per frame is unknown assume it's a streaming format (e.g. * mpegts) and grab a reasonable default size instead */ if (buffersize == 0) buffersize = GST_BASE_SRC (v4l2src)->blocksize; *buf = gst_buffer_new_and_alloc (buffersize); do { ret = gst_poll_wait (v4l2src->v4l2object->poll, GST_CLOCK_TIME_NONE); if (G_UNLIKELY (ret < 0)) { if (errno == EBUSY) goto stopped; if (errno == ENXIO) { GST_DEBUG_OBJECT (v4l2src, "v4l2 device doesn't support polling. Disabling"); v4l2src->v4l2object->can_poll_device = FALSE; } else { if (errno != EAGAIN && errno != EINTR) goto select_error; } } amount = v4l2_read (v4l2src->v4l2object->video_fd, GST_BUFFER_DATA (*buf), buffersize); if (amount == buffersize) { break; } else if (amount == -1) { if (errno == EAGAIN || errno == EINTR) { continue; } else goto read_error; } else { /* short reads can happen if a signal interrupts the read */ continue; } } while (TRUE); /* we set the buffer metadata in gst_v4l2src_create() */ return GST_FLOW_OK; /* ERRORS */ select_error: { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL), ("select error %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } stopped: { GST_DEBUG ("stop called"); return GST_FLOW_WRONG_STATE; } read_error: { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (_("Error reading %d bytes from device '%s'."), buffersize, v4l2src->v4l2object->videodev), GST_ERROR_SYSTEM); gst_buffer_unref (*buf); return GST_FLOW_ERROR; } } static GstFlowReturn gst_v4l2src_get_mmap (GstV4l2Src * v4l2src, GstBuffer ** buf) { GstBuffer *temp; GstFlowReturn ret; guint size; guint count = 0; again: ret = gst_v4l2src_grab_frame (v4l2src, &temp); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto done; if (v4l2src->frame_byte_size > 0) { size = GST_BUFFER_SIZE (temp); /* if size does not match what we expected, try again */ if (size != v4l2src->frame_byte_size) { GST_ELEMENT_WARNING (v4l2src, RESOURCE, READ, (_("Got unexpected frame size of %u instead of %u."), size, v4l2src->frame_byte_size), (NULL)); gst_buffer_unref (temp); if (count++ > 50) goto size_error; goto again; } } *buf = temp; done: return ret; /* ERRORS */ size_error: { GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (_("Error reading %d bytes on device '%s'."), v4l2src->frame_byte_size, v4l2src->v4l2object->videodev), (NULL)); return GST_FLOW_ERROR; } } static GstFlowReturn gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) { GstV4l2Src *v4l2src = GST_V4L2SRC (src); int i; GstFlowReturn ret; for (i = 0; i < v4l2src->decimate - 1; i++) { ret = v4l2src->get_frame (v4l2src, buf); if (ret != GST_FLOW_OK) { return ret; } gst_buffer_unref (*buf); } ret = v4l2src->get_frame (v4l2src, buf); /* set buffer metadata */ if (G_LIKELY (ret == GST_FLOW_OK && *buf)) { GstClock *clock; GstClockTime timestamp; GST_BUFFER_OFFSET (*buf) = v4l2src->offset++; GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset; /* timestamps, LOCK to get clock and base time. */ /* FIXME: element clock and base_time is rarely changing */ GST_OBJECT_LOCK (v4l2src); if ((clock = GST_ELEMENT_CLOCK (v4l2src))) { /* we have a clock, get base time and ref clock */ timestamp = GST_ELEMENT (v4l2src)->base_time; gst_object_ref (clock); } else { /* no clock, can't set timestamps */ timestamp = GST_CLOCK_TIME_NONE; } GST_OBJECT_UNLOCK (v4l2src); if (G_LIKELY (clock)) { /* the time now is the time of the clock minus the base time */ timestamp = gst_clock_get_time (clock) - timestamp; gst_object_unref (clock); /* if we have a framerate adjust timestamp for frame latency */ if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) { if (timestamp > v4l2src->duration) timestamp -= v4l2src->duration; else timestamp = 0; } } /* activate settings for next frame */ if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) { v4l2src->ctrl_time += v4l2src->duration; } else { /* this is not very good (as it should be the next timestamp), * still good enough for linear fades (as long as it is not -1) */ v4l2src->ctrl_time = timestamp; } gst_object_sync_values (G_OBJECT (src), v4l2src->ctrl_time); GST_INFO_OBJECT (src, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (v4l2src->ctrl_time)); /* FIXME: use the timestamp from the buffer itself! */ GST_BUFFER_TIMESTAMP (*buf) = timestamp; GST_BUFFER_DURATION (*buf) = v4l2src->duration; } return ret; } /* GstURIHandler interface */ static GstURIType gst_v4l2src_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_v4l2src_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "v4l2", NULL }; return protocols; } static const gchar * gst_v4l2src_uri_get_uri (GstURIHandler * handler) { GstV4l2Src *v4l2src = GST_V4L2SRC (handler); if (v4l2src->v4l2object->videodev != NULL) { gchar uri[256]; /* need to return a const string, but also don't want to leak the generated * string, so just intern it - there's a limited number of video devices * after all */ g_snprintf (uri, sizeof (uri), "v4l2://%s", v4l2src->v4l2object->videodev); return g_intern_string (uri); } return "v4l2://"; } static gboolean gst_v4l2src_uri_set_uri (GstURIHandler * handler, const gchar * uri) { GstV4l2Src *v4l2src = GST_V4L2SRC (handler); const gchar *device = DEFAULT_PROP_DEVICE; if (strcmp (uri, "v4l2://") != 0) { device = uri + 7; } g_object_set (v4l2src, "device", device, NULL); return TRUE; } static void gst_v4l2src_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_v4l2src_uri_get_type; iface->get_protocols = gst_v4l2src_uri_get_protocols; iface->get_uri = gst_v4l2src_uri_get_uri; iface->set_uri = gst_v4l2src_uri_set_uri; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2vidorient.h0000644000175000017500000002132411671175354017022 00000000000000/* GStreamer * * Copyright (C) 2006 Edgard Lima * * gstv4l2vidorient.h: video orientation interface implementation for V4L2 * * 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_V4L2_VIDORIENT_H__ #define __GST_V4L2_VIDORIENT_H__ #include #include #include "gstv4l2object.h" G_BEGIN_DECLS void gst_v4l2_video_orientation_interface_init (GstVideoOrientationInterface * klass); gboolean gst_v4l2_video_orientation_get_hflip (GstV4l2Object *v4l2object, gboolean *flip); gboolean gst_v4l2_video_orientation_get_vflip (GstV4l2Object *v4l2object, gboolean *flip); gboolean gst_v4l2_video_orientation_get_hcenter (GstV4l2Object *v4l2object, gint *center); gboolean gst_v4l2_video_orientation_get_vcenter (GstV4l2Object *v4l2object, gint *center); gboolean gst_v4l2_video_orientation_set_hflip (GstV4l2Object *v4l2object, gboolean flip); gboolean gst_v4l2_video_orientation_set_vflip (GstV4l2Object *v4l2object, gboolean flip); gboolean gst_v4l2_video_orientation_set_hcenter (GstV4l2Object *v4l2object, gint center); gboolean gst_v4l2_video_orientation_set_vcenter (GstV4l2Object *v4l2object, gint center); #define GST_IMPLEMENT_V4L2_VIDORIENT_METHODS(Type, interface_as_function) \ \ static gboolean \ interface_as_function ## _video_orientation_get_hflip (GstVideoOrientation *vo, gboolean *flip) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_get_hflip (this->v4l2object, flip); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_get_vflip (GstVideoOrientation *vo, gboolean *flip) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_get_vflip (this->v4l2object, flip); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_get_hcenter (GstVideoOrientation *vo, gint *center) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_get_hcenter (this->v4l2object, center); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_get_vcenter (GstVideoOrientation *vo, gint *center) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_get_vcenter (this->v4l2object, center); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_set_hflip (GstVideoOrientation *vo, gboolean flip) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_set_hflip (this->v4l2object, flip); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_set_vflip (GstVideoOrientation *vo, gboolean flip) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_set_vflip (this->v4l2object, flip); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_set_hcenter (GstVideoOrientation *vo, gint center) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_set_hcenter (this->v4l2object, center); \ } \ \ static gboolean \ interface_as_function ## _video_orientation_set_vcenter (GstVideoOrientation *vo, gint center) \ { \ Type *this = (Type*) vo; \ return gst_v4l2_video_orientation_set_vcenter (this->v4l2object, center); \ } \ \ static void \ interface_as_function ## _video_orientation_interface_init (GstVideoOrientationInterface * klass) \ { \ /* default virtual functions */ \ klass->get_hflip = interface_as_function ## _video_orientation_get_hflip; \ klass->get_vflip = interface_as_function ## _video_orientation_get_vflip; \ klass->get_hcenter = interface_as_function ## _video_orientation_get_hcenter; \ klass->get_vcenter = interface_as_function ## _video_orientation_get_vcenter; \ klass->set_hflip = interface_as_function ## _video_orientation_set_hflip; \ klass->set_vflip = interface_as_function ## _video_orientation_set_vflip; \ klass->set_hcenter = interface_as_function ## _video_orientation_set_hcenter; \ klass->set_vcenter = interface_as_function ## _video_orientation_set_vcenter; \ } #endif /* __GST_V4L2_VIDORIENT_H__ */ gst-plugins-good-0.10.31/sys/v4l2/README0000644000175000017500000000206411671175354014300 00000000000000v4l2 plugins ============ The idea is a bit the same as the idea for the v4l1 plugins. We want one generic v4l2element, and a few child objects (probably only two: v4l2src and v4l2sink): /-------- v4l2src v4l2element ---= \-------- v4l2sink Both v4l2src and v4l2sink have a uncompressed and a compressed recording-/playback-mode. Since this is all part of v4l2, the 'client' of these elements, i.e. an application using v4l2src/v4l2sink, will hardly notice this. All capsnego stuff is done inside, and the plugin knows which formats are compressed and which are not. Please note that the v4l1 and the v4l2 plugins are *not* compatible concerning properties. Naming has been kept the same where possible, but in some cases, properties had to be removed or added to make full use of v4l2. V4L2 API: http://linux.bytesex.org/v4l2/. http://v4l2spec.bytesex.org/ /usr/include/linux/videodev2.h or Kernel patches available from http://dl.bytesex.org/patches/. Articles: http://lwn.net/Articles/203924/ gst-plugins-good-0.10.31/sys/v4l2/gstv4l2bufferpool.c0000644000175000017500000004471711677341661017172 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * 2009 Texas Instruments, Inc - http://www.ti.com/ * * gstv4l2bufferpool.c V4L2 buffer pool class * * 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 #endif #include #include #include #include "gst/video/video.h" #include #include "gstv4l2src.h" #ifdef HAVE_EXPERIMENTAL #include "gstv4l2sink.h" #endif #include "v4l2_calls.h" #include "gst/gst-i18n-plugin.h" #include /* videodev2.h is not versioned and we can't easily check for the presence * of enum values at compile time, but the V4L2_CAP_VIDEO_OUTPUT_OVERLAY define * was added in the same commit as V4L2_FIELD_INTERLACED_{TB,BT} (b2787845) */ #ifndef V4L2_CAP_VIDEO_OUTPUT_OVERLAY #define V4L2_FIELD_INTERLACED_TB 8 #define V4L2_FIELD_INTERLACED_BT 9 #endif GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); #define GST_CAT_DEFAULT v4l2_debug /* * GstV4l2Buffer: */ static GstBufferClass *v4l2buffer_parent_class = NULL; static void gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer) { GstV4l2BufferPool *pool; gboolean resuscitated = FALSE; gint index; pool = buffer->pool; index = buffer->vbuffer.index; GST_LOG_OBJECT (pool->v4l2elem, "finalizing buffer %p %d", buffer, index); GST_V4L2_BUFFER_POOL_LOCK (pool); if (pool->running) { if (pool->requeuebuf) { if (!gst_v4l2_buffer_pool_qbuf (pool, buffer)) { GST_WARNING ("could not requeue buffer %p %d", buffer, index); } else { resuscitated = TRUE; } } else { resuscitated = TRUE; /* XXX double check this... I think it is ok to not synchronize this * w.r.t. destruction of the pool, since the buffer is still live and * the buffer holds a ref to the pool.. */ g_async_queue_push (pool->avail_buffers, buffer); } } else { GST_LOG_OBJECT (pool->v4l2elem, "the pool is shutting down"); } if (resuscitated) { /* FIXME: check that the caps didn't change */ GST_LOG_OBJECT (pool->v4l2elem, "reviving buffer %p, %d", buffer, index); gst_buffer_ref (GST_BUFFER (buffer)); GST_BUFFER_SIZE (buffer) = 0; pool->buffers[index] = buffer; } GST_V4L2_BUFFER_POOL_UNLOCK (pool); if (!resuscitated) { GST_LOG_OBJECT (pool->v4l2elem, "buffer %p (data %p, len %u) not recovered, unmapping", buffer, GST_BUFFER_DATA (buffer), buffer->vbuffer.length); gst_mini_object_unref (GST_MINI_OBJECT (pool)); v4l2_munmap ((void *) GST_BUFFER_DATA (buffer), buffer->vbuffer.length); GST_MINI_OBJECT_CLASS (v4l2buffer_parent_class)->finalize (GST_MINI_OBJECT (buffer)); } } static void gst_v4l2_buffer_class_init (gpointer g_class, gpointer class_data) { GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); v4l2buffer_parent_class = g_type_class_peek_parent (g_class); mini_object_class->finalize = (GstMiniObjectFinalizeFunction) gst_v4l2_buffer_finalize; } GType gst_v4l2_buffer_get_type (void) { static GType _gst_v4l2_buffer_type; if (G_UNLIKELY (_gst_v4l2_buffer_type == 0)) { static const GTypeInfo v4l2_buffer_info = { sizeof (GstBufferClass), NULL, NULL, gst_v4l2_buffer_class_init, NULL, NULL, sizeof (GstV4l2Buffer), 0, NULL, NULL }; _gst_v4l2_buffer_type = g_type_register_static (GST_TYPE_BUFFER, "GstV4l2Buffer", &v4l2_buffer_info, 0); } return _gst_v4l2_buffer_type; } static GstV4l2Buffer * gst_v4l2_buffer_new (GstV4l2BufferPool * pool, guint index, GstCaps * caps) { GstV4l2Buffer *ret; guint8 *data; ret = (GstV4l2Buffer *) gst_mini_object_new (GST_TYPE_V4L2_BUFFER); GST_LOG_OBJECT (pool->v4l2elem, "creating buffer %u, %p in pool %p", index, ret, pool); ret->pool = (GstV4l2BufferPool *) gst_mini_object_ref (GST_MINI_OBJECT (pool)); ret->vbuffer.index = index; ret->vbuffer.type = pool->type; ret->vbuffer.memory = V4L2_MEMORY_MMAP; if (v4l2_ioctl (pool->video_fd, VIDIOC_QUERYBUF, &ret->vbuffer) < 0) goto querybuf_failed; GST_LOG_OBJECT (pool->v4l2elem, " index: %u", ret->vbuffer.index); GST_LOG_OBJECT (pool->v4l2elem, " type: %d", ret->vbuffer.type); GST_LOG_OBJECT (pool->v4l2elem, " bytesused: %u", ret->vbuffer.bytesused); GST_LOG_OBJECT (pool->v4l2elem, " flags: %08x", ret->vbuffer.flags); GST_LOG_OBJECT (pool->v4l2elem, " field: %d", ret->vbuffer.field); GST_LOG_OBJECT (pool->v4l2elem, " memory: %d", ret->vbuffer.memory); if (ret->vbuffer.memory == V4L2_MEMORY_MMAP) GST_LOG_OBJECT (pool->v4l2elem, " MMAP offset: %u", ret->vbuffer.m.offset); GST_LOG_OBJECT (pool->v4l2elem, " length: %u", ret->vbuffer.length); GST_LOG_OBJECT (pool->v4l2elem, " input: %u", ret->vbuffer.input); data = (guint8 *) v4l2_mmap (0, ret->vbuffer.length, PROT_READ | PROT_WRITE, MAP_SHARED, pool->video_fd, ret->vbuffer.m.offset); if (data == MAP_FAILED) goto mmap_failed; GST_BUFFER_DATA (ret) = data; GST_BUFFER_SIZE (ret) = ret->vbuffer.length; GST_BUFFER_FLAG_SET (ret, GST_BUFFER_FLAG_READONLY); gst_buffer_set_caps (GST_BUFFER (ret), caps); return ret; /* ERRORS */ querybuf_failed: { gint errnosave = errno; GST_WARNING ("Failed QUERYBUF: %s", g_strerror (errnosave)); gst_buffer_unref (GST_BUFFER (ret)); errno = errnosave; return NULL; } mmap_failed: { gint errnosave = errno; GST_WARNING ("Failed to mmap: %s", g_strerror (errnosave)); gst_buffer_unref (GST_BUFFER (ret)); errno = errnosave; return NULL; } } /* * GstV4l2BufferPool: */ static GstMiniObjectClass *buffer_pool_parent_class = NULL; static void gst_v4l2_buffer_pool_finalize (GstV4l2BufferPool * pool) { g_mutex_free (pool->lock); pool->lock = NULL; g_async_queue_unref (pool->avail_buffers); pool->avail_buffers = NULL; if (pool->video_fd >= 0) v4l2_close (pool->video_fd); if (pool->buffers) { g_free (pool->buffers); pool->buffers = NULL; } GST_MINI_OBJECT_CLASS (buffer_pool_parent_class)->finalize (GST_MINI_OBJECT (pool)); } static void gst_v4l2_buffer_pool_init (GstV4l2BufferPool * pool, gpointer g_class) { pool->lock = g_mutex_new (); pool->running = FALSE; pool->num_live_buffers = 0; } static void gst_v4l2_buffer_pool_class_init (gpointer g_class, gpointer class_data) { GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); buffer_pool_parent_class = g_type_class_peek_parent (g_class); mini_object_class->finalize = (GstMiniObjectFinalizeFunction) gst_v4l2_buffer_pool_finalize; } GType gst_v4l2_buffer_pool_get_type (void) { static GType _gst_v4l2_buffer_pool_type; if (G_UNLIKELY (_gst_v4l2_buffer_pool_type == 0)) { static const GTypeInfo v4l2_buffer_pool_info = { sizeof (GstMiniObjectClass), NULL, NULL, gst_v4l2_buffer_pool_class_init, NULL, NULL, sizeof (GstV4l2BufferPool), 0, (GInstanceInitFunc) gst_v4l2_buffer_pool_init, NULL }; _gst_v4l2_buffer_pool_type = g_type_register_static (GST_TYPE_MINI_OBJECT, "GstV4l2BufferPool", &v4l2_buffer_pool_info, 0); } return _gst_v4l2_buffer_pool_type; } /* this is somewhat of a hack.. but better to keep the hack in * one place than copy/pasting it around.. */ static GstV4l2Object * get_v4l2_object (GstElement * v4l2elem) { GstV4l2Object *v4l2object = NULL; if (GST_IS_V4L2SRC (v4l2elem)) { v4l2object = (GST_V4L2SRC (v4l2elem))->v4l2object; #ifdef HAVE_EXPERIMENTAL } else if (GST_IS_V4L2SINK (v4l2elem)) { v4l2object = (GST_V4L2SINK (v4l2elem))->v4l2object; #endif } else { GST_ERROR_OBJECT (v4l2elem, "unknown v4l2 element"); } return v4l2object; } /** * gst_v4l2_buffer_pool_new: * @v4l2elem: the v4l2 element (src or sink) that owns this pool * @fd: the video device file descriptor * @num_buffers: the requested number of buffers in the pool * @caps: the caps to set on the buffer * @requeuebuf: if %TRUE, and if the pool is still in the running state, a * buffer with no remaining references is immediately passed back to v4l2 * (VIDIOC_QBUF), otherwise it is returned to the pool of available buffers * (which can be accessed via gst_v4l2_buffer_pool_get(). * * Construct a new buffer pool. * * Returns: the new pool, use gst_v4l2_buffer_pool_destroy() to free resources */ GstV4l2BufferPool * gst_v4l2_buffer_pool_new (GstElement * v4l2elem, gint fd, gint num_buffers, GstCaps * caps, gboolean requeuebuf, enum v4l2_buf_type type) { GstV4l2BufferPool *pool; gint n; struct v4l2_requestbuffers breq; pool = (GstV4l2BufferPool *) gst_mini_object_new (GST_TYPE_V4L2_BUFFER_POOL); pool->video_fd = v4l2_dup (fd); if (pool->video_fd < 0) goto dup_failed; /* first, lets request buffers, and see how many we can get: */ GST_DEBUG_OBJECT (v4l2elem, "STREAMING, requesting %d MMAP buffers", num_buffers); memset (&breq, 0, sizeof (struct v4l2_requestbuffers)); breq.type = type; breq.count = num_buffers; breq.memory = V4L2_MEMORY_MMAP; if (v4l2_ioctl (fd, VIDIOC_REQBUFS, &breq) < 0) goto reqbufs_failed; GST_LOG_OBJECT (v4l2elem, " count: %u", breq.count); GST_LOG_OBJECT (v4l2elem, " type: %d", breq.type); GST_LOG_OBJECT (v4l2elem, " memory: %d", breq.memory); if (breq.count < GST_V4L2_MIN_BUFFERS) goto no_buffers; if (num_buffers != breq.count) { GST_WARNING_OBJECT (v4l2elem, "using %u buffers instead", breq.count); num_buffers = breq.count; } pool->v4l2elem = v4l2elem; pool->requeuebuf = requeuebuf; pool->type = type; pool->buffer_count = num_buffers; pool->buffers = g_new0 (GstV4l2Buffer *, num_buffers); pool->avail_buffers = g_async_queue_new (); /* now, map the buffers: */ for (n = 0; n < num_buffers; n++) { pool->buffers[n] = gst_v4l2_buffer_new (pool, n, caps); if (!pool->buffers[n]) goto buffer_new_failed; pool->num_live_buffers++; g_async_queue_push (pool->avail_buffers, pool->buffers[n]); } return pool; /* ERRORS */ dup_failed: { gint errnosave = errno; gst_mini_object_unref (GST_MINI_OBJECT (pool)); errno = errnosave; return NULL; } reqbufs_failed: { GstV4l2Object *v4l2object = get_v4l2_object (v4l2elem); GST_ELEMENT_ERROR (v4l2elem, RESOURCE, READ, (_("Could not get buffers from device '%s'."), v4l2object->videodev), ("error requesting %d buffers: %s", num_buffers, g_strerror (errno))); return NULL; } no_buffers: { GstV4l2Object *v4l2object = get_v4l2_object (v4l2elem); GST_ELEMENT_ERROR (v4l2elem, RESOURCE, READ, (_("Could not get enough buffers from device '%s'."), v4l2object->videodev), ("we received %d from device '%s', we want at least %d", breq.count, v4l2object->videodev, GST_V4L2_MIN_BUFFERS)); return NULL; } buffer_new_failed: { gint errnosave = errno; gst_v4l2_buffer_pool_destroy (pool); errno = errnosave; return NULL; } } /** * gst_v4l2_buffer_pool_destroy: * @pool: the pool * * Free all resources in the pool and the pool itself. */ void gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool) { gint n; GST_V4L2_BUFFER_POOL_LOCK (pool); pool->running = FALSE; GST_V4L2_BUFFER_POOL_UNLOCK (pool); GST_DEBUG_OBJECT (pool->v4l2elem, "destroy pool"); /* after this point, no more buffers will be queued or dequeued; no buffer * from pool->buffers that is NULL will be set to a buffer, and no buffer that * is not NULL will be pushed out. */ /* miniobjects have no dispose, so they can't break ref-cycles, as buffers ref * the pool, we need to unref the buffer to properly finalize te pool */ for (n = 0; n < pool->buffer_count; n++) { GstBuffer *buf; GST_V4L2_BUFFER_POOL_LOCK (pool); buf = GST_BUFFER (pool->buffers[n]); GST_V4L2_BUFFER_POOL_UNLOCK (pool); if (buf) /* we own the ref if the buffer is in pool->buffers; drop it. */ gst_buffer_unref (buf); } gst_mini_object_unref (GST_MINI_OBJECT (pool)); } /** * gst_v4l2_buffer_pool_get: * @pool: the "this" object * @blocking: should this call suspend until there is a buffer available * in the buffer pool? * * Get an available buffer in the pool */ GstV4l2Buffer * gst_v4l2_buffer_pool_get (GstV4l2BufferPool * pool, gboolean blocking) { GstV4l2Buffer *buf; if (blocking) { buf = g_async_queue_pop (pool->avail_buffers); } else { buf = g_async_queue_try_pop (pool->avail_buffers); } if (buf) { GST_V4L2_BUFFER_POOL_LOCK (pool); GST_BUFFER_SIZE (buf) = buf->vbuffer.length; GST_BUFFER_FLAG_UNSET (buf, 0xffffffff); GST_V4L2_BUFFER_POOL_UNLOCK (pool); } pool->running = TRUE; return buf; } /** * gst_v4l2_buffer_pool_qbuf: * @pool: the pool * @buf: the buffer to queue * * Queue a buffer to the driver * * Returns: %TRUE for success */ gboolean gst_v4l2_buffer_pool_qbuf (GstV4l2BufferPool * pool, GstV4l2Buffer * buf) { GST_LOG_OBJECT (pool->v4l2elem, "enqueue pool buffer %d", buf->vbuffer.index); if (v4l2_ioctl (pool->video_fd, VIDIOC_QBUF, &buf->vbuffer) < 0) return FALSE; pool->num_live_buffers--; GST_DEBUG_OBJECT (pool->v4l2elem, "num_live_buffers--: %d", pool->num_live_buffers); return TRUE; } /** * gst_v4l2_buffer_pool_dqbuf: * @pool: the pool * * Dequeue a buffer from the driver. Some generic error handling is done in * this function, but any error handling specific to v4l2src (capture) or * v4l2sink (output) can be done outside this function by checking 'errno' * * Returns: a buffer */ GstV4l2Buffer * gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool) { GstV4l2Object *v4l2object = get_v4l2_object (pool->v4l2elem); GstV4l2Buffer *pool_buffer; struct v4l2_buffer buffer; memset (&buffer, 0x00, sizeof (buffer)); buffer.type = pool->type; buffer.memory = V4L2_MEMORY_MMAP; if (v4l2_ioctl (pool->video_fd, VIDIOC_DQBUF, &buffer) >= 0) { GST_V4L2_BUFFER_POOL_LOCK (pool); /* get our GstBuffer with that index from the pool, if the buffer was * outstanding we have a serious problem. */ pool_buffer = pool->buffers[buffer.index]; if (pool_buffer == NULL) { GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, (_("Failed trying to get video frames from device '%s'."), v4l2object->videodev), (_("No free buffers found in the pool at index %d."), buffer.index)); GST_V4L2_BUFFER_POOL_UNLOCK (pool); return NULL; } GST_LOG_OBJECT (pool->v4l2elem, "grabbed frame %d (ix=%d), flags %08x, pool-ct=%d, buffer=%p", buffer.sequence, buffer.index, buffer.flags, pool->num_live_buffers, pool_buffer); pool->num_live_buffers++; GST_DEBUG_OBJECT (pool->v4l2elem, "num_live_buffers++: %d", pool->num_live_buffers); /* set top/bottom field first if v4l2_buffer has the information */ if (buffer.field == V4L2_FIELD_INTERLACED_TB) GST_BUFFER_FLAG_SET (pool_buffer, GST_VIDEO_BUFFER_TFF); if (buffer.field == V4L2_FIELD_INTERLACED_BT) GST_BUFFER_FLAG_UNSET (pool_buffer, GST_VIDEO_BUFFER_TFF); /* this can change at every frame, esp. with jpeg */ GST_BUFFER_SIZE (pool_buffer) = buffer.bytesused; GST_V4L2_BUFFER_POOL_UNLOCK (pool); return pool_buffer; } GST_WARNING_OBJECT (pool->v4l2elem, "problem grabbing frame %d (ix=%d), pool-ct=%d, buf.flags=%d", buffer.sequence, buffer.index, GST_MINI_OBJECT_REFCOUNT (pool), buffer.flags); switch (errno) { case EAGAIN: GST_WARNING_OBJECT (pool->v4l2elem, "Non-blocking I/O has been selected using O_NONBLOCK and" " no buffer was in the outgoing queue. device %s", v4l2object->videodev); break; case EINVAL: GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, (_("Failed trying to get video frames from device '%s'."), v4l2object->videodev), (_("The buffer type is not supported, or the index is out of bounds," " or no buffers have been allocated yet, or the userptr" " or length are invalid. device %s"), v4l2object->videodev)); break; case ENOMEM: GST_ELEMENT_ERROR (pool->v4l2elem, RESOURCE, FAILED, (_("Failed trying to get video frames from device '%s'. Not enough memory."), v4l2object->videodev), (_("insufficient memory to enqueue a user pointer buffer. device %s."), v4l2object->videodev)); break; case EIO: GST_INFO_OBJECT (pool->v4l2elem, "VIDIOC_DQBUF failed due to an internal error." " Can also indicate temporary problems like signal loss." " Note the driver might dequeue an (empty) buffer despite" " returning an error, or even stop capturing." " device %s", v4l2object->videodev); /* have we de-queued a buffer ? */ if (!(buffer.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))) { GST_DEBUG_OBJECT (pool->v4l2elem, "reenqueing buffer"); /* FIXME ... should we do something here? */ } break; case EINTR: GST_WARNING_OBJECT (pool->v4l2elem, "could not sync on a buffer on device %s", v4l2object->videodev); break; default: GST_WARNING_OBJECT (pool->v4l2elem, "Grabbing frame got interrupted on %s unexpectedly. %d: %s.", v4l2object->videodev, errno, g_strerror (errno)); break; } return NULL; } /** * gst_v4l2_buffer_pool_available_buffers: * @pool: the pool * * Check the number of buffers available to the driver, ie. buffers that * have been QBUF'd but not yet DQBUF'd. * * Returns: the number of buffers available. */ gint gst_v4l2_buffer_pool_available_buffers (GstV4l2BufferPool * pool) { return pool->buffer_count - pool->num_live_buffers; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2xoverlay.c0000644000175000017500000003323111677341661016665 00000000000000/* GStreamer * * Copyright (C) 2003 Ronald Bultje * 2006 Edgard Lima * * gstv4l2xoverlay.c: X-based overlay interface implementation for V4L2 * * 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 #include #include #include #include #include #include #include #include "gstv4l2xoverlay.h" #include "gstv4l2object.h" #include "v4l2_calls.h" #include "gst/gst-i18n-plugin.h" #include struct _GstV4l2Xv { Display *dpy; gint port, idle_id, event_id; GMutex *mutex; /* to serialize calls to X11 */ }; GST_DEBUG_CATEGORY_STATIC (v4l2xv_debug); #define GST_CAT_DEFAULT v4l2xv_debug void gst_v4l2_xoverlay_interface_init (GstXOverlayClass * klass) { GST_DEBUG_CATEGORY_INIT (v4l2xv_debug, "v4l2xv", 0, "V4L2 XOverlay interface debugging"); } static void gst_v4l2_xoverlay_open (GstV4l2Object * v4l2object) { struct stat s; GstV4l2Xv *v4l2xv; const gchar *name = g_getenv ("DISPLAY"); unsigned int ver, rel, req, ev, err, anum; int i, id = 0, first_id = 0, min; XvAdaptorInfo *ai; Display *dpy; /* we need a display, obviously */ if (!name || !(dpy = XOpenDisplay (name))) { GST_WARNING_OBJECT (v4l2object->element, "No $DISPLAY set or failed to open - no overlay"); return; } /* First let's check that XVideo extension is available */ if (!XQueryExtension (dpy, "XVideo", &i, &i, &i)) { GST_WARNING_OBJECT (v4l2object->element, "Xv extension not available - no overlay"); XCloseDisplay (dpy); return; } /* find port that belongs to this device */ if (XvQueryExtension (dpy, &ver, &rel, &req, &ev, &err) != Success) { GST_WARNING_OBJECT (v4l2object->element, "Xv extension not supported - no overlay"); XCloseDisplay (dpy); return; } if (XvQueryAdaptors (dpy, DefaultRootWindow (dpy), &anum, &ai) != Success) { GST_WARNING_OBJECT (v4l2object->element, "Failed to query Xv adaptors"); XCloseDisplay (dpy); return; } if (fstat (v4l2object->video_fd, &s) < 0) { GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, NOT_FOUND, (_("Cannot identify device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); XCloseDisplay (dpy); return; } min = s.st_rdev & 0xff; for (i = 0; i < anum; i++) { GST_DEBUG_OBJECT (v4l2object->element, "found adapter: %s", ai[i].name); if (!strcmp (ai[i].name, "video4linux2") || !strcmp (ai[i].name, "video4linux")) { if (first_id == 0) first_id = ai[i].base_id; GST_DEBUG_OBJECT (v4l2object->element, "first_id=%d, base_id=%lu, min=%d", first_id, ai[i].base_id, min); /* hmm... */ if (first_id != 0 && ai[i].base_id == first_id + min) id = ai[i].base_id; } } XvFreeAdaptorInfo (ai); if (id == 0) { GST_WARNING_OBJECT (v4l2object->element, "Did not find XvPortID for device - no overlay"); XCloseDisplay (dpy); return; } v4l2xv = g_new0 (GstV4l2Xv, 1); v4l2xv->dpy = dpy; v4l2xv->port = id; v4l2xv->mutex = g_mutex_new (); v4l2xv->idle_id = 0; v4l2xv->event_id = 0; v4l2object->xv = v4l2xv; if (v4l2object->xwindow_id) { gst_v4l2_xoverlay_set_window_handle (v4l2object, v4l2object->xwindow_id); } } static void gst_v4l2_xoverlay_close (GstV4l2Object * v4l2object) { GstV4l2Xv *v4l2xv = v4l2object->xv; if (!v4l2object->xv) return; if (v4l2object->xwindow_id) { gst_v4l2_xoverlay_set_window_handle (v4l2object, 0); } XCloseDisplay (v4l2xv->dpy); g_mutex_free (v4l2xv->mutex); if (v4l2xv->idle_id) g_source_remove (v4l2xv->idle_id); if (v4l2xv->event_id) g_source_remove (v4l2xv->event_id); g_free (v4l2xv); v4l2object->xv = NULL; } void gst_v4l2_xoverlay_start (GstV4l2Object * v4l2object) { if (v4l2object->xwindow_id) { gst_v4l2_xoverlay_open (v4l2object); } } void gst_v4l2_xoverlay_stop (GstV4l2Object * v4l2object) { gst_v4l2_xoverlay_close (v4l2object); } /* should be called with mutex held */ static gboolean get_render_rect (GstV4l2Object * v4l2object, GstVideoRectangle * rect) { GstV4l2Xv *v4l2xv = v4l2object->xv; if (v4l2xv && v4l2xv->dpy && v4l2object->xwindow_id) { XWindowAttributes attr; XGetWindowAttributes (v4l2xv->dpy, v4l2object->xwindow_id, &attr); /* this is where we'd add support to maintain aspect ratio */ rect->x = 0; rect->y = 0; rect->w = attr.width; rect->h = attr.height; return TRUE; } else { return FALSE; } } gboolean gst_v4l2_xoverlay_get_render_rect (GstV4l2Object * v4l2object, GstVideoRectangle * rect) { GstV4l2Xv *v4l2xv = v4l2object->xv; gboolean ret = FALSE; if (v4l2xv) { g_mutex_lock (v4l2xv->mutex); ret = get_render_rect (v4l2object, rect); g_mutex_unlock (v4l2xv->mutex); } return ret; } static void update_geometry (GstV4l2Object * v4l2object) { GstV4l2Xv *v4l2xv = v4l2object->xv; GstVideoRectangle rect; if (!get_render_rect (v4l2object, &rect)) return; /* note: we don't pass in valid video x/y/w/h.. currently the xserver * doesn't need to know these, as they come from v4l2 by setting the * crop.. */ XvPutVideo (v4l2xv->dpy, v4l2xv->port, v4l2object->xwindow_id, DefaultGC (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy)), 0, 0, rect.w, rect.h, rect.x, rect.y, rect.w, rect.h); } static gboolean idle_refresh (gpointer data) { GstV4l2Object *v4l2object = GST_V4L2_OBJECT (data); GstV4l2Xv *v4l2xv = v4l2object->xv; GST_LOG_OBJECT (v4l2object->element, "idle refresh"); if (v4l2xv) { g_mutex_lock (v4l2xv->mutex); update_geometry (v4l2object); v4l2xv->idle_id = 0; g_mutex_unlock (v4l2xv->mutex); } /* once */ return FALSE; } static gboolean event_refresh (gpointer data) { GstV4l2Object *v4l2object = GST_V4L2_OBJECT (data); GstV4l2Xv *v4l2xv = v4l2object->xv; GST_LOG_OBJECT (v4l2object->element, "event refresh"); if (v4l2xv) { XEvent e; g_mutex_lock (v4l2xv->mutex); /* If the element supports navigation, collect the relavent input * events and push them upstream as navigation events */ if (GST_IS_NAVIGATION (v4l2object->element)) { guint pointer_x = 0, pointer_y = 0; gboolean pointer_moved = FALSE; /* We get all pointer motion events, only the last position is * interesting. */ while (XCheckWindowEvent (v4l2xv->dpy, v4l2object->xwindow_id, PointerMotionMask, &e)) { switch (e.type) { case MotionNotify: pointer_x = e.xmotion.x; pointer_y = e.xmotion.y; pointer_moved = TRUE; break; default: break; } } if (pointer_moved) { GST_DEBUG_OBJECT (v4l2object->element, "pointer moved over window at %d,%d", pointer_x, pointer_y); g_mutex_unlock (v4l2xv->mutex); gst_navigation_send_mouse_event (GST_NAVIGATION (v4l2object->element), "mouse-move", 0, e.xbutton.x, e.xbutton.y); g_mutex_lock (v4l2xv->mutex); } /* We get all events on our window to throw them upstream */ while (XCheckWindowEvent (v4l2xv->dpy, v4l2object->xwindow_id, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask, &e)) { KeySym keysym; const char *key_str = NULL; g_mutex_unlock (v4l2xv->mutex); switch (e.type) { case ButtonPress: GST_DEBUG_OBJECT (v4l2object->element, "button %d pressed over window at %d,%d", e.xbutton.button, e.xbutton.x, e.xbutton.y); gst_navigation_send_mouse_event (GST_NAVIGATION (v4l2object->element), "mouse-button-press", e.xbutton.button, e.xbutton.x, e.xbutton.y); break; case ButtonRelease: GST_DEBUG_OBJECT (v4l2object->element, "button %d released over window at %d,%d", e.xbutton.button, e.xbutton.x, e.xbutton.y); gst_navigation_send_mouse_event (GST_NAVIGATION (v4l2object->element), "mouse-button-release", e.xbutton.button, e.xbutton.x, e.xbutton.y); break; case KeyPress: case KeyRelease: g_mutex_lock (v4l2xv->mutex); keysym = XKeycodeToKeysym (v4l2xv->dpy, e.xkey.keycode, 0); if (keysym != NoSymbol) { key_str = XKeysymToString (keysym); } else { key_str = "unknown"; } g_mutex_unlock (v4l2xv->mutex); GST_DEBUG_OBJECT (v4l2object->element, "key %d pressed over window at %d,%d (%s)", e.xkey.keycode, e.xkey.x, e.xkey.y, key_str); gst_navigation_send_key_event (GST_NAVIGATION (v4l2object->element), e.type == KeyPress ? "key-press" : "key-release", key_str); break; default: GST_DEBUG_OBJECT (v4l2object->element, "unhandled X event (%d)", e.type); } g_mutex_lock (v4l2xv->mutex); } } /* Handle ConfigureNotify */ while (XCheckWindowEvent (v4l2xv->dpy, v4l2object->xwindow_id, StructureNotifyMask, &e)) { switch (e.type) { case ConfigureNotify: update_geometry (v4l2object); break; default: break; } } g_mutex_unlock (v4l2xv->mutex); } /* repeat */ return TRUE; } void gst_v4l2_xoverlay_set_window_handle (GstV4l2Object * v4l2object, guintptr id) { GstV4l2Xv *v4l2xv; XID xwindow_id = id; gboolean change = (v4l2object->xwindow_id != xwindow_id); GST_LOG_OBJECT (v4l2object->element, "Setting XID to %lx", (gulong) xwindow_id); if (!v4l2object->xv && GST_V4L2_IS_OPEN (v4l2object)) gst_v4l2_xoverlay_open (v4l2object); v4l2xv = v4l2object->xv; if (v4l2xv) g_mutex_lock (v4l2xv->mutex); if (change) { if (v4l2object->xwindow_id && v4l2xv) { GST_DEBUG_OBJECT (v4l2object->element, "Deactivating old port %lx", v4l2object->xwindow_id); XvSelectPortNotify (v4l2xv->dpy, v4l2xv->port, 0); XvSelectVideoNotify (v4l2xv->dpy, v4l2object->xwindow_id, 0); XvStopVideo (v4l2xv->dpy, v4l2xv->port, v4l2object->xwindow_id); } v4l2object->xwindow_id = xwindow_id; } if (!v4l2xv || xwindow_id == 0) { if (v4l2xv) g_mutex_unlock (v4l2xv->mutex); return; } if (change) { GST_DEBUG_OBJECT (v4l2object->element, "Activating new port %lx", xwindow_id); /* draw */ XvSelectPortNotify (v4l2xv->dpy, v4l2xv->port, 1); XvSelectVideoNotify (v4l2xv->dpy, v4l2object->xwindow_id, 1); } update_geometry (v4l2object); if (v4l2xv->idle_id) g_source_remove (v4l2xv->idle_id); v4l2xv->idle_id = g_idle_add (idle_refresh, v4l2object); g_mutex_unlock (v4l2xv->mutex); } /** * gst_v4l2_xoverlay_prepare_xwindow_id: * @v4l2object: the v4l2object * @required: %TRUE if display is required (ie. TRUE for v4l2sink, but * FALSE for any other element with optional overlay capabilities) * * Helper function to create a windo if none is set from the application. */ void gst_v4l2_xoverlay_prepare_xwindow_id (GstV4l2Object * v4l2object, gboolean required) { if (!GST_V4L2_IS_OVERLAY (v4l2object)) return; gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (v4l2object->element)); if (required && !v4l2object->xwindow_id) { GstV4l2Xv *v4l2xv; Window win; int width, height; long event_mask; if (!v4l2object->xv && GST_V4L2_IS_OPEN (v4l2object)) gst_v4l2_xoverlay_open (v4l2object); v4l2xv = v4l2object->xv; /* if xoverlay is not supported, just bail */ if (!v4l2xv) return; /* xoverlay is supported, but we don't have a window.. so create one */ GST_DEBUG_OBJECT (v4l2object->element, "creating window"); g_mutex_lock (v4l2xv->mutex); width = XDisplayWidth (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy)); height = XDisplayHeight (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy)); GST_DEBUG_OBJECT (v4l2object->element, "dpy=%p", v4l2xv->dpy); win = XCreateSimpleWindow (v4l2xv->dpy, DefaultRootWindow (v4l2xv->dpy), 0, 0, width, height, 0, 0, XBlackPixel (v4l2xv->dpy, DefaultScreen (v4l2xv->dpy))); GST_DEBUG_OBJECT (v4l2object->element, "win=%lu", win); event_mask = ExposureMask | StructureNotifyMask; if (GST_IS_NAVIGATION (v4l2object->element)) { event_mask |= PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask; } XSelectInput (v4l2xv->dpy, win, event_mask); v4l2xv->event_id = g_timeout_add (45, event_refresh, v4l2object); XMapRaised (v4l2xv->dpy, win); XSync (v4l2xv->dpy, FALSE); g_mutex_unlock (v4l2xv->mutex); GST_DEBUG_OBJECT (v4l2object->element, "got window"); gst_v4l2_xoverlay_set_window_handle (v4l2object, win); } } gst-plugins-good-0.10.31/sys/v4l2/v4l2_calls.h0000644000175000017500000001164611671175354015544 00000000000000/* GStreamer * * Copyright (C) 2002 Ronald Bultje * 2006 Edgard Lima * * v4l2_calls.h - generic V4L2 calls handling * * 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 __V4L2_CALLS_H__ #define __V4L2_CALLS_H__ #include "gstv4l2object.h" #ifdef HAVE_LIBV4L2 # include #else # include # include # define v4l2_fd_open(fd, flags) (fd) # define v4l2_close close # define v4l2_dup dup # define v4l2_ioctl ioctl # define v4l2_read read # define v4l2_mmap mmap # define v4l2_munmap munmap #endif /* simple check whether the device is open */ #define GST_V4L2_IS_OPEN(v4l2object) \ (v4l2object->video_fd > 0) /* check whether the device is 'active' */ #define GST_V4L2_IS_ACTIVE(v4l2object) \ (v4l2object->buffer != NULL) #define GST_V4L2_IS_OVERLAY(v4l2object) \ (v4l2object->vcap.capabilities & V4L2_CAP_VIDEO_OVERLAY) /* checks whether the current v4lv4l2object has already been open()'ed or not */ #define GST_V4L2_CHECK_OPEN(v4l2object) \ if (!GST_V4L2_IS_OPEN(v4l2object)) \ { \ GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ (_("Device is not open.")), (NULL)); \ return FALSE; \ } /* checks whether the current v4lv4l2object is close()'ed or whether it is still open */ #define GST_V4L2_CHECK_NOT_OPEN(v4l2object) \ if (GST_V4L2_IS_OPEN(v4l2object)) \ { \ GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ (_("Device is open.")), (NULL)); \ return FALSE; \ } /* checks whether the current v4lv4l2object does video overlay */ #define GST_V4L2_CHECK_OVERLAY(v4l2object) \ if (!GST_V4L2_IS_OVERLAY(v4l2object)) \ { \ GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ (NULL), ("Device cannot handle overlay")); \ return FALSE; \ } /* checks whether we're in capture mode or not */ #define GST_V4L2_CHECK_ACTIVE(v4l2object) \ if (!GST_V4L2_IS_ACTIVE(v4l2object)) \ { \ GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ (NULL), ("Device is not in streaming mode")); \ return FALSE; \ } /* checks whether we're out of capture mode or not */ #define GST_V4L2_CHECK_NOT_ACTIVE(v4l2object) \ if (GST_V4L2_IS_ACTIVE(v4l2object)) \ { \ GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS, \ (NULL), ("Device is in streaming mode")); \ return FALSE; \ } /* open/close the device */ gboolean gst_v4l2_open (GstV4l2Object *v4l2object); gboolean gst_v4l2_close (GstV4l2Object *v4l2object); /* norm/input/output */ gboolean gst_v4l2_get_norm (GstV4l2Object *v4l2object, v4l2_std_id *norm); gboolean gst_v4l2_set_norm (GstV4l2Object *v4l2object, v4l2_std_id norm); gboolean gst_v4l2_get_input (GstV4l2Object * v4l2object, gint * input); gboolean gst_v4l2_set_input (GstV4l2Object * v4l2object, gint input); gboolean gst_v4l2_get_output (GstV4l2Object *v4l2object, gint *output); gboolean gst_v4l2_set_output (GstV4l2Object *v4l2object, gint output); /* frequency control */ gboolean gst_v4l2_get_frequency (GstV4l2Object *v4l2object, gint tunernum, gulong *frequency); gboolean gst_v4l2_set_frequency (GstV4l2Object *v4l2object, gint tunernum, gulong frequency); gboolean gst_v4l2_signal_strength (GstV4l2Object *v4l2object, gint tunernum, gulong *signal); /* attribute control */ gboolean gst_v4l2_get_attribute (GstV4l2Object *v4l2object, int attribute, int *value); gboolean gst_v4l2_set_attribute (GstV4l2Object *v4l2object, int attribute, const int value); gboolean gst_v4l2_get_capabilities (GstV4l2Object * v4l2object); #define LOG_CAPS(obj, caps) GST_DEBUG_OBJECT (obj, "%s: %" GST_PTR_FORMAT, #caps, caps) #endif /* __V4L2_CALLS_H__ */ gst-plugins-good-0.10.31/sys/v4l2/Makefile.in0000644000175000017500000012713211720560241015455 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_EXPERIMENTAL_TRUE@am__append_1 = gstv4l2sink.c subdir = sys/v4l2 DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = @USE_XVIDEO_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ @USE_XVIDEO_TRUE@ $(am__DEPENDENCIES_1) libgstvideo4linux2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libgstvideo4linux2_la_SOURCES_DIST = gstv4l2.c \ gstv4l2colorbalance.c gstv4l2object.c gstv4l2bufferpool.c \ gstv4l2src.c gstv4l2radio.c gstv4l2tuner.c gstv4l2vidorient.c \ v4l2_calls.c v4l2src_calls.c gstv4l2xoverlay.c gstv4l2sink.c @USE_XVIDEO_TRUE@am__objects_1 = \ @USE_XVIDEO_TRUE@ libgstvideo4linux2_la-gstv4l2xoverlay.lo @BUILD_EXPERIMENTAL_TRUE@am__objects_2 = \ @BUILD_EXPERIMENTAL_TRUE@ libgstvideo4linux2_la-gstv4l2sink.lo am_libgstvideo4linux2_la_OBJECTS = libgstvideo4linux2_la-gstv4l2.lo \ libgstvideo4linux2_la-gstv4l2colorbalance.lo \ libgstvideo4linux2_la-gstv4l2object.lo \ libgstvideo4linux2_la-gstv4l2bufferpool.lo \ libgstvideo4linux2_la-gstv4l2src.lo \ libgstvideo4linux2_la-gstv4l2radio.lo \ libgstvideo4linux2_la-gstv4l2tuner.lo \ libgstvideo4linux2_la-gstv4l2vidorient.lo \ libgstvideo4linux2_la-v4l2_calls.lo \ libgstvideo4linux2_la-v4l2src_calls.lo $(am__objects_1) \ $(am__objects_2) libgstvideo4linux2_la_OBJECTS = $(am_libgstvideo4linux2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstvideo4linux2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) \ $(libgstvideo4linux2_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstvideo4linux2_la_SOURCES) DIST_SOURCES = $(am__libgstvideo4linux2_la_SOURCES_DIST) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstvideo4linux2.la @USE_XVIDEO_FALSE@xv_source = @USE_XVIDEO_TRUE@xv_source = gstv4l2xoverlay.c @USE_XVIDEO_FALSE@xv_libs = @USE_XVIDEO_TRUE@xv_libs = $(X_LIBS) $(XVIDEO_LIBS) libgstvideo4linux2_la_SOURCES = gstv4l2.c gstv4l2colorbalance.c \ gstv4l2object.c gstv4l2bufferpool.c gstv4l2src.c \ gstv4l2radio.c gstv4l2tuner.c gstv4l2vidorient.c v4l2_calls.c \ v4l2src_calls.c $(xv_source) $(am__append_1) libgstvideo4linux2_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_CFLAGS) \ $(X_CFLAGS) \ $(LIBV4L2_CFLAGS) \ $(GUDEV_CFLAGS) libgstvideo4linux2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideo4linux2_la_LIBTOOLFLAGS = --tag=disable-static libgstvideo4linux2_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-$(GST_MAJORMINOR) \ -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_LIBS) \ $(xv_libs) \ $(LIBV4L2_LIBS) \ $(GUDEV_LIBS) noinst_HEADERS = \ gstv4l2bufferpool.h \ gstv4l2colorbalance.h \ gstv4l2object.h \ gstv4l2sink.h \ gstv4l2src.h \ gstv4l2radio.h \ gstv4l2tuner.h \ gstv4l2vidorient.h \ gstv4l2xoverlay.h \ v4l2_calls.h \ v4l2src_calls.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/v4l2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/v4l2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstvideo4linux2.la: $(libgstvideo4linux2_la_OBJECTS) $(libgstvideo4linux2_la_DEPENDENCIES) $(EXTRA_libgstvideo4linux2_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstvideo4linux2_la_LINK) -rpath $(plugindir) $(libgstvideo4linux2_la_OBJECTS) $(libgstvideo4linux2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstvideo4linux2_la-gstv4l2.lo: gstv4l2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Tpo -c -o libgstvideo4linux2_la-gstv4l2.lo `test -f 'gstv4l2.c' || echo '$(srcdir)/'`gstv4l2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2.c' object='libgstvideo4linux2_la-gstv4l2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2.lo `test -f 'gstv4l2.c' || echo '$(srcdir)/'`gstv4l2.c libgstvideo4linux2_la-gstv4l2colorbalance.lo: gstv4l2colorbalance.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2colorbalance.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Tpo -c -o libgstvideo4linux2_la-gstv4l2colorbalance.lo `test -f 'gstv4l2colorbalance.c' || echo '$(srcdir)/'`gstv4l2colorbalance.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2colorbalance.c' object='libgstvideo4linux2_la-gstv4l2colorbalance.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2colorbalance.lo `test -f 'gstv4l2colorbalance.c' || echo '$(srcdir)/'`gstv4l2colorbalance.c libgstvideo4linux2_la-gstv4l2object.lo: gstv4l2object.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2object.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Tpo -c -o libgstvideo4linux2_la-gstv4l2object.lo `test -f 'gstv4l2object.c' || echo '$(srcdir)/'`gstv4l2object.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2object.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2object.c' object='libgstvideo4linux2_la-gstv4l2object.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2object.lo `test -f 'gstv4l2object.c' || echo '$(srcdir)/'`gstv4l2object.c libgstvideo4linux2_la-gstv4l2bufferpool.lo: gstv4l2bufferpool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2bufferpool.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Tpo -c -o libgstvideo4linux2_la-gstv4l2bufferpool.lo `test -f 'gstv4l2bufferpool.c' || echo '$(srcdir)/'`gstv4l2bufferpool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2bufferpool.c' object='libgstvideo4linux2_la-gstv4l2bufferpool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2bufferpool.lo `test -f 'gstv4l2bufferpool.c' || echo '$(srcdir)/'`gstv4l2bufferpool.c libgstvideo4linux2_la-gstv4l2src.lo: gstv4l2src.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2src.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Tpo -c -o libgstvideo4linux2_la-gstv4l2src.lo `test -f 'gstv4l2src.c' || echo '$(srcdir)/'`gstv4l2src.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2src.c' object='libgstvideo4linux2_la-gstv4l2src.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2src.lo `test -f 'gstv4l2src.c' || echo '$(srcdir)/'`gstv4l2src.c libgstvideo4linux2_la-gstv4l2radio.lo: gstv4l2radio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2radio.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Tpo -c -o libgstvideo4linux2_la-gstv4l2radio.lo `test -f 'gstv4l2radio.c' || echo '$(srcdir)/'`gstv4l2radio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2radio.c' object='libgstvideo4linux2_la-gstv4l2radio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2radio.lo `test -f 'gstv4l2radio.c' || echo '$(srcdir)/'`gstv4l2radio.c libgstvideo4linux2_la-gstv4l2tuner.lo: gstv4l2tuner.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2tuner.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Tpo -c -o libgstvideo4linux2_la-gstv4l2tuner.lo `test -f 'gstv4l2tuner.c' || echo '$(srcdir)/'`gstv4l2tuner.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2tuner.c' object='libgstvideo4linux2_la-gstv4l2tuner.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2tuner.lo `test -f 'gstv4l2tuner.c' || echo '$(srcdir)/'`gstv4l2tuner.c libgstvideo4linux2_la-gstv4l2vidorient.lo: gstv4l2vidorient.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2vidorient.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Tpo -c -o libgstvideo4linux2_la-gstv4l2vidorient.lo `test -f 'gstv4l2vidorient.c' || echo '$(srcdir)/'`gstv4l2vidorient.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2vidorient.c' object='libgstvideo4linux2_la-gstv4l2vidorient.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2vidorient.lo `test -f 'gstv4l2vidorient.c' || echo '$(srcdir)/'`gstv4l2vidorient.c libgstvideo4linux2_la-v4l2_calls.lo: v4l2_calls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-v4l2_calls.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Tpo -c -o libgstvideo4linux2_la-v4l2_calls.lo `test -f 'v4l2_calls.c' || echo '$(srcdir)/'`v4l2_calls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Tpo $(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2_calls.c' object='libgstvideo4linux2_la-v4l2_calls.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-v4l2_calls.lo `test -f 'v4l2_calls.c' || echo '$(srcdir)/'`v4l2_calls.c libgstvideo4linux2_la-v4l2src_calls.lo: v4l2src_calls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-v4l2src_calls.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Tpo -c -o libgstvideo4linux2_la-v4l2src_calls.lo `test -f 'v4l2src_calls.c' || echo '$(srcdir)/'`v4l2src_calls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Tpo $(DEPDIR)/libgstvideo4linux2_la-v4l2src_calls.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2src_calls.c' object='libgstvideo4linux2_la-v4l2src_calls.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-v4l2src_calls.lo `test -f 'v4l2src_calls.c' || echo '$(srcdir)/'`v4l2src_calls.c libgstvideo4linux2_la-gstv4l2xoverlay.lo: gstv4l2xoverlay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2xoverlay.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Tpo -c -o libgstvideo4linux2_la-gstv4l2xoverlay.lo `test -f 'gstv4l2xoverlay.c' || echo '$(srcdir)/'`gstv4l2xoverlay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2xoverlay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2xoverlay.c' object='libgstvideo4linux2_la-gstv4l2xoverlay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2xoverlay.lo `test -f 'gstv4l2xoverlay.c' || echo '$(srcdir)/'`gstv4l2xoverlay.c libgstvideo4linux2_la-gstv4l2sink.lo: gstv4l2sink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2sink.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Tpo -c -o libgstvideo4linux2_la-gstv4l2sink.lo `test -f 'gstv4l2sink.c' || echo '$(srcdir)/'`gstv4l2sink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2sink.c' object='libgstvideo4linux2_la-gstv4l2sink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2sink.lo `test -f 'gstv4l2sink.c' || echo '$(srcdir)/'`gstv4l2sink.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/v4l2/gstv4l2radio.c0000644000175000017500000004125411671175354016114 00000000000000/* GStreamer v4l2 radio tuner element * Copyright (C) 2010, 2011 Alexey Chernov <4ernov@gmail.com> * * gstv4l2radio.c - V4L2 radio tuner element * * 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-v4l2radio * * v4l2radio can be used to control radio device * and to tune it to different radiostations. * * * Example launch lines * |[ * gst-launch v4l2radio device=/dev/radio0 frequency=101200000 * gst-launch alsasrc device=hw:1 ! audioconvert ! audioresample ! alsasink * ]| * First pipeline tunes the radio device /dev/radio0 to station 101.2 MHz, * second pipeline connects digital audio out (hw:1) to default sound card. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include "gst/gst-i18n-plugin.h" #include "gstv4l2tuner.h" #include "gstv4l2radio.h" #include "v4l2_calls.h" GST_DEBUG_CATEGORY_STATIC (v4l2radio_debug); #define GST_CAT_DEFAULT v4l2radio_debug #define DEFAULT_PROP_DEVICE "/dev/radio0" #define MIN_FREQUENCY 87500000 #define DEFAULT_FREQUENCY 100000000 #define MAX_FREQUENCY 108000000 enum { ARG_0, ARG_DEVICE, ARG_FREQUENCY }; static gboolean gst_v4l2radio_fill_channel_list (GstV4l2Radio * radio) { int res; struct v4l2_tuner vtun; struct v4l2_capability vc; GstV4l2TunerChannel *v4l2channel; GstTunerChannel *channel; GstElement *e; GstV4l2Object *v4l2object; e = GST_ELEMENT (radio); v4l2object = radio->v4l2object; GST_DEBUG_OBJECT (e, "getting audio enumeration"); GST_V4L2_CHECK_OPEN (v4l2object); GST_DEBUG_OBJECT (e, " audio input"); memset (&vc, 0, sizeof (vc)); res = v4l2_ioctl (v4l2object->video_fd, VIDIOC_QUERYCAP, &vc); if (res < 0) goto caps_failed; if (!(vc.capabilities & V4L2_CAP_TUNER)) goto not_a_tuner; /* getting audio input */ memset (&vtun, 0, sizeof (vtun)); vtun.index = 0; res = v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_TUNER, &vtun); if (res < 0) goto tuner_failed; GST_LOG_OBJECT (e, " index: %d", vtun.index); GST_LOG_OBJECT (e, " name: '%s'", vtun.name); GST_LOG_OBJECT (e, " type: %016x", (guint) vtun.type); GST_LOG_OBJECT (e, " caps: %016x", (guint) vtun.capability); GST_LOG_OBJECT (e, " rlow: %016x", (guint) vtun.rangelow); GST_LOG_OBJECT (e, " rhigh: %016x", (guint) vtun.rangehigh); GST_LOG_OBJECT (e, " audmode: %016x", (guint) vtun.audmode); v4l2channel = g_object_new (GST_TYPE_V4L2_TUNER_CHANNEL, NULL); channel = GST_TUNER_CHANNEL (v4l2channel); channel->label = g_strdup ((const gchar *) vtun.name); channel->flags = GST_TUNER_CHANNEL_FREQUENCY | GST_TUNER_CHANNEL_AUDIO; v4l2channel->index = 0; v4l2channel->tuner = 0; channel->freq_multiplicator = 62.5 * ((vtun.capability & V4L2_TUNER_CAP_LOW) ? 1 : 1000); channel->min_frequency = vtun.rangelow * channel->freq_multiplicator; channel->max_frequency = vtun.rangehigh * channel->freq_multiplicator; channel->min_signal = 0; channel->max_signal = 0xffff; v4l2object->channels = g_list_prepend (v4l2object->channels, (gpointer) channel); v4l2object->channels = g_list_reverse (v4l2object->channels); GST_DEBUG_OBJECT (e, "done"); return TRUE; /* ERRORS */ tuner_failed: { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Failed to get settings of tuner %d on device '%s'."), vtun.index, v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } caps_failed: { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Error getting capabilities for device '%s'."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } not_a_tuner: { GST_ELEMENT_ERROR (e, RESOURCE, SETTINGS, (_("Device '%s' is not a tuner."), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } static gboolean gst_v4l2radio_get_input (GstV4l2Object * v4l2object, gint * input) { GST_DEBUG_OBJECT (v4l2object->element, "trying to get radio input"); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (!v4l2object->channels) goto input_failed; *input = 0; GST_DEBUG_OBJECT (v4l2object->element, "input: %d", 0); return TRUE; /* ERRORS */ input_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to get radio input on device '%s'. "), v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } static gboolean gst_v4l2radio_set_input (GstV4l2Object * v4l2object, gint input) { GST_DEBUG_OBJECT (v4l2object->element, "trying to set input to %d", input); if (!GST_V4L2_IS_OPEN (v4l2object)) return FALSE; if (!v4l2object->channels) goto input_failed; return TRUE; /* ERRORS */ input_failed: { GST_ELEMENT_WARNING (v4l2object->element, RESOURCE, SETTINGS, (_("Failed to set input %d on device %s."), input, v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } static gboolean gst_v4l2radio_set_mute_on (GstV4l2Radio * radio, gboolean on) { gint res; struct v4l2_control vctrl; GST_DEBUG_OBJECT (radio, "setting current tuner mute state: %d", on); if (!GST_V4L2_IS_OPEN (radio->v4l2object)) return FALSE; memset (&vctrl, 0, sizeof (vctrl)); vctrl.id = V4L2_CID_AUDIO_MUTE; vctrl.value = on; GST_DEBUG_OBJECT (radio, "radio fd: %d", radio->v4l2object->video_fd); res = ioctl (radio->v4l2object->video_fd, VIDIOC_S_CTRL, &vctrl); GST_DEBUG_OBJECT (radio, "mute state change result: %d", res); if (res < 0) goto freq_failed; return TRUE; /* ERRORS */ freq_failed: { GST_ELEMENT_WARNING (radio, RESOURCE, SETTINGS, (_("Failed to change mute state for device '%s'."), radio->v4l2object->videodev), GST_ERROR_SYSTEM); return FALSE; } } static gboolean gst_v4l2radio_set_mute (GstV4l2Radio * radio) { return gst_v4l2radio_set_mute_on (radio, TRUE); } static gboolean gst_v4l2radio_set_unmute (GstV4l2Radio * radio) { return gst_v4l2radio_set_mute_on (radio, FALSE); } GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2RadioClass, gst_v4l2radio); GST_IMPLEMENT_V4L2_TUNER_METHODS (GstV4l2Radio, gst_v4l2radio); static void gst_v4l2radio_uri_handler_init (gpointer g_iface, gpointer iface_data); static gboolean gst_v4l2radio_interface_supported (GstImplementsInterface * iface, GType iface_type) { if (iface_type == GST_TYPE_TUNER) return TRUE; else return FALSE; } static void gst_v4l2radio_implements_interface_init (GstImplementsInterfaceClass * iface) { iface->supported = gst_v4l2radio_interface_supported; } static void gst_v4l2radio_tuner_interface_reinit (GstTunerClass * iface) { gst_v4l2radio_tuner_interface_init (iface); } static void gst_v4l2radio_interfaces (GType type) { static const GInterfaceInfo urihandler_info = { (GInterfaceInitFunc) gst_v4l2radio_uri_handler_init, NULL, NULL }; static const GInterfaceInfo implements_interface_info = { (GInterfaceInitFunc) gst_v4l2radio_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo propertyprobe_info = { (GInterfaceInitFunc) gst_v4l2radio_property_probe_interface_init, NULL, NULL, }; static const GInterfaceInfo tuner_interface_info = { (GInterfaceInitFunc) gst_v4l2radio_tuner_interface_reinit, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_interface_info); g_type_add_interface_static (type, GST_TYPE_TUNER, &tuner_interface_info); g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &propertyprobe_info); } GST_BOILERPLATE_FULL (GstV4l2Radio, gst_v4l2radio, GstElement, GST_TYPE_ELEMENT, gst_v4l2radio_interfaces); static void gst_v4l2radio_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_v4l2radio_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_v4l2radio_finalize (GstV4l2Radio * radio); static void gst_v4l2radio_dispose (GObject * object); static GstStateChangeReturn gst_v4l2radio_change_state (GstElement * element, GstStateChange transition); static void gst_v4l2radio_base_init (gpointer gclass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (gclass); GstV4l2RadioClass *gstv4l2radio_class = GST_V4L2RADIO_CLASS (gclass); GST_DEBUG_CATEGORY_INIT (v4l2radio_debug, "v4l2radio", 0, "V4l2 radio element"); gstv4l2radio_class->v4l2_class_devices = NULL; gst_element_class_set_details_simple (gstelement_class, "Radio (video4linux2) Tuner", "Tuner", "Controls a Video4Linux2 radio device", "Alexey Chernov <4ernov@gmail.com>"); } static void gst_v4l2radio_class_init (GstV4l2RadioClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_v4l2radio_set_property; gobject_class->get_property = gst_v4l2radio_get_property; g_object_class_install_property (gobject_class, ARG_DEVICE, g_param_spec_string ("device", "Radio device location", "Video4Linux2 radio device location", DEFAULT_PROP_DEVICE, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_FREQUENCY, g_param_spec_int ("frequency", "Station frequency", "Station frequency in Hz", MIN_FREQUENCY, MAX_FREQUENCY, DEFAULT_FREQUENCY, G_PARAM_READWRITE)); gobject_class->dispose = gst_v4l2radio_dispose; gobject_class->finalize = (GObjectFinalizeFunc) gst_v4l2radio_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_v4l2radio_change_state); } static void gst_v4l2radio_init (GstV4l2Radio * filter, GstV4l2RadioClass * gclass) { filter->v4l2object = gst_v4l2_object_new (GST_ELEMENT (filter), V4L2_BUF_TYPE_VIDEO_CAPTURE, DEFAULT_PROP_DEVICE, gst_v4l2radio_get_input, gst_v4l2radio_set_input, NULL); filter->v4l2object->frequency = DEFAULT_FREQUENCY; g_free (filter->v4l2object->videodev); filter->v4l2object->videodev = g_strdup (DEFAULT_PROP_DEVICE); } static void gst_v4l2radio_dispose (GObject * object) { GstV4l2Radio *radio = GST_V4L2RADIO (object); gst_v4l2_close (radio->v4l2object); G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_v4l2radio_finalize (GstV4l2Radio * radio) { gst_v4l2_object_destroy (radio->v4l2object); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (radio)); } static gboolean gst_v4l2radio_open (GstV4l2Radio * radio) { GstV4l2Object *v4l2object; v4l2object = radio->v4l2object; if (gst_v4l2_open (v4l2object)) return gst_v4l2radio_fill_channel_list (radio); else return FALSE; } static void gst_v4l2radio_set_defaults (GstV4l2Radio * radio) { GstV4l2Object *v4l2object; GstTunerChannel *channel = NULL; GstTuner *tuner; v4l2object = radio->v4l2object; if (!GST_IS_TUNER (v4l2object->element)) return; tuner = GST_TUNER (v4l2object->element); if (v4l2object->channel) channel = gst_tuner_find_channel_by_name (tuner, v4l2object->channel); if (channel) { gst_tuner_set_channel (tuner, channel); } else { channel = GST_TUNER_CHANNEL (gst_tuner_get_channel (GST_TUNER (v4l2object->element))); if (channel) { g_free (v4l2object->channel); v4l2object->channel = g_strdup (channel->label); gst_tuner_channel_changed (tuner, channel); } } if (channel && GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) { if (v4l2object->frequency != 0) { gst_tuner_set_frequency (tuner, channel, v4l2object->frequency); } else { v4l2object->frequency = gst_tuner_get_frequency (tuner, channel); if (v4l2object->frequency == 0) { /* guess */ gst_tuner_set_frequency (tuner, channel, MIN_FREQUENCY); } else { } } } } static gboolean gst_v4l2radio_start (GstV4l2Radio * radio) { if (!gst_v4l2radio_open (radio)) return FALSE; gst_v4l2radio_set_defaults (radio); return TRUE; } static gboolean gst_v4l2radio_stop (GstV4l2Radio * radio) { if (!gst_v4l2_object_stop (radio->v4l2object)) return FALSE; return TRUE; } static GstStateChangeReturn gst_v4l2radio_change_state (GstElement * element, GstStateChange transition) { GstV4l2Radio *radio; GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; radio = GST_V4L2RADIO (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: /*start radio */ if (!gst_v4l2radio_start (radio)) ret = GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: /*unmute radio */ if (!gst_v4l2radio_set_unmute (radio)) ret = GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: /*mute radio */ if (!gst_v4l2radio_set_mute (radio)) ret = GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_READY_TO_NULL: /*stop radio */ if (!gst_v4l2radio_stop (radio)) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; } static void gst_v4l2radio_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstV4l2Radio *radio = GST_V4L2RADIO (object); gint frequency; switch (prop_id) { case ARG_DEVICE: g_free (radio->v4l2object->videodev); radio->v4l2object->videodev = g_strdup ((gchar *) g_value_get_string (value)); break; case ARG_FREQUENCY: frequency = g_value_get_int (value); if (frequency >= MIN_FREQUENCY && frequency <= MAX_FREQUENCY) { radio->v4l2object->frequency = frequency; gst_v4l2_set_frequency (radio->v4l2object, 0, radio->v4l2object->frequency); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_v4l2radio_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstV4l2Radio *radio = GST_V4L2RADIO (object); switch (prop_id) { case ARG_DEVICE: g_value_set_string (value, radio->v4l2object->videodev); break; case ARG_FREQUENCY: if (gst_v4l2_get_frequency (radio->v4l2object, 0, &(radio->v4l2object->frequency))) g_value_set_int (value, radio->v4l2object->frequency); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstURIHandler interface */ static GstURIType gst_v4l2radio_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_v4l2radio_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "radio", NULL }; return protocols; } static const gchar * gst_v4l2radio_uri_get_uri (GstURIHandler * handler) { GstV4l2Radio *radio = GST_V4L2RADIO (handler); if (radio->v4l2object->videodev != NULL) { if (gst_v4l2_get_frequency (radio->v4l2object, 0, &(radio->v4l2object->frequency))) { gchar uri[20]; gchar freq[6]; g_ascii_formatd (freq, 6, "%4.1f", radio->v4l2object->frequency / 1e6); g_snprintf (uri, sizeof (uri), "radio://%s", freq); return g_intern_string (uri); } } return "radio://"; } static gboolean gst_v4l2radio_uri_set_uri (GstURIHandler * handler, const gchar * uri) { GstV4l2Radio *radio = GST_V4L2RADIO (handler); gdouble dfreq; gint ifreq; const gchar *freq; gchar *end; if (strcmp (uri, "radio://") != 0) { freq = uri + 8; dfreq = g_ascii_strtod (freq, &end); if (errno || strlen (end)) goto uri_failed; ifreq = dfreq * 1e6; g_object_set (radio, "frequency", ifreq, NULL); } else goto uri_failed; return TRUE; uri_failed: return FALSE; } static void gst_v4l2radio_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_v4l2radio_uri_get_type; iface->get_protocols = gst_v4l2radio_uri_get_protocols; iface->get_uri = gst_v4l2radio_uri_get_uri; iface->set_uri = gst_v4l2radio_uri_set_uri; } gst-plugins-good-0.10.31/sys/v4l2/gstv4l2.c0000644000175000017500000000542011671175354015070 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * * gstv4l2.c: plugin for v4l2 elements * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include #include #include "gstv4l2object.h" #include "gstv4l2src.h" #ifdef HAVE_EXPERIMENTAL #include "gstv4l2sink.h" #endif #include "gstv4l2radio.h" /* #include "gstv4l2jpegsrc.h" */ /* #include "gstv4l2mjpegsrc.h" */ /* #include "gstv4l2mjpegsink.h" */ /* used in v4l2_calls.c and v4l2src_calls.c */ GST_DEBUG_CATEGORY (v4l2_debug); GST_DEBUG_CATEGORY (GST_CAT_PERFORMANCE); static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (v4l2_debug, "v4l2", 0, "V4L2 API calls"); GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE"); /* initialize gst controller library */ gst_controller_init (NULL, NULL); if (!gst_element_register (plugin, "v4l2src", GST_RANK_PRIMARY, GST_TYPE_V4L2SRC) || #ifdef HAVE_EXPERIMENTAL !gst_element_register (plugin, "v4l2sink", GST_RANK_NONE, GST_TYPE_V4L2SINK) || #endif !gst_element_register (plugin, "v4l2radio", GST_RANK_NONE, GST_TYPE_V4L2RADIO) || /* !gst_element_register (plugin, "v4l2jpegsrc", */ /* GST_RANK_NONE, GST_TYPE_V4L2JPEGSRC) || */ /* !gst_element_register (plugin, "v4l2mjpegsrc", */ /* GST_RANK_NONE, GST_TYPE_V4L2MJPEGSRC) || */ /* !gst_element_register (plugin, "v4l2mjpegsink", */ /* GST_RANK_NONE, GST_TYPE_V4L2MJPEGSINK)) */ FALSE) return FALSE; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "video4linux2", "elements for Video 4 Linux", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/v4l2/gstv4l2bufferpool.h0000644000175000017500000000710011671175354017156 00000000000000/* GStreamer * * Copyright (C) 2001-2002 Ronald Bultje * 2006 Edgard Lima * 2009 Texas Instruments, Inc - http://www.ti.com/ * * gstv4l2bufferpool.h V4L2 buffer pool class * * 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 __GSTV4L2BUFFER_H__ #define __GSTV4L2BUFFER_H__ #include #include "v4l2_calls.h" GST_DEBUG_CATEGORY_EXTERN (v4l2buffer_debug); G_BEGIN_DECLS GType gst_v4l2_buffer_get_type (void); #define GST_TYPE_V4L2_BUFFER (gst_v4l2_buffer_get_type()) #define GST_IS_V4L2_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_BUFFER)) #define GST_V4L2_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_BUFFER, GstV4l2Buffer)) GType gst_v4l2_buffer_pool_get_type (void); #define GST_TYPE_V4L2_BUFFER_POOL (gst_v4l2_buffer_pool_get_type()) #define GST_IS_V4L2_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_BUFFER_POOL)) #define GST_V4L2_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_BUFFER_POOL, GstV4l2BufferPool)) typedef struct _GstV4l2BufferPool GstV4l2BufferPool; typedef struct _GstV4l2Buffer GstV4l2Buffer; struct _GstV4l2BufferPool { GstMiniObject parent; GstElement *v4l2elem; /* the v4l2 src/sink that owns us.. maybe we should be owned by v4l2object? */ gboolean requeuebuf; /* if true, unusued buffers are automatically re-QBUF'd */ enum v4l2_buf_type type; /* V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_OUTPUT */ GMutex *lock; gboolean running; /* with lock */ gint num_live_buffers; /* number of buffers not with driver */ GAsyncQueue* avail_buffers;/* pool of available buffers, not with the driver and which aren't held outside the bufferpool */ gint video_fd; /* a dup(2) of the v4l2object's video_fd */ guint buffer_count; GstV4l2Buffer **buffers; }; struct _GstV4l2Buffer { GstBuffer buffer; struct v4l2_buffer vbuffer; /* FIXME: have GstV4l2Src* instead, as this has GstV4l2BufferPool* */ /* FIXME: do we really want to fix this if GstV4l2Buffer/Pool is shared * between v4l2src and v4l2sink?? */ GstV4l2BufferPool *pool; }; void gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool); GstV4l2BufferPool *gst_v4l2_buffer_pool_new (GstElement *v4l2elem, gint fd, gint num_buffers, GstCaps * caps, gboolean requeuebuf, enum v4l2_buf_type type); GstV4l2Buffer *gst_v4l2_buffer_pool_get (GstV4l2BufferPool *pool, gboolean blocking); gboolean gst_v4l2_buffer_pool_qbuf (GstV4l2BufferPool *pool, GstV4l2Buffer *buf); GstV4l2Buffer *gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool *pool); gint gst_v4l2_buffer_pool_available_buffers (GstV4l2BufferPool *pool); #define GST_V4L2_BUFFER_POOL_LOCK(pool) g_mutex_lock ((pool)->lock) #define GST_V4L2_BUFFER_POOL_UNLOCK(pool) g_mutex_unlock ((pool)->lock) G_END_DECLS #endif /* __GSTV4L2BUFFER_H__ */ gst-plugins-good-0.10.31/sys/oss/0000755000175000017500000000000011720565320013502 500000000000000gst-plugins-good-0.10.31/sys/oss/gstossmixer.h0000644000175000017500000002227311671175354016201 00000000000000/* GStreamer OSS Mixer implementation * Copyright (C) 2003 Ronald Bultje * * gstossmixer.h: mixer interface implementation for OSS * * 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_OSS_MIXER_H__ #define __GST_OSS_MIXER_H__ #include #include #include "gstosshelper.h" G_BEGIN_DECLS #define GST_OSS_MIXER(obj) ((GstOssMixer*)(obj)) typedef enum { GST_OSS_MIXER_CAPTURE = 1<<0, GST_OSS_MIXER_PLAYBACK = 1<<1, GST_OSS_MIXER_ALL = GST_OSS_MIXER_CAPTURE | GST_OSS_MIXER_PLAYBACK } GstOssMixerDirection; typedef struct _GstOssMixer GstOssMixer; struct _GstOssMixer { GList * tracklist; /* list of available tracks */ gint mixer_fd; gchar * device; gchar * cardname; gint recmask; gint recdevs; gint stereomask; gint devmask; gint mixcaps; GstOssMixerDirection dir; }; GstOssMixer* gst_ossmixer_new (const gchar *device, GstOssMixerDirection dir); void gst_ossmixer_free (GstOssMixer *mixer); const GList* gst_ossmixer_list_tracks (GstOssMixer * mixer); void gst_ossmixer_set_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes); void gst_ossmixer_get_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes); void gst_ossmixer_set_record (GstOssMixer * mixer, GstMixerTrack * track, gboolean record); void gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, gboolean mute); #define GST_IMPLEMENT_OSS_MIXER_METHODS(Type, interface_as_function) \ static gboolean \ interface_as_function ## _supported (Type *this, GType iface_type) \ { \ g_assert (iface_type == GST_TYPE_MIXER); \ \ return (this->mixer != NULL); \ } \ \ static const GList* \ interface_as_function ## _list_tracks (GstMixer * mixer) \ { \ Type *this = (Type*) mixer; \ \ g_return_val_if_fail (this != NULL, NULL); \ g_return_val_if_fail (this->mixer != NULL, NULL); \ \ return gst_ossmixer_list_tracks (this->mixer); \ } \ \ static void \ interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \ gint * volumes) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_ossmixer_set_volume (this->mixer, track, volumes); \ } \ \ static void \ interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \ gint * volumes) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_ossmixer_get_volume (this->mixer, track, volumes); \ } \ \ static void \ interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \ gboolean record) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_ossmixer_set_record (this->mixer, track, record); \ } \ \ static void \ interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \ gboolean mute) \ { \ Type *this = (Type*) mixer; \ \ g_return_if_fail (this != NULL); \ g_return_if_fail (this->mixer != NULL); \ \ gst_ossmixer_set_mute (this->mixer, track, mute); \ } \ \ static void \ interface_as_function ## _interface_init (GstMixerClass * klass) \ { \ GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \ \ /* set up the interface hooks */ \ klass->list_tracks = interface_as_function ## _list_tracks; \ klass->set_volume = interface_as_function ## _set_volume; \ klass->get_volume = interface_as_function ## _get_volume; \ klass->set_mute = interface_as_function ## _set_mute; \ klass->set_record = interface_as_function ## _set_record; \ } G_END_DECLS #endif /* __GST_OSS_MIXER_H__ */ gst-plugins-good-0.10.31/sys/oss/common.h0000644000175000017500000000347511671175354015105 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000,2005 Wim Taymans * * 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. */ #define SET_PARAM(_oss, _name, _val, _detail) \ G_STMT_START { \ int _tmp = _val; \ if (ioctl(_oss->fd, _name, &_tmp) == -1) { \ GST_ELEMENT_ERROR (_oss, RESOURCE, SETTINGS,\ (NULL), \ ("Unable to set param " _detail ": %s", \ g_strerror (errno))); \ return FALSE; \ } \ GST_DEBUG_OBJECT(_oss, _detail " %d", _tmp); \ } G_STMT_END #define GET_PARAM(_oss, _name, _val, _detail) \ G_STMT_START { \ if (ioctl(oss->fd, _name, _val) == -1) { \ GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, \ (NULL), \ ("Unable to get param " _detail ": %s", \ g_strerror (errno))); \ return FALSE; \ } \ } G_STMT_END gst-plugins-good-0.10.31/sys/oss/gstosssink.h0000644000175000017500000000351211671175354016014 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * * gstosssink.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_OSSSINK_H__ #define __GST_OSSSINK_H__ #include #include #include "gstosshelper.h" G_BEGIN_DECLS #define GST_TYPE_OSSSINK (gst_oss_sink_get_type()) #define GST_OSSSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSSSINK,GstOssSink)) #define GST_OSSSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSSSINK,GstOssSinkClass)) #define GST_IS_OSSSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSSINK)) #define GST_IS_OSSSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSSINK)) typedef struct _GstOssSink GstOssSink; typedef struct _GstOssSinkClass GstOssSinkClass; struct _GstOssSink { GstAudioSink sink; gchar *device; gint fd; gint bytes_per_sample; GstCaps *probed_caps; }; struct _GstOssSinkClass { GstAudioSinkClass parent_class; }; GType gst_oss_sink_get_type(void); G_END_DECLS #endif /* __GST_OSSSINK_H__ */ gst-plugins-good-0.10.31/sys/oss/gstossmixerelement.c0000644000175000017500000001420711671175354017544 00000000000000/* OSS mixer interface element. * Copyright (C) 2005 Andrew Vander Wingo * * 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-ossmixer * * This element lets you adjust sound input and output levels with the * Open Sound System (OSS). It supports the #GstMixer interface, which can be * used to obtain a list of available mixer tracks. Set the mixer element to * READY state before using the #GstMixer interface on it. * * * Example pipelines * * ossmixer can't be used in a sensible way in gst-launch. * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstossmixerelement.h" GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug #define DEFAULT_DEVICE "/dev/mixer" #define DEFAULT_DEVICE_NAME NULL enum { PROP_0, PROP_DEVICE, PROP_DEVICE_NAME }; GST_BOILERPLATE_WITH_INTERFACE (GstOssMixerElement, gst_oss_mixer_element, GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, gst_oss_mixer_element); GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssMixerElement, gst_oss_mixer_element); static GstStateChangeReturn gst_oss_mixer_element_change_state (GstElement * element, GstStateChange transition); static void gst_oss_mixer_element_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_oss_mixer_element_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_oss_mixer_element_finalize (GObject * object); static void gst_oss_mixer_element_base_init (gpointer klass) { gst_element_class_set_details_simple (GST_ELEMENT_CLASS (klass), "OSS Mixer", "Generic/Audio", "Control sound input and output levels with OSS", "Andrew Vander Wingo "); } static void gst_oss_mixer_element_class_init (GstOssMixerElementClass * klass) { GstElementClass *element_class; GObjectClass *gobject_class; element_class = (GstElementClass *) klass; gobject_class = (GObjectClass *) klass; gobject_class->finalize = gst_oss_mixer_element_finalize; gobject_class->set_property = gst_oss_mixer_element_set_property; gobject_class->get_property = gst_oss_mixer_element_get_property; /** * GstOssMixerElement:device * * OSS mixer device (usually /dev/mixer) * * Since: 0.10.5 **/ g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "OSS mixer device (usually /dev/mixer)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); element_class->change_state = GST_DEBUG_FUNCPTR (gst_oss_mixer_element_change_state); } static void gst_oss_mixer_element_finalize (GObject * obj) { GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (obj); g_free (this->device); G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_oss_mixer_element_init (GstOssMixerElement * this, GstOssMixerElementClass * g_class) { this->mixer = NULL; this->device = g_strdup (DEFAULT_DEVICE); } static void gst_oss_mixer_element_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (object); switch (prop_id) { case PROP_DEVICE: g_free (this->device); this->device = g_value_dup_string (value); /* make sure we never set NULL */ if (this->device == NULL) { this->device = g_strdup (DEFAULT_DEVICE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss_mixer_element_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (object); switch (prop_id) { case PROP_DEVICE: g_value_set_string (value, this->device); break; case PROP_DEVICE_NAME: if (this->mixer) { g_value_set_string (value, this->mixer->cardname); } else { g_value_set_string (value, NULL); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_oss_mixer_element_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstOssMixerElement *this = GST_OSS_MIXER_ELEMENT (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!this->mixer) { this->mixer = gst_ossmixer_new (this->device, GST_OSS_MIXER_ALL); if (!this->mixer) goto open_failed; } break; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (this->mixer) { gst_ossmixer_free (this->mixer); this->mixer = NULL; } break; default: break; } return ret; /* ERRORS */ open_failed: { GST_ELEMENT_ERROR (element, RESOURCE, OPEN_READ_WRITE, (NULL), ("Failed to open oss mixer device '%s'", this->device)); return GST_STATE_CHANGE_FAILURE; } } gst-plugins-good-0.10.31/sys/oss/Makefile.am0000644000175000017500000000146211671175354015472 00000000000000plugin_LTLIBRARIES = libgstossaudio.la libgstossaudio_la_SOURCES = gstossaudio.c \ gstosshelper.c \ gstossmixer.c \ gstossmixerelement.c \ gstossmixertrack.c \ gstosssink.c \ gstosssrc.c libgstossaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstossaudio_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstinterfaces-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstossaudio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = common.h \ gstosssink.h \ gstosssrc.h \ gstosshelper.h \ gstossdmabuffer.h \ gstossmixer.h \ gstossmixerelement.h \ gstossmixertrack.h gst-plugins-good-0.10.31/sys/oss/gstossmixertrack.c0000644000175000017500000001133711671175354017220 00000000000000/* GStreamer OSS Mixer implementation * Copyright (C) 2003 Ronald Bultje * * gstossmixer.c: mixer interface implementation for OSS * * 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 #include #include #include #include #include #include #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else # ifdef HAVE_OSS_INCLUDE_IN_ROOT # include # else # ifdef HAVE_OSS_INCLUDE_IN_MACHINE # include # else # error "What to include?" # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ #include #include "gstossmixertrack.h" GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) G_DEFINE_TYPE (GstOssMixerTrack, gst_ossmixer_track, GST_TYPE_MIXER_TRACK); static void gst_ossmixer_track_class_init (GstOssMixerTrackClass * klass) { /* nop */ } static void gst_ossmixer_track_init (GstOssMixerTrack * track) { track->lvol = track->rvol = 0; track->track_num = 0; } static const gchar **labels = NULL; /* three functions: firstly, OSS has the nasty habit of inserting * spaces in the labels, we want to get rid of them. Secondly, * i18n is impossible with OSS' way of providing us with mixer * labels, so we make a 'given' list of i18n'ed labels. Thirdly, I * personally don't like the "1337" names that OSS gives to their * labels ("Vol", "Mic", "Rec"), I'd rather see full names. */ static void fill_labels (void) { gint i, pos; const gchar *origs[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; const struct { const gchar *given; const gchar *wanted; } cases[] = { /* Note: this list is simply ripped from soundcard.h. For * some people, some values might be missing (3D surround, * etc.) - feel free to add them. That's the reason why * I'm doing this in such a horribly complicated way. */ { "Vol ", _("Volume")}, { "Bass ", _("Bass")}, { "Trebl", _("Treble")}, { "Synth", _("Synth")}, { "Pcm ", _("PCM")}, { "Spkr ", _("Speaker")}, { "Line ", _("Line-in")}, { "Mic ", _("Microphone")}, { "CD ", _("CD")}, { "Mix ", _("Mixer")}, { "Pcm2 ", _("PCM-2")}, { "Rec ", _("Record")}, { "IGain", _("In-gain")}, { "OGain", _("Out-gain")}, { "Line1", _("Line-1")}, { "Line2", _("Line-2")}, { "Line3", _("Line-3")}, { "Digital1", _("Digital-1")}, { "Digital2", _("Digital-2")}, { "Digital3", _("Digital-3")}, { "PhoneIn", _("Phone-in")}, { "PhoneOut", _("Phone-out")}, { "Video", _("Video")}, { "Radio", _("Radio")}, { "Monitor", _("Monitor")}, { NULL, NULL} }; labels = g_malloc (sizeof (gchar *) * SOUND_MIXER_NRDEVICES); for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { for (pos = 0; cases[pos].given != NULL; pos++) { if (!strcmp (cases[pos].given, origs[i])) { labels[i] = g_strdup (cases[pos].wanted); break; } } if (cases[pos].given == NULL) labels[i] = g_strdup (origs[i]); } } GstMixerTrack * gst_ossmixer_track_new (gint mixer_fd, gint track_num, gint max_chans, gint flags) { GstOssMixerTrack *osstrack; GstMixerTrack *track; gint volume; if (!labels) fill_labels (); osstrack = g_object_new (GST_TYPE_OSSMIXER_TRACK, NULL); track = GST_MIXER_TRACK (osstrack); track->label = g_strdup (labels[track_num]); track->num_channels = max_chans; track->flags = flags; track->min_volume = 0; track->max_volume = 100; osstrack->track_num = track_num; /* volume */ if (ioctl (mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting device (%d) volume: %s", osstrack->track_num, strerror (errno)); volume = 0; } osstrack->lvol = (volume & 0xff); if (track->num_channels == 2) { osstrack->rvol = ((volume >> 8) & 0xff); } return track; } gst-plugins-good-0.10.31/sys/oss/gstosssrc.h0000644000175000017500000000361111671175354015637 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * * gstosssrc.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_OSS_SRC_H__ #define __GST_OSS_SRC_H__ #include #include #include "gstosshelper.h" #include "gstossmixer.h" G_BEGIN_DECLS #define GST_TYPE_OSS_SRC (gst_oss_src_get_type()) #define GST_OSS_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS_SRC,GstOssSrc)) #define GST_OSS_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS_SRC,GstOssSrcClass)) #define GST_IS_OSS_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS_SRC)) #define GST_IS_OSS_SRC_CLASS(klas) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS_SRC)) typedef struct _GstOssSrc GstOssSrc; typedef struct _GstOssSrcClass GstOssSrcClass; struct _GstOssSrc { GstAudioSrc src; gint fd; gint bytes_per_sample; gchar *device; gchar *device_name; GstCaps *probed_caps; GstOssMixer *mixer; }; struct _GstOssSrcClass { GstAudioSrcClass parent_class; }; GType gst_oss_src_get_type(void); G_END_DECLS #endif /* __GST_OSS_SRC_H__ */ gst-plugins-good-0.10.31/sys/oss/gstosshelper.h0000644000175000017500000000223111671175354016324 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * * gstosshelper.h: OSS helper routines. * * 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_OSS_HELPER_H__ #define __GST_OSS_HELPER_H__ #include #include #include "gstosshelper.h" G_BEGIN_DECLS GstCaps* gst_oss_helper_probe_caps (gint fd); G_END_DECLS #endif /* __GST_OSS_HELPER_H__ */ gst-plugins-good-0.10.31/sys/oss/gstossmixerelement.h0000644000175000017500000000364111671175354017551 00000000000000/* OSS mixer interface element. * Copyright (C) 2005 Andrew Vander Wingo * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __GST_OSS_MIXER_ELEMENT_H__ #define __GST_OSS_MIXER_ELEMENT_H__ #include "gstossmixer.h" G_BEGIN_DECLS #define GST_OSS_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSS_MIXER_ELEMENT,GstOssMixerElement)) #define GST_OSS_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSS_MIXER_ELEMENT,GstOssMixerElementClass)) #define GST_IS_OSS_MIXER_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSS_MIXER_ELEMENT)) #define GST_IS_OSS_MIXER_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSS_MIXER_ELEMENT)) #define GST_TYPE_OSS_MIXER_ELEMENT (gst_oss_mixer_element_get_type()) typedef struct _GstOssMixerElement GstOssMixerElement; typedef struct _GstOssMixerElementClass GstOssMixerElementClass; struct _GstOssMixerElement { GstElement parent; gchar *device; GstOssMixer *mixer; }; struct _GstOssMixerElementClass { GstElementClass parent; }; GType gst_oss_mixer_element_get_type (void); G_END_DECLS #endif /* __GST_OSS_MIXER_ELEMENT_H__ */ gst-plugins-good-0.10.31/sys/oss/gstosshelper.c0000644000175000017500000002444311671175354016330 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * * gstosshelper.c: OSS helper routines * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include #include #include #include #include #include #include #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else # ifdef HAVE_OSS_INCLUDE_IN_ROOT # include # else # ifdef HAVE_OSS_INCLUDE_IN_MACHINE # include # else # error "What to include?" # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ #include #include "gstosshelper.h" #include "gstossmixer.h" GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug typedef struct _GstOssProbe GstOssProbe; struct _GstOssProbe { int fd; int format; int n_channels; GArray *rates; int min; int max; }; typedef struct _GstOssRange GstOssRange; struct _GstOssRange { int min; int max; }; static GstStructure *gst_oss_helper_get_format_structure (unsigned int format_bit); static gboolean gst_oss_helper_rate_probe_check (GstOssProbe * probe); static int gst_oss_helper_rate_check_rate (GstOssProbe * probe, int irate); static void gst_oss_helper_rate_add_range (GQueue * queue, int min, int max); static void gst_oss_helper_rate_add_rate (GArray * array, int rate); static int gst_oss_helper_rate_int_compare (gconstpointer a, gconstpointer b); GstCaps * gst_oss_helper_probe_caps (gint fd) { GstOssProbe *probe; int i; gboolean ret; GstStructure *structure; unsigned int format_bit; unsigned int format_mask; GstCaps *caps; /* FIXME test make sure we're not currently playing */ /* FIXME test both mono and stereo */ format_mask = AFMT_U8 | AFMT_S8; if (G_BYTE_ORDER == G_LITTLE_ENDIAN) format_mask |= AFMT_S16_LE | AFMT_U16_LE; else format_mask |= AFMT_S16_BE | AFMT_U16_BE; caps = gst_caps_new_empty (); /* assume that the most significant bit of format_mask is 0 */ for (format_bit = 1 << 31; format_bit > 0; format_bit >>= 1) { if (format_bit & format_mask) { GValue rate_value = { 0 }; probe = g_new0 (GstOssProbe, 1); probe->fd = fd; probe->format = format_bit; /* FIXME: this is not working for all cards, see bug #518474 */ probe->n_channels = 2; ret = gst_oss_helper_rate_probe_check (probe); if (probe->min == -1 || probe->max == -1) { g_array_free (probe->rates, TRUE); g_free (probe); continue; } if (ret) { GValue value = { 0 }; g_array_sort (probe->rates, gst_oss_helper_rate_int_compare); g_value_init (&rate_value, GST_TYPE_LIST); g_value_init (&value, G_TYPE_INT); for (i = 0; i < probe->rates->len; i++) { g_value_set_int (&value, g_array_index (probe->rates, int, i)); gst_value_list_append_value (&rate_value, &value); } g_value_unset (&value); } else { /* one big range */ g_value_init (&rate_value, GST_TYPE_INT_RANGE); gst_value_set_int_range (&rate_value, probe->min, probe->max); } g_array_free (probe->rates, TRUE); g_free (probe); structure = gst_oss_helper_get_format_structure (format_bit); gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); gst_structure_set_value (structure, "rate", &rate_value); g_value_unset (&rate_value); gst_caps_append_structure (caps, structure); } } if (gst_caps_is_empty (caps)) { /* fixme: make user-visible */ GST_WARNING ("Your OSS device could not be probed correctly"); } GST_DEBUG ("probed caps: %" GST_PTR_FORMAT, caps); return caps; } static GstStructure * gst_oss_helper_get_format_structure (unsigned int format_bit) { GstStructure *structure; int endianness; gboolean sign; int width; switch (format_bit) { case AFMT_U8: endianness = 0; sign = FALSE; width = 8; break; case AFMT_S16_LE: endianness = G_LITTLE_ENDIAN; sign = TRUE; width = 16; break; case AFMT_S16_BE: endianness = G_BIG_ENDIAN; sign = TRUE; width = 16; break; case AFMT_S8: endianness = 0; sign = TRUE; width = 8; break; case AFMT_U16_LE: endianness = G_LITTLE_ENDIAN; sign = FALSE; width = 16; break; case AFMT_U16_BE: endianness = G_BIG_ENDIAN; sign = FALSE; width = 16; break; default: g_assert_not_reached (); return NULL; } structure = gst_structure_new ("audio/x-raw-int", "width", G_TYPE_INT, width, "depth", G_TYPE_INT, width, "signed", G_TYPE_BOOLEAN, sign, NULL); if (endianness) { gst_structure_set (structure, "endianness", G_TYPE_INT, endianness, NULL); } return structure; } static gboolean gst_oss_helper_rate_probe_check (GstOssProbe * probe) { GstOssRange *range; GQueue *ranges; int exact_rates = 0; gboolean checking_exact_rates = TRUE; int n_checks = 0; gboolean result = TRUE; ranges = g_queue_new (); probe->rates = g_array_new (FALSE, FALSE, sizeof (int)); probe->min = gst_oss_helper_rate_check_rate (probe, 1000); n_checks++; probe->max = gst_oss_helper_rate_check_rate (probe, 100000); /* a little bug workaround */ { int max; max = gst_oss_helper_rate_check_rate (probe, 48000); if (max > probe->max) { GST_ERROR ("Driver bug recognized (driver does not round rates correctly). Please file a bug report."); probe->max = max; } } n_checks++; if (probe->min == -1 || probe->max == -1) { /* This is a workaround for drivers that return -EINVAL (or another * error) for rates outside of [8000,48000]. If this fails, the * driver is seriously buggy, and probably doesn't work with other * media libraries/apps. */ probe->min = gst_oss_helper_rate_check_rate (probe, 8000); probe->max = gst_oss_helper_rate_check_rate (probe, 48000); } if (probe->min == -1 || probe->max == -1) { GST_DEBUG ("unexpected check_rate error"); return FALSE; } gst_oss_helper_rate_add_range (ranges, probe->min + 1, probe->max - 1); while ((range = g_queue_pop_head (ranges))) { int min1; int max1; int mid; int mid_ret; GST_DEBUG ("checking [%d,%d]", range->min, range->max); mid = (range->min + range->max) / 2; mid_ret = gst_oss_helper_rate_check_rate (probe, mid); if (mid_ret == -1) { /* FIXME ioctl returned an error. do something */ GST_DEBUG ("unexpected check_rate error"); } n_checks++; if (mid == mid_ret && checking_exact_rates) { int max_exact_matches = 20; exact_rates++; if (exact_rates > max_exact_matches) { GST_DEBUG ("got %d exact rates, assuming all are exact", max_exact_matches); result = FALSE; g_free (range); break; } } else { checking_exact_rates = FALSE; } /* Assume that the rate is arithmetically rounded to the nearest * supported rate. */ if (mid == mid_ret) { min1 = mid - 1; max1 = mid + 1; } else { if (mid < mid_ret) { min1 = mid - (mid_ret - mid); max1 = mid_ret + 1; } else { min1 = mid_ret - 1; max1 = mid + (mid - mid_ret); } } gst_oss_helper_rate_add_range (ranges, range->min, min1); gst_oss_helper_rate_add_range (ranges, max1, range->max); g_free (range); } while ((range = g_queue_pop_head (ranges))) { g_free (range); } g_queue_free (ranges); return result; } static void gst_oss_helper_rate_add_range (GQueue * queue, int min, int max) { if (min <= max) { GstOssRange *range = g_new0 (GstOssRange, 1); range->min = min; range->max = max; g_queue_push_tail (queue, range); /* push_head also works, but has different probing behavior */ /*g_queue_push_head (queue, range); */ } } static int gst_oss_helper_rate_check_rate (GstOssProbe * probe, int irate) { int rate; int format; int n_channels; int ret; rate = irate; format = probe->format; n_channels = probe->n_channels; GST_LOG ("checking format %d, channels %d, rate %d", format, n_channels, rate); ret = ioctl (probe->fd, SNDCTL_DSP_SETFMT, &format); if (ret < 0 || format != probe->format) { GST_DEBUG ("unsupported format: %d (%d)", probe->format, format); return -1; } ret = ioctl (probe->fd, SNDCTL_DSP_CHANNELS, &n_channels); if (ret < 0 || n_channels != probe->n_channels) { GST_DEBUG ("unsupported channels: %d (%d)", probe->n_channels, n_channels); return -1; } ret = ioctl (probe->fd, SNDCTL_DSP_SPEED, &rate); if (ret < 0) { GST_DEBUG ("unsupported rate: %d (%d)", irate, rate); return -1; } GST_DEBUG ("rate %d -> %d", irate, rate); if (rate == irate - 1 || rate == irate + 1) { rate = irate; } gst_oss_helper_rate_add_rate (probe->rates, rate); return rate; } static void gst_oss_helper_rate_add_rate (GArray * array, int rate) { int i; int val; for (i = 0; i < array->len; i++) { val = g_array_index (array, int, i); if (val == rate) return; } GST_DEBUG ("supported rate: %d", rate); g_array_append_val (array, rate); } static int gst_oss_helper_rate_int_compare (gconstpointer a, gconstpointer b) { const int *va = (const int *) a; const int *vb = (const int *) b; if (*va < *vb) return -1; if (*va > *vb) return 1; return 0; } gst-plugins-good-0.10.31/sys/oss/gstosssink.c0000644000175000017500000003500311677341660016010 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000,2005 Wim Taymans * * gstosssink.c: * * 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-osssink * * This element lets you output sound using the Open Sound System (OSS). * * Note that you should almost always use generic audio conversion elements * like audioconvert and audioresample in front of an audiosink to make sure * your pipeline works under all circumstances (those conversion elements will * act in passthrough-mode if no conversion is necessary). * * * Example pipelines * |[ * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! osssink * ]| will output a sine wave (continuous beep sound) to your sound card (with * a very low volume as precaution). * |[ * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! osssink * ]| will play an Ogg/Vorbis audio file and output it using the Open Sound System. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else # ifdef HAVE_OSS_INCLUDE_IN_ROOT # include # else # ifdef HAVE_OSS_INCLUDE_IN_MACHINE # include # else # error "What to include?" # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ #include "common.h" #include "gstosssink.h" #include GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug static void gst_oss_sink_base_init (gpointer g_class); static void gst_oss_sink_class_init (GstOssSinkClass * klass); static void gst_oss_sink_init (GstOssSink * osssink); static void gst_oss_sink_dispose (GObject * object); static void gst_oss_sink_finalise (GObject * object); static void gst_oss_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_oss_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static GstCaps *gst_oss_sink_getcaps (GstBaseSink * bsink); static gboolean gst_oss_sink_open (GstAudioSink * asink); static gboolean gst_oss_sink_close (GstAudioSink * asink); static gboolean gst_oss_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); static gboolean gst_oss_sink_unprepare (GstAudioSink * asink); static guint gst_oss_sink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_oss_sink_delay (GstAudioSink * asink); static void gst_oss_sink_reset (GstAudioSink * asink); /* OssSink signals and args */ enum { LAST_SIGNAL }; #define DEFAULT_DEVICE "/dev/dsp" enum { PROP_0, PROP_DEVICE, }; static GstStaticPadTemplate osssink_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) { " G_STRINGIFY (G_BYTE_ORDER) " }, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " "audio/x-raw-int, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") ); static GstElementClass *parent_class = NULL; /* static guint gst_oss_sink_signals[LAST_SIGNAL] = { 0 }; */ GType gst_oss_sink_get_type (void) { static GType osssink_type = 0; if (!osssink_type) { static const GTypeInfo osssink_info = { sizeof (GstOssSinkClass), gst_oss_sink_base_init, NULL, (GClassInitFunc) gst_oss_sink_class_init, NULL, NULL, sizeof (GstOssSink), 0, (GInstanceInitFunc) gst_oss_sink_init, }; osssink_type = g_type_register_static (GST_TYPE_AUDIO_SINK, "GstOssSink", &osssink_info, 0); } return osssink_type; } static void gst_oss_sink_dispose (GObject * object) { GstOssSink *osssink = GST_OSSSINK (object); if (osssink->probed_caps) { gst_caps_unref (osssink->probed_caps); osssink->probed_caps = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_oss_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Audio Sink (OSS)", "Sink/Audio", "Output to a sound card via OSS", "Erik Walthinsen , " "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &osssink_sink_factory); } static void gst_oss_sink_class_init (GstOssSinkClass * klass) { GObjectClass *gobject_class; GstBaseSinkClass *gstbasesink_class; GstAudioSinkClass *gstaudiosink_class; gobject_class = (GObjectClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; gstaudiosink_class = (GstAudioSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = gst_oss_sink_dispose; gobject_class->finalize = gst_oss_sink_finalise; gobject_class->get_property = gst_oss_sink_get_property; gobject_class->set_property = gst_oss_sink_set_property; g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "OSS device (usually /dev/dspN)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss_sink_getcaps); gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_oss_sink_open); gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_oss_sink_close); gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_oss_sink_prepare); gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss_sink_unprepare); gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_oss_sink_write); gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_oss_sink_delay); gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_oss_sink_reset); } static void gst_oss_sink_init (GstOssSink * osssink) { const gchar *device; GST_DEBUG_OBJECT (osssink, "initializing osssink"); device = g_getenv ("AUDIODEV"); if (device == NULL) device = DEFAULT_DEVICE; osssink->device = g_strdup (device); osssink->fd = -1; } static void gst_oss_sink_finalise (GObject * object) { GstOssSink *osssink = GST_OSSSINK (object); g_free (osssink->device); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (object)); } static void gst_oss_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOssSink *sink; sink = GST_OSSSINK (object); switch (prop_id) { case PROP_DEVICE: g_free (sink->device); sink->device = g_value_dup_string (value); if (sink->probed_caps) { gst_caps_unref (sink->probed_caps); sink->probed_caps = NULL; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOssSink *sink; sink = GST_OSSSINK (object); switch (prop_id) { case PROP_DEVICE: g_value_set_string (value, sink->device); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_oss_sink_getcaps (GstBaseSink * bsink) { GstOssSink *osssink; GstCaps *caps; osssink = GST_OSSSINK (bsink); if (osssink->fd == -1) { caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD (bsink))); } else if (osssink->probed_caps) { caps = gst_caps_copy (osssink->probed_caps); } else { caps = gst_oss_helper_probe_caps (osssink->fd); if (caps && !gst_caps_is_empty (caps)) { osssink->probed_caps = gst_caps_copy (caps); } } return caps; } static gint ilog2 (gint x) { /* well... hacker's delight explains... */ x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >> 16); x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x = x + (x >> 8); x = x + (x >> 16); return (x & 0x0000003f) - 1; } static gint gst_oss_sink_get_format (GstBufferFormat fmt) { gint result; switch (fmt) { case GST_MU_LAW: result = AFMT_MU_LAW; break; case GST_A_LAW: result = AFMT_A_LAW; break; case GST_IMA_ADPCM: result = AFMT_IMA_ADPCM; break; case GST_U8: result = AFMT_U8; break; case GST_S16_LE: result = AFMT_S16_LE; break; case GST_S16_BE: result = AFMT_S16_BE; break; case GST_S8: result = AFMT_S8; break; case GST_U16_LE: result = AFMT_U16_LE; break; case GST_U16_BE: result = AFMT_U16_BE; break; case GST_MPEG: result = AFMT_MPEG; break; default: result = 0; break; } return result; } static gboolean gst_oss_sink_open (GstAudioSink * asink) { GstOssSink *oss; int mode; oss = GST_OSSSINK (asink); mode = O_WRONLY; mode |= O_NONBLOCK; oss->fd = open (oss->device, mode, 0); if (oss->fd == -1) { switch (errno) { case EBUSY: goto busy; case EACCES: goto no_permission; default: goto open_failed; } } return TRUE; /* ERRORS */ busy: { GST_ELEMENT_ERROR (oss, RESOURCE, BUSY, (_("Could not open audio device for playback. " "Device is being used by another application.")), (NULL)); return FALSE; } no_permission: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, (_("Could not open audio device for playback. " "You don't have permission to open the device.")), GST_ERROR_SYSTEM); return FALSE; } open_failed: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_WRITE, (_("Could not open audio device for playback.")), GST_ERROR_SYSTEM); return FALSE; } } static gboolean gst_oss_sink_close (GstAudioSink * asink) { close (GST_OSSSINK (asink)->fd); GST_OSSSINK (asink)->fd = -1; return TRUE; } static gboolean gst_oss_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) { GstOssSink *oss; struct audio_buf_info info; int mode; int tmp; oss = GST_OSSSINK (asink); /* we opened non-blocking so that we can detect if the device is available * without hanging forever. We now want to remove the non-blocking flag. */ mode = fcntl (oss->fd, F_GETFL); mode &= ~O_NONBLOCK; if (fcntl (oss->fd, F_SETFL, mode) == -1) { /* some drivers do no support unsetting the non-blocking flag, try to * close/open the device then. This is racy but we error out properly. */ gst_oss_sink_close (asink); if ((oss->fd = open (oss->device, O_WRONLY, 0)) == -1) goto non_block; } tmp = gst_oss_sink_get_format (spec->format); if (tmp == 0) goto wrong_format; if (spec->width != 16 && spec->width != 8) goto dodgy_width; SET_PARAM (oss, SNDCTL_DSP_SETFMT, tmp, "SETFMT"); if (spec->channels == 2) SET_PARAM (oss, SNDCTL_DSP_STEREO, 1, "STEREO"); SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels, "CHANNELS"); SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate, "SPEED"); tmp = ilog2 (spec->segsize); tmp = ((spec->segtotal & 0x7fff) << 16) | tmp; GST_DEBUG_OBJECT (oss, "set segsize: %d, segtotal: %d, value: %08x", spec->segsize, spec->segtotal, tmp); SET_PARAM (oss, SNDCTL_DSP_SETFRAGMENT, tmp, "SETFRAGMENT"); GET_PARAM (oss, SNDCTL_DSP_GETOSPACE, &info, "GETOSPACE"); spec->segsize = info.fragsize; spec->segtotal = info.fragstotal; spec->bytes_per_sample = (spec->width / 8) * spec->channels; oss->bytes_per_sample = (spec->width / 8) * spec->channels; GST_DEBUG_OBJECT (oss, "got segsize: %d, segtotal: %d, value: %08x", spec->segsize, spec->segtotal, tmp); return TRUE; /* ERRORS */ non_block: { GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), ("Unable to set device %s in non blocking mode: %s", oss->device, g_strerror (errno))); return FALSE; } wrong_format: { GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), ("Unable to get format %d", spec->format)); return FALSE; } dodgy_width: { GST_ELEMENT_ERROR (oss, RESOURCE, SETTINGS, (NULL), ("unexpected width %d", spec->width)); return FALSE; } } static gboolean gst_oss_sink_unprepare (GstAudioSink * asink) { /* could do a SNDCTL_DSP_RESET, but the OSS manual recommends a close/open */ if (!gst_oss_sink_close (asink)) goto couldnt_close; if (!gst_oss_sink_open (asink)) goto couldnt_reopen; return TRUE; /* ERRORS */ couldnt_close: { GST_DEBUG_OBJECT (asink, "Could not close the audio device"); return FALSE; } couldnt_reopen: { GST_DEBUG_OBJECT (asink, "Could not reopen the audio device"); return FALSE; } } static guint gst_oss_sink_write (GstAudioSink * asink, gpointer data, guint length) { return write (GST_OSSSINK (asink)->fd, data, length); } static guint gst_oss_sink_delay (GstAudioSink * asink) { GstOssSink *oss; gint delay = 0; gint ret; oss = GST_OSSSINK (asink); #ifdef SNDCTL_DSP_GETODELAY ret = ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay); #else ret = -1; #endif if (ret < 0) { audio_buf_info info; ret = ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &info); delay = (ret < 0 ? 0 : (info.fragstotal * info.fragsize) - info.bytes); } return delay / oss->bytes_per_sample; } static void gst_oss_sink_reset (GstAudioSink * asink) { /* There's nothing we can do here really: OSS can't handle access to the * same device/fd from multiple threads and might deadlock or blow up in * other ways if we try an ioctl SNDCTL_DSP_RESET or similar */ } gst-plugins-good-0.10.31/sys/oss/gstossaudio.c0000644000175000017500000000364211671175354016150 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include "gstossmixerelement.h" #include "gstosssink.h" #include "gstosssrc.h" GST_DEBUG_CATEGORY (oss_debug); #define GST_CAT_DEFAULT oss_debug static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "ossmixer", GST_RANK_NONE, GST_TYPE_OSS_MIXER_ELEMENT) || !gst_element_register (plugin, "osssrc", GST_RANK_SECONDARY, GST_TYPE_OSS_SRC) || !gst_element_register (plugin, "osssink", GST_RANK_SECONDARY, GST_TYPE_OSSSINK)) { return FALSE; } GST_DEBUG_CATEGORY_INIT (oss_debug, "oss", 0, "OSS elements"); #ifdef ENABLE_NLS GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "ossaudio", "OSS (Open Sound System) support for GStreamer", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/oss/gstossmixertrack.h0000644000175000017500000000406611671175354017226 00000000000000/* GStreamer OSS Mixer implementation * Copyright (C) 2003 Ronald Bultje * * gstossmixertrack.h: OSS mixer tracks * * 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_OSS_MIXER_TRACK_H__ #define __GST_OSS_MIXER_TRACK_H__ #include #include #include "gstosshelper.h" G_BEGIN_DECLS #define GST_TYPE_OSSMIXER_TRACK \ (gst_ossmixer_track_get_type ()) #define GST_OSSMIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OSSMIXER_TRACK, \ GstOssMixerTrack)) #define GST_OSSMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OSSMIXER_TRACK, \ GstOssMixerTrackClass)) #define GST_IS_OSSMIXER_TRACK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OSSMIXER_TRACK)) #define GST_IS_OSSMIXER_TRACK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OSSMIXER_TRACK)) typedef struct _GstOssMixerTrack { GstMixerTrack parent; gint lvol, rvol; gint track_num; } GstOssMixerTrack; typedef struct _GstOssMixerTrackClass { GstMixerTrackClass parent; } GstOssMixerTrackClass; GType gst_ossmixer_track_get_type (void); GstMixerTrack* gst_ossmixer_track_new (gint mixer_fd, gint track_num, gint max_chans, gint flags); G_END_DECLS #endif /* __GST_OSS_MIXER_TRACK_H__ */ gst-plugins-good-0.10.31/sys/oss/Makefile.in0000644000175000017500000010615111720560240015467 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/oss DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstossaudio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstossaudio_la_OBJECTS = libgstossaudio_la-gstossaudio.lo \ libgstossaudio_la-gstosshelper.lo \ libgstossaudio_la-gstossmixer.lo \ libgstossaudio_la-gstossmixerelement.lo \ libgstossaudio_la-gstossmixertrack.lo \ libgstossaudio_la-gstosssink.lo libgstossaudio_la-gstosssrc.lo libgstossaudio_la_OBJECTS = $(am_libgstossaudio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstossaudio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstossaudio_la_CFLAGS) $(CFLAGS) \ $(libgstossaudio_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstossaudio_la_SOURCES) DIST_SOURCES = $(libgstossaudio_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstossaudio.la libgstossaudio_la_SOURCES = gstossaudio.c \ gstosshelper.c \ gstossmixer.c \ gstossmixerelement.c \ gstossmixertrack.c \ gstosssink.c \ gstosssrc.c libgstossaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstossaudio_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstinterfaces-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstossaudio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = common.h \ gstosssink.h \ gstosssrc.h \ gstosshelper.h \ gstossdmabuffer.h \ gstossmixer.h \ gstossmixerelement.h \ gstossmixertrack.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/oss/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/oss/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstossaudio.la: $(libgstossaudio_la_OBJECTS) $(libgstossaudio_la_DEPENDENCIES) $(EXTRA_libgstossaudio_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstossaudio_la_LINK) -rpath $(plugindir) $(libgstossaudio_la_OBJECTS) $(libgstossaudio_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossaudio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstosshelper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossmixer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossmixerelement.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstossmixertrack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstosssink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstossaudio_la-gstosssrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstossaudio_la-gstossaudio.lo: gstossaudio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossaudio.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossaudio.Tpo -c -o libgstossaudio_la-gstossaudio.lo `test -f 'gstossaudio.c' || echo '$(srcdir)/'`gstossaudio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossaudio.Tpo $(DEPDIR)/libgstossaudio_la-gstossaudio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossaudio.c' object='libgstossaudio_la-gstossaudio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossaudio.lo `test -f 'gstossaudio.c' || echo '$(srcdir)/'`gstossaudio.c libgstossaudio_la-gstosshelper.lo: gstosshelper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstosshelper.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstosshelper.Tpo -c -o libgstossaudio_la-gstosshelper.lo `test -f 'gstosshelper.c' || echo '$(srcdir)/'`gstosshelper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstosshelper.Tpo $(DEPDIR)/libgstossaudio_la-gstosshelper.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosshelper.c' object='libgstossaudio_la-gstosshelper.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstosshelper.lo `test -f 'gstosshelper.c' || echo '$(srcdir)/'`gstosshelper.c libgstossaudio_la-gstossmixer.lo: gstossmixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossmixer.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossmixer.Tpo -c -o libgstossaudio_la-gstossmixer.lo `test -f 'gstossmixer.c' || echo '$(srcdir)/'`gstossmixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossmixer.Tpo $(DEPDIR)/libgstossaudio_la-gstossmixer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossmixer.c' object='libgstossaudio_la-gstossmixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossmixer.lo `test -f 'gstossmixer.c' || echo '$(srcdir)/'`gstossmixer.c libgstossaudio_la-gstossmixerelement.lo: gstossmixerelement.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossmixerelement.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossmixerelement.Tpo -c -o libgstossaudio_la-gstossmixerelement.lo `test -f 'gstossmixerelement.c' || echo '$(srcdir)/'`gstossmixerelement.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossmixerelement.Tpo $(DEPDIR)/libgstossaudio_la-gstossmixerelement.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossmixerelement.c' object='libgstossaudio_la-gstossmixerelement.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossmixerelement.lo `test -f 'gstossmixerelement.c' || echo '$(srcdir)/'`gstossmixerelement.c libgstossaudio_la-gstossmixertrack.lo: gstossmixertrack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstossmixertrack.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstossmixertrack.Tpo -c -o libgstossaudio_la-gstossmixertrack.lo `test -f 'gstossmixertrack.c' || echo '$(srcdir)/'`gstossmixertrack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstossmixertrack.Tpo $(DEPDIR)/libgstossaudio_la-gstossmixertrack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstossmixertrack.c' object='libgstossaudio_la-gstossmixertrack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstossmixertrack.lo `test -f 'gstossmixertrack.c' || echo '$(srcdir)/'`gstossmixertrack.c libgstossaudio_la-gstosssink.lo: gstosssink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstosssink.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstosssink.Tpo -c -o libgstossaudio_la-gstosssink.lo `test -f 'gstosssink.c' || echo '$(srcdir)/'`gstosssink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstosssink.Tpo $(DEPDIR)/libgstossaudio_la-gstosssink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosssink.c' object='libgstossaudio_la-gstosssink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstosssink.lo `test -f 'gstosssink.c' || echo '$(srcdir)/'`gstosssink.c libgstossaudio_la-gstosssrc.lo: gstosssrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -MT libgstossaudio_la-gstosssrc.lo -MD -MP -MF $(DEPDIR)/libgstossaudio_la-gstosssrc.Tpo -c -o libgstossaudio_la-gstosssrc.lo `test -f 'gstosssrc.c' || echo '$(srcdir)/'`gstosssrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstossaudio_la-gstosssrc.Tpo $(DEPDIR)/libgstossaudio_la-gstosssrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosssrc.c' object='libgstossaudio_la-gstosssrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstossaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstossaudio_la_CFLAGS) $(CFLAGS) -c -o libgstossaudio_la-gstosssrc.lo `test -f 'gstosssrc.c' || echo '$(srcdir)/'`gstosssrc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/oss/gstossdmabuffer.h0000644000175000017500000000515011671175354017003 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2005 Wim Taymans * * gstossdmabuffer.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_OSSDMABUFFER_H__ #define __GST_OSSDMABUFFER_H__ #include #include "gstosshelper.h" #include G_BEGIN_DECLS #define GST_TYPE_OSSDMABUFFER (gst_ossdmabuffer_get_type()) #define GST_OSSDMABUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSSDMABUFFER,GstOssDMABuffer)) #define GST_OSSDMABUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSSDMABUFFER,GstOssDMABufferClass)) #define GST_IS_OSSDMABUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSSDMABUFFER)) #define GST_IS_OSSDMABUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSSDMABUFFER)) #define GST_OSSELEMENT_GET(obj) GST_OSSELEMENT (obj->element) typedef enum { GST_OSSDMABUFFER_OPEN = (1 << 0), } GstOssDMABufferFlags; typedef struct _GstOssDMABuffer GstOssDMABuffer; typedef struct _GstOssDMABufferClass GstOssDMABufferClass; #define GST_OSSDMABUFFER_THREAD(buf) (GST_OSSDMABUFFER(buf)->thread) #define GST_OSSDMABUFFER_LOCK GST_OBJECT_LOCK #define GST_OSSDMABUFFER_UNLOCK GST_OBJECT_UNLOCK #define GST_OSSDMABUFFER_COND(buf) (GST_OSSDMABUFFER(buf)->cond) #define GST_OSSDMABUFFER_SIGNAL(buf) (g_cond_signal (GST_OSSDMABUFFER_COND (buf))) #define GST_OSSDMABUFFER_WAIT(buf) (g_cond_wait (GST_OSSDMABUFFER_COND (buf), GST_OBJECT_GET_LOCK (buf))) struct _GstOssDMABuffer { GstRingBuffer buffer; GstOssElement *element; int fd; int caps; int frag; GThread *thread; GCond *cond; gboolean running; }; struct _GstOssDMABufferClass { GstRingBufferClass parent_class; }; GType gst_ossdmabuffer_get_type(void); G_END_DECLS #endif /* __GST_OSSDMABUFFER_H__ */ gst-plugins-good-0.10.31/sys/oss/gstossmixer.c0000644000175000017500000002354511671175354016177 00000000000000/* GStreamer OSS Mixer implementation * Copyright (C) 2003 Ronald Bultje * * gstossmixer.c: mixer interface implementation for OSS * * 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 #include #include #include #include #include #include #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else # ifdef HAVE_OSS_INCLUDE_IN_ROOT # include # else # ifdef HAVE_OSS_INCLUDE_IN_MACHINE # include # else # error "What to include?" # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ #include #include "gstossmixer.h" #include "gstossmixertrack.h" GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug #define MASK_BIT_IS_SET(mask, bit) \ (mask & (1 << bit)) static gboolean gst_ossmixer_open (GstOssMixer * mixer) { #ifdef SOUND_MIXER_INFO struct mixer_info minfo; #endif g_return_val_if_fail (mixer->mixer_fd == -1, FALSE); mixer->mixer_fd = open (mixer->device, O_RDWR); if (mixer->mixer_fd == -1) goto open_failed; /* get masks */ if (ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECMASK, &mixer->recmask) < 0 || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_RECSRC, &mixer->recdevs) < 0 || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_STEREODEVS, &mixer->stereomask) < 0 || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_DEVMASK, &mixer->devmask) < 0 || ioctl (mixer->mixer_fd, SOUND_MIXER_READ_CAPS, &mixer->mixcaps) < 0) goto masks_failed; /* get name, not fatal */ g_free (mixer->cardname); #ifdef SOUND_MIXER_INFO if (ioctl (mixer->mixer_fd, SOUND_MIXER_INFO, &minfo) == 0) { mixer->cardname = g_strdup (minfo.name); GST_INFO ("Card name = %s", GST_STR_NULL (mixer->cardname)); } else #endif { mixer->cardname = g_strdup ("Unknown"); GST_INFO ("Unknown card name"); } GST_INFO ("Opened mixer for device %s", mixer->device); return TRUE; /* ERRORS */ open_failed: { /* this is valid. OSS devices don't need to expose a mixer */ GST_DEBUG ("Failed to open mixer device %s, mixing disabled: %s", mixer->device, strerror (errno)); return FALSE; } masks_failed: { GST_DEBUG ("Failed to get device masks"); close (mixer->mixer_fd); mixer->mixer_fd = -1; return FALSE; } } static void gst_ossmixer_ensure_track_list (GstOssMixer * mixer) { gint i, master = -1; g_return_if_fail (mixer->mixer_fd != -1); if (mixer->tracklist) return; /* find master volume */ if (mixer->devmask & SOUND_MASK_VOLUME) master = SOUND_MIXER_VOLUME; else if (mixer->devmask & SOUND_MASK_PCM) master = SOUND_MIXER_PCM; else if (mixer->devmask & SOUND_MASK_SPEAKER) master = SOUND_MIXER_SPEAKER; /* doubtful... */ /* else: no master, so we won't set any */ /* build track list */ for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { if (mixer->devmask & (1 << i)) { GstMixerTrack *track; gboolean input = FALSE, stereo = FALSE, record = FALSE; /* track exists, make up capabilities */ if (MASK_BIT_IS_SET (mixer->stereomask, i)) stereo = TRUE; if (MASK_BIT_IS_SET (mixer->recmask, i)) input = TRUE; if (MASK_BIT_IS_SET (mixer->recdevs, i)) record = TRUE; /* do we want this in our list? */ if (!((mixer->dir & GST_OSS_MIXER_CAPTURE && input == TRUE) || (mixer->dir & GST_OSS_MIXER_PLAYBACK && i != SOUND_MIXER_PCM))) /* the PLAYBACK case seems hacky, but that's how 0.8 had it */ continue; /* add track to list */ track = gst_ossmixer_track_new (mixer->mixer_fd, i, stereo ? 2 : 1, (record ? GST_MIXER_TRACK_RECORD : 0) | (input ? GST_MIXER_TRACK_INPUT : GST_MIXER_TRACK_OUTPUT) | ((master != i) ? 0 : GST_MIXER_TRACK_MASTER)); mixer->tracklist = g_list_append (mixer->tracklist, track); } } } GstOssMixer * gst_ossmixer_new (const char *device, GstOssMixerDirection dir) { GstOssMixer *ret = NULL; g_return_val_if_fail (device != NULL, NULL); ret = g_new0 (GstOssMixer, 1); ret->device = g_strdup (device); ret->dir = dir; ret->mixer_fd = -1; if (!gst_ossmixer_open (ret)) goto error; return ret; /* ERRORS */ error: { gst_ossmixer_free (ret); return NULL; } } void gst_ossmixer_free (GstOssMixer * mixer) { g_return_if_fail (mixer != NULL); if (mixer->device) { g_free (mixer->device); mixer->device = NULL; } if (mixer->cardname) { g_free (mixer->cardname); mixer->cardname = NULL; } if (mixer->tracklist) { g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL); g_list_free (mixer->tracklist); mixer->tracklist = NULL; } if (mixer->mixer_fd != -1) { close (mixer->mixer_fd); mixer->mixer_fd = -1; } g_free (mixer); } /* unused with G_DISABLE_* */ static G_GNUC_UNUSED gboolean gst_ossmixer_contains_track (GstOssMixer * mixer, GstOssMixerTrack * osstrack) { const GList *item; for (item = mixer->tracklist; item != NULL; item = item->next) if (item->data == osstrack) return TRUE; return FALSE; } const GList * gst_ossmixer_list_tracks (GstOssMixer * mixer) { gst_ossmixer_ensure_track_list (mixer); return (const GList *) mixer->tracklist; } void gst_ossmixer_get_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes) { gint volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); g_return_if_fail (mixer->mixer_fd != -1); g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); if (track->flags & GST_MIXER_TRACK_MUTE) { volumes[0] = osstrack->lvol; if (track->num_channels == 2) { volumes[1] = osstrack->rvol; } } else { /* get */ if (ioctl (mixer->mixer_fd, MIXER_READ (osstrack->track_num), &volume) < 0) { g_warning ("Error getting recording device (%d) volume: %s", osstrack->track_num, strerror (errno)); volume = 0; } osstrack->lvol = volumes[0] = (volume & 0xff); if (track->num_channels == 2) { osstrack->rvol = volumes[1] = ((volume >> 8) & 0xff); } } } void gst_ossmixer_set_volume (GstOssMixer * mixer, GstMixerTrack * track, gint * volumes) { gint volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); g_return_if_fail (mixer->mixer_fd != -1); g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); /* prepare the value for ioctl() */ if (!(track->flags & GST_MIXER_TRACK_MUTE)) { volume = (volumes[0] & 0xff); if (track->num_channels == 2) { volume |= ((volumes[1] & 0xff) << 8); } /* set */ if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting recording device (%d) volume (0x%x): %s", osstrack->track_num, volume, strerror (errno)); return; } } osstrack->lvol = volumes[0]; if (track->num_channels == 2) { osstrack->rvol = volumes[1]; } } void gst_ossmixer_set_mute (GstOssMixer * mixer, GstMixerTrack * track, gboolean mute) { int volume; GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); g_return_if_fail (mixer->mixer_fd != -1); g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); if (mute) { volume = 0; } else { volume = (osstrack->lvol & 0xff); if (MASK_BIT_IS_SET (mixer->stereomask, osstrack->track_num)) { volume |= ((osstrack->rvol & 0xff) << 8); } } if (ioctl (mixer->mixer_fd, MIXER_WRITE (osstrack->track_num), &volume) < 0) { g_warning ("Error setting mixer recording device volume (0x%x): %s", volume, strerror (errno)); return; } if (mute) { track->flags |= GST_MIXER_TRACK_MUTE; } else { track->flags &= ~GST_MIXER_TRACK_MUTE; } } void gst_ossmixer_set_record (GstOssMixer * mixer, GstMixerTrack * track, gboolean record) { GstOssMixerTrack *osstrack = GST_OSSMIXER_TRACK (track); g_return_if_fail (mixer->mixer_fd != -1); g_return_if_fail (gst_ossmixer_contains_track (mixer, osstrack)); /* if there's nothing to do... */ if ((record && GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD)) || (!record && !GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD))) return; /* if we're exclusive, then we need to unset the current one(s) */ if (mixer->mixcaps & SOUND_CAP_EXCL_INPUT) { GList *track; for (track = mixer->tracklist; track != NULL; track = track->next) { GstMixerTrack *turn = (GstMixerTrack *) track->data; turn->flags &= ~GST_MIXER_TRACK_RECORD; } mixer->recdevs = 0; } /* set new record bit, if needed */ if (record) { mixer->recdevs |= (1 << osstrack->track_num); } else { mixer->recdevs &= ~(1 << osstrack->track_num); } /* set it to the device */ if (ioctl (mixer->mixer_fd, SOUND_MIXER_WRITE_RECSRC, &mixer->recdevs) < 0) { g_warning ("Error setting mixer recording devices (0x%x): %s", mixer->recdevs, strerror (errno)); return; } if (record) { track->flags |= GST_MIXER_TRACK_RECORD; } else { track->flags &= ~GST_MIXER_TRACK_RECORD; } } gst-plugins-good-0.10.31/sys/oss/gstosssrc.c0000644000175000017500000003304111677341660015633 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000,2005 Wim Taymans * * gstosssrc.c: * * 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-osssrc * * This element lets you record sound using the Open Sound System (OSS). * * * Example pipelines * |[ * gst-launch -v osssrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=mymusic.ogg * ]| will record sound from your sound card using OSS and encode it to an * Ogg/Vorbis file (this will only work if your mixer settings are right * and the right inputs enabled etc.) * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #ifdef HAVE_OSS_INCLUDE_IN_SYS # include #else # ifdef HAVE_OSS_INCLUDE_IN_ROOT # include # else # ifdef HAVE_OSS_INCLUDE_IN_MACHINE # include # else # error "What to include?" # endif /* HAVE_OSS_INCLUDE_IN_MACHINE */ # endif /* HAVE_OSS_INCLUDE_IN_ROOT */ #endif /* HAVE_OSS_INCLUDE_IN_SYS */ #include "gstosssrc.h" #include "common.h" #include GST_DEBUG_CATEGORY_EXTERN (oss_debug); #define GST_CAT_DEFAULT oss_debug #define DEFAULT_DEVICE "/dev/dsp" #define DEFAULT_DEVICE_NAME "" enum { PROP_0, PROP_DEVICE, PROP_DEVICE_NAME, }; GST_BOILERPLATE_WITH_INTERFACE (GstOssSrc, gst_oss_src, GstAudioSrc, GST_TYPE_AUDIO_SRC, GstMixer, GST_TYPE_MIXER, gst_oss_src_mixer); GST_IMPLEMENT_OSS_MIXER_METHODS (GstOssSrc, gst_oss_src_mixer); static void gst_oss_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_oss_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_oss_src_dispose (GObject * object); static void gst_oss_src_finalize (GstOssSrc * osssrc); static GstCaps *gst_oss_src_getcaps (GstBaseSrc * bsrc); static gboolean gst_oss_src_open (GstAudioSrc * asrc); static gboolean gst_oss_src_close (GstAudioSrc * asrc); static gboolean gst_oss_src_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec); static gboolean gst_oss_src_unprepare (GstAudioSrc * asrc); static guint gst_oss_src_read (GstAudioSrc * asrc, gpointer data, guint length); static guint gst_oss_src_delay (GstAudioSrc * asrc); static void gst_oss_src_reset (GstAudioSrc * asrc); static GstStaticPadTemplate osssrc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) { " G_STRINGIFY (G_BYTE_ORDER) " }, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " "audio/x-raw-int, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") ); static void gst_oss_src_dispose (GObject * object) { G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_oss_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Audio Source (OSS)", "Source/Audio", "Capture from a sound card via OSS", "Erik Walthinsen , " "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &osssrc_src_factory); } static void gst_oss_src_class_init (GstOssSrcClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; GstAudioSrcClass *gstaudiosrc_class; gobject_class = (GObjectClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstaudiosrc_class = (GstAudioSrcClass *) klass; gobject_class->dispose = gst_oss_src_dispose; gobject_class->finalize = (GObjectFinalizeFunc) gst_oss_src_finalize; gobject_class->get_property = gst_oss_src_get_property; gobject_class->set_property = gst_oss_src_set_property; gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_oss_src_getcaps); gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_oss_src_open); gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_oss_src_prepare); gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_oss_src_unprepare); gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_oss_src_close); gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_oss_src_read); gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_oss_src_delay); gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_oss_src_reset); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "OSS device (usually /dev/dspN)", DEFAULT_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the sound device", DEFAULT_DEVICE_NAME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } static void gst_oss_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOssSrc *src; src = GST_OSS_SRC (object); switch (prop_id) { case PROP_DEVICE: if (src->device) g_free (src->device); src->device = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOssSrc *src; src = GST_OSS_SRC (object); switch (prop_id) { case PROP_DEVICE: g_value_set_string (value, src->device); break; case PROP_DEVICE_NAME: g_value_set_string (value, src->device_name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_oss_src_init (GstOssSrc * osssrc, GstOssSrcClass * g_class) { const gchar *device; GST_DEBUG ("initializing osssrc"); device = g_getenv ("AUDIODEV"); if (device == NULL) device = DEFAULT_DEVICE; osssrc->fd = -1; osssrc->device = g_strdup (device); osssrc->device_name = g_strdup (DEFAULT_DEVICE_NAME); osssrc->probed_caps = NULL; } static void gst_oss_src_finalize (GstOssSrc * osssrc) { g_free (osssrc->device); g_free (osssrc->device_name); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (osssrc)); } static GstCaps * gst_oss_src_getcaps (GstBaseSrc * bsrc) { GstOssSrc *osssrc; GstCaps *caps; osssrc = GST_OSS_SRC (bsrc); if (osssrc->fd == -1) { GST_DEBUG_OBJECT (osssrc, "device not open, using template caps"); return NULL; /* base class will get template caps for us */ } if (osssrc->probed_caps) { GST_LOG_OBJECT (osssrc, "Returning cached caps"); return gst_caps_ref (osssrc->probed_caps); } caps = gst_oss_helper_probe_caps (osssrc->fd); if (caps) { osssrc->probed_caps = gst_caps_ref (caps); } GST_INFO_OBJECT (osssrc, "returning caps %" GST_PTR_FORMAT, caps); return caps; } static gint ilog2 (gint x) { /* well... hacker's delight explains... */ x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >> 16); x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x = x + (x >> 8); x = x + (x >> 16); return (x & 0x0000003f) - 1; } static gint gst_oss_src_get_format (GstBufferFormat fmt) { gint result; switch (fmt) { case GST_MU_LAW: result = AFMT_MU_LAW; break; case GST_A_LAW: result = AFMT_A_LAW; break; case GST_IMA_ADPCM: result = AFMT_IMA_ADPCM; break; case GST_U8: result = AFMT_U8; break; case GST_S16_LE: result = AFMT_S16_LE; break; case GST_S16_BE: result = AFMT_S16_BE; break; case GST_S8: result = AFMT_S8; break; case GST_U16_LE: result = AFMT_U16_LE; break; case GST_U16_BE: result = AFMT_U16_BE; break; case GST_MPEG: result = AFMT_MPEG; break; default: result = 0; break; } return result; } static gboolean gst_oss_src_open (GstAudioSrc * asrc) { GstOssSrc *oss; int mode; oss = GST_OSS_SRC (asrc); mode = O_RDONLY; mode |= O_NONBLOCK; oss->fd = open (oss->device, mode, 0); if (oss->fd == -1) { switch (errno) { case EACCES: goto no_permission; default: goto open_failed; } } if (!oss->mixer) { oss->mixer = gst_ossmixer_new ("/dev/mixer", GST_OSS_MIXER_CAPTURE); if (oss->mixer) { g_free (oss->device_name); oss->device_name = g_strdup (oss->mixer->cardname); } } return TRUE; no_permission: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, (_("Could not open audio device for recording. " "You don't have permission to open the device.")), GST_ERROR_SYSTEM); return FALSE; } open_failed: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, (_("Could not open audio device for recording.")), ("Unable to open device %s for recording: %s", oss->device, g_strerror (errno))); return FALSE; } } static gboolean gst_oss_src_close (GstAudioSrc * asrc) { GstOssSrc *oss; oss = GST_OSS_SRC (asrc); close (oss->fd); if (oss->mixer) { gst_ossmixer_free (oss->mixer); oss->mixer = NULL; } gst_caps_replace (&oss->probed_caps, NULL); return TRUE; } static gboolean gst_oss_src_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) { GstOssSrc *oss; struct audio_buf_info info; int mode; int fmt, tmp; oss = GST_OSS_SRC (asrc); mode = fcntl (oss->fd, F_GETFL); mode &= ~O_NONBLOCK; if (fcntl (oss->fd, F_SETFL, mode) == -1) goto non_block; fmt = gst_oss_src_get_format (spec->format); if (fmt == 0) goto wrong_format; tmp = ilog2 (spec->segsize); tmp = ((spec->segtotal & 0x7fff) << 16) | tmp; GST_DEBUG_OBJECT (oss, "set segsize: %d, segtotal: %d, value: %08x", spec->segsize, spec->segtotal, tmp); SET_PARAM (oss, SNDCTL_DSP_SETFRAGMENT, tmp, "SETFRAGMENT"); SET_PARAM (oss, SNDCTL_DSP_RESET, 0, "RESET"); SET_PARAM (oss, SNDCTL_DSP_SETFMT, fmt, "SETFMT"); if (spec->channels == 2) SET_PARAM (oss, SNDCTL_DSP_STEREO, 1, "STEREO"); SET_PARAM (oss, SNDCTL_DSP_CHANNELS, spec->channels, "CHANNELS"); SET_PARAM (oss, SNDCTL_DSP_SPEED, spec->rate, "SPEED"); GET_PARAM (oss, SNDCTL_DSP_GETISPACE, &info, "GETISPACE"); spec->segsize = info.fragsize; spec->segtotal = info.fragstotal; if (spec->width != 16 && spec->width != 8) goto dodgy_width; spec->bytes_per_sample = (spec->width / 8) * spec->channels; oss->bytes_per_sample = (spec->width / 8) * spec->channels; memset (spec->silence_sample, 0, spec->bytes_per_sample); GST_DEBUG_OBJECT (oss, "got segsize: %d, segtotal: %d, value: %08x", spec->segsize, spec->segtotal, tmp); return TRUE; non_block: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, ("Unable to set device %s in non blocking mode: %s", oss->device, g_strerror (errno)), (NULL)); return FALSE; } wrong_format: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, ("Unable to get format %d", spec->format), (NULL)); return FALSE; } dodgy_width: { GST_ELEMENT_ERROR (oss, RESOURCE, OPEN_READ, ("Unexpected width %d", spec->width), (NULL)); return FALSE; } } static gboolean gst_oss_src_unprepare (GstAudioSrc * asrc) { /* could do a SNDCTL_DSP_RESET, but the OSS manual recommends a close/open */ if (!gst_oss_src_close (asrc)) goto couldnt_close; if (!gst_oss_src_open (asrc)) goto couldnt_reopen; return TRUE; couldnt_close: { GST_DEBUG_OBJECT (asrc, "Could not close the audio device"); return FALSE; } couldnt_reopen: { GST_DEBUG_OBJECT (asrc, "Could not reopen the audio device"); return FALSE; } } static guint gst_oss_src_read (GstAudioSrc * asrc, gpointer data, guint length) { return read (GST_OSS_SRC (asrc)->fd, data, length); } static guint gst_oss_src_delay (GstAudioSrc * asrc) { GstOssSrc *oss; gint delay = 0; gint ret; oss = GST_OSS_SRC (asrc); #ifdef SNDCTL_DSP_GETODELAY ret = ioctl (oss->fd, SNDCTL_DSP_GETODELAY, &delay); #else ret = -1; #endif if (ret < 0) { audio_buf_info info; ret = ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &info); delay = (ret < 0 ? 0 : (info.fragstotal * info.fragsize) - info.bytes); } return delay / oss->bytes_per_sample; } static void gst_oss_src_reset (GstAudioSrc * asrc) { /* There's nothing we can do here really: OSS can't handle access to the * same device/fd from multiple threads and might deadlock or blow up in * other ways if we try an ioctl SNDCTL_DSP_RESET or similar */ } gst-plugins-good-0.10.31/sys/directsound/0000755000175000017500000000000011720565317015227 500000000000000gst-plugins-good-0.10.31/sys/directsound/gstdirectsoundsink.h0000644000175000017500000000604411671175354021255 00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * Copyright (C) 2007 Pioneers of the Inevitable * Copyright (C) 2010 Fluendo S.A. * * gstdirectsoundsink.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. * * The development of this code was made possible due to the involvement * of Pioneers of the Inevitable, the creators of the Songbird Music player * * */ #ifndef __GST_DIRECTSOUNDSINK_H__ #define __GST_DIRECTSOUNDSINK_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_DIRECTSOUND_SINK (gst_directsound_sink_get_type()) #define GST_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSink)) #define GST_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSinkClass)) #define GST_IS_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTSOUND_SINK)) #define GST_IS_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTSOUND_SINK)) typedef struct _GstDirectSoundSink GstDirectSoundSink; typedef struct _GstDirectSoundSinkClass GstDirectSoundSinkClass; #define GST_DSOUND_LOCK(obj) (g_mutex_lock (obj->dsound_lock)) #define GST_DSOUND_UNLOCK(obj) (g_mutex_unlock (obj->dsound_lock)) struct _GstDirectSoundSink { GstAudioSink sink; /* directsound object interface pointer */ LPDIRECTSOUND pDS; /* directsound sound object interface pointer */ LPDIRECTSOUNDBUFFER pDSBSecondary; /* directSound buffer size */ guint buffer_size; /* offset of the circular buffer where we must write next */ guint current_circular_offset; guint bytes_per_sample; /* current volume setup by mixer interface */ glong volume; /* tracks list of our mixer interface implementation */ GList *tracks; GstCaps *cached_caps; /* lock used to protect writes and resets */ GMutex *dsound_lock; gboolean first_buffer_after_reset; GstBufferFormat buffer_format; }; struct _GstDirectSoundSinkClass { GstAudioSinkClass parent_class; }; GType gst_directsound_sink_get_type (void); G_END_DECLS #endif /* __GST_DIRECTSOUNDSINK_H__ */ gst-plugins-good-0.10.31/sys/directsound/Makefile.am0000644000175000017500000000116311671175354017207 00000000000000plugin_LTLIBRARIES = libgstdirectsoundsink.la libgstdirectsoundsink_la_SOURCES = gstdirectsoundsink.c gstdirectsoundplugin.c libgstdirectsoundsink_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(DIRECTSOUND_CFLAGS) libgstdirectsoundsink_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(DIRECTSOUND_LIBS) libgstdirectsoundsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) libgstdirectsoundsink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstdirectsoundsink.h gst-plugins-good-0.10.31/sys/directsound/gstdirectsoundsink.c0000644000175000017500000006126511677341660021257 00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * Copyright (C) 2007 Pioneers of the Inevitable * Copyright (C) 2010 Fluendo S.A. * * gstdirectsoundsink.c: * * 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. * * * The development of this code was made possible due to the involvement * of Pioneers of the Inevitable, the creators of the Songbird Music player * */ /** * SECTION:element-directsoundsink * * This element lets you output sound using the DirectSound API. * * Note that you should almost always use generic audio conversion elements * like audioconvert and audioresample in front of an audiosink to make sure * your pipeline works under all circumstances (those conversion elements will * act in passthrough-mode if no conversion is necessary). * * * Example pipelines * |[ * gst-launch -v audiotestsrc ! audioconvert ! volume volume=0.1 ! directsoundsink * ]| will output a sine wave (continuous beep sound) to your sound card (with * a very low volume as precaution). * |[ * gst-launch -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! directsoundsink * ]| will play an Ogg/Vorbis audio file and output it. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstdirectsoundsink.h" #include #ifdef __CYGWIN__ #include #ifndef _swab #define _swab swab #endif #endif GST_DEBUG_CATEGORY_STATIC (directsoundsink_debug); #define GST_CAT_DEFAULT directsoundsink_debug static void gst_directsound_sink_finalise (GObject * object); static void gst_directsound_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_directsound_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_directsound_sink_getcaps (GstBaseSink * bsink); static gboolean gst_directsound_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); static gboolean gst_directsound_sink_unprepare (GstAudioSink * asink); static gboolean gst_directsound_sink_open (GstAudioSink * asink); static gboolean gst_directsound_sink_close (GstAudioSink * asink); static guint gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_directsound_sink_delay (GstAudioSink * asink); static void gst_directsound_sink_reset (GstAudioSink * asink); static GstCaps *gst_directsound_probe_supported_formats (GstDirectSoundSink * dsoundsink, const GstCaps * template_caps); /* interfaces */ static void gst_directsound_sink_interfaces_init (GType type); static void gst_directsound_sink_implements_interface_init (GstImplementsInterfaceClass * iface); static void gst_directsound_sink_mixer_interface_init (GstMixerClass * iface); static GstStaticPadTemplate directsoundsink_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " "audio/x-raw-int, " "signed = (boolean) FALSE, " "width = (int) 8, " "depth = (int) 8, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ];" "audio/x-iec958")); enum { PROP_0, PROP_VOLUME }; GST_BOILERPLATE_FULL (GstDirectSoundSink, gst_directsound_sink, GstAudioSink, GST_TYPE_AUDIO_SINK, gst_directsound_sink_interfaces_init); /* interfaces stuff */ static void gst_directsound_sink_interfaces_init (GType type) { static const GInterfaceInfo implements_interface_info = { (GInterfaceInitFunc) gst_directsound_sink_implements_interface_init, NULL, NULL, }; static const GInterfaceInfo mixer_interface_info = { (GInterfaceInitFunc) gst_directsound_sink_mixer_interface_init, NULL, NULL, }; g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, &implements_interface_info); g_type_add_interface_static (type, GST_TYPE_MIXER, &mixer_interface_info); } static gboolean gst_directsound_sink_interface_supported (GstImplementsInterface * iface, GType iface_type) { g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE); /* for the sake of this example, we'll always support it. However, normally, * you would check whether the device you've opened supports mixers. */ return TRUE; } static void gst_directsound_sink_implements_interface_init (GstImplementsInterfaceClass * iface) { iface->supported = gst_directsound_sink_interface_supported; } /* * This function returns the list of support tracks (inputs, outputs) * on this element instance. Elements usually build this list during * _init () or when going from NULL to READY. */ static const GList * gst_directsound_sink_mixer_list_tracks (GstMixer * mixer) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); return dsoundsink->tracks; } static void gst_directsound_sink_set_volume (GstDirectSoundSink * dsoundsink) { if (dsoundsink->pDSBSecondary) { /* DirectSound controls volume using units of 100th of a decibel, * ranging from -10000 to 0. We use a linear scale of 0 - 100 * here, so remap. */ long dsVolume; if (dsoundsink->volume == 0) dsVolume = -10000; else dsVolume = 100 * (long) (20 * log10 ((double) dsoundsink->volume / 100.)); dsVolume = CLAMP (dsVolume, -10000, 0); GST_DEBUG_OBJECT (dsoundsink, "Setting volume on secondary buffer to %d from %d", (int) dsVolume, (int) dsoundsink->volume); IDirectSoundBuffer_SetVolume (dsoundsink->pDSBSecondary, dsVolume); } } /* * Set volume. volumes is an array of size track->num_channels, and * each value in the array gives the wanted volume for one channel * on the track. */ static void gst_directsound_sink_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); if (volumes[0] != dsoundsink->volume) { dsoundsink->volume = volumes[0]; gst_directsound_sink_set_volume (dsoundsink); } } static void gst_directsound_sink_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (mixer); volumes[0] = dsoundsink->volume; } static void gst_directsound_sink_mixer_interface_init (GstMixerClass * iface) { /* the mixer interface requires a definition of the mixer type: * hardware or software? */ GST_MIXER_TYPE (iface) = GST_MIXER_SOFTWARE; /* virtual function pointers */ iface->list_tracks = gst_directsound_sink_mixer_list_tracks; iface->set_volume = gst_directsound_sink_mixer_set_volume; iface->get_volume = gst_directsound_sink_mixer_get_volume; } static void gst_directsound_sink_finalise (GObject * object) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (object); g_mutex_free (dsoundsink->dsound_lock); if (dsoundsink->tracks) { g_list_foreach (dsoundsink->tracks, (GFunc) g_object_unref, NULL); g_list_free (dsoundsink->tracks); dsoundsink->tracks = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_directsound_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Direct Sound Audio Sink", "Sink/Audio", "Output to a sound card via Direct Sound", "Sebastien Moutte "); gst_element_class_add_static_pad_template (element_class, &directsoundsink_sink_factory); } static void gst_directsound_sink_class_init (GstDirectSoundSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; GstBaseAudioSinkClass *gstbaseaudiosink_class; GstAudioSinkClass *gstaudiosink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; gstaudiosink_class = (GstAudioSinkClass *) klass; GST_DEBUG_CATEGORY_INIT (directsoundsink_debug, "directsoundsink", 0, "DirectSound sink"); parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_directsound_sink_finalise; gobject_class->set_property = gst_directsound_sink_set_property; gobject_class->get_property = gst_directsound_sink_get_property; gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_directsound_sink_getcaps); gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_directsound_sink_prepare); gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_directsound_sink_unprepare); gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_directsound_sink_open); gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_directsound_sink_close); gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_directsound_sink_write); gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_directsound_sink_delay); gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_directsound_sink_reset); g_object_class_install_property (gobject_class, PROP_VOLUME, g_param_spec_double ("volume", "Volume", "Volume of this stream", 0.0, 1.0, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_directsound_sink_init (GstDirectSoundSink * dsoundsink, GstDirectSoundSinkClass * g_class) { GstMixerTrack *track = NULL; dsoundsink->tracks = NULL; track = g_object_new (GST_TYPE_MIXER_TRACK, NULL); track->label = g_strdup ("DSoundTrack"); track->num_channels = 2; track->min_volume = 0; track->max_volume = 100; track->flags = GST_MIXER_TRACK_OUTPUT; dsoundsink->tracks = g_list_append (dsoundsink->tracks, track); dsoundsink->pDS = NULL; dsoundsink->cached_caps = NULL; dsoundsink->pDSBSecondary = NULL; dsoundsink->current_circular_offset = 0; dsoundsink->buffer_size = DSBSIZE_MIN; dsoundsink->volume = 100; dsoundsink->dsound_lock = g_mutex_new (); dsoundsink->first_buffer_after_reset = FALSE; } static void gst_directsound_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDirectSoundSink *sink = GST_DIRECTSOUND_SINK (object); switch (prop_id) { case PROP_VOLUME: sink->volume = (int) (g_value_get_double (value) * 100); gst_directsound_sink_set_volume (sink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_directsound_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDirectSoundSink *sink = GST_DIRECTSOUND_SINK (object); switch (prop_id) { case PROP_VOLUME: g_value_set_double (value, (double) sink->volume / 100.); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_directsound_sink_getcaps (GstBaseSink * bsink) { GstElementClass *element_class; GstPadTemplate *pad_template; GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (bsink); GstCaps *caps; gchar *caps_string = NULL; if (dsoundsink->pDS == NULL) { GST_DEBUG_OBJECT (dsoundsink, "device not open, using template caps"); return NULL; /* base class will get template caps for us */ } if (dsoundsink->cached_caps) { caps_string = gst_caps_to_string (dsoundsink->cached_caps); GST_DEBUG_OBJECT (dsoundsink, "Returning cached caps: %s", caps_string); g_free (caps_string); return gst_caps_ref (dsoundsink->cached_caps); } element_class = GST_ELEMENT_GET_CLASS (dsoundsink); pad_template = gst_element_class_get_pad_template (element_class, "sink"); g_return_val_if_fail (pad_template != NULL, NULL); caps = gst_directsound_probe_supported_formats (dsoundsink, gst_pad_template_get_caps (pad_template)); if (caps) { dsoundsink->cached_caps = gst_caps_ref (caps); } if (caps) { gchar *caps_string = gst_caps_to_string (caps); GST_DEBUG_OBJECT (dsoundsink, "returning caps %s", caps_string); g_free (caps_string); } return caps; } static gboolean gst_directsound_sink_open (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); HRESULT hRes; /* create and initialize a DirecSound object */ if (FAILED (hRes = DirectSoundCreate (NULL, &dsoundsink->pDS, NULL))) { GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, ("gst_directsound_sink_open: DirectSoundCreate: %s", DXGetErrorString9 (hRes)), (NULL)); return FALSE; } if (FAILED (hRes = IDirectSound_SetCooperativeLevel (dsoundsink->pDS, GetDesktopWindow (), DSSCL_PRIORITY))) { GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, ("gst_directsound_sink_open: IDirectSound_SetCooperativeLevel: %s", DXGetErrorString9 (hRes)), (NULL)); return FALSE; } return TRUE; } static gboolean gst_directsound_sink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); HRESULT hRes; DSBUFFERDESC descSecondary; WAVEFORMATEX wfx; /*save number of bytes per sample and buffer format */ dsoundsink->bytes_per_sample = spec->bytes_per_sample; dsoundsink->buffer_format = spec->format; /* fill the WAVEFORMATEX structure with spec params */ memset (&wfx, 0, sizeof (wfx)); if (spec->format != GST_IEC958) { wfx.cbSize = sizeof (wfx); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = spec->channels; wfx.nSamplesPerSec = spec->rate; wfx.wBitsPerSample = (spec->bytes_per_sample * 8) / wfx.nChannels; wfx.nBlockAlign = spec->bytes_per_sample; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; /* Create directsound buffer with size based on our configured * buffer_size (which is 200 ms by default) */ dsoundsink->buffer_size = gst_util_uint64_scale_int (wfx.nAvgBytesPerSec, spec->buffer_time, GST_MSECOND); /* Make sure we make those numbers multiple of our sample size in bytes */ dsoundsink->buffer_size += dsoundsink->buffer_size % spec->bytes_per_sample; spec->segsize = gst_util_uint64_scale_int (wfx.nAvgBytesPerSec, spec->latency_time, GST_MSECOND); spec->segsize += spec->segsize % spec->bytes_per_sample; spec->segtotal = dsoundsink->buffer_size / spec->segsize; } else { #ifdef WAVE_FORMAT_DOLBY_AC3_SPDIF wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; wfx.nChannels = 2; wfx.nSamplesPerSec = spec->rate; wfx.wBitsPerSample = 16; wfx.nBlockAlign = wfx.wBitsPerSample / 8 * wfx.nChannels; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; spec->segsize = 6144; spec->segtotal = 10; #else g_assert_not_reached (); #endif } // Make the final buffer size be an integer number of segments dsoundsink->buffer_size = spec->segsize * spec->segtotal; GST_INFO_OBJECT (dsoundsink, "GstRingBufferSpec->channels: %d, GstRingBufferSpec->rate: %d, GstRingBufferSpec->bytes_per_sample: %d\n" "WAVEFORMATEX.nSamplesPerSec: %ld, WAVEFORMATEX.wBitsPerSample: %d, WAVEFORMATEX.nBlockAlign: %d, WAVEFORMATEX.nAvgBytesPerSec: %ld\n" "Size of dsound circular buffer=>%d\n", spec->channels, spec->rate, spec->bytes_per_sample, wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nBlockAlign, wfx.nAvgBytesPerSec, dsoundsink->buffer_size); /* create a secondary directsound buffer */ memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); descSecondary.dwSize = sizeof (DSBUFFERDESC); descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; if (spec->format != GST_IEC958) descSecondary.dwFlags |= DSBCAPS_CTRLVOLUME; descSecondary.dwBufferBytes = dsoundsink->buffer_size; descSecondary.lpwfxFormat = (WAVEFORMATEX *) & wfx; hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, &dsoundsink->pDSBSecondary, NULL); if (FAILED (hRes)) { GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, ("gst_directsound_sink_prepare: IDirectSound_CreateSoundBuffer: %s", DXGetErrorString9 (hRes)), (NULL)); return FALSE; } gst_directsound_sink_set_volume (dsoundsink); return TRUE; } static gboolean gst_directsound_sink_unprepare (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* release secondary DirectSound buffer */ if (dsoundsink->pDSBSecondary) { IDirectSoundBuffer_Release (dsoundsink->pDSBSecondary); dsoundsink->pDSBSecondary = NULL; } return TRUE; } static gboolean gst_directsound_sink_close (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink = NULL; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* release DirectSound object */ g_return_val_if_fail (dsoundsink->pDS != NULL, FALSE); IDirectSound_Release (dsoundsink->pDS); dsoundsink->pDS = NULL; gst_caps_replace (&dsoundsink->cached_caps, NULL); return TRUE; } static guint gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length) { GstDirectSoundSink *dsoundsink; DWORD dwStatus; HRESULT hRes; LPVOID pLockedBuffer1 = NULL, pLockedBuffer2 = NULL; DWORD dwSizeBuffer1, dwSizeBuffer2; DWORD dwCurrentPlayCursor; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* Fix endianness */ if (dsoundsink->buffer_format == GST_IEC958) _swab (data, data, length); GST_DSOUND_LOCK (dsoundsink); /* get current buffer status */ hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); /* get current play cursor position */ hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL); if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) { DWORD dwFreeBufferSize; calculate_freesize: /* calculate the free size of the circular buffer */ if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) dwFreeBufferSize = dsoundsink->buffer_size - (dsoundsink->current_circular_offset - dwCurrentPlayCursor); else dwFreeBufferSize = dwCurrentPlayCursor - dsoundsink->current_circular_offset; if (length >= dwFreeBufferSize) { Sleep (100); hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL); hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) goto calculate_freesize; else { dsoundsink->first_buffer_after_reset = FALSE; GST_DSOUND_UNLOCK (dsoundsink); return 0; } } } if (dwStatus & DSBSTATUS_BUFFERLOST) { hRes = IDirectSoundBuffer_Restore (dsoundsink->pDSBSecondary); /*need a loop waiting the buffer is restored?? */ dsoundsink->current_circular_offset = 0; } hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, dsoundsink->current_circular_offset, length, &pLockedBuffer1, &dwSizeBuffer1, &pLockedBuffer2, &dwSizeBuffer2, 0L); if (SUCCEEDED (hRes)) { // Write to pointers without reordering. memcpy (pLockedBuffer1, data, dwSizeBuffer1); if (pLockedBuffer2 != NULL) memcpy (pLockedBuffer2, (LPBYTE) data + dwSizeBuffer1, dwSizeBuffer2); // Update where the buffer will lock (for next time) dsoundsink->current_circular_offset += dwSizeBuffer1 + dwSizeBuffer2; dsoundsink->current_circular_offset %= dsoundsink->buffer_size; /* Circular buffer */ hRes = IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer1, dwSizeBuffer1, pLockedBuffer2, dwSizeBuffer2); } /* if the buffer was not in playing state yet, call play on the buffer except if this buffer is the fist after a reset (base class call reset and write a buffer when setting the sink to pause) */ if (!(dwStatus & DSBSTATUS_PLAYING) && dsoundsink->first_buffer_after_reset == FALSE) { hRes = IDirectSoundBuffer_Play (dsoundsink->pDSBSecondary, 0, 0, DSBPLAY_LOOPING); } dsoundsink->first_buffer_after_reset = FALSE; GST_DSOUND_UNLOCK (dsoundsink); return length; } static guint gst_directsound_sink_delay (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink; HRESULT hRes; DWORD dwCurrentPlayCursor; DWORD dwBytesInQueue = 0; gint nNbSamplesInQueue = 0; DWORD dwStatus; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* get current buffer status */ hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); if (dwStatus & DSBSTATUS_PLAYING) { /*evaluate the number of samples in queue in the circular buffer */ hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL); if (hRes == S_OK) { if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) dwBytesInQueue = dsoundsink->current_circular_offset - dwCurrentPlayCursor; else dwBytesInQueue = dsoundsink->current_circular_offset + (dsoundsink->buffer_size - dwCurrentPlayCursor); nNbSamplesInQueue = dwBytesInQueue / dsoundsink->bytes_per_sample; } } return nNbSamplesInQueue; } static void gst_directsound_sink_reset (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink; LPVOID pLockedBuffer = NULL; DWORD dwSizeBuffer = 0; dsoundsink = GST_DIRECTSOUND_SINK (asink); GST_DSOUND_LOCK (dsoundsink); if (dsoundsink->pDSBSecondary) { /*stop playing */ HRESULT hRes = IDirectSoundBuffer_Stop (dsoundsink->pDSBSecondary); /*reset position */ hRes = IDirectSoundBuffer_SetCurrentPosition (dsoundsink->pDSBSecondary, 0); dsoundsink->current_circular_offset = 0; /*reset the buffer */ hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, dsoundsink->current_circular_offset, dsoundsink->buffer_size, &pLockedBuffer, &dwSizeBuffer, NULL, NULL, 0L); if (SUCCEEDED (hRes)) { memset (pLockedBuffer, 0, dwSizeBuffer); hRes = IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer, dwSizeBuffer, NULL, 0); } } dsoundsink->first_buffer_after_reset = TRUE; GST_DSOUND_UNLOCK (dsoundsink); } /* * gst_directsound_probe_supported_formats: * * Takes the template caps and returns the subset which is actually * supported by this device. * */ static GstCaps * gst_directsound_probe_supported_formats (GstDirectSoundSink * dsoundsink, const GstCaps * template_caps) { HRESULT hRes; DSBUFFERDESC descSecondary; WAVEFORMATEX wfx; GstCaps *caps; caps = gst_caps_copy (template_caps); /* * Check availability of digital output by trying to create an SPDIF buffer */ #ifdef WAVE_FORMAT_DOLBY_AC3_SPDIF /* fill the WAVEFORMATEX structure with some standard AC3 over SPDIF params */ memset (&wfx, 0, sizeof (wfx)); wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; wfx.nChannels = 2; wfx.nSamplesPerSec = 48000; wfx.wBitsPerSample = 16; wfx.nBlockAlign = 4; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; // create a secondary directsound buffer memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); descSecondary.dwSize = sizeof (DSBUFFERDESC); descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; descSecondary.dwBufferBytes = 6144; descSecondary.lpwfxFormat = &wfx; hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, &dsoundsink->pDSBSecondary, NULL); if (FAILED (hRes)) { GST_INFO_OBJECT (dsoundsink, "AC3 passthrough not supported " "(IDirectSound_CreateSoundBuffer returned: %s)\n", DXGetErrorString9 (hRes)); caps = gst_caps_subtract (caps, gst_caps_new_simple ("audio/x-iec958", NULL)); } else { GST_INFO_OBJECT (dsoundsink, "AC3 passthrough supported"); hRes = IDirectSoundBuffer_Release (dsoundsink->pDSBSecondary); if (FAILED (hRes)) { GST_DEBUG_OBJECT (dsoundsink, "(IDirectSoundBuffer_Release returned: %s)\n", DXGetErrorString9 (hRes)); } } #else caps = gst_caps_subtract (caps, gst_caps_new_simple ("audio/x-iec958", NULL)); #endif return caps; } gst-plugins-good-0.10.31/sys/directsound/Makefile.in0000644000175000017500000007170111720560240017210 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/directsound DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstdirectsoundsink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstdirectsoundsink_la_OBJECTS = \ libgstdirectsoundsink_la-gstdirectsoundsink.lo \ libgstdirectsoundsink_la-gstdirectsoundplugin.lo libgstdirectsoundsink_la_OBJECTS = \ $(am_libgstdirectsoundsink_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstdirectsoundsink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstdirectsoundsink_la_CFLAGS) \ $(CFLAGS) $(libgstdirectsoundsink_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstdirectsoundsink_la_SOURCES) DIST_SOURCES = $(libgstdirectsoundsink_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstdirectsoundsink.la libgstdirectsoundsink_la_SOURCES = gstdirectsoundsink.c gstdirectsoundplugin.c libgstdirectsoundsink_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(DIRECTSOUND_CFLAGS) libgstdirectsoundsink_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(DIRECTSOUND_LIBS) libgstdirectsoundsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTSOUND_LDFLAGS) libgstdirectsoundsink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstdirectsoundsink.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/directsound/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/directsound/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstdirectsoundsink.la: $(libgstdirectsoundsink_la_OBJECTS) $(libgstdirectsoundsink_la_DEPENDENCIES) $(EXTRA_libgstdirectsoundsink_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstdirectsoundsink_la_LINK) -rpath $(plugindir) $(libgstdirectsoundsink_la_OBJECTS) $(libgstdirectsoundsink_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstdirectsoundsink_la-gstdirectsoundsink.lo: gstdirectsoundsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -MT libgstdirectsoundsink_la-gstdirectsoundsink.lo -MD -MP -MF $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Tpo -c -o libgstdirectsoundsink_la-gstdirectsoundsink.lo `test -f 'gstdirectsoundsink.c' || echo '$(srcdir)/'`gstdirectsoundsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Tpo $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdirectsoundsink.c' object='libgstdirectsoundsink_la-gstdirectsoundsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -c -o libgstdirectsoundsink_la-gstdirectsoundsink.lo `test -f 'gstdirectsoundsink.c' || echo '$(srcdir)/'`gstdirectsoundsink.c libgstdirectsoundsink_la-gstdirectsoundplugin.lo: gstdirectsoundplugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -MT libgstdirectsoundsink_la-gstdirectsoundplugin.lo -MD -MP -MF $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Tpo -c -o libgstdirectsoundsink_la-gstdirectsoundplugin.lo `test -f 'gstdirectsoundplugin.c' || echo '$(srcdir)/'`gstdirectsoundplugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Tpo $(DEPDIR)/libgstdirectsoundsink_la-gstdirectsoundplugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdirectsoundplugin.c' object='libgstdirectsoundsink_la-gstdirectsoundplugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdirectsoundsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdirectsoundsink_la_CFLAGS) $(CFLAGS) -c -o libgstdirectsoundsink_la-gstdirectsoundplugin.lo `test -f 'gstdirectsoundplugin.c' || echo '$(srcdir)/'`gstdirectsoundplugin.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/directsound/gstdirectsoundplugin.c0000644000175000017500000000277711671175354021613 00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * Copyright (C) 2007 Pioneers of the Inevitable * * gstdirectsoundplugin.c: * * 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. * * * The development of this code was made possible due to the involvement * of Pioneers of the Inevitable, the creators of the Songbird Music player * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstdirectsoundsink.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "directsoundsink", GST_RANK_PRIMARY, GST_TYPE_DIRECTSOUND_SINK)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "directsound", "Direct Sound plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/osxvideo/0000755000175000017500000000000011720565320014536 500000000000000gst-plugins-good-0.10.31/sys/osxvideo/osxvideosink.h0000644000175000017500000000500511671175354017365 00000000000000/* GStreamer * Copyright (C) 2004-6 Zaheer Abbas Merali * Copyright (C) 2007 Pioneers of the Inevitable * * * 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. * * * The development of this code was made possible due to the involvement of Pioneers * of the Inevitable, the creators of the Songbird Music player * */ #ifndef __GST_OSX_VIDEO_SINK_H__ #define __GST_OSX_VIDEO_SINK_H__ #include #include #include #include #include #import "cocoawindow.h" GST_DEBUG_CATEGORY_EXTERN (gst_debug_osx_video_sink); #define GST_CAT_DEFAULT gst_debug_osx_video_sink G_BEGIN_DECLS #define GST_TYPE_OSX_VIDEO_SINK \ (gst_osx_video_sink_get_type()) #define GST_OSX_VIDEO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_OSX_VIDEO_SINK, GstOSXVideoSink)) #define GST_OSX_VIDEO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_OSX_VIDEO_SINK, GstOSXVideoSinkClass)) #define GST_IS_OSX_VIDEO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_OSX_VIDEO_SINK)) #define GST_IS_OSX_VIDEO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_OSX_VIDEO_SINK)) typedef struct _GstOSXWindow GstOSXWindow; typedef struct _GstOSXVideoSink GstOSXVideoSink; typedef struct _GstOSXVideoSinkClass GstOSXVideoSinkClass; #define GST_TYPE_OSXVIDEOBUFFER (gst_osxvideobuffer_get_type()) /* OSXWindow stuff */ struct _GstOSXWindow { gint width, height; gboolean internal; GstGLView* gstview; }; struct _GstOSXVideoSink { /* Our element stuff */ GstVideoSink videosink; GstOSXWindow *osxwindow; NSView *superview; }; struct _GstOSXVideoSinkClass { GstVideoSinkClass parent_class; }; GType gst_osx_video_sink_get_type(void); G_END_DECLS #endif /* __GST_OSX_VIDEO_SINK_H__ */ gst-plugins-good-0.10.31/sys/osxvideo/cocoawindow.h0000644000175000017500000000447311671175354017164 00000000000000/* GStreamer * Copyright (C) 2004 Zaheer Abbas Merali * Copyright (C) 2007 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of Pioneers * of the Inevitable, the creators of the Songbird Music player * */ /* inspiration gained from looking at source of osx video out of xine and vlc * and is reflected in the code */ #import #import #import struct _GstOSXImage; @interface GstGLView : NSOpenGLView { int i_effect; unsigned int pi_texture; float f_x; float f_y; int initDone; char* data; int width, height; BOOL fullscreen; NSOpenGLContext* fullScreenContext; NSOpenGLContext* actualContext; } - (void) drawQuad; - (void) drawRect: (NSRect) rect; - (id) initWithFrame: (NSRect) frame; - (void) initTextures; - (void) reloadTexture; - (void) cleanUp; - (void) displayTexture; - (char*) getTextureBuffer; - (void) setFullScreen: (BOOL) flag; - (void) reshape; - (void) setVideoSize: (int) w: (int) h; - (BOOL) haveSuperview; - (void) haveSuperviewReal: (NSMutableArray *)closure; - (void) addToSuperview: (NSView *)superview; - (void) removeFromSuperview: (id)unused; @end @interface GstOSXVideoSinkWindow: NSWindow { int width, height; GstGLView *gstview; } - (void) setContentSize: (NSSize) size; - (GstGLView *) gstView; - (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag screen:(NSScreen *)aScreen; @end gst-plugins-good-0.10.31/sys/osxvideo/Makefile.am0000644000175000017500000000131511671175354016523 00000000000000 plugin_LTLIBRARIES = libgstosxvideosink.la libgstosxvideosink_la_SOURCES = osxvideosink.m cocoawindow.m libgstosxvideosink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstosxvideosink_la_LIBADD = \ $(GST_LIBS) \ $(GST_BASE_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-$(GST_MAJORMINOR) \ -lgstinterfaces-$(GST_MAJORMINOR) libgstosxvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,Cocoa -Wl,-framework -Wl,QuickTime -Wl,-framework -Wl,OpenGL libgstosxvideosink_la_LIBTOOLFLAGS = --tag=disable-static AM_OBJCFLAGS=$(CFLAGS) $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) -Wno-aggregate-return noinst_HEADERS = osxvideosink.h cocoawindow.h gst-plugins-good-0.10.31/sys/osxvideo/cocoawindow.m0000644000175000017500000002400111705514300017140 00000000000000/* GStreamer * Copyright (C) 2004 Zaheer Abbas Merali * Copyright (C) 2007 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of Pioneers * of the Inevitable, the creators of the Songbird Music player * */ /* inspiration gained from looking at source of osx video out of xine and vlc * and is reflected in the code */ #include #include #import "cocoawindow.h" #import "osxvideosink.h" #include #include #include /* Debugging category */ #include @ implementation GstOSXVideoSinkWindow /* The object has to be released */ - (id) initWithContentRect: (NSRect) rect styleMask: (unsigned int) styleMask backing: (NSBackingStoreType) bufferingType defer: (BOOL) flag screen:(NSScreen *) aScreen { self = [super initWithContentRect: rect styleMask: styleMask backing: bufferingType defer: flag screen:aScreen]; GST_DEBUG ("Initializing GstOSXvideoSinkWindow"); gstview = [[GstGLView alloc] initWithFrame:rect]; if (gstview) [self setContentView:gstview]; [self setTitle:@"GStreamer Video Output"]; return self; } - (void) setContentSize:(NSSize) size { width = size.width; height = size.height; [gstview setVideoSize: (int) width:(int) height]; [super setContentSize:size]; } - (GstGLView *) gstView { return gstview; } - (void) awakeFromNib { [self setAcceptsMouseMovedEvents:YES]; } - (void) sendEvent:(NSEvent *) event { BOOL taken = NO; GST_DEBUG ("event %p type:%d", event,(gint)[event type]); if ([event type] == NSKeyDown) { } /*taken = [gstview keyDown:event]; */ if (!taken) { [super sendEvent:event]; } } @end // // OpenGL implementation // @ implementation GstGLView - (id) initWithFrame:(NSRect) frame { NSOpenGLPixelFormat *fmt; NSOpenGLPixelFormatAttribute attribs[] = { NSOpenGLPFAAccelerated, NSOpenGLPFANoRecovery, NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, NSOpenGLPFAAlphaSize, 8, NSOpenGLPFADepthSize, 24, NSOpenGLPFAWindow, 0 }; fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs]; if (!fmt) { GST_WARNING ("Cannot create NSOpenGLPixelFormat"); return nil; } self = [super initWithFrame: frame pixelFormat:fmt]; [fmt release]; actualContext = [self openGLContext]; [actualContext makeCurrentContext]; [actualContext update]; /* Black background */ glClearColor (0.0, 0.0, 0.0, 0.0); pi_texture = 0; data = nil; width = frame.size.width; height = frame.size.height; GST_LOG ("Width: %d Height: %d", width, height); [self initTextures]; return self; } - (void) reshape { NSRect bounds; GST_LOG ("reshaping"); if (!initDone) { return; } [actualContext makeCurrentContext]; bounds = [self bounds]; glViewport (0, 0, (GLint) bounds.size.width, (GLint) bounds.size.height); } - (void) initTextures { [actualContext makeCurrentContext]; /* Free previous texture if any */ if (pi_texture) { glDeleteTextures (1, (GLuint *)&pi_texture); } if (data) { data = g_realloc (data, width * height * sizeof(short)); // short or 3byte? } else { data = g_malloc0(width * height * sizeof(short)); } /* Create textures */ glGenTextures (1, (GLuint *)&pi_texture); glEnable (GL_TEXTURE_RECTANGLE_EXT); glEnable (GL_UNPACK_CLIENT_STORAGE_APPLE); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glPixelStorei (GL_UNPACK_ROW_LENGTH, width); glBindTexture (GL_TEXTURE_RECTANGLE_EXT, pi_texture); /* Use VRAM texturing */ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE); /* Tell the driver not to make a copy of the texture but to use our buffer */ glPixelStorei (GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); /* Linear interpolation */ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); /* I have no idea what this exactly does, but it seems to be necessary for scaling */ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); WHY ?? glTexImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, width, height, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, data); initDone = 1; } - (void) reloadTexture { if (!initDone) { return; } GST_LOG ("Reloading Texture"); [actualContext makeCurrentContext]; glBindTexture (GL_TEXTURE_RECTANGLE_EXT, pi_texture); glPixelStorei (GL_UNPACK_ROW_LENGTH, width); /* glTexSubImage2D is faster than glTexImage2D http://developer.apple.com/samplecode/Sample_Code/Graphics_3D/ TextureRange/MainOpenGLView.m.htm */ glTexSubImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, width, height, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, data); //FIXME } - (void) cleanUp { initDone = 0; } - (void) drawQuad { f_x = 1.0; f_y = 1.0; glBegin (GL_QUADS); /* Top left */ glTexCoord2f (0.0, 0.0); glVertex2f (-f_x, f_y); /* Bottom left */ glTexCoord2f (0.0, (float) height); glVertex2f (-f_x, -f_y); /* Bottom right */ glTexCoord2f ((float) width, (float) height); glVertex2f (f_x, -f_y); /* Top right */ glTexCoord2f ((float) width, 0.0); glVertex2f (f_x, f_y); glEnd (); } - (void) drawRect:(NSRect) rect { GLint params[] = { 1 }; [actualContext makeCurrentContext]; CGLSetParameter (CGLGetCurrentContext (), kCGLCPSwapInterval, params); /* Black background */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (!initDone) { [actualContext flushBuffer]; return; } /* Draw */ glBindTexture (GL_TEXTURE_RECTANGLE_EXT, pi_texture); // FIXME [self drawQuad]; /* Draw */ [actualContext flushBuffer]; } - (void) displayTexture { if ([self lockFocusIfCanDraw]) { [self drawRect:[self bounds]]; [self reloadTexture]; [self unlockFocus]; } } - (char *) getTextureBuffer { return data; } - (void) setFullScreen:(BOOL) flag { if (!fullscreen && flag) { // go to full screen /* Create the new pixel format */ NSOpenGLPixelFormat *fmt; NSOpenGLPixelFormatAttribute attribs[] = { NSOpenGLPFAAccelerated, NSOpenGLPFANoRecovery, NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, NSOpenGLPFAAlphaSize, 8, NSOpenGLPFADepthSize, 24, NSOpenGLPFAFullScreen, NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask (kCGDirectMainDisplay), 0 }; fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs]; if (!fmt) { GST_WARNING ("Cannot create NSOpenGLPixelFormat"); return; } /* Create the new OpenGL context */ fullScreenContext = [[NSOpenGLContext alloc] initWithFormat: fmt shareContext:nil]; if (!fullScreenContext) { GST_WARNING ("Failed to create new NSOpenGLContext"); return; } actualContext = fullScreenContext; /* Capture display, switch to fullscreen */ if (CGCaptureAllDisplays () != CGDisplayNoErr) { GST_WARNING ("CGCaptureAllDisplays() failed"); return; } [fullScreenContext setFullScreen]; [fullScreenContext makeCurrentContext]; fullscreen = YES; [self initTextures]; [self setNeedsDisplay:YES]; } else if (fullscreen && !flag) { // fullscreen now and needs to go back to normal initDone = NO; actualContext = [self openGLContext]; [NSOpenGLContext clearCurrentContext]; [fullScreenContext clearDrawable]; [fullScreenContext release]; fullScreenContext = nil; CGReleaseAllDisplays (); [self reshape]; [self initTextures]; [self setNeedsDisplay:YES]; fullscreen = NO; initDone = YES; } } - (void) setVideoSize: (int) w:(int) h { GST_LOG ("width:%d, height:%d", w, h); width = w; height = h; // if (data) g_free(data); // data = g_malloc0 (2 * w * h); [self initTextures]; } - (void) haveSuperviewReal:(NSMutableArray *)closure { BOOL haveSuperview = [self superview] != nil; [closure addObject:[NSNumber numberWithBool:haveSuperview]]; } - (BOOL) haveSuperview { NSMutableArray *closure = [NSMutableArray arrayWithCapacity:1]; [self performSelectorOnMainThread:@selector(haveSuperviewReal:) withObject:(id)closure waitUntilDone:YES]; return [[closure objectAtIndex:0] boolValue]; } - (void) addToSuperviewReal:(NSView *)superview { NSRect bounds; [superview addSubview:self]; bounds = [superview bounds]; [self setFrame:bounds]; [self setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; } - (void) addToSuperview: (NSView *)superview { [self performSelectorOnMainThread:@selector(addToSuperviewReal:) withObject:superview waitUntilDone:YES]; } - (void) removeFromSuperview: (id)unused { [self removeFromSuperview]; } - (void) dealloc { GST_LOG ("dealloc called"); if (data) g_free(data); if (fullScreenContext) { [NSOpenGLContext clearCurrentContext]; [fullScreenContext clearDrawable]; [fullScreenContext release]; if (actualContext == fullScreenContext) actualContext = nil; fullScreenContext = nil; } [super dealloc]; } @end gst-plugins-good-0.10.31/sys/osxvideo/osxvideosink.m0000644000175000017500000003646111677341660017405 00000000000000/* GStreamer * OSX video sink * Copyright (C) 2004-6 Zaheer Abbas Merali * Copyright (C) 2007,2008,2009 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of * Pioneers of the Inevitable, the creators of the Songbird Music player. * */ /** * SECTION:element-osxvideosink * * The OSXVideoSink renders video frames to a MacOSX window. The video output * must be directed to a window embedded in an existing NSApp. * * When the NSView to be embedded is created an element #GstMessage with a * name of 'have-ns-view' will be created and posted on the bus. * The pointer to the NSView to embed will be in the 'nsview' field of that * message. The application MUST handle this message and embed the view * appropriately. */ #include "config.h" #include #include "osxvideosink.h" #include #import "cocoawindow.h" GST_DEBUG_CATEGORY (gst_debug_osx_video_sink); #define GST_CAT_DEFAULT gst_debug_osx_video_sink static GstStaticPadTemplate gst_osx_video_sink_sink_template_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv, " "framerate = (fraction) [ 0, MAX ], " "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ], " #if G_BYTE_ORDER == G_BIG_ENDIAN "format = (fourcc) YUY2") #else "format = (fourcc) UYVY") #endif ); enum { ARG_0, ARG_EMBED, }; static void gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink); static GstVideoSinkClass *parent_class = NULL; /* This function handles osx window creation */ static gboolean gst_osx_video_sink_osxwindow_create (GstOSXVideoSink * osxvideosink, gint width, gint height) { NSRect rect; GstOSXWindow *osxwindow = NULL; GstStructure *s; GstMessage *msg; gboolean res = TRUE; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; g_return_val_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink), FALSE); GST_DEBUG_OBJECT (osxvideosink, "Creating new OSX window"); osxvideosink->osxwindow = osxwindow = g_new0 (GstOSXWindow, 1); osxwindow->width = width; osxwindow->height = height; /* Allocate our GstGLView for the window, and then tell the application * about it (hopefully it's listening...) */ rect.origin.x = 0.0; rect.origin.y = 0.0; rect.size.width = (float) osxwindow->width; rect.size.height = (float) osxwindow->height; osxwindow->gstview =[[GstGLView alloc] initWithFrame:rect]; s = gst_structure_new ("have-ns-view", "nsview", G_TYPE_POINTER, osxwindow->gstview, nil); msg = gst_message_new_element (GST_OBJECT (osxvideosink), s); gst_element_post_message (GST_ELEMENT (osxvideosink), msg); GST_INFO_OBJECT (osxvideosink, "'have-ns-view' message sent"); /* check if have-ns-view was handled and osxwindow->gstview was added to a * superview */ if ([osxwindow->gstview haveSuperview] == NO) { /* have-ns-view wasn't handled, post prepare-xwindow-id */ if (osxvideosink->superview == NULL) { GST_INFO_OBJECT (osxvideosink, "emitting prepare-xwindow-id"); gst_x_overlay_prepare_xwindow_id (GST_X_OVERLAY (osxvideosink)); } if (osxvideosink->superview != NULL) { /* prepare-xwindow-id was handled, we have the superview in * osxvideosink->superview. We now add osxwindow->gstview to the superview * from the main thread */ GST_INFO_OBJECT (osxvideosink, "we have a superview, adding our view to it"); [osxwindow->gstview performSelectorOnMainThread:@selector(addToSuperview:) withObject:osxvideosink->superview waitUntilDone:YES]; } else { /* the view wasn't added to a superview. It's possible that the * application handled have-ns-view, stored our view internally and is * going to add it to a superview later (webkit does that now). */ GST_INFO_OBJECT (osxvideosink, "no superview"); } } [pool release]; return res; } static void gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink) { NSAutoreleasePool *pool; g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink)); pool = [[NSAutoreleasePool alloc] init]; if (osxvideosink->osxwindow) { if (osxvideosink->superview) { [osxvideosink->osxwindow->gstview performSelectorOnMainThread:@selector(removeFromSuperview:) withObject:(id)nil waitUntilDone:YES]; } [osxvideosink->osxwindow->gstview release]; g_free (osxvideosink->osxwindow); osxvideosink->osxwindow = NULL; } [pool release]; } /* This function resizes a GstXWindow */ static void gst_osx_video_sink_osxwindow_resize (GstOSXVideoSink * osxvideosink, GstOSXWindow * osxwindow, guint width, guint height) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; g_return_if_fail (osxwindow != NULL); g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink)); osxwindow->width = width; osxwindow->height = height; GST_DEBUG_OBJECT (osxvideosink, "Resizing window to (%d,%d)", width, height); /* Directly resize the underlying view */ GST_DEBUG_OBJECT (osxvideosink, "Calling setVideoSize on %p", osxwindow->gstview); [osxwindow->gstview setVideoSize:width :height]; [pool release]; } static gboolean gst_osx_video_sink_setcaps (GstBaseSink * bsink, GstCaps * caps) { GstOSXVideoSink *osxvideosink; GstStructure *structure; gboolean res, result = FALSE; gint video_width, video_height; osxvideosink = GST_OSX_VIDEO_SINK (bsink); GST_DEBUG_OBJECT (osxvideosink, "caps: %" GST_PTR_FORMAT, caps); structure = gst_caps_get_structure (caps, 0); res = gst_structure_get_int (structure, "width", &video_width); res &= gst_structure_get_int (structure, "height", &video_height); if (!res) { goto beach; } GST_DEBUG_OBJECT (osxvideosink, "our format is: %dx%d video", video_width, video_height); GST_VIDEO_SINK_WIDTH (osxvideosink) = video_width; GST_VIDEO_SINK_HEIGHT (osxvideosink) = video_height; gst_osx_video_sink_osxwindow_resize (osxvideosink, osxvideosink->osxwindow, video_width, video_height); result = TRUE; beach: return result; } static GstStateChangeReturn gst_osx_video_sink_change_state (GstElement * element, GstStateChange transition) { GstOSXVideoSink *osxvideosink; GstStateChangeReturn ret; osxvideosink = GST_OSX_VIDEO_SINK (element); GST_DEBUG_OBJECT (osxvideosink, "%s => %s", gst_element_state_get_name(GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name(GST_STATE_TRANSITION_NEXT (transition))); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: /* Creating our window and our image */ GST_VIDEO_SINK_WIDTH (osxvideosink) = 320; GST_VIDEO_SINK_HEIGHT (osxvideosink) = 240; if (!gst_osx_video_sink_osxwindow_create (osxvideosink, GST_VIDEO_SINK_WIDTH (osxvideosink), GST_VIDEO_SINK_HEIGHT (osxvideosink))) { ret = GST_STATE_CHANGE_FAILURE; goto done; } break; default: break; } ret = (GST_ELEMENT_CLASS (parent_class))->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: GST_VIDEO_SINK_WIDTH (osxvideosink) = 0; GST_VIDEO_SINK_HEIGHT (osxvideosink) = 0; gst_osx_video_sink_osxwindow_destroy (osxvideosink); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } done: return ret; } static GstFlowReturn gst_osx_video_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) { GstOSXVideoSink *osxvideosink; guint8 *viewdata; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; osxvideosink = GST_OSX_VIDEO_SINK (bsink); viewdata = (guint8 *) [osxvideosink->osxwindow->gstview getTextureBuffer]; GST_DEBUG ("show_frame"); memcpy (viewdata, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); [osxvideosink->osxwindow->gstview displayTexture]; [pool release]; return GST_FLOW_OK; } /* Buffer management */ /* =========================================== */ /* */ /* Init & Class init */ /* */ /* =========================================== */ static void gst_osx_video_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOSXVideoSink *osxvideosink; g_return_if_fail (GST_IS_OSX_VIDEO_SINK (object)); osxvideosink = GST_OSX_VIDEO_SINK (object); switch (prop_id) { case ARG_EMBED: /* Ignore, just here for backwards compatibility */ break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_osx_video_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOSXVideoSink *osxvideosink; g_return_if_fail (GST_IS_OSX_VIDEO_SINK (object)); osxvideosink = GST_OSX_VIDEO_SINK (object); switch (prop_id) { case ARG_EMBED: g_value_set_boolean (value, TRUE); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_osx_video_sink_init (GstOSXVideoSink * osxvideosink) { osxvideosink->osxwindow = NULL; osxvideosink->superview = NULL; } static void gst_osx_video_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "OSX Video sink", "Sink/Video", "OSX native videosink", "Zaheer Abbas Merali "); gst_element_class_add_static_pad_template (element_class, &gst_osx_video_sink_sink_template_factory); } static void gst_osx_video_sink_finalize (GObject *object) { GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (object); if (osxvideosink->superview) [osxvideosink->superview release]; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_osx_video_sink_class_init (GstOSXVideoSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; parent_class = g_type_class_ref (GST_TYPE_VIDEO_SINK); gobject_class->set_property = gst_osx_video_sink_set_property; gobject_class->get_property = gst_osx_video_sink_get_property; gobject_class->finalize = gst_osx_video_sink_finalize; gstbasesink_class->set_caps = gst_osx_video_sink_setcaps; gstbasesink_class->preroll = gst_osx_video_sink_show_frame; gstbasesink_class->render = gst_osx_video_sink_show_frame; gstelement_class->change_state = gst_osx_video_sink_change_state; /** * GstOSXVideoSink:embed * * Set to #TRUE if you are embedding the video window in an application. * **/ g_object_class_install_property (gobject_class, ARG_EMBED, g_param_spec_boolean ("embed", "embed", "For ABI compatiblity only, do not use", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static gboolean gst_osx_video_sink_interface_supported (GstImplementsInterface * iface, GType type) { g_assert (type == GST_TYPE_X_OVERLAY); return TRUE; } static void gst_osx_video_sink_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_osx_video_sink_interface_supported; } static void gst_osx_video_sink_set_window_handle (GstXOverlay * overlay, guintptr handle_id) { GstOSXVideoSink *osxvideosink = GST_OSX_VIDEO_SINK (overlay); gulong window_id = (gulong) handle_id; if (osxvideosink->superview) { GST_INFO_OBJECT (osxvideosink, "old xwindow id %p", osxvideosink->superview); if (osxvideosink->osxwindow) { [osxvideosink->osxwindow->gstview performSelectorOnMainThread:@selector(removeFromSuperview:) withObject:(id)nil waitUntilDone:YES]; } [osxvideosink->superview release]; } GST_INFO_OBJECT (osxvideosink, "set xwindow id 0x%lx", window_id); osxvideosink->superview = [((NSView *) window_id) retain]; if (osxvideosink->osxwindow) { [osxvideosink->osxwindow->gstview performSelectorOnMainThread:@selector(addToSuperview:) withObject:osxvideosink->superview waitUntilDone:YES]; } } static void gst_osx_video_sink_xoverlay_init (GstXOverlayClass * iface) { iface->set_window_handle = gst_osx_video_sink_set_window_handle; iface->expose = NULL; iface->handle_events = NULL; } /* ============================================================= */ /* */ /* Public Methods */ /* */ /* ============================================================= */ /* =========================================== */ /* */ /* Object typing & Creation */ /* */ /* =========================================== */ GType gst_osx_video_sink_get_type (void) { static GType osxvideosink_type = 0; if (!osxvideosink_type) { static const GTypeInfo osxvideosink_info = { sizeof (GstOSXVideoSinkClass), gst_osx_video_sink_base_init, NULL, (GClassInitFunc) gst_osx_video_sink_class_init, NULL, NULL, sizeof (GstOSXVideoSink), 0, (GInstanceInitFunc) gst_osx_video_sink_init, }; static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) gst_osx_video_sink_interface_init, NULL, NULL, }; static const GInterfaceInfo overlay_info = { (GInterfaceInitFunc) gst_osx_video_sink_xoverlay_init, NULL, NULL, }; osxvideosink_type = g_type_register_static (GST_TYPE_VIDEO_SINK, "GstOSXVideoSink", &osxvideosink_info, 0); g_type_add_interface_static (osxvideosink_type, GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); g_type_add_interface_static (osxvideosink_type, GST_TYPE_X_OVERLAY, &overlay_info); } return osxvideosink_type; } static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "osxvideosink", GST_RANK_PRIMARY, GST_TYPE_OSX_VIDEO_SINK)) return FALSE; GST_DEBUG_CATEGORY_INIT (gst_debug_osx_video_sink, "osxvideosink", 0, "osxvideosink element"); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "osxvideo", "OSX native video output plugin", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/osxvideo/Makefile.in0000644000175000017500000007131111720560240016522 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/osxvideo DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstosxvideosink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstosxvideosink_la_OBJECTS = \ libgstosxvideosink_la-osxvideosink.lo \ libgstosxvideosink_la-cocoawindow.lo libgstosxvideosink_la_OBJECTS = $(am_libgstosxvideosink_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstosxvideosink_la_LINK = $(LIBTOOL) $(AM_V_lt) \ $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) \ $(libgstosxvideosink_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f OBJCCOMPILE = $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) LTOBJCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_OBJCFLAGS) $(OBJCFLAGS) AM_V_OBJC = $(am__v_OBJC_@AM_V@) am__v_OBJC_ = $(am__v_OBJC_@AM_DEFAULT_V@) am__v_OBJC_0 = @echo " OBJC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ OBJCLD = $(OBJC) OBJCLINK = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_OBJCLD = $(am__v_OBJCLD_@AM_V@) am__v_OBJCLD_ = $(am__v_OBJCLD_@AM_DEFAULT_V@) am__v_OBJCLD_0 = @echo " OBJCLD" $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstosxvideosink_la_SOURCES) DIST_SOURCES = $(libgstosxvideosink_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstosxvideosink.la libgstosxvideosink_la_SOURCES = osxvideosink.m cocoawindow.m libgstosxvideosink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstosxvideosink_la_LIBADD = \ $(GST_LIBS) \ $(GST_BASE_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-$(GST_MAJORMINOR) \ -lgstinterfaces-$(GST_MAJORMINOR) libgstosxvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,Cocoa -Wl,-framework -Wl,QuickTime -Wl,-framework -Wl,OpenGL libgstosxvideosink_la_LIBTOOLFLAGS = --tag=disable-static AM_OBJCFLAGS = $(CFLAGS) $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) -Wno-aggregate-return noinst_HEADERS = osxvideosink.h cocoawindow.h all: all-am .SUFFIXES: .SUFFIXES: .lo .m .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/osxvideo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/osxvideo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstosxvideosink.la: $(libgstosxvideosink_la_OBJECTS) $(libgstosxvideosink_la_DEPENDENCIES) $(EXTRA_libgstosxvideosink_la_DEPENDENCIES) $(AM_V_OBJCLD)$(libgstosxvideosink_la_LINK) -rpath $(plugindir) $(libgstosxvideosink_la_OBJECTS) $(libgstosxvideosink_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxvideosink_la-cocoawindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxvideosink_la-osxvideosink.Plo@am__quote@ .m.o: @am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(OBJCCOMPILE) -c -o $@ $< .m.obj: @am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(OBJCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .m.lo: @am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LTOBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LTOBJCCOMPILE) -c -o $@ $< libgstosxvideosink_la-osxvideosink.lo: osxvideosink.m @am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -MT libgstosxvideosink_la-osxvideosink.lo -MD -MP -MF $(DEPDIR)/libgstosxvideosink_la-osxvideosink.Tpo -c -o libgstosxvideosink_la-osxvideosink.lo `test -f 'osxvideosink.m' || echo '$(srcdir)/'`osxvideosink.m @am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxvideosink_la-osxvideosink.Tpo $(DEPDIR)/libgstosxvideosink_la-osxvideosink.Plo @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='osxvideosink.m' object='libgstosxvideosink_la-osxvideosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstosxvideosink_la-osxvideosink.lo `test -f 'osxvideosink.m' || echo '$(srcdir)/'`osxvideosink.m libgstosxvideosink_la-cocoawindow.lo: cocoawindow.m @am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -MT libgstosxvideosink_la-cocoawindow.lo -MD -MP -MF $(DEPDIR)/libgstosxvideosink_la-cocoawindow.Tpo -c -o libgstosxvideosink_la-cocoawindow.lo `test -f 'cocoawindow.m' || echo '$(srcdir)/'`cocoawindow.m @am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxvideosink_la-cocoawindow.Tpo $(DEPDIR)/libgstosxvideosink_la-cocoawindow.Plo @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ $(AM_V_OBJC)source='cocoawindow.m' object='libgstosxvideosink_la-cocoawindow.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepOBJC_FALSE@ $(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstosxvideosink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstosxvideosink_la-cocoawindow.lo `test -f 'cocoawindow.m' || echo '$(srcdir)/'`cocoawindow.m mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/Makefile.in0000644000175000017500000006413211720560240014665 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # if USE_DXR3 # DXR3_DIR=dxr3 # else # DXR3_DIR= # endif # include this at the end of $MODULE/ext/Makefile.am to force make to # build subdirectories in parallel when make -jN is used. We will end up # descending into all subdirectories a second time, but only after the first # (parallel) run has finished, so it should go right through the second time. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/common/parallel-subdirs.mak subdir = sys ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @USE_OSS_FALSE@OSS_DIR = @USE_OSS_TRUE@OSS_DIR = oss @USE_OSS4_FALSE@OSS4_DIR = @USE_OSS4_TRUE@OSS4_DIR = oss4 @USE_DIRECTSOUND_FALSE@DIRECTSOUND_DIR = @USE_DIRECTSOUND_TRUE@DIRECTSOUND_DIR = directsound @USE_SUNAUDIO_FALSE@SUNAUDIO_DIR = @USE_SUNAUDIO_TRUE@SUNAUDIO_DIR = sunaudio @USE_OSX_AUDIO_FALSE@OSX_AUDIO_DIR = @USE_OSX_AUDIO_TRUE@OSX_AUDIO_DIR = osxaudio @USE_OSX_VIDEO_FALSE@OSX_VIDEO_DIR = @USE_OSX_VIDEO_TRUE@OSX_VIDEO_DIR = osxvideo @USE_GST_V4L2_FALSE@V4L2_DIR = # if USE_QCAM # QCAM_DIR=qcam # else # QCAM_DIR= # endif @USE_GST_V4L2_TRUE@V4L2_DIR = v4l2 @USE_X_FALSE@XIMAGE_DIR = # if USE_VCD # VCD_DIR=vcd # else # VCD_DIR= # endif # if USE_CDROM # CDROM_DIR=cdrom # else # CDROM_DIR= # endif # if USE_OPENGL # GL_DIR=glsink # else # GL_DIR= # endif @USE_X_TRUE@XIMAGE_DIR = ximage SUBDIRS = $(DIRECTSOUND_DIR) $(OSS_DIR) $(OSS4_DIR) $(OSX_AUDIO_DIR) $(OSX_VIDEO_DIR) $(SUNAUDIO_DIR) $(V4L2_DIR) $(XIMAGE_DIR) DIST_SUBDIRS = directsound oss oss4 osxaudio osxvideo sunaudio v4l2 waveform ximage all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/parallel-subdirs.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: independent-subdirs $(SUBDIRS) independent-subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ all-recursive: independent-subdirs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/osxaudio/0000755000175000017500000000000011720565320014531 500000000000000gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudiosrc.c0000644000175000017500000002553711677341660017724 00000000000000/* * GStreamer * Copyright (C) 2005,2006 Zaheer Abbas Merali * Copyright (C) 2008 Pioneers of the Inevitable * * 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-osxaudiosrc * * This element captures raw audio samples using the CoreAudio api. * * * Example launch line * |[ * gst-launch osxaudiosrc ! wavenc ! filesink location=audio.wav * ]| * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "gstosxaudiosrc.h" #include "gstosxaudioelement.h" GST_DEBUG_CATEGORY_STATIC (osx_audiosrc_debug); #define GST_CAT_DEFAULT osx_audiosrc_debug /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, ARG_DEVICE }; static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, " "signed = (boolean) { TRUE }, " "width = (int) 32, " "depth = (int) 32, " "rate = (int) [1, MAX], " "channels = (int) [1, MAX]") ); static void gst_osx_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_osx_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_osx_audio_src_get_caps (GstBaseSrc * src); static GstRingBuffer *gst_osx_audio_src_create_ringbuffer (GstBaseAudioSrc * src); static void gst_osx_audio_src_osxelement_init (gpointer g_iface, gpointer iface_data); static OSStatus gst_osx_audio_src_io_proc (GstOsxRingBuffer * buf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList); static void gst_osx_audio_src_select_device (GstOsxAudioSrc * osxsrc); static void gst_osx_audio_src_do_init (GType type) { static const GInterfaceInfo osxelement_info = { gst_osx_audio_src_osxelement_init, NULL, NULL }; GST_DEBUG_CATEGORY_INIT (osx_audiosrc_debug, "osxaudiosrc", 0, "OSX Audio Src"); GST_DEBUG ("Adding static interface"); g_type_add_interface_static (type, GST_OSX_AUDIO_ELEMENT_TYPE, &osxelement_info); } GST_BOILERPLATE_FULL (GstOsxAudioSrc, gst_osx_audio_src, GstBaseAudioSrc, GST_TYPE_BASE_AUDIO_SRC, gst_osx_audio_src_do_init); static void gst_osx_audio_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_set_details_simple (element_class, "Audio Source (OSX)", "Source/Audio", "Input from a sound card in OS X", "Zaheer Abbas Merali "); } static void gst_osx_audio_src_class_init (GstOsxAudioSrcClass * 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; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_osx_audio_src_set_property; gobject_class->get_property = gst_osx_audio_src_get_property; gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_osx_audio_src_get_caps); g_object_class_install_property (gobject_class, ARG_DEVICE, g_param_spec_int ("device", "Device ID", "Device ID of input device", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbaseaudiosrc_class->create_ringbuffer = GST_DEBUG_FUNCPTR (gst_osx_audio_src_create_ringbuffer); } static void gst_osx_audio_src_init (GstOsxAudioSrc * src, GstOsxAudioSrcClass * gclass) { gst_base_src_set_live (GST_BASE_SRC (src), TRUE); src->device_id = kAudioDeviceUnknown; src->deviceChannels = -1; } static void gst_osx_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOsxAudioSrc *src = GST_OSX_AUDIO_SRC (object); switch (prop_id) { case ARG_DEVICE: src->device_id = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_osx_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOsxAudioSrc *src = GST_OSX_AUDIO_SRC (object); switch (prop_id) { case ARG_DEVICE: g_value_set_int (value, src->device_id); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_osx_audio_src_get_caps (GstBaseSrc * src) { GstElementClass *gstelement_class; GstOsxAudioSrc *osxsrc; GstPadTemplate *pad_template; GstCaps *caps; gint min, max; gstelement_class = GST_ELEMENT_GET_CLASS (src); osxsrc = GST_OSX_AUDIO_SRC (src); if (osxsrc->deviceChannels == -1) { /* -1 means we don't know the number of channels yet. for now, return * template caps. */ return NULL; } max = osxsrc->deviceChannels; if (max < 1) max = 1; /* 0 channels means 1 channel? */ min = MIN (1, max); pad_template = gst_element_class_get_pad_template (gstelement_class, "src"); g_return_val_if_fail (pad_template != NULL, NULL); caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); if (min == max) { gst_caps_set_simple (caps, "channels", G_TYPE_INT, max, NULL); } else { gst_caps_set_simple (caps, "channels", GST_TYPE_INT_RANGE, min, max, NULL); } return caps; } static GstRingBuffer * gst_osx_audio_src_create_ringbuffer (GstBaseAudioSrc * src) { GstOsxAudioSrc *osxsrc; GstOsxRingBuffer *ringbuffer; osxsrc = GST_OSX_AUDIO_SRC (src); gst_osx_audio_src_select_device (osxsrc); GST_DEBUG ("Creating ringbuffer"); ringbuffer = g_object_new (GST_TYPE_OSX_RING_BUFFER, NULL); GST_DEBUG ("osx src 0x%p element 0x%p ioproc 0x%p", osxsrc, GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsrc), (void *) gst_osx_audio_src_io_proc); ringbuffer->element = GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsrc); ringbuffer->is_src = TRUE; ringbuffer->device_id = osxsrc->device_id; return GST_RING_BUFFER (ringbuffer); } static OSStatus gst_osx_audio_src_io_proc (GstOsxRingBuffer * buf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList) { OSStatus status; guint8 *writeptr; gint writeseg; gint len; gint remaining; gint offset = 0; status = AudioUnitRender (buf->audiounit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, buf->recBufferList); if (status) { GST_WARNING_OBJECT (buf, "AudioUnitRender returned %d", (int) status); return status; } remaining = buf->recBufferList->mBuffers[0].mDataByteSize; while (remaining) { if (!gst_ring_buffer_prepare_read (GST_RING_BUFFER (buf), &writeseg, &writeptr, &len)) return 0; len -= buf->segoffset; if (len > remaining) len = remaining; memcpy (writeptr + buf->segoffset, (char *) buf->recBufferList->mBuffers[0].mData + offset, len); buf->segoffset += len; offset += len; remaining -= len; if ((gint) buf->segoffset == GST_RING_BUFFER (buf)->spec.segsize) { /* we wrote one segment */ gst_ring_buffer_advance (GST_RING_BUFFER (buf), 1); buf->segoffset = 0; } } return 0; } static void gst_osx_audio_src_osxelement_init (gpointer g_iface, gpointer iface_data) { GstOsxAudioElementInterface *iface = (GstOsxAudioElementInterface *) g_iface; iface->io_proc = (AURenderCallback) gst_osx_audio_src_io_proc; } static void gst_osx_audio_src_select_device (GstOsxAudioSrc * osxsrc) { OSStatus status; UInt32 propertySize; if (osxsrc->device_id == kAudioDeviceUnknown) { /* If no specific device has been selected by the user, then pick the * default device */ GST_DEBUG_OBJECT (osxsrc, "Selecting device for OSXAudioSrc"); propertySize = sizeof (osxsrc->device_id); status = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultInputDevice, &propertySize, &osxsrc->device_id); if (status) { GST_WARNING_OBJECT (osxsrc, "AudioHardwareGetProperty returned %d", (int) status); } else { GST_DEBUG_OBJECT (osxsrc, "AudioHardwareGetProperty returned 0"); } if (osxsrc->device_id == kAudioDeviceUnknown) { GST_WARNING_OBJECT (osxsrc, "AudioHardwareGetProperty: device_id is kAudioDeviceUnknown"); } GST_DEBUG_OBJECT (osxsrc, "AudioHardwareGetProperty: device_id is %lu", (long) osxsrc->device_id); } } gst-plugins-good-0.10.31/sys/osxaudio/Makefile.am0000644000175000017500000000166711671175354016530 00000000000000plugin_LTLIBRARIES = libgstosxaudio.la libgstosxaudio_la_SOURCES = gstosxringbuffer.c \ gstosxaudioelement.c \ gstosxaudiosink.c \ gstosxaudiosrc.c \ gstosxaudio.c libgstosxaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ -Wno-deprecated-declarations libgstosxaudio_la_LIBADD = \ -lgstinterfaces-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstosxaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,CoreAudio -Wl,-framework -Wl,AudioUnit -Wl,-framework -Wl,CoreServices libgstosxaudio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstosxaudiosink.h \ gstosxaudioelement.h \ gstosxringbuffer.h \ gstosxaudiosrc.h gst-plugins-good-0.10.31/sys/osxaudio/gstosxringbuffer.h0000644000175000017500000000677311671175354020251 00000000000000/* * GStreamer * Copyright (C) 2006 Zaheer Abbas Merali * * 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_OSX_RING_BUFFER_H__ #define __GST_OSX_RING_BUFFER_H__ #include #include #include #include "gstosxaudioelement.h" G_BEGIN_DECLS #define GST_TYPE_OSX_RING_BUFFER \ (gst_osx_ring_buffer_get_type()) #define GST_OSX_RING_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSX_RING_BUFFER,GstOsxRingBuffer)) #define GST_OSX_RING_BUFFER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSX_RING_BUFFER,GstOsxRingBufferClass)) #define GST_OSX_RING_BUFFER_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_OSX_RING_BUFFER,GstOsxRingBufferClass)) #define GST_IS_OSX_RING_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OSX_RING_BUFFER)) #define GST_IS_OSX_RING_BUFFER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OSX_RING_BUFFER)) typedef struct _GstOsxRingBuffer GstOsxRingBuffer; typedef struct _GstOsxRingBufferClass GstOsxRingBufferClass; struct _GstOsxRingBuffer { GstRingBuffer object; gboolean is_src; AudioUnit audiounit; AudioDeviceID device_id; gboolean io_proc_active; gboolean io_proc_needs_deactivation; guint buffer_len; guint segoffset; AudioBufferList * recBufferList; GstOsxAudioElementInterface * element; }; struct _GstOsxRingBufferClass { GstRingBufferClass parent_class; }; GType gst_osx_ring_buffer_get_type (void); G_END_DECLS #endif /* __GST_OSX_RING_BUFFER_H__ */ gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudioelement.c0000644000175000017500000000634311671175354020557 00000000000000/* * GStreamer * Copyright (C) 2006 Zaheer Abbas Merali * Copyright (C) 2007 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of * Pioneers of the Inevitable, the creators of the Songbird Music player * */ #include #include "gstosxaudioelement.h" static void gst_osx_audio_element_class_init (GstOsxAudioElementInterface * klass); GType gst_osx_audio_element_get_type (void) { static GType gst_osxaudioelement_type = 0; if (!gst_osxaudioelement_type) { static const GTypeInfo gst_osxaudioelement_info = { sizeof (GstOsxAudioElementInterface), (GBaseInitFunc) gst_osx_audio_element_class_init, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL }; gst_osxaudioelement_type = g_type_register_static (G_TYPE_INTERFACE, "GstOsxAudioElement", &gst_osxaudioelement_info, 0); } return gst_osxaudioelement_type; } static void gst_osx_audio_element_class_init (GstOsxAudioElementInterface * klass) { static gboolean initialized = FALSE; if (!initialized) { initialized = TRUE; } /* default virtual functions */ klass->io_proc = NULL; } gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudiosink.c0000644000175000017500000002560311677341660020073 00000000000000/* * GStreamer * Copyright (C) 2005,2006 Zaheer Abbas Merali * Copyright (C) 2007,2008 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of * Pioneers of the Inevitable, the creators of the Songbird Music player * */ /** * SECTION:element-osxaudiosink * * This element renders raw audio samples using the CoreAudio api. * * * Example pipelines * |[ * gst-launch filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! osxaudiosink * ]| Play an Ogg/Vorbis file. * * * Last reviewed on 2006-03-01 (0.10.4) */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "gstosxaudiosink.h" #include "gstosxaudioelement.h" GST_DEBUG_CATEGORY_STATIC (osx_audiosink_debug); #define GST_CAT_DEFAULT osx_audiosink_debug /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, ARG_DEVICE, ARG_VOLUME }; #define DEFAULT_VOLUME 1.0 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, " "signed = (boolean) { TRUE }, " "width = (int) 32, " "depth = (int) 32, " "rate = (int) [1, MAX], " "channels = (int) [1, MAX]") ); static void gst_osx_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_osx_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstRingBuffer *gst_osx_audio_sink_create_ringbuffer (GstBaseAudioSink * sink); static void gst_osx_audio_sink_osxelement_init (gpointer g_iface, gpointer iface_data); static void gst_osx_audio_sink_select_device (GstOsxAudioSink * osxsink); static void gst_osx_audio_sink_set_volume (GstOsxAudioSink * sink); static OSStatus gst_osx_audio_sink_io_proc (GstOsxRingBuffer * buf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList); static void gst_osx_audio_sink_do_init (GType type) { static const GInterfaceInfo osxelement_info = { gst_osx_audio_sink_osxelement_init, NULL, NULL }; GST_DEBUG_CATEGORY_INIT (osx_audiosink_debug, "osxaudiosink", 0, "OSX Audio Sink"); GST_DEBUG ("Adding static interface"); g_type_add_interface_static (type, GST_OSX_AUDIO_ELEMENT_TYPE, &osxelement_info); } GST_BOILERPLATE_FULL (GstOsxAudioSink, gst_osx_audio_sink, GstBaseAudioSink, GST_TYPE_BASE_AUDIO_SINK, gst_osx_audio_sink_do_init); static void gst_osx_audio_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Audio Sink (OSX)", "Sink/Audio", "Output to a sound card in OS X", "Zaheer Abbas Merali "); } static void gst_osx_audio_sink_class_init (GstOsxAudioSinkClass * 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; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_osx_audio_sink_set_property; gobject_class->get_property = gst_osx_audio_sink_get_property; g_object_class_install_property (gobject_class, ARG_DEVICE, g_param_spec_int ("device", "Device ID", "Device ID of output device", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_VOLUME, g_param_spec_double ("volume", "Volume", "Volume of this stream", 0, 1.0, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbaseaudiosink_class->create_ringbuffer = GST_DEBUG_FUNCPTR (gst_osx_audio_sink_create_ringbuffer); } static void gst_osx_audio_sink_init (GstOsxAudioSink * sink, GstOsxAudioSinkClass * gclass) { GST_DEBUG ("Initialising object"); sink->device_id = kAudioDeviceUnknown; sink->volume = DEFAULT_VOLUME; } static void gst_osx_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOsxAudioSink *sink = GST_OSX_AUDIO_SINK (object); switch (prop_id) { case ARG_DEVICE: sink->device_id = g_value_get_int (value); break; case ARG_VOLUME: sink->volume = g_value_get_double (value); gst_osx_audio_sink_set_volume (sink); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_osx_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOsxAudioSink *sink = GST_OSX_AUDIO_SINK (object); switch (prop_id) { case ARG_DEVICE: g_value_set_int (value, sink->device_id); break; case ARG_VOLUME: g_value_set_double (value, sink->volume); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstRingBuffer * gst_osx_audio_sink_create_ringbuffer (GstBaseAudioSink * sink) { GstOsxAudioSink *osxsink; GstOsxRingBuffer *ringbuffer; osxsink = GST_OSX_AUDIO_SINK (sink); gst_osx_audio_sink_select_device (osxsink); GST_DEBUG ("Creating ringbuffer"); ringbuffer = g_object_new (GST_TYPE_OSX_RING_BUFFER, NULL); GST_DEBUG ("osx sink 0x%p element 0x%p ioproc 0x%p", osxsink, GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsink), (void *) gst_osx_audio_sink_io_proc); gst_osx_audio_sink_set_volume (osxsink); ringbuffer->element = GST_OSX_AUDIO_ELEMENT_GET_INTERFACE (osxsink); ringbuffer->device_id = osxsink->device_id; return GST_RING_BUFFER (ringbuffer); } /* HALOutput AudioUnit will request fairly arbitrarily-sized chunks of data, * not of a fixed size. So, we keep track of where in the current ringbuffer * segment we are, and only advance the segment once we've read the whole * thing */ static OSStatus gst_osx_audio_sink_io_proc (GstOsxRingBuffer * buf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList) { guint8 *readptr; gint readseg; gint len; gint remaining = bufferList->mBuffers[0].mDataByteSize; gint offset = 0; while (remaining) { if (!gst_ring_buffer_prepare_read (GST_RING_BUFFER (buf), &readseg, &readptr, &len)) return 0; len -= buf->segoffset; if (len > remaining) len = remaining; memcpy ((char *) bufferList->mBuffers[0].mData + offset, readptr + buf->segoffset, len); buf->segoffset += len; offset += len; remaining -= len; if ((gint) buf->segoffset == GST_RING_BUFFER (buf)->spec.segsize) { /* clear written samples */ gst_ring_buffer_clear (GST_RING_BUFFER (buf), readseg); /* we wrote one segment */ gst_ring_buffer_advance (GST_RING_BUFFER (buf), 1); buf->segoffset = 0; } } return 0; } static void gst_osx_audio_sink_osxelement_init (gpointer g_iface, gpointer iface_data) { GstOsxAudioElementInterface *iface = (GstOsxAudioElementInterface *) g_iface; iface->io_proc = (AURenderCallback) gst_osx_audio_sink_io_proc; } static void gst_osx_audio_sink_set_volume (GstOsxAudioSink * sink) { if (!sink->audiounit) return; AudioUnitSetParameter (sink->audiounit, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, (float) sink->volume, 0); } static void gst_osx_audio_sink_select_device (GstOsxAudioSink * osxsink) { OSStatus status; UInt32 propertySize; if (osxsink->device_id == kAudioDeviceUnknown) { /* If no specific device has been selected by the user, then pick the * default device */ GST_DEBUG_OBJECT (osxsink, "Selecting device for OSXAudioSink"); propertySize = sizeof (osxsink->device_id); status = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice, &propertySize, &osxsink->device_id); if (status) { GST_WARNING_OBJECT (osxsink, "AudioHardwareGetProperty returned %d", (int) status); } else { GST_DEBUG_OBJECT (osxsink, "AudioHardwareGetProperty returned 0"); } if (osxsink->device_id == kAudioDeviceUnknown) { GST_WARNING_OBJECT (osxsink, "AudioHardwareGetProperty: device_id is kAudioDeviceUnknown"); } GST_DEBUG_OBJECT (osxsink, "AudioHardwareGetProperty: device_id is %lu", (long) osxsink->device_id); } } gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudioelement.h0000644000175000017500000000660511671175354020565 00000000000000/* * GStreamer * Copyright (C) 2006 Zaheer Abbas Merali * Copyright (C) 2007 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of * Pioneers of the Inevitable, the creators of the Songbird Music player * */ #ifndef __GST_OSX_AUDIO_ELEMENT_H__ #define __GST_OSX_AUDIO_ELEMENT_H__ #include #include #include G_BEGIN_DECLS #define GST_OSX_AUDIO_ELEMENT_TYPE \ (gst_osx_audio_element_get_type()) #define GST_OSX_AUDIO_ELEMENT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_OSX_AUDIO_ELEMENT_TYPE,GstOsxAudioElementInterface)) #define GST_IS_OSX_AUDIO_ELEMENT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_OSX_AUDIO_ELEMENT_TYPE)) #define GST_OSX_AUDIO_ELEMENT_GET_INTERFACE(inst) \ (G_TYPE_INSTANCE_GET_INTERFACE((inst),GST_OSX_AUDIO_ELEMENT_TYPE,GstOsxAudioElementInterface)) typedef struct _GstOsxAudioElementInterface GstOsxAudioElementInterface; struct _GstOsxAudioElementInterface { GTypeInterface parent; OSStatus (*io_proc) (void * userdata, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * bufferList); }; GType gst_osx_audio_element_get_type (void); G_END_DECLS #endif /* __GST_OSX_AUDIO_ELEMENT_H__ */ gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudio.c0000644000175000017500000000330511671175354017200 00000000000000/* * GStreamer * Copyright (C) 1999 Erik Walthinsen * Copyright (C) 2007,2008 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of * Pioneers of the Inevitable, the creators of the Songbird Music player * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstosxaudioelement.h" #include "gstosxaudiosink.h" #include "gstosxaudiosrc.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "osxaudiosink", GST_RANK_PRIMARY, GST_TYPE_OSX_AUDIO_SINK)) { return FALSE; } if (!gst_element_register (plugin, "osxaudiosrc", GST_RANK_PRIMARY, GST_TYPE_OSX_AUDIO_SRC)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "osxaudio", "OSX (Mac OS X) audio support for GStreamer", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudiosink.h0000644000175000017500000000625411671175354020100 00000000000000/* * GStreamer * Copyright (C) 2005-2006 Zaheer Abbas Merali * Copyright (C) 2007 Pioneers of the Inevitable * * 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. * * The development of this code was made possible due to the involvement of * Pioneers of the Inevitable, the creators of the Songbird Music player * */ #ifndef __GST_OSXAUDIOSINK_H__ #define __GST_OSXAUDIOSINK_H__ #include #include #include "gstosxringbuffer.h" G_BEGIN_DECLS #define GST_TYPE_OSX_AUDIO_SINK \ (gst_osx_audio_sink_get_type()) #define GST_OSX_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSX_AUDIO_SINK,GstOsxAudioSink)) #define GST_OSX_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSX_AUDIO_SINK,GstOsxAudioSinkClass)) typedef struct _GstOsxAudioSink GstOsxAudioSink; typedef struct _GstOsxAudioSinkClass GstOsxAudioSinkClass; struct _GstOsxAudioSink { GstBaseAudioSink sink; AudioDeviceID device_id; AudioUnit audiounit; double volume; }; struct _GstOsxAudioSinkClass { GstBaseAudioSinkClass parent_class; }; GType gst_osx_audio_sink_get_type (void); G_END_DECLS #endif /* __GST_OSXAUDIOSINK_H__ */ gst-plugins-good-0.10.31/sys/osxaudio/Makefile.in0000644000175000017500000010147711720560240016524 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sys/osxaudio DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstosxaudio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstosxaudio_la_OBJECTS = libgstosxaudio_la-gstosxringbuffer.lo \ libgstosxaudio_la-gstosxaudioelement.lo \ libgstosxaudio_la-gstosxaudiosink.lo \ libgstosxaudio_la-gstosxaudiosrc.lo \ libgstosxaudio_la-gstosxaudio.lo libgstosxaudio_la_OBJECTS = $(am_libgstosxaudio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstosxaudio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) \ $(libgstosxaudio_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstosxaudio_la_SOURCES) DIST_SOURCES = $(libgstosxaudio_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstosxaudio.la libgstosxaudio_la_SOURCES = gstosxringbuffer.c \ gstosxaudioelement.c \ gstosxaudiosink.c \ gstosxaudiosrc.c \ gstosxaudio.c libgstosxaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ -Wno-deprecated-declarations libgstosxaudio_la_LIBADD = \ -lgstinterfaces-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstosxaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -Wl,-framework -Wl,CoreAudio -Wl,-framework -Wl,AudioUnit -Wl,-framework -Wl,CoreServices libgstosxaudio_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstosxaudiosink.h \ gstosxaudioelement.h \ gstosxringbuffer.h \ gstosxaudiosrc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/osxaudio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/osxaudio/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstosxaudio.la: $(libgstosxaudio_la_OBJECTS) $(libgstosxaudio_la_DEPENDENCIES) $(EXTRA_libgstosxaudio_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstosxaudio_la_LINK) -rpath $(plugindir) $(libgstosxaudio_la_OBJECTS) $(libgstosxaudio_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstosxaudio_la-gstosxringbuffer.lo: gstosxringbuffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxringbuffer.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Tpo -c -o libgstosxaudio_la-gstosxringbuffer.lo `test -f 'gstosxringbuffer.c' || echo '$(srcdir)/'`gstosxringbuffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxringbuffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxringbuffer.c' object='libgstosxaudio_la-gstosxringbuffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxringbuffer.lo `test -f 'gstosxringbuffer.c' || echo '$(srcdir)/'`gstosxringbuffer.c libgstosxaudio_la-gstosxaudioelement.lo: gstosxaudioelement.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudioelement.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Tpo -c -o libgstosxaudio_la-gstosxaudioelement.lo `test -f 'gstosxaudioelement.c' || echo '$(srcdir)/'`gstosxaudioelement.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudioelement.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudioelement.c' object='libgstosxaudio_la-gstosxaudioelement.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudioelement.lo `test -f 'gstosxaudioelement.c' || echo '$(srcdir)/'`gstosxaudioelement.c libgstosxaudio_la-gstosxaudiosink.lo: gstosxaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Tpo -c -o libgstosxaudio_la-gstosxaudiosink.lo `test -f 'gstosxaudiosink.c' || echo '$(srcdir)/'`gstosxaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudiosink.c' object='libgstosxaudio_la-gstosxaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudiosink.lo `test -f 'gstosxaudiosink.c' || echo '$(srcdir)/'`gstosxaudiosink.c libgstosxaudio_la-gstosxaudiosrc.lo: gstosxaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Tpo -c -o libgstosxaudio_la-gstosxaudiosrc.lo `test -f 'gstosxaudiosrc.c' || echo '$(srcdir)/'`gstosxaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudiosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudiosrc.c' object='libgstosxaudio_la-gstosxaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudiosrc.lo `test -f 'gstosxaudiosrc.c' || echo '$(srcdir)/'`gstosxaudiosrc.c libgstosxaudio_la-gstosxaudio.lo: gstosxaudio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -MT libgstosxaudio_la-gstosxaudio.lo -MD -MP -MF $(DEPDIR)/libgstosxaudio_la-gstosxaudio.Tpo -c -o libgstosxaudio_la-gstosxaudio.lo `test -f 'gstosxaudio.c' || echo '$(srcdir)/'`gstosxaudio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstosxaudio_la-gstosxaudio.Tpo $(DEPDIR)/libgstosxaudio_la-gstosxaudio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstosxaudio.c' object='libgstosxaudio_la-gstosxaudio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstosxaudio_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstosxaudio_la_CFLAGS) $(CFLAGS) -c -o libgstosxaudio_la-gstosxaudio.lo `test -f 'gstosxaudio.c' || echo '$(srcdir)/'`gstosxaudio.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/sys/osxaudio/gstosxaudiosrc.h0000644000175000017500000000573011671175354017721 00000000000000/* * GStreamer * Copyright (C) 2005-2006 Zaheer Abbas Merali * * 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_OSXAUDIOSRC_H__ #define __GST_OSXAUDIOSRC_H__ #include #include #include "gstosxringbuffer.h" G_BEGIN_DECLS #define GST_TYPE_OSX_AUDIO_SRC \ (gst_osx_audio_src_get_type()) #define GST_OSX_AUDIO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OSX_AUDIO_SRC,GstOsxAudioSrc)) #define GST_OSX_AUDIO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OSX_AUDIO_SRC,GstOsxAudioSrcClass)) typedef struct _GstOsxAudioSrc GstOsxAudioSrc; typedef struct _GstOsxAudioSrcClass GstOsxAudioSrcClass; struct _GstOsxAudioSrc { GstBaseAudioSrc src; AudioDeviceID device_id; /* actual number of channels reported by input device */ int deviceChannels; }; struct _GstOsxAudioSrcClass { GstBaseAudioSrcClass parent_class; }; GType gst_osx_audio_src_get_type (void); G_END_DECLS #endif /* __GST_OSXAUDIOSRC_H__ */ gst-plugins-good-0.10.31/sys/osxaudio/gstosxringbuffer.c0000644000175000017500000005237511671175354020243 00000000000000/* * GStreamer * Copyright (C) 2006 Zaheer Abbas Merali * Copyright (C) 2008 Pioneers of the Inevitable * * 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. */ #include #include #include #include #include "gstosxringbuffer.h" #include "gstosxaudiosink.h" #include "gstosxaudiosrc.h" GST_DEBUG_CATEGORY_STATIC (osx_audio_debug); #define GST_CAT_DEFAULT osx_audio_debug static void gst_osx_ring_buffer_dispose (GObject * object); static void gst_osx_ring_buffer_finalize (GObject * object); static gboolean gst_osx_ring_buffer_open_device (GstRingBuffer * buf); static gboolean gst_osx_ring_buffer_close_device (GstRingBuffer * buf); static gboolean gst_osx_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec); static gboolean gst_osx_ring_buffer_release (GstRingBuffer * buf); static gboolean gst_osx_ring_buffer_start (GstRingBuffer * buf); static gboolean gst_osx_ring_buffer_pause (GstRingBuffer * buf); static gboolean gst_osx_ring_buffer_stop (GstRingBuffer * buf); static guint gst_osx_ring_buffer_delay (GstRingBuffer * buf); static GstRingBufferClass *ring_parent_class = NULL; static OSStatus gst_osx_ring_buffer_render_notify (GstOsxRingBuffer * osxbuf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, unsigned int inBusNumber, unsigned int inNumberFrames, AudioBufferList * ioData); static AudioBufferList *buffer_list_alloc (int channels, int size); static void buffer_list_free (AudioBufferList * list); static void gst_osx_ring_buffer_do_init (GType type) { GST_DEBUG_CATEGORY_INIT (osx_audio_debug, "osxaudio", 0, "OSX Audio Elements"); } GST_BOILERPLATE_FULL (GstOsxRingBuffer, gst_osx_ring_buffer, GstRingBuffer, GST_TYPE_RING_BUFFER, gst_osx_ring_buffer_do_init); static void gst_osx_ring_buffer_base_init (gpointer g_class) { /* Nothing to do right now */ } static void gst_osx_ring_buffer_class_init (GstOsxRingBufferClass * 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); gobject_class->dispose = gst_osx_ring_buffer_dispose; gobject_class->finalize = gst_osx_ring_buffer_finalize; gstringbuffer_class->open_device = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_open_device); gstringbuffer_class->close_device = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_close_device); gstringbuffer_class->acquire = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_acquire); gstringbuffer_class->release = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_release); gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_start); gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_pause); gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_start); gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_stop); gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_osx_ring_buffer_delay); GST_DEBUG ("osx ring buffer class init"); } static void gst_osx_ring_buffer_init (GstOsxRingBuffer * ringbuffer, GstOsxRingBufferClass * g_class) { /* Nothing to do right now */ } static void gst_osx_ring_buffer_dispose (GObject * object) { G_OBJECT_CLASS (ring_parent_class)->dispose (object); } static void gst_osx_ring_buffer_finalize (GObject * object) { G_OBJECT_CLASS (ring_parent_class)->finalize (object); } static AudioUnit gst_osx_ring_buffer_create_audio_unit (GstOsxRingBuffer * osxbuf, gboolean input, AudioDeviceID device_id) { ComponentDescription desc; Component comp; OSStatus status; AudioUnit unit; UInt32 enableIO; /* Create a HALOutput AudioUnit. * This is the lowest-level output API that is actually sensibly usable * (the lower level ones require that you do channel-remapping yourself, * and the CoreAudio channel mapping is sufficiently complex that doing * so would be very difficult) * * Note that for input we request an output unit even though we will do * input with it: http://developer.apple.com/technotes/tn2002/tn2091.html */ desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_HALOutput; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; comp = FindNextComponent (NULL, &desc); if (comp == NULL) { GST_WARNING_OBJECT (osxbuf, "Couldn't find HALOutput component"); return NULL; } status = OpenAComponent (comp, &unit); if (status) { GST_WARNING_OBJECT (osxbuf, "Couldn't open HALOutput component"); return NULL; } if (input) { /* enable input */ enableIO = 1; status = AudioUnitSetProperty (unit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, /* 1 = input element */ &enableIO, sizeof (enableIO)); if (status) { CloseComponent (unit); GST_WARNING_OBJECT (osxbuf, "Failed to enable input: %lx", (gulong) status); return NULL; } /* disable output */ enableIO = 0; status = AudioUnitSetProperty (unit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, /* 0 = output element */ &enableIO, sizeof (enableIO)); if (status) { CloseComponent (unit); GST_WARNING_OBJECT (osxbuf, "Failed to disable output: %lx", (gulong) status); return NULL; } } /* Specify which device we're using. */ GST_DEBUG_OBJECT (osxbuf, "Setting device to %d", (int) device_id); status = AudioUnitSetProperty (unit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, /* N/A for global */ &device_id, sizeof (AudioDeviceID)); if (status) { CloseComponent (unit); GST_WARNING_OBJECT (osxbuf, "Failed to set device: %lx", (gulong) status); return NULL; } GST_DEBUG_OBJECT (osxbuf, "Create HALOutput AudioUnit: %p", unit); return unit; } static gboolean gst_osx_ring_buffer_open_device (GstRingBuffer * buf) { GstOsxRingBuffer *osxbuf; GstOsxAudioSink *sink; GstOsxAudioSrc *src; AudioStreamBasicDescription asbd_in; OSStatus status; UInt32 propertySize; osxbuf = GST_OSX_RING_BUFFER (buf); sink = NULL; src = NULL; osxbuf->audiounit = gst_osx_ring_buffer_create_audio_unit (osxbuf, osxbuf->is_src, osxbuf->device_id); if (osxbuf->is_src) { src = GST_OSX_AUDIO_SRC (GST_OBJECT_PARENT (buf)); propertySize = sizeof (asbd_in); status = AudioUnitGetProperty (osxbuf->audiounit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 1, &asbd_in, &propertySize); if (status) { CloseComponent (osxbuf->audiounit); osxbuf->audiounit = NULL; GST_WARNING_OBJECT (osxbuf, "Unable to obtain device properties: %lx", (gulong) status); return FALSE; } src->deviceChannels = asbd_in.mChannelsPerFrame; } else { sink = GST_OSX_AUDIO_SINK (GST_OBJECT_PARENT (buf)); /* needed for the sink's volume control */ sink->audiounit = osxbuf->audiounit; } return TRUE; } static gboolean gst_osx_ring_buffer_close_device (GstRingBuffer * buf) { GstOsxRingBuffer *osxbuf; osxbuf = GST_OSX_RING_BUFFER (buf); CloseComponent (osxbuf->audiounit); osxbuf->audiounit = NULL; return TRUE; } static AudioChannelLabel gst_audio_channel_position_to_coreaudio_channel_label (GstAudioChannelPosition position, int channel) { switch (position) { case GST_AUDIO_CHANNEL_POSITION_NONE: return kAudioChannelLabel_Discrete_0 | channel; case GST_AUDIO_CHANNEL_POSITION_FRONT_MONO: return kAudioChannelLabel_Mono; case GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT: return kAudioChannelLabel_Left; case GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT: return kAudioChannelLabel_Right; case GST_AUDIO_CHANNEL_POSITION_REAR_CENTER: return kAudioChannelLabel_CenterSurround; case GST_AUDIO_CHANNEL_POSITION_REAR_LEFT: return kAudioChannelLabel_LeftSurround; case GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT: return kAudioChannelLabel_RightSurround; case GST_AUDIO_CHANNEL_POSITION_LFE: return kAudioChannelLabel_LFEScreen; case GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER: return kAudioChannelLabel_Center; case GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: return kAudioChannelLabel_Center; // ??? case GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: return kAudioChannelLabel_Center; // ??? case GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT: return kAudioChannelLabel_LeftSurroundDirect; case GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT: return kAudioChannelLabel_RightSurroundDirect; default: return kAudioChannelLabel_Unknown; } } static gboolean gst_osx_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec) { /* Configure the output stream and allocate ringbuffer memory */ GstOsxRingBuffer *osxbuf; AudioStreamBasicDescription format; AudioChannelLayout *layout = NULL; OSStatus status; UInt32 propertySize; int layoutSize; int element; int i; AudioUnitScope scope; gboolean ret = FALSE; GstStructure *structure; GstAudioChannelPosition *positions; UInt32 frameSize; osxbuf = GST_OSX_RING_BUFFER (buf); /* Fill out the audio description we're going to be using */ format.mFormatID = kAudioFormatLinearPCM; format.mSampleRate = (double) spec->rate; format.mChannelsPerFrame = spec->channels; format.mFormatFlags = kAudioFormatFlagsNativeFloatPacked; format.mBytesPerFrame = spec->channels * sizeof (float); format.mBitsPerChannel = sizeof (float) * 8; format.mBytesPerPacket = spec->channels * sizeof (float); format.mFramesPerPacket = 1; format.mReserved = 0; /* Describe channels */ layoutSize = sizeof (AudioChannelLayout) + spec->channels * sizeof (AudioChannelDescription); layout = g_malloc (layoutSize); structure = gst_caps_get_structure (spec->caps, 0); positions = gst_audio_get_channel_positions (structure); layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions; layout->mChannelBitmap = 0; /* Not used */ layout->mNumberChannelDescriptions = spec->channels; for (i = 0; i < spec->channels; i++) { if (positions) { layout->mChannelDescriptions[i].mChannelLabel = gst_audio_channel_position_to_coreaudio_channel_label (positions[i], i); } else { /* Discrete channel numbers are ORed into this */ layout->mChannelDescriptions[i].mChannelLabel = kAudioChannelLabel_Discrete_0 | i; } /* Others unused */ layout->mChannelDescriptions[i].mChannelFlags = 0; layout->mChannelDescriptions[i].mCoordinates[0] = 0.f; layout->mChannelDescriptions[i].mCoordinates[1] = 0.f; layout->mChannelDescriptions[i].mCoordinates[2] = 0.f; } if (positions) { g_free (positions); positions = NULL; } GST_LOG_OBJECT (osxbuf, "Format: %x, %f, %u, %x, %d, %d, %d, %d, %d", (unsigned int) format.mFormatID, format.mSampleRate, (unsigned int) format.mChannelsPerFrame, (unsigned int) format.mFormatFlags, (unsigned int) format.mBytesPerFrame, (unsigned int) format.mBitsPerChannel, (unsigned int) format.mBytesPerPacket, (unsigned int) format.mFramesPerPacket, (unsigned int) format.mReserved); GST_DEBUG_OBJECT (osxbuf, "Setting format for AudioUnit"); scope = osxbuf->is_src ? kAudioUnitScope_Output : kAudioUnitScope_Input; element = osxbuf->is_src ? 1 : 0; propertySize = sizeof (format); status = AudioUnitSetProperty (osxbuf->audiounit, kAudioUnitProperty_StreamFormat, scope, element, &format, propertySize); if (status) { GST_WARNING_OBJECT (osxbuf, "Failed to set audio description: %lx", (gulong) status); goto done; } status = AudioUnitSetProperty (osxbuf->audiounit, kAudioUnitProperty_AudioChannelLayout, scope, element, layout, layoutSize); if (status) { GST_WARNING_OBJECT (osxbuf, "Failed to set output channel layout: %lx", (gulong) status); goto done; } spec->segsize = (spec->latency_time * spec->rate / G_USEC_PER_SEC) * spec->bytes_per_sample; spec->segtotal = spec->buffer_time / spec->latency_time; /* create AudioBufferList needed for recording */ if (osxbuf->is_src) { propertySize = sizeof (frameSize); status = AudioUnitGetProperty (osxbuf->audiounit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, /* N/A for global */ &frameSize, &propertySize); if (status) { GST_WARNING_OBJECT (osxbuf, "Failed to get frame size: %lx", (gulong) status); goto done; } osxbuf->recBufferList = buffer_list_alloc (format.mChannelsPerFrame, frameSize * format.mBytesPerFrame); } buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize); memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data)); osxbuf->segoffset = 0; status = AudioUnitInitialize (osxbuf->audiounit); if (status) { gst_buffer_unref (buf->data); buf->data = NULL; if (osxbuf->recBufferList) { buffer_list_free (osxbuf->recBufferList); osxbuf->recBufferList = NULL; } GST_WARNING_OBJECT (osxbuf, "Failed to initialise AudioUnit: %d", (int) status); goto done; } GST_DEBUG_OBJECT (osxbuf, "osx ring buffer acquired"); ret = TRUE; done: g_free (layout); return ret; } static gboolean gst_osx_ring_buffer_release (GstRingBuffer * buf) { GstOsxRingBuffer *osxbuf; osxbuf = GST_OSX_RING_BUFFER (buf); AudioUnitUninitialize (osxbuf->audiounit); gst_buffer_unref (buf->data); buf->data = NULL; if (osxbuf->recBufferList) { buffer_list_free (osxbuf->recBufferList); osxbuf->recBufferList = NULL; } return TRUE; } static void gst_osx_ring_buffer_remove_render_callback (GstOsxRingBuffer * osxbuf) { AURenderCallbackStruct input; OSStatus status; /* Deactivate the render callback by calling SetRenderCallback with a NULL * inputProc. */ input.inputProc = NULL; input.inputProcRefCon = NULL; status = AudioUnitSetProperty (osxbuf->audiounit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, /* N/A for global */ &input, sizeof (input)); if (status) { GST_WARNING_OBJECT (osxbuf, "Failed to remove render callback"); } /* Remove the RenderNotify too */ status = AudioUnitRemoveRenderNotify (osxbuf->audiounit, (AURenderCallback) gst_osx_ring_buffer_render_notify, osxbuf); if (status) { GST_WARNING_OBJECT (osxbuf, "Failed to remove render notify callback"); } /* We're deactivated.. */ osxbuf->io_proc_needs_deactivation = FALSE; osxbuf->io_proc_active = FALSE; } static OSStatus gst_osx_ring_buffer_render_notify (GstOsxRingBuffer * osxbuf, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, unsigned int inBusNumber, unsigned int inNumberFrames, AudioBufferList * ioData) { /* Before rendering a frame, we get the PreRender notification. * Here, we detach the RenderCallback if we've been paused. * * This is necessary (rather than just directly detaching it) to work * around some thread-safety issues in CoreAudio */ if ((*ioActionFlags) & kAudioUnitRenderAction_PreRender) { if (osxbuf->io_proc_needs_deactivation) { gst_osx_ring_buffer_remove_render_callback (osxbuf); } } return noErr; } static gboolean gst_osx_ring_buffer_start (GstRingBuffer * buf) { OSStatus status; GstOsxRingBuffer *osxbuf; AURenderCallbackStruct input; AudioUnitPropertyID callback_type; osxbuf = GST_OSX_RING_BUFFER (buf); GST_DEBUG ("osx ring buffer start ioproc: 0x%p device_id %lu", osxbuf->element->io_proc, (gulong) osxbuf->device_id); if (!osxbuf->io_proc_active) { callback_type = osxbuf->is_src ? kAudioOutputUnitProperty_SetInputCallback : kAudioUnitProperty_SetRenderCallback; input.inputProc = (AURenderCallback) osxbuf->element->io_proc; input.inputProcRefCon = osxbuf; status = AudioUnitSetProperty (osxbuf->audiounit, callback_type, kAudioUnitScope_Global, 0, /* N/A for global */ &input, sizeof (input)); if (status) { GST_WARNING ("AudioUnitSetProperty returned %d", (int) status); return FALSE; } // ### does it make sense to do this notify stuff for input mode? status = AudioUnitAddRenderNotify (osxbuf->audiounit, (AURenderCallback) gst_osx_ring_buffer_render_notify, osxbuf); if (status) { GST_WARNING ("AudioUnitAddRenderNotify returned %d", (int) status); return FALSE; } osxbuf->io_proc_active = TRUE; } osxbuf->io_proc_needs_deactivation = FALSE; status = AudioOutputUnitStart (osxbuf->audiounit); if (status) { GST_WARNING ("AudioOutputUnitStart returned %d", (int) status); return FALSE; } return TRUE; } // ### static gboolean gst_osx_ring_buffer_pause (GstRingBuffer * buf) { GstOsxRingBuffer *osxbuf = GST_OSX_RING_BUFFER (buf); GST_DEBUG ("osx ring buffer pause ioproc: 0x%p device_id %lu", osxbuf->element->io_proc, (gulong) osxbuf->device_id); if (osxbuf->io_proc_active) { /* CoreAudio isn't threadsafe enough to do this here; we must deactivate * the render callback elsewhere. See: * http://lists.apple.com/archives/Coreaudio-api/2006/Mar/msg00010.html */ osxbuf->io_proc_needs_deactivation = TRUE; } return TRUE; } // ### static gboolean gst_osx_ring_buffer_stop (GstRingBuffer * buf) { OSErr status; GstOsxRingBuffer *osxbuf; osxbuf = GST_OSX_RING_BUFFER (buf); GST_DEBUG ("osx ring buffer stop ioproc: 0x%p device_id %lu", osxbuf->element->io_proc, (gulong) osxbuf->device_id); status = AudioOutputUnitStop (osxbuf->audiounit); if (status) GST_WARNING ("AudioOutputUnitStop returned %d", (int) status); // ###: why is it okay to directly remove from here but not from pause() ? if (osxbuf->io_proc_active) { gst_osx_ring_buffer_remove_render_callback (osxbuf); } return TRUE; } static guint gst_osx_ring_buffer_delay (GstRingBuffer * buf) { double latency; UInt32 size = sizeof (double); GstOsxRingBuffer *osxbuf; OSStatus status; guint samples; osxbuf = GST_OSX_RING_BUFFER (buf); status = AudioUnitGetProperty (osxbuf->audiounit, kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0, /* N/A for global */ &latency, &size); if (status) { GST_WARNING_OBJECT (buf, "Failed to get latency: %d", (int) status); return 0; } samples = latency * GST_RING_BUFFER (buf)->spec.rate; GST_DEBUG_OBJECT (buf, "Got latency: %f seconds -> %d samples", latency, samples); return samples; } static AudioBufferList * buffer_list_alloc (int channels, int size) { AudioBufferList *list; int total_size; int n; total_size = sizeof (AudioBufferList) + 1 * sizeof (AudioBuffer); list = (AudioBufferList *) g_malloc (total_size); list->mNumberBuffers = 1; for (n = 0; n < (int) list->mNumberBuffers; ++n) { list->mBuffers[n].mNumberChannels = channels; list->mBuffers[n].mDataByteSize = size; list->mBuffers[n].mData = g_malloc (size); } return list; } static void buffer_list_free (AudioBufferList * list) { int n; for (n = 0; n < (int) list->mNumberBuffers; ++n) { if (list->mBuffers[n].mData) g_free (list->mBuffers[n].mData); } g_free (list); } gst-plugins-good-0.10.31/README0000644000175000017500000002243511671175352012675 00000000000000WHAT IT IS ---------- This is GStreamer, a framework for streaming media. WHERE TO START -------------- We have a website at http://gstreamer.freedesktop.org/ You should start by going through our FAQ at http://gstreamer.freedesktop.org/data/doc/gstreamer/head/faq/html/ There is more documentation; go to http://gstreamer.freedesktop.org/documentation You can subscribe to our mailing lists; see the website for details. We track bugs in GNOME's bugzilla; see the website for details. You can join us on IRC - #gstreamer on irc.freenode.org GStreamer 0.10 series --------------------- Starring GSTREAMER The core around which all other modules revolve. Base functionality and libraries, some essential elements, documentation, and testing. BASE A well-groomed and well-maintained collection of GStreamer plug-ins and elements, spanning the range of possible types of elements one would want to write for GStreamer. And introducing, for the first time ever, on the development screen ... THE GOOD --- "Such ingratitude. After all the times I've saved your life." A collection of plug-ins you'd want to have right next to you on the battlefield. Shooting sharp and making no mistakes, these plug-ins have it all: good looks, good code, and good licensing. Documented and dressed up in tests. If you're looking for a role model to base your own plug-in on, here it is. If you find a plot hole or a badly lip-synced line of code in them, let us know - it is a matter of honour for us to ensure Blondie doesn't look like he's been walking 100 miles through the desert without water. THE UGLY --- "When you have to shoot, shoot. Don't talk." There are times when the world needs a color between black and white. Quality code to match the good's, but two-timing, backstabbing and ready to sell your freedom down the river. These plug-ins might have a patent noose around their neck, or a lock-up license, or any other problem that makes you think twice about shipping them. We don't call them ugly because we like them less. Does a mother love her son less because he's not as pretty as the other ones ? No - she commends him on his great personality. These plug-ins are the life of the party. And we'll still step in and set them straight if you report any unacceptable behaviour - because there are two kinds of people in the world, my friend: those with a rope around their neck and the people who do the cutting. THE BAD --- "That an accusation?" No perfectly groomed moustache or any amount of fine clothing is going to cover up the truth - these plug-ins are Bad with a capital B. They look fine on the outside, and might even appear to get the job done, but at the end of the day they're a black sheep. Without a golden-haired angel to watch over them, they'll probably land in an unmarked grave at the final showdown. Don't bug us about their quality - exercise your Free Software rights, patch up the offender and send us the patch on the fastest steed you can steal from the Confederates. Because you see, in this world, there's two kinds of people, my friend: those with loaded guns and those who dig. You dig. The Lowdown ----------- --- "I've never seen so many plug-ins wasted so badly." GStreamer Plug-ins has grown so big that it's hard to separate the wheat from the chaff. Also, distributors have brought up issues about the legal status of some of the plug-ins we ship. To remedy this, we've divided the previous set of available plug-ins into four modules: - gst-plugins-base: a small and fixed set of plug-ins, covering a wide range of possible types of elements; these are continuously kept up-to-date with any core changes during the development series. - We believe distributors can safely ship these plug-ins. - People writing elements should base their code on these elements. - These elements come with examples, documentation, and regression tests. - gst-plugins-good: a set of plug-ins that we consider to have good quality code, correct functionality, our preferred license (LGPL for the plug-in code, LGPL or LGPL-compatible for the supporting library). - We believe distributors can safely ship these plug-ins. - People writing elements should base their code on these elements. - gst-plugins-ugly: a set of plug-ins that have good quality and correct functionality, but distributing them might pose problems. The license on either the plug-ins or the supporting libraries might not be how we'd like. The code might be widely known to present patent problems. - Distributors should check if they want/can ship these plug-ins. - People writing elements should base their code on these elements. - gst-plugins-bad: a set of plug-ins that aren't up to par compared to the rest. They might be close to being good quality, but they're missing something - be it a good code review, some documentation, a set of tests, a real live maintainer, or some actual wide use. If the blanks are filled in they might be upgraded to become part of either gst-plugins-good or gst-plugins-ugly, depending on the other factors. - If the plug-ins break, you can't complain - instead, you can fix the problem and send us a patch, or bribe someone into fixing them for you. - New contributors can start here for things to work on. PLATFORMS --------- - Linux is of course fully supported - FreeBSD is reported to work; other BSD's should work too - Solaris is reported to work; a specific sunaudiosink plugin has been written - MacOSX is reported to work; specific audio and video sinks have been written - Windows support is experimental but improving. Output sinks have been written but are not yet included in the code. We support - MSys/MingW builds - Microsoft Visual Studio 6 builds (see win32/README.txt) INSTALLING FROM PACKAGES ------------------------ You should always prefer installing from packages first. GStreamer is well-maintained for a number of distributions, including Fedora, Debian, Ubuntu, Mandrake, Gentoo, ... Only in cases where you: - want to hack on GStreamer - want to verify that a bug has been fixed - do not have a sane distribution should you choose to build from source tarballs or CVS. Find more information about the various packages at http://gstreamer.freedesktop.org/download/ COMPILING FROM SOURCE TARBALLS ------------------------------ - again, make sure that you really need to install from source ! If GStreamer is one of your first projects ever that you build from source, consider taking on an easier project. - check output of ./configure --help to see if any options apply to you - run ./configure make to build GStreamer. - if you want to install it (not required, but what you usually want to do), run make install - try out a simple test: gst-launch -v fakesrc num_buffers=5 ! fakesink (If you didn't install GStreamer, prefix gst-launch with tools/) If it outputs a bunch of messages from fakesrc and fakesink, everything is ok. If it did not work, keep in mind that you might need to adjust the PATH and/or LD_LIBRARY_PATH environment variables to make the system find GStreamer in the prefix where you installed (by default that is /usr/local). - After this, you're ready to install gst-plugins, which will provide the functionality you're probably looking for by now, so go on and read that README. COMPILING FROM CVS ------------------ When building from CVS sources, you will need to run autogen.sh to generate the build system files. You will need a set of additional tools typical for building from CVS, including: - autoconf - automake - libtool autogen.sh will check for recent enough versions and complain if you don't have them. You can also specify specific versions of automake and autoconf with --with-automake and --with-autoconf Check autogen.sh options by running autogen.sh --help autogen.sh can pass on arguments to configure - you just need to separate them from autogen.sh with -- between the two. prefix has been added to autogen.sh but will be passed on to configure because some build scripts like that. When you have done this once, you can use autoregen.sh to re-autogen with the last passed options as a handy shortcut. Use it. After the autogen.sh stage, you can follow the directions listed in "COMPILING FROM SOURCE" You can also run your whole cvs stack uninstalled. The script in the gstreamer module /docs/faq/gst-uninstalled) is helpful in setting up your environment for this. PLUG-IN DEPENDENCIES AND LICENSES --------------------------------- GStreamer is developed under the terms of the LGPL (see LICENSE file for details). Some of our plug-ins however rely on libraries which are available under other licenses. This means that if you are distributing an application which has a non-GPL compatible license (for instance a closed-source application) with GStreamer, you have to make sure not to distribute GPL-linked plug-ins. When using GPL-linked plug-ins, GStreamer is for all practical reasons under the GPL itself. HISTORY ------- The fundamental design comes from the video pipeline at Oregon Graduate Institute, as well as some ideas from DirectMedia. It's based on plug-ins that will provide the various codec and other functionality. The interface hopefully is generic enough for various companies (ahem, Apple) to release binary codecs for Linux, until such time as they get a clue and release the source. gst-plugins-good-0.10.31/gconf/0000755000175000017500000000000011720565345013163 500000000000000gst-plugins-good-0.10.31/gconf/Makefile.am0000644000175000017500000000174611671175352015147 00000000000000GST_SCHEMA_FILES = gstreamer-@GST_MAJORMINOR@.schemas if USE_GCONF schemadir = @GCONF_SCHEMA_FILE_DIR@ schema_DATA = $(GST_SCHEMA_FILES) endif gstreamer-@GST_MAJORMINOR@.schemas: gstreamer.schemas cp gstreamer.schemas gstreamer-@GST_MAJORMINOR@.schemas if USE_GCONF if GCONF_SCHEMAS_INSTALL install-data-local: @GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) \ --makefile-install-rule $(builddir)/$(schema_DATA) || \ (echo ;\ echo "*****************************************************"; \ echo "Installation of schemas failed, install them manually"; \ echo "*****************************************************";) @true else install-data-local: @echo "***************************************************************" @echo "Not installing schemas, disabled with --disable-schemas-install" @echo "***************************************************************" @true endif endif # USE_GCONF CLEANFILES = $(GST_SCHEMA_FILES) EXTRA_DIST = $(GST_SCHEMA_FILES) gst-plugins-good-0.10.31/gconf/Makefile.in0000644000175000017500000005251611720560227015153 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gconf DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/gstreamer.schemas.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = gstreamer.schemas CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(schemadir)" DATA = $(schema_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ GST_SCHEMA_FILES = gstreamer-@GST_MAJORMINOR@.schemas @USE_GCONF_TRUE@schemadir = @GCONF_SCHEMA_FILE_DIR@ @USE_GCONF_TRUE@schema_DATA = $(GST_SCHEMA_FILES) CLEANFILES = $(GST_SCHEMA_FILES) EXTRA_DIST = $(GST_SCHEMA_FILES) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gconf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gconf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): gstreamer.schemas: $(top_builddir)/config.status $(srcdir)/gstreamer.schemas.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-schemaDATA: $(schema_DATA) @$(NORMAL_INSTALL) test -z "$(schemadir)" || $(MKDIR_P) "$(DESTDIR)$(schemadir)" @list='$(schema_DATA)'; test -n "$(schemadir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(schemadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(schemadir)" || exit $$?; \ done uninstall-schemaDATA: @$(NORMAL_UNINSTALL) @list='$(schema_DATA)'; test -n "$(schemadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(schemadir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(schemadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @USE_GCONF_FALSE@install-data-local: clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-schemaDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-schemaDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-schemaDATA install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-schemaDATA gstreamer-@GST_MAJORMINOR@.schemas: gstreamer.schemas cp gstreamer.schemas gstreamer-@GST_MAJORMINOR@.schemas @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@install-data-local: @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ @GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) \ @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ --makefile-install-rule $(builddir)/$(schema_DATA) || \ @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ (echo ;\ @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ echo "*****************************************************"; \ @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ echo "Installation of schemas failed, install them manually"; \ @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ echo "*****************************************************";) @GCONF_SCHEMAS_INSTALL_TRUE@@USE_GCONF_TRUE@ @true @GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@install-data-local: @GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @echo "***************************************************************" @GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @echo "Not installing schemas, disabled with --disable-schemas-install" @GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @echo "***************************************************************" @GCONF_SCHEMAS_INSTALL_FALSE@@USE_GCONF_TRUE@ @true # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gconf/gstreamer-0.10.schemas0000644000175000017500000002141411720561333017010 00000000000000 /schemas/system/gstreamer/0.10/default/audiosink /system/gstreamer/0.10/default/audiosink gstreamer string autoaudiosink default GStreamer audiosink GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/audiosink_description /system/gstreamer/0.10/default/audiosink_description gstreamer string Default description for default GStreamer audiosink Describes the selected output element. /schemas/system/gstreamer/0.10/default/musicaudiosink /system/gstreamer/0.10/default/musicaudiosink gstreamer string autoaudiosink GStreamer audiosink for Music and Movies GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/musicaudiosink_description /system/gstreamer/0.10/default/musicaudiosink_description gstreamer string Default description for GStreamer audiosink for Music and Movies Describes the selected output element for Music and Movies. /schemas/system/gstreamer/0.10/default/chataudiosink /system/gstreamer/0.10/default/chataudiosink gstreamer string autoaudiosink GStreamer audiosink for Audio/Video Conferencing GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/chataudiosink_description /system/gstreamer/0.10/default/chataudiosink_description gstreamer string Default description for GStreamer audiosink for Audio/Video Conferencing Describes the selected output element for Audio/Video Conferencing. /schemas/system/gstreamer/0.10/default/audiosink_description /system/gstreamer/0.10/default/audiosink_description gstreamer string Default description for default GStreamer audiosink Describes the selected output element. /schemas/system/gstreamer/0.10/default/musicaudiosink /system/gstreamer/0.10/default/musicaudiosink gstreamer string autoaudiosink GStreamer audiosink for Music and Movies GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/musicaudiosink_description /system/gstreamer/0.10/default/musicaudiosink_description gstreamer string Default description for GStreamer audiosink for Music and Movies Describes the selected output element for Music and Movies. /schemas/system/gstreamer/0.10/default/chataudiosink /system/gstreamer/0.10/default/chataudiosink gstreamer string autoaudiosink GStreamer audiosink for Audio/Video Conferencing GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/chataudiosink_description /system/gstreamer/0.10/default/chataudiosink_description gstreamer string Default description for GStreamer audiosink for Audio/Video Conferencing Describes the selected output element for Audio/Video Conferencing. /schemas/system/gstreamer/0.10/default/videosink /system/gstreamer/0.10/default/videosink gstreamer string autovideosink default GStreamer videosink GStreamer can play video using any number of output elements. Some possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. The videosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/audiosrc /system/gstreamer/0.10/default/audiosrc gstreamer string alsasrc default GStreamer audio source GStreamer can record audio using any number of input elements. Some possible choices are osssrc, esdsrc and alsasrc. The audio source can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/audiosrc_description /system/gstreamer/0.10/default/audiosrc_description gstreamer string Default description for default GStreamer audiosrc Describes the selected input element. /schemas/system/gstreamer/0.10/default/audiosrc_description /system/gstreamer/0.10/default/audiosrc_description gstreamer string Default description for default GStreamer audiosrc Describes the selected input element. /schemas/system/gstreamer/0.10/default/videosrc /system/gstreamer/0.10/default/videosrc gstreamer string v4l2src default GStreamer video source GStreamer can record video from any number of input elements. Some possible choices are v4lsrc and videotestsrc. The video source can be a partial pipeline instead of just one element. /schemas/system/gstreamer/0.10/default/visualization /system/gstreamer/0.10/default/visualization gstreamer string goom default GStreamer visualization plugin GStreamer can put visualization plugins in a pipeline to transform audio stream in video frames. Default is goom but more visualization plugins will be ported soon. The visualization plugin can be a partial pipeline instead of just one element. gst-plugins-good-0.10.31/gconf/gstreamer.schemas.in0000644000175000017500000002235611671175352017056 00000000000000 /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosink /system/gstreamer/@GST_MAJORMINOR@/default/audiosink gstreamer string @DEFAULT_AUDIOSINK@ default GStreamer audiosink GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description /system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description gstreamer string Default description for default GStreamer audiosink Describes the selected output element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink gstreamer string @DEFAULT_AUDIOSINK@ GStreamer audiosink for Music and Movies GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description gstreamer string Default description for GStreamer audiosink for Music and Movies Describes the selected output element for Music and Movies. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink gstreamer string @DEFAULT_AUDIOSINK@ GStreamer audiosink for Audio/Video Conferencing GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description gstreamer string Default description for GStreamer audiosink for Audio/Video Conferencing Describes the selected output element for Audio/Video Conferencing. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description /system/gstreamer/@GST_MAJORMINOR@/default/audiosink_description gstreamer string Default description for default GStreamer audiosink Describes the selected output element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink gstreamer string @DEFAULT_AUDIOSINK@ GStreamer audiosink for Music and Movies GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description /system/gstreamer/@GST_MAJORMINOR@/default/musicaudiosink_description gstreamer string Default description for GStreamer audiosink for Music and Movies Describes the selected output element for Music and Movies. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink gstreamer string @DEFAULT_AUDIOSINK@ GStreamer audiosink for Audio/Video Conferencing GStreamer can play audio using any number of output elements. Some possible choices are osssink, esdsink and alsasink. The audiosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description /system/gstreamer/@GST_MAJORMINOR@/default/chataudiosink_description gstreamer string Default description for GStreamer audiosink for Audio/Video Conferencing Describes the selected output element for Audio/Video Conferencing. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/videosink /system/gstreamer/@GST_MAJORMINOR@/default/videosink gstreamer string @DEFAULT_VIDEOSINK@ default GStreamer videosink GStreamer can play video using any number of output elements. Some possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. The videosink can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosrc /system/gstreamer/@GST_MAJORMINOR@/default/audiosrc gstreamer string @DEFAULT_AUDIOSRC@ default GStreamer audio source GStreamer can record audio using any number of input elements. Some possible choices are osssrc, esdsrc and alsasrc. The audio source can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description /system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description gstreamer string Default description for default GStreamer audiosrc Describes the selected input element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description /system/gstreamer/@GST_MAJORMINOR@/default/audiosrc_description gstreamer string Default description for default GStreamer audiosrc Describes the selected input element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/videosrc /system/gstreamer/@GST_MAJORMINOR@/default/videosrc gstreamer string @DEFAULT_VIDEOSRC@ default GStreamer video source GStreamer can record video from any number of input elements. Some possible choices are v4lsrc and videotestsrc. The video source can be a partial pipeline instead of just one element. /schemas/system/gstreamer/@GST_MAJORMINOR@/default/visualization /system/gstreamer/@GST_MAJORMINOR@/default/visualization gstreamer string @DEFAULT_VISUALIZER@ default GStreamer visualization plugin GStreamer can put visualization plugins in a pipeline to transform audio stream in video frames. Default is goom but more visualization plugins will be ported soon. The visualization plugin can be a partial pipeline instead of just one element. gst-plugins-good-0.10.31/gst-plugins-good.doap0000644000175000017500000003537611720553102016060 00000000000000 GStreamer Good Plug-ins gst-plugins-good 2005-09-06 a set of good-quality plug-ins under our preferred license, LGPL GStreamer Good Plug-ins is a set of plug-ins that we consider to have good quality code and correct functionality, under our preferred license (LGPL for the plug-in code, LGPL or LGPL-compatible for the supporting library). C 0.10.31 0.10 Faster 2012-02-20 0.10.30 0.10 Adagio 2011-06-15 0.10.29 0.10 Soft Cheese Enthusiast 2011-05-10 0.10.28 0.10 Inconvenienced by the Solar System 2011-03-08 0.10.27 0.10 Some Kind of Temporal Blend 2011-01-21 0.10.26 0.10 Escapades 2010-12-01 0.10.25 0.10 Woe to You Oh Earth and Sea 2010-09-02 0.10.24 0.10 Taking Liberties 2010-07-15 0.10.23 0.10 Stylish Kids in Riot 2010-05-30 0.10.22 0.10 Square One 2010-04-27 0.10.21 0.10 Lemons 2010-03-08 0.10.20 0.10 Lemonade 2010-03-08 0.10.19 0.10 Closer to the Edit 2010-03-06 0.10.18 0.10 Short Circuit 2010-02-10 0.10.17 0.10 They used to sparkle 2009-11-17 0.10.16 0.10 Secret Handshakes 2009-08-28 0.10.15 0.10 I've been up all night 2009-05-20 0.10.14 0.10 Disaffected Affectation 2009-02-19 0.10.13 0.10 Blatant Discouragement 2009-01-22 0.10.12 0.10 Taken Under Advisement 2009-01-22 0.10.11 0.10 Secondary Consideration 2008-10-24 0.10.10 0.10 Barely Moving 2008-08-26 0.10.9 0.10 Steam Train Rolling 2008-07-31 0.10.8 0.10 One For The Money 2008-04-24 0.10.7 0.10 Red Door Black 2008-01-20 0.10.6 0.10 Wobble Board 2007-06-19 0.10.5 0.10 The Path of Thorns 2006-12-21 0.10.4 0.10 Dear Leader 2006-08-14 0.10.3 0.10 Desplazado 2006-05-04 0.10.2 0.10 Papa was a rolling stone 2006-02-09 0.10.1 0.10 Li 2006-01-13 0.10.0 0.10 Abondance 2005-12-05 Wim Taymans 0d93fde052812d51a05fd86de9bdbf674423daa2 gst-plugins-good-0.10.31/RELEASE0000644000175000017500000005056511720563471013023 00000000000000 Release notes for GStreamer Good Plug-ins 0.10.31 "Faster" The GStreamer team is proud to announce a new release in the 0.10.x stable series of the GStreamer Good Plug-ins. The 0.10.x series is a stable series targeted at end users. "Such ingratitude. After all the times I've saved your life." A collection of plug-ins you'd want to have right next to you on the battlefield. Shooting sharp and making no mistakes, these plug-ins have it all: good looks, good code, and good licensing. Documented and dressed up in tests. If you're looking for a role model to base your own plug-in on, here it is. If you find a plot hole or a badly lip-synced line of code in them, let us know - it is a matter of honour for us to ensure Blondie doesn't look like he's been walking 100 miles through the desert without water. This module contains a set of plug-ins that we consider to have good quality code, correct functionality, our preferred license (LGPL for the plug-in code, LGPL or LGPL-compatible for the supporting library). We believe distributors can safely ship these plug-ins. People writing elements should base their code on these elements. Other modules containing plug-ins are: gst-plugins-base contains a basic set of well-supported plug-ins gst-plugins-ugly contains a set of well-supported plug-ins, but might pose problems for distributors gst-plugins-bad contains a set of less supported plug-ins that haven't passed the rigorous quality testing we expect Features of this release * audioparsers: propagate downstream caps constraints upstream * ac3parse: add support for IEC 61937 alignment and conversion/switching between alignments * ac3parse: let bsid 9 and 10 through * auparse: implement seeking * avidemux: fix wrong stride when inverting uncompressed video * cairotextoverlay: add a "silent" property to skip rendering; forward new segment events * deinterlace: add support for deinterlacing using buffer caps/flags (as set by e.g. fieldanalysis) * deinterlace: new fieldanalysis-related properties: "locking" and "ignore-obscure" * directsoundsink: fix negotiation/device setup: 16-bit audio is signed, 8-bit is unsigned * effecttv: fix reverse negotiation; repair color modes in radioactv by taking rgb,bgr into account * equalizer: also sync the parameters for the filter bands * flacdec: better timestamp/offset handling; try upstream first for duration queries * flacdec: send EOS when seeking after the end of file instead of failing * flacenc: do not drop the first data buffer on the floor * flacparse: detect when a file lies about fixed block size; ignore invalid minimum_blocksize * flacparse: more accurate/better duration/timestamp handling * flvdemux: better timestamp handling (negative cts, detect large pts gaps; fix discontinuity threshold check when timestamps go backwards) * flvmux: properly determine final duration; metadata/header writing fixes * gdkpixbufsink: fix inverted pixel-aspect-ratio info on pixbufs * jack: add "client-name" property to jackaudiosink and jackaudiosrc * jpegdec: add sof-marker to template caps, so we don't get plugged for lossless jpeg * jpegdec: Implement upstream negotiation * matroskademux: seeking fixes; better handling of non-finalized files * matroskademux: better timestamp/duration handling, fix some stuttering A/V * matroskademux: add "max-gap-time" property to make gap handling configurable * matroskademux: UTF-8 subtitles may have markup * matroskamux: do not use unoffical V_MJPEG codec id * matroskamux: fix segment handling, so we actually use running time * matroskamux: for streaming files, push tags first * matroskamux: handle GstForceKeyUnit event * multifile: new splitfilesrc element to read multiple files as if they were one single file * multifilesrc: add "loop" property * multifilesink: handle buffer lists, useful to keep groups of buffers (GOPs) in the same file * multifilesink: add flag to cut after a force key unit event * multifilesink: add "max-files" property * multifilesink: add new 'max-size' mode and "max-file-size" property for switching to the next file based on size * multifilesink: write stream-headers when switching to the next file in max-size mode * multipartdemux: Add property to assume a single stream and emit no-more-pads * multipartmux: Add \r\n to tail of pushed buffers * navseek: toggle pause/play on space bar * osxvideo: Fix leak of NSOpenGLPixelFormat object * pcmadepay,pcmudepay: allow variable sample rate * pngenc: increase arbitrary resolution limits * pulse: Drop support for PA versions before 0.9.16 (1.x is recommended) * pulse: new pulseaudiosink element to handle format changes (not autoplugged yet) * pulsesink: add support for compressed audio format passthrough (S/PDIF, mp3-over-bluetooth) * pulsesink: Allow writes in bigger chunks * pulsesink: Use the extended stream API if available * pulsesrc: add a "source-output-index" property; implement GstStreamVolume interface * qtdemux: better fragmented support (avoid adjustment for keyframe seek; mark all audio track samples as keyframe) * qtdemux: parse embedded ID32 tags; improve bitrate guessing/extraction * qtdemux: push mode fixes, fix buffered streaming * qtmux: add direct dirac mapping * qtmux: calculate average bitrate for streams * qtmux: fix ctts generation for streams that don't start at 0 timestamps * qtmux: use GST_TAG_IMAGE for coverart too * ismlmux: Use iso-fragmented as variant type (useful in connection with encodebin) * rtph263ppay: implement getcaps following RFC 4629, picks the right annexes * rtph263ppay: set H263-2000 if thats what the other side wants * rtph264depay: complete merged AU on marker bit (thus reducing latency) * rtph264depay: cope with FU-A E bit not being set (caused by buggy payloaders) * rtph264depay: exclude NALu size from payload length on truncated packets * rtph264pay: proxy downstream caps restrictions (converting profile-level-id from RTP caps into video/x-h264 style caps) * rtph264pay: only set the marker bit on the last NALU of a multi-NALU access unit * rtpjpegpay: add support for H.264 payload in MJPEG container * rtpjpegpay: fix for "odd" resolutions not a multiple of DCTSIZE * rtpmp4adepay: fix output buffer timestamps in case of multiple frames * rtpmp4gdepay: improve bogus interleaved index compensating * rtpmp4vpay: deprecated send-config property and replace by config-interval * rtppcmapay/depay: static clock rates on static payloads, dynamic on dynamic * rtpvrawpay,-depay: RGB video payloading/depayloading fixes * rtpg722pay: Compensate for clockrate vs. samplerate difference * rtpbin: allow configurable rtcp stream syncing interval * rtpbin: new "rtcp-sync" property, alternative inter-stream syncing methods * rtpjitterbuffer/rtpbin: relax dropping rtcp packets; misc other fixes * rtpmanager: don't reveal the user's username, hostname or real name by default * rtpsession: process received Full Intra Requests (FIR) * rtpsession: add special mode to use FIR as repair as Google does * rtpsession: send FIR requests in response to key unit requests with all-headers=TRUE * rtpsession: always send application requested feedback in immediate mode * rtpsession: put the PLI requests in each RTPSource * rtpsession: wait longer to timeout SSRC collision * rtspsrc: implement async network I/O * rtspsrc: allow sending short RTSP requests to a server * rtspsrc: configure rtcp interval if provided * rtspsrc: open on play and pause when not done yet * shout2send: send video/webm through libshout * soup: new souphttpclientsink element * udpsrc: drop dataless UDP packets * v4l2: take care not to change the current format where appropriate * v4l2src, v4l2sink: add "norm" property; default to a pixel-aspect-ratio of 1/1 * v4l2src: do not ignore the highest frame interval or the largest resolution * v4l2src: handle some feature query failures more gracefully * videobox: avoid wrapping opaque to transparent * wavenc: Allow setcaps to be called after a format was negotiated if it's compatible * ximagesrc: add "xid" and "xname" properties to allow capturing a particular window * ximagesrc: fallback to non-XShm mode if allocating the XShm image failed * ximagesrc: clear flags on buffer reuse, so that flags like DISCONT aren't set accidentally Bugs fixed in this release * 668320 : rtpmanager: RTCP receiver reports reveal full user name * 652727 : multifilesrc: add ability to loop * 657422 : [souphttpsrc] The souphttpsrc plugin doesn't work behind a proxy that requires authentication * 432612 : [matroskamux] doesn't handle segments correctly * 541215 : [avimux] Dirac muxing is broken and results in A/V sync issues * 546932 : [ximagesrc] allow recording of specific window only * 571400 : RTSP blocks in gst_element_set_state( GST_STATE_PAUSED ) and incorrect url * 576524 : rtpbin, jitterbuffer: add mode to support for recording RTP streams * 586450 : [cairotextoverlay] Forward upstream events to both sinkpads * 595055 : [pulsesrc] Should implement GstStreamVolume interface * 605834 : directsoundsink: 16-bit audio is always signed while 8-bit is always unsigned * 610916 : rtspsrc dosen't work under windows * 614803 : v4l2: add tv-norm property * 616686 : multipartdemux: add " single-stream " property to emit no-more-pads earlier * 616936 : [matroskademux] Incorrect display of subtitles with markup * 619548 : qtdemux: Guess bitrate if only one stream's bitrate is unknown * 619590 : [matroskademux] Doesn't protect segment and other fields from concurrent changes from different threads * 620186 : qtdemux: Export max bitrate for AMR-NB/-WB streams * 622412 : [rtpmp4vpay] remove send-config parameter; obsoleted by config-interval * 624887 : pitivi playback hangs / errors while playing mov clips on clip change * 630456 : [ximagesrc] Fallback to non-XShm mode if image allocation fails * 631430 : [flvdemux] Cannot play .flv to the end * 632504 : [rtspsrc] reduce or avoid (network) hang during shutdown * 634093 : RTSP client asks for unicast from multicast only server * 638300 : v4l2src: make this work more than once in a row * 639217 : udpsrc: allow skip-first-bytes of full buffer size * 640323 : [cairotextoverlay] forward new segment events from the sink to the source * 643847 : deinterlace: Add support for deinterlacing using buffer caps/flags * 644151 : [multifilesink] Add option to create a new file after each GstForceKeyUnit event * 644154 : [matroskamux] Force a new cluster after each GstForceKeyUnit event * 644512 : [auparse] Add seeking * 647540 : autoaudiosink picks element to use by rank, but pulsesink/alsasink/jackaudiosink are all PRIMARY * 648312 : [v4l2sink] Unconditionally accepts video/mpegts * 648642 : rtpsession: Ensure ssrc collisions aren't timed out immediately * 648937 : matroskademux: avoid building index when streamable * 649067 : v4l2src: got unexpected frame size of 262254 instead of 614400 * 649617 : [rtp] Deadlock and other fixes for rtpssrcdemux * 649780 : flac: seek beyond end fails instead of EOSing immediately * 649955 : flvmux: add support for mpegversion 2, which is also AAC * 650258 : matroskademux/matroskaparse: gst_element_query_duration returns wrong value for Matroska files * 650313 : ac3parse: Add support for iec61937 alignment * 650503 : [dvdemux] Broken DURATION query handling * 650555 : [aacparse] AAC profiles needed in caps * 650691 : [flacparse] regression playing some flac files * 650714 : [amrparse] skips first few frames (problem in checking sync) * 650785 : [flacparse] duration query in DEFAULT format failing with flacparse in pipeline (regression) * 650877 : matroska: refactor code common to matroskademux and matroskaparse * 650912 : Rare leak in qtdemux * 650916 : REGRESSION: ssrcdemux causing FLOW_NOT_LINKED * 650937 : deinterlace: fix parameter type in trace * 651059 : rtspsrc: uniform unknown message handling * 651443 : multifilesink: add next-file=max-size mode and max-file-size property * 652195 : matroskademux: seeking in non-finalized matroska files does not work correctly * 652286 : matroskaparse: Gstreamer-CRITICAL when changing state from PAUSED to READY * 652467 : matroska: missing < stdio.h > include for sscanf * 653080 : matroskamux: make check for block_duration less sensitive * 653091 : [dv1394src] Make the internal clock thread-safe * 653327 : configure script for gst-plugins-good selects shout2 when it's not present * 653559 : aacparse: too greedy minimum frame size * 653709 : [ximagesrc] sets DISCONT on half the buffers * 654175 : matroskademux: handle blocks with duration=0 * 654379 : matroskamux: make default framerate optional per stream * 654583 : Immediate RTCP in rtpsession * 654585 : rtpmp4gdepay choppy sound * 654744 : matroskademux: fix aspect ratio if header has only onle display variable set * 654749 : goom: unbreak build on PPC on openbsd * 654816 : [rtspsrc] rtspsrc doesn't get eos if it's wrapped into a bin * 655530 : Logitech B990 HD Webcam yields poor video in MJPEG mode. * 655570 : qtdemux: assertion error when playing Apple Trailers * 655805 : Make the extended RTSP headers optional * 655866 : jackaudiosink: Don't call g_alloca in jack_process_cb * 655918 : qtdemux : qtdemux_add_fragmented_samples return error. * 656104 : v4l2src fails to correctly configure the framerate * 656606 : crash in gst_spectrum_reset_message_data() * 656649 : flacparse: fix off by one in frame size check * 656734 : [aacparse] Assumes 1024 samples per frame * 657080 : aacparse: failing test due to two buffers being dropped for one sync loss * 657179 : pulse: New pulseaudiosink element to handle format changes * 657376 : rtspsrc regression * 657830 : multiudpsink: make add/remove/clear/get-stats action signals * 658178 : udpsrc: rough error reporting when using an invalid URI * 658305 : [souphttpsrc] can’t seek during double speed playback * 658419 : Add FIR support to rtpsession * 658543 : [v4l2src] Use GST_RESOURCE_ERROR_BUSY if webcam is already used * 658546 : ac3parse: RealAudio file with AC-3 audio no longer plays * 659009 : [matroskademux] property for configuring gap handling * 659065 : navseek: toggle pause/play on space bar * 659153 : matroskademux: fix stuttering A/V * 659237 : [gstrtpbin] clock is not unreffed after finish using it * 659242 : [matroskademux] Unexpected EOS when seeking on paused matroska file * 659798 : Segfault when you convert with audioconvert from audio file mkv to audio file avi * 659808 : matroskademux: misc fixes * 659837 : matroskamux: unable to mux audio/x-raw-int,rate=8000,channels=1,endianness=1234,width=16,depth=16,signed=true * 659943 : [ac3parse] it does not correcly check for ac3/e-ac3 switch * 660249 : won't play wav file: invalid WAV header (no fmt at start): ID32 * 660275 : jpegdec doesn't implement upstream negotiation * 660294 : goom2k1: Fix mingw compiler warnings * 660448 : videomixer2: memory leak * 660468 : speexenc: fix calculation of filler data size * 660481 : v4l, ximagesrc: printf format warnings * 660969 : qtmux memleak * 661049 : matroskademux: support seek with start_type NONE * 661215 : flacparse: fix last frame timestamp in fixed block size mode * 661400 : rtpg722pay: G722 rtptime too fast * 661477 : flvdemux: negative cts causes uint overflow, resulting in sinks waiting forever * 661841 : [edgetv] video artifacts if videorate placed after edgetv * 661874 : aacparse fails to forward caps to encoder * 662856 : cairotextoverlay: add a 'silent' property to skip rendering * 663186 : taginject is not gap aware * 663334 : gst/flv/: add amfdefs.h to noinst_HEADERS * 663580 : v4l2src negotiation failure with weird pixel-aspect-ratios * 664548 : matroskaparse: memleak * 664792 : Staircase effect in M-JPEG over RTP with unaligned image dimensions.. * 664892 : [matroskademux] Doesn't set caps properly * 665387 : v4l2src: fix stepwise enumeration ignoring the highest values * 665412 : matroskamux: jpeg muxing regression * 665502 : [flvdemux] broken a/v sync for some files * 665666 : multifilesink: GstMultiFileSinkNext not documented * 665872 : jackaudiosink, jackaudiosrc: add " client-name " property * 665882 : gdkpixbufsink: " pixel-aspect-ratio " is the inverse of what it should be * 665911 : Ability to specify ignore-length in wavparse * 666361 : playbin2: regression: visualisations don't work with pulseaudiosink * 666583 : matroskademux: too many bus messages in streamable mode * 666602 : ac3parse: no valid frames found before end of stream (unexpected bsid=10) * 666644 : udpsrc: infinite loop on dataless UDP packets * 666688 : jpedec: peer_caps leak * 666711 : rtspsrc: hostname lookup is not thread safe * 667419 : matroskamux memleaks * 667818 : osxvideo: Fix leak of NSOpenGLPixelFormat object * 667820 : rtpptdemux: Plug potential pad leak. * 667846 : rtph264depay: Exclude NALu size from payload length on truncated packets. * 668648 : gst-plugins-good does not compile: cairo cannot find libgstvideo-0.10 * 669455 : V4l2src can't open webcamstudio new vloopback * 669590 : [shout2send] support webm streaming * 670197 : v4l2src: webcam doesn't work due to fatal error when querying color balance attributes * 650960 : flacparse makes decoded flac files start at sample offset 9215 * 659947 : souphttpsink: rename to souphttpclientsink? * 658659 : qtmux: Fix ctts entries for streams that don't start with timestamps from 0 Download You can find source releases of gst-plugins-good in the download directory: http://gstreamer.freedesktop.org/src/gst-plugins-good/ GStreamer Homepage More details can be found on the project's website: http://gstreamer.freedesktop.org/ Support and Bugs We use GNOME's bugzilla for bug reports and feature requests: http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer Developers GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned from there. Interested developers of the core library, plug-ins, and applications should subscribe to the gstreamer-devel list. If there is sufficient interest we will create more lists as necessary. Applications Contributors to this release * Alessandro Decina * Alexey Fisher * Andoni Morales Alastruey * Antoine Jacoutot * Arun Raghavan * Branko Subasic * Brian Li * Chad * David Henningsson * David Schleef * David Svensson Fors * Debarshi Ray * Edward Hervey * Gary Ching-Pang Lin * Guillaume Desmottes * Ha Nguyen * Havard Graff * Jan Schmidt * Jayakrishnan M * John Ogness * Jonas Larsson * Jonny Lamb * Julien Isorce * Konstantin Miller * Lasse Laukkanen * Marc Leeman * Mark Nauwelaerts * Mart Raudsepp * Miguel Angel Cabrera Moya * Monty Montgomery * Nicola Murino * Nicolas Baron * Olivier Crête * Pascal Buhler * Peter Korsgaard * Peter Seiderer * Philip Jägenstedt * Philippe Normand * Raimo Järvi * Ralph Giles * Raul Gutierrez Segales * René Stadler * Reynaldo H. Verdejo Pinochet * Robert Krakora * Sebastian Dröge * Sebastian Rasmussen * Sjoerd Simons * Stas Sergeev * Stefan Kost * Stefan Sauer * Stig Sandnes * Thiago Santos * Tim-Philipp Müller * Tristan Matthews * Tuukka Pasanen * Vincent Penquerc'h * Wim Taymans  gst-plugins-good-0.10.31/AUTHORS0000644000175000017500000000152611671175352013063 00000000000000Erik Walthinsen Matt Howell Brent Bradburn Wim Taymans Richard Boulton Zaheer Abbas Merali David I. Lehn Chris Emerson Jens Thiele Thomas Nyberg Bastien Nocera Christian Fredrik Kalager Schaller Thomas Vander Stichele Andy Wingo Cameron Hutchison David Schleef Benjamin Otte Ronald Bultje Julien MOUTTE Jan Schmidt Arwed v. Merkatz gst-plugins-good-0.10.31/install-sh0000755000175000017500000003325611720560223014012 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gst-plugins-good-0.10.31/Makefile.in0000644000175000017500000012155711720560245014061 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # various tests to make sure we dist the win32 stuff (for MSVC builds) right # include this snippet to add a common release: target by using # include $(top_srcdir)/common/release.mak # checks for left-over files in the (usually uninstalled) tree, ie. for # stuff that best be deleted to avoid problems like having old plugin binaries # lying around. # # set CRUFT_FILES and/or CRUFT_DIRS in your Makefile.am when you include this VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(srcdir)/gst-plugins-good.spec.in \ $(top_srcdir)/common/coverage/lcov.mak \ $(top_srcdir)/common/cruft.mak $(top_srcdir)/common/po.mak \ $(top_srcdir)/common/release.mak \ $(top_srcdir)/common/win32.mak $(top_srcdir)/configure \ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS compile \ config.guess config.rpath config.sub depcomp install-sh \ ltmain.sh missing subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gst-plugins-good.spec CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = -I m4 -I common/m4 AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc @USE_GCONFTOOL_FALSE@GCONF_DIR = @USE_GCONFTOOL_TRUE@GCONF_DIR = gconf ALWAYS_SUBDIRS = \ gst sys ext \ tests \ docs \ po \ common \ m4 \ pkgconfig SUBDIRS = \ $(ALWAYS_SUBDIRS) \ $(GCONF_DIR) DIST_SUBDIRS = \ $(ALWAYS_SUBDIRS) \ gconf # the MANIFEST contains all win32 related files that should be disted win32 = $(shell cat $(top_srcdir)/win32/MANIFEST) # wildcard is apparently not portable to other makes, hence the use of find # these are library .def files with the symbols to export win32defs = $(shell find $(top_srcdir)/win32/common -name '*.def') # wildcard is apparently not portable to other makes, hence the use of find # these are files that need to be disted with CRLF line endings: win32crlf = $(shell find $(top_srcdir)/win32 -name '*.dsw' -o -name '*.dsp') # include before EXTRA_DIST for win32 assignment EXTRA_DIST = \ gst-plugins-good.spec depcomp \ AUTHORS COPYING NEWS README RELEASE REQUIREMENTS \ ChangeLog gst-plugins-good.doap autogen.sh \ $(win32) DISTCLEANFILES = _stdint.h noinst_HEADERS = \ gst-libs/gst/gettext.h \ gst-libs/gst/gst-i18n-plugin.h \ gst-libs/gst/glib-compat-private.h # make bz2 as well AUTOMAKE_OPTIONS = dist-bzip2 # cruft: plugins that have been merged or moved or renamed CRUFT_FILES = \ $(top_builddir)/common/shave \ $(top_builddir)/common/shave-libtool \ $(top_builddir)/gst/qtdemux/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/quicktime/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/videofilter/.libs/*videoflip.{so,dll,DLL,dylib} \ $(top_builddir)/gst/videofilter/.libs/*videobalance.{so,dll,DLL,dylib} \ $(top_builddir)/gst/videofilter/.libs/*gamma.{so,dll,DLL,dylib} CRUFT_DIRS = \ $(top_srcdir)/gst/qtdemux \ $(top_srcdir)/gst/quicktime all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/win32.mak $(top_srcdir)/common/release.mak $(top_srcdir)/common/po.mak $(top_srcdir)/common/coverage/lcov.mak $(top_srcdir)/common/cruft.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/win32.mak $(top_srcdir)/common/release.mak $(top_srcdir)/common/po.mak $(top_srcdir)/common/coverage/lcov.mak $(top_srcdir)/common/cruft.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 gst-plugins-good.spec: $(top_builddir)/config.status $(srcdir)/gst-plugins-good.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && $(MAKE) $(AM_MAKEFLAGS) distcheck-hook \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(HEADERS) config.h all-local installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am all-local am--refresh check check-am clean \ clean-generic clean-libtool ctags ctags-recursive dist \ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-lzma \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am win32-debug: @echo; \ echo win32 = $(win32); \ echo; \ echo win32defs = $(win32defs); \ echo; \ echo win32crlf = $(win32crlf); \ echo win32-check-crlf: @echo Checking win32 files for CR LF line endings ...; \ fail=0 ; \ for each in $(win32crlf) ; do \ result=`perl -e 'print grep(/\r\n/,<>)' "$$each" | wc -l`; \ if test "$$result" = 0 ; then \ echo $$each must be fixed to have CRLF line endings ; \ fail=1; \ fi ; \ done ; \ exit $$fail # make sure all symbols we export on linux are defined in the win32 .def too # (don't care about other unixes for now, it's enough if it works on one of # the linux build bots; we assume .so ) check-exports: @fail=0 ; \ for l in $(win32defs); do \ libbase=`basename "$$l" ".def"`; \ libso=`find "$(top_builddir)" -name "$$libbase-@GST_MAJORMINOR@.so" | grep -v /_build/ | head -n1`; \ libdef="$(top_srcdir)/win32/common/$$libbase.def"; \ if test "x$$libso" != "x"; then \ echo Checking symbols in $$libso; \ if ! ($(top_srcdir)/common/check-exports $$libdef $$libso) ; then \ fail=1; \ fi; \ fi; \ done ; \ if test $$fail != 0; then \ echo '-----------------------------------------------------------'; \ echo 'Run this to update the .def files:'; \ echo 'make check-exports 2>&1 | patch -p1'; \ echo '-----------------------------------------------------------'; \ fi; \ exit $$fail # complain about nonportable printf format strings (%lld, %llu, %zu etc.) check-nonportable-print-format: @fail=0 ; \ loc=`find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'`; \ if test "x$$loc" != "x"; then \ echo "Please fix the following print format strings:" ; \ find "$(top_srcdir)" -name '*.c' | xargs grep -n -e '%[0-9]*ll[udx]' -e '%[0-9]*z[udx]'; \ fail=1; \ fi; \ exit $$fail dist-hook: check-exports win32-check-crlf release: dist $(MAKE) $(PACKAGE)-$(VERSION).tar.gz.md5 $(MAKE) $(PACKAGE)-$(VERSION).tar.bz2.md5 # generate md5 sum files %.md5: % md5sum $< > $@ # check that no marshal or enumtypes files are included # this in turn ensures that distcheck fails for missing .list files which is currently # shadowed when the corresponding .c and .h files are included. distcheck-hook: @test "x" = "x`find $(distdir) -name \*-enumtypes.[ch] | grep -v win32`" && \ test "x" = "x`find $(distdir) -name \*-marshal.[ch]`" || \ ( $(ECHO) "*** Leftover enumtypes or marshal files in the tarball." && \ $(ECHO) "*** Make sure the following files are not disted:" && \ find $(distdir) -name \*-enumtypes.[ch] | grep -v win32 && \ find $(distdir) -name \*-marshal.[ch] && \ false ) # rule to download the latest .po files download-po: $(top_srcdir)/common/download-translations $(top_srcdir)/common/download-translations $(PACKAGE) check-valgrind: cd tests/check && make check-valgrind @HAVE_GST_CHECK_TRUE@check-torture: @HAVE_GST_CHECK_TRUE@ cd tests/check && make torture @HAVE_GST_CHECK_FALSE@check-torture: @HAVE_GST_CHECK_FALSE@ true win32-update: for f in gst/udp/gstudp-marshal.c \ gst/udp/gstudp-marshal.h \ gst/udp/gstudp-enumtypes.c \ gst/udp/gstudp-enumtypes.h \ gst/rtpmanager/gstrtpbin-marshal.c \ gst/rtpmanager/gstrtpbin-marshal.h ; do \ cp $(top_builddir)/$$f win32/common; done $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c $(top_srcdir)/common/gst-indent win32/common/gstudp-marshal.c $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c $(top_srcdir)/common/gst-indent win32/common/gstudp-enumtypes.c $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c $(top_srcdir)/common/gst-indent gst/rtpmanager/gstrtpbin-marshal.c cp $(top_builddir)/win32/common/config.h-new \ $(top_srcdir)/win32/common/config.h .PHONY: lcov-reset lcov lcov-run lcov-report lcov-upload # run lcov from scratch, always lcov-reset: $(MAKE) lcov-run $(MAKE) lcov-report # run lcov from scratch if the dir is not there lcov: $(MAKE) lcov-reset # reset run coverage tests @GST_GCOV_ENABLED_TRUE@lcov-run: @GST_GCOV_ENABLED_TRUE@ @-rm -rf lcov @GST_GCOV_ENABLED_TRUE@ lcov --directory . --zerocounters @GST_GCOV_ENABLED_TRUE@ -if test -d tests/check; then $(MAKE) -C tests/check inspect; fi @GST_GCOV_ENABLED_TRUE@ -$(MAKE) check # generate report based on current coverage data @GST_GCOV_ENABLED_TRUE@lcov-report: @GST_GCOV_ENABLED_TRUE@ mkdir lcov @GST_GCOV_ENABLED_TRUE@ lcov --compat-libtool --directory . --capture --output-file lcov/lcov.info @GST_GCOV_ENABLED_TRUE@ lcov --list-full-path -l lcov/lcov.info | grep -v "`cd $(top_srcdir) && pwd`" | cut -d\| -f1 > lcov/remove @GST_GCOV_ENABLED_TRUE@ lcov --list-full-path -l lcov/lcov.info | grep "tests/check/" | cut -d\| -f1 >> lcov/remove @GST_GCOV_ENABLED_TRUE@ lcov --list-full-path -l lcov/lcov.info | grep "docs/plugins/" | cut -d\| -f1 >> lcov/remove @GST_GCOV_ENABLED_TRUE@ lcov -r lcov/lcov.info `cat lcov/remove` > lcov/lcov.cleaned.info @GST_GCOV_ENABLED_TRUE@ rm lcov/remove @GST_GCOV_ENABLED_TRUE@ mv lcov/lcov.cleaned.info lcov/lcov.info @GST_GCOV_ENABLED_TRUE@ genhtml -t "$(PACKAGE_STRING)" -o lcov --num-spaces 2 lcov/lcov.info @GST_GCOV_ENABLED_TRUE@lcov-upload: lcov @GST_GCOV_ENABLED_TRUE@ rsync -rvz -e ssh --delete lcov/* gstreamer.freedesktop.org:/srv/gstreamer.freedesktop.org/www/data/coverage/lcov/$(PACKAGE) @GST_GCOV_ENABLED_FALSE@lcov-run: @GST_GCOV_ENABLED_FALSE@ echo "Need to reconfigure with --enable-gcov" @GST_GCOV_ENABLED_FALSE@lcov-report: @GST_GCOV_ENABLED_FALSE@ echo "Need to reconfigure with --enable-gcov" check-cruft: @cruft_files=""; cruft_dirs=""; \ for f in $(CRUFT_FILES); do \ if test -e $$f; then \ cruft_files="$$cruft_files $$f"; \ fi \ done; \ for d in $(CRUFT_DIRS); do \ if test -e $$d; then \ cruft_dirs="$$cruft_dirs $$d"; \ fi \ done; \ if test "x$$cruft_files$$cruft_dirs" != x; then \ echo; \ echo "**** CRUFT ALERT *****"; \ echo; \ echo "The following files and directories may not be needed any "; \ echo "longer (usually because a plugin has been merged into "; \ echo "another plugin, moved to a different module, or been "; \ echo "renamed), and you probably want to clean them up if you "; \ echo "don't have local changes: "; \ echo; \ for f in $$cruft_files; do echo "file $$f"; done; \ echo; \ for d in $$cruft_dirs; do echo "directory $$d"; done; \ echo; \ echo "'make clean-cruft' will remove these for you."; \ echo; \ fi clean-cruft-dirs: @for d in $(CRUFT_DIRS); do \ if test -e $$d; then \ rm -r "$$d" && echo "Removed directory $$d"; \ fi \ done clean-cruft-files: @for f in $(CRUFT_FILES); do \ if test -e $$f; then \ rm "$$f" && echo "Removed file $$f"; \ fi \ done clean-cruft: clean-cruft-dirs clean-cruft-files # also might want to add this to your Makefile.am: # # all-local: check-cruft all-local: check-cruft # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/m4/0000755000175000017500000000000011720565345012407 500000000000000gst-plugins-good-0.10.31/m4/ltoptions.m40000644000175000017500000003007311720560211014612 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) gst-plugins-good-0.10.31/m4/ogg.m40000644000175000017500000000663611671175354013362 00000000000000# Configure paths for libogg # Jack Moffitt 10-21-2000 # Shamelessly stolen from Owen Taylor and Manish Singh dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS dnl AC_DEFUN([XIPH_PATH_OGG], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(ogg,[ --with-ogg=PFX Prefix where libogg is installed (optional)], ogg_prefix="$withval", ogg_prefix="") AC_ARG_WITH(ogg-libraries,[ --with-ogg-libraries=DIR Directory where libogg library is installed (optional)], ogg_libraries="$withval", ogg_libraries="") AC_ARG_WITH(ogg-includes,[ --with-ogg-includes=DIR Directory where libogg header files are installed (optional)], ogg_includes="$withval", ogg_includes="") AC_ARG_ENABLE(oggtest, [ --disable-oggtest Do not try to compile and run a test Ogg program],, enable_oggtest=yes) if test "x$ogg_libraries" != "x" ; then OGG_LIBS="-L$ogg_libraries" elif test "x$ogg_prefix" != "x" ; then OGG_LIBS="-L$ogg_prefix/lib" elif test "x$prefix" != "xNONE" ; then OGG_LIBS="-L$prefix/lib" fi OGG_LIBS="$OGG_LIBS -logg" if test "x$ogg_includes" != "x" ; then OGG_CFLAGS="-I$ogg_includes" elif test "x$ogg_prefix" != "x" ; then OGG_CFLAGS="-I$ogg_prefix/include" elif test "x$prefix" != "xNONE"; then OGG_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for Ogg) no_ogg="" if test "x$enable_oggtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $OGG_CFLAGS" LIBS="$LIBS $OGG_LIBS" dnl dnl Now check if the installed Ogg is sufficiently new. dnl rm -f conf.oggtest AC_TRY_RUN([ #include #include #include #include int main () { system("touch conf.oggtest"); return 0; } ],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_ogg" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.oggtest ; then : else echo "*** Could not run Ogg test program, checking why..." CFLAGS="$CFLAGS $OGG_CFLAGS" LIBS="$LIBS $OGG_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding Ogg or finding the wrong" echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means Ogg was incorrectly installed" echo "*** or that you have moved Ogg since it was installed." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi OGG_CFLAGS="" OGG_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(OGG_CFLAGS) AC_SUBST(OGG_LIBS) rm -f conf.oggtest ]) gst-plugins-good-0.10.31/m4/glibc21.m40000644000175000017500000000144511720560210014002 00000000000000# glibc21.m4 serial 3 dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([gl_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) gst-plugins-good-0.10.31/m4/lib-link.m40000644000175000017500000007205511720560210014265 00000000000000# lib-link.m4 serial 13 (gettext-0.17) dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.54) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Autoconf >= 2.61 supports dots in --with options. define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIB[]NAME[]_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) gst-plugins-good-0.10.31/m4/gconf-2.m40000644000175000017500000000302411671175354014025 00000000000000dnl AM_GCONF_SOURCE_2 dnl Defines GCONF_SCHEMA_CONFIG_SOURCE which is where you should install schemas dnl (i.e. pass to gconftool-2 dnl Defines GCONF_SCHEMA_FILE_DIR which is a filesystem directory where dnl you should install foo.schemas files dnl AC_DEFUN([AM_GCONF_SOURCE_2], [ if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi AC_ARG_WITH(gconf-source, [ --with-gconf-source=sourceaddress Config database for installing schema files.],GCONF_SCHEMA_CONFIG_SOURCE="$withval",) AC_SUBST(GCONF_SCHEMA_CONFIG_SOURCE) AC_MSG_RESULT([Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation]) if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' fi AC_ARG_WITH(gconf-schema-file-dir, [ --with-gconf-schema-file-dir=dir Directory for installing schema files.],GCONF_SCHEMA_FILE_DIR="$withval",) AC_SUBST(GCONF_SCHEMA_FILE_DIR) AC_MSG_RESULT([Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files]) AC_ARG_ENABLE(schemas-install, [ --disable-schemas-install Disable the schemas installation], [case "${enableval}" in yes) schemas_install=true ;; no) schemas_install=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --disable-schemas-install) ;; esac],[schemas_install=true]) AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, test x$schemas_install = xtrue) ]) gst-plugins-good-0.10.31/m4/a52.m40000644000175000017500000000715611671175354013173 00000000000000dnl dnl A52_CHECK-LIBHEADER(FEATURE-NAME, LIB-NAME, LIB-FUNCTION, HEADER-NAME, dnl ACTION-IF-FOUND, ACTION-IF-NOT-FOUND, dnl EXTRA-LDFLAGS, EXTRA-CPPFLAGS) dnl dnl FEATURE-NAME - feature name; library and header files are treated dnl as feature, which we look for dnl LIB-NAME - library name as in AC_CHECK_LIB macro dnl LIB-FUNCTION - library symbol as in AC_CHECK_LIB macro dnl HEADER-NAME - header file name as in AC_CHECK_HEADER dnl ACTION-IF-FOUND - when feature is found then execute given action dnl ACTION-IF-NOT-FOUND - when feature is not found then execute given action dnl EXTRA-LDFLAGS - extra linker flags (-L or -l) dnl EXTRA-CPPFLAGS - extra C preprocessor flags, i.e. -I/usr/X11R6/include dnl dnl Based on GST_CHECK_LIBHEADER from gstreamer plugins 0.3.1. dnl AC_DEFUN([A52_CHECK_LIBHEADER], [ AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no, [$7]) check_libheader_feature_name=translit([$1], A-Z, a-z) if test "x$HAVE_[$1]" = "xyes"; then check_libheader_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="[$8] $CPPFLAGS" AC_CHECK_HEADER([$4], :, HAVE_[$1]=no) CPPFLAGS=$check_libheader_save_CPPFLAGS fi if test "x$HAVE_[$1]" = "xyes"; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ] ) dnl dnl AC_CHECK_A52DEC(ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) dnl dnl ACTION-IF-FOUND - when feature is found then execute given action dnl ACTION-IF-NOT-FOUND - when feature is not found then execute given action dnl dnl Defines HAVE_A52DEC to yes if liba52 is found dnl dnl CFLAGS and LDFLAGS for the library are stored in A52DEC_CFLAGS and dnl A52DEC_LIBS, respectively dnl dnl Based on GST_CHECK_A52DEC from gstreamer plugins 0.3.3.1 dnl Thomas Vander Stichele , Andy Wingo dnl AC_DEFUN([AC_CHECK_A52DEC], [dnl AC_ARG_WITH(a52dec-prefix, AC_HELP_STRING([--with-a52dec-prefix=PFX], [prefix where a52dec is installed (optional)]), a52dec_config_prefix="$withval", a52dec_config_prefix="") if test x$a52dec_config_prefix = x ; then A52_CHECK_LIBHEADER(A52DEC, a52, a52_init, a52dec/a52.h, A52DEC_LIBS="-la52 -lm", , -lm) else A52_CHECK_LIBHEADER(A52DEC, a52, a52_init, a52dec/a52.h, [ A52DEC_LIBS="-la52 -L$a52dec_config_prefix/lib -lm" A52DEC_CFLAGS="-I$a52dec_config_prefix/include" ], , -L$a52dec_config_prefix/lib, -I$a52dec_config_prefix/include) fi if test $HAVE_A52DEC = "yes"; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $A52DEC_CFLAGS" LIBS="$A52DEC_LIBS $LIBS" AC_TRY_RUN([ #include #include int main () { a52_state_t *state; state = a52_init (0); a52_free (state); return 0; } ],, HAVE_A52DEC=no, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) if test HAVE_A52DEC = "no"; then echo "*** Your a52dec is borked somehow. Please update to 0.7.4." else AC_TRY_RUN([ #include #include int main () { int i = sizeof (a52_state_t); if ( i ) return 0; } ], HAVE_A52DEC=no,, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) if test HAVE_A52DEC = "no"; then echo "*** Your a52dec is too old. Please update to 0.7.4." fi fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test HAVE_A52DEC = "no"; then A52DEC_CFLAGS="" A52DEC_LIBS="" fi if test "x$HAVE_A52DEC" = "xyes"; then ifelse([$1], , :, [$1]) else ifelse([$2], , :, [$2]) fi AC_SUBST(A52DEC_CFLAGS) AC_SUBST(A52DEC_LIBS) ]) gst-plugins-good-0.10.31/m4/vorbis.m40000644000175000017500000001066711671175354014111 00000000000000# Configure paths for libvorbis # Jack Moffitt 10-21-2000 # Shamelessly stolen from Owen Taylor and Manish Singh # thomasvs added check for vorbis_bitrate_addblock which is new in rc3 # thomasvs added check for OV_ECTL_RATEMANAGE_SET which is new in 1.0 final dnl XIPH_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libvorbis, and define VORBIS_CFLAGS and VORBIS_LIBS dnl AC_DEFUN([XIPH_PATH_VORBIS], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(vorbis,[ --with-vorbis=PFX Prefix where libvorbis is installed (optional)], vorbis_prefix="$withval", vorbis_prefix="") AC_ARG_WITH(vorbis-libraries,[ --with-vorbis-libraries=DIR Directory where libvorbis library is installed (optional)], vorbis_libraries="$withval", vorbis_libraries="") AC_ARG_WITH(vorbis-includes,[ --with-vorbis-includes=DIR Directory where libvorbis header files are installed (optional)], vorbis_includes="$withval", vorbis_includes="") AC_ARG_ENABLE(vorbistest, [ --disable-vorbistest Do not try to compile and run a test Vorbis program],, enable_vorbistest=yes) if test "x$vorbis_libraries" != "x" ; then VORBIS_LIBS="-L$vorbis_libraries" elif test "x$vorbis_prefix" != "x" ; then VORBIS_LIBS="-L$vorbis_prefix/lib" elif test "x$prefix" != "xNONE"; then VORBIS_LIBS="-L$prefix/lib" fi VORBIS_LIBS="$VORBIS_LIBS -lvorbis -lm" VORBISFILE_LIBS="-lvorbisfile" VORBISENC_LIBS="-lvorbisenc" if test "x$vorbis_includes" != "x" ; then VORBIS_CFLAGS="-I$vorbis_includes" elif test "x$vorbis_prefix" != "x" ; then VORBIS_CFLAGS="-I$vorbis_prefix/include" elif test "x$prefix" != "xNONE"; then VORBIS_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for Vorbis) no_vorbis="" if test "x$enable_vorbistest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $VORBIS_CFLAGS $OGG_CFLAGS" LIBS="$LIBS $VORBIS_LIBS $VORBISENC_LIBS $OGG_LIBS" dnl dnl Now check if the installed Vorbis is sufficiently new. dnl rm -f conf.vorbistest AC_TRY_RUN([ #include #include #include #include #include int main () { vorbis_block vb; vorbis_dsp_state vd; vorbis_info vi; vorbis_info_init (&vi); vorbis_encode_init (&vi, 2, 44100, -1, 128000, -1); vorbis_analysis_init (&vd, &vi); vorbis_block_init (&vd, &vb); /* this function was added in 1.0rc3, so this is what we're testing for */ vorbis_bitrate_addblock (&vb); /* this define was added in 1.0 final */ #ifdef OV_ECTL_RATEMANAGE_SET system("touch conf.vorbistest"); return 0; #else return -1; #endif } ],, no_vorbis=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_vorbis" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.vorbistest ; then : else echo "*** Could not run Vorbis test program, checking why..." CFLAGS="$CFLAGS $VORBIS_CFLAGS" LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding Vorbis or finding the wrong" echo "*** version of Vorbis. If it is not finding Vorbis, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means Vorbis was incorrectly installed" echo "*** or that you have moved Vorbis since it was installed." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi VORBIS_CFLAGS="" VORBIS_LIBS="" VORBISFILE_LIBS="" VORBISENC_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(VORBIS_CFLAGS) AC_SUBST(VORBIS_LIBS) AC_SUBST(VORBISFILE_LIBS) AC_SUBST(VORBISENC_LIBS) rm -f conf.vorbistest ]) gst-plugins-good-0.10.31/m4/lcmessage.m40000644000175000017500000000240411720560210014516 00000000000000# lcmessage.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([gt_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)]) if test $gt_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) gst-plugins-good-0.10.31/m4/intdiv0.m40000644000175000017500000000443111720560210014132 00000000000000# intdiv0.m4 serial 2 (gettext-0.17) dnl Copyright (C) 2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ gt_cv_int_divbyzero_sigfpe= changequote(,)dnl case "$host_os" in macos* | darwin[6-9]* | darwin[1-9][0-9]*) # On MacOS X 10.2 or newer, just assume the same as when cross- # compiling. If we were to perform the real test, 1 Crash Report # dialog window would pop up. case "$host_cpu" in i[34567]86 | x86_64) gt_cv_int_divbyzero_sigfpe="guessing yes" ;; esac ;; esac changequote([,])dnl if test -z "$gt_cv_int_divbyzero_sigfpe"; then AC_TRY_RUN([ #include #include static void sigfpe_handler (int sig) { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, [ # Guess based on the CPU. changequote(,)dnl case "$host_cpu" in alpha* | i[34567]86 | x86_64 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac changequote([,])dnl ]) fi ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, [Define if integer division by zero raises signal SIGFPE.]) ]) gst-plugins-good-0.10.31/m4/intlmacosx.m40000644000175000017500000000456511720560210014746 00000000000000# intlmacosx.m4 serial 1 (gettext-0.17) dnl Copyright (C) 2004-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], gt_cv_func_CFPreferencesCopyAppValue, [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) gst-plugins-good-0.10.31/m4/check-libheader.m40000644000175000017500000000270711671175354015573 00000000000000dnl dnl CHECK-LIBHEADER(FEATURE-NAME, LIB-NAME, LIB-FUNCTION, HEADER-NAME, dnl ACTION-IF-FOUND, ACTION-IF-NOT-FOUND, dnl EXTRA-LDFLAGS, EXTRA-CPPFLAGS) dnl dnl FEATURE-NAME - feature name; library and header files are treated dnl as feature, which we look for dnl LIB-NAME - library name as in AC_CHECK_LIB macro dnl LIB-FUNCTION - library symbol as in AC_CHECK_LIB macro dnl HEADER-NAME - header file name as in AC_CHECK_HEADER dnl ACTION-IF-FOUND - when feature is found then execute given action dnl ACTION-IF-NOT-FOUND - when feature is not found then execute given action dnl EXTRA-LDFLAGS - extra linker flags (-L or -l) dnl EXTRA-CPPFLAGS - extra C preprocessor flags, i.e. -I/usr/X11R6/include dnl dnl Based on GST_CHECK_LIBHEADER from gstreamer plugins 0.3.1. dnl AC_DEFUN([CHECK_LIBHEADER], [ AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no, [$7]) check_libheader_feature_name=translit([$1], A-Z, a-z) if test "x$HAVE_[$1]" = "xyes"; then check_libheader_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="[$8] $CPPFLAGS" AC_CHECK_HEADER([$4], :, HAVE_[$1]=no) CPPFLAGS=$check_libheader_save_CPPFLAGS fi if test "x$HAVE_[$1]" = "xyes"; then ifelse([$5], , :, [$5]) AC_MSG_NOTICE($check_libheader_feature_name was found) else ifelse([$6], , :, [$6]) AC_MSG_WARN($check_libheader_feature_name not found) fi AC_SUBST(HAVE_[$1]) ] ) gst-plugins-good-0.10.31/m4/progtest.m40000644000175000017500000000555011720560210014427 00000000000000# progtest.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) gst-plugins-good-0.10.31/m4/esd.m40000644000175000017500000001544611671175354013360 00000000000000# Configure paths for ESD # Manish Singh 98-9-30 # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_ESD([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for ESD, and define ESD_CFLAGS and ESD_LIBS dnl AC_DEFUN([AM_PATH_ESD], [dnl dnl Get the cflags and libraries from the esd-config script dnl AC_ARG_WITH(esd-prefix, AC_HELP_STRING([--with-esd-prefix=PFX], [prefix where ESD is installed (optional)]), esd_prefix="$withval", esd_prefix="") AC_ARG_WITH(esd-exec-prefix, AC_HELP_STRING([--with-esd-exec-prefix=PFX], [exec prefix where ESD is installed (optional)]), esd_exec_prefix="$withval", esd_exec_prefix="") AC_ARG_ENABLE(esdtest, AC_HELP_STRING([--disable-esdtest], [do not try to compile and run a test ESD program]), , enable_esdtest=yes) if test x$esd_exec_prefix != x ; then esd_args="$esd_args --exec-prefix=$esd_exec_prefix" if test x${ESD_CONFIG+set} != xset ; then ESD_CONFIG=$esd_exec_prefix/bin/esd-config fi fi if test x$esd_prefix != x ; then esd_args="$esd_args --prefix=$esd_prefix" if test x${ESD_CONFIG+set} != xset ; then ESD_CONFIG=$esd_prefix/bin/esd-config fi fi AC_PATH_PROG(ESD_CONFIG, esd-config, no) min_esd_version=ifelse([$1], ,0.2.7,$1) AC_MSG_CHECKING(for ESD - version >= $min_esd_version) no_esd="" if test "$ESD_CONFIG" = "no" ; then no_esd=yes else AC_LANG_SAVE AC_LANG_C ESD_CFLAGS=`$ESD_CONFIG $esdconf_args --cflags` ESD_LIBS=`$ESD_CONFIG $esdconf_args --libs` esd_major_version=`$ESD_CONFIG $esd_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` esd_minor_version=`$ESD_CONFIG $esd_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` esd_micro_version=`$ESD_CONFIG $esd_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_esdtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $ESD_CFLAGS" LIBS="$LIBS $ESD_LIBS" dnl dnl Now check if the installed ESD is sufficiently new. (Also sanity dnl checks the results of esd-config to some extent dnl rm -f conf.esdtest AC_TRY_RUN([ #include #include #include #include char* my_strdup (char *str) { char *new_str; if (str) { new_str = malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main () { int major, minor, micro; char *tmp_version; system ("touch conf.esdtest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_esd_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_esd_version"); exit(1); } if (($esd_major_version > major) || (($esd_major_version == major) && ($esd_minor_version > minor)) || (($esd_major_version == major) && ($esd_minor_version == minor) && ($esd_micro_version >= micro))) { return 0; } else { printf("\n*** 'esd-config --version' returned %d.%d.%d, but the minimum version\n", $esd_major_version, $esd_minor_version, $esd_micro_version); printf("*** of ESD required is %d.%d.%d. If esd-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If esd-config was wrong, set the environment variable ESD_CONFIG\n"); printf("*** to point to the correct copy of esd-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_esd=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" AC_LANG_RESTORE fi fi if test "x$no_esd" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$ESD_CONFIG" = "no" ; then echo "*** The esd-config script installed by ESD could not be found" echo "*** If ESD was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the ESD_CONFIG environment variable to the" echo "*** full path to esd-config." else if test -f conf.esdtest ; then : else echo "*** Could not run ESD test program, checking why..." CFLAGS="$CFLAGS $ESD_CFLAGS" LIBS="$LIBS $ESD_LIBS" AC_LANG_SAVE AC_LANG_C AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding ESD or finding the wrong" echo "*** version of ESD. If it is not finding ESD, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means ESD was incorrectly installed" echo "*** or that you have moved ESD since it was installed. In the latter case, you" echo "*** may want to edit the esd-config script: $ESD_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" AC_LANG_RESTORE fi fi ESD_CFLAGS="" ESD_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(ESD_CFLAGS) AC_SUBST(ESD_LIBS) rm -f conf.esdtest ]) dnl AM_ESD_SUPPORTS_MULTIPLE_RECORD([ACTION-IF-SUPPORTS [, ACTION-IF-NOT-SUPPORTS]]) dnl Test, whether esd supports multiple recording clients (version >=0.2.21) dnl AC_DEFUN([AM_ESD_SUPPORTS_MULTIPLE_RECORD], [dnl AC_MSG_NOTICE([whether installed esd version supports multiple recording clients]) ac_save_ESD_CFLAGS="$ESD_CFLAGS" ac_save_ESD_LIBS="$ESD_LIBS" AM_PATH_ESD(0.2.21, ifelse([$1], , [ AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, true) AC_DEFINE(ESD_SUPPORTS_MULTIPLE_RECORD, 1, [Define if you have esound with support of multiple recording clients.])], [$1]), ifelse([$2], , [AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, false)], [$2]) if test "x$ac_save_ESD_CFLAGS" != x ; then ESD_CFLAGS="$ac_save_ESD_CFLAGS" fi if test "x$ac_save_ESD_LIBS" != x ; then ESD_LIBS="$ac_save_ESD_LIBS" fi ) ]) gst-plugins-good-0.10.31/m4/gst-ivorbis.m40000644000175000017500000000435211671175354015047 00000000000000# Configure paths for Tremor dnl XIPH_PATH_IVORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libivorbis, and define IVORBIS_CFLAGS and IVORBIS_LIBS dnl AC_DEFUN([XIPH_PATH_IVORBIS], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(ivorbis,[ --with-ivorbis=PFX Prefix where libivorbis is installed (optional)], ivorbis_prefix="$withval", ivorbis_prefix="") AC_ARG_WITH(ivorbis-libraries,[ --with-ivorbis-libraries=DIR Directory where libivorbis library is installed (optional)], ivorbis_libraries="$withval", ivorbis_libraries="") AC_ARG_WITH(ivorbis-includes,[ --with-ivorbis-includes=DIR Directory where libivorbis header files are installed (optional)], ivorbis_includes="$withval", ivorbis_includes="") AC_ARG_ENABLE(ivorbistest, [ --disable-ivorbistest Do not try to compile and run a test Ivorbis program],, enable_ivorbistest=yes) if test "x$ivorbis_libraries" != "x" ; then IVORBIS_LIBS="-L$ivorbis_libraries" elif test "x$ivorbis_prefix" != "x" ; then IVORBIS_LIBS="-L$ivorbis_prefix/lib" elif test "x$prefix" != "xNONE"; then IVORBIS_LIBS="-L$prefix/lib" fi IVORBIS_LIBS="$IVORBIS_LIBS -lvorbisidec -lm" if test "x$ivorbis_includes" != "x" ; then IVORBIS_CFLAGS="-I$ivorbis_includes" elif test "x$ivorbis_prefix" != "x" ; then IVORBIS_CFLAGS="-I$ivorbis_prefix/include" elif test "x$prefix" != "xNONE"; then IVORBIS_CFLAGS="-I$prefix/include" fi AC_MSG_CHECKING(for Tremor) no_ivorbis="" if test "x$enable_ivorbistest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $IVORBIS_CFLAGS $OGG_CFLAGS" LIBS="$LIBS $IVORBIS_LIBS $OGG_LIBS" dnl dnl Now check if the installed Tremor is sufficiently new. dnl rm -f conf.ivorbistest AC_TRY_COMPILE([ #include #include #include #include ],,, no_ivorbis=yes) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_ivorbis" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) IVORBIS_CFLAGS="" IVORBIS_LIBS="" IVORBISFILE_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(IVORBIS_CFLAGS) AC_SUBST(IVORBIS_LIBS) AC_SUBST(IVORBISFILE_LIBS) ]) gst-plugins-good-0.10.31/m4/gst-sdl.m40000644000175000017500000001416411671175354014156 00000000000000# stuff for SDL, hope this helps if we put it here # Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix, AC_HELP_STRING([--with-sdl-prefix=PFX], [prefix where SDL is installed (optional)]), sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix, AC_HELP_STRING([--with-sdl-exec-prefix=PFX], [exec prefix where SDL is installed (optional)]), sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, AC_HELP_STRING([--disable-sdltest], [do not try to compile and run a test SDL program]), , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi AC_PATH_PROG(SDL_CONFIG, sdl-config, no) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) gst-plugins-good-0.10.31/m4/Makefile.am0000644000175000017500000000110711671175354014364 00000000000000EXTRA_DIST = \ a52.m4 \ aalib.m4 \ as-arts.m4 \ as-ffmpeg.m4 \ as-liblame.m4 \ as-slurp-ffmpeg.m4 \ check-libheader.m4 \ codeset.m4 \ esd.m4 \ freetype2.m4 \ gconf-2.m4 \ gettext.m4 \ glibc21.m4 \ glib.m4 \ gst-alsa.m4 \ gst-artsc.m4 \ gst-fionread.m4 \ gst-ivorbis.m4 \ gst-matroska.m4 \ gst-sdl.m4 \ gst-shout2.m4 \ gst-sid.m4 \ gtk.m4 \ iconv.m4 \ intdiv0.m4 \ inttypes_h.m4 \ inttypes-pri.m4 \ lcmessage.m4 \ libfame.m4 \ lib-ld.m4 \ lib-link.m4 \ libmikmod.m4 \ lib-prefix.m4 \ ogg.m4 \ progtest.m4 \ stdint_h.m4 \ uintmax_t.m4 \ vorbis.m4 gst-plugins-good-0.10.31/m4/as-ffmpeg.m40000644000175000017500000000550311671175354014443 00000000000000# CFLAGS and library paths for FFMPEG # taken from Autostar Sandbox, http://autostars.sourceforge.net/ dnl Usage: dnl AM_PATH_FFMPEG([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl FIXME: version checking does not work currently dnl dnl Example: dnl AM_PATH_FFMPEG(0.4.6, , AC_MSG_ERROR([*** FFMPEG >= 0.4.6 not installed)) dnl dnl Defines FFMPEG_LIBS dnl FIXME: should define FFMPEG_VERSION dnl AC_DEFUN([AM_PATH_FFMPEG], [ dnl allow for specification of a source path (for uninstalled) AC_ARG_WITH(ffmpeg-source, AC_HELP_STRING([--with-ffmpeg-source=DIR], [Directory where FFmpeg source is (optional)]), ffmpeg_source="$withval") dnl save CFLAGS and LIBS here CFLAGS_save=$CFLAGS LIBS_save=$LIBS if test "x$ffmpeg_source" != "x"; then dnl uninstalled FFmpeg copy AC_MSG_NOTICE([Looking for FFmpeg source in $ffmpeg_source]) CFLAGS="-I$ffmpeg_source/libav -I$ffmpeg_source/libavcodec" LIBS="-L$ffmpeg_source/libav -L$ffmpeg_source/libavcodec" AC_DEFINE_UNQUOTED(HAVE_FFMPEG_UNINSTALLED, 1, [defined if we compile against uninstalled FFmpeg]) FFMPEG_COMMON_INCLUDE="#include " else FFMPEG_COMMON_INCLUDE="#include " fi dnl check for libavcodec AC_CHECK_LIB(avcodec, avcodec_init, HAVE_FFMPEG=yes, HAVE_FFMPEG=no) dnl check for avcodec.h and avformat.h if test "x$ffmpeg_source" != "x"; then dnl uninstalled AC_CHECK_HEADER(avcodec.h, , HAVE_FFMPEG=no, [/* only compile */]) AC_CHECK_HEADER(avformat.h, , HAVE_FFMPEG=no, [/* only compile */]) else AC_CHECK_HEADER(ffmpeg/avcodec.h, , HAVE_FFMPEG=no) AC_CHECK_HEADER(ffmpeg/avformat.h, , HAVE_FFMPEG=no) fi dnl now check if it's sufficiently new AC_LANG_SAVE() AC_LANG_C() dnl FIXME: we use strcmp, which we know is going to break if ffmpeg ever uses dnl two digits for any of their version numbers. It makes the test so much dnl easier though so let's ignore that AC_TRY_RUN([ $FFMPEG_COMMON_INCLUDE #include #include int main () { if (strcmp (FFMPEG_VERSION, "$1") == -1) { fprintf (stderr, "ERROR: your copy of ffmpeg is too old (%s)\n", FFMPEG_VERSION); return 1; } else return 0; } ], , HAVE_FFMPEG=no) dnl now do the actual "do we have it ?" test if test "x$HAVE_FFMPEG" = "xyes"; then FFMPEG_LIBS="$LIBS -lavcodec -lavformat" FFMPEG_CFLAGS="$CFLAGS" AC_MSG_NOTICE(we have ffmpeg) dnl execute what we have to because it's found ifelse([$2], , :, [$2]) else FFMPEG_LIBS="" FFMPEG_CFLAGS="" dnl execute what we have to because it's not found ifelse([$3], , :, [$3]) fi dnl make variables available AC_SUBST(FFMPEG_LIBS) AC_SUBST(FFMPEG_CFLAGS) AC_SUBST(HAVE_FFMPEG) AC_LANG_RESTORE() CFLAGS=$CFLAGS_save LIBS=$LIBS_save ]) gst-plugins-good-0.10.31/m4/as-slurp-ffmpeg.m40000644000175000017500000000325111671175354015604 00000000000000dnl slurp-ffmpeg.m4 0.1.1 dnl a macro to slurp in ffmpeg's cvs source inside a project tree dnl taken from Autostar Sandbox, http://autostars.sourceforge.net/ dnl Usage: dnl AS_SLURP_FFMPEG(DIRECTORY, DATE, [ACTION-IF-WORKED [, ACTION-IF-NOT-WORKED]]]) dnl dnl Example: dnl AM_PATH_FFMPEG(lib/ffmpeg, 2002-12-14 12:00 GMT) dnl dnl make sure you have a Tag file in the dir where you check out that dnl is the Tag of CVS you want to have checked out dnl it should correspond to the DATE argument you supply, ie resolve to dnl the same date dnl (in an ideal world, cvs would understand it's own Tag file format as dnl a date spec) AC_DEFUN([AS_SLURP_FFMPEG], [ # save original dir FAILED="" DIRECTORY=`pwd` # get/update cvs if test ! -d $1; then mkdir -p $1; fi dnl we need to check $srcdir/$1 or it will always checkout ffmpeg even if it is there dnl at least when top_srcdir != top_builddir. dnl FIXME: unfortunately this makes the checkout go into top_srcdir cd $srcdir/$1 if test ! -e ffmpeg/README; then # check out cvs code AC_MSG_NOTICE(checking out ffmpeg cvs code from $2 into $1) cvs -Q -z4 -d:pserver:anonymous@mplayerhq.hu:/cvsroot/ffmpeg co -D '$2' ffmpeg || FAILED=yes else # compare against Tag file and see if it needs updating if test "`cat Tag`" == "$2"; then AC_MSG_NOTICE(ffmpeg cvs code in sync) else cd ffmpeg AC_MSG_NOTICE(updating ffmpeg cvs code to $2) cvs -Q -z4 update -dP -D '$2' || FAILED=yes cd .. fi fi if test "x$FAILED" != "xyes"; then echo "$2" > Tag fi # now go back cd $DIRECTORY if test "x$FAILED" == "xyes"; then [$4] false else [$3] true fi ]) gst-plugins-good-0.10.31/m4/libfame.m40000644000175000017500000002060511671175354014175 00000000000000dnl AM_PATH_LIBFAME([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for libfame, and define LIBFAME_CFLAGS and LIBFAME_LIBS dnl Vivien Chappelier 12/11/00 dnl stolen from ORBit autoconf dnl AC_DEFUN([AM_PATH_LIBFAME], [dnl dnl Get the cflags and libraries from the libfame-config script dnl AC_ARG_WITH(libfame-prefix,[ --with-libfame-prefix=PFX Prefix where libfame is installed (optional)], libfame_config_prefix="$withval", libfame_config_prefix="") AC_ARG_WITH(libfame-exec-prefix,[ --with-libfame-exec-prefix=PFX Exec prefix where libfame is installed (optional)], libfame_config_exec_prefix="$withval", libfame_config_exec_prefix="") AC_ARG_ENABLE(libfametest, [ --disable-libfametest Do not try to compile and run a test libfame program], , enable_libfametest=yes) if test x$libfame_config_exec_prefix != x ; then libfame_config_args="$libfame_config_args --exec-prefix=$libfame_config_exec_prefix" if test x${LIBFAME_CONFIG+set} != xset ; then LIBFAME_CONFIG=$libfame_config_exec_prefix/bin/libfame-config fi fi if test x$libfame_config_prefix != x ; then libfame_config_args="$libfame_config_args --prefix=$libfame_config_prefix" if test x${LIBFAME_CONFIG+set} != xset ; then LIBFAME_CONFIG=$libfame_config_prefix/bin/libfame-config fi fi AC_PATH_PROG(LIBFAME_CONFIG, libfame-config, no) min_libfame_version=ifelse([$1], , 0.9.0, $1) AC_MSG_CHECKING(for libfame - version >= $min_libfame_version) no_libfame="" if test "$LIBFAME_CONFIG" = "no" ; then no_libfame=yes else LIBFAME_CFLAGS=`$LIBFAME_CONFIG $libfame_config_args --cflags` LIBFAME_LIBS=`$LIBFAME_CONFIG $libfame_config_args --libs` libfame_config_major_version=`$LIBFAME_CONFIG $libfame_config_args --version | \ sed -e 's,[[^0-9.]],,g' -e 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` libfame_config_minor_version=`$LIBFAME_CONFIG $libfame_config_args --version | \ sed -e 's,[[^0-9.]],,g' -e 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` libfame_config_micro_version=`$LIBFAME_CONFIG $libfame_config_args --version | \ sed -e 's,[[^0-9.]],,g' -e 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_libfametest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $LIBFAME_CFLAGS" LIBS="$LIBFAME_LIBS $LIBS" dnl dnl Now check if the installed LIBFAME is sufficiently new. (Also sanity dnl checks the results of libfame-config to some extent dnl rm -f conf.libfametest AC_TRY_RUN([ #include #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.libfametest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = strdup("$min_libfame_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_libfame_version"); exit(1); } if ((libfame_major_version != $libfame_config_major_version) || (libfame_minor_version != $libfame_config_minor_version) || (libfame_micro_version != $libfame_config_micro_version)) { printf("\n*** 'libfame-config --version' returned %d.%d.%d, but Libfame (%d.%d.%d)\n", $libfame_config_major_version, $libfame_config_minor_version, $libfame_config_micro_version, libfame_major_version, libfame_minor_version, libfame_micro_version); printf ("*** was found! If libfame-config was correct, then it is best\n"); printf ("*** to remove the old version of libfame. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If libfame-config was wrong, set the environment variable LIBFAME_CONFIG\n"); printf("*** to point to the correct copy of libfame-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } #if defined (LIBFAME_MAJOR_VERSION) && defined (LIBFAME_MINOR_VERSION) && defined (LIBFAME_MICRO_VERSION) else if ((libfame_major_version != LIBFAME_MAJOR_VERSION) || (libfame_minor_version != LIBFAME_MINOR_VERSION) || (libfame_micro_version != LIBFAME_MICRO_VERSION)) { printf("*** libfame header files (version %d.%d.%d) do not match\n", LIBFAME_MAJOR_VERSION, LIBFAME_MINOR_VERSION, LIBFAME_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", libfame_major_version, libfame_minor_version, libfame_micro_version); } #endif /* defined (LIBFAME_MAJOR_VERSION) ... */ else { if ((libfame_major_version > major) || ((libfame_major_version == major) && (libfame_minor_version > minor)) || ((libfame_major_version == major) && (libfame_minor_version == minor) && (libfame_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libfame (%d.%d.%d) was found.\n", libfame_major_version, libfame_minor_version, libfame_micro_version); printf("*** You need a version of libfame newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libfame is always available from http://www-eleves.enst-bretagne.fr/~chappeli/fame\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the libfame-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libfame, but you can also set the LIBFAME_CONFIG environment to point to the\n"); printf("*** correct copy of libfame-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_libfame=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_libfame" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$LIBFAME_CONFIG" = "no" ; then echo "*** The libfame-config script installed by libfame could not be found" echo "*** If libfame was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the LIBFAME_CONFIG environment variable to the" echo "*** full path to libfame-config." else if test -f conf.libfametest ; then : else echo "*** Could not run libfame test program, checking why..." CFLAGS="$CFLAGS $LIBFAME_CFLAGS" LIBS="$LIBS $LIBFAME_LIBS" AC_TRY_LINK([ #include #include ], [ return ((libfame_major_version) || (libfame_minor_version) || (libfame_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding libfame or finding the wrong" echo "*** version of LIBFAME. If it is not finding libfame, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means libfame was incorrectly installed" echo "*** or that you have moved libfame since it was installed. In the latter case, you" echo "*** may want to edit the libfame-config script: $LIBFAME_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi LIBFAME_CFLAGS="" LIBFAME_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(LIBFAME_CFLAGS) AC_SUBST(LIBFAME_LIBS) rm -f conf.libfametest ]) gst-plugins-good-0.10.31/m4/stdint_h.m40000644000175000017500000000161411720560210014371 00000000000000# stdint_h.m4 serial 6 dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1; return !i;], gl_cv_header_stdint_h=yes, gl_cv_header_stdint_h=no)]) if test $gl_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) gst-plugins-good-0.10.31/m4/gettext.m40000644000175000017500000003457011720560207014256 00000000000000# gettext.m4 serial 60 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) gst-plugins-good-0.10.31/m4/libmikmod.m40000644000175000017500000002213311671175354014543 00000000000000# Configure paths for libmikmod # # Derived from glib.m4 (Owen Taylor 97-11-3) # Improved by Chris Butler # dnl AM_PATH_LIBMIKMOD([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libmikmod, and define LIBMIKMOD_CFLAGS, LIBMIKMOD_LIBS and dnl LIBMIKMOD_LDADD dnl AC_DEFUN([AM_PATH_LIBMIKMOD], [dnl dnl Get the cflags and libraries from the libmikmod-config script dnl AC_ARG_WITH(libmikmod-prefix, AC_HELP_STRING([--with-libmikmod-prefix=PFX], [prefix where libmikmod is installed (optional)]), libmikmod_config_prefix="$withval", libmikmod_config_prefix="") AC_ARG_WITH(libmikmod-exec-prefix, AC_HELP_STRING([--with-libmikmod-exec-prefix=PFX], [exec prefix where libmikmod is installed (optional)]), libmikmod_config_exec_prefix="$withval", libmikmod_config_exec_prefix="") AC_ARG_ENABLE(libmikmodtest, AC_HELP_STRING([--disable-libmikmodtest], [Do not try to compile and run a test libmikmod program]), , enable_libmikmodtest=yes) if test x$libmikmod_config_exec_prefix != x ; then libmikmod_config_args="$libmikmod_config_args --exec-prefix=$libmikmod_config_exec_prefix" if test x${LIBMIKMOD_CONFIG+set} != xset ; then LIBMIKMOD_CONFIG=$libmikmod_config_exec_prefix/bin/libmikmod-config fi fi if test x$libmikmod_config_prefix != x ; then libmikmod_config_args="$libmikmod_config_args --prefix=$libmikmod_config_prefix" if test x${LIBMIKMOD_CONFIG+set} != xset ; then LIBMIKMOD_CONFIG=$libmikmod_config_prefix/bin/libmikmod-config fi fi AC_PATH_PROG(LIBMIKMOD_CONFIG, libmikmod-config, no) min_libmikmod_version=ifelse([$1], ,3.1.5,$1) AC_MSG_CHECKING(for libmikmod - version >= $min_libmikmod_version) no_libmikmod="" if test "$LIBMIKMOD_CONFIG" = "no" ; then no_libmikmod=yes else LIBMIKMOD_CFLAGS=`$LIBMIKMOD_CONFIG $libmikmod_config_args --cflags` LIBMIKMOD_LIBS=`$LIBMIKMOD_CONFIG $libmikmod_config_args --libs` LIBMIKMOD_LDADD=`$LIBMIKMOD_CONFIG $libmikmod_config_args --ldadd` libmikmod_config_major_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\1/'` libmikmod_config_minor_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\2/'` libmikmod_config_micro_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\3/'` if test "x$enable_libmikmodtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" AC_LANG_SAVE AC_LANG_C CFLAGS="$CFLAGS $LIBMIKMOD_CFLAGS $LIBMIKMOD_LDADD" LIBS="$LIBMIKMOD_LIBS $LIBS" dnl dnl Now check if the installed libmikmod is sufficiently new. (Also sanity dnl checks the results of libmikmod-config to some extent dnl rm -f conf.mikmodtest AC_TRY_RUN([ #include #include #include #include char* my_strdup (char *str) { char *new_str; if (str) { new_str = malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main() { int major,minor,micro; int libmikmod_major_version,libmikmod_minor_version,libmikmod_micro_version; char *tmp_version; system("touch conf.mikmodtest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_libmikmod_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_libmikmod_version"); exit(1); } libmikmod_major_version=(MikMod_GetVersion() >> 16) & 255; libmikmod_minor_version=(MikMod_GetVersion() >> 8) & 255; libmikmod_micro_version=(MikMod_GetVersion() ) & 255; if ((libmikmod_major_version != $libmikmod_config_major_version) || (libmikmod_minor_version != $libmikmod_config_minor_version) || (libmikmod_micro_version != $libmikmod_config_micro_version)) { printf("\n*** 'libmikmod-config --version' returned %d.%d.%d, but libmikmod (%d.%d.%d)\n", $libmikmod_config_major_version, $libmikmod_config_minor_version, $libmikmod_config_micro_version, libmikmod_major_version, libmikmod_minor_version, libmikmod_micro_version); printf ("*** was found! If libmikmod-config was correct, then it is best\n"); printf ("*** to remove the old version of libmikmod. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If libmikmod-config was wrong, set the environment variable LIBMIKMOD_CONFIG\n"); printf("*** to point to the correct copy of libmikmod-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } else if ((libmikmod_major_version != LIBMIKMOD_VERSION_MAJOR) || (libmikmod_minor_version != LIBMIKMOD_VERSION_MINOR) || (libmikmod_micro_version != LIBMIKMOD_REVISION)) { printf("*** libmikmod header files (version %ld.%ld.%ld) do not match\n", LIBMIKMOD_VERSION_MAJOR, LIBMIKMOD_VERSION_MINOR, LIBMIKMOD_REVISION); printf("*** library (version %d.%d.%d)\n", libmikmod_major_version, libmikmod_minor_version, libmikmod_micro_version); } else { if ((libmikmod_major_version > major) || ((libmikmod_major_version == major) && (libmikmod_minor_version > minor)) || ((libmikmod_major_version == major) && (libmikmod_minor_version == minor) && (libmikmod_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libmikmod (%d.%d.%d) was found.\n", libmikmod_major_version, libmikmod_minor_version, libmikmod_micro_version); printf("*** You need a version of libmikmod newer than %d.%d.%d.\n", major, minor, micro); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the libmikmod-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libmikmod, but you can also set the LIBMIKMOD_CONFIG environment to point to the\n"); printf("*** correct copy of libmikmod-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_libmikmod=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" AC_LANG_RESTORE fi fi if test "x$no_libmikmod" = x ; then AC_MSG_RESULT([yes, `$LIBMIKMOD_CONFIG --version`]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$LIBMIKMOD_CONFIG" = "no" ; then echo "*** The libmikmod-config script installed by libmikmod could not be found" echo "*** If libmikmod was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the LIBMIKMOD_CONFIG environment variable to the" echo "*** full path to libmikmod-config." else if test -f conf.mikmodtest ; then : else echo "*** Could not run libmikmod test program, checking why..." CFLAGS="$CFLAGS $LIBMIKMOD_CFLAGS" LIBS="$LIBS $LIBMIKMOD_LIBS" AC_LANG_SAVE AC_LANG_C AC_TRY_LINK([ #include #include ], [ return (MikMod_GetVersion()!=0); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding libmikmod or finding the wrong" echo "*** version of libmikmod. If it is not finding libmikmod, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location. Also, make sure you have run ldconfig if that" echo "*** is required on your system." echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means libmikmod was incorrectly installed" echo "*** or that you have moved libmikmod since it was installed. In the latter case, you" echo "*** may want to edit the libmikmod-config script: $LIBMIKMOD_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" AC_LANG_RESTORE fi fi LIBMIKMOD_CFLAGS="" LIBMIKMOD_LIBS="" LIBMIKMOD_LDADD="" ifelse([$3], , :, [$3]) fi AC_SUBST(LIBMIKMOD_CFLAGS) AC_SUBST(LIBMIKMOD_LIBS) AC_SUBST(LIBMIKMOD_LDADD) rm -f conf.mikmodtest ]) gst-plugins-good-0.10.31/m4/gst-alsa.m40000644000175000017500000001102011671175354014300 00000000000000dnl Configure Paths for Alsa dnl Some modifications by Richard Boulton dnl Christopher Lansdown dnl Jaroslav Kysela dnl Last modification: alsa.m4,v 1.23 2004/01/16 18:14:22 tiwai Exp dnl AM_PATH_ALSA([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for libasound, and define ALSA_CFLAGS and ALSA_LIBS as appropriate. dnl enables arguments --with-alsa-prefix= dnl --with-alsa-enc-prefix= dnl --disable-alsatest dnl dnl For backwards compatibility, if ACTION_IF_NOT_FOUND is not specified, dnl and the alsa libraries are not found, a fatal AC_MSG_ERROR() will result. dnl AC_DEFUN([AM_PATH_ALSA], [dnl Save the original CFLAGS, LDFLAGS, and LIBS alsa_save_CFLAGS="$CFLAGS" alsa_save_LDFLAGS="$LDFLAGS" alsa_save_LIBS="$LIBS" alsa_found=yes dnl dnl Get the cflags and libraries for alsa dnl AC_ARG_WITH(alsa-prefix, AC_HELP_STRING([--with-alsa-prefix=PFX], [prefix where Alsa library is installed(optional)]), [alsa_prefix="$withval"], [alsa_prefix=""]) AC_ARG_WITH(alsa-inc-prefix, AC_HELP_STRING([--with-alsa-inc-prefix=PFX], [prefix where include libraries are (optional)]), [alsa_inc_prefix="$withval"], [alsa_inc_prefix=""]) dnl FIXME: this is not yet implemented dnl AC_ARG_ENABLE(alsatest, dnl AC_HELP_STRING([--disable-alsatest], dnl [do not try to compile and run a test Alsa program], dnl [enable_alsatest=no], [enable_alsatest=yes]) dnl Add any special include directories AC_MSG_CHECKING(for ALSA CFLAGS) if test "$alsa_inc_prefix" != "" ; then ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" CFLAGS="$CFLAGS -I$alsa_inc_prefix" fi AC_MSG_RESULT($ALSA_CFLAGS) dnl add any special lib dirs AC_MSG_CHECKING(for ALSA LDFLAGS) if test "$alsa_prefix" != "" ; then ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" LDFLAGS="$LDFLAGS $ALSA_LIBS" fi dnl add the alsa library ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" LIBS=`echo $LIBS | sed 's/-lm//'` LIBS=`echo $LIBS | sed 's/-ldl//'` LIBS=`echo $LIBS | sed 's/-lpthread//'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="$ALSA_LIBS $LIBS" AC_MSG_RESULT($ALSA_LIBS) dnl Check for a working version of libasound that is of the right version. min_alsa_version=ifelse([$1], ,0.1.1,$1) AC_MSG_CHECKING(for libasound headers version >= $min_alsa_version) no_alsa="" alsa_min_major_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` alsa_min_minor_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` alsa_min_micro_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` AC_LANG_SAVE AC_LANG_C AC_TRY_COMPILE([ #include ], [ void main(void) { /* ensure backward compatibility */ #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #endif #if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) #define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR #endif #if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) #define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR #endif # if(SND_LIB_MAJOR > $alsa_min_major_version) exit(0); # else # if(SND_LIB_MAJOR < $alsa_min_major_version) # error not present # endif # if(SND_LIB_MINOR > $alsa_min_minor_version) exit(0); # else # if(SND_LIB_MINOR < $alsa_min_minor_version) # error not present # endif # if(SND_LIB_SUBMINOR < $alsa_min_micro_version) # error not present # endif # endif # endif exit(0); } ], [AC_MSG_RESULT(found.)], [AC_MSG_RESULT(not present.) ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)]) alsa_found=no] ) AC_LANG_RESTORE dnl Now that we know that we have the right version, let's see if we have the library and not just the headers. if test "x$enable_alsatest" = "xyes"; then AC_CHECK_LIB([asound], [snd_ctl_open],, [ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)]) alsa_found=no] ) fi if test "x$alsa_found" = "xyes" ; then ifelse([$2], , :, [$2]) LIBS=`echo $LIBS | sed 's/-lasound//g'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="-lasound $LIBS" fi if test "x$alsa_found" = "xno" ; then ifelse([$3], , :, [$3]) CFLAGS="$alsa_save_CFLAGS" LDFLAGS="$alsa_save_LDFLAGS" LIBS="$alsa_save_LIBS" ALSA_CFLAGS="" ALSA_LIBS="" fi dnl That should be it. Now just export out symbols: AC_SUBST(ALSA_CFLAGS) AC_SUBST(ALSA_LIBS) ]) gst-plugins-good-0.10.31/m4/lib-ld.m40000644000175000017500000000653111720560210013723 00000000000000# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) gst-plugins-good-0.10.31/m4/as-arts.m40000644000175000017500000001657211671175354014160 00000000000000dnl as-arts.m4 0.1.0 dnl $Id: as-arts.m4,v 1.5 2004/05/21 11:20:49 thomasvs Exp $ dnl if you copy this file to your cvs, dnl add this file using cvs -ko add to retain this header dnl This is an example arts .m4 adapted and scrubbed by thomasvs # Configure paths for ARTS # Philip Stadermann 2001-06-21 # stolen from esd.m4 dnl AM_PATH_ARTS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for ARTS, and define ARTS_CXXFLAGS and ARTS_LIBS dnl AC_DEFUN([AM_PATH_ARTS], [dnl dnl Get the cflags and libraries from the artsc-config script dnl AC_ARG_WITH(arts-prefix, AC_HELP_STRING([--with-arts-prefix=PFX], [prefix where ARTS is installed (optional)]), arts_prefix="$withval", arts_prefix="") AC_ARG_WITH(arts-exec-prefix, AC_HELP_STRING([--with-arts-exec-prefix=PFX], [exec prefix where ARTS is installed (optional)]), arts_exec_prefix="$withval", arts_exec_prefix="") AC_ARG_ENABLE(artstest, AC_HELP_STRING([--disable-artstest], [do not try to compile and run a test ARTS program]), , enable_artstest=yes) if test x$arts_exec_prefix != x ; then arts_args="$arts_args --exec-prefix=$arts_exec_prefix" if test x${ARTS_CONFIG+set} != xset ; then ARTS_CONFIG=$arts_exec_prefix/bin/artsc-config fi fi if test x$arts_prefix != x ; then arts_args="$arts_args --prefix=$arts_prefix" if test x${ARTS_CONFIG+set} != xset ; then ARTS_CONFIG=$arts_prefix/bin/artsc-config fi fi AC_PATH_PROG(ARTS_CONFIG, artsc-config, no) min_arts_version=ifelse([$1], ,0.9.5,$1) AC_MSG_CHECKING(for ARTS artsc - version >= $min_arts_version) no_arts="" if test "$ARTS_CONFIG" = "no" ; then no_arts=yes else # FIXME: thomas added this sed to get arts path instead of artsc # replace -I.../artsc with -I.../arts ARTS_CXXFLAGS=`$ARTS_CONFIG $artsconf_args --cflags | artsc-config --cflags | sed 's/\(-I.*\)artsc/\1arts/'` ARTS_LIBS=`$ARTS_CONFIG $artsconf_args --libs | sed 's/artsc$/arts/'` arts_major_version=`$ARTS_CONFIG $arts_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` arts_minor_version=`$ARTS_CONFIG $arts_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` arts_micro_version=`$ARTS_CONFIG $arts_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_artstest" = "xyes" ; then dnl ac_save_CXXFLAGS="$CXXFLAGS" dnl ac_save_LIBS="$LIBS" dnl CFLAGS="$CFLAGS $ARTS_CXXFLAGS" dnl LIBS="$LIBS $ARTS_LIBS" dnl dnl Now check if the installed ARTS is sufficiently new. (Also sanity dnl checks the results of artsc-config to some extent) dnl dnl a*s: to successfully compile the C++ test app, we need to dnl first make sure we're going to compile it as C++ (with AC_LANG_PUSH), dnl then add the CFLAGS and CLIBS of arts which we just discovered to the dnl C++ compilation and linking flags. dnl We also need to clean up after the test; this means using AC_LANG_POP dnl and restoring the CPPFLAGS and LDFLAGS from the saved values we take dnl here. dnl ask nicely for C++ compilation AC_LANG_PUSH(C++) dnl save compilation and link flags and make our own ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LDFLAGS="$LDFLAGS" AC_SUBST(CPPFLAGS,"$CPPFLAGS $ARTS_CXXFLAGS") AC_SUBST(LDFLAGS,"$LDFLAGS $ARTS_CLIBS") rm -f conf.artstest AC_TRY_RUN([ #include #include #include #include char* my_strdup (char *str) { char *new_str; if (str) { // thomas: the original test did not have the typecast new_str = (char *) malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main () { int major, minor, micro; char *tmp_version; system ("touch conf.artstest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_arts_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_arts_version"); exit(1); } if (($arts_major_version > major) || (($arts_major_version == major) && ($arts_minor_version > minor)) || (($arts_major_version == major) && ($arts_minor_version == minor) && ($arts_micro_version >= micro))) { return 0; } else { printf("\n*** 'artsc-config --version' returned %d.%d.%d, but the minimum version\n", $arts_major_version, $arts_minor_version, $arts_micro_version); printf("*** of ARTS required is %d.%d.%d. If artsc-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If artsc-config was wrong, set the environment variable ARTS_CONFIG\n"); printf("*** to point to the correct copy of artsc-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_arts=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) dnl CFLAGS="$ac_save_CFLAGS" dnl LIBS="$ac_save_LIBS" dnl a*s this is were we clean up after the test AC_LANG_POP(C++) CXXFLAGS="$ac_save_CXXFLAGS" LDFLAGS="$ac_save_LDFLAGS" dnl a*s we are sure that these are right, so we make them active AC_SUBST(CXXFLAGS,"$CXXFLAGS") AC_SUBST(LDFLAGS,"$LDFLAGS") fi fi if test "x$no_arts" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$ARTS_CONFIG" = "no" ; then echo "*** The artsc-config script installed by ARTS could not be found" echo "*** If ARTS was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the ARTS_CONFIG environment variable to the" echo "*** full path to artsc-config." else if test -f conf.artstest ; then : else echo "*** Could not run ARTS test program, checking why..." CFLAGS="$CFLAGS $ARTS_CXXFLAGS" LIBS="$LIBS $ARTS_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding ARTS or finding the wrong" echo "*** version of ARTS. If it is not finding ARTS, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means ARTS was incorrectly installed" echo "*** or that you have moved ARTS since it was installed. In the latter case, you" echo "*** may want to edit the artsc-config script: $ARTS_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi ARTS_CXXFLAGS="" ARTS_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(ARTS_CXXFLAGS) AC_SUBST(ARTS_LIBS) rm -f conf.artstest ]) dnl release C++ question gst-plugins-good-0.10.31/m4/gst-shout2.m40000644000175000017500000000665211671175354014623 00000000000000# Configure paths for libshout # Jack Moffitt 08-06-2001 # Shamelessly stolen from Owen Taylor and Manish Singh dnl AM_PATH_SHOUT2([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libshout 2, and define SHOUT2_CFLAGS and SHOUT2_LIBS dnl AC_DEFUN([AM_PATH_SHOUT2], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(shout2-prefix,[ --with-shout2-prefix=PFX Prefix where libshout2 is installed (optional)], shout2_prefix="$withval", shout2_prefix="") AC_ARG_ENABLE(shout2test, [ --disable-shout2test Do not try to compile and run a test shout2 program],, enable_shout2test=yes) if test "x$shout2_prefix" != "xNONE" ; then SHOUT2_CFLAGS="-I$shout2_prefix/include" SHOUT2_LIBS="-L$shout2_prefix/lib" elif test "x$prefix" != "x"; then SHOUT2_CFLAGS="-I$prefix/include" SHOUT2_LIBS="-L$prefix/lib" fi SHOUT2_LIBS="$SHOUT2_LIBS -lshout -lpthread" case $host in *-*-solaris*) SHOUT2_LIBS="$SHOUT2_LIBS -lnsl -lsocket -lresolv" esac AC_MSG_CHECKING(for shout2) no_shout2="" if test "x$enable_shout2test" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SHOUT2_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS" LIBS="$LIBS $SHOUT2_LIBS $OGG_LIBS $VORBIS_LIBS" dnl dnl Now check if the installed shout2 is sufficiently new. dnl rm -f conf.shout2test AC_TRY_RUN([ #include #include #include #include int main () { int major, minor, patch; system("touch conf.shout2test"); shout_version(&major, &minor, &patch); if (major < 2) return 1; return 0; } ],, no_shout2=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_shout2" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.shout2test ; then : else echo "*** Could not run Shout2 test program, checking why..." CFLAGS="$CFLAGS $SHOUT2_CFLAGS $OGG_CFLAGS $VORBIS_CFLAGS" LIBS="$LIBS $SHOUT2_LIBS $OGG_LIBS $VORBIS_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding Shout2 or finding the wrong" echo "*** version of Shout2. If it is not finding Shout2, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means Shout2 was incorrectly installed" echo "*** or that you have moved Shout2 since it was installed. In the latter case, you" echo "*** may want to edit the shout-config script: $SHOUT2_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi SHOUT2_CFLAGS="" SHOUT2_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(SHOUT2_CFLAGS) AC_SUBST(SHOUT2_LIBS) rm -f conf.shout2test ]) gst-plugins-good-0.10.31/m4/aalib.m40000644000175000017500000001444111671175354013647 00000000000000# Configure paths for AALIB # touched up for clean output by Thomas Vander Stichele # Jan Hubicka 4/22/2001 # stolen from Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_AALIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for AALIB, and define AALIB_CFLAGS and AALIB_LIBS dnl AC_DEFUN([AM_PATH_AALIB], [dnl dnl Get the cflags and libraries from the aalib-config script dnl AC_ARG_WITH(aalib-prefix, AC_HELP_STRING([--with-aalib-prefix=PFX], [prefix where AALIB is installed (optional)]), aalib_prefix="$withval", aalib_prefix="") AC_ARG_WITH(aalib-exec-prefix, AC_HELP_STRING([--with-aalib-exec-prefix=PFX], [exec prefix where AALIB is installed (optional)]), aalib_exec_prefix="$withval", aalib_exec_prefix="") AC_ARG_ENABLE(aalibtest, AC_HELP_STRING([--disable-aalibtest], [do not try to compile and run a test AALIB program]), , enable_aalibtest=yes) if test x$aalib_exec_prefix != x ; then aalib_args="$aalib_args --exec-prefix=$aalib_exec_prefix" if test x${AALIB_CONFIG+set} != xset ; then AALIB_CONFIG=$aalib_exec_prefix/bin/aalib-config fi fi if test x$aalib_prefix != x ; then aalib_args="$aalib_args --prefix=$aalib_prefix" if test x${AALIB_CONFIG+set} != xset ; then AALIB_CONFIG=$aalib_prefix/bin/aalib-config fi fi AC_PATH_PROG(AALIB_CONFIG, aalib-config, no) min_aalib_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for AALIB - version >= $min_aalib_version) no_aalib="" if test "$AALIB_CONFIG" = "no" ; then no_aalib=yes else AALIB_CFLAGS=`$AALIB_CONFIG $aalibconf_args --cflags` AALIB_LIBS=`$AALIB_CONFIG $aalibconf_args --libs` aalib_major_version=`$AALIB_CONFIG $aalib_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` aalib_minor_version=`$AALIB_CONFIG $aalib_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` aalib_micro_version=`$AALIB_CONFIG $aalib_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_aalibtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $AALIB_CFLAGS" LIBS="$LIBS $AALIB_LIBS" dnl dnl Now check if the installed AALIB is sufficiently new. (Also sanity dnl checks the results of aalib-config to some extent dnl rm -f conf.aalibtest AC_TRY_RUN([ #include #include #include #include "aalib.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.aalibtest"); */ { FILE *fp = fopen("conf.aalibtest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_aalib_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_aalib_version"); exit(1); } if (($aalib_major_version > major) || (($aalib_major_version == major) && ($aalib_minor_version > minor)) || (($aalib_major_version == major) && ($aalib_minor_version == minor) && ($aalib_micro_version >= micro))) { return 0; } else { printf("\n*** 'aalib-config --version' returned %d.%d.%d, but the minimum version\n", $aalib_major_version, $aalib_minor_version, $aalib_micro_version); printf("*** of AALIB required is %d.%d.%d. If aalib-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If aalib-config was wrong, set the environment variable AALIB_CONFIG\n"); printf("*** to point to the correct copy of aalib-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_aalib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_aalib" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$AALIB_CONFIG" = "no" ; then echo "*** The aalib-config script installed by AALIB could not be found" echo "*** If AALIB was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the AALIB_CONFIG environment variable to the" echo "*** full path to aalib-config." else if test -f conf.aalibtest ; then : else echo "*** Could not run AALIB test program, checking why..." CFLAGS="$CFLAGS $AALIB_CFLAGS" LIBS="$LIBS $AALIB_LIBS" AC_TRY_LINK([ #include #include "AALIB.h" ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding AALIB or finding the wrong" echo "*** version of AALIB. If it is not finding AALIB, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means AALIB was incorrectly installed" echo "*** or that you have moved AALIB since it was installed. In the latter case, you" echo "*** may want to edit the aalib-config script: $AALIB_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi AALIB_CFLAGS="" AALIB_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(AALIB_CFLAGS) AC_SUBST(AALIB_LIBS) rm -f conf.aalibtest ]) gst-plugins-good-0.10.31/m4/gtk.m40000644000175000017500000002013711671175354013363 00000000000000# Configure paths for GTK+ # Owen Taylor 97-11-3 dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS dnl AC_DEFUN([AM_PATH_GTK], [dnl dnl Get the cflags and libraries from the gtk-config script dnl AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], gtk_config_prefix="$withval", gtk_config_prefix="") AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], , enable_gtktest=yes) for module in . $4 do case "$module" in gthread) gtk_config_args="$gtk_config_args gthread" ;; esac done if test x$gtk_config_exec_prefix != x ; then gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config fi fi if test x$gtk_config_prefix != x ; then gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_prefix/bin/gtk-config fi fi AC_PATH_PROG(GTK_CONFIG, gtk-config, no) min_gtk_version=ifelse([$1], ,0.99.7,$1) AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) no_gtk="" if test "$GTK_CONFIG" = "no" ; then no_gtk=yes else GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" dnl dnl Now check if the installed GTK is sufficiently new. (Also sanity dnl checks the results of gtk-config to some extent dnl rm -f conf.gtktest AC_TRY_RUN([ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.gtktest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If gtk-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } #if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } #endif /* defined (GTK_MAJOR_VERSION) ... */ else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); printf("*** correct copy of gtk-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$GTK_CONFIG" = "no" ; then echo "*** The gtk-config script installed by GTK could not be found" echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GTK_CONFIG environment variable to the" echo "*** full path to gtk-config." else if test -f conf.gtktest ; then : else echo "*** Could not run GTK test program, checking why..." CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" AC_TRY_LINK([ #include #include ], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK or finding the wrong" echo "*** version of GTK. If it is not finding GTK, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" echo "*** came with the system with the command" echo "***" echo "*** rpm --erase --nodeps gtk gtk-devel" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK was incorrectly installed" echo "*** or that you have moved GTK since it was installed. In the latter case, you" echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) rm -f conf.gtktest ]) gst-plugins-good-0.10.31/m4/gst-artsc.m40000644000175000017500000000155511671175354014510 00000000000000dnl Perform a check for existence of ARTSC dnl Richard Boulton dnl Last modification: 26/06/2001 dnl GST_CHECK_ARTSC() dnl dnl This check was written for GStreamer: it should be renamed and checked dnl for portability if you decide to use it elsewhere. dnl AC_DEFUN([GST_CHECK_ARTSC], [ AC_PATH_PROG(ARTSC_CONFIG, artsc-config, no) if test "x$ARTSC_CONFIG" = "xno"; then AC_MSG_WARN([Couldn't find artsc-config]) HAVE_ARTSC=no ARTSC_LIBS= ARTSC_CFLAGS= else ARTSC_LIBS=`artsc-config --libs` ARTSC_CFLAGS=`artsc-config --cflags` dnl AC_CHECK_HEADER uses CPPFLAGS, but not CFLAGS. dnl FIXME: Ensure only suitable flags result from artsc-config --cflags CPPFLAGS="$CPPFLAGS $ARTSC_CFLAGS" AC_CHECK_HEADER(artsc.h, HAVE_ARTSC=yes, HAVE_ARTSC=no) fi AC_SUBST(ARTSC_LIBS) AC_SUBST(ARTSC_CFLAGS) ]) gst-plugins-good-0.10.31/m4/nls.m40000644000175000017500000000226611720560210013355 00000000000000# nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) gst-plugins-good-0.10.31/m4/gst-matroska.m40000644000175000017500000001776111671175354015223 00000000000000# Configure paths for libebml dnl PATH_EBML([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libebml, and define EBML_CFLAGS and EBML_LIBS dnl AC_DEFUN([PATH_EBML], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(ebml-prefix,[ --with-ebml-prefix=PFX Prefix where libebml is installed (optional)], ebml_prefix="$withval", ebml_prefix="") AC_ARG_WITH(ebml-include,[ --with-ebml-include=DIR Path to where the libebml include files installed (optional)], ebml_include="$withval", ebml_include="") AC_ARG_WITH(ebml-lib,[ --with-ebml-lib=DIR Path to where the libebml library installed (optional)], ebml_lib="$withval", ebml_lib="") AC_ARG_ENABLE(ebmltest, [ --disable-ebmltest Do not try to compile and run a test EBML program],, enable_ebmltest=yes) if test "x$ebml_prefix" != "x"; then ebml_args="$ebml_args --prefix=$ebml_prefix" if test "x$ebml_include" != "x"; then EBML_CFLAGS="-I$ebml_include" else EBML_CFLAGS="-I$ebml_prefix/include/ebml" fi if test "x$ebml_lib" != "x"; then EBML_LIBS="-L$ebml_lib" else EBML_LIBS="-L$ebml_prefix/lib" fi elif test "x$prefix" != "xNONE"; then ebml_args="$ebml_args --prefix=$prefix" if test "x$ebml_include" != "x"; then EBML_CFLAGS="-I$ebml_include" else EBML_CFLAGS="-I$prefix/include/ebml" fi if test "x$ebml_lib" != "x"; then EBML_LIBS="-L$ebml_lib" else EBML_LIBS="-L$prefix/lib" fi else if test "x$ebml_include" != "x"; then EBML_CFLAGS="-I$ebml_include" else EBML_CFLAGS="-I/usr/include/ebml -I/usr/local/include/ebml" fi if test "x$ebml_lib" != "x"; then EBML_LIBS="-L$ebml_lib" else EBML_LIBS="-L/usr/local/lib" fi fi EBML_LIBS="$EBML_LIBS -lebml" AC_MSG_CHECKING(for EBML) no_ebml="" if test "x$enable_ebmltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $EBML_CFLAGS" LIBS="$LIBS $EBML_LIBS" dnl dnl Now check if the installed EBML is sufficiently new. dnl rm -f conf.ebmltest AC_TRY_RUN([ #include #include #include #include int main () { system("touch conf.ebmltest"); return 0; } ],, no_ebml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_ebml" = "x" ; then AC_MSG_RESULT(yes) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) if test -f conf.ebmltest ; then : else echo "*** Could not run Ebml test program, checking why..." CFLAGS="$CFLAGS $EBML_CFLAGS" LIBS="$LIBS $EBML_LIBS" AC_TRY_LINK([ #include #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding EBML or finding the wrong" echo "*** version of EBML. If it is not finding EBML, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means EBML was incorrectly installed" echo "*** or that you have moved EBML since it was installed." ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi EBML_CFLAGS="" EBML_LIBS="" ifelse([$2], , :, [$2]) fi AC_SUBST(EBML_CFLAGS) AC_SUBST(EBML_LIBS) rm -f conf.ebmltest ]) # Configure paths for libmatroska dnl PATH_MATROSKA(MIN_VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for libmatroska, and define MATROSKA_CFLAGS and MATROSKA_LIBS dnl AC_DEFUN([PATH_MATROSKA], [dnl dnl Get the cflags and libraries dnl AC_ARG_WITH(matroska-prefix,[ --with-matroska-prefix=PFX Prefix where libmatroska is installed (optional)], matroska_prefix="$withval", matroska_prefix="") AC_ARG_WITH(matroska-include,[ --with-matroska-include=DIR Path to where the libmatroska include files installed (optional)], matroska_include="$withval", matroska_include="") AC_ARG_WITH(matroska-lib,[ --with-matroska-lib=DIR Path to where the libmatroska library installed (optional)], matroska_lib="$withval", matroska_lib="") AC_ARG_ENABLE(matroskatest, [ --disable-matroskatest Do not try to compile and run a test Matroska program],, enable_matroskatest=yes) if test "x$matroska_prefix" != "x"; then matroska_args="$matroska_args --prefix=$matroska_prefix" if test "x$matroska_include" != "x"; then MATROSKA_CFLAGS="-I$matroska_include" else MATROSKA_CFLAGS="-I$matroska_prefix/include/matroska" fi if test "x$matroska_lib" != "x"; then MATROSKA_LIBS="-L$matroska_lib" else MATROSKA_LIBS="-L$matroska_prefix/lib" fi elif test "x$prefix" != "xNONE"; then matroska_args="$matroska_args --prefix=$prefix" if test "x$matroska_include" != "x"; then MATROSKA_CFLAGS="-I$matroska_include" else MATROSKA_CFLAGS="-I$prefix/include/matroska" fi if test "x$matroska_lib" != "x"; then MATROSKA_LIBS="-L$matroska_lib" else MATROSKA_LIBS="-L$prefix/lib" fi else if test "x$matroska_include" != "x"; then MATROSKA_CFLAGS="-I$matroska_include" else MATROSKA_CFLAGS="-I/usr/include/matroska -I/usr/local/include/matroska" fi if test "x$matroska_lib" != "x"; then MATROSKA_LIBS="-L$matroska_lib" else MATROSKA_LIBS="-L/usr/local/lib" fi fi MATROSKA_LIBS="$MATROSKA_LIBS -lmatroska" AC_MSG_CHECKING(for Matroska) no_matroska="" if test "x$enable_matroskatest" = "xyes" ; then ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CXXFLAGS="$CXXFLAGS $MATROSKA_CFLAGS $EBML_CFLAGS" LIBS="$LIBS $MATROSKA_LIBS $EBML_LIBS" dnl dnl Now check if the installed Matroska is sufficiently new. dnl rm -f conf.matroskatest AC_LANG_CPLUSPLUS AC_TRY_RUN([ #include #include #include #include #include using namespace LIBMATROSKA_NAMESPACE; int main () { FILE *f; f = fopen("conf.matroskatest", "wb"); if (f == NULL) return 1; fprintf(f, "%s\n", KaxCodeVersion.c_str()); fclose(f); return 0; } ],, no_matroska=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) AC_LANG_C CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi if test "x$no_matroska" = "x" -a -f conf.matroskatest ; then AC_MSG_RESULT(yes) AC_MSG_CHECKING(Matroska version) matroska_version=`cat conf.matroskatest` mk_MAJVER=`echo $1 | cut -d"." -f1` mk_MINVER=`echo $1 | cut -d"." -f2` mk_RELVER=`echo $1 | cut -d"." -f3` mver_ok=`sed 's;\.;\ ;g' < conf.matroskatest | (read -a mver if test ${mver[[0]]} -gt $mk_MAJVER ; then mver_ok=1 elif test ${mver[[0]]} -lt $mk_MAJVER ; then mver_ok=0 else if test ${mver[[1]]} -gt $mk_MINVER ; then mver_ok=1 elif test ${mver[[1]]} -lt $mk_MINVER ; then mver_ok=0 else if test ${mver[[2]]} -ge $mk_RELVER ; then mver_ok=1 else mver_ok=0 fi fi fi echo $mver_ok )` if test "$mver_ok" = "1" ; then AC_MSG_RESULT($matroska_version ok) ifelse([$2], , :, [$2]) else AC_MSG_RESULT($matroska_version too old) echo '*** Your Matroska version is too old. Upgrade to at least version' echo '*** $1 and re-run configure.' ifelse([$3], , :, [$3]) fi else AC_MSG_RESULT(no) ifelse([$3], , :, [$3]) fi AC_SUBST(MATROSKA_CFLAGS) AC_SUBST(MATROSKA_LIBS) rm -f conf.matroskatest ]) gst-plugins-good-0.10.31/m4/glib.m40000644000175000017500000002037411671175354013516 00000000000000# Configure paths for GLIB # Owen Taylor 97-11-3 dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or dnl gthread is specified in MODULES, pass to glib-config dnl AC_DEFUN([AM_PATH_GLIB], [dnl dnl Get the cflags and libraries from the glib-config script dnl AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)], glib_config_prefix="$withval", glib_config_prefix="") AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)], glib_config_exec_prefix="$withval", glib_config_exec_prefix="") AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program], , enable_glibtest=yes) if test x$glib_config_exec_prefix != x ; then glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix" if test x${GLIB_CONFIG+set} != xset ; then GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config fi fi if test x$glib_config_prefix != x ; then glib_config_args="$glib_config_args --prefix=$glib_config_prefix" if test x${GLIB_CONFIG+set} != xset ; then GLIB_CONFIG=$glib_config_prefix/bin/glib-config fi fi for module in . $4 do case "$module" in gmodule) glib_config_args="$glib_config_args gmodule" ;; gthread) glib_config_args="$glib_config_args gthread" ;; esac done AC_PATH_PROG(GLIB_CONFIG, glib-config, no) min_glib_version=ifelse([$1], ,0.99.7,$1) AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) no_glib="" if test "$GLIB_CONFIG" = "no" ; then no_glib=yes else GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags` GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs` glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_glibtest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$GLIB_LIBS $LIBS" dnl dnl Now check if the installed GLIB is sufficiently new. (Also sanity dnl checks the results of glib-config to some extent dnl rm -f conf.glibtest AC_TRY_RUN([ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.glibtest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_glib_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_glib_version"); exit(1); } if ((glib_major_version != $glib_config_major_version) || (glib_minor_version != $glib_config_minor_version) || (glib_micro_version != $glib_config_micro_version)) { printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, glib_major_version, glib_minor_version, glib_micro_version); printf ("*** was found! If glib-config was correct, then it is best\n"); printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n"); printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } else if ((glib_major_version != GLIB_MAJOR_VERSION) || (glib_minor_version != GLIB_MINOR_VERSION) || (glib_micro_version != GLIB_MICRO_VERSION)) { printf("*** GLIB header files (version %d.%d.%d) do not match\n", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", glib_major_version, glib_minor_version, glib_micro_version); } else { if ((glib_major_version > major) || ((glib_major_version == major) && (glib_minor_version > minor)) || ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", glib_major_version, glib_minor_version, glib_micro_version); printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the glib-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n"); printf("*** correct copy of glib-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_glib" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$GLIB_CONFIG" = "no" ; then echo "*** The glib-config script installed by GLIB could not be found" echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GLIB_CONFIG environment variable to the" echo "*** full path to glib-config." else if test -f conf.glibtest ; then : else echo "*** Could not run GLIB test program, checking why..." CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$LIBS $GLIB_LIBS" AC_TRY_LINK([ #include #include ], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GLIB or finding the wrong" echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" echo "*** came with the system with the command" echo "***" echo "*** rpm --erase --nodeps gtk gtk-devel" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GLIB was incorrectly installed" echo "*** or that you have moved GLIB since it was installed. In the latter case, you" echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GLIB_CFLAGS="" GLIB_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) rm -f conf.glibtest ]) gst-plugins-good-0.10.31/m4/freetype2.m40000644000175000017500000001175311671175354014507 00000000000000# Configure paths for FreeType2 # Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor dnl AC_CHECK_FT2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for FreeType2, and define FT2_CFLAGS and FT2_LIBS dnl AC_DEFUN([AC_CHECK_FT2], [dnl dnl Get the cflags and libraries from the freetype-config script dnl AC_ARG_WITH(ft-prefix, [ --with-ft-prefix=PREFIX Prefix where FreeType is installed (optional)], ft_config_prefix="$withval", ft_config_prefix="") AC_ARG_WITH(ft-exec-prefix, [ --with-ft-exec-prefix=PREFIX Exec prefix where FreeType is installed (optional)], ft_config_exec_prefix="$withval", ft_config_exec_prefix="") AC_ARG_ENABLE(freetypetest, [ --disable-freetypetest Do not try to compile and run a test FreeType program], [], enable_fttest=yes) if test x$ft_config_exec_prefix != x ; then ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" if test x${FT2_CONFIG+set} != xset ; then FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config fi fi if test x$ft_config_prefix != x ; then ft_config_args="$ft_config_args --prefix=$ft_config_prefix" if test x${FT2_CONFIG+set} != xset ; then FT2_CONFIG=$ft_config_prefix/bin/freetype-config fi fi AC_PATH_PROG(FT2_CONFIG, freetype-config, no) min_ft_version=ifelse([$1], ,6.1.0,$1) AC_MSG_CHECKING(for FreeType - version >= $min_ft_version) no_ft="" if test "$FT2_CONFIG" = "no" ; then no_ft=yes else FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` ft_min_major_version=`echo $min_ft_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ft_min_minor_version=`echo $min_ft_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ft_min_micro_version=`echo $min_ft_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test x$enable_fttest = xyes ; then ft_config_is_lt="" if test $ft_config_major_version -lt $ft_min_major_version ; then ft_config_is_lt=yes else if test $ft_config_major_version -eq $ft_min_major_version ; then if test $ft_config_minor_version -lt $ft_min_minor_version ; then ft_config_is_lt=yes else if test $ft_config_minor_version -eq $ft_min_minor_version ; then if test $ft_config_micro_version -lt $ft_min_micro_version ; then ft_config_is_lt=yes fi fi fi fi fi if test x$ft_config_is_lt = xyes ; then no_ft=yes else ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $FT2_CFLAGS" LIBS="$FT2_LIBS $LIBS" dnl dnl Sanity checks for the results of freetype-config to some extent dnl AC_TRY_RUN([ #include #include FT_FREETYPE_H #include #include int main() { FT_Library library; FT_Error error; error = FT_Init_FreeType(&library); if (error) return 1; else { FT_Done_FreeType(library); return 0; } } ],, no_ft=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi # test $ft_config_version -lt $ft_min_version fi # test x$enable_fttest = xyes fi # test "$FT2_CONFIG" = "no" if test x$no_ft = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$FT2_CONFIG" = "no" ; then echo "*** The freetype-config script installed by FreeType 2 could not be found." echo "*** If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the FT2_CONFIG environment variable to the" echo "*** full path to freetype-config." else if test x$ft_config_is_lt = xyes ; then echo "*** Your installed version of the FreeType 2 library is too old." echo "*** If you have different versions of FreeType 2, make sure that" echo "*** correct values for --with-ft-prefix or --with-ft-exec-prefix" echo "*** are used, or set the FT2_CONFIG environment variable to the" echo "*** full path to freetype-config." else echo "*** The FreeType test program failed to run. If your system uses" echo "*** shared libraries and they are installed outside the normal" echo "*** system library path, make sure the variable LD_LIBRARY_PATH" echo "*** (or whatever is appropiate for your system) is correctly set." fi fi FT2_CFLAGS="" FT2_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(FT2_CFLAGS) AC_SUBST(FT2_LIBS) ]) gst-plugins-good-0.10.31/m4/po.m40000644000175000017500000004460611720560210013203 00000000000000# po.m4 serial 15 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" < int main() { sidTune tune = sidTune(0); } ], HAVE_SIDPLAY="yes", HAVE_SIDPLAY="no", HAVE_SIDPLAY="no") LIBS="$ac_libs_safe" AC_MSG_RESULT([$HAVE_SIDPLAY]) fi SIDPLAY_CFLAGS= SIDPLAY_LIBS="-lsidplay" AC_SUBST(SIDPLAY_CFLAGS) AC_SUBST(SIDPLAY_LIBS) AC_LANG_POP(C++) ]) gst-plugins-good-0.10.31/m4/as-liblame.m40000644000175000017500000000273511671175354014610 00000000000000# CFLAGS and library paths for LIBLAME # taken from Autostar Sandbox, http://autostars.sourceforge.net/ # inspired by xmms.m4 dnl Usage: dnl AM_PATH_LIBLAME([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl FIXME: version checking does not work currently dnl dnl Example: dnl AM_PATH_LIBLAME(3.89, , AC_MSG_ERROR([*** LIBLAME >= 3.89 not installed)) dnl dnl Defines LIBLAME_LIBS dnl FIXME: should define LIBLAME_VERSION dnl AC_DEFUN([AM_PATH_LIBLAME], [ dnl check for the library AC_CHECK_LIB(mp3lame, lame_init, HAVE_LIBLAME=yes, HAVE_LIBLAME=no, -lm) dnl check if lame.h is available in the standard location or not HAVE_LAME_H_STD=no AC_CHECK_HEADER(lame.h, HAVE_LAME_H_STD=no, :) AC_CHECK_HEADER(lame/lame.h, HAVE_LAME_H_STD=yes, :) AC_MSG_CHECKING(for lame.h in right location) if test "x$HAVE_LAME_H_STD" = "xyes"; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) HAVE_LIBLAME=no if test "x$HAVE_LAME_H_STD"="xno"; then AC_MSG_WARN(lame.h found in include dir,) AC_MSG_WARN( while it should be in it's own lame/ dir !) fi fi dnl now do the actual "do we have it ?" test if test "x$HAVE_LIBLAME" = "xyes"; then LIBLAME_LIBS="-lmp3lame -lm" dnl execute what we have to because it's found ifelse([$2], , :, [$2]) else LIBLAME_LIBS="" dnl execute what we have to because it's not found ifelse([$3], , :, [$3]) fi dnl make variables available AC_SUBST(LIBLAME_LIBS) AC_SUBST(HAVE_LIBLAME) ]) gst-plugins-good-0.10.31/m4/inttypes_h.m40000644000175000017500000000164411720560210014746 00000000000000# inttypes_h.m4 serial 7 dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1; return !i;], gl_cv_header_inttypes_h=yes, gl_cv_header_inttypes_h=no)]) if test $gl_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) gst-plugins-good-0.10.31/m4/iconv.m40000644000175000017500000001375311720560210013702 00000000000000# iconv.m4 serial AM6 (gettext-0.17) dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) gst-plugins-good-0.10.31/m4/codeset.m40000644000175000017500000000136611720560207014215 00000000000000# codeset.m4 serial 2 (gettext-0.16) dnl Copyright (C) 2000-2002, 2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET); return !cs;], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) gst-plugins-good-0.10.31/m4/Makefile.in0000644000175000017500000004400411720560237014371 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = m4 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ a52.m4 \ aalib.m4 \ as-arts.m4 \ as-ffmpeg.m4 \ as-liblame.m4 \ as-slurp-ffmpeg.m4 \ check-libheader.m4 \ codeset.m4 \ esd.m4 \ freetype2.m4 \ gconf-2.m4 \ gettext.m4 \ glibc21.m4 \ glib.m4 \ gst-alsa.m4 \ gst-artsc.m4 \ gst-fionread.m4 \ gst-ivorbis.m4 \ gst-matroska.m4 \ gst-sdl.m4 \ gst-shout2.m4 \ gst-sid.m4 \ gtk.m4 \ iconv.m4 \ intdiv0.m4 \ inttypes_h.m4 \ inttypes-pri.m4 \ lcmessage.m4 \ libfame.m4 \ lib-ld.m4 \ lib-link.m4 \ libmikmod.m4 \ lib-prefix.m4 \ ogg.m4 \ progtest.m4 \ stdint_h.m4 \ uintmax_t.m4 \ vorbis.m4 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/m4/ltsugar.m40000644000175000017500000001042411720560211014236 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) gst-plugins-good-0.10.31/m4/uintmax_t.m40000644000175000017500000000211211720560210014557 00000000000000# uintmax_t.m4 serial 10 dnl Copyright (C) 1997-2004, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ(2.13) # Define uintmax_t to 'unsigned long' or 'unsigned long long' # if it is not already defined in or . AC_DEFUN([gl_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) test $ac_cv_type_unsigned_long_long_int = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, [Define to unsigned long or unsigned long long if and don't define.]) else AC_DEFINE(HAVE_UINTMAX_T, 1, [Define if you have the 'uintmax_t' type in or .]) fi ]) gst-plugins-good-0.10.31/m4/lib-prefix.m40000644000175000017500000001503611720560210014621 00000000000000# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) gst-plugins-good-0.10.31/m4/libtool.m40000644000175000017500000106043411720560211014230 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS gst-plugins-good-0.10.31/m4/inttypes-pri.m40000644000175000017500000000215211720560210015222 00000000000000# inttypes-pri.m4 serial 4 (gettext-0.16) dnl Copyright (C) 1997-2002, 2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.52) # Define PRI_MACROS_BROKEN if exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_CHECK_HEADERS([inttypes.h]) if test $ac_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], gt_cv_inttypes_pri_broken, [ AC_TRY_COMPILE([#include #ifdef PRId32 char *p = PRId32; #endif ], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, [Define if exists and defines unusable PRI* macros.]) PRI_MACROS_BROKEN=1 else PRI_MACROS_BROKEN=0 fi AC_SUBST([PRI_MACROS_BROKEN]) ]) gst-plugins-good-0.10.31/m4/gst-fionread.m40000644000175000017500000000203611671175354015156 00000000000000AC_DEFUN([GST_CHECK_FIONREAD], [ AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h) AC_CACHE_VAL(_cv_gst_fionread_in_sys_ioctl, [ AC_TRY_COMPILE([ #include #include ], [ int x = FIONREAD; if ( x ) return 0; ], _cv_gst_fionread_in_sys_ioctl="yes",_cv_gst_fionread_in_sys_ioctl="no") ]) AC_MSG_RESULT($_cv_gst_fionread_in_sys_ioctl) if test "$_cv_gst_fionread_in_sys_ioctl" = "yes"; then AC_DEFINE([HAVE_FIONREAD_IN_SYS_IOCTL], 1, [FIONREAD ioctl found in sys/ioclt.h]) else AC_MSG_CHECKING(for FIONREAD in sys/filio.h) AC_CACHE_VAL(_cv_gst_fionread_in_sys_filio, [ AC_TRY_COMPILE([ #include #include ], [ int x = FIONREAD; if ( x ) return 0; ], _cv_gst_fionread_in_sys_filio="yes",_cv_gst_fionread_in_sys_filio="no") ]) AC_MSG_RESULT($_cv_gst_fionread_in_sys_filio) if test "$_cv_gst_fionread_in_sys_filio" = "yes"; then AC_DEFINE([HAVE_FIONREAD_IN_SYS_FILIO], 1, [FIONREAD ioctl found in sys/filio.h]) fi fi ]) gst-plugins-good-0.10.31/gst/0000755000175000017500000000000011720565300012653 500000000000000gst-plugins-good-0.10.31/gst/videomixer/0000755000175000017500000000000011720565315015034 500000000000000gst-plugins-good-0.10.31/gst/videomixer/blendorc-dist.h0000644000175000017500000000517011720561032017651 00000000000000 /* autogenerated from blendorc.orc */ #ifndef _BLENDORC_H_ #define _BLENDORC_H_ #include #ifdef __cplusplus extern "C" { #endif #ifndef _ORC_INTEGER_TYPEDEFS_ #define _ORC_INTEGER_TYPEDEFS_ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include typedef int8_t orc_int8; typedef int16_t orc_int16; typedef int32_t orc_int32; typedef int64_t orc_int64; typedef uint8_t orc_uint8; typedef uint16_t orc_uint16; typedef uint32_t orc_uint32; typedef uint64_t orc_uint64; #define ORC_UINT64_C(x) UINT64_C(x) #elif defined(_MSC_VER) typedef signed __int8 orc_int8; typedef signed __int16 orc_int16; typedef signed __int32 orc_int32; typedef signed __int64 orc_int64; typedef unsigned __int8 orc_uint8; typedef unsigned __int16 orc_uint16; typedef unsigned __int32 orc_uint32; typedef unsigned __int64 orc_uint64; #define ORC_UINT64_C(x) (x##Ui64) #define inline __inline #else #include typedef signed char orc_int8; typedef short orc_int16; typedef int orc_int32; typedef unsigned char orc_uint8; typedef unsigned short orc_uint16; typedef unsigned int orc_uint32; #if INT_MAX == LONG_MAX typedef long long orc_int64; typedef unsigned long long orc_uint64; #define ORC_UINT64_C(x) (x##ULL) #else typedef long orc_int64; typedef unsigned long orc_uint64; #define ORC_UINT64_C(x) (x##UL) #endif #endif typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; #endif #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); void orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n); void orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); #ifdef __cplusplus } #endif #endif gst-plugins-good-0.10.31/gst/videomixer/blendorc-dist.c0000644000175000017500000021615711720565315017665 00000000000000 /* autogenerated from blendorc.orc */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifndef _ORC_INTEGER_TYPEDEFS_ #define _ORC_INTEGER_TYPEDEFS_ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include typedef int8_t orc_int8; typedef int16_t orc_int16; typedef int32_t orc_int32; typedef int64_t orc_int64; typedef uint8_t orc_uint8; typedef uint16_t orc_uint16; typedef uint32_t orc_uint32; typedef uint64_t orc_uint64; #define ORC_UINT64_C(x) UINT64_C(x) #elif defined(_MSC_VER) typedef signed __int8 orc_int8; typedef signed __int16 orc_int16; typedef signed __int32 orc_int32; typedef signed __int64 orc_int64; typedef unsigned __int8 orc_uint8; typedef unsigned __int16 orc_uint16; typedef unsigned __int32 orc_uint32; typedef unsigned __int64 orc_uint64; #define ORC_UINT64_C(x) (x##Ui64) #define inline __inline #else #include typedef signed char orc_int8; typedef short orc_int16; typedef int orc_int32; typedef unsigned char orc_uint8; typedef unsigned short orc_uint16; typedef unsigned int orc_uint32; #if INT_MAX == LONG_MAX typedef long long orc_int64; typedef unsigned long long orc_uint64; #define ORC_UINT64_C(x) (x##ULL) #else typedef long orc_int64; typedef unsigned long orc_uint64; #define ORC_UINT64_C(x) (x##UL) #endif #endif typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; #endif #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif #ifndef DISABLE_ORC #include #endif void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); void orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n); void orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); void orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m); /* begin Orc C target preamble */ #define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) #define ORC_ABS(a) ((a)<0 ? -(a) : (a)) #define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) #define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) #define ORC_SB_MAX 127 #define ORC_SB_MIN (-1-ORC_SB_MAX) #define ORC_UB_MAX 255 #define ORC_UB_MIN 0 #define ORC_SW_MAX 32767 #define ORC_SW_MIN (-1-ORC_SW_MAX) #define ORC_UW_MAX 65535 #define ORC_UW_MIN 0 #define ORC_SL_MAX 2147483647 #define ORC_SL_MIN (-1-ORC_SL_MAX) #define ORC_UL_MAX 4294967295U #define ORC_UL_MIN 0 #define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) #define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) #define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) #define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) #define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) #define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) #define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) #define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) #define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) #define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) #define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) #define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) #define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) #define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif /* end Orc C target preamble */ /* orc_splat_u32 */ #ifdef DISABLE_ORC void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) { int i; orc_union32 *ORC_RESTRICT ptr0; orc_union32 var32; orc_union32 var33; ptr0 = (orc_union32 *) d1; /* 0: loadpl */ var32.i = p1; for (i = 0; i < n; i++) { /* 1: copyl */ var33.i = var32.i; /* 2: storel */ ptr0[i] = var33; } } #else static void _backup_orc_splat_u32 (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_union32 *ORC_RESTRICT ptr0; orc_union32 var32; orc_union32 var33; ptr0 = (orc_union32 *) ex->arrays[0]; /* 0: loadpl */ var32.i = ex->params[24]; for (i = 0; i < n; i++) { /* 1: copyl */ var33.i = var32.i; /* 2: storel */ ptr0[i] = var33; } } void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "orc_splat_u32"); orc_program_set_backup_function (p, _backup_orc_splat_u32); orc_program_add_destination (p, 4, "d1"); orc_program_add_parameter (p, 4, "p1"); orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif /* orc_memcpy_u32 */ #ifdef DISABLE_ORC void orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n) { int i; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union32 var32; orc_union32 var33; ptr0 = (orc_union32 *) d1; ptr4 = (orc_union32 *) s1; for (i = 0; i < n; i++) { /* 0: loadl */ var32 = ptr4[i]; /* 1: copyl */ var33.i = var32.i; /* 2: storel */ ptr0[i] = var33; } } #else static void _backup_orc_memcpy_u32 (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union32 var32; orc_union32 var33; ptr0 = (orc_union32 *) ex->arrays[0]; ptr4 = (orc_union32 *) ex->arrays[4]; for (i = 0; i < n; i++) { /* 0: loadl */ var32 = ptr4[i]; /* 1: copyl */ var33.i = var32.i; /* 2: storel */ ptr0[i] = var33; } } void orc_memcpy_u32 (guint32 * ORC_RESTRICT d1, const guint32 * ORC_RESTRICT s1, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "orc_memcpy_u32"); orc_program_set_backup_function (p, _backup_orc_memcpy_u32); orc_program_add_destination (p, 4, "d1"); orc_program_add_source (p, 4, "s1"); orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->arrays[ORC_VAR_S1] = (void *) s1; func = p->code_exec; func (ex); } #endif /* orc_blend_u8 */ #ifdef DISABLE_ORC void orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { int i; int j; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; orc_int8 var34; orc_int8 var35; orc_union16 var36; orc_int8 var37; orc_union16 var38; orc_union16 var39; orc_union16 var40; orc_union16 var41; orc_union16 var42; orc_union16 var43; orc_union16 var44; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); /* 5: loadpw */ var36.i = p1; for (i = 0; i < n; i++) { /* 0: loadb */ var34 = ptr0[i]; /* 1: convubw */ var38.i = (orc_uint8) var34; /* 2: loadb */ var35 = ptr4[i]; /* 3: convubw */ var39.i = (orc_uint8) var35; /* 4: subw */ var40.i = var39.i - var38.i; /* 6: mullw */ var41.i = (var40.i * var36.i) & 0xffff; /* 7: shlw */ var42.i = var38.i << 8; /* 8: addw */ var43.i = var42.i + var41.i; /* 9: shruw */ var44.i = ((orc_uint16) var43.i) >> 8; /* 10: convsuswb */ var37 = ORC_CLAMP_UB (var44.i); /* 11: storeb */ ptr0[i] = var37; } } } #else static void _backup_orc_blend_u8 (OrcExecutor * ORC_RESTRICT ex) { int i; int j; int n = ex->n; int m = ex->params[ORC_VAR_A1]; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; orc_int8 var34; orc_int8 var35; orc_union16 var36; orc_int8 var37; orc_union16 var38; orc_union16 var39; orc_union16 var40; orc_union16 var41; orc_union16 var42; orc_union16 var43; orc_union16 var44; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); /* 5: loadpw */ var36.i = ex->params[24]; for (i = 0; i < n; i++) { /* 0: loadb */ var34 = ptr0[i]; /* 1: convubw */ var38.i = (orc_uint8) var34; /* 2: loadb */ var35 = ptr4[i]; /* 3: convubw */ var39.i = (orc_uint8) var35; /* 4: subw */ var40.i = var39.i - var38.i; /* 6: mullw */ var41.i = (var40.i * var36.i) & 0xffff; /* 7: shlw */ var42.i = var38.i << 8; /* 8: addw */ var43.i = var42.i + var41.i; /* 9: shruw */ var44.i = ((orc_uint16) var43.i) >> 8; /* 10: convsuswb */ var37 = ORC_CLAMP_UB (var44.i); /* 11: storeb */ ptr0[i] = var37; } } } void orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_2d (p); orc_program_set_name (p, "orc_blend_u8"); orc_program_set_backup_function (p, _backup_orc_blend_u8); orc_program_add_destination (p, 1, "d1"); orc_program_add_source (p, 1, "s1"); orc_program_add_constant (p, 1, 0x00000008, "c1"); orc_program_add_parameter (p, 2, "p1"); orc_program_add_temporary (p, 2, "t1"); orc_program_add_temporary (p, 2, "t2"); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "shlw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1); orc_program_append_2 (p, "shruw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ORC_EXECUTOR_M (ex) = m; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_D1] = d1_stride; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->params[ORC_VAR_S1] = s1_stride; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif /* orc_blend_argb */ #ifdef DISABLE_ORC void orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { int i; int j; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var39; orc_union32 var40; orc_union32 var41; orc_union16 var42; orc_int8 var43; orc_union32 var44; orc_union64 var45; orc_union64 var46; orc_union64 var47; orc_union64 var48; orc_union32 var49; orc_union64 var50; orc_union64 var51; orc_union64 var52; orc_union64 var53; orc_union64 var54; orc_union32 var55; orc_union32 var56; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); /* 5: loadpw */ var39.x4[0] = p1; var39.x4[1] = p1; var39.x4[2] = p1; var39.x4[3] = p1; /* 16: loadpl */ var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ for (i = 0; i < n; i++) { /* 0: loadl */ var41 = ptr4[i]; /* 1: convlw */ var42.i = var41.i; /* 2: convwb */ var43 = var42.i; /* 3: splatbl */ var44.i = ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) << 8) | (var43 & 0xff); /* 4: convubw */ var45.x4[0] = (orc_uint8) var44.x4[0]; var45.x4[1] = (orc_uint8) var44.x4[1]; var45.x4[2] = (orc_uint8) var44.x4[2]; var45.x4[3] = (orc_uint8) var44.x4[3]; /* 6: mullw */ var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff; var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff; var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff; var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff; /* 7: shruw */ var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8; var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8; var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8; var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8; /* 8: convubw */ var48.x4[0] = (orc_uint8) var41.x4[0]; var48.x4[1] = (orc_uint8) var41.x4[1]; var48.x4[2] = (orc_uint8) var41.x4[2]; var48.x4[3] = (orc_uint8) var41.x4[3]; /* 9: loadl */ var49 = ptr0[i]; /* 10: convubw */ var50.x4[0] = (orc_uint8) var49.x4[0]; var50.x4[1] = (orc_uint8) var49.x4[1]; var50.x4[2] = (orc_uint8) var49.x4[2]; var50.x4[3] = (orc_uint8) var49.x4[3]; /* 11: subw */ var51.x4[0] = var48.x4[0] - var50.x4[0]; var51.x4[1] = var48.x4[1] - var50.x4[1]; var51.x4[2] = var48.x4[2] - var50.x4[2]; var51.x4[3] = var48.x4[3] - var50.x4[3]; /* 12: mullw */ var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff; var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff; var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff; var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff; /* 13: div255w */ var53.x4[0] = ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) + (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8; var53.x4[1] = ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) + (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8; var53.x4[2] = ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) + (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8; var53.x4[3] = ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) + (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8; /* 14: addw */ var54.x4[0] = var50.x4[0] + var53.x4[0]; var54.x4[1] = var50.x4[1] + var53.x4[1]; var54.x4[2] = var50.x4[2] + var53.x4[2]; var54.x4[3] = var50.x4[3] + var53.x4[3]; /* 15: convwb */ var55.x4[0] = var54.x4[0]; var55.x4[1] = var54.x4[1]; var55.x4[2] = var54.x4[2]; var55.x4[3] = var54.x4[3]; /* 17: orl */ var56.i = var55.i | var40.i; /* 18: storel */ ptr0[i] = var56; } } } #else static void _backup_orc_blend_argb (OrcExecutor * ORC_RESTRICT ex) { int i; int j; int n = ex->n; int m = ex->params[ORC_VAR_A1]; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var39; orc_union32 var40; orc_union32 var41; orc_union16 var42; orc_int8 var43; orc_union32 var44; orc_union64 var45; orc_union64 var46; orc_union64 var47; orc_union64 var48; orc_union32 var49; orc_union64 var50; orc_union64 var51; orc_union64 var52; orc_union64 var53; orc_union64 var54; orc_union32 var55; orc_union32 var56; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); /* 5: loadpw */ var39.x4[0] = ex->params[24]; var39.x4[1] = ex->params[24]; var39.x4[2] = ex->params[24]; var39.x4[3] = ex->params[24]; /* 16: loadpl */ var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ for (i = 0; i < n; i++) { /* 0: loadl */ var41 = ptr4[i]; /* 1: convlw */ var42.i = var41.i; /* 2: convwb */ var43 = var42.i; /* 3: splatbl */ var44.i = ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) << 8) | (var43 & 0xff); /* 4: convubw */ var45.x4[0] = (orc_uint8) var44.x4[0]; var45.x4[1] = (orc_uint8) var44.x4[1]; var45.x4[2] = (orc_uint8) var44.x4[2]; var45.x4[3] = (orc_uint8) var44.x4[3]; /* 6: mullw */ var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff; var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff; var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff; var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff; /* 7: shruw */ var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8; var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8; var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8; var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8; /* 8: convubw */ var48.x4[0] = (orc_uint8) var41.x4[0]; var48.x4[1] = (orc_uint8) var41.x4[1]; var48.x4[2] = (orc_uint8) var41.x4[2]; var48.x4[3] = (orc_uint8) var41.x4[3]; /* 9: loadl */ var49 = ptr0[i]; /* 10: convubw */ var50.x4[0] = (orc_uint8) var49.x4[0]; var50.x4[1] = (orc_uint8) var49.x4[1]; var50.x4[2] = (orc_uint8) var49.x4[2]; var50.x4[3] = (orc_uint8) var49.x4[3]; /* 11: subw */ var51.x4[0] = var48.x4[0] - var50.x4[0]; var51.x4[1] = var48.x4[1] - var50.x4[1]; var51.x4[2] = var48.x4[2] - var50.x4[2]; var51.x4[3] = var48.x4[3] - var50.x4[3]; /* 12: mullw */ var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff; var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff; var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff; var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff; /* 13: div255w */ var53.x4[0] = ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) + (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8; var53.x4[1] = ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) + (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8; var53.x4[2] = ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) + (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8; var53.x4[3] = ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) + (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8; /* 14: addw */ var54.x4[0] = var50.x4[0] + var53.x4[0]; var54.x4[1] = var50.x4[1] + var53.x4[1]; var54.x4[2] = var50.x4[2] + var53.x4[2]; var54.x4[3] = var50.x4[3] + var53.x4[3]; /* 15: convwb */ var55.x4[0] = var54.x4[0]; var55.x4[1] = var54.x4[1]; var55.x4[2] = var54.x4[2]; var55.x4[3] = var54.x4[3]; /* 17: orl */ var56.i = var55.i | var40.i; /* 18: storel */ ptr0[i] = var56; } } } void orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_2d (p); orc_program_set_name (p, "orc_blend_argb"); orc_program_set_backup_function (p, _backup_orc_blend_argb); orc_program_add_destination (p, 4, "d1"); orc_program_add_source (p, 4, "s1"); orc_program_add_constant (p, 4, 0x000000ff, "c1"); orc_program_add_constant (p, 4, 0x00000008, "c2"); orc_program_add_parameter (p, 2, "p1"); orc_program_add_temporary (p, 4, "t1"); orc_program_add_temporary (p, 2, "t2"); orc_program_add_temporary (p, 1, "t3"); orc_program_add_temporary (p, 4, "t4"); orc_program_add_temporary (p, 8, "t5"); orc_program_add_temporary (p, 8, "t6"); orc_program_add_temporary (p, 8, "t7"); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "shruw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1); orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T6, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ORC_EXECUTOR_M (ex) = m; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_D1] = d1_stride; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->params[ORC_VAR_S1] = s1_stride; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif /* orc_blend_bgra */ #ifdef DISABLE_ORC void orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { int i; int j; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var40; orc_union32 var41; orc_union32 var42; orc_union32 var43; orc_union16 var44; orc_int8 var45; orc_union32 var46; orc_union64 var47; orc_union64 var48; orc_union64 var49; orc_union64 var50; orc_union32 var51; orc_union64 var52; orc_union64 var53; orc_union64 var54; orc_union64 var55; orc_union64 var56; orc_union32 var57; orc_union32 var58; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); /* 6: loadpw */ var40.x4[0] = p1; var40.x4[1] = p1; var40.x4[2] = p1; var40.x4[3] = p1; /* 17: loadpl */ var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ for (i = 0; i < n; i++) { /* 0: loadl */ var42 = ptr4[i]; /* 1: shrul */ var43.i = ((orc_uint32) var42.i) >> 24; /* 2: convlw */ var44.i = var43.i; /* 3: convwb */ var45 = var44.i; /* 4: splatbl */ var46.i = ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) << 8) | (var45 & 0xff); /* 5: convubw */ var47.x4[0] = (orc_uint8) var46.x4[0]; var47.x4[1] = (orc_uint8) var46.x4[1]; var47.x4[2] = (orc_uint8) var46.x4[2]; var47.x4[3] = (orc_uint8) var46.x4[3]; /* 7: mullw */ var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff; var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff; var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff; var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff; /* 8: shruw */ var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8; var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8; var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8; var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8; /* 9: convubw */ var50.x4[0] = (orc_uint8) var42.x4[0]; var50.x4[1] = (orc_uint8) var42.x4[1]; var50.x4[2] = (orc_uint8) var42.x4[2]; var50.x4[3] = (orc_uint8) var42.x4[3]; /* 10: loadl */ var51 = ptr0[i]; /* 11: convubw */ var52.x4[0] = (orc_uint8) var51.x4[0]; var52.x4[1] = (orc_uint8) var51.x4[1]; var52.x4[2] = (orc_uint8) var51.x4[2]; var52.x4[3] = (orc_uint8) var51.x4[3]; /* 12: subw */ var53.x4[0] = var50.x4[0] - var52.x4[0]; var53.x4[1] = var50.x4[1] - var52.x4[1]; var53.x4[2] = var50.x4[2] - var52.x4[2]; var53.x4[3] = var50.x4[3] - var52.x4[3]; /* 13: mullw */ var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff; var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff; var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff; var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff; /* 14: div255w */ var55.x4[0] = ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) + (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8; var55.x4[1] = ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) + (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8; var55.x4[2] = ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) + (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8; var55.x4[3] = ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) + (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8; /* 15: addw */ var56.x4[0] = var52.x4[0] + var55.x4[0]; var56.x4[1] = var52.x4[1] + var55.x4[1]; var56.x4[2] = var52.x4[2] + var55.x4[2]; var56.x4[3] = var52.x4[3] + var55.x4[3]; /* 16: convwb */ var57.x4[0] = var56.x4[0]; var57.x4[1] = var56.x4[1]; var57.x4[2] = var56.x4[2]; var57.x4[3] = var56.x4[3]; /* 18: orl */ var58.i = var57.i | var41.i; /* 19: storel */ ptr0[i] = var58; } } } #else static void _backup_orc_blend_bgra (OrcExecutor * ORC_RESTRICT ex) { int i; int j; int n = ex->n; int m = ex->params[ORC_VAR_A1]; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var40; orc_union32 var41; orc_union32 var42; orc_union32 var43; orc_union16 var44; orc_int8 var45; orc_union32 var46; orc_union64 var47; orc_union64 var48; orc_union64 var49; orc_union64 var50; orc_union32 var51; orc_union64 var52; orc_union64 var53; orc_union64 var54; orc_union64 var55; orc_union64 var56; orc_union32 var57; orc_union32 var58; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); /* 6: loadpw */ var40.x4[0] = ex->params[24]; var40.x4[1] = ex->params[24]; var40.x4[2] = ex->params[24]; var40.x4[3] = ex->params[24]; /* 17: loadpl */ var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ for (i = 0; i < n; i++) { /* 0: loadl */ var42 = ptr4[i]; /* 1: shrul */ var43.i = ((orc_uint32) var42.i) >> 24; /* 2: convlw */ var44.i = var43.i; /* 3: convwb */ var45 = var44.i; /* 4: splatbl */ var46.i = ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) << 8) | (var45 & 0xff); /* 5: convubw */ var47.x4[0] = (orc_uint8) var46.x4[0]; var47.x4[1] = (orc_uint8) var46.x4[1]; var47.x4[2] = (orc_uint8) var46.x4[2]; var47.x4[3] = (orc_uint8) var46.x4[3]; /* 7: mullw */ var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff; var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff; var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff; var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff; /* 8: shruw */ var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8; var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8; var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8; var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8; /* 9: convubw */ var50.x4[0] = (orc_uint8) var42.x4[0]; var50.x4[1] = (orc_uint8) var42.x4[1]; var50.x4[2] = (orc_uint8) var42.x4[2]; var50.x4[3] = (orc_uint8) var42.x4[3]; /* 10: loadl */ var51 = ptr0[i]; /* 11: convubw */ var52.x4[0] = (orc_uint8) var51.x4[0]; var52.x4[1] = (orc_uint8) var51.x4[1]; var52.x4[2] = (orc_uint8) var51.x4[2]; var52.x4[3] = (orc_uint8) var51.x4[3]; /* 12: subw */ var53.x4[0] = var50.x4[0] - var52.x4[0]; var53.x4[1] = var50.x4[1] - var52.x4[1]; var53.x4[2] = var50.x4[2] - var52.x4[2]; var53.x4[3] = var50.x4[3] - var52.x4[3]; /* 13: mullw */ var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff; var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff; var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff; var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff; /* 14: div255w */ var55.x4[0] = ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) + (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8; var55.x4[1] = ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) + (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8; var55.x4[2] = ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) + (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8; var55.x4[3] = ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) + (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8; /* 15: addw */ var56.x4[0] = var52.x4[0] + var55.x4[0]; var56.x4[1] = var52.x4[1] + var55.x4[1]; var56.x4[2] = var52.x4[2] + var55.x4[2]; var56.x4[3] = var52.x4[3] + var55.x4[3]; /* 16: convwb */ var57.x4[0] = var56.x4[0]; var57.x4[1] = var56.x4[1]; var57.x4[2] = var56.x4[2]; var57.x4[3] = var56.x4[3]; /* 18: orl */ var58.i = var57.i | var41.i; /* 19: storel */ ptr0[i] = var58; } } } void orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_2d (p); orc_program_set_name (p, "orc_blend_bgra"); orc_program_set_backup_function (p, _backup_orc_blend_bgra); orc_program_add_destination (p, 4, "d1"); orc_program_add_source (p, 4, "s1"); orc_program_add_constant (p, 4, 0xff000000, "c1"); orc_program_add_constant (p, 4, 0x00000018, "c2"); orc_program_add_constant (p, 4, 0x00000008, "c3"); orc_program_add_parameter (p, 2, "p1"); orc_program_add_temporary (p, 4, "t1"); orc_program_add_temporary (p, 4, "t2"); orc_program_add_temporary (p, 2, "t3"); orc_program_add_temporary (p, 1, "t4"); orc_program_add_temporary (p, 4, "t5"); orc_program_add_temporary (p, 8, "t6"); orc_program_add_temporary (p, 8, "t7"); orc_program_add_temporary (p, 8, "t8"); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C2, ORC_VAR_D1); orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "shruw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C3, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "subw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_D1); orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ORC_EXECUTOR_M (ex) = m; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_D1] = d1_stride; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->params[ORC_VAR_S1] = s1_stride; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif /* orc_overlay_argb */ #ifdef DISABLE_ORC void orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { int i; int j; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var41; orc_union32 var42; orc_union32 var43; orc_union32 var44; orc_union16 var45; orc_int8 var46; orc_union32 var47; orc_union64 var48; orc_union64 var49; orc_union64 var50; orc_union64 var51; orc_union64 var52; orc_union32 var53; orc_union64 var54; orc_union64 var55; orc_union32 var56; orc_union16 var57; orc_int8 var58; orc_union32 var59; orc_union64 var60; orc_union64 var61; orc_union64 var62; orc_union64 var63; orc_union64 var64; orc_union64 var65; orc_union64 var66; orc_union64 var67; orc_union32 var68; orc_union32 var69; orc_union32 var70; orc_union32 var71; orc_union32 var72; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); /* 5: loadpw */ var41.x4[0] = p1; var41.x4[1] = p1; var41.x4[2] = p1; var41.x4[3] = p1; /* 10: loadpl */ var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ /* 26: loadpl */ var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */ /* 29: loadpl */ var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ for (i = 0; i < n; i++) { /* 0: loadl */ var44 = ptr4[i]; /* 1: convlw */ var45.i = var44.i; /* 2: convwb */ var46 = var45.i; /* 3: splatbl */ var47.i = ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) << 8) | (var46 & 0xff); /* 4: convubw */ var48.x4[0] = (orc_uint8) var47.x4[0]; var48.x4[1] = (orc_uint8) var47.x4[1]; var48.x4[2] = (orc_uint8) var47.x4[2]; var48.x4[3] = (orc_uint8) var47.x4[3]; /* 6: mullw */ var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff; var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff; var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff; var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff; /* 7: shruw */ var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8; var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8; var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8; var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8; /* 8: convubw */ var51.x4[0] = (orc_uint8) var44.x4[0]; var51.x4[1] = (orc_uint8) var44.x4[1]; var51.x4[2] = (orc_uint8) var44.x4[2]; var51.x4[3] = (orc_uint8) var44.x4[3]; /* 9: mullw */ var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff; var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff; var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff; var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff; /* 11: convubw */ var54.x4[0] = (orc_uint8) var53.x4[0]; var54.x4[1] = (orc_uint8) var53.x4[1]; var54.x4[2] = (orc_uint8) var53.x4[2]; var54.x4[3] = (orc_uint8) var53.x4[3]; /* 12: subw */ var55.x4[0] = var54.x4[0] - var50.x4[0]; var55.x4[1] = var54.x4[1] - var50.x4[1]; var55.x4[2] = var54.x4[2] - var50.x4[2]; var55.x4[3] = var54.x4[3] - var50.x4[3]; /* 13: loadl */ var56 = ptr0[i]; /* 14: convlw */ var57.i = var56.i; /* 15: convwb */ var58 = var57.i; /* 16: splatbl */ var59.i = ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) << 8) | (var58 & 0xff); /* 17: convubw */ var60.x4[0] = (orc_uint8) var59.x4[0]; var60.x4[1] = (orc_uint8) var59.x4[1]; var60.x4[2] = (orc_uint8) var59.x4[2]; var60.x4[3] = (orc_uint8) var59.x4[3]; /* 18: mullw */ var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff; var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff; var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff; var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff; /* 19: div255w */ var62.x4[0] = ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) + (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8; var62.x4[1] = ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) + (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8; var62.x4[2] = ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) + (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8; var62.x4[3] = ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) + (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8; /* 20: convubw */ var63.x4[0] = (orc_uint8) var56.x4[0]; var63.x4[1] = (orc_uint8) var56.x4[1]; var63.x4[2] = (orc_uint8) var56.x4[2]; var63.x4[3] = (orc_uint8) var56.x4[3]; /* 21: mullw */ var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff; var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff; var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff; var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff; /* 22: addw */ var65.x4[0] = var64.x4[0] + var52.x4[0]; var65.x4[1] = var64.x4[1] + var52.x4[1]; var65.x4[2] = var64.x4[2] + var52.x4[2]; var65.x4[3] = var64.x4[3] + var52.x4[3]; /* 23: addw */ var66.x4[0] = var62.x4[0] + var50.x4[0]; var66.x4[1] = var62.x4[1] + var50.x4[1]; var66.x4[2] = var62.x4[2] + var50.x4[2]; var66.x4[3] = var62.x4[3] + var50.x4[3]; /* 24: divluw */ var67.x4[0] = ((var66.x4[0] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) / ((orc_uint16) var66.x4[0] & 0xff)); var67.x4[1] = ((var66.x4[1] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) / ((orc_uint16) var66.x4[1] & 0xff)); var67.x4[2] = ((var66.x4[2] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) / ((orc_uint16) var66.x4[2] & 0xff)); var67.x4[3] = ((var66.x4[3] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) / ((orc_uint16) var66.x4[3] & 0xff)); /* 25: convwb */ var68.x4[0] = var67.x4[0]; var68.x4[1] = var67.x4[1]; var68.x4[2] = var67.x4[2]; var68.x4[3] = var67.x4[3]; /* 27: andl */ var69.i = var68.i & var42.i; /* 28: convwb */ var70.x4[0] = var66.x4[0]; var70.x4[1] = var66.x4[1]; var70.x4[2] = var66.x4[2]; var70.x4[3] = var66.x4[3]; /* 30: andl */ var71.i = var70.i & var43.i; /* 31: orl */ var72.i = var69.i | var71.i; /* 32: storel */ ptr0[i] = var72; } } } #else static void _backup_orc_overlay_argb (OrcExecutor * ORC_RESTRICT ex) { int i; int j; int n = ex->n; int m = ex->params[ORC_VAR_A1]; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var41; orc_union32 var42; orc_union32 var43; orc_union32 var44; orc_union16 var45; orc_int8 var46; orc_union32 var47; orc_union64 var48; orc_union64 var49; orc_union64 var50; orc_union64 var51; orc_union64 var52; orc_union32 var53; orc_union64 var54; orc_union64 var55; orc_union32 var56; orc_union16 var57; orc_int8 var58; orc_union32 var59; orc_union64 var60; orc_union64 var61; orc_union64 var62; orc_union64 var63; orc_union64 var64; orc_union64 var65; orc_union64 var66; orc_union64 var67; orc_union32 var68; orc_union32 var69; orc_union32 var70; orc_union32 var71; orc_union32 var72; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); /* 5: loadpw */ var41.x4[0] = ex->params[24]; var41.x4[1] = ex->params[24]; var41.x4[2] = ex->params[24]; var41.x4[3] = ex->params[24]; /* 10: loadpl */ var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ /* 26: loadpl */ var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */ /* 29: loadpl */ var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */ for (i = 0; i < n; i++) { /* 0: loadl */ var44 = ptr4[i]; /* 1: convlw */ var45.i = var44.i; /* 2: convwb */ var46 = var45.i; /* 3: splatbl */ var47.i = ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) << 8) | (var46 & 0xff); /* 4: convubw */ var48.x4[0] = (orc_uint8) var47.x4[0]; var48.x4[1] = (orc_uint8) var47.x4[1]; var48.x4[2] = (orc_uint8) var47.x4[2]; var48.x4[3] = (orc_uint8) var47.x4[3]; /* 6: mullw */ var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff; var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff; var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff; var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff; /* 7: shruw */ var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8; var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8; var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8; var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8; /* 8: convubw */ var51.x4[0] = (orc_uint8) var44.x4[0]; var51.x4[1] = (orc_uint8) var44.x4[1]; var51.x4[2] = (orc_uint8) var44.x4[2]; var51.x4[3] = (orc_uint8) var44.x4[3]; /* 9: mullw */ var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff; var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff; var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff; var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff; /* 11: convubw */ var54.x4[0] = (orc_uint8) var53.x4[0]; var54.x4[1] = (orc_uint8) var53.x4[1]; var54.x4[2] = (orc_uint8) var53.x4[2]; var54.x4[3] = (orc_uint8) var53.x4[3]; /* 12: subw */ var55.x4[0] = var54.x4[0] - var50.x4[0]; var55.x4[1] = var54.x4[1] - var50.x4[1]; var55.x4[2] = var54.x4[2] - var50.x4[2]; var55.x4[3] = var54.x4[3] - var50.x4[3]; /* 13: loadl */ var56 = ptr0[i]; /* 14: convlw */ var57.i = var56.i; /* 15: convwb */ var58 = var57.i; /* 16: splatbl */ var59.i = ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) << 8) | (var58 & 0xff); /* 17: convubw */ var60.x4[0] = (orc_uint8) var59.x4[0]; var60.x4[1] = (orc_uint8) var59.x4[1]; var60.x4[2] = (orc_uint8) var59.x4[2]; var60.x4[3] = (orc_uint8) var59.x4[3]; /* 18: mullw */ var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff; var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff; var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff; var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff; /* 19: div255w */ var62.x4[0] = ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) + (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8; var62.x4[1] = ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) + (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8; var62.x4[2] = ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) + (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8; var62.x4[3] = ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) + (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8; /* 20: convubw */ var63.x4[0] = (orc_uint8) var56.x4[0]; var63.x4[1] = (orc_uint8) var56.x4[1]; var63.x4[2] = (orc_uint8) var56.x4[2]; var63.x4[3] = (orc_uint8) var56.x4[3]; /* 21: mullw */ var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff; var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff; var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff; var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff; /* 22: addw */ var65.x4[0] = var64.x4[0] + var52.x4[0]; var65.x4[1] = var64.x4[1] + var52.x4[1]; var65.x4[2] = var64.x4[2] + var52.x4[2]; var65.x4[3] = var64.x4[3] + var52.x4[3]; /* 23: addw */ var66.x4[0] = var62.x4[0] + var50.x4[0]; var66.x4[1] = var62.x4[1] + var50.x4[1]; var66.x4[2] = var62.x4[2] + var50.x4[2]; var66.x4[3] = var62.x4[3] + var50.x4[3]; /* 24: divluw */ var67.x4[0] = ((var66.x4[0] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) / ((orc_uint16) var66.x4[0] & 0xff)); var67.x4[1] = ((var66.x4[1] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) / ((orc_uint16) var66.x4[1] & 0xff)); var67.x4[2] = ((var66.x4[2] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) / ((orc_uint16) var66.x4[2] & 0xff)); var67.x4[3] = ((var66.x4[3] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) / ((orc_uint16) var66.x4[3] & 0xff)); /* 25: convwb */ var68.x4[0] = var67.x4[0]; var68.x4[1] = var67.x4[1]; var68.x4[2] = var67.x4[2]; var68.x4[3] = var67.x4[3]; /* 27: andl */ var69.i = var68.i & var42.i; /* 28: convwb */ var70.x4[0] = var66.x4[0]; var70.x4[1] = var66.x4[1]; var70.x4[2] = var66.x4[2]; var70.x4[3] = var66.x4[3]; /* 30: andl */ var71.i = var70.i & var43.i; /* 31: orl */ var72.i = var69.i | var71.i; /* 32: storel */ ptr0[i] = var72; } } } void orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_2d (p); orc_program_set_name (p, "orc_overlay_argb"); orc_program_set_backup_function (p, _backup_orc_overlay_argb); orc_program_add_destination (p, 4, "d1"); orc_program_add_source (p, 4, "s1"); orc_program_add_constant (p, 4, 0xffffffff, "c1"); orc_program_add_constant (p, 4, 0x000000ff, "c2"); orc_program_add_constant (p, 4, 0xffffff00, "c3"); orc_program_add_constant (p, 4, 0x00000008, "c4"); orc_program_add_parameter (p, 2, "p1"); orc_program_add_temporary (p, 4, "t1"); orc_program_add_temporary (p, 2, "t2"); orc_program_add_temporary (p, 1, "t3"); orc_program_add_temporary (p, 8, "t4"); orc_program_add_temporary (p, 8, "t5"); orc_program_add_temporary (p, 8, "t6"); orc_program_add_temporary (p, 4, "t7"); orc_program_add_temporary (p, 8, "t8"); orc_program_add_temporary (p, 8, "t9"); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T4, ORC_VAR_T7, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "shruw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C4, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T4, ORC_VAR_D1); orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T7, ORC_VAR_C1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T7, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "subw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_D1); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6, ORC_VAR_D1); orc_program_append_2 (p, "addw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T9, ORC_VAR_D1); orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T4, ORC_VAR_D1); orc_program_append_2 (p, "divluw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 2, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "andl", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2, ORC_VAR_D1); orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T7, ORC_VAR_D1); orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ORC_EXECUTOR_M (ex) = m; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_D1] = d1_stride; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->params[ORC_VAR_S1] = s1_stride; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif /* orc_overlay_bgra */ #ifdef DISABLE_ORC void orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { int i; int j; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var42; orc_union32 var43; orc_union32 var44; orc_union32 var45; orc_union32 var46; orc_union16 var47; orc_int8 var48; orc_union32 var49; orc_union64 var50; orc_union64 var51; orc_union64 var52; orc_union64 var53; orc_union64 var54; orc_union32 var55; orc_union64 var56; orc_union64 var57; orc_union32 var58; orc_union32 var59; orc_union16 var60; orc_int8 var61; orc_union32 var62; orc_union64 var63; orc_union64 var64; orc_union64 var65; orc_union64 var66; orc_union64 var67; orc_union64 var68; orc_union64 var69; orc_union64 var70; orc_union32 var71; orc_union32 var72; orc_union32 var73; orc_union32 var74; orc_union32 var75; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j); ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j); /* 6: loadpw */ var42.x4[0] = p1; var42.x4[1] = p1; var42.x4[2] = p1; var42.x4[3] = p1; /* 11: loadpl */ var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ /* 28: loadpl */ var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */ /* 31: loadpl */ var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ for (i = 0; i < n; i++) { /* 0: loadl */ var45 = ptr4[i]; /* 1: shrul */ var46.i = ((orc_uint32) var45.i) >> 24; /* 2: convlw */ var47.i = var46.i; /* 3: convwb */ var48 = var47.i; /* 4: splatbl */ var49.i = ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) << 8) | (var48 & 0xff); /* 5: convubw */ var50.x4[0] = (orc_uint8) var49.x4[0]; var50.x4[1] = (orc_uint8) var49.x4[1]; var50.x4[2] = (orc_uint8) var49.x4[2]; var50.x4[3] = (orc_uint8) var49.x4[3]; /* 7: mullw */ var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff; var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff; var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff; var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff; /* 8: shruw */ var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8; var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8; var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8; var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8; /* 9: convubw */ var53.x4[0] = (orc_uint8) var45.x4[0]; var53.x4[1] = (orc_uint8) var45.x4[1]; var53.x4[2] = (orc_uint8) var45.x4[2]; var53.x4[3] = (orc_uint8) var45.x4[3]; /* 10: mullw */ var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff; var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff; var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff; var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff; /* 12: convubw */ var56.x4[0] = (orc_uint8) var55.x4[0]; var56.x4[1] = (orc_uint8) var55.x4[1]; var56.x4[2] = (orc_uint8) var55.x4[2]; var56.x4[3] = (orc_uint8) var55.x4[3]; /* 13: subw */ var57.x4[0] = var56.x4[0] - var52.x4[0]; var57.x4[1] = var56.x4[1] - var52.x4[1]; var57.x4[2] = var56.x4[2] - var52.x4[2]; var57.x4[3] = var56.x4[3] - var52.x4[3]; /* 14: loadl */ var58 = ptr0[i]; /* 15: shrul */ var59.i = ((orc_uint32) var58.i) >> 24; /* 16: convlw */ var60.i = var59.i; /* 17: convwb */ var61 = var60.i; /* 18: splatbl */ var62.i = ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) << 8) | (var61 & 0xff); /* 19: convubw */ var63.x4[0] = (orc_uint8) var62.x4[0]; var63.x4[1] = (orc_uint8) var62.x4[1]; var63.x4[2] = (orc_uint8) var62.x4[2]; var63.x4[3] = (orc_uint8) var62.x4[3]; /* 20: mullw */ var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff; var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff; var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff; var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff; /* 21: div255w */ var65.x4[0] = ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) + (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8; var65.x4[1] = ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) + (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8; var65.x4[2] = ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) + (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8; var65.x4[3] = ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) + (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8; /* 22: convubw */ var66.x4[0] = (orc_uint8) var58.x4[0]; var66.x4[1] = (orc_uint8) var58.x4[1]; var66.x4[2] = (orc_uint8) var58.x4[2]; var66.x4[3] = (orc_uint8) var58.x4[3]; /* 23: mullw */ var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff; var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff; var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff; var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff; /* 24: addw */ var68.x4[0] = var67.x4[0] + var54.x4[0]; var68.x4[1] = var67.x4[1] + var54.x4[1]; var68.x4[2] = var67.x4[2] + var54.x4[2]; var68.x4[3] = var67.x4[3] + var54.x4[3]; /* 25: addw */ var69.x4[0] = var65.x4[0] + var52.x4[0]; var69.x4[1] = var65.x4[1] + var52.x4[1]; var69.x4[2] = var65.x4[2] + var52.x4[2]; var69.x4[3] = var65.x4[3] + var52.x4[3]; /* 26: divluw */ var70.x4[0] = ((var69.x4[0] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) / ((orc_uint16) var69.x4[0] & 0xff)); var70.x4[1] = ((var69.x4[1] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) / ((orc_uint16) var69.x4[1] & 0xff)); var70.x4[2] = ((var69.x4[2] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) / ((orc_uint16) var69.x4[2] & 0xff)); var70.x4[3] = ((var69.x4[3] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) / ((orc_uint16) var69.x4[3] & 0xff)); /* 27: convwb */ var71.x4[0] = var70.x4[0]; var71.x4[1] = var70.x4[1]; var71.x4[2] = var70.x4[2]; var71.x4[3] = var70.x4[3]; /* 29: andl */ var72.i = var71.i & var43.i; /* 30: convwb */ var73.x4[0] = var69.x4[0]; var73.x4[1] = var69.x4[1]; var73.x4[2] = var69.x4[2]; var73.x4[3] = var69.x4[3]; /* 32: andl */ var74.i = var73.i & var44.i; /* 33: orl */ var75.i = var72.i | var74.i; /* 34: storel */ ptr0[i] = var75; } } } #else static void _backup_orc_overlay_bgra (OrcExecutor * ORC_RESTRICT ex) { int i; int j; int n = ex->n; int m = ex->params[ORC_VAR_A1]; orc_union32 *ORC_RESTRICT ptr0; const orc_union32 *ORC_RESTRICT ptr4; orc_union64 var42; orc_union32 var43; orc_union32 var44; orc_union32 var45; orc_union32 var46; orc_union16 var47; orc_int8 var48; orc_union32 var49; orc_union64 var50; orc_union64 var51; orc_union64 var52; orc_union64 var53; orc_union64 var54; orc_union32 var55; orc_union64 var56; orc_union64 var57; orc_union32 var58; orc_union32 var59; orc_union16 var60; orc_int8 var61; orc_union32 var62; orc_union64 var63; orc_union64 var64; orc_union64 var65; orc_union64 var66; orc_union64 var67; orc_union64 var68; orc_union64 var69; orc_union64 var70; orc_union32 var71; orc_union32 var72; orc_union32 var73; orc_union32 var74; orc_union32 var75; for (j = 0; j < m; j++) { ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j); ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j); /* 6: loadpw */ var42.x4[0] = ex->params[24]; var42.x4[1] = ex->params[24]; var42.x4[2] = ex->params[24]; var42.x4[3] = ex->params[24]; /* 11: loadpl */ var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */ /* 28: loadpl */ var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */ /* 31: loadpl */ var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */ for (i = 0; i < n; i++) { /* 0: loadl */ var45 = ptr4[i]; /* 1: shrul */ var46.i = ((orc_uint32) var45.i) >> 24; /* 2: convlw */ var47.i = var46.i; /* 3: convwb */ var48 = var47.i; /* 4: splatbl */ var49.i = ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) << 8) | (var48 & 0xff); /* 5: convubw */ var50.x4[0] = (orc_uint8) var49.x4[0]; var50.x4[1] = (orc_uint8) var49.x4[1]; var50.x4[2] = (orc_uint8) var49.x4[2]; var50.x4[3] = (orc_uint8) var49.x4[3]; /* 7: mullw */ var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff; var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff; var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff; var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff; /* 8: shruw */ var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8; var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8; var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8; var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8; /* 9: convubw */ var53.x4[0] = (orc_uint8) var45.x4[0]; var53.x4[1] = (orc_uint8) var45.x4[1]; var53.x4[2] = (orc_uint8) var45.x4[2]; var53.x4[3] = (orc_uint8) var45.x4[3]; /* 10: mullw */ var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff; var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff; var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff; var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff; /* 12: convubw */ var56.x4[0] = (orc_uint8) var55.x4[0]; var56.x4[1] = (orc_uint8) var55.x4[1]; var56.x4[2] = (orc_uint8) var55.x4[2]; var56.x4[3] = (orc_uint8) var55.x4[3]; /* 13: subw */ var57.x4[0] = var56.x4[0] - var52.x4[0]; var57.x4[1] = var56.x4[1] - var52.x4[1]; var57.x4[2] = var56.x4[2] - var52.x4[2]; var57.x4[3] = var56.x4[3] - var52.x4[3]; /* 14: loadl */ var58 = ptr0[i]; /* 15: shrul */ var59.i = ((orc_uint32) var58.i) >> 24; /* 16: convlw */ var60.i = var59.i; /* 17: convwb */ var61 = var60.i; /* 18: splatbl */ var62.i = ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) << 8) | (var61 & 0xff); /* 19: convubw */ var63.x4[0] = (orc_uint8) var62.x4[0]; var63.x4[1] = (orc_uint8) var62.x4[1]; var63.x4[2] = (orc_uint8) var62.x4[2]; var63.x4[3] = (orc_uint8) var62.x4[3]; /* 20: mullw */ var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff; var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff; var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff; var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff; /* 21: div255w */ var65.x4[0] = ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) + (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8; var65.x4[1] = ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) + (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8; var65.x4[2] = ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) + (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8; var65.x4[3] = ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) + (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8; /* 22: convubw */ var66.x4[0] = (orc_uint8) var58.x4[0]; var66.x4[1] = (orc_uint8) var58.x4[1]; var66.x4[2] = (orc_uint8) var58.x4[2]; var66.x4[3] = (orc_uint8) var58.x4[3]; /* 23: mullw */ var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff; var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff; var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff; var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff; /* 24: addw */ var68.x4[0] = var67.x4[0] + var54.x4[0]; var68.x4[1] = var67.x4[1] + var54.x4[1]; var68.x4[2] = var67.x4[2] + var54.x4[2]; var68.x4[3] = var67.x4[3] + var54.x4[3]; /* 25: addw */ var69.x4[0] = var65.x4[0] + var52.x4[0]; var69.x4[1] = var65.x4[1] + var52.x4[1]; var69.x4[2] = var65.x4[2] + var52.x4[2]; var69.x4[3] = var65.x4[3] + var52.x4[3]; /* 26: divluw */ var70.x4[0] = ((var69.x4[0] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) / ((orc_uint16) var69.x4[0] & 0xff)); var70.x4[1] = ((var69.x4[1] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) / ((orc_uint16) var69.x4[1] & 0xff)); var70.x4[2] = ((var69.x4[2] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) / ((orc_uint16) var69.x4[2] & 0xff)); var70.x4[3] = ((var69.x4[3] & 0xff) == 0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) / ((orc_uint16) var69.x4[3] & 0xff)); /* 27: convwb */ var71.x4[0] = var70.x4[0]; var71.x4[1] = var70.x4[1]; var71.x4[2] = var70.x4[2]; var71.x4[3] = var70.x4[3]; /* 29: andl */ var72.i = var71.i & var43.i; /* 30: convwb */ var73.x4[0] = var69.x4[0]; var73.x4[1] = var69.x4[1]; var73.x4[2] = var69.x4[2]; var73.x4[3] = var69.x4[3]; /* 32: andl */ var74.i = var73.i & var44.i; /* 33: orl */ var75.i = var72.i | var74.i; /* 34: storel */ ptr0[i] = var75; } } } void orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride, const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_2d (p); orc_program_set_name (p, "orc_overlay_bgra"); orc_program_set_backup_function (p, _backup_orc_overlay_bgra); orc_program_add_destination (p, 4, "d1"); orc_program_add_source (p, 4, "s1"); orc_program_add_constant (p, 4, 0xffffffff, "c1"); orc_program_add_constant (p, 4, 0xff000000, "c2"); orc_program_add_constant (p, 4, 0x00ffffff, "c3"); orc_program_add_constant (p, 4, 0x00000018, "c4"); orc_program_add_constant (p, 4, 0x00000008, "c5"); orc_program_add_parameter (p, 2, "p1"); orc_program_add_temporary (p, 4, "t1"); orc_program_add_temporary (p, 4, "t2"); orc_program_add_temporary (p, 2, "t3"); orc_program_add_temporary (p, 1, "t4"); orc_program_add_temporary (p, 8, "t5"); orc_program_add_temporary (p, 8, "t6"); orc_program_add_temporary (p, 8, "t7"); orc_program_add_temporary (p, 4, "t8"); orc_program_add_temporary (p, 8, "t9"); orc_program_add_temporary (p, 8, "t10"); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4, ORC_VAR_D1); orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T8, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "shruw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_C5, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T10, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T10, ORC_VAR_T10, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T8, ORC_VAR_C1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4, ORC_VAR_D1); orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_D1); orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7, ORC_VAR_D1); orc_program_append_2 (p, "addw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T10, ORC_VAR_D1); orc_program_append_2 (p, "addw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "divluw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3, ORC_VAR_D1); orc_program_append_2 (p, "convwb", 2, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "andl", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C2, ORC_VAR_D1); orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_D1); orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ORC_EXECUTOR_M (ex) = m; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_D1] = d1_stride; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->params[ORC_VAR_S1] = s1_stride; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif gst-plugins-good-0.10.31/gst/videomixer/Makefile.am0000644000175000017500000000250311677341660017016 00000000000000plugin_LTLIBRARIES = libgstvideomixer.la ORC_SOURCE=blendorc include $(top_srcdir)/common/orc.mak libgstvideomixer_la_SOURCES = \ videomixer.c \ blend.c \ videomixer2.c nodist_libgstvideomixer_la_SOURCES = $(ORC_NODIST_SOURCES) libgstvideomixer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) libgstvideomixer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(ORC_LIBS) libgstvideomixer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideomixer_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = \ videomixer.h \ videomixerpad.h \ blend.h \ videomixer2.h \ videomixer2pad.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideomixer -:SHARED libgstvideomixer \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideomixer_la_SOURCES) \ $(nodist_libgstvideomixer_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideomixer_la_CFLAGS) \ -:LDFLAGS $(libgstvideomixer_la_LDFLAGS) \ $(libgstvideomixer_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/videomixer/videomixer2.h0000644000175000017500000000707011677341660017374 00000000000000/* Generic video mixer plugin * Copyright (C) 2008 Wim Taymans * Copyright (C) 2010 Sebastian Dröge * * 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_VIDEO_MIXER2_H__ #define __GST_VIDEO_MIXER2_H__ #include #include #include "blend.h" #include G_BEGIN_DECLS #define GST_TYPE_VIDEO_MIXER2 (gst_videomixer2_get_type()) #define GST_VIDEO_MIXER2(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER2, GstVideoMixer2)) #define GST_VIDEO_MIXER2_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER2, GstVideoMixer2Class)) #define GST_IS_VIDEO_MIXER2(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER2)) #define GST_IS_VIDEO_MIXER2_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER2)) typedef struct _GstVideoMixer2 GstVideoMixer2; typedef struct _GstVideoMixer2Class GstVideoMixer2Class; /** * GstVideoMixer2Background: * @VIDEO_MIXER2_BACKGROUND_CHECKER: checker pattern background * @VIDEO_MIXER2_BACKGROUND_BLACK: solid color black background * @VIDEO_MIXER2_BACKGROUND_WHITE: solid color white background * @VIDEO_MIXER2_BACKGROUND_TRANSPARENT: background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. * * The different backgrounds videomixer can blend over. */ typedef enum { VIDEO_MIXER2_BACKGROUND_CHECKER, VIDEO_MIXER2_BACKGROUND_BLACK, VIDEO_MIXER2_BACKGROUND_WHITE, VIDEO_MIXER2_BACKGROUND_TRANSPARENT, } GstVideoMixer2Background; /** * GstVideoMixer2: * * The opaque #GstVideoMixer2 structure. */ struct _GstVideoMixer2 { GstElement element; /* < private > */ /* pad */ GstPad *srcpad; /* Lock to prevent the state to change while blending */ GMutex *lock; /* Sink pads using Collect Pads 2*/ GstCollectPads2 *collect; /* sinkpads, a GSList of GstVideoMixer2Pads */ GSList *sinkpads; gint numpads; /* Next available sinkpad index */ gint next_sinkpad; /* Output caps */ GstVideoFormat format; gint width, height; gint fps_n; gint fps_d; gint par_n; gint par_d; gboolean newseg_pending; gboolean flush_stop_pending; GstVideoMixer2Background background; /* Current downstream segment */ GstSegment segment; GstClockTime ts_offset; guint64 nframes; /* QoS stuff */ gdouble proportion; GstClockTime earliest_time; guint64 qos_processed, qos_dropped; BlendFunction blend, overlay; FillCheckerFunction fill_checker; FillColorFunction fill_color; }; struct _GstVideoMixer2Class { GstElementClass parent_class; }; GType gst_videomixer2_get_type (void); gboolean gst_videomixer2_register (GstPlugin * plugin); G_END_DECLS #endif /* __GST_VIDEO_MIXER2_H__ */ gst-plugins-good-0.10.31/gst/videomixer/videomixer2.c0000644000175000017500000017072511677341660017377 00000000000000/* Generic video mixer plugin * Copyright (C) 2004, 2008 Wim Taymans * Copyright (C) 2010 Sebastian Dröge * * 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-videomixer2 * * Videomixer2 can accept AYUV, ARGB and BGRA video streams. For each of the requested * sink pads it will compare the incoming geometry and framerate to define the * output parameters. Indeed output video frames will have the geometry of the * biggest incoming video stream and the framerate of the fastest incoming one. * * All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not * supported. The src pad will have the same colorspace as the sinks. * No colorspace conversion is done. * * Individual parameters for each input stream can be configured on the * #GstVideoMixer2Pad. * * At this stage, videomixer2 is considered UNSTABLE. The API provided in the * properties may yet change in the near future. When videomixer2 is stable, * it will replace #videomixer * * * Sample pipelines * |[ * gst-launch-0.10 \ * videotestsrc pattern=1 ! \ * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \ * videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \ * videomixer2 name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \ * ffmpegcolorspace ! xvimagesink \ * videotestsrc ! \ * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix. * ]| A pipeline to demonstrate videomixer used together with videobox. * This should show a 320x240 pixels video test source with some transparency * showing the background checker pattern. Another video test source with just * the snow pattern of 100x100 pixels is overlayed on top of the first one on * the left vertically centered with a small transparency showing the first * video test source behind and the checker pattern under it. Note that the * framerate of the output video is 10 frames per second. * |[ * gst-launch videotestsrc pattern=1 ! \ * video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \ * videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \ * videotestsrc ! \ * video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix. * ]| A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending). * |[ * gst-launch videotestsrc pattern=1 ! \ * video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \ * videomixer2 name=mix ! ffmpegcolorspace ! ximagesink \ * videotestsrc ! \ * video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix. * ]| A pipeline to test I420 * |[ * gst-launch videomixer2 name=mixer sink_1::alpha=0.5 sink_1::xpos=50 sink_1::ypos=50 ! \ * ffmpegcolorspace ! ximagesink \ * videotestsrc pattern=snow timestamp-offset=3000000000 ! \ * "video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480,framerate=(fraction)30/1" ! \ * timeoverlay ! queue2 ! mixer. \ * videotestsrc pattern=smpte ! \ * "video/x-raw-yuv,format=(fourcc)AYUV,width=800,height=600,framerate=(fraction)10/1" ! \ * timeoverlay ! queue2 ! mixer. * ]| A pipeline to demonstrate synchronized mixing (the second stream starts after 3 seconds) * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include "videomixer2.h" #include "videomixer2pad.h" #include #include "gst/glib-compat-private.h" #ifdef DISABLE_ORC #define orc_memset memset #else #include #endif GST_DEBUG_CATEGORY_STATIC (gst_videomixer2_debug); #define GST_CAT_DEFAULT gst_videomixer2_debug #define GST_VIDEO_MIXER2_GET_LOCK(mix) \ (GST_VIDEO_MIXER2(mix)->lock) #define GST_VIDEO_MIXER2_LOCK(mix) \ (g_mutex_lock(GST_VIDEO_MIXER2_GET_LOCK (mix))) #define GST_VIDEO_MIXER2_UNLOCK(mix) \ (g_mutex_unlock(GST_VIDEO_MIXER2_GET_LOCK (mix))) static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) ); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) ); static void gst_videomixer2_child_proxy_init (gpointer g_iface, gpointer iface_data); static gboolean gst_videomixer2_push_sink_event (GstVideoMixer2 * mix, GstEvent * event); static void gst_videomixer2_release_pad (GstElement * element, GstPad * pad); static void gst_videomixer2_reset_qos (GstVideoMixer2 * mix); static void _do_init (GType object_type) { static const GInterfaceInfo child_proxy_info = { (GInterfaceInitFunc) gst_videomixer2_child_proxy_init, NULL, NULL }; g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, &child_proxy_info); } struct _GstVideoMixer2Collect { GstCollectData2 collect; /* we extend the CollectData */ GstVideoMixer2Pad *mixpad; GstBuffer *queued; /* buffer for which we don't know the end time yet */ GstBuffer *buffer; /* buffer that should be blended now */ GstClockTime start_time; GstClockTime end_time; }; #define DEFAULT_PAD_ZORDER 0 #define DEFAULT_PAD_XPOS 0 #define DEFAULT_PAD_YPOS 0 #define DEFAULT_PAD_ALPHA 1.0 enum { PROP_PAD_0, PROP_PAD_ZORDER, PROP_PAD_XPOS, PROP_PAD_YPOS, PROP_PAD_ALPHA }; G_DEFINE_TYPE (GstVideoMixer2Pad, gst_videomixer2_pad, GST_TYPE_PAD); static void gst_videomixer2_collect_free (GstCollectData2 * data) { GstVideoMixer2Collect *cdata = (GstVideoMixer2Collect *) data; gst_buffer_replace (&cdata->buffer, NULL); } static gboolean gst_videomixer2_update_src_caps (GstVideoMixer2 * mix) { GSList *l; gint best_width = -1, best_height = -1; gdouble best_fps = -1, cur_fps; gint best_fps_n = -1, best_fps_d = -1; gboolean ret = TRUE; GST_VIDEO_MIXER2_LOCK (mix); for (l = mix->sinkpads; l; l = l->next) { GstVideoMixer2Pad *mpad = l->data; gint this_width, this_height; if (mpad->fps_n == 0 || mpad->fps_d == 0 || mpad->width == 0 || mpad->height == 0) continue; this_width = mpad->width + MAX (mpad->xpos, 0); this_height = mpad->height + MAX (mpad->ypos, 0); if (best_width < this_width) best_width = this_width; if (best_height < this_height) best_height = this_height; if (mpad->fps_d == 0) cur_fps = 0.0; else gst_util_fraction_to_double (mpad->fps_n, mpad->fps_d, &cur_fps); if (best_fps < cur_fps) { best_fps = cur_fps; best_fps_n = mpad->fps_n; best_fps_d = mpad->fps_d; } } if (best_fps_n <= 0 && best_fps_d <= 0) { best_fps_n = 25; best_fps_d = 1; best_fps = 25.0; } if (best_width > 0 && best_height > 0 && best_fps > 0) { GstCaps *caps, *peercaps; GstStructure *s; if (mix->fps_n != best_fps_n || mix->fps_d != best_fps_d) { if (mix->segment.last_stop != -1) { mix->ts_offset = mix->segment.last_stop - mix->segment.start; mix->nframes = 0; } } caps = gst_video_format_new_caps (mix->format, best_width, best_height, best_fps_n, best_fps_d, mix->par_n, mix->par_d); peercaps = gst_pad_peer_get_caps (mix->srcpad); if (peercaps) { GstCaps *tmp; s = gst_caps_get_structure (caps, 0); gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); tmp = gst_caps_intersect (caps, peercaps); gst_caps_unref (caps); gst_caps_unref (peercaps); caps = tmp; if (gst_caps_is_empty (caps)) { ret = FALSE; GST_VIDEO_MIXER2_UNLOCK (mix); goto done; } gst_caps_truncate (caps); s = gst_caps_get_structure (caps, 0); gst_structure_fixate_field_nearest_int (s, "width", best_width); gst_structure_fixate_field_nearest_int (s, "height", best_height); gst_structure_fixate_field_nearest_fraction (s, "framerate", best_fps_n, best_fps_d); gst_structure_get_int (s, "width", &best_width); gst_structure_get_int (s, "height", &best_height); gst_structure_get_fraction (s, "fraction", &best_fps_n, &best_fps_d); } mix->fps_n = best_fps_n; mix->fps_d = best_fps_d; mix->width = best_width; mix->height = best_height; GST_VIDEO_MIXER2_UNLOCK (mix); ret = gst_pad_set_caps (mix->srcpad, caps); gst_caps_unref (caps); } else { GST_VIDEO_MIXER2_UNLOCK (mix); } done: return ret; } static gboolean gst_videomixer2_pad_sink_setcaps (GstPad * pad, GstCaps * caps) { GstVideoMixer2 *mix; GstVideoMixer2Pad *mixpad; GstVideoFormat fmt; gint width, height; gint fps_n = 0, fps_d = 0; gint par_n = 1, par_d = 1; gboolean ret = FALSE; GstStructure *s; GST_INFO_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, caps); mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); mixpad = GST_VIDEO_MIXER2_PAD (pad); if (!gst_video_format_parse_caps (caps, &fmt, &width, &height) || !gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) { GST_ERROR_OBJECT (pad, "Failed to parse caps"); goto beach; } s = gst_caps_get_structure (caps, 0); if (gst_structure_has_field (s, "framerate") && !gst_video_parse_caps_framerate (caps, &fps_n, &fps_d)) { GST_ERROR_OBJECT (pad, "Failed to parse caps"); goto beach; } GST_VIDEO_MIXER2_LOCK (mix); if (mix->format != GST_VIDEO_FORMAT_UNKNOWN) { if (mix->format != fmt || mix->par_n != par_n || mix->par_d != par_d) { GST_ERROR_OBJECT (pad, "Caps not compatible with other pads' caps"); GST_VIDEO_MIXER2_UNLOCK (mix); goto beach; } } mix->format = fmt; mix->par_n = par_n; mix->par_d = par_d; mixpad->fps_n = fps_n; mixpad->fps_d = fps_d; mixpad->width = width; mixpad->height = height; GST_VIDEO_MIXER2_UNLOCK (mix); ret = gst_videomixer2_update_src_caps (mix); beach: gst_object_unref (mix); return ret; } static GstCaps * gst_videomixer2_pad_sink_getcaps (GstPad * pad) { GstVideoMixer2 *mix; GstCaps *srccaps; GstStructure *s; gint i, n; mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); srccaps = gst_pad_get_fixed_caps_func (GST_PAD (mix->srcpad)); srccaps = gst_caps_make_writable (srccaps); n = gst_caps_get_size (srccaps); for (i = 0; i < n; i++) { s = gst_caps_get_structure (srccaps, i); gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); if (!gst_structure_has_field (s, "pixel-aspect-ratio")) gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); } GST_DEBUG_OBJECT (pad, "Returning %" GST_PTR_FORMAT, srccaps); return srccaps; } static gboolean gst_videomixer2_pad_sink_acceptcaps (GstPad * pad, GstCaps * caps) { gboolean ret; GstVideoMixer2 *mix; GstCaps *accepted_caps; gint i, n; GstStructure *s; mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (pad, "%" GST_PTR_FORMAT, caps); accepted_caps = gst_pad_get_fixed_caps_func (GST_PAD (mix->srcpad)); accepted_caps = gst_caps_make_writable (accepted_caps); GST_LOG_OBJECT (pad, "src caps %" GST_PTR_FORMAT, accepted_caps); n = gst_caps_get_size (accepted_caps); for (i = 0; i < n; i++) { s = gst_caps_get_structure (accepted_caps, i); gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); if (!gst_structure_has_field (s, "pixel-aspect-ratio")) gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); } ret = gst_caps_can_intersect (caps, accepted_caps); GST_INFO_OBJECT (pad, "%saccepted caps %" GST_PTR_FORMAT, (ret ? "" : "not "), caps); GST_INFO_OBJECT (pad, "acceptable caps are %" GST_PTR_FORMAT, accepted_caps); gst_caps_unref (accepted_caps); gst_object_unref (mix); return ret; } static void gst_videomixer2_pad_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (object); switch (prop_id) { case PROP_PAD_ZORDER: g_value_set_uint (value, pad->zorder); break; case PROP_PAD_XPOS: g_value_set_int (value, pad->xpos); break; case PROP_PAD_YPOS: g_value_set_int (value, pad->ypos); break; case PROP_PAD_ALPHA: g_value_set_double (value, pad->alpha); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static int pad_zorder_compare (const GstVideoMixer2Pad * pad1, const GstVideoMixer2Pad * pad2) { return pad1->zorder - pad2->zorder; } static void gst_videomixer2_pad_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (object); GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (GST_PAD (pad))); switch (prop_id) { case PROP_PAD_ZORDER: GST_VIDEO_MIXER2_LOCK (mix); pad->zorder = g_value_get_uint (value); mix->sinkpads = g_slist_sort (mix->sinkpads, (GCompareFunc) pad_zorder_compare); GST_VIDEO_MIXER2_UNLOCK (mix); break; case PROP_PAD_XPOS: pad->xpos = g_value_get_int (value); break; case PROP_PAD_YPOS: pad->ypos = g_value_get_int (value); break; case PROP_PAD_ALPHA: pad->alpha = g_value_get_double (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } gst_object_unref (mix); } static void gst_videomixer2_pad_class_init (GstVideoMixer2PadClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_videomixer2_pad_set_property; gobject_class->get_property = gst_videomixer2_pad_get_property; g_object_class_install_property (gobject_class, PROP_PAD_ZORDER, g_param_spec_uint ("zorder", "Z-Order", "Z Order of the picture", 0, 10000, DEFAULT_PAD_ZORDER, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PAD_XPOS, g_param_spec_int ("xpos", "X Position", "X Position of the picture", G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PAD_YPOS, g_param_spec_int ("ypos", "Y Position", "Y Position of the picture", G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PAD_ALPHA, g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, DEFAULT_PAD_ALPHA, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); } static void gst_videomixer2_pad_init (GstVideoMixer2Pad * mixerpad) { /* setup some pad functions */ gst_pad_set_setcaps_function (GST_PAD (mixerpad), gst_videomixer2_pad_sink_setcaps); gst_pad_set_acceptcaps_function (GST_PAD (mixerpad), GST_DEBUG_FUNCPTR (gst_videomixer2_pad_sink_acceptcaps)); gst_pad_set_getcaps_function (GST_PAD (mixerpad), gst_videomixer2_pad_sink_getcaps); mixerpad->zorder = DEFAULT_PAD_ZORDER; mixerpad->xpos = DEFAULT_PAD_XPOS; mixerpad->ypos = DEFAULT_PAD_YPOS; mixerpad->alpha = DEFAULT_PAD_ALPHA; } /* GstVideoMixer2 */ #define DEFAULT_BACKGROUND VIDEO_MIXER2_BACKGROUND_CHECKER enum { PROP_0, PROP_BACKGROUND }; #define GST_TYPE_VIDEO_MIXER2_BACKGROUND (gst_videomixer2_background_get_type()) static GType gst_videomixer2_background_get_type (void) { static GType video_mixer_background_type = 0; static const GEnumValue video_mixer_background[] = { {VIDEO_MIXER2_BACKGROUND_CHECKER, "Checker pattern", "checker"}, {VIDEO_MIXER2_BACKGROUND_BLACK, "Black", "black"}, {VIDEO_MIXER2_BACKGROUND_WHITE, "White", "white"}, {VIDEO_MIXER2_BACKGROUND_TRANSPARENT, "Transparent Background to enable further mixing", "transparent"}, {0, NULL, NULL}, }; if (!video_mixer_background_type) { video_mixer_background_type = g_enum_register_static ("GstVideoMixer2Background", video_mixer_background); } return video_mixer_background_type; } GST_BOILERPLATE_FULL (GstVideoMixer2, gst_videomixer2, GstElement, GST_TYPE_ELEMENT, _do_init); static void gst_videomixer2_update_qos (GstVideoMixer2 * mix, gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp) { GST_DEBUG_OBJECT (mix, "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %" GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "", GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp)); GST_OBJECT_LOCK (mix); mix->proportion = proportion; if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { if (G_UNLIKELY (diff > 0)) mix->earliest_time = timestamp + 2 * diff + gst_util_uint64_scale_int (GST_SECOND, mix->fps_d, mix->fps_n); else mix->earliest_time = timestamp + diff; } else { mix->earliest_time = GST_CLOCK_TIME_NONE; } GST_OBJECT_UNLOCK (mix); } static void gst_videomixer2_reset_qos (GstVideoMixer2 * mix) { gst_videomixer2_update_qos (mix, 0.5, 0, GST_CLOCK_TIME_NONE); mix->qos_processed = mix->qos_dropped = 0; } static void gst_videomixer2_read_qos (GstVideoMixer2 * mix, gdouble * proportion, GstClockTime * time) { GST_OBJECT_LOCK (mix); *proportion = mix->proportion; *time = mix->earliest_time; GST_OBJECT_UNLOCK (mix); } static void gst_videomixer2_reset (GstVideoMixer2 * mix) { GSList *l; mix->format = GST_VIDEO_FORMAT_UNKNOWN; mix->width = mix->height = 0; mix->fps_n = mix->fps_d = 0; mix->par_n = mix->par_d = 0; mix->ts_offset = 0; mix->nframes = 0; gst_segment_init (&mix->segment, GST_FORMAT_TIME); mix->segment.last_stop = -1; gst_videomixer2_reset_qos (mix); for (l = mix->sinkpads; l; l = l->next) { GstVideoMixer2Pad *p = l->data; GstVideoMixer2Collect *mixcol = p->mixcol; gst_buffer_replace (&mixcol->buffer, NULL); mixcol->start_time = -1; mixcol->end_time = -1; p->fps_n = p->fps_d = 0; p->width = p->height = 0; } mix->newseg_pending = TRUE; mix->flush_stop_pending = FALSE; } /* 1 == OK * 0 == need more data * -1 == EOS * -2 == error */ static gint gst_videomixer2_fill_queues (GstVideoMixer2 * mix, GstClockTime output_start_time, GstClockTime output_end_time) { GSList *l; gboolean eos = TRUE; gboolean need_more_data = FALSE; for (l = mix->sinkpads; l; l = l->next) { GstVideoMixer2Pad *pad = l->data; GstVideoMixer2Collect *mixcol = pad->mixcol; GstSegment *segment = &pad->mixcol->collect.segment; GstBuffer *buf; buf = gst_collect_pads2_peek (mix->collect, &mixcol->collect); if (buf) { GstClockTime start_time, end_time; start_time = GST_BUFFER_TIMESTAMP (buf); if (start_time == -1) { gst_buffer_unref (buf); GST_ERROR_OBJECT (pad, "Need timestamped buffers!"); return -2; } /* FIXME: Make all this work with negative rates */ if ((mixcol->buffer && start_time < GST_BUFFER_TIMESTAMP (mixcol->buffer)) || (mixcol->queued && start_time < GST_BUFFER_TIMESTAMP (mixcol->queued))) { GST_WARNING_OBJECT (pad, "Buffer from the past, dropping"); gst_buffer_unref (buf); buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); gst_buffer_unref (buf); need_more_data = TRUE; continue; } if (mixcol->queued) { end_time = start_time - GST_BUFFER_TIMESTAMP (mixcol->queued); start_time = GST_BUFFER_TIMESTAMP (mixcol->queued); gst_buffer_unref (buf); buf = gst_buffer_ref (mixcol->queued); } else { end_time = GST_BUFFER_DURATION (buf); if (end_time == -1) { mixcol->queued = buf; need_more_data = TRUE; continue; } } g_assert (start_time != -1 && end_time != -1); end_time += start_time; /* convert from duration to position */ if (mixcol->end_time != -1 && mixcol->end_time > end_time) { GST_WARNING_OBJECT (pad, "Buffer from the past, dropping"); if (buf == mixcol->queued) { gst_buffer_unref (buf); gst_buffer_replace (&mixcol->queued, NULL); } else { gst_buffer_unref (buf); buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); gst_buffer_unref (buf); } need_more_data = TRUE; continue; } /* Check if it's inside the segment */ if (start_time >= segment->stop || end_time < segment->start) { GST_DEBUG_OBJECT (pad, "Buffer outside the segment"); if (buf == mixcol->queued) { gst_buffer_unref (buf); gst_buffer_replace (&mixcol->queued, NULL); } else { gst_buffer_unref (buf); buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); gst_buffer_unref (buf); } need_more_data = TRUE; continue; } /* Clip to segment and convert to running time */ start_time = MAX (start_time, segment->start); if (segment->stop != -1) end_time = MIN (end_time, segment->stop); start_time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, start_time); end_time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, end_time); g_assert (start_time != -1 && end_time != -1); /* Convert to the output segment rate */ if (mix->segment.abs_rate != 1.0) { start_time *= mix->segment.abs_rate; end_time *= mix->segment.abs_rate; } if (end_time >= output_start_time && start_time < output_end_time) { GST_DEBUG_OBJECT (pad, "Taking new buffer with start time %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time)); gst_buffer_replace (&mixcol->buffer, buf); mixcol->start_time = start_time; mixcol->end_time = end_time; if (buf == mixcol->queued) { gst_buffer_unref (buf); gst_buffer_replace (&mixcol->queued, NULL); } else { gst_buffer_unref (buf); buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); gst_buffer_unref (buf); } eos = FALSE; } else if (start_time >= output_end_time) { GST_DEBUG_OBJECT (pad, "Keeping buffer until %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time)); gst_buffer_unref (buf); eos = FALSE; } else { GST_DEBUG_OBJECT (pad, "Too old buffer -- dropping"); if (buf == mixcol->queued) { gst_buffer_unref (buf); gst_buffer_replace (&mixcol->queued, NULL); } else { gst_buffer_unref (buf); buf = gst_collect_pads2_pop (mix->collect, &mixcol->collect); gst_buffer_unref (buf); } need_more_data = TRUE; continue; } } else { if (mixcol->end_time != -1) { if (mixcol->end_time < output_start_time) { gst_buffer_replace (&mixcol->buffer, NULL); mixcol->start_time = mixcol->end_time = -1; if (!GST_COLLECT_PADS2_STATE_IS_SET (mixcol, GST_COLLECT_PADS2_STATE_EOS)) need_more_data = TRUE; } else { eos = FALSE; } } } } if (need_more_data) return 0; if (eos) return -1; return 1; } static GstFlowReturn gst_videomixer2_blend_buffers (GstVideoMixer2 * mix, GstClockTime output_start_time, GstClockTime output_end_time, GstBuffer ** outbuf) { GSList *l; GstFlowReturn ret; guint outsize; BlendFunction composite; outsize = gst_video_format_get_size (mix->format, mix->width, mix->height); ret = gst_pad_alloc_buffer_and_set_caps (mix->srcpad, GST_BUFFER_OFFSET_NONE, outsize, GST_PAD_CAPS (mix->srcpad), outbuf); if (ret != GST_FLOW_OK) return ret; GST_BUFFER_TIMESTAMP (*outbuf) = output_start_time; GST_BUFFER_DURATION (*outbuf) = output_end_time - output_start_time; /* default to blending */ composite = mix->blend; switch (mix->background) { case VIDEO_MIXER2_BACKGROUND_CHECKER: mix->fill_checker (GST_BUFFER_DATA (*outbuf), mix->width, mix->height); break; case VIDEO_MIXER2_BACKGROUND_BLACK: mix->fill_color (GST_BUFFER_DATA (*outbuf), mix->width, mix->height, 16, 128, 128); break; case VIDEO_MIXER2_BACKGROUND_WHITE: mix->fill_color (GST_BUFFER_DATA (*outbuf), mix->width, mix->height, 240, 128, 128); break; case VIDEO_MIXER2_BACKGROUND_TRANSPARENT: orc_memset (GST_BUFFER_DATA (*outbuf), 0, gst_video_format_get_row_stride (mix->format, 0, mix->width) * mix->height); /* use overlay to keep background transparent */ composite = mix->overlay; break; } for (l = mix->sinkpads; l; l = l->next) { GstVideoMixer2Pad *pad = l->data; GstVideoMixer2Collect *mixcol = pad->mixcol; if (mixcol->buffer != NULL) { GstClockTime timestamp; gint64 stream_time; GstSegment *seg; seg = &mixcol->collect.segment; timestamp = GST_BUFFER_TIMESTAMP (mixcol->buffer); stream_time = gst_segment_to_stream_time (seg, GST_FORMAT_TIME, timestamp); /* sync object properties on stream time */ if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (pad), stream_time); composite (GST_BUFFER_DATA (mixcol->buffer), pad->xpos, pad->ypos, pad->width, pad->height, pad->alpha, GST_BUFFER_DATA (*outbuf), mix->width, mix->height); } } return GST_FLOW_OK; } /* Perform qos calculations before processing the next frame. Returns TRUE if * the frame should be processed, FALSE if the frame can be dropped entirely */ static gint64 gst_videomixer2_do_qos (GstVideoMixer2 * mix, GstClockTime timestamp) { GstClockTime qostime, earliest_time; gdouble proportion; gint64 jitter; /* no timestamp, can't do QoS => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { GST_LOG_OBJECT (mix, "invalid timestamp, can't do QoS, process frame"); return -1; } /* get latest QoS observation values */ gst_videomixer2_read_qos (mix, &proportion, &earliest_time); /* skip qos if we have no observation (yet) => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { GST_LOG_OBJECT (mix, "no observation yet, process frame"); return -1; } /* qos is done on running time */ qostime = gst_segment_to_running_time (&mix->segment, GST_FORMAT_TIME, timestamp); /* see how our next timestamp relates to the latest qos timestamp */ GST_LOG_OBJECT (mix, "qostime %" GST_TIME_FORMAT ", earliest %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); jitter = GST_CLOCK_DIFF (qostime, earliest_time); if (qostime != GST_CLOCK_TIME_NONE && jitter > 0) { GST_DEBUG_OBJECT (mix, "we are late, drop frame"); return jitter; } GST_LOG_OBJECT (mix, "process frame"); return jitter; } static GstFlowReturn gst_videomixer2_collected (GstCollectPads2 * pads, GstVideoMixer2 * mix) { GstFlowReturn ret; GstClockTime output_start_time, output_end_time; GstBuffer *outbuf = NULL; gint res; gint64 jitter; /* If we're not negotiated yet... */ if (mix->format == GST_VIDEO_FORMAT_UNKNOWN) return GST_FLOW_NOT_NEGOTIATED; if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, FALSE)) { GST_DEBUG_OBJECT (mix, "pending flush stop"); gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); } GST_VIDEO_MIXER2_LOCK (mix); if (mix->newseg_pending) { GST_DEBUG_OBJECT (mix, "Sending NEWSEGMENT event"); if (!gst_pad_push_event (mix->srcpad, gst_event_new_new_segment_full (FALSE, mix->segment.rate, mix->segment.applied_rate, mix->segment.format, mix->segment.start, mix->segment.stop, mix->segment.time))) { ret = GST_FLOW_ERROR; goto done; } mix->newseg_pending = FALSE; } if (mix->segment.last_stop == -1) output_start_time = mix->segment.start; else output_start_time = mix->segment.last_stop; if (output_start_time >= mix->segment.stop) { GST_DEBUG_OBJECT (mix, "Segment done"); gst_pad_push_event (mix->srcpad, gst_event_new_eos ()); ret = GST_FLOW_UNEXPECTED; goto done; } output_end_time = mix->ts_offset + gst_util_uint64_scale (mix->nframes + 1, GST_SECOND * mix->fps_d, mix->fps_n); if (mix->segment.stop != -1) output_end_time = MIN (output_end_time, mix->segment.stop); res = gst_videomixer2_fill_queues (mix, output_start_time, output_end_time); if (res == 0) { GST_DEBUG_OBJECT (mix, "Need more data for decisions"); ret = GST_FLOW_OK; goto done; } else if (res == -1) { GST_DEBUG_OBJECT (mix, "All sinkpads are EOS -- forwarding"); gst_pad_push_event (mix->srcpad, gst_event_new_eos ()); ret = GST_FLOW_UNEXPECTED; goto done; } else if (res == -2) { GST_ERROR_OBJECT (mix, "Error collecting buffers"); ret = GST_FLOW_ERROR; goto done; } jitter = gst_videomixer2_do_qos (mix, output_start_time); if (jitter <= 0) { ret = gst_videomixer2_blend_buffers (mix, output_start_time, output_end_time, &outbuf); mix->qos_processed++; } else { GstMessage *msg; mix->qos_dropped++; /* TODO: live */ msg = gst_message_new_qos (GST_OBJECT_CAST (mix), FALSE, gst_segment_to_running_time (&mix->segment, GST_FORMAT_TIME, output_start_time), gst_segment_to_stream_time (&mix->segment, GST_FORMAT_TIME, output_start_time), output_start_time, output_end_time - output_start_time); gst_message_set_qos_values (msg, jitter, mix->proportion, 1000000); gst_message_set_qos_stats (msg, GST_FORMAT_BUFFERS, mix->qos_processed, mix->qos_dropped); gst_element_post_message (GST_ELEMENT_CAST (mix), msg); ret = GST_FLOW_OK; } gst_segment_set_last_stop (&mix->segment, GST_FORMAT_TIME, output_end_time); mix->nframes++; GST_VIDEO_MIXER2_UNLOCK (mix); if (outbuf) { GST_LOG_OBJECT (mix, "Pushing buffer with ts %" GST_TIME_FORMAT " and duration %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); ret = gst_pad_push (mix->srcpad, outbuf); } GST_VIDEO_MIXER2_LOCK (mix); done: GST_VIDEO_MIXER2_UNLOCK (mix); return ret; } static GstCaps * gst_videomixer2_src_getcaps (GstPad * pad) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); GstCaps *caps; GstStructure *s; gint n; if (mix->format != GST_VIDEO_FORMAT_UNKNOWN) { caps = gst_caps_copy (GST_PAD_CAPS (mix->srcpad)); } else { caps = gst_caps_copy (gst_pad_get_pad_template_caps (mix->srcpad)); } n = gst_caps_get_size (caps) - 1; for (; n >= 0; n--) { s = gst_caps_get_structure (caps, n); gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); if (mix->fps_d != 0) { gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); } } gst_object_unref (mix); return caps; } static gboolean gst_videomixer2_query_duration (GstVideoMixer2 * mix, GstQuery * query) { gint64 max; gboolean res; GstFormat format; GstIterator *it; gboolean done; /* parse format */ gst_query_parse_duration (query, &format, NULL); max = -1; res = TRUE; done = FALSE; /* Take maximum of all durations */ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); while (!done) { GstIteratorResult ires; gpointer item; ires = gst_iterator_next (it, &item); switch (ires) { case GST_ITERATOR_DONE: done = TRUE; break; case GST_ITERATOR_OK: { GstPad *pad = GST_PAD_CAST (item); gint64 duration; /* ask sink peer for duration */ res &= gst_pad_query_peer_duration (pad, &format, &duration); /* take max from all valid return values */ if (res) { /* valid unknown length, stop searching */ if (duration == -1) { max = duration; done = TRUE; } /* else see if bigger than current max */ else if (duration > max) max = duration; } gst_object_unref (pad); break; } case GST_ITERATOR_RESYNC: max = -1; res = TRUE; gst_iterator_resync (it); break; default: res = FALSE; done = TRUE; break; } } gst_iterator_free (it); if (res) { /* and store the max */ GST_DEBUG_OBJECT (mix, "Total duration in format %s: %" GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (max)); gst_query_set_duration (query, format, max); } return res; } static gboolean gst_videomixer2_query_latency (GstVideoMixer2 * mix, GstQuery * query) { GstClockTime min, max; gboolean live; gboolean res; GstIterator *it; gboolean done; res = TRUE; done = FALSE; live = FALSE; min = 0; max = GST_CLOCK_TIME_NONE; /* Take maximum of all latency values */ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); while (!done) { GstIteratorResult ires; gpointer item; ires = gst_iterator_next (it, &item); switch (ires) { case GST_ITERATOR_DONE: done = TRUE; break; case GST_ITERATOR_OK: { GstPad *pad = GST_PAD_CAST (item); GstQuery *peerquery; GstClockTime min_cur, max_cur; gboolean live_cur; peerquery = gst_query_new_latency (); /* Ask peer for latency */ res &= gst_pad_peer_query (pad, peerquery); /* take max from all valid return values */ if (res) { gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); if (min_cur > min) min = min_cur; if (max_cur != GST_CLOCK_TIME_NONE && ((max != GST_CLOCK_TIME_NONE && max_cur > max) || (max == GST_CLOCK_TIME_NONE))) max = max_cur; live = live || live_cur; } gst_query_unref (peerquery); gst_object_unref (pad); break; } case GST_ITERATOR_RESYNC: live = FALSE; min = 0; max = GST_CLOCK_TIME_NONE; res = TRUE; gst_iterator_resync (it); break; default: res = FALSE; done = TRUE; break; } } gst_iterator_free (it); if (res) { /* store the results */ GST_DEBUG_OBJECT (mix, "Calculated total latency: live %s, min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); gst_query_set_latency (query, live, min, max); } return res; } static gboolean gst_videomixer2_src_query (GstPad * pad, GstQuery * query) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: gst_query_set_position (query, format, gst_segment_to_stream_time (&mix->segment, GST_FORMAT_TIME, mix->segment.last_stop)); res = TRUE; break; default: break; } break; } case GST_QUERY_DURATION: res = gst_videomixer2_query_duration (mix, query); break; case GST_QUERY_LATENCY: res = gst_videomixer2_query_latency (mix, query); break; default: /* FIXME, needs a custom query handler because we have multiple * sinkpads */ res = FALSE; gst_query_unref (query); break; } gst_object_unref (mix); return res; } static gboolean gst_videomixer2_src_event (GstPad * pad, GstEvent * event) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent (pad)); gboolean result; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS:{ GstClockTimeDiff diff; GstClockTime timestamp; gdouble proportion; gst_event_parse_qos (event, &proportion, &diff, ×tamp); gst_videomixer2_update_qos (mix, proportion, diff, timestamp); result = gst_videomixer2_push_sink_event (mix, event); break; } case GST_EVENT_SEEK: { gdouble rate; GstFormat fmt; GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; GSList *l; gdouble abs_rate; /* parse the seek parameters */ gst_event_parse_seek (event, &rate, &fmt, &flags, &start_type, &start, &stop_type, &stop); if (rate <= 0.0) { GST_ERROR_OBJECT (mix, "Negative rates not supported yet"); result = FALSE; gst_event_unref (event); break; } GST_DEBUG_OBJECT (mix, "Handling SEEK event"); /* check if we are flushing */ if (flags & GST_SEEK_FLAG_FLUSH) { /* flushing seek, start flush downstream, the flush will be done * when all pads received a FLUSH_STOP. */ gst_pad_push_event (mix->srcpad, gst_event_new_flush_start ()); /* make sure we accept nothing anymore and return WRONG_STATE */ gst_collect_pads2_set_flushing (mix->collect, TRUE); } /* now wait for the collected to be finished and mark a new * segment */ GST_COLLECT_PADS2_STREAM_LOCK (mix->collect); abs_rate = ABS (rate); GST_VIDEO_MIXER2_LOCK (mix); for (l = mix->sinkpads; l; l = l->next) { GstVideoMixer2Pad *p = l->data; if (flags & GST_SEEK_FLAG_FLUSH) { gst_buffer_replace (&p->mixcol->buffer, NULL); p->mixcol->start_time = p->mixcol->end_time = -1; continue; } /* Convert to the output segment rate */ if (mix->segment.abs_rate != abs_rate) { if (mix->segment.abs_rate != 1.0 && p->mixcol->buffer) { p->mixcol->start_time /= mix->segment.abs_rate; p->mixcol->end_time /= mix->segment.abs_rate; } if (abs_rate != 1.0 && p->mixcol->buffer) { p->mixcol->start_time *= abs_rate; p->mixcol->end_time *= abs_rate; } } } GST_VIDEO_MIXER2_UNLOCK (mix); gst_segment_set_seek (&mix->segment, rate, fmt, flags, start_type, start, stop_type, stop, NULL); mix->segment.last_stop = -1; mix->ts_offset = 0; mix->nframes = 0; mix->newseg_pending = TRUE; if (flags & GST_SEEK_FLAG_FLUSH) { gst_collect_pads2_set_flushing (mix->collect, FALSE); /* we can't send FLUSH_STOP here since upstream could start pushing data * after we unlock mix->collect. * We set flush_stop_pending to TRUE instead and send FLUSH_STOP after * forwarding the seek upstream or from gst_videomixer_collected, * whichever happens first. */ mix->flush_stop_pending = TRUE; } GST_COLLECT_PADS2_STREAM_UNLOCK (mix->collect); gst_videomixer2_reset_qos (mix); result = gst_videomixer2_push_sink_event (mix, event); if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, FALSE)) { GST_DEBUG_OBJECT (mix, "pending flush stop"); gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); } break; } case GST_EVENT_NAVIGATION: /* navigation is rather pointless. */ result = FALSE; gst_event_unref (event); break; default: /* just forward the rest for now */ result = gst_videomixer2_push_sink_event (mix, event); break; } gst_object_unref (mix); return result; } static gboolean gst_videomixer2_src_setcaps (GstPad * pad, GstCaps * caps) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (gst_pad_get_parent_element (pad)); gboolean ret = FALSE; GstVideoFormat fmt; gint width, height; gint fps_n, fps_d; gint par_n, par_d; GST_INFO_OBJECT (pad, "set src caps: %" GST_PTR_FORMAT, caps); mix->blend = NULL; mix->overlay = NULL; mix->fill_checker = NULL; mix->fill_color = NULL; if (!gst_video_format_parse_caps (caps, &fmt, &width, &height) || !gst_video_parse_caps_framerate (caps, &fps_n, &fps_d) || !gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) goto done; GST_VIDEO_MIXER2_LOCK (mix); if (mix->fps_n != fps_n || mix->fps_d != fps_d) { if (mix->segment.last_stop != -1) { mix->ts_offset = mix->segment.last_stop - mix->segment.start; mix->nframes = 0; } gst_videomixer2_reset_qos (mix); } mix->format = fmt; mix->width = width; mix->height = height; mix->fps_n = fps_n; mix->fps_d = fps_d; mix->par_n = par_n; mix->par_d = par_d; switch (mix->format) { case GST_VIDEO_FORMAT_AYUV: mix->blend = gst_video_mixer_blend_ayuv; mix->overlay = gst_video_mixer_overlay_ayuv; mix->fill_checker = gst_video_mixer_fill_checker_ayuv; mix->fill_color = gst_video_mixer_fill_color_ayuv; ret = TRUE; break; case GST_VIDEO_FORMAT_ARGB: mix->blend = gst_video_mixer_blend_argb; mix->overlay = gst_video_mixer_overlay_argb; mix->fill_checker = gst_video_mixer_fill_checker_argb; mix->fill_color = gst_video_mixer_fill_color_argb; ret = TRUE; break; case GST_VIDEO_FORMAT_BGRA: mix->blend = gst_video_mixer_blend_bgra; mix->overlay = gst_video_mixer_overlay_bgra; mix->fill_checker = gst_video_mixer_fill_checker_bgra; mix->fill_color = gst_video_mixer_fill_color_bgra; ret = TRUE; break; case GST_VIDEO_FORMAT_ABGR: mix->blend = gst_video_mixer_blend_abgr; mix->overlay = gst_video_mixer_overlay_abgr; mix->fill_checker = gst_video_mixer_fill_checker_abgr; mix->fill_color = gst_video_mixer_fill_color_abgr; ret = TRUE; break; case GST_VIDEO_FORMAT_RGBA: mix->blend = gst_video_mixer_blend_rgba; mix->overlay = gst_video_mixer_overlay_rgba; mix->fill_checker = gst_video_mixer_fill_checker_rgba; mix->fill_color = gst_video_mixer_fill_color_rgba; ret = TRUE; break; case GST_VIDEO_FORMAT_Y444: mix->blend = gst_video_mixer_blend_y444; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_y444; mix->fill_color = gst_video_mixer_fill_color_y444; ret = TRUE; break; case GST_VIDEO_FORMAT_Y42B: mix->blend = gst_video_mixer_blend_y42b; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_y42b; mix->fill_color = gst_video_mixer_fill_color_y42b; ret = TRUE; break; case GST_VIDEO_FORMAT_YUY2: mix->blend = gst_video_mixer_blend_yuy2; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_yuy2; mix->fill_color = gst_video_mixer_fill_color_yuy2; ret = TRUE; break; case GST_VIDEO_FORMAT_UYVY: mix->blend = gst_video_mixer_blend_uyvy; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_uyvy; mix->fill_color = gst_video_mixer_fill_color_uyvy; ret = TRUE; break; case GST_VIDEO_FORMAT_YVYU: mix->blend = gst_video_mixer_blend_yvyu; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_yvyu; mix->fill_color = gst_video_mixer_fill_color_yvyu; ret = TRUE; break; case GST_VIDEO_FORMAT_I420: mix->blend = gst_video_mixer_blend_i420; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_i420; mix->fill_color = gst_video_mixer_fill_color_i420; ret = TRUE; break; case GST_VIDEO_FORMAT_YV12: mix->blend = gst_video_mixer_blend_yv12; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_yv12; mix->fill_color = gst_video_mixer_fill_color_yv12; ret = TRUE; break; case GST_VIDEO_FORMAT_Y41B: mix->blend = gst_video_mixer_blend_y41b; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_y41b; mix->fill_color = gst_video_mixer_fill_color_y41b; ret = TRUE; break; case GST_VIDEO_FORMAT_RGB: mix->blend = gst_video_mixer_blend_rgb; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_rgb; mix->fill_color = gst_video_mixer_fill_color_rgb; ret = TRUE; break; case GST_VIDEO_FORMAT_BGR: mix->blend = gst_video_mixer_blend_bgr; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_bgr; mix->fill_color = gst_video_mixer_fill_color_bgr; ret = TRUE; break; case GST_VIDEO_FORMAT_xRGB: mix->blend = gst_video_mixer_blend_xrgb; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_xrgb; mix->fill_color = gst_video_mixer_fill_color_xrgb; ret = TRUE; break; case GST_VIDEO_FORMAT_xBGR: mix->blend = gst_video_mixer_blend_xbgr; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_xbgr; mix->fill_color = gst_video_mixer_fill_color_xbgr; ret = TRUE; break; case GST_VIDEO_FORMAT_RGBx: mix->blend = gst_video_mixer_blend_rgbx; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_rgbx; mix->fill_color = gst_video_mixer_fill_color_rgbx; ret = TRUE; break; case GST_VIDEO_FORMAT_BGRx: mix->blend = gst_video_mixer_blend_bgrx; mix->overlay = mix->blend; mix->fill_checker = gst_video_mixer_fill_checker_bgrx; mix->fill_color = gst_video_mixer_fill_color_bgrx; ret = TRUE; break; default: break; } GST_VIDEO_MIXER2_UNLOCK (mix); done: gst_object_unref (mix); return ret; } static GstFlowReturn gst_videomixer2_sink_clip (GstCollectPads2 * pads, GstCollectData2 * data, GstBuffer * buf, GstBuffer ** outbuf, GstVideoMixer2 * mix) { GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (data->pad); GstVideoMixer2Collect *mixcol = pad->mixcol; GstClockTime start_time, end_time; start_time = GST_BUFFER_TIMESTAMP (buf); if (start_time == -1) { GST_ERROR_OBJECT (pad, "Timestamped buffers required!"); gst_buffer_unref (buf); return GST_FLOW_ERROR; } end_time = GST_BUFFER_DURATION (buf); if (end_time == -1) end_time = gst_util_uint64_scale_int (GST_SECOND, pad->fps_d, pad->fps_n); if (end_time == -1) { *outbuf = buf; return GST_FLOW_OK; } start_time = MAX (start_time, mixcol->collect.segment.start); start_time = gst_segment_to_running_time (&mixcol->collect.segment, GST_FORMAT_TIME, start_time); end_time += GST_BUFFER_TIMESTAMP (buf); if (mixcol->collect.segment.stop != -1) end_time = MIN (end_time, mixcol->collect.segment.stop); end_time = gst_segment_to_running_time (&mixcol->collect.segment, GST_FORMAT_TIME, end_time); /* Convert to the output segment rate */ if (mix->segment.abs_rate != 1.0) { start_time *= mix->segment.abs_rate; end_time *= mix->segment.abs_rate; } if (mixcol->buffer != NULL && end_time < mixcol->end_time) { gst_buffer_unref (buf); *outbuf = NULL; return GST_FLOW_OK; } *outbuf = buf; return GST_FLOW_OK; } static gboolean gst_videomixer2_sink_event (GstCollectPads2 * pads, GstCollectData2 * cdata, GstEvent * event, GstVideoMixer2 * mix) { GstVideoMixer2Pad *pad = GST_VIDEO_MIXER2_PAD (cdata->pad); gboolean ret = TRUE; GST_DEBUG_OBJECT (pad, "Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); /* return FALSE => event will be forwarded */ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT:{ GstFormat fmt; gst_event_parse_new_segment (event, NULL, NULL, &fmt, NULL, NULL, NULL); g_assert (fmt == GST_FORMAT_TIME); /* eat NEWSEGMENT events, collectpads2 unrefs the event */ ret = FALSE; break; } case GST_EVENT_FLUSH_STOP: mix->newseg_pending = TRUE; mix->flush_stop_pending = FALSE; gst_videomixer2_reset_qos (mix); gst_buffer_replace (&pad->mixcol->buffer, NULL); pad->mixcol->start_time = -1; pad->mixcol->end_time = -1; gst_segment_init (&mix->segment, GST_FORMAT_TIME); mix->segment.last_stop = -1; mix->ts_offset = 0; mix->nframes = 0; gst_pad_push_event (mix->srcpad, event); break; default: gst_pad_push_event (mix->srcpad, event); break; } return ret; } static gboolean forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) { gst_event_ref (event); GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); if (!gst_pad_push_event (pad, event)) { g_value_set_boolean (ret, FALSE); GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", event, GST_EVENT_TYPE_NAME (event)); } else { GST_LOG_OBJECT (pad, "Sent event %p (%s).", event, GST_EVENT_TYPE_NAME (event)); } gst_object_unref (pad); return TRUE; } static gboolean gst_videomixer2_push_sink_event (GstVideoMixer2 * mix, GstEvent * event) { GstIterator *it; GValue vret = { 0 }; GST_LOG_OBJECT (mix, "Forwarding event %p (%s)", event, GST_EVENT_TYPE_NAME (event)); g_value_init (&vret, G_TYPE_BOOLEAN); g_value_set_boolean (&vret, TRUE); it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, event); gst_iterator_free (it); gst_event_unref (event); return g_value_get_boolean (&vret); } /* GstElement vmethods */ static GstStateChangeReturn gst_videomixer2_change_state (GstElement * element, GstStateChange transition) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: GST_LOG_OBJECT (mix, "starting collectpads"); gst_collect_pads2_start (mix->collect); break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_LOG_OBJECT (mix, "stopping collectpads"); gst_collect_pads2_stop (mix->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_videomixer2_reset (mix); break; default: break; } return ret; } static GstPad * gst_videomixer2_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstVideoMixer2 *mix; GstVideoMixer2Pad *mixpad; GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); mix = GST_VIDEO_MIXER2 (element); if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) { gint serial = 0; gchar *name = NULL; GstVideoMixer2Collect *mixcol = NULL; GST_VIDEO_MIXER2_LOCK (mix); if (req_name == NULL || strlen (req_name) < 6 || !g_str_has_prefix (req_name, "sink_")) { /* no name given when requesting the pad, use next available int */ serial = mix->next_sinkpad++; } else { /* parse serial number from requested padname */ serial = g_ascii_strtoull (&req_name[5], NULL, 10); if (serial >= mix->next_sinkpad) mix->next_sinkpad = serial + 1; } /* create new pad with the name */ name = g_strdup_printf ("sink_%d", serial); mixpad = g_object_new (GST_TYPE_VIDEO_MIXER2_PAD, "name", name, "direction", templ->direction, "template", templ, NULL); g_free (name); mixpad->zorder = mix->numpads; mixpad->xpos = DEFAULT_PAD_XPOS; mixpad->ypos = DEFAULT_PAD_YPOS; mixpad->alpha = DEFAULT_PAD_ALPHA; mixcol = (GstVideoMixer2Collect *) gst_collect_pads2_add_pad_full (mix->collect, GST_PAD (mixpad), sizeof (GstVideoMixer2Collect), (GstCollectData2DestroyNotify) gst_videomixer2_collect_free, TRUE); /* Keep track of each other */ mixcol->mixpad = mixpad; mixpad->mixcol = mixcol; mixcol->start_time = -1; mixcol->end_time = -1; /* Keep an internal list of mixpads for zordering */ mix->sinkpads = g_slist_append (mix->sinkpads, mixpad); mix->numpads++; GST_VIDEO_MIXER2_UNLOCK (mix); } else { return NULL; } GST_DEBUG_OBJECT (element, "Adding pad %s", GST_PAD_NAME (mixpad)); /* add the pad to the element */ gst_element_add_pad (element, GST_PAD (mixpad)); gst_child_proxy_child_added (GST_OBJECT (mix), GST_OBJECT (mixpad)); return GST_PAD (mixpad); } static void gst_videomixer2_release_pad (GstElement * element, GstPad * pad) { GstVideoMixer2 *mix = NULL; GstVideoMixer2Pad *mixpad; gboolean update_caps; mix = GST_VIDEO_MIXER2 (element); GST_VIDEO_MIXER2_LOCK (mix); if (G_UNLIKELY (g_slist_find (mix->sinkpads, pad) == NULL)) { g_warning ("Unknown pad %s", GST_PAD_NAME (pad)); goto error; } mixpad = GST_VIDEO_MIXER2_PAD (pad); mix->sinkpads = g_slist_remove (mix->sinkpads, pad); gst_child_proxy_child_removed (GST_OBJECT (mix), GST_OBJECT (mixpad)); mix->numpads--; update_caps = mix->format != GST_VIDEO_FORMAT_UNKNOWN; GST_VIDEO_MIXER2_UNLOCK (mix); gst_collect_pads2_remove_pad (mix->collect, pad); if (update_caps) gst_videomixer2_update_src_caps (mix); gst_element_remove_pad (element, pad); return; error: GST_VIDEO_MIXER2_UNLOCK (mix); } /* GObject vmethods */ static void gst_videomixer2_finalize (GObject * o) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (o); gst_object_unref (mix->collect); g_mutex_free (mix->lock); G_OBJECT_CLASS (parent_class)->finalize (o); } static void gst_videomixer2_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (object); switch (prop_id) { case PROP_BACKGROUND: g_value_set_enum (value, mix->background); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_videomixer2_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (object); switch (prop_id) { case PROP_BACKGROUND: mix->background = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstChildProxy implementation */ static GstObject * gst_videomixer2_child_proxy_get_child_by_index (GstChildProxy * child_proxy, guint index) { GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (child_proxy); GstObject *obj; GST_VIDEO_MIXER2_LOCK (mix); if ((obj = g_slist_nth_data (mix->sinkpads, index))) gst_object_ref (obj); GST_VIDEO_MIXER2_UNLOCK (mix); return obj; } static guint gst_videomixer2_child_proxy_get_children_count (GstChildProxy * child_proxy) { guint count = 0; GstVideoMixer2 *mix = GST_VIDEO_MIXER2 (child_proxy); GST_VIDEO_MIXER2_LOCK (mix); count = mix->numpads; GST_VIDEO_MIXER2_UNLOCK (mix); GST_INFO_OBJECT (mix, "Children Count: %d", count); return count; } static void gst_videomixer2_child_proxy_init (gpointer g_iface, gpointer iface_data) { GstChildProxyInterface *iface = g_iface; GST_INFO ("intializing child proxy interface"); iface->get_child_by_index = gst_videomixer2_child_proxy_get_child_by_index; iface->get_children_count = gst_videomixer2_child_proxy_get_children_count; } /* GObject boilerplate */ static void gst_videomixer2_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Video mixer 2", "Filter/Editor/Video", "Mix multiple video streams", "Wim Taymans , " "Sebastian Dröge "); } static void gst_videomixer2_class_init (GstVideoMixer2Class * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_videomixer2_finalize; gobject_class->get_property = gst_videomixer2_get_property; gobject_class->set_property = gst_videomixer2_set_property; g_object_class_install_property (gobject_class, PROP_BACKGROUND, g_param_spec_enum ("background", "Background", "Background type", GST_TYPE_VIDEO_MIXER2_BACKGROUND, DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_videomixer2_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_videomixer2_release_pad); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_videomixer2_change_state); /* Register the pad class */ g_type_class_ref (GST_TYPE_VIDEO_MIXER2_PAD); } static void gst_videomixer2_init (GstVideoMixer2 * mix, GstVideoMixer2Class * g_class) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (mix); mix->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "src"), "src"); gst_pad_set_getcaps_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer2_src_getcaps)); gst_pad_set_setcaps_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer2_src_setcaps)); gst_pad_set_query_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer2_src_query)); gst_pad_set_event_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer2_src_event)); gst_element_add_pad (GST_ELEMENT (mix), mix->srcpad); mix->collect = gst_collect_pads2_new (); mix->background = DEFAULT_BACKGROUND; gst_collect_pads2_set_function (mix->collect, (GstCollectPads2Function) GST_DEBUG_FUNCPTR (gst_videomixer2_collected), mix); gst_collect_pads2_set_event_function (mix->collect, (GstCollectPads2EventFunction) gst_videomixer2_sink_event, mix); gst_collect_pads2_set_clip_function (mix->collect, (GstCollectPads2ClipFunction) gst_videomixer2_sink_clip, mix); mix->lock = g_mutex_new (); /* initialize variables */ gst_videomixer2_reset (mix); } /* Element registration */ gboolean gst_videomixer2_register (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_videomixer2_debug, "videomixer2", 0, "video mixer 2"); return gst_element_register (plugin, "videomixer2", GST_RANK_SECONDARY, GST_TYPE_VIDEO_MIXER2); } gst-plugins-good-0.10.31/gst/videomixer/videomixerpad.h0000644000175000017500000000444111671175354017775 00000000000000/* Video mixer pad * Copyright (C) 2008 Wim Taymans * * 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_VIDEO_MIXER_PAD_H__ #define __GST_VIDEO_MIXER_PAD_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_VIDEO_MIXER_PAD (gst_videomixer_pad_get_type()) #define GST_VIDEO_MIXER_PAD(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER_PAD, GstVideoMixerPad)) #define GST_VIDEO_MIXER_PAD_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER_PAD, GstVideoMixerPadiClass)) #define GST_IS_VIDEO_MIXER_PAD(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER_PAD)) #define GST_IS_VIDEO_MIXER_PAD_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER_PAD)) typedef struct _GstVideoMixerPad GstVideoMixerPad; typedef struct _GstVideoMixerPadClass GstVideoMixerPadClass; typedef struct _GstVideoMixerCollect GstVideoMixerCollect; struct _GstVideoMixerCollect { GstCollectData collect; /* we extend the CollectData */ GstBuffer *buffer; /* the queued buffer for this pad */ GstVideoMixerPad *mixpad; }; /* all information needed for one video stream */ struct _GstVideoMixerPad { GstPad parent; /* subclass the pad */ gint64 queued; guint in_width, in_height; gint fps_n; gint fps_d; gint par_n; gint par_d; gint xpos, ypos; guint zorder; gint blend_mode; gdouble alpha; GstVideoMixerCollect *mixcol; }; struct _GstVideoMixerPadClass { GstPadClass parent_class; }; G_END_DECLS #endif /* __GST_VIDEO_MIXER_PAD_H__ */ gst-plugins-good-0.10.31/gst/videomixer/blend.h0000644000175000017500000001171111671175354016217 00000000000000/* * Copyright (C) 2009 Sebastian Dröge * * 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 __BLEND_H__ #define __BLEND_H__ #include typedef void (*BlendFunction) (const guint8 * src, gint xpos, gint ypos, gint src_width, gint src_height, gdouble src_alpha, guint8 * dest, gint dest_width, gint dest_height); typedef void (*FillCheckerFunction) (guint8 * dest, gint width, gint height); typedef void (*FillColorFunction) (guint8 * dest, gint width, gint height, gint c1, gint c2, gint c3); extern BlendFunction gst_video_mixer_blend_argb; extern BlendFunction gst_video_mixer_blend_bgra; #define gst_video_mixer_blend_ayuv gst_video_mixer_blend_argb #define gst_video_mixer_blend_abgr gst_video_mixer_blend_argb #define gst_video_mixer_blend_rgba gst_video_mixer_blend_bgra extern BlendFunction gst_video_mixer_overlay_argb; extern BlendFunction gst_video_mixer_overlay_bgra; #define gst_video_mixer_overlay_ayuv gst_video_mixer_overlay_argb #define gst_video_mixer_overlay_abgr gst_video_mixer_overlay_argb #define gst_video_mixer_overlay_rgba gst_video_mixer_overlay_bgra extern BlendFunction gst_video_mixer_blend_i420; #define gst_video_mixer_blend_yv12 gst_video_mixer_blend_i420 extern BlendFunction gst_video_mixer_blend_y41b; extern BlendFunction gst_video_mixer_blend_y42b; extern BlendFunction gst_video_mixer_blend_y444; extern BlendFunction gst_video_mixer_blend_rgb; #define gst_video_mixer_blend_bgr gst_video_mixer_blend_rgb extern BlendFunction gst_video_mixer_blend_rgbx; #define gst_video_mixer_blend_bgrx gst_video_mixer_blend_rgbx #define gst_video_mixer_blend_xrgb gst_video_mixer_blend_rgbx #define gst_video_mixer_blend_xbgr gst_video_mixer_blend_rgbx extern BlendFunction gst_video_mixer_blend_yuy2; #define gst_video_mixer_blend_uyvy gst_video_mixer_blend_yuy2; #define gst_video_mixer_blend_yvyu gst_video_mixer_blend_yuy2; extern FillCheckerFunction gst_video_mixer_fill_checker_argb; #define gst_video_mixer_fill_checker_abgr gst_video_mixer_fill_checker_argb extern FillCheckerFunction gst_video_mixer_fill_checker_bgra; #define gst_video_mixer_fill_checker_rgba gst_video_mixer_fill_checker_bgra extern FillCheckerFunction gst_video_mixer_fill_checker_ayuv; extern FillCheckerFunction gst_video_mixer_fill_checker_i420; #define gst_video_mixer_fill_checker_yv12 gst_video_mixer_fill_checker_i420 extern FillCheckerFunction gst_video_mixer_fill_checker_y41b; extern FillCheckerFunction gst_video_mixer_fill_checker_y42b; extern FillCheckerFunction gst_video_mixer_fill_checker_y444; extern FillCheckerFunction gst_video_mixer_fill_checker_rgb; #define gst_video_mixer_fill_checker_bgr gst_video_mixer_fill_checker_rgb extern FillCheckerFunction gst_video_mixer_fill_checker_rgbx; #define gst_video_mixer_fill_checker_bgrx gst_video_mixer_fill_checker_rgbx #define gst_video_mixer_fill_checker_xrgb gst_video_mixer_fill_checker_rgbx #define gst_video_mixer_fill_checker_xbgr gst_video_mixer_fill_checker_rgbx extern FillCheckerFunction gst_video_mixer_fill_checker_yuy2; #define gst_video_mixer_fill_checker_yvyu gst_video_mixer_fill_checker_yuy2; extern FillCheckerFunction gst_video_mixer_fill_checker_uyvy; extern FillColorFunction gst_video_mixer_fill_color_argb; extern FillColorFunction gst_video_mixer_fill_color_abgr; extern FillColorFunction gst_video_mixer_fill_color_bgra; extern FillColorFunction gst_video_mixer_fill_color_rgba; extern FillColorFunction gst_video_mixer_fill_color_ayuv; extern FillColorFunction gst_video_mixer_fill_color_i420; extern FillColorFunction gst_video_mixer_fill_color_yv12; extern FillColorFunction gst_video_mixer_fill_color_y41b; extern FillColorFunction gst_video_mixer_fill_color_y42b; extern FillColorFunction gst_video_mixer_fill_color_y444; extern FillColorFunction gst_video_mixer_fill_color_rgb; extern FillColorFunction gst_video_mixer_fill_color_bgr; extern FillColorFunction gst_video_mixer_fill_color_xrgb; extern FillColorFunction gst_video_mixer_fill_color_xbgr; extern FillColorFunction gst_video_mixer_fill_color_rgbx; extern FillColorFunction gst_video_mixer_fill_color_bgrx; extern FillColorFunction gst_video_mixer_fill_color_yuy2; extern FillColorFunction gst_video_mixer_fill_color_yvyu; extern FillColorFunction gst_video_mixer_fill_color_uyvy; void gst_video_mixer_init_blend (void); #endif /* __BLEND_H__ */ gst-plugins-good-0.10.31/gst/videomixer/blend.c0000644000175000017500000006542611671175354016226 00000000000000/* * Copyright (C) 2004 Wim Taymans * Copyright (C) 2006 Mindfruit Bv. * Author: Sjoerd Simons * Author: Alex Ugarte * Copyright (C) 2009 Alex Ugarte * Copyright (C) 2009 Sebastian Dröge * * 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 "blend.h" #include "blendorc.h" #include #include #define BLEND(D,S,alpha) (((D) * (256 - (alpha)) + (S) * (alpha)) >> 8) GST_DEBUG_CATEGORY_STATIC (gst_videomixer_blend_debug); #define GST_CAT_DEFAULT gst_videomixer_blend_debug /* Below are the implementations of everything */ /* A32 is for AYUV, ARGB and BGRA */ #define BLEND_A32(name, method, LOOP) \ static void \ method##_ ##name (const guint8 * src, gint xpos, gint ypos, \ gint src_width, gint src_height, gdouble src_alpha, \ guint8 * dest, gint dest_width, gint dest_height) \ { \ guint s_alpha; \ gint src_stride, dest_stride; \ \ src_stride = src_width * 4; \ dest_stride = dest_width * 4; \ \ s_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ \ /* If it's completely transparent... we just return */ \ if (G_UNLIKELY (s_alpha == 0)) \ return; \ \ /* adjust src pointers for negative sizes */ \ if (xpos < 0) { \ src += -xpos * 4; \ src_width -= -xpos; \ xpos = 0; \ } \ if (ypos < 0) { \ src += -ypos * src_stride; \ src_height -= -ypos; \ ypos = 0; \ } \ /* adjust width/height if the src is bigger than dest */ \ if (xpos + src_width > dest_width) { \ src_width = dest_width - xpos; \ } \ if (ypos + src_height > dest_height) { \ src_height = dest_height - ypos; \ } \ \ dest = dest + 4 * xpos + (ypos * dest_stride); \ \ LOOP (dest, src, src_height, src_width, src_stride, dest_stride, s_alpha); \ } #define BLEND_A32_LOOP(name, method) \ static inline void \ _##method##_loop_##name (guint8 * dest, const guint8 * src, gint src_height, \ gint src_width, gint src_stride, gint dest_stride, guint s_alpha) \ { \ s_alpha = MIN (255, s_alpha); \ orc_##method##_##name (dest, dest_stride, src, src_stride, \ s_alpha, src_width, src_height); \ } BLEND_A32_LOOP (argb, blend); BLEND_A32_LOOP (bgra, blend); BLEND_A32_LOOP (argb, overlay); BLEND_A32_LOOP (bgra, overlay); #if G_BYTE_ORDER == LITTLE_ENDIAN BLEND_A32 (argb, blend, _blend_loop_argb); BLEND_A32 (bgra, blend, _blend_loop_bgra); BLEND_A32 (argb, overlay, _overlay_loop_argb); BLEND_A32 (bgra, overlay, _overlay_loop_bgra); #else BLEND_A32 (argb, blend, _blend_loop_bgra); BLEND_A32 (bgra, blend, _blend_loop_argb); BLEND_A32 (argb, overlay, _overlay_loop_bgra); BLEND_A32 (bgra, overlay, _overlay_loop_argb); #endif #define A32_CHECKER_C(name, RGB, A, C1, C2, C3) \ static void \ fill_checker_##name##_c (guint8 * dest, gint width, gint height) \ { \ gint i, j; \ gint val; \ static const gint tab[] = { 80, 160, 80, 160 }; \ \ if (!RGB) { \ for (i = 0; i < height; i++) { \ for (j = 0; j < width; j++) { \ dest[A] = 0xff; \ dest[C1] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ dest[C2] = 128; \ dest[C3] = 128; \ dest += 4; \ } \ } \ } else { \ for (i = 0; i < height; i++) { \ for (j = 0; j < width; j++) { \ val = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ dest[A] = 0xFF; \ dest[C1] = val; \ dest[C2] = val; \ dest[C3] = val; \ dest += 4; \ } \ } \ } \ } A32_CHECKER_C (argb, TRUE, 0, 1, 2, 3); A32_CHECKER_C (bgra, TRUE, 3, 2, 1, 0); A32_CHECKER_C (ayuv, FALSE, 0, 1, 2, 3); #define YUV_TO_R(Y,U,V) (CLAMP (1.164 * (Y - 16) + 1.596 * (V - 128), 0, 255)) #define YUV_TO_G(Y,U,V) (CLAMP (1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128), 0, 255)) #define YUV_TO_B(Y,U,V) (CLAMP (1.164 * (Y - 16) + 2.018 * (U - 128), 0, 255)) #define A32_COLOR(name, RGB, A, C1, C2, C3) \ static void \ fill_color_##name (guint8 * dest, gint width, gint height, gint Y, gint U, gint V) \ { \ gint c1, c2, c3; \ guint32 val; \ \ if (RGB) { \ c1 = YUV_TO_R (Y, U, V); \ c2 = YUV_TO_G (Y, U, V); \ c3 = YUV_TO_B (Y, U, V); \ } else { \ c1 = Y; \ c2 = U; \ c3 = V; \ } \ val = GUINT32_FROM_BE ((0xff << A) | (c1 << C1) | (c2 << C2) | (c3 << C3)); \ \ orc_splat_u32 ((guint32 *) dest, val, height * width); \ } A32_COLOR (argb, TRUE, 24, 16, 8, 0); A32_COLOR (bgra, TRUE, 0, 8, 16, 24); A32_COLOR (abgr, TRUE, 24, 0, 8, 16); A32_COLOR (rgba, TRUE, 0, 24, 16, 8); A32_COLOR (ayuv, FALSE, 24, 16, 8, 0); /* Y444, Y42B, I420, YV12, Y41B */ #define PLANAR_YUV_BLEND(format_name,format_enum,x_round,y_round,MEMCPY,BLENDLOOP) \ inline static void \ _blend_##format_name (const guint8 * src, guint8 * dest, \ gint src_stride, gint dest_stride, gint src_width, gint src_height, \ gdouble src_alpha) \ { \ gint i; \ gint b_alpha; \ \ /* If it's completely transparent... we just return */ \ if (G_UNLIKELY (src_alpha == 0.0)) { \ GST_INFO ("Fast copy (alpha == 0.0)"); \ return; \ } \ \ /* If it's completely opaque, we do a fast copy */ \ if (G_UNLIKELY (src_alpha == 1.0)) { \ GST_INFO ("Fast copy (alpha == 1.0)"); \ for (i = 0; i < src_height; i++) { \ MEMCPY (dest, src, src_width); \ src += src_stride; \ dest += dest_stride; \ } \ return; \ } \ \ b_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ \ BLENDLOOP(dest, dest_stride, src, src_stride, b_alpha, src_width, src_height); \ } \ \ static void \ blend_##format_name (const guint8 * src, gint xpos, gint ypos, \ gint src_width, gint src_height, gdouble src_alpha, \ guint8 * dest, gint dest_width, gint dest_height) \ { \ const guint8 *b_src; \ guint8 *b_dest; \ gint b_src_width = src_width; \ gint b_src_height = src_height; \ gint xoffset = 0; \ gint yoffset = 0; \ gint src_comp_rowstride, dest_comp_rowstride; \ gint src_comp_height; \ gint src_comp_width; \ gint comp_ypos, comp_xpos; \ gint comp_yoffset, comp_xoffset; \ \ xpos = x_round (xpos); \ ypos = y_round (ypos); \ \ /* adjust src pointers for negative sizes */ \ if (xpos < 0) { \ xoffset = -xpos; \ b_src_width -= -xpos; \ xpos = 0; \ } \ if (ypos < 0) { \ yoffset += -ypos; \ b_src_height -= -ypos; \ ypos = 0; \ } \ /* If x or y offset are larger then the source it's outside of the picture */ \ if (xoffset > src_width || yoffset > src_width) { \ return; \ } \ \ /* adjust width/height if the src is bigger than dest */ \ if (xpos + src_width > dest_width) { \ b_src_width = dest_width - xpos; \ } \ if (ypos + src_height > dest_height) { \ b_src_height = dest_height - ypos; \ } \ if (b_src_width < 0 || b_src_height < 0) { \ return; \ } \ \ /* First mix Y, then U, then V */ \ b_src = src + gst_video_format_get_component_offset (format_enum, 0, src_width, src_height); \ b_dest = dest + gst_video_format_get_component_offset (format_enum, 0, dest_width, dest_height); \ src_comp_rowstride = gst_video_format_get_row_stride (format_enum, 0, src_width); \ dest_comp_rowstride = gst_video_format_get_row_stride (format_enum, 0, dest_width); \ src_comp_height = gst_video_format_get_component_height (format_enum, 0, b_src_height); \ src_comp_width = gst_video_format_get_component_width (format_enum, 0, b_src_width); \ comp_xpos = (xpos == 0) ? 0 : gst_video_format_get_component_width (format_enum, 0, xpos); \ comp_ypos = (ypos == 0) ? 0 : gst_video_format_get_component_height (format_enum, 0, ypos); \ comp_xoffset = (xoffset == 0) ? 0 : gst_video_format_get_component_width (format_enum, 0, xoffset); \ comp_yoffset = (yoffset == 0) ? 0 : gst_video_format_get_component_height (format_enum, 0, yoffset); \ _blend_##format_name (b_src + comp_xoffset + comp_yoffset * src_comp_rowstride, \ b_dest + comp_xpos + comp_ypos * dest_comp_rowstride, \ src_comp_rowstride, \ dest_comp_rowstride, src_comp_width, src_comp_height, \ src_alpha); \ \ b_src = src + gst_video_format_get_component_offset (format_enum, 1, src_width, src_height); \ b_dest = dest + gst_video_format_get_component_offset (format_enum, 1, dest_width, dest_height); \ src_comp_rowstride = gst_video_format_get_row_stride (format_enum, 1, src_width); \ dest_comp_rowstride = gst_video_format_get_row_stride (format_enum, 1, dest_width); \ src_comp_height = gst_video_format_get_component_height (format_enum, 1, b_src_height); \ src_comp_width = gst_video_format_get_component_width (format_enum, 1, b_src_width); \ comp_xpos = (xpos == 0) ? 0 : gst_video_format_get_component_width (format_enum, 1, xpos); \ comp_ypos = (ypos == 0) ? 0 : gst_video_format_get_component_height (format_enum, 1, ypos); \ comp_xoffset = (xoffset == 0) ? 0 : gst_video_format_get_component_width (format_enum, 1, xoffset); \ comp_yoffset = (yoffset == 0) ? 0 : gst_video_format_get_component_height (format_enum, 1, yoffset); \ _blend_##format_name (b_src + comp_xoffset + comp_yoffset * src_comp_rowstride, \ b_dest + comp_xpos + comp_ypos * dest_comp_rowstride, \ src_comp_rowstride, \ dest_comp_rowstride, src_comp_width, src_comp_height, \ src_alpha); \ \ b_src = src + gst_video_format_get_component_offset (format_enum, 2, src_width, src_height); \ b_dest = dest + gst_video_format_get_component_offset (format_enum, 2, dest_width, dest_height); \ src_comp_rowstride = gst_video_format_get_row_stride (format_enum, 2, src_width); \ dest_comp_rowstride = gst_video_format_get_row_stride (format_enum, 2, dest_width); \ src_comp_height = gst_video_format_get_component_height (format_enum, 2, b_src_height); \ src_comp_width = gst_video_format_get_component_width (format_enum, 2, b_src_width); \ comp_xpos = (xpos == 0) ? 0 : gst_video_format_get_component_width (format_enum, 2, xpos); \ comp_ypos = (ypos == 0) ? 0 : gst_video_format_get_component_height (format_enum, 2, ypos); \ comp_xoffset = (xoffset == 0) ? 0 : gst_video_format_get_component_width (format_enum, 2, xoffset); \ comp_yoffset = (yoffset == 0) ? 0 : gst_video_format_get_component_height (format_enum, 2, yoffset); \ _blend_##format_name (b_src + comp_xoffset + comp_yoffset * src_comp_rowstride, \ b_dest + comp_xpos + comp_ypos * dest_comp_rowstride, \ src_comp_rowstride, \ dest_comp_rowstride, src_comp_width, src_comp_height, \ src_alpha); \ } #define PLANAR_YUV_FILL_CHECKER(format_name, format_enum, MEMSET) \ static void \ fill_checker_##format_name (guint8 * dest, gint width, gint height) \ { \ gint i, j; \ static const int tab[] = { 80, 160, 80, 160 }; \ guint8 *p; \ gint comp_width, comp_height; \ gint rowstride; \ \ p = dest + gst_video_format_get_component_offset (format_enum, 0, width, height); \ comp_width = gst_video_format_get_component_width (format_enum, 0, width); \ comp_height = gst_video_format_get_component_height (format_enum, 0, height); \ rowstride = gst_video_format_get_row_stride (format_enum, 0, width); \ \ for (i = 0; i < comp_height; i++) { \ for (j = 0; j < comp_width; j++) { \ *p++ = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ } \ p += rowstride - comp_width; \ } \ \ p = dest + gst_video_format_get_component_offset (format_enum, 1, width, height); \ comp_width = gst_video_format_get_component_width (format_enum, 1, width); \ comp_height = gst_video_format_get_component_height (format_enum, 1, height); \ rowstride = gst_video_format_get_row_stride (format_enum, 1, width); \ \ for (i = 0; i < comp_height; i++) { \ MEMSET (p, 0x80, comp_width); \ p += rowstride; \ } \ \ p = dest + gst_video_format_get_component_offset (format_enum, 2, width, height); \ comp_width = gst_video_format_get_component_width (format_enum, 2, width); \ comp_height = gst_video_format_get_component_height (format_enum, 2, height); \ rowstride = gst_video_format_get_row_stride (format_enum, 2, width); \ \ for (i = 0; i < comp_height; i++) { \ MEMSET (p, 0x80, comp_width); \ p += rowstride; \ } \ } #define PLANAR_YUV_FILL_COLOR(format_name,format_enum,MEMSET) \ static void \ fill_color_##format_name (guint8 * dest, gint width, gint height, \ gint colY, gint colU, gint colV) \ { \ guint8 *p; \ gint comp_width, comp_height; \ gint rowstride; \ gint i; \ \ p = dest + gst_video_format_get_component_offset (format_enum, 0, width, height); \ comp_width = gst_video_format_get_component_width (format_enum, 0, width); \ comp_height = gst_video_format_get_component_height (format_enum, 0, height); \ rowstride = gst_video_format_get_row_stride (format_enum, 0, width); \ \ for (i = 0; i < comp_height; i++) { \ MEMSET (p, colY, comp_width); \ p += rowstride; \ } \ \ p = dest + gst_video_format_get_component_offset (format_enum, 1, width, height); \ comp_width = gst_video_format_get_component_width (format_enum, 1, width); \ comp_height = gst_video_format_get_component_height (format_enum, 1, height); \ rowstride = gst_video_format_get_row_stride (format_enum, 1, width); \ \ for (i = 0; i < comp_height; i++) { \ MEMSET (p, colU, comp_width); \ p += rowstride; \ } \ \ p = dest + gst_video_format_get_component_offset (format_enum, 2, width, height); \ comp_width = gst_video_format_get_component_width (format_enum, 2, width); \ comp_height = gst_video_format_get_component_height (format_enum, 2, height); \ rowstride = gst_video_format_get_row_stride (format_enum, 2, width); \ \ for (i = 0; i < comp_height; i++) { \ MEMSET (p, colV, comp_width); \ p += rowstride; \ } \ } #define GST_ROUND_UP_1(x) (x) PLANAR_YUV_BLEND (i420, GST_VIDEO_FORMAT_I420, GST_ROUND_UP_2, GST_ROUND_UP_2, memcpy, orc_blend_u8); PLANAR_YUV_FILL_CHECKER (i420, GST_VIDEO_FORMAT_I420, memset); PLANAR_YUV_FILL_COLOR (i420, GST_VIDEO_FORMAT_I420, memset); PLANAR_YUV_FILL_COLOR (yv12, GST_VIDEO_FORMAT_YV12, memset); PLANAR_YUV_BLEND (y444, GST_VIDEO_FORMAT_Y444, GST_ROUND_UP_1, GST_ROUND_UP_1, memcpy, orc_blend_u8); PLANAR_YUV_FILL_CHECKER (y444, GST_VIDEO_FORMAT_Y444, memset); PLANAR_YUV_FILL_COLOR (y444, GST_VIDEO_FORMAT_Y444, memset); PLANAR_YUV_BLEND (y42b, GST_VIDEO_FORMAT_Y42B, GST_ROUND_UP_2, GST_ROUND_UP_1, memcpy, orc_blend_u8); PLANAR_YUV_FILL_CHECKER (y42b, GST_VIDEO_FORMAT_Y42B, memset); PLANAR_YUV_FILL_COLOR (y42b, GST_VIDEO_FORMAT_Y42B, memset); PLANAR_YUV_BLEND (y41b, GST_VIDEO_FORMAT_Y41B, GST_ROUND_UP_4, GST_ROUND_UP_1, memcpy, orc_blend_u8); PLANAR_YUV_FILL_CHECKER (y41b, GST_VIDEO_FORMAT_Y41B, memset); PLANAR_YUV_FILL_COLOR (y41b, GST_VIDEO_FORMAT_Y41B, memset); /* RGB, BGR, xRGB, xBGR, RGBx, BGRx */ #define RGB_BLEND(name, bpp, MEMCPY, BLENDLOOP) \ static void \ blend_##name (const guint8 * src, gint xpos, gint ypos, \ gint src_width, gint src_height, gdouble src_alpha, \ guint8 * dest, gint dest_width, gint dest_height) \ { \ gint b_alpha; \ gint i; \ gint src_stride, dest_stride; \ \ src_stride = GST_ROUND_UP_4 (src_width * bpp); \ dest_stride = GST_ROUND_UP_4 (dest_width * bpp); \ \ b_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ \ /* adjust src pointers for negative sizes */ \ if (xpos < 0) { \ src += -xpos * bpp; \ src_width -= -xpos; \ xpos = 0; \ } \ if (ypos < 0) { \ src += -ypos * src_stride; \ src_height -= -ypos; \ ypos = 0; \ } \ /* adjust width/height if the src is bigger than dest */ \ if (xpos + src_width > dest_width) { \ src_width = dest_width - xpos; \ } \ if (ypos + src_height > dest_height) { \ src_height = dest_height - ypos; \ } \ \ dest = dest + bpp * xpos + (ypos * dest_stride); \ /* If it's completely transparent... we just return */ \ if (G_UNLIKELY (src_alpha == 0.0)) { \ GST_INFO ("Fast copy (alpha == 0.0)"); \ return; \ } \ \ /* If it's completely opaque, we do a fast copy */ \ if (G_UNLIKELY (src_alpha == 1.0)) { \ GST_INFO ("Fast copy (alpha == 1.0)"); \ for (i = 0; i < src_height; i++) { \ MEMCPY (dest, src, bpp * src_width); \ src += src_stride; \ dest += dest_stride; \ } \ return; \ } \ \ BLENDLOOP(dest, dest_stride, src, src_stride, b_alpha, src_width * bpp, src_height); \ } #define RGB_FILL_CHECKER_C(name, bpp, r, g, b) \ static void \ fill_checker_##name##_c (guint8 * dest, gint width, gint height) \ { \ gint i, j; \ static const int tab[] = { 80, 160, 80, 160 }; \ gint dest_add = GST_ROUND_UP_4 (width * bpp) - width * bpp; \ \ for (i = 0; i < height; i++) { \ for (j = 0; j < width; j++) { \ dest[r] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; /* red */ \ dest[g] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; /* green */ \ dest[b] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; /* blue */ \ dest += bpp; \ } \ dest += dest_add; \ } \ } #define RGB_FILL_COLOR(name, bpp, MEMSET_RGB) \ static void \ fill_color_##name (guint8 * dest, gint width, gint height, \ gint colY, gint colU, gint colV) \ { \ gint red, green, blue; \ gint i; \ gint dest_stride = GST_ROUND_UP_4 (width * bpp); \ \ red = YUV_TO_R (colY, colU, colV); \ green = YUV_TO_G (colY, colU, colV); \ blue = YUV_TO_B (colY, colU, colV); \ \ for (i = 0; i < height; i++) { \ MEMSET_RGB (dest, red, green, blue, width); \ dest += dest_stride; \ } \ } #define MEMSET_RGB_C(name, r, g, b) \ static inline void \ _memset_##name##_c (guint8* dest, gint red, gint green, gint blue, gint width) { \ gint j; \ \ for (j = 0; j < width; j++) { \ dest[r] = red; \ dest[g] = green; \ dest[b] = blue; \ dest += 3; \ } \ } #define MEMSET_XRGB(name, r, g, b) \ static inline void \ _memset_##name (guint8* dest, gint red, gint green, gint blue, gint width) { \ guint32 val; \ \ val = GUINT32_FROM_BE ((red << r) | (green << g) | (blue << b)); \ orc_splat_u32 ((guint32 *) dest, val, width); \ } #define _orc_memcpy_u32(dest,src,len) orc_memcpy_u32((guint32 *) dest, (const guint32 *) src, len/4) RGB_BLEND (rgb, 3, memcpy, orc_blend_u8); RGB_FILL_CHECKER_C (rgb, 3, 0, 1, 2); MEMSET_RGB_C (rgb, 0, 1, 2); RGB_FILL_COLOR (rgb_c, 3, _memset_rgb_c); MEMSET_RGB_C (bgr, 2, 1, 0); RGB_FILL_COLOR (bgr_c, 3, _memset_bgr_c); RGB_BLEND (xrgb, 4, _orc_memcpy_u32, orc_blend_u8); RGB_FILL_CHECKER_C (xrgb, 4, 1, 2, 3); MEMSET_XRGB (xrgb, 24, 16, 0); RGB_FILL_COLOR (xrgb, 4, _memset_xrgb); MEMSET_XRGB (xbgr, 0, 16, 24); RGB_FILL_COLOR (xbgr, 4, _memset_xbgr); MEMSET_XRGB (rgbx, 24, 16, 8); RGB_FILL_COLOR (rgbx, 4, _memset_rgbx); MEMSET_XRGB (bgrx, 8, 16, 24); RGB_FILL_COLOR (bgrx, 4, _memset_bgrx); /* YUY2, YVYU, UYVY */ #define PACKED_422_BLEND(name, MEMCPY, BLENDLOOP) \ static void \ blend_##name (const guint8 * src, gint xpos, gint ypos, \ gint src_width, gint src_height, gdouble src_alpha, \ guint8 * dest, gint dest_width, gint dest_height) \ { \ gint b_alpha; \ gint i; \ gint src_stride, dest_stride; \ \ src_stride = GST_ROUND_UP_4 (src_width * 2); \ dest_stride = GST_ROUND_UP_4 (dest_width * 2); \ \ b_alpha = CLAMP ((gint) (src_alpha * 256), 0, 256); \ \ xpos = GST_ROUND_UP_2 (xpos); \ \ /* adjust src pointers for negative sizes */ \ if (xpos < 0) { \ src += -xpos * 2; \ src_width -= -xpos; \ xpos = 0; \ } \ if (ypos < 0) { \ src += -ypos * src_stride; \ src_height -= -ypos; \ ypos = 0; \ } \ \ /* adjust width/height if the src is bigger than dest */ \ if (xpos + src_width > dest_width) { \ src_width = dest_width - xpos; \ } \ if (ypos + src_height > dest_height) { \ src_height = dest_height - ypos; \ } \ \ dest = dest + 2 * xpos + (ypos * dest_stride); \ /* If it's completely transparent... we just return */ \ if (G_UNLIKELY (src_alpha == 0.0)) { \ GST_INFO ("Fast copy (alpha == 0.0)"); \ return; \ } \ \ /* If it's completely opaque, we do a fast copy */ \ if (G_UNLIKELY (src_alpha == 1.0)) { \ GST_INFO ("Fast copy (alpha == 1.0)"); \ for (i = 0; i < src_height; i++) { \ MEMCPY (dest, src, 2 * src_width); \ src += src_stride; \ dest += dest_stride; \ } \ return; \ } \ \ BLENDLOOP(dest, dest_stride, src, src_stride, b_alpha, 2 * src_width, src_height); \ } #define PACKED_422_FILL_CHECKER_C(name, Y1, U, Y2, V) \ static void \ fill_checker_##name##_c (guint8 * dest, gint width, gint height) \ { \ gint i, j; \ static const int tab[] = { 80, 160, 80, 160 }; \ gint dest_add; \ \ width = GST_ROUND_UP_2 (width); \ dest_add = GST_ROUND_UP_4 (width * 2) - width * 2; \ width /= 2; \ \ for (i = 0; i < height; i++) { \ for (j = 0; j < width; j++) { \ dest[Y1] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ dest[Y2] = tab[((i & 0x8) >> 3) + ((j & 0x8) >> 3)]; \ dest[U] = 128; \ dest[V] = 128; \ dest += 4; \ } \ dest += dest_add; \ } \ } #define PACKED_422_FILL_COLOR(name, Y1, U, Y2, V) \ static void \ fill_color_##name (guint8 * dest, gint width, gint height, \ gint colY, gint colU, gint colV) \ { \ gint i; \ gint dest_stride; \ guint32 val; \ \ width = GST_ROUND_UP_2 (width); \ dest_stride = GST_ROUND_UP_4 (width * 2); \ width /= 2; \ \ val = GUINT32_FROM_BE ((colY << Y1) | (colY << Y2) | (colU << U) | (colV << V)); \ \ for (i = 0; i < height; i++) { \ orc_splat_u32 ((guint32 *) dest, val, width); \ dest += dest_stride; \ } \ } PACKED_422_BLEND (yuy2, memcpy, orc_blend_u8); PACKED_422_FILL_CHECKER_C (yuy2, 0, 1, 2, 3); PACKED_422_FILL_CHECKER_C (uyvy, 1, 0, 3, 2); PACKED_422_FILL_COLOR (yuy2, 24, 16, 8, 0); PACKED_422_FILL_COLOR (yvyu, 24, 0, 8, 16); PACKED_422_FILL_COLOR (uyvy, 16, 24, 0, 8); /* Init function */ BlendFunction gst_video_mixer_blend_argb; BlendFunction gst_video_mixer_blend_bgra; BlendFunction gst_video_mixer_overlay_argb; BlendFunction gst_video_mixer_overlay_bgra; /* AYUV/ABGR is equal to ARGB, RGBA is equal to BGRA */ BlendFunction gst_video_mixer_blend_y444; BlendFunction gst_video_mixer_blend_y42b; BlendFunction gst_video_mixer_blend_i420; /* I420 is equal to YV12 */ BlendFunction gst_video_mixer_blend_y41b; BlendFunction gst_video_mixer_blend_rgb; /* BGR is equal to RGB */ BlendFunction gst_video_mixer_blend_rgbx; /* BGRx, xRGB, xBGR are equal to RGBx */ BlendFunction gst_video_mixer_blend_yuy2; /* YVYU and UYVY are equal to YUY2 */ FillCheckerFunction gst_video_mixer_fill_checker_argb; FillCheckerFunction gst_video_mixer_fill_checker_bgra; /* ABGR is equal to ARGB, RGBA is equal to BGRA */ FillCheckerFunction gst_video_mixer_fill_checker_ayuv; FillCheckerFunction gst_video_mixer_fill_checker_y444; FillCheckerFunction gst_video_mixer_fill_checker_y42b; FillCheckerFunction gst_video_mixer_fill_checker_i420; /* I420 is equal to YV12 */ FillCheckerFunction gst_video_mixer_fill_checker_y41b; FillCheckerFunction gst_video_mixer_fill_checker_rgb; /* BGR is equal to RGB */ FillCheckerFunction gst_video_mixer_fill_checker_xrgb; /* BGRx, xRGB, xBGR are equal to RGBx */ FillCheckerFunction gst_video_mixer_fill_checker_yuy2; /* YVYU is equal to YUY2 */ FillCheckerFunction gst_video_mixer_fill_checker_uyvy; FillColorFunction gst_video_mixer_fill_color_argb; FillColorFunction gst_video_mixer_fill_color_bgra; FillColorFunction gst_video_mixer_fill_color_abgr; FillColorFunction gst_video_mixer_fill_color_rgba; FillColorFunction gst_video_mixer_fill_color_ayuv; FillColorFunction gst_video_mixer_fill_color_y444; FillColorFunction gst_video_mixer_fill_color_y42b; FillColorFunction gst_video_mixer_fill_color_i420; FillColorFunction gst_video_mixer_fill_color_yv12; FillColorFunction gst_video_mixer_fill_color_y41b; FillColorFunction gst_video_mixer_fill_color_rgb; FillColorFunction gst_video_mixer_fill_color_bgr; FillColorFunction gst_video_mixer_fill_color_xrgb; FillColorFunction gst_video_mixer_fill_color_xbgr; FillColorFunction gst_video_mixer_fill_color_rgbx; FillColorFunction gst_video_mixer_fill_color_bgrx; FillColorFunction gst_video_mixer_fill_color_yuy2; FillColorFunction gst_video_mixer_fill_color_yvyu; FillColorFunction gst_video_mixer_fill_color_uyvy; void gst_video_mixer_init_blend (void) { GST_DEBUG_CATEGORY_INIT (gst_videomixer_blend_debug, "videomixer_blend", 0, "video mixer blending functions"); gst_video_mixer_blend_argb = blend_argb; gst_video_mixer_blend_bgra = blend_bgra; gst_video_mixer_overlay_argb = overlay_argb; gst_video_mixer_overlay_bgra = overlay_bgra; gst_video_mixer_blend_i420 = blend_i420; gst_video_mixer_blend_y444 = blend_y444; gst_video_mixer_blend_y42b = blend_y42b; gst_video_mixer_blend_y41b = blend_y41b; gst_video_mixer_blend_rgb = blend_rgb; gst_video_mixer_blend_xrgb = blend_xrgb; gst_video_mixer_blend_yuy2 = blend_yuy2; gst_video_mixer_fill_checker_argb = fill_checker_argb_c; gst_video_mixer_fill_checker_bgra = fill_checker_bgra_c; gst_video_mixer_fill_checker_ayuv = fill_checker_ayuv_c; gst_video_mixer_fill_checker_i420 = fill_checker_i420; gst_video_mixer_fill_checker_y444 = fill_checker_y444; gst_video_mixer_fill_checker_y42b = fill_checker_y42b; gst_video_mixer_fill_checker_y41b = fill_checker_y41b; gst_video_mixer_fill_checker_rgb = fill_checker_rgb_c; gst_video_mixer_fill_checker_xrgb = fill_checker_xrgb_c; gst_video_mixer_fill_checker_yuy2 = fill_checker_yuy2_c; gst_video_mixer_fill_checker_uyvy = fill_checker_uyvy_c; gst_video_mixer_fill_color_argb = fill_color_argb; gst_video_mixer_fill_color_bgra = fill_color_bgra; gst_video_mixer_fill_color_abgr = fill_color_abgr; gst_video_mixer_fill_color_rgba = fill_color_rgba; gst_video_mixer_fill_color_ayuv = fill_color_ayuv; gst_video_mixer_fill_color_i420 = fill_color_i420; gst_video_mixer_fill_color_yv12 = fill_color_yv12; gst_video_mixer_fill_color_y444 = fill_color_y444; gst_video_mixer_fill_color_y42b = fill_color_y42b; gst_video_mixer_fill_color_y41b = fill_color_y41b; gst_video_mixer_fill_color_rgb = fill_color_rgb_c; gst_video_mixer_fill_color_bgr = fill_color_bgr_c; gst_video_mixer_fill_color_xrgb = fill_color_xrgb; gst_video_mixer_fill_color_xbgr = fill_color_xbgr; gst_video_mixer_fill_color_rgbx = fill_color_rgbx; gst_video_mixer_fill_color_bgrx = fill_color_bgrx; gst_video_mixer_fill_color_yuy2 = fill_color_yuy2; gst_video_mixer_fill_color_yvyu = fill_color_yvyu; gst_video_mixer_fill_color_uyvy = fill_color_uyvy; } gst-plugins-good-0.10.31/gst/videomixer/README0000644000175000017500000000205411671175354015642 00000000000000Video Mixer ----------- A generice video mixer, it blends the ayuv buffers from all pads onto a new buffer. The new buffer has by default a checkerboard pattern but its color can be changed with a property. The mixer can mix streams with different framerates and video sizes. It uses the duration value of the buffer to schedule the rendering of the buffers. For streams with a different resoltion than the final output resolution one can specify the position of the top left corner where this image should be placed with the pad properties xpos and ypos. The overall alpha value of a stream can also be specified with a pad property. By default, the streams are blended in the order that the pads were requested from the element. This can be overridden by changing the zorder pad property of the stream, a stream with lower zorder gets drawn first. TODO ---- - really implement zorder - take I420 yuv as well - output AYUV if possible. - implement different blend modes, some code is already done - use filter caps on srcpad to decide on the final output size gst-plugins-good-0.10.31/gst/videomixer/blendorc.orc0000644000175000017500000001035311671175354017260 00000000000000.function orc_splat_u32 .dest 4 d1 guint32 .param 4 p1 guint32 copyl d1, p1 .function orc_memcpy_u32 .dest 4 d1 guint32 .source 4 s1 guint32 copyl d1, s1 .function orc_blend_u8 .flags 2d .dest 1 d1 guint8 .source 1 s1 guint8 .param 2 p1 .temp 2 t1 .temp 2 t2 .const 1 c1 8 convubw t1, d1 convubw t2, s1 subw t2, t2, t1 mullw t2, t2, p1 shlw t1, t1, c1 addw t2, t1, t2 shruw t2, t2, c1 convsuswb d1, t2 .function orc_blend_argb .flags 2d .dest 4 d guint8 .source 4 s guint8 .param 2 alpha .temp 4 t .temp 2 tw .temp 1 tb .temp 4 a .temp 8 d_wide .temp 8 s_wide .temp 8 a_wide .const 4 a_alpha 0x000000ff loadl t, s convlw tw, t convwb tb, tw splatbl a, tb x4 convubw a_wide, a x4 mullw a_wide, a_wide, alpha x4 shruw a_wide, a_wide, 8 x4 convubw s_wide, t loadl t, d x4 convubw d_wide, t x4 subw s_wide, s_wide, d_wide x4 mullw s_wide, s_wide, a_wide x4 div255w s_wide, s_wide x4 addw d_wide, d_wide, s_wide x4 convwb t, d_wide orl t, t, a_alpha storel d, t .function orc_blend_bgra .flags 2d .dest 4 d guint8 .source 4 s guint8 .param 2 alpha .temp 4 t .temp 4 t2 .temp 2 tw .temp 1 tb .temp 4 a .temp 8 d_wide .temp 8 s_wide .temp 8 a_wide .const 4 a_alpha 0xff000000 loadl t, s shrul t2, t, 24 convlw tw, t2 convwb tb, tw splatbl a, tb x4 convubw a_wide, a x4 mullw a_wide, a_wide, alpha x4 shruw a_wide, a_wide, 8 x4 convubw s_wide, t loadl t, d x4 convubw d_wide, t x4 subw s_wide, s_wide, d_wide x4 mullw s_wide, s_wide, a_wide x4 div255w s_wide, s_wide x4 addw d_wide, d_wide, s_wide x4 convwb t, d_wide orl t, t, a_alpha storel d, t .function orc_overlay_argb .flags 2d .dest 4 d guint8 .source 4 s guint8 .param 2 alpha .temp 4 t .temp 2 tw .temp 1 tb .temp 8 alpha_s .temp 8 alpha_s_inv .temp 8 alpha_d .temp 4 a .temp 8 d_wide .temp 8 s_wide .const 4 xfs 0xffffffff .const 4 a_alpha 0x000000ff .const 4 a_alpha_inv 0xffffff00 # calc source alpha as alpha_s = alpha_s * alpha / 256 loadl t, s convlw tw, t convwb tb, tw splatbl a, tb x4 convubw alpha_s, a x4 mullw alpha_s, alpha_s, alpha x4 shruw alpha_s, alpha_s, 8 x4 convubw s_wide, t x4 mullw s_wide, s_wide, alpha_s # calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255 loadpl a, xfs x4 convubw alpha_s_inv, a x4 subw alpha_s_inv, alpha_s_inv, alpha_s loadl t, d convlw tw, t convwb tb, tw splatbl a, tb x4 convubw alpha_d, a x4 mullw alpha_d, alpha_d, alpha_s_inv x4 div255w alpha_d, alpha_d x4 convubw d_wide, t x4 mullw d_wide, d_wide, alpha_d # calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255 x4 addw d_wide, d_wide, s_wide # calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255 x4 addw alpha_d, alpha_d, alpha_s # now normalize the pix_d by the final alpha to make it associative x4 divluw, d_wide, d_wide, alpha_d # pack the new alpha into the correct spot x4 convwb t, d_wide andl t, t, a_alpha_inv x4 convwb a, alpha_d andl a, a, a_alpha orl t, t, a storel d, t .function orc_overlay_bgra .flags 2d .dest 4 d guint8 .source 4 s guint8 .param 2 alpha .temp 4 t .temp 4 t2 .temp 2 tw .temp 1 tb .temp 8 alpha_s .temp 8 alpha_s_inv .temp 8 alpha_d .temp 4 a .temp 8 d_wide .temp 8 s_wide .const 4 xfs 0xffffffff .const 4 a_alpha 0xff000000 .const 4 a_alpha_inv 0x00ffffff # calc source alpha as alpha_s = alpha_s * alpha / 256 loadl t, s shrul t2, t, 24 convlw tw, t2 convwb tb, tw splatbl a, tb x4 convubw alpha_s, a x4 mullw alpha_s, alpha_s, alpha x4 shruw alpha_s, alpha_s, 8 x4 convubw s_wide, t x4 mullw s_wide, s_wide, alpha_s # calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255 loadpl a, xfs x4 convubw alpha_s_inv, a x4 subw alpha_s_inv, alpha_s_inv, alpha_s loadl t, d shrul t2, t, 24 convlw tw, t2 convwb tb, tw splatbl a, tb x4 convubw alpha_d, a x4 mullw alpha_d, alpha_d, alpha_s_inv x4 div255w alpha_d, alpha_d x4 convubw d_wide, t x4 mullw d_wide, d_wide, alpha_d # calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255 x4 addw d_wide, d_wide, s_wide # calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255 x4 addw alpha_d, alpha_d, alpha_s # now normalize the pix_d by the final alpha to make it associative x4 divluw, d_wide, d_wide, alpha_d # pack the new alpha into the correct spot x4 convwb t, d_wide andl t, t, a_alpha_inv x4 convwb a, alpha_d andl a, a, a_alpha orl t, t, a storel d, t gst-plugins-good-0.10.31/gst/videomixer/videomixer2pad.h0000644000175000017500000000436411677341660020064 00000000000000/* Generic video mixer plugin * Copyright (C) 2008 Wim Taymans * Copyright (C) 2010 Sebastian Dröge * * 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_VIDEO_MIXER2_PAD_H__ #define __GST_VIDEO_MIXER2_PAD_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_VIDEO_MIXER2_PAD (gst_videomixer2_pad_get_type()) #define GST_VIDEO_MIXER2_PAD(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER2_PAD, GstVideoMixer2Pad)) #define GST_VIDEO_MIXER2_PAD_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER_PAD, GstVideoMixer2PadClass)) #define GST_IS_VIDEO_MIXER2_PAD(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER2_PAD)) #define GST_IS_VIDEO_MIXER2_PAD_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER2_PAD)) typedef struct _GstVideoMixer2Pad GstVideoMixer2Pad; typedef struct _GstVideoMixer2PadClass GstVideoMixer2PadClass; typedef struct _GstVideoMixer2Collect GstVideoMixer2Collect; /** * GstVideoMixer2Pad: * * The opaque #GstVideoMixer2Pad structure. */ struct _GstVideoMixer2Pad { GstPad parent; /* < private > */ /* caps */ gint width, height; gint fps_n; gint fps_d; /* properties */ gint xpos, ypos; guint zorder; gdouble alpha; GstVideoMixer2Collect *mixcol; }; struct _GstVideoMixer2PadClass { GstPadClass parent_class; }; GType gst_videomixer2_pad_get_type (void); G_END_DECLS #endif /* __GST_VIDEO_MIXER2_PAD_H__ */ gst-plugins-good-0.10.31/gst/videomixer/videomixer.h0000644000175000017500000000704611671175354017314 00000000000000/* Generic video mixer plugin * Copyright (C) 2008 Wim Taymans * * 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_VIDEO_MIXER_H__ #define __GST_VIDEO_MIXER_H__ #include #include #include "videomixerpad.h" #include "blend.h" G_BEGIN_DECLS #define GST_TYPE_VIDEO_MIXER (gst_videomixer_get_type()) #define GST_VIDEO_MIXER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_MIXER, GstVideoMixer)) #define GST_VIDEO_MIXER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_MIXER, GstVideoMixerClass)) #define GST_IS_VIDEO_MIXER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_MIXER)) #define GST_IS_VIDEO_MIXER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_MIXER)) typedef struct _GstVideoMixer GstVideoMixer; typedef struct _GstVideoMixerClass GstVideoMixerClass; /** * GstVideoMixerBackground: * @VIDEO_MIXER_BACKGROUND_CHECKER: checker pattern background * @VIDEO_MIXER_BACKGROUND_BLACK: solid color black background * @VIDEO_MIXER_BACKGROUND_WHITE: solid color white background * @VIDEO_MIXER_BACKGROUND_TRANSPARENT: background is left transparent and layers are composited using "A OVER B" composition rules. This is only applicable to AYUV and ARGB (and variants) as it preserves the alpha channel and allows for further mixing. * * The different backgrounds videomixer can blend over. */ typedef enum { VIDEO_MIXER_BACKGROUND_CHECKER, VIDEO_MIXER_BACKGROUND_BLACK, VIDEO_MIXER_BACKGROUND_WHITE, VIDEO_MIXER_BACKGROUND_TRANSPARENT, } GstVideoMixerBackground; /** * GstVideoMixer: * * The opaque #GstVideoMixer structure. */ struct _GstVideoMixer { GstElement element; /* pad */ GstPad *srcpad; /* Lock to prevent the state to change while blending */ GMutex *state_lock; /* Sink pads using Collect Pads from core's base library */ GstCollectPads *collect; /* sinkpads, a GSList of GstVideoMixerPads */ GSList *sinkpads; gint numpads; GstClockTime last_ts; GstClockTime last_duration; /* the master pad */ GstVideoMixerPad *master; GstVideoFormat fmt; gint in_width, in_height; gint out_width, out_height; gboolean setcaps; gboolean sendseg; GstVideoMixerBackground background; gint fps_n; gint fps_d; gint par_n; gint par_d; /* Next available sinkpad index */ gint next_sinkpad; /* sink event handling */ GstPadEventFunction collect_event; guint64 segment_position; /* Current downstream segment */ GstSegment segment; /* QoS stuff */ gdouble proportion; GstClockTime earliest_time; BlendFunction blend, overlay; FillCheckerFunction fill_checker; FillColorFunction fill_color; gboolean flush_stop_pending; }; struct _GstVideoMixerClass { GstElementClass parent_class; }; GType gst_video_mixer_get_type (void); G_END_DECLS #endif /* __GST_VIDEO_MIXER_H__ */ gst-plugins-good-0.10.31/gst/videomixer/Makefile.in0000644000175000017500000010533311720560237017024 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # This is a makefile.am fragment to build Orc code. # # Define ORC_SOURCE and then include this file, such as: # # ORC_SOURCE=gstadderorc # include $(top_srcdir)/common/orc.mak # # This fragment will create tmp-orc.c and gstadderorc.h from # gstadderorc.orc. # # When 'make dist' is run at the top level, or 'make orc-update' # in a directory including this fragment, the generated source # files will be copied to $(ORC_SOURCE)-dist.[ch]. These files # should be checked in to git, since they are used if Orc is # disabled. # # Note that this file defines BUILT_SOURCES, so any later usage # of BUILT_SOURCES in the Makefile.am that includes this file # must use '+='. # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/common/orc.mak subdir = gst/videomixer ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstvideomixer_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstvideomixer_la_OBJECTS = libgstvideomixer_la-videomixer.lo \ libgstvideomixer_la-blend.lo \ libgstvideomixer_la-videomixer2.lo am__objects_1 = libgstvideomixer_la-tmp-orc.lo nodist_libgstvideomixer_la_OBJECTS = $(am__objects_1) libgstvideomixer_la_OBJECTS = $(am_libgstvideomixer_la_OBJECTS) \ $(nodist_libgstvideomixer_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstvideomixer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) \ $(libgstvideomixer_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstvideomixer_la_SOURCES) \ $(nodist_libgstvideomixer_la_SOURCES) DIST_SOURCES = $(libgstvideomixer_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstvideomixer.la ORC_SOURCE = blendorc EXTRA_DIST = $(ORC_SOURCE).orc ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h orcc_v_gen = $(orcc_v_gen_$(V)) orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) orcc_v_gen_0 = @echo " ORCC $@"; cp_v_gen = $(cp_v_gen_$(V)) cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) cp_v_gen_0 = @echo " CP $@"; libgstvideomixer_la_SOURCES = \ videomixer.c \ blend.c \ videomixer2.c nodist_libgstvideomixer_la_SOURCES = $(ORC_NODIST_SOURCES) libgstvideomixer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) libgstvideomixer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(ORC_LIBS) libgstvideomixer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideomixer_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = \ videomixer.h \ videomixerpad.h \ blend.h \ videomixer2.h \ videomixer2pad.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/orc.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videomixer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/videomixer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/orc.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstvideomixer.la: $(libgstvideomixer_la_OBJECTS) $(libgstvideomixer_la_DEPENDENCIES) $(EXTRA_libgstvideomixer_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstvideomixer_la_LINK) -rpath $(plugindir) $(libgstvideomixer_la_OBJECTS) $(libgstvideomixer_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-blend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-tmp-orc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-videomixer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideomixer_la-videomixer2.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstvideomixer_la-videomixer.lo: videomixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-videomixer.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-videomixer.Tpo -c -o libgstvideomixer_la-videomixer.lo `test -f 'videomixer.c' || echo '$(srcdir)/'`videomixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-videomixer.Tpo $(DEPDIR)/libgstvideomixer_la-videomixer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videomixer.c' object='libgstvideomixer_la-videomixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-videomixer.lo `test -f 'videomixer.c' || echo '$(srcdir)/'`videomixer.c libgstvideomixer_la-blend.lo: blend.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-blend.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-blend.Tpo -c -o libgstvideomixer_la-blend.lo `test -f 'blend.c' || echo '$(srcdir)/'`blend.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-blend.Tpo $(DEPDIR)/libgstvideomixer_la-blend.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='blend.c' object='libgstvideomixer_la-blend.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-blend.lo `test -f 'blend.c' || echo '$(srcdir)/'`blend.c libgstvideomixer_la-videomixer2.lo: videomixer2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-videomixer2.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-videomixer2.Tpo -c -o libgstvideomixer_la-videomixer2.lo `test -f 'videomixer2.c' || echo '$(srcdir)/'`videomixer2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-videomixer2.Tpo $(DEPDIR)/libgstvideomixer_la-videomixer2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='videomixer2.c' object='libgstvideomixer_la-videomixer2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-videomixer2.lo `test -f 'videomixer2.c' || echo '$(srcdir)/'`videomixer2.c libgstvideomixer_la-tmp-orc.lo: tmp-orc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -MT libgstvideomixer_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideomixer_la-tmp-orc.Tpo -c -o libgstvideomixer_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideomixer_la-tmp-orc.Tpo $(DEPDIR)/libgstvideomixer_la-tmp-orc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tmp-orc.c' object='libgstvideomixer_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideomixer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideomixer_la_CFLAGS) $(CFLAGS) -c -o libgstvideomixer_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-local \ clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-local clean-pluginLTLIBRARIES ctags \ dist-hook distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-pluginLTLIBRARIES orc-update: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h @HAVE_ORCC_TRUE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_FALSE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c @HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c @HAVE_ORCC_FALSE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c @HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h clean-local: clean-orc .PHONY: clean-orc clean-orc: rm -f tmp-orc.c $(ORC_SOURCE).h dist-hook: dist-hook-orc .PHONY: dist-hook-orc # we try and copy updated orc -dist files below, but don't fail if it # doesn't work as the srcdir might not be writable dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c rm -f tmp-orc.c~ cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideomixer -:SHARED libgstvideomixer \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideomixer_la_SOURCES) \ $(nodist_libgstvideomixer_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideomixer_la_CFLAGS) \ -:LDFLAGS $(libgstvideomixer_la_LDFLAGS) \ $(libgstvideomixer_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/videomixer/videomixer.c0000644000175000017500000016255511677341660017317 00000000000000/* Generic video mixer plugin * Copyright (C) 2004 Wim Taymans * * 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-videomixer * * Videomixer can accept AYUV, ARGB and BGRA video streams. For each of the requested * sink pads it will compare the incoming geometry and framerate to define the * output parameters. Indeed output video frames will have the geometry of the * biggest incoming video stream and the framerate of the fastest incoming one. * * All sink pads must be either AYUV, ARGB or BGRA, but a mixture of them is not * supported. The src pad will have the same colorspace as the sinks. * No colorspace conversion is done. * * Individual parameters for each input stream can be configured on the * #GstVideoMixerPad. * * * Sample pipelines * |[ * gst-launch-0.10 \ * videotestsrc pattern=1 ! \ * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)10/1,width=100,height=100 ! \ * videobox border-alpha=0 top=-70 bottom=-70 right=-220 ! \ * videomixer name=mix sink_0::alpha=0.7 sink_1::alpha=0.5 ! \ * ffmpegcolorspace ! xvimagesink \ * videotestsrc ! \ * video/x-raw-yuv,format=\(fourcc\)AYUV,framerate=\(fraction\)5/1,width=320,height=240 ! mix. * ]| A pipeline to demonstrate videomixer used together with videobox. * This should show a 320x240 pixels video test source with some transparency * showing the background checker pattern. Another video test source with just * the snow pattern of 100x100 pixels is overlayed on top of the first one on * the left vertically centered with a small transparency showing the first * video test source behind and the checker pattern under it. Note that the * framerate of the output video is 10 frames per second. * |[ * gst-launch videotestsrc pattern=1 ! \ * video/x-raw-rgb, framerate=\(fraction\)10/1, width=100, height=100 ! \ * videomixer name=mix ! ffmpegcolorspace ! ximagesink \ * videotestsrc ! \ * video/x-raw-rgb, framerate=\(fraction\)5/1, width=320, height=240 ! mix. * ]| A pipeline to demostrate bgra mixing. (This does not demonstrate alpha blending). * |[ * gst-launch videotestsrc pattern=1 ! \ * video/x-raw-yuv,format =\(fourcc\)I420, framerate=\(fraction\)10/1, width=100, height=100 ! \ * videomixer name=mix ! ffmpegcolorspace ! ximagesink \ * videotestsrc ! \ * video/x-raw-yuv,format=\(fourcc\)I420, framerate=\(fraction\)5/1, width=320, height=240 ! mix. * ]| A pipeline to test I420 * |[ * gst-launch videotestsrc pattern="snow" ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=200, height=150 ! videomixer name=mix sink_1::xpos=20 sink_1::ypos=20 sink_1::alpha=0.5 ! ffmpegcolorspace ! xvimagesink videotestsrc ! video/x-raw-yuv, framerate=\(fraction\)10/1, width=640, height=360 ! mix. * ]| Set position and alpha on the mixer using #GstVideoMixerPad properties. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "videomixer.h" #include "videomixer2.h" #include "gst/glib-compat-private.h" #ifdef DISABLE_ORC #define orc_memset memset #else #include #endif GST_DEBUG_CATEGORY_STATIC (gst_videomixer_debug); #define GST_CAT_DEFAULT gst_videomixer_debug #define GST_VIDEO_MIXER_GET_STATE_LOCK(mix) \ (GST_VIDEO_MIXER(mix)->state_lock) #define GST_VIDEO_MIXER_STATE_LOCK(mix) \ (g_mutex_lock(GST_VIDEO_MIXER_GET_STATE_LOCK (mix))) #define GST_VIDEO_MIXER_STATE_UNLOCK(mix) \ (g_mutex_unlock(GST_VIDEO_MIXER_GET_STATE_LOCK (mix))) static GType gst_videomixer_get_type (void); static void gst_videomixer_pad_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_videomixer_pad_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static gboolean gst_videomixer_src_event (GstPad * pad, GstEvent * event); static gboolean gst_videomixer_sink_event (GstPad * pad, GstEvent * event); static void gst_videomixer_sort_pads (GstVideoMixer * mix); #define DEFAULT_PAD_ZORDER 0 #define DEFAULT_PAD_XPOS 0 #define DEFAULT_PAD_YPOS 0 #define DEFAULT_PAD_ALPHA 1.0 enum { PROP_PAD_0, PROP_PAD_ZORDER, PROP_PAD_XPOS, PROP_PAD_YPOS, PROP_PAD_ALPHA }; GType gst_videomixer_pad_get_type (void); G_DEFINE_TYPE (GstVideoMixerPad, gst_videomixer_pad, GST_TYPE_PAD); static void gst_videomixer_pad_class_init (GstVideoMixerPadClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_videomixer_pad_set_property; gobject_class->get_property = gst_videomixer_pad_get_property; g_object_class_install_property (gobject_class, PROP_PAD_ZORDER, g_param_spec_uint ("zorder", "Z-Order", "Z Order of the picture", 0, 10000, DEFAULT_PAD_ZORDER, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PAD_XPOS, g_param_spec_int ("xpos", "X Position", "X Position of the picture", G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PAD_YPOS, g_param_spec_int ("ypos", "Y Position", "Y Position of the picture", G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PAD_ALPHA, g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, DEFAULT_PAD_ALPHA, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); } static void gst_videomixer_pad_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (object); switch (prop_id) { case PROP_PAD_ZORDER: g_value_set_uint (value, pad->zorder); break; case PROP_PAD_XPOS: g_value_set_int (value, pad->xpos); break; case PROP_PAD_YPOS: g_value_set_int (value, pad->ypos); break; case PROP_PAD_ALPHA: g_value_set_double (value, pad->alpha); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_videomixer_pad_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (object); GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (GST_PAD (pad))); switch (prop_id) { case PROP_PAD_ZORDER: GST_VIDEO_MIXER_STATE_LOCK (mix); pad->zorder = g_value_get_uint (value); gst_videomixer_sort_pads (mix); GST_VIDEO_MIXER_STATE_UNLOCK (mix); break; case PROP_PAD_XPOS: pad->xpos = g_value_get_int (value); break; case PROP_PAD_YPOS: pad->ypos = g_value_get_int (value); break; case PROP_PAD_ALPHA: pad->alpha = g_value_get_double (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } gst_object_unref (mix); } static void gst_videomixer_update_qos (GstVideoMixer * mix, gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp) { GST_DEBUG_OBJECT (mix, "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %" GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "", GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp)); GST_OBJECT_LOCK (mix); mix->proportion = proportion; if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { if (G_UNLIKELY (diff > 0)) mix->earliest_time = timestamp + 2 * diff + gst_util_uint64_scale_int (GST_SECOND, mix->fps_d, mix->fps_n); else mix->earliest_time = timestamp + diff; } else { mix->earliest_time = GST_CLOCK_TIME_NONE; } GST_OBJECT_UNLOCK (mix); } static void gst_videomixer_reset_qos (GstVideoMixer * mix) { gst_videomixer_update_qos (mix, 0.5, 0, GST_CLOCK_TIME_NONE); } static void gst_videomixer_read_qos (GstVideoMixer * mix, gdouble * proportion, GstClockTime * time) { GST_OBJECT_LOCK (mix); *proportion = mix->proportion; *time = mix->earliest_time; GST_OBJECT_UNLOCK (mix); } /* Perform qos calculations before processing the next frame. Returns TRUE if * the frame should be processed, FALSE if the frame can be dropped entirely */ static gboolean gst_videomixer_do_qos (GstVideoMixer * mix, GstClockTime timestamp) { GstClockTime qostime, earliest_time; gdouble proportion; /* no timestamp, can't do QoS => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { GST_LOG_OBJECT (mix, "invalid timestamp, can't do QoS, process frame"); return TRUE; } /* get latest QoS observation values */ gst_videomixer_read_qos (mix, &proportion, &earliest_time); /* skip qos if we have no observation (yet) => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { GST_LOG_OBJECT (mix, "no observation yet, process frame"); return TRUE; } /* qos is done on running time */ qostime = gst_segment_to_running_time (&mix->segment, GST_FORMAT_TIME, timestamp); /* see how our next timestamp relates to the latest qos timestamp */ GST_LOG_OBJECT (mix, "qostime %" GST_TIME_FORMAT ", earliest %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { GST_DEBUG_OBJECT (mix, "we are late, drop frame"); return FALSE; } GST_LOG_OBJECT (mix, "process frame"); return TRUE; } static void gst_videomixer_set_master_geometry (GstVideoMixer * mix) { GSList *walk; gint width = 0, height = 0, fps_n = 0, fps_d = 0, par_n = 0, par_d = 0; GstVideoMixerPad *master = NULL; walk = mix->sinkpads; while (walk) { GstVideoMixerPad *mixpad = GST_VIDEO_MIXER_PAD (walk->data); walk = g_slist_next (walk); /* Biggest input geometry will be our output geometry */ width = MAX (width, mixpad->in_width); height = MAX (height, mixpad->in_height); /* If mix framerate < mixpad framerate, using fractions */ GST_DEBUG_OBJECT (mixpad, "comparing framerate %d/%d to mixpad's %d/%d", fps_n, fps_d, mixpad->fps_n, mixpad->fps_d); if ((!fps_n && !fps_d) || ((gint64) fps_n * mixpad->fps_d < (gint64) mixpad->fps_n * fps_d)) { fps_n = mixpad->fps_n; fps_d = mixpad->fps_d; par_n = mixpad->par_n; par_d = mixpad->par_d; GST_DEBUG_OBJECT (mixpad, "becomes the master pad"); master = mixpad; } } /* set results */ if (mix->master != master || mix->in_width != width || mix->in_height != height || mix->fps_n != fps_n || mix->fps_d != fps_d || mix->par_n != par_n || mix->par_d != par_d) { mix->setcaps = TRUE; mix->sendseg = TRUE; gst_videomixer_reset_qos (mix); mix->master = master; mix->in_width = width; mix->in_height = height; mix->fps_n = fps_n; mix->fps_d = fps_d; mix->par_n = par_n; mix->par_d = par_d; } } static gboolean gst_videomixer_pad_sink_setcaps (GstPad * pad, GstCaps * vscaps) { GstVideoMixer *mix; GstVideoMixerPad *mixpad; GstStructure *structure; gint in_width, in_height; gboolean ret = FALSE; const GValue *framerate, *par; GST_INFO_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, vscaps); mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); mixpad = GST_VIDEO_MIXER_PAD (pad); if (!mixpad) goto beach; structure = gst_caps_get_structure (vscaps, 0); if (!gst_structure_get_int (structure, "width", &in_width) || !gst_structure_get_int (structure, "height", &in_height) || (framerate = gst_structure_get_value (structure, "framerate")) == NULL) goto beach; par = gst_structure_get_value (structure, "pixel-aspect-ratio"); GST_VIDEO_MIXER_STATE_LOCK (mix); mixpad->fps_n = gst_value_get_fraction_numerator (framerate); mixpad->fps_d = gst_value_get_fraction_denominator (framerate); if (par) { mixpad->par_n = gst_value_get_fraction_numerator (par); mixpad->par_d = gst_value_get_fraction_denominator (par); } else { mixpad->par_n = mixpad->par_d = 1; } mixpad->in_width = in_width; mixpad->in_height = in_height; gst_videomixer_set_master_geometry (mix); GST_VIDEO_MIXER_STATE_UNLOCK (mix); ret = TRUE; beach: gst_object_unref (mix); return ret; } static GstCaps * gst_videomixer_pad_sink_getcaps (GstPad * pad) { GstVideoMixer *mix; GstVideoMixerPad *mixpad; GstCaps *res = NULL; GstCaps *mastercaps; GstStructure *st; mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); mixpad = GST_VIDEO_MIXER_PAD (pad); if (!mixpad) goto beach; /* Get downstream allowed caps */ res = gst_pad_get_allowed_caps (mix->srcpad); if (G_UNLIKELY (res == NULL)) { res = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); goto beach; } GST_VIDEO_MIXER_STATE_LOCK (mix); /* Return as-is if not other sinkpad set as master */ if (mix->master == NULL) { GST_VIDEO_MIXER_STATE_UNLOCK (mix); goto beach; } mastercaps = gst_pad_get_fixed_caps_func (GST_PAD (mix->master)); /* If master pad caps aren't negotiated yet, return downstream * allowed caps */ if (!GST_CAPS_IS_SIMPLE (mastercaps)) { GST_VIDEO_MIXER_STATE_UNLOCK (mix); gst_caps_unref (mastercaps); goto beach; } gst_caps_unref (res); res = gst_caps_make_writable (mastercaps); st = gst_caps_get_structure (res, 0); gst_structure_set (st, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); if (!gst_structure_has_field (st, "pixel-aspect-ratio")) gst_structure_set (st, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); GST_VIDEO_MIXER_STATE_UNLOCK (mix); beach: GST_DEBUG_OBJECT (pad, "Returning %" GST_PTR_FORMAT, res); return res; } /* * We accept the caps if it has the same format as other sink pads in * the element. */ static gboolean gst_videomixer_pad_sink_acceptcaps (GstPad * pad, GstCaps * vscaps) { gboolean ret; GstVideoMixer *mix; GstCaps *acceptedCaps; mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (pad, "%" GST_PTR_FORMAT, vscaps); GST_VIDEO_MIXER_STATE_LOCK (mix); if (mix->master) { acceptedCaps = gst_pad_get_fixed_caps_func (GST_PAD (mix->master)); acceptedCaps = gst_caps_make_writable (acceptedCaps); GST_LOG_OBJECT (pad, "master's caps %" GST_PTR_FORMAT, acceptedCaps); if (GST_CAPS_IS_SIMPLE (acceptedCaps)) { GstStructure *s; s = gst_caps_get_structure (acceptedCaps, 0); gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); if (!gst_structure_has_field (s, "pixel-aspect-ratio")) gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); } } else { acceptedCaps = gst_pad_get_fixed_caps_func (pad); } GST_INFO_OBJECT (pad, "vscaps: %" GST_PTR_FORMAT, vscaps); GST_INFO_OBJECT (pad, "acceptedCaps: %" GST_PTR_FORMAT, acceptedCaps); ret = gst_caps_can_intersect (vscaps, acceptedCaps); GST_INFO_OBJECT (pad, "%saccepted caps %" GST_PTR_FORMAT, (ret ? "" : "not "), vscaps); gst_caps_unref (acceptedCaps); GST_VIDEO_MIXER_STATE_UNLOCK (mix); gst_object_unref (mix); return ret; } static void gst_videomixer_pad_init (GstVideoMixerPad * mixerpad) { /* setup some pad functions */ gst_pad_set_setcaps_function (GST_PAD (mixerpad), gst_videomixer_pad_sink_setcaps); gst_pad_set_acceptcaps_function (GST_PAD (mixerpad), GST_DEBUG_FUNCPTR (gst_videomixer_pad_sink_acceptcaps)); gst_pad_set_getcaps_function (GST_PAD (mixerpad), gst_videomixer_pad_sink_getcaps); mixerpad->zorder = DEFAULT_PAD_ZORDER; mixerpad->xpos = DEFAULT_PAD_XPOS; mixerpad->ypos = DEFAULT_PAD_YPOS; mixerpad->alpha = DEFAULT_PAD_ALPHA; } /* VideoMixer signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_BACKGROUND VIDEO_MIXER_BACKGROUND_CHECKER enum { PROP_0, PROP_BACKGROUND }; #define GST_TYPE_VIDEO_MIXER_BACKGROUND (gst_video_mixer_background_get_type()) static GType gst_video_mixer_background_get_type (void) { static GType video_mixer_background_type = 0; static const GEnumValue video_mixer_background[] = { {VIDEO_MIXER_BACKGROUND_CHECKER, "Checker pattern", "checker"}, {VIDEO_MIXER_BACKGROUND_BLACK, "Black", "black"}, {VIDEO_MIXER_BACKGROUND_WHITE, "White", "white"}, {VIDEO_MIXER_BACKGROUND_TRANSPARENT, "Transparent Background to enable further mixing", "transparent"}, {0, NULL, NULL}, }; if (!video_mixer_background_type) { video_mixer_background_type = g_enum_register_static ("GstVideoMixerBackground", video_mixer_background); } return video_mixer_background_type; } static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) ); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx) ); static void gst_videomixer_finalize (GObject * object); static GstCaps *gst_videomixer_getcaps (GstPad * pad); static gboolean gst_videomixer_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_videomixer_query (GstPad * pad, GstQuery * query); static GstFlowReturn gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix); static GstPad *gst_videomixer_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_videomixer_release_pad (GstElement * element, GstPad * pad); static void gst_videomixer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_videomixer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_videomixer_change_state (GstElement * element, GstStateChange transition); /*static guint gst_videomixer_signals[LAST_SIGNAL] = { 0 }; */ static void gst_videomixer_child_proxy_init (gpointer g_iface, gpointer iface_data); static void _do_init (GType object_type); GST_BOILERPLATE_FULL (GstVideoMixer, gst_videomixer, GstElement, GST_TYPE_ELEMENT, _do_init); static void _do_init (GType object_type) { static const GInterfaceInfo child_proxy_info = { (GInterfaceInitFunc) gst_videomixer_child_proxy_init, NULL, NULL }; g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, &child_proxy_info); GST_INFO ("GstChildProxy interface registered"); } static GstObject * gst_videomixer_child_proxy_get_child_by_index (GstChildProxy * child_proxy, guint index) { GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy); GstObject *obj; GST_VIDEO_MIXER_STATE_LOCK (mix); if ((obj = g_slist_nth_data (mix->sinkpads, index))) gst_object_ref (obj); GST_VIDEO_MIXER_STATE_UNLOCK (mix); return obj; } static guint gst_videomixer_child_proxy_get_children_count (GstChildProxy * child_proxy) { guint count = 0; GstVideoMixer *mix = GST_VIDEO_MIXER (child_proxy); GST_VIDEO_MIXER_STATE_LOCK (mix); count = mix->numpads; GST_VIDEO_MIXER_STATE_UNLOCK (mix); GST_INFO_OBJECT (mix, "Children Count: %d", count); return count; } static void gst_videomixer_child_proxy_init (gpointer g_iface, gpointer iface_data) { GstChildProxyInterface *iface = g_iface; GST_INFO ("intializing child proxy interface"); iface->get_child_by_index = gst_videomixer_child_proxy_get_child_by_index; iface->get_children_count = gst_videomixer_child_proxy_get_children_count; } static void gst_videomixer_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Video mixer", "Filter/Editor/Video", "Mix multiple video streams", "Wim Taymans "); } static void gst_videomixer_class_init (GstVideoMixerClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_videomixer_finalize; gobject_class->get_property = gst_videomixer_get_property; gobject_class->set_property = gst_videomixer_set_property; g_object_class_install_property (gobject_class, PROP_BACKGROUND, g_param_spec_enum ("background", "Background", "Background type", GST_TYPE_VIDEO_MIXER_BACKGROUND, DEFAULT_BACKGROUND, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_videomixer_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_videomixer_release_pad); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_videomixer_change_state); /* Register the pad class */ (void) (GST_TYPE_VIDEO_MIXER_PAD); /* Register the background enum */ (void) (GST_TYPE_VIDEO_MIXER_BACKGROUND); } static void gst_videomixer_collect_free (GstVideoMixerCollect * mixcol) { if (mixcol->buffer) { gst_buffer_unref (mixcol->buffer); mixcol->buffer = NULL; } } static void gst_videomixer_reset (GstVideoMixer * mix) { GSList *walk; mix->in_width = 0; mix->in_height = 0; mix->out_width = 0; mix->out_height = 0; mix->fps_n = mix->fps_d = 0; mix->par_n = mix->par_d = 1; mix->setcaps = FALSE; mix->sendseg = FALSE; mix->segment_position = 0; gst_segment_init (&mix->segment, GST_FORMAT_TIME); gst_videomixer_reset_qos (mix); mix->fmt = GST_VIDEO_FORMAT_UNKNOWN; mix->last_ts = 0; mix->last_duration = -1; /* clean up collect data */ walk = mix->collect->data; while (walk) { GstVideoMixerCollect *data = (GstVideoMixerCollect *) walk->data; gst_videomixer_collect_free (data); walk = g_slist_next (walk); } mix->next_sinkpad = 0; mix->flush_stop_pending = FALSE; } static void gst_videomixer_init (GstVideoMixer * mix, GstVideoMixerClass * g_class) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (mix); mix->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "src"), "src"); gst_pad_set_getcaps_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer_getcaps)); gst_pad_set_setcaps_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer_setcaps)); gst_pad_set_query_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer_query)); gst_pad_set_event_function (GST_PAD (mix->srcpad), GST_DEBUG_FUNCPTR (gst_videomixer_src_event)); gst_element_add_pad (GST_ELEMENT (mix), mix->srcpad); mix->collect = gst_collect_pads_new (); mix->background = DEFAULT_BACKGROUND; gst_collect_pads_set_function (mix->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_videomixer_collected), mix); mix->state_lock = g_mutex_new (); /* initialize variables */ gst_videomixer_reset (mix); } static void gst_videomixer_finalize (GObject * object) { GstVideoMixer *mix = GST_VIDEO_MIXER (object); gst_object_unref (mix->collect); g_mutex_free (mix->state_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_videomixer_query_duration (GstVideoMixer * mix, GstQuery * query) { gint64 max; gboolean res; GstFormat format; GstIterator *it; gboolean done; /* parse format */ gst_query_parse_duration (query, &format, NULL); max = -1; res = TRUE; done = FALSE; /* Take maximum of all durations */ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); while (!done) { GstIteratorResult ires; gpointer item; ires = gst_iterator_next (it, &item); switch (ires) { case GST_ITERATOR_DONE: done = TRUE; break; case GST_ITERATOR_OK: { GstPad *pad = GST_PAD_CAST (item); gint64 duration; /* ask sink peer for duration */ res &= gst_pad_query_peer_duration (pad, &format, &duration); /* take max from all valid return values */ if (res) { /* valid unknown length, stop searching */ if (duration == -1) { max = duration; done = TRUE; } /* else see if bigger than current max */ else if (duration > max) max = duration; } gst_object_unref (pad); break; } case GST_ITERATOR_RESYNC: max = -1; res = TRUE; gst_iterator_resync (it); break; default: res = FALSE; done = TRUE; break; } } gst_iterator_free (it); if (res) { /* and store the max */ GST_DEBUG_OBJECT (mix, "Total duration in format %s: %" GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (max)); gst_query_set_duration (query, format, max); } return res; } static gboolean gst_videomixer_query_latency (GstVideoMixer * mix, GstQuery * query) { GstClockTime min, max; gboolean live; gboolean res; GstIterator *it; gboolean done; res = TRUE; done = FALSE; live = FALSE; min = 0; max = GST_CLOCK_TIME_NONE; /* Take maximum of all latency values */ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); while (!done) { GstIteratorResult ires; gpointer item; ires = gst_iterator_next (it, &item); switch (ires) { case GST_ITERATOR_DONE: done = TRUE; break; case GST_ITERATOR_OK: { GstPad *pad = GST_PAD_CAST (item); GstQuery *peerquery; GstClockTime min_cur, max_cur; gboolean live_cur; peerquery = gst_query_new_latency (); /* Ask peer for latency */ res &= gst_pad_peer_query (pad, peerquery); /* take max from all valid return values */ if (res) { gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); if (min_cur > min) min = min_cur; if (max_cur != GST_CLOCK_TIME_NONE && ((max != GST_CLOCK_TIME_NONE && max_cur > max) || (max == GST_CLOCK_TIME_NONE))) max = max_cur; live = live || live_cur; } gst_query_unref (peerquery); gst_object_unref (pad); break; } case GST_ITERATOR_RESYNC: live = FALSE; min = 0; max = GST_CLOCK_TIME_NONE; res = TRUE; gst_iterator_resync (it); break; default: res = FALSE; done = TRUE; break; } } gst_iterator_free (it); if (res) { /* store the results */ GST_DEBUG_OBJECT (mix, "Calculated total latency: live %s, min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); gst_query_set_latency (query, live, min, max); } return res; } static gboolean gst_videomixer_query (GstPad * pad, GstQuery * query) { GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: /* FIXME, bring to stream time, might be tricky */ gst_query_set_position (query, format, mix->last_ts); res = TRUE; break; default: break; } break; } case GST_QUERY_DURATION: res = gst_videomixer_query_duration (mix, query); break; case GST_QUERY_LATENCY: res = gst_videomixer_query_latency (mix, query); break; default: /* FIXME, needs a custom query handler because we have multiple * sinkpads, send to the master pad until then */ res = gst_pad_query (GST_PAD_CAST (mix->master), query); break; } gst_object_unref (mix); return res; } static GstCaps * gst_videomixer_getcaps (GstPad * pad) { GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); GstCaps *caps; GstStructure *structure; int numCaps; if (mix->master) { caps = gst_caps_copy (gst_pad_get_pad_template_caps (GST_PAD (mix->master))); } else { caps = gst_caps_copy (gst_pad_get_pad_template_caps (mix->srcpad)); } numCaps = gst_caps_get_size (caps) - 1; for (; numCaps >= 0; numCaps--) { structure = gst_caps_get_structure (caps, numCaps); if (mix->out_width != 0) { gst_structure_set (structure, "width", G_TYPE_INT, mix->out_width, NULL); } if (mix->out_height != 0) { gst_structure_set (structure, "height", G_TYPE_INT, mix->out_height, NULL); } if (mix->fps_d != 0) { gst_structure_set (structure, "framerate", GST_TYPE_FRACTION, mix->fps_n, mix->fps_d, NULL); } } gst_object_unref (mix); return caps; } static gboolean gst_videomixer_setcaps (GstPad * pad, GstCaps * caps) { GstVideoMixer *mixer = GST_VIDEO_MIXER (gst_pad_get_parent_element (pad)); gboolean ret = FALSE; GST_INFO_OBJECT (mixer, "set src caps: %" GST_PTR_FORMAT, caps); mixer->blend = NULL; mixer->overlay = NULL; mixer->fill_checker = NULL; mixer->fill_color = NULL; if (!gst_video_format_parse_caps (caps, &mixer->fmt, NULL, NULL)) goto done; switch (mixer->fmt) { case GST_VIDEO_FORMAT_AYUV: mixer->blend = gst_video_mixer_blend_ayuv; mixer->overlay = gst_video_mixer_overlay_ayuv; mixer->fill_checker = gst_video_mixer_fill_checker_ayuv; mixer->fill_color = gst_video_mixer_fill_color_ayuv; ret = TRUE; break; case GST_VIDEO_FORMAT_ARGB: mixer->blend = gst_video_mixer_blend_argb; mixer->overlay = gst_video_mixer_overlay_argb; mixer->fill_checker = gst_video_mixer_fill_checker_argb; mixer->fill_color = gst_video_mixer_fill_color_argb; ret = TRUE; break; case GST_VIDEO_FORMAT_BGRA: mixer->blend = gst_video_mixer_blend_bgra; mixer->overlay = gst_video_mixer_overlay_bgra; mixer->fill_checker = gst_video_mixer_fill_checker_bgra; mixer->fill_color = gst_video_mixer_fill_color_bgra; ret = TRUE; break; case GST_VIDEO_FORMAT_ABGR: mixer->blend = gst_video_mixer_blend_abgr; mixer->overlay = gst_video_mixer_overlay_abgr; mixer->fill_checker = gst_video_mixer_fill_checker_abgr; mixer->fill_color = gst_video_mixer_fill_color_abgr; ret = TRUE; break; case GST_VIDEO_FORMAT_RGBA: mixer->blend = gst_video_mixer_blend_rgba; mixer->overlay = gst_video_mixer_overlay_rgba; mixer->fill_checker = gst_video_mixer_fill_checker_rgba; mixer->fill_color = gst_video_mixer_fill_color_rgba; ret = TRUE; break; case GST_VIDEO_FORMAT_Y444: mixer->blend = gst_video_mixer_blend_y444; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_y444; mixer->fill_color = gst_video_mixer_fill_color_y444; ret = TRUE; break; case GST_VIDEO_FORMAT_Y42B: mixer->blend = gst_video_mixer_blend_y42b; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_y42b; mixer->fill_color = gst_video_mixer_fill_color_y42b; ret = TRUE; break; case GST_VIDEO_FORMAT_YUY2: mixer->blend = gst_video_mixer_blend_yuy2; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_yuy2; mixer->fill_color = gst_video_mixer_fill_color_yuy2; ret = TRUE; break; case GST_VIDEO_FORMAT_UYVY: mixer->blend = gst_video_mixer_blend_uyvy; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_uyvy; mixer->fill_color = gst_video_mixer_fill_color_uyvy; ret = TRUE; break; case GST_VIDEO_FORMAT_YVYU: mixer->blend = gst_video_mixer_blend_yvyu; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_yvyu; mixer->fill_color = gst_video_mixer_fill_color_yvyu; ret = TRUE; break; case GST_VIDEO_FORMAT_I420: mixer->blend = gst_video_mixer_blend_i420; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_i420; mixer->fill_color = gst_video_mixer_fill_color_i420; ret = TRUE; break; case GST_VIDEO_FORMAT_YV12: mixer->blend = gst_video_mixer_blend_yv12; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_yv12; mixer->fill_color = gst_video_mixer_fill_color_yv12; ret = TRUE; break; case GST_VIDEO_FORMAT_Y41B: mixer->blend = gst_video_mixer_blend_y41b; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_y41b; mixer->fill_color = gst_video_mixer_fill_color_y41b; ret = TRUE; break; case GST_VIDEO_FORMAT_RGB: mixer->blend = gst_video_mixer_blend_rgb; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_rgb; mixer->fill_color = gst_video_mixer_fill_color_rgb; ret = TRUE; break; case GST_VIDEO_FORMAT_BGR: mixer->blend = gst_video_mixer_blend_bgr; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_bgr; mixer->fill_color = gst_video_mixer_fill_color_bgr; ret = TRUE; break; case GST_VIDEO_FORMAT_xRGB: mixer->blend = gst_video_mixer_blend_xrgb; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_xrgb; mixer->fill_color = gst_video_mixer_fill_color_xrgb; ret = TRUE; break; case GST_VIDEO_FORMAT_xBGR: mixer->blend = gst_video_mixer_blend_xbgr; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_xbgr; mixer->fill_color = gst_video_mixer_fill_color_xbgr; ret = TRUE; break; case GST_VIDEO_FORMAT_RGBx: mixer->blend = gst_video_mixer_blend_rgbx; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_rgbx; mixer->fill_color = gst_video_mixer_fill_color_rgbx; ret = TRUE; break; case GST_VIDEO_FORMAT_BGRx: mixer->blend = gst_video_mixer_blend_bgrx; mixer->overlay = mixer->blend; mixer->fill_checker = gst_video_mixer_fill_checker_bgrx; mixer->fill_color = gst_video_mixer_fill_color_bgrx; ret = TRUE; break; default: break; } done: gst_object_unref (mixer); return ret; } static GstPad * gst_videomixer_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstVideoMixer *mix = NULL; GstVideoMixerPad *mixpad = NULL; GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); g_return_val_if_fail (templ != NULL, NULL); if (G_UNLIKELY (templ->direction != GST_PAD_SINK)) { g_warning ("videomixer: request pad that is not a SINK pad"); return NULL; } g_return_val_if_fail (GST_IS_VIDEO_MIXER (element), NULL); mix = GST_VIDEO_MIXER (element); if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) { gint serial = 0; gchar *name = NULL; GstVideoMixerCollect *mixcol = NULL; GST_VIDEO_MIXER_STATE_LOCK (mix); if (req_name == NULL || strlen (req_name) < 6 || !g_str_has_prefix (req_name, "sink_")) { /* no name given when requesting the pad, use next available int */ serial = mix->next_sinkpad++; } else { /* parse serial number from requested padname */ serial = atoi (&req_name[5]); if (serial >= mix->next_sinkpad) mix->next_sinkpad = serial + 1; } /* create new pad with the name */ name = g_strdup_printf ("sink_%d", serial); mixpad = g_object_new (GST_TYPE_VIDEO_MIXER_PAD, "name", name, "direction", templ->direction, "template", templ, NULL); g_free (name); mixpad->zorder = mix->numpads; mixpad->xpos = DEFAULT_PAD_XPOS; mixpad->ypos = DEFAULT_PAD_YPOS; mixpad->alpha = DEFAULT_PAD_ALPHA; mixcol = (GstVideoMixerCollect *) gst_collect_pads_add_pad (mix->collect, GST_PAD (mixpad), sizeof (GstVideoMixerCollect)); /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events */ mix->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (GST_PAD (mixpad)); gst_pad_set_event_function (GST_PAD (mixpad), GST_DEBUG_FUNCPTR (gst_videomixer_sink_event)); /* Keep track of each other */ mixcol->mixpad = mixpad; mixpad->mixcol = mixcol; /* Keep an internal list of mixpads for zordering */ mix->sinkpads = g_slist_append (mix->sinkpads, mixpad); mix->numpads++; GST_VIDEO_MIXER_STATE_UNLOCK (mix); } else { g_warning ("videomixer: this is not our template!"); return NULL; } /* add the pad to the element */ gst_element_add_pad (element, GST_PAD (mixpad)); gst_child_proxy_child_added (GST_OBJECT (mix), GST_OBJECT (mixpad)); return GST_PAD (mixpad); } static void gst_videomixer_release_pad (GstElement * element, GstPad * pad) { GstVideoMixer *mix = NULL; GstVideoMixerPad *mixpad; mix = GST_VIDEO_MIXER (element); GST_VIDEO_MIXER_STATE_LOCK (mix); if (G_UNLIKELY (g_slist_find (mix->sinkpads, pad) == NULL)) { g_warning ("Unknown pad %s", GST_PAD_NAME (pad)); goto error; } mixpad = GST_VIDEO_MIXER_PAD (pad); mix->sinkpads = g_slist_remove (mix->sinkpads, pad); gst_videomixer_collect_free (mixpad->mixcol); gst_collect_pads_remove_pad (mix->collect, pad); gst_child_proxy_child_removed (GST_OBJECT (mix), GST_OBJECT (mixpad)); /* determine possibly new geometry and master */ gst_videomixer_set_master_geometry (mix); mix->numpads--; GST_VIDEO_MIXER_STATE_UNLOCK (mix); gst_element_remove_pad (element, pad); return; error: GST_VIDEO_MIXER_STATE_UNLOCK (mix); } static int pad_zorder_compare (const GstVideoMixerPad * pad1, const GstVideoMixerPad * pad2) { return pad1->zorder - pad2->zorder; } static void gst_videomixer_sort_pads (GstVideoMixer * mix) { mix->sinkpads = g_slist_sort (mix->sinkpads, (GCompareFunc) pad_zorder_compare); } /* try to get a buffer on all pads. As long as the queued value is * negative, we skip buffers */ static gboolean gst_videomixer_fill_queues (GstVideoMixer * mix) { GSList *walk = NULL; gboolean eos = TRUE; g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), FALSE); /* try to make sure we have a buffer from each usable pad first */ walk = mix->collect->data; while (walk) { GstCollectData *data = (GstCollectData *) walk->data; GstVideoMixerCollect *mixcol = (GstVideoMixerCollect *) data; GstVideoMixerPad *mixpad = mixcol->mixpad; walk = g_slist_next (walk); if (mixcol->buffer == NULL) { GstBuffer *buf = NULL; GST_LOG_OBJECT (mix, "we need a new buffer"); buf = gst_collect_pads_peek (mix->collect, data); if (buf) { guint64 duration; mixcol->buffer = buf; duration = GST_BUFFER_DURATION (mixcol->buffer); GST_LOG_OBJECT (mix, "we have a buffer with duration %" GST_TIME_FORMAT ", queued %" GST_TIME_FORMAT, GST_TIME_ARGS (duration), GST_TIME_ARGS (mixpad->queued)); /* no duration on the buffer, use the framerate */ if (!GST_CLOCK_TIME_IS_VALID (duration)) { if (mixpad->fps_n == 0) { duration = GST_CLOCK_TIME_NONE; } else { duration = gst_util_uint64_scale_int (GST_SECOND, mixpad->fps_d, mixpad->fps_n); } } if (GST_CLOCK_TIME_IS_VALID (duration)) mixpad->queued += duration; else if (!mixpad->queued) mixpad->queued = GST_CLOCK_TIME_NONE; GST_LOG_OBJECT (mix, "now queued: %" GST_TIME_FORMAT, GST_TIME_ARGS (mixpad->queued)); } else { GST_LOG_OBJECT (mix, "pop returned a NULL buffer"); } } if (mix->sendseg && (mixpad == mix->master)) { GstEvent *event; gint64 stop, start; GstSegment *segment = &data->segment; /* FIXME, use rate/applied_rate as set on all sinkpads. * - currently we just set rate as received from last seek-event * We could potentially figure out the duration as well using * the current segment positions and the stated stop positions. * Also we just start from stream time 0 which is rather * weird. For non-synchronized mixing, the time should be * the min of the stream times of all received segments, * rationale being that the duration is at least going to * be as long as the earliest stream we start mixing. This * would also be correct for synchronized mixing but then * the later streams would be delayed until the stream times * match. */ GST_INFO_OBJECT (mix, "_sending play segment"); start = segment->accum; /* get the duration of the segment if we can and add it to the accumulated * time on the segment. */ if (segment->stop != -1 && segment->start != -1) stop = start + (segment->stop - segment->start); else stop = -1; gst_segment_set_newsegment (&mix->segment, FALSE, segment->rate, segment->format, start, stop, start + mix->segment_position); event = gst_event_new_new_segment_full (FALSE, segment->rate, 1.0, segment->format, start, stop, start + mix->segment_position); gst_pad_push_event (mix->srcpad, event); mix->sendseg = FALSE; } if (mixcol->buffer != NULL && GST_CLOCK_TIME_IS_VALID (mixpad->queued)) { /* got a buffer somewhere so we're not eos */ eos = FALSE; } } return eos; } /* blend all buffers present on the pads */ static void gst_videomixer_blend_buffers (GstVideoMixer * mix, GstBuffer * outbuf) { GSList *walk; BlendFunction blend; if (mix->background == VIDEO_MIXER_BACKGROUND_TRANSPARENT) { blend = mix->overlay; } else { blend = mix->blend; } walk = mix->sinkpads; while (walk) { /* We walk with this list because it's ordered */ GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data); GstVideoMixerCollect *mixcol = pad->mixcol; walk = g_slist_next (walk); if (mixcol->buffer != NULL) { GstClockTime timestamp; gint64 stream_time; GstSegment *seg; seg = &mixcol->collect.segment; timestamp = GST_BUFFER_TIMESTAMP (mixcol->buffer); stream_time = gst_segment_to_stream_time (seg, GST_FORMAT_TIME, timestamp); /* sync object properties on stream time */ if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (pad), stream_time); blend (GST_BUFFER_DATA (mixcol->buffer), pad->xpos, pad->ypos, pad->in_width, pad->in_height, pad->alpha, GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height); } } } /* remove buffers from the queue that were expired in the * interval of the master, we also prepare the queued value * in the pad so that we can skip and fill buffers later on */ static void gst_videomixer_update_queues (GstVideoMixer * mix) { GSList *walk; gint64 interval; interval = mix->master->queued; if (interval <= 0) { if (mix->fps_n == 0) { interval = G_MAXINT64; } else { interval = gst_util_uint64_scale_int (GST_SECOND, mix->fps_d, mix->fps_n); } GST_LOG_OBJECT (mix, "set interval to %" G_GINT64_FORMAT " nanoseconds", interval); } walk = mix->sinkpads; while (walk) { GstVideoMixerPad *pad = GST_VIDEO_MIXER_PAD (walk->data); GstVideoMixerCollect *mixcol = pad->mixcol; walk = g_slist_next (walk); if (mixcol->buffer != NULL) { pad->queued -= interval; GST_LOG_OBJECT (pad, "queued now %" G_GINT64_FORMAT, pad->queued); if (pad->queued <= 0) { GstBuffer *buffer = gst_collect_pads_pop (mix->collect, &mixcol->collect); GST_LOG_OBJECT (pad, "unreffing buffer"); if (buffer) gst_buffer_unref (buffer); else GST_WARNING_OBJECT (pad, "Buffer was removed by GstCollectPads in the meantime"); gst_buffer_unref (mixcol->buffer); mixcol->buffer = NULL; } } } } static GstFlowReturn gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix) { GstFlowReturn ret = GST_FLOW_OK; GstBuffer *outbuf = NULL; size_t outsize = 0; gboolean eos = FALSE; GstClockTime timestamp = GST_CLOCK_TIME_NONE; GstClockTime duration = GST_CLOCK_TIME_NONE; g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), GST_FLOW_ERROR); /* This must be set, otherwise we have no caps */ if (G_UNLIKELY (mix->in_width == 0)) return GST_FLOW_NOT_NEGOTIATED; if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, FALSE)) { GST_DEBUG_OBJECT (mix, "pending flush stop"); gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); } GST_LOG_OBJECT (mix, "all pads are collected"); GST_VIDEO_MIXER_STATE_LOCK (mix); eos = gst_videomixer_fill_queues (mix); if (eos) { /* Push EOS downstream */ GST_LOG_OBJECT (mix, "all our sinkpads are EOS, pushing downstream"); gst_pad_push_event (mix->srcpad, gst_event_new_eos ()); ret = GST_FLOW_WRONG_STATE; goto error; } /* If geometry has changed we need to set new caps on the buffer */ if (mix->in_width != mix->out_width || mix->in_height != mix->out_height || mix->setcaps) { GstCaps *newcaps = NULL; newcaps = gst_caps_make_writable (gst_pad_get_negotiated_caps (GST_PAD (mix->master))); gst_caps_set_simple (newcaps, "width", G_TYPE_INT, mix->in_width, "height", G_TYPE_INT, mix->in_height, "pixel-aspect-ratio", GST_TYPE_FRACTION, mix->par_n, mix->par_d, NULL); mix->out_width = mix->in_width; mix->out_height = mix->in_height; mix->setcaps = FALSE; /* Calculating out buffer size from input size */ gst_pad_set_caps (mix->srcpad, newcaps); gst_caps_unref (newcaps); } /* Get timestamp & duration */ if (mix->master->mixcol->buffer != NULL) { GstClockTime in_ts; GstSegment *seg; GstVideoMixerCollect *mixcol = mix->master->mixcol; seg = &mixcol->collect.segment; in_ts = GST_BUFFER_TIMESTAMP (mixcol->buffer); timestamp = gst_segment_to_running_time (seg, GST_FORMAT_TIME, in_ts); duration = GST_BUFFER_DURATION (mixcol->buffer); mix->last_ts = timestamp; mix->last_duration = duration; } else { timestamp = mix->last_ts; duration = mix->last_duration; } if (GST_CLOCK_TIME_IS_VALID (duration)) mix->last_ts += duration; if (!gst_videomixer_do_qos (mix, timestamp)) { gst_videomixer_update_queues (mix); GST_VIDEO_MIXER_STATE_UNLOCK (mix); ret = GST_FLOW_OK; goto beach; } /* allocate an output buffer */ outsize = gst_video_format_get_size (mix->fmt, mix->out_width, mix->out_height); ret = gst_pad_alloc_buffer_and_set_caps (mix->srcpad, GST_BUFFER_OFFSET_NONE, outsize, GST_PAD_CAPS (mix->srcpad), &outbuf); /* This must be set at this point, otherwise we have no src caps */ g_assert (mix->blend != NULL); if (ret != GST_FLOW_OK) { goto error; } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; switch (mix->background) { case VIDEO_MIXER_BACKGROUND_CHECKER: mix->fill_checker (GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height); break; case VIDEO_MIXER_BACKGROUND_BLACK: mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height, 16, 128, 128); break; case VIDEO_MIXER_BACKGROUND_WHITE: mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height, 240, 128, 128); break; case VIDEO_MIXER_BACKGROUND_TRANSPARENT: orc_memset (GST_BUFFER_DATA (outbuf), 0, gst_video_format_get_row_stride (mix->fmt, 0, mix->out_width) * mix->out_height); break; } gst_videomixer_blend_buffers (mix, outbuf); gst_videomixer_update_queues (mix); GST_VIDEO_MIXER_STATE_UNLOCK (mix); ret = gst_pad_push (mix->srcpad, outbuf); beach: return ret; /* ERRORS */ error: { if (outbuf) gst_buffer_unref (outbuf); GST_VIDEO_MIXER_STATE_UNLOCK (mix); goto beach; } } static gboolean forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) { gst_event_ref (event); GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); if (!gst_pad_push_event (pad, event)) { g_value_set_boolean (ret, FALSE); GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", event, GST_EVENT_TYPE_NAME (event)); } else { GST_LOG_OBJECT (pad, "Sent event %p (%s).", event, GST_EVENT_TYPE_NAME (event)); } gst_object_unref (pad); return TRUE; } /* forwards the event to all sinkpads, takes ownership of the * event * * Returns: TRUE if the event could be forwarded on all * sinkpads. */ static gboolean forward_event (GstVideoMixer * mix, GstEvent * event) { GstIterator *it; GValue vret = { 0 }; GST_LOG_OBJECT (mix, "Forwarding event %p (%s)", event, GST_EVENT_TYPE_NAME (event)); g_value_init (&vret, G_TYPE_BOOLEAN); g_value_set_boolean (&vret, TRUE); it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (mix)); gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, event); gst_iterator_free (it); gst_event_unref (event); return g_value_get_boolean (&vret); } static gboolean gst_videomixer_src_event (GstPad * pad, GstEvent * event) { GstVideoMixer *mix = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); gboolean result; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS:{ GstClockTimeDiff diff; GstClockTime timestamp; gdouble proportion; gst_event_parse_qos (event, &proportion, &diff, ×tamp); gst_videomixer_update_qos (mix, proportion, diff, timestamp); gst_event_unref (event); /* TODO: The QoS event should be transformed and send upstream */ result = TRUE; break; } case GST_EVENT_SEEK: { GstSeekFlags flags; GstSeekType curtype; gint64 cur; /* parse the seek parameters */ gst_event_parse_seek (event, NULL, NULL, &flags, &curtype, &cur, NULL, NULL); /* check if we are flushing */ if (flags & GST_SEEK_FLAG_FLUSH) { /* make sure we accept nothing anymore and return WRONG_STATE */ gst_collect_pads_set_flushing (mix->collect, TRUE); /* flushing seek, start flush downstream, the flush will be done * when all pads received a FLUSH_STOP. */ gst_pad_push_event (mix->srcpad, gst_event_new_flush_start ()); } /* now wait for the collected to be finished and mark a new * segment */ GST_OBJECT_LOCK (mix->collect); if (curtype == GST_SEEK_TYPE_SET) mix->segment_position = cur; else mix->segment_position = 0; mix->sendseg = TRUE; if (flags & GST_SEEK_FLAG_FLUSH) { gst_collect_pads_set_flushing (mix->collect, FALSE); /* we can't send FLUSH_STOP here since upstream could start pushing data * after we unlock mix->collect. * We set flush_stop_pending to TRUE instead and send FLUSH_STOP after * forwarding the seek upstream or from gst_videomixer_collected, * whichever happens first. */ mix->flush_stop_pending = TRUE; } GST_OBJECT_UNLOCK (mix->collect); gst_videomixer_reset_qos (mix); result = forward_event (mix, event); if (g_atomic_int_compare_and_exchange (&mix->flush_stop_pending, TRUE, FALSE)) { GST_DEBUG_OBJECT (mix, "pending flush stop"); gst_pad_push_event (mix->srcpad, gst_event_new_flush_stop ()); } break; } case GST_EVENT_NAVIGATION: /* navigation is rather pointless. */ result = FALSE; break; default: /* just forward the rest for now */ result = forward_event (mix, event); break; } gst_object_unref (mix); return result; } static gboolean gst_videomixer_sink_event (GstPad * pad, GstEvent * event) { GstVideoMixerPad *vpad = GST_VIDEO_MIXER_PAD (pad); GstVideoMixer *videomixer = GST_VIDEO_MIXER (gst_pad_get_parent (pad)); gboolean ret; GST_DEBUG_OBJECT (pad, "Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: /* mark a pending new segment. This event is synchronized * with the streaming thread so we can safely update the * variable without races. It's somewhat weird because we * assume the collectpads forwarded the FLUSH_STOP past us * and downstream (using our source pad, the bastard!). */ videomixer->sendseg = TRUE; videomixer->flush_stop_pending = FALSE; gst_videomixer_reset_qos (videomixer); /* Reset pad state after FLUSH_STOP */ if (vpad->mixcol->buffer) gst_buffer_unref (vpad->mixcol->buffer); vpad->mixcol->buffer = NULL; vpad->queued = 0; break; case GST_EVENT_NEWSEGMENT: if (!videomixer->master || vpad == videomixer->master) { videomixer->sendseg = TRUE; gst_videomixer_reset_qos (videomixer); } break; default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ ret = videomixer->collect_event (pad, event); gst_object_unref (videomixer); return ret; } static void gst_videomixer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoMixer *mix = GST_VIDEO_MIXER (object); switch (prop_id) { case PROP_BACKGROUND: g_value_set_enum (value, mix->background); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_videomixer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoMixer *mix = GST_VIDEO_MIXER (object); switch (prop_id) { case PROP_BACKGROUND: mix->background = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_videomixer_change_state (GstElement * element, GstStateChange transition) { GstVideoMixer *mix; GstStateChangeReturn ret; g_return_val_if_fail (GST_IS_VIDEO_MIXER (element), GST_STATE_CHANGE_FAILURE); mix = GST_VIDEO_MIXER (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: GST_LOG_OBJECT (mix, "starting collectpads"); gst_collect_pads_start (mix->collect); break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_LOG_OBJECT (mix, "stopping collectpads"); gst_collect_pads_stop (mix->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_videomixer_reset (mix); break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_videomixer_debug, "videomixer", 0, "video mixer"); gst_video_mixer_init_blend (); return gst_element_register (plugin, "videomixer", GST_RANK_PRIMARY, GST_TYPE_VIDEO_MIXER) && gst_videomixer2_register (plugin); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "videomixer", "Video mixer", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/icydemux/0000755000175000017500000000000011720565302014504 500000000000000gst-plugins-good-0.10.31/gst/icydemux/gsticydemux.c0000644000175000017500000004557311677341655017171 00000000000000/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ /* Copyright 2005 Jan Schmidt * 2006 Michael Smith * Copyright (C) 2003-2004 Benjamin Otte * * 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-icydemux * * icydemux accepts data streams with ICY metadata at known intervals, as * transmitted from an upstream element (usually read as response headers from * an HTTP stream). The mime type of the data between the tag blocks is * detected using typefind functions, and the appropriate output mime type set * on outgoing buffers. * * * Example launch line * |[ * gst-launch souphttpsrc location=http://some.server/ iradio-mode=true ! icydemux ! fakesink -t * ]| This pipeline should read any available ICY tag information and output it. * The contents of the stream should be detected, and the appropriate mime * type set on buffers produced from icydemux. (Using gnomevfssrc, neonhttpsrc * or giosrc instead of souphttpsrc should also work.) * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gsticydemux.h" #include #define ICY_TYPE_FIND_MAX_SIZE (40*1024) GST_DEBUG_CATEGORY_STATIC (icydemux_debug); #define GST_CAT_DEFAULT (icydemux_debug) static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-icy, metadata-interval = (int)[0, MAX]") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("ANY") ); static void gst_icydemux_class_init (GstICYDemuxClass * klass); static void gst_icydemux_base_init (GstICYDemuxClass * klass); static void gst_icydemux_init (GstICYDemux * icydemux); static void gst_icydemux_dispose (GObject * object); static GstFlowReturn gst_icydemux_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_icydemux_handle_event (GstPad * pad, GstEvent * event); static gboolean gst_icydemux_add_srcpad (GstICYDemux * icydemux, GstCaps * new_caps); static gboolean gst_icydemux_remove_srcpad (GstICYDemux * icydemux); static GstStateChangeReturn gst_icydemux_change_state (GstElement * element, GstStateChange transition); static gboolean gst_icydemux_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_icydemux_send_tag_event (GstICYDemux * icydemux, GstTagList * taglist); static GstElementClass *parent_class = NULL; GType gst_icydemux_get_type (void) { static GType plugin_type = 0; if (!plugin_type) { static const GTypeInfo plugin_info = { sizeof (GstICYDemuxClass), (GBaseInitFunc) gst_icydemux_base_init, NULL, (GClassInitFunc) gst_icydemux_class_init, NULL, NULL, sizeof (GstICYDemux), 0, (GInstanceInitFunc) gst_icydemux_init, }; plugin_type = g_type_register_static (GST_TYPE_ELEMENT, "GstICYDemux", &plugin_info, 0); } return plugin_type; } static void gst_icydemux_base_init (GstICYDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "ICY tag demuxer", "Codec/Demuxer/Metadata", "Read and output ICY tags while demuxing the contents", "Jan Schmidt , " "Michael Smith "); } static void gst_icydemux_class_init (GstICYDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->dispose = gst_icydemux_dispose; gstelement_class->change_state = gst_icydemux_change_state; } static void gst_icydemux_reset (GstICYDemux * icydemux) { /* Unknown at the moment (this is a fatal error if don't have a value by the * time we get to our chain function) */ icydemux->meta_interval = -1; icydemux->remaining = 0; icydemux->typefinding = TRUE; gst_caps_replace (&(icydemux->src_caps), NULL); gst_icydemux_remove_srcpad (icydemux); if (icydemux->cached_tags) { gst_tag_list_free (icydemux->cached_tags); icydemux->cached_tags = NULL; } if (icydemux->cached_events) { g_list_foreach (icydemux->cached_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (icydemux->cached_events); icydemux->cached_events = NULL; } if (icydemux->meta_adapter) { gst_adapter_clear (icydemux->meta_adapter); g_object_unref (icydemux->meta_adapter); icydemux->meta_adapter = NULL; } if (icydemux->typefind_buf) { gst_buffer_unref (icydemux->typefind_buf); icydemux->typefind_buf = NULL; } if (icydemux->content_type) { g_free (icydemux->content_type); icydemux->content_type = NULL; } } static void gst_icydemux_init (GstICYDemux * icydemux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (icydemux); icydemux->sinkpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); gst_pad_set_chain_function (icydemux->sinkpad, GST_DEBUG_FUNCPTR (gst_icydemux_chain)); gst_pad_set_event_function (icydemux->sinkpad, GST_DEBUG_FUNCPTR (gst_icydemux_handle_event)); gst_pad_set_setcaps_function (icydemux->sinkpad, GST_DEBUG_FUNCPTR (gst_icydemux_sink_setcaps)); gst_element_add_pad (GST_ELEMENT (icydemux), icydemux->sinkpad); gst_icydemux_reset (icydemux); } static gboolean gst_icydemux_sink_setcaps (GstPad * pad, GstCaps * caps) { GstICYDemux *icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad)); GstStructure *structure = gst_caps_get_structure (caps, 0); const gchar *tmp; if (!gst_structure_get_int (structure, "metadata-interval", &icydemux->meta_interval)) return FALSE; /* If incoming caps have the HTTP Content-Type, copy that over */ if ((tmp = gst_structure_get_string (structure, "content-type"))) icydemux->content_type = g_strdup (tmp); /* We have a meta interval, so initialise the rest */ icydemux->remaining = icydemux->meta_interval; icydemux->meta_remaining = 0; return TRUE; } static void gst_icydemux_dispose (GObject * object) { GstICYDemux *icydemux = GST_ICYDEMUX (object); gst_icydemux_reset (icydemux); G_OBJECT_CLASS (parent_class)->dispose (object); } static gboolean gst_icydemux_add_srcpad (GstICYDemux * icydemux, GstCaps * new_caps) { if (icydemux->src_caps == NULL || !gst_caps_is_equal (new_caps, icydemux->src_caps)) { gst_caps_replace (&(icydemux->src_caps), new_caps); if (icydemux->srcpad != NULL) { GST_DEBUG_OBJECT (icydemux, "Changing src pad caps to %" GST_PTR_FORMAT, icydemux->src_caps); gst_pad_set_caps (icydemux->srcpad, icydemux->src_caps); } } else { /* Caps never changed */ gst_caps_unref (new_caps); } if (icydemux->srcpad == NULL) { icydemux->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (icydemux), "src"), "src"); g_return_val_if_fail (icydemux->srcpad != NULL, FALSE); gst_pad_use_fixed_caps (icydemux->srcpad); if (icydemux->src_caps) gst_pad_set_caps (icydemux->srcpad, icydemux->src_caps); GST_DEBUG_OBJECT (icydemux, "Adding src pad with caps %" GST_PTR_FORMAT, icydemux->src_caps); gst_pad_set_active (icydemux->srcpad, TRUE); if (!(gst_element_add_pad (GST_ELEMENT (icydemux), icydemux->srcpad))) return FALSE; gst_element_no_more_pads (GST_ELEMENT (icydemux)); } return TRUE; } static gboolean gst_icydemux_remove_srcpad (GstICYDemux * icydemux) { gboolean res = TRUE; if (icydemux->srcpad != NULL) { res = gst_element_remove_pad (GST_ELEMENT (icydemux), icydemux->srcpad); g_return_val_if_fail (res != FALSE, FALSE); icydemux->srcpad = NULL; } return res; }; static gchar * gst_icydemux_unicodify (const gchar * str) { const gchar *env_vars[] = { "GST_ICY_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; return gst_tag_freeform_string_to_utf8 (str, -1, env_vars); } /* takes ownership of tag list */ static gboolean gst_icydemux_tag_found (GstICYDemux * icydemux, GstTagList * tags) { /* send the tag event if we have finished typefinding and have a src pad */ if (icydemux->srcpad) return gst_icydemux_send_tag_event (icydemux, tags); /* if we haven't a source pad yet, cache the tags */ if (!icydemux->cached_tags) { icydemux->cached_tags = tags; } else { gst_tag_list_insert (icydemux->cached_tags, tags, GST_TAG_MERGE_REPLACE_ALL); gst_tag_list_free (tags); } return TRUE; } static void gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux) { GstTagList *tags; const guint8 *data; int length, i; gchar *buffer; gchar **strings; length = gst_adapter_available (icydemux->meta_adapter); data = gst_adapter_peek (icydemux->meta_adapter, length); /* Now, copy this to a buffer where we can NULL-terminate it to make things * a bit easier, then do that parsing. */ buffer = g_strndup ((const gchar *) data, length); tags = gst_tag_list_new (); strings = g_strsplit (buffer, "';", 0); for (i = 0; strings[i]; i++) { if (!g_ascii_strncasecmp (strings[i], "StreamTitle=", 12)) { char *title = gst_icydemux_unicodify (strings[i] + 13); if (title && *title) { gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, title, NULL); g_free (title); } } else if (!g_ascii_strncasecmp (strings[i], "StreamUrl=", 10)) { char *url = gst_icydemux_unicodify (strings[i] + 11); if (url && *url) { gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_HOMEPAGE, url, NULL); g_free (url); } } } g_strfreev (strings); g_free (buffer); gst_adapter_clear (icydemux->meta_adapter); if (!gst_tag_list_is_empty (tags)) gst_icydemux_tag_found (icydemux, tags); else gst_tag_list_free (tags); } static gboolean gst_icydemux_handle_event (GstPad * pad, GstEvent * event) { GstICYDemux *icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad)); gboolean result; if (GST_EVENT_TYPE (event) == GST_EVENT_TAG) { GstTagList *tags; gst_event_parse_tag (event, &tags); result = gst_icydemux_tag_found (icydemux, gst_tag_list_copy (tags)); gst_event_unref (event); return result; } if (icydemux->typefinding) { switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: g_list_foreach (icydemux->cached_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (icydemux->cached_events); icydemux->cached_events = NULL; return gst_pad_event_default (pad, event); default: icydemux->cached_events = g_list_append (icydemux->cached_events, event); return TRUE; } } else { return gst_pad_event_default (pad, event); } } static void gst_icydemux_send_cached_events (GstICYDemux * icydemux) { GList *l; for (l = icydemux->cached_events; l != NULL; l = l->next) { GstEvent *event = GST_EVENT (l->data); gst_pad_push_event (icydemux->srcpad, event); } g_list_free (icydemux->cached_events); icydemux->cached_events = NULL; } static GstFlowReturn gst_icydemux_typefind_or_forward (GstICYDemux * icydemux, GstBuffer * buf) { if (icydemux->typefinding) { GstBuffer *tf_buf; GstCaps *caps = NULL; GstTypeFindProbability prob; /* If we have a content-type from upstream, let's see if we can shortcut * typefinding */ if (G_UNLIKELY (icydemux->content_type)) { if (!g_ascii_strcasecmp (icydemux->content_type, "video/nsv")) { GST_DEBUG ("We have a NSV stream"); caps = gst_caps_new_simple ("video/x-nsv", NULL); } else { GST_DEBUG ("Upstream Content-Type isn't supported"); g_free (icydemux->content_type); icydemux->content_type = NULL; } } if (icydemux->typefind_buf) { icydemux->typefind_buf = gst_buffer_join (icydemux->typefind_buf, buf); } else { icydemux->typefind_buf = buf; } /* Only typefind if we haven't already got some caps */ if (caps == NULL) { caps = gst_type_find_helper_for_buffer (GST_OBJECT (icydemux), icydemux->typefind_buf, &prob); if (caps == NULL) { if (GST_BUFFER_SIZE (icydemux->typefind_buf) < ICY_TYPE_FIND_MAX_SIZE) { /* Just break for more data */ return GST_FLOW_OK; } /* We failed typefind */ GST_ELEMENT_ERROR (icydemux, STREAM, TYPE_NOT_FOUND, (NULL), ("No caps found for contents within an ICY stream")); gst_buffer_unref (icydemux->typefind_buf); icydemux->typefind_buf = NULL; return GST_FLOW_ERROR; } } if (!gst_icydemux_add_srcpad (icydemux, caps)) { GST_DEBUG_OBJECT (icydemux, "Failed to add srcpad"); gst_caps_unref (caps); gst_buffer_unref (icydemux->typefind_buf); icydemux->typefind_buf = NULL; return GST_FLOW_ERROR; } gst_caps_unref (caps); if (icydemux->cached_events) { gst_icydemux_send_cached_events (icydemux); } if (icydemux->cached_tags) { gst_icydemux_send_tag_event (icydemux, icydemux->cached_tags); icydemux->cached_tags = NULL; } /* Move onto streaming: call ourselves recursively with the typefind buffer * to get that forwarded. */ icydemux->typefinding = FALSE; tf_buf = icydemux->typefind_buf; icydemux->typefind_buf = NULL; return gst_icydemux_typefind_or_forward (icydemux, tf_buf); } else { if (G_UNLIKELY (icydemux->srcpad == NULL)) { gst_buffer_unref (buf); return GST_FLOW_ERROR; } buf = gst_buffer_make_metadata_writable (buf); gst_buffer_set_caps (buf, icydemux->src_caps); /* Most things don't care, and it's a pain to track (we should preserve a * 0 offset on the first buffer though if it's there, for id3demux etc.) */ if (GST_BUFFER_OFFSET (buf) != 0) { GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE; } return gst_pad_push (icydemux->srcpad, buf); } } static void gst_icydemux_add_meta (GstICYDemux * icydemux, GstBuffer * buf) { if (!icydemux->meta_adapter) icydemux->meta_adapter = gst_adapter_new (); gst_adapter_push (icydemux->meta_adapter, buf); } static GstFlowReturn gst_icydemux_chain (GstPad * pad, GstBuffer * buf) { GstICYDemux *icydemux; guint size, chunk, offset; GstBuffer *sub; GstFlowReturn ret = GST_FLOW_OK; icydemux = GST_ICYDEMUX (GST_PAD_PARENT (pad)); if (G_UNLIKELY (icydemux->meta_interval < 0)) goto not_negotiated; if (icydemux->meta_interval == 0) { ret = gst_icydemux_typefind_or_forward (icydemux, buf); goto done; } /* Go through the buffer, chopping it into appropriate chunks. Forward as * tags or buffers, as appropriate */ size = GST_BUFFER_SIZE (buf); offset = 0; while (size) { if (icydemux->remaining) { chunk = (size <= icydemux->remaining) ? size : icydemux->remaining; sub = gst_buffer_create_sub (buf, offset, chunk); offset += chunk; icydemux->remaining -= chunk; size -= chunk; /* This buffer goes onto typefinding, and/or directly pushed out */ ret = gst_icydemux_typefind_or_forward (icydemux, sub); if (ret != GST_FLOW_OK) goto done; } else if (icydemux->meta_remaining) { chunk = (size <= icydemux->meta_remaining) ? size : icydemux->meta_remaining; sub = gst_buffer_create_sub (buf, offset, chunk); gst_icydemux_add_meta (icydemux, sub); offset += chunk; icydemux->meta_remaining -= chunk; size -= chunk; if (icydemux->meta_remaining == 0) { /* Parse tags from meta_adapter, send off as tag messages */ GST_DEBUG_OBJECT (icydemux, "No remaining metadata, parsing for tags"); gst_icydemux_parse_and_send_tags (icydemux); icydemux->remaining = icydemux->meta_interval; } } else { /* We need to read a single byte (always safe at this point in the loop) * to figure out how many bytes of metadata exist. * The 'spec' tells us to read 16 * (byte_value) bytes of metadata after * this (zero is common, and means the metadata hasn't changed). */ icydemux->meta_remaining = 16 * GST_BUFFER_DATA (buf)[offset]; if (icydemux->meta_remaining == 0) icydemux->remaining = icydemux->meta_interval; offset += 1; size -= 1; } } done: gst_buffer_unref (buf); return ret; /* ERRORS */ not_negotiated: { GST_WARNING_OBJECT (icydemux, "meta_interval not set, buffer probably had " "no caps set. Try enabling iradio-mode on the http source element"); gst_buffer_unref (buf); return GST_FLOW_NOT_NEGOTIATED; } } static GstStateChangeReturn gst_icydemux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstICYDemux *icydemux = GST_ICYDEMUX (element); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_icydemux_reset (icydemux); break; default: break; } return ret; } /* takes ownership of tag list */ static gboolean gst_icydemux_send_tag_event (GstICYDemux * icydemux, GstTagList * tags) { GstEvent *event; gst_element_post_message (GST_ELEMENT (icydemux), gst_message_new_tag (GST_OBJECT (icydemux), gst_tag_list_copy (tags))); event = gst_event_new_tag (tags); GST_EVENT_TIMESTAMP (event) = 0; GST_DEBUG_OBJECT (icydemux, "Sending tag event on src pad"); return gst_pad_push_event (icydemux->srcpad, event); } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (icydemux_debug, "icydemux", 0, "GStreamer ICY tag demuxer"); return gst_element_register (plugin, "icydemux", GST_RANK_PRIMARY, GST_TYPE_ICYDEMUX); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "icydemux", "Demux ICY tags from a stream", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/icydemux/Makefile.am0000644000175000017500000000166111671175353016474 00000000000000plugin_LTLIBRARIES = libgsticydemux.la libgsticydemux_la_SOURCES = gsticydemux.c libgsticydemux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgsticydemux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) libgsticydemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsticydemux_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsticydemux.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgsticydemux -:SHARED libgsticydemux \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgsticydemux_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsticydemux_la_CFLAGS) \ -:LDFLAGS $(libgsticydemux_la_LDFLAGS) \ $(libgsticydemux_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/icydemux/gsticydemux.h0000644000175000017500000000473211671175353017160 00000000000000/* Copyright 2005 Jan Schmidt * 2006 Michael Smith * Copyright (C) 2003-2004 Benjamin Otte * * 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_ICYDEMUX_H__ #define __GST_ICYDEMUX_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_ICYDEMUX \ (gst_icydemux_get_type()) #define GST_ICYDEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ICYDEMUX,GstICYDemux)) #define GST_ICYDEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ICYDEMUX,GstICYDemuxClass)) #define GST_IS_ICYDEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ICYDEMUX)) #define GST_IS_ICYDEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ICYDEMUX)) typedef struct _GstICYDemux GstICYDemux; typedef struct _GstICYDemuxClass GstICYDemuxClass; struct _GstICYDemux { GstElement element; GstPad *sinkpad, *srcpad; /* Interval between metadata updates */ gint meta_interval; /* Remaining bytes until the next metadata update */ gint remaining; /* When 'remaining' is zero, this holds the number of bytes of metadata we * still need to read, or zero if we don't yet know (which means we need to * read one byte, after which we can initialise this properly) */ gint meta_remaining; /* Caps for the data enclosed */ GstCaps *src_caps; /* True if we're still typefinding */ gboolean typefinding; GstTagList *cached_tags; GList *cached_events; GstAdapter *meta_adapter; GstBuffer *typefind_buf; /* upstream HTTP Content-Type */ gchar *content_type; }; struct _GstICYDemuxClass { GstElementClass parent_class; }; GType gst_icydemux_get_type (void); G_END_DECLS #endif /* __GST_ICYDEMUX_H__ */ gst-plugins-good-0.10.31/gst/icydemux/Makefile.in0000644000175000017500000006662311720560232016503 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/icydemux DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgsticydemux_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgsticydemux_la_OBJECTS = libgsticydemux_la-gsticydemux.lo libgsticydemux_la_OBJECTS = $(am_libgsticydemux_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgsticydemux_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgsticydemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgsticydemux_la_CFLAGS) $(CFLAGS) \ $(libgsticydemux_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsticydemux_la_SOURCES) DIST_SOURCES = $(libgsticydemux_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgsticydemux.la libgsticydemux_la_SOURCES = gsticydemux.c libgsticydemux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgsticydemux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) libgsticydemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsticydemux_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsticydemux.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/icydemux/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/icydemux/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsticydemux.la: $(libgsticydemux_la_OBJECTS) $(libgsticydemux_la_DEPENDENCIES) $(EXTRA_libgsticydemux_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsticydemux_la_LINK) -rpath $(plugindir) $(libgsticydemux_la_OBJECTS) $(libgsticydemux_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsticydemux_la-gsticydemux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgsticydemux_la-gsticydemux.lo: gsticydemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsticydemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsticydemux_la_CFLAGS) $(CFLAGS) -MT libgsticydemux_la-gsticydemux.lo -MD -MP -MF $(DEPDIR)/libgsticydemux_la-gsticydemux.Tpo -c -o libgsticydemux_la-gsticydemux.lo `test -f 'gsticydemux.c' || echo '$(srcdir)/'`gsticydemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsticydemux_la-gsticydemux.Tpo $(DEPDIR)/libgsticydemux_la-gsticydemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsticydemux.c' object='libgsticydemux_la-gsticydemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsticydemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsticydemux_la_CFLAGS) $(CFLAGS) -c -o libgsticydemux_la-gsticydemux.lo `test -f 'gsticydemux.c' || echo '$(srcdir)/'`gsticydemux.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgsticydemux -:SHARED libgsticydemux \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgsticydemux_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsticydemux_la_CFLAGS) \ -:LDFLAGS $(libgsticydemux_la_LDFLAGS) \ $(libgsticydemux_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/monoscope/0000755000175000017500000000000011720565304014661 500000000000000gst-plugins-good-0.10.31/gst/monoscope/convolve.c0000644000175000017500000002366711671175353016624 00000000000000/* Karatsuba convolution * * Copyright (C) 1999 Ralph Loader * * 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. * * * Note: 7th December 2004: This file used to be licensed under the GPL, * but we got permission from Ralp Loader to relicense it to LGPL. * * $Id$ * */ /* The algorithm is based on the following. For the convolution of a pair * of pairs, (a,b) * (c,d) = (0, a.c, a.d+b.c, b.d), we can reduce the four * multiplications to three, by the formulae a.d+b.c = (a+b).(c+d) - a.c - * b.d. A similar relation enables us to compute a 2n by 2n convolution * using 3 n by n convolutions, and thus a 2^n by 2^n convolution using 3^n * multiplications (as opposed to the 4^n that the quadratic algorithm * takes. */ /* For large n, this is slower than the O(n log n) that the FFT method * takes, but we avoid using complex numbers, and we only have to compute * one convolution, as opposed to 3 FFTs. We have good locality-of- * reference as well, which will help on CPUs with tiny caches. */ /* E.g., for a 512 x 512 convolution, the FFT method takes 55 * 512 = 28160 * (real) multiplications, as opposed to 3^9 = 19683 for the Karatsuba * algorithm. We actually want 257 outputs of a 256 x 512 convolution; * that doesn't appear to give an easy advantage for the FFT algorithm, but * for the Karatsuba algorithm, it's easy to use two 256 x 256 * convolutions, taking 2 x 3^8 = 12312 multiplications. [This difference * is that the FFT method "wraps" the arrays, doing a 2^n x 2^n -> 2^n, * while the Karatsuba algorithm pads with zeros, doing 2^n x 2^n -> 2.2^n * - 1]. */ /* There's a big lie above, actually... for a 4x4 convolution, it's quicker * to do it using 16 multiplications than the more complex Karatsuba * algorithm... So the recursion bottoms out at 4x4s. This increases the * number of multiplications by a factor of 16/9, but reduces the overheads * dramatically. */ /* The convolution algorithm is implemented as a stack machine. We have a * stack of commands, each in one of the forms "do a 2^n x 2^n * convolution", or "combine these three length 2^n outputs into one * 2^{n+1} output." */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "convolve.h" typedef union stack_entry_s { struct { const double *left, *right; double *out; } v; struct { double *main, *null; } b; } stack_entry; #define STACK_SIZE (CONVOLVE_DEPTH * 3) struct _struct_convolve_state { double left[CONVOLVE_BIG]; double right[CONVOLVE_SMALL * 3]; double scratch[CONVOLVE_SMALL * 3]; stack_entry stack[STACK_SIZE + 1]; }; /* * Initialisation routine - sets up tables and space to work in. * Returns a pointer to internal state, to be used when performing calls. * On error, returns NULL. * The pointer should be freed when it is finished with, by convolve_close(). */ convolve_state * convolve_init (void) { return (convolve_state *) calloc (1, sizeof (convolve_state)); } /* * Free the state allocated with convolve_init(). */ void convolve_close (convolve_state * state) { free (state); } static void convolve_4 (double *out, const double *left, const double *right) /* This does a 4x4 -> 7 convolution. For what it's worth, the slightly odd * ordering gives about a 1% speed up on my Pentium II. */ { double l0, l1, l2, l3, r0, r1, r2, r3; double a; l0 = left[0]; r0 = right[0]; a = l0 * r0; l1 = left[1]; r1 = right[1]; out[0] = a; a = (l0 * r1) + (l1 * r0); l2 = left[2]; r2 = right[2]; out[1] = a; a = (l0 * r2) + (l1 * r1) + (l2 * r0); l3 = left[3]; r3 = right[3]; out[2] = a; out[3] = (l0 * r3) + (l1 * r2) + (l2 * r1) + (l3 * r0); out[4] = (l1 * r3) + (l2 * r2) + (l3 * r1); out[5] = (l2 * r3) + (l3 * r2); out[6] = l3 * r3; } static void convolve_run (stack_entry * top, unsigned size, double *scratch) /* Interpret a stack of commands. The stack starts with two entries; the * convolution to do, and an illegal entry used to mark the stack top. The * size is the number of entries in each input, and must be a power of 2, * and at least 8. It is OK to have out equal to left and/or right. * scratch must have length 3*size. The number of stack entries needed is * 3n-4 where size=2^n. */ { do { const double *left; const double *right; double *out; /* When we get here, the stack top is always a convolve, * with size > 4. So we will split it. We repeatedly split * the top entry until we get to size = 4. */ left = top->v.left; right = top->v.right; out = top->v.out; top++; do { double *s_left, *s_right; int i; /* Halve the size. */ size >>= 1; /* Allocate the scratch areas. */ s_left = scratch + size * 3; /* s_right is a length 2*size buffer also used for * intermediate output. */ s_right = scratch + size * 4; /* Create the intermediate factors. */ for (i = 0; i < size; i++) { double l = left[i] + left[i + size]; double r = right[i] + right[i + size]; s_left[i + size] = r; s_left[i] = l; } /* Push the combine entry onto the stack. */ top -= 3; top[2].b.main = out; top[2].b.null = NULL; /* Push the low entry onto the stack. This must be * the last of the three sub-convolutions, because * it may overwrite the arguments. */ top[1].v.left = left; top[1].v.right = right; top[1].v.out = out; /* Push the mid entry onto the stack. */ top[0].v.left = s_left; top[0].v.right = s_right; top[0].v.out = s_right; /* Leave the high entry in variables. */ left += size; right += size; out += size * 2; } while (size > 4); /* When we get here, the stack top is a group of 3 * convolves, with size = 4, followed by some combines. */ convolve_4 (out, left, right); convolve_4 (top[0].v.out, top[0].v.left, top[0].v.right); convolve_4 (top[1].v.out, top[1].v.left, top[1].v.right); top += 2; /* Now process combines. */ do { /* b.main is the output buffer, mid is the middle * part which needs to be adjusted in place, and * then folded back into the output. We do this in * a slightly strange way, so as to avoid having * two loops. */ double *out = top->b.main; double *mid = scratch + size * 4; unsigned int i; top++; out[size * 2 - 1] = 0; for (i = 0; i < size - 1; i++) { double lo; double hi; lo = mid[0] - (out[0] + out[2 * size]) + out[size]; hi = mid[size] - (out[size] + out[3 * size]) + out[2 * size]; out[size] = lo; out[2 * size] = hi; out++; mid++; } size <<= 1; } while (top->b.null == NULL); } while (top->b.main != NULL); } int convolve_match (const int *lastchoice, const short *input, convolve_state * state) /* lastchoice is a 256 sized array. input is a 512 array. We find the * contiguous length 256 sub-array of input that best matches lastchoice. * A measure of how good a sub-array is compared with the lastchoice is * given by the sum of the products of each pair of entries. We maximise * that, by taking an appropriate convolution, and then finding the maximum * entry in the convolutions. state is a (non-NULL) pointer returned by * convolve_init. */ { double avg; double best; int p = 0; int i; double *left = state->left; double *right = state->right; double *scratch = state->scratch; stack_entry *top = state->stack + (STACK_SIZE - 1); #if 1 for (i = 0; i < 512; i++) left[i] = input[i]; avg = 0; for (i = 0; i < 256; i++) { double a = lastchoice[255 - i]; right[i] = a; avg += a; } #endif /* We adjust the smaller of the two input arrays to have average * value 0. This makes the eventual result insensitive to both * constant offsets and positive multipliers of the inputs. */ avg /= 256; for (i = 0; i < 256; i++) right[i] -= avg; /* End-of-stack marker. */ top[1].b.null = scratch; top[1].b.main = NULL; /* The low 256x256, of which we want the high 256 outputs. */ top->v.left = left; top->v.right = right; top->v.out = right + 256; convolve_run (top, 256, scratch); /* The high 256x256, of which we want the low 256 outputs. */ top->v.left = left + 256; top->v.right = right; top->v.out = right; convolve_run (top, 256, scratch); /* Now find the best position amoungs this. Apart from the first * and last, the required convolution outputs are formed by adding * outputs from the two convolutions above. */ best = right[511]; right[767] = 0; p = -1; for (i = 0; i < 256; i++) { double a = right[i] + right[i + 512]; if (a > best) { best = a; p = i; } } p++; #if 0 { /* This is some debugging code... */ int bad = 0; best = 0; for (i = 0; i < 256; i++) best += ((double) input[i + p]) * ((double) lastchoice[i] - avg); for (i = 0; i < 257; i++) { double tot = 0; unsigned int j; for (j = 0; j < 256; j++) tot += ((double) input[i + j]) * ((double) lastchoice[j] - avg); if (tot > best) printf ("(%i)", i); if (tot != left[i + 255]) printf ("!"); } printf ("%i\n", p); } #endif return p; } gst-plugins-good-0.10.31/gst/monoscope/convolve.h0000644000175000017500000000322011671175353016610 00000000000000/* convolve.h: Header for convolutions. * * Copyright (C) 1999 Ralph Loader * * 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. * * * Note: 7th December 2004: This file used to be licensed under the GPL, * but we got permission from Ralp Loader to relicense it to LGPL. * * */ #ifndef CONVOLVE_H #define CONVOLVE_H #ifdef __cplusplus extern "C" { #endif /* convolve_match takes two blocks, one twice the size of the other. The * sizes of these are CONVOLVE_BIG and CONVOLVE_SMALL respectively. */ #define CONVOLVE_DEPTH 8 #define CONVOLVE_SMALL (1 << CONVOLVE_DEPTH) #define CONVOLVE_BIG (CONVOLVE_SMALL * 2) /* Convolution stuff */ typedef struct _struct_convolve_state convolve_state; convolve_state *convolve_init (void); void convolve_close (convolve_state * state); int convolve_match (const int * lastchoice, const short int * input, convolve_state * state); #ifdef __cplusplus } #endif #endif gst-plugins-good-0.10.31/gst/monoscope/Makefile.am0000644000175000017500000000165611671175353016653 00000000000000plugin_LTLIBRARIES = libgstmonoscope.la libgstmonoscope_la_SOURCES = gstmonoscope.c monoscope.c convolve.c noinst_HEADERS = gstmonoscope.h monoscope.h convolve.h libgstmonoscope_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) libgstmonoscope_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstmonoscope_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmonoscope_la_LIBTOOLFLAGS = --tag=disable-static Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmonoscope -:SHARED libgstmonoscope \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmonoscope_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmonoscope_la_CFLAGS) \ -:LDFLAGS $(libgstmonoscope_la_LDFLAGS) \ $(libgstmonoscope_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/monoscope/monoscope.c0000644000175000017500000001214411671175353016757 00000000000000/* monoscope.cpp * Copyright (C) 2002 Richard Boulton * Copyright (C) 1998-2001 Andy Lo A Foe * Original code by Tinic Uro * * This code is copied from Alsaplayer. The orginal code was by Tinic Uro and under * the BSD license without a advertisig clause. Andy Lo A Foe then relicensed the * code when he used it for Alsaplayer to GPL with Tinic's permission. Richard Boulton * then took this code and made a GPL plugin out of it. * * 7th December 2004 Christian Schaller: Richard Boulton and Andy Lo A Foe gave * permission to relicense their changes under BSD license so we where able to restore the * code to Tinic's original BSD license. * * This file is under what is known as the BSD license: * * Redistribution and use in source and binary forms, with or without modification, i * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * 3. The name of the author may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "monoscope.h" #include #include static void colors_init (guint32 * colors) { int i; for (i = 0; i < 32; i++) { colors[i] = (i * 8 << 16) + (255 << 8); colors[i + 31] = (255 << 16) + (((31 - i) * 8) << 8); } colors[63] = (40 << 16) + (75 << 8); } struct monoscope_state * monoscope_init (guint32 resx, guint32 resy) { struct monoscope_state *stateptr; /* I didn't program monoscope to only do 256*128, but it works that way */ g_return_val_if_fail (resx == 256, 0); g_return_val_if_fail (resy == 128, 0); stateptr = calloc (1, sizeof (struct monoscope_state)); if (stateptr == 0) return 0; stateptr->cstate = convolve_init (); colors_init (stateptr->colors); return stateptr; } void monoscope_close (struct monoscope_state *stateptr) { convolve_close (stateptr->cstate); free (stateptr); } guint32 * monoscope_update (struct monoscope_state *stateptr, gint16 data[512]) { /* Note that CONVOLVE_BIG must == data size here, ie 512. */ /* Really, we want samples evenly spread over the available data. * Just taking a continuous chunk will do for now, though. */ int i; int foo; int bar; int h; guint32 *loc; int factor; int val; int max = 1; short *thisEq; memcpy (stateptr->copyEq, data, sizeof (short) * CONVOLVE_BIG); thisEq = stateptr->copyEq; #if 1 val = convolve_match (stateptr->avgEq, stateptr->copyEq, stateptr->cstate); thisEq += val; #endif memset (stateptr->display, 0, 256 * 128 * sizeof (guint32)); for (i = 0; i < 256; i++) { foo = thisEq[i] + (stateptr->avgEq[i] >> 1); stateptr->avgEq[i] = foo; if (foo < 0) foo = -foo; if (foo > max) max = foo; } stateptr->avgMax += max - (stateptr->avgMax >> 8); if (stateptr->avgMax < max) stateptr->avgMax = max; /* Avoid overflow */ factor = 0x7fffffff / stateptr->avgMax; /* Keep the scaling sensible. */ if (factor > (1 << 18)) factor = 1 << 18; if (factor < (1 << 8)) factor = 1 << 8; for (i = 0; i < 256; i++) { foo = stateptr->avgEq[i] * factor; foo >>= 18; if (foo > 63) foo = 63; if (foo < -63) foo = -63; val = (i + ((foo + 64) << 8)); bar = val; if ((bar > 0) && (bar < (256 * 128))) { loc = stateptr->display + bar; if (foo < 0) { for (h = 0; h <= (-foo); h++) { *loc = stateptr->colors[h]; loc += 256; } } else { for (h = 0; h <= foo; h++) { *loc = stateptr->colors[h]; loc -= 256; } } } } /* Draw grid. */ for (i = 16; i < 128; i += 16) { for (h = 0; h < 256; h += 2) { stateptr->display[(i << 8) + h] = stateptr->colors[63]; if (i == 64) stateptr->display[(i << 8) + h + 1] = stateptr->colors[63]; } } for (i = 16; i < 256; i += 16) { for (h = 0; h < 128; h += 2) { stateptr->display[i + (h << 8)] = stateptr->colors[63]; } } return stateptr->display; } gst-plugins-good-0.10.31/gst/monoscope/gstmonoscope.h0000644000175000017500000000507211671175353017504 00000000000000/* GStreamer monoscope visualisation element * Copyright (C) <2002> Richard Boulton * Copyright (C) <2006> Tim-Philipp Müller * Copyright (C) <2006> Wim Taymans * * 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_MONOSCOPE__ #define __GST_MONOSCOPE__ G_BEGIN_DECLS #include #include #define GST_TYPE_MONOSCOPE (gst_monoscope_get_type()) #define GST_MONOSCOPE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MONOSCOPE,GstMonoscope)) #define GST_MONOSCOPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MONOSCOPE,GstMonoscopeClass)) #define GST_IS_MONOSCOPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MONOSCOPE)) #define GST_IS_MONOSCOPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MONOSCOPE)) typedef struct _GstMonoscope GstMonoscope; typedef struct _GstMonoscopeClass GstMonoscopeClass; struct _GstMonoscope { GstElement element; /* pads */ GstPad *sinkpad; GstPad *srcpad; GstAdapter *adapter; guint64 next_ts; /* expected timestamp of the next frame */ guint64 frame_duration; /* video frame duration */ gint rate; /* sample rate */ guint bps; /* bytes per sample */ guint spf; /* samples per video frame */ GstSegment segment; /* QoS stuff *//* with LOCK */ gdouble proportion; GstClockTime earliest_time; /* video state */ gint fps_num; gint fps_denom; gint width; gint height; guint outsize; /* visualisation state */ struct monoscope_state *visstate; }; struct _GstMonoscopeClass { GstElementClass parent_class; }; GType gst_monoscope_get_type (void); G_END_DECLS #endif /* __GST_MONOSCOPE__ */ gst-plugins-good-0.10.31/gst/monoscope/README0000644000175000017500000000076611671175353015500 00000000000000This is a visualization based on on the monoscope output plugin from alsaplayer. The monoscope convolution matching code was written by Ralph Loader. The monoscope.c and monoscope.h files are under the BSD license (without advertising clause). This implementation is taken from alsaplayer version 0.99.54, at http://www.alsaplayer.org/ Note: only one instance of this plugin may be created at a time: it has a lot of static data. This should be fixed (and it shouldn't be hard to do so, either). gst-plugins-good-0.10.31/gst/monoscope/gstmonoscope.c0000644000175000017500000004023011677341656017501 00000000000000/* gstmonoscope.c: implementation of monoscope drawing element * Copyright (C) <2002> Richard Boulton * Copyright (C) <2006> Tim-Philipp Müller * Copyright (C) <2006> Wim Taymans * * 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-monoscope * @see_also: goom * * Monoscope is an audio visualisation element. It creates a coloured * curve of the audio signal like on an oscilloscope. * * * Example launch line * |[ * gst-launch -v audiotestsrc ! audioconvert ! monoscope ! ffmpegcolorspace ! ximagesink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gstmonoscope.h" #include "monoscope.h" GST_DEBUG_CATEGORY_STATIC (monoscope_debug); #define GST_CAT_DEFAULT monoscope_debug #if G_BYTE_ORDER == G_BIG_ENDIAN static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-rgb, " "bpp = (int) 32, " "depth = (int) 24, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) " GST_VIDEO_BYTE2_MASK_32 ", " "green_mask = (int) " GST_VIDEO_BYTE3_MASK_32 ", " "blue_mask = (int) " GST_VIDEO_BYTE4_MASK_32 ", " "width = (int)256, " "height = (int)128, " "framerate = " GST_VIDEO_FPS_RANGE) ); #else static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-rgb, " "bpp = (int) 32, " "depth = (int) 24, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) " GST_VIDEO_BYTE3_MASK_32 ", " "green_mask = (int) " GST_VIDEO_BYTE2_MASK_32 ", " "blue_mask = (int) " GST_VIDEO_BYTE1_MASK_32 ", " "width = (int)256, " "height = (int)128, " "framerate = " GST_VIDEO_FPS_RANGE) ); #endif static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS) ); GST_BOILERPLATE (GstMonoscope, gst_monoscope, GstElement, GST_TYPE_ELEMENT); static void gst_monoscope_finalize (GObject * object); static GstFlowReturn gst_monoscope_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_monoscope_src_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_monoscope_sink_setcaps (GstPad * pad, GstCaps * caps); static void gst_monoscope_reset (GstMonoscope * monoscope); static gboolean gst_monoscope_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_monoscope_src_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_monoscope_change_state (GstElement * element, GstStateChange transition); static void gst_monoscope_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "Monoscope", "Visualization", "Displays a highly stabilised waveform of audio input", "Richard Boulton "); } static void gst_monoscope_class_init (GstMonoscopeClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_monoscope_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_monoscope_change_state); } static void gst_monoscope_init (GstMonoscope * monoscope, GstMonoscopeClass * klass) { monoscope->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_chain_function (monoscope->sinkpad, GST_DEBUG_FUNCPTR (gst_monoscope_chain)); gst_pad_set_event_function (monoscope->sinkpad, GST_DEBUG_FUNCPTR (gst_monoscope_sink_event)); gst_pad_set_setcaps_function (monoscope->sinkpad, GST_DEBUG_FUNCPTR (gst_monoscope_sink_setcaps)); gst_element_add_pad (GST_ELEMENT (monoscope), monoscope->sinkpad); monoscope->srcpad = gst_pad_new_from_static_template (&src_template, "src"); gst_pad_set_setcaps_function (monoscope->srcpad, GST_DEBUG_FUNCPTR (gst_monoscope_src_setcaps)); gst_pad_set_event_function (monoscope->srcpad, GST_DEBUG_FUNCPTR (gst_monoscope_src_event)); gst_element_add_pad (GST_ELEMENT (monoscope), monoscope->srcpad); monoscope->adapter = gst_adapter_new (); monoscope->next_ts = GST_CLOCK_TIME_NONE; monoscope->bps = sizeof (gint16); /* reset the initial video state */ monoscope->width = 256; monoscope->height = 128; monoscope->fps_num = 25; /* desired frame rate */ monoscope->fps_denom = 1; monoscope->visstate = NULL; /* reset the initial audio state */ monoscope->rate = GST_AUDIO_DEF_RATE; } static void gst_monoscope_finalize (GObject * object) { GstMonoscope *monoscope = GST_MONOSCOPE (object); if (monoscope->visstate) monoscope_close (monoscope->visstate); g_object_unref (monoscope->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_monoscope_reset (GstMonoscope * monoscope) { monoscope->next_ts = GST_CLOCK_TIME_NONE; gst_adapter_clear (monoscope->adapter); gst_segment_init (&monoscope->segment, GST_FORMAT_UNDEFINED); GST_OBJECT_LOCK (monoscope); monoscope->proportion = 1.0; monoscope->earliest_time = -1; GST_OBJECT_UNLOCK (monoscope); } static gboolean gst_monoscope_sink_setcaps (GstPad * pad, GstCaps * caps) { GstMonoscope *monoscope = GST_MONOSCOPE (GST_PAD_PARENT (pad)); GstStructure *structure; structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "rate", &monoscope->rate); GST_DEBUG_OBJECT (monoscope, "sample rate = %d", monoscope->rate); return TRUE; } static gboolean gst_monoscope_src_setcaps (GstPad * pad, GstCaps * caps) { GstMonoscope *monoscope = GST_MONOSCOPE (GST_PAD_PARENT (pad)); GstStructure *structure; structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &monoscope->width); gst_structure_get_int (structure, "height", &monoscope->height); gst_structure_get_fraction (structure, "framerate", &monoscope->fps_num, &monoscope->fps_denom); monoscope->outsize = monoscope->width * monoscope->height * 4; monoscope->frame_duration = gst_util_uint64_scale_int (GST_SECOND, monoscope->fps_denom, monoscope->fps_num); monoscope->spf = gst_util_uint64_scale_int (monoscope->rate, monoscope->fps_denom, monoscope->fps_num); GST_DEBUG_OBJECT (monoscope, "dimension %dx%d, framerate %d/%d, spf %d", monoscope->width, monoscope->height, monoscope->fps_num, monoscope->fps_denom, monoscope->spf); if (monoscope->visstate) { monoscope_close (monoscope->visstate); monoscope->visstate = NULL; } monoscope->visstate = monoscope_init (monoscope->width, monoscope->height); return (monoscope->visstate != NULL); } static gboolean gst_monoscope_src_negotiate (GstMonoscope * monoscope) { GstCaps *othercaps, *target; GstStructure *structure; const GstCaps *templ; templ = gst_pad_get_pad_template_caps (monoscope->srcpad); GST_DEBUG_OBJECT (monoscope, "performing negotiation"); /* see what the peer can do */ othercaps = gst_pad_peer_get_caps (monoscope->srcpad); if (othercaps) { target = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); if (gst_caps_is_empty (target)) goto no_format; gst_caps_truncate (target); } else { target = gst_caps_ref ((GstCaps *) templ); } structure = gst_caps_get_structure (target, 0); gst_structure_fixate_field_nearest_int (structure, "width", 320); gst_structure_fixate_field_nearest_int (structure, "height", 240); gst_structure_fixate_field_nearest_fraction (structure, "framerate", 25, 1); gst_pad_set_caps (monoscope->srcpad, target); gst_caps_unref (target); return TRUE; no_format: { gst_caps_unref (target); return FALSE; } } static GstFlowReturn get_buffer (GstMonoscope * monoscope, GstBuffer ** outbuf) { GstFlowReturn ret; if (GST_PAD_CAPS (monoscope->srcpad) == NULL) { if (!gst_monoscope_src_negotiate (monoscope)) return GST_FLOW_NOT_NEGOTIATED; } GST_LOG_OBJECT (monoscope, "allocating output buffer of size %d with caps %" GST_PTR_FORMAT, monoscope->outsize, GST_PAD_CAPS (monoscope->srcpad)); ret = gst_pad_alloc_buffer_and_set_caps (monoscope->srcpad, GST_BUFFER_OFFSET_NONE, monoscope->outsize, GST_PAD_CAPS (monoscope->srcpad), outbuf); if (ret != GST_FLOW_OK) return ret; if (*outbuf == NULL) return GST_FLOW_ERROR; return GST_FLOW_OK; } static GstFlowReturn gst_monoscope_chain (GstPad * pad, GstBuffer * inbuf) { GstFlowReturn flow_ret = GST_FLOW_OK; GstMonoscope *monoscope; monoscope = GST_MONOSCOPE (GST_PAD_PARENT (pad)); /* don't try to combine samples from discont buffer */ if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_DISCONT)) { gst_adapter_clear (monoscope->adapter); monoscope->next_ts = GST_CLOCK_TIME_NONE; } /* Match timestamps from the incoming audio */ if (GST_BUFFER_TIMESTAMP (inbuf) != GST_CLOCK_TIME_NONE) monoscope->next_ts = GST_BUFFER_TIMESTAMP (inbuf); GST_LOG_OBJECT (monoscope, "in buffer has %d samples, ts=%" GST_TIME_FORMAT, GST_BUFFER_SIZE (inbuf) / monoscope->bps, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (inbuf))); gst_adapter_push (monoscope->adapter, inbuf); inbuf = NULL; /* Collect samples until we have enough for an output frame */ while (flow_ret == GST_FLOW_OK) { gint16 *samples; GstBuffer *outbuf = NULL; guint32 *pixels, avail, bytesperframe; avail = gst_adapter_available (monoscope->adapter); GST_LOG_OBJECT (monoscope, "bytes avail now %u", avail); /* do negotiation if not done yet, so ->spf etc. is set */ if (GST_PAD_CAPS (monoscope->srcpad) == NULL) { flow_ret = get_buffer (monoscope, &outbuf); if (flow_ret != GST_FLOW_OK) goto out; gst_buffer_unref (outbuf); outbuf = NULL; } bytesperframe = monoscope->spf * monoscope->bps; if (avail < bytesperframe) break; /* FIXME: something is wrong with QoS, we are skipping way too much * stuff even with very low CPU loads */ #if 0 if (monoscope->next_ts != -1) { gboolean need_skip; gint64 qostime; qostime = gst_segment_to_running_time (&monoscope->segment, GST_FORMAT_TIME, monoscope->next_ts); GST_OBJECT_LOCK (monoscope); /* check for QoS, don't compute buffers that are known to be late */ need_skip = GST_CLOCK_TIME_IS_VALID (monoscope->earliest_time) && qostime <= monoscope->earliest_time; GST_OBJECT_UNLOCK (monoscope); if (need_skip) { GST_WARNING_OBJECT (monoscope, "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (monoscope->earliest_time)); goto skip; } } #endif samples = (gint16 *) gst_adapter_peek (monoscope->adapter, bytesperframe); if (monoscope->spf < 512) { gint16 in_data[512], i; for (i = 0; i < 512; ++i) { gdouble off; off = ((gdouble) i * (gdouble) monoscope->spf) / 512.0; in_data[i] = samples[MIN ((guint) off, monoscope->spf)]; } pixels = monoscope_update (monoscope->visstate, in_data); } else { /* not really correct, but looks much prettier */ pixels = monoscope_update (monoscope->visstate, samples); } flow_ret = get_buffer (monoscope, &outbuf); if (flow_ret != GST_FLOW_OK) goto out; memcpy (GST_BUFFER_DATA (outbuf), pixels, monoscope->outsize); GST_BUFFER_TIMESTAMP (outbuf) = monoscope->next_ts; GST_BUFFER_DURATION (outbuf) = monoscope->frame_duration; flow_ret = gst_pad_push (monoscope->srcpad, outbuf); #if 0 skip: #endif if (GST_CLOCK_TIME_IS_VALID (monoscope->next_ts)) monoscope->next_ts += monoscope->frame_duration; gst_adapter_flush (monoscope->adapter, bytesperframe); } out: return flow_ret; } static gboolean gst_monoscope_sink_event (GstPad * pad, GstEvent * event) { GstMonoscope *monoscope; gboolean res; monoscope = GST_MONOSCOPE (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: res = gst_pad_push_event (monoscope->srcpad, event); break; case GST_EVENT_FLUSH_STOP: gst_monoscope_reset (monoscope); res = gst_pad_push_event (monoscope->srcpad, event); break; case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time; gboolean update; /* the newsegment values are used to clip the input samples * and to convert the incomming timestamps to running time so * we can do QoS */ gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); /* now configure the values */ gst_segment_set_newsegment_full (&monoscope->segment, update, rate, arate, format, start, stop, time); res = gst_pad_push_event (monoscope->srcpad, event); break; } default: res = gst_pad_push_event (monoscope->srcpad, event); break; } gst_object_unref (monoscope); return res; } static gboolean gst_monoscope_src_event (GstPad * pad, GstEvent * event) { GstMonoscope *monoscope; gboolean res; monoscope = GST_MONOSCOPE (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS:{ gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; gst_event_parse_qos (event, &proportion, &diff, ×tamp); /* save stuff for the _chain() function */ GST_OBJECT_LOCK (monoscope); monoscope->proportion = proportion; if (diff >= 0) /* we're late, this is a good estimate for next displayable * frame (see part-qos.txt) */ monoscope->earliest_time = timestamp + 2 * diff + monoscope->frame_duration; else monoscope->earliest_time = timestamp + diff; GST_OBJECT_UNLOCK (monoscope); res = gst_pad_push_event (monoscope->sinkpad, event); break; } default: res = gst_pad_push_event (monoscope->sinkpad, event); break; } gst_object_unref (monoscope); return res; } static GstStateChangeReturn gst_monoscope_change_state (GstElement * element, GstStateChange transition) { GstMonoscope *monoscope = GST_MONOSCOPE (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_monoscope_reset (monoscope); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (monoscope_debug, "monoscope", 0, "monoscope element"); return gst_element_register (plugin, "monoscope", GST_RANK_NONE, GST_TYPE_MONOSCOPE); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "monoscope", "Monoscope visualization", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/monoscope/Makefile.in0000644000175000017500000007365411720560234016662 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/monoscope DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstmonoscope_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstmonoscope_la_OBJECTS = libgstmonoscope_la-gstmonoscope.lo \ libgstmonoscope_la-monoscope.lo libgstmonoscope_la-convolve.lo libgstmonoscope_la_OBJECTS = $(am_libgstmonoscope_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstmonoscope_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) \ $(libgstmonoscope_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstmonoscope_la_SOURCES) DIST_SOURCES = $(libgstmonoscope_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstmonoscope.la libgstmonoscope_la_SOURCES = gstmonoscope.c monoscope.c convolve.c noinst_HEADERS = gstmonoscope.h monoscope.h convolve.h libgstmonoscope_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) libgstmonoscope_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstmonoscope_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmonoscope_la_LIBTOOLFLAGS = --tag=disable-static all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/monoscope/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/monoscope/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstmonoscope.la: $(libgstmonoscope_la_OBJECTS) $(libgstmonoscope_la_DEPENDENCIES) $(EXTRA_libgstmonoscope_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstmonoscope_la_LINK) -rpath $(plugindir) $(libgstmonoscope_la_OBJECTS) $(libgstmonoscope_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmonoscope_la-convolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmonoscope_la-gstmonoscope.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmonoscope_la-monoscope.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstmonoscope_la-gstmonoscope.lo: gstmonoscope.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -MT libgstmonoscope_la-gstmonoscope.lo -MD -MP -MF $(DEPDIR)/libgstmonoscope_la-gstmonoscope.Tpo -c -o libgstmonoscope_la-gstmonoscope.lo `test -f 'gstmonoscope.c' || echo '$(srcdir)/'`gstmonoscope.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmonoscope_la-gstmonoscope.Tpo $(DEPDIR)/libgstmonoscope_la-gstmonoscope.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmonoscope.c' object='libgstmonoscope_la-gstmonoscope.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -c -o libgstmonoscope_la-gstmonoscope.lo `test -f 'gstmonoscope.c' || echo '$(srcdir)/'`gstmonoscope.c libgstmonoscope_la-monoscope.lo: monoscope.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -MT libgstmonoscope_la-monoscope.lo -MD -MP -MF $(DEPDIR)/libgstmonoscope_la-monoscope.Tpo -c -o libgstmonoscope_la-monoscope.lo `test -f 'monoscope.c' || echo '$(srcdir)/'`monoscope.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmonoscope_la-monoscope.Tpo $(DEPDIR)/libgstmonoscope_la-monoscope.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='monoscope.c' object='libgstmonoscope_la-monoscope.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -c -o libgstmonoscope_la-monoscope.lo `test -f 'monoscope.c' || echo '$(srcdir)/'`monoscope.c libgstmonoscope_la-convolve.lo: convolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -MT libgstmonoscope_la-convolve.lo -MD -MP -MF $(DEPDIR)/libgstmonoscope_la-convolve.Tpo -c -o libgstmonoscope_la-convolve.lo `test -f 'convolve.c' || echo '$(srcdir)/'`convolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmonoscope_la-convolve.Tpo $(DEPDIR)/libgstmonoscope_la-convolve.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convolve.c' object='libgstmonoscope_la-convolve.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmonoscope_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmonoscope_la_CFLAGS) $(CFLAGS) -c -o libgstmonoscope_la-convolve.lo `test -f 'convolve.c' || echo '$(srcdir)/'`convolve.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmonoscope -:SHARED libgstmonoscope \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmonoscope_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmonoscope_la_CFLAGS) \ -:LDFLAGS $(libgstmonoscope_la_LDFLAGS) \ $(libgstmonoscope_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/monoscope/monoscope.h0000644000175000017500000000124711671175353016766 00000000000000#ifndef _MONOSCOPE_H #define _MONOSCOPE_H #include #include "convolve.h" #define scope_width 256 #define scope_height 128 struct monoscope_state { gint16 copyEq[CONVOLVE_BIG]; int avgEq[CONVOLVE_SMALL]; /* a running average of the last few. */ int avgMax; /* running average of max sample. */ guint32 display[(scope_width + 1) * (scope_height + 1)]; convolve_state *cstate; guint32 colors[64]; }; struct monoscope_state * monoscope_init (guint32 resx, guint32 resy); guint32 * monoscope_update (struct monoscope_state * stateptr, gint16 data [512]); void monoscope_close (struct monoscope_state * stateptr); #endif gst-plugins-good-0.10.31/gst/isomp4/0000755000175000017500000000000011720565303014071 500000000000000gst-plugins-good-0.10.31/gst/isomp4/atomsrecovery.h0000644000175000017500000001303211671175353017072 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2010 Thiago Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __ATOMS_RECOVERY_H__ #define __ATOMS_RECOVERY_H__ #include #include #include #include #include "atoms.h" /* Version to be incremented each time we decide * to change the file layout */ #define ATOMS_RECOV_FILE_VERSION 1 #define ATOMS_RECOV_QUARK (g_quark_from_string ("qtmux-atoms-recovery")) /* gerror error codes */ #define ATOMS_RECOV_ERR_GENERIC 1 #define ATOMS_RECOV_ERR_FILE 2 #define ATOMS_RECOV_ERR_PARSING 3 #define ATOMS_RECOV_ERR_VERSION 4 /* this struct represents each buffer in a moov file, containing the info * that is placed in the stsd children atoms * Fields should be writen in BE order, and booleans should be writen as * 1byte with 0 for false, anything otherwise */ #define TRAK_BUFFER_ENTRY_INFO_SIZE 34 typedef struct { guint32 track_id; guint32 nsamples; guint32 delta; guint32 size; guint64 chunk_offset; guint64 pts_offset; gboolean sync; gboolean do_pts; } TrakBufferEntryInfo; typedef struct { guint32 trak_id; guint32 duration; /* duration in trak timescale */ guint32 timescale; /* trak's timescale */ guint64 file_offset; /* need for later updating duration */ guint64 tkhd_file_offset; guint64 mdhd_file_offset; /* need these offsets to update size */ guint32 trak_size; guint64 mdia_file_offset; guint32 mdia_size; guint64 minf_file_offset; guint32 minf_size; guint64 stbl_file_offset; guint32 stbl_size; guint64 post_stsd_offset; guint32 stsd_size; /* for storing the samples info */ AtomSTBL stbl; } TrakRecovData; typedef struct { FILE * file; gboolean rawfile; /* results from parsing the input file */ guint64 data_size; guint32 mdat_header_size; guint mdat_start; guint64 mdat_size; } MdatRecovFile; typedef struct { FILE * file; guint32 timescale; guint32 mvhd_pos; guint32 mvhd_size; guint32 prefix_size; /* prefix + ftyp total size */ gint num_traks; TrakRecovData *traks_rd; } MoovRecovFile; gboolean atoms_recov_write_trak_info (FILE * f, AtomTRAK * trak); gboolean atoms_recov_write_headers (FILE * f, AtomFTYP * ftyp, GstBuffer * prefix, AtomMOOV * moov, guint32 timescale, guint32 traks_number); gboolean atoms_recov_write_trak_samples (FILE * f, AtomTRAK * trak, guint32 nsamples, guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, gboolean do_pts, gint64 pts_offset); MdatRecovFile * mdat_recov_file_create (FILE * file, gboolean datafile, GError ** err); void mdat_recov_file_free (MdatRecovFile * mrf); MoovRecovFile * moov_recov_file_create (FILE * file, GError ** err); void moov_recov_file_free (MoovRecovFile * moovrf); gboolean moov_recov_parse_buffers (MoovRecovFile * moovrf, MdatRecovFile * mdatrf, GError ** err); gboolean moov_recov_write_file (MoovRecovFile * moovrf, MdatRecovFile * mdatrf, FILE * outf, GError ** err); #endif /* __ATOMS_RECOVERY_H__ */ gst-plugins-good-0.10.31/gst/isomp4/descriptors.h0000644000175000017500000001214111671175353016531 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008 Thiago Sousa Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __DESCRIPTORS_H__ #define __DESCRIPTORS_H__ #include #include #include "properties.h" /* * Tags for descriptor (each kind is represented by a number, instead of fourcc as in atoms) */ #define OBJECT_DESC_TAG 0x01 #define INIT_OBJECT_DESC_TAG 0x02 #define ES_DESCRIPTOR_TAG 0x03 #define DECODER_CONFIG_DESC_TAG 0x04 #define DECODER_SPECIFIC_INFO_TAG 0x05 #define SL_CONFIG_DESC_TAG 0x06 #define ES_ID_INC_TAG 0x0E #define MP4_INIT_OBJECT_DESC_TAG 0x10 #define ESDS_OBJECT_TYPE_MPEG1_P3 0x6B #define ESDS_OBJECT_TYPE_MPEG2_P7_MAIN 0x66 #define ESDS_OBJECT_TYPE_MPEG4_P7_LC 0x67 #define ESDS_OBJECT_TYPE_MPEG4_P7_SSR 0x68 #define ESDS_OBJECT_TYPE_MPEG4_P2 0x20 #define ESDS_OBJECT_TYPE_MPEG4_P3 0x40 #define ESDS_STREAM_TYPE_VISUAL 0x04 #define ESDS_STREAM_TYPE_AUDIO 0x05 typedef struct _BaseDescriptor { guint8 tag; /* the first bit of each byte indicates if the next byte should be used */ guint8 size[4]; } BaseDescriptor; typedef struct _SLConfigDescriptor { BaseDescriptor base; guint8 predefined; /* everything is supposed predefined */ } SLConfigDescriptor; typedef struct _DecoderSpecificInfoDescriptor { BaseDescriptor base; guint32 length; guint8 *data; } DecoderSpecificInfoDescriptor; typedef struct _DecoderConfigDescriptor { BaseDescriptor base; guint8 object_type; /* following are condensed into streamType: * bit(6) streamType; * bit(1) upStream; * const bit(1) reserved=1; */ guint8 stream_type; guint8 buffer_size_DB[3]; guint32 max_bitrate; guint32 avg_bitrate; DecoderSpecificInfoDescriptor *dec_specific_info; } DecoderConfigDescriptor; typedef struct _ESDescriptor { BaseDescriptor base; guint16 id; /* flags contains the following: * bit(1) streamDependenceFlag; * bit(1) URL_Flag; * bit(1) OCRstreamFlag; * bit(5) streamPriority; */ guint8 flags; guint16 depends_on_es_id; guint8 url_length; /* only if URL_flag is set */ guint8 *url_string; /* size is url_length */ guint16 ocr_es_id; /* only if OCRstreamFlag is set */ DecoderConfigDescriptor dec_conf_desc; SLConfigDescriptor sl_conf_desc; /* optional remainder of ESDescriptor is not used */ } ESDescriptor; /* --- FUNCTIONS --- */ void desc_es_init (ESDescriptor *es); ESDescriptor *desc_es_descriptor_new (void); guint64 desc_es_descriptor_copy_data (ESDescriptor *es, guint8 **buffer, guint64 *size, guint64 *offset); void desc_es_descriptor_clear (ESDescriptor *es); DecoderSpecificInfoDescriptor *desc_dec_specific_info_new(void); void desc_dec_specific_info_free (DecoderSpecificInfoDescriptor *dsid); void desc_dec_specific_info_alloc_data (DecoderSpecificInfoDescriptor *dsid, guint32 size); #endif /* __DESCRIPTORS_H__ */ gst-plugins-good-0.10.31/gst/isomp4/gstqtmux-doc.c0000644000175000017500000003701411671175353016630 00000000000000/* Quicktime muxer documentation * Copyright (C) 2008-2010 Thiago Santos * Copyright (C) 2008 Mark Nauwelaerts * Copyright (C) 2010 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ /* ============================= mp4mux ==================================== */ /** * SECTION:element-mp4mux * @short_description: Muxer for ISO MPEG-4 (.mp4) files * * This element merges streams (audio and video) into ISO MPEG-4 (.mp4) files. * * The following background intends to explain why various similar muxers * are present in this plugin. * * The * QuickTime file format specification served as basis for the MP4 file * format specification (mp4mux), and as such the QuickTime file structure is * nearly identical to the so-called ISO Base Media file format defined in * ISO 14496-12 (except for some media specific parts). * In turn, the latter ISO Base Media format was further specialized as a * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) * and in various 3GPP(2) specs (gppmux). * The fragmented file features defined (only) in ISO Base Media are used by * ISMV files making up (a.o.) Smooth Streaming (ismlmux). * * A few properties (movie-timescale, * trak-timescale) allow adjusting * some technical parameters, which might be useful in (rare) cases to resolve * compatibility issues in some situations. * * Some other properties influence the result more fundamentally. * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, * somewhat contrary to this usually being called "the header". * However, a faststart file will * (with some effort) arrange this to be located near start of the file, * which then allows it e.g. to be played while downloading. * Alternatively, rather than having one chunk of metadata at start (or end), * there can be some metadata at start and most of the other data can be spread * out into fragments of fragment-duration. * If such fragmented layout is intended for streaming purposes, then * streamable allows foregoing to add * index metadata (at the end of file). * * dts-method allows selecting a * method for managing input timestamps (stay tuned for 0.11 to have this * automagically settled). The default delta/duration method should handle nice * (aka perfect streams) just fine, but may experience problems otherwise * (e.g. input stream with re-ordered B-frames and/or with frame dropping). * The re-ordering approach re-assigns incoming timestamps in ascending order * to incoming buffers and offers an alternative in such cases. In cases where * that might fail, the remaining method can be tried, which is exact and * according to specs, but might experience playback on not so spec-wise players. * Note that this latter approach also requires one to enable * presentation-timestamp. * * * Example pipelines * |[ * gst-launch gst-launch v4l2src num-buffers=50 ! queue ! x264enc ! mp4mux ! filesink location=video.mp4 * ]| * Records a video stream captured from a v4l2 device, encodes it into H.264 * and muxes it into an mp4 file. * * * Documentation last reviewed on 2011-04-21 */ /* ============================= 3gppmux ==================================== */ /** * SECTION:element-3gppmux * @short_description: Muxer for 3GPP (.3gp) files * * This element merges streams (audio and video) into 3GPP (.3gp) files. * * The following background intends to explain why various similar muxers * are present in this plugin. * * The * QuickTime file format specification served as basis for the MP4 file * format specification (mp4mux), and as such the QuickTime file structure is * nearly identical to the so-called ISO Base Media file format defined in * ISO 14496-12 (except for some media specific parts). * In turn, the latter ISO Base Media format was further specialized as a * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) * and in various 3GPP(2) specs (gppmux). * The fragmented file features defined (only) in ISO Base Media are used by * ISMV files making up (a.o.) Smooth Streaming (ismlmux). * * A few properties (movie-timescale, * trak-timescale) allow adjusting * some technical parameters, which might be useful in (rare) cases to resolve * compatibility issues in some situations. * * Some other properties influence the result more fundamentally. * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, * somewhat contrary to this usually being called "the header". * However, a faststart file will * (with some effort) arrange this to be located near start of the file, * which then allows it e.g. to be played while downloading. * Alternatively, rather than having one chunk of metadata at start (or end), * there can be some metadata at start and most of the other data can be spread * out into fragments of fragment-duration. * If such fragmented layout is intended for streaming purposes, then * streamable allows foregoing to add * index metadata (at the end of file). * * dts-method allows selecting a * method for managing input timestamps (stay tuned for 0.11 to have this * automagically settled). The default delta/duration method should handle nice * (aka perfect streams) just fine, but may experience problems otherwise * (e.g. input stream with re-ordered B-frames and/or with frame dropping). * The re-ordering approach re-assigns incoming timestamps in ascending order * to incoming buffers and offers an alternative in such cases. In cases where * that might fail, the remaining method can be tried, which is exact and * according to specs, but might experience playback on not so spec-wise players. * Note that this latter approach also requires one to enable * presentation-timestamp. * * * Example pipelines * |[ * gst-launch v4l2src num-buffers=50 ! queue ! ffenc_h263 ! gppmux ! filesink location=video.3gp * ]| * Records a video stream captured from a v4l2 device, encodes it into H.263 * and muxes it into an 3gp file. * * * Documentation last reviewed on 2011-04-21 */ /* ============================= mj2pmux ==================================== */ /** * SECTION:element-mj2mux * @short_description: Muxer for Motion JPEG-2000 (.mj2) files * * This element merges streams (audio and video) into MJ2 (.mj2) files. * * The following background intends to explain why various similar muxers * are present in this plugin. * * The * QuickTime file format specification served as basis for the MP4 file * format specification (mp4mux), and as such the QuickTime file structure is * nearly identical to the so-called ISO Base Media file format defined in * ISO 14496-12 (except for some media specific parts). * In turn, the latter ISO Base Media format was further specialized as a * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) * and in various 3GPP(2) specs (gppmux). * The fragmented file features defined (only) in ISO Base Media are used by * ISMV files making up (a.o.) Smooth Streaming (ismlmux). * * A few properties (movie-timescale, * trak-timescale) allow adjusting * some technical parameters, which might be useful in (rare) cases to resolve * compatibility issues in some situations. * * Some other properties influence the result more fundamentally. * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, * somewhat contrary to this usually being called "the header". * However, a faststart file will * (with some effort) arrange this to be located near start of the file, * which then allows it e.g. to be played while downloading. * Alternatively, rather than having one chunk of metadata at start (or end), * there can be some metadata at start and most of the other data can be spread * out into fragments of fragment-duration. * If such fragmented layout is intended for streaming purposes, then * streamable allows foregoing to add * index metadata (at the end of file). * * dts-method allows selecting a * method for managing input timestamps (stay tuned for 0.11 to have this * automagically settled). The default delta/duration method should handle nice * (aka perfect streams) just fine, but may experience problems otherwise * (e.g. input stream with re-ordered B-frames and/or with frame dropping). * The re-ordering approach re-assigns incoming timestamps in ascending order * to incoming buffers and offers an alternative in such cases. In cases where * that might fail, the remaining method can be tried, which is exact and * according to specs, but might experience playback on not so spec-wise players. * Note that this latter approach also requires one to enable * presentation-timestamp. * * * Example pipelines * |[ * gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2 * ]| * Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 * and muxes it into an mj2 file. * * * Documentation last reviewed on 2011-04-21 */ /* ============================= ismlmux ==================================== */ /** * SECTION:element-ismlmux * @short_description: Muxer for ISML smooth streaming (.isml) files * * This element merges streams (audio and video) into MJ2 (.mj2) files. * * The following background intends to explain why various similar muxers * are present in this plugin. * * The * QuickTime file format specification served as basis for the MP4 file * format specification (mp4mux), and as such the QuickTime file structure is * nearly identical to the so-called ISO Base Media file format defined in * ISO 14496-12 (except for some media specific parts). * In turn, the latter ISO Base Media format was further specialized as a * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) * and in various 3GPP(2) specs (gppmux). * The fragmented file features defined (only) in ISO Base Media are used by * ISMV files making up (a.o.) Smooth Streaming (ismlmux). * * A few properties (movie-timescale, * trak-timescale) allow adjusting * some technical parameters, which might be useful in (rare) cases to resolve * compatibility issues in some situations. * * Some other properties influence the result more fundamentally. * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, * somewhat contrary to this usually being called "the header". * However, a faststart file will * (with some effort) arrange this to be located near start of the file, * which then allows it e.g. to be played while downloading. * Alternatively, rather than having one chunk of metadata at start (or end), * there can be some metadata at start and most of the other data can be spread * out into fragments of fragment-duration. * If such fragmented layout is intended for streaming purposes, then * streamable allows foregoing to add * index metadata (at the end of file). * * dts-method allows selecting a * method for managing input timestamps (stay tuned for 0.11 to have this * automagically settled). The default delta/duration method should handle nice * (aka perfect streams) just fine, but may experience problems otherwise * (e.g. input stream with re-ordered B-frames and/or with frame dropping). * The re-ordering approach re-assigns incoming timestamps in ascending order * to incoming buffers and offers an alternative in such cases. In cases where * that might fail, the remaining method can be tried, which is exact and * according to specs, but might experience playback on not so spec-wise players. * Note that this latter approach also requires one to enable * presentation-timestamp. * * * Example pipelines * |[ * gst-launch v4l2src num-buffers=50 ! queue ! jp2kenc ! mj2mux ! filesink location=video.mj2 * ]| * Records a video stream captured from a v4l2 device, encodes it into JPEG-2000 * and muxes it into an mj2 file. * * * Documentation last reviewed on 2011-04-21 */ gst-plugins-good-0.10.31/gst/isomp4/qtdemux_lang.c0000644000175000017500000001111211671175353016650 00000000000000/* GStreamer Quicktime/ISO demuxer language utility functions * Copyright (C) 2010 Tim-Philipp Müller * * 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 "qtdemux.h" #include "qtdemux_lang.h" #include /* http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap4/qtff4.html */ static const gchar qt_lang_map[][4] = { /* 000 English * 001 French * 002 German * 003 Italian * 004 Dutch * 005 Swedish * 006 Spanish * 007 Danish * 008 Portuguese * 009 Norwegian */ "eng", "fre", "deu", "ita", "nld", "swe", "spa", "dan", "por", "nor", /* 010 Hebrew * 011 Japanese * 012 Arabic * 013 Finnish * 014 Greek * 015 Icelandic * 016 Maltese * 017 Turkish * 018 Croatian * 019 Traditional Chinese (ISO 639-2 can't express script differences, so zho) */ "heb", "jpn", "ara", "fin", "ell", "isl", "mlt", "tur", "hrv", "zho", /* 020 Urdu * 021 Hindi * 022 Thai * 023 Korean * 024 Lithuanian * 025 Polish * 026 Hungarian * 027 Estonian * 028 Latvian / Lettish * 029 Lappish / Saamish (used code for Nothern Sami) */ "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "sme", /* 030 Faeroese * 031 Farsi * 032 Russian * 033 Simplified Chinese (ISO 639-2 can't express script differences, so zho) * 034 Flemish (no ISO 639-2 code, used Dutch code) * 035 Irish * 036 Albanian * 037 Romanian * 038 Czech * 039 Slovak */ "fao", "fas", "rus", "zho", "nld", "gle", "sqi", "ron", "ces", "slk", /* 040 Slovenian * 041 Yiddish * 042 Serbian * 043 Macedonian * 044 Bulgarian * 045 Ukrainian * 046 Byelorussian * 047 Uzbek * 048 Kazakh * 049 Azerbaijani */ "slv", "yid", "srp", "mkd", "bul", "ukr", "bel", "uzb", "kaz", "aze", /* 050 AzerbaijanAr (presumably script difference? used aze here) * 051 Armenian * 052 Georgian * 053 Moldavian * 054 Kirghiz * 055 Tajiki * 056 Turkmen * 057 Mongolian * 058 MongolianCyr (presumably script difference? used mon here) * 059 Pashto */ "aze", "hye", "kat", "mol", "kir", "tgk", "tuk", "mon", "mon", "pus", /* 060 Kurdish * 061 Kashmiri * 062 Sindhi * 063 Tibetan * 064 Nepali * 065 Sanskrit * 066 Marathi * 067 Bengali * 068 Assamese * 069 Gujarati */ "kur", "kas", "snd", "bod", "nep", "san", "mar", "ben", "asm", "guj", /* 070 Punjabi * 071 Oriya * 072 Malayalam * 073 Kannada * 074 Tamil * 075 Telugu * 076 Sinhalese * 077 Burmese * 078 Khmer * 079 Lao */ "pan", "ori", "mal", "kan", "tam", "tel", "sin", "mya", "khm", "lao", /* 080 Vietnamese * 081 Indonesian * 082 Tagalog * 083 MalayRoman * 084 MalayArabic * 085 Amharic * 087 Galla (same as Oromo?) * 087 Oromo * 088 Somali * 089 Swahili */ "vie", "ind", "tgl", "msa", "msa", "amh", "orm", "orm", "som", "swa", /* 090 Ruanda * 091 Rundi * 092 Chewa * 093 Malagasy * 094 Esperanto * 095 --- * 096 --- * 097 --- * 098 --- * 099 --- */ "kin", "run", "nya", "mlg", "ep", "und", "und", "und", "und", "und", /* 100-109 --- * 110-119 --- */ "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", "und", /* 120-127 --- * 128 Welsh * 129 Basque */ "und", "und", "und", "und", "und", "und", "und", "und", "cym", "eus", /* 130 Catalan * 131 Latin * 132 Quechua * 133 Guarani * 134 Aymara * 135 Tatar * 136 Uighur * 137 Dzongkha * 138 JavaneseRom */ "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav" }; /* map quicktime language code to ISO-639-2T id, returns "und" if unknown */ void qtdemux_lang_map_qt_code_to_iso (gchar id[4], guint16 qt_lang_code) { const gchar *iso_code; g_assert (qt_lang_code < 0x800); if (qt_lang_code < G_N_ELEMENTS (qt_lang_map)) iso_code = qt_lang_map[qt_lang_code]; else iso_code = "und"; GST_DEBUG ("mapped quicktime language code %u to ISO 639-2T code '%s'", qt_lang_code, iso_code); memcpy (id, iso_code, 4); g_assert (id[3] == '\0'); } gst-plugins-good-0.10.31/gst/isomp4/qtdemux.c0000644000175000017500000113251311677341655015667 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David A. Schleef * Copyright (C) <2006> Wim Taymans * Copyright (C) <2007> Julien Moutte * Copyright (C) <2009> Tim-Philipp Müller * Copyright (C) <2009> STEricsson * * 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-qtdemux * * Demuxes a .mov file into raw or compressed audio and/or video streams. * * This element supports both push and pull-based scheduling, depending on the * capabilities of the upstream elements. * * * Example launch line * |[ * gst-launch filesrc location=test.mov ! qtdemux name=demux demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink * ]| Play (parse and decode) a .mov file and try to output it to * an automatically detected soundcard and videosink. If the MOV file contains * compressed audio or video data, this will only work if you have the * right decoder elements/plugins installed. * * * Last reviewed on 2006-12-29 (0.10.5) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include "gst/gst-i18n-plugin.h" #include #include #include "qtatomparser.h" #include "qtdemux_types.h" #include "qtdemux_dump.h" #include "qtdemux_fourcc.h" #include "qtdemux_lang.h" #include "qtdemux.h" #include "qtpalette.h" #include "gst/riff/riff-media.h" #include "gst/riff/riff-read.h" #include #include #include #include #ifdef HAVE_ZLIB # include #endif /* max. size considered 'sane' for non-mdat atoms */ #define QTDEMUX_MAX_ATOM_SIZE (25*1024*1024) /* if the sample index is larger than this, something is likely wrong */ #define QTDEMUX_MAX_SAMPLE_INDEX_SIZE (50*1024*1024) /* For converting qt creation times to unix epoch times */ #define QTDEMUX_SECONDS_PER_DAY (60 * 60 * 24) #define QTDEMUX_LEAP_YEARS_FROM_1904_TO_1970 17 #define QTDEMUX_SECONDS_FROM_1904_TO_1970 (((1970 - 1904) * (guint64) 365 + \ QTDEMUX_LEAP_YEARS_FROM_1904_TO_1970) * QTDEMUX_SECONDS_PER_DAY) GST_DEBUG_CATEGORY (qtdemux_debug); /*typedef struct _QtNode QtNode; */ typedef struct _QtDemuxSegment QtDemuxSegment; typedef struct _QtDemuxSample QtDemuxSample; /*struct _QtNode { guint32 type; guint8 *data; gint len; };*/ struct _QtDemuxSample { guint32 size; gint32 pts_offset; /* Add this value to timestamp to get the pts */ guint64 offset; guint64 timestamp; /* DTS In mov time */ guint32 duration; /* In mov time */ gboolean keyframe; /* TRUE when this packet is a keyframe */ }; /* timestamp is the DTS */ #define QTSAMPLE_DTS(stream,sample) gst_util_uint64_scale ((sample)->timestamp,\ GST_SECOND, (stream)->timescale) /* timestamp + offset is the PTS */ #define QTSAMPLE_PTS(stream,sample) gst_util_uint64_scale ((sample)->timestamp + \ (sample)->pts_offset, GST_SECOND, (stream)->timescale) /* timestamp + duration - dts is the duration */ #define QTSAMPLE_DUR_DTS(stream,sample,dts) (gst_util_uint64_scale ((sample)->timestamp + \ (sample)->duration, GST_SECOND, (stream)->timescale) - (dts)); /* timestamp + offset + duration - pts is the duration */ #define QTSAMPLE_DUR_PTS(stream,sample,pts) (gst_util_uint64_scale ((sample)->timestamp + \ (sample)->pts_offset + (sample)->duration, GST_SECOND, (stream)->timescale) - (pts)); #define QTSAMPLE_KEYFRAME(stream,sample) ((stream)->all_keyframe || (sample)->keyframe) /* * Quicktime has tracks and segments. A track is a continuous piece of * multimedia content. The track is not always played from start to finish but * instead, pieces of the track are 'cut out' and played in sequence. This is * what the segments do. * * Inside the track we have keyframes (K) and delta frames. The track has its * own timing, which starts from 0 and extends to end. The position in the track * is called the media_time. * * The segments now describe the pieces that should be played from this track * and are basically tupples of media_time/duration/rate entries. We can have * multiple segments and they are all played after one another. An example: * * segment 1: media_time: 1 second, duration: 1 second, rate 1 * segment 2: media_time: 3 second, duration: 2 second, rate 2 * * To correctly play back this track, one must play: 1 second of media starting * from media_time 1 followed by 2 seconds of media starting from media_time 3 * at a rate of 2. * * Each of the segments will be played at a specific time, the first segment at * time 0, the second one after the duration of the first one, etc.. Note that * the time in resulting playback is not identical to the media_time of the * track anymore. * * Visually, assuming the track has 4 second of media_time: * * (a) (b) (c) (d) * .-----------------------------------------------------------. * track: | K.....K.........K........K.......K.......K...........K... | * '-----------------------------------------------------------' * 0 1 2 3 4 * .------------^ ^ .----------^ ^ * / .-------------' / .------------------' * / / .-----' / * .--------------. .--------------. * | segment 1 | | segment 2 | * '--------------' '--------------' * * The challenge here is to cut out the right pieces of the track for each of * the playback segments. This fortunatly can easily be done with the SEGMENT * events of gstreamer. * * For playback of segment 1, we need to provide the decoder with the keyframe * (a), in the above figure, but we must instruct it only to output the decoded * data between second 1 and 2. We do this with a SEGMENT event for 1 to 2, time * position set to the time of the segment: 0. * * We then proceed to push data from keyframe (a) to frame (b). The decoder * decodes but clips all before media_time 1. * * After finishing a segment, we push out a new SEGMENT event with the clipping * boundaries of the new data. * * This is a good usecase for the GStreamer accumulated SEGMENT events. */ struct _QtDemuxSegment { /* global time and duration, all gst time */ guint64 time; guint64 stop_time; guint64 duration; /* media time of trak, all gst time */ guint64 media_start; guint64 media_stop; gdouble rate; }; struct _QtDemuxStream { GstPad *pad; /* stream type */ guint32 subtype; GstCaps *caps; guint32 fourcc; /* if the stream has a redirect URI in its headers, we store it here */ gchar *redirect_uri; /* track id */ guint track_id; /* duration/scale */ guint64 duration; /* in timescale */ guint32 timescale; /* language */ gchar lang_id[4]; /* ISO 639-2T language code */ /* our samples */ guint32 n_samples; QtDemuxSample *samples; gboolean all_keyframe; /* TRUE when all samples are keyframes (no stss) */ guint32 min_duration; /* duration in timescale of first sample, used for figuring out the framerate, in timescale units */ /* if we use chunks or samples */ gboolean sampled; guint padding; /* video info */ gint width; gint height; /* aspect ratio */ gint display_width; gint display_height; gint par_w; gint par_h; /* Numerator/denominator framerate */ gint fps_n; gint fps_d; guint16 bits_per_sample; guint16 color_table_id; /* audio info */ gdouble rate; gint n_channels; guint samples_per_packet; guint samples_per_frame; guint bytes_per_packet; guint bytes_per_sample; guint bytes_per_frame; guint compression; /* when a discontinuity is pending */ gboolean discont; /* list of buffers to push first */ GSList *buffers; /* if we need to clip this buffer. This is only needed for uncompressed * data */ gboolean need_clip; /* buffer needs some custom processing, e.g. subtitles */ gboolean need_process; /* current position */ guint32 segment_index; guint32 sample_index; guint64 time_position; /* in gst time */ /* the Gst segment we are processing out, used for clipping */ GstSegment segment; /* last GstFlowReturn */ GstFlowReturn last_ret; /* quicktime segments */ guint32 n_segments; QtDemuxSegment *segments; guint32 from_sample; guint32 to_sample; gboolean sent_eos; GstTagList *pending_tags; gboolean send_global_tags; GstEvent *pending_event; GstByteReader stco; GstByteReader stsz; GstByteReader stsc; GstByteReader stts; GstByteReader stss; GstByteReader stps; GstByteReader ctts; gboolean chunks_are_chunks; gint64 stbl_index; /* stco */ guint co_size; GstByteReader co_chunk; guint32 first_chunk; guint32 current_chunk; guint32 last_chunk; guint32 samples_per_chunk; guint32 stco_sample_index; /* stsz */ guint32 sample_size; /* 0 means variable sizes are stored in stsz */ /* stsc */ guint32 stsc_index; guint32 n_samples_per_chunk; guint32 stsc_chunk_index; guint32 stsc_sample_index; guint64 chunk_offset; /* stts */ guint32 stts_index; guint32 stts_samples; guint32 n_sample_times; guint32 stts_sample_index; guint64 stts_time; guint32 stts_duration; /* stss */ gboolean stss_present; guint32 n_sample_syncs; guint32 stss_index; /* stps */ gboolean stps_present; guint32 n_sample_partial_syncs; guint32 stps_index; /* ctts */ gboolean ctts_present; guint32 n_composition_times; guint32 ctts_index; guint32 ctts_sample_index; guint32 ctts_count; gint32 ctts_soffset; /* fragmented */ gboolean parsed_trex; guint32 def_sample_duration; guint32 def_sample_size; guint32 def_sample_flags; }; enum QtDemuxState { QTDEMUX_STATE_INITIAL, /* Initial state (haven't got the header yet) */ QTDEMUX_STATE_HEADER, /* Parsing the header */ QTDEMUX_STATE_MOVIE, /* Parsing/Playing the media data */ QTDEMUX_STATE_BUFFER_MDAT /* Buffering the mdat atom */ }; static GNode *qtdemux_tree_get_child_by_type (GNode * node, guint32 fourcc); static GNode *qtdemux_tree_get_child_by_type_full (GNode * node, guint32 fourcc, GstByteReader * parser); static GNode *qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc); static GNode *qtdemux_tree_get_sibling_by_type_full (GNode * node, guint32 fourcc, GstByteReader * parser); static GstStaticPadTemplate gst_qtdemux_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/quicktime; video/mj2; audio/x-m4a; " "application/x-3gp") ); static GstStaticPadTemplate gst_qtdemux_videosrc_template = GST_STATIC_PAD_TEMPLATE ("video_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_qtdemux_audiosrc_template = GST_STATIC_PAD_TEMPLATE ("audio_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_qtdemux_subsrc_template = GST_STATIC_PAD_TEMPLATE ("subtitle_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); GST_BOILERPLATE (GstQTDemux, gst_qtdemux, GstQTDemux, GST_TYPE_ELEMENT); static void gst_qtdemux_dispose (GObject * object); static guint32 gst_qtdemux_find_index_linear (GstQTDemux * qtdemux, QtDemuxStream * str, guint64 media_time); static guint32 gst_qtdemux_find_index_for_given_media_offset_linear (GstQTDemux * qtdemux, QtDemuxStream * str, gint64 media_offset); static void gst_qtdemux_set_index (GstElement * element, GstIndex * index); static GstIndex *gst_qtdemux_get_index (GstElement * element); static GstStateChangeReturn gst_qtdemux_change_state (GstElement * element, GstStateChange transition); static gboolean qtdemux_sink_activate (GstPad * sinkpad); static gboolean qtdemux_sink_activate_pull (GstPad * sinkpad, gboolean active); static gboolean qtdemux_sink_activate_push (GstPad * sinkpad, gboolean active); static void gst_qtdemux_loop (GstPad * pad); static GstFlowReturn gst_qtdemux_chain (GstPad * sinkpad, GstBuffer * inbuf); static gboolean gst_qtdemux_handle_sink_event (GstPad * pad, GstEvent * event); static gboolean qtdemux_parse_moov (GstQTDemux * qtdemux, const guint8 * buffer, guint length); static gboolean qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, const guint8 * buffer, guint length); static gboolean qtdemux_parse_tree (GstQTDemux * qtdemux); static void gst_qtdemux_handle_esds (GstQTDemux * qtdemux, QtDemuxStream * stream, GNode * esds, GstTagList * list); static GstCaps *qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 fourcc, const guint8 * stsd_data, gchar ** codec_name); static GstCaps *qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 fourcc, const guint8 * data, int len, gchar ** codec_name); static GstCaps *qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 fourcc, const guint8 * data, gchar ** codec_name); static gboolean qtdemux_parse_samples (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 n); static GstFlowReturn qtdemux_expose_streams (GstQTDemux * qtdemux); static void gst_qtdemux_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_qtdemux_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_qtdemux_videosrc_template); gst_element_class_add_static_pad_template (element_class, &gst_qtdemux_audiosrc_template); gst_element_class_add_static_pad_template (element_class, &gst_qtdemux_subsrc_template); gst_element_class_set_details_simple (element_class, "QuickTime demuxer", "Codec/Demuxer", "Demultiplex a QuickTime file into audio and video streams", "David Schleef , Wim Taymans "); GST_DEBUG_CATEGORY_INIT (qtdemux_debug, "qtdemux", 0, "qtdemux plugin"); } static void gst_qtdemux_class_init (GstQTDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = gst_qtdemux_dispose; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_qtdemux_change_state); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_qtdemux_set_index); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_qtdemux_get_index); gst_tag_register_musicbrainz_tags (); } static void gst_qtdemux_init (GstQTDemux * qtdemux, GstQTDemuxClass * klass) { qtdemux->sinkpad = gst_pad_new_from_static_template (&gst_qtdemux_sink_template, "sink"); gst_pad_set_activate_function (qtdemux->sinkpad, qtdemux_sink_activate); gst_pad_set_activatepull_function (qtdemux->sinkpad, qtdemux_sink_activate_pull); gst_pad_set_activatepush_function (qtdemux->sinkpad, qtdemux_sink_activate_push); gst_pad_set_chain_function (qtdemux->sinkpad, gst_qtdemux_chain); gst_pad_set_event_function (qtdemux->sinkpad, gst_qtdemux_handle_sink_event); gst_element_add_pad (GST_ELEMENT_CAST (qtdemux), qtdemux->sinkpad); qtdemux->state = QTDEMUX_STATE_INITIAL; qtdemux->pullbased = FALSE; qtdemux->posted_redirect = FALSE; qtdemux->neededbytes = 16; qtdemux->todrop = 0; qtdemux->adapter = gst_adapter_new (); qtdemux->offset = 0; qtdemux->first_mdat = -1; qtdemux->got_moov = FALSE; qtdemux->mdatoffset = GST_CLOCK_TIME_NONE; qtdemux->mdatbuffer = NULL; gst_segment_init (&qtdemux->segment, GST_FORMAT_TIME); } static void gst_qtdemux_dispose (GObject * object) { GstQTDemux *qtdemux = GST_QTDEMUX (object); if (qtdemux->adapter) { g_object_unref (G_OBJECT (qtdemux->adapter)); qtdemux->adapter = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_qtdemux_post_no_playable_stream_error (GstQTDemux * qtdemux) { if (qtdemux->posted_redirect) { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file contains no playable streams.")), ("no known streams found, a redirect message has been posted")); } else { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file contains no playable streams.")), ("no known streams found")); } } static GstFlowReturn gst_qtdemux_pull_atom (GstQTDemux * qtdemux, guint64 offset, guint64 size, GstBuffer ** buf) { GstFlowReturn flow; if (G_UNLIKELY (size == 0)) { GstFlowReturn ret; GstBuffer *tmp = NULL; ret = gst_qtdemux_pull_atom (qtdemux, offset, sizeof (guint32), &tmp); if (ret != GST_FLOW_OK) return ret; size = QT_UINT32 (GST_BUFFER_DATA (tmp)); GST_DEBUG_OBJECT (qtdemux, "size 0x%08" G_GINT64_MODIFIER "x", size); gst_buffer_unref (tmp); } /* Sanity check: catch bogus sizes (fuzzed/broken files) */ if (G_UNLIKELY (size > QTDEMUX_MAX_ATOM_SIZE)) { if (qtdemux->state != QTDEMUX_STATE_MOVIE && qtdemux->got_moov) { /* we're pulling header but already got most interesting bits, * so never mind the rest (e.g. tags) (that much) */ GST_WARNING_OBJECT (qtdemux, "atom has bogus size %" G_GUINT64_FORMAT, size); return GST_FLOW_UNEXPECTED; } else { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is invalid and cannot be played.")), ("atom has bogus size %" G_GUINT64_FORMAT, size)); return GST_FLOW_ERROR; } } flow = gst_pad_pull_range (qtdemux->sinkpad, offset, size, buf); if (G_UNLIKELY (flow != GST_FLOW_OK)) return flow; /* Catch short reads - we don't want any partial atoms */ if (G_UNLIKELY (GST_BUFFER_SIZE (*buf) < size)) { GST_WARNING_OBJECT (qtdemux, "short read: %u < %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (*buf), size); gst_buffer_unref (*buf); *buf = NULL; return GST_FLOW_UNEXPECTED; } return flow; } #if 1 static gboolean gst_qtdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat dest_format, gint64 * dest_value) { gboolean res = TRUE; QtDemuxStream *stream = gst_pad_get_element_private (pad); GstQTDemux *qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); gint32 index; if (stream->subtype != FOURCC_vide) { res = FALSE; goto done; } switch (src_format) { case GST_FORMAT_TIME: switch (dest_format) { case GST_FORMAT_BYTES:{ index = gst_qtdemux_find_index_linear (qtdemux, stream, src_value); if (-1 == index) return FALSE; *dest_value = stream->samples[index].offset; GST_DEBUG_OBJECT (qtdemux, "Format Conversion Time->Offset :%" GST_TIME_FORMAT "->%" G_GUINT64_FORMAT, GST_TIME_ARGS (src_value), *dest_value); break; } default: res = FALSE; break; } break; case GST_FORMAT_BYTES: switch (dest_format) { case GST_FORMAT_TIME:{ index = gst_qtdemux_find_index_for_given_media_offset_linear (qtdemux, stream, src_value); if (-1 == index) return FALSE; *dest_value = gst_util_uint64_scale (stream->samples[index].timestamp, GST_SECOND, stream->timescale); GST_DEBUG_OBJECT (qtdemux, "Format Conversion Offset->Time :%" G_GUINT64_FORMAT "->%" GST_TIME_FORMAT, src_value, GST_TIME_ARGS (*dest_value)); break; } default: res = FALSE; break; } break; default: res = FALSE; } done: gst_object_unref (qtdemux); return res; } #endif static const GstQueryType * gst_qtdemux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_CONVERT, GST_QUERY_FORMATS, GST_QUERY_SEEKING, 0 }; return src_types; } static gboolean gst_qtdemux_get_duration (GstQTDemux * qtdemux, gint64 * duration) { gboolean res = TRUE; *duration = GST_CLOCK_TIME_NONE; if (qtdemux->duration != 0) { if (qtdemux->duration != G_MAXINT64 && qtdemux->timescale != 0) { *duration = gst_util_uint64_scale (qtdemux->duration, GST_SECOND, qtdemux->timescale); } } return res; } static gboolean gst_qtdemux_handle_src_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstQTDemux *qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: if (GST_CLOCK_TIME_IS_VALID (qtdemux->segment.last_stop)) { gst_query_set_position (query, GST_FORMAT_TIME, qtdemux->segment.last_stop); res = TRUE; } break; case GST_QUERY_DURATION:{ GstFormat fmt; gst_query_parse_duration (query, &fmt, NULL); if (fmt == GST_FORMAT_TIME) { gint64 duration = -1; gst_qtdemux_get_duration (qtdemux, &duration); if (duration > 0) { gst_query_set_duration (query, GST_FORMAT_TIME, duration); res = TRUE; } } break; } case GST_QUERY_CONVERT:{ GstFormat src_fmt, dest_fmt; gint64 src_value, dest_value = 0; gst_query_parse_convert (query, &src_fmt, &src_value, &dest_fmt, NULL); res = gst_qtdemux_src_convert (pad, src_fmt, src_value, dest_fmt, &dest_value); if (res) { gst_query_set_convert (query, src_fmt, src_value, dest_fmt, dest_value); res = TRUE; } break; } case GST_QUERY_FORMATS: gst_query_set_formats (query, 2, GST_FORMAT_TIME, GST_FORMAT_BYTES); res = TRUE; break; case GST_QUERY_SEEKING:{ GstFormat fmt; gboolean seekable; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); if (fmt == GST_FORMAT_TIME) { gint64 duration = -1; gst_qtdemux_get_duration (qtdemux, &duration); seekable = TRUE; if (!qtdemux->pullbased) { GstQuery *q; /* we might be able with help from upstream */ seekable = FALSE; q = gst_query_new_seeking (GST_FORMAT_BYTES); if (gst_pad_peer_query (qtdemux->sinkpad, q)) { gst_query_parse_seeking (q, &fmt, &seekable, NULL, NULL); GST_LOG_OBJECT (qtdemux, "upstream BYTE seekable %d", seekable); } gst_query_unref (q); } gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, duration); res = TRUE; } break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (qtdemux); return res; } static void gst_qtdemux_push_tags (GstQTDemux * qtdemux, QtDemuxStream * stream) { if (G_LIKELY (stream->pad)) { GST_DEBUG_OBJECT (qtdemux, "Checking pad %s:%s for tags", GST_DEBUG_PAD_NAME (stream->pad)); if (G_UNLIKELY (stream->pending_tags)) { GST_DEBUG_OBJECT (qtdemux, "Sending tags %" GST_PTR_FORMAT, stream->pending_tags); gst_pad_push_event (stream->pad, gst_event_new_tag (stream->pending_tags)); stream->pending_tags = NULL; } if (G_UNLIKELY (stream->send_global_tags && qtdemux->tag_list)) { GST_DEBUG_OBJECT (qtdemux, "Sending global tags %" GST_PTR_FORMAT, qtdemux->tag_list); gst_pad_push_event (stream->pad, gst_event_new_tag (gst_tag_list_copy (qtdemux->tag_list))); stream->send_global_tags = FALSE; } } } /* push event on all source pads; takes ownership of the event */ static void gst_qtdemux_push_event (GstQTDemux * qtdemux, GstEvent * event) { guint n; gboolean has_valid_stream = FALSE; GstEventType etype = GST_EVENT_TYPE (event); GST_DEBUG_OBJECT (qtdemux, "pushing %s event on all source pads", GST_EVENT_TYPE_NAME (event)); for (n = 0; n < qtdemux->n_streams; n++) { GstPad *pad; QtDemuxStream *stream = qtdemux->streams[n]; if ((pad = stream->pad)) { has_valid_stream = TRUE; if (etype == GST_EVENT_EOS) { /* let's not send twice */ if (stream->sent_eos) continue; stream->sent_eos = TRUE; } gst_pad_push_event (pad, gst_event_ref (event)); } } gst_event_unref (event); /* if it is EOS and there are no pads, post an error */ if (!has_valid_stream && etype == GST_EVENT_EOS) { gst_qtdemux_post_no_playable_stream_error (qtdemux); } } /* push a pending newsegment event, if any from the streaming thread */ static void gst_qtdemux_push_pending_newsegment (GstQTDemux * qtdemux) { if (qtdemux->pending_newsegment) { gst_qtdemux_push_event (qtdemux, qtdemux->pending_newsegment); qtdemux->pending_newsegment = NULL; } } typedef struct { guint64 media_time; } FindData; static gint find_func (QtDemuxSample * s1, guint64 * media_time, gpointer user_data) { if (s1->timestamp > *media_time) return 1; return -1; } /* find the index of the sample that includes the data for @media_time using a * binary search. Only to be called in optimized cases of linear search below. * * Returns the index of the sample. */ static guint32 gst_qtdemux_find_index (GstQTDemux * qtdemux, QtDemuxStream * str, guint64 media_time) { QtDemuxSample *result; guint32 index; /* convert media_time to mov format */ media_time = gst_util_uint64_scale_ceil (media_time, str->timescale, GST_SECOND); result = gst_util_array_binary_search (str->samples, str->stbl_index + 1, sizeof (QtDemuxSample), (GCompareDataFunc) find_func, GST_SEARCH_MODE_BEFORE, &media_time, NULL); if (G_LIKELY (result)) index = result - str->samples; else index = 0; return index; } /* find the index of the sample that includes the data for @media_offset using a * linear search * * Returns the index of the sample. */ static guint32 gst_qtdemux_find_index_for_given_media_offset_linear (GstQTDemux * qtdemux, QtDemuxStream * str, gint64 media_offset) { QtDemuxSample *result = str->samples; guint32 index = 0; if (result == NULL || str->n_samples == 0) return -1; if (media_offset == result->offset) return index; result++; while (index < str->n_samples - 1) { if (!qtdemux_parse_samples (qtdemux, str, index + 1)) goto parse_failed; if (media_offset < result->offset) break; index++; result++; } return index; /* ERRORS */ parse_failed: { GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", index + 1); return -1; } } /* find the index of the sample that includes the data for @media_time using a * linear search, and keeping in mind that not all samples may have been parsed * yet. If possible, it will delegate to binary search. * * Returns the index of the sample. */ static guint32 gst_qtdemux_find_index_linear (GstQTDemux * qtdemux, QtDemuxStream * str, guint64 media_time) { guint32 index = 0; guint64 mov_time; /* convert media_time to mov format */ mov_time = gst_util_uint64_scale_ceil (media_time, str->timescale, GST_SECOND); if (mov_time == str->samples[0].timestamp) return index; /* use faster search if requested time in already parsed range */ if (str->stbl_index >= 0 && mov_time <= str->samples[str->stbl_index].timestamp) return gst_qtdemux_find_index (qtdemux, str, media_time); while (index < str->n_samples - 1) { if (!qtdemux_parse_samples (qtdemux, str, index + 1)) goto parse_failed; if (mov_time < str->samples[index + 1].timestamp) break; index++; } return index; /* ERRORS */ parse_failed: { GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", index + 1); return -1; } } /* find the index of the keyframe needed to decode the sample at @index * of stream @str. * * Returns the index of the keyframe. */ static guint32 gst_qtdemux_find_keyframe (GstQTDemux * qtdemux, QtDemuxStream * str, guint32 index) { guint32 new_index = index; if (index >= str->n_samples) { new_index = str->n_samples; goto beach; } /* all keyframes, return index */ if (str->all_keyframe) { new_index = index; goto beach; } /* else go back until we have a keyframe */ while (TRUE) { if (str->samples[new_index].keyframe) break; if (new_index == 0) break; new_index--; } beach: GST_DEBUG_OBJECT (qtdemux, "searching for keyframe index before index %u " "gave %u", index, new_index); return new_index; } /* find the segment for @time_position for @stream * * Returns -1 if the segment cannot be found. */ static guint32 gst_qtdemux_find_segment (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 time_position) { gint i; guint32 seg_idx; GST_LOG_OBJECT (qtdemux, "finding segment for %" GST_TIME_FORMAT, GST_TIME_ARGS (time_position)); /* find segment corresponding to time_position if we are looking * for a segment. */ seg_idx = -1; for (i = 0; i < stream->n_segments; i++) { QtDemuxSegment *segment = &stream->segments[i]; GST_LOG_OBJECT (qtdemux, "looking at segment %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT, GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->stop_time)); /* For the last segment we include stop_time in the last segment */ if (i < stream->n_segments - 1) { if (segment->time <= time_position && time_position < segment->stop_time) { GST_LOG_OBJECT (qtdemux, "segment %d matches", i); seg_idx = i; break; } } else { if (segment->time <= time_position && time_position <= segment->stop_time) { GST_LOG_OBJECT (qtdemux, "segment %d matches", i); seg_idx = i; break; } } } return seg_idx; } /* move the stream @str to the sample position @index. * * Updates @str->sample_index and marks discontinuity if needed. */ static void gst_qtdemux_move_stream (GstQTDemux * qtdemux, QtDemuxStream * str, guint32 index) { /* no change needed */ if (index == str->sample_index) return; GST_DEBUG_OBJECT (qtdemux, "moving to sample %u of %u", index, str->n_samples); /* position changed, we have a discont */ str->sample_index = index; /* Each time we move in the stream we store the position where we are * starting from */ str->from_sample = index; str->discont = TRUE; } static void gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time, gint64 * key_time, gint64 * key_offset) { guint64 min_offset; gint64 min_byte_offset = -1; gint n; min_offset = desired_time; /* for each stream, find the index of the sample in the segment * and move back to the previous keyframe. */ for (n = 0; n < qtdemux->n_streams; n++) { QtDemuxStream *str; guint32 index, kindex; guint32 seg_idx; guint64 media_start; guint64 media_time; guint64 seg_time; QtDemuxSegment *seg; str = qtdemux->streams[n]; seg_idx = gst_qtdemux_find_segment (qtdemux, str, desired_time); GST_DEBUG_OBJECT (qtdemux, "align segment %d", seg_idx); /* segment not found, continue with normal flow */ if (seg_idx == -1) continue; /* get segment and time in the segment */ seg = &str->segments[seg_idx]; seg_time = desired_time - seg->time; /* get the media time in the segment */ media_start = seg->media_start + seg_time; /* get the index of the sample with media time */ index = gst_qtdemux_find_index_linear (qtdemux, str, media_start); GST_DEBUG_OBJECT (qtdemux, "sample for %" GST_TIME_FORMAT " at %u" " at offset %" G_GUINT64_FORMAT, GST_TIME_ARGS (media_start), index, str->samples[index].offset); /* find previous keyframe */ kindex = gst_qtdemux_find_keyframe (qtdemux, str, index); /* if the keyframe is at a different position, we need to update the * requested seek time */ if (index != kindex) { index = kindex; /* get timestamp of keyframe */ media_time = gst_util_uint64_scale (str->samples[kindex].timestamp, GST_SECOND, str->timescale); GST_DEBUG_OBJECT (qtdemux, "keyframe at %u with time %" GST_TIME_FORMAT " at offset %" G_GUINT64_FORMAT, kindex, GST_TIME_ARGS (media_time), str->samples[kindex].offset); /* keyframes in the segment get a chance to change the * desired_offset. keyframes out of the segment are * ignored. */ if (media_time >= seg->media_start) { guint64 seg_time; /* this keyframe is inside the segment, convert back to * segment time */ seg_time = (media_time - seg->media_start) + seg->time; if (seg_time < min_offset) min_offset = seg_time; } } if (min_byte_offset < 0 || str->samples[index].offset < min_byte_offset) min_byte_offset = str->samples[index].offset; } if (key_time) *key_time = min_offset; if (key_offset) *key_offset = min_byte_offset; } static gboolean gst_qtdemux_convert_seek (GstPad * pad, GstFormat * format, GstSeekType cur_type, gint64 * cur, GstSeekType stop_type, gint64 * stop) { gboolean res; GstFormat fmt; g_return_val_if_fail (format != NULL, FALSE); g_return_val_if_fail (cur != NULL, FALSE); g_return_val_if_fail (stop != NULL, FALSE); if (*format == GST_FORMAT_TIME) return TRUE; fmt = GST_FORMAT_TIME; res = TRUE; if (cur_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (pad, *format, *cur, &fmt, cur); if (res && stop_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (pad, *format, *stop, &fmt, stop); if (res) *format = GST_FORMAT_TIME; return res; } /* perform seek in push based mode: find BYTE position to move to based on time and delegate to upstream */ static gboolean gst_qtdemux_do_push_seek (GstQTDemux * qtdemux, GstPad * pad, GstEvent * event) { gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType cur_type, stop_type; gint64 cur, stop; gboolean res; gint64 byte_cur; GST_DEBUG_OBJECT (qtdemux, "doing push-based seek"); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* FIXME, always play to the end */ stop = -1; /* only forward streaming and seeking is possible */ if (rate <= 0) goto unsupported_seek; /* convert to TIME if needed and possible */ if (!gst_qtdemux_convert_seek (pad, &format, cur_type, &cur, stop_type, &stop)) goto no_format; /* find reasonable corresponding BYTE position, * also try to mind about keyframes, since we can not go back a bit for them * later on */ gst_qtdemux_adjust_seek (qtdemux, cur, NULL, &byte_cur); if (byte_cur == -1) goto abort_seek; GST_DEBUG_OBJECT (qtdemux, "Pushing BYTE seek rate %g, " "start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, rate, byte_cur, stop); if (!(flags & GST_SEEK_FLAG_KEY_UNIT)) { GST_DEBUG_OBJECT (qtdemux, "Requested seek time: %" GST_TIME_FORMAT ", calculated seek offset: %" G_GUINT64_FORMAT, GST_TIME_ARGS (cur), byte_cur); GST_OBJECT_LOCK (qtdemux); qtdemux->requested_seek_time = cur; qtdemux->seek_offset = byte_cur; GST_OBJECT_UNLOCK (qtdemux); } /* BYTE seek event */ event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, byte_cur, stop_type, stop); res = gst_pad_push_event (qtdemux->sinkpad, event); return res; /* ERRORS */ abort_seek: { GST_DEBUG_OBJECT (qtdemux, "could not determine byte position to seek to, " "seek aborted."); return FALSE; } unsupported_seek: { GST_DEBUG_OBJECT (qtdemux, "unsupported seek, seek aborted."); return FALSE; } no_format: { GST_DEBUG_OBJECT (qtdemux, "unsupported format given, seek aborted."); return FALSE; } } /* perform the seek. * * We set all segment_indexes in the streams to unknown and * adjust the time_position to the desired position. this is enough * to trigger a segment switch in the streaming thread to start * streaming from the desired position. * * Keyframe seeking is a little more complicated when dealing with * segments. Ideally we want to move to the previous keyframe in * the segment but there might not be a keyframe in the segment. In * fact, none of the segments could contain a keyframe. We take a * practical approach: seek to the previous keyframe in the segment, * if there is none, seek to the beginning of the segment. * * Called with STREAM_LOCK */ static gboolean gst_qtdemux_perform_seek (GstQTDemux * qtdemux, GstSegment * segment) { gint64 desired_offset; gint n; desired_offset = segment->last_stop; GST_DEBUG_OBJECT (qtdemux, "seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (desired_offset)); /* may not have enough fragmented info to do this adjustment, * and we can't scan (and probably should not) at this time with * possibly flushing upstream */ if ((segment->flags & GST_SEEK_FLAG_KEY_UNIT) && !qtdemux->fragmented) { gint64 min_offset; gst_qtdemux_adjust_seek (qtdemux, desired_offset, &min_offset, NULL); GST_DEBUG_OBJECT (qtdemux, "keyframe seek, align to %" GST_TIME_FORMAT, GST_TIME_ARGS (min_offset)); desired_offset = min_offset; } /* and set all streams to the final position */ for (n = 0; n < qtdemux->n_streams; n++) { QtDemuxStream *stream = qtdemux->streams[n]; stream->time_position = desired_offset; stream->sample_index = -1; stream->segment_index = -1; stream->last_ret = GST_FLOW_OK; stream->sent_eos = FALSE; } segment->last_stop = desired_offset; segment->time = desired_offset; /* we stop at the end */ if (segment->stop == -1) segment->stop = segment->duration; return TRUE; } /* do a seek in pull based mode */ static gboolean gst_qtdemux_do_seek (GstQTDemux * qtdemux, GstPad * pad, GstEvent * event) { gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType cur_type, stop_type; gint64 cur, stop; gboolean flush; gboolean update; GstSegment seeksegment; int i; if (event) { GST_DEBUG_OBJECT (qtdemux, "doing seek with event"); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* we have to have a format as the segment format. Try to convert * if not. */ if (!gst_qtdemux_convert_seek (pad, &format, cur_type, &cur, stop_type, &stop)) goto no_format; GST_DEBUG_OBJECT (qtdemux, "seek format %s", gst_format_get_name (format)); } else { GST_DEBUG_OBJECT (qtdemux, "doing seek without event"); flags = 0; } flush = flags & GST_SEEK_FLAG_FLUSH; /* stop streaming, either by flushing or by pausing the task */ if (flush) { /* unlock upstream pull_range */ gst_pad_push_event (qtdemux->sinkpad, gst_event_new_flush_start ()); /* make sure out loop function exits */ gst_qtdemux_push_event (qtdemux, gst_event_new_flush_start ()); } else { /* non flushing seek, pause the task */ gst_pad_pause_task (qtdemux->sinkpad); } /* wait for streaming to finish */ GST_PAD_STREAM_LOCK (qtdemux->sinkpad); /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &qtdemux->segment, sizeof (GstSegment)); if (event) { /* configure the segment with the seek variables */ GST_DEBUG_OBJECT (qtdemux, "configuring seek"); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); } /* now do the seek, this actually never returns FALSE */ gst_qtdemux_perform_seek (qtdemux, &seeksegment); /* prepare for streaming again */ if (flush) { gst_pad_push_event (qtdemux->sinkpad, gst_event_new_flush_stop ()); gst_qtdemux_push_event (qtdemux, gst_event_new_flush_stop ()); } else if (qtdemux->segment_running) { /* we are running the current segment and doing a non-flushing seek, * close the segment first based on the last_stop. */ GST_DEBUG_OBJECT (qtdemux, "closing running segment %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, qtdemux->segment.start, qtdemux->segment.last_stop); if (qtdemux->segment.rate >= 0) { /* FIXME, rate is the product of the global rate and the (quicktime) * segment rate. */ qtdemux->pending_newsegment = gst_event_new_new_segment (TRUE, qtdemux->segment.rate, qtdemux->segment.format, qtdemux->segment.start, qtdemux->segment.last_stop, qtdemux->segment.time); } else { /* For Reverse Playback */ guint64 stop; if ((stop = qtdemux->segment.stop) == -1) stop = qtdemux->segment.duration; /* for reverse playback, we played from stop to last_stop. */ qtdemux->pending_newsegment = gst_event_new_new_segment (TRUE, qtdemux->segment.rate, qtdemux->segment.format, qtdemux->segment.last_stop, stop, qtdemux->segment.last_stop); } } /* commit the new segment */ memcpy (&qtdemux->segment, &seeksegment, sizeof (GstSegment)); if (qtdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (qtdemux), gst_message_new_segment_start (GST_OBJECT_CAST (qtdemux), qtdemux->segment.format, qtdemux->segment.last_stop)); } /* restart streaming, NEWSEGMENT will be sent from the streaming * thread. */ qtdemux->segment_running = TRUE; for (i = 0; i < qtdemux->n_streams; i++) qtdemux->streams[i]->last_ret = GST_FLOW_OK; gst_pad_start_task (qtdemux->sinkpad, (GstTaskFunction) gst_qtdemux_loop, qtdemux->sinkpad); GST_PAD_STREAM_UNLOCK (qtdemux->sinkpad); return TRUE; /* ERRORS */ no_format: { GST_DEBUG_OBJECT (qtdemux, "unsupported format given, seek aborted."); return FALSE; } } static gboolean qtdemux_ensure_index (GstQTDemux * qtdemux) { guint i; GST_DEBUG_OBJECT (qtdemux, "collecting all metadata for all streams"); /* Build complete index */ for (i = 0; i < qtdemux->n_streams; i++) { QtDemuxStream *stream = qtdemux->streams[i]; if (!qtdemux_parse_samples (qtdemux, stream, stream->n_samples - 1)) goto parse_error; } return TRUE; /* ERRORS */ parse_error: { GST_LOG_OBJECT (qtdemux, "Building complete index of stream %u for seeking failed!", i); return FALSE; } } static gboolean gst_qtdemux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstQTDemux *qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: { #ifndef GST_DISABLE_GST_DEBUG GstClockTime ts = gst_util_get_timestamp (); #endif /* Build complete index for seeking; * if not a fragmented file at least */ if (!qtdemux->fragmented) if (!qtdemux_ensure_index (qtdemux)) goto index_failed; #ifndef GST_DISABLE_GST_DEBUG ts = gst_util_get_timestamp () - ts; GST_INFO_OBJECT (qtdemux, "Time taken to parse index %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); #endif } if (qtdemux->pullbased) { res = gst_qtdemux_do_seek (qtdemux, pad, event); } else if (qtdemux->state == QTDEMUX_STATE_MOVIE && qtdemux->n_streams && !qtdemux->fragmented) { res = gst_qtdemux_do_push_seek (qtdemux, pad, event); } else { GST_DEBUG_OBJECT (qtdemux, "ignoring seek in push mode in current state"); res = FALSE; } gst_event_unref (event); break; case GST_EVENT_QOS: case GST_EVENT_NAVIGATION: res = FALSE; gst_event_unref (event); break; default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (qtdemux); done: return res; /* ERRORS */ index_failed: { GST_ERROR_OBJECT (qtdemux, "Index failed"); gst_event_unref (event); res = FALSE; goto done; } } /* stream/index return sample that is min/max w.r.t. byte position, * time is min/max w.r.t. time of samples, * the latter need not be time of the former sample */ static void gst_qtdemux_find_sample (GstQTDemux * qtdemux, gint64 byte_pos, gboolean fw, gboolean set, QtDemuxStream ** _stream, gint * _index, gint64 * _time) { gint i, n, index; gint64 time, min_time; QtDemuxStream *stream; min_time = -1; stream = NULL; index = -1; for (n = 0; n < qtdemux->n_streams; ++n) { QtDemuxStream *str; gint inc; gboolean set_sample; str = qtdemux->streams[n]; set_sample = !set; if (fw) { i = 0; inc = 1; } else { i = str->n_samples - 1; inc = -1; } for (; (i >= 0) && (i < str->n_samples); i += inc) { if (str->samples[i].size && ((fw && (str->samples[i].offset >= byte_pos)) || (!fw && (str->samples[i].offset + str->samples[i].size <= byte_pos)))) { /* move stream to first available sample */ if (set) { gst_qtdemux_move_stream (qtdemux, str, i); set_sample = TRUE; } /* determine min/max time */ time = str->samples[i].timestamp + str->samples[i].pts_offset; time = gst_util_uint64_scale (time, GST_SECOND, str->timescale); if (min_time == -1 || (!fw && time > min_time) || (fw && time < min_time)) { min_time = time; } /* determine stream with leading sample, to get its position */ if (!stream || (fw && (str->samples[i].offset < stream->samples[index].offset)) || (!fw && (str->samples[i].offset > stream->samples[index].offset))) { stream = str; index = i; } break; } } /* no sample for this stream, mark eos */ if (!set_sample) gst_qtdemux_move_stream (qtdemux, str, str->n_samples); } if (_time) *_time = min_time; if (_stream) *_stream = stream; if (_index) *_index = index; } static gboolean gst_qtdemux_handle_sink_event (GstPad * sinkpad, GstEvent * event) { GstQTDemux *demux = GST_QTDEMUX (GST_PAD_PARENT (sinkpad)); gboolean res; GST_LOG_OBJECT (demux, "handling %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time, offset = 0; QtDemuxStream *stream; gint idx; gboolean update; GstSegment segment; /* some debug output */ gst_segment_init (&segment, GST_FORMAT_UNDEFINED); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); gst_segment_set_newsegment_full (&segment, update, rate, arate, format, start, stop, time); GST_DEBUG_OBJECT (demux, "received format %d newsegment %" GST_SEGMENT_FORMAT, format, &segment); /* chain will send initial newsegment after pads have been added */ if (demux->state != QTDEMUX_STATE_MOVIE || !demux->n_streams) { GST_DEBUG_OBJECT (demux, "still starting, eating event"); goto exit; } /* we only expect a BYTE segment, e.g. following a seek */ if (format == GST_FORMAT_BYTES) { if (start > 0) { gint64 requested_seek_time; guint64 seek_offset; offset = start; GST_OBJECT_LOCK (demux); requested_seek_time = demux->requested_seek_time; seek_offset = demux->seek_offset; demux->requested_seek_time = -1; demux->seek_offset = -1; GST_OBJECT_UNLOCK (demux); if (offset == seek_offset) { start = requested_seek_time; } else { gst_qtdemux_find_sample (demux, start, TRUE, FALSE, NULL, NULL, &start); start = MAX (start, 0); } } if (stop > 0) { gst_qtdemux_find_sample (demux, stop, FALSE, FALSE, NULL, NULL, &stop); /* keyframe seeking should already arrange for start >= stop, * but make sure in other rare cases */ stop = MAX (stop, start); } } else { GST_DEBUG_OBJECT (demux, "unsupported segment format, ignoring"); goto exit; } /* accept upstream's notion of segment and distribute along */ gst_segment_set_newsegment_full (&demux->segment, update, rate, arate, GST_FORMAT_TIME, start, stop, start); GST_DEBUG_OBJECT (demux, "Pushing newseg update %d, rate %g, " "applied rate %g, format %d, start %" GST_TIME_FORMAT ", " "stop %" GST_TIME_FORMAT, update, rate, arate, GST_FORMAT_TIME, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); gst_qtdemux_push_event (demux, gst_event_new_new_segment_full (update, rate, arate, GST_FORMAT_TIME, start, stop, start)); /* clear leftover in current segment, if any */ gst_adapter_clear (demux->adapter); /* set up streaming thread */ gst_qtdemux_find_sample (demux, offset, TRUE, TRUE, &stream, &idx, NULL); demux->offset = offset; if (stream) { demux->todrop = stream->samples[idx].offset - offset; demux->neededbytes = demux->todrop + stream->samples[idx].size; } else { /* set up for EOS */ demux->neededbytes = -1; demux->todrop = 0; } exit: gst_event_unref (event); res = TRUE; goto drop; break; } case GST_EVENT_FLUSH_STOP: { gint i; /* clean up, force EOS if no more info follows */ gst_adapter_clear (demux->adapter); demux->offset = 0; demux->neededbytes = -1; /* reset flow return, e.g. following seek */ for (i = 0; i < demux->n_streams; i++) { demux->streams[i]->last_ret = GST_FLOW_OK; demux->streams[i]->sent_eos = FALSE; } break; } case GST_EVENT_EOS: /* If we are in push mode, and get an EOS before we've seen any streams, * then error out - we have nowhere to send the EOS */ if (!demux->pullbased) { gint i; gboolean has_valid_stream = FALSE; for (i = 0; i < demux->n_streams; i++) { if (demux->streams[i]->pad != NULL) { has_valid_stream = TRUE; break; } } if (!has_valid_stream) gst_qtdemux_post_no_playable_stream_error (demux); } break; default: break; } res = gst_pad_event_default (demux->sinkpad, event); drop: return res; } static void gst_qtdemux_set_index (GstElement * element, GstIndex * index) { GstQTDemux *demux = GST_QTDEMUX (element); GST_OBJECT_LOCK (demux); if (demux->element_index) gst_object_unref (demux->element_index); if (index) { demux->element_index = gst_object_ref (index); } else { demux->element_index = NULL; } GST_OBJECT_UNLOCK (demux); /* object lock might be taken again */ if (index) gst_index_get_writer_id (index, GST_OBJECT (element), &demux->index_id); GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT "for writer id %d", demux->element_index, demux->index_id); } static GstIndex * gst_qtdemux_get_index (GstElement * element) { GstIndex *result = NULL; GstQTDemux *demux = GST_QTDEMUX (element); GST_OBJECT_LOCK (demux); if (demux->element_index) result = gst_object_ref (demux->element_index); GST_OBJECT_UNLOCK (demux); GST_DEBUG_OBJECT (demux, "Returning index %" GST_PTR_FORMAT, result); return result; } static void gst_qtdemux_stbl_free (QtDemuxStream * stream) { g_free ((gpointer) stream->stco.data); stream->stco.data = NULL; g_free ((gpointer) stream->stsz.data); stream->stsz.data = NULL; g_free ((gpointer) stream->stsc.data); stream->stsc.data = NULL; g_free ((gpointer) stream->stts.data); stream->stts.data = NULL; g_free ((gpointer) stream->stss.data); stream->stss.data = NULL; g_free ((gpointer) stream->stps.data); stream->stps.data = NULL; g_free ((gpointer) stream->ctts.data); stream->ctts.data = NULL; } static void gst_qtdemux_stream_free (GstQTDemux * qtdemux, QtDemuxStream * stream) { while (stream->buffers) { gst_buffer_unref (GST_BUFFER_CAST (stream->buffers->data)); stream->buffers = g_slist_delete_link (stream->buffers, stream->buffers); } if (stream->pad) gst_element_remove_pad (GST_ELEMENT_CAST (qtdemux), stream->pad); g_free (stream->samples); if (stream->caps) gst_caps_unref (stream->caps); g_free (stream->segments); if (stream->pending_tags) gst_tag_list_free (stream->pending_tags); g_free (stream->redirect_uri); /* free stbl sub-atoms */ gst_qtdemux_stbl_free (stream); g_free (stream); } static GstStateChangeReturn gst_qtdemux_change_state (GstElement * element, GstStateChange transition) { GstQTDemux *qtdemux = GST_QTDEMUX (element); GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; default: break; } result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY:{ gint n; qtdemux->state = QTDEMUX_STATE_INITIAL; qtdemux->neededbytes = 16; qtdemux->todrop = 0; qtdemux->pullbased = FALSE; qtdemux->posted_redirect = FALSE; qtdemux->offset = 0; qtdemux->first_mdat = -1; qtdemux->header_size = 0; qtdemux->got_moov = FALSE; qtdemux->mdatoffset = GST_CLOCK_TIME_NONE; if (qtdemux->mdatbuffer) gst_buffer_unref (qtdemux->mdatbuffer); qtdemux->mdatbuffer = NULL; if (qtdemux->comp_brands) gst_buffer_unref (qtdemux->comp_brands); qtdemux->comp_brands = NULL; if (qtdemux->tag_list) gst_tag_list_free (qtdemux->tag_list); qtdemux->tag_list = NULL; if (qtdemux->element_index) gst_object_unref (qtdemux->element_index); qtdemux->element_index = NULL; gst_adapter_clear (qtdemux->adapter); for (n = 0; n < qtdemux->n_streams; n++) { gst_qtdemux_stream_free (qtdemux, qtdemux->streams[n]); qtdemux->streams[n] = NULL; } qtdemux->major_brand = 0; qtdemux->n_streams = 0; qtdemux->n_video_streams = 0; qtdemux->n_audio_streams = 0; qtdemux->n_sub_streams = 0; gst_segment_init (&qtdemux->segment, GST_FORMAT_TIME); qtdemux->requested_seek_time = GST_CLOCK_TIME_NONE; qtdemux->seek_offset = 0; qtdemux->upstream_seekable = FALSE; qtdemux->upstream_size = 0; break; } default: break; } return result; } static void qtdemux_post_global_tags (GstQTDemux * qtdemux) { if (qtdemux->tag_list) { /* all header tags ready and parsed, push them */ GST_INFO_OBJECT (qtdemux, "posting global tags: %" GST_PTR_FORMAT, qtdemux->tag_list); /* post now, send event on pads later */ gst_element_post_message (GST_ELEMENT (qtdemux), gst_message_new_tag (GST_OBJECT (qtdemux), gst_tag_list_copy (qtdemux->tag_list))); } } static void qtdemux_parse_ftyp (GstQTDemux * qtdemux, const guint8 * buffer, gint length) { /* counts as header data */ qtdemux->header_size += length; /* only consider at least a sufficiently complete ftyp atom */ if (length >= 20) { GstBuffer *buf; qtdemux->major_brand = QT_FOURCC (buffer + 8); GST_DEBUG_OBJECT (qtdemux, "major brand: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (qtdemux->major_brand)); buf = qtdemux->comp_brands = gst_buffer_new_and_alloc (length - 16); memcpy (GST_BUFFER_DATA (buf), buffer + 16, GST_BUFFER_SIZE (buf)); } } static void qtdemux_handle_xmp_taglist (GstQTDemux * qtdemux, GstTagList * taglist) { /* Strip out bogus fields */ if (taglist) { gst_tag_list_remove_tag (taglist, GST_TAG_VIDEO_CODEC); GST_DEBUG_OBJECT (qtdemux, "Found XMP tags %" GST_PTR_FORMAT, taglist); if (qtdemux->tag_list) { /* prioritize native tags using _KEEP mode */ gst_tag_list_insert (qtdemux->tag_list, taglist, GST_TAG_MERGE_KEEP); gst_tag_list_free (taglist); } else qtdemux->tag_list = taglist; } } static void qtdemux_parse_uuid (GstQTDemux * qtdemux, const guint8 * buffer, gint length) { static guint8 xmp_uuid[] = { 0xBE, 0x7A, 0xCF, 0xCB, 0x97, 0xA9, 0x42, 0xE8, 0x9C, 0x71, 0x99, 0x94, 0x91, 0xE3, 0xAF, 0xAC }; guint offset; /* counts as header data */ qtdemux->header_size += length; offset = (QT_UINT32 (buffer) == 0) ? 16 : 8; if (length <= offset + 16) { GST_DEBUG_OBJECT (qtdemux, "uuid atom is too short, skipping"); return; } if (memcmp (buffer + offset, xmp_uuid, 16) == 0) { GstBuffer *buf; GstTagList *taglist; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = (guint8 *) buffer + offset + 16; GST_BUFFER_SIZE (buf) = length - offset - 16; taglist = gst_tag_list_from_xmp_buffer (buf); gst_buffer_unref (buf); qtdemux_handle_xmp_taglist (qtdemux, taglist); } else { GST_DEBUG_OBJECT (qtdemux, "Ignoring unknown uuid"); } } /* caller verifies at least 8 bytes in buf */ static void extract_initial_length_and_fourcc (const guint8 * data, guint size, guint64 * plength, guint32 * pfourcc) { guint64 length; guint32 fourcc; length = QT_UINT32 (data); GST_DEBUG ("length 0x%08" G_GINT64_MODIFIER "x", length); fourcc = QT_FOURCC (data + 4); GST_DEBUG ("atom type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); if (length == 0) { length = G_MAXUINT32; } else if (length == 1 && size >= 16) { /* this means we have an extended size, which is the 64 bit value of * the next 8 bytes */ length = QT_UINT64 (data + 8); GST_DEBUG ("length 0x%08" G_GINT64_MODIFIER "x", length); } if (plength) *plength = length; if (pfourcc) *pfourcc = fourcc; } static gboolean qtdemux_parse_mehd (GstQTDemux * qtdemux, GstByteReader * br) { guint32 version = 0; guint64 duration = 0; if (!gst_byte_reader_get_uint32_be (br, &version)) goto failed; version >>= 24; if (version == 1) { if (!gst_byte_reader_get_uint64_be (br, &duration)) goto failed; } else { guint32 dur = 0; if (!gst_byte_reader_get_uint32_be (br, &dur)) goto failed; duration = dur; } GST_INFO_OBJECT (qtdemux, "mehd duration: %" G_GUINT64_FORMAT, duration); qtdemux->duration = duration; return TRUE; failed: { GST_DEBUG_OBJECT (qtdemux, "parsing mehd failed"); return FALSE; } } static gboolean qtdemux_parse_trex (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 * ds_duration, guint32 * ds_size, guint32 * ds_flags) { if (!stream->parsed_trex && qtdemux->moov_node) { GNode *mvex, *trex; GstByteReader trex_data; mvex = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvex); if (mvex) { trex = qtdemux_tree_get_child_by_type_full (mvex, FOURCC_trex, &trex_data); while (trex) { guint32 id = 0, dur = 0, size = 0, flags = 0; /* skip version/flags */ if (!gst_byte_reader_skip (&trex_data, 4)) goto next; if (!gst_byte_reader_get_uint32_be (&trex_data, &id)) goto next; if (id != stream->track_id) goto next; /* sample description index; ignore */ if (!gst_byte_reader_get_uint32_be (&trex_data, &dur)) goto next; if (!gst_byte_reader_get_uint32_be (&trex_data, &dur)) goto next; if (!gst_byte_reader_get_uint32_be (&trex_data, &size)) goto next; if (!gst_byte_reader_get_uint32_be (&trex_data, &flags)) goto next; GST_DEBUG_OBJECT (qtdemux, "fragment defaults for stream %d; " "duration %d, size %d, flags 0x%x", stream->track_id, dur, size, flags); stream->parsed_trex = TRUE; stream->def_sample_duration = dur; stream->def_sample_size = size; stream->def_sample_flags = flags; next: /* iterate all siblings */ trex = qtdemux_tree_get_sibling_by_type_full (trex, FOURCC_trex, &trex_data); } } } *ds_duration = stream->def_sample_duration; *ds_size = stream->def_sample_size; *ds_size = stream->def_sample_size; /* even then, above values are better than random ... */ if (G_UNLIKELY (!stream->parsed_trex)) { GST_WARNING_OBJECT (qtdemux, "failed to find fragment defaults for stream %d", stream->track_id); return FALSE; } return TRUE; } static gboolean qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun, QtDemuxStream * stream, guint32 d_sample_duration, guint32 d_sample_size, guint32 d_sample_flags, gint64 moof_offset, gint64 moof_length, gint64 * base_offset, gint64 * running_offset) { guint64 timestamp; gint32 data_offset = 0; guint32 flags = 0, first_flags = 0, samples_count = 0; gint i; guint8 *data; guint entry_size, dur_offset, size_offset, flags_offset = 0, ct_offset = 0; QtDemuxSample *sample; gboolean ismv = FALSE; GST_LOG_OBJECT (qtdemux, "parsing trun stream %d; " "default dur %d, size %d, flags 0x%x, base offset %" G_GINT64_FORMAT, stream->track_id, d_sample_duration, d_sample_size, d_sample_flags, *base_offset); /* presence of stss or not can't really tell us much, * and flags and so on tend to be marginally reliable in these files */ if (stream->subtype == FOURCC_soun) { GST_DEBUG_OBJECT (qtdemux, "sound track in fragmented file; marking all keyframes"); stream->all_keyframe = TRUE; } if (!gst_byte_reader_skip (trun, 1) || !gst_byte_reader_get_uint24_be (trun, &flags)) goto fail; if (!gst_byte_reader_get_uint32_be (trun, &samples_count)) goto fail; if (flags & TR_DATA_OFFSET) { /* note this is really signed */ if (!gst_byte_reader_get_int32_be (trun, &data_offset)) goto fail; GST_LOG_OBJECT (qtdemux, "trun data offset %d", data_offset); /* default base offset = first byte of moof */ if (*base_offset == -1) { GST_LOG_OBJECT (qtdemux, "base_offset at moof"); *base_offset = moof_offset; } *running_offset = *base_offset + data_offset; } else { /* if no offset at all, that would mean data starts at moof start, * which is a bit wrong and is ismv crappy way, so compensate * assuming data is in mdat following moof */ if (*base_offset == -1) { *base_offset = moof_offset + moof_length + 8; GST_LOG_OBJECT (qtdemux, "base_offset assumed in mdat after moof"); ismv = TRUE; } if (*running_offset == -1) *running_offset = *base_offset; } GST_LOG_OBJECT (qtdemux, "running offset now %" G_GINT64_FORMAT, *running_offset); GST_LOG_OBJECT (qtdemux, "trun offset %d, flags 0x%x, entries %d", data_offset, flags, samples_count); if (flags & TR_FIRST_SAMPLE_FLAGS) { if (G_UNLIKELY (flags & TR_SAMPLE_FLAGS)) { GST_DEBUG_OBJECT (qtdemux, "invalid flags; SAMPLE and FIRST_SAMPLE present, discarding latter"); flags ^= TR_FIRST_SAMPLE_FLAGS; } else { if (!gst_byte_reader_get_uint32_be (trun, &first_flags)) goto fail; GST_LOG_OBJECT (qtdemux, "first flags: 0x%x", first_flags); } } /* FIXME ? spec says other bits should also be checked to determine * entry size (and prefix size for that matter) */ entry_size = 0; dur_offset = size_offset = 0; if (flags & TR_SAMPLE_DURATION) { GST_LOG_OBJECT (qtdemux, "entry duration present"); dur_offset = entry_size; entry_size += 4; } if (flags & TR_SAMPLE_SIZE) { GST_LOG_OBJECT (qtdemux, "entry size present"); size_offset = entry_size; entry_size += 4; } if (flags & TR_SAMPLE_FLAGS) { GST_LOG_OBJECT (qtdemux, "entry flags present"); flags_offset = entry_size; entry_size += 4; } if (flags & TR_COMPOSITION_TIME_OFFSETS) { GST_LOG_OBJECT (qtdemux, "entry ct offset present"); ct_offset = entry_size; entry_size += 4; } if (!qt_atom_parser_has_chunks (trun, samples_count, entry_size)) goto fail; data = (guint8 *) gst_byte_reader_peek_data_unchecked (trun); if (stream->n_samples >= QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) goto index_too_big; GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u * %u (%.2f MB)", stream->n_samples, (guint) sizeof (QtDemuxSample), stream->n_samples * sizeof (QtDemuxSample) / (1024.0 * 1024.0)); /* create a new array of samples if it's the first sample parsed */ if (stream->n_samples == 0) stream->samples = g_try_new0 (QtDemuxSample, samples_count); /* or try to reallocate it with space enough to insert the new samples */ else stream->samples = g_try_renew (QtDemuxSample, stream->samples, stream->n_samples + samples_count); if (stream->samples == NULL) goto out_of_memory; if (G_UNLIKELY (stream->n_samples == 0)) { /* the timestamp of the first sample is also provided by the tfra entry * but we shouldn't rely on it as it is at the end of files */ timestamp = 0; } else { /* subsequent fragments extend stream */ timestamp = stream->samples[stream->n_samples - 1].timestamp + stream->samples[stream->n_samples - 1].duration; } sample = stream->samples + stream->n_samples; for (i = 0; i < samples_count; i++) { guint32 dur, size, sflags, ct; /* first read sample data */ if (flags & TR_SAMPLE_DURATION) { dur = QT_UINT32 (data + dur_offset); } else { dur = d_sample_duration; } if (flags & TR_SAMPLE_SIZE) { size = QT_UINT32 (data + size_offset); } else { size = d_sample_size; } if (flags & TR_FIRST_SAMPLE_FLAGS) { if (i == 0) { sflags = first_flags; } else { sflags = d_sample_flags; } } else if (flags & TR_SAMPLE_FLAGS) { sflags = QT_UINT32 (data + flags_offset); } else { sflags = d_sample_flags; } if (flags & TR_COMPOSITION_TIME_OFFSETS) { ct = QT_UINT32 (data + ct_offset); } else { ct = 0; } data += entry_size; /* fill the sample information */ sample->offset = *running_offset; sample->pts_offset = ct; sample->size = size; sample->timestamp = timestamp; sample->duration = dur; /* sample-is-difference-sample */ /* ismv seems to use 0x40 for keyframe, 0xc0 for non-keyframe, * now idea how it relates to bitfield other than massive LE/BE confusion */ sample->keyframe = ismv ? ((sflags & 0xff) == 0x40) : !(sflags & 0x10000); *running_offset += size; timestamp += dur; sample++; } stream->n_samples += samples_count; return TRUE; fail: { GST_WARNING_OBJECT (qtdemux, "failed to parse trun"); return FALSE; } out_of_memory: { GST_WARNING_OBJECT (qtdemux, "failed to allocate %d samples", stream->n_samples); return FALSE; } index_too_big: { GST_WARNING_OBJECT (qtdemux, "not allocating index of %d samples, would " "be larger than %uMB (broken file?)", stream->n_samples, QTDEMUX_MAX_SAMPLE_INDEX_SIZE >> 20); return FALSE; } } /* find stream with @id */ static inline QtDemuxStream * qtdemux_find_stream (GstQTDemux * qtdemux, guint32 id) { QtDemuxStream *stream; gint i; /* check */ if (G_UNLIKELY (!id)) { GST_DEBUG_OBJECT (qtdemux, "invalid track id 0"); return NULL; } /* try to get it fast and simple */ if (G_LIKELY (id <= qtdemux->n_streams)) { stream = qtdemux->streams[id - 1]; if (G_LIKELY (stream->track_id == id)) return stream; } /* linear search otherwise */ for (i = 0; i < qtdemux->n_streams; i++) { stream = qtdemux->streams[i]; if (stream->track_id == id) return stream; } return NULL; } static gboolean qtdemux_parse_tfhd (GstQTDemux * qtdemux, GstByteReader * tfhd, QtDemuxStream ** stream, guint32 * default_sample_duration, guint32 * default_sample_size, guint32 * default_sample_flags, gint64 * base_offset) { guint32 flags = 0; guint32 track_id = 0; if (!gst_byte_reader_skip (tfhd, 1) || !gst_byte_reader_get_uint24_be (tfhd, &flags)) goto invalid_track; if (!gst_byte_reader_get_uint32_be (tfhd, &track_id)) goto invalid_track; *stream = qtdemux_find_stream (qtdemux, track_id); if (G_UNLIKELY (!*stream)) goto unknown_stream; if (flags & TF_BASE_DATA_OFFSET) if (!gst_byte_reader_get_uint64_be (tfhd, (guint64 *) base_offset)) goto invalid_track; /* obtain stream defaults */ qtdemux_parse_trex (qtdemux, *stream, default_sample_duration, default_sample_size, default_sample_flags); /* FIXME: Handle TF_SAMPLE_DESCRIPTION_INDEX properly */ if (flags & TF_SAMPLE_DESCRIPTION_INDEX) if (!gst_byte_reader_skip (tfhd, 4)) goto invalid_track; if (flags & TF_DEFAULT_SAMPLE_DURATION) if (!gst_byte_reader_get_uint32_be (tfhd, default_sample_duration)) goto invalid_track; if (flags & TF_DEFAULT_SAMPLE_SIZE) if (!gst_byte_reader_get_uint32_be (tfhd, default_sample_size)) goto invalid_track; if (flags & TF_DEFAULT_SAMPLE_FLAGS) if (!gst_byte_reader_get_uint32_be (tfhd, default_sample_flags)) goto invalid_track; return TRUE; invalid_track: { GST_WARNING_OBJECT (qtdemux, "invalid track fragment header"); return FALSE; } unknown_stream: { GST_DEBUG_OBJECT (qtdemux, "unknown stream in tfhd"); return TRUE; } } static gboolean qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length, guint64 moof_offset, QtDemuxStream * stream) { GNode *moof_node, *traf_node, *tfhd_node, *trun_node; GstByteReader trun_data, tfhd_data; guint32 ds_size = 0, ds_duration = 0, ds_flags = 0; gint64 base_offset, running_offset; /* NOTE @stream ignored */ moof_node = g_node_new ((guint8 *) buffer); qtdemux_parse_node (qtdemux, moof_node, buffer, length); qtdemux_node_dump (qtdemux, moof_node); /* unknown base_offset to start with */ base_offset = running_offset = -1; traf_node = qtdemux_tree_get_child_by_type (moof_node, FOURCC_traf); while (traf_node) { /* Fragment Header node */ tfhd_node = qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_tfhd, &tfhd_data); if (!tfhd_node) goto missing_tfhd; if (!qtdemux_parse_tfhd (qtdemux, &tfhd_data, &stream, &ds_duration, &ds_size, &ds_flags, &base_offset)) goto missing_tfhd; if (G_UNLIKELY (!stream)) { /* we lost track of offset, we'll need to regain it, * but can delay complaining until later or avoid doing so altogether */ base_offset = -2; goto next; } if (G_UNLIKELY (base_offset < -1)) goto lost_offset; /* Track Run node */ trun_node = qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_trun, &trun_data); while (trun_node) { qtdemux_parse_trun (qtdemux, &trun_data, stream, ds_duration, ds_size, ds_flags, moof_offset, length, &base_offset, &running_offset); /* iterate all siblings */ trun_node = qtdemux_tree_get_sibling_by_type_full (trun_node, FOURCC_trun, &trun_data); } /* if no new base_offset provided for next traf, * base is end of current traf */ base_offset = running_offset; running_offset = -1; next: /* iterate all siblings */ traf_node = qtdemux_tree_get_sibling_by_type (traf_node, FOURCC_traf); } g_node_destroy (moof_node); return TRUE; missing_tfhd: { GST_DEBUG_OBJECT (qtdemux, "missing tfhd box"); goto fail; } lost_offset: { GST_DEBUG_OBJECT (qtdemux, "lost offset"); goto fail; } fail: { g_node_destroy (moof_node); GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), (NULL)); return FALSE; } } /* might be used if some day we actually use mfra & co * for random access to fragments, * but that will require quite some modifications and much less relying * on a sample array */ #if 0 static gboolean qtdemux_parse_tfra (GstQTDemux * qtdemux, GNode * tfra_node, QtDemuxStream * stream) { guint64 time = 0, moof_offset = 0; guint32 ver_flags, track_id, len, num_entries, i; guint value_size, traf_size, trun_size, sample_size; GstBuffer *buf = NULL; GstFlowReturn ret; GstByteReader tfra; gst_byte_reader_init (&tfra, (guint8 *) tfra_node->data + (4 + 4), QT_UINT32 ((guint8 *) tfra_node->data) - (4 + 4)); if (!gst_byte_reader_get_uint32_be (&tfra, &ver_flags)) return FALSE; if (!(gst_byte_reader_get_uint32_be (&tfra, &track_id) && gst_byte_reader_get_uint32_be (&tfra, &len) && gst_byte_reader_get_uint32_be (&tfra, &num_entries))) return FALSE; GST_LOG_OBJECT (qtdemux, "id %d == stream id %d ?", track_id, stream->track_id); if (track_id != stream->track_id) { return FALSE; } value_size = ((ver_flags >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); sample_size = (len & 3) + 1; trun_size = ((len & 12) >> 2) + 1; traf_size = ((len & 48) >> 4) + 1; if (num_entries == 0) goto no_samples; if (!qt_atom_parser_has_chunks (&tfra, num_entries, value_size + value_size + traf_size + trun_size + sample_size)) goto corrupt_file; for (i = 0; i < num_entries; i++) { qt_atom_parser_get_offset (&tfra, value_size, &time); qt_atom_parser_get_offset (&tfra, value_size, &moof_offset); qt_atom_parser_get_uint_with_size_unchecked (&tfra, traf_size); qt_atom_parser_get_uint_with_size_unchecked (&tfra, trun_size); qt_atom_parser_get_uint_with_size_unchecked (&tfra, sample_size); GST_LOG_OBJECT (qtdemux, "fragment time: %" GST_TIME_FORMAT " moof_offset: %u", GST_TIME_ARGS (gst_util_uint64_scale (time, GST_SECOND, stream->timescale)), moof_offset); ret = gst_qtdemux_pull_atom (qtdemux, moof_offset, 0, &buf); if (ret != GST_FLOW_OK) goto corrupt_file; qtdemux_parse_moof (qtdemux, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), moof_offset, stream); gst_buffer_unref (buf); } return TRUE; /* ERRORS */ corrupt_file: { GST_ELEMENT_ERROR (qtdemux, STREAM, DECODE, (_("This file is corrupt and cannot be played.")), (NULL)); return FALSE; } no_samples: { GST_WARNING_OBJECT (qtdemux, "stream has no samples"); return FALSE; } } static gboolean qtdemux_parse_mfra (GstQTDemux * qtdemux, QtDemuxStream * stream) { GstFlowReturn ret; GNode *mfra_node, *tfra_node; GstBuffer *buffer; if (!qtdemux->mfra_offset) return FALSE; ret = gst_qtdemux_pull_atom (qtdemux, qtdemux->mfra_offset, 0, &buffer); if (ret != GST_FLOW_OK) goto corrupt_file; mfra_node = g_node_new ((guint8 *) GST_BUFFER_DATA (buffer)); qtdemux_parse_node (qtdemux, mfra_node, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); tfra_node = qtdemux_tree_get_child_by_type (mfra_node, FOURCC_tfra); while (tfra_node) { qtdemux_parse_tfra (qtdemux, tfra_node, stream); /* iterate all siblings */ tfra_node = qtdemux_tree_get_sibling_by_type (tfra_node, FOURCC_tfra); } g_node_destroy (mfra_node); gst_buffer_unref (buffer); return TRUE; corrupt_file: { GST_ELEMENT_ERROR (qtdemux, STREAM, DECODE, (_("This file is corrupt and cannot be played.")), (NULL)); return FALSE; } } static GstFlowReturn qtdemux_parse_mfro (GstQTDemux * qtdemux, guint64 * mfra_offset, guint32 * mfro_size) { GstFlowReturn ret = GST_FLOW_ERROR; GstBuffer *mfro = NULL; guint32 fourcc; gint64 len; GstFormat fmt = GST_FORMAT_BYTES; if (!gst_pad_query_peer_duration (qtdemux->sinkpad, &fmt, &len)) { GST_DEBUG_OBJECT (qtdemux, "upstream size not available; " "can not locate mfro"); goto exit; } ret = gst_qtdemux_pull_atom (qtdemux, len - 16, 16, &mfro); if (ret != GST_FLOW_OK) goto exit; fourcc = QT_FOURCC (GST_BUFFER_DATA (mfro) + 4); if (fourcc != FOURCC_mfro) goto exit; GST_INFO_OBJECT (qtdemux, "Found mfro atom: fragmented mp4 container"); if (GST_BUFFER_SIZE (mfro) >= 16) { GST_DEBUG_OBJECT (qtdemux, "parsing 'mfro' atom"); *mfro_size = QT_UINT32 (GST_BUFFER_DATA (mfro) + 12); if (*mfro_size >= len) { GST_WARNING_OBJECT (qtdemux, "mfro.size is invalid"); ret = GST_FLOW_ERROR; goto exit; } *mfra_offset = len - *mfro_size; } exit: if (mfro) gst_buffer_unref (mfro); return ret; } static void qtdemux_parse_fragmented (GstQTDemux * qtdemux) { GstFlowReturn ret; guint32 mfra_size = 0; guint64 mfra_offset = 0; /* default */ qtdemux->fragmented = FALSE; /* We check here if it is a fragmented mp4 container */ ret = qtdemux_parse_mfro (qtdemux, &mfra_offset, &mfra_size); if (ret == GST_FLOW_OK && mfra_size != 0 && mfra_offset != 0) { qtdemux->fragmented = TRUE; GST_DEBUG_OBJECT (qtdemux, "mfra atom expected at offset %" G_GUINT64_FORMAT, mfra_offset); qtdemux->mfra_offset = mfra_offset; } } #endif static GstFlowReturn gst_qtdemux_loop_state_header (GstQTDemux * qtdemux) { guint64 length = 0; guint32 fourcc = 0; GstBuffer *buf = NULL; GstFlowReturn ret = GST_FLOW_OK; guint64 cur_offset = qtdemux->offset; ret = gst_pad_pull_range (qtdemux->sinkpad, cur_offset, 16, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto beach; if (G_LIKELY (GST_BUFFER_SIZE (buf) >= 8)) extract_initial_length_and_fourcc (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), &length, &fourcc); gst_buffer_unref (buf); /* maybe we already got most we needed, so only consider this eof */ if (G_UNLIKELY (length == 0)) { GST_ELEMENT_WARNING (qtdemux, STREAM, DEMUX, (_("Invalid atom size.")), ("Header atom '%" GST_FOURCC_FORMAT "' has empty length", GST_FOURCC_ARGS (fourcc))); ret = GST_FLOW_UNEXPECTED; goto beach; } switch (fourcc) { case FOURCC_moof: /* record for later parsing when needed */ if (!qtdemux->moof_offset) { qtdemux->moof_offset = qtdemux->offset; } /* fall-through */ case FOURCC_mdat: case FOURCC_free: case FOURCC_wide: case FOURCC_PICT: case FOURCC_pnot: { GST_LOG_OBJECT (qtdemux, "skipping atom '%" GST_FOURCC_FORMAT "' at %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), cur_offset); qtdemux->offset += length; break; } case FOURCC_moov: { GstBuffer *moov; if (qtdemux->got_moov) { GST_DEBUG_OBJECT (qtdemux, "Skipping moov atom as we have one already"); qtdemux->offset += length; goto beach; } ret = gst_pad_pull_range (qtdemux->sinkpad, cur_offset, length, &moov); if (ret != GST_FLOW_OK) goto beach; if (length != GST_BUFFER_SIZE (moov)) { /* Some files have a 'moov' atom at the end of the file which contains * a terminal 'free' atom where the body of the atom is missing. * Check for, and permit, this special case. */ if (GST_BUFFER_SIZE (moov) >= 8) { guint8 *final_data = GST_BUFFER_DATA (moov) + (GST_BUFFER_SIZE (moov) - 8); guint32 final_length = QT_UINT32 (final_data); guint32 final_fourcc = QT_FOURCC (final_data + 4); if (final_fourcc == FOURCC_free && GST_BUFFER_SIZE (moov) + final_length - 8 == length) { /* Ok, we've found that special case. Allocate a new buffer with * that free atom actually present. */ GstBuffer *newmoov = gst_buffer_new_and_alloc (length); gst_buffer_copy_metadata (newmoov, moov, GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_CAPS); memcpy (GST_BUFFER_DATA (newmoov), GST_BUFFER_DATA (moov), GST_BUFFER_SIZE (moov)); memset (GST_BUFFER_DATA (newmoov) + GST_BUFFER_SIZE (moov), 0, final_length - 8); gst_buffer_unref (moov); moov = newmoov; } } } if (length != GST_BUFFER_SIZE (moov)) { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is incomplete and cannot be played.")), ("We got less than expected (received %u, wanted %u, offset %" G_GUINT64_FORMAT ")", GST_BUFFER_SIZE (moov), (guint) length, cur_offset)); gst_buffer_unref (moov); ret = GST_FLOW_ERROR; goto beach; } qtdemux->offset += length; qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length); qtdemux_node_dump (qtdemux, qtdemux->moov_node); qtdemux_parse_tree (qtdemux); g_node_destroy (qtdemux->moov_node); gst_buffer_unref (moov); qtdemux->moov_node = NULL; qtdemux->got_moov = TRUE; break; } case FOURCC_ftyp: { GstBuffer *ftyp; /* extract major brand; might come in handy for ISO vs QT issues */ ret = gst_qtdemux_pull_atom (qtdemux, cur_offset, length, &ftyp); if (ret != GST_FLOW_OK) goto beach; qtdemux->offset += length; qtdemux_parse_ftyp (qtdemux, GST_BUFFER_DATA (ftyp), GST_BUFFER_SIZE (ftyp)); gst_buffer_unref (ftyp); break; } case FOURCC_uuid: { GstBuffer *uuid; /* uuid are extension atoms */ ret = gst_qtdemux_pull_atom (qtdemux, cur_offset, length, &uuid); if (ret != GST_FLOW_OK) goto beach; qtdemux->offset += length; qtdemux_parse_uuid (qtdemux, GST_BUFFER_DATA (uuid), GST_BUFFER_SIZE (uuid)); gst_buffer_unref (uuid); break; } default: { GstBuffer *unknown; GST_LOG_OBJECT (qtdemux, "unknown %08x '%" GST_FOURCC_FORMAT "' of size %" G_GUINT64_FORMAT " at %" G_GUINT64_FORMAT, fourcc, GST_FOURCC_ARGS (fourcc), length, cur_offset); ret = gst_qtdemux_pull_atom (qtdemux, cur_offset, length, &unknown); if (ret != GST_FLOW_OK) goto beach; GST_MEMDUMP ("Unknown tag", GST_BUFFER_DATA (unknown), GST_BUFFER_SIZE (unknown)); gst_buffer_unref (unknown); qtdemux->offset += length; break; } } beach: if (ret == GST_FLOW_UNEXPECTED && qtdemux->got_moov) { /* digested all data, show what we have */ ret = qtdemux_expose_streams (qtdemux); /* Only post, event on pads is done after newsegment */ qtdemux_post_global_tags (qtdemux); qtdemux->state = QTDEMUX_STATE_MOVIE; GST_DEBUG_OBJECT (qtdemux, "switching state to STATE_MOVIE (%d)", qtdemux->state); return ret; } return ret; } /* Seeks to the previous keyframe of the indexed stream and * aligns other streams with respect to the keyframe timestamp * of indexed stream. Only called in case of Reverse Playback */ static GstFlowReturn gst_qtdemux_seek_to_previous_keyframe (GstQTDemux * qtdemux) { guint8 n = 0; guint32 seg_idx = 0, k_index = 0; guint32 ref_seg_idx, ref_k_index; guint64 k_pos = 0, last_stop = 0; QtDemuxSegment *seg = NULL; QtDemuxStream *ref_str = NULL; guint64 seg_media_start_mov; /* segment media start time in mov format */ /* Now we choose an arbitrary stream, get the previous keyframe timestamp * and finally align all the other streams on that timestamp with their * respective keyframes */ for (n = 0; n < qtdemux->n_streams; n++) { QtDemuxStream *str = qtdemux->streams[n]; seg_idx = gst_qtdemux_find_segment (qtdemux, str, qtdemux->segment.last_stop); /* segment not found, continue with normal flow */ if (seg_idx == -1) continue; /* No candidate yet, take that one */ if (!ref_str) { ref_str = str; continue; } /* So that stream has a segment, we prefer video streams */ if (str->subtype == FOURCC_vide) { ref_str = str; break; } } if (G_UNLIKELY (!ref_str)) { GST_DEBUG_OBJECT (qtdemux, "couldn't find any stream"); goto eos; } if (G_UNLIKELY (!ref_str->from_sample)) { GST_DEBUG_OBJECT (qtdemux, "reached the beginning of the file"); goto eos; } /* So that stream has been playing from from_sample to to_sample. We will * get the timestamp of the previous sample and search for a keyframe before * that. For audio streams we do an arbitrary jump in the past (10 samples) */ if (ref_str->subtype == FOURCC_vide) { k_index = gst_qtdemux_find_keyframe (qtdemux, ref_str, ref_str->from_sample - 1); } else { if (ref_str->from_sample >= 10) k_index = ref_str->from_sample - 10; else k_index = 0; } /* get current segment for that stream */ seg = &ref_str->segments[ref_str->segment_index]; /* convert seg->media_start to mov format time for timestamp comparison */ seg_media_start_mov = gst_util_uint64_scale (seg->media_start, ref_str->timescale, GST_SECOND); /* Crawl back through segments to find the one containing this I frame */ while (ref_str->samples[k_index].timestamp < seg_media_start_mov) { GST_DEBUG_OBJECT (qtdemux, "keyframe position is out of segment %u", ref_str->segment_index); if (G_UNLIKELY (!ref_str->segment_index)) { /* Reached first segment, let's consider it's EOS */ goto eos; } ref_str->segment_index--; seg = &ref_str->segments[ref_str->segment_index]; /* convert seg->media_start to mov format time for timestamp comparison */ seg_media_start_mov = gst_util_uint64_scale (seg->media_start, ref_str->timescale, GST_SECOND); } /* Calculate time position of the keyframe and where we should stop */ k_pos = (gst_util_uint64_scale (ref_str->samples[k_index].timestamp, GST_SECOND, ref_str->timescale) - seg->media_start) + seg->time; last_stop = gst_util_uint64_scale (ref_str->samples[ref_str->from_sample].timestamp, GST_SECOND, ref_str->timescale); last_stop = (last_stop - seg->media_start) + seg->time; GST_DEBUG_OBJECT (qtdemux, "preferred stream played from sample %u, " "now going to sample %u (pts %" GST_TIME_FORMAT ")", ref_str->from_sample, k_index, GST_TIME_ARGS (k_pos)); /* Set last_stop with the keyframe timestamp we pushed of that stream */ gst_segment_set_last_stop (&qtdemux->segment, GST_FORMAT_TIME, last_stop); GST_DEBUG_OBJECT (qtdemux, "last_stop now is %" GST_TIME_FORMAT, GST_TIME_ARGS (last_stop)); if (G_UNLIKELY (last_stop < qtdemux->segment.start)) { GST_DEBUG_OBJECT (qtdemux, "reached the beginning of segment"); goto eos; } ref_seg_idx = ref_str->segment_index; ref_k_index = k_index; /* Align them all on this */ for (n = 0; n < qtdemux->n_streams; n++) { guint32 index = 0; guint64 media_start = 0, seg_time = 0; QtDemuxStream *str = qtdemux->streams[n]; /* aligning reference stream again might lead to backing up to yet another * keyframe (due to timestamp rounding issues), * potentially putting more load on downstream; so let's try to avoid */ if (str == ref_str) { seg_idx = ref_seg_idx; seg = &str->segments[seg_idx]; k_index = ref_k_index; GST_DEBUG_OBJECT (qtdemux, "reference stream segment %d, " "sample at index %d", ref_str->segment_index, k_index); } else { seg_idx = gst_qtdemux_find_segment (qtdemux, str, k_pos); GST_DEBUG_OBJECT (qtdemux, "align segment %d", seg_idx); /* segment not found, continue with normal flow */ if (seg_idx == -1) continue; /* get segment and time in the segment */ seg = &str->segments[seg_idx]; seg_time = k_pos - seg->time; /* get the media time in the segment */ media_start = seg->media_start + seg_time; /* get the index of the sample with media time */ index = gst_qtdemux_find_index_linear (qtdemux, str, media_start); GST_DEBUG_OBJECT (qtdemux, "sample for %" GST_TIME_FORMAT " at %u", GST_TIME_ARGS (media_start), index); /* find previous keyframe */ k_index = gst_qtdemux_find_keyframe (qtdemux, str, index); } /* Remember until where we want to go */ str->to_sample = str->from_sample - 1; /* Define our time position */ str->time_position = (gst_util_uint64_scale (str->samples[k_index].timestamp, GST_SECOND, str->timescale) - seg->media_start) + seg->time; /* Now seek back in time */ gst_qtdemux_move_stream (qtdemux, str, k_index); GST_DEBUG_OBJECT (qtdemux, "keyframe at %u, time position %" GST_TIME_FORMAT " playing from sample %u to %u", k_index, GST_TIME_ARGS (str->time_position), str->from_sample, str->to_sample); } return GST_FLOW_OK; eos: return GST_FLOW_UNEXPECTED; } /* activate the given segment number @seg_idx of @stream at time @offset. * @offset is an absolute global position over all the segments. * * This will push out a NEWSEGMENT event with the right values and * position the stream index to the first decodable sample before * @offset. */ static gboolean gst_qtdemux_activate_segment (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 seg_idx, guint64 offset) { GstEvent *event; QtDemuxSegment *segment; guint32 index, kf_index; guint64 seg_time; guint64 start, stop, time; gdouble rate; GST_LOG_OBJECT (qtdemux, "activate segment %d, offset %" G_GUINT64_FORMAT, seg_idx, offset); /* update the current segment */ stream->segment_index = seg_idx; /* get the segment */ segment = &stream->segments[seg_idx]; if (G_UNLIKELY (offset < segment->time)) { GST_WARNING_OBJECT (qtdemux, "offset < segment->time %" G_GUINT64_FORMAT, segment->time); return FALSE; } /* segment lies beyond total indicated duration */ if (G_UNLIKELY (qtdemux->segment.duration != -1 && segment->time > qtdemux->segment.duration)) { GST_WARNING_OBJECT (qtdemux, "file duration %" G_GINT64_FORMAT " < segment->time %" G_GUINT64_FORMAT, qtdemux->segment.duration, segment->time); return FALSE; } /* get time in this segment */ seg_time = offset - segment->time; GST_LOG_OBJECT (qtdemux, "seg_time %" GST_TIME_FORMAT, GST_TIME_ARGS (seg_time)); if (G_UNLIKELY (seg_time > segment->duration)) { GST_LOG_OBJECT (qtdemux, "seg_time > segment->duration %" GST_TIME_FORMAT, GST_TIME_ARGS (segment->duration)); return FALSE; } /* qtdemux->segment.stop is in outside-time-realm, whereas * segment->media_stop is in track-time-realm. * * In order to compare the two, we need to bring segment.stop * into the track-time-realm */ stop = qtdemux->segment.stop; if (stop == -1) stop = qtdemux->segment.duration; if (stop == -1) stop = segment->media_stop; else stop = MIN (segment->media_stop, stop - segment->time + segment->media_start); if (qtdemux->segment.rate >= 0) { start = MIN (segment->media_start + seg_time, stop); time = offset; } else { if (segment->media_start >= qtdemux->segment.start) { start = segment->media_start; time = segment->time; } else { start = qtdemux->segment.start; time = segment->time + (qtdemux->segment.start - segment->media_start); } start = MAX (segment->media_start, qtdemux->segment.start); stop = MIN (segment->media_start + seg_time, stop); } GST_DEBUG_OBJECT (qtdemux, "newsegment %d from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, seg_idx, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); /* combine global rate with that of the segment */ rate = segment->rate * qtdemux->segment.rate; /* update the segment values used for clipping */ gst_segment_init (&stream->segment, GST_FORMAT_TIME); gst_segment_set_newsegment (&stream->segment, FALSE, rate, GST_FORMAT_TIME, start, stop, time); /* now prepare and send the segment */ if (stream->pad) { event = gst_event_new_new_segment (FALSE, rate, GST_FORMAT_TIME, start, stop, time); gst_pad_push_event (stream->pad, event); /* assume we can send more data now */ stream->last_ret = GST_FLOW_OK; /* clear to send tags on this pad now */ gst_qtdemux_push_tags (qtdemux, stream); } /* and move to the keyframe before the indicated media time of the * segment */ if (qtdemux->segment.rate >= 0) { index = gst_qtdemux_find_index_linear (qtdemux, stream, start); stream->to_sample = G_MAXUINT32; GST_DEBUG_OBJECT (qtdemux, "moving data pointer to %" GST_TIME_FORMAT ", index: %u, pts %" GST_TIME_FORMAT, GST_TIME_ARGS (start), index, GST_TIME_ARGS (gst_util_uint64_scale (stream->samples[index].timestamp, GST_SECOND, stream->timescale))); } else { index = gst_qtdemux_find_index_linear (qtdemux, stream, stop); stream->to_sample = index; GST_DEBUG_OBJECT (qtdemux, "moving data pointer to %" GST_TIME_FORMAT ", index: %u, pts %" GST_TIME_FORMAT, GST_TIME_ARGS (stop), index, GST_TIME_ARGS (gst_util_uint64_scale (stream->samples[index].timestamp, GST_SECOND, stream->timescale))); } /* gst_qtdemux_parse_sample () called from gst_qtdemux_find_index_linear () * encountered an error and printed a message so we return appropriately */ if (index == -1) return FALSE; /* we're at the right spot */ if (index == stream->sample_index) { GST_DEBUG_OBJECT (qtdemux, "we are at the right index"); return TRUE; } /* find keyframe of the target index */ kf_index = gst_qtdemux_find_keyframe (qtdemux, stream, index); /* *INDENT-OFF* */ /* indent does stupid stuff with stream->samples[].timestamp */ /* if we move forwards, we don't have to go back to the previous * keyframe since we already sent that. We can also just jump to * the keyframe right before the target index if there is one. */ if (index > stream->sample_index) { /* moving forwards check if we move past a keyframe */ if (kf_index > stream->sample_index) { GST_DEBUG_OBJECT (qtdemux, "moving forwards to keyframe at %u (pts %" GST_TIME_FORMAT, kf_index, GST_TIME_ARGS (gst_util_uint64_scale ( stream->samples[kf_index].timestamp, GST_SECOND, stream->timescale))); gst_qtdemux_move_stream (qtdemux, stream, kf_index); } else { GST_DEBUG_OBJECT (qtdemux, "moving forwards, keyframe at %u (pts %" GST_TIME_FORMAT " already sent", kf_index, GST_TIME_ARGS (gst_util_uint64_scale ( stream->samples[kf_index].timestamp, GST_SECOND, stream->timescale))); } } else { GST_DEBUG_OBJECT (qtdemux, "moving backwards to keyframe at %u (pts %" GST_TIME_FORMAT, kf_index, GST_TIME_ARGS (gst_util_uint64_scale ( stream->samples[kf_index].timestamp, GST_SECOND, stream->timescale))); gst_qtdemux_move_stream (qtdemux, stream, kf_index); } /* *INDENT-ON* */ return TRUE; } /* prepare to get the current sample of @stream, getting essential values. * * This function will also prepare and send the segment when needed. * * Return FALSE if the stream is EOS. */ static gboolean gst_qtdemux_prepare_current_sample (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 * offset, guint * size, guint64 * timestamp, guint64 * duration, gboolean * keyframe) { QtDemuxSample *sample; guint64 time_position; guint32 seg_idx; g_return_val_if_fail (stream != NULL, FALSE); time_position = stream->time_position; if (G_UNLIKELY (time_position == -1)) goto eos; seg_idx = stream->segment_index; if (G_UNLIKELY (seg_idx == -1)) { /* find segment corresponding to time_position if we are looking * for a segment. */ seg_idx = gst_qtdemux_find_segment (qtdemux, stream, time_position); /* nothing found, we're really eos */ if (seg_idx == -1) goto eos; } /* different segment, activate it, sample_index will be set. */ if (G_UNLIKELY (stream->segment_index != seg_idx)) gst_qtdemux_activate_segment (qtdemux, stream, seg_idx, time_position); GST_LOG_OBJECT (qtdemux, "segment active, index = %u of %u", stream->sample_index, stream->n_samples); if (G_UNLIKELY (stream->sample_index >= stream->n_samples)) goto eos; if (!qtdemux_parse_samples (qtdemux, stream, stream->sample_index)) { GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", stream->sample_index); return FALSE; } /* now get the info for the sample we're at */ sample = &stream->samples[stream->sample_index]; *timestamp = QTSAMPLE_PTS (stream, sample); *offset = sample->offset; *size = sample->size; *duration = QTSAMPLE_DUR_PTS (stream, sample, *timestamp); *keyframe = QTSAMPLE_KEYFRAME (stream, sample); return TRUE; /* special cases */ eos: { stream->time_position = -1; return FALSE; } } /* move to the next sample in @stream. * * Moves to the next segment when needed. */ static void gst_qtdemux_advance_sample (GstQTDemux * qtdemux, QtDemuxStream * stream) { QtDemuxSample *sample; QtDemuxSegment *segment; if (G_UNLIKELY (stream->sample_index >= stream->to_sample)) { /* Mark the stream as EOS */ GST_DEBUG_OBJECT (qtdemux, "reached max allowed sample %u, mark EOS", stream->to_sample); stream->time_position = -1; return; } /* move to next sample */ stream->sample_index++; /* get current segment */ segment = &stream->segments[stream->segment_index]; /* reached the last sample, we need the next segment */ if (G_UNLIKELY (stream->sample_index >= stream->n_samples)) goto next_segment; if (!qtdemux_parse_samples (qtdemux, stream, stream->sample_index)) { GST_LOG_OBJECT (qtdemux, "Parsing of index %u failed!", stream->sample_index); return; } /* get next sample */ sample = &stream->samples[stream->sample_index]; /* see if we are past the segment */ if (G_UNLIKELY (gst_util_uint64_scale (sample->timestamp, GST_SECOND, stream->timescale) >= segment->media_stop)) goto next_segment; if (gst_util_uint64_scale (sample->timestamp, GST_SECOND, stream->timescale) >= segment->media_start) { /* inside the segment, update time_position, looks very familiar to * GStreamer segments, doesn't it? */ stream->time_position = (gst_util_uint64_scale (sample->timestamp, GST_SECOND, stream->timescale) - segment->media_start) + segment->time; } else { /* not yet in segment, time does not yet increment. This means * that we are still prerolling keyframes to the decoder so it can * decode the first sample of the segment. */ stream->time_position = segment->time; } return; /* move to the next segment */ next_segment: { GST_DEBUG_OBJECT (qtdemux, "segment %d ended ", stream->segment_index); if (stream->segment_index == stream->n_segments - 1) { /* are we at the end of the last segment, we're EOS */ stream->time_position = -1; } else { /* else we're only at the end of the current segment */ stream->time_position = segment->stop_time; } /* make sure we select a new segment */ stream->segment_index = -1; } } static void gst_qtdemux_sync_streams (GstQTDemux * demux) { gint i; if (demux->n_streams <= 1) return; for (i = 0; i < demux->n_streams; i++) { QtDemuxStream *stream; GstClockTime end_time; stream = demux->streams[i]; if (!stream->pad) continue; /* TODO advance time on subtitle streams here, if any some day */ /* some clips/trailers may have unbalanced streams at the end, * so send EOS on shorter stream to prevent stalling others */ /* do not mess with EOS if SEGMENT seeking */ if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) continue; if (demux->pullbased) { /* loop mode is sample time based */ if (stream->time_position != -1) continue; } else { /* push mode is byte position based */ if (stream->n_samples && stream->samples[stream->n_samples - 1].offset >= demux->offset) continue; } if (stream->sent_eos) continue; /* only act if some gap */ end_time = stream->segments[stream->n_segments - 1].stop_time; GST_LOG_OBJECT (demux, "current position: %" GST_TIME_FORMAT ", stream end: %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->segment.last_stop), GST_TIME_ARGS (end_time)); if (end_time + 2 * GST_SECOND < demux->segment.last_stop) { GST_DEBUG_OBJECT (demux, "sending EOS for stream %s", GST_PAD_NAME (stream->pad)); stream->sent_eos = TRUE; gst_pad_push_event (stream->pad, gst_event_new_eos ()); } } } /* UNEXPECTED and NOT_LINKED need to be combined. This means that we return: * * GST_FLOW_NOT_LINKED: when all pads NOT_LINKED. * GST_FLOW_UNEXPECTED: when all pads UNEXPECTED or NOT_LINKED. */ static GstFlowReturn gst_qtdemux_combine_flows (GstQTDemux * demux, QtDemuxStream * stream, GstFlowReturn ret) { gint i; gboolean unexpected = FALSE, not_linked = TRUE; GST_LOG_OBJECT (demux, "flow return: %s", gst_flow_get_name (ret)); /* store the value */ stream->last_ret = ret; /* any other error that is not-linked or eos can be returned right away */ if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) goto done; /* only return NOT_LINKED if all other pads returned NOT_LINKED */ for (i = 0; i < demux->n_streams; i++) { QtDemuxStream *ostream = demux->streams[i]; ret = ostream->last_ret; /* no unexpected or unlinked, return */ if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) goto done; /* we check to see if we have at least 1 unexpected or all unlinked */ unexpected |= (ret == GST_FLOW_UNEXPECTED); not_linked &= (ret == GST_FLOW_NOT_LINKED); } /* when we get here, we all have unlinked or unexpected */ if (not_linked) ret = GST_FLOW_NOT_LINKED; else if (unexpected) ret = GST_FLOW_UNEXPECTED; done: GST_LOG_OBJECT (demux, "combined flow return: %s", gst_flow_get_name (ret)); return ret; } /* the input buffer metadata must be writable. Returns NULL when the buffer is * completely cliped */ static GstBuffer * gst_qtdemux_clip_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, GstBuffer * buf) { gint64 start, stop, cstart, cstop, diff; GstClockTime timestamp = GST_CLOCK_TIME_NONE, duration = GST_CLOCK_TIME_NONE; guint8 *data; guint size; gint num_rate, denom_rate; gint frame_size; gboolean clip_data; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* depending on the type, setup the clip parameters */ if (stream->subtype == FOURCC_soun) { frame_size = stream->bytes_per_frame; num_rate = GST_SECOND; denom_rate = (gint) stream->rate; clip_data = TRUE; } else if (stream->subtype == FOURCC_vide) { frame_size = size; num_rate = stream->fps_n; denom_rate = stream->fps_d; clip_data = FALSE; } else goto wrong_type; /* we can only clip if we have a valid timestamp */ timestamp = GST_BUFFER_TIMESTAMP (buf); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) goto no_timestamp; if (G_LIKELY (GST_BUFFER_DURATION_IS_VALID (buf))) { duration = GST_BUFFER_DURATION (buf); } else { duration = gst_util_uint64_scale_int (size / frame_size, num_rate, denom_rate); } start = timestamp; stop = start + duration; if (G_UNLIKELY (!gst_segment_clip (&stream->segment, GST_FORMAT_TIME, start, stop, &cstart, &cstop))) goto clipped; /* see if some clipping happened */ diff = cstart - start; if (diff > 0) { timestamp = cstart; duration -= diff; if (clip_data) { /* bring clipped time to samples and to bytes */ diff = gst_util_uint64_scale_int (diff, denom_rate, num_rate); diff *= frame_size; GST_DEBUG_OBJECT (qtdemux, "clipping start to %" GST_TIME_FORMAT " %" G_GUINT64_FORMAT " bytes", GST_TIME_ARGS (cstart), diff); data += diff; size -= diff; } } diff = stop - cstop; if (diff > 0) { duration -= diff; if (clip_data) { /* bring clipped time to samples and then to bytes */ diff = gst_util_uint64_scale_int (diff, denom_rate, num_rate); diff *= frame_size; GST_DEBUG_OBJECT (qtdemux, "clipping stop to %" GST_TIME_FORMAT " %" G_GUINT64_FORMAT " bytes", GST_TIME_ARGS (cstop), diff); size -= diff; } } GST_BUFFER_TIMESTAMP (buf) = timestamp; GST_BUFFER_DURATION (buf) = duration; GST_BUFFER_SIZE (buf) = size; GST_BUFFER_DATA (buf) = data; return buf; /* dropped buffer */ wrong_type: { GST_DEBUG_OBJECT (qtdemux, "unknown stream type"); return buf; } no_timestamp: { GST_DEBUG_OBJECT (qtdemux, "no timestamp on buffer"); return buf; } clipped: { GST_DEBUG_OBJECT (qtdemux, "clipped buffer"); gst_buffer_unref (buf); return NULL; } } /* the input buffer metadata must be writable, * but time/duration etc not yet set and need not be preserved */ static GstBuffer * gst_qtdemux_process_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, GstBuffer * buf) { guint8 *data; guint size, nsize = 0; gchar *str; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* not many cases for now */ if (G_UNLIKELY (stream->fourcc == FOURCC_mp4s)) { /* send a one time dvd clut event */ if (stream->pending_event && stream->pad) gst_pad_push_event (stream->pad, stream->pending_event); stream->pending_event = NULL; /* no further processing needed */ stream->need_process = FALSE; } if (G_UNLIKELY (stream->subtype != FOURCC_text)) { return buf; } if (G_LIKELY (size >= 2)) { nsize = GST_READ_UINT16_BE (data); nsize = MIN (nsize, size - 2); } GST_LOG_OBJECT (qtdemux, "3GPP timed text subtitle: %d/%d", nsize, size); /* takes care of UTF-8 validation or UTF-16 recognition, * no other encoding expected */ str = gst_tag_freeform_string_to_utf8 ((gchar *) data + 2, nsize, NULL); if (str) { gst_buffer_unref (buf); buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = (guint8 *) str; GST_BUFFER_SIZE (buf) = strlen (str); } else { /* may be 0-size subtitle, which is also sent to keep pipeline going */ GST_BUFFER_DATA (buf) = data + 2; GST_BUFFER_SIZE (buf) = nsize; } /* FIXME ? convert optional subsequent style info to markup */ return buf; } /* Sets a buffer's attributes properly and pushes it downstream. * Also checks for additional actions and custom processing that may * need to be done first. */ static gboolean gst_qtdemux_decorate_and_push_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, GstBuffer * buf, guint64 timestamp, guint64 duration, gboolean keyframe, guint64 position, guint64 byte_position) { GstFlowReturn ret = GST_FLOW_OK; if (G_UNLIKELY (stream->fourcc == FOURCC_rtsp)) { gchar *url; url = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); if (url != NULL && strlen (url) != 0) { /* we have RTSP redirect now */ gst_element_post_message (GST_ELEMENT_CAST (qtdemux), gst_message_new_element (GST_OBJECT_CAST (qtdemux), gst_structure_new ("redirect", "new-location", G_TYPE_STRING, url, NULL))); qtdemux->posted_redirect = TRUE; } else { GST_WARNING_OBJECT (qtdemux, "Redirect URI of stream is empty, not " "posting"); } g_free (url); } /* position reporting */ if (qtdemux->segment.rate >= 0) { gst_segment_set_last_stop (&qtdemux->segment, GST_FORMAT_TIME, position); gst_qtdemux_sync_streams (qtdemux); } if (G_UNLIKELY (!stream->pad)) { GST_DEBUG_OBJECT (qtdemux, "No output pad for stream, ignoring"); gst_buffer_unref (buf); goto exit; } /* send out pending buffers */ while (stream->buffers) { GstBuffer *buffer = (GstBuffer *) stream->buffers->data; if (G_UNLIKELY (stream->discont)) { GST_LOG_OBJECT (qtdemux, "marking discont buffer"); GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); stream->discont = FALSE; } gst_buffer_set_caps (buffer, stream->caps); gst_pad_push (stream->pad, buffer); stream->buffers = g_slist_delete_link (stream->buffers, stream->buffers); } /* we're going to modify the metadata */ buf = gst_buffer_make_metadata_writable (buf); if (G_UNLIKELY (stream->need_process)) buf = gst_qtdemux_process_buffer (qtdemux, stream, buf); GST_BUFFER_TIMESTAMP (buf) = timestamp; GST_BUFFER_DURATION (buf) = duration; GST_BUFFER_OFFSET (buf) = -1; GST_BUFFER_OFFSET_END (buf) = -1; if (G_UNLIKELY (stream->padding)) { GST_BUFFER_DATA (buf) += stream->padding; GST_BUFFER_SIZE (buf) -= stream->padding; } if (G_UNLIKELY (qtdemux->element_index)) { GstClockTime stream_time; stream_time = gst_segment_to_stream_time (&stream->segment, GST_FORMAT_TIME, timestamp); if (GST_CLOCK_TIME_IS_VALID (stream_time)) { GST_LOG_OBJECT (qtdemux, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT, GST_TIME_ARGS (stream_time), byte_position); gst_index_add_association (qtdemux->element_index, qtdemux->index_id, keyframe ? GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_DELTA_UNIT, GST_FORMAT_TIME, stream_time, GST_FORMAT_BYTES, byte_position, NULL); } } if (stream->need_clip) buf = gst_qtdemux_clip_buffer (qtdemux, stream, buf); if (G_UNLIKELY (buf == NULL)) goto exit; if (G_UNLIKELY (stream->discont)) { GST_LOG_OBJECT (qtdemux, "marking discont buffer"); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); stream->discont = FALSE; } if (!keyframe) GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); gst_buffer_set_caps (buf, stream->caps); GST_LOG_OBJECT (qtdemux, "Pushing buffer with time %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT " on pad %s", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_PAD_NAME (stream->pad)); ret = gst_pad_push (stream->pad, buf); exit: return ret; } static GstFlowReturn gst_qtdemux_loop_state_movie (GstQTDemux * qtdemux) { GstFlowReturn ret = GST_FLOW_OK; GstBuffer *buf = NULL; QtDemuxStream *stream; guint64 min_time; guint64 offset = 0; guint64 timestamp = GST_CLOCK_TIME_NONE; guint64 duration = 0; gboolean keyframe = FALSE; guint size = 0; gint index; gint i; gst_qtdemux_push_pending_newsegment (qtdemux); /* Figure out the next stream sample to output, min_time is expressed in * global time and runs over the edit list segments. */ min_time = G_MAXUINT64; index = -1; for (i = 0; i < qtdemux->n_streams; i++) { guint64 position; stream = qtdemux->streams[i]; position = stream->time_position; /* position of -1 is EOS */ if (position != -1 && position < min_time) { min_time = position; index = i; } } /* all are EOS */ if (G_UNLIKELY (index == -1)) { GST_DEBUG_OBJECT (qtdemux, "all streams are EOS"); goto eos; } /* check for segment end */ if (G_UNLIKELY (qtdemux->segment.stop != -1 && qtdemux->segment.stop < min_time)) { GST_DEBUG_OBJECT (qtdemux, "we reached the end of our segment."); goto eos; } stream = qtdemux->streams[index]; /* fetch info for the current sample of this stream */ if (G_UNLIKELY (!gst_qtdemux_prepare_current_sample (qtdemux, stream, &offset, &size, ×tamp, &duration, &keyframe))) goto eos_stream; GST_LOG_OBJECT (qtdemux, "pushing from stream %d, offset %" G_GUINT64_FORMAT ", size %d, timestamp=%" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, index, offset, size, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration)); /* hmm, empty sample, skip and move to next sample */ if (G_UNLIKELY (size <= 0)) goto next; /* last pushed sample was out of boundary, goto next sample */ if (G_UNLIKELY (stream->last_ret == GST_FLOW_UNEXPECTED)) goto next; GST_LOG_OBJECT (qtdemux, "reading %d bytes @ %" G_GUINT64_FORMAT, size, offset); ret = gst_qtdemux_pull_atom (qtdemux, offset, size, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto beach; ret = gst_qtdemux_decorate_and_push_buffer (qtdemux, stream, buf, timestamp, duration, keyframe, min_time, offset); /* combine flows */ ret = gst_qtdemux_combine_flows (qtdemux, stream, ret); /* ignore unlinked, we will not push on the pad anymore and we will EOS when * we have no more data for the pad to push */ if (ret == GST_FLOW_UNEXPECTED) ret = GST_FLOW_OK; next: gst_qtdemux_advance_sample (qtdemux, stream); beach: return ret; /* special cases */ eos: { GST_DEBUG_OBJECT (qtdemux, "No samples left for any streams - EOS"); ret = GST_FLOW_UNEXPECTED; goto beach; } eos_stream: { GST_DEBUG_OBJECT (qtdemux, "No samples left for stream"); /* EOS will be raised if all are EOS */ ret = GST_FLOW_OK; goto beach; } } static void gst_qtdemux_loop (GstPad * pad) { GstQTDemux *qtdemux; guint64 cur_offset; GstFlowReturn ret; qtdemux = GST_QTDEMUX (gst_pad_get_parent (pad)); cur_offset = qtdemux->offset; GST_LOG_OBJECT (qtdemux, "loop at position %" G_GUINT64_FORMAT ", state %d", cur_offset, qtdemux->state); switch (qtdemux->state) { case QTDEMUX_STATE_INITIAL: case QTDEMUX_STATE_HEADER: ret = gst_qtdemux_loop_state_header (qtdemux); break; case QTDEMUX_STATE_MOVIE: ret = gst_qtdemux_loop_state_movie (qtdemux); if (qtdemux->segment.rate < 0 && ret == GST_FLOW_UNEXPECTED) { ret = gst_qtdemux_seek_to_previous_keyframe (qtdemux); } break; default: /* ouch */ goto invalid_state; } /* if something went wrong, pause */ if (ret != GST_FLOW_OK) goto pause; done: gst_object_unref (qtdemux); return; /* ERRORS */ invalid_state: { GST_ELEMENT_ERROR (qtdemux, STREAM, FAILED, (NULL), ("streaming stopped, invalid state")); qtdemux->segment_running = FALSE; gst_pad_pause_task (pad); gst_qtdemux_push_event (qtdemux, gst_event_new_eos ()); goto done; } pause: { const gchar *reason = gst_flow_get_name (ret); GST_LOG_OBJECT (qtdemux, "pausing task, reason %s", reason); qtdemux->segment_running = FALSE; gst_pad_pause_task (pad); /* fatal errors need special actions */ /* check EOS */ if (ret == GST_FLOW_UNEXPECTED) { if (qtdemux->n_streams == 0) { /* we have no streams, post an error */ gst_qtdemux_post_no_playable_stream_error (qtdemux); } if (qtdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { gint64 stop; /* FIXME: I am not sure this is the right fix. If the sinks are * supposed to detect the segment is complete and accumulate * automatically, it does not seem to work here. Need more work */ qtdemux->segment_running = TRUE; if ((stop = qtdemux->segment.stop) == -1) stop = qtdemux->segment.duration; if (qtdemux->segment.rate >= 0) { GST_LOG_OBJECT (qtdemux, "Sending segment done, at end of segment"); gst_element_post_message (GST_ELEMENT_CAST (qtdemux), gst_message_new_segment_done (GST_OBJECT_CAST (qtdemux), GST_FORMAT_TIME, stop)); } else { /* For Reverse Playback */ GST_LOG_OBJECT (qtdemux, "Sending segment done, at start of segment"); gst_element_post_message (GST_ELEMENT_CAST (qtdemux), gst_message_new_segment_done (GST_OBJECT_CAST (qtdemux), GST_FORMAT_TIME, qtdemux->segment.start)); } } else { GST_LOG_OBJECT (qtdemux, "Sending EOS at end of segment"); gst_qtdemux_push_event (qtdemux, gst_event_new_eos ()); } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { GST_ELEMENT_ERROR (qtdemux, STREAM, FAILED, (NULL), ("streaming stopped, reason %s", reason)); gst_qtdemux_push_event (qtdemux, gst_event_new_eos ()); } goto done; } } /* * next_entry_size * * Returns the size of the first entry at the current offset. * If -1, there are none (which means EOS or empty file). */ static guint64 next_entry_size (GstQTDemux * demux) { QtDemuxStream *stream; int i; int smallidx = -1; guint64 smalloffs = (guint64) - 1; QtDemuxSample *sample; GST_LOG_OBJECT (demux, "Finding entry at offset %" G_GUINT64_FORMAT, demux->offset); for (i = 0; i < demux->n_streams; i++) { stream = demux->streams[i]; if (stream->sample_index == -1) stream->sample_index = 0; if (stream->sample_index >= stream->n_samples) { GST_LOG_OBJECT (demux, "stream %d samples exhausted", i); continue; } if (!qtdemux_parse_samples (demux, stream, stream->sample_index)) { GST_LOG_OBJECT (demux, "Parsing of index %u from stbl atom failed!", stream->sample_index); return -1; } sample = &stream->samples[stream->sample_index]; GST_LOG_OBJECT (demux, "Checking Stream %d (sample_index:%d / offset:%" G_GUINT64_FORMAT " / size:%" G_GUINT32_FORMAT ")", i, stream->sample_index, sample->offset, sample->size); if (((smalloffs == -1) || (sample->offset < smalloffs)) && (sample->size)) { smallidx = i; smalloffs = sample->offset; } } GST_LOG_OBJECT (demux, "stream %d offset %" G_GUINT64_FORMAT " demux->offset :%" G_GUINT64_FORMAT, smallidx, smalloffs, demux->offset); if (smallidx == -1) return -1; stream = demux->streams[smallidx]; sample = &stream->samples[stream->sample_index]; if (sample->offset >= demux->offset) { demux->todrop = sample->offset - demux->offset; return sample->size + demux->todrop; } GST_DEBUG_OBJECT (demux, "There wasn't any entry at offset %" G_GUINT64_FORMAT, demux->offset); return -1; } static void gst_qtdemux_post_progress (GstQTDemux * demux, gint num, gint denom) { gint perc = (gint) ((gdouble) num * 100.0 / (gdouble) denom); gst_element_post_message (GST_ELEMENT_CAST (demux), gst_message_new_element (GST_OBJECT_CAST (demux), gst_structure_new ("progress", "percent", G_TYPE_INT, perc, NULL))); } static gboolean qtdemux_seek_offset (GstQTDemux * demux, guint64 offset) { GstEvent *event; gboolean res = 0; GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); event = gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, -1); res = gst_pad_push_event (demux->sinkpad, event); return res; } /* check for seekable upstream, above and beyond a mere query */ static void gst_qtdemux_check_seekability (GstQTDemux * demux) { GstQuery *query; gboolean seekable = FALSE; gint64 start = -1, stop = -1; if (demux->upstream_size) return; query = gst_query_new_seeking (GST_FORMAT_BYTES); if (!gst_pad_peer_query (demux->sinkpad, query)) { GST_DEBUG_OBJECT (demux, "seeking query failed"); goto done; } gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); /* try harder to query upstream size if we didn't get it the first time */ if (seekable && stop == -1) { GstFormat fmt = GST_FORMAT_BYTES; GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop"); gst_pad_query_peer_duration (demux->sinkpad, &fmt, &stop); } /* if upstream doesn't know the size, it's likely that it's not seekable in * practice even if it technically may be seekable */ if (seekable && (start != 0 || stop <= start)) { GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable"); seekable = FALSE; } done: gst_query_unref (query); GST_DEBUG_OBJECT (demux, "seekable: %d (%" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT ")", seekable, start, stop); demux->upstream_seekable = seekable; demux->upstream_size = seekable ? stop : -1; } /* FIXME, unverified after edit list updates */ static GstFlowReturn gst_qtdemux_chain (GstPad * sinkpad, GstBuffer * inbuf) { GstQTDemux *demux; GstFlowReturn ret = GST_FLOW_OK; demux = GST_QTDEMUX (gst_pad_get_parent (sinkpad)); gst_adapter_push (demux->adapter, inbuf); /* we never really mean to buffer that much */ if (demux->neededbytes == -1) goto eos; GST_DEBUG_OBJECT (demux, "pushing in inbuf %p, neededbytes:%u, available:%u", inbuf, demux->neededbytes, gst_adapter_available (demux->adapter)); while (((gst_adapter_available (demux->adapter)) >= demux->neededbytes) && (ret == GST_FLOW_OK)) { GST_DEBUG_OBJECT (demux, "state:%d , demux->neededbytes:%d, demux->offset:%" G_GUINT64_FORMAT, demux->state, demux->neededbytes, demux->offset); switch (demux->state) { case QTDEMUX_STATE_INITIAL:{ const guint8 *data; guint32 fourcc; guint64 size; gst_qtdemux_check_seekability (demux); data = gst_adapter_peek (demux->adapter, demux->neededbytes); /* get fourcc/length, set neededbytes */ extract_initial_length_and_fourcc ((guint8 *) data, demux->neededbytes, &size, &fourcc); GST_DEBUG_OBJECT (demux, "Peeking found [%" GST_FOURCC_FORMAT "] " "size: %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), size); if (size == 0) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (_("This file is invalid and cannot be played.")), ("initial atom '%" GST_FOURCC_FORMAT "' has empty length", GST_FOURCC_ARGS (fourcc))); ret = GST_FLOW_ERROR; break; } if (fourcc == FOURCC_mdat) { if (demux->n_streams > 0) { /* we have the headers, start playback */ demux->state = QTDEMUX_STATE_MOVIE; demux->neededbytes = next_entry_size (demux); demux->mdatleft = size; /* Only post, event on pads is done after newsegment */ qtdemux_post_global_tags (demux); } else { /* no headers yet, try to get them */ guint bs; gboolean res; guint64 old, target; buffer_data: old = demux->offset; target = old + size; /* try to jump over the atom with a seek */ /* only bother if it seems worth doing so, * and avoids possible upstream/server problems */ if (demux->upstream_seekable && demux->upstream_size > 4 * (1 << 20)) { res = qtdemux_seek_offset (demux, target); } else { GST_DEBUG_OBJECT (demux, "skipping seek"); res = FALSE; } if (res) { GST_DEBUG_OBJECT (demux, "seek success"); /* remember the offset fo the first mdat so we can seek back to it * after we have the headers */ if (fourcc == FOURCC_mdat && demux->first_mdat == -1) { demux->first_mdat = old; GST_DEBUG_OBJECT (demux, "first mdat at %" G_GUINT64_FORMAT, demux->first_mdat); } /* seek worked, continue reading */ demux->offset = target; demux->neededbytes = 16; demux->state = QTDEMUX_STATE_INITIAL; } else { /* seek failed, need to buffer */ demux->offset = old; GST_DEBUG_OBJECT (demux, "seek failed/skipped"); /* there may be multiple mdat (or alike) buffers */ /* sanity check */ if (demux->mdatbuffer) bs = GST_BUFFER_SIZE (demux->mdatbuffer); else bs = 0; if (size + bs > 10 * (1 << 20)) goto no_moov; demux->state = QTDEMUX_STATE_BUFFER_MDAT; demux->neededbytes = size; if (!demux->mdatbuffer) demux->mdatoffset = demux->offset; } } } else if (G_UNLIKELY (size > QTDEMUX_MAX_ATOM_SIZE)) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (_("This file is invalid and cannot be played.")), ("atom %" GST_FOURCC_FORMAT " has bogus size %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), size)); ret = GST_FLOW_ERROR; break; } else { /* this means we already started buffering and still no moov header, * let's continue buffering everything till we get moov */ if (demux->mdatbuffer && (fourcc != FOURCC_moov)) goto buffer_data; demux->neededbytes = size; demux->state = QTDEMUX_STATE_HEADER; } break; } case QTDEMUX_STATE_HEADER:{ const guint8 *data; guint32 fourcc; GST_DEBUG_OBJECT (demux, "In header"); data = gst_adapter_peek (demux->adapter, demux->neededbytes); /* parse the header */ extract_initial_length_and_fourcc (data, demux->neededbytes, NULL, &fourcc); if (fourcc == FOURCC_moov) { GST_DEBUG_OBJECT (demux, "Parsing [moov]"); demux->got_moov = TRUE; /* prepare newsegment to send when streaming actually starts */ if (!demux->pending_newsegment) { demux->pending_newsegment = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE, 0); } qtdemux_parse_moov (demux, data, demux->neededbytes); qtdemux_node_dump (demux, demux->moov_node); qtdemux_parse_tree (demux); qtdemux_expose_streams (demux); g_node_destroy (demux->moov_node); demux->moov_node = NULL; GST_DEBUG_OBJECT (demux, "Finished parsing the header"); } else if (fourcc == FOURCC_moof) { if (demux->got_moov && demux->fragmented) { GST_DEBUG_OBJECT (demux, "Parsing [moof]"); if (!qtdemux_parse_moof (demux, data, demux->neededbytes, demux->offset, NULL)) { ret = GST_FLOW_ERROR; goto done; } } else { GST_DEBUG_OBJECT (demux, "Discarding [moof]"); } } else if (fourcc == FOURCC_ftyp) { GST_DEBUG_OBJECT (demux, "Parsing [ftyp]"); qtdemux_parse_ftyp (demux, data, demux->neededbytes); } else if (fourcc == FOURCC_uuid) { GST_DEBUG_OBJECT (demux, "Parsing [uuid]"); qtdemux_parse_uuid (demux, data, demux->neededbytes); } else { GST_WARNING_OBJECT (demux, "Unknown fourcc while parsing header : %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); /* Let's jump that one and go back to initial state */ } if (demux->mdatbuffer && demux->n_streams) { /* the mdat was before the header */ GST_DEBUG_OBJECT (demux, "We have n_streams:%d and mdatbuffer:%p", demux->n_streams, demux->mdatbuffer); /* restore our adapter/offset view of things with upstream; * put preceding buffered data ahead of current moov data. * This should also handle evil mdat, moov, mdat cases and alike */ gst_adapter_clear (demux->adapter); gst_adapter_push (demux->adapter, demux->mdatbuffer); demux->mdatbuffer = NULL; demux->offset = demux->mdatoffset; demux->neededbytes = next_entry_size (demux); demux->state = QTDEMUX_STATE_MOVIE; demux->mdatleft = gst_adapter_available (demux->adapter); /* Only post, event on pads is done after newsegment */ qtdemux_post_global_tags (demux); } else { GST_DEBUG_OBJECT (demux, "Carrying on normally"); gst_adapter_flush (demux->adapter, demux->neededbytes); if (demux->got_moov && demux->first_mdat != -1) { gboolean res; /* we need to seek back */ res = qtdemux_seek_offset (demux, demux->first_mdat); if (res) { demux->offset = demux->first_mdat; } else { GST_DEBUG_OBJECT (demux, "Seek back failed"); } } else { demux->offset += demux->neededbytes; } demux->neededbytes = 16; demux->state = QTDEMUX_STATE_INITIAL; } break; } case QTDEMUX_STATE_BUFFER_MDAT:{ GstBuffer *buf; GST_DEBUG_OBJECT (demux, "Got our buffer at offset %" G_GUINT64_FORMAT, demux->offset); buf = gst_adapter_take_buffer (demux->adapter, demux->neededbytes); GST_DEBUG_OBJECT (demux, "mdatbuffer starts with %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (QT_FOURCC (GST_BUFFER_DATA (buf) + 4))); if (demux->mdatbuffer) demux->mdatbuffer = gst_buffer_join (demux->mdatbuffer, buf); else demux->mdatbuffer = buf; demux->offset += demux->neededbytes; demux->neededbytes = 16; demux->state = QTDEMUX_STATE_INITIAL; gst_qtdemux_post_progress (demux, 1, 1); break; } case QTDEMUX_STATE_MOVIE:{ GstBuffer *outbuf; QtDemuxStream *stream = NULL; QtDemuxSample *sample; int i = -1; guint64 timestamp, duration, position; gboolean keyframe; GST_DEBUG_OBJECT (demux, "BEGIN // in MOVIE for offset %" G_GUINT64_FORMAT, demux->offset); if (demux->fragmented) { GST_DEBUG_OBJECT (demux, "mdat remaining %" G_GUINT64_FORMAT, demux->mdatleft); if (G_LIKELY (demux->todrop < demux->mdatleft)) { /* if needed data starts within this atom, * then it should not exceed this atom */ if (G_UNLIKELY (demux->neededbytes > demux->mdatleft)) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (_("This file is invalid and cannot be played.")), ("sample data crosses atom boundary")); ret = GST_FLOW_ERROR; break; } demux->mdatleft -= demux->neededbytes; } else { GST_DEBUG_OBJECT (demux, "data atom emptied; resuming atom scan"); /* so we are dropping more than left in this atom */ demux->todrop -= demux->mdatleft; demux->neededbytes -= demux->mdatleft; demux->mdatleft = 0; /* need to resume atom parsing so we do not miss any other pieces */ demux->state = QTDEMUX_STATE_INITIAL; demux->neededbytes = 16; break; } } if (demux->todrop) { GST_LOG_OBJECT (demux, "Dropping %d bytes", demux->todrop); gst_adapter_flush (demux->adapter, demux->todrop); demux->neededbytes -= demux->todrop; demux->offset += demux->todrop; } /* first buffer? */ /* initial newsegment sent here after having added pads, * possible others in sink_event */ if (G_UNLIKELY (demux->pending_newsegment)) { gst_qtdemux_push_event (demux, demux->pending_newsegment); demux->pending_newsegment = NULL; /* clear to send tags on all streams */ for (i = 0; i < demux->n_streams; i++) { gst_qtdemux_push_tags (demux, demux->streams[i]); } } /* Figure out which stream this is packet belongs to */ for (i = 0; i < demux->n_streams; i++) { stream = demux->streams[i]; if (stream->sample_index >= stream->n_samples) continue; GST_LOG_OBJECT (demux, "Checking stream %d (sample_index:%d / offset:%" G_GUINT64_FORMAT " / size:%d)", i, stream->sample_index, stream->samples[stream->sample_index].offset, stream->samples[stream->sample_index].size); if (stream->samples[stream->sample_index].offset == demux->offset) break; } if (G_UNLIKELY (stream == NULL || i == demux->n_streams)) goto unknown_stream; /* Put data in a buffer, set timestamps, caps, ... */ outbuf = gst_adapter_take_buffer (demux->adapter, demux->neededbytes); GST_DEBUG_OBJECT (demux, "stream : %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (stream->fourcc)); g_return_val_if_fail (outbuf != NULL, GST_FLOW_ERROR); sample = &stream->samples[stream->sample_index]; position = QTSAMPLE_DTS (stream, sample); timestamp = QTSAMPLE_PTS (stream, sample); duration = QTSAMPLE_DUR_DTS (stream, sample, position); keyframe = QTSAMPLE_KEYFRAME (stream, sample); ret = gst_qtdemux_decorate_and_push_buffer (demux, stream, outbuf, timestamp, duration, keyframe, position, demux->offset); /* combine flows */ ret = gst_qtdemux_combine_flows (demux, stream, ret); stream->sample_index++; /* update current offset and figure out size of next buffer */ GST_LOG_OBJECT (demux, "increasing offset %" G_GUINT64_FORMAT " by %u", demux->offset, demux->neededbytes); demux->offset += demux->neededbytes; GST_LOG_OBJECT (demux, "offset is now %" G_GUINT64_FORMAT, demux->offset); if ((demux->neededbytes = next_entry_size (demux)) == -1) { if (demux->fragmented) { GST_DEBUG_OBJECT (demux, "(temporarily) out of fragmented samples"); /* there may be more to follow, only finish this atom */ demux->todrop = demux->mdatleft; demux->neededbytes = demux->todrop; break; } goto eos; } break; } default: goto invalid_state; } } /* when buffering movie data, at least show user something is happening */ if (ret == GST_FLOW_OK && demux->state == QTDEMUX_STATE_BUFFER_MDAT && gst_adapter_available (demux->adapter) <= demux->neededbytes) { gst_qtdemux_post_progress (demux, gst_adapter_available (demux->adapter), demux->neededbytes); } done: gst_object_unref (demux); return ret; /* ERRORS */ unknown_stream: { GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), ("unknown stream found")); ret = GST_FLOW_ERROR; goto done; } eos: { GST_DEBUG_OBJECT (demux, "no next entry, EOS"); ret = GST_FLOW_UNEXPECTED; goto done; } invalid_state: { GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), ("qtdemuxer invalid state %d", demux->state)); ret = GST_FLOW_ERROR; goto done; } no_moov: { GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), ("no 'moov' atom within the first 10 MB")); ret = GST_FLOW_ERROR; goto done; } } static gboolean qtdemux_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) return gst_pad_activate_pull (sinkpad, TRUE); else return gst_pad_activate_push (sinkpad, TRUE); } static gboolean qtdemux_sink_activate_pull (GstPad * sinkpad, gboolean active) { GstQTDemux *demux = GST_QTDEMUX (GST_PAD_PARENT (sinkpad)); if (active) { demux->pullbased = TRUE; demux->segment_running = TRUE; return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_qtdemux_loop, sinkpad); } else { demux->segment_running = FALSE; return gst_pad_stop_task (sinkpad); } } static gboolean qtdemux_sink_activate_push (GstPad * sinkpad, gboolean active) { GstQTDemux *demux = GST_QTDEMUX (GST_PAD_PARENT (sinkpad)); demux->pullbased = FALSE; return TRUE; } #ifdef HAVE_ZLIB static void * qtdemux_zalloc (void *opaque, unsigned int items, unsigned int size) { return g_malloc (items * size); } static void qtdemux_zfree (void *opaque, void *addr) { g_free (addr); } static void * qtdemux_inflate (void *z_buffer, guint z_length, guint length) { guint8 *buffer; z_stream *z; int ret; z = g_new0 (z_stream, 1); z->zalloc = qtdemux_zalloc; z->zfree = qtdemux_zfree; z->opaque = NULL; z->next_in = z_buffer; z->avail_in = z_length; buffer = (guint8 *) g_malloc (length); ret = inflateInit (z); while (z->avail_in > 0) { if (z->avail_out == 0) { length += 1024; buffer = (guint8 *) g_realloc (buffer, length); z->next_out = buffer + z->total_out; z->avail_out = 1024; } ret = inflate (z, Z_SYNC_FLUSH); if (ret != Z_OK) break; } if (ret != Z_STREAM_END) { g_warning ("inflate() returned %d", ret); } g_free (z); return buffer; } #endif /* HAVE_ZLIB */ static gboolean qtdemux_parse_moov (GstQTDemux * qtdemux, const guint8 * buffer, guint length) { GNode *cmov; qtdemux->moov_node = g_node_new ((guint8 *) buffer); /* counts as header data */ qtdemux->header_size += length; GST_DEBUG_OBJECT (qtdemux, "parsing 'moov' atom"); qtdemux_parse_node (qtdemux, qtdemux->moov_node, buffer, length); cmov = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_cmov); if (cmov) { guint32 method; GNode *dcom; GNode *cmvd; dcom = qtdemux_tree_get_child_by_type (cmov, FOURCC_dcom); cmvd = qtdemux_tree_get_child_by_type (cmov, FOURCC_cmvd); if (dcom == NULL || cmvd == NULL) goto invalid_compression; method = QT_FOURCC ((guint8 *) dcom->data + 8); switch (method) { #ifdef HAVE_ZLIB case GST_MAKE_FOURCC ('z', 'l', 'i', 'b'):{ guint uncompressed_length; guint compressed_length; guint8 *buf; uncompressed_length = QT_UINT32 ((guint8 *) cmvd->data + 8); compressed_length = QT_UINT32 ((guint8 *) cmvd->data + 4) - 12; GST_LOG ("length = %u", uncompressed_length); buf = (guint8 *) qtdemux_inflate ((guint8 *) cmvd->data + 12, compressed_length, uncompressed_length); qtdemux->moov_node_compressed = qtdemux->moov_node; qtdemux->moov_node = g_node_new (buf); qtdemux_parse_node (qtdemux, qtdemux->moov_node, buf, uncompressed_length); break; } #endif /* HAVE_ZLIB */ default: GST_WARNING_OBJECT (qtdemux, "unknown or unhandled header compression " "type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (method)); break; } } return TRUE; /* ERRORS */ invalid_compression: { GST_ERROR_OBJECT (qtdemux, "invalid compressed header"); return FALSE; } } static gboolean qtdemux_parse_container (GstQTDemux * qtdemux, GNode * node, const guint8 * buf, const guint8 * end) { while (G_UNLIKELY (buf < end)) { GNode *child; guint32 len; if (G_UNLIKELY (buf + 4 > end)) { GST_LOG_OBJECT (qtdemux, "buffer overrun"); break; } len = QT_UINT32 (buf); if (G_UNLIKELY (len == 0)) { GST_LOG_OBJECT (qtdemux, "empty container"); break; } if (G_UNLIKELY (len < 8)) { GST_WARNING_OBJECT (qtdemux, "length too short (%d < 8)", len); break; } if (G_UNLIKELY (len > (end - buf))) { GST_WARNING_OBJECT (qtdemux, "length too long (%d > %d)", len, (gint) (end - buf)); break; } child = g_node_new ((guint8 *) buf); g_node_append (node, child); GST_LOG_OBJECT (qtdemux, "adding new node of len %d", len); qtdemux_parse_node (qtdemux, child, buf, len); buf += len; } return TRUE; } static gboolean qtdemux_parse_theora_extension (GstQTDemux * qtdemux, QtDemuxStream * stream, GNode * xdxt) { int len = QT_UINT32 (xdxt->data); guint8 *buf = xdxt->data; guint8 *end = buf + len; GstBuffer *buffer; /* skip size and type */ buf += 8; end -= 8; while (buf < end) { gint size; guint32 type; size = QT_UINT32 (buf); type = QT_FOURCC (buf + 4); GST_LOG_OBJECT (qtdemux, "%p %p", buf, end); if (buf + size > end || size <= 0) break; buf += 8; size -= 8; GST_WARNING_OBJECT (qtdemux, "have cookie %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (type)); switch (type) { case FOURCC_tCtH: buffer = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buffer), buf, size); stream->buffers = g_slist_append (stream->buffers, buffer); GST_LOG_OBJECT (qtdemux, "parsing theora header"); break; case FOURCC_tCt_: buffer = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buffer), buf, size); stream->buffers = g_slist_append (stream->buffers, buffer); GST_LOG_OBJECT (qtdemux, "parsing theora comment"); break; case FOURCC_tCtC: buffer = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buffer), buf, size); stream->buffers = g_slist_append (stream->buffers, buffer); GST_LOG_OBJECT (qtdemux, "parsing theora codebook"); break; default: GST_WARNING_OBJECT (qtdemux, "unknown theora cookie %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (type)); break; } buf += size; } return TRUE; } static gboolean qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, const guint8 * buffer, guint length) { guint32 fourcc = 0; guint32 node_length = 0; const QtNodeType *type; const guint8 *end; GST_LOG_OBJECT (qtdemux, "qtdemux_parse buffer %p length %u", buffer, length); if (G_UNLIKELY (length < 8)) goto not_enough_data; node_length = QT_UINT32 (buffer); fourcc = QT_FOURCC (buffer + 4); /* ignore empty nodes */ if (G_UNLIKELY (fourcc == 0 || node_length == 8)) return TRUE; type = qtdemux_type_get (fourcc); end = buffer + length; GST_LOG_OBJECT (qtdemux, "parsing '%" GST_FOURCC_FORMAT "', length=%u, name '%s'", GST_FOURCC_ARGS (fourcc), node_length, type->name); if (node_length > length) goto broken_atom_size; if (type->flags & QT_FLAG_CONTAINER) { qtdemux_parse_container (qtdemux, node, buffer + 8, end); } else { switch (fourcc) { case FOURCC_stsd: { if (node_length < 20) { GST_LOG_OBJECT (qtdemux, "skipping small stsd box"); break; } GST_DEBUG_OBJECT (qtdemux, "parsing stsd (sample table, sample description) atom"); qtdemux_parse_container (qtdemux, node, buffer + 16, end); break; } case FOURCC_mp4a: case FOURCC_alac: { guint32 version; guint32 offset; guint min_size; /* also read alac (or whatever) in stead of mp4a in the following, * since a similar layout is used in other cases as well */ if (fourcc == FOURCC_mp4a) min_size = 20; else min_size = 40; /* There are two things we might encounter here: a true mp4a atom, and an mp4a entry in an stsd atom. The latter is what we're interested in, and it looks like an atom, but isn't really one. The true mp4a atom is short, so we detect it based on length here. */ if (length < min_size) { GST_LOG_OBJECT (qtdemux, "skipping small %" GST_FOURCC_FORMAT " box", GST_FOURCC_ARGS (fourcc)); break; } /* 'version' here is the sound sample description version. Types 0 and 1 are documented in the QTFF reference, but type 2 is not: it's described in Apple header files instead (struct SoundDescriptionV2 in Movies.h) */ version = QT_UINT16 (buffer + 16); GST_DEBUG_OBJECT (qtdemux, "%" GST_FOURCC_FORMAT " version 0x%08x", GST_FOURCC_ARGS (fourcc), version); /* parse any esds descriptors */ switch (version) { case 0: offset = 0x24; break; case 1: offset = 0x34; break; case 2: offset = 0x48; break; default: GST_WARNING_OBJECT (qtdemux, "unhandled %" GST_FOURCC_FORMAT " version 0x%08x", GST_FOURCC_ARGS (fourcc), version); offset = 0; break; } if (offset) qtdemux_parse_container (qtdemux, node, buffer + offset, end); break; } case FOURCC_mp4v: case FOURCC_MP4V: case FOURCC_fmp4: case FOURCC_FMP4: { const guint8 *buf; guint32 version; int tlen; GST_DEBUG_OBJECT (qtdemux, "parsing in %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); version = QT_UINT32 (buffer + 16); GST_DEBUG_OBJECT (qtdemux, "version %08x", version); if (1 || version == 0x00000000) { buf = buffer + 0x32; /* FIXME Quicktime uses PASCAL string while * the iso format uses C strings. Check the file * type before attempting to parse the string here. */ tlen = QT_UINT8 (buf); GST_DEBUG_OBJECT (qtdemux, "tlen = %d", tlen); buf++; GST_DEBUG_OBJECT (qtdemux, "string = %.*s", tlen, (char *) buf); /* the string has a reserved space of 32 bytes so skip * the remaining 31 */ buf += 31; buf += 4; /* and 4 bytes reserved */ GST_MEMDUMP_OBJECT (qtdemux, "mp4v", buf, end - buf); qtdemux_parse_container (qtdemux, node, buf, end); } break; } case FOURCC_avc1: { GST_MEMDUMP_OBJECT (qtdemux, "avc1", buffer, end - buffer); qtdemux_parse_container (qtdemux, node, buffer + 0x56, end); break; } case FOURCC_mjp2: { qtdemux_parse_container (qtdemux, node, buffer + 86, end); break; } case FOURCC_meta: { GST_DEBUG_OBJECT (qtdemux, "parsing meta atom"); qtdemux_parse_container (qtdemux, node, buffer + 12, end); break; } case FOURCC_XiTh: { guint32 version; guint32 offset; version = QT_UINT32 (buffer + 12); GST_DEBUG_OBJECT (qtdemux, "parsing XiTh atom version 0x%08x", version); switch (version) { case 0x00000001: offset = 0x62; break; default: GST_DEBUG_OBJECT (qtdemux, "unknown version 0x%08x", version); offset = 0; break; } if (offset) qtdemux_parse_container (qtdemux, node, buffer + offset, end); break; } case FOURCC_in24: { qtdemux_parse_container (qtdemux, node, buffer + 0x34, end); break; } default: if (!strcmp (type->name, "unknown")) GST_MEMDUMP ("Unknown tag", buffer + 4, end - buffer - 4); break; } } GST_LOG_OBJECT (qtdemux, "parsed '%" GST_FOURCC_FORMAT "'", GST_FOURCC_ARGS (fourcc)); return TRUE; /* ERRORS */ not_enough_data: { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), ("Not enough data for an atom header, got only %u bytes", length)); return FALSE; } broken_atom_size: { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), ("Atom '%" GST_FOURCC_FORMAT "' has size of %u bytes, but we have only " "%u bytes available.", GST_FOURCC_ARGS (fourcc), node_length, length)); return FALSE; } } static GNode * qtdemux_tree_get_child_by_type (GNode * node, guint32 fourcc) { GNode *child; guint8 *buffer; guint32 child_fourcc; for (child = g_node_first_child (node); child; child = g_node_next_sibling (child)) { buffer = (guint8 *) child->data; child_fourcc = QT_FOURCC (buffer + 4); if (G_UNLIKELY (child_fourcc == fourcc)) { return child; } } return NULL; } static GNode * qtdemux_tree_get_child_by_type_full (GNode * node, guint32 fourcc, GstByteReader * parser) { GNode *child; guint8 *buffer; guint32 child_fourcc, child_len; for (child = g_node_first_child (node); child; child = g_node_next_sibling (child)) { buffer = (guint8 *) child->data; child_len = QT_UINT32 (buffer); child_fourcc = QT_FOURCC (buffer + 4); if (G_UNLIKELY (child_fourcc == fourcc)) { if (G_UNLIKELY (child_len < (4 + 4))) return NULL; /* FIXME: must verify if atom length < parent atom length */ gst_byte_reader_init (parser, buffer + (4 + 4), child_len - (4 + 4)); return child; } } return NULL; } static GNode * qtdemux_tree_get_sibling_by_type_full (GNode * node, guint32 fourcc, GstByteReader * parser) { GNode *child; guint8 *buffer; guint32 child_fourcc, child_len; for (child = g_node_next_sibling (node); child; child = g_node_next_sibling (child)) { buffer = (guint8 *) child->data; child_fourcc = QT_FOURCC (buffer + 4); if (child_fourcc == fourcc) { if (parser) { child_len = QT_UINT32 (buffer); if (G_UNLIKELY (child_len < (4 + 4))) return NULL; /* FIXME: must verify if atom length < parent atom length */ gst_byte_reader_init (parser, buffer + (4 + 4), child_len - (4 + 4)); } return child; } } return NULL; } static GNode * qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc) { return qtdemux_tree_get_sibling_by_type_full (node, fourcc, NULL); } static gboolean gst_qtdemux_add_stream (GstQTDemux * qtdemux, QtDemuxStream * stream, GstTagList * list) { /* consistent default for push based mode */ gst_segment_init (&stream->segment, GST_FORMAT_TIME); gst_segment_set_newsegment (&stream->segment, FALSE, 1.0, GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE, 0); if (stream->subtype == FOURCC_vide) { gchar *name = g_strdup_printf ("video_%02d", qtdemux->n_video_streams); stream->pad = gst_pad_new_from_static_template (&gst_qtdemux_videosrc_template, name); g_free (name); /* fps is calculated base on the duration of the first frames since * qt does not have a fixed framerate. */ if ((stream->n_samples == 1) && (stream->min_duration == 0)) { /* still frame */ stream->fps_n = 0; stream->fps_d = 1; } else { stream->fps_n = stream->timescale; if (stream->min_duration == 0) stream->fps_d = 1; else stream->fps_d = stream->min_duration; } if (stream->caps) { gboolean gray; gint depth, palette_count; const guint32 *palette_data = NULL; gst_caps_set_simple (stream->caps, "width", G_TYPE_INT, stream->width, "height", G_TYPE_INT, stream->height, "framerate", GST_TYPE_FRACTION, stream->fps_n, stream->fps_d, NULL); /* calculate pixel-aspect-ratio using display width and height */ GST_DEBUG_OBJECT (qtdemux, "video size %dx%d, target display size %dx%d", stream->width, stream->height, stream->display_width, stream->display_height); if (stream->display_width > 0 && stream->display_height > 0 && stream->width > 0 && stream->height > 0) { gint n, d; /* calculate the pixel aspect ratio using the display and pixel w/h */ n = stream->display_width * stream->height; d = stream->display_height * stream->width; if (n == d) n = d = 1; GST_DEBUG_OBJECT (qtdemux, "setting PAR to %d/%d", n, d); gst_caps_set_simple (stream->caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, n, d, NULL); } /* qt file might have pasp atom */ if (stream->par_w > 0 && stream->par_h > 0) { GST_DEBUG_OBJECT (qtdemux, "par %d:%d", stream->par_w, stream->par_h); gst_caps_set_simple (stream->caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, stream->par_w, stream->par_h, NULL); } depth = stream->bits_per_sample; /* more than 32 bits means grayscale */ gray = (depth > 32); /* low 32 bits specify the depth */ depth &= 0x1F; /* different number of palette entries is determined by depth. */ palette_count = 0; if ((depth == 1) || (depth == 2) || (depth == 4) || (depth == 8)) palette_count = (1 << depth); switch (palette_count) { case 0: break; case 2: palette_data = ff_qt_default_palette_2; break; case 4: palette_data = ff_qt_default_palette_4; break; case 16: if (gray) palette_data = ff_qt_grayscale_palette_16; else palette_data = ff_qt_default_palette_16; break; case 256: if (gray) palette_data = ff_qt_grayscale_palette_256; else palette_data = ff_qt_default_palette_256; break; default: GST_ELEMENT_WARNING (qtdemux, STREAM, DEMUX, (_("The video in this file might not play correctly.")), ("unsupported palette depth %d", depth)); break; } if (palette_data) { GstBuffer *palette; /* make sure it's not writable. We leave MALLOCDATA to NULL so that we * don't free any of the buffer data. */ palette = gst_buffer_new (); GST_BUFFER_FLAG_SET (palette, GST_BUFFER_FLAG_READONLY); GST_BUFFER_DATA (palette) = (guint8 *) palette_data; GST_BUFFER_SIZE (palette) = sizeof (guint32) * palette_count; gst_caps_set_simple (stream->caps, "palette_data", GST_TYPE_BUFFER, palette, NULL); gst_buffer_unref (palette); } else if (palette_count != 0) { GST_ELEMENT_WARNING (qtdemux, STREAM, NOT_IMPLEMENTED, (NULL), ("Unsupported palette depth %d. Ignoring stream.", depth)); gst_object_unref (stream->pad); stream->pad = NULL; } } qtdemux->n_video_streams++; } else if (stream->subtype == FOURCC_soun) { gchar *name = g_strdup_printf ("audio_%02d", qtdemux->n_audio_streams); stream->pad = gst_pad_new_from_static_template (&gst_qtdemux_audiosrc_template, name); g_free (name); if (stream->caps) { gst_caps_set_simple (stream->caps, "rate", G_TYPE_INT, (int) stream->rate, "channels", G_TYPE_INT, stream->n_channels, NULL); } qtdemux->n_audio_streams++; } else if (stream->subtype == FOURCC_strm) { GST_DEBUG_OBJECT (qtdemux, "stream type, not creating pad"); } else if (stream->subtype == FOURCC_subp || stream->subtype == FOURCC_text) { gchar *name = g_strdup_printf ("subtitle_%02d", qtdemux->n_sub_streams); stream->pad = gst_pad_new_from_static_template (&gst_qtdemux_subsrc_template, name); g_free (name); qtdemux->n_sub_streams++; } else { GST_DEBUG_OBJECT (qtdemux, "unknown stream type"); goto done; } if (stream->pad) { GST_PAD_ELEMENT_PRIVATE (stream->pad) = stream; gst_pad_use_fixed_caps (stream->pad); gst_pad_set_event_function (stream->pad, gst_qtdemux_handle_src_event); gst_pad_set_query_type_function (stream->pad, gst_qtdemux_get_src_query_types); gst_pad_set_query_function (stream->pad, gst_qtdemux_handle_src_query); GST_DEBUG_OBJECT (qtdemux, "setting caps %" GST_PTR_FORMAT, stream->caps); gst_pad_set_caps (stream->pad, stream->caps); GST_DEBUG_OBJECT (qtdemux, "adding pad %s %p to qtdemux %p", GST_OBJECT_NAME (stream->pad), stream->pad, qtdemux); gst_pad_set_active (stream->pad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (qtdemux), stream->pad); if (stream->pending_tags) gst_tag_list_free (stream->pending_tags); stream->pending_tags = list; if (list) { /* post now, send event on pad later */ GST_DEBUG_OBJECT (qtdemux, "Posting tags %" GST_PTR_FORMAT, list); gst_element_post_message (GST_ELEMENT (qtdemux), gst_message_new_tag_full (GST_OBJECT (qtdemux), stream->pad, gst_tag_list_copy (list))); } /* global tags go on each pad anyway */ stream->send_global_tags = TRUE; } done: return TRUE; } /* find next atom with @fourcc starting at @offset */ static GstFlowReturn qtdemux_find_atom (GstQTDemux * qtdemux, guint64 * offset, guint64 * length, guint32 fourcc) { GstFlowReturn ret; guint32 lfourcc; GstBuffer *buf; GST_LOG_OBJECT (qtdemux, "finding fourcc %" GST_FOURCC_FORMAT " at offset %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), *offset); while (TRUE) { ret = gst_pad_pull_range (qtdemux->sinkpad, *offset, 16, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto locate_failed; if (G_LIKELY (GST_BUFFER_SIZE (buf) != 16)) { /* likely EOF */ ret = GST_FLOW_UNEXPECTED; gst_buffer_unref (buf); goto locate_failed; } extract_initial_length_and_fourcc (GST_BUFFER_DATA (buf), 16, length, &lfourcc); gst_buffer_unref (buf); if (G_UNLIKELY (*length == 0)) { GST_DEBUG_OBJECT (qtdemux, "invalid length 0"); ret = GST_FLOW_ERROR; goto locate_failed; } if (lfourcc == fourcc) { GST_DEBUG_OBJECT (qtdemux, "found fourcc at offset %" G_GUINT64_FORMAT, *offset); break; } else { GST_LOG_OBJECT (qtdemux, "skipping atom '%" GST_FOURCC_FORMAT "' at %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (fourcc), *offset); *offset += *length; } } return GST_FLOW_OK; locate_failed: { /* might simply have had last one */ GST_DEBUG_OBJECT (qtdemux, "fourcc not found"); return ret; } } /* should only do something in pull mode */ /* call with OBJECT lock */ static GstFlowReturn qtdemux_add_fragmented_samples (GstQTDemux * qtdemux) { guint64 length, offset; GstBuffer *buf = NULL; GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn res = GST_FLOW_OK; offset = qtdemux->moof_offset; GST_DEBUG_OBJECT (qtdemux, "next moof at offset %" G_GUINT64_FORMAT, offset); if (!offset) { GST_DEBUG_OBJECT (qtdemux, "no next moof"); return GST_FLOW_UNEXPECTED; } /* best not do pull etc with lock held */ GST_OBJECT_UNLOCK (qtdemux); ret = qtdemux_find_atom (qtdemux, &offset, &length, FOURCC_moof); if (ret != GST_FLOW_OK) goto flow_failed; ret = gst_qtdemux_pull_atom (qtdemux, offset, length, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto flow_failed; if (!qtdemux_parse_moof (qtdemux, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), offset, NULL)) { gst_buffer_unref (buf); buf = NULL; goto parse_failed; } gst_buffer_unref (buf); buf = NULL; offset += length; /* look for next moof */ ret = qtdemux_find_atom (qtdemux, &offset, &length, FOURCC_moof); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto flow_failed; exit: GST_OBJECT_LOCK (qtdemux); qtdemux->moof_offset = offset; return res; parse_failed: { GST_DEBUG_OBJECT (qtdemux, "failed to parse moof"); offset = 0; res = GST_FLOW_ERROR; goto exit; } flow_failed: { /* maybe upstream temporarily flushing */ if (ret != GST_FLOW_WRONG_STATE) { GST_DEBUG_OBJECT (qtdemux, "no next moof"); offset = 0; } else { GST_DEBUG_OBJECT (qtdemux, "upstream WRONG_STATE"); /* resume at current position next time */ } res = ret; goto exit; } } /* initialise bytereaders for stbl sub-atoms */ static gboolean qtdemux_stbl_init (GstQTDemux * qtdemux, QtDemuxStream * stream, GNode * stbl) { stream->stbl_index = -1; /* no samples have yet been parsed */ /* time-to-sample atom */ if (!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stts, &stream->stts)) goto corrupt_file; /* copy atom data into a new buffer for later use */ stream->stts.data = g_memdup (stream->stts.data, stream->stts.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->stts, 1 + 3) || !gst_byte_reader_get_uint32_be (&stream->stts, &stream->n_sample_times)) goto corrupt_file; GST_LOG_OBJECT (qtdemux, "%u timestamp blocks", stream->n_sample_times); /* make sure there's enough data */ if (!qt_atom_parser_has_chunks (&stream->stts, stream->n_sample_times, 8)) { stream->n_sample_times = gst_byte_reader_get_remaining (&stream->stts) / 8; GST_LOG_OBJECT (qtdemux, "overriding to %u timestamp blocks", stream->n_sample_times); if (!stream->n_sample_times) goto corrupt_file; } /* sync sample atom */ stream->stps_present = FALSE; if ((stream->stss_present = ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stss, &stream->stss) ? TRUE : FALSE) == TRUE) { /* copy atom data into a new buffer for later use */ stream->stss.data = g_memdup (stream->stss.data, stream->stss.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->stss, 1 + 3) || !gst_byte_reader_get_uint32_be (&stream->stss, &stream->n_sample_syncs)) goto corrupt_file; if (stream->n_sample_syncs) { /* make sure there's enough data */ if (!qt_atom_parser_has_chunks (&stream->stss, stream->n_sample_syncs, 4)) goto corrupt_file; } /* partial sync sample atom */ if ((stream->stps_present = ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stps, &stream->stps) ? TRUE : FALSE) == TRUE) { /* copy atom data into a new buffer for later use */ stream->stps.data = g_memdup (stream->stps.data, stream->stps.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->stps, 1 + 3) || !gst_byte_reader_get_uint32_be (&stream->stps, &stream->n_sample_partial_syncs)) goto corrupt_file; /* if there are no entries, the stss table contains the real * sync samples */ if (stream->n_sample_partial_syncs) { /* make sure there's enough data */ if (!qt_atom_parser_has_chunks (&stream->stps, stream->n_sample_partial_syncs, 4)) goto corrupt_file; } } } /* sample size */ if (!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stsz, &stream->stsz)) goto no_samples; /* copy atom data into a new buffer for later use */ stream->stsz.data = g_memdup (stream->stsz.data, stream->stsz.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->stsz, 1 + 3) || !gst_byte_reader_get_uint32_be (&stream->stsz, &stream->sample_size)) goto corrupt_file; if (!gst_byte_reader_get_uint32_be (&stream->stsz, &stream->n_samples)) goto corrupt_file; if (!stream->n_samples) goto no_samples; /* sample-to-chunk atom */ if (!qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stsc, &stream->stsc)) goto corrupt_file; /* copy atom data into a new buffer for later use */ stream->stsc.data = g_memdup (stream->stsc.data, stream->stsc.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->stsc, 1 + 3) || !gst_byte_reader_get_uint32_be (&stream->stsc, &stream->n_samples_per_chunk)) goto corrupt_file; GST_DEBUG_OBJECT (qtdemux, "n_samples_per_chunk %u", stream->n_samples_per_chunk); /* make sure there's enough data */ if (!qt_atom_parser_has_chunks (&stream->stsc, stream->n_samples_per_chunk, 12)) goto corrupt_file; /* chunk offset */ if (qtdemux_tree_get_child_by_type_full (stbl, FOURCC_stco, &stream->stco)) stream->co_size = sizeof (guint32); else if (qtdemux_tree_get_child_by_type_full (stbl, FOURCC_co64, &stream->stco)) stream->co_size = sizeof (guint64); else goto corrupt_file; /* copy atom data into a new buffer for later use */ stream->stco.data = g_memdup (stream->stco.data, stream->stco.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->stco, 1 + 3)) goto corrupt_file; /* chunks_are_chunks == 0 means treat chunks as samples */ stream->chunks_are_chunks = !stream->sample_size || stream->sampled; if (stream->chunks_are_chunks) { /* skip number of entries */ if (!gst_byte_reader_skip (&stream->stco, 4)) goto corrupt_file; /* make sure there are enough data in the stsz atom */ if (!stream->sample_size) { /* different sizes for each sample */ if (!qt_atom_parser_has_chunks (&stream->stsz, stream->n_samples, 4)) goto corrupt_file; } } else { /* treat chunks as samples */ if (!gst_byte_reader_get_uint32_be (&stream->stco, &stream->n_samples)) goto corrupt_file; } GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u * %u (%.2f MB)", stream->n_samples, (guint) sizeof (QtDemuxSample), stream->n_samples * sizeof (QtDemuxSample) / (1024.0 * 1024.0)); if (stream->n_samples >= QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) { GST_WARNING_OBJECT (qtdemux, "not allocating index of %d samples, would " "be larger than %uMB (broken file?)", stream->n_samples, QTDEMUX_MAX_SAMPLE_INDEX_SIZE >> 20); return FALSE; } stream->samples = g_try_new0 (QtDemuxSample, stream->n_samples); if (!stream->samples) { GST_WARNING_OBJECT (qtdemux, "failed to allocate %d samples", stream->n_samples); return FALSE; } /* composition time-to-sample */ if ((stream->ctts_present = ! !qtdemux_tree_get_child_by_type_full (stbl, FOURCC_ctts, &stream->ctts) ? TRUE : FALSE) == TRUE) { /* copy atom data into a new buffer for later use */ stream->ctts.data = g_memdup (stream->ctts.data, stream->ctts.size); /* skip version + flags */ if (!gst_byte_reader_skip (&stream->ctts, 1 + 3) || !gst_byte_reader_get_uint32_be (&stream->ctts, &stream->n_composition_times)) goto corrupt_file; /* make sure there's enough data */ if (!qt_atom_parser_has_chunks (&stream->ctts, stream->n_composition_times, 4 + 4)) goto corrupt_file; } return TRUE; corrupt_file: { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), (NULL)); return FALSE; } no_samples: { gst_qtdemux_stbl_free (stream); if (!qtdemux->fragmented) { /* not quite good */ GST_WARNING_OBJECT (qtdemux, "stream has no samples"); return FALSE; } else { /* may pick up samples elsewhere */ return TRUE; } } } /* collect samples from the next sample to be parsed up to sample @n for @stream * by reading the info from @stbl * * This code can be executed from both the streaming thread and the seeking * thread so it takes the object lock to protect itself */ static gboolean qtdemux_parse_samples (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 n) { gint i, j, k; QtDemuxSample *samples, *first, *cur, *last; guint32 n_samples_per_chunk; guint32 n_samples; GST_LOG_OBJECT (qtdemux, "parsing samples for stream fourcc %" GST_FOURCC_FORMAT ", pad %s", GST_FOURCC_ARGS (stream->fourcc), stream->pad ? GST_PAD_NAME (stream->pad) : "(NULL)"); n_samples = stream->n_samples; if (n >= n_samples) goto out_of_samples; GST_OBJECT_LOCK (qtdemux); if (n <= stream->stbl_index) goto already_parsed; GST_DEBUG_OBJECT (qtdemux, "parsing up to sample %u", n); if (!stream->stsz.data) { /* so we already parsed and passed all the moov samples; * onto fragmented ones */ g_assert (qtdemux->fragmented); goto done; } /* pointer to the sample table */ samples = stream->samples; /* starts from -1, moves to the next sample index to parse */ stream->stbl_index++; /* keep track of the first and last sample to fill */ first = &samples[stream->stbl_index]; last = &samples[n]; if (stream->chunks_are_chunks) { /* set the sample sizes */ if (stream->sample_size == 0) { /* different sizes for each sample */ for (cur = first; cur <= last; cur++) { cur->size = gst_byte_reader_get_uint32_be_unchecked (&stream->stsz); GST_LOG_OBJECT (qtdemux, "sample %d has size %u", (guint) (cur - samples), cur->size); } } else { /* samples have the same size */ GST_LOG_OBJECT (qtdemux, "all samples have size %u", stream->sample_size); for (cur = first; cur <= last; cur++) cur->size = stream->sample_size; } } n_samples_per_chunk = stream->n_samples_per_chunk; cur = first; for (i = stream->stsc_index; i < n_samples_per_chunk; i++) { guint32 last_chunk; if (stream->stsc_chunk_index >= stream->last_chunk || stream->stsc_chunk_index < stream->first_chunk) { stream->first_chunk = gst_byte_reader_get_uint32_be_unchecked (&stream->stsc); stream->samples_per_chunk = gst_byte_reader_get_uint32_be_unchecked (&stream->stsc); gst_byte_reader_skip_unchecked (&stream->stsc, 4); /* chunk numbers are counted from 1 it seems */ if (G_UNLIKELY (stream->first_chunk == 0)) goto corrupt_file; --stream->first_chunk; /* the last chunk of each entry is calculated by taking the first chunk * of the next entry; except if there is no next, where we fake it with * INT_MAX */ if (G_UNLIKELY (i == (stream->n_samples_per_chunk - 1))) { stream->last_chunk = G_MAXUINT32; } else { stream->last_chunk = gst_byte_reader_peek_uint32_be_unchecked (&stream->stsc); if (G_UNLIKELY (stream->last_chunk == 0)) goto corrupt_file; --stream->last_chunk; } GST_LOG_OBJECT (qtdemux, "entry %d has first_chunk %d, last_chunk %d, samples_per_chunk %d", i, stream->first_chunk, stream->last_chunk, stream->samples_per_chunk); if (G_UNLIKELY (stream->last_chunk < stream->first_chunk)) goto corrupt_file; if (stream->last_chunk != G_MAXUINT32) { if (!qt_atom_parser_peek_sub (&stream->stco, stream->first_chunk * stream->co_size, (stream->last_chunk - stream->first_chunk) * stream->co_size, &stream->co_chunk)) goto corrupt_file; } else { stream->co_chunk = stream->stco; if (!gst_byte_reader_skip (&stream->co_chunk, stream->first_chunk * stream->co_size)) goto corrupt_file; } stream->stsc_chunk_index = stream->first_chunk; } last_chunk = stream->last_chunk; if (stream->chunks_are_chunks) { for (j = stream->stsc_chunk_index; j < last_chunk; j++) { guint32 samples_per_chunk; guint64 chunk_offset; if (!stream->stsc_sample_index && !qt_atom_parser_get_offset (&stream->co_chunk, stream->co_size, &stream->chunk_offset)) goto corrupt_file; samples_per_chunk = stream->samples_per_chunk; chunk_offset = stream->chunk_offset; for (k = stream->stsc_sample_index; k < samples_per_chunk; k++) { GST_LOG_OBJECT (qtdemux, "Creating entry %d with offset %" G_GUINT64_FORMAT, (guint) (cur - samples), stream->chunk_offset); cur->offset = chunk_offset; chunk_offset += cur->size; cur++; if (G_UNLIKELY (cur > last)) { /* save state */ stream->stsc_sample_index = k + 1; stream->chunk_offset = chunk_offset; stream->stsc_chunk_index = j; goto done2; } } stream->stsc_sample_index = 0; } stream->stsc_chunk_index = j; } else { cur = &samples[stream->stsc_chunk_index]; for (j = stream->stsc_chunk_index; j < last_chunk; j++) { if (j > n) { /* save state */ stream->stsc_chunk_index = j; goto done; } cur->offset = qt_atom_parser_get_offset_unchecked (&stream->co_chunk, stream->co_size); GST_LOG_OBJECT (qtdemux, "Created entry %d with offset " "%" G_GUINT64_FORMAT, j, cur->offset); if (stream->samples_per_frame * stream->bytes_per_frame) { cur->size = (stream->samples_per_chunk * stream->n_channels) / stream->samples_per_frame * stream->bytes_per_frame; } else { cur->size = stream->samples_per_chunk; } GST_DEBUG_OBJECT (qtdemux, "keyframe sample %d: timestamp %" GST_TIME_FORMAT ", size %u", j, GST_TIME_ARGS (gst_util_uint64_scale (stream->stco_sample_index, GST_SECOND, stream->timescale)), cur->size); cur->timestamp = stream->stco_sample_index; cur->duration = stream->samples_per_chunk; cur->keyframe = TRUE; cur++; stream->stco_sample_index += stream->samples_per_chunk; } stream->stsc_chunk_index = j; } stream->stsc_index++; } if (!stream->chunks_are_chunks) goto ctts; done2: { guint32 n_sample_times; n_sample_times = stream->n_sample_times; cur = first; for (i = stream->stts_index; i < n_sample_times; i++) { guint32 stts_samples; gint32 stts_duration; gint64 stts_time; if (stream->stts_sample_index >= stream->stts_samples || !stream->stts_sample_index) { stream->stts_samples = gst_byte_reader_get_uint32_be_unchecked (&stream->stts); stream->stts_duration = gst_byte_reader_get_uint32_be_unchecked (&stream->stts); GST_LOG_OBJECT (qtdemux, "block %d, %u timestamps, duration %u", i, stream->stts_samples, stream->stts_duration); stream->stts_sample_index = 0; } stts_samples = stream->stts_samples; stts_duration = stream->stts_duration; stts_time = stream->stts_time; for (j = stream->stts_sample_index; j < stts_samples; j++) { GST_DEBUG_OBJECT (qtdemux, "sample %d: index %d, timestamp %" GST_TIME_FORMAT, (guint) (cur - samples), j, GST_TIME_ARGS (gst_util_uint64_scale (stts_time, GST_SECOND, stream->timescale))); cur->timestamp = stts_time; cur->duration = stts_duration; /* avoid 32-bit wrap-around, * but still mind possible 'negative' duration */ stts_time += (gint64) stts_duration; cur++; if (G_UNLIKELY (cur > last)) { /* save values */ stream->stts_time = stts_time; stream->stts_sample_index = j + 1; goto done3; } } stream->stts_sample_index = 0; stream->stts_time = stts_time; stream->stts_index++; } /* fill up empty timestamps with the last timestamp, this can happen when * the last samples do not decode and so we don't have timestamps for them. * We however look at the last timestamp to estimate the track length so we * need something in here. */ for (; cur < last; cur++) { GST_DEBUG_OBJECT (qtdemux, "fill sample %d: timestamp %" GST_TIME_FORMAT, (guint) (cur - samples), GST_TIME_ARGS (gst_util_uint64_scale (stream->stts_time, GST_SECOND, stream->timescale))); cur->timestamp = stream->stts_time; cur->duration = -1; } } done3: { /* sample sync, can be NULL */ if (stream->stss_present == TRUE) { guint32 n_sample_syncs; n_sample_syncs = stream->n_sample_syncs; if (!n_sample_syncs) { GST_DEBUG_OBJECT (qtdemux, "all samples are keyframes"); stream->all_keyframe = TRUE; } else { for (i = stream->stss_index; i < n_sample_syncs; i++) { /* note that the first sample is index 1, not 0 */ guint32 index; index = gst_byte_reader_get_uint32_be_unchecked (&stream->stss); if (G_LIKELY (index > 0 && index <= n_samples)) { index -= 1; samples[index].keyframe = TRUE; GST_DEBUG_OBJECT (qtdemux, "samples at %u is keyframe", index); /* and exit if we have enough samples */ if (G_UNLIKELY (index >= n)) { i++; break; } } } /* save state */ stream->stss_index = i; } /* stps marks partial sync frames like open GOP I-Frames */ if (stream->stps_present == TRUE) { guint32 n_sample_partial_syncs; n_sample_partial_syncs = stream->n_sample_partial_syncs; /* if there are no entries, the stss table contains the real * sync samples */ if (n_sample_partial_syncs) { for (i = stream->stps_index; i < n_sample_partial_syncs; i++) { /* note that the first sample is index 1, not 0 */ guint32 index; index = gst_byte_reader_get_uint32_be_unchecked (&stream->stps); if (G_LIKELY (index > 0 && index <= n_samples)) { index -= 1; samples[index].keyframe = TRUE; GST_DEBUG_OBJECT (qtdemux, "samples at %u is keyframe", index); /* and exit if we have enough samples */ if (G_UNLIKELY (index >= n)) { i++; break; } } } /* save state */ stream->stps_index = i; } } } else { /* no stss, all samples are keyframes */ stream->all_keyframe = TRUE; GST_DEBUG_OBJECT (qtdemux, "setting all keyframes"); } } ctts: /* composition time to sample */ if (stream->ctts_present == TRUE) { guint32 n_composition_times; guint32 ctts_count; gint32 ctts_soffset; /* Fill in the pts_offsets */ cur = first; n_composition_times = stream->n_composition_times; for (i = stream->ctts_index; i < n_composition_times; i++) { if (stream->ctts_sample_index >= stream->ctts_count || !stream->ctts_sample_index) { stream->ctts_count = gst_byte_reader_get_uint32_be_unchecked (&stream->ctts); stream->ctts_soffset = gst_byte_reader_get_int32_be_unchecked (&stream->ctts); stream->ctts_sample_index = 0; } ctts_count = stream->ctts_count; ctts_soffset = stream->ctts_soffset; for (j = stream->ctts_sample_index; j < ctts_count; j++) { cur->pts_offset = ctts_soffset; cur++; if (G_UNLIKELY (cur > last)) { /* save state */ stream->ctts_sample_index = j + 1; goto done; } } stream->ctts_sample_index = 0; stream->ctts_index++; } } done: stream->stbl_index = n; /* if index has been completely parsed, free data that is no-longer needed */ if (n + 1 == stream->n_samples) { gst_qtdemux_stbl_free (stream); GST_DEBUG_OBJECT (qtdemux, "parsed all available samples; checking for more"); while (n + 1 == stream->n_samples) if (qtdemux_add_fragmented_samples (qtdemux) != GST_FLOW_OK) break; } GST_OBJECT_UNLOCK (qtdemux); return TRUE; /* SUCCESS */ already_parsed: { GST_LOG_OBJECT (qtdemux, "Tried to parse up to sample %u but this sample has already been parsed", n); /* if fragmented, there may be more */ if (qtdemux->fragmented && n == stream->stbl_index) goto done; GST_OBJECT_UNLOCK (qtdemux); return TRUE; } /* ERRORS */ out_of_samples: { GST_LOG_OBJECT (qtdemux, "Tried to parse up to sample %u but there are only %u samples", n + 1, stream->n_samples); GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), (NULL)); return FALSE; } corrupt_file: { GST_OBJECT_UNLOCK (qtdemux); GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), (NULL)); return FALSE; } } /* collect all segment info for @stream. */ static gboolean qtdemux_parse_segments (GstQTDemux * qtdemux, QtDemuxStream * stream, GNode * trak) { GNode *edts; /* parse and prepare segment info from the edit list */ GST_DEBUG_OBJECT (qtdemux, "looking for edit list container"); stream->n_segments = 0; stream->segments = NULL; if ((edts = qtdemux_tree_get_child_by_type (trak, FOURCC_edts))) { GNode *elst; gint n_segments; gint i, count; guint64 time, stime; guint8 *buffer; GST_DEBUG_OBJECT (qtdemux, "looking for edit list"); if (!(elst = qtdemux_tree_get_child_by_type (edts, FOURCC_elst))) goto done; buffer = elst->data; n_segments = QT_UINT32 (buffer + 12); /* we might allocate a bit too much, at least allocate 1 segment */ stream->segments = g_new (QtDemuxSegment, MAX (n_segments, 1)); /* segments always start from 0 */ time = 0; stime = 0; count = 0; for (i = 0; i < n_segments; i++) { guint64 duration; guint64 media_time; QtDemuxSegment *segment; guint32 rate_int; media_time = QT_UINT32 (buffer + 20 + i * 12); /* -1 media time is an empty segment, just ignore it */ if (media_time == G_MAXUINT32) continue; duration = QT_UINT32 (buffer + 16 + i * 12); segment = &stream->segments[count++]; /* time and duration expressed in global timescale */ segment->time = stime; /* add non scaled values so we don't cause roundoff errors */ time += duration; stime = gst_util_uint64_scale (time, GST_SECOND, qtdemux->timescale); segment->stop_time = stime; segment->duration = stime - segment->time; /* media_time expressed in stream timescale */ segment->media_start = gst_util_uint64_scale (media_time, GST_SECOND, stream->timescale); segment->media_stop = segment->media_start + segment->duration; rate_int = GST_READ_UINT32_BE (buffer + 24 + i * 12); if (rate_int <= 1) { /* 0 is not allowed, some programs write 1 instead of the floating point * value */ GST_WARNING_OBJECT (qtdemux, "found suspicious rate %" G_GUINT32_FORMAT, rate_int); segment->rate = 1; } else { segment->rate = rate_int / 65536.0; } GST_DEBUG_OBJECT (qtdemux, "created segment %d time %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT ", media_time %" GST_TIME_FORMAT ", rate %g, (%d)", i, GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->duration), GST_TIME_ARGS (segment->media_start), segment->rate, rate_int); } GST_DEBUG_OBJECT (qtdemux, "found %d non-empty segments", count); stream->n_segments = count; } done: /* push based does not handle segments, so act accordingly here, * and warn if applicable */ if (!qtdemux->pullbased) { GST_WARNING_OBJECT (qtdemux, "streaming; discarding edit list segments"); /* remove and use default one below, we stream like it anyway */ g_free (stream->segments); stream->segments = NULL; stream->n_segments = 0; } /* no segments, create one to play the complete trak */ if (stream->n_segments == 0) { GstClockTime stream_duration = gst_util_uint64_scale (stream->duration, GST_SECOND, stream->timescale); if (stream->segments == NULL) stream->segments = g_new (QtDemuxSegment, 1); /* represent unknown our way */ if (stream_duration == 0) stream_duration = -1; stream->segments[0].time = 0; stream->segments[0].stop_time = stream_duration; stream->segments[0].duration = stream_duration; stream->segments[0].media_start = 0; stream->segments[0].media_stop = stream_duration; stream->segments[0].rate = 1.0; GST_DEBUG_OBJECT (qtdemux, "created dummy segment %" GST_TIME_FORMAT, GST_TIME_ARGS (stream_duration)); stream->n_segments = 1; } GST_DEBUG_OBJECT (qtdemux, "using %d segments", stream->n_segments); return TRUE; } /* * Parses the stsd atom of a svq3 trak looking for * the SMI and gama atoms. */ static void qtdemux_parse_svq3_stsd_data (GstQTDemux * qtdemux, GNode * stsd, guint8 ** gamma, GstBuffer ** seqh) { guint8 *_gamma = NULL; GstBuffer *_seqh = NULL; guint8 *stsd_data = stsd->data; guint32 length = QT_UINT32 (stsd_data); guint16 version; if (length < 32) { GST_WARNING_OBJECT (qtdemux, "stsd too short"); goto end; } stsd_data += 32; length -= 32; version = QT_UINT16 (stsd_data); if (version == 3) { if (length >= 70) { length -= 70; stsd_data += 70; while (length > 8) { guint32 fourcc, size; guint8 *data; size = QT_UINT32 (stsd_data); fourcc = QT_FOURCC (stsd_data + 4); data = stsd_data + 8; switch (fourcc) { case FOURCC_gama:{ if (size == 12) { _gamma = data; } else { GST_WARNING_OBJECT (qtdemux, "Unexpected size %" G_GUINT32_FORMAT " for gama atom, expected 12", size); } break; } case FOURCC_SMI_:{ if (size > 16 && QT_FOURCC (data) == FOURCC_SEQH) { guint32 seqh_size; if (_seqh != NULL) { GST_WARNING_OBJECT (qtdemux, "Unexpected second SEQH SMI atom " " found, ignoring"); } else { seqh_size = QT_UINT32 (data + 4); if (seqh_size > 0) { _seqh = gst_buffer_new_and_alloc (seqh_size); memcpy (GST_BUFFER_DATA (_seqh), data + 8, seqh_size); } } } break; } default:{ GST_WARNING_OBJECT (qtdemux, "Unhandled atom %" GST_FOURCC_FORMAT " in SVQ3 entry in stsd atom", GST_FOURCC_ARGS (fourcc)); } } if (size <= length) { length -= size; stsd_data += size; } } } else { GST_WARNING_OBJECT (qtdemux, "SVQ3 entry too short in stsd atom"); } } else { GST_WARNING_OBJECT (qtdemux, "Unexpected version for SVQ3 entry %" G_GUINT16_FORMAT, version); goto end; } end: if (gamma) { *gamma = _gamma; } if (seqh) { *seqh = _seqh; } else if (_seqh) { gst_buffer_unref (_seqh); } } static gchar * qtdemux_get_rtsp_uri_from_hndl (GstQTDemux * qtdemux, GNode * minf) { GNode *dinf; GstByteReader dref; gchar *uri = NULL; /* * Get 'dinf', to get its child 'dref', that might contain a 'hndl' * atom that might contain a 'data' atom with the rtsp uri. * This case was reported in bug #597497, some info about * the hndl atom can be found in TN1195 */ dinf = qtdemux_tree_get_child_by_type (minf, FOURCC_dinf); GST_DEBUG_OBJECT (qtdemux, "Trying to obtain rtsp URI for stream trak"); if (dinf) { guint32 dref_num_entries = 0; if (qtdemux_tree_get_child_by_type_full (dinf, FOURCC_dref, &dref) && gst_byte_reader_skip (&dref, 4) && gst_byte_reader_get_uint32_be (&dref, &dref_num_entries)) { gint i; /* search dref entries for hndl atom */ for (i = 0; i < dref_num_entries; i++) { guint32 size = 0, type; guint8 string_len = 0; if (gst_byte_reader_get_uint32_be (&dref, &size) && qt_atom_parser_get_fourcc (&dref, &type)) { if (type == FOURCC_hndl) { GST_DEBUG_OBJECT (qtdemux, "Found hndl atom"); /* skip data reference handle bytes and the * following pascal string and some extra 4 * bytes I have no idea what are */ if (!gst_byte_reader_skip (&dref, 4) || !gst_byte_reader_get_uint8 (&dref, &string_len) || !gst_byte_reader_skip (&dref, string_len + 4)) { GST_WARNING_OBJECT (qtdemux, "Failed to parse hndl atom"); break; } /* iterate over the atoms to find the data atom */ while (gst_byte_reader_get_remaining (&dref) >= 8) { guint32 atom_size; guint32 atom_type; if (gst_byte_reader_get_uint32_be (&dref, &atom_size) && qt_atom_parser_get_fourcc (&dref, &atom_type)) { if (atom_type == FOURCC_data) { const guint8 *uri_aux = NULL; /* found the data atom that might contain the rtsp uri */ GST_DEBUG_OBJECT (qtdemux, "Found data atom inside " "hndl atom, interpreting it as an URI"); if (gst_byte_reader_peek_data (&dref, atom_size - 8, &uri_aux)) { if (g_strstr_len ((gchar *) uri_aux, 7, "rtsp://") != NULL) uri = g_strndup ((gchar *) uri_aux, atom_size - 8); else GST_WARNING_OBJECT (qtdemux, "Data atom in hndl atom " "didn't contain a rtsp address"); } else { GST_WARNING_OBJECT (qtdemux, "Failed to get the data " "atom contents"); } break; } /* skipping to the next entry */ gst_byte_reader_skip (&dref, atom_size - 8); } else { GST_WARNING_OBJECT (qtdemux, "Failed to parse hndl child " "atom header"); break; } } break; } /* skip to the next entry */ gst_byte_reader_skip (&dref, size - 8); } else { GST_WARNING_OBJECT (qtdemux, "Error parsing dref atom"); } } GST_DEBUG_OBJECT (qtdemux, "Finished parsing dref atom"); } } return uri; } static gint less_than (gconstpointer a, gconstpointer b) { const guint32 *av = a, *bv = b; return *av - *bv; } #define AMR_NB_ALL_MODES 0x81ff #define AMR_WB_ALL_MODES 0x83ff static guint qtdemux_parse_amr_bitrate (GstBuffer * buf, gboolean wb) { /* The 'damr' atom is of the form: * * | vendor | decoder_ver | mode_set | mode_change_period | frames/sample | * 32 b 8 b 16 b 8 b 8 b * * The highest set bit of the first 7 (AMR-NB) or 8 (AMR-WB) bits of mode_set * represents the highest mode used in the stream (and thus the maximum * bitrate), with a couple of special cases as seen below. */ /* Map of frame type ID -> bitrate */ static const guint nb_bitrates[] = { 4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200 }; static const guint wb_bitrates[] = { 6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850 }; const guint8 *data = GST_BUFFER_DATA (buf); guint size = QT_UINT32 (data), max_mode; guint16 mode_set; if (GST_BUFFER_SIZE (buf) != 0x11) { GST_DEBUG ("Atom should have size 0x11, not %u", size); goto bad_data; } if (QT_FOURCC (data + 4) != GST_MAKE_FOURCC ('d', 'a', 'm', 'r')) { GST_DEBUG ("Unknown atom in %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (QT_UINT32 (data + 4))); goto bad_data; } mode_set = QT_UINT16 (data + 13); if (mode_set == (wb ? AMR_WB_ALL_MODES : AMR_NB_ALL_MODES)) max_mode = 7 + (wb ? 1 : 0); else /* AMR-NB modes fo from 0-7, and AMR-WB modes go from 0-8 */ max_mode = g_bit_nth_msf ((gulong) mode_set & (wb ? 0x1ff : 0xff), -1); if (max_mode == -1) { GST_DEBUG ("No mode indication was found (mode set) = %x", (guint) mode_set); goto bad_data; } return wb ? wb_bitrates[max_mode] : nb_bitrates[max_mode]; bad_data: return 0; } /* parse the traks. * With each track we associate a new QtDemuxStream that contains all the info * about the trak. * traks that do not decode to something (like strm traks) will not have a pad. */ static gboolean qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) { GstByteReader tkhd; int offset; GNode *mdia; GNode *mdhd; GNode *hdlr; GNode *minf; GNode *stbl; GNode *stsd; GNode *mp4a; GNode *mp4v; GNode *wave; GNode *esds; GNode *pasp; QtDemuxStream *stream; GstTagList *list = NULL; gchar *codec = NULL; const guint8 *stsd_data; guint16 lang_code; /* quicktime lang code or packed iso code */ guint32 version; guint32 tkhd_flags = 0; guint8 tkhd_version = 0; guint32 fourcc; guint value_size, len; stream = g_new0 (QtDemuxStream, 1); /* new streams always need a discont */ stream->discont = TRUE; /* we enable clipping for raw audio/video streams */ stream->need_clip = FALSE; stream->need_process = FALSE; stream->segment_index = -1; stream->time_position = 0; stream->sample_index = -1; stream->last_ret = GST_FLOW_OK; if (!qtdemux_tree_get_child_by_type_full (trak, FOURCC_tkhd, &tkhd) || !gst_byte_reader_get_uint8 (&tkhd, &tkhd_version) || !gst_byte_reader_get_uint24_be (&tkhd, &tkhd_flags)) goto corrupt_file; /* pick between 64 or 32 bits */ value_size = tkhd_version == 1 ? 8 : 4; if (!gst_byte_reader_skip (&tkhd, value_size * 2) || !gst_byte_reader_get_uint32_be (&tkhd, &stream->track_id)) goto corrupt_file; GST_LOG_OBJECT (qtdemux, "track[tkhd] version/flags/id: 0x%02x/%06x/%u", tkhd_version, tkhd_flags, stream->track_id); if (!(mdia = qtdemux_tree_get_child_by_type (trak, FOURCC_mdia))) goto corrupt_file; if (!(mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mdhd))) { /* be nice for some crooked mjp2 files that use mhdr for mdhd */ if (qtdemux->major_brand != FOURCC_mjp2 || !(mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mhdr))) goto corrupt_file; } len = QT_UINT32 ((guint8 *) mdhd->data); version = QT_UINT32 ((guint8 *) mdhd->data + 8); GST_LOG_OBJECT (qtdemux, "track version/flags: %08x", version); if (version == 0x01000000) { if (len < 38) goto corrupt_file; stream->timescale = QT_UINT32 ((guint8 *) mdhd->data + 28); stream->duration = QT_UINT64 ((guint8 *) mdhd->data + 32); lang_code = QT_UINT16 ((guint8 *) mdhd->data + 36); } else { if (len < 30) goto corrupt_file; stream->timescale = QT_UINT32 ((guint8 *) mdhd->data + 20); stream->duration = QT_UINT32 ((guint8 *) mdhd->data + 24); lang_code = QT_UINT16 ((guint8 *) mdhd->data + 28); } if (lang_code < 0x800) { qtdemux_lang_map_qt_code_to_iso (stream->lang_id, lang_code); } else { stream->lang_id[0] = 0x60 + ((lang_code >> 10) & 0x1F); stream->lang_id[1] = 0x60 + ((lang_code >> 5) & 0x1F); stream->lang_id[2] = 0x60 + (lang_code & 0x1F); stream->lang_id[3] = 0; } GST_LOG_OBJECT (qtdemux, "track timescale: %" G_GUINT32_FORMAT, stream->timescale); GST_LOG_OBJECT (qtdemux, "track duration: %" G_GUINT64_FORMAT, stream->duration); GST_LOG_OBJECT (qtdemux, "track language code/id: 0x%04x/%s", lang_code, stream->lang_id); if (G_UNLIKELY (stream->timescale == 0 || qtdemux->timescale == 0)) goto corrupt_file; /* fragmented files may have bogus duration in moov */ if (!qtdemux->fragmented && qtdemux->duration != G_MAXINT64 && stream->duration != G_MAXINT32) { guint64 tdur1, tdur2; /* don't overflow */ tdur1 = stream->timescale * (guint64) qtdemux->duration; tdur2 = qtdemux->timescale * (guint64) stream->duration; /* HACK: * some of those trailers, nowadays, have prologue images that are * themselves vide tracks as well. I haven't really found a way to * identify those yet, except for just looking at their duration. */ if (tdur1 != 0 && (tdur2 * 10 / tdur1) < 2) { GST_WARNING_OBJECT (qtdemux, "Track shorter than 20%% (%" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT " vs. %" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT ") of the stream " "found, assuming preview image or something; skipping track", stream->duration, stream->timescale, qtdemux->duration, qtdemux->timescale); g_free (stream); return TRUE; } } if (!(hdlr = qtdemux_tree_get_child_by_type (mdia, FOURCC_hdlr))) goto corrupt_file; GST_LOG_OBJECT (qtdemux, "track type: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (QT_FOURCC ((guint8 *) hdlr->data + 12))); len = QT_UINT32 ((guint8 *) hdlr->data); if (len >= 20) stream->subtype = QT_FOURCC ((guint8 *) hdlr->data + 16); GST_LOG_OBJECT (qtdemux, "track subtype: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (stream->subtype)); if (!(minf = qtdemux_tree_get_child_by_type (mdia, FOURCC_minf))) goto corrupt_file; if (!(stbl = qtdemux_tree_get_child_by_type (minf, FOURCC_stbl))) goto corrupt_file; /* parse stsd */ if (!(stsd = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsd))) goto corrupt_file; stsd_data = (const guint8 *) stsd->data; /* stsd should at least have one entry */ len = QT_UINT32 (stsd_data); if (len < 24) goto corrupt_file; /* and that entry should fit within stsd */ len = QT_UINT32 (stsd_data + 16); if (len > QT_UINT32 (stsd_data) + 16) goto corrupt_file; GST_LOG_OBJECT (qtdemux, "stsd len: %d", len); stream->fourcc = fourcc = QT_FOURCC (stsd_data + 16 + 4); GST_LOG_OBJECT (qtdemux, "stsd type: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (stream->fourcc)); if ((fourcc == FOURCC_drms) || (fourcc == FOURCC_drmi) || ((fourcc & 0xFFFFFF00) == GST_MAKE_FOURCC ('e', 'n', 'c', 0))) goto error_encrypted; if (stream->subtype == FOURCC_vide) { guint32 w = 0, h = 0; stream->sampled = TRUE; /* version 1 uses some 64-bit ints */ if (!gst_byte_reader_skip (&tkhd, 56 + value_size) || !gst_byte_reader_get_uint32_be (&tkhd, &w) || !gst_byte_reader_get_uint32_be (&tkhd, &h)) goto corrupt_file; stream->display_width = w >> 16; stream->display_height = h >> 16; offset = 16; if (len < 86) goto corrupt_file; stream->width = QT_UINT16 (stsd_data + offset + 32); stream->height = QT_UINT16 (stsd_data + offset + 34); stream->fps_n = 0; /* this is filled in later */ stream->fps_d = 0; /* this is filled in later */ stream->bits_per_sample = QT_UINT16 (stsd_data + offset + 82); stream->color_table_id = QT_UINT16 (stsd_data + offset + 84); GST_LOG_OBJECT (qtdemux, "frame count: %u", QT_UINT16 (stsd_data + offset + 48)); stream->caps = qtdemux_video_caps (qtdemux, stream, fourcc, stsd_data, &codec); if (codec) { list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_VIDEO_CODEC, codec, NULL); g_free (codec); codec = NULL; } esds = NULL; pasp = NULL; /* pick 'the' stsd child */ mp4v = qtdemux_tree_get_child_by_type (stsd, fourcc); if (mp4v) { esds = qtdemux_tree_get_child_by_type (mp4v, FOURCC_esds); pasp = qtdemux_tree_get_child_by_type (mp4v, FOURCC_pasp); } if (pasp) { const guint8 *pasp_data = (const guint8 *) pasp->data; stream->par_w = QT_UINT32 (pasp_data + 8); stream->par_h = QT_UINT32 (pasp_data + 12); } else { stream->par_w = 0; stream->par_h = 0; } if (esds) { gst_qtdemux_handle_esds (qtdemux, stream, esds, list); } else { switch (fourcc) { case FOURCC_avc1: { gint len = QT_UINT32 (stsd_data) - 0x66; const guint8 *avc_data = stsd_data + 0x66; /* find avcC */ while (len >= 0x8) { gint size; if (QT_UINT32 (avc_data) <= len) size = QT_UINT32 (avc_data) - 0x8; else size = len - 0x8; if (size < 1) /* No real data, so break out */ break; switch (QT_FOURCC (avc_data + 0x4)) { case FOURCC_avcC: { /* parse, if found */ GstBuffer *buf; GST_DEBUG_OBJECT (qtdemux, "found avcC codec_data in stsd"); /* First 4 bytes are the length of the atom, the next 4 bytes * are the fourcc, the next 1 byte is the version, and the * subsequent bytes are sequence parameter set like data. */ gst_codec_utils_h264_caps_set_level_and_profile (stream->caps, avc_data + 8 + 1, size - 1); buf = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buf), avc_data + 0x8, size); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); break; } case FOURCC_btrt: { guint avg_bitrate, max_bitrate; /* bufferSizeDB, maxBitrate and avgBitrate - 4 bytes each */ if (size < 12) break; max_bitrate = QT_UINT32 (avc_data + 0xc); avg_bitrate = QT_UINT32 (avc_data + 0x10); if (!max_bitrate && !avg_bitrate) break; /* Some muxers seem to swap the average and maximum bitrates * (I'm looking at you, YouTube), so we swap for sanity. */ if (max_bitrate > 0 && max_bitrate < avg_bitrate) { guint temp = avg_bitrate; avg_bitrate = max_bitrate; max_bitrate = temp; } if (!list) list = gst_tag_list_new (); if (max_bitrate > 0 && max_bitrate < G_MAXUINT32) { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_MAXIMUM_BITRATE, max_bitrate, NULL); } if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32) { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, avg_bitrate, NULL); } break; } default: break; } len -= size + 8; avc_data += size + 8; } break; } case FOURCC_mp4v: case FOURCC_MP4V: case FOURCC_fmp4: case FOURCC_FMP4: { GNode *glbl; GST_DEBUG_OBJECT (qtdemux, "found %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); /* codec data might be in glbl extension atom */ glbl = mp4v ? qtdemux_tree_get_child_by_type (mp4v, FOURCC_glbl) : NULL; if (glbl) { guint8 *data; GstBuffer *buf; gint len; GST_DEBUG_OBJECT (qtdemux, "found glbl data in stsd"); data = glbl->data; len = QT_UINT32 (data); if (len > 0x8) { len -= 0x8; buf = gst_buffer_new_and_alloc (len); memcpy (GST_BUFFER_DATA (buf), data + 8, len); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); } } break; } case FOURCC_mjp2: { /* see annex I of the jpeg2000 spec */ GNode *jp2h, *ihdr, *colr, *mjp2, *field, *prefix, *cmap, *cdef; const guint8 *data; guint32 fourcc = 0; gint ncomp = 0; guint32 ncomp_map = 0; gint32 *comp_map = NULL; guint32 nchan_def = 0; gint32 *chan_def = NULL; GST_DEBUG_OBJECT (qtdemux, "found mjp2"); /* some required atoms */ mjp2 = qtdemux_tree_get_child_by_type (stsd, FOURCC_mjp2); if (!mjp2) break; jp2h = qtdemux_tree_get_child_by_type (mjp2, FOURCC_jp2h); if (!jp2h) break; /* number of components; redundant with info in codestream, but useful to a muxer */ ihdr = qtdemux_tree_get_child_by_type (jp2h, FOURCC_ihdr); if (!ihdr || QT_UINT32 (ihdr->data) != 22) break; ncomp = QT_UINT16 (((guint8 *) ihdr->data) + 16); colr = qtdemux_tree_get_child_by_type (jp2h, FOURCC_colr); if (!colr) break; GST_DEBUG_OBJECT (qtdemux, "found colr"); /* extract colour space info */ if (QT_UINT8 ((guint8 *) colr->data + 8) == 1) { switch (QT_UINT32 ((guint8 *) colr->data + 11)) { case 16: fourcc = GST_MAKE_FOURCC ('s', 'R', 'G', 'B'); break; case 17: fourcc = GST_MAKE_FOURCC ('G', 'R', 'A', 'Y'); break; case 18: fourcc = GST_MAKE_FOURCC ('s', 'Y', 'U', 'V'); break; default: break; } } if (!fourcc) /* colr is required, and only values 16, 17, and 18 are specified, so error if we have no fourcc */ break; /* extract component mapping */ cmap = qtdemux_tree_get_child_by_type (jp2h, FOURCC_cmap); if (cmap) { guint32 cmap_len = 0; int i; cmap_len = QT_UINT32 (cmap->data); if (cmap_len >= 8) { /* normal box, subtract off header */ cmap_len -= 8; /* cmap: { u16 cmp; u8 mtyp; u8 pcol; }* */ if (cmap_len % 4 == 0) { ncomp_map = (cmap_len / 4); comp_map = g_new0 (gint32, ncomp_map); for (i = 0; i < ncomp_map; i++) { guint16 cmp; guint8 mtyp, pcol; cmp = QT_UINT16 (((guint8 *) cmap->data) + 8 + i * 4); mtyp = QT_UINT8 (((guint8 *) cmap->data) + 8 + i * 4 + 2); pcol = QT_UINT8 (((guint8 *) cmap->data) + 8 + i * 4 + 3); comp_map[i] = (mtyp << 24) | (pcol << 16) | cmp; } } } } /* extract channel definitions */ cdef = qtdemux_tree_get_child_by_type (jp2h, FOURCC_cdef); if (cdef) { guint32 cdef_len = 0; int i; cdef_len = QT_UINT32 (cdef->data); if (cdef_len >= 10) { /* normal box, subtract off header and len */ cdef_len -= 10; /* cdef: u16 n; { u16 cn; u16 typ; u16 asoc; }* */ if (cdef_len % 6 == 0) { nchan_def = (cdef_len / 6); chan_def = g_new0 (gint32, nchan_def); for (i = 0; i < nchan_def; i++) chan_def[i] = -1; for (i = 0; i < nchan_def; i++) { guint16 cn, typ, asoc; cn = QT_UINT16 (((guint8 *) cdef->data) + 10 + i * 6); typ = QT_UINT16 (((guint8 *) cdef->data) + 10 + i * 6 + 2); asoc = QT_UINT16 (((guint8 *) cdef->data) + 10 + i * 6 + 4); if (cn < nchan_def) { switch (typ) { case 0: chan_def[cn] = asoc; break; case 1: chan_def[cn] = 0; /* alpha */ break; default: chan_def[cn] = -typ; } } } } } } gst_caps_set_simple (stream->caps, "num-components", G_TYPE_INT, ncomp, NULL); gst_caps_set_simple (stream->caps, "fourcc", GST_TYPE_FOURCC, fourcc, NULL); if (comp_map) { GValue arr = { 0, }; GValue elt = { 0, }; int i; g_value_init (&arr, GST_TYPE_ARRAY); g_value_init (&elt, G_TYPE_INT); for (i = 0; i < ncomp_map; i++) { g_value_set_int (&elt, comp_map[i]); gst_value_array_append_value (&arr, &elt); } gst_structure_set_value (gst_caps_get_structure (stream->caps, 0), "component-map", &arr); g_value_unset (&elt); g_value_unset (&arr); g_free (comp_map); } if (chan_def) { GValue arr = { 0, }; GValue elt = { 0, }; int i; g_value_init (&arr, GST_TYPE_ARRAY); g_value_init (&elt, G_TYPE_INT); for (i = 0; i < nchan_def; i++) { g_value_set_int (&elt, chan_def[i]); gst_value_array_append_value (&arr, &elt); } gst_structure_set_value (gst_caps_get_structure (stream->caps, 0), "channel-definitions", &arr); g_value_unset (&elt); g_value_unset (&arr); g_free (chan_def); } /* some optional atoms */ field = qtdemux_tree_get_child_by_type (mjp2, FOURCC_fiel); prefix = qtdemux_tree_get_child_by_type (mjp2, FOURCC_jp2x); /* indicate possible fields in caps */ if (field) { data = (guint8 *) field->data + 8; if (*data != 1) gst_caps_set_simple (stream->caps, "fields", G_TYPE_INT, (gint) * data, NULL); } /* add codec_data if provided */ if (prefix) { GstBuffer *buf; gint len; GST_DEBUG_OBJECT (qtdemux, "found prefix data in stsd"); data = prefix->data; len = QT_UINT32 (data); if (len > 0x8) { len -= 0x8; buf = gst_buffer_new_and_alloc (len); memcpy (GST_BUFFER_DATA (buf), data + 8, len); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); } } break; } case FOURCC_SVQ3: case FOURCC_VP31: { GstBuffer *buf; GstBuffer *seqh = NULL; guint8 *gamma_data = NULL; gint len = QT_UINT32 (stsd_data); qtdemux_parse_svq3_stsd_data (qtdemux, stsd, &gamma_data, &seqh); if (gamma_data) { gst_caps_set_simple (stream->caps, "applied-gamma", G_TYPE_DOUBLE, QT_FP32 (gamma_data), NULL); } if (seqh) { /* sorry for the bad name, but we don't know what this is, other * than its own fourcc */ gst_caps_set_simple (stream->caps, "seqh", GST_TYPE_BUFFER, seqh, NULL); } GST_DEBUG_OBJECT (qtdemux, "found codec_data in stsd"); buf = gst_buffer_new_and_alloc (len); memcpy (GST_BUFFER_DATA (buf), stsd_data, len); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); break; } case FOURCC_rle_: { gst_caps_set_simple (stream->caps, "depth", G_TYPE_INT, QT_UINT16 (stsd_data + offset + 82), NULL); break; } case FOURCC_XiTh: { GNode *xith, *xdxt; GST_DEBUG_OBJECT (qtdemux, "found XiTh"); xith = qtdemux_tree_get_child_by_type (stsd, FOURCC_XiTh); if (!xith) break; xdxt = qtdemux_tree_get_child_by_type (xith, FOURCC_XdxT); if (!xdxt) break; GST_DEBUG_OBJECT (qtdemux, "found XdxT node"); /* collect the headers and store them in a stream list so that we can * send them out first */ qtdemux_parse_theora_extension (qtdemux, stream, xdxt); break; } case FOURCC_ovc1: { GNode *ovc1; gchar *ovc1_data; guint ovc1_len; GstBuffer *buf; GST_DEBUG_OBJECT (qtdemux, "parse ovc1 header"); ovc1 = qtdemux_tree_get_child_by_type (stsd, FOURCC_ovc1); if (!ovc1) break; ovc1_data = ovc1->data; ovc1_len = QT_UINT32 (ovc1_data); if (ovc1_len <= 198) { GST_WARNING_OBJECT (qtdemux, "Too small ovc1 header, skipping"); break; } buf = gst_buffer_new_and_alloc (ovc1_len - 198); memcpy (GST_BUFFER_DATA (buf), ovc1_data + 198, ovc1_len - 198); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); break; } default: break; } } GST_INFO_OBJECT (qtdemux, "type %" GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT, GST_FOURCC_ARGS (fourcc), stream->caps); } else if (stream->subtype == FOURCC_soun) { int version, samplesize; guint16 compression_id; gboolean amrwb = FALSE; offset = 32; if (len < 36) goto corrupt_file; version = QT_UINT32 (stsd_data + offset); stream->n_channels = QT_UINT16 (stsd_data + offset + 8); samplesize = QT_UINT16 (stsd_data + offset + 10); compression_id = QT_UINT16 (stsd_data + offset + 12); stream->rate = QT_FP32 (stsd_data + offset + 16); GST_LOG_OBJECT (qtdemux, "version/rev: %08x", version); GST_LOG_OBJECT (qtdemux, "vendor: %08x", QT_UINT32 (stsd_data + offset + 4)); GST_LOG_OBJECT (qtdemux, "n_channels: %d", stream->n_channels); GST_LOG_OBJECT (qtdemux, "sample_size: %d", samplesize); GST_LOG_OBJECT (qtdemux, "compression_id: %d", compression_id); GST_LOG_OBJECT (qtdemux, "packet size: %d", QT_UINT16 (stsd_data + offset + 14)); GST_LOG_OBJECT (qtdemux, "sample rate: %g", stream->rate); if (compression_id == 0xfffe) stream->sampled = TRUE; /* first assume uncompressed audio */ stream->bytes_per_sample = samplesize / 8; stream->samples_per_frame = stream->n_channels; stream->bytes_per_frame = stream->n_channels * stream->bytes_per_sample; stream->samples_per_packet = stream->samples_per_frame; stream->bytes_per_packet = stream->bytes_per_sample; offset = 52; switch (fourcc) { /* Yes, these have to be hard-coded */ case FOURCC_MAC6: { stream->samples_per_packet = 6; stream->bytes_per_packet = 1; stream->bytes_per_frame = 1 * stream->n_channels; stream->bytes_per_sample = 1; stream->samples_per_frame = 6 * stream->n_channels; break; } case FOURCC_MAC3: { stream->samples_per_packet = 3; stream->bytes_per_packet = 1; stream->bytes_per_frame = 1 * stream->n_channels; stream->bytes_per_sample = 1; stream->samples_per_frame = 3 * stream->n_channels; break; } case FOURCC_ima4: { stream->samples_per_packet = 64; stream->bytes_per_packet = 34; stream->bytes_per_frame = 34 * stream->n_channels; stream->bytes_per_sample = 2; stream->samples_per_frame = 64 * stream->n_channels; break; } case FOURCC_ulaw: case FOURCC_alaw: { stream->samples_per_packet = 1; stream->bytes_per_packet = 1; stream->bytes_per_frame = 1 * stream->n_channels; stream->bytes_per_sample = 1; stream->samples_per_frame = 1 * stream->n_channels; break; } case FOURCC_agsm: { stream->samples_per_packet = 160; stream->bytes_per_packet = 33; stream->bytes_per_frame = 33 * stream->n_channels; stream->bytes_per_sample = 2; stream->samples_per_frame = 160 * stream->n_channels; break; } default: break; } if (version == 0x00010000) { switch (fourcc) { case FOURCC_twos: case FOURCC_sowt: case FOURCC_raw_: break; default: { /* only parse extra decoding config for non-pcm audio */ stream->samples_per_packet = QT_UINT32 (stsd_data + offset); stream->bytes_per_packet = QT_UINT32 (stsd_data + offset + 4); stream->bytes_per_frame = QT_UINT32 (stsd_data + offset + 8); stream->bytes_per_sample = QT_UINT32 (stsd_data + offset + 12); GST_LOG_OBJECT (qtdemux, "samples/packet: %d", stream->samples_per_packet); GST_LOG_OBJECT (qtdemux, "bytes/packet: %d", stream->bytes_per_packet); GST_LOG_OBJECT (qtdemux, "bytes/frame: %d", stream->bytes_per_frame); GST_LOG_OBJECT (qtdemux, "bytes/sample: %d", stream->bytes_per_sample); if (!stream->sampled && stream->bytes_per_packet) { stream->samples_per_frame = (stream->bytes_per_frame / stream->bytes_per_packet) * stream->samples_per_packet; GST_LOG_OBJECT (qtdemux, "samples/frame: %d", stream->samples_per_frame); } break; } } } else if (version == 0x00020000) { union { gdouble fp; guint64 val; } qtfp; stream->samples_per_packet = QT_UINT32 (stsd_data + offset); qtfp.val = QT_UINT64 (stsd_data + offset + 4); stream->rate = qtfp.fp; stream->n_channels = QT_UINT32 (stsd_data + offset + 12); GST_LOG_OBJECT (qtdemux, "samples/packet: %d", stream->samples_per_packet); GST_LOG_OBJECT (qtdemux, "sample rate: %g", stream->rate); GST_LOG_OBJECT (qtdemux, "n_channels: %d", stream->n_channels); } else { GST_WARNING_OBJECT (qtdemux, "unknown version %08x", version); } stream->caps = qtdemux_audio_caps (qtdemux, stream, fourcc, NULL, 0, &codec); switch (fourcc) { case FOURCC_in24: { GNode *enda; GNode *in24; in24 = qtdemux_tree_get_child_by_type (stsd, FOURCC_in24); enda = qtdemux_tree_get_child_by_type (in24, FOURCC_enda); if (!enda) { wave = qtdemux_tree_get_child_by_type (in24, FOURCC_wave); if (wave) enda = qtdemux_tree_get_child_by_type (wave, FOURCC_enda); } if (enda) { gst_caps_set_simple (stream->caps, "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL); } break; } case FOURCC_owma: { GNode *owma; const gchar *owma_data, *codec_name = NULL; guint owma_len; GstBuffer *buf; gint version = 1; /* from http://msdn.microsoft.com/en-us/library/dd757720(VS.85).aspx */ /* FIXME this should also be gst_riff_strf_auds, * but the latter one is actually missing bits-per-sample :( */ typedef struct { gint16 wFormatTag; gint16 nChannels; gint32 nSamplesPerSec; gint32 nAvgBytesPerSec; gint16 nBlockAlign; gint16 wBitsPerSample; gint16 cbSize; } WAVEFORMATEX; WAVEFORMATEX *wfex; GST_DEBUG_OBJECT (qtdemux, "parse owma"); owma = qtdemux_tree_get_child_by_type (stsd, FOURCC_owma); if (!owma) break; owma_data = owma->data; owma_len = QT_UINT32 (owma_data); if (owma_len <= 54) { GST_WARNING_OBJECT (qtdemux, "Too small owma header, skipping"); break; } wfex = (WAVEFORMATEX *) (owma_data + 36); buf = gst_buffer_new_and_alloc (owma_len - 54); memcpy (GST_BUFFER_DATA (buf), owma_data + 54, owma_len - 54); if (wfex->wFormatTag == 0x0161) { codec_name = "Windows Media Audio"; version = 2; } else if (wfex->wFormatTag == 0x0162) { codec_name = "Windows Media Audio 9 Pro"; version = 3; } else if (wfex->wFormatTag == 0x0163) { codec_name = "Windows Media Audio 9 Lossless"; /* is that correct? gstffmpegcodecmap.c is missing it, but * fluendo codec seems to support it */ version = 4; } gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, "wmaversion", G_TYPE_INT, version, "block_align", G_TYPE_INT, GST_READ_UINT16_LE (&wfex->nBlockAlign), "bitrate", G_TYPE_INT, GST_READ_UINT32_LE (&wfex->nAvgBytesPerSec), "width", G_TYPE_INT, GST_READ_UINT16_LE (&wfex->wBitsPerSample), "depth", G_TYPE_INT, GST_READ_UINT16_LE (&wfex->wBitsPerSample), NULL); gst_buffer_unref (buf); if (codec_name) { g_free (codec); codec = g_strdup (codec_name); } break; } default: break; } if (codec) { GstStructure *s; gint bitrate = 0; list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, codec, NULL); g_free (codec); codec = NULL; /* some bitrate info may have ended up in caps */ s = gst_caps_get_structure (stream->caps, 0); gst_structure_get_int (s, "bitrate", &bitrate); if (bitrate > 0) gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, bitrate, NULL); } mp4a = qtdemux_tree_get_child_by_type (stsd, FOURCC_mp4a); wave = NULL; esds = NULL; if (mp4a) { wave = qtdemux_tree_get_child_by_type (mp4a, FOURCC_wave); if (wave) esds = qtdemux_tree_get_child_by_type (wave, FOURCC_esds); if (!esds) esds = qtdemux_tree_get_child_by_type (mp4a, FOURCC_esds); } /* If the fourcc's bottom 16 bits gives 'sm', then the top 16 bits is a byte-swapped wave-style codec identifier, and we can find a WAVE header internally to a 'wave' atom here. This can more clearly be thought of as 'ms' as the top 16 bits, and a codec id as the bottom 16 bits - but byte-swapped to store in QT (which is big-endian). */ if ((fourcc & 0xffff) == (('s' << 8) | 'm')) { if (len < offset + 20) { GST_WARNING_OBJECT (qtdemux, "No wave atom in MS-style audio"); } else { guint32 datalen = QT_UINT32 (stsd_data + offset + 16); const guint8 *data = stsd_data + offset + 16; GNode *wavenode; GNode *waveheadernode; wavenode = g_node_new ((guint8 *) data); if (qtdemux_parse_node (qtdemux, wavenode, data, datalen)) { const guint8 *waveheader; guint32 headerlen; waveheadernode = qtdemux_tree_get_child_by_type (wavenode, fourcc); if (waveheadernode) { waveheader = (const guint8 *) waveheadernode->data; headerlen = QT_UINT32 (waveheader); if (headerlen > 8) { gst_riff_strf_auds *header = NULL; GstBuffer *headerbuf; GstBuffer *extra; waveheader += 8; headerlen -= 8; headerbuf = gst_buffer_new (); GST_BUFFER_DATA (headerbuf) = (guint8 *) waveheader; GST_BUFFER_SIZE (headerbuf) = headerlen; if (gst_riff_parse_strf_auds (GST_ELEMENT_CAST (qtdemux), headerbuf, &header, &extra)) { gst_caps_unref (stream->caps); stream->caps = gst_riff_create_audio_caps (header->format, NULL, header, extra, NULL, NULL); if (extra) gst_buffer_unref (extra); } } } else GST_DEBUG ("Didn't find waveheadernode for this codec"); } g_node_destroy (wavenode); } } else if (esds) { gst_qtdemux_handle_esds (qtdemux, stream, esds, list); } else { switch (fourcc) { #if 0 /* FIXME: what is in the chunk? */ case FOURCC_QDMC: { gint len = QT_UINT32 (stsd_data); /* seems to be always = 116 = 0x74 */ break; } #endif case FOURCC_QDM2: { gint len = QT_UINT32 (stsd_data); if (len > 0x4C) { GstBuffer *buf = gst_buffer_new_and_alloc (len - 0x4C); memcpy (GST_BUFFER_DATA (buf), stsd_data + 0x4C, len - 0x4C); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); } gst_caps_set_simple (stream->caps, "samplesize", G_TYPE_INT, samplesize, NULL); break; } case FOURCC_alac: { GNode *alac, *wave = NULL; /* apparently, m4a has this atom appended directly in the stsd entry, * while mov has it in a wave atom */ alac = qtdemux_tree_get_child_by_type (stsd, FOURCC_alac); if (alac) { /* alac now refers to stsd entry atom */ wave = qtdemux_tree_get_child_by_type (alac, FOURCC_wave); if (wave) alac = qtdemux_tree_get_child_by_type (wave, FOURCC_alac); else alac = qtdemux_tree_get_child_by_type (alac, FOURCC_alac); } if (alac) { gint len = QT_UINT32 (alac->data); GstBuffer *buf; if (len < 36) { GST_DEBUG_OBJECT (qtdemux, "discarding alac atom with unexpected len %d", len); } else { /* codec-data contains alac atom size and prefix, * ffmpeg likes it that way, not quite gst-ish though ...*/ buf = gst_buffer_new_and_alloc (len); memcpy (GST_BUFFER_DATA (buf), alac->data, len); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); } } gst_caps_set_simple (stream->caps, "samplesize", G_TYPE_INT, samplesize, NULL); break; } case FOURCC_sawb: /* Fallthrough! */ amrwb = TRUE; case FOURCC_samr: { gint len = QT_UINT32 (stsd_data); if (len > 0x34) { GstBuffer *buf = gst_buffer_new_and_alloc (len - 0x34); guint bitrate; memcpy (GST_BUFFER_DATA (buf), stsd_data + 0x34, len - 0x34); /* If we have enough data, let's try to get the 'damr' atom. See * the 3GPP container spec (26.244) for more details. */ if ((len - 0x34) > 8 && (bitrate = qtdemux_parse_amr_bitrate (buf, amrwb))) { if (!list) list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_MAXIMUM_BITRATE, bitrate, NULL); } gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); } break; } default: break; } } GST_INFO_OBJECT (qtdemux, "type %" GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT, GST_FOURCC_ARGS (fourcc), stream->caps); } else if (stream->subtype == FOURCC_strm) { if (fourcc == FOURCC_rtsp) { stream->redirect_uri = qtdemux_get_rtsp_uri_from_hndl (qtdemux, minf); } else { GST_INFO_OBJECT (qtdemux, "unhandled stream type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); goto unknown_stream; } stream->sampled = TRUE; } else if (stream->subtype == FOURCC_subp || stream->subtype == FOURCC_text) { stream->sampled = TRUE; offset = 16; stream->caps = qtdemux_sub_caps (qtdemux, stream, fourcc, stsd_data, &codec); if (codec) { list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_SUBTITLE_CODEC, codec, NULL); g_free (codec); codec = NULL; } /* hunt for sort-of codec data */ switch (fourcc) { case FOURCC_mp4s: { guint len; const guint8 *data; /* look for palette */ /* target mp4s atom */ len = QT_UINT32 (stsd_data + offset); data = stsd_data + offset; /* verify sufficient length, * and esds present with decConfigDescr of expected size and position */ if ((len >= 106 + 8) && (QT_FOURCC (data + 8 + 8 + 4) == FOURCC_esds) && (QT_UINT16 (data + 8 + 40) == 0x0540)) { GstStructure *s; guint32 clut[16]; gint i; /* move to decConfigDescr data */ data = data + 8 + 42; for (i = 0; i < 16; i++) { clut[i] = QT_UINT32 (data); data += 4; } s = gst_structure_new ("application/x-gst-dvd", "event", G_TYPE_STRING, "dvd-spu-clut-change", "clut00", G_TYPE_INT, clut[0], "clut01", G_TYPE_INT, clut[1], "clut02", G_TYPE_INT, clut[2], "clut03", G_TYPE_INT, clut[3], "clut04", G_TYPE_INT, clut[4], "clut05", G_TYPE_INT, clut[5], "clut06", G_TYPE_INT, clut[6], "clut07", G_TYPE_INT, clut[7], "clut08", G_TYPE_INT, clut[8], "clut09", G_TYPE_INT, clut[9], "clut10", G_TYPE_INT, clut[10], "clut11", G_TYPE_INT, clut[11], "clut12", G_TYPE_INT, clut[12], "clut13", G_TYPE_INT, clut[13], "clut14", G_TYPE_INT, clut[14], "clut15", G_TYPE_INT, clut[15], NULL); /* store event and trigger custom processing */ stream->pending_event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s); stream->need_process = TRUE; } break; } default: break; } } else { goto unknown_stream; } /* promote to sampled format */ if (stream->fourcc == FOURCC_samr) { /* force mono 8000 Hz for AMR */ stream->sampled = TRUE; stream->n_channels = 1; stream->rate = 8000; } else if (stream->fourcc == FOURCC_sawb) { /* force mono 16000 Hz for AMR-WB */ stream->sampled = TRUE; stream->n_channels = 1; stream->rate = 16000; } else if (stream->fourcc == FOURCC_mp4a) { stream->sampled = TRUE; } /* collect sample information */ if (!qtdemux_stbl_init (qtdemux, stream, stbl)) goto samples_failed; if (qtdemux->fragmented) { guint32 dummy; guint64 offset; /* need all moov samples as basis; probably not many if any at all */ /* prevent moof parsing taking of at this time */ offset = qtdemux->moof_offset; qtdemux->moof_offset = 0; if (stream->n_samples && !qtdemux_parse_samples (qtdemux, stream, stream->n_samples - 1)) { qtdemux->moof_offset = offset; goto samples_failed; } qtdemux->moof_offset = 0; /* movie duration more reliable in this case (e.g. mehd) */ if (qtdemux->segment.duration && GST_CLOCK_TIME_IS_VALID (qtdemux->segment.duration)) stream->duration = gst_util_uint64_scale (qtdemux->segment.duration, stream->timescale, GST_SECOND); /* need defaults for fragments */ qtdemux_parse_trex (qtdemux, stream, &dummy, &dummy, &dummy); } /* configure segments */ if (!qtdemux_parse_segments (qtdemux, stream, trak)) goto segments_failed; /* add some language tag, if useful */ if (stream->lang_id[0] != '\0' && strcmp (stream->lang_id, "unk") && strcmp (stream->lang_id, "und")) { const gchar *lang_code; if (!list) list = gst_tag_list_new (); /* convert ISO 639-2 code to ISO 639-1 */ lang_code = gst_tag_get_language_code (stream->lang_id); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_LANGUAGE_CODE, (lang_code) ? lang_code : stream->lang_id, NULL); } /* now we are ready to add the stream */ if (qtdemux->n_streams >= GST_QTDEMUX_MAX_STREAMS) goto too_many_streams; stream->pending_tags = list; qtdemux->streams[qtdemux->n_streams] = stream; qtdemux->n_streams++; GST_DEBUG_OBJECT (qtdemux, "n_streams is now %d", qtdemux->n_streams); return TRUE; /* ERRORS */ corrupt_file: { GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX, (_("This file is corrupt and cannot be played.")), (NULL)); g_free (stream); return FALSE; } error_encrypted: { GST_ELEMENT_ERROR (qtdemux, STREAM, DECRYPT, (NULL), (NULL)); g_free (stream); return FALSE; } samples_failed: segments_failed: { /* we posted an error already */ /* free stbl sub-atoms */ gst_qtdemux_stbl_free (stream); g_free (stream); return FALSE; } unknown_stream: { GST_INFO_OBJECT (qtdemux, "unknown subtype %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (stream->subtype)); g_free (stream); return TRUE; } too_many_streams: { GST_ELEMENT_WARNING (qtdemux, STREAM, DEMUX, (_("This file contains too many streams. Only playing first %d"), GST_QTDEMUX_MAX_STREAMS), (NULL)); return TRUE; } } /* If we can estimate the overall bitrate, and don't have information about the * stream bitrate for exactly one stream, this guesses the stream bitrate as * the overall bitrate minus the sum of the bitrates of all other streams. This * should be useful for the common case where we have one audio and one video * stream and can estimate the bitrate of one, but not the other. */ static void gst_qtdemux_guess_bitrate (GstQTDemux * qtdemux) { GstFormat format = GST_FORMAT_BYTES; QtDemuxStream *stream = NULL; gint64 size, duration, sys_bitrate, sum_bitrate = 0; gint i; guint bitrate; if (qtdemux->fragmented) return; GST_DEBUG_OBJECT (qtdemux, "Looking for streams with unknown bitrate"); if (!gst_pad_query_peer_duration (qtdemux->sinkpad, &format, &size) || format != GST_FORMAT_BYTES) { GST_DEBUG_OBJECT (qtdemux, "Size in bytes of the stream not known - bailing"); return; } /* Subtract the header size */ GST_DEBUG_OBJECT (qtdemux, "Total size %" G_GINT64_FORMAT ", header size %u", size, qtdemux->header_size); g_assert (size >= qtdemux->header_size); size = size - qtdemux->header_size; if (!gst_qtdemux_get_duration (qtdemux, &duration) || duration == GST_CLOCK_TIME_NONE) { GST_DEBUG_OBJECT (qtdemux, "Stream duration not known - bailing"); return; } for (i = 0; i < qtdemux->n_streams; i++) { switch (qtdemux->streams[i]->subtype) { case FOURCC_soun: case FOURCC_vide: /* retrieve bitrate, prefer avg then max */ bitrate = 0; if (qtdemux->streams[i]->pending_tags) { gst_tag_list_get_uint (qtdemux->streams[i]->pending_tags, GST_TAG_MAXIMUM_BITRATE, &bitrate); gst_tag_list_get_uint (qtdemux->streams[i]->pending_tags, GST_TAG_BITRATE, &bitrate); } if (bitrate) sum_bitrate += bitrate; else { if (stream) { GST_DEBUG_OBJECT (qtdemux, ">1 stream with unknown bitrate - bailing"); return; } else stream = qtdemux->streams[i]; } default: /* For other subtypes, we assume no significant impact on bitrate */ break; } } if (!stream) { GST_DEBUG_OBJECT (qtdemux, "All stream bitrates are known"); return; } sys_bitrate = gst_util_uint64_scale (size, GST_SECOND * 8, duration); if (sys_bitrate < sum_bitrate) { /* This can happen, since sum_bitrate might be derived from maximum * bitrates and not average bitrates */ GST_DEBUG_OBJECT (qtdemux, "System bitrate less than sum bitrate - bailing"); return; } bitrate = sys_bitrate - sum_bitrate; GST_DEBUG_OBJECT (qtdemux, "System bitrate = %" G_GINT64_FORMAT ", Stream bitrate = %u", sys_bitrate, bitrate); if (!stream->pending_tags) stream->pending_tags = gst_tag_list_new (); gst_tag_list_add (stream->pending_tags, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, bitrate, NULL); } static GstFlowReturn qtdemux_expose_streams (GstQTDemux * qtdemux) { gint i; GstFlowReturn ret = GST_FLOW_OK; GST_DEBUG_OBJECT (qtdemux, "exposing streams"); for (i = 0; ret == GST_FLOW_OK && i < qtdemux->n_streams; i++) { QtDemuxStream *stream = qtdemux->streams[i]; guint32 sample_num = 0; guint samples = 20; GArray *durations; GstTagList *list; GST_DEBUG_OBJECT (qtdemux, "stream %d, id %d, fourcc %" GST_FOURCC_FORMAT, i, stream->track_id, GST_FOURCC_ARGS (stream->fourcc)); if (qtdemux->fragmented) { /* need all moov samples first */ GST_OBJECT_LOCK (qtdemux); while (stream->n_samples == 0) if ((ret = qtdemux_add_fragmented_samples (qtdemux)) != GST_FLOW_OK) break; GST_OBJECT_UNLOCK (qtdemux); } else { /* discard any stray moof */ qtdemux->moof_offset = 0; } /* prepare braking */ if (ret != GST_FLOW_ERROR) ret = GST_FLOW_OK; /* in pull mode, we should have parsed some sample info by now; * and quite some code will not handle no samples. * in push mode, we'll just have to deal with it */ if (G_UNLIKELY (qtdemux->pullbased && !stream->n_samples)) { GST_DEBUG_OBJECT (qtdemux, "no samples for stream; discarding"); gst_qtdemux_stream_free (qtdemux, stream); memmove (&(qtdemux->streams[i]), &(qtdemux->streams[i + 1]), sizeof (QtDemuxStream *) * (GST_QTDEMUX_MAX_STREAMS - i - 1)); qtdemux->streams[GST_QTDEMUX_MAX_STREAMS - 1] = NULL; qtdemux->n_streams--; i--; continue; } /* parse number of initial sample to set frame rate cap */ while (sample_num < stream->n_samples && sample_num < samples) { if (!qtdemux_parse_samples (qtdemux, stream, sample_num)) break; ++sample_num; } /* collect and sort durations */ samples = MIN (stream->stbl_index + 1, samples); GST_DEBUG_OBJECT (qtdemux, "%d samples for framerate", samples); if (samples) { durations = g_array_sized_new (FALSE, FALSE, sizeof (guint32), samples); sample_num = 0; while (sample_num < samples) { g_array_append_val (durations, stream->samples[sample_num].duration); sample_num++; } g_array_sort (durations, less_than); stream->min_duration = g_array_index (durations, guint32, samples / 2); g_array_free (durations, TRUE); } /* now we have all info and can expose */ list = stream->pending_tags; stream->pending_tags = NULL; gst_qtdemux_add_stream (qtdemux, stream, list); } gst_qtdemux_guess_bitrate (qtdemux); gst_element_no_more_pads (GST_ELEMENT_CAST (qtdemux)); /* check if we should post a redirect in case there is a single trak * and it is a redirecting trak */ if (qtdemux->n_streams == 1 && qtdemux->streams[0]->redirect_uri != NULL) { GstMessage *m; qtdemux_post_global_tags (qtdemux); GST_INFO_OBJECT (qtdemux, "Issuing a redirect due to a single track with " "an external content"); m = gst_message_new_element (GST_OBJECT_CAST (qtdemux), gst_structure_new ("redirect", "new-location", G_TYPE_STRING, qtdemux->streams[0]->redirect_uri, NULL)); gst_element_post_message (GST_ELEMENT_CAST (qtdemux), m); qtdemux->posted_redirect = TRUE; } return ret; } /* check if major or compatible brand is 3GP */ static inline gboolean qtdemux_is_brand_3gp (GstQTDemux * qtdemux, gboolean major) { if (major) { return ((qtdemux->major_brand & GST_MAKE_FOURCC (255, 255, 0, 0)) == GST_MAKE_FOURCC ('3', 'g', 0, 0)); } else if (qtdemux->comp_brands != NULL) { guint8 *data = GST_BUFFER_DATA (qtdemux->comp_brands); guint size = GST_BUFFER_SIZE (qtdemux->comp_brands); gboolean res = FALSE; while (size >= 4) { res = res || ((QT_FOURCC (data) & GST_MAKE_FOURCC (255, 255, 0, 0)) == GST_MAKE_FOURCC ('3', 'g', 0, 0)); data += 4; size -= 4; } return res; } else { return FALSE; } } /* check if tag is a spec'ed 3GP tag keyword storing a string */ static inline gboolean qtdemux_is_string_tag_3gp (GstQTDemux * qtdemux, guint32 fourcc) { return fourcc == FOURCC_cprt || fourcc == FOURCC_gnre || fourcc == FOURCC_titl || fourcc == FOURCC_dscp || fourcc == FOURCC_perf || fourcc == FOURCC_auth || fourcc == FOURCC_albm; } static void qtdemux_tag_add_location (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { const gchar *env_vars[] = { "GST_QT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; int offset; char *name; gchar *data; gdouble longitude, latitude, altitude; gint len; len = QT_UINT32 (node->data); if (len <= 14) goto short_read; data = node->data; offset = 14; /* TODO: language code skipped */ name = gst_tag_freeform_string_to_utf8 (data + offset, -1, env_vars); if (!name) { /* do not alarm in trivial case, but bail out otherwise */ if (*(data + offset) != 0) { GST_DEBUG_OBJECT (qtdemux, "failed to convert %s tag to UTF-8, " "giving up", tag); } } else { gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_GEO_LOCATION_NAME, name, NULL); offset += strlen (name); g_free (name); } if (len < offset + 2 + 4 + 4 + 4) goto short_read; /* +1 +1 = skip null-terminator and location role byte */ offset += 1 + 1; /* table in spec says unsigned, semantics say negative has meaning ... */ longitude = QT_SFP32 (data + offset); offset += 4; latitude = QT_SFP32 (data + offset); offset += 4; altitude = QT_SFP32 (data + offset); /* one invalid means all are invalid */ if (longitude >= -180.0 && longitude <= 180.0 && latitude >= -90.0 && latitude <= 90.0) { gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_GEO_LOCATION_LATITUDE, latitude, GST_TAG_GEO_LOCATION_LONGITUDE, longitude, GST_TAG_GEO_LOCATION_ELEVATION, altitude, NULL); } /* TODO: no GST_TAG_, so astronomical body and additional notes skipped */ return; /* ERRORS */ short_read: { GST_DEBUG_OBJECT (qtdemux, "short read parsing 3GP location"); return; } } static void qtdemux_tag_add_year (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { guint16 y; GDate *date; gint len; len = QT_UINT32 (node->data); if (len < 14) return; y = QT_UINT16 ((guint8 *) node->data + 12); if (y == 0) { GST_DEBUG_OBJECT (qtdemux, "year: %u is not a valid year", y); return; } GST_DEBUG_OBJECT (qtdemux, "year: %u", y); date = g_date_new_dmy (1, 1, y); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, date, NULL); g_date_free (date); } static void qtdemux_tag_add_classification (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { int offset; char *tag_str = NULL; guint8 *entity; guint16 table; gint len; len = QT_UINT32 (node->data); if (len <= 20) goto short_read; offset = 12; entity = (guint8 *) node->data + offset; if (entity[0] == 0 || entity[1] == 0 || entity[2] == 0 || entity[3] == 0) { GST_DEBUG_OBJECT (qtdemux, "classification info: %c%c%c%c invalid classification entity", entity[0], entity[1], entity[2], entity[3]); return; } offset += 4; table = QT_UINT16 ((guint8 *) node->data + offset); /* Language code skipped */ offset += 4; /* Tag format: "XXXX://Y[YYYY]/classification info string" * XXXX: classification entity, fixed length 4 chars. * Y[YYYY]: classification table, max 5 chars. */ tag_str = g_strdup_printf ("----://%u/%s", table, (char *) node->data + offset); /* memcpy To be sure we're preserving byte order */ memcpy (tag_str, entity, 4); GST_DEBUG_OBJECT (qtdemux, "classification info: %s", tag_str); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_APPEND, tag, tag_str, NULL); g_free (tag_str); return; /* ERRORS */ short_read: { GST_DEBUG_OBJECT (qtdemux, "short read parsing 3GP classification"); return; } } static gboolean qtdemux_tag_add_str_full (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { const gchar *env_vars[] = { "GST_QT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; GNode *data; char *s; int len; guint32 type; int offset; gboolean ret = TRUE; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); if (type == 0x00000001 && len > 16) { s = gst_tag_freeform_string_to_utf8 ((char *) data->data + 16, len - 16, env_vars); if (s) { GST_DEBUG_OBJECT (qtdemux, "adding tag %s", GST_STR_NULL (s)); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, s, NULL); g_free (s); } else { GST_DEBUG_OBJECT (qtdemux, "failed to convert %s tag to UTF-8", tag); } } } else { len = QT_UINT32 (node->data); type = QT_UINT32 ((guint8 *) node->data + 4); if ((type >> 24) == 0xa9) { /* Type starts with the (C) symbol, so the next 32 bits are * the language code, which we ignore */ offset = 12; GST_DEBUG_OBJECT (qtdemux, "found international text tag"); } else if (len > 14 && qtdemux_is_string_tag_3gp (qtdemux, QT_FOURCC ((guint8 *) node->data + 4))) { guint32 type = QT_UINT32 ((guint8 *) node->data + 8); /* we go for 3GP style encoding if major brands claims so, * or if no hope for data be ok UTF-8, and compatible 3GP brand present */ if (qtdemux_is_brand_3gp (qtdemux, TRUE) || (qtdemux_is_brand_3gp (qtdemux, FALSE) && ((type & 0x00FFFFFF) == 0x0) && (type >> 24 <= 0xF))) { offset = 14; /* 16-bit Language code is ignored here as well */ GST_DEBUG_OBJECT (qtdemux, "found 3gpp text tag"); } else { goto normal; } } else { normal: offset = 8; GST_DEBUG_OBJECT (qtdemux, "found normal text tag"); ret = FALSE; /* may have to fallback */ } s = gst_tag_freeform_string_to_utf8 ((char *) node->data + offset, len - offset, env_vars); if (s) { GST_DEBUG_OBJECT (qtdemux, "adding tag %s", GST_STR_NULL (s)); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, s, NULL); g_free (s); ret = TRUE; } else { GST_DEBUG_OBJECT (qtdemux, "failed to convert %s tag to UTF-8", tag); } } return ret; } static void qtdemux_tag_add_str (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { qtdemux_tag_add_str_full (qtdemux, tag, dummy, node); } static void qtdemux_tag_add_keywords (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { const gchar *env_vars[] = { "GST_QT_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; guint8 *data; char *s, *t, *k = NULL; int len; int offset; int count; /* first try normal string tag if major brand not 3GP */ if (!qtdemux_is_brand_3gp (qtdemux, TRUE)) { if (!qtdemux_tag_add_str_full (qtdemux, tag, dummy, node)) { /* hm, that did not work, maybe 3gpp storage in non-3gpp major brand; * let's try it 3gpp way after minor safety check */ data = node->data; if (QT_UINT32 (data) < 15 || !qtdemux_is_brand_3gp (qtdemux, FALSE)) return; } else return; } GST_DEBUG_OBJECT (qtdemux, "found 3gpp keyword tag"); data = node->data; len = QT_UINT32 (data); if (len < 15) goto short_read; count = QT_UINT8 (data + 14); offset = 15; for (; count; count--) { gint slen; if (offset + 1 > len) goto short_read; slen = QT_UINT8 (data + offset); offset += 1; if (offset + slen > len) goto short_read; s = gst_tag_freeform_string_to_utf8 ((char *) node->data + offset, slen, env_vars); if (s) { GST_DEBUG_OBJECT (qtdemux, "adding keyword %s", GST_STR_NULL (s)); if (k) { t = g_strjoin (",", k, s, NULL); g_free (s); g_free (k); k = t; } else { k = s; } } else { GST_DEBUG_OBJECT (qtdemux, "failed to convert keyword to UTF-8"); } offset += slen; } done: if (k) { GST_DEBUG_OBJECT (qtdemux, "adding tag %s", GST_STR_NULL (k)); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, k, NULL); } g_free (k); return; /* ERRORS */ short_read: { GST_DEBUG_OBJECT (qtdemux, "short read parsing 3GP keywords"); goto done; } } static void qtdemux_tag_add_num (GstQTDemux * qtdemux, const char *tag1, const char *tag2, GNode * node) { GNode *data; int len; int type; int n1, n2; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); if (type == 0x00000000 && len >= 22) { n1 = QT_UINT16 ((guint8 *) data->data + 18); n2 = QT_UINT16 ((guint8 *) data->data + 20); if (n1 > 0) { GST_DEBUG_OBJECT (qtdemux, "adding tag %s=%d", tag1, n1); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag1, n1, NULL); } if (n2 > 0) { GST_DEBUG_OBJECT (qtdemux, "adding tag %s=%d", tag2, n2); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag2, n2, NULL); } } } } static void qtdemux_tag_add_tmpo (GstQTDemux * qtdemux, const char *tag1, const char *dummy, GNode * node) { GNode *data; int len; int type; int n1; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); GST_DEBUG_OBJECT (qtdemux, "have tempo tag, type=%d,len=%d", type, len); /* some files wrongly have a type 0x0f=15, but it should be 0x15 */ if ((type == 0x00000015 || type == 0x0000000f) && len >= 18) { n1 = QT_UINT16 ((guint8 *) data->data + 16); if (n1) { /* do not add bpm=0 */ GST_DEBUG_OBJECT (qtdemux, "adding tag %d", n1); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag1, (gdouble) n1, NULL); } } } } static void qtdemux_tag_add_uint32 (GstQTDemux * qtdemux, const char *tag1, const char *dummy, GNode * node) { GNode *data; int len; int type; guint32 num; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); GST_DEBUG_OBJECT (qtdemux, "have %s tag, type=%d,len=%d", tag1, type, len); /* some files wrongly have a type 0x0f=15, but it should be 0x15 */ if ((type == 0x00000015 || type == 0x0000000f) && len >= 20) { num = QT_UINT32 ((guint8 *) data->data + 16); if (num) { /* do not add num=0 */ GST_DEBUG_OBJECT (qtdemux, "adding tag %d", num); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag1, num, NULL); } } } } static void qtdemux_tag_add_covr (GstQTDemux * qtdemux, const char *tag1, const char *dummy, GNode * node) { GNode *data; int len; int type; GstBuffer *buf; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); GST_DEBUG_OBJECT (qtdemux, "have covr tag, type=%d,len=%d", type, len); if ((type == 0x0000000d || type == 0x0000000e) && len > 16) { if ((buf = gst_tag_image_data_to_image_buffer ((guint8 *) data->data + 16, len - 16, GST_TAG_IMAGE_TYPE_NONE))) { GST_DEBUG_OBJECT (qtdemux, "adding tag size %d", len - 16); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag1, buf, NULL); gst_buffer_unref (buf); } } } } static void qtdemux_tag_add_date (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { GNode *data; char *s; int len; int type; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); if (type == 0x00000001 && len > 16) { guint y, m = 1, d = 1; gint ret; s = g_strndup ((char *) data->data + 16, len - 16); GST_DEBUG_OBJECT (qtdemux, "adding date '%s'", s); ret = sscanf (s, "%u-%u-%u", &y, &m, &d); if (ret >= 1 && y > 1500 && y < 3000) { GDate *date; date = g_date_new_dmy (d, m, y); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, date, NULL); g_date_free (date); } else { GST_DEBUG_OBJECT (qtdemux, "could not parse date string '%s'", s); } g_free (s); } } } static void qtdemux_tag_add_gnre (GstQTDemux * qtdemux, const char *tag, const char *dummy, GNode * node) { GNode *data; data = qtdemux_tree_get_child_by_type (node, FOURCC_data); /* re-route to normal string tag if major brand says so * or no data atom and compatible brand suggests so */ if (qtdemux_is_brand_3gp (qtdemux, TRUE) || (qtdemux_is_brand_3gp (qtdemux, FALSE) && !data)) { qtdemux_tag_add_str (qtdemux, tag, dummy, node); return; } if (data) { guint len, type, n; len = QT_UINT32 (data->data); type = QT_UINT32 ((guint8 *) data->data + 8); if (type == 0x00000000 && len >= 18) { n = QT_UINT16 ((guint8 *) data->data + 16); if (n > 0) { const gchar *genre; genre = gst_tag_id3_genre_get (n - 1); if (genre != NULL) { GST_DEBUG_OBJECT (qtdemux, "adding %d [%s]", n, genre); gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, tag, genre, NULL); } } } } } static void qtdemux_add_double_tag_from_str (GstQTDemux * demux, const gchar * tag, guint8 * data, guint32 datasize) { gdouble value; gchar *datacopy; /* make a copy to have \0 at the end */ datacopy = g_strndup ((gchar *) data, datasize); /* convert the str to double */ if (sscanf (datacopy, "%lf", &value) == 1) { GST_DEBUG_OBJECT (demux, "adding tag: %s [%s]", tag, datacopy); gst_tag_list_add (demux->tag_list, GST_TAG_MERGE_REPLACE, tag, value, NULL); } else { GST_WARNING_OBJECT (demux, "Failed to parse double from string: %s", datacopy); } g_free (datacopy); } static void qtdemux_tag_add_revdns (GstQTDemux * demux, const char *tag, const char *tag_bis, GNode * node) { GNode *mean; GNode *name; GNode *data; guint32 meansize; guint32 namesize; guint32 datatype; guint32 datasize; const gchar *meanstr; const gchar *namestr; /* checking the whole ---- atom size for consistency */ if (QT_UINT32 (node->data) <= 4 + 12 + 12 + 16) { GST_WARNING_OBJECT (demux, "Tag ---- atom is too small, ignoring"); return; } mean = qtdemux_tree_get_child_by_type (node, FOURCC_mean); if (!mean) { GST_WARNING_OBJECT (demux, "No 'mean' atom found"); return; } meansize = QT_UINT32 (mean->data); if (meansize <= 12) { GST_WARNING_OBJECT (demux, "Small mean atom, ignoring the whole tag"); return; } meanstr = ((gchar *) mean->data) + 12; name = qtdemux_tree_get_child_by_type (node, FOURCC_name); if (!name) { GST_WARNING_OBJECT (demux, "'name' atom not found, ignoring tag"); return; } namesize = QT_UINT32 (name->data); if (namesize <= 12) { GST_WARNING_OBJECT (demux, "'name' atom is too small, ignoring tag"); return; } namestr = ((gchar *) name->data) + 12; /* * Data atom is: * uint32 - size * uint32 - name * uint8 - version * uint24 - data type * uint32 - all 0 * rest - the data */ data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (!data) { GST_WARNING_OBJECT (demux, "No data atom in this tag"); return; } datasize = QT_UINT32 (data->data); if (datasize <= 16) { GST_WARNING_OBJECT (demux, "Data atom too small"); return; } datatype = QT_UINT32 (((gchar *) data->data) + 8) & 0xFFFFFF; if (strncmp (meanstr, "com.apple.iTunes", meansize - 12) == 0) { static const struct { const gchar name[28]; const gchar tag[28]; } tags[] = { { "replaygain_track_gain", GST_TAG_TRACK_GAIN}, { "replaygain_track_peak", GST_TAG_TRACK_PEAK}, { "replaygain_album_gain", GST_TAG_ALBUM_GAIN}, { "replaygain_album_peak", GST_TAG_ALBUM_PEAK}, { "MusicBrainz Track Id", GST_TAG_MUSICBRAINZ_TRACKID}, { "MusicBrainz Artist Id", GST_TAG_MUSICBRAINZ_ARTISTID}, { "MusicBrainz Album Id", GST_TAG_MUSICBRAINZ_ALBUMID}, { "MusicBrainz Album Artist Id", GST_TAG_MUSICBRAINZ_ALBUMARTISTID} }; int i; for (i = 0; i < G_N_ELEMENTS (tags); ++i) { if (!g_ascii_strncasecmp (tags[i].name, namestr, namesize - 12)) { switch (gst_tag_get_type (tags[i].tag)) { case G_TYPE_DOUBLE: qtdemux_add_double_tag_from_str (demux, tags[i].tag, ((guint8 *) data->data) + 16, datasize - 16); break; case G_TYPE_STRING: qtdemux_tag_add_str (demux, tags[i].tag, NULL, node); break; default: /* not reached */ break; } break; } } if (i == G_N_ELEMENTS (tags)) goto unknown_tag; } else { goto unknown_tag; } return; /* errors */ unknown_tag: { gchar *namestr_dbg; gchar *meanstr_dbg; meanstr_dbg = g_strndup (meanstr, meansize - 12); namestr_dbg = g_strndup (namestr, namesize - 12); GST_WARNING_OBJECT (demux, "This tag %s:%s type:%u is not mapped, " "file a bug at bugzilla.gnome.org", meanstr_dbg, namestr_dbg, datatype); g_free (namestr_dbg); g_free (meanstr_dbg); return; } } static void qtdemux_tag_add_id32 (GstQTDemux * demux, const char *tag, const char *tag_bis, GNode * node) { guint8 *data; GstBuffer *buf; guint len; GstTagList *taglist = NULL; GST_LOG_OBJECT (demux, "parsing ID32"); data = node->data; len = GST_READ_UINT32_BE (data); /* need at least full box and language tag */ if (len < 12 + 2) return; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = data + 14; GST_BUFFER_SIZE (buf) = len - 14; taglist = gst_tag_list_from_id3v2_tag (buf); if (taglist) { GST_LOG_OBJECT (demux, "parsing ok"); gst_tag_list_insert (demux->tag_list, taglist, GST_TAG_MERGE_KEEP); } else { GST_LOG_OBJECT (demux, "parsing failed"); } if (taglist) gst_tag_list_free (taglist); gst_buffer_unref (buf); } typedef void (*GstQTDemuxAddTagFunc) (GstQTDemux * demux, const char *tag, const char *tag_bis, GNode * node); /* unmapped tags FOURCC_pcst -> if media is a podcast -> bool FOURCC_cpil -> if media is part of a compilation -> bool FOURCC_pgap -> if media is part of a gapless context -> bool FOURCC_tven -> the tv episode id e.g. S01E23 -> str */ static const struct { guint32 fourcc; const gchar *gst_tag; const gchar *gst_tag_bis; const GstQTDemuxAddTagFunc func; } add_funcs[] = { { FOURCC__nam, GST_TAG_TITLE, NULL, qtdemux_tag_add_str}, { FOURCC_titl, GST_TAG_TITLE, NULL, qtdemux_tag_add_str}, { FOURCC__grp, GST_TAG_GROUPING, NULL, qtdemux_tag_add_str}, { FOURCC__wrt, GST_TAG_COMPOSER, NULL, qtdemux_tag_add_str}, { FOURCC__ART, GST_TAG_ARTIST, NULL, qtdemux_tag_add_str}, { FOURCC_aART, GST_TAG_ALBUM_ARTIST, NULL, qtdemux_tag_add_str}, { FOURCC_perf, GST_TAG_ARTIST, NULL, qtdemux_tag_add_str}, { FOURCC_auth, GST_TAG_COMPOSER, NULL, qtdemux_tag_add_str}, { FOURCC__alb, GST_TAG_ALBUM, NULL, qtdemux_tag_add_str}, { FOURCC_albm, GST_TAG_ALBUM, NULL, qtdemux_tag_add_str}, { FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, qtdemux_tag_add_str}, { FOURCC__cpy, GST_TAG_COPYRIGHT, NULL, qtdemux_tag_add_str}, { FOURCC__cmt, GST_TAG_COMMENT, NULL, qtdemux_tag_add_str}, { FOURCC__des, GST_TAG_DESCRIPTION, NULL, qtdemux_tag_add_str}, { FOURCC_desc, GST_TAG_DESCRIPTION, NULL, qtdemux_tag_add_str}, { FOURCC_dscp, GST_TAG_DESCRIPTION, NULL, qtdemux_tag_add_str}, { FOURCC__lyr, GST_TAG_LYRICS, NULL, qtdemux_tag_add_str}, { FOURCC__day, GST_TAG_DATE, NULL, qtdemux_tag_add_date}, { FOURCC_yrrc, GST_TAG_DATE, NULL, qtdemux_tag_add_year}, { FOURCC__too, GST_TAG_ENCODER, NULL, qtdemux_tag_add_str}, { FOURCC__inf, GST_TAG_COMMENT, NULL, qtdemux_tag_add_str}, { FOURCC_trkn, GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, qtdemux_tag_add_num}, { FOURCC_disk, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, qtdemux_tag_add_num}, { FOURCC_disc, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, qtdemux_tag_add_num}, { FOURCC__gen, GST_TAG_GENRE, NULL, qtdemux_tag_add_str}, { FOURCC_gnre, GST_TAG_GENRE, NULL, qtdemux_tag_add_gnre}, { FOURCC_tmpo, GST_TAG_BEATS_PER_MINUTE, NULL, qtdemux_tag_add_tmpo}, { FOURCC_covr, GST_TAG_PREVIEW_IMAGE, NULL, qtdemux_tag_add_covr}, { FOURCC_sonm, GST_TAG_TITLE_SORTNAME, NULL, qtdemux_tag_add_str}, { FOURCC_soal, GST_TAG_ALBUM_SORTNAME, NULL, qtdemux_tag_add_str}, { FOURCC_soar, GST_TAG_ARTIST_SORTNAME, NULL, qtdemux_tag_add_str}, { FOURCC_soaa, GST_TAG_ALBUM_ARTIST_SORTNAME, NULL, qtdemux_tag_add_str}, { FOURCC_soco, GST_TAG_COMPOSER_SORTNAME, NULL, qtdemux_tag_add_str}, { FOURCC_sosn, GST_TAG_SHOW_SORTNAME, NULL, qtdemux_tag_add_str}, { FOURCC_tvsh, GST_TAG_SHOW_NAME, NULL, qtdemux_tag_add_str}, { FOURCC_tvsn, GST_TAG_SHOW_SEASON_NUMBER, NULL, qtdemux_tag_add_uint32}, { FOURCC_tves, GST_TAG_SHOW_EPISODE_NUMBER, NULL, qtdemux_tag_add_uint32}, { FOURCC_kywd, GST_TAG_KEYWORDS, NULL, qtdemux_tag_add_keywords}, { FOURCC_keyw, GST_TAG_KEYWORDS, NULL, qtdemux_tag_add_str}, { FOURCC__enc, GST_TAG_ENCODER, NULL, qtdemux_tag_add_str}, { FOURCC_loci, GST_TAG_GEO_LOCATION_NAME, NULL, qtdemux_tag_add_location}, { FOURCC_clsf, GST_QT_DEMUX_CLASSIFICATION_TAG, NULL, qtdemux_tag_add_classification}, { /* This is a special case, some tags are stored in this * 'reverse dns naming', according to: * http://atomicparsley.sourceforge.net/mpeg-4files.html and * bug #614471 */ FOURCC_____, "", NULL, qtdemux_tag_add_revdns}, { /* see http://www.mp4ra.org/specs.html for ID32 in meta box */ FOURCC_ID32, "", NULL, qtdemux_tag_add_id32} }; static void qtdemux_tag_add_blob (GNode * node, GstQTDemux * demux) { gint len; guint8 *data; GstBuffer *buf; gchar *media_type; const gchar *style; GstCaps *caps; guint i; guint8 ndata[4]; data = node->data; len = QT_UINT32 (data); buf = gst_buffer_new_and_alloc (len); memcpy (GST_BUFFER_DATA (buf), data, len); /* heuristic to determine style of tag */ if (QT_FOURCC (data + 4) == FOURCC_____ || (len > 8 + 12 && QT_FOURCC (data + 12) == FOURCC_data)) style = "itunes"; else if (demux->major_brand == FOURCC_qt__) style = "quicktime"; /* fall back to assuming iso/3gp tag style */ else style = "iso"; /* santize the name for the caps. */ for (i = 0; i < 4; i++) { guint8 d = data[4 + i]; if (g_ascii_isalnum (d)) ndata[i] = g_ascii_tolower (d); else ndata[i] = '_'; } media_type = g_strdup_printf ("application/x-gst-qt-%c%c%c%c-tag", ndata[0], ndata[1], ndata[2], ndata[3]); GST_DEBUG_OBJECT (demux, "media type %s", media_type); caps = gst_caps_new_simple (media_type, "style", G_TYPE_STRING, style, NULL); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); g_free (media_type); GST_DEBUG_OBJECT (demux, "adding private tag; size %d, caps %" GST_PTR_FORMAT, GST_BUFFER_SIZE (buf), caps); gst_tag_list_add (demux->tag_list, GST_TAG_MERGE_APPEND, GST_QT_DEMUX_PRIVATE_TAG, buf, NULL); gst_buffer_unref (buf); } static void qtdemux_parse_udta (GstQTDemux * qtdemux, GNode * udta) { GNode *meta; GNode *ilst; GNode *xmp_; GNode *node; gint i; meta = qtdemux_tree_get_child_by_type (udta, FOURCC_meta); if (meta != NULL) { ilst = qtdemux_tree_get_child_by_type (meta, FOURCC_ilst); if (ilst == NULL) { GST_LOG_OBJECT (qtdemux, "no ilst"); return; } } else { ilst = udta; GST_LOG_OBJECT (qtdemux, "no meta so using udta itself"); } GST_DEBUG_OBJECT (qtdemux, "new tag list"); if (!qtdemux->tag_list) qtdemux->tag_list = gst_tag_list_new (); i = 0; while (i < G_N_ELEMENTS (add_funcs)) { node = qtdemux_tree_get_child_by_type (ilst, add_funcs[i].fourcc); if (node) { gint len; len = QT_UINT32 (node->data); if (len < 12) { GST_DEBUG_OBJECT (qtdemux, "too small tag atom %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (add_funcs[i].fourcc)); } else { add_funcs[i].func (qtdemux, add_funcs[i].gst_tag, add_funcs[i].gst_tag_bis, node); } g_node_destroy (node); } else { i++; } } /* parsed nodes have been removed, pass along remainder as blob */ g_node_children_foreach (ilst, G_TRAVERSE_ALL, (GNodeForeachFunc) qtdemux_tag_add_blob, qtdemux); /* parse up XMP_ node if existing */ xmp_ = qtdemux_tree_get_child_by_type (udta, FOURCC_XMP_); if (xmp_ != NULL) { GstBuffer *buf; GstTagList *taglist; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = ((guint8 *) xmp_->data) + 8; GST_BUFFER_SIZE (buf) = QT_UINT32 ((guint8 *) xmp_->data) - 8; taglist = gst_tag_list_from_xmp_buffer (buf); gst_buffer_unref (buf); qtdemux_handle_xmp_taglist (qtdemux, taglist); } else { GST_DEBUG_OBJECT (qtdemux, "No XMP_ node found"); } } typedef struct { GstStructure *structure; /* helper for sort function */ gchar *location; guint min_req_bitrate; guint min_req_qt_version; } GstQtReference; static gint qtdemux_redirects_sort_func (gconstpointer a, gconstpointer b) { GstQtReference *ref_a = (GstQtReference *) a; GstQtReference *ref_b = (GstQtReference *) b; if (ref_b->min_req_qt_version != ref_a->min_req_qt_version) return ref_b->min_req_qt_version - ref_a->min_req_qt_version; /* known bitrates go before unknown; higher bitrates go first */ return ref_b->min_req_bitrate - ref_a->min_req_bitrate; } /* sort the redirects and post a message for the application. */ static void qtdemux_process_redirects (GstQTDemux * qtdemux, GList * references) { GstQtReference *best; GstStructure *s; GstMessage *msg; GValue list_val = { 0, }; GList *l; g_assert (references != NULL); references = g_list_sort (references, qtdemux_redirects_sort_func); best = (GstQtReference *) references->data; g_value_init (&list_val, GST_TYPE_LIST); for (l = references; l != NULL; l = l->next) { GstQtReference *ref = (GstQtReference *) l->data; GValue struct_val = { 0, }; ref->structure = gst_structure_new ("redirect", "new-location", G_TYPE_STRING, ref->location, NULL); if (ref->min_req_bitrate > 0) { gst_structure_set (ref->structure, "minimum-bitrate", G_TYPE_INT, ref->min_req_bitrate, NULL); } g_value_init (&struct_val, GST_TYPE_STRUCTURE); g_value_set_boxed (&struct_val, ref->structure); gst_value_list_append_value (&list_val, &struct_val); g_value_unset (&struct_val); /* don't free anything here yet, since we need best->structure below */ } g_assert (best != NULL); s = gst_structure_copy (best->structure); if (g_list_length (references) > 1) { gst_structure_set_value (s, "locations", &list_val); } g_value_unset (&list_val); for (l = references; l != NULL; l = l->next) { GstQtReference *ref = (GstQtReference *) l->data; gst_structure_free (ref->structure); g_free (ref->location); g_free (ref); } g_list_free (references); GST_INFO_OBJECT (qtdemux, "posting redirect message: %" GST_PTR_FORMAT, s); msg = gst_message_new_element (GST_OBJECT_CAST (qtdemux), s); gst_element_post_message (GST_ELEMENT_CAST (qtdemux), msg); qtdemux->posted_redirect = TRUE; } /* look for redirect nodes, collect all redirect information and * process it. */ static gboolean qtdemux_parse_redirects (GstQTDemux * qtdemux) { GNode *rmra, *rmda, *rdrf; rmra = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_rmra); if (rmra) { GList *redirects = NULL; rmda = qtdemux_tree_get_child_by_type (rmra, FOURCC_rmda); while (rmda) { GstQtReference ref = { NULL, NULL, 0, 0 }; GNode *rmdr, *rmvc; if ((rmdr = qtdemux_tree_get_child_by_type (rmda, FOURCC_rmdr))) { ref.min_req_bitrate = QT_UINT32 ((guint8 *) rmdr->data + 12); GST_LOG_OBJECT (qtdemux, "data rate atom, required bitrate = %u", ref.min_req_bitrate); } if ((rmvc = qtdemux_tree_get_child_by_type (rmda, FOURCC_rmvc))) { guint32 package = QT_FOURCC ((guint8 *) rmvc->data + 12); guint version = QT_UINT32 ((guint8 *) rmvc->data + 16); #ifndef GST_DISABLE_GST_DEBUG guint bitmask = QT_UINT32 ((guint8 *) rmvc->data + 20); #endif guint check_type = QT_UINT16 ((guint8 *) rmvc->data + 24); GST_LOG_OBJECT (qtdemux, "version check atom [%" GST_FOURCC_FORMAT "], version=0x%08x" ", mask=%08x, check_type=%u", GST_FOURCC_ARGS (package), version, bitmask, check_type); if (package == FOURCC_qtim && check_type == 0) { ref.min_req_qt_version = version; } } rdrf = qtdemux_tree_get_child_by_type (rmda, FOURCC_rdrf); if (rdrf) { guint32 ref_type; guint8 *ref_data; ref_type = QT_FOURCC ((guint8 *) rdrf->data + 12); ref_data = (guint8 *) rdrf->data + 20; if (ref_type == FOURCC_alis) { guint record_len, record_version, fn_len; /* MacOSX alias record, google for alias-layout.txt */ record_len = QT_UINT16 (ref_data + 4); record_version = QT_UINT16 (ref_data + 4 + 2); fn_len = QT_UINT8 (ref_data + 50); if (record_len > 50 && record_version == 2 && fn_len > 0) { ref.location = g_strndup ((gchar *) ref_data + 51, fn_len); } } else if (ref_type == FOURCC_url_) { ref.location = g_strdup ((gchar *) ref_data); } else { GST_DEBUG_OBJECT (qtdemux, "unknown rdrf reference type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (ref_type)); } if (ref.location != NULL) { GST_INFO_OBJECT (qtdemux, "New location: %s", ref.location); redirects = g_list_prepend (redirects, g_memdup (&ref, sizeof (ref))); } else { GST_WARNING_OBJECT (qtdemux, "Failed to extract redirect location from rdrf atom"); } } /* look for others */ rmda = qtdemux_tree_get_sibling_by_type (rmda, FOURCC_rmda); } if (redirects != NULL) { qtdemux_process_redirects (qtdemux, redirects); } } return TRUE; } static GstTagList * qtdemux_add_container_format (GstQTDemux * qtdemux, GstTagList * tags) { const gchar *fmt; if (tags == NULL) tags = gst_tag_list_new (); if (qtdemux->major_brand == FOURCC_mjp2) fmt = "Motion JPEG 2000"; else if ((qtdemux->major_brand & 0xffff) == GST_MAKE_FOURCC ('3', 'g', 0, 0)) fmt = "3GP"; else if (qtdemux->major_brand == FOURCC_qt__) fmt = "Quicktime"; else if (qtdemux->fragmented) fmt = "ISO fMP4"; else fmt = "ISO MP4/M4A"; GST_LOG_OBJECT (qtdemux, "mapped %" GST_FOURCC_FORMAT " to '%s'", GST_FOURCC_ARGS (qtdemux->major_brand), fmt); gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_CONTAINER_FORMAT, fmt, NULL); return tags; } /* we have read th complete moov node now. * This function parses all of the relevant info, creates the traks and * prepares all data structures for playback */ static gboolean qtdemux_parse_tree (GstQTDemux * qtdemux) { GNode *mvhd; GNode *trak; GNode *udta; GNode *mvex; gint64 duration; guint64 creation_time; GstDateTime *datetime = NULL; gint version; mvhd = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvhd); if (mvhd == NULL) { GST_LOG_OBJECT (qtdemux, "No mvhd node found, looking for redirects."); return qtdemux_parse_redirects (qtdemux); } version = QT_UINT8 ((guint8 *) mvhd->data + 8); if (version == 1) { creation_time = QT_UINT64 ((guint8 *) mvhd->data + 12); qtdemux->timescale = QT_UINT32 ((guint8 *) mvhd->data + 28); qtdemux->duration = QT_UINT64 ((guint8 *) mvhd->data + 32); } else if (version == 0) { creation_time = QT_UINT32 ((guint8 *) mvhd->data + 12); qtdemux->timescale = QT_UINT32 ((guint8 *) mvhd->data + 20); qtdemux->duration = QT_UINT32 ((guint8 *) mvhd->data + 24); } else { GST_WARNING_OBJECT (qtdemux, "Unhandled mvhd version %d", version); return FALSE; } /* Moving qt creation time (secs since 1904) to unix time */ if (creation_time != 0) { if (creation_time > QTDEMUX_SECONDS_FROM_1904_TO_1970) { GTimeVal now; creation_time -= QTDEMUX_SECONDS_FROM_1904_TO_1970; /* some data cleansing sanity */ g_get_current_time (&now); if (now.tv_sec + 24 * 3600 < creation_time) { GST_DEBUG_OBJECT (qtdemux, "discarding bogus future creation time"); } else { datetime = gst_date_time_new_from_unix_epoch_local_time (creation_time); } } else { GST_WARNING_OBJECT (qtdemux, "Can't handle datetimes before 1970 yet, " "please file a bug at http://bugzilla.gnome.org"); } } if (datetime) { if (!qtdemux->tag_list) qtdemux->tag_list = gst_tag_list_new (); /* Use KEEP as explicit tags should have a higher priority than mvhd tag */ gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_KEEP, GST_TAG_DATE_TIME, datetime, NULL); gst_date_time_unref (datetime); } GST_INFO_OBJECT (qtdemux, "timescale: %u", qtdemux->timescale); GST_INFO_OBJECT (qtdemux, "duration: %" G_GUINT64_FORMAT, qtdemux->duration); /* check for fragmented file and get some (default) data */ mvex = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvex); if (mvex) { GNode *mehd; GstByteReader mehd_data; /* let track parsing or anyone know weird stuff might happen ... */ qtdemux->fragmented = TRUE; /* compensate for total duration */ mehd = qtdemux_tree_get_child_by_type_full (mvex, FOURCC_mehd, &mehd_data); if (mehd) qtdemux_parse_mehd (qtdemux, &mehd_data); } /* set duration in the segment info */ gst_qtdemux_get_duration (qtdemux, &duration); if (duration) { gst_segment_set_duration (&qtdemux->segment, GST_FORMAT_TIME, duration); /* also do not exceed duration; stop is set that way post seek anyway, * and segment activation falls back to duration, * whereas loop only checks stop, so let's align this here as well */ qtdemux->segment.stop = duration; } /* parse all traks */ trak = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_trak); while (trak) { qtdemux_parse_trak (qtdemux, trak); /* iterate all siblings */ trak = qtdemux_tree_get_sibling_by_type (trak, FOURCC_trak); } /* find tags */ udta = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_udta); if (udta) { qtdemux_parse_udta (qtdemux, udta); } else { GST_LOG_OBJECT (qtdemux, "No udta node found."); } /* maybe also some tags in meta box */ udta = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_meta); if (udta) { GST_DEBUG_OBJECT (qtdemux, "Parsing meta box for tags."); qtdemux_parse_udta (qtdemux, udta); } else { GST_LOG_OBJECT (qtdemux, "No meta node found."); } qtdemux->tag_list = qtdemux_add_container_format (qtdemux, qtdemux->tag_list); return TRUE; } /* taken from ffmpeg */ static unsigned int get_size (guint8 * ptr, guint8 ** end) { int count = 4; int len = 0; while (count--) { int c = *ptr; ptr++; len = (len << 7) | (c & 0x7f); if (!(c & 0x80)) break; } if (end) *end = ptr; return len; } /* this can change the codec originally present in @list */ static void gst_qtdemux_handle_esds (GstQTDemux * qtdemux, QtDemuxStream * stream, GNode * esds, GstTagList * list) { int len = QT_UINT32 (esds->data); guint8 *ptr = esds->data; guint8 *end = ptr + len; int tag; guint8 *data_ptr = NULL; int data_len = 0; guint8 object_type_id = 0; const char *codec_name = NULL; GstCaps *caps = NULL; GST_MEMDUMP_OBJECT (qtdemux, "esds", ptr, len); ptr += 8; GST_DEBUG_OBJECT (qtdemux, "version/flags = %08x", QT_UINT32 (ptr)); ptr += 4; while (ptr < end) { tag = QT_UINT8 (ptr); GST_DEBUG_OBJECT (qtdemux, "tag = %02x", tag); ptr++; len = get_size (ptr, &ptr); GST_DEBUG_OBJECT (qtdemux, "len = %d", len); switch (tag) { case 0x03: GST_DEBUG_OBJECT (qtdemux, "ID %04x", QT_UINT16 (ptr)); GST_DEBUG_OBJECT (qtdemux, "priority %04x", QT_UINT8 (ptr + 2)); ptr += 3; break; case 0x04:{ guint max_bitrate, avg_bitrate; object_type_id = QT_UINT8 (ptr); max_bitrate = QT_UINT32 (ptr + 5); avg_bitrate = QT_UINT32 (ptr + 9); GST_DEBUG_OBJECT (qtdemux, "object_type_id %02x", object_type_id); GST_DEBUG_OBJECT (qtdemux, "stream_type %02x", QT_UINT8 (ptr + 1)); GST_DEBUG_OBJECT (qtdemux, "buffer_size_db %02x", QT_UINT24 (ptr + 2)); GST_DEBUG_OBJECT (qtdemux, "max bitrate %u", max_bitrate); GST_DEBUG_OBJECT (qtdemux, "avg bitrate %u", avg_bitrate); if (max_bitrate > 0 && max_bitrate < G_MAXUINT32) { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_MAXIMUM_BITRATE, max_bitrate, NULL); } if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32) { gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, avg_bitrate, NULL); } ptr += 13; break; } case 0x05: GST_MEMDUMP_OBJECT (qtdemux, "data", ptr, len); data_ptr = ptr; data_len = len; ptr += len; break; case 0x06: GST_DEBUG_OBJECT (qtdemux, "data %02x", QT_UINT8 (ptr)); ptr += 1; break; default: GST_ERROR_OBJECT (qtdemux, "parse error"); break; } } /* object_type_id in the esds atom in mp4a and mp4v tells us which codec is * in use, and should also be used to override some other parameters for some * codecs. */ switch (object_type_id) { case 0x20: /* MPEG-4 */ /* 4 bytes for the visual_object_sequence_start_code and 1 byte for the * profile_and_level_indication */ if (data_ptr != NULL && data_len >= 5 && GST_READ_UINT32_BE (data_ptr) == 0x000001b0) { gst_codec_utils_mpeg4video_caps_set_level_and_profile (stream->caps, data_ptr + 4, data_len - 4); } break; /* Nothing special needed here */ case 0x21: /* H.264 */ codec_name = "H.264 / AVC"; caps = gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", NULL); break; case 0x40: /* AAC (any) */ case 0x66: /* AAC Main */ case 0x67: /* AAC LC */ case 0x68: /* AAC SSR */ /* Override channels and rate based on the codec_data, as it's often * wrong. */ /* Only do so for basic setup without HE-AAC extension */ if (data_ptr && data_len == 2) { guint channels, rateindex, rate; /* FIXME: add gst_codec_utils_aac_get_{channels|sample_rate}()? */ channels = (data_ptr[1] & 0x7f) >> 3; if (channels > 0 && channels < 7) { stream->n_channels = channels; } else if (channels == 7) { stream->n_channels = 8; } rateindex = ((data_ptr[0] & 0x7) << 1) | ((data_ptr[1] & 0x80) >> 7); rate = gst_codec_utils_aac_get_sample_rate_from_index (rateindex); if (rate > 0) stream->rate = rate; } /* Set level and profile if possible */ if (data_ptr != NULL && data_len >= 2) { gst_codec_utils_aac_caps_set_level_and_profile (stream->caps, data_ptr, data_len); } break; case 0x60: /* MPEG-2, various profiles */ case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: codec_name = "MPEG-2 video"; gst_caps_unref (stream->caps); stream->caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case 0x69: /* MP3 has two different values, accept either */ case 0x6B: /* change to mpeg1 layer 3 audio */ gst_caps_set_simple (stream->caps, "layer", G_TYPE_INT, 3, "mpegversion", G_TYPE_INT, 1, NULL); codec_name = "MPEG-1 layer 3"; break; case 0x6A: /* MPEG-1 */ codec_name = "MPEG-1 video"; gst_caps_unref (stream->caps); stream->caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case 0x6C: /* MJPEG */ caps = gst_caps_new_simple ("image/jpeg", NULL); codec_name = "Motion-JPEG"; break; case 0x6D: /* PNG */ caps = gst_caps_new_simple ("image/png", NULL); codec_name = "PNG still images"; break; case 0x6E: /* JPEG2000 */ codec_name = "JPEG-2000"; caps = gst_caps_new_simple ("image/x-j2c", "fields", G_TYPE_INT, 1, NULL); break; case 0xA4: /* Dirac */ codec_name = "Dirac"; caps = gst_caps_new_simple ("video/x-dirac", NULL); break; case 0xA5: /* AC3 */ codec_name = "AC-3 audio"; caps = gst_caps_new_simple ("audio/x-ac3", "framed", G_TYPE_BOOLEAN, TRUE, NULL); break; case 0xE1: /* QCELP */ /* QCELP, the codec_data is a riff tag (little endian) with * more info (http://ftp.3gpp2.org/TSGC/Working/2003/2003-05-SanDiego/TSG-C-2003-05-San%20Diego/WG1/SWG12/C12-20030512-006%20=%20C12-20030217-015_Draft_Baseline%20Text%20of%20FFMS_R2.doc). */ caps = gst_caps_new_simple ("audio/qcelp", NULL); codec_name = "QCELP"; break; default: break; } /* If we have a replacement caps, then change our caps for this stream */ if (caps) { gst_caps_unref (stream->caps); stream->caps = caps; } if (codec_name && list) gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, codec_name, NULL); /* Add the codec_data attribute to caps, if we have it */ if (data_ptr) { GstBuffer *buffer; buffer = gst_buffer_new_and_alloc (data_len); memcpy (GST_BUFFER_DATA (buffer), data_ptr, data_len); GST_DEBUG_OBJECT (qtdemux, "setting codec_data from esds"); GST_MEMDUMP_OBJECT (qtdemux, "codec_data from esds", data_ptr, data_len); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); gst_buffer_unref (buffer); } } #define _codec(name) \ do { \ if (codec_name) { \ *codec_name = g_strdup (name); \ } \ } while (0) static GstCaps * qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 fourcc, const guint8 * stsd_data, gchar ** codec_name) { GstCaps *caps; const GstStructure *s; const gchar *name; switch (fourcc) { case GST_MAKE_FOURCC ('p', 'n', 'g', ' '): _codec ("PNG still images"); caps = gst_caps_new_simple ("image/png", NULL); break; case GST_MAKE_FOURCC ('j', 'p', 'e', 'g'): _codec ("JPEG still images"); caps = gst_caps_new_simple ("image/jpeg", NULL); break; case GST_MAKE_FOURCC ('m', 'j', 'p', 'a'): case GST_MAKE_FOURCC ('A', 'V', 'D', 'J'): case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): case GST_MAKE_FOURCC ('d', 'm', 'b', '1'): _codec ("Motion-JPEG"); caps = gst_caps_new_simple ("image/jpeg", NULL); break; case GST_MAKE_FOURCC ('m', 'j', 'p', 'b'): _codec ("Motion-JPEG format B"); caps = gst_caps_new_simple ("video/x-mjpeg-b", NULL); break; case GST_MAKE_FOURCC ('m', 'j', 'p', '2'): _codec ("JPEG-2000"); /* override to what it should be according to spec, avoid palette_data */ stream->bits_per_sample = 24; caps = gst_caps_new_simple ("image/x-j2c", "fields", G_TYPE_INT, 1, NULL); break; case GST_MAKE_FOURCC ('S', 'V', 'Q', '3'): _codec ("Sorensen video v.3"); caps = gst_caps_new_simple ("video/x-svq", "svqversion", G_TYPE_INT, 3, NULL); break; case GST_MAKE_FOURCC ('s', 'v', 'q', 'i'): case GST_MAKE_FOURCC ('S', 'V', 'Q', '1'): _codec ("Sorensen video v.1"); caps = gst_caps_new_simple ("video/x-svq", "svqversion", G_TYPE_INT, 1, NULL); break; case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): { guint16 bps; _codec ("Raw RGB video"); bps = QT_UINT16 (stsd_data + 98); /* set common stuff */ caps = gst_caps_new_simple ("video/x-raw-rgb", "endianness", G_TYPE_INT, G_BYTE_ORDER, "depth", G_TYPE_INT, bps, NULL); switch (bps) { case 15: gst_caps_set_simple (caps, "bpp", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 0x7c00, "green_mask", G_TYPE_INT, 0x03e0, "blue_mask", G_TYPE_INT, 0x001f, NULL); break; case 16: gst_caps_set_simple (caps, "bpp", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 0xf800, "green_mask", G_TYPE_INT, 0x07e0, "blue_mask", G_TYPE_INT, 0x001f, NULL); break; case 24: gst_caps_set_simple (caps, "bpp", G_TYPE_INT, 24, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 0xff0000, "green_mask", G_TYPE_INT, 0x00ff00, "blue_mask", G_TYPE_INT, 0x0000ff, NULL); break; case 32: gst_caps_set_simple (caps, "bpp", G_TYPE_INT, 32, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "alpha_mask", G_TYPE_INT, 0xff000000, "red_mask", G_TYPE_INT, 0x00ff0000, "green_mask", G_TYPE_INT, 0x0000ff00, "blue_mask", G_TYPE_INT, 0x000000ff, NULL); break; default: /* unknown */ break; } break; } case GST_MAKE_FOURCC ('y', 'v', '1', '2'): _codec ("Raw planar YUV 4:2:0"); caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), NULL); break; case GST_MAKE_FOURCC ('y', 'u', 'v', '2'): case GST_MAKE_FOURCC ('Y', 'u', 'v', '2'): _codec ("Raw packed YUV 4:2:2"); caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), NULL); break; case GST_MAKE_FOURCC ('2', 'v', 'u', 'y'): case GST_MAKE_FOURCC ('2', 'V', 'u', 'y'): _codec ("Raw packed YUV 4:2:2"); caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'), NULL); break; case GST_MAKE_FOURCC ('v', '2', '1', '0'): _codec ("Raw packed YUV 10-bit 4:2:2"); caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('v', '2', '1', '0'), NULL); break; case GST_MAKE_FOURCC ('r', '2', '1', '0'): _codec ("Raw packed RGB 10-bit 4:4:4"); caps = gst_caps_new_simple ("video/x-raw-rgb", "endianness", G_TYPE_INT, G_BIG_ENDIAN, "depth", G_TYPE_INT, 30, "bpp", G_TYPE_INT, 32, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 0x3ff00000, "green_mask", G_TYPE_INT, 0x000ffc00, "blue_mask", G_TYPE_INT, 0x000003ff, NULL); break; case GST_MAKE_FOURCC ('m', 'p', 'e', 'g'): case GST_MAKE_FOURCC ('m', 'p', 'g', '1'): _codec ("MPEG-1 video"); caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('h', 'd', 'v', '1'): /* HDV 720p30 */ case GST_MAKE_FOURCC ('h', 'd', 'v', '2'): /* HDV 1080i60 */ case GST_MAKE_FOURCC ('h', 'd', 'v', '3'): /* HDV 1080i50 */ case GST_MAKE_FOURCC ('h', 'd', 'v', '5'): /* HDV 720p25 */ case GST_MAKE_FOURCC ('h', 'd', 'v', '6'): /* HDV 1080i60 */ case GST_MAKE_FOURCC ('m', 'x', '5', 'n'): /* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */ case GST_MAKE_FOURCC ('m', 'x', '5', 'p'): /* MPEG2 IMX PAL 625/60 50mb/s produced by FCP */ case GST_MAKE_FOURCC ('m', 'x', '4', 'n'): /* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */ case GST_MAKE_FOURCC ('m', 'x', '4', 'p'): /* MPEG2 IMX PAL 625/60 40mb/s produced by FCP */ case GST_MAKE_FOURCC ('m', 'x', '3', 'n'): /* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */ case GST_MAKE_FOURCC ('m', 'x', '3', 'p'): /* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */ case GST_MAKE_FOURCC ('x', 'd', 'v', '2'): /* XDCAM HD 1080i60 */ case GST_MAKE_FOURCC ('A', 'V', 'm', 'p'): /* AVID IMX PAL */ case GST_MAKE_FOURCC ('m', 'p', 'g', '2'): /* AVID IMX PAL */ _codec ("MPEG-2 video"); caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('g', 'i', 'f', ' '): _codec ("GIF still images"); caps = gst_caps_new_simple ("image/gif", NULL); break; case GST_MAKE_FOURCC ('h', '2', '6', '3'): case GST_MAKE_FOURCC ('H', '2', '6', '3'): case GST_MAKE_FOURCC ('s', '2', '6', '3'): case GST_MAKE_FOURCC ('U', '2', '6', '3'): _codec ("H.263"); /* ffmpeg uses the height/width props, don't know why */ caps = gst_caps_new_simple ("video/x-h263", NULL); break; case GST_MAKE_FOURCC ('m', 'p', '4', 'v'): case GST_MAKE_FOURCC ('M', 'P', '4', 'V'): _codec ("MPEG-4 video"); caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('3', 'i', 'v', 'd'): case GST_MAKE_FOURCC ('3', 'I', 'V', 'D'): _codec ("Microsoft MPEG-4 4.3"); /* FIXME? */ caps = gst_caps_new_simple ("video/x-msmpeg", "msmpegversion", G_TYPE_INT, 43, NULL); break; case GST_MAKE_FOURCC ('3', 'I', 'V', '1'): case GST_MAKE_FOURCC ('3', 'I', 'V', '2'): _codec ("3ivX video"); caps = gst_caps_new_simple ("video/x-3ivx", NULL); break; case GST_MAKE_FOURCC ('D', 'I', 'V', '3'): _codec ("DivX 3"); caps = gst_caps_new_simple ("video/x-divx", "divxversion", G_TYPE_INT, 3, NULL); break; case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'): case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'): _codec ("DivX 4"); caps = gst_caps_new_simple ("video/x-divx", "divxversion", G_TYPE_INT, 4, NULL); break; case GST_MAKE_FOURCC ('D', 'X', '5', '0'): _codec ("DivX 5"); caps = gst_caps_new_simple ("video/x-divx", "divxversion", G_TYPE_INT, 5, NULL); break; case GST_MAKE_FOURCC ('X', 'V', 'I', 'D'): case GST_MAKE_FOURCC ('x', 'v', 'i', 'd'): _codec ("XVID MPEG-4"); caps = gst_caps_new_simple ("video/x-xvid", NULL); break; case GST_MAKE_FOURCC ('F', 'M', 'P', '4'): case GST_MAKE_FOURCC ('U', 'M', 'P', '4'): caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, NULL); if (codec_name) *codec_name = g_strdup ("FFmpeg MPEG-4"); break; case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'): _codec ("Cinepak"); caps = gst_caps_new_simple ("video/x-cinepak", NULL); break; case GST_MAKE_FOURCC ('q', 'd', 'r', 'w'): _codec ("Apple QuickDraw"); caps = gst_caps_new_simple ("video/x-qdrw", NULL); break; case GST_MAKE_FOURCC ('r', 'p', 'z', 'a'): _codec ("Apple video"); caps = gst_caps_new_simple ("video/x-apple-video", NULL); break; case GST_MAKE_FOURCC ('a', 'v', 'c', '1'): _codec ("H.264 / AVC"); caps = gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", NULL); break; case GST_MAKE_FOURCC ('r', 'l', 'e', ' '): _codec ("Run-length encoding"); caps = gst_caps_new_simple ("video/x-rle", "layout", G_TYPE_STRING, "quicktime", NULL); break; case GST_MAKE_FOURCC ('I', 'V', '3', '2'): case GST_MAKE_FOURCC ('i', 'v', '3', '2'): _codec ("Indeo Video 3"); caps = gst_caps_new_simple ("video/x-indeo", "indeoversion", G_TYPE_INT, 3, NULL); break; case GST_MAKE_FOURCC ('I', 'V', '4', '1'): case GST_MAKE_FOURCC ('i', 'v', '4', '1'): _codec ("Intel Video 4"); caps = gst_caps_new_simple ("video/x-indeo", "indeoversion", G_TYPE_INT, 4, NULL); break; case GST_MAKE_FOURCC ('d', 'v', 'c', 'p'): case GST_MAKE_FOURCC ('d', 'v', 'c', ' '): case GST_MAKE_FOURCC ('d', 'v', 's', 'd'): case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'): case GST_MAKE_FOURCC ('d', 'v', 'c', 's'): case GST_MAKE_FOURCC ('D', 'V', 'C', 'S'): case GST_MAKE_FOURCC ('d', 'v', '2', '5'): case GST_MAKE_FOURCC ('d', 'v', 'p', 'p'): _codec ("DV Video"); caps = gst_caps_new_simple ("video/x-dv", "dvversion", G_TYPE_INT, 25, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('d', 'v', '5', 'n'): /* DVCPRO50 NTSC */ case GST_MAKE_FOURCC ('d', 'v', '5', 'p'): /* DVCPRO50 PAL */ _codec ("DVCPro50 Video"); caps = gst_caps_new_simple ("video/x-dv", "dvversion", G_TYPE_INT, 50, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('d', 'v', 'h', '5'): /* DVCPRO HD 50i produced by FCP */ case GST_MAKE_FOURCC ('d', 'v', 'h', '6'): /* DVCPRO HD 60i produced by FCP */ _codec ("DVCProHD Video"); caps = gst_caps_new_simple ("video/x-dv", "dvversion", G_TYPE_INT, 100, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('s', 'm', 'c', ' '): _codec ("Apple Graphics (SMC)"); caps = gst_caps_new_simple ("video/x-smc", NULL); break; case GST_MAKE_FOURCC ('V', 'P', '3', '1'): _codec ("VP3"); caps = gst_caps_new_simple ("video/x-vp3", NULL); break; case GST_MAKE_FOURCC ('X', 'i', 'T', 'h'): _codec ("Theora"); caps = gst_caps_new_simple ("video/x-theora", NULL); /* theora uses one byte of padding in the data stream because it does not * allow 0 sized packets while theora does */ stream->padding = 1; break; case GST_MAKE_FOURCC ('d', 'r', 'a', 'c'): _codec ("Dirac"); caps = gst_caps_new_simple ("video/x-dirac", NULL); break; case GST_MAKE_FOURCC ('t', 'i', 'f', 'f'): _codec ("TIFF still images"); caps = gst_caps_new_simple ("image/tiff", NULL); break; case GST_MAKE_FOURCC ('i', 'c', 'o', 'd'): _codec ("Apple Intermediate Codec"); caps = gst_caps_from_string ("video/x-apple-intermediate-codec"); break; case GST_MAKE_FOURCC ('A', 'V', 'd', 'n'): _codec ("AVID DNxHD"); caps = gst_caps_from_string ("video/x-dnxhd"); break; case GST_MAKE_FOURCC ('V', 'P', '8', '0'): _codec ("On2 VP8"); caps = gst_caps_from_string ("video/x-vp8"); break; case FOURCC_ovc1: _codec ("VC-1"); caps = gst_caps_new_simple ("video/x-wmv", "wmvversion", G_TYPE_INT, 3, "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('W', 'V', 'C', '1'), NULL); break; case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'): default: { char *s; s = g_strdup_printf ("video/x-gst-fourcc-%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); caps = gst_caps_new_simple (s, NULL); break; } } /* enable clipping for raw video streams */ s = gst_caps_get_structure (caps, 0); name = gst_structure_get_name (s); if (g_str_has_prefix (name, "video/x-raw-")) { stream->need_clip = TRUE; } return caps; } static GstCaps * qtdemux_audio_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 fourcc, const guint8 * data, int len, gchar ** codec_name) { GstCaps *caps; const GstStructure *s; const gchar *name; gint endian = 0; GST_DEBUG_OBJECT (qtdemux, "resolve fourcc %08x", fourcc); switch (fourcc) { case GST_MAKE_FOURCC ('N', 'O', 'N', 'E'): case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): _codec ("Raw 8-bit PCM audio"); caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8, "signed", G_TYPE_BOOLEAN, FALSE, NULL); break; case GST_MAKE_FOURCC ('t', 'w', 'o', 's'): endian = G_BIG_ENDIAN; /* fall-through */ case GST_MAKE_FOURCC ('s', 'o', 'w', 't'): { gchar *str; gint depth; if (!endian) endian = G_LITTLE_ENDIAN; depth = stream->bytes_per_packet * 8; str = g_strdup_printf ("Raw %d-bit PCM audio", depth); _codec (str); g_free (str); caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, depth, "depth", G_TYPE_INT, depth, "endianness", G_TYPE_INT, endian, "signed", G_TYPE_BOOLEAN, TRUE, NULL); break; } case GST_MAKE_FOURCC ('f', 'l', '6', '4'): _codec ("Raw 64-bit floating-point audio"); caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 64, "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); break; case GST_MAKE_FOURCC ('f', 'l', '3', '2'): _codec ("Raw 32-bit floating-point audio"); caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); break; case FOURCC_in24: _codec ("Raw 24-bit PCM audio"); /* we assume BIG ENDIAN, an enda box will tell us to change this to little * endian later */ caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "signed", G_TYPE_BOOLEAN, TRUE, NULL); break; case GST_MAKE_FOURCC ('i', 'n', '3', '2'): _codec ("Raw 32-bit PCM audio"); caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 32, "depth", G_TYPE_INT, 32, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "signed", G_TYPE_BOOLEAN, TRUE, NULL); break; case GST_MAKE_FOURCC ('u', 'l', 'a', 'w'): _codec ("Mu-law audio"); caps = gst_caps_new_simple ("audio/x-mulaw", NULL); break; case GST_MAKE_FOURCC ('a', 'l', 'a', 'w'): _codec ("A-law audio"); caps = gst_caps_new_simple ("audio/x-alaw", NULL); break; case 0x0200736d: case 0x6d730002: _codec ("Microsoft ADPCM"); /* Microsoft ADPCM-ACM code 2 */ caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "microsoft", NULL); break; case 0x1100736d: case 0x6d730011: _codec ("DVI/IMA ADPCM"); caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "dvi", NULL); break; case 0x1700736d: case 0x6d730017: _codec ("DVI/Intel IMA ADPCM"); /* FIXME DVI/Intel IMA ADPCM/ACM code 17 */ caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "quicktime", NULL); break; case 0x5500736d: case 0x6d730055: /* MPEG layer 3, CBR only (pre QT4.1) */ case GST_MAKE_FOURCC ('.', 'm', 'p', '3'): _codec ("MPEG-1 layer 3"); /* MPEG layer 3, CBR & VBR (QT4.1 and later) */ caps = gst_caps_new_simple ("audio/mpeg", "layer", G_TYPE_INT, 3, "mpegversion", G_TYPE_INT, 1, NULL); break; case 0x20736d: case GST_MAKE_FOURCC ('e', 'c', '-', '3'): _codec ("EAC-3 audio"); caps = gst_caps_new_simple ("audio/x-eac3", "framed", G_TYPE_BOOLEAN, TRUE, NULL); stream->sampled = TRUE; break; case GST_MAKE_FOURCC ('a', 'c', '-', '3'): _codec ("AC-3 audio"); caps = gst_caps_new_simple ("audio/x-ac3", "framed", G_TYPE_BOOLEAN, TRUE, NULL); stream->sampled = TRUE; break; case GST_MAKE_FOURCC ('M', 'A', 'C', '3'): _codec ("MACE-3"); caps = gst_caps_new_simple ("audio/x-mace", "maceversion", G_TYPE_INT, 3, NULL); break; case GST_MAKE_FOURCC ('M', 'A', 'C', '6'): _codec ("MACE-6"); caps = gst_caps_new_simple ("audio/x-mace", "maceversion", G_TYPE_INT, 6, NULL); break; case GST_MAKE_FOURCC ('O', 'g', 'g', 'V'): /* ogg/vorbis */ caps = gst_caps_new_simple ("application/ogg", NULL); break; case GST_MAKE_FOURCC ('d', 'v', 'c', 'a'): _codec ("DV audio"); caps = gst_caps_new_simple ("audio/x-dv", NULL); break; case GST_MAKE_FOURCC ('m', 'p', '4', 'a'): _codec ("MPEG-4 AAC audio"); caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, "framed", G_TYPE_BOOLEAN, TRUE, "stream-format", G_TYPE_STRING, "raw", NULL); break; case GST_MAKE_FOURCC ('Q', 'D', 'M', 'C'): _codec ("QDesign Music"); caps = gst_caps_new_simple ("audio/x-qdm", NULL); break; case GST_MAKE_FOURCC ('Q', 'D', 'M', '2'): _codec ("QDesign Music v.2"); /* FIXME: QDesign music version 2 (no constant) */ if (data) { caps = gst_caps_new_simple ("audio/x-qdm2", "framesize", G_TYPE_INT, QT_UINT32 (data + 52), "bitrate", G_TYPE_INT, QT_UINT32 (data + 40), "blocksize", G_TYPE_INT, QT_UINT32 (data + 44), NULL); } else { caps = gst_caps_new_simple ("audio/x-qdm2", NULL); } break; case GST_MAKE_FOURCC ('a', 'g', 's', 'm'): _codec ("GSM audio"); caps = gst_caps_new_simple ("audio/x-gsm", NULL); break; case GST_MAKE_FOURCC ('s', 'a', 'm', 'r'): _codec ("AMR audio"); caps = gst_caps_new_simple ("audio/AMR", NULL); break; case GST_MAKE_FOURCC ('s', 'a', 'w', 'b'): _codec ("AMR-WB audio"); caps = gst_caps_new_simple ("audio/AMR-WB", NULL); break; case GST_MAKE_FOURCC ('i', 'm', 'a', '4'): _codec ("Quicktime IMA ADPCM"); caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "quicktime", NULL); break; case GST_MAKE_FOURCC ('a', 'l', 'a', 'c'): _codec ("Apple lossless audio"); caps = gst_caps_new_simple ("audio/x-alac", NULL); break; case GST_MAKE_FOURCC ('Q', 'c', 'l', 'p'): _codec ("QualComm PureVoice"); caps = gst_caps_from_string ("audio/qcelp"); break; case FOURCC_owma: _codec ("WMA"); caps = gst_caps_new_simple ("audio/x-wma", NULL); break; case GST_MAKE_FOURCC ('q', 't', 'v', 'r'): /* ? */ default: { char *s; s = g_strdup_printf ("audio/x-gst-fourcc-%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); caps = gst_caps_new_simple (s, NULL); break; } } /* enable clipping for raw audio streams */ s = gst_caps_get_structure (caps, 0); name = gst_structure_get_name (s); if (g_str_has_prefix (name, "audio/x-raw-")) { stream->need_clip = TRUE; } return caps; } static GstCaps * qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 fourcc, const guint8 * stsd_data, gchar ** codec_name) { GstCaps *caps; GST_DEBUG_OBJECT (qtdemux, "resolve fourcc %08x", fourcc); switch (fourcc) { case GST_MAKE_FOURCC ('m', 'p', '4', 's'): _codec ("DVD subtitle"); caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); break; case GST_MAKE_FOURCC ('t', 'e', 'x', 't'): _codec ("Quicktime timed text"); goto text; case GST_MAKE_FOURCC ('t', 'x', '3', 'g'): _codec ("3GPP timed text"); text: caps = gst_caps_new_simple ("text/plain", NULL); /* actual text piece needs to be extracted */ stream->need_process = TRUE; break; default: { char *s; s = g_strdup_printf ("text/x-gst-fourcc-%" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); caps = gst_caps_new_simple (s, NULL); break; } } return caps; } gst-plugins-good-0.10.31/gst/isomp4/gstqtmoovrecover.c0000644000175000017500000003003111677341655017620 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2010 Thiago Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ /** * SECTION:element-qtmoovrecover * @short_description: Utility element for recovering unfinished quicktime files * * * * This element recovers quicktime files created with qtmux using the moov * recovery feature. * * Example pipelines * * * TODO * * * * * Documentation last reviewed on 2011-04-21 */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include "gstqtmoovrecover.h" GST_DEBUG_CATEGORY_STATIC (gst_qt_moov_recover_debug); #define GST_CAT_DEFAULT gst_qt_moov_recover_debug /* QTMoovRecover signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_RECOVERY_INPUT, PROP_BROKEN_INPUT, PROP_FIXED_OUTPUT, PROP_FAST_START_MODE }; GST_BOILERPLATE (GstQTMoovRecover, gst_qt_moov_recover, GstPipeline, GST_TYPE_PIPELINE); /* property functions */ static void gst_qt_moov_recover_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_qt_moov_recover_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_qt_moov_recover_change_state (GstElement * element, GstStateChange transition); static void gst_qt_moov_recover_finalize (GObject * object); static void gst_qt_moov_recover_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); #if 0 GstQTMoovRecoverClass *klass = (GstQTMoovRecoverClass *) g_class; #endif gst_element_class_set_details_simple (element_class, "QT Moov Recover", "Util", "Recovers unfinished qtmux files", "Thiago Santos "); } static void gst_qt_moov_recover_class_init (GstQTMoovRecoverClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_qt_moov_recover_finalize; gobject_class->get_property = gst_qt_moov_recover_get_property; gobject_class->set_property = gst_qt_moov_recover_set_property; gstelement_class->change_state = gst_qt_moov_recover_change_state; g_object_class_install_property (gobject_class, PROP_FIXED_OUTPUT, g_param_spec_string ("fixed-output", "Path to write the fixed file", "Path to write the fixed file to (used as output)", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_BROKEN_INPUT, g_param_spec_string ("broken-input", "Path to broken input file", "Path to broken input file. (If qtmux was on faststart mode, this " "file is the faststart file)", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RECOVERY_INPUT, g_param_spec_string ("recovery-input", "Path to recovery file", "Path to recovery file (used as input)", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FAST_START_MODE, g_param_spec_boolean ("faststart-mode", "If the broken input is from faststart mode", "If the broken input is from faststart mode", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (gst_qt_moov_recover_debug, "qtmoovrecover", 0, "QT Moovie Recover"); } static void gst_qt_moov_recover_init (GstQTMoovRecover * qtmr, GstQTMoovRecoverClass * qtmr_klass) { } static void gst_qt_moov_recover_finalize (GObject * object) { G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_qt_moov_recover_run (void *data) { FILE *moovrec = NULL; FILE *mdatinput = NULL; FILE *output = NULL; MdatRecovFile *mdat_recov = NULL; MoovRecovFile *moov_recov = NULL; GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (data); GError *err = NULL; GST_LOG_OBJECT (qtmr, "Starting task"); GST_DEBUG_OBJECT (qtmr, "Validating properties"); GST_OBJECT_LOCK (qtmr); /* validate properties */ if (qtmr->broken_input == NULL) { GST_OBJECT_UNLOCK (qtmr); GST_ELEMENT_ERROR (qtmr, RESOURCE, SETTINGS, ("Please set broken-input property"), (NULL)); goto end; } if (qtmr->recovery_input == NULL) { GST_OBJECT_UNLOCK (qtmr); GST_ELEMENT_ERROR (qtmr, RESOURCE, SETTINGS, ("Please set recovery-input property"), (NULL)); goto end; } if (qtmr->fixed_output == NULL) { GST_OBJECT_UNLOCK (qtmr); GST_ELEMENT_ERROR (qtmr, RESOURCE, SETTINGS, ("Please set fixed-output property"), (NULL)); goto end; } GST_DEBUG_OBJECT (qtmr, "Opening input/output files"); /* open files */ moovrec = g_fopen (qtmr->recovery_input, "rb"); if (moovrec == NULL) { GST_OBJECT_UNLOCK (qtmr); GST_ELEMENT_ERROR (qtmr, RESOURCE, OPEN_READ, ("Failed to open recovery-input file"), (NULL)); goto end; } mdatinput = g_fopen (qtmr->broken_input, "rb"); if (mdatinput == NULL) { GST_OBJECT_UNLOCK (qtmr); GST_ELEMENT_ERROR (qtmr, RESOURCE, OPEN_READ, ("Failed to open broken-input file"), (NULL)); goto end; } output = g_fopen (qtmr->fixed_output, "wb+"); if (output == NULL) { GST_OBJECT_UNLOCK (qtmr); GST_ELEMENT_ERROR (qtmr, RESOURCE, OPEN_READ_WRITE, ("Failed to open fixed-output file"), (NULL)); goto end; } GST_OBJECT_UNLOCK (qtmr); GST_DEBUG_OBJECT (qtmr, "Parsing input files"); /* now create our structures */ mdat_recov = mdat_recov_file_create (mdatinput, qtmr->faststart_mode, &err); mdatinput = NULL; if (mdat_recov == NULL) { GST_ELEMENT_ERROR (qtmr, RESOURCE, FAILED, ("Broken file could not be parsed correctly"), (NULL)); goto end; } moov_recov = moov_recov_file_create (moovrec, &err); moovrec = NULL; if (moov_recov == NULL) { GST_ELEMENT_ERROR (qtmr, RESOURCE, FAILED, ("Recovery file could not be parsed correctly"), (NULL)); goto end; } /* now parse the buffers data from moovrec */ if (!moov_recov_parse_buffers (moov_recov, mdat_recov, &err)) { goto end; } GST_DEBUG_OBJECT (qtmr, "Writing fixed file to output"); if (!moov_recov_write_file (moov_recov, mdat_recov, output, &err)) { goto end; } /* here means success */ GST_DEBUG_OBJECT (qtmr, "Finished successfully, posting EOS"); gst_element_post_message (GST_ELEMENT_CAST (qtmr), gst_message_new_eos (GST_OBJECT_CAST (qtmr))); end: GST_LOG_OBJECT (qtmr, "Finalizing task"); if (err) { GST_ELEMENT_ERROR (qtmr, RESOURCE, FAILED, ("%s", err->message), (NULL)); g_error_free (err); } if (moov_recov) moov_recov_file_free (moov_recov); if (moovrec) fclose (moovrec); if (mdat_recov) mdat_recov_file_free (mdat_recov); if (mdatinput) fclose (mdatinput); if (output) fclose (output); GST_LOG_OBJECT (qtmr, "Leaving task"); gst_task_stop (qtmr->task); } static void gst_qt_moov_recover_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (object); GST_OBJECT_LOCK (qtmr); switch (prop_id) { case PROP_FAST_START_MODE: g_value_set_boolean (value, qtmr->faststart_mode); break; case PROP_BROKEN_INPUT: g_value_set_string (value, qtmr->broken_input); break; case PROP_RECOVERY_INPUT: g_value_set_string (value, qtmr->recovery_input); break; case PROP_FIXED_OUTPUT: g_value_set_string (value, qtmr->fixed_output); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (qtmr); } static void gst_qt_moov_recover_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (object); GST_OBJECT_LOCK (qtmr); switch (prop_id) { case PROP_FAST_START_MODE: qtmr->faststart_mode = g_value_get_boolean (value); break; case PROP_BROKEN_INPUT: g_free (qtmr->broken_input); qtmr->broken_input = g_value_dup_string (value); break; case PROP_RECOVERY_INPUT: g_free (qtmr->recovery_input); qtmr->recovery_input = g_value_dup_string (value); break; case PROP_FIXED_OUTPUT: g_free (qtmr->fixed_output); qtmr->fixed_output = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (qtmr); } static GstStateChangeReturn gst_qt_moov_recover_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstQTMoovRecover *qtmr = GST_QT_MOOV_RECOVER_CAST (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: qtmr->task = gst_task_create (gst_qt_moov_recover_run, qtmr); g_static_rec_mutex_init (&qtmr->task_mutex); gst_task_set_lock (qtmr->task, &qtmr->task_mutex); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: gst_task_start (qtmr->task); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gst_task_stop (qtmr->task); gst_task_join (qtmr->task); break; case GST_STATE_CHANGE_READY_TO_NULL: g_assert (gst_task_get_state (qtmr->task) == GST_TASK_STOPPED); gst_object_unref (qtmr->task); qtmr->task = NULL; g_static_rec_mutex_free (&qtmr->task_mutex); break; default: break; } return ret; } gboolean gst_qt_moov_recover_register (GstPlugin * plugin) { return gst_element_register (plugin, "qtmoovrecover", GST_RANK_NONE, GST_TYPE_QT_MOOV_RECOVER); } gst-plugins-good-0.10.31/gst/isomp4/qtdemux_dump.c0000644000175000017500000006433611671175353016714 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) 2009 Tim-Philipp Müller * Copyright (C) <2009> STEricsson * * 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 "qtdemux_types.h" #include "qtdemux_dump.h" #include "qtatomparser.h" #include #define GET_UINT8(data) gst_byte_reader_get_uint8_unchecked(data) #define GET_UINT16(data) gst_byte_reader_get_uint16_be_unchecked(data) #define GET_UINT32(data) gst_byte_reader_get_uint32_be_unchecked(data) #define GET_UINT64(data) gst_byte_reader_get_uint64_be_unchecked(data) #define GET_FP32(data) (gst_byte_reader_get_uint32_be_unchecked(data)/65536.0) #define GET_FP16(data) (gst_byte_reader_get_uint16_be_unchecked(data)/256.0) #define GET_FOURCC(data) qt_atom_parser_get_fourcc_unchecked(data) gboolean qtdemux_dump_mvhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 version = 0; if (!qt_atom_parser_has_remaining (data, 100)) return FALSE; version = GET_UINT32 (data); GST_LOG ("%*s version/flags: %08x", depth, "", version); version = version >> 24; if (version == 0) { GST_LOG ("%*s creation time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s modify time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s time scale: 1/%u sec", depth, "", GET_UINT32 (data)); GST_LOG ("%*s duration: %u", depth, "", GET_UINT32 (data)); } else if (version == 1) { GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, depth, "", GET_UINT64 (data)); GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, depth, "", GET_UINT64 (data)); GST_LOG ("%*s time scale: 1/%u sec", depth, "", GET_UINT32 (data)); GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, depth, "", GET_UINT64 (data)); } else return FALSE; GST_LOG ("%*s pref. rate: %g", depth, "", GET_FP32 (data)); GST_LOG ("%*s pref. volume: %g", depth, "", GET_FP16 (data)); gst_byte_reader_skip (data, 46); GST_LOG ("%*s preview time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s preview dur.: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s poster time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s select time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s select dur.: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s current time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s next track ID: %d", depth, "", GET_UINT32 (data)); return TRUE; } gboolean qtdemux_dump_tkhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint64 duration, ctime, mtime; guint32 version = 0, track_id = 0, iwidth = 0, iheight = 0; guint16 layer = 0, alt_group = 0, ivol = 0; guint value_size; if (!gst_byte_reader_get_uint32_be (data, &version)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", version); value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); if (qt_atom_parser_get_offset (data, value_size, &ctime) && qt_atom_parser_get_offset (data, value_size, &mtime) && gst_byte_reader_get_uint32_be (data, &track_id) && gst_byte_reader_skip (data, 4) && qt_atom_parser_get_offset (data, value_size, &duration) && gst_byte_reader_skip (data, 4) && gst_byte_reader_get_uint16_be (data, &layer) && gst_byte_reader_get_uint16_be (data, &alt_group) && gst_byte_reader_skip (data, 4) && gst_byte_reader_get_uint16_be (data, &ivol) && gst_byte_reader_skip (data, 2 + (9 * 4)) && gst_byte_reader_get_uint32_be (data, &iwidth) && gst_byte_reader_get_uint32_be (data, &iheight)) { GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, depth, "", ctime); GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, depth, "", mtime); GST_LOG ("%*s track ID: %u", depth, "", track_id); GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, depth, "", duration); GST_LOG ("%*s layer: %u", depth, "", layer); GST_LOG ("%*s alt group: %u", depth, "", alt_group); GST_LOG ("%*s volume: %g", depth, "", ivol / 256.0); GST_LOG ("%*s track width: %g", depth, "", iwidth / 65536.0); GST_LOG ("%*s track height: %g", depth, "", iheight / 65536.0); return TRUE; } return FALSE; } gboolean qtdemux_dump_elst (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4 + 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s track dur: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s media time: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s media rate: %g", depth, "", GET_FP32 (data)); } return TRUE; } gboolean qtdemux_dump_mdhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 version = 0; guint64 duration, ctime, mtime; guint32 time_scale = 0; guint16 language = 0, quality = 0; guint value_size; if (!gst_byte_reader_get_uint32_be (data, &version)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", version); value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); if (qt_atom_parser_get_offset (data, value_size, &ctime) && qt_atom_parser_get_offset (data, value_size, &mtime) && gst_byte_reader_get_uint32_be (data, &time_scale) && qt_atom_parser_get_offset (data, value_size, &duration) && gst_byte_reader_get_uint16_be (data, &language) && gst_byte_reader_get_uint16_be (data, &quality)) { GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, depth, "", ctime); GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, depth, "", mtime); GST_LOG ("%*s time scale: 1/%u sec", depth, "", time_scale); GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, depth, "", duration); GST_LOG ("%*s language: %u", depth, "", language); GST_LOG ("%*s quality: %u", depth, "", quality); return TRUE; } return FALSE; } gboolean qtdemux_dump_hdlr (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 version, type, subtype, manufacturer; const gchar *name; if (!qt_atom_parser_has_remaining (data, 4 + 4 + 4 + 4 + 4 + 4 + 1)) return FALSE; version = GET_UINT32 (data); type = GET_FOURCC (data); subtype = GET_FOURCC (data); manufacturer = GET_FOURCC (data); GST_LOG ("%*s version/flags: %08x", depth, "", version); GST_LOG ("%*s type: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (type)); GST_LOG ("%*s subtype: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (subtype)); GST_LOG ("%*s manufacturer: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (manufacturer)); GST_LOG ("%*s flags: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s flags mask: %08x", depth, "", GET_UINT32 (data)); /* quicktime uses pascal string, mp4 zero-terminated string */ if (gst_byte_reader_peek_string (data, &name)) { GST_LOG ("%*s name: %s", depth, "", name); } else { gchar buf[256]; guint len; len = gst_byte_reader_get_uint8_unchecked (data); if (qt_atom_parser_has_remaining (data, len)) { memcpy (buf, gst_byte_reader_peek_data_unchecked (data), len); buf[len] = '\0'; GST_LOG ("%*s name: %s", depth, "", buf); } } return TRUE; } gboolean qtdemux_dump_vmhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { if (!qt_atom_parser_has_remaining (data, 4 + 4)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s mode/color: %08x", depth, "", GET_UINT32 (data)); return TRUE; } gboolean qtdemux_dump_dref (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %u", depth, "", num_entries); for (i = 0; i < num_entries; i++) { guint32 size = 0, fourcc; if (!gst_byte_reader_get_uint32_be (data, &size) || !qt_atom_parser_get_fourcc (data, &fourcc) || size < 8 || !gst_byte_reader_skip (data, size - 8)) return FALSE; GST_LOG ("%*s size: %u", depth, "", size); GST_LOG ("%*s type: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (fourcc)); } return TRUE; } gboolean qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); for (i = 0; i < num_entries; i++) { GstByteReader sub; guint32 size = 0, fourcc; if (!gst_byte_reader_get_uint32_be (data, &size) || !qt_atom_parser_get_fourcc (data, &fourcc)) return FALSE; GST_LOG ("%*s size: %u", depth, "", size); GST_LOG ("%*s type: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (fourcc)); if (size < (6 + 2 + 4 + 4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 2 + 1 + 31 + 2 + 2)) return FALSE; qt_atom_parser_peek_sub (data, 0, 78, &sub); gst_byte_reader_skip (&sub, 6); GST_LOG ("%*s data reference:%d", depth, "", GET_UINT16 (&sub)); GST_LOG ("%*s version/rev.: %08x", depth, "", GET_UINT32 (&sub)); fourcc = GET_FOURCC (&sub); GST_LOG ("%*s vendor: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (fourcc)); GST_LOG ("%*s temporal qual: %u", depth, "", GET_UINT32 (&sub)); GST_LOG ("%*s spatial qual: %u", depth, "", GET_UINT32 (&sub)); GST_LOG ("%*s width: %u", depth, "", GET_UINT16 (&sub)); GST_LOG ("%*s height: %u", depth, "", GET_UINT16 (&sub)); GST_LOG ("%*s horiz. resol: %g", depth, "", GET_FP32 (&sub)); GST_LOG ("%*s vert. resol.: %g", depth, "", GET_FP32 (&sub)); GST_LOG ("%*s data size: %u", depth, "", GET_UINT32 (&sub)); GST_LOG ("%*s frame count: %u", depth, "", GET_UINT16 (&sub)); /* something is not right with this, it's supposed to be a string but it's * not apparently, so just skip this for now */ gst_byte_reader_skip (&sub, 1 + 31); GST_LOG ("%*s compressor: (skipped)", depth, ""); GST_LOG ("%*s depth: %u", depth, "", GET_UINT16 (&sub)); GST_LOG ("%*s color table ID:%u", depth, "", GET_UINT16 (&sub)); if (!gst_byte_reader_skip (data, size - (4 + 4))) return FALSE; } return TRUE; } gboolean qtdemux_dump_stts (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s count: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s duration: %u", depth, "", GET_UINT32 (data)); } return TRUE; } gboolean qtdemux_dump_stps (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s sample: %u", depth, "", GET_UINT32 (data)); } return TRUE; } gboolean qtdemux_dump_stss (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s sample: %u", depth, "", GET_UINT32 (data)); } return TRUE; } gboolean qtdemux_dump_stsc (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4 + 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s first chunk: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s sample per ch: %u", depth, "", GET_UINT32 (data)); GST_LOG ("%*s sample desc id:%08x", depth, "", GET_UINT32 (data)); } return TRUE; } gboolean qtdemux_dump_stsz (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, sample_size = 0, num_entries = 0; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &sample_size)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s sample size: %d", depth, "", sample_size); if (sample_size == 0) { if (!gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s n entries: %d", depth, "", num_entries); #if 0 if (!qt_atom_parser_has_chunks (data, num_entries, 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s sample size: %u", depth, "", GET_UINT32 (data)); } #endif } return TRUE; } gboolean qtdemux_dump_stco (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s chunk offset: %u", depth, "", GET_UINT32 (data)); } return TRUE; } gboolean qtdemux_dump_ctts (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i, count, offset; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 4 + 4)) return FALSE; for (i = 0; i < num_entries; i++) { count = GET_UINT32 (data); offset = GET_UINT32 (data); GST_LOG ("%*s sample count :%8d offset: %8d", depth, "", count, offset); } return TRUE; } gboolean qtdemux_dump_co64 (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 ver_flags = 0, num_entries = 0, i; if (!gst_byte_reader_get_uint32_be (data, &ver_flags) || !gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); GST_LOG ("%*s n entries: %d", depth, "", num_entries); if (!qt_atom_parser_has_chunks (data, num_entries, 8)) return FALSE; for (i = 0; i < num_entries; i++) { GST_LOG ("%*s chunk offset: %" G_GUINT64_FORMAT, depth, "", GET_UINT64 (data)); } return TRUE; } gboolean qtdemux_dump_dcom (GstQTDemux * qtdemux, GstByteReader * data, int depth) { if (!qt_atom_parser_has_remaining (data, 4)) return FALSE; GST_LOG ("%*s compression type: %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (GET_FOURCC (data))); return TRUE; } gboolean qtdemux_dump_cmvd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { if (!qt_atom_parser_has_remaining (data, 4)) return FALSE; GST_LOG ("%*s length: %d", depth, "", GET_UINT32 (data)); return TRUE; } gboolean qtdemux_dump_mfro (GstQTDemux * qtdemux, GstByteReader * data, int depth) { if (!qt_atom_parser_has_remaining (data, 4)) return FALSE; GST_LOG ("%*s size: %d", depth, "", GET_UINT32 (data)); return TRUE; } gboolean qtdemux_dump_tfra (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint64 time = 0, moof_offset = 0; guint32 len = 0, num_entries = 0, ver_flags = 0, track_id = 0, i; guint value_size, traf_size, trun_size, sample_size; if (!gst_byte_reader_get_uint32_be (data, &ver_flags)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", ver_flags); if (!gst_byte_reader_get_uint32_be (data, &track_id) || gst_byte_reader_get_uint32_be (data, &len) || gst_byte_reader_get_uint32_be (data, &num_entries)) return FALSE; GST_LOG ("%*s track ID: %u", depth, "", track_id); GST_LOG ("%*s length: 0x%x", depth, "", len); GST_LOG ("%*s n entries: %u", depth, "", num_entries); value_size = ((ver_flags >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); sample_size = (len & 3) + 1; trun_size = ((len & 12) >> 2) + 1; traf_size = ((len & 48) >> 4) + 1; if (!qt_atom_parser_has_chunks (data, num_entries, value_size + value_size + traf_size + trun_size + sample_size)) return FALSE; for (i = 0; i < num_entries; i++) { qt_atom_parser_get_offset (data, value_size, &time); qt_atom_parser_get_offset (data, value_size, &moof_offset); GST_LOG ("%*s time: %" G_GUINT64_FORMAT, depth, "", time); GST_LOG ("%*s moof_offset: %" G_GUINT64_FORMAT, depth, "", moof_offset); GST_LOG ("%*s traf_number: %u", depth, "", qt_atom_parser_get_uint_with_size_unchecked (data, traf_size)); GST_LOG ("%*s trun_number: %u", depth, "", qt_atom_parser_get_uint_with_size_unchecked (data, trun_size)); GST_LOG ("%*s sample_number: %u", depth, "", qt_atom_parser_get_uint_with_size_unchecked (data, sample_size)); } return TRUE; } gboolean qtdemux_dump_tfhd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 flags = 0, n = 0, track_id = 0; guint64 base_data_offset = 0; if (!gst_byte_reader_skip (data, 1) || !gst_byte_reader_get_uint24_be (data, &flags)) return FALSE; GST_LOG ("%*s flags: %08x", depth, "", flags); if (!gst_byte_reader_get_uint32_be (data, &track_id)) return FALSE; GST_LOG ("%*s track_id: %u", depth, "", track_id); if (flags & TF_BASE_DATA_OFFSET) { if (!gst_byte_reader_get_uint64_be (data, &base_data_offset)) return FALSE; GST_LOG ("%*s base-data-offset: %" G_GUINT64_FORMAT, depth, "", base_data_offset); } if (flags & TF_SAMPLE_DESCRIPTION_INDEX) { if (!gst_byte_reader_get_uint32_be (data, &n)) return FALSE; GST_LOG ("%*s sample-description-index: %u", depth, "", n); } if (flags & TF_DEFAULT_SAMPLE_DURATION) { if (!gst_byte_reader_get_uint32_be (data, &n)) return FALSE; GST_LOG ("%*s default-sample-duration: %u", depth, "", n); } if (flags & TF_DEFAULT_SAMPLE_SIZE) { if (!gst_byte_reader_get_uint32_be (data, &n)) return FALSE; GST_LOG ("%*s default-sample-size: %u", depth, "", n); } if (flags & TF_DEFAULT_SAMPLE_FLAGS) { if (!gst_byte_reader_get_uint32_be (data, &n)) return FALSE; GST_LOG ("%*s default-sample-flags: %u", depth, "", n); } GST_LOG ("%*s duration-is-empty: %s", depth, "", flags & TF_DURATION_IS_EMPTY ? "yes" : "no"); return TRUE; } gboolean qtdemux_dump_trun (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 flags = 0, samples_count = 0, data_offset = 0, first_sample_flags = 0; guint32 sample_duration = 0, sample_size = 0, sample_flags = 0, composition_time_offsets = 0; int i = 0; if (!gst_byte_reader_skip (data, 1) || !gst_byte_reader_get_uint24_be (data, &flags)) return FALSE; GST_LOG ("%*s flags: %08x", depth, "", flags); if (!gst_byte_reader_get_uint32_be (data, &samples_count)) return FALSE; GST_LOG ("%*s samples_count: %u", depth, "", samples_count); if (flags & TR_DATA_OFFSET) { if (!gst_byte_reader_get_uint32_be (data, &data_offset)) return FALSE; GST_LOG ("%*s data-offset: %u", depth, "", data_offset); } if (flags & TR_FIRST_SAMPLE_FLAGS) { if (!gst_byte_reader_get_uint32_be (data, &first_sample_flags)) return FALSE; GST_LOG ("%*s first-sample-flags: %u", depth, "", first_sample_flags); } for (i = 0; i < samples_count; i++) { if (flags & TR_SAMPLE_DURATION) { if (!gst_byte_reader_get_uint32_be (data, &sample_duration)) return FALSE; GST_LOG ("%*s sample-duration: %u", depth, "", sample_duration); } if (flags & TR_SAMPLE_SIZE) { if (!gst_byte_reader_get_uint32_be (data, &sample_size)) return FALSE; GST_LOG ("%*s sample-size: %u", depth, "", sample_size); } if (flags & TR_SAMPLE_FLAGS) { if (!gst_byte_reader_get_uint32_be (data, &sample_flags)) return FALSE; GST_LOG ("%*s sample-flags: %u", depth, "", sample_flags); } if (flags & TR_COMPOSITION_TIME_OFFSETS) { if (!gst_byte_reader_get_uint32_be (data, &composition_time_offsets)) return FALSE; GST_LOG ("%*s composition_time_offsets: %u", depth, "", composition_time_offsets); } } return TRUE; } gboolean qtdemux_dump_trex (GstQTDemux * qtdemux, GstByteReader * data, int depth) { if (!qt_atom_parser_has_remaining (data, 4 + 4 + 4 + 4 + 4 + 4)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s track ID: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s default sample desc. index: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s default sample duration: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s default sample size: %08x", depth, "", GET_UINT32 (data)); GST_LOG ("%*s default sample flags: %08x", depth, "", GET_UINT32 (data)); return TRUE; } gboolean qtdemux_dump_mehd (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 version = 0; guint64 fragment_duration; guint value_size; if (!gst_byte_reader_get_uint32_be (data, &version)) return FALSE; GST_LOG ("%*s version/flags: %08x", depth, "", version); value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32); if (qt_atom_parser_get_offset (data, value_size, &fragment_duration)) { GST_LOG ("%*s fragment duration: %" G_GUINT64_FORMAT, depth, "", fragment_duration); return TRUE; } return FALSE; } gboolean qtdemux_dump_sdtp (GstQTDemux * qtdemux, GstByteReader * data, int depth) { guint32 version; guint8 val; guint i = 1; version = GET_UINT32 (data); GST_LOG ("%*s version/flags: %08x", depth, "", version); /* the sample_count is specified in the stsz or stz2 box. * the information for a sample is stored in a single byte, * so we read until there are no remaining bytes */ while (qt_atom_parser_has_remaining (data, 1)) { val = GET_UINT8 (data); GST_LOG ("%*s sample number: %d", depth, "", i); GST_LOG ("%*s sample_depends_on: %d", depth, "", ((guint16) (val)) & 0x3); GST_LOG ("%*s sample_is_depended_on: %d", depth, "", ((guint16) (val >> 2)) & 0x3); GST_LOG ("%*s sample_has_redundancy: %d", depth, "", ((guint16) (val >> 4)) & 0x3); ++i; } return TRUE; } gboolean qtdemux_dump_unknown (GstQTDemux * qtdemux, GstByteReader * data, int depth) { int len; len = gst_byte_reader_get_remaining (data); GST_LOG ("%*s length: %d", depth, "", len); GST_MEMDUMP_OBJECT (qtdemux, "unknown atom data", gst_byte_reader_peek_data_unchecked (data), len); return TRUE; } static gboolean qtdemux_node_dump_foreach (GNode * node, gpointer qtdemux) { GstByteReader parser; guint8 *buffer = (guint8 *) node->data; /* FIXME: move to byte reader */ guint32 node_length; guint32 fourcc; const QtNodeType *type; int depth; node_length = GST_READ_UINT32_BE (buffer); fourcc = GST_READ_UINT32_LE (buffer + 4); g_warn_if_fail (node_length >= 8); gst_byte_reader_init (&parser, buffer + 8, node_length - 8); type = qtdemux_type_get (fourcc); depth = (g_node_depth (node) - 1) * 2; GST_LOG ("%*s'%" GST_FOURCC_FORMAT "', [%d], %s", depth, "", GST_FOURCC_ARGS (fourcc), node_length, type->name); if (type->dump) { gboolean ret; ret = type->dump (GST_QTDEMUX_CAST (qtdemux), &parser, depth); if (!ret) { GST_WARNING ("%*s not enough data parsing atom %" GST_FOURCC_FORMAT, depth, "", GST_FOURCC_ARGS (fourcc)); } } return FALSE; } gboolean qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node) { if (__gst_debug_min < GST_LEVEL_LOG) return TRUE; g_node_traverse (node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, qtdemux_node_dump_foreach, qtdemux); return TRUE; } gst-plugins-good-0.10.31/gst/isomp4/qtdemux_types.h0000644000175000017500000000556111671175353017113 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> STEricsson * * 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_QTDEMUX_TYPES_H__ #define __GST_QTDEMUX_TYPES_H__ #include #include #include "qtdemux.h" G_BEGIN_DECLS typedef gboolean (*QtDumpFunc) (GstQTDemux * qtdemux, GstByteReader * data, int depth); typedef struct _QtNodeType QtNodeType; #define QT_UINT32(a) (GST_READ_UINT32_BE(a)) #define QT_UINT24(a) (GST_READ_UINT32_BE(a) >> 8) #define QT_UINT16(a) (GST_READ_UINT16_BE(a)) #define QT_UINT8(a) (GST_READ_UINT8(a)) #define QT_FP32(a) ((GST_READ_UINT32_BE(a))/65536.0) #define QT_SFP32(a) (((gint)(GST_READ_UINT32_BE(a)))/65536.0) #define QT_FP16(a) ((GST_READ_UINT16_BE(a))/256.0) #define QT_FOURCC(a) (GST_READ_UINT32_LE(a)) #define QT_UINT64(a) ((((guint64)QT_UINT32(a))<<32)|QT_UINT32(((guint8 *)a)+4)) typedef enum { QT_FLAG_NONE = (0), QT_FLAG_CONTAINER = (1 << 0) } QtFlags; struct _QtNodeType { guint32 fourcc; const gchar *name; QtFlags flags; QtDumpFunc dump; }; enum TfFlags { TF_BASE_DATA_OFFSET = 0x000001, /* base-data-offset-present */ TF_SAMPLE_DESCRIPTION_INDEX = 0x000002, /* sample-description-index-present */ TF_DEFAULT_SAMPLE_DURATION = 0x000008, /* default-sample-duration-present */ TF_DEFAULT_SAMPLE_SIZE = 0x000010, /* default-sample-size-present */ TF_DEFAULT_SAMPLE_FLAGS = 0x000020, /* default-sample-flags-present */ TF_DURATION_IS_EMPTY = 0x100000 /* duration-is-empty */ }; enum TrFlags { TR_DATA_OFFSET = 0x000001, /* data-offset-present */ TR_FIRST_SAMPLE_FLAGS = 0x000004, /* first-sample-flags-present */ TR_SAMPLE_DURATION = 0x000100, /* sample-duration-present */ TR_SAMPLE_SIZE = 0x000200, /* sample-size-present */ TR_SAMPLE_FLAGS = 0x000400, /* sample-flags-present */ TR_COMPOSITION_TIME_OFFSETS = 0x000800 /* sample-composition-time-offsets-presents */ }; const QtNodeType *qtdemux_type_get (guint32 fourcc); G_END_DECLS #endif /* __GST_QTDEMUX_TYPES_H__ */ gst-plugins-good-0.10.31/gst/isomp4/isomp4-plugin.c0000644000175000017500000000450011671175353016672 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David A. Schleef * Copyright (C) <2006> Wim Taymans * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include "qtdemux.h" #include "gstrtpxqtdepay.h" #include "gstqtmux.h" #include "gstqtmoovrecover.h" #include static gboolean plugin_init (GstPlugin * plugin) { #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ gst_pb_utils_init (); /* ensure private tag is registered */ gst_tag_register (GST_QT_DEMUX_PRIVATE_TAG, GST_TAG_FLAG_META, GST_TYPE_BUFFER, "QT atom", "unparsed QT tag atom", gst_tag_merge_use_first); gst_tag_register (GST_QT_DEMUX_CLASSIFICATION_TAG, GST_TAG_FLAG_META, G_TYPE_STRING, GST_QT_DEMUX_CLASSIFICATION_TAG, "content classification", gst_tag_merge_use_first); if (!gst_element_register (plugin, "qtdemux", GST_RANK_PRIMARY, GST_TYPE_QTDEMUX)) return FALSE; if (!gst_element_register (plugin, "rtpxqtdepay", GST_RANK_MARGINAL, GST_TYPE_RTP_XQT_DEPAY)) return FALSE; if (!gst_qt_mux_register (plugin)) return FALSE; if (!gst_qt_moov_recover_register (plugin)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "isomp4", "ISO base media file format support (mp4, 3gpp, qt, mj2)", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/isomp4/qtpalette.h0000644000175000017500000001551411671175353016202 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_QTPALLETE_H__ #define __GST_QTPALLETE_H__ #include G_BEGIN_DECLS static const guint32 ff_qt_default_palette_2[2] = { 0xffffff, 0x000000 }; static const guint32 ff_qt_default_palette_4[4] = { 0x93655e, 0xffffff, 0xdfd0ab, 0x000000 }; static const guint32 ff_qt_default_palette_16[16] = { 0xfffbff, 0xefd9bb, 0xe8c9b1, 0x93655e, 0xfcdee8, 0x9d8891, 0xffffff, 0xffffff, 0xffffff, 0x474837, 0x7a5e55, 0xdfd0ab, 0xfffbf9, 0xe8cac5, 0x8a7c77, 0x000000 }; static const guint32 ff_qt_default_palette_256[256] = { 0xFFFFFF, 0xFFFFCC, 0xFFFF99, 0xFFFF66, 0xFFFF33, 0xFFFF00, 0xFFCCFF, 0xFFCCCC, 0xFFCC99, 0xFFCC66, 0xFFCC33, 0xFFCC00, 0xFF99FF, 0xFF99CC, 0xFF9999, 0xFF9966, 0xFF9933, 0xFF9900, 0xFF66FF, 0xFF66CC, 0xFF6699, 0xFF6666, 0xFF6633, 0xFF6600, 0xFF33FF, 0xFF33CC, 0xFF3399, 0xFF3366, 0xFF3333, 0xFF3300, 0xFF00FF, 0xFF00CC, 0xFF0099, 0xFF0066, 0xFF0033, 0xFF0000, 0xCCFFFF, 0xCCFFCC, 0xCCFF99, 0xCCFF66, 0xCCFF33, 0xCCFF00, 0xCCCCFF, 0xCCCCCC, 0xCCCC99, 0xCCCC66, 0xCCCC33, 0xCCCC00, 0xCC99FF, 0xCC99CC, 0xCC9999, 0xCC9966, 0xCC9933, 0xCC9900, 0xCC66FF, 0xCC66CC, 0xCC6699, 0xCC6666, 0xCC6633, 0xCC6600, 0xCC33FF, 0xCC33CC, 0xCC3399, 0xCC3366, 0xCC3333, 0xCC3300, 0xCC00FF, 0xCC00CC, 0xCC0099, 0xCC0066, 0xCC0033, 0xCC0000, 0x99FFFF, 0x99FFCC, 0x99FF99, 0x99FF66, 0x99FF33, 0x99FF00, 0x99CCFF, 0x99CCCC, 0x99CC99, 0x99CC66, 0x99CC33, 0x99CC00, 0x9999FF, 0x9999CC, 0x999999, 0x999966, 0x999933, 0x999900, 0x9966FF, 0x9966CC, 0x996699, 0x996666, 0x996633, 0x996600, 0x9933FF, 0x9933CC, 0x993399, 0x993366, 0x993333, 0x993300, 0x9900FF, 0x9900CC, 0x990099, 0x990066, 0x990033, 0x990000, 0x66FFFF, 0x66FFCC, 0x66FF99, 0x66FF66, 0x66FF33, 0x66FF00, 0x66CCFF, 0x66CCCC, 0x66CC99, 0x66CC66, 0x66CC33, 0x66CC00, 0x6699FF, 0x6699CC, 0x669999, 0x669966, 0x669933, 0x669900, 0x6666FF, 0x6666CC, 0x666699, 0x666666, 0x666633, 0x666600, 0x6633FF, 0x6633CC, 0x663399, 0x663366, 0x663333, 0x663300, 0x6600FF, 0x6600CC, 0x660099, 0x660066, 0x660033, 0x660000, 0x33FFFF, 0x33FFCC, 0x33FF99, 0x33FF66, 0x33FF33, 0x33FF00, 0x33CCFF, 0x33CCCC, 0x33CC99, 0x33CC66, 0x33CC33, 0x33CC00, 0x3399FF, 0x3399CC, 0x339999, 0x339966, 0x339933, 0x339900, 0x3366FF, 0x3366CC, 0x336699, 0x336666, 0x336633, 0x336600, 0x3333FF, 0x3333CC, 0x333399, 0x333366, 0x333333, 0x333300, 0x3300FF, 0x3300CC, 0x330099, 0x330066, 0x330033, 0x330000, 0x00FFFF, 0x00FFCC, 0x00FF99, 0x00FF66, 0x00FF33, 0x00FF00, 0x00CCFF, 0x00CCCC, 0x00CC99, 0x00CC66, 0x00CC33, 0x00CC00, 0x0099FF, 0x0099CC, 0x009999, 0x009966, 0x009933, 0x009900, 0x0066FF, 0x0066CC, 0x006699, 0x006666, 0x006633, 0x006600, 0x0033FF, 0x0033CC, 0x003399, 0x003366, 0x003333, 0x003300, 0x0000FF, 0x0000CC, 0x000099, 0x000066, 0x000033, 0xEE0000, 0xDD0000, 0xBB0000, 0xAA0000, 0x880000, 0x770000, 0x550000, 0x440000, 0x220000, 0x110000, 0x00EE00, 0x00DD00, 0x00BB00, 0x00AA00, 0x008800, 0x007700, 0x005500, 0x004400, 0x002200, 0x001100, 0x0000EE, 0x0000DD, 0x0000BB, 0x0000AA, 0x000088, 0x000077, 0x000055, 0x000044, 0x000022, 0x000011, 0xEEEEEE, 0xDDDDDD, 0xBBBBBB, 0xAAAAAA, 0x888888, 0x777777, 0x555555, 0x444444, 0x222222, 0x111111, 0x000000 }; static const guint32 ff_qt_grayscale_palette_16[16] = { 0xffffff, 0xeeeeee, 0xdddddd, 0xcccccc, 0xbbbbbb, 0xaaaaaa, 0x999999, 0x888888, 0x777777, 0x666666, 0x555555, 0x444444, 0x333333, 0x222222, 0x111111, 0x000000 }; static const guint32 ff_qt_grayscale_palette_256[256] = { 0xffffff, 0xfefefe, 0xfdfdfd, 0xfcfcfc, 0xfbfbfb, 0xfafafa, 0xf9f9f9, 0xf8f8f8, 0xf7f7f7, 0xf6f6f6, 0xf5f5f5, 0xf4f4f4, 0xf3f3f3, 0xf2f2f2, 0xf1f1f1, 0xf0f0f0, 0xefefef, 0xeeeeee, 0xededed, 0xececec, 0xebebeb, 0xeaeaea, 0xe9e9e9, 0xe8e8e8, 0xe7e7e7, 0xe6e6e6, 0xe5e5e5, 0xe4e4e4, 0xe3e3e3, 0xe2e2e2, 0xe1e1e1, 0xe0e0e0, 0xdfdfdf, 0xdedede, 0xdddddd, 0xdcdcdc, 0xdbdbdb, 0xdadada, 0xd9d9d9, 0xd8d8d8, 0xd7d7d7, 0xd6d6d6, 0xd5d5d5, 0xd4d4d4, 0xd3d3d3, 0xd2d2d2, 0xd1d1d1, 0xd0d0d0, 0xcfcfcf, 0xcecece, 0xcdcdcd, 0xcccccc, 0xcbcbcb, 0xcacaca, 0xc9c9c9, 0xc8c8c8, 0xc7c7c7, 0xc6c6c6, 0xc5c5c5, 0xc4c4c4, 0xc3c3c3, 0xc2c2c2, 0xc1c1c1, 0xc0c0c0, 0xbfbfbf, 0xbebebe, 0xbdbdbd, 0xbcbcbc, 0xbbbbbb, 0xbababa, 0xb9b9b9, 0xb8b8b8, 0xb7b7b7, 0xb6b6b6, 0xb5b5b5, 0xb4b4b4, 0xb3b3b3, 0xb2b2b2, 0xb1b1b1, 0xb0b0b0, 0xafafaf, 0xaeaeae, 0xadadad, 0xacacac, 0xababab, 0xaaaaaa, 0xa9a9a9, 0xa8a8a8, 0xa7a7a7, 0xa6a6a6, 0xa5a5a5, 0xa4a4a4, 0xa3a3a3, 0xa2a2a2, 0xa1a1a1, 0xa0a0a0, 0x9f9f9f, 0x9e9e9e, 0x9d9d9d, 0x9c9c9c, 0x9b9b9b, 0x9a9a9a, 0x999999, 0x989898, 0x979797, 0x969696, 0x959595, 0x949494, 0x939393, 0x929292, 0x919191, 0x909090, 0x8f8f8f, 0x8e8e8e, 0x8d8d8d, 0x8c8c8c, 0x8b8b8b, 0x8a8a8a, 0x898989, 0x888888, 0x878787, 0x868686, 0x858585, 0x848484, 0x838383, 0x828282, 0x818181, 0x808080, 0x7f7f7f, 0x7e7e7e, 0x7d7d7d, 0x7c7c7c, 0x7b7b7b, 0x7a7a7a, 0x797979, 0x787878, 0x777777, 0x767676, 0x757575, 0x747474, 0x737373, 0x727272, 0x717171, 0x707070, 0x6f6f6f, 0x6e6e6e, 0x6d6d6d, 0x6c6c6c, 0x6b6b6b, 0x6a6a6a, 0x696969, 0x686868, 0x676767, 0x666666, 0x656565, 0x646464, 0x636363, 0x626262, 0x616161, 0x606060, 0x5f5f5f, 0x5e5e5e, 0x5d5d5d, 0x5c5c5c, 0x5b5b5b, 0x5a5a5a, 0x595959, 0x585858, 0x575757, 0x565656, 0x555555, 0x545454, 0x535353, 0x525252, 0x515151, 0x505050, 0x4f4f4f, 0x4e4e4e, 0x4d4d4d, 0x4c4c4c, 0x4b4b4b, 0x4a4a4a, 0x494949, 0x484848, 0x474747, 0x464646, 0x454545, 0x444444, 0x434343, 0x424242, 0x414141, 0x404040, 0x3f3f3f, 0x3e3e3e, 0x3d3d3d, 0x3c3c3c, 0x3b3b3b, 0x3a3a3a, 0x393939, 0x383838, 0x373737, 0x363636, 0x353535, 0x343434, 0x333333, 0x323232, 0x313131, 0x303030, 0x2f2f2f, 0x2e2e2e, 0x2d2d2d, 0x2c2c2c, 0x2b2b2b, 0x2a2a2a, 0x292929, 0x282828, 0x272727, 0x262626, 0x252525, 0x242424, 0x232323, 0x222222, 0x212121, 0x202020, 0x1f1f1f, 0x1e1e1e, 0x1d1d1d, 0x1c1c1c, 0x1b1b1b, 0x1a1a1a, 0x191919, 0x181818, 0x171717, 0x161616, 0x151515, 0x141414, 0x131313, 0x121212, 0x111111, 0x101010, 0x0f0f0f, 0x0e0e0e, 0x0d0d0d, 0x0c0c0c, 0x0b0b0b, 0x0a0a0a, 0x090909, 0x080808, 0x070707, 0x060606, 0x050505, 0x040404, 0x030303, 0x020202, 0x010101, 0x000000 }; G_END_DECLS #endif /* __GST_QTPALETTE_H__ */ gst-plugins-good-0.10.31/gst/isomp4/Makefile.am0000644000175000017500000000315111671175353016054 00000000000000 plugin_LTLIBRARIES = libgstisomp4.la libgstisomp4_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstisomp4_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) libgstisomp4_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} libgstisomp4_la_SOURCES = isomp4-plugin.c gstrtpxqtdepay.c \ qtdemux.c qtdemux_types.c qtdemux_dump.c qtdemux_lang.c \ gstqtmux.c gstqtmoovrecover.c atoms.c atomsrecovery.c descriptors.c \ properties.c gstqtmuxmap.c libgstisomp4_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ qtatomparser.h \ qtdemux.h \ qtdemux_types.h \ qtdemux_dump.h \ qtdemux_fourcc.h \ qtdemux_lang.h \ qtpalette.h \ gstrtpxqtdepay.h \ gstqtmux.h \ gstqtmoovrecover.h \ atoms.h \ atomsrecovery.h \ descriptors.h \ properties.h \ fourcc.h \ ftypcc.h \ gstqtmuxmap.h EXTRA_DIST = \ gstqtmux-doc.c \ gstqtmux-doc.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstisomp4 -:SHARED libgstisomp4 \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstisomp4_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) \ -:LDFLAGS $(libgstisomp4_la_LDFLAGS) \ $(libgstisomp4_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/isomp4/properties.c0000644000175000017500000001544211671175353016366 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008 Thiago Sousa Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #include "properties.h" /* if needed, re-allocate buffer to ensure size bytes can be written into it * at offset */ void prop_copy_ensure_buffer (guint8 ** buffer, guint64 * bsize, guint64 * offset, guint64 size) { if (buffer && *bsize - *offset < size) { *bsize += size + 10 * 1024; *buffer = g_realloc (*buffer, *bsize); } } static guint64 copy_func (void *prop, guint size, guint8 ** buffer, guint64 * bsize, guint64 * offset) { if (buffer) { prop_copy_ensure_buffer (buffer, bsize, offset, size); memcpy (*buffer + *offset, prop, size); } *offset += size; return size; } #define INT_ARRAY_COPY_FUNC_FAST(name, datatype) \ guint64 prop_copy_ ## name ## _array (datatype *prop, guint size, \ guint8 ** buffer, guint64 * bsize, guint64 * offset) { \ return copy_func (prop, sizeof (datatype) * size, buffer, bsize, offset);\ } #define INT_ARRAY_COPY_FUNC(name, datatype) \ guint64 prop_copy_ ## name ## _array (datatype *prop, guint size, \ guint8 ** buffer, guint64 * bsize, guint64 * offset) { \ guint i; \ \ for (i = 0; i < size; i++) { \ prop_copy_ ## name (prop[i], buffer, bsize, offset); \ } \ return sizeof (datatype) * size; \ } /* INTEGERS */ guint64 prop_copy_uint8 (guint8 prop, guint8 ** buffer, guint64 * size, guint64 * offset) { return copy_func (&prop, sizeof (guint8), buffer, size, offset); } guint64 prop_copy_uint16 (guint16 prop, guint8 ** buffer, guint64 * size, guint64 * offset) { prop = GUINT16_TO_BE (prop); return copy_func (&prop, sizeof (guint16), buffer, size, offset); } guint64 prop_copy_uint32 (guint32 prop, guint8 ** buffer, guint64 * size, guint64 * offset) { prop = GUINT32_TO_BE (prop); return copy_func (&prop, sizeof (guint32), buffer, size, offset); } guint64 prop_copy_uint64 (guint64 prop, guint8 ** buffer, guint64 * size, guint64 * offset) { prop = GUINT64_TO_BE (prop); return copy_func (&prop, sizeof (guint64), buffer, size, offset); } guint64 prop_copy_int32 (gint32 prop, guint8 ** buffer, guint64 * size, guint64 * offset) { prop = GINT32_TO_BE (prop); return copy_func (&prop, sizeof (guint32), buffer, size, offset); } /* uint8 can use direct copy in any case, and may be used for large quantity */ INT_ARRAY_COPY_FUNC_FAST (uint8, guint8); /* not used in large quantity anyway */ INT_ARRAY_COPY_FUNC (uint16, guint16); INT_ARRAY_COPY_FUNC (uint32, guint32); INT_ARRAY_COPY_FUNC (uint64, guint64); /* FOURCC */ guint64 prop_copy_fourcc (guint32 prop, guint8 ** buffer, guint64 * size, guint64 * offset) { prop = GINT32_TO_LE (prop); return copy_func (&prop, sizeof (guint32), buffer, size, offset); } INT_ARRAY_COPY_FUNC (fourcc, guint32); /** * prop_copy_fixed_size_string: * @string: the string to be copied * @str_size: size of the string * @buffer: the array to copy the string to * @offset: the position in the buffer array. * This value is updated to the point right after the copied string. * * Copies a string of bytes without placing its size at the beginning. * * Returns: the number of bytes copied */ guint64 prop_copy_fixed_size_string (guint8 * string, guint str_size, guint8 ** buffer, guint64 * size, guint64 * offset) { return copy_func (string, str_size * sizeof (guint8), buffer, size, offset); } /** * prop_copy_size_string: * * @string: the string to be copied * @str_size: size of the string * @buffer: the array to copy the string to * @offset: the position in the buffer array. * This value is updated to the point right after the copied string. * * Copies a string and its size to an array. Example: * string = 'abc\0' * result in the array: [3][a][b][c] (each [x] represents a position) * * Returns: the number of bytes copied */ guint64 prop_copy_size_string (guint8 * string, guint str_size, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; prop_copy_uint8 (str_size, buffer, size, offset); prop_copy_fixed_size_string (string, str_size, buffer, size, offset); return *offset - original_offset; } /** * prop_copy_null_terminated_string: * @string: the string to be copied * @buffer: the array to copy the string to * @offset: the position in the buffer array. * This value is updated to the point right after the copied string. * * Copies a string including its null terminating char to an array. * * Returns: the number of bytes copied */ guint64 prop_copy_null_terminated_string (gchar * string, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint len = strlen (string); prop_copy_fixed_size_string ((guint8 *) string, len, buffer, size, offset); prop_copy_uint8 ('\0', buffer, size, offset); return *offset - original_offset; } gst-plugins-good-0.10.31/gst/isomp4/gstqtmoovrecover.h0000644000175000017500000000651111671175353017625 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2010 Thiago Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_QT_MOOV_RECOVER_H__ #define __GST_QT_MOOV_RECOVER_H__ #include #include "atoms.h" #include "atomsrecovery.h" G_BEGIN_DECLS #define GST_TYPE_QT_MOOV_RECOVER (gst_qt_moov_recover_get_type()) #define GST_QT_MOOV_RECOVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QT_MOOV_RECOVER, GstQTMoovRecover)) #define GST_QT_MOOV_RECOVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QT_MOOV_RECOVER, GstQTMoovRecover)) #define GST_IS_QT_MOOV_RECOVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QT_MOOV_RECOVER)) #define GST_IS_QT_MOOV_RECOVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QT_MOOV_RECOVER)) #define GST_QT_MOOV_RECOVER_CAST(obj) ((GstQTMoovRecover*)(obj)) typedef struct _GstQTMoovRecover GstQTMoovRecover; typedef struct _GstQTMoovRecoverClass GstQTMoovRecoverClass; struct _GstQTMoovRecover { GstPipeline pipeline; GstTask *task; GStaticRecMutex task_mutex; /* properties */ gboolean faststart_mode; gchar *recovery_input; gchar *fixed_output; gchar *broken_input; }; struct _GstQTMoovRecoverClass { GstPipelineClass parent_class; }; GType gst_qt_moov_recover_get_type (void); gboolean gst_qt_moov_recover_register (GstPlugin * plugin); G_END_DECLS #endif /* __GST_QT_MOOV_RECOVER_H__ */ gst-plugins-good-0.10.31/gst/isomp4/atomsrecovery.c0000644000175000017500000007353211707323535017075 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2010 Thiago Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ /** * This module contains functions for serializing partial information from * a mux in progress (by qtmux elements). This enables reconstruction of the * moov box if a crash happens and thus recovering the movie file. * * Usage: * 1) pipeline: ...yourelements ! qtmux moov-recovery-file=path.mrf ! \ * filesink location=moovie.mov * * 2) CRASH! * * 3) gst-launch qtmoovrecover recovery-input=path.mrf broken-input=moovie.mov \ fixed-output=recovered.mov * * 4) (Hopefully) enjoy recovered.mov. * * --- Recovery file layout --- * 1) Version (a guint16) * 2) Prefix atom (if present) * 3) ftyp atom * 4) MVHD atom (without timescale/duration set) * 5) moovie timescale * 6) number of traks * 7) list of trak atoms (stbl data is ignored, except for the stsd atom) * 8) Buffers metadata (metadata that is relevant to the container) * Buffers metadata are stored in the order they are added to the mdat, * each entre has a fixed size and is stored in BE. booleans are stored * as a single byte where 0 means false, otherwise is true. * Metadata: * - guint32 track_id; * - guint32 nsamples; * - guint32 delta; * - guint32 size; * - guint64 chunk_offset; * - gboolean sync; * - gboolean do_pts; * - guint64 pts_offset; (always present, ignored if do_pts is false) * * The mdat file might contain ftyp and then mdat, in case this is the faststart * temporary file there is no ftyp and no mdat header, only the buffers data. * * Notes about recovery file layout: We still don't store tags nor EDTS data. * * IMPORTANT: this is still at a experimental state. */ #include "atomsrecovery.h" #define ATOMS_RECOV_OUTPUT_WRITE_ERROR(err) \ g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, \ "Failed to write to output file: %s", g_strerror (errno)) static gboolean atoms_recov_write_version (FILE * f) { guint8 data[2]; GST_WRITE_UINT16_BE (data, ATOMS_RECOV_FILE_VERSION); return fwrite (data, 2, 1, f) == 1; } static gboolean atoms_recov_write_ftyp_info (FILE * f, AtomFTYP * ftyp, GstBuffer * prefix) { guint8 *data = NULL; guint64 offset = 0; guint64 size = 0; if (prefix) { if (fwrite (GST_BUFFER_DATA (prefix), 1, GST_BUFFER_SIZE (prefix), f) != GST_BUFFER_SIZE (prefix)) { return FALSE; } } if (!atom_ftyp_copy_data (ftyp, &data, &size, &offset)) { return FALSE; } if (fwrite (data, 1, offset, f) != offset) { g_free (data); return FALSE; } g_free (data); return TRUE; } /** * Writes important info on the 'moov' atom (non-trak related) * to be able to recover the moov structure after a crash. * * Currently, it writes the MVHD atom. */ static gboolean atoms_recov_write_moov_info (FILE * f, AtomMOOV * moov) { guint8 *data; guint64 size; guint64 offset = 0; guint64 atom_size = 0; gint writen = 0; /* likely enough */ size = 256; data = g_malloc (size); atom_size = atom_mvhd_copy_data (&moov->mvhd, &data, &size, &offset); if (atom_size > 0) writen = fwrite (data, 1, atom_size, f); g_free (data); return atom_size > 0 && writen == atom_size; } /** * Writes the number of traks to the file. * This simply writes a guint32 in BE. */ static gboolean atoms_recov_write_traks_number (FILE * f, guint32 traks) { guint8 data[4]; GST_WRITE_UINT32_BE (data, traks); return fwrite (data, 4, 1, f) == 1; } /** * Writes the moov's timescale to the file * This simply writes a guint32 in BE. */ static gboolean atoms_recov_write_moov_timescale (FILE * f, guint32 timescale) { guint8 data[4]; GST_WRITE_UINT32_BE (data, timescale); return fwrite (data, 4, 1, f) == 1; } /** * Writes the trak atom to the file. */ gboolean atoms_recov_write_trak_info (FILE * f, AtomTRAK * trak) { guint8 *data; guint64 size; guint64 offset = 0; guint64 atom_size = 0; gint writen = 0; /* buffer is realloced to a larger size if needed */ size = 4 * 1024; data = g_malloc (size); atom_size = atom_trak_copy_data (trak, &data, &size, &offset); if (atom_size > 0) writen = fwrite (data, atom_size, 1, f); g_free (data); return atom_size > 0 && writen == atom_size; } gboolean atoms_recov_write_trak_samples (FILE * f, AtomTRAK * trak, guint32 nsamples, guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, gboolean do_pts, gint64 pts_offset) { guint8 data[TRAK_BUFFER_ENTRY_INFO_SIZE]; /* * We have to write a TrakBufferEntryInfo */ GST_WRITE_UINT32_BE (data + 0, trak->tkhd.track_ID); GST_WRITE_UINT32_BE (data + 4, nsamples); GST_WRITE_UINT32_BE (data + 8, delta); GST_WRITE_UINT32_BE (data + 12, size); GST_WRITE_UINT64_BE (data + 16, chunk_offset); if (sync) GST_WRITE_UINT8 (data + 24, 1); else GST_WRITE_UINT8 (data + 24, 0); if (do_pts) { GST_WRITE_UINT8 (data + 25, 1); GST_WRITE_UINT64_BE (data + 26, pts_offset); } else { GST_WRITE_UINT8 (data + 25, 0); GST_WRITE_UINT64_BE (data + 26, 0); } return fwrite (data, 1, TRAK_BUFFER_ENTRY_INFO_SIZE, f) == TRAK_BUFFER_ENTRY_INFO_SIZE; } gboolean atoms_recov_write_headers (FILE * f, AtomFTYP * ftyp, GstBuffer * prefix, AtomMOOV * moov, guint32 timescale, guint32 traks_number) { if (!atoms_recov_write_version (f)) { return FALSE; } if (!atoms_recov_write_ftyp_info (f, ftyp, prefix)) { return FALSE; } if (!atoms_recov_write_moov_info (f, moov)) { return FALSE; } if (!atoms_recov_write_moov_timescale (f, timescale)) { return FALSE; } if (!atoms_recov_write_traks_number (f, traks_number)) { return FALSE; } return TRUE; } static gboolean read_atom_header (FILE * f, guint32 * fourcc, guint32 * size) { guint8 aux[8]; if (fread (aux, 1, 8, f) != 8) return FALSE; *size = GST_READ_UINT32_BE (aux); *fourcc = GST_READ_UINT32_LE (aux + 4); return TRUE; } static gboolean moov_recov_file_parse_prefix (MoovRecovFile * moovrf) { guint32 fourcc; guint32 size; guint32 total_size = 0; if (fseek (moovrf->file, 2, SEEK_SET) != 0) return FALSE; if (!read_atom_header (moovrf->file, &fourcc, &size)) { return FALSE; } if (fourcc != FOURCC_ftyp) { /* we might have a prefix here */ if (fseek (moovrf->file, size - 8, SEEK_CUR) != 0) return FALSE; total_size += size; /* now read the ftyp */ if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; } /* this has to be the ftyp */ if (fourcc != FOURCC_ftyp) return FALSE; total_size += size; moovrf->prefix_size = total_size; return fseek (moovrf->file, size - 8, SEEK_CUR) == 0; } static gboolean moov_recov_file_parse_mvhd (MoovRecovFile * moovrf) { guint32 fourcc; guint32 size; if (!read_atom_header (moovrf->file, &fourcc, &size)) { return FALSE; } /* check for sanity */ if (fourcc != FOURCC_mvhd) return FALSE; moovrf->mvhd_size = size; moovrf->mvhd_pos = ftell (moovrf->file) - 8; /* skip the remaining of the mvhd in the file */ return fseek (moovrf->file, size - 8, SEEK_CUR) == 0; } static gboolean mdat_recov_file_parse_mdat_start (MdatRecovFile * mdatrf) { guint32 fourcc, size; if (!read_atom_header (mdatrf->file, &fourcc, &size)) { return FALSE; } if (size == 1) { mdatrf->mdat_header_size = 16; mdatrf->mdat_size = 16; } else { mdatrf->mdat_header_size = 8; mdatrf->mdat_size = 8; } mdatrf->mdat_start = ftell (mdatrf->file) - 8; return fourcc == FOURCC_mdat; } MdatRecovFile * mdat_recov_file_create (FILE * file, gboolean datafile, GError ** err) { MdatRecovFile *mrf = g_new0 (MdatRecovFile, 1); guint32 fourcc, size; g_return_val_if_fail (file != NULL, NULL); mrf->file = file; mrf->rawfile = datafile; /* get the file/data length */ if (fseek (file, 0, SEEK_END) != 0) goto file_length_error; /* still needs to deduce the mdat header and ftyp size */ mrf->data_size = ftell (file); if (mrf->data_size == -1L) goto file_length_error; if (fseek (file, 0, SEEK_SET) != 0) goto file_seek_error; if (datafile) { /* this file contains no atoms, only raw data to be placed on the mdat * this happens when faststart mode is used */ mrf->mdat_start = 0; mrf->mdat_header_size = 16; mrf->mdat_size = 16; return mrf; } if (!read_atom_header (file, &fourcc, &size)) { goto parse_error; } if (fourcc != FOURCC_ftyp) { /* this could be a prefix atom, let's skip it and try again */ if (fseek (file, size - 8, SEEK_CUR) != 0) { goto file_seek_error; } if (!read_atom_header (file, &fourcc, &size)) { goto parse_error; } } if (fourcc != FOURCC_ftyp) { goto parse_error; } if (fseek (file, size - 8, SEEK_CUR) != 0) goto file_seek_error; /* we don't parse this if we have a tmpdatafile */ if (!mdat_recov_file_parse_mdat_start (mrf)) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Error while parsing mdat atom"); goto fail; } return mrf; parse_error: g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to parse atom"); goto fail; file_seek_error: g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to seek to start of the file"); goto fail; file_length_error: g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to determine file size"); goto fail; fail: mdat_recov_file_free (mrf); return NULL; } void mdat_recov_file_free (MdatRecovFile * mrf) { fclose (mrf->file); g_free (mrf); } static gboolean moov_recov_parse_num_traks (MoovRecovFile * moovrf) { guint8 traks[4]; if (fread (traks, 1, 4, moovrf->file) != 4) return FALSE; moovrf->num_traks = GST_READ_UINT32_BE (traks); return TRUE; } static gboolean moov_recov_parse_moov_timescale (MoovRecovFile * moovrf) { guint8 ts[4]; if (fread (ts, 1, 4, moovrf->file) != 4) return FALSE; moovrf->timescale = GST_READ_UINT32_BE (ts); return TRUE; } static gboolean skip_atom (MoovRecovFile * moovrf, guint32 expected_fourcc) { guint32 size; guint32 fourcc; if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; if (fourcc != expected_fourcc) return FALSE; return (fseek (moovrf->file, size - 8, SEEK_CUR) == 0); } static gboolean moov_recov_parse_tkhd (MoovRecovFile * moovrf, TrakRecovData * trakrd) { guint32 size; guint32 fourcc; guint8 data[4]; /* make sure we are on a tkhd atom */ if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; if (fourcc != FOURCC_tkhd) return FALSE; trakrd->tkhd_file_offset = ftell (moovrf->file) - 8; /* move 8 bytes forward to the trak_id pos */ if (fseek (moovrf->file, 12, SEEK_CUR) != 0) return FALSE; if (fread (data, 1, 4, moovrf->file) != 4) return FALSE; /* advance the rest of tkhd */ fseek (moovrf->file, 68, SEEK_CUR); trakrd->trak_id = GST_READ_UINT32_BE (data); return TRUE; } static gboolean moov_recov_parse_stbl (MoovRecovFile * moovrf, TrakRecovData * trakrd) { guint32 size; guint32 fourcc; guint32 auxsize; if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; if (fourcc != FOURCC_stbl) return FALSE; trakrd->stbl_file_offset = ftell (moovrf->file) - 8; trakrd->stbl_size = size; /* skip the stsd */ if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) return FALSE; if (fourcc != FOURCC_stsd) return FALSE; if (fseek (moovrf->file, auxsize - 8, SEEK_CUR) != 0) return FALSE; trakrd->stsd_size = auxsize; trakrd->post_stsd_offset = ftell (moovrf->file); /* as this is the last atom we parse, we don't skip forward */ return TRUE; } static gboolean moov_recov_parse_minf (MoovRecovFile * moovrf, TrakRecovData * trakrd) { guint32 size; guint32 fourcc; guint32 auxsize; if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; if (fourcc != FOURCC_minf) return FALSE; trakrd->minf_file_offset = ftell (moovrf->file) - 8; trakrd->minf_size = size; /* skip either of vmhd, smhd, hmhd that might follow */ if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) return FALSE; if (fourcc != FOURCC_vmhd && fourcc != FOURCC_smhd && fourcc != FOURCC_hmhd && fourcc != FOURCC_gmhd) return FALSE; if (fseek (moovrf->file, auxsize - 8, SEEK_CUR)) return FALSE; /* skip a possible hdlr and the following dinf */ if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) return FALSE; if (fourcc == FOURCC_hdlr) { if (fseek (moovrf->file, auxsize - 8, SEEK_CUR)) return FALSE; if (!read_atom_header (moovrf->file, &fourcc, &auxsize)) return FALSE; } if (fourcc != FOURCC_dinf) return FALSE; if (fseek (moovrf->file, auxsize - 8, SEEK_CUR)) return FALSE; /* now we are ready to read the stbl */ if (!moov_recov_parse_stbl (moovrf, trakrd)) return FALSE; return TRUE; } static gboolean moov_recov_parse_mdhd (MoovRecovFile * moovrf, TrakRecovData * trakrd) { guint32 size; guint32 fourcc; guint8 data[4]; /* make sure we are on a tkhd atom */ if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; if (fourcc != FOURCC_mdhd) return FALSE; trakrd->mdhd_file_offset = ftell (moovrf->file) - 8; /* get the timescale */ if (fseek (moovrf->file, 12, SEEK_CUR) != 0) return FALSE; if (fread (data, 1, 4, moovrf->file) != 4) return FALSE; trakrd->timescale = GST_READ_UINT32_BE (data); if (fseek (moovrf->file, 8, SEEK_CUR) != 0) return FALSE; return TRUE; } static gboolean moov_recov_parse_mdia (MoovRecovFile * moovrf, TrakRecovData * trakrd) { guint32 size; guint32 fourcc; /* make sure we are on a tkhd atom */ if (!read_atom_header (moovrf->file, &fourcc, &size)) return FALSE; if (fourcc != FOURCC_mdia) return FALSE; trakrd->mdia_file_offset = ftell (moovrf->file) - 8; trakrd->mdia_size = size; if (!moov_recov_parse_mdhd (moovrf, trakrd)) return FALSE; if (!skip_atom (moovrf, FOURCC_hdlr)) return FALSE; if (!moov_recov_parse_minf (moovrf, trakrd)) return FALSE; return TRUE; } static gboolean moov_recov_parse_trak (MoovRecovFile * moovrf, TrakRecovData * trakrd) { guint64 offset; guint32 size; guint32 fourcc; offset = ftell (moovrf->file); if (offset == -1) { return FALSE; } /* make sure we are on a trak atom */ if (!read_atom_header (moovrf->file, &fourcc, &size)) { return FALSE; } if (fourcc != FOURCC_trak) { return FALSE; } trakrd->trak_size = size; /* now we should have a trak header 'tkhd' */ if (!moov_recov_parse_tkhd (moovrf, trakrd)) return FALSE; /* FIXME add edts handling here and in qtmux, as this is only detected * after buffers start flowing */ if (!moov_recov_parse_mdia (moovrf, trakrd)) return FALSE; trakrd->file_offset = offset; /* position after the trak */ return fseek (moovrf->file, (long int) offset + size, SEEK_SET) == 0; } MoovRecovFile * moov_recov_file_create (FILE * file, GError ** err) { gint i; MoovRecovFile *moovrf = g_new0 (MoovRecovFile, 1); g_return_val_if_fail (file != NULL, NULL); moovrf->file = file; /* look for ftyp and prefix at the start */ if (!moov_recov_file_parse_prefix (moovrf)) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Error while parsing prefix atoms"); goto fail; } /* parse the mvhd */ if (!moov_recov_file_parse_mvhd (moovrf)) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Error while parsing mvhd atom"); goto fail; } if (!moov_recov_parse_moov_timescale (moovrf)) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Error while parsing timescale"); goto fail; } if (!moov_recov_parse_num_traks (moovrf)) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Error while parsing parsing number of traks"); goto fail; } /* sanity check */ if (moovrf->num_traks > 1024) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Unsupported number of traks"); goto fail; } /* init the traks */ moovrf->traks_rd = g_new0 (TrakRecovData, moovrf->num_traks); for (i = 0; i < moovrf->num_traks; i++) { atom_stbl_init (&(moovrf->traks_rd[i].stbl)); } for (i = 0; i < moovrf->num_traks; i++) { if (!moov_recov_parse_trak (moovrf, &(moovrf->traks_rd[i]))) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Error while parsing trak atom"); goto fail; } } return moovrf; fail: moov_recov_file_free (moovrf); return NULL; } void moov_recov_file_free (MoovRecovFile * moovrf) { gint i; fclose (moovrf->file); if (moovrf->traks_rd) { for (i = 0; i < moovrf->num_traks; i++) { atom_stbl_clear (&(moovrf->traks_rd[i].stbl)); } g_free (moovrf->traks_rd); } g_free (moovrf); } static gboolean moov_recov_parse_buffer_entry (MoovRecovFile * moovrf, TrakBufferEntryInfo * b) { guint8 data[TRAK_BUFFER_ENTRY_INFO_SIZE]; gint read; read = fread (data, 1, TRAK_BUFFER_ENTRY_INFO_SIZE, moovrf->file); if (read != TRAK_BUFFER_ENTRY_INFO_SIZE) return FALSE; b->track_id = GST_READ_UINT32_BE (data); b->nsamples = GST_READ_UINT32_BE (data + 4); b->delta = GST_READ_UINT32_BE (data + 8); b->size = GST_READ_UINT32_BE (data + 12); b->chunk_offset = GST_READ_UINT64_BE (data + 16); b->sync = data[24] != 0; b->do_pts = data[25] != 0; b->pts_offset = GST_READ_UINT64_BE (data + 26); return TRUE; } static gboolean mdat_recov_add_sample (MdatRecovFile * mdatrf, guint32 size) { /* test if this data exists */ if (mdatrf->mdat_size - mdatrf->mdat_header_size + size > mdatrf->data_size) return FALSE; mdatrf->mdat_size += size; return TRUE; } static TrakRecovData * moov_recov_get_trak (MoovRecovFile * moovrf, guint32 id) { gint i; for (i = 0; i < moovrf->num_traks; i++) { if (moovrf->traks_rd[i].trak_id == id) return &(moovrf->traks_rd[i]); } return NULL; } static void trak_recov_data_add_sample (TrakRecovData * trak, TrakBufferEntryInfo * b) { trak->duration += b->nsamples * b->delta; atom_stbl_add_samples (&trak->stbl, b->nsamples, b->delta, b->size, b->chunk_offset, b->sync, b->pts_offset); } /** * Parses the buffer entries in the MoovRecovFile and matches the inputs * with the data in the MdatRecovFile. Whenever a buffer entry of that * represents 'x' bytes of data, the same amount of data is 'validated' in * the MdatRecovFile and will be inluded in the generated moovie file. */ gboolean moov_recov_parse_buffers (MoovRecovFile * moovrf, MdatRecovFile * mdatrf, GError ** err) { TrakBufferEntryInfo entry; TrakRecovData *trak; /* we assume both moovrf and mdatrf are at the starting points of their * data reading */ while (moov_recov_parse_buffer_entry (moovrf, &entry)) { /* be sure we still have this data in mdat */ trak = moov_recov_get_trak (moovrf, entry.track_id); if (trak == NULL) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_PARSING, "Invalid trak id found in buffer entry"); return FALSE; } if (!mdat_recov_add_sample (mdatrf, entry.size)) break; trak_recov_data_add_sample (trak, &entry); } return TRUE; } static guint32 trak_recov_data_get_trak_atom_size (TrakRecovData * trak) { AtomSTBL *stbl = &trak->stbl; guint64 offset; /* write out our stbl child atoms */ offset = 0; if (!atom_stts_copy_data (&stbl->stts, NULL, NULL, &offset)) { goto fail; } if (atom_array_get_len (&stbl->stss.entries) > 0) { if (!atom_stss_copy_data (&stbl->stss, NULL, NULL, &offset)) { goto fail; } } if (!atom_stsc_copy_data (&stbl->stsc, NULL, NULL, &offset)) { goto fail; } if (!atom_stsz_copy_data (&stbl->stsz, NULL, NULL, &offset)) { goto fail; } if (stbl->ctts) { if (!atom_ctts_copy_data (stbl->ctts, NULL, NULL, &offset)) { goto fail; } } if (!atom_stco64_copy_data (&stbl->stco64, NULL, NULL, &offset)) { goto fail; } return trak->trak_size + ((trak->stsd_size + offset + 8) - trak->stbl_size); fail: return 0; } static guint8 * moov_recov_get_stbl_children_data (MoovRecovFile * moovrf, TrakRecovData * trak, guint64 * p_size) { AtomSTBL *stbl = &trak->stbl; guint8 *buffer; guint64 size; guint64 offset; /* write out our stbl child atoms * * Use 1MB as a starting size, *_copy_data functions * will grow the buffer if needed. */ size = 1024 * 1024; buffer = g_malloc0 (size); offset = 0; if (!atom_stts_copy_data (&stbl->stts, &buffer, &size, &offset)) { goto fail; } if (atom_array_get_len (&stbl->stss.entries) > 0) { if (!atom_stss_copy_data (&stbl->stss, &buffer, &size, &offset)) { goto fail; } } if (!atom_stsc_copy_data (&stbl->stsc, &buffer, &size, &offset)) { goto fail; } if (!atom_stsz_copy_data (&stbl->stsz, &buffer, &size, &offset)) { goto fail; } if (stbl->ctts) { if (!atom_ctts_copy_data (stbl->ctts, &buffer, &size, &offset)) { goto fail; } } if (!atom_stco64_copy_data (&stbl->stco64, &buffer, &size, &offset)) { goto fail; } *p_size = offset; return buffer; fail: g_free (buffer); return NULL; } gboolean moov_recov_write_file (MoovRecovFile * moovrf, MdatRecovFile * mdatrf, FILE * outf, GError ** err) { guint8 auxdata[16]; guint8 *data = NULL; guint8 *prefix_data = NULL; guint8 *mvhd_data = NULL; guint8 *trak_data = NULL; guint32 moov_size = 0; gint i; guint64 stbl_children_size = 0; guint8 *stbl_children = NULL; guint32 longest_duration = 0; guint16 version; /* check the version */ if (fseek (moovrf->file, 0, SEEK_SET) != 0) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to seek to the start of the moov recovery file"); goto fail; } if (fread (auxdata, 1, 2, moovrf->file) != 2) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to read version from file"); } version = GST_READ_UINT16_BE (auxdata); if (version != ATOMS_RECOV_FILE_VERSION) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_VERSION, "Input file version (%u) is not supported in this version (%u)", version, ATOMS_RECOV_FILE_VERSION); return FALSE; } /* write the ftyp */ prefix_data = g_malloc (moovrf->prefix_size); if (fread (prefix_data, 1, moovrf->prefix_size, moovrf->file) != moovrf->prefix_size) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to read the ftyp atom from file"); goto fail; } if (fwrite (prefix_data, 1, moovrf->prefix_size, outf) != moovrf->prefix_size) { ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); goto fail; } g_free (prefix_data); prefix_data = NULL; /* need to calculate the moov size beforehand to add the offset to * chunk offset entries */ moov_size += moovrf->mvhd_size + 8; /* mvhd + moov size + fourcc */ for (i = 0; i < moovrf->num_traks; i++) { TrakRecovData *trak = &(moovrf->traks_rd[i]); guint32 duration; /* in moov's timescale */ guint32 trak_size; /* convert trak duration to moov's duration */ duration = gst_util_uint64_scale_round (trak->duration, moovrf->timescale, trak->timescale); if (duration > longest_duration) longest_duration = duration; trak_size = trak_recov_data_get_trak_atom_size (trak); if (trak_size == 0) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_GENERIC, "Failed to estimate trak atom size"); goto fail; } moov_size += trak_size; } /* add chunks offsets */ for (i = 0; i < moovrf->num_traks; i++) { TrakRecovData *trak = &(moovrf->traks_rd[i]); /* 16 for the mdat header */ gint64 offset = moov_size + ftell (outf) + 16; atom_stco64_chunks_add_offset (&trak->stbl.stco64, offset); } /* write the moov */ GST_WRITE_UINT32_BE (auxdata, moov_size); GST_WRITE_UINT32_LE (auxdata + 4, FOURCC_moov); if (fwrite (auxdata, 1, 8, outf) != 8) { ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); goto fail; } /* write the mvhd */ mvhd_data = g_malloc (moovrf->mvhd_size); if (fseek (moovrf->file, moovrf->mvhd_pos, SEEK_SET) != 0) goto fail; if (fread (mvhd_data, 1, moovrf->mvhd_size, moovrf->file) != moovrf->mvhd_size) goto fail; GST_WRITE_UINT32_BE (mvhd_data + 20, moovrf->timescale); GST_WRITE_UINT32_BE (mvhd_data + 24, longest_duration); if (fwrite (mvhd_data, 1, moovrf->mvhd_size, outf) != moovrf->mvhd_size) { ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); goto fail; } g_free (mvhd_data); mvhd_data = NULL; /* write the traks, this is the tough part because we need to update: * - stbl atom * - sizes of atoms from stbl to trak * - trak duration */ for (i = 0; i < moovrf->num_traks; i++) { TrakRecovData *trak = &(moovrf->traks_rd[i]); guint trak_data_size; guint32 stbl_new_size; guint32 minf_new_size; guint32 mdia_new_size; guint32 trak_new_size; guint32 size_diff; guint32 duration; /* in moov's timescale */ /* convert trak duration to moov's duration */ duration = gst_util_uint64_scale_round (trak->duration, moovrf->timescale, trak->timescale); stbl_children = moov_recov_get_stbl_children_data (moovrf, trak, &stbl_children_size); if (stbl_children == NULL) goto fail; /* calc the new size of the atoms from stbl to trak in the atoms tree */ stbl_new_size = trak->stsd_size + stbl_children_size + 8; size_diff = stbl_new_size - trak->stbl_size; minf_new_size = trak->minf_size + size_diff; mdia_new_size = trak->mdia_size + size_diff; trak_new_size = trak->trak_size + size_diff; if (fseek (moovrf->file, trak->file_offset, SEEK_SET) != 0) goto fail; trak_data_size = trak->post_stsd_offset - trak->file_offset; trak_data = g_malloc (trak_data_size); if (fread (trak_data, 1, trak_data_size, moovrf->file) != trak_data_size) { goto fail; } /* update the size values in those read atoms before writing */ GST_WRITE_UINT32_BE (trak_data, trak_new_size); GST_WRITE_UINT32_BE (trak_data + (trak->mdia_file_offset - trak->file_offset), mdia_new_size); GST_WRITE_UINT32_BE (trak_data + (trak->minf_file_offset - trak->file_offset), minf_new_size); GST_WRITE_UINT32_BE (trak_data + (trak->stbl_file_offset - trak->file_offset), stbl_new_size); /* update duration values in tkhd and mdhd */ GST_WRITE_UINT32_BE (trak_data + (trak->tkhd_file_offset - trak->file_offset) + 28, duration); GST_WRITE_UINT32_BE (trak_data + (trak->mdhd_file_offset - trak->file_offset) + 24, trak->duration); if (fwrite (trak_data, 1, trak_data_size, outf) != trak_data_size) { ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); goto fail; } if (fwrite (stbl_children, 1, stbl_children_size, outf) != stbl_children_size) { ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); goto fail; } g_free (trak_data); trak_data = NULL; g_free (stbl_children); stbl_children = NULL; } /* write the mdat */ /* write the header first */ GST_WRITE_UINT32_BE (auxdata, 1); GST_WRITE_UINT32_LE (auxdata + 4, FOURCC_mdat); GST_WRITE_UINT64_BE (auxdata + 8, mdatrf->mdat_size); if (fwrite (auxdata, 1, 16, outf) != 16) { ATOMS_RECOV_OUTPUT_WRITE_ERROR (err); goto fail; } /* now read the mdat data and output to the file */ if (fseek (mdatrf->file, mdatrf->mdat_start + (mdatrf->rawfile ? 0 : mdatrf->mdat_header_size), SEEK_SET) != 0) goto fail; data = g_malloc (4096); while (!feof (mdatrf->file)) { gint read, write; read = fread (data, 1, 4096, mdatrf->file); write = fwrite (data, 1, read, outf); if (write != read) { g_set_error (err, ATOMS_RECOV_QUARK, ATOMS_RECOV_ERR_FILE, "Failed to copy data to output file: %s", g_strerror (errno)); goto fail; } } g_free (data); return TRUE; fail: g_free (stbl_children); g_free (mvhd_data); g_free (prefix_data); g_free (trak_data); g_free (data); return FALSE; } gst-plugins-good-0.10.31/gst/isomp4/qtdemux_fourcc.h0000644000175000017500000002746011677341655017240 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_QTDEMUX_FOURCC_H__ #define __GST_QTDEMUX_FOURCC_H__ #include G_BEGIN_DECLS #define FOURCC_ftyp GST_MAKE_FOURCC('f','t','y','p') #define FOURCC_qt__ GST_MAKE_FOURCC('q','t',' ',' ') #define FOURCC_moov GST_MAKE_FOURCC('m','o','o','v') #define FOURCC_mvhd GST_MAKE_FOURCC('m','v','h','d') #define FOURCC_clip GST_MAKE_FOURCC('c','l','i','p') #define FOURCC_trak GST_MAKE_FOURCC('t','r','a','k') #define FOURCC_udta GST_MAKE_FOURCC('u','d','t','a') #define FOURCC_ctab GST_MAKE_FOURCC('c','t','a','b') #define FOURCC_tkhd GST_MAKE_FOURCC('t','k','h','d') #define FOURCC_crgn GST_MAKE_FOURCC('c','r','g','n') #define FOURCC_matt GST_MAKE_FOURCC('m','a','t','t') #define FOURCC_kmat GST_MAKE_FOURCC('k','m','a','t') #define FOURCC_edts GST_MAKE_FOURCC('e','d','t','s') #define FOURCC_elst GST_MAKE_FOURCC('e','l','s','t') #define FOURCC_load GST_MAKE_FOURCC('l','o','a','d') #define FOURCC_tref GST_MAKE_FOURCC('t','r','e','f') #define FOURCC_imap GST_MAKE_FOURCC('i','m','a','p') #define FOURCC___in GST_MAKE_FOURCC(' ',' ','i','n') #define FOURCC___ty GST_MAKE_FOURCC(' ',' ','t','y') #define FOURCC_mdia GST_MAKE_FOURCC('m','d','i','a') #define FOURCC_mdhd GST_MAKE_FOURCC('m','d','h','d') #define FOURCC_hdlr GST_MAKE_FOURCC('h','d','l','r') #define FOURCC_hndl GST_MAKE_FOURCC('h','n','d','l') #define FOURCC_minf GST_MAKE_FOURCC('m','i','n','f') #define FOURCC_vmhd GST_MAKE_FOURCC('v','m','h','d') #define FOURCC_smhd GST_MAKE_FOURCC('s','m','h','d') #define FOURCC_gmhd GST_MAKE_FOURCC('g','m','h','d') #define FOURCC_gmin GST_MAKE_FOURCC('g','m','i','n') #define FOURCC_dinf GST_MAKE_FOURCC('d','i','n','f') #define FOURCC_dref GST_MAKE_FOURCC('d','r','e','f') #define FOURCC_stbl GST_MAKE_FOURCC('s','t','b','l') #define FOURCC_stsd GST_MAKE_FOURCC('s','t','s','d') #define FOURCC_stts GST_MAKE_FOURCC('s','t','t','s') #define FOURCC_stss GST_MAKE_FOURCC('s','t','s','s') #define FOURCC_stps GST_MAKE_FOURCC('s','t','p','s') #define FOURCC_stsc GST_MAKE_FOURCC('s','t','s','c') #define FOURCC_stsz GST_MAKE_FOURCC('s','t','s','z') #define FOURCC_stco GST_MAKE_FOURCC('s','t','c','o') #define FOURCC_vide GST_MAKE_FOURCC('v','i','d','e') #define FOURCC_soun GST_MAKE_FOURCC('s','o','u','n') #define FOURCC_subp GST_MAKE_FOURCC('s','u','b','p') #define FOURCC_strm GST_MAKE_FOURCC('s','t','r','m') #define FOURCC_rtsp GST_MAKE_FOURCC('r','t','s','p') #define FOURCC_co64 GST_MAKE_FOURCC('c','o','6','4') #define FOURCC_cmov GST_MAKE_FOURCC('c','m','o','v') #define FOURCC_dcom GST_MAKE_FOURCC('d','c','o','m') #define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d') #define FOURCC_hint GST_MAKE_FOURCC('h','i','n','t') #define FOURCC_mp4a GST_MAKE_FOURCC('m','p','4','a') #define FOURCC_mp4v GST_MAKE_FOURCC('m','p','4','v') #define FOURCC_MP4V GST_MAKE_FOURCC('M','P','4','V') #define FOURCC_fmp4 GST_MAKE_FOURCC('f','m','p','4') #define FOURCC_FMP4 GST_MAKE_FOURCC('F','M','P','4') #define FOURCC_glbl GST_MAKE_FOURCC('g','l','b','l') #define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') #define FOURCC_appl GST_MAKE_FOURCC('a','p','p','l') #define FOURCC_esds GST_MAKE_FOURCC('e','s','d','s') #define FOURCC_pasp GST_MAKE_FOURCC('p','a','s','p') #define FOURCC_hnti GST_MAKE_FOURCC('h','n','t','i') #define FOURCC_rtp_ GST_MAKE_FOURCC('r','t','p',' ') #define FOURCC_sdp_ GST_MAKE_FOURCC('s','d','p',' ') #define FOURCC_meta GST_MAKE_FOURCC('m','e','t','a') #define FOURCC_ilst GST_MAKE_FOURCC('i','l','s','t') #define FOURCC__nam GST_MAKE_FOURCC(0xa9,'n','a','m') #define FOURCC__cmt GST_MAKE_FOURCC(0xa9,'c','m','t') #define FOURCC__des GST_MAKE_FOURCC(0xa9,'d','e','s') #define FOURCC_desc GST_MAKE_FOURCC('d','e','s','c') #define FOURCC__lyr GST_MAKE_FOURCC(0xa9,'l','y','r') #define FOURCC__cpy GST_MAKE_FOURCC(0xa9,'c','p','y') #define FOURCC__ART GST_MAKE_FOURCC(0xa9,'A','R','T') #define FOURCC_aART GST_MAKE_FOURCC('a','A','R','T') #define FOURCC__wrt GST_MAKE_FOURCC(0xa9,'w','r','t') #define FOURCC__grp GST_MAKE_FOURCC(0xa9,'g','r','p') #define FOURCC__alb GST_MAKE_FOURCC(0xa9,'a','l','b') #define FOURCC__day GST_MAKE_FOURCC(0xa9,'d','a','y') #define FOURCC__req GST_MAKE_FOURCC(0xa9,'r','e','q') #define FOURCC__enc GST_MAKE_FOURCC(0xa9,'e','n','c') #define FOURCC__inf GST_MAKE_FOURCC(0xa9,'i','n','f') #define FOURCC_cprt GST_MAKE_FOURCC('c','p','r','t') #define FOURCC_gnre GST_MAKE_FOURCC('g','n','r','e') #define FOURCC_disc GST_MAKE_FOURCC('d','i','s','c') #define FOURCC_disk GST_MAKE_FOURCC('d','i','s','k') #define FOURCC_trkn GST_MAKE_FOURCC('t','r','k','n') #define FOURCC_cpil GST_MAKE_FOURCC('c','p','i','l') #define FOURCC_pgap GST_MAKE_FOURCC('p','g','a','p') #define FOURCC_pcst GST_MAKE_FOURCC('p','c','s','t') #define FOURCC_tmpo GST_MAKE_FOURCC('t','m','p','o') #define FOURCC_covr GST_MAKE_FOURCC('c','o','v','r') #define FOURCC__too GST_MAKE_FOURCC(0xa9,'t','o','o') #define FOURCC_tvsh GST_MAKE_FOURCC('t','v','s','h') #define FOURCC_tven GST_MAKE_FOURCC('t','v','e','n') #define FOURCC_tvsn GST_MAKE_FOURCC('t','v','s','n') #define FOURCC_tves GST_MAKE_FOURCC('t','v','e','s') #define FOURCC_sonm GST_MAKE_FOURCC('s','o','n','m') #define FOURCC_soal GST_MAKE_FOURCC('s','o','a','l') #define FOURCC_soar GST_MAKE_FOURCC('s','o','a','r') #define FOURCC_soaa GST_MAKE_FOURCC('s','o','a','a') #define FOURCC_soco GST_MAKE_FOURCC('s','o','c','o') #define FOURCC_sosn GST_MAKE_FOURCC('s','o','s','n') #define FOURCC_____ GST_MAKE_FOURCC('-','-','-','-') #define FOURCC_mean GST_MAKE_FOURCC('m','e','a','n') #define FOURCC_name GST_MAKE_FOURCC('n','a','m','e') #define FOURCC_free GST_MAKE_FOURCC('f','r','e','e') #define FOURCC_data GST_MAKE_FOURCC('d','a','t','a') #define FOURCC_SVQ3 GST_MAKE_FOURCC('S','V','Q','3') #define FOURCC_rmra GST_MAKE_FOURCC('r','m','r','a') #define FOURCC_rmda GST_MAKE_FOURCC('r','m','d','a') #define FOURCC_rdrf GST_MAKE_FOURCC('r','d','r','f') #define FOURCC__gen GST_MAKE_FOURCC(0xa9, 'g', 'e', 'n') #define FOURCC_rmdr GST_MAKE_FOURCC('r','m','d','r') #define FOURCC_rmvc GST_MAKE_FOURCC('r','m','v','c') #define FOURCC_qtim GST_MAKE_FOURCC('q','t','i','m') #define FOURCC_drms GST_MAKE_FOURCC('d','r','m','s') #define FOURCC_drmi GST_MAKE_FOURCC('d','r','m','i') #define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') #define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') #define FOURCC_btrt GST_MAKE_FOURCC('b','t','r','t') #define FOURCC_VP31 GST_MAKE_FOURCC('V','P','3','1') #define FOURCC_rle_ GST_MAKE_FOURCC('r','l','e',' ') #define FOURCC_MAC6 GST_MAKE_FOURCC('M','A','C','6') #define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3') #define FOURCC_ima4 GST_MAKE_FOURCC('i','m','a','4') #define FOURCC_ulaw GST_MAKE_FOURCC('u','l','a','w') #define FOURCC_alaw GST_MAKE_FOURCC('a','l','a','w') #define FOURCC_twos GST_MAKE_FOURCC('t','w','o','s') #define FOURCC_sowt GST_MAKE_FOURCC('s','o','w','t') #define FOURCC_raw_ GST_MAKE_FOURCC('r','a','w',' ') #define FOURCC_in24 GST_MAKE_FOURCC('i','n','2','4') #define FOURCC_enda GST_MAKE_FOURCC('e','n','d','a') #define FOURCC_QDM2 GST_MAKE_FOURCC('Q','D','M','2') #define FOURCC_alac GST_MAKE_FOURCC('a','l','a','c') #define FOURCC_samr GST_MAKE_FOURCC('s','a','m','r') #define FOURCC_sawb GST_MAKE_FOURCC('s','a','w','b') #define FOURCC_mdat GST_MAKE_FOURCC('m','d','a','t') #define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') #define FOURCC_PICT GST_MAKE_FOURCC('P','I','C','T') #define FOURCC_pnot GST_MAKE_FOURCC('p','n','o','t') #define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b') #define FOURCC_alis GST_MAKE_FOURCC('a','l','i','s') #define FOURCC_url_ GST_MAKE_FOURCC('u','r','l',' ') #define FOURCC_frma GST_MAKE_FOURCC('f','r','m','a') #define FOURCC_ctts GST_MAKE_FOURCC('c','t','t','s') #define FOURCC_keyw GST_MAKE_FOURCC('k','e','y','w') #define FOURCC_kywd GST_MAKE_FOURCC('k','y','w','d') #define FOURCC_agsm GST_MAKE_FOURCC('a','g','s','m') #define FOURCC_text GST_MAKE_FOURCC('t','e','x','t') #define FOURCC_tx3g GST_MAKE_FOURCC('t','x','3','g') #define FOURCC_mp4s GST_MAKE_FOURCC('m','p','4','s') #define FOURCC_gama GST_MAKE_FOURCC('g','a','m','a') /* SVQ3 fourcc */ #define FOURCC_SEQH GST_MAKE_FOURCC('S','E','Q','H') #define FOURCC_SMI_ GST_MAKE_FOURCC('S','M','I',' ') /* 3gpp asset meta data fourcc */ #define FOURCC_titl GST_MAKE_FOURCC('t','i','t','l') #define FOURCC_dscp GST_MAKE_FOURCC('d','s','c','p') #define FOURCC_perf GST_MAKE_FOURCC('p','e','r','f') #define FOURCC_auth GST_MAKE_FOURCC('a','u','t','h') #define FOURCC_rtng GST_MAKE_FOURCC('r','t','n','g') #define FOURCC_clsf GST_MAKE_FOURCC('c','l','s','f') #define FOURCC_loci GST_MAKE_FOURCC('l','o','c','i') #define FOURCC_albm GST_MAKE_FOURCC('a','l','b','m') #define FOURCC_yrrc GST_MAKE_FOURCC('y','r','r','c') /* misc tag stuff */ #define FOURCC_ID32 GST_MAKE_FOURCC('I', 'D','3','2') /* ISO Motion JPEG 2000 fourcc */ #define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2') #define FOURCC_jp2h GST_MAKE_FOURCC('j','p','2','h') #define FOURCC_ihdr GST_MAKE_FOURCC('i','h','d','r') #define FOURCC_colr GST_MAKE_FOURCC('c','o','l','r') #define FOURCC_fiel GST_MAKE_FOURCC('f','i','e','l') #define FOURCC_jp2x GST_MAKE_FOURCC('j','p','2','x') #define FOURCC_cmap GST_MAKE_FOURCC('c','m','a','p') #define FOURCC_cdef GST_MAKE_FOURCC('c','d','e','f') /* some buggy hardware's notion of mdhd */ #define FOURCC_mhdr GST_MAKE_FOURCC('m','h','d','r') /* Xiph fourcc */ #define FOURCC_XiTh GST_MAKE_FOURCC('X','i','T','h') #define FOURCC_XdxT GST_MAKE_FOURCC('X','d','x','T') #define FOURCC_tCtH GST_MAKE_FOURCC('t','C','t','H') #define FOURCC_tCt_ GST_MAKE_FOURCC('t','C','t','#') #define FOURCC_tCtC GST_MAKE_FOURCC('t','C','t','C') #define FOURCC_XMP_ GST_MAKE_FOURCC('X','M','P','_') #define FOURCC_uuid GST_MAKE_FOURCC('u','u','i','d') /* Fragmented MP4 */ #define FOURCC_mehd GST_MAKE_FOURCC('m','e','h','d') #define FOURCC_mfhd GST_MAKE_FOURCC('m','f','h','d') #define FOURCC_mfra GST_MAKE_FOURCC('m','f','r','a') #define FOURCC_mfro GST_MAKE_FOURCC('m','f','r','o') #define FOURCC_moof GST_MAKE_FOURCC('m','o','o','f') #define FOURCC_mvex GST_MAKE_FOURCC('m','v','e','x') #define FOURCC_sdtp GST_MAKE_FOURCC('s','d','t','p') #define FOURCC_tfhd GST_MAKE_FOURCC('t','f','h','d') #define FOURCC_tfra GST_MAKE_FOURCC('t','f','r','a') #define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f') #define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x') #define FOURCC_trun GST_MAKE_FOURCC('t','r','u','n') #define FOURCC_ovc1 GST_MAKE_FOURCC('o','v','c','1') #define FOURCC_owma GST_MAKE_FOURCC('o','w','m','a') G_END_DECLS #endif /* __GST_QTDEMUX_FOURCC_H__ */ gst-plugins-good-0.10.31/gst/isomp4/qtdemux_lang.h0000644000175000017500000000211011671175353016653 00000000000000/* GStreamer Quicktime/ISO demuxer language utility functions * Copyright (C) 2010 Tim-Philipp Müller * * 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_QTDEMUX_LANG_H__ #define __GST_QTDEMUX_LANG_H__ G_BEGIN_DECLS #include void qtdemux_lang_map_qt_code_to_iso (gchar id[4], guint16 qt_lang_code); G_END_DECLS #endif /* __GST_QTDEMUX_LANG_H__ */ gst-plugins-good-0.10.31/gst/isomp4/qtatomparser.h0000644000175000017500000001001511671175353016710 00000000000000/* GStreamer QuickTime atom parser * Copyright (C) 2009 Tim-Philipp Müller * Copyright (C) <2009> STEricsson * * 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 QT_ATOM_PARSER_H #define QT_ATOM_PARSER_H #include /* our inlined version of GstByteReader */ static inline gboolean qt_atom_parser_has_remaining (GstByteReader * parser, guint64 bytes_needed) { return G_LIKELY (parser->size >= bytes_needed) && G_LIKELY ((parser->size - bytes_needed) >= parser->byte); } static inline gboolean qt_atom_parser_has_chunks (GstByteReader * parser, guint32 n_chunks, guint32 chunk_size) { /* assumption: n_chunks and chunk_size are 32-bit, we cast to 64-bit here * to avoid overflows, to handle e.g. (guint32)-1 * size correctly */ return qt_atom_parser_has_remaining (parser, (guint64) n_chunks * chunk_size); } static inline gboolean qt_atom_parser_peek_sub (GstByteReader * parser, guint offset, guint size, GstByteReader * sub) { *sub = *parser; if (G_UNLIKELY (!gst_byte_reader_skip (sub, offset))) return FALSE; return (gst_byte_reader_get_remaining (sub) >= size); } static inline gboolean qt_atom_parser_skipn_and_get_uint32 (GstByteReader * parser, guint bytes_to_skip, guint32 * val) { if (G_UNLIKELY (gst_byte_reader_get_remaining (parser) < (bytes_to_skip + 4))) return FALSE; gst_byte_reader_skip_unchecked (parser, bytes_to_skip); *val = gst_byte_reader_get_uint32_be_unchecked (parser); return TRUE; } /* off_size must be either 4 or 8 */ static inline gboolean qt_atom_parser_get_offset (GstByteReader * parser, guint off_size, guint64 * val) { if (G_UNLIKELY (gst_byte_reader_get_remaining (parser) < off_size)) return FALSE; if (off_size == sizeof (guint64)) { *val = gst_byte_reader_get_uint64_be_unchecked (parser); } else { *val = gst_byte_reader_get_uint32_be_unchecked (parser); } return TRUE; } /* off_size must be either 4 or 8 */ static inline guint64 qt_atom_parser_get_offset_unchecked (GstByteReader * parser, guint off_size) { if (off_size == sizeof (guint64)) { return gst_byte_reader_get_uint64_be_unchecked (parser); } else { return gst_byte_reader_get_uint32_be_unchecked (parser); } } /* size must be from 1 to 4 */ static inline guint32 qt_atom_parser_get_uint_with_size_unchecked (GstByteReader * parser, guint size) { switch (size) { case 1: return gst_byte_reader_get_uint8_unchecked (parser); case 2: return gst_byte_reader_get_uint16_be_unchecked (parser); case 3: return gst_byte_reader_get_uint24_be_unchecked (parser); case 4: return gst_byte_reader_get_uint32_be_unchecked (parser); default: g_assert_not_reached (); gst_byte_reader_skip_unchecked (parser, size); break; } return 0; } static inline gboolean qt_atom_parser_get_fourcc (GstByteReader * parser, guint32 * fourcc) { guint32 f_be; if (G_UNLIKELY (gst_byte_reader_get_remaining (parser) < 4)) return FALSE; f_be = gst_byte_reader_get_uint32_be_unchecked (parser); *fourcc = GUINT32_SWAP_LE_BE (f_be); return TRUE; } static inline guint32 qt_atom_parser_get_fourcc_unchecked (GstByteReader * parser) { guint32 fourcc; fourcc = gst_byte_reader_get_uint32_be_unchecked (parser); return GUINT32_SWAP_LE_BE (fourcc); } #endif /* QT_ATOM_PARSER_H */ gst-plugins-good-0.10.31/gst/isomp4/gstqtmux-doc.h0000644000175000017500000000470511671175353016636 00000000000000/* Quicktime muxer documentation * Copyright (C) 2008-2010 Thiago Santos * Copyright (C) 2008 Mark Nauwelaerts * Copyright (C) 2010 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #error "This header is for gtk-doc only and not supposed to be included" typedef struct _GstMP4Mux GstMP4Mux; typedef struct _Gst3GPPMux GstMP4Mux; typedef struct _GstISMLMux GstMP4Mux; typedef struct _GstMJ2Mux GstMJ2Mux; gst-plugins-good-0.10.31/gst/isomp4/qtdemux_types.c0000644000175000017500000001715211671175353017105 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 "qtdemux_types.h" #include "qtdemux_dump.h" #include "qtdemux_fourcc.h" static const QtNodeType qt_node_types[] = { {FOURCC_moov, "movie", QT_FLAG_CONTAINER,}, {FOURCC_mvhd, "movie header", 0, qtdemux_dump_mvhd}, {FOURCC_clip, "clipping", QT_FLAG_CONTAINER,}, {FOURCC_trak, "track", QT_FLAG_CONTAINER,}, {FOURCC_udta, "user data", QT_FLAG_CONTAINER,}, /* special container */ {FOURCC_ctab, "color table", 0,}, {FOURCC_tkhd, "track header", 0, qtdemux_dump_tkhd}, {FOURCC_crgn, "clipping region", 0,}, {FOURCC_matt, "track matte", QT_FLAG_CONTAINER,}, {FOURCC_kmat, "compressed matte", 0,}, {FOURCC_edts, "edit", QT_FLAG_CONTAINER,}, {FOURCC_elst, "edit list", 0, qtdemux_dump_elst}, {FOURCC_load, "track load settings", 0,}, {FOURCC_tref, "track reference", QT_FLAG_CONTAINER,}, {FOURCC_imap, "track input map", QT_FLAG_CONTAINER,}, {FOURCC___in, "track input", 0,}, /* special container */ {FOURCC___ty, "input type", 0,}, {FOURCC_mdia, "media", QT_FLAG_CONTAINER}, {FOURCC_mdhd, "media header", 0, qtdemux_dump_mdhd}, {FOURCC_hdlr, "handler reference", 0, qtdemux_dump_hdlr}, {FOURCC_minf, "media information", QT_FLAG_CONTAINER}, {FOURCC_vmhd, "video media information", 0, qtdemux_dump_vmhd}, {FOURCC_smhd, "sound media information", 0}, {FOURCC_gmhd, "base media information header", 0}, {FOURCC_gmin, "base media info", 0}, {FOURCC_dinf, "data information", QT_FLAG_CONTAINER}, {FOURCC_dref, "data reference", 0, qtdemux_dump_dref}, {FOURCC_stbl, "sample table", QT_FLAG_CONTAINER}, {FOURCC_stsd, "sample description", 0, qtdemux_dump_stsd}, {FOURCC_stts, "time-to-sample", 0, qtdemux_dump_stts}, {FOURCC_stps, "partial sync sample", 0, qtdemux_dump_stps}, {FOURCC_stss, "sync sample", 0, qtdemux_dump_stss}, {FOURCC_stsc, "sample-to-chunk", 0, qtdemux_dump_stsc}, {FOURCC_stsz, "sample size", 0, qtdemux_dump_stsz}, {FOURCC_stco, "chunk offset", 0, qtdemux_dump_stco}, {FOURCC_co64, "64-bit chunk offset", 0, qtdemux_dump_co64}, {FOURCC_vide, "video media", 0}, {FOURCC_cmov, "compressed movie", QT_FLAG_CONTAINER}, {FOURCC_dcom, "compressed data", 0, qtdemux_dump_dcom}, {FOURCC_cmvd, "compressed movie data", 0, qtdemux_dump_cmvd}, {FOURCC_hint, "hint", 0,}, {FOURCC_mp4a, "mp4a", 0,}, {FOURCC_mp4v, "mp4v", 0,}, {FOURCC_mjp2, "mjp2", 0,}, {FOURCC_mhdr, "mhdr", QT_FLAG_CONTAINER,}, {FOURCC_jp2h, "jp2h", QT_FLAG_CONTAINER,}, {FOURCC_colr, "colr", 0,}, {FOURCC_fiel, "fiel", 0,}, {FOURCC_jp2x, "jp2x", 0,}, {FOURCC_alac, "alac", 0,}, {FOURCC_wave, "wave", QT_FLAG_CONTAINER}, {FOURCC_appl, "appl", QT_FLAG_CONTAINER}, {FOURCC_esds, "esds", 0}, {FOURCC_hnti, "hnti", QT_FLAG_CONTAINER}, {FOURCC_rtp_, "rtp ", 0, qtdemux_dump_unknown}, {FOURCC_sdp_, "sdp ", 0, qtdemux_dump_unknown}, {FOURCC_meta, "meta", 0, qtdemux_dump_unknown}, {FOURCC_ilst, "ilst", QT_FLAG_CONTAINER,}, {FOURCC__nam, "Name", QT_FLAG_CONTAINER,}, {FOURCC_titl, "Title", QT_FLAG_CONTAINER,}, {FOURCC__ART, "Artist", QT_FLAG_CONTAINER,}, {FOURCC_aART, "Album Artist", QT_FLAG_CONTAINER,}, {FOURCC_auth, "Author", QT_FLAG_CONTAINER,}, {FOURCC_perf, "Performer", QT_FLAG_CONTAINER,}, {FOURCC__wrt, "Writer", QT_FLAG_CONTAINER,}, {FOURCC__grp, "Grouping", QT_FLAG_CONTAINER,}, {FOURCC__alb, "Album", QT_FLAG_CONTAINER,}, {FOURCC_albm, "Album", QT_FLAG_CONTAINER,}, {FOURCC__day, "Date", QT_FLAG_CONTAINER,}, {FOURCC__cpy, "Copyright", QT_FLAG_CONTAINER,}, {FOURCC__cmt, "Comment", QT_FLAG_CONTAINER,}, {FOURCC__des, "Description", QT_FLAG_CONTAINER,}, {FOURCC_desc, "Description", QT_FLAG_CONTAINER,}, {FOURCC_dscp, "Description", QT_FLAG_CONTAINER,}, {FOURCC__lyr, "Lyrics", QT_FLAG_CONTAINER,}, {FOURCC__req, "Requirement", QT_FLAG_CONTAINER,}, {FOURCC__enc, "Encoder", QT_FLAG_CONTAINER,}, {FOURCC_gnre, "Genre", QT_FLAG_CONTAINER,}, {FOURCC_trkn, "Track Number", QT_FLAG_CONTAINER,}, {FOURCC_disc, "Disc Number", QT_FLAG_CONTAINER,}, {FOURCC_disk, "Disc Number", QT_FLAG_CONTAINER,}, {FOURCC_cprt, "Copyright", QT_FLAG_CONTAINER,}, {FOURCC_cpil, "Compilation", QT_FLAG_CONTAINER,}, {FOURCC_pgap, "Gapless", QT_FLAG_CONTAINER,}, {FOURCC_pcst, "Podcast", QT_FLAG_CONTAINER,}, {FOURCC_tmpo, "Tempo", QT_FLAG_CONTAINER,}, {FOURCC_covr, "Cover", QT_FLAG_CONTAINER,}, {FOURCC_sonm, "Sort Title", QT_FLAG_CONTAINER,}, {FOURCC_soal, "Sort Album", QT_FLAG_CONTAINER,}, {FOURCC_soar, "Sort Artist", QT_FLAG_CONTAINER,}, {FOURCC_soaa, "Sort Album Artist", QT_FLAG_CONTAINER,}, {FOURCC_soco, "Sort Composer", QT_FLAG_CONTAINER,}, {FOURCC_sosn, "Sort TV Show", QT_FLAG_CONTAINER,}, {FOURCC_tvsh, "TV Show", QT_FLAG_CONTAINER,}, {FOURCC_tven, "TV Episode ID", QT_FLAG_CONTAINER,}, {FOURCC_tvsn, "TV Season Number", QT_FLAG_CONTAINER,}, {FOURCC_tves, "TV Episode Number", QT_FLAG_CONTAINER,}, {FOURCC_keyw, "Keywords", QT_FLAG_CONTAINER,}, {FOURCC_kywd, "Keywords", QT_FLAG_CONTAINER,}, {FOURCC__too, "Encoder", QT_FLAG_CONTAINER,}, {FOURCC_____, "----", QT_FLAG_CONTAINER,}, {FOURCC_data, "data", 0, qtdemux_dump_unknown}, {FOURCC_free, "free", 0,}, {FOURCC_SVQ3, "SVQ3", 0,}, {FOURCC_rmra, "rmra", QT_FLAG_CONTAINER,}, {FOURCC_rmda, "rmda", QT_FLAG_CONTAINER,}, {FOURCC_rdrf, "rdrf", 0,}, {FOURCC__gen, "Custom Genre", QT_FLAG_CONTAINER,}, {FOURCC_ctts, "Composition time to sample", 0, qtdemux_dump_ctts}, {FOURCC_XiTh, "XiTh", 0}, {FOURCC_XdxT, "XdxT", 0}, {FOURCC_loci, "loci", 0}, {FOURCC_clsf, "clsf", 0}, {FOURCC_mfra, "movie fragment random access", QT_FLAG_CONTAINER,}, {FOURCC_tfra, "track fragment random access", 0, qtdemux_dump_tfra}, {FOURCC_mfro, "movie fragment random access offset", 0, qtdemux_dump_mfro}, {FOURCC_moof, "movie fragment", QT_FLAG_CONTAINER,}, {FOURCC_mfhd, "movie fragment header", 0,}, {FOURCC_traf, "track fragment", QT_FLAG_CONTAINER,}, {FOURCC_tfhd, "track fragment header", 0, qtdemux_dump_tfhd}, {FOURCC_sdtp, "independent and disposable samples", 0, qtdemux_dump_sdtp}, {FOURCC_trun, "track fragment run", 0, qtdemux_dump_trun}, {FOURCC_mdat, "moovie data", 0, qtdemux_dump_unknown}, {FOURCC_trex, "moovie data", 0, qtdemux_dump_trex}, {FOURCC_mvex, "mvex", QT_FLAG_CONTAINER,}, {FOURCC_mehd, "movie extends header", 0, qtdemux_dump_mehd}, {FOURCC_ovc1, "ovc1", 0}, {FOURCC_owma, "owma", 0}, {0, "unknown", 0,}, }; static const int n_qt_node_types = sizeof (qt_node_types) / sizeof (qt_node_types[0]); const QtNodeType * qtdemux_type_get (guint32 fourcc) { int i; for (i = 0; i < n_qt_node_types; i++) { if (G_UNLIKELY (qt_node_types[i].fourcc == fourcc)) return qt_node_types + i; } GST_WARNING ("unknown QuickTime node type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); return qt_node_types + n_qt_node_types - 1; } gst-plugins-good-0.10.31/gst/isomp4/properties.h0000644000175000017500000001107711671175353016373 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008 Thiago Sousa Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __PROPERTIES_H__ #define __PROPERTIES_H__ #include #include /** * Functions for copying atoms properties. * * All of them receive, as the input, the property to be copied, the destination * buffer, and a pointer to an offset in the destination buffer to copy to the right place. * This offset will be updated to the new value (offset + copied_size) * The functions return the size of the property that has been copied or 0 * if it couldn't copy. */ void prop_copy_ensure_buffer (guint8 ** buffer, guint64 * bsize, guint64 * offset, guint64 size); guint64 prop_copy_uint8 (guint8 prop, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_uint16 (guint16 prop, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_uint32 (guint32 prop, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_uint64 (guint64 prop, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_int32 (gint32 prop, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_uint8_array (guint8 *prop, guint size, guint8 **buffer, guint64 *bsize, guint64 *offset); guint64 prop_copy_uint16_array (guint16 *prop, guint size, guint8 **buffer, guint64 *bsize, guint64 *offset); guint64 prop_copy_uint32_array (guint32 *prop, guint size, guint8 **buffer, guint64 *bsize, guint64 *offset); guint64 prop_copy_uint64_array (guint64 *prop, guint size, guint8 **buffer, guint64 *bsize, guint64 *offset); guint64 prop_copy_fourcc (guint32 prop, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_fourcc_array (guint32 *prop, guint size, guint8 **buffer, guint64 *bsize, guint64 *offset); guint64 prop_copy_fixed_size_string (guint8 *string, guint str_size, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_size_string (guint8 *string, guint str_size, guint8 **buffer, guint64 *size, guint64 *offset); guint64 prop_copy_null_terminated_string (gchar *string, guint8 **buffer, guint64 *size, guint64 *offset); #endif /* __PROPERTIES_H__ */ gst-plugins-good-0.10.31/gst/isomp4/gstqtmuxmap.c0000644000175000017500000002743311677341655016575 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008 Thiago Sousa Santos * Copyright (C) 2008 Mark Nauwelaerts * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #include "gstqtmuxmap.h" #include "fourcc.h" #include "ftypcc.h" /* static info related to various format */ #define COMMON_VIDEO_CAPS \ "width = (int) [ 16, 4096 ], " \ "height = (int) [ 16, 4096 ], " \ "framerate = (fraction) [ 0, MAX ]" #define COMMON_VIDEO_CAPS_NO_FRAMERATE \ "width = (int) [ 16, 4096 ], " \ "height = (int) [ 16, 4096 ] " #define H263_CAPS \ "video/x-h263, " \ COMMON_VIDEO_CAPS #define H264_CAPS \ "video/x-h264, " \ "stream-format = (string) avc, " \ "alignment = (string) au, " \ COMMON_VIDEO_CAPS #define MPEG4V_CAPS \ "video/mpeg, " \ "mpegversion = (int) 4, "\ "systemstream = (boolean) false, " \ COMMON_VIDEO_CAPS "; " \ "video/x-divx, " \ "divxversion = (int) 5, "\ COMMON_VIDEO_CAPS #define SVQ_CAPS \ "video/x-svq, " \ "svqversion = (int) 3, " \ COMMON_VIDEO_CAPS #define COMMON_AUDIO_CAPS(c, r) \ "channels = (int) [ 1, " G_STRINGIFY (c) " ], " \ "rate = (int) [ 1, " G_STRINGIFY (r) " ]" #define PCM_CAPS \ "audio/x-raw-int, " \ "width = (int) 8, " \ "depth = (int) 8, " \ COMMON_AUDIO_CAPS (2, MAX) ", " \ "signed = (boolean) { true, false }; " \ "audio/x-raw-int, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " \ COMMON_AUDIO_CAPS (2, MAX) ", " \ "signed = (boolean) true " \ #define PCM_CAPS_FULL \ PCM_CAPS "; " \ "audio/x-raw-int, " \ "width = (int) 24, " \ "depth = (int) 24, " \ "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " \ COMMON_AUDIO_CAPS (2, MAX) ", " \ "signed = (boolean) true; " \ "audio/x-raw-int, " \ "width = (int) 32, " \ "depth = (int) 32, " \ "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " \ COMMON_AUDIO_CAPS (2, MAX) ", " \ "signed = (boolean) true " #define MP3_CAPS \ "audio/mpeg, " \ "mpegversion = (int) 1, " \ "layer = (int) 3, " \ COMMON_AUDIO_CAPS (2, MAX) #define AAC_CAPS \ "audio/mpeg, " \ "mpegversion = (int) 4, " \ "stream-format = (string) raw, " \ COMMON_AUDIO_CAPS (8, MAX) #define AMR_CAPS \ "audio/AMR, " \ "rate = (int) 8000, " \ "channels = [ 1, 2 ]; " \ "audio/AMR-WB, " \ "rate = (int) 16000, " \ "channels = [ 1, 2 ] " #define ADPCM_CAPS \ "audio/x-adpcm, " \ "layout = (string)dvi, " \ "block_align = (int)[64, 8096], " \ COMMON_AUDIO_CAPS(2, MAX) #define ALAC_CAPS \ "audio/x-alac, " \ COMMON_AUDIO_CAPS(2, MAX) /* FIXME 0.11 - take a look at bugs #580005 and #340375 */ GstQTMuxFormatProp gst_qt_mux_format_list[] = { /* original QuickTime format; see Apple site (e.g. qtff.pdf) */ { GST_QT_MUX_FORMAT_QT, GST_RANK_PRIMARY, "qtmux", "QuickTime", "GstQTMux", GST_STATIC_CAPS ("video/quicktime, variant = (string) apple; " "video/quicktime"), GST_STATIC_CAPS ("video/x-raw-rgb, " COMMON_VIDEO_CAPS "; " "video/x-raw-yuv, " "format = (fourcc) UYVY, " COMMON_VIDEO_CAPS "; " MPEG4V_CAPS "; " H263_CAPS "; " H264_CAPS "; " SVQ_CAPS "; " "video/x-dv, " "systemstream = (boolean) false, " COMMON_VIDEO_CAPS "; " "image/jpeg, " COMMON_VIDEO_CAPS_NO_FRAMERATE "; " "video/x-vp8, " COMMON_VIDEO_CAPS "; " "video/x-dirac, " COMMON_VIDEO_CAPS "; " "video/x-qt-part, " COMMON_VIDEO_CAPS), GST_STATIC_CAPS (PCM_CAPS_FULL "; " MP3_CAPS " ; " AAC_CAPS " ; " ADPCM_CAPS " ; " "audio/x-alaw, " COMMON_AUDIO_CAPS (2, MAX) "; " AMR_CAPS " ; " ALAC_CAPS) } , /* ISO 14496-14: mp42 as ISO base media extension * (supersedes original ISO 144996-1 mp41) */ { GST_QT_MUX_FORMAT_MP4, GST_RANK_PRIMARY, "mp4mux", "MP4", "GstMP4Mux", GST_STATIC_CAPS ("video/quicktime, variant = (string) iso"), GST_STATIC_CAPS (MPEG4V_CAPS "; " H264_CAPS ";" "video/x-mp4-part," COMMON_VIDEO_CAPS), GST_STATIC_CAPS (MP3_CAPS "; " AAC_CAPS " ; " ALAC_CAPS) } , /* Microsoft Smooth Streaming fmp4/isml */ /* TODO add WMV/WMA support */ { GST_QT_MUX_FORMAT_ISML, GST_RANK_PRIMARY, "ismlmux", "ISML", "GstISMLMux", GST_STATIC_CAPS ("video/quicktime, variant = (string) iso-fragmented"), GST_STATIC_CAPS (MPEG4V_CAPS "; " H264_CAPS), GST_STATIC_CAPS (MP3_CAPS "; " AAC_CAPS) } , /* 3GPP Technical Specification 26.244 V7.3.0 * (extended in 3GPP2 File Formats for Multimedia Services) */ { GST_QT_MUX_FORMAT_3GP, GST_RANK_PRIMARY, "3gppmux", "3GPP", "Gst3GPPMux", GST_STATIC_CAPS ("video/quicktime, variant = (string) 3gpp"), GST_STATIC_CAPS (H263_CAPS "; " MPEG4V_CAPS "; " H264_CAPS), GST_STATIC_CAPS (AMR_CAPS "; " MP3_CAPS "; " AAC_CAPS) } , #ifndef GST_REMOVE_DEPRECATED /* 3GPP Technical Specification 26.244 V7.3.0 * (extended in 3GPP2 File Formats for Multimedia Services) */ { GST_QT_MUX_FORMAT_3GP, GST_RANK_NONE, "gppmux", "3GPP", "GstGPPMux", GST_STATIC_CAPS ("video/quicktime, variant = (string) 3gpp"), GST_STATIC_CAPS (H263_CAPS "; " MPEG4V_CAPS "; " H264_CAPS), GST_STATIC_CAPS (AMR_CAPS "; " MP3_CAPS "; " AAC_CAPS) } , #endif /* ISO 15444-3: Motion-JPEG-2000 (also ISO base media extension) */ { GST_QT_MUX_FORMAT_MJ2, GST_RANK_PRIMARY, "mj2mux", "MJ2", "GstMJ2Mux", GST_STATIC_CAPS ("video/mj2"), GST_STATIC_CAPS ("image/x-j2c, " COMMON_VIDEO_CAPS "; " "image/x-jpc, " COMMON_VIDEO_CAPS), GST_STATIC_CAPS (PCM_CAPS) } , { GST_QT_MUX_FORMAT_NONE, } }; /* pretty static, but may turn out needed a few times */ AtomsTreeFlavor gst_qt_mux_map_format_to_flavor (GstQTMuxFormat format) { if (format == GST_QT_MUX_FORMAT_QT) return ATOMS_TREE_FLAVOR_MOV; else if (format == GST_QT_MUX_FORMAT_3GP) return ATOMS_TREE_FLAVOR_3GP; else if (format == GST_QT_MUX_FORMAT_ISML) return ATOMS_TREE_FLAVOR_ISML; else return ATOMS_TREE_FLAVOR_ISOM; } static void gst_qt_mux_map_check_tracks (AtomMOOV * moov, gint * _video, gint * _audio, gboolean * _has_h264) { GList *it; gint video = 0, audio = 0; gboolean has_h264 = FALSE; for (it = moov->traks; it != NULL; it = g_list_next (it)) { AtomTRAK *track = it->data; if (track->is_video) { video++; if (track->is_h264) has_h264 = TRUE; } else audio++; } if (_video) *_video = video; if (_audio) *_audio = audio; if (_has_h264) *_has_h264 = has_h264; } /* pretty static, but possibly dynamic format info */ /* notes: * - avc1 brand is not used, since the specific extensions indicated by it * are not used (e.g. sample groupings, etc) * - TODO: maybe even more 3GPP brand fine-tuning ?? * (but that might need ftyp rewriting at the end) */ void gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix, guint32 * _major, guint32 * _version, GList ** _compatible, AtomMOOV * moov, GstClockTime longest_chunk, gboolean faststart) { static guint32 qt_brands[] = { 0 }; static guint32 mp4_brands[] = { FOURCC_mp41, FOURCC_isom, FOURCC_iso2, 0 }; static guint32 isml_brands[] = { FOURCC_iso2, 0 }; static guint32 gpp_brands[] = { FOURCC_isom, FOURCC_iso2, 0 }; static guint32 mjp2_brands[] = { FOURCC_isom, FOURCC_iso2, 0 }; static guint8 mjp2_prefix[] = { 0, 0, 0, 12, 'j', 'P', ' ', ' ', 0x0D, 0x0A, 0x87, 0x0A }; guint32 *comp = NULL; guint32 major = 0, version = 0; GstBuffer *prefix = NULL; GList *result = NULL; g_return_if_fail (_prefix != NULL); g_return_if_fail (_major != NULL); g_return_if_fail (_version != NULL); g_return_if_fail (_compatible != NULL); switch (format) { case GST_QT_MUX_FORMAT_QT: major = FOURCC_qt__; comp = qt_brands; version = 0x20050300; break; case GST_QT_MUX_FORMAT_MP4: major = FOURCC_mp42; comp = mp4_brands; break; case GST_QT_MUX_FORMAT_ISML: major = FOURCC_isml; comp = isml_brands; break; case GST_QT_MUX_FORMAT_3GP: { gint video, audio; gboolean has_h264; gst_qt_mux_map_check_tracks (moov, &video, &audio, &has_h264); /* only track restriction really matters for Basic Profile */ if (video <= 1 && audio <= 1) { /* it seems only newer spec knows about H264 */ major = has_h264 ? FOURCC_3gp6 : FOURCC_3gp4; version = has_h264 ? 0x100 : 0x200; } else { major = FOURCC_3gg6; version = 0x100; } comp = gpp_brands; /* * We assume that we have chunks in dts order */ if (faststart && longest_chunk <= GST_SECOND) { /* add progressive download profile */ result = g_list_append (result, GUINT_TO_POINTER (FOURCC_3gr6)); } break; } case GST_QT_MUX_FORMAT_MJ2: major = FOURCC_mjp2; comp = mjp2_brands; version = 0; prefix = gst_buffer_new_and_alloc (sizeof (mjp2_prefix)); memcpy (GST_BUFFER_DATA (prefix), mjp2_prefix, GST_BUFFER_SIZE (prefix)); break; default: g_assert_not_reached (); break; } /* convert list to list, hm */ while (comp && *comp != 0) { /* order matters over efficiency */ result = g_list_append (result, GUINT_TO_POINTER (*comp)); comp++; } *_major = major; *_version = version; *_prefix = prefix; *_compatible = result; /* TODO 3GPP may include mp42 as compatible if applicable */ /* TODO 3GPP major brand 3gp7 if at most 1 video and audio track */ } gst-plugins-good-0.10.31/gst/isomp4/ftypcc.h0000644000175000017500000000576711671175353015500 00000000000000/* GStreamer * Copyright (C) <2008> Thiago Sousa Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __FTYP_CC_H__ #define __FTYP_CC_H__ #include G_BEGIN_DECLS #define FOURCC_ftyp GST_MAKE_FOURCC('f','t','y','p') #define FOURCC_isom GST_MAKE_FOURCC('i','s','o','m') #define FOURCC_iso2 GST_MAKE_FOURCC('i','s','o','2') #define FOURCC_mp41 GST_MAKE_FOURCC('m','p','4','1') #define FOURCC_mp42 GST_MAKE_FOURCC('m','p','4','2') #define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2') #define FOURCC_3gp4 GST_MAKE_FOURCC('3','g','p','4') #define FOURCC_3gp6 GST_MAKE_FOURCC('3','g','p','6') #define FOURCC_3gg6 GST_MAKE_FOURCC('3','g','g','6') #define FOURCC_3gr6 GST_MAKE_FOURCC('3','g','r','6') #define FOURCC_3gg7 GST_MAKE_FOURCC('3','g','g','7') #define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') #define FOURCC_qt__ GST_MAKE_FOURCC('q','t',' ',' ') #define FOURCC_isml GST_MAKE_FOURCC('i','s','m','l') #define FOURCC_piff GST_MAKE_FOURCC('p','i','f','f') G_END_DECLS #endif /* __FTYP_CC_H__ */ gst-plugins-good-0.10.31/gst/isomp4/fourcc.h0000644000175000017500000003002011677341655015453 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __FOURCC_H__ #define __FOURCC_H__ #include G_BEGIN_DECLS #define FOURCC_null 0x0 #define FOURCC_moov GST_MAKE_FOURCC('m','o','o','v') #define FOURCC_mvhd GST_MAKE_FOURCC('m','v','h','d') #define FOURCC_clip GST_MAKE_FOURCC('c','l','i','p') #define FOURCC_trak GST_MAKE_FOURCC('t','r','a','k') #define FOURCC_udta GST_MAKE_FOURCC('u','d','t','a') #define FOURCC_ctab GST_MAKE_FOURCC('c','t','a','b') #define FOURCC_tkhd GST_MAKE_FOURCC('t','k','h','d') #define FOURCC_crgn GST_MAKE_FOURCC('c','r','g','n') #define FOURCC_matt GST_MAKE_FOURCC('m','a','t','t') #define FOURCC_kmat GST_MAKE_FOURCC('k','m','a','t') #define FOURCC_edts GST_MAKE_FOURCC('e','d','t','s') #define FOURCC_elst GST_MAKE_FOURCC('e','l','s','t') #define FOURCC_load GST_MAKE_FOURCC('l','o','a','d') #define FOURCC_tref GST_MAKE_FOURCC('t','r','e','f') #define FOURCC_imap GST_MAKE_FOURCC('i','m','a','p') #define FOURCC___in GST_MAKE_FOURCC(' ',' ','i','n') #define FOURCC___ty GST_MAKE_FOURCC(' ',' ','t','y') #define FOURCC_mdia GST_MAKE_FOURCC('m','d','i','a') #define FOURCC_mdhd GST_MAKE_FOURCC('m','d','h','d') #define FOURCC_hdlr GST_MAKE_FOURCC('h','d','l','r') #define FOURCC_dhlr GST_MAKE_FOURCC('d','h','l','r') #define FOURCC_mhlr GST_MAKE_FOURCC('m','h','l','r') #define FOURCC_minf GST_MAKE_FOURCC('m','i','n','f') #define FOURCC_mdir GST_MAKE_FOURCC('m','d','i','r') #define FOURCC_vmhd GST_MAKE_FOURCC('v','m','h','d') #define FOURCC_smhd GST_MAKE_FOURCC('s','m','h','d') #define FOURCC_gmhd GST_MAKE_FOURCC('g','m','h','d') #define FOURCC_hmhd GST_MAKE_FOURCC('h','m','h','d') #define FOURCC_gmin GST_MAKE_FOURCC('g','m','i','n') #define FOURCC_dinf GST_MAKE_FOURCC('d','i','n','f') #define FOURCC_dref GST_MAKE_FOURCC('d','r','e','f') #define FOURCC_stbl GST_MAKE_FOURCC('s','t','b','l') #define FOURCC_stsd GST_MAKE_FOURCC('s','t','s','d') #define FOURCC_stts GST_MAKE_FOURCC('s','t','t','s') #define FOURCC_stss GST_MAKE_FOURCC('s','t','s','s') #define FOURCC_stsc GST_MAKE_FOURCC('s','t','s','c') #define FOURCC_stsz GST_MAKE_FOURCC('s','t','s','z') #define FOURCC_stco GST_MAKE_FOURCC('s','t','c','o') #define FOURCC_vide GST_MAKE_FOURCC('v','i','d','e') #define FOURCC_soun GST_MAKE_FOURCC('s','o','u','n') #define FOURCC_strm GST_MAKE_FOURCC('s','t','r','m') #define FOURCC_rtsp GST_MAKE_FOURCC('r','t','s','p') #define FOURCC_co64 GST_MAKE_FOURCC('c','o','6','4') #define FOURCC_cmov GST_MAKE_FOURCC('c','m','o','v') #define FOURCC_dcom GST_MAKE_FOURCC('d','c','o','m') #define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d') #define FOURCC_hint GST_MAKE_FOURCC('h','i','n','t') #define FOURCC_mp4a GST_MAKE_FOURCC('m','p','4','a') #define FOURCC__mp3 GST_MAKE_FOURCC('.','m','p','3') #define FOURCC_mp4s GST_MAKE_FOURCC('m','p','4','s') #define FOURCC_mp4v GST_MAKE_FOURCC('m','p','4','v') #define FOURCC_2vuy GST_MAKE_FOURCC('2','v','u','y') #define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') #define FOURCC_appl GST_MAKE_FOURCC('a','p','p','l') #define FOURCC_esds GST_MAKE_FOURCC('e','s','d','s') #define FOURCC_pasp GST_MAKE_FOURCC('p','a','s','p') #define FOURCC_hnti GST_MAKE_FOURCC('h','n','t','i') #define FOURCC_rtp_ GST_MAKE_FOURCC('r','t','p',' ') #define FOURCC_sdp_ GST_MAKE_FOURCC('s','d','p',' ') #define FOURCC_meta GST_MAKE_FOURCC('m','e','t','a') #define FOURCC_ilst GST_MAKE_FOURCC('i','l','s','t') #define FOURCC__nam GST_MAKE_FOURCC(0xa9,'n','a','m') #define FOURCC__ART GST_MAKE_FOURCC(0xa9,'A','R','T') #define FOURCC_aART GST_MAKE_FOURCC('a','A','R','T') #define FOURCC__wrt GST_MAKE_FOURCC(0xa9,'w','r','t') #define FOURCC__grp GST_MAKE_FOURCC(0xa9,'g','r','p') #define FOURCC__alb GST_MAKE_FOURCC(0xa9,'a','l','b') #define FOURCC__day GST_MAKE_FOURCC(0xa9,'d','a','y') #define FOURCC__des GST_MAKE_FOURCC(0xa9,'d','e','s') #define FOURCC__lyr GST_MAKE_FOURCC(0xa9,'l','y','r') #define FOURCC_gnre GST_MAKE_FOURCC('g','n','r','e') #define FOURCC_disc GST_MAKE_FOURCC('d','i','s','c') #define FOURCC_disk GST_MAKE_FOURCC('d','i','s','k') #define FOURCC_trkn GST_MAKE_FOURCC('t','r','k','n') #define FOURCC_cprt GST_MAKE_FOURCC('c','p','r','t') #define FOURCC_covr GST_MAKE_FOURCC('c','o','v','r') #define FOURCC_cpil GST_MAKE_FOURCC('c','p','i','l') #define FOURCC_tmpo GST_MAKE_FOURCC('t','m','p','o') #define FOURCC__too GST_MAKE_FOURCC(0xa9,'t','o','o') #define FOURCC_keyw GST_MAKE_FOURCC('k','e','y','w') #define FOURCC_____ GST_MAKE_FOURCC('-','-','-','-') #define FOURCC_free GST_MAKE_FOURCC('f','r','e','e') #define FOURCC_data GST_MAKE_FOURCC('d','a','t','a') #define FOURCC_SVQ3 GST_MAKE_FOURCC('S','V','Q','3') #define FOURCC_rmra GST_MAKE_FOURCC('r','m','r','a') #define FOURCC_rmda GST_MAKE_FOURCC('r','m','d','a') #define FOURCC_rdrf GST_MAKE_FOURCC('r','d','r','f') #define FOURCC__gen GST_MAKE_FOURCC(0xa9, 'g', 'e', 'n') #define FOURCC_rmdr GST_MAKE_FOURCC('r','m','d','r') #define FOURCC_rmvc GST_MAKE_FOURCC('r','m','v','c') #define FOURCC_qtim GST_MAKE_FOURCC('q','t','i','m') #define FOURCC_drms GST_MAKE_FOURCC('d','r','m','s') #define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') #define FOURCC_h263 GST_MAKE_FOURCC('h','2','6','3') #define FOURCC_s263 GST_MAKE_FOURCC('s','2','6','3') #define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') #define FOURCC_VP31 GST_MAKE_FOURCC('V','P','3','1') #define FOURCC_VP80 GST_MAKE_FOURCC('V','P','8','0') #define FOURCC_rle_ GST_MAKE_FOURCC('r','l','e',' ') #define FOURCC_MAC6 GST_MAKE_FOURCC('M','A','C','6') #define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3') #define FOURCC_ima4 GST_MAKE_FOURCC('i','m','a','4') #define FOURCC_ulaw GST_MAKE_FOURCC('u','l','a','w') #define FOURCC_alaw GST_MAKE_FOURCC('a','l','a','w') #define FOURCC_twos GST_MAKE_FOURCC('t','w','o','s') #define FOURCC_sowt GST_MAKE_FOURCC('s','o','w','t') #define FOURCC_raw_ GST_MAKE_FOURCC('r','a','w',' ') #define FOURCC_QDM2 GST_MAKE_FOURCC('Q','D','M','2') #define FOURCC_alac GST_MAKE_FOURCC('a','l','a','c') #define FOURCC_samr GST_MAKE_FOURCC('s','a','m','r') #define FOURCC_sawb GST_MAKE_FOURCC('s','a','w','b') #define FOURCC_mdat GST_MAKE_FOURCC('m','d','a','t') #define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') #define FOURCC_PICT GST_MAKE_FOURCC('P','I','C','T') #define FOURCC_pnot GST_MAKE_FOURCC('p','n','o','t') #define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b') #define FOURCC_alis GST_MAKE_FOURCC('a','l','i','s') #define FOURCC_url_ GST_MAKE_FOURCC('u','r','l',' ') #define FOURCC_frma GST_MAKE_FOURCC('f','r','m','a') #define FOURCC_ctts GST_MAKE_FOURCC('c','t','t','s') #define FOURCC_drac GST_MAKE_FOURCC('d','r','a','c') #define FOURCC_jpeg GST_MAKE_FOURCC('j','p','e','g') #define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2') #define FOURCC_jp2h GST_MAKE_FOURCC('j','p','2','h') #define FOURCC_jp2c GST_MAKE_FOURCC('j','p','2','c') #define FOURCC_gama GST_MAKE_FOURCC('g','a','m','a') #define FOURCC_tvsh GST_MAKE_FOURCC('t','v','s','h') #define FOURCC_tven GST_MAKE_FOURCC('t','v','e','n') #define FOURCC_tvsn GST_MAKE_FOURCC('t','v','s','n') #define FOURCC_tves GST_MAKE_FOURCC('t','v','e','s') #define FOURCC_sonm GST_MAKE_FOURCC('s','o','n','m') #define FOURCC_soal GST_MAKE_FOURCC('s','o','a','l') #define FOURCC_soar GST_MAKE_FOURCC('s','o','a','r') #define FOURCC_soaa GST_MAKE_FOURCC('s','o','a','a') #define FOURCC_soco GST_MAKE_FOURCC('s','o','c','o') #define FOURCC_sosn GST_MAKE_FOURCC('s','o','s','n') #define FOURCC_XMP_ GST_MAKE_FOURCC('X','M','P','_') #define FOURCC_uuid GST_MAKE_FOURCC('u','u','i','d') /* SVQ3 fourcc */ #define FOURCC_SEQH GST_MAKE_FOURCC('S','E','Q','H') #define FOURCC_SMI_ GST_MAKE_FOURCC('S','M','I',' ') /* fragmented mp4 */ #define FOURCC_mvex GST_MAKE_FOURCC('m','v','e','x') #define FOURCC_mehd GST_MAKE_FOURCC('m','e','h','d') #define FOURCC_trex GST_MAKE_FOURCC('t','r','e','x') #define FOURCC_mfra GST_MAKE_FOURCC('m','f','r','a') #define FOURCC_moof GST_MAKE_FOURCC('m','o','o','f') #define FOURCC_tfra GST_MAKE_FOURCC('t','f','r','a') #define FOURCC_tfhd GST_MAKE_FOURCC('t','f','h','d') #define FOURCC_trun GST_MAKE_FOURCC('t','r','u','n') #define FOURCC_sdtp GST_MAKE_FOURCC('s','d','t','p') #define FOURCC_mfro GST_MAKE_FOURCC('m','f','r','o') #define FOURCC_mfhd GST_MAKE_FOURCC('m','f','h','d') #define FOURCC_mvhd GST_MAKE_FOURCC('m','v','h','d') #define FOURCC_traf GST_MAKE_FOURCC('t','r','a','f') #define FOURCC_btrt GST_MAKE_FOURCC('b','t','r','t') /* Xiph fourcc */ #define FOURCC_XiTh GST_MAKE_FOURCC('X','i','T','h') #define FOURCC_XdxT GST_MAKE_FOURCC('X','d','x','T') #define FOURCC_tCtH GST_MAKE_FOURCC('t','C','t','H') #define FOURCC_tCt_ GST_MAKE_FOURCC('t','C','t','#') #define FOURCC_tCtC GST_MAKE_FOURCC('t','C','t','C') /* ilst metatags */ #define FOURCC_titl GST_MAKE_FOURCC('t','i','t','l') #define FOURCC__cmt GST_MAKE_FOURCC(0xa9, 'c','m','t') /* 3gp tags */ #define FOURCC_dscp GST_MAKE_FOURCC('d','s','c','p') #define FOURCC_perf GST_MAKE_FOURCC('p','e','r','f') #define FOURCC_auth GST_MAKE_FOURCC('a','u','t','h') #define FOURCC_yrrc GST_MAKE_FOURCC('y','r','r','c') #define FOURCC_albm GST_MAKE_FOURCC('a','l','b','m') #define FOURCC_loci GST_MAKE_FOURCC('l','o','c','i') #define FOURCC_kywd GST_MAKE_FOURCC('k','y','w','d') #define FOURCC_clsf GST_MAKE_FOURCC('c','l','s','f') /* For Microsoft Wave formats embedded in quicktime, the FOURCC is 'm', 's', then the 16 bit wave codec id */ #define MS_WAVE_FOURCC(codecid) GST_MAKE_FOURCC( \ 'm', 's', ((codecid)>>8)&0xff, ((codecid)&0xff)) #define FOURCC_owma GST_MAKE_FOURCC('o','w','m','a') #define FOURCC_ovc1 GST_MAKE_FOURCC('o','v','c','1') G_END_DECLS #endif /* __FOURCC_H__ */ gst-plugins-good-0.10.31/gst/isomp4/gstrtpxqtdepay.h0000644000175000017500000000362211671175353017277 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_XQT_DEPAY_H__ #define __GST_RTP_XQT_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_XQT_DEPAY \ (gst_rtp_xqt_depay_get_type()) #define GST_RTP_XQT_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_XQT_DEPAY,GstRtpXQTDepay)) #define GST_RTP_XQT_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_XQT_DEPAY,GstRtpXQTDepayClass)) #define GST_IS_RTP_XQT_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_XQT_DEPAY)) #define GST_IS_RTP_XQT_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_XQT_DEPAY)) typedef struct _GstRtpXQTDepay GstRtpXQTDepay; typedef struct _GstRtpXQTDepayClass GstRtpXQTDepayClass; struct _GstRtpXQTDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; gboolean need_resync; guint16 previous_id; guint16 current_id; gboolean have_sd; }; struct _GstRtpXQTDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_xqt_depay_get_type (void); G_END_DECLS #endif /* __GST_RTP_XQT_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/isomp4/gstqtmux.h0000644000175000017500000001557311677341655016106 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008-2010 Thiago Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_QT_MUX_H__ #define __GST_QT_MUX_H__ #include #include #include "fourcc.h" #include "atoms.h" #include "atomsrecovery.h" #include "gstqtmuxmap.h" G_BEGIN_DECLS #define GST_TYPE_QT_MUX (gst_qt_mux_get_type()) #define GST_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QT_MUX, GstQTMux)) #define GST_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QT_MUX, GstQTMux)) #define GST_IS_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QT_MUX)) #define GST_IS_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QT_MUX)) #define GST_QT_MUX_CAST(obj) ((GstQTMux*)(obj)) typedef struct _GstQTMux GstQTMux; typedef struct _GstQTMuxClass GstQTMuxClass; typedef struct _GstQTPad GstQTPad; /* * GstQTPadPrepareBufferFunc * * Receives a buffer (takes ref) and returns a new buffer that should * replace the passed one. * * Useful for when the pad/datatype needs some manipulation before * being muxed. (Originally added for image/x-jpc support, for which buffers * need to be wrapped into a isom box) */ typedef GstBuffer * (*GstQTPadPrepareBufferFunc) (GstQTPad * pad, GstBuffer * buf, GstQTMux * qtmux); #define QTMUX_NO_OF_TS 10 struct _GstQTPad { GstCollectData collect; /* we extend the CollectData */ /* fourcc id of stream */ guint32 fourcc; /* whether using format that have out of order buffers */ gboolean is_out_of_order; /* whether upstream provides valid PTS data */ gboolean have_dts; /* if not 0, track with constant sized samples, e.g. raw audio */ guint sample_size; /* make sync table entry */ gboolean sync; /* bitrates */ guint32 avg_bitrate, max_bitrate; /* for avg bitrate calculation */ guint64 total_bytes; guint64 total_duration; GstBuffer *last_buf; /* dts of last_buf */ GstClockTime last_dts; /* store the first timestamp for comparing with other streams and * know if there are late streams */ GstClockTime first_ts; GstClockTime ts_entries[QTMUX_NO_OF_TS + 2]; guint ts_n_entries; GstBuffer *buf_entries[QTMUX_NO_OF_TS + 2]; guint buf_head; guint buf_tail; /* all the atom and chunk book-keeping is delegated here * unowned/uncounted reference, parent MOOV owns */ AtomTRAK *trak; /* fragmented support */ /* meta data book-keeping delegated here */ AtomTRAF *traf; /* fragment buffers */ ATOM_ARRAY (GstBuffer *) fragment_buffers; /* running fragment duration */ gint64 fragment_duration; /* optional fragment index book-keeping */ AtomTFRA *tfra; /* if nothing is set, it won't be called */ GstQTPadPrepareBufferFunc prepare_buf_func; }; typedef enum _GstQTMuxState { GST_QT_MUX_STATE_NONE, GST_QT_MUX_STATE_STARTED, GST_QT_MUX_STATE_DATA, GST_QT_MUX_STATE_EOS } GstQTMuxState; struct _GstQTMux { GstElement element; GstPad *srcpad; GstCollectPads *collect; GSList *sinkpads; /* state */ GstQTMuxState state; /* size of header (prefix, atoms (ftyp, mdat)) */ guint64 header_size; /* accumulated size of raw media data (a priori not including mdat header) */ guint64 mdat_size; /* position of mdat atom (for later updating) */ guint64 mdat_pos; /* keep track of the largest chunk to fine-tune brands */ GstClockTime longest_chunk; /* atom helper objects */ AtomsContext *context; AtomFTYP *ftyp; AtomMOOV *moov; GSList *extra_atoms; /* list of extra top-level atoms (e.g. UUID for xmp) * Stored as AtomInfo structs */ /* fragmented file index */ AtomMFRA *mfra; /* fast start */ FILE *fast_start_file; /* moov recovery */ FILE *moov_recov_file; /* fragment sequence */ guint32 fragment_sequence; /* properties */ guint32 timescale; guint32 trak_timescale; AtomsTreeFlavor flavor; gboolean fast_start; gboolean guess_pts; gint dts_method; gchar *fast_start_file_path; gchar *moov_recov_file_path; guint32 fragment_duration; gboolean streamable; /* for collect pads event handling function */ GstPadEventFunction collect_event; /* for request pad naming */ guint video_pads, audio_pads; }; struct _GstQTMuxClass { GstElementClass parent_class; GstQTMuxFormat format; }; /* type register helper struct */ typedef struct _GstQTMuxClassParams { GstQTMuxFormatProp *prop; GstCaps *src_caps; GstCaps *video_sink_caps; GstCaps *audio_sink_caps; } GstQTMuxClassParams; #define GST_QT_MUX_PARAMS_QDATA g_quark_from_static_string("qt-mux-params") GType gst_qt_mux_get_type (void); gboolean gst_qt_mux_register (GstPlugin * plugin); /* FIXME: ideally classification tag should be added and * registered in gstreamer core gsttaglist * * this tag is a string in the format: entityfourcc://table_num/content * FIXME Shouldn't we add a field for 'language'? */ #define GST_TAG_3GP_CLASSIFICATION "classification" G_END_DECLS #endif /* __GST_QT_MUX_H__ */ gst-plugins-good-0.10.31/gst/isomp4/qtdemux_dump.h0000644000175000017500000000653611671175353016717 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> STEricsson * * 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_QTDEMUX_DUMP_H__ #define __GST_QTDEMUX_DUMP_H__ #include #include G_BEGIN_DECLS gboolean qtdemux_dump_mvhd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_tkhd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_elst (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_mdhd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_hdlr (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_vmhd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_dref (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stts (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stss (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stps (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stsc (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stsz (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_stco (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_co64 (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_dcom (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_cmvd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_ctts (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_mfro (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_tfra (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_tfhd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_trun (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_trex (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_mehd (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_sdtp (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_dump_unknown (GstQTDemux * qtdemux, GstByteReader * data, int depth); gboolean qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node); G_END_DECLS #endif /* __GST_QTDEMUX_DUMP_H__ */ gst-plugins-good-0.10.31/gst/isomp4/atoms.h0000644000175000017500000006044611677341655015334 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008-2010 Thiago Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __ATOMS_H__ #define __ATOMS_H__ #include #include #include "descriptors.h" #include "properties.h" #include "fourcc.h" #include "ftypcc.h" /* helper storage struct */ #define ATOM_ARRAY(struct_type) \ struct { \ guint size; \ guint len; \ struct_type *data; \ } /* storage helpers */ #define atom_array_init(array, reserve) \ G_STMT_START { \ (array)->len = 0; \ (array)->size = reserve; \ (array)->data = g_malloc (sizeof (*(array)->data) * reserve); \ } G_STMT_END #define atom_array_append(array, elmt, inc) \ G_STMT_START { \ g_assert ((array)->data); \ g_assert (inc > 0); \ if (G_UNLIKELY ((array)->len == (array)->size)) { \ (array)->size += inc; \ (array)->data = \ g_realloc ((array)->data, sizeof (*((array)->data)) * (array)->size); \ } \ (array)->data[(array)->len] = elmt; \ (array)->len++; \ } G_STMT_END #define atom_array_get_len(array) ((array)->len) #define atom_array_index(array, index) ((array)->data[index]) #define atom_array_clear(array) \ G_STMT_START { \ (array)->size = (array)->len = 0; \ g_free ((array)->data); \ (array)->data = NULL; \ } G_STMT_END /* light-weight context that may influence header atom tree construction */ typedef enum _AtomsTreeFlavor { ATOMS_TREE_FLAVOR_MOV, ATOMS_TREE_FLAVOR_ISOM, ATOMS_TREE_FLAVOR_3GP, ATOMS_TREE_FLAVOR_ISML } AtomsTreeFlavor; typedef struct _AtomsContext { AtomsTreeFlavor flavor; } AtomsContext; AtomsContext* atoms_context_new (AtomsTreeFlavor flavor); void atoms_context_free (AtomsContext *context); #define METADATA_DATA_FLAG 0x0 #define METADATA_TEXT_FLAG 0x1 /* atom defs and functions */ /** * Used for storing time related values for some atoms. */ typedef struct _TimeInfo { guint64 creation_time; guint64 modification_time; guint32 timescale; guint64 duration; } TimeInfo; typedef struct _Atom { guint32 size; guint32 type; guint64 extended_size; } Atom; typedef struct _AtomFull { Atom header; guint8 version; guint8 flags[3]; } AtomFull; /* * Generic extension atom */ typedef struct _AtomData { Atom header; /* not written */ guint32 datalen; guint8 *data; } AtomData; typedef struct _AtomUUID { Atom header; guint8 uuid[16]; /* not written */ guint32 datalen; guint8 *data; } AtomUUID; typedef struct _AtomFTYP { Atom header; guint32 major_brand; guint32 version; guint32 *compatible_brands; /* not written */ guint32 compatible_brands_size; } AtomFTYP; typedef struct _AtomMVHD { AtomFull header; /* version 0: 32 bits */ TimeInfo time_info; guint32 prefered_rate; /* ISO: 0x00010000 */ guint16 volume; /* ISO: 0x0100 */ guint16 reserved3; /* ISO: 0x0 */ guint32 reserved4[2]; /* ISO: 0, 0 */ /* ISO: identity matrix = * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */ guint32 matrix[9]; /* ISO: all 0 */ guint32 preview_time; guint32 preview_duration; guint32 poster_time; guint32 selection_time; guint32 selection_duration; guint32 current_time; guint32 next_track_id; } AtomMVHD; typedef struct _AtomTKHD { AtomFull header; /* version 0: 32 bits */ /* like the TimeInfo struct, but it has this track_ID inside */ guint64 creation_time; guint64 modification_time; guint32 track_ID; guint32 reserved; guint64 duration; guint32 reserved2[2]; guint16 layer; guint16 alternate_group; guint16 volume; guint16 reserved3; /* ISO: identity matrix = * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */ guint32 matrix[9]; guint32 width; guint32 height; } AtomTKHD; typedef struct _AtomMDHD { AtomFull header; /* version 0: 32 bits */ TimeInfo time_info; /* ISO: packed ISO-639-2/T language code (first bit must be 0) */ guint16 language_code; /* ISO: 0 */ guint16 quality; } AtomMDHD; typedef struct _AtomHDLR { AtomFull header; /* ISO: 0 */ guint32 component_type; guint32 handler_type; guint32 manufacturer; guint32 flags; guint32 flags_mask; gchar *name; } AtomHDLR; typedef struct _AtomVMHD { AtomFull header; /* ISO: flags = 1 */ guint16 graphics_mode; /* RGB */ guint16 opcolor[3]; } AtomVMHD; typedef struct _AtomSMHD { AtomFull header; guint16 balance; guint16 reserved; } AtomSMHD; typedef struct _AtomHMHD { AtomFull header; guint16 max_pdu_size; guint16 avg_pdu_size; guint32 max_bitrate; guint32 avg_bitrate; guint32 sliding_avg_bitrate; } AtomHMHD; typedef struct _AtomURL { AtomFull header; gchar *location; } AtomURL; typedef struct _AtomDREF { AtomFull header; GList *entries; } AtomDREF; typedef struct _AtomDINF { Atom header; AtomDREF dref; } AtomDINF; typedef struct _STTSEntry { guint32 sample_count; gint32 sample_delta; } STTSEntry; typedef struct _AtomSTTS { AtomFull header; ATOM_ARRAY (STTSEntry) entries; } AtomSTTS; typedef struct _AtomSTSS { AtomFull header; ATOM_ARRAY (guint32) entries; } AtomSTSS; typedef struct _AtomESDS { AtomFull header; ESDescriptor es; } AtomESDS; typedef struct _AtomFRMA { Atom header; guint32 media_type; } AtomFRMA; typedef enum _SampleEntryKind { UNKNOWN, AUDIO, VIDEO } SampleEntryKind; typedef struct _SampleTableEntry { Atom header; guint8 reserved[6]; guint16 data_reference_index; /* sort of entry */ SampleEntryKind kind; } SampleTableEntry; typedef struct _AtomHintSampleEntry { SampleTableEntry se; guint32 size; guint8 *data; } AtomHintSampleEntry; typedef struct _SampleTableEntryMP4V { SampleTableEntry se; guint16 version; guint16 revision_level; guint32 vendor; /* fourcc code */ guint32 temporal_quality; guint32 spatial_quality; guint16 width; guint16 height; guint32 horizontal_resolution; guint32 vertical_resolution; guint32 datasize; guint16 frame_count; /* usually 1 */ guint8 compressor[32]; /* pascal string, i.e. first byte = length */ guint16 depth; guint16 color_table_id; /* (optional) list of AtomInfo */ GList *extension_atoms; } SampleTableEntryMP4V; typedef struct _SampleTableEntryMP4A { SampleTableEntry se; guint16 version; guint16 revision_level; guint32 vendor; guint16 channels; guint16 sample_size; guint16 compression_id; guint16 packet_size; guint32 sample_rate; /* fixed point 16.16 */ guint32 samples_per_packet; guint32 bytes_per_packet; guint32 bytes_per_frame; guint32 bytes_per_sample; /* (optional) list of AtomInfo */ GList *extension_atoms; } SampleTableEntryMP4A; typedef struct _SampleTableEntryMP4S { SampleTableEntry se; AtomESDS es; } SampleTableEntryMP4S; typedef struct _AtomSTSD { AtomFull header; guint n_entries; /* list of subclasses of SampleTableEntry */ GList *entries; } AtomSTSD; typedef struct _AtomSTSZ { AtomFull header; guint32 sample_size; /* need the size here because when sample_size is constant, * the list is empty */ guint32 table_size; ATOM_ARRAY (guint32) entries; } AtomSTSZ; typedef struct _STSCEntry { guint32 first_chunk; guint32 samples_per_chunk; guint32 sample_description_index; } STSCEntry; typedef struct _AtomSTSC { AtomFull header; ATOM_ARRAY (STSCEntry) entries; } AtomSTSC; /* * used for both STCO and CO64 * if used as STCO, entries should be truncated to use only 32bits */ typedef struct _AtomSTCO64 { AtomFull header; ATOM_ARRAY (guint64) entries; } AtomSTCO64; typedef struct _CTTSEntry { guint32 samplecount; guint32 sampleoffset; } CTTSEntry; typedef struct _AtomCTTS { AtomFull header; /* also entry count here */ ATOM_ARRAY (CTTSEntry) entries; gboolean do_pts; } AtomCTTS; typedef struct _AtomSTBL { Atom header; AtomSTSD stsd; AtomSTTS stts; AtomSTSS stss; AtomSTSC stsc; AtomSTSZ stsz; /* NULL if not present */ AtomCTTS *ctts; AtomSTCO64 stco64; } AtomSTBL; typedef struct _AtomMINF { Atom header; /* only (exactly) one of those must be present */ AtomVMHD *vmhd; AtomSMHD *smhd; AtomHMHD *hmhd; AtomHDLR *hdlr; AtomDINF dinf; AtomSTBL stbl; } AtomMINF; typedef struct _EditListEntry { /* duration in movie's timescale */ guint32 duration; /* start time in media's timescale, -1 for empty */ guint32 media_time; guint32 media_rate; /* fixed point 32 bit */ } EditListEntry; typedef struct _AtomELST { AtomFull header; /* number of entries is implicit */ GSList *entries; } AtomELST; typedef struct _AtomEDTS { Atom header; AtomELST elst; } AtomEDTS; typedef struct _AtomMDIA { Atom header; AtomMDHD mdhd; AtomHDLR hdlr; AtomMINF minf; } AtomMDIA; typedef struct _AtomILST { Atom header; /* list of AtomInfo */ GList* entries; } AtomILST; typedef struct _AtomTagData { AtomFull header; guint32 reserved; guint32 datalen; guint8* data; } AtomTagData; typedef struct _AtomTag { Atom header; AtomTagData data; } AtomTag; typedef struct _AtomMETA { AtomFull header; AtomHDLR hdlr; AtomILST *ilst; } AtomMETA; typedef struct _AtomUDTA { Atom header; /* list of AtomInfo */ GList* entries; /* or list is further down */ AtomMETA *meta; } AtomUDTA; enum TrFlags { TR_DATA_OFFSET = 0x01, /* data-offset-present */ TR_FIRST_SAMPLE_FLAGS = 0x04, /* first-sample-flags-present */ TR_SAMPLE_DURATION = 0x0100, /* sample-duration-present */ TR_SAMPLE_SIZE = 0x0200, /* sample-size-present */ TR_SAMPLE_FLAGS = 0x0400, /* sample-flags-present */ TR_COMPOSITION_TIME_OFFSETS = 0x0800 /* sample-composition-time-offsets-presents */ }; enum TfFlags { TF_BASE_DATA_OFFSET = 0x01, /* base-data-offset-present */ TF_SAMPLE_DESCRIPTION_INDEX = 0x02, /* sample-description-index-present */ TF_DEFAULT_SAMPLE_DURATION = 0x08, /* default-sample-duration-present */ TF_DEFAULT_SAMPLE_SIZE = 0x010, /* default-sample-size-present */ TF_DEFAULT_SAMPLE_FLAGS = 0x020, /* default-sample-flags-present */ TF_DURATION_IS_EMPTY = 0x010000 /* sample-composition-time-offsets-presents */ }; typedef struct _AtomTRAK { Atom header; AtomTKHD tkhd; AtomEDTS *edts; AtomMDIA mdia; /* some helper info for structural conformity checks */ gboolean is_video; gboolean is_h264; } AtomTRAK; typedef struct _AtomTREX { AtomFull header; guint32 track_ID; guint32 default_sample_description_index; guint32 default_sample_duration; guint32 default_sample_size; guint32 default_sample_flags; } AtomTREX; typedef struct _AtomMEHD { AtomFull header; guint64 fragment_duration; } AtomMEHD; typedef struct _AtomMVEX { Atom header; AtomMEHD mehd; /* list of AtomTREX */ GList *trexs; } AtomMVEX; typedef struct _AtomMFHD { AtomFull header; guint32 sequence_number; } AtomMFHD; typedef struct _AtomTFHD { AtomFull header; guint32 track_ID; guint64 base_data_offset; guint32 sample_description_index; guint32 default_sample_duration; guint32 default_sample_size; guint32 default_sample_flags; } AtomTFHD; typedef struct _TRUNSampleEntry { guint32 sample_duration; guint32 sample_size; guint32 sample_flags; guint32 sample_composition_time_offset; } TRUNSampleEntry; typedef struct _AtomTRUN { AtomFull header; guint32 sample_count; gint32 data_offset; guint32 first_sample_flags; /* array of fields */ ATOM_ARRAY (TRUNSampleEntry) entries; } AtomTRUN; typedef struct _AtomSDTP { AtomFull header; /* not serialized */ guint32 sample_count; /* array of fields */ ATOM_ARRAY (guint8) entries; } AtomSDTP; typedef struct _AtomTRAF { Atom header; AtomTFHD tfhd; /* list of AtomTRUN */ GList *truns; /* list of AtomSDTP */ GList *sdtps; } AtomTRAF; typedef struct _AtomMOOF { Atom header; AtomMFHD mfhd; /* list of AtomTRAF */ GList *trafs; } AtomMOOF; typedef struct _AtomMOOV { /* style */ AtomsContext context; Atom header; AtomMVHD mvhd; AtomMVEX mvex; /* list of AtomTRAK */ GList *traks; AtomUDTA *udta; gboolean fragmented; } AtomMOOV; typedef struct _AtomWAVE { Atom header; /* list of AtomInfo */ GList *extension_atoms; } AtomWAVE; typedef struct _TFRAEntry { guint64 time; guint64 moof_offset; guint32 traf_number; guint32 trun_number; guint32 sample_number; } TFRAEntry; typedef struct _AtomTFRA { AtomFull header; guint32 track_ID; guint32 lengths; /* array of entries */ ATOM_ARRAY (TFRAEntry) entries; } AtomTFRA; typedef struct _AtomMFRA { Atom header; /* list of tfra */ GList *tfras; } AtomMFRA; /* * Function to serialize an atom */ typedef guint64 (*AtomCopyDataFunc) (Atom *atom, guint8 **buffer, guint64 *size, guint64 *offset); /* * Releases memory allocated by an atom */ typedef guint64 (*AtomFreeFunc) (Atom *atom); /* * Some atoms might have many optional different kinds of child atoms, so this * is useful for enabling generic handling of any atom. * All we need are the two functions (copying it to an array * for serialization and the memory releasing function). */ typedef struct _AtomInfo { Atom *atom; AtomCopyDataFunc copy_data_func; AtomFreeFunc free_func; } AtomInfo; guint64 atom_copy_data (Atom *atom, guint8 **buffer, guint64 *size, guint64* offset); AtomFTYP* atom_ftyp_new (AtomsContext *context, guint32 major, guint32 version, GList *brands); guint64 atom_ftyp_copy_data (AtomFTYP *ftyp, guint8 **buffer, guint64 *size, guint64 *offset); void atom_ftyp_free (AtomFTYP *ftyp); AtomTRAK* atom_trak_new (AtomsContext *context); void atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset); void atom_trak_add_elst_entry (AtomTRAK * trak, guint32 duration, guint32 media_time, guint32 rate); guint32 atom_trak_get_timescale (AtomTRAK *trak); guint32 atom_trak_get_id (AtomTRAK * trak); void atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset); AtomMOOV* atom_moov_new (AtomsContext *context); void atom_moov_free (AtomMOOV *moov); guint64 atom_moov_copy_data (AtomMOOV *atom, guint8 **buffer, guint64 *size, guint64* offset); void atom_moov_update_timescale (AtomMOOV *moov, guint32 timescale); void atom_moov_update_duration (AtomMOOV *moov); void atom_moov_set_fragmented (AtomMOOV *moov, gboolean fragmented); void atom_moov_chunks_add_offset (AtomMOOV *moov, guint32 offset); void atom_moov_add_trak (AtomMOOV *moov, AtomTRAK *trak); guint64 atom_mvhd_copy_data (AtomMVHD * atom, guint8 ** buffer, guint64 * size, guint64 * offset); void atom_stco64_chunks_add_offset (AtomSTCO64 * stco64, guint32 offset); guint64 atom_trak_copy_data (AtomTRAK * atom, guint8 ** buffer, guint64 * size, guint64 * offset); void atom_stbl_clear (AtomSTBL * stbl); void atom_stbl_init (AtomSTBL * stbl); guint64 atom_stss_copy_data (AtomSTSS *atom, guint8 **buffer, guint64 *size, guint64* offset); guint64 atom_stts_copy_data (AtomSTTS *atom, guint8 **buffer, guint64 *size, guint64* offset); guint64 atom_stsc_copy_data (AtomSTSC *atom, guint8 **buffer, guint64 *size, guint64* offset); guint64 atom_stsz_copy_data (AtomSTSZ *atom, guint8 **buffer, guint64 *size, guint64* offset); guint64 atom_ctts_copy_data (AtomCTTS *atom, guint8 **buffer, guint64 *size, guint64* offset); guint64 atom_stco64_copy_data (AtomSTCO64 *atom, guint8 **buffer, guint64 *size, guint64* offset); AtomMOOF* atom_moof_new (AtomsContext *context, guint32 sequence_number); void atom_moof_free (AtomMOOF *moof); guint64 atom_moof_copy_data (AtomMOOF *moof, guint8 **buffer, guint64 *size, guint64* offset); AtomTRAF * atom_traf_new (AtomsContext * context, guint32 track_ID); void atom_traf_free (AtomTRAF * traf); void atom_traf_add_samples (AtomTRAF * traf, guint32 delta, guint32 size, gboolean sync, gint64 pts_offset, gboolean sdtp_sync); guint32 atom_traf_get_sample_num (AtomTRAF * traf); void atom_moof_add_traf (AtomMOOF *moof, AtomTRAF *traf); AtomMFRA* atom_mfra_new (AtomsContext *context); void atom_mfra_free (AtomMFRA *mfra); AtomTFRA* atom_tfra_new (AtomsContext *context, guint32 track_ID); void atom_tfra_add_entry (AtomTFRA *tfra, guint64 dts, guint32 sample_num); void atom_tfra_update_offset (AtomTFRA * tfra, guint64 offset); void atom_mfra_add_tfra (AtomMFRA *mfra, AtomTFRA *tfra); guint64 atom_mfra_copy_data (AtomMFRA *mfra, guint8 **buffer, guint64 *size, guint64* offset); /* media sample description related helpers */ typedef struct { guint16 version; guint32 fourcc; guint width; guint height; guint depth; guint frame_count; gint color_table_id; guint par_n; guint par_d; GstBuffer *codec_data; } VisualSampleEntry; typedef struct { guint32 fourcc; guint version; gint compression_id; guint sample_rate; guint channels; guint sample_size; guint bytes_per_packet; guint samples_per_packet; guint bytes_per_sample; guint bytes_per_frame; GstBuffer *codec_data; } AudioSampleEntry; void atom_trak_set_audio_type (AtomTRAK * trak, AtomsContext * context, AudioSampleEntry * entry, guint32 scale, AtomInfo * ext, gint sample_size); void atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context, VisualSampleEntry * entry, guint32 rate, GList * ext_atoms_list); void atom_trak_update_bitrates (AtomTRAK * trak, guint32 avg_bitrate, guint32 max_bitrate); AtomInfo * build_codec_data_extension (guint32 fourcc, const GstBuffer * codec_data); AtomInfo * build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data, guint32 avg_bitrate, guint32 max_bitrate); AtomInfo * build_mov_alac_extension (AtomTRAK * trak, const GstBuffer * codec_data); AtomInfo * build_esds_extension (AtomTRAK * trak, guint8 object_type, guint8 stream_type, const GstBuffer * codec_data, guint32 avg_bitrate, guint32 max_bitrate); AtomInfo * build_btrt_extension (guint32 buffer_size_db, guint32 avg_bitrate, guint32 max_bitrate); AtomInfo * build_jp2h_extension (AtomTRAK * trak, gint width, gint height, guint32 fourcc, gint ncomp, const GValue * cmap_array, const GValue * cdef_array); AtomInfo * build_jp2x_extension (const GstBuffer * prefix); AtomInfo * build_fiel_extension (gint fields); AtomInfo * build_amr_extension (void); AtomInfo * build_h263_extension (void); AtomInfo * build_gama_atom (gdouble gamma); AtomInfo * build_SMI_atom (const GstBuffer *seqh); AtomInfo * build_ima_adpcm_extension (gint channels, gint rate, gint blocksize); AtomInfo * build_uuid_xmp_atom (GstBuffer * xmp); /* * Meta tags functions */ void atom_moov_add_str_tag (AtomMOOV *moov, guint32 fourcc, const gchar *value); void atom_moov_add_uint_tag (AtomMOOV *moov, guint32 fourcc, guint32 flags, guint32 value); void atom_moov_add_tag (AtomMOOV *moov, guint32 fourcc, guint32 flags, const guint8 * data, guint size); void atom_moov_add_blob_tag (AtomMOOV *moov, guint8 *data, guint size); void atom_moov_add_3gp_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value); void atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value); void atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value, gint16 ivalue); void atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data, guint size); void atom_moov_add_xmp_tags (AtomMOOV * moov, GstBuffer * xmp); #define GST_QT_MUX_DEFAULT_TAG_LANGUAGE "eng" guint16 language_code (const char * lang); #endif /* __ATOMS_H__ */ gst-plugins-good-0.10.31/gst/isomp4/descriptors.c0000644000175000017500000002744711671175353016543 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008 Thiago Sousa Santos * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #include "descriptors.h" /* * Some mp4 structures (descriptors) use a coding scheme for * representing its size. * It is grouped in bytes. The 1st bit set to 1 means we need another byte, * 0 otherwise. The remaining 7 bits are the useful values. * * The next set of functions handle those values */ /* * Gets an unsigned integer and packs it into a 'expandable size' format * (as used by mp4 descriptors) * @size: the integer to be parsed * @ptr: the array to place the result * @array_size: the size of ptr array */ static void expandable_size_parse (guint64 size, guint8 * ptr, guint32 array_size) { int index = 0; memset (ptr, 0, sizeof (array_size)); while (size > 0 && index < array_size) { ptr[index++] = (size > 0x7F ? 0x80 : 0x0) | (size & 0x7F); size = size >> 7; } } /* * Gets how many positions in an array holding an 'expandable size' * are really used * * @ptr: the array with the 'expandable size' * @array_size: the size of ptr array * * Returns: the number of really used positions */ static guint64 expandable_size_get_length (guint8 * ptr, guint32 array_size) { gboolean next = TRUE; guint32 index = 0; while (next && index < array_size) { next = ((ptr[index] & 0x80) == 1); index++; } return index; } /* * Initializers below */ static void desc_base_descriptor_init (BaseDescriptor * bd, guint8 tag, guint32 size) { bd->tag = tag; expandable_size_parse (size, bd->size, 4); } static void desc_dec_specific_info_init (DecoderSpecificInfoDescriptor * dsid) { desc_base_descriptor_init (&dsid->base, DECODER_SPECIFIC_INFO_TAG, 0); dsid->length = 0; dsid->data = NULL; } DecoderSpecificInfoDescriptor * desc_dec_specific_info_new (void) { DecoderSpecificInfoDescriptor *desc = g_new0 (DecoderSpecificInfoDescriptor, 1); desc_dec_specific_info_init (desc); return desc; } static void desc_dec_conf_desc_init (DecoderConfigDescriptor * dcd) { desc_base_descriptor_init (&dcd->base, DECODER_CONFIG_DESC_TAG, 0); dcd->dec_specific_info = NULL; } static void desc_sl_conf_desc_init (SLConfigDescriptor * sl) { desc_base_descriptor_init (&sl->base, SL_CONFIG_DESC_TAG, 0); sl->predefined = 0x2; } void desc_es_init (ESDescriptor * es) { desc_base_descriptor_init (&es->base, ES_DESCRIPTOR_TAG, 0); es->id = 0; es->flags = 0; es->depends_on_es_id = 0; es->ocr_es_id = 0; es->url_length = 0; es->url_string = NULL; desc_dec_conf_desc_init (&es->dec_conf_desc); desc_sl_conf_desc_init (&es->sl_conf_desc); } ESDescriptor * desc_es_descriptor_new (void) { ESDescriptor *es = g_new0 (ESDescriptor, 1); desc_es_init (es); return es; } /* * Deinitializers/Destructors below */ static void desc_base_descriptor_clear (BaseDescriptor * base) { } void desc_dec_specific_info_free (DecoderSpecificInfoDescriptor * dsid) { desc_base_descriptor_clear (&dsid->base); if (dsid->data) { g_free (dsid->data); dsid->data = NULL; } g_free (dsid); } static void desc_dec_conf_desc_clear (DecoderConfigDescriptor * dec) { desc_base_descriptor_clear (&dec->base); if (dec->dec_specific_info) { desc_dec_specific_info_free (dec->dec_specific_info); } } static void desc_sl_config_descriptor_clear (SLConfigDescriptor * sl) { desc_base_descriptor_clear (&sl->base); } void desc_es_descriptor_clear (ESDescriptor * es) { desc_base_descriptor_clear (&es->base); if (es->url_string) { g_free (es->url_string); es->url_string = NULL; } desc_dec_conf_desc_clear (&es->dec_conf_desc); desc_sl_config_descriptor_clear (&es->sl_conf_desc); } /* * Size handling functions below */ void desc_dec_specific_info_alloc_data (DecoderSpecificInfoDescriptor * dsid, guint32 size) { if (dsid->data) { g_free (dsid->data); } dsid->data = g_new0 (guint8, size); dsid->length = size; } static void desc_base_descriptor_set_size (BaseDescriptor * bd, guint32 size) { expandable_size_parse (size, bd->size, 4); } static guint64 desc_base_descriptor_get_size (BaseDescriptor * bd) { guint64 size = 0; size += sizeof (guint8); size += expandable_size_get_length (bd->size, 4) * sizeof (guint8); return size; } static guint64 desc_sl_config_descriptor_get_size (SLConfigDescriptor * sl_desc) { guint64 size = 0; guint64 extra_size = 0; size += desc_base_descriptor_get_size (&sl_desc->base); /* predefined */ extra_size += sizeof (guint8); desc_base_descriptor_set_size (&sl_desc->base, extra_size); return size + extra_size; } static guint64 desc_dec_specific_info_get_size (DecoderSpecificInfoDescriptor * dsid) { guint64 size = 0; guint64 extra_size = 0; size += desc_base_descriptor_get_size (&dsid->base); extra_size += sizeof (guint8) * dsid->length; desc_base_descriptor_set_size (&dsid->base, extra_size); return size + extra_size; } static guint64 desc_dec_config_descriptor_get_size (DecoderConfigDescriptor * dec_desc) { guint64 size = 0; guint64 extra_size = 0; size += desc_base_descriptor_get_size (&dec_desc->base); /* object type */ extra_size += sizeof (guint8); /* stream type */ extra_size += sizeof (guint8); /* buffer size */ extra_size += sizeof (guint8) * 3; /* max bitrate */ extra_size += sizeof (guint32); /* avg bitrate */ extra_size += sizeof (guint32); if (dec_desc->dec_specific_info) { extra_size += desc_dec_specific_info_get_size (dec_desc->dec_specific_info); } desc_base_descriptor_set_size (&dec_desc->base, extra_size); return size + extra_size; } static guint64 desc_es_descriptor_get_size (ESDescriptor * es) { guint64 size = 0; guint64 extra_size = 0; size += desc_base_descriptor_get_size (&es->base); /* id */ extra_size += sizeof (guint16); /* flags */ extra_size += sizeof (guint8); /* depends_on_es_id */ if (es->flags & 0x80) { extra_size += sizeof (guint16); } if (es->flags & 0x40) { /* url_length */ extra_size += sizeof (guint8); /* url */ extra_size += sizeof (gchar) * es->url_length; } if (es->flags & 0x20) { /* ocr_es_id */ extra_size += sizeof (guint16); } extra_size += desc_dec_config_descriptor_get_size (&es->dec_conf_desc); extra_size += desc_sl_config_descriptor_get_size (&es->sl_conf_desc); desc_base_descriptor_set_size (&es->base, extra_size); return size + extra_size; } static gboolean desc_es_descriptor_check_stream_dependency (ESDescriptor * es) { return es->flags & 0x80; } static gboolean desc_es_descriptor_check_url_flag (ESDescriptor * es) { return es->flags & 0x40; } static gboolean desc_es_descriptor_check_ocr (ESDescriptor * es) { return es->flags & 0x20; } /* Copy/Serializations Functions below */ static guint64 desc_base_descriptor_copy_data (BaseDescriptor * desc, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; prop_copy_uint8 (desc->tag, buffer, size, offset); prop_copy_uint8_array (desc->size, expandable_size_get_length (desc->size, 4), buffer, size, offset); return original_offset - *offset; } static guint64 desc_sl_config_descriptor_copy_data (SLConfigDescriptor * desc, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { return 0; } /* predefined attribute */ prop_copy_uint8 (desc->predefined, buffer, size, offset); return *offset - original_offset; } static guint64 desc_dec_specific_info_copy_data (DecoderSpecificInfoDescriptor * desc, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { return 0; } prop_copy_uint8_array (desc->data, desc->length, buffer, size, offset); return *offset - original_offset; } static guint64 desc_dec_config_descriptor_copy_data (DecoderConfigDescriptor * desc, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { return 0; } prop_copy_uint8 (desc->object_type, buffer, size, offset); prop_copy_uint8 (desc->stream_type, buffer, size, offset); prop_copy_uint8_array (desc->buffer_size_DB, 3, buffer, size, offset); prop_copy_uint32 (desc->max_bitrate, buffer, size, offset); prop_copy_uint32 (desc->avg_bitrate, buffer, size, offset); if (desc->dec_specific_info) { if (!desc_dec_specific_info_copy_data (desc->dec_specific_info, buffer, size, offset)) { return 0; } } return *offset - original_offset; } guint64 desc_es_descriptor_copy_data (ESDescriptor * desc, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; /* must call this twice to have size fields of all contained descriptors set * correctly, and to have the size of the size fields taken into account */ desc_es_descriptor_get_size (desc); desc_es_descriptor_get_size (desc); if (!desc_base_descriptor_copy_data (&desc->base, buffer, size, offset)) { return 0; } /* id and flags */ prop_copy_uint16 (desc->id, buffer, size, offset); prop_copy_uint8 (desc->flags, buffer, size, offset); if (desc_es_descriptor_check_stream_dependency (desc)) { prop_copy_uint16 (desc->depends_on_es_id, buffer, size, offset); } if (desc_es_descriptor_check_url_flag (desc)) { prop_copy_size_string (desc->url_string, desc->url_length, buffer, size, offset); } if (desc_es_descriptor_check_ocr (desc)) { prop_copy_uint16 (desc->ocr_es_id, buffer, size, offset); } if (!desc_dec_config_descriptor_copy_data (&desc->dec_conf_desc, buffer, size, offset)) { return 0; } if (!desc_sl_config_descriptor_copy_data (&desc->sl_conf_desc, buffer, size, offset)) { return 0; } return *offset - original_offset; } gst-plugins-good-0.10.31/gst/isomp4/gstqtmux.c0000644000175000017500000034266211701411452016060 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008-2010 Thiago Santos * Copyright (C) 2008 Mark Nauwelaerts * Copyright (C) 2010 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ /** * SECTION:element-qtmux * @short_description: Muxer for quicktime(.mov) files * * This element merges streams (audio and video) into QuickTime(.mov) files. * * The following background intends to explain why various similar muxers * are present in this plugin. * * The * QuickTime file format specification served as basis for the MP4 file * format specification (mp4mux), and as such the QuickTime file structure is * nearly identical to the so-called ISO Base Media file format defined in * ISO 14496-12 (except for some media specific parts). * In turn, the latter ISO Base Media format was further specialized as a * Motion JPEG-2000 file format in ISO 15444-3 (mj2mux) * and in various 3GPP(2) specs (gppmux). * The fragmented file features defined (only) in ISO Base Media are used by * ISMV files making up (a.o.) Smooth Streaming (ismlmux). * * A few properties (movie-timescale, * trak-timescale) allow adjusting * some technical parameters, which might be useful in (rare) cases to resolve * compatibility issues in some situations. * * Some other properties influence the result more fundamentally. * A typical mov/mp4 file's metadata (aka moov) is located at the end of the file, * somewhat contrary to this usually being called "the header". * However, a faststart file will * (with some effort) arrange this to be located near start of the file, * which then allows it e.g. to be played while downloading. * Alternatively, rather than having one chunk of metadata at start (or end), * there can be some metadata at start and most of the other data can be spread * out into fragments of fragment-duration. * If such fragmented layout is intended for streaming purposes, then * streamable allows foregoing to add * index metadata (at the end of file). * * dts-method allows selecting a * method for managing input timestamps (stay tuned for 0.11 to have this * automagically settled). The default delta/duration method should handle nice * (aka perfect streams) just fine, but may experience problems otherwise * (e.g. input stream with re-ordered B-frames and/or with frame dropping). * The re-ordering approach re-assigns incoming timestamps in ascending order * to incoming buffers and offers an alternative in such cases. In cases where * that might fail, the remaining method can be tried, which is exact and * according to specs, but might experience playback on not so spec-wise players. * Note that this latter approach also requires one to enable * presentation-timestamp. * * * Example pipelines * |[ * gst-launch v4l2src num-buffers=500 ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! qtmux ! filesink location=video.mov * ]| * Records a video stream captured from a v4l2 device and muxes it into a qt file. * * * Last reviewed on 2010-12-03 */ /* * Based on avimux */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #ifdef G_OS_WIN32 #include /* lseek, open, close, read */ #undef lseek #define lseek _lseeki64 #undef off_t #define off_t guint64 #endif #ifdef _MSC_VER #define ftruncate g_win32_ftruncate #endif #ifdef HAVE_UNISTD_H # include #endif #include "gstqtmux.h" GST_DEBUG_CATEGORY_STATIC (gst_qt_mux_debug); #define GST_CAT_DEFAULT gst_qt_mux_debug enum { DTS_METHOD_DD, DTS_METHOD_REORDER, DTS_METHOD_ASC }; static GType gst_qt_mux_dts_method_get_type (void) { static GType gst_qt_mux_dts_method = 0; if (!gst_qt_mux_dts_method) { static const GEnumValue dts_methods[] = { {DTS_METHOD_DD, "delta/duration", "dd"}, {DTS_METHOD_REORDER, "reorder", "reorder"}, {DTS_METHOD_ASC, "ascending", "asc"}, {0, NULL, NULL}, }; gst_qt_mux_dts_method = g_enum_register_static ("GstQTMuxDtsMethods", dts_methods); } return gst_qt_mux_dts_method; } #define GST_TYPE_QT_MUX_DTS_METHOD \ (gst_qt_mux_dts_method_get_type ()) /* QTMux signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_MOVIE_TIMESCALE, PROP_TRAK_TIMESCALE, PROP_FAST_START, PROP_FAST_START_TEMP_FILE, PROP_MOOV_RECOV_FILE, PROP_FRAGMENT_DURATION, PROP_STREAMABLE, PROP_DTS_METHOD, PROP_DO_CTTS, }; /* some spare for header size as well */ #define MDAT_LARGE_FILE_LIMIT ((guint64) 1024 * 1024 * 1024 * 2) #define MAX_TOLERATED_LATENESS (GST_SECOND / 10) #define DEFAULT_MOVIE_TIMESCALE 1000 #define DEFAULT_TRAK_TIMESCALE 0 #define DEFAULT_DO_CTTS TRUE #define DEFAULT_FAST_START FALSE #define DEFAULT_FAST_START_TEMP_FILE NULL #define DEFAULT_MOOV_RECOV_FILE NULL #define DEFAULT_FRAGMENT_DURATION 0 #define DEFAULT_STREAMABLE FALSE #define DEFAULT_DTS_METHOD DTS_METHOD_REORDER static void gst_qt_mux_finalize (GObject * object); static GstStateChangeReturn gst_qt_mux_change_state (GstElement * element, GstStateChange transition); /* property functions */ static void gst_qt_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_qt_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* pad functions */ static GstPad *gst_qt_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_qt_mux_release_pad (GstElement * element, GstPad * pad); /* event */ static gboolean gst_qt_mux_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_qt_mux_collected (GstCollectPads * pads, gpointer user_data); static GstFlowReturn gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf); static GstElementClass *parent_class = NULL; static void gst_qt_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstQTMuxClass *klass = (GstQTMuxClass *) g_class; GstQTMuxClassParams *params; GstPadTemplate *videosinktempl, *audiosinktempl, *srctempl; gchar *longname, *description; params = (GstQTMuxClassParams *) g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class), GST_QT_MUX_PARAMS_QDATA); g_assert (params != NULL); /* construct the element details struct */ longname = g_strdup_printf ("%s Muxer", params->prop->long_name); description = g_strdup_printf ("Multiplex audio and video into a %s file%s", params->prop->long_name, (params->prop->rank == GST_RANK_NONE) ? " (deprecated)" : ""); gst_element_class_set_details_simple (element_class, longname, "Codec/Muxer", description, "Thiago Sousa Santos "); g_free (longname); g_free (description); /* pad templates */ srctempl = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, params->src_caps); gst_element_class_add_pad_template (element_class, srctempl); gst_object_unref (srctempl); if (params->audio_sink_caps) { audiosinktempl = gst_pad_template_new ("audio_%d", GST_PAD_SINK, GST_PAD_REQUEST, params->audio_sink_caps); gst_element_class_add_pad_template (element_class, audiosinktempl); gst_object_unref (audiosinktempl); } if (params->video_sink_caps) { videosinktempl = gst_pad_template_new ("video_%d", GST_PAD_SINK, GST_PAD_REQUEST, params->video_sink_caps); gst_element_class_add_pad_template (element_class, videosinktempl); gst_object_unref (videosinktempl); } klass->format = params->prop->format; } static void gst_qt_mux_class_init (GstQTMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_qt_mux_finalize; gobject_class->get_property = gst_qt_mux_get_property; gobject_class->set_property = gst_qt_mux_set_property; g_object_class_install_property (gobject_class, PROP_MOVIE_TIMESCALE, g_param_spec_uint ("movie-timescale", "Movie timescale", "Timescale to use in the movie (units per second)", 1, G_MAXUINT32, DEFAULT_MOVIE_TIMESCALE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TRAK_TIMESCALE, g_param_spec_uint ("trak-timescale", "Track timescale", "Timescale to use for the tracks (units per second, 0 is automatic)", 0, G_MAXUINT32, DEFAULT_TRAK_TIMESCALE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DO_CTTS, g_param_spec_boolean ("presentation-time", "Include presentation-time info", "Calculate and include presentation/composition time " "(in addition to decoding time)", DEFAULT_DO_CTTS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DTS_METHOD, g_param_spec_enum ("dts-method", "dts-method", "Method to determine DTS time", GST_TYPE_QT_MUX_DTS_METHOD, DEFAULT_DTS_METHOD, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FAST_START, g_param_spec_boolean ("faststart", "Format file to faststart", "If the file should be formatted for faststart (headers first)", DEFAULT_FAST_START, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FAST_START_TEMP_FILE, g_param_spec_string ("faststart-file", "File to use for storing buffers", "File that will be used temporarily to store data from the stream " "when creating a faststart file. If null a filepath will be " "created automatically", DEFAULT_FAST_START_TEMP_FILE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MOOV_RECOV_FILE, g_param_spec_string ("moov-recovery-file", "File to store data for posterior moov atom recovery", "File to be used to store " "data for moov atom making movie file recovery possible in case " "of a crash during muxing. Null for disabled. (Experimental)", DEFAULT_MOOV_RECOV_FILE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FRAGMENT_DURATION, g_param_spec_uint ("fragment-duration", "Fragment duration", "Fragment durations in ms (produce a fragmented file if > 0)", 0, G_MAXUINT32, klass->format == GST_QT_MUX_FORMAT_ISML ? 2000 : DEFAULT_FRAGMENT_DURATION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_STREAMABLE, g_param_spec_boolean ("streamable", "Streamable", "If set to true, the output should be as if it is to be streamed " "and hence no indexes written or duration written.", DEFAULT_STREAMABLE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_qt_mux_request_new_pad); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_qt_mux_change_state); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_qt_mux_release_pad); } static void gst_qt_mux_pad_reset (GstQTPad * qtpad) { gint i; qtpad->fourcc = 0; qtpad->is_out_of_order = FALSE; qtpad->have_dts = FALSE; qtpad->sample_size = 0; qtpad->sync = FALSE; qtpad->last_dts = 0; qtpad->first_ts = GST_CLOCK_TIME_NONE; qtpad->prepare_buf_func = NULL; qtpad->avg_bitrate = 0; qtpad->max_bitrate = 0; qtpad->ts_n_entries = 0; qtpad->total_duration = 0; qtpad->total_bytes = 0; qtpad->buf_head = 0; qtpad->buf_tail = 0; for (i = 0; i < G_N_ELEMENTS (qtpad->buf_entries); i++) { if (qtpad->buf_entries[i]) { gst_buffer_unref (qtpad->buf_entries[i]); qtpad->buf_entries[i] = NULL; } } if (qtpad->last_buf) gst_buffer_replace (&qtpad->last_buf, NULL); /* reference owned elsewhere */ qtpad->trak = NULL; if (qtpad->traf) { atom_traf_free (qtpad->traf); qtpad->traf = NULL; } atom_array_clear (&qtpad->fragment_buffers); /* reference owned elsewhere */ qtpad->tfra = NULL; } /* * Takes GstQTMux back to its initial state */ static void gst_qt_mux_reset (GstQTMux * qtmux, gboolean alloc) { GSList *walk; qtmux->state = GST_QT_MUX_STATE_NONE; qtmux->header_size = 0; qtmux->mdat_size = 0; qtmux->mdat_pos = 0; qtmux->longest_chunk = GST_CLOCK_TIME_NONE; qtmux->video_pads = 0; qtmux->audio_pads = 0; qtmux->fragment_sequence = 0; if (qtmux->ftyp) { atom_ftyp_free (qtmux->ftyp); qtmux->ftyp = NULL; } if (qtmux->moov) { atom_moov_free (qtmux->moov); qtmux->moov = NULL; } if (qtmux->mfra) { atom_mfra_free (qtmux->mfra); qtmux->mfra = NULL; } if (qtmux->fast_start_file) { fclose (qtmux->fast_start_file); g_remove (qtmux->fast_start_file_path); qtmux->fast_start_file = NULL; } if (qtmux->moov_recov_file) { fclose (qtmux->moov_recov_file); qtmux->moov_recov_file = NULL; } for (walk = qtmux->extra_atoms; walk; walk = g_slist_next (walk)) { AtomInfo *ainfo = (AtomInfo *) walk->data; ainfo->free_func (ainfo->atom); g_free (ainfo); } g_slist_free (qtmux->extra_atoms); qtmux->extra_atoms = NULL; GST_OBJECT_LOCK (qtmux); gst_tag_setter_reset_tags (GST_TAG_SETTER (qtmux)); GST_OBJECT_UNLOCK (qtmux); /* reset pad data */ for (walk = qtmux->sinkpads; walk; walk = g_slist_next (walk)) { GstQTPad *qtpad = (GstQTPad *) walk->data; gst_qt_mux_pad_reset (qtpad); /* hm, moov_free above yanked the traks away from us, * so do not free, but do clear */ qtpad->trak = NULL; } if (alloc) { qtmux->moov = atom_moov_new (qtmux->context); /* ensure all is as nice and fresh as request_new_pad would provide it */ for (walk = qtmux->sinkpads; walk; walk = g_slist_next (walk)) { GstQTPad *qtpad = (GstQTPad *) walk->data; qtpad->trak = atom_trak_new (qtmux->context); atom_moov_add_trak (qtmux->moov, qtpad->trak); } } } static void gst_qt_mux_init (GstQTMux * qtmux, GstQTMuxClass * qtmux_klass) { GstElementClass *klass = GST_ELEMENT_CLASS (qtmux_klass); GstPadTemplate *templ; templ = gst_element_class_get_pad_template (klass, "src"); qtmux->srcpad = gst_pad_new_from_template (templ, "src"); gst_pad_use_fixed_caps (qtmux->srcpad); gst_element_add_pad (GST_ELEMENT (qtmux), qtmux->srcpad); qtmux->sinkpads = NULL; qtmux->collect = gst_collect_pads_new (); gst_collect_pads_set_function (qtmux->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_qt_mux_collected), qtmux); /* properties set to default upon construction */ /* always need this */ qtmux->context = atoms_context_new (gst_qt_mux_map_format_to_flavor (qtmux_klass->format)); /* internals to initial state */ gst_qt_mux_reset (qtmux, TRUE); } static void gst_qt_mux_finalize (GObject * object) { GstQTMux *qtmux = GST_QT_MUX_CAST (object); gst_qt_mux_reset (qtmux, FALSE); g_free (qtmux->fast_start_file_path); g_free (qtmux->moov_recov_file_path); atoms_context_free (qtmux->context); gst_object_unref (qtmux->collect); g_slist_free (qtmux->sinkpads); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstBuffer * gst_qt_mux_prepare_jpc_buffer (GstQTPad * qtpad, GstBuffer * buf, GstQTMux * qtmux) { GstBuffer *newbuf; GST_LOG_OBJECT (qtmux, "Preparing jpc buffer"); if (buf == NULL) return NULL; newbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (buf) + 8); gst_buffer_copy_metadata (newbuf, buf, GST_BUFFER_COPY_ALL); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (newbuf), GST_BUFFER_SIZE (newbuf)); GST_WRITE_UINT32_LE (GST_BUFFER_DATA (newbuf) + 4, FOURCC_jp2c); memcpy (GST_BUFFER_DATA (newbuf) + 8, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); gst_buffer_unref (buf); return newbuf; } static void gst_qt_mux_add_mp4_tag (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { switch (gst_tag_get_type (tag)) { /* strings */ case G_TYPE_STRING: { gchar *str = NULL; if (!gst_tag_list_get_string (list, tag, &str) || !str) break; GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", GST_FOURCC_ARGS (fourcc), str); atom_moov_add_str_tag (qtmux->moov, fourcc, str); g_free (str); break; } /* double */ case G_TYPE_DOUBLE: { gdouble value; if (!gst_tag_list_get_double (list, tag, &value)) break; GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u", GST_FOURCC_ARGS (fourcc), (gint) value); atom_moov_add_uint_tag (qtmux->moov, fourcc, 21, (gint) value); break; } case G_TYPE_UINT: { guint value = 0; if (tag2) { /* paired unsigned integers */ guint count = 0; gboolean got_tag; got_tag = gst_tag_list_get_uint (list, tag, &value); got_tag = gst_tag_list_get_uint (list, tag2, &count) || got_tag; if (!got_tag) break; GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u/%u", GST_FOURCC_ARGS (fourcc), value, count); atom_moov_add_uint_tag (qtmux->moov, fourcc, 0, value << 16 | (count & 0xFFFF)); } else { /* unpaired unsigned integers */ if (!gst_tag_list_get_uint (list, tag, &value)) break; GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %u", GST_FOURCC_ARGS (fourcc), value); atom_moov_add_uint_tag (qtmux->moov, fourcc, 1, value); } break; } default: g_assert_not_reached (); break; } } static void gst_qt_mux_add_mp4_date (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { GDate *date = NULL; GDateYear year; GDateMonth month; GDateDay day; gchar *str; g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_DATE); if (!gst_tag_list_get_date (list, tag, &date) || !date) return; year = g_date_get_year (date); month = g_date_get_month (date); day = g_date_get_day (date); g_date_free (date); if (year == G_DATE_BAD_YEAR && month == G_DATE_BAD_MONTH && day == G_DATE_BAD_DAY) { GST_WARNING_OBJECT (qtmux, "invalid date in tag"); return; } str = g_strdup_printf ("%u-%u-%u", year, month, day); GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", GST_FOURCC_ARGS (fourcc), str); atom_moov_add_str_tag (qtmux->moov, fourcc, str); g_free (str); } static void gst_qt_mux_add_mp4_cover (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { GValue value = { 0, }; GstBuffer *buf; GstCaps *caps; GstStructure *structure; gint flags = 0; g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_BUFFER); if (!gst_tag_list_copy_value (&value, list, tag)) return; buf = gst_value_get_buffer (&value); if (!buf) goto done; caps = gst_buffer_get_caps (buf); if (!caps) { GST_WARNING_OBJECT (qtmux, "preview image without caps"); goto done; } GST_DEBUG_OBJECT (qtmux, "preview image caps %" GST_PTR_FORMAT, caps); structure = gst_caps_get_structure (caps, 0); if (gst_structure_has_name (structure, "image/jpeg")) flags = 13; else if (gst_structure_has_name (structure, "image/png")) flags = 14; gst_caps_unref (caps); if (!flags) { GST_WARNING_OBJECT (qtmux, "preview image format not supported"); goto done; } GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> image size %d", GST_FOURCC_ARGS (fourcc), GST_BUFFER_SIZE (buf)); atom_moov_add_tag (qtmux->moov, fourcc, flags, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); done: g_value_unset (&value); } static void gst_qt_mux_add_3gp_str (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { gchar *str = NULL; guint number; g_return_if_fail (gst_tag_get_type (tag) == G_TYPE_STRING); g_return_if_fail (!tag2 || gst_tag_get_type (tag2) == G_TYPE_UINT); if (!gst_tag_list_get_string (list, tag, &str) || !str) return; if (tag2) if (!gst_tag_list_get_uint (list, tag2, &number)) tag2 = NULL; if (!tag2) { GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", GST_FOURCC_ARGS (fourcc), str); atom_moov_add_3gp_str_tag (qtmux->moov, fourcc, str); } else { GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s/%d", GST_FOURCC_ARGS (fourcc), str, number); atom_moov_add_3gp_str_int_tag (qtmux->moov, fourcc, str, number); } g_free (str); } static void gst_qt_mux_add_3gp_date (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { GDate *date = NULL; GDateYear year; g_return_if_fail (gst_tag_get_type (tag) == GST_TYPE_DATE); if (!gst_tag_list_get_date (list, tag, &date) || !date) return; year = g_date_get_year (date); if (year == G_DATE_BAD_YEAR) { GST_WARNING_OBJECT (qtmux, "invalid date in tag"); return; } GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %d", GST_FOURCC_ARGS (fourcc), year); atom_moov_add_3gp_uint_tag (qtmux->moov, fourcc, year); } static void gst_qt_mux_add_3gp_location (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { gdouble latitude = -360, longitude = -360, altitude = 0; gchar *location = NULL; guint8 *data, *ddata; gint size = 0, len = 0; gboolean ret = FALSE; g_return_if_fail (strcmp (tag, GST_TAG_GEO_LOCATION_NAME) == 0); ret = gst_tag_list_get_string (list, tag, &location); ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_LONGITUDE, &longitude); ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_LATITUDE, &latitude); ret |= gst_tag_list_get_double (list, GST_TAG_GEO_LOCATION_ELEVATION, &altitude); if (!ret) return; if (location) len = strlen (location); size += len + 1 + 2; /* role + (long, lat, alt) + body + notes */ size += 1 + 3 * 4 + 1 + 1; data = ddata = g_malloc (size); /* language tag */ GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); /* location */ if (location) memcpy (data + 2, location, len); GST_WRITE_UINT8 (data + 2 + len, 0); data += len + 1 + 2; /* role */ GST_WRITE_UINT8 (data, 0); /* long, lat, alt */ #define QT_WRITE_SFP32(data, fp) GST_WRITE_UINT32_BE(data, (guint32) ((gint) (fp * 65536.0))) QT_WRITE_SFP32 (data + 1, longitude); QT_WRITE_SFP32 (data + 5, latitude); QT_WRITE_SFP32 (data + 9, altitude); /* neither astronomical body nor notes */ GST_WRITE_UINT16_BE (data + 13, 0); GST_DEBUG_OBJECT (qtmux, "Adding tag 'loci'"); atom_moov_add_3gp_tag (qtmux->moov, fourcc, ddata, size); g_free (ddata); } static void gst_qt_mux_add_3gp_keywords (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { gchar *keywords = NULL; guint8 *data, *ddata; gint size = 0, i; gchar **kwds; g_return_if_fail (strcmp (tag, GST_TAG_KEYWORDS) == 0); if (!gst_tag_list_get_string (list, tag, &keywords) || !keywords) return; kwds = g_strsplit (keywords, ",", 0); g_free (keywords); size = 0; for (i = 0; kwds[i]; i++) { /* size byte + null-terminator */ size += strlen (kwds[i]) + 1 + 1; } /* language tag + count + keywords */ size += 2 + 1; data = ddata = g_malloc (size); /* language tag */ GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); /* count */ GST_WRITE_UINT8 (data + 2, i); data += 3; /* keywords */ for (i = 0; kwds[i]; ++i) { gint len = strlen (kwds[i]); GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", GST_FOURCC_ARGS (fourcc), kwds[i]); /* size */ GST_WRITE_UINT8 (data, len + 1); memcpy (data + 1, kwds[i], len + 1); data += len + 2; } g_strfreev (kwds); atom_moov_add_3gp_tag (qtmux->moov, fourcc, ddata, size); g_free (ddata); } static gboolean gst_qt_mux_parse_classification_string (GstQTMux * qtmux, const gchar * input, guint32 * p_fourcc, guint16 * p_table, gchar ** p_content) { guint32 fourcc; gint table; gint size; const gchar *data; data = input; size = strlen (input); if (size < 4 + 3 + 1 + 1 + 1) { /* at least the minimum xxxx://y/z */ GST_WARNING_OBJECT (qtmux, "Classification tag input (%s) too short, " "ignoring", input); return FALSE; } /* read the fourcc */ memcpy (&fourcc, data, 4); size -= 4; data += 4; if (strncmp (data, "://", 3) != 0) { goto mismatch; } data += 3; size -= 3; /* read the table number */ if (sscanf (data, "%d", &table) != 1) { goto mismatch; } if (table < 0) { GST_WARNING_OBJECT (qtmux, "Invalid table number in classification tag (%d)" ", table numbers should be positive, ignoring tag", table); return FALSE; } /* find the next / */ while (size > 0 && data[0] != '/') { data += 1; size -= 1; } if (size == 0) { goto mismatch; } g_assert (data[0] == '/'); /* skip the '/' */ data += 1; size -= 1; if (size == 0) { goto mismatch; } /* read up the rest of the string */ *p_content = g_strdup (data); *p_table = (guint16) table; *p_fourcc = fourcc; return TRUE; mismatch: { GST_WARNING_OBJECT (qtmux, "Ignoring classification tag as " "input (%s) didn't match the expected entitycode://table/content", input); return FALSE; } } static void gst_qt_mux_add_3gp_classification (GstQTMux * qtmux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc) { gchar *clsf_data = NULL; gint size = 0; guint32 entity = 0; guint16 table = 0; gchar *content = NULL; guint8 *data; g_return_if_fail (strcmp (tag, GST_TAG_3GP_CLASSIFICATION) == 0); if (!gst_tag_list_get_string (list, tag, &clsf_data) || !clsf_data) return; GST_DEBUG_OBJECT (qtmux, "Adding tag %" GST_FOURCC_FORMAT " -> %s", GST_FOURCC_ARGS (fourcc), clsf_data); /* parse the string, format is: * entityfourcc://table/content */ gst_qt_mux_parse_classification_string (qtmux, clsf_data, &entity, &table, &content); g_free (clsf_data); /* +1 for the \0 */ size = strlen (content) + 1; /* now we have everything, build the atom * atom description is at 3GPP TS 26.244 V8.2.0 (2009-09) */ data = g_malloc (4 + 2 + 2 + size); GST_WRITE_UINT32_LE (data, entity); GST_WRITE_UINT16_BE (data + 4, (guint16) table); GST_WRITE_UINT16_BE (data + 6, 0); memcpy (data + 8, content, size); g_free (content); atom_moov_add_3gp_tag (qtmux->moov, fourcc, data, 4 + 2 + 2 + size); g_free (data); } typedef void (*GstQTMuxAddTagFunc) (GstQTMux * mux, const GstTagList * list, const char *tag, const char *tag2, guint32 fourcc); /* * Struct to record mappings from gstreamer tags to fourcc codes */ typedef struct _GstTagToFourcc { guint32 fourcc; const gchar *gsttag; const gchar *gsttag2; const GstQTMuxAddTagFunc func; } GstTagToFourcc; /* tag list tags to fourcc matching */ static const GstTagToFourcc tag_matches_mp4[] = { {FOURCC__alb, GST_TAG_ALBUM, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_soal, GST_TAG_ALBUM_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__ART, GST_TAG_ARTIST, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_soar, GST_TAG_ARTIST_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_aART, GST_TAG_ALBUM_ARTIST, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_soaa, GST_TAG_ALBUM_ARTIST_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__cmt, GST_TAG_COMMENT, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__wrt, GST_TAG_COMPOSER, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_soco, GST_TAG_COMPOSER_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_tvsh, GST_TAG_SHOW_NAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_sosn, GST_TAG_SHOW_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_tvsn, GST_TAG_SHOW_SEASON_NUMBER, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_tves, GST_TAG_SHOW_EPISODE_NUMBER, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__gen, GST_TAG_GENRE, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__nam, GST_TAG_TITLE, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_sonm, GST_TAG_TITLE_SORTNAME, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_perf, GST_TAG_PERFORMER, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__grp, GST_TAG_GROUPING, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__des, GST_TAG_DESCRIPTION, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__lyr, GST_TAG_LYRICS, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__too, GST_TAG_ENCODER, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_keyw, GST_TAG_KEYWORDS, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC__day, GST_TAG_DATE, NULL, gst_qt_mux_add_mp4_date}, {FOURCC_tmpo, GST_TAG_BEATS_PER_MINUTE, NULL, gst_qt_mux_add_mp4_tag}, {FOURCC_trkn, GST_TAG_TRACK_NUMBER, GST_TAG_TRACK_COUNT, gst_qt_mux_add_mp4_tag}, {FOURCC_disk, GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_ALBUM_VOLUME_COUNT, gst_qt_mux_add_mp4_tag}, {FOURCC_covr, GST_TAG_PREVIEW_IMAGE, NULL, gst_qt_mux_add_mp4_cover}, {FOURCC_covr, GST_TAG_IMAGE, NULL, gst_qt_mux_add_mp4_cover}, {0, NULL,} }; static const GstTagToFourcc tag_matches_3gp[] = { {FOURCC_titl, GST_TAG_TITLE, NULL, gst_qt_mux_add_3gp_str}, {FOURCC_dscp, GST_TAG_DESCRIPTION, NULL, gst_qt_mux_add_3gp_str}, {FOURCC_cprt, GST_TAG_COPYRIGHT, NULL, gst_qt_mux_add_3gp_str}, {FOURCC_perf, GST_TAG_ARTIST, NULL, gst_qt_mux_add_3gp_str}, {FOURCC_auth, GST_TAG_COMPOSER, NULL, gst_qt_mux_add_3gp_str}, {FOURCC_gnre, GST_TAG_GENRE, NULL, gst_qt_mux_add_3gp_str}, {FOURCC_kywd, GST_TAG_KEYWORDS, NULL, gst_qt_mux_add_3gp_keywords}, {FOURCC_yrrc, GST_TAG_DATE, NULL, gst_qt_mux_add_3gp_date}, {FOURCC_albm, GST_TAG_ALBUM, GST_TAG_TRACK_NUMBER, gst_qt_mux_add_3gp_str}, {FOURCC_loci, GST_TAG_GEO_LOCATION_NAME, NULL, gst_qt_mux_add_3gp_location}, {FOURCC_clsf, GST_TAG_3GP_CLASSIFICATION, NULL, gst_qt_mux_add_3gp_classification}, {0, NULL,} }; /* qtdemux produces these for atoms it cannot parse */ #define GST_QT_DEMUX_PRIVATE_TAG "private-qt-tag" static void gst_qt_mux_add_xmp_tags (GstQTMux * qtmux, const GstTagList * list) { GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); GstBuffer *xmp = NULL; /* adobe specs only have 'quicktime' and 'mp4', * but I guess we can extrapolate to gpp. * Keep mj2 out for now as we don't add any tags for it yet. * If you have further info about xmp on these formats, please share */ if (qtmux_klass->format == GST_QT_MUX_FORMAT_MJ2) return; GST_DEBUG_OBJECT (qtmux, "Adding xmp tags"); if (qtmux_klass->format == GST_QT_MUX_FORMAT_QT) { xmp = gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (qtmux), list, TRUE); if (xmp) atom_moov_add_xmp_tags (qtmux->moov, xmp); } else { AtomInfo *ainfo; /* for isom/mp4, it is a top level uuid atom */ xmp = gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (qtmux), list, TRUE); if (xmp) { ainfo = build_uuid_xmp_atom (xmp); if (ainfo) { qtmux->extra_atoms = g_slist_prepend (qtmux->extra_atoms, ainfo); } } } if (xmp) gst_buffer_unref (xmp); } static void gst_qt_mux_add_metadata_tags (GstQTMux * qtmux, const GstTagList * list) { GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); guint32 fourcc; gint i; const gchar *tag, *tag2; const GstTagToFourcc *tag_matches; switch (qtmux_klass->format) { case GST_QT_MUX_FORMAT_3GP: tag_matches = tag_matches_3gp; break; case GST_QT_MUX_FORMAT_MJ2: tag_matches = NULL; break; default: /* sort of iTunes style for mp4 and QT (?) */ tag_matches = tag_matches_mp4; break; } if (!tag_matches) return; for (i = 0; tag_matches[i].fourcc; i++) { fourcc = tag_matches[i].fourcc; tag = tag_matches[i].gsttag; tag2 = tag_matches[i].gsttag2; g_assert (tag_matches[i].func); tag_matches[i].func (qtmux, list, tag, tag2, fourcc); } /* add unparsed blobs if present */ if (gst_tag_exists (GST_QT_DEMUX_PRIVATE_TAG)) { guint num_tags; num_tags = gst_tag_list_get_tag_size (list, GST_QT_DEMUX_PRIVATE_TAG); for (i = 0; i < num_tags; ++i) { const GValue *val; GstBuffer *buf; GstCaps *caps = NULL; val = gst_tag_list_get_value_index (list, GST_QT_DEMUX_PRIVATE_TAG, i); buf = (GstBuffer *) gst_value_get_mini_object (val); if (buf && (caps = gst_buffer_get_caps (buf))) { GstStructure *s; const gchar *style = NULL; GST_DEBUG_OBJECT (qtmux, "Found private tag %d/%d; size %d, caps %" GST_PTR_FORMAT, i, num_tags, GST_BUFFER_SIZE (buf), caps); s = gst_caps_get_structure (caps, 0); if (s && (style = gst_structure_get_string (s, "style"))) { /* try to prevent some style tag ending up into another variant * (todo: make into a list if more cases) */ if ((strcmp (style, "itunes") == 0 && qtmux_klass->format == GST_QT_MUX_FORMAT_MP4) || (strcmp (style, "iso") == 0 && qtmux_klass->format == GST_QT_MUX_FORMAT_3GP)) { GST_DEBUG_OBJECT (qtmux, "Adding private tag"); atom_moov_add_blob_tag (qtmux->moov, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } } gst_caps_unref (caps); } } } return; } /* * Gets the tagsetter iface taglist and puts the known tags * into the output stream */ static void gst_qt_mux_setup_metadata (GstQTMux * qtmux) { const GstTagList *tags; GST_OBJECT_LOCK (qtmux); tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (qtmux)); GST_OBJECT_UNLOCK (qtmux); GST_LOG_OBJECT (qtmux, "tags: %" GST_PTR_FORMAT, tags); if (tags && !gst_tag_list_is_empty (tags)) { GstTagList *copy = gst_tag_list_copy (tags); GST_DEBUG_OBJECT (qtmux, "Removing bogus tags"); gst_tag_list_remove_tag (copy, GST_TAG_VIDEO_CODEC); gst_tag_list_remove_tag (copy, GST_TAG_AUDIO_CODEC); gst_tag_list_remove_tag (copy, GST_TAG_CONTAINER_FORMAT); GST_DEBUG_OBJECT (qtmux, "Formatting tags"); gst_qt_mux_add_metadata_tags (qtmux, copy); gst_qt_mux_add_xmp_tags (qtmux, copy); gst_tag_list_free (copy); } else { GST_DEBUG_OBJECT (qtmux, "No tags received"); } } static inline GstBuffer * _gst_buffer_new_take_data (guint8 * data, guint size) { GstBuffer *buf; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data; GST_BUFFER_SIZE (buf) = size; return buf; } static GstFlowReturn gst_qt_mux_send_buffer (GstQTMux * qtmux, GstBuffer * buf, guint64 * offset, gboolean mind_fast) { GstFlowReturn res; guint8 *data; guint size; g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); GST_LOG_OBJECT (qtmux, "sending buffer size %d", size); if (mind_fast && qtmux->fast_start_file) { gint ret; GST_LOG_OBJECT (qtmux, "to temporary file"); ret = fwrite (data, sizeof (guint8), size, qtmux->fast_start_file); gst_buffer_unref (buf); if (ret != size) goto write_error; else res = GST_FLOW_OK; } else { GST_LOG_OBJECT (qtmux, "downstream"); buf = gst_buffer_make_metadata_writable (buf); gst_buffer_set_caps (buf, GST_PAD_CAPS (qtmux->srcpad)); res = gst_pad_push (qtmux->srcpad, buf); } if (G_LIKELY (offset)) *offset += size; return res; /* ERRORS */ write_error: { GST_ELEMENT_ERROR (qtmux, RESOURCE, WRITE, ("Failed to write to temporary file"), GST_ERROR_SYSTEM); return GST_FLOW_ERROR; } } static gboolean gst_qt_mux_seek_to_beginning (FILE * f) { #ifdef HAVE_FSEEKO if (fseeko (f, (off_t) 0, SEEK_SET) != 0) return FALSE; #elif defined (G_OS_UNIX) || defined (G_OS_WIN32) if (lseek (fileno (f), (off_t) 0, SEEK_SET) == (off_t) - 1) return FALSE; #else if (fseek (f, (long) 0, SEEK_SET) != 0) return FALSE; #endif return TRUE; } static GstFlowReturn gst_qt_mux_send_buffered_data (GstQTMux * qtmux, guint64 * offset) { GstFlowReturn ret = GST_FLOW_OK; GstBuffer *buf = NULL; if (fflush (qtmux->fast_start_file)) goto flush_failed; if (!gst_qt_mux_seek_to_beginning (qtmux->fast_start_file)) goto seek_failed; /* hm, this could all take a really really long time, * but there may not be another way to get moov atom first * (somehow optimize copy?) */ GST_DEBUG_OBJECT (qtmux, "Sending buffered data"); while (ret == GST_FLOW_OK) { gint r; const int bufsize = 4096; buf = gst_buffer_new_and_alloc (bufsize); r = fread (GST_BUFFER_DATA (buf), sizeof (guint8), bufsize, qtmux->fast_start_file); if (r == 0) break; GST_BUFFER_SIZE (buf) = r; GST_LOG_OBJECT (qtmux, "Pushing buffered buffer of size %d", r); ret = gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); buf = NULL; } if (buf) gst_buffer_unref (buf); if (ftruncate (fileno (qtmux->fast_start_file), 0)) goto seek_failed; if (!gst_qt_mux_seek_to_beginning (qtmux->fast_start_file)) goto seek_failed; return ret; /* ERRORS */ flush_failed: { GST_ELEMENT_ERROR (qtmux, RESOURCE, WRITE, ("Failed to flush temporary file"), GST_ERROR_SYSTEM); ret = GST_FLOW_ERROR; goto fail; } seek_failed: { GST_ELEMENT_ERROR (qtmux, RESOURCE, SEEK, ("Failed to seek temporary file"), GST_ERROR_SYSTEM); ret = GST_FLOW_ERROR; goto fail; } fail: { /* clear descriptor so we don't remove temp file later on, * might be possible to recover */ fclose (qtmux->fast_start_file); qtmux->fast_start_file = NULL; return ret; } } /* * Sends the initial mdat atom fields (size fields and fourcc type), * the subsequent buffers are considered part of it's data. * As we can't predict the amount of data that we are going to place in mdat * we need to record the position of the size field in the stream so we can * seek back to it later and update when the streams have finished. */ static GstFlowReturn gst_qt_mux_send_mdat_header (GstQTMux * qtmux, guint64 * off, guint64 size, gboolean extended) { Atom *node_header; GstBuffer *buf; guint8 *data = NULL; guint64 offset = 0; GST_DEBUG_OBJECT (qtmux, "Sending mdat's atom header, " "size %" G_GUINT64_FORMAT, size); node_header = g_malloc0 (sizeof (Atom)); node_header->type = FOURCC_mdat; if (extended) { /* use extended size */ node_header->size = 1; node_header->extended_size = 0; if (size) node_header->extended_size = size + 16; } else { node_header->size = size + 8; } size = offset = 0; if (atom_copy_data (node_header, &data, &size, &offset) == 0) goto serialize_error; buf = _gst_buffer_new_take_data (data, offset); g_free (node_header); GST_LOG_OBJECT (qtmux, "Pushing mdat start"); return gst_qt_mux_send_buffer (qtmux, buf, off, FALSE); /* ERRORS */ serialize_error: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Failed to serialize mdat")); return GST_FLOW_ERROR; } } /* * We get the position of the mdat size field, seek back to it * and overwrite with the real value */ static GstFlowReturn gst_qt_mux_update_mdat_size (GstQTMux * qtmux, guint64 mdat_pos, guint64 mdat_size, guint64 * offset) { GstEvent *event; GstBuffer *buf; gboolean large_file; large_file = (mdat_size > MDAT_LARGE_FILE_LIMIT); if (large_file) mdat_pos += 8; /* seek and rewrite the header */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, mdat_pos, GST_CLOCK_TIME_NONE, 0); gst_pad_push_event (qtmux->srcpad, event); if (large_file) { buf = gst_buffer_new_and_alloc (sizeof (guint64)); GST_WRITE_UINT64_BE (GST_BUFFER_DATA (buf), mdat_size + 16); } else { guint8 *data; buf = gst_buffer_new_and_alloc (16); data = GST_BUFFER_DATA (buf); GST_WRITE_UINT32_BE (data, 8); GST_WRITE_UINT32_LE (data + 4, FOURCC_free); GST_WRITE_UINT32_BE (data + 8, mdat_size + 8); GST_WRITE_UINT32_LE (data + 12, FOURCC_mdat); } return gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); } static GstFlowReturn gst_qt_mux_send_ftyp (GstQTMux * qtmux, guint64 * off) { GstBuffer *buf; guint64 size = 0, offset = 0; guint8 *data = NULL; GST_DEBUG_OBJECT (qtmux, "Sending ftyp atom"); if (!atom_ftyp_copy_data (qtmux->ftyp, &data, &size, &offset)) goto serialize_error; buf = _gst_buffer_new_take_data (data, offset); GST_LOG_OBJECT (qtmux, "Pushing ftyp"); return gst_qt_mux_send_buffer (qtmux, buf, off, FALSE); /* ERRORS */ serialize_error: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Failed to serialize ftyp")); return GST_FLOW_ERROR; } } static void gst_qt_mux_prepare_ftyp (GstQTMux * qtmux, AtomFTYP ** p_ftyp, GstBuffer ** p_prefix) { GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); guint32 major, version; GList *comp; GstBuffer *prefix = NULL; AtomFTYP *ftyp = NULL; GST_DEBUG_OBJECT (qtmux, "Preparing ftyp and possible prefix atom"); /* init and send context and ftyp based on current property state */ gst_qt_mux_map_format_to_header (qtmux_klass->format, &prefix, &major, &version, &comp, qtmux->moov, qtmux->longest_chunk, qtmux->fast_start_file != NULL); ftyp = atom_ftyp_new (qtmux->context, major, version, comp); if (comp) g_list_free (comp); if (prefix) { if (p_prefix) *p_prefix = prefix; else gst_buffer_unref (prefix); } *p_ftyp = ftyp; } static GstFlowReturn gst_qt_mux_prepare_and_send_ftyp (GstQTMux * qtmux) { GstFlowReturn ret = GST_FLOW_OK; GstBuffer *prefix = NULL; GST_DEBUG_OBJECT (qtmux, "Preparing to send ftyp atom"); /* init and send context and ftyp based on current property state */ if (qtmux->ftyp) { atom_ftyp_free (qtmux->ftyp); qtmux->ftyp = NULL; } gst_qt_mux_prepare_ftyp (qtmux, &qtmux->ftyp, &prefix); if (prefix) { ret = gst_qt_mux_send_buffer (qtmux, prefix, &qtmux->header_size, FALSE); if (ret != GST_FLOW_OK) return ret; } return gst_qt_mux_send_ftyp (qtmux, &qtmux->header_size); } static void gst_qt_mux_set_header_on_caps (GstQTMux * mux, GstBuffer * buf) { GstStructure *structure; GValue array = { 0 }; GValue value = { 0 }; GstCaps *caps; caps = gst_caps_copy (GST_PAD_CAPS (mux->srcpad)); structure = gst_caps_get_structure (caps, 0); g_value_init (&array, GST_TYPE_ARRAY); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); g_value_init (&value, GST_TYPE_BUFFER); gst_value_take_buffer (&value, gst_buffer_ref (buf)); gst_value_array_append_value (&array, &value); g_value_unset (&value); gst_structure_set_value (structure, "streamheader", &array); g_value_unset (&array); gst_pad_set_caps (mux->srcpad, caps); gst_caps_unref (caps); } static void gst_qt_mux_configure_moov (GstQTMux * qtmux, guint32 * _timescale) { gboolean fragmented; guint32 timescale; GST_OBJECT_LOCK (qtmux); timescale = qtmux->timescale; fragmented = qtmux->fragment_sequence > 0; GST_OBJECT_UNLOCK (qtmux); /* inform lower layers of our property wishes, and determine duration. * Let moov take care of this using its list of traks; * so that released pads are also included */ GST_DEBUG_OBJECT (qtmux, "Updating timescale to %" G_GUINT32_FORMAT, timescale); atom_moov_update_timescale (qtmux->moov, timescale); atom_moov_set_fragmented (qtmux->moov, fragmented); atom_moov_update_duration (qtmux->moov); if (_timescale) *_timescale = timescale; } static GstFlowReturn gst_qt_mux_send_moov (GstQTMux * qtmux, guint64 * _offset, gboolean mind_fast) { guint64 offset = 0, size = 0; guint8 *data; GstBuffer *buf; GstFlowReturn ret = GST_FLOW_OK; /* serialize moov */ offset = size = 0; data = NULL; GST_LOG_OBJECT (qtmux, "Copying movie header into buffer"); if (!atom_moov_copy_data (qtmux->moov, &data, &size, &offset)) goto serialize_error; buf = _gst_buffer_new_take_data (data, offset); GST_DEBUG_OBJECT (qtmux, "Pushing moov atoms"); gst_qt_mux_set_header_on_caps (qtmux, buf); ret = gst_qt_mux_send_buffer (qtmux, buf, _offset, mind_fast); return ret; serialize_error: { g_free (data); return GST_FLOW_ERROR; } } /* either calculates size of extra atoms or pushes them */ static GstFlowReturn gst_qt_mux_send_extra_atoms (GstQTMux * qtmux, gboolean send, guint64 * offset, gboolean mind_fast) { GSList *walk; guint64 loffset = 0, size = 0; guint8 *data; GstFlowReturn ret = GST_FLOW_OK; for (walk = qtmux->extra_atoms; walk; walk = g_slist_next (walk)) { AtomInfo *ainfo = (AtomInfo *) walk->data; loffset = size = 0; data = NULL; if (!ainfo->copy_data_func (ainfo->atom, send ? &data : NULL, &size, &loffset)) goto serialize_error; if (send) { GstBuffer *buf; GST_DEBUG_OBJECT (qtmux, "Pushing extra top-level atom %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (ainfo->atom->type)); buf = _gst_buffer_new_take_data (data, loffset); ret = gst_qt_mux_send_buffer (qtmux, buf, offset, FALSE); if (ret != GST_FLOW_OK) break; } else { if (offset) *offset += loffset; } } return ret; serialize_error: { g_free (data); return GST_FLOW_ERROR; } } static GstFlowReturn gst_qt_mux_start_file (GstQTMux * qtmux) { GstFlowReturn ret = GST_FLOW_OK; GstCaps *caps; GST_DEBUG_OBJECT (qtmux, "starting file"); caps = gst_caps_copy (gst_pad_get_pad_template_caps (qtmux->srcpad)); /* qtmux has structure with and without variant, remove all but the first */ while (gst_caps_get_size (caps) > 1) gst_caps_remove_structure (caps, 1); gst_pad_set_caps (qtmux->srcpad, caps); gst_caps_unref (caps); /* let downstream know we think in BYTES and expect to do seeking later on */ gst_pad_push_event (qtmux->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); /* initialize our moov recovery file */ GST_OBJECT_LOCK (qtmux); if (qtmux->moov_recov_file_path) { GST_DEBUG_OBJECT (qtmux, "Openning moov recovery file: %s", qtmux->moov_recov_file_path); qtmux->moov_recov_file = g_fopen (qtmux->moov_recov_file_path, "wb+"); if (qtmux->moov_recov_file == NULL) { GST_WARNING_OBJECT (qtmux, "Failed to open moov recovery file in %s", qtmux->moov_recov_file_path); } else { GSList *walk; gboolean fail = FALSE; AtomFTYP *ftyp = NULL; GstBuffer *prefix = NULL; gst_qt_mux_prepare_ftyp (qtmux, &ftyp, &prefix); if (!atoms_recov_write_headers (qtmux->moov_recov_file, ftyp, prefix, qtmux->moov, qtmux->timescale, g_slist_length (qtmux->sinkpads))) { GST_WARNING_OBJECT (qtmux, "Failed to write moov recovery file " "headers"); fail = TRUE; } atom_ftyp_free (ftyp); if (prefix) gst_buffer_unref (prefix); for (walk = qtmux->sinkpads; walk && !fail; walk = g_slist_next (walk)) { GstCollectData *cdata = (GstCollectData *) walk->data; GstQTPad *qpad = (GstQTPad *) cdata; /* write info for each stream */ fail = atoms_recov_write_trak_info (qtmux->moov_recov_file, qpad->trak); if (fail) { GST_WARNING_OBJECT (qtmux, "Failed to write trak info to recovery " "file"); } } if (fail) { /* cleanup */ fclose (qtmux->moov_recov_file); qtmux->moov_recov_file = NULL; GST_WARNING_OBJECT (qtmux, "An error was detected while writing to " "recover file, moov recovery won't work"); } } } GST_OBJECT_UNLOCK (qtmux); /* * send mdat header if already needed, and mark position for later update. * We don't send ftyp now if we are on fast start mode, because we can * better fine tune using the information we gather to create the whole moov * atom. */ if (qtmux->fast_start) { GST_OBJECT_LOCK (qtmux); qtmux->fast_start_file = g_fopen (qtmux->fast_start_file_path, "wb+"); if (!qtmux->fast_start_file) goto open_failed; GST_OBJECT_UNLOCK (qtmux); /* send a dummy buffer for preroll */ ret = gst_qt_mux_send_buffer (qtmux, gst_buffer_new (), NULL, FALSE); if (ret != GST_FLOW_OK) goto exit; } else { ret = gst_qt_mux_prepare_and_send_ftyp (qtmux); if (ret != GST_FLOW_OK) { goto exit; } /* well, it's moov pos if fragmented ... */ qtmux->mdat_pos = qtmux->header_size; if (qtmux->fragment_duration) { GST_DEBUG_OBJECT (qtmux, "fragment duration %d ms, writing headers", qtmux->fragment_duration); /* also used as snapshot marker to indicate fragmented file */ qtmux->fragment_sequence = 1; /* prepare moov and/or tags */ gst_qt_mux_configure_moov (qtmux, NULL); gst_qt_mux_setup_metadata (qtmux); ret = gst_qt_mux_send_moov (qtmux, &qtmux->header_size, FALSE); if (ret != GST_FLOW_OK) return ret; /* extra atoms */ ret = gst_qt_mux_send_extra_atoms (qtmux, TRUE, &qtmux->header_size, FALSE); if (ret != GST_FLOW_OK) return ret; /* prepare index */ if (!qtmux->streamable) qtmux->mfra = atom_mfra_new (qtmux->context); } else { /* extended to ensure some spare space */ ret = gst_qt_mux_send_mdat_header (qtmux, &qtmux->header_size, 0, TRUE); } } exit: return ret; /* ERRORS */ open_failed: { GST_ELEMENT_ERROR (qtmux, RESOURCE, OPEN_READ_WRITE, (("Could not open temporary file \"%s\""), qtmux->fast_start_file_path), GST_ERROR_SYSTEM); GST_OBJECT_UNLOCK (qtmux); return GST_FLOW_ERROR; } } static GstFlowReturn gst_qt_mux_stop_file (GstQTMux * qtmux) { gboolean ret = GST_FLOW_OK; guint64 offset = 0, size = 0; GSList *walk; gboolean large_file; guint32 timescale; GstClockTime first_ts = GST_CLOCK_TIME_NONE; GST_DEBUG_OBJECT (qtmux, "Updating remaining values and sending last data"); /* pushing last buffers for each pad */ for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) { GstCollectData *cdata = (GstCollectData *) walk->data; GstQTPad *qtpad = (GstQTPad *) cdata; /* avoid add_buffer complaining if not negotiated * in which case no buffers either, so skipping */ if (!qtpad->fourcc) { GST_DEBUG_OBJECT (qtmux, "Pad %s has never had buffers", GST_PAD_NAME (qtpad->collect.pad)); continue; } /* send last buffer; also flushes possibly queued buffers/ts */ GST_DEBUG_OBJECT (qtmux, "Sending the last buffer for pad %s", GST_PAD_NAME (qtpad->collect.pad)); ret = gst_qt_mux_add_buffer (qtmux, qtpad, NULL); if (ret != GST_FLOW_OK) { GST_WARNING_OBJECT (qtmux, "Failed to send last buffer for %s, " "flow return: %s", GST_PAD_NAME (qtpad->collect.pad), gst_flow_get_name (ret)); } /* having flushed above, can check for buffers now */ if (!GST_CLOCK_TIME_IS_VALID (qtpad->first_ts)) { GST_DEBUG_OBJECT (qtmux, "Pad %s has no buffers", GST_PAD_NAME (qtpad->collect.pad)); continue; } /* determine max stream duration */ if (!GST_CLOCK_TIME_IS_VALID (first_ts) || (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts) && qtpad->last_dts > first_ts)) { first_ts = qtpad->last_dts; } /* update average bitrate of streams if needed */ { guint32 avgbitrate = 0; guint32 maxbitrate = qtpad->max_bitrate; if (qtpad->avg_bitrate) avgbitrate = qtpad->avg_bitrate; else if (qtpad->total_duration > 0) avgbitrate = (guint32) gst_util_uint64_scale_round (qtpad->total_bytes, 8 * GST_SECOND, qtpad->total_duration); atom_trak_update_bitrates (qtpad->trak, avgbitrate, maxbitrate); } } if (qtmux->fragment_sequence) { GstEvent *event; if (qtmux->mfra) { guint8 *data = NULL; GstBuffer *buf; size = offset = 0; GST_DEBUG_OBJECT (qtmux, "adding mfra"); if (!atom_mfra_copy_data (qtmux->mfra, &data, &size, &offset)) goto serialize_error; buf = _gst_buffer_new_take_data (data, offset); ret = gst_qt_mux_send_buffer (qtmux, buf, NULL, FALSE); if (ret != GST_FLOW_OK) return ret; } else { /* must have been streamable; no need to write duration */ GST_DEBUG_OBJECT (qtmux, "streamable file; nothing to stop"); return GST_FLOW_OK; } timescale = qtmux->timescale; /* only mvex duration is updated, * mvhd should be consistent with empty moov * (but TODO maybe some clients do not handle that well ?) */ qtmux->moov->mvex.mehd.fragment_duration = gst_util_uint64_scale (first_ts, timescale, GST_SECOND); GST_DEBUG_OBJECT (qtmux, "rewriting moov with mvex duration %" GST_TIME_FORMAT, GST_TIME_ARGS (first_ts)); /* seek and rewrite the header */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, qtmux->mdat_pos, GST_CLOCK_TIME_NONE, 0); gst_pad_push_event (qtmux->srcpad, event); /* no need to seek back */ return gst_qt_mux_send_moov (qtmux, NULL, FALSE); } gst_qt_mux_configure_moov (qtmux, ×cale); /* check for late streams */ first_ts = GST_CLOCK_TIME_NONE; for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) { GstCollectData *cdata = (GstCollectData *) walk->data; GstQTPad *qtpad = (GstQTPad *) cdata; if (!GST_CLOCK_TIME_IS_VALID (first_ts) || (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts) && qtpad->first_ts < first_ts)) { first_ts = qtpad->first_ts; } } GST_DEBUG_OBJECT (qtmux, "Media first ts selected: %" GST_TIME_FORMAT, GST_TIME_ARGS (first_ts)); /* add EDTSs for late streams */ for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) { GstCollectData *cdata = (GstCollectData *) walk->data; GstQTPad *qtpad = (GstQTPad *) cdata; guint32 lateness; guint32 duration; if (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts) && qtpad->first_ts > first_ts + MAX_TOLERATED_LATENESS) { GST_DEBUG_OBJECT (qtmux, "Pad %s is a late stream by %" GST_TIME_FORMAT, GST_PAD_NAME (qtpad->collect.pad), GST_TIME_ARGS (qtpad->first_ts - first_ts)); lateness = gst_util_uint64_scale_round (qtpad->first_ts - first_ts, timescale, GST_SECOND); duration = qtpad->trak->tkhd.duration; atom_trak_add_elst_entry (qtpad->trak, lateness, (guint32) - 1, (guint32) (1 * 65536.0)); atom_trak_add_elst_entry (qtpad->trak, duration, 0, (guint32) (1 * 65536.0)); /* need to add the empty time to the trak duration */ qtpad->trak->tkhd.duration += lateness; } } /* tags into file metadata */ gst_qt_mux_setup_metadata (qtmux); large_file = (qtmux->mdat_size > MDAT_LARGE_FILE_LIMIT); /* if faststart, update the offset of the atoms in the movie with the offset * that the movie headers before mdat will cause. * Also, send the ftyp */ if (qtmux->fast_start_file) { GstFlowReturn flow_ret; offset = size = 0; flow_ret = gst_qt_mux_prepare_and_send_ftyp (qtmux); if (flow_ret != GST_FLOW_OK) { goto ftyp_error; } /* copy into NULL to obtain size */ if (!atom_moov_copy_data (qtmux->moov, NULL, &size, &offset)) goto serialize_error; GST_DEBUG_OBJECT (qtmux, "calculated moov atom size %" G_GUINT64_FORMAT, offset); offset += qtmux->header_size + (large_file ? 16 : 8); /* sum up with the extra atoms size */ ret = gst_qt_mux_send_extra_atoms (qtmux, FALSE, &offset, FALSE); if (ret != GST_FLOW_OK) return ret; } else { offset = qtmux->header_size; } atom_moov_chunks_add_offset (qtmux->moov, offset); /* moov */ /* note: as of this point, we no longer care about tracking written data size, * since there is no more use for it anyway */ ret = gst_qt_mux_send_moov (qtmux, NULL, FALSE); if (ret != GST_FLOW_OK) return ret; /* extra atoms */ ret = gst_qt_mux_send_extra_atoms (qtmux, TRUE, NULL, FALSE); if (ret != GST_FLOW_OK) return ret; /* if needed, send mdat atom and move buffered data into it */ if (qtmux->fast_start_file) { /* mdat_size = accumulated (buffered data) */ ret = gst_qt_mux_send_mdat_header (qtmux, NULL, qtmux->mdat_size, large_file); if (ret != GST_FLOW_OK) return ret; ret = gst_qt_mux_send_buffered_data (qtmux, NULL); if (ret != GST_FLOW_OK) return ret; } else { /* mdat needs update iff not using faststart */ GST_DEBUG_OBJECT (qtmux, "updating mdat size"); ret = gst_qt_mux_update_mdat_size (qtmux, qtmux->mdat_pos, qtmux->mdat_size, NULL); /* note; no seeking back to the end of file is done, * since we no longer write anything anyway */ } return ret; /* ERRORS */ serialize_error: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Failed to serialize moov")); return GST_FLOW_ERROR; } ftyp_error: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Failed to send ftyp")); return GST_FLOW_ERROR; } } static GstFlowReturn gst_qt_mux_pad_fragment_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf, gboolean force, guint32 nsamples, gint64 dts, guint32 delta, guint32 size, gboolean sync, gint64 pts_offset) { GstFlowReturn ret = GST_FLOW_OK; /* setup if needed */ if (G_UNLIKELY (!pad->traf || force)) goto init; flush: /* flush pad fragment if threshold reached, * or at new keyframe if we should be minding those in the first place */ if (G_UNLIKELY (force || (sync && pad->sync) || pad->fragment_duration < (gint64) delta)) { AtomMOOF *moof; guint64 size = 0, offset = 0; guint8 *data = NULL; GstBuffer *buffer; guint i, total_size; /* now we know where moof ends up, update offset in tfra */ if (pad->tfra) atom_tfra_update_offset (pad->tfra, qtmux->header_size); moof = atom_moof_new (qtmux->context, qtmux->fragment_sequence); /* takes ownership */ atom_moof_add_traf (moof, pad->traf); pad->traf = NULL; atom_moof_copy_data (moof, &data, &size, &offset); buffer = _gst_buffer_new_take_data (data, offset); GST_LOG_OBJECT (qtmux, "writing moof size %d", GST_BUFFER_SIZE (buffer)); ret = gst_qt_mux_send_buffer (qtmux, buffer, &qtmux->header_size, FALSE); /* and actual data */ total_size = 0; for (i = 0; i < atom_array_get_len (&pad->fragment_buffers); i++) { total_size += GST_BUFFER_SIZE (atom_array_index (&pad->fragment_buffers, i)); } GST_LOG_OBJECT (qtmux, "writing %d buffers, total_size %d", atom_array_get_len (&pad->fragment_buffers), total_size); if (ret == GST_FLOW_OK) ret = gst_qt_mux_send_mdat_header (qtmux, &qtmux->header_size, total_size, FALSE); for (i = 0; i < atom_array_get_len (&pad->fragment_buffers); i++) { if (G_LIKELY (ret == GST_FLOW_OK)) ret = gst_qt_mux_send_buffer (qtmux, atom_array_index (&pad->fragment_buffers, i), &qtmux->header_size, FALSE); else gst_buffer_unref (atom_array_index (&pad->fragment_buffers, i)); } atom_array_clear (&pad->fragment_buffers); atom_moof_free (moof); qtmux->fragment_sequence++; force = FALSE; } init: if (G_UNLIKELY (!pad->traf)) { GST_LOG_OBJECT (qtmux, "setting up new fragment"); pad->traf = atom_traf_new (qtmux->context, atom_trak_get_id (pad->trak)); atom_array_init (&pad->fragment_buffers, 512); pad->fragment_duration = gst_util_uint64_scale (qtmux->fragment_duration, atom_trak_get_timescale (pad->trak), 1000); if (G_UNLIKELY (qtmux->mfra && !pad->tfra)) { pad->tfra = atom_tfra_new (qtmux->context, atom_trak_get_id (pad->trak)); atom_mfra_add_tfra (qtmux->mfra, pad->tfra); } } /* add buffer and metadata */ atom_traf_add_samples (pad->traf, delta, size, sync, pts_offset, pad->sync && sync); atom_array_append (&pad->fragment_buffers, buf, 256); pad->fragment_duration -= delta; if (pad->tfra) { guint32 sn = atom_traf_get_sample_num (pad->traf); if ((sync && pad->sync) || (sn == 1 && !pad->sync)) atom_tfra_add_entry (pad->tfra, dts, sn); } if (G_UNLIKELY (force)) goto flush; return ret; } /* sigh, tiny list helpers to re-order stuff */ static void gst_qt_mux_push_ts (GstQTMux * qtmux, GstQTPad * pad, GstClockTime ts) { gint i; for (i = 0; (i < QTMUX_NO_OF_TS) && (i < pad->ts_n_entries); i++) { if (ts > pad->ts_entries[i]) break; } memmove (&pad->ts_entries[i + 1], &pad->ts_entries[i], sizeof (GstClockTime) * (pad->ts_n_entries - i)); pad->ts_entries[i] = ts; pad->ts_n_entries++; } static void check_and_subtract_ts (GstQTMux * qtmux, GstClockTime * ts_a, GstClockTime ts_b) { if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (*ts_a))) { if (G_LIKELY (*ts_a > ts_b)) { *ts_a -= ts_b; } else { *ts_a = 0; GST_WARNING_OBJECT (qtmux, "Subtraction would result in negative value, " "using 0 as result"); } } } /* subtract ts from all buffers enqueued on the pad */ static void gst_qt_mux_subtract_ts (GstQTMux * qtmux, GstQTPad * pad, GstClockTime ts) { gint i; for (i = 0; (i < QTMUX_NO_OF_TS) && (i < pad->ts_n_entries); i++) { check_and_subtract_ts (qtmux, &pad->ts_entries[i], ts); } for (i = 0; i < G_N_ELEMENTS (pad->buf_entries); i++) { if (pad->buf_entries[i]) { check_and_subtract_ts (qtmux, &GST_BUFFER_TIMESTAMP (pad->buf_entries[i]), ts); check_and_subtract_ts (qtmux, &GST_BUFFER_OFFSET_END (pad->buf_entries[i]), ts); } } } /* takes ownership of @buf */ static GstBuffer * gst_qt_mux_get_asc_buffer_ts (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf) { const gint wrap = G_N_ELEMENTS (pad->buf_entries); GstClockTime ts; /* store buffer and ts, latter ordered */ if (buf) { pad->buf_entries[pad->buf_tail++] = buf; pad->buf_tail %= wrap; gst_qt_mux_push_ts (qtmux, pad, GST_BUFFER_TIMESTAMP (buf)); } if (pad->ts_n_entries && (!buf || pad->ts_n_entries >= QTMUX_NO_OF_TS)) { ts = pad->ts_entries[--pad->ts_n_entries]; buf = pad->buf_entries[pad->buf_head]; pad->buf_entries[pad->buf_head++] = NULL; pad->buf_head %= wrap; buf = gst_buffer_make_metadata_writable (buf); /* track original ts (= pts ?) for later */ GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_TIMESTAMP (buf) = ts; GST_DEBUG_OBJECT (qtmux, "next buffer uses reordered ts %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); } else { buf = NULL; } return buf; } /* * Here we push the buffer and update the tables in the track atoms */ static GstFlowReturn gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf) { GstBuffer *last_buf = NULL; GstClockTime duration; guint nsamples, sample_size; guint64 chunk_offset; gint64 last_dts, scaled_duration; gint64 pts_offset = 0; gboolean sync = FALSE, do_pts = FALSE; gboolean drain = (buf == NULL); GstFlowReturn ret = GST_FLOW_OK; if (!pad->fourcc) goto not_negotiated; /* if this pad has a prepare function, call it */ if (pad->prepare_buf_func != NULL) { buf = pad->prepare_buf_func (pad, buf, qtmux); } if (G_LIKELY (buf != NULL && GST_CLOCK_TIME_IS_VALID (pad->first_ts) && pad->first_ts != 0)) { buf = gst_buffer_make_metadata_writable (buf); check_and_subtract_ts (qtmux, &GST_BUFFER_TIMESTAMP (buf), pad->first_ts); } /* when we obtain the first_ts we subtract from all stored buffers we have, * after that we can subtract on input */ again: last_buf = pad->last_buf; if (qtmux->dts_method == DTS_METHOD_REORDER) { buf = gst_qt_mux_get_asc_buffer_ts (qtmux, pad, buf); if (!buf && !last_buf) { GST_DEBUG_OBJECT (qtmux, "no reordered buffer"); return GST_FLOW_OK; } } if (last_buf == NULL) { #ifndef GST_DISABLE_GST_DEBUG if (buf == NULL) { GST_DEBUG_OBJECT (qtmux, "Pad %s has no previous buffer stored and " "received NULL buffer, doing nothing", GST_PAD_NAME (pad->collect.pad)); } else { GST_LOG_OBJECT (qtmux, "Pad %s has no previous buffer stored, storing now", GST_PAD_NAME (pad->collect.pad)); } #endif pad->last_buf = buf; goto exit; } else gst_buffer_ref (last_buf); /* nasty heuristic mess to guestimate dealing with DTS/PTS, * while also trying to stay close to input ts to preserve sync, * so in DTS_METHOD_DD: * - prefer using input ts where possible * - if those detected out-of-order (*), mark as out-of-order * - if in out-of-order, then * - if duration available, use that as delta * Also mind to preserve sync between streams, and adding * durations might drift, so try to resync when we expect * input ts == (sum of durations), which is at some keyframe input frame. * - if no duration available, we are actually in serious trouble and need * to hack around that, so we fail. * To remedy failure, alternatively, in DTS_METHOD_REORDER: * - collect some buffers and re-order timestamp, * then process the oldest buffer with smallest timestamps. * This should typically compensate for some codec's handywork with ts. * ... but in case this makes ts end up where not expected, in DTS_METHOD_ASC: * - keep each ts with its buffer and still keep a list of most recent X ts, * use the (ascending) minimum of those as DTS (and the difference as ts delta), * and use this DTS as a basis to obtain a (positive) CTS offset. * This should yield exact PTS == buffer ts, but it seems not all players * out there are aware of ctts pts ... * * 0.11 Phew, can we (pretty) please please sort out DTS/PTS on buffers ... */ if (G_LIKELY (buf) && !pad->is_out_of_order) { if (G_LIKELY (GST_BUFFER_TIMESTAMP_IS_VALID (last_buf) && GST_BUFFER_TIMESTAMP_IS_VALID (buf))) { if ((GST_BUFFER_TIMESTAMP (buf) < GST_BUFFER_TIMESTAMP (last_buf))) { GST_DEBUG_OBJECT (qtmux, "detected out-of-order input"); pad->is_out_of_order = TRUE; } } else { /* this is pretty bad */ GST_WARNING_OBJECT (qtmux, "missing input timestamp"); /* fall back to durations */ pad->is_out_of_order = TRUE; } } /* would have to be some unusual input, but not impossible */ if (G_UNLIKELY (qtmux->dts_method == DTS_METHOD_REORDER && pad->is_out_of_order)) { goto no_order; } /* if this is the first buffer, store the timestamp */ if (G_UNLIKELY (pad->first_ts == GST_CLOCK_TIME_NONE) && last_buf) { if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (last_buf))) { pad->first_ts = GST_BUFFER_TIMESTAMP (last_buf); } else { GST_DEBUG_OBJECT (qtmux, "First buffer for pad %s has no timestamp, " "using 0 as first timestamp", GST_PAD_NAME (pad->collect.pad)); pad->first_ts = 0; } GST_DEBUG_OBJECT (qtmux, "Stored first timestamp for pad %s %" GST_TIME_FORMAT, GST_PAD_NAME (pad->collect.pad), GST_TIME_ARGS (pad->first_ts)); gst_qt_mux_subtract_ts (qtmux, pad, pad->first_ts); GST_BUFFER_TIMESTAMP (last_buf) = 0; check_and_subtract_ts (qtmux, &GST_BUFFER_OFFSET_END (last_buf), pad->first_ts); if (buf) { check_and_subtract_ts (qtmux, &GST_BUFFER_TIMESTAMP (buf), pad->first_ts); check_and_subtract_ts (qtmux, &GST_BUFFER_OFFSET_END (buf), pad->first_ts); } } /* fall back to duration if last buffer or * out-of-order (determined previously), otherwise use input ts */ if (buf == NULL || (pad->is_out_of_order && qtmux->dts_method == DTS_METHOD_DD)) { if (!GST_BUFFER_DURATION_IS_VALID (last_buf)) { /* be forgiving for some possibly last upstream flushed buffer */ if (buf) goto no_time; GST_WARNING_OBJECT (qtmux, "no duration for last buffer"); /* iso spec recommends some small value, try 0 */ duration = 0; } else { duration = GST_BUFFER_DURATION (last_buf); /* avoid drift in sum timestamps, * so use input timestamp for suitable keyframe */ if (buf && !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) && GST_BUFFER_TIMESTAMP (buf) >= pad->last_dts) { GST_DEBUG_OBJECT (qtmux, "resyncing out-of-order input to ts; " "replacing %" GST_TIME_FORMAT " by %" GST_TIME_FORMAT, GST_TIME_ARGS (pad->last_dts + duration), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); duration = GST_BUFFER_TIMESTAMP (buf) - pad->last_dts; } } } else if (qtmux->dts_method != DTS_METHOD_ASC) { duration = GST_BUFFER_TIMESTAMP (buf) - GST_BUFFER_TIMESTAMP (last_buf); } else { GstClockTime ts; g_assert (qtmux->dts_method == DTS_METHOD_ASC); if (!qtmux->guess_pts) goto need_pts; /* add timestamp to queue; keeps in descending order */ gst_qt_mux_push_ts (qtmux, pad, GST_BUFFER_TIMESTAMP (last_buf)); /* chuck out smallest/last one if we have enough */ if (G_LIKELY (pad->ts_n_entries > QTMUX_NO_OF_TS)) pad->ts_n_entries--; /* peek the now smallest timestamp */ ts = pad->ts_entries[pad->ts_n_entries - 1]; /* these tails are expected to be (strictly) ascending with * large enough history */ GST_DEBUG_OBJECT (qtmux, "ASC method; base timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); if (ts >= pad->last_dts) { duration = ts - pad->last_dts; } else { /* fallback to previous value, negative ct offset might handle */ GST_WARNING_OBJECT (qtmux, "unexpected decrease in timestamp"); duration = 0; } /* arrange for small non-zero duration/delta << expected frame time */ ts = gst_util_uint64_scale (10, GST_SECOND, atom_trak_get_timescale (pad->trak)); duration = MAX (duration, ts); } /* for computing the avg bitrate */ if (G_LIKELY (last_buf)) { pad->total_bytes += GST_BUFFER_SIZE (last_buf); pad->total_duration += duration; } gst_buffer_replace (&pad->last_buf, buf); last_dts = gst_util_uint64_scale_round (pad->last_dts, atom_trak_get_timescale (pad->trak), GST_SECOND); /* fragments only deal with 1 buffer == 1 chunk (== 1 sample) */ if (pad->sample_size && !qtmux->fragment_sequence) { /* Constant size packets: usually raw audio (with many samples per buffer (= chunk)), but can also be fixed-packet-size codecs like ADPCM */ sample_size = pad->sample_size; if (GST_BUFFER_SIZE (last_buf) % sample_size != 0) goto fragmented_sample; /* note: qt raw audio storage warps it implicitly into a timewise * perfect stream, discarding buffer times */ if (GST_BUFFER_DURATION (last_buf) != GST_CLOCK_TIME_NONE) { nsamples = gst_util_uint64_scale_round (GST_BUFFER_DURATION (last_buf), atom_trak_get_timescale (pad->trak), GST_SECOND); } else { nsamples = GST_BUFFER_SIZE (last_buf) / sample_size; } duration = GST_BUFFER_DURATION (last_buf) / nsamples; /* timescale = samplerate */ scaled_duration = 1; pad->last_dts += duration * nsamples; } else { nsamples = 1; sample_size = GST_BUFFER_SIZE (last_buf); if (pad->have_dts) { gint64 scaled_dts; pad->last_dts = GST_BUFFER_OFFSET_END (last_buf); if ((gint64) (pad->last_dts) < 0) { scaled_dts = -gst_util_uint64_scale_round (-pad->last_dts, atom_trak_get_timescale (pad->trak), GST_SECOND); } else { scaled_dts = gst_util_uint64_scale_round (pad->last_dts, atom_trak_get_timescale (pad->trak), GST_SECOND); } scaled_duration = scaled_dts - last_dts; last_dts = scaled_dts; } else { /* first convert intended timestamp (in GstClockTime resolution) to * trak timescale, then derive delta; * this ensures sums of (scale)delta add up to converted timestamp, * which only deviates at most 1/scale from timestamp itself */ scaled_duration = gst_util_uint64_scale_round (pad->last_dts + duration, atom_trak_get_timescale (pad->trak), GST_SECOND) - last_dts; pad->last_dts += duration; } } chunk_offset = qtmux->mdat_size; GST_LOG_OBJECT (qtmux, "Pad (%s) dts updated to %" GST_TIME_FORMAT, GST_PAD_NAME (pad->collect.pad), GST_TIME_ARGS (pad->last_dts)); GST_LOG_OBJECT (qtmux, "Adding %d samples to track, duration: %" G_GUINT64_FORMAT " size: %" G_GUINT32_FORMAT " chunk offset: %" G_GUINT64_FORMAT, nsamples, scaled_duration, sample_size, chunk_offset); /* might be a sync sample */ if (pad->sync && !GST_BUFFER_FLAG_IS_SET (last_buf, GST_BUFFER_FLAG_DELTA_UNIT)) { GST_LOG_OBJECT (qtmux, "Adding new sync sample entry for track of pad %s", GST_PAD_NAME (pad->collect.pad)); sync = TRUE; } /* optionally calculate ctts entry values * (if composition-time expected different from decoding-time) */ /* really not recommended: * - decoder typically takes care of dts/pts issues * - in case of out-of-order, dts may only be determined as above * (e.g. sum of duration), which may be totally different from * buffer timestamps in case of multiple segment, non-perfect streams * (and just perhaps maybe with some luck segment_to_running_time * or segment_to_media_time might get near to it) */ if ((pad->have_dts || qtmux->guess_pts)) { guint64 pts; pts = qtmux->dts_method == DTS_METHOD_REORDER ? GST_BUFFER_OFFSET_END (last_buf) : GST_BUFFER_TIMESTAMP (last_buf); pts = gst_util_uint64_scale_round (pts, atom_trak_get_timescale (pad->trak), GST_SECOND); pts_offset = (gint64) (pts - last_dts); do_pts = TRUE; GST_LOG_OBJECT (qtmux, "Adding ctts entry for pad %s: %" G_GINT64_FORMAT, GST_PAD_NAME (pad->collect.pad), pts_offset); } /* * Each buffer starts a new chunk, so we can assume the buffer * duration is the chunk duration */ if (GST_CLOCK_TIME_IS_VALID (duration) && (duration > qtmux->longest_chunk || !GST_CLOCK_TIME_IS_VALID (qtmux->longest_chunk))) { GST_DEBUG_OBJECT (qtmux, "New longest chunk found: %" GST_TIME_FORMAT ", pad %s", GST_TIME_ARGS (duration), GST_PAD_NAME (pad->collect.pad)); qtmux->longest_chunk = duration; } /* now we go and register this buffer/sample all over */ /* note that a new chunk is started each time (not fancy but works) */ if (qtmux->moov_recov_file) { if (!atoms_recov_write_trak_samples (qtmux->moov_recov_file, pad->trak, nsamples, (gint32) scaled_duration, sample_size, chunk_offset, sync, do_pts, pts_offset)) { GST_WARNING_OBJECT (qtmux, "Failed to write sample information to " "recovery file, disabling recovery"); fclose (qtmux->moov_recov_file); qtmux->moov_recov_file = NULL; } } if (buf) gst_buffer_unref (buf); if (qtmux->fragment_sequence) { /* ensure that always sync samples are marked as such */ ret = gst_qt_mux_pad_fragment_add_buffer (qtmux, pad, last_buf, buf == NULL, nsamples, last_dts, (gint32) scaled_duration, sample_size, !pad->sync || sync, pts_offset); } else { atom_trak_add_samples (pad->trak, nsamples, (gint32) scaled_duration, sample_size, chunk_offset, sync, pts_offset); ret = gst_qt_mux_send_buffer (qtmux, last_buf, &qtmux->mdat_size, TRUE); } exit: if (G_UNLIKELY (drain && qtmux->dts_method == DTS_METHOD_REORDER && ret == GST_FLOW_OK)) { buf = NULL; goto again; } return ret; /* ERRORS */ bail: { if (buf) gst_buffer_unref (buf); gst_buffer_unref (last_buf); return GST_FLOW_ERROR; } no_time: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Received buffer without timestamp/duration. " "Using e.g. dts-method=reorder might help.")); goto bail; } no_order: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("DTS method failed to re-order timestamps.")); goto bail; } need_pts: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Selected DTS method also needs PTS enabled.")); goto bail; } fragmented_sample: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL), ("Audio buffer contains fragmented sample.")); goto bail; } not_negotiated: { GST_ELEMENT_ERROR (qtmux, CORE, NEGOTIATION, (NULL), ("format wasn't negotiated before buffer flow on pad %s", GST_PAD_NAME (pad->collect.pad))); if (buf) gst_buffer_unref (buf); return GST_FLOW_NOT_NEGOTIATED; } } static GstFlowReturn gst_qt_mux_collected (GstCollectPads * pads, gpointer user_data) { GstFlowReturn ret = GST_FLOW_OK; GstQTMux *qtmux = GST_QT_MUX_CAST (user_data); GSList *walk; GstQTPad *best_pad = NULL; GstClockTime time, best_time = GST_CLOCK_TIME_NONE; GstBuffer *buf; if (G_UNLIKELY (qtmux->state == GST_QT_MUX_STATE_STARTED)) { if ((ret = gst_qt_mux_start_file (qtmux)) != GST_FLOW_OK) return ret; else qtmux->state = GST_QT_MUX_STATE_DATA; } if (G_UNLIKELY (qtmux->state == GST_QT_MUX_STATE_EOS)) return GST_FLOW_UNEXPECTED; /* select the best buffer */ walk = qtmux->collect->data; while (walk) { GstQTPad *pad; GstCollectData *data; data = (GstCollectData *) walk->data; pad = (GstQTPad *) data; walk = g_slist_next (walk); buf = gst_collect_pads_peek (pads, data); if (buf == NULL) { GST_LOG_OBJECT (qtmux, "Pad %s has no buffers", GST_PAD_NAME (pad->collect.pad)); continue; } time = GST_BUFFER_TIMESTAMP (buf); gst_buffer_unref (buf); /* invalid should pass */ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { time = gst_segment_to_running_time (&data->segment, GST_FORMAT_TIME, time); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { GST_DEBUG_OBJECT (qtmux, "clipping buffer on pad %s outside segment", GST_PAD_NAME (data->pad)); buf = gst_collect_pads_pop (pads, data); gst_buffer_unref (buf); return GST_FLOW_OK; } } if (best_pad == NULL || !GST_CLOCK_TIME_IS_VALID (time) || (GST_CLOCK_TIME_IS_VALID (best_time) && time < best_time)) { best_pad = pad; best_time = time; } } if (best_pad != NULL) { GST_LOG_OBJECT (qtmux, "selected pad %s with time %" GST_TIME_FORMAT, GST_PAD_NAME (best_pad->collect.pad), GST_TIME_ARGS (best_time)); buf = gst_collect_pads_pop (pads, &best_pad->collect); buf = gst_buffer_make_metadata_writable (buf); GST_BUFFER_TIMESTAMP (buf) = best_time; ret = gst_qt_mux_add_buffer (qtmux, best_pad, buf); } else { ret = gst_qt_mux_stop_file (qtmux); if (ret == GST_FLOW_OK) { GST_DEBUG_OBJECT (qtmux, "Pushing eos"); gst_pad_push_event (qtmux->srcpad, gst_event_new_eos ()); ret = GST_FLOW_UNEXPECTED; } else { GST_WARNING_OBJECT (qtmux, "Failed to stop file: %s", gst_flow_get_name (ret)); } qtmux->state = GST_QT_MUX_STATE_EOS; } return ret; } static gboolean check_field (GQuark field_id, const GValue * value, gpointer user_data) { GstStructure *structure = (GstStructure *) user_data; const GValue *other = gst_structure_id_get_value (structure, field_id); if (other == NULL) return FALSE; return gst_value_compare (value, other) == GST_VALUE_EQUAL; } static gboolean gst_qtmux_caps_is_subset_full (GstQTMux * qtmux, GstCaps * subset, GstCaps * superset) { GstStructure *sub_s = gst_caps_get_structure (subset, 0); GstStructure *sup_s = gst_caps_get_structure (superset, 0); return gst_structure_foreach (sub_s, check_field, sup_s); } static gboolean gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps) { GstQTMux *qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad)); GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); GstQTPad *qtpad = NULL; GstStructure *structure; const gchar *mimetype; gint rate, channels; const GValue *value = NULL; const GstBuffer *codec_data = NULL; GstQTMuxFormat format; AudioSampleEntry entry = { 0, }; AtomInfo *ext_atom = NULL; gint constant_size = 0; const gchar *stream_format; /* find stream data */ qtpad = (GstQTPad *) gst_pad_get_element_private (pad); g_assert (qtpad); qtpad->prepare_buf_func = NULL; /* does not go well to renegotiate stream mid-way, unless * the old caps are a subset of the new one (this means upstream * added more info to the caps, as both should be 'fixed' caps) */ if (qtpad->fourcc) { GstCaps *current_caps = NULL; gboolean is_subset; g_object_get (pad, "caps", ¤t_caps, NULL); g_assert (caps != NULL); is_subset = gst_qtmux_caps_is_subset_full (qtmux, current_caps, caps); gst_caps_unref (current_caps); if (!is_subset) { goto refuse_renegotiation; } GST_DEBUG_OBJECT (qtmux, "pad %s accepted renegotiation to %" GST_PTR_FORMAT " from %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps, GST_PAD_CAPS (pad)); } GST_DEBUG_OBJECT (qtmux, "%s:%s, caps=%" GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (pad), caps); format = qtmux_klass->format; structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); /* common info */ if (!gst_structure_get_int (structure, "channels", &channels) || !gst_structure_get_int (structure, "rate", &rate)) { goto refuse_caps; } /* optional */ value = gst_structure_get_value (structure, "codec_data"); if (value != NULL) codec_data = gst_value_get_buffer (value); qtpad->is_out_of_order = FALSE; qtpad->have_dts = FALSE; /* set common properties */ entry.sample_rate = rate; entry.channels = channels; /* default */ entry.sample_size = 16; /* this is the typical compressed case */ if (format == GST_QT_MUX_FORMAT_QT) { entry.version = 1; entry.compression_id = -2; } /* now map onto a fourcc, and some extra properties */ if (strcmp (mimetype, "audio/mpeg") == 0) { gint mpegversion = 0; gint layer = -1; gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 1: gst_structure_get_int (structure, "layer", &layer); switch (layer) { case 3: /* mp3 */ /* note: QuickTime player does not like mp3 either way in iso/mp4 */ if (format == GST_QT_MUX_FORMAT_QT) entry.fourcc = FOURCC__mp3; else { entry.fourcc = FOURCC_mp4a; ext_atom = build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG1_P3, ESDS_STREAM_TYPE_AUDIO, codec_data, qtpad->avg_bitrate, qtpad->max_bitrate); } entry.samples_per_packet = 1152; entry.bytes_per_sample = 2; break; } break; case 4: /* check stream-format */ stream_format = gst_structure_get_string (structure, "stream-format"); if (stream_format) { if (strcmp (stream_format, "raw") != 0) { GST_WARNING_OBJECT (qtmux, "Unsupported AAC stream-format %s, " "please use 'raw'", stream_format); goto refuse_caps; } } else { GST_WARNING_OBJECT (qtmux, "No stream-format present in caps, " "assuming 'raw'"); } if (!codec_data || GST_BUFFER_SIZE (codec_data) < 2) GST_WARNING_OBJECT (qtmux, "no (valid) codec_data for AAC audio"); else { guint8 profile = GST_READ_UINT8 (GST_BUFFER_DATA (codec_data)); /* warn if not Low Complexity profile */ profile >>= 3; if (profile != 2) GST_WARNING_OBJECT (qtmux, "non-LC AAC may not run well on (Apple) QuickTime/iTunes"); } /* AAC */ entry.fourcc = FOURCC_mp4a; if (format == GST_QT_MUX_FORMAT_QT) ext_atom = build_mov_aac_extension (qtpad->trak, codec_data, qtpad->avg_bitrate, qtpad->max_bitrate); else ext_atom = build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P3, ESDS_STREAM_TYPE_AUDIO, codec_data, qtpad->avg_bitrate, qtpad->max_bitrate); break; default: break; } } else if (strcmp (mimetype, "audio/AMR") == 0) { entry.fourcc = FOURCC_samr; entry.sample_size = 16; entry.samples_per_packet = 160; entry.bytes_per_sample = 2; ext_atom = build_amr_extension (); } else if (strcmp (mimetype, "audio/AMR-WB") == 0) { entry.fourcc = FOURCC_sawb; entry.sample_size = 16; entry.samples_per_packet = 320; entry.bytes_per_sample = 2; ext_atom = build_amr_extension (); } else if (strcmp (mimetype, "audio/x-raw-int") == 0) { gint width; gint depth; gint endianness; gboolean sign; if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "depth", &depth) || !gst_structure_get_boolean (structure, "signed", &sign)) { GST_DEBUG_OBJECT (qtmux, "broken caps, width/depth/signed field missing"); goto refuse_caps; } if (depth <= 8) { endianness = G_BYTE_ORDER; } else if (!gst_structure_get_int (structure, "endianness", &endianness)) { GST_DEBUG_OBJECT (qtmux, "broken caps, endianness field missing"); goto refuse_caps; } /* spec has no place for a distinction in these */ if (width != depth) { GST_DEBUG_OBJECT (qtmux, "width must be same as depth!"); goto refuse_caps; } if (sign) { if (endianness == G_LITTLE_ENDIAN) entry.fourcc = FOURCC_sowt; else if (endianness == G_BIG_ENDIAN) entry.fourcc = FOURCC_twos; /* maximum backward compatibility; only new version for > 16 bit */ if (depth <= 16) entry.version = 0; /* not compressed in any case */ entry.compression_id = 0; /* QT spec says: max at 16 bit even if sample size were actually larger, * however, most players (e.g. QuickTime!) seem to disagree, so ... */ entry.sample_size = depth; entry.bytes_per_sample = depth / 8; entry.samples_per_packet = 1; entry.bytes_per_packet = depth / 8; entry.bytes_per_frame = entry.bytes_per_packet * channels; } else { if (width == 8 && depth == 8) { /* fall back to old 8-bit version */ entry.fourcc = FOURCC_raw_; entry.version = 0; entry.compression_id = 0; entry.sample_size = 8; } else { GST_DEBUG_OBJECT (qtmux, "non 8-bit PCM must be signed"); goto refuse_caps; } } constant_size = (depth / 8) * channels; } else if (strcmp (mimetype, "audio/x-alaw") == 0) { entry.fourcc = FOURCC_alaw; entry.samples_per_packet = 1023; entry.bytes_per_sample = 2; } else if (strcmp (mimetype, "audio/x-mulaw") == 0) { entry.fourcc = FOURCC_ulaw; entry.samples_per_packet = 1023; entry.bytes_per_sample = 2; } else if (strcmp (mimetype, "audio/x-adpcm") == 0) { gint blocksize; if (!gst_structure_get_int (structure, "block_align", &blocksize)) { GST_DEBUG_OBJECT (qtmux, "broken caps, block_align missing"); goto refuse_caps; } /* Currently only supports WAV-style IMA ADPCM, for which the codec id is 0x11 */ entry.fourcc = MS_WAVE_FOURCC (0x11); /* 4 byte header per channel (including one sample). 2 samples per byte remaining. Simplifying gives the following (samples per block per channel) */ entry.samples_per_packet = 2 * blocksize / channels - 7; entry.bytes_per_sample = 2; entry.bytes_per_frame = blocksize; entry.bytes_per_packet = blocksize / channels; /* ADPCM has constant size packets */ constant_size = 1; /* TODO: I don't really understand why this helps, but it does! Constant * size and compression_id of -2 seem to be incompatible, and other files * in the wild use this too. */ entry.compression_id = -1; ext_atom = build_ima_adpcm_extension (channels, rate, blocksize); } else if (strcmp (mimetype, "audio/x-alac") == 0) { GstBuffer *codec_config; gint len; entry.fourcc = FOURCC_alac; /* let's check if codec data already comes with 'alac' atom prefix */ if (!codec_data || (len = GST_BUFFER_SIZE (codec_data)) < 28) { GST_DEBUG_OBJECT (qtmux, "broken caps, codec data missing"); goto refuse_caps; } if (GST_READ_UINT32_LE (GST_BUFFER_DATA (codec_data) + 4) == FOURCC_alac) { len -= 8; codec_config = gst_buffer_create_sub ((GstBuffer *) codec_data, 8, len); } else { codec_config = gst_buffer_ref ((GstBuffer *) codec_data); } if (len != 28) { /* does not look good, but perhaps some trailing unneeded stuff */ GST_WARNING_OBJECT (qtmux, "unexpected codec-data size, possibly broken"); } if (format == GST_QT_MUX_FORMAT_QT) ext_atom = build_mov_alac_extension (qtpad->trak, codec_config); else ext_atom = build_codec_data_extension (FOURCC_alac, codec_config); /* set some more info */ entry.bytes_per_sample = 2; entry.samples_per_packet = GST_READ_UINT32_BE (GST_BUFFER_DATA (codec_config) + 4); gst_buffer_unref (codec_config); } if (!entry.fourcc) goto refuse_caps; /* ok, set the pad info accordingly */ qtpad->fourcc = entry.fourcc; qtpad->sample_size = constant_size; atom_trak_set_audio_type (qtpad->trak, qtmux->context, &entry, qtmux->trak_timescale ? qtmux->trak_timescale : entry.sample_rate, ext_atom, constant_size); gst_object_unref (qtmux); return TRUE; /* ERRORS */ refuse_caps: { GST_WARNING_OBJECT (qtmux, "pad %s refused caps %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); gst_object_unref (qtmux); return FALSE; } refuse_renegotiation: { GST_WARNING_OBJECT (qtmux, "pad %s refused renegotiation to %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); gst_object_unref (qtmux); return FALSE; } } /* scale rate up or down by factor of 10 to fit into [1000,10000] interval */ static guint32 adjust_rate (guint64 rate) { if (rate == 0) return 10000; while (rate >= 10000) rate /= 10; while (rate < 1000) rate *= 10; return (guint32) rate; } static gboolean gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps) { GstQTMux *qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad)); GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); GstQTPad *qtpad = NULL; GstStructure *structure; const gchar *mimetype; gint width, height, depth = -1; gint framerate_num, framerate_den; guint32 rate; const GValue *value = NULL; const GstBuffer *codec_data = NULL; VisualSampleEntry entry = { 0, }; GstQTMuxFormat format; AtomInfo *ext_atom = NULL; GList *ext_atom_list = NULL; gboolean sync = FALSE; int par_num, par_den; /* find stream data */ qtpad = (GstQTPad *) gst_pad_get_element_private (pad); g_assert (qtpad); qtpad->prepare_buf_func = NULL; /* does not go well to renegotiate stream mid-way, unless * the old caps are a subset of the new one (this means upstream * added more info to the caps, as both should be 'fixed' caps) */ if (qtpad->fourcc) { GstCaps *current_caps = NULL; gboolean is_subset; g_object_get (pad, "caps", ¤t_caps, NULL); g_assert (caps != NULL); is_subset = gst_qtmux_caps_is_subset_full (qtmux, current_caps, caps); gst_caps_unref (current_caps); if (!is_subset) { goto refuse_renegotiation; } GST_DEBUG_OBJECT (qtmux, "pad %s accepted renegotiation to %" GST_PTR_FORMAT " from %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps, GST_PAD_CAPS (pad)); } GST_DEBUG_OBJECT (qtmux, "%s:%s, caps=%" GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (pad), caps); format = qtmux_klass->format; structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); /* required parts */ if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "height", &height)) goto refuse_caps; /* optional */ depth = -1; /* works as a default timebase */ framerate_num = 10000; framerate_den = 1; gst_structure_get_fraction (structure, "framerate", &framerate_num, &framerate_den); gst_structure_get_int (structure, "depth", &depth); value = gst_structure_get_value (structure, "codec_data"); if (value != NULL) codec_data = gst_value_get_buffer (value); par_num = 1; par_den = 1; gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_num, &par_den); qtpad->is_out_of_order = FALSE; /* bring frame numerator into a range that ensures both reasonable resolution * as well as a fair duration */ rate = qtmux->trak_timescale ? qtmux->trak_timescale : adjust_rate (framerate_num); GST_DEBUG_OBJECT (qtmux, "Rate of video track selected: %" G_GUINT32_FORMAT, rate); /* set common properties */ entry.width = width; entry.height = height; entry.par_n = par_num; entry.par_d = par_den; /* should be OK according to qt and iso spec, override if really needed */ entry.color_table_id = -1; entry.frame_count = 1; entry.depth = 24; /* sync entries by default */ sync = TRUE; /* now map onto a fourcc, and some extra properties */ if (strcmp (mimetype, "video/x-raw-rgb") == 0) { gint bpp; entry.fourcc = FOURCC_raw_; gst_structure_get_int (structure, "bpp", &bpp); entry.depth = bpp; sync = FALSE; } else if (strcmp (mimetype, "video/x-raw-yuv") == 0) { guint32 format = 0; sync = FALSE; gst_structure_get_fourcc (structure, "format", &format); switch (format) { case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): if (depth == -1) depth = 24; entry.fourcc = FOURCC_2vuy; entry.depth = depth; break; } } else if (strcmp (mimetype, "video/x-h263") == 0) { ext_atom = NULL; if (format == GST_QT_MUX_FORMAT_QT) entry.fourcc = FOURCC_h263; else entry.fourcc = FOURCC_s263; ext_atom = build_h263_extension (); if (ext_atom != NULL) ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); } else if (strcmp (mimetype, "video/x-divx") == 0 || strcmp (mimetype, "video/mpeg") == 0) { gint version = 0; if (strcmp (mimetype, "video/x-divx") == 0) { gst_structure_get_int (structure, "divxversion", &version); version = version == 5 ? 1 : 0; } else { gst_structure_get_int (structure, "mpegversion", &version); version = version == 4 ? 1 : 0; } if (version) { entry.fourcc = FOURCC_mp4v; ext_atom = build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P2, ESDS_STREAM_TYPE_VISUAL, codec_data, qtpad->avg_bitrate, qtpad->max_bitrate); if (ext_atom != NULL) ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); if (!codec_data) GST_WARNING_OBJECT (qtmux, "no codec_data for MPEG4 video; " "output might not play in Apple QuickTime (try global-headers?)"); } } else if (strcmp (mimetype, "video/x-h264") == 0) { /* check if we accept these caps */ if (gst_structure_has_field (structure, "stream-format")) { const gchar *format; const gchar *alignment; format = gst_structure_get_string (structure, "stream-format"); alignment = gst_structure_get_string (structure, "alignment"); if (strcmp (format, "avc") != 0 || alignment == NULL || strcmp (alignment, "au") != 0) { GST_WARNING_OBJECT (qtmux, "Rejecting h264 caps, qtmux only accepts " "avc format with AU aligned samples"); goto refuse_caps; } } else { GST_WARNING_OBJECT (qtmux, "no stream-format field in h264 caps"); goto refuse_caps; } if (!codec_data) { GST_WARNING_OBJECT (qtmux, "no codec_data in h264 caps"); goto refuse_caps; } entry.fourcc = FOURCC_avc1; if (qtpad->avg_bitrate == 0) { gint avg_bitrate = 0; gst_structure_get_int (structure, "bitrate", &avg_bitrate); qtpad->avg_bitrate = avg_bitrate; } ext_atom = build_btrt_extension (0, qtpad->avg_bitrate, qtpad->max_bitrate); if (ext_atom != NULL) ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); ext_atom = build_codec_data_extension (FOURCC_avcC, codec_data); if (ext_atom != NULL) ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); } else if (strcmp (mimetype, "video/x-svq") == 0) { gint version = 0; const GstBuffer *seqh = NULL; const GValue *seqh_value; gdouble gamma = 0; gst_structure_get_int (structure, "svqversion", &version); if (version == 3) { entry.fourcc = FOURCC_SVQ3; entry.version = 3; entry.depth = 32; seqh_value = gst_structure_get_value (structure, "seqh"); if (seqh_value) { seqh = gst_value_get_buffer (seqh_value); ext_atom = build_SMI_atom (seqh); if (ext_atom) ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); } /* we need to add the gamma anyway because quicktime might crash * when it doesn't find it */ if (!gst_structure_get_double (structure, "applied-gamma", &gamma)) { /* it seems that using 0 here makes it ignored */ gamma = 0.0; } ext_atom = build_gama_atom (gamma); if (ext_atom) ext_atom_list = g_list_prepend (ext_atom_list, ext_atom); } else { GST_WARNING_OBJECT (qtmux, "SVQ version %d not supported. Please file " "a bug at http://bugzilla.gnome.org", version); } } else if (strcmp (mimetype, "video/x-dv") == 0) { gint version = 0; gboolean pal = TRUE; sync = FALSE; if (framerate_num != 25 || framerate_den != 1) pal = FALSE; gst_structure_get_int (structure, "dvversion", &version); /* fall back to typical one */ if (!version) version = 25; switch (version) { case 25: if (pal) entry.fourcc = GST_MAKE_FOURCC ('d', 'v', 'c', 'p'); else entry.fourcc = GST_MAKE_FOURCC ('d', 'v', 'c', ' '); break; case 50: if (pal) entry.fourcc = GST_MAKE_FOURCC ('d', 'v', '5', 'p'); else entry.fourcc = GST_MAKE_FOURCC ('d', 'v', '5', 'n'); break; default: GST_WARNING_OBJECT (qtmux, "unrecognized dv version"); break; } } else if (strcmp (mimetype, "image/jpeg") == 0) { entry.fourcc = FOURCC_jpeg; sync = FALSE; } else if (strcmp (mimetype, "image/x-j2c") == 0 || strcmp (mimetype, "image/x-jpc") == 0) { guint32 fourcc; const GValue *cmap_array; const GValue *cdef_array; gint ncomp = 0; gint fields = 1; if (strcmp (mimetype, "image/x-jpc") == 0) { qtpad->prepare_buf_func = gst_qt_mux_prepare_jpc_buffer; } gst_structure_get_int (structure, "num-components", &ncomp); gst_structure_get_int (structure, "fields", &fields); cmap_array = gst_structure_get_value (structure, "component-map"); cdef_array = gst_structure_get_value (structure, "channel-definitions"); ext_atom = NULL; entry.fourcc = FOURCC_mjp2; sync = FALSE; if (gst_structure_get_fourcc (structure, "fourcc", &fourcc) && (ext_atom = build_jp2h_extension (qtpad->trak, width, height, fourcc, ncomp, cmap_array, cdef_array)) != NULL) { ext_atom_list = g_list_append (ext_atom_list, ext_atom); ext_atom = build_fiel_extension (fields); if (ext_atom) ext_atom_list = g_list_append (ext_atom_list, ext_atom); ext_atom = build_jp2x_extension (codec_data); if (ext_atom) ext_atom_list = g_list_append (ext_atom_list, ext_atom); } else { GST_DEBUG_OBJECT (qtmux, "missing or invalid fourcc in jp2 caps"); goto refuse_caps; } } else if (strcmp (mimetype, "video/x-vp8") == 0) { entry.fourcc = FOURCC_VP80; sync = FALSE; } else if (strcmp (mimetype, "video/x-dirac") == 0) { entry.fourcc = FOURCC_drac; qtpad->have_dts = TRUE; } else if (strcmp (mimetype, "video/x-qt-part") == 0) { guint32 fourcc; gst_structure_get_fourcc (structure, "format", &fourcc); entry.fourcc = fourcc; qtpad->have_dts = TRUE; } else if (strcmp (mimetype, "video/x-mp4-part") == 0) { guint32 fourcc; gst_structure_get_fourcc (structure, "format", &fourcc); entry.fourcc = fourcc; qtpad->have_dts = TRUE; } if (!entry.fourcc) goto refuse_caps; /* ok, set the pad info accordingly */ qtpad->fourcc = entry.fourcc; qtpad->sync = sync; atom_trak_set_video_type (qtpad->trak, qtmux->context, &entry, rate, ext_atom_list); gst_object_unref (qtmux); return TRUE; /* ERRORS */ refuse_caps: { GST_WARNING_OBJECT (qtmux, "pad %s refused caps %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); gst_object_unref (qtmux); return FALSE; } refuse_renegotiation: { GST_WARNING_OBJECT (qtmux, "pad %s refused renegotiation to %" GST_PTR_FORMAT " from %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps, GST_PAD_CAPS (pad)); gst_object_unref (qtmux); return FALSE; } } static gboolean gst_qt_mux_sink_event (GstPad * pad, GstEvent * event) { gboolean ret; GstQTMux *qtmux; guint32 avg_bitrate = 0, max_bitrate = 0; qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ GstTagList *list; GstTagSetter *setter = GST_TAG_SETTER (qtmux); GstTagMergeMode mode; GST_OBJECT_LOCK (qtmux); mode = gst_tag_setter_get_tag_merge_mode (setter); GST_DEBUG_OBJECT (qtmux, "received tag event"); gst_event_parse_tag (event, &list); gst_tag_setter_merge_tags (setter, list, mode); GST_OBJECT_UNLOCK (qtmux); if (gst_tag_list_get_uint (list, GST_TAG_BITRATE, &avg_bitrate) | gst_tag_list_get_uint (list, GST_TAG_MAXIMUM_BITRATE, &max_bitrate)) { GstQTPad *qtpad = gst_pad_get_element_private (pad); g_assert (qtpad); if (avg_bitrate > 0 && avg_bitrate < G_MAXUINT32) qtpad->avg_bitrate = avg_bitrate; if (max_bitrate > 0 && max_bitrate < G_MAXUINT32) qtpad->max_bitrate = max_bitrate; } break; } default: break; } ret = qtmux->collect_event (pad, event); gst_object_unref (qtmux); return ret; } static void gst_qt_mux_release_pad (GstElement * element, GstPad * pad) { GstQTMux *mux = GST_QT_MUX_CAST (element); GSList *walk; GST_DEBUG_OBJECT (element, "Releasing %s:%s", GST_DEBUG_PAD_NAME (pad)); for (walk = mux->sinkpads; walk; walk = g_slist_next (walk)) { GstQTPad *qtpad = (GstQTPad *) walk->data; GST_DEBUG ("Checking %s:%s", GST_DEBUG_PAD_NAME (qtpad->collect.pad)); if (qtpad->collect.pad == pad) { /* this is it, remove */ mux->sinkpads = g_slist_delete_link (mux->sinkpads, walk); gst_element_remove_pad (element, pad); break; } } gst_collect_pads_remove_pad (mux->collect, pad); } static GstPad * gst_qt_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); GstQTMux *qtmux = GST_QT_MUX_CAST (element); GstQTPad *collect_pad; GstPad *newpad; gboolean audio; gchar *name; if (templ->direction != GST_PAD_SINK) goto wrong_direction; if (qtmux->state > GST_QT_MUX_STATE_STARTED) goto too_late; if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { audio = TRUE; name = g_strdup_printf ("audio_%02d", qtmux->audio_pads++); } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { audio = FALSE; name = g_strdup_printf ("video_%02d", qtmux->video_pads++); } else goto wrong_template; GST_DEBUG_OBJECT (qtmux, "Requested pad: %s", name); /* create pad and add to collections */ newpad = gst_pad_new_from_template (templ, name); g_free (name); collect_pad = (GstQTPad *) gst_collect_pads_add_pad_full (qtmux->collect, newpad, sizeof (GstQTPad), (GstCollectDataDestroyNotify) (gst_qt_mux_pad_reset)); /* set up pad */ gst_qt_mux_pad_reset (collect_pad); collect_pad->trak = atom_trak_new (qtmux->context); atom_moov_add_trak (qtmux->moov, collect_pad->trak); qtmux->sinkpads = g_slist_append (qtmux->sinkpads, collect_pad); /* set up pad functions */ if (audio) gst_pad_set_setcaps_function (newpad, GST_DEBUG_FUNCPTR (gst_qt_mux_audio_sink_set_caps)); else gst_pad_set_setcaps_function (newpad, GST_DEBUG_FUNCPTR (gst_qt_mux_video_sink_set_caps)); /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events. */ qtmux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad); gst_pad_set_event_function (newpad, GST_DEBUG_FUNCPTR (gst_qt_mux_sink_event)); gst_pad_set_active (newpad, TRUE); gst_element_add_pad (element, newpad); return newpad; /* ERRORS */ wrong_direction: { GST_WARNING_OBJECT (qtmux, "Request pad that is not a SINK pad."); return NULL; } too_late: { GST_WARNING_OBJECT (qtmux, "Not providing request pad after stream start."); return NULL; } wrong_template: { GST_WARNING_OBJECT (qtmux, "This is not our template!"); return NULL; } } static void gst_qt_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstQTMux *qtmux = GST_QT_MUX_CAST (object); GST_OBJECT_LOCK (qtmux); switch (prop_id) { case PROP_MOVIE_TIMESCALE: g_value_set_uint (value, qtmux->timescale); break; case PROP_TRAK_TIMESCALE: g_value_set_uint (value, qtmux->trak_timescale); break; case PROP_DO_CTTS: g_value_set_boolean (value, qtmux->guess_pts); break; case PROP_DTS_METHOD: g_value_set_enum (value, qtmux->dts_method); break; case PROP_FAST_START: g_value_set_boolean (value, qtmux->fast_start); break; case PROP_FAST_START_TEMP_FILE: g_value_set_string (value, qtmux->fast_start_file_path); break; case PROP_MOOV_RECOV_FILE: g_value_set_string (value, qtmux->moov_recov_file_path); break; case PROP_FRAGMENT_DURATION: g_value_set_uint (value, qtmux->fragment_duration); break; case PROP_STREAMABLE: g_value_set_boolean (value, qtmux->streamable); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (qtmux); } static void gst_qt_mux_generate_fast_start_file_path (GstQTMux * qtmux) { gchar *tmp; g_free (qtmux->fast_start_file_path); qtmux->fast_start_file_path = NULL; tmp = g_strdup_printf ("%s%d", "qtmux", g_random_int ()); qtmux->fast_start_file_path = g_build_filename (g_get_tmp_dir (), tmp, NULL); g_free (tmp); } static void gst_qt_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstQTMux *qtmux = GST_QT_MUX_CAST (object); GST_OBJECT_LOCK (qtmux); switch (prop_id) { case PROP_MOVIE_TIMESCALE: qtmux->timescale = g_value_get_uint (value); break; case PROP_TRAK_TIMESCALE: qtmux->trak_timescale = g_value_get_uint (value); break; case PROP_DO_CTTS: qtmux->guess_pts = g_value_get_boolean (value); break; case PROP_DTS_METHOD: qtmux->dts_method = g_value_get_enum (value); break; case PROP_FAST_START: qtmux->fast_start = g_value_get_boolean (value); break; case PROP_FAST_START_TEMP_FILE: g_free (qtmux->fast_start_file_path); qtmux->fast_start_file_path = g_value_dup_string (value); /* NULL means to generate a random one */ if (!qtmux->fast_start_file_path) { gst_qt_mux_generate_fast_start_file_path (qtmux); } break; case PROP_MOOV_RECOV_FILE: g_free (qtmux->moov_recov_file_path); qtmux->moov_recov_file_path = g_value_dup_string (value); break; case PROP_FRAGMENT_DURATION: qtmux->fragment_duration = g_value_get_uint (value); break; case PROP_STREAMABLE: qtmux->streamable = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (qtmux); } static GstStateChangeReturn gst_qt_mux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstQTMux *qtmux = GST_QT_MUX_CAST (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_collect_pads_start (qtmux->collect); qtmux->state = GST_QT_MUX_STATE_STARTED; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_collect_pads_stop (qtmux->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_qt_mux_reset (qtmux, TRUE); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_qt_mux_register (GstPlugin * plugin) { GTypeInfo typeinfo = { sizeof (GstQTMuxClass), (GBaseInitFunc) gst_qt_mux_base_init, NULL, (GClassInitFunc) gst_qt_mux_class_init, NULL, NULL, sizeof (GstQTMux), 0, (GInstanceInitFunc) gst_qt_mux_init, }; static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; static const GInterfaceInfo tag_xmp_writer_info = { NULL, NULL, NULL }; GType type; GstQTMuxFormat format; GstQTMuxClassParams *params; guint i = 0; GST_DEBUG_CATEGORY_INIT (gst_qt_mux_debug, "qtmux", 0, "QT Muxer"); GST_LOG ("Registering muxers"); while (TRUE) { GstQTMuxFormatProp *prop; prop = &gst_qt_mux_format_list[i]; format = prop->format; if (format == GST_QT_MUX_FORMAT_NONE) break; /* create a cache for these properties */ params = g_new0 (GstQTMuxClassParams, 1); params->prop = prop; params->src_caps = gst_static_caps_get (&prop->src_caps); params->video_sink_caps = gst_static_caps_get (&prop->video_sink_caps); params->audio_sink_caps = gst_static_caps_get (&prop->audio_sink_caps); /* create the type now */ type = g_type_register_static (GST_TYPE_ELEMENT, prop->type_name, &typeinfo, 0); g_type_set_qdata (type, GST_QT_MUX_PARAMS_QDATA, (gpointer) params); g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info); g_type_add_interface_static (type, GST_TYPE_TAG_XMP_WRITER, &tag_xmp_writer_info); if (!gst_element_register (plugin, prop->name, prop->rank, type)) return FALSE; i++; } GST_LOG ("Finished registering muxers"); /* FIXME: ideally classification tag should be added and registered in gstreamer core gsttaglist */ GST_LOG ("Registering tags"); gst_tag_register (GST_TAG_3GP_CLASSIFICATION, GST_TAG_FLAG_META, G_TYPE_STRING, GST_TAG_3GP_CLASSIFICATION, "content classification", gst_tag_merge_use_first); GST_LOG ("Finished registering tags"); return TRUE; } gst-plugins-good-0.10.31/gst/isomp4/atoms.c0000644000175000017500000033750411677341655015331 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008-2010 Thiago Santos * Copyright (C) 2008 Mark Nauwelaerts * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #include "atoms.h" #include #include #include #include #include /** * Creates a new AtomsContext for the given flavor. */ AtomsContext * atoms_context_new (AtomsTreeFlavor flavor) { AtomsContext *context = g_new0 (AtomsContext, 1); context->flavor = flavor; return context; } /** * Frees an AtomsContext and all memory associated with it */ void atoms_context_free (AtomsContext * context) { g_free (context); } /* -- creation, initialization, clear and free functions -- */ #define SECS_PER_DAY (24 * 60 * 60) #define LEAP_YEARS_FROM_1904_TO_1970 17 static guint64 get_current_qt_time (void) { GTimeVal timeval; g_get_current_time (&timeval); /* FIXME this should use UTC coordinated time */ return timeval.tv_sec + (((1970 - 1904) * (guint64) 365) + LEAP_YEARS_FROM_1904_TO_1970) * SECS_PER_DAY; } static void common_time_info_init (TimeInfo * ti) { ti->creation_time = ti->modification_time = get_current_qt_time (); ti->timescale = 0; ti->duration = 0; } static void atom_header_set (Atom * header, guint32 fourcc, gint32 size, gint64 ext_size) { header->type = fourcc; header->size = size; header->extended_size = ext_size; } static void atom_clear (Atom * atom) { } static void atom_full_init (AtomFull * full, guint32 fourcc, gint32 size, gint64 ext_size, guint8 version, guint8 flags[3]) { atom_header_set (&(full->header), fourcc, size, ext_size); full->version = version; full->flags[0] = flags[0]; full->flags[1] = flags[1]; full->flags[2] = flags[2]; } static void atom_full_clear (AtomFull * full) { atom_clear (&full->header); } static void atom_full_free (AtomFull * full) { atom_full_clear (full); g_free (full); } static guint32 atom_full_get_flags_as_uint (AtomFull * full) { return full->flags[0] << 16 | full->flags[1] << 8 | full->flags[2]; } static void atom_full_set_flags_as_uint (AtomFull * full, guint32 flags_as_uint) { full->flags[2] = flags_as_uint & 0xFF; full->flags[1] = (flags_as_uint & 0xFF00) >> 8; full->flags[0] = (flags_as_uint & 0xFF0000) >> 16; } static AtomInfo * build_atom_info_wrapper (Atom * atom, gpointer copy_func, gpointer free_func) { AtomInfo *info = NULL; if (atom) { info = g_new0 (AtomInfo, 1); info->atom = atom; info->copy_data_func = copy_func; info->free_func = free_func; } return info; } static GList * atom_info_list_prepend_atom (GList * ai, Atom * atom, AtomCopyDataFunc copy_func, AtomFreeFunc free_func) { if (atom) return g_list_prepend (ai, build_atom_info_wrapper (atom, copy_func, free_func)); else return ai; } static void atom_info_list_free (GList * ai) { while (ai) { AtomInfo *info = (AtomInfo *) ai->data; info->free_func (info->atom); g_free (info); ai = g_list_delete_link (ai, ai); } } static AtomData * atom_data_new (guint32 fourcc) { AtomData *data = g_new0 (AtomData, 1); atom_header_set (&data->header, fourcc, 0, 0); return data; } static void atom_data_alloc_mem (AtomData * data, guint32 size) { if (data->data) { g_free (data->data); } data->data = g_new0 (guint8, size); data->datalen = size; } static AtomData * atom_data_new_from_gst_buffer (guint32 fourcc, const GstBuffer * buf) { AtomData *data = atom_data_new (fourcc); atom_data_alloc_mem (data, GST_BUFFER_SIZE (buf)); g_memmove (data->data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); return data; } static void atom_data_free (AtomData * data) { atom_clear (&data->header); g_free (data->data); g_free (data); } static AtomUUID * atom_uuid_new (void) { AtomUUID *uuid = g_new0 (AtomUUID, 1); atom_header_set (&uuid->header, FOURCC_uuid, 0, 0); return uuid; } static void atom_uuid_free (AtomUUID * data) { atom_clear (&data->header); g_free (data->data); g_free (data); } static void atom_ftyp_init (AtomFTYP * ftyp, guint32 major, guint32 version, GList * brands) { gint index; GList *it = NULL; atom_header_set (&ftyp->header, FOURCC_ftyp, 16, 0); ftyp->major_brand = major; ftyp->version = version; /* always include major brand as compatible brand */ ftyp->compatible_brands_size = g_list_length (brands) + 1; ftyp->compatible_brands = g_new (guint32, ftyp->compatible_brands_size); ftyp->compatible_brands[0] = major; index = 1; for (it = brands; it != NULL; it = g_list_next (it)) { ftyp->compatible_brands[index++] = GPOINTER_TO_UINT (it->data); } } AtomFTYP * atom_ftyp_new (AtomsContext * context, guint32 major, guint32 version, GList * brands) { AtomFTYP *ftyp = g_new0 (AtomFTYP, 1); atom_ftyp_init (ftyp, major, version, brands); return ftyp; } void atom_ftyp_free (AtomFTYP * ftyp) { atom_clear (&ftyp->header); g_free (ftyp->compatible_brands); ftyp->compatible_brands = NULL; g_free (ftyp); } static void atom_esds_init (AtomESDS * esds) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&esds->header, FOURCC_esds, 0, 0, 0, flags); desc_es_init (&esds->es); } static AtomESDS * atom_esds_new (void) { AtomESDS *esds = g_new0 (AtomESDS, 1); atom_esds_init (esds); return esds; } static void atom_esds_free (AtomESDS * esds) { atom_full_clear (&esds->header); desc_es_descriptor_clear (&esds->es); g_free (esds); } static AtomFRMA * atom_frma_new (void) { AtomFRMA *frma = g_new0 (AtomFRMA, 1); atom_header_set (&frma->header, FOURCC_frma, 0, 0); return frma; } static void atom_frma_free (AtomFRMA * frma) { atom_clear (&frma->header); g_free (frma); } static AtomWAVE * atom_wave_new (void) { AtomWAVE *wave = g_new0 (AtomWAVE, 1); atom_header_set (&wave->header, FOURCC_wave, 0, 0); return wave; } static void atom_wave_free (AtomWAVE * wave) { atom_clear (&wave->header); atom_info_list_free (wave->extension_atoms); g_free (wave); } static void atom_elst_init (AtomELST * elst) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&elst->header, FOURCC_elst, 0, 0, 0, flags); elst->entries = 0; } static void atom_elst_clear (AtomELST * elst) { GSList *walker; atom_full_clear (&elst->header); walker = elst->entries; while (walker) { g_free ((EditListEntry *) walker->data); walker = g_slist_next (walker); } g_slist_free (elst->entries); } static void atom_edts_init (AtomEDTS * edts) { atom_header_set (&edts->header, FOURCC_edts, 0, 0); atom_elst_init (&edts->elst); } static void atom_edts_clear (AtomEDTS * edts) { atom_clear (&edts->header); atom_elst_clear (&edts->elst); } static AtomEDTS * atom_edts_new (void) { AtomEDTS *edts = g_new0 (AtomEDTS, 1); atom_edts_init (edts); return edts; } static void atom_edts_free (AtomEDTS * edts) { atom_edts_clear (edts); g_free (edts); } static void atom_sample_entry_init (SampleTableEntry * se, guint32 type) { atom_header_set (&se->header, type, 0, 0); memset (se->reserved, 0, sizeof (guint8) * 6); se->data_reference_index = 0; } static void atom_sample_entry_free (SampleTableEntry * se) { atom_clear (&se->header); } static void sample_entry_mp4a_init (SampleTableEntryMP4A * mp4a) { atom_sample_entry_init (&mp4a->se, FOURCC_mp4a); mp4a->version = 0; mp4a->revision_level = 0; mp4a->vendor = 0; mp4a->channels = 2; mp4a->sample_size = 16; mp4a->compression_id = 0; mp4a->packet_size = 0; mp4a->sample_rate = 0; /* following only used if version is 1 */ mp4a->samples_per_packet = 0; mp4a->bytes_per_packet = 0; mp4a->bytes_per_frame = 0; mp4a->bytes_per_sample = 0; mp4a->extension_atoms = NULL; } static SampleTableEntryMP4A * sample_entry_mp4a_new (void) { SampleTableEntryMP4A *mp4a = g_new0 (SampleTableEntryMP4A, 1); sample_entry_mp4a_init (mp4a); return mp4a; } static void sample_entry_mp4a_free (SampleTableEntryMP4A * mp4a) { atom_sample_entry_free (&mp4a->se); atom_info_list_free (mp4a->extension_atoms); g_free (mp4a); } static void sample_entry_mp4v_init (SampleTableEntryMP4V * mp4v, AtomsContext * context) { atom_sample_entry_init (&mp4v->se, FOURCC_mp4v); mp4v->version = 0; mp4v->revision_level = 0; mp4v->vendor = 0; mp4v->temporal_quality = 0; mp4v->spatial_quality = 0; /* qt and ISO base media do not contradict, and examples agree */ mp4v->horizontal_resolution = 0x00480000; mp4v->vertical_resolution = 0x00480000; mp4v->datasize = 0; mp4v->frame_count = 1; memset (mp4v->compressor, 0, sizeof (guint8) * 32); mp4v->depth = 0; mp4v->color_table_id = 0; mp4v->extension_atoms = NULL; } static void sample_entry_mp4v_free (SampleTableEntryMP4V * mp4v) { atom_sample_entry_free (&mp4v->se); atom_info_list_free (mp4v->extension_atoms); g_free (mp4v); } static SampleTableEntryMP4V * sample_entry_mp4v_new (AtomsContext * context) { SampleTableEntryMP4V *mp4v = g_new0 (SampleTableEntryMP4V, 1); sample_entry_mp4v_init (mp4v, context); return mp4v; } static void atom_stsd_init (AtomSTSD * stsd) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&stsd->header, FOURCC_stsd, 0, 0, 0, flags); stsd->entries = NULL; stsd->n_entries = 0; } static void atom_stsd_remove_entries (AtomSTSD * stsd) { GList *walker; walker = stsd->entries; while (walker) { GList *aux = walker; SampleTableEntry *se = (SampleTableEntry *) aux->data; walker = g_list_next (walker); stsd->entries = g_list_remove_link (stsd->entries, aux); switch (se->kind) { case AUDIO: sample_entry_mp4a_free ((SampleTableEntryMP4A *) se); break; case VIDEO: sample_entry_mp4v_free ((SampleTableEntryMP4V *) se); break; default: /* best possible cleanup */ atom_sample_entry_free (se); } g_list_free (aux); } stsd->n_entries = 0; } static void atom_stsd_clear (AtomSTSD * stsd) { atom_stsd_remove_entries (stsd); atom_full_clear (&stsd->header); } static void atom_ctts_init (AtomCTTS * ctts) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&ctts->header, FOURCC_ctts, 0, 0, 0, flags); atom_array_init (&ctts->entries, 128); ctts->do_pts = FALSE; } static AtomCTTS * atom_ctts_new (void) { AtomCTTS *ctts = g_new0 (AtomCTTS, 1); atom_ctts_init (ctts); return ctts; } static void atom_ctts_free (AtomCTTS * ctts) { atom_full_clear (&ctts->header); atom_array_clear (&ctts->entries); g_free (ctts); } static void atom_stts_init (AtomSTTS * stts) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&stts->header, FOURCC_stts, 0, 0, 0, flags); atom_array_init (&stts->entries, 512); } static void atom_stts_clear (AtomSTTS * stts) { atom_full_clear (&stts->header); atom_array_clear (&stts->entries); } static void atom_stsz_init (AtomSTSZ * stsz) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&stsz->header, FOURCC_stsz, 0, 0, 0, flags); atom_array_init (&stsz->entries, 1024); stsz->sample_size = 0; stsz->table_size = 0; } static void atom_stsz_clear (AtomSTSZ * stsz) { atom_full_clear (&stsz->header); atom_array_clear (&stsz->entries); stsz->table_size = 0; } static void atom_stsc_init (AtomSTSC * stsc) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&stsc->header, FOURCC_stsc, 0, 0, 0, flags); atom_array_init (&stsc->entries, 128); } static void atom_stsc_clear (AtomSTSC * stsc) { atom_full_clear (&stsc->header); atom_array_clear (&stsc->entries); } static void atom_co64_init (AtomSTCO64 * co64) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&co64->header, FOURCC_stco, 0, 0, 0, flags); atom_array_init (&co64->entries, 256); } static void atom_stco64_clear (AtomSTCO64 * stco64) { atom_full_clear (&stco64->header); atom_array_clear (&stco64->entries); } static void atom_stss_init (AtomSTSS * stss) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&stss->header, FOURCC_stss, 0, 0, 0, flags); atom_array_init (&stss->entries, 128); } static void atom_stss_clear (AtomSTSS * stss) { atom_full_clear (&stss->header); atom_array_clear (&stss->entries); } void atom_stbl_init (AtomSTBL * stbl) { atom_header_set (&stbl->header, FOURCC_stbl, 0, 0); atom_stts_init (&stbl->stts); atom_stss_init (&stbl->stss); atom_stsd_init (&stbl->stsd); atom_stsz_init (&stbl->stsz); atom_stsc_init (&stbl->stsc); stbl->ctts = NULL; atom_co64_init (&stbl->stco64); } void atom_stbl_clear (AtomSTBL * stbl) { atom_clear (&stbl->header); atom_stsd_clear (&stbl->stsd); atom_stts_clear (&stbl->stts); atom_stss_clear (&stbl->stss); atom_stsc_clear (&stbl->stsc); atom_stsz_clear (&stbl->stsz); if (stbl->ctts) { atom_ctts_free (stbl->ctts); } atom_stco64_clear (&stbl->stco64); } static void atom_vmhd_init (AtomVMHD * vmhd, AtomsContext * context) { guint8 flags[3] = { 0, 0, 1 }; atom_full_init (&vmhd->header, FOURCC_vmhd, 0, 0, 0, flags); vmhd->graphics_mode = 0x0; memset (vmhd->opcolor, 0, sizeof (guint16) * 3); if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { vmhd->graphics_mode = 0x40; vmhd->opcolor[0] = 32768; vmhd->opcolor[1] = 32768; vmhd->opcolor[2] = 32768; } } static AtomVMHD * atom_vmhd_new (AtomsContext * context) { AtomVMHD *vmhd = g_new0 (AtomVMHD, 1); atom_vmhd_init (vmhd, context); return vmhd; } static void atom_vmhd_free (AtomVMHD * vmhd) { atom_full_clear (&vmhd->header); g_free (vmhd); } static void atom_smhd_init (AtomSMHD * smhd) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&smhd->header, FOURCC_smhd, 0, 0, 0, flags); smhd->balance = 0; smhd->reserved = 0; } static AtomSMHD * atom_smhd_new (void) { AtomSMHD *smhd = g_new0 (AtomSMHD, 1); atom_smhd_init (smhd); return smhd; } static void atom_smhd_free (AtomSMHD * smhd) { atom_full_clear (&smhd->header); g_free (smhd); } static void atom_hmhd_free (AtomHMHD * hmhd) { atom_full_clear (&hmhd->header); g_free (hmhd); } static void atom_hdlr_init (AtomHDLR * hdlr) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&hdlr->header, FOURCC_hdlr, 0, 0, 0, flags); hdlr->component_type = 0; hdlr->handler_type = 0; hdlr->manufacturer = 0; hdlr->flags = 0; hdlr->flags_mask = 0; hdlr->name = g_strdup (""); } static AtomHDLR * atom_hdlr_new (void) { AtomHDLR *hdlr = g_new0 (AtomHDLR, 1); atom_hdlr_init (hdlr); return hdlr; } static void atom_hdlr_clear (AtomHDLR * hdlr) { atom_full_clear (&hdlr->header); if (hdlr->name) { g_free (hdlr->name); hdlr->name = NULL; } } static void atom_hdlr_free (AtomHDLR * hdlr) { atom_hdlr_clear (hdlr); g_free (hdlr); } static void atom_url_init (AtomURL * url) { guint8 flags[3] = { 0, 0, 1 }; atom_full_init (&url->header, FOURCC_url_, 0, 0, 0, flags); url->location = NULL; } static void atom_url_free (AtomURL * url) { atom_full_clear (&url->header); if (url->location) { g_free (url->location); url->location = NULL; } g_free (url); } static AtomURL * atom_url_new (void) { AtomURL *url = g_new0 (AtomURL, 1); atom_url_init (url); return url; } static AtomFull * atom_alis_new (void) { guint8 flags[3] = { 0, 0, 1 }; AtomFull *alis = g_new0 (AtomFull, 1); atom_full_init (alis, FOURCC_alis, 0, 0, 0, flags); return alis; } static void atom_dref_init (AtomDREF * dref, AtomsContext * context) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&dref->header, FOURCC_dref, 0, 0, 0, flags); /* in either case, alis or url init arranges to set self-contained flag */ if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { /* alis dref for qt */ AtomFull *alis = atom_alis_new (); dref->entries = g_list_append (dref->entries, alis); } else { /* url for iso spec, as 'alis' not specified there */ AtomURL *url = atom_url_new (); dref->entries = g_list_append (dref->entries, url); } } static void atom_dref_clear (AtomDREF * dref) { GList *walker; atom_full_clear (&dref->header); walker = dref->entries; while (walker) { GList *aux = walker; Atom *atom = (Atom *) aux->data; walker = g_list_next (walker); dref->entries = g_list_remove_link (dref->entries, aux); switch (atom->type) { case FOURCC_alis: atom_full_free ((AtomFull *) atom); break; case FOURCC_url_: atom_url_free ((AtomURL *) atom); break; default: /* we do nothing, better leak than crash */ break; } g_list_free (aux); } } static void atom_dinf_init (AtomDINF * dinf, AtomsContext * context) { atom_header_set (&dinf->header, FOURCC_dinf, 0, 0); atom_dref_init (&dinf->dref, context); } static void atom_dinf_clear (AtomDINF * dinf) { atom_clear (&dinf->header); atom_dref_clear (&dinf->dref); } static void atom_minf_init (AtomMINF * minf, AtomsContext * context) { atom_header_set (&minf->header, FOURCC_minf, 0, 0); minf->vmhd = NULL; minf->smhd = NULL; minf->hmhd = NULL; if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { minf->hdlr = atom_hdlr_new (); minf->hdlr->component_type = FOURCC_dhlr; minf->hdlr->handler_type = FOURCC_alis; } else { minf->hdlr = NULL; } atom_dinf_init (&minf->dinf, context); atom_stbl_init (&minf->stbl); } static void atom_minf_clear_handlers (AtomMINF * minf) { if (minf->vmhd) { atom_vmhd_free (minf->vmhd); minf->vmhd = NULL; } if (minf->smhd) { atom_smhd_free (minf->smhd); minf->smhd = NULL; } if (minf->hmhd) { atom_hmhd_free (minf->hmhd); minf->hmhd = NULL; } } static void atom_minf_clear (AtomMINF * minf) { atom_clear (&minf->header); atom_minf_clear_handlers (minf); if (minf->hdlr) { atom_hdlr_free (minf->hdlr); } atom_dinf_clear (&minf->dinf); atom_stbl_clear (&minf->stbl); } static void atom_mdhd_init (AtomMDHD * mdhd) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&mdhd->header, FOURCC_mdhd, 0, 0, 0, flags); common_time_info_init (&mdhd->time_info); mdhd->language_code = 0; mdhd->quality = 0; } static void atom_mdhd_clear (AtomMDHD * mdhd) { atom_full_clear (&mdhd->header); } static void atom_mdia_init (AtomMDIA * mdia, AtomsContext * context) { atom_header_set (&mdia->header, FOURCC_mdia, 0, 0); atom_mdhd_init (&mdia->mdhd); atom_hdlr_init (&mdia->hdlr); atom_minf_init (&mdia->minf, context); } static void atom_mdia_clear (AtomMDIA * mdia) { atom_clear (&mdia->header); atom_mdhd_clear (&mdia->mdhd); atom_hdlr_clear (&mdia->hdlr); atom_minf_clear (&mdia->minf); } static void atom_tkhd_init (AtomTKHD * tkhd, AtomsContext * context) { /* * flags info * 1 -> track enabled * 2 -> track in movie * 4 -> track in preview */ guint8 flags[3] = { 0, 0, 7 }; atom_full_init (&tkhd->header, FOURCC_tkhd, 0, 0, 0, flags); tkhd->creation_time = tkhd->modification_time = get_current_qt_time (); tkhd->duration = 0; tkhd->track_ID = 0; tkhd->reserved = 0; tkhd->reserved2[0] = tkhd->reserved2[1] = 0; tkhd->layer = 0; tkhd->alternate_group = 0; tkhd->volume = 0; tkhd->reserved3 = 0; memset (tkhd->matrix, 0, sizeof (guint32) * 9); tkhd->matrix[0] = 1 << 16; tkhd->matrix[4] = 1 << 16; tkhd->matrix[8] = 16384 << 16; tkhd->width = 0; tkhd->height = 0; } static void atom_tkhd_clear (AtomTKHD * tkhd) { atom_full_clear (&tkhd->header); } static void atom_trak_init (AtomTRAK * trak, AtomsContext * context) { atom_header_set (&trak->header, FOURCC_trak, 0, 0); atom_tkhd_init (&trak->tkhd, context); trak->edts = NULL; atom_mdia_init (&trak->mdia, context); } AtomTRAK * atom_trak_new (AtomsContext * context) { AtomTRAK *trak = g_new0 (AtomTRAK, 1); atom_trak_init (trak, context); return trak; } static void atom_trak_clear (AtomTRAK * trak) { atom_clear (&trak->header); atom_tkhd_clear (&trak->tkhd); if (trak->edts) atom_edts_free (trak->edts); atom_mdia_clear (&trak->mdia); } static void atom_trak_free (AtomTRAK * trak) { atom_trak_clear (trak); g_free (trak); } static void atom_ilst_init (AtomILST * ilst) { atom_header_set (&ilst->header, FOURCC_ilst, 0, 0); ilst->entries = NULL; } static AtomILST * atom_ilst_new (void) { AtomILST *ilst = g_new0 (AtomILST, 1); atom_ilst_init (ilst); return ilst; } static void atom_ilst_free (AtomILST * ilst) { if (ilst->entries) atom_info_list_free (ilst->entries); atom_clear (&ilst->header); g_free (ilst); } static void atom_meta_init (AtomMETA * meta) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&meta->header, FOURCC_meta, 0, 0, 0, flags); atom_hdlr_init (&meta->hdlr); /* FIXME (ISOM says this is always 0) */ meta->hdlr.component_type = FOURCC_mhlr; meta->hdlr.handler_type = FOURCC_mdir; meta->ilst = NULL; } static AtomMETA * atom_meta_new (void) { AtomMETA *meta = g_new0 (AtomMETA, 1); atom_meta_init (meta); return meta; } static void atom_meta_free (AtomMETA * meta) { atom_full_clear (&meta->header); atom_hdlr_clear (&meta->hdlr); if (meta->ilst) atom_ilst_free (meta->ilst); meta->ilst = NULL; g_free (meta); } static void atom_udta_init (AtomUDTA * udta) { atom_header_set (&udta->header, FOURCC_udta, 0, 0); udta->meta = NULL; } static AtomUDTA * atom_udta_new (void) { AtomUDTA *udta = g_new0 (AtomUDTA, 1); atom_udta_init (udta); return udta; } static void atom_udta_free (AtomUDTA * udta) { atom_clear (&udta->header); if (udta->meta) atom_meta_free (udta->meta); udta->meta = NULL; if (udta->entries) atom_info_list_free (udta->entries); g_free (udta); } static void atom_tag_data_init (AtomTagData * data) { guint8 flags[] = { 0, 0, 0 }; atom_full_init (&data->header, FOURCC_data, 0, 0, 0, flags); } static void atom_tag_data_clear (AtomTagData * data) { atom_full_clear (&data->header); g_free (data->data); data->datalen = 0; } /* * Fourcc is the tag fourcc * flags will be truncated to 24bits */ static AtomTag * atom_tag_new (guint32 fourcc, guint32 flags_as_uint) { AtomTag *tag = g_new0 (AtomTag, 1); tag->header.type = fourcc; atom_tag_data_init (&tag->data); atom_full_set_flags_as_uint (&tag->data.header, flags_as_uint); return tag; } static void atom_tag_free (AtomTag * tag) { atom_clear (&tag->header); atom_tag_data_clear (&tag->data); g_free (tag); } static void atom_mvhd_init (AtomMVHD * mvhd) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&(mvhd->header), FOURCC_mvhd, sizeof (AtomMVHD), 0, 0, flags); common_time_info_init (&mvhd->time_info); mvhd->prefered_rate = 1 << 16; mvhd->volume = 1 << 8; mvhd->reserved3 = 0; memset (mvhd->reserved4, 0, sizeof (guint32[2])); memset (mvhd->matrix, 0, sizeof (guint32[9])); mvhd->matrix[0] = 1 << 16; mvhd->matrix[4] = 1 << 16; mvhd->matrix[8] = 16384 << 16; mvhd->preview_time = 0; mvhd->preview_duration = 0; mvhd->poster_time = 0; mvhd->selection_time = 0; mvhd->selection_duration = 0; mvhd->current_time = 0; mvhd->next_track_id = 1; } static void atom_mvhd_clear (AtomMVHD * mvhd) { atom_full_clear (&mvhd->header); } static void atom_mehd_init (AtomMEHD * mehd) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&mehd->header, FOURCC_mehd, 0, 0, 1, flags); mehd->fragment_duration = 0; } static void atom_mvex_init (AtomMVEX * mvex) { atom_header_set (&mvex->header, FOURCC_mvex, 0, 0); atom_mehd_init (&mvex->mehd); mvex->trexs = NULL; } static void atom_moov_init (AtomMOOV * moov, AtomsContext * context) { atom_header_set (&(moov->header), FOURCC_moov, 0, 0); atom_mvhd_init (&(moov->mvhd)); atom_mvex_init (&(moov->mvex)); moov->udta = NULL; moov->traks = NULL; moov->context = *context; } AtomMOOV * atom_moov_new (AtomsContext * context) { AtomMOOV *moov = g_new0 (AtomMOOV, 1); atom_moov_init (moov, context); return moov; } static void atom_trex_free (AtomTREX * trex) { atom_full_clear (&trex->header); g_free (trex); } static void atom_mvex_clear (AtomMVEX * mvex) { GList *walker; atom_clear (&mvex->header); walker = mvex->trexs; while (walker) { atom_trex_free ((AtomTREX *) walker->data); walker = g_list_next (walker); } g_list_free (mvex->trexs); mvex->trexs = NULL; } void atom_moov_free (AtomMOOV * moov) { GList *walker; atom_clear (&moov->header); atom_mvhd_clear (&moov->mvhd); walker = moov->traks; while (walker) { atom_trak_free ((AtomTRAK *) walker->data); walker = g_list_next (walker); } g_list_free (moov->traks); moov->traks = NULL; if (moov->udta) { atom_udta_free (moov->udta); moov->udta = NULL; } atom_mvex_clear (&moov->mvex); g_free (moov); } /* -- end of init / free -- */ /* -- copy data functions -- */ static guint8 atom_full_get_version (AtomFull * full) { return full->version; } static guint64 common_time_info_copy_data (TimeInfo * ti, gboolean trunc_to_32, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (trunc_to_32) { prop_copy_uint32 ((guint32) ti->creation_time, buffer, size, offset); prop_copy_uint32 ((guint32) ti->modification_time, buffer, size, offset); prop_copy_uint32 (ti->timescale, buffer, size, offset); prop_copy_uint32 ((guint32) ti->duration, buffer, size, offset); } else { prop_copy_uint64 (ti->creation_time, buffer, size, offset); prop_copy_uint64 (ti->modification_time, buffer, size, offset); prop_copy_uint32 (ti->timescale, buffer, size, offset); prop_copy_uint64 (ti->duration, buffer, size, offset); } return *offset - original_offset; } static void atom_write_size (guint8 ** buffer, guint64 * size, guint64 * offset, guint64 atom_pos) { /* this only works for non-extended atom size, which is OK * (though it could be made to do mem_move, etc and write extended size) */ prop_copy_uint32 (*offset - atom_pos, buffer, size, &atom_pos); } guint64 atom_copy_data (Atom * atom, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; /* copies type and size */ prop_copy_uint32 (atom->size, buffer, size, offset); prop_copy_fourcc (atom->type, buffer, size, offset); /* extended size needed */ if (atom->size == 1) { /* really should not happen other than with mdat atom; * would be a problem for size (re)write code, not to mention memory */ g_return_val_if_fail (atom->type == FOURCC_mdat, 0); prop_copy_uint64 (atom->extended_size, buffer, size, offset); } return *offset - original_offset; } static guint64 atom_full_copy_data (AtomFull * atom, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&atom->header, buffer, size, offset)) { return 0; } prop_copy_uint8 (atom->version, buffer, size, offset); prop_copy_uint8_array (atom->flags, 3, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_info_list_copy_data (GList * ai, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; while (ai) { AtomInfo *info = (AtomInfo *) ai->data; if (!info->copy_data_func (info->atom, buffer, size, offset)) { return 0; } ai = g_list_next (ai); } return *offset - original_offset; } static guint64 atom_data_copy_data (AtomData * data, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&data->header, buffer, size, offset)) { return 0; } if (data->datalen) prop_copy_uint8_array (data->data, data->datalen, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_uuid_copy_data (AtomUUID * uuid, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&uuid->header, buffer, size, offset)) { return 0; } prop_copy_uint8_array (uuid->uuid, 16, buffer, size, offset); if (uuid->datalen) prop_copy_uint8_array (uuid->data, uuid->datalen, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_ftyp_copy_data (AtomFTYP * ftyp, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&ftyp->header, buffer, size, offset)) { return 0; } prop_copy_fourcc (ftyp->major_brand, buffer, size, offset); prop_copy_uint32 (ftyp->version, buffer, size, offset); prop_copy_fourcc_array (ftyp->compatible_brands, ftyp->compatible_brands_size, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_mvhd_copy_data (AtomMVHD * atom, guint8 ** buffer, guint64 * size, guint64 * offset) { guint8 version; guint64 original_offset = *offset; if (!atom_full_copy_data (&(atom->header), buffer, size, offset)) { return 0; } version = atom_full_get_version (&(atom->header)); if (version == 0) { common_time_info_copy_data (&atom->time_info, TRUE, buffer, size, offset); } else if (version == 1) { common_time_info_copy_data (&atom->time_info, FALSE, buffer, size, offset); } else { *offset = original_offset; return 0; } prop_copy_uint32 (atom->prefered_rate, buffer, size, offset); prop_copy_uint16 (atom->volume, buffer, size, offset); prop_copy_uint16 (atom->reserved3, buffer, size, offset); prop_copy_uint32_array (atom->reserved4, 2, buffer, size, offset); prop_copy_uint32_array (atom->matrix, 9, buffer, size, offset); prop_copy_uint32 (atom->preview_time, buffer, size, offset); prop_copy_uint32 (atom->preview_duration, buffer, size, offset); prop_copy_uint32 (atom->poster_time, buffer, size, offset); prop_copy_uint32 (atom->selection_time, buffer, size, offset); prop_copy_uint32 (atom->selection_duration, buffer, size, offset); prop_copy_uint32 (atom->current_time, buffer, size, offset); prop_copy_uint32 (atom->next_track_id, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_tkhd_copy_data (AtomTKHD * tkhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&tkhd->header, buffer, size, offset)) { return 0; } if (atom_full_get_version (&tkhd->header) == 0) { prop_copy_uint32 ((guint32) tkhd->creation_time, buffer, size, offset); prop_copy_uint32 ((guint32) tkhd->modification_time, buffer, size, offset); prop_copy_uint32 (tkhd->track_ID, buffer, size, offset); prop_copy_uint32 (tkhd->reserved, buffer, size, offset); prop_copy_uint32 ((guint32) tkhd->duration, buffer, size, offset); } else { prop_copy_uint64 (tkhd->creation_time, buffer, size, offset); prop_copy_uint64 (tkhd->modification_time, buffer, size, offset); prop_copy_uint32 (tkhd->track_ID, buffer, size, offset); prop_copy_uint32 (tkhd->reserved, buffer, size, offset); prop_copy_uint64 (tkhd->duration, buffer, size, offset); } prop_copy_uint32_array (tkhd->reserved2, 2, buffer, size, offset); prop_copy_uint16 (tkhd->layer, buffer, size, offset); prop_copy_uint16 (tkhd->alternate_group, buffer, size, offset); prop_copy_uint16 (tkhd->volume, buffer, size, offset); prop_copy_uint16 (tkhd->reserved3, buffer, size, offset); prop_copy_uint32_array (tkhd->matrix, 9, buffer, size, offset); prop_copy_uint32 (tkhd->width, buffer, size, offset); prop_copy_uint32 (tkhd->height, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_hdlr_copy_data (AtomHDLR * hdlr, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&hdlr->header, buffer, size, offset)) { return 0; } prop_copy_fourcc (hdlr->component_type, buffer, size, offset); prop_copy_fourcc (hdlr->handler_type, buffer, size, offset); prop_copy_fourcc (hdlr->manufacturer, buffer, size, offset); prop_copy_uint32 (hdlr->flags, buffer, size, offset); prop_copy_uint32 (hdlr->flags_mask, buffer, size, offset); prop_copy_size_string ((guint8 *) hdlr->name, strlen (hdlr->name), buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_vmhd_copy_data (AtomVMHD * vmhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&vmhd->header, buffer, size, offset)) { return 0; } prop_copy_uint16 (vmhd->graphics_mode, buffer, size, offset); prop_copy_uint16_array (vmhd->opcolor, 3, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return original_offset - *offset; } static guint64 atom_smhd_copy_data (AtomSMHD * smhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&smhd->header, buffer, size, offset)) { return 0; } prop_copy_uint16 (smhd->balance, buffer, size, offset); prop_copy_uint16 (smhd->reserved, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return original_offset - *offset; } static guint64 atom_hmhd_copy_data (AtomHMHD * hmhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&hmhd->header, buffer, size, offset)) { return 0; } prop_copy_uint16 (hmhd->max_pdu_size, buffer, size, offset); prop_copy_uint16 (hmhd->avg_pdu_size, buffer, size, offset); prop_copy_uint32 (hmhd->max_bitrate, buffer, size, offset); prop_copy_uint32 (hmhd->avg_bitrate, buffer, size, offset); prop_copy_uint32 (hmhd->sliding_avg_bitrate, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return original_offset - *offset; } static gboolean atom_url_same_file_flag (AtomURL * url) { return (url->header.flags[2] & 0x1) == 1; } static guint64 atom_url_copy_data (AtomURL * url, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&url->header, buffer, size, offset)) { return 0; } if (!atom_url_same_file_flag (url)) { prop_copy_null_terminated_string (url->location, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return original_offset - *offset; } guint64 atom_stts_copy_data (AtomSTTS * stts, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint i; if (!atom_full_copy_data (&stts->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (atom_array_get_len (&stts->entries), buffer, size, offset); /* minimize realloc */ prop_copy_ensure_buffer (buffer, size, offset, 8 * atom_array_get_len (&stts->entries)); for (i = 0; i < atom_array_get_len (&stts->entries); i++) { STTSEntry *entry = &atom_array_index (&stts->entries, i); prop_copy_uint32 (entry->sample_count, buffer, size, offset); prop_copy_int32 (entry->sample_delta, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_sample_entry_copy_data (SampleTableEntry * se, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&se->header, buffer, size, offset)) { return 0; } prop_copy_uint8_array (se->reserved, 6, buffer, size, offset); prop_copy_uint16 (se->data_reference_index, buffer, size, offset); return *offset - original_offset; } static guint64 atom_esds_copy_data (AtomESDS * esds, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&esds->header, buffer, size, offset)) { return 0; } if (!desc_es_descriptor_copy_data (&esds->es, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_frma_copy_data (AtomFRMA * frma, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&(frma->header), buffer, size, offset)) return 0; prop_copy_fourcc (frma->media_type, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_mp4s_copy_data (SampleTableEntryMP4S * mp4s, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_sample_entry_copy_data (&mp4s->se, buffer, size, offset)) { return 0; } if (!atom_esds_copy_data (&mp4s->es, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_hint_sample_entry_copy_data (AtomHintSampleEntry * hse, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_sample_entry_copy_data (&hse->se, buffer, size, offset)) { return 0; } prop_copy_uint32 (hse->size, buffer, size, offset); prop_copy_uint8_array (hse->data, hse->size, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 sample_entry_mp4a_copy_data (SampleTableEntryMP4A * mp4a, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_sample_entry_copy_data (&mp4a->se, buffer, size, offset)) { return 0; } prop_copy_uint16 (mp4a->version, buffer, size, offset); prop_copy_uint16 (mp4a->revision_level, buffer, size, offset); prop_copy_uint32 (mp4a->vendor, buffer, size, offset); prop_copy_uint16 (mp4a->channels, buffer, size, offset); prop_copy_uint16 (mp4a->sample_size, buffer, size, offset); prop_copy_uint16 (mp4a->compression_id, buffer, size, offset); prop_copy_uint16 (mp4a->packet_size, buffer, size, offset); prop_copy_uint32 (mp4a->sample_rate, buffer, size, offset); /* this should always be 0 for mp4 flavor */ if (mp4a->version == 1) { prop_copy_uint32 (mp4a->samples_per_packet, buffer, size, offset); prop_copy_uint32 (mp4a->bytes_per_packet, buffer, size, offset); prop_copy_uint32 (mp4a->bytes_per_frame, buffer, size, offset); prop_copy_uint32 (mp4a->bytes_per_sample, buffer, size, offset); } if (mp4a->extension_atoms) { if (!atom_info_list_copy_data (mp4a->extension_atoms, buffer, size, offset)) return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 sample_entry_mp4v_copy_data (SampleTableEntryMP4V * mp4v, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_sample_entry_copy_data (&mp4v->se, buffer, size, offset)) { return 0; } prop_copy_uint16 (mp4v->version, buffer, size, offset); prop_copy_uint16 (mp4v->revision_level, buffer, size, offset); prop_copy_fourcc (mp4v->vendor, buffer, size, offset); prop_copy_uint32 (mp4v->temporal_quality, buffer, size, offset); prop_copy_uint32 (mp4v->spatial_quality, buffer, size, offset); prop_copy_uint16 (mp4v->width, buffer, size, offset); prop_copy_uint16 (mp4v->height, buffer, size, offset); prop_copy_uint32 (mp4v->horizontal_resolution, buffer, size, offset); prop_copy_uint32 (mp4v->vertical_resolution, buffer, size, offset); prop_copy_uint32 (mp4v->datasize, buffer, size, offset); prop_copy_uint16 (mp4v->frame_count, buffer, size, offset); prop_copy_fixed_size_string ((guint8 *) mp4v->compressor, 32, buffer, size, offset); prop_copy_uint16 (mp4v->depth, buffer, size, offset); prop_copy_uint16 (mp4v->color_table_id, buffer, size, offset); /* extra atoms */ if (mp4v->extension_atoms && !atom_info_list_copy_data (mp4v->extension_atoms, buffer, size, offset)) return 0; atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_stsz_copy_data (AtomSTSZ * stsz, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint i; if (!atom_full_copy_data (&stsz->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (stsz->sample_size, buffer, size, offset); prop_copy_uint32 (stsz->table_size, buffer, size, offset); if (stsz->sample_size == 0) { /* minimize realloc */ prop_copy_ensure_buffer (buffer, size, offset, 4 * stsz->table_size); /* entry count must match sample count */ g_assert (atom_array_get_len (&stsz->entries) == stsz->table_size); for (i = 0; i < atom_array_get_len (&stsz->entries); i++) { prop_copy_uint32 (atom_array_index (&stsz->entries, i), buffer, size, offset); } } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_stsc_copy_data (AtomSTSC * stsc, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint i; if (!atom_full_copy_data (&stsc->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (atom_array_get_len (&stsc->entries), buffer, size, offset); /* minimize realloc */ prop_copy_ensure_buffer (buffer, size, offset, 12 * atom_array_get_len (&stsc->entries)); for (i = 0; i < atom_array_get_len (&stsc->entries); i++) { STSCEntry *entry = &atom_array_index (&stsc->entries, i); prop_copy_uint32 (entry->first_chunk, buffer, size, offset); prop_copy_uint32 (entry->samples_per_chunk, buffer, size, offset); prop_copy_uint32 (entry->sample_description_index, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_ctts_copy_data (AtomCTTS * ctts, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint i; if (!atom_full_copy_data (&ctts->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (atom_array_get_len (&ctts->entries), buffer, size, offset); /* minimize realloc */ prop_copy_ensure_buffer (buffer, size, offset, 8 * atom_array_get_len (&ctts->entries)); for (i = 0; i < atom_array_get_len (&ctts->entries); i++) { CTTSEntry *entry = &atom_array_index (&ctts->entries, i); prop_copy_uint32 (entry->samplecount, buffer, size, offset); prop_copy_uint32 (entry->sampleoffset, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_stco64_copy_data (AtomSTCO64 * stco64, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint i; gboolean trunc_to_32 = stco64->header.header.type == FOURCC_stco; if (!atom_full_copy_data (&stco64->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (atom_array_get_len (&stco64->entries), buffer, size, offset); /* minimize realloc */ prop_copy_ensure_buffer (buffer, size, offset, 8 * atom_array_get_len (&stco64->entries)); for (i = 0; i < atom_array_get_len (&stco64->entries); i++) { guint64 *value = &atom_array_index (&stco64->entries, i); if (trunc_to_32) { prop_copy_uint32 ((guint32) * value, buffer, size, offset); } else { prop_copy_uint64 (*value, buffer, size, offset); } } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_stss_copy_data (AtomSTSS * stss, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint i; if (atom_array_get_len (&stss->entries) == 0) { /* FIXME not needing this atom might be confused with error while copying */ return 0; } if (!atom_full_copy_data (&stss->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (atom_array_get_len (&stss->entries), buffer, size, offset); /* minimize realloc */ prop_copy_ensure_buffer (buffer, size, offset, 4 * atom_array_get_len (&stss->entries)); for (i = 0; i < atom_array_get_len (&stss->entries); i++) { prop_copy_uint32 (atom_array_index (&stss->entries, i), buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_stsd_copy_data (AtomSTSD * stsd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GList *walker; if (!atom_full_copy_data (&stsd->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (stsd->n_entries, buffer, size, offset); for (walker = g_list_last (stsd->entries); walker != NULL; walker = g_list_previous (walker)) { SampleTableEntry *se = (SampleTableEntry *) walker->data; switch (((Atom *) walker->data)->type) { case FOURCC_mp4a: if (!sample_entry_mp4a_copy_data ((SampleTableEntryMP4A *) walker->data, buffer, size, offset)) { return 0; } break; case FOURCC_mp4s: if (!atom_mp4s_copy_data ((SampleTableEntryMP4S *) walker->data, buffer, size, offset)) { return 0; } break; case FOURCC_mp4v: if (!sample_entry_mp4v_copy_data ((SampleTableEntryMP4V *) walker->data, buffer, size, offset)) { return 0; } break; default: if (se->kind == VIDEO) { if (!sample_entry_mp4v_copy_data ((SampleTableEntryMP4V *) walker->data, buffer, size, offset)) { return 0; } } else if (se->kind == AUDIO) { if (!sample_entry_mp4a_copy_data ((SampleTableEntryMP4A *) walker->data, buffer, size, offset)) { return 0; } } else { if (!atom_hint_sample_entry_copy_data ( (AtomHintSampleEntry *) walker->data, buffer, size, offset)) { return 0; } } break; } } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_stbl_copy_data (AtomSTBL * stbl, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&stbl->header, buffer, size, offset)) { return 0; } if (!atom_stsd_copy_data (&stbl->stsd, buffer, size, offset)) { return 0; } if (!atom_stts_copy_data (&stbl->stts, buffer, size, offset)) { return 0; } /* this atom is optional, so let's check if we need it * (to avoid false error) */ if (atom_array_get_len (&stbl->stss.entries)) { if (!atom_stss_copy_data (&stbl->stss, buffer, size, offset)) { return 0; } } if (!atom_stsc_copy_data (&stbl->stsc, buffer, size, offset)) { return 0; } if (!atom_stsz_copy_data (&stbl->stsz, buffer, size, offset)) { return 0; } if (stbl->ctts && stbl->ctts->do_pts) { if (!atom_ctts_copy_data (stbl->ctts, buffer, size, offset)) { return 0; } } if (!atom_stco64_copy_data (&stbl->stco64, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return original_offset - *offset; } static guint64 atom_dref_copy_data (AtomDREF * dref, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GList *walker; if (!atom_full_copy_data (&dref->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (g_list_length (dref->entries), buffer, size, offset); walker = dref->entries; while (walker != NULL) { Atom *atom = (Atom *) walker->data; if (atom->type == FOURCC_url_) { atom_url_copy_data ((AtomURL *) atom, buffer, size, offset); } else if (atom->type == FOURCC_alis) { atom_full_copy_data ((AtomFull *) atom, buffer, size, offset); } else { g_error ("Unsupported atom used inside dref atom"); } walker = g_list_next (walker); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_dinf_copy_data (AtomDINF * dinf, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&dinf->header, buffer, size, offset)) { return 0; } if (!atom_dref_copy_data (&dinf->dref, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return original_offset - *offset; } static guint64 atom_minf_copy_data (AtomMINF * minf, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&minf->header, buffer, size, offset)) { return 0; } if (minf->vmhd) { if (!atom_vmhd_copy_data (minf->vmhd, buffer, size, offset)) { return 0; } } else if (minf->smhd) { if (!atom_smhd_copy_data (minf->smhd, buffer, size, offset)) { return 0; } } else if (minf->hmhd) { if (!atom_hmhd_copy_data (minf->hmhd, buffer, size, offset)) { return 0; } } if (minf->hdlr) { if (!atom_hdlr_copy_data (minf->hdlr, buffer, size, offset)) { return 0; } } if (!atom_dinf_copy_data (&minf->dinf, buffer, size, offset)) { return 0; } if (!atom_stbl_copy_data (&minf->stbl, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_mdhd_copy_data (AtomMDHD * mdhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&mdhd->header, buffer, size, offset)) { return 0; } if (!common_time_info_copy_data (&mdhd->time_info, atom_full_get_version (&mdhd->header) == 0, buffer, size, offset)) { return 0; } prop_copy_uint16 (mdhd->language_code, buffer, size, offset); prop_copy_uint16 (mdhd->quality, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_mdia_copy_data (AtomMDIA * mdia, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&mdia->header, buffer, size, offset)) { return 0; } if (!atom_mdhd_copy_data (&mdia->mdhd, buffer, size, offset)) { return 0; } if (!atom_hdlr_copy_data (&mdia->hdlr, buffer, size, offset)) { return 0; } if (!atom_minf_copy_data (&mdia->minf, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_elst_copy_data (AtomELST * elst, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GSList *walker; if (!atom_full_copy_data (&elst->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (g_slist_length (elst->entries), buffer, size, offset); for (walker = elst->entries; walker != NULL; walker = g_slist_next (walker)) { EditListEntry *entry = (EditListEntry *) walker->data; prop_copy_uint32 (entry->duration, buffer, size, offset); prop_copy_uint32 (entry->media_time, buffer, size, offset); prop_copy_uint32 (entry->media_rate, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_edts_copy_data (AtomEDTS * edts, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&(edts->header), buffer, size, offset)) return 0; if (!atom_elst_copy_data (&(edts->elst), buffer, size, offset)) return 0; atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_trak_copy_data (AtomTRAK * trak, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&trak->header, buffer, size, offset)) { return 0; } if (!atom_tkhd_copy_data (&trak->tkhd, buffer, size, offset)) { return 0; } if (trak->edts) { if (!atom_edts_copy_data (trak->edts, buffer, size, offset)) { return 0; } } if (!atom_mdia_copy_data (&trak->mdia, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_tag_data_copy_data (AtomTagData * data, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&data->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (data->reserved, buffer, size, offset); prop_copy_uint8_array (data->data, data->datalen, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_tag_copy_data (AtomTag * tag, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&tag->header, buffer, size, offset)) { return 0; } if (!atom_tag_data_copy_data (&tag->data, buffer, size, offset)) { return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_ilst_copy_data (AtomILST * ilst, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&ilst->header, buffer, size, offset)) { return 0; } /* extra atoms */ if (ilst->entries && !atom_info_list_copy_data (ilst->entries, buffer, size, offset)) return 0; atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_meta_copy_data (AtomMETA * meta, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&meta->header, buffer, size, offset)) { return 0; } if (!atom_hdlr_copy_data (&meta->hdlr, buffer, size, offset)) { return 0; } if (meta->ilst) { if (!atom_ilst_copy_data (meta->ilst, buffer, size, offset)) { return 0; } } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_udta_copy_data (AtomUDTA * udta, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&udta->header, buffer, size, offset)) { return 0; } if (udta->meta) { if (!atom_meta_copy_data (udta->meta, buffer, size, offset)) { return 0; } } if (udta->entries) { /* extra atoms */ if (!atom_info_list_copy_data (udta->entries, buffer, size, offset)) return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_mehd_copy_data (AtomMEHD * mehd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&mehd->header, buffer, size, offset)) { return 0; } prop_copy_uint64 (mehd->fragment_duration, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_trex_copy_data (AtomTREX * trex, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&trex->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (trex->track_ID, buffer, size, offset); prop_copy_uint32 (trex->default_sample_description_index, buffer, size, offset); prop_copy_uint32 (trex->default_sample_duration, buffer, size, offset); prop_copy_uint32 (trex->default_sample_size, buffer, size, offset); prop_copy_uint32 (trex->default_sample_flags, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_mvex_copy_data (AtomMVEX * mvex, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GList *walker; if (!atom_copy_data (&mvex->header, buffer, size, offset)) { return 0; } if (!atom_mehd_copy_data (&mvex->mehd, buffer, size, offset)) { return 0; } walker = g_list_first (mvex->trexs); while (walker != NULL) { if (!atom_trex_copy_data ((AtomTREX *) walker->data, buffer, size, offset)) { return 0; } walker = g_list_next (walker); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_moov_copy_data (AtomMOOV * atom, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GList *walker; if (!atom_copy_data (&(atom->header), buffer, size, offset)) return 0; if (!atom_mvhd_copy_data (&(atom->mvhd), buffer, size, offset)) return 0; walker = g_list_first (atom->traks); while (walker != NULL) { if (!atom_trak_copy_data ((AtomTRAK *) walker->data, buffer, size, offset)) { return 0; } walker = g_list_next (walker); } if (atom->udta) { if (!atom_udta_copy_data (atom->udta, buffer, size, offset)) { return 0; } } if (atom->fragmented) { if (!atom_mvex_copy_data (&atom->mvex, buffer, size, offset)) { return 0; } } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_wave_copy_data (AtomWAVE * wave, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_copy_data (&(wave->header), buffer, size, offset)) return 0; if (wave->extension_atoms) { if (!atom_info_list_copy_data (wave->extension_atoms, buffer, size, offset)) return 0; } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } /* -- end of copy data functions -- */ /* -- general functions, API and support functions */ /* add samples to tables */ static void atom_stsc_add_new_entry (AtomSTSC * stsc, guint32 first_chunk, guint32 nsamples) { STSCEntry nentry; gint len; if ((len = atom_array_get_len (&stsc->entries)) && ((atom_array_index (&stsc->entries, len - 1)).samples_per_chunk == nsamples)) return; nentry.first_chunk = first_chunk; nentry.samples_per_chunk = nsamples; nentry.sample_description_index = 1; atom_array_append (&stsc->entries, nentry, 128); } static void atom_stts_add_entry (AtomSTTS * stts, guint32 sample_count, gint32 sample_delta) { STTSEntry *entry = NULL; if (G_LIKELY (atom_array_get_len (&stts->entries) != 0)) entry = &atom_array_index (&stts->entries, atom_array_get_len (&stts->entries) - 1); if (entry && entry->sample_delta == sample_delta) { entry->sample_count += sample_count; } else { STTSEntry nentry; nentry.sample_count = sample_count; nentry.sample_delta = sample_delta; atom_array_append (&stts->entries, nentry, 256); } } static void atom_stsz_add_entry (AtomSTSZ * stsz, guint32 nsamples, guint32 size) { guint32 i; stsz->table_size += nsamples; if (stsz->sample_size != 0) { /* it is constant size, we don't need entries */ return; } for (i = 0; i < nsamples; i++) { atom_array_append (&stsz->entries, size, 1024); } } static guint32 atom_stco64_get_entry_count (AtomSTCO64 * stco64) { return atom_array_get_len (&stco64->entries); } static void atom_stco64_add_entry (AtomSTCO64 * stco64, guint64 entry) { atom_array_append (&stco64->entries, entry, 256); if (entry > G_MAXUINT32) stco64->header.header.type = FOURCC_co64; } static void atom_stss_add_entry (AtomSTSS * stss, guint32 sample) { atom_array_append (&stss->entries, sample, 512); } static void atom_stbl_add_stss_entry (AtomSTBL * stbl) { guint32 sample_index = stbl->stsz.table_size; atom_stss_add_entry (&stbl->stss, sample_index); } static void atom_ctts_add_entry (AtomCTTS * ctts, guint32 nsamples, guint32 offset) { CTTSEntry *entry = NULL; if (G_LIKELY (atom_array_get_len (&ctts->entries) != 0)) entry = &atom_array_index (&ctts->entries, atom_array_get_len (&ctts->entries) - 1); if (entry == NULL || entry->sampleoffset != offset) { CTTSEntry nentry; nentry.samplecount = nsamples; nentry.sampleoffset = offset; atom_array_append (&ctts->entries, nentry, 256); if (offset != 0) ctts->do_pts = TRUE; } else { entry->samplecount += nsamples; } } static void atom_stbl_add_ctts_entry (AtomSTBL * stbl, guint32 nsamples, guint32 offset) { if (stbl->ctts == NULL) { stbl->ctts = atom_ctts_new (); } atom_ctts_add_entry (stbl->ctts, nsamples, offset); } void atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset) { atom_stts_add_entry (&stbl->stts, nsamples, delta); atom_stsz_add_entry (&stbl->stsz, nsamples, size); atom_stco64_add_entry (&stbl->stco64, chunk_offset); atom_stsc_add_new_entry (&stbl->stsc, atom_stco64_get_entry_count (&stbl->stco64), nsamples); if (sync) atom_stbl_add_stss_entry (stbl); /* always store to arrange for consistent content */ atom_stbl_add_ctts_entry (stbl, nsamples, pts_offset); } void atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta, guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset) { AtomSTBL *stbl = &trak->mdia.minf.stbl; atom_stbl_add_samples (stbl, nsamples, delta, size, chunk_offset, sync, pts_offset); } /* trak and moov molding */ guint32 atom_trak_get_timescale (AtomTRAK * trak) { return trak->mdia.mdhd.time_info.timescale; } guint32 atom_trak_get_id (AtomTRAK * trak) { return trak->tkhd.track_ID; } static void atom_trak_set_id (AtomTRAK * trak, guint32 id) { trak->tkhd.track_ID = id; } static void atom_moov_add_trex (AtomMOOV * moov, AtomTREX * trex) { moov->mvex.trexs = g_list_append (moov->mvex.trexs, trex); } static AtomTREX * atom_trex_new (AtomTRAK * trak) { guint8 flags[3] = { 0, 0, 0 }; AtomTREX *trex = g_new0 (AtomTREX, 1); atom_full_init (&trex->header, FOURCC_trex, 0, 0, 0, flags); trex->track_ID = trak->tkhd.track_ID; trex->default_sample_description_index = 1; trex->default_sample_duration = 0; trex->default_sample_size = 0; trex->default_sample_flags = 0; return trex; } void atom_moov_add_trak (AtomMOOV * moov, AtomTRAK * trak) { atom_trak_set_id (trak, moov->mvhd.next_track_id++); moov->traks = g_list_append (moov->traks, trak); /* additional trak means also new trex */ atom_moov_add_trex (moov, atom_trex_new (trak)); } static guint64 atom_trak_get_duration (AtomTRAK * trak) { return trak->tkhd.duration; } static guint64 atom_stts_get_total_duration (AtomSTTS * stts) { guint i; guint64 sum = 0; for (i = 0; i < atom_array_get_len (&stts->entries); i++) { STTSEntry *entry = &atom_array_index (&stts->entries, i); sum += (guint64) (entry->sample_count) * entry->sample_delta; } return sum; } static void atom_trak_update_duration (AtomTRAK * trak, guint64 moov_timescale) { trak->mdia.mdhd.time_info.duration = atom_stts_get_total_duration (&trak->mdia.minf.stbl.stts); if (trak->mdia.mdhd.time_info.timescale != 0) { trak->tkhd.duration = gst_util_uint64_scale (trak->mdia.mdhd.time_info.duration, moov_timescale, trak->mdia.mdhd.time_info.timescale); } else { trak->tkhd.duration = 0; } } static guint32 atom_moov_get_timescale (AtomMOOV * moov) { return moov->mvhd.time_info.timescale; } void atom_moov_update_timescale (AtomMOOV * moov, guint32 timescale) { moov->mvhd.time_info.timescale = timescale; } void atom_moov_update_duration (AtomMOOV * moov) { GList *traks = moov->traks; guint64 dur, duration = 0; while (traks) { AtomTRAK *trak = (AtomTRAK *) traks->data; atom_trak_update_duration (trak, atom_moov_get_timescale (moov)); dur = atom_trak_get_duration (trak); if (dur > duration) duration = dur; traks = g_list_next (traks); } moov->mvhd.time_info.duration = duration; moov->mvex.mehd.fragment_duration = duration; } void atom_moov_set_fragmented (AtomMOOV * moov, gboolean fragmented) { moov->fragmented = fragmented; } void atom_stco64_chunks_add_offset (AtomSTCO64 * stco64, guint32 offset) { guint i; for (i = 0; i < atom_array_get_len (&stco64->entries); i++) { guint64 *value = &atom_array_index (&stco64->entries, i); *value += offset; } } void atom_moov_chunks_add_offset (AtomMOOV * moov, guint32 offset) { GList *traks = moov->traks; while (traks) { AtomTRAK *trak = (AtomTRAK *) traks->data; atom_stco64_chunks_add_offset (&trak->mdia.minf.stbl.stco64, offset); traks = g_list_next (traks); } } void atom_trak_update_bitrates (AtomTRAK * trak, guint32 avg_bitrate, guint32 max_bitrate) { AtomESDS *esds = NULL; AtomData *btrt = NULL; AtomWAVE *wave = NULL; AtomSTSD *stsd; GList *iter; GList *extensioniter = NULL; g_return_if_fail (trak != NULL); if (avg_bitrate == 0 && max_bitrate == 0) return; stsd = &trak->mdia.minf.stbl.stsd; for (iter = stsd->entries; iter; iter = g_list_next (iter)) { SampleTableEntry *entry = iter->data; switch (entry->kind) { case AUDIO:{ SampleTableEntryMP4A *audioentry = (SampleTableEntryMP4A *) entry; extensioniter = audioentry->extension_atoms; break; } case VIDEO:{ SampleTableEntryMP4V *videoentry = (SampleTableEntryMP4V *) entry; extensioniter = videoentry->extension_atoms; break; } default: break; } } for (; extensioniter; extensioniter = g_list_next (extensioniter)) { AtomInfo *atominfo = extensioniter->data; if (atominfo->atom->type == FOURCC_esds) { esds = (AtomESDS *) atominfo->atom; } else if (atominfo->atom->type == FOURCC_btrt) { btrt = (AtomData *) atominfo->atom; } else if (atominfo->atom->type == FOURCC_wave) { wave = (AtomWAVE *) atominfo->atom; } } /* wave might have an esds internally */ if (wave) { for (extensioniter = wave->extension_atoms; extensioniter; extensioniter = g_list_next (extensioniter)) { AtomInfo *atominfo = extensioniter->data; if (atominfo->atom->type == FOURCC_esds) { esds = (AtomESDS *) atominfo->atom; break; } } } if (esds) { if (avg_bitrate && esds->es.dec_conf_desc.avg_bitrate == 0) esds->es.dec_conf_desc.avg_bitrate = avg_bitrate; if (max_bitrate && esds->es.dec_conf_desc.max_bitrate == 0) esds->es.dec_conf_desc.max_bitrate = max_bitrate; } if (btrt) { /* type(4bytes) + size(4bytes) + buffersize(4bytes) + * maxbitrate(bytes) + avgbitrate(bytes) */ if (max_bitrate && GST_READ_UINT32_BE (btrt->data + 4) == 0) GST_WRITE_UINT32_BE (btrt->data + 4, max_bitrate); if (avg_bitrate && GST_READ_UINT32_BE (btrt->data + 8) == 0) GST_WRITE_UINT32_BE (btrt->data + 8, avg_bitrate); } } /* * Meta tags functions */ static void atom_moov_init_metatags (AtomMOOV * moov, AtomsContext * context) { if (!moov->udta) { moov->udta = atom_udta_new (); } if (context->flavor != ATOMS_TREE_FLAVOR_3GP) { if (!moov->udta->meta) { moov->udta->meta = atom_meta_new (); } if (!moov->udta->meta->ilst) { moov->udta->meta->ilst = atom_ilst_new (); } } } static void atom_tag_data_alloc_data (AtomTagData * data, guint size) { if (data->data != NULL) { g_free (data->data); } data->data = g_new0 (guint8, size); data->datalen = size; } static void atom_moov_append_tag (AtomMOOV * moov, AtomInfo * tag) { GList **entries; atom_moov_init_metatags (moov, &moov->context); if (moov->udta->meta) entries = &moov->udta->meta->ilst->entries; else entries = &moov->udta->entries; *entries = g_list_append (*entries, tag); } void atom_moov_add_tag (AtomMOOV * moov, guint32 fourcc, guint32 flags, const guint8 * data, guint size) { AtomTag *tag; AtomTagData *tdata; tag = atom_tag_new (fourcc, flags); tdata = &tag->data; atom_tag_data_alloc_data (tdata, size); g_memmove (tdata->data, data, size); atom_moov_append_tag (moov, build_atom_info_wrapper ((Atom *) tag, atom_tag_copy_data, atom_tag_free)); } void atom_moov_add_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value) { gint len = strlen (value); if (len > 0) atom_moov_add_tag (moov, fourcc, METADATA_TEXT_FLAG, (guint8 *) value, len); } void atom_moov_add_uint_tag (AtomMOOV * moov, guint32 fourcc, guint32 flags, guint32 value) { guint8 data[8] = { 0, }; if (flags) { GST_WRITE_UINT16_BE (data, value); atom_moov_add_tag (moov, fourcc, flags, data, 2); } else { GST_WRITE_UINT32_BE (data + 2, value); atom_moov_add_tag (moov, fourcc, flags, data, 8); } } void atom_moov_add_blob_tag (AtomMOOV * moov, guint8 * data, guint size) { AtomData *data_atom; GstBuffer *buf; guint len; guint32 fourcc; if (size < 8) return; /* blob is unparsed atom; * extract size and fourcc, and wrap remainder in data atom */ len = GST_READ_UINT32_BE (data); fourcc = GST_READ_UINT32_LE (data + 4); if (len > size) return; buf = gst_buffer_new (); GST_BUFFER_SIZE (buf) = len - 8; GST_BUFFER_DATA (buf) = data + 8; data_atom = atom_data_new_from_gst_buffer (fourcc, buf); gst_buffer_unref (buf); atom_moov_append_tag (moov, build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, atom_data_free)); } void atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data, guint size) { AtomData *data_atom; GstBuffer *buf; guint8 *bdata; /* need full atom */ buf = gst_buffer_new_and_alloc (size + 4); bdata = GST_BUFFER_DATA (buf); /* full atom: version and flags */ GST_WRITE_UINT32_BE (bdata, 0); memcpy (bdata + 4, data, size); data_atom = atom_data_new_from_gst_buffer (fourcc, buf); gst_buffer_unref (buf); atom_moov_append_tag (moov, build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, atom_data_free)); } guint16 language_code (const char *lang) { g_return_val_if_fail (lang != NULL, 0); g_return_val_if_fail (strlen (lang) == 3, 0); return (((lang[0] - 0x60) & 0x1F) << 10) + (((lang[1] - 0x60) & 0x1F) << 5) + ((lang[2] - 0x60) & 0x1F); } void atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value, gint16 ivalue) { gint len = 0, size = 0; guint8 *data; if (value) { len = strlen (value); size = len + 3; } if (ivalue >= 0) size += 2; data = g_malloc (size + 3); /* language tag and null-terminated UTF-8 string */ if (value) { GST_WRITE_UINT16_BE (data, language_code (GST_QT_MUX_DEFAULT_TAG_LANGUAGE)); /* include 0 terminator */ memcpy (data + 2, value, len + 1); } /* 16-bit unsigned int if standalone, otherwise 8-bit */ if (ivalue >= 0) { if (size == 2) GST_WRITE_UINT16_BE (data + size - 2, ivalue); else { GST_WRITE_UINT8 (data + size - 2, ivalue & 0xFF); size--; } } atom_moov_add_3gp_tag (moov, fourcc, data, size); g_free (data); } void atom_moov_add_3gp_str_tag (AtomMOOV * moov, guint32 fourcc, const gchar * value) { atom_moov_add_3gp_str_int_tag (moov, fourcc, value, -1); } void atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value) { atom_moov_add_3gp_str_int_tag (moov, fourcc, NULL, value); } void atom_moov_add_xmp_tags (AtomMOOV * moov, GstBuffer * xmpbuffer) { AtomData *data_atom = NULL; if (moov->context.flavor == ATOMS_TREE_FLAVOR_MOV) { if (xmpbuffer) { data_atom = atom_data_new_from_gst_buffer (FOURCC_XMP_, xmpbuffer); atom_moov_init_metatags (moov, &moov->context); moov->udta->entries = g_list_append (moov->udta->entries, build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data, atom_data_free)); } } else { GST_DEBUG ("Not adding xmp to moov atom, it is only used in 'mov' format"); } } /* * Functions for specifying media types */ static void atom_minf_set_audio (AtomMINF * minf) { atom_minf_clear_handlers (minf); minf->smhd = atom_smhd_new (); } static void atom_minf_set_video (AtomMINF * minf, AtomsContext * context) { atom_minf_clear_handlers (minf); minf->vmhd = atom_vmhd_new (context); } static void atom_hdlr_set_type (AtomHDLR * hdlr, AtomsContext * context, guint32 comp_type, guint32 hdlr_type) { if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { hdlr->component_type = comp_type; } hdlr->handler_type = hdlr_type; } static void atom_hdlr_set_name (AtomHDLR * hdlr, const char *name) { if (hdlr->name) g_free (hdlr->name); hdlr->name = g_strdup (name); } static void atom_mdia_set_hdlr_type_audio (AtomMDIA * mdia, AtomsContext * context) { atom_hdlr_set_type (&mdia->hdlr, context, FOURCC_mhlr, FOURCC_soun); /* Some players (low-end hardware) check for this name, which is what * QuickTime itself sets */ atom_hdlr_set_name (&mdia->hdlr, "SoundHandler"); } static void atom_mdia_set_hdlr_type_video (AtomMDIA * mdia, AtomsContext * context) { atom_hdlr_set_type (&mdia->hdlr, context, FOURCC_mhlr, FOURCC_vide); /* Some players (low-end hardware) check for this name, which is what * QuickTime itself sets */ atom_hdlr_set_name (&mdia->hdlr, "VideoHandler"); } static void atom_mdia_set_audio (AtomMDIA * mdia, AtomsContext * context) { atom_mdia_set_hdlr_type_audio (mdia, context); atom_minf_set_audio (&mdia->minf); } static void atom_mdia_set_video (AtomMDIA * mdia, AtomsContext * context) { atom_mdia_set_hdlr_type_video (mdia, context); atom_minf_set_video (&mdia->minf, context); } static void atom_tkhd_set_audio (AtomTKHD * tkhd) { tkhd->volume = 0x0100; tkhd->width = tkhd->height = 0; } static void atom_tkhd_set_video (AtomTKHD * tkhd, AtomsContext * context, guint32 width, guint32 height) { tkhd->volume = 0; /* qt and ISO base media do not contradict, and examples agree */ tkhd->width = width; tkhd->height = height; } static void atom_edts_add_entry (AtomEDTS * edts, EditListEntry * entry) { edts->elst.entries = g_slist_append (edts->elst.entries, entry); } /* * Adds a new entry to this trak edits list * duration is in the moov's timescale * media_time is the offset in the media time to start from (media's timescale) * rate is a 32 bits fixed-point */ void atom_trak_add_elst_entry (AtomTRAK * trak, guint32 duration, guint32 media_time, guint32 rate) { EditListEntry *entry = g_new (EditListEntry, 1); entry->duration = duration; entry->media_time = media_time; entry->media_rate = rate; if (trak->edts == NULL) { trak->edts = atom_edts_new (); } atom_edts_add_entry (trak->edts, entry); } /* re-negotiation is prevented at top-level, so only 1 entry expected. * Quite some more care here and elsewhere may be needed to * support several entries */ static SampleTableEntryMP4A * atom_trak_add_audio_entry (AtomTRAK * trak, AtomsContext * context, guint32 type) { AtomSTSD *stsd = &trak->mdia.minf.stbl.stsd; SampleTableEntryMP4A *mp4a = sample_entry_mp4a_new (); mp4a->se.header.type = type; mp4a->se.kind = AUDIO; mp4a->compression_id = -1; mp4a->se.data_reference_index = 1; stsd->entries = g_list_prepend (stsd->entries, mp4a); stsd->n_entries++; return mp4a; } static SampleTableEntryMP4V * atom_trak_add_video_entry (AtomTRAK * trak, AtomsContext * context, guint32 type) { SampleTableEntryMP4V *mp4v = sample_entry_mp4v_new (context); AtomSTSD *stsd = &trak->mdia.minf.stbl.stsd; mp4v->se.header.type = type; mp4v->se.kind = VIDEO; mp4v->se.data_reference_index = 1; mp4v->horizontal_resolution = 72 << 16; mp4v->vertical_resolution = 72 << 16; if (context->flavor == ATOMS_TREE_FLAVOR_MOV) { mp4v->spatial_quality = 512; mp4v->temporal_quality = 512; } stsd->entries = g_list_prepend (stsd->entries, mp4v); stsd->n_entries++; return mp4v; } static void atom_trak_set_constant_size_samples (AtomTRAK * trak, guint32 sample_size) { trak->mdia.minf.stbl.stsz.sample_size = sample_size; } static void atom_trak_set_audio (AtomTRAK * trak, AtomsContext * context) { atom_tkhd_set_audio (&trak->tkhd); atom_mdia_set_audio (&trak->mdia, context); } static void atom_trak_set_video (AtomTRAK * trak, AtomsContext * context, guint32 width, guint32 height) { atom_tkhd_set_video (&trak->tkhd, context, width, height); atom_mdia_set_video (&trak->mdia, context); } static void atom_trak_set_audio_commons (AtomTRAK * trak, AtomsContext * context, guint32 rate) { atom_trak_set_audio (trak, context); trak->mdia.mdhd.time_info.timescale = rate; } static void atom_trak_set_video_commons (AtomTRAK * trak, AtomsContext * context, guint32 rate, guint32 width, guint32 height) { atom_trak_set_video (trak, context, width, height); trak->mdia.mdhd.time_info.timescale = rate; trak->tkhd.width = width << 16; trak->tkhd.height = height << 16; } void atom_trak_set_audio_type (AtomTRAK * trak, AtomsContext * context, AudioSampleEntry * entry, guint32 scale, AtomInfo * ext, gint sample_size) { SampleTableEntryMP4A *ste; atom_trak_set_audio_commons (trak, context, scale); atom_stsd_remove_entries (&trak->mdia.minf.stbl.stsd); ste = atom_trak_add_audio_entry (trak, context, entry->fourcc); trak->is_video = FALSE; trak->is_h264 = FALSE; ste->version = entry->version; ste->compression_id = entry->compression_id; ste->sample_size = entry->sample_size; ste->sample_rate = entry->sample_rate << 16; ste->channels = entry->channels; ste->samples_per_packet = entry->samples_per_packet; ste->bytes_per_sample = entry->bytes_per_sample; ste->bytes_per_packet = entry->bytes_per_packet; ste->bytes_per_frame = entry->bytes_per_frame; if (ext) ste->extension_atoms = g_list_prepend (ste->extension_atoms, ext); /* 0 size means variable size */ atom_trak_set_constant_size_samples (trak, sample_size); } static AtomInfo * build_pasp_extension (AtomTRAK * trak, gint par_width, gint par_height) { AtomData *atom_data; GstBuffer *buf; guint8 *data; buf = gst_buffer_new_and_alloc (8); data = GST_BUFFER_DATA (buf); /* ihdr = image header box */ GST_WRITE_UINT32_BE (data, par_width); GST_WRITE_UINT32_BE (data + 4, par_height); atom_data = atom_data_new_from_gst_buffer (FOURCC_pasp, buf); gst_buffer_unref (buf); return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, atom_data_free); } void atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context, VisualSampleEntry * entry, guint32 scale, GList * ext_atoms_list) { SampleTableEntryMP4V *ste; gint dwidth, dheight; gint par_n = 0, par_d = 0; if ((entry->par_n != 1 || entry->par_d != 1) && (entry->par_n != entry->par_d)) { par_n = entry->par_n; par_d = entry->par_d; } dwidth = entry->width; dheight = entry->height; /* ISO file spec says track header w/h indicates track's visual presentation * (so this together with pixels w/h implicitly defines PAR) */ if (par_n && (context->flavor != ATOMS_TREE_FLAVOR_MOV)) { if (par_n > par_d) { dwidth = entry->width * par_n / par_d; dheight = entry->height; } else { dwidth = entry->width * par_n / par_d; dheight = entry->height; } } atom_trak_set_video_commons (trak, context, scale, dwidth, dheight); atom_stsd_remove_entries (&trak->mdia.minf.stbl.stsd); ste = atom_trak_add_video_entry (trak, context, entry->fourcc); trak->is_video = TRUE; trak->is_h264 = (entry->fourcc == FOURCC_avc1); ste->version = entry->version; ste->width = entry->width; ste->height = entry->height; ste->depth = entry->depth; ste->color_table_id = entry->color_table_id; ste->frame_count = entry->frame_count; if (ext_atoms_list) ste->extension_atoms = g_list_concat (ste->extension_atoms, ext_atoms_list); /* QT spec has a pasp extension atom in stsd that can hold PAR */ if (par_n && (context->flavor == ATOMS_TREE_FLAVOR_MOV)) { ste->extension_atoms = g_list_append (ste->extension_atoms, build_pasp_extension (trak, par_n, par_d)); } } static void atom_mfhd_init (AtomMFHD * mfhd, guint32 sequence_number) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&(mfhd->header), FOURCC_mfhd, 0, 0, 0, flags); mfhd->sequence_number = sequence_number; } static void atom_moof_init (AtomMOOF * moof, AtomsContext * context, guint32 sequence_number) { atom_header_set (&moof->header, FOURCC_moof, 0, 0); atom_mfhd_init (&moof->mfhd, sequence_number); moof->trafs = NULL; } AtomMOOF * atom_moof_new (AtomsContext * context, guint32 sequence_number) { AtomMOOF *moof = g_new0 (AtomMOOF, 1); atom_moof_init (moof, context, sequence_number); return moof; } static void atom_trun_free (AtomTRUN * trun) { atom_full_clear (&trun->header); atom_array_clear (&trun->entries); g_free (trun); } static void atom_sdtp_free (AtomSDTP * sdtp) { atom_full_clear (&sdtp->header); atom_array_clear (&sdtp->entries); g_free (sdtp); } void atom_traf_free (AtomTRAF * traf) { GList *walker; walker = traf->truns; while (walker) { atom_trun_free ((AtomTRUN *) walker->data); walker = g_list_next (walker); } g_list_free (traf->truns); traf->truns = NULL; walker = traf->sdtps; while (walker) { atom_sdtp_free ((AtomSDTP *) walker->data); walker = g_list_next (walker); } g_list_free (traf->sdtps); traf->sdtps = NULL; g_free (traf); } void atom_moof_free (AtomMOOF * moof) { GList *walker; walker = moof->trafs; while (walker) { atom_traf_free ((AtomTRAF *) walker->data); walker = g_list_next (walker); } g_list_free (moof->trafs); moof->trafs = NULL; g_free (moof); } static guint64 atom_mfhd_copy_data (AtomMFHD * mfhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&mfhd->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (mfhd->sequence_number, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_tfhd_copy_data (AtomTFHD * tfhd, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint32 flags; if (!atom_full_copy_data (&tfhd->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (tfhd->track_ID, buffer, size, offset); flags = atom_full_get_flags_as_uint (&tfhd->header); if (flags & TF_BASE_DATA_OFFSET) prop_copy_uint64 (tfhd->base_data_offset, buffer, size, offset); if (flags & TF_SAMPLE_DESCRIPTION_INDEX) prop_copy_uint32 (tfhd->sample_description_index, buffer, size, offset); if (flags & TF_DEFAULT_SAMPLE_DURATION) prop_copy_uint32 (tfhd->default_sample_duration, buffer, size, offset); if (flags & TF_DEFAULT_SAMPLE_SIZE) prop_copy_uint32 (tfhd->default_sample_size, buffer, size, offset); if (flags & TF_DEFAULT_SAMPLE_FLAGS) prop_copy_uint32 (tfhd->default_sample_flags, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_trun_copy_data (AtomTRUN * trun, guint8 ** buffer, guint64 * size, guint64 * offset, guint32 * data_offset) { guint64 original_offset = *offset; guint32 flags, i; flags = atom_full_get_flags_as_uint (&trun->header); /* if first trun in moof, forcibly add data_offset and record * where it must be written later on */ if (data_offset && !*data_offset) { flags |= TR_DATA_OFFSET; } else { flags &= ~TR_DATA_OFFSET; } atom_full_set_flags_as_uint (&trun->header, flags); if (!atom_full_copy_data (&trun->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (trun->sample_count, buffer, size, offset); if (flags & TR_DATA_OFFSET) { *data_offset = *offset; prop_copy_int32 (trun->data_offset, buffer, size, offset); } if (flags & TR_FIRST_SAMPLE_FLAGS) prop_copy_uint32 (trun->first_sample_flags, buffer, size, offset); for (i = 0; i < atom_array_get_len (&trun->entries); i++) { TRUNSampleEntry *entry = &atom_array_index (&trun->entries, i); if (flags & TR_SAMPLE_DURATION) prop_copy_uint32 (entry->sample_duration, buffer, size, offset); if (flags & TR_SAMPLE_SIZE) prop_copy_uint32 (entry->sample_size, buffer, size, offset); if (flags & TR_SAMPLE_FLAGS) prop_copy_uint32 (entry->sample_flags, buffer, size, offset); if (flags & TR_COMPOSITION_TIME_OFFSETS) prop_copy_uint32 (entry->sample_composition_time_offset, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_sdtp_copy_data (AtomSDTP * sdtp, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; if (!atom_full_copy_data (&sdtp->header, buffer, size, offset)) { return 0; } /* all entries at once */ prop_copy_fixed_size_string (&atom_array_index (&sdtp->entries, 0), atom_array_get_len (&sdtp->entries), buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_traf_copy_data (AtomTRAF * traf, guint8 ** buffer, guint64 * size, guint64 * offset, guint32 * data_offset) { guint64 original_offset = *offset; GList *walker; if (!atom_copy_data (&traf->header, buffer, size, offset)) { return 0; } if (!atom_tfhd_copy_data (&traf->tfhd, buffer, size, offset)) { return 0; } walker = g_list_first (traf->truns); while (walker != NULL) { if (!atom_trun_copy_data ((AtomTRUN *) walker->data, buffer, size, offset, data_offset)) { return 0; } walker = g_list_next (walker); } walker = g_list_first (traf->sdtps); while (walker != NULL) { if (!atom_sdtp_copy_data ((AtomSDTP *) walker->data, buffer, size, offset)) { return 0; } walker = g_list_next (walker); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } /* creates moof atom; metadata is written expecting actual buffer data * is in mdata directly after moof, and is consecutively written per trak */ guint64 atom_moof_copy_data (AtomMOOF * moof, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GList *walker; guint32 data_offset = 0; if (!atom_copy_data (&moof->header, buffer, size, offset)) return 0; if (!atom_mfhd_copy_data (&moof->mfhd, buffer, size, offset)) return 0; walker = g_list_first (moof->trafs); while (walker != NULL) { if (!atom_traf_copy_data ((AtomTRAF *) walker->data, buffer, size, offset, &data_offset)) { return 0; } walker = g_list_next (walker); } atom_write_size (buffer, size, offset, original_offset); if (*buffer && data_offset) { /* first trun needs a data-offset relative to moof start * = moof size + mdat prefix */ GST_WRITE_UINT32_BE (*buffer + data_offset, *offset - original_offset + 8); } return *offset - original_offset; } static void atom_tfhd_init (AtomTFHD * tfhd, guint32 track_ID) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&tfhd->header, FOURCC_tfhd, 0, 0, 0, flags); tfhd->track_ID = track_ID; tfhd->base_data_offset = 0; tfhd->sample_description_index = 1; tfhd->default_sample_duration = 0; tfhd->default_sample_size = 0; tfhd->default_sample_flags = 0; } static void atom_trun_init (AtomTRUN * trun) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&trun->header, FOURCC_trun, 0, 0, 0, flags); trun->sample_count = 0; trun->data_offset = 0; trun->first_sample_flags = 0; atom_array_init (&trun->entries, 512); } static AtomTRUN * atom_trun_new (void) { AtomTRUN *trun = g_new0 (AtomTRUN, 1); atom_trun_init (trun); return trun; } static void atom_sdtp_init (AtomSDTP * sdtp) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&sdtp->header, FOURCC_sdtp, 0, 0, 0, flags); atom_array_init (&sdtp->entries, 512); } static AtomSDTP * atom_sdtp_new (AtomsContext * context) { AtomSDTP *sdtp = g_new0 (AtomSDTP, 1); atom_sdtp_init (sdtp); return sdtp; } static void atom_traf_add_sdtp (AtomTRAF * traf, AtomSDTP * sdtp) { traf->sdtps = g_list_append (traf->sdtps, sdtp); } static void atom_sdtp_add_samples (AtomSDTP * sdtp, guint8 val) { /* it does not make much/any sense according to specs, * but that's how MS isml samples seem to do it */ atom_array_append (&sdtp->entries, val, 256); } static void atom_trun_add_samples (AtomTRUN * trun, guint32 delta, guint32 size, guint32 flags, gint64 pts_offset) { TRUNSampleEntry nentry; if (pts_offset != 0) trun->header.flags[1] |= TR_COMPOSITION_TIME_OFFSETS; nentry.sample_duration = delta; nentry.sample_size = size; nentry.sample_flags = flags; nentry.sample_composition_time_offset = pts_offset; atom_array_append (&trun->entries, nentry, 256); trun->sample_count++; } static void atom_traf_init (AtomTRAF * traf, AtomsContext * context, guint32 track_ID) { atom_header_set (&traf->header, FOURCC_traf, 0, 0); atom_tfhd_init (&traf->tfhd, track_ID); traf->truns = NULL; if (context->flavor == ATOMS_TREE_FLAVOR_ISML) atom_traf_add_sdtp (traf, atom_sdtp_new (context)); } AtomTRAF * atom_traf_new (AtomsContext * context, guint32 track_ID) { AtomTRAF *traf = g_new0 (AtomTRAF, 1); atom_traf_init (traf, context, track_ID); return traf; } static void atom_traf_add_trun (AtomTRAF * traf, AtomTRUN * trun) { traf->truns = g_list_append (traf->truns, trun); } void atom_traf_add_samples (AtomTRAF * traf, guint32 delta, guint32 size, gboolean sync, gint64 pts_offset, gboolean sdtp_sync) { AtomTRUN *trun; guint32 flags; /* 0x10000 is sample-is-difference-sample flag * low byte stuff is what ismv uses */ flags = (sync ? 0x0 : 0x10000) | (sdtp_sync ? 0x40 : 0xc0); if (G_UNLIKELY (!traf->truns)) { trun = atom_trun_new (); atom_traf_add_trun (traf, trun); /* optimistic; indicate all defaults present in tfhd */ traf->tfhd.header.flags[2] = TF_DEFAULT_SAMPLE_DURATION | TF_DEFAULT_SAMPLE_SIZE | TF_DEFAULT_SAMPLE_FLAGS; traf->tfhd.default_sample_duration = delta; traf->tfhd.default_sample_size = size; traf->tfhd.default_sample_flags = flags; trun->first_sample_flags = flags; } trun = traf->truns->data; /* check if still matching defaults, * if not, abandon default and need entry for each sample */ if (traf->tfhd.default_sample_duration != delta) { traf->tfhd.header.flags[2] &= ~TF_DEFAULT_SAMPLE_DURATION; trun->header.flags[1] |= (TR_SAMPLE_DURATION >> 8); } if (traf->tfhd.default_sample_size != size) { traf->tfhd.header.flags[2] &= ~TF_DEFAULT_SAMPLE_SIZE; trun->header.flags[1] |= (TR_SAMPLE_SIZE >> 8); } if (traf->tfhd.default_sample_flags != flags) { if (trun->sample_count == 1) { /* at least will need first sample flag */ traf->tfhd.default_sample_flags = flags; trun->header.flags[2] |= TR_FIRST_SAMPLE_FLAGS; } else { /* now we need sample flags for each sample */ traf->tfhd.header.flags[2] &= ~TF_DEFAULT_SAMPLE_FLAGS; trun->header.flags[1] |= (TR_SAMPLE_FLAGS >> 8); trun->header.flags[2] &= ~TR_FIRST_SAMPLE_FLAGS; } } atom_trun_add_samples (traf->truns->data, delta, size, flags, pts_offset); if (traf->sdtps) atom_sdtp_add_samples (traf->sdtps->data, 0x10 | ((flags & 0xff) >> 4)); } guint32 atom_traf_get_sample_num (AtomTRAF * traf) { AtomTRUN *trun; if (G_UNLIKELY (!traf->truns)) return 0; trun = traf->truns->data; return atom_array_get_len (&trun->entries); } void atom_moof_add_traf (AtomMOOF * moof, AtomTRAF * traf) { moof->trafs = g_list_append (moof->trafs, traf); } static void atom_tfra_free (AtomTFRA * tfra) { atom_full_clear (&tfra->header); atom_array_clear (&tfra->entries); g_free (tfra); } AtomMFRA * atom_mfra_new (AtomsContext * context) { AtomMFRA *mfra = g_new0 (AtomMFRA, 1); atom_header_set (&mfra->header, FOURCC_mfra, 0, 0); return mfra; } void atom_mfra_add_tfra (AtomMFRA * mfra, AtomTFRA * tfra) { mfra->tfras = g_list_append (mfra->tfras, tfra); } void atom_mfra_free (AtomMFRA * mfra) { GList *walker; walker = mfra->tfras; while (walker) { atom_tfra_free ((AtomTFRA *) walker->data); walker = g_list_next (walker); } g_list_free (mfra->tfras); mfra->tfras = NULL; atom_clear (&mfra->header); g_free (mfra); } static void atom_tfra_init (AtomTFRA * tfra, guint32 track_ID) { guint8 flags[3] = { 0, 0, 0 }; atom_full_init (&tfra->header, FOURCC_tfra, 0, 0, 0, flags); tfra->track_ID = track_ID; atom_array_init (&tfra->entries, 512); } AtomTFRA * atom_tfra_new (AtomsContext * context, guint32 track_ID) { AtomTFRA *tfra = g_new0 (AtomTFRA, 1); atom_tfra_init (tfra, track_ID); return tfra; } static inline gint need_bytes (guint32 num) { gint n = 0; while (num >>= 8) n++; return n; } void atom_tfra_add_entry (AtomTFRA * tfra, guint64 dts, guint32 sample_num) { TFRAEntry entry; entry.time = dts; /* fill in later */ entry.moof_offset = 0; /* always write a single trun in a single traf */ entry.traf_number = 1; entry.trun_number = 1; entry.sample_number = sample_num; /* auto-use 64 bits if needed */ if (dts > G_MAXUINT32) tfra->header.version = 1; /* 1 byte will always do for traf and trun number, * check how much sample_num needs */ tfra->lengths = (tfra->lengths & 0xfc) || MAX (tfra->lengths, need_bytes (sample_num)); atom_array_append (&tfra->entries, entry, 256); } void atom_tfra_update_offset (AtomTFRA * tfra, guint64 offset) { gint i; /* auto-use 64 bits if needed */ if (offset > G_MAXUINT32) tfra->header.version = 1; for (i = atom_array_get_len (&tfra->entries) - 1; i >= 0; i--) { TFRAEntry *entry = &atom_array_index (&tfra->entries, i); if (entry->moof_offset) break; entry->moof_offset = offset; } } static guint64 atom_tfra_copy_data (AtomTFRA * tfra, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint32 i; TFRAEntry *entry; guint32 data; guint bytes; guint version; if (!atom_full_copy_data (&tfra->header, buffer, size, offset)) { return 0; } prop_copy_uint32 (tfra->track_ID, buffer, size, offset); prop_copy_uint32 (tfra->lengths, buffer, size, offset); prop_copy_uint32 (atom_array_get_len (&tfra->entries), buffer, size, offset); version = tfra->header.version; for (i = 0; i < atom_array_get_len (&tfra->entries); ++i) { entry = &atom_array_index (&tfra->entries, i); if (version) { prop_copy_uint64 (entry->time, buffer, size, offset); prop_copy_uint64 (entry->moof_offset, buffer, size, offset); } else { prop_copy_uint32 (entry->time, buffer, size, offset); prop_copy_uint32 (entry->moof_offset, buffer, size, offset); } bytes = (tfra->lengths & (0x3 << 4)) + 1; data = GUINT32_TO_BE (entry->traf_number); prop_copy_fixed_size_string (((guint8 *) & data) + 4 - bytes, bytes, buffer, size, offset); bytes = (tfra->lengths & (0x3 << 2)) + 1; data = GUINT32_TO_BE (entry->trun_number); prop_copy_fixed_size_string (((guint8 *) & data) + 4 - bytes, bytes, buffer, size, offset); bytes = (tfra->lengths & (0x3)) + 1; data = GUINT32_TO_BE (entry->sample_number); prop_copy_fixed_size_string (((guint8 *) & data) + 4 - bytes, bytes, buffer, size, offset); } atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } static guint64 atom_mfro_copy_data (guint32 s, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; guint8 flags[3] = { 0, 0, 0 }; AtomFull mfro; atom_full_init (&mfro, FOURCC_mfro, 0, 0, 0, flags); if (!atom_full_copy_data (&mfro, buffer, size, offset)) { return 0; } prop_copy_uint32 (s, buffer, size, offset); atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } guint64 atom_mfra_copy_data (AtomMFRA * mfra, guint8 ** buffer, guint64 * size, guint64 * offset) { guint64 original_offset = *offset; GList *walker; if (!atom_copy_data (&mfra->header, buffer, size, offset)) return 0; walker = g_list_first (mfra->tfras); while (walker != NULL) { if (!atom_tfra_copy_data ((AtomTFRA *) walker->data, buffer, size, offset)) { return 0; } walker = g_list_next (walker); } /* 16 is the size of the mfro atom */ if (!atom_mfro_copy_data (*offset - original_offset + 16, buffer, size, offset)) return 0; atom_write_size (buffer, size, offset, original_offset); return *offset - original_offset; } /* some sample description construction helpers */ AtomInfo * build_esds_extension (AtomTRAK * trak, guint8 object_type, guint8 stream_type, const GstBuffer * codec_data, guint32 avg_bitrate, guint32 max_bitrate) { guint32 track_id; AtomESDS *esds; track_id = trak->tkhd.track_ID; esds = atom_esds_new (); esds->es.id = track_id & 0xFFFF; esds->es.dec_conf_desc.object_type = object_type; esds->es.dec_conf_desc.stream_type = stream_type << 2 | 0x01; if (avg_bitrate > 0) esds->es.dec_conf_desc.avg_bitrate = avg_bitrate; if (max_bitrate > 0) esds->es.dec_conf_desc.max_bitrate = max_bitrate; /* optional DecoderSpecificInfo */ if (codec_data) { DecoderSpecificInfoDescriptor *desc; esds->es.dec_conf_desc.dec_specific_info = desc = desc_dec_specific_info_new (); desc_dec_specific_info_alloc_data (desc, GST_BUFFER_SIZE (codec_data)); memcpy (desc->data, GST_BUFFER_DATA (codec_data), GST_BUFFER_SIZE (codec_data)); } return build_atom_info_wrapper ((Atom *) esds, atom_esds_copy_data, atom_esds_free); } AtomInfo * build_btrt_extension (guint32 buffer_size_db, guint32 avg_bitrate, guint32 max_bitrate) { AtomData *atom_data; GstBuffer *buf; buf = gst_buffer_new_and_alloc (12); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), buffer_size_db); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 4, max_bitrate); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 8, avg_bitrate); atom_data = atom_data_new_from_gst_buffer (FOURCC_btrt, buf); gst_buffer_unref (buf); return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, atom_data_free); } static AtomInfo * build_mov_wave_extension (AtomTRAK * trak, guint32 fourcc, AtomInfo * atom1, AtomInfo * atom2, gboolean terminator) { AtomWAVE *wave; AtomFRMA *frma; Atom *ext_atom; /* Build WAVE atom for sample table entry */ wave = atom_wave_new (); /* Prepend Terminator atom to the WAVE list first, so it ends up last */ if (terminator) { ext_atom = (Atom *) atom_data_new (FOURCC_null); wave->extension_atoms = atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) ext_atom, (AtomCopyDataFunc) atom_data_copy_data, (AtomFreeFunc) atom_data_free); } /* Add supplied atoms to WAVE */ if (atom2) wave->extension_atoms = g_list_prepend (wave->extension_atoms, atom2); if (atom1) wave->extension_atoms = g_list_prepend (wave->extension_atoms, atom1); /* Add FRMA to the WAVE */ frma = atom_frma_new (); frma->media_type = fourcc; wave->extension_atoms = atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) frma, (AtomCopyDataFunc) atom_frma_copy_data, (AtomFreeFunc) atom_frma_free); return build_atom_info_wrapper ((Atom *) wave, atom_wave_copy_data, atom_wave_free); } AtomInfo * build_mov_aac_extension (AtomTRAK * trak, const GstBuffer * codec_data, guint32 avg_bitrate, guint32 max_bitrate) { AtomInfo *esds, *mp4a; GstBuffer *buf; /* Add ESDS atom to WAVE */ esds = build_esds_extension (trak, ESDS_OBJECT_TYPE_MPEG4_P3, ESDS_STREAM_TYPE_AUDIO, codec_data, avg_bitrate, max_bitrate); /* Add MP4A atom to the WAVE: * not really in spec, but makes offset based players happy */ buf = gst_buffer_new_and_alloc (4); *((guint32 *) GST_BUFFER_DATA (buf)) = 0; mp4a = build_codec_data_extension (FOURCC_mp4a, buf); gst_buffer_unref (buf); return build_mov_wave_extension (trak, FOURCC_mp4a, mp4a, esds, TRUE); } AtomInfo * build_mov_alac_extension (AtomTRAK * trak, const GstBuffer * codec_data) { AtomInfo *alac; alac = build_codec_data_extension (FOURCC_alac, codec_data); return build_mov_wave_extension (trak, FOURCC_alac, NULL, alac, TRUE); } AtomInfo * build_fiel_extension (gint fields) { AtomData *atom_data; GstBuffer *buf; if (fields == 1) { return NULL; } buf = gst_buffer_new_and_alloc (1); GST_BUFFER_DATA (buf)[0] = (guint8) fields; atom_data = atom_data_new_from_gst_buffer (GST_MAKE_FOURCC ('f', 'i', 'e', 'l'), buf); gst_buffer_unref (buf); return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, atom_data_free); } AtomInfo * build_jp2x_extension (const GstBuffer * prefix) { AtomData *atom_data; if (!prefix) { return NULL; } atom_data = atom_data_new_from_gst_buffer (GST_MAKE_FOURCC ('j', 'p', '2', 'x'), prefix); return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, atom_data_free); } AtomInfo * build_jp2h_extension (AtomTRAK * trak, gint width, gint height, guint32 fourcc, gint ncomp, const GValue * cmap_array, const GValue * cdef_array) { AtomData *atom_data; GstBuffer *buf; guint8 cenum; gint i; gint idhr_size = 22; gint colr_size = 15; gint cmap_size = 0, cdef_size = 0; gint cmap_array_size = 0; gint cdef_array_size = 0; GstByteWriter writer; g_return_val_if_fail (cmap_array == NULL || GST_VALUE_HOLDS_ARRAY (cmap_array), NULL); g_return_val_if_fail (cdef_array == NULL || GST_VALUE_HOLDS_ARRAY (cdef_array), NULL); if (fourcc == GST_MAKE_FOURCC ('s', 'R', 'G', 'B')) { cenum = 0x10; if (ncomp == 0) ncomp = 3; } else if (fourcc == GST_MAKE_FOURCC ('G', 'R', 'A', 'Y')) { cenum = 0x11; if (ncomp == 0) ncomp = 1; } else if (fourcc == GST_MAKE_FOURCC ('s', 'Y', 'U', 'V')) { cenum = 0x12; if (ncomp == 0) ncomp = 3; } else return NULL; if (cmap_array) { cmap_array_size = gst_value_array_get_size (cmap_array); cmap_size = 8 + cmap_array_size * 4; } if (cdef_array) { cdef_array_size = gst_value_array_get_size (cdef_array); cdef_size = 8 + 2 + cdef_array_size * 6; } buf = gst_buffer_new_and_alloc (idhr_size + colr_size + cmap_size + cdef_size); gst_byte_writer_init_with_buffer (&writer, buf, FALSE); /* ihdr = image header box */ gst_byte_writer_put_uint32_be (&writer, 22); gst_byte_writer_put_uint32_le (&writer, GST_MAKE_FOURCC ('i', 'h', 'd', 'r')); gst_byte_writer_put_uint32_be (&writer, height); gst_byte_writer_put_uint32_be (&writer, width); gst_byte_writer_put_uint16_be (&writer, ncomp); /* 8 bits per component, unsigned */ gst_byte_writer_put_uint8 (&writer, 0x7); /* compression type; reserved */ gst_byte_writer_put_uint8 (&writer, 0x7); /* colour space (un)known */ gst_byte_writer_put_uint8 (&writer, 0x0); /* intellectual property right (box present) */ gst_byte_writer_put_uint8 (&writer, 0x0); /* colour specification box */ gst_byte_writer_put_uint32_be (&writer, 15); gst_byte_writer_put_uint32_le (&writer, GST_MAKE_FOURCC ('c', 'o', 'l', 'r')); /* specification method: enumerated */ gst_byte_writer_put_uint8 (&writer, 0x1); /* precedence; reserved */ gst_byte_writer_put_uint8 (&writer, 0x0); /* approximation; reserved */ gst_byte_writer_put_uint8 (&writer, 0x0); /* enumerated colourspace */ gst_byte_writer_put_uint32_be (&writer, cenum); if (cmap_array) { gst_byte_writer_put_uint32_be (&writer, cmap_size); gst_byte_writer_put_uint32_le (&writer, GST_MAKE_FOURCC ('c', 'm', 'a', 'p')); for (i = 0; i < cmap_array_size; i++) { const GValue *item; gint value; guint16 cmp; guint8 mtyp; guint8 pcol; item = gst_value_array_get_value (cmap_array, i); value = g_value_get_int (item); /* value is '(mtyp << 24) | (pcol << 16) | cmp' */ cmp = value & 0xFFFF; mtyp = value >> 24; pcol = (value >> 16) & 0xFF; if (mtyp == 1) GST_WARNING ("MTYP of cmap atom signals Pallete Mapping, but we don't " "handle Pallete mapping atoms yet"); gst_byte_writer_put_uint16_be (&writer, cmp); gst_byte_writer_put_uint8 (&writer, mtyp); gst_byte_writer_put_uint8 (&writer, pcol); } } if (cdef_array) { gst_byte_writer_put_uint32_be (&writer, cdef_size); gst_byte_writer_put_uint32_le (&writer, GST_MAKE_FOURCC ('c', 'd', 'e', 'f')); gst_byte_writer_put_uint16_be (&writer, cdef_array_size); for (i = 0; i < cdef_array_size; i++) { const GValue *item; gint value; item = gst_value_array_get_value (cdef_array, i); value = g_value_get_int (item); gst_byte_writer_put_uint16_be (&writer, i); if (value > 0) { gst_byte_writer_put_uint16_be (&writer, 0); gst_byte_writer_put_uint16_be (&writer, value); } else if (value < 0) { gst_byte_writer_put_uint16_be (&writer, -value); gst_byte_writer_put_uint16_be (&writer, 0); /* TODO what here? */ } else { gst_byte_writer_put_uint16_be (&writer, 1); gst_byte_writer_put_uint16_be (&writer, 0); } } } g_assert (gst_byte_writer_get_remaining (&writer) == 0); atom_data = atom_data_new_from_gst_buffer (FOURCC_jp2h, buf); gst_buffer_unref (buf); return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, atom_data_free); } AtomInfo * build_codec_data_extension (guint32 fourcc, const GstBuffer * codec_data) { AtomData *data; AtomInfo *result = NULL; if (codec_data) { data = atom_data_new_from_gst_buffer (fourcc, codec_data); result = build_atom_info_wrapper ((Atom *) data, atom_data_copy_data, atom_data_free); } return result; } AtomInfo * build_amr_extension (void) { guint8 ext[9]; GstBuffer *buf; AtomInfo *res; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = ext; GST_BUFFER_SIZE (buf) = sizeof (ext); /* vendor */ GST_WRITE_UINT32_LE (ext, 0); /* decoder version */ GST_WRITE_UINT8 (ext + 4, 0); /* mode set (all modes) */ GST_WRITE_UINT16_BE (ext + 5, 0x81FF); /* mode change period (no restriction) */ GST_WRITE_UINT8 (ext + 7, 0); /* frames per sample */ GST_WRITE_UINT8 (ext + 8, 1); res = build_codec_data_extension (GST_MAKE_FOURCC ('d', 'a', 'm', 'r'), buf); gst_buffer_unref (buf); return res; } AtomInfo * build_h263_extension (void) { guint8 ext[7]; GstBuffer *buf; AtomInfo *res; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = ext; GST_BUFFER_SIZE (buf) = sizeof (ext); /* vendor */ GST_WRITE_UINT32_LE (ext, 0); /* decoder version */ GST_WRITE_UINT8 (ext + 4, 0); /* level / profile */ /* FIXME ? maybe ? obtain somewhere; baseline for now */ GST_WRITE_UINT8 (ext + 5, 10); GST_WRITE_UINT8 (ext + 6, 0); res = build_codec_data_extension (GST_MAKE_FOURCC ('d', '2', '6', '3'), buf); gst_buffer_unref (buf); return res; } AtomInfo * build_gama_atom (gdouble gamma) { AtomInfo *res; guint32 gamma_fp; GstBuffer *buf; /* convert to uint32 from fixed point */ gamma_fp = (guint32) 65536 *gamma; buf = gst_buffer_new_and_alloc (4); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), gamma_fp); res = build_codec_data_extension (FOURCC_gama, buf); gst_buffer_unref (buf); return res; } AtomInfo * build_SMI_atom (const GstBuffer * seqh) { AtomInfo *res; GstBuffer *buf; /* the seqh plus its size and fourcc */ buf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (seqh) + 8); GST_WRITE_UINT32_LE (GST_BUFFER_DATA (buf), FOURCC_SEQH); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + 4, GST_BUFFER_SIZE (seqh)); memcpy (GST_BUFFER_DATA (buf) + 8, GST_BUFFER_DATA (seqh), GST_BUFFER_SIZE (seqh)); res = build_codec_data_extension (FOURCC_SMI_, buf); gst_buffer_unref (buf); return res; } static AtomInfo * build_ima_adpcm_atom (gint channels, gint rate, gint blocksize) { AtomData *atom_data; GstBuffer *buf; guint8 *data; const gint ima_adpcm_atom_size = 20; guint32 fourcc; gint samplesperblock; gint bytespersec; /* The FOURCC for WAV codecs in QT is 'ms' followed by the 16 bit wave codec identifier. Note that the identifier here is big-endian, but when used within the WAVE header (below), it's little endian. */ fourcc = MS_WAVE_FOURCC (0x11); buf = gst_buffer_new_and_alloc (ima_adpcm_atom_size); data = GST_BUFFER_DATA (buf); /* This atom's content is a WAVE header, including 2 bytes of extra data. Note that all of this is little-endian, unlike most stuff in qt. */ /* 4 bytes header per channel (including 1 sample). Then 2 samples per byte for the rest. Simplifies to this. */ samplesperblock = 2 * blocksize / channels - 7; bytespersec = rate * blocksize / samplesperblock; GST_WRITE_UINT16_LE (data, 0x11); GST_WRITE_UINT16_LE (data + 2, channels); GST_WRITE_UINT32_LE (data + 4, rate); GST_WRITE_UINT32_LE (data + 8, bytespersec); GST_WRITE_UINT16_LE (data + 12, blocksize); GST_WRITE_UINT16_LE (data + 14, 4); GST_WRITE_UINT16_LE (data + 16, 2); /* Two extra bytes */ GST_WRITE_UINT16_LE (data + 18, samplesperblock); atom_data = atom_data_new_from_gst_buffer (fourcc, buf); gst_buffer_unref (buf); return build_atom_info_wrapper ((Atom *) atom_data, atom_data_copy_data, atom_data_free); } AtomInfo * build_ima_adpcm_extension (gint channels, gint rate, gint blocksize) { AtomWAVE *wave; AtomFRMA *frma; Atom *ext_atom; /* Add WAVE atom */ wave = atom_wave_new (); /* Prepend Terminator atom to the WAVE list first, so it ends up last */ ext_atom = (Atom *) atom_data_new (FOURCC_null); wave->extension_atoms = atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) ext_atom, (AtomCopyDataFunc) atom_data_copy_data, (AtomFreeFunc) atom_data_free); /* Add wave ima adpcm atom to WAVE */ wave->extension_atoms = g_list_prepend (wave->extension_atoms, build_ima_adpcm_atom (channels, rate, blocksize)); /* Add FRMA to the WAVE */ frma = atom_frma_new (); frma->media_type = MS_WAVE_FOURCC (0x11); wave->extension_atoms = atom_info_list_prepend_atom (wave->extension_atoms, (Atom *) frma, (AtomCopyDataFunc) atom_frma_copy_data, (AtomFreeFunc) atom_frma_free); return build_atom_info_wrapper ((Atom *) wave, atom_wave_copy_data, atom_wave_free); } AtomInfo * build_uuid_xmp_atom (GstBuffer * xmp_data) { AtomUUID *uuid; static guint8 xmp_uuid[] = { 0xBE, 0x7A, 0xCF, 0xCB, 0x97, 0xA9, 0x42, 0xE8, 0x9C, 0x71, 0x99, 0x94, 0x91, 0xE3, 0xAF, 0xAC }; if (xmp_data == NULL) return NULL; uuid = atom_uuid_new (); memcpy (uuid->uuid, xmp_uuid, 16); uuid->data = g_malloc (GST_BUFFER_SIZE (xmp_data)); uuid->datalen = GST_BUFFER_SIZE (xmp_data); memcpy (uuid->data, GST_BUFFER_DATA (xmp_data), GST_BUFFER_SIZE (xmp_data)); return build_atom_info_wrapper ((Atom *) uuid, atom_uuid_copy_data, atom_uuid_free); } gst-plugins-good-0.10.31/gst/isomp4/Makefile.in0000644000175000017500000012621111720560233016056 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/isomp4 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstisomp4_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstisomp4_la_OBJECTS = libgstisomp4_la-isomp4-plugin.lo \ libgstisomp4_la-gstrtpxqtdepay.lo libgstisomp4_la-qtdemux.lo \ libgstisomp4_la-qtdemux_types.lo \ libgstisomp4_la-qtdemux_dump.lo \ libgstisomp4_la-qtdemux_lang.lo libgstisomp4_la-gstqtmux.lo \ libgstisomp4_la-gstqtmoovrecover.lo libgstisomp4_la-atoms.lo \ libgstisomp4_la-atomsrecovery.lo \ libgstisomp4_la-descriptors.lo libgstisomp4_la-properties.lo \ libgstisomp4_la-gstqtmuxmap.lo libgstisomp4_la_OBJECTS = $(am_libgstisomp4_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstisomp4_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstisomp4_la_CFLAGS) $(CFLAGS) \ $(libgstisomp4_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstisomp4_la_SOURCES) DIST_SOURCES = $(libgstisomp4_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstisomp4.la libgstisomp4_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstisomp4_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(ZLIB_LIBS) libgstisomp4_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} libgstisomp4_la_SOURCES = isomp4-plugin.c gstrtpxqtdepay.c \ qtdemux.c qtdemux_types.c qtdemux_dump.c qtdemux_lang.c \ gstqtmux.c gstqtmoovrecover.c atoms.c atomsrecovery.c descriptors.c \ properties.c gstqtmuxmap.c libgstisomp4_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ qtatomparser.h \ qtdemux.h \ qtdemux_types.h \ qtdemux_dump.h \ qtdemux_fourcc.h \ qtdemux_lang.h \ qtpalette.h \ gstrtpxqtdepay.h \ gstqtmux.h \ gstqtmoovrecover.h \ atoms.h \ atomsrecovery.h \ descriptors.h \ properties.h \ fourcc.h \ ftypcc.h \ gstqtmuxmap.h EXTRA_DIST = \ gstqtmux-doc.c \ gstqtmux-doc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/isomp4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/isomp4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstisomp4.la: $(libgstisomp4_la_OBJECTS) $(libgstisomp4_la_DEPENDENCIES) $(EXTRA_libgstisomp4_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstisomp4_la_LINK) -rpath $(plugindir) $(libgstisomp4_la_OBJECTS) $(libgstisomp4_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-atoms.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-atomsrecovery.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-descriptors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstqtmux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-isomp4-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-properties.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux_dump.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux_lang.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstisomp4_la-qtdemux_types.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstisomp4_la-isomp4-plugin.lo: isomp4-plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-isomp4-plugin.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-isomp4-plugin.Tpo -c -o libgstisomp4_la-isomp4-plugin.lo `test -f 'isomp4-plugin.c' || echo '$(srcdir)/'`isomp4-plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-isomp4-plugin.Tpo $(DEPDIR)/libgstisomp4_la-isomp4-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='isomp4-plugin.c' object='libgstisomp4_la-isomp4-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-isomp4-plugin.lo `test -f 'isomp4-plugin.c' || echo '$(srcdir)/'`isomp4-plugin.c libgstisomp4_la-gstrtpxqtdepay.lo: gstrtpxqtdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstrtpxqtdepay.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Tpo -c -o libgstisomp4_la-gstrtpxqtdepay.lo `test -f 'gstrtpxqtdepay.c' || echo '$(srcdir)/'`gstrtpxqtdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Tpo $(DEPDIR)/libgstisomp4_la-gstrtpxqtdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpxqtdepay.c' object='libgstisomp4_la-gstrtpxqtdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstrtpxqtdepay.lo `test -f 'gstrtpxqtdepay.c' || echo '$(srcdir)/'`gstrtpxqtdepay.c libgstisomp4_la-qtdemux.lo: qtdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux.Tpo -c -o libgstisomp4_la-qtdemux.lo `test -f 'qtdemux.c' || echo '$(srcdir)/'`qtdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux.c' object='libgstisomp4_la-qtdemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux.lo `test -f 'qtdemux.c' || echo '$(srcdir)/'`qtdemux.c libgstisomp4_la-qtdemux_types.lo: qtdemux_types.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux_types.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux_types.Tpo -c -o libgstisomp4_la-qtdemux_types.lo `test -f 'qtdemux_types.c' || echo '$(srcdir)/'`qtdemux_types.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux_types.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux_types.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux_types.c' object='libgstisomp4_la-qtdemux_types.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux_types.lo `test -f 'qtdemux_types.c' || echo '$(srcdir)/'`qtdemux_types.c libgstisomp4_la-qtdemux_dump.lo: qtdemux_dump.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux_dump.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux_dump.Tpo -c -o libgstisomp4_la-qtdemux_dump.lo `test -f 'qtdemux_dump.c' || echo '$(srcdir)/'`qtdemux_dump.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux_dump.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux_dump.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux_dump.c' object='libgstisomp4_la-qtdemux_dump.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux_dump.lo `test -f 'qtdemux_dump.c' || echo '$(srcdir)/'`qtdemux_dump.c libgstisomp4_la-qtdemux_lang.lo: qtdemux_lang.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-qtdemux_lang.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-qtdemux_lang.Tpo -c -o libgstisomp4_la-qtdemux_lang.lo `test -f 'qtdemux_lang.c' || echo '$(srcdir)/'`qtdemux_lang.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-qtdemux_lang.Tpo $(DEPDIR)/libgstisomp4_la-qtdemux_lang.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qtdemux_lang.c' object='libgstisomp4_la-qtdemux_lang.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-qtdemux_lang.lo `test -f 'qtdemux_lang.c' || echo '$(srcdir)/'`qtdemux_lang.c libgstisomp4_la-gstqtmux.lo: gstqtmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstqtmux.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstqtmux.Tpo -c -o libgstisomp4_la-gstqtmux.lo `test -f 'gstqtmux.c' || echo '$(srcdir)/'`gstqtmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstqtmux.Tpo $(DEPDIR)/libgstisomp4_la-gstqtmux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstqtmux.c' object='libgstisomp4_la-gstqtmux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstqtmux.lo `test -f 'gstqtmux.c' || echo '$(srcdir)/'`gstqtmux.c libgstisomp4_la-gstqtmoovrecover.lo: gstqtmoovrecover.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstqtmoovrecover.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Tpo -c -o libgstisomp4_la-gstqtmoovrecover.lo `test -f 'gstqtmoovrecover.c' || echo '$(srcdir)/'`gstqtmoovrecover.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Tpo $(DEPDIR)/libgstisomp4_la-gstqtmoovrecover.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstqtmoovrecover.c' object='libgstisomp4_la-gstqtmoovrecover.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstqtmoovrecover.lo `test -f 'gstqtmoovrecover.c' || echo '$(srcdir)/'`gstqtmoovrecover.c libgstisomp4_la-atoms.lo: atoms.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-atoms.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-atoms.Tpo -c -o libgstisomp4_la-atoms.lo `test -f 'atoms.c' || echo '$(srcdir)/'`atoms.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-atoms.Tpo $(DEPDIR)/libgstisomp4_la-atoms.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='atoms.c' object='libgstisomp4_la-atoms.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-atoms.lo `test -f 'atoms.c' || echo '$(srcdir)/'`atoms.c libgstisomp4_la-atomsrecovery.lo: atomsrecovery.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-atomsrecovery.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-atomsrecovery.Tpo -c -o libgstisomp4_la-atomsrecovery.lo `test -f 'atomsrecovery.c' || echo '$(srcdir)/'`atomsrecovery.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-atomsrecovery.Tpo $(DEPDIR)/libgstisomp4_la-atomsrecovery.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='atomsrecovery.c' object='libgstisomp4_la-atomsrecovery.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-atomsrecovery.lo `test -f 'atomsrecovery.c' || echo '$(srcdir)/'`atomsrecovery.c libgstisomp4_la-descriptors.lo: descriptors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-descriptors.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-descriptors.Tpo -c -o libgstisomp4_la-descriptors.lo `test -f 'descriptors.c' || echo '$(srcdir)/'`descriptors.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-descriptors.Tpo $(DEPDIR)/libgstisomp4_la-descriptors.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='descriptors.c' object='libgstisomp4_la-descriptors.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-descriptors.lo `test -f 'descriptors.c' || echo '$(srcdir)/'`descriptors.c libgstisomp4_la-properties.lo: properties.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-properties.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-properties.Tpo -c -o libgstisomp4_la-properties.lo `test -f 'properties.c' || echo '$(srcdir)/'`properties.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-properties.Tpo $(DEPDIR)/libgstisomp4_la-properties.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='properties.c' object='libgstisomp4_la-properties.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-properties.lo `test -f 'properties.c' || echo '$(srcdir)/'`properties.c libgstisomp4_la-gstqtmuxmap.lo: gstqtmuxmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -MT libgstisomp4_la-gstqtmuxmap.lo -MD -MP -MF $(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Tpo -c -o libgstisomp4_la-gstqtmuxmap.lo `test -f 'gstqtmuxmap.c' || echo '$(srcdir)/'`gstqtmuxmap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Tpo $(DEPDIR)/libgstisomp4_la-gstqtmuxmap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstqtmuxmap.c' object='libgstisomp4_la-gstqtmuxmap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstisomp4_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) $(CFLAGS) -c -o libgstisomp4_la-gstqtmuxmap.lo `test -f 'gstqtmuxmap.c' || echo '$(srcdir)/'`gstqtmuxmap.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstisomp4 -:SHARED libgstisomp4 \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstisomp4_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstisomp4_la_CFLAGS) \ -:LDFLAGS $(libgstisomp4_la_LDFLAGS) \ $(libgstisomp4_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/isomp4/gstrtpxqtdepay.c0000644000175000017500000005131711677341655017304 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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. */ /* * based on http://developer.apple.com/quicktime/icefloe/dispatch026.html */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "gstrtpxqtdepay.h" #define MAKE_TLV(a,b) (((a)<<8)|(b)) #define TLV_sd MAKE_TLV ('s','d') #define TLV_qt MAKE_TLV ('q','t') #define TLV_ti MAKE_TLV ('t','i') #define TLV_ly MAKE_TLV ('l','y') #define TLV_vo MAKE_TLV ('v','o') #define TLV_mx MAKE_TLV ('m','x') #define TLV_tr MAKE_TLV ('t','r') #define TLV_tw MAKE_TLV ('t','w') #define TLV_th MAKE_TLV ('t','h') #define TLV_la MAKE_TLV ('l','a') #define TLV_rt MAKE_TLV ('r','t') #define TLV_gm MAKE_TLV ('g','m') #define TLV_oc MAKE_TLV ('o','c') #define TLV_cr MAKE_TLV ('c','r') #define TLV_du MAKE_TLV ('d','u') #define TLV_po MAKE_TLV ('p','o') #define QT_UINT32(a) (GST_READ_UINT32_BE(a)) #define QT_UINT24(a) (GST_READ_UINT32_BE(a) >> 8) #define QT_UINT16(a) (GST_READ_UINT16_BE(a)) #define QT_UINT8(a) (GST_READ_UINT8(a)) #define QT_FP32(a) ((GST_READ_UINT32_BE(a))/65536.0) #define QT_FP16(a) ((GST_READ_UINT16_BE(a))/256.0) #define QT_FOURCC(a) (GST_READ_UINT32_LE(a)) #define QT_UINT64(a) ((((guint64)QT_UINT32(a))<<32)|QT_UINT32(((guint8 *)a)+4)) #define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') #define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') GST_DEBUG_CATEGORY_STATIC (rtpxqtdepay_debug); #define GST_CAT_DEFAULT (rtpxqtdepay_debug) /* RtpXQTDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, }; static GstStaticPadTemplate gst_rtp_xqt_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_rtp_xqt_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "media = (string) { \"audio\", \"video\" }, clock-rate = (int) [1, MAX], " "encoding-name = (string) { \"X-QT\", \"X-QUICKTIME\" }") ); GST_BOILERPLATE (GstRtpXQTDepay, gst_rtp_xqt_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_xqt_depay_finalize (GObject * object); static gboolean gst_rtp_xqt_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_xqt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_xqt_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_xqt_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_xqt_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_xqt_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP packet depayloader", "Codec/Depayloader/Network", "Extracts Quicktime audio/video from RTP packets", "Wim Taymans "); } static void gst_rtp_xqt_depay_class_init (GstRtpXQTDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_rtp_xqt_depay_finalize; gstelement_class->change_state = gst_rtp_xqt_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_xqt_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_xqt_depay_process; GST_DEBUG_CATEGORY_INIT (rtpxqtdepay_debug, "rtpxqtdepay", 0, "QT Media RTP Depayloader"); } static void gst_rtp_xqt_depay_init (GstRtpXQTDepay * rtpxqtdepay, GstRtpXQTDepayClass * klass) { rtpxqtdepay->adapter = gst_adapter_new (); } static void gst_rtp_xqt_depay_finalize (GObject * object) { GstRtpXQTDepay *rtpxqtdepay; rtpxqtdepay = GST_RTP_XQT_DEPAY (object); g_object_unref (rtpxqtdepay->adapter); rtpxqtdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_quicktime_parse_sd (GstRtpXQTDepay * rtpxqtdepay, guint8 * data, guint data_len) { gint len; guint32 fourcc; if (data_len < 8) goto too_short; len = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; if (len > data_len) goto too_short; fourcc = QT_FOURCC (data + 4); GST_DEBUG_OBJECT (rtpxqtdepay, "parsing %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); switch (fourcc) { case FOURCC_avc1: { guint32 chlen; if (len < 0x56) goto too_short; len -= 0x56; data += 0x56; /* find avcC */ while (len >= 8) { chlen = QT_UINT32 (data); fourcc = QT_FOURCC (data + 4); if (fourcc == FOURCC_avcC) { GstBuffer *buf; gint size; GstCaps *caps; GST_DEBUG_OBJECT (rtpxqtdepay, "found avcC codec_data in sd, %u", chlen); /* parse, if found */ if (chlen < len) size = chlen - 8; else size = len - 8; buf = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buf), data + 8, size); caps = gst_caps_new_simple ("video/x-h264", "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD (rtpxqtdepay)->srcpad, caps); gst_caps_unref (caps); break; } len -= chlen; data += chlen; } break; } default: break; } return TRUE; /* ERRORS */ too_short: { return FALSE; } } static gboolean gst_rtp_xqt_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; gint clock_rate = 90000; /* default */ structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "clock-rate", &clock_rate); depayload->clock_rate = clock_rate; return TRUE; } static GstBuffer * gst_rtp_xqt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpXQTDepay *rtpxqtdepay; GstBuffer *outbuf; gboolean m; rtpxqtdepay = GST_RTP_XQT_DEPAY (depayload); if (!gst_rtp_buffer_validate (buf)) goto bad_packet; if (GST_BUFFER_IS_DISCONT (buf)) { /* discont, clear adapter and try to find a new packet start */ gst_adapter_clear (rtpxqtdepay->adapter); rtpxqtdepay->need_resync = TRUE; GST_DEBUG_OBJECT (rtpxqtdepay, "we need resync"); } m = gst_rtp_buffer_get_marker (buf); GST_LOG_OBJECT (rtpxqtdepay, "marker: %d", m); { gint payload_len; guint avail; guint8 *payload; guint8 ver, pck; gboolean s, q, l, d; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); /* 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | VER |PCK|S|Q|L| RES |D| QuickTime Payload ID | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ if (payload_len <= 4) goto wrong_length; ver = (payload[0] & 0xf0) >> 4; if (ver > 1) goto wrong_version; pck = (payload[0] & 0x0c) >> 2; if (pck == 0) goto pck_reserved; s = (payload[0] & 0x02) != 0; /* contains sync sample */ q = (payload[0] & 0x01) != 0; /* has payload description */ l = (payload[1] & 0x80) != 0; /* has packet specific information description */ d = (payload[2] & 0x80) != 0; /* don't cache info for payload id */ /* id used for caching info */ rtpxqtdepay->current_id = ((payload[2] & 0x7f) << 8) | payload[3]; GST_LOG_OBJECT (rtpxqtdepay, "VER: %d, PCK: %d, S: %d, Q: %d, L: %d, D: %d, ID: %d", ver, pck, s, q, l, d, rtpxqtdepay->current_id); if (rtpxqtdepay->need_resync) { /* we need to find the boundary of a new packet after a DISCONT */ if (pck != 3 || q) { /* non-fragmented packet or payload description present, packet starts * here. */ rtpxqtdepay->need_resync = FALSE; } else { /* fragmented packet without description */ if (m) { /* marker bit set, next packet is start of new one */ rtpxqtdepay->need_resync = FALSE; } goto need_resync; } } payload += 4; payload_len -= 4; if (q) { gboolean k, f, a, z; guint pdlen, pdpadded; gint padding; /* media_type only used for printing */ guint32 G_GNUC_UNUSED media_type; guint32 timescale; /* 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |K|F|A|Z| RES | QuickTime Payload Desc Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . QuickTime Payload Desc Data ... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ if (payload_len <= 4) goto wrong_length; k = (payload[0] & 0x80) != 0; /* keyframe */ f = (payload[0] & 0x40) != 0; /* sparse */ a = (payload[0] & 0x20) != 0; /* start of payload */ z = (payload[0] & 0x10) != 0; /* end of payload */ pdlen = (payload[2] << 8) | payload[3]; if (pdlen < 12) goto wrong_length; /* calc padding */ pdpadded = pdlen + 3; pdpadded -= pdpadded % 4; if (payload_len < pdpadded) goto wrong_length; padding = pdpadded - pdlen; GST_LOG_OBJECT (rtpxqtdepay, "K: %d, F: %d, A: %d, Z: %d, len: %d, padding %d", k, f, a, z, pdlen, padding); payload += 4; payload_len -= 4; /* 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | QuickTime Media Type | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Timescale | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . QuickTime TLVs ... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ media_type = (payload[0] << 24) | (payload[1] << 16) | (payload[2] << 8) | payload[3]; timescale = (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7]; GST_LOG_OBJECT (rtpxqtdepay, "media_type: %c%c%c%c, timescale %u", payload[0], payload[1], payload[2], payload[3], timescale); payload += 8; payload_len -= 8; pdlen -= 12; /* parse TLV (type-length-value triplets */ while (pdlen > 3) { guint16 tlv_len, tlv_type; /* 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | QuickTime TLV Length | QuickTime TLV Type | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . QuickTime TLV Value ... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ tlv_len = (payload[0] << 8) | payload[1]; tlv_type = (payload[2] << 8) | payload[3]; pdlen -= 4; if (tlv_len > pdlen) goto wrong_length; GST_LOG_OBJECT (rtpxqtdepay, "TLV '%c%c', len %d", payload[2], payload[3], tlv_len); payload += 4; payload_len -= 4; switch (tlv_type) { case TLV_sd: /* Session description */ if (!gst_rtp_quicktime_parse_sd (rtpxqtdepay, payload, tlv_len)) goto unknown_format; rtpxqtdepay->have_sd = TRUE; break; case TLV_qt: case TLV_ti: case TLV_ly: case TLV_vo: case TLV_mx: case TLV_tr: case TLV_tw: case TLV_th: case TLV_la: case TLV_rt: case TLV_gm: case TLV_oc: case TLV_cr: case TLV_du: case TLV_po: default: break; } pdlen -= tlv_len; payload += tlv_len; payload_len -= tlv_len; } payload += padding; payload_len -= padding; } if (l) { guint ssilen, ssipadded; gint padding; /* 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | RES | Sample-Specific Info Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . QuickTime TLVs ... * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ if (payload_len <= 4) goto wrong_length; ssilen = (payload[2] << 8) | payload[3]; if (ssilen < 4) goto wrong_length; /* calc padding */ ssipadded = ssilen + 3; ssipadded -= ssipadded % 4; if (payload_len < ssipadded) goto wrong_length; padding = ssipadded - ssilen; GST_LOG_OBJECT (rtpxqtdepay, "len: %d, padding %d", ssilen, padding); payload += 4; payload_len -= 4; ssilen -= 4; /* parse TLV (type-length-value triplets */ while (ssilen > 3) { guint16 tlv_len, tlv_type; /* 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | QuickTime TLV Length | QuickTime TLV Type | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . QuickTime TLV Value ... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ tlv_len = (payload[0] << 8) | payload[1]; tlv_type = (payload[2] << 8) | payload[3]; ssilen -= 4; if (tlv_len > ssilen) goto wrong_length; GST_LOG_OBJECT (rtpxqtdepay, "TLV '%c%c', len %d", payload[2], payload[3], tlv_len); payload += 4; payload_len -= 4; switch (tlv_type) { case TLV_sd: case TLV_qt: case TLV_ti: case TLV_ly: case TLV_vo: case TLV_mx: case TLV_tr: case TLV_tw: case TLV_th: case TLV_la: case TLV_rt: case TLV_gm: case TLV_oc: case TLV_cr: case TLV_du: case TLV_po: default: break; } ssilen -= tlv_len; payload += tlv_len; payload_len -= tlv_len; } payload += padding; payload_len -= padding; } rtpxqtdepay->previous_id = rtpxqtdepay->current_id; switch (pck) { case 1: { /* multiple samples per packet. */ outbuf = gst_buffer_new_and_alloc (payload_len); memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); return outbuf; } case 2: { guint slen; /* multiple samples per packet. * 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |S| Reserved | Sample Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Sample Timestamp | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . Sample Data ... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |S| Reserved | Sample Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Sample Timestamp | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . Sample Data ... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * . ...... . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ while (payload_len > 8) { s = (payload[0] & 0x80) != 0; /* contains sync sample */ slen = (payload[2] << 8) | payload[3]; /* timestamp = * (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | * payload[7]; */ payload += 8; payload_len -= 8; if (slen > payload_len) slen = payload_len; outbuf = gst_buffer_new_and_alloc (slen); memcpy (GST_BUFFER_DATA (outbuf), payload, slen); if (!s) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); gst_base_rtp_depayload_push (depayload, outbuf); /* aligned on 32 bit boundary */ slen = GST_ROUND_UP_4 (slen); payload += slen; payload_len -= slen; } break; } case 3: { /* one sample per packet, use adapter to combine based on marker bit. */ outbuf = gst_buffer_new_and_alloc (payload_len); memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); gst_adapter_push (rtpxqtdepay->adapter, outbuf); if (!m) goto done; avail = gst_adapter_available (rtpxqtdepay->adapter); outbuf = gst_adapter_take_buffer (rtpxqtdepay->adapter, avail); GST_DEBUG_OBJECT (rtpxqtdepay, "gst_rtp_xqt_depay_chain: pushing buffer of size %u", avail); return outbuf; } } } done: return NULL; bad_packet: { GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, ("Packet did not validate."), (NULL)); return NULL; } need_resync: { GST_DEBUG_OBJECT (rtpxqtdepay, "waiting for marker"); return NULL; } wrong_version: { GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, ("Unknown payload version."), (NULL)); return NULL; } pck_reserved: { GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, ("PCK reserved 0."), (NULL)); return NULL; } wrong_length: { GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, ("Wrong payload length."), (NULL)); return NULL; } unknown_format: { GST_ELEMENT_WARNING (rtpxqtdepay, STREAM, DECODE, ("Unknown payload format."), (NULL)); return NULL; } } static GstStateChangeReturn gst_rtp_xqt_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpXQTDepay *rtpxqtdepay; GstStateChangeReturn ret; rtpxqtdepay = GST_RTP_XQT_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpxqtdepay->adapter); rtpxqtdepay->previous_id = -1; rtpxqtdepay->current_id = -1; rtpxqtdepay->need_resync = TRUE; rtpxqtdepay->have_sd = FALSE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_adapter_clear (rtpxqtdepay->adapter); default: break; } return ret; } gst-plugins-good-0.10.31/gst/isomp4/qtdemux.h0000644000175000017500000000610011677341655015663 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_QTDEMUX_H__ #define __GST_QTDEMUX_H__ #include #include G_BEGIN_DECLS GST_DEBUG_CATEGORY_EXTERN (qtdemux_debug); #define GST_CAT_DEFAULT qtdemux_debug #define GST_TYPE_QTDEMUX \ (gst_qtdemux_get_type()) #define GST_QTDEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QTDEMUX,GstQTDemux)) #define GST_QTDEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QTDEMUX,GstQTDemuxClass)) #define GST_IS_QTDEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QTDEMUX)) #define GST_IS_QTDEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QTDEMUX)) #define GST_QTDEMUX_CAST(obj) ((GstQTDemux *)(obj)) /* qtdemux produces these for atoms it cannot parse */ #define GST_QT_DEMUX_PRIVATE_TAG "private-qt-tag" #define GST_QT_DEMUX_CLASSIFICATION_TAG "classification" #define GST_QTDEMUX_MAX_STREAMS 8 typedef struct _GstQTDemux GstQTDemux; typedef struct _GstQTDemuxClass GstQTDemuxClass; typedef struct _QtDemuxStream QtDemuxStream; struct _GstQTDemux { GstElement element; /* pads */ GstPad *sinkpad; QtDemuxStream *streams[GST_QTDEMUX_MAX_STREAMS]; gint n_streams; gint n_video_streams; gint n_audio_streams; gint n_sub_streams; guint major_brand; GstBuffer *comp_brands; GNode *moov_node; GNode *moov_node_compressed; guint32 timescale; guint64 duration; gboolean fragmented; /* offset of the mfra atom */ guint64 mfra_offset; guint64 moof_offset; gint state; gboolean pullbased; gboolean posted_redirect; /* push based variables */ guint neededbytes; guint todrop; GstAdapter *adapter; GstBuffer *mdatbuffer; guint64 mdatleft; guint64 offset; /* offset of the mdat atom */ guint64 mdatoffset; guint64 first_mdat; gboolean got_moov; guint header_size; GstTagList *tag_list; /* configured playback region */ GstSegment segment; gboolean segment_running; GstEvent *pending_newsegment; /* gst index support */ GstIndex *element_index; gint index_id; gint64 requested_seek_time; guint64 seek_offset; gboolean upstream_seekable; gboolean upstream_size; }; struct _GstQTDemuxClass { GstElementClass parent_class; }; GType gst_qtdemux_get_type (void); G_END_DECLS #endif /* __GST_QTDEMUX_H__ */ gst-plugins-good-0.10.31/gst/isomp4/gstqtmuxmap.h0000644000175000017500000000645111671175353016571 00000000000000/* Quicktime muxer plugin for GStreamer * Copyright (C) 2008 Thiago Sousa Santos * Copyright (C) 2008 Mark Nauwelaerts * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_QT_MUX_MAP_H__ #define __GST_QT_MUX_MAP_H__ #include "atoms.h" #include #include typedef enum _GstQTMuxFormat { GST_QT_MUX_FORMAT_NONE = 0, GST_QT_MUX_FORMAT_QT, GST_QT_MUX_FORMAT_MP4, GST_QT_MUX_FORMAT_3GP, GST_QT_MUX_FORMAT_MJ2, GST_QT_MUX_FORMAT_ISML } GstQTMuxFormat; typedef struct _GstQTMuxFormatProp { GstQTMuxFormat format; GstRank rank; const gchar *name; const gchar *long_name; const gchar *type_name; GstStaticCaps src_caps; GstStaticCaps video_sink_caps; GstStaticCaps audio_sink_caps; } GstQTMuxFormatProp; extern GstQTMuxFormatProp gst_qt_mux_format_list[]; void gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix, guint32 * _major, guint32 * verson, GList ** _compatible, AtomMOOV * moov, GstClockTime longest_chunk, gboolean faststart); AtomsTreeFlavor gst_qt_mux_map_format_to_flavor (GstQTMuxFormat format); #endif /* __GST_QT_MUX_MAP_H__ */ gst-plugins-good-0.10.31/gst/audiofx/0000755000175000017500000000000011720565301014313 500000000000000gst-plugins-good-0.10.31/gst/audiofx/audiokaraoke.c0000644000175000017500000002555311671175353017061 00000000000000/* * GStreamer * Copyright (C) 2008 Wim Taymans * * 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-audiokaraoke * * Remove the voice from audio by filtering the center channel. * This plugin is useful for karaoke applications. * * * Example launch line * |[ * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audiokaraoke ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include "audiokaraoke.h" #define GST_CAT_DEFAULT gst_audio_karaoke_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_LEVEL 1.0 #define DEFAULT_MONO_LEVEL 1.0 #define DEFAULT_FILTER_BAND 220.0 #define DEFAULT_FILTER_WIDTH 100.0 enum { PROP_0, PROP_LEVEL, PROP_MONO_LEVEL, PROP_FILTER_BAND, PROP_FILTER_WIDTH, PROP_LAST }; #define ALLOWED_CAPS \ "audio/x-raw-int," \ " depth=(int)16," \ " width=(int)16," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-float," \ " width=(int)32," \ " endianness=(int)BYTE_ORDER," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_karaoke_debug, "audiokaraoke", 0, "audiokaraoke element"); GST_BOILERPLATE_FULL (GstAudioKaraoke, gst_audio_karaoke, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static void gst_audio_karaoke_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_karaoke_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_audio_karaoke_setup (GstAudioFilter * filter, GstRingBufferSpec * format); static GstFlowReturn gst_audio_karaoke_transform_ip (GstBaseTransform * base, GstBuffer * buf); static void gst_audio_karaoke_transform_int (GstAudioKaraoke * filter, gint16 * data, guint num_samples); static void gst_audio_karaoke_transform_float (GstAudioKaraoke * filter, gfloat * data, guint num_samples); /* GObject vmethod implementations */ static void gst_audio_karaoke_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstCaps *caps; gst_element_class_set_details_simple (element_class, "AudioKaraoke", "Filter/Effect/Audio", "Removes voice from sound", "Wim Taymans "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), caps); gst_caps_unref (caps); } static void gst_audio_karaoke_class_init (GstAudioKaraokeClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_audio_karaoke_set_property; gobject_class->get_property = gst_audio_karaoke_get_property; g_object_class_install_property (gobject_class, PROP_LEVEL, g_param_spec_float ("level", "Level", "Level of the effect (1.0 = full)", 0.0, 1.0, DEFAULT_LEVEL, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MONO_LEVEL, g_param_spec_float ("mono-level", "Mono Level", "Level of the mono channel (1.0 = full)", 0.0, 1.0, DEFAULT_LEVEL, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FILTER_BAND, g_param_spec_float ("filter-band", "Filter Band", "The Frequency band of the filter", 0.0, 441.0, DEFAULT_FILTER_BAND, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FILTER_WIDTH, g_param_spec_float ("filter-width", "Filter Width", "The Frequency width of the filter", 0.0, 100.0, DEFAULT_FILTER_WIDTH, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); GST_AUDIO_FILTER_CLASS (klass)->setup = GST_DEBUG_FUNCPTR (gst_audio_karaoke_setup); GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = GST_DEBUG_FUNCPTR (gst_audio_karaoke_transform_ip); } static void gst_audio_karaoke_init (GstAudioKaraoke * filter, GstAudioKaraokeClass * klass) { gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); filter->level = DEFAULT_LEVEL; filter->mono_level = DEFAULT_MONO_LEVEL; filter->filter_band = DEFAULT_FILTER_BAND; filter->filter_width = DEFAULT_FILTER_WIDTH; } static void update_filter (GstAudioKaraoke * filter, gint rate) { gfloat A, B, C; if (rate == 0) return; C = exp (-2 * G_PI * filter->filter_width / rate); B = -4 * C / (1 + C) * cos (2 * G_PI * filter->filter_band / rate); A = sqrt (1 - B * B / (4 * C)) * (1 - C); filter->A = A; filter->B = B; filter->C = C; filter->y1 = 0.0; filter->y2 = 0.0; } static void gst_audio_karaoke_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioKaraoke *filter; filter = GST_AUDIO_KARAOKE (object); switch (prop_id) { case PROP_LEVEL: filter->level = g_value_get_float (value); break; case PROP_MONO_LEVEL: filter->mono_level = g_value_get_float (value); break; case PROP_FILTER_BAND: filter->filter_band = g_value_get_float (value); update_filter (filter, filter->rate); break; case PROP_FILTER_WIDTH: filter->filter_width = g_value_get_float (value); update_filter (filter, filter->rate); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_karaoke_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioKaraoke *filter; filter = GST_AUDIO_KARAOKE (object); switch (prop_id) { case PROP_LEVEL: g_value_set_float (value, filter->level); break; case PROP_MONO_LEVEL: g_value_set_float (value, filter->mono_level); break; case PROP_FILTER_BAND: g_value_set_float (value, filter->filter_band); break; case PROP_FILTER_WIDTH: g_value_set_float (value, filter->filter_width); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_karaoke_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioKaraoke *filter = GST_AUDIO_KARAOKE (base); gboolean ret = TRUE; filter->channels = format->channels; filter->rate = format->rate; if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) filter->process = (GstAudioKaraokeProcessFunc) gst_audio_karaoke_transform_float; else if (format->type == GST_BUFTYPE_LINEAR && format->width == 16) filter->process = (GstAudioKaraokeProcessFunc) gst_audio_karaoke_transform_int; else ret = FALSE; update_filter (filter, format->rate); return ret; } static void gst_audio_karaoke_transform_int (GstAudioKaraoke * filter, gint16 * data, guint num_samples) { gint i, l, r, o, x; gint channels; gdouble y; gint level; channels = filter->channels; level = filter->level * 256; for (i = 0; i < num_samples; i += channels) { /* get left and right inputs */ l = data[i]; r = data[i + 1]; /* do filtering */ x = (l + r) / 2; y = (filter->A * x - filter->B * filter->y1) - filter->C * filter->y2; filter->y2 = filter->y1; filter->y1 = y; /* filter mono signal */ o = (int) (y * filter->mono_level); o = CLAMP (o, G_MININT16, G_MAXINT16); o = (o * level) >> 8; /* now cut the center */ x = l - ((r * level) >> 8) + o; r = r - ((l * level) >> 8) + o; data[i] = CLAMP (x, G_MININT16, G_MAXINT16); data[i + 1] = CLAMP (r, G_MININT16, G_MAXINT16); } } static void gst_audio_karaoke_transform_float (GstAudioKaraoke * filter, gfloat * data, guint num_samples) { gint i; gint channels; gdouble l, r, o; gdouble y; channels = filter->channels; for (i = 0; i < num_samples; i += channels) { /* get left and right inputs */ l = data[i]; r = data[i + 1]; /* do filtering */ y = (filter->A * ((l + r) / 2.0) - filter->B * filter->y1) - filter->C * filter->y2; filter->y2 = filter->y1; filter->y1 = y; /* filter mono signal */ o = y * filter->mono_level * filter->level; /* now cut the center */ data[i] = l - (r * filter->level) + o; data[i + 1] = r - (l * filter->level) + o; } } /* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_karaoke_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioKaraoke *filter = GST_AUDIO_KARAOKE (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); if (gst_base_transform_is_passthrough (base) || G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) return GST_FLOW_OK; filter->process (filter, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/audiofx/audioecho.c0000644000175000017500000003132311677341654016357 00000000000000/* * GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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-audioecho * @Since: 0.10.14 * * audioecho adds an echo or (simple) reverb effect to an audio stream. The echo * delay, intensity and the percentage of feedback can be configured. * * For getting an echo effect you have to set the delay to a larger value, * for example 200ms and more. Everything below will result in a simple * reverb effect, which results in a slightly metallic sound. * * Use the max-delay property to set the maximum amount of delay that * will be used. This can only be set before going to the PAUSED or PLAYING * state and will be set to the current delay by default. * * * Example launch line * |[ * gst-launch filesrc location="melo1.ogg" ! audioconvert ! audioecho delay=500000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink * gst-launch filesrc location="melo1.ogg" ! decodebin ! audioconvert ! audioecho delay=50000000 intensity=0.6 feedback=0.4 ! audioconvert ! autoaudiosink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audioecho.h" #define GST_CAT_DEFAULT gst_audio_echo_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { PROP_0, PROP_DELAY, PROP_MAX_DELAY, PROP_INTENSITY, PROP_FEEDBACK }; #define ALLOWED_CAPS \ "audio/x-raw-float," \ " width=(int) { 32, 64 }, " \ " endianness=(int)BYTE_ORDER," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_echo_debug, "audioecho", 0, "audioecho element"); GST_BOILERPLATE_FULL (GstAudioEcho, gst_audio_echo, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static void gst_audio_echo_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_echo_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_echo_finalize (GObject * object); static gboolean gst_audio_echo_setup (GstAudioFilter * self, GstRingBufferSpec * format); static gboolean gst_audio_echo_stop (GstBaseTransform * base); static GstFlowReturn gst_audio_echo_transform_ip (GstBaseTransform * base, GstBuffer * buf); static void gst_audio_echo_transform_float (GstAudioEcho * self, gfloat * data, guint num_samples); static void gst_audio_echo_transform_double (GstAudioEcho * self, gdouble * data, guint num_samples); /* GObject vmethod implementations */ static void gst_audio_echo_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstCaps *caps; gst_element_class_set_details_simple (element_class, "Audio echo", "Filter/Effect/Audio", "Adds an echo or reverb effect to an audio stream", "Sebastian Dröge "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), caps); gst_caps_unref (caps); } static void gst_audio_echo_class_init (GstAudioEchoClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *basetransform_class = (GstBaseTransformClass *) klass; GstAudioFilterClass *audioself_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_echo_set_property; gobject_class->get_property = gst_audio_echo_get_property; gobject_class->finalize = gst_audio_echo_finalize; g_object_class_install_property (gobject_class, PROP_DELAY, g_param_spec_uint64 ("delay", "Delay", "Delay of the echo in nanoseconds", 1, G_MAXUINT64, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_MAX_DELAY, g_param_spec_uint64 ("max-delay", "Maximum Delay", "Maximum delay of the echo in nanoseconds" " (can't be changed in PLAYING or PAUSED state)", 1, G_MAXUINT64, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY)); g_object_class_install_property (gobject_class, PROP_INTENSITY, g_param_spec_float ("intensity", "Intensity", "Intensity of the echo", 0.0, 1.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_FEEDBACK, g_param_spec_float ("feedback", "Feedback", "Amount of feedback", 0.0, 1.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); audioself_class->setup = GST_DEBUG_FUNCPTR (gst_audio_echo_setup); basetransform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_audio_echo_transform_ip); basetransform_class->stop = GST_DEBUG_FUNCPTR (gst_audio_echo_stop); } static void gst_audio_echo_init (GstAudioEcho * self, GstAudioEchoClass * klass) { self->delay = 1; self->max_delay = 1; self->intensity = 0.0; self->feedback = 0.0; gst_base_transform_set_in_place (GST_BASE_TRANSFORM (self), TRUE); } static void gst_audio_echo_finalize (GObject * object) { GstAudioEcho *self = GST_AUDIO_ECHO (object); g_free (self->buffer); self->buffer = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_echo_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioEcho *self = GST_AUDIO_ECHO (object); switch (prop_id) { case PROP_DELAY:{ guint64 max_delay, delay; GST_BASE_TRANSFORM_LOCK (self); delay = g_value_get_uint64 (value); max_delay = self->max_delay; if (delay > max_delay && GST_STATE (self) > GST_STATE_READY) { GST_WARNING_OBJECT (self, "New delay (%" GST_TIME_FORMAT ") " "is larger than maximum delay (%" GST_TIME_FORMAT ")", GST_TIME_ARGS (delay), GST_TIME_ARGS (max_delay)); self->delay = max_delay; } else { self->delay = delay; self->max_delay = MAX (delay, max_delay); } GST_BASE_TRANSFORM_UNLOCK (self); } break; case PROP_MAX_DELAY:{ guint64 max_delay, delay; GST_BASE_TRANSFORM_LOCK (self); max_delay = g_value_get_uint64 (value); delay = self->delay; if (GST_STATE (self) > GST_STATE_READY) { GST_ERROR_OBJECT (self, "Can't change maximum delay in" " PLAYING or PAUSED state"); } else { self->delay = delay; self->max_delay = max_delay; } GST_BASE_TRANSFORM_UNLOCK (self); } break; case PROP_INTENSITY:{ GST_BASE_TRANSFORM_LOCK (self); self->intensity = g_value_get_float (value); GST_BASE_TRANSFORM_UNLOCK (self); } break; case PROP_FEEDBACK:{ GST_BASE_TRANSFORM_LOCK (self); self->feedback = g_value_get_float (value); GST_BASE_TRANSFORM_UNLOCK (self); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_echo_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioEcho *self = GST_AUDIO_ECHO (object); switch (prop_id) { case PROP_DELAY: GST_BASE_TRANSFORM_LOCK (self); g_value_set_uint64 (value, self->delay); GST_BASE_TRANSFORM_UNLOCK (self); break; case PROP_MAX_DELAY: GST_BASE_TRANSFORM_LOCK (self); g_value_set_uint64 (value, self->max_delay); GST_BASE_TRANSFORM_UNLOCK (self); break; case PROP_INTENSITY: GST_BASE_TRANSFORM_LOCK (self); g_value_set_float (value, self->intensity); GST_BASE_TRANSFORM_UNLOCK (self); break; case PROP_FEEDBACK: GST_BASE_TRANSFORM_LOCK (self); g_value_set_float (value, self->feedback); GST_BASE_TRANSFORM_UNLOCK (self); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_echo_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioEcho *self = GST_AUDIO_ECHO (base); gboolean ret = TRUE; if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) self->process = (GstAudioEchoProcessFunc) gst_audio_echo_transform_float; else if (format->type == GST_BUFTYPE_FLOAT && format->width == 64) self->process = (GstAudioEchoProcessFunc) gst_audio_echo_transform_double; else ret = FALSE; g_free (self->buffer); self->buffer = NULL; self->buffer_pos = 0; self->buffer_size = 0; self->buffer_size_frames = 0; return ret; } static gboolean gst_audio_echo_stop (GstBaseTransform * base) { GstAudioEcho *self = GST_AUDIO_ECHO (base); g_free (self->buffer); self->buffer = NULL; self->buffer_pos = 0; self->buffer_size = 0; self->buffer_size_frames = 0; return TRUE; } #define TRANSFORM_FUNC(name, type) \ static void \ gst_audio_echo_transform_##name (GstAudioEcho * self, \ type * data, guint num_samples) \ { \ type *buffer = (type *) self->buffer; \ guint channels = GST_AUDIO_FILTER (self)->format.channels; \ guint rate = GST_AUDIO_FILTER (self)->format.rate; \ guint i, j; \ guint echo_index = self->buffer_size_frames - self->delay_frames; \ gdouble echo_off = ((((gdouble) self->delay) * rate) / GST_SECOND) - self->delay_frames; \ \ if (echo_off < 0.0) \ echo_off = 0.0; \ \ num_samples /= channels; \ \ for (i = 0; i < num_samples; i++) { \ guint echo0_index = ((echo_index + self->buffer_pos) % self->buffer_size_frames) * channels; \ guint echo1_index = ((echo_index + self->buffer_pos +1) % self->buffer_size_frames) * channels; \ guint rbout_index = (self->buffer_pos % self->buffer_size_frames) * channels; \ for (j = 0; j < channels; j++) { \ gdouble in = data[i*channels + j]; \ gdouble echo0 = buffer[echo0_index + j]; \ gdouble echo1 = buffer[echo1_index + j]; \ gdouble echo = echo0 + (echo1-echo0)*echo_off; \ type out = in + self->intensity * echo; \ \ data[i*channels + j] = out; \ \ buffer[rbout_index + j] = in + self->feedback * echo; \ } \ self->buffer_pos = (self->buffer_pos + 1) % self->buffer_size_frames; \ } \ } TRANSFORM_FUNC (float, gfloat); TRANSFORM_FUNC (double, gdouble); /* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_echo_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioEcho *self = GST_AUDIO_ECHO (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (self, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (self), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (self)->format.width / 8); if (self->buffer == NULL) { guint width, rate, channels; width = GST_AUDIO_FILTER (self)->format.width / 8; rate = GST_AUDIO_FILTER (self)->format.rate; channels = GST_AUDIO_FILTER (self)->format.channels; self->delay_frames = MAX (gst_util_uint64_scale (self->delay, rate, GST_SECOND), 1); self->buffer_size_frames = MAX (gst_util_uint64_scale (self->max_delay, rate, GST_SECOND), 1); self->buffer_size = self->buffer_size_frames * width * channels; self->buffer = g_try_malloc0 (self->buffer_size); self->buffer_pos = 0; if (self->buffer == NULL) { GST_ERROR_OBJECT (self, "Failed to allocate %u bytes", self->buffer_size); return GST_FLOW_ERROR; } } self->process (self, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/audiofx/audioiirfilter.h0000644000175000017500000000407311671175353017434 00000000000000/* * GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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_AUDIO_IIR_FILTER_H__ #define __GST_AUDIO_IIR_FILTER_H__ #include #include #include "audiofxbaseiirfilter.h" G_BEGIN_DECLS #define GST_TYPE_AUDIO_IIR_FILTER \ (gst_audio_iir_filter_get_type()) #define GST_AUDIO_IIR_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_IIR_FILTER,GstAudioIIRFilter)) #define GST_AUDIO_IIR_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_IIR_FILTER,GstAudioIIRFilterClass)) #define GST_IS_AUDIO_IIR_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_IIR_FILTER)) #define GST_IS_AUDIO_IIR_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_IIR_FILTER)) typedef struct _GstAudioIIRFilter GstAudioIIRFilter; typedef struct _GstAudioIIRFilterClass GstAudioIIRFilterClass; /** * GstAudioIIRFilter: * * Opaque data structure. */ struct _GstAudioIIRFilter { GstAudioFXBaseIIRFilter parent; GValueArray *a, *b; /* < private > */ GMutex *lock; gint rate; }; struct _GstAudioIIRFilterClass { GstAudioFXBaseIIRFilterClass parent; void (*rate_changed) (GstElement * element, gint rate); }; GType gst_audio_iir_filter_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_IIR_FILTER_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiochebband.c0000644000175000017500000005251511677341654017175 00000000000000/* * GStreamer * Copyright (C) 2007-2009 Sebastian Dröge * * 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. */ /* * Chebyshev type 1 filter design based on * "The Scientist and Engineer's Guide to DSP", Chapter 20. * http://www.dspguide.com/ * * For type 2 and Chebyshev filters in general read * http://en.wikipedia.org/wiki/Chebyshev_filter * * Transformation from lowpass to bandpass/bandreject: * http://docs.dewresearch.com/DspHelp/html/IDH_LinearSystems_LowpassToBandPassZ.htm * http://docs.dewresearch.com/DspHelp/html/IDH_LinearSystems_LowpassToBandStopZ.htm * */ /** * SECTION:element-audiochebband * * Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency * band. The number of poles and the ripple parameter control the rolloff. * * This element has the advantage over the windowed sinc bandpass and bandreject filter that it is * much faster and produces almost as good results. It's only disadvantages are the highly * non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel. * * For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. * some frequencies in the passband will be amplified by that value. A higher ripple value will allow * a faster rolloff. * * For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will * be at most this value. A lower ripple value will allow a faster rolloff. * * As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter. * * * Be warned that a too large number of poles can produce noise. The most poles are possible with * a cutoff frequency at a quarter of the sampling rate. * * * * Example launch line * |[ * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequenc=6000 poles=4 ! audioconvert ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiochebband mode=band-reject lower-frequency=1000 upper-frequency=4000 ripple=0.2 ! audioconvert ! alsasink * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiochebband mode=band-pass lower-frequency=1000 upper-frequency=4000 type=2 ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include "math_compat.h" #include "audiochebband.h" #include "gst/glib-compat-private.h" #define GST_CAT_DEFAULT gst_audio_cheb_band_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { PROP_0, PROP_MODE, PROP_TYPE, PROP_LOWER_FREQUENCY, PROP_UPPER_FREQUENCY, PROP_RIPPLE, PROP_POLES }; #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_cheb_band_debug, "audiochebband", 0, "audiochebband element"); GST_BOILERPLATE_FULL (GstAudioChebBand, gst_audio_cheb_band, GstAudioFXBaseIIRFilter, GST_TYPE_AUDIO_FX_BASE_IIR_FILTER, DEBUG_INIT); static void gst_audio_cheb_band_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_cheb_band_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_cheb_band_finalize (GObject * object); static gboolean gst_audio_cheb_band_setup (GstAudioFilter * filter, GstRingBufferSpec * format); enum { MODE_BAND_PASS = 0, MODE_BAND_REJECT }; #define GST_TYPE_AUDIO_CHEBYSHEV_FREQ_BAND_MODE (gst_audio_cheb_band_mode_get_type ()) static GType gst_audio_cheb_band_mode_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {MODE_BAND_PASS, "Band pass (default)", "band-pass"}, {MODE_BAND_REJECT, "Band reject", "band-reject"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioChebBandMode", values); } return gtype; } /* GObject vmethod implementations */ static void gst_audio_cheb_band_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (element_class, "Band pass & band reject filter", "Filter/Effect/Audio", "Chebyshev band pass and band reject filter", "Sebastian Dröge "); } static void gst_audio_cheb_band_class_init (GstAudioChebBandClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_cheb_band_set_property; gobject_class->get_property = gst_audio_cheb_band_get_property; gobject_class->finalize = gst_audio_cheb_band_finalize; g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Low pass or high pass mode", GST_TYPE_AUDIO_CHEBYSHEV_FREQ_BAND_MODE, MODE_BAND_PASS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TYPE, g_param_spec_int ("type", "Type", "Type of the chebychev filter", 1, 2, 1, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); /* FIXME: Don't use the complete possible range but restrict the upper boundary * so automatically generated UIs can use a slider without */ g_object_class_install_property (gobject_class, PROP_LOWER_FREQUENCY, g_param_spec_float ("lower-frequency", "Lower frequency", "Start frequency of the band (Hz)", 0.0, 100000.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_UPPER_FREQUENCY, g_param_spec_float ("upper-frequency", "Upper frequency", "Stop frequency of the band (Hz)", 0.0, 100000.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RIPPLE, g_param_spec_float ("ripple", "Ripple", "Amount of ripple (dB)", 0.0, 200.0, 0.25, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); /* FIXME: What to do about this upper boundary? With a frequencies near * rate/4 32 poles are completely possible, with frequencies very low * or very high 16 poles already produces only noise */ g_object_class_install_property (gobject_class, PROP_POLES, g_param_spec_int ("poles", "Poles", "Number of poles to use, will be rounded up to the next multiply of four", 4, 32, 4, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_cheb_band_setup); } static void gst_audio_cheb_band_init (GstAudioChebBand * filter, GstAudioChebBandClass * klass) { filter->lower_frequency = filter->upper_frequency = 0.0; filter->mode = MODE_BAND_PASS; filter->type = 1; filter->poles = 4; filter->ripple = 0.25; filter->lock = g_mutex_new (); } static void generate_biquad_coefficients (GstAudioChebBand * filter, gint p, gdouble * a0, gdouble * a1, gdouble * a2, gdouble * a3, gdouble * a4, gdouble * b1, gdouble * b2, gdouble * b3, gdouble * b4) { gint np = filter->poles / 2; gdouble ripple = filter->ripple; /* pole location in s-plane */ gdouble rp, ip; /* zero location in s-plane */ gdouble iz = 0.0; /* transfer function coefficients for the z-plane */ gdouble x0, x1, x2, y1, y2; gint type = filter->type; /* Calculate pole location for lowpass at frequency 1 */ { gdouble angle = (G_PI / 2.0) * (2.0 * p - 1) / np; rp = -sin (angle); ip = cos (angle); } /* If we allow ripple, move the pole from the unit * circle to an ellipse and keep cutoff at frequency 1 */ if (ripple > 0 && type == 1) { gdouble es, vx; es = sqrt (pow (10.0, ripple / 10.0) - 1.0); vx = (1.0 / np) * asinh (1.0 / es); rp = rp * sinh (vx); ip = ip * cosh (vx); } else if (type == 2) { gdouble es, vx; es = sqrt (pow (10.0, ripple / 10.0) - 1.0); vx = (1.0 / np) * asinh (es); rp = rp * sinh (vx); ip = ip * cosh (vx); } /* Calculate inverse of the pole location to move from * type I to type II */ if (type == 2) { gdouble mag2 = rp * rp + ip * ip; rp /= mag2; ip /= mag2; } /* Calculate zero location for frequency 1 on the * unit circle for type 2 */ if (type == 2) { gdouble angle = G_PI / (np * 2.0) + ((p - 1) * G_PI) / (np); gdouble mag2; iz = cos (angle); mag2 = iz * iz; iz /= mag2; } /* Convert from s-domain to z-domain by * using the bilinear Z-transform, i.e. * substitute s by (2/t)*((z-1)/(z+1)) * with t = 2 * tan(0.5). */ if (type == 1) { gdouble t, m, d; t = 2.0 * tan (0.5); m = rp * rp + ip * ip; d = 4.0 - 4.0 * rp * t + m * t * t; x0 = (t * t) / d; x1 = 2.0 * x0; x2 = x0; y1 = (8.0 - 2.0 * m * t * t) / d; y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; } else { gdouble t, m, d; t = 2.0 * tan (0.5); m = rp * rp + ip * ip; d = 4.0 - 4.0 * rp * t + m * t * t; x0 = (t * t * iz * iz + 4.0) / d; x1 = (-8.0 + 2.0 * iz * iz * t * t) / d; x2 = x0; y1 = (8.0 - 2.0 * m * t * t) / d; y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; } /* Convert from lowpass at frequency 1 to either bandpass * or band reject. * * For bandpass substitute z^(-1) with: * * -2 -1 * -z + alpha * z - beta * ---------------------------- * -2 -1 * beta * z - alpha * z + 1 * * alpha = (2*a*b)/(1+b) * beta = (b-1)/(b+1) * a = cos((w1 + w0)/2) / cos((w1 - w0)/2) * b = tan(1/2) * cot((w1 - w0)/2) * * For bandreject substitute z^(-1) with: * * -2 -1 * z - alpha * z + beta * ---------------------------- * -2 -1 * beta * z - alpha * z + 1 * * alpha = (2*a)/(1+b) * beta = (1-b)/(1+b) * a = cos((w1 + w0)/2) / cos((w1 - w0)/2) * b = tan(1/2) * tan((w1 - w0)/2) * */ { gdouble a, b, d; gdouble alpha, beta; gdouble w0 = 2.0 * G_PI * (filter->lower_frequency / GST_AUDIO_FILTER (filter)->format.rate); gdouble w1 = 2.0 * G_PI * (filter->upper_frequency / GST_AUDIO_FILTER (filter)->format.rate); if (filter->mode == MODE_BAND_PASS) { a = cos ((w1 + w0) / 2.0) / cos ((w1 - w0) / 2.0); b = tan (1.0 / 2.0) / tan ((w1 - w0) / 2.0); alpha = (2.0 * a * b) / (1.0 + b); beta = (b - 1.0) / (b + 1.0); d = 1.0 + beta * (y1 - beta * y2); *a0 = (x0 + beta * (-x1 + beta * x2)) / d; *a1 = (alpha * (-2.0 * x0 + x1 + beta * x1 - 2.0 * beta * x2)) / d; *a2 = (-x1 - beta * beta * x1 + 2.0 * beta * (x0 + x2) + alpha * alpha * (x0 - x1 + x2)) / d; *a3 = (alpha * (x1 + beta * (-2.0 * x0 + x1) - 2.0 * x2)) / d; *a4 = (beta * (beta * x0 - x1) + x2) / d; *b1 = (alpha * (2.0 + y1 + beta * y1 - 2.0 * beta * y2)) / d; *b2 = (-y1 - beta * beta * y1 - alpha * alpha * (1.0 + y1 - y2) + 2.0 * beta * (-1.0 + y2)) / d; *b3 = (alpha * (y1 + beta * (2.0 + y1) - 2.0 * y2)) / d; *b4 = (-beta * beta - beta * y1 + y2) / d; } else { a = cos ((w1 + w0) / 2.0) / cos ((w1 - w0) / 2.0); b = tan (1.0 / 2.0) * tan ((w1 - w0) / 2.0); alpha = (2.0 * a) / (1.0 + b); beta = (1.0 - b) / (1.0 + b); d = -1.0 + beta * (beta * y2 + y1); *a0 = (-x0 - beta * x1 - beta * beta * x2) / d; *a1 = (alpha * (2.0 * x0 + x1 + beta * x1 + 2.0 * beta * x2)) / d; *a2 = (-x1 - beta * beta * x1 - 2.0 * beta * (x0 + x2) - alpha * alpha * (x0 + x1 + x2)) / d; *a3 = (alpha * (x1 + beta * (2.0 * x0 + x1) + 2.0 * x2)) / d; *a4 = (-beta * beta * x0 - beta * x1 - x2) / d; *b1 = (alpha * (-2.0 + y1 + beta * y1 + 2.0 * beta * y2)) / d; *b2 = -(y1 + beta * beta * y1 + 2.0 * beta * (-1.0 + y2) + alpha * alpha * (-1.0 + y1 + y2)) / d; *b3 = (alpha * (beta * (-2.0 + y1) + y1 + 2.0 * y2)) / d; *b4 = -(-beta * beta + beta * y1 + y2) / d; } } } static void generate_coefficients (GstAudioChebBand * filter) { if (GST_AUDIO_FILTER (filter)->format.rate == 0) { gdouble *a = g_new0 (gdouble, 1); a[0] = 1.0; gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, 1, NULL, 0); GST_LOG_OBJECT (filter, "rate was not set yet"); return; } if (filter->upper_frequency <= filter->lower_frequency) { gdouble *a = g_new0 (gdouble, 1); a[0] = (filter->mode == MODE_BAND_PASS) ? 0.0 : 1.0; gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, 1, NULL, 0); GST_LOG_OBJECT (filter, "frequency band had no or negative dimension"); return; } if (filter->upper_frequency > GST_AUDIO_FILTER (filter)->format.rate / 2) { filter->upper_frequency = GST_AUDIO_FILTER (filter)->format.rate / 2; GST_LOG_OBJECT (filter, "clipped upper frequency to nyquist frequency"); } if (filter->lower_frequency < 0.0) { filter->lower_frequency = 0.0; GST_LOG_OBJECT (filter, "clipped lower frequency to 0.0"); } /* Calculate coefficients for the chebyshev filter */ { gint np = filter->poles; gdouble *a, *b; gint i, p; a = g_new0 (gdouble, np + 5); b = g_new0 (gdouble, np + 5); /* Calculate transfer function coefficients */ a[4] = 1.0; b[4] = 1.0; for (p = 1; p <= np / 4; p++) { gdouble a0, a1, a2, a3, a4, b1, b2, b3, b4; gdouble *ta = g_new0 (gdouble, np + 5); gdouble *tb = g_new0 (gdouble, np + 5); generate_biquad_coefficients (filter, p, &a0, &a1, &a2, &a3, &a4, &b1, &b2, &b3, &b4); memcpy (ta, a, sizeof (gdouble) * (np + 5)); memcpy (tb, b, sizeof (gdouble) * (np + 5)); /* add the new coefficients for the new two poles * to the cascade by multiplication of the transfer * functions */ for (i = 4; i < np + 5; i++) { a[i] = a0 * ta[i] + a1 * ta[i - 1] + a2 * ta[i - 2] + a3 * ta[i - 3] + a4 * ta[i - 4]; b[i] = tb[i] - b1 * tb[i - 1] - b2 * tb[i - 2] - b3 * tb[i - 3] - b4 * tb[i - 4]; } g_free (ta); g_free (tb); } /* Move coefficients to the beginning of the array * and multiply the b coefficients with -1 to move from * the transfer function's coefficients to the difference * equation's coefficients */ b[4] = 0.0; for (i = 0; i <= np; i++) { a[i] = a[i + 4]; b[i] = -b[i + 4]; } /* Normalize to unity gain at frequency 0 and frequency * 0.5 for bandreject and unity gain at band center frequency * for bandpass */ if (filter->mode == MODE_BAND_REJECT) { /* gain is sqrt(H(0)*H(0.5)) */ gdouble gain1 = gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, 1.0, 0.0); gdouble gain2 = gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, -1.0, 0.0); gain1 = sqrt (gain1 * gain2); for (i = 0; i <= np; i++) { a[i] /= gain1; } } else { /* gain is H(wc), wc = center frequency */ gdouble w1 = 2.0 * G_PI * (filter->lower_frequency / GST_AUDIO_FILTER (filter)->format.rate); gdouble w2 = 2.0 * G_PI * (filter->upper_frequency / GST_AUDIO_FILTER (filter)->format.rate); gdouble w0 = (w2 + w1) / 2.0; gdouble zr = cos (w0), zi = sin (w0); gdouble gain = gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, zr, zi); for (i = 0; i <= np; i++) { a[i] /= gain; } } gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, np + 1, b, np + 1); GST_LOG_OBJECT (filter, "Generated IIR coefficients for the Chebyshev filter"); GST_LOG_OBJECT (filter, "mode: %s, type: %d, poles: %d, lower-frequency: %.2f Hz, upper-frequency: %.2f Hz, ripple: %.2f dB", (filter->mode == MODE_BAND_PASS) ? "band-pass" : "band-reject", filter->type, filter->poles, filter->lower_frequency, filter->upper_frequency, filter->ripple); GST_LOG_OBJECT (filter, "%.2f dB gain @ 0Hz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, 1.0, 0.0))); { gdouble w1 = 2.0 * G_PI * (filter->lower_frequency / GST_AUDIO_FILTER (filter)->format.rate); gdouble w2 = 2.0 * G_PI * (filter->upper_frequency / GST_AUDIO_FILTER (filter)->format.rate); gdouble w0 = (w2 + w1) / 2.0; gdouble zr, zi; zr = cos (w1); zi = sin (w1); GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, zr, zi)), (int) filter->lower_frequency); zr = cos (w0); zi = sin (w0); GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, zr, zi)), (int) ((filter->lower_frequency + filter->upper_frequency) / 2.0)); zr = cos (w2); zi = sin (w2); GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, zr, zi)), (int) filter->upper_frequency); } GST_LOG_OBJECT (filter, "%.2f dB gain @ %dHz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, -1.0, 0.0)), GST_AUDIO_FILTER (filter)->format.rate / 2); } } static void gst_audio_cheb_band_finalize (GObject * object) { GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (object); g_mutex_free (filter->lock); filter->lock = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_cheb_band_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (object); switch (prop_id) { case PROP_MODE: g_mutex_lock (filter->lock); filter->mode = g_value_get_enum (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_TYPE: g_mutex_lock (filter->lock); filter->type = g_value_get_int (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_LOWER_FREQUENCY: g_mutex_lock (filter->lock); filter->lower_frequency = g_value_get_float (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_UPPER_FREQUENCY: g_mutex_lock (filter->lock); filter->upper_frequency = g_value_get_float (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_RIPPLE: g_mutex_lock (filter->lock); filter->ripple = g_value_get_float (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_POLES: g_mutex_lock (filter->lock); filter->poles = GST_ROUND_UP_4 (g_value_get_int (value)); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_cheb_band_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, filter->mode); break; case PROP_TYPE: g_value_set_int (value, filter->type); break; case PROP_LOWER_FREQUENCY: g_value_set_float (value, filter->lower_frequency); break; case PROP_UPPER_FREQUENCY: g_value_set_float (value, filter->upper_frequency); break; case PROP_RIPPLE: g_value_set_float (value, filter->ripple); break; case PROP_POLES: g_value_set_int (value, filter->poles); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_cheb_band_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioChebBand *filter = GST_AUDIO_CHEB_BAND (base); generate_coefficients (filter); return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); } gst-plugins-good-0.10.31/gst/audiofx/audiofirfilter.c0000644000175000017500000002024411677341654017427 00000000000000/* * GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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-audiofirfilter * * audiofirfilter implements a generic audio FIR filter. Before usage the * "kernel" property has to be set to the filter kernel that should be * used and the "latency" property has to be set to the latency (in samples) * that is introduced by the filter kernel. Setting a latency of n samples * will lead to the first n samples being dropped from the output and * n samples added to the end. * * The filter kernel describes the impulse response of the filter. To * calculate the frequency response of the filter you have to calculate * the Fourier Transform of the impulse response. * * To change the filter kernel whenever the sampling rate changes the * "rate-changed" signal can be used. This should be done for most * FIR filters as they're depending on the sampling rate. * * * Example application * |[ * * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audiofirfilter.h" #include "gst/glib-compat-private.h" #define GST_CAT_DEFAULT gst_audio_fir_filter_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { SIGNAL_RATE_CHANGED, LAST_SIGNAL }; enum { PROP_0, PROP_KERNEL, PROP_LATENCY }; static guint gst_audio_fir_filter_signals[LAST_SIGNAL] = { 0, }; #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_fir_filter_debug, "audiofirfilter", 0, \ "Generic audio FIR filter plugin"); GST_BOILERPLATE_FULL (GstAudioFIRFilter, gst_audio_fir_filter, GstAudioFilter, GST_TYPE_AUDIO_FX_BASE_FIR_FILTER, DEBUG_INIT); static void gst_audio_fir_filter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_fir_filter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_fir_filter_finalize (GObject * object); static gboolean gst_audio_fir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format); /* Element class */ static void gst_audio_fir_filter_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Audio FIR filter", "Filter/Effect/Audio", "Generic audio FIR filter with custom filter kernel", "Sebastian Dröge "); } static void gst_audio_fir_filter_class_init (GstAudioFIRFilterClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_fir_filter_set_property; gobject_class->get_property = gst_audio_fir_filter_get_property; gobject_class->finalize = gst_audio_fir_filter_finalize; g_object_class_install_property (gobject_class, PROP_KERNEL, g_param_spec_value_array ("kernel", "Filter Kernel", "Filter kernel for the FIR filter", g_param_spec_double ("Element", "Filter Kernel Element", "Element of the filter kernel", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_LATENCY, g_param_spec_uint64 ("latency", "Latecy", "Filter latency in samples", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_fir_filter_setup); /** * GstAudioFIRFilter::rate-changed: * @filter: the filter on which the signal is emitted * @rate: the new sampling rate * * Will be emitted when the sampling rate changes. The callbacks * will be called from the streaming thread and processing will * stop until the event is handled. */ gst_audio_fir_filter_signals[SIGNAL_RATE_CHANGED] = g_signal_new ("rate-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAudioFIRFilterClass, rate_changed), NULL, NULL, gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); } static void gst_audio_fir_filter_update_kernel (GstAudioFIRFilter * self, GValueArray * va) { gdouble *kernel; guint i; if (va) { if (self->kernel) g_value_array_free (self->kernel); self->kernel = va; } kernel = g_new (gdouble, self->kernel->n_values); for (i = 0; i < self->kernel->n_values; i++) { GValue *v = g_value_array_get_nth (self->kernel, i); kernel[i] = g_value_get_double (v); } gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self), kernel, self->kernel->n_values, self->latency); } static void gst_audio_fir_filter_init (GstAudioFIRFilter * self, GstAudioFIRFilterClass * g_class) { GValue v = { 0, }; GValueArray *va; self->latency = 0; va = g_value_array_new (1); g_value_init (&v, G_TYPE_DOUBLE); g_value_set_double (&v, 1.0); g_value_array_append (va, &v); g_value_unset (&v); gst_audio_fir_filter_update_kernel (self, va); self->lock = g_mutex_new (); } /* GstAudioFilter vmethod implementations */ /* get notified of caps and plug in the correct process function */ static gboolean gst_audio_fir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (base); if (self->rate != format->rate) { g_signal_emit (G_OBJECT (self), gst_audio_fir_filter_signals[SIGNAL_RATE_CHANGED], 0, format->rate); self->rate = format->rate; } return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); } static void gst_audio_fir_filter_finalize (GObject * object) { GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (object); g_mutex_free (self->lock); self->lock = NULL; if (self->kernel) g_value_array_free (self->kernel); self->kernel = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_fir_filter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (object); g_return_if_fail (GST_IS_AUDIO_FIR_FILTER (self)); switch (prop_id) { case PROP_KERNEL: g_mutex_lock (self->lock); /* update kernel already pushes residues */ gst_audio_fir_filter_update_kernel (self, g_value_dup_boxed (value)); g_mutex_unlock (self->lock); break; case PROP_LATENCY: g_mutex_lock (self->lock); self->latency = g_value_get_uint64 (value); gst_audio_fir_filter_update_kernel (self, NULL); g_mutex_unlock (self->lock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_fir_filter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioFIRFilter *self = GST_AUDIO_FIR_FILTER (object); switch (prop_id) { case PROP_KERNEL: g_value_set_boxed (value, self->kernel); break; case PROP_LATENCY: g_value_set_uint64 (value, self->latency); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/audiofx/audioamplify.c0000644000175000017500000005447611671175353017113 00000000000000/* * GStreamer * Copyright (C) 2007 Sebastian Dröge * Copyright (C) 2006 Stefan Kost * * 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-audioamplify * * Amplifies an audio stream by a given factor and allows the selection of different clipping modes. * The difference between the clipping modes is best evaluated by testing. * * * Example launch line * |[ * gst-launch audiotestsrc wave=saw ! audioamplify amplification=1.5 ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioamplify amplification=1.5 method=wrap-negative ! alsasink * gst-launch audiotestsrc wave=saw ! audioconvert ! audioamplify amplification=1.5 method=wrap-positive ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audioamplify.h" #define GST_CAT_DEFAULT gst_audio_amplify_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_AMPLIFICATION, PROP_CLIPPING_METHOD }; enum { METHOD_CLIP = 0, METHOD_WRAP_NEGATIVE, METHOD_WRAP_POSITIVE, METHOD_NOCLIP, NUM_METHODS }; #define GST_TYPE_AUDIO_AMPLIFY_CLIPPING_METHOD (gst_audio_amplify_clipping_method_get_type ()) static GType gst_audio_amplify_clipping_method_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {METHOD_CLIP, "Normal clipping (default)", "clip"}, {METHOD_WRAP_NEGATIVE, "Push overdriven values back from the opposite side", "wrap-negative"}, {METHOD_WRAP_POSITIVE, "Push overdriven values back from the same side", "wrap-positive"}, {METHOD_NOCLIP, "No clipping", "none"}, {0, NULL, NULL} }; /* FIXME 0.11: rename to GstAudioAmplifyClippingMethod */ gtype = g_enum_register_static ("GstAudioPanoramaClippingMethod", values); } return gtype; } #define ALLOWED_CAPS \ "audio/x-raw-int," \ " depth=(int)8," \ " width=(int)8," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-int," \ " depth=(int)16," \ " width=(int)16," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-int," \ " depth=(int)32," \ " width=(int)32," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-float," \ " width=(int){32,64}," \ " endianness=(int)BYTE_ORDER," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_amplify_debug, "audioamplify", 0, "audioamplify element"); GST_BOILERPLATE_FULL (GstAudioAmplify, gst_audio_amplify, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static gboolean gst_audio_amplify_set_process_function (GstAudioAmplify * filter, gint clipping, gint format, gint width); static void gst_audio_amplify_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_amplify_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_audio_amplify_setup (GstAudioFilter * filter, GstRingBufferSpec * format); static GstFlowReturn gst_audio_amplify_transform_ip (GstBaseTransform * base, GstBuffer * buf); #define MIN_gint8 G_MININT8 #define MAX_gint8 G_MAXINT8 #define MIN_gint16 G_MININT16 #define MAX_gint16 G_MAXINT16 #define MIN_gint32 G_MININT32 #define MAX_gint32 G_MAXINT32 #define MAKE_INT_FUNCS(type,largetype) \ static void \ gst_audio_amplify_transform_##type##_clip (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) { \ largetype val = *d * filter->amplification; \ *d++ = CLAMP (val, MIN_##type, MAX_##type); \ } \ } \ static void \ gst_audio_amplify_transform_##type##_wrap_negative (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) { \ largetype val = *d * filter->amplification; \ if (val > MAX_##type) \ val = MIN_##type + (val - MIN_##type) % ((largetype) MAX_##type + 1 - \ MIN_##type); \ else if (val < MIN_##type) \ val = MAX_##type - (MAX_##type - val) % ((largetype) MAX_##type + 1 - \ MIN_##type); \ *d++ = val; \ } \ } \ static void \ gst_audio_amplify_transform_##type##_wrap_positive (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) { \ largetype val = *d * filter->amplification; \ do { \ if (val > MAX_##type) \ val = MAX_##type - (val - MAX_##type); \ else if (val < MIN_##type) \ val = MIN_##type + (MIN_##type - val); \ else \ break; \ } while (1); \ *d++ = val; \ } \ } \ static void \ gst_audio_amplify_transform_##type##_noclip (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) \ *d++ *= filter->amplification; \ } #define MAKE_FLOAT_FUNCS(type) \ static void \ gst_audio_amplify_transform_##type##_clip (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) { \ type val = *d* filter->amplification; \ *d++ = CLAMP (val, -1.0, +1.0); \ } \ } \ static void \ gst_audio_amplify_transform_##type##_wrap_negative (GstAudioAmplify * \ filter, void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) { \ type val = *d * filter->amplification; \ do { \ if (val > 1.0) \ val = -1.0 + (val - 1.0); \ else if (val < -1.0) \ val = 1.0 - (1.0 - val); \ else \ break; \ } while (1); \ *d++ = val; \ } \ } \ static void \ gst_audio_amplify_transform_##type##_wrap_positive (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) { \ type val = *d* filter->amplification; \ do { \ if (val > 1.0) \ val = 1.0 - (val - 1.0); \ else if (val < -1.0) \ val = -1.0 + (-1.0 - val); \ else \ break; \ } while (1); \ *d++ = val; \ } \ } \ static void \ gst_audio_amplify_transform_##type##_noclip (GstAudioAmplify * filter, \ void * data, guint num_samples) \ { \ type *d = data; \ \ while (num_samples--) \ *d++ *= filter->amplification; \ } /* *INDENT-OFF* */ MAKE_INT_FUNCS (gint8,gint) MAKE_INT_FUNCS (gint16,gint) MAKE_INT_FUNCS (gint32,gint64) MAKE_FLOAT_FUNCS (gfloat) MAKE_FLOAT_FUNCS (gdouble) /* *INDENT-ON* */ /* GObject vmethod implementations */ static void gst_audio_amplify_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstCaps *caps; gst_element_class_set_details_simple (element_class, "Audio amplifier", "Filter/Effect/Audio", "Amplifies an audio stream by a given factor", "Sebastian Dröge "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), caps); gst_caps_unref (caps); } static void gst_audio_amplify_class_init (GstAudioAmplifyClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_audio_amplify_set_property; gobject_class->get_property = gst_audio_amplify_get_property; g_object_class_install_property (gobject_class, PROP_AMPLIFICATION, g_param_spec_float ("amplification", "Amplification", "Factor of amplification", -G_MAXFLOAT, G_MAXFLOAT, 1.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); /** * GstAudioAmplify:clipping-method * * Clipping method: clip mode set values higher than the maximum to the * maximum. The wrap-negative mode pushes those values back from the * opposite side, wrap-positive pushes them back from the same side. * **/ g_object_class_install_property (gobject_class, PROP_CLIPPING_METHOD, g_param_spec_enum ("clipping-method", "Clipping method", "Selects how to handle values higher than the maximum", GST_TYPE_AUDIO_AMPLIFY_CLIPPING_METHOD, METHOD_CLIP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_AUDIO_FILTER_CLASS (klass)->setup = GST_DEBUG_FUNCPTR (gst_audio_amplify_setup); GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = GST_DEBUG_FUNCPTR (gst_audio_amplify_transform_ip); } static void gst_audio_amplify_init (GstAudioAmplify * filter, GstAudioAmplifyClass * klass) { filter->amplification = 1.0; gst_audio_amplify_set_process_function (filter, METHOD_CLIP, GST_BUFTYPE_LINEAR, 16); gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); } static GstAudioAmplifyProcessFunc gst_audio_amplify_process_function (gint clipping, gint format, gint width) { static const struct process { gint format; gint width; gint clipping; GstAudioAmplifyProcessFunc func; } process[] = { { GST_BUFTYPE_FLOAT, 32, METHOD_CLIP, gst_audio_amplify_transform_gfloat_clip}, { GST_BUFTYPE_FLOAT, 32, METHOD_WRAP_NEGATIVE, gst_audio_amplify_transform_gfloat_wrap_negative}, { GST_BUFTYPE_FLOAT, 32, METHOD_WRAP_POSITIVE, gst_audio_amplify_transform_gfloat_wrap_positive}, { GST_BUFTYPE_FLOAT, 32, METHOD_NOCLIP, gst_audio_amplify_transform_gfloat_noclip}, { GST_BUFTYPE_FLOAT, 64, METHOD_CLIP, gst_audio_amplify_transform_gdouble_clip}, { GST_BUFTYPE_FLOAT, 64, METHOD_WRAP_NEGATIVE, gst_audio_amplify_transform_gdouble_wrap_negative}, { GST_BUFTYPE_FLOAT, 64, METHOD_WRAP_POSITIVE, gst_audio_amplify_transform_gdouble_wrap_positive}, { GST_BUFTYPE_FLOAT, 64, METHOD_NOCLIP, gst_audio_amplify_transform_gdouble_noclip}, { GST_BUFTYPE_LINEAR, 8, METHOD_CLIP, gst_audio_amplify_transform_gint8_clip}, { GST_BUFTYPE_LINEAR, 8, METHOD_WRAP_NEGATIVE, gst_audio_amplify_transform_gint8_wrap_negative}, { GST_BUFTYPE_LINEAR, 8, METHOD_WRAP_POSITIVE, gst_audio_amplify_transform_gint8_wrap_positive}, { GST_BUFTYPE_LINEAR, 8, METHOD_NOCLIP, gst_audio_amplify_transform_gint8_noclip}, { GST_BUFTYPE_LINEAR, 16, METHOD_CLIP, gst_audio_amplify_transform_gint16_clip}, { GST_BUFTYPE_LINEAR, 16, METHOD_WRAP_NEGATIVE, gst_audio_amplify_transform_gint16_wrap_negative}, { GST_BUFTYPE_LINEAR, 16, METHOD_WRAP_POSITIVE, gst_audio_amplify_transform_gint16_wrap_positive}, { GST_BUFTYPE_LINEAR, 16, METHOD_NOCLIP, gst_audio_amplify_transform_gint16_noclip}, { GST_BUFTYPE_LINEAR, 32, METHOD_CLIP, gst_audio_amplify_transform_gint32_clip}, { GST_BUFTYPE_LINEAR, 32, METHOD_WRAP_NEGATIVE, gst_audio_amplify_transform_gint32_wrap_negative}, { GST_BUFTYPE_LINEAR, 32, METHOD_WRAP_POSITIVE, gst_audio_amplify_transform_gint32_wrap_positive}, { GST_BUFTYPE_LINEAR, 32, METHOD_NOCLIP, gst_audio_amplify_transform_gint32_noclip}, { 0, 0, 0, NULL} }; const struct process *p; for (p = process; p->func; p++) if (p->format == format && p->width == width && p->clipping == clipping) return p->func; return NULL; } static gboolean gst_audio_amplify_set_process_function (GstAudioAmplify * filter, gint clipping_method, gint format, gint width) { GstAudioAmplifyProcessFunc process; /* set processing function */ process = gst_audio_amplify_process_function (clipping_method, format, width); if (!process) { GST_DEBUG ("wrong format"); return FALSE; } filter->process = process; filter->clipping_method = clipping_method; filter->format = format; filter->width = width; return TRUE; } static void gst_audio_amplify_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (object); switch (prop_id) { case PROP_AMPLIFICATION: filter->amplification = g_value_get_float (value); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), filter->amplification == 1.0); break; case PROP_CLIPPING_METHOD: gst_audio_amplify_set_process_function (filter, g_value_get_enum (value), filter->format, filter->width); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_amplify_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (object); switch (prop_id) { case PROP_AMPLIFICATION: g_value_set_float (value, filter->amplification); break; case PROP_CLIPPING_METHOD: g_value_set_enum (value, filter->clipping_method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_amplify_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (base); return gst_audio_amplify_set_process_function (filter, filter->clipping_method, format->type, format->width); } /* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_amplify_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioAmplify *filter = GST_AUDIO_AMPLIFY (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); if (gst_base_transform_is_passthrough (base) || G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) return GST_FLOW_OK; filter->process (filter, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/audiofx/audiodynamic.h0000644000175000017500000000427211671175353017070 00000000000000/* * GStreamer * Copyright (C) 2007 Sebastian Dröge * * 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_AUDIO_DYNAMIC_H__ #define __GST_AUDIO_DYNAMIC_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_DYNAMIC (gst_audio_dynamic_get_type()) #define GST_AUDIO_DYNAMIC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_DYNAMIC,GstAudioDynamic)) #define GST_IS_AUDIO_DYNAMIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_DYNAMIC)) #define GST_AUDIO_DYNAMIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_DYNAMIC,GstAudioDynamicClass)) #define GST_IS_AUDIO_DYNAMIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_DYNAMIC)) #define GST_AUDIO_DYNAMIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_DYNAMIC,GstAudioDynamicClass)) typedef struct _GstAudioDynamic GstAudioDynamic; typedef struct _GstAudioDynamicClass GstAudioDynamicClass; typedef void (*GstAudioDynamicProcessFunc) (GstAudioDynamic *, guint8 *, guint); struct _GstAudioDynamic { GstAudioFilter audiofilter; gfloat degree; /* < private > */ GstAudioDynamicProcessFunc process; gint characteristics; gint mode; gfloat threshold; gfloat ratio; }; struct _GstAudioDynamicClass { GstAudioFilterClass parent; }; GType gst_audio_dynamic_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_DYNAMIC_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiocheblimit.c0000644000175000017500000004165211677341654017407 00000000000000/* * GStreamer * Copyright (C) 2007-2009 Sebastian Dröge * * 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. */ /* * Chebyshev type 1 filter design based on * "The Scientist and Engineer's Guide to DSP", Chapter 20. * http://www.dspguide.com/ * * For type 2 and Chebyshev filters in general read * http://en.wikipedia.org/wiki/Chebyshev_filter * */ /** * SECTION:element-audiocheblimit * * Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the * cutoff frequency (high-pass). The number of poles and the ripple parameter control the rolloff. * * This element has the advantage over the windowed sinc lowpass and highpass filter that it is * much faster and produces almost as good results. It's only disadvantages are the highly * non-linear phase and the slower rolloff compared to a windowed sinc filter with a large kernel. * * For type 1 the ripple parameter specifies how much ripple in dB is allowed in the passband, i.e. * some frequencies in the passband will be amplified by that value. A higher ripple value will allow * a faster rolloff. * * For type 2 the ripple parameter specifies the stopband attenuation. In the stopband the gain will * be at most this value. A lower ripple value will allow a faster rolloff. * * As a special case, a Chebyshev type 1 filter with no ripple is a Butterworth filter. * * * Be warned that a too large number of poles can produce noise. The most poles are possible with * a cutoff frequency at a quarter of the sampling rate. * * * * Example launch line * |[ * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiocheblimit mode=low-pass cutoff=1000 poles=4 ! audioconvert ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiocheblimit mode=high-pass cutoff=400 ripple=0.2 ! audioconvert ! alsasink * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiocheblimit mode=low-pass cutoff=800 type=2 ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include "math_compat.h" #include "audiocheblimit.h" #include "gst/glib-compat-private.h" #define GST_CAT_DEFAULT gst_audio_cheb_limit_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { PROP_0, PROP_MODE, PROP_TYPE, PROP_CUTOFF, PROP_RIPPLE, PROP_POLES }; #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_cheb_limit_debug, "audiocheblimit", 0, "audiocheblimit element"); GST_BOILERPLATE_FULL (GstAudioChebLimit, gst_audio_cheb_limit, GstAudioFXBaseIIRFilter, GST_TYPE_AUDIO_FX_BASE_IIR_FILTER, DEBUG_INIT); static void gst_audio_cheb_limit_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_cheb_limit_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_cheb_limit_finalize (GObject * object); static gboolean gst_audio_cheb_limit_setup (GstAudioFilter * filter, GstRingBufferSpec * format); enum { MODE_LOW_PASS = 0, MODE_HIGH_PASS }; #define GST_TYPE_AUDIO_CHEBYSHEV_FREQ_LIMIT_MODE (gst_audio_cheb_limit_mode_get_type ()) static GType gst_audio_cheb_limit_mode_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {MODE_LOW_PASS, "Low pass (default)", "low-pass"}, {MODE_HIGH_PASS, "High pass", "high-pass"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioChebLimitMode", values); } return gtype; } /* GObject vmethod implementations */ static void gst_audio_cheb_limit_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (element_class, "Low pass & high pass filter", "Filter/Effect/Audio", "Chebyshev low pass and high pass filter", "Sebastian Dröge "); } static void gst_audio_cheb_limit_class_init (GstAudioChebLimitClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_cheb_limit_set_property; gobject_class->get_property = gst_audio_cheb_limit_get_property; gobject_class->finalize = gst_audio_cheb_limit_finalize; g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Low pass or high pass mode", GST_TYPE_AUDIO_CHEBYSHEV_FREQ_LIMIT_MODE, MODE_LOW_PASS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TYPE, g_param_spec_int ("type", "Type", "Type of the chebychev filter", 1, 2, 1, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); /* FIXME: Don't use the complete possible range but restrict the upper boundary * so automatically generated UIs can use a slider without */ g_object_class_install_property (gobject_class, PROP_CUTOFF, g_param_spec_float ("cutoff", "Cutoff", "Cut off frequency (Hz)", 0.0, 100000.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RIPPLE, g_param_spec_float ("ripple", "Ripple", "Amount of ripple (dB)", 0.0, 200.0, 0.25, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); /* FIXME: What to do about this upper boundary? With a cutoff frequency of * rate/4 32 poles are completely possible, with a cutoff frequency very low * or very high 16 poles already produces only noise */ g_object_class_install_property (gobject_class, PROP_POLES, g_param_spec_int ("poles", "Poles", "Number of poles to use, will be rounded up to the next even number", 2, 32, 4, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_cheb_limit_setup); } static void gst_audio_cheb_limit_init (GstAudioChebLimit * filter, GstAudioChebLimitClass * klass) { filter->cutoff = 0.0; filter->mode = MODE_LOW_PASS; filter->type = 1; filter->poles = 4; filter->ripple = 0.25; filter->lock = g_mutex_new (); } static void generate_biquad_coefficients (GstAudioChebLimit * filter, gint p, gdouble * a0, gdouble * a1, gdouble * a2, gdouble * b1, gdouble * b2) { gint np = filter->poles; gdouble ripple = filter->ripple; /* pole location in s-plane */ gdouble rp, ip; /* zero location in s-plane */ gdouble iz = 0.0; /* transfer function coefficients for the z-plane */ gdouble x0, x1, x2, y1, y2; gint type = filter->type; /* Calculate pole location for lowpass at frequency 1 */ { gdouble angle = (G_PI / 2.0) * (2.0 * p - 1) / np; rp = -sin (angle); ip = cos (angle); } /* If we allow ripple, move the pole from the unit * circle to an ellipse and keep cutoff at frequency 1 */ if (ripple > 0 && type == 1) { gdouble es, vx; es = sqrt (pow (10.0, ripple / 10.0) - 1.0); vx = (1.0 / np) * asinh (1.0 / es); rp = rp * sinh (vx); ip = ip * cosh (vx); } else if (type == 2) { gdouble es, vx; es = sqrt (pow (10.0, ripple / 10.0) - 1.0); vx = (1.0 / np) * asinh (es); rp = rp * sinh (vx); ip = ip * cosh (vx); } /* Calculate inverse of the pole location to convert from * type I to type II */ if (type == 2) { gdouble mag2 = rp * rp + ip * ip; rp /= mag2; ip /= mag2; } /* Calculate zero location for frequency 1 on the * unit circle for type 2 */ if (type == 2) { gdouble angle = G_PI / (np * 2.0) + ((p - 1) * G_PI) / (np); gdouble mag2; iz = cos (angle); mag2 = iz * iz; iz /= mag2; } /* Convert from s-domain to z-domain by * using the bilinear Z-transform, i.e. * substitute s by (2/t)*((z-1)/(z+1)) * with t = 2 * tan(0.5). */ if (type == 1) { gdouble t, m, d; t = 2.0 * tan (0.5); m = rp * rp + ip * ip; d = 4.0 - 4.0 * rp * t + m * t * t; x0 = (t * t) / d; x1 = 2.0 * x0; x2 = x0; y1 = (8.0 - 2.0 * m * t * t) / d; y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; } else { gdouble t, m, d; t = 2.0 * tan (0.5); m = rp * rp + ip * ip; d = 4.0 - 4.0 * rp * t + m * t * t; x0 = (t * t * iz * iz + 4.0) / d; x1 = (-8.0 + 2.0 * iz * iz * t * t) / d; x2 = x0; y1 = (8.0 - 2.0 * m * t * t) / d; y2 = (-4.0 - 4.0 * rp * t - m * t * t) / d; } /* Convert from lowpass at frequency 1 to either lowpass * or highpass. * * For lowpass substitute z^(-1) with: * -1 * z - k * ------------ * -1 * 1 - k * z * * k = sin((1-w)/2) / sin((1+w)/2) * * For highpass substitute z^(-1) with: * * -1 * -z - k * ------------ * -1 * 1 + k * z * * k = -cos((1+w)/2) / cos((1-w)/2) * */ { gdouble k, d; gdouble omega = 2.0 * G_PI * (filter->cutoff / GST_AUDIO_FILTER (filter)->format.rate); if (filter->mode == MODE_LOW_PASS) k = sin ((1.0 - omega) / 2.0) / sin ((1.0 + omega) / 2.0); else k = -cos ((omega + 1.0) / 2.0) / cos ((omega - 1.0) / 2.0); d = 1.0 + y1 * k - y2 * k * k; *a0 = (x0 + k * (-x1 + k * x2)) / d; *a1 = (x1 + k * k * x1 - 2.0 * k * (x0 + x2)) / d; *a2 = (x0 * k * k - x1 * k + x2) / d; *b1 = (2.0 * k + y1 + y1 * k * k - 2.0 * y2 * k) / d; *b2 = (-k * k - y1 * k + y2) / d; if (filter->mode == MODE_HIGH_PASS) { *a1 = -*a1; *b1 = -*b1; } } } static void generate_coefficients (GstAudioChebLimit * filter) { if (GST_AUDIO_FILTER (filter)->format.rate == 0) { gdouble *a = g_new0 (gdouble, 1); a[0] = 1.0; gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, 1, NULL, 0); GST_LOG_OBJECT (filter, "rate was not set yet"); return; } if (filter->cutoff >= GST_AUDIO_FILTER (filter)->format.rate / 2.0) { gdouble *a = g_new0 (gdouble, 1); a[0] = (filter->mode == MODE_LOW_PASS) ? 1.0 : 0.0; gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, 1, NULL, 0); GST_LOG_OBJECT (filter, "cutoff was higher than nyquist frequency"); return; } else if (filter->cutoff <= 0.0) { gdouble *a = g_new0 (gdouble, 1); a[0] = (filter->mode == MODE_LOW_PASS) ? 0.0 : 1.0; gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, 1, NULL, 0); GST_LOG_OBJECT (filter, "cutoff is lower than zero"); return; } /* Calculate coefficients for the chebyshev filter */ { gint np = filter->poles; gdouble *a, *b; gint i, p; a = g_new0 (gdouble, np + 3); b = g_new0 (gdouble, np + 3); /* Calculate transfer function coefficients */ a[2] = 1.0; b[2] = 1.0; for (p = 1; p <= np / 2; p++) { gdouble a0, a1, a2, b1, b2; gdouble *ta = g_new0 (gdouble, np + 3); gdouble *tb = g_new0 (gdouble, np + 3); generate_biquad_coefficients (filter, p, &a0, &a1, &a2, &b1, &b2); memcpy (ta, a, sizeof (gdouble) * (np + 3)); memcpy (tb, b, sizeof (gdouble) * (np + 3)); /* add the new coefficients for the new two poles * to the cascade by multiplication of the transfer * functions */ for (i = 2; i < np + 3; i++) { a[i] = a0 * ta[i] + a1 * ta[i - 1] + a2 * ta[i - 2]; b[i] = tb[i] - b1 * tb[i - 1] - b2 * tb[i - 2]; } g_free (ta); g_free (tb); } /* Move coefficients to the beginning of the array * and multiply the b coefficients with -1 to move from * the transfer function's coefficients to the difference * equation's coefficients */ b[2] = 0.0; for (i = 0; i <= np; i++) { a[i] = a[i + 2]; b[i] = -b[i + 2]; } /* Normalize to unity gain at frequency 0 for lowpass * and frequency 0.5 for highpass */ { gdouble gain; if (filter->mode == MODE_LOW_PASS) gain = gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, 1.0, 0.0); else gain = gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, -1.0, 0.0); for (i = 0; i <= np; i++) { a[i] /= gain; } } gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (filter), a, np + 1, b, np + 1); GST_LOG_OBJECT (filter, "Generated IIR coefficients for the Chebyshev filter"); GST_LOG_OBJECT (filter, "mode: %s, type: %d, poles: %d, cutoff: %.2f Hz, ripple: %.2f dB", (filter->mode == MODE_LOW_PASS) ? "low-pass" : "high-pass", filter->type, filter->poles, filter->cutoff, filter->ripple); GST_LOG_OBJECT (filter, "%.2f dB gain @ 0 Hz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, 1.0, 0.0))); #ifndef GST_DISABLE_GST_DEBUG { gdouble wc = 2.0 * G_PI * (filter->cutoff / GST_AUDIO_FILTER (filter)->format.rate); gdouble zr = cos (wc), zi = sin (wc); GST_LOG_OBJECT (filter, "%.2f dB gain @ %d Hz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, zr, zi)), (int) filter->cutoff); } #endif GST_LOG_OBJECT (filter, "%.2f dB gain @ %d Hz", 20.0 * log10 (gst_audio_fx_base_iir_filter_calculate_gain (a, np + 1, b, np + 1, -1.0, 0.0)), GST_AUDIO_FILTER (filter)->format.rate / 2); } } static void gst_audio_cheb_limit_finalize (GObject * object) { GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); g_mutex_free (filter->lock); filter->lock = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_cheb_limit_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); switch (prop_id) { case PROP_MODE: g_mutex_lock (filter->lock); filter->mode = g_value_get_enum (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_TYPE: g_mutex_lock (filter->lock); filter->type = g_value_get_int (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_CUTOFF: g_mutex_lock (filter->lock); filter->cutoff = g_value_get_float (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_RIPPLE: g_mutex_lock (filter->lock); filter->ripple = g_value_get_float (value); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; case PROP_POLES: g_mutex_lock (filter->lock); filter->poles = GST_ROUND_UP_2 (g_value_get_int (value)); generate_coefficients (filter); g_mutex_unlock (filter->lock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_cheb_limit_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, filter->mode); break; case PROP_TYPE: g_value_set_int (value, filter->type); break; case PROP_CUTOFF: g_value_set_float (value, filter->cutoff); break; case PROP_RIPPLE: g_value_set_float (value, filter->ripple); break; case PROP_POLES: g_value_set_int (value, filter->poles); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_cheb_limit_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioChebLimit *filter = GST_AUDIO_CHEB_LIMIT (base); generate_coefficients (filter); return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); } gst-plugins-good-0.10.31/gst/audiofx/audiowsincband.h0000644000175000017500000000473211671175353017415 00000000000000/* -*- c-basic-offset: 2 -*- * * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * 2006 Dreamlab Technologies Ltd. * 2007-2009 Sebastian Dröge * * 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. * * * this windowed sinc filter is taken from the freely downloadable DSP book, * "The Scientist and Engineer's Guide to Digital Signal Processing", * chapter 16 * available at http://www.dspguide.com/ * */ #ifndef __GST_AUDIO_WSINC_BAND_H__ #define __GST_AUDIO_WSINC_BAND_H__ #include #include #include "audiofxbasefirfilter.h" G_BEGIN_DECLS #define GST_TYPE_AUDIO_WSINC_BAND \ (gst_audio_wsincband_get_type()) #define GST_AUDIO_WSINC_BAND(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_WSINC_BAND,GstAudioWSincBand)) #define GST_AUDIO_WSINC_BAND_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_WSINC_BAND,GstAudioWSincBandClass)) #define GST_IS_AUDIO_WSINC_BAND(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_WSINC_BAND)) #define GST_IS_AUDIO_WSINC_BAND_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_WSINC_BAND)) typedef struct _GstAudioWSincBand GstAudioWSincBand; typedef struct _GstAudioWSincBandClass GstAudioWSincBandClass; /** * GstAudioWSincBand: * * Opaque data structure. */ struct _GstAudioWSincBand { GstAudioFXBaseFIRFilter parent; gint mode; gint window; gfloat lower_frequency, upper_frequency; gint kernel_length; /* length of the filter kernel */ /* < private > */ GMutex *lock; }; struct _GstAudioWSincBandClass { GstAudioFilterClass parent; }; GType gst_audio_wsincband_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_WSINC_BAND_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiofxbaseiirfilter.c0000644000175000017500000002457511671175353020631 00000000000000/* * GStreamer * Copyright (C) 2007-2009 Sebastian Dröge * * 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 #include #include #include #include #include #include "audiofxbaseiirfilter.h" #define GST_CAT_DEFAULT gst_audio_fx_base_iir_filter_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); #define ALLOWED_CAPS \ "audio/x-raw-float," \ " width = (int) { 32, 64 }, " \ " endianness = (int) BYTE_ORDER," \ " rate = (int) [ 1, MAX ]," \ " channels = (int) [ 1, MAX ]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_fx_base_iir_filter_debug, "audiofxbaseiirfilter", 0, "Audio IIR Filter Base Class"); GST_BOILERPLATE_FULL (GstAudioFXBaseIIRFilter, gst_audio_fx_base_iir_filter, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static gboolean gst_audio_fx_base_iir_filter_setup (GstAudioFilter * filter, GstRingBufferSpec * format); static GstFlowReturn gst_audio_fx_base_iir_filter_transform_ip (GstBaseTransform * base, GstBuffer * buf); static gboolean gst_audio_fx_base_iir_filter_stop (GstBaseTransform * base); static void process_64 (GstAudioFXBaseIIRFilter * filter, gdouble * data, guint num_samples); static void process_32 (GstAudioFXBaseIIRFilter * filter, gfloat * data, guint num_samples); /* GObject vmethod implementations */ static void gst_audio_fx_base_iir_filter_base_init (gpointer klass) { GstCaps *caps; caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), caps); gst_caps_unref (caps); } static void gst_audio_fx_base_iir_filter_dispose (GObject * object) { GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (object); if (filter->a) { g_free (filter->a); filter->a = NULL; } if (filter->b) { g_free (filter->b); filter->b = NULL; } if (filter->channels) { GstAudioFXBaseIIRFilterChannelCtx *ctx; guint i; for (i = 0; i < filter->nchannels; i++) { ctx = &filter->channels[i]; g_free (ctx->x); g_free (ctx->y); } g_free (filter->channels); filter->channels = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_audio_fx_base_iir_filter_class_init (GstAudioFXBaseIIRFilterClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->dispose = gst_audio_fx_base_iir_filter_dispose; filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_fx_base_iir_filter_setup); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_audio_fx_base_iir_filter_transform_ip); trans_class->stop = GST_DEBUG_FUNCPTR (gst_audio_fx_base_iir_filter_stop); } static void gst_audio_fx_base_iir_filter_init (GstAudioFXBaseIIRFilter * filter, GstAudioFXBaseIIRFilterClass * klass) { gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); filter->a = NULL; filter->na = 0; filter->b = NULL; filter->nb = 0; filter->channels = NULL; filter->nchannels = 0; } /* Evaluate the transfer function that corresponds to the IIR * coefficients at zr + zi*I and return the magnitude */ gdouble gst_audio_fx_base_iir_filter_calculate_gain (gdouble * a, guint na, gdouble * b, guint nb, gdouble zr, gdouble zi) { gdouble sum_ar, sum_ai; gdouble sum_br, sum_bi; gdouble gain_r, gain_i; gdouble sum_r_old; gdouble sum_i_old; gint i; sum_ar = 0.0; sum_ai = 0.0; for (i = na - 1; i >= 0; i--) { sum_r_old = sum_ar; sum_i_old = sum_ai; sum_ar = (sum_r_old * zr - sum_i_old * zi) + a[i]; sum_ai = (sum_r_old * zi + sum_i_old * zr) + 0.0; } sum_br = 0.0; sum_bi = 0.0; for (i = nb - 1; i >= 0; i--) { sum_r_old = sum_br; sum_i_old = sum_bi; sum_br = (sum_r_old * zr - sum_i_old * zi) - b[i]; sum_bi = (sum_r_old * zi + sum_i_old * zr) - 0.0; } sum_br += 1.0; sum_bi += 0.0; gain_r = (sum_ar * sum_br + sum_ai * sum_bi) / (sum_br * sum_br + sum_bi * sum_bi); gain_i = (sum_ai * sum_br - sum_ar * sum_bi) / (sum_br * sum_br + sum_bi * sum_bi); return (sqrt (gain_r * gain_r + gain_i * gain_i)); } void gst_audio_fx_base_iir_filter_set_coefficients (GstAudioFXBaseIIRFilter * filter, gdouble * a, guint na, gdouble * b, guint nb) { guint i; g_return_if_fail (GST_IS_AUDIO_FX_BASE_IIR_FILTER (filter)); GST_BASE_TRANSFORM_LOCK (filter); g_free (filter->a); g_free (filter->b); filter->a = filter->b = NULL; if (filter->channels) { GstAudioFXBaseIIRFilterChannelCtx *ctx; gboolean free = (na != filter->na || nb != filter->nb); for (i = 0; i < filter->nchannels; i++) { ctx = &filter->channels[i]; if (free) g_free (ctx->x); else memset (ctx->x, 0, filter->na * sizeof (gdouble)); if (free) g_free (ctx->y); else memset (ctx->y, 0, filter->nb * sizeof (gdouble)); } g_free (filter->channels); filter->channels = NULL; } filter->na = na; filter->nb = nb; filter->a = a; filter->b = b; if (filter->nchannels && !filter->channels) { GstAudioFXBaseIIRFilterChannelCtx *ctx; filter->channels = g_new0 (GstAudioFXBaseIIRFilterChannelCtx, filter->nchannels); for (i = 0; i < filter->nchannels; i++) { ctx = &filter->channels[i]; ctx->x = g_new0 (gdouble, filter->na); ctx->y = g_new0 (gdouble, filter->nb); } } GST_BASE_TRANSFORM_UNLOCK (filter); } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_fx_base_iir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (base); gboolean ret = TRUE; if (format->width == 32) filter->process = (GstAudioFXBaseIIRFilterProcessFunc) process_32; else if (format->width == 64) filter->process = (GstAudioFXBaseIIRFilterProcessFunc) process_64; else ret = FALSE; if (format->channels != filter->nchannels) { guint i; GstAudioFXBaseIIRFilterChannelCtx *ctx; if (filter->channels) { for (i = 0; i < filter->nchannels; i++) { ctx = &filter->channels[i]; g_free (ctx->x); g_free (ctx->y); } g_free (filter->channels); filter->channels = NULL; } filter->nchannels = format->channels; filter->channels = g_new0 (GstAudioFXBaseIIRFilterChannelCtx, filter->nchannels); for (i = 0; i < filter->nchannels; i++) { ctx = &filter->channels[i]; ctx->x = g_new0 (gdouble, filter->na); ctx->y = g_new0 (gdouble, filter->nb); } } return ret; } static inline gdouble process (GstAudioFXBaseIIRFilter * filter, GstAudioFXBaseIIRFilterChannelCtx * ctx, gdouble x0) { gdouble val = filter->a[0] * x0; gint i, j; for (i = 1, j = ctx->x_pos; i < filter->na; i++) { val += filter->a[i] * ctx->x[j]; j--; if (j < 0) j = filter->na - 1; } for (i = 1, j = ctx->y_pos; i < filter->nb; i++) { val += filter->b[i] * ctx->y[j]; j--; if (j < 0) j = filter->nb - 1; } if (ctx->x) { ctx->x_pos++; if (ctx->x_pos >= filter->na) ctx->x_pos = 0; ctx->x[ctx->x_pos] = x0; } if (ctx->y) { ctx->y_pos++; if (ctx->y_pos >= filter->nb) ctx->y_pos = 0; ctx->y[ctx->y_pos] = val; } return val; } #define DEFINE_PROCESS_FUNC(width,ctype) \ static void \ process_##width (GstAudioFXBaseIIRFilter * filter, \ g##ctype * data, guint num_samples) \ { \ gint i, j, channels = GST_AUDIO_FILTER (filter)->format.channels; \ gdouble val; \ \ for (i = 0; i < num_samples / channels; i++) { \ for (j = 0; j < channels; j++) { \ val = process (filter, &filter->channels[j], *data); \ *data++ = val; \ } \ } \ } DEFINE_PROCESS_FUNC (32, float); DEFINE_PROCESS_FUNC (64, double); #undef DEFINE_PROCESS_FUNC /* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_fx_base_iir_filter_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); if (gst_base_transform_is_passthrough (base)) return GST_FLOW_OK; g_return_val_if_fail (filter->a != NULL, GST_FLOW_ERROR); filter->process (filter, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; } static gboolean gst_audio_fx_base_iir_filter_stop (GstBaseTransform * base) { GstAudioFXBaseIIRFilter *filter = GST_AUDIO_FX_BASE_IIR_FILTER (base); guint channels = GST_AUDIO_FILTER (filter)->format.channels; GstAudioFXBaseIIRFilterChannelCtx *ctx; guint i; /* Reset the history of input and output values if * already existing */ if (channels && filter->channels) { for (i = 0; i < channels; i++) { ctx = &filter->channels[i]; g_free (ctx->x); g_free (ctx->y); } g_free (filter->channels); } filter->channels = NULL; return TRUE; } gst-plugins-good-0.10.31/gst/audiofx/Makefile.am0000644000175000017500000000331511671175353016302 00000000000000# plugindir is set in configure plugin_LTLIBRARIES = libgstaudiofx.la # sources used to compile this plug-in libgstaudiofx_la_SOURCES = audiofx.c\ audiopanorama.c \ audioinvert.c \ audioamplify.c \ audiodynamic.c \ audiokaraoke.c \ audiofxbaseiirfilter.c \ audiocheblimit.c \ audiochebband.c \ audioiirfilter.c \ audiofxbasefirfilter.c \ audiowsincband.c \ audiowsinclimit.c \ audiofirfilter.c \ audioecho.c # flags used to compile this plugin libgstaudiofx_la_CFLAGS = $(GST_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstaudiofx_la_LIBADD = $(GST_LIBS) \ $(GST_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) \ -lgstfft-$(GST_MAJORMINOR) \ $(LIBM) libgstaudiofx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaudiofx_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = audiopanorama.h \ audioinvert.h \ audioamplify.h \ audiodynamic.h \ audiokaraoke.h \ audiofxbaseiirfilter.h \ audiocheblimit.h \ audiochebband.h \ audioiirfilter.h \ audiofxbasefirfilter.h \ audiowsincband.h \ audiowsinclimit.h \ audiofirfilter.h \ audioecho.h \ math_compat.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstaudiofx -:SHARED libgstaudiofx \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstaudiofx_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiofx_la_CFLAGS) \ -:LDFLAGS $(libgstaudiofx_la_LDFLAGS) \ $(libgstaudiofx_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/audiofx/audiocheblimit.h0000644000175000017500000000430211671175353017376 00000000000000/* * GStreamer * Copyright (C) 2007-2009 Sebastian Dröge * * 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_AUDIO_CHEB_LIMIT_H__ #define __GST_AUDIO_CHEB_LIMIT_H__ #include #include #include #include #include "audiofxbaseiirfilter.h" G_BEGIN_DECLS #define GST_TYPE_AUDIO_CHEB_LIMIT (gst_audio_cheb_limit_get_type()) #define GST_AUDIO_CHEB_LIMIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CHEB_LIMIT,GstAudioChebLimit)) #define GST_IS_AUDIO_CHEB_LIMIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CHEB_LIMIT)) #define GST_AUDIO_CHEB_LIMIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_CHEB_LIMIT,GstAudioChebLimitClass)) #define GST_IS_AUDIO_CHEB_LIMIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_CHEB_LIMIT)) #define GST_AUDIO_CHEB_LIMIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_CHEB_LIMIT,GstAudioChebLimitClass)) typedef struct _GstAudioChebLimit GstAudioChebLimit; typedef struct _GstAudioChebLimitClass GstAudioChebLimitClass; struct _GstAudioChebLimit { GstAudioFXBaseIIRFilter parent; gint mode; gint type; gint poles; gfloat cutoff; gfloat ripple; /* < private > */ GMutex *lock; }; struct _GstAudioChebLimitClass { GstAudioFXBaseIIRFilterClass parent; }; GType gst_audio_cheb_limit_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_CHEB_LIMIT_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiofx.c0000644000175000017500000000567111671175353016060 00000000000000/* * GStreamer * Copyright (C) 2006 Stefan Kost * * 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 #include #include "audiopanorama.h" #include "audioinvert.h" #include "audiokaraoke.h" #include "audioamplify.h" #include "audiodynamic.h" #include "audiocheblimit.h" #include "audiochebband.h" #include "audioiirfilter.h" #include "audiowsincband.h" #include "audiowsinclimit.h" #include "audiofirfilter.h" #include "audioecho.h" /* entry point to initialize the plug-in * initialize the plug-in itself * register the element factories and pad templates * register the features */ static gboolean plugin_init (GstPlugin * plugin) { /* initialize gst controller library */ gst_controller_init (NULL, NULL); return (gst_element_register (plugin, "audiopanorama", GST_RANK_NONE, GST_TYPE_AUDIO_PANORAMA) && gst_element_register (plugin, "audioinvert", GST_RANK_NONE, GST_TYPE_AUDIO_INVERT) && gst_element_register (plugin, "audiokaraoke", GST_RANK_NONE, GST_TYPE_AUDIO_KARAOKE) && gst_element_register (plugin, "audioamplify", GST_RANK_NONE, GST_TYPE_AUDIO_AMPLIFY) && gst_element_register (plugin, "audiodynamic", GST_RANK_NONE, GST_TYPE_AUDIO_DYNAMIC) && gst_element_register (plugin, "audiocheblimit", GST_RANK_NONE, GST_TYPE_AUDIO_CHEB_LIMIT) && gst_element_register (plugin, "audiochebband", GST_RANK_NONE, GST_TYPE_AUDIO_CHEB_BAND) && gst_element_register (plugin, "audioiirfilter", GST_RANK_NONE, GST_TYPE_AUDIO_IIR_FILTER) && gst_element_register (plugin, "audiowsinclimit", GST_RANK_NONE, GST_TYPE_AUDIO_WSINC_LIMIT) && gst_element_register (plugin, "audiowsincband", GST_RANK_NONE, GST_TYPE_AUDIO_WSINC_BAND) && gst_element_register (plugin, "audiofirfilter", GST_RANK_NONE, GST_TYPE_AUDIO_FIR_FILTER) && gst_element_register (plugin, "audioecho", GST_RANK_NONE, GST_TYPE_AUDIO_ECHO)); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "audiofx", "Audio effects plugin", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/audiofx/audioamplify.h0000644000175000017500000000434211671175353017103 00000000000000/* * GStreamer * Copyright (C) 2007 Sebastian Dröge * Copyright (C) 2006 Stefan Kost * * 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_AUDIO_AMPLIFY_H__ #define __GST_AUDIO_AMPLIFY_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_AMPLIFY (gst_audio_amplify_get_type()) #define GST_AUDIO_AMPLIFY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_AMPLIFY,GstAudioAmplify)) #define GST_IS_AUDIO_AMPLIFY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_AMPLIFY)) #define GST_AUDIO_AMPLIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_AMPLIFY,GstAudioAmplifyClass)) #define GST_IS_AUDIO_AMPLIFY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_AMPLIFY)) #define GST_AUDIO_AMPLIFY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_AMPLIFY,GstAudioAmplifyClass)) typedef struct _GstAudioAmplify GstAudioAmplify; typedef struct _GstAudioAmplifyClass GstAudioAmplifyClass; typedef void (*GstAudioAmplifyProcessFunc) (GstAudioAmplify *, void *, guint); struct _GstAudioAmplify { GstAudioFilter audiofilter; gfloat amplification; /* < private > */ GstAudioAmplifyProcessFunc process; gint clipping_method; gint format; gint width; }; struct _GstAudioAmplifyClass { GstAudioFilterClass parent; }; GType gst_audio_amplify_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_AMPLIFY_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiofirfilter.h0000644000175000017500000000411711671175353017430 00000000000000/* * GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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_AUDIO_FIR_FILTER_H__ #define __GST_AUDIO_FIR_FILTER_H__ #include #include #include "audiofxbasefirfilter.h" G_BEGIN_DECLS #define GST_TYPE_AUDIO_FIR_FILTER \ (gst_audio_fir_filter_get_type()) #define GST_AUDIO_FIR_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FIR_FILTER,GstAudioFIRFilter)) #define GST_AUDIO_FIR_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_FIR_FILTER,GstAudioFIRFilterClass)) #define GST_IS_AUDIO_FIR_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FIR_FILTER)) #define GST_IS_AUDIO_FIR_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_FIR_FILTER)) typedef struct _GstAudioFIRFilter GstAudioFIRFilter; typedef struct _GstAudioFIRFilterClass GstAudioFIRFilterClass; /** * GstAudioFIRFilter: * * Opaque data structure. */ struct _GstAudioFIRFilter { GstAudioFXBaseFIRFilter parent; GValueArray *kernel; guint64 latency; /* < private > */ GMutex *lock; gint rate; }; struct _GstAudioFIRFilterClass { GstAudioFXBaseFIRFilterClass parent; void (*rate_changed) (GstElement * element, gint rate); }; GType gst_audio_fir_filter_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_FIR_FILTER_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiowsincband.c0000644000175000017500000003560511677341654017420 00000000000000/* -*- c-basic-offset: 2 -*- * * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * 2006 Dreamlab Technologies Ltd. * 2007-2009 Sebastian Dröge * * 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. * * * this windowed sinc filter is taken from the freely downloadable DSP book, * "The Scientist and Engineer's Guide to Digital Signal Processing", * chapter 16 * available at http://www.dspguide.com/ * * For the window functions see * http://en.wikipedia.org/wiki/Window_function */ /** * SECTION:element-audiowsincband * * Attenuates all frequencies outside (bandpass) or inside (bandreject) of a frequency * band. The length parameter controls the rolloff, the window parameter * controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit * worse stopband attenuation, the other way around for the Blackman window. * * This element has the advantage over the Chebyshev bandpass and bandreject filter that it has * a much better rolloff when using a larger kernel size and almost linear phase. The only * disadvantage is the much slower execution time with larger kernels. * * * Example launch line * |[ * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiosincband mode=band-pass lower-frequency=3000 upper-frequency=10000 length=501 window=blackman ! audioconvert ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsincband mode=band-reject lower-frequency=59 upper-frequency=61 length=10001 window=hamming ! audioconvert ! alsasink * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsincband mode=band-pass lower-frequency=1000 upper-frequency=2000 length=31 ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audiowsincband.h" #include "gst/glib-compat-private.h" #define GST_CAT_DEFAULT gst_gst_audio_wsincband_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { PROP_0, PROP_LENGTH, PROP_LOWER_FREQUENCY, PROP_UPPER_FREQUENCY, PROP_MODE, PROP_WINDOW }; enum { MODE_BAND_PASS = 0, MODE_BAND_REJECT }; #define GST_TYPE_AUDIO_WSINC_BAND_MODE (gst_gst_audio_wsincband_mode_get_type ()) static GType gst_gst_audio_wsincband_mode_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {MODE_BAND_PASS, "Band pass (default)", "band-pass"}, {MODE_BAND_REJECT, "Band reject", "band-reject"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioWSincBandMode", values); } return gtype; } enum { WINDOW_HAMMING = 0, WINDOW_BLACKMAN, WINDOW_GAUSSIAN, WINDOW_COSINE, WINDOW_HANN }; #define GST_TYPE_AUDIO_WSINC_BAND_WINDOW (gst_gst_audio_wsincband_window_get_type ()) static GType gst_gst_audio_wsincband_window_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {WINDOW_HAMMING, "Hamming window (default)", "hamming"}, {WINDOW_BLACKMAN, "Blackman window", "blackman"}, {WINDOW_GAUSSIAN, "Gaussian window", "gaussian"}, {WINDOW_COSINE, "Cosine window", "cosine"}, {WINDOW_HANN, "Hann window", "hann"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioWSincBandWindow", values); } return gtype; } #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_gst_audio_wsincband_debug, "audiowsincband", 0, \ "Band-pass and Band-reject Windowed sinc filter plugin"); GST_BOILERPLATE_FULL (GstAudioWSincBand, gst_audio_wsincband, GstAudioFilter, GST_TYPE_AUDIO_FX_BASE_FIR_FILTER, DEBUG_INIT); static void gst_audio_wsincband_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_wsincband_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_wsincband_finalize (GObject * object); static gboolean gst_audio_wsincband_setup (GstAudioFilter * base, GstRingBufferSpec * format); #define POW2(x) (x)*(x) /* Element class */ static void gst_audio_wsincband_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Band pass & band reject filter", "Filter/Effect/Audio", "Band pass and band reject windowed sinc filter", "Thomas Vander Stichele , " "Steven W. Smith, " "Dreamlab Technologies Ltd. , " "Sebastian Dröge "); } static void gst_audio_wsincband_class_init (GstAudioWSincBandClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_wsincband_set_property; gobject_class->get_property = gst_audio_wsincband_get_property; gobject_class->finalize = gst_audio_wsincband_finalize; /* FIXME: Don't use the complete possible range but restrict the upper boundary * so automatically generated UIs can use a slider */ g_object_class_install_property (gobject_class, PROP_LOWER_FREQUENCY, g_param_spec_float ("lower-frequency", "Lower Frequency", "Cut-off lower frequency (Hz)", 0.0, 100000.0, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_UPPER_FREQUENCY, g_param_spec_float ("upper-frequency", "Upper Frequency", "Cut-off upper frequency (Hz)", 0.0, 100000.0, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_LENGTH, g_param_spec_int ("length", "Length", "Filter kernel length, will be rounded to the next odd number", 3, 256000, 101, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Band pass or band reject mode", GST_TYPE_AUDIO_WSINC_BAND_MODE, MODE_BAND_PASS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_WINDOW, g_param_spec_enum ("window", "Window", "Window function to use", GST_TYPE_AUDIO_WSINC_BAND_WINDOW, WINDOW_HAMMING, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_wsincband_setup); } static void gst_audio_wsincband_init (GstAudioWSincBand * self, GstAudioWSincBandClass * g_class) { self->kernel_length = 101; self->lower_frequency = 0.0; self->upper_frequency = 0.0; self->mode = MODE_BAND_PASS; self->window = WINDOW_HAMMING; self->lock = g_mutex_new (); } static void gst_audio_wsincband_build_kernel (GstAudioWSincBand * self) { gint i = 0; gdouble sum = 0.0; gint len = 0; gdouble *kernel_lp, *kernel_hp; gdouble w; gdouble *kernel; len = self->kernel_length; if (GST_AUDIO_FILTER (self)->format.rate == 0) { GST_DEBUG ("rate not set yet"); return; } if (GST_AUDIO_FILTER (self)->format.channels == 0) { GST_DEBUG ("channels not set yet"); return; } /* Clamp frequencies */ self->lower_frequency = CLAMP (self->lower_frequency, 0.0, GST_AUDIO_FILTER (self)->format.rate / 2); self->upper_frequency = CLAMP (self->upper_frequency, 0.0, GST_AUDIO_FILTER (self)->format.rate / 2); if (self->lower_frequency > self->upper_frequency) { gint tmp = self->lower_frequency; self->lower_frequency = self->upper_frequency; self->upper_frequency = tmp; } GST_DEBUG ("gst_audio_wsincband: initializing filter kernel of length %d " "with lower frequency %.2lf Hz " ", upper frequency %.2lf Hz for mode %s", len, self->lower_frequency, self->upper_frequency, (self->mode == MODE_BAND_PASS) ? "band-pass" : "band-reject"); /* fill the lp kernel */ w = 2 * G_PI * (self->lower_frequency / GST_AUDIO_FILTER (self)->format.rate); kernel_lp = g_new (gdouble, len); for (i = 0; i < len; ++i) { if (i == (len - 1) / 2.0) kernel_lp[i] = w; else kernel_lp[i] = sin (w * (i - (len - 1) / 2.0)) / (i - (len - 1) / 2.0); /* windowing */ switch (self->window) { case WINDOW_HAMMING: kernel_lp[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1))); break; case WINDOW_BLACKMAN: kernel_lp[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) + 0.08 * cos (4 * G_PI * i / (len - 1))); break; case WINDOW_GAUSSIAN: kernel_lp[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1)))); break; case WINDOW_COSINE: kernel_lp[i] *= cos (G_PI * i / (len - 1) - G_PI / 2); break; case WINDOW_HANN: kernel_lp[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1))); break; } } /* normalize for unity gain at DC */ sum = 0.0; for (i = 0; i < len; ++i) sum += kernel_lp[i]; for (i = 0; i < len; ++i) kernel_lp[i] /= sum; /* fill the hp kernel */ w = 2 * G_PI * (self->upper_frequency / GST_AUDIO_FILTER (self)->format.rate); kernel_hp = g_new (gdouble, len); for (i = 0; i < len; ++i) { if (i == (len - 1) / 2.0) kernel_hp[i] = w; else kernel_hp[i] = sin (w * (i - (len - 1) / 2.0)) / (i - (len - 1) / 2.0); /* Windowing */ switch (self->window) { case WINDOW_HAMMING: kernel_hp[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1))); break; case WINDOW_BLACKMAN: kernel_hp[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) + 0.08 * cos (4 * G_PI * i / (len - 1))); break; case WINDOW_GAUSSIAN: kernel_hp[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1)))); break; case WINDOW_COSINE: kernel_hp[i] *= cos (G_PI * i / (len - 1) - G_PI / 2); break; case WINDOW_HANN: kernel_hp[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1))); break; } } /* normalize for unity gain at DC */ sum = 0.0; for (i = 0; i < len; ++i) sum += kernel_hp[i]; for (i = 0; i < len; ++i) kernel_hp[i] /= sum; /* do spectral inversion to go from lowpass to highpass */ for (i = 0; i < len; ++i) kernel_hp[i] = -kernel_hp[i]; if (len % 2 == 1) { kernel_hp[(len - 1) / 2] += 1.0; } else { kernel_hp[len / 2 - 1] += 0.5; kernel_hp[len / 2] += 0.5; } /* combine the two kernels */ kernel = g_new (gdouble, len); for (i = 0; i < len; ++i) kernel[i] = kernel_lp[i] + kernel_hp[i]; /* free the helper kernels */ g_free (kernel_lp); g_free (kernel_hp); /* do spectral inversion to go from bandreject to bandpass * if specified */ if (self->mode == MODE_BAND_PASS) { for (i = 0; i < len; ++i) kernel[i] = -kernel[i]; kernel[len / 2] += 1; } gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self), kernel, self->kernel_length, (len - 1) / 2); } /* GstAudioFilter vmethod implementations */ /* get notified of caps and plug in the correct process function */ static gboolean gst_audio_wsincband_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (base); gst_audio_wsincband_build_kernel (self); return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); } static void gst_audio_wsincband_finalize (GObject * object) { GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (object); g_mutex_free (self->lock); self->lock = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_wsincband_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (object); g_return_if_fail (GST_IS_AUDIO_WSINC_BAND (self)); switch (prop_id) { case PROP_LENGTH:{ gint val; g_mutex_lock (self->lock); val = g_value_get_int (value); if (val % 2 == 0) val++; if (val != self->kernel_length) { gst_audio_fx_base_fir_filter_push_residue (GST_AUDIO_FX_BASE_FIR_FILTER (self)); self->kernel_length = val; gst_audio_wsincband_build_kernel (self); } g_mutex_unlock (self->lock); break; } case PROP_LOWER_FREQUENCY: g_mutex_lock (self->lock); self->lower_frequency = g_value_get_float (value); gst_audio_wsincband_build_kernel (self); g_mutex_unlock (self->lock); break; case PROP_UPPER_FREQUENCY: g_mutex_lock (self->lock); self->upper_frequency = g_value_get_float (value); gst_audio_wsincband_build_kernel (self); g_mutex_unlock (self->lock); break; case PROP_MODE: g_mutex_lock (self->lock); self->mode = g_value_get_enum (value); gst_audio_wsincband_build_kernel (self); g_mutex_unlock (self->lock); break; case PROP_WINDOW: g_mutex_lock (self->lock); self->window = g_value_get_enum (value); gst_audio_wsincband_build_kernel (self); g_mutex_unlock (self->lock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_wsincband_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioWSincBand *self = GST_AUDIO_WSINC_BAND (object); switch (prop_id) { case PROP_LENGTH: g_value_set_int (value, self->kernel_length); break; case PROP_LOWER_FREQUENCY: g_value_set_float (value, self->lower_frequency); break; case PROP_UPPER_FREQUENCY: g_value_set_float (value, self->upper_frequency); break; case PROP_MODE: g_value_set_enum (value, self->mode); break; case PROP_WINDOW: g_value_set_enum (value, self->window); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/audiofx/audioinvert.c0000644000175000017500000002012211671175353016736 00000000000000/* * GStreamer * Copyright (C) 2007 Sebastian Dröge * Copyright (C) 2006 Stefan Kost * * 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-audioinvert * * Swaps upper and lower half of audio samples. Mixing an inverted sample on top of * the original with a slight delay can produce effects that sound like resonance. * Creating a stereo sample from a mono source, with one channel inverted produces wide-stereo sounds. * * * Example launch line * |[ * gst-launch audiotestsrc wave=saw ! audioinvert invert=0.4 ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audioinvert invert=0.4 ! alsasink * gst-launch audiotestsrc wave=saw ! audioconvert ! audioinvert invert=0.4 ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audioinvert.h" #define GST_CAT_DEFAULT gst_audio_invert_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_DEGREE }; #define ALLOWED_CAPS \ "audio/x-raw-int," \ " depth=(int)16," \ " width=(int)16," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-float," \ " width=(int)32," \ " endianness=(int)BYTE_ORDER," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_invert_debug, "audioinvert", 0, "audioinvert element"); GST_BOILERPLATE_FULL (GstAudioInvert, gst_audio_invert, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static void gst_audio_invert_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_invert_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_audio_invert_setup (GstAudioFilter * filter, GstRingBufferSpec * format); static GstFlowReturn gst_audio_invert_transform_ip (GstBaseTransform * base, GstBuffer * buf); static void gst_audio_invert_transform_int (GstAudioInvert * filter, gint16 * data, guint num_samples); static void gst_audio_invert_transform_float (GstAudioInvert * filter, gfloat * data, guint num_samples); /* GObject vmethod implementations */ static void gst_audio_invert_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstCaps *caps; gst_element_class_set_details_simple (element_class, "Audio inversion", "Filter/Effect/Audio", "Swaps upper and lower half of audio samples", "Sebastian Dröge "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), caps); gst_caps_unref (caps); } static void gst_audio_invert_class_init (GstAudioInvertClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_audio_invert_set_property; gobject_class->get_property = gst_audio_invert_get_property; g_object_class_install_property (gobject_class, PROP_DEGREE, g_param_spec_float ("degree", "Degree", "Degree of inversion", 0.0, 1.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); GST_AUDIO_FILTER_CLASS (klass)->setup = GST_DEBUG_FUNCPTR (gst_audio_invert_setup); GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = GST_DEBUG_FUNCPTR (gst_audio_invert_transform_ip); } static void gst_audio_invert_init (GstAudioInvert * filter, GstAudioInvertClass * klass) { filter->degree = 0.0; gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); } static void gst_audio_invert_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioInvert *filter = GST_AUDIO_INVERT (object); switch (prop_id) { case PROP_DEGREE: filter->degree = g_value_get_float (value); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), filter->degree == 0.0); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_invert_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioInvert *filter = GST_AUDIO_INVERT (object); switch (prop_id) { case PROP_DEGREE: g_value_set_float (value, filter->degree); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_invert_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioInvert *filter = GST_AUDIO_INVERT (base); gboolean ret = TRUE; if (format->type == GST_BUFTYPE_FLOAT && format->width == 32) filter->process = (GstAudioInvertProcessFunc) gst_audio_invert_transform_float; else if (format->type == GST_BUFTYPE_LINEAR && format->width == 16) filter->process = (GstAudioInvertProcessFunc) gst_audio_invert_transform_int; else ret = FALSE; return ret; } static void gst_audio_invert_transform_int (GstAudioInvert * filter, gint16 * data, guint num_samples) { gint i; gfloat dry = 1.0 - filter->degree; glong val; for (i = 0; i < num_samples; i++) { val = (*data) * dry + (-1 - (*data)) * filter->degree; *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); } } static void gst_audio_invert_transform_float (GstAudioInvert * filter, gfloat * data, guint num_samples) { gint i; gfloat dry = 1.0 - filter->degree; glong val; for (i = 0; i < num_samples; i++) { val = (*data) * dry - (*data) * filter->degree; *data++ = val; } } /* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_invert_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioInvert *filter = GST_AUDIO_INVERT (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); if (gst_base_transform_is_passthrough (base) || G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) return GST_FLOW_OK; filter->process (filter, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/audiofx/audiofxbaseiirfilter.h0000644000175000017500000000556611671175353020635 00000000000000/* * GStreamer * Copyright (C) 2007-2009 Sebastian Dröge * * 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_AUDIO_FX_BASE_IIR_FILTER_H__ #define __GST_AUDIO_FX_BASE_IIR_FILTER_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_FX_BASE_IIR_FILTER (gst_audio_fx_base_iir_filter_get_type()) #define GST_AUDIO_FX_BASE_IIR_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FX_BASE_IIR_FILTER,GstAudioFXBaseIIRFilter)) #define GST_IS_AUDIO_FX_BASE_IIR_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FX_BASE_IIR_FILTER)) #define GST_AUDIO_FX_BASE_IIR_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_FX_BASE_IIR_FILTER,GstAudioFXBaseIIRFilterClass)) #define GST_IS_AUDIO_FX_BASE_IIR_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_FX_BASE_IIR_FILTER)) #define GST_AUDIO_FX_BASE_IIR_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_FX_BASE_IIR_FILTER,GstAudioFXBaseIIRFilterClass)) typedef struct _GstAudioFXBaseIIRFilter GstAudioFXBaseIIRFilter; typedef struct _GstAudioFXBaseIIRFilterClass GstAudioFXBaseIIRFilterClass; typedef void (*GstAudioFXBaseIIRFilterProcessFunc) (GstAudioFXBaseIIRFilter *, guint8 *, guint); typedef struct { gdouble *x; gint x_pos; gdouble *y; gint y_pos; } GstAudioFXBaseIIRFilterChannelCtx; struct _GstAudioFXBaseIIRFilter { GstAudioFilter audiofilter; /* < private > */ GstAudioFXBaseIIRFilterProcessFunc process; gboolean have_coeffs; gdouble *a; guint na; gdouble *b; guint nb; GstAudioFXBaseIIRFilterChannelCtx *channels; guint nchannels; }; struct _GstAudioFXBaseIIRFilterClass { GstAudioFilterClass parent; }; GType gst_audio_fx_base_iir_filter_get_type (void); void gst_audio_fx_base_iir_filter_set_coefficients (GstAudioFXBaseIIRFilter *filter, gdouble *a, guint na, gdouble *b, guint nb); gdouble gst_audio_fx_base_iir_filter_calculate_gain (gdouble *a, guint na, gdouble *b, guint nb, gdouble zr, gdouble zi); G_END_DECLS #endif /* __GST_AUDIO_FX_BASE_IIR_FILTER_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiofxbasefirfilter.c0000644000175000017500000010740211671175353020615 00000000000000/* -*- c-basic-offset: 2 -*- * * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * 2006 Dreamlab Technologies Ltd. * 2007-2009 Sebastian Dröge * * 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 #include #include #include #include /* FIXME: Remove this once we depend on gst-plugins-base 0.10.26 */ #ifndef GST_AUDIO_FILTER_CAST #define GST_AUDIO_FILTER_CAST(obj) ((GstAudioFilter *) (obj)) #endif #include "audiofxbasefirfilter.h" #define GST_CAT_DEFAULT gst_audio_fx_base_fir_filter_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); #define ALLOWED_CAPS \ "audio/x-raw-float, " \ " width = (int) { 32, 64 }, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_fx_base_fir_filter_debug, "audiofxbasefirfilter", 0, \ "FIR filter base class"); /* Switch from time-domain to FFT convolution for kernels >= this */ #define FFT_THRESHOLD 32 enum { PROP_0 = 0, PROP_LOW_LATENCY, PROP_DRAIN_ON_CHANGES }; #define DEFAULT_LOW_LATENCY FALSE #define DEFAULT_DRAIN_ON_CHANGES TRUE GST_BOILERPLATE_FULL (GstAudioFXBaseFIRFilter, gst_audio_fx_base_fir_filter, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static GstFlowReturn gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf); static gboolean gst_audio_fx_base_fir_filter_start (GstBaseTransform * base); static gboolean gst_audio_fx_base_fir_filter_stop (GstBaseTransform * base); static gboolean gst_audio_fx_base_fir_filter_event (GstBaseTransform * base, GstEvent * event); static gboolean gst_audio_fx_base_fir_filter_transform_size (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize); static gboolean gst_audio_fx_base_fir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format); static gboolean gst_audio_fx_base_fir_filter_query (GstPad * pad, GstQuery * query); static const GstQueryType *gst_audio_fx_base_fir_filter_query_type (GstPad * pad); /* * The code below calculates the linear convolution: * * y[t] = \sum_{u=0}^{M-1} x[t - u] * h[u] * * where y is the output, x is the input, M is the length * of the filter kernel and h is the filter kernel. For x * holds: x[t] == 0 \forall t < 0. * * The runtime complexity of this is O (M) per sample. * */ #define DEFINE_PROCESS_FUNC(width,ctype) \ static guint \ process_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, g##ctype * dst, guint input_samples) \ { \ gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; \ TIME_DOMAIN_CONVOLUTION_BODY (channels); \ } #define DEFINE_PROCESS_FUNC_FIXED_CHANNELS(width,channels,ctype) \ static guint \ process_##channels##_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, g##ctype * dst, guint input_samples) \ { \ TIME_DOMAIN_CONVOLUTION_BODY (channels); \ } #define TIME_DOMAIN_CONVOLUTION_BODY(channels) G_STMT_START { \ gint kernel_length = self->kernel_length; \ gint i, j, k, l; \ gint res_start; \ gint from_input; \ gint off; \ gdouble *buffer = self->buffer; \ gdouble *kernel = self->kernel; \ guint buffer_length = self->buffer_length; \ \ if (!buffer) { \ self->buffer_length = buffer_length = kernel_length * channels; \ self->buffer = buffer = g_new0 (gdouble, self->buffer_length); \ } \ \ /* convolution */ \ for (i = 0; i < input_samples; i++) { \ dst[i] = 0.0; \ k = i % channels; \ l = i / channels; \ from_input = MIN (l, kernel_length-1); \ off = l * channels + k; \ for (j = 0; j <= from_input; j++) { \ dst[i] += src[off] * kernel[j]; \ off -= channels; \ } \ /* j == from_input && off == (l - j) * channels + k */ \ off += kernel_length * channels; \ for (; j < kernel_length; j++) { \ dst[i] += buffer[off] * kernel[j]; \ off -= channels; \ } \ } \ \ /* copy the tail of the current input buffer to the residue, while \ * keeping parts of the residue if the input buffer is smaller than \ * the kernel length */ \ /* from now on take kernel length as length over all channels */ \ kernel_length *= channels; \ if (input_samples < kernel_length) \ res_start = kernel_length - input_samples; \ else \ res_start = 0; \ \ for (i = 0; i < res_start; i++) \ buffer[i] = buffer[i + input_samples]; \ /* i == res_start */ \ for (; i < kernel_length; i++) \ buffer[i] = src[input_samples - kernel_length + i]; \ \ self->buffer_fill += kernel_length - res_start; \ if (self->buffer_fill > kernel_length) \ self->buffer_fill = kernel_length; \ \ return input_samples / channels; \ } G_STMT_END DEFINE_PROCESS_FUNC (32, float); DEFINE_PROCESS_FUNC (64, double); DEFINE_PROCESS_FUNC_FIXED_CHANNELS (32, 1, float); DEFINE_PROCESS_FUNC_FIXED_CHANNELS (64, 1, double); DEFINE_PROCESS_FUNC_FIXED_CHANNELS (32, 2, float); DEFINE_PROCESS_FUNC_FIXED_CHANNELS (64, 2, double); #undef TIME_DOMAIN_CONVOLUTION_BODY #undef DEFINE_PROCESS_FUNC #undef DEFINE_PROCESS_FUNC_FIXED_CHANNELS /* This implements FFT convolution and uses the overlap-save algorithm. * See http://cnx.org/content/m12022/latest/ or your favorite * digital signal processing book for details. * * In every pass the following is calculated: * * y = IFFT (FFT(x) * FFT(h)) * * where y is the output in the time domain, x the * input and h the filter kernel. * is the multiplication * of complex numbers. * * Due to the circular convolution theorem this * gives in the time domain: * * y[t] = \sum_{u=0}^{M-1} x[t - u] * h[u] * * where y is the output, M is the kernel length, * x the periodically extended[0] input and h the * filter kernel. * * ([0] Periodically extended means: ) * ( x[t] = x[t+kN] \forall k \in Z ) * ( where N is the length of x ) * * This means: * - Obviously x and h need to be of the same size for the FFT * - The first M-1 output values are useless because they're * built from 1 up to M-1 values from the end of the input * (circular convolusion!). * - The last M-1 input values are only used for 1 up to M-1 * output values, i.e. they need to be used again in the * next pass for the first M-1 input values. * * => The first pass needs M-1 zeroes at the beginning of the * input and the last M-1 input values of every pass need to * be used as the first M-1 input values of the next pass. * * => x must be larger than h to give a useful number of output * samples and h needs to be padded by zeroes at the end to give * it virtually the same size as x (by M we denote the number of * non-padding samples of h). If len(x)==len(h)==M only 1 output * sample would be calculated per pass, len(x)==2*len(h) would * give M+1 output samples, etc. Usually a factor between 4 and 8 * gives a low number of operations per output samples (see website * given above). * * Overall this gives a runtime complexity per sample of * * ( N log N ) * O ( --------- ) compared to O (M) for the direct calculation. * ( N - M + 1 ) */ #define DEFINE_FFT_PROCESS_FUNC(width,ctype) \ static guint \ process_fft_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, \ g##ctype * dst, guint input_samples) \ { \ gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; \ FFT_CONVOLUTION_BODY (channels); \ } #define DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS(width,channels,ctype) \ static guint \ process_fft_##channels##_##width (GstAudioFXBaseFIRFilter * self, const g##ctype * src, \ g##ctype * dst, guint input_samples) \ { \ FFT_CONVOLUTION_BODY (channels); \ } #define FFT_CONVOLUTION_BODY(channels) G_STMT_START { \ gint i, j; \ guint pass; \ guint kernel_length = self->kernel_length; \ guint block_length = self->block_length; \ guint buffer_length = self->buffer_length; \ guint real_buffer_length = buffer_length + kernel_length - 1; \ guint buffer_fill = self->buffer_fill; \ GstFFTF64 *fft = self->fft; \ GstFFTF64 *ifft = self->ifft; \ GstFFTF64Complex *frequency_response = self->frequency_response; \ GstFFTF64Complex *fft_buffer = self->fft_buffer; \ guint frequency_response_length = self->frequency_response_length; \ gdouble *buffer = self->buffer; \ guint generated = 0; \ gdouble re, im; \ \ if (!fft_buffer) \ self->fft_buffer = fft_buffer = \ g_new (GstFFTF64Complex, frequency_response_length); \ \ /* Buffer contains the time domain samples of input data for one chunk \ * plus some more space for the inverse FFT below. \ * \ * The samples are put at offset kernel_length, the inverse FFT \ * overwrites everthing from offset 0 to length-kernel_length+1, keeping \ * the last kernel_length-1 samples for copying to the next processing \ * step. \ */ \ if (!buffer) { \ self->buffer_length = buffer_length = block_length; \ real_buffer_length = buffer_length + kernel_length - 1; \ \ self->buffer = buffer = g_new0 (gdouble, real_buffer_length * channels); \ \ /* Beginning has kernel_length-1 zeroes at the beginning */ \ self->buffer_fill = buffer_fill = kernel_length - 1; \ } \ \ g_assert (self->buffer_length == block_length); \ \ while (input_samples) { \ pass = MIN (buffer_length - buffer_fill, input_samples); \ \ /* Deinterleave channels */ \ for (i = 0; i < pass; i++) { \ for (j = 0; j < channels; j++) { \ buffer[real_buffer_length * j + buffer_fill + kernel_length - 1 + i] = \ src[i * channels + j]; \ } \ } \ buffer_fill += pass; \ src += channels * pass; \ input_samples -= pass; \ \ /* If we don't have a complete buffer go out */ \ if (buffer_fill < buffer_length) \ break; \ \ for (j = 0; j < channels; j++) { \ /* Calculate FFT of input block */ \ gst_fft_f64_fft (fft, \ buffer + real_buffer_length * j + kernel_length - 1, fft_buffer); \ \ /* Complex multiplication of input and filter spectrum */ \ for (i = 0; i < frequency_response_length; i++) { \ re = fft_buffer[i].r; \ im = fft_buffer[i].i; \ \ fft_buffer[i].r = \ re * frequency_response[i].r - \ im * frequency_response[i].i; \ fft_buffer[i].i = \ re * frequency_response[i].i + \ im * frequency_response[i].r; \ } \ \ /* Calculate inverse FFT of the result */ \ gst_fft_f64_inverse_fft (ifft, fft_buffer, \ buffer + real_buffer_length * j); \ \ /* Copy all except the first kernel_length-1 samples to the output */ \ for (i = 0; i < buffer_length - kernel_length + 1; i++) { \ dst[i * channels + j] = \ buffer[real_buffer_length * j + kernel_length - 1 + i]; \ } \ \ /* Copy the last kernel_length-1 samples to the beginning for the next block */ \ for (i = 0; i < kernel_length - 1; i++) { \ buffer[real_buffer_length * j + kernel_length - 1 + i] = \ buffer[real_buffer_length * j + buffer_length + i]; \ } \ } \ \ generated += buffer_length - kernel_length + 1; \ dst += channels * (buffer_length - kernel_length + 1); \ \ /* The the first kernel_length-1 samples are there already */ \ buffer_fill = kernel_length - 1; \ } \ \ /* Write back cached buffer_fill value */ \ self->buffer_fill = buffer_fill; \ \ return generated; \ } G_STMT_END DEFINE_FFT_PROCESS_FUNC (32, float); DEFINE_FFT_PROCESS_FUNC (64, double); DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (32, 1, float); DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (64, 1, double); DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (32, 2, float); DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS (64, 2, double); #undef FFT_CONVOLUTION_BODY #undef DEFINE_FFT_PROCESS_FUNC #undef DEFINE_FFT_PROCESS_FUNC_FIXED_CHANNELS /* Element class */ static void gst_audio_fx_base_fir_filter_calculate_frequency_response (GstAudioFXBaseFIRFilter * self) { gst_fft_f64_free (self->fft); self->fft = NULL; gst_fft_f64_free (self->ifft); self->ifft = NULL; g_free (self->frequency_response); self->frequency_response_length = 0; g_free (self->fft_buffer); self->fft_buffer = NULL; if (self->kernel && self->kernel_length >= FFT_THRESHOLD && !self->low_latency) { guint block_length, i; gdouble *kernel_tmp, *kernel = self->kernel; /* We process 4 * kernel_length samples per pass in FFT mode */ block_length = 4 * self->kernel_length; block_length = gst_fft_next_fast_length (block_length); self->block_length = block_length; kernel_tmp = g_new0 (gdouble, block_length); memcpy (kernel_tmp, kernel, self->kernel_length * sizeof (gdouble)); self->fft = gst_fft_f64_new (block_length, FALSE); self->ifft = gst_fft_f64_new (block_length, TRUE); self->frequency_response_length = block_length / 2 + 1; self->frequency_response = g_new (GstFFTF64Complex, self->frequency_response_length); gst_fft_f64_fft (self->fft, kernel_tmp, self->frequency_response); g_free (kernel_tmp); /* Normalize to make sure IFFT(FFT(x)) == x */ for (i = 0; i < self->frequency_response_length; i++) { self->frequency_response[i].r /= block_length; self->frequency_response[i].i /= block_length; } } } /* Must be called with base transform lock! */ static void gst_audio_fx_base_fir_filter_select_process_function (GstAudioFXBaseFIRFilter * self, gint width, gint channels) { if (width == 32 && self->fft && !self->low_latency) { if (channels == 1) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_1_32; else if (channels == 2) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_2_32; else self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_32; } else if (width == 64 && self->fft && !self->low_latency) { if (channels == 1) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_1_64; else if (channels == 2) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_2_64; else self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_fft_64; } else if (width == 32) { if (channels == 1) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_1_32; else if (channels == 2) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_2_32; else self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_32; } else if (width == 64) { if (channels == 1) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_1_64; else if (channels == 2) self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_2_64; else self->process = (GstAudioFXBaseFIRFilterProcessFunc) process_64; } else { self->process = NULL; } } static void gst_audio_fx_base_fir_filter_dispose (GObject * object) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); g_free (self->buffer); self->buffer = NULL; self->buffer_length = 0; g_free (self->kernel); self->kernel = NULL; gst_fft_f64_free (self->fft); self->fft = NULL; gst_fft_f64_free (self->ifft); self->ifft = NULL; g_free (self->frequency_response); self->frequency_response = NULL; g_free (self->fft_buffer); self->fft_buffer = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_audio_fx_base_fir_filter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); switch (prop_id) { case PROP_LOW_LATENCY:{ gboolean low_latency; if (GST_STATE (self) >= GST_STATE_PAUSED) { g_warning ("Changing the \"low-latency\" property " "is only allowed in states < PAUSED"); return; } GST_BASE_TRANSFORM_LOCK (self); low_latency = g_value_get_boolean (value); if (self->low_latency != low_latency) { self->low_latency = low_latency; gst_audio_fx_base_fir_filter_calculate_frequency_response (self); gst_audio_fx_base_fir_filter_select_process_function (self, GST_AUDIO_FILTER_CAST (self)->format.width, GST_AUDIO_FILTER_CAST (self)->format.channels); } GST_BASE_TRANSFORM_UNLOCK (self); break; } case PROP_DRAIN_ON_CHANGES:{ GST_BASE_TRANSFORM_LOCK (self); self->drain_on_changes = g_value_get_boolean (value); GST_BASE_TRANSFORM_UNLOCK (self); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_fx_base_fir_filter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (object); switch (prop_id) { case PROP_LOW_LATENCY: g_value_set_boolean (value, self->low_latency); break; case PROP_DRAIN_ON_CHANGES: g_value_set_boolean (value, self->drain_on_changes); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_fx_base_fir_filter_base_init (gpointer g_class) { GstCaps *caps; caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (g_class), caps); gst_caps_unref (caps); } static void gst_audio_fx_base_fir_filter_class_init (GstAudioFXBaseFIRFilterClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->dispose = gst_audio_fx_base_fir_filter_dispose; gobject_class->set_property = gst_audio_fx_base_fir_filter_set_property; gobject_class->get_property = gst_audio_fx_base_fir_filter_get_property; /** * GstAudioFXBaseFIRFilter::low-latency: * * Work in low-latency mode. This mode is much slower for large filter sizes * but the latency is always only the pre-latency of the filter. * * Since: 0.10.18 */ g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low latency", "Operate in low latency mode. This mode is slower but the " "latency will only be the filter pre-latency. " "Can only be changed in states < PAUSED!", DEFAULT_LOW_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstAudioFXBaseFIRFilter::drain-on-changes: * * Whether the filter should be drained when its coeficients change * * Note: Currently this only works if the kernel size is not changed! * Support for drainless kernel size changes will be added in the future. * * Since: 0.10.18 */ g_object_class_install_property (gobject_class, PROP_DRAIN_ON_CHANGES, g_param_spec_boolean ("drain-on-changes", "Drain on changes", "Drains the filter when its coeficients change", DEFAULT_DRAIN_ON_CHANGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->transform = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_start); trans_class->stop = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_stop); trans_class->event = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_event); trans_class->transform_size = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_transform_size); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_fx_base_fir_filter_setup); } static void gst_audio_fx_base_fir_filter_init (GstAudioFXBaseFIRFilter * self, GstAudioFXBaseFIRFilterClass * g_class) { self->kernel = NULL; self->buffer = NULL; self->buffer_length = 0; self->start_ts = GST_CLOCK_TIME_NONE; self->start_off = GST_BUFFER_OFFSET_NONE; self->nsamples_out = 0; self->nsamples_in = 0; self->low_latency = DEFAULT_LOW_LATENCY; self->drain_on_changes = DEFAULT_DRAIN_ON_CHANGES; gst_pad_set_query_function (GST_BASE_TRANSFORM (self)->srcpad, gst_audio_fx_base_fir_filter_query); gst_pad_set_query_type_function (GST_BASE_TRANSFORM (self)->srcpad, gst_audio_fx_base_fir_filter_query_type); } void gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter * self) { GstBuffer *outbuf; GstFlowReturn res; gint rate = GST_AUDIO_FILTER_CAST (self)->format.rate; gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; gint width = GST_AUDIO_FILTER_CAST (self)->format.width / 8; gint outsize, outsamples; guint8 *in, *out; if (channels == 0 || rate == 0 || self->nsamples_in == 0) { self->buffer_fill = 0; g_free (self->buffer); self->buffer = NULL; return; } /* Calculate the number of samples and their memory size that * should be pushed from the residue */ outsamples = self->nsamples_in - (self->nsamples_out - self->latency); if (outsamples <= 0) { self->buffer_fill = 0; g_free (self->buffer); self->buffer = NULL; return; } outsize = outsamples * channels * width; if (!self->fft || self->low_latency) { gint64 diffsize, diffsamples; /* Process the difference between latency and residue length samples * to start at the actual data instead of starting at the zeros before * when we only got one buffer smaller than latency */ diffsamples = ((gint64) self->latency) - ((gint64) self->buffer_fill) / channels; if (diffsamples > 0) { diffsize = diffsamples * channels * width; in = g_new0 (guint8, diffsize); out = g_new0 (guint8, diffsize); self->nsamples_out += self->process (self, in, out, diffsamples); g_free (in); g_free (out); } res = gst_pad_alloc_buffer (GST_BASE_TRANSFORM_CAST (self)->srcpad, GST_BUFFER_OFFSET_NONE, outsize, GST_PAD_CAPS (GST_BASE_TRANSFORM_CAST (self)->srcpad), &outbuf); if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_WARNING_OBJECT (self, "failed allocating buffer of %d bytes", outsize); self->buffer_fill = 0; return; } /* Convolve the residue with zeros to get the actual remaining data */ in = g_new0 (guint8, outsize); self->nsamples_out += self->process (self, in, GST_BUFFER_DATA (outbuf), outsamples); g_free (in); } else { guint gensamples = 0; guint8 *data; outbuf = gst_buffer_new_and_alloc (outsize); data = GST_BUFFER_DATA (outbuf); while (gensamples < outsamples) { guint step_insamples = self->block_length - self->buffer_fill; guint8 *zeroes = g_new0 (guint8, step_insamples * channels * width); guint8 *out = g_new (guint8, self->block_length * channels * width); guint step_gensamples; step_gensamples = self->process (self, zeroes, out, step_insamples); g_free (zeroes); memcpy (data + gensamples * width, out, MIN (step_gensamples, outsamples - gensamples) * width); gensamples += MIN (step_gensamples, outsamples - gensamples); g_free (out); } self->nsamples_out += gensamples; } /* Set timestamp, offset, etc from the values we * saved when processing the regular buffers */ if (GST_CLOCK_TIME_IS_VALID (self->start_ts)) GST_BUFFER_TIMESTAMP (outbuf) = self->start_ts; else GST_BUFFER_TIMESTAMP (outbuf) = 0; GST_BUFFER_TIMESTAMP (outbuf) += gst_util_uint64_scale_int (self->nsamples_out - outsamples - self->latency, GST_SECOND, rate); GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (outsamples, GST_SECOND, rate); if (self->start_off != GST_BUFFER_OFFSET_NONE) { GST_BUFFER_OFFSET (outbuf) = self->start_off + self->nsamples_out - outsamples - self->latency; GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET (outbuf) + outsamples; } GST_DEBUG_OBJECT (self, "Pushing residue buffer of size %d with timestamp: %" GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %" G_GUINT64_FORMAT ", offset_end: %" G_GUINT64_FORMAT ", nsamples_out: %d", GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), GST_BUFFER_OFFSET_END (outbuf), outsamples); res = gst_pad_push (GST_BASE_TRANSFORM_CAST (self)->srcpad, outbuf); if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_WARNING_OBJECT (self, "failed to push residue"); } self->buffer_fill = 0; } /* GstAudioFilter vmethod implementations */ /* get notified of caps and plug in the correct process function */ static gboolean gst_audio_fx_base_fir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); if (self->buffer) { gst_audio_fx_base_fir_filter_push_residue (self); g_free (self->buffer); self->buffer = NULL; self->buffer_fill = 0; self->buffer_length = 0; self->start_ts = GST_CLOCK_TIME_NONE; self->start_off = GST_BUFFER_OFFSET_NONE; self->nsamples_out = 0; self->nsamples_in = 0; } gst_audio_fx_base_fir_filter_select_process_function (self, format->width, format->channels); return (self->process != NULL); } /* GstBaseTransform vmethod implementations */ static gboolean gst_audio_fx_base_fir_filter_transform_size (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); guint blocklen; GstStructure *s; gint width, channels; if (!self->fft || self->low_latency || direction == GST_PAD_SRC) { *othersize = size; return TRUE; } s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "width", &width) || !gst_structure_get_int (s, "channels", &channels)) return FALSE; width /= 8; size /= width * channels; blocklen = self->block_length - self->kernel_length + 1; *othersize = ((size + blocklen - 1) / blocklen) * blocklen; *othersize *= width * channels; return TRUE; } static GstFlowReturn gst_audio_fx_base_fir_filter_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); GstClockTime timestamp, expected_timestamp; gint channels = GST_AUDIO_FILTER_CAST (self)->format.channels; gint rate = GST_AUDIO_FILTER_CAST (self)->format.rate; gint width = GST_AUDIO_FILTER_CAST (self)->format.width / 8; guint input_samples = (GST_BUFFER_SIZE (inbuf) / width) / channels; guint output_samples = (GST_BUFFER_SIZE (outbuf) / width) / channels; guint generated_samples; guint64 output_offset; gint64 diff = 0; GstClockTime stream_time; timestamp = GST_BUFFER_TIMESTAMP (outbuf); if (!GST_CLOCK_TIME_IS_VALID (timestamp) && !GST_CLOCK_TIME_IS_VALID (self->start_ts)) { GST_ERROR_OBJECT (self, "Invalid timestamp"); return GST_FLOW_ERROR; } stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (self, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (self), stream_time); g_return_val_if_fail (self->kernel != NULL, GST_FLOW_ERROR); g_return_val_if_fail (channels != 0, GST_FLOW_ERROR); if (GST_CLOCK_TIME_IS_VALID (self->start_ts)) expected_timestamp = self->start_ts + gst_util_uint64_scale_int (self->nsamples_in, GST_SECOND, rate); else expected_timestamp = GST_CLOCK_TIME_NONE; /* Reset the residue if already existing on discont buffers */ if (GST_BUFFER_IS_DISCONT (inbuf) || (GST_CLOCK_TIME_IS_VALID (expected_timestamp) && (ABS (GST_CLOCK_DIFF (timestamp, expected_timestamp) > 5 * GST_MSECOND)))) { GST_DEBUG_OBJECT (self, "Discontinuity detected - flushing"); if (GST_CLOCK_TIME_IS_VALID (expected_timestamp)) gst_audio_fx_base_fir_filter_push_residue (self); self->buffer_fill = 0; g_free (self->buffer); self->buffer = NULL; self->start_ts = timestamp; self->start_off = GST_BUFFER_OFFSET (inbuf); self->nsamples_out = 0; self->nsamples_in = 0; } else if (!GST_CLOCK_TIME_IS_VALID (self->start_ts)) { self->start_ts = timestamp; self->start_off = GST_BUFFER_OFFSET (inbuf); } self->nsamples_in += input_samples; generated_samples = self->process (self, GST_BUFFER_DATA (inbuf), GST_BUFFER_DATA (outbuf), input_samples); g_assert (generated_samples <= output_samples); self->nsamples_out += generated_samples; if (generated_samples == 0) return GST_BASE_TRANSFORM_FLOW_DROPPED; /* Calculate the number of samples we can push out now without outputting * latency zeros in the beginning */ diff = ((gint64) self->nsamples_out) - ((gint64) self->latency); if (diff < 0) { return GST_BASE_TRANSFORM_FLOW_DROPPED; } else if (diff < generated_samples) { gint64 tmp = diff; diff = generated_samples - diff; generated_samples = tmp; GST_BUFFER_DATA (outbuf) += diff * width * channels; } GST_BUFFER_SIZE (outbuf) = generated_samples * width * channels; output_offset = self->nsamples_out - self->latency - generated_samples; GST_BUFFER_TIMESTAMP (outbuf) = self->start_ts + gst_util_uint64_scale_int (output_offset, GST_SECOND, rate); GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (output_samples, GST_SECOND, rate); if (self->start_off != GST_BUFFER_OFFSET_NONE) { GST_BUFFER_OFFSET (outbuf) = self->start_off + output_offset; GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET (outbuf) + generated_samples; } else { GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE; } GST_DEBUG_OBJECT (self, "Pushing buffer of size %d with timestamp: %" GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %" G_GUINT64_FORMAT ", offset_end: %" G_GUINT64_FORMAT ", nsamples_out: %d", GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), GST_BUFFER_OFFSET_END (outbuf), generated_samples); return GST_FLOW_OK; } static gboolean gst_audio_fx_base_fir_filter_start (GstBaseTransform * base) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); self->buffer_fill = 0; g_free (self->buffer); self->buffer = NULL; self->start_ts = GST_CLOCK_TIME_NONE; self->start_off = GST_BUFFER_OFFSET_NONE; self->nsamples_out = 0; self->nsamples_in = 0; return TRUE; } static gboolean gst_audio_fx_base_fir_filter_stop (GstBaseTransform * base) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); g_free (self->buffer); self->buffer = NULL; self->buffer_length = 0; return TRUE; } static gboolean gst_audio_fx_base_fir_filter_query (GstPad * pad, GstQuery * query) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (gst_pad_get_parent (pad)); gboolean res = TRUE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { GstClockTime min, max; gboolean live; guint64 latency; GstPad *peer; gint rate = GST_AUDIO_FILTER (self)->format.rate; if (rate == 0) { res = FALSE; } else if ((peer = gst_pad_get_peer (GST_BASE_TRANSFORM (self)->sinkpad))) { if ((res = gst_pad_query (peer, query))) { gst_query_parse_latency (query, &live, &min, &max); GST_DEBUG_OBJECT (self, "Peer latency: min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min), GST_TIME_ARGS (max)); if (self->fft && !self->low_latency) latency = self->block_length - self->kernel_length + 1; else latency = self->latency; /* add our own latency */ latency = gst_util_uint64_scale_round (latency, GST_SECOND, rate); GST_DEBUG_OBJECT (self, "Our latency: %" GST_TIME_FORMAT, GST_TIME_ARGS (latency)); min += latency; if (max != GST_CLOCK_TIME_NONE) max += latency; GST_DEBUG_OBJECT (self, "Calculated total latency : min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min), GST_TIME_ARGS (max)); gst_query_set_latency (query, live, min, max); } gst_object_unref (peer); } break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (self); return res; } static const GstQueryType * gst_audio_fx_base_fir_filter_query_type (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_LATENCY, 0 }; return types; } static gboolean gst_audio_fx_base_fir_filter_event (GstBaseTransform * base, GstEvent * event) { GstAudioFXBaseFIRFilter *self = GST_AUDIO_FX_BASE_FIR_FILTER (base); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: gst_audio_fx_base_fir_filter_push_residue (self); self->start_ts = GST_CLOCK_TIME_NONE; self->start_off = GST_BUFFER_OFFSET_NONE; self->nsamples_out = 0; self->nsamples_in = 0; break; default: break; } return GST_BASE_TRANSFORM_CLASS (parent_class)->event (base, event); } void gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter * self, gdouble * kernel, guint kernel_length, guint64 latency) { gboolean latency_changed; g_return_if_fail (kernel != NULL); g_return_if_fail (self != NULL); GST_BASE_TRANSFORM_LOCK (self); latency_changed = (self->latency != latency || (!self->low_latency && self->kernel_length < FFT_THRESHOLD && kernel_length >= FFT_THRESHOLD) || (!self->low_latency && self->kernel_length >= FFT_THRESHOLD && kernel_length < FFT_THRESHOLD)); /* FIXME: If the latency changes, the buffer size changes too and we * have to drain in any case until this is fixed in the future */ if (self->buffer && (!self->drain_on_changes || latency_changed)) { gst_audio_fx_base_fir_filter_push_residue (self); self->start_ts = GST_CLOCK_TIME_NONE; self->start_off = GST_BUFFER_OFFSET_NONE; self->nsamples_out = 0; self->nsamples_in = 0; self->buffer_fill = 0; } g_free (self->kernel); if (!self->drain_on_changes || latency_changed) { g_free (self->buffer); self->buffer = NULL; self->buffer_fill = 0; self->buffer_length = 0; } self->kernel = kernel; self->kernel_length = kernel_length; gst_audio_fx_base_fir_filter_calculate_frequency_response (self); gst_audio_fx_base_fir_filter_select_process_function (self, GST_AUDIO_FILTER_CAST (self)->format.width, GST_AUDIO_FILTER_CAST (self)->format.channels); if (latency_changed) { self->latency = latency; gst_element_post_message (GST_ELEMENT (self), gst_message_new_latency (GST_OBJECT (self))); } GST_BASE_TRANSFORM_UNLOCK (self); } gst-plugins-good-0.10.31/gst/audiofx/audiopanorama.c0000644000175000017500000004653411677341654017251 00000000000000/* * GStreamer * Copyright (C) 2006 Stefan Kost * Copyright (C) 2006 Sebastian Dröge * * 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-audiopanorama * * Stereo panorama effect with controllable pan position. One can choose between the default psychoacoustic panning method, * which keeps the same perceived loudness, and a simple panning method that just controls the volume on one channel. * * * Example launch line * |[ * gst-launch audiotestsrc wave=saw ! audiopanorama panorama=-1.00 ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiopanorama panorama=-1.00 ! alsasink * gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama panorama=-1.00 ! audioconvert ! alsasink * gst-launch audiotestsrc wave=saw ! audioconvert ! audiopanorama method=simple panorama=-0.50 ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "audiopanorama.h" #define GST_CAT_DEFAULT gst_audio_panorama_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_PANORAMA, PROP_METHOD }; enum { METHOD_PSYCHOACOUSTIC = 0, METHOD_SIMPLE, NUM_METHODS }; #define GST_TYPE_AUDIO_PANORAMA_METHOD (gst_audio_panorama_method_get_type ()) static GType gst_audio_panorama_method_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {METHOD_PSYCHOACOUSTIC, "Psychoacoustic Panning (default)", "psychoacoustic"}, {METHOD_SIMPLE, "Simple Panning", "simple"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioPanoramaMethod", values); } return gtype; } static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "width = (int) 32; " "audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true") ); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) 2, " "endianness = (int) BYTE_ORDER, " "width = (int) 32; " "audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) 2, " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true") ); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_panorama_debug, "audiopanorama", 0, "audiopanorama element"); GST_BOILERPLATE_FULL (GstAudioPanorama, gst_audio_panorama, GstBaseTransform, GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); static void gst_audio_panorama_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_panorama_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_audio_panorama_get_unit_size (GstBaseTransform * base, GstCaps * caps, guint * size); static GstCaps *gst_audio_panorama_transform_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps); static gboolean gst_audio_panorama_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps); static void gst_audio_panorama_transform_m2s_int (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples); static void gst_audio_panorama_transform_s2s_int (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples); static void gst_audio_panorama_transform_m2s_float (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples); static void gst_audio_panorama_transform_s2s_float (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples); static void gst_audio_panorama_transform_m2s_int_simple (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples); static void gst_audio_panorama_transform_s2s_int_simple (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples); static void gst_audio_panorama_transform_m2s_float_simple (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples); static void gst_audio_panorama_transform_s2s_float_simple (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples); static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf); /* Table with processing functions: [channels][format][method] */ static GstAudioPanoramaProcessFunc panorama_process_functions[2][2][2] = { { {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_int, (GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_int_simple}, {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_float, (GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_m2s_float_simple} }, { {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_int, (GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_int_simple}, {(GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_float, (GstAudioPanoramaProcessFunc) gst_audio_panorama_transform_s2s_float_simple} } }; /* GObject vmethod implementations */ static void gst_audio_panorama_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "Stereo positioning", "Filter/Effect/Audio", "Positions audio streams in the stereo panorama", "Stefan Kost "); } static void gst_audio_panorama_class_init (GstAudioPanoramaClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_audio_panorama_set_property; gobject_class->get_property = gst_audio_panorama_get_property; g_object_class_install_property (gobject_class, PROP_PANORAMA, g_param_spec_float ("panorama", "Panorama", "Position in stereo panorama (-1.0 left -> 1.0 right)", -1.0, 1.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); /** * GstAudioPanorama:method * * Panning method: psychoacoustic mode keeps the same perceived loudness, * while simple mode just controls the volume of one channel. It's merely * a matter of taste which method should be chosen. * * Since: 0.10.6 **/ g_object_class_install_property (gobject_class, PROP_METHOD, g_param_spec_enum ("method", "Panning method", "Psychoacoustic mode keeps same perceived loudness, " "simple mode just controls volume of one channel.", GST_TYPE_AUDIO_PANORAMA_METHOD, METHOD_PSYCHOACOUSTIC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_BASE_TRANSFORM_CLASS (klass)->get_unit_size = GST_DEBUG_FUNCPTR (gst_audio_panorama_get_unit_size); GST_BASE_TRANSFORM_CLASS (klass)->transform_caps = GST_DEBUG_FUNCPTR (gst_audio_panorama_transform_caps); GST_BASE_TRANSFORM_CLASS (klass)->set_caps = GST_DEBUG_FUNCPTR (gst_audio_panorama_set_caps); GST_BASE_TRANSFORM_CLASS (klass)->transform = GST_DEBUG_FUNCPTR (gst_audio_panorama_transform); } static void gst_audio_panorama_init (GstAudioPanorama * filter, GstAudioPanoramaClass * klass) { filter->panorama = 0; filter->method = METHOD_PSYCHOACOUSTIC; filter->width = 0; filter->channels = 0; filter->format_float = FALSE; filter->process = NULL; gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); } static gboolean gst_audio_panorama_set_process_function (GstAudioPanorama * filter) { gint channel_index, format_index, method_index; /* set processing function */ channel_index = filter->channels - 1; if (channel_index > 1 || channel_index < 0) { filter->process = NULL; return FALSE; } format_index = (filter->format_float) ? 1 : 0; method_index = filter->method; if (method_index >= NUM_METHODS || method_index < 0) method_index = METHOD_PSYCHOACOUSTIC; filter->process = panorama_process_functions[channel_index][format_index][method_index]; return TRUE; } static void gst_audio_panorama_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (object); switch (prop_id) { case PROP_PANORAMA: filter->panorama = g_value_get_float (value); break; case PROP_METHOD: filter->method = g_value_get_enum (value); gst_audio_panorama_set_process_function (filter); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_panorama_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (object); switch (prop_id) { case PROP_PANORAMA: g_value_set_float (value, filter->panorama); break; case PROP_METHOD: g_value_set_enum (value, filter->method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstBaseTransform vmethod implementations */ static gboolean gst_audio_panorama_get_unit_size (GstBaseTransform * base, GstCaps * caps, guint * size) { gint width, channels; GstStructure *structure; gboolean ret; g_assert (size); /* this works for both float and int */ structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "width", &width); ret &= gst_structure_get_int (structure, "channels", &channels); *size = width * channels / 8; return ret; } static GstCaps * gst_audio_panorama_transform_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps) { GstCaps *res; GstStructure *structure; /* transform caps gives one single caps so we can just replace * the channel property with our range. */ res = gst_caps_copy (caps); structure = gst_caps_get_structure (res, 0); if (direction == GST_PAD_SRC) { GST_INFO ("allow 1-2 channels"); gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } else { GST_INFO ("allow 2 channels"); gst_structure_set (structure, "channels", G_TYPE_INT, 2, NULL); } return res; } static gboolean gst_audio_panorama_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); const GstStructure *structure; gboolean ret; gint width; const gchar *fmt; /*GST_INFO ("incaps are %" GST_PTR_FORMAT, incaps); */ structure = gst_caps_get_structure (incaps, 0); ret = gst_structure_get_int (structure, "channels", &filter->channels); if (!ret) goto no_channels; ret = gst_structure_get_int (structure, "width", &width); if (!ret) goto no_width; filter->width = width / 8; fmt = gst_structure_get_name (structure); if (!strcmp (fmt, "audio/x-raw-int")) filter->format_float = FALSE; else filter->format_float = TRUE; GST_DEBUG ("try to process %s input with %d channels", fmt, filter->channels); ret = gst_audio_panorama_set_process_function (filter); if (!ret) GST_WARNING ("can't process input with %d channels", filter->channels); return ret; no_channels: GST_DEBUG ("no channels in caps"); return ret; no_width: GST_DEBUG ("no width in caps"); return ret; } /* psychoacoustic processing functions */ static void gst_audio_panorama_transform_m2s_int (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples) { guint i; gdouble val; glong lval, rval; gdouble rpan, lpan; /* pan: -1.0 0.0 1.0 * lpan: 1.0 0.5 0.0 * rpan: 0.0 0.5 1.0 * * FIXME: we should use -3db (1/sqtr(2)) for 50:50 */ rpan = (gdouble) (filter->panorama + 1.0) / 2.0; lpan = 1.0 - rpan; for (i = 0; i < num_samples; i++) { val = (gdouble) * idata++; lval = (glong) (val * lpan); rval = (glong) (val * rpan); *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); } } static void gst_audio_panorama_transform_s2s_int (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples) { guint i; glong lval, rval; gdouble lival, rival; gdouble lrpan, llpan, rrpan, rlpan; /* pan: -1.0 0.0 1.0 * llpan: 1.0 1.0 0.0 * lrpan: 1.0 0.0 0.0 * rrpan: 0.0 1.0 1.0 * rlpan: 0.0 0.0 1.0 */ if (filter->panorama > 0) { rlpan = (gdouble) filter->panorama; llpan = 1.0 - rlpan; lrpan = 0.0; rrpan = 1.0; } else { rrpan = (gdouble) (1.0 + filter->panorama); lrpan = 1.0 - rrpan; rlpan = 0.0; llpan = 1.0; } for (i = 0; i < num_samples; i++) { lival = (gdouble) * idata++; rival = (gdouble) * idata++; lval = lival * llpan + rival * lrpan; rval = lival * rlpan + rival * rrpan; *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); } } static void gst_audio_panorama_transform_m2s_float (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples) { guint i; gfloat val; gdouble rpan, lpan; /* pan: -1.0 0.0 1.0 * lpan: 1.0 0.5 0.0 * rpan: 0.0 0.5 1.0 * * FIXME: we should use -3db (1/sqtr(2)) for 50:50 */ rpan = (gdouble) (filter->panorama + 1.0) / 2.0; lpan = 1.0 - rpan; for (i = 0; i < num_samples; i++) { val = *idata++; *odata++ = val * lpan; *odata++ = val * rpan; } } static void gst_audio_panorama_transform_s2s_float (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples) { guint i; gfloat lival, rival; gdouble lrpan, llpan, rrpan, rlpan; /* pan: -1.0 0.0 1.0 * llpan: 1.0 1.0 0.0 * lrpan: 1.0 0.0 0.0 * rrpan: 0.0 1.0 1.0 * rlpan: 0.0 0.0 1.0 */ if (filter->panorama > 0) { rlpan = (gdouble) filter->panorama; llpan = 1.0 - rlpan; lrpan = 0.0; rrpan = 1.0; } else { rrpan = (gdouble) (1.0 + filter->panorama); lrpan = 1.0 - rrpan; rlpan = 0.0; llpan = 1.0; } for (i = 0; i < num_samples; i++) { lival = *idata++; rival = *idata++; *odata++ = lival * llpan + rival * lrpan; *odata++ = lival * rlpan + rival * rrpan; } } /* simple processing functions */ static void gst_audio_panorama_transform_m2s_int_simple (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples) { guint i; gdouble pan; glong lval, rval; if (filter->panorama > 0.0) { pan = 1.0 - filter->panorama; for (i = 0; i < num_samples; i++) { rval = *idata++; lval = (glong) ((gdouble) rval * pan); *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); *odata++ = (gint16) rval; } } else { pan = 1.0 + filter->panorama; for (i = 0; i < num_samples; i++) { lval = *idata++; rval = (glong) ((gdouble) lval * pan); *odata++ = (gint16) lval; *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); } } } static void gst_audio_panorama_transform_s2s_int_simple (GstAudioPanorama * filter, gint16 * idata, gint16 * odata, guint num_samples) { guint i; glong lval, rval; gdouble lival, rival, pan; if (filter->panorama > 0.0) { pan = 1.0 - filter->panorama; for (i = 0; i < num_samples; i++) { lival = (gdouble) * idata++; rival = (gdouble) * idata++; lval = (glong) (lival * pan); rval = (glong) rival; *odata++ = (gint16) CLAMP (lval, G_MININT16, G_MAXINT16); *odata++ = (gint16) rval; } } else { pan = 1.0 + filter->panorama; for (i = 0; i < num_samples; i++) { lival = (gdouble) * idata++; rival = (gdouble) * idata++; lval = (glong) lival; rval = (glong) (rival * pan); *odata++ = (gint16) lval; *odata++ = (gint16) CLAMP (rval, G_MININT16, G_MAXINT16); } } } static void gst_audio_panorama_transform_m2s_float_simple (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples) { guint i; gfloat val, pan; if (filter->panorama > 0.0) { pan = 1.0 - filter->panorama; for (i = 0; i < num_samples; i++) { val = *idata++; *odata++ = val * pan; *odata++ = val; } } else { pan = 1.0 + filter->panorama; for (i = 0; i < num_samples; i++) { val = *idata++; *odata++ = val; *odata++ = val * pan; } } } static void gst_audio_panorama_transform_s2s_float_simple (GstAudioPanorama * filter, gfloat * idata, gfloat * odata, guint num_samples) { guint i; gfloat lival, rival, pan; if (filter->panorama > 0.0) { pan = 1.0 - filter->panorama; for (i = 0; i < num_samples; i++) { lival = *idata++; rival = *idata++; *odata++ = lival * pan; *odata++ = rival; } } else { pan = 1.0 + filter->panorama; for (i = 0; i < num_samples; i++) { lival = *idata++; rival = *idata++; *odata++ = lival; *odata++ = rival * pan; } } } /* this function does the actual processing */ static GstFlowReturn gst_audio_panorama_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf) { GstAudioPanorama *filter = GST_AUDIO_PANORAMA (base); guint num_samples = GST_BUFFER_SIZE (outbuf) / (2 * filter->width); GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (inbuf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP))) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf)); return GST_FLOW_OK; } filter->process (filter, GST_BUFFER_DATA (inbuf), GST_BUFFER_DATA (outbuf), num_samples); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/audiofx/audioecho.h0000644000175000017500000000431611671175353016361 00000000000000/* * GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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_AUDIO_ECHO_H__ #define __GST_AUDIO_ECHO_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_ECHO (gst_audio_echo_get_type()) #define GST_AUDIO_ECHO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_ECHO,GstAudioEcho)) #define GST_IS_AUDIO_ECHO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_ECHO)) #define GST_AUDIO_ECHO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_ECHO,GstAudioEchoClass)) #define GST_IS_AUDIO_ECHO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_ECHO)) #define GST_AUDIO_ECHO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_ECHO,GstAudioEchoClass)) typedef struct _GstAudioEcho GstAudioEcho; typedef struct _GstAudioEchoClass GstAudioEchoClass; typedef void (*GstAudioEchoProcessFunc) (GstAudioEcho *, guint8 *, guint); struct _GstAudioEcho { GstAudioFilter audiofilter; guint64 delay; guint64 max_delay; gfloat intensity; gfloat feedback; /* < private > */ GstAudioEchoProcessFunc process; guint delay_frames; guint8 *buffer; guint buffer_pos; guint buffer_size; guint buffer_size_frames; }; struct _GstAudioEchoClass { GstAudioFilterClass parent; }; GType gst_audio_echo_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_ECHO_H__ */ gst-plugins-good-0.10.31/gst/audiofx/math_compat.h0000644000175000017500000000245111671175353016713 00000000000000/* * GStreamer * Copyright (C) 2008 Sebastian Dröge * * 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 __MATH_COMPAT_H__ #define __MATH_COMPAT_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #ifndef HAVE_ASINH static inline gdouble asinh (gdouble x) { return log(x + sqrt (x * x + 1)); } #endif #ifndef HAVE_SINH static inline gdouble sinh (gdouble x) { return 0.5 * (exp (x) - exp (-x)); } #endif #ifndef HAVE_COSH static inline gdouble cosh (gdouble x) { return 0.5 * (exp (x) + exp (-x)); } #endif #endif /* __MATH_COMPAT_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audioinvert.h0000644000175000017500000000421411671175353016747 00000000000000/* * GStreamer * Copyright (C) 2007 Sebastian Dröge * Copyright (C) 2006 Stefan Kost * * 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_AUDIO_INVERT_H__ #define __GST_AUDIO_INVERT_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_INVERT (gst_audio_invert_get_type()) #define GST_AUDIO_INVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_INVERT,GstAudioInvert)) #define GST_IS_AUDIO_INVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_INVERT)) #define GST_AUDIO_INVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_INVERT,GstAudioInvertClass)) #define GST_IS_AUDIO_INVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_INVERT)) #define GST_AUDIO_INVERT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_INVERT,GstAudioInvertClass)) typedef struct _GstAudioInvert GstAudioInvert; typedef struct _GstAudioInvertClass GstAudioInvertClass; typedef void (*GstAudioInvertProcessFunc) (GstAudioInvert *, guint8 *, guint); struct _GstAudioInvert { GstAudioFilter audiofilter; gfloat degree; /* < private > */ GstAudioInvertProcessFunc process; }; struct _GstAudioInvertClass { GstAudioFilterClass parent; }; GType gst_audio_invert_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_INVERT_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiochebband.h0000644000175000017500000000431111671175353017164 00000000000000/* * GStreamer * Copyright (C) 2007-2009 Sebastian Dröge * * 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_AUDIO_CHEB_BAND_H__ #define __GST_AUDIO_CHEB_BAND_H__ #include #include #include #include #include "audiofxbaseiirfilter.h" G_BEGIN_DECLS #define GST_TYPE_AUDIO_CHEB_BAND (gst_audio_cheb_band_get_type()) #define GST_AUDIO_CHEB_BAND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CHEB_BAND,GstAudioChebBand)) #define GST_IS_AUDIO_CHEB_BAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CHEB_BAND)) #define GST_AUDIO_CHEB_BAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_CHEB_BAND,GstAudioChebBandClass)) #define GST_IS_AUDIO_CHEB_BAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_CHEB_BAND)) #define GST_AUDIO_CHEB_BAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_CHEB_BAND,GstAudioChebBandClass)) typedef struct _GstAudioChebBand GstAudioChebBand; typedef struct _GstAudioChebBandClass GstAudioChebBandClass; struct _GstAudioChebBand { GstAudioFXBaseIIRFilter parent; gint mode; gint type; gint poles; gfloat lower_frequency; gfloat upper_frequency; gfloat ripple; /* < private > */ GMutex *lock; }; struct _GstAudioChebBandClass { GstAudioFXBaseIIRFilterClass parent; }; GType gst_audio_cheb_band_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_CHEB_BAND_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiofxbasefirfilter.h0000644000175000017500000001002711671175353020616 00000000000000/* -*- c-basic-offset: 2 -*- * * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * 2006 Dreamlab Technologies Ltd. * 2009 Sebastian Dröge * * 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_AUDIO_FX_BASE_FIR_FILTER_H__ #define __GST_AUDIO_FX_BASE_FIR_FILTER_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_FX_BASE_FIR_FILTER \ (gst_audio_fx_base_fir_filter_get_type()) #define GST_AUDIO_FX_BASE_FIR_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER,GstAudioFXBaseFIRFilter)) #define GST_AUDIO_FX_BASE_FIR_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER,GstAudioFXBaseFIRFilterClass)) #define GST_IS_AUDIO_FX_BASE_FIR_FILTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER)) #define GST_IS_AUDIO_FX_BASE_FIR_FILTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_FX_BASE_FIR_FILTER)) typedef struct _GstAudioFXBaseFIRFilter GstAudioFXBaseFIRFilter; typedef struct _GstAudioFXBaseFIRFilterClass GstAudioFXBaseFIRFilterClass; typedef guint (*GstAudioFXBaseFIRFilterProcessFunc) (GstAudioFXBaseFIRFilter *, const guint8 *, guint8 *, guint); /** * GstAudioFXBaseFIRFilter: * * Opaque data structure. */ struct _GstAudioFXBaseFIRFilter { GstAudioFilter element; /* properties */ gdouble *kernel; /* filter kernel -- time domain */ guint kernel_length; /* length of the filter kernel -- time domain */ guint64 latency; /* pre-latency of the filter kernel */ gboolean low_latency; /* work in slower low latency mode */ gboolean drain_on_changes; /* If the filter should be drained when * coeficients change */ /* < private > */ GstAudioFXBaseFIRFilterProcessFunc process; gdouble *buffer; /* buffer for storing samples of previous buffers */ guint buffer_fill; /* fill level of buffer */ guint buffer_length; /* length of the buffer -- meaning depends on processing mode */ /* FFT convolution specific data */ GstFFTF64 *fft; GstFFTF64 *ifft; GstFFTF64Complex *frequency_response; /* filter kernel -- frequency domain */ guint frequency_response_length; /* length of filter kernel -- frequency domain */ GstFFTF64Complex *fft_buffer; /* FFT buffer, has the length of the frequency response */ guint block_length; /* Length of the processing blocks -- time domain */ GstClockTime start_ts; /* start timestamp after a discont */ guint64 start_off; /* start offset after a discont */ guint64 nsamples_out; /* number of output samples since last discont */ guint64 nsamples_in; /* number of input samples since last discont */ }; struct _GstAudioFXBaseFIRFilterClass { GstAudioFilterClass parent_class; }; GType gst_audio_fx_base_fir_filter_get_type (void); void gst_audio_fx_base_fir_filter_set_kernel (GstAudioFXBaseFIRFilter *filter, gdouble *kernel, guint kernel_length, guint64 latency); void gst_audio_fx_base_fir_filter_push_residue (GstAudioFXBaseFIRFilter *filter); G_END_DECLS #endif /* __GST_AUDIO_FX_BASE_FIR_FILTER_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiokaraoke.h0000644000175000017500000000442211671175353017056 00000000000000/* * GStreamer * Copyright (C) 2008 Wim Taymans * * 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_AUDIO_KARAOKE_H__ #define __GST_AUDIO_KARAOKE_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_KARAOKE (gst_audio_karaoke_get_type()) #define GST_AUDIO_KARAOKE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_KARAOKE,GstAudioKaraoke)) #define GST_IS_AUDIO_KARAOKE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_KARAOKE)) #define GST_AUDIO_KARAOKE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_KARAOKE,GstAudioKaraokeClass)) #define GST_IS_AUDIO_KARAOKE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_KARAOKE)) #define GST_AUDIO_KARAOKE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_KARAOKE,GstAudioKaraokeClass)) typedef struct _GstAudioKaraoke GstAudioKaraoke; typedef struct _GstAudioKaraokeClass GstAudioKaraokeClass; typedef void (*GstAudioKaraokeProcessFunc) (GstAudioKaraoke *, guint8 *, guint); struct _GstAudioKaraoke { GstAudioFilter audiofilter; gint channels; gint rate; /* properties */ gfloat level; gfloat mono_level; gfloat filter_band; gfloat filter_width; /* filter coef */ gfloat A, B, C; gfloat y1, y2; /* < private > */ GstAudioKaraokeProcessFunc process; }; struct _GstAudioKaraokeClass { GstAudioFilterClass parent; }; GType gst_audio_karaoke_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_KARAOKE_H__ */ gst-plugins-good-0.10.31/gst/audiofx/Makefile.in0000644000175000017500000013503311720560230016301 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # plugindir is set in configure VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/audiofx DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstaudiofx_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstaudiofx_la_OBJECTS = libgstaudiofx_la-audiofx.lo \ libgstaudiofx_la-audiopanorama.lo \ libgstaudiofx_la-audioinvert.lo \ libgstaudiofx_la-audioamplify.lo \ libgstaudiofx_la-audiodynamic.lo \ libgstaudiofx_la-audiokaraoke.lo \ libgstaudiofx_la-audiofxbaseiirfilter.lo \ libgstaudiofx_la-audiocheblimit.lo \ libgstaudiofx_la-audiochebband.lo \ libgstaudiofx_la-audioiirfilter.lo \ libgstaudiofx_la-audiofxbasefirfilter.lo \ libgstaudiofx_la-audiowsincband.lo \ libgstaudiofx_la-audiowsinclimit.lo \ libgstaudiofx_la-audiofirfilter.lo \ libgstaudiofx_la-audioecho.lo libgstaudiofx_la_OBJECTS = $(am_libgstaudiofx_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstaudiofx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) \ $(libgstaudiofx_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstaudiofx_la_SOURCES) DIST_SOURCES = $(libgstaudiofx_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstaudiofx.la # sources used to compile this plug-in libgstaudiofx_la_SOURCES = audiofx.c\ audiopanorama.c \ audioinvert.c \ audioamplify.c \ audiodynamic.c \ audiokaraoke.c \ audiofxbaseiirfilter.c \ audiocheblimit.c \ audiochebband.c \ audioiirfilter.c \ audiofxbasefirfilter.c \ audiowsincband.c \ audiowsinclimit.c \ audiofirfilter.c \ audioecho.c # flags used to compile this plugin libgstaudiofx_la_CFLAGS = $(GST_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstaudiofx_la_LIBADD = $(GST_LIBS) \ $(GST_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) \ -lgstfft-$(GST_MAJORMINOR) \ $(LIBM) libgstaudiofx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaudiofx_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = audiopanorama.h \ audioinvert.h \ audioamplify.h \ audiodynamic.h \ audiokaraoke.h \ audiofxbaseiirfilter.h \ audiocheblimit.h \ audiochebband.h \ audioiirfilter.h \ audiofxbasefirfilter.h \ audiowsincband.h \ audiowsinclimit.h \ audiofirfilter.h \ audioecho.h \ math_compat.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/audiofx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/audiofx/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstaudiofx.la: $(libgstaudiofx_la_OBJECTS) $(libgstaudiofx_la_DEPENDENCIES) $(EXTRA_libgstaudiofx_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstaudiofx_la_LINK) -rpath $(plugindir) $(libgstaudiofx_la_OBJECTS) $(libgstaudiofx_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioamplify.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiochebband.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiocheblimit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiodynamic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioecho.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofirfilter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioiirfilter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audioinvert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiokaraoke.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiopanorama.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiowsincband.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstaudiofx_la-audiofx.lo: audiofx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofx.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofx.Tpo -c -o libgstaudiofx_la-audiofx.lo `test -f 'audiofx.c' || echo '$(srcdir)/'`audiofx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofx.Tpo $(DEPDIR)/libgstaudiofx_la-audiofx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofx.c' object='libgstaudiofx_la-audiofx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofx.lo `test -f 'audiofx.c' || echo '$(srcdir)/'`audiofx.c libgstaudiofx_la-audiopanorama.lo: audiopanorama.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiopanorama.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiopanorama.Tpo -c -o libgstaudiofx_la-audiopanorama.lo `test -f 'audiopanorama.c' || echo '$(srcdir)/'`audiopanorama.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiopanorama.Tpo $(DEPDIR)/libgstaudiofx_la-audiopanorama.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiopanorama.c' object='libgstaudiofx_la-audiopanorama.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiopanorama.lo `test -f 'audiopanorama.c' || echo '$(srcdir)/'`audiopanorama.c libgstaudiofx_la-audioinvert.lo: audioinvert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioinvert.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioinvert.Tpo -c -o libgstaudiofx_la-audioinvert.lo `test -f 'audioinvert.c' || echo '$(srcdir)/'`audioinvert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioinvert.Tpo $(DEPDIR)/libgstaudiofx_la-audioinvert.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioinvert.c' object='libgstaudiofx_la-audioinvert.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioinvert.lo `test -f 'audioinvert.c' || echo '$(srcdir)/'`audioinvert.c libgstaudiofx_la-audioamplify.lo: audioamplify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioamplify.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioamplify.Tpo -c -o libgstaudiofx_la-audioamplify.lo `test -f 'audioamplify.c' || echo '$(srcdir)/'`audioamplify.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioamplify.Tpo $(DEPDIR)/libgstaudiofx_la-audioamplify.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioamplify.c' object='libgstaudiofx_la-audioamplify.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioamplify.lo `test -f 'audioamplify.c' || echo '$(srcdir)/'`audioamplify.c libgstaudiofx_la-audiodynamic.lo: audiodynamic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiodynamic.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiodynamic.Tpo -c -o libgstaudiofx_la-audiodynamic.lo `test -f 'audiodynamic.c' || echo '$(srcdir)/'`audiodynamic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiodynamic.Tpo $(DEPDIR)/libgstaudiofx_la-audiodynamic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiodynamic.c' object='libgstaudiofx_la-audiodynamic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiodynamic.lo `test -f 'audiodynamic.c' || echo '$(srcdir)/'`audiodynamic.c libgstaudiofx_la-audiokaraoke.lo: audiokaraoke.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiokaraoke.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiokaraoke.Tpo -c -o libgstaudiofx_la-audiokaraoke.lo `test -f 'audiokaraoke.c' || echo '$(srcdir)/'`audiokaraoke.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiokaraoke.Tpo $(DEPDIR)/libgstaudiofx_la-audiokaraoke.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiokaraoke.c' object='libgstaudiofx_la-audiokaraoke.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiokaraoke.lo `test -f 'audiokaraoke.c' || echo '$(srcdir)/'`audiokaraoke.c libgstaudiofx_la-audiofxbaseiirfilter.lo: audiofxbaseiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofxbaseiirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Tpo -c -o libgstaudiofx_la-audiofxbaseiirfilter.lo `test -f 'audiofxbaseiirfilter.c' || echo '$(srcdir)/'`audiofxbaseiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audiofxbaseiirfilter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofxbaseiirfilter.c' object='libgstaudiofx_la-audiofxbaseiirfilter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofxbaseiirfilter.lo `test -f 'audiofxbaseiirfilter.c' || echo '$(srcdir)/'`audiofxbaseiirfilter.c libgstaudiofx_la-audiocheblimit.lo: audiocheblimit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiocheblimit.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiocheblimit.Tpo -c -o libgstaudiofx_la-audiocheblimit.lo `test -f 'audiocheblimit.c' || echo '$(srcdir)/'`audiocheblimit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiocheblimit.Tpo $(DEPDIR)/libgstaudiofx_la-audiocheblimit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiocheblimit.c' object='libgstaudiofx_la-audiocheblimit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiocheblimit.lo `test -f 'audiocheblimit.c' || echo '$(srcdir)/'`audiocheblimit.c libgstaudiofx_la-audiochebband.lo: audiochebband.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiochebband.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiochebband.Tpo -c -o libgstaudiofx_la-audiochebband.lo `test -f 'audiochebband.c' || echo '$(srcdir)/'`audiochebband.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiochebband.Tpo $(DEPDIR)/libgstaudiofx_la-audiochebband.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiochebband.c' object='libgstaudiofx_la-audiochebband.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiochebband.lo `test -f 'audiochebband.c' || echo '$(srcdir)/'`audiochebband.c libgstaudiofx_la-audioiirfilter.lo: audioiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioiirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioiirfilter.Tpo -c -o libgstaudiofx_la-audioiirfilter.lo `test -f 'audioiirfilter.c' || echo '$(srcdir)/'`audioiirfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioiirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audioiirfilter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioiirfilter.c' object='libgstaudiofx_la-audioiirfilter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioiirfilter.lo `test -f 'audioiirfilter.c' || echo '$(srcdir)/'`audioiirfilter.c libgstaudiofx_la-audiofxbasefirfilter.lo: audiofxbasefirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofxbasefirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Tpo -c -o libgstaudiofx_la-audiofxbasefirfilter.lo `test -f 'audiofxbasefirfilter.c' || echo '$(srcdir)/'`audiofxbasefirfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audiofxbasefirfilter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofxbasefirfilter.c' object='libgstaudiofx_la-audiofxbasefirfilter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofxbasefirfilter.lo `test -f 'audiofxbasefirfilter.c' || echo '$(srcdir)/'`audiofxbasefirfilter.c libgstaudiofx_la-audiowsincband.lo: audiowsincband.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiowsincband.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiowsincband.Tpo -c -o libgstaudiofx_la-audiowsincband.lo `test -f 'audiowsincband.c' || echo '$(srcdir)/'`audiowsincband.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiowsincband.Tpo $(DEPDIR)/libgstaudiofx_la-audiowsincband.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiowsincband.c' object='libgstaudiofx_la-audiowsincband.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiowsincband.lo `test -f 'audiowsincband.c' || echo '$(srcdir)/'`audiowsincband.c libgstaudiofx_la-audiowsinclimit.lo: audiowsinclimit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiowsinclimit.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Tpo -c -o libgstaudiofx_la-audiowsinclimit.lo `test -f 'audiowsinclimit.c' || echo '$(srcdir)/'`audiowsinclimit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Tpo $(DEPDIR)/libgstaudiofx_la-audiowsinclimit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiowsinclimit.c' object='libgstaudiofx_la-audiowsinclimit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiowsinclimit.lo `test -f 'audiowsinclimit.c' || echo '$(srcdir)/'`audiowsinclimit.c libgstaudiofx_la-audiofirfilter.lo: audiofirfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audiofirfilter.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audiofirfilter.Tpo -c -o libgstaudiofx_la-audiofirfilter.lo `test -f 'audiofirfilter.c' || echo '$(srcdir)/'`audiofirfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audiofirfilter.Tpo $(DEPDIR)/libgstaudiofx_la-audiofirfilter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audiofirfilter.c' object='libgstaudiofx_la-audiofirfilter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audiofirfilter.lo `test -f 'audiofirfilter.c' || echo '$(srcdir)/'`audiofirfilter.c libgstaudiofx_la-audioecho.lo: audioecho.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -MT libgstaudiofx_la-audioecho.lo -MD -MP -MF $(DEPDIR)/libgstaudiofx_la-audioecho.Tpo -c -o libgstaudiofx_la-audioecho.lo `test -f 'audioecho.c' || echo '$(srcdir)/'`audioecho.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiofx_la-audioecho.Tpo $(DEPDIR)/libgstaudiofx_la-audioecho.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='audioecho.c' object='libgstaudiofx_la-audioecho.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiofx_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiofx_la_CFLAGS) $(CFLAGS) -c -o libgstaudiofx_la-audioecho.lo `test -f 'audioecho.c' || echo '$(srcdir)/'`audioecho.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstaudiofx -:SHARED libgstaudiofx \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstaudiofx_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstaudiofx_la_CFLAGS) \ -:LDFLAGS $(libgstaudiofx_la_LDFLAGS) \ $(libgstaudiofx_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/audiofx/audiopanorama.h0000644000175000017500000000423711671175353017243 00000000000000/* * GStreamer * Copyright (C) 2006 Stefan Kost * * 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_AUDIO_PANORAMA_H__ #define __GST_AUDIO_PANORAMA_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_AUDIO_PANORAMA (gst_audio_panorama_get_type()) #define GST_AUDIO_PANORAMA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_PANORAMA,GstAudioPanorama)) #define GST_IS_AUDIO_PANORAMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_PANORAMA)) #define GST_AUDIO_PANORAMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_AUDIO_PANORAMA,GstAudioPanoramaClass)) #define GST_IS_AUDIO_PANORAMA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_AUDIO_PANORAMA)) #define GST_AUDIO_PANORAMA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_AUDIO_PANORAMA,GstAudioPanoramaClass)) typedef struct _GstAudioPanorama GstAudioPanorama; typedef struct _GstAudioPanoramaClass GstAudioPanoramaClass; typedef void (*GstAudioPanoramaProcessFunc)(GstAudioPanorama*, guint8*, guint8*, guint); struct _GstAudioPanorama { GstBaseTransform element; gfloat panorama; /* < private > */ GstAudioPanoramaProcessFunc process; gint channels; gboolean format_float; gint width; gint method; }; struct _GstAudioPanoramaClass { GstBaseTransformClass parent_class; }; GType gst_audio_panorama_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_PANORAMA_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audioiirfilter.c0000644000175000017500000002064211677341654017434 00000000000000/* * GStreamer * Copyright (C) 2009 Sebastian Dröge * * 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-audioiirfilter * * audioiirfilter implements a generic audio IIR filter. Before usage the * "a" and "b" properties have to be set to the filter coefficients that * should be used. * * The filter coefficients describe the numerator and denominator of the * transfer function. * * To change the filter coefficients whenever the sampling rate changes the * "rate-changed" signal can be used. This should be done for most * IIR filters as they're depending on the sampling rate. * * * Example application * |[ * * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audioiirfilter.h" #include "gst/glib-compat-private.h" #define GST_CAT_DEFAULT gst_audio_iir_filter_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { SIGNAL_RATE_CHANGED, LAST_SIGNAL }; enum { PROP_0, PROP_A, PROP_B }; static guint gst_audio_iir_filter_signals[LAST_SIGNAL] = { 0, }; #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_iir_filter_debug, "audioiirfilter", 0, \ "Generic audio IIR filter plugin"); GST_BOILERPLATE_FULL (GstAudioIIRFilter, gst_audio_iir_filter, GstAudioFilter, GST_TYPE_AUDIO_FX_BASE_IIR_FILTER, DEBUG_INIT); static void gst_audio_iir_filter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_iir_filter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_iir_filter_finalize (GObject * object); static gboolean gst_audio_iir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format); /* Element class */ static void gst_audio_iir_filter_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Audio IIR filter", "Filter/Effect/Audio", "Generic audio IIR filter with custom filter kernel", "Sebastian Dröge "); } static void gst_audio_iir_filter_class_init (GstAudioIIRFilterClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_iir_filter_set_property; gobject_class->get_property = gst_audio_iir_filter_get_property; gobject_class->finalize = gst_audio_iir_filter_finalize; g_object_class_install_property (gobject_class, PROP_A, g_param_spec_value_array ("a", "A", "Filter coefficients (numerator of transfer function)", g_param_spec_double ("Coefficient", "Filter Coefficient", "Filter coefficient", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_B, g_param_spec_value_array ("b", "B", "Filter coefficients (denominator of transfer function)", g_param_spec_double ("Coefficient", "Filter Coefficient", "Filter coefficient", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_iir_filter_setup); /** * GstAudioIIRFilter::rate-changed: * @filter: the filter on which the signal is emitted * @rate: the new sampling rate * * Will be emitted when the sampling rate changes. The callbacks * will be called from the streaming thread and processing will * stop until the event is handled. */ gst_audio_iir_filter_signals[SIGNAL_RATE_CHANGED] = g_signal_new ("rate-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstAudioIIRFilterClass, rate_changed), NULL, NULL, gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); } static void gst_audio_iir_filter_update_coefficients (GstAudioIIRFilter * self, GValueArray * va, GValueArray * vb) { gdouble *a = NULL, *b = NULL; guint i; if (va) { if (self->a) g_value_array_free (self->a); self->a = va; } if (vb) { if (self->b) g_value_array_free (self->b); self->b = vb; } if (self->a && self->a->n_values > 0) { a = g_new (gdouble, self->a->n_values); for (i = 0; i < self->a->n_values; i++) { GValue *v = g_value_array_get_nth (self->a, i); a[i] = g_value_get_double (v); } } if (self->b && self->b->n_values > 0) { b = g_new (gdouble, self->b->n_values); for (i = 0; i < self->b->n_values; i++) { GValue *v = g_value_array_get_nth (self->b, i); b[i] = g_value_get_double (v); } } gst_audio_fx_base_iir_filter_set_coefficients (GST_AUDIO_FX_BASE_IIR_FILTER (self), a, (self->a) ? self->a->n_values : 0, b, (self->b) ? self->b->n_values : 0); } static void gst_audio_iir_filter_init (GstAudioIIRFilter * self, GstAudioIIRFilterClass * g_class) { GValue v = { 0, }; GValueArray *a, *b; a = g_value_array_new (1); g_value_init (&v, G_TYPE_DOUBLE); g_value_set_double (&v, 1.0); g_value_array_append (a, &v); g_value_unset (&v); b = NULL; gst_audio_iir_filter_update_coefficients (self, a, b); self->lock = g_mutex_new (); } /* GstAudioFilter vmethod implementations */ /* get notified of caps and plug in the correct process function */ static gboolean gst_audio_iir_filter_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (base); if (self->rate != format->rate) { g_signal_emit (G_OBJECT (self), gst_audio_iir_filter_signals[SIGNAL_RATE_CHANGED], 0, format->rate); self->rate = format->rate; } return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); } static void gst_audio_iir_filter_finalize (GObject * object) { GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (object); g_mutex_free (self->lock); self->lock = NULL; if (self->a) g_value_array_free (self->a); self->a = NULL; if (self->b) g_value_array_free (self->b); self->b = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_iir_filter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (object); g_return_if_fail (GST_IS_AUDIO_IIR_FILTER (self)); switch (prop_id) { case PROP_A: g_mutex_lock (self->lock); gst_audio_iir_filter_update_coefficients (self, g_value_dup_boxed (value), NULL); g_mutex_unlock (self->lock); break; case PROP_B: g_mutex_lock (self->lock); gst_audio_iir_filter_update_coefficients (self, NULL, g_value_dup_boxed (value)); g_mutex_unlock (self->lock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_iir_filter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioIIRFilter *self = GST_AUDIO_IIR_FILTER (object); switch (prop_id) { case PROP_A: g_value_set_boxed (value, self->a); break; case PROP_B: g_value_set_boxed (value, self->b); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/audiofx/audiowsinclimit.h0000644000175000017500000000466411671175353017633 00000000000000/* -*- c-basic-offset: 2 -*- * * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * 2006 Dreamlab Technologies Ltd. * 2007-2009 Sebastian Dröge * * 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. * * * this windowed sinc filter is taken from the freely downloadable DSP book, * "The Scientist and Engineer's Guide to Digital Signal Processing", * chapter 16 * available at http://www.dspguide.com/ * */ #ifndef __GST_AUDIO_WSINC_LIMIT_H__ #define __GST_AUDIO_WSINC_LIMIT_H__ #include #include #include "audiofxbasefirfilter.h" G_BEGIN_DECLS #define GST_TYPE_AUDIO_WSINC_LIMIT \ (gst_audio_wsinclimit_get_type()) #define GST_AUDIO_WSINC_LIMIT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_WSINC_LIMIT,GstAudioWSincLimit)) #define GST_AUDIO_WSINC_LIMIT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_WSINC_LIMIT,GstAudioWSincLimitClass)) #define GST_IS_AUDIO_WSINC_LIMIT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_WSINC_LIMIT)) #define GST_IS_AUDIO_WSINC_LIMIT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_WSINC_LIMIT)) typedef struct _GstAudioWSincLimit GstAudioWSincLimit; typedef struct _GstAudioWSincLimitClass GstAudioWSincLimitClass; /** * GstAudioWSincLimit: * * Opaque data structure. */ struct _GstAudioWSincLimit { GstAudioFXBaseFIRFilter parent; gint mode; gint window; gfloat cutoff; gint kernel_length; /* < private > */ GMutex *lock; }; struct _GstAudioWSincLimitClass { GstAudioFXBaseFIRFilterClass parent; }; GType gst_audio_wsinclimit_get_type (void); G_END_DECLS #endif /* __GST_AUDIO_WSINC_LIMIT_H__ */ gst-plugins-good-0.10.31/gst/audiofx/audiowsinclimit.c0000644000175000017500000003027411677341654017627 00000000000000/* -*- c-basic-offset: 2 -*- * * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * 2006 Dreamlab Technologies Ltd. * 2007-2009 Sebastian Dröge * * 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. * * * this windowed sinc filter is taken from the freely downloadable DSP book, * "The Scientist and Engineer's Guide to Digital Signal Processing", * chapter 16 * available at http://www.dspguide.com/ * * For the window functions see * http://en.wikipedia.org/wiki/Window_function */ /** * SECTION:element-audiowsinclimit * * Attenuates all frequencies above the cutoff frequency (low-pass) or all frequencies below the * cutoff frequency (high-pass). The length parameter controls the rolloff, the window parameter * controls rolloff and stopband attenuation. The Hamming window provides a faster rolloff but a bit * worse stopband attenuation, the other way around for the Blackman window. * * This element has the advantage over the Chebyshev lowpass and highpass filter that it has * a much better rolloff when using a larger kernel size and almost linear phase. The only * disadvantage is the much slower execution time with larger kernels. * * * Example launch line * |[ * gst-launch audiotestsrc freq=1500 ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=501 ! audioconvert ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiowsinclimit mode=high-pass frequency=15000 length=501 ! audioconvert ! alsasink * gst-launch audiotestsrc wave=white-noise ! audioconvert ! audiowsinclimit mode=low-pass frequency=1000 length=10001 window=blackman ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audiowsinclimit.h" #include "gst/glib-compat-private.h" #define GST_CAT_DEFAULT gst_audio_wsinclimit_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); enum { PROP_0, PROP_LENGTH, PROP_FREQUENCY, PROP_MODE, PROP_WINDOW }; enum { MODE_LOW_PASS = 0, MODE_HIGH_PASS }; #define GST_TYPE_AUDIO_WSINC_LIMIT_MODE (gst_audio_wsinclimit_mode_get_type ()) static GType gst_audio_wsinclimit_mode_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {MODE_LOW_PASS, "Low pass (default)", "low-pass"}, {MODE_HIGH_PASS, "High pass", "high-pass"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioWSincLimitMode", values); } return gtype; } enum { WINDOW_HAMMING = 0, WINDOW_BLACKMAN, WINDOW_GAUSSIAN, WINDOW_COSINE, WINDOW_HANN }; #define GST_TYPE_AUDIO_WSINC_LIMIT_WINDOW (gst_audio_wsinclimit_window_get_type ()) static GType gst_audio_wsinclimit_window_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {WINDOW_HAMMING, "Hamming window (default)", "hamming"}, {WINDOW_BLACKMAN, "Blackman window", "blackman"}, {WINDOW_GAUSSIAN, "Gaussian window", "gaussian"}, {WINDOW_COSINE, "Cosine window", "cosine"}, {WINDOW_HANN, "Hann window", "hann"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioWSincLimitWindow", values); } return gtype; } #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_wsinclimit_debug, "audiowsinclimit", 0, \ "Low-pass and High-pass Windowed sinc filter plugin"); GST_BOILERPLATE_FULL (GstAudioWSincLimit, gst_audio_wsinclimit, GstAudioFilter, GST_TYPE_AUDIO_FX_BASE_FIR_FILTER, DEBUG_INIT); static void gst_audio_wsinclimit_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_wsinclimit_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_audio_wsinclimit_finalize (GObject * object); static gboolean gst_audio_wsinclimit_setup (GstAudioFilter * base, GstRingBufferSpec * format); #define POW2(x) (x)*(x) /* Element class */ static void gst_audio_wsinclimit_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Low pass & high pass filter", "Filter/Effect/Audio", "Low pass and high pass windowed sinc filter", "Thomas Vander Stichele , " "Steven W. Smith, " "Dreamlab Technologies Ltd. , " "Sebastian Dröge "); } static void gst_audio_wsinclimit_class_init (GstAudioWSincLimitClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAudioFilterClass *filter_class = (GstAudioFilterClass *) klass; gobject_class->set_property = gst_audio_wsinclimit_set_property; gobject_class->get_property = gst_audio_wsinclimit_get_property; gobject_class->finalize = gst_audio_wsinclimit_finalize; /* FIXME: Don't use the complete possible range but restrict the upper boundary * so automatically generated UIs can use a slider */ g_object_class_install_property (gobject_class, PROP_FREQUENCY, g_param_spec_float ("cutoff", "Cutoff", "Cut-off Frequency (Hz)", 0.0, 100000.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_LENGTH, g_param_spec_int ("length", "Length", "Filter kernel length, will be rounded to the next odd number", 3, 256000, 101, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Low pass or high pass mode", GST_TYPE_AUDIO_WSINC_LIMIT_MODE, MODE_LOW_PASS, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_WINDOW, g_param_spec_enum ("window", "Window", "Window function to use", GST_TYPE_AUDIO_WSINC_LIMIT_WINDOW, WINDOW_HAMMING, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); filter_class->setup = GST_DEBUG_FUNCPTR (gst_audio_wsinclimit_setup); } static void gst_audio_wsinclimit_init (GstAudioWSincLimit * self, GstAudioWSincLimitClass * g_class) { self->mode = MODE_LOW_PASS; self->window = WINDOW_HAMMING; self->kernel_length = 101; self->cutoff = 0.0; self->lock = g_mutex_new (); } static void gst_audio_wsinclimit_build_kernel (GstAudioWSincLimit * self) { gint i = 0; gdouble sum = 0.0; gint len = 0; gdouble w; gdouble *kernel = NULL; len = self->kernel_length; if (GST_AUDIO_FILTER (self)->format.rate == 0) { GST_DEBUG ("rate not set yet"); return; } if (GST_AUDIO_FILTER (self)->format.channels == 0) { GST_DEBUG ("channels not set yet"); return; } /* Clamp cutoff frequency between 0 and the nyquist frequency */ self->cutoff = CLAMP (self->cutoff, 0.0, GST_AUDIO_FILTER (self)->format.rate / 2); GST_DEBUG ("gst_audio_wsinclimit_: initializing filter kernel of length %d " "with cutoff %.2lf Hz " "for mode %s", len, self->cutoff, (self->mode == MODE_LOW_PASS) ? "low-pass" : "high-pass"); /* fill the kernel */ w = 2 * G_PI * (self->cutoff / GST_AUDIO_FILTER (self)->format.rate); kernel = g_new (gdouble, len); for (i = 0; i < len; ++i) { if (i == (len - 1) / 2.0) kernel[i] = w; else kernel[i] = sin (w * (i - (len - 1) / 2)) / (i - (len - 1) / 2.0); /* windowing */ switch (self->window) { case WINDOW_HAMMING: kernel[i] *= (0.54 - 0.46 * cos (2 * G_PI * i / (len - 1))); break; case WINDOW_BLACKMAN: kernel[i] *= (0.42 - 0.5 * cos (2 * G_PI * i / (len - 1)) + 0.08 * cos (4 * G_PI * i / (len - 1))); break; case WINDOW_GAUSSIAN: kernel[i] *= exp (-0.5 * POW2 (3.0 / len * (2 * i - (len - 1)))); break; case WINDOW_COSINE: kernel[i] *= cos (G_PI * i / (len - 1) - G_PI / 2); break; case WINDOW_HANN: kernel[i] *= 0.5 * (1 - cos (2 * G_PI * i / (len - 1))); break; } } /* normalize for unity gain at DC */ for (i = 0; i < len; ++i) sum += kernel[i]; for (i = 0; i < len; ++i) kernel[i] /= sum; /* convert to highpass if specified */ if (self->mode == MODE_HIGH_PASS) { for (i = 0; i < len; ++i) kernel[i] = -kernel[i]; if (len % 2 == 1) { kernel[(len - 1) / 2] += 1.0; } else { kernel[len / 2 - 1] += 0.5; kernel[len / 2] += 0.5; } } gst_audio_fx_base_fir_filter_set_kernel (GST_AUDIO_FX_BASE_FIR_FILTER (self), kernel, self->kernel_length, (len - 1) / 2); } /* GstAudioFilter vmethod implementations */ /* get notified of caps and plug in the correct process function */ static gboolean gst_audio_wsinclimit_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (base); gst_audio_wsinclimit_build_kernel (self); return GST_AUDIO_FILTER_CLASS (parent_class)->setup (base, format); } static void gst_audio_wsinclimit_finalize (GObject * object) { GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (object); g_mutex_free (self->lock); self->lock = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_audio_wsinclimit_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (object); g_return_if_fail (GST_IS_AUDIO_WSINC_LIMIT (self)); switch (prop_id) { case PROP_LENGTH:{ gint val; g_mutex_lock (self->lock); val = g_value_get_int (value); if (val % 2 == 0) val++; if (val != self->kernel_length) { gst_audio_fx_base_fir_filter_push_residue (GST_AUDIO_FX_BASE_FIR_FILTER (self)); self->kernel_length = val; gst_audio_wsinclimit_build_kernel (self); } g_mutex_unlock (self->lock); break; } case PROP_FREQUENCY: g_mutex_lock (self->lock); self->cutoff = g_value_get_float (value); gst_audio_wsinclimit_build_kernel (self); g_mutex_unlock (self->lock); break; case PROP_MODE: g_mutex_lock (self->lock); self->mode = g_value_get_enum (value); gst_audio_wsinclimit_build_kernel (self); g_mutex_unlock (self->lock); break; case PROP_WINDOW: g_mutex_lock (self->lock); self->window = g_value_get_enum (value); gst_audio_wsinclimit_build_kernel (self); g_mutex_unlock (self->lock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_wsinclimit_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioWSincLimit *self = GST_AUDIO_WSINC_LIMIT (object); switch (prop_id) { case PROP_LENGTH: g_value_set_int (value, self->kernel_length); break; case PROP_FREQUENCY: g_value_set_float (value, self->cutoff); break; case PROP_MODE: g_value_set_enum (value, self->mode); break; case PROP_WINDOW: g_value_set_enum (value, self->window); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/audiofx/audiodynamic.c0000644000175000017500000005373311671175353017071 00000000000000/* * GStreamer * Copyright (C) 2007 Sebastian Dröge * * 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-audiodynamic * * This element can act as a compressor or expander. A compressor changes the * amplitude of all samples above a specific threshold with a specific ratio, * a expander does the same for all samples below a specific threshold. If * soft-knee mode is selected the ratio is applied smoothly. * * * Example launch line * |[ * gst-launch audiotestsrc wave=saw ! audiodynamic characteristics=soft-knee mode=compressor threshold=0.5 rate=0.5 ! alsasink * gst-launch filesrc location="melo1.ogg" ! oggdemux ! vorbisdec ! audioconvert ! audiodynamic characteristics=hard-knee mode=expander threshold=0.2 rate=4.0 ! alsasink * gst-launch audiotestsrc wave=saw ! audioconvert ! audiodynamic ! audioconvert ! alsasink * ]| * */ /* TODO: Implement attack and release parameters */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "audiodynamic.h" #define GST_CAT_DEFAULT gst_audio_dynamic_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_CHARACTERISTICS, PROP_MODE, PROP_THRESHOLD, PROP_RATIO }; #define ALLOWED_CAPS \ "audio/x-raw-int," \ " depth=(int)16," \ " width=(int)16," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-float," \ " width=(int)32," \ " endianness=(int)BYTE_ORDER," \ " rate=(int)[1,MAX]," \ " channels=(int)[1,MAX]" #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_audio_dynamic_debug, "audiodynamic", 0, "audiodynamic element"); GST_BOILERPLATE_FULL (GstAudioDynamic, gst_audio_dynamic, GstAudioFilter, GST_TYPE_AUDIO_FILTER, DEBUG_INIT); static void gst_audio_dynamic_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_audio_dynamic_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_audio_dynamic_setup (GstAudioFilter * filter, GstRingBufferSpec * format); static GstFlowReturn gst_audio_dynamic_transform_ip (GstBaseTransform * base, GstBuffer * buf); static void gst_audio_dynamic_transform_hard_knee_compressor_int (GstAudioDynamic * filter, gint16 * data, guint num_samples); static void gst_audio_dynamic_transform_hard_knee_compressor_float (GstAudioDynamic * filter, gfloat * data, guint num_samples); static void gst_audio_dynamic_transform_soft_knee_compressor_int (GstAudioDynamic * filter, gint16 * data, guint num_samples); static void gst_audio_dynamic_transform_soft_knee_compressor_float (GstAudioDynamic * filter, gfloat * data, guint num_samples); static void gst_audio_dynamic_transform_hard_knee_expander_int (GstAudioDynamic * filter, gint16 * data, guint num_samples); static void gst_audio_dynamic_transform_hard_knee_expander_float (GstAudioDynamic * filter, gfloat * data, guint num_samples); static void gst_audio_dynamic_transform_soft_knee_expander_int (GstAudioDynamic * filter, gint16 * data, guint num_samples); static void gst_audio_dynamic_transform_soft_knee_expander_float (GstAudioDynamic * filter, gfloat * data, guint num_samples); static GstAudioDynamicProcessFunc process_functions[] = { (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_hard_knee_compressor_int, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_hard_knee_compressor_float, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_soft_knee_compressor_int, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_soft_knee_compressor_float, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_hard_knee_expander_int, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_hard_knee_expander_float, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_soft_knee_expander_int, (GstAudioDynamicProcessFunc) gst_audio_dynamic_transform_soft_knee_expander_float }; enum { CHARACTERISTICS_HARD_KNEE = 0, CHARACTERISTICS_SOFT_KNEE }; #define GST_TYPE_AUDIO_DYNAMIC_CHARACTERISTICS (gst_audio_dynamic_characteristics_get_type ()) static GType gst_audio_dynamic_characteristics_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {CHARACTERISTICS_HARD_KNEE, "Hard Knee (default)", "hard-knee"}, {CHARACTERISTICS_SOFT_KNEE, "Soft Knee (smooth)", "soft-knee"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioDynamicCharacteristics", values); } return gtype; } enum { MODE_COMPRESSOR = 0, MODE_EXPANDER }; #define GST_TYPE_AUDIO_DYNAMIC_MODE (gst_audio_dynamic_mode_get_type ()) static GType gst_audio_dynamic_mode_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {MODE_COMPRESSOR, "Compressor (default)", "compressor"}, {MODE_EXPANDER, "Expander", "expander"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstAudioDynamicMode", values); } return gtype; } static gboolean gst_audio_dynamic_set_process_function (GstAudioDynamic * filter) { gint func_index; func_index = (filter->mode == MODE_COMPRESSOR) ? 0 : 4; func_index += (filter->characteristics == CHARACTERISTICS_HARD_KNEE) ? 0 : 2; func_index += (GST_AUDIO_FILTER (filter)->format.type == GST_BUFTYPE_FLOAT) ? 1 : 0; if (func_index >= 0 && func_index < 8) { filter->process = process_functions[func_index]; return TRUE; } return FALSE; } /* GObject vmethod implementations */ static void gst_audio_dynamic_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstCaps *caps; gst_element_class_set_details_simple (element_class, "Dynamic range controller", "Filter/Effect/Audio", "Compressor and Expander", "Sebastian Dröge "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (klass), caps); gst_caps_unref (caps); } static void gst_audio_dynamic_class_init (GstAudioDynamicClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_audio_dynamic_set_property; gobject_class->get_property = gst_audio_dynamic_get_property; g_object_class_install_property (gobject_class, PROP_CHARACTERISTICS, g_param_spec_enum ("characteristics", "Characteristics", "Selects whether the ratio should be applied smooth (soft-knee) " "or hard (hard-knee).", GST_TYPE_AUDIO_DYNAMIC_CHARACTERISTICS, CHARACTERISTICS_HARD_KNEE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Selects whether the filter should work on loud samples (compressor) or" "quiet samples (expander).", GST_TYPE_AUDIO_DYNAMIC_MODE, MODE_COMPRESSOR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_THRESHOLD, g_param_spec_float ("threshold", "Threshold", "Threshold until the filter is activated", 0.0, 1.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RATIO, g_param_spec_float ("ratio", "Ratio", "Ratio that should be applied", 0.0, G_MAXFLOAT, 1.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); GST_AUDIO_FILTER_CLASS (klass)->setup = GST_DEBUG_FUNCPTR (gst_audio_dynamic_setup); GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = GST_DEBUG_FUNCPTR (gst_audio_dynamic_transform_ip); } static void gst_audio_dynamic_init (GstAudioDynamic * filter, GstAudioDynamicClass * klass) { filter->ratio = 1.0; filter->threshold = 0.0; filter->characteristics = CHARACTERISTICS_HARD_KNEE; filter->mode = MODE_COMPRESSOR; gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE); gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); } static void gst_audio_dynamic_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (object); switch (prop_id) { case PROP_CHARACTERISTICS: filter->characteristics = g_value_get_enum (value); gst_audio_dynamic_set_process_function (filter); break; case PROP_MODE: filter->mode = g_value_get_enum (value); gst_audio_dynamic_set_process_function (filter); break; case PROP_THRESHOLD: filter->threshold = g_value_get_float (value); break; case PROP_RATIO: filter->ratio = g_value_get_float (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_audio_dynamic_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (object); switch (prop_id) { case PROP_CHARACTERISTICS: g_value_set_enum (value, filter->characteristics); break; case PROP_MODE: g_value_set_enum (value, filter->mode); break; case PROP_THRESHOLD: g_value_set_float (value, filter->threshold); break; case PROP_RATIO: g_value_set_float (value, filter->ratio); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* GstAudioFilter vmethod implementations */ static gboolean gst_audio_dynamic_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (base); gboolean ret = TRUE; ret = gst_audio_dynamic_set_process_function (filter); return ret; } static void gst_audio_dynamic_transform_hard_knee_compressor_int (GstAudioDynamic * filter, gint16 * data, guint num_samples) { glong val; glong thr_p = filter->threshold * G_MAXINT16; glong thr_n = filter->threshold * G_MININT16; /* Nothing to do for us if ratio is 1.0 or if the threshold * equals 1.0. */ if (filter->threshold == 1.0 || filter->ratio == 1.0) return; for (; num_samples; num_samples--) { val = *data; if (val > thr_p) { val = thr_p + (val - thr_p) * filter->ratio; } else if (val < thr_n) { val = thr_n + (val - thr_n) * filter->ratio; } *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); } } static void gst_audio_dynamic_transform_hard_knee_compressor_float (GstAudioDynamic * filter, gfloat * data, guint num_samples) { gdouble val, threshold = filter->threshold; /* Nothing to do for us if ratio == 1.0. * As float values can be above 1.0 we have to do something * if threshold is greater than 1.0. */ if (filter->ratio == 1.0) return; for (; num_samples; num_samples--) { val = *data; if (val > threshold) { val = threshold + (val - threshold) * filter->ratio; } else if (val < -threshold) { val = -threshold + (val + threshold) * filter->ratio; } *data++ = (gfloat) val; } } static void gst_audio_dynamic_transform_soft_knee_compressor_int (GstAudioDynamic * filter, gint16 * data, guint num_samples) { glong val; glong thr_p = filter->threshold * G_MAXINT16; glong thr_n = filter->threshold * G_MININT16; gdouble a_p, b_p, c_p; gdouble a_n, b_n, c_n; /* Nothing to do for us if ratio is 1.0 or if the threshold * equals 1.0. */ if (filter->threshold == 1.0 || filter->ratio == 1.0) return; /* We build a 2nd degree polynomial here for * values greater than threshold or small than * -threshold with: * f(t) = t, f'(t) = 1, f'(m) = r * => * a = (1-r)/(2*(t-m)) * b = (r*t - m)/(t-m) * c = t * (1 - b - a*t) * f(x) = ax^2 + bx + c */ /* shouldn't happen because this would only be the case * for threshold == 1.0 which we catch above */ g_assert (thr_p - G_MAXINT16 != 0); g_assert (thr_n - G_MININT != 0); a_p = (1 - filter->ratio) / (2 * (thr_p - G_MAXINT16)); b_p = (filter->ratio * thr_p - G_MAXINT16) / (thr_p - G_MAXINT16); c_p = thr_p * (1 - b_p - a_p * thr_p); a_n = (1 - filter->ratio) / (2 * (thr_n - G_MININT16)); b_n = (filter->ratio * thr_n - G_MININT16) / (thr_n - G_MININT16); c_n = thr_n * (1 - b_n - a_n * thr_n); for (; num_samples; num_samples--) { val = *data; if (val > thr_p) { val = a_p * val * val + b_p * val + c_p; } else if (val < thr_n) { val = a_n * val * val + b_n * val + c_n; } *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); } } static void gst_audio_dynamic_transform_soft_knee_compressor_float (GstAudioDynamic * filter, gfloat * data, guint num_samples) { gdouble val; gdouble threshold = filter->threshold; gdouble a_p, b_p, c_p; gdouble a_n, b_n, c_n; /* Nothing to do for us if ratio == 1.0. * As float values can be above 1.0 we have to do something * if threshold is greater than 1.0. */ if (filter->ratio == 1.0) return; /* We build a 2nd degree polynomial here for * values greater than threshold or small than * -threshold with: * f(t) = t, f'(t) = 1, f'(m) = r * => * a = (1-r)/(2*(t-m)) * b = (r*t - m)/(t-m) * c = t * (1 - b - a*t) * f(x) = ax^2 + bx + c */ /* FIXME: If treshold is the same as the maximum * we need to raise it a bit to prevent * division by zero. */ if (threshold == 1.0) threshold = 1.0 + 0.00001; a_p = (1.0 - filter->ratio) / (2.0 * (threshold - 1.0)); b_p = (filter->ratio * threshold - 1.0) / (threshold - 1.0); c_p = threshold * (1.0 - b_p - a_p * threshold); a_n = (1.0 - filter->ratio) / (2.0 * (-threshold + 1.0)); b_n = (-filter->ratio * threshold + 1.0) / (-threshold + 1.0); c_n = -threshold * (1.0 - b_n + a_n * threshold); for (; num_samples; num_samples--) { val = *data; if (val > 1.0) { val = 1.0 + (val - 1.0) * filter->ratio; } else if (val > threshold) { val = a_p * val * val + b_p * val + c_p; } else if (val < -1.0) { val = -1.0 + (val + 1.0) * filter->ratio; } else if (val < -threshold) { val = a_n * val * val + b_n * val + c_n; } *data++ = (gfloat) val; } } static void gst_audio_dynamic_transform_hard_knee_expander_int (GstAudioDynamic * filter, gint16 * data, guint num_samples) { glong val; glong thr_p = filter->threshold * G_MAXINT16; glong thr_n = filter->threshold * G_MININT16; gdouble zero_p, zero_n; /* Nothing to do for us here if threshold equals 0.0 * or ratio equals 1.0 */ if (filter->threshold == 0.0 || filter->ratio == 1.0) return; /* zero crossing of our function */ if (filter->ratio != 0.0) { zero_p = thr_p - thr_p / filter->ratio; zero_n = thr_n - thr_n / filter->ratio; } else { zero_p = zero_n = 0.0; } if (zero_p < 0.0) zero_p = 0.0; if (zero_n > 0.0) zero_n = 0.0; for (; num_samples; num_samples--) { val = *data; if (val < thr_p && val > zero_p) { val = filter->ratio * val + thr_p * (1 - filter->ratio); } else if ((val <= zero_p && val > 0) || (val >= zero_n && val < 0)) { val = 0; } else if (val > thr_n && val < zero_n) { val = filter->ratio * val + thr_n * (1 - filter->ratio); } *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); } } static void gst_audio_dynamic_transform_hard_knee_expander_float (GstAudioDynamic * filter, gfloat * data, guint num_samples) { gdouble val, threshold = filter->threshold, zero; /* Nothing to do for us here if threshold equals 0.0 * or ratio equals 1.0 */ if (filter->threshold == 0.0 || filter->ratio == 1.0) return; /* zero crossing of our function */ if (filter->ratio != 0.0) zero = threshold - threshold / filter->ratio; else zero = 0.0; if (zero < 0.0) zero = 0.0; for (; num_samples; num_samples--) { val = *data; if (val < threshold && val > zero) { val = filter->ratio * val + threshold * (1.0 - filter->ratio); } else if ((val <= zero && val > 0.0) || (val >= -zero && val < 0.0)) { val = 0.0; } else if (val > -threshold && val < -zero) { val = filter->ratio * val - threshold * (1.0 - filter->ratio); } *data++ = (gfloat) val; } } static void gst_audio_dynamic_transform_soft_knee_expander_int (GstAudioDynamic * filter, gint16 * data, guint num_samples) { glong val; glong thr_p = filter->threshold * G_MAXINT16; glong thr_n = filter->threshold * G_MININT16; gdouble zero_p, zero_n; gdouble a_p, b_p, c_p; gdouble a_n, b_n, c_n; /* Nothing to do for us here if threshold equals 0.0 * or ratio equals 1.0 */ if (filter->threshold == 0.0 || filter->ratio == 1.0) return; /* zero crossing of our function */ zero_p = (thr_p * (filter->ratio - 1.0)) / (1.0 + filter->ratio); zero_n = (thr_n * (filter->ratio - 1.0)) / (1.0 + filter->ratio); if (zero_p < 0.0) zero_p = 0.0; if (zero_n > 0.0) zero_n = 0.0; /* shouldn't happen as this would only happen * with threshold == 0.0 */ g_assert (thr_p != 0); g_assert (thr_n != 0); /* We build a 2n degree polynomial here for values between * 0 and threshold or 0 and -threshold with: * f(t) = t, f'(t) = 1, f(z) = 0, f'(z) = r * z between 0 and t * => * a = (1 - r^2) / (4 * t) * b = (1 + r^2) / 2 * c = t * (1.0 - b - a*t) * f(x) = ax^2 + bx + c */ a_p = (1.0 - filter->ratio * filter->ratio) / (4.0 * thr_p); b_p = (1.0 + filter->ratio * filter->ratio) / 2.0; c_p = thr_p * (1.0 - b_p - a_p * thr_p); a_n = (1.0 - filter->ratio * filter->ratio) / (4.0 * thr_n); b_n = (1.0 + filter->ratio * filter->ratio) / 2.0; c_n = thr_n * (1.0 - b_n - a_n * thr_n); for (; num_samples; num_samples--) { val = *data; if (val < thr_p && val > zero_p) { val = a_p * val * val + b_p * val + c_p; } else if ((val <= zero_p && val > 0) || (val >= zero_n && val < 0)) { val = 0; } else if (val > thr_n && val < zero_n) { val = a_n * val * val + b_n * val + c_n; } *data++ = (gint16) CLAMP (val, G_MININT16, G_MAXINT16); } } static void gst_audio_dynamic_transform_soft_knee_expander_float (GstAudioDynamic * filter, gfloat * data, guint num_samples) { gdouble val; gdouble threshold = filter->threshold; gdouble zero; gdouble a_p, b_p, c_p; gdouble a_n, b_n, c_n; /* Nothing to do for us here if threshold equals 0.0 * or ratio equals 1.0 */ if (filter->threshold == 0.0 || filter->ratio == 1.0) return; /* zero crossing of our function */ zero = (threshold * (filter->ratio - 1.0)) / (1.0 + filter->ratio); if (zero < 0.0) zero = 0.0; /* shouldn't happen as this only happens with * threshold == 0.0 */ g_assert (threshold != 0.0); /* We build a 2n degree polynomial here for values between * 0 and threshold or 0 and -threshold with: * f(t) = t, f'(t) = 1, f(z) = 0, f'(z) = r * z between 0 and t * => * a = (1 - r^2) / (4 * t) * b = (1 + r^2) / 2 * c = t * (1.0 - b - a*t) * f(x) = ax^2 + bx + c */ a_p = (1.0 - filter->ratio * filter->ratio) / (4.0 * threshold); b_p = (1.0 + filter->ratio * filter->ratio) / 2.0; c_p = threshold * (1.0 - b_p - a_p * threshold); a_n = (1.0 - filter->ratio * filter->ratio) / (-4.0 * threshold); b_n = (1.0 + filter->ratio * filter->ratio) / 2.0; c_n = -threshold * (1.0 - b_n + a_n * threshold); for (; num_samples; num_samples--) { val = *data; if (val < threshold && val > zero) { val = a_p * val * val + b_p * val + c_p; } else if ((val <= zero && val > 0.0) || (val >= -zero && val < 0.0)) { val = 0.0; } else if (val > -threshold && val < -zero) { val = a_n * val * val + b_n * val + c_n; } *data++ = (gfloat) val; } } /* GstBaseTransform vmethod implementations */ static GstFlowReturn gst_audio_dynamic_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstAudioDynamic *filter = GST_AUDIO_DYNAMIC (base); guint num_samples; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); num_samples = GST_BUFFER_SIZE (buf) / (GST_AUDIO_FILTER (filter)->format.width / 8); if (gst_base_transform_is_passthrough (base) || G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) return GST_FLOW_OK; filter->process (filter, GST_BUFFER_DATA (buf), num_samples); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/flv/0000755000175000017500000000000011720565302013444 500000000000000gst-plugins-good-0.10.31/gst/flv/gstflvmux.c0000644000175000017500000013575411712617432015611 00000000000000/* GStreamer * * Copyright (c) 2008,2009 Sebastian Dröge * * 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-flvmux * * flvmux muxes different streams into an FLV file. * * * Example launch line * |[ * gst-launch -v filesrc location=/path/to/audio ! decodebin2 ! queue ! flvmux name=m ! filesink location=file.flv filesrc location=/path/to/video ! decodebin2 ! queue ! m. * ]| This pipeline muxes an audio and video file into a single FLV file. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstflvmux.h" #include "amfdefs.h" GST_DEBUG_CATEGORY_STATIC (flvmux_debug); #define GST_CAT_DEFAULT flvmux_debug enum { PROP_0, PROP_STREAMABLE }; #define DEFAULT_STREAMABLE FALSE #define MAX_INDEX_ENTRIES 128 static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-flv") ); static GstStaticPadTemplate videosink_templ = GST_STATIC_PAD_TEMPLATE ("video", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/x-flash-video; " "video/x-flash-screen; " "video/x-vp6-flash; " "video/x-vp6-alpha; " "video/x-h264, stream-format=avc;") ); static GstStaticPadTemplate audiosink_templ = GST_STATIC_PAD_TEMPLATE ("audio", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/x-adpcm, layout = (string) swf, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; " "audio/mpeg, mpegversion = (int) 1, layer = (int) 3, channels = (int) { 1, 2 }, rate = (int) { 5512, 8000, 11025, 22050, 44100 }, parsed = (boolean) TRUE; " "audio/mpeg, mpegversion = (int) 2, framed = (boolean) TRUE; " "audio/mpeg, mpegversion = (int) 4, stream-format = (string) raw, framed = (boolean) TRUE; " "audio/x-nellymoser, channels = (int) { 1, 2 }, rate = (int) { 5512, 8000, 11025, 16000, 22050, 44100 }; " "audio/x-raw-int, endianness = (int) LITTLE_ENDIAN, channels = (int) { 1, 2 }, width = (int) 8, depth = (int) 8, rate = (int) { 5512, 11025, 22050, 44100 }, signed = (boolean) FALSE; " "audio/x-raw-int, endianness = (int) LITTLE_ENDIAN, channels = (int) { 1, 2 }, width = (int) 16, depth = (int) 16, rate = (int) { 5512, 11025, 22050, 44100 }, signed = (boolean) TRUE; " "audio/x-alaw, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; " "audio/x-mulaw, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; " "audio/x-speex, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 };") ); #define _do_init(type) \ G_STMT_START{ \ static const GInterfaceInfo tag_setter_info = { \ NULL, \ NULL, \ NULL \ }; \ g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, \ &tag_setter_info); \ }G_STMT_END GST_BOILERPLATE_FULL (GstFlvMux, gst_flv_mux, GstElement, GST_TYPE_ELEMENT, _do_init); static void gst_flv_mux_finalize (GObject * object); static GstFlowReturn gst_flv_mux_collected (GstCollectPads * pads, gpointer user_data); static gboolean gst_flv_mux_handle_src_event (GstPad * pad, GstEvent * event); static GstPad *gst_flv_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_flv_mux_release_pad (GstElement * element, GstPad * pad); static void gst_flv_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_flv_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_flv_mux_change_state (GstElement * element, GstStateChange transition); static void gst_flv_mux_reset (GstElement * element); static void gst_flv_mux_reset_pad (GstFlvMux * mux, GstFlvPad * pad, gboolean video); typedef struct { gdouble position; gdouble time; } GstFlvMuxIndexEntry; static void gst_flv_mux_index_entry_free (GstFlvMuxIndexEntry * entry) { g_slice_free (GstFlvMuxIndexEntry, entry); } static void gst_flv_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &videosink_templ); gst_element_class_add_static_pad_template (element_class, &audiosink_templ); gst_element_class_add_static_pad_template (element_class, &src_templ); gst_element_class_set_details_simple (element_class, "FLV muxer", "Codec/Muxer", "Muxes video/audio streams into a FLV stream", "Sebastian Dröge "); GST_DEBUG_CATEGORY_INIT (flvmux_debug, "flvmux", 0, "FLV muxer"); } static void gst_flv_mux_class_init (GstFlvMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GST_DEBUG_CATEGORY_INIT (flvmux_debug, "flvmux", 0, "FLV muxer"); gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->get_property = gst_flv_mux_get_property; gobject_class->set_property = gst_flv_mux_set_property; gobject_class->finalize = gst_flv_mux_finalize; /* FIXME: ideally the right mode of operation should be detected * automatically using queries when parameter not specified. */ /** * GstFlvMux:streamable * * If True, the output will be streaming friendly. (ie without indexes and * duration) * * Since: 0.10.24 **/ g_object_class_install_property (gobject_class, PROP_STREAMABLE, g_param_spec_boolean ("streamable", "streamable", "If set to true, the output should be as if it is to be streamed " "and hence no indexes written or duration written.", DEFAULT_STREAMABLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_flv_mux_change_state); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_flv_mux_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_flv_mux_release_pad); } static void gst_flv_mux_init (GstFlvMux * mux, GstFlvMuxClass * g_class) { mux->srcpad = gst_pad_new_from_static_template (&src_templ, "src"); gst_pad_set_event_function (mux->srcpad, gst_flv_mux_handle_src_event); gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); /* property */ mux->streamable = DEFAULT_STREAMABLE; mux->new_tags = FALSE; mux->collect = gst_collect_pads_new (); gst_collect_pads_set_function (mux->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_flv_mux_collected), mux); gst_flv_mux_reset (GST_ELEMENT (mux)); } static void gst_flv_mux_finalize (GObject * object) { GstFlvMux *mux = GST_FLV_MUX (object); gst_object_unref (mux->collect); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_flv_mux_reset (GstElement * element) { GstFlvMux *mux = GST_FLV_MUX (element); GSList *sl; for (sl = mux->collect->data; sl != NULL; sl = g_slist_next (sl)) { GstFlvPad *cpad = (GstFlvPad *) sl->data; gst_flv_mux_reset_pad (mux, cpad, cpad->video); } g_list_foreach (mux->index, (GFunc) gst_flv_mux_index_entry_free, NULL); g_list_free (mux->index); mux->index = NULL; mux->byte_count = 0; mux->have_audio = mux->have_video = FALSE; mux->duration = GST_CLOCK_TIME_NONE; mux->new_tags = FALSE; mux->state = GST_FLV_MUX_STATE_HEADER; /* tags */ gst_tag_setter_reset_tags (GST_TAG_SETTER (mux)); } static gboolean gst_flv_mux_handle_src_event (GstPad * pad, GstEvent * event) { GstEventType type; type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { case GST_EVENT_SEEK: /* disable seeking for now */ return FALSE; default: break; } return gst_pad_event_default (pad, event); } static gboolean gst_flv_mux_handle_sink_event (GstPad * pad, GstEvent * event) { GstFlvMux *mux = GST_FLV_MUX (gst_pad_get_parent (pad)); gboolean ret = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ GstTagList *list; GstTagSetter *setter = GST_TAG_SETTER (mux); const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter); gst_event_parse_tag (event, &list); gst_tag_setter_merge_tags (setter, list, mode); mux->new_tags = TRUE; break; } default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ if (ret) ret = mux->collect_event (pad, event); gst_object_unref (mux); return ret; } static gboolean gst_flv_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps) { GstFlvMux *mux = GST_FLV_MUX (gst_pad_get_parent (pad)); GstFlvPad *cpad = (GstFlvPad *) gst_pad_get_element_private (pad); gboolean ret = TRUE; GstStructure *s; s = gst_caps_get_structure (caps, 0); if (strcmp (gst_structure_get_name (s), "video/x-flash-video") == 0) { cpad->video_codec = 2; } else if (strcmp (gst_structure_get_name (s), "video/x-flash-screen") == 0) { cpad->video_codec = 3; } else if (strcmp (gst_structure_get_name (s), "video/x-vp6-flash") == 0) { cpad->video_codec = 4; } else if (strcmp (gst_structure_get_name (s), "video/x-vp6-alpha") == 0) { cpad->video_codec = 5; } else if (strcmp (gst_structure_get_name (s), "video/x-h264") == 0) { cpad->video_codec = 7; } else { ret = FALSE; } if (ret && gst_structure_has_field (s, "codec_data")) { const GValue *val = gst_structure_get_value (s, "codec_data"); if (val) cpad->video_codec_data = gst_buffer_ref (gst_value_get_buffer (val)); } gst_object_unref (mux); return ret; } static gboolean gst_flv_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps) { GstFlvMux *mux = GST_FLV_MUX (gst_pad_get_parent (pad)); GstFlvPad *cpad = (GstFlvPad *) gst_pad_get_element_private (pad); gboolean ret = TRUE; GstStructure *s; s = gst_caps_get_structure (caps, 0); if (strcmp (gst_structure_get_name (s), "audio/x-adpcm") == 0) { const gchar *layout = gst_structure_get_string (s, "layout"); if (layout && strcmp (layout, "swf") == 0) { cpad->audio_codec = 1; } else { ret = FALSE; } } else if (strcmp (gst_structure_get_name (s), "audio/mpeg") == 0) { gint mpegversion; if (gst_structure_get_int (s, "mpegversion", &mpegversion)) { if (mpegversion == 1) { gint layer; if (gst_structure_get_int (s, "layer", &layer) && layer == 3) { gint rate; if (gst_structure_get_int (s, "rate", &rate) && rate == 8000) cpad->audio_codec = 14; else cpad->audio_codec = 2; } else { ret = FALSE; } } else if (mpegversion == 4 || mpegversion == 2) { cpad->audio_codec = 10; } else { ret = FALSE; } } else { ret = FALSE; } } else if (strcmp (gst_structure_get_name (s), "audio/x-nellymoser") == 0) { gint rate, channels; if (gst_structure_get_int (s, "rate", &rate) && gst_structure_get_int (s, "channels", &channels)) { if (channels == 1 && rate == 16000) cpad->audio_codec = 4; else if (channels == 1 && rate == 8000) cpad->audio_codec = 5; else cpad->audio_codec = 6; } else { cpad->audio_codec = 6; } } else if (strcmp (gst_structure_get_name (s), "audio/x-raw-int") == 0) { gint endianness; if (gst_structure_get_int (s, "endianness", &endianness) && endianness == G_LITTLE_ENDIAN) cpad->audio_codec = 3; else ret = FALSE; } else if (strcmp (gst_structure_get_name (s), "audio/x-alaw") == 0) { cpad->audio_codec = 7; } else if (strcmp (gst_structure_get_name (s), "audio/x-mulaw") == 0) { cpad->audio_codec = 8; } else if (strcmp (gst_structure_get_name (s), "audio/x-speex") == 0) { cpad->audio_codec = 11; } else { ret = FALSE; } if (ret) { gint rate, channels, width; if (gst_structure_get_int (s, "rate", &rate)) { if (cpad->audio_codec == 10) cpad->rate = 3; else if (rate == 5512) cpad->rate = 0; else if (rate == 11025) cpad->rate = 1; else if (rate == 22050) cpad->rate = 2; else if (rate == 44100) cpad->rate = 3; else if (rate == 8000 && (cpad->audio_codec == 5 || cpad->audio_codec == 14)) cpad->rate = 0; else if (rate == 16000 && cpad->audio_codec == 4) cpad->rate = 0; else ret = FALSE; } else if (cpad->audio_codec == 10) { cpad->rate = 3; } else { ret = FALSE; } if (gst_structure_get_int (s, "channels", &channels)) { if (cpad->audio_codec == 4 || cpad->audio_codec == 5 || cpad->audio_codec == 6) cpad->channels = 0; else if (cpad->audio_codec == 10) cpad->channels = 1; else if (channels == 1) cpad->channels = 0; else if (channels == 2) cpad->channels = 1; else ret = FALSE; } else if (cpad->audio_codec == 4 || cpad->audio_codec == 5 || cpad->audio_codec == 6) { cpad->channels = 0; } else if (cpad->audio_codec == 10) { cpad->channels = 1; } else { ret = FALSE; } if (gst_structure_get_int (s, "width", &width)) { if (cpad->audio_codec != 3) cpad->width = 1; else if (width == 8) cpad->width = 0; else if (width == 16) cpad->width = 1; else ret = FALSE; } else if (cpad->audio_codec != 3) { cpad->width = 1; } else { ret = FALSE; } } if (ret && gst_structure_has_field (s, "codec_data")) { const GValue *val = gst_structure_get_value (s, "codec_data"); if (val) cpad->audio_codec_data = gst_buffer_ref (gst_value_get_buffer (val)); } gst_object_unref (mux); return ret; } static void gst_flv_mux_reset_pad (GstFlvMux * mux, GstFlvPad * cpad, gboolean video) { cpad->video = video; if (cpad->audio_codec_data) gst_buffer_unref (cpad->audio_codec_data); cpad->audio_codec_data = NULL; cpad->audio_codec = G_MAXUINT; cpad->rate = G_MAXUINT; cpad->width = G_MAXUINT; cpad->channels = G_MAXUINT; if (cpad->video_codec_data) gst_buffer_unref (cpad->video_codec_data); cpad->video_codec_data = NULL; cpad->video_codec = G_MAXUINT; cpad->last_timestamp = 0; } static GstPad * gst_flv_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * pad_name) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); GstFlvMux *mux = GST_FLV_MUX (element); GstFlvPad *cpad; GstPad *pad = NULL; const gchar *name = NULL; GstPadSetCapsFunction setcapsfunc = NULL; gboolean video; if (mux->state != GST_FLV_MUX_STATE_HEADER) { GST_WARNING_OBJECT (mux, "Can't request pads after writing header"); return NULL; } if (templ == gst_element_class_get_pad_template (klass, "audio")) { if (mux->have_audio) { GST_WARNING_OBJECT (mux, "Already have an audio pad"); return NULL; } mux->have_audio = TRUE; name = "audio"; video = FALSE; setcapsfunc = GST_DEBUG_FUNCPTR (gst_flv_mux_audio_pad_setcaps); } else if (templ == gst_element_class_get_pad_template (klass, "video")) { if (mux->have_video) { GST_WARNING_OBJECT (mux, "Already have a video pad"); return NULL; } mux->have_video = TRUE; name = "video"; video = TRUE; setcapsfunc = GST_DEBUG_FUNCPTR (gst_flv_mux_video_pad_setcaps); } else { GST_WARNING_OBJECT (mux, "Invalid template"); return NULL; } pad = gst_pad_new_from_template (templ, name); cpad = (GstFlvPad *) gst_collect_pads_add_pad (mux->collect, pad, sizeof (GstFlvPad)); cpad->audio_codec_data = NULL; cpad->video_codec_data = NULL; gst_flv_mux_reset_pad (mux, cpad, video); /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events. */ mux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (pad); gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_flv_mux_handle_sink_event)); gst_pad_set_setcaps_function (pad, setcapsfunc); gst_pad_set_active (pad, TRUE); gst_element_add_pad (element, pad); return pad; } static void gst_flv_mux_release_pad (GstElement * element, GstPad * pad) { GstFlvMux *mux = GST_FLV_MUX (GST_PAD_PARENT (pad)); GstFlvPad *cpad = (GstFlvPad *) gst_pad_get_element_private (pad); gst_flv_mux_reset_pad (mux, cpad, cpad->video); gst_collect_pads_remove_pad (mux->collect, pad); gst_element_remove_pad (element, pad); } static GstFlowReturn gst_flv_mux_push (GstFlvMux * mux, GstBuffer * buffer) { buffer = gst_buffer_make_metadata_writable (buffer); gst_buffer_set_caps (buffer, GST_PAD_CAPS (mux->srcpad)); /* pushing the buffer that rewrites the header will make it no longer be the * total output size in bytes, but it doesn't matter at that point */ mux->byte_count += GST_BUFFER_SIZE (buffer); return gst_pad_push (mux->srcpad, buffer); } static GstBuffer * gst_flv_mux_create_header (GstFlvMux * mux) { GstBuffer *header; guint8 *data; header = gst_buffer_new_and_alloc (9 + 4); data = GST_BUFFER_DATA (header); data[0] = 'F'; data[1] = 'L'; data[2] = 'V'; data[3] = 0x01; /* Version */ data[4] = (mux->have_audio << 2) | mux->have_video; /* flags */ GST_WRITE_UINT32_BE (data + 5, 9); /* data offset */ GST_WRITE_UINT32_BE (data + 9, 0); /* previous tag size */ return header; } static GstBuffer * gst_flv_mux_preallocate_index (GstFlvMux * mux) { GstBuffer *tmp; guint8 *data; gint preallocate_size; /* preallocate index of size: * - 'keyframes' ECMA array key: 2 + 9 = 11 bytes * - nested ECMA array header, length and end marker: 8 bytes * - 'times' and 'filepositions' keys: 22 bytes * - two strict arrays headers and lengths: 10 bytes * - each index entry: 18 bytes */ preallocate_size = 11 + 8 + 22 + 10 + MAX_INDEX_ENTRIES * 18; GST_DEBUG_OBJECT (mux, "preallocating %d bytes for the index", preallocate_size); tmp = gst_buffer_new_and_alloc (preallocate_size); data = GST_BUFFER_DATA (tmp); /* prefill the space with a gstfiller: script tag variable */ GST_WRITE_UINT16_BE (data, 9); /* 9 characters */ memcpy (data + 2, "gstfiller", 9); GST_WRITE_UINT8 (data + 11, AMF0_STRING_MARKER); /* a string value */ GST_WRITE_UINT16_BE (data + 12, preallocate_size - 14); memset (data + 14, ' ', preallocate_size - 14); /* the rest is spaces */ return tmp; } static GstBuffer * gst_flv_mux_create_number_script_value (const gchar * name, gdouble value) { GstBuffer *tmp = gst_buffer_new_and_alloc (2 + strlen (name) + 1 + 8); guint8 *data = GST_BUFFER_DATA (tmp); gsize len = strlen (name); GST_WRITE_UINT16_BE (data, len); data += 2; /* name length */ memcpy (data, name, len); data += len; *data++ = AMF0_NUMBER_MARKER; /* double type */ GST_WRITE_DOUBLE_BE (data, value); return tmp; } static GstBuffer * gst_flv_mux_create_metadata (GstFlvMux * mux, gboolean full) { const GstTagList *tags; GstBuffer *script_tag, *tmp; guint8 *data; gint i, n_tags, tags_written = 0; tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux)); GST_DEBUG_OBJECT (mux, "tags = %" GST_PTR_FORMAT, tags); script_tag = gst_buffer_new_and_alloc (11); data = GST_BUFFER_DATA (script_tag); data[0] = 18; /* Data size, unknown for now */ data[1] = 0; data[2] = 0; data[3] = 0; /* Timestamp */ data[4] = data[5] = data[6] = data[7] = 0; /* Stream ID */ data[8] = data[9] = data[10] = 0; tmp = gst_buffer_new_and_alloc (13); data = GST_BUFFER_DATA (tmp); data[0] = AMF0_STRING_MARKER; /* string */ data[1] = 0; data[2] = 10; /* length 10 */ memcpy (&data[3], "onMetaData", 10); script_tag = gst_buffer_join (script_tag, tmp); n_tags = (tags) ? gst_structure_n_fields ((GstStructure *) tags) : 0; tmp = gst_buffer_new_and_alloc (5); data = GST_BUFFER_DATA (tmp); data[0] = 8; /* ECMA array */ GST_WRITE_UINT32_BE (data + 1, n_tags); script_tag = gst_buffer_join (script_tag, tmp); if (!full) goto tags; /* Some players expect the 'duration' to be always set. Fill it out later, after querying the pads or after getting EOS */ if (!mux->streamable) { tmp = gst_flv_mux_create_number_script_value ("duration", 86400); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; /* Sometimes the information about the total file size is useful for the player. It will be filled later, after getting EOS */ tmp = gst_flv_mux_create_number_script_value ("filesize", 0); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; /* Preallocate space for the index to be written at EOS */ tmp = gst_flv_mux_preallocate_index (mux); script_tag = gst_buffer_join (script_tag, tmp); } else { GST_DEBUG_OBJECT (mux, "not preallocating index, streamable mode"); } tags: for (i = 0; tags && i < n_tags; i++) { const gchar *tag_name = gst_structure_nth_field_name ((const GstStructure *) tags, i); if (!strcmp (tag_name, GST_TAG_DURATION)) { guint64 dur; if (!gst_tag_list_get_uint64 (tags, GST_TAG_DURATION, &dur)) continue; mux->duration = dur; } else if (!strcmp (tag_name, GST_TAG_ARTIST) || !strcmp (tag_name, GST_TAG_TITLE)) { gchar *s; const gchar *t = NULL; if (!strcmp (tag_name, GST_TAG_ARTIST)) t = "creator"; else if (!strcmp (tag_name, GST_TAG_TITLE)) t = "title"; if (!gst_tag_list_get_string (tags, tag_name, &s)) continue; tmp = gst_buffer_new_and_alloc (2 + strlen (t) + 1 + 2 + strlen (s)); data = GST_BUFFER_DATA (tmp); data[0] = 0; /* tag name length */ data[1] = strlen (t); memcpy (&data[2], t, strlen (t)); data[2 + strlen (t)] = 2; /* string */ data[3 + strlen (t)] = (strlen (s) >> 8) & 0xff; data[4 + strlen (t)] = (strlen (s)) & 0xff; memcpy (&data[5 + strlen (t)], s, strlen (s)); script_tag = gst_buffer_join (script_tag, tmp); g_free (s); tags_written++; } } if (!full) goto end; if (mux->duration == GST_CLOCK_TIME_NONE) { GSList *l; GstFormat fmt = GST_FORMAT_TIME; guint64 dur; for (l = mux->collect->data; l; l = l->next) { GstCollectData *cdata = l->data; fmt = GST_FORMAT_TIME; if (gst_pad_query_peer_duration (cdata->pad, &fmt, (gint64 *) & dur) && fmt == GST_FORMAT_TIME && dur != GST_CLOCK_TIME_NONE) { if (mux->duration == GST_CLOCK_TIME_NONE) mux->duration = dur; else mux->duration = MAX (dur, mux->duration); } } } if (!mux->streamable && mux->duration != GST_CLOCK_TIME_NONE) { gdouble d; d = gst_guint64_to_gdouble (mux->duration); d /= (gdouble) GST_SECOND; GST_DEBUG_OBJECT (mux, "determined the duration to be %f", d); data = GST_BUFFER_DATA (script_tag); GST_WRITE_DOUBLE_BE (data + 29 + 2 + 8 + 1, d); } if (mux->have_video) { GstPad *video_pad = NULL; GstFlvPad *cpad; GSList *l = mux->collect->data; for (; l; l = l->next) { cpad = l->data; if (cpad && cpad->video) { video_pad = cpad->collect.pad; break; } } if (video_pad && GST_PAD_CAPS (video_pad)) { GstStructure *s = gst_caps_get_structure (GST_PAD_CAPS (video_pad), 0); gint size; gint num, den; GST_DEBUG_OBJECT (mux, "putting videocodecid %d in the metadata", cpad->video_codec); tmp = gst_flv_mux_create_number_script_value ("videocodecid", cpad->video_codec); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; if (gst_structure_get_int (s, "width", &size)) { GST_DEBUG_OBJECT (mux, "putting width %d in the metadata", size); tmp = gst_flv_mux_create_number_script_value ("width", size); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; } if (gst_structure_get_int (s, "height", &size)) { GST_DEBUG_OBJECT (mux, "putting height %d in the metadata", size); tmp = gst_flv_mux_create_number_script_value ("height", size); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; } if (gst_structure_get_fraction (s, "pixel-aspect-ratio", &num, &den)) { gdouble d; d = num; GST_DEBUG_OBJECT (mux, "putting AspectRatioX %f in the metadata", d); tmp = gst_flv_mux_create_number_script_value ("AspectRatioX", d); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; d = den; GST_DEBUG_OBJECT (mux, "putting AspectRatioY %f in the metadata", d); tmp = gst_flv_mux_create_number_script_value ("AspectRatioY", d); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; } if (gst_structure_get_fraction (s, "framerate", &num, &den)) { gdouble d; gst_util_fraction_to_double (num, den, &d); GST_DEBUG_OBJECT (mux, "putting framerate %f in the metadata", d); tmp = gst_flv_mux_create_number_script_value ("framerate", d); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; } } } if (mux->have_audio) { GstPad *audio_pad = NULL; GstFlvPad *cpad; GSList *l = mux->collect->data; for (; l; l = l->next) { cpad = l->data; if (cpad && !cpad->video) { audio_pad = cpad->collect.pad; break; } } if (audio_pad) { GST_DEBUG_OBJECT (mux, "putting audiocodecid %d in the metadata", cpad->audio_codec); tmp = gst_flv_mux_create_number_script_value ("audiocodecid", cpad->audio_codec); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; } } { const gchar *s = "GStreamer FLV muxer"; tmp = gst_buffer_new_and_alloc (2 + 15 + 1 + 2 + strlen (s)); data = GST_BUFFER_DATA (tmp); data[0] = 0; /* 15 bytes name */ data[1] = 15; memcpy (&data[2], "metadatacreator", 15); data[17] = 2; /* string */ data[18] = (strlen (s) >> 8) & 0xff; data[19] = (strlen (s)) & 0xff; memcpy (&data[20], s, strlen (s)); script_tag = gst_buffer_join (script_tag, tmp); tags_written++; } { GTimeVal tv = { 0, }; time_t secs; struct tm *tm; gchar *s; static const gchar *weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static const gchar *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; g_get_current_time (&tv); secs = tv.tv_sec; tm = gmtime (&secs); s = g_strdup_printf ("%s %s %d %d:%d:%d %d", weekdays[tm->tm_wday], months[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_year + 1900); tmp = gst_buffer_new_and_alloc (2 + 12 + 1 + 2 + strlen (s)); data = GST_BUFFER_DATA (tmp); data[0] = 0; /* 12 bytes name */ data[1] = 12; memcpy (&data[2], "creationdate", 12); data[14] = 2; /* string */ data[15] = (strlen (s) >> 8) & 0xff; data[16] = (strlen (s)) & 0xff; memcpy (&data[17], s, strlen (s)); script_tag = gst_buffer_join (script_tag, tmp); g_free (s); tags_written++; } end: if (!tags_written) { gst_buffer_unref (script_tag); script_tag = NULL; goto exit; } tmp = gst_buffer_new_and_alloc (2 + 0 + 1); data = GST_BUFFER_DATA (tmp); data[0] = 0; /* 0 byte size */ data[1] = 0; data[2] = 9; /* end marker */ script_tag = gst_buffer_join (script_tag, tmp); tags_written++; tmp = gst_buffer_new_and_alloc (4); data = GST_BUFFER_DATA (tmp); GST_WRITE_UINT32_BE (data, GST_BUFFER_SIZE (script_tag)); script_tag = gst_buffer_join (script_tag, tmp); data = GST_BUFFER_DATA (script_tag); data[1] = ((GST_BUFFER_SIZE (script_tag) - 11 - 4) >> 16) & 0xff; data[2] = ((GST_BUFFER_SIZE (script_tag) - 11 - 4) >> 8) & 0xff; data[3] = ((GST_BUFFER_SIZE (script_tag) - 11 - 4) >> 0) & 0xff; GST_WRITE_UINT32_BE (data + 11 + 13 + 1, tags_written); exit: return script_tag; } static GstBuffer * gst_flv_mux_buffer_to_tag_internal (GstFlvMux * mux, GstBuffer * buffer, GstFlvPad * cpad, gboolean is_codec_data) { GstBuffer *tag; guint8 *data; guint size; guint32 timestamp = (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) ? GST_BUFFER_TIMESTAMP (buffer) / GST_MSECOND : cpad->last_timestamp / GST_MSECOND; size = 11; if (cpad->video) { size += 1; if (cpad->video_codec == 7) size += 4 + GST_BUFFER_SIZE (buffer); else size += GST_BUFFER_SIZE (buffer); } else { size += 1; if (cpad->audio_codec == 10) size += 1 + GST_BUFFER_SIZE (buffer); else size += GST_BUFFER_SIZE (buffer); } size += 4; tag = gst_buffer_new_and_alloc (size); GST_BUFFER_TIMESTAMP (tag) = timestamp * GST_MSECOND; data = GST_BUFFER_DATA (tag); memset (data, 0, size); data[0] = (cpad->video) ? 9 : 8; data[1] = ((size - 11 - 4) >> 16) & 0xff; data[2] = ((size - 11 - 4) >> 8) & 0xff; data[3] = ((size - 11 - 4) >> 0) & 0xff; /* wrap the timestamp every G_MAXINT32 miliseconds */ timestamp &= 0x7fffffff; data[4] = (timestamp >> 16) & 0xff; data[5] = (timestamp >> 8) & 0xff; data[6] = (timestamp >> 0) & 0xff; data[7] = (timestamp >> 24) & 0xff; data[8] = data[9] = data[10] = 0; if (cpad->video) { if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) data[11] |= 2 << 4; else data[11] |= 1 << 4; data[11] |= cpad->video_codec & 0x0f; if (cpad->video_codec == 7) { data[12] = is_codec_data ? 0 : 1; /* FIXME: what to do about composition time */ data[13] = data[14] = data[15] = 0; memcpy (data + 11 + 1 + 4, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); } else { memcpy (data + 11 + 1, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); } } else { data[11] |= (cpad->audio_codec << 4) & 0xf0; data[11] |= (cpad->rate << 2) & 0x0c; data[11] |= (cpad->width << 1) & 0x02; data[11] |= (cpad->channels << 0) & 0x01; if (cpad->audio_codec == 10) { data[12] = is_codec_data ? 0 : 1; memcpy (data + 11 + 1 + 1, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); } else { memcpy (data + 11 + 1, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); } } GST_WRITE_UINT32_BE (data + size - 4, size - 4); gst_buffer_copy_metadata (tag, buffer, GST_BUFFER_COPY_TIMESTAMPS); /* mark the buffer if it's an audio buffer and there's also video being muxed * or it's a video interframe */ if ((mux->have_video && !cpad->video) || GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) GST_BUFFER_FLAG_SET (tag, GST_BUFFER_FLAG_DELTA_UNIT); GST_BUFFER_OFFSET (tag) = GST_BUFFER_OFFSET_END (tag) = GST_BUFFER_OFFSET_NONE; return tag; } static inline GstBuffer * gst_flv_mux_buffer_to_tag (GstFlvMux * mux, GstBuffer * buffer, GstFlvPad * cpad) { return gst_flv_mux_buffer_to_tag_internal (mux, buffer, cpad, FALSE); } static inline GstBuffer * gst_flv_mux_codec_data_buffer_to_tag (GstFlvMux * mux, GstBuffer * buffer, GstFlvPad * cpad) { return gst_flv_mux_buffer_to_tag_internal (mux, buffer, cpad, TRUE); } static void gst_flv_mux_put_buffer_in_streamheader (GValue * streamheader, GstBuffer * buffer) { GValue value = { 0 }; GstBuffer *buf; g_value_init (&value, GST_TYPE_BUFFER); buf = gst_buffer_copy (buffer); gst_value_set_buffer (&value, buf); gst_buffer_unref (buf); gst_value_array_append_value (streamheader, &value); g_value_unset (&value); } static GstFlowReturn gst_flv_mux_write_header (GstFlvMux * mux) { GstBuffer *header, *metadata; GstBuffer *video_codec_data, *audio_codec_data; GstCaps *caps; GstStructure *structure; GValue streamheader = { 0 }; GSList *l; GstFlowReturn ret; header = gst_flv_mux_create_header (mux); metadata = gst_flv_mux_create_metadata (mux, TRUE); video_codec_data = NULL; audio_codec_data = NULL; for (l = mux->collect->data; l != NULL; l = l->next) { GstFlvPad *cpad = l->data; /* Get H.264 and AAC codec data, if present */ if (cpad && cpad->video && cpad->video_codec == 7) { if (cpad->video_codec_data == NULL) GST_WARNING_OBJECT (mux, "Codec data for video stream not found, " "output might not be playable"); else video_codec_data = gst_flv_mux_codec_data_buffer_to_tag (mux, cpad->video_codec_data, cpad); } else if (cpad && !cpad->video && cpad->audio_codec == 10) { if (cpad->audio_codec_data == NULL) GST_WARNING_OBJECT (mux, "Codec data for audio stream not found, " "output might not be playable"); else audio_codec_data = gst_flv_mux_codec_data_buffer_to_tag (mux, cpad->audio_codec_data, cpad); } } /* mark buffers that will go in the streamheader */ GST_BUFFER_FLAG_SET (header, GST_BUFFER_FLAG_IN_CAPS); GST_BUFFER_FLAG_SET (metadata, GST_BUFFER_FLAG_IN_CAPS); if (video_codec_data != NULL) { GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_IN_CAPS); /* mark as a delta unit, so downstream will not try to synchronize on that * buffer - to actually start playback you need a real video keyframe */ GST_BUFFER_FLAG_SET (video_codec_data, GST_BUFFER_FLAG_DELTA_UNIT); } if (audio_codec_data != NULL) { GST_BUFFER_FLAG_SET (audio_codec_data, GST_BUFFER_FLAG_IN_CAPS); } /* put buffers in streamheader */ g_value_init (&streamheader, GST_TYPE_ARRAY); gst_flv_mux_put_buffer_in_streamheader (&streamheader, header); gst_flv_mux_put_buffer_in_streamheader (&streamheader, metadata); if (video_codec_data != NULL) gst_flv_mux_put_buffer_in_streamheader (&streamheader, video_codec_data); if (audio_codec_data != NULL) gst_flv_mux_put_buffer_in_streamheader (&streamheader, audio_codec_data); /* create the caps and put the streamheader in them */ caps = gst_caps_new_simple ("video/x-flv", NULL); caps = gst_caps_make_writable (caps); structure = gst_caps_get_structure (caps, 0); gst_structure_set_value (structure, "streamheader", &streamheader); g_value_unset (&streamheader); if (GST_PAD_CAPS (mux->srcpad) == NULL) gst_pad_set_caps (mux->srcpad, caps); gst_caps_unref (caps); /* push the header buffer, the metadata and the codec info, if any */ ret = gst_flv_mux_push (mux, header); if (ret != GST_FLOW_OK) return ret; ret = gst_flv_mux_push (mux, metadata); if (ret != GST_FLOW_OK) return ret; if (video_codec_data != NULL) { ret = gst_flv_mux_push (mux, video_codec_data); if (ret != GST_FLOW_OK) return ret; } if (audio_codec_data != NULL) { ret = gst_flv_mux_push (mux, audio_codec_data); if (ret != GST_FLOW_OK) return ret; } return GST_FLOW_OK; } static void gst_flv_mux_update_index (GstFlvMux * mux, GstBuffer * buffer, GstFlvPad * cpad) { /* * Add the tag byte offset and to the index if it's a valid seek point, which * means it's either a video keyframe or if there is no video pad (in that * case every FLV tag is a valid seek point) */ if (mux->have_video && (!cpad->video || GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT))) return; if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) { GstFlvMuxIndexEntry *entry = g_slice_new (GstFlvMuxIndexEntry); entry->position = mux->byte_count; entry->time = gst_guint64_to_gdouble (GST_BUFFER_TIMESTAMP (buffer)) / GST_SECOND; mux->index = g_list_prepend (mux->index, entry); } } static GstFlowReturn gst_flv_mux_write_buffer (GstFlvMux * mux, GstFlvPad * cpad) { GstBuffer *tag; GstBuffer *buffer = gst_collect_pads_pop (mux->collect, (GstCollectData *) cpad); GstFlowReturn ret; /* arrange downstream running time */ buffer = gst_buffer_make_metadata_writable (buffer); GST_BUFFER_TIMESTAMP (buffer) = gst_segment_to_running_time (&cpad->collect.segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buffer)); if (!mux->streamable) gst_flv_mux_update_index (mux, buffer, cpad); tag = gst_flv_mux_buffer_to_tag (mux, buffer, cpad); gst_buffer_unref (buffer); ret = gst_flv_mux_push (mux, tag); if (ret == GST_FLOW_OK && GST_BUFFER_TIMESTAMP_IS_VALID (tag)) cpad->last_timestamp = GST_BUFFER_TIMESTAMP (tag); return ret; } static guint64 gst_flv_mux_determine_duration (GstFlvMux * mux) { GSList *l; GstClockTime duration = GST_CLOCK_TIME_NONE; GST_DEBUG_OBJECT (mux, "trying to determine the duration " "from pad timestamps"); for (l = mux->collect->data; l != NULL; l = l->next) { GstFlvPad *cpad = l->data; if (cpad && (cpad->last_timestamp != GST_CLOCK_TIME_NONE)) { if (duration == GST_CLOCK_TIME_NONE) duration = cpad->last_timestamp; else duration = MAX (duration, cpad->last_timestamp); } } return duration; } static GstFlowReturn gst_flv_mux_rewrite_header (GstFlvMux * mux) { GstBuffer *rewrite, *index, *tmp; GstEvent *event; guint8 *data; gdouble d; GList *l; guint32 index_len, allocate_size; guint32 i, index_skip; GstClockTime dur; if (mux->streamable) return GST_FLOW_OK; /* seek back to the preallocated index space */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 13 + 29, GST_CLOCK_TIME_NONE, 13 + 29); if (!gst_pad_push_event (mux->srcpad, event)) { GST_WARNING_OBJECT (mux, "Seek to rewrite header failed"); return GST_FLOW_OK; } /* determine duration now based on our own timestamping, * so that it is likely many times better and consistent * than whatever obtained by some query */ dur = gst_flv_mux_determine_duration (mux); if (dur != GST_CLOCK_TIME_NONE) mux->duration = dur; /* rewrite the duration tag */ d = gst_guint64_to_gdouble (mux->duration); d /= (gdouble) GST_SECOND; GST_DEBUG_OBJECT (mux, "determined the final duration to be %f", d); rewrite = gst_flv_mux_create_number_script_value ("duration", d); /* rewrite the filesize tag */ d = gst_guint64_to_gdouble (mux->byte_count); GST_DEBUG_OBJECT (mux, "putting total filesize %f in the metadata", d); tmp = gst_flv_mux_create_number_script_value ("filesize", d); rewrite = gst_buffer_join (rewrite, tmp); if (!mux->index) { /* no index, so push buffer and return */ return gst_flv_mux_push (mux, rewrite); } /* rewrite the index */ mux->index = g_list_reverse (mux->index); index_len = g_list_length (mux->index); /* We write at most MAX_INDEX_ENTRIES elements */ if (index_len > MAX_INDEX_ENTRIES) { index_skip = 1 + index_len / MAX_INDEX_ENTRIES; index_len = (index_len + index_skip - 1) / index_skip; } else { index_skip = 1; } GST_DEBUG_OBJECT (mux, "Index length is %d", index_len); /* see size calculation in gst_flv_mux_preallocate_index */ allocate_size = 11 + 8 + 22 + 10 + index_len * 18; GST_DEBUG_OBJECT (mux, "Allocating %d bytes for index", allocate_size); index = gst_buffer_new_and_alloc (allocate_size); data = GST_BUFFER_DATA (index); GST_WRITE_UINT16_BE (data, 9); /* the 'keyframes' key */ memcpy (data + 2, "keyframes", 9); GST_WRITE_UINT8 (data + 11, 8); /* nested ECMA array */ GST_WRITE_UINT32_BE (data + 12, 2); /* two elements */ GST_WRITE_UINT16_BE (data + 16, 5); /* first string key: 'times' */ memcpy (data + 18, "times", 5); GST_WRITE_UINT8 (data + 23, 10); /* strict array */ GST_WRITE_UINT32_BE (data + 24, index_len); data += 28; /* the keyframes' times */ for (i = 0, l = mux->index; l; l = l->next, i++) { GstFlvMuxIndexEntry *entry = l->data; if (i % index_skip != 0) continue; GST_WRITE_UINT8 (data, 0); /* numeric (aka double) */ GST_WRITE_DOUBLE_BE (data + 1, entry->time); data += 9; } GST_WRITE_UINT16_BE (data, 13); /* second string key: 'filepositions' */ memcpy (data + 2, "filepositions", 13); GST_WRITE_UINT8 (data + 15, 10); /* strict array */ GST_WRITE_UINT32_BE (data + 16, index_len); data += 20; /* the keyframes' file positions */ for (i = 0, l = mux->index; l; l = l->next, i++) { GstFlvMuxIndexEntry *entry = l->data; if (i % index_skip != 0) continue; GST_WRITE_UINT8 (data, 0); GST_WRITE_DOUBLE_BE (data + 1, entry->position); data += 9; } GST_WRITE_UINT24_BE (data, 9); /* finish the ECMA array */ /* If there is space left in the prefilled area, reinsert the filler. There is at least 18 bytes free, so it will always fit. */ if (index_len < MAX_INDEX_ENTRIES) { GstBuffer *tmp; guint8 *data; guint32 remaining_filler_size; tmp = gst_buffer_new_and_alloc (14); data = GST_BUFFER_DATA (tmp); GST_WRITE_UINT16_BE (data, 9); memcpy (data + 2, "gstfiller", 9); GST_WRITE_UINT8 (data + 11, 2); /* string */ /* There is 18 bytes per remaining index entry minus what is used for * the'gstfiller' key. The rest is already filled with spaces, so just need * to update length. */ remaining_filler_size = (MAX_INDEX_ENTRIES - index_len) * 18 - 14; GST_DEBUG_OBJECT (mux, "Remaining filler size is %d bytes", remaining_filler_size); GST_WRITE_UINT16_BE (data + 12, remaining_filler_size); index = gst_buffer_join (index, tmp); } rewrite = gst_buffer_join (rewrite, index); gst_buffer_set_caps (rewrite, GST_PAD_CAPS (mux->srcpad)); return gst_flv_mux_push (mux, rewrite); } static GstFlowReturn gst_flv_mux_collected (GstCollectPads * pads, gpointer user_data) { GstFlvMux *mux = GST_FLV_MUX (user_data); GstFlvPad *best; GstClockTime best_time; GstFlowReturn ret; GSList *sl; gboolean eos = TRUE; if (mux->state == GST_FLV_MUX_STATE_HEADER) { if (mux->collect->data == NULL) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("No input streams configured")); return GST_FLOW_ERROR; } if (gst_pad_push_event (mux->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0))) ret = gst_flv_mux_write_header (mux); else ret = GST_FLOW_ERROR; if (ret != GST_FLOW_OK) return ret; mux->state = GST_FLV_MUX_STATE_DATA; } if (mux->new_tags) { GstBuffer *buf = gst_flv_mux_create_metadata (mux, FALSE); if (buf) gst_flv_mux_push (mux, buf); mux->new_tags = FALSE; } best = NULL; best_time = GST_CLOCK_TIME_NONE; for (sl = mux->collect->data; sl; sl = sl->next) { GstFlvPad *cpad = sl->data; GstBuffer *buffer = gst_collect_pads_peek (pads, (GstCollectData *) cpad); GstClockTime time; if (!buffer) continue; eos = FALSE; time = GST_BUFFER_TIMESTAMP (buffer); gst_buffer_unref (buffer); /* Use buffers without valid timestamp first */ if (!GST_CLOCK_TIME_IS_VALID (time)) { GST_WARNING_OBJECT (pads, "Buffer without valid timestamp"); best_time = cpad->last_timestamp; best = cpad; break; } time = gst_segment_to_running_time (&cpad->collect.segment, GST_FORMAT_TIME, time); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { GST_DEBUG_OBJECT (mux, "clipping buffer on pad %s outside segment", GST_PAD_NAME (cpad->collect.pad)); buffer = gst_collect_pads_pop (pads, (GstCollectData *) cpad); gst_buffer_unref (buffer); return GST_FLOW_OK; } if (best == NULL || (GST_CLOCK_TIME_IS_VALID (best_time) && time < best_time)) { best = cpad; best_time = time; } } /* The FLV timestamp is an int32 field. For non-live streams error out if a bigger timestamp is seen, for live the timestamp will get wrapped in gst_flv_mux_buffer_to_tag */ if (!mux->streamable && GST_CLOCK_TIME_IS_VALID (best_time) && best_time / GST_MSECOND > G_MAXINT32) { GST_WARNING_OBJECT (mux, "Timestamp larger than FLV supports - EOS"); eos = TRUE; } if (!eos && best) { return gst_flv_mux_write_buffer (mux, best); } else if (eos) { gst_flv_mux_rewrite_header (mux); gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); return GST_FLOW_UNEXPECTED; } else { return GST_FLOW_OK; } } static void gst_flv_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstFlvMux *mux = GST_FLV_MUX (object); switch (prop_id) { case PROP_STREAMABLE: g_value_set_boolean (value, mux->streamable); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_flv_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstFlvMux *mux = GST_FLV_MUX (object); switch (prop_id) { case PROP_STREAMABLE: mux->streamable = g_value_get_boolean (value); if (mux->streamable) gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (mux), GST_TAG_MERGE_REPLACE); else gst_tag_setter_set_tag_merge_mode (GST_TAG_SETTER (mux), GST_TAG_MERGE_KEEP); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_flv_mux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstFlvMux *mux = GST_FLV_MUX (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_collect_pads_start (mux->collect); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_collect_pads_stop (mux->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_flv_mux_reset (GST_ELEMENT (mux)); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gst-plugins-good-0.10.31/gst/flv/gstflvdemux.h0000644000175000017500000000716111677341655016130 00000000000000/* GStreamer * Copyright (C) <2007> Julien Moutte * * 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 __FLV_DEMUX_H__ #define __FLV_DEMUX_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_FLV_DEMUX \ (gst_flv_demux_get_type()) #define GST_FLV_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLV_DEMUX,GstFlvDemux)) #define GST_FLV_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLV_DEMUX,GstFlvDemuxClass)) #define GST_IS_FLV_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLV_DEMUX)) #define GST_IS_FLV_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLV_DEMUX)) typedef struct _GstFlvDemux GstFlvDemux; typedef struct _GstFlvDemuxClass GstFlvDemuxClass; typedef enum { FLV_STATE_HEADER, FLV_STATE_TAG_TYPE, FLV_STATE_TAG_VIDEO, FLV_STATE_TAG_AUDIO, FLV_STATE_TAG_SCRIPT, FLV_STATE_SEEK, FLV_STATE_DONE, FLV_STATE_NONE } GstFlvDemuxState; struct _GstFlvDemux { GstElement element; GstPad *sinkpad; GstPad *audio_pad; GstPad *video_pad; /* */ GstIndex *index; gint index_id; gboolean own_index; GArray * times; GArray * filepositions; GstAdapter *adapter; GstSegment segment; GstEvent *close_seg_event; GstEvent *new_seg_event; GstTagList *taglist; GstFlvDemuxState state; guint64 offset; guint64 cur_tag_offset; GstClockTime duration; guint64 tag_size; guint64 tag_data_size; /* Audio infos */ guint16 rate; guint16 channels; guint16 width; guint16 audio_codec_tag; guint64 audio_offset; gboolean audio_need_discont; gboolean audio_need_segment; gboolean audio_linked; GstBuffer * audio_codec_data; GstClockTime audio_start; guint32 last_audio_pts; GstClockTime audio_time_offset; /* Video infos */ guint32 w; guint32 h; guint32 par_x; guint32 par_y; guint16 video_codec_tag; guint64 video_offset; gboolean video_need_discont; gboolean video_need_segment; gboolean video_linked; gboolean got_par; GstBuffer * video_codec_data; GstClockTime video_start; guint32 last_video_pts; GstClockTime video_time_offset; gdouble framerate; gboolean random_access; gboolean need_header; gboolean has_audio; gboolean has_video; gboolean push_tags; gboolean strict; gboolean flushing; gboolean no_more_pads; gboolean seeking; gboolean building_index; gboolean indexed; /* TRUE if index is completely built */ gboolean upstream_seekable; /* TRUE if upstream is seekable */ gint64 file_size; GstEvent *seek_event; gint64 seek_time; GstClockTime index_max_time; gint64 index_max_pos; /* reverse playback */ GstClockTime video_first_ts; GstClockTime audio_first_ts; gboolean video_done; gboolean audio_done; gint64 from_offset; gint64 to_offset; }; struct _GstFlvDemuxClass { GstElementClass parent_class; }; GType gst_flv_demux_get_type (void); G_END_DECLS #endif /* __FLV_DEMUX_H__ */ gst-plugins-good-0.10.31/gst/flv/Makefile.am0000644000175000017500000000162111677341655015436 00000000000000plugin_LTLIBRARIES = libgstflv.la libgstflv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstflv_la_LIBADD = -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) libgstflv_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} libgstflv_la_SOURCES = gstflvdemux.c gstflvmux.c libgstflv_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstflvdemux.h gstflvmux.h amfdefs.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstflv -:SHARED libgstflv \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstflv_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflv_la_CFLAGS) \ -:LDFLAGS $(libgstflv_la_LDFLAGS) \ $(libgstflv_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/flv/amfdefs.h0000644000175000017500000000276111677341655015166 00000000000000/* GStreamer * * Copyright (c) 2011 Jan Schmidt * * 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 __AMFDEFS_H__ #define __AMFDEFS_H__ #include #define AMF0_NUMBER_MARKER 0x0 #define AMF0_BOOLEAN_MARKER 0x1 #define AMF0_STRING_MARKER 0x2 #define AMF0_OBJECT_MARKER 0x3 #define AMF0_MOVIECLIP_MARKER 0x4 // Reserved, not supported #define AMF0_NULL_MARKER 0x5 #define AMF0_UNDEFINED_MARKER 0x6 #define AMF0_REFERENCE_MARKER 0x7 #define AMF0_ECMA_ARRAY_MARKER 0x8 #define AMF0_OBJECT_END_MARKER 0x9 #define AMF0_STRICT_ARRAY_MARKER 0xA #define AMF0_DATE_MARKER 0xB #define AMF0_LONG_STRING_MARKER 0xC #define AMF0_UNSUPPORTED_MARKER 0xD #define AMF0_RECORDSET_MARKER 0xE // Reserved, not supported #define AMF0_XML_DOCUMENT_MARKER 0xF #define AMF0_TYPED_OBJECT_MARKER 0x10 #endif gst-plugins-good-0.10.31/gst/flv/gstflvmux.h0000644000175000017500000000436111671175353015610 00000000000000/* GStreamer * * Copyright (c) 2008 Sebastian Dröge * * 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_FLV_MUX_H__ #define __GST_FLV_MUX_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_FLV_MUX \ (gst_flv_mux_get_type ()) #define GST_FLV_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_FLV_MUX, GstFlvMux)) #define GST_FLV_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_FLV_MUX, GstFlvMuxClass)) #define GST_IS_FLV_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_FLV_MUX)) #define GST_IS_FLV_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FLV_MUX)) typedef struct { GstCollectData collect; gboolean video; guint audio_codec; guint rate; guint width; guint channels; GstBuffer *audio_codec_data; guint video_codec; GstBuffer *video_codec_data; GstClockTime last_timestamp; } GstFlvPad; typedef enum { GST_FLV_MUX_STATE_HEADER, GST_FLV_MUX_STATE_DATA } GstFlvMuxState; typedef struct _GstFlvMux { GstElement element; GstPad *srcpad; GstCollectPads *collect; /* */ GstPadEventFunction collect_event; GstFlvMuxState state; gboolean have_audio; gboolean have_video; gboolean streamable; GstTagList *tags; gboolean new_tags; GList *index; guint64 byte_count; guint64 duration; } GstFlvMux; typedef struct _GstFlvMuxClass { GstElementClass parent; } GstFlvMuxClass; GType gst_flv_mux_get_type (void); G_END_DECLS #endif /* __GST_FLV_MUX_H__ */ gst-plugins-good-0.10.31/gst/flv/gstflvdemux.c0000644000175000017500000027666611712617416016134 00000000000000/* GStreamer * Copyright (C) <2007> Julien Moutte * * 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-flvdemux * * flvdemux demuxes an FLV file into the different contained streams. * * * Example launch line * |[ * gst-launch -v filesrc location=/path/to/flv ! flvdemux ! audioconvert ! autoaudiosink * ]| This pipeline demuxes an FLV file and outputs the contained raw audio streams. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include "gstflvdemux.h" #include "gstflvmux.h" #include #include #include #include static GstStaticPadTemplate flv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-flv") ); static GstStaticPadTemplate audio_src_template = GST_STATIC_PAD_TEMPLATE ("audio", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-adpcm, layout = (string) swf, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; " "audio/mpeg, mpegversion = (int) 1, layer = (int) 3, channels = (int) { 1, 2 }, rate = (int) { 5512, 8000, 11025, 22050, 44100 }, parsed = (boolean) TRUE; " "audio/mpeg, mpegversion = (int) 4, stream-format = (string) raw, framed = (boolean) TRUE; " "audio/x-nellymoser, channels = (int) { 1, 2 }, rate = (int) { 5512, 8000, 11025, 16000, 22050, 44100 }; " "audio/x-raw-int, endianness = (int) LITTLE_ENDIAN, channels = (int) { 1, 2 }, width = (int) 8, depth = (int) 8, rate = (int) { 5512, 11025, 22050, 44100 }, signed = (boolean) FALSE; " "audio/x-raw-int, endianness = (int) LITTLE_ENDIAN, channels = (int) { 1, 2 }, width = (int) 16, depth = (int) 16, rate = (int) { 5512, 11025, 22050, 44100 }, signed = (boolean) TRUE; " "audio/x-alaw, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; " "audio/x-mulaw, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 }; " "audio/x-speex, channels = (int) { 1, 2 }, rate = (int) { 5512, 11025, 22050, 44100 };") ); static GstStaticPadTemplate video_src_template = GST_STATIC_PAD_TEMPLATE ("video", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("video/x-flash-video; " "video/x-flash-screen; " "video/x-vp6-flash; " "video/x-vp6-alpha; " "video/x-h264, stream-format=avc;") ); GST_DEBUG_CATEGORY_STATIC (flvdemux_debug); #define GST_CAT_DEFAULT flvdemux_debug GST_BOILERPLATE (GstFlvDemux, gst_flv_demux, GstElement, GST_TYPE_ELEMENT); /* 9 bytes of header + 4 bytes of first previous tag size */ #define FLV_HEADER_SIZE 13 /* 1 byte of tag type + 3 bytes of tag data size */ #define FLV_TAG_TYPE_SIZE 4 /* two seconds - consider pts are resynced to another base if this different */ #define RESYNC_THRESHOLD 2000 static gboolean flv_demux_handle_seek_push (GstFlvDemux * demux, GstEvent * event); static gboolean gst_flv_demux_handle_seek_pull (GstFlvDemux * demux, GstEvent * event, gboolean seeking); static gboolean gst_flv_demux_query (GstPad * pad, GstQuery * query); static gboolean gst_flv_demux_src_event (GstPad * pad, GstEvent * event); static void gst_flv_demux_parse_and_add_index_entry (GstFlvDemux * demux, GstClockTime ts, guint64 pos, gboolean keyframe) { static GstIndexAssociation associations[2]; static GstIndexEntry *entry; GST_LOG_OBJECT (demux, "adding key=%d association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT, keyframe, GST_TIME_ARGS (ts), pos); /* if upstream is not seekable there is no point in building an index */ if (!demux->upstream_seekable) return; /* entry may already have been added before, avoid adding indefinitely */ entry = gst_index_get_assoc_entry (demux->index, demux->index_id, GST_INDEX_LOOKUP_EXACT, GST_ASSOCIATION_FLAG_NONE, GST_FORMAT_BYTES, pos); if (entry) { #ifndef GST_DISABLE_GST_DEBUG gint64 time; gboolean key; gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time); key = ! !(GST_INDEX_ASSOC_FLAGS (entry) & GST_ASSOCIATION_FLAG_KEY_UNIT); GST_LOG_OBJECT (demux, "position already mapped to time %" GST_TIME_FORMAT ", keyframe %d", GST_TIME_ARGS (time), key); /* there is not really a way to delete the existing one */ if (time != ts || key != ! !keyframe) GST_DEBUG_OBJECT (demux, "metadata mismatch"); #endif return; } associations[0].format = GST_FORMAT_TIME; associations[0].value = ts; associations[1].format = GST_FORMAT_BYTES; associations[1].value = pos; gst_index_add_associationv (demux->index, demux->index_id, (keyframe) ? GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_DELTA_UNIT, 2, (const GstIndexAssociation *) &associations); if (pos > demux->index_max_pos) demux->index_max_pos = pos; if (ts > demux->index_max_time) demux->index_max_time = ts; } static gchar * FLV_GET_STRING (GstByteReader * reader) { guint16 string_size = 0; gchar *string = NULL; const guint8 *str = NULL; g_return_val_if_fail (reader != NULL, NULL); if (G_UNLIKELY (!gst_byte_reader_get_uint16_be (reader, &string_size))) return NULL; if (G_UNLIKELY (string_size > gst_byte_reader_get_remaining (reader))) return NULL; string = g_try_malloc0 (string_size + 1); if (G_UNLIKELY (!string)) { return NULL; } if (G_UNLIKELY (!gst_byte_reader_get_data (reader, string_size, &str))) { g_free (string); return NULL; } memcpy (string, str, string_size); if (!g_utf8_validate (string, string_size, NULL)) { g_free (string); return NULL; } return string; } static const GstQueryType * gst_flv_demux_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_DURATION, GST_QUERY_POSITION, GST_QUERY_SEEKING, 0 }; return query_types; } static void gst_flv_demux_check_seekability (GstFlvDemux * demux) { GstQuery *query; gint64 start = -1, stop = -1; demux->upstream_seekable = FALSE; query = gst_query_new_seeking (GST_FORMAT_BYTES); if (!gst_pad_peer_query (demux->sinkpad, query)) { GST_DEBUG_OBJECT (demux, "seeking query failed"); gst_query_unref (query); return; } gst_query_parse_seeking (query, NULL, &demux->upstream_seekable, &start, &stop); gst_query_unref (query); /* try harder to query upstream size if we didn't get it the first time */ if (demux->upstream_seekable && stop == -1) { GstFormat fmt = GST_FORMAT_BYTES; GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop"); gst_pad_query_peer_duration (demux->sinkpad, &fmt, &stop); } /* if upstream doesn't know the size, it's likely that it's not seekable in * practice even if it technically may be seekable */ if (demux->upstream_seekable && (start != 0 || stop <= start)) { GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable"); demux->upstream_seekable = FALSE; } GST_DEBUG_OBJECT (demux, "upstream seekable: %d", demux->upstream_seekable); } static void parse_flv_demux_parse_date_string (GDate * date, const gchar * s) { g_date_set_parse (date, s); if (g_date_valid (date)) return; /* "Fri Oct 15 15:13:16 2004" needs to be parsed */ { static const gchar *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; gchar **tokens = g_strsplit (s, " ", -1); guint64 d; gchar *endptr; gint i; if (g_strv_length (tokens) != 5) goto out; if (strlen (tokens[1]) != 3) goto out; for (i = 0; i < 12; i++) { if (!strcmp (tokens[1], months[i])) { break; } } if (i == 12) goto out; g_date_set_month (date, i + 1); d = g_ascii_strtoull (tokens[2], &endptr, 10); if (d == 0 && *endptr != '\0') goto out; g_date_set_day (date, d); d = g_ascii_strtoull (tokens[4], &endptr, 10); if (d == 0 && *endptr != '\0') goto out; g_date_set_year (date, d); out: if (tokens) g_strfreev (tokens); } } static gboolean gst_flv_demux_parse_metadata_item (GstFlvDemux * demux, GstByteReader * reader, gboolean * end_marker) { gchar *tag_name = NULL; guint8 tag_type = 0; /* Initialize the end_marker flag to FALSE */ *end_marker = FALSE; /* Name of the tag */ tag_name = FLV_GET_STRING (reader); if (G_UNLIKELY (!tag_name)) { GST_WARNING_OBJECT (demux, "failed reading tag name"); return FALSE; } /* What kind of object is that */ if (!gst_byte_reader_get_uint8 (reader, &tag_type)) goto error; GST_DEBUG_OBJECT (demux, "tag name %s, tag type %d", tag_name, tag_type); switch (tag_type) { case 0: // Double { /* Use a union to read the uint64 and then as a double */ gdouble d = 0; if (!gst_byte_reader_get_float64_be (reader, &d)) goto error; GST_DEBUG_OBJECT (demux, "%s => (double) %f", tag_name, d); if (!strcmp (tag_name, "duration")) { demux->duration = d * GST_SECOND; gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_DURATION, demux->duration, NULL); } else if (!strcmp (tag_name, "AspectRatioX")) { demux->par_x = d; demux->got_par = TRUE; } else if (!strcmp (tag_name, "AspectRatioY")) { demux->par_y = d; demux->got_par = TRUE; } else if (!strcmp (tag_name, "width")) { demux->w = d; } else if (!strcmp (tag_name, "height")) { demux->h = d; } else if (!strcmp (tag_name, "framerate")) { demux->framerate = d; } else { GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name); } break; } case 1: // Boolean { guint8 b = 0; if (!gst_byte_reader_get_uint8 (reader, &b)) goto error; GST_DEBUG_OBJECT (demux, "%s => (boolean) %d", tag_name, b); GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name); break; } case 2: // String { gchar *s = NULL; s = FLV_GET_STRING (reader); if (s == NULL) goto error; GST_DEBUG_OBJECT (demux, "%s => (string) %s", tag_name, s); if (!strcmp (tag_name, "creationdate")) { GDate *date = g_date_new (); parse_flv_demux_parse_date_string (date, s); if (!g_date_valid (date)) { GST_DEBUG_OBJECT (demux, "Failed to parse string as date"); } else { gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_DATE, date, NULL); } g_date_free (date); } else if (!strcmp (tag_name, "creator")) { gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_ARTIST, s, NULL); } else if (!strcmp (tag_name, "title")) { gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, s, NULL); } else if (!strcmp (tag_name, "metadatacreator")) { gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, s, NULL); } else { GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name); } g_free (s); break; } case 3: // Object { gboolean end_of_object_marker = FALSE; while (!end_of_object_marker) { gboolean ok = gst_flv_demux_parse_metadata_item (demux, reader, &end_of_object_marker); if (G_UNLIKELY (!ok)) { GST_WARNING_OBJECT (demux, "failed reading a tag, skipping"); goto error; } } break; } case 8: // ECMA array { guint32 nb_elems = 0; gboolean end_of_object_marker = FALSE; if (!gst_byte_reader_get_uint32_be (reader, &nb_elems)) goto error; GST_DEBUG_OBJECT (demux, "there are approx. %d elements in the array", nb_elems); while (!end_of_object_marker) { gboolean ok = gst_flv_demux_parse_metadata_item (demux, reader, &end_of_object_marker); if (G_UNLIKELY (!ok)) { GST_WARNING_OBJECT (demux, "failed reading a tag, skipping"); goto error; } } break; } case 9: // End marker { GST_DEBUG_OBJECT (demux, "end marker ?"); if (tag_name[0] == '\0') { GST_DEBUG_OBJECT (demux, "end marker detected"); *end_marker = TRUE; } break; } case 10: // Array { guint32 nb_elems = 0; if (!gst_byte_reader_get_uint32_be (reader, &nb_elems)) goto error; GST_DEBUG_OBJECT (demux, "array has %d elements", nb_elems); if (!strcmp (tag_name, "times")) { if (demux->times) { g_array_free (demux->times, TRUE); } demux->times = g_array_new (FALSE, TRUE, sizeof (gdouble)); } else if (!strcmp (tag_name, "filepositions")) { if (demux->filepositions) { g_array_free (demux->filepositions, TRUE); } demux->filepositions = g_array_new (FALSE, TRUE, sizeof (gdouble)); } while (nb_elems--) { guint8 elem_type = 0; if (!gst_byte_reader_get_uint8 (reader, &elem_type)) goto error; switch (elem_type) { case 0: { gdouble d; if (!gst_byte_reader_get_float64_be (reader, &d)) goto error; GST_DEBUG_OBJECT (demux, "element is a double %f", d); if (!strcmp (tag_name, "times") && demux->times) { g_array_append_val (demux->times, d); } else if (!strcmp (tag_name, "filepositions") && demux->filepositions) { g_array_append_val (demux->filepositions, d); } break; } default: GST_WARNING_OBJECT (demux, "unsupported array element type %d", elem_type); } } break; } case 11: // Date { gdouble d = 0; gint16 i = 0; if (!gst_byte_reader_get_float64_be (reader, &d)) goto error; if (!gst_byte_reader_get_int16_be (reader, &i)) goto error; GST_DEBUG_OBJECT (demux, "%s => (date as a double) %f, timezone offset %d", tag_name, d, i); GST_INFO_OBJECT (demux, "Tag \'%s\' not handled", tag_name); break; } default: GST_WARNING_OBJECT (demux, "unsupported tag type %d", tag_type); } g_free (tag_name); return TRUE; error: g_free (tag_name); return FALSE; } static GstFlowReturn gst_flv_demux_parse_tag_script (GstFlvDemux * demux, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); guint8 type = 0; g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 7, GST_FLOW_ERROR); gst_byte_reader_skip (&reader, 7); GST_LOG_OBJECT (demux, "parsing a script tag"); if (!gst_byte_reader_get_uint8 (&reader, &type)) return GST_FLOW_OK; /* Must be string */ if (type == 2) { gchar *function_name; guint i; function_name = FLV_GET_STRING (&reader); GST_LOG_OBJECT (demux, "function name is %s", GST_STR_NULL (function_name)); if (function_name != NULL && strcmp (function_name, "onMetaData") == 0) { gboolean end_marker = FALSE; GST_DEBUG_OBJECT (demux, "we have a metadata script object"); if (!gst_byte_reader_get_uint8 (&reader, &type)) { g_free (function_name); return GST_FLOW_OK; } switch (type) { case 8: { guint32 nb_elems = 0; /* ECMA array */ if (!gst_byte_reader_get_uint32_be (&reader, &nb_elems)) { g_free (function_name); return GST_FLOW_OK; } /* The number of elements is just a hint, some files have nb_elements == 0 and actually contain items. */ GST_DEBUG_OBJECT (demux, "there are approx. %d elements in the array", nb_elems); } /* fallthrough to read data */ case 3: { /* Object */ while (!end_marker) { gboolean ok = gst_flv_demux_parse_metadata_item (demux, &reader, &end_marker); if (G_UNLIKELY (!ok)) { GST_WARNING_OBJECT (demux, "failed reading a tag, skipping"); break; } } } break; default: GST_DEBUG_OBJECT (demux, "Unhandled script data type : %d", type); g_free (function_name); return GST_FLOW_OK; } demux->push_tags = TRUE; } g_free (function_name); if (demux->index && demux->times && demux->filepositions) { guint num; /* If an index was found, insert associations */ num = MIN (demux->times->len, demux->filepositions->len); for (i = 0; i < num; i++) { guint64 time, fileposition; time = g_array_index (demux->times, gdouble, i) * GST_SECOND; fileposition = g_array_index (demux->filepositions, gdouble, i); gst_flv_demux_parse_and_add_index_entry (demux, time, fileposition, TRUE); } demux->indexed = TRUE; } } return ret; } static gboolean gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag, guint32 rate, guint32 channels, guint32 width) { GstCaps *caps = NULL; gchar *codec_name = NULL; gboolean ret = FALSE; guint adjusted_rate = rate; switch (codec_tag) { case 1: caps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, "swf", NULL); break; case 2: case 14: caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); break; case 0: case 3: /* Assuming little endian for 0 (aka endianness of the * system on which the file was created) as most people * are probably using little endian machines */ caps = gst_caps_new_simple ("audio/x-raw-int", "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, "signed", G_TYPE_BOOLEAN, (width == 8) ? FALSE : TRUE, "width", G_TYPE_INT, width, "depth", G_TYPE_INT, width, NULL); break; case 4: case 5: case 6: caps = gst_caps_new_simple ("audio/x-nellymoser", NULL); break; case 10: { /* use codec-data to extract and verify samplerate */ if (demux->audio_codec_data && GST_BUFFER_SIZE (demux->audio_codec_data) >= 2) { gint freq_index; freq_index = ((GST_READ_UINT16_BE (GST_BUFFER_DATA (demux->audio_codec_data)))); freq_index = (freq_index & 0x0780) >> 7; adjusted_rate = gst_codec_utils_aac_get_sample_rate_from_index (freq_index); if (adjusted_rate && (rate != adjusted_rate)) { GST_LOG_OBJECT (demux, "Ajusting AAC sample rate %d -> %d", rate, adjusted_rate); } else { adjusted_rate = rate; } } caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, "framed", G_TYPE_BOOLEAN, TRUE, "stream-format", G_TYPE_STRING, "raw", NULL); break; } case 7: caps = gst_caps_new_simple ("audio/x-alaw", NULL); break; case 8: caps = gst_caps_new_simple ("audio/x-mulaw", NULL); break; case 11: caps = gst_caps_new_simple ("audio/x-speex", NULL); break; default: GST_WARNING_OBJECT (demux, "unsupported audio codec tag %u", codec_tag); } if (G_UNLIKELY (!caps)) { GST_WARNING_OBJECT (demux, "failed creating caps for audio pad"); goto beach; } gst_caps_set_simple (caps, "rate", G_TYPE_INT, adjusted_rate, "channels", G_TYPE_INT, channels, NULL); if (demux->audio_codec_data) { gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, demux->audio_codec_data, NULL); } ret = gst_pad_set_caps (demux->audio_pad, caps); if (G_LIKELY (ret)) { /* Store the caps we got from tags */ demux->audio_codec_tag = codec_tag; demux->rate = rate; demux->channels = channels; demux->width = width; codec_name = gst_pb_utils_get_codec_description (caps); if (codec_name) { if (demux->taglist == NULL) demux->taglist = gst_tag_list_new (); gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, codec_name, NULL); g_free (codec_name); } GST_DEBUG_OBJECT (demux->audio_pad, "successfully negotiated caps %" GST_PTR_FORMAT, caps); } else { GST_WARNING_OBJECT (demux->audio_pad, "failed negotiating caps %" GST_PTR_FORMAT, caps); } gst_caps_unref (caps); beach: return ret; } static void gst_flv_demux_push_tags (GstFlvDemux * demux) { if (demux->has_audio && !demux->audio_pad) { GST_DEBUG_OBJECT (demux, "Waiting for audio stream pad to come up before we can push tags"); return; } if (demux->has_video && !demux->video_pad) { GST_DEBUG_OBJECT (demux, "Waiting for video stream pad to come up before we can push tags"); return; } if (demux->taglist) { GST_DEBUG_OBJECT (demux, "pushing tags out %" GST_PTR_FORMAT, demux->taglist); gst_element_found_tags (GST_ELEMENT (demux), demux->taglist); demux->taglist = gst_tag_list_new (); demux->push_tags = FALSE; } } static void gst_flv_demux_update_resync (GstFlvDemux * demux, guint32 pts, gboolean discont, guint32 * last, GstClockTime * offset) { gint32 dpts = pts - *last; if (!discont && ABS (dpts) >= RESYNC_THRESHOLD) { /* Theoretically, we should use substract the duration of the last buffer, but this demuxer sends no durations on buffers, not sure if it cannot know, or just does not care to calculate. */ *offset -= dpts * GST_MSECOND; GST_WARNING_OBJECT (demux, "Large pts gap (%" G_GINT32_FORMAT " ms), assuming resync, offset now %" GST_TIME_FORMAT "", dpts, GST_TIME_ARGS (*offset)); } *last = pts; } static GstFlowReturn gst_flv_demux_parse_tag_audio (GstFlvDemux * demux, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; guint32 pts = 0, codec_tag = 0, rate = 5512, width = 8, channels = 1; guint32 codec_data = 0, pts_ext = 0; guint8 flags = 0; guint8 *data = GST_BUFFER_DATA (buffer); GstBuffer *outbuf; GST_LOG_OBJECT (demux, "parsing an audio tag"); if (demux->no_more_pads && !demux->audio_pad) { GST_WARNING_OBJECT (demux, "Signaled no-more-pads already but had no audio pad -- ignoring"); goto beach; } g_return_val_if_fail (GST_BUFFER_SIZE (buffer) == demux->tag_size, GST_FLOW_ERROR); /* Grab information about audio tag */ pts = GST_READ_UINT24_BE (data); /* read the pts extension to 32 bits integer */ pts_ext = GST_READ_UINT8 (data + 3); /* Combine them */ pts |= pts_ext << 24; GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X (%d)", data[0], data[1], data[2], data[3], pts); /* Error out on tags with too small headers */ if (GST_BUFFER_SIZE (buffer) < 11) { GST_ERROR_OBJECT (demux, "Too small tag size (%d)", GST_BUFFER_SIZE (buffer)); return GST_FLOW_ERROR; } /* Silently skip buffers with no data */ if (GST_BUFFER_SIZE (buffer) == 11) return GST_FLOW_OK; /* Skip the stream id and go directly to the flags */ flags = GST_READ_UINT8 (data + 7); /* Channels */ if (flags & 0x01) { channels = 2; } /* Width */ if (flags & 0x02) { width = 16; } /* Sampling rate */ if ((flags & 0x0C) == 0x0C) { rate = 44100; } else if ((flags & 0x0C) == 0x08) { rate = 22050; } else if ((flags & 0x0C) == 0x04) { rate = 11025; } /* Codec tag */ codec_tag = flags >> 4; if (codec_tag == 10) { /* AAC has an extra byte for packet type */ codec_data = 2; } else { codec_data = 1; } /* codec tags with special rates */ if (codec_tag == 5 || codec_tag == 14) rate = 8000; else if (codec_tag == 4) rate = 16000; GST_LOG_OBJECT (demux, "audio tag with %d channels, %dHz sampling rate, " "%d bits width, codec tag %u (flags %02X)", channels, rate, width, codec_tag, flags); /* If we don't have our audio pad created, then create it. */ if (G_UNLIKELY (!demux->audio_pad)) { demux->audio_pad = gst_pad_new_from_template (gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (demux), "audio"), "audio"); if (G_UNLIKELY (!demux->audio_pad)) { GST_WARNING_OBJECT (demux, "failed creating audio pad"); ret = GST_FLOW_ERROR; goto beach; } /* Negotiate caps */ if (!gst_flv_demux_audio_negotiate (demux, codec_tag, rate, channels, width)) { gst_object_unref (demux->audio_pad); demux->audio_pad = NULL; ret = GST_FLOW_ERROR; goto beach; } GST_DEBUG_OBJECT (demux, "created audio pad with caps %" GST_PTR_FORMAT, GST_PAD_CAPS (demux->audio_pad)); /* Set functions on the pad */ gst_pad_set_query_type_function (demux->audio_pad, GST_DEBUG_FUNCPTR (gst_flv_demux_query_types)); gst_pad_set_query_function (demux->audio_pad, GST_DEBUG_FUNCPTR (gst_flv_demux_query)); gst_pad_set_event_function (demux->audio_pad, GST_DEBUG_FUNCPTR (gst_flv_demux_src_event)); gst_pad_use_fixed_caps (demux->audio_pad); /* Make it active */ gst_pad_set_active (demux->audio_pad, TRUE); /* We need to set caps before adding */ gst_element_add_pad (GST_ELEMENT (demux), gst_object_ref (demux->audio_pad)); /* We only emit no more pads when we have audio and video. Indeed we can * not trust the FLV header to tell us if there will be only audio or * only video and we would just break discovery of some files */ if (demux->audio_pad && demux->video_pad) { GST_DEBUG_OBJECT (demux, "emitting no more pads"); gst_element_no_more_pads (GST_ELEMENT (demux)); demux->no_more_pads = TRUE; demux->push_tags = TRUE; } } /* Check if caps have changed */ if (G_UNLIKELY (rate != demux->rate || channels != demux->channels || codec_tag != demux->audio_codec_tag || width != demux->width)) { GST_DEBUG_OBJECT (demux, "audio settings have changed, changing caps"); /* Negotiate caps */ if (!gst_flv_demux_audio_negotiate (demux, codec_tag, rate, channels, width)) { ret = GST_FLOW_ERROR; goto beach; } } /* Push taglist if present */ if (G_UNLIKELY (demux->push_tags)) gst_flv_demux_push_tags (demux); /* Check if we have anything to push */ if (demux->tag_data_size <= codec_data) { GST_LOG_OBJECT (demux, "Nothing left in this tag, returning"); goto beach; } /* Create buffer from pad */ outbuf = gst_buffer_create_sub (buffer, 7 + codec_data, demux->tag_data_size - codec_data); if (demux->audio_codec_tag == 10) { guint8 aac_packet_type = GST_READ_UINT8 (data + 8); switch (aac_packet_type) { case 0: { /* AudioSpecificConfig data */ GST_LOG_OBJECT (demux, "got an AAC codec data packet"); if (demux->audio_codec_data) { gst_buffer_unref (demux->audio_codec_data); } demux->audio_codec_data = outbuf; /* Use that buffer data in the caps */ gst_flv_demux_audio_negotiate (demux, codec_tag, rate, channels, width); goto beach; break; } case 1: /* AAC raw packet */ GST_LOG_OBJECT (demux, "got a raw AAC audio packet"); break; default: GST_WARNING_OBJECT (demux, "invalid AAC packet type %u", aac_packet_type); } } /* detect (and deem to be resyncs) large pts gaps */ gst_flv_demux_update_resync (demux, pts, demux->audio_need_discont, &demux->last_audio_pts, &demux->audio_time_offset); /* Fill buffer with data */ GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->audio_time_offset; GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (outbuf) = demux->audio_offset++; GST_BUFFER_OFFSET_END (outbuf) = demux->audio_offset; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (demux->audio_pad)); if (demux->duration == GST_CLOCK_TIME_NONE || demux->duration < GST_BUFFER_TIMESTAMP (outbuf)) demux->duration = GST_BUFFER_TIMESTAMP (outbuf); /* Only add audio frames to the index if we have no video, * and if the index is not yet complete */ if (!demux->has_video && demux->index && !demux->indexed) { gst_flv_demux_parse_and_add_index_entry (demux, GST_BUFFER_TIMESTAMP (outbuf), demux->cur_tag_offset, TRUE); } if (G_UNLIKELY (demux->audio_need_discont)) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); demux->audio_need_discont = FALSE; } gst_segment_set_last_stop (&demux->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf)); /* Do we need a newsegment event ? */ if (G_UNLIKELY (demux->audio_need_segment)) { if (demux->close_seg_event) gst_pad_push_event (demux->audio_pad, gst_event_ref (demux->close_seg_event)); if (!demux->new_seg_event) { GST_DEBUG_OBJECT (demux, "pushing newsegment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->segment.last_stop), GST_TIME_ARGS (demux->segment.stop)); demux->new_seg_event = gst_event_new_new_segment (FALSE, demux->segment.rate, demux->segment.format, demux->segment.last_stop, demux->segment.stop, demux->segment.last_stop); } else { GST_DEBUG_OBJECT (demux, "pushing pre-generated newsegment event"); } gst_pad_push_event (demux->audio_pad, gst_event_ref (demux->new_seg_event)); demux->audio_need_segment = FALSE; } GST_LOG_OBJECT (demux, "pushing %d bytes buffer at pts %" GST_TIME_FORMAT " with duration %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf)); if (!GST_CLOCK_TIME_IS_VALID (demux->audio_start)) { demux->audio_start = GST_BUFFER_TIMESTAMP (outbuf); } if (!GST_CLOCK_TIME_IS_VALID (demux->audio_first_ts)) { demux->audio_first_ts = GST_BUFFER_TIMESTAMP (outbuf); } if (G_UNLIKELY (!demux->no_more_pads && (GST_CLOCK_DIFF (demux->audio_start, GST_BUFFER_TIMESTAMP (outbuf)) > 6 * GST_SECOND))) { GST_DEBUG_OBJECT (demux, "Signalling no-more-pads because no video stream was found" " after 6 seconds of audio"); gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); demux->no_more_pads = TRUE; demux->push_tags = TRUE; } /* Push downstream */ ret = gst_pad_push (demux->audio_pad, outbuf); if (G_UNLIKELY (ret != GST_FLOW_OK)) { if (demux->segment.rate < 0.0 && ret == GST_FLOW_UNEXPECTED && demux->segment.last_stop > demux->segment.stop) { /* In reverse playback we can get a GST_FLOW_UNEXPECTED when * we are at the end of the segment, so we just need to jump * back to the previous section. */ GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); demux->audio_done = TRUE; ret = GST_FLOW_OK; } else { GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT " bytes audio buffer: %s", demux->tag_data_size, gst_flow_get_name (ret)); if (ret == GST_FLOW_NOT_LINKED) { demux->audio_linked = FALSE; } goto beach; } } demux->audio_linked = TRUE; beach: return ret; } static gboolean gst_flv_demux_video_negotiate (GstFlvDemux * demux, guint32 codec_tag) { gboolean ret = FALSE; GstCaps *caps = NULL; gchar *codec_name = NULL; /* Generate caps for that pad */ switch (codec_tag) { case 2: caps = gst_caps_new_simple ("video/x-flash-video", NULL); break; case 3: caps = gst_caps_new_simple ("video/x-flash-screen", NULL); break; case 4: caps = gst_caps_new_simple ("video/x-vp6-flash", NULL); break; case 5: caps = gst_caps_new_simple ("video/x-vp6-alpha", NULL); break; case 7: caps = gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING, "avc", NULL); break; default: GST_WARNING_OBJECT (demux, "unsupported video codec tag %u", codec_tag); } if (G_UNLIKELY (!caps)) { GST_WARNING_OBJECT (demux, "failed creating caps for video pad"); goto beach; } gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, demux->par_x, demux->par_y, NULL); if (G_LIKELY (demux->w)) { gst_caps_set_simple (caps, "width", G_TYPE_INT, demux->w, NULL); } if (G_LIKELY (demux->h)) { gst_caps_set_simple (caps, "height", G_TYPE_INT, demux->h, NULL); } if (G_LIKELY (demux->framerate)) { gint num = 0, den = 0; gst_util_double_to_fraction (demux->framerate, &num, &den); GST_DEBUG_OBJECT (demux->video_pad, "fps to be used on caps %f (as a fraction = %d/%d)", demux->framerate, num, den); gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, num, den, NULL); } if (demux->video_codec_data) { gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, demux->video_codec_data, NULL); } ret = gst_pad_set_caps (demux->video_pad, caps); if (G_LIKELY (ret)) { /* Store the caps we have set */ demux->video_codec_tag = codec_tag; codec_name = gst_pb_utils_get_codec_description (caps); if (codec_name) { if (demux->taglist == NULL) demux->taglist = gst_tag_list_new (); gst_tag_list_add (demux->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_VIDEO_CODEC, codec_name, NULL); g_free (codec_name); } GST_DEBUG_OBJECT (demux->video_pad, "successfully negotiated caps %" GST_PTR_FORMAT, caps); } else { GST_WARNING_OBJECT (demux->video_pad, "failed negotiating caps %" GST_PTR_FORMAT, caps); } gst_caps_unref (caps); beach: return ret; } static GstFlowReturn gst_flv_demux_parse_tag_video (GstFlvDemux * demux, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; guint32 pts = 0, codec_data = 1, pts_ext = 0; gboolean keyframe = FALSE; guint8 flags = 0, codec_tag = 0; guint8 *data = GST_BUFFER_DATA (buffer); GstBuffer *outbuf; g_return_val_if_fail (GST_BUFFER_SIZE (buffer) == demux->tag_size, GST_FLOW_ERROR); GST_LOG_OBJECT (demux, "parsing a video tag"); if (demux->no_more_pads && !demux->video_pad) { GST_WARNING_OBJECT (demux, "Signaled no-more-pads already but had no audio pad -- ignoring"); goto beach; } /* Grab information about video tag */ pts = GST_READ_UINT24_BE (data); /* read the pts extension to 32 bits integer */ pts_ext = GST_READ_UINT8 (data + 3); /* Combine them */ pts |= pts_ext << 24; GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X (%d)", data[0], data[1], data[2], data[3], pts); if (GST_BUFFER_SIZE (buffer) < 12) { GST_ERROR_OBJECT (demux, "Too small tag size"); return GST_FLOW_ERROR; } /* Skip the stream id and go directly to the flags */ flags = GST_READ_UINT8 (data + 7); /* Keyframe */ if ((flags >> 4) == 1) { keyframe = TRUE; } /* Codec tag */ codec_tag = flags & 0x0F; if (codec_tag == 4 || codec_tag == 5) { codec_data = 2; } else if (codec_tag == 7) { gint32 cts; codec_data = 5; cts = GST_READ_UINT24_BE (data + 9); cts = (cts + 0xff800000) ^ 0xff800000; GST_LOG_OBJECT (demux, "got cts %d", cts); /* avoid negative overflow */ if (cts >= 0 || pts >= -cts) pts += cts; } GST_LOG_OBJECT (demux, "video tag with codec tag %u, keyframe (%d) " "(flags %02X)", codec_tag, keyframe, flags); /* If we don't have our video pad created, then create it. */ if (G_UNLIKELY (!demux->video_pad)) { demux->video_pad = gst_pad_new_from_template (gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (demux), "video"), "video"); if (G_UNLIKELY (!demux->video_pad)) { GST_WARNING_OBJECT (demux, "failed creating video pad"); ret = GST_FLOW_ERROR; goto beach; } if (!gst_flv_demux_video_negotiate (demux, codec_tag)) { gst_object_unref (demux->video_pad); demux->video_pad = NULL; ret = GST_FLOW_ERROR; goto beach; } /* When we ve set pixel-aspect-ratio we use that boolean to detect a * metadata tag that would come later and trigger a caps change */ demux->got_par = FALSE; GST_DEBUG_OBJECT (demux, "created video pad with caps %" GST_PTR_FORMAT, GST_PAD_CAPS (demux->video_pad)); /* Set functions on the pad */ gst_pad_set_query_type_function (demux->video_pad, GST_DEBUG_FUNCPTR (gst_flv_demux_query_types)); gst_pad_set_query_function (demux->video_pad, GST_DEBUG_FUNCPTR (gst_flv_demux_query)); gst_pad_set_event_function (demux->video_pad, GST_DEBUG_FUNCPTR (gst_flv_demux_src_event)); gst_pad_use_fixed_caps (demux->video_pad); /* Make it active */ gst_pad_set_active (demux->video_pad, TRUE); /* We need to set caps before adding */ gst_element_add_pad (GST_ELEMENT (demux), gst_object_ref (demux->video_pad)); /* We only emit no more pads when we have audio and video. Indeed we can * not trust the FLV header to tell us if there will be only audio or * only video and we would just break discovery of some files */ if (demux->audio_pad && demux->video_pad) { GST_DEBUG_OBJECT (demux, "emitting no more pads"); gst_element_no_more_pads (GST_ELEMENT (demux)); demux->no_more_pads = TRUE; demux->push_tags = TRUE; } } /* Check if caps have changed */ if (G_UNLIKELY (codec_tag != demux->video_codec_tag || demux->got_par)) { GST_DEBUG_OBJECT (demux, "video settings have changed, changing caps"); if (!gst_flv_demux_video_negotiate (demux, codec_tag)) { ret = GST_FLOW_ERROR; goto beach; } /* When we ve set pixel-aspect-ratio we use that boolean to detect a * metadata tag that would come later and trigger a caps change */ demux->got_par = FALSE; } /* Push taglist if present */ if (G_UNLIKELY (demux->push_tags)) gst_flv_demux_push_tags (demux); /* Check if we have anything to push */ if (demux->tag_data_size <= codec_data) { GST_LOG_OBJECT (demux, "Nothing left in this tag, returning"); goto beach; } /* Create buffer from pad */ outbuf = gst_buffer_create_sub (buffer, 7 + codec_data, demux->tag_data_size - codec_data); if (demux->video_codec_tag == 7) { guint8 avc_packet_type = GST_READ_UINT8 (data + 8); switch (avc_packet_type) { case 0: { /* AVCDecoderConfigurationRecord data */ GST_LOG_OBJECT (demux, "got an H.264 codec data packet"); if (demux->video_codec_data) { gst_buffer_unref (demux->video_codec_data); } demux->video_codec_data = outbuf; /* Use that buffer data in the caps */ gst_flv_demux_video_negotiate (demux, codec_tag); goto beach; break; } case 1: /* H.264 NALU packet */ GST_LOG_OBJECT (demux, "got a H.264 NALU video packet"); break; default: GST_WARNING_OBJECT (demux, "invalid video packet type %u", avc_packet_type); } } /* detect (and deem to be resyncs) large pts gaps */ gst_flv_demux_update_resync (demux, pts, demux->video_need_discont, &demux->last_video_pts, &demux->video_time_offset); /* Fill buffer with data */ GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->video_time_offset; GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (outbuf) = demux->video_offset++; GST_BUFFER_OFFSET_END (outbuf) = demux->video_offset; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (demux->video_pad)); if (demux->duration == GST_CLOCK_TIME_NONE || demux->duration < GST_BUFFER_TIMESTAMP (outbuf)) demux->duration = GST_BUFFER_TIMESTAMP (outbuf); if (!keyframe) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); if (!demux->indexed && demux->index) { gst_flv_demux_parse_and_add_index_entry (demux, GST_BUFFER_TIMESTAMP (outbuf), demux->cur_tag_offset, keyframe); } if (G_UNLIKELY (demux->video_need_discont)) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); demux->video_need_discont = FALSE; } gst_segment_set_last_stop (&demux->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf)); /* Do we need a newsegment event ? */ if (G_UNLIKELY (demux->video_need_segment)) { if (demux->close_seg_event) gst_pad_push_event (demux->video_pad, gst_event_ref (demux->close_seg_event)); if (!demux->new_seg_event) { GST_DEBUG_OBJECT (demux, "pushing newsegment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->segment.last_stop), GST_TIME_ARGS (demux->segment.stop)); demux->new_seg_event = gst_event_new_new_segment (FALSE, demux->segment.rate, demux->segment.format, demux->segment.last_stop, demux->segment.stop, demux->segment.last_stop); } else { GST_DEBUG_OBJECT (demux, "pushing pre-generated newsegment event"); } gst_pad_push_event (demux->video_pad, gst_event_ref (demux->new_seg_event)); demux->video_need_segment = FALSE; } GST_LOG_OBJECT (demux, "pushing %d bytes buffer at pts %" GST_TIME_FORMAT " with duration %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT ", keyframe (%d)", GST_BUFFER_SIZE (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), keyframe); if (!GST_CLOCK_TIME_IS_VALID (demux->video_start)) { demux->video_start = GST_BUFFER_TIMESTAMP (outbuf); } if (!GST_CLOCK_TIME_IS_VALID (demux->audio_first_ts)) { demux->video_first_ts = GST_BUFFER_TIMESTAMP (outbuf); } if (G_UNLIKELY (!demux->no_more_pads && (GST_CLOCK_DIFF (demux->video_start, GST_BUFFER_TIMESTAMP (outbuf)) > 6 * GST_SECOND))) { GST_DEBUG_OBJECT (demux, "Signalling no-more-pads because no audio stream was found" " after 6 seconds of video"); gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); demux->no_more_pads = TRUE; demux->push_tags = TRUE; } /* Push downstream */ ret = gst_pad_push (demux->video_pad, outbuf); if (G_UNLIKELY (ret != GST_FLOW_OK)) { if (demux->segment.rate < 0.0 && ret == GST_FLOW_UNEXPECTED && demux->segment.last_stop > demux->segment.stop) { /* In reverse playback we can get a GST_FLOW_UNEXPECTED when * we are at the end of the segment, so we just need to jump * back to the previous section. */ GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); demux->video_done = TRUE; ret = GST_FLOW_OK; } else { GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT " bytes video buffer: %s", demux->tag_data_size, gst_flow_get_name (ret)); if (ret == GST_FLOW_NOT_LINKED) { demux->video_linked = FALSE; } goto beach; } } demux->video_linked = TRUE; beach: return ret; } static GstClockTime gst_flv_demux_parse_tag_timestamp (GstFlvDemux * demux, gboolean index, GstBuffer * buffer, size_t * tag_size) { guint32 pts = 0, pts_ext = 0; guint32 tag_data_size; guint8 type; gboolean keyframe = TRUE; GstClockTime ret; guint8 *data = GST_BUFFER_DATA (buffer); g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 12, GST_CLOCK_TIME_NONE); type = data[0]; if (type != 9 && type != 8 && type != 18) { GST_WARNING_OBJECT (demux, "Unsupported tag type %u", data[0]); return GST_CLOCK_TIME_NONE; } if (type == 9) demux->has_video = TRUE; else if (type == 8) demux->has_audio = TRUE; tag_data_size = GST_READ_UINT24_BE (data + 1); if (GST_BUFFER_SIZE (buffer) >= tag_data_size + 11 + 4) { if (GST_READ_UINT32_BE (data + tag_data_size + 11) != tag_data_size + 11) { GST_WARNING_OBJECT (demux, "Invalid tag size"); return GST_CLOCK_TIME_NONE; } } if (tag_size) *tag_size = tag_data_size + 11 + 4; data += 4; GST_LOG_OBJECT (demux, "pts bytes %02X %02X %02X %02X", data[0], data[1], data[2], data[3]); /* Grab timestamp of tag tag */ pts = GST_READ_UINT24_BE (data); /* read the pts extension to 32 bits integer */ pts_ext = GST_READ_UINT8 (data + 3); /* Combine them */ pts |= pts_ext << 24; if (type == 9) { data += 7; keyframe = ((data[0] >> 4) == 1); } ret = pts * GST_MSECOND; GST_LOG_OBJECT (demux, "pts: %" GST_TIME_FORMAT, GST_TIME_ARGS (ret)); if (index && demux->index && !demux->indexed && (type == 9 || (type == 8 && !demux->has_video))) { gst_flv_demux_parse_and_add_index_entry (demux, ret, demux->offset, keyframe); } if (demux->duration == GST_CLOCK_TIME_NONE || demux->duration < ret) demux->duration = ret; return ret; } static GstFlowReturn gst_flv_demux_parse_tag_type (GstFlvDemux * demux, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; guint8 tag_type = 0; guint8 *data = GST_BUFFER_DATA (buffer); g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 4, GST_FLOW_ERROR); tag_type = data[0]; switch (tag_type) { case 9: demux->state = FLV_STATE_TAG_VIDEO; demux->has_video = TRUE; break; case 8: demux->state = FLV_STATE_TAG_AUDIO; demux->has_audio = TRUE; break; case 18: demux->state = FLV_STATE_TAG_SCRIPT; break; default: GST_WARNING_OBJECT (demux, "unsupported tag type %u", tag_type); } /* Tag size is 1 byte of type + 3 bytes of size + 7 bytes + tag data size + * 4 bytes of previous tag size */ demux->tag_data_size = GST_READ_UINT24_BE (data + 1); demux->tag_size = demux->tag_data_size + 11; GST_LOG_OBJECT (demux, "tag data size is %" G_GUINT64_FORMAT, demux->tag_data_size); return ret; } static GstFlowReturn gst_flv_demux_parse_header (GstFlvDemux * demux, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; guint8 *data = GST_BUFFER_DATA (buffer); g_return_val_if_fail (GST_BUFFER_SIZE (buffer) >= 9, GST_FLOW_ERROR); /* Check for the FLV tag */ if (data[0] == 'F' && data[1] == 'L' && data[2] == 'V') { GST_DEBUG_OBJECT (demux, "FLV header detected"); } else { if (G_UNLIKELY (demux->strict)) { GST_WARNING_OBJECT (demux, "invalid header tag detected"); ret = GST_FLOW_UNEXPECTED; goto beach; } } /* Jump over the 4 first bytes */ data += 4; /* Now look at audio/video flags */ { guint8 flags = data[0]; demux->has_video = demux->has_audio = FALSE; if (flags & 1) { GST_DEBUG_OBJECT (demux, "there is a video stream"); demux->has_video = TRUE; } if (flags & 4) { GST_DEBUG_OBJECT (demux, "there is an audio stream"); demux->has_audio = TRUE; } } /* do a one-time seekability check */ gst_flv_demux_check_seekability (demux); /* We don't care about the rest */ demux->need_header = FALSE; beach: return ret; } static void gst_flv_demux_flush (GstFlvDemux * demux, gboolean discont) { GST_DEBUG_OBJECT (demux, "flushing queued data in the FLV demuxer"); gst_adapter_clear (demux->adapter); demux->audio_need_discont = TRUE; demux->video_need_discont = TRUE; demux->flushing = FALSE; /* Only in push mode and if we're not during a seek */ if (!demux->random_access && demux->state != FLV_STATE_SEEK) { /* After a flush we expect a tag_type */ demux->state = FLV_STATE_TAG_TYPE; /* We reset the offset and will get one from first push */ demux->offset = 0; } } static void gst_flv_demux_cleanup (GstFlvDemux * demux) { GST_DEBUG_OBJECT (demux, "cleaning up FLV demuxer"); demux->state = FLV_STATE_HEADER; demux->flushing = FALSE; demux->need_header = TRUE; demux->audio_need_segment = TRUE; demux->video_need_segment = TRUE; demux->audio_need_discont = TRUE; demux->video_need_discont = TRUE; /* By default we consider them as linked */ demux->audio_linked = TRUE; demux->video_linked = TRUE; demux->has_audio = FALSE; demux->has_video = FALSE; demux->push_tags = FALSE; demux->got_par = FALSE; demux->indexed = FALSE; demux->upstream_seekable = FALSE; demux->file_size = 0; demux->index_max_pos = 0; demux->index_max_time = 0; demux->audio_start = demux->video_start = GST_CLOCK_TIME_NONE; demux->last_audio_pts = demux->last_video_pts = 0; demux->audio_time_offset = demux->video_time_offset = 0; demux->no_more_pads = FALSE; gst_segment_init (&demux->segment, GST_FORMAT_TIME); demux->w = demux->h = 0; demux->framerate = 0.0; demux->par_x = demux->par_y = 1; demux->video_offset = 0; demux->audio_offset = 0; demux->offset = demux->cur_tag_offset = 0; demux->tag_size = demux->tag_data_size = 0; demux->duration = GST_CLOCK_TIME_NONE; if (demux->new_seg_event) { gst_event_unref (demux->new_seg_event); demux->new_seg_event = NULL; } if (demux->close_seg_event) { gst_event_unref (demux->close_seg_event); demux->close_seg_event = NULL; } gst_adapter_clear (demux->adapter); if (demux->audio_codec_data) { gst_buffer_unref (demux->audio_codec_data); demux->audio_codec_data = NULL; } if (demux->video_codec_data) { gst_buffer_unref (demux->video_codec_data); demux->video_codec_data = NULL; } if (demux->audio_pad) { gst_element_remove_pad (GST_ELEMENT (demux), demux->audio_pad); gst_object_unref (demux->audio_pad); demux->audio_pad = NULL; } if (demux->video_pad) { gst_element_remove_pad (GST_ELEMENT (demux), demux->video_pad); gst_object_unref (demux->video_pad); demux->video_pad = NULL; } if (demux->times) { g_array_free (demux->times, TRUE); demux->times = NULL; } if (demux->filepositions) { g_array_free (demux->filepositions, TRUE); demux->filepositions = NULL; } } /* * Create and push a flushing seek event upstream */ static gboolean flv_demux_seek_to_offset (GstFlvDemux * demux, guint64 offset) { GstEvent *event; gboolean res = 0; GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); event = gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, -1); res = gst_pad_push_event (demux->sinkpad, event); if (res) demux->offset = offset; return res; } static GstFlowReturn gst_flv_demux_chain (GstPad * pad, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; GstFlvDemux *demux = NULL; demux = GST_FLV_DEMUX (gst_pad_get_parent (pad)); GST_LOG_OBJECT (demux, "received buffer of %d bytes at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), GST_BUFFER_OFFSET (buffer)); if (G_UNLIKELY (GST_BUFFER_OFFSET (buffer) == 0)) { GST_DEBUG_OBJECT (demux, "beginning of file, expect header"); demux->state = FLV_STATE_HEADER; demux->offset = 0; } if (G_UNLIKELY (demux->offset == 0 && GST_BUFFER_OFFSET (buffer) != 0)) { GST_DEBUG_OBJECT (demux, "offset was zero, synchronizing with buffer's"); demux->offset = GST_BUFFER_OFFSET (buffer); } if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { GST_DEBUG_OBJECT (demux, "Discontinuity"); gst_adapter_clear (demux->adapter); } gst_adapter_push (demux->adapter, buffer); if (demux->seeking) { demux->state = FLV_STATE_SEEK; GST_OBJECT_LOCK (demux); demux->seeking = FALSE; GST_OBJECT_UNLOCK (demux); } parse: if (G_UNLIKELY (ret != GST_FLOW_OK)) { if (ret == GST_FLOW_NOT_LINKED && (demux->audio_linked || demux->video_linked)) { ret = GST_FLOW_OK; } else { GST_DEBUG_OBJECT (demux, "got flow return %s", gst_flow_get_name (ret)); goto beach; } } if (G_UNLIKELY (demux->flushing)) { GST_DEBUG_OBJECT (demux, "we are now flushing, exiting parser loop"); ret = GST_FLOW_WRONG_STATE; goto beach; } switch (demux->state) { case FLV_STATE_HEADER: { if (gst_adapter_available (demux->adapter) >= FLV_HEADER_SIZE) { GstBuffer *buffer; buffer = gst_adapter_take_buffer (demux->adapter, FLV_HEADER_SIZE); ret = gst_flv_demux_parse_header (demux, buffer); gst_buffer_unref (buffer); demux->offset += FLV_HEADER_SIZE; demux->state = FLV_STATE_TAG_TYPE; goto parse; } else { goto beach; } } case FLV_STATE_TAG_TYPE: { if (gst_adapter_available (demux->adapter) >= FLV_TAG_TYPE_SIZE) { GstBuffer *buffer; /* Remember the tag offset in bytes */ demux->cur_tag_offset = demux->offset; buffer = gst_adapter_take_buffer (demux->adapter, FLV_TAG_TYPE_SIZE); ret = gst_flv_demux_parse_tag_type (demux, buffer); gst_buffer_unref (buffer); demux->offset += FLV_TAG_TYPE_SIZE; /* last tag is not an index => no index/don't know where the index is * seek back to the beginning */ if (demux->seek_event && demux->state != FLV_STATE_TAG_SCRIPT) goto no_index; goto parse; } else { goto beach; } } case FLV_STATE_TAG_VIDEO: { if (gst_adapter_available (demux->adapter) >= demux->tag_size) { GstBuffer *buffer; buffer = gst_adapter_take_buffer (demux->adapter, demux->tag_size); ret = gst_flv_demux_parse_tag_video (demux, buffer); gst_buffer_unref (buffer); demux->offset += demux->tag_size; demux->state = FLV_STATE_TAG_TYPE; goto parse; } else { goto beach; } } case FLV_STATE_TAG_AUDIO: { if (gst_adapter_available (demux->adapter) >= demux->tag_size) { GstBuffer *buffer; buffer = gst_adapter_take_buffer (demux->adapter, demux->tag_size); ret = gst_flv_demux_parse_tag_audio (demux, buffer); gst_buffer_unref (buffer); demux->offset += demux->tag_size; demux->state = FLV_STATE_TAG_TYPE; goto parse; } else { goto beach; } } case FLV_STATE_TAG_SCRIPT: { if (gst_adapter_available (demux->adapter) >= demux->tag_size) { GstBuffer *buffer; buffer = gst_adapter_take_buffer (demux->adapter, demux->tag_size); ret = gst_flv_demux_parse_tag_script (demux, buffer); gst_buffer_unref (buffer); demux->offset += demux->tag_size; demux->state = FLV_STATE_TAG_TYPE; /* if there's a seek event we're here for the index so if we don't have it * we seek back to the beginning */ if (demux->seek_event) { if (demux->indexed) demux->state = FLV_STATE_SEEK; else goto no_index; } goto parse; } else { goto beach; } } case FLV_STATE_SEEK: { GstEvent *event; ret = GST_FLOW_OK; if (!demux->indexed) { if (demux->offset == demux->file_size - sizeof (guint32)) { GstBuffer *buffer = gst_adapter_take_buffer (demux->adapter, sizeof (guint32)); GstByteReader *reader = gst_byte_reader_new_from_buffer (buffer); guint64 seek_offset; if (!gst_adapter_available (demux->adapter) >= sizeof (guint32)) { /* error */ } seek_offset = demux->file_size - sizeof (guint32) - gst_byte_reader_peek_uint32_be_unchecked (reader); gst_byte_reader_free (reader); gst_buffer_unref (buffer); GST_INFO_OBJECT (demux, "Seeking to beginning of last tag at %" G_GUINT64_FORMAT, seek_offset); demux->state = FLV_STATE_TAG_TYPE; flv_demux_seek_to_offset (demux, seek_offset); goto beach; } else goto no_index; } GST_OBJECT_LOCK (demux); event = demux->seek_event; demux->seek_event = NULL; GST_OBJECT_UNLOCK (demux); /* calculate and perform seek */ if (!flv_demux_handle_seek_push (demux, event)) goto seek_failed; gst_event_unref (event); demux->state = FLV_STATE_TAG_TYPE; goto beach; } default: GST_DEBUG_OBJECT (demux, "unexpected demuxer state"); } beach: if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) { /* If either audio or video is linked we return GST_FLOW_OK */ if (demux->audio_linked || demux->video_linked) { ret = GST_FLOW_OK; } } gst_object_unref (demux); return ret; /* ERRORS */ no_index: { GST_OBJECT_LOCK (demux); demux->seeking = FALSE; gst_event_unref (demux->seek_event); demux->seek_event = NULL; GST_OBJECT_UNLOCK (demux); GST_WARNING_OBJECT (demux, "failed to find an index, seeking back to beginning"); flv_demux_seek_to_offset (demux, 0); return GST_FLOW_OK; } seek_failed: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("seek failed")); return GST_FLOW_ERROR; } } static GstFlowReturn gst_flv_demux_pull_range (GstFlvDemux * demux, GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer) { GstFlowReturn ret; ret = gst_pad_pull_range (pad, offset, size, buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING_OBJECT (demux, "failed when pulling %d bytes from offset %" G_GUINT64_FORMAT ": %s", size, offset, gst_flow_get_name (ret)); *buffer = NULL; return ret; } if (G_UNLIKELY (*buffer && GST_BUFFER_SIZE (*buffer) != size)) { GST_WARNING_OBJECT (demux, "partial pull got %d when expecting %d from offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (*buffer), size, offset); gst_buffer_unref (*buffer); ret = GST_FLOW_UNEXPECTED; *buffer = NULL; return ret; } return ret; } static GstFlowReturn gst_flv_demux_pull_tag (GstPad * pad, GstFlvDemux * demux) { GstBuffer *buffer = NULL; GstFlowReturn ret = GST_FLOW_OK; /* Store tag offset */ demux->cur_tag_offset = demux->offset; /* Get the first 4 bytes to identify tag type and size */ if (G_UNLIKELY ((ret = gst_flv_demux_pull_range (demux, pad, demux->offset, FLV_TAG_TYPE_SIZE, &buffer)) != GST_FLOW_OK)) goto beach; /* Identify tag type */ ret = gst_flv_demux_parse_tag_type (demux, buffer); gst_buffer_unref (buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto beach; /* Jump over tag type + size */ demux->offset += FLV_TAG_TYPE_SIZE; /* Pull the whole tag */ if (G_UNLIKELY ((ret = gst_flv_demux_pull_range (demux, pad, demux->offset, demux->tag_size, &buffer)) != GST_FLOW_OK)) goto beach; switch (demux->state) { case FLV_STATE_TAG_VIDEO: ret = gst_flv_demux_parse_tag_video (demux, buffer); break; case FLV_STATE_TAG_AUDIO: ret = gst_flv_demux_parse_tag_audio (demux, buffer); break; case FLV_STATE_TAG_SCRIPT: ret = gst_flv_demux_parse_tag_script (demux, buffer); break; default: GST_WARNING_OBJECT (demux, "unexpected state %d", demux->state); } gst_buffer_unref (buffer); /* Jump over that part we've just parsed */ demux->offset += demux->tag_size; /* Make sure we reinitialize the tag size */ demux->tag_size = 0; /* Ready for the next tag */ demux->state = FLV_STATE_TAG_TYPE; if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) { /* If either audio or video is linked we return GST_FLOW_OK */ if (demux->audio_linked || demux->video_linked) { ret = GST_FLOW_OK; } else { GST_WARNING_OBJECT (demux, "parsing this tag returned not-linked and " "neither video nor audio are linked"); } } beach: return ret; } static GstFlowReturn gst_flv_demux_pull_header (GstPad * pad, GstFlvDemux * demux) { GstBuffer *buffer = NULL; GstFlowReturn ret = GST_FLOW_OK; /* Get the first 9 bytes */ if (G_UNLIKELY ((ret = gst_flv_demux_pull_range (demux, pad, demux->offset, FLV_HEADER_SIZE, &buffer)) != GST_FLOW_OK)) goto beach; ret = gst_flv_demux_parse_header (demux, buffer); gst_buffer_unref (buffer); /* Jump over the header now */ demux->offset += FLV_HEADER_SIZE; demux->state = FLV_STATE_TAG_TYPE; beach: return ret; } static void gst_flv_demux_move_to_offset (GstFlvDemux * demux, gint64 offset, gboolean reset) { demux->offset = offset; /* Tell all the stream we moved to a different position (discont) */ demux->audio_need_discont = TRUE; demux->video_need_discont = TRUE; /* next section setup */ demux->from_offset = -1; demux->audio_done = demux->video_done = FALSE; demux->audio_first_ts = demux->video_first_ts = GST_CLOCK_TIME_NONE; if (reset) { demux->from_offset = -1; demux->to_offset = G_MAXINT64; } /* If we seeked at the beginning of the file parse the header again */ if (G_UNLIKELY (!demux->offset)) { demux->state = FLV_STATE_HEADER; } else { /* or parse a tag */ demux->state = FLV_STATE_TAG_TYPE; } } static GstFlowReturn gst_flv_demux_seek_to_prev_keyframe (GstFlvDemux * demux) { GstFlowReturn ret = GST_FLOW_UNEXPECTED; GstIndexEntry *entry = NULL; GST_DEBUG_OBJECT (demux, "terminated section started at offset %" G_GINT64_FORMAT, demux->from_offset); /* we are done if we got all audio and video */ if ((!GST_CLOCK_TIME_IS_VALID (demux->audio_first_ts) || demux->audio_first_ts < demux->segment.start) && (!GST_CLOCK_TIME_IS_VALID (demux->video_first_ts) || demux->video_first_ts < demux->segment.start)) goto done; if (demux->from_offset <= 0) goto done; GST_DEBUG_OBJECT (demux, "locating previous position"); /* locate index entry before previous start position */ if (demux->index) entry = gst_index_get_assoc_entry (demux->index, demux->index_id, GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_BYTES, demux->from_offset - 1); if (entry) { gint64 bytes, time; gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &bytes); gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time); GST_DEBUG_OBJECT (demux, "found index entry for %" G_GINT64_FORMAT " at %" GST_TIME_FORMAT ", seeking to %" G_GINT64_FORMAT, demux->offset - 1, GST_TIME_ARGS (time), bytes); /* setup for next section */ demux->to_offset = demux->from_offset; gst_flv_demux_move_to_offset (demux, bytes, FALSE); ret = GST_FLOW_OK; } done: return ret; } static gboolean gst_flv_demux_push_src_event (GstFlvDemux * demux, GstEvent * event) { gboolean ret = TRUE; if (demux->audio_pad) ret |= gst_pad_push_event (demux->audio_pad, gst_event_ref (event)); if (demux->video_pad) ret |= gst_pad_push_event (demux->video_pad, gst_event_ref (event)); gst_event_unref (event); return ret; } static GstFlowReturn gst_flv_demux_create_index (GstFlvDemux * demux, gint64 pos, GstClockTime ts) { gint64 size; GstFormat fmt = GST_FORMAT_BYTES; size_t tag_size; guint64 old_offset; GstBuffer *buffer; GstClockTime tag_time; GstFlowReturn ret = GST_FLOW_OK; if (G_UNLIKELY (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &size) || fmt != GST_FORMAT_BYTES)) return GST_FLOW_OK; GST_DEBUG_OBJECT (demux, "building index at %" G_GINT64_FORMAT " looking for time %" GST_TIME_FORMAT, pos, GST_TIME_ARGS (ts)); old_offset = demux->offset; demux->offset = pos; while ((ret = gst_flv_demux_pull_range (demux, demux->sinkpad, demux->offset, 12, &buffer)) == GST_FLOW_OK) { tag_time = gst_flv_demux_parse_tag_timestamp (demux, TRUE, buffer, &tag_size); gst_buffer_unref (buffer); if (G_UNLIKELY (tag_time == GST_CLOCK_TIME_NONE || tag_time > ts)) goto exit; demux->offset += tag_size; } if (ret == GST_FLOW_UNEXPECTED) { /* file ran out, so mark we have complete index */ demux->indexed = TRUE; ret = GST_FLOW_OK; } exit: demux->offset = old_offset; return ret; } static gint64 gst_flv_demux_get_metadata (GstFlvDemux * demux) { gint64 ret = 0, offset; GstFormat fmt = GST_FORMAT_BYTES; size_t tag_size, size; GstBuffer *buffer = NULL; if (G_UNLIKELY (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &offset) || fmt != GST_FORMAT_BYTES)) goto exit; ret = offset; GST_DEBUG_OBJECT (demux, "upstream size: %" G_GINT64_FORMAT, offset); if (G_UNLIKELY (offset < 4)) goto exit; offset -= 4; if (GST_FLOW_OK != gst_flv_demux_pull_range (demux, demux->sinkpad, offset, 4, &buffer)) goto exit; tag_size = GST_READ_UINT32_BE (GST_BUFFER_DATA (buffer)); GST_DEBUG_OBJECT (demux, "last tag size: %" G_GSIZE_FORMAT, tag_size); gst_buffer_unref (buffer); buffer = NULL; offset -= tag_size; if (GST_FLOW_OK != gst_flv_demux_pull_range (demux, demux->sinkpad, offset, 12, &buffer)) goto exit; /* a consistency check */ size = GST_READ_UINT24_BE (GST_BUFFER_DATA (buffer) + 1); if (size != tag_size - 11) { GST_DEBUG_OBJECT (demux, "tag size %" G_GSIZE_FORMAT ", expected %" G_GSIZE_FORMAT ", corrupt or truncated file", size, tag_size - 11); goto exit; } /* try to update duration with timestamp in any case */ gst_flv_demux_parse_tag_timestamp (demux, FALSE, buffer, &size); /* maybe get some more metadata */ if (GST_BUFFER_DATA (buffer)[0] == 18) { gst_buffer_unref (buffer); buffer = NULL; GST_DEBUG_OBJECT (demux, "script tag, pulling it to parse"); offset += 4; if (GST_FLOW_OK == gst_flv_demux_pull_range (demux, demux->sinkpad, offset, tag_size, &buffer)) gst_flv_demux_parse_tag_script (demux, buffer); } exit: if (buffer) gst_buffer_unref (buffer); return ret; } static void gst_flv_demux_loop (GstPad * pad) { GstFlvDemux *demux = NULL; GstFlowReturn ret = GST_FLOW_OK; demux = GST_FLV_DEMUX (gst_pad_get_parent (pad)); /* pull in data */ switch (demux->state) { case FLV_STATE_TAG_TYPE: if (demux->from_offset == -1) demux->from_offset = demux->offset; ret = gst_flv_demux_pull_tag (pad, demux); /* if we have seen real data, we probably passed a possible metadata * header located at start. So if we do not yet have an index, * try to pick up metadata (index, duration) at the end */ if (G_UNLIKELY (!demux->file_size && !demux->indexed && (demux->has_video || demux->has_audio))) demux->file_size = gst_flv_demux_get_metadata (demux); break; case FLV_STATE_DONE: ret = GST_FLOW_UNEXPECTED; break; case FLV_STATE_SEEK: /* seek issued with insufficient index; * scan for index in task thread from current maximum offset to * desired time and then perform seek */ /* TODO maybe some buffering message or so to indicate scan progress */ ret = gst_flv_demux_create_index (demux, demux->index_max_pos, demux->seek_time); if (ret != GST_FLOW_OK) goto pause; /* position and state arranged by seek, * also unrefs event */ gst_flv_demux_handle_seek_pull (demux, demux->seek_event, FALSE); demux->seek_event = NULL; break; default: ret = gst_flv_demux_pull_header (pad, demux); /* index scans start after header */ demux->index_max_pos = demux->offset; break; } if (demux->segment.rate < 0.0) { /* check end of section */ if ((gint64) demux->offset >= demux->to_offset || demux->segment.last_stop >= demux->segment.stop + 2 * GST_SECOND || (demux->audio_done && demux->video_done)) ret = gst_flv_demux_seek_to_prev_keyframe (demux); } else { /* check EOS condition */ if ((demux->segment.stop != -1) && (demux->segment.last_stop >= demux->segment.stop)) { ret = GST_FLOW_UNEXPECTED; } } /* pause if something went wrong or at end */ if (G_UNLIKELY (ret != GST_FLOW_OK)) goto pause; gst_object_unref (demux); return; pause: { const gchar *reason = gst_flow_get_name (ret); GST_LOG_OBJECT (demux, "pausing task, reason %s", reason); gst_pad_pause_task (pad); if (ret == GST_FLOW_UNEXPECTED) { /* perform EOS logic */ if (!demux->no_more_pads) { gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); demux->no_more_pads = TRUE; } if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) { gint64 stop; /* for segment playback we need to post when (in stream time) * we stopped, this is either stop (when set) or the duration. */ if ((stop = demux->segment.stop) == -1) stop = demux->segment.duration; if (demux->segment.rate >= 0) { GST_LOG_OBJECT (demux, "Sending segment done, at end of segment"); gst_element_post_message (GST_ELEMENT_CAST (demux), gst_message_new_segment_done (GST_OBJECT_CAST (demux), GST_FORMAT_TIME, stop)); } else { /* Reverse playback */ GST_LOG_OBJECT (demux, "Sending segment done, at beginning of " "segment"); gst_element_post_message (GST_ELEMENT_CAST (demux), gst_message_new_segment_done (GST_OBJECT_CAST (demux), GST_FORMAT_TIME, demux->segment.start)); } } else { /* normal playback, send EOS to all linked pads */ if (!demux->no_more_pads) { gst_element_no_more_pads (GST_ELEMENT (demux)); demux->no_more_pads = TRUE; } GST_LOG_OBJECT (demux, "Sending EOS, at end of stream"); if (!gst_flv_demux_push_src_event (demux, gst_event_new_eos ())) GST_WARNING_OBJECT (demux, "failed pushing EOS on streams"); } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { GST_ELEMENT_ERROR (demux, STREAM, FAILED, ("Internal data stream error."), ("stream stopped, reason %s", reason)); gst_flv_demux_push_src_event (demux, gst_event_new_eos ()); } gst_object_unref (demux); return; } } static guint64 gst_flv_demux_find_offset (GstFlvDemux * demux, GstSegment * segment) { gint64 bytes = 0; gint64 time = 0; GstIndexEntry *entry; g_return_val_if_fail (segment != NULL, 0); time = segment->last_stop; if (demux->index) { /* Let's check if we have an index entry for that seek time */ entry = gst_index_get_assoc_entry (demux->index, demux->index_id, GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, time); if (entry) { gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &bytes); gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time); GST_DEBUG_OBJECT (demux, "found index entry for %" GST_TIME_FORMAT " at %" GST_TIME_FORMAT ", seeking to %" G_GINT64_FORMAT, GST_TIME_ARGS (segment->last_stop), GST_TIME_ARGS (time), bytes); /* Key frame seeking */ if (segment->flags & GST_SEEK_FLAG_KEY_UNIT) { /* Adjust the segment so that the keyframe fits in */ if (time < segment->start) { segment->start = segment->time = time; } segment->last_stop = time; } } else { GST_DEBUG_OBJECT (demux, "no index entry found for %" GST_TIME_FORMAT, GST_TIME_ARGS (segment->start)); } } return bytes; } static gboolean flv_demux_handle_seek_push (GstFlvDemux * demux, GstEvent * event) { GstFormat format; GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; gdouble rate; gboolean update, flush, ret; GstSegment seeksegment; gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, &stop_type, &stop); if (format != GST_FORMAT_TIME) goto wrong_format; flush = ! !(flags & GST_SEEK_FLAG_FLUSH); /* FIXME : the keyframe flag is never used ! */ /* Work on a copy until we are sure the seek succeeded. */ memcpy (&seeksegment, &demux->segment, sizeof (GstSegment)); GST_DEBUG_OBJECT (demux, "segment before configure %" GST_SEGMENT_FORMAT, &demux->segment); /* Apply the seek to our segment */ gst_segment_set_seek (&seeksegment, rate, format, flags, start_type, start, stop_type, stop, &update); GST_DEBUG_OBJECT (demux, "segment configured %" GST_SEGMENT_FORMAT, &seeksegment); if (flush || seeksegment.last_stop != demux->segment.last_stop) { /* Do the actual seeking */ guint64 offset = gst_flv_demux_find_offset (demux, &seeksegment); GST_DEBUG_OBJECT (demux, "generating an upstream seek at position %" G_GUINT64_FORMAT, offset); ret = gst_pad_push_event (demux->sinkpad, gst_event_new_seek (seeksegment.rate, GST_FORMAT_BYTES, seeksegment.flags | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, 0)); if (G_UNLIKELY (!ret)) { GST_WARNING_OBJECT (demux, "upstream seek failed"); } /* Tell all the stream we moved to a different position (discont) */ demux->audio_need_discont = TRUE; demux->video_need_discont = TRUE; } else { ret = TRUE; } if (ret) { /* Ok seek succeeded, take the newly configured segment */ memcpy (&demux->segment, &seeksegment, sizeof (GstSegment)); /* Tell all the stream a new segment is needed */ demux->audio_need_segment = TRUE; demux->video_need_segment = TRUE; /* Clean any potential newsegment event kept for the streams. The first * stream needing a new segment will create a new one. */ if (G_UNLIKELY (demux->new_seg_event)) { gst_event_unref (demux->new_seg_event); demux->new_seg_event = NULL; } gst_event_unref (event); } else { ret = gst_pad_push_event (demux->sinkpad, event); } return ret; /* ERRORS */ wrong_format: { GST_WARNING_OBJECT (demux, "we only support seeking in TIME format"); gst_event_unref (event); return FALSE; } } static gboolean gst_flv_demux_handle_seek_push (GstFlvDemux * demux, GstEvent * event) { GstFormat format; gst_event_parse_seek (event, NULL, &format, NULL, NULL, NULL, NULL, NULL); if (format != GST_FORMAT_TIME) { GST_WARNING_OBJECT (demux, "we only support seeking in TIME format"); gst_event_unref (event); return FALSE; } /* First try upstream */ if (gst_pad_push_event (demux->sinkpad, gst_event_ref (event))) { GST_DEBUG_OBJECT (demux, "Upstream successfully seeked"); gst_event_unref (event); return TRUE; } if (!demux->indexed) { guint64 seek_offset = 0; gboolean building_index; GstFormat fmt; GST_OBJECT_LOCK (demux); /* handle the seek in the chain function */ demux->seeking = TRUE; demux->state = FLV_STATE_SEEK; /* copy the event */ if (demux->seek_event) gst_event_unref (demux->seek_event); demux->seek_event = gst_event_ref (event); /* set the building_index flag so that only one thread can setup the * structures for index seeking. */ building_index = demux->building_index; if (!building_index) { demux->building_index = TRUE; fmt = GST_FORMAT_BYTES; if (!demux->file_size && !gst_pad_query_peer_duration (demux->sinkpad, &fmt, &demux->file_size)) { GST_WARNING_OBJECT (demux, "Cannot obtain file size - %" G_GINT64_FORMAT ", format %u", demux->file_size, fmt); GST_OBJECT_UNLOCK (demux); return FALSE; } /* we hope the last tag is a scriptdataobject containing an index * the size of the last tag is given in the last guint32 bits * then we seek to the beginning of the tag, parse it and hopefully obtain an index */ seek_offset = demux->file_size - sizeof (guint32); GST_DEBUG_OBJECT (demux, "File size obtained, seeking to %" G_GUINT64_FORMAT, seek_offset); } GST_OBJECT_UNLOCK (demux); if (!building_index) { GST_INFO_OBJECT (demux, "Seeking to last 4 bytes at %" G_GUINT64_FORMAT, seek_offset); return flv_demux_seek_to_offset (demux, seek_offset); } /* FIXME: we have to always return true so that we don't block the seek * thread. * Note: maybe it is OK to return true if we're still building the index */ return TRUE; } return flv_demux_handle_seek_push (demux, event); } static gboolean gst_flv_demux_handle_seek_pull (GstFlvDemux * demux, GstEvent * event, gboolean seeking) { GstFormat format; GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; gdouble rate; gboolean update, flush, ret = FALSE; GstSegment seeksegment; gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, &stop_type, &stop); if (format != GST_FORMAT_TIME) goto wrong_format; /* mark seeking thread entering flushing/pausing */ GST_OBJECT_LOCK (demux); if (seeking) demux->seeking = seeking; GST_OBJECT_UNLOCK (demux); flush = ! !(flags & GST_SEEK_FLAG_FLUSH); /* FIXME : the keyframe flag is never used */ if (flush) { /* Flush start up and downstream to make sure data flow and loops are idle */ gst_flv_demux_push_src_event (demux, gst_event_new_flush_start ()); gst_pad_push_event (demux->sinkpad, gst_event_new_flush_start ()); } else { /* Pause the pulling task */ gst_pad_pause_task (demux->sinkpad); } /* Take the stream lock */ GST_PAD_STREAM_LOCK (demux->sinkpad); if (flush) { /* Stop flushing upstream we need to pull */ gst_pad_push_event (demux->sinkpad, gst_event_new_flush_stop ()); } /* Work on a copy until we are sure the seek succeeded. */ memcpy (&seeksegment, &demux->segment, sizeof (GstSegment)); GST_DEBUG_OBJECT (demux, "segment before configure %" GST_SEGMENT_FORMAT, &demux->segment); /* Apply the seek to our segment */ gst_segment_set_seek (&seeksegment, rate, format, flags, start_type, start, stop_type, stop, &update); GST_DEBUG_OBJECT (demux, "segment configured %" GST_SEGMENT_FORMAT, &seeksegment); if (flush || seeksegment.last_stop != demux->segment.last_stop) { /* Do the actual seeking */ /* index is reliable if it is complete or we do not go to far ahead */ if (seeking && !demux->indexed && seeksegment.last_stop > demux->index_max_time + 10 * GST_SECOND) { GST_DEBUG_OBJECT (demux, "delaying seek to post-scan; " " index only up to %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->index_max_time)); /* stop flushing for now */ if (flush) gst_flv_demux_push_src_event (demux, gst_event_new_flush_stop ()); /* delegate scanning and index building to task thread to avoid * occupying main (UI) loop */ if (demux->seek_event) gst_event_unref (demux->seek_event); demux->seek_event = gst_event_ref (event); demux->seek_time = seeksegment.last_stop; demux->state = FLV_STATE_SEEK; /* do not know about succes yet, but we did care and handled it */ ret = TRUE; goto exit; } /* now index should be as reliable as it can be for current purpose */ gst_flv_demux_move_to_offset (demux, gst_flv_demux_find_offset (demux, &seeksegment), TRUE); ret = TRUE; } else { ret = TRUE; } if (G_UNLIKELY (demux->close_seg_event)) { gst_event_unref (demux->close_seg_event); demux->close_seg_event = NULL; } if (flush) { /* Stop flushing, the sinks are at time 0 now */ gst_flv_demux_push_src_event (demux, gst_event_new_flush_stop ()); } else { GST_DEBUG_OBJECT (demux, "closing running segment %" GST_SEGMENT_FORMAT, &demux->segment); /* Close the current segment for a linear playback */ if (demux->segment.rate >= 0) { /* for forward playback, we played from start to last_stop */ demux->close_seg_event = gst_event_new_new_segment (TRUE, demux->segment.rate, demux->segment.format, demux->segment.start, demux->segment.last_stop, demux->segment.time); } else { gint64 stop; if ((stop = demux->segment.stop) == -1) stop = demux->segment.duration; /* for reverse playback, we played from stop to last_stop. */ demux->close_seg_event = gst_event_new_new_segment (TRUE, demux->segment.rate, demux->segment.format, demux->segment.last_stop, stop, demux->segment.last_stop); } } if (ret) { /* Ok seek succeeded, take the newly configured segment */ memcpy (&demux->segment, &seeksegment, sizeof (GstSegment)); /* Notify about the start of a new segment */ if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT (demux), gst_message_new_segment_start (GST_OBJECT (demux), demux->segment.format, demux->segment.last_stop)); } /* Tell all the stream a new segment is needed */ demux->audio_need_segment = TRUE; demux->video_need_segment = TRUE; /* Clean any potential newsegment event kept for the streams. The first * stream needing a new segment will create a new one. */ if (G_UNLIKELY (demux->new_seg_event)) { gst_event_unref (demux->new_seg_event); demux->new_seg_event = NULL; } if (demux->segment.rate < 0.0) { /* we can't generate a segment by locking on * to the first timestamp we see */ GST_DEBUG_OBJECT (demux, "preparing newsegment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->segment.start), GST_TIME_ARGS (demux->segment.stop)); demux->new_seg_event = gst_event_new_new_segment (FALSE, demux->segment.rate, demux->segment.format, demux->segment.start, demux->segment.stop, demux->segment.start); } } exit: GST_OBJECT_LOCK (demux); seeking = demux->seeking && !seeking; demux->seeking = FALSE; GST_OBJECT_UNLOCK (demux); /* if we detect an external seek having started (and possibly already having * flushed), do not restart task to give it a chance. * Otherwise external one's flushing will take care to pause task */ if (seeking) { gst_pad_pause_task (demux->sinkpad); } else { gst_pad_start_task (demux->sinkpad, (GstTaskFunction) gst_flv_demux_loop, demux->sinkpad); } GST_PAD_STREAM_UNLOCK (demux->sinkpad); gst_event_unref (event); return ret; /* ERRORS */ wrong_format: { GST_WARNING_OBJECT (demux, "we only support seeking in TIME format"); gst_event_unref (event); return ret; } } /* If we can pull that's prefered */ static gboolean gst_flv_demux_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) { return gst_pad_activate_pull (sinkpad, TRUE); } else { return gst_pad_activate_push (sinkpad, TRUE); } } /* This function gets called when we activate ourselves in push mode. * We cannot seek (ourselves) in the stream */ static gboolean gst_flv_demux_sink_activate_push (GstPad * sinkpad, gboolean active) { GstFlvDemux *demux; demux = GST_FLV_DEMUX (gst_pad_get_parent (sinkpad)); demux->random_access = FALSE; gst_object_unref (demux); return TRUE; } /* this function gets called when we activate ourselves in pull mode. * We can perform random access to the resource and we start a task * to start reading */ static gboolean gst_flv_demux_sink_activate_pull (GstPad * sinkpad, gboolean active) { GstFlvDemux *demux; demux = GST_FLV_DEMUX (gst_pad_get_parent (sinkpad)); if (active) { demux->random_access = TRUE; gst_object_unref (demux); return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_flv_demux_loop, sinkpad); } else { demux->random_access = FALSE; gst_object_unref (demux); return gst_pad_stop_task (sinkpad); } } static gboolean gst_flv_demux_sink_event (GstPad * pad, GstEvent * event) { GstFlvDemux *demux; gboolean ret = FALSE; demux = GST_FLV_DEMUX (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (demux, "handling event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: GST_DEBUG_OBJECT (demux, "trying to force chain function to exit"); demux->flushing = TRUE; ret = gst_flv_demux_push_src_event (demux, event); break; case GST_EVENT_FLUSH_STOP: GST_DEBUG_OBJECT (demux, "flushing FLV demuxer"); gst_flv_demux_flush (demux, TRUE); ret = gst_flv_demux_push_src_event (demux, event); break; case GST_EVENT_EOS: GST_DEBUG_OBJECT (demux, "received EOS"); if (demux->index) { GST_DEBUG_OBJECT (demux, "committing index"); gst_index_commit (demux->index, demux->index_id); } if (!demux->no_more_pads) { gst_element_no_more_pads (GST_ELEMENT (demux)); demux->no_more_pads = TRUE; } if (!gst_flv_demux_push_src_event (demux, event)) GST_WARNING_OBJECT (demux, "failed pushing EOS on streams"); ret = TRUE; break; case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate; gint64 start, stop, time; gboolean update; GST_DEBUG_OBJECT (demux, "received new segment"); gst_event_parse_new_segment (event, &update, &rate, &format, &start, &stop, &time); if (format == GST_FORMAT_TIME) { /* time segment, this is perfect, copy over the values. */ gst_segment_set_newsegment (&demux->segment, update, rate, format, start, stop, time); GST_DEBUG_OBJECT (demux, "NEWSEGMENT: %" GST_SEGMENT_FORMAT, &demux->segment); /* and forward */ ret = gst_flv_demux_push_src_event (demux, event); } else { /* non-time format */ demux->audio_need_segment = TRUE; demux->video_need_segment = TRUE; ret = TRUE; gst_event_unref (event); } break; } default: ret = gst_flv_demux_push_src_event (demux, event); break; } gst_object_unref (demux); return ret; } static gboolean gst_flv_demux_src_event (GstPad * pad, GstEvent * event) { GstFlvDemux *demux; gboolean ret = FALSE; demux = GST_FLV_DEMUX (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (demux, "handling event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: if (demux->random_access) { ret = gst_flv_demux_handle_seek_pull (demux, event, TRUE); } else { ret = gst_flv_demux_handle_seek_push (demux, event); } break; default: ret = gst_pad_push_event (demux->sinkpad, event); break; } gst_object_unref (demux); return ret; } static gboolean gst_flv_demux_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstFlvDemux *demux; demux = GST_FLV_DEMUX (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); /* duration is time only */ if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (demux, "duration query only supported for time " "format"); res = FALSE; goto beach; } GST_DEBUG_OBJECT (pad, "duration query, replying %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->duration)); gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration); break; } case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); /* position is time only */ if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (demux, "position query only supported for time " "format"); res = FALSE; goto beach; } GST_DEBUG_OBJECT (pad, "position query, replying %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->segment.last_stop)); gst_query_set_position (query, GST_FORMAT_TIME, demux->segment.last_stop); break; } case GST_QUERY_SEEKING:{ GstFormat fmt; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); /* First ask upstream */ if (fmt == GST_FORMAT_TIME && gst_pad_peer_query (demux->sinkpad, query)) { gboolean seekable; gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL); if (seekable) { res = TRUE; break; } } res = TRUE; if (fmt != GST_FORMAT_TIME || !demux->index) { gst_query_set_seeking (query, fmt, FALSE, -1, -1); } else if (demux->random_access) { gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, demux->duration); } else { GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES); gboolean seekable = gst_pad_peer_query (demux->sinkpad, peerquery); if (seekable) gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL); gst_query_unref (peerquery); if (seekable) gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, demux->duration); else gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, -1, -1); } break; } case GST_QUERY_LATENCY: default: { GstPad *peer; if ((peer = gst_pad_get_peer (demux->sinkpad))) { /* query latency on peer pad */ res = gst_pad_query (peer, query); gst_object_unref (peer); } else { /* no peer, we don't know */ res = FALSE; } break; } } beach: gst_object_unref (demux); return res; } static GstStateChangeReturn gst_flv_demux_change_state (GstElement * element, GstStateChange transition) { GstFlvDemux *demux; GstStateChangeReturn ret; demux = GST_FLV_DEMUX (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: /* If this is our own index destroy it as the * old entries might be wrong for the new stream */ if (demux->own_index) { gst_object_unref (demux->index); demux->index = NULL; demux->own_index = FALSE; } /* If no index was created, generate one */ if (G_UNLIKELY (!demux->index)) { GST_DEBUG_OBJECT (demux, "no index provided creating our own"); demux->index = gst_index_factory_make ("memindex"); gst_index_get_writer_id (demux->index, GST_OBJECT (demux), &demux->index_id); demux->own_index = TRUE; } gst_flv_demux_cleanup (demux); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_flv_demux_cleanup (demux); break; default: break; } return ret; } static void gst_flv_demux_set_index (GstElement * element, GstIndex * index) { GstFlvDemux *demux = GST_FLV_DEMUX (element); GST_OBJECT_LOCK (demux); if (demux->index) gst_object_unref (demux->index); if (index) { demux->index = gst_object_ref (index); demux->own_index = FALSE; } else demux->index = NULL; GST_OBJECT_UNLOCK (demux); /* object lock might be taken again */ if (index) gst_index_get_writer_id (index, GST_OBJECT (element), &demux->index_id); GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT, demux->index); } static GstIndex * gst_flv_demux_get_index (GstElement * element) { GstIndex *result = NULL; GstFlvDemux *demux = GST_FLV_DEMUX (element); GST_OBJECT_LOCK (demux); if (demux->index) result = gst_object_ref (demux->index); GST_OBJECT_UNLOCK (demux); return result; } static void gst_flv_demux_dispose (GObject * object) { GstFlvDemux *demux = GST_FLV_DEMUX (object); GST_DEBUG_OBJECT (demux, "disposing FLV demuxer"); if (demux->adapter) { gst_adapter_clear (demux->adapter); g_object_unref (demux->adapter); demux->adapter = NULL; } if (demux->taglist) { gst_tag_list_free (demux->taglist); demux->taglist = NULL; } if (demux->new_seg_event) { gst_event_unref (demux->new_seg_event); demux->new_seg_event = NULL; } if (demux->close_seg_event) { gst_event_unref (demux->close_seg_event); demux->close_seg_event = NULL; } if (demux->audio_codec_data) { gst_buffer_unref (demux->audio_codec_data); demux->audio_codec_data = NULL; } if (demux->video_codec_data) { gst_buffer_unref (demux->video_codec_data); demux->video_codec_data = NULL; } if (demux->audio_pad) { gst_object_unref (demux->audio_pad); demux->audio_pad = NULL; } if (demux->video_pad) { gst_object_unref (demux->video_pad); demux->video_pad = NULL; } if (demux->index) { gst_object_unref (demux->index); demux->index = NULL; } if (demux->times) { g_array_free (demux->times, TRUE); demux->times = NULL; } if (demux->filepositions) { g_array_free (demux->filepositions, TRUE); demux->filepositions = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); } static void gst_flv_demux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &flv_sink_template); gst_element_class_add_static_pad_template (element_class, &audio_src_template); gst_element_class_add_static_pad_template (element_class, &video_src_template); gst_element_class_set_details_simple (element_class, "FLV Demuxer", "Codec/Demuxer", "Demux FLV feeds into digital streams", "Julien Moutte "); } static void gst_flv_demux_class_init (GstFlvDemuxClass * klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->dispose = gst_flv_demux_dispose; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_flv_demux_change_state); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_flv_demux_set_index); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_flv_demux_get_index); } static void gst_flv_demux_init (GstFlvDemux * demux, GstFlvDemuxClass * g_class) { demux->sinkpad = gst_pad_new_from_static_template (&flv_sink_template, "sink"); gst_pad_set_event_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_flv_demux_sink_event)); gst_pad_set_chain_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_flv_demux_chain)); gst_pad_set_activate_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate)); gst_pad_set_activatepull_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate_pull)); gst_pad_set_activatepush_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_flv_demux_sink_activate_push)); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); demux->adapter = gst_adapter_new (); demux->taglist = gst_tag_list_new (); gst_segment_init (&demux->segment, GST_FORMAT_TIME); demux->own_index = FALSE; gst_flv_demux_cleanup (demux); } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (flvdemux_debug, "flvdemux", 0, "FLV demuxer"); if (!gst_element_register (plugin, "flvdemux", GST_RANK_PRIMARY, gst_flv_demux_get_type ()) || !gst_element_register (plugin, "flvmux", GST_RANK_PRIMARY, gst_flv_mux_get_type ())) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "flv", "FLV muxing and demuxing plugin", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/flv/Makefile.in0000644000175000017500000007056011720560232015436 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/flv DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstflv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstflv_la_OBJECTS = libgstflv_la-gstflvdemux.lo \ libgstflv_la-gstflvmux.lo libgstflv_la_OBJECTS = $(am_libgstflv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstflv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstflv_la_CFLAGS) $(CFLAGS) \ $(libgstflv_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstflv_la_SOURCES) DIST_SOURCES = $(libgstflv_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstflv.la libgstflv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstflv_la_LIBADD = -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) libgstflv_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} libgstflv_la_SOURCES = gstflvdemux.c gstflvmux.c libgstflv_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstflvdemux.h gstflvmux.h amfdefs.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/flv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/flv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstflv.la: $(libgstflv_la_OBJECTS) $(libgstflv_la_DEPENDENCIES) $(EXTRA_libgstflv_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstflv_la_LINK) -rpath $(plugindir) $(libgstflv_la_OBJECTS) $(libgstflv_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflv_la-gstflvdemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflv_la-gstflvmux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstflv_la-gstflvdemux.lo: gstflvdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -MT libgstflv_la-gstflvdemux.lo -MD -MP -MF $(DEPDIR)/libgstflv_la-gstflvdemux.Tpo -c -o libgstflv_la-gstflvdemux.lo `test -f 'gstflvdemux.c' || echo '$(srcdir)/'`gstflvdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflv_la-gstflvdemux.Tpo $(DEPDIR)/libgstflv_la-gstflvdemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflvdemux.c' object='libgstflv_la-gstflvdemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -c -o libgstflv_la-gstflvdemux.lo `test -f 'gstflvdemux.c' || echo '$(srcdir)/'`gstflvdemux.c libgstflv_la-gstflvmux.lo: gstflvmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -MT libgstflv_la-gstflvmux.lo -MD -MP -MF $(DEPDIR)/libgstflv_la-gstflvmux.Tpo -c -o libgstflv_la-gstflvmux.lo `test -f 'gstflvmux.c' || echo '$(srcdir)/'`gstflvmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflv_la-gstflvmux.Tpo $(DEPDIR)/libgstflv_la-gstflvmux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflvmux.c' object='libgstflv_la-gstflvmux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflv_la_CFLAGS) $(CFLAGS) -c -o libgstflv_la-gstflvmux.lo `test -f 'gstflvmux.c' || echo '$(srcdir)/'`gstflvmux.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstflv -:SHARED libgstflv \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstflv_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflv_la_CFLAGS) \ -:LDFLAGS $(libgstflv_la_LDFLAGS) \ $(libgstflv_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/videocrop/0000755000175000017500000000000011720565315014653 500000000000000gst-plugins-good-0.10.31/gst/videocrop/Makefile.am0000644000175000017500000000210711671175354016634 00000000000000plugin_LTLIBRARIES = libgstvideocrop.la # Note: we only use defines from gst/video/video.h, but none # of the functions, so we don't need to link to libgstvideo libgstvideocrop_la_SOURCES = gstvideocrop.c gstaspectratiocrop.c libgstvideocrop_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstvideocrop_la_LIBADD = $(GST_BASE_LIBS) libgstvideocrop_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideocrop_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstvideocrop.h gstaspectratiocrop.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideocrop -:SHARED libgstvideocrop \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideocrop_la_SOURCES) \ $(nodist_libgstvideocrop_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideocrop_la_CFLAGS) \ -:LDFLAGS $(libgstvideocrop_la_LDFLAGS) \ $(libgstvideocrop_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/videocrop/gstaspectratiocrop.h0000644000175000017500000000377711671175354020707 00000000000000/* GStreamer video frame cropping to aspect-ratio * Copyright (C) 2009 Thijs Vermeir * * 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_ASPECT_RATIO_CROP_H__ #define __GST_ASPECT_RATIO_CROP_H__ #include G_BEGIN_DECLS #define GST_TYPE_ASPECT_RATIO_CROP \ (gst_aspect_ratio_crop_get_type()) #define GST_ASPECT_RATIO_CROP(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ASPECT_RATIO_CROP,GstAspectRatioCrop)) #define GST_ASPECT_RATIO_CROP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ASPECT_RATIO_CROP,GstAspectRatioCropClass)) #define GST_IS_ASPECT_RATIO_CROP(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ASPECT_RATIO_CROP)) #define GST_IS_ASPECT_RATIO_CROP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ASPECT_RATIO_CROP)) typedef struct _GstAspectRatioCrop GstAspectRatioCrop; typedef struct _GstAspectRatioCropClass GstAspectRatioCropClass; struct _GstAspectRatioCrop { GstBin parent; /* our videocrop element */ GstElement *videocrop; GstPad *sink; /* target aspect ratio */ gint ar_num; /* if < 1 then don't change ar */ gint ar_denom; GMutex *crop_lock; }; struct _GstAspectRatioCropClass { GstBinClass parent_class; }; GType gst_aspect_ratio_crop_get_type (void); G_END_DECLS #endif /* __GST_ASPECT_RATIO_CROP_H__ */ gst-plugins-good-0.10.31/gst/videocrop/gstaspectratiocrop.c0000644000175000017500000003443611677341660020677 00000000000000/* GStreamer video frame cropping to aspect-ratio * Copyright (C) 2009 Thijs Vermeir * * 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-aspectratiocrop * @see_also: #GstVideoCrop * * This element crops video frames to a specified #GstAspectRatioCrop:aspect-ratio. * * If the aspect-ratio is already correct, the element will operate * in pass-through mode. * * * Example launch line * |[ * gst-launch -v videotestsrc ! video/x-raw-rgb,height=640,width=480 ! aspectratiocrop aspect-ratio=16/9 ! ximagesink * ]| This pipeline generates a videostream in 4/3 and crops it to 16/9. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstaspectratiocrop.h" #include "gst/glib-compat-private.h" GST_DEBUG_CATEGORY_STATIC (aspect_ratio_crop_debug); #define GST_CAT_DEFAULT aspect_ratio_crop_debug enum { ARG_0, ARG_ASPECT_RATIO_CROP, }; /* we support the same caps as videocrop */ #define ASPECT_RATIO_CROP_CAPS \ GST_VIDEO_CAPS_RGBx ";" \ GST_VIDEO_CAPS_xRGB ";" \ GST_VIDEO_CAPS_BGRx ";" \ GST_VIDEO_CAPS_xBGR ";" \ GST_VIDEO_CAPS_RGBA ";" \ GST_VIDEO_CAPS_ARGB ";" \ GST_VIDEO_CAPS_BGRA ";" \ GST_VIDEO_CAPS_ABGR ";" \ GST_VIDEO_CAPS_RGB ";" \ GST_VIDEO_CAPS_BGR ";" \ GST_VIDEO_CAPS_YUV ("AYUV") ";" \ GST_VIDEO_CAPS_YUV ("YUY2") ";" \ GST_VIDEO_CAPS_YUV ("YVYU") ";" \ GST_VIDEO_CAPS_YUV ("UYVY") ";" \ GST_VIDEO_CAPS_YUV ("Y800") ";" \ GST_VIDEO_CAPS_YUV ("I420") ";" \ GST_VIDEO_CAPS_YUV ("YV12") ";" \ GST_VIDEO_CAPS_RGB_16 ";" \ GST_VIDEO_CAPS_RGB_15 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (ASPECT_RATIO_CROP_CAPS) ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (ASPECT_RATIO_CROP_CAPS) ); GST_BOILERPLATE (GstAspectRatioCrop, gst_aspect_ratio_crop, GstBin, GST_TYPE_BIN); static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_aspect_ratio_crop_set_cropping (GstAspectRatioCrop * aspect_ratio_crop, gint top, gint right, gint bottom, gint left); static GstCaps *gst_aspect_ratio_crop_get_caps (GstPad * pad); static gboolean gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps); static void gst_aspect_ratio_crop_finalize (GObject * object); static void gst_aspect_ratio_transform_structure (GstAspectRatioCrop * aspect_ratio_crop, GstStructure * structure, GstStructure ** new_structure, gboolean set_videocrop); static void gst_aspect_ratio_crop_set_cropping (GstAspectRatioCrop * aspect_ratio_crop, gint top, gint right, gint bottom, gint left) { GValue value = { 0 }; if (G_UNLIKELY (!aspect_ratio_crop->videocrop)) { GST_WARNING_OBJECT (aspect_ratio_crop, "Can't set the settings if there is no cropping element"); return; } g_value_init (&value, G_TYPE_INT); g_value_set_int (&value, top); GST_DEBUG_OBJECT (aspect_ratio_crop, "set top cropping to: %d", top); g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "top", &value); g_value_set_int (&value, right); GST_DEBUG_OBJECT (aspect_ratio_crop, "set right cropping to: %d", right); g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "right", &value); g_value_set_int (&value, bottom); GST_DEBUG_OBJECT (aspect_ratio_crop, "set bottom cropping to: %d", bottom); g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "bottom", &value); g_value_set_int (&value, left); GST_DEBUG_OBJECT (aspect_ratio_crop, "set left cropping to: %d", left); g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "left", &value); g_value_unset (&value); } static gboolean gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps) { GstAspectRatioCrop *aspect_ratio_crop; GstPad *peer_pad; GstStructure *structure; gboolean ret; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); g_mutex_lock (aspect_ratio_crop->crop_lock); structure = gst_caps_get_structure (caps, 0); gst_aspect_ratio_transform_structure (aspect_ratio_crop, structure, NULL, TRUE); peer_pad = gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), "sink"); ret = gst_pad_set_caps (peer_pad, caps); gst_object_unref (peer_pad); gst_object_unref (aspect_ratio_crop); g_mutex_unlock (aspect_ratio_crop->crop_lock); return ret; } static void gst_aspect_ratio_crop_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "aspectratiocrop", "Filter/Effect/Video", "Crops video into a user-defined aspect-ratio", "Thijs Vermeir "); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); } static void gst_aspect_ratio_crop_class_init (GstAspectRatioCropClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_aspect_ratio_crop_set_property; gobject_class->get_property = gst_aspect_ratio_crop_get_property; gobject_class->finalize = gst_aspect_ratio_crop_finalize; g_object_class_install_property (gobject_class, ARG_ASPECT_RATIO_CROP, gst_param_spec_fraction ("aspect-ratio", "aspect-ratio", "Target aspect-ratio of video", 0, 1, G_MAXINT, 1, 0, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_aspect_ratio_crop_finalize (GObject * object) { GstAspectRatioCrop *aspect_ratio_crop; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); if (aspect_ratio_crop->crop_lock) g_mutex_free (aspect_ratio_crop->crop_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_aspect_ratio_crop_init (GstAspectRatioCrop * aspect_ratio_crop, GstAspectRatioCropClass * klass) { GstPad *link_pad; GstPad *src_pad; GST_DEBUG_CATEGORY_INIT (aspect_ratio_crop_debug, "aspectratiocrop", 0, "aspectratiocrop"); aspect_ratio_crop->ar_num = 0; aspect_ratio_crop->ar_denom = 1; aspect_ratio_crop->crop_lock = g_mutex_new (); /* add the transform element */ aspect_ratio_crop->videocrop = gst_element_factory_make ("videocrop", NULL); gst_bin_add (GST_BIN (aspect_ratio_crop), aspect_ratio_crop->videocrop); /* create ghost pad src */ link_pad = gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), "src"); src_pad = gst_ghost_pad_new ("src", link_pad); gst_pad_set_getcaps_function (src_pad, GST_DEBUG_FUNCPTR (gst_aspect_ratio_crop_get_caps)); gst_element_add_pad (GST_ELEMENT (aspect_ratio_crop), src_pad); gst_object_unref (link_pad); /* create ghost pad sink */ link_pad = gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), "sink"); aspect_ratio_crop->sink = gst_ghost_pad_new ("sink", link_pad); gst_element_add_pad (GST_ELEMENT (aspect_ratio_crop), aspect_ratio_crop->sink); gst_object_unref (link_pad); gst_pad_set_setcaps_function (aspect_ratio_crop->sink, GST_DEBUG_FUNCPTR (gst_aspect_ratio_crop_set_caps)); } static void gst_aspect_ratio_transform_structure (GstAspectRatioCrop * aspect_ratio_crop, GstStructure * structure, GstStructure ** new_structure, gboolean set_videocrop) { gdouble incoming_ar; gdouble requested_ar; gint width, height; gint cropvalue; gint par_d, par_n; /* Check if we need to change the aspect ratio */ if (aspect_ratio_crop->ar_num < 1) { GST_DEBUG_OBJECT (aspect_ratio_crop, "No cropping requested"); goto beach; } /* get the information from the caps */ if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "height", &height)) goto beach; if (!gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_n, &par_d)) { par_d = par_n = 1; } incoming_ar = ((gdouble) (width * par_n)) / (height * par_d); GST_LOG_OBJECT (aspect_ratio_crop, "incoming caps width(%d), height(%d), par (%d/%d) : ar = %f", width, height, par_n, par_d, incoming_ar); requested_ar = (gdouble) aspect_ratio_crop->ar_num / aspect_ratio_crop->ar_denom; /* check if the original aspect-ratio is the aspect-ratio that we want */ if (requested_ar == incoming_ar) { GST_DEBUG_OBJECT (aspect_ratio_crop, "Input video already has the correct aspect ratio (%.3f == %.3f)", incoming_ar, requested_ar); goto beach; } else if (requested_ar > incoming_ar) { /* fix aspect ratio with cropping on top and bottom */ cropvalue = ((((double) aspect_ratio_crop->ar_denom / (double) (aspect_ratio_crop->ar_num)) * ((double) par_n / (double) par_d) * width) - height) / 2; if (cropvalue < 0) { cropvalue *= -1; } if (cropvalue >= (height / 2)) goto crop_failed; if (set_videocrop) { gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, cropvalue, 0, cropvalue, 0); } if (new_structure) { *new_structure = gst_structure_copy (structure); gst_structure_set (*new_structure, "height", G_TYPE_INT, (int) (height - (cropvalue * 2)), NULL); } } else { /* fix aspect ratio with cropping on left and right */ cropvalue = ((((double) aspect_ratio_crop->ar_num / (double) (aspect_ratio_crop->ar_denom)) * ((double) par_d / (double) par_n) * height) - width) / 2; if (cropvalue < 0) { cropvalue *= -1; } if (cropvalue >= (width / 2)) goto crop_failed; if (set_videocrop) { gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, 0, cropvalue, 0, cropvalue); } if (new_structure) { *new_structure = gst_structure_copy (structure); gst_structure_set (*new_structure, "width", G_TYPE_INT, (int) (width - (cropvalue * 2)), NULL); } } return; crop_failed: GST_WARNING_OBJECT (aspect_ratio_crop, "can't crop to aspect ratio requested"); goto beach; beach: if (set_videocrop) { gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, 0, 0, 0, 0); } if (new_structure) { *new_structure = gst_structure_copy (structure); } } static GstCaps * gst_aspect_ratio_crop_transform_caps (GstAspectRatioCrop * aspect_ratio_crop, GstCaps * caps) { GstCaps *transform; gint size, i; transform = gst_caps_new_empty (); size = gst_caps_get_size (caps); for (i = 0; i < size; i++) { GstStructure *s; GstStructure *trans_s; s = gst_caps_get_structure (caps, i); gst_aspect_ratio_transform_structure (aspect_ratio_crop, s, &trans_s, FALSE); gst_caps_append_structure (transform, trans_s); } return transform; } static GstCaps * gst_aspect_ratio_crop_get_caps (GstPad * pad) { GstPad *peer; GstAspectRatioCrop *aspect_ratio_crop; GstCaps *return_caps; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); g_mutex_lock (aspect_ratio_crop->crop_lock); peer = gst_pad_get_peer (aspect_ratio_crop->sink); if (peer == NULL) { return_caps = gst_static_pad_template_get_caps (&src_template); gst_caps_ref (return_caps); } else { GstCaps *peer_caps; peer_caps = gst_pad_get_caps (peer); return_caps = gst_aspect_ratio_crop_transform_caps (aspect_ratio_crop, peer_caps); gst_caps_unref (peer_caps); gst_object_unref (peer); } g_mutex_unlock (aspect_ratio_crop->crop_lock); gst_object_unref (aspect_ratio_crop); return return_caps; } static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAspectRatioCrop *aspect_ratio_crop; gboolean recheck = FALSE; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); GST_OBJECT_LOCK (aspect_ratio_crop); switch (prop_id) { case ARG_ASPECT_RATIO_CROP: if (GST_VALUE_HOLDS_FRACTION (value)) { aspect_ratio_crop->ar_num = gst_value_get_fraction_numerator (value); aspect_ratio_crop->ar_denom = gst_value_get_fraction_denominator (value); recheck = (GST_PAD_CAPS (aspect_ratio_crop->sink) != NULL); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (aspect_ratio_crop); if (recheck) { gst_aspect_ratio_crop_set_caps (aspect_ratio_crop->sink, GST_PAD_CAPS (aspect_ratio_crop->sink)); } } static void gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAspectRatioCrop *aspect_ratio_crop; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); GST_OBJECT_LOCK (aspect_ratio_crop); switch (prop_id) { case ARG_ASPECT_RATIO_CROP: gst_value_set_fraction (value, aspect_ratio_crop->ar_num, aspect_ratio_crop->ar_denom); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (aspect_ratio_crop); } gst-plugins-good-0.10.31/gst/videocrop/gstvideocrop.c0000644000175000017500000005720411677341660017465 00000000000000/* GStreamer video frame cropping * Copyright (C) 2006 Tim-Philipp Müller * * 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-videocrop * @see_also: #GstVideoBox * * This element crops video frames, meaning it can remove parts of the * picture on the left, right, top or bottom of the picture and output * a smaller picture than the input picture, with the unwanted parts at the * border removed. * * The videocrop element is similar to the videobox element, but its main * goal is to support a multitude of formats as efficiently as possible. * Unlike videbox, it cannot add borders to the picture and unlike videbox * it will always output images in exactly the same format as the input image. * * If there is nothing to crop, the element will operate in pass-through mode. * * Note that no special efforts are made to handle chroma-subsampled formats * in the case of odd-valued cropping and compensate for sub-unit chroma plane * shifts for such formats in the case where the #GstVideoCrop:left or * #GstVideoCrop:top property is set to an odd number. This doesn't matter for * most use cases, but it might matter for yours. * * * Example launch line * |[ * gst-launch -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink * ]| * */ /* TODO: * - for packed formats, we could avoid memcpy() in case crop_left * and crop_right are 0 and just create a sub-buffer of the input * buffer */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstvideocrop.h" #include "gstaspectratiocrop.h" #include GST_DEBUG_CATEGORY_STATIC (videocrop_debug); #define GST_CAT_DEFAULT videocrop_debug enum { ARG_0, ARG_LEFT, ARG_RIGHT, ARG_TOP, ARG_BOTTOM }; /* the formats we support */ #define GST_VIDEO_CAPS_GRAY "video/x-raw-gray, " \ "bpp = (int) 8, " \ "width = " GST_VIDEO_SIZE_RANGE ", " \ "height = " GST_VIDEO_SIZE_RANGE ", " \ "framerate = " GST_VIDEO_FPS_RANGE #define VIDEO_CROP_CAPS \ GST_VIDEO_CAPS_RGBx ";" \ GST_VIDEO_CAPS_xRGB ";" \ GST_VIDEO_CAPS_BGRx ";" \ GST_VIDEO_CAPS_xBGR ";" \ GST_VIDEO_CAPS_RGBA ";" \ GST_VIDEO_CAPS_ARGB ";" \ GST_VIDEO_CAPS_BGRA ";" \ GST_VIDEO_CAPS_ABGR ";" \ GST_VIDEO_CAPS_RGB ";" \ GST_VIDEO_CAPS_BGR ";" \ GST_VIDEO_CAPS_YUV ("AYUV") ";" \ GST_VIDEO_CAPS_YUV ("YUY2") ";" \ GST_VIDEO_CAPS_YUV ("YVYU") ";" \ GST_VIDEO_CAPS_YUV ("UYVY") ";" \ GST_VIDEO_CAPS_YUV ("Y800") ";" \ GST_VIDEO_CAPS_YUV ("I420") ";" \ GST_VIDEO_CAPS_YUV ("YV12") ";" \ GST_VIDEO_CAPS_RGB_16 ";" \ GST_VIDEO_CAPS_RGB_15 ";" \ GST_VIDEO_CAPS_GRAY static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CROP_CAPS) ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (VIDEO_CROP_CAPS) ); GST_BOILERPLATE (GstVideoCrop, gst_video_crop, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_video_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_video_crop_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps); static GstFlowReturn gst_video_crop_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); static gboolean gst_video_crop_get_unit_size (GstBaseTransform * trans, GstCaps * caps, guint * size); static gboolean gst_video_crop_set_caps (GstBaseTransform * trans, GstCaps * in_caps, GstCaps * outcaps); static gboolean gst_video_crop_src_event (GstBaseTransform * trans, GstEvent * event); static void gst_video_crop_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Crop", "Filter/Effect/Video", "Crops video into a user-defined region", "Tim-Philipp Müller "); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); } static gboolean gst_video_crop_src_event (GstBaseTransform * trans, GstEvent * event) { GstEvent *new_event; GstStructure *new_structure; const GstStructure *structure; const gchar *event_name; double pointer_x; double pointer_y; GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); new_event = NULL; GST_OBJECT_LOCK (vcrop); if (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION && (vcrop->crop_left != 0 || vcrop->crop_top != 0)) { structure = gst_event_get_structure (event); event_name = gst_structure_get_string (structure, "event"); if (event_name && (strcmp (event_name, "mouse-move") == 0 || strcmp (event_name, "mouse-button-press") == 0 || strcmp (event_name, "mouse-button-release") == 0)) { if (gst_structure_get_double (structure, "pointer_x", &pointer_x) && gst_structure_get_double (structure, "pointer_y", &pointer_y)) { new_structure = gst_structure_copy (structure); gst_structure_set (new_structure, "pointer_x", G_TYPE_DOUBLE, (double) (pointer_x + vcrop->crop_left), "pointer_y", G_TYPE_DOUBLE, (double) (pointer_y + vcrop->crop_top), NULL); new_event = gst_event_new_navigation (new_structure); gst_event_unref (event); } else { GST_WARNING_OBJECT (vcrop, "Failed to read navigation event"); } } } GST_OBJECT_UNLOCK (vcrop); return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, (new_event ? new_event : event)); } static void gst_video_crop_class_init (GstVideoCropClass * klass) { GObjectClass *gobject_class; GstBaseTransformClass *basetransform_class; gobject_class = (GObjectClass *) klass; basetransform_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_video_crop_set_property; gobject_class->get_property = gst_video_crop_get_property; g_object_class_install_property (gobject_class, ARG_LEFT, g_param_spec_int ("left", "Left", "Pixels to crop at left", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_RIGHT, g_param_spec_int ("right", "Right", "Pixels to crop at right", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_TOP, g_param_spec_int ("top", "Top", "Pixels to crop at top", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_BOTTOM, g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); basetransform_class->transform = GST_DEBUG_FUNCPTR (gst_video_crop_transform); basetransform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_video_crop_transform_caps); basetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_crop_set_caps); basetransform_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_video_crop_get_unit_size); basetransform_class->passthrough_on_same_caps = FALSE; basetransform_class->src_event = GST_DEBUG_FUNCPTR (gst_video_crop_src_event); } static void gst_video_crop_init (GstVideoCrop * vcrop, GstVideoCropClass * klass) { vcrop->crop_right = 0; vcrop->crop_left = 0; vcrop->crop_top = 0; vcrop->crop_bottom = 0; } static gboolean gst_video_crop_get_image_details_from_caps (GstVideoCrop * vcrop, GstVideoCropImageDetails * details, GstCaps * caps) { GstStructure *structure; gint width, height; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "height", &height)) { goto incomplete_format; } details->width = width; details->height = height; if (gst_structure_has_name (structure, "video/x-raw-rgb") || gst_structure_has_name (structure, "video/x-raw-gray")) { gint bpp = 0; if (!gst_structure_get_int (structure, "bpp", &bpp) || (bpp & 0x07) != 0) goto incomplete_format; details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; details->bytes_per_pixel = bpp / 8; details->stride = GST_ROUND_UP_4 (width * details->bytes_per_pixel); details->size = details->stride * height; } else if (gst_structure_has_name (structure, "video/x-raw-yuv")) { guint32 format = 0; if (!gst_structure_get_fourcc (structure, "format", &format)) goto incomplete_format; switch (format) { case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; details->bytes_per_pixel = 4; details->stride = GST_ROUND_UP_4 (width * 4); details->size = details->stride * height; break; case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX; details->bytes_per_pixel = 2; details->stride = GST_ROUND_UP_4 (width * 2); details->size = details->stride * height; if (format == GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y')) { /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] */ details->macro_y_off = 1; } else { /* YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ details->macro_y_off = 0; } break; case GST_MAKE_FOURCC ('Y', '8', '0', '0'): details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; details->bytes_per_pixel = 1; details->stride = GST_ROUND_UP_4 (width); details->size = details->stride * height; break; case GST_MAKE_FOURCC ('I', '4', '2', '0'): case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):{ details->packing = VIDEO_CROP_PIXEL_FORMAT_PLANAR; details->y_stride = GST_ROUND_UP_4 (width); details->u_stride = GST_ROUND_UP_8 (width) / 2; details->v_stride = GST_ROUND_UP_8 (width) / 2; /* I420 and YV12 have U/V planes swapped, but doesn't matter for us */ details->y_off = 0; details->u_off = 0 + details->y_stride * GST_ROUND_UP_2 (height); details->v_off = details->u_off + details->u_stride * (GST_ROUND_UP_2 (height) / 2); details->size = details->v_off + details->v_stride * (GST_ROUND_UP_2 (height) / 2); break; } default: goto unknown_format; } } else { goto unknown_format; } return TRUE; /* ERRORS */ unknown_format: { GST_ELEMENT_ERROR (vcrop, STREAM, NOT_IMPLEMENTED, (NULL), ("Unsupported format")); return FALSE; } incomplete_format: { GST_ELEMENT_ERROR (vcrop, CORE, NEGOTIATION, (NULL), ("Incomplete caps, some required field is missing")); return FALSE; } } static gboolean gst_video_crop_get_unit_size (GstBaseTransform * trans, GstCaps * caps, guint * size) { GstVideoCropImageDetails img_details = { 0, }; GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); if (!gst_video_crop_get_image_details_from_caps (vcrop, &img_details, caps)) return FALSE; *size = img_details.size; return TRUE; } #define ROUND_DOWN_2(n) ((n)&(~1)) static void gst_video_crop_transform_packed_complex (GstVideoCrop * vcrop, GstBuffer * inbuf, GstBuffer * outbuf) { guint8 *in_data, *out_data; guint i, dx; in_data = GST_BUFFER_DATA (inbuf); out_data = GST_BUFFER_DATA (outbuf); in_data += vcrop->crop_top * vcrop->in.stride; /* rounding down here so we end up at the start of a macro-pixel and not * in the middle of one */ in_data += ROUND_DOWN_2 (vcrop->crop_left) * vcrop->in.bytes_per_pixel; dx = vcrop->out.width * vcrop->out.bytes_per_pixel; /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] * YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ if ((vcrop->crop_left % 2) != 0) { for (i = 0; i < vcrop->out.height; ++i) { gint j; memcpy (out_data, in_data, dx); /* move just the Y samples one pixel to the left, don't worry about * chroma shift */ for (j = vcrop->in.macro_y_off; j < vcrop->out.stride - 2; j += 2) out_data[j] = in_data[j + 2]; in_data += vcrop->in.stride; out_data += vcrop->out.stride; } } else { for (i = 0; i < vcrop->out.height; ++i) { memcpy (out_data, in_data, dx); in_data += vcrop->in.stride; out_data += vcrop->out.stride; } } } static void gst_video_crop_transform_packed_simple (GstVideoCrop * vcrop, GstBuffer * inbuf, GstBuffer * outbuf) { guint8 *in_data, *out_data; guint i, dx; in_data = GST_BUFFER_DATA (inbuf); out_data = GST_BUFFER_DATA (outbuf); in_data += vcrop->crop_top * vcrop->in.stride; in_data += vcrop->crop_left * vcrop->in.bytes_per_pixel; dx = vcrop->out.width * vcrop->out.bytes_per_pixel; for (i = 0; i < vcrop->out.height; ++i) { memcpy (out_data, in_data, dx); in_data += vcrop->in.stride; out_data += vcrop->out.stride; } } static void gst_video_crop_transform_planar (GstVideoCrop * vcrop, GstBuffer * inbuf, GstBuffer * outbuf) { guint8 *y_out, *u_out, *v_out; guint8 *y_in, *u_in, *v_in; guint i, dx; /* Y plane */ y_in = GST_BUFFER_DATA (inbuf); y_out = GST_BUFFER_DATA (outbuf); y_in += (vcrop->crop_top * vcrop->in.y_stride) + vcrop->crop_left; dx = vcrop->out.width * 1; for (i = 0; i < vcrop->out.height; ++i) { memcpy (y_out, y_in, dx); y_in += vcrop->in.y_stride; y_out += vcrop->out.y_stride; } /* U + V planes */ u_in = GST_BUFFER_DATA (inbuf) + vcrop->in.u_off; u_out = GST_BUFFER_DATA (outbuf) + vcrop->out.u_off; u_in += (vcrop->crop_top / 2) * vcrop->in.u_stride; u_in += vcrop->crop_left / 2; v_in = GST_BUFFER_DATA (inbuf) + vcrop->in.v_off; v_out = GST_BUFFER_DATA (outbuf) + vcrop->out.v_off; v_in += (vcrop->crop_top / 2) * vcrop->in.v_stride; v_in += vcrop->crop_left / 2; dx = GST_ROUND_UP_2 (vcrop->out.width) / 2; for (i = 0; i < GST_ROUND_UP_2 (vcrop->out.height) / 2; ++i) { memcpy (u_out, u_in, dx); memcpy (v_out, v_in, dx); u_in += vcrop->in.u_stride; u_out += vcrop->out.u_stride; v_in += vcrop->in.v_stride; v_out += vcrop->out.v_stride; } } static GstFlowReturn gst_video_crop_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf) { GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); switch (vcrop->in.packing) { case VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE: gst_video_crop_transform_packed_simple (vcrop, inbuf, outbuf); break; case VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX: gst_video_crop_transform_packed_complex (vcrop, inbuf, outbuf); break; case VIDEO_CROP_PIXEL_FORMAT_PLANAR: gst_video_crop_transform_planar (vcrop, inbuf, outbuf); break; default: g_assert_not_reached (); } return GST_FLOW_OK; } static gint gst_video_crop_transform_dimension (gint val, gint delta) { gint64 new_val = (gint64) val + (gint64) delta; new_val = CLAMP (new_val, 1, G_MAXINT); return (gint) new_val; } static gboolean gst_video_crop_transform_dimension_value (const GValue * src_val, gint delta, GValue * dest_val) { gboolean ret = TRUE; g_value_init (dest_val, G_VALUE_TYPE (src_val)); if (G_VALUE_HOLDS_INT (src_val)) { gint ival = g_value_get_int (src_val); ival = gst_video_crop_transform_dimension (ival, delta); g_value_set_int (dest_val, ival); } else if (GST_VALUE_HOLDS_INT_RANGE (src_val)) { gint min = gst_value_get_int_range_min (src_val); gint max = gst_value_get_int_range_max (src_val); min = gst_video_crop_transform_dimension (min, delta); max = gst_video_crop_transform_dimension (max, delta); gst_value_set_int_range (dest_val, min, max); } else if (GST_VALUE_HOLDS_LIST (src_val)) { gint i; for (i = 0; i < gst_value_list_get_size (src_val); ++i) { const GValue *list_val; GValue newval = { 0, }; list_val = gst_value_list_get_value (src_val, i); if (gst_video_crop_transform_dimension_value (list_val, delta, &newval)) gst_value_list_append_value (dest_val, &newval); g_value_unset (&newval); } if (gst_value_list_get_size (dest_val) == 0) { g_value_unset (dest_val); ret = FALSE; } } else { g_value_unset (dest_val); ret = FALSE; } return ret; } static GstCaps * gst_video_crop_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps) { GstVideoCrop *vcrop; GstCaps *other_caps; gint dy, dx, i; vcrop = GST_VIDEO_CROP (trans); GST_OBJECT_LOCK (vcrop); GST_LOG_OBJECT (vcrop, "l=%d,r=%d,b=%d,t=%d", vcrop->crop_left, vcrop->crop_right, vcrop->crop_bottom, vcrop->crop_top); if (direction == GST_PAD_SRC) { dx = vcrop->crop_left + vcrop->crop_right; dy = vcrop->crop_top + vcrop->crop_bottom; } else { dx = 0 - (vcrop->crop_left + vcrop->crop_right); dy = 0 - (vcrop->crop_top + vcrop->crop_bottom); } GST_OBJECT_UNLOCK (vcrop); GST_LOG_OBJECT (vcrop, "transforming caps %" GST_PTR_FORMAT, caps); other_caps = gst_caps_new_empty (); for (i = 0; i < gst_caps_get_size (caps); ++i) { const GValue *v; GstStructure *structure, *new_structure; GValue w_val = { 0, }, h_val = { 0,}; structure = gst_caps_get_structure (caps, i); v = gst_structure_get_value (structure, "width"); if (!gst_video_crop_transform_dimension_value (v, dx, &w_val)) { GST_WARNING_OBJECT (vcrop, "could not tranform width value with dx=%d" ", caps structure=%" GST_PTR_FORMAT, dx, structure); continue; } v = gst_structure_get_value (structure, "height"); if (!gst_video_crop_transform_dimension_value (v, dy, &h_val)) { g_value_unset (&w_val); GST_WARNING_OBJECT (vcrop, "could not tranform height value with dy=%d" ", caps structure=%" GST_PTR_FORMAT, dy, structure); continue; } new_structure = gst_structure_copy (structure); gst_structure_set_value (new_structure, "width", &w_val); gst_structure_set_value (new_structure, "height", &h_val); g_value_unset (&w_val); g_value_unset (&h_val); GST_LOG_OBJECT (vcrop, "transformed structure %2d: %" GST_PTR_FORMAT " => %" GST_PTR_FORMAT, i, structure, new_structure); gst_caps_append_structure (other_caps, new_structure); } if (gst_caps_is_empty (other_caps)) { gst_caps_unref (other_caps); other_caps = NULL; } return other_caps; } static gboolean gst_video_crop_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps) { GstVideoCrop *crop = GST_VIDEO_CROP (trans); if (!gst_video_crop_get_image_details_from_caps (crop, &crop->in, incaps)) goto wrong_input; if (!gst_video_crop_get_image_details_from_caps (crop, &crop->out, outcaps)) goto wrong_output; if (G_UNLIKELY ((crop->crop_left + crop->crop_right) >= crop->in.width || (crop->crop_top + crop->crop_bottom) >= crop->in.height)) goto cropping_too_much; GST_LOG_OBJECT (crop, "incaps = %" GST_PTR_FORMAT ", outcaps = %" GST_PTR_FORMAT, incaps, outcaps); if ((crop->crop_left | crop->crop_right | crop->crop_top | crop-> crop_bottom) == 0) { GST_LOG_OBJECT (crop, "we are using passthrough"); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), TRUE); } else { GST_LOG_OBJECT (crop, "we are not using passthrough"); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), FALSE); } return TRUE; /* ERROR */ wrong_input: { GST_DEBUG_OBJECT (crop, "failed to parse input caps %" GST_PTR_FORMAT, incaps); return FALSE; } wrong_output: { GST_DEBUG_OBJECT (crop, "failed to parse output caps %" GST_PTR_FORMAT, outcaps); return FALSE; } cropping_too_much: { GST_DEBUG_OBJECT (crop, "we are cropping too much"); return FALSE; } } static void gst_video_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoCrop *video_crop; video_crop = GST_VIDEO_CROP (object); /* don't modify while we are transforming */ GST_BASE_TRANSFORM_LOCK (GST_BASE_TRANSFORM_CAST (video_crop)); /* protect with the object lock so that we can read them */ GST_OBJECT_LOCK (video_crop); switch (prop_id) { case ARG_LEFT: video_crop->crop_left = g_value_get_int (value); break; case ARG_RIGHT: video_crop->crop_right = g_value_get_int (value); break; case ARG_TOP: video_crop->crop_top = g_value_get_int (value); break; case ARG_BOTTOM: video_crop->crop_bottom = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (video_crop); GST_LOG_OBJECT (video_crop, "l=%d,r=%d,b=%d,t=%d", video_crop->crop_left, video_crop->crop_right, video_crop->crop_bottom, video_crop->crop_top); gst_base_transform_reconfigure (GST_BASE_TRANSFORM (video_crop)); GST_BASE_TRANSFORM_UNLOCK (GST_BASE_TRANSFORM_CAST (video_crop)); } static void gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoCrop *video_crop; video_crop = GST_VIDEO_CROP (object); GST_OBJECT_LOCK (video_crop); switch (prop_id) { case ARG_LEFT: g_value_set_int (value, video_crop->crop_left); break; case ARG_RIGHT: g_value_set_int (value, video_crop->crop_right); break; case ARG_TOP: g_value_set_int (value, video_crop->crop_top); break; case ARG_BOTTOM: g_value_set_int (value, video_crop->crop_bottom); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (video_crop); } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (videocrop_debug, "videocrop", 0, "videocrop"); if (gst_element_register (plugin, "videocrop", GST_RANK_NONE, GST_TYPE_VIDEO_CROP) && gst_element_register (plugin, "aspectratiocrop", GST_RANK_NONE, GST_TYPE_ASPECT_RATIO_CROP)) return TRUE; return FALSE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "videocrop", "Crops video into a user-defined region", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/videocrop/gstvideocrop.h0000644000175000017500000000515611671175354017470 00000000000000/* GStreamer video frame cropping * Copyright (C) 2006 Tim-Philipp Müller * * 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_VIDEO_CROP_H__ #define __GST_VIDEO_CROP_H__ #include G_BEGIN_DECLS #define GST_TYPE_VIDEO_CROP \ (gst_video_crop_get_type()) #define GST_VIDEO_CROP(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_CROP,GstVideoCrop)) #define GST_VIDEO_CROP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_CROP,GstVideoCropClass)) #define GST_IS_VIDEO_CROP(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_CROP)) #define GST_IS_VIDEO_CROP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_CROP)) typedef enum { VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0, /* RGBx, AYUV */ VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX, /* UYVY, YVYU */ VIDEO_CROP_PIXEL_FORMAT_PLANAR /* I420, YV12 */ } VideoCropPixelFormat; typedef struct _GstVideoCropImageDetails GstVideoCropImageDetails; struct _GstVideoCropImageDetails { /*< private >*/ VideoCropPixelFormat packing; guint width; guint height; guint size; /* for packed RGB and YUV */ guint stride; guint bytes_per_pixel; guint8 macro_y_off; /* for YUY2, YVYU, UYVY, Y offset within macropixel in bytes */ /* for planar YUV */ guint y_stride, y_off; guint u_stride, u_off; guint v_stride, v_off; }; typedef struct _GstVideoCrop GstVideoCrop; typedef struct _GstVideoCropClass GstVideoCropClass; struct _GstVideoCrop { GstBaseTransform basetransform; /*< private >*/ gint crop_left; gint crop_right; gint crop_top; gint crop_bottom; GstVideoCropImageDetails in; /* details of input image */ GstVideoCropImageDetails out; /* details of output image */ }; struct _GstVideoCropClass { GstBaseTransformClass basetransform_class; }; GType gst_video_crop_get_type (void); G_END_DECLS #endif /* __GST_VIDEO_CROP_H__ */ gst-plugins-good-0.10.31/gst/videocrop/Makefile.in0000644000175000017500000007166711720560236016656 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/videocrop DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstvideocrop_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgstvideocrop_la_OBJECTS = libgstvideocrop_la-gstvideocrop.lo \ libgstvideocrop_la-gstaspectratiocrop.lo libgstvideocrop_la_OBJECTS = $(am_libgstvideocrop_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstvideocrop_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) \ $(libgstvideocrop_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstvideocrop_la_SOURCES) DIST_SOURCES = $(libgstvideocrop_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstvideocrop.la # Note: we only use defines from gst/video/video.h, but none # of the functions, so we don't need to link to libgstvideo libgstvideocrop_la_SOURCES = gstvideocrop.c gstaspectratiocrop.c libgstvideocrop_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstvideocrop_la_LIBADD = $(GST_BASE_LIBS) libgstvideocrop_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideocrop_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstvideocrop.h gstaspectratiocrop.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videocrop/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/videocrop/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstvideocrop.la: $(libgstvideocrop_la_OBJECTS) $(libgstvideocrop_la_DEPENDENCIES) $(EXTRA_libgstvideocrop_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstvideocrop_la_LINK) -rpath $(plugindir) $(libgstvideocrop_la_OBJECTS) $(libgstvideocrop_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideocrop_la-gstvideocrop.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstvideocrop_la-gstvideocrop.lo: gstvideocrop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -MT libgstvideocrop_la-gstvideocrop.lo -MD -MP -MF $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Tpo -c -o libgstvideocrop_la-gstvideocrop.lo `test -f 'gstvideocrop.c' || echo '$(srcdir)/'`gstvideocrop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Tpo $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideocrop.c' object='libgstvideocrop_la-gstvideocrop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -c -o libgstvideocrop_la-gstvideocrop.lo `test -f 'gstvideocrop.c' || echo '$(srcdir)/'`gstvideocrop.c libgstvideocrop_la-gstaspectratiocrop.lo: gstaspectratiocrop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -MT libgstvideocrop_la-gstaspectratiocrop.lo -MD -MP -MF $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Tpo -c -o libgstvideocrop_la-gstaspectratiocrop.lo `test -f 'gstaspectratiocrop.c' || echo '$(srcdir)/'`gstaspectratiocrop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Tpo $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaspectratiocrop.c' object='libgstvideocrop_la-gstaspectratiocrop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -c -o libgstvideocrop_la-gstaspectratiocrop.lo `test -f 'gstaspectratiocrop.c' || echo '$(srcdir)/'`gstaspectratiocrop.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideocrop -:SHARED libgstvideocrop \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideocrop_la_SOURCES) \ $(nodist_libgstvideocrop_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideocrop_la_CFLAGS) \ -:LDFLAGS $(libgstvideocrop_la_LDFLAGS) \ $(libgstvideocrop_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/replaygain/0000755000175000017500000000000011720565304015012 500000000000000gst-plugins-good-0.10.31/gst/replaygain/replaygain.c0000644000175000017500000000320011671175354017233 00000000000000/* GStreamer ReplayGain plugin * * Copyright (C) 2006 Rene Stadler * * replaygain.c: Plugin providing ReplayGain related elements * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include "gstrganalysis.h" #include "gstrglimiter.h" #include "gstrgvolume.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "rganalysis", GST_RANK_NONE, GST_TYPE_RG_ANALYSIS)) return FALSE; if (!gst_element_register (plugin, "rglimiter", GST_RANK_NONE, GST_TYPE_RG_LIMITER)) return FALSE; if (!gst_element_register (plugin, "rgvolume", GST_RANK_NONE, GST_TYPE_RG_VOLUME)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "replaygain", "ReplayGain volume normalization", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/replaygain/gstrganalysis.c0000644000175000017500000006000311677341656020004 00000000000000/* GStreamer ReplayGain analysis * * Copyright (C) 2006 Rene Stadler * * gstrganalysis.c: Element that performs the ReplayGain analysis * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * SECTION:element-rganalysis * @see_also: #GstRgVolume * * This element analyzes raw audio sample data in accordance with the proposed * ReplayGain standard for * calculating the ideal replay gain for music tracks and albums. The element * is designed as a pass-through filter that never modifies any data. As it * receives an EOS event, it finalizes the ongoing analysis and generates a tag * list containing the results. It is sent downstream with a tag event and * posted on the message bus with a tag message. The EOS event is forwarded as * normal afterwards. Result tag lists at least contain the tags * #GST_TAG_TRACK_GAIN, #GST_TAG_TRACK_PEAK and #GST_TAG_REFERENCE_LEVEL. * * Because the generated metadata tags become available at the end of streams, * downstream muxer and encoder elements are normally unable to save them in * their output since they generally save metadata in the file header. * Therefore, it is often necessary that applications read the results in a bus * event handler for the tag message. Obtaining the values this way is always * needed for album processing * since the album gain and peak values need to be associated with all tracks of * an album, not just the last one. * * * Example launch lines * |[ * gst-launch -t audiotestsrc wave=sine num-buffers=512 ! rganalysis ! fakesink * ]| Analyze a simple test waveform * |[ * gst-launch -t filesrc location=filename.ext ! decodebin \ * ! audioconvert ! audioresample ! rganalysis ! fakesink * ]| Analyze a given file * |[ * gst-launch -t gnomevfssrc location=http://replaygain.hydrogenaudio.org/ref_pink.wav \ * ! wavparse ! rganalysis ! fakesink * ]| Analyze the pink noise reference file * * The above launch line yields a result gain of +6 dB (instead of the expected * +0 dB). This is not in error, refer to the #GstRgAnalysis:reference-level * property documentation for more information. * * * * Acknowledgements * * This element is based on code used in the vorbisgain program and many * others. The relevant parts are copyrighted by David Robinson, Glen Sawyer * and Frank Klemm. * * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "gstrganalysis.h" #include "replaygain.h" GST_DEBUG_CATEGORY_STATIC (gst_rg_analysis_debug); #define GST_CAT_DEFAULT gst_rg_analysis_debug /* Default property value. */ #define FORCED_DEFAULT TRUE #define DEFAULT_MESSAGE FALSE enum { PROP_0, PROP_NUM_TRACKS, PROP_FORCED, PROP_REFERENCE_LEVEL, PROP_MESSAGE }; /* The ReplayGain algorithm is intended for use with mono and stereo * audio. The used implementation has filter coefficients for the * "usual" sample rates in the 8000 to 48000 Hz range. */ #define REPLAY_GAIN_CAPS \ "channels = (int) { 1, 2 }, " \ "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, " \ "44100, 48000 }" static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, " "endianness = (int) BYTE_ORDER, " REPLAY_GAIN_CAPS "; " "audio/x-raw-int, " "width = (int) 16, " "depth = (int) [ 1, 16 ], " "signed = (boolean) true, " "endianness = (int) BYTE_ORDER, " REPLAY_GAIN_CAPS)); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, " "endianness = (int) BYTE_ORDER, " REPLAY_GAIN_CAPS "; " "audio/x-raw-int, " "width = (int) 16, " "depth = (int) [ 1, 16 ], " "signed = (boolean) true, " "endianness = (int) BYTE_ORDER, " REPLAY_GAIN_CAPS)); GST_BOILERPLATE (GstRgAnalysis, gst_rg_analysis, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_rg_analysis_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rg_analysis_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rg_analysis_start (GstBaseTransform * base); static gboolean gst_rg_analysis_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps); static GstFlowReturn gst_rg_analysis_transform_ip (GstBaseTransform * base, GstBuffer * buf); static gboolean gst_rg_analysis_event (GstBaseTransform * base, GstEvent * event); static gboolean gst_rg_analysis_stop (GstBaseTransform * base); static void gst_rg_analysis_handle_tags (GstRgAnalysis * filter, const GstTagList * tag_list); static void gst_rg_analysis_handle_eos (GstRgAnalysis * filter); static gboolean gst_rg_analysis_track_result (GstRgAnalysis * filter, GstTagList ** tag_list); static gboolean gst_rg_analysis_album_result (GstRgAnalysis * filter, GstTagList ** tag_list); static void gst_rg_analysis_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "ReplayGain analysis", "Filter/Analyzer/Audio", "Perform the ReplayGain analysis", "Ren\xc3\xa9 Stadler "); GST_DEBUG_CATEGORY_INIT (gst_rg_analysis_debug, "rganalysis", 0, "ReplayGain analysis element"); } static void gst_rg_analysis_class_init (GstRgAnalysisClass * klass) { GObjectClass *gobject_class; GstBaseTransformClass *trans_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_rg_analysis_set_property; gobject_class->get_property = gst_rg_analysis_get_property; /** * GstRgAnalysis:num-tracks: * * Number of remaining album tracks. * * Analyzing several streams sequentially and assigning them a common result * gain is known as "album processing". If this gain is used during playback * (by switching to "album mode"), all tracks of an album receive the same * amplification. This keeps the relative volume levels between the tracks * intact. To enable this, set this property to the number of streams that * will be processed as album tracks. * * Every time an EOS event is received, the value of this property is * decremented by one. As it reaches zero, it is assumed that the last track * of the album finished. The tag list for the final stream will contain the * additional tags #GST_TAG_ALBUM_GAIN and #GST_TAG_ALBUM_PEAK. All other * streams just get the two track tags posted because the values for the album * tags are not known before all tracks are analyzed. Applications need to * ensure that the album gain and peak values are also associated with the * other tracks when storing the results. * * If the total number of album tracks is unknown beforehand, just ensure that * the value is greater than 1 before each track starts. Then before the end * of the last track, set it to the value 1. * * To perform album processing, the element has to preserve data between * streams. This cannot survive a state change to the NULL or READY state. * If you change your pipeline's state to NULL or READY between tracks, lock * the element's state using gst_element_set_locked_state() when it is in * PAUSED or PLAYING. */ g_object_class_install_property (gobject_class, PROP_NUM_TRACKS, g_param_spec_int ("num-tracks", "Number of album tracks", "Number of remaining album tracks", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRgAnalysis:forced: * * Whether to analyze streams even when ReplayGain tags exist. * * For assisting transcoder/converter applications, the element can silently * skip the processing of streams that already contain the necessary tags. * Data will flow as usual but the element will not consume CPU time and will * not generate result tags. To enable possible skipping, set this property * to #FALSE. * * If used in conjunction with album * processing, the element will skip the number of remaining album * tracks if a full set of tags is found for the first track. If a subsequent * track of the album is missing tags, processing cannot start again. If this * is undesired, the application has to scan all files beforehand and enable * forcing of processing if needed. */ g_object_class_install_property (gobject_class, PROP_FORCED, g_param_spec_boolean ("forced", "Forced", "Analyze even if ReplayGain tags exist", FORCED_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRgAnalysis:reference-level: * * Reference level [dB]. * * Analyzing the ReplayGain pink noise reference waveform computes a result of * +6 dB instead of the expected 0 dB. This is because the default reference * level is 89 dB. To obtain values as lined out in the original proposal of * ReplayGain, set this property to 83. * * Almost all software uses 89 dB as a reference however, and this value has * become the new official value. That is to say, while the change has been * acclaimed by the author of the ReplayGain proposal, the webpage is still outdated at the time * of this writing. * * The value was changed because the original proposal recommends a default * pre-amp value of +6 dB for playback. This seemed a bit odd, as it means * that the algorithm has the general tendency to produce adjustment values * that are 6 dB too low. Bumping the reference level by 6 dB compensated for * this. * * The problem of the reference level being ambiguous for lack of concise * standardization is to be solved by adopting the #GST_TAG_REFERENCE_LEVEL * tag, which allows to store the used value alongside the gain values. */ g_object_class_install_property (gobject_class, PROP_REFERENCE_LEVEL, g_param_spec_double ("reference-level", "Reference level", "Reference level [dB]", 0.0, 150., RG_REFERENCE_LEVEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MESSAGE, g_param_spec_boolean ("message", "Message", "Post statics messages", DEFAULT_MESSAGE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); trans_class = (GstBaseTransformClass *) klass; trans_class->start = GST_DEBUG_FUNCPTR (gst_rg_analysis_start); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_rg_analysis_set_caps); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_rg_analysis_transform_ip); trans_class->event = GST_DEBUG_FUNCPTR (gst_rg_analysis_event); trans_class->stop = GST_DEBUG_FUNCPTR (gst_rg_analysis_stop); trans_class->passthrough_on_same_caps = TRUE; } static void gst_rg_analysis_init (GstRgAnalysis * filter, GstRgAnalysisClass * gclass) { GstBaseTransform *base = GST_BASE_TRANSFORM (filter); gst_base_transform_set_gap_aware (base, TRUE); filter->num_tracks = 0; filter->forced = FORCED_DEFAULT; filter->message = DEFAULT_MESSAGE; filter->reference_level = RG_REFERENCE_LEVEL; filter->ctx = NULL; filter->analyze = NULL; } static void gst_rg_analysis_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRgAnalysis *filter = GST_RG_ANALYSIS (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_NUM_TRACKS: filter->num_tracks = g_value_get_int (value); break; case PROP_FORCED: filter->forced = g_value_get_boolean (value); break; case PROP_REFERENCE_LEVEL: filter->reference_level = g_value_get_double (value); break; case PROP_MESSAGE: filter->message = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_rg_analysis_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRgAnalysis *filter = GST_RG_ANALYSIS (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_NUM_TRACKS: g_value_set_int (value, filter->num_tracks); break; case PROP_FORCED: g_value_set_boolean (value, filter->forced); break; case PROP_REFERENCE_LEVEL: g_value_set_double (value, filter->reference_level); break; case PROP_MESSAGE: g_value_set_boolean (value, filter->message); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_rg_analysis_post_message (gpointer rganalysis, GstClockTime timestamp, GstClockTime duration, gdouble rglevel) { GstRgAnalysis *filter = GST_RG_ANALYSIS (rganalysis); if (filter->message) { GstMessage *m; m = gst_message_new_element (GST_OBJECT_CAST (rganalysis), gst_structure_new ("rganalysis", "timestamp", G_TYPE_UINT64, timestamp, "duration", G_TYPE_UINT64, duration, "rglevel", G_TYPE_DOUBLE, rglevel, NULL)); gst_element_post_message (GST_ELEMENT_CAST (rganalysis), m); } } static gboolean gst_rg_analysis_start (GstBaseTransform * base) { GstRgAnalysis *filter = GST_RG_ANALYSIS (base); filter->ignore_tags = FALSE; filter->skip = FALSE; filter->has_track_gain = FALSE; filter->has_track_peak = FALSE; filter->has_album_gain = FALSE; filter->has_album_peak = FALSE; filter->ctx = rg_analysis_new (); GST_OBJECT_LOCK (filter); rg_analysis_init_silence_detection (filter->ctx, gst_rg_analysis_post_message, filter); GST_OBJECT_UNLOCK (filter); filter->analyze = NULL; GST_LOG_OBJECT (filter, "started"); return TRUE; } static gboolean gst_rg_analysis_set_caps (GstBaseTransform * base, GstCaps * in_caps, GstCaps * out_caps) { GstRgAnalysis *filter = GST_RG_ANALYSIS (base); GstStructure *structure; const gchar *name; gint n_channels, sample_rate, sample_bit_size, sample_size; g_return_val_if_fail (filter->ctx != NULL, FALSE); GST_DEBUG_OBJECT (filter, "set_caps in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, in_caps, out_caps); structure = gst_caps_get_structure (in_caps, 0); name = gst_structure_get_name (structure); if (!gst_structure_get_int (structure, "width", &sample_bit_size) || !gst_structure_get_int (structure, "channels", &n_channels) || !gst_structure_get_int (structure, "rate", &sample_rate)) goto invalid_format; if (!rg_analysis_set_sample_rate (filter->ctx, sample_rate)) goto invalid_format; if (sample_bit_size % 8 != 0) goto invalid_format; sample_size = sample_bit_size / 8; if (g_str_equal (name, "audio/x-raw-float")) { if (sample_size != sizeof (gfloat)) goto invalid_format; /* The depth is not variable for float formats of course. It just * makes the transform function nice and simple if the * rg_analysis_analyze_* functions have a common signature. */ filter->depth = sizeof (gfloat) * 8; if (n_channels == 1) filter->analyze = rg_analysis_analyze_mono_float; else if (n_channels == 2) filter->analyze = rg_analysis_analyze_stereo_float; else goto invalid_format; } else if (g_str_equal (name, "audio/x-raw-int")) { if (sample_size != sizeof (gint16)) goto invalid_format; if (!gst_structure_get_int (structure, "depth", &filter->depth)) goto invalid_format; if (filter->depth < 1 || filter->depth > 16) goto invalid_format; if (n_channels == 1) filter->analyze = rg_analysis_analyze_mono_int16; else if (n_channels == 2) filter->analyze = rg_analysis_analyze_stereo_int16; else goto invalid_format; } else { goto invalid_format; } return TRUE; /* Errors. */ invalid_format: { filter->analyze = NULL; GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION, ("Invalid incoming caps: %" GST_PTR_FORMAT, in_caps), (NULL)); return FALSE; } } static GstFlowReturn gst_rg_analysis_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstRgAnalysis *filter = GST_RG_ANALYSIS (base); g_return_val_if_fail (filter->ctx != NULL, GST_FLOW_WRONG_STATE); g_return_val_if_fail (filter->analyze != NULL, GST_FLOW_NOT_NEGOTIATED); if (filter->skip) return GST_FLOW_OK; GST_LOG_OBJECT (filter, "processing buffer of size %u", GST_BUFFER_SIZE (buf)); rg_analysis_start_buffer (filter->ctx, GST_BUFFER_TIMESTAMP (buf)); filter->analyze (filter->ctx, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), filter->depth); return GST_FLOW_OK; } static gboolean gst_rg_analysis_event (GstBaseTransform * base, GstEvent * event) { GstRgAnalysis *filter = GST_RG_ANALYSIS (base); g_return_val_if_fail (filter->ctx != NULL, TRUE); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: { GST_LOG_OBJECT (filter, "received EOS event"); gst_rg_analysis_handle_eos (filter); GST_LOG_OBJECT (filter, "passing on EOS event"); break; } case GST_EVENT_TAG: { GstTagList *tag_list; /* The reference to the tag list is borrowed. */ gst_event_parse_tag (event, &tag_list); gst_rg_analysis_handle_tags (filter, tag_list); break; } default: break; } return GST_BASE_TRANSFORM_CLASS (parent_class)->event (base, event); } static gboolean gst_rg_analysis_stop (GstBaseTransform * base) { GstRgAnalysis *filter = GST_RG_ANALYSIS (base); g_return_val_if_fail (filter->ctx != NULL, FALSE); rg_analysis_destroy (filter->ctx); filter->ctx = NULL; GST_LOG_OBJECT (filter, "stopped"); return TRUE; } static void gst_rg_analysis_handle_tags (GstRgAnalysis * filter, const GstTagList * tag_list) { gboolean album_processing = (filter->num_tracks > 0); gdouble dummy; if (!album_processing) filter->ignore_tags = FALSE; if (filter->skip && album_processing) { GST_DEBUG_OBJECT (filter, "ignoring tag event: skipping album"); return; } else if (filter->skip) { GST_DEBUG_OBJECT (filter, "ignoring tag event: skipping track"); return; } else if (filter->ignore_tags) { GST_DEBUG_OBJECT (filter, "ignoring tag event: cannot skip anyways"); return; } filter->has_track_gain |= gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &dummy); filter->has_track_peak |= gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &dummy); filter->has_album_gain |= gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &dummy); filter->has_album_peak |= gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &dummy); if (!(filter->has_track_gain && filter->has_track_peak)) { GST_DEBUG_OBJECT (filter, "track tags not complete yet"); return; } if (album_processing && !(filter->has_album_gain && filter->has_album_peak)) { GST_DEBUG_OBJECT (filter, "album tags not complete yet"); return; } if (filter->forced) { GST_DEBUG_OBJECT (filter, "existing tags are sufficient, but processing anyway (forced)"); return; } filter->skip = TRUE; rg_analysis_reset (filter->ctx); if (!album_processing) { GST_DEBUG_OBJECT (filter, "existing tags are sufficient, will not process this track"); } else { GST_DEBUG_OBJECT (filter, "existing tags are sufficient, will not process this album"); } } static void gst_rg_analysis_handle_eos (GstRgAnalysis * filter) { gboolean album_processing = (filter->num_tracks > 0); gboolean album_finished = (filter->num_tracks == 1); gboolean album_skipping = album_processing && filter->skip; filter->has_track_gain = FALSE; filter->has_track_peak = FALSE; if (album_finished) { filter->ignore_tags = FALSE; filter->skip = FALSE; filter->has_album_gain = FALSE; filter->has_album_peak = FALSE; } else if (!album_skipping) { filter->skip = FALSE; } /* We might have just fully processed a track because it has * incomplete tags. If we do album processing and allow skipping * (not forced), prevent switching to skipping if a later track with * full tags comes along: */ if (!filter->forced && album_processing && !album_finished) filter->ignore_tags = TRUE; if (!filter->skip) { GstTagList *tag_list = NULL; gboolean track_success; gboolean album_success = FALSE; track_success = gst_rg_analysis_track_result (filter, &tag_list); if (album_finished) album_success = gst_rg_analysis_album_result (filter, &tag_list); else if (!album_processing) rg_analysis_reset_album (filter->ctx); if (track_success || album_success) { GST_LOG_OBJECT (filter, "posting tag list with results"); gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_REFERENCE_LEVEL, filter->reference_level, NULL); /* This steals our reference to the list: */ gst_element_found_tags_for_pad (GST_ELEMENT (filter), GST_BASE_TRANSFORM_SRC_PAD (GST_BASE_TRANSFORM (filter)), tag_list); } } if (album_processing) { filter->num_tracks--; if (!album_finished) { GST_DEBUG_OBJECT (filter, "album not finished yet (num-tracks is now %u)", filter->num_tracks); } else { GST_DEBUG_OBJECT (filter, "album finished (num-tracks is now 0)"); } } if (album_processing) g_object_notify (G_OBJECT (filter), "num-tracks"); } static gboolean gst_rg_analysis_track_result (GstRgAnalysis * filter, GstTagList ** tag_list) { gboolean track_success; gdouble track_gain, track_peak; track_success = rg_analysis_track_result (filter->ctx, &track_gain, &track_peak); if (track_success) { track_gain += filter->reference_level - RG_REFERENCE_LEVEL; GST_INFO_OBJECT (filter, "track gain is %+.2f dB, peak %.6f", track_gain, track_peak); } else { GST_INFO_OBJECT (filter, "track was too short to analyze"); } if (track_success) { if (*tag_list == NULL) *tag_list = gst_tag_list_new (); gst_tag_list_add (*tag_list, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_PEAK, track_peak, GST_TAG_TRACK_GAIN, track_gain, NULL); } return track_success; } static gboolean gst_rg_analysis_album_result (GstRgAnalysis * filter, GstTagList ** tag_list) { gboolean album_success; gdouble album_gain, album_peak; album_success = rg_analysis_album_result (filter->ctx, &album_gain, &album_peak); if (album_success) { album_gain += filter->reference_level - RG_REFERENCE_LEVEL; GST_INFO_OBJECT (filter, "album gain is %+.2f dB, peak %.6f", album_gain, album_peak); } else { GST_INFO_OBJECT (filter, "album was too short to analyze"); } if (album_success) { if (*tag_list == NULL) *tag_list = gst_tag_list_new (); gst_tag_list_add (*tag_list, GST_TAG_MERGE_APPEND, GST_TAG_ALBUM_PEAK, album_peak, GST_TAG_ALBUM_GAIN, album_gain, NULL); } return album_success; } gst-plugins-good-0.10.31/gst/replaygain/Makefile.am0000644000175000017500000000226311671175354017000 00000000000000plugin_LTLIBRARIES = libgstreplaygain.la libgstreplaygain_la_SOURCES = \ gstrganalysis.c \ gstrglimiter.c \ gstrgvolume.c \ replaygain.c \ rganalysis.c libgstreplaygain_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstreplaygain_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10 \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstreplaygain_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstreplaygain_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = \ gstrganalysis.h \ gstrglimiter.h \ gstrgvolume.h \ replaygain.h \ rganalysis.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstreplaygain -:SHARED libgstreplaygain \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstreplaygain_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstreplaygain_la_CFLAGS) \ -:LDFLAGS $(libgstreplaygain_la_LDFLAGS) \ $(libgstreplaygain_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/replaygain/rganalysis.c0000644000175000017500000006403111671175354017265 00000000000000/* GStreamer ReplayGain analysis * * Copyright (C) 2006 Rene Stadler * Copyright (C) 2001 David Robinson * Glen Sawyer * * rganalysis.c: Analyze raw audio data in accordance with ReplayGain * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /* Based on code with Copyright (C) 2001 David Robinson * and Glen Sawyer , * which is distributed under the LGPL as part of the vorbisgain * program. The original code also mentions Frank Klemm * (http://www.uni-jena.de/~pfk/mpp/) for having contributed lots of * good code. Specifically, this is based on the file * "gain_analysis.c" from vorbisgain version 0.34. */ /* Room for future improvement: Mono data is currently in fact copied * to two channels which get processed normally. This means that mono * input data is processed twice. */ /* Helpful information for understanding this code: The two IIR * filters depend on previous input _and_ previous output samples (up * to the filter's order number of samples). This explains the whole * lot of memcpy'ing done in rg_analysis_analyze and why the context * holds so many buffers. */ #include #include #include #include "rganalysis.h" #define YULE_ORDER 10 #define BUTTER_ORDER 2 /* Percentile which is louder than the proposed level: */ #define RMS_PERCENTILE 95 /* Duration of RMS window in milliseconds: */ #define RMS_WINDOW_MSECS 50 /* Histogram array elements per dB: */ #define STEPS_PER_DB 100 /* Histogram upper bound in dB (normal max. values in the wild are * assumed to be around 70, 80 dB): */ #define MAX_DB 120 /* Calibration value: */ #define PINK_REF 64.82 /* 298640883795 */ #define MAX_ORDER MAX (BUTTER_ORDER, YULE_ORDER) #define MAX_SAMPLE_RATE 48000 /* The + 999 has the effect of ceil()ing: */ #define MAX_SAMPLE_WINDOW (guint) \ ((MAX_SAMPLE_RATE * RMS_WINDOW_MSECS + 999) / 1000) /* Analysis result accumulator. */ struct _RgAnalysisAcc { guint32 histogram[STEPS_PER_DB * MAX_DB]; gdouble peak; }; typedef struct _RgAnalysisAcc RgAnalysisAcc; /* Analysis context. */ struct _RgAnalysisCtx { /* Filter buffers for left channel. */ gfloat inprebuf_l[MAX_ORDER * 2]; gfloat *inpre_l; gfloat stepbuf_l[MAX_SAMPLE_WINDOW + MAX_ORDER]; gfloat *step_l; gfloat outbuf_l[MAX_SAMPLE_WINDOW + MAX_ORDER]; gfloat *out_l; /* Filter buffers for right channel. */ gfloat inprebuf_r[MAX_ORDER * 2]; gfloat *inpre_r; gfloat stepbuf_r[MAX_SAMPLE_WINDOW + MAX_ORDER]; gfloat *step_r; gfloat outbuf_r[MAX_SAMPLE_WINDOW + MAX_ORDER]; gfloat *out_r; /* Number of samples to reach duration of the RMS window: */ guint window_n_samples; /* Progress of the running window: */ guint window_n_samples_done; gdouble window_square_sum; gint sample_rate; gint sample_rate_index; RgAnalysisAcc track; RgAnalysisAcc album; void (*post_message) (gpointer analysis, GstClockTime timestamp, GstClockTime duration, gdouble rglevel); gpointer analysis; /* The timestamp of the current incoming buffer. */ GstClockTime buffer_timestamp; /* Number of samples processed in current buffer, during emit_signal, this will always be on an RMS window boundary. */ guint buffer_n_samples_done; }; /* Filter coefficients for the IIR filters that form the equal * loudness filter. XFilter[ctx->sample_rate_index] gives the array * of the X coefficients (A or B) for the configured sample rate. */ #ifdef _MSC_VER /* Disable double-to-float warning: */ /* A better solution would be to append 'f' to each constant, but that * makes the code ugly. */ #pragma warning ( disable : 4305 ) #endif static const gfloat AYule[9][11] = { {1., -3.84664617118067, 7.81501653005538, -11.34170355132042, 13.05504219327545, -12.28759895145294, 9.48293806319790, -5.87257861775999, 2.75465861874613, -0.86984376593551, 0.13919314567432}, {1., -3.47845948550071, 6.36317777566148, -8.54751527471874, 9.47693607801280, -8.81498681370155, 6.85401540936998, -4.39470996079559, 2.19611684890774, -0.75104302451432, 0.13149317958808}, {1., -2.37898834973084, 2.84868151156327, -2.64577170229825, 2.23697657451713, -1.67148153367602, 1.00595954808547, -0.45953458054983, 0.16378164858596, -0.05032077717131, 0.02347897407020}, {1., -1.61273165137247, 1.07977492259970, -0.25656257754070, -0.16276719120440, -0.22638893773906, 0.39120800788284, -0.22138138954925, 0.04500235387352, 0.02005851806501, 0.00302439095741}, {1., -1.49858979367799, 0.87350271418188, 0.12205022308084, -0.80774944671438, 0.47854794562326, -0.12453458140019, -0.04067510197014, 0.08333755284107, -0.04237348025746, 0.02977207319925}, {1., -0.62820619233671, 0.29661783706366, -0.37256372942400, 0.00213767857124, -0.42029820170918, 0.22199650564824, 0.00613424350682, 0.06747620744683, 0.05784820375801, 0.03222754072173}, {1., -1.04800335126349, 0.29156311971249, -0.26806001042947, 0.00819999645858, 0.45054734505008, -0.33032403314006, 0.06739368333110, -0.04784254229033, 0.01639907836189, 0.01807364323573}, {1., -0.51035327095184, -0.31863563325245, -0.20256413484477, 0.14728154134330, 0.38952639978999, -0.23313271880868, -0.05246019024463, -0.02505961724053, 0.02442357316099, 0.01818801111503}, {1., -0.25049871956020, -0.43193942311114, -0.03424681017675, -0.04678328784242, 0.26408300200955, 0.15113130533216, -0.17556493366449, -0.18823009262115, 0.05477720428674, 0.04704409688120} }; static const gfloat BYule[9][11] = { {0.03857599435200, -0.02160367184185, -0.00123395316851, -0.00009291677959, -0.01655260341619, 0.02161526843274, -0.02074045215285, 0.00594298065125, 0.00306428023191, 0.00012025322027, 0.00288463683916}, {0.05418656406430, -0.02911007808948, -0.00848709379851, -0.00851165645469, -0.00834990904936, 0.02245293253339, -0.02596338512915, 0.01624864962975, -0.00240879051584, 0.00674613682247, -0.00187763777362}, {0.15457299681924, -0.09331049056315, -0.06247880153653, 0.02163541888798, -0.05588393329856, 0.04781476674921, 0.00222312597743, 0.03174092540049, -0.01390589421898, 0.00651420667831, -0.00881362733839}, {0.30296907319327, -0.22613988682123, -0.08587323730772, 0.03282930172664, -0.00915702933434, -0.02364141202522, -0.00584456039913, 0.06276101321749, -0.00000828086748, 0.00205861885564, -0.02950134983287}, {0.33642304856132, -0.25572241425570, -0.11828570177555, 0.11921148675203, -0.07834489609479, -0.00469977914380, -0.00589500224440, 0.05724228140351, 0.00832043980773, -0.01635381384540, -0.01760176568150}, {0.44915256608450, -0.14351757464547, -0.22784394429749, -0.01419140100551, 0.04078262797139, -0.12398163381748, 0.04097565135648, 0.10478503600251, -0.01863887810927, -0.03193428438915, 0.00541907748707}, {0.56619470757641, -0.75464456939302, 0.16242137742230, 0.16744243493672, -0.18901604199609, 0.30931782841830, -0.27562961986224, 0.00647310677246, 0.08647503780351, -0.03788984554840, -0.00588215443421}, {0.58100494960553, -0.53174909058578, -0.14289799034253, 0.17520704835522, 0.02377945217615, 0.15558449135573, -0.25344790059353, 0.01628462406333, 0.06920467763959, -0.03721611395801, -0.00749618797172}, {0.53648789255105, -0.42163034350696, -0.00275953611929, 0.04267842219415, -0.10214864179676, 0.14590772289388, -0.02459864859345, -0.11202315195388, -0.04060034127000, 0.04788665548180, -0.02217936801134} }; static const gfloat AButter[9][3] = { {1., -1.97223372919527, 0.97261396931306}, {1., -1.96977855582618, 0.97022847566350}, {1., -1.95835380975398, 0.95920349965459}, {1., -1.95002759149878, 0.95124613669835}, {1., -1.94561023566527, 0.94705070426118}, {1., -1.92783286977036, 0.93034775234268}, {1., -1.91858953033784, 0.92177618768381}, {1., -1.91542108074780, 0.91885558323625}, {1., -1.88903307939452, 0.89487434461664} }; static const gfloat BButter[9][3] = { {0.98621192462708, -1.97242384925416, 0.98621192462708}, {0.98500175787242, -1.97000351574484, 0.98500175787242}, {0.97938932735214, -1.95877865470428, 0.97938932735214}, {0.97531843204928, -1.95063686409857, 0.97531843204928}, {0.97316523498161, -1.94633046996323, 0.97316523498161}, {0.96454515552826, -1.92909031105652, 0.96454515552826}, {0.96009142950541, -1.92018285901082, 0.96009142950541}, {0.95856916599601, -1.91713833199203, 0.95856916599601}, {0.94597685600279, -1.89195371200558, 0.94597685600279} }; #ifdef _MSC_VER #pragma warning ( default : 4305 ) #endif /* Filter functions. These access elements with negative indices of * the input and output arrays (up to the filter's order). */ /* For much better performance, the function below has been * implemented by unrolling the inner loop for our two use cases. */ /* * static inline void * apply_filter (const gfloat * input, gfloat * output, guint n_samples, * const gfloat * a, const gfloat * b, guint order) * { * gfloat y; * gint i, k; * * for (i = 0; i < n_samples; i++) { * y = input[i] * b[0]; * for (k = 1; k <= order; k++) * y += input[i - k] * b[k] - output[i - k] * a[k]; * output[i] = y; * } * } */ static inline void yule_filter (const gfloat * input, gfloat * output, const gfloat * a, const gfloat * b) { /* 1e-10 is added below to avoid running into denormals when operating on * near silence. */ output[0] = 1e-10 + input[0] * b[0] + input[-1] * b[1] - output[-1] * a[1] + input[-2] * b[2] - output[-2] * a[2] + input[-3] * b[3] - output[-3] * a[3] + input[-4] * b[4] - output[-4] * a[4] + input[-5] * b[5] - output[-5] * a[5] + input[-6] * b[6] - output[-6] * a[6] + input[-7] * b[7] - output[-7] * a[7] + input[-8] * b[8] - output[-8] * a[8] + input[-9] * b[9] - output[-9] * a[9] + input[-10] * b[10] - output[-10] * a[10]; } static inline void butter_filter (const gfloat * input, gfloat * output, const gfloat * a, const gfloat * b) { output[0] = input[0] * b[0] + input[-1] * b[1] - output[-1] * a[1] + input[-2] * b[2] - output[-2] * a[2]; } /* Because butter_filter and yule_filter are inlined, this function is * a bit blown-up (code-size wise), but not inlining gives a ca. 40% * performance penalty. */ static inline void apply_filters (const RgAnalysisCtx * ctx, const gfloat * input_l, const gfloat * input_r, guint n_samples) { const gfloat *ayule = AYule[ctx->sample_rate_index]; const gfloat *byule = BYule[ctx->sample_rate_index]; const gfloat *abutter = AButter[ctx->sample_rate_index]; const gfloat *bbutter = BButter[ctx->sample_rate_index]; gint pos = ctx->window_n_samples_done; gint i; for (i = 0; i < n_samples; i++, pos++) { yule_filter (input_l + i, ctx->step_l + pos, ayule, byule); butter_filter (ctx->step_l + pos, ctx->out_l + pos, abutter, bbutter); yule_filter (input_r + i, ctx->step_r + pos, ayule, byule); butter_filter (ctx->step_r + pos, ctx->out_r + pos, abutter, bbutter); } } /* Clear filter buffer state and current RMS window. */ static void reset_filters (RgAnalysisCtx * ctx) { gint i; for (i = 0; i < MAX_ORDER; i++) { ctx->inprebuf_l[i] = 0.; ctx->stepbuf_l[i] = 0.; ctx->outbuf_l[i] = 0.; ctx->inprebuf_r[i] = 0.; ctx->stepbuf_r[i] = 0.; ctx->outbuf_r[i] = 0.; } ctx->window_square_sum = 0.; ctx->window_n_samples_done = 0; } /* Accumulator functions. */ /* Add two accumulators in-place. The sum is defined as the result of * the vector sum of the histogram array and the maximum value of the * peak field. Thus "adding" the accumulators for all tracks yields * the correct result for obtaining the album gain and peak. */ static void accumulator_add (RgAnalysisAcc * acc, const RgAnalysisAcc * acc_other) { gint i; for (i = 0; i < G_N_ELEMENTS (acc->histogram); i++) acc->histogram[i] += acc_other->histogram[i]; acc->peak = MAX (acc->peak, acc_other->peak); } /* Reset an accumulator to zero. */ static void accumulator_clear (RgAnalysisAcc * acc) { memset (acc->histogram, 0, sizeof (acc->histogram)); acc->peak = 0.; } /* Obtain final analysis result from an accumulator. Returns TRUE on * success, FALSE on error (if accumulator is still zero). */ static gboolean accumulator_result (const RgAnalysisAcc * acc, gdouble * result_gain, gdouble * result_peak) { guint32 sum = 0; guint32 upper; guint i; for (i = 0; i < G_N_ELEMENTS (acc->histogram); i++) sum += acc->histogram[i]; if (sum == 0) /* All entries are 0: We got less than 50ms of data. */ return FALSE; upper = (guint32) ceil (sum * (1. - (gdouble) (RMS_PERCENTILE / 100.))); for (i = G_N_ELEMENTS (acc->histogram); i--;) { if (upper <= acc->histogram[i]) break; upper -= acc->histogram[i]; } if (result_peak != NULL) *result_peak = acc->peak; if (result_gain != NULL) *result_gain = PINK_REF - (gdouble) i / STEPS_PER_DB; return TRUE; } /* Functions that operate on contexts, for external usage. */ /* Create a new context. Before it can be used, a sample rate must be * configured using rg_analysis_set_sample_rate. */ RgAnalysisCtx * rg_analysis_new (void) { RgAnalysisCtx *ctx; ctx = g_new (RgAnalysisCtx, 1); ctx->inpre_l = ctx->inprebuf_l + MAX_ORDER; ctx->step_l = ctx->stepbuf_l + MAX_ORDER; ctx->out_l = ctx->outbuf_l + MAX_ORDER; ctx->inpre_r = ctx->inprebuf_r + MAX_ORDER; ctx->step_r = ctx->stepbuf_r + MAX_ORDER; ctx->out_r = ctx->outbuf_r + MAX_ORDER; ctx->sample_rate = 0; accumulator_clear (&ctx->track); accumulator_clear (&ctx->album); return ctx; } static void reset_silence_detection (RgAnalysisCtx * ctx) { ctx->buffer_timestamp = GST_CLOCK_TIME_NONE; ctx->buffer_n_samples_done = 0; } /* Adapt to given sample rate. Does nothing if already the current * rate (returns TRUE then). Returns FALSE only if given sample rate * is not supported. If the configured rate changes, the last * unprocessed incomplete 50ms chunk of data is dropped because the * filters are reset. */ gboolean rg_analysis_set_sample_rate (RgAnalysisCtx * ctx, gint sample_rate) { g_return_val_if_fail (ctx != NULL, FALSE); if (ctx->sample_rate == sample_rate) return TRUE; switch (sample_rate) { case 48000: ctx->sample_rate_index = 0; break; case 44100: ctx->sample_rate_index = 1; break; case 32000: ctx->sample_rate_index = 2; break; case 24000: ctx->sample_rate_index = 3; break; case 22050: ctx->sample_rate_index = 4; break; case 16000: ctx->sample_rate_index = 5; break; case 12000: ctx->sample_rate_index = 6; break; case 11025: ctx->sample_rate_index = 7; break; case 8000: ctx->sample_rate_index = 8; break; default: return FALSE; } ctx->sample_rate = sample_rate; /* The + 999 has the effect of ceil()ing: */ ctx->window_n_samples = (guint) ((sample_rate * RMS_WINDOW_MSECS + 999) / 1000); reset_filters (ctx); reset_silence_detection (ctx); return TRUE; } void rg_analysis_init_silence_detection (RgAnalysisCtx * ctx, void (*post_message) (gpointer analysis, GstClockTime timestamp, GstClockTime duration, gdouble rglevel), gpointer analysis) { ctx->post_message = post_message; ctx->analysis = analysis; reset_silence_detection (ctx); } void rg_analysis_start_buffer (RgAnalysisCtx * ctx, GstClockTime buffer_timestamp) { ctx->buffer_timestamp = buffer_timestamp; ctx->buffer_n_samples_done = 0; } void rg_analysis_destroy (RgAnalysisCtx * ctx) { g_free (ctx); } /* Entry points for analyzing sample data in common raw data formats. * The stereo format functions expect interleaved frames. It is * possible to pass data in different formats for the same context, * there are no restrictions. All functions have the same signature; * the depth argument for the float functions is not variable and must * be given the value 32. */ void rg_analysis_analyze_mono_float (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth) { gfloat conv_samples[512]; const gfloat *samples = (gfloat *) data; guint n_samples = size / sizeof (gfloat); gint i; g_return_if_fail (depth == 32); g_return_if_fail (size % sizeof (gfloat) == 0); while (n_samples) { gint n = MIN (n_samples, G_N_ELEMENTS (conv_samples)); n_samples -= n; memcpy (conv_samples, samples, n * sizeof (gfloat)); for (i = 0; i < n; i++) { ctx->track.peak = MAX (ctx->track.peak, fabs (conv_samples[i])); conv_samples[i] *= 32768.; } samples += n; rg_analysis_analyze (ctx, conv_samples, NULL, n); } } void rg_analysis_analyze_stereo_float (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth) { gfloat conv_samples_l[256]; gfloat conv_samples_r[256]; const gfloat *samples = (gfloat *) data; guint n_frames = size / (sizeof (gfloat) * 2); gint i; g_return_if_fail (depth == 32); g_return_if_fail (size % (sizeof (gfloat) * 2) == 0); while (n_frames) { gint n = MIN (n_frames, G_N_ELEMENTS (conv_samples_l)); n_frames -= n; for (i = 0; i < n; i++) { gfloat old_sample; old_sample = samples[2 * i]; ctx->track.peak = MAX (ctx->track.peak, fabs (old_sample)); conv_samples_l[i] = old_sample * 32768.; old_sample = samples[2 * i + 1]; ctx->track.peak = MAX (ctx->track.peak, fabs (old_sample)); conv_samples_r[i] = old_sample * 32768.; } samples += 2 * n; rg_analysis_analyze (ctx, conv_samples_l, conv_samples_r, n); } } void rg_analysis_analyze_mono_int16 (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth) { gfloat conv_samples[512]; gint32 peak_sample = 0; const gint16 *samples = (gint16 *) data; guint n_samples = size / sizeof (gint16); gint shift = sizeof (gint16) * 8 - depth; gint i; g_return_if_fail (depth <= (sizeof (gint16) * 8)); g_return_if_fail (size % sizeof (gint16) == 0); while (n_samples) { gint n = MIN (n_samples, G_N_ELEMENTS (conv_samples)); n_samples -= n; for (i = 0; i < n; i++) { gint16 old_sample = samples[i] << shift; peak_sample = MAX (peak_sample, ABS ((gint32) old_sample)); conv_samples[i] = (gfloat) old_sample; } samples += n; rg_analysis_analyze (ctx, conv_samples, NULL, n); } ctx->track.peak = MAX (ctx->track.peak, (gdouble) peak_sample / ((gdouble) (1u << 15))); } void rg_analysis_analyze_stereo_int16 (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth) { gfloat conv_samples_l[256]; gfloat conv_samples_r[256]; gint32 peak_sample = 0; const gint16 *samples = (gint16 *) data; guint n_frames = size / (sizeof (gint16) * 2); gint shift = sizeof (gint16) * 8 - depth; gint i; g_return_if_fail (depth <= (sizeof (gint16) * 8)); g_return_if_fail (size % (sizeof (gint16) * 2) == 0); while (n_frames) { gint n = MIN (n_frames, G_N_ELEMENTS (conv_samples_l)); n_frames -= n; for (i = 0; i < n; i++) { gint16 old_sample; old_sample = samples[2 * i] << shift; peak_sample = MAX (peak_sample, ABS ((gint32) old_sample)); conv_samples_l[i] = (gfloat) old_sample; old_sample = samples[2 * i + 1] << shift; peak_sample = MAX (peak_sample, ABS ((gint32) old_sample)); conv_samples_r[i] = (gfloat) old_sample; } samples += 2 * n; rg_analysis_analyze (ctx, conv_samples_l, conv_samples_r, n); } ctx->track.peak = MAX (ctx->track.peak, (gdouble) peak_sample / ((gdouble) (1u << 15))); } /* Analyze the given chunk of samples. The sample data is given in * floating point format but should be scaled such that the values * +/-32768.0 correspond to the -0dBFS reference amplitude. * * samples_l: Buffer with sample data for the left channel or of the * mono channel. * * samples_r: Buffer with sample data for the right channel or NULL * for mono. * * n_samples: Number of samples passed in each buffer. */ void rg_analysis_analyze (RgAnalysisCtx * ctx, const gfloat * samples_l, const gfloat * samples_r, guint n_samples) { const gfloat *input_l, *input_r; guint n_samples_done; gint i; g_return_if_fail (ctx != NULL); g_return_if_fail (samples_l != NULL); g_return_if_fail (ctx->sample_rate != 0); if (n_samples == 0) return; if (samples_r == NULL) /* Mono. */ samples_r = samples_l; memcpy (ctx->inpre_l, samples_l, MIN (n_samples, MAX_ORDER) * sizeof (gfloat)); memcpy (ctx->inpre_r, samples_r, MIN (n_samples, MAX_ORDER) * sizeof (gfloat)); n_samples_done = 0; while (n_samples_done < n_samples) { /* Limit number of samples to be processed in this iteration to * the number needed to complete the next window: */ guint n_samples_current = MIN (n_samples - n_samples_done, ctx->window_n_samples - ctx->window_n_samples_done); if (n_samples_done < MAX_ORDER) { input_l = ctx->inpre_l + n_samples_done; input_r = ctx->inpre_r + n_samples_done; n_samples_current = MIN (n_samples_current, MAX_ORDER - n_samples_done); } else { input_l = samples_l + n_samples_done; input_r = samples_r + n_samples_done; } apply_filters (ctx, input_l, input_r, n_samples_current); /* Update the square sum. */ for (i = 0; i < n_samples_current; i++) ctx->window_square_sum += ctx->out_l[ctx->window_n_samples_done + i] * ctx->out_l[ctx->window_n_samples_done + i] + ctx->out_r[ctx->window_n_samples_done + i] * ctx->out_r[ctx->window_n_samples_done + i]; ctx->window_n_samples_done += n_samples_current; ctx->buffer_n_samples_done += n_samples_current; g_return_if_fail (ctx->window_n_samples_done <= ctx->window_n_samples); if (ctx->window_n_samples_done == ctx->window_n_samples) { /* Get the Root Mean Square (RMS) for this set of samples. */ gdouble val = STEPS_PER_DB * 10. * log10 (ctx->window_square_sum / ctx->window_n_samples * 0.5 + 1.e-37); gint ival = CLAMP ((gint) val, 0, (gint) G_N_ELEMENTS (ctx->track.histogram) - 1); /* Compute the per-window gain */ const gdouble gain = PINK_REF - (gdouble) ival / STEPS_PER_DB; const GstClockTime timestamp = ctx->buffer_timestamp + gst_util_uint64_scale_int_ceil (GST_SECOND, ctx->buffer_n_samples_done, ctx->sample_rate) - RMS_WINDOW_MSECS * GST_MSECOND; ctx->post_message (ctx->analysis, timestamp, RMS_WINDOW_MSECS * GST_MSECOND, -gain); ctx->track.histogram[ival]++; ctx->window_square_sum = 0.; ctx->window_n_samples_done = 0; /* No need for memmove here, the areas never overlap: Even for * the smallest sample rate, the number of samples needed for * the window is greater than MAX_ORDER. */ memcpy (ctx->stepbuf_l, ctx->stepbuf_l + ctx->window_n_samples, MAX_ORDER * sizeof (gfloat)); memcpy (ctx->outbuf_l, ctx->outbuf_l + ctx->window_n_samples, MAX_ORDER * sizeof (gfloat)); memcpy (ctx->stepbuf_r, ctx->stepbuf_r + ctx->window_n_samples, MAX_ORDER * sizeof (gfloat)); memcpy (ctx->outbuf_r, ctx->outbuf_r + ctx->window_n_samples, MAX_ORDER * sizeof (gfloat)); } n_samples_done += n_samples_current; } if (n_samples >= MAX_ORDER) { memcpy (ctx->inprebuf_l, samples_l + n_samples - MAX_ORDER, MAX_ORDER * sizeof (gfloat)); memcpy (ctx->inprebuf_r, samples_r + n_samples - MAX_ORDER, MAX_ORDER * sizeof (gfloat)); } else { memmove (ctx->inprebuf_l, ctx->inprebuf_l + n_samples, (MAX_ORDER - n_samples) * sizeof (gfloat)); memcpy (ctx->inprebuf_l + MAX_ORDER - n_samples, samples_l, n_samples * sizeof (gfloat)); memmove (ctx->inprebuf_r, ctx->inprebuf_r + n_samples, (MAX_ORDER - n_samples) * sizeof (gfloat)); memcpy (ctx->inprebuf_r + MAX_ORDER - n_samples, samples_r, n_samples * sizeof (gfloat)); } } /* Obtain track gain and peak. Returns TRUE on success. Can fail if * not enough samples have been processed. Updates album accumulator. * Resets track accumulator. */ gboolean rg_analysis_track_result (RgAnalysisCtx * ctx, gdouble * gain, gdouble * peak) { gboolean result; g_return_val_if_fail (ctx != NULL, FALSE); accumulator_add (&ctx->album, &ctx->track); result = accumulator_result (&ctx->track, gain, peak); accumulator_clear (&ctx->track); reset_filters (ctx); reset_silence_detection (ctx); return result; } /* Obtain album gain and peak. Returns TRUE on success. Can fail if * not enough samples have been processed. Resets album * accumulator. */ gboolean rg_analysis_album_result (RgAnalysisCtx * ctx, gdouble * gain, gdouble * peak) { gboolean result; g_return_val_if_fail (ctx != NULL, FALSE); result = accumulator_result (&ctx->album, gain, peak); accumulator_clear (&ctx->album); return result; } void rg_analysis_reset_album (RgAnalysisCtx * ctx) { accumulator_clear (&ctx->album); } /* Reset internal buffers as well as track and album accumulators. * Configured sample rate is kept intact. */ void rg_analysis_reset (RgAnalysisCtx * ctx) { g_return_if_fail (ctx != NULL); reset_filters (ctx); accumulator_clear (&ctx->track); accumulator_clear (&ctx->album); reset_silence_detection (ctx); } gst-plugins-good-0.10.31/gst/replaygain/replaygain.h0000644000175000017500000000240411671175354017245 00000000000000/* GStreamer ReplayGain plugin * * Copyright (C) 2006 Rene Stadler * * replaygain.h: Plugin providing ReplayGain related elements * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __REPLAYGAIN_H__ #define __REPLAYGAIN_H__ G_BEGIN_DECLS /* Reference level (in dBSPL). The 2001 proposal specifies 83. This was * changed later in all implementations to 89, which is the new, offical value: * David Robinson acknowledged the change but didn't update the website yet. */ #define RG_REFERENCE_LEVEL 89. G_END_DECLS #endif /* __REPLAYGAIN_H__ */ gst-plugins-good-0.10.31/gst/replaygain/gstrganalysis.h0000644000175000017500000000450211671175354020005 00000000000000/* GStreamer ReplayGain analysis * * Copyright (C) 2006 Rene Stadler * * gstrganalysis.h: Element that performs the ReplayGain analysis * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __GST_RG_ANALYSIS_H__ #define __GST_RG_ANALYSIS_H__ #include #include #include "rganalysis.h" G_BEGIN_DECLS #define GST_TYPE_RG_ANALYSIS \ (gst_rg_analysis_get_type()) #define GST_RG_ANALYSIS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RG_ANALYSIS,GstRgAnalysis)) #define GST_RG_ANALYSIS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RG_ANALYSIS,GstRgAnalysisClass)) #define GST_IS_RG_ANALYSIS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RG_ANALYSIS)) #define GST_IS_RG_ANALYSIS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RG_ANALYSIS)) typedef struct _GstRgAnalysis GstRgAnalysis; typedef struct _GstRgAnalysisClass GstRgAnalysisClass; /** * GstRgAnalysis: * * Opaque data structure. */ struct _GstRgAnalysis { GstBaseTransform element; /*< private >*/ RgAnalysisCtx *ctx; void (*analyze) (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth); gint depth; /* Property values. */ guint num_tracks; gdouble reference_level; gboolean forced; gboolean message; /* State machinery for skipping. */ gboolean ignore_tags; gboolean skip; gboolean has_track_gain; gboolean has_track_peak; gboolean has_album_gain; gboolean has_album_peak; }; struct _GstRgAnalysisClass { GstBaseTransformClass parent_class; }; GType gst_rg_analysis_get_type (void); G_END_DECLS #endif /* __GST_RG_ANALYSIS_H__ */ gst-plugins-good-0.10.31/gst/replaygain/rganalysis.h0000644000175000017500000000477411671175354017302 00000000000000/* GStreamer ReplayGain analysis * * Copyright (C) 2006 Rene Stadler * Copyright (C) 2001 David Robinson * Glen Sawyer * * rganalysis.h: Analyze raw audio data in accordance with ReplayGain * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __RG_ANALYSIS_H__ #define __RG_ANALYSIS_H__ #include #include G_BEGIN_DECLS typedef struct _RgAnalysisCtx RgAnalysisCtx; RgAnalysisCtx *rg_analysis_new (void); gboolean rg_analysis_set_sample_rate (RgAnalysisCtx * ctx, gint sample_rate); void rg_analysis_analyze_mono_float (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth); void rg_analysis_analyze_stereo_float (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth); void rg_analysis_analyze_mono_int16 (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth); void rg_analysis_analyze_stereo_int16 (RgAnalysisCtx * ctx, gconstpointer data, gsize size, guint depth); void rg_analysis_analyze (RgAnalysisCtx * ctx, const gfloat * samples_l, const gfloat * samples_r, guint n_samples); gboolean rg_analysis_track_result (RgAnalysisCtx * ctx, gdouble * gain, gdouble * peak); gboolean rg_analysis_album_result (RgAnalysisCtx * ctx, gdouble * gain, gdouble * peak); void rg_analysis_init_silence_detection ( RgAnalysisCtx * ctx, void (*post_message) (gpointer analysis, GstClockTime timestamp, GstClockTime duration, gdouble rglevel), gpointer analysis); void rg_analysis_start_buffer (RgAnalysisCtx * ctx, GstClockTime buffer_timestamp); void rg_analysis_reset_album (RgAnalysisCtx * ctx); void rg_analysis_reset (RgAnalysisCtx * ctx); void rg_analysis_destroy (RgAnalysisCtx * ctx); G_END_DECLS #endif /* __RG_ANALYSIS_H__ */ gst-plugins-good-0.10.31/gst/replaygain/gstrglimiter.c0000644000175000017500000001351211677341656017631 00000000000000/* GStreamer ReplayGain limiter * * Copyright (C) 2007 Rene Stadler * * gstrglimiter.c: Element to apply signal compression to raw audio data * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * SECTION:element-rglimiter * @see_also: #GstRgVolume * * This element applies signal compression/limiting to raw audio data. It * performs strict hard limiting with soft-knee characteristics, using a * threshold of -6 dB. This type of filter is mentioned in the proposed ReplayGain standard. * * * Example launch line * |[ * gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \ * ! rgvolume pre-amp=6.0 headroom=10.0 ! rglimiter \ * ! audioconvert ! audioresample ! alsasink * ]|Playback of a file * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "gstrglimiter.h" GST_DEBUG_CATEGORY_STATIC (gst_rg_limiter_debug); #define GST_CAT_DEFAULT gst_rg_limiter_debug enum { PROP_0, PROP_ENABLED, }; static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, channels = (int) [1, MAX], " "rate = (int) [1, MAX], endianness = (int) BYTE_ORDER")); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "width = (int) 32, channels = (int) [1, MAX], " "rate = (int) [1, MAX], endianness = (int) BYTE_ORDER")); GST_BOILERPLATE (GstRgLimiter, gst_rg_limiter, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_rg_limiter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rg_limiter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_rg_limiter_transform_ip (GstBaseTransform * base, GstBuffer * buf); static void gst_rg_limiter_base_init (gpointer g_class) { GstElementClass *element_class = g_class; gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "ReplayGain limiter", "Filter/Effect/Audio", "Apply signal compression to raw audio data", "Ren\xc3\xa9 Stadler "); GST_DEBUG_CATEGORY_INIT (gst_rg_limiter_debug, "rglimiter", 0, "ReplayGain limiter element"); } static void gst_rg_limiter_class_init (GstRgLimiterClass * klass) { GObjectClass *gobject_class; GstBaseTransformClass *trans_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_rg_limiter_set_property; gobject_class->get_property = gst_rg_limiter_get_property; g_object_class_install_property (gobject_class, PROP_ENABLED, g_param_spec_boolean ("enabled", "Enabled", "Enable processing", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class = GST_BASE_TRANSFORM_CLASS (klass); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_rg_limiter_transform_ip); trans_class->passthrough_on_same_caps = FALSE; } static void gst_rg_limiter_init (GstRgLimiter * filter, GstRgLimiterClass * gclass) { GstBaseTransform *base = GST_BASE_TRANSFORM (filter); gst_base_transform_set_passthrough (base, FALSE); gst_base_transform_set_gap_aware (base, TRUE); filter->enabled = TRUE; } static void gst_rg_limiter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRgLimiter *filter = GST_RG_LIMITER (object); switch (prop_id) { case PROP_ENABLED: filter->enabled = g_value_get_boolean (value); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), !filter->enabled); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rg_limiter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRgLimiter *filter = GST_RG_LIMITER (object); switch (prop_id) { case PROP_ENABLED: g_value_set_boolean (value, filter->enabled); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } #define LIMIT 1.0 #define THRES 0.5 /* ca. -6 dB */ #define COMPL 0.5 /* LIMIT - THRESH */ static GstFlowReturn gst_rg_limiter_transform_ip (GstBaseTransform * base, GstBuffer * buf) { GstRgLimiter *filter = GST_RG_LIMITER (base); gfloat *input; guint count; guint i; if (!filter->enabled) return GST_FLOW_OK; if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP)) return GST_FLOW_OK; input = (gfloat *) GST_BUFFER_DATA (buf); count = GST_BUFFER_SIZE (buf) / sizeof (gfloat); for (i = count; i--;) { if (*input > THRES) *input = tanhf ((*input - THRES) / COMPL) * COMPL + THRES; else if (*input < -THRES) *input = tanhf ((*input + THRES) / COMPL) * COMPL - THRES; input++; } return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/replaygain/gstrglimiter.h0000644000175000017500000000354511671175354017635 00000000000000/* GStreamer ReplayGain limiter * * Copyright (C) 2007 Rene Stadler * * gstrglimiter.h: Element to apply signal compression to raw audio data * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __GST_RG_LIMITER_H__ #define __GST_RG_LIMITER_H__ #include #include #define GST_TYPE_RG_LIMITER \ (gst_rg_limiter_get_type()) #define GST_RG_LIMITER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RG_LIMITER,GstRgLimiter)) #define GST_RG_LIMITER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RG_LIMITER,GstRgLimiterClass)) #define GST_IS_RG_LIMITER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RG_LIMITER)) #define GST_IS_RG_LIMITER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RG_LIMITER)) typedef struct _GstRgLimiter GstRgLimiter; typedef struct _GstRgLimiterClass GstRgLimiterClass; /** * GstRgLimiter: * * Opaque data structure. */ struct _GstRgLimiter { GstBaseTransform element; /*< private >*/ gboolean enabled; }; struct _GstRgLimiterClass { GstBaseTransformClass parent_class; }; GType gst_rg_limiter_get_type (void); #endif /* __GST_RG_LIMITER_H__ */ gst-plugins-good-0.10.31/gst/replaygain/Makefile.in0000644000175000017500000010174711720560234017006 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/replaygain DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstreplaygain_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstreplaygain_la_OBJECTS = libgstreplaygain_la-gstrganalysis.lo \ libgstreplaygain_la-gstrglimiter.lo \ libgstreplaygain_la-gstrgvolume.lo \ libgstreplaygain_la-replaygain.lo \ libgstreplaygain_la-rganalysis.lo libgstreplaygain_la_OBJECTS = $(am_libgstreplaygain_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstreplaygain_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) \ $(libgstreplaygain_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstreplaygain_la_SOURCES) DIST_SOURCES = $(libgstreplaygain_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstreplaygain.la libgstreplaygain_la_SOURCES = \ gstrganalysis.c \ gstrglimiter.c \ gstrgvolume.c \ replaygain.c \ rganalysis.c libgstreplaygain_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstreplaygain_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10 \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstreplaygain_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstreplaygain_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = \ gstrganalysis.h \ gstrglimiter.h \ gstrgvolume.h \ replaygain.h \ rganalysis.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/replaygain/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/replaygain/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstreplaygain.la: $(libgstreplaygain_la_OBJECTS) $(libgstreplaygain_la_DEPENDENCIES) $(EXTRA_libgstreplaygain_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstreplaygain_la_LINK) -rpath $(plugindir) $(libgstreplaygain_la_OBJECTS) $(libgstreplaygain_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-gstrganalysis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-gstrglimiter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-gstrgvolume.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-replaygain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreplaygain_la-rganalysis.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstreplaygain_la-gstrganalysis.lo: gstrganalysis.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-gstrganalysis.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-gstrganalysis.Tpo -c -o libgstreplaygain_la-gstrganalysis.lo `test -f 'gstrganalysis.c' || echo '$(srcdir)/'`gstrganalysis.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-gstrganalysis.Tpo $(DEPDIR)/libgstreplaygain_la-gstrganalysis.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrganalysis.c' object='libgstreplaygain_la-gstrganalysis.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-gstrganalysis.lo `test -f 'gstrganalysis.c' || echo '$(srcdir)/'`gstrganalysis.c libgstreplaygain_la-gstrglimiter.lo: gstrglimiter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-gstrglimiter.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-gstrglimiter.Tpo -c -o libgstreplaygain_la-gstrglimiter.lo `test -f 'gstrglimiter.c' || echo '$(srcdir)/'`gstrglimiter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-gstrglimiter.Tpo $(DEPDIR)/libgstreplaygain_la-gstrglimiter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrglimiter.c' object='libgstreplaygain_la-gstrglimiter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-gstrglimiter.lo `test -f 'gstrglimiter.c' || echo '$(srcdir)/'`gstrglimiter.c libgstreplaygain_la-gstrgvolume.lo: gstrgvolume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-gstrgvolume.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-gstrgvolume.Tpo -c -o libgstreplaygain_la-gstrgvolume.lo `test -f 'gstrgvolume.c' || echo '$(srcdir)/'`gstrgvolume.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-gstrgvolume.Tpo $(DEPDIR)/libgstreplaygain_la-gstrgvolume.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrgvolume.c' object='libgstreplaygain_la-gstrgvolume.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-gstrgvolume.lo `test -f 'gstrgvolume.c' || echo '$(srcdir)/'`gstrgvolume.c libgstreplaygain_la-replaygain.lo: replaygain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-replaygain.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-replaygain.Tpo -c -o libgstreplaygain_la-replaygain.lo `test -f 'replaygain.c' || echo '$(srcdir)/'`replaygain.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-replaygain.Tpo $(DEPDIR)/libgstreplaygain_la-replaygain.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='replaygain.c' object='libgstreplaygain_la-replaygain.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-replaygain.lo `test -f 'replaygain.c' || echo '$(srcdir)/'`replaygain.c libgstreplaygain_la-rganalysis.lo: rganalysis.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -MT libgstreplaygain_la-rganalysis.lo -MD -MP -MF $(DEPDIR)/libgstreplaygain_la-rganalysis.Tpo -c -o libgstreplaygain_la-rganalysis.lo `test -f 'rganalysis.c' || echo '$(srcdir)/'`rganalysis.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreplaygain_la-rganalysis.Tpo $(DEPDIR)/libgstreplaygain_la-rganalysis.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rganalysis.c' object='libgstreplaygain_la-rganalysis.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstreplaygain_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreplaygain_la_CFLAGS) $(CFLAGS) -c -o libgstreplaygain_la-rganalysis.lo `test -f 'rganalysis.c' || echo '$(srcdir)/'`rganalysis.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstreplaygain -:SHARED libgstreplaygain \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstreplaygain_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstreplaygain_la_CFLAGS) \ -:LDFLAGS $(libgstreplaygain_la_LDFLAGS) \ $(libgstreplaygain_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/replaygain/gstrgvolume.c0000644000175000017500000006017311677341656017500 00000000000000/* GStreamer ReplayGain volume adjustment * * Copyright (C) 2007 Rene Stadler * * gstrgvolume.c: Element to apply ReplayGain volume adjustment * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * SECTION:element-rgvolume * @see_also: #GstRgLimiter, #GstRgAnalysis * * This element applies volume changes to streams as lined out in the proposed * ReplayGain standard. It * interprets the ReplayGain meta data tags and carries out the adjustment (by * using a volume element internally). The relevant tags are: * * #GST_TAG_TRACK_GAIN * #GST_TAG_TRACK_PEAK * #GST_TAG_ALBUM_GAIN * #GST_TAG_ALBUM_PEAK * #GST_TAG_REFERENCE_LEVEL * * The information carried by these tags must have been calculated beforehand by * performing the ReplayGain analysis. This is implemented by the rganalysis element. * * The signal compression/limiting recommendations outlined in the proposed * standard are not implemented by this element. This has to be handled by * separate elements because applications might want to have additional filters * between the volume adjustment and the limiting stage. A basic limiter is * included with this plugin: The rglimiter * element applies -6 dB hard limiting as mentioned in the ReplayGain standard. * * * Example launch line * |[ * gst-launch filesrc location=filename.ext ! decodebin ! audioconvert \ * ! rgvolume ! audioconvert ! audioresample ! alsasink * ]| Playback of a file * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "gstrgvolume.h" #include "replaygain.h" GST_DEBUG_CATEGORY_STATIC (gst_rg_volume_debug); #define GST_CAT_DEFAULT gst_rg_volume_debug enum { PROP_0, PROP_ALBUM_MODE, PROP_HEADROOM, PROP_PRE_AMP, PROP_FALLBACK_GAIN, PROP_TARGET_GAIN, PROP_RESULT_GAIN }; #define DEFAULT_ALBUM_MODE TRUE #define DEFAULT_HEADROOM 0.0 #define DEFAULT_PRE_AMP 0.0 #define DEFAULT_FALLBACK_GAIN 0.0 #define DB_TO_LINEAR(x) pow (10., (x) / 20.) #define LINEAR_TO_DB(x) (20. * log10 (x)) #define GAIN_FORMAT "+.02f dB" #define PEAK_FORMAT ".06f" #define VALID_GAIN(x) ((x) > -60.00 && (x) < 60.00) #define VALID_PEAK(x) ((x) > 0.) /* Same template caps as GstVolume, for I don't like having just ANY caps. */ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 32; " "audio/x-raw-int, " "channels = (int) [ 1, MAX ], " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE")); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 32; " "audio/x-raw-int, " "channels = (int) [ 1, MAX ], " "rate = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (bool) TRUE")); GST_BOILERPLATE (GstRgVolume, gst_rg_volume, GstBin, GST_TYPE_BIN); static void gst_rg_volume_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rg_volume_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rg_volume_dispose (GObject * object); static GstStateChangeReturn gst_rg_volume_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rg_volume_sink_event (GstPad * pad, GstEvent * event); static GstEvent *gst_rg_volume_tag_event (GstRgVolume * self, GstEvent * event); static void gst_rg_volume_reset (GstRgVolume * self); static void gst_rg_volume_update_gain (GstRgVolume * self); static inline void gst_rg_volume_determine_gain (GstRgVolume * self, gdouble * target_gain, gdouble * result_gain); static void gst_rg_volume_base_init (gpointer g_class) { GstElementClass *element_class = g_class; gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "ReplayGain volume", "Filter/Effect/Audio", "Apply ReplayGain volume adjustment", "Ren\xc3\xa9 Stadler "); GST_DEBUG_CATEGORY_INIT (gst_rg_volume_debug, "rgvolume", 0, "ReplayGain volume element"); } static void gst_rg_volume_class_init (GstRgVolumeClass * klass) { GObjectClass *gobject_class; GstElementClass *element_class; GstBinClass *bin_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_rg_volume_set_property; gobject_class->get_property = gst_rg_volume_get_property; gobject_class->dispose = gst_rg_volume_dispose; /** * GstRgVolume:album-mode: * * Whether to prefer album gain over track gain. * * If set to %TRUE, use album gain instead of track gain if both are * available. This keeps the relative loudness levels of tracks from the same * album intact. * * If set to %FALSE, track mode is used instead. This effectively leads to * more extensive normalization. * * If album mode is enabled but the album gain tag is absent in the stream, * the track gain is used instead. If both gain tags are missing, the value * of the fallback-gain * property is used instead. */ g_object_class_install_property (gobject_class, PROP_ALBUM_MODE, g_param_spec_boolean ("album-mode", "Album mode", "Prefer album over track gain", DEFAULT_ALBUM_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRgVolume:headroom: * * Extra headroom [dB]. This controls the amount by which the output can * exceed digital full scale. * * Only set this to a value greater than 0.0 if signal compression/limiting of * a suitable form is applied to the output (or output is brought into the * correct range by some other transformation). * * This element internally uses a volume element, which also supports * operating on integer audio formats. These formats do not allow exceeding * digital full scale. If extra headroom is used, make sure that the raw * audio data format is floating point (audio/x-raw-float). Otherwise, * clipping distortion might be introduced as part of the volume adjustment * itself. */ g_object_class_install_property (gobject_class, PROP_HEADROOM, g_param_spec_double ("headroom", "Headroom", "Extra headroom [dB]", 0., 60., DEFAULT_HEADROOM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRgVolume:pre-amp: * * Additional gain to apply globally [dB]. This controls the trade-off * between uniformity of normalization and utilization of available dynamic * range. * * Note that the default value is 0 dB because the ReplayGain reference value * was adjusted by +6 dB (from 83 to 89 dB). At the time of this writing, the * webpage is still outdated and * does not reflect this change however. Where the original proposal states * that a proper default pre-amp value is +6 dB, this translates to the used 0 * dB. */ g_object_class_install_property (gobject_class, PROP_PRE_AMP, g_param_spec_double ("pre-amp", "Pre-amp", "Extra gain [dB]", -60., 60., DEFAULT_PRE_AMP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRgVolume:fallback-gain: * * Fallback gain [dB] for streams missing ReplayGain tags. */ g_object_class_install_property (gobject_class, PROP_FALLBACK_GAIN, g_param_spec_double ("fallback-gain", "Fallback gain", "Gain for streams missing tags [dB]", -60., 60., DEFAULT_FALLBACK_GAIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRgVolume:result-gain: * * Applied gain [dB]. This gain is applied to processed buffer data. * * This is set to the target * gain if amplification by that amount can be applied safely. * "Safely" means that the volume adjustment does not inflict clipping * distortion. Should this not be the case, the result gain is set to an * appropriately reduced value (by applying peak normalization). The proposed * standard calls this "clipping prevention". * * The difference between target and result gain reflects the necessary amount * of reduction. Applications can make use of this information to temporarily * reduce the pre-amp for * subsequent streams, as recommended by the ReplayGain standard. * * Note that target and result gain differing for a great majority of streams * indicates a problem: What happens in this case is that most streams receive * peak normalization instead of amplification by the ideal replay gain. To * prevent this, the pre-amp has * to be lowered and/or a limiter has to be used which facilitates the use of * headroom. */ g_object_class_install_property (gobject_class, PROP_RESULT_GAIN, g_param_spec_double ("result-gain", "Result-gain", "Applied gain [dB]", -120., 120., 0., G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * GstRgVolume:target-gain: * * Applicable gain [dB]. This gain is supposed to be applied. * * Depending on the value of the album-mode property and the * presence of ReplayGain tags in the stream, this is set according to one of * these simple formulas: * * * pre-amp + album gain * of the stream * pre-amp + track gain * of the stream * pre-amp + fallback gain * */ g_object_class_install_property (gobject_class, PROP_TARGET_GAIN, g_param_spec_double ("target-gain", "Target-gain", "Applicable gain [dB]", -120., 120., 0., G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); element_class = (GstElementClass *) klass; element_class->change_state = GST_DEBUG_FUNCPTR (gst_rg_volume_change_state); bin_class = (GstBinClass *) klass; /* Setting these to NULL makes gst_bin_add and _remove refuse to let anyone * mess with our internals. */ bin_class->add_element = NULL; bin_class->remove_element = NULL; } static void gst_rg_volume_init (GstRgVolume * self, GstRgVolumeClass * gclass) { GObjectClass *volume_class; GstPad *volume_pad, *ghost_pad; self->album_mode = DEFAULT_ALBUM_MODE; self->headroom = DEFAULT_HEADROOM; self->pre_amp = DEFAULT_PRE_AMP; self->fallback_gain = DEFAULT_FALLBACK_GAIN; self->target_gain = 0.0; self->result_gain = 0.0; self->volume_element = gst_element_factory_make ("volume", "rgvolume-volume"); if (G_UNLIKELY (self->volume_element == NULL)) { GstMessage *msg; GST_WARNING_OBJECT (self, "could not create volume element"); msg = gst_missing_element_message_new (GST_ELEMENT_CAST (self), "volume"); gst_element_post_message (GST_ELEMENT_CAST (self), msg); /* Nothing else to do, we will refuse the state change from NULL to READY to * indicate that something went very wrong. It is doubtful that someone * attempts changing our state though, since we end up having no pads! */ return; } volume_class = G_OBJECT_GET_CLASS (G_OBJECT (self->volume_element)); self->max_volume = G_PARAM_SPEC_DOUBLE (g_object_class_find_property (volume_class, "volume"))->maximum; GST_BIN_CLASS (parent_class)->add_element (GST_BIN_CAST (self), self->volume_element); volume_pad = gst_element_get_static_pad (self->volume_element, "sink"); ghost_pad = gst_ghost_pad_new_from_template ("sink", volume_pad, gst_pad_get_pad_template (volume_pad)); gst_object_unref (volume_pad); gst_pad_set_event_function (ghost_pad, gst_rg_volume_sink_event); gst_element_add_pad (GST_ELEMENT_CAST (self), ghost_pad); volume_pad = gst_element_get_static_pad (self->volume_element, "src"); ghost_pad = gst_ghost_pad_new_from_template ("src", volume_pad, gst_pad_get_pad_template (volume_pad)); gst_object_unref (volume_pad); gst_element_add_pad (GST_ELEMENT_CAST (self), ghost_pad); } static void gst_rg_volume_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRgVolume *self = GST_RG_VOLUME (object); switch (prop_id) { case PROP_ALBUM_MODE: self->album_mode = g_value_get_boolean (value); break; case PROP_HEADROOM: self->headroom = g_value_get_double (value); break; case PROP_PRE_AMP: self->pre_amp = g_value_get_double (value); break; case PROP_FALLBACK_GAIN: self->fallback_gain = g_value_get_double (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } gst_rg_volume_update_gain (self); } static void gst_rg_volume_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRgVolume *self = GST_RG_VOLUME (object); switch (prop_id) { case PROP_ALBUM_MODE: g_value_set_boolean (value, self->album_mode); break; case PROP_HEADROOM: g_value_set_double (value, self->headroom); break; case PROP_PRE_AMP: g_value_set_double (value, self->pre_amp); break; case PROP_FALLBACK_GAIN: g_value_set_double (value, self->fallback_gain); break; case PROP_TARGET_GAIN: g_value_set_double (value, self->target_gain); break; case PROP_RESULT_GAIN: g_value_set_double (value, self->result_gain); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rg_volume_dispose (GObject * object) { GstRgVolume *self = GST_RG_VOLUME (object); if (self->volume_element != NULL) { /* Manually remove our child using the bin implementation of remove_element. * This is needed because we prevent gst_bin_remove from working, which the * parent dispose handler would use if we had any children left. */ GST_BIN_CLASS (parent_class)->remove_element (GST_BIN_CAST (self), self->volume_element); self->volume_element = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static GstStateChangeReturn gst_rg_volume_change_state (GstElement * element, GstStateChange transition) { GstRgVolume *self = GST_RG_VOLUME (element); GstStateChangeReturn res; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (G_UNLIKELY (self->volume_element == NULL)) { /* Creating our child volume element in _init failed. */ return GST_STATE_CHANGE_FAILURE; } break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rg_volume_reset (self); break; default: break; } res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return res; } /* Event function for the ghost sink pad. */ static gboolean gst_rg_volume_sink_event (GstPad * pad, GstEvent * event) { GstRgVolume *self; GstPad *volume_sink_pad; GstEvent *send_event = event; gboolean res; self = GST_RG_VOLUME (gst_pad_get_parent_element (pad)); volume_sink_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG: GST_LOG_OBJECT (self, "received tag event"); send_event = gst_rg_volume_tag_event (self, event); if (send_event == NULL) GST_LOG_OBJECT (self, "all tags handled, dropping event"); break; case GST_EVENT_EOS: gst_rg_volume_reset (self); break; default: break; } if (G_LIKELY (send_event != NULL)) res = gst_pad_send_event (volume_sink_pad, send_event); else res = TRUE; gst_object_unref (volume_sink_pad); gst_object_unref (self); return res; } static GstEvent * gst_rg_volume_tag_event (GstRgVolume * self, GstEvent * event) { GstTagList *tag_list; gboolean has_track_gain, has_track_peak, has_album_gain, has_album_peak; gboolean has_ref_level; g_return_val_if_fail (event != NULL, NULL); g_return_val_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_TAG, event); gst_event_parse_tag (event, &tag_list); if (gst_tag_list_is_empty (tag_list)) return event; has_track_gain = gst_tag_list_get_double (tag_list, GST_TAG_TRACK_GAIN, &self->track_gain); has_track_peak = gst_tag_list_get_double (tag_list, GST_TAG_TRACK_PEAK, &self->track_peak); has_album_gain = gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_GAIN, &self->album_gain); has_album_peak = gst_tag_list_get_double (tag_list, GST_TAG_ALBUM_PEAK, &self->album_peak); has_ref_level = gst_tag_list_get_double (tag_list, GST_TAG_REFERENCE_LEVEL, &self->reference_level); if (!has_track_gain && !has_track_peak && !has_album_gain && !has_album_peak) return event; if (has_ref_level && (has_track_gain || has_album_gain) && (ABS (self->reference_level - RG_REFERENCE_LEVEL) > 1.e-6)) { /* Log a message stating the amount of adjustment that is applied below. */ GST_DEBUG_OBJECT (self, "compensating for reference level difference by %" GAIN_FORMAT, RG_REFERENCE_LEVEL - self->reference_level); } if (has_track_gain) { self->track_gain += RG_REFERENCE_LEVEL - self->reference_level; } if (has_album_gain) { self->album_gain += RG_REFERENCE_LEVEL - self->reference_level; } /* Ignore values that are obviously invalid. */ if (G_UNLIKELY (has_track_gain && !VALID_GAIN (self->track_gain))) { GST_DEBUG_OBJECT (self, "ignoring bogus track gain value %" GAIN_FORMAT, self->track_gain); has_track_gain = FALSE; } if (G_UNLIKELY (has_track_peak && !VALID_PEAK (self->track_peak))) { GST_DEBUG_OBJECT (self, "ignoring bogus track peak value %" PEAK_FORMAT, self->track_peak); has_track_peak = FALSE; } if (G_UNLIKELY (has_album_gain && !VALID_GAIN (self->album_gain))) { GST_DEBUG_OBJECT (self, "ignoring bogus album gain value %" GAIN_FORMAT, self->album_gain); has_album_gain = FALSE; } if (G_UNLIKELY (has_album_peak && !VALID_PEAK (self->album_peak))) { GST_DEBUG_OBJECT (self, "ignoring bogus album peak value %" PEAK_FORMAT, self->album_peak); has_album_peak = FALSE; } /* Clamp peaks >1.0. Float based decoders can produce spurious samples >1.0, * cutting these files back to 1.0 should not cause any audible distortion. * This is most often seen with Vorbis files. */ if (has_track_peak && self->track_peak > 1.) { GST_DEBUG_OBJECT (self, "clamping track peak %" PEAK_FORMAT " to 1.0", self->track_peak); self->track_peak = 1.0; } if (has_album_peak && self->album_peak > 1.) { GST_DEBUG_OBJECT (self, "clamping album peak %" PEAK_FORMAT " to 1.0", self->album_peak); self->album_peak = 1.0; } self->has_track_gain |= has_track_gain; self->has_track_peak |= has_track_peak; self->has_album_gain |= has_album_gain; self->has_album_peak |= has_album_peak; event = (GstEvent *) gst_mini_object_make_writable (GST_MINI_OBJECT (event)); gst_event_parse_tag (event, &tag_list); gst_tag_list_remove_tag (tag_list, GST_TAG_TRACK_GAIN); gst_tag_list_remove_tag (tag_list, GST_TAG_TRACK_PEAK); gst_tag_list_remove_tag (tag_list, GST_TAG_ALBUM_GAIN); gst_tag_list_remove_tag (tag_list, GST_TAG_ALBUM_PEAK); gst_tag_list_remove_tag (tag_list, GST_TAG_REFERENCE_LEVEL); gst_rg_volume_update_gain (self); if (gst_tag_list_is_empty (tag_list)) { gst_event_unref (event); event = NULL; } return event; } static void gst_rg_volume_reset (GstRgVolume * self) { self->has_track_gain = FALSE; self->has_track_peak = FALSE; self->has_album_gain = FALSE; self->has_album_peak = FALSE; self->reference_level = RG_REFERENCE_LEVEL; gst_rg_volume_update_gain (self); } static void gst_rg_volume_update_gain (GstRgVolume * self) { gdouble target_gain, result_gain, result_volume; gboolean target_gain_changed, result_gain_changed; gst_rg_volume_determine_gain (self, &target_gain, &result_gain); result_volume = DB_TO_LINEAR (result_gain); /* Ensure that the result volume is within the range that the volume element * can handle. Currently, the limit is 10. (+20 dB), which should not be * restrictive. */ if (G_UNLIKELY (result_volume > self->max_volume)) { GST_INFO_OBJECT (self, "cannot handle result gain of %" GAIN_FORMAT " (%0.6f), adjusting", result_gain, result_volume); result_volume = self->max_volume; result_gain = LINEAR_TO_DB (result_volume); } /* Direct comparison is OK in this case. */ if (target_gain == result_gain) { GST_INFO_OBJECT (self, "result gain is %" GAIN_FORMAT " (%0.6f), matching target", result_gain, result_volume); } else { GST_INFO_OBJECT (self, "result gain is %" GAIN_FORMAT " (%0.6f), target is %" GAIN_FORMAT, result_gain, result_volume, target_gain); } target_gain_changed = (self->target_gain != target_gain); result_gain_changed = (self->result_gain != result_gain); self->target_gain = target_gain; self->result_gain = result_gain; g_object_set (self->volume_element, "volume", result_volume, NULL); if (target_gain_changed) g_object_notify ((GObject *) self, "target-gain"); if (result_gain_changed) g_object_notify ((GObject *) self, "result-gain"); } static inline void gst_rg_volume_determine_gain (GstRgVolume * self, gdouble * target_gain, gdouble * result_gain) { gdouble gain, peak; if (!self->has_track_gain && !self->has_album_gain) { GST_DEBUG_OBJECT (self, "using fallback gain"); gain = self->fallback_gain; peak = 1.0; } else if ((self->album_mode && self->has_album_gain) || (!self->album_mode && !self->has_track_gain)) { gain = self->album_gain; if (G_LIKELY (self->has_album_peak)) { peak = self->album_peak; } else { GST_DEBUG_OBJECT (self, "album peak missing, assuming 1.0"); peak = 1.0; } /* Falling back from track to album gain shouldn't really happen. */ if (G_UNLIKELY (!self->album_mode)) GST_INFO_OBJECT (self, "falling back to album gain"); } else { /* !album_mode && !has_album_gain || album_mode && has_track_gain */ gain = self->track_gain; if (G_LIKELY (self->has_track_peak)) { peak = self->track_peak; } else { GST_DEBUG_OBJECT (self, "track peak missing, assuming 1.0"); peak = 1.0; } if (self->album_mode) GST_INFO_OBJECT (self, "falling back to track gain"); } gain += self->pre_amp; *target_gain = gain; *result_gain = gain; if (LINEAR_TO_DB (peak) + gain > self->headroom) { *result_gain = LINEAR_TO_DB (1. / peak) + self->headroom; } } gst-plugins-good-0.10.31/gst/replaygain/gstrgvolume.h0000644000175000017500000000426511671175354017477 00000000000000/* GStreamer ReplayGain volume adjustment * * Copyright (C) 2007 Rene Stadler * * gstrgvolume.h: Element to apply ReplayGain volume adjustment * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __GST_RG_VOLUME_H__ #define __GST_RG_VOLUME_H__ #include G_BEGIN_DECLS #define GST_TYPE_RG_VOLUME \ (gst_rg_volume_get_type()) #define GST_RG_VOLUME(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RG_VOLUME,GstRgVolume)) #define GST_RG_VOLUME_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RG_VOLUME,GstRgVolumeClass)) #define GST_IS_RG_VOLUME(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RG_VOLUME)) #define GST_IS_RG_VOLUME_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RG_VOLUME)) typedef struct _GstRgVolume GstRgVolume; typedef struct _GstRgVolumeClass GstRgVolumeClass; /** * GstRgVolume: * * Opaque data structure. */ struct _GstRgVolume { GstBin bin; /*< private >*/ GstElement *volume_element; gdouble max_volume; gboolean album_mode; gdouble headroom; gdouble pre_amp; gdouble fallback_gain; gdouble target_gain; gdouble result_gain; gdouble track_gain; gdouble track_peak; gdouble album_gain; gdouble album_peak; gboolean has_track_gain; gboolean has_track_peak; gboolean has_album_gain; gboolean has_album_peak; gdouble reference_level; }; struct _GstRgVolumeClass { GstBinClass parent_class; }; GType gst_rg_volume_get_type (void); G_END_DECLS #endif /* __GST_RG_VOLUME_H__ */ gst-plugins-good-0.10.31/gst/wavparse/0000755000175000017500000000000011720565315014511 500000000000000gst-plugins-good-0.10.31/gst/wavparse/Makefile.am0000644000175000017500000000200111671175354016463 00000000000000plugin_LTLIBRARIES = libgstwavparse.la libgstwavparse_la_SOURCES = gstwavparse.c libgstwavparse_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstwavparse_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(LIBM) libgstwavparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstwavparse_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstwavparse.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstwavparse -:SHARED libgstwavparse \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstwavparse_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavparse_la_CFLAGS) \ -:LDFLAGS $(libgstwavparse_la_LDFLAGS) \ $(libgstwavparse_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/wavparse/gstwavparse.h0000644000175000017500000000622711671175354017164 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Nokia Corporation, Stefan Kost . * * 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_WAVPARSE_H__ #define __GST_WAVPARSE_H__ #include #include "gst/riff/riff-ids.h" #include "gst/riff/riff-read.h" #include G_BEGIN_DECLS #define GST_TYPE_WAVPARSE \ (gst_wavparse_get_type()) #define GST_WAVPARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVPARSE,GstWavParse)) #define GST_WAVPARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVPARSE,GstWavParseClass)) #define GST_IS_WAVPARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVPARSE)) #define GST_IS_WAVPARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVPARSE)) typedef enum { GST_WAVPARSE_START, GST_WAVPARSE_HEADER, GST_WAVPARSE_DATA } GstWavParseState; typedef struct _GstWavParse GstWavParse; typedef struct _GstWavParseClass GstWavParseClass; /** * GstWavParse: * * Opaque data structure. */ struct _GstWavParse { GstElement parent; /* pads */ GstPad *sinkpad,*srcpad; /* for delayed source pad creation for when * we have the first chunk of data and know * the format for sure */ GstCaps *caps; GstTagList *tags; GstEvent *close_segment; GstEvent *start_segment; /* WAVE decoding state */ GstWavParseState state; gboolean abort_buffering; /* format of audio, see defines below */ gint format; /* useful audio data */ guint16 depth; guint32 rate; guint16 channels; guint16 blockalign; guint16 width; guint32 av_bps; guint32 fact; /* real bps used or 0 when no bitrate is known */ guint32 bps; gboolean vbr; guint bytes_per_sample; guint max_buf_size; /* position in data part */ guint64 offset; guint64 end_offset; guint64 dataleft; /* offset/length of data part */ guint64 datastart; guint64 datasize; /* duration in time */ guint64 duration; /* pending seek */ GstEvent *seek_event; /* For streaming */ GstAdapter *adapter; gboolean got_fmt; gboolean streaming; /* configured segment, start/stop expressed in time */ GstSegment segment; gboolean segment_running; /* for late pad configuration */ gboolean first; /* discont after seek */ gboolean discont; }; struct _GstWavParseClass { GstElementClass parent_class; }; GType gst_wavparse_get_type(void); G_END_DECLS #endif /* __GST_WAVPARSE_H__ */ gst-plugins-good-0.10.31/gst/wavparse/gstwavparse.c0000644000175000017500000023750511677341660017165 00000000000000/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ /* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Nokia Corporation, Stefan Kost . * * 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-wavparse * * Parse a .wav file into raw or compressed audio. * * Wavparse supports both push and pull mode operations, making it possible to * stream from a network source. * * * Example launch line * |[ * gst-launch filesrc location=sine.wav ! wavparse ! audioconvert ! alsasink * ]| Read a wav file and output to the soundcard using the ALSA element. The * wav file is assumed to contain raw uncompressed samples. * |[ * gst-launch gnomevfssrc location=http://www.example.org/sine.wav ! queue ! wavparse ! audioconvert ! alsasink * ]| Stream data from a network url. * * * Last reviewed on 2007-02-14 (0.10.6) */ /* * TODO: * http://replaygain.hydrogenaudio.org/file_format_wav.html */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include "gstwavparse.h" #include "gst/riff/riff-ids.h" #include "gst/riff/riff-media.h" #include #include GST_DEBUG_CATEGORY_STATIC (wavparse_debug); #define GST_CAT_DEFAULT (wavparse_debug) static void gst_wavparse_dispose (GObject * object); static gboolean gst_wavparse_sink_activate (GstPad * sinkpad); static gboolean gst_wavparse_sink_activate_pull (GstPad * sinkpad, gboolean active); static gboolean gst_wavparse_send_event (GstElement * element, GstEvent * event); static GstStateChangeReturn gst_wavparse_change_state (GstElement * element, GstStateChange transition); static const GstQueryType *gst_wavparse_get_query_types (GstPad * pad); static gboolean gst_wavparse_pad_query (GstPad * pad, GstQuery * query); static gboolean gst_wavparse_pad_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); static GstFlowReturn gst_wavparse_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_wavparse_sink_event (GstPad * pad, GstEvent * event); static void gst_wavparse_loop (GstPad * pad); static gboolean gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event); static GstStaticPadTemplate sink_template_factory = GST_STATIC_PAD_TEMPLATE ("wavparse_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wav") ); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (wavparse_debug, "wavparse", 0, "WAV parser"); GST_BOILERPLATE_FULL (GstWavParse, gst_wavparse, GstElement, GST_TYPE_ELEMENT, DEBUG_INIT); static void gst_wavparse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstPadTemplate *src_template; /* register pads */ gst_element_class_add_static_pad_template (element_class, &sink_template_factory); src_template = gst_pad_template_new ("wavparse_src", GST_PAD_SRC, GST_PAD_SOMETIMES, gst_riff_create_audio_template_caps ()); gst_element_class_add_pad_template (element_class, src_template); gst_object_unref (src_template); gst_element_class_set_details_simple (element_class, "WAV audio demuxer", "Codec/Demuxer/Audio", "Parse a .wav file into raw audio", "Erik Walthinsen "); } static void gst_wavparse_class_init (GstWavParseClass * klass) { GstElementClass *gstelement_class; GObjectClass *object_class; gstelement_class = (GstElementClass *) klass; object_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); object_class->dispose = gst_wavparse_dispose; gstelement_class->change_state = gst_wavparse_change_state; gstelement_class->send_event = gst_wavparse_send_event; } static void gst_wavparse_reset (GstWavParse * wav) { wav->state = GST_WAVPARSE_START; /* These will all be set correctly in the fmt chunk */ wav->depth = 0; wav->rate = 0; wav->width = 0; wav->channels = 0; wav->blockalign = 0; wav->bps = 0; wav->fact = 0; wav->offset = 0; wav->end_offset = 0; wav->dataleft = 0; wav->datasize = 0; wav->datastart = 0; wav->duration = 0; wav->got_fmt = FALSE; wav->first = TRUE; if (wav->seek_event) gst_event_unref (wav->seek_event); wav->seek_event = NULL; if (wav->adapter) { gst_adapter_clear (wav->adapter); g_object_unref (wav->adapter); wav->adapter = NULL; } if (wav->tags) gst_tag_list_free (wav->tags); wav->tags = NULL; if (wav->caps) gst_caps_unref (wav->caps); wav->caps = NULL; if (wav->start_segment) gst_event_unref (wav->start_segment); wav->start_segment = NULL; if (wav->close_segment) gst_event_unref (wav->close_segment); wav->close_segment = NULL; } static void gst_wavparse_dispose (GObject * object) { GstWavParse *wav = GST_WAVPARSE (object); GST_DEBUG_OBJECT (wav, "WAV: Dispose"); gst_wavparse_reset (wav); G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_wavparse_init (GstWavParse * wavparse, GstWavParseClass * g_class) { gst_wavparse_reset (wavparse); /* sink */ wavparse->sinkpad = gst_pad_new_from_static_template (&sink_template_factory, "sink"); gst_pad_set_activate_function (wavparse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavparse_sink_activate)); gst_pad_set_activatepull_function (wavparse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavparse_sink_activate_pull)); gst_pad_set_chain_function (wavparse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavparse_chain)); gst_pad_set_event_function (wavparse->sinkpad, GST_DEBUG_FUNCPTR (gst_wavparse_sink_event)); gst_element_add_pad (GST_ELEMENT_CAST (wavparse), wavparse->sinkpad); /* src, will be created later */ wavparse->srcpad = NULL; } static void gst_wavparse_destroy_sourcepad (GstWavParse * wavparse) { if (wavparse->srcpad) { gst_element_remove_pad (GST_ELEMENT_CAST (wavparse), wavparse->srcpad); wavparse->srcpad = NULL; } } static void gst_wavparse_create_sourcepad (GstWavParse * wavparse) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (wavparse); GstPadTemplate *src_template; /* destroy previous one */ gst_wavparse_destroy_sourcepad (wavparse); /* source */ src_template = gst_element_class_get_pad_template (klass, "wavparse_src"); wavparse->srcpad = gst_pad_new_from_template (src_template, "src"); gst_pad_use_fixed_caps (wavparse->srcpad); gst_pad_set_query_type_function (wavparse->srcpad, GST_DEBUG_FUNCPTR (gst_wavparse_get_query_types)); gst_pad_set_query_function (wavparse->srcpad, GST_DEBUG_FUNCPTR (gst_wavparse_pad_query)); gst_pad_set_event_function (wavparse->srcpad, GST_DEBUG_FUNCPTR (gst_wavparse_srcpad_event)); GST_DEBUG_OBJECT (wavparse, "srcpad created"); } /* Compute (value * nom) % denom, avoiding overflow. This can be used * to perform ceiling or rounding division together with * gst_util_uint64_scale[_int]. */ #define uint64_scale_modulo(val, nom, denom) \ ((val % denom) * (nom % denom) % denom) /* Like gst_util_uint64_scale, but performs ceiling division. */ static guint64 uint64_ceiling_scale_int (guint64 val, gint num, gint denom) { guint64 result = gst_util_uint64_scale_int (val, num, denom); if (uint64_scale_modulo (val, num, denom) == 0) return result; else return result + 1; } /* Like gst_util_uint64_scale, but performs ceiling division. */ static guint64 uint64_ceiling_scale (guint64 val, guint64 num, guint64 denom) { guint64 result = gst_util_uint64_scale (val, num, denom); if (uint64_scale_modulo (val, num, denom) == 0) return result; else return result + 1; } /* FIXME: why is that not in use? */ #if 0 static void gst_wavparse_parse_adtl (GstWavParse * wavparse, int len) { guint32 got_bytes; GstByteStream *bs = wavparse->bs; gst_riff_chunk *temp_chunk, chunk; guint8 *tempdata; struct _gst_riff_labl labl, *temp_labl; struct _gst_riff_ltxt ltxt, *temp_ltxt; struct _gst_riff_note note, *temp_note; char *label_name; GstProps *props; GstPropsEntry *entry; GstCaps *new_caps; GList *caps = NULL; props = wavparse->metadata->properties; while (len > 0) { got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk)); if (got_bytes != sizeof (gst_riff_chunk)) { return; } temp_chunk = (gst_riff_chunk *) tempdata; chunk.id = GUINT32_FROM_LE (temp_chunk->id); chunk.size = GUINT32_FROM_LE (temp_chunk->size); if (chunk.size == 0) { gst_bytestream_flush (bs, sizeof (gst_riff_chunk)); len -= sizeof (gst_riff_chunk); continue; } switch (chunk.id) { case GST_RIFF_adtl_labl: got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_labl)); if (got_bytes != sizeof (struct _gst_riff_labl)) { return; } temp_labl = (struct _gst_riff_labl *) tempdata; labl.id = GUINT32_FROM_LE (temp_labl->id); labl.size = GUINT32_FROM_LE (temp_labl->size); labl.identifier = GUINT32_FROM_LE (temp_labl->identifier); gst_bytestream_flush (bs, sizeof (struct _gst_riff_labl)); len -= sizeof (struct _gst_riff_labl); got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, labl.size - 4); if (got_bytes != labl.size - 4) { return; } label_name = (char *) tempdata; gst_bytestream_flush (bs, ((labl.size - 4) + 1) & ~1); len -= (((labl.size - 4) + 1) & ~1); new_caps = gst_caps_new ("label", "application/x-gst-metadata", gst_props_new ("identifier", G_TYPE_INT (labl.identifier), "name", G_TYPE_STRING (label_name), NULL)); if (gst_props_get (props, "labels", &caps, NULL)) { caps = g_list_append (caps, new_caps); } else { caps = g_list_append (NULL, new_caps); entry = gst_props_entry_new ("labels", GST_PROPS_GLIST (caps)); gst_props_add_entry (props, entry); } break; case GST_RIFF_adtl_ltxt: got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_ltxt)); if (got_bytes != sizeof (struct _gst_riff_ltxt)) { return; } temp_ltxt = (struct _gst_riff_ltxt *) tempdata; ltxt.id = GUINT32_FROM_LE (temp_ltxt->id); ltxt.size = GUINT32_FROM_LE (temp_ltxt->size); ltxt.identifier = GUINT32_FROM_LE (temp_ltxt->identifier); ltxt.length = GUINT32_FROM_LE (temp_ltxt->length); ltxt.purpose = GUINT32_FROM_LE (temp_ltxt->purpose); ltxt.country = GUINT16_FROM_LE (temp_ltxt->country); ltxt.language = GUINT16_FROM_LE (temp_ltxt->language); ltxt.dialect = GUINT16_FROM_LE (temp_ltxt->dialect); ltxt.codepage = GUINT16_FROM_LE (temp_ltxt->codepage); gst_bytestream_flush (bs, sizeof (struct _gst_riff_ltxt)); len -= sizeof (struct _gst_riff_ltxt); if (ltxt.size - 20 > 0) { got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, ltxt.size - 20); if (got_bytes != ltxt.size - 20) { return; } gst_bytestream_flush (bs, ((ltxt.size - 20) + 1) & ~1); len -= (((ltxt.size - 20) + 1) & ~1); label_name = (char *) tempdata; } else { label_name = ""; } new_caps = gst_caps_new ("ltxt", "application/x-gst-metadata", gst_props_new ("identifier", G_TYPE_INT (ltxt.identifier), "name", G_TYPE_STRING (label_name), "length", G_TYPE_INT (ltxt.length), NULL)); if (gst_props_get (props, "ltxts", &caps, NULL)) { caps = g_list_append (caps, new_caps); } else { caps = g_list_append (NULL, new_caps); entry = gst_props_entry_new ("ltxts", GST_PROPS_GLIST (caps)); gst_props_add_entry (props, entry); } break; case GST_RIFF_adtl_note: got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_note)); if (got_bytes != sizeof (struct _gst_riff_note)) { return; } temp_note = (struct _gst_riff_note *) tempdata; note.id = GUINT32_FROM_LE (temp_note->id); note.size = GUINT32_FROM_LE (temp_note->size); note.identifier = GUINT32_FROM_LE (temp_note->identifier); gst_bytestream_flush (bs, sizeof (struct _gst_riff_note)); len -= sizeof (struct _gst_riff_note); got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, note.size - 4); if (got_bytes != note.size - 4) { return; } gst_bytestream_flush (bs, ((note.size - 4) + 1) & ~1); len -= (((note.size - 4) + 1) & ~1); label_name = (char *) tempdata; new_caps = gst_caps_new ("note", "application/x-gst-metadata", gst_props_new ("identifier", G_TYPE_INT (note.identifier), "name", G_TYPE_STRING (label_name), NULL)); if (gst_props_get (props, "notes", &caps, NULL)) { caps = g_list_append (caps, new_caps); } else { caps = g_list_append (NULL, new_caps); entry = gst_props_entry_new ("notes", GST_PROPS_GLIST (caps)); gst_props_add_entry (props, entry); } break; default: g_print ("Unknown chunk: %" GST_FOURCC_FORMAT "\n", GST_FOURCC_ARGS (chunk.id)); return; } } g_object_notify (G_OBJECT (wavparse), "metadata"); } static void gst_wavparse_parse_cues (GstWavParse * wavparse, int len) { guint32 got_bytes; GstByteStream *bs = wavparse->bs; struct _gst_riff_cue *temp_cue, cue; struct _gst_riff_cuepoints *points; guint8 *tempdata; int i; GList *cues = NULL; GstPropsEntry *entry; while (len > 0) { int required; got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, sizeof (struct _gst_riff_cue)); temp_cue = (struct _gst_riff_cue *) tempdata; /* fixup for our big endian friends */ cue.id = GUINT32_FROM_LE (temp_cue->id); cue.size = GUINT32_FROM_LE (temp_cue->size); cue.cuepoints = GUINT32_FROM_LE (temp_cue->cuepoints); gst_bytestream_flush (bs, sizeof (struct _gst_riff_cue)); if (got_bytes != sizeof (struct _gst_riff_cue)) { return; } len -= sizeof (struct _gst_riff_cue); /* -4 because cue.size contains the cuepoints size and we've already flushed that out of the system */ required = cue.size - 4; got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, required); gst_bytestream_flush (bs, ((required) + 1) & ~1); if (got_bytes != required) { return; } len -= (((cue.size - 4) + 1) & ~1); /* now we have an array of struct _gst_riff_cuepoints in tempdata */ points = (struct _gst_riff_cuepoints *) tempdata; for (i = 0; i < cue.cuepoints; i++) { GstCaps *caps; caps = gst_caps_new ("cues", "application/x-gst-metadata", gst_props_new ("identifier", G_TYPE_INT (points[i].identifier), "position", G_TYPE_INT (points[i].offset), NULL)); cues = g_list_append (cues, caps); } entry = gst_props_entry_new ("cues", GST_PROPS_GLIST (cues)); gst_props_add_entry (wavparse->metadata->properties, entry); } g_object_notify (G_OBJECT (wavparse), "metadata"); } /* Read 'fmt ' header */ static gboolean gst_wavparse_fmt (GstWavParse * wav) { gst_riff_strf_auds *header = NULL; GstCaps *caps; if (!gst_riff_read_strf_auds (wav, &header)) goto no_fmt; wav->format = header->format; wav->rate = header->rate; wav->channels = header->channels; if (wav->channels == 0) goto no_channels; wav->blockalign = header->blockalign; wav->width = (header->blockalign * 8) / header->channels; wav->depth = header->size; wav->bps = header->av_bps; if (wav->bps <= 0) goto no_bps; /* Note: gst_riff_create_audio_caps might need to fix values in * the header header depending on the format, so call it first */ caps = gst_riff_create_audio_caps (header->format, NULL, header, NULL); g_free (header); if (caps == NULL) goto no_caps; gst_wavparse_create_sourcepad (wav); gst_pad_use_fixed_caps (wav->srcpad); gst_pad_set_active (wav->srcpad, TRUE); gst_pad_set_caps (wav->srcpad, caps); gst_caps_free (caps); gst_element_add_pad (GST_ELEMENT_CAST (wav), wav->srcpad); gst_element_no_more_pads (GST_ELEMENT_CAST (wav)); GST_DEBUG ("frequency %d, channels %d", wav->rate, wav->channels); return TRUE; /* ERRORS */ no_fmt: { GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), ("No FMT tag found")); return FALSE; } no_channels: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims to contain zero channels - invalid data")); g_free (header); return FALSE; } no_bps: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims to bitrate of <= zero - invalid data")); g_free (header); return FALSE; } no_caps: { GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), (NULL)); return FALSE; } } static gboolean gst_wavparse_other (GstWavParse * wav) { guint32 tag, length; if (!gst_riff_peek_head (wav, &tag, &length, NULL)) { GST_WARNING_OBJECT (wav, "could not peek head"); return FALSE; } GST_DEBUG_OBJECT (wav, "got tag (%08x) %4.4s, length %d", tag, (gchar *) & tag, length); switch (tag) { case GST_RIFF_TAG_LIST: if (!(tag = gst_riff_peek_list (wav))) { GST_WARNING_OBJECT (wav, "could not peek list"); return FALSE; } switch (tag) { case GST_RIFF_LIST_INFO: if (!gst_riff_read_list (wav, &tag) || !gst_riff_read_info (wav)) { GST_WARNING_OBJECT (wav, "could not read list"); return FALSE; } break; case GST_RIFF_LIST_adtl: if (!gst_riff_read_skip (wav)) { GST_WARNING_OBJECT (wav, "could not read skip"); return FALSE; } break; default: GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, (gchar *) & tag); if (!gst_riff_read_skip (wav)) { GST_WARNING_OBJECT (wav, "could not read skip"); return FALSE; } break; } break; case GST_RIFF_TAG_data: if (!gst_bytestream_flush (wav->bs, 8)) { GST_WARNING_OBJECT (wav, "could not flush 8 bytes"); return FALSE; } GST_DEBUG_OBJECT (wav, "switching to data mode"); wav->state = GST_WAVPARSE_DATA; wav->datastart = gst_bytestream_tell (wav->bs); if (length == 0) { guint64 file_length; /* length is 0, data probably stretches to the end * of file */ GST_DEBUG_OBJECT (wav, "length is 0 trying to find length"); /* get length of file */ file_length = gst_bytestream_length (wav->bs); if (file_length == -1) { GST_DEBUG_OBJECT (wav, "could not get file length, assuming data to eof"); /* could not get length, assuming till eof */ length = G_MAXUINT32; } if (file_length > G_MAXUINT32) { GST_DEBUG_OBJECT (wav, "file length %" G_GUINT64_FORMAT ", clipping to 32 bits", file_length); /* could not get length, assuming till eof */ length = G_MAXUINT32; } else { GST_DEBUG_OBJECT (wav, "file length %" G_GUINT64_FORMAT ", datalength %u", file_length, length); /* substract offset of datastart from length */ length = file_length - wav->datastart; GST_DEBUG_OBJECT (wav, "datalength %u", length); } } wav->datasize = (guint64) length; GST_DEBUG_OBJECT (wav, "datasize = %ld", length) break; case GST_RIFF_TAG_cue: if (!gst_riff_read_skip (wav)) { GST_WARNING_OBJECT (wav, "could not read skip"); return FALSE; } break; default: GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, (gchar *) & tag); if (!gst_riff_read_skip (wav)) return FALSE; break; } return TRUE; } #endif static gboolean gst_wavparse_parse_file_header (GstElement * element, GstBuffer * buf) { guint32 doctype; if (!gst_riff_parse_file_header (element, buf, &doctype)) return FALSE; if (doctype != GST_RIFF_RIFF_WAVE) goto not_wav; return TRUE; /* ERRORS */ not_wav: { GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), ("File is not a WAVE file: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (doctype))); return FALSE; } } static GstFlowReturn gst_wavparse_stream_init (GstWavParse * wav) { GstFlowReturn res; GstBuffer *buf = NULL; if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset, 12, &buf)) != GST_FLOW_OK) return res; else if (!gst_wavparse_parse_file_header (GST_ELEMENT_CAST (wav), buf)) return GST_FLOW_ERROR; wav->offset += 12; return GST_FLOW_OK; } static gboolean gst_wavparse_time_to_bytepos (GstWavParse * wav, gint64 ts, gint64 * bytepos) { /* -1 always maps to -1 */ if (ts == -1) { *bytepos = -1; return TRUE; } /* 0 always maps to 0 */ if (ts == 0) { *bytepos = 0; return TRUE; } if (wav->bps > 0) { *bytepos = uint64_ceiling_scale (ts, (guint64) wav->bps, GST_SECOND); return TRUE; } else if (wav->fact) { guint64 bps = gst_util_uint64_scale_int (wav->datasize, wav->rate, wav->fact); *bytepos = uint64_ceiling_scale (ts, bps, GST_SECOND); return TRUE; } return FALSE; } /* This function is used to perform seeks on the element. * * It also works when event is NULL, in which case it will just * start from the last configured segment. This technique is * used when activating the element and to perform the seek in * READY. */ static gboolean gst_wavparse_perform_seek (GstWavParse * wav, GstEvent * event) { gboolean res; gdouble rate; GstFormat format, bformat; GstSeekFlags flags; GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; gint64 cur, stop, upstream_size; gboolean flush; gboolean update; GstSegment seeksegment = { 0, }; gint64 last_stop; if (event) { GST_DEBUG_OBJECT (wav, "doing seek with event"); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* no negative rates yet */ if (rate < 0.0) goto negative_rate; if (format != wav->segment.format) { GST_INFO_OBJECT (wav, "converting seek-event from %s to %s", gst_format_get_name (format), gst_format_get_name (wav->segment.format)); res = TRUE; if (cur_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (wav->srcpad, format, cur, &wav->segment.format, &cur); if (res && stop_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (wav->srcpad, format, stop, &wav->segment.format, &stop); if (!res) goto no_format; format = wav->segment.format; } } else { GST_DEBUG_OBJECT (wav, "doing seek without event"); flags = 0; rate = 1.0; cur_type = GST_SEEK_TYPE_SET; stop_type = GST_SEEK_TYPE_SET; } /* in push mode, we must delegate to upstream */ if (wav->streaming) { gboolean res = FALSE; /* if streaming not yet started; only prepare initial newsegment */ if (!event || wav->state != GST_WAVPARSE_DATA) { if (wav->start_segment) gst_event_unref (wav->start_segment); wav->start_segment = gst_event_new_new_segment (FALSE, wav->segment.rate, wav->segment.format, wav->segment.last_stop, wav->segment.duration, wav->segment.last_stop); res = TRUE; } else { /* convert seek positions to byte positions in data sections */ if (format == GST_FORMAT_TIME) { /* should not fail */ if (!gst_wavparse_time_to_bytepos (wav, cur, &cur)) goto no_position; if (!gst_wavparse_time_to_bytepos (wav, stop, &stop)) goto no_position; } /* mind sample boundary and header */ if (cur >= 0) { cur -= (cur % wav->bytes_per_sample); cur += wav->datastart; } if (stop >= 0) { stop -= (stop % wav->bytes_per_sample); stop += wav->datastart; } GST_DEBUG_OBJECT (wav, "Pushing BYTE seek rate %g, " "start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT, rate, cur, stop); /* BYTE seek event */ event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, cur, stop_type, stop); res = gst_pad_push_event (wav->sinkpad, event); } return res; } /* get flush flag */ flush = flags & GST_SEEK_FLAG_FLUSH; /* now we need to make sure the streaming thread is stopped. We do this by * either sending a FLUSH_START event downstream which will cause the * streaming thread to stop with a WRONG_STATE. * For a non-flushing seek we simply pause the task, which will happen as soon * as it completes one iteration (and thus might block when the sink is * blocking in preroll). */ if (flush) { if (wav->srcpad) { GST_DEBUG_OBJECT (wav, "sending flush start"); gst_pad_push_event (wav->srcpad, gst_event_new_flush_start ()); } } else { gst_pad_pause_task (wav->sinkpad); } /* we should now be able to grab the streaming thread because we stopped it * with the above flush/pause code */ GST_PAD_STREAM_LOCK (wav->sinkpad); /* save current position */ last_stop = wav->segment.last_stop; GST_DEBUG_OBJECT (wav, "stopped streaming at %" G_GINT64_FORMAT, last_stop); /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &wav->segment, sizeof (GstSegment)); /* configure the seek parameters in the seeksegment. We will then have the * right values in the segment to perform the seek */ if (event) { GST_DEBUG_OBJECT (wav, "configuring seek"); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); } /* figure out the last position we need to play. If it's configured (stop != * -1), use that, else we play until the total duration of the file */ if ((stop = seeksegment.stop) == -1) stop = seeksegment.duration; GST_DEBUG_OBJECT (wav, "cur_type =%d", cur_type); if ((cur_type != GST_SEEK_TYPE_NONE)) { /* bring offset to bytes, if the bps is 0, we have the segment in BYTES and * we can just copy the last_stop. If not, we use the bps to convert TIME to * bytes. */ if (!gst_wavparse_time_to_bytepos (wav, seeksegment.last_stop, (gint64 *) & wav->offset)) wav->offset = seeksegment.last_stop; GST_LOG_OBJECT (wav, "offset=%" G_GUINT64_FORMAT, wav->offset); wav->offset -= (wav->offset % wav->bytes_per_sample); GST_LOG_OBJECT (wav, "offset=%" G_GUINT64_FORMAT, wav->offset); wav->offset += wav->datastart; GST_LOG_OBJECT (wav, "offset=%" G_GUINT64_FORMAT, wav->offset); } else { GST_LOG_OBJECT (wav, "continue from offset=%" G_GUINT64_FORMAT, wav->offset); } if (stop_type != GST_SEEK_TYPE_NONE) { if (!gst_wavparse_time_to_bytepos (wav, stop, (gint64 *) & wav->end_offset)) wav->end_offset = stop; GST_LOG_OBJECT (wav, "end_offset=%" G_GUINT64_FORMAT, wav->end_offset); wav->end_offset -= (wav->end_offset % wav->bytes_per_sample); GST_LOG_OBJECT (wav, "end_offset=%" G_GUINT64_FORMAT, wav->end_offset); wav->end_offset += wav->datastart; GST_LOG_OBJECT (wav, "end_offset=%" G_GUINT64_FORMAT, wav->end_offset); } else { GST_LOG_OBJECT (wav, "continue to end_offset=%" G_GUINT64_FORMAT, wav->end_offset); } /* make sure filesize is not exceeded due to rounding errors or so, * same precaution as in _stream_headers */ bformat = GST_FORMAT_BYTES; if (gst_pad_query_peer_duration (wav->sinkpad, &bformat, &upstream_size)) wav->end_offset = MIN (wav->end_offset, upstream_size); /* this is the range of bytes we will use for playback */ wav->offset = MIN (wav->offset, wav->end_offset); wav->dataleft = wav->end_offset - wav->offset; GST_DEBUG_OBJECT (wav, "seek: rate %lf, offset %" G_GUINT64_FORMAT ", end %" G_GUINT64_FORMAT ", segment %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, rate, wav->offset, wav->end_offset, GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (stop)); /* prepare for streaming again */ if (wav->srcpad) { if (flush) { /* if we sent a FLUSH_START, we now send a FLUSH_STOP */ GST_DEBUG_OBJECT (wav, "sending flush stop"); gst_pad_push_event (wav->srcpad, gst_event_new_flush_stop ()); } else if (wav->segment_running) { /* we are running the current segment and doing a non-flushing seek, * close the segment first based on the previous last_stop. */ GST_DEBUG_OBJECT (wav, "closing running segment %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, wav->segment.start, wav->segment.last_stop); /* queue the segment for sending in the stream thread */ if (wav->close_segment) gst_event_unref (wav->close_segment); wav->close_segment = gst_event_new_new_segment (TRUE, wav->segment.rate, wav->segment.format, wav->segment.start, wav->segment.last_stop, wav->segment.start); } } /* now we did the seek and can activate the new segment values */ memcpy (&wav->segment, &seeksegment, sizeof (GstSegment)); /* if we're doing a segment seek, post a SEGMENT_START message */ if (wav->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (wav), gst_message_new_segment_start (GST_OBJECT_CAST (wav), wav->segment.format, wav->segment.last_stop)); } /* now create the newsegment */ GST_DEBUG_OBJECT (wav, "Creating newsegment from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, wav->segment.last_stop, stop); /* store the newsegment event so it can be sent from the streaming thread. */ if (wav->start_segment) gst_event_unref (wav->start_segment); wav->start_segment = gst_event_new_new_segment (FALSE, wav->segment.rate, wav->segment.format, wav->segment.last_stop, stop, wav->segment.last_stop); /* mark discont if we are going to stream from another position. */ if (last_stop != wav->segment.last_stop) { GST_DEBUG_OBJECT (wav, "mark DISCONT, we did a seek to another position"); wav->discont = TRUE; } /* and start the streaming task again */ wav->segment_running = TRUE; if (!wav->streaming) { gst_pad_start_task (wav->sinkpad, (GstTaskFunction) gst_wavparse_loop, wav->sinkpad); } GST_PAD_STREAM_UNLOCK (wav->sinkpad); return TRUE; /* ERRORS */ negative_rate: { GST_DEBUG_OBJECT (wav, "negative playback rates are not supported yet."); return FALSE; } no_format: { GST_DEBUG_OBJECT (wav, "unsupported format given, seek aborted."); return FALSE; } no_position: { GST_DEBUG_OBJECT (wav, "Could not determine byte position for desired time"); return FALSE; } } /* * gst_wavparse_peek_chunk_info: * @wav Wavparse object * @tag holder for tag * @size holder for tag size * * Peek next chunk info (tag and size) * * Returns: %TRUE when the chunk info (header) is available */ static gboolean gst_wavparse_peek_chunk_info (GstWavParse * wav, guint32 * tag, guint32 * size) { const guint8 *data = NULL; if (gst_adapter_available (wav->adapter) < 8) return FALSE; data = gst_adapter_peek (wav->adapter, 8); *tag = GST_READ_UINT32_LE (data); *size = GST_READ_UINT32_LE (data + 4); GST_DEBUG ("Next chunk size is %d bytes, type %" GST_FOURCC_FORMAT, *size, GST_FOURCC_ARGS (*tag)); return TRUE; } /* * gst_wavparse_peek_chunk: * @wav Wavparse object * @tag holder for tag * @size holder for tag size * * Peek enough data for one full chunk * * Returns: %TRUE when the full chunk is available */ static gboolean gst_wavparse_peek_chunk (GstWavParse * wav, guint32 * tag, guint32 * size) { guint32 peek_size = 0; guint available; if (!gst_wavparse_peek_chunk_info (wav, tag, size)) return FALSE; /* size 0 -> empty data buffer would surprise most callers, * large size -> do not bother trying to squeeze that into adapter, * so we throw poor man's exception, which can be caught if caller really * wants to handle 0 size chunk */ if (!(*size) || (*size) >= (1 << 30)) { GST_INFO ("Invalid/unexpected chunk size %d for tag %" GST_FOURCC_FORMAT, *size, GST_FOURCC_ARGS (*tag)); /* chain should give up */ wav->abort_buffering = TRUE; return FALSE; } peek_size = (*size + 1) & ~1; available = gst_adapter_available (wav->adapter); if (available >= (8 + peek_size)) { return TRUE; } else { GST_LOG ("but only %u bytes available now", available); return FALSE; } } /* * gst_wavparse_calculate_duration: * @wav: wavparse object * * Calculate duration on demand and store in @wav. Prefer bps, but use fact as a * fallback. * * Returns: %TRUE if duration is available. */ static gboolean gst_wavparse_calculate_duration (GstWavParse * wav) { if (wav->duration > 0) return TRUE; if (wav->bps > 0) { GST_INFO_OBJECT (wav, "Got datasize %" G_GUINT64_FORMAT, wav->datasize); wav->duration = uint64_ceiling_scale (wav->datasize, GST_SECOND, (guint64) wav->bps); GST_INFO_OBJECT (wav, "Got duration (bps) %" GST_TIME_FORMAT, GST_TIME_ARGS (wav->duration)); return TRUE; } else if (wav->fact) { wav->duration = uint64_ceiling_scale_int (GST_SECOND, wav->fact, wav->rate); GST_INFO_OBJECT (wav, "Got duration (fact) %" GST_TIME_FORMAT, GST_TIME_ARGS (wav->duration)); return TRUE; } return FALSE; } static gboolean gst_waveparse_ignore_chunk (GstWavParse * wav, GstBuffer * buf, guint32 tag, guint32 size) { guint flush; if (wav->streaming) { if (!gst_wavparse_peek_chunk (wav, &tag, &size)) return FALSE; } GST_DEBUG_OBJECT (wav, "Ignoring tag %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); flush = 8 + ((size + 1) & ~1); wav->offset += flush; if (wav->streaming) { gst_adapter_flush (wav->adapter, flush); } else { gst_buffer_unref (buf); } return TRUE; } #define MAX_BUFFER_SIZE 4096 static GstFlowReturn gst_wavparse_stream_headers (GstWavParse * wav) { GstFlowReturn res = GST_FLOW_OK; GstBuffer *buf = NULL; gst_riff_strf_auds *header = NULL; guint32 tag, size; gboolean gotdata = FALSE; GstCaps *caps = NULL; gchar *codec_name = NULL; GstEvent **event_p; GstFormat bformat; gint64 upstream_size = 0; /* search for "_fmt" chunk, which should be first */ while (!wav->got_fmt) { GstBuffer *extra; /* The header starts with a 'fmt ' tag */ if (wav->streaming) { if (!gst_wavparse_peek_chunk (wav, &tag, &size)) return res; gst_adapter_flush (wav->adapter, 8); wav->offset += 8; if (size) { buf = gst_adapter_take_buffer (wav->adapter, size); if (size & 1) gst_adapter_flush (wav->adapter, 1); wav->offset += GST_ROUND_UP_2 (size); } else { buf = gst_buffer_new (); } } else { if ((res = gst_riff_read_chunk (GST_ELEMENT_CAST (wav), wav->sinkpad, &wav->offset, &tag, &buf)) != GST_FLOW_OK) return res; } if (tag == GST_RIFF_TAG_JUNK || tag == GST_RIFF_TAG_JUNQ || tag == GST_RIFF_TAG_bext || tag == GST_RIFF_TAG_BEXT || tag == GST_RIFF_TAG_LIST || tag == GST_RIFF_TAG_ID32 || tag == GST_RIFF_TAG_IDVX) { GST_DEBUG_OBJECT (wav, "skipping %" GST_FOURCC_FORMAT " chunk", GST_FOURCC_ARGS (tag)); gst_buffer_unref (buf); buf = NULL; continue; } if (tag != GST_RIFF_TAG_fmt) goto invalid_wav; if (!(gst_riff_parse_strf_auds (GST_ELEMENT_CAST (wav), buf, &header, &extra))) goto parse_header_error; buf = NULL; /* parse_strf_auds() took ownership of buffer */ /* do sanity checks of header fields */ if (header->channels == 0) goto no_channels; if (header->rate == 0) goto no_rate; GST_DEBUG_OBJECT (wav, "creating the caps"); /* Note: gst_riff_create_audio_caps might need to fix values in * the header header depending on the format, so call it first */ caps = gst_riff_create_audio_caps (header->format, NULL, header, extra, NULL, &codec_name); if (extra) gst_buffer_unref (extra); if (!caps) goto unknown_format; /* do more sanity checks of header fields * (these can be sanitized by gst_riff_create_audio_caps() */ wav->format = header->format; wav->rate = header->rate; wav->channels = header->channels; wav->blockalign = header->blockalign; wav->depth = header->size; wav->av_bps = header->av_bps; wav->vbr = FALSE; g_free (header); header = NULL; /* do format specific handling */ switch (wav->format) { case GST_RIFF_WAVE_FORMAT_MPEGL12: case GST_RIFF_WAVE_FORMAT_MPEGL3: { /* Note: workaround for mp2/mp3 embedded in wav, that relies on the * bitrate inside the mpeg stream */ GST_INFO ("resetting bps from %d to 0 for mp2/3", wav->av_bps); wav->bps = 0; break; } case GST_RIFF_WAVE_FORMAT_PCM: if (wav->blockalign > wav->channels * (guint) ceil (wav->depth / 8.0)) goto invalid_blockalign; /* fall through */ default: if (wav->av_bps > wav->blockalign * wav->rate) goto invalid_bps; /* use the configured bps */ wav->bps = wav->av_bps; break; } wav->width = (wav->blockalign * 8) / wav->channels; wav->bytes_per_sample = wav->channels * wav->width / 8; if (wav->bytes_per_sample <= 0) goto no_bytes_per_sample; GST_DEBUG_OBJECT (wav, "blockalign = %u", (guint) wav->blockalign); GST_DEBUG_OBJECT (wav, "width = %u", (guint) wav->width); GST_DEBUG_OBJECT (wav, "depth = %u", (guint) wav->depth); GST_DEBUG_OBJECT (wav, "av_bps = %u", (guint) wav->av_bps); GST_DEBUG_OBJECT (wav, "frequency = %u", (guint) wav->rate); GST_DEBUG_OBJECT (wav, "channels = %u", (guint) wav->channels); GST_DEBUG_OBJECT (wav, "bytes_per_sample = %u", wav->bytes_per_sample); /* bps can be 0 when we don't have a valid bitrate (mostly for compressed * formats). This will make the element output a BYTE format segment and * will not timestamp the outgoing buffers. */ GST_DEBUG_OBJECT (wav, "bps = %u", (guint) wav->bps); GST_DEBUG_OBJECT (wav, "caps = %" GST_PTR_FORMAT, caps); /* create pad later so we can sniff the first few bytes * of the real data and correct our caps if necessary */ gst_caps_replace (&wav->caps, caps); gst_caps_replace (&caps, NULL); wav->got_fmt = TRUE; if (codec_name) { wav->tags = gst_tag_list_new (); gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, codec_name, NULL); g_free (codec_name); codec_name = NULL; } } bformat = GST_FORMAT_BYTES; gst_pad_query_peer_duration (wav->sinkpad, &bformat, &upstream_size); GST_DEBUG_OBJECT (wav, "upstream size %" G_GUINT64_FORMAT, upstream_size); /* loop headers until we get data */ while (!gotdata) { if (wav->streaming) { if (!gst_wavparse_peek_chunk_info (wav, &tag, &size)) goto exit; } else { if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset, 8, &buf)) != GST_FLOW_OK) goto header_read_error; tag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 4); } GST_INFO_OBJECT (wav, "Got TAG: %" GST_FOURCC_FORMAT ", offset %" G_GUINT64_FORMAT, GST_FOURCC_ARGS (tag), wav->offset); /* wav is a st00pid format, we don't know for sure where data starts. * So we have to go bit by bit until we find the 'data' header */ switch (tag) { case GST_RIFF_TAG_data:{ GST_DEBUG_OBJECT (wav, "Got 'data' TAG, size : %d", size); if (wav->streaming) { gst_adapter_flush (wav->adapter, 8); gotdata = TRUE; } else { gst_buffer_unref (buf); } wav->offset += 8; wav->datastart = wav->offset; /* If size is zero, then the data chunk probably actually extends to the end of the file */ if (size == 0 && upstream_size) { size = upstream_size - wav->datastart; } /* Or the file might be truncated */ else if (upstream_size) { size = MIN (size, (upstream_size - wav->datastart)); } wav->datasize = (guint64) size; wav->dataleft = (guint64) size; wav->end_offset = size + wav->datastart; if (!wav->streaming) { /* We will continue parsing tags 'till end */ wav->offset += size; } GST_DEBUG_OBJECT (wav, "datasize = %d", size); break; } case GST_RIFF_TAG_fact:{ if (wav->format != GST_RIFF_WAVE_FORMAT_MPEGL12 && wav->format != GST_RIFF_WAVE_FORMAT_MPEGL3) { const guint data_size = 4; GST_INFO_OBJECT (wav, "Have fact chunk"); if (size < data_size) { if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) { /* need more data */ goto exit; } GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk", data_size, size); break; } /* number of samples (for compressed formats) */ if (wav->streaming) { const guint8 *data = NULL; if (!gst_wavparse_peek_chunk (wav, &tag, &size)) { goto exit; } gst_adapter_flush (wav->adapter, 8); data = gst_adapter_peek (wav->adapter, data_size); wav->fact = GST_READ_UINT32_LE (data); gst_adapter_flush (wav->adapter, GST_ROUND_UP_2 (size)); } else { gst_buffer_unref (buf); if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset + 8, data_size, &buf)) != GST_FLOW_OK) goto header_read_error; wav->fact = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); gst_buffer_unref (buf); } GST_DEBUG_OBJECT (wav, "have fact %u", wav->fact); wav->offset += 8 + GST_ROUND_UP_2 (size); break; } else { if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) { /* need more data */ goto exit; } } break; } case GST_RIFF_TAG_acid:{ const gst_riff_acid *acid = NULL; const guint data_size = sizeof (gst_riff_acid); GST_INFO_OBJECT (wav, "Have acid chunk"); if (size < data_size) { if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) { /* need more data */ goto exit; } GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk", data_size, size); break; } if (wav->streaming) { if (!gst_wavparse_peek_chunk (wav, &tag, &size)) { goto exit; } gst_adapter_flush (wav->adapter, 8); acid = (const gst_riff_acid *) gst_adapter_peek (wav->adapter, data_size); } else { gst_buffer_unref (buf); if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset + 8, size, &buf)) != GST_FLOW_OK) goto header_read_error; acid = (const gst_riff_acid *) GST_BUFFER_DATA (buf); } /* send data as tags */ if (!wav->tags) wav->tags = gst_tag_list_new (); gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, GST_TAG_BEATS_PER_MINUTE, acid->tempo, NULL); size = GST_ROUND_UP_2 (size); if (wav->streaming) { gst_adapter_flush (wav->adapter, size); } else { gst_buffer_unref (buf); } wav->offset += 8 + size; break; } /* FIXME: all list tags after data are ignored in streaming mode */ case GST_RIFF_TAG_LIST:{ guint32 ltag; if (wav->streaming) { const guint8 *data = NULL; if (gst_adapter_available (wav->adapter) < 12) { goto exit; } data = gst_adapter_peek (wav->adapter, 12); ltag = GST_READ_UINT32_LE (data + 8); } else { gst_buffer_unref (buf); if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset, 12, &buf)) != GST_FLOW_OK) goto header_read_error; ltag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 8); } switch (ltag) { case GST_RIFF_LIST_INFO:{ const gint data_size = size - 4; GstTagList *new; GST_INFO_OBJECT (wav, "Have LIST chunk INFO size %u", data_size); if (wav->streaming) { if (!gst_wavparse_peek_chunk (wav, &tag, &size)) { goto exit; } gst_adapter_flush (wav->adapter, 12); wav->offset += 12; if (data_size > 0) { buf = gst_adapter_take_buffer (wav->adapter, data_size); if (data_size & 1) gst_adapter_flush (wav->adapter, 1); } } else { wav->offset += 12; gst_buffer_unref (buf); if (data_size > 0) { if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset, data_size, &buf)) != GST_FLOW_OK) goto header_read_error; } } if (data_size > 0) { /* parse tags */ gst_riff_parse_info (GST_ELEMENT (wav), buf, &new); if (new) { GstTagList *old = wav->tags; wav->tags = gst_tag_list_merge (old, new, GST_TAG_MERGE_REPLACE); if (old) gst_tag_list_free (old); gst_tag_list_free (new); } gst_buffer_unref (buf); wav->offset += GST_ROUND_UP_2 (data_size); } break; } default: GST_INFO_OBJECT (wav, "Ignoring LIST chunk %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (ltag)); if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) /* need more data */ goto exit; break; } break; } default: if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) /* need more data */ goto exit; break; } if (upstream_size && (wav->offset >= upstream_size)) { /* Now we are gone through the whole file */ gotdata = TRUE; } } GST_DEBUG_OBJECT (wav, "Finished parsing headers"); if (wav->bps <= 0 && wav->fact) { #if 0 /* not a good idea, as for embedded mp2/mp3 we set bps to 0 earlier */ wav->bps = (guint32) gst_util_uint64_scale ((guint64) wav->rate, wav->datasize, (guint64) wav->fact); GST_INFO_OBJECT (wav, "calculated bps : %d, enabling VBR", wav->bps); #endif wav->vbr = TRUE; } if (gst_wavparse_calculate_duration (wav)) { gst_segment_init (&wav->segment, GST_FORMAT_TIME); gst_segment_set_duration (&wav->segment, GST_FORMAT_TIME, wav->duration); } else { /* no bitrate, let downstream peer do the math, we'll feed it bytes. */ gst_segment_init (&wav->segment, GST_FORMAT_BYTES); gst_segment_set_duration (&wav->segment, GST_FORMAT_BYTES, wav->datasize); } /* now we have all the info to perform a pending seek if any, if no * event, this will still do the right thing and it will also send * the right newsegment event downstream. */ gst_wavparse_perform_seek (wav, wav->seek_event); /* remove pending event */ event_p = &wav->seek_event; gst_event_replace (event_p, NULL); /* we just started, we are discont */ wav->discont = TRUE; wav->state = GST_WAVPARSE_DATA; /* determine reasonable max buffer size, * that is, buffers not too small either size or time wise * so we do not end up with too many of them */ /* var abuse */ upstream_size = 0; gst_wavparse_time_to_bytepos (wav, 40 * GST_MSECOND, &upstream_size); wav->max_buf_size = upstream_size; wav->max_buf_size = MAX (wav->max_buf_size, MAX_BUFFER_SIZE); if (wav->blockalign > 0) wav->max_buf_size -= (wav->max_buf_size % wav->blockalign); GST_DEBUG_OBJECT (wav, "max buffer size %d", wav->max_buf_size); return GST_FLOW_OK; /* ERROR */ exit: { if (codec_name) g_free (codec_name); if (header) g_free (header); if (caps) gst_caps_unref (caps); return res; } fail: { res = GST_FLOW_ERROR; goto exit; } invalid_wav: { GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), ("Invalid WAV header (no fmt at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); goto fail; } parse_header_error: { GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("Couldn't parse audio header")); goto fail; } no_channels: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims to contain no channels - invalid data")); goto fail; } no_rate: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream with sample_rate == 0 - invalid data")); goto fail; } invalid_blockalign: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims blockalign = %u, which is more than %u - invalid data", wav->blockalign, wav->channels * (guint) ceil (wav->depth / 8.0))); goto fail; } invalid_bps: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Stream claims av_bsp = %u, which is more than %u - invalid data", wav->av_bps, wav->blockalign * wav->rate)); goto fail; } no_bytes_per_sample: { GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL), ("Could not caluclate bytes per sample - invalid data")); goto fail; } unknown_format: { GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), ("No caps found for format 0x%x, %d channels, %d Hz", wav->format, wav->channels, wav->rate)); goto fail; } header_read_error: { GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("Couldn't read in header %d (%s)", res, gst_flow_get_name (res))); goto fail; } } /* * Read WAV file tag when streaming */ static GstFlowReturn gst_wavparse_parse_stream_init (GstWavParse * wav) { if (gst_adapter_available (wav->adapter) >= 12) { GstBuffer *tmp; /* _take flushes the data */ tmp = gst_adapter_take_buffer (wav->adapter, 12); GST_DEBUG ("Parsing wav header"); if (!gst_wavparse_parse_file_header (GST_ELEMENT_CAST (wav), tmp)) return GST_FLOW_ERROR; wav->offset += 12; /* Go to next state */ wav->state = GST_WAVPARSE_HEADER; } return GST_FLOW_OK; } /* handle an event sent directly to the element. * * This event can be sent either in the READY state or the * >READY state. The only event of interest really is the seek * event. * * In the READY state we can only store the event and try to * respect it when going to PAUSED. We assume we are in the * READY state when our parsing state != GST_WAVPARSE_DATA. * * When we are steaming, we can simply perform the seek right * away. */ static gboolean gst_wavparse_send_event (GstElement * element, GstEvent * event) { GstWavParse *wav = GST_WAVPARSE (element); gboolean res = FALSE; GstEvent **event_p; GST_DEBUG_OBJECT (wav, "received event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: if (wav->state == GST_WAVPARSE_DATA) { /* we can handle the seek directly when streaming data */ res = gst_wavparse_perform_seek (wav, event); } else { GST_DEBUG_OBJECT (wav, "queuing seek for later"); event_p = &wav->seek_event; gst_event_replace (event_p, event); /* we always return true */ res = TRUE; } break; default: break; } gst_event_unref (event); return res; } static gboolean gst_wavparse_have_dts_caps (const GstCaps * caps, GstTypeFindProbability prob) { GstStructure *s; s = gst_caps_get_structure (caps, 0); if (!gst_structure_has_name (s, "audio/x-dts")) return FALSE; if (prob >= GST_TYPE_FIND_LIKELY) return TRUE; /* DTS at non-0 offsets and without second sync may yield POSSIBLE .. */ if (prob < GST_TYPE_FIND_POSSIBLE) return FALSE; /* .. in which case we want at least a valid-looking rate and channels */ if (!gst_structure_has_field (s, "channels")) return FALSE; /* and for extra assurance we could also check the rate from the DTS frame * against the one in the wav header, but for now let's not do that */ return gst_structure_has_field (s, "rate"); } static void gst_wavparse_add_src_pad (GstWavParse * wav, GstBuffer * buf) { GstStructure *s; GST_DEBUG_OBJECT (wav, "adding src pad"); if (wav->caps) { s = gst_caps_get_structure (wav->caps, 0); if (s && gst_structure_has_name (s, "audio/x-raw-int") && buf != NULL) { GstTypeFindProbability prob; GstCaps *tf_caps; tf_caps = gst_type_find_helper_for_buffer (GST_OBJECT (wav), buf, &prob); if (tf_caps != NULL) { GST_LOG ("typefind caps = %" GST_PTR_FORMAT ", P=%d", tf_caps, prob); if (gst_wavparse_have_dts_caps (tf_caps, prob)) { GST_INFO_OBJECT (wav, "Found DTS marker in file marked as raw PCM"); gst_caps_unref (wav->caps); wav->caps = tf_caps; gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, "dts", NULL); } else { GST_DEBUG_OBJECT (wav, "found caps %" GST_PTR_FORMAT " for stream " "marked as raw PCM audio, but ignoring for now", tf_caps); gst_caps_unref (tf_caps); } } } } gst_wavparse_create_sourcepad (wav); gst_pad_set_active (wav->srcpad, TRUE); gst_pad_set_caps (wav->srcpad, wav->caps); gst_caps_replace (&wav->caps, NULL); gst_element_add_pad (GST_ELEMENT_CAST (wav), wav->srcpad); gst_element_no_more_pads (GST_ELEMENT_CAST (wav)); if (wav->close_segment) { GST_DEBUG_OBJECT (wav, "Send close segment event on newpad"); gst_pad_push_event (wav->srcpad, wav->close_segment); wav->close_segment = NULL; } if (wav->start_segment) { GST_DEBUG_OBJECT (wav, "Send start segment event on newpad"); gst_pad_push_event (wav->srcpad, wav->start_segment); wav->start_segment = NULL; } if (wav->tags) { gst_element_found_tags_for_pad (GST_ELEMENT_CAST (wav), wav->srcpad, wav->tags); wav->tags = NULL; } } static GstFlowReturn gst_wavparse_stream_data (GstWavParse * wav) { GstBuffer *buf = NULL; GstFlowReturn res = GST_FLOW_OK; guint64 desired, obtained; GstClockTime timestamp, next_timestamp, duration; guint64 pos, nextpos; iterate_adapter: GST_LOG_OBJECT (wav, "offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT " , dataleft: %" G_GINT64_FORMAT, wav->offset, wav->end_offset, wav->dataleft); /* Get the next n bytes and output them */ if (wav->dataleft == 0 || wav->dataleft < wav->blockalign) goto found_eos; /* scale the amount of data by the segment rate so we get equal * amounts of data regardless of the playback rate */ desired = MIN (gst_guint64_to_gdouble (wav->dataleft), wav->max_buf_size * wav->segment.abs_rate); if (desired >= wav->blockalign && wav->blockalign > 0) desired -= (desired % wav->blockalign); GST_LOG_OBJECT (wav, "Fetching %" G_GINT64_FORMAT " bytes of data " "from the sinkpad", desired); if (wav->streaming) { guint avail = gst_adapter_available (wav->adapter); guint extra; /* flush some bytes if evil upstream sends segment that starts * before data or does is not send sample aligned segment */ if (G_LIKELY (wav->offset >= wav->datastart)) { extra = (wav->offset - wav->datastart) % wav->bytes_per_sample; } else { extra = wav->datastart - wav->offset; } if (G_UNLIKELY (extra)) { extra = wav->bytes_per_sample - extra; if (extra <= avail) { GST_DEBUG_OBJECT (wav, "flushing %d bytes to sample boundary", extra); gst_adapter_flush (wav->adapter, extra); wav->offset += extra; wav->dataleft -= extra; goto iterate_adapter; } else { GST_DEBUG_OBJECT (wav, "flushing %d bytes", avail); gst_adapter_clear (wav->adapter); wav->offset += avail; wav->dataleft -= avail; return GST_FLOW_OK; } } if (avail < desired) { GST_LOG_OBJECT (wav, "Got only %d bytes of data from the sinkpad", avail); return GST_FLOW_OK; } buf = gst_adapter_take_buffer (wav->adapter, desired); } else { if ((res = gst_pad_pull_range (wav->sinkpad, wav->offset, desired, &buf)) != GST_FLOW_OK) goto pull_error; /* we may get a short buffer at the end of the file */ if (GST_BUFFER_SIZE (buf) < desired) { GST_LOG_OBJECT (wav, "Got only %u bytes of data", GST_BUFFER_SIZE (buf)); if (GST_BUFFER_SIZE (buf) >= wav->blockalign) { buf = gst_buffer_make_metadata_writable (buf); GST_BUFFER_SIZE (buf) -= (GST_BUFFER_SIZE (buf) % wav->blockalign); } else { gst_buffer_unref (buf); goto found_eos; } } } obtained = GST_BUFFER_SIZE (buf); /* our positions in bytes */ pos = wav->offset - wav->datastart; nextpos = pos + obtained; /* update offsets, does not overflow. */ GST_BUFFER_OFFSET (buf) = pos / wav->bytes_per_sample; GST_BUFFER_OFFSET_END (buf) = nextpos / wav->bytes_per_sample; /* first chunk of data? create the source pad. We do this only here so * we can detect broken .wav files with dts disguised as raw PCM (sigh) */ if (G_UNLIKELY (wav->first)) { wav->first = FALSE; /* this will also push the segment events */ gst_wavparse_add_src_pad (wav, buf); } else { /* If we have a pending close/start segment, send it now. */ if (G_UNLIKELY (wav->close_segment != NULL)) { gst_pad_push_event (wav->srcpad, wav->close_segment); wav->close_segment = NULL; } if (G_UNLIKELY (wav->start_segment != NULL)) { gst_pad_push_event (wav->srcpad, wav->start_segment); wav->start_segment = NULL; } } if (wav->bps > 0) { /* and timestamps if we have a bitrate, be careful for overflows */ timestamp = uint64_ceiling_scale (pos, GST_SECOND, (guint64) wav->bps); next_timestamp = uint64_ceiling_scale (nextpos, GST_SECOND, (guint64) wav->bps); duration = next_timestamp - timestamp; /* update current running segment position */ if (G_LIKELY (next_timestamp >= wav->segment.start)) gst_segment_set_last_stop (&wav->segment, GST_FORMAT_TIME, next_timestamp); } else if (wav->fact) { guint64 bps = gst_util_uint64_scale_int (wav->datasize, wav->rate, wav->fact); /* and timestamps if we have a bitrate, be careful for overflows */ timestamp = uint64_ceiling_scale (pos, GST_SECOND, bps); next_timestamp = uint64_ceiling_scale (nextpos, GST_SECOND, bps); duration = next_timestamp - timestamp; } else { /* no bitrate, all we know is that the first sample has timestamp 0, all * other positions and durations have unknown timestamp. */ if (pos == 0) timestamp = 0; else timestamp = GST_CLOCK_TIME_NONE; duration = GST_CLOCK_TIME_NONE; /* update current running segment position with byte offset */ if (G_LIKELY (nextpos >= wav->segment.start)) gst_segment_set_last_stop (&wav->segment, GST_FORMAT_BYTES, nextpos); } if ((pos > 0) && wav->vbr) { /* don't set timestamps for VBR files if it's not the first buffer */ timestamp = GST_CLOCK_TIME_NONE; duration = GST_CLOCK_TIME_NONE; } if (wav->discont) { GST_DEBUG_OBJECT (wav, "marking DISCONT"); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); wav->discont = FALSE; } GST_BUFFER_TIMESTAMP (buf) = timestamp; GST_BUFFER_DURATION (buf) = duration; /* don't forget to set the caps on the buffer */ gst_buffer_set_caps (buf, GST_PAD_CAPS (wav->srcpad)); GST_LOG_OBJECT (wav, "Got buffer. timestamp:%" GST_TIME_FORMAT " , duration:%" GST_TIME_FORMAT ", size:%u", GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration), GST_BUFFER_SIZE (buf)); if ((res = gst_pad_push (wav->srcpad, buf)) != GST_FLOW_OK) goto push_error; if (obtained < wav->dataleft) { wav->offset += obtained; wav->dataleft -= obtained; } else { wav->offset += wav->dataleft; wav->dataleft = 0; } /* Iterate until need more data, so adapter size won't grow */ if (wav->streaming) { GST_LOG_OBJECT (wav, "offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT, wav->offset, wav->end_offset); goto iterate_adapter; } return res; /* ERROR */ found_eos: { GST_DEBUG_OBJECT (wav, "found EOS"); return GST_FLOW_UNEXPECTED; } pull_error: { /* check if we got EOS */ if (res == GST_FLOW_UNEXPECTED) goto found_eos; GST_WARNING_OBJECT (wav, "Error getting %" G_GINT64_FORMAT " bytes from the " "sinkpad (dataleft = %" G_GINT64_FORMAT ")", desired, wav->dataleft); return res; } push_error: { GST_INFO_OBJECT (wav, "Error pushing on srcpad %s:%s, reason %s, is linked? = %d", GST_DEBUG_PAD_NAME (wav->srcpad), gst_flow_get_name (res), gst_pad_is_linked (wav->srcpad)); return res; } } static void gst_wavparse_loop (GstPad * pad) { GstFlowReturn ret; GstWavParse *wav = GST_WAVPARSE (GST_PAD_PARENT (pad)); GST_LOG_OBJECT (wav, "process data"); switch (wav->state) { case GST_WAVPARSE_START: GST_INFO_OBJECT (wav, "GST_WAVPARSE_START"); if ((ret = gst_wavparse_stream_init (wav)) != GST_FLOW_OK) goto pause; wav->state = GST_WAVPARSE_HEADER; /* fall-through */ case GST_WAVPARSE_HEADER: GST_INFO_OBJECT (wav, "GST_WAVPARSE_HEADER"); if ((ret = gst_wavparse_stream_headers (wav)) != GST_FLOW_OK) goto pause; wav->state = GST_WAVPARSE_DATA; GST_INFO_OBJECT (wav, "GST_WAVPARSE_DATA"); /* fall-through */ case GST_WAVPARSE_DATA: if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK) goto pause; break; default: g_assert_not_reached (); } return; /* ERRORS */ pause: { const gchar *reason = gst_flow_get_name (ret); GST_DEBUG_OBJECT (wav, "pausing task, reason %s", reason); wav->segment_running = FALSE; gst_pad_pause_task (pad); if (ret == GST_FLOW_UNEXPECTED) { /* add pad before we perform EOS */ if (G_UNLIKELY (wav->first)) { wav->first = FALSE; gst_wavparse_add_src_pad (wav, NULL); } if (wav->state == GST_WAVPARSE_START) GST_ELEMENT_ERROR (wav, STREAM, WRONG_TYPE, ("No valid input found before end of stream"), (NULL)); /* perform EOS logic */ if (wav->segment.flags & GST_SEEK_FLAG_SEGMENT) { GstClockTime stop; if ((stop = wav->segment.stop) == -1) stop = wav->segment.duration; gst_element_post_message (GST_ELEMENT_CAST (wav), gst_message_new_segment_done (GST_OBJECT_CAST (wav), wav->segment.format, stop)); } else { if (wav->srcpad != NULL) gst_pad_push_event (wav->srcpad, gst_event_new_eos ()); } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { /* for fatal errors we post an error message, post the error * first so the app knows about the error first. */ GST_ELEMENT_ERROR (wav, STREAM, FAILED, (_("Internal data flow error.")), ("streaming task paused, reason %s (%d)", reason, ret)); if (wav->srcpad != NULL) gst_pad_push_event (wav->srcpad, gst_event_new_eos ()); } return; } } static GstFlowReturn gst_wavparse_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret; GstWavParse *wav = GST_WAVPARSE (GST_PAD_PARENT (pad)); GST_LOG_OBJECT (wav, "adapter_push %u bytes", GST_BUFFER_SIZE (buf)); gst_adapter_push (wav->adapter, buf); switch (wav->state) { case GST_WAVPARSE_START: GST_INFO_OBJECT (wav, "GST_WAVPARSE_START"); if ((ret = gst_wavparse_parse_stream_init (wav)) != GST_FLOW_OK) goto done; if (wav->state != GST_WAVPARSE_HEADER) break; /* otherwise fall-through */ case GST_WAVPARSE_HEADER: GST_INFO_OBJECT (wav, "GST_WAVPARSE_HEADER"); if ((ret = gst_wavparse_stream_headers (wav)) != GST_FLOW_OK) goto done; if (!wav->got_fmt || wav->datastart == 0) break; wav->state = GST_WAVPARSE_DATA; GST_INFO_OBJECT (wav, "GST_WAVPARSE_DATA"); /* fall-through */ case GST_WAVPARSE_DATA: if (buf && GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) wav->discont = TRUE; if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK) goto done; break; default: g_return_val_if_reached (GST_FLOW_ERROR); } done: if (G_UNLIKELY (wav->abort_buffering)) { wav->abort_buffering = FALSE; ret = GST_FLOW_ERROR; /* sort of demux/parse error */ GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("unhandled buffer size")); } return ret; } static GstFlowReturn gst_wavparse_flush_data (GstWavParse * wav) { GstFlowReturn ret = GST_FLOW_OK; guint av; if ((av = gst_adapter_available (wav->adapter)) > 0) { wav->dataleft = av; wav->end_offset = wav->offset + av; ret = gst_wavparse_stream_data (wav); } return ret; } static gboolean gst_wavparse_sink_event (GstPad * pad, GstEvent * event) { GstWavParse *wav = GST_WAVPARSE (GST_PAD_PARENT (pad)); gboolean ret = TRUE; GST_LOG_OBJECT (wav, "handling %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time, offset = 0, end_offset = -1; gboolean update; GstSegment segment; /* some debug output */ gst_segment_init (&segment, GST_FORMAT_UNDEFINED); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); gst_segment_set_newsegment_full (&segment, update, rate, arate, format, start, stop, time); GST_DEBUG_OBJECT (wav, "received format %d newsegment %" GST_SEGMENT_FORMAT, format, &segment); if (wav->state != GST_WAVPARSE_DATA) { GST_DEBUG_OBJECT (wav, "still starting, eating event"); goto exit; } /* now we are either committed to TIME or BYTE format, * and we only expect a BYTE segment, e.g. following a seek */ if (format == GST_FORMAT_BYTES) { if (start > 0) { offset = start; start -= wav->datastart; start = MAX (start, 0); } if (stop > 0) { end_offset = stop; stop -= wav->datastart; stop = MAX (stop, 0); } if (wav->segment.format == GST_FORMAT_TIME) { guint64 bps = wav->bps; /* operating in format TIME, so we can convert */ if (!bps && wav->fact) bps = gst_util_uint64_scale_int (wav->datasize, wav->rate, wav->fact); if (bps) { if (start >= 0) start = uint64_ceiling_scale (start, GST_SECOND, (guint64) wav->bps); if (stop >= 0) stop = uint64_ceiling_scale (stop, GST_SECOND, (guint64) wav->bps); } } } else { GST_DEBUG_OBJECT (wav, "unsupported segment format, ignoring"); goto exit; } /* accept upstream's notion of segment and distribute along */ gst_segment_set_newsegment_full (&wav->segment, update, rate, arate, wav->segment.format, start, stop, start); /* also store the newsegment event for the streaming thread */ if (wav->start_segment) gst_event_unref (wav->start_segment); wav->start_segment = gst_event_new_new_segment_full (update, rate, arate, wav->segment.format, start, stop, start); GST_DEBUG_OBJECT (wav, "Pushing newseg update %d, rate %g, " "applied rate %g, format %d, start %" G_GINT64_FORMAT ", " "stop %" G_GINT64_FORMAT, update, rate, arate, wav->segment.format, start, stop); /* stream leftover data in current segment */ gst_wavparse_flush_data (wav); /* and set up streaming thread for next one */ wav->offset = offset; wav->end_offset = end_offset; if (wav->end_offset > 0) { wav->dataleft = wav->end_offset - wav->offset; } else { /* infinity; upstream will EOS when done */ wav->dataleft = G_MAXUINT64; } exit: gst_event_unref (event); break; } case GST_EVENT_EOS: /* add pad if needed so EOS is seen downstream */ if (G_UNLIKELY (wav->first)) { wav->first = FALSE; gst_wavparse_add_src_pad (wav, NULL); } else { /* stream leftover data in current segment */ gst_wavparse_flush_data (wav); } if (wav->state == GST_WAVPARSE_START) GST_ELEMENT_ERROR (wav, STREAM, WRONG_TYPE, ("No valid input found before end of stream"), (NULL)); /* fall-through */ case GST_EVENT_FLUSH_STOP: gst_adapter_clear (wav->adapter); wav->discont = TRUE; /* fall-through */ default: ret = gst_pad_event_default (wav->sinkpad, event); break; } return ret; } #if 0 /* convert and query stuff */ static const GstFormat * gst_wavparse_get_formats (GstPad * pad) { static GstFormat formats[] = { GST_FORMAT_TIME, GST_FORMAT_BYTES, GST_FORMAT_DEFAULT, /* a "frame", ie a set of samples per Hz */ 0 }; return formats; } #endif static gboolean gst_wavparse_pad_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { GstWavParse *wavparse; gboolean res = TRUE; wavparse = GST_WAVPARSE (GST_PAD_PARENT (pad)); if (*dest_format == src_format) { *dest_value = src_value; return TRUE; } if ((wavparse->bps == 0) && !wavparse->fact) goto no_bps_fact; GST_INFO_OBJECT (wavparse, "converting value from %s to %s", gst_format_get_name (src_format), gst_format_get_name (*dest_format)); switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_DEFAULT: *dest_value = src_value / wavparse->bytes_per_sample; /* make sure we end up on a sample boundary */ *dest_value -= *dest_value % wavparse->bytes_per_sample; break; case GST_FORMAT_TIME: /* src_value + datastart = offset */ GST_INFO_OBJECT (wavparse, "src=%" G_GINT64_FORMAT ", offset=%" G_GINT64_FORMAT, src_value, wavparse->offset); if (wavparse->bps > 0) *dest_value = uint64_ceiling_scale (src_value, GST_SECOND, (guint64) wavparse->bps); else if (wavparse->fact) { guint64 bps = uint64_ceiling_scale_int (wavparse->datasize, wavparse->rate, wavparse->fact); *dest_value = uint64_ceiling_scale_int (src_value, GST_SECOND, bps); } else { res = FALSE; } break; default: res = FALSE; goto done; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_BYTES: *dest_value = src_value * wavparse->bytes_per_sample; break; case GST_FORMAT_TIME: *dest_value = gst_util_uint64_scale (src_value, GST_SECOND, (guint64) wavparse->rate); break; default: res = FALSE; goto done; } break; case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: if (wavparse->bps > 0) *dest_value = gst_util_uint64_scale (src_value, (guint64) wavparse->bps, GST_SECOND); else { guint64 bps = gst_util_uint64_scale_int (wavparse->datasize, wavparse->rate, wavparse->fact); *dest_value = gst_util_uint64_scale (src_value, bps, GST_SECOND); } /* make sure we end up on a sample boundary */ *dest_value -= *dest_value % wavparse->blockalign; break; case GST_FORMAT_DEFAULT: *dest_value = gst_util_uint64_scale (src_value, (guint64) wavparse->rate, GST_SECOND); break; default: res = FALSE; goto done; } break; default: res = FALSE; goto done; } done: return res; /* ERRORS */ no_bps_fact: { GST_DEBUG_OBJECT (wavparse, "bps 0 or no fact chunk, cannot convert"); res = FALSE; goto done; } } static const GstQueryType * gst_wavparse_get_query_types (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_CONVERT, GST_QUERY_SEEKING, 0 }; return types; } /* handle queries for location and length in requested format */ static gboolean gst_wavparse_pad_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstWavParse *wav = GST_WAVPARSE (gst_pad_get_parent (pad)); /* only if we know */ if (wav->state != GST_WAVPARSE_DATA) { gst_object_unref (wav); return FALSE; } GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { gint64 curb; gint64 cur; GstFormat format; /* this is not very precise, as we have pushed severla buffer upstream for prerolling */ curb = wav->offset - wav->datastart; gst_query_parse_position (query, &format, NULL); GST_INFO_OBJECT (wav, "pos query at %" G_GINT64_FORMAT, curb); switch (format) { case GST_FORMAT_TIME: res = gst_wavparse_pad_convert (pad, GST_FORMAT_BYTES, curb, &format, &cur); break; default: format = GST_FORMAT_BYTES; cur = curb; break; } if (res) gst_query_set_position (query, format, cur); break; } case GST_QUERY_DURATION: { gint64 duration = 0; GstFormat format; gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME:{ if ((res = gst_wavparse_calculate_duration (wav))) { duration = wav->duration; } break; } default: format = GST_FORMAT_BYTES; duration = wav->datasize; break; } gst_query_set_duration (query, format, duration); break; } case GST_QUERY_CONVERT: { gint64 srcvalue, dstvalue; GstFormat srcformat, dstformat; gst_query_parse_convert (query, &srcformat, &srcvalue, &dstformat, &dstvalue); res = gst_wavparse_pad_convert (pad, srcformat, srcvalue, &dstformat, &dstvalue); if (res) gst_query_set_convert (query, srcformat, srcvalue, dstformat, dstvalue); break; } case GST_QUERY_SEEKING:{ GstFormat fmt; gboolean seekable = FALSE; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); if (fmt == wav->segment.format) { if (wav->streaming) { GstQuery *q; q = gst_query_new_seeking (GST_FORMAT_BYTES); if ((res = gst_pad_peer_query (wav->sinkpad, q))) { gst_query_parse_seeking (q, &fmt, &seekable, NULL, NULL); GST_LOG_OBJECT (wav, "upstream BYTE seekable %d", seekable); } gst_query_unref (q); } else { GST_LOG_OBJECT (wav, "looping => seekable"); seekable = TRUE; res = TRUE; } } else if (fmt == GST_FORMAT_TIME) { res = TRUE; } if (res) { gst_query_set_seeking (query, fmt, seekable, 0, wav->segment.duration); } break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (wav); return res; } static gboolean gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event) { GstWavParse *wavparse = GST_WAVPARSE (gst_pad_get_parent (pad)); gboolean res = FALSE; GST_DEBUG_OBJECT (wavparse, "%s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: /* can only handle events when we are in the data state */ if (wavparse->state == GST_WAVPARSE_DATA) { res = gst_wavparse_perform_seek (wavparse, event); } gst_event_unref (event); break; default: res = gst_pad_push_event (wavparse->sinkpad, event); break; } gst_object_unref (wavparse); return res; } static gboolean gst_wavparse_sink_activate (GstPad * sinkpad) { GstWavParse *wav = GST_WAVPARSE (gst_pad_get_parent (sinkpad)); gboolean res; if (wav->adapter) { gst_adapter_clear (wav->adapter); g_object_unref (wav->adapter); wav->adapter = NULL; } if (gst_pad_check_pull_range (sinkpad)) { GST_DEBUG ("going to pull mode"); wav->streaming = FALSE; res = gst_pad_activate_pull (sinkpad, TRUE); } else { GST_DEBUG ("going to push (streaming) mode"); wav->streaming = TRUE; wav->adapter = gst_adapter_new (); res = gst_pad_activate_push (sinkpad, TRUE); } gst_object_unref (wav); return res; } static gboolean gst_wavparse_sink_activate_pull (GstPad * sinkpad, gboolean active) { GstWavParse *wav = GST_WAVPARSE (GST_OBJECT_PARENT (sinkpad)); if (active) { /* if we have a scheduler we can start the task */ wav->segment_running = TRUE; return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_wavparse_loop, sinkpad); } else { wav->segment_running = FALSE; return gst_pad_stop_task (sinkpad); } }; static GstStateChangeReturn gst_wavparse_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstWavParse *wav = GST_WAVPARSE (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_wavparse_reset (wav); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_wavparse_destroy_sourcepad (wav); gst_wavparse_reset (wav); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { gst_riff_init (); return gst_element_register (plugin, "wavparse", GST_RANK_PRIMARY, GST_TYPE_WAVPARSE); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "wavparse", "Parse a .wav file into raw audio", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/wavparse/Makefile.in0000644000175000017500000006674511720560237016516 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/wavparse DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstwavparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstwavparse_la_OBJECTS = libgstwavparse_la-gstwavparse.lo libgstwavparse_la_OBJECTS = $(am_libgstwavparse_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstwavparse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstwavparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstwavparse_la_CFLAGS) $(CFLAGS) \ $(libgstwavparse_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstwavparse_la_SOURCES) DIST_SOURCES = $(libgstwavparse_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstwavparse.la libgstwavparse_la_SOURCES = gstwavparse.c libgstwavparse_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstwavparse_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(LIBM) libgstwavparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstwavparse_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstwavparse.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/wavparse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/wavparse/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstwavparse.la: $(libgstwavparse_la_OBJECTS) $(libgstwavparse_la_DEPENDENCIES) $(EXTRA_libgstwavparse_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstwavparse_la_LINK) -rpath $(plugindir) $(libgstwavparse_la_OBJECTS) $(libgstwavparse_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavparse_la-gstwavparse.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstwavparse_la-gstwavparse.lo: gstwavparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavparse_la_CFLAGS) $(CFLAGS) -MT libgstwavparse_la-gstwavparse.lo -MD -MP -MF $(DEPDIR)/libgstwavparse_la-gstwavparse.Tpo -c -o libgstwavparse_la-gstwavparse.lo `test -f 'gstwavparse.c' || echo '$(srcdir)/'`gstwavparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavparse_la-gstwavparse.Tpo $(DEPDIR)/libgstwavparse_la-gstwavparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavparse.c' object='libgstwavparse_la-gstwavparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavparse_la_CFLAGS) $(CFLAGS) -c -o libgstwavparse_la-gstwavparse.lo `test -f 'gstwavparse.c' || echo '$(srcdir)/'`gstwavparse.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstwavparse -:SHARED libgstwavparse \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstwavparse_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavparse_la_CFLAGS) \ -:LDFLAGS $(libgstwavparse_la_LDFLAGS) \ $(libgstwavparse_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/spectrum/0000755000175000017500000000000011720565313014521 500000000000000gst-plugins-good-0.10.31/gst/spectrum/Makefile.am0000644000175000017500000000177711671175354016520 00000000000000plugin_LTLIBRARIES = libgstspectrum.la libgstspectrum_la_SOURCES = gstspectrum.c libgstspectrum_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstspectrum_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstfft-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstspectrum_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstspectrum_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstspectrum.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstspectrum -:SHARED libgstspectrum \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstspectrum_la_SOURCES) \ $(nodist_libgstspectrum_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstspectrum_la_CFLAGS) \ -:LDFLAGS $(libgstspectrum_la_LDFLAGS) \ $(libgstspectrum_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/spectrum/gstspectrum.h0000644000175000017500000000623611671175354017210 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * 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_SPECTRUM_H__ #define __GST_SPECTRUM_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_SPECTRUM (gst_spectrum_get_type()) #define GST_SPECTRUM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPECTRUM,GstSpectrum)) #define GST_IS_SPECTRUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPECTRUM)) #define GST_SPECTRUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_SPECTRUM,GstSpectrumClass)) #define GST_IS_SPECTRUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_SPECTRUM)) typedef struct _GstSpectrum GstSpectrum; typedef struct _GstSpectrumClass GstSpectrumClass; typedef struct _GstSpectrumChannel GstSpectrumChannel; typedef void (*GstSpectrumInputData)(const guint8 * in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft); struct _GstSpectrumChannel { gfloat *input; gfloat *input_tmp; GstFFTF32Complex *freqdata; gfloat *spect_magnitude; /* accumulated mangitude and phase */ gfloat *spect_phase; /* will be scaled by num_fft before sending */ GstFFTF32 *fft_ctx; }; struct _GstSpectrum { GstAudioFilter parent; /* properties */ gboolean post_messages; /* whether or not to post messages */ gboolean message_magnitude; gboolean message_phase; guint64 interval; /* how many nanoseconds between emits */ guint64 frames_per_interval; /* how many frames per interval */ guint64 frames_todo; guint bands; /* number of spectrum bands */ gint threshold; /* energy level treshold */ gboolean multi_channel; /* send separate channel results */ guint64 num_frames; /* frame count (1 sample per channel) * since last emit */ guint64 num_fft; /* number of FFTs since last emit */ GstClockTime message_ts; /* starttime for next message */ /* */ GstSpectrumChannel *channel_data; guint num_channels; guint input_pos; guint64 error_per_interval; guint64 accumulated_error; GstSpectrumInputData input_data; }; struct _GstSpectrumClass { GstAudioFilterClass parent_class; }; GType gst_spectrum_get_type (void); G_END_DECLS #endif /* __GST_SPECTRUM_H__ */ gst-plugins-good-0.10.31/gst/spectrum/gstspectrum.c0000644000175000017500000010530611677341656017207 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2006,2011> Stefan Kost * <2007-2009> Sebastian Dröge * * 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-spectrum * * The Spectrum element analyzes the frequency spectrum of an audio signal. * If the #GstSpectrum:post-messages property is #TRUE, it sends analysis results * as application messages named * "spectrum" after each interval of time given * by the #GstSpectrum:interval property. * * The message's structure contains some combination of these fields: * * * * #GstClockTime * "timestamp": * the timestamp of the buffer that triggered the message. * * * * * #GstClockTime * "stream-time": * the stream time of the buffer. * * * * * #GstClockTime * "running-time": * the running_time of the buffer. * * * * * #GstClockTime * "duration": * the duration of the buffer. * * * * * #GstClockTime * "endtime": * the end time of the buffer that triggered the message as stream time (this * is deprecated, as it can be calculated from stream-time + duration) * * * * * #GstValueList of #gfloat * "magnitude": * the level for each frequency band in dB. All values below the value of the * #GstSpectrum:threshold property will be set to the threshold. Only present * if the #GstSpectrum:message-magnitude property is %TRUE. * * * * * #GstValueList of #gfloat * "phase": * The phase for each frequency band. The value is between -pi and pi. Only * present if the #GstSpectrum:message-phase property is %TRUE. * * * * * If #GstSpectrum:multi-channel property is set to true. magnitude and phase * fields will be each a nested #GstValueArray. The first dimension are the * channels and the second dimension are the values. * * * Example application * |[ * * ]| * * * Last reviewed on 2011-03-10 (0.10.29) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstspectrum.h" GST_DEBUG_CATEGORY_STATIC (gst_spectrum_debug); #define GST_CAT_DEFAULT gst_spectrum_debug /* elementfactory information */ #define ALLOWED_CAPS \ "audio/x-raw-int, " \ " width = (int) 16, " \ " depth = (int) [ 1, 16 ], " \ " signed = (boolean) true, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]; " \ "audio/x-raw-int, " \ " width = (int) 24, " \ " depth = (int) [ 1, 24 ], " \ " signed = (boolean) true, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]; " \ "audio/x-raw-int, " \ " width = (int) 32, " \ " depth = (int) [ 1, 32 ], " \ " signed = (boolean) true, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]; " \ "audio/x-raw-float, " \ " width = (int) { 32, 64 }, " \ " endianness = (int) BYTE_ORDER, " \ " rate = (int) [ 1, MAX ], " \ " channels = (int) [ 1, MAX ]" /* Spectrum properties */ #define DEFAULT_MESSAGE TRUE #define DEFAULT_POST_MESSAGES TRUE #define DEFAULT_MESSAGE_MAGNITUDE TRUE #define DEFAULT_MESSAGE_PHASE FALSE #define DEFAULT_INTERVAL (GST_SECOND / 10) #define DEFAULT_BANDS 128 #define DEFAULT_THRESHOLD -60 #define DEFAULT_MULTI_CHANNEL FALSE enum { PROP_0, PROP_MESSAGE, PROP_POST_MESSAGES, PROP_MESSAGE_MAGNITUDE, PROP_MESSAGE_PHASE, PROP_INTERVAL, PROP_BANDS, PROP_THRESHOLD, PROP_MULTI_CHANNEL }; GST_BOILERPLATE (GstSpectrum, gst_spectrum, GstAudioFilter, GST_TYPE_AUDIO_FILTER); static void gst_spectrum_finalize (GObject * object); static void gst_spectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_spectrum_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_spectrum_start (GstBaseTransform * trans); static gboolean gst_spectrum_stop (GstBaseTransform * trans); static GstFlowReturn gst_spectrum_transform_ip (GstBaseTransform * trans, GstBuffer * in); static gboolean gst_spectrum_setup (GstAudioFilter * base, GstRingBufferSpec * format); static void gst_spectrum_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstCaps *caps; gst_element_class_set_details_simple (element_class, "Spectrum analyzer", "Filter/Analyzer/Audio", "Run an FFT on the audio signal, output spectrum data", "Erik Walthinsen , " "Stefan Kost , " "Sebastian Dröge "); caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (GST_AUDIO_FILTER_CLASS (g_class), caps); gst_caps_unref (caps); } static void gst_spectrum_class_init (GstSpectrumClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); GstAudioFilterClass *filter_class = GST_AUDIO_FILTER_CLASS (klass); gobject_class->set_property = gst_spectrum_set_property; gobject_class->get_property = gst_spectrum_get_property; gobject_class->finalize = gst_spectrum_finalize; trans_class->start = GST_DEBUG_FUNCPTR (gst_spectrum_start); trans_class->stop = GST_DEBUG_FUNCPTR (gst_spectrum_stop); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_spectrum_transform_ip); trans_class->passthrough_on_same_caps = TRUE; filter_class->setup = GST_DEBUG_FUNCPTR (gst_spectrum_setup); /* FIXME 0.11, remove in favour of post-messages */ g_object_class_install_property (gobject_class, PROP_MESSAGE, g_param_spec_boolean ("message", "Message", "Whether to post a 'spectrum' element message on the bus for each " "passed interval (deprecated, use post-messages)", DEFAULT_MESSAGE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstSpectrum:post-messages * * Post messages on the bus with spectrum information. * * Since: 0.10.17 */ g_object_class_install_property (gobject_class, PROP_POST_MESSAGES, g_param_spec_boolean ("post-messages", "Post Messages", "Whether to post a 'spectrum' element message on the bus for each " "passed interval", DEFAULT_POST_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MESSAGE_MAGNITUDE, g_param_spec_boolean ("message-magnitude", "Magnitude", "Whether to add a 'magnitude' field to the structure of any " "'spectrum' element messages posted on the bus", DEFAULT_MESSAGE_MAGNITUDE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MESSAGE_PHASE, g_param_spec_boolean ("message-phase", "Phase", "Whether to add a 'phase' field to the structure of any " "'spectrum' element messages posted on the bus", DEFAULT_MESSAGE_PHASE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_INTERVAL, g_param_spec_uint64 ("interval", "Interval", "Interval of time between message posts (in nanoseconds)", 1, G_MAXUINT64, DEFAULT_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_BANDS, g_param_spec_uint ("bands", "Bands", "Number of frequency bands", 0, G_MAXUINT, DEFAULT_BANDS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_THRESHOLD, g_param_spec_int ("threshold", "Threshold", "dB threshold for result. All lower values will be set to this", G_MININT, 0, DEFAULT_THRESHOLD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstSpectrum:multi-channel * * Send separate results for each channel * * Since: 0.10.29 */ g_object_class_install_property (gobject_class, PROP_MULTI_CHANNEL, g_param_spec_boolean ("multi-channel", "Multichannel results", "Send separate results for each channel", DEFAULT_MULTI_CHANNEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (gst_spectrum_debug, "spectrum", 0, "audio spectrum analyser element"); } static void gst_spectrum_init (GstSpectrum * spectrum, GstSpectrumClass * g_class) { spectrum->post_messages = DEFAULT_POST_MESSAGES; spectrum->message_magnitude = DEFAULT_MESSAGE_MAGNITUDE; spectrum->message_phase = DEFAULT_MESSAGE_PHASE; spectrum->interval = DEFAULT_INTERVAL; spectrum->bands = DEFAULT_BANDS; spectrum->threshold = DEFAULT_THRESHOLD; } static void gst_spectrum_alloc_channel_data (GstSpectrum * spectrum) { gint i; GstSpectrumChannel *cd; guint bands = spectrum->bands; guint nfft = 2 * bands - 2; g_assert (spectrum->channel_data == NULL); spectrum->num_channels = (spectrum->multi_channel) ? GST_AUDIO_FILTER (spectrum)->format.channels : 1; GST_DEBUG_OBJECT (spectrum, "allocating data for %d channels", spectrum->num_channels); spectrum->channel_data = g_new (GstSpectrumChannel, spectrum->num_channels); for (i = 0; i < spectrum->num_channels; i++) { cd = &spectrum->channel_data[i]; cd->fft_ctx = gst_fft_f32_new (nfft, FALSE); cd->input = g_new0 (gfloat, nfft); cd->input_tmp = g_new0 (gfloat, nfft); cd->freqdata = g_new0 (GstFFTF32Complex, bands); cd->spect_magnitude = g_new0 (gfloat, bands); cd->spect_phase = g_new0 (gfloat, bands); } } static void gst_spectrum_free_channel_data (GstSpectrum * spectrum) { if (spectrum->channel_data) { gint i; GstSpectrumChannel *cd; GST_DEBUG_OBJECT (spectrum, "freeing data for %d channels", spectrum->num_channels); for (i = 0; i < spectrum->num_channels; i++) { cd = &spectrum->channel_data[i]; if (cd->fft_ctx) gst_fft_f32_free (cd->fft_ctx); g_free (cd->input); g_free (cd->input_tmp); g_free (cd->freqdata); g_free (cd->spect_magnitude); g_free (cd->spect_phase); } g_free (spectrum->channel_data); spectrum->channel_data = NULL; } } static void gst_spectrum_flush (GstSpectrum * spectrum) { spectrum->num_frames = 0; spectrum->num_fft = 0; spectrum->accumulated_error = 0; } static void gst_spectrum_reset_state (GstSpectrum * spectrum) { GST_DEBUG_OBJECT (spectrum, "resetting state"); gst_spectrum_free_channel_data (spectrum); gst_spectrum_flush (spectrum); } static void gst_spectrum_finalize (GObject * object) { GstSpectrum *spectrum = GST_SPECTRUM (object); gst_spectrum_reset_state (spectrum); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_spectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSpectrum *filter = GST_SPECTRUM (object); switch (prop_id) { case PROP_MESSAGE: case PROP_POST_MESSAGES: filter->post_messages = g_value_get_boolean (value); break; case PROP_MESSAGE_MAGNITUDE: filter->message_magnitude = g_value_get_boolean (value); break; case PROP_MESSAGE_PHASE: filter->message_phase = g_value_get_boolean (value); break; case PROP_INTERVAL:{ guint64 interval = g_value_get_uint64 (value); if (filter->interval != interval) { GST_BASE_TRANSFORM_LOCK (filter); filter->interval = interval; gst_spectrum_reset_state (filter); GST_BASE_TRANSFORM_UNLOCK (filter); } } break; case PROP_BANDS:{ guint bands = g_value_get_uint (value); if (filter->bands != bands) { GST_BASE_TRANSFORM_LOCK (filter); filter->bands = bands; gst_spectrum_reset_state (filter); GST_BASE_TRANSFORM_UNLOCK (filter); } } break; case PROP_THRESHOLD: filter->threshold = g_value_get_int (value); break; case PROP_MULTI_CHANNEL:{ gboolean multi_channel = g_value_get_boolean (value); if (filter->multi_channel != multi_channel) { GST_BASE_TRANSFORM_LOCK (filter); filter->multi_channel = multi_channel; gst_spectrum_reset_state (filter); GST_BASE_TRANSFORM_UNLOCK (filter); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_spectrum_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSpectrum *filter = GST_SPECTRUM (object); switch (prop_id) { case PROP_MESSAGE: case PROP_POST_MESSAGES: g_value_set_boolean (value, filter->post_messages); break; case PROP_MESSAGE_MAGNITUDE: g_value_set_boolean (value, filter->message_magnitude); break; case PROP_MESSAGE_PHASE: g_value_set_boolean (value, filter->message_phase); break; case PROP_INTERVAL: g_value_set_uint64 (value, filter->interval); break; case PROP_BANDS: g_value_set_uint (value, filter->bands); break; case PROP_THRESHOLD: g_value_set_int (value, filter->threshold); break; case PROP_MULTI_CHANNEL: g_value_set_boolean (value, filter->multi_channel); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_spectrum_start (GstBaseTransform * trans) { GstSpectrum *spectrum = GST_SPECTRUM (trans); gst_spectrum_reset_state (spectrum); return TRUE; } static gboolean gst_spectrum_stop (GstBaseTransform * trans) { GstSpectrum *spectrum = GST_SPECTRUM (trans); gst_spectrum_reset_state (spectrum); return TRUE; } /* mixing data readers */ static void input_data_mixed_float (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j, ip = 0; gfloat v; gfloat *in = (gfloat *) _in; for (j = 0; j < len; j++) { v = in[ip++]; for (i = 1; i < channels; i++) v += in[ip++]; out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_double (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j, ip = 0; gfloat v; gdouble *in = (gdouble *) _in; for (j = 0; j < len; j++) { v = in[ip++]; for (i = 1; i < channels; i++) v += in[ip++]; out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_int32 (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j, ip = 0; gint32 *in = (gint32 *) _in; gfloat v; for (j = 0; j < len; j++) { v = in[ip++] * 2 + 1; for (i = 1; i < channels; i++) v += in[ip++] * 2 + 1; out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_int32_max (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j, ip = 0; gint32 *in = (gint32 *) _in; gfloat v; for (j = 0; j < len; j++) { v = in[ip++] / max_value; for (i = 1; i < channels; i++) v += in[ip++] / max_value; out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_int24 (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j; gfloat v = 0.0; for (j = 0; j < len; j++) { for (i = 0; i < channels; i++) { #if G_BYTE_ORDER == G_BIG_ENDIAN gint32 value = GST_READ_UINT24_BE (_in); #else gint32 value = GST_READ_UINT24_LE (_in); #endif if (value & 0x00800000) value |= 0xff000000; v += value * 2 + 1; _in += 3; } out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_int24_max (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j; gfloat v = 0.0; for (j = 0; j < len; j++) { for (i = 0; i < channels; i++) { #if G_BYTE_ORDER == G_BIG_ENDIAN gint32 value = GST_READ_UINT24_BE (_in); #else gint32 value = GST_READ_UINT24_LE (_in); #endif if (value & 0x00800000) value |= 0xff000000; v += value / max_value; _in += 3; } out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_int16 (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j, ip = 0; gint16 *in = (gint16 *) _in; gfloat v; for (j = 0; j < len; j++) { v = in[ip++] * 2 + 1; for (i = 1; i < channels; i++) v += in[ip++] * 2 + 1; out[op] = v / channels; op = (op + 1) % nfft; } } static void input_data_mixed_int16_max (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint i, j, ip = 0; gint16 *in = (gint16 *) _in; gfloat v; for (j = 0; j < len; j++) { v = in[ip++] / max_value; for (i = 1; i < channels; i++) v += in[ip++] / max_value; out[op] = v / channels; op = (op + 1) % nfft; } } /* non mixing data readers */ static void input_data_float (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j, ip; gfloat *in = (gfloat *) _in; for (j = 0, ip = 0; j < len; j++, ip += channels) { out[op] = in[ip]; op = (op + 1) % nfft; } } static void input_data_double (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j, ip; gdouble *in = (gdouble *) _in; for (j = 0, ip = 0; j < len; j++, ip += channels) { out[op] = in[ip]; op = (op + 1) % nfft; } } static void input_data_int32 (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j, ip; gint32 *in = (gint32 *) _in; for (j = 0, ip = 0; j < len; j++, ip += channels) { out[op] = in[ip] * 2 + 1; op = (op + 1) % nfft; } } static void input_data_int32_max (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j, ip; gint32 *in = (gint32 *) _in; for (j = 0, ip = 0; j < len; j++, ip += channels) { out[op] = in[ip] / max_value; op = (op + 1) % nfft; } } static void input_data_int24 (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j; for (j = 0; j < len; j++) { #if G_BYTE_ORDER == G_BIG_ENDIAN gint32 v = GST_READ_UINT24_BE (_in); #else gint32 v = GST_READ_UINT24_LE (_in); #endif if (v & 0x00800000) v |= 0xff000000; _in += 3 * channels; out[op] = v * 2 + 1; op = (op + 1) % nfft; } } static void input_data_int24_max (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j; for (j = 0; j < len; j++) { #if G_BYTE_ORDER == G_BIG_ENDIAN gint32 v = GST_READ_UINT24_BE (_in); #else gint32 v = GST_READ_UINT24_LE (_in); #endif if (v & 0x00800000) v |= 0xff000000; _in += 3 * channels; out[op] = v / max_value; op = (op + 1) % nfft; } } static void input_data_int16 (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j, ip; gint16 *in = (gint16 *) _in; for (j = 0, ip = 0; j < len; j++, ip += channels) { out[op] = in[ip] * 2 + 1; op = (op + 1) % nfft; } } static void input_data_int16_max (const guint8 * _in, gfloat * out, guint len, guint channels, gfloat max_value, guint op, guint nfft) { guint j, ip; gint16 *in = (gint16 *) _in; for (j = 0, ip = 0; j < len; j++, ip += channels) { out[op] = in[ip] / max_value; op = (op + 1) % nfft; } } static gboolean gst_spectrum_setup (GstAudioFilter * base, GstRingBufferSpec * format) { GstSpectrum *spectrum = GST_SPECTRUM (base); guint width = format->width / 8; gboolean is_float = (format->type == GST_BUFTYPE_FLOAT); /* max_value will be 0 when depth is 1, * interpret -1 and 0 as -1 and +1 if that's the case. */ guint max_value = (1UL << (format->depth - 1)) - 1; gboolean multi_channel = spectrum->multi_channel; GstSpectrumInputData input_data = NULL; if (is_float) { if (width == 4) { input_data = multi_channel ? input_data_float : input_data_mixed_float; } else if (width == 8) { input_data = multi_channel ? input_data_double : input_data_mixed_double; } else { g_assert_not_reached (); } } else { if (width == 4) { if (max_value) { input_data = multi_channel ? input_data_int32_max : input_data_mixed_int32_max; } else { input_data = multi_channel ? input_data_int32 : input_data_mixed_int32; } } else if (width == 3) { if (max_value) { input_data = multi_channel ? input_data_int24_max : input_data_mixed_int24_max; } else { input_data = multi_channel ? input_data_int24 : input_data_mixed_int24; } } else if (width == 2) { if (max_value) { input_data = multi_channel ? input_data_int16_max : input_data_mixed_int16_max; } else { input_data = multi_channel ? input_data_int16 : input_data_mixed_int16; } } else { g_assert_not_reached (); } } spectrum->input_data = input_data; gst_spectrum_reset_state (spectrum); return TRUE; } static GValue * gst_spectrum_message_add_container (GstStructure * s, GType type, const gchar * name) { GValue v = { 0, }; g_value_init (&v, type); /* will copy-by-value */ gst_structure_set_value (s, name, &v); g_value_unset (&v); return (GValue *) gst_structure_get_value (s, name); } static void gst_spectrum_message_add_list (GValue * cv, gfloat * data, guint num_values) { GValue v = { 0, }; guint i; g_value_init (&v, G_TYPE_FLOAT); for (i = 0; i < num_values; i++) { g_value_set_float (&v, data[i]); gst_value_list_append_value (cv, &v); /* copies by value */ } g_value_unset (&v); } static void gst_spectrum_message_add_array (GValue * cv, gfloat * data, guint num_values) { GValue v = { 0, }; GValue a = { 0, }; guint i; g_value_init (&a, GST_TYPE_ARRAY); g_value_init (&v, G_TYPE_FLOAT); for (i = 0; i < num_values; i++) { g_value_set_float (&v, data[i]); gst_value_array_append_value (&a, &v); /* copies by value */ } g_value_unset (&v); gst_value_array_append_value (cv, &a); /* copies by value */ g_value_unset (&a); } static GstMessage * gst_spectrum_message_new (GstSpectrum * spectrum, GstClockTime timestamp, GstClockTime duration) { GstBaseTransform *trans = GST_BASE_TRANSFORM_CAST (spectrum); GstSpectrumChannel *cd; GstStructure *s; GValue *mcv = NULL, *pcv = NULL; GstClockTime endtime, running_time, stream_time; GST_DEBUG_OBJECT (spectrum, "preparing message, bands =%d ", spectrum->bands); running_time = gst_segment_to_running_time (&trans->segment, GST_FORMAT_TIME, timestamp); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); /* endtime is for backwards compatibility */ endtime = stream_time + duration; s = gst_structure_new ("spectrum", "endtime", GST_TYPE_CLOCK_TIME, endtime, "timestamp", G_TYPE_UINT64, timestamp, "stream-time", G_TYPE_UINT64, stream_time, "running-time", G_TYPE_UINT64, running_time, "duration", G_TYPE_UINT64, duration, NULL); if (!spectrum->multi_channel) { cd = &spectrum->channel_data[0]; if (spectrum->message_magnitude) { /* FIXME 0.11: this should be an array, not a list */ mcv = gst_spectrum_message_add_container (s, GST_TYPE_LIST, "magnitude"); gst_spectrum_message_add_list (mcv, cd->spect_magnitude, spectrum->bands); } if (spectrum->message_phase) { /* FIXME 0.11: this should be an array, not a list */ pcv = gst_spectrum_message_add_container (s, GST_TYPE_LIST, "phase"); gst_spectrum_message_add_list (pcv, cd->spect_phase, spectrum->bands); } } else { guint c; guint channels = GST_AUDIO_FILTER (spectrum)->format.channels; if (spectrum->message_magnitude) { mcv = gst_spectrum_message_add_container (s, GST_TYPE_ARRAY, "magnitude"); } if (spectrum->message_phase) { pcv = gst_spectrum_message_add_container (s, GST_TYPE_ARRAY, "phase"); } for (c = 0; c < channels; c++) { cd = &spectrum->channel_data[c]; if (spectrum->message_magnitude) { gst_spectrum_message_add_array (mcv, cd->spect_magnitude, spectrum->bands); } if (spectrum->message_phase) { gst_spectrum_message_add_array (pcv, cd->spect_magnitude, spectrum->bands); } } } return gst_message_new_element (GST_OBJECT (spectrum), s); } static void gst_spectrum_run_fft (GstSpectrum * spectrum, GstSpectrumChannel * cd, guint input_pos) { guint i; guint bands = spectrum->bands; guint nfft = 2 * bands - 2; gint threshold = spectrum->threshold; gfloat *input = cd->input; gfloat *input_tmp = cd->input_tmp; gfloat *spect_magnitude = cd->spect_magnitude; gfloat *spect_phase = cd->spect_phase; GstFFTF32Complex *freqdata = cd->freqdata; GstFFTF32 *fft_ctx = cd->fft_ctx; for (i = 0; i < nfft; i++) input_tmp[i] = input[(input_pos + i) % nfft]; gst_fft_f32_window (fft_ctx, input_tmp, GST_FFT_WINDOW_HAMMING); gst_fft_f32_fft (fft_ctx, input_tmp, freqdata); if (spectrum->message_magnitude) { gdouble val; /* Calculate magnitude in db */ for (i = 0; i < bands; i++) { val = freqdata[i].r * freqdata[i].r; val += freqdata[i].i * freqdata[i].i; val /= nfft * nfft; val = 10.0 * log10 (val); if (val < threshold) val = threshold; spect_magnitude[i] += val; } } if (spectrum->message_phase) { /* Calculate phase */ for (i = 0; i < bands; i++) spect_phase[i] += atan2 (freqdata[i].i, freqdata[i].r); } } static void gst_spectrum_prepare_message_data (GstSpectrum * spectrum, GstSpectrumChannel * cd) { guint i; guint bands = spectrum->bands; guint num_fft = spectrum->num_fft; /* Calculate average */ if (spectrum->message_magnitude) { gfloat *spect_magnitude = cd->spect_magnitude; for (i = 0; i < bands; i++) spect_magnitude[i] /= num_fft; } if (spectrum->message_phase) { gfloat *spect_phase = cd->spect_phase; for (i = 0; i < bands; i++) spect_phase[i] /= num_fft; } } static void gst_spectrum_reset_message_data (GstSpectrum * spectrum, GstSpectrumChannel * cd) { guint bands = spectrum->bands; gfloat *spect_magnitude = cd->spect_magnitude; gfloat *spect_phase = cd->spect_phase; /* reset spectrum accumulators */ memset (spect_magnitude, 0, bands * sizeof (gfloat)); memset (spect_phase, 0, bands * sizeof (gfloat)); } static GstFlowReturn gst_spectrum_transform_ip (GstBaseTransform * trans, GstBuffer * buffer) { GstSpectrum *spectrum = GST_SPECTRUM (trans); GstRingBufferSpec *format = &GST_AUDIO_FILTER (spectrum)->format; guint rate = format->rate; guint channels = format->channels; guint output_channels = spectrum->multi_channel ? channels : 1; guint c; guint width = format->width / 8; gfloat max_value = (1UL << (format->depth - 1)) - 1; guint bands = spectrum->bands; guint nfft = 2 * bands - 2; guint input_pos; gfloat *input; const guint8 *data = GST_BUFFER_DATA (buffer); guint size = GST_BUFFER_SIZE (buffer); guint frame_size = width * channels; guint fft_todo, msg_todo, block_size; gboolean have_full_interval; GstSpectrumChannel *cd; GstSpectrumInputData input_data; GST_LOG_OBJECT (spectrum, "input size: %d bytes", GST_BUFFER_SIZE (buffer)); if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (spectrum, "Discontinuity detected -- flushing"); gst_spectrum_flush (spectrum); } /* If we don't have a FFT context yet (or it was reset due to parameter * changes) get one and allocate memory for everything */ if (spectrum->channel_data == NULL) { GST_DEBUG_OBJECT (spectrum, "allocating for bands %u", bands); gst_spectrum_alloc_channel_data (spectrum); /* number of sample frames we process before posting a message * interval is in ns */ spectrum->frames_per_interval = gst_util_uint64_scale (spectrum->interval, rate, GST_SECOND); spectrum->frames_todo = spectrum->frames_per_interval; /* rounding error for frames_per_interval in ns, * aggregated it in accumulated_error */ spectrum->error_per_interval = (spectrum->interval * rate) % GST_SECOND; if (spectrum->frames_per_interval == 0) spectrum->frames_per_interval = 1; GST_INFO_OBJECT (spectrum, "interval %" GST_TIME_FORMAT ", fpi %" G_GUINT64_FORMAT ", error %" GST_TIME_FORMAT, GST_TIME_ARGS (spectrum->interval), spectrum->frames_per_interval, GST_TIME_ARGS (spectrum->error_per_interval)); spectrum->input_pos = 0; gst_spectrum_flush (spectrum); } if (spectrum->num_frames == 0) spectrum->message_ts = GST_BUFFER_TIMESTAMP (buffer); input_pos = spectrum->input_pos; input_data = spectrum->input_data; while (size >= frame_size) { /* run input_data for a chunk of data */ fft_todo = nfft - (spectrum->num_frames % nfft); msg_todo = spectrum->frames_todo - spectrum->num_frames; GST_LOG_OBJECT (spectrum, "message frames todo: %u, fft frames todo: %u, input frames %u", msg_todo, fft_todo, (size / frame_size)); block_size = msg_todo; if (block_size > (size / frame_size)) block_size = (size / frame_size); if (block_size > fft_todo) block_size = fft_todo; for (c = 0; c < output_channels; c++) { cd = &spectrum->channel_data[c]; input = cd->input; /* Move the current frames into our ringbuffers */ input_data (data + c * width, input, block_size, channels, max_value, input_pos, nfft); } data += block_size * frame_size; size -= block_size * frame_size; input_pos = (input_pos + block_size) % nfft; spectrum->num_frames += block_size; have_full_interval = (spectrum->num_frames == spectrum->frames_todo); GST_LOG_OBJECT (spectrum, "size: %u, do-fft = %d, do-message = %d", size, (spectrum->num_frames % nfft == 0), have_full_interval); /* If we have enough frames for an FFT or we have all frames required for * the interval and we haven't run a FFT, then run an FFT */ if ((spectrum->num_frames % nfft == 0) || (have_full_interval && !spectrum->num_fft)) { for (c = 0; c < output_channels; c++) { cd = &spectrum->channel_data[c]; gst_spectrum_run_fft (spectrum, cd, input_pos); } spectrum->num_fft++; } /* Do we have the FFTs for one interval? */ if (have_full_interval) { GST_DEBUG_OBJECT (spectrum, "nfft: %u frames: %" G_GUINT64_FORMAT " fpi: %" G_GUINT64_FORMAT " error: %" GST_TIME_FORMAT, nfft, spectrum->num_frames, spectrum->frames_per_interval, GST_TIME_ARGS (spectrum->accumulated_error)); spectrum->frames_todo = spectrum->frames_per_interval; if (spectrum->accumulated_error >= GST_SECOND) { spectrum->accumulated_error -= GST_SECOND; spectrum->frames_todo++; } spectrum->accumulated_error += spectrum->error_per_interval; if (spectrum->post_messages) { GstMessage *m; for (c = 0; c < output_channels; c++) { cd = &spectrum->channel_data[c]; gst_spectrum_prepare_message_data (spectrum, cd); } m = gst_spectrum_message_new (spectrum, spectrum->message_ts, spectrum->interval); gst_element_post_message (GST_ELEMENT (spectrum), m); } if (GST_CLOCK_TIME_IS_VALID (spectrum->message_ts)) spectrum->message_ts += gst_util_uint64_scale (spectrum->num_frames, GST_SECOND, rate); for (c = 0; c < output_channels; c++) { cd = &spectrum->channel_data[c]; gst_spectrum_reset_message_data (spectrum, cd); } spectrum->num_frames = 0; spectrum->num_fft = 0; } } spectrum->input_pos = input_pos; g_assert (size == 0); return GST_FLOW_OK; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "spectrum", GST_RANK_NONE, GST_TYPE_SPECTRUM); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "spectrum", "Run an FFT on the audio signal, output spectrum data", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/spectrum/README0000644000175000017500000000053211671175354015330 00000000000000This is a simple, rather lame spectrum analyzer made from the fix_fft.c code, as found I think in xmms-0.9.1 (the 75-wide output sounds like xmms to me), which is actually written by other people (see fix_fft.c for credits). It worked last time I had GiST working, which was a while ago. Yes, GiST is not included here yet, it will be in 0.1.0. gst-plugins-good-0.10.31/gst/spectrum/Makefile.in0000644000175000017500000006675211720560235016524 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/spectrum DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstspectrum_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstspectrum_la_OBJECTS = libgstspectrum_la-gstspectrum.lo libgstspectrum_la_OBJECTS = $(am_libgstspectrum_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstspectrum_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstspectrum_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstspectrum_la_CFLAGS) $(CFLAGS) \ $(libgstspectrum_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstspectrum_la_SOURCES) DIST_SOURCES = $(libgstspectrum_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstspectrum.la libgstspectrum_la_SOURCES = gstspectrum.c libgstspectrum_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstspectrum_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstfft-$(GST_MAJORMINOR) -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstspectrum_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstspectrum_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstspectrum.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/spectrum/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/spectrum/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstspectrum.la: $(libgstspectrum_la_OBJECTS) $(libgstspectrum_la_DEPENDENCIES) $(EXTRA_libgstspectrum_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstspectrum_la_LINK) -rpath $(plugindir) $(libgstspectrum_la_OBJECTS) $(libgstspectrum_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstspectrum_la-gstspectrum.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstspectrum_la-gstspectrum.lo: gstspectrum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspectrum_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspectrum_la_CFLAGS) $(CFLAGS) -MT libgstspectrum_la-gstspectrum.lo -MD -MP -MF $(DEPDIR)/libgstspectrum_la-gstspectrum.Tpo -c -o libgstspectrum_la-gstspectrum.lo `test -f 'gstspectrum.c' || echo '$(srcdir)/'`gstspectrum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstspectrum_la-gstspectrum.Tpo $(DEPDIR)/libgstspectrum_la-gstspectrum.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstspectrum.c' object='libgstspectrum_la-gstspectrum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstspectrum_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstspectrum_la_CFLAGS) $(CFLAGS) -c -o libgstspectrum_la-gstspectrum.lo `test -f 'gstspectrum.c' || echo '$(srcdir)/'`gstspectrum.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstspectrum -:SHARED libgstspectrum \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstspectrum_la_SOURCES) \ $(nodist_libgstspectrum_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstspectrum_la_CFLAGS) \ -:LDFLAGS $(libgstspectrum_la_LDFLAGS) \ $(libgstspectrum_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/interleave/0000755000175000017500000000000011720565302015013 500000000000000gst-plugins-good-0.10.31/gst/interleave/Makefile.am0000644000175000017500000000175611671175353017010 00000000000000 plugin_LTLIBRARIES = libgstinterleave.la libgstinterleave_la_SOURCES = plugin.c interleave.c deinterleave.c libgstinterleave_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstinterleave_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) libgstinterleave_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstinterleave_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = plugin.h interleave.h deinterleave.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstinterleave -:SHARED libgstinterleave \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstinterleave_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstinterleave_la_CFLAGS) \ -:LDFLAGS $(libgstinterleave_la_LDFLAGS) \ $(libgstinterleave_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/interleave/interleave.c0000644000175000017500000011240711677341655017260 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2005 Wim Taymans * 2007 Andy Wingo * 2008 Sebastian Dröge * * interleave.c: interleave samples, mostly based on adder. * * 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. */ /* TODO: * - handle caps changes * - handle more queries/events */ /** * SECTION:element-interleave * @see_also: deinterleave * * Merges separate mono inputs into one interleaved stream. * * This element handles all raw floating point sample formats and all signed integer sample formats. The first * caps on one of the sinkpads will set the caps of the output so usually an audioconvert element should be * placed before every sinkpad of interleave. * * It's possible to change the number of channels while the pipeline is running by adding or removing * some of the request pads but this will change the caps of the output buffers. Changing the input * caps is _not_ supported yet. * * The channel number of every sinkpad in the out can be retrieved from the "channel" property of the pad. * * * Example launch line * |[ * gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav d.src0 ! queue ! audioconvert ! i.sink1 d.src1 ! queue ! audioconvert ! i.sink0 * ]| Decodes and deinterleaves a Stereo MP3 file into separate channels and * then interleaves the channels again to a WAV file with the channel with the * channels exchanged. * |[ * gst-launch interleave name=i ! audioconvert ! wavenc ! filesink location=file.wav filesrc location=file1.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink0 filesrc location=file2.wav ! decodebin ! audioconvert ! "audio/x-raw-int,channels=1" ! queue ! i.sink1 * ]| Interleaves two Mono WAV files to a single Stereo WAV file. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "interleave.h" #include GST_DEBUG_CATEGORY_STATIC (gst_interleave_debug); #define GST_CAT_DEFAULT gst_interleave_debug static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) 1, " "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " "width = (int) { 8, 16, 24, 32 }, " "depth = (int) [ 1, 32 ], " "signed = (boolean) true; " "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) 1, " "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " "width = (int) { 32, 64 }") ); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " "width = (int) { 8, 16, 24, 32 }, " "depth = (int) [ 1, 32 ], " "signed = (boolean) true; " "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " "width = (int) { 32, 64 }") ); #define MAKE_FUNC(type) \ static void interleave_##type (guint##type *out, guint##type *in, \ guint stride, guint nframes) \ { \ gint i; \ \ for (i = 0; i < nframes; i++) { \ *out = in[i]; \ out += stride; \ } \ } MAKE_FUNC (8); MAKE_FUNC (16); MAKE_FUNC (32); MAKE_FUNC (64); static void interleave_24 (guint8 * out, guint8 * in, guint stride, guint nframes) { gint i; for (i = 0; i < nframes; i++) { memcpy (out, in, 3); out += stride * 3; in += 3; } } typedef struct { GstPad parent; guint channel; } GstInterleavePad; enum { PROP_PAD_0, PROP_PAD_CHANNEL }; static void gst_interleave_pad_class_init (GstPadClass * klass); #define GST_TYPE_INTERLEAVE_PAD (gst_interleave_pad_get_type()) #define GST_INTERLEAVE_PAD(pad) (G_TYPE_CHECK_INSTANCE_CAST((pad),GST_TYPE_INTERLEAVE_PAD,GstInterleavePad)) #define GST_INTERLEAVE_PAD_CAST(pad) ((GstInterleavePad *) pad) #define GST_IS_INTERLEAVE_PAD(pad) (G_TYPE_CHECK_INSTANCE_TYPE((pad),GST_TYPE_INTERLEAVE_PAD)) static GType gst_interleave_pad_get_type (void) { static GType type = 0; if (G_UNLIKELY (type == 0)) { type = g_type_register_static_simple (GST_TYPE_PAD, g_intern_static_string ("GstInterleavePad"), sizeof (GstPadClass), (GClassInitFunc) gst_interleave_pad_class_init, sizeof (GstInterleavePad), NULL, 0); } return type; } static void gst_interleave_pad_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstInterleavePad *self = GST_INTERLEAVE_PAD (object); switch (prop_id) { case PROP_PAD_CHANNEL: g_value_set_uint (value, self->channel); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_interleave_pad_class_init (GstPadClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->get_property = gst_interleave_pad_get_property; g_object_class_install_property (gobject_class, PROP_PAD_CHANNEL, g_param_spec_uint ("channel", "Channel number", "Number of the channel of this pad in the output", 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } GST_BOILERPLATE (GstInterleave, gst_interleave, GstElement, GST_TYPE_ELEMENT); enum { PROP_0, PROP_CHANNEL_POSITIONS, PROP_CHANNEL_POSITIONS_FROM_INPUT }; static void gst_interleave_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_interleave_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstPad *gst_interleave_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_interleave_release_pad (GstElement * element, GstPad * pad); static GstStateChangeReturn gst_interleave_change_state (GstElement * element, GstStateChange transition); static gboolean gst_interleave_src_query (GstPad * pad, GstQuery * query); static gboolean gst_interleave_src_event (GstPad * pad, GstEvent * event); static gboolean gst_interleave_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_interleave_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_interleave_sink_getcaps (GstPad * pad); static GstFlowReturn gst_interleave_collected (GstCollectPads * pads, GstInterleave * self); static void gst_interleave_finalize (GObject * object) { GstInterleave *self = GST_INTERLEAVE (object); if (self->collect) { gst_object_unref (self->collect); self->collect = NULL; } if (self->channel_positions && self->channel_positions != self->input_channel_positions) { g_value_array_free (self->channel_positions); self->channel_positions = NULL; } if (self->input_channel_positions) { g_value_array_free (self->input_channel_positions); self->input_channel_positions = NULL; } gst_caps_replace (&self->sinkcaps, NULL); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_interleave_check_channel_positions (GValueArray * positions) { gint i; guint channels; GstAudioChannelPosition *pos; gboolean ret; channels = positions->n_values; pos = g_new (GstAudioChannelPosition, positions->n_values); for (i = 0; i < channels; i++) { GValue *v = g_value_array_get_nth (positions, i); pos[i] = g_value_get_enum (v); } ret = gst_audio_check_channel_positions (pos, channels); g_free (pos); return ret; } static void gst_interleave_set_channel_positions (GstInterleave * self, GstStructure * s) { GValue pos_array = { 0, }; gint i; g_value_init (&pos_array, GST_TYPE_ARRAY); if (self->channel_positions && self->channels == self->channel_positions->n_values && gst_interleave_check_channel_positions (self->channel_positions)) { GST_DEBUG_OBJECT (self, "Using provided channel positions"); for (i = 0; i < self->channels; i++) gst_value_array_append_value (&pos_array, g_value_array_get_nth (self->channel_positions, i)); } else { GValue pos_none = { 0, }; GST_WARNING_OBJECT (self, "Using NONE channel positions"); g_value_init (&pos_none, GST_TYPE_AUDIO_CHANNEL_POSITION); g_value_set_enum (&pos_none, GST_AUDIO_CHANNEL_POSITION_NONE); for (i = 0; i < self->channels; i++) gst_value_array_append_value (&pos_array, &pos_none); g_value_unset (&pos_none); } gst_structure_set_value (s, "channel-positions", &pos_array); g_value_unset (&pos_array); } static void gst_interleave_base_init (gpointer g_class) { gst_element_class_set_details_simple (g_class, "Audio interleaver", "Filter/Converter/Audio", "Folds many mono channels into one interleaved audio stream", "Andy Wingo , " "Sebastian Dröge "); gst_element_class_add_static_pad_template (g_class, &sink_template); gst_element_class_add_static_pad_template (g_class, &src_template); } static void gst_interleave_class_init (GstInterleaveClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); gstelement_class = GST_ELEMENT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (gst_interleave_debug, "interleave", 0, "interleave element"); /* Reference GstInterleavePad class to have the type registered from * a threadsafe context */ g_type_class_ref (GST_TYPE_INTERLEAVE_PAD); gobject_class->finalize = gst_interleave_finalize; gobject_class->set_property = gst_interleave_set_property; gobject_class->get_property = gst_interleave_get_property; /** * GstInterleave:channel-positions * * Channel positions: This property controls the channel positions * that are used on the src caps. The number of elements should be * the same as the number of sink pads and the array should contain * a valid list of channel positions. The n-th element of the array * is the position of the n-th sink pad. * * These channel positions will only be used if they're valid and the * number of elements is the same as the number of channels. If this * is not given a NONE layout will be used. * */ g_object_class_install_property (gobject_class, PROP_CHANNEL_POSITIONS, g_param_spec_value_array ("channel-positions", "Channel positions", "Channel positions used on the output", g_param_spec_enum ("channel-position", "Channel position", "Channel position of the n-th input", GST_TYPE_AUDIO_CHANNEL_POSITION, GST_AUDIO_CHANNEL_POSITION_NONE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS), G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstInterleave:channel-positions-from-input * * Channel positions from input: If this property is set to %TRUE the channel * positions will be taken from the input caps if valid channel positions for * the output can be constructed from them. If this is set to %TRUE setting the * channel-positions property overwrites this property again. * */ g_object_class_install_property (gobject_class, PROP_CHANNEL_POSITIONS_FROM_INPUT, g_param_spec_boolean ("channel-positions-from-input", "Channel positions from input", "Take channel positions from the input", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_interleave_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_interleave_release_pad); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_interleave_change_state); } static void gst_interleave_init (GstInterleave * self, GstInterleaveClass * klass) { self->src = gst_pad_new_from_static_template (&src_template, "src"); gst_pad_set_query_function (self->src, GST_DEBUG_FUNCPTR (gst_interleave_src_query)); gst_pad_set_event_function (self->src, GST_DEBUG_FUNCPTR (gst_interleave_src_event)); gst_element_add_pad (GST_ELEMENT (self), self->src); self->collect = gst_collect_pads_new (); gst_collect_pads_set_function (self->collect, (GstCollectPadsFunction) gst_interleave_collected, self); self->input_channel_positions = g_value_array_new (0); self->channel_positions_from_input = TRUE; self->channel_positions = self->input_channel_positions; } static void gst_interleave_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstInterleave *self = GST_INTERLEAVE (object); switch (prop_id) { case PROP_CHANNEL_POSITIONS: if (self->channel_positions && self->channel_positions != self->input_channel_positions) g_value_array_free (self->channel_positions); self->channel_positions = g_value_dup_boxed (value); self->channel_positions_from_input = FALSE; break; case PROP_CHANNEL_POSITIONS_FROM_INPUT: self->channel_positions_from_input = g_value_get_boolean (value); if (self->channel_positions_from_input) { if (self->channel_positions && self->channel_positions != self->input_channel_positions) g_value_array_free (self->channel_positions); self->channel_positions = self->input_channel_positions; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_interleave_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstInterleave *self = GST_INTERLEAVE (object); switch (prop_id) { case PROP_CHANNEL_POSITIONS: g_value_set_boxed (value, self->channel_positions); break; case PROP_CHANNEL_POSITIONS_FROM_INPUT: g_value_set_boolean (value, self->channel_positions_from_input); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstPad * gst_interleave_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstInterleave *self = GST_INTERLEAVE (element); GstPad *new_pad; gchar *pad_name; gint channels, padnumber; GValue val = { 0, }; if (templ->direction != GST_PAD_SINK) goto not_sink_pad; #if GLIB_CHECK_VERSION(2,29,5) channels = g_atomic_int_add (&self->channels, 1); padnumber = g_atomic_int_add (&self->padcounter, 1); #else channels = g_atomic_int_exchange_and_add (&self->channels, 1); padnumber = g_atomic_int_exchange_and_add (&self->padcounter, 1); #endif pad_name = g_strdup_printf ("sink%d", padnumber); new_pad = GST_PAD_CAST (g_object_new (GST_TYPE_INTERLEAVE_PAD, "name", pad_name, "direction", templ->direction, "template", templ, NULL)); GST_INTERLEAVE_PAD_CAST (new_pad)->channel = channels; GST_DEBUG_OBJECT (self, "requested new pad %s", pad_name); g_free (pad_name); gst_pad_set_setcaps_function (new_pad, GST_DEBUG_FUNCPTR (gst_interleave_sink_setcaps)); gst_pad_set_getcaps_function (new_pad, GST_DEBUG_FUNCPTR (gst_interleave_sink_getcaps)); gst_collect_pads_add_pad (self->collect, new_pad, sizeof (GstCollectData)); /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events */ self->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (new_pad); gst_pad_set_event_function (new_pad, GST_DEBUG_FUNCPTR (gst_interleave_sink_event)); if (!gst_element_add_pad (element, new_pad)) goto could_not_add; g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION); g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_NONE); self->input_channel_positions = g_value_array_append (self->input_channel_positions, &val); g_value_unset (&val); /* Update the src caps if we already have them */ if (self->sinkcaps) { GstCaps *srccaps; GstStructure *s; /* Take lock to make sure processing finishes first */ GST_OBJECT_LOCK (self->collect); srccaps = gst_caps_copy (self->sinkcaps); s = gst_caps_get_structure (srccaps, 0); gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL); gst_interleave_set_channel_positions (self, s); gst_pad_set_caps (self->src, srccaps); gst_caps_unref (srccaps); GST_OBJECT_UNLOCK (self->collect); } return new_pad; /* errors */ not_sink_pad: { g_warning ("interleave: requested new pad that is not a SINK pad\n"); return NULL; } could_not_add: { GST_DEBUG_OBJECT (self, "could not add pad %s", GST_PAD_NAME (new_pad)); gst_collect_pads_remove_pad (self->collect, new_pad); gst_object_unref (new_pad); return NULL; } } static void gst_interleave_release_pad (GstElement * element, GstPad * pad) { GstInterleave *self = GST_INTERLEAVE (element); GList *l; g_return_if_fail (GST_IS_INTERLEAVE_PAD (pad)); /* Take lock to make sure we're not changing this when processing buffers */ GST_OBJECT_LOCK (self->collect); g_atomic_int_add (&self->channels, -1); g_value_array_remove (self->input_channel_positions, GST_INTERLEAVE_PAD_CAST (pad)->channel); /* Update channel numbers */ GST_OBJECT_LOCK (self); for (l = GST_ELEMENT_CAST (self)->sinkpads; l != NULL; l = l->next) { GstInterleavePad *ipad = GST_INTERLEAVE_PAD (l->data); if (GST_INTERLEAVE_PAD_CAST (pad)->channel < ipad->channel) ipad->channel--; } GST_OBJECT_UNLOCK (self); /* Update the src caps if we already have them */ if (self->sinkcaps) { if (self->channels > 0) { GstCaps *srccaps; GstStructure *s; srccaps = gst_caps_copy (self->sinkcaps); s = gst_caps_get_structure (srccaps, 0); gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL); gst_interleave_set_channel_positions (self, s); gst_pad_set_caps (self->src, srccaps); gst_caps_unref (srccaps); } else { gst_caps_replace (&self->sinkcaps, NULL); gst_pad_set_caps (self->src, NULL); } } GST_OBJECT_UNLOCK (self->collect); gst_collect_pads_remove_pad (self->collect, pad); gst_element_remove_pad (element, pad); } static GstStateChangeReturn gst_interleave_change_state (GstElement * element, GstStateChange transition) { GstInterleave *self; GstStateChangeReturn ret; self = GST_INTERLEAVE (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: self->timestamp = 0; self->offset = 0; self->segment_pending = TRUE; self->segment_position = 0; self->segment_rate = 1.0; gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); gst_collect_pads_start (self->collect); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } /* Stop before calling the parent's state change function as * GstCollectPads might take locks and we would deadlock in that * case */ if (transition == GST_STATE_CHANGE_PAUSED_TO_READY) gst_collect_pads_stop (self->collect); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_pad_set_caps (self->src, NULL); gst_caps_replace (&self->sinkcaps, NULL); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static void __remove_channels (GstCaps * caps) { GstStructure *s; gint i, size; size = gst_caps_get_size (caps); for (i = 0; i < size; i++) { s = gst_caps_get_structure (caps, i); gst_structure_remove_field (s, "channel-positions"); gst_structure_remove_field (s, "channels"); } } static void __set_channels (GstCaps * caps, gint channels) { GstStructure *s; gint i, size; size = gst_caps_get_size (caps); for (i = 0; i < size; i++) { s = gst_caps_get_structure (caps, i); if (channels > 0) gst_structure_set (s, "channels", G_TYPE_INT, channels, NULL); else gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); } } /* we can only accept caps that we and downstream can handle. */ static GstCaps * gst_interleave_sink_getcaps (GstPad * pad) { GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); GstCaps *result, *peercaps, *sinkcaps; GST_OBJECT_LOCK (self); /* If we already have caps on one of the sink pads return them */ if (self->sinkcaps) { result = gst_caps_copy (self->sinkcaps); } else { /* get the downstream possible caps */ peercaps = gst_pad_peer_get_caps (self->src); /* get the allowed caps on this sinkpad */ sinkcaps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); __remove_channels (sinkcaps); if (peercaps) { __remove_channels (peercaps); /* if the peer has caps, intersect */ GST_DEBUG_OBJECT (pad, "intersecting peer and template caps"); result = gst_caps_intersect (peercaps, sinkcaps); gst_caps_unref (peercaps); gst_caps_unref (sinkcaps); } else { /* the peer has no caps (or there is no peer), just use the allowed caps * of this sinkpad. */ GST_DEBUG_OBJECT (pad, "no peer caps, using sinkcaps"); result = sinkcaps; } __set_channels (result, 1); } GST_OBJECT_UNLOCK (self); gst_object_unref (self); GST_DEBUG_OBJECT (pad, "Returning caps %" GST_PTR_FORMAT, result); return result; } static void gst_interleave_set_process_function (GstInterleave * self) { switch (self->width) { case 8: self->func = (GstInterleaveFunc) interleave_8; break; case 16: self->func = (GstInterleaveFunc) interleave_16; break; case 24: self->func = (GstInterleaveFunc) interleave_24; break; case 32: self->func = (GstInterleaveFunc) interleave_32; break; case 64: self->func = (GstInterleaveFunc) interleave_64; break; default: g_assert_not_reached (); break; } } static gboolean gst_interleave_sink_setcaps (GstPad * pad, GstCaps * caps) { GstInterleave *self; g_return_val_if_fail (GST_IS_INTERLEAVE_PAD (pad), FALSE); self = GST_INTERLEAVE (gst_pad_get_parent (pad)); /* First caps that are set on a sink pad are used as output caps */ /* TODO: handle caps changes */ if (self->sinkcaps && !gst_caps_is_subset (caps, self->sinkcaps)) { goto cannot_change_caps; } else { GstCaps *srccaps; GstStructure *s; gboolean res; s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "width", &self->width)) goto no_width; if (!gst_structure_get_int (s, "rate", &self->rate)) goto no_rate; gst_interleave_set_process_function (self); if (gst_structure_has_field (s, "channel-positions")) { const GValue *pos_array; pos_array = gst_structure_get_value (s, "channel-positions"); if (GST_VALUE_HOLDS_ARRAY (pos_array) && gst_value_array_get_size (pos_array) == 1) { const GValue *pos = gst_value_array_get_value (pos_array, 0); GValue *apos = g_value_array_get_nth (self->input_channel_positions, GST_INTERLEAVE_PAD_CAST (pad)->channel); g_value_set_enum (apos, g_value_get_enum (pos)); } } srccaps = gst_caps_copy (caps); s = gst_caps_get_structure (srccaps, 0); gst_structure_set (s, "channels", G_TYPE_INT, self->channels, NULL); gst_interleave_set_channel_positions (self, s); res = gst_pad_set_caps (self->src, srccaps); gst_caps_unref (srccaps); if (!res) goto src_did_not_accept; } if (!self->sinkcaps) { GstCaps *sinkcaps = gst_caps_copy (caps); GstStructure *s = gst_caps_get_structure (sinkcaps, 0); gst_structure_remove_field (s, "channel-positions"); gst_caps_replace (&self->sinkcaps, sinkcaps); gst_caps_unref (sinkcaps); } gst_object_unref (self); return TRUE; cannot_change_caps: { GST_WARNING_OBJECT (self, "caps of %" GST_PTR_FORMAT " already set, can't " "change", self->sinkcaps); gst_object_unref (self); return FALSE; } src_did_not_accept: { GST_WARNING_OBJECT (self, "src did not accept setcaps()"); gst_object_unref (self); return FALSE; } no_width: { GST_WARNING_OBJECT (self, "caps did not have width: %" GST_PTR_FORMAT, caps); gst_object_unref (self); return FALSE; } no_rate: { GST_WARNING_OBJECT (self, "caps did not have rate: %" GST_PTR_FORMAT, caps); gst_object_unref (self); return FALSE; } } static gboolean gst_interleave_sink_event (GstPad * pad, GstEvent * event) { GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); gboolean ret; GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: /* mark a pending new segment. This event is synchronized * with the streaming thread so we can safely update the * variable without races. It's somewhat weird because we * assume the collectpads forwarded the FLUSH_STOP past us * and downstream (using our source pad, the bastard!). */ self->segment_pending = TRUE; break; default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ ret = self->collect_event (pad, event); gst_object_unref (self); return ret; } static gboolean gst_interleave_src_query_duration (GstInterleave * self, GstQuery * query) { gint64 max; gboolean res; GstFormat format; GstIterator *it; gboolean done; /* parse format */ gst_query_parse_duration (query, &format, NULL); max = -1; res = TRUE; done = FALSE; /* Take maximum of all durations */ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); while (!done) { GstIteratorResult ires; gpointer item; ires = gst_iterator_next (it, &item); switch (ires) { case GST_ITERATOR_DONE: done = TRUE; break; case GST_ITERATOR_OK: { GstPad *pad = GST_PAD_CAST (item); gint64 duration; /* ask sink peer for duration */ res &= gst_pad_query_peer_duration (pad, &format, &duration); /* take max from all valid return values */ if (res) { /* valid unknown length, stop searching */ if (duration == -1) { max = duration; done = TRUE; } /* else see if bigger than current max */ else if (duration > max) max = duration; } gst_object_unref (pad); break; } case GST_ITERATOR_RESYNC: max = -1; res = TRUE; gst_iterator_resync (it); break; default: res = FALSE; done = TRUE; break; } } gst_iterator_free (it); if (res) { /* If in bytes format we have to multiply with the number of channels * to get the correct results. All other formats should be fine */ if (format == GST_FORMAT_BYTES && max != -1) max *= self->channels; /* and store the max */ GST_DEBUG_OBJECT (self, "Total duration in format %s: %" GST_TIME_FORMAT, gst_format_get_name (format), GST_TIME_ARGS (max)); gst_query_set_duration (query, format, max); } return res; } static gboolean gst_interleave_src_query_latency (GstInterleave * self, GstQuery * query) { GstClockTime min, max; gboolean live; gboolean res; GstIterator *it; gboolean done; res = TRUE; done = FALSE; live = FALSE; min = 0; max = GST_CLOCK_TIME_NONE; /* Take maximum of all latency values */ it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); while (!done) { GstIteratorResult ires; gpointer item; ires = gst_iterator_next (it, &item); switch (ires) { case GST_ITERATOR_DONE: done = TRUE; break; case GST_ITERATOR_OK: { GstPad *pad = GST_PAD_CAST (item); GstQuery *peerquery; GstClockTime min_cur, max_cur; gboolean live_cur; peerquery = gst_query_new_latency (); /* Ask peer for latency */ res &= gst_pad_peer_query (pad, peerquery); /* take max from all valid return values */ if (res) { gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur); if (min_cur > min) min = min_cur; if (max_cur != GST_CLOCK_TIME_NONE && ((max != GST_CLOCK_TIME_NONE && max_cur > max) || (max == GST_CLOCK_TIME_NONE))) max = max_cur; live = live || live_cur; } gst_query_unref (peerquery); gst_object_unref (pad); break; } case GST_ITERATOR_RESYNC: live = FALSE; min = 0; max = GST_CLOCK_TIME_NONE; res = TRUE; gst_iterator_resync (it); break; default: res = FALSE; done = TRUE; break; } } gst_iterator_free (it); if (res) { /* store the results */ GST_DEBUG_OBJECT (self, "Calculated total latency: live %s, min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, (live ? "yes" : "no"), GST_TIME_ARGS (min), GST_TIME_ARGS (max)); gst_query_set_latency (query, live, min, max); } return res; } static gboolean gst_interleave_src_query (GstPad * pad, GstQuery * query) { GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: /* FIXME, bring to stream time, might be tricky */ gst_query_set_position (query, format, self->timestamp); res = TRUE; break; case GST_FORMAT_BYTES: gst_query_set_position (query, format, self->offset * self->channels * self->width); res = TRUE; break; case GST_FORMAT_DEFAULT: gst_query_set_position (query, format, self->offset); res = TRUE; break; default: break; } break; } case GST_QUERY_DURATION: res = gst_interleave_src_query_duration (self, query); break; case GST_QUERY_LATENCY: res = gst_interleave_src_query_latency (self, query); break; default: /* FIXME, needs a custom query handler because we have multiple * sinkpads */ res = gst_pad_query_default (pad, query); break; } gst_object_unref (self); return res; } static gboolean forward_event_func (GstPad * pad, GValue * ret, GstEvent * event) { gst_event_ref (event); GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event)); if (!gst_pad_push_event (pad, event)) { g_value_set_boolean (ret, FALSE); GST_WARNING_OBJECT (pad, "Sending event %p (%s) failed.", event, GST_EVENT_TYPE_NAME (event)); } else { GST_LOG_OBJECT (pad, "Sent event %p (%s).", event, GST_EVENT_TYPE_NAME (event)); } gst_object_unref (pad); return TRUE; } static gboolean forward_event (GstInterleave * self, GstEvent * event) { GstIterator *it; GValue vret = { 0 }; GST_LOG_OBJECT (self, "Forwarding event %p (%s)", event, GST_EVENT_TYPE_NAME (event)); g_value_init (&vret, G_TYPE_BOOLEAN); g_value_set_boolean (&vret, TRUE); it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (self)); gst_iterator_fold (it, (GstIteratorFoldFunction) forward_event_func, &vret, event); gst_iterator_free (it); gst_event_unref (event); return g_value_get_boolean (&vret); } static gboolean gst_interleave_src_event (GstPad * pad, GstEvent * event) { GstInterleave *self = GST_INTERLEAVE (gst_pad_get_parent (pad)); gboolean result; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS: /* QoS might be tricky */ result = FALSE; break; case GST_EVENT_SEEK: { GstSeekFlags flags; GstSeekType curtype; gint64 cur; /* parse the seek parameters */ gst_event_parse_seek (event, &self->segment_rate, NULL, &flags, &curtype, &cur, NULL, NULL); /* check if we are flushing */ if (flags & GST_SEEK_FLAG_FLUSH) { /* make sure we accept nothing anymore and return WRONG_STATE */ gst_collect_pads_set_flushing (self->collect, TRUE); /* flushing seek, start flush downstream, the flush will be done * when all pads received a FLUSH_STOP. */ gst_pad_push_event (self->src, gst_event_new_flush_start ()); } /* now wait for the collected to be finished and mark a new * segment */ GST_OBJECT_LOCK (self->collect); if (curtype == GST_SEEK_TYPE_SET) self->segment_position = cur; else self->segment_position = 0; self->segment_pending = TRUE; GST_OBJECT_UNLOCK (self->collect); result = forward_event (self, event); break; } case GST_EVENT_NAVIGATION: /* navigation is rather pointless. */ result = FALSE; break; default: /* just forward the rest for now */ result = forward_event (self, event); break; } gst_object_unref (self); return result; } static GstFlowReturn gst_interleave_collected (GstCollectPads * pads, GstInterleave * self) { guint size; GstBuffer *outbuf; GstFlowReturn ret = GST_FLOW_OK; GSList *collected; guint nsamples; guint ncollected = 0; gboolean empty = TRUE; gint width = self->width / 8; g_return_val_if_fail (self->func != NULL, GST_FLOW_NOT_NEGOTIATED); g_return_val_if_fail (self->width > 0, GST_FLOW_NOT_NEGOTIATED); g_return_val_if_fail (self->channels > 0, GST_FLOW_NOT_NEGOTIATED); g_return_val_if_fail (self->rate > 0, GST_FLOW_NOT_NEGOTIATED); size = gst_collect_pads_available (pads); g_return_val_if_fail (size % width == 0, GST_FLOW_ERROR); GST_DEBUG_OBJECT (self, "Starting to collect %u bytes from %d channels", size, self->channels); nsamples = size / width; ret = gst_pad_alloc_buffer (self->src, GST_BUFFER_OFFSET_NONE, size * self->channels, GST_PAD_CAPS (self->src), &outbuf); if (ret != GST_FLOW_OK) { return ret; } else if (outbuf == NULL || GST_BUFFER_SIZE (outbuf) < size * self->channels) { gst_buffer_unref (outbuf); return GST_FLOW_NOT_NEGOTIATED; } else if (!gst_caps_is_equal (GST_BUFFER_CAPS (outbuf), GST_PAD_CAPS (self->src))) { gst_buffer_unref (outbuf); return GST_FLOW_NOT_NEGOTIATED; } memset (GST_BUFFER_DATA (outbuf), 0, size * self->channels); for (collected = pads->data; collected != NULL; collected = collected->next) { GstCollectData *cdata; GstBuffer *inbuf; guint8 *outdata; cdata = (GstCollectData *) collected->data; inbuf = gst_collect_pads_take_buffer (pads, cdata, size); if (inbuf == NULL) { GST_DEBUG_OBJECT (cdata->pad, "No buffer available"); goto next; } ncollected++; if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_GAP)) goto next; empty = FALSE; outdata = GST_BUFFER_DATA (outbuf) + width * GST_INTERLEAVE_PAD_CAST (cdata->pad)->channel; self->func (outdata, GST_BUFFER_DATA (inbuf), self->channels, nsamples); next: if (inbuf) gst_buffer_unref (inbuf); } if (ncollected == 0) goto eos; if (self->segment_pending) { GstEvent *event; event = gst_event_new_new_segment_full (FALSE, self->segment_rate, 1.0, GST_FORMAT_TIME, self->timestamp, -1, self->segment_position); gst_pad_push_event (self->src, event); self->segment_pending = FALSE; self->segment_position = 0; } GST_BUFFER_TIMESTAMP (outbuf) = self->timestamp; GST_BUFFER_OFFSET (outbuf) = self->offset; self->offset += nsamples; self->timestamp = gst_util_uint64_scale_int (self->offset, GST_SECOND, self->rate); GST_BUFFER_DURATION (outbuf) = self->timestamp - GST_BUFFER_TIMESTAMP (outbuf); if (empty) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP); GST_LOG_OBJECT (self, "pushing outbuf, timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); ret = gst_pad_push (self->src, outbuf); return ret; eos: { GST_DEBUG_OBJECT (self, "no data available, must be EOS"); gst_buffer_unref (outbuf); gst_pad_push_event (self->src, gst_event_new_eos ()); return GST_FLOW_UNEXPECTED; } } gst-plugins-good-0.10.31/gst/interleave/plugin.c0000644000175000017500000000266011671175353016411 00000000000000/* GStreamer interleave plugin * Copyright (C) 2004,2007 Andy Wingo * * plugin.c: the stubs for the interleave plugin * * 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 "plugin.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "interleave", GST_RANK_NONE, gst_interleave_get_type ()) || !gst_element_register (plugin, "deinterleave", GST_RANK_NONE, gst_deinterleave_get_type ())) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "interleave", "Audio interleaver/deinterleaver", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/interleave/deinterleave.h0000644000175000017500000000470511671175353017571 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2005 Wim Taymans * 2007 Andy Wingo * 2008 Sebastian Dröge * * deinterleave.c: deinterleave samples * * 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 __DEINTERLEAVE_H__ #define __DEINTERLEAVE_H__ G_BEGIN_DECLS #include #include #define GST_TYPE_DEINTERLEAVE (gst_deinterleave_get_type()) #define GST_DEINTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEINTERLEAVE,GstDeinterleave)) #define GST_DEINTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEINTERLEAVE,GstDeinterleaveClass)) #define GST_DEINTERLEAVE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_DEINTERLEAVE,GstDeinterleaveClass)) #define GST_IS_DEINTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLEAVE)) #define GST_IS_DEINTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLEAVE)) typedef struct _GstDeinterleave GstDeinterleave; typedef struct _GstDeinterleaveClass GstDeinterleaveClass; typedef void (*GstDeinterleaveFunc) (gpointer out, gpointer in, guint stride, guint nframes); struct _GstDeinterleave { GstElement element; /*< private > */ GList *srcpads; GstCaps *sinkcaps; gint channels; GstAudioChannelPosition *pos; gboolean keep_positions; GstPad *sink; gint width; GstDeinterleaveFunc func; GList *pending_events; }; struct _GstDeinterleaveClass { GstElementClass parent_class; }; GType gst_deinterleave_get_type (void); G_END_DECLS #endif /* __DEINTERLEAVE_H__ */ gst-plugins-good-0.10.31/gst/interleave/plugin.h0000644000175000017500000000206711671175353016417 00000000000000/* GStreamer interleave plugin * Copyright (C) 2004,2007 Andy Wingo * * plugin.h: the stubs for the interleave plugin * * 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_PLUGIN_INTERLEAVE_H__ #define __GST_PLUGIN_INTERLEAVE_H__ #include #include "interleave.h" #include "deinterleave.h" #endif /* __GST_PLUGIN_INTERLEAVE_H__ */ gst-plugins-good-0.10.31/gst/interleave/Makefile.in0000644000175000017500000007405411720560233017010 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/interleave DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstinterleave_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstinterleave_la_OBJECTS = libgstinterleave_la-plugin.lo \ libgstinterleave_la-interleave.lo \ libgstinterleave_la-deinterleave.lo libgstinterleave_la_OBJECTS = $(am_libgstinterleave_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstinterleave_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstinterleave_la_CFLAGS) $(CFLAGS) \ $(libgstinterleave_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstinterleave_la_SOURCES) DIST_SOURCES = $(libgstinterleave_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstinterleave.la libgstinterleave_la_SOURCES = plugin.c interleave.c deinterleave.c libgstinterleave_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstinterleave_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) libgstinterleave_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstinterleave_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = plugin.h interleave.h deinterleave.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/interleave/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/interleave/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstinterleave.la: $(libgstinterleave_la_OBJECTS) $(libgstinterleave_la_DEPENDENCIES) $(EXTRA_libgstinterleave_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstinterleave_la_LINK) -rpath $(plugindir) $(libgstinterleave_la_OBJECTS) $(libgstinterleave_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterleave_la-deinterleave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterleave_la-interleave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstinterleave_la-plugin.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstinterleave_la-plugin.lo: plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -MT libgstinterleave_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstinterleave_la-plugin.Tpo -c -o libgstinterleave_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterleave_la-plugin.Tpo $(DEPDIR)/libgstinterleave_la-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstinterleave_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -c -o libgstinterleave_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c libgstinterleave_la-interleave.lo: interleave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -MT libgstinterleave_la-interleave.lo -MD -MP -MF $(DEPDIR)/libgstinterleave_la-interleave.Tpo -c -o libgstinterleave_la-interleave.lo `test -f 'interleave.c' || echo '$(srcdir)/'`interleave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterleave_la-interleave.Tpo $(DEPDIR)/libgstinterleave_la-interleave.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interleave.c' object='libgstinterleave_la-interleave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -c -o libgstinterleave_la-interleave.lo `test -f 'interleave.c' || echo '$(srcdir)/'`interleave.c libgstinterleave_la-deinterleave.lo: deinterleave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -MT libgstinterleave_la-deinterleave.lo -MD -MP -MF $(DEPDIR)/libgstinterleave_la-deinterleave.Tpo -c -o libgstinterleave_la-deinterleave.lo `test -f 'deinterleave.c' || echo '$(srcdir)/'`deinterleave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstinterleave_la-deinterleave.Tpo $(DEPDIR)/libgstinterleave_la-deinterleave.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deinterleave.c' object='libgstinterleave_la-deinterleave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstinterleave_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstinterleave_la_CFLAGS) $(CFLAGS) -c -o libgstinterleave_la-deinterleave.lo `test -f 'deinterleave.c' || echo '$(srcdir)/'`deinterleave.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstinterleave -:SHARED libgstinterleave \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstinterleave_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstinterleave_la_CFLAGS) \ -:LDFLAGS $(libgstinterleave_la_LDFLAGS) \ $(libgstinterleave_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/interleave/interleave.h0000644000175000017500000000524511671175353017260 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2005 Wim Taymans * 2007 Andy Wingo * 2008 Sebastian Dröge * * interleave.c: interleave samples, mostly based on adder * * 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 __INTERLEAVE_H__ #define __INTERLEAVE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_INTERLEAVE (gst_interleave_get_type()) #define GST_INTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_INTERLEAVE,GstInterleave)) #define GST_INTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_INTERLEAVE,GstInterleaveClass)) #define GST_INTERLEAVE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_INTERLEAVE,GstInterleaveClass)) #define GST_IS_INTERLEAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_INTERLEAVE)) #define GST_IS_INTERLEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_INTERLEAVE)) typedef struct _GstInterleave GstInterleave; typedef struct _GstInterleaveClass GstInterleaveClass; typedef void (*GstInterleaveFunc) (gpointer out, gpointer in, guint stride, guint nframes); struct _GstInterleave { GstElement element; /*< private >*/ GstCollectPads *collect; gint channels; gint padcounter; gint rate; gint width; GValueArray *channel_positions; GValueArray *input_channel_positions; gboolean channel_positions_from_input; GstCaps *sinkcaps; GstClockTime timestamp; guint64 offset; gboolean segment_pending; guint64 segment_position; gdouble segment_rate; GstSegment segment; GstPadEventFunction collect_event; GstInterleaveFunc func; GstPad *src; }; struct _GstInterleaveClass { GstElementClass parent_class; }; GType gst_interleave_get_type (void); G_END_DECLS #endif /* __INTERLEAVE_H__ */ gst-plugins-good-0.10.31/gst/interleave/deinterleave.c0000644000175000017500000006102211677341655017565 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2005 Wim Taymans * 2007 Andy Wingo * 2008 Sebastian Dröge * * deinterleave.c: deinterleave samples * * 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. */ /* TODO: * - handle changes in number of channels * - handle changes in channel positions * - better capsnego by using a buffer alloc function * and passing downstream caps changes upstream there */ /** * SECTION:element-deinterleave * @see_also: interleave * * Splits one interleaved multichannel audio stream into many mono audio streams. * * This element handles all raw audio formats and supports changing the input caps as long as * all downstream elements can handle the new caps and the number of channels and the channel * positions stay the same. This restriction will be removed in later versions by adding or * removing some source pads as required. * * In most cases a queue and an audioconvert element should be added after each source pad * before further processing of the audio data. * * * Example launch line * |[ * gst-launch filesrc location=/path/to/file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2 ! deinterleave name=d d.src0 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel1.ogg d.src1 ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=channel2.ogg * ]| Decodes an MP3 file and encodes the left and right channel into separate * Ogg Vorbis files. * |[ * gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! "audio/x-raw-int,channels=2" ! deinterleave name=d interleave name=i ! audioconvert ! wavenc ! filesink location=test.wav d.src0 ! queue ! audioconvert ! i.sink1 d.src1 ! queue ! audioconvert ! i.sink0 * ]| Decodes and deinterleaves a Stereo MP3 file into separate channels and * then interleaves the channels again to a WAV file with the channel with the * channels exchanged. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "deinterleave.h" GST_DEBUG_CATEGORY_STATIC (gst_deinterleave_debug); #define GST_CAT_DEFAULT gst_deinterleave_debug static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) 1, " "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " "width = (int) { 8, 16, 24, 32 }, " "depth = (int) [ 1, 32 ], " "signed = (boolean) { true, false }; " "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) 1, " "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " "width = (int) { 32, 64 }") ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " "width = (int) { 8, 16, 24, 32 }, " "depth = (int) [ 1, 32 ], " "signed = (boolean) { true, false }; " "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " "width = (int) { 32, 64 }") ); #define MAKE_FUNC(type) \ static void deinterleave_##type (guint##type *out, guint##type *in, \ guint stride, guint nframes) \ { \ gint i; \ \ for (i = 0; i < nframes; i++) { \ out[i] = *in; \ in += stride; \ } \ } MAKE_FUNC (8); MAKE_FUNC (16); MAKE_FUNC (32); MAKE_FUNC (64); static void deinterleave_24 (guint8 * out, guint8 * in, guint stride, guint nframes) { gint i; for (i = 0; i < nframes; i++) { memcpy (out, in, 3); out += 3; in += stride * 3; } } GST_BOILERPLATE (GstDeinterleave, gst_deinterleave, GstElement, GST_TYPE_ELEMENT); enum { PROP_0, PROP_KEEP_POSITIONS }; static GstFlowReturn gst_deinterleave_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_deinterleave_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_deinterleave_sink_getcaps (GstPad * pad); static gboolean gst_deinterleave_sink_activate_push (GstPad * pad, gboolean active); static gboolean gst_deinterleave_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_deinterleave_src_query (GstPad * pad, GstQuery * query); static void gst_deinterleave_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_deinterleave_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_deinterleave_finalize (GObject * obj) { GstDeinterleave *self = GST_DEINTERLEAVE (obj); if (self->pos) { g_free (self->pos); self->pos = NULL; } if (self->pending_events) { g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (self->pending_events); self->pending_events = NULL; } G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_deinterleave_base_init (gpointer g_class) { GstElementClass *gstelement_class = (GstElementClass *) g_class; gst_element_class_set_details_simple (gstelement_class, "Audio deinterleaver", "Filter/Converter/Audio", "Splits one interleaved multichannel audio stream into many mono audio streams", "Andy Wingo , " "Iain , " "Sebastian Dröge "); gst_element_class_add_static_pad_template (gstelement_class, &sink_template); gst_element_class_add_static_pad_template (gstelement_class, &src_template); } static void gst_deinterleave_class_init (GstDeinterleaveClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GST_DEBUG_CATEGORY_INIT (gst_deinterleave_debug, "deinterleave", 0, "deinterleave element"); gobject_class->finalize = gst_deinterleave_finalize; gobject_class->set_property = gst_deinterleave_set_property; gobject_class->get_property = gst_deinterleave_get_property; /** * GstDeinterleave:keep-positions * * Keep positions: When enable the caps on the output buffers will * contain the original channel positions. This can be used to correctly * interleave the output again later but can also lead to unwanted effects * if the output should be handled as Mono. * */ g_object_class_install_property (gobject_class, PROP_KEEP_POSITIONS, g_param_spec_boolean ("keep-positions", "Keep positions", "Keep the original channel positions on the output buffers", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_deinterleave_init (GstDeinterleave * self, GstDeinterleaveClass * klass) { self->channels = 0; self->pos = NULL; self->keep_positions = FALSE; self->width = 0; self->func = NULL; /* Add sink pad */ self->sink = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_chain_function (self->sink, GST_DEBUG_FUNCPTR (gst_deinterleave_chain)); gst_pad_set_setcaps_function (self->sink, GST_DEBUG_FUNCPTR (gst_deinterleave_sink_setcaps)); gst_pad_set_getcaps_function (self->sink, GST_DEBUG_FUNCPTR (gst_deinterleave_sink_getcaps)); gst_pad_set_activatepush_function (self->sink, GST_DEBUG_FUNCPTR (gst_deinterleave_sink_activate_push)); gst_pad_set_event_function (self->sink, GST_DEBUG_FUNCPTR (gst_deinterleave_sink_event)); gst_element_add_pad (GST_ELEMENT (self), self->sink); } static void gst_deinterleave_add_new_pads (GstDeinterleave * self, GstCaps * caps) { GstPad *pad; guint i; for (i = 0; i < self->channels; i++) { gchar *name = g_strdup_printf ("src%d", i); GstCaps *srccaps; GstStructure *s; pad = gst_pad_new_from_static_template (&src_template, name); g_free (name); /* Set channel position if we know it */ if (self->keep_positions) { GstAudioChannelPosition pos[1] = { GST_AUDIO_CHANNEL_POSITION_NONE }; srccaps = gst_caps_copy (caps); s = gst_caps_get_structure (srccaps, 0); if (self->pos) gst_audio_set_channel_positions (s, &self->pos[i]); else gst_audio_set_channel_positions (s, pos); } else { srccaps = caps; } gst_pad_set_caps (pad, srccaps); gst_pad_use_fixed_caps (pad); gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_deinterleave_src_query)); gst_pad_set_active (pad, TRUE); gst_element_add_pad (GST_ELEMENT (self), pad); self->srcpads = g_list_prepend (self->srcpads, gst_object_ref (pad)); if (self->keep_positions) gst_caps_unref (srccaps); } gst_element_no_more_pads (GST_ELEMENT (self)); self->srcpads = g_list_reverse (self->srcpads); } static void gst_deinterleave_set_pads_caps (GstDeinterleave * self, GstCaps * caps) { GList *l; GstStructure *s; gint i; for (l = self->srcpads, i = 0; l; l = l->next, i++) { GstPad *pad = GST_PAD (l->data); GstCaps *srccaps; /* Set channel position if we know it */ if (self->keep_positions) { GstAudioChannelPosition pos[1] = { GST_AUDIO_CHANNEL_POSITION_NONE }; srccaps = gst_caps_copy (caps); s = gst_caps_get_structure (srccaps, 0); if (self->pos) gst_audio_set_channel_positions (s, &self->pos[i]); else gst_audio_set_channel_positions (s, pos); } else { srccaps = caps; } gst_pad_set_caps (pad, srccaps); if (self->keep_positions) gst_caps_unref (srccaps); } } static void gst_deinterleave_remove_pads (GstDeinterleave * self) { GList *l; GST_INFO_OBJECT (self, "removing pads"); for (l = self->srcpads; l; l = l->next) { GstPad *pad = GST_PAD (l->data); gst_element_remove_pad (GST_ELEMENT_CAST (self), pad); gst_object_unref (pad); } g_list_free (self->srcpads); self->srcpads = NULL; gst_pad_set_caps (self->sink, NULL); gst_caps_replace (&self->sinkcaps, NULL); } static gboolean gst_deinterleave_set_process_function (GstDeinterleave * self, GstCaps * caps) { GstStructure *s; s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "width", &self->width)) return FALSE; switch (self->width) { case 8: self->func = (GstDeinterleaveFunc) deinterleave_8; break; case 16: self->func = (GstDeinterleaveFunc) deinterleave_16; break; case 24: self->func = (GstDeinterleaveFunc) deinterleave_24; break; case 32: self->func = (GstDeinterleaveFunc) deinterleave_32; break; case 64: self->func = (GstDeinterleaveFunc) deinterleave_64; break; default: return FALSE; } return TRUE; } static gboolean gst_deinterleave_sink_setcaps (GstPad * pad, GstCaps * caps) { GstDeinterleave *self; GstCaps *srccaps; GstStructure *s; self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (self, "got caps: %" GST_PTR_FORMAT, caps); if (self->sinkcaps && !gst_caps_is_equal (caps, self->sinkcaps)) { gint new_channels, i; GstAudioChannelPosition *pos; gboolean same_layout = TRUE; s = gst_caps_get_structure (caps, 0); /* We allow caps changes as long as the number of channels doesn't change * and the channel positions stay the same. _getcaps() should've cared * for this already but better be safe. */ if (!gst_structure_get_int (s, "channels", &new_channels) || new_channels != self->channels || !gst_deinterleave_set_process_function (self, caps)) goto cannot_change_caps; /* Now check the channel positions. If we had no channel positions * and get them or the other way around things have changed. * If we had channel positions and get different ones things have * changed too of course */ pos = gst_audio_get_channel_positions (s); if ((pos && !self->pos) || (!pos && self->pos)) goto cannot_change_caps; if (pos) { for (i = 0; i < self->channels; i++) { if (self->pos[i] != pos[i]) { same_layout = FALSE; break; } } g_free (pos); if (!same_layout) goto cannot_change_caps; } } else { s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "channels", &self->channels)) goto no_channels; if (!gst_deinterleave_set_process_function (self, caps)) goto unsupported_caps; self->pos = gst_audio_get_channel_positions (s); } gst_caps_replace (&self->sinkcaps, caps); /* Get srcpad caps */ srccaps = gst_caps_copy (caps); s = gst_caps_get_structure (srccaps, 0); gst_structure_set (s, "channels", G_TYPE_INT, 1, NULL); gst_structure_remove_field (s, "channel-positions"); /* If we already have pads, update the caps otherwise * add new pads */ if (self->srcpads) { gst_deinterleave_set_pads_caps (self, srccaps); } else { gst_deinterleave_add_new_pads (self, srccaps); } gst_caps_unref (srccaps); gst_object_unref (self); return TRUE; cannot_change_caps: { GST_ERROR_OBJECT (self, "can't set new caps: %" GST_PTR_FORMAT, caps); gst_object_unref (self); return FALSE; } unsupported_caps: { GST_ERROR_OBJECT (self, "caps not supported: %" GST_PTR_FORMAT, caps); gst_object_unref (self); return FALSE; } no_channels: { GST_ERROR_OBJECT (self, "invalid caps"); gst_object_unref (self); return FALSE; } } static void __remove_channels (GstCaps * caps) { GstStructure *s; gint i, size; size = gst_caps_get_size (caps); for (i = 0; i < size; i++) { s = gst_caps_get_structure (caps, i); gst_structure_remove_field (s, "channel-positions"); gst_structure_remove_field (s, "channels"); } } static void __set_channels (GstCaps * caps, gint channels) { GstStructure *s; gint i, size; size = gst_caps_get_size (caps); for (i = 0; i < size; i++) { s = gst_caps_get_structure (caps, i); if (channels > 0) gst_structure_set (s, "channels", G_TYPE_INT, channels, NULL); else gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); } } static GstCaps * gst_deinterleave_sink_getcaps (GstPad * pad) { GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); GstCaps *ret; GList *l; GST_OBJECT_LOCK (self); /* Intersect all of our pad template caps with the peer caps of the pad * to get all formats that are possible up- and downstream. * * For the pad for which the caps are requested we don't remove the channel * informations as they must be in the returned caps and incompatibilities * will be detected here already */ ret = gst_caps_new_any (); for (l = GST_ELEMENT (self)->pads; l != NULL; l = l->next) { GstPad *ourpad = GST_PAD (l->data); GstCaps *peercaps = NULL, *ourcaps; ourcaps = gst_caps_copy (gst_pad_get_pad_template_caps (ourpad)); if (pad == ourpad) { if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) __set_channels (ourcaps, self->channels); else __set_channels (ourcaps, 1); } else { __remove_channels (ourcaps); /* Only ask for peer caps for other pads than pad * as otherwise gst_pad_peer_get_caps() might call * back into this function and deadlock */ peercaps = gst_pad_peer_get_caps (ourpad); } /* If the peer exists and has caps add them to the intersection, * otherwise assume that the peer accepts everything */ if (peercaps) { GstCaps *intersection; GstCaps *oldret = ret; __remove_channels (peercaps); intersection = gst_caps_intersect (peercaps, ourcaps); ret = gst_caps_intersect (ret, intersection); gst_caps_unref (intersection); gst_caps_unref (peercaps); gst_caps_unref (oldret); } else { GstCaps *oldret = ret; ret = gst_caps_intersect (ret, ourcaps); gst_caps_unref (oldret); } gst_caps_unref (ourcaps); } GST_OBJECT_UNLOCK (self); gst_object_unref (self); GST_DEBUG_OBJECT (pad, "Intersected caps to %" GST_PTR_FORMAT, ret); return ret; } static gboolean gst_deinterleave_sink_event (GstPad * pad, GstEvent * event) { GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); gboolean ret; GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event), GST_DEBUG_PAD_NAME (pad)); /* Send FLUSH_STOP, FLUSH_START and EOS immediately, no matter if * we have src pads already or not. Queue all other events and * push them after we have src pads */ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_START: case GST_EVENT_EOS: ret = gst_pad_event_default (pad, event); break; default: if (self->srcpads) { ret = gst_pad_event_default (pad, event); } else { GST_OBJECT_LOCK (self); self->pending_events = g_list_append (self->pending_events, event); GST_OBJECT_UNLOCK (self); ret = TRUE; } break; } gst_object_unref (self); return ret; } static gboolean gst_deinterleave_src_query (GstPad * pad, GstQuery * query) { GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); gboolean res; res = gst_pad_query_default (pad, query); if (res && GST_QUERY_TYPE (query) == GST_QUERY_DURATION) { GstFormat format; gint64 dur; gst_query_parse_duration (query, &format, &dur); /* Need to divide by the number of channels in byte format * to get the correct value. All other formats should be fine */ if (format == GST_FORMAT_BYTES && dur != -1) gst_query_set_duration (query, format, dur / self->channels); } else if (res && GST_QUERY_TYPE (query) == GST_QUERY_POSITION) { GstFormat format; gint64 pos; gst_query_parse_position (query, &format, &pos); /* Need to divide by the number of channels in byte format * to get the correct value. All other formats should be fine */ if (format == GST_FORMAT_BYTES && pos != -1) gst_query_set_position (query, format, pos / self->channels); } gst_object_unref (self); return res; } static void gst_deinterleave_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDeinterleave *self = GST_DEINTERLEAVE (object); switch (prop_id) { case PROP_KEEP_POSITIONS: self->keep_positions = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_deinterleave_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDeinterleave *self = GST_DEINTERLEAVE (object); switch (prop_id) { case PROP_KEEP_POSITIONS: g_value_set_boolean (value, self->keep_positions); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstFlowReturn gst_deinterleave_process (GstDeinterleave * self, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; guint channels = self->channels; guint pads_pushed = 0, buffers_allocated = 0; guint nframes = GST_BUFFER_SIZE (buf) / channels / (self->width / 8); guint bufsize = nframes * (self->width / 8); guint i; GList *srcs; GstBuffer **buffers_out = g_new0 (GstBuffer *, channels); guint8 *in, *out; /* Send any pending events to all src pads */ GST_OBJECT_LOCK (self); if (self->pending_events) { GList *events; GstEvent *event; GST_DEBUG_OBJECT (self, "Sending pending events to all src pads"); for (events = self->pending_events; events != NULL; events = events->next) { event = GST_EVENT (events->data); for (srcs = self->srcpads; srcs != NULL; srcs = srcs->next) gst_pad_push_event (GST_PAD (srcs->data), gst_event_ref (event)); gst_event_unref (event); } g_list_free (self->pending_events); self->pending_events = NULL; } GST_OBJECT_UNLOCK (self); /* Allocate buffers */ for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) { GstPad *pad = (GstPad *) srcs->data; buffers_out[i] = NULL; ret = gst_pad_alloc_buffer (pad, GST_BUFFER_OFFSET_NONE, bufsize, GST_PAD_CAPS (pad), &buffers_out[i]); /* Make sure we got a correct buffer. The only other case we allow * here is an unliked pad */ if (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED) goto alloc_buffer_failed; else if (buffers_out[i] && GST_BUFFER_SIZE (buffers_out[i]) != bufsize) goto alloc_buffer_bad_size; else if (buffers_out[i] && !gst_caps_is_equal (GST_BUFFER_CAPS (buffers_out[i]), GST_PAD_CAPS (pad))) goto invalid_caps; if (buffers_out[i]) { gst_buffer_copy_metadata (buffers_out[i], buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); buffers_allocated++; } } /* Return NOT_LINKED if no pad was linked */ if (!buffers_allocated) { GST_WARNING_OBJECT (self, "Couldn't allocate any buffers because no pad was linked"); ret = GST_FLOW_NOT_LINKED; goto done; } /* deinterleave */ for (srcs = self->srcpads, i = 0; srcs; srcs = srcs->next, i++) { GstPad *pad = (GstPad *) srcs->data; in = (guint8 *) GST_BUFFER_DATA (buf); in += i * (self->width / 8); if (buffers_out[i]) { out = (guint8 *) GST_BUFFER_DATA (buffers_out[i]); self->func (out, in, channels, nframes); ret = gst_pad_push (pad, buffers_out[i]); buffers_out[i] = NULL; if (ret == GST_FLOW_OK) pads_pushed++; else if (ret == GST_FLOW_NOT_LINKED) ret = GST_FLOW_OK; else goto push_failed; } } /* Return NOT_LINKED if no pad was linked */ if (!pads_pushed) ret = GST_FLOW_NOT_LINKED; done: gst_buffer_unref (buf); g_free (buffers_out); return ret; alloc_buffer_failed: { GST_WARNING ("gst_pad_alloc_buffer() returned %s", gst_flow_get_name (ret)); goto clean_buffers; } alloc_buffer_bad_size: { GST_WARNING ("called alloc_buffer(), but didn't get requested bytes"); ret = GST_FLOW_NOT_NEGOTIATED; goto clean_buffers; } invalid_caps: { GST_WARNING ("called alloc_buffer(), but didn't get requested caps"); ret = GST_FLOW_NOT_NEGOTIATED; goto clean_buffers; } push_failed: { GST_DEBUG ("push() failed, flow = %s", gst_flow_get_name (ret)); goto clean_buffers; } clean_buffers: { for (i = 0; i < channels; i++) { if (buffers_out[i]) gst_buffer_unref (buffers_out[i]); } gst_buffer_unref (buf); g_free (buffers_out); return ret; } } static GstFlowReturn gst_deinterleave_chain (GstPad * pad, GstBuffer * buffer) { GstDeinterleave *self = GST_DEINTERLEAVE (GST_PAD_PARENT (pad)); GstFlowReturn ret; g_return_val_if_fail (self->func != NULL, GST_FLOW_NOT_NEGOTIATED); g_return_val_if_fail (self->width > 0, GST_FLOW_NOT_NEGOTIATED); g_return_val_if_fail (self->channels > 0, GST_FLOW_NOT_NEGOTIATED); ret = gst_deinterleave_process (self, buffer); if (ret != GST_FLOW_OK) GST_DEBUG_OBJECT (self, "flow return: %s", gst_flow_get_name (ret)); return ret; } static gboolean gst_deinterleave_sink_activate_push (GstPad * pad, gboolean active) { GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); /* Reset everything when the pad is deactivated */ if (!active) { gst_deinterleave_remove_pads (self); if (self->pos) { g_free (self->pos); self->pos = NULL; } self->channels = 0; self->width = 0; self->func = NULL; if (self->pending_events) { g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (self->pending_events); self->pending_events = NULL; } } gst_object_unref (self); return TRUE; } gst-plugins-good-0.10.31/gst/equalizer/0000755000175000017500000000000011720565302014656 500000000000000gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizernbands.h0000644000175000017500000000362311671175353021374 00000000000000/* GStreamer * Copyright (C) <2004> Benjamin Otte * <2007> Stefan Kost * * 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_IIR_EQUALIZER_NBANDS__ #define __GST_IIR_EQUALIZER_NBANDS__ #include "gstiirequalizer.h" typedef struct _GstIirEqualizerNBands GstIirEqualizerNBands; typedef struct _GstIirEqualizerNBandsClass GstIirEqualizerNBandsClass; #define GST_TYPE_IIR_EQUALIZER_NBANDS \ (gst_iir_equalizer_nbands_get_type()) #define GST_IIR_EQUALIZER_NBANDS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_NBANDS,GstIirEqualizerNBands)) #define GST_IIR_EQUALIZER_NBANDS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_NBANDS,GstIirEqualizerNBandsClass)) #define GST_IS_IIR_EQUALIZER_NBANDS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_NBANDS)) #define GST_IS_IIR_EQUALIZER_NBANDS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_NBANDS)) struct _GstIirEqualizerNBands { GstIirEqualizer equalizer; }; struct _GstIirEqualizerNBandsClass { GstIirEqualizerClass equalizer_class; }; extern GType gst_iir_equalizer_nbands_get_type(void); #endif /* __GST_IIR_EQUALIZER_NBANDS__ */ gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizer.h0000644000175000017500000000463311671175353020210 00000000000000/* GStreamer IIR equalizer * Copyright (C) <2004> Benjamin Otte * <2007> Stefan Kost * * 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_IIR_EQUALIZER__ #define __GST_IIR_EQUALIZER__ #include #include #include typedef struct _GstIirEqualizer GstIirEqualizer; typedef struct _GstIirEqualizerClass GstIirEqualizerClass; typedef struct _GstIirEqualizerBand GstIirEqualizerBand; #define GST_TYPE_IIR_EQUALIZER \ (gst_iir_equalizer_get_type()) #define GST_IIR_EQUALIZER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER,GstIirEqualizer)) #define GST_IIR_EQUALIZER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER,GstIirEqualizerClass)) #define GST_IS_IIR_EQUALIZER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER)) #define GST_IS_IIR_EQUALIZER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER)) #define LOWEST_FREQ (20.0) #define HIGHEST_FREQ (20000.0) typedef void (*ProcessFunc) (GstIirEqualizer * eq, guint8 * data, guint size, guint channels); struct _GstIirEqualizer { GstAudioFilter audiofilter; /*< private >*/ GMutex *bands_lock; GstIirEqualizerBand **bands; /* properties */ guint freq_band_count; /* for each band and channel */ gpointer history; guint history_size; gboolean need_new_coefficients; ProcessFunc process; }; struct _GstIirEqualizerClass { GstAudioFilterClass audiofilter_class; }; extern void gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count); extern GType gst_iir_equalizer_get_type(void); #endif /* __GST_IIR_EQUALIZER__ */ gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizernbands.c0000644000175000017500000001155111671175353021366 00000000000000/* GStreamer * Copyright (C) <2004> Benjamin Otte * <2007> Stefan Kost * * 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-equalizer-nbands * * The n-band equalizer element is a fully parametric equalizer. It allows to * select between 1 and 64 bands and has properties on each band to change * the center frequency, band width and gain. * * * Example launch line * |[ * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-nbands num-bands=15 band5::gain=6.0 ! alsasink * ]| This make the equalizer use 15 bands and raises the volume of the 5th band by 6 db. * * * Example code * |[ * #include <gst/gst.h> * * ... * typedef struct { * gfloat freq; * gfloat width; * gfloat gain; * } GstEqualizerBandState; * * ... * * GstElement *equalizer; * GstObject *band; * gint i; * GstEqualizerBandState state[] = { * { 120.0, 50.0, - 3.0}, * { 500.0, 20.0, 12.0}, * {1503.0, 2.0, -20.0}, * {6000.0, 1000.0, 6.0}, * {3000.0, 120.0, 2.0} * }; * * ... * * equalizer = gst_element_factory_make ("equalizer-nbands", "equalizer"); * g_object_set (G_OBJECT (equalizer), "num-bands", 5, NULL); * * ... * * for (i = 0; i < 5; i++) { * band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), i); * g_object_set (G_OBJECT (band), "freq", state[i].freq, * "bandwidth", state[i].width, * "gain", state[i].gain); * g_object_unref (G_OBJECT (band)); * } * * ... * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstiirequalizer.h" #include "gstiirequalizernbands.h" enum { PROP_NUM_BANDS = 1 }; static void gst_iir_equalizer_nbands_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_iir_equalizer_nbands_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_DEBUG_CATEGORY_EXTERN (equalizer_debug); #define GST_CAT_DEFAULT equalizer_debug GST_BOILERPLATE (GstIirEqualizerNBands, gst_iir_equalizer_nbands, GstIirEqualizer, GST_TYPE_IIR_EQUALIZER); /* equalizer implementation */ static void gst_iir_equalizer_nbands_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "N Band Equalizer", "Filter/Effect/Audio", "Direct Form IIR equalizer", "Benjamin Otte ," " Stefan Kost "); } static void gst_iir_equalizer_nbands_class_init (GstIirEqualizerNBandsClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_iir_equalizer_nbands_set_property; gobject_class->get_property = gst_iir_equalizer_nbands_get_property; g_object_class_install_property (gobject_class, PROP_NUM_BANDS, g_param_spec_uint ("num-bands", "num-bands", "number of different bands to use", 1, 64, 10, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); } static void gst_iir_equalizer_nbands_init (GstIirEqualizerNBands * equ_n, GstIirEqualizerNBandsClass * g_class) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (equ_n); gst_iir_equalizer_compute_frequencies (equ, 10); } static void gst_iir_equalizer_nbands_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); switch (prop_id) { case PROP_NUM_BANDS: gst_iir_equalizer_compute_frequencies (equ, g_value_get_uint (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_iir_equalizer_nbands_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); switch (prop_id) { case PROP_NUM_BANDS: g_value_set_uint (value, equ->freq_band_count); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/equalizer/Makefile.am0000644000175000017500000000254511671175353016650 00000000000000plugin_LTLIBRARIES = libgstequalizer.la libgstequalizer_la_SOURCES = \ gstiirequalizer.c gstiirequalizer.h \ gstiirequalizernbands.c gstiirequalizernbands.h \ gstiirequalizer3bands.c gstiirequalizer3bands.h \ gstiirequalizer10bands.c gstiirequalizer10bands.h libgstequalizer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) libgstequalizer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ $(GST_LIBS) $(LIBM) libgstequalizer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstequalizer_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstiirequalizer.h presetdir = $(datadir)/gstreamer-$(GST_MAJORMINOR)/presets preset_DATA = GstIirEqualizer3Bands.prs GstIirEqualizer10Bands.prs EXTRA_DIST = $(preset_DATA) Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstequalizer -:SHARED libgstequalizer \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstequalizer_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstequalizer_la_CFLAGS) \ -:LDFLAGS $(libgstequalizer_la_LDFLAGS) \ $(libgstequalizer_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizer3bands.c0000644000175000017500000001224311671175353021272 00000000000000/* GStreamer * Copyright (C) <2007> Stefan Kost * * 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-equalizer-3bands * * The 3-band equalizer element allows to change the gain of a low frequency, * medium frequency and high frequency band. * * * Example launch line * |[ * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-3bands band1=6.0 ! alsasink * ]| This raises the volume of the 2nd band, which is at 1110 Hz, by 6 db. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstiirequalizer.h" #include "gstiirequalizer3bands.h" enum { PROP_BAND0 = 1, PROP_BAND1, PROP_BAND2, }; static void gst_iir_equalizer_3bands_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_iir_equalizer_3bands_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_DEBUG_CATEGORY_EXTERN (equalizer_debug); #define GST_CAT_DEFAULT equalizer_debug static void _do_init (GType object_type) { const GInterfaceInfo preset_interface_info = { NULL, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; g_type_add_interface_static (object_type, GST_TYPE_PRESET, &preset_interface_info); } GST_BOILERPLATE_FULL (GstIirEqualizer3Bands, gst_iir_equalizer_3bands, GstIirEqualizer, GST_TYPE_IIR_EQUALIZER, _do_init); /* equalizer implementation */ static void gst_iir_equalizer_3bands_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "3 Band Equalizer", "Filter/Effect/Audio", "Direct Form 3 band IIR equalizer", "Stefan Kost "); } static void gst_iir_equalizer_3bands_class_init (GstIirEqualizer3BandsClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_iir_equalizer_3bands_set_property; gobject_class->get_property = gst_iir_equalizer_3bands_get_property; g_object_class_install_property (gobject_class, PROP_BAND0, g_param_spec_double ("band0", "110 Hz", "gain for the frequency band 100 Hz, ranging from -24.0 to +12.0", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND1, g_param_spec_double ("band1", "1100 Hz", "gain for the frequency band 1100 Hz, ranging from -24.0 to +12.0", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND2, g_param_spec_double ("band2", "11 kHz", "gain for the frequency band 11 kHz, ranging from -24.0 to +12.0", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); } static void gst_iir_equalizer_3bands_init (GstIirEqualizer3Bands * equ_n, GstIirEqualizer3BandsClass * g_class) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (equ_n); gst_iir_equalizer_compute_frequencies (equ, 3); } static void gst_iir_equalizer_3bands_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); switch (prop_id) { case PROP_BAND0: gst_child_proxy_set_property (GST_OBJECT (equ), "band0::gain", value); break; case PROP_BAND1: gst_child_proxy_set_property (GST_OBJECT (equ), "band1::gain", value); break; case PROP_BAND2: gst_child_proxy_set_property (GST_OBJECT (equ), "band2::gain", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_iir_equalizer_3bands_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); switch (prop_id) { case PROP_BAND0: gst_child_proxy_get_property (GST_OBJECT (equ), "band0::gain", value); break; case PROP_BAND1: gst_child_proxy_get_property (GST_OBJECT (equ), "band1::gain", value); break; case PROP_BAND2: gst_child_proxy_get_property (GST_OBJECT (equ), "band2::gain", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizer.c0000644000175000017500000007503711717520126020202 00000000000000/* GStreamer * Copyright (C) <2004> Benjamin Otte * <2007> Stefan Kost * <2007> Sebastian Dröge * * 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 #include #include "gstiirequalizer.h" #include "gstiirequalizernbands.h" #include "gstiirequalizer3bands.h" #include "gstiirequalizer10bands.h" #include "gst/glib-compat-private.h" GST_DEBUG_CATEGORY (equalizer_debug); #define GST_CAT_DEFAULT equalizer_debug #define BANDS_LOCK(equ) g_mutex_lock(equ->bands_lock) #define BANDS_UNLOCK(equ) g_mutex_unlock(equ->bands_lock) static void gst_iir_equalizer_child_proxy_interface_init (gpointer g_iface, gpointer iface_data); static void gst_iir_equalizer_finalize (GObject * object); static gboolean gst_iir_equalizer_setup (GstAudioFilter * filter, GstRingBufferSpec * fmt); static GstFlowReturn gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf); #define ALLOWED_CAPS \ "audio/x-raw-int," \ " depth=(int)16," \ " width=(int)16," \ " endianness=(int)BYTE_ORDER," \ " signed=(bool)TRUE," \ " rate=(int)[1000,MAX]," \ " channels=(int)[1,MAX]; " \ "audio/x-raw-float," \ " width=(int) { 32, 64 } ," \ " endianness=(int)BYTE_ORDER," \ " rate=(int)[1000,MAX]," \ " channels=(int)[1,MAX]" static void _do_init (GType object_type) { const GInterfaceInfo child_proxy_interface_info = { (GInterfaceInitFunc) gst_iir_equalizer_child_proxy_interface_init, NULL, /* interface_finalize */ NULL /* interface_data */ }; g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, &child_proxy_interface_info); } GST_BOILERPLATE_FULL (GstIirEqualizer, gst_iir_equalizer, GstAudioFilter, GST_TYPE_AUDIO_FILTER, _do_init); /* child object */ enum { PROP_GAIN = 1, PROP_FREQ, PROP_BANDWIDTH, PROP_TYPE }; typedef enum { BAND_TYPE_PEAK = 0, BAND_TYPE_LOW_SHELF, BAND_TYPE_HIGH_SHELF } GstIirEqualizerBandType; #define GST_TYPE_IIR_EQUALIZER_BAND_TYPE (gst_iir_equalizer_band_type_get_type ()) static GType gst_iir_equalizer_band_type_get_type (void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = { {BAND_TYPE_PEAK, "Peak filter (default for inner bands)", "peak"}, {BAND_TYPE_LOW_SHELF, "Low shelf filter (default for first band)", "low-shelf"}, {BAND_TYPE_HIGH_SHELF, "High shelf filter (default for last band)", "high-shelf"}, {0, NULL, NULL} }; gtype = g_enum_register_static ("GstIirEqualizerBandType", values); } return gtype; } typedef struct _GstIirEqualizerBandClass GstIirEqualizerBandClass; #define GST_TYPE_IIR_EQUALIZER_BAND \ (gst_iir_equalizer_band_get_type()) #define GST_IIR_EQUALIZER_BAND(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_BAND,GstIirEqualizerBand)) #define GST_IIR_EQUALIZER_BAND_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_BAND,GstIirEqualizerBandClass)) #define GST_IS_IIR_EQUALIZER_BAND(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_BAND)) #define GST_IS_IIR_EQUALIZER_BAND_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_BAND)) struct _GstIirEqualizerBand { GstObject object; /*< private > */ /* center frequency and gain */ gdouble freq; gdouble gain; gdouble width; GstIirEqualizerBandType type; /* second order iir filter */ gdouble b1, b2; /* IIR coefficients for outputs */ gdouble a0, a1, a2; /* IIR coefficients for inputs */ }; struct _GstIirEqualizerBandClass { GstObjectClass parent_class; }; static GType gst_iir_equalizer_band_get_type (void); static void gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); GstIirEqualizer *equ = GST_IIR_EQUALIZER (gst_object_get_parent (GST_OBJECT (band))); switch (prop_id) { case PROP_GAIN:{ gdouble gain; gain = g_value_get_double (value); GST_DEBUG_OBJECT (band, "gain = %lf -> %lf", band->gain, gain); if (gain != band->gain) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->gain = gain; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed gain = %lf ", band->gain); } break; } case PROP_FREQ:{ gdouble freq; freq = g_value_get_double (value); GST_DEBUG_OBJECT (band, "freq = %lf -> %lf", band->freq, freq); if (freq != band->freq) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->freq = freq; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed freq = %lf ", band->freq); } break; } case PROP_BANDWIDTH:{ gdouble width; width = g_value_get_double (value); GST_DEBUG_OBJECT (band, "width = %lf -> %lf", band->width, width); if (width != band->width) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->width = width; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed width = %lf ", band->width); } break; } case PROP_TYPE:{ GstIirEqualizerBandType type; type = g_value_get_enum (value); GST_DEBUG_OBJECT (band, "type = %d -> %d", band->type, type); if (type != band->type) { BANDS_LOCK (equ); equ->need_new_coefficients = TRUE; band->type = type; BANDS_UNLOCK (equ); GST_DEBUG_OBJECT (band, "changed type = %d ", band->type); } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } gst_object_unref (equ); } static void gst_iir_equalizer_band_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); switch (prop_id) { case PROP_GAIN: g_value_set_double (value, band->gain); break; case PROP_FREQ: g_value_set_double (value, band->freq); break; case PROP_BANDWIDTH: g_value_set_double (value, band->width); break; case PROP_TYPE: g_value_set_enum (value, band->type); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_iir_equalizer_band_class_init (GstIirEqualizerBandClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = gst_iir_equalizer_band_set_property; gobject_class->get_property = gst_iir_equalizer_band_get_property; g_object_class_install_property (gobject_class, PROP_GAIN, g_param_spec_double ("gain", "gain", "gain for the frequency band ranging from -24.0 dB to +12.0 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_FREQ, g_param_spec_double ("freq", "freq", "center frequency of the band", 0.0, 100000.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BANDWIDTH, g_param_spec_double ("bandwidth", "bandwidth", "difference between bandedges in Hz", 0.0, 100000.0, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_TYPE, g_param_spec_enum ("type", "Type", "Filter type", GST_TYPE_IIR_EQUALIZER_BAND_TYPE, BAND_TYPE_PEAK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); } static void gst_iir_equalizer_band_init (GstIirEqualizerBand * band, GstIirEqualizerBandClass * klass) { band->freq = 0.0; band->gain = 0.0; band->width = 1.0; band->type = BAND_TYPE_PEAK; } static GType gst_iir_equalizer_band_get_type (void) { static GType type = 0; if (G_UNLIKELY (!type)) { const GTypeInfo type_info = { sizeof (GstIirEqualizerBandClass), NULL, NULL, (GClassInitFunc) gst_iir_equalizer_band_class_init, NULL, NULL, sizeof (GstIirEqualizerBand), 0, (GInstanceInitFunc) gst_iir_equalizer_band_init, }; type = g_type_register_static (GST_TYPE_OBJECT, "GstIirEqualizerBand", &type_info, 0); } return (type); } /* child proxy iface */ static GstObject * gst_iir_equalizer_child_proxy_get_child_by_index (GstChildProxy * child_proxy, guint index) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (child_proxy); GstObject *ret; BANDS_LOCK (equ); if (G_UNLIKELY (index >= equ->freq_band_count)) { BANDS_UNLOCK (equ); g_return_val_if_fail (index < equ->freq_band_count, NULL); } ret = gst_object_ref (equ->bands[index]); BANDS_UNLOCK (equ); GST_LOG_OBJECT (equ, "return child[%d] %" GST_PTR_FORMAT, index, ret); return ret; } static guint gst_iir_equalizer_child_proxy_get_children_count (GstChildProxy * child_proxy) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (child_proxy); GST_LOG ("we have %d children", equ->freq_band_count); return equ->freq_band_count; } static void gst_iir_equalizer_child_proxy_interface_init (gpointer g_iface, gpointer iface_data) { GstChildProxyInterface *iface = g_iface; GST_DEBUG ("initializing iface"); iface->get_child_by_index = gst_iir_equalizer_child_proxy_get_child_by_index; iface->get_children_count = gst_iir_equalizer_child_proxy_get_children_count; } /* equalizer implementation */ static void gst_iir_equalizer_base_init (gpointer g_class) { GstAudioFilterClass *audiofilter_class = GST_AUDIO_FILTER_CLASS (g_class); GstCaps *caps; caps = gst_caps_from_string (ALLOWED_CAPS); gst_audio_filter_class_add_pad_templates (audiofilter_class, caps); gst_caps_unref (caps); } static void gst_iir_equalizer_class_init (GstIirEqualizerClass * klass) { GstAudioFilterClass *audio_filter_class = (GstAudioFilterClass *) klass; GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->finalize = gst_iir_equalizer_finalize; audio_filter_class->setup = gst_iir_equalizer_setup; btrans_class->transform_ip = gst_iir_equalizer_transform_ip; } static void gst_iir_equalizer_init (GstIirEqualizer * eq, GstIirEqualizerClass * g_class) { eq->bands_lock = g_mutex_new (); eq->need_new_coefficients = TRUE; } static void gst_iir_equalizer_finalize (GObject * object) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); gint i; for (i = 0; i < equ->freq_band_count; i++) { if (equ->bands[i]) gst_object_unparent (GST_OBJECT (equ->bands[i])); equ->bands[i] = NULL; } equ->freq_band_count = 0; g_free (equ->bands); g_free (equ->history); g_mutex_free (equ->bands_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } /* Filter taken from * * The Equivalence of Various Methods of Computing * Biquad Coefficients for Audio Parametric Equalizers * * by Robert Bristow-Johnson * * http://www.aes.org/e-lib/browse.cfm?elib=6326 * http://www.musicdsp.org/files/EQ-Coefficients.pdf * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt * * The bandwidth method that we use here is the preferred * one from this article transformed from octaves to frequency * in Hz. */ static inline gdouble arg_to_scale (gdouble arg) { return (pow (10.0, arg / 40.0)); } static gdouble calculate_omega (gdouble freq, gint rate) { gdouble omega; if (freq / rate >= 0.5) omega = G_PI; else if (freq <= 0.0) omega = 0.0; else omega = 2.0 * G_PI * (freq / rate); return omega; } static gdouble calculate_bw (GstIirEqualizerBand * band, gint rate) { gdouble bw = 0.0; if (band->width / rate >= 0.5) { /* If bandwidth == 0.5 the calculation below fails as tan(G_PI/2) * is undefined. So set the bandwidth to a slightly smaller value. */ bw = G_PI - 0.00000001; } else if (band->width <= 0.0) { /* If bandwidth == 0 this band won't change anything so set * the coefficients accordingly. The coefficient calculation * below would create coefficients that for some reason amplify * the band. */ band->a0 = 1.0; band->a1 = 0.0; band->a2 = 0.0; band->b1 = 0.0; band->b2 = 0.0; } else { bw = 2.0 * G_PI * (band->width / rate); } return bw; } static void setup_peak_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) { g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); { gdouble gain, omega, bw; gdouble alpha, alpha1, alpha2, b0; gain = arg_to_scale (band->gain); omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); if (bw == 0.0) goto out; alpha = tan (bw / 2.0); alpha1 = alpha * gain; alpha2 = alpha / gain; b0 = (1.0 + alpha2); band->a0 = (1.0 + alpha1) / b0; band->a1 = (-2.0 * cos (omega)) / b0; band->a2 = (1.0 - alpha1) / b0; band->b1 = (2.0 * cos (omega)) / b0; band->b2 = -(1.0 - alpha2) / b0; out: GST_INFO ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", band->gain, band->width, band->freq, band->a0, band->a1, band->a2, band->b1, band->b2); } } static void setup_low_shelf_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) { g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); { gdouble gain, omega, bw; gdouble alpha, delta, b0; gdouble egp, egm; gain = arg_to_scale (band->gain); omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); if (bw == 0.0) goto out; egm = gain - 1.0; egp = gain + 1.0; alpha = tan (bw / 2.0); delta = 2.0 * sqrt (gain) * alpha; b0 = egp + egm * cos (omega) + delta; band->a0 = ((egp - egm * cos (omega) + delta) * gain) / b0; band->a1 = ((egm - egp * cos (omega)) * 2.0 * gain) / b0; band->a2 = ((egp - egm * cos (omega) - delta) * gain) / b0; band->b1 = ((egm + egp * cos (omega)) * 2.0) / b0; band->b2 = -((egp + egm * cos (omega) - delta)) / b0; out: GST_INFO ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", band->gain, band->width, band->freq, band->a0, band->a1, band->a2, band->b1, band->b2); } } static void setup_high_shelf_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) { g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); { gdouble gain, omega, bw; gdouble alpha, delta, b0; gdouble egp, egm; gain = arg_to_scale (band->gain); omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); if (bw == 0.0) goto out; egm = gain - 1.0; egp = gain + 1.0; alpha = tan (bw / 2.0); delta = 2.0 * sqrt (gain) * alpha; b0 = egp - egm * cos (omega) + delta; band->a0 = ((egp + egm * cos (omega) + delta) * gain) / b0; band->a1 = ((egm + egp * cos (omega)) * -2.0 * gain) / b0; band->a2 = ((egp + egm * cos (omega) - delta) * gain) / b0; band->b1 = ((egm - egp * cos (omega)) * -2.0) / b0; band->b2 = -((egp - egm * cos (omega) - delta)) / b0; out: GST_INFO ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", band->gain, band->width, band->freq, band->a0, band->a1, band->a2, band->b1, band->b2); } } /* Must be called with bands_lock and transform lock! */ static void set_passthrough (GstIirEqualizer * equ) { gint i; gboolean passthrough = TRUE; for (i = 0; i < equ->freq_band_count; i++) { passthrough = passthrough && (equ->bands[i]->gain == 0.0); } gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (equ), passthrough); GST_DEBUG ("Passthrough mode: %d\n", passthrough); } /* Must be called with bands_lock and transform lock! */ static void update_coefficients (GstIirEqualizer * equ) { gint i, n = equ->freq_band_count; for (i = 0; i < n; i++) { if (equ->bands[i]->type == BAND_TYPE_PEAK) setup_peak_filter (equ, equ->bands[i]); else if (equ->bands[i]->type == BAND_TYPE_LOW_SHELF) setup_low_shelf_filter (equ, equ->bands[i]); else setup_high_shelf_filter (equ, equ->bands[i]); } equ->need_new_coefficients = FALSE; } /* Must be called with transform lock! */ static void alloc_history (GstIirEqualizer * equ) { /* free + alloc = no memcpy */ g_free (equ->history); equ->history = g_malloc0 (equ->history_size * GST_AUDIO_FILTER (equ)->format.channels * equ->freq_band_count); } void gst_iir_equalizer_compute_frequencies (GstIirEqualizer * equ, guint new_count) { guint old_count, i; gdouble freq0, freq1, step; gchar name[20]; if (equ->freq_band_count == new_count) return; BANDS_LOCK (equ); if (G_UNLIKELY (equ->freq_band_count == new_count)) { BANDS_UNLOCK (equ); return; } old_count = equ->freq_band_count; equ->freq_band_count = new_count; GST_DEBUG ("bands %u -> %u", old_count, new_count); if (old_count < new_count) { /* add new bands */ equ->bands = g_realloc (equ->bands, sizeof (GstObject *) * new_count); for (i = old_count; i < new_count; i++) { /* otherwise they get names like 'iirequalizerband5' */ sprintf (name, "band%u", i); equ->bands[i] = g_object_new (GST_TYPE_IIR_EQUALIZER_BAND, "name", name, NULL); GST_DEBUG ("adding band[%d]=%p", i, equ->bands[i]); gst_object_set_parent (GST_OBJECT (equ->bands[i]), GST_OBJECT (equ)); gst_child_proxy_child_added (GST_OBJECT (equ), GST_OBJECT (equ->bands[i])); } } else { /* free unused bands */ for (i = new_count; i < old_count; i++) { GST_DEBUG ("removing band[%d]=%p", i, equ->bands[i]); gst_child_proxy_child_removed (GST_OBJECT (equ), GST_OBJECT (equ->bands[i])); gst_object_unparent (GST_OBJECT (equ->bands[i])); equ->bands[i] = NULL; } } alloc_history (equ); /* set center frequencies and name band objects * FIXME: arg! we can't change the name of parented objects :( * application should read band->freq to get the name */ step = pow (HIGHEST_FREQ / LOWEST_FREQ, 1.0 / new_count); freq0 = LOWEST_FREQ; for (i = 0; i < new_count; i++) { freq1 = freq0 * step; if (i == 0) equ->bands[i]->type = BAND_TYPE_LOW_SHELF; else if (i == new_count - 1) equ->bands[i]->type = BAND_TYPE_HIGH_SHELF; else equ->bands[i]->type = BAND_TYPE_PEAK; equ->bands[i]->freq = freq0 + ((freq1 - freq0) / 2.0); equ->bands[i]->width = freq1 - freq0; GST_DEBUG ("band[%2d] = '%lf'", i, equ->bands[i]->freq); g_object_notify (G_OBJECT (equ->bands[i]), "bandwidth"); g_object_notify (G_OBJECT (equ->bands[i]), "freq"); g_object_notify (G_OBJECT (equ->bands[i]), "type"); /* if(equ->bands[i]->freq<10000.0) sprintf (name,"%dHz",(gint)equ->bands[i]->freq); else sprintf (name,"%dkHz",(gint)(equ->bands[i]->freq/1000.0)); gst_object_set_name( GST_OBJECT (equ->bands[i]), name); GST_DEBUG ("band[%2d] = '%s'",i,name); */ freq0 = freq1; } equ->need_new_coefficients = TRUE; BANDS_UNLOCK (equ); } /* start of code that is type specific */ #define CREATE_OPTIMIZED_FUNCTIONS_INT(TYPE,BIG_TYPE,MIN_VAL,MAX_VAL) \ typedef struct { \ BIG_TYPE x1, x2; /* history of input values for a filter */ \ BIG_TYPE y1, y2; /* history of output values for a filter */ \ } SecondOrderHistory ## TYPE; \ \ static inline BIG_TYPE \ one_step_ ## TYPE (GstIirEqualizerBand *filter, \ SecondOrderHistory ## TYPE *history, BIG_TYPE input) \ { \ /* calculate output */ \ BIG_TYPE output = filter->a0 * input + \ filter->a1 * history->x1 + filter->a2 * history->x2 + \ filter->b1 * history->y1 + filter->b2 * history->y2; \ /* update history */ \ history->y2 = history->y1; \ history->y1 = output; \ history->x2 = history->x1; \ history->x1 = input; \ \ return output; \ } \ \ static const guint \ history_size_ ## TYPE = sizeof (SecondOrderHistory ## TYPE); \ \ static void \ gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \ guint size, guint channels) \ { \ guint frames = size / channels / sizeof (TYPE); \ guint i, c, f, nf = equ->freq_band_count; \ BIG_TYPE cur; \ GstIirEqualizerBand **filters = equ->bands; \ \ for (i = 0; i < frames; i++) { \ SecondOrderHistory ## TYPE *history = equ->history; \ for (c = 0; c < channels; c++) { \ cur = *((TYPE *) data); \ for (f = 0; f < nf; f++) { \ cur = one_step_ ## TYPE (filters[f], history, cur); \ history++; \ } \ cur = CLAMP (cur, MIN_VAL, MAX_VAL); \ *((TYPE *) data) = (TYPE) floor (cur); \ data += sizeof (TYPE); \ } \ } \ } #define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \ typedef struct { \ TYPE x1, x2; /* history of input values for a filter */ \ TYPE y1, y2; /* history of output values for a filter */ \ } SecondOrderHistory ## TYPE; \ \ static inline TYPE \ one_step_ ## TYPE (GstIirEqualizerBand *filter, \ SecondOrderHistory ## TYPE *history, TYPE input) \ { \ /* calculate output */ \ TYPE output = filter->a0 * input + filter->a1 * history->x1 + \ filter->a2 * history->x2 + filter->b1 * history->y1 + \ filter->b2 * history->y2; \ /* update history */ \ history->y2 = history->y1; \ history->y1 = output; \ history->x2 = history->x1; \ history->x1 = input; \ \ return output; \ } \ \ static const guint \ history_size_ ## TYPE = sizeof (SecondOrderHistory ## TYPE); \ \ static void \ gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \ guint size, guint channels) \ { \ guint frames = size / channels / sizeof (TYPE); \ guint i, c, f, nf = equ->freq_band_count; \ TYPE cur; \ GstIirEqualizerBand **filters = equ->bands; \ \ for (i = 0; i < frames; i++) { \ SecondOrderHistory ## TYPE *history = equ->history; \ for (c = 0; c < channels; c++) { \ cur = *((TYPE *) data); \ for (f = 0; f < nf; f++) { \ cur = one_step_ ## TYPE (filters[f], history, cur); \ history++; \ } \ *((TYPE *) data) = (TYPE) cur; \ data += sizeof (TYPE); \ } \ } \ } CREATE_OPTIMIZED_FUNCTIONS_INT (gint16, gfloat, -32768.0, 32767.0); CREATE_OPTIMIZED_FUNCTIONS (gfloat); CREATE_OPTIMIZED_FUNCTIONS (gdouble); static GstFlowReturn gst_iir_equalizer_transform_ip (GstBaseTransform * btrans, GstBuffer * buf) { GstAudioFilter *filter = GST_AUDIO_FILTER (btrans); GstIirEqualizer *equ = GST_IIR_EQUALIZER (btrans); GstClockTime timestamp; gboolean need_new_coefficients; if (G_UNLIKELY (filter->format.channels < 1 || equ->process == NULL)) return GST_FLOW_NOT_NEGOTIATED; BANDS_LOCK (equ); need_new_coefficients = equ->need_new_coefficients; BANDS_UNLOCK (equ); if (!need_new_coefficients && gst_base_transform_is_passthrough (btrans)) return GST_FLOW_OK; timestamp = GST_BUFFER_TIMESTAMP (buf); timestamp = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { GstIirEqualizerBand **filters = equ->bands; guint f, nf = equ->freq_band_count; gst_object_sync_values (G_OBJECT (equ), timestamp); /* sync values for bands too */ /* FIXME: iterating equ->bands is not thread-safe here */ for (f = 0; f < nf; f++) { gst_object_sync_values (G_OBJECT (filters[f]), timestamp); } } BANDS_LOCK (equ); if (need_new_coefficients) { update_coefficients (equ); set_passthrough (equ); } BANDS_UNLOCK (equ); equ->process (equ, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), filter->format.channels); return GST_FLOW_OK; } static gboolean gst_iir_equalizer_setup (GstAudioFilter * audio, GstRingBufferSpec * fmt) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (audio); switch (fmt->type) { case GST_BUFTYPE_LINEAR: switch (fmt->width) { case 16: equ->history_size = history_size_gint16; equ->process = gst_iir_equ_process_gint16; break; default: return FALSE; } break; case GST_BUFTYPE_FLOAT: switch (fmt->width) { case 32: equ->history_size = history_size_gfloat; equ->process = gst_iir_equ_process_gfloat; break; case 64: equ->history_size = history_size_gdouble; equ->process = gst_iir_equ_process_gdouble; break; default: return FALSE; } break; default: return FALSE; } alloc_history (equ); return TRUE; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (equalizer_debug, "equalizer", 0, "equalizer"); if (!(gst_element_register (plugin, "equalizer-nbands", GST_RANK_NONE, GST_TYPE_IIR_EQUALIZER_NBANDS))) return FALSE; if (!(gst_element_register (plugin, "equalizer-3bands", GST_RANK_NONE, GST_TYPE_IIR_EQUALIZER_3BANDS))) return FALSE; if (!(gst_element_register (plugin, "equalizer-10bands", GST_RANK_NONE, GST_TYPE_IIR_EQUALIZER_10BANDS))) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "equalizer", "GStreamer audio equalizers", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizer3bands.h0000644000175000017500000000353411671175353021302 00000000000000/* GStreamer * Copyright (C) <2007> Stefan Kost * * 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_IIR_EQUALIZER_3BANDS__ #define __GST_IIR_EQUALIZER_3BANDS__ #include "gstiirequalizer.h" typedef struct _GstIirEqualizer3Bands GstIirEqualizer3Bands; typedef struct _GstIirEqualizer3BandsClass GstIirEqualizer3BandsClass; #define GST_TYPE_IIR_EQUALIZER_3BANDS \ (gst_iir_equalizer_3bands_get_type()) #define GST_IIR_EQUALIZER_3BANDS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_3BANDS,GstIirEqualizer3Bands)) #define GST_IIR_EQUALIZER_3BANDS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_3BANDS,GstIirEqualizer3BandsClass)) #define GST_IS_IIR_EQUALIZER_3BANDS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_3BANDS)) #define GST_IS_IIR_EQUALIZER_3BANDS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_3BANDS)) struct _GstIirEqualizer3Bands { GstIirEqualizer equalizer; }; struct _GstIirEqualizer3BandsClass { GstIirEqualizerClass equalizer_class; }; extern GType gst_iir_equalizer_3bands_get_type(void); #endif /* __GST_IIR_EQUALIZER_3BANDS__ */ gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizer10bands.c0000644000175000017500000002153011671175353021347 00000000000000/* GStreamer * Copyright (C) <2007> Stefan Kost * * 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-equalizer-10bands * * The 10 band equalizer element allows to change the gain of 10 equally distributed * frequency bands between 30 Hz and 15 kHz. * * * Example launch line * |[ * gst-launch filesrc location=song.ogg ! oggdemux ! vorbisdec ! audioconvert ! equalizer-10bands band2=3.0 ! alsasink * ]| This raises the volume of the 3rd band which is at 119 Hz by 3 db. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstiirequalizer.h" #include "gstiirequalizer10bands.h" enum { PROP_BAND0 = 1, PROP_BAND1, PROP_BAND2, PROP_BAND3, PROP_BAND4, PROP_BAND5, PROP_BAND6, PROP_BAND7, PROP_BAND8, PROP_BAND9, }; static void gst_iir_equalizer_10bands_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_iir_equalizer_10bands_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_DEBUG_CATEGORY_EXTERN (equalizer_debug); #define GST_CAT_DEFAULT equalizer_debug static void _do_init (GType object_type) { const GInterfaceInfo preset_interface_info = { NULL, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; g_type_add_interface_static (object_type, GST_TYPE_PRESET, &preset_interface_info); } GST_BOILERPLATE_FULL (GstIirEqualizer10Bands, gst_iir_equalizer_10bands, GstIirEqualizer, GST_TYPE_IIR_EQUALIZER, _do_init); /* equalizer implementation */ static void gst_iir_equalizer_10bands_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "10 Band Equalizer", "Filter/Effect/Audio", "Direct Form 10 band IIR equalizer", "Stefan Kost "); } static void gst_iir_equalizer_10bands_class_init (GstIirEqualizer10BandsClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_iir_equalizer_10bands_set_property; gobject_class->get_property = gst_iir_equalizer_10bands_get_property; g_object_class_install_property (gobject_class, PROP_BAND0, g_param_spec_double ("band0", "29 Hz", "gain for the frequency band 29 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND1, g_param_spec_double ("band1", "59 Hz", "gain for the frequency band 59 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND2, g_param_spec_double ("band2", "119 Hz", "gain for the frequency band 119 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND3, g_param_spec_double ("band3", "237 Hz", "gain for the frequency band 237 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND4, g_param_spec_double ("band4", "474 Hz", "gain for the frequency band 474 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND5, g_param_spec_double ("band5", "947 Hz", "gain for the frequency band 947 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND6, g_param_spec_double ("band6", "1889 Hz", "gain for the frequency band 1889 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND7, g_param_spec_double ("band7", "3770 Hz", "gain for the frequency band 3770 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND8, g_param_spec_double ("band8", "7523 Hz", "gain for the frequency band 7523 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BAND9, g_param_spec_double ("band9", "15011 Hz", "gain for the frequency band 15011 Hz, ranging from -24 dB to +12 dB", -24.0, 12.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); } static void gst_iir_equalizer_10bands_init (GstIirEqualizer10Bands * equ_n, GstIirEqualizer10BandsClass * g_class) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (equ_n); gst_iir_equalizer_compute_frequencies (equ, 10); } static void gst_iir_equalizer_10bands_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); switch (prop_id) { case PROP_BAND0: gst_child_proxy_set_property (GST_OBJECT (equ), "band0::gain", value); break; case PROP_BAND1: gst_child_proxy_set_property (GST_OBJECT (equ), "band1::gain", value); break; case PROP_BAND2: gst_child_proxy_set_property (GST_OBJECT (equ), "band2::gain", value); break; case PROP_BAND3: gst_child_proxy_set_property (GST_OBJECT (equ), "band3::gain", value); break; case PROP_BAND4: gst_child_proxy_set_property (GST_OBJECT (equ), "band4::gain", value); break; case PROP_BAND5: gst_child_proxy_set_property (GST_OBJECT (equ), "band5::gain", value); break; case PROP_BAND6: gst_child_proxy_set_property (GST_OBJECT (equ), "band6::gain", value); break; case PROP_BAND7: gst_child_proxy_set_property (GST_OBJECT (equ), "band7::gain", value); break; case PROP_BAND8: gst_child_proxy_set_property (GST_OBJECT (equ), "band8::gain", value); break; case PROP_BAND9: gst_child_proxy_set_property (GST_OBJECT (equ), "band9::gain", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_iir_equalizer_10bands_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstIirEqualizer *equ = GST_IIR_EQUALIZER (object); switch (prop_id) { case PROP_BAND0: gst_child_proxy_get_property (GST_OBJECT (equ), "band0::gain", value); break; case PROP_BAND1: gst_child_proxy_get_property (GST_OBJECT (equ), "band1::gain", value); break; case PROP_BAND2: gst_child_proxy_get_property (GST_OBJECT (equ), "band2::gain", value); break; case PROP_BAND3: gst_child_proxy_get_property (GST_OBJECT (equ), "band3::gain", value); break; case PROP_BAND4: gst_child_proxy_get_property (GST_OBJECT (equ), "band4::gain", value); break; case PROP_BAND5: gst_child_proxy_get_property (GST_OBJECT (equ), "band5::gain", value); break; case PROP_BAND6: gst_child_proxy_get_property (GST_OBJECT (equ), "band6::gain", value); break; case PROP_BAND7: gst_child_proxy_get_property (GST_OBJECT (equ), "band7::gain", value); break; case PROP_BAND8: gst_child_proxy_get_property (GST_OBJECT (equ), "band8::gain", value); break; case PROP_BAND9: gst_child_proxy_get_property (GST_OBJECT (equ), "band9::gain", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/equalizer/Makefile.in0000644000175000017500000010225211720560232016642 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/equalizer DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(presetdir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstequalizer_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstequalizer_la_OBJECTS = libgstequalizer_la-gstiirequalizer.lo \ libgstequalizer_la-gstiirequalizernbands.lo \ libgstequalizer_la-gstiirequalizer3bands.lo \ libgstequalizer_la-gstiirequalizer10bands.lo libgstequalizer_la_OBJECTS = $(am_libgstequalizer_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstequalizer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstequalizer_la_CFLAGS) $(CFLAGS) \ $(libgstequalizer_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstequalizer_la_SOURCES) DIST_SOURCES = $(libgstequalizer_la_SOURCES) DATA = $(preset_DATA) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstequalizer.la libgstequalizer_la_SOURCES = \ gstiirequalizer.c gstiirequalizer.h \ gstiirequalizernbands.c gstiirequalizernbands.h \ gstiirequalizer3bands.c gstiirequalizer3bands.h \ gstiirequalizer10bands.c gstiirequalizer10bands.h libgstequalizer_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) libgstequalizer_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \ $(GST_LIBS) $(LIBM) libgstequalizer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstequalizer_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstiirequalizer.h presetdir = $(datadir)/gstreamer-$(GST_MAJORMINOR)/presets preset_DATA = GstIirEqualizer3Bands.prs GstIirEqualizer10Bands.prs EXTRA_DIST = $(preset_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/equalizer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/equalizer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstequalizer.la: $(libgstequalizer_la_OBJECTS) $(libgstequalizer_la_DEPENDENCIES) $(EXTRA_libgstequalizer_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstequalizer_la_LINK) -rpath $(plugindir) $(libgstequalizer_la_OBJECTS) $(libgstequalizer_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstequalizer_la-gstiirequalizer.lo: gstiirequalizer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizer.c' object='libgstequalizer_la-gstiirequalizer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer.lo `test -f 'gstiirequalizer.c' || echo '$(srcdir)/'`gstiirequalizer.c libgstequalizer_la-gstiirequalizernbands.lo: gstiirequalizernbands.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizernbands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Tpo -c -o libgstequalizer_la-gstiirequalizernbands.lo `test -f 'gstiirequalizernbands.c' || echo '$(srcdir)/'`gstiirequalizernbands.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizernbands.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizernbands.c' object='libgstequalizer_la-gstiirequalizernbands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizernbands.lo `test -f 'gstiirequalizernbands.c' || echo '$(srcdir)/'`gstiirequalizernbands.c libgstequalizer_la-gstiirequalizer3bands.lo: gstiirequalizer3bands.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer3bands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Tpo -c -o libgstequalizer_la-gstiirequalizer3bands.lo `test -f 'gstiirequalizer3bands.c' || echo '$(srcdir)/'`gstiirequalizer3bands.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer3bands.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizer3bands.c' object='libgstequalizer_la-gstiirequalizer3bands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer3bands.lo `test -f 'gstiirequalizer3bands.c' || echo '$(srcdir)/'`gstiirequalizer3bands.c libgstequalizer_la-gstiirequalizer10bands.lo: gstiirequalizer10bands.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -MT libgstequalizer_la-gstiirequalizer10bands.lo -MD -MP -MF $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Tpo $(DEPDIR)/libgstequalizer_la-gstiirequalizer10bands.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstiirequalizer10bands.c' object='libgstequalizer_la-gstiirequalizer10bands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstequalizer_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstequalizer_la_CFLAGS) $(CFLAGS) -c -o libgstequalizer_la-gstiirequalizer10bands.lo `test -f 'gstiirequalizer10bands.c' || echo '$(srcdir)/'`gstiirequalizer10bands.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-presetDATA: $(preset_DATA) @$(NORMAL_INSTALL) test -z "$(presetdir)" || $(MKDIR_P) "$(DESTDIR)$(presetdir)" @list='$(preset_DATA)'; test -n "$(presetdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(presetdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(presetdir)" || exit $$?; \ done uninstall-presetDATA: @$(NORMAL_UNINSTALL) @list='$(preset_DATA)'; test -n "$(presetdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(presetdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(presetdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-presetDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES uninstall-presetDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-presetDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES \ uninstall-presetDATA Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstequalizer -:SHARED libgstequalizer \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstequalizer_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstequalizer_la_CFLAGS) \ -:LDFLAGS $(libgstequalizer_la_LDFLAGS) \ $(libgstequalizer_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/equalizer/GstIirEqualizer10Bands.prs0000644000175000017500000000266111671175353021535 00000000000000[_presets_] version=0.10 element-name=GstIirEqualizer10Bands [ballad] band0=4 band1=3.75 band2=2.5 band3=0 band4=-4 band5=-6 band6=-3 band7=0 band8=2.5 band9=9 [classic] band0=0 band1=0 band2=0 band3=0 band4=0 band5=0 band6=-6 band7=-7 band8=-7 band9=-9.5 [club] band0=0 band1=0 band2=8 band3=6 band4=5.5 band5=5 band6=3 band7=0 band8=0 band9=0 [dance] band0=9.6 band1=7 band2=2.5 band3=0 band4=0 band5=-5.6 band6=-7 band7=-7 band8=0 band9=0 [pop] band0=-1.6 band1=4.5 band2=7 band3=8 band4=5.6 band5=0 band6=-2.5 band7=-2 band8=-1.6 band9=-1.5 [reggae] band0=0 band1=0 band2=0 band3=-5.5 band4=0 band5=6.5 band6=6.5 band7=0 band8=0 band9=0 [rock] band0=8 band1=5 band2=-5.5 band3=-8 band4=-3 band5=4 band6=8 band7=11 band8=11 band9=11.5 [ska] band0=-2.5 band1=-5 band2=-4 band3=0 band4=4 band5=5.5 band6=8 band7=9 band8=11 band9=9 [soft] band0=5 band1=1.5 band2=0 band3=-2.5 band4=0 band5=4 band6=8 band7=9 band8=11 band9=12 [techno] band0=8 band1=5.5 band2=0 band3=-5.5 band4=-5 band5=0 band6=8 band7=10 band8=10 band9=9 [party] band0=7 band1=7 band2=0 band3=0 band4=0 band5=0 band6=0 band7=0 band8=7 band9=7 [more bass] band0=-8 band1=10 band2=10 band3=5.5 band4=1.5 band5=-4 band6=-8 band7=-10 band8=-11 band9=-11 [more bass and treble] band0=8 band1=5.5 band2=0 band3=-7 band4=-5 band5=1.5 band6=8 band7=11.2 band8=12 band9=12 [more treble] band0=-10 band1=-10 band2=-10 band3=-4 band4=2.5 band5=11 band6=16 band7=16 band8=16 band9=18 gst-plugins-good-0.10.31/gst/equalizer/GstIirEqualizer3Bands.prs0000644000175000017500000000021711671175353021452 00000000000000[_presets_] version=0.10 element-name=GstIirEqualizer3Bands [more bass] band0=7.75 band1=0 band2=0 [more trebble] band0=0 band1=0 band2=6.0 gst-plugins-good-0.10.31/gst/equalizer/gstiirequalizer10bands.h0000644000175000017500000000356211671175353021361 00000000000000/* GStreamer * Copyright (C) <2007> Stefan Kost * * 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_IIR_EQUALIZER_10BANDS__ #define __GST_IIR_EQUALIZER_10BANDS__ #include "gstiirequalizer.h" typedef struct _GstIirEqualizer10Bands GstIirEqualizer10Bands; typedef struct _GstIirEqualizer10BandsClass GstIirEqualizer10BandsClass; #define GST_TYPE_IIR_EQUALIZER_10BANDS \ (gst_iir_equalizer_10bands_get_type()) #define GST_IIR_EQUALIZER_10BANDS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_10BANDS,GstIirEqualizer10Bands)) #define GST_IIR_EQUALIZER_10BANDS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_10BANDS,GstIirEqualizer10BandsClass)) #define GST_IS_IIR_EQUALIZER_10BANDS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_10BANDS)) #define GST_IS_IIR_EQUALIZER_10BANDS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_10BANDS)) struct _GstIirEqualizer10Bands { GstIirEqualizer equalizer; }; struct _GstIirEqualizer10BandsClass { GstIirEqualizerClass equalizer_class; }; extern GType gst_iir_equalizer_10bands_get_type(void); #endif /* __GST_IIR_EQUALIZER_10BANDS__ */ gst-plugins-good-0.10.31/gst/udp/0000755000175000017500000000000011720565313013447 500000000000000gst-plugins-good-0.10.31/gst/udp/gstudpnetutils.c0000644000175000017500000002463211677341656016655 00000000000000/* GStreamer UDP network utility functions * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Joni Valtanen * Copyright (C) 2009 Jarkko Palviainen * * 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 #include #include #include #include #include "gstudpnetutils.h" /* EAI_ADDRFAMILY was obsoleted in BSD at some point */ #ifndef EAI_ADDRFAMILY #define EAI_ADDRFAMILY 1 #endif #ifdef G_OS_WIN32 gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj) { WSADATA w; int error; error = WSAStartup (0x0202, &w); if (error) { GST_WARNING_OBJECT (obj, "WSAStartup error: %d", error); return FALSE; } if (w.wVersion != 0x0202) { WSACleanup (); GST_WARNING_OBJECT (obj, "Winsock version wrong : 0x%x", w.wVersion); return FALSE; } return TRUE; } #endif int gst_udp_get_sockaddr_length (struct sockaddr_storage *addr) { /* MacOS is picky about passing precisely the correct length, * so we calculate it here for the given socket type. */ switch (addr->ss_family) { case AF_INET: return sizeof (struct sockaddr_in); case AF_INET6: return sizeof (struct sockaddr_in6); default: /* don't know, Screw MacOS and use the full length */ return sizeof (*addr); } } int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr) { struct addrinfo hints, *res = NULL, *nres; char service[NI_MAXSERV]; int ret; memset (&hints, 0, sizeof (hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; g_snprintf (service, sizeof (service) - 1, "%d", port); service[sizeof (service) - 1] = '\0'; if ((ret = getaddrinfo (hostname, (port == -1) ? NULL : service, &hints, &res)) < 0) { goto beach; } nres = res; while (nres) { if (nres->ai_family == AF_INET || nres->ai_family == AF_INET6) break; nres = nres->ai_next; } if (nres) { memcpy (addr, nres->ai_addr, nres->ai_addrlen); } else { ret = EAI_ADDRFAMILY; } freeaddrinfo (res); beach: return ret; } int gst_udp_set_loop (int sockfd, guint16 ss_family, gboolean loop) { int ret = -1; int l = (loop == FALSE) ? 0 : 1; switch (ss_family) { case AF_INET: { ret = setsockopt (sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &l, sizeof (l)); if (ret < 0) return ret; break; } case AF_INET6: { ret = setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &l, sizeof (l)); if (ret < 0) return ret; break; } default: #ifdef G_OS_WIN32 WSASetLastError (WSAEAFNOSUPPORT); #else errno = EAFNOSUPPORT; #endif } return ret; } int gst_udp_set_ttl (int sockfd, guint16 ss_family, int ttl, gboolean is_multicast) { int optname = -1; int ret = -1; switch (ss_family) { case AF_INET: { optname = (is_multicast == TRUE) ? IP_MULTICAST_TTL : IP_TTL; ret = setsockopt (sockfd, IPPROTO_IP, optname, &ttl, sizeof (ttl)); if (ret < 0) return ret; break; } case AF_INET6: { optname = (is_multicast == TRUE) ? IPV6_MULTICAST_HOPS : IPV6_UNICAST_HOPS; ret = setsockopt (sockfd, IPPROTO_IPV6, optname, &ttl, sizeof (ttl)); if (ret < 0) return ret; /* When using IPV4 address with IPV6 socket, both TTL values must be set in order to actually use the given value. Has no effect when IPV6 address is used. */ optname = (is_multicast == TRUE) ? IP_MULTICAST_TTL : IP_TTL; ret = setsockopt (sockfd, IPPROTO_IP, optname, &ttl, sizeof (ttl)); if (ret < 0) return ret; break; } default: #ifdef G_OS_WIN32 WSASetLastError (WSAEAFNOSUPPORT); #else errno = EAFNOSUPPORT; #endif } return ret; } /* FIXME: Add interface selection for windows hosts. */ int gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar * iface) { int ret = -1; switch (addr->ss_family) { case AF_INET: { #ifdef HAVE_IP_MREQN struct ip_mreqn mreq4; #else struct ip_mreq mreq4; #endif memset (&mreq4, 0, sizeof (mreq4)); mreq4.imr_multiaddr.s_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr; #ifdef HAVE_IP_MREQN if (iface) mreq4.imr_ifindex = if_nametoindex (iface); else mreq4.imr_ifindex = 0; /* Pick any. */ #else mreq4.imr_interface.s_addr = INADDR_ANY; #endif if ((ret = setsockopt (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *) &mreq4, sizeof (mreq4))) < 0) return ret; break; } case AF_INET6: { struct ipv6_mreq mreq6; memset (&mreq6, 0, sizeof (mreq6)); memcpy (&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *) addr)->sin6_addr), sizeof (struct in6_addr)); mreq6.ipv6mr_interface = 0; #if !defined(G_OS_WIN32) if (iface) mreq6.ipv6mr_interface = if_nametoindex (iface); #endif if ((ret = setsockopt (sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (const void *) &mreq6, sizeof (mreq6))) < 0) return ret; break; } default: #ifdef G_OS_WIN32 WSASetLastError (WSAEAFNOSUPPORT); #else errno = EAFNOSUPPORT; #endif } return ret; } int gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr) { int ret = -1; switch (addr->ss_family) { case AF_INET: { struct ip_mreq mreq4; memset (&mreq4, 0, sizeof (mreq4)); mreq4.imr_multiaddr.s_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr; mreq4.imr_interface.s_addr = INADDR_ANY; if ((ret = setsockopt (sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *) &mreq4, sizeof (mreq4))) < 0) return ret; } break; case AF_INET6: { struct ipv6_mreq mreq6; memset (&mreq6, 0, sizeof (mreq6)); memcpy (&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *) addr)->sin6_addr), sizeof (struct in6_addr)); mreq6.ipv6mr_interface = 0; if ((ret = setsockopt (sockfd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, (const void *) &mreq6, sizeof (mreq6))) < 0) return ret; } break; default: #ifdef G_OS_WIN32 WSASetLastError (WSAEAFNOSUPPORT); #else errno = EAFNOSUPPORT; #endif } return ret; } int gst_udp_is_multicast (struct sockaddr_storage *addr) { int ret = -1; switch (addr->ss_family) { case AF_INET: { struct sockaddr_in *addr4 = (struct sockaddr_in *) addr; ret = IN_MULTICAST (g_ntohl (addr4->sin_addr.s_addr)); } break; case AF_INET6: { struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr; ret = IN6_IS_ADDR_MULTICAST (&addr6->sin6_addr); } break; default: #ifdef G_OS_WIN32 WSASetLastError (WSAEAFNOSUPPORT); #else errno = EAFNOSUPPORT; #endif } return ret; } void gst_udp_uri_init (GstUDPUri * uri, const gchar * host, gint port) { uri->host = NULL; uri->port = -1; gst_udp_uri_update (uri, host, port); } int gst_udp_uri_update (GstUDPUri * uri, const gchar * host, gint port) { if (host) { g_free (uri->host); uri->host = g_strdup (host); if (strchr (host, ':')) uri->is_ipv6 = TRUE; else uri->is_ipv6 = FALSE; } if (port != -1) uri->port = port; return 0; } int gst_udp_parse_uri (const gchar * uristr, GstUDPUri * uri) { gchar *protocol, *location_start; gchar *location, *location_end; gchar *colptr; /* consider no protocol to be udp:// */ protocol = gst_uri_get_protocol (uristr); if (!protocol) goto no_protocol; if (strcmp (protocol, "udp") != 0) goto wrong_protocol; g_free (protocol); location_start = gst_uri_get_location (uristr); if (!location_start) return FALSE; GST_DEBUG ("got location '%s'", location_start); /* VLC compatibility, strip everything before the @ sign. VLC uses that as the * remote address. */ location = g_strstr_len (location_start, -1, "@"); if (location == NULL) location = location_start; else location += 1; if (location[0] == '[') { GST_DEBUG ("parse IPV6 address '%s'", location); location_end = strchr (location, ']'); if (location_end == NULL) goto wrong_address; uri->is_ipv6 = TRUE; g_free (uri->host); uri->host = g_strndup (location + 1, location_end - location - 1); colptr = strrchr (location_end, ':'); } else { GST_DEBUG ("parse IPV4 address '%s'", location); uri->is_ipv6 = FALSE; colptr = strrchr (location, ':'); g_free (uri->host); if (colptr != NULL) { uri->host = g_strndup (location, colptr - location); } else { uri->host = g_strdup (location); } } GST_DEBUG ("host set to '%s'", uri->host); if (colptr != NULL) { uri->port = atoi (colptr + 1); } g_free (location_start); return 0; /* ERRORS */ no_protocol: { GST_ERROR ("error parsing uri %s: no protocol", uristr); return -1; } wrong_protocol: { GST_ERROR ("error parsing uri %s: wrong protocol (%s != udp)", uristr, protocol); g_free (protocol); return -1; } wrong_address: { GST_ERROR ("error parsing uri %s", uristr); g_free (location); return -1; } } gchar * gst_udp_uri_string (GstUDPUri * uri) { gchar *result; if (uri->is_ipv6) { result = g_strdup_printf ("udp://[%s]:%d", uri->host, uri->port); } else { result = g_strdup_printf ("udp://%s:%d", uri->host, uri->port); } return result; } void gst_udp_uri_free (GstUDPUri * uri) { g_free (uri->host); uri->host = NULL; uri->port = -1; } gst-plugins-good-0.10.31/gst/udp/gstudp.c0000644000175000017500000000372111671175354015053 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #include "gstudpsrc.h" #include "gstmultiudpsink.h" #include "gstudpsink.h" #include "gstdynudpsink.h" static gboolean plugin_init (GstPlugin * plugin) { #ifdef G_OS_WIN32 if (!gst_udp_net_utils_win32_wsa_startup (GST_OBJECT (plugin))) return FALSE; #endif /* register type of the netbuffer so that we can use it from multiple threads * right away. Note that the plugin loading is always serialized */ gst_netbuffer_get_type (); if (!gst_element_register (plugin, "udpsink", GST_RANK_NONE, GST_TYPE_UDPSINK)) return FALSE; if (!gst_element_register (plugin, "multiudpsink", GST_RANK_NONE, GST_TYPE_MULTIUDPSINK)) return FALSE; if (!gst_element_register (plugin, "dynudpsink", GST_RANK_NONE, GST_TYPE_DYNUDPSINK)) return FALSE; if (!gst_element_register (plugin, "udpsrc", GST_RANK_NONE, GST_TYPE_UDPSRC)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "udp", "transfer data via UDP", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/udp/Makefile.am0000644000175000017500000000326011671175354015433 00000000000000plugin_LTLIBRARIES = libgstudp.la # variables used for enum/marshal generation glib_enum_headers = gstudp.h glib_enum_define = GST_UDP glib_gen_prefix = gst_udp glib_gen_basename = gstudp include $(top_srcdir)/common/gst-glib-gen.mak built_sources = gstudp-enumtypes.c gstudp-marshal.c built_headers = gstudp-enumtypes.h gstudp-marshal.h BUILT_SOURCES = $(built_sources) $(built_headers) libgstudp_la_SOURCES = gstudp.c gstudpsrc.c gstudpsink.c gstmultiudpsink.c gstdynudpsink.c gstudpnetutils.c # adding -D_GNU_SOURCE to get non-POSIX extensions like EAI_ADDRFAMILY # with glibc >= 2.8 when including netdb.h (see glibc sources bug 6452) libgstudp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -D_GNU_SOURCE libgstudp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstnetbuffer-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(WIN32_LIBS) libgstudp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstudp_la_LIBTOOLFLAGS = --tag=disable-static nodist_libgstudp_la_SOURCES = \ $(built_sources) noinst_HEADERS = gstudpsink.h gstudpsrc.h gstudp.h gstmultiudpsink.h gstdynudpsink.h gstudpnetutils.h EXTRA_DIST = README gstudp-marshal.list CLEANFILES = $(BUILT_SOURCES) Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstudp -:SHARED libgstudp \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstudp_la_SOURCES) \ $(nodist_libgstudp_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstudp_la_CFLAGS) \ -:LDFLAGS $(libgstudp_la_LDFLAGS) \ $(libgstudp_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/udp/gstudp.h0000644000175000017500000000205211671175354015054 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 "gstudp-enumtypes.h" #include #ifndef __GST_UDP_H__ #define __GST_UDP_H__ G_BEGIN_DECLS typedef enum { CONTROL_ZERO, CONTROL_NONE, CONTROL_UDP, CONTROL_TCP } GstUDPControl; G_END_DECLS #endif /* __GST_UDP_H__ */ gst-plugins-good-0.10.31/gst/udp/gstmultiudpsink.c0000644000175000017500000011470211717042067017010 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * Copyright (C) <2009> Jarkko Palviainen * * 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-multiudpsink * @see_also: udpsink, multifdsink * * multiudpsink is a network sink that sends UDP packets to multiple * clients. * It can be combined with rtp payload encoders to implement RTP streaming. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstudp-marshal.h" #include "gstmultiudpsink.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include "gst/glib-compat-private.h" GST_DEBUG_CATEGORY_STATIC (multiudpsink_debug); #define GST_CAT_DEFAULT (multiudpsink_debug) #define UDP_MAX_SIZE 65507 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); /* MultiUDPSink signals and args */ enum { /* methods */ SIGNAL_ADD, SIGNAL_REMOVE, SIGNAL_CLEAR, SIGNAL_GET_STATS, /* signals */ SIGNAL_CLIENT_ADDED, SIGNAL_CLIENT_REMOVED, /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_SOCKFD -1 #define DEFAULT_CLOSEFD TRUE #define DEFAULT_SOCK -1 #define DEFAULT_CLIENTS NULL #define DEFAULT_FAMILY 0 /* FIXME, this should be disabled by default, we don't need to join a multicast * group for sending, if this socket is also used for receiving, it should * be configured in the element that does the receive. */ #define DEFAULT_AUTO_MULTICAST TRUE #define DEFAULT_TTL 64 #define DEFAULT_TTL_MC 1 #define DEFAULT_LOOP TRUE #define DEFAULT_QOS_DSCP -1 #define DEFAULT_SEND_DUPLICATES TRUE #define DEFAULT_BUFFER_SIZE 0 enum { PROP_0, PROP_BYTES_TO_SERVE, PROP_BYTES_SERVED, PROP_SOCKFD, PROP_CLOSEFD, PROP_SOCK, PROP_CLIENTS, PROP_AUTO_MULTICAST, PROP_TTL, PROP_TTL_MC, PROP_LOOP, PROP_QOS_DSCP, PROP_SEND_DUPLICATES, PROP_BUFFER_SIZE, PROP_LAST }; #define CLOSE_IF_REQUESTED(udpctx) \ G_STMT_START { \ if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \ CLOSE_SOCKET(udpctx->sock); \ if (udpctx->sock == udpctx->sockfd) \ udpctx->sockfd = DEFAULT_SOCKFD; \ } \ udpctx->sock = DEFAULT_SOCK; \ } G_STMT_END static void gst_multiudpsink_base_init (gpointer g_class); static void gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass); static void gst_multiudpsink_init (GstMultiUDPSink * udpsink); static void gst_multiudpsink_finalize (GObject * object); static GstFlowReturn gst_multiudpsink_render (GstBaseSink * sink, GstBuffer * buffer); #ifndef G_OS_WIN32 /* sendmsg() is not available on Windows */ static GstFlowReturn gst_multiudpsink_render_list (GstBaseSink * bsink, GstBufferList * list); #endif static GstStateChangeReturn gst_multiudpsink_change_state (GstElement * element, GstStateChange transition); static void gst_multiudpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_multiudpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host, gint port, gboolean lock); static void gst_multiudpsink_clear_internal (GstMultiUDPSink * sink, gboolean lock); static GstElementClass *parent_class = NULL; static guint gst_multiudpsink_signals[LAST_SIGNAL] = { 0 }; GType gst_multiudpsink_get_type (void) { static GType multiudpsink_type = 0; if (!multiudpsink_type) { static const GTypeInfo multiudpsink_info = { sizeof (GstMultiUDPSinkClass), gst_multiudpsink_base_init, NULL, (GClassInitFunc) gst_multiudpsink_class_init, NULL, NULL, sizeof (GstMultiUDPSink), 0, (GInstanceInitFunc) gst_multiudpsink_init, NULL }; multiudpsink_type = g_type_register_static (GST_TYPE_BASE_SINK, "GstMultiUDPSink", &multiudpsink_info, 0); } return multiudpsink_type; } static void gst_multiudpsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "UDP packet sender", "Sink/Network", "Send data over the network via UDP", "Wim Taymans "); } static void gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_multiudpsink_set_property; gobject_class->get_property = gst_multiudpsink_get_property; gobject_class->finalize = gst_multiudpsink_finalize; /** * GstMultiUDPSink::add: * @gstmultiudpsink: the sink on which the signal is emitted * @host: the hostname/IP address of the client to add * @port: the port of the client to add * * Add a client with destination @host and @port to the list of * clients. When the same host/port pair is added multiple times, the * send-duplicates property defines if the packets are sent multiple times to * the same host/port pair or not. * * When a host/port pair is added multiple times, an equal amount of remove * calls must be performed to actually remove the host/port pair from the list * of destinations. */ gst_multiudpsink_signals[SIGNAL_ADD] = g_signal_new ("add", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiUDPSinkClass, add), NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); /** * GstMultiUDPSink::remove: * @gstmultiudpsink: the sink on which the signal is emitted * @host: the hostname/IP address of the client to remove * @port: the port of the client to remove * * Remove the client with destination @host and @port from the list of * clients. */ gst_multiudpsink_signals[SIGNAL_REMOVE] = g_signal_new ("remove", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiUDPSinkClass, remove), NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); /** * GstMultiUDPSink::clear: * @gstmultiudpsink: the sink on which the signal is emitted * * Clear the list of clients. */ gst_multiudpsink_signals[SIGNAL_CLEAR] = g_signal_new ("clear", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiUDPSinkClass, clear), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * GstMultiUDPSink::get-stats: * @gstmultiudpsink: the sink on which the signal is emitted * @host: the hostname/IP address of the client to get stats on * @port: the port of the client to get stats on * * Get the statistics of the client with destination @host and @port. * * Returns: a GValueArray of uint64: bytes_sent, packets_sent, * connect_time (in epoch seconds), disconnect_time (in epoch seconds) */ gst_multiudpsink_signals[SIGNAL_GET_STATS] = g_signal_new ("get-stats", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstMultiUDPSinkClass, get_stats), NULL, NULL, gst_udp_marshal_BOXED__STRING_INT, G_TYPE_VALUE_ARRAY, 2, G_TYPE_STRING, G_TYPE_INT); /** * GstMultiUDPSink::client-added: * @gstmultiudpsink: the sink emitting the signal * @host: the hostname/IP address of the added client * @port: the port of the added client * * Signal emited when a new client is added to the list of * clients. */ gst_multiudpsink_signals[SIGNAL_CLIENT_ADDED] = g_signal_new ("client-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiUDPSinkClass, client_added), NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); /** * GstMultiUDPSink::client-removed: * @gstmultiudpsink: the sink emitting the signal * @host: the hostname/IP address of the removed client * @port: the port of the removed client * * Signal emited when a client is removed from the list of * clients. */ gst_multiudpsink_signals[SIGNAL_CLIENT_REMOVED] = g_signal_new ("client-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstMultiUDPSinkClass, client_removed), NULL, NULL, gst_udp_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BYTES_TO_SERVE, g_param_spec_uint64 ("bytes-to-serve", "Bytes to serve", "Number of bytes received to serve to clients", 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BYTES_SERVED, g_param_spec_uint64 ("bytes-served", "Bytes served", "Total number of bytes sent to all clients", 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SOCKFD, g_param_spec_int ("sockfd", "Socket Handle", "Socket to use for UDP sending. (-1 == allocate)", -1, G_MAXINT, DEFAULT_SOCKFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CLOSEFD, g_param_spec_boolean ("closefd", "Close sockfd", "Close sockfd if passed as property on state change", DEFAULT_CLOSEFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SOCK, g_param_spec_int ("sock", "Socket Handle", "Socket currently in use for UDP sending. (-1 == no socket)", -1, G_MAXINT, DEFAULT_SOCK, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CLIENTS, g_param_spec_string ("clients", "Clients", "A comma separated list of host:port pairs with destinations", DEFAULT_CLIENTS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_AUTO_MULTICAST, g_param_spec_boolean ("auto-multicast", "Automatically join/leave multicast groups", "Automatically join/leave the multicast groups, FALSE means user" " has to do it himself", DEFAULT_AUTO_MULTICAST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TTL, g_param_spec_int ("ttl", "Unicast TTL", "Used for setting the unicast TTL parameter", 0, 255, DEFAULT_TTL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TTL_MC, g_param_spec_int ("ttl-mc", "Multicast TTL", "Used for setting the multicast TTL parameter", 0, 255, DEFAULT_TTL_MC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_LOOP, g_param_spec_boolean ("loop", "Multicast Loopback", "Used for setting the multicast loop parameter. TRUE = enable," " FALSE = disable", DEFAULT_LOOP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_QOS_DSCP, g_param_spec_int ("qos-dscp", "QoS diff srv code point", "Quality of Service, differentiated services code point (-1 default)", -1, 63, DEFAULT_QOS_DSCP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstMultiUDPSink::send-duplicates * * When a host/port pair is added mutliple times, send the packet to the host * multiple times as well. * * Since: 0.10.26 */ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEND_DUPLICATES, g_param_spec_boolean ("send-duplicates", "Send Duplicates", "When a distination/port pair is added multiple times, send packets " "multiple times as well", DEFAULT_SEND_DUPLICATES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_SIZE, g_param_spec_int ("buffer-size", "Buffer Size", "Size of the kernel send buffer in bytes, 0=default", 0, G_MAXINT, DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = gst_multiudpsink_change_state; gstbasesink_class->render = gst_multiudpsink_render; #ifndef G_OS_WIN32 gstbasesink_class->render_list = gst_multiudpsink_render_list; #endif klass->add = gst_multiudpsink_add; klass->remove = gst_multiudpsink_remove; klass->clear = gst_multiudpsink_clear; klass->get_stats = gst_multiudpsink_get_stats; GST_DEBUG_CATEGORY_INIT (multiudpsink_debug, "multiudpsink", 0, "UDP sink"); } static void gst_multiudpsink_init (GstMultiUDPSink * sink) { WSA_STARTUP (sink); sink->client_lock = g_mutex_new (); sink->sock = DEFAULT_SOCK; sink->sockfd = DEFAULT_SOCKFD; sink->closefd = DEFAULT_CLOSEFD; sink->externalfd = (sink->sockfd != -1); sink->auto_multicast = DEFAULT_AUTO_MULTICAST; sink->ttl = DEFAULT_TTL; sink->ttl_mc = DEFAULT_TTL_MC; sink->loop = DEFAULT_LOOP; sink->qos_dscp = DEFAULT_QOS_DSCP; sink->ss_family = DEFAULT_FAMILY; sink->send_duplicates = DEFAULT_SEND_DUPLICATES; } static GstUDPClient * create_client (GstMultiUDPSink * sink, const gchar * host, gint port) { GstUDPClient *client; client = g_slice_new0 (GstUDPClient); client->refcount = 1; client->host = g_strdup (host); client->port = port; return client; } static void free_client (GstUDPClient * client) { g_free (client->host); g_slice_free (GstUDPClient, client); } static gint client_compare (GstUDPClient * a, GstUDPClient * b) { if ((a->port == b->port) && (strcmp (a->host, b->host) == 0)) return 0; return 1; } static void gst_multiudpsink_finalize (GObject * object) { GstMultiUDPSink *sink; sink = GST_MULTIUDPSINK (object); g_list_foreach (sink->clients, (GFunc) free_client, NULL); g_list_free (sink->clients); if (sink->sockfd >= 0 && sink->closefd) CLOSE_SOCKET (sink->sockfd); g_mutex_free (sink->client_lock); WSA_CLEANUP (object); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean socket_error_is_ignorable (void) { #ifdef G_OS_WIN32 /* Windows doesn't seem to have an EAGAIN for sockets */ return WSAGetLastError () == WSAEINTR; #else return errno == EINTR || errno == EAGAIN; #endif } static int socket_last_error_code (void) { #ifdef G_OS_WIN32 return WSAGetLastError (); #else return errno; #endif } static gchar * socket_last_error_message (void) { #ifdef G_OS_WIN32 int errorcode = WSAGetLastError (); wchar_t buf[1024]; DWORD result = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorcode, 0, (LPSTR) buf, sizeof (buf) / sizeof (wchar_t), NULL); if (FAILED (result)) { return g_strdup ("failed to get error message from system"); } else { gchar *res = g_convert ((gchar *) buf, -1, "UTF-16", "UTF-8", NULL, NULL, NULL); /* g_convert() internally calls windows functions which reset the windows error code, so fix it up again like this */ WSASetLastError (errorcode); return res; } #else return g_strdup (g_strerror (errno)); #endif } static GstFlowReturn gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer) { GstMultiUDPSink *sink; gint ret, size, num = 0, no_clients = 0; guint8 *data; GList *clients; gint len; sink = GST_MULTIUDPSINK (bsink); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); if (size > UDP_MAX_SIZE) { GST_WARNING ("Attempting to send a UDP packet larger than maximum " "size (%d > %d)", size, UDP_MAX_SIZE); } sink->bytes_to_serve += size; /* grab lock while iterating and sending to clients, this should be * fast as UDP never blocks */ g_mutex_lock (sink->client_lock); GST_LOG_OBJECT (bsink, "about to send %d bytes", size); for (clients = sink->clients; clients; clients = g_list_next (clients)) { GstUDPClient *client; gint count; client = (GstUDPClient *) clients->data; no_clients++; GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client); count = sink->send_duplicates ? client->refcount : 1; while (count--) { while (TRUE) { len = gst_udp_get_sockaddr_length (&client->theiraddr); ret = sendto (*client->sock, #ifdef G_OS_WIN32 (char *) data, #else data, #endif size, 0, (struct sockaddr *) &client->theiraddr, len); if (ret < 0) { /* some error, just warn, it's likely recoverable and we don't want to * break streaming. We break so that we stop retrying for this client. */ if (!socket_error_is_ignorable ()) { gchar *errormessage = socket_last_error_message (); GST_WARNING_OBJECT (sink, "client %p gave error %d (%s)", client, socket_last_error_code (), errormessage); g_free (errormessage); break; } } else { num++; client->bytes_sent += ret; client->packets_sent++; sink->bytes_served += ret; break; } } } } g_mutex_unlock (sink->client_lock); GST_LOG_OBJECT (sink, "sent %d bytes to %d (of %d) clients", size, num, no_clients); return GST_FLOW_OK; } #ifndef G_OS_WIN32 static GstFlowReturn gst_multiudpsink_render_list (GstBaseSink * bsink, GstBufferList * list) { GstMultiUDPSink *sink; GList *clients; gint ret, size = 0, num = 0, no_clients = 0; struct iovec *iov; struct msghdr msg = { 0 }; GstBufferListIterator *it; guint gsize; GstBuffer *buf; sink = GST_MULTIUDPSINK (bsink); g_return_val_if_fail (list != NULL, GST_FLOW_ERROR); it = gst_buffer_list_iterate (list); g_return_val_if_fail (it != NULL, GST_FLOW_ERROR); while (gst_buffer_list_iterator_next_group (it)) { msg.msg_iovlen = 0; size = 0; if ((gsize = gst_buffer_list_iterator_n_buffers (it)) == 0) { goto invalid_list; } iov = (struct iovec *) g_malloc (gsize * sizeof (struct iovec)); msg.msg_iov = iov; while ((buf = gst_buffer_list_iterator_next (it))) { if (GST_BUFFER_SIZE (buf) > UDP_MAX_SIZE) { GST_WARNING ("Attempting to send a UDP packet larger than maximum " "size (%d > %d)", GST_BUFFER_SIZE (buf), UDP_MAX_SIZE); } msg.msg_iov[msg.msg_iovlen].iov_len = GST_BUFFER_SIZE (buf); msg.msg_iov[msg.msg_iovlen].iov_base = GST_BUFFER_DATA (buf); msg.msg_iovlen++; size += GST_BUFFER_SIZE (buf); } sink->bytes_to_serve += size; /* grab lock while iterating and sending to clients, this should be * fast as UDP never blocks */ g_mutex_lock (sink->client_lock); GST_LOG_OBJECT (bsink, "about to send %d bytes", size); for (clients = sink->clients; clients; clients = g_list_next (clients)) { GstUDPClient *client; gint count; client = (GstUDPClient *) clients->data; no_clients++; GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client); count = sink->send_duplicates ? client->refcount : 1; while (count--) { while (TRUE) { msg.msg_name = (void *) &client->theiraddr; msg.msg_namelen = sizeof (client->theiraddr); ret = sendmsg (*client->sock, &msg, 0); if (ret < 0) { if (!socket_error_is_ignorable ()) { break; } } else { num++; client->bytes_sent += ret; client->packets_sent++; sink->bytes_served += ret; break; } } } } g_mutex_unlock (sink->client_lock); g_free (iov); msg.msg_iov = NULL; GST_LOG_OBJECT (sink, "sent %d bytes to %d (of %d) clients", size, num, no_clients); } gst_buffer_list_iterator_free (it); return GST_FLOW_OK; invalid_list: gst_buffer_list_iterator_free (it); return GST_FLOW_ERROR; } #endif static void gst_multiudpsink_set_clients_string (GstMultiUDPSink * sink, const gchar * string) { gchar **clients; gint i; clients = g_strsplit (string, ",", 0); g_mutex_lock (sink->client_lock); /* clear all existing clients */ gst_multiudpsink_clear_internal (sink, FALSE); for (i = 0; clients[i]; i++) { gchar *host, *p; gint port = 0; host = clients[i]; p = strstr (clients[i], ":"); if (p != NULL) { *p = '\0'; port = atoi (p + 1); } if (port != 0) gst_multiudpsink_add_internal (sink, host, port, FALSE); } g_mutex_unlock (sink->client_lock); g_strfreev (clients); } static gchar * gst_multiudpsink_get_clients_string (GstMultiUDPSink * sink) { GString *str; GList *clients; str = g_string_new (""); g_mutex_lock (sink->client_lock); clients = sink->clients; while (clients) { GstUDPClient *client; gint count; client = (GstUDPClient *) clients->data; clients = g_list_next (clients); count = client->refcount; while (count--) { g_string_append_printf (str, "%s:%d%s", client->host, client->port, (clients || count > 1 ? "," : "")); } } g_mutex_unlock (sink->client_lock); return g_string_free (str, FALSE); } static void gst_multiudpsink_setup_qos_dscp (GstMultiUDPSink * sink) { gint tos; /* don't touch on -1 */ if (sink->qos_dscp < 0) return; if (sink->sock < 0) return; GST_DEBUG_OBJECT (sink, "setting TOS to %d", sink->qos_dscp); /* Extract and shift 6 bits of DSFIELD */ tos = (sink->qos_dscp & 0x3f) << 2; if (setsockopt (sink->sock, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0) { gchar *errormessage = socket_last_error_message (); GST_ERROR_OBJECT (sink, "could not set TOS: %s", errormessage); g_free (errormessage); } #ifdef IPV6_TCLASS if (setsockopt (sink->sock, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof (tos)) < 0) { gchar *errormessage = socket_last_error_message (); GST_ERROR_OBJECT (sink, "could not set TCLASS: %s", errormessage); g_free (errormessage); } #endif } static void gst_multiudpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMultiUDPSink *udpsink; udpsink = GST_MULTIUDPSINK (object); switch (prop_id) { case PROP_SOCKFD: if (udpsink->sockfd >= 0 && udpsink->sockfd != udpsink->sock && udpsink->closefd) CLOSE_SOCKET (udpsink->sockfd); udpsink->sockfd = g_value_get_int (value); GST_DEBUG_OBJECT (udpsink, "setting SOCKFD to %d", udpsink->sockfd); break; case PROP_CLOSEFD: udpsink->closefd = g_value_get_boolean (value); break; case PROP_CLIENTS: gst_multiudpsink_set_clients_string (udpsink, g_value_get_string (value)); break; case PROP_AUTO_MULTICAST: udpsink->auto_multicast = g_value_get_boolean (value); break; case PROP_TTL: udpsink->ttl = g_value_get_int (value); break; case PROP_TTL_MC: udpsink->ttl_mc = g_value_get_int (value); break; case PROP_LOOP: udpsink->loop = g_value_get_boolean (value); break; case PROP_QOS_DSCP: udpsink->qos_dscp = g_value_get_int (value); gst_multiudpsink_setup_qos_dscp (udpsink); break; case PROP_SEND_DUPLICATES: udpsink->send_duplicates = g_value_get_boolean (value); break; case PROP_BUFFER_SIZE: udpsink->buffer_size = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_multiudpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMultiUDPSink *udpsink; udpsink = GST_MULTIUDPSINK (object); switch (prop_id) { case PROP_BYTES_TO_SERVE: g_value_set_uint64 (value, udpsink->bytes_to_serve); break; case PROP_BYTES_SERVED: g_value_set_uint64 (value, udpsink->bytes_served); break; case PROP_SOCKFD: g_value_set_int (value, udpsink->sockfd); break; case PROP_CLOSEFD: g_value_set_boolean (value, udpsink->closefd); break; case PROP_SOCK: g_value_set_int (value, udpsink->sock); break; case PROP_CLIENTS: g_value_take_string (value, gst_multiudpsink_get_clients_string (udpsink)); break; case PROP_AUTO_MULTICAST: g_value_set_boolean (value, udpsink->auto_multicast); break; case PROP_TTL: g_value_set_int (value, udpsink->ttl); break; case PROP_TTL_MC: g_value_set_int (value, udpsink->ttl_mc); break; case PROP_LOOP: g_value_set_boolean (value, udpsink->loop); break; case PROP_QOS_DSCP: g_value_set_int (value, udpsink->qos_dscp); break; case PROP_SEND_DUPLICATES: g_value_set_boolean (value, udpsink->send_duplicates); break; case PROP_BUFFER_SIZE: g_value_set_int (value, udpsink->buffer_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_multiudpsink_configure_client (GstMultiUDPSink * sink, GstUDPClient * client) { GST_DEBUG_OBJECT (sink, "configuring client %p", client); if (gst_udp_is_multicast (&client->theiraddr)) { GST_DEBUG_OBJECT (sink, "we have a multicast client %p", client); if (sink->auto_multicast) { GST_DEBUG_OBJECT (sink, "autojoining group"); if (gst_udp_join_group (*(client->sock), &client->theiraddr, NULL) != 0) goto join_group_failed; } GST_DEBUG_OBJECT (sink, "setting loop to %d", sink->loop); if (gst_udp_set_loop (sink->sock, sink->ss_family, sink->loop) != 0) goto loop_failed; GST_DEBUG_OBJECT (sink, "setting ttl to %d", sink->ttl_mc); if (gst_udp_set_ttl (sink->sock, sink->ss_family, sink->ttl_mc, TRUE) != 0) goto ttl_failed; } else { GST_DEBUG_OBJECT (sink, "setting unicast ttl to %d", sink->ttl); if (gst_udp_set_ttl (sink->sock, sink->ss_family, sink->ttl, FALSE) != 0) goto ttl_failed; } return TRUE; /* ERRORS */ join_group_failed: { gchar *errormessage = socket_last_error_message (); int errorcode = socket_last_error_code (); CLOSE_IF_REQUESTED (sink); GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), ("Could not join multicast group (%d): %s", errorcode, errormessage)); g_free (errormessage); return FALSE; } ttl_failed: { gchar *errormessage = socket_last_error_message (); int errorcode = socket_last_error_code (); CLOSE_IF_REQUESTED (sink); GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), ("Could not set TTL socket option (%d): %s", errorcode, errormessage)); g_free (errormessage); return FALSE; } loop_failed: { gchar *errormessage = socket_last_error_message (); int errorcode = socket_last_error_code (); CLOSE_IF_REQUESTED (sink); GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), ("Could not set loopback socket option (%d): %s", errorcode, errormessage)); g_free (errormessage); return FALSE; } } /* create a socket for sending to remote machine */ static gboolean gst_multiudpsink_init_send (GstMultiUDPSink * sink) { guint bc_val; GList *clients; GstUDPClient *client; int sndsize, ret; socklen_t len; if (sink->sockfd == -1) { GST_DEBUG_OBJECT (sink, "creating sockets"); /* create sender socket try IP6, fall back to IP4 */ sink->ss_family = AF_INET6; if ((sink->sock = socket (AF_INET6, SOCK_DGRAM, 0)) == -1) { sink->ss_family = AF_INET; if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1) goto no_socket; } GST_DEBUG_OBJECT (sink, "have socket"); sink->externalfd = FALSE; } else { struct sockaddr_storage myaddr; GST_DEBUG_OBJECT (sink, "using configured socket"); /* we use the configured socket, try to get some info about it */ len = sizeof (myaddr); if (getsockname (sink->sockfd, (struct sockaddr *) &myaddr, &len) < 0) goto getsockname_error; sink->ss_family = myaddr.ss_family; /* we use the configured socket */ sink->sock = sink->sockfd; sink->externalfd = TRUE; } len = sizeof (sndsize); if (sink->buffer_size != 0) { sndsize = sink->buffer_size; GST_DEBUG_OBJECT (sink, "setting udp buffer of %d bytes", sndsize); /* set buffer size, Note that on Linux this is typically limited to a * maximum of around 100K. Also a minimum of 128 bytes is required on * Linux. */ ret = setsockopt (sink->sockfd, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, len); if (ret != 0) { GST_ELEMENT_WARNING (sink, RESOURCE, SETTINGS, (NULL), ("Could not create a buffer of requested %d bytes, %d: %s (%d)", sndsize, ret, g_strerror (errno), errno)); } } /* read the value of the receive buffer. Note that on linux this returns 2x the * value we set because the kernel allocates extra memory for metadata. * The default on Linux is about 100K (which is about 50K without metadata) */ ret = getsockopt (sink->sockfd, SOL_SOCKET, SO_SNDBUF, (void *) &sndsize, &len); if (ret == 0) GST_DEBUG_OBJECT (sink, "have udp buffer of %d bytes", sndsize); else GST_DEBUG_OBJECT (sink, "could not get udp buffer size"); bc_val = 1; if (setsockopt (sink->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)) < 0) goto no_broadcast; sink->bytes_to_serve = 0; sink->bytes_served = 0; gst_multiudpsink_setup_qos_dscp (sink); /* look for multicast clients and join multicast groups appropriately set also ttl and multicast loopback delivery appropriately */ for (clients = sink->clients; clients; clients = g_list_next (clients)) { client = (GstUDPClient *) clients->data; if (!gst_multiudpsink_configure_client (sink, client)) return FALSE; } return TRUE; /* ERRORS */ no_socket: { gchar *errormessage = socket_last_error_message (); int errorcode = socket_last_error_code (); GST_ELEMENT_ERROR (sink, RESOURCE, FAILED, (NULL), ("Could not create socket (%d): %s", errorcode, errormessage)); g_free (errormessage); return FALSE; } getsockname_error: { gchar *errormessage = socket_last_error_message (); int errorcode = socket_last_error_code (); GST_ELEMENT_ERROR (sink, RESOURCE, FAILED, (NULL), ("Could not getsockname (%d): %s", errorcode, errormessage)); g_free (errormessage); return FALSE; } no_broadcast: { gchar *errormessage = socket_last_error_message (); int errorcode = socket_last_error_code (); CLOSE_IF_REQUESTED (sink); GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), ("Could not set broadcast socket option (%d): %s", errorcode, errormessage)); g_free (errormessage); return FALSE; } } static void gst_multiudpsink_close (GstMultiUDPSink * sink) { CLOSE_IF_REQUESTED (sink); } static void gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host, gint port, gboolean lock) { GstUDPClient *client; GstUDPClient udpclient; GTimeVal now; GList *find; udpclient.host = (gchar *) host; udpclient.port = port; GST_DEBUG_OBJECT (sink, "adding client on host %s, port %d", host, port); if (lock) g_mutex_lock (sink->client_lock); find = g_list_find_custom (sink->clients, &udpclient, (GCompareFunc) client_compare); if (find) { client = (GstUDPClient *) find->data; GST_DEBUG_OBJECT (sink, "found %d existing clients with host %s, port %d", client->refcount, host, port); client->refcount++; } else { client = create_client (sink, host, port); client->sock = &sink->sock; if (gst_udp_get_addr (host, port, &client->theiraddr) < 0) goto getaddrinfo_error; g_get_current_time (&now); client->connect_time = GST_TIMEVAL_TO_TIME (now); if (*client->sock > 0) { gst_multiudpsink_configure_client (sink, client); } GST_DEBUG_OBJECT (sink, "add client with host %s, port %d", host, port); sink->clients = g_list_prepend (sink->clients, client); } if (lock) g_mutex_unlock (sink->client_lock); g_signal_emit (G_OBJECT (sink), gst_multiudpsink_signals[SIGNAL_CLIENT_ADDED], 0, host, port); GST_DEBUG_OBJECT (sink, "added client on host %s, port %d", host, port); return; /* ERRORS */ getaddrinfo_error: { GST_DEBUG_OBJECT (sink, "did not add client on host %s, port %d", host, port); GST_WARNING_OBJECT (sink, "getaddrinfo lookup error?"); free_client (client); if (lock) g_mutex_unlock (sink->client_lock); return; } } void gst_multiudpsink_add (GstMultiUDPSink * sink, const gchar * host, gint port) { gst_multiudpsink_add_internal (sink, host, port, TRUE); } void gst_multiudpsink_remove (GstMultiUDPSink * sink, const gchar * host, gint port) { GList *find; GstUDPClient udpclient; GstUDPClient *client; GTimeVal now; udpclient.host = (gchar *) host; udpclient.port = port; g_mutex_lock (sink->client_lock); find = g_list_find_custom (sink->clients, &udpclient, (GCompareFunc) client_compare); if (!find) goto not_found; client = (GstUDPClient *) find->data; GST_DEBUG_OBJECT (sink, "found %d clients with host %s, port %d", client->refcount, host, port); client->refcount--; if (client->refcount == 0) { GST_DEBUG_OBJECT (sink, "remove client with host %s, port %d", host, port); g_get_current_time (&now); client->disconnect_time = GST_TIMEVAL_TO_TIME (now); if (*(client->sock) != -1 && sink->auto_multicast && gst_udp_is_multicast (&client->theiraddr)) gst_udp_leave_group (*(client->sock), &client->theiraddr); /* Unlock to emit signal before we delete the actual client */ g_mutex_unlock (sink->client_lock); g_signal_emit (G_OBJECT (sink), gst_multiudpsink_signals[SIGNAL_CLIENT_REMOVED], 0, host, port); g_mutex_lock (sink->client_lock); sink->clients = g_list_delete_link (sink->clients, find); free_client (client); } g_mutex_unlock (sink->client_lock); return; /* ERRORS */ not_found: { g_mutex_unlock (sink->client_lock); GST_WARNING_OBJECT (sink, "client at host %s, port %d not found", host, port); return; } } static void gst_multiudpsink_clear_internal (GstMultiUDPSink * sink, gboolean lock) { GST_DEBUG_OBJECT (sink, "clearing"); /* we only need to remove the client structure, there is no additional * socket or anything to free for UDP */ if (lock) g_mutex_lock (sink->client_lock); g_list_foreach (sink->clients, (GFunc) free_client, sink); g_list_free (sink->clients); sink->clients = NULL; if (lock) g_mutex_unlock (sink->client_lock); } void gst_multiudpsink_clear (GstMultiUDPSink * sink) { gst_multiudpsink_clear_internal (sink, TRUE); } GValueArray * gst_multiudpsink_get_stats (GstMultiUDPSink * sink, const gchar * host, gint port) { GstUDPClient *client; GValueArray *result = NULL; GstUDPClient udpclient; GList *find; GValue value = { 0 }; udpclient.host = (gchar *) host; udpclient.port = port; g_mutex_lock (sink->client_lock); find = g_list_find_custom (sink->clients, &udpclient, (GCompareFunc) client_compare); if (!find) goto not_found; GST_DEBUG_OBJECT (sink, "stats for client with host %s, port %d", host, port); client = (GstUDPClient *) find->data; /* Result is a value array of (bytes_sent, packets_sent, * connect_time, disconnect_time), all as uint64 */ result = g_value_array_new (4); g_value_init (&value, G_TYPE_UINT64); g_value_set_uint64 (&value, client->bytes_sent); result = g_value_array_append (result, &value); g_value_unset (&value); g_value_init (&value, G_TYPE_UINT64); g_value_set_uint64 (&value, client->packets_sent); result = g_value_array_append (result, &value); g_value_unset (&value); g_value_init (&value, G_TYPE_UINT64); g_value_set_uint64 (&value, client->connect_time); result = g_value_array_append (result, &value); g_value_unset (&value); g_value_init (&value, G_TYPE_UINT64); g_value_set_uint64 (&value, client->disconnect_time); result = g_value_array_append (result, &value); g_value_unset (&value); g_mutex_unlock (sink->client_lock); return result; /* ERRORS */ not_found: { g_mutex_unlock (sink->client_lock); GST_WARNING_OBJECT (sink, "client with host %s, port %d not found", host, port); /* Apparently (see comment in gstmultifdsink.c) returning NULL from here may * confuse/break python bindings */ return g_value_array_new (0); } } static GstStateChangeReturn gst_multiudpsink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstMultiUDPSink *sink; sink = GST_MULTIUDPSINK (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: if (!gst_multiudpsink_init_send (sink)) goto no_init; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_multiudpsink_close (sink); break; default: break; } return ret; /* ERRORS */ no_init: { /* _init_send() posted specific error already */ return GST_STATE_CHANGE_FAILURE; } } gst-plugins-good-0.10.31/gst/udp/gstdynudpsink.c0000644000175000017500000002425611677341656016467 00000000000000/* GStreamer * Copyright (C) <2005> Philippe Khalaf * Copyright (C) <2005> Nokia Corporation * Copyright (C) <2006> Joni Valtanen * * 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 "gstudp-marshal.h" #include "gstdynudpsink.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include #include GST_DEBUG_CATEGORY_STATIC (dynudpsink_debug); #define GST_CAT_DEFAULT (dynudpsink_debug) static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); /* DynUDPSink signals and args */ enum { /* methods */ SIGNAL_GET_STATS, /* signals */ /* FILL ME */ LAST_SIGNAL }; #define UDP_DEFAULT_SOCKFD -1 #define UDP_DEFAULT_CLOSEFD TRUE enum { PROP_0, PROP_SOCKFD, PROP_CLOSEFD }; #define CLOSE_IF_REQUESTED(udpctx) \ G_STMT_START { \ if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \ CLOSE_SOCKET(udpctx->sock); \ if (udpctx->sock == udpctx->sockfd) \ udpctx->sockfd = UDP_DEFAULT_SOCKFD; \ } \ udpctx->sock = -1; \ } G_STMT_END static void gst_dynudpsink_base_init (gpointer g_class); static void gst_dynudpsink_class_init (GstDynUDPSink * klass); static void gst_dynudpsink_init (GstDynUDPSink * udpsink); static void gst_dynudpsink_finalize (GObject * object); static GstFlowReturn gst_dynudpsink_render (GstBaseSink * sink, GstBuffer * buffer); static void gst_dynudpsink_close (GstDynUDPSink * sink); static GstStateChangeReturn gst_dynudpsink_change_state (GstElement * element, GstStateChange transition); static void gst_dynudpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_dynudpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; static guint gst_dynudpsink_signals[LAST_SIGNAL] = { 0 }; GType gst_dynudpsink_get_type (void) { static GType dynudpsink_type = 0; if (!dynudpsink_type) { static const GTypeInfo dynudpsink_info = { sizeof (GstDynUDPSinkClass), gst_dynudpsink_base_init, NULL, (GClassInitFunc) gst_dynudpsink_class_init, NULL, NULL, sizeof (GstDynUDPSink), 0, (GInstanceInitFunc) gst_dynudpsink_init, NULL }; dynudpsink_type = g_type_register_static (GST_TYPE_BASE_SINK, "GstDynUDPSink", &dynudpsink_info, 0); } return dynudpsink_type; } static void gst_dynudpsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_set_details_simple (element_class, "UDP packet sender", "Sink/Network", "Send data over the network via UDP", "Philippe Khalaf "); } static void gst_dynudpsink_class_init (GstDynUDPSink * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_dynudpsink_set_property; gobject_class->get_property = gst_dynudpsink_get_property; gobject_class->finalize = gst_dynudpsink_finalize; gst_dynudpsink_signals[SIGNAL_GET_STATS] = g_signal_new ("get-stats", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDynUDPSinkClass, get_stats), NULL, NULL, gst_udp_marshal_BOXED__STRING_INT, G_TYPE_VALUE_ARRAY, 2, G_TYPE_STRING, G_TYPE_INT); g_object_class_install_property (gobject_class, PROP_SOCKFD, g_param_spec_int ("sockfd", "socket handle", "Socket to use for UDP sending. (-1 == allocate)", -1, G_MAXINT16, UDP_DEFAULT_SOCKFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CLOSEFD, g_param_spec_boolean ("closefd", "Close sockfd", "Close sockfd if passed as property on state change", UDP_DEFAULT_CLOSEFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = gst_dynudpsink_change_state; gstbasesink_class->render = gst_dynudpsink_render; GST_DEBUG_CATEGORY_INIT (dynudpsink_debug, "dynudpsink", 0, "UDP sink"); } static void gst_dynudpsink_init (GstDynUDPSink * sink) { WSA_STARTUP (sink); sink->sockfd = UDP_DEFAULT_SOCKFD; sink->closefd = UDP_DEFAULT_CLOSEFD; sink->externalfd = FALSE; sink->sock = -1; } static void gst_dynudpsink_finalize (GObject * object) { GstDynUDPSink *udpsink; udpsink = GST_DYNUDPSINK (object); if (udpsink->sockfd >= 0 && udpsink->closefd) CLOSE_SOCKET (udpsink->sockfd); G_OBJECT_CLASS (parent_class)->finalize (object); WSA_CLEANUP (object); } static GstFlowReturn gst_dynudpsink_render (GstBaseSink * bsink, GstBuffer * buffer) { GstDynUDPSink *sink; gint ret, size; guint8 *data; GstNetBuffer *netbuf; struct sockaddr_in theiraddr; guint16 destport; guint32 destaddr; memset (&theiraddr, 0, sizeof (theiraddr)); if (GST_IS_NETBUFFER (buffer)) { netbuf = GST_NETBUFFER (buffer); } else { GST_DEBUG ("Received buffer is not a GstNetBuffer, skipping"); return GST_FLOW_OK; } sink = GST_DYNUDPSINK (bsink); size = GST_BUFFER_SIZE (netbuf); data = GST_BUFFER_DATA (netbuf); GST_DEBUG ("about to send %d bytes", size); // let's get the address from the netbuffer gst_netaddress_get_ip4_address (&netbuf->to, &destaddr, &destport); GST_DEBUG ("sending %d bytes to client %d port %d", size, destaddr, destport); theiraddr.sin_family = AF_INET; theiraddr.sin_addr.s_addr = destaddr; theiraddr.sin_port = destport; #ifdef G_OS_WIN32 ret = sendto (sink->sock, (char *) data, size, 0, #else ret = sendto (sink->sock, data, size, 0, #endif (struct sockaddr *) &theiraddr, sizeof (theiraddr)); if (ret < 0) { if (errno != EINTR && errno != EAGAIN) { goto send_error; } } GST_DEBUG ("sent %d bytes", size); return GST_FLOW_OK; send_error: { GST_DEBUG ("got send error %s (%d)", g_strerror (errno), errno); return GST_FLOW_ERROR; } } static void gst_dynudpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDynUDPSink *udpsink; udpsink = GST_DYNUDPSINK (object); switch (prop_id) { case PROP_SOCKFD: if (udpsink->sockfd >= 0 && udpsink->sockfd != udpsink->sock && udpsink->closefd) CLOSE_SOCKET (udpsink->sockfd); udpsink->sockfd = g_value_get_int (value); GST_DEBUG ("setting SOCKFD to %d", udpsink->sockfd); break; case PROP_CLOSEFD: udpsink->closefd = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_dynudpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDynUDPSink *udpsink; udpsink = GST_DYNUDPSINK (object); switch (prop_id) { case PROP_SOCKFD: g_value_set_int (value, udpsink->sockfd); break; case PROP_CLOSEFD: g_value_set_boolean (value, udpsink->closefd); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* create a socket for sending to remote machine */ static gboolean gst_dynudpsink_init_send (GstDynUDPSink * sink) { guint bc_val; if (sink->sockfd == -1) { /* create sender socket if none available */ if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) goto no_socket; bc_val = 1; if (setsockopt (sink->sock, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val)) < 0) goto no_broadcast; sink->externalfd = TRUE; } else { sink->sock = sink->sockfd; sink->externalfd = TRUE; } return TRUE; /* ERRORS */ no_socket: { perror ("socket"); return FALSE; } no_broadcast: { perror ("setsockopt"); CLOSE_IF_REQUESTED (sink); return FALSE; } } GValueArray * gst_dynudpsink_get_stats (GstDynUDPSink * sink, const gchar * host, gint port) { return NULL; } static void gst_dynudpsink_close (GstDynUDPSink * sink) { CLOSE_IF_REQUESTED (sink); } static GstStateChangeReturn gst_dynudpsink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstDynUDPSink *sink; sink = GST_DYNUDPSINK (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: if (!gst_dynudpsink_init_send (sink)) goto no_init; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_dynudpsink_close (sink); break; default: break; } return ret; /* ERRORS */ no_init: { return GST_STATE_CHANGE_FAILURE; } } gst-plugins-good-0.10.31/gst/udp/gstdynudpsink.h0000644000175000017500000000425311671175354016461 00000000000000/* GStreamer * Copyright (C) <2005> Philippe Khalaf * * 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_DYNUDPSINK_H__ #define __GST_DYNUDPSINK_H__ #include #include G_BEGIN_DECLS #include "gstudpnetutils.h" #include "gstudp.h" #define GST_TYPE_DYNUDPSINK (gst_dynudpsink_get_type()) #define GST_DYNUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DYNUDPSINK,GstDynUDPSink)) #define GST_DYNUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DYNUDPSINK,GstDynUDPSinkClass)) #define GST_IS_DYNUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DYNUDPSINK)) #define GST_IS_DYNUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DYNUDPSINK)) typedef struct _GstDynUDPSink GstDynUDPSink; typedef struct _GstDynUDPSinkClass GstDynUDPSinkClass; /* sends udp packets to host/port pairs contained in the GstNetBuffer received. */ struct _GstDynUDPSink { GstBaseSink parent; /* properties */ gint sockfd; gboolean closefd; /* the socket in use */ int sock; gboolean externalfd; }; struct _GstDynUDPSinkClass { GstBaseSinkClass parent_class; /* element methods */ GValueArray* (*get_stats) (GstDynUDPSink *sink, const gchar *host, gint port); /* signals */ }; GType gst_dynudpsink_get_type(void); GValueArray* gst_dynudpsink_get_stats (GstDynUDPSink *sink, const gchar *host, gint port); G_END_DECLS #endif /* __GST_DYNUDPSINK_H__ */ gst-plugins-good-0.10.31/gst/udp/gstudpnetutils.h0000644000175000017500000000657511671175354016662 00000000000000/* GStreamer UDP network utility functions * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Joni Valtanen * * 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_UDP_NET_UTILS_H__ #define __GST_UDP_NET_UTILS_H__ #include /* Needed for G_OS_XXXX */ #include #ifdef G_OS_WIN32 /* ws2_32.dll has getaddrinfo and freeaddrinfo on Windows XP and later. * minwg32 headers check WINVER before allowing the use of these */ #ifndef WINVER #define WINVER 0x0501 #endif #include #include #ifndef socklen_t #define socklen_t int #endif /* Needed for GstObject and GST_WARNING_OBJECT */ #include #include #else #include #include #include #include #include #include #include #include #include #endif #include #ifdef G_OS_WIN32 #define IOCTL_SOCKET ioctlsocket #define CLOSE_SOCKET(sock) closesocket(sock) #define setsockopt(sock,l,opt,val,len) setsockopt(sock,l,opt,(char *)(val),len) #define WSA_STARTUP(obj) gst_udp_net_utils_win32_wsa_startup(GST_OBJECT(obj)) #define WSA_CLEANUP(obj) WSACleanup () #else #define IOCTL_SOCKET ioctl #define CLOSE_SOCKET(sock) close(sock) #define setsockopt(sock,l,opt,val,len) setsockopt(sock,l,opt,(void *)(val),len) #define WSA_STARTUP(obj) #define WSA_CLEANUP(obj) #endif #ifdef G_OS_WIN32 gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj); #endif typedef struct { gchar *host; gint port; gboolean is_ipv6; } GstUDPUri; int gst_udp_get_sockaddr_length (struct sockaddr_storage *addr); int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr); int gst_udp_is_multicast (struct sockaddr_storage *addr); int gst_udp_set_loop (int sockfd, guint16 ss_family, gboolean loop); int gst_udp_set_ttl (int sockfd, guint16 ss_family, int ttl, gboolean is_multicast); /* multicast groups */ int gst_udp_join_group (int sockfd, struct sockaddr_storage *addr, gchar *iface); int gst_udp_leave_group (int sockfd, struct sockaddr_storage *addr); /* uri handling */ void gst_udp_uri_init (GstUDPUri *uri, const gchar *host, gint port); int gst_udp_uri_update (GstUDPUri *uri, const gchar *host, gint port); int gst_udp_parse_uri (const gchar *uristr, GstUDPUri *uri); gchar * gst_udp_uri_string (GstUDPUri *uri); void gst_udp_uri_free (GstUDPUri *uri); #endif /* __GST_UDP_NET_UTILS_H__*/ gst-plugins-good-0.10.31/gst/udp/README0000644000175000017500000000033011671175354014252 00000000000000* What is UDP src/sink? It is a set of element to transfer data using UDP, nothing more, nothing less. Its main purpose is to be used in conjunction with RTP but they are kept as separate elements because we can. gst-plugins-good-0.10.31/gst/udp/gstudp-marshal.list0000644000175000017500000000004111671175354017221 00000000000000VOID:STRING,INT BOXED:STRING,INT gst-plugins-good-0.10.31/gst/udp/gstudpsink.h0000644000175000017500000000336011671175354015744 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_UDPSINK_H__ #define __GST_UDPSINK_H__ #include #include "gstmultiudpsink.h" G_BEGIN_DECLS #include "gstudp.h" #include "gstudpnetutils.h" #define GST_TYPE_UDPSINK (gst_udpsink_get_type()) #define GST_UDPSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_UDPSINK,GstUDPSink)) #define GST_UDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_UDPSINK,GstUDPSinkClass)) #define GST_IS_UDPSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_UDPSINK)) #define GST_IS_UDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_UDPSINK)) typedef struct _GstUDPSink GstUDPSink; typedef struct _GstUDPSinkClass GstUDPSinkClass; struct _GstUDPSink { GstMultiUDPSink parent; GstUDPUri uri; gchar *uristr; }; struct _GstUDPSinkClass { GstMultiUDPSinkClass parent_class; }; GType gst_udpsink_get_type(void); G_END_DECLS #endif /* __GST_UDPSINK_H__ */ gst-plugins-good-0.10.31/gst/udp/gstudpsink.c0000644000175000017500000001645011671175354015743 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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-udpsink * @see_also: udpsrc, multifdsink * * udpsink is a network sink that sends UDP packets to the network. * It can be combined with RTP payloaders to implement RTP streaming. * * * Examples * |[ * gst-launch -v audiotestsrc ! udpsink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstudpsink.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #define UDP_DEFAULT_HOST "localhost" #define UDP_DEFAULT_PORT 4951 /* UDPSink signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_HOST, PROP_PORT, PROP_URI, /* FILL ME */ }; static void gst_udpsink_base_init (gpointer g_class); static void gst_udpsink_class_init (GstUDPSink * klass); static void gst_udpsink_init (GstUDPSink * udpsink); static void gst_udpsink_finalize (GstUDPSink * udpsink); static void gst_udpsink_uri_handler_init (gpointer g_iface, gpointer iface_data); static void gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_udpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; /*static guint gst_udpsink_signals[LAST_SIGNAL] = { 0 }; */ GType gst_udpsink_get_type (void) { static GType udpsink_type = 0; if (!udpsink_type) { static const GTypeInfo udpsink_info = { sizeof (GstUDPSinkClass), gst_udpsink_base_init, NULL, (GClassInitFunc) gst_udpsink_class_init, NULL, NULL, sizeof (GstUDPSink), 0, (GInstanceInitFunc) gst_udpsink_init, NULL }; static const GInterfaceInfo urihandler_info = { gst_udpsink_uri_handler_init, NULL, NULL }; udpsink_type = g_type_register_static (GST_TYPE_MULTIUDPSINK, "GstUDPSink", &udpsink_info, 0); g_type_add_interface_static (udpsink_type, GST_TYPE_URI_HANDLER, &urihandler_info); } return udpsink_type; } static void gst_udpsink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "UDP packet sender", "Sink/Network", "Send data over the network via UDP", "Wim Taymans "); } static void gst_udpsink_class_init (GstUDPSink * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_udpsink_set_property; gobject_class->get_property = gst_udpsink_get_property; gobject_class->finalize = (GObjectFinalizeFunc) gst_udpsink_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HOST, g_param_spec_string ("host", "host", "The host/IP/Multicast group to send the packets to", UDP_DEFAULT_HOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, g_param_spec_int ("port", "port", "The port to send the packets to", 0, 65535, UDP_DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_udpsink_init (GstUDPSink * udpsink) { gst_udp_uri_init (&udpsink->uri, UDP_DEFAULT_HOST, UDP_DEFAULT_PORT); gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), udpsink->uri.host, udpsink->uri.port); } static void gst_udpsink_finalize (GstUDPSink * udpsink) { gst_udp_uri_free (&udpsink->uri); g_free (udpsink->uristr); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) udpsink); } static gboolean gst_udpsink_set_uri (GstUDPSink * sink, const gchar * uri) { gst_multiudpsink_remove (GST_MULTIUDPSINK (sink), sink->uri.host, sink->uri.port); if (gst_udp_parse_uri (uri, &sink->uri) < 0) goto wrong_uri; gst_multiudpsink_add (GST_MULTIUDPSINK (sink), sink->uri.host, sink->uri.port); return TRUE; /* ERRORS */ wrong_uri: { GST_ELEMENT_ERROR (sink, RESOURCE, READ, (NULL), ("error parsing uri %s", uri)); return FALSE; } } static void gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstUDPSink *udpsink; udpsink = GST_UDPSINK (object); /* remove old host */ gst_multiudpsink_remove (GST_MULTIUDPSINK (udpsink), udpsink->uri.host, udpsink->uri.port); switch (prop_id) { case PROP_HOST: { const gchar *host; host = g_value_get_string (value); if (host) gst_udp_uri_update (&udpsink->uri, host, -1); else gst_udp_uri_update (&udpsink->uri, UDP_DEFAULT_HOST, -1); break; } case PROP_PORT: gst_udp_uri_update (&udpsink->uri, NULL, g_value_get_int (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } /* add new host */ gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), udpsink->uri.host, udpsink->uri.port); } static void gst_udpsink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstUDPSink *udpsink; udpsink = GST_UDPSINK (object); switch (prop_id) { case PROP_HOST: g_value_set_string (value, udpsink->uri.host); break; case PROP_PORT: g_value_set_int (value, udpsink->uri.port); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /*** GSTURIHANDLER INTERFACE *************************************************/ static GstURIType gst_udpsink_uri_get_type (void) { return GST_URI_SINK; } static gchar ** gst_udpsink_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "udp", NULL }; return protocols; } static const gchar * gst_udpsink_uri_get_uri (GstURIHandler * handler) { GstUDPSink *sink = GST_UDPSINK (handler); g_free (sink->uristr); sink->uristr = gst_udp_uri_string (&sink->uri); return sink->uristr; } static gboolean gst_udpsink_uri_set_uri (GstURIHandler * handler, const gchar * uri) { gboolean ret; GstUDPSink *sink = GST_UDPSINK (handler); ret = gst_udpsink_set_uri (sink, uri); return ret; } static void gst_udpsink_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_udpsink_uri_get_type; iface->get_protocols = gst_udpsink_uri_get_protocols; iface->get_uri = gst_udpsink_uri_get_uri; iface->set_uri = gst_udpsink_uri_set_uri; } gst-plugins-good-0.10.31/gst/udp/Makefile.in0000644000175000017500000011676611720560236015454 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # these are the variables your Makefile.am should set # the example is based on the colorbalance interface #glib_enum_headers=$(colorbalance_headers) #glib_enum_define=GST_COLOR_BALANCE #glib_gen_prefix=gst_color_balance #glib_gen_basename=colorbalance VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak subdir = gst/udp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstudp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstudp_la_OBJECTS = libgstudp_la-gstudp.lo \ libgstudp_la-gstudpsrc.lo libgstudp_la-gstudpsink.lo \ libgstudp_la-gstmultiudpsink.lo libgstudp_la-gstdynudpsink.lo \ libgstudp_la-gstudpnetutils.lo am__objects_1 = libgstudp_la-gstudp-enumtypes.lo \ libgstudp_la-gstudp-marshal.lo nodist_libgstudp_la_OBJECTS = $(am__objects_1) libgstudp_la_OBJECTS = $(am_libgstudp_la_OBJECTS) \ $(nodist_libgstudp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstudp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstudp_la_CFLAGS) $(CFLAGS) \ $(libgstudp_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstudp_la_SOURCES) $(nodist_libgstudp_la_SOURCES) DIST_SOURCES = $(libgstudp_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstudp.la # variables used for enum/marshal generation glib_enum_headers = gstudp.h glib_enum_define = GST_UDP glib_gen_prefix = gst_udp glib_gen_basename = gstudp enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") built_sources = gstudp-enumtypes.c gstudp-marshal.c built_headers = gstudp-enumtypes.h gstudp-marshal.h BUILT_SOURCES = $(built_sources) $(built_headers) libgstudp_la_SOURCES = gstudp.c gstudpsrc.c gstudpsink.c gstmultiudpsink.c gstdynudpsink.c gstudpnetutils.c # adding -D_GNU_SOURCE to get non-POSIX extensions like EAI_ADDRFAMILY # with glibc >= 2.8 when including netdb.h (see glibc sources bug 6452) libgstudp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) -D_GNU_SOURCE libgstudp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstnetbuffer-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(WIN32_LIBS) libgstudp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstudp_la_LIBTOOLFLAGS = --tag=disable-static nodist_libgstudp_la_SOURCES = \ $(built_sources) noinst_HEADERS = gstudpsink.h gstudpsrc.h gstudp.h gstmultiudpsink.h gstdynudpsink.h gstudpnetutils.h EXTRA_DIST = README gstudp-marshal.list CLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/gst-glib-gen.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/udp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/udp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/gst-glib-gen.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstudp.la: $(libgstudp_la_OBJECTS) $(libgstudp_la_DEPENDENCIES) $(EXTRA_libgstudp_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstudp_la_LINK) -rpath $(plugindir) $(libgstudp_la_OBJECTS) $(libgstudp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstdynudpsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstmultiudpsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudp-enumtypes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudp-marshal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudpnetutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudpsink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstudp_la-gstudpsrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstudp_la-gstudp.lo: gstudp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudp.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudp.Tpo -c -o libgstudp_la-gstudp.lo `test -f 'gstudp.c' || echo '$(srcdir)/'`gstudp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudp.Tpo $(DEPDIR)/libgstudp_la-gstudp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudp.c' object='libgstudp_la-gstudp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudp.lo `test -f 'gstudp.c' || echo '$(srcdir)/'`gstudp.c libgstudp_la-gstudpsrc.lo: gstudpsrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudpsrc.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudpsrc.Tpo -c -o libgstudp_la-gstudpsrc.lo `test -f 'gstudpsrc.c' || echo '$(srcdir)/'`gstudpsrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudpsrc.Tpo $(DEPDIR)/libgstudp_la-gstudpsrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudpsrc.c' object='libgstudp_la-gstudpsrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudpsrc.lo `test -f 'gstudpsrc.c' || echo '$(srcdir)/'`gstudpsrc.c libgstudp_la-gstudpsink.lo: gstudpsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudpsink.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudpsink.Tpo -c -o libgstudp_la-gstudpsink.lo `test -f 'gstudpsink.c' || echo '$(srcdir)/'`gstudpsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudpsink.Tpo $(DEPDIR)/libgstudp_la-gstudpsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudpsink.c' object='libgstudp_la-gstudpsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudpsink.lo `test -f 'gstudpsink.c' || echo '$(srcdir)/'`gstudpsink.c libgstudp_la-gstmultiudpsink.lo: gstmultiudpsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstmultiudpsink.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstmultiudpsink.Tpo -c -o libgstudp_la-gstmultiudpsink.lo `test -f 'gstmultiudpsink.c' || echo '$(srcdir)/'`gstmultiudpsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstmultiudpsink.Tpo $(DEPDIR)/libgstudp_la-gstmultiudpsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultiudpsink.c' object='libgstudp_la-gstmultiudpsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstmultiudpsink.lo `test -f 'gstmultiudpsink.c' || echo '$(srcdir)/'`gstmultiudpsink.c libgstudp_la-gstdynudpsink.lo: gstdynudpsink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstdynudpsink.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstdynudpsink.Tpo -c -o libgstudp_la-gstdynudpsink.lo `test -f 'gstdynudpsink.c' || echo '$(srcdir)/'`gstdynudpsink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstdynudpsink.Tpo $(DEPDIR)/libgstudp_la-gstdynudpsink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdynudpsink.c' object='libgstudp_la-gstdynudpsink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstdynudpsink.lo `test -f 'gstdynudpsink.c' || echo '$(srcdir)/'`gstdynudpsink.c libgstudp_la-gstudpnetutils.lo: gstudpnetutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudpnetutils.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudpnetutils.Tpo -c -o libgstudp_la-gstudpnetutils.lo `test -f 'gstudpnetutils.c' || echo '$(srcdir)/'`gstudpnetutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudpnetutils.Tpo $(DEPDIR)/libgstudp_la-gstudpnetutils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudpnetutils.c' object='libgstudp_la-gstudpnetutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudpnetutils.lo `test -f 'gstudpnetutils.c' || echo '$(srcdir)/'`gstudpnetutils.c libgstudp_la-gstudp-enumtypes.lo: gstudp-enumtypes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudp-enumtypes.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudp-enumtypes.Tpo -c -o libgstudp_la-gstudp-enumtypes.lo `test -f 'gstudp-enumtypes.c' || echo '$(srcdir)/'`gstudp-enumtypes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudp-enumtypes.Tpo $(DEPDIR)/libgstudp_la-gstudp-enumtypes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudp-enumtypes.c' object='libgstudp_la-gstudp-enumtypes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudp-enumtypes.lo `test -f 'gstudp-enumtypes.c' || echo '$(srcdir)/'`gstudp-enumtypes.c libgstudp_la-gstudp-marshal.lo: gstudp-marshal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -MT libgstudp_la-gstudp-marshal.lo -MD -MP -MF $(DEPDIR)/libgstudp_la-gstudp-marshal.Tpo -c -o libgstudp_la-gstudp-marshal.lo `test -f 'gstudp-marshal.c' || echo '$(srcdir)/'`gstudp-marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstudp_la-gstudp-marshal.Tpo $(DEPDIR)/libgstudp_la-gstudp-marshal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstudp-marshal.c' object='libgstudp_la-gstudp-marshal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstudp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstudp_la_CFLAGS) $(CFLAGS) -c -o libgstudp_la-gstudp-marshal.lo `test -f 'gstudp-marshal.c' || echo '$(srcdir)/'`gstudp-marshal.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # these are all the rules generating the relevant files $(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h $(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c $(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) $(AM_V_GEN)glib-mkenums \ --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ --fprod "\n/* enumerations from \"@filename@\" */\n" \ --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ $^ > $@ $(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi $(AM_V_GEN)glib-mkenums \ --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ --fprod "\n/* enumerations from \"@filename@\" */" \ --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ $^ > $@ # a hack rule to make sure .Plo files exist because they get include'd # from Makefile's .deps/%-marshal.Plo: @touch $@ .deps/%-enumtypes.Plo: @touch $@ Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstudp -:SHARED libgstudp \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstudp_la_SOURCES) \ $(nodist_libgstudp_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstudp_la_CFLAGS) \ -:LDFLAGS $(libgstudp_la_LDFLAGS) \ $(libgstudp_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/udp/gstudpsrc.h0000644000175000017500000000427011671175354015570 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_UDPSRC_H__ #define __GST_UDPSRC_H__ #include #include G_BEGIN_DECLS #include #include #include #include "gstudpnetutils.h" #include "gstudp.h" #define GST_TYPE_UDPSRC \ (gst_udpsrc_get_type()) #define GST_UDPSRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_UDPSRC,GstUDPSrc)) #define GST_UDPSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_UDPSRC,GstUDPSrcClass)) #define GST_IS_UDPSRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_UDPSRC)) #define GST_IS_UDPSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_UDPSRC)) #define GST_UDPSRC_CAST(obj) ((GstUDPSrc *)(obj)) typedef struct _GstUDPSrc GstUDPSrc; typedef struct _GstUDPSrcClass GstUDPSrcClass; struct _GstUDPSrc { GstPushSrc parent; /* properties */ GstUDPUri uri; gchar *multi_iface; gint ttl; GstCaps *caps; gint buffer_size; guint64 timeout; gint skip_first_bytes; int sockfd; gboolean closefd; gboolean auto_multicast; gboolean reuse; /* our sockets */ GstPollFD sock; GstPoll *fdset; gboolean externalfd; gboolean is_ipv6; struct sockaddr_storage myaddr; gchar *uristr; }; struct _GstUDPSrcClass { GstPushSrcClass parent_class; }; GType gst_udpsrc_get_type(void); G_END_DECLS #endif /* __GST_UDPSRC_H__ */ gst-plugins-good-0.10.31/gst/udp/gstmultiudpsink.h0000644000175000017500000000665711671175354017033 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymand * * 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_MULTIUDPSINK_H__ #define __GST_MULTIUDPSINK_H__ #include #include G_BEGIN_DECLS #include "gstudpnetutils.h" #include "gstudp.h" #define GST_TYPE_MULTIUDPSINK (gst_multiudpsink_get_type()) #define GST_MULTIUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIUDPSINK,GstMultiUDPSink)) #define GST_MULTIUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIUDPSINK,GstMultiUDPSinkClass)) #define GST_IS_MULTIUDPSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIUDPSINK)) #define GST_IS_MULTIUDPSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIUDPSINK)) typedef struct _GstMultiUDPSink GstMultiUDPSink; typedef struct _GstMultiUDPSinkClass GstMultiUDPSinkClass; typedef struct { gint refcount; int *sock; struct sockaddr_storage theiraddr; gchar *host; gint port; /* Per-client stats */ guint64 bytes_sent; guint64 packets_sent; guint64 connect_time; guint64 disconnect_time; } GstUDPClient; /* sends udp packets to multiple host/port pairs. */ struct _GstMultiUDPSink { GstBaseSink parent; int sock; GMutex *client_lock; GList *clients; /* properties */ guint64 bytes_to_serve; guint64 bytes_served; int sockfd; gboolean closefd; gboolean externalfd; gboolean auto_multicast; gint ttl; gint ttl_mc; gboolean loop; gint qos_dscp; guint16 ss_family; gboolean send_duplicates; gint buffer_size; }; struct _GstMultiUDPSinkClass { GstBaseSinkClass parent_class; /* element methods */ void (*add) (GstMultiUDPSink *sink, const gchar *host, gint port); void (*remove) (GstMultiUDPSink *sink, const gchar *host, gint port); void (*clear) (GstMultiUDPSink *sink); GValueArray* (*get_stats) (GstMultiUDPSink *sink, const gchar *host, gint port); /* signals */ void (*client_added) (GstElement *element, const gchar *host, gint port); void (*client_removed) (GstElement *element, const gchar *host, gint port); }; GType gst_multiudpsink_get_type(void); void gst_multiudpsink_add (GstMultiUDPSink *sink, const gchar *host, gint port); void gst_multiudpsink_remove (GstMultiUDPSink *sink, const gchar *host, gint port); void gst_multiudpsink_clear (GstMultiUDPSink *sink); GValueArray* gst_multiudpsink_get_stats (GstMultiUDPSink *sink, const gchar *host, gint port); G_END_DECLS #endif /* __GST_MULTIUDPSINK_H__ */ gst-plugins-good-0.10.31/gst/udp/gstudpsrc.c0000644000175000017500000010114011677341656015563 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * Copyright (C) <2005> Nokia Corporation * * 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-udpsrc * @see_also: udpsink, multifdsink * * udpsrc is a network source that reads UDP packets from the network. * It can be combined with RTP depayloaders to implement RTP streaming. * * The udpsrc element supports automatic port allocation by setting the * #GstUDPSrc:port property to 0. After setting the udpsrc to PAUSED, the * allocated port can be obtained by reading the port property. * * udpsrc can read from multicast groups by setting the #GstUDPSrc:multicast-group * property to the IP address of the multicast group. * * Alternatively one can provide a custom socket to udpsrc with the #GstUDPSrc:sockfd * property, udpsrc will then not allocate a socket itself but use the provided * one. * * The #GstUDPSrc:caps property is mainly used to give a type to the UDP packet * so that they can be autoplugged in GStreamer pipelines. This is very usefull * for RTP implementations where the contents of the UDP packets is transfered * out-of-bounds using SDP or other means. * * The #GstUDPSrc:buffer-size property is used to change the default kernel * buffersizes used for receiving packets. The buffer size may be increased for * high-volume connections, or may be decreased to limit the possible backlog of * incoming data. The system places an absolute limit on these values, on Linux, * for example, the default buffer size is typically 50K and can be increased to * maximally 100K. * * The #GstUDPSrc:skip-first-bytes property is used to strip off an arbitrary * number of bytes from the start of the raw udp packet and can be used to strip * off proprietary header, for example. * * The udpsrc is always a live source. It does however not provide a #GstClock, * this is left for upstream elements such as an RTP session manager or demuxer * (such as an MPEG demuxer). As with all live sources, the captured buffers * will have their timestamp set to the current running time of the pipeline. * * udpsrc implements a #GstURIHandler interface that handles udp://host:port * type URIs. * * If the #GstUDPSrc:timeout property is set to a value bigger than 0, udpsrc * will generate an element message named * "GstUDPSrcTimeout" * if no data was recieved in the given timeout. * The message's structure contains one field: * * * * #guint64 * "timeout": the timeout in microseconds that * expired when waiting for data. * * * * The message is typically used to detect that no UDP arrives in the receiver * because it is blocked by a firewall. * * * A custom file descriptor can be configured with the * #GstUDPSrc:sockfd property. The socket will be closed when setting the * element to READY by default. This behaviour can be * overriden with the #GstUDPSrc:closefd property, in which case the application * is responsible for closing the file descriptor. * * * Examples * |[ * gst-launch -v udpsrc ! fakesink dump=1 * ]| A pipeline to read from the default port and dump the udp packets. * To actually generate udp packets on the default port one can use the * udpsink element. When running the following pipeline in another terminal, the * above mentioned pipeline should dump data packets to the console. * |[ * gst-launch -v audiotestsrc ! udpsink * ]| * |[ * gst-launch -v udpsrc port=0 ! fakesink * ]| read udp packets from a free port. * * * Last reviewed on 2007-09-20 (0.10.7) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstudpsrc.h" #ifdef HAVE_UNISTD_H #include #endif #include #if defined _MSC_VER && (_MSC_VER >= 1400) #include #endif #include #ifdef HAVE_FIONREAD_IN_SYS_FILIO #include #endif GST_DEBUG_CATEGORY_STATIC (udpsrc_debug); #define GST_CAT_DEFAULT (udpsrc_debug) static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); #define UDP_DEFAULT_PORT 4951 #define UDP_DEFAULT_MULTICAST_GROUP "0.0.0.0" #define UDP_DEFAULT_MULTICAST_IFACE NULL #define UDP_DEFAULT_URI "udp://"UDP_DEFAULT_MULTICAST_GROUP":"G_STRINGIFY(UDP_DEFAULT_PORT) #define UDP_DEFAULT_CAPS NULL #define UDP_DEFAULT_SOCKFD -1 #define UDP_DEFAULT_BUFFER_SIZE 0 #define UDP_DEFAULT_TIMEOUT 0 #define UDP_DEFAULT_SKIP_FIRST_BYTES 0 #define UDP_DEFAULT_CLOSEFD TRUE #define UDP_DEFAULT_SOCK -1 #define UDP_DEFAULT_AUTO_MULTICAST TRUE #define UDP_DEFAULT_REUSE TRUE enum { PROP_0, PROP_PORT, PROP_MULTICAST_GROUP, PROP_MULTICAST_IFACE, PROP_URI, PROP_CAPS, PROP_SOCKFD, PROP_BUFFER_SIZE, PROP_TIMEOUT, PROP_SKIP_FIRST_BYTES, PROP_CLOSEFD, PROP_SOCK, PROP_AUTO_MULTICAST, PROP_REUSE, PROP_LAST }; #define CLOSE_IF_REQUESTED(udpctx) \ G_STMT_START { \ if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \ CLOSE_SOCKET(udpctx->sock.fd); \ if (udpctx->sock.fd == udpctx->sockfd) \ udpctx->sockfd = UDP_DEFAULT_SOCKFD; \ } \ udpctx->sock.fd = UDP_DEFAULT_SOCK; \ } G_STMT_END static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); static GstCaps *gst_udpsrc_getcaps (GstBaseSrc * src); static GstFlowReturn gst_udpsrc_create (GstPushSrc * psrc, GstBuffer ** buf); static gboolean gst_udpsrc_start (GstBaseSrc * bsrc); static gboolean gst_udpsrc_stop (GstBaseSrc * bsrc); static gboolean gst_udpsrc_unlock (GstBaseSrc * bsrc); static gboolean gst_udpsrc_unlock_stop (GstBaseSrc * bsrc); static void gst_udpsrc_finalize (GObject * object); static void gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_udpsrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void _do_init (GType type) { static const GInterfaceInfo urihandler_info = { gst_udpsrc_uri_handler_init, NULL, NULL }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info); GST_DEBUG_CATEGORY_INIT (udpsrc_debug, "udpsrc", 0, "UDP src"); } GST_BOILERPLATE_FULL (GstUDPSrc, gst_udpsrc, GstPushSrc, GST_TYPE_PUSH_SRC, _do_init); static void gst_udpsrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "UDP packet receiver", "Source/Network", "Receive data over the network via UDP", "Wim Taymans , " "Thijs Vermeir "); } static void gst_udpsrc_class_init (GstUDPSrcClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; GstPushSrcClass *gstpushsrc_class; gobject_class = (GObjectClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstpushsrc_class = (GstPushSrcClass *) klass; gobject_class->set_property = gst_udpsrc_set_property; gobject_class->get_property = gst_udpsrc_get_property; gobject_class->finalize = gst_udpsrc_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PORT, g_param_spec_int ("port", "Port", "The port to receive the packets from, 0=allocate", 0, G_MAXUINT16, UDP_DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MULTICAST_GROUP, g_param_spec_string ("multicast-group", "Multicast Group", "The Address of multicast group to join", UDP_DEFAULT_MULTICAST_GROUP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MULTICAST_IFACE, g_param_spec_string ("multicast-iface", "Multicast Interface", "The network interface on which to join the multicast group", UDP_DEFAULT_MULTICAST_IFACE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_URI, g_param_spec_string ("uri", "URI", "URI in the form of udp://multicast_group:port", UDP_DEFAULT_URI, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAPS, g_param_spec_boxed ("caps", "Caps", "The caps of the source pad", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SOCKFD, g_param_spec_int ("sockfd", "Socket Handle", "Socket to use for UDP reception. (-1 == allocate)", -1, G_MAXINT, UDP_DEFAULT_SOCKFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_SIZE, g_param_spec_int ("buffer-size", "Buffer Size", "Size of the kernel receive buffer in bytes, 0=default", 0, G_MAXINT, UDP_DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMEOUT, g_param_spec_uint64 ("timeout", "Timeout", "Post a message after timeout microseconds (0 = disabled)", 0, G_MAXUINT64, UDP_DEFAULT_TIMEOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SKIP_FIRST_BYTES, g_param_spec_int ("skip-first-bytes", "Skip first bytes", "number of bytes to skip for each udp packet", 0, G_MAXINT, UDP_DEFAULT_SKIP_FIRST_BYTES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CLOSEFD, g_param_spec_boolean ("closefd", "Close sockfd", "Close sockfd if passed as property on state change", UDP_DEFAULT_CLOSEFD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SOCK, g_param_spec_int ("sock", "Socket Handle", "Socket currently in use for UDP reception. (-1 = no socket)", -1, G_MAXINT, UDP_DEFAULT_SOCK, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_AUTO_MULTICAST, g_param_spec_boolean ("auto-multicast", "Auto Multicast", "Automatically join/leave multicast groups", UDP_DEFAULT_AUTO_MULTICAST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_REUSE, g_param_spec_boolean ("reuse", "Reuse", "Enable reuse of the port", UDP_DEFAULT_REUSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasesrc_class->start = gst_udpsrc_start; gstbasesrc_class->stop = gst_udpsrc_stop; gstbasesrc_class->unlock = gst_udpsrc_unlock; gstbasesrc_class->unlock_stop = gst_udpsrc_unlock_stop; gstbasesrc_class->get_caps = gst_udpsrc_getcaps; gstpushsrc_class->create = gst_udpsrc_create; } static void gst_udpsrc_init (GstUDPSrc * udpsrc, GstUDPSrcClass * g_class) { WSA_STARTUP (udpsrc); gst_udp_uri_init (&udpsrc->uri, UDP_DEFAULT_MULTICAST_GROUP, UDP_DEFAULT_PORT); udpsrc->sockfd = UDP_DEFAULT_SOCKFD; udpsrc->multi_iface = g_strdup (UDP_DEFAULT_MULTICAST_IFACE); udpsrc->buffer_size = UDP_DEFAULT_BUFFER_SIZE; udpsrc->timeout = UDP_DEFAULT_TIMEOUT; udpsrc->skip_first_bytes = UDP_DEFAULT_SKIP_FIRST_BYTES; udpsrc->closefd = UDP_DEFAULT_CLOSEFD; udpsrc->externalfd = (udpsrc->sockfd != -1); udpsrc->auto_multicast = UDP_DEFAULT_AUTO_MULTICAST; udpsrc->sock.fd = UDP_DEFAULT_SOCK; udpsrc->reuse = UDP_DEFAULT_REUSE; /* configure basesrc to be a live source */ gst_base_src_set_live (GST_BASE_SRC (udpsrc), TRUE); /* make basesrc output a segment in time */ gst_base_src_set_format (GST_BASE_SRC (udpsrc), GST_FORMAT_TIME); /* make basesrc set timestamps on outgoing buffers based on the running_time * when they were captured */ gst_base_src_set_do_timestamp (GST_BASE_SRC (udpsrc), TRUE); } static void gst_udpsrc_finalize (GObject * object) { GstUDPSrc *udpsrc; udpsrc = GST_UDPSRC (object); if (udpsrc->caps) gst_caps_unref (udpsrc->caps); g_free (udpsrc->multi_iface); gst_udp_uri_free (&udpsrc->uri); g_free (udpsrc->uristr); if (udpsrc->sockfd >= 0 && udpsrc->closefd) CLOSE_SOCKET (udpsrc->sockfd); WSA_CLEANUP (object); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_udpsrc_getcaps (GstBaseSrc * src) { GstUDPSrc *udpsrc; udpsrc = GST_UDPSRC (src); if (udpsrc->caps) return gst_caps_ref (udpsrc->caps); else return gst_caps_new_any (); } /* read a message from the error queue */ static void clear_error (GstUDPSrc * udpsrc) { #if defined (MSG_ERRQUEUE) struct msghdr cmsg; char cbuf[128]; char msgbuf[CMSG_SPACE (128)]; struct iovec iov; /* Flush ERRORS from fd so next poll will not return at once */ /* No need for address : We look for local error */ cmsg.msg_name = NULL; cmsg.msg_namelen = 0; /* IOV */ memset (&cbuf, 0, sizeof (cbuf)); iov.iov_base = cbuf; iov.iov_len = sizeof (cbuf); cmsg.msg_iov = &iov; cmsg.msg_iovlen = 1; /* msg_control */ memset (&msgbuf, 0, sizeof (msgbuf)); cmsg.msg_control = &msgbuf; cmsg.msg_controllen = sizeof (msgbuf); recvmsg (udpsrc->sock.fd, &cmsg, MSG_ERRQUEUE); #endif } static GstFlowReturn gst_udpsrc_create (GstPushSrc * psrc, GstBuffer ** buf) { GstUDPSrc *udpsrc; GstNetBuffer *outbuf; union gst_sockaddr { struct sockaddr sa; struct sockaddr_in sa_in; struct sockaddr_in6 sa_in6; struct sockaddr_storage sa_stor; } sa; socklen_t slen; guint8 *pktdata; gint pktsize; #ifdef G_OS_UNIX gint readsize; #elif defined G_OS_WIN32 gulong readsize; #endif GstClockTime timeout; gint ret; gboolean try_again; udpsrc = GST_UDPSRC_CAST (psrc); retry: /* quick check, avoid going in select when we already have data */ readsize = 0; if (G_UNLIKELY ((ret = IOCTL_SOCKET (udpsrc->sock.fd, FIONREAD, &readsize)) < 0)) goto ioctl_failed; if (readsize > 0) goto no_select; if (udpsrc->timeout > 0) { timeout = udpsrc->timeout * GST_USECOND; } else { timeout = GST_CLOCK_TIME_NONE; } do { try_again = FALSE; GST_LOG_OBJECT (udpsrc, "doing select, timeout %" G_GUINT64_FORMAT, udpsrc->timeout); ret = gst_poll_wait (udpsrc->fdset, timeout); GST_LOG_OBJECT (udpsrc, "select returned %d", ret); if (G_UNLIKELY (ret < 0)) { if (errno == EBUSY) goto stopped; #ifdef G_OS_WIN32 if (WSAGetLastError () != WSAEINTR) goto select_error; #else if (errno != EAGAIN && errno != EINTR) goto select_error; #endif try_again = TRUE; } else if (G_UNLIKELY (ret == 0)) { /* timeout, post element message */ gst_element_post_message (GST_ELEMENT_CAST (udpsrc), gst_message_new_element (GST_OBJECT_CAST (udpsrc), gst_structure_new ("GstUDPSrcTimeout", "timeout", G_TYPE_UINT64, udpsrc->timeout, NULL))); try_again = TRUE; } } while (G_UNLIKELY (try_again)); /* ask how much is available for reading on the socket, this should be exactly * one UDP packet. We will check the return value, though, because in some * case it can return 0 and we don't want a 0 sized buffer. */ readsize = 0; if (G_UNLIKELY ((ret = IOCTL_SOCKET (udpsrc->sock.fd, FIONREAD, &readsize)) < 0)) goto ioctl_failed; /* If we get here and the readsize is zero, then either select was woken up * by activity that is not a read, or a poll error occurred, or a UDP packet * was received that has no data. Since we cannot identify which case it is, * we handle all of them. This could possibly lead to a UDP packet getting * lost, but since UDP is not reliable, we can accept this. */ if (G_UNLIKELY (!readsize)) { /* try to read a packet (and it will be ignored), * in case a packet with no data arrived */ slen = sizeof (sa); recvfrom (udpsrc->sock.fd, (char *) &slen, 0, 0, &sa.sa, &slen); /* clear any error, in case a poll error occurred */ clear_error (udpsrc); /* poll again */ goto retry; } no_select: GST_LOG_OBJECT (udpsrc, "ioctl says %d bytes available", (int) readsize); pktdata = g_malloc (readsize); pktsize = readsize; while (TRUE) { slen = sizeof (sa); #ifdef G_OS_WIN32 ret = recvfrom (udpsrc->sock.fd, (char *) pktdata, pktsize, 0, &sa.sa, &slen); #else ret = recvfrom (udpsrc->sock.fd, pktdata, pktsize, 0, &sa.sa, &slen); #endif if (G_UNLIKELY (ret < 0)) { #ifdef G_OS_WIN32 /* WSAECONNRESET for a UDP socket means that a packet sent with udpsink * generated a "port unreachable" ICMP response. We ignore that and try * again. */ if (WSAGetLastError () == WSAECONNRESET) { g_free (pktdata); pktdata = NULL; goto retry; } if (WSAGetLastError () != WSAEINTR) goto receive_error; #else if (errno != EAGAIN && errno != EINTR) goto receive_error; #endif } else break; } /* special case buffer so receivers can also track the address */ outbuf = gst_netbuffer_new (); GST_BUFFER_MALLOCDATA (outbuf) = pktdata; /* patch pktdata and len when stripping off the headers */ if (G_UNLIKELY (udpsrc->skip_first_bytes != 0)) { if (G_UNLIKELY (readsize < udpsrc->skip_first_bytes)) goto skip_error; pktdata += udpsrc->skip_first_bytes; ret -= udpsrc->skip_first_bytes; } GST_BUFFER_DATA (outbuf) = pktdata; GST_BUFFER_SIZE (outbuf) = ret; switch (sa.sa.sa_family) { case AF_INET: { gst_netaddress_set_ip4_address (&outbuf->from, sa.sa_in.sin_addr.s_addr, sa.sa_in.sin_port); } break; case AF_INET6: { guint8 ip6[16]; memcpy (ip6, &sa.sa_in6.sin6_addr, sizeof (ip6)); gst_netaddress_set_ip6_address (&outbuf->from, ip6, sa.sa_in6.sin6_port); } break; default: #ifdef G_OS_WIN32 WSASetLastError (WSAEAFNOSUPPORT); #else errno = EAFNOSUPPORT; #endif goto receive_error; } GST_LOG_OBJECT (udpsrc, "read %d bytes", (int) readsize); *buf = GST_BUFFER_CAST (outbuf); return GST_FLOW_OK; /* ERRORS */ select_error: { GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), ("select error %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } stopped: { GST_DEBUG ("stop called"); return GST_FLOW_WRONG_STATE; } ioctl_failed: { GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), ("ioctl failed %d: %s (%d)", ret, g_strerror (errno), errno)); return GST_FLOW_ERROR; } receive_error: { g_free (pktdata); #ifdef G_OS_WIN32 GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), ("receive error %d (WSA error: %d)", ret, WSAGetLastError ())); #else GST_ELEMENT_ERROR (udpsrc, RESOURCE, READ, (NULL), ("receive error %d: %s (%d)", ret, g_strerror (errno), errno)); #endif return GST_FLOW_ERROR; } skip_error: { GST_ELEMENT_ERROR (udpsrc, STREAM, DECODE, (NULL), ("UDP buffer to small to skip header")); return GST_FLOW_ERROR; } } static gboolean gst_udpsrc_set_uri (GstUDPSrc * src, const gchar * uri) { if (gst_udp_parse_uri (uri, &src->uri) < 0) goto wrong_uri; if (src->uri.port == -1) src->uri.port = UDP_DEFAULT_PORT; return TRUE; /* ERRORS */ wrong_uri: { GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("error parsing uri %s", uri)); return FALSE; } } static void gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstUDPSrc *udpsrc = GST_UDPSRC (object); switch (prop_id) { case PROP_BUFFER_SIZE: udpsrc->buffer_size = g_value_get_int (value); break; case PROP_PORT: gst_udp_uri_update (&udpsrc->uri, NULL, g_value_get_int (value)); break; case PROP_MULTICAST_GROUP: { const gchar *group; if ((group = g_value_get_string (value))) gst_udp_uri_update (&udpsrc->uri, group, -1); else gst_udp_uri_update (&udpsrc->uri, UDP_DEFAULT_MULTICAST_GROUP, -1); break; } case PROP_MULTICAST_IFACE: g_free (udpsrc->multi_iface); if (g_value_get_string (value) == NULL) udpsrc->multi_iface = g_strdup (UDP_DEFAULT_MULTICAST_IFACE); else udpsrc->multi_iface = g_value_dup_string (value); break; case PROP_URI: gst_udpsrc_set_uri (udpsrc, g_value_get_string (value)); break; case PROP_CAPS: { const GstCaps *new_caps_val = gst_value_get_caps (value); GstCaps *new_caps; GstCaps *old_caps; if (new_caps_val == NULL) { new_caps = gst_caps_new_any (); } else { new_caps = gst_caps_copy (new_caps_val); } old_caps = udpsrc->caps; udpsrc->caps = new_caps; if (old_caps) gst_caps_unref (old_caps); gst_pad_set_caps (GST_BASE_SRC (udpsrc)->srcpad, new_caps); break; } case PROP_SOCKFD: if (udpsrc->sockfd >= 0 && udpsrc->sockfd != udpsrc->sock.fd && udpsrc->closefd) CLOSE_SOCKET (udpsrc->sockfd); udpsrc->sockfd = g_value_get_int (value); GST_DEBUG ("setting SOCKFD to %d", udpsrc->sockfd); break; case PROP_TIMEOUT: udpsrc->timeout = g_value_get_uint64 (value); break; case PROP_SKIP_FIRST_BYTES: udpsrc->skip_first_bytes = g_value_get_int (value); break; case PROP_CLOSEFD: udpsrc->closefd = g_value_get_boolean (value); break; case PROP_AUTO_MULTICAST: udpsrc->auto_multicast = g_value_get_boolean (value); break; case PROP_REUSE: udpsrc->reuse = g_value_get_boolean (value); break; default: break; } } static void gst_udpsrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstUDPSrc *udpsrc = GST_UDPSRC (object); switch (prop_id) { case PROP_BUFFER_SIZE: g_value_set_int (value, udpsrc->buffer_size); break; case PROP_PORT: g_value_set_int (value, udpsrc->uri.port); break; case PROP_MULTICAST_GROUP: g_value_set_string (value, udpsrc->uri.host); break; case PROP_MULTICAST_IFACE: g_value_set_string (value, udpsrc->multi_iface); break; case PROP_URI: g_value_take_string (value, gst_udp_uri_string (&udpsrc->uri)); break; case PROP_CAPS: gst_value_set_caps (value, udpsrc->caps); break; case PROP_SOCKFD: g_value_set_int (value, udpsrc->sockfd); break; case PROP_TIMEOUT: g_value_set_uint64 (value, udpsrc->timeout); break; case PROP_SKIP_FIRST_BYTES: g_value_set_int (value, udpsrc->skip_first_bytes); break; case PROP_CLOSEFD: g_value_set_boolean (value, udpsrc->closefd); break; case PROP_SOCK: g_value_set_int (value, udpsrc->sock.fd); break; case PROP_AUTO_MULTICAST: g_value_set_boolean (value, udpsrc->auto_multicast); break; case PROP_REUSE: g_value_set_boolean (value, udpsrc->reuse); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* create a socket for sending to remote machine */ static gboolean gst_udpsrc_start (GstBaseSrc * bsrc) { guint bc_val; guint err_val; gint reuse; int port; GstUDPSrc *src; gint ret; int rcvsize; struct sockaddr_storage bind_address; socklen_t len; src = GST_UDPSRC (bsrc); if (src->sockfd == -1) { /* need to allocate a socket */ GST_DEBUG_OBJECT (src, "allocating socket for %s:%d", src->uri.host, src->uri.port); if ((ret = gst_udp_get_addr (src->uri.host, src->uri.port, &src->myaddr)) < 0) goto getaddrinfo_error; if ((ret = socket (src->myaddr.ss_family, SOCK_DGRAM, IPPROTO_UDP)) < 0) goto no_socket; src->sock.fd = ret; src->externalfd = FALSE; GST_DEBUG_OBJECT (src, "got socket %d", src->sock.fd); GST_DEBUG_OBJECT (src, "setting reuse %d", src->reuse); reuse = src->reuse ? 1 : 0; if ((ret = setsockopt (src->sock.fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof (reuse))) < 0) goto setsockopt_error; GST_DEBUG_OBJECT (src, "binding on port %d", src->uri.port); /* Take a temporary copy of the address in case we need to fix it for bind */ memcpy (&bind_address, &src->myaddr, sizeof (struct sockaddr_storage)); #ifdef G_OS_WIN32 /* Windows does not allow binding to a multicast group so fix source address */ if (gst_udp_is_multicast (&src->myaddr)) { switch (((struct sockaddr *) &bind_address)->sa_family) { case AF_INET: ((struct sockaddr_in *) &bind_address)->sin_addr.s_addr = htonl (INADDR_ANY); break; case AF_INET6: ((struct sockaddr_in6 *) &bind_address)->sin6_addr = in6addr_any; break; default: break; } } #endif len = gst_udp_get_sockaddr_length (&bind_address); if ((ret = bind (src->sock.fd, (struct sockaddr *) &bind_address, len)) < 0) goto bind_error; if (!gst_udp_is_multicast (&src->myaddr)) { len = sizeof (src->myaddr); if ((ret = getsockname (src->sock.fd, (struct sockaddr *) &src->myaddr, &len)) < 0) goto getsockname_error; } } else { GST_DEBUG_OBJECT (src, "using provided socket %d", src->sockfd); /* we use the configured socket, try to get some info about it */ len = sizeof (src->myaddr); if ((ret = getsockname (src->sockfd, (struct sockaddr *) &src->myaddr, &len)) < 0) goto getsockname_error; src->sock.fd = src->sockfd; src->externalfd = TRUE; } len = sizeof (rcvsize); if (src->buffer_size != 0) { rcvsize = src->buffer_size; GST_DEBUG_OBJECT (src, "setting udp buffer of %d bytes", rcvsize); /* set buffer size, Note that on Linux this is typically limited to a * maximum of around 100K. Also a minimum of 128 bytes is required on * Linux. */ ret = setsockopt (src->sock.fd, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, len); if (ret != 0) { GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL), ("Could not create a buffer of requested %d bytes, %d: %s (%d)", rcvsize, ret, g_strerror (errno), errno)); } } /* read the value of the receive buffer. Note that on linux this returns 2x the * value we set because the kernel allocates extra memory for metadata. * The default on Linux is about 100K (which is about 50K without metadata) */ ret = getsockopt (src->sock.fd, SOL_SOCKET, SO_RCVBUF, (void *) &rcvsize, &len); if (ret == 0) GST_DEBUG_OBJECT (src, "have udp buffer of %d bytes", rcvsize); else GST_DEBUG_OBJECT (src, "could not get udp buffer size"); bc_val = 1; if ((ret = setsockopt (src->sock.fd, SOL_SOCKET, SO_BROADCAST, &bc_val, sizeof (bc_val))) < 0) { GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL), ("could not configure socket for broadcast %d: %s (%d)", ret, g_strerror (errno), errno)); } /* Accept ERRQUEUE to get and flush icmp errors */ err_val = 1; #if defined (IP_RECVERR) if ((ret = setsockopt (src->sock.fd, IPPROTO_IP, IP_RECVERR, &err_val, sizeof (err_val))) < 0) { GST_ELEMENT_WARNING (src, RESOURCE, SETTINGS, (NULL), ("could not configure socket for IP_RECVERR %d: %s (%d)", ret, g_strerror (errno), errno)); } #endif if (src->auto_multicast && gst_udp_is_multicast (&src->myaddr)) { GST_DEBUG_OBJECT (src, "joining multicast group %s", src->uri.host); ret = gst_udp_join_group (src->sock.fd, &src->myaddr, src->multi_iface); if (ret < 0) goto membership; } /* NOTE: sockaddr_in.sin_port works for ipv4 and ipv6 because sin_port * follows ss_family on both */ port = g_ntohs (((struct sockaddr_in *) &src->myaddr)->sin_port); GST_DEBUG_OBJECT (src, "bound, on port %d", port); if (port != src->uri.port) { src->uri.port = port; GST_DEBUG_OBJECT (src, "notifying port %d", port); g_object_notify (G_OBJECT (src), "port"); } if ((src->fdset = gst_poll_new (TRUE)) == NULL) goto no_fdset; gst_poll_add_fd (src->fdset, &src->sock); gst_poll_fd_ctl_read (src->fdset, &src->sock, TRUE); return TRUE; /* ERRORS */ getaddrinfo_error: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("getaddrinfo failed: %s (%d)", gai_strerror (ret), ret)); return FALSE; } no_socket: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("no socket error %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; } setsockopt_error: { CLOSE_IF_REQUESTED (src); GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("setsockopt failed %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; } bind_error: { CLOSE_IF_REQUESTED (src); GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("bind failed %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; } membership: { CLOSE_IF_REQUESTED (src); GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("could add membership %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; } getsockname_error: { CLOSE_IF_REQUESTED (src); GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("getsockname failed %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; } no_fdset: { CLOSE_IF_REQUESTED (src); GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), ("could not create an fdset %d: %s (%d)", ret, g_strerror (errno), errno)); return FALSE; } } static gboolean gst_udpsrc_unlock (GstBaseSrc * bsrc) { GstUDPSrc *src; src = GST_UDPSRC (bsrc); GST_LOG_OBJECT (src, "Flushing"); gst_poll_set_flushing (src->fdset, TRUE); return TRUE; } static gboolean gst_udpsrc_unlock_stop (GstBaseSrc * bsrc) { GstUDPSrc *src; src = GST_UDPSRC (bsrc); GST_LOG_OBJECT (src, "No longer flushing"); gst_poll_set_flushing (src->fdset, FALSE); return TRUE; } static gboolean gst_udpsrc_stop (GstBaseSrc * bsrc) { GstUDPSrc *src; src = GST_UDPSRC (bsrc); GST_DEBUG ("stopping, closing sockets"); if (src->sock.fd >= 0) { if (src->auto_multicast && gst_udp_is_multicast (&src->myaddr)) { GST_DEBUG_OBJECT (src, "leaving multicast group %s", src->uri.host); gst_udp_leave_group (src->sock.fd, &src->myaddr); } CLOSE_IF_REQUESTED (src); } if (src->fdset) { gst_poll_free (src->fdset); src->fdset = NULL; } return TRUE; } /*** GSTURIHANDLER INTERFACE *************************************************/ static GstURIType gst_udpsrc_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_udpsrc_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "udp", NULL }; return protocols; } static const gchar * gst_udpsrc_uri_get_uri (GstURIHandler * handler) { GstUDPSrc *src = GST_UDPSRC (handler); g_free (src->uristr); src->uristr = gst_udp_uri_string (&src->uri); return src->uristr; } static gboolean gst_udpsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri) { gboolean ret; GstUDPSrc *src = GST_UDPSRC (handler); ret = gst_udpsrc_set_uri (src, uri); return ret; } static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_udpsrc_uri_get_type; iface->get_protocols = gst_udpsrc_uri_get_protocols; iface->get_uri = gst_udpsrc_uri_get_uri; iface->set_uri = gst_udpsrc_uri_set_uri; } gst-plugins-good-0.10.31/gst/y4m/0000755000175000017500000000000011720565316013373 500000000000000gst-plugins-good-0.10.31/gst/y4m/Makefile.am0000644000175000017500000000147011671175354015355 00000000000000 plugin_LTLIBRARIES = libgsty4menc.la libgsty4menc_la_SOURCES = gsty4mencode.c libgsty4menc_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) libgsty4menc_la_LIBADD = $(GST_LIBS) libgsty4menc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsty4menc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsty4mencode.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgsty4menc -:SHARED libgsty4menc \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgsty4menc_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsty4menc_la_CFLAGS) \ -:LDFLAGS $(libgsty4menc_la_LDFLAGS) \ $(libgsty4menc_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/y4m/gsty4mencode.h0000644000175000017500000000400011671175354016067 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_Y4MENCODE_H__ #define __GST_Y4MENCODE_H__ #include G_BEGIN_DECLS #define GST_TYPE_Y4M_ENCODE \ (gst_y4m_encode_get_type()) #define GST_Y4M_ENCODE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_Y4M_ENCODE, GstY4mEncode)) #define GST_Y4M_ENCODE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_Y4M_ENCODE, GstY4mEncodeClass)) #define GST_Y4M_ENCODE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_Y4M_ENCODE, GstY4mEncodeClass)) #define GST_IS_Y4M_ENCODE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_Y4M_ENCODE)) #define GST_IS_Y4M_ENCODE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_Y4M_ENCODE)) typedef struct _GstY4mEncode GstY4mEncode; typedef struct _GstY4mEncodeClass GstY4mEncodeClass; struct _GstY4mEncode { GstElement element; GstPad *sinkpad,*srcpad; /* caps information */ gint width, height; gint fps_num, fps_den; gint par_num, par_den; gboolean interlaced; gboolean top_field_first; const gchar *colorspace; /* state information */ gboolean header; }; struct _GstY4mEncodeClass { GstElementClass parent_class; }; GType gst_y4m_encode_get_type(void); G_END_DECLS #endif /* __GST_Y4MENCODE_H__ */ gst-plugins-good-0.10.31/gst/y4m/Makefile.in0000644000175000017500000006622411720560237015367 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/y4m DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgsty4menc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgsty4menc_la_OBJECTS = libgsty4menc_la-gsty4mencode.lo libgsty4menc_la_OBJECTS = $(am_libgsty4menc_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgsty4menc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgsty4menc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgsty4menc_la_CFLAGS) $(CFLAGS) \ $(libgsty4menc_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsty4menc_la_SOURCES) DIST_SOURCES = $(libgsty4menc_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgsty4menc.la libgsty4menc_la_SOURCES = gsty4mencode.c libgsty4menc_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) libgsty4menc_la_LIBADD = $(GST_LIBS) libgsty4menc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsty4menc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsty4mencode.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/y4m/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/y4m/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsty4menc.la: $(libgsty4menc_la_OBJECTS) $(libgsty4menc_la_DEPENDENCIES) $(EXTRA_libgsty4menc_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsty4menc_la_LINK) -rpath $(plugindir) $(libgsty4menc_la_OBJECTS) $(libgsty4menc_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsty4menc_la-gsty4mencode.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgsty4menc_la-gsty4mencode.lo: gsty4mencode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsty4menc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsty4menc_la_CFLAGS) $(CFLAGS) -MT libgsty4menc_la-gsty4mencode.lo -MD -MP -MF $(DEPDIR)/libgsty4menc_la-gsty4mencode.Tpo -c -o libgsty4menc_la-gsty4mencode.lo `test -f 'gsty4mencode.c' || echo '$(srcdir)/'`gsty4mencode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsty4menc_la-gsty4mencode.Tpo $(DEPDIR)/libgsty4menc_la-gsty4mencode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsty4mencode.c' object='libgsty4menc_la-gsty4mencode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsty4menc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsty4menc_la_CFLAGS) $(CFLAGS) -c -o libgsty4menc_la-gsty4mencode.lo `test -f 'gsty4mencode.c' || echo '$(srcdir)/'`gsty4mencode.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgsty4menc -:SHARED libgsty4menc \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgsty4menc_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsty4menc_la_CFLAGS) \ -:LDFLAGS $(libgsty4menc_la_LDFLAGS) \ $(libgsty4menc_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/y4m/gsty4mencode.c0000644000175000017500000002532011677341660016073 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Mark Nauwelaerts * * 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-y4menc * * * * Creates a YU4MPEG2 raw video stream as defined by the mjpegtools project. * * Example launch line * * (write everything in one line, without the backslash characters) * * gst-launch-0.10 videotestsrc num-buffers=250 \ * ! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \ * ! y4menc ! filesink location=test.yuv * * * * */ /* see mjpegtools/yuv4mpeg.h for yuv4mpeg format */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gsty4mencode.h" /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static GstStaticPadTemplate y4mencode_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-yuv4mpeg, " "y4mversion = (int) 2") ); static GstStaticPadTemplate y4mencode_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ IYUV, I420, Y42B, Y41B, Y444 }")) ); static void gst_y4m_encode_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_y4m_encode_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_y4m_encode_reset (GstY4mEncode * filter); static gboolean gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps); static GstFlowReturn gst_y4m_encode_chain (GstPad * pad, GstBuffer * buf); static GstStateChangeReturn gst_y4m_encode_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstY4mEncode, gst_y4m_encode, GstElement, GST_TYPE_ELEMENT); static void gst_y4m_encode_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &y4mencode_src_factory); gst_element_class_add_static_pad_template (element_class, &y4mencode_sink_factory); gst_element_class_set_details_simple (element_class, "YUV4MPEG video encoder", "Codec/Encoder/Video", "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", "Wim Taymans "); } static void gst_y4m_encode_class_init (GstY4mEncodeClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_y4m_encode_change_state); gobject_class->set_property = gst_y4m_encode_set_property; gobject_class->get_property = gst_y4m_encode_get_property; } static void gst_y4m_encode_init (GstY4mEncode * filter, GstY4mEncodeClass * klass) { filter->sinkpad = gst_pad_new_from_static_template (&y4mencode_sink_factory, "sink"); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_pad_set_chain_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_y4m_encode_chain)); gst_pad_set_setcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_y4m_encode_setcaps)); filter->srcpad = gst_pad_new_from_static_template (&y4mencode_src_factory, "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); gst_pad_use_fixed_caps (filter->srcpad); /* init properties */ gst_y4m_encode_reset (filter); } static void gst_y4m_encode_reset (GstY4mEncode * filter) { filter->width = filter->height = -1; filter->fps_num = filter->fps_den = 1; filter->par_num = filter->par_den = 1; filter->colorspace = "unknown"; } static gboolean gst_y4m_encode_setcaps (GstPad * pad, GstCaps * vscaps) { GstY4mEncode *filter; GstStructure *structure; gboolean res; gint w, h; guint32 fourcc; const GValue *fps, *par, *interlaced; filter = GST_Y4M_ENCODE (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (vscaps, 0); res = gst_structure_get_int (structure, "width", &w); res &= gst_structure_get_int (structure, "height", &h); res &= ((fps = gst_structure_get_value (structure, "framerate")) != NULL); res &= gst_structure_get_fourcc (structure, "format", &fourcc); switch (fourcc) { /* Translate fourcc to Y4M colorspace code */ case GST_MAKE_FOURCC ('I', '4', '2', '0'): case GST_MAKE_FOURCC ('I', 'Y', 'U', 'V'): filter->colorspace = "420"; break; case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): filter->colorspace = "422"; break; case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): filter->colorspace = "411"; break; case GST_MAKE_FOURCC ('Y', '4', '4', '4'): filter->colorspace = "444"; break; default: res = FALSE; break; } if (!res || w <= 0 || h <= 0 || !GST_VALUE_HOLDS_FRACTION (fps)) return FALSE; /* optional interlaced info */ interlaced = gst_structure_get_value (structure, "interlaced"); /* optional par info */ par = gst_structure_get_value (structure, "pixel-aspect-ratio"); filter->width = w; filter->height = h; filter->fps_num = gst_value_get_fraction_numerator (fps); filter->fps_den = gst_value_get_fraction_denominator (fps); if ((par != NULL) && GST_VALUE_HOLDS_FRACTION (par)) { filter->par_num = gst_value_get_fraction_numerator (par); filter->par_den = gst_value_get_fraction_denominator (par); } else { /* indicates unknown */ filter->par_num = 0; filter->par_den = 0; } if ((interlaced != NULL) && G_VALUE_HOLDS (interlaced, G_TYPE_BOOLEAN)) { filter->interlaced = g_value_get_boolean (interlaced); } else { /* assume progressive if no interlaced property in caps */ filter->interlaced = FALSE; } /* the template caps will do for the src pad, should always accept */ return gst_pad_set_caps (filter->srcpad, gst_static_pad_template_get_caps (&y4mencode_src_factory)); } static inline GstBuffer * gst_y4m_encode_get_stream_header (GstY4mEncode * filter) { gpointer header; GstBuffer *buf; gchar interlaced; interlaced = 'p'; if (filter->interlaced && filter->top_field_first) interlaced = 't'; else if (filter->interlaced) interlaced = 'b'; header = g_strdup_printf ("YUV4MPEG2 C%s W%d H%d I%c F%d:%d A%d:%d\n", filter->colorspace, filter->width, filter->height, interlaced, filter->fps_num, filter->fps_den, filter->par_num, filter->par_den); buf = gst_buffer_new (); gst_buffer_set_data (buf, header, strlen (header)); /* so it gets free'd when needed */ GST_BUFFER_MALLOCDATA (buf) = header; return buf; } static inline GstBuffer * gst_y4m_encode_get_frame_header (GstY4mEncode * filter) { gpointer header; GstBuffer *buf; header = g_strdup_printf ("FRAME\n"); buf = gst_buffer_new (); gst_buffer_set_data (buf, header, strlen (header)); /* so it gets free'd when needed */ GST_BUFFER_MALLOCDATA (buf) = header; return buf; } static GstFlowReturn gst_y4m_encode_chain (GstPad * pad, GstBuffer * buf) { GstY4mEncode *filter = GST_Y4M_ENCODE (GST_PAD_PARENT (pad)); GstBuffer *outbuf; GstClockTime timestamp; /* check we got some decent info from caps */ if (filter->width < 0) { GST_ELEMENT_ERROR ("filter", CORE, NEGOTIATION, (NULL), ("format wasn't negotiated before chain function")); gst_buffer_unref (buf); return GST_FLOW_NOT_NEGOTIATED; } timestamp = GST_BUFFER_TIMESTAMP (buf); if (G_UNLIKELY (!filter->header)) { if (filter->interlaced == TRUE) { if (GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_TFF)) { filter->top_field_first = TRUE; } else { filter->top_field_first = FALSE; } } outbuf = gst_y4m_encode_get_stream_header (filter); filter->header = TRUE; outbuf = gst_buffer_join (outbuf, gst_y4m_encode_get_frame_header (filter)); } else { outbuf = gst_y4m_encode_get_frame_header (filter); } /* join with data */ outbuf = gst_buffer_join (outbuf, buf); /* decorate */ gst_buffer_make_metadata_writable (outbuf); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (filter->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; return gst_pad_push (filter->srcpad, outbuf); } static void gst_y4m_encode_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstY4mEncode G_GNUC_UNUSED *filter; g_return_if_fail (GST_IS_Y4M_ENCODE (object)); filter = GST_Y4M_ENCODE (object); switch (prop_id) { default: break; } } static void gst_y4m_encode_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstY4mEncode G_GNUC_UNUSED *filter; g_return_if_fail (GST_IS_Y4M_ENCODE (object)); filter = GST_Y4M_ENCODE (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_y4m_encode_change_state (GstElement * element, GstStateChange transition) { GstY4mEncode *filter = GST_Y4M_ENCODE (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_y4m_encode_reset (filter); break; default: break; } return GST_STATE_CHANGE_SUCCESS; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "y4menc", GST_RANK_PRIMARY, GST_TYPE_Y4M_ENCODE); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "y4menc", "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/Makefile.am0000644000175000017500000000016711671175352014644 00000000000000SUBDIRS = $(GST_PLUGINS_SELECTED) DIST_SUBDIRS = $(GST_PLUGINS_ALL) include $(top_srcdir)/common/parallel-subdirs.mak gst-plugins-good-0.10.31/gst/alpha/0000755000175000017500000000000011720565301013741 500000000000000gst-plugins-good-0.10.31/gst/alpha/gstalphacolor.h0000644000175000017500000000357211671175353016714 00000000000000/* GStreamer alphacolor element * Copyright (C) 2005 Wim Taymans * * 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_ALPHA_COLOR_H_ #define _GST_ALPHA_COLOR_H_ #include #include #define GST_TYPE_ALPHA_COLOR \ (gst_alpha_color_get_type()) #define GST_ALPHA_COLOR(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALPHA_COLOR,GstAlphaColor)) #define GST_ALPHA_COLOR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALPHA_COLOR,GstAlphaColorClass)) #define GST_IS_ALPHA_COLOR(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALPHA_COLOR)) #define GST_IS_ALPHA_COLOR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALPHA_COLOR)) typedef struct _GstAlphaColor GstAlphaColor; typedef struct _GstAlphaColorClass GstAlphaColorClass; struct _GstAlphaColor { GstVideoFilter parent; /*< private >*/ /* caps */ GstVideoFormat in_format, out_format; gint width, height; void (*process) (guint8 * data, gint size, const gint * matrix); const gint *matrix; }; struct _GstAlphaColorClass { GstVideoFilterClass parent_class; }; GType gst_alpha_color_get_type (void); #endif /* _GST_ALPHA_COLOR_H_ */ gst-plugins-good-0.10.31/gst/alpha/Makefile.am0000644000175000017500000000251111671175353015725 00000000000000plugin_LTLIBRARIES = libgstalpha.la libgstalphacolor.la libgstalpha_la_SOURCES = gstalpha.c libgstalpha_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstalpha_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_CONTROLLER_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstalpha_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstalpha_la_LIBTOOLFLAGS = --tag=disable-static libgstalphacolor_la_SOURCES = gstalphacolor.c libgstalphacolor_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstalphacolor_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) libgstalphacolor_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstalphacolor_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstalpha.h gstalphacolor.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstalpha -:SHARED libgstalpha \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstalpha_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalpha_la_CFLAGS) \ -:LDFLAGS $(libgstalpha_la_LDFLAGS) \ $(libgstalpha_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/alpha/gstalpha.h0000644000175000017500000000577711677341654015673 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2007> Wim Taymans * Copyright (C) <2007> Edward Hervey * Copyright (C) <2007> Jan Schmidt * * 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_ALPHA_H__ #define __GST_ALPHA_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_ALPHA \ (gst_alpha_get_type()) #define GST_ALPHA(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALPHA,GstAlpha)) #define GST_ALPHA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALPHA,GstAlphaClass)) #define GST_IS_ALPHA(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALPHA)) #define GST_IS_ALPHA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALPHA)) typedef struct _GstAlpha GstAlpha; typedef struct _GstAlphaClass GstAlphaClass; /** * GstAlphaMethod: * @ALPHA_METHOD_SET: Set/adjust alpha channel * @ALPHA_METHOD_GREEN: Chroma Key green * @ALPHA_METHOD_BLUE: Chroma Key blue * @ALPHA_METHOD_CUSTOM: Chroma Key on target_r/g/b */ typedef enum { ALPHA_METHOD_SET, ALPHA_METHOD_GREEN, ALPHA_METHOD_BLUE, ALPHA_METHOD_CUSTOM, } GstAlphaMethod; GST_DEBUG_CATEGORY_STATIC (gst_alpha_debug); #define GST_CAT_DEFAULT gst_alpha_debug struct _GstAlpha { GstVideoFilter parent; /* */ /* caps */ #if !GLIB_CHECK_VERSION (2, 31, 0) GStaticMutex lock; #else GMutex lock; #endif GstVideoFormat in_format, out_format; gint width, height; gboolean in_sdtv, out_sdtv; /* properties */ gdouble alpha; guint target_r; guint target_g; guint target_b; GstAlphaMethod method; gfloat angle; gfloat noise_level; guint black_sensitivity; guint white_sensitivity; gboolean prefer_passthrough; /* processing function */ void (*process) (const guint8 *src, guint8 *dest, gint width, gint height, GstAlpha *alpha); /* precalculated values for chroma keying */ gint8 cb, cr; gint8 kg; guint8 accept_angle_tg; guint8 accept_angle_ctg; guint8 one_over_kc; guint8 kfgy_scale; guint noise_level2; }; struct _GstAlphaClass { GstVideoFilterClass parent_class; }; GType gst_alpha_get_type (void); G_END_DECLS #endif /* __GST_ALPHA_H__ */ gst-plugins-good-0.10.31/gst/alpha/gstalphacolor.c0000644000175000017500000004401611707323154016677 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-alphacolor * * The alphacolor element does memory-efficient (in-place) colourspace * conversion from RGBA to AYUV or AYUV to RGBA while preserving the * alpha channel. * * Sample pipeline: * |[ * gst-launch videotestsrc ! "video/x-raw-yuv,format=(fourcc)AYUV" ! \ * alphacolor ! "video/x-raw-rgb" ! ffmpegcolorspace ! autovideosink * ]| */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstalphacolor.h" #include #include #include GST_DEBUG_CATEGORY_STATIC (alpha_color_debug); #define GST_CAT_DEFAULT alpha_color_debug /* elementfactory information */ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_YUV ("AYUV")) ); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_YUV ("AYUV")) ); GST_BOILERPLATE (GstAlphaColor, gst_alpha_color, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static GstCaps *gst_alpha_color_transform_caps (GstBaseTransform * btrans, GstPadDirection direction, GstCaps * caps); static gboolean gst_alpha_color_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps); static GstFlowReturn gst_alpha_color_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf); static void gst_alpha_color_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Alpha color filter", "Filter/Converter/Video", "ARGB from/to AYUV colorspace conversion preserving the alpha channel", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); } static void gst_alpha_color_class_init (GstAlphaColorClass * klass) { GstBaseTransformClass *gstbasetransform_class = (GstBaseTransformClass *) klass; gstbasetransform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_alpha_color_transform_caps); gstbasetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_alpha_color_set_caps); gstbasetransform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_alpha_color_transform_ip); GST_DEBUG_CATEGORY_INIT (alpha_color_debug, "alphacolor", 0, "ARGB<->AYUV colorspace conversion preserving the alpha channels"); } static void gst_alpha_color_init (GstAlphaColor * alpha, GstAlphaColorClass * g_class) { GstBaseTransform *btrans = GST_BASE_TRANSFORM (alpha); btrans->always_in_place = TRUE; } static GstCaps * gst_alpha_color_transform_caps (GstBaseTransform * btrans, GstPadDirection direction, GstCaps * caps) { const GstCaps *tmpl_caps = NULL; GstCaps *result = NULL, *local_caps = NULL; guint i; local_caps = gst_caps_new_empty (); for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_structure_copy (gst_caps_get_structure (caps, i)); /* Remove any specific parameter from the structure */ gst_structure_remove_field (structure, "format"); gst_structure_remove_field (structure, "endianness"); gst_structure_remove_field (structure, "depth"); gst_structure_remove_field (structure, "bpp"); gst_structure_remove_field (structure, "red_mask"); gst_structure_remove_field (structure, "green_mask"); gst_structure_remove_field (structure, "blue_mask"); gst_structure_remove_field (structure, "alpha_mask"); gst_structure_remove_field (structure, "color-matrix"); gst_structure_remove_field (structure, "chroma-site"); gst_structure_set_name (structure, "video/x-raw-rgb"); gst_caps_append_structure (local_caps, gst_structure_copy (structure)); gst_structure_set_name (structure, "video/x-raw-yuv"); gst_caps_append_structure (local_caps, structure); } /* Get the appropriate template */ if (direction == GST_PAD_SINK) { tmpl_caps = gst_static_pad_template_get_caps (&src_template); } else if (direction == GST_PAD_SRC) { tmpl_caps = gst_static_pad_template_get_caps (&sink_template); } /* Intersect with our template caps */ result = gst_caps_intersect (local_caps, tmpl_caps); gst_caps_unref (local_caps); gst_caps_do_simplify (result); GST_LOG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, caps, result); return result; } /* Generated by -bad/ext/cog/generate_tables */ static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = { 298, 0, 459, -63514, 298, -55, -136, 19681, 298, 541, 0, -73988, }; static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { 298, 0, 409, -57068, 298, -100, -208, 34707, 298, 516, 0, -70870, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = { 47, 157, 16, 4096, -26, -87, 112, 32768, 112, -102, -10, 32768, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { 66, 129, 25, 4096, -38, -74, 112, 32768, 112, -94, -18, 32768, }; static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = { 256, -30, -53, 10600, 0, 261, 29, -4367, 0, 19, 262, -3289, }; static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = { 256, 25, 49, -9536, 0, 253, -28, 3958, 0, -19, 252, 2918, }; #define DEFINE_ARGB_AYUV_FUNCTIONS(name, A, R, G, B) \ static void \ transform_##name##_ayuv (guint8 * data, gint size, const gint *matrix) \ { \ gint y, u, v; \ gint yc[4]; \ gint uc[4]; \ gint vc[4]; \ \ memcpy (yc, matrix, 4 * sizeof (gint)); \ memcpy (uc, matrix + 4, 4 * sizeof (gint)); \ memcpy (vc, matrix + 8, 4 * sizeof (gint)); \ \ while (size > 0) { \ y = (data[R] * yc[0] + data[G] * yc[1] + data[B] * yc[2] + yc[3]) >> 8; \ u = (data[R] * uc[0] + data[G] * uc[1] + data[B] * uc[2] + uc[3]) >> 8; \ v = (data[R] * vc[0] + data[G] * vc[1] + data[B] * vc[2] + vc[3]) >> 8; \ \ data[0] = data[A]; \ data[1] = y; \ data[2] = u; \ data[3] = v; \ \ data += 4; \ size -= 4; \ } \ } \ \ static void \ transform_ayuv_##name (guint8 * data, gint size, const gint *matrix) \ { \ gint r, g, b; \ gint rc[4]; \ gint gc[4]; \ gint bc[4]; \ \ memcpy (rc, matrix, 4 * sizeof (gint)); \ memcpy (gc, matrix + 4, 4 * sizeof (gint)); \ memcpy (bc, matrix + 8, 4 * sizeof (gint)); \ \ while (size > 0) { \ r = (data[1] * rc[0] + data[2] * rc[1] + data[3] * rc[2] + rc[3]) >> 8; \ g = (data[1] * gc[0] + data[2] * gc[1] + data[3] * gc[2] + gc[3]) >> 8; \ b = (data[1] * bc[0] + data[2] * bc[1] + data[3] * bc[2] + bc[3]) >> 8; \ \ data[A] = data[0]; \ data[R] = CLAMP (r, 0, 255); \ data[G] = CLAMP (g, 0, 255); \ data[B] = CLAMP (b, 0, 255); \ \ data += 4; \ size -= 4; \ } \ } DEFINE_ARGB_AYUV_FUNCTIONS (rgba, 3, 0, 1, 2); DEFINE_ARGB_AYUV_FUNCTIONS (bgra, 3, 2, 1, 0); DEFINE_ARGB_AYUV_FUNCTIONS (argb, 0, 1, 2, 3); DEFINE_ARGB_AYUV_FUNCTIONS (abgr, 0, 3, 2, 1); static void transform_ayuv_ayuv (guint8 * data, gint size, const gint * matrix) { gint y, u, v; gint yc[4]; gint uc[4]; gint vc[4]; if (matrix == NULL) return; memcpy (yc, matrix, 4 * sizeof (gint)); memcpy (uc, matrix + 4, 4 * sizeof (gint)); memcpy (vc, matrix + 8, 4 * sizeof (gint)); while (size > 0) { y = (data[1] * yc[0] + data[2] * yc[1] + data[3] * yc[2] + yc[3]) >> 8; u = (data[1] * uc[0] + data[2] * uc[1] + data[3] * uc[2] + uc[3]) >> 8; v = (data[1] * vc[0] + data[2] * vc[1] + data[3] * vc[2] + vc[3]) >> 8; data[1] = y; data[2] = u; data[3] = v; data += 4; size -= 4; } } static void transform_argb_bgra (guint8 * data, gint size, const gint * matrix) { gint r, g, b; while (size > 0) { r = data[1]; g = data[2]; b = data[3]; data[3] = data[0]; data[0] = b; data[1] = g; data[2] = r; data += 4; size -= 4; } } #define transform_abgr_rgba transform_argb_bgra static void transform_argb_abgr (guint8 * data, gint size, const gint * matrix) { gint r, g, b; while (size > 0) { r = data[1]; g = data[2]; b = data[3]; /* data[0] = data[0]; */ data[1] = b; data[2] = g; data[3] = r; data += 4; size -= 4; } } #define transform_abgr_argb transform_argb_abgr static void transform_rgba_bgra (guint8 * data, gint size, const gint * matrix) { gint r, g, b; while (size > 0) { r = data[0]; g = data[1]; b = data[2]; /* data[3] = data[3] */ ; data[0] = b; data[1] = g; data[2] = r; data += 4; size -= 4; } } #define transform_bgra_rgba transform_rgba_bgra static void transform_argb_rgba (guint8 * data, gint size, const gint * matrix) { gint r, g, b; while (size > 0) { r = data[1]; g = data[2]; b = data[3]; data[3] = data[0]; data[0] = r; data[1] = g; data[2] = b; data += 4; size -= 4; } } #define transform_abgr_bgra transform_argb_rgba static void transform_bgra_argb (guint8 * data, gint size, const gint * matrix) { gint r, g, b; while (size > 0) { r = data[2]; g = data[1]; b = data[0]; data[0] = data[3]; data[1] = r; data[2] = g; data[3] = b; data += 4; size -= 4; } } #define transform_rgba_abgr transform_bgra_argb static void transform_rgba_argb (guint8 * data, gint size, const gint * matrix) { gint r, g, b; while (size > 0) { r = data[0]; g = data[1]; b = data[2]; data[0] = data[3]; data[1] = r; data[2] = g; data[3] = b; data += 4; size -= 4; } } #define transform_bgra_abgr transform_rgba_argb static gboolean gst_alpha_color_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstAlphaColor *alpha = GST_ALPHA_COLOR (btrans); gboolean ret; gint w, h; gint w2, h2; GstVideoFormat in_format, out_format; const gchar *matrix; gboolean in_sdtv, out_sdtv; alpha->process = NULL; alpha->matrix = NULL; ret = gst_video_format_parse_caps (incaps, &in_format, &w, &h); ret &= gst_video_format_parse_caps (outcaps, &out_format, &w2, &h2); if (!ret || w != w2 || h != h2) { GST_DEBUG_OBJECT (alpha, "incomplete or invalid caps!"); return FALSE; } matrix = gst_video_parse_caps_color_matrix (incaps); in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; matrix = gst_video_parse_caps_color_matrix (outcaps); out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; alpha->in_format = in_format; alpha->out_format = out_format; alpha->width = w; alpha->height = h; switch (alpha->in_format) { case GST_VIDEO_FORMAT_ARGB: switch (alpha->out_format) { case GST_VIDEO_FORMAT_ARGB: alpha->process = NULL; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_BGRA: alpha->process = transform_argb_bgra; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_ABGR: alpha->process = transform_argb_abgr; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_RGBA: alpha->process = transform_argb_rgba; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_AYUV: alpha->process = transform_argb_ayuv; alpha->matrix = out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; break; default: alpha->process = NULL; alpha->matrix = NULL; break; } break; case GST_VIDEO_FORMAT_BGRA: switch (alpha->out_format) { case GST_VIDEO_FORMAT_BGRA: alpha->process = NULL; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_ARGB: alpha->process = transform_bgra_argb; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_ABGR: alpha->process = transform_bgra_abgr; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_RGBA: alpha->process = transform_bgra_rgba; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_AYUV: alpha->process = transform_bgra_ayuv; alpha->matrix = out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; break; default: alpha->process = NULL; alpha->matrix = NULL; break; } break; case GST_VIDEO_FORMAT_ABGR: switch (alpha->out_format) { case GST_VIDEO_FORMAT_ABGR: alpha->process = NULL; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_RGBA: alpha->process = transform_abgr_rgba; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_ARGB: alpha->process = transform_abgr_argb; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_BGRA: alpha->process = transform_abgr_bgra; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_AYUV: alpha->process = transform_abgr_ayuv; alpha->matrix = out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; break; default: alpha->process = NULL; alpha->matrix = NULL; break; } break; case GST_VIDEO_FORMAT_RGBA: switch (alpha->out_format) { case GST_VIDEO_FORMAT_RGBA: alpha->process = NULL; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_ARGB: alpha->process = transform_rgba_argb; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_ABGR: alpha->process = transform_rgba_abgr; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_BGRA: alpha->process = transform_rgba_bgra; alpha->matrix = NULL; break; case GST_VIDEO_FORMAT_AYUV: alpha->process = transform_rgba_ayuv; alpha->matrix = out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; break; default: alpha->process = NULL; alpha->matrix = NULL; break; } break; case GST_VIDEO_FORMAT_AYUV: switch (alpha->out_format) { case GST_VIDEO_FORMAT_AYUV: if (in_sdtv == out_sdtv) { alpha->process = transform_ayuv_ayuv; alpha->matrix = NULL; } else { alpha->process = transform_ayuv_ayuv; alpha->matrix = out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit; } break; case GST_VIDEO_FORMAT_ARGB: alpha->process = transform_ayuv_argb; alpha->matrix = in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv; break; case GST_VIDEO_FORMAT_BGRA: alpha->process = transform_ayuv_bgra; alpha->matrix = in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv; break; case GST_VIDEO_FORMAT_ABGR: alpha->process = transform_ayuv_abgr; alpha->matrix = in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv; break; case GST_VIDEO_FORMAT_RGBA: alpha->process = transform_ayuv_rgba; alpha->matrix = in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv; break; default: alpha->process = NULL; alpha->matrix = NULL; break; } break; default: alpha->process = NULL; alpha->matrix = NULL; break; } if (in_format == out_format && in_sdtv == out_sdtv) gst_base_transform_set_passthrough (btrans, TRUE); else if (!alpha->process) return FALSE; return TRUE; } static GstFlowReturn gst_alpha_color_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf) { GstAlphaColor *alpha = GST_ALPHA_COLOR (btrans); if (G_UNLIKELY (GST_BUFFER_SIZE (inbuf) != 4 * alpha->width * alpha->height)) { GST_ERROR_OBJECT (alpha, "Invalid buffer size (was %u, expected %u)", GST_BUFFER_SIZE (inbuf), alpha->width * alpha->height); return GST_FLOW_ERROR; } if (gst_base_transform_is_passthrough (btrans)) return GST_FLOW_OK; if (G_UNLIKELY (!alpha->process)) { GST_ERROR_OBJECT (alpha, "Not negotiated yet"); return GST_FLOW_NOT_NEGOTIATED; } /* Transform in place */ alpha->process (GST_BUFFER_DATA (inbuf), GST_BUFFER_SIZE (inbuf), alpha->matrix); return GST_FLOW_OK; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "alphacolor", GST_RANK_NONE, GST_TYPE_ALPHA_COLOR); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "alphacolor", "RGBA from/to AYUV colorspace conversion preserving the alpha channel", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/alpha/Makefile.in0000644000175000017500000007337611720560230015742 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/alpha DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstalpha_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstalpha_la_OBJECTS = libgstalpha_la-gstalpha.lo libgstalpha_la_OBJECTS = $(am_libgstalpha_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstalpha_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstalpha_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstalpha_la_CFLAGS) $(CFLAGS) \ $(libgstalpha_la_LDFLAGS) $(LDFLAGS) -o $@ libgstalphacolor_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstalphacolor_la_OBJECTS = libgstalphacolor_la-gstalphacolor.lo libgstalphacolor_la_OBJECTS = $(am_libgstalphacolor_la_OBJECTS) libgstalphacolor_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstalphacolor_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstalphacolor_la_CFLAGS) $(CFLAGS) \ $(libgstalphacolor_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstalpha_la_SOURCES) $(libgstalphacolor_la_SOURCES) DIST_SOURCES = $(libgstalpha_la_SOURCES) \ $(libgstalphacolor_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstalpha.la libgstalphacolor.la libgstalpha_la_SOURCES = gstalpha.c libgstalpha_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstalpha_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_CONTROLLER_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstalpha_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstalpha_la_LIBTOOLFLAGS = --tag=disable-static libgstalphacolor_la_SOURCES = gstalphacolor.c libgstalphacolor_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstalphacolor_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) libgstalphacolor_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstalphacolor_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstalpha.h gstalphacolor.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/alpha/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/alpha/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstalpha.la: $(libgstalpha_la_OBJECTS) $(libgstalpha_la_DEPENDENCIES) $(EXTRA_libgstalpha_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstalpha_la_LINK) -rpath $(plugindir) $(libgstalpha_la_OBJECTS) $(libgstalpha_la_LIBADD) $(LIBS) libgstalphacolor.la: $(libgstalphacolor_la_OBJECTS) $(libgstalphacolor_la_DEPENDENCIES) $(EXTRA_libgstalphacolor_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstalphacolor_la_LINK) -rpath $(plugindir) $(libgstalphacolor_la_OBJECTS) $(libgstalphacolor_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalpha_la-gstalpha.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalphacolor_la-gstalphacolor.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstalpha_la-gstalpha.lo: gstalpha.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalpha_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalpha_la_CFLAGS) $(CFLAGS) -MT libgstalpha_la-gstalpha.lo -MD -MP -MF $(DEPDIR)/libgstalpha_la-gstalpha.Tpo -c -o libgstalpha_la-gstalpha.lo `test -f 'gstalpha.c' || echo '$(srcdir)/'`gstalpha.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalpha_la-gstalpha.Tpo $(DEPDIR)/libgstalpha_la-gstalpha.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstalpha.c' object='libgstalpha_la-gstalpha.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalpha_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalpha_la_CFLAGS) $(CFLAGS) -c -o libgstalpha_la-gstalpha.lo `test -f 'gstalpha.c' || echo '$(srcdir)/'`gstalpha.c libgstalphacolor_la-gstalphacolor.lo: gstalphacolor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalphacolor_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalphacolor_la_CFLAGS) $(CFLAGS) -MT libgstalphacolor_la-gstalphacolor.lo -MD -MP -MF $(DEPDIR)/libgstalphacolor_la-gstalphacolor.Tpo -c -o libgstalphacolor_la-gstalphacolor.lo `test -f 'gstalphacolor.c' || echo '$(srcdir)/'`gstalphacolor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalphacolor_la-gstalphacolor.Tpo $(DEPDIR)/libgstalphacolor_la-gstalphacolor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstalphacolor.c' object='libgstalphacolor_la-gstalphacolor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalphacolor_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalphacolor_la_CFLAGS) $(CFLAGS) -c -o libgstalphacolor_la-gstalphacolor.lo `test -f 'gstalphacolor.c' || echo '$(srcdir)/'`gstalphacolor.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstalpha -:SHARED libgstalpha \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstalpha_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalpha_la_CFLAGS) \ -:LDFLAGS $(libgstalpha_la_LDFLAGS) \ $(libgstalpha_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/alpha/gstalpha.c0000644000175000017500000022730311677341654015655 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2007> Wim Taymans * Copyright (C) <2007> Edward Hervey * Copyright (C) <2007> Jan Schmidt * * 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-alpha * * The alpha element adds an alpha channel to a video stream. The values * of the alpha channel can be either be set to a constant or can be * dynamically calculated via chroma keying, e.g. blue can be set as * the transparent color. * * Sample pipeline: * |[ * gst-launch videotestsrc pattern=smpte75 ! alpha method=green ! \ * videomixer name=mixer ! ffmpegcolorspace ! autovideosink \ * videotestsrc pattern=snow ! mixer. * ]| This pipeline adds a alpha channel to the SMPTE color bars * with green as the transparent color and mixes the output with * a snow video stream. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstalpha.h" #include #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif /* Generated by -bad/ext/cog/generate_tables */ static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = { 298, 0, 459, -63514, 298, -55, -136, 19681, 298, 541, 0, -73988, }; static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { 298, 0, 409, -57068, 298, -100, -208, 34707, 298, 516, 0, -70870, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = { 47, 157, 16, 4096, -26, -87, 112, 32768, 112, -102, -10, 32768, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { 66, 129, 25, 4096, -38, -74, 112, 32768, 112, -94, -18, 32768, }; static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = { 256, -30, -53, 10600, 0, 261, 29, -4367, 0, 19, 262, -3289, }; static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = { 256, 25, 49, -9536, 0, 253, -28, 3958, 0, -19, 252, 2918, }; /* Alpha signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_METHOD ALPHA_METHOD_SET #define DEFAULT_ALPHA 1.0 #define DEFAULT_TARGET_R 0 #define DEFAULT_TARGET_G 255 #define DEFAULT_TARGET_B 0 #define DEFAULT_ANGLE 20.0 #define DEFAULT_NOISE_LEVEL 2.0 #define DEFAULT_BLACK_SENSITIVITY 100 #define DEFAULT_WHITE_SENSITIVITY 100 #define DEFAULT_PREFER_PASSTHROUGH FALSE enum { PROP_0, PROP_METHOD, PROP_ALPHA, PROP_TARGET_R, PROP_TARGET_G, PROP_TARGET_B, PROP_ANGLE, PROP_NOISE_LEVEL, PROP_BLACK_SENSITIVITY, PROP_WHITE_SENSITIVITY, PROP_PREFER_PASSTHROUGH, PROP_LAST }; static GstStaticPadTemplate gst_alpha_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B")) ); static GstStaticPadTemplate gst_alpha_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ) ); static GstStaticCaps gst_alpha_alpha_caps = GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA); /* FIXME: why do we need our own lock for this? */ #if !GLIB_CHECK_VERSION (2, 31, 0) #define GST_ALPHA_LOCK(alpha) G_STMT_START { \ GST_LOG_OBJECT (alpha, "Locking alpha from thread %p", g_thread_self ()); \ g_static_mutex_lock (&alpha->lock); \ GST_LOG_OBJECT (alpha, "Locked alpha from thread %p", g_thread_self ()); \ } G_STMT_END #define GST_ALPHA_UNLOCK(alpha) G_STMT_START { \ GST_LOG_OBJECT (alpha, "Unlocking alpha from thread %p", g_thread_self ()); \ g_static_mutex_unlock (&alpha->lock); \ } G_STMT_END #else #define GST_ALPHA_LOCK(alpha) G_STMT_START { \ GST_LOG_OBJECT (alpha, "Locking alpha from thread %p", g_thread_self ()); \ g_mutex_lock (&alpha->lock); \ GST_LOG_OBJECT (alpha, "Locked alpha from thread %p", g_thread_self ()); \ } G_STMT_END #define GST_ALPHA_UNLOCK(alpha) G_STMT_START { \ GST_LOG_OBJECT (alpha, "Unlocking alpha from thread %p", g_thread_self ()); \ g_mutex_unlock (&alpha->lock); \ } G_STMT_END #endif static gboolean gst_alpha_start (GstBaseTransform * trans); static gboolean gst_alpha_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size); static GstCaps *gst_alpha_transform_caps (GstBaseTransform * btrans, GstPadDirection direction, GstCaps * caps); static gboolean gst_alpha_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps); static GstFlowReturn gst_alpha_transform (GstBaseTransform * btrans, GstBuffer * in, GstBuffer * out); static void gst_alpha_before_transform (GstBaseTransform * btrans, GstBuffer * buf); static void gst_alpha_init_params (GstAlpha * alpha); static gboolean gst_alpha_set_process_function (GstAlpha * alpha); static void gst_alpha_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_alpha_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_alpha_finalize (GObject * object); GST_BOILERPLATE (GstAlpha, gst_alpha, GstVideoFilter, GST_TYPE_VIDEO_FILTER); #define GST_TYPE_ALPHA_METHOD (gst_alpha_method_get_type()) static GType gst_alpha_method_get_type (void) { static GType alpha_method_type = 0; static const GEnumValue alpha_method[] = { {ALPHA_METHOD_SET, "Set/adjust alpha channel", "set"}, {ALPHA_METHOD_GREEN, "Chroma Key green", "green"}, {ALPHA_METHOD_BLUE, "Chroma Key blue", "blue"}, {ALPHA_METHOD_CUSTOM, "Chroma Key on target_r/g/b", "custom"}, {0, NULL, NULL}, }; if (!alpha_method_type) { alpha_method_type = g_enum_register_static ("GstAlphaMethod", alpha_method); } return alpha_method_type; } static void gst_alpha_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Alpha filter", "Filter/Effect/Video", "Adds an alpha channel to video - uniform or via chroma-keying", "Wim Taymans \n" "Edward Hervey \n" "Jan Schmidt "); gst_element_class_add_static_pad_template (element_class, &gst_alpha_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_alpha_src_template); GST_DEBUG_CATEGORY_INIT (gst_alpha_debug, "alpha", 0, "alpha - Element for adding alpha channel to streams"); } static void gst_alpha_class_init (GstAlphaClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_alpha_set_property; gobject_class->get_property = gst_alpha_get_property; gobject_class->finalize = gst_alpha_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_METHOD, g_param_spec_enum ("method", "Method", "How the alpha channels should be created", GST_TYPE_ALPHA_METHOD, DEFAULT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ALPHA, g_param_spec_double ("alpha", "Alpha", "The value for the alpha channel", 0.0, 1.0, DEFAULT_ALPHA, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TARGET_R, g_param_spec_uint ("target-r", "Target Red", "The Red target", 0, 255, DEFAULT_TARGET_R, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TARGET_G, g_param_spec_uint ("target-g", "Target Green", "The Green target", 0, 255, DEFAULT_TARGET_G, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TARGET_B, g_param_spec_uint ("target-b", "Target Blue", "The Blue target", 0, 255, DEFAULT_TARGET_B, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ANGLE, g_param_spec_float ("angle", "Angle", "Size of the colorcube to change", 0.0, 90.0, DEFAULT_ANGLE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_NOISE_LEVEL, g_param_spec_float ("noise-level", "Noise Level", "Size of noise radius", 0.0, 64.0, DEFAULT_NOISE_LEVEL, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BLACK_SENSITIVITY, g_param_spec_uint ("black-sensitivity", "Black Sensitivity", "Sensitivity to dark colors", 0, 128, DEFAULT_BLACK_SENSITIVITY, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_WHITE_SENSITIVITY, g_param_spec_uint ("white-sensitivity", "Sensitivity", "Sensitivity to bright colors", 0, 128, DEFAULT_WHITE_SENSITIVITY, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PREFER_PASSTHROUGH, g_param_spec_boolean ("prefer-passthrough", "Prefer Passthrough", "Don't do any processing for alpha=1.0 if possible", DEFAULT_PREFER_PASSTHROUGH, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); btrans_class->start = GST_DEBUG_FUNCPTR (gst_alpha_start); btrans_class->transform = GST_DEBUG_FUNCPTR (gst_alpha_transform); btrans_class->before_transform = GST_DEBUG_FUNCPTR (gst_alpha_before_transform); btrans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_alpha_get_unit_size); btrans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_alpha_transform_caps); btrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_alpha_set_caps); } static void gst_alpha_init (GstAlpha * alpha, GstAlphaClass * klass) { alpha->alpha = DEFAULT_ALPHA; alpha->method = DEFAULT_METHOD; alpha->target_r = DEFAULT_TARGET_R; alpha->target_g = DEFAULT_TARGET_G; alpha->target_b = DEFAULT_TARGET_B; alpha->angle = DEFAULT_ANGLE; alpha->noise_level = DEFAULT_NOISE_LEVEL; alpha->black_sensitivity = DEFAULT_BLACK_SENSITIVITY; alpha->white_sensitivity = DEFAULT_WHITE_SENSITIVITY; #if !GLIB_CHECK_VERSION (2, 31, 0) g_static_mutex_init (&alpha->lock); #else g_mutex_init (&alpha->lock); #endif } static void gst_alpha_finalize (GObject * object) { GstAlpha *alpha = GST_ALPHA (object); #if !GLIB_CHECK_VERSION (2, 31, 0) g_static_mutex_free (&alpha->lock); #else g_mutex_clear (&alpha->lock); #endif G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_alpha_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAlpha *alpha = GST_ALPHA (object); gboolean reconfigure = FALSE; GST_ALPHA_LOCK (alpha); switch (prop_id) { case PROP_METHOD:{ gint method = g_value_get_enum (value); reconfigure = (method != alpha->method) && (method == ALPHA_METHOD_SET || alpha->method == ALPHA_METHOD_SET) && (alpha->alpha == 1.0) && (alpha->prefer_passthrough); alpha->method = method; switch (alpha->method) { case ALPHA_METHOD_GREEN: alpha->target_r = 0; alpha->target_g = 255; alpha->target_b = 0; break; case ALPHA_METHOD_BLUE: alpha->target_r = 0; alpha->target_g = 0; alpha->target_b = 255; break; default: break; } gst_alpha_set_process_function (alpha); gst_alpha_init_params (alpha); break; } case PROP_ALPHA:{ gdouble a = g_value_get_double (value); reconfigure = (a != alpha->alpha) && (a == 1.0 || alpha->alpha == 1.0) && (alpha->method == ALPHA_METHOD_SET) && (alpha->prefer_passthrough); alpha->alpha = a; break; } case PROP_TARGET_R: alpha->target_r = g_value_get_uint (value); gst_alpha_init_params (alpha); break; case PROP_TARGET_G: alpha->target_g = g_value_get_uint (value); gst_alpha_init_params (alpha); break; case PROP_TARGET_B: alpha->target_b = g_value_get_uint (value); gst_alpha_init_params (alpha); break; case PROP_ANGLE: alpha->angle = g_value_get_float (value); gst_alpha_init_params (alpha); break; case PROP_NOISE_LEVEL: alpha->noise_level = g_value_get_float (value); gst_alpha_init_params (alpha); break; case PROP_BLACK_SENSITIVITY: alpha->black_sensitivity = g_value_get_uint (value); break; case PROP_WHITE_SENSITIVITY: alpha->white_sensitivity = g_value_get_uint (value); break; case PROP_PREFER_PASSTHROUGH:{ gboolean prefer_passthrough = g_value_get_boolean (value); reconfigure = ((! !prefer_passthrough) != (! !alpha->prefer_passthrough)) && (alpha->method == ALPHA_METHOD_SET) && (alpha->alpha == 1.0); alpha->prefer_passthrough = prefer_passthrough; break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } if (reconfigure) gst_base_transform_reconfigure (GST_BASE_TRANSFORM_CAST (alpha)); GST_ALPHA_UNLOCK (alpha); } static void gst_alpha_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAlpha *alpha = GST_ALPHA (object); switch (prop_id) { case PROP_METHOD: g_value_set_enum (value, alpha->method); break; case PROP_ALPHA: g_value_set_double (value, alpha->alpha); break; case PROP_TARGET_R: g_value_set_uint (value, alpha->target_r); break; case PROP_TARGET_G: g_value_set_uint (value, alpha->target_g); break; case PROP_TARGET_B: g_value_set_uint (value, alpha->target_b); break; case PROP_ANGLE: g_value_set_float (value, alpha->angle); break; case PROP_NOISE_LEVEL: g_value_set_float (value, alpha->noise_level); break; case PROP_BLACK_SENSITIVITY: g_value_set_uint (value, alpha->black_sensitivity); break; case PROP_WHITE_SENSITIVITY: g_value_set_uint (value, alpha->white_sensitivity); break; case PROP_PREFER_PASSTHROUGH: g_value_set_boolean (value, alpha->prefer_passthrough); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_alpha_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size) { GstVideoFormat format; gint width, height; if (!gst_video_format_parse_caps (caps, &format, &width, &height)) return FALSE; *size = gst_video_format_get_size (format, width, height); GST_DEBUG_OBJECT (btrans, "unit size = %d for format %d w %d height %d", *size, format, width, height); return TRUE; } static GstCaps * gst_alpha_transform_caps (GstBaseTransform * btrans, GstPadDirection direction, GstCaps * caps) { GstAlpha *alpha = GST_ALPHA (btrans); GstCaps *ret, *tmp, *tmp2; GstStructure *structure; gint i; tmp = gst_caps_new_empty (); GST_ALPHA_LOCK (alpha); for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_structure_copy (gst_caps_get_structure (caps, i)); gst_structure_remove_field (structure, "format"); gst_structure_remove_field (structure, "endianness"); gst_structure_remove_field (structure, "depth"); gst_structure_remove_field (structure, "bpp"); gst_structure_remove_field (structure, "red_mask"); gst_structure_remove_field (structure, "green_mask"); gst_structure_remove_field (structure, "blue_mask"); gst_structure_remove_field (structure, "alpha_mask"); gst_structure_remove_field (structure, "color-matrix"); gst_structure_remove_field (structure, "chroma-site"); gst_structure_set_name (structure, "video/x-raw-yuv"); gst_caps_append_structure (tmp, gst_structure_copy (structure)); gst_structure_set_name (structure, "video/x-raw-rgb"); gst_caps_append_structure (tmp, structure); } if (direction == GST_PAD_SINK) { tmp2 = gst_static_caps_get (&gst_alpha_alpha_caps); ret = gst_caps_intersect (tmp, tmp2); gst_caps_unref (tmp); gst_caps_unref (tmp2); tmp = ret; ret = NULL; if (alpha->prefer_passthrough && alpha->method == ALPHA_METHOD_SET && alpha->alpha == 1.0) { ret = gst_caps_copy (caps); gst_caps_append (ret, tmp); tmp = NULL; } else { ret = tmp; tmp = NULL; } } else { ret = tmp; tmp = NULL; } GST_DEBUG_OBJECT (alpha, "Transformed %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, caps, ret); GST_ALPHA_UNLOCK (alpha); return ret; } static gboolean gst_alpha_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstAlpha *alpha = GST_ALPHA (btrans); const gchar *matrix; gboolean passthrough; GST_ALPHA_LOCK (alpha); if (!gst_video_format_parse_caps (incaps, &alpha->in_format, &alpha->width, &alpha->height) || !gst_video_format_parse_caps (outcaps, &alpha->out_format, &alpha->width, &alpha->height)) { GST_WARNING_OBJECT (alpha, "Failed to parse caps %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, incaps, outcaps); GST_ALPHA_UNLOCK (alpha); return FALSE; } matrix = gst_video_parse_caps_color_matrix (incaps); alpha->in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; matrix = gst_video_parse_caps_color_matrix (outcaps); alpha->out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; passthrough = alpha->prefer_passthrough && alpha->in_format == alpha->out_format && alpha->in_sdtv == alpha->out_sdtv && alpha->method == ALPHA_METHOD_SET && alpha->alpha == 1.0; GST_DEBUG_OBJECT (alpha, "Setting caps %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT " (passthrough: %d)", incaps, outcaps, passthrough); gst_base_transform_set_passthrough (btrans, passthrough); if (!gst_alpha_set_process_function (alpha) && !passthrough) { GST_WARNING_OBJECT (alpha, "No processing function for this caps and no passthrough mode"); GST_ALPHA_UNLOCK (alpha); return FALSE; } gst_alpha_init_params (alpha); GST_ALPHA_UNLOCK (alpha); return TRUE; } /* based on http://www.cs.utah.edu/~michael/chroma/ */ static inline gint chroma_keying_yuv (gint a, gint * y, gint * u, gint * v, gint cr, gint cb, gint smin, gint smax, guint8 accept_angle_tg, guint8 accept_angle_ctg, guint8 one_over_kc, guint8 kfgy_scale, gint8 kg, guint noise_level2) { gint tmp, tmp1; gint x1, y1; gint x, z; gint b_alpha; /* too dark or too bright, keep alpha */ if (*y < smin || *y > smax) return a; /* Convert foreground to XZ coords where X direction is defined by the key color */ tmp = ((*u) * cb + (*v) * cr) >> 7; x = CLAMP (tmp, -128, 127); tmp = ((*v) * cb - (*u) * cr) >> 7; z = CLAMP (tmp, -128, 127); /* WARNING: accept angle should never be set greater than "somewhat less than 90 degrees" to avoid dealing with negative/infinite tg. In reality, 80 degrees should be enough if foreground is reasonable. If this seems to be a problem, go to alternative ways of checking point position (scalar product or line equations). This angle should not be too small either to avoid infinite ctg (used to suppress foreground without use of division) */ tmp = (x * accept_angle_tg) >> 4; tmp = MIN (tmp, 127); if (abs (z) > tmp) { /* keep foreground Kfg = 0 */ return a; } /* Compute Kfg (implicitly) and Kbg, suppress foreground in XZ coord according to Kfg */ tmp = (z * accept_angle_ctg) >> 4; tmp = CLAMP (tmp, -128, 127); x1 = abs (tmp); y1 = z; tmp1 = x - x1; tmp1 = MAX (tmp1, 0); b_alpha = (tmp1 * one_over_kc) / 2; b_alpha = 255 - CLAMP (b_alpha, 0, 255); b_alpha = (a * b_alpha) >> 8; tmp = (tmp1 * kfgy_scale) >> 4; tmp1 = MIN (tmp, 255); *y = (*y < tmp1) ? 0 : *y - tmp1; /* Convert suppressed foreground back to CbCr */ tmp = (x1 * cb - y1 * cr) >> 7; *u = CLAMP (tmp, -128, 127); tmp = (x1 * cr + y1 * cb) >> 7; *v = CLAMP (tmp, -128, 127); /* Deal with noise. For now, a circle around the key color with radius of noise_level treated as exact key color. Introduces sharp transitions. */ tmp = z * z + (x - kg) * (x - kg); tmp = MIN (tmp, 0xffff); if (tmp < noise_level2) b_alpha = 0; return b_alpha; } #define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) static void gst_alpha_set_argb_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint i, j; gint matrix[12]; gint y, u, v; gint o[4]; o[0] = gst_video_format_get_component_offset (alpha->in_format, 3, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); memcpy (matrix, alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[0] = (src[o[0]] * s_alpha) >> 8; y = APPLY_MATRIX (matrix, 0, src[o[1]], src[o[2]], src[o[3]]); u = APPLY_MATRIX (matrix, 1, src[o[1]], src[o[2]], src[o[3]]); v = APPLY_MATRIX (matrix, 2, src[o[1]], src[o[2]], src[o[3]]); dest[1] = y; dest[2] = u; dest[3] = v; dest += 4; src += 4; } } } static void gst_alpha_chroma_key_argb_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint r, g, b; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint matrix[12]; gint o[4]; o[0] = gst_video_format_get_component_offset (alpha->in_format, 3, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; memcpy (matrix, alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = (src[o[0]] * pa) >> 8; r = src[o[1]]; g = src[o[2]]; b = src[o[3]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; dest[0] = a; dest[1] = y; dest[2] = u; dest[3] = v; src += 4; dest += 4; } } } static void gst_alpha_set_argb_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint i, j; gint p[4], o[4]; p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); o[0] = gst_video_format_get_component_offset (alpha->in_format, 3, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[p[0]] = (src[o[0]] * s_alpha) >> 8; dest[p[1]] = src[o[1]]; dest[p[2]] = src[o[2]]; dest[p[3]] = src[o[3]]; dest += 4; src += 4; } } } static void gst_alpha_chroma_key_argb_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint r, g, b; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint matrix[12], matrix2[12]; gint p[4], o[4]; p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); o[0] = gst_video_format_get_component_offset (alpha->in_format, 3, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; memcpy (matrix, cog_rgb_to_ycbcr_matrix_8bit_sdtv, 12 * sizeof (gint)); memcpy (matrix2, cog_ycbcr_to_rgb_matrix_8bit_sdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = (src[o[0]] * pa) >> 8; r = src[o[1]]; g = src[o[2]]; b = src[o[3]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; r = APPLY_MATRIX (matrix2, 0, y, u, v); g = APPLY_MATRIX (matrix2, 1, y, u, v); b = APPLY_MATRIX (matrix2, 2, y, u, v); dest[p[0]] = a; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); src += 4; dest += 4; } } } static void gst_alpha_set_ayuv_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint y, x; gint matrix[12]; gint r, g, b; gint p[4]; p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { dest[p[0]] = (src[0] * s_alpha) >> 8; r = APPLY_MATRIX (matrix, 0, src[1], src[2], src[3]); g = APPLY_MATRIX (matrix, 1, src[1], src[2], src[3]); b = APPLY_MATRIX (matrix, 2, src[1], src[2], src[3]); dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); dest += 4; src += 4; } } } static void gst_alpha_chroma_key_ayuv_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint r, g, b; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint matrix[12]; gint p[4]; p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = (src[0] * pa) >> 8; y = src[1]; u = src[2] - 128; v = src[3] - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[p[0]] = a; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); src += 4; dest += 4; } } } static void gst_alpha_set_ayuv_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint y, x; if (alpha->in_sdtv == alpha->out_sdtv) { for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { dest[0] = (src[0] * s_alpha) >> 8; dest[1] = src[1]; dest[2] = src[2]; dest[3] = src[3]; dest += 4; src += 4; } } } else { gint matrix[12]; memcpy (matrix, alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { dest[0] = (src[0] * s_alpha) >> 8; dest[1] = APPLY_MATRIX (matrix, 0, src[1], src[2], src[3]); dest[2] = APPLY_MATRIX (matrix, 1, src[1], src[2], src[3]); dest[3] = APPLY_MATRIX (matrix, 2, src[1], src[2], src[3]); dest += 4; src += 4; } } } } static void gst_alpha_chroma_key_ayuv_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 256), 0, 256); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; if (alpha->in_sdtv == alpha->out_sdtv) { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = (src[0] * pa) >> 8; y = src[1]; u = src[2] - 128; v = src[3] - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; dest[0] = a; dest[1] = y; dest[2] = u; dest[3] = v; src += 4; dest += 4; } } } else { gint matrix[12]; memcpy (matrix, alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = (src[0] * pa) >> 8; y = APPLY_MATRIX (matrix, 0, src[1], src[2], src[3]); u = APPLY_MATRIX (matrix, 1, src[1], src[2], src[3]) - 128; v = APPLY_MATRIX (matrix, 2, src[1], src[2], src[3]) - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; dest[0] = a; dest[1] = y; dest[2] = u; dest[3] = v; src += 4; dest += 4; } } } } static void gst_alpha_set_rgb_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint i, j; gint matrix[12]; gint y, u, v; gint o[3]; gint bpp; bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); o[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); memcpy (matrix, alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[0] = s_alpha; y = APPLY_MATRIX (matrix, 0, src[o[0]], src[o[1]], src[o[2]]); u = APPLY_MATRIX (matrix, 1, src[o[0]], src[o[1]], src[o[2]]); v = APPLY_MATRIX (matrix, 2, src[o[0]], src[o[1]], src[o[2]]); dest[1] = y; dest[2] = u; dest[3] = v; dest += 4; src += bpp; } } } static void gst_alpha_chroma_key_rgb_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint r, g, b; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint matrix[12]; gint o[3]; gint bpp; bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); o[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; memcpy (matrix, alpha->out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = pa; r = src[o[0]]; g = src[o[1]]; b = src[o[2]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; dest[0] = a; dest[1] = y; dest[2] = u; dest[3] = v; src += bpp; dest += 4; } } } static void gst_alpha_set_rgb_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint i, j; gint p[4], o[3]; gint bpp; bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); o[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[p[0]] = s_alpha; dest[p[1]] = src[o[0]]; dest[p[2]] = src[o[1]]; dest[p[3]] = src[o[2]]; dest += 4; src += bpp; } } } static void gst_alpha_chroma_key_rgb_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint r, g, b; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint matrix[12], matrix2[12]; gint p[4], o[3]; gint bpp; bpp = gst_video_format_get_pixel_stride (alpha->in_format, 0); o[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[2] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; memcpy (matrix, cog_rgb_to_ycbcr_matrix_8bit_sdtv, 12 * sizeof (gint)); memcpy (matrix2, cog_ycbcr_to_rgb_matrix_8bit_sdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = pa; r = src[o[0]]; g = src[o[1]]; b = src[o[2]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b) - 128; v = APPLY_MATRIX (matrix, 2, r, g, b) - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; r = APPLY_MATRIX (matrix2, 0, y, u, v); g = APPLY_MATRIX (matrix2, 1, y, u, v); b = APPLY_MATRIX (matrix2, 2, y, u, v); dest[p[0]] = a; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); src += bpp; dest += 4; } } } static void gst_alpha_set_planar_yuv_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); const guint8 *srcY, *srcY_tmp; const guint8 *srcU, *srcU_tmp; const guint8 *srcV, *srcV_tmp; gint i, j; gint y_stride, uv_stride; gint v_subs, h_subs; y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); srcY_tmp = srcY = src; srcU_tmp = srcU = src + gst_video_format_get_component_offset (alpha->in_format, 1, width, height); srcV_tmp = srcV = src + gst_video_format_get_component_offset (alpha->in_format, 2, width, height); switch (alpha->in_format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: v_subs = h_subs = 2; break; case GST_VIDEO_FORMAT_Y444: v_subs = h_subs = 1; break; case GST_VIDEO_FORMAT_Y42B: v_subs = 1; h_subs = 2; break; case GST_VIDEO_FORMAT_Y41B: v_subs = 1; h_subs = 4; break; default: g_assert_not_reached (); return; } if (alpha->in_sdtv == alpha->out_sdtv) { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[0] = b_alpha; dest[1] = srcY[0]; dest[2] = srcU[0]; dest[3] = srcV[0]; dest += 4; srcY++; if ((j + 1) % h_subs == 0) { srcU++; srcV++; } } srcY_tmp = srcY = srcY_tmp + y_stride; if ((i + 1) % v_subs == 0) { srcU_tmp = srcU = srcU_tmp + uv_stride; srcV_tmp = srcV = srcV_tmp + uv_stride; } else { srcU = srcU_tmp; srcV = srcV_tmp; } } } else { gint matrix[12]; gint a, y, u, v; memcpy (matrix, alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = b_alpha; y = srcY[0]; u = srcU[0]; v = srcV[0]; dest[0] = a; dest[1] = APPLY_MATRIX (matrix, 0, y, u, v); dest[2] = APPLY_MATRIX (matrix, 1, y, u, v); dest[3] = APPLY_MATRIX (matrix, 2, y, u, v); dest += 4; srcY++; if ((j + 1) % h_subs == 0) { srcU++; srcV++; } } srcY_tmp = srcY = srcY_tmp + y_stride; if ((i + 1) % v_subs == 0) { srcU_tmp = srcU = srcU_tmp + uv_stride; srcV_tmp = srcV = srcV_tmp + uv_stride; } else { srcU = srcU_tmp; srcV = srcV_tmp; } } } } static void gst_alpha_chroma_key_planar_yuv_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); const guint8 *srcY, *srcY_tmp; const guint8 *srcU, *srcU_tmp; const guint8 *srcV, *srcV_tmp; gint i, j; gint a, y, u, v; gint y_stride, uv_stride; gint v_subs, h_subs; gint smin = 128 - alpha->black_sensitivity; gint smax = 128 + alpha->white_sensitivity; gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); srcY_tmp = srcY = src; srcU_tmp = srcU = src + gst_video_format_get_component_offset (alpha->in_format, 1, width, height); srcV_tmp = srcV = src + gst_video_format_get_component_offset (alpha->in_format, 2, width, height); switch (alpha->in_format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: v_subs = h_subs = 2; break; case GST_VIDEO_FORMAT_Y444: v_subs = h_subs = 1; break; case GST_VIDEO_FORMAT_Y42B: v_subs = 1; h_subs = 2; break; case GST_VIDEO_FORMAT_Y41B: v_subs = 1; h_subs = 4; break; default: g_assert_not_reached (); return; } if (alpha->in_sdtv == alpha->out_sdtv) { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = b_alpha; y = srcY[0]; u = srcU[0] - 128; v = srcV[0] - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; dest[0] = a; dest[1] = y; dest[2] = u; dest[3] = v; dest += 4; srcY++; if ((j + 1) % h_subs == 0) { srcU++; srcV++; } } srcY_tmp = srcY = srcY_tmp + y_stride; if ((i + 1) % v_subs == 0) { srcU_tmp = srcU = srcU_tmp + uv_stride; srcV_tmp = srcV = srcV_tmp + uv_stride; } else { srcU = srcU_tmp; srcV = srcV_tmp; } } } else { gint matrix[12]; memcpy (matrix, alpha->out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = b_alpha; y = APPLY_MATRIX (matrix, 0, srcY[0], srcU[0], srcV[0]); u = APPLY_MATRIX (matrix, 1, srcY[0], srcU[0], srcV[0]) - 128; v = APPLY_MATRIX (matrix, 2, srcY[0], srcU[0], srcV[0]) - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[0] = a; dest[1] = y; dest[2] = u + 128; dest[3] = v + 128; dest += 4; srcY++; if ((j + 1) % h_subs == 0) { srcU++; srcV++; } } srcY_tmp = srcY = srcY_tmp + y_stride; if ((i + 1) % v_subs == 0) { srcU_tmp = srcU = srcU_tmp + uv_stride; srcV_tmp = srcV = srcV_tmp + uv_stride; } else { srcU = srcU_tmp; srcV = srcV_tmp; } } } } static void gst_alpha_set_planar_yuv_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); const guint8 *srcY, *srcY_tmp; const guint8 *srcU, *srcU_tmp; const guint8 *srcV, *srcV_tmp; gint i, j; gint y_stride, uv_stride; gint v_subs, h_subs; gint matrix[12]; gint a, y, u, v; gint r, g, b; gint p[4]; p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); srcY_tmp = srcY = src; srcU_tmp = srcU = src + gst_video_format_get_component_offset (alpha->in_format, 1, width, height); srcV_tmp = srcV = src + gst_video_format_get_component_offset (alpha->in_format, 2, width, height); switch (alpha->in_format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: v_subs = h_subs = 2; break; case GST_VIDEO_FORMAT_Y444: v_subs = h_subs = 1; break; case GST_VIDEO_FORMAT_Y42B: v_subs = 1; h_subs = 2; break; case GST_VIDEO_FORMAT_Y41B: v_subs = 1; h_subs = 4; break; default: g_assert_not_reached (); return; } memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = b_alpha; y = srcY[0]; u = srcU[0]; v = srcV[0]; dest[p[0]] = a; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); dest += 4; srcY++; if ((j + 1) % h_subs == 0) { srcU++; srcV++; } } srcY_tmp = srcY = srcY_tmp + y_stride; if ((i + 1) % v_subs == 0) { srcU_tmp = srcU = srcU_tmp + uv_stride; srcV_tmp = srcV = srcV_tmp + uv_stride; } else { srcU = srcU_tmp; srcV = srcV_tmp; } } } static void gst_alpha_chroma_key_planar_yuv_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint b_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); const guint8 *srcY, *srcY_tmp; const guint8 *srcU, *srcU_tmp; const guint8 *srcV, *srcV_tmp; gint i, j; gint a, y, u, v; gint r, g, b; gint y_stride, uv_stride; gint v_subs, h_subs; gint smin = 128 - alpha->black_sensitivity; gint smax = 128 + alpha->white_sensitivity; gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint matrix[12]; gint p[4]; p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); y_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); uv_stride = gst_video_format_get_row_stride (alpha->in_format, 1, width); srcY_tmp = srcY = src; srcU_tmp = srcU = src + gst_video_format_get_component_offset (alpha->in_format, 1, width, height); srcV_tmp = srcV = src + gst_video_format_get_component_offset (alpha->in_format, 2, width, height); switch (alpha->in_format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: v_subs = h_subs = 2; break; case GST_VIDEO_FORMAT_Y444: v_subs = h_subs = 1; break; case GST_VIDEO_FORMAT_Y42B: v_subs = 1; h_subs = 2; break; case GST_VIDEO_FORMAT_Y41B: v_subs = 1; h_subs = 4; break; default: g_assert_not_reached (); return; } memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { a = b_alpha; y = srcY[0]; u = srcU[0] - 128; v = srcV[0] - 128; a = chroma_keying_yuv (a, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; dest[p[0]] = a; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); dest += 4; srcY++; if ((j + 1) % h_subs == 0) { srcU++; srcV++; } } srcY_tmp = srcY = srcY_tmp + y_stride; if ((i + 1) % v_subs == 0) { srcU_tmp = srcU = srcU_tmp + uv_stride; srcV_tmp = srcV = srcV_tmp + uv_stride; } else { srcU = srcU_tmp; srcV = srcV_tmp; } } } static void gst_alpha_set_packed_422_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint i, j; gint y, u, v; gint p[4]; /* Y U Y V */ gint src_stride; const guint8 *src_tmp; src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); p[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); p[2] = p[0] + 2; p[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); if (alpha->in_sdtv != alpha->out_sdtv) { gint matrix[12]; memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit : cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < height; i++) { src_tmp = src; for (j = 0; j < width - 1; j += 2) { dest[0] = s_alpha; dest[4] = s_alpha; y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]); v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]); dest[1] = y; dest[2] = u; dest[3] = v; y = APPLY_MATRIX (matrix, 0, src[p[2]], src[p[1]], src[p[3]]); u = APPLY_MATRIX (matrix, 1, src[p[2]], src[p[1]], src[p[3]]); v = APPLY_MATRIX (matrix, 2, src[p[2]], src[p[1]], src[p[3]]); dest[5] = y; dest[6] = u; dest[7] = v; dest += 8; src += 4; } if (j == width - 1) { dest[0] = s_alpha; y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]); v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]); dest[1] = y; dest[2] = u; dest[3] = v; dest += 4; } src = src_tmp + src_stride; } } else { for (i = 0; i < height; i++) { src_tmp = src; for (j = 0; j < width - 1; j += 2) { dest[0] = s_alpha; dest[4] = s_alpha; y = src[p[0]]; u = src[p[1]]; v = src[p[3]];; dest[1] = y; dest[2] = u; dest[3] = v; y = src[p[2]]; dest[5] = y; dest[6] = u; dest[7] = v; dest += 8; src += 4; } if (j == width - 1) { dest[0] = s_alpha; y = src[p[0]]; u = src[p[1]]; v = src[p[3]];; dest[1] = y; dest[2] = u; dest[3] = v; dest += 4; } src = src_tmp + src_stride; } } } static void gst_alpha_chroma_key_packed_422_ayuv (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint p[4]; /* Y U Y V */ gint src_stride; const guint8 *src_tmp; src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); p[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); p[2] = p[0] + 2; p[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; if (alpha->in_sdtv != alpha->out_sdtv) { gint matrix[12]; memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit : cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < height; i++) { src_tmp = src; for (j = 0; j < width - 1; j += 2) { y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]) - 128; v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]) - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[0] = a; dest[1] = y; dest[2] = u + 128; dest[3] = v + 128; y = APPLY_MATRIX (matrix, 0, src[p[2]], src[p[1]], src[p[3]]); u = APPLY_MATRIX (matrix, 1, src[p[2]], src[p[1]], src[p[3]]) - 128; v = APPLY_MATRIX (matrix, 2, src[p[2]], src[p[1]], src[p[3]]) - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[4] = a; dest[5] = y; dest[6] = u + 128; dest[7] = v + 128; dest += 8; src += 4; } if (j == width - 1) { y = APPLY_MATRIX (matrix, 0, src[p[0]], src[p[1]], src[p[3]]); u = APPLY_MATRIX (matrix, 1, src[p[0]], src[p[1]], src[p[3]]) - 128; v = APPLY_MATRIX (matrix, 2, src[p[0]], src[p[1]], src[p[3]]) - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[0] = a; dest[1] = y; dest[2] = u + 128; dest[3] = v + 128; dest += 4; } src = src_tmp + src_stride; } } else { for (i = 0; i < height; i++) { src_tmp = src; for (j = 0; j < width - 1; j += 2) { y = src[p[0]]; u = src[p[1]] - 128; v = src[p[3]] - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[0] = a; dest[1] = y; dest[2] = u + 128; dest[3] = v + 128; y = src[p[2]]; u = src[p[1]] - 128; v = src[p[3]] - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[4] = a; dest[5] = y; dest[6] = u + 128; dest[7] = v + 128; dest += 8; src += 4; } if (j == width - 1) { y = src[p[0]]; u = src[p[1]] - 128; v = src[p[3]] - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); dest[0] = a; dest[1] = y; dest[2] = u + 128; dest[3] = v + 128; dest += 4; } src = src_tmp + src_stride; } } } static void gst_alpha_set_packed_422_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint s_alpha = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint i, j; gint p[4], o[4]; gint src_stride; const guint8 *src_tmp; gint matrix[12]; gint r, g, b; src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); o[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[2] = o[0] + 2; o[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); for (i = 0; i < height; i++) { src_tmp = src; for (j = 0; j < width - 1; j += 2) { r = APPLY_MATRIX (matrix, 0, src[o[0]], src[o[1]], src[o[3]]); g = APPLY_MATRIX (matrix, 1, src[o[0]], src[o[1]], src[o[3]]); b = APPLY_MATRIX (matrix, 2, src[o[0]], src[o[1]], src[o[3]]); dest[p[0]] = s_alpha; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); r = APPLY_MATRIX (matrix, 0, src[o[2]], src[o[1]], src[o[3]]); g = APPLY_MATRIX (matrix, 1, src[o[2]], src[o[1]], src[o[3]]); b = APPLY_MATRIX (matrix, 2, src[o[2]], src[o[1]], src[o[3]]); dest[4 + p[0]] = s_alpha; dest[4 + p[1]] = CLAMP (r, 0, 255); dest[4 + p[2]] = CLAMP (g, 0, 255); dest[4 + p[3]] = CLAMP (b, 0, 255); dest += 8; src += 4; } if (j == width - 1) { r = APPLY_MATRIX (matrix, 0, src[o[0]], src[o[1]], src[o[3]]); g = APPLY_MATRIX (matrix, 1, src[o[0]], src[o[1]], src[o[3]]); b = APPLY_MATRIX (matrix, 2, src[o[0]], src[o[1]], src[o[3]]); dest[p[0]] = s_alpha; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); dest += 4; } src = src_tmp + src_stride; } } static void gst_alpha_chroma_key_packed_422_argb (const guint8 * src, guint8 * dest, gint width, gint height, GstAlpha * alpha) { gint i, j; gint a, y, u, v; gint r, g, b; gint smin, smax; gint pa = CLAMP ((gint) (alpha->alpha * 255), 0, 255); gint8 cb = alpha->cb, cr = alpha->cr; gint8 kg = alpha->kg; guint8 accept_angle_tg = alpha->accept_angle_tg; guint8 accept_angle_ctg = alpha->accept_angle_ctg; guint8 one_over_kc = alpha->one_over_kc; guint8 kfgy_scale = alpha->kfgy_scale; guint noise_level2 = alpha->noise_level2; gint p[4], o[4]; gint src_stride; const guint8 *src_tmp; gint matrix[12]; src_stride = gst_video_format_get_row_stride (alpha->in_format, 0, width); o[0] = gst_video_format_get_component_offset (alpha->in_format, 0, width, height); o[2] = o[0] + 2; o[1] = gst_video_format_get_component_offset (alpha->in_format, 1, width, height); o[3] = gst_video_format_get_component_offset (alpha->in_format, 2, width, height); p[0] = gst_video_format_get_component_offset (alpha->out_format, 3, width, height); p[1] = gst_video_format_get_component_offset (alpha->out_format, 0, width, height); p[2] = gst_video_format_get_component_offset (alpha->out_format, 1, width, height); p[3] = gst_video_format_get_component_offset (alpha->out_format, 2, width, height); memcpy (matrix, alpha->in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); smin = 128 - alpha->black_sensitivity; smax = 128 + alpha->white_sensitivity; for (i = 0; i < height; i++) { src_tmp = src; for (j = 0; j < width - 1; j += 2) { y = src[o[0]]; u = src[o[1]] - 128; v = src[o[3]] - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[p[0]] = a; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); y = src[o[2]]; u = src[o[1]] - 128; v = src[o[3]] - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[4 + p[0]] = a; dest[4 + p[1]] = CLAMP (r, 0, 255); dest[4 + p[2]] = CLAMP (g, 0, 255); dest[4 + p[3]] = CLAMP (b, 0, 255); dest += 8; src += 4; } if (j == width - 1) { y = src[o[0]]; u = src[o[1]] - 128; v = src[o[3]] - 128; a = chroma_keying_yuv (pa, &y, &u, &v, cr, cb, smin, smax, accept_angle_tg, accept_angle_ctg, one_over_kc, kfgy_scale, kg, noise_level2); u += 128; v += 128; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[p[0]] = a; dest[p[1]] = CLAMP (r, 0, 255); dest[p[2]] = CLAMP (g, 0, 255); dest[p[3]] = CLAMP (b, 0, 255); dest += 4; } src = src_tmp + src_stride; } } /* Protected with the alpha lock */ static void gst_alpha_init_params (GstAlpha * alpha) { gfloat kgl; gfloat tmp; gfloat tmp1, tmp2; gfloat y; const gint *matrix; /* RGB->RGB: convert to SDTV YUV, chroma keying, convert back * YUV->RGB: chroma keying, convert to RGB * RGB->YUV: convert to YUV, chroma keying * YUV->YUV: convert matrix, chroma keying */ if (gst_video_format_is_rgb (alpha->in_format) && gst_video_format_is_rgb (alpha->out_format)) matrix = cog_rgb_to_ycbcr_matrix_8bit_sdtv; else if (gst_video_format_is_yuv (alpha->in_format) && gst_video_format_is_rgb (alpha->out_format)) matrix = (alpha->in_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; else if (gst_video_format_is_rgb (alpha->in_format) && gst_video_format_is_yuv (alpha->out_format)) matrix = (alpha->out_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; else /* yuv -> yuv */ matrix = (alpha->out_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv; y = (matrix[0] * ((gint) alpha->target_r) + matrix[1] * ((gint) alpha->target_g) + matrix[2] * ((gint) alpha->target_b) + matrix[3]) >> 8; /* Cb,Cr without offset here because the chroma keying * works with them being in range [-128,127] */ tmp1 = (matrix[4] * ((gint) alpha->target_r) + matrix[5] * ((gint) alpha->target_g) + matrix[6] * ((gint) alpha->target_b)) >> 8; tmp2 = (matrix[8] * ((gint) alpha->target_r) + matrix[9] * ((gint) alpha->target_g) + matrix[10] * ((gint) alpha->target_b)) >> 8; kgl = sqrt (tmp1 * tmp1 + tmp2 * tmp2); alpha->cb = 127 * (tmp1 / kgl); alpha->cr = 127 * (tmp2 / kgl); tmp = 15 * tan (M_PI * alpha->angle / 180); tmp = MIN (tmp, 255); alpha->accept_angle_tg = tmp; tmp = 15 / tan (M_PI * alpha->angle / 180); tmp = MIN (tmp, 255); alpha->accept_angle_ctg = tmp; tmp = 1 / (kgl); alpha->one_over_kc = 255 * 2 * tmp - 255; tmp = 15 * y / kgl; tmp = MIN (tmp, 255); alpha->kfgy_scale = tmp; alpha->kg = MIN (kgl, 127); alpha->noise_level2 = alpha->noise_level * alpha->noise_level; } /* Protected with the alpha lock */ static gboolean gst_alpha_set_process_function (GstAlpha * alpha) { alpha->process = NULL; switch (alpha->method) { case ALPHA_METHOD_SET: switch (alpha->out_format) { case GST_VIDEO_FORMAT_AYUV: switch (alpha->in_format) { case GST_VIDEO_FORMAT_AYUV: alpha->process = gst_alpha_set_ayuv_ayuv; break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: alpha->process = gst_alpha_set_planar_yuv_ayuv; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: alpha->process = gst_alpha_set_packed_422_ayuv; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: alpha->process = gst_alpha_set_argb_ayuv; break; case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: alpha->process = gst_alpha_set_rgb_ayuv; break; default: break; } break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: switch (alpha->in_format) { case GST_VIDEO_FORMAT_AYUV: alpha->process = gst_alpha_set_ayuv_argb; break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: alpha->process = gst_alpha_set_planar_yuv_argb; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: alpha->process = gst_alpha_set_packed_422_argb; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: alpha->process = gst_alpha_set_argb_argb; break; case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: alpha->process = gst_alpha_set_rgb_argb; break; default: break; } break; break; default: break; } break; case ALPHA_METHOD_GREEN: case ALPHA_METHOD_BLUE: case ALPHA_METHOD_CUSTOM: switch (alpha->out_format) { case GST_VIDEO_FORMAT_AYUV: switch (alpha->in_format) { case GST_VIDEO_FORMAT_AYUV: alpha->process = gst_alpha_chroma_key_ayuv_ayuv; break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: alpha->process = gst_alpha_chroma_key_planar_yuv_ayuv; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: alpha->process = gst_alpha_chroma_key_packed_422_ayuv; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: alpha->process = gst_alpha_chroma_key_argb_ayuv; break; case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: alpha->process = gst_alpha_chroma_key_rgb_ayuv; break; default: break; } break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: switch (alpha->in_format) { case GST_VIDEO_FORMAT_AYUV: alpha->process = gst_alpha_chroma_key_ayuv_argb; break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: alpha->process = gst_alpha_chroma_key_planar_yuv_argb; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: alpha->process = gst_alpha_chroma_key_packed_422_argb; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: alpha->process = gst_alpha_chroma_key_argb_argb; break; case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: alpha->process = gst_alpha_chroma_key_rgb_argb; break; default: break; } break; break; default: break; } break; default: break; } return alpha->process != NULL; } static gboolean gst_alpha_start (GstBaseTransform * btrans) { GstAlpha *alpha = GST_ALPHA (btrans); GST_ALPHA_LOCK (alpha); gst_alpha_init_params (alpha); GST_ALPHA_UNLOCK (alpha); return TRUE; } static void gst_alpha_before_transform (GstBaseTransform * btrans, GstBuffer * buf) { GstAlpha *alpha = GST_ALPHA (btrans); GstClockTime timestamp; timestamp = gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buf)); GST_LOG ("Got stream time of %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (timestamp)) gst_object_sync_values (G_OBJECT (alpha), timestamp); } static GstFlowReturn gst_alpha_transform (GstBaseTransform * btrans, GstBuffer * in, GstBuffer * out) { GstAlpha *alpha = GST_ALPHA (btrans); gint width, height; GST_ALPHA_LOCK (alpha); if (G_UNLIKELY (!alpha->process)) { GST_ERROR_OBJECT (alpha, "Not negotiated yet"); GST_ALPHA_UNLOCK (alpha); return GST_FLOW_NOT_NEGOTIATED; } width = alpha->width; height = alpha->height; alpha->process (GST_BUFFER_DATA (in), GST_BUFFER_DATA (out), width, height, alpha); GST_ALPHA_UNLOCK (alpha); return GST_FLOW_OK; } static gboolean plugin_init (GstPlugin * plugin) { gst_controller_init (NULL, NULL); return gst_element_register (plugin, "alpha", GST_RANK_NONE, GST_TYPE_ALPHA); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "alpha", "adds an alpha channel to video - constant or via chroma-keying", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/audioparsers/0000755000175000017500000000000011720565301015355 500000000000000gst-plugins-good-0.10.31/gst/audioparsers/gstdcaparse.h0000644000175000017500000000417711671175353017770 00000000000000/* GStreamer DCA parser * Copyright (C) 2010 Tim-Philipp Müller * * 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_DCA_PARSE_H__ #define __GST_DCA_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_DCA_PARSE \ (gst_dca_parse_get_type()) #define GST_DCA_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DCA_PARSE, GstDcaParse)) #define GST_DCA_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DCA_PARSE, GstDcaParseClass)) #define GST_IS_DCA_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DCA_PARSE)) #define GST_IS_DCA_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DCA_PARSE)) #define DCA_MIN_FRAMESIZE 96 #define DCA_MAX_FRAMESIZE 18725 /* 16384*16/14 */ typedef struct _GstDcaParse GstDcaParse; typedef struct _GstDcaParseClass GstDcaParseClass; /** * GstDcaParse: * * The opaque GstDcaParse object */ struct _GstDcaParse { GstBaseParse baseparse; /*< private >*/ gint rate; gint channels; gint depth; gint endianness; gint block_size; gint frame_size; guint32 last_sync; }; /** * GstDcaParseClass: * @parent_class: Element parent class. * * The opaque GstDcaParseClass data structure. */ struct _GstDcaParseClass { GstBaseParseClass baseparse_class; }; GType gst_dca_parse_get_type (void); G_END_DECLS #endif /* __GST_DCA_PARSE_H__ */ gst-plugins-good-0.10.31/gst/audioparsers/gstmpegaudioparse.h0000644000175000017500000000637311671175353021213 00000000000000/* GStreamer MPEG audio parser * Copyright (C) 2006-2007 Jan Schmidt * Copyright (C) 2010 Mark Nauwelaerts * Copyright (C) 2010 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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_MPEG_AUDIO_PARSE_H__ #define __GST_MPEG_AUDIO_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_MPEG_AUDIO_PARSE \ (gst_mpeg_audio_parse_get_type()) #define GST_MPEG_AUDIO_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_MPEG_AUDIO_PARSE, GstMpegAudioParse)) #define GST_MPEG_AUDIO_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MPEG_AUDIO_PARSE, GstMpegAudioParseClass)) #define GST_IS_MPEG_AUDIO_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_MPEG_AUDIO_PARSE)) #define GST_IS_MPEG_AUDIO_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MPEG_AUDIO_PARSE)) typedef struct _GstMpegAudioParse GstMpegAudioParse; typedef struct _GstMpegAudioParseClass GstMpegAudioParseClass; /** * GstMpegAudioParse: * * The opaque GstMpegAudioParse object */ struct _GstMpegAudioParse { GstBaseParse baseparse; /*< private >*/ gint rate; gint channels; gint layer; gint version; GstClockTime max_bitreservoir; /* samples per frame */ gint spf; gboolean sent_codec_tag; guint last_posted_bitrate; gint last_posted_crc, last_crc; guint last_posted_channel_mode, last_mode; /* Bitrate from non-vbr headers */ guint32 hdr_bitrate; /* Xing info */ guint32 xing_flags; guint32 xing_frames; GstClockTime xing_total_time; guint32 xing_bytes; /* percent -> filepos mapping */ guchar xing_seek_table[100]; /* filepos -> percent mapping */ guint16 xing_seek_table_inverse[256]; guint32 xing_vbr_scale; guint xing_bitrate; /* VBRI info */ guint32 vbri_frames; GstClockTime vbri_total_time; guint32 vbri_bytes; guint vbri_bitrate; guint vbri_seek_points; guint32 *vbri_seek_table; gboolean vbri_valid; /* LAME info */ guint32 encoder_delay; guint32 encoder_padding; }; /** * GstMpegAudioParseClass: * @parent_class: Element parent class. * * The opaque GstMpegAudioParseClass data structure. */ struct _GstMpegAudioParseClass { GstBaseParseClass baseparse_class; }; GType gst_mpeg_audio_parse_get_type (void); G_END_DECLS #endif /* __GST_MPEG_AUDIO_PARSE_H__ */ gst-plugins-good-0.10.31/gst/audioparsers/gstmpegaudioparse.c0000644000175000017500000012106511717520062021172 00000000000000/* GStreamer MPEG audio parser * Copyright (C) 2006-2007 Jan Schmidt * Copyright (C) 2010 Mark Nauwelaerts * Copyright (C) 2010 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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-mpegaudioparse * @short_description: MPEG audio parser * @see_also: #GstAmrParse, #GstAACParse * * Parses and frames mpeg1 audio streams. Provides seeking. * * * Example launch line * |[ * gst-launch filesrc location=test.mp3 ! mpegaudioparse ! mad ! autoaudiosink * ]| * */ /* FIXME: we should make the base class (GstBaseParse) aware of the * XING seek table somehow, so it can use it properly for things like * accurate seeks. Currently it can only do a lookup via the convert function, * but then doesn't know what the result represents exactly. One could either * add a vfunc for index lookup, or just make mpegaudioparse populate the * base class's index via the API provided. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstmpegaudioparse.h" #include GST_DEBUG_CATEGORY_STATIC (mpeg_audio_parse_debug); #define GST_CAT_DEFAULT mpeg_audio_parse_debug #define MPEG_AUDIO_CHANNEL_MODE_UNKNOWN -1 #define MPEG_AUDIO_CHANNEL_MODE_STEREO 0 #define MPEG_AUDIO_CHANNEL_MODE_JOINT_STEREO 1 #define MPEG_AUDIO_CHANNEL_MODE_DUAL_CHANNEL 2 #define MPEG_AUDIO_CHANNEL_MODE_MONO 3 #define CRC_UNKNOWN -1 #define CRC_PROTECTED 0 #define CRC_NOT_PROTECTED 1 #define XING_FRAMES_FLAG 0x0001 #define XING_BYTES_FLAG 0x0002 #define XING_TOC_FLAG 0x0004 #define XING_VBR_SCALE_FLAG 0x0008 #define MIN_FRAME_SIZE 6 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ], " "mpegaudioversion = (int) [ 1, 3], " "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ], " "parsed=(boolean) true") ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) 1") ); static void gst_mpeg_audio_parse_finalize (GObject * object); static gboolean gst_mpeg_audio_parse_start (GstBaseParse * parse); static gboolean gst_mpeg_audio_parse_stop (GstBaseParse * parse); static gboolean gst_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * size, gint * skipsize); static GstFlowReturn gst_mpeg_audio_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static GstFlowReturn gst_mpeg_audio_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static gboolean gst_mpeg_audio_parse_convert (GstBaseParse * parse, GstFormat src_format, gint64 src_value, GstFormat dest_format, gint64 * dest_value); static GstCaps *gst_mpeg_audio_parse_get_sink_caps (GstBaseParse * parse); GST_BOILERPLATE (GstMpegAudioParse, gst_mpeg_audio_parse, GstBaseParse, GST_TYPE_BASE_PARSE); #define GST_TYPE_MPEG_AUDIO_CHANNEL_MODE \ (gst_mpeg_audio_channel_mode_get_type()) static const GEnumValue mpeg_audio_channel_mode[] = { {MPEG_AUDIO_CHANNEL_MODE_UNKNOWN, "Unknown", "unknown"}, {MPEG_AUDIO_CHANNEL_MODE_MONO, "Mono", "mono"}, {MPEG_AUDIO_CHANNEL_MODE_DUAL_CHANNEL, "Dual Channel", "dual-channel"}, {MPEG_AUDIO_CHANNEL_MODE_JOINT_STEREO, "Joint Stereo", "joint-stereo"}, {MPEG_AUDIO_CHANNEL_MODE_STEREO, "Stereo", "stereo"}, {0, NULL, NULL}, }; static GType gst_mpeg_audio_channel_mode_get_type (void) { static GType mpeg_audio_channel_mode_type = 0; if (!mpeg_audio_channel_mode_type) { mpeg_audio_channel_mode_type = g_enum_register_static ("GstMpegAudioChannelMode", mpeg_audio_channel_mode); } return mpeg_audio_channel_mode_type; } static const gchar * gst_mpeg_audio_channel_mode_get_nick (gint mode) { guint i; for (i = 0; i < G_N_ELEMENTS (mpeg_audio_channel_mode); i++) { if (mpeg_audio_channel_mode[i].value == mode) return mpeg_audio_channel_mode[i].value_nick; } return NULL; } static void gst_mpeg_audio_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "MPEG1 Audio Parser", "Codec/Parser/Audio", "Parses and frames mpeg1 audio streams (levels 1-3), provides seek", "Jan Schmidt ," "Mark Nauwelaerts "); } static void gst_mpeg_audio_parse_class_init (GstMpegAudioParseClass * klass) { GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (mpeg_audio_parse_debug, "mpegaudioparse", 0, "MPEG1 audio stream parser"); object_class->finalize = gst_mpeg_audio_parse_finalize; parse_class->start = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_stop); parse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_check_valid_frame); parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_parse_frame); parse_class->pre_push_frame = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_pre_push_frame); parse_class->convert = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_convert); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_mpeg_audio_parse_get_sink_caps); /* register tags */ #define GST_TAG_CRC "has-crc" #define GST_TAG_MODE "channel-mode" gst_tag_register (GST_TAG_CRC, GST_TAG_FLAG_META, G_TYPE_BOOLEAN, "has crc", "Using CRC", NULL); gst_tag_register (GST_TAG_MODE, GST_TAG_FLAG_ENCODED, G_TYPE_STRING, "channel mode", "MPEG audio channel mode", NULL); g_type_class_ref (GST_TYPE_MPEG_AUDIO_CHANNEL_MODE); } static void gst_mpeg_audio_parse_reset (GstMpegAudioParse * mp3parse) { mp3parse->channels = -1; mp3parse->rate = -1; mp3parse->sent_codec_tag = FALSE; mp3parse->last_posted_crc = CRC_UNKNOWN; mp3parse->last_posted_channel_mode = MPEG_AUDIO_CHANNEL_MODE_UNKNOWN; mp3parse->hdr_bitrate = 0; mp3parse->xing_flags = 0; mp3parse->xing_bitrate = 0; mp3parse->xing_frames = 0; mp3parse->xing_total_time = 0; mp3parse->xing_bytes = 0; mp3parse->xing_vbr_scale = 0; memset (mp3parse->xing_seek_table, 0, 100); memset (mp3parse->xing_seek_table_inverse, 0, 256); mp3parse->vbri_bitrate = 0; mp3parse->vbri_frames = 0; mp3parse->vbri_total_time = 0; mp3parse->vbri_bytes = 0; mp3parse->vbri_seek_points = 0; g_free (mp3parse->vbri_seek_table); mp3parse->vbri_seek_table = NULL; mp3parse->encoder_delay = 0; mp3parse->encoder_padding = 0; } static void gst_mpeg_audio_parse_init (GstMpegAudioParse * mp3parse, GstMpegAudioParseClass * klass) { gst_mpeg_audio_parse_reset (mp3parse); } static void gst_mpeg_audio_parse_finalize (GObject * object) { G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_mpeg_audio_parse_start (GstBaseParse * parse) { GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); gst_base_parse_set_min_frame_size (GST_BASE_PARSE (mp3parse), MIN_FRAME_SIZE); GST_DEBUG_OBJECT (parse, "starting"); gst_mpeg_audio_parse_reset (mp3parse); return TRUE; } static gboolean gst_mpeg_audio_parse_stop (GstBaseParse * parse) { GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); GST_DEBUG_OBJECT (parse, "stopping"); gst_mpeg_audio_parse_reset (mp3parse); return TRUE; } static const guint mp3types_bitrates[2][3][16] = { { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} }, { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} }, }; static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, {22050, 24000, 16000}, {11025, 12000, 8000} }; static inline guint mp3_type_frame_length_from_header (GstMpegAudioParse * mp3parse, guint32 header, guint * put_version, guint * put_layer, guint * put_channels, guint * put_bitrate, guint * put_samplerate, guint * put_mode, guint * put_crc) { guint length; gulong mode, samplerate, bitrate, layer, channels, padding, crc; gulong version; gint lsf, mpg25; if (header & (1 << 20)) { lsf = (header & (1 << 19)) ? 0 : 1; mpg25 = 0; } else { lsf = 1; mpg25 = 1; } version = 1 + lsf + mpg25; layer = 4 - ((header >> 17) & 0x3); crc = (header >> 16) & 0x1; bitrate = (header >> 12) & 0xF; bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; /* The caller has ensured we have a valid header, so bitrate can't be zero here. */ g_assert (bitrate != 0); samplerate = (header >> 10) & 0x3; samplerate = mp3types_freqs[lsf + mpg25][samplerate]; padding = (header >> 9) & 0x1; mode = (header >> 6) & 0x3; channels = (mode == 3) ? 1 : 2; switch (layer) { case 1: length = 4 * ((bitrate * 12) / samplerate + padding); break; case 2: length = (bitrate * 144) / samplerate + padding; break; default: case 3: length = (bitrate * 144) / (samplerate << lsf) + padding; break; } GST_DEBUG_OBJECT (mp3parse, "Calculated mp3 frame length of %u bytes", length); GST_DEBUG_OBJECT (mp3parse, "samplerate = %lu, bitrate = %lu, version = %lu, " "layer = %lu, channels = %lu, mode = %s", samplerate, bitrate, version, layer, channels, gst_mpeg_audio_channel_mode_get_nick (mode)); if (put_version) *put_version = version; if (put_layer) *put_layer = layer; if (put_channels) *put_channels = channels; if (put_bitrate) *put_bitrate = bitrate; if (put_samplerate) *put_samplerate = samplerate; if (put_mode) *put_mode = mode; if (put_crc) *put_crc = crc; return length; } /* Minimum number of consecutive, valid-looking frames to consider * for resyncing */ #define MIN_RESYNC_FRAMES 3 /* Perform extended validation to check that subsequent headers match * the first header given here in important characteristics, to avoid * false sync. We look for a minimum of MIN_RESYNC_FRAMES consecutive * frames to match their major characteristics. * * If at_eos is set to TRUE, we just check that we don't find any invalid * frames in whatever data is available, rather than requiring a full * MIN_RESYNC_FRAMES of data. * * Returns TRUE if we've seen enough data to validate or reject the frame. * If TRUE is returned, then *valid contains TRUE if it validated, or false * if we decided it was false sync. * If FALSE is returned, then *valid contains minimum needed data. */ static gboolean gst_mp3parse_validate_extended (GstMpegAudioParse * mp3parse, GstBuffer * buf, guint32 header, int bpf, gboolean at_eos, gint * valid) { guint32 next_header; const guint8 *data; guint available; int frames_found = 1; int offset = bpf; available = GST_BUFFER_SIZE (buf); data = GST_BUFFER_DATA (buf); while (frames_found < MIN_RESYNC_FRAMES) { /* Check if we have enough data for all these frames, plus the next frame header. */ if (available < offset + 4) { if (at_eos) { /* Running out of data at EOS is fine; just accept it */ *valid = TRUE; return TRUE; } else { *valid = offset + 4; return FALSE; } } next_header = GST_READ_UINT32_BE (data + offset); GST_DEBUG_OBJECT (mp3parse, "At %d: header=%08X, header2=%08X, bpf=%d", offset, (unsigned int) header, (unsigned int) next_header, bpf); /* mask the bits which are allowed to differ between frames */ #define HDRMASK ~((0xF << 12) /* bitrate */ | \ (0x1 << 9) /* padding */ | \ (0xf << 4) /* mode|mode extension */ | \ (0xf)) /* copyright|emphasis */ if ((next_header & HDRMASK) != (header & HDRMASK)) { /* If any of the unmasked bits don't match, then it's not valid */ GST_DEBUG_OBJECT (mp3parse, "next header doesn't match " "(header=%08X (%08X), header2=%08X (%08X), bpf=%d)", (guint) header, (guint) header & HDRMASK, (guint) next_header, (guint) next_header & HDRMASK, bpf); *valid = FALSE; return TRUE; } else if ((((next_header >> 12) & 0xf) == 0) || (((next_header >> 12) & 0xf) == 0xf)) { /* The essential parts were the same, but the bitrate held an invalid value - also reject */ GST_DEBUG_OBJECT (mp3parse, "next header invalid (bitrate)"); *valid = FALSE; return TRUE; } bpf = mp3_type_frame_length_from_header (mp3parse, next_header, NULL, NULL, NULL, NULL, NULL, NULL, NULL); offset += bpf; frames_found++; } *valid = TRUE; return TRUE; } static gboolean gst_mpeg_audio_parse_head_check (GstMpegAudioParse * mp3parse, unsigned long head) { GST_DEBUG_OBJECT (mp3parse, "checking mp3 header 0x%08lx", head); /* if it's not a valid sync */ if ((head & 0xffe00000) != 0xffe00000) { GST_WARNING_OBJECT (mp3parse, "invalid sync"); return FALSE; } /* if it's an invalid MPEG version */ if (((head >> 19) & 3) == 0x1) { GST_WARNING_OBJECT (mp3parse, "invalid MPEG version: 0x%lx", (head >> 19) & 3); return FALSE; } /* if it's an invalid layer */ if (!((head >> 17) & 3)) { GST_WARNING_OBJECT (mp3parse, "invalid layer: 0x%lx", (head >> 17) & 3); return FALSE; } /* if it's an invalid bitrate */ if (((head >> 12) & 0xf) == 0x0) { GST_WARNING_OBJECT (mp3parse, "invalid bitrate: 0x%lx." "Free format files are not supported yet", (head >> 12) & 0xf); return FALSE; } if (((head >> 12) & 0xf) == 0xf) { GST_WARNING_OBJECT (mp3parse, "invalid bitrate: 0x%lx", (head >> 12) & 0xf); return FALSE; } /* if it's an invalid samplerate */ if (((head >> 10) & 0x3) == 0x3) { GST_WARNING_OBJECT (mp3parse, "invalid samplerate: 0x%lx", (head >> 10) & 0x3); return FALSE; } if ((head & 0x3) == 0x2) { /* Ignore this as there are some files with emphasis 0x2 that can * be played fine. See BGO #537235 */ GST_WARNING_OBJECT (mp3parse, "invalid emphasis: 0x%lx", head & 0x3); } return TRUE; } static gboolean gst_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); GstBuffer *buf = frame->buffer; GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buf); gint off, bpf; gboolean lost_sync, draining, valid, caps_change; guint32 header; guint bitrate, layer, rate, channels, version, mode, crc; if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 6)) return FALSE; off = gst_byte_reader_masked_scan_uint32 (&reader, 0xffe00000, 0xffe00000, 0, GST_BUFFER_SIZE (buf)); GST_LOG_OBJECT (parse, "possible sync at buffer offset %d", off); /* didn't find anything that looks like a sync word, skip */ if (off < 0) { *skipsize = GST_BUFFER_SIZE (buf) - 3; return FALSE; } /* possible frame header, but not at offset 0? skip bytes before sync */ if (off > 0) { *skipsize = off; return FALSE; } /* make sure the values in the frame header look sane */ header = GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)); if (!gst_mpeg_audio_parse_head_check (mp3parse, header)) { *skipsize = 1; return FALSE; } GST_LOG_OBJECT (parse, "got frame"); bpf = mp3_type_frame_length_from_header (mp3parse, header, &version, &layer, &channels, &bitrate, &rate, &mode, &crc); g_assert (bpf != 0); if (channels != mp3parse->channels || rate != mp3parse->rate || layer != mp3parse->layer || version != mp3parse->version) caps_change = TRUE; else caps_change = FALSE; lost_sync = GST_BASE_PARSE_LOST_SYNC (parse); draining = GST_BASE_PARSE_DRAINING (parse); if (!draining && (lost_sync || caps_change)) { if (!gst_mp3parse_validate_extended (mp3parse, buf, header, bpf, draining, &valid)) { /* not enough data */ gst_base_parse_set_min_frame_size (parse, valid); *skipsize = 0; return FALSE; } else { if (!valid) { *skipsize = off + 2; return FALSE; } } } else if (draining && lost_sync && caps_change && mp3parse->rate > 0) { /* avoid caps jitter that we can't be sure of */ *skipsize = off + 2; return FALSE; } /* restore default minimum */ gst_base_parse_set_min_frame_size (parse, MIN_FRAME_SIZE); *framesize = bpf; return TRUE; } static void gst_mpeg_audio_parse_handle_first_frame (GstMpegAudioParse * mp3parse, GstBuffer * buf) { const guint32 xing_id = 0x58696e67; /* 'Xing' in hex */ const guint32 info_id = 0x496e666f; /* 'Info' in hex - found in LAME CBR files */ const guint32 vbri_id = 0x56425249; /* 'VBRI' in hex */ const guint32 lame_id = 0x4c414d45; /* 'LAME' in hex */ gint offset_xing, offset_vbri; guint64 avail; gint64 upstream_total_bytes = 0; GstFormat fmt = GST_FORMAT_BYTES; guint32 read_id_xing = 0, read_id_vbri = 0; const guint8 *data; guint bitrate; if (mp3parse->sent_codec_tag) return; /* Check first frame for Xing info */ if (mp3parse->version == 1) { /* MPEG-1 file */ if (mp3parse->channels == 1) offset_xing = 0x11; else offset_xing = 0x20; } else { /* MPEG-2 header */ if (mp3parse->channels == 1) offset_xing = 0x09; else offset_xing = 0x11; } /* The VBRI tag is always at offset 0x20 */ offset_vbri = 0x20; /* Skip the 4 bytes of the MP3 header too */ offset_xing += 4; offset_vbri += 4; /* Check if we have enough data to read the Xing header */ avail = GST_BUFFER_SIZE (buf); data = GST_BUFFER_DATA (buf); if (avail >= offset_xing + 4) { read_id_xing = GST_READ_UINT32_BE (data + offset_xing); } if (avail >= offset_vbri + 4) { read_id_vbri = GST_READ_UINT32_BE (data + offset_vbri); } /* obtain real upstream total bytes */ fmt = GST_FORMAT_BYTES; if (!gst_pad_query_peer_duration (GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE (mp3parse)), &fmt, &upstream_total_bytes)) upstream_total_bytes = 0; if (read_id_xing == xing_id || read_id_xing == info_id) { guint32 xing_flags; guint bytes_needed = offset_xing + 8; gint64 total_bytes; GstClockTime total_time; GST_DEBUG_OBJECT (mp3parse, "Found Xing header marker 0x%x", xing_id); /* Move data after Xing header */ data += offset_xing + 4; /* Read 4 base bytes of flags, big-endian */ xing_flags = GST_READ_UINT32_BE (data); data += 4; if (xing_flags & XING_FRAMES_FLAG) bytes_needed += 4; if (xing_flags & XING_BYTES_FLAG) bytes_needed += 4; if (xing_flags & XING_TOC_FLAG) bytes_needed += 100; if (xing_flags & XING_VBR_SCALE_FLAG) bytes_needed += 4; if (avail < bytes_needed) { GST_DEBUG_OBJECT (mp3parse, "Not enough data to read Xing header (need %d)", bytes_needed); return; } GST_DEBUG_OBJECT (mp3parse, "Reading Xing header"); mp3parse->xing_flags = xing_flags; if (xing_flags & XING_FRAMES_FLAG) { mp3parse->xing_frames = GST_READ_UINT32_BE (data); if (mp3parse->xing_frames == 0) { GST_WARNING_OBJECT (mp3parse, "Invalid number of frames in Xing header"); mp3parse->xing_flags &= ~XING_FRAMES_FLAG; } else { mp3parse->xing_total_time = gst_util_uint64_scale (GST_SECOND, (guint64) (mp3parse->xing_frames) * (mp3parse->spf), mp3parse->rate); } data += 4; } else { mp3parse->xing_frames = 0; mp3parse->xing_total_time = 0; } if (xing_flags & XING_BYTES_FLAG) { mp3parse->xing_bytes = GST_READ_UINT32_BE (data); if (mp3parse->xing_bytes == 0) { GST_WARNING_OBJECT (mp3parse, "Invalid number of bytes in Xing header"); mp3parse->xing_flags &= ~XING_BYTES_FLAG; } data += 4; } else { mp3parse->xing_bytes = 0; } /* If we know the upstream size and duration, compute the * total bitrate, rounded up to the nearest kbit/sec */ if ((total_time = mp3parse->xing_total_time) && (total_bytes = mp3parse->xing_bytes)) { mp3parse->xing_bitrate = gst_util_uint64_scale (total_bytes, 8 * GST_SECOND, total_time); mp3parse->xing_bitrate += 500; mp3parse->xing_bitrate -= mp3parse->xing_bitrate % 1000; } if (xing_flags & XING_TOC_FLAG) { int i, percent = 0; guchar *table = mp3parse->xing_seek_table; guchar old = 0, new; guint first; first = data[0]; GST_DEBUG_OBJECT (mp3parse, "Subtracting initial offset of %d bytes from Xing TOC", first); /* xing seek table: percent time -> 1/256 bytepos */ for (i = 0; i < 100; i++) { new = data[i] - first; if (old > new) { GST_WARNING_OBJECT (mp3parse, "Skipping broken Xing TOC"); mp3parse->xing_flags &= ~XING_TOC_FLAG; goto skip_toc; } mp3parse->xing_seek_table[i] = old = new; } /* build inverse table: 1/256 bytepos -> 1/100 percent time */ for (i = 0; i < 256; i++) { while (percent < 99 && table[percent + 1] <= i) percent++; if (table[percent] == i) { mp3parse->xing_seek_table_inverse[i] = percent * 100; } else if (table[percent] < i && percent < 99) { gdouble fa, fb, fx; gint a = percent, b = percent + 1; fa = table[a]; fb = table[b]; fx = (b - a) / (fb - fa) * (i - fa) + a; mp3parse->xing_seek_table_inverse[i] = (guint16) (fx * 100); } else if (percent == 99) { gdouble fa, fb, fx; gint a = percent, b = 100; fa = table[a]; fb = 256.0; fx = (b - a) / (fb - fa) * (i - fa) + a; mp3parse->xing_seek_table_inverse[i] = (guint16) (fx * 100); } } skip_toc: data += 100; } else { memset (mp3parse->xing_seek_table, 0, 100); memset (mp3parse->xing_seek_table_inverse, 0, 256); } if (xing_flags & XING_VBR_SCALE_FLAG) { mp3parse->xing_vbr_scale = GST_READ_UINT32_BE (data); data += 4; } else mp3parse->xing_vbr_scale = 0; GST_DEBUG_OBJECT (mp3parse, "Xing header reported %u frames, time %" GST_TIME_FORMAT ", %u bytes, vbr scale %u", mp3parse->xing_frames, GST_TIME_ARGS (mp3parse->xing_total_time), mp3parse->xing_bytes, mp3parse->xing_vbr_scale); /* check for truncated file */ if (upstream_total_bytes && mp3parse->xing_bytes && mp3parse->xing_bytes * 0.8 > upstream_total_bytes) { GST_WARNING_OBJECT (mp3parse, "File appears to have been truncated; " "invalidating Xing header duration and size"); mp3parse->xing_flags &= ~XING_BYTES_FLAG; mp3parse->xing_flags &= ~XING_FRAMES_FLAG; } /* Optional LAME tag? */ if (avail - bytes_needed >= 36 && GST_READ_UINT32_BE (data) == lame_id) { gchar lame_version[10] = { 0, }; guint tag_rev; guint32 encoder_delay, encoder_padding; memcpy (lame_version, data, 9); data += 9; tag_rev = data[0] >> 4; GST_DEBUG_OBJECT (mp3parse, "Found LAME tag revision %d created by '%s'", tag_rev, lame_version); /* Skip all the information we're not interested in */ data += 12; /* Encoder delay and end padding */ encoder_delay = GST_READ_UINT24_BE (data); encoder_delay >>= 12; encoder_padding = GST_READ_UINT24_BE (data); encoder_padding &= 0x000fff; mp3parse->encoder_delay = encoder_delay; mp3parse->encoder_padding = encoder_padding; GST_DEBUG_OBJECT (mp3parse, "Encoder delay %u, encoder padding %u", encoder_delay, encoder_padding); } } if (read_id_vbri == vbri_id) { gint64 total_bytes, total_frames; GstClockTime total_time; guint16 nseek_points; GST_DEBUG_OBJECT (mp3parse, "Found VBRI header marker 0x%x", vbri_id); if (avail < offset_vbri + 26) { GST_DEBUG_OBJECT (mp3parse, "Not enough data to read VBRI header (need %d)", offset_vbri + 26); return; } GST_DEBUG_OBJECT (mp3parse, "Reading VBRI header"); /* Move data after VBRI header */ data += offset_vbri + 4; if (GST_READ_UINT16_BE (data) != 0x0001) { GST_WARNING_OBJECT (mp3parse, "Unsupported VBRI version 0x%x", GST_READ_UINT16_BE (data)); return; } data += 2; /* Skip encoder delay */ data += 2; /* Skip quality */ data += 2; total_bytes = GST_READ_UINT32_BE (data); if (total_bytes != 0) mp3parse->vbri_bytes = total_bytes; data += 4; total_frames = GST_READ_UINT32_BE (data); if (total_frames != 0) { mp3parse->vbri_frames = total_frames; mp3parse->vbri_total_time = gst_util_uint64_scale (GST_SECOND, (guint64) (mp3parse->vbri_frames) * (mp3parse->spf), mp3parse->rate); } data += 4; /* If we know the upstream size and duration, compute the * total bitrate, rounded up to the nearest kbit/sec */ if ((total_time = mp3parse->vbri_total_time) && (total_bytes = mp3parse->vbri_bytes)) { mp3parse->vbri_bitrate = gst_util_uint64_scale (total_bytes, 8 * GST_SECOND, total_time); mp3parse->vbri_bitrate += 500; mp3parse->vbri_bitrate -= mp3parse->vbri_bitrate % 1000; } nseek_points = GST_READ_UINT16_BE (data); data += 2; if (nseek_points > 0) { guint scale, seek_bytes, seek_frames; gint i; mp3parse->vbri_seek_points = nseek_points; scale = GST_READ_UINT16_BE (data); data += 2; seek_bytes = GST_READ_UINT16_BE (data); data += 2; seek_frames = GST_READ_UINT16_BE (data); if (scale == 0 || seek_bytes == 0 || seek_bytes > 4 || seek_frames == 0) { GST_WARNING_OBJECT (mp3parse, "Unsupported VBRI seek table"); goto out_vbri; } if (avail < offset_vbri + 26 + nseek_points * seek_bytes) { GST_WARNING_OBJECT (mp3parse, "Not enough data to read VBRI seek table (need %d)", offset_vbri + 26 + nseek_points * seek_bytes); goto out_vbri; } if (seek_frames * nseek_points < total_frames - seek_frames || seek_frames * nseek_points > total_frames + seek_frames) { GST_WARNING_OBJECT (mp3parse, "VBRI seek table doesn't cover the complete file"); goto out_vbri; } if (avail < offset_vbri + 26) { GST_DEBUG_OBJECT (mp3parse, "Not enough data to read VBRI header (need %d)", offset_vbri + 26 + nseek_points * seek_bytes); return; } data = GST_BUFFER_DATA (buf); data += offset_vbri + 26; /* VBRI seek table: frame/seek_frames -> byte */ mp3parse->vbri_seek_table = g_new (guint32, nseek_points); if (seek_bytes == 4) for (i = 0; i < nseek_points; i++) { mp3parse->vbri_seek_table[i] = GST_READ_UINT32_BE (data) * scale; data += 4; } else if (seek_bytes == 3) for (i = 0; i < nseek_points; i++) { mp3parse->vbri_seek_table[i] = GST_READ_UINT24_BE (data) * scale; data += 3; } else if (seek_bytes == 2) for (i = 0; i < nseek_points; i++) { mp3parse->vbri_seek_table[i] = GST_READ_UINT16_BE (data) * scale; data += 2; } else /* seek_bytes == 1 */ for (i = 0; i < nseek_points; i++) { mp3parse->vbri_seek_table[i] = GST_READ_UINT8 (data) * scale; data += 1; } } out_vbri: GST_DEBUG_OBJECT (mp3parse, "VBRI header reported %u frames, time %" GST_TIME_FORMAT ", bytes %u", mp3parse->vbri_frames, GST_TIME_ARGS (mp3parse->vbri_total_time), mp3parse->vbri_bytes); /* check for truncated file */ if (upstream_total_bytes && mp3parse->vbri_bytes && mp3parse->vbri_bytes * 0.8 > upstream_total_bytes) { GST_WARNING_OBJECT (mp3parse, "File appears to have been truncated; " "invalidating VBRI header duration and size"); mp3parse->vbri_valid = FALSE; } else { mp3parse->vbri_valid = TRUE; } } else { GST_DEBUG_OBJECT (mp3parse, "Xing, LAME or VBRI header not found in first frame"); } /* set duration if tables provided a valid one */ if (mp3parse->xing_flags & XING_FRAMES_FLAG) { gst_base_parse_set_duration (GST_BASE_PARSE (mp3parse), GST_FORMAT_TIME, mp3parse->xing_total_time, 0); } if (mp3parse->vbri_total_time != 0 && mp3parse->vbri_valid) { gst_base_parse_set_duration (GST_BASE_PARSE (mp3parse), GST_FORMAT_TIME, mp3parse->vbri_total_time, 0); } /* tell baseclass how nicely we can seek, and a bitrate if one found */ /* FIXME: fill index with seek table */ #if 0 seekable = GST_BASE_PARSE_SEEK_DEFAULT; if ((mp3parse->xing_flags & XING_TOC_FLAG) && mp3parse->xing_bytes && mp3parse->xing_total_time) seekable = GST_BASE_PARSE_SEEK_TABLE; if (mp3parse->vbri_seek_table && mp3parse->vbri_bytes && mp3parse->vbri_total_time) seekable = GST_BASE_PARSE_SEEK_TABLE; #endif if (mp3parse->xing_bitrate) bitrate = mp3parse->xing_bitrate; else if (mp3parse->vbri_bitrate) bitrate = mp3parse->vbri_bitrate; else bitrate = 0; gst_base_parse_set_average_bitrate (GST_BASE_PARSE (mp3parse), bitrate); } static GstFlowReturn gst_mpeg_audio_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); GstBuffer *buf = frame->buffer; guint bitrate, layer, rate, channels, version, mode, crc; g_return_val_if_fail (GST_BUFFER_SIZE (buf) >= 4, GST_FLOW_ERROR); if (!mp3_type_frame_length_from_header (mp3parse, GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)), &version, &layer, &channels, &bitrate, &rate, &mode, &crc)) goto broken_header; if (G_UNLIKELY (channels != mp3parse->channels || rate != mp3parse->rate || layer != mp3parse->layer || version != mp3parse->version)) { GstCaps *caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "mpegaudioversion", G_TYPE_INT, version, "layer", G_TYPE_INT, layer, "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); gst_buffer_set_caps (buf, caps); gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); gst_caps_unref (caps); mp3parse->rate = rate; mp3parse->channels = channels; mp3parse->layer = layer; mp3parse->version = version; /* see http://www.codeproject.com/audio/MPEGAudioInfo.asp */ if (mp3parse->layer == 1) mp3parse->spf = 384; else if (mp3parse->layer == 2) mp3parse->spf = 1152; else if (mp3parse->version == 1) { mp3parse->spf = 1152; } else { /* MPEG-2 or "2.5" */ mp3parse->spf = 576; } /* lead_in: * We start pushing 9 frames earlier (29 frames for MPEG2) than * segment start to be able to decode the first frame we want. * 9 (29) frames are the theoretical maximum of frames that contain * data for the current frame (bit reservoir). * * lead_out: * Some mp3 streams have an offset in the timestamps, for which we have to * push the frame *after* the end position in order for the decoder to be * able to decode everything up until the segment.stop position. */ gst_base_parse_set_frame_rate (parse, mp3parse->rate, mp3parse->spf, (version == 1) ? 10 : 30, 2); } mp3parse->hdr_bitrate = bitrate; /* For first frame; check for seek tables and output a codec tag */ gst_mpeg_audio_parse_handle_first_frame (mp3parse, buf); /* store some frame info for later processing */ mp3parse->last_crc = crc; mp3parse->last_mode = mode; return GST_FLOW_OK; /* ERRORS */ broken_header: { /* this really shouldn't ever happen */ GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), (NULL)); return GST_FLOW_ERROR; } } static gboolean gst_mpeg_audio_parse_time_to_bytepos (GstMpegAudioParse * mp3parse, GstClockTime ts, gint64 * bytepos) { gint64 total_bytes; GstClockTime total_time; /* If XING seek table exists use this for time->byte conversion */ if ((mp3parse->xing_flags & XING_TOC_FLAG) && (total_bytes = mp3parse->xing_bytes) && (total_time = mp3parse->xing_total_time)) { gdouble fa, fb, fx; gdouble percent = CLAMP ((100.0 * gst_util_guint64_to_gdouble (ts)) / gst_util_guint64_to_gdouble (total_time), 0.0, 100.0); gint index = CLAMP (percent, 0, 99); fa = mp3parse->xing_seek_table[index]; if (index < 99) fb = mp3parse->xing_seek_table[index + 1]; else fb = 256.0; fx = fa + (fb - fa) * (percent - index); *bytepos = (1.0 / 256.0) * fx * total_bytes; return TRUE; } if (mp3parse->vbri_seek_table && (total_bytes = mp3parse->vbri_bytes) && (total_time = mp3parse->vbri_total_time)) { gint i, j; gdouble a, b, fa, fb; i = gst_util_uint64_scale (ts, mp3parse->vbri_seek_points - 1, total_time); i = CLAMP (i, 0, mp3parse->vbri_seek_points - 1); a = gst_guint64_to_gdouble (gst_util_uint64_scale (i, total_time, mp3parse->vbri_seek_points)); fa = 0.0; for (j = i; j >= 0; j--) fa += mp3parse->vbri_seek_table[j]; if (i + 1 < mp3parse->vbri_seek_points) { b = gst_guint64_to_gdouble (gst_util_uint64_scale (i + 1, total_time, mp3parse->vbri_seek_points)); fb = fa + mp3parse->vbri_seek_table[i + 1]; } else { b = gst_guint64_to_gdouble (total_time); fb = total_bytes; } *bytepos = fa + ((fb - fa) / (b - a)) * (gst_guint64_to_gdouble (ts) - a); return TRUE; } return FALSE; } static gboolean gst_mpeg_audio_parse_bytepos_to_time (GstMpegAudioParse * mp3parse, gint64 bytepos, GstClockTime * ts) { gint64 total_bytes; GstClockTime total_time; /* If XING seek table exists use this for byte->time conversion */ if ((mp3parse->xing_flags & XING_TOC_FLAG) && (total_bytes = mp3parse->xing_bytes) && (total_time = mp3parse->xing_total_time)) { gdouble fa, fb, fx; gdouble pos; gint index; pos = CLAMP ((bytepos * 256.0) / total_bytes, 0.0, 256.0); index = CLAMP (pos, 0, 255); fa = mp3parse->xing_seek_table_inverse[index]; if (index < 255) fb = mp3parse->xing_seek_table_inverse[index + 1]; else fb = 10000.0; fx = fa + (fb - fa) * (pos - index); *ts = (1.0 / 10000.0) * fx * gst_util_guint64_to_gdouble (total_time); return TRUE; } if (mp3parse->vbri_seek_table && (total_bytes = mp3parse->vbri_bytes) && (total_time = mp3parse->vbri_total_time)) { gint i = 0; guint64 sum = 0; gdouble a, b, fa, fb; do { sum += mp3parse->vbri_seek_table[i]; i++; } while (i + 1 < mp3parse->vbri_seek_points && sum + mp3parse->vbri_seek_table[i] < bytepos); i--; a = gst_guint64_to_gdouble (sum); fa = gst_guint64_to_gdouble (gst_util_uint64_scale (i, total_time, mp3parse->vbri_seek_points)); if (i + 1 < mp3parse->vbri_seek_points) { b = a + mp3parse->vbri_seek_table[i + 1]; fb = gst_guint64_to_gdouble (gst_util_uint64_scale (i + 1, total_time, mp3parse->vbri_seek_points)); } else { b = total_bytes; fb = gst_guint64_to_gdouble (total_time); } *ts = gst_gdouble_to_guint64 (fa + ((fb - fa) / (b - a)) * (bytepos - a)); return TRUE; } return FALSE; } static gboolean gst_mpeg_audio_parse_convert (GstBaseParse * parse, GstFormat src_format, gint64 src_value, GstFormat dest_format, gint64 * dest_value) { GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); gboolean res = FALSE; if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_BYTES) res = gst_mpeg_audio_parse_time_to_bytepos (mp3parse, src_value, dest_value); else if (src_format == GST_FORMAT_BYTES && dest_format == GST_FORMAT_TIME) res = gst_mpeg_audio_parse_bytepos_to_time (mp3parse, src_value, (GstClockTime *) dest_value); /* if no tables, fall back to default estimated rate based conversion */ if (!res) return gst_base_parse_convert_default (parse, src_format, src_value, dest_format, dest_value); return res; } static GstFlowReturn gst_mpeg_audio_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstMpegAudioParse *mp3parse = GST_MPEG_AUDIO_PARSE (parse); GstTagList *taglist; /* tag sending done late enough in hook to ensure pending events * have already been sent */ if (!mp3parse->sent_codec_tag) { gchar *codec; /* codec tag */ if (mp3parse->layer == 3) { codec = g_strdup_printf ("MPEG %d Audio, Layer %d (MP3)", mp3parse->version, mp3parse->layer); } else { codec = g_strdup_printf ("MPEG %d Audio, Layer %d", mp3parse->version, mp3parse->layer); } taglist = gst_tag_list_new (); gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, codec, NULL); if (mp3parse->hdr_bitrate > 0 && mp3parse->xing_bitrate == 0 && mp3parse->vbri_bitrate == 0) { /* We don't have a VBR bitrate, so post the available bitrate as * nominal and let baseparse calculate the real bitrate */ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_NOMINAL_BITRATE, mp3parse->hdr_bitrate, NULL); } gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse), GST_BASE_PARSE_SRC_PAD (mp3parse), taglist); g_free (codec); /* also signals the end of first-frame processing */ mp3parse->sent_codec_tag = TRUE; } /* we will create a taglist (if any of the parameters has changed) * to add the tags that changed */ taglist = NULL; if (mp3parse->last_posted_crc != mp3parse->last_crc) { gboolean using_crc; if (!taglist) { taglist = gst_tag_list_new (); } mp3parse->last_posted_crc = mp3parse->last_crc; if (mp3parse->last_posted_crc == CRC_PROTECTED) { using_crc = TRUE; } else { using_crc = FALSE; } gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_CRC, using_crc, NULL); } if (mp3parse->last_posted_channel_mode != mp3parse->last_mode) { if (!taglist) { taglist = gst_tag_list_new (); } mp3parse->last_posted_channel_mode = mp3parse->last_mode; gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_MODE, gst_mpeg_audio_channel_mode_get_nick (mp3parse->last_mode), NULL); } /* if the taglist exists, we need to send it */ if (taglist) { gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse), GST_BASE_PARSE_SRC_PAD (mp3parse), taglist); } /* usual clipping applies */ frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP; return GST_FLOW_OK; } static GstCaps * gst_mpeg_audio_parse_get_sink_caps (GstBaseParse * parse) { GstCaps *peercaps; GstCaps *res; peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; /* Remove the parsed field */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_remove_field (s, "parsed"); } res = gst_caps_intersect_full (peercaps, gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); } else { res = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse))); } return res; } gst-plugins-good-0.10.31/gst/audioparsers/Makefile.am0000644000175000017500000000121611671175353017342 00000000000000plugin_LTLIBRARIES = libgstaudioparsers.la libgstaudioparsers_la_SOURCES = \ gstaacparse.c gstamrparse.c gstac3parse.c \ gstdcaparse.c gstflacparse.c gstmpegaudioparse.c \ plugin.c libgstaudioparsers_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstaudioparsers_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) libgstaudioparsers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaudioparsers_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstaacparse.h gstamrparse.h gstac3parse.h \ gstdcaparse.h gstflacparse.h gstmpegaudioparse.h gst-plugins-good-0.10.31/gst/audioparsers/gstdcaparse.c0000644000175000017500000003604711677341655017772 00000000000000/* GStreamer DCA parser * Copyright (C) 2010 Tim-Philipp Müller * * 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-dcaparse * @short_description: DCA (DTS Coherent Acoustics) parser * @see_also: #GstAmrParse, #GstAACParse, #GstAc3Parse * * This is a DCA (DTS Coherent Acoustics) parser. * * * Example launch line * |[ * gst-launch filesrc location=abc.dts ! dcaparse ! dtsdec ! audioresample ! audioconvert ! autoaudiosink * ]| * */ /* TODO: * - should accept framed and unframed input (needs decodebin fixes first) * - seeking in raw .dts files doesn't seem to work, but duration estimate ok * * - if frames have 'odd' durations, the frame durations (plus timestamps) * aren't adjusted up occasionally to make up for rounding error gaps. * (e.g. if 512 samples per frame @ 48kHz = 10.666666667 ms/frame) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstdcaparse.h" #include #include GST_DEBUG_CATEGORY_STATIC (dca_parse_debug); #define GST_CAT_DEFAULT dca_parse_debug static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-dts," " framed = (boolean) true," " channels = (int) [ 1, 8 ]," " rate = (int) [ 8000, 192000 ]," " depth = (int) { 14, 16 }," " endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " " block-size = (int) [ 1, MAX], " " frame-size = (int) [ 1, MAX]")); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-dts")); static void gst_dca_parse_finalize (GObject * object); static gboolean gst_dca_parse_start (GstBaseParse * parse); static gboolean gst_dca_parse_stop (GstBaseParse * parse); static gboolean gst_dca_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * size, gint * skipsize); static GstFlowReturn gst_dca_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static GstCaps *gst_dca_parse_get_sink_caps (GstBaseParse * parse); GST_BOILERPLATE (GstDcaParse, gst_dca_parse, GstBaseParse, GST_TYPE_BASE_PARSE); static void gst_dca_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "DTS Coherent Acoustics audio stream parser", "Codec/Parser/Audio", "DCA parser", "Tim-Philipp Müller "); } static void gst_dca_parse_class_init (GstDcaParseClass * klass) { GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (dca_parse_debug, "dcaparse", 0, "DCA audio stream parser"); object_class->finalize = gst_dca_parse_finalize; parse_class->start = GST_DEBUG_FUNCPTR (gst_dca_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_dca_parse_stop); parse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_dca_parse_check_valid_frame); parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_dca_parse_parse_frame); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_dca_parse_get_sink_caps); } static void gst_dca_parse_reset (GstDcaParse * dcaparse) { dcaparse->channels = -1; dcaparse->rate = -1; dcaparse->depth = -1; dcaparse->endianness = -1; dcaparse->block_size = -1; dcaparse->frame_size = -1; dcaparse->last_sync = 0; } static void gst_dca_parse_init (GstDcaParse * dcaparse, GstDcaParseClass * klass) { gst_base_parse_set_min_frame_size (GST_BASE_PARSE (dcaparse), DCA_MIN_FRAMESIZE); gst_dca_parse_reset (dcaparse); } static void gst_dca_parse_finalize (GObject * object) { G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_dca_parse_start (GstBaseParse * parse) { GstDcaParse *dcaparse = GST_DCA_PARSE (parse); GST_DEBUG_OBJECT (parse, "starting"); gst_dca_parse_reset (dcaparse); return TRUE; } static gboolean gst_dca_parse_stop (GstBaseParse * parse) { GST_DEBUG_OBJECT (parse, "stopping"); return TRUE; } static gboolean gst_dca_parse_parse_header (GstDcaParse * dcaparse, const GstByteReader * reader, guint * frame_size, guint * sample_rate, guint * channels, guint * depth, gint * endianness, guint * num_blocks, guint * samples_per_block, gboolean * terminator) { static const int sample_rates[16] = { 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0, 12000, 24000, 48000, 96000, 192000 }; static const guint8 channels_table[16] = { 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8 }; GstByteReader r = *reader; guint16 hdr[8]; guint32 marker; guint chans, lfe, i; if (gst_byte_reader_get_remaining (&r) < (4 + sizeof (hdr))) return FALSE; marker = gst_byte_reader_peek_uint32_be_unchecked (&r); /* raw big endian or 14-bit big endian */ if (marker == 0x7FFE8001 || marker == 0x1FFFE800) { for (i = 0; i < G_N_ELEMENTS (hdr); ++i) hdr[i] = gst_byte_reader_get_uint16_be_unchecked (&r); } else /* raw little endian or 14-bit little endian */ if (marker == 0xFE7F0180 || marker == 0xFF1F00E8) { for (i = 0; i < G_N_ELEMENTS (hdr); ++i) hdr[i] = gst_byte_reader_get_uint16_le_unchecked (&r); } else { return FALSE; } GST_LOG_OBJECT (dcaparse, "dts sync marker 0x%08x at offset %u", marker, gst_byte_reader_get_pos (reader)); /* 14-bit mode */ if (marker == 0x1FFFE800 || marker == 0xFF1F00E8) { if ((hdr[2] & 0xFFF0) != 0x07F0) return FALSE; /* discard top 2 bits (2 void), shift in 2 */ hdr[0] = (hdr[0] << 2) | ((hdr[1] >> 12) & 0x0003); /* discard top 4 bits (2 void, 2 shifted into hdr[0]), shift in 4 etc. */ hdr[1] = (hdr[1] << 4) | ((hdr[2] >> 10) & 0x000F); hdr[2] = (hdr[2] << 6) | ((hdr[3] >> 8) & 0x003F); hdr[3] = (hdr[3] << 8) | ((hdr[4] >> 6) & 0x00FF); hdr[4] = (hdr[4] << 10) | ((hdr[5] >> 4) & 0x03FF); hdr[5] = (hdr[5] << 12) | ((hdr[6] >> 2) & 0x0FFF); hdr[6] = (hdr[6] << 14) | ((hdr[7] >> 0) & 0x3FFF); g_assert (hdr[0] == 0x7FFE && hdr[1] == 0x8001); } GST_LOG_OBJECT (dcaparse, "frame header: %04x%04x%04x%04x", hdr[2], hdr[3], hdr[4], hdr[5]); *terminator = (hdr[2] & 0x80) ? FALSE : TRUE; *samples_per_block = ((hdr[2] >> 10) & 0x1f) + 1; *num_blocks = ((hdr[2] >> 2) & 0x7F) + 1; *frame_size = (((hdr[2] & 0x03) << 12) | (hdr[3] >> 4)) + 1; chans = ((hdr[3] & 0x0F) << 2) | (hdr[4] >> 14); *sample_rate = sample_rates[(hdr[4] >> 10) & 0x0F]; lfe = (hdr[5] >> 9) & 0x03; GST_TRACE_OBJECT (dcaparse, "frame size %u, num_blocks %u, rate %u, " "samples per block %u", *frame_size, *num_blocks, *sample_rate, *samples_per_block); if (*num_blocks < 6 || *frame_size < 96 || *sample_rate == 0) return FALSE; if (marker == 0x1FFFE800 || marker == 0xFF1F00E8) *frame_size = (*frame_size * 16) / 14; /* FIXME: round up? */ if (chans < G_N_ELEMENTS (channels_table)) *channels = channels_table[chans] + ((lfe) ? 1 : 0); else *channels = 0; if (depth) *depth = (marker == 0x1FFFE800 || marker == 0xFF1F00E8) ? 14 : 16; if (endianness) *endianness = (marker == 0xFE7F0180 || marker == 0xFF1F00E8) ? G_LITTLE_ENDIAN : G_BIG_ENDIAN; GST_TRACE_OBJECT (dcaparse, "frame size %u, channels %u, rate %u, " "num_blocks %u, samples_per_block %u", *frame_size, *channels, *sample_rate, *num_blocks, *samples_per_block); return TRUE; } static gint gst_dca_parse_find_sync (GstDcaParse * dcaparse, GstByteReader * reader, const GstBuffer * buf, guint32 * sync) { guint32 best_sync = 0; guint best_offset = G_MAXUINT; gint off; /* FIXME: verify syncs via _parse_header() here already */ /* Raw little endian */ off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0xfe7f0180, 0, GST_BUFFER_SIZE (buf)); if (off >= 0 && off < best_offset) { best_offset = off; best_sync = 0xfe7f0180; } /* Raw big endian */ off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x7ffe8001, 0, GST_BUFFER_SIZE (buf)); if (off >= 0 && off < best_offset) { best_offset = off; best_sync = 0x7ffe8001; } /* FIXME: check next 2 bytes as well for 14-bit formats (but then don't * forget to adjust the *skipsize= in _check_valid_frame() */ /* 14-bit little endian */ off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0xff1f00e8, 0, GST_BUFFER_SIZE (buf)); if (off >= 0 && off < best_offset) { best_offset = off; best_sync = 0xff1f00e8; } /* 14-bit big endian */ off = gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x1fffe800, 0, GST_BUFFER_SIZE (buf)); if (off >= 0 && off < best_offset) { best_offset = off; best_sync = 0x1fffe800; } if (best_offset == G_MAXUINT) return -1; *sync = best_sync; return best_offset; } static gboolean gst_dca_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { GstDcaParse *dcaparse = GST_DCA_PARSE (parse); GstBuffer *buf = frame->buffer; GstByteReader r = GST_BYTE_READER_INIT_FROM_BUFFER (buf); gboolean parser_draining; gboolean parser_in_sync; gboolean terminator; guint32 sync = 0; guint size, rate, chans, num_blocks, samples_per_block; gint off = -1; if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 16)) return FALSE; parser_in_sync = !GST_BASE_PARSE_LOST_SYNC (parse); if (G_LIKELY (parser_in_sync && dcaparse->last_sync != 0)) { off = gst_byte_reader_masked_scan_uint32 (&r, 0xffffffff, dcaparse->last_sync, 0, GST_BUFFER_SIZE (buf)); } if (G_UNLIKELY (off < 0)) { off = gst_dca_parse_find_sync (dcaparse, &r, buf, &sync); } /* didn't find anything that looks like a sync word, skip */ if (off < 0) { *skipsize = GST_BUFFER_SIZE (buf) - 3; GST_DEBUG_OBJECT (dcaparse, "no sync, skipping %d bytes", *skipsize); return FALSE; } GST_LOG_OBJECT (parse, "possible sync %08x at buffer offset %d", sync, off); /* possible frame header, but not at offset 0? skip bytes before sync */ if (off > 0) { *skipsize = off; return FALSE; } /* make sure the values in the frame header look sane */ if (!gst_dca_parse_parse_header (dcaparse, &r, &size, &rate, &chans, NULL, NULL, &num_blocks, &samples_per_block, &terminator)) { *skipsize = 4; return FALSE; } GST_LOG_OBJECT (parse, "got frame, sync %08x, size %u, rate %d, channels %d", sync, size, rate, chans); *framesize = size; dcaparse->last_sync = sync; parser_draining = GST_BASE_PARSE_DRAINING (parse); if (!parser_in_sync && !parser_draining) { /* check for second frame to be sure */ GST_DEBUG_OBJECT (dcaparse, "resyncing; checking next frame syncword"); if (GST_BUFFER_SIZE (buf) >= (size + 16)) { guint s2, r2, c2, n2, s3; gboolean t; GST_MEMDUMP ("buf", GST_BUFFER_DATA (buf), size + 16); gst_byte_reader_init_from_buffer (&r, buf); gst_byte_reader_skip_unchecked (&r, size); if (!gst_dca_parse_parse_header (dcaparse, &r, &s2, &r2, &c2, NULL, NULL, &n2, &s3, &t)) { GST_DEBUG_OBJECT (dcaparse, "didn't find second syncword"); *skipsize = 4; return FALSE; } /* ok, got sync now, let's assume constant frame size */ gst_base_parse_set_min_frame_size (parse, size); } else { /* FIXME: baseparse always seems to hand us buffers of min_frame_size * bytes, which is unhelpful here */ GST_LOG_OBJECT (dcaparse, "next sync out of reach (%u < %u)", GST_BUFFER_SIZE (buf), size + 16); /* *skipsize = 0; */ /* return FALSE; */ } } return TRUE; } static GstFlowReturn gst_dca_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstDcaParse *dcaparse = GST_DCA_PARSE (parse); GstBuffer *buf = frame->buffer; GstByteReader r = GST_BYTE_READER_INIT_FROM_BUFFER (buf); guint size, rate, chans, depth, block_size, num_blocks, samples_per_block; gint endianness; gboolean terminator; if (!gst_dca_parse_parse_header (dcaparse, &r, &size, &rate, &chans, &depth, &endianness, &num_blocks, &samples_per_block, &terminator)) goto broken_header; block_size = num_blocks * samples_per_block; if (G_UNLIKELY (dcaparse->rate != rate || dcaparse->channels != chans || dcaparse->depth != depth || dcaparse->endianness != endianness || (!terminator && dcaparse->block_size != block_size) || (size != dcaparse->frame_size))) { GstCaps *caps; caps = gst_caps_new_simple ("audio/x-dts", "framed", G_TYPE_BOOLEAN, TRUE, "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, chans, "endianness", G_TYPE_INT, endianness, "depth", G_TYPE_INT, depth, "block-size", G_TYPE_INT, block_size, "frame-size", G_TYPE_INT, size, NULL); gst_buffer_set_caps (buf, caps); gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); gst_caps_unref (caps); dcaparse->rate = rate; dcaparse->channels = chans; dcaparse->depth = depth; dcaparse->endianness = endianness; dcaparse->block_size = block_size; dcaparse->frame_size = size; gst_base_parse_set_frame_rate (parse, rate, block_size, 0, 0); } return GST_FLOW_OK; /* ERRORS */ broken_header: { /* this really shouldn't ever happen */ GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), (NULL)); return GST_FLOW_ERROR; } } static GstCaps * gst_dca_parse_get_sink_caps (GstBaseParse * parse) { GstCaps *peercaps; GstCaps *res; peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; /* Remove the framed field */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_remove_field (s, "framed"); } res = gst_caps_intersect_full (peercaps, gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); } else { res = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse))); } return res; } gst-plugins-good-0.10.31/gst/audioparsers/gstflacparse.h0000644000175000017500000000544411677341655020152 00000000000000/* GStreamer * * Copyright (C) 2008 Sebastian Dröge . * Copyright (C) 2009 Mark Nauwelaerts * Copyright (C) 2009 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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_FLAC_PARSE_H__ #define __GST_FLAC_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_FLAC_PARSE (gst_flac_parse_get_type()) #define GST_FLAC_PARSE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLAC_PARSE,GstFlacParse)) #define GST_FLAC_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLAC_PARSE,GstFlacParseClass)) #define GST_FLAC_PARSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_FLAC_PARSE,GstFlacParseClass)) #define GST_IS_FLAC_PARSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLAC_PARSE)) #define GST_IS_FLAC_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLAC_PARSE)) #define GST_FLAC_PARSE_CAST(obj) ((GstFlacParse *)(obj)) typedef struct _GstFlacParse GstFlacParse; typedef struct _GstFlacParseClass GstFlacParseClass; typedef enum { GST_FLAC_PARSE_STATE_INIT, GST_FLAC_PARSE_STATE_HEADERS, GST_FLAC_PARSE_STATE_GENERATE_HEADERS, GST_FLAC_PARSE_STATE_DATA } GstFlacParseState; typedef struct { guint8 type; } GstFlacParseSubFrame; struct _GstFlacParse { GstBaseParse parent; /* Properties */ gboolean check_frame_checksums; GstFlacParseState state; gint64 upstream_length; /* STREAMINFO content */ guint16 min_blocksize, max_blocksize; guint32 min_framesize, max_framesize; guint32 samplerate; guint8 channels; guint8 bps; guint64 total_samples; /* Current frame */ guint64 offset; guint8 blocking_strategy; guint16 block_size; guint64 sample_number; gboolean strategy_checked; GstTagList *tags; GList *headers; GstBuffer *seektable; gboolean force_variable_block_size; }; struct _GstFlacParseClass { GstBaseParseClass parent_class; }; GType gst_flac_parse_get_type (void); G_END_DECLS #endif /* __GST_FLAC_PARSE_H__ */ gst-plugins-good-0.10.31/gst/audioparsers/plugin.c0000644000175000017500000000362711671175353016760 00000000000000/* GStreamer audio parsers * Copyright (C) 2009 Tim-Philipp Müller * * 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 "gstaacparse.h" #include "gstamrparse.h" #include "gstac3parse.h" #include "gstdcaparse.h" #include "gstflacparse.h" #include "gstmpegaudioparse.h" static gboolean plugin_init (GstPlugin * plugin) { gboolean ret; ret = gst_element_register (plugin, "aacparse", GST_RANK_PRIMARY + 1, GST_TYPE_AAC_PARSE); ret &= gst_element_register (plugin, "amrparse", GST_RANK_PRIMARY + 1, GST_TYPE_AMR_PARSE); ret &= gst_element_register (plugin, "ac3parse", GST_RANK_PRIMARY + 1, GST_TYPE_AC3_PARSE); ret &= gst_element_register (plugin, "dcaparse", GST_RANK_PRIMARY + 1, GST_TYPE_DCA_PARSE); ret &= gst_element_register (plugin, "flacparse", GST_RANK_PRIMARY + 1, GST_TYPE_FLAC_PARSE); ret &= gst_element_register (plugin, "mpegaudioparse", GST_RANK_PRIMARY + 2, GST_TYPE_MPEG_AUDIO_PARSE); return ret; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "audioparsers", "Parsers for various audio formats", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/audioparsers/gstac3parse.h0000644000175000017500000000441211677341655017705 00000000000000/* GStreamer AC3 parser * Copyright (C) 2009 Tim-Philipp Müller * Copyright (C) 2009 Mark Nauwelaerts * Copyright (C) 2009 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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_AC3_PARSE_H__ #define __GST_AC3_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_AC3_PARSE \ (gst_ac3_parse_get_type()) #define GST_AC3_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AC3_PARSE, GstAc3Parse)) #define GST_AC3_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AC3_PARSE, GstAc3ParseClass)) #define GST_IS_AC3_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AC3_PARSE)) #define GST_IS_AC3_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AC3_PARSE)) typedef struct _GstAc3Parse GstAc3Parse; typedef struct _GstAc3ParseClass GstAc3ParseClass; enum { GST_AC3_PARSE_ALIGN_NONE, GST_AC3_PARSE_ALIGN_FRAME, GST_AC3_PARSE_ALIGN_IEC61937, }; /** * GstAc3Parse: * * The opaque GstAc3Parse object */ struct _GstAc3Parse { GstBaseParse baseparse; /*< private >*/ gint sample_rate; gint channels; gint blocks; gboolean eac; volatile gint align; }; /** * GstAc3ParseClass: * @parent_class: Element parent class. * * The opaque GstAc3ParseClass data structure. */ struct _GstAc3ParseClass { GstBaseParseClass baseparse_class; }; GType gst_ac3_parse_get_type (void); G_END_DECLS #endif /* __GST_AC3_PARSE_H__ */ gst-plugins-good-0.10.31/gst/audioparsers/gstamrparse.c0000644000175000017500000002776411677341655020030 00000000000000/* GStreamer Adaptive Multi-Rate parser plugin * Copyright (C) 2006 Edgard Lima * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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-amrparse * @short_description: AMR parser * @see_also: #GstAmrnbDec, #GstAmrnbEnc * * This is an AMR parser capable of handling both narrow-band and wideband * formats. * * * Example launch line * |[ * gst-launch filesrc location=abc.amr ! amrparse ! amrdec ! audioresample ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstamrparse.h" static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/AMR, " "rate = (int) 8000, " "channels = (int) 1;" "audio/AMR-WB, " "rate = (int) 16000, " "channels = (int) 1;") ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-amr-nb-sh; audio/x-amr-wb-sh")); GST_DEBUG_CATEGORY_STATIC (amrparse_debug); #define GST_CAT_DEFAULT amrparse_debug static const gint block_size_nb[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; static const gint block_size_wb[16] = { 17, 23, 32, 36, 40, 46, 50, 58, 60, 5, -1, -1, -1, -1, 0, 0 }; /* AMR has a "hardcoded" framerate of 50fps */ #define AMR_FRAMES_PER_SECOND 50 #define AMR_FRAME_DURATION (GST_SECOND/AMR_FRAMES_PER_SECOND) #define AMR_MIME_HEADER_SIZE 9 static gboolean gst_amr_parse_start (GstBaseParse * parse); static gboolean gst_amr_parse_stop (GstBaseParse * parse); static gboolean gst_amr_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps); static GstCaps *gst_amr_parse_sink_getcaps (GstBaseParse * parse); static gboolean gst_amr_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize); static GstFlowReturn gst_amr_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); #define _do_init(bla) \ GST_DEBUG_CATEGORY_INIT (amrparse_debug, "amrparse", 0, \ "AMR-NB audio stream parser"); GST_BOILERPLATE_FULL (GstAmrParse, gst_amr_parse, GstBaseParse, GST_TYPE_BASE_PARSE, _do_init); /** * gst_amr_parse_base_init: * @klass: #GstElementClass. * */ static void gst_amr_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "AMR audio stream parser", "Codec/Parser/Audio", "Adaptive Multi-Rate audio parser", "Ronald Bultje "); } /** * gst_amr_parse_class_init: * @klass: GstAmrParseClass. * */ static void gst_amr_parse_class_init (GstAmrParseClass * klass) { GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); parse_class->start = GST_DEBUG_FUNCPTR (gst_amr_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_amr_parse_stop); parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_amr_parse_sink_setcaps); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_amr_parse_sink_getcaps); parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_amr_parse_parse_frame); parse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_amr_parse_check_valid_frame); } /** * gst_amr_parse_init: * @amrparse: #GstAmrParse * @klass: #GstAmrParseClass. * */ static void gst_amr_parse_init (GstAmrParse * amrparse, GstAmrParseClass * klass) { /* init rest */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (amrparse), 62); GST_DEBUG ("initialized"); } /** * gst_amr_parse_set_src_caps: * @amrparse: #GstAmrParse. * * Set source pad caps according to current knowledge about the * audio stream. * * Returns: TRUE if caps were successfully set. */ static gboolean gst_amr_parse_set_src_caps (GstAmrParse * amrparse) { GstCaps *src_caps = NULL; gboolean res = FALSE; if (amrparse->wide) { GST_DEBUG_OBJECT (amrparse, "setting srcpad caps to AMR-WB"); src_caps = gst_caps_new_simple ("audio/AMR-WB", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 16000, NULL); } else { GST_DEBUG_OBJECT (amrparse, "setting srcpad caps to AMR-NB"); /* Max. size of NB frame is 31 bytes, so we can set the min. frame size to 32 (+1 for next frame header) */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (amrparse), 32); src_caps = gst_caps_new_simple ("audio/AMR", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); } gst_pad_use_fixed_caps (GST_BASE_PARSE (amrparse)->srcpad); res = gst_pad_set_caps (GST_BASE_PARSE (amrparse)->srcpad, src_caps); gst_caps_unref (src_caps); return res; } /** * gst_amr_parse_sink_setcaps: * @sinkpad: GstPad * @caps: GstCaps * * Returns: TRUE on success. */ static gboolean gst_amr_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps) { GstAmrParse *amrparse; GstStructure *structure; const gchar *name; amrparse = GST_AMR_PARSE (parse); structure = gst_caps_get_structure (caps, 0); name = gst_structure_get_name (structure); GST_DEBUG_OBJECT (amrparse, "setcaps: %s", name); if (!strncmp (name, "audio/x-amr-wb-sh", 17)) { amrparse->block_size = block_size_wb; amrparse->wide = 1; } else if (!strncmp (name, "audio/x-amr-nb-sh", 17)) { amrparse->block_size = block_size_nb; amrparse->wide = 0; } else { GST_WARNING ("Unknown caps"); return FALSE; } amrparse->need_header = FALSE; gst_base_parse_set_frame_rate (GST_BASE_PARSE (amrparse), 50, 1, 2, 2); gst_amr_parse_set_src_caps (amrparse); return TRUE; } /** * gst_amr_parse_parse_header: * @amrparse: #GstAmrParse * @data: Header data to be parsed. * @skipsize: Output argument where the frame size will be stored. * * Check if the given data contains an AMR mime header. * * Returns: TRUE on success. */ static gboolean gst_amr_parse_parse_header (GstAmrParse * amrparse, const guint8 * data, gint * skipsize) { GST_DEBUG_OBJECT (amrparse, "Parsing header data"); if (!memcmp (data, "#!AMR-WB\n", 9)) { GST_DEBUG_OBJECT (amrparse, "AMR-WB detected"); amrparse->block_size = block_size_wb; amrparse->wide = TRUE; *skipsize = amrparse->header = 9; } else if (!memcmp (data, "#!AMR\n", 6)) { GST_DEBUG_OBJECT (amrparse, "AMR-NB detected"); amrparse->block_size = block_size_nb; amrparse->wide = FALSE; *skipsize = amrparse->header = 6; } else return FALSE; gst_amr_parse_set_src_caps (amrparse); return TRUE; } /** * gst_amr_parse_check_valid_frame: * @parse: #GstBaseParse. * @buffer: #GstBuffer. * @framesize: Output variable where the found frame size is put. * @skipsize: Output variable which tells how much data needs to be skipped * until a frame header is found. * * Implementation of "check_valid_frame" vmethod in #GstBaseParse class. * * Returns: TRUE if the given data contains valid frame. */ static gboolean gst_amr_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { GstBuffer *buffer; const guint8 *data; gint fsize, mode, dsize; GstAmrParse *amrparse; amrparse = GST_AMR_PARSE (parse); buffer = frame->buffer; data = GST_BUFFER_DATA (buffer); dsize = GST_BUFFER_SIZE (buffer); GST_LOG ("buffer: %d bytes", dsize); if (amrparse->need_header) { if (dsize >= AMR_MIME_HEADER_SIZE && gst_amr_parse_parse_header (amrparse, data, skipsize)) { amrparse->need_header = FALSE; gst_base_parse_set_frame_rate (GST_BASE_PARSE (amrparse), 50, 1, 2, 2); } else { GST_WARNING ("media doesn't look like a AMR format"); } /* We return FALSE, so this frame won't get pushed forward. Instead, the "skip" value is set, so next time we will receive a valid frame. */ return FALSE; } /* Does this look like a possible frame header candidate? */ if ((data[0] & 0x83) == 0) { /* Yep. Retrieve the frame size */ mode = (data[0] >> 3) & 0x0F; fsize = amrparse->block_size[mode] + 1; /* +1 for the header byte */ /* We recognize this data as a valid frame when: * - We are in sync. There is no need for extra checks then * - We are in EOS. There might not be enough data to check next frame * - Sync is lost, but the following data after this frame seem * to contain a valid header as well (and there is enough data to * perform this check) */ if (fsize) { gboolean found = FALSE; /* in sync, no further check */ if (!GST_BASE_PARSE_LOST_SYNC (parse)) { found = TRUE; } else if (dsize > fsize) { /* enough data, check for next sync */ if ((data[fsize] & 0x83) == 0) found = TRUE; } else if (GST_BASE_PARSE_DRAINING (parse)) { /* not enough, but draining, so ok */ found = TRUE; } else { /* indicate we need not skip, but need more data */ *skipsize = 0; *framesize = fsize + 1; } if (found) { *framesize = fsize; return TRUE; } } } GST_LOG ("sync lost"); return FALSE; } /** * gst_amr_parse_parse_frame: * @parse: #GstBaseParse. * @buffer: #GstBuffer. * * Implementation of "parse" vmethod in #GstBaseParse class. * * Returns: #GstFlowReturn defining the parsing status. */ static GstFlowReturn gst_amr_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { return GST_FLOW_OK; } /** * gst_amr_parse_start: * @parse: #GstBaseParse. * * Implementation of "start" vmethod in #GstBaseParse class. * * Returns: TRUE on success. */ static gboolean gst_amr_parse_start (GstBaseParse * parse) { GstAmrParse *amrparse; amrparse = GST_AMR_PARSE (parse); GST_DEBUG ("start"); amrparse->need_header = TRUE; amrparse->header = 0; return TRUE; } /** * gst_amr_parse_stop: * @parse: #GstBaseParse. * * Implementation of "stop" vmethod in #GstBaseParse class. * * Returns: TRUE on success. */ static gboolean gst_amr_parse_stop (GstBaseParse * parse) { GstAmrParse *amrparse; amrparse = GST_AMR_PARSE (parse); GST_DEBUG ("stop"); amrparse->need_header = TRUE; amrparse->header = 0; return TRUE; } static GstCaps * gst_amr_parse_sink_getcaps (GstBaseParse * parse) { GstCaps *peercaps; GstCaps *res; peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; /* Rename structure names */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); if (gst_structure_has_name (s, "audio/AMR")) gst_structure_set_name (s, "audio/x-amr-nb-sh"); else gst_structure_set_name (s, "audio/x-amr-wb-sh"); } res = gst_caps_intersect_full (peercaps, gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); } else { res = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse))); } return res; } gst-plugins-good-0.10.31/gst/audioparsers/gstaacparse.c0000644000175000017500000005540711677341654017767 00000000000000/* GStreamer AAC parser plugin * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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-aacparse * @short_description: AAC parser * @see_also: #GstAmrParse * * This is an AAC parser which handles both ADIF and ADTS stream formats. * * As ADIF format is not framed, it is not seekable and stream duration cannot * be determined either. However, ADTS format AAC clips can be seeked, and parser * can also estimate playback position and clip duration. * * * Example launch line * |[ * gst-launch filesrc location=abc.aac ! aacparse ! faad ! audioresample ! audioconvert ! alsasink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstaacparse.h" static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, " "framed = (boolean) true, " "mpegversion = (int) { 2, 4 }, " "stream-format = (string) { raw, adts, adif };")); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) { 2, 4 };")); GST_DEBUG_CATEGORY_STATIC (aacparse_debug); #define GST_CAT_DEFAULT aacparse_debug #define ADIF_MAX_SIZE 40 /* Should be enough */ #define ADTS_MAX_SIZE 10 /* Should be enough */ #define AAC_FRAME_DURATION(parse) (GST_SECOND/parse->frames_per_sec) static gboolean gst_aac_parse_start (GstBaseParse * parse); static gboolean gst_aac_parse_stop (GstBaseParse * parse); static gboolean gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps); static GstCaps *gst_aac_parse_sink_getcaps (GstBaseParse * parse); static gboolean gst_aac_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * size, gint * skipsize); static GstFlowReturn gst_aac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); #define _do_init(bla) \ GST_DEBUG_CATEGORY_INIT (aacparse_debug, "aacparse", 0, \ "AAC audio stream parser"); GST_BOILERPLATE_FULL (GstAacParse, gst_aac_parse, GstBaseParse, GST_TYPE_BASE_PARSE, _do_init); static inline gint gst_aac_parse_get_sample_rate_from_index (guint sr_idx) { static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; if (sr_idx < G_N_ELEMENTS (aac_sample_rates)) return aac_sample_rates[sr_idx]; GST_WARNING ("Invalid sample rate index %u", sr_idx); return 0; } /** * gst_aac_parse_base_init: * @klass: #GstElementClass. * */ static void gst_aac_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "AAC audio stream parser", "Codec/Parser/Audio", "Advanced Audio Coding parser", "Stefan Kost "); } /** * gst_aac_parse_class_init: * @klass: #GstAacParseClass. * */ static void gst_aac_parse_class_init (GstAacParseClass * klass) { GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); parse_class->start = GST_DEBUG_FUNCPTR (gst_aac_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_aac_parse_stop); parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_setcaps); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_getcaps); parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_parse_frame); parse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_check_valid_frame); } /** * gst_aac_parse_init: * @aacparse: #GstAacParse. * @klass: #GstAacParseClass. * */ static void gst_aac_parse_init (GstAacParse * aacparse, GstAacParseClass * klass) { GST_DEBUG ("initialized"); } /** * gst_aac_parse_set_src_caps: * @aacparse: #GstAacParse. * @sink_caps: (proposed) caps of sink pad * * Set source pad caps according to current knowledge about the * audio stream. * * Returns: TRUE if caps were successfully set. */ static gboolean gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) { GstStructure *s; GstCaps *src_caps = NULL; gboolean res = FALSE; const gchar *stream_format; GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps); if (sink_caps) src_caps = gst_caps_copy (sink_caps); else src_caps = gst_caps_new_simple ("audio/mpeg", NULL); gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE, "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL); switch (aacparse->header_type) { case DSPAAC_HEADER_NONE: stream_format = "raw"; break; case DSPAAC_HEADER_ADTS: stream_format = "adts"; break; case DSPAAC_HEADER_ADIF: stream_format = "adif"; break; default: stream_format = NULL; } s = gst_caps_get_structure (src_caps, 0); if (aacparse->sample_rate > 0) gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL); if (aacparse->channels > 0) gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL); if (stream_format) gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL); GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps); res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps); gst_caps_unref (src_caps); return res; } /** * gst_aac_parse_sink_setcaps: * @sinkpad: GstPad * @caps: GstCaps * * Implementation of "set_sink_caps" vmethod in #GstBaseParse class. * * Returns: TRUE on success. */ static gboolean gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps) { GstAacParse *aacparse; GstStructure *structure; gchar *caps_str; const GValue *value; aacparse = GST_AAC_PARSE (parse); structure = gst_caps_get_structure (caps, 0); caps_str = gst_caps_to_string (caps); GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str); g_free (caps_str); /* This is needed at least in case of RTP * Parses the codec_data information to get ObjectType, * number of channels and samplerate */ value = gst_structure_get_value (structure, "codec_data"); if (value) { GstBuffer *buf = gst_value_get_buffer (value); if (buf) { const guint8 *buffer = GST_BUFFER_DATA (buf); guint sr_idx; sr_idx = ((buffer[0] & 0x07) << 1) | ((buffer[1] & 0x80) >> 7); aacparse->object_type = (buffer[0] & 0xf8) >> 3; aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx); aacparse->channels = (buffer[1] & 0x78) >> 3; aacparse->header_type = DSPAAC_HEADER_NONE; aacparse->mpegversion = 4; aacparse->frame_samples = (buffer[1] & 4) ? 960 : 1024; GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, " "samples=%d", aacparse->object_type, aacparse->sample_rate, aacparse->channels, aacparse->frame_samples); /* arrange for metadata and get out of the way */ gst_aac_parse_set_src_caps (aacparse, caps); gst_base_parse_set_passthrough (parse, TRUE); } else return FALSE; /* caps info overrides */ gst_structure_get_int (structure, "rate", &aacparse->sample_rate); gst_structure_get_int (structure, "channels", &aacparse->channels); } else { gst_base_parse_set_passthrough (parse, FALSE); } return TRUE; } /** * gst_aac_parse_adts_get_frame_len: * @data: block of data containing an ADTS header. * * This function calculates ADTS frame length from the given header. * * Returns: size of the ADTS frame. */ static inline guint gst_aac_parse_adts_get_frame_len (const guint8 * data) { return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5); } /** * gst_aac_parse_check_adts_frame: * @aacparse: #GstAacParse. * @data: Data to be checked. * @avail: Amount of data passed. * @framesize: If valid ADTS frame was found, this will be set to tell the * found frame size in bytes. * @needed_data: If frame was not found, this may be set to tell how much * more data is needed in the next round to detect the frame * reliably. This may happen when a frame header candidate * is found but it cannot be guaranteed to be the header without * peeking the following data. * * Check if the given data contains contains ADTS frame. The algorithm * will examine ADTS frame header and calculate the frame size. Also, another * consecutive ADTS frame header need to be present after the found frame. * Otherwise the data is not considered as a valid ADTS frame. However, this * "extra check" is omitted when EOS has been received. In this case it is * enough when data[0] contains a valid ADTS header. * * This function may set the #needed_data to indicate that a possible frame * candidate has been found, but more data (#needed_data bytes) is needed to * be absolutely sure. When this situation occurs, FALSE will be returned. * * When a valid frame is detected, this function will use * gst_base_parse_set_min_frame_size() function from #GstBaseParse class * to set the needed bytes for next frame.This way next data chunk is already * of correct size. * * Returns: TRUE if the given data contains a valid ADTS header. */ static gboolean gst_aac_parse_check_adts_frame (GstAacParse * aacparse, const guint8 * data, const guint avail, gboolean drain, guint * framesize, guint * needed_data) { if (G_UNLIKELY (avail < 2)) return FALSE; if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) { *framesize = gst_aac_parse_adts_get_frame_len (data); /* In EOS mode this is enough. No need to examine the data further. We also relax the check when we have sync, on the assumption that if we're not looking at random data, we have a much higher chance to get the correct sync, and this avoids losing two frames when a single bit corruption happens. */ if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) { return TRUE; } if (*framesize + ADTS_MAX_SIZE > avail) { /* We have found a possible frame header candidate, but can't be sure since we don't have enough data to check the next frame */ GST_DEBUG ("NEED MORE DATA: we need %d, available %d", *framesize + ADTS_MAX_SIZE, avail); *needed_data = *framesize + ADTS_MAX_SIZE; gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), *framesize + ADTS_MAX_SIZE); return FALSE; } if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) { guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize)); GST_LOG ("ADTS frame found, len: %d bytes", *framesize); gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), nextlen + ADTS_MAX_SIZE); return TRUE; } } return FALSE; } /* caller ensure sufficient data */ static inline void gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data, gint * rate, gint * channels, gint * object, gint * version) { if (rate) { gint sr_idx = (data[2] & 0x3c) >> 2; *rate = gst_aac_parse_get_sample_rate_from_index (sr_idx); } if (channels) *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6); if (version) *version = (data[1] & 0x08) ? 2 : 4; if (object) *object = (data[2] & 0xc0) >> 6; } /** * gst_aac_parse_detect_stream: * @aacparse: #GstAacParse. * @data: A block of data that needs to be examined for stream characteristics. * @avail: Size of the given datablock. * @framesize: If valid stream was found, this will be set to tell the * first frame size in bytes. * @skipsize: If valid stream was found, this will be set to tell the first * audio frame position within the given data. * * Examines the given piece of data and try to detect the format of it. It * checks for "ADIF" header (in the beginning of the clip) and ADTS frame * header. If the stream is detected, TRUE will be returned and #framesize * is set to indicate the found frame size. Additionally, #skipsize might * be set to indicate the number of bytes that need to be skipped, a.k.a. the * position of the frame inside given data chunk. * * Returns: TRUE on success. */ static gboolean gst_aac_parse_detect_stream (GstAacParse * aacparse, const guint8 * data, const guint avail, gboolean drain, guint * framesize, gint * skipsize) { gboolean found = FALSE; guint need_data = 0; guint i = 0; GST_DEBUG_OBJECT (aacparse, "Parsing header data"); /* FIXME: No need to check for ADIF if we are not in the beginning of the stream */ /* Can we even parse the header? */ if (avail < ADTS_MAX_SIZE) return FALSE; for (i = 0; i < avail - 4; i++) { if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) || strncmp ((char *) data + i, "ADIF", 4) == 0) { found = TRUE; if (i) { /* Trick: tell the parent class that we didn't find the frame yet, but make it skip 'i' amount of bytes. Next time we arrive here we have full frame in the beginning of the data. */ *skipsize = i; return FALSE; } break; } } if (!found) { if (i) *skipsize = i; return FALSE; } if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain, framesize, &need_data)) { gint rate, channels; GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize); aacparse->header_type = DSPAAC_HEADER_ADTS; gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels, &aacparse->object_type, &aacparse->mpegversion); gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate, aacparse->frame_samples, 2, 2); GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d", rate, channels, aacparse->object_type, aacparse->mpegversion); gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE); return TRUE; } else if (need_data) { /* This tells the parent class not to skip any data */ *skipsize = 0; return FALSE; } if (avail < ADIF_MAX_SIZE) return FALSE; if (memcmp (data + i, "ADIF", 4) == 0) { const guint8 *adif; int skip_size = 0; int bitstream_type; int sr_idx; aacparse->header_type = DSPAAC_HEADER_ADIF; aacparse->mpegversion = 4; /* Skip the "ADIF" bytes */ adif = data + i + 4; /* copyright string */ if (adif[0] & 0x80) skip_size += 9; /* skip 9 bytes */ bitstream_type = adif[0 + skip_size] & 0x10; aacparse->bitrate = ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) | ((unsigned int) adif[1 + skip_size] << 11) | ((unsigned int) adif[2 + skip_size] << 3) | ((unsigned int) adif[3 + skip_size] & 0xe0); /* CBR */ if (bitstream_type == 0) { #if 0 /* Buffer fullness parsing. Currently not needed... */ guint num_elems = 0; guint fullness = 0; num_elems = (adif[3 + skip_size] & 0x1e); GST_INFO ("ADIF num_config_elems: %d", num_elems); fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) | ((unsigned int) adif[4 + skip_size] << 11) | ((unsigned int) adif[5 + skip_size] << 3) | ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5); GST_INFO ("ADIF buffer fullness: %d", fullness); #endif aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) | ((adif[7 + skip_size] & 0x80) >> 7); sr_idx = (adif[7 + skip_size] & 0x78) >> 3; } /* VBR */ else { aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3; sr_idx = ((adif[4 + skip_size] & 0x07) << 1) | ((adif[5 + skip_size] & 0x80) >> 7); } /* FIXME: This gives totally wrong results. Duration calculation cannot be based on this */ aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx); /* baseparse is not given any fps, * so it will give up on timestamps, seeking, etc */ /* FIXME: Can we assume this? */ aacparse->channels = 2; GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d", aacparse->bitrate, aacparse->sample_rate, aacparse->object_type); gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512); /* arrange for metadata and get out of the way */ gst_aac_parse_set_src_caps (aacparse, GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (aacparse))); /* not syncable, not easily seekable (unless we push data from start */ gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE); gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE); gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0); *framesize = avail; return TRUE; } /* This should never happen */ return FALSE; } /** * gst_aac_parse_check_valid_frame: * @parse: #GstBaseParse. * @buffer: #GstBuffer. * @framesize: If the buffer contains a valid frame, its size will be put here * @skipsize: How much data parent class should skip in order to find the * frame header. * * Implementation of "check_valid_frame" vmethod in #GstBaseParse class. * * Returns: TRUE if buffer contains a valid frame. */ static gboolean gst_aac_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { const guint8 *data; GstAacParse *aacparse; gboolean ret = FALSE; gboolean lost_sync; GstBuffer *buffer; aacparse = GST_AAC_PARSE (parse); buffer = frame->buffer; data = GST_BUFFER_DATA (buffer); lost_sync = GST_BASE_PARSE_LOST_SYNC (parse); if (aacparse->header_type == DSPAAC_HEADER_ADIF || aacparse->header_type == DSPAAC_HEADER_NONE) { /* There is nothing to parse */ *framesize = GST_BUFFER_SIZE (buffer); ret = TRUE; } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) { ret = gst_aac_parse_detect_stream (aacparse, data, GST_BUFFER_SIZE (buffer), GST_BASE_PARSE_DRAINING (parse), framesize, skipsize); } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) { guint needed_data = 1024; ret = gst_aac_parse_check_adts_frame (aacparse, data, GST_BUFFER_SIZE (buffer), GST_BASE_PARSE_DRAINING (parse), framesize, &needed_data); if (!ret) { GST_DEBUG ("buffer didn't contain valid frame"); gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), needed_data); } } else { GST_DEBUG ("buffer didn't contain valid frame"); gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE); } return ret; } /** * gst_aac_parse_parse_frame: * @parse: #GstBaseParse. * @buffer: #GstBuffer. * * Implementation of "parse_frame" vmethod in #GstBaseParse class. * * Also determines frame overhead. * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have * a per-frame header. * * We're making a couple of simplifying assumptions: * * 1. We count Program Configuration Elements rather than searching for them * in the streams to discount them - the overhead is negligible. * * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16 * bits, which should still not be significant enough to warrant the * additional parsing through the headers * * Returns: GST_FLOW_OK if frame was successfully parsed and can be pushed * forward. Otherwise appropriate error is returned. */ static GstFlowReturn gst_aac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstAacParse *aacparse; GstBuffer *buffer; GstFlowReturn ret = GST_FLOW_OK; gint rate, channels; aacparse = GST_AAC_PARSE (parse); buffer = frame->buffer; if (G_UNLIKELY (aacparse->header_type != DSPAAC_HEADER_ADTS)) return ret; /* see above */ frame->overhead = 7; gst_aac_parse_parse_adts_header (aacparse, GST_BUFFER_DATA (buffer), &rate, &channels, NULL, NULL); GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels); if (G_UNLIKELY (rate != aacparse->sample_rate || channels != aacparse->channels)) { aacparse->sample_rate = rate; aacparse->channels = channels; if (!gst_aac_parse_set_src_caps (aacparse, GST_PAD_CAPS (GST_BASE_PARSE (aacparse)->sinkpad))) { /* If linking fails, we need to return appropriate error */ ret = GST_FLOW_NOT_LINKED; } gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), aacparse->sample_rate, aacparse->frame_samples, 2, 2); } return ret; } /** * gst_aac_parse_start: * @parse: #GstBaseParse. * * Implementation of "start" vmethod in #GstBaseParse class. * * Returns: TRUE if startup succeeded. */ static gboolean gst_aac_parse_start (GstBaseParse * parse) { GstAacParse *aacparse; aacparse = GST_AAC_PARSE (parse); GST_DEBUG ("start"); aacparse->frame_samples = 1024; gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE); return TRUE; } /** * gst_aac_parse_stop: * @parse: #GstBaseParse. * * Implementation of "stop" vmethod in #GstBaseParse class. * * Returns: TRUE is stopping succeeded. */ static gboolean gst_aac_parse_stop (GstBaseParse * parse) { GST_DEBUG ("stop"); return TRUE; } static GstCaps * gst_aac_parse_sink_getcaps (GstBaseParse * parse) { GstCaps *peercaps; GstCaps *res; peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; /* Remove the framed field */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_remove_field (s, "framed"); } res = gst_caps_intersect_full (peercaps, gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); } else { res = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse))); } return res; } gst-plugins-good-0.10.31/gst/audioparsers/gstaacparse.h0000644000175000017500000000516611677341654017771 00000000000000/* GStreamer AAC parser * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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_AAC_PARSE_H__ #define __GST_AAC_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_AAC_PARSE \ (gst_aac_parse_get_type()) #define GST_AAC_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AAC_PARSE, GstAacParse)) #define GST_AAC_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AAC_PARSE, GstAacParseClass)) #define GST_IS_AAC_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AAC_PARSE)) #define GST_IS_AAC_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AAC_PARSE)) /** * GstAacHeaderType: * @DSPAAC_HEADER_NOT_PARSED: Header not parsed yet. * @DSPAAC_HEADER_UNKNOWN: Unknown (not recognized) header. * @DSPAAC_HEADER_ADIF: ADIF header found. * @DSPAAC_HEADER_ADTS: ADTS header found. * @DSPAAC_HEADER_NONE: Raw stream, no header. * * Type header enumeration set in #header_type. */ typedef enum { DSPAAC_HEADER_NOT_PARSED, DSPAAC_HEADER_UNKNOWN, DSPAAC_HEADER_ADIF, DSPAAC_HEADER_ADTS, DSPAAC_HEADER_NONE } GstAacHeaderType; typedef struct _GstAacParse GstAacParse; typedef struct _GstAacParseClass GstAacParseClass; /** * GstAacParse: * * The opaque GstAacParse data structure. */ struct _GstAacParse { GstBaseParse element; /* Stream type -related info */ gint object_type; gint bitrate; gint sample_rate; gint channels; gint mpegversion; gint frame_samples; GstAacHeaderType header_type; }; /** * GstAacParseClass: * @parent_class: Element parent class. * * The opaque GstAacParseClass data structure. */ struct _GstAacParseClass { GstBaseParseClass parent_class; }; GType gst_aac_parse_get_type (void); G_END_DECLS #endif /* __GST_AAC_PARSE_H__ */ gst-plugins-good-0.10.31/gst/audioparsers/gstamrparse.h0000644000175000017500000000477711671175353020026 00000000000000/* GStreamer Adaptive Multi-Rate parser * Copyright (C) 2004 Ronald Bultje * Copyright (C) 2008 Nokia Corporation. All rights reserved. * * Contact: Stefan Kost * * 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_AMR_PARSE_H__ #define __GST_AMR_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_AMR_PARSE \ (gst_amr_parse_get_type()) #define GST_AMR_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMR_PARSE, GstAmrParse)) #define GST_AMR_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMR_PARSE, GstAmrParseClass)) #define GST_IS_AMR_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMR_PARSE)) #define GST_IS_AMR_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMR_PARSE)) typedef struct _GstAmrParse GstAmrParse; typedef struct _GstAmrParseClass GstAmrParseClass; /** * GstAmrParse: * @element: the parent element. * @block_size: Pointer to frame size lookup table. * @need_header: Tells whether the MIME header should be read in the beginning. * @wide: Wideband mode. * @eos: Indicates the EOS situation. Set when EOS event is received. * @sync: Tells whether the parser is in sync. * @framecount: Total amount of frames handled. * @bytecount: Total amount of bytes handled. * @ts: Timestamp of the current media. * * The opaque GstAacParse data structure. */ struct _GstAmrParse { GstBaseParse element; const gint *block_size; gboolean need_header; gint header; gboolean wide; }; /** * GstAmrParseClass: * @parent_class: Element parent class. * * The opaque GstAmrParseClass data structure. */ struct _GstAmrParseClass { GstBaseParseClass parent_class; }; GType gst_amr_parse_get_type (void); G_END_DECLS #endif /* __GST_AMR_PARSE_H__ */ gst-plugins-good-0.10.31/gst/audioparsers/gstflacparse.c0000644000175000017500000013475411677341655020154 00000000000000/* GStreamer * * Copyright (C) 2008 Sebastian Dröge . * Copyright (C) 2009 Mark Nauwelaerts * Copyright (C) 2009 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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-flacparse * @see_also: flacdec, oggdemux, vorbisparse * * The flacparse element will parse the header packets of the FLAC * stream and put them as the streamheader in the caps. This is used in the * multifdsink case where you want to stream live FLAC streams to multiple * clients, each client has to receive the streamheaders first before they can * consume the FLAC packets. * * This element also makes sure that the buffers that it pushes out are properly * timestamped and that their offset and offset_end are set. The buffers that * flacparse outputs have all of the metadata that oggmux expects to receive, * which allows you to (for example) remux an ogg/flac or convert a native FLAC * format file to an ogg bitstream. * * * Example pipelines * |[ * gst-launch -v filesrc location=sine.flac ! flacparse ! identity \ * ! oggmux ! filesink location=sine-remuxed.ogg * ]| This pipeline converts a native FLAC format file to an ogg bitstream. * It also illustrates that the streamheader is set in the caps, and that each * buffer has the timestamp, duration, offset, and offset_end set. * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstflacparse.h" #include #include #include #include #include GST_DEBUG_CATEGORY_STATIC (flacparse_debug); #define GST_CAT_DEFAULT flacparse_debug /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ static const guint8 crc8_table[256] = { 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 }; static guint8 gst_flac_calculate_crc8 (const guint8 * data, guint length) { guint8 crc = 0; while (length--) { crc = crc8_table[crc ^ *data]; ++data; } return crc; } /* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ static const guint16 crc16_table[256] = { 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 }; static guint16 gst_flac_calculate_crc16 (const guint8 * data, guint length) { guint16 crc = 0; while (length--) { crc = ((crc << 8) ^ crc16_table[(crc >> 8) ^ *data]) & 0xffff; data++; } return crc; } enum { PROP_0, PROP_CHECK_FRAME_CHECKSUMS }; #define DEFAULT_CHECK_FRAME_CHECKSUMS FALSE static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-flac, framed = (boolean) true, " "channels = (int) [ 1, 8 ], " "rate = (int) [ 1, 655350 ]") ); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-flac") ); static void gst_flac_parse_finalize (GObject * object); static void gst_flac_parse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_flac_parse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_flac_parse_start (GstBaseParse * parse); static gboolean gst_flac_parse_stop (GstBaseParse * parse); static gboolean gst_flac_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize); static GstFlowReturn gst_flac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static GstFlowReturn gst_flac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static gboolean gst_flac_parse_convert (GstBaseParse * parse, GstFormat src_format, gint64 src_value, GstFormat dest_format, gint64 * dest_value); static GstCaps *gst_flac_parse_get_sink_caps (GstBaseParse * parse); GST_BOILERPLATE (GstFlacParse, gst_flac_parse, GstBaseParse, GST_TYPE_BASE_PARSE); static void gst_flac_parse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "FLAC audio parser", "Codec/Parser/Audio", "Parses audio with the FLAC lossless audio codec", "Sebastian Dröge "); GST_DEBUG_CATEGORY_INIT (flacparse_debug, "flacparse", 0, "Flac parser element"); } static void gst_flac_parse_class_init (GstFlacParseClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseParseClass *baseparse_class = GST_BASE_PARSE_CLASS (klass); gobject_class->finalize = gst_flac_parse_finalize; gobject_class->set_property = gst_flac_parse_set_property; gobject_class->get_property = gst_flac_parse_get_property; g_object_class_install_property (gobject_class, PROP_CHECK_FRAME_CHECKSUMS, g_param_spec_boolean ("check-frame-checksums", "Check Frame Checksums", "Check the overall checksums of every frame", DEFAULT_CHECK_FRAME_CHECKSUMS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); baseparse_class->start = GST_DEBUG_FUNCPTR (gst_flac_parse_start); baseparse_class->stop = GST_DEBUG_FUNCPTR (gst_flac_parse_stop); baseparse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_flac_parse_check_valid_frame); baseparse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_flac_parse_parse_frame); baseparse_class->pre_push_frame = GST_DEBUG_FUNCPTR (gst_flac_parse_pre_push_frame); baseparse_class->convert = GST_DEBUG_FUNCPTR (gst_flac_parse_convert); baseparse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_flac_parse_get_sink_caps); } static void gst_flac_parse_init (GstFlacParse * flacparse, GstFlacParseClass * klass) { flacparse->check_frame_checksums = DEFAULT_CHECK_FRAME_CHECKSUMS; } static void gst_flac_parse_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstFlacParse *flacparse = GST_FLAC_PARSE (object); switch (prop_id) { case PROP_CHECK_FRAME_CHECKSUMS: flacparse->check_frame_checksums = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_flac_parse_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstFlacParse *flacparse = GST_FLAC_PARSE (object); switch (prop_id) { case PROP_CHECK_FRAME_CHECKSUMS: g_value_set_boolean (value, flacparse->check_frame_checksums); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_flac_parse_finalize (GObject * object) { GstFlacParse *flacparse = GST_FLAC_PARSE (object); if (flacparse->tags) { gst_tag_list_free (flacparse->tags); flacparse->tags = NULL; } g_list_foreach (flacparse->headers, (GFunc) gst_mini_object_unref, NULL); g_list_free (flacparse->headers); flacparse->headers = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_flac_parse_start (GstBaseParse * parse) { GstFlacParse *flacparse = GST_FLAC_PARSE (parse); flacparse->state = GST_FLAC_PARSE_STATE_INIT; flacparse->min_blocksize = 0; flacparse->max_blocksize = 0; flacparse->min_framesize = 0; flacparse->max_framesize = 0; flacparse->upstream_length = -1; flacparse->samplerate = 0; flacparse->channels = 0; flacparse->bps = 0; flacparse->total_samples = 0; flacparse->offset = GST_CLOCK_TIME_NONE; flacparse->blocking_strategy = 0; flacparse->block_size = 0; flacparse->sample_number = 0; flacparse->strategy_checked = FALSE; /* "fLaC" marker */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), 4); /* inform baseclass we can come up with ts, based on counters in packets */ gst_base_parse_set_has_timing_info (GST_BASE_PARSE_CAST (flacparse), TRUE); gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (flacparse), TRUE); return TRUE; } static gboolean gst_flac_parse_stop (GstBaseParse * parse) { GstFlacParse *flacparse = GST_FLAC_PARSE (parse); if (flacparse->tags) { gst_tag_list_free (flacparse->tags); flacparse->tags = NULL; } g_list_foreach (flacparse->headers, (GFunc) gst_mini_object_unref, NULL); g_list_free (flacparse->headers); flacparse->headers = NULL; return TRUE; } static const guint8 sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 }; static const guint16 blocksize_table[16] = { 0, 192, 576 << 0, 576 << 1, 576 << 2, 576 << 3, 0, 0, 256 << 0, 256 << 1, 256 << 2, 256 << 3, 256 << 4, 256 << 5, 256 << 6, 256 << 7, }; static const guint32 sample_rate_table[16] = { 0, 88200, 176400, 192000, 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, 0, 0, 0, 0, }; typedef enum { FRAME_HEADER_VALID, FRAME_HEADER_INVALID, FRAME_HEADER_MORE_DATA } FrameHeaderCheckReturn; static FrameHeaderCheckReturn gst_flac_parse_frame_header_is_valid (GstFlacParse * flacparse, const guint8 * data, guint size, gboolean set, guint16 * block_size_ret) { GstBitReader reader = GST_BIT_READER_INIT (data, size); guint8 blocking_strategy; guint16 block_size; guint32 samplerate = 0; guint64 sample_number; guint8 channels, bps; guint8 tmp = 0; guint8 actual_crc, expected_crc = 0; /* Skip 14 bit sync code */ gst_bit_reader_skip_unchecked (&reader, 14); /* Must be 0 */ if (gst_bit_reader_get_bits_uint8_unchecked (&reader, 1) != 0) goto error; /* 0 == fixed block size, 1 == variable block size */ blocking_strategy = gst_bit_reader_get_bits_uint8_unchecked (&reader, 1); if (flacparse->force_variable_block_size) blocking_strategy = 1; /* block size index, calculation of the real blocksize below */ block_size = gst_bit_reader_get_bits_uint16_unchecked (&reader, 4); if (block_size == 0) goto error; /* sample rate index, calculation of the real samplerate below */ samplerate = gst_bit_reader_get_bits_uint16_unchecked (&reader, 4); if (samplerate == 0x0f) goto error; /* channel assignment */ channels = gst_bit_reader_get_bits_uint8_unchecked (&reader, 4); if (channels < 8) { channels++; } else if (channels <= 10) { channels = 2; } else if (channels > 10) { goto error; } if (flacparse->channels && flacparse->channels != channels) goto error; /* bits per sample */ bps = gst_bit_reader_get_bits_uint8_unchecked (&reader, 3); if (bps == 0x03 || bps == 0x07) { goto error; } else if (bps == 0 && flacparse->bps == 0) { goto need_streaminfo; } bps = sample_size_table[bps]; if (flacparse->bps && bps != flacparse->bps) goto error; /* reserved, must be 0 */ if (gst_bit_reader_get_bits_uint8_unchecked (&reader, 1) != 0) goto error; /* read "utf8" encoded sample/frame number */ { gint len = 0; len = gst_bit_reader_get_bits_uint8_unchecked (&reader, 8); /* This is slightly faster than a loop */ if (!(len & 0x80)) { sample_number = len; len = 0; } else if ((len & 0xc0) && !(len & 0x20)) { sample_number = len & 0x1f; len = 1; } else if ((len & 0xe0) && !(len & 0x10)) { sample_number = len & 0x0f; len = 2; } else if ((len & 0xf0) && !(len & 0x08)) { sample_number = len & 0x07; len = 3; } else if ((len & 0xf8) && !(len & 0x04)) { sample_number = len & 0x03; len = 4; } else if ((len & 0xfc) && !(len & 0x02)) { sample_number = len & 0x01; len = 5; } else if ((len & 0xfe) && !(len & 0x01)) { sample_number = len & 0x0; len = 6; } else { goto error; } if ((blocking_strategy == 0 && len > 5) || (blocking_strategy == 1 && len > 6)) goto error; while (len > 0) { if (!gst_bit_reader_get_bits_uint8 (&reader, &tmp, 8)) goto need_more_data; if ((tmp & 0xc0) != 0x80) goto error; sample_number <<= 6; sample_number |= (tmp & 0x3f); len--; } } /* calculate real blocksize from the blocksize index */ if (block_size == 0) { goto error; } else if (block_size == 6) { if (!gst_bit_reader_get_bits_uint16 (&reader, &block_size, 8)) goto need_more_data; block_size++; } else if (block_size == 7) { if (!gst_bit_reader_get_bits_uint16 (&reader, &block_size, 16)) goto need_more_data; block_size++; } else { block_size = blocksize_table[block_size]; } /* calculate the real samplerate from the samplerate index */ if (samplerate == 0 && flacparse->samplerate == 0) { goto need_streaminfo; } else if (samplerate < 12) { samplerate = sample_rate_table[samplerate]; } else if (samplerate == 12) { if (!gst_bit_reader_get_bits_uint32 (&reader, &samplerate, 8)) goto need_more_data; samplerate *= 1000; } else if (samplerate == 13) { if (!gst_bit_reader_get_bits_uint32 (&reader, &samplerate, 16)) goto need_more_data; } else if (samplerate == 14) { if (!gst_bit_reader_get_bits_uint32 (&reader, &samplerate, 16)) goto need_more_data; samplerate *= 10; } if (flacparse->samplerate && flacparse->samplerate != samplerate) goto error; /* check crc-8 for the header */ if (!gst_bit_reader_get_bits_uint8 (&reader, &expected_crc, 8)) goto need_more_data; actual_crc = gst_flac_calculate_crc8 (data, (gst_bit_reader_get_pos (&reader) / 8) - 1); if (actual_crc != expected_crc) goto error; /* Sanity check sample number against blocking strategy, as it seems some files claim fixed block size but supply sample numbers, rather than block numbers. */ if (blocking_strategy == 0 && flacparse->block_size != 0) { if (!flacparse->strategy_checked) { if (block_size == sample_number) { GST_WARNING_OBJECT (flacparse, "This file claims fixed block size, " "but seems to be lying: assuming variable block size"); flacparse->force_variable_block_size = TRUE; blocking_strategy = 1; } flacparse->strategy_checked = TRUE; } } /* The FLAC format documentation says: The "blocking strategy" bit determines how to calculate the sample number of the first sample in the frame. If the bit is 0 (fixed-blocksize), the frame header encodes the frame number as above, and the frame's starting sample number will be the frame number times the blocksize. If it is 1 (variable-blocksize), the frame header encodes the frame's starting sample number itself. (In the case of a fixed-blocksize stream, only the last block may be shorter than the stream blocksize; its starting sample number will be calculated as the frame number times the previous frame's blocksize, or zero if it is the first frame). Therefore, when in fixed block size mode, we only update the block size the first time, then reuse that block size for subsequent calls. This will also fix a timestamp problem with the last block's timestamp being miscalculated by scaling the block number by a "wrong" block size. */ if (blocking_strategy == 0) { if (flacparse->block_size != 0) { /* after first block */ if (flacparse->block_size != block_size) { /* TODO: can we know we're on the last frame, to avoid warning ? */ GST_WARNING_OBJECT (flacparse, "Block size is not constant"); block_size = flacparse->block_size; } } } if (set) { flacparse->block_size = block_size; if (!flacparse->samplerate) flacparse->samplerate = samplerate; if (!flacparse->bps) flacparse->bps = bps; if (!flacparse->blocking_strategy) flacparse->blocking_strategy = blocking_strategy; if (!flacparse->channels) flacparse->channels = channels; if (!flacparse->sample_number) flacparse->sample_number = sample_number; GST_DEBUG_OBJECT (flacparse, "Parsed frame at offset %" G_GUINT64_FORMAT ":\n" "Block size: %u\n" "Sample/Frame number: %" G_GUINT64_FORMAT, flacparse->offset, flacparse->block_size, flacparse->sample_number); } if (block_size_ret) *block_size_ret = block_size; return FRAME_HEADER_VALID; need_streaminfo: GST_ERROR_OBJECT (flacparse, "Need STREAMINFO"); return FRAME_HEADER_INVALID; error: return FRAME_HEADER_INVALID; need_more_data: return FRAME_HEADER_MORE_DATA; } static gboolean gst_flac_parse_frame_is_valid (GstFlacParse * flacparse, GstBaseParseFrame * frame, guint * ret) { GstBuffer *buffer; const guint8 *data; guint max, size, remaining; guint i, search_start, search_end; FrameHeaderCheckReturn header_ret; guint16 block_size; buffer = frame->buffer; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < flacparse->min_framesize) goto need_more; header_ret = gst_flac_parse_frame_header_is_valid (flacparse, data, size, TRUE, &block_size); if (header_ret == FRAME_HEADER_INVALID) { *ret = 0; return FALSE; } else if (header_ret == FRAME_HEADER_MORE_DATA) { goto need_more; } /* mind unknown framesize */ search_start = MAX (2, flacparse->min_framesize); if (flacparse->max_framesize) search_end = MIN (size, flacparse->max_framesize + 9 + 2); else search_end = size; search_end -= 2; remaining = size; for (i = search_start; i < search_end; i++, remaining--) { if ((GST_READ_UINT16_BE (data + i) & 0xfffe) == 0xfff8) { header_ret = gst_flac_parse_frame_header_is_valid (flacparse, data + i, remaining, FALSE, NULL); if (header_ret == FRAME_HEADER_VALID) { if (flacparse->check_frame_checksums) { guint16 actual_crc = gst_flac_calculate_crc16 (data, i - 2); guint16 expected_crc = GST_READ_UINT16_BE (data + i - 2); if (actual_crc != expected_crc) continue; } *ret = i; flacparse->block_size = block_size; return TRUE; } else if (header_ret == FRAME_HEADER_MORE_DATA) { goto need_more; } } } /* For the last frame output everything to the end */ if (G_UNLIKELY (GST_BASE_PARSE_DRAINING (flacparse))) { if (flacparse->check_frame_checksums) { guint16 actual_crc = gst_flac_calculate_crc16 (data, size - 2); guint16 expected_crc = GST_READ_UINT16_BE (data + size - 2); if (actual_crc == expected_crc) { *ret = size; flacparse->block_size = block_size; return TRUE; } } else { *ret = size; flacparse->block_size = block_size; return TRUE; } } need_more: max = flacparse->max_framesize + 16; if (max == 16) max = 1 << 24; *ret = MIN (size + 4096, max); return FALSE; } static gboolean gst_flac_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { GstFlacParse *flacparse = GST_FLAC_PARSE (parse); GstBuffer *buffer = frame->buffer; const guint8 *data = GST_BUFFER_DATA (buffer); if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < 4)) return FALSE; if (flacparse->state == GST_FLAC_PARSE_STATE_INIT) { if (memcmp (GST_BUFFER_DATA (buffer), "fLaC", 4) == 0) { GST_DEBUG_OBJECT (flacparse, "fLaC marker found"); *framesize = 4; return TRUE; } else if (data[0] == 0xff && (data[1] >> 2) == 0x3e) { GST_DEBUG_OBJECT (flacparse, "Found headerless FLAC"); /* Minimal size of a frame header */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), 9); flacparse->state = GST_FLAC_PARSE_STATE_GENERATE_HEADERS; *skipsize = 0; return FALSE; } else { GST_DEBUG_OBJECT (flacparse, "fLaC marker not found"); return FALSE; } } else if (flacparse->state == GST_FLAC_PARSE_STATE_HEADERS) { guint size = 4 + ((data[1] << 16) | (data[2] << 8) | (data[3])); GST_DEBUG_OBJECT (flacparse, "Found metadata block of size %u", size); *framesize = size; return TRUE; } else { if ((GST_READ_UINT16_BE (data) & 0xfffe) == 0xfff8) { gboolean ret; guint next; flacparse->offset = GST_BUFFER_OFFSET (buffer); flacparse->blocking_strategy = 0; flacparse->sample_number = 0; GST_DEBUG_OBJECT (flacparse, "Found sync code"); ret = gst_flac_parse_frame_is_valid (flacparse, frame, &next); if (ret) { *framesize = next; return TRUE; } else { /* If we're at EOS and the frame was not valid, drop it! */ if (G_UNLIKELY (GST_BASE_PARSE_DRAINING (flacparse))) { GST_WARNING_OBJECT (flacparse, "EOS"); return FALSE; } if (next == 0) { } else if (next > GST_BUFFER_SIZE (buffer)) { GST_DEBUG_OBJECT (flacparse, "Requesting %u bytes", next); *skipsize = 0; gst_base_parse_set_min_frame_size (parse, next); return FALSE; } else { GST_ERROR_OBJECT (flacparse, "Giving up on invalid frame (%d bytes)", GST_BUFFER_SIZE (buffer)); return FALSE; } } } else { GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); gint off; off = gst_byte_reader_masked_scan_uint32 (&reader, 0xfffc0000, 0xfff80000, 0, GST_BUFFER_SIZE (buffer)); if (off > 0) { GST_DEBUG_OBJECT (parse, "Possible sync at buffer offset %d", off); *skipsize = off; return FALSE; } else { GST_DEBUG_OBJECT (flacparse, "Sync code not found"); *skipsize = GST_BUFFER_SIZE (buffer) - 3; return FALSE; } } } return FALSE; } static gboolean gst_flac_parse_handle_streaminfo (GstFlacParse * flacparse, GstBuffer * buffer) { GstBitReader reader = GST_BIT_READER_INIT_FROM_BUFFER (buffer); if (GST_BUFFER_SIZE (buffer) != 4 + 34) { GST_ERROR_OBJECT (flacparse, "Invalid metablock size for STREAMINFO: %u", GST_BUFFER_SIZE (buffer)); return FALSE; } /* Skip metadata block header */ gst_bit_reader_skip (&reader, 32); if (!gst_bit_reader_get_bits_uint16 (&reader, &flacparse->min_blocksize, 16)) goto error; if (flacparse->min_blocksize < 16) { GST_WARNING_OBJECT (flacparse, "Invalid minimum block size: %u", flacparse->min_blocksize); } if (!gst_bit_reader_get_bits_uint16 (&reader, &flacparse->max_blocksize, 16)) goto error; if (flacparse->max_blocksize < 16) { GST_WARNING_OBJECT (flacparse, "Invalid maximum block size: %u", flacparse->max_blocksize); } if (!gst_bit_reader_get_bits_uint32 (&reader, &flacparse->min_framesize, 24)) goto error; if (!gst_bit_reader_get_bits_uint32 (&reader, &flacparse->max_framesize, 24)) goto error; if (!gst_bit_reader_get_bits_uint32 (&reader, &flacparse->samplerate, 20)) goto error; if (flacparse->samplerate == 0) { GST_ERROR_OBJECT (flacparse, "Invalid sample rate 0"); return FALSE; } if (!gst_bit_reader_get_bits_uint8 (&reader, &flacparse->channels, 3)) goto error; flacparse->channels++; if (flacparse->channels > 8) { GST_ERROR_OBJECT (flacparse, "Invalid number of channels %u", flacparse->channels); return FALSE; } if (!gst_bit_reader_get_bits_uint8 (&reader, &flacparse->bps, 5)) goto error; flacparse->bps++; if (!gst_bit_reader_get_bits_uint64 (&reader, &flacparse->total_samples, 36)) goto error; if (flacparse->total_samples) { gst_base_parse_set_duration (GST_BASE_PARSE (flacparse), GST_FORMAT_DEFAULT, flacparse->total_samples, 0); } GST_DEBUG_OBJECT (flacparse, "STREAMINFO:\n" "\tmin/max blocksize: %u/%u,\n" "\tmin/max framesize: %u/%u,\n" "\tsamplerate: %u,\n" "\tchannels: %u,\n" "\tbits per sample: %u,\n" "\ttotal samples: %" G_GUINT64_FORMAT, flacparse->min_blocksize, flacparse->max_blocksize, flacparse->min_framesize, flacparse->max_framesize, flacparse->samplerate, flacparse->channels, flacparse->bps, flacparse->total_samples); return TRUE; error: GST_ERROR_OBJECT (flacparse, "Failed to read data"); return FALSE; } static gboolean gst_flac_parse_handle_vorbiscomment (GstFlacParse * flacparse, GstBuffer * buffer) { flacparse->tags = gst_tag_list_from_vorbiscomment_buffer (buffer, GST_BUFFER_DATA (buffer), 4, NULL); if (flacparse->tags == NULL) { GST_ERROR_OBJECT (flacparse, "Invalid vorbiscomment block"); } else if (gst_tag_list_is_empty (flacparse->tags)) { gst_tag_list_free (flacparse->tags); flacparse->tags = NULL; } return TRUE; } static gboolean gst_flac_parse_handle_picture (GstFlacParse * flacparse, GstBuffer * buffer) { GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buffer); const guint8 *data = GST_BUFFER_DATA (buffer); guint32 img_len = 0, img_type = 0; guint32 img_mimetype_len = 0, img_description_len = 0; if (!gst_byte_reader_skip (&reader, 4)) goto error; if (!gst_byte_reader_get_uint32_be (&reader, &img_type)) goto error; if (!gst_byte_reader_get_uint32_be (&reader, &img_mimetype_len)) goto error; if (!gst_byte_reader_skip (&reader, img_mimetype_len)) goto error; if (!gst_byte_reader_get_uint32_be (&reader, &img_description_len)) goto error; if (!gst_byte_reader_skip (&reader, img_description_len)) goto error; if (!gst_byte_reader_skip (&reader, 4 * 4)) goto error; if (!gst_byte_reader_get_uint32_be (&reader, &img_len)) goto error; if (!flacparse->tags) flacparse->tags = gst_tag_list_new (); gst_tag_list_add_id3_image (flacparse->tags, data + gst_byte_reader_get_pos (&reader), img_len, img_type); if (gst_tag_list_is_empty (flacparse->tags)) { gst_tag_list_free (flacparse->tags); flacparse->tags = NULL; } return TRUE; error: GST_ERROR_OBJECT (flacparse, "Error reading data"); return FALSE; } static gboolean gst_flac_parse_handle_seektable (GstFlacParse * flacparse, GstBuffer * buffer) { GST_DEBUG_OBJECT (flacparse, "storing seektable"); /* only store for now; * offset of the first frame is needed to get real info */ flacparse->seektable = gst_buffer_ref (buffer); return TRUE; } static void gst_flac_parse_process_seektable (GstFlacParse * flacparse, gint64 boffset) { GstByteReader br; gint64 offset = 0, samples = 0; GST_DEBUG_OBJECT (flacparse, "parsing seektable; base offset %" G_GINT64_FORMAT, boffset); if (boffset <= 0) goto done; gst_byte_reader_init_from_buffer (&br, flacparse->seektable); /* skip header */ if (!gst_byte_reader_skip (&br, 4)) goto done; /* seekpoints */ while (gst_byte_reader_get_remaining (&br)) { if (!gst_byte_reader_get_int64_be (&br, &samples)) break; if (!gst_byte_reader_get_int64_be (&br, &offset)) break; if (!gst_byte_reader_skip (&br, 2)) break; GST_LOG_OBJECT (flacparse, "samples %" G_GINT64_FORMAT " -> offset %" G_GINT64_FORMAT, samples, offset); /* sanity check */ if (G_LIKELY (offset > 0 && samples > 0)) { gst_base_parse_add_index_entry (GST_BASE_PARSE (flacparse), boffset + offset, gst_util_uint64_scale (samples, GST_SECOND, flacparse->samplerate), TRUE, FALSE); } } done: gst_buffer_unref (flacparse->seektable); flacparse->seektable = NULL; } static void _value_array_append_buffer (GValue * array_val, GstBuffer * buf) { GValue value = { 0, }; g_value_init (&value, GST_TYPE_BUFFER); /* copy buffer to avoid problems with circular refcounts */ buf = gst_buffer_copy (buf); /* again, for good measure */ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); gst_value_set_buffer (&value, buf); gst_buffer_unref (buf); gst_value_array_append_value (array_val, &value); g_value_unset (&value); } static gboolean gst_flac_parse_handle_headers (GstFlacParse * flacparse) { GstBuffer *vorbiscomment = NULL; GstBuffer *streaminfo = NULL; GstBuffer *marker = NULL; GValue array = { 0, }; GstCaps *caps; GList *l; gboolean res = TRUE; caps = gst_caps_new_simple ("audio/x-flac", "channels", G_TYPE_INT, flacparse->channels, "framed", G_TYPE_BOOLEAN, TRUE, "rate", G_TYPE_INT, flacparse->samplerate, NULL); if (!flacparse->headers) goto push_headers; for (l = flacparse->headers; l; l = l->next) { GstBuffer *header = l->data; const guint8 *data = GST_BUFFER_DATA (header); guint size = GST_BUFFER_SIZE (header); GST_BUFFER_FLAG_SET (header, GST_BUFFER_FLAG_IN_CAPS); if (size == 4 && memcmp (data, "fLaC", 4) == 0) { marker = header; } else if (size > 1 && (data[0] & 0x7f) == 0) { streaminfo = header; } else if (size > 1 && (data[0] & 0x7f) == 4) { vorbiscomment = header; } } if (marker == NULL || streaminfo == NULL || vorbiscomment == NULL) { GST_WARNING_OBJECT (flacparse, "missing header %p %p %p, muxing into container " "formats may be broken", marker, streaminfo, vorbiscomment); goto push_headers; } g_value_init (&array, GST_TYPE_ARRAY); /* add marker including STREAMINFO header */ { GstBuffer *buf; guint16 num; /* minus one for the marker that is merged with streaminfo here */ num = g_list_length (flacparse->headers) - 1; buf = gst_buffer_new_and_alloc (13 + GST_BUFFER_SIZE (streaminfo)); GST_BUFFER_DATA (buf)[0] = 0x7f; memcpy (GST_BUFFER_DATA (buf) + 1, "FLAC", 4); GST_BUFFER_DATA (buf)[5] = 0x01; /* mapping version major */ GST_BUFFER_DATA (buf)[6] = 0x00; /* mapping version minor */ GST_BUFFER_DATA (buf)[7] = (num & 0xFF00) >> 8; GST_BUFFER_DATA (buf)[8] = (num & 0x00FF) >> 0; memcpy (GST_BUFFER_DATA (buf) + 9, "fLaC", 4); memcpy (GST_BUFFER_DATA (buf) + 13, GST_BUFFER_DATA (streaminfo), GST_BUFFER_SIZE (streaminfo)); _value_array_append_buffer (&array, buf); gst_buffer_unref (buf); } /* add VORBISCOMMENT header */ _value_array_append_buffer (&array, vorbiscomment); /* add other headers, if there are any */ for (l = flacparse->headers; l; l = l->next) { if (GST_BUFFER_CAST (l->data) != marker && GST_BUFFER_CAST (l->data) != streaminfo && GST_BUFFER_CAST (l->data) != vorbiscomment) { _value_array_append_buffer (&array, GST_BUFFER_CAST (l->data)); } } gst_structure_set_value (gst_caps_get_structure (caps, 0), "streamheader", &array); g_value_unset (&array); push_headers: gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (GST_BASE_PARSE (flacparse)), caps); gst_caps_unref (caps); /* push header buffers; update caps, so when we push the first buffer the * negotiated caps will change to caps that include the streamheader field */ while (flacparse->headers) { GstBuffer *buf = GST_BUFFER (flacparse->headers->data); GstFlowReturn ret; GstBaseParseFrame frame; flacparse->headers = g_list_delete_link (flacparse->headers, flacparse->headers); buf = gst_buffer_make_metadata_writable (buf); gst_buffer_set_caps (buf, GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (GST_BASE_PARSE (flacparse)))); /* init, set and give away frame */ gst_base_parse_frame_init (&frame); frame.buffer = buf; frame.overhead = -1; ret = gst_base_parse_push_frame (GST_BASE_PARSE (flacparse), &frame); if (ret != GST_FLOW_OK) { res = FALSE; break; } } g_list_foreach (flacparse->headers, (GFunc) gst_mini_object_unref, NULL); g_list_free (flacparse->headers); flacparse->headers = NULL; return res; } static gboolean gst_flac_parse_generate_headers (GstFlacParse * flacparse) { GstBuffer *marker, *streaminfo, *vorbiscomment; guint8 *data; marker = gst_buffer_new_and_alloc (4); memcpy (GST_BUFFER_DATA (marker), "fLaC", 4); GST_BUFFER_TIMESTAMP (marker) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (marker) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (marker) = 0; GST_BUFFER_OFFSET_END (marker) = 0; flacparse->headers = g_list_append (flacparse->headers, marker); streaminfo = gst_buffer_new_and_alloc (4 + 34); data = GST_BUFFER_DATA (streaminfo); memset (data, 0, 4 + 34); /* metadata block header */ data[0] = 0x00; /* is_last = 0; type = 0; */ data[1] = 0x00; /* length = 34; */ data[2] = 0x00; data[3] = 0x22; /* streaminfo */ data[4] = (flacparse->block_size >> 8) & 0xff; /* min blocksize = blocksize; */ data[5] = (flacparse->block_size) & 0xff; data[6] = (flacparse->block_size >> 8) & 0xff; /* max blocksize = blocksize; */ data[7] = (flacparse->block_size) & 0xff; data[8] = 0x00; /* min framesize = 0; */ data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; /* max framesize = 0; */ data[12] = 0x00; data[13] = 0x00; data[14] = (flacparse->samplerate >> 12) & 0xff; data[15] = (flacparse->samplerate >> 4) & 0xff; data[16] = (flacparse->samplerate >> 0) & 0xf0; data[16] |= (flacparse->channels - 1) << 1; data[16] |= ((flacparse->bps - 1) >> 4) & 0x01; data[17] = (((flacparse->bps - 1)) & 0x0f) << 4; { gint64 duration; GstFormat fmt = GST_FORMAT_TIME; if (gst_pad_query_peer_duration (GST_BASE_PARSE_SINK_PAD (GST_BASE_PARSE (flacparse)), &fmt, &duration) && fmt == GST_FORMAT_TIME) { duration = GST_CLOCK_TIME_TO_FRAMES (duration, flacparse->samplerate); data[17] |= (duration >> 32) & 0xff; data[18] |= (duration >> 24) & 0xff; data[19] |= (duration >> 16) & 0xff; data[20] |= (duration >> 8) & 0xff; data[21] |= (duration >> 0) & 0xff; } } /* MD5 = 0; */ GST_BUFFER_TIMESTAMP (streaminfo) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (streaminfo) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (streaminfo) = 0; GST_BUFFER_OFFSET_END (streaminfo) = 0; flacparse->headers = g_list_append (flacparse->headers, streaminfo); /* empty vorbiscomment */ { GstTagList *taglist = gst_tag_list_new (); guchar header[4]; guint size; header[0] = 0x84; /* is_last = 1; type = 4; */ vorbiscomment = gst_tag_list_to_vorbiscomment_buffer (taglist, header, sizeof (header), NULL); gst_tag_list_free (taglist); /* Get rid of framing bit */ if (GST_BUFFER_DATA (vorbiscomment)[GST_BUFFER_SIZE (vorbiscomment) - 1] == 1) { GstBuffer *sub; sub = gst_buffer_create_sub (vorbiscomment, 0, GST_BUFFER_SIZE (vorbiscomment) - 1); gst_buffer_unref (vorbiscomment); vorbiscomment = sub; } size = GST_BUFFER_SIZE (vorbiscomment) - 4; GST_BUFFER_DATA (vorbiscomment)[1] = ((size & 0xFF0000) >> 16); GST_BUFFER_DATA (vorbiscomment)[2] = ((size & 0x00FF00) >> 8); GST_BUFFER_DATA (vorbiscomment)[3] = (size & 0x0000FF); GST_BUFFER_TIMESTAMP (vorbiscomment) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (vorbiscomment) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (vorbiscomment) = 0; GST_BUFFER_OFFSET_END (vorbiscomment) = 0; flacparse->headers = g_list_append (flacparse->headers, vorbiscomment); } return TRUE; } static GstFlowReturn gst_flac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstFlacParse *flacparse = GST_FLAC_PARSE (parse); GstBuffer *buffer = frame->buffer; const guint8 *data = GST_BUFFER_DATA (buffer); if (flacparse->state == GST_FLAC_PARSE_STATE_INIT) { GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (buffer) = 0; GST_BUFFER_OFFSET_END (buffer) = 0; /* 32 bits metadata block */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), 4); flacparse->state = GST_FLAC_PARSE_STATE_HEADERS; flacparse->headers = g_list_append (flacparse->headers, gst_buffer_ref (buffer)); return GST_BASE_PARSE_FLOW_DROPPED; } else if (flacparse->state == GST_FLAC_PARSE_STATE_HEADERS) { gboolean is_last = ((data[0] & 0x80) == 0x80); guint type = (data[0] & 0x7F); if (type == 127) { GST_WARNING_OBJECT (flacparse, "Invalid metadata block type"); return GST_BASE_PARSE_FLOW_DROPPED; } GST_DEBUG_OBJECT (flacparse, "Handling metadata block of type %u", type); switch (type) { case 0: /* STREAMINFO */ if (!gst_flac_parse_handle_streaminfo (flacparse, buffer)) return GST_FLOW_ERROR; break; case 3: /* SEEKTABLE */ if (!gst_flac_parse_handle_seektable (flacparse, buffer)) return GST_FLOW_ERROR; break; case 4: /* VORBIS_COMMENT */ if (!gst_flac_parse_handle_vorbiscomment (flacparse, buffer)) return GST_FLOW_ERROR; break; case 6: /* PICTURE */ if (!gst_flac_parse_handle_picture (flacparse, buffer)) return GST_FLOW_ERROR; break; case 1: /* PADDING */ case 2: /* APPLICATION */ case 5: /* CUESHEET */ default: /* RESERVED */ break; } GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (buffer) = 0; GST_BUFFER_OFFSET_END (buffer) = 0; flacparse->headers = g_list_append (flacparse->headers, gst_buffer_ref (buffer)); if (is_last) { if (!gst_flac_parse_handle_headers (flacparse)) return GST_FLOW_ERROR; /* Minimal size of a frame header */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), MAX (9, flacparse->min_framesize)); flacparse->state = GST_FLAC_PARSE_STATE_DATA; } /* DROPPED because we pushed already or will push all headers manually */ return GST_BASE_PARSE_FLOW_DROPPED; } else { if (flacparse->offset != GST_BUFFER_OFFSET (buffer)) { FrameHeaderCheckReturn ret; flacparse->offset = GST_BUFFER_OFFSET (buffer); ret = gst_flac_parse_frame_header_is_valid (flacparse, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), TRUE, NULL); if (ret != FRAME_HEADER_VALID) { GST_ERROR_OBJECT (flacparse, "Baseclass didn't provide a complete frame"); return GST_FLOW_ERROR; } } if (flacparse->block_size == 0) { GST_ERROR_OBJECT (flacparse, "Unparsed frame"); return GST_FLOW_ERROR; } if (flacparse->seektable) gst_flac_parse_process_seektable (flacparse, GST_BUFFER_OFFSET (buffer)); if (flacparse->state == GST_FLAC_PARSE_STATE_GENERATE_HEADERS) { if (flacparse->blocking_strategy == 1) { GST_WARNING_OBJECT (flacparse, "Generating headers for variable blocksize streams not supported"); if (!gst_flac_parse_handle_headers (flacparse)) return GST_FLOW_ERROR; } else { GST_DEBUG_OBJECT (flacparse, "Generating headers"); if (!gst_flac_parse_generate_headers (flacparse)) return GST_FLOW_ERROR; if (!gst_flac_parse_handle_headers (flacparse)) return GST_FLOW_ERROR; } flacparse->state = GST_FLAC_PARSE_STATE_DATA; } /* also cater for oggmux metadata */ if (flacparse->blocking_strategy == 0) { GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (flacparse->sample_number, flacparse->block_size * GST_SECOND, flacparse->samplerate); GST_BUFFER_OFFSET_END (buffer) = flacparse->sample_number * flacparse->block_size + flacparse->block_size; } else { GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (flacparse->sample_number, GST_SECOND, flacparse->samplerate); GST_BUFFER_OFFSET_END (buffer) = flacparse->sample_number + flacparse->block_size; } GST_BUFFER_OFFSET (buffer) = gst_util_uint64_scale (GST_BUFFER_OFFSET_END (buffer), GST_SECOND, flacparse->samplerate); GST_BUFFER_DURATION (buffer) = GST_BUFFER_OFFSET (buffer) - GST_BUFFER_TIMESTAMP (buffer); /* To simplify, we just assume that it's a fixed size header and ignore * subframe headers. The first could lead us to being off by 88 bits and * the second even less, so the total inaccuracy is negligible. */ frame->overhead = 7; /* Minimal size of a frame header */ gst_base_parse_set_min_frame_size (GST_BASE_PARSE (flacparse), MAX (9, flacparse->min_framesize)); flacparse->offset = -1; flacparse->blocking_strategy = 0; flacparse->sample_number = 0; return GST_FLOW_OK; } } static GstFlowReturn gst_flac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstFlacParse *flacparse = GST_FLAC_PARSE (parse); /* Push tags */ if (flacparse->tags) { gst_element_found_tags (GST_ELEMENT (flacparse), flacparse->tags); flacparse->tags = NULL; } frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP; return GST_FLOW_OK; } static gboolean gst_flac_parse_convert (GstBaseParse * parse, GstFormat src_format, gint64 src_value, GstFormat dest_format, gint64 * dest_value) { GstFlacParse *flacparse = GST_FLAC_PARSE (parse); if (flacparse->samplerate > 0) { if (src_format == GST_FORMAT_DEFAULT && dest_format == GST_FORMAT_TIME) { if (src_value != -1) *dest_value = gst_util_uint64_scale (src_value, GST_SECOND, flacparse->samplerate); else *dest_value = -1; return TRUE; } else if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_DEFAULT) { if (src_value != -1) *dest_value = gst_util_uint64_scale (src_value, flacparse->samplerate, GST_SECOND); else *dest_value = -1; return TRUE; } } return GST_BASE_PARSE_CLASS (parent_class)->convert (parse, src_format, src_value, dest_format, dest_value); } static GstCaps * gst_flac_parse_get_sink_caps (GstBaseParse * parse) { GstCaps *peercaps; GstCaps *res; peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; /* Remove the framed field */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_remove_field (s, "framed"); } res = gst_caps_intersect_full (peercaps, gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); } else { res = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse))); } return res; } gst-plugins-good-0.10.31/gst/audioparsers/Makefile.in0000644000175000017500000010646411720560230017351 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/audioparsers DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstaudioparsers_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstaudioparsers_la_OBJECTS = \ libgstaudioparsers_la-gstaacparse.lo \ libgstaudioparsers_la-gstamrparse.lo \ libgstaudioparsers_la-gstac3parse.lo \ libgstaudioparsers_la-gstdcaparse.lo \ libgstaudioparsers_la-gstflacparse.lo \ libgstaudioparsers_la-gstmpegaudioparse.lo \ libgstaudioparsers_la-plugin.lo libgstaudioparsers_la_OBJECTS = $(am_libgstaudioparsers_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstaudioparsers_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) \ $(libgstaudioparsers_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstaudioparsers_la_SOURCES) DIST_SOURCES = $(libgstaudioparsers_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstaudioparsers.la libgstaudioparsers_la_SOURCES = \ gstaacparse.c gstamrparse.c gstac3parse.c \ gstdcaparse.c gstflacparse.c gstmpegaudioparse.c \ plugin.c libgstaudioparsers_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstaudioparsers_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) libgstaudioparsers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaudioparsers_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstaacparse.h gstamrparse.h gstac3parse.h \ gstdcaparse.h gstflacparse.h gstmpegaudioparse.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/audioparsers/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/audioparsers/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstaudioparsers.la: $(libgstaudioparsers_la_OBJECTS) $(libgstaudioparsers_la_DEPENDENCIES) $(EXTRA_libgstaudioparsers_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstaudioparsers_la_LINK) -rpath $(plugindir) $(libgstaudioparsers_la_OBJECTS) $(libgstaudioparsers_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstaacparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstac3parse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstamrparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstflacparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudioparsers_la-plugin.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstaudioparsers_la-gstaacparse.lo: gstaacparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstaacparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstaacparse.Tpo -c -o libgstaudioparsers_la-gstaacparse.lo `test -f 'gstaacparse.c' || echo '$(srcdir)/'`gstaacparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstaacparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstaacparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaacparse.c' object='libgstaudioparsers_la-gstaacparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstaacparse.lo `test -f 'gstaacparse.c' || echo '$(srcdir)/'`gstaacparse.c libgstaudioparsers_la-gstamrparse.lo: gstamrparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstamrparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstamrparse.Tpo -c -o libgstaudioparsers_la-gstamrparse.lo `test -f 'gstamrparse.c' || echo '$(srcdir)/'`gstamrparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstamrparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstamrparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstamrparse.c' object='libgstaudioparsers_la-gstamrparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstamrparse.lo `test -f 'gstamrparse.c' || echo '$(srcdir)/'`gstamrparse.c libgstaudioparsers_la-gstac3parse.lo: gstac3parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstac3parse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstac3parse.Tpo -c -o libgstaudioparsers_la-gstac3parse.lo `test -f 'gstac3parse.c' || echo '$(srcdir)/'`gstac3parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstac3parse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstac3parse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstac3parse.c' object='libgstaudioparsers_la-gstac3parse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstac3parse.lo `test -f 'gstac3parse.c' || echo '$(srcdir)/'`gstac3parse.c libgstaudioparsers_la-gstdcaparse.lo: gstdcaparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstdcaparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Tpo -c -o libgstaudioparsers_la-gstdcaparse.lo `test -f 'gstdcaparse.c' || echo '$(srcdir)/'`gstdcaparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstdcaparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdcaparse.c' object='libgstaudioparsers_la-gstdcaparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstdcaparse.lo `test -f 'gstdcaparse.c' || echo '$(srcdir)/'`gstdcaparse.c libgstaudioparsers_la-gstflacparse.lo: gstflacparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstflacparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstflacparse.Tpo -c -o libgstaudioparsers_la-gstflacparse.lo `test -f 'gstflacparse.c' || echo '$(srcdir)/'`gstflacparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstflacparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstflacparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflacparse.c' object='libgstaudioparsers_la-gstflacparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstflacparse.lo `test -f 'gstflacparse.c' || echo '$(srcdir)/'`gstflacparse.c libgstaudioparsers_la-gstmpegaudioparse.lo: gstmpegaudioparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-gstmpegaudioparse.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Tpo -c -o libgstaudioparsers_la-gstmpegaudioparse.lo `test -f 'gstmpegaudioparse.c' || echo '$(srcdir)/'`gstmpegaudioparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Tpo $(DEPDIR)/libgstaudioparsers_la-gstmpegaudioparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmpegaudioparse.c' object='libgstaudioparsers_la-gstmpegaudioparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-gstmpegaudioparse.lo `test -f 'gstmpegaudioparse.c' || echo '$(srcdir)/'`gstmpegaudioparse.c libgstaudioparsers_la-plugin.lo: plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -MT libgstaudioparsers_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstaudioparsers_la-plugin.Tpo -c -o libgstaudioparsers_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudioparsers_la-plugin.Tpo $(DEPDIR)/libgstaudioparsers_la-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstaudioparsers_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudioparsers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudioparsers_la_CFLAGS) $(CFLAGS) -c -o libgstaudioparsers_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/audioparsers/gstac3parse.c0000644000175000017500000005107511677341655017707 00000000000000/* GStreamer AC3 parser * Copyright (C) 2009 Tim-Philipp Müller * Copyright (C) 2009 Mark Nauwelaerts * Copyright (C) 2009 Nokia Corporation. All rights reserved. * Contact: Stefan Kost * * 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-ac3parse * @short_description: AC3 parser * @see_also: #GstAmrParse, #GstAACParse * * This is an AC3 parser. * * * Example launch line * |[ * gst-launch filesrc location=abc.ac3 ! ac3parse ! a52dec ! audioresample ! audioconvert ! autoaudiosink * ]| * */ /* TODO: * - add support for audio/x-private1-ac3 as well * - should accept framed and unframed input (needs decodebin fixes first) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstac3parse.h" #include #include GST_DEBUG_CATEGORY_STATIC (ac3_parse_debug); #define GST_CAT_DEFAULT ac3_parse_debug static const struct { const guint bit_rate; /* nominal bit rate */ const guint frame_size[3]; /* frame size for 32kHz, 44kHz, and 48kHz */ } frmsizcod_table[38] = { { 32, { 64, 69, 96}}, { 32, { 64, 70, 96}}, { 40, { 80, 87, 120}}, { 40, { 80, 88, 120}}, { 48, { 96, 104, 144}}, { 48, { 96, 105, 144}}, { 56, { 112, 121, 168}}, { 56, { 112, 122, 168}}, { 64, { 128, 139, 192}}, { 64, { 128, 140, 192}}, { 80, { 160, 174, 240}}, { 80, { 160, 175, 240}}, { 96, { 192, 208, 288}}, { 96, { 192, 209, 288}}, { 112, { 224, 243, 336}}, { 112, { 224, 244, 336}}, { 128, { 256, 278, 384}}, { 128, { 256, 279, 384}}, { 160, { 320, 348, 480}}, { 160, { 320, 349, 480}}, { 192, { 384, 417, 576}}, { 192, { 384, 418, 576}}, { 224, { 448, 487, 672}}, { 224, { 448, 488, 672}}, { 256, { 512, 557, 768}}, { 256, { 512, 558, 768}}, { 320, { 640, 696, 960}}, { 320, { 640, 697, 960}}, { 384, { 768, 835, 1152}}, { 384, { 768, 836, 1152}}, { 448, { 896, 975, 1344}}, { 448, { 896, 976, 1344}}, { 512, { 1024, 1114, 1536}}, { 512, { 1024, 1115, 1536}}, { 576, { 1152, 1253, 1728}}, { 576, { 1152, 1254, 1728}}, { 640, { 1280, 1393, 1920}}, { 640, { 1280, 1394, 1920}} }; static const guint fscod_rates[4] = { 48000, 44100, 32000, 0 }; static const guint acmod_chans[8] = { 2, 1, 2, 3, 3, 4, 4, 5 }; static const guint numblks[4] = { 1, 2, 3, 6 }; static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-ac3, framed = (boolean) true, " " channels = (int) [ 1, 6 ], rate = (int) [ 8000, 48000 ], " " alignment = (string) { iec61937, frame}; " "audio/x-eac3, framed = (boolean) true, " " channels = (int) [ 1, 6 ], rate = (int) [ 8000, 48000 ], " " alignment = (string) { iec61937, frame}; ")); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-ac3; " "audio/x-eac3; " "audio/ac3")); static void gst_ac3_parse_finalize (GObject * object); static gboolean gst_ac3_parse_start (GstBaseParse * parse); static gboolean gst_ac3_parse_stop (GstBaseParse * parse); static gboolean gst_ac3_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * size, gint * skipsize); static GstFlowReturn gst_ac3_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame); static gboolean gst_ac3_parse_src_event (GstBaseParse * parse, GstEvent * event); static GstCaps *gst_ac3_parse_get_sink_caps (GstBaseParse * parse); GST_BOILERPLATE (GstAc3Parse, gst_ac3_parse, GstBaseParse, GST_TYPE_BASE_PARSE); static void gst_ac3_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "AC3 audio stream parser", "Codec/Parser/Converter/Audio", "AC3 parser", "Tim-Philipp Müller "); } static void gst_ac3_parse_class_init (GstAc3ParseClass * klass) { GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (ac3_parse_debug, "ac3parse", 0, "AC3 audio stream parser"); object_class->finalize = gst_ac3_parse_finalize; parse_class->start = GST_DEBUG_FUNCPTR (gst_ac3_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_ac3_parse_stop); parse_class->check_valid_frame = GST_DEBUG_FUNCPTR (gst_ac3_parse_check_valid_frame); parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_ac3_parse_parse_frame); parse_class->src_event = GST_DEBUG_FUNCPTR (gst_ac3_parse_src_event); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_ac3_parse_get_sink_caps); } static void gst_ac3_parse_reset (GstAc3Parse * ac3parse) { ac3parse->channels = -1; ac3parse->sample_rate = -1; ac3parse->blocks = -1; ac3parse->eac = FALSE; g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_NONE); } static void gst_ac3_parse_init (GstAc3Parse * ac3parse, GstAc3ParseClass * klass) { gst_base_parse_set_min_frame_size (GST_BASE_PARSE (ac3parse), 6); gst_ac3_parse_reset (ac3parse); } static void gst_ac3_parse_finalize (GObject * object) { G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_ac3_parse_start (GstBaseParse * parse) { GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); GST_DEBUG_OBJECT (parse, "starting"); gst_ac3_parse_reset (ac3parse); return TRUE; } static gboolean gst_ac3_parse_stop (GstBaseParse * parse) { GST_DEBUG_OBJECT (parse, "stopping"); return TRUE; } static void gst_ac3_parse_set_alignment (GstAc3Parse * ac3parse, gboolean eac) { GstCaps *caps; GstStructure *st; const gchar *str = NULL; int i; if (G_LIKELY (!eac)) goto done; caps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (ac3parse)); if (!caps) goto done; for (i = 0; i < gst_caps_get_size (caps); i++) { st = gst_caps_get_structure (caps, i); if (!g_str_equal (gst_structure_get_name (st), "audio/x-eac3")) continue; if ((str = gst_structure_get_string (st, "alignment"))) { if (g_str_equal (str, "iec61937")) { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_IEC61937); GST_DEBUG_OBJECT (ac3parse, "picked iec61937 alignment"); } else if (g_str_equal (str, "frame") == 0) { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_DEBUG_OBJECT (ac3parse, "picked frame alignment"); } else { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_WARNING_OBJECT (ac3parse, "unknown alignment: %s", str); } break; } } if (caps) gst_caps_unref (caps); done: /* default */ if (ac3parse->align == GST_AC3_PARSE_ALIGN_NONE) { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_DEBUG_OBJECT (ac3parse, "picked syncframe alignment"); } } static gboolean gst_ac3_parse_frame_header_ac3 (GstAc3Parse * ac3parse, GstBuffer * buf, gint skip, guint * frame_size, guint * rate, guint * chans, guint * blks, guint * sid) { GstBitReader bits = GST_BIT_READER_INIT_FROM_BUFFER (buf); guint8 fscod, frmsizcod, bsid, acmod, lfe_on, rate_scale; GST_LOG_OBJECT (ac3parse, "parsing ac3"); gst_bit_reader_skip_unchecked (&bits, skip * 8); gst_bit_reader_skip_unchecked (&bits, 16 + 16); fscod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); frmsizcod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 6); if (G_UNLIKELY (fscod == 3 || frmsizcod >= G_N_ELEMENTS (frmsizcod_table))) { GST_DEBUG_OBJECT (ac3parse, "bad fscod=%d frmsizcod=%d", fscod, frmsizcod); return FALSE; } bsid = gst_bit_reader_get_bits_uint8_unchecked (&bits, 5); gst_bit_reader_skip_unchecked (&bits, 3); /* bsmod */ acmod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 3); /* spec not quite clear here: decoder should decode if less than 8, * but seemingly only defines 6 and 8 cases */ /* Files with 9 and 10 happen, and seem to comply with the <= 8 format, so let them through. The spec says nothing about 9 and 10 */ if (bsid > 10) { GST_DEBUG_OBJECT (ac3parse, "unexpected bsid=%d", bsid); return FALSE; } else if (bsid != 8 && bsid != 6) { GST_DEBUG_OBJECT (ac3parse, "undefined bsid=%d", bsid); } if ((acmod & 0x1) && (acmod != 0x1)) /* 3 front channels */ gst_bit_reader_skip_unchecked (&bits, 2); if ((acmod & 0x4)) /* if a surround channel exists */ gst_bit_reader_skip_unchecked (&bits, 2); if (acmod == 0x2) /* if in 2/0 mode */ gst_bit_reader_skip_unchecked (&bits, 2); lfe_on = gst_bit_reader_get_bits_uint8_unchecked (&bits, 1); /* 6/8->0, 9->1, 10->2, see http://matroska.org/technical/specs/codecid/index.html */ rate_scale = (CLAMP (bsid, 8, 10) - 8); if (frame_size) *frame_size = frmsizcod_table[frmsizcod].frame_size[fscod] * 2; if (rate) *rate = fscod_rates[fscod] >> rate_scale; if (chans) *chans = acmod_chans[acmod] + lfe_on; if (blks) *blks = 6; if (sid) *sid = 0; return TRUE; } static gboolean gst_ac3_parse_frame_header_eac3 (GstAc3Parse * ac3parse, GstBuffer * buf, gint skip, guint * frame_size, guint * rate, guint * chans, guint * blks, guint * sid) { GstBitReader bits = GST_BIT_READER_INIT_FROM_BUFFER (buf); guint16 frmsiz, sample_rate, blocks; guint8 strmtyp, fscod, fscod2, acmod, lfe_on, strmid, numblkscod; GST_LOG_OBJECT (ac3parse, "parsing e-ac3"); gst_bit_reader_skip_unchecked (&bits, skip * 8); gst_bit_reader_skip_unchecked (&bits, 16); strmtyp = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* strmtyp */ if (G_UNLIKELY (strmtyp == 3)) { GST_DEBUG_OBJECT (ac3parse, "bad strmtyp %d", strmtyp); return FALSE; } strmid = gst_bit_reader_get_bits_uint8_unchecked (&bits, 3); /* substreamid */ frmsiz = gst_bit_reader_get_bits_uint16_unchecked (&bits, 11); /* frmsiz */ fscod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* fscod */ if (fscod == 3) { fscod2 = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* fscod2 */ if (G_UNLIKELY (fscod2 == 3)) { GST_DEBUG_OBJECT (ac3parse, "invalid fscod2"); return FALSE; } sample_rate = fscod_rates[fscod2] / 2; blocks = 6; } else { numblkscod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 2); /* numblkscod */ sample_rate = fscod_rates[fscod]; blocks = numblks[numblkscod]; } acmod = gst_bit_reader_get_bits_uint8_unchecked (&bits, 3); /* acmod */ lfe_on = gst_bit_reader_get_bits_uint8_unchecked (&bits, 1); /* lfeon */ gst_bit_reader_skip_unchecked (&bits, 5); /* bsid */ if (frame_size) *frame_size = (frmsiz + 1) * 2; if (rate) *rate = sample_rate; if (chans) *chans = acmod_chans[acmod] + lfe_on; if (blks) *blks = blocks; if (sid) *sid = (strmtyp & 0x1) << 3 | strmid; return TRUE; } static gboolean gst_ac3_parse_frame_header (GstAc3Parse * parse, GstBuffer * buf, gint skip, guint * framesize, guint * rate, guint * chans, guint * blocks, guint * sid, gboolean * eac) { GstBitReader bits = GST_BIT_READER_INIT_FROM_BUFFER (buf); guint16 sync; guint8 bsid; GST_MEMDUMP_OBJECT (parse, "AC3 frame sync", GST_BUFFER_DATA (buf), 16); gst_bit_reader_skip_unchecked (&bits, skip * 8); sync = gst_bit_reader_get_bits_uint16_unchecked (&bits, 16); gst_bit_reader_skip_unchecked (&bits, 16 + 8); bsid = gst_bit_reader_peek_bits_uint8_unchecked (&bits, 5); if (G_UNLIKELY (sync != 0x0b77)) return FALSE; GST_LOG_OBJECT (parse, "bsid = %d", bsid); if (bsid <= 10) { if (eac) *eac = FALSE; return gst_ac3_parse_frame_header_ac3 (parse, buf, skip, framesize, rate, chans, blocks, sid); } else if (bsid <= 16) { if (eac) *eac = TRUE; return gst_ac3_parse_frame_header_eac3 (parse, buf, skip, framesize, rate, chans, blocks, sid); } else { GST_DEBUG_OBJECT (parse, "unexpected bsid %d", bsid); return FALSE; } } static gboolean gst_ac3_parse_check_valid_frame (GstBaseParse * parse, GstBaseParseFrame * frame, guint * framesize, gint * skipsize) { GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); GstBuffer *buf = frame->buffer; GstByteReader reader = GST_BYTE_READER_INIT_FROM_BUFFER (buf); gint off; gboolean lost_sync, draining, eac, more = FALSE; guint frmsiz, blocks, sid; gint have_blocks = 0; if (G_UNLIKELY (GST_BUFFER_SIZE (buf) < 6)) return FALSE; off = gst_byte_reader_masked_scan_uint32 (&reader, 0xffff0000, 0x0b770000, 0, GST_BUFFER_SIZE (buf)); GST_LOG_OBJECT (parse, "possible sync at buffer offset %d", off); /* didn't find anything that looks like a sync word, skip */ if (off < 0) { *skipsize = GST_BUFFER_SIZE (buf) - 3; return FALSE; } /* possible frame header, but not at offset 0? skip bytes before sync */ if (off > 0) { *skipsize = off; return FALSE; } /* make sure the values in the frame header look sane */ if (!gst_ac3_parse_frame_header (ac3parse, buf, 0, &frmsiz, NULL, NULL, &blocks, &sid, &eac)) { *skipsize = off + 2; return FALSE; } *framesize = frmsiz; if (G_UNLIKELY (g_atomic_int_get (&ac3parse->align) == GST_AC3_PARSE_ALIGN_NONE)) gst_ac3_parse_set_alignment (ac3parse, eac); GST_LOG_OBJECT (parse, "got frame"); lost_sync = GST_BASE_PARSE_LOST_SYNC (parse); draining = GST_BASE_PARSE_DRAINING (parse); if (g_atomic_int_get (&ac3parse->align) == GST_AC3_PARSE_ALIGN_IEC61937) { /* We need 6 audio blocks from each substream, so we keep going forwards * till we have it */ g_assert (blocks > 0); GST_LOG_OBJECT (ac3parse, "Need %d frames before pushing", 6 / blocks); if (sid != 0) { /* We need the first substream to be the one with id 0 */ GST_LOG_OBJECT (ac3parse, "Skipping till we find sid 0"); *skipsize = off + 2; return FALSE; } *framesize = 0; /* Loop till we have 6 blocks per substream */ for (have_blocks = 0; !more && have_blocks < 6; have_blocks += blocks) { /* Loop till we get one frame from each substream */ do { *framesize += frmsiz; if (!gst_byte_reader_skip (&reader, frmsiz) || GST_BUFFER_SIZE (buf) < (*framesize + 6)) { more = TRUE; break; } if (!gst_ac3_parse_frame_header (ac3parse, buf, *framesize, &frmsiz, NULL, NULL, NULL, &sid, &eac)) { *skipsize = off + 2; return FALSE; } } while (sid); } /* We're now at the next frame, so no need to skip if resyncing */ frmsiz = 0; } if (lost_sync && !draining) { guint16 word = 0; GST_DEBUG_OBJECT (ac3parse, "resyncing; checking next frame syncword"); if (more || !gst_byte_reader_skip (&reader, frmsiz) || !gst_byte_reader_get_uint16_be (&reader, &word)) { GST_DEBUG_OBJECT (ac3parse, "... but not sufficient data"); gst_base_parse_set_min_frame_size (parse, *framesize + 6); *skipsize = 0; return FALSE; } else { if (word != 0x0b77) { GST_DEBUG_OBJECT (ac3parse, "0x%x not OK", word); *skipsize = off + 2; return FALSE; } else { /* ok, got sync now, let's assume constant frame size */ gst_base_parse_set_min_frame_size (parse, *framesize); } } } return TRUE; } static GstFlowReturn gst_ac3_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); GstBuffer *buf = frame->buffer; guint fsize, rate, chans, blocks, sid; gboolean eac, update_rate = FALSE; if (!gst_ac3_parse_frame_header (ac3parse, buf, 0, &fsize, &rate, &chans, &blocks, &sid, &eac)) goto broken_header; GST_LOG_OBJECT (parse, "size: %u, blocks: %u, rate: %u, chans: %u", fsize, blocks, rate, chans); if (G_UNLIKELY (sid)) { /* dependent frame, no need to (ac)count for or consider further */ GST_LOG_OBJECT (parse, "sid: %d", sid); frame->flags |= GST_BASE_PARSE_FRAME_FLAG_NO_FRAME; /* TODO maybe also mark as DELTA_UNIT, * if that does not surprise baseparse elsewhere */ /* occupies same time space as previous base frame */ if (G_LIKELY (GST_BUFFER_TIMESTAMP (buf) >= GST_BUFFER_DURATION (buf))) GST_BUFFER_TIMESTAMP (buf) -= GST_BUFFER_DURATION (buf); /* only return if we already arranged for caps */ if (G_LIKELY (ac3parse->sample_rate > 0)) return GST_FLOW_OK; } if (G_UNLIKELY (ac3parse->sample_rate != rate || ac3parse->channels != chans || ac3parse->eac != eac)) { GstCaps *caps = gst_caps_new_simple (eac ? "audio/x-eac3" : "audio/x-ac3", "framed", G_TYPE_BOOLEAN, TRUE, "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, chans, NULL); gst_caps_set_simple (caps, "alignment", G_TYPE_STRING, g_atomic_int_get (&ac3parse->align) == GST_AC3_PARSE_ALIGN_IEC61937 ? "iec61937" : "frame", NULL); gst_buffer_set_caps (buf, caps); gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); gst_caps_unref (caps); ac3parse->sample_rate = rate; ac3parse->channels = chans; ac3parse->eac = eac; update_rate = TRUE; } if (G_UNLIKELY (ac3parse->blocks != blocks)) { ac3parse->blocks = blocks; update_rate = TRUE; } if (G_UNLIKELY (update_rate)) gst_base_parse_set_frame_rate (parse, rate, 256 * blocks, 2, 2); return GST_FLOW_OK; /* ERRORS */ broken_header: { /* this really shouldn't ever happen */ GST_ELEMENT_ERROR (parse, STREAM, DECODE, (NULL), (NULL)); return GST_FLOW_ERROR; } } static gboolean gst_ac3_parse_src_event (GstBaseParse * parse, GstEvent * event) { GstAc3Parse *ac3parse = GST_AC3_PARSE (parse); if (G_UNLIKELY (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_UPSTREAM) && gst_event_has_name (event, "ac3parse-set-alignment")) { const GstStructure *st = gst_event_get_structure (event); const gchar *align = gst_structure_get_string (st, "alignment"); if (g_str_equal (align, "iec61937")) { GST_DEBUG_OBJECT (ac3parse, "Switching to iec61937 alignment"); g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_IEC61937); } else if (g_str_equal (align, "frame")) { GST_DEBUG_OBJECT (ac3parse, "Switching to frame alignment"); g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); } else { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_WARNING_OBJECT (ac3parse, "Got unknown alignment request (%s) " "reverting to frame alignment.", gst_structure_get_string (st, "alignment")); } gst_event_unref (event); return TRUE; } return GST_BASE_PARSE_CLASS (parent_class)->src_event (parse, event); } static GstCaps * gst_ac3_parse_get_sink_caps (GstBaseParse * parse) { GstCaps *peercaps; GstCaps *res; peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (peercaps) { guint i, n; /* Remove the framed and alignment field. We can convert * between different alignments. */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_remove_field (s, "framed"); gst_structure_remove_field (s, "alignment"); } res = gst_caps_intersect_full (peercaps, gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)), GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); } else { res = gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse))); } return res; } gst-plugins-good-0.10.31/gst/multifile/0000755000175000017500000000000011720565304014651 500000000000000gst-plugins-good-0.10.31/gst/multifile/gstmultifile.c0000644000175000017500000000336111677341656017465 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2006 Wim Taymans * 2006 David A. Schleef * * gstmultifilesink.c: * * 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 #include "gstmultifilesink.h" #include "gstmultifilesrc.h" #include "gstsplitfilesrc.h" static gboolean plugin_init (GstPlugin * plugin) { gst_element_register (plugin, "multifilesrc", GST_RANK_NONE, gst_multi_file_src_get_type ()); gst_element_register (plugin, "multifilesink", GST_RANK_NONE, gst_multi_file_sink_get_type ()); gst_element_register (plugin, "splitfilesrc", GST_RANK_NONE, gst_split_file_src_get_type ()); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "multifile", "Reads/Writes buffers from/to sequentially named files", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/multifile/patternspec.h0000644000175000017500000000274211677341656017314 00000000000000/* GPattern copy that supports raw (non-utf8) matching * based on: GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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 __PATTERN_SPEC_H__ #define __PATTERN_SPEC_H__ #include G_BEGIN_DECLS typedef enum { MATCH_MODE_AUTO = 0, MATCH_MODE_UTF8, MATCH_MODE_RAW } MatchMode; typedef struct _PatternSpec PatternSpec; PatternSpec * pattern_spec_new (const gchar * pattern, MatchMode match_mode); void pattern_spec_free (PatternSpec * pspec); gboolean pattern_match_string (PatternSpec * pspec, const gchar * string); G_END_DECLS #endif /* __PATTERN_SPEC_H__ */ gst-plugins-good-0.10.31/gst/multifile/Makefile.am0000644000175000017500000000215011677341656016640 00000000000000 plugin_LTLIBRARIES = libgstmultifile.la libgstmultifile_la_SOURCES = \ gstmultifilesink.c \ gstmultifilesrc.c \ gstmultifile.c \ gstsplitfilesrc.c \ patternspec.c libgstmultifile_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS) libgstmultifile_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS) libgstmultifile_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmultifile_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstmultifilesrc.h gstmultifilesink.h gstsplitfilesrc.h patternspec.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmultifile -:SHARED libgstmultifile \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmultifile_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultifile_la_CFLAGS) \ -:LDFLAGS $(libgstmultifile_la_LDFLAGS) \ $(libgstmultifile_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/multifile/gstmultifilesink.h0000644000175000017500000000631111677341656020355 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2006 Wim Taymans * 2006 David A. Schleef * * gstmultifilesink.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_MULTIFILESINK_H__ #define __GST_MULTIFILESINK_H__ #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif G_BEGIN_DECLS #define GST_TYPE_MULTI_FILE_SINK \ (gst_multi_file_sink_get_type()) #define GST_MULTI_FILE_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTI_FILE_SINK,GstMultiFileSink)) #define GST_MULTI_FILE_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTI_FILE_SINK,GstMultiFileSinkClass)) #define GST_IS_MULTI_FILE_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTI_FILE_SINK)) #define GST_IS_MULTI_FILE_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTI_FILE_SINK)) typedef struct _GstMultiFileSink GstMultiFileSink; typedef struct _GstMultiFileSinkClass GstMultiFileSinkClass; /** * GstMultiFileSinkNext: * @GST_MULTI_FILE_SINK_NEXT_BUFFER: New file for each buffer * @GST_MULTI_FILE_SINK_NEXT_DISCONT: New file after each discontinuity * @GST_MULTI_FILE_SINK_NEXT_KEY_FRAME: New file at each key frame * (Useful for MPEG-TS segmenting) * @GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT: New file after a force key unit * event (Since: 0.10.31) * @GST_MULTI_FILE_SINK_NEXT_MAX_SIZE: New file when the configured maximum file * size would be exceeded with the next buffer or buffer list (Since: 0.10.31) * * File splitting modes. */ typedef enum { GST_MULTI_FILE_SINK_NEXT_BUFFER, GST_MULTI_FILE_SINK_NEXT_DISCONT, GST_MULTI_FILE_SINK_NEXT_KEY_FRAME, GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT, GST_MULTI_FILE_SINK_NEXT_MAX_SIZE } GstMultiFileSinkNext; struct _GstMultiFileSink { GstBaseSink parent; gchar *filename; gint index; gboolean post_messages; GstMultiFileSinkNext next_file; FILE *file; guint max_files; GSList *files; guint n_files; gint64 next_segment; int n_streamheaders; GstBuffer **streamheaders; guint force_key_unit_count; guint64 cur_file_size; guint64 max_file_size; }; struct _GstMultiFileSinkClass { GstBaseSinkClass parent_class; }; GType gst_multi_file_sink_get_type (void); G_END_DECLS #endif /* __GST_MULTIFILESINK_H__ */ gst-plugins-good-0.10.31/gst/multifile/gstmultifilesrc.c0000644000175000017500000003044111677341656020174 00000000000000/* GStreamer * Copyright (C) 2006 David A. Schleef * * gstmultifilesrc.c: * * 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-multifilesrc * @see_also: #GstFileSrc * * Reads buffers from sequentially named files. If used together with an image * decoder, one needs to use the #GstMultiFileSrc:caps property or a capsfilter * to force to caps containing a framerate. Otherwise image decoders send EOS * after the first picture. * * File names are created by replacing "\%d" with the index using printf(). * * * Example launch line * |[ * gst-launch multifilesrc location="img.%04d.png" index=0 caps="image/png,framerate=\(fraction\)12/1" ! \ * pngdec ! ffmpegcolorspace ! theoraenc ! oggmux ! \ * filesink location="images.ogg" * ]| This pipeline creates a video file "images.ogg" by joining multiple PNG * files named img.0000.png, img.0001.png, etc. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstmultifilesrc.h" static GstFlowReturn gst_multi_file_src_create (GstPushSrc * src, GstBuffer ** buffer); static void gst_multi_file_src_dispose (GObject * object); static void gst_multi_file_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_multi_file_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_multi_file_src_getcaps (GstBaseSrc * src); static gboolean gst_multi_file_src_query (GstBaseSrc * src, GstQuery * query); static GstStaticPadTemplate gst_multi_file_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GST_DEBUG_CATEGORY_STATIC (gst_multi_file_src_debug); #define GST_CAT_DEFAULT gst_multi_file_src_debug enum { ARG_0, ARG_LOCATION, ARG_INDEX, ARG_START_INDEX, ARG_STOP_INDEX, ARG_CAPS, ARG_LOOP }; #define DEFAULT_LOCATION "%05d" #define DEFAULT_INDEX 0 GST_BOILERPLATE (GstMultiFileSrc, gst_multi_file_src, GstPushSrc, GST_TYPE_PUSH_SRC); static void gst_multi_file_src_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); GST_DEBUG_CATEGORY_INIT (gst_multi_file_src_debug, "multifilesrc", 0, "multifilesrc element"); gst_element_class_add_static_pad_template (gstelement_class, &gst_multi_file_src_pad_template); gst_element_class_set_details_simple (gstelement_class, "Multi-File Source", "Source/File", "Read a sequentially named set of files into buffers", "David Schleef "); } static void gst_multi_file_src_class_init (GstMultiFileSrcClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstPushSrcClass *gstpushsrc_class = GST_PUSH_SRC_CLASS (klass); GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); gobject_class->set_property = gst_multi_file_src_set_property; gobject_class->get_property = gst_multi_file_src_get_property; g_object_class_install_property (gobject_class, ARG_LOCATION, g_param_spec_string ("location", "File Location", "Pattern to create file names of input files. File names are " "created by calling sprintf() with the pattern and the current " "index.", DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_INDEX, g_param_spec_int ("index", "File Index", "Index to use with location property to create file names. The " "index is incremented by one for each buffer read.", 0, INT_MAX, DEFAULT_INDEX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_START_INDEX, g_param_spec_int ("start-index", "Start Index", "Start value of index. The initial value of index can be set " "either by setting index or start-index. When the end of the loop " "is reached, the index will be set to the value start-index.", 0, INT_MAX, DEFAULT_INDEX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_STOP_INDEX, g_param_spec_int ("stop-index", "Start Index", "Stop value of index. The special value -1 means no stop.", -1, INT_MAX, DEFAULT_INDEX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_CAPS, g_param_spec_boxed ("caps", "Caps", "Caps describing the format of the data.", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_LOOP, g_param_spec_boolean ("loop", "Loop", "Whether to repeat from the beginning when all files have been read.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gobject_class->dispose = gst_multi_file_src_dispose; gstbasesrc_class->get_caps = gst_multi_file_src_getcaps; gstbasesrc_class->query = gst_multi_file_src_query; gstpushsrc_class->create = gst_multi_file_src_create; if (sizeof (off_t) < 8) { GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT, sizeof (off_t)); } } static void gst_multi_file_src_init (GstMultiFileSrc * multifilesrc, GstMultiFileSrcClass * g_class) { multifilesrc->start_index = DEFAULT_INDEX; multifilesrc->index = DEFAULT_INDEX; multifilesrc->stop_index = -1; multifilesrc->filename = g_strdup (DEFAULT_LOCATION); multifilesrc->successful_read = FALSE; } static void gst_multi_file_src_dispose (GObject * object) { GstMultiFileSrc *src = GST_MULTI_FILE_SRC (object); g_free (src->filename); src->filename = NULL; if (src->caps) gst_caps_unref (src->caps); G_OBJECT_CLASS (parent_class)->dispose (object); } static GstCaps * gst_multi_file_src_getcaps (GstBaseSrc * src) { GstMultiFileSrc *multi_file_src = GST_MULTI_FILE_SRC (src); GST_DEBUG_OBJECT (src, "returning %" GST_PTR_FORMAT, multi_file_src->caps); if (multi_file_src->caps) { return gst_caps_ref (multi_file_src->caps); } else { return gst_caps_new_any (); } } static gboolean gst_multi_file_src_query (GstBaseSrc * src, GstQuery * query) { gboolean res; GstMultiFileSrc *mfsrc; mfsrc = GST_MULTI_FILE_SRC (src); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_BUFFERS: case GST_FORMAT_DEFAULT: gst_query_set_position (query, GST_FORMAT_BUFFERS, mfsrc->index); res = TRUE; break; default: res = GST_BASE_SRC_CLASS (parent_class)->query (src, query); break; } break; } default: res = GST_BASE_SRC_CLASS (parent_class)->query (src, query); break; } return res; } static gboolean gst_multi_file_src_set_location (GstMultiFileSrc * src, const gchar * location) { g_free (src->filename); if (location != NULL) { src->filename = g_strdup (location); } else { src->filename = NULL; } return TRUE; } static void gst_multi_file_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMultiFileSrc *src = GST_MULTI_FILE_SRC (object); switch (prop_id) { case ARG_LOCATION: gst_multi_file_src_set_location (src, g_value_get_string (value)); break; case ARG_INDEX: src->index = g_value_get_int (value); break; case ARG_START_INDEX: src->start_index = g_value_get_int (value); break; case ARG_STOP_INDEX: src->stop_index = g_value_get_int (value); break; case ARG_CAPS: { const GstCaps *caps = gst_value_get_caps (value); GstCaps *new_caps; if (caps == NULL) { new_caps = gst_caps_new_any (); } else { new_caps = gst_caps_copy (caps); } gst_caps_replace (&src->caps, new_caps); gst_pad_set_caps (GST_BASE_SRC_PAD (src), new_caps); } break; case ARG_LOOP: src->loop = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_multi_file_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMultiFileSrc *src = GST_MULTI_FILE_SRC (object); switch (prop_id) { case ARG_LOCATION: g_value_set_string (value, src->filename); break; case ARG_INDEX: g_value_set_int (value, src->index); break; case ARG_START_INDEX: g_value_set_int (value, src->start_index); break; case ARG_STOP_INDEX: g_value_set_int (value, src->stop_index); break; case ARG_CAPS: gst_value_set_caps (value, src->caps); break; case ARG_LOOP: g_value_set_boolean (value, src->loop); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gchar * gst_multi_file_src_get_filename (GstMultiFileSrc * multifilesrc) { gchar *filename; GST_DEBUG ("%d", multifilesrc->index); filename = g_strdup_printf (multifilesrc->filename, multifilesrc->index); return filename; } static GstFlowReturn gst_multi_file_src_create (GstPushSrc * src, GstBuffer ** buffer) { GstMultiFileSrc *multifilesrc; gsize size; gchar *data; gchar *filename; GstBuffer *buf; gboolean ret; GError *error = NULL; multifilesrc = GST_MULTI_FILE_SRC (src); if (multifilesrc->index < multifilesrc->start_index) { multifilesrc->index = multifilesrc->start_index; } filename = gst_multi_file_src_get_filename (multifilesrc); GST_DEBUG_OBJECT (multifilesrc, "reading from file \"%s\".", filename); ret = g_file_get_contents (filename, &data, &size, &error); if (!ret) { if (multifilesrc->successful_read) { /* If we've read at least one buffer successfully, not finding the * next file is EOS. */ g_free (filename); if (error != NULL) g_error_free (error); if (multifilesrc->loop) { error = NULL; multifilesrc->index = multifilesrc->start_index; filename = gst_multi_file_src_get_filename (multifilesrc); ret = g_file_get_contents (filename, &data, &size, &error); if (!ret) { g_free (filename); if (error != NULL) g_error_free (error); return GST_FLOW_UNEXPECTED; } } else { return GST_FLOW_UNEXPECTED; } } else { goto handle_error; } } multifilesrc->successful_read = TRUE; multifilesrc->index++; if (multifilesrc->stop_index != -1 && multifilesrc->index >= multifilesrc->stop_index) { multifilesrc->index = multifilesrc->start_index; } buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = (unsigned char *) data; GST_BUFFER_MALLOCDATA (buf) = GST_BUFFER_DATA (buf); GST_BUFFER_SIZE (buf) = size; GST_BUFFER_OFFSET (buf) = multifilesrc->offset; GST_BUFFER_OFFSET_END (buf) = multifilesrc->offset + size; multifilesrc->offset += size; gst_buffer_set_caps (buf, multifilesrc->caps); GST_DEBUG_OBJECT (multifilesrc, "read file \"%s\".", filename); g_free (filename); *buffer = buf; return GST_FLOW_OK; handle_error: { if (error != NULL) { GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, ("Error while reading from file \"%s\".", filename), ("%s", error->message)); g_error_free (error); } else { GST_ELEMENT_ERROR (multifilesrc, RESOURCE, READ, ("Error while reading from file \"%s\".", filename), ("%s", g_strerror (errno))); } g_free (filename); return GST_FLOW_ERROR; } } gst-plugins-good-0.10.31/gst/multifile/patternspec.c0000644000175000017500000002247111677341656017310 00000000000000/* GPattern copy that supports raw (non-utf8) matching * based on: GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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 "patternspec.h" #include typedef enum { MATCH_ALL, /* "*A?A*" */ MATCH_ALL_TAIL, /* "*A?AA" */ MATCH_HEAD, /* "AAAA*" */ MATCH_TAIL, /* "*AAAA" */ MATCH_EXACT, /* "AAAAA" */ MATCH_LAST } MatchType; struct _PatternSpec { MatchMode match_mode; MatchType match_type; guint pattern_length; guint min_length; guint max_length; gchar *pattern; }; static inline gchar * raw_strreverse (const gchar * str, gssize size) { g_assert (size > 0); return g_strreverse (g_strndup (str, size)); } static inline gboolean pattern_ph_match (const gchar * match_pattern, MatchMode match_mode, const gchar * match_string, gboolean * wildcard_reached_p) { register const gchar *pattern, *string; register gchar ch; pattern = match_pattern; string = match_string; ch = *pattern; pattern++; while (ch) { switch (ch) { case '?': if (!*string) return FALSE; if (match_mode == MATCH_MODE_UTF8) string = g_utf8_next_char (string); else ++string; break; case '*': *wildcard_reached_p = TRUE; do { ch = *pattern; pattern++; if (ch == '?') { if (!*string) return FALSE; if (match_mode == MATCH_MODE_UTF8) string = g_utf8_next_char (string); else ++string; } } while (ch == '*' || ch == '?'); if (!ch) return TRUE; do { gboolean next_wildcard_reached = FALSE; while (ch != *string) { if (!*string) return FALSE; if (match_mode == MATCH_MODE_UTF8) string = g_utf8_next_char (string); else ++string; } string++; if (pattern_ph_match (pattern, match_mode, string, &next_wildcard_reached)) return TRUE; if (next_wildcard_reached) /* the forthcoming pattern substring up to the next wildcard has * been matched, but a mismatch occoured for the rest of the * pattern, following the next wildcard. * there's no need to advance the current match position any * further if the rest pattern will not match. */ return FALSE; } while (*string); break; default: if (ch == *string) string++; else return FALSE; break; } ch = *pattern; pattern++; } return *string == 0; } static gboolean pattern_match (PatternSpec * pspec, guint string_length, const gchar * string, const gchar * string_reversed) { MatchMode match_mode; g_assert (pspec != NULL); g_assert (string != NULL); if (string_length < pspec->min_length || string_length > pspec->max_length) return FALSE; match_mode = pspec->match_mode; if (match_mode == MATCH_MODE_AUTO) { if (!g_utf8_validate (string, string_length, NULL)) match_mode = MATCH_MODE_RAW; else match_mode = MATCH_MODE_UTF8; } switch (pspec->match_type) { gboolean dummy; case MATCH_ALL: return pattern_ph_match (pspec->pattern, match_mode, string, &dummy); case MATCH_ALL_TAIL: if (string_reversed) return pattern_ph_match (pspec->pattern, match_mode, string_reversed, &dummy); else { gboolean result; gchar *tmp; if (match_mode == MATCH_MODE_UTF8) { tmp = g_utf8_strreverse (string, string_length); } else { tmp = raw_strreverse (string, string_length); } result = pattern_ph_match (pspec->pattern, match_mode, tmp, &dummy); g_free (tmp); return result; } case MATCH_HEAD: if (pspec->pattern_length == string_length) return memcmp (pspec->pattern, string, string_length) == 0; else if (pspec->pattern_length) return memcmp (pspec->pattern, string, pspec->pattern_length) == 0; else return TRUE; case MATCH_TAIL: if (pspec->pattern_length) /* compare incl. NUL terminator */ return memcmp (pspec->pattern, string + (string_length - pspec->pattern_length), pspec->pattern_length + 1) == 0; else return TRUE; case MATCH_EXACT: if (pspec->pattern_length != string_length) return FALSE; else return memcmp (pspec->pattern, string, string_length) == 0; default: g_return_val_if_fail (pspec->match_type < MATCH_LAST, FALSE); return FALSE; } } PatternSpec * pattern_spec_new (const gchar * pattern, MatchMode match_mode) { PatternSpec *pspec; gboolean seen_joker = FALSE, seen_wildcard = FALSE, more_wildcards = FALSE; gint hw_pos = -1, tw_pos = -1, hj_pos = -1, tj_pos = -1; gboolean follows_wildcard = FALSE; guint pending_jokers = 0; const gchar *s; gchar *d; guint i; g_assert (pattern != NULL); g_assert (match_mode != MATCH_MODE_UTF8 || g_utf8_validate (pattern, -1, NULL)); /* canonicalize pattern and collect necessary stats */ pspec = g_new (PatternSpec, 1); pspec->match_mode = match_mode; pspec->pattern_length = strlen (pattern); pspec->min_length = 0; pspec->max_length = 0; pspec->pattern = g_new (gchar, pspec->pattern_length + 1); if (pspec->match_mode == MATCH_MODE_AUTO) { if (!g_utf8_validate (pattern, -1, NULL)) pspec->match_mode = MATCH_MODE_RAW; } d = pspec->pattern; for (i = 0, s = pattern; *s != 0; s++) { switch (*s) { case '*': if (follows_wildcard) { /* compress multiple wildcards */ pspec->pattern_length--; continue; } follows_wildcard = TRUE; if (hw_pos < 0) hw_pos = i; tw_pos = i; break; case '?': pending_jokers++; pspec->min_length++; if (pspec->match_mode == MATCH_MODE_RAW) { pspec->max_length += 1; } else { pspec->max_length += 4; /* maximum UTF-8 character length */ } continue; default: for (; pending_jokers; pending_jokers--, i++) { *d++ = '?'; if (hj_pos < 0) hj_pos = i; tj_pos = i; } follows_wildcard = FALSE; pspec->min_length++; pspec->max_length++; break; } *d++ = *s; i++; } for (; pending_jokers; pending_jokers--) { *d++ = '?'; if (hj_pos < 0) hj_pos = i; tj_pos = i; } *d++ = 0; seen_joker = hj_pos >= 0; seen_wildcard = hw_pos >= 0; more_wildcards = seen_wildcard && hw_pos != tw_pos; if (seen_wildcard) pspec->max_length = G_MAXUINT; /* special case sole head/tail wildcard or exact matches */ if (!seen_joker && !more_wildcards) { if (pspec->pattern[0] == '*') { pspec->match_type = MATCH_TAIL; memmove (pspec->pattern, pspec->pattern + 1, --pspec->pattern_length); pspec->pattern[pspec->pattern_length] = 0; return pspec; } if (pspec->pattern_length > 0 && pspec->pattern[pspec->pattern_length - 1] == '*') { pspec->match_type = MATCH_HEAD; pspec->pattern[--pspec->pattern_length] = 0; return pspec; } if (!seen_wildcard) { pspec->match_type = MATCH_EXACT; return pspec; } } /* now just need to distinguish between head or tail match start */ tw_pos = pspec->pattern_length - 1 - tw_pos; /* last pos to tail distance */ tj_pos = pspec->pattern_length - 1 - tj_pos; /* last pos to tail distance */ if (seen_wildcard) pspec->match_type = tw_pos > hw_pos ? MATCH_ALL_TAIL : MATCH_ALL; else /* seen_joker */ pspec->match_type = tj_pos > hj_pos ? MATCH_ALL_TAIL : MATCH_ALL; if (pspec->match_type == MATCH_ALL_TAIL) { gchar *tmp = pspec->pattern; if (pspec->match_mode == MATCH_MODE_RAW) { pspec->pattern = raw_strreverse (pspec->pattern, pspec->pattern_length); } else { pspec->pattern = g_utf8_strreverse (pspec->pattern, pspec->pattern_length); } g_free (tmp); } return pspec; } void pattern_spec_free (PatternSpec * pspec) { g_assert (pspec != NULL); g_free (pspec->pattern); g_free (pspec); } gboolean pattern_match_string (PatternSpec * pspec, const gchar * string) { return pattern_match (pspec, strlen (string), string, NULL); } gst-plugins-good-0.10.31/gst/multifile/gstmultifilesrc.h0000644000175000017500000000364211677341656020204 00000000000000/* GStreamer * Copyright (C) 2006 David A. Schleef * * gstmultifilesrc.c: * * 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_MULTIFILESRC_H__ #define __GST_MULTIFILESRC_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_MULTI_FILE_SRC \ (gst_multi_file_src_get_type()) #define GST_MULTI_FILE_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTI_FILE_SRC,GstMultiFileSrc)) #define GST_MULTI_FILE_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTI_FILE_SRC,GstMultiFileSrcClass)) #define GST_IS_MULTI_FILE_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTI_FILE_SRC)) #define GST_IS_MULTI_FILE_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTI_FILE_SRC)) typedef struct _GstMultiFileSrc GstMultiFileSrc; typedef struct _GstMultiFileSrcClass GstMultiFileSrcClass; struct _GstMultiFileSrc { GstPushSrc parent; gchar *filename; int start_index; int stop_index; int index; int offset; gboolean loop; GstCaps *caps; gboolean successful_read; }; struct _GstMultiFileSrcClass { GstPushSrcClass parent_class; }; GType gst_multi_file_src_get_type (void); G_END_DECLS #endif /* __GST_MULTIFILESRC_H__ */ gst-plugins-good-0.10.31/gst/multifile/gstsplitfilesrc.h0000644000175000017500000000436711677341656020212 00000000000000/* GStreamer Split File Source * Copyright (C) 2011 Collabora Ltd. * * 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_SPLIT_FILE_SRC_H__ #define __GST_SPLIT_FILE_SRC_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_SPLIT_FILE_SRC \ (gst_split_file_src_get_type()) #define GST_SPLIT_FILE_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPLIT_FILE_SRC,GstSplitFileSrc)) #define GST_SPLIT_FILE_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPLIT_FILE_SRC,GstSplitFileSrcClass)) #define GST_IS_SPLIT_FILE_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPLIT_FILE_SRC)) #define GST_IS_SPLIT_FILE_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPLIT_FILE_SRC)) typedef struct _GstFilePart GstFilePart; typedef struct _GstSplitFileSrc GstSplitFileSrc; typedef struct _GstSplitFileSrcClass GstSplitFileSrcClass; struct _GstFilePart { GFileInputStream *stream; gchar *path; guint64 start; /* inclusive */ guint64 stop; /* inclusive */ }; struct _GstSplitFileSrc { GstBaseSrc parent; gchar *location; /* OBJECT_LOCK */ GstFilePart *parts; guint num_parts; guint cur_part; /* part used last (likely also to be used next) */ GCancellable *cancellable; /* so we can interrupt blocking operations */ }; struct _GstSplitFileSrcClass { GstBaseSrcClass parent_class; }; GType gst_split_file_src_get_type (void); G_END_DECLS #endif /* __GST_SPLIT_FILE_SRC_H__ */ gst-plugins-good-0.10.31/gst/multifile/gstmultifilesink.c0000644000175000017500000006350311701076123020334 00000000000000/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2006 Wim Taymans * 2006 David A. Schleef * 2011 Collabora Ltd. * * gstmultifilesink.c: * * 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-multifilesink * @see_also: #GstFileSrc * * Write incoming data to a series of sequentially-named files. * * The filename property should contain a string with a \%d placeholder that will * be substituted with the index for each filename. * * If the #GstMultiFileSink:post-messages property is #TRUE, it sends an application * message named * "GstMultiFileSink" after writing each * buffer. * * The message's structure contains these fields: * * * * #gchar * * "filename": * the filename where the buffer was written. * * * * * #gint * "index": * the index of the buffer. * * * * * #GstClockTime * "timestamp": * the timestamp of the buffer. * * * * * #GstClockTime * "stream-time": * the stream time of the buffer. * * * * * #GstClockTime * "running-time": * the running_time of the buffer. * * * * * #GstClockTime * "duration": * the duration of the buffer. * * * * * #guint64 * "offset": * the offset of the buffer that triggered the message. * * * * * #guint64 * "offset-end": * the offset-end of the buffer that triggered the message. * * * * * * Example launch line * |[ * gst-launch audiotestsrc ! multifilesink * gst-launch videotestsrc ! multifilesink post-messages=true filename="frame%d" * ]| * * * Last reviewed on 2009-09-11 (0.10.17) */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "gstmultifilesink.h" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GST_DEBUG_CATEGORY_STATIC (gst_multi_file_sink_debug); #define GST_CAT_DEFAULT gst_multi_file_sink_debug #define DEFAULT_LOCATION "%05d" #define DEFAULT_INDEX 0 #define DEFAULT_POST_MESSAGES FALSE #define DEFAULT_NEXT_FILE GST_MULTI_FILE_SINK_NEXT_BUFFER #define DEFAULT_MAX_FILES 0 #define DEFAULT_MAX_FILE_SIZE G_GUINT64_CONSTANT(2*1024*1024*1024) enum { PROP_0, PROP_LOCATION, PROP_INDEX, PROP_POST_MESSAGES, PROP_NEXT_FILE, PROP_MAX_FILES, PROP_MAX_FILE_SIZE, PROP_LAST }; static void gst_multi_file_sink_finalize (GObject * object); static void gst_multi_file_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_multi_file_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_multi_file_sink_stop (GstBaseSink * sink); static GstFlowReturn gst_multi_file_sink_render (GstBaseSink * sink, GstBuffer * buffer); static GstFlowReturn gst_multi_file_sink_render_list (GstBaseSink * sink, GstBufferList * buffer_list); static gboolean gst_multi_file_sink_set_caps (GstBaseSink * sink, GstCaps * caps); static gboolean gst_multi_file_sink_open_next_file (GstMultiFileSink * multifilesink); static void gst_multi_file_sink_close_file (GstMultiFileSink * multifilesink, GstBuffer * buffer); static void gst_multi_file_sink_ensure_max_files (GstMultiFileSink * multifilesink); static gboolean gst_multi_file_sink_event (GstBaseSink * sink, GstEvent * event); #define GST_TYPE_MULTI_FILE_SINK_NEXT (gst_multi_file_sink_next_get_type ()) static GType gst_multi_file_sink_next_get_type (void) { static GType multi_file_sync_next_type = 0; static const GEnumValue next_types[] = { {GST_MULTI_FILE_SINK_NEXT_BUFFER, "New file for each buffer", "buffer"}, {GST_MULTI_FILE_SINK_NEXT_DISCONT, "New file after each discontinuity", "discont"}, {GST_MULTI_FILE_SINK_NEXT_KEY_FRAME, "New file at each key frame " "(Useful for MPEG-TS segmenting)", "key-frame"}, {GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT, "New file after a force key unit event", "key-unit-event"}, {GST_MULTI_FILE_SINK_NEXT_MAX_SIZE, "New file when the configured maximum " "file size would be exceeded with the next buffer or buffer list", "max-size"}, {0, NULL, NULL} }; if (!multi_file_sync_next_type) { multi_file_sync_next_type = g_enum_register_static ("GstMultiFileSinkNext", next_types); } return multi_file_sync_next_type; } GST_BOILERPLATE (GstMultiFileSink, gst_multi_file_sink, GstBaseSink, GST_TYPE_BASE_SINK); static void gst_multi_file_sink_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); GST_DEBUG_CATEGORY_INIT (gst_multi_file_sink_debug, "multifilesink", 0, "multifilesink element"); gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); gst_element_class_set_details_simple (gstelement_class, "Multi-File Sink", "Sink/File", "Write buffers to a sequentially named set of files", "David Schleef "); } static void gst_multi_file_sink_class_init (GstMultiFileSinkClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass); gobject_class->set_property = gst_multi_file_sink_set_property; gobject_class->get_property = gst_multi_file_sink_get_property; g_object_class_install_property (gobject_class, PROP_LOCATION, g_param_spec_string ("location", "File Location", "Location of the file to write", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_INDEX, g_param_spec_int ("index", "Index", "Index to use with location property to create file names. The " "index is incremented by one for each buffer written.", 0, G_MAXINT, DEFAULT_INDEX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstMultiFileSink:post-messages * * Post a message on the GstBus for each file. * * Since: 0.10.17 */ g_object_class_install_property (gobject_class, PROP_POST_MESSAGES, g_param_spec_boolean ("post-messages", "Post Messages", "Post a message for each file with information of the buffer", DEFAULT_POST_MESSAGES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstMultiFileSink:next-file * * When to start a new file. * * Since: 0.10.17 */ g_object_class_install_property (gobject_class, PROP_NEXT_FILE, g_param_spec_enum ("next-file", "Next File", "When to start a new file", GST_TYPE_MULTI_FILE_SINK_NEXT, DEFAULT_NEXT_FILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS)); /** * GstMultiFileSink:max-files * * Maximum number of files to keep on disk. Once the maximum is reached, old * files start to be deleted to make room for new ones. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_MAX_FILES, g_param_spec_uint ("max-files", "Max files", "Maximum number of files to keep on disk. Once the maximum is reached," "old files start to be deleted to make room for new ones.", 0, G_MAXUINT, DEFAULT_MAX_FILES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstMultiFileSink:max-file-size * * Maximum file size before starting a new file in max-size mode. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_MAX_FILE_SIZE, g_param_spec_uint64 ("max-file-size", "Maximum File Size", "Maximum file size before starting a new file in max-size mode", 0, G_MAXUINT64, DEFAULT_MAX_FILE_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gobject_class->finalize = gst_multi_file_sink_finalize; gstbasesink_class->get_times = NULL; gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_multi_file_sink_stop); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_multi_file_sink_render); gstbasesink_class->render_list = GST_DEBUG_FUNCPTR (gst_multi_file_sink_render_list); gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_multi_file_sink_set_caps); gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_multi_file_sink_event); } static void gst_multi_file_sink_init (GstMultiFileSink * multifilesink, GstMultiFileSinkClass * g_class) { multifilesink->filename = g_strdup (DEFAULT_LOCATION); multifilesink->index = DEFAULT_INDEX; multifilesink->post_messages = DEFAULT_POST_MESSAGES; multifilesink->max_files = DEFAULT_MAX_FILES; multifilesink->max_file_size = DEFAULT_MAX_FILE_SIZE; multifilesink->files = NULL; multifilesink->n_files = 0; gst_base_sink_set_sync (GST_BASE_SINK (multifilesink), FALSE); multifilesink->next_segment = GST_CLOCK_TIME_NONE; multifilesink->force_key_unit_count = -1; } static void gst_multi_file_sink_finalize (GObject * object) { GstMultiFileSink *sink = GST_MULTI_FILE_SINK (object); g_free (sink->filename); g_slist_foreach (sink->files, (GFunc) g_free, NULL); g_slist_free (sink->files); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_multi_file_sink_set_location (GstMultiFileSink * sink, const gchar * location) { g_free (sink->filename); /* FIXME: validate location to have just one %d */ sink->filename = g_strdup (location); return TRUE; } static void gst_multi_file_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMultiFileSink *sink = GST_MULTI_FILE_SINK (object); switch (prop_id) { case PROP_LOCATION: gst_multi_file_sink_set_location (sink, g_value_get_string (value)); break; case PROP_INDEX: sink->index = g_value_get_int (value); break; case PROP_POST_MESSAGES: sink->post_messages = g_value_get_boolean (value); break; case PROP_NEXT_FILE: sink->next_file = g_value_get_enum (value); break; case PROP_MAX_FILES: sink->max_files = g_value_get_uint (value); break; case PROP_MAX_FILE_SIZE: sink->max_file_size = g_value_get_uint64 (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_multi_file_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMultiFileSink *sink = GST_MULTI_FILE_SINK (object); switch (prop_id) { case PROP_LOCATION: g_value_set_string (value, sink->filename); break; case PROP_INDEX: g_value_set_int (value, sink->index); break; case PROP_POST_MESSAGES: g_value_set_boolean (value, sink->post_messages); break; case PROP_NEXT_FILE: g_value_set_enum (value, sink->next_file); break; case PROP_MAX_FILES: g_value_set_uint (value, sink->max_files); break; case PROP_MAX_FILE_SIZE: g_value_set_uint64 (value, sink->max_file_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_multi_file_sink_stop (GstBaseSink * sink) { GstMultiFileSink *multifilesink; int i; multifilesink = GST_MULTI_FILE_SINK (sink); if (multifilesink->file != NULL) { fclose (multifilesink->file); multifilesink->file = NULL; } if (multifilesink->streamheaders) { for (i = 0; i < multifilesink->n_streamheaders; i++) { gst_buffer_unref (multifilesink->streamheaders[i]); } g_free (multifilesink->streamheaders); multifilesink->streamheaders = NULL; } multifilesink->force_key_unit_count = -1; return TRUE; } static void gst_multi_file_sink_post_message_full (GstMultiFileSink * multifilesink, GstClockTime timestamp, GstClockTime duration, GstClockTime offset, GstClockTime offset_end, GstClockTime running_time, GstClockTime stream_time, const char *filename) { GstStructure *s; if (!multifilesink->post_messages) return; s = gst_structure_new ("GstMultiFileSink", "filename", G_TYPE_STRING, filename, "index", G_TYPE_INT, multifilesink->index, "timestamp", G_TYPE_UINT64, timestamp, "stream-time", G_TYPE_UINT64, stream_time, "running-time", G_TYPE_UINT64, running_time, "duration", G_TYPE_UINT64, duration, "offset", G_TYPE_UINT64, offset, "offset-end", G_TYPE_UINT64, offset_end, NULL); gst_element_post_message (GST_ELEMENT_CAST (multifilesink), gst_message_new_element (GST_OBJECT_CAST (multifilesink), s)); } static void gst_multi_file_sink_post_message (GstMultiFileSink * multifilesink, GstBuffer * buffer, const char *filename) { GstClockTime duration, timestamp; GstClockTime running_time, stream_time; guint64 offset, offset_end; GstSegment *segment; GstFormat format; if (!multifilesink->post_messages) return; segment = &GST_BASE_SINK (multifilesink)->segment; format = segment->format; timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); offset = GST_BUFFER_OFFSET (buffer); offset_end = GST_BUFFER_OFFSET_END (buffer); running_time = gst_segment_to_running_time (segment, format, timestamp); stream_time = gst_segment_to_stream_time (segment, format, timestamp); gst_multi_file_sink_post_message_full (multifilesink, timestamp, duration, offset, offset_end, running_time, stream_time, filename); } static gboolean gst_multi_file_sink_write_stream_headers (GstMultiFileSink * sink) { int i; if (sink->streamheaders == NULL) return TRUE; /* we want to write these at the beginning */ g_assert (sink->cur_file_size == 0); for (i = 0; i < sink->n_streamheaders; i++) { GstBuffer *hdr; int ret; hdr = sink->streamheaders[i]; ret = fwrite (GST_BUFFER_DATA (hdr), GST_BUFFER_SIZE (hdr), 1, sink->file); if (ret != 1) return FALSE; sink->cur_file_size += GST_BUFFER_SIZE (hdr); } return TRUE; } static GstFlowReturn gst_multi_file_sink_render (GstBaseSink * sink, GstBuffer * buffer) { GstMultiFileSink *multifilesink; guint size; guint8 *data; gchar *filename; gboolean ret; GError *error = NULL; size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); multifilesink = GST_MULTI_FILE_SINK (sink); switch (multifilesink->next_file) { case GST_MULTI_FILE_SINK_NEXT_BUFFER: gst_multi_file_sink_ensure_max_files (multifilesink); filename = g_strdup_printf (multifilesink->filename, multifilesink->index); ret = g_file_set_contents (filename, (char *) data, size, &error); if (!ret) goto write_error; multifilesink->files = g_slist_append (multifilesink->files, filename); multifilesink->n_files += 1; gst_multi_file_sink_post_message (multifilesink, buffer, filename); multifilesink->index++; break; case GST_MULTI_FILE_SINK_NEXT_DISCONT: if (GST_BUFFER_IS_DISCONT (buffer)) { if (multifilesink->file) gst_multi_file_sink_close_file (multifilesink, buffer); } if (multifilesink->file == NULL) { if (!gst_multi_file_sink_open_next_file (multifilesink)) goto stdio_write_error; } ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, multifilesink->file); if (ret != 1) goto stdio_write_error; break; case GST_MULTI_FILE_SINK_NEXT_KEY_FRAME: if (multifilesink->next_segment == GST_CLOCK_TIME_NONE) { if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) { multifilesink->next_segment = GST_BUFFER_TIMESTAMP (buffer) + 10 * GST_SECOND; } } if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && GST_BUFFER_TIMESTAMP (buffer) >= multifilesink->next_segment && !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) { if (multifilesink->file) gst_multi_file_sink_close_file (multifilesink, buffer); multifilesink->next_segment += 10 * GST_SECOND; } if (multifilesink->file == NULL) { if (!gst_multi_file_sink_open_next_file (multifilesink)) goto stdio_write_error; gst_multi_file_sink_write_stream_headers (multifilesink); } ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, multifilesink->file); if (ret != 1) goto stdio_write_error; break; case GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT: if (multifilesink->file == NULL) { if (!gst_multi_file_sink_open_next_file (multifilesink)) goto stdio_write_error; } ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, multifilesink->file); if (ret != 1) goto stdio_write_error; break; case GST_MULTI_FILE_SINK_NEXT_MAX_SIZE:{ guint64 new_size; new_size = multifilesink->cur_file_size + GST_BUFFER_SIZE (buffer); if (new_size > multifilesink->max_file_size) { GST_INFO_OBJECT (multifilesink, "current size: %" G_GUINT64_FORMAT ", new_size: %" G_GUINT64_FORMAT ", max. size %" G_GUINT64_FORMAT, multifilesink->cur_file_size, new_size, multifilesink->max_file_size); if (multifilesink->file != NULL) gst_multi_file_sink_close_file (multifilesink, NULL); } if (multifilesink->file == NULL) { if (!gst_multi_file_sink_open_next_file (multifilesink)) goto stdio_write_error; gst_multi_file_sink_write_stream_headers (multifilesink); } ret = fwrite (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), 1, multifilesink->file); if (ret != 1) goto stdio_write_error; multifilesink->cur_file_size += GST_BUFFER_SIZE (buffer); break; } default: g_assert_not_reached (); } return GST_FLOW_OK; /* ERRORS */ write_error: { switch (error->code) { case G_FILE_ERROR_NOSPC:{ GST_ELEMENT_ERROR (multifilesink, RESOURCE, NO_SPACE_LEFT, (NULL), (NULL)); break; } default:{ GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, ("Error while writing to file \"%s\".", filename), ("%s", g_strerror (errno))); } } g_error_free (error); g_free (filename); return GST_FLOW_ERROR; } stdio_write_error: switch (errno) { case ENOSPC: GST_ELEMENT_ERROR (multifilesink, RESOURCE, NO_SPACE_LEFT, ("Error while writing to file."), ("%s", g_strerror (errno))); break; default: GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, ("Error while writing to file."), ("%s", g_strerror (errno))); } return GST_FLOW_ERROR; } static GstBufferListItem buffer_list_calc_size (GstBuffer ** buf, guint group, guint idx, gpointer data) { guint *p_size = data; guint buf_size; buf_size = GST_BUFFER_SIZE (*buf); GST_TRACE ("buffer %u in group %u has size %u", idx, group, buf_size); *p_size += buf_size; return GST_BUFFER_LIST_CONTINUE; } static GstBufferListItem buffer_list_copy_data (GstBuffer ** buf, guint group, guint idx, gpointer data) { GstBuffer *dest = data; if (group == 0 && idx == 0) gst_buffer_copy_metadata (dest, *buf, GST_BUFFER_COPY_ALL); memcpy (GST_BUFFER_DATA (dest) + GST_BUFFER_SIZE (dest), GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf)); GST_BUFFER_SIZE (dest) += GST_BUFFER_SIZE (*buf); return GST_BUFFER_LIST_CONTINUE; } /* Our assumption for now is that the buffers in a buffer list should always * end up in the same file. If someone wants different behaviour, they'll just * have to add a property for that. */ static GstFlowReturn gst_multi_file_sink_render_list (GstBaseSink * sink, GstBufferList * list) { GstBuffer *buf; guint size; gst_buffer_list_foreach (list, buffer_list_calc_size, &size); GST_LOG_OBJECT (sink, "total size of buffer list %p: %u", list, size); /* copy all buffers in the list into one single buffer, so we can use * the normal render function (FIXME: optimise to avoid the memcpy) */ buf = gst_buffer_new_and_alloc (size); GST_BUFFER_SIZE (buf) = 0; gst_buffer_list_foreach (list, buffer_list_copy_data, buf); g_assert (GST_BUFFER_SIZE (buf) == size); gst_multi_file_sink_render (sink, buf); gst_buffer_unref (buf); return GST_FLOW_OK; } static gboolean gst_multi_file_sink_set_caps (GstBaseSink * sink, GstCaps * caps) { GstMultiFileSink *multifilesink; GstStructure *structure; multifilesink = GST_MULTI_FILE_SINK (sink); structure = gst_caps_get_structure (caps, 0); if (structure) { const GValue *value; value = gst_structure_get_value (structure, "streamheader"); if (GST_VALUE_HOLDS_ARRAY (value)) { int i; if (multifilesink->streamheaders) { for (i = 0; i < multifilesink->n_streamheaders; i++) { gst_buffer_unref (multifilesink->streamheaders[i]); } g_free (multifilesink->streamheaders); } multifilesink->n_streamheaders = gst_value_array_get_size (value); multifilesink->streamheaders = g_malloc (sizeof (GstBuffer *) * multifilesink->n_streamheaders); for (i = 0; i < multifilesink->n_streamheaders; i++) { multifilesink->streamheaders[i] = gst_buffer_ref (gst_value_get_buffer (gst_value_array_get_value (value, i))); } } } return TRUE; } static void gst_multi_file_sink_ensure_max_files (GstMultiFileSink * multifilesink) { char *filename; while (multifilesink->max_files && multifilesink->n_files >= multifilesink->max_files) { filename = multifilesink->files->data; g_remove (filename); g_free (filename); multifilesink->files = g_slist_delete_link (multifilesink->files, multifilesink->files); multifilesink->n_files -= 1; } } static gboolean gst_multi_file_sink_event (GstBaseSink * sink, GstEvent * event) { GstMultiFileSink *multifilesink; gchar *filename; gboolean res = TRUE; multifilesink = GST_MULTI_FILE_SINK (sink); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_DOWNSTREAM: { GstClockTime timestamp, duration; GstClockTime running_time, stream_time; guint64 offset, offset_end; gboolean all_headers; guint count; if (multifilesink->next_file != GST_MULTI_FILE_SINK_NEXT_KEY_UNIT_EVENT || !gst_video_event_is_force_key_unit (event)) goto out; gst_video_event_parse_downstream_force_key_unit (event, ×tamp, &stream_time, &running_time, &all_headers, &count); if (multifilesink->force_key_unit_count != -1 && multifilesink->force_key_unit_count == count) goto out; multifilesink->force_key_unit_count = count; if (multifilesink->file) { duration = GST_CLOCK_TIME_NONE; offset = offset_end = -1; filename = g_strdup_printf (multifilesink->filename, multifilesink->index); gst_multi_file_sink_post_message_full (multifilesink, timestamp, duration, offset, offset_end, running_time, stream_time, filename); g_free (filename); gst_multi_file_sink_close_file (multifilesink, NULL); } if (multifilesink->file == NULL) { if (!gst_multi_file_sink_open_next_file (multifilesink)) goto stdio_write_error; } break; } default: break; } out: return res; stdio_write_error: GST_ELEMENT_ERROR (multifilesink, RESOURCE, WRITE, ("Error while writing to file."), (NULL)); return FALSE; } static gboolean gst_multi_file_sink_open_next_file (GstMultiFileSink * multifilesink) { char *filename; g_return_val_if_fail (multifilesink->file == NULL, FALSE); gst_multi_file_sink_ensure_max_files (multifilesink); filename = g_strdup_printf (multifilesink->filename, multifilesink->index); multifilesink->file = g_fopen (filename, "wb"); if (multifilesink->file == NULL) { g_free (filename); return FALSE; } GST_INFO_OBJECT (multifilesink, "opening file %s", filename); multifilesink->files = g_slist_append (multifilesink->files, filename); multifilesink->n_files += 1; multifilesink->cur_file_size = 0; return TRUE; } static void gst_multi_file_sink_close_file (GstMultiFileSink * multifilesink, GstBuffer * buffer) { char *filename; fclose (multifilesink->file); multifilesink->file = NULL; if (buffer) { filename = g_strdup_printf (multifilesink->filename, multifilesink->index); gst_multi_file_sink_post_message (multifilesink, buffer, filename); g_free (filename); } multifilesink->index++; } gst-plugins-good-0.10.31/gst/multifile/Makefile.in0000644000175000017500000010203311720560234016632 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/multifile DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstmultifile_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstmultifile_la_OBJECTS = \ libgstmultifile_la-gstmultifilesink.lo \ libgstmultifile_la-gstmultifilesrc.lo \ libgstmultifile_la-gstmultifile.lo \ libgstmultifile_la-gstsplitfilesrc.lo \ libgstmultifile_la-patternspec.lo libgstmultifile_la_OBJECTS = $(am_libgstmultifile_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstmultifile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstmultifile_la_CFLAGS) $(CFLAGS) \ $(libgstmultifile_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstmultifile_la_SOURCES) DIST_SOURCES = $(libgstmultifile_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstmultifile.la libgstmultifile_la_SOURCES = \ gstmultifilesink.c \ gstmultifilesrc.c \ gstmultifile.c \ gstsplitfilesrc.c \ patternspec.c libgstmultifile_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS) libgstmultifile_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS) libgstmultifile_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmultifile_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstmultifilesrc.h gstmultifilesink.h gstsplitfilesrc.h patternspec.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/multifile/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/multifile/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstmultifile.la: $(libgstmultifile_la_OBJECTS) $(libgstmultifile_la_DEPENDENCIES) $(EXTRA_libgstmultifile_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstmultifile_la_LINK) -rpath $(plugindir) $(libgstmultifile_la_OBJECTS) $(libgstmultifile_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstmultifile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstmultifilesink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultifile_la-patternspec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstmultifile_la-gstmultifilesink.lo: gstmultifilesink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstmultifilesink.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstmultifilesink.Tpo -c -o libgstmultifile_la-gstmultifilesink.lo `test -f 'gstmultifilesink.c' || echo '$(srcdir)/'`gstmultifilesink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstmultifilesink.Tpo $(DEPDIR)/libgstmultifile_la-gstmultifilesink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultifilesink.c' object='libgstmultifile_la-gstmultifilesink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstmultifilesink.lo `test -f 'gstmultifilesink.c' || echo '$(srcdir)/'`gstmultifilesink.c libgstmultifile_la-gstmultifilesrc.lo: gstmultifilesrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstmultifilesrc.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Tpo -c -o libgstmultifile_la-gstmultifilesrc.lo `test -f 'gstmultifilesrc.c' || echo '$(srcdir)/'`gstmultifilesrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Tpo $(DEPDIR)/libgstmultifile_la-gstmultifilesrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultifilesrc.c' object='libgstmultifile_la-gstmultifilesrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstmultifilesrc.lo `test -f 'gstmultifilesrc.c' || echo '$(srcdir)/'`gstmultifilesrc.c libgstmultifile_la-gstmultifile.lo: gstmultifile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstmultifile.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstmultifile.Tpo -c -o libgstmultifile_la-gstmultifile.lo `test -f 'gstmultifile.c' || echo '$(srcdir)/'`gstmultifile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstmultifile.Tpo $(DEPDIR)/libgstmultifile_la-gstmultifile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmultifile.c' object='libgstmultifile_la-gstmultifile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstmultifile.lo `test -f 'gstmultifile.c' || echo '$(srcdir)/'`gstmultifile.c libgstmultifile_la-gstsplitfilesrc.lo: gstsplitfilesrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-gstsplitfilesrc.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Tpo -c -o libgstmultifile_la-gstsplitfilesrc.lo `test -f 'gstsplitfilesrc.c' || echo '$(srcdir)/'`gstsplitfilesrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Tpo $(DEPDIR)/libgstmultifile_la-gstsplitfilesrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsplitfilesrc.c' object='libgstmultifile_la-gstsplitfilesrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-gstsplitfilesrc.lo `test -f 'gstsplitfilesrc.c' || echo '$(srcdir)/'`gstsplitfilesrc.c libgstmultifile_la-patternspec.lo: patternspec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -MT libgstmultifile_la-patternspec.lo -MD -MP -MF $(DEPDIR)/libgstmultifile_la-patternspec.Tpo -c -o libgstmultifile_la-patternspec.lo `test -f 'patternspec.c' || echo '$(srcdir)/'`patternspec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultifile_la-patternspec.Tpo $(DEPDIR)/libgstmultifile_la-patternspec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='patternspec.c' object='libgstmultifile_la-patternspec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultifile_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultifile_la_CFLAGS) $(CFLAGS) -c -o libgstmultifile_la-patternspec.lo `test -f 'patternspec.c' || echo '$(srcdir)/'`patternspec.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmultifile -:SHARED libgstmultifile \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmultifile_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultifile_la_CFLAGS) \ -:LDFLAGS $(libgstmultifile_la_LDFLAGS) \ $(libgstmultifile_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/multifile/gstsplitfilesrc.c0000644000175000017500000004150711677341656020202 00000000000000/* GStreamer Split File Source * Copyright (C) 2011 Collabora Ltd. * * 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-splitfilesrc * @see_also: #GstFileSrc, #GstMultiFileSrc * * Reads data from multiple files, presenting those files as one continuous * file to downstream elements. This is useful for reading a large file that * had to be split into multiple parts due to filesystem file size limitations, * for example. * * The files to select are chosen via the location property, which supports * (and expects) shell-style wildcards (but only for the filename, not for * directories). The results will be sorted. * * * Example launch line * |[ * gst-launch splitfilesrc location="/path/to/part-*.mpg" ! decodebin ! ... \ * ]| Plays the different parts as if they were one single MPEG file. * * * Since: 0.10.31 */ /* TODO: * - implement splitfile:// URI handler? */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstsplitfilesrc.h" #include "patternspec.h" #include #ifdef G_OS_WIN32 #define DEFAULT_PATTERN_MATCH_MODE MATCH_MODE_UTF8 #else #define DEFAULT_PATTERN_MATCH_MODE MATCH_MODE_AUTO #endif enum { PROP_LOCATION = 1 }; #define DEFAULT_LOCATION NULL static void gst_split_file_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_split_file_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_split_file_src_finalize (GObject * obj); static gboolean gst_split_file_src_start (GstBaseSrc * basesrc); static gboolean gst_split_file_src_stop (GstBaseSrc * basesrc); static gboolean gst_split_file_src_can_seek (GstBaseSrc * basesrc); static gboolean gst_split_file_src_check_get_range (GstBaseSrc * basesrc); static gboolean gst_split_file_src_get_size (GstBaseSrc * basesrc, guint64 * s); static gboolean gst_split_file_src_unlock (GstBaseSrc * basesrc); static GstFlowReturn gst_split_file_src_create (GstBaseSrc * basesrc, guint64 offset, guint size, GstBuffer ** buffer); static GstStaticPadTemplate gst_split_file_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GST_DEBUG_CATEGORY_STATIC (splitfilesrc_debug); #define GST_CAT_DEFAULT splitfilesrc_debug GST_BOILERPLATE (GstSplitFileSrc, gst_split_file_src, GstBaseSrc, GST_TYPE_BASE_SRC); static void gst_split_file_src_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); GST_DEBUG_CATEGORY_INIT (splitfilesrc_debug, "splitfilesrc", 0, "splitfilesrc element"); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gst_split_file_src_pad_template)); gst_element_class_set_details_simple (gstelement_class, "Split-File Source", "Source/File", "Read a sequentially named set of files as if it was one large file", "Tim-Philipp Müller "); } #ifdef G_OS_WIN32 #define WIN32_BLURB " Location string must be in UTF-8 encoding (on Windows)." #else #define WIN32_BLURB /* nothing */ #endif static void gst_split_file_src_class_init (GstSplitFileSrcClass * klass) { GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = gst_split_file_src_set_property; gobject_class->get_property = gst_split_file_src_get_property; gobject_class->finalize = gst_split_file_src_finalize; g_object_class_install_property (gobject_class, PROP_LOCATION, g_param_spec_string ("location", "File Location", "Wildcard pattern to match file names of the input files. If " "the location is an absolute path or contains directory components, " "only the base file name part will be considered for pattern " "matching. The results will be sorted." WIN32_BLURB, DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_split_file_src_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_split_file_src_stop); gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_split_file_src_create); gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_split_file_src_get_size); gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_split_file_src_unlock); gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_split_file_src_can_seek); gstbasesrc_class->check_get_range = GST_DEBUG_FUNCPTR (gst_split_file_src_check_get_range); } static void gst_split_file_src_init (GstSplitFileSrc * splitfilesrc, GstSplitFileSrcClass * g_class) { } static void gst_split_file_src_finalize (GObject * obj) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (obj); g_free (src->location); src->location = NULL; G_OBJECT_CLASS (parent_class)->finalize (obj); } static gboolean gst_split_file_src_can_seek (GstBaseSrc * basesrc) { return TRUE; } static gboolean gst_split_file_src_check_get_range (GstBaseSrc * basesrc) { return TRUE; } static gboolean gst_split_file_src_unlock (GstBaseSrc * basesrc) { /* This is not actually that useful, since all normal file * operations are fully blocking anyway */ #if 0 GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); GST_DEBUG_OBJECT (src, "cancelling pending I/O operation if there is one"); /* g_cancellable_cancel (src->cancellable); */ GST_DEBUG_OBJECT (src, "done"); #endif return TRUE; } static gboolean gst_split_file_src_get_size (GstBaseSrc * basesrc, guint64 * size) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); *size = src->parts[src->num_parts - 1].stop + 1; return TRUE; } static void gst_split_file_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (object); switch (prop_id) { case PROP_LOCATION: GST_OBJECT_LOCK (src); g_free (src->location); src->location = g_value_dup_string (value); #ifdef G_OS_WIN32 if (!g_utf8_validate (src->location, -1, NULL)) { g_warning ("splitfilesrc 'location' property must be in UTF-8 " "encoding on Windows"); } #endif GST_OBJECT_UNLOCK (src); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_split_file_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (object); switch (prop_id) { case PROP_LOCATION: GST_OBJECT_LOCK (src); g_value_set_string (value, src->location); GST_OBJECT_UNLOCK (src); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static int gst_split_file_src_array_sortfunc (gchar ** a, gchar ** b) { return strcmp (*a, *b); } static gchar ** gst_split_file_src_find_files (GstSplitFileSrc * src, const gchar * dirname, const gchar * basename, GError ** err) { PatternSpec *pspec; GPtrArray *files; const gchar *name; GDir *dir; if (dirname == NULL || basename == NULL) goto invalid_location; GST_INFO_OBJECT (src, "checking in directory '%s' for pattern '%s'", dirname, basename); dir = g_dir_open (dirname, 0, err); if (dir == NULL) return NULL; if (DEFAULT_PATTERN_MATCH_MODE == MATCH_MODE_UTF8 && !g_utf8_validate (basename, -1, NULL)) { goto not_utf8; } /* mode will be AUTO on linux/unix and UTF8 on win32 */ pspec = pattern_spec_new (basename, DEFAULT_PATTERN_MATCH_MODE); files = g_ptr_array_new (); while ((name = g_dir_read_name (dir))) { GST_TRACE_OBJECT (src, "check: %s", name); if (pattern_match_string (pspec, name)) { GST_DEBUG_OBJECT (src, "match: %s", name); g_ptr_array_add (files, g_build_filename (dirname, name, NULL)); } } if (files->len == 0) goto no_matches; g_ptr_array_sort (files, (GCompareFunc) gst_split_file_src_array_sortfunc); g_ptr_array_add (files, NULL); pattern_spec_free (pspec); g_dir_close (dir); return (gchar **) g_ptr_array_free (files, FALSE); /* ERRORS */ invalid_location: { g_set_error_literal (err, G_FILE_ERROR, G_FILE_ERROR_INVAL, "No filename specified."); return NULL; } not_utf8: { g_dir_close (dir); g_set_error_literal (err, G_FILE_ERROR, G_FILE_ERROR_INVAL, "Filename pattern must be UTF-8 on Windows."); return NULL; } no_matches: { pattern_spec_free (pspec); g_dir_close (dir); g_set_error_literal (err, G_FILE_ERROR, G_FILE_ERROR_NOENT, "Found no files matching the pattern."); return NULL; } } static gboolean gst_split_file_src_start (GstBaseSrc * basesrc) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); GCancellable *cancel; gboolean ret = FALSE; guint64 offset; GError *err = NULL; gchar *basename = NULL; gchar *dirname = NULL; gchar **files; guint i; GST_OBJECT_LOCK (src); if (src->location != NULL && src->location[0] != '\0') { basename = g_path_get_basename (src->location); dirname = g_path_get_dirname (src->location); } GST_OBJECT_UNLOCK (src); files = gst_split_file_src_find_files (src, dirname, basename, &err); if (files == NULL || *files == NULL) goto no_files; src->num_parts = g_strv_length (files); src->parts = g_new0 (GstFilePart, src->num_parts); cancel = src->cancellable; offset = 0; for (i = 0; i < src->num_parts; ++i) { GFileInputStream *stream; GFileInfo *info; goffset size; GFile *file; file = g_file_new_for_path (files[i]); stream = g_file_read (file, cancel, &err); g_object_unref (file); if (err != NULL) goto open_read_error; info = g_file_input_stream_query_info (stream, "standard::*", NULL, &err); if (err != NULL) { g_object_unref (stream); goto query_info_error; } size = g_file_info_get_size (info); g_object_unref (info); src->parts[i].stream = stream; src->parts[i].path = g_strdup (files[i]); src->parts[i].start = offset; src->parts[i].stop = offset + size - 1; GST_DEBUG ("[%010" G_GUINT64_FORMAT "-%010" G_GUINT64_FORMAT "] %s", src->parts[i].start, src->parts[i].stop, src->parts[i].path); offset += size; } GST_INFO ("Successfully opened %u file parts for reading", src->num_parts); src->cur_part = 0; src->cancellable = g_cancellable_new (); ret = TRUE; done: if (err != NULL) g_error_free (err); g_strfreev (files); g_free (basename); g_free (dirname); return ret; /* ERRORS */ no_files: { if (err->code == G_IO_ERROR_CANCELLED) goto cancelled; GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", err->message), ("Failed to find files in '%s' for pattern '%s'", GST_STR_NULL (dirname), GST_STR_NULL (basename))); goto done; } open_read_error: { if (err->code == G_IO_ERROR_CANCELLED) goto cancelled; GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", err->message), ("Failed to open file '%s' for reading", files[i])); goto done; } query_info_error: { if (err->code == G_IO_ERROR_CANCELLED) goto cancelled; GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("%s", err->message), ("Failed to query info for file '%s'", files[i])); goto done; } cancelled: { GST_DEBUG_OBJECT (src, "I/O operation cancelled from another thread"); goto done; } } static gboolean gst_split_file_src_stop (GstBaseSrc * basesrc) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); guint i; for (i = 0; i < src->num_parts; ++i) { if (src->parts[i].stream != NULL) g_object_unref (src->parts[i].stream); g_free (src->parts[i].path); } g_free (src->parts); src->parts = NULL; src->num_parts = 0; g_object_unref (src->cancellable); src->cancellable = NULL; return TRUE; } static gboolean gst_split_file_src_find_part_for_offset (GstSplitFileSrc * src, guint64 offset, guint * part_number) { GstFilePart *part; guint i; /* TODO: could use gst_util_array_binary_search() here */ part = src->parts; for (i = 0; i < src->num_parts; ++i) { if (offset >= part->start && offset <= part->stop) { *part_number = i; return TRUE; } ++part; } return FALSE; } static GstFlowReturn gst_split_file_src_create (GstBaseSrc * basesrc, guint64 offset, guint size, GstBuffer ** buffer) { GstSplitFileSrc *src = GST_SPLIT_FILE_SRC (basesrc); GstFilePart cur_part; GInputStream *stream; GCancellable *cancel; GSeekable *seekable; GstBuffer *buf; GError *err = NULL; guint64 read_offset; guint8 *data; guint to_read; cur_part = src->parts[src->cur_part]; if (offset < cur_part.start || offset > cur_part.stop) { if (!gst_split_file_src_find_part_for_offset (src, offset, &src->cur_part)) return GST_FLOW_UNEXPECTED; cur_part = src->parts[src->cur_part]; } GST_LOG_OBJECT (src, "current part: %u (%" G_GUINT64_FORMAT " - " "%" G_GUINT64_FORMAT ", %s)", src->cur_part, cur_part.start, cur_part.stop, cur_part.path); buf = gst_buffer_new_and_alloc (size); GST_BUFFER_OFFSET (buf) = offset; data = GST_BUFFER_DATA (buf); cancel = src->cancellable; while (size > 0) { guint64 bytes_to_end_of_part; gsize read = 0; /* we want the offset into the file part */ read_offset = offset - cur_part.start; GST_LOG ("Reading part %03u from offset %" G_GUINT64_FORMAT " (%s)", src->cur_part, read_offset, cur_part.path); /* FIXME: only seek when needed (hopefully gio is smart) */ seekable = G_SEEKABLE (cur_part.stream); if (!g_seekable_seek (seekable, read_offset, G_SEEK_SET, cancel, &err)) goto seek_failed; GST_LOG_OBJECT (src, "now: %" G_GUINT64_FORMAT, g_seekable_tell (seekable)); bytes_to_end_of_part = (cur_part.stop - cur_part.start) + 1 - read_offset; to_read = MIN (size, bytes_to_end_of_part); GST_LOG_OBJECT (src, "reading %u bytes from part %u (bytes to end of " "part: %u)", to_read, src->cur_part, (guint) bytes_to_end_of_part); stream = G_INPUT_STREAM (cur_part.stream); /* NB: we won't try to read beyond EOF */ if (!g_input_stream_read_all (stream, data, to_read, &read, cancel, &err)) goto read_failed; GST_LOG_OBJECT (src, "read %u bytes", (guint) read); data += read; size -= read; offset += read; /* are we done? */ if (size == 0) break; GST_LOG_OBJECT (src, "%u bytes left to read for this chunk", size); /* corner case, this should never really happen (assuming basesrc clips * requests beyond the file size) */ if (read < to_read) { if (src->cur_part == src->num_parts - 1) { /* last file part, stop reading and truncate buffer */ GST_BUFFER_SIZE (buf) = offset - GST_BUFFER_OFFSET (buf); break; } else { goto file_part_changed; } } ++src->cur_part; cur_part = src->parts[src->cur_part]; } GST_BUFFER_OFFSET_END (buf) = offset; *buffer = buf; GST_LOG_OBJECT (src, "read %u bytes into buf %p", GST_BUFFER_SIZE (buf), buf); return GST_FLOW_OK; /* ERRORS */ seek_failed: { if (err->code == G_IO_ERROR_CANCELLED) goto cancelled; GST_ELEMENT_ERROR (src, RESOURCE, SEEK, (NULL), ("Seek to %" G_GUINT64_FORMAT " in %s failed", read_offset, cur_part.path)); g_error_free (err); gst_buffer_unref (buf); return GST_FLOW_ERROR; } read_failed: { if (err->code == G_IO_ERROR_CANCELLED) goto cancelled; GST_ELEMENT_ERROR (src, RESOURCE, READ, ("%s", err->message), ("Read from %" G_GUINT64_FORMAT " in %s failed", read_offset, cur_part.path)); g_error_free (err); gst_buffer_unref (buf); return GST_FLOW_ERROR; } file_part_changed: { GST_ELEMENT_ERROR (src, RESOURCE, READ, ("Read error while reading file part %s", cur_part.path), ("Short read in file part, file may have been modified since start")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } cancelled: { GST_DEBUG_OBJECT (src, "I/O operation cancelled from another thread"); g_error_free (err); gst_buffer_unref (buf); return GST_FLOW_WRONG_STATE; } } gst-plugins-good-0.10.31/gst/imagefreeze/0000755000175000017500000000000011720565303015141 500000000000000gst-plugins-good-0.10.31/gst/imagefreeze/Makefile.am0000644000175000017500000000153511671175353017130 00000000000000plugin_LTLIBRARIES = libgstimagefreeze.la libgstimagefreeze_la_SOURCES = gstimagefreeze.c libgstimagefreeze_la_CFLAGS = $(GST_CFLAGS) libgstimagefreeze_la_LIBADD = $(GST_LIBS) libgstimagefreeze_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstimagefreeze_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstimagefreeze.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstimagefreeze -:SHARED libgstimagefreeze \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstimagefreeze_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstimagefreeze_la_CFLAGS) \ -:LDFLAGS $(libgstimagefreeze_la_LDFLAGS) \ $(libgstimagefreeze_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/imagefreeze/gstimagefreeze.c0000644000175000017500000006521311707323241020233 00000000000000/* GStreamer * Copyright (c) 2005 Edward Hervey * Copyright (C) 2010 Sebastian Dröge * * 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-imagefreeze * * The imagefreeze element generates a still frame video stream from * the input. It duplicates the first frame with the framerate requested * by downstream, allows seeking and answers queries. * * * Example launch line * |[ * gst-launch -v filesrc location=some.png ! decodebin2 ! imagefreeze ! autovideosink * ]| This pipeline shows a still frame stream of a PNG file. * */ /* This is based on the imagefreeze element from PiTiVi: * http://git.gnome.org/browse/pitivi/tree/pitivi/elements/imagefreeze.py */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include "gstimagefreeze.h" static void gst_image_freeze_finalize (GObject * object); static void gst_image_freeze_reset (GstImageFreeze * self); static GstStateChangeReturn gst_image_freeze_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_image_freeze_sink_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_image_freeze_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_image_freeze_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_image_freeze_sink_getcaps (GstPad * pad); static gboolean gst_image_freeze_sink_query (GstPad * pad, GstQuery * query); static GstFlowReturn gst_image_freeze_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static void gst_image_freeze_src_loop (GstPad * pad); static gboolean gst_image_freeze_src_event (GstPad * pad, GstEvent * event); static gboolean gst_image_freeze_src_query (GstPad * pad, GstQuery * query); static const GstQueryType *gst_image_freeze_src_query_type (GstPad * pad); static GstStaticPadTemplate sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray")); static GstStaticPadTemplate src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray")); GST_DEBUG_CATEGORY_STATIC (gst_image_freeze_debug); #define GST_CAT_DEFAULT gst_image_freeze_debug GST_BOILERPLATE (GstImageFreeze, gst_image_freeze, GstElement, GST_TYPE_ELEMENT); static void gst_image_freeze_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (gstelement_class, "Still frame stream generator", "Filter/Video", "Generates a still frame stream from an image", "Sebastian Dröge "); gst_element_class_add_static_pad_template (gstelement_class, &sink_pad_template); gst_element_class_add_static_pad_template (gstelement_class, &src_pad_template); } static void gst_image_freeze_class_init (GstImageFreezeClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gobject_class->finalize = gst_image_freeze_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_image_freeze_change_state); } static void gst_image_freeze_init (GstImageFreeze * self, GstImageFreezeClass * g_class) { self->sinkpad = gst_pad_new_from_static_template (&sink_pad_template, "sink"); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_chain)); gst_pad_set_event_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_event)); gst_pad_set_query_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_query)); gst_pad_set_setcaps_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_setcaps)); gst_pad_set_getcaps_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_getcaps)); gst_pad_set_bufferalloc_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_image_freeze_sink_bufferalloc)); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_image_freeze_src_event)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_image_freeze_src_query)); gst_pad_set_query_type_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_image_freeze_src_query_type)); gst_pad_use_fixed_caps (self->srcpad); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); self->lock = g_mutex_new (); gst_image_freeze_reset (self); } static void gst_image_freeze_finalize (GObject * object) { GstImageFreeze *self = GST_IMAGE_FREEZE (object); gst_image_freeze_reset (self); if (self->lock) g_mutex_free (self->lock); self->lock = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_image_freeze_reset (GstImageFreeze * self) { GST_DEBUG_OBJECT (self, "Resetting internal state"); g_mutex_lock (self->lock); gst_buffer_replace (&self->buffer, NULL); gst_segment_init (&self->segment, GST_FORMAT_TIME); self->need_segment = TRUE; gst_event_replace (&self->close_segment, NULL); self->fps_n = self->fps_d = 0; self->offset = 0; g_mutex_unlock (self->lock); g_atomic_int_set (&self->seeking, 0); } static gboolean gst_image_freeze_sink_setcaps (GstPad * pad, GstCaps * caps) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); gboolean ret = FALSE; GstStructure *s; gint fps_n, fps_d; GstCaps *othercaps, *intersection; guint i, n; caps = gst_caps_make_writable (gst_caps_ref (caps)); GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); /* 1. Remove framerate */ gst_structure_remove_field (s, "framerate"); gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); /* 2. Intersect with template caps */ othercaps = (GstCaps *) gst_pad_get_pad_template_caps (pad); intersection = gst_caps_intersect (caps, othercaps); GST_DEBUG_OBJECT (pad, "Intersecting: %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (pad, "with: %" GST_PTR_FORMAT, othercaps); GST_DEBUG_OBJECT (pad, "gave: %" GST_PTR_FORMAT, intersection); gst_caps_unref (caps); caps = intersection; intersection = othercaps = NULL; /* 3. Intersect with downstream peer caps */ othercaps = gst_pad_peer_get_caps (self->srcpad); if (othercaps) { intersection = gst_caps_intersect (caps, othercaps); GST_DEBUG_OBJECT (pad, "Intersecting: %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (pad, "with: %" GST_PTR_FORMAT, othercaps); GST_DEBUG_OBJECT (pad, "gave: %" GST_PTR_FORMAT, intersection); gst_caps_unref (othercaps); gst_caps_unref (caps); caps = intersection; intersection = othercaps = NULL; } /* 4. For every candidate check if it's accepted downstream * and fixate framerate to nearest 25/1 */ n = gst_caps_get_size (caps); for (i = 0; i < n; i++) { GstCaps *candidate = gst_caps_new_empty (); GstStructure *s = gst_structure_copy (gst_caps_get_structure (caps, i)); gst_caps_append_structure (candidate, s); if (gst_pad_peer_accept_caps (self->srcpad, candidate)) { if (gst_structure_has_field_typed (s, "framerate", GST_TYPE_FRACTION) || gst_structure_fixate_field_nearest_fraction (s, "framerate", 25, 1)) { gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d); if (fps_d != 0) { g_mutex_lock (self->lock); self->fps_n = fps_n; self->fps_d = fps_d; g_mutex_unlock (self->lock); GST_DEBUG_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, candidate); gst_pad_set_caps (self->srcpad, candidate); gst_caps_unref (candidate); ret = TRUE; goto done; } else { GST_WARNING_OBJECT (pad, "Invalid caps with framerate %d/%d", fps_n, fps_d); } } } gst_caps_unref (candidate); } done: if (!ret) GST_ERROR_OBJECT (pad, "No usable caps found"); gst_caps_unref (caps); gst_object_unref (self); return ret; } static GstCaps * gst_image_freeze_sink_getcaps (GstPad * pad) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); GstCaps *ret, *tmp; guint i, n; if (GST_PAD_CAPS (pad)) { ret = gst_caps_copy (GST_PAD_CAPS (pad)); goto done; } tmp = gst_pad_peer_get_caps (self->srcpad); if (tmp) { ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (pad)); gst_caps_unref (tmp); } else { ret = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); } n = gst_caps_get_size (ret); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (ret, i); gst_structure_remove_field (s, "framerate"); gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); } done: gst_object_unref (self); GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); return ret; } static gboolean gst_image_freeze_sink_query (GstPad * pad, GstQuery * query) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); gboolean ret; GstPad *peer = gst_pad_get_peer (self->srcpad); GST_LOG_OBJECT (pad, "Handling query of type '%s'", gst_query_type_get_name (GST_QUERY_TYPE (query))); if (!peer) { GST_INFO_OBJECT (pad, "No peer yet, dropping query"); ret = FALSE; } else { ret = gst_pad_query (peer, query); gst_object_unref (peer); } gst_object_unref (self); return ret; } static GstFlowReturn gst_image_freeze_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); GstFlowReturn ret; gboolean do_alloc; GST_LOG_OBJECT (pad, "Allocating buffer with offset 0x%" G_GINT64_MODIFIER "x and size %u with caps: %" GST_PTR_FORMAT, offset, size, caps); *buf = NULL; g_mutex_lock (self->lock); do_alloc = self->buffer == NULL; g_mutex_unlock (self->lock); if (do_alloc) { gboolean seeking = FALSE; do { GST_PAD_STREAM_LOCK (self->srcpad); ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); seeking = ret == GST_FLOW_WRONG_STATE && g_atomic_int_get (&self->seeking); GST_PAD_STREAM_UNLOCK (self->srcpad); } while (seeking); if (G_UNLIKELY (ret != GST_FLOW_OK)) GST_ERROR_OBJECT (pad, "Allocating buffer failed: %s", gst_flow_get_name (ret)); } else { /* Let upstream go EOS if we already have a buffer */ ret = GST_FLOW_UNEXPECTED; } gst_object_unref (self); return ret; } static gboolean gst_image_freeze_convert (GstImageFreeze * self, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean ret = FALSE; if (src_format == *dest_format) { *dest_value = src_value; return TRUE; } if (src_value == -1) { *dest_value = -1; return TRUE; } switch (src_format) { case GST_FORMAT_DEFAULT:{ switch (*dest_format) { case GST_FORMAT_TIME: g_mutex_lock (self->lock); if (self->fps_n == 0) *dest_value = -1; else *dest_value = gst_util_uint64_scale (src_value, GST_SECOND * self->fps_d, self->fps_n); g_mutex_unlock (self->lock); ret = TRUE; break; default: break; } break; } case GST_FORMAT_TIME:{ switch (*dest_format) { case GST_FORMAT_DEFAULT: g_mutex_lock (self->lock); *dest_value = gst_util_uint64_scale (src_value, self->fps_n, self->fps_d * GST_SECOND); g_mutex_unlock (self->lock); ret = TRUE; break; default: break; } break; } default: break; } return ret; } static const GstQueryType * gst_image_freeze_src_query_type (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_SEEKING, GST_QUERY_CONVERT, 0 }; return types; } static gboolean gst_image_freeze_src_query (GstPad * pad, GstQuery * query) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); gboolean ret = FALSE; GST_LOG_OBJECT (pad, "Handling query of type '%s'", gst_query_type_get_name (GST_QUERY_TYPE (query))); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT:{ GstFormat src_format, dest_format; gint64 src_value, dest_value; gst_query_parse_convert (query, &src_format, &src_value, &dest_format, &dest_value); ret = gst_image_freeze_convert (self, src_format, src_value, &dest_format, &dest_value); if (ret) gst_query_set_convert (query, src_format, src_value, dest_format, dest_value); break; } case GST_QUERY_POSITION:{ GstFormat format; gint64 position; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_DEFAULT:{ g_mutex_lock (self->lock); position = self->offset; g_mutex_unlock (self->lock); ret = TRUE; break; } case GST_FORMAT_TIME:{ g_mutex_lock (self->lock); position = self->segment.last_stop; g_mutex_unlock (self->lock); ret = TRUE; break; } default: break; } if (ret) { gst_query_set_position (query, format, position); GST_DEBUG_OBJECT (pad, "Returning position %" G_GINT64_FORMAT " in format %s", position, gst_format_get_name (format)); } else { GST_DEBUG_OBJECT (pad, "Position query failed"); } break; } case GST_QUERY_DURATION:{ GstFormat format; gint64 duration; gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME:{ g_mutex_lock (self->lock); duration = self->segment.stop; g_mutex_unlock (self->lock); ret = TRUE; break; } case GST_FORMAT_DEFAULT:{ g_mutex_lock (self->lock); duration = self->segment.stop; if (duration != -1) duration = gst_util_uint64_scale (duration, self->fps_n, GST_SECOND * self->fps_d); g_mutex_unlock (self->lock); ret = TRUE; break; } default: break; } if (ret) { gst_query_set_duration (query, format, duration); GST_DEBUG_OBJECT (pad, "Returning duration %" G_GINT64_FORMAT " in format %s", duration, gst_format_get_name (format)); } else { GST_DEBUG_OBJECT (pad, "Duration query failed"); } break; } case GST_QUERY_SEEKING:{ GstFormat format; gboolean seekable; gst_query_parse_seeking (query, &format, NULL, NULL, NULL); seekable = (format == GST_FORMAT_TIME || format == GST_FORMAT_DEFAULT); gst_query_set_seeking (query, format, seekable, (seekable ? 0 : -1), -1); ret = TRUE; break; } default: ret = FALSE; break; } gst_object_unref (self); return ret; } static gboolean gst_image_freeze_sink_event (GstPad * pad, GstEvent * event) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); gboolean ret; GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: if (!self->buffer) { /* if we receive EOS before a buffer arrives, then let it pass */ GST_DEBUG_OBJECT (self, "EOS without input buffer, passing on"); ret = gst_pad_push_event (self->srcpad, event); break; } /* fall-through */ case GST_EVENT_NEWSEGMENT: GST_DEBUG_OBJECT (pad, "Dropping event"); gst_event_unref (event); ret = TRUE; break; case GST_EVENT_FLUSH_START: gst_image_freeze_reset (self); /* fall through */ default: ret = gst_pad_push_event (self->srcpad, event); break; } gst_object_unref (self); return ret; } static gboolean gst_image_freeze_src_event (GstPad * pad, GstEvent * event) { GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); gboolean ret; GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: case GST_EVENT_QOS: case GST_EVENT_LATENCY: case GST_EVENT_STEP: GST_DEBUG_OBJECT (pad, "Dropping event"); gst_event_unref (event); ret = TRUE; break; case GST_EVENT_SEEK:{ gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; gint64 last_stop; gboolean start_task; gboolean flush; gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, &stop_type, &stop); gst_event_unref (event); flush = ! !(flags & GST_SEEK_FLAG_FLUSH); if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT) { GST_ERROR_OBJECT (pad, "Seek in invalid format: %s", gst_format_get_name (format)); ret = FALSE; break; } if (format == GST_FORMAT_DEFAULT) { format = GST_FORMAT_TIME; if (!gst_image_freeze_convert (self, GST_FORMAT_DEFAULT, start, &format, &start) || !gst_image_freeze_convert (self, GST_FORMAT_DEFAULT, stop, &format, &stop) || start == -1 || stop == -1) { GST_ERROR_OBJECT (pad, "Failed to convert seek from DEFAULT format into TIME format"); ret = FALSE; break; } } if (flush) { GstEvent *e; g_atomic_int_set (&self->seeking, 1); e = gst_event_new_flush_start (); gst_pad_push_event (self->srcpad, e); } else { gst_pad_pause_task (self->srcpad); } GST_PAD_STREAM_LOCK (self->srcpad); g_mutex_lock (self->lock); gst_event_replace (&self->close_segment, NULL); if (!flush) { if (!self->need_segment && self->segment.rate >= 0) { self->close_segment = gst_event_new_new_segment_full (TRUE, self->segment.rate, self->segment.applied_rate, self->segment.format, self->segment.start, self->segment.last_stop, self->segment.time); } else if (!self->need_segment) { gint64 stop; if ((stop = self->segment.stop) == -1) stop = self->segment.duration; self->close_segment = gst_event_new_new_segment_full (TRUE, self->segment.rate, self->segment.applied_rate, self->segment.format, self->segment.last_stop, stop, self->segment.last_stop); } } gst_segment_set_seek (&self->segment, rate, format, flags, start_type, start, stop_type, stop, NULL); self->need_segment = TRUE; last_stop = self->segment.last_stop; start_task = self->buffer != NULL; g_mutex_unlock (self->lock); if (flush) { GstEvent *e; e = gst_event_new_flush_stop (); gst_pad_push_event (self->srcpad, e); g_atomic_int_set (&self->seeking, 0); } if (flags & GST_SEEK_FLAG_SEGMENT) { GstMessage *m; m = gst_message_new_segment_start (GST_OBJECT (self), format, last_stop); gst_element_post_message (GST_ELEMENT (self), m); } GST_PAD_STREAM_UNLOCK (self->srcpad); GST_DEBUG_OBJECT (pad, "Seek successful"); if (start_task) { g_mutex_lock (self->lock); if (self->buffer != NULL) gst_pad_start_task (self->srcpad, (GstTaskFunction) gst_image_freeze_src_loop, self->srcpad); g_mutex_unlock (self->lock); } ret = TRUE; break; } case GST_EVENT_FLUSH_START: gst_image_freeze_reset (self); /* fall through */ default: ret = gst_pad_push_event (self->sinkpad, event); break; } gst_object_unref (self); return ret; } static GstFlowReturn gst_image_freeze_sink_chain (GstPad * pad, GstBuffer * buffer) { GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad)); g_mutex_lock (self->lock); if (self->buffer) { GST_DEBUG_OBJECT (pad, "Already have a buffer, dropping"); gst_buffer_unref (buffer); g_mutex_unlock (self->lock); return GST_FLOW_UNEXPECTED; } self->buffer = buffer; gst_pad_start_task (self->srcpad, (GstTaskFunction) gst_image_freeze_src_loop, self->srcpad); g_mutex_unlock (self->lock); return GST_FLOW_OK; } static void gst_image_freeze_src_loop (GstPad * pad) { GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad)); GstBuffer *buffer; guint64 offset; GstClockTime timestamp, timestamp_end; gint64 cstart, cstop; gboolean in_seg, eos; g_mutex_lock (self->lock); if (!self->buffer) { GST_ERROR_OBJECT (pad, "Have no buffer yet"); g_mutex_unlock (self->lock); gst_pad_pause_task (self->srcpad); return; } buffer = gst_buffer_ref (self->buffer); buffer = gst_buffer_make_metadata_writable (buffer); g_mutex_unlock (self->lock); if (self->close_segment) { GST_DEBUG_OBJECT (pad, "Closing previous segment"); gst_pad_push_event (self->srcpad, self->close_segment); self->close_segment = NULL; } if (self->need_segment) { GstEvent *e; GST_DEBUG_OBJECT (pad, "Pushing NEWSEGMENT event: %" GST_SEGMENT_FORMAT, &self->segment); e = gst_event_new_new_segment_full (FALSE, self->segment.rate, self->segment.applied_rate, self->segment.format, self->segment.start, self->segment.stop, self->segment.start); g_mutex_lock (self->lock); if (self->segment.rate >= 0) { self->offset = gst_util_uint64_scale (self->segment.start, self->fps_n, self->fps_d * GST_SECOND); } else { self->offset = gst_util_uint64_scale (self->segment.stop, self->fps_n, self->fps_d * GST_SECOND); } g_mutex_unlock (self->lock); self->need_segment = FALSE; gst_pad_push_event (self->srcpad, e); } g_mutex_lock (self->lock); offset = self->offset; if (self->fps_n != 0) { timestamp = gst_util_uint64_scale (offset, self->fps_d * GST_SECOND, self->fps_n); timestamp_end = gst_util_uint64_scale (offset + 1, self->fps_d * GST_SECOND, self->fps_n); } else { timestamp = self->segment.start; timestamp_end = GST_CLOCK_TIME_NONE; } eos = (self->fps_n == 0 && offset > 0) || (self->segment.rate >= 0 && self->segment.stop != -1 && timestamp > self->segment.stop) || (self->segment.rate < 0 && offset == 0) || (self->segment.rate < 0 && self->segment.start != -1 && timestamp_end < self->segment.start); if (self->fps_n == 0 && offset > 0) in_seg = FALSE; else in_seg = gst_segment_clip (&self->segment, GST_FORMAT_TIME, timestamp, timestamp_end, &cstart, &cstop); if (in_seg) gst_segment_set_last_stop (&self->segment, GST_FORMAT_TIME, cstart); if (self->segment.rate >= 0) self->offset++; else self->offset--; g_mutex_unlock (self->lock); GST_DEBUG_OBJECT (pad, "Handling buffer with timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (in_seg) { GstFlowReturn ret; GST_BUFFER_TIMESTAMP (buffer) = cstart; GST_BUFFER_DURATION (buffer) = cstop - cstart; GST_BUFFER_OFFSET (buffer) = offset; GST_BUFFER_OFFSET_END (buffer) = offset + 1; gst_buffer_set_caps (buffer, GST_PAD_CAPS (self->srcpad)); ret = gst_pad_push (self->srcpad, buffer); GST_DEBUG_OBJECT (pad, "Pushing buffer resulted in %s", gst_flow_get_name (ret)); if (ret != GST_FLOW_OK) gst_pad_pause_task (self->srcpad); } else { gst_buffer_unref (buffer); } if (eos) { if ((self->segment.flags & GST_SEEK_FLAG_SEGMENT)) { GstMessage *m; GST_DEBUG_OBJECT (pad, "Sending segment done at end of segment"); if (self->segment.rate >= 0) m = gst_message_new_segment_done (GST_OBJECT_CAST (self), GST_FORMAT_TIME, self->segment.stop); else m = gst_message_new_segment_done (GST_OBJECT_CAST (self), GST_FORMAT_TIME, self->segment.start); gst_element_post_message (GST_ELEMENT_CAST (self), m); } else { GST_DEBUG_OBJECT (pad, "Sending EOS at end of segment"); gst_pad_push_event (self->srcpad, gst_event_new_eos ()); } gst_pad_pause_task (self->srcpad); } } static GstStateChangeReturn gst_image_freeze_change_state (GstElement * element, GstStateChange transition) { GstImageFreeze *self = GST_IMAGE_FREEZE (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_image_freeze_reset (self); break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_pad_stop_task (self->srcpad); gst_image_freeze_reset (self); break; default: break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_image_freeze_debug, "imagefreeze", 0, "imagefreeze element"); if (!gst_element_register (plugin, "imagefreeze", GST_RANK_NONE, GST_TYPE_IMAGE_FREEZE)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "imagefreeze", "Still frame stream generator", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/imagefreeze/gstimagefreeze.h0000644000175000017500000000417111671175353020245 00000000000000/* GStreamer * Copyright (C) 2010 Sebastian Dröge * * 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_IMAGE_FREEZE_H__ #define __GST_IMAGE_FREEZE_H__ #include G_BEGIN_DECLS #define GST_TYPE_IMAGE_FREEZE \ (gst_image_freeze_get_type()) #define GST_IMAGE_FREEZE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IMAGE_FREEZE,GstImageFreeze)) #define GST_IMAGE_FREEZE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IMAGE_FREEZE,GstImageFreezeClass)) #define GST_IMAGE_FREEZE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_IMAGE_FREEZE,GstImageFreezeClass)) #define GST_IS_IMAGE_FREEZE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IMAGE_FREEZE)) #define GST_IS_IMAGE_FREEZE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IMAGE_FREEZE)) typedef struct _GstImageFreeze GstImageFreeze; typedef struct _GstImageFreezeClass GstImageFreezeClass; struct _GstImageFreeze { GstElement parent; /* < private > */ GstPad *sinkpad; GstPad *srcpad; GMutex *lock; GstBuffer *buffer; gint fps_n, fps_d; GstSegment segment; gboolean need_segment; GstEvent *close_segment; guint64 offset; /* TRUE if currently doing a flushing seek, protected * by srcpad's stream lock */ gint seeking; }; struct _GstImageFreezeClass { GstElementClass parent_class; }; GType gst_image_freeze_get_type (void); G_END_DECLS #endif /* __GST_IMAGE_FREEZE_H__ */ gst-plugins-good-0.10.31/gst/imagefreeze/Makefile.in0000644000175000017500000006662011720560233017135 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/imagefreeze DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstimagefreeze_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgstimagefreeze_la_OBJECTS = \ libgstimagefreeze_la-gstimagefreeze.lo libgstimagefreeze_la_OBJECTS = $(am_libgstimagefreeze_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstimagefreeze_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstimagefreeze_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstimagefreeze_la_CFLAGS) $(CFLAGS) \ $(libgstimagefreeze_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstimagefreeze_la_SOURCES) DIST_SOURCES = $(libgstimagefreeze_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstimagefreeze.la libgstimagefreeze_la_SOURCES = gstimagefreeze.c libgstimagefreeze_la_CFLAGS = $(GST_CFLAGS) libgstimagefreeze_la_LIBADD = $(GST_LIBS) libgstimagefreeze_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstimagefreeze_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstimagefreeze.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/imagefreeze/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/imagefreeze/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstimagefreeze.la: $(libgstimagefreeze_la_OBJECTS) $(libgstimagefreeze_la_DEPENDENCIES) $(EXTRA_libgstimagefreeze_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstimagefreeze_la_LINK) -rpath $(plugindir) $(libgstimagefreeze_la_OBJECTS) $(libgstimagefreeze_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstimagefreeze_la-gstimagefreeze.lo: gstimagefreeze.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstimagefreeze_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstimagefreeze_la_CFLAGS) $(CFLAGS) -MT libgstimagefreeze_la-gstimagefreeze.lo -MD -MP -MF $(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Tpo -c -o libgstimagefreeze_la-gstimagefreeze.lo `test -f 'gstimagefreeze.c' || echo '$(srcdir)/'`gstimagefreeze.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Tpo $(DEPDIR)/libgstimagefreeze_la-gstimagefreeze.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstimagefreeze.c' object='libgstimagefreeze_la-gstimagefreeze.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstimagefreeze_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstimagefreeze_la_CFLAGS) $(CFLAGS) -c -o libgstimagefreeze_la-gstimagefreeze.lo `test -f 'gstimagefreeze.c' || echo '$(srcdir)/'`gstimagefreeze.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstimagefreeze -:SHARED libgstimagefreeze \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstimagefreeze_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstimagefreeze_la_CFLAGS) \ -:LDFLAGS $(libgstimagefreeze_la_LDFLAGS) \ $(libgstimagefreeze_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/deinterlace/0000755000175000017500000000000011720565302015134 500000000000000gst-plugins-good-0.10.31/gst/deinterlace/Makefile.am0000644000175000017500000000427411671175353017127 00000000000000plugin_LTLIBRARIES = libgstdeinterlace.la ORC_SOURCE=tvtime include $(top_srcdir)/common/orc.mak libgstdeinterlace_la_SOURCES = \ gstdeinterlace.c \ gstdeinterlacemethod.c \ tvtime/tomsmocomp.c \ tvtime/greedy.c \ tvtime/greedyh.c \ tvtime/vfir.c \ tvtime/weavetff.c \ tvtime/weavebff.c \ tvtime/weave.c \ tvtime/linear.c \ tvtime/linearblend.c \ tvtime/scalerbob.c nodist_libgstdeinterlace_la_SOURCES = $(ORC_NODIST_SOURCES) libgstdeinterlace_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) libgstdeinterlace_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) libgstdeinterlace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdeinterlace_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstdeinterlace.h \ gstdeinterlacemethod.h \ tvtime/mmx.h \ tvtime/sse.h \ tvtime/greedyh.asm \ tvtime/greedyhmacros.h \ tvtime/plugins.h \ tvtime/x86-64_macros.inc \ tvtime/tomsmocomp/SearchLoop0A.inc \ tvtime/tomsmocomp/SearchLoopBottom.inc \ tvtime/tomsmocomp/SearchLoopEdgeA8.inc \ tvtime/tomsmocomp/SearchLoopEdgeA.inc \ tvtime/tomsmocomp/SearchLoopOddA2.inc \ tvtime/tomsmocomp/SearchLoopOddA6.inc \ tvtime/tomsmocomp/SearchLoopOddAH2.inc \ tvtime/tomsmocomp/SearchLoopOddAH.inc \ tvtime/tomsmocomp/SearchLoopOddA.inc \ tvtime/tomsmocomp/SearchLoopTop.inc \ tvtime/tomsmocomp/SearchLoopVAH.inc \ tvtime/tomsmocomp/SearchLoopVA.inc \ tvtime/tomsmocomp/StrangeBob.inc \ tvtime/tomsmocomp/TomsMoCompAll2.inc \ tvtime/tomsmocomp/TomsMoCompAll.inc \ tvtime/tomsmocomp/tomsmocompmacros.h \ tvtime/tomsmocomp/WierdBob.inc Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstdeinterlace -:SHARED libgstdeinterlace \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstdeinterlace_la_SOURCES) \ $(nodist_libgstdeinterlace_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdeinterlace_la_CFLAGS) \ -:LDFLAGS $(libgstdeinterlace_la_LDFLAGS) \ $(libgstdeinterlace_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/deinterlace/gstdeinterlacemethod.c0000644000175000017500000007077411707374600021441 00000000000000/* * GStreamer * Copyright (C) 2008-2010 Sebastian Dröge * * 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 #include "gstdeinterlacemethod.h" G_DEFINE_ABSTRACT_TYPE (GstDeinterlaceMethod, gst_deinterlace_method, GST_TYPE_OBJECT); gboolean gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, gint height) { GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_CLASS (g_type_class_ref (type)); gboolean ret; if (format == GST_VIDEO_FORMAT_UNKNOWN) ret = TRUE; else ret = klass->supported (klass, format, width, height); g_type_class_unref (klass); return ret; } static gboolean gst_deinterlace_method_supported_impl (GstDeinterlaceMethodClass * klass, GstVideoFormat format, gint width, gint height) { switch (format) { case GST_VIDEO_FORMAT_YUY2: return (klass->deinterlace_frame_yuy2 != NULL); case GST_VIDEO_FORMAT_YVYU: return (klass->deinterlace_frame_yvyu != NULL); case GST_VIDEO_FORMAT_UYVY: return (klass->deinterlace_frame_uyvy != NULL); case GST_VIDEO_FORMAT_I420: return (klass->deinterlace_frame_i420 != NULL); case GST_VIDEO_FORMAT_YV12: return (klass->deinterlace_frame_yv12 != NULL); case GST_VIDEO_FORMAT_Y444: return (klass->deinterlace_frame_y444 != NULL); case GST_VIDEO_FORMAT_Y42B: return (klass->deinterlace_frame_y42b != NULL); case GST_VIDEO_FORMAT_Y41B: return (klass->deinterlace_frame_y41b != NULL); case GST_VIDEO_FORMAT_AYUV: return (klass->deinterlace_frame_ayuv != NULL); case GST_VIDEO_FORMAT_NV12: return (klass->deinterlace_frame_nv12 != NULL); case GST_VIDEO_FORMAT_NV21: return (klass->deinterlace_frame_nv21 != NULL); case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xRGB: return (klass->deinterlace_frame_argb != NULL); case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_xBGR: return (klass->deinterlace_frame_abgr != NULL); case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_RGBx: return (klass->deinterlace_frame_rgba != NULL); case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_BGRx: return (klass->deinterlace_frame_bgra != NULL); case GST_VIDEO_FORMAT_RGB: return (klass->deinterlace_frame_rgb != NULL); case GST_VIDEO_FORMAT_BGR: return (klass->deinterlace_frame_bgr != NULL); default: return FALSE; } } void gst_deinterlace_method_setup (GstDeinterlaceMethod * self, GstVideoFormat format, gint width, gint height) { GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); klass->setup (self, format, width, height); } static void gst_deinterlace_method_setup_impl (GstDeinterlaceMethod * self, GstVideoFormat format, gint width, gint height) { gint i; GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); self->format = format; self->frame_width = width; self->frame_height = height; self->deinterlace_frame = NULL; if (format == GST_VIDEO_FORMAT_UNKNOWN) return; for (i = 0; i < 4; i++) { self->width[i] = gst_video_format_get_component_width (format, i, width); self->height[i] = gst_video_format_get_component_height (format, i, height); self->offset[i] = gst_video_format_get_component_offset (format, i, width, height); self->row_stride[i] = gst_video_format_get_row_stride (format, i, width); self->pixel_stride[i] = gst_video_format_get_pixel_stride (format, i); } switch (format) { case GST_VIDEO_FORMAT_YUY2: self->deinterlace_frame = klass->deinterlace_frame_yuy2; break; case GST_VIDEO_FORMAT_YVYU: self->deinterlace_frame = klass->deinterlace_frame_yvyu; break; case GST_VIDEO_FORMAT_UYVY: self->deinterlace_frame = klass->deinterlace_frame_uyvy; break; case GST_VIDEO_FORMAT_I420: self->deinterlace_frame = klass->deinterlace_frame_i420; break; case GST_VIDEO_FORMAT_YV12: self->deinterlace_frame = klass->deinterlace_frame_yv12; break; case GST_VIDEO_FORMAT_Y444: self->deinterlace_frame = klass->deinterlace_frame_y444; break; case GST_VIDEO_FORMAT_Y42B: self->deinterlace_frame = klass->deinterlace_frame_y42b; break; case GST_VIDEO_FORMAT_Y41B: self->deinterlace_frame = klass->deinterlace_frame_y41b; break; case GST_VIDEO_FORMAT_AYUV: self->deinterlace_frame = klass->deinterlace_frame_ayuv; break; case GST_VIDEO_FORMAT_NV12: self->deinterlace_frame = klass->deinterlace_frame_nv12; break; case GST_VIDEO_FORMAT_NV21: self->deinterlace_frame = klass->deinterlace_frame_nv21; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xRGB: self->deinterlace_frame = klass->deinterlace_frame_argb; break; case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_xBGR: self->deinterlace_frame = klass->deinterlace_frame_abgr; break; case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_RGBx: self->deinterlace_frame = klass->deinterlace_frame_rgba; break; case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_BGRx: self->deinterlace_frame = klass->deinterlace_frame_bgra; break; case GST_VIDEO_FORMAT_RGB: self->deinterlace_frame = klass->deinterlace_frame_rgb; break; case GST_VIDEO_FORMAT_BGR: self->deinterlace_frame = klass->deinterlace_frame_bgr; break; default: self->deinterlace_frame = NULL; break; } } static void gst_deinterlace_method_class_init (GstDeinterlaceMethodClass * klass) { klass->setup = gst_deinterlace_method_setup_impl; klass->supported = gst_deinterlace_method_supported_impl; } static void gst_deinterlace_method_init (GstDeinterlaceMethod * self) { self->format = GST_VIDEO_FORMAT_UNKNOWN; } void gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, int cur_field_idx) { g_assert (self->deinterlace_frame != NULL); self->deinterlace_frame (self, history, history_count, outbuf, cur_field_idx); } gint gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self) { GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); return klass->fields_required; } gint gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self) { GstDeinterlaceMethodClass *klass = GST_DEINTERLACE_METHOD_GET_CLASS (self); return klass->latency; } G_DEFINE_ABSTRACT_TYPE (GstDeinterlaceSimpleMethod, gst_deinterlace_simple_method, GST_TYPE_DEINTERLACE_METHOD); static gboolean gst_deinterlace_simple_method_supported (GstDeinterlaceMethodClass * mklass, GstVideoFormat format, gint width, gint height) { GstDeinterlaceSimpleMethodClass *klass = GST_DEINTERLACE_SIMPLE_METHOD_CLASS (mklass); if (!GST_DEINTERLACE_METHOD_CLASS (gst_deinterlace_simple_method_parent_class)->supported (mklass, format, width, height)) return FALSE; switch (format) { case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xRGB: return (klass->interpolate_scanline_argb != NULL && klass->copy_scanline_argb != NULL); case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_RGBx: return (klass->interpolate_scanline_rgba != NULL && klass->copy_scanline_rgba != NULL); case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_xBGR: return (klass->interpolate_scanline_abgr != NULL && klass->copy_scanline_abgr != NULL); case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_BGRx: return (klass->interpolate_scanline_bgra != NULL && klass->copy_scanline_bgra != NULL); case GST_VIDEO_FORMAT_RGB: return (klass->interpolate_scanline_rgb != NULL && klass->copy_scanline_rgb != NULL); case GST_VIDEO_FORMAT_BGR: return (klass->interpolate_scanline_bgr != NULL && klass->copy_scanline_bgr != NULL); case GST_VIDEO_FORMAT_YUY2: return (klass->interpolate_scanline_yuy2 != NULL && klass->copy_scanline_yuy2 != NULL); case GST_VIDEO_FORMAT_YVYU: return (klass->interpolate_scanline_yvyu != NULL && klass->copy_scanline_yvyu != NULL); case GST_VIDEO_FORMAT_UYVY: return (klass->interpolate_scanline_uyvy != NULL && klass->copy_scanline_uyvy != NULL); case GST_VIDEO_FORMAT_AYUV: return (klass->interpolate_scanline_ayuv != NULL && klass->copy_scanline_ayuv != NULL); case GST_VIDEO_FORMAT_NV12: return (klass->interpolate_scanline_nv12 != NULL && klass->copy_scanline_nv12 != NULL); case GST_VIDEO_FORMAT_NV21: return (klass->interpolate_scanline_nv21 != NULL && klass->copy_scanline_nv21 != NULL); case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y41B: return (klass->interpolate_scanline_planar_y != NULL && klass->copy_scanline_planar_y != NULL && klass->interpolate_scanline_planar_u != NULL && klass->copy_scanline_planar_u != NULL && klass->interpolate_scanline_planar_v != NULL && klass->copy_scanline_planar_v != NULL); default: return FALSE; } } static void gst_deinterlace_simple_method_interpolate_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } static void gst_deinterlace_simple_method_copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void gst_deinterlace_simple_method_deinterlace_frame_packed (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, gint cur_field_idx) { GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); GstDeinterlaceScanlineData scanlines; guint8 *dest; const guint8 *field0, *field1, *field2, *fieldp; guint cur_field_flags = history[cur_field_idx].flags; gint i; gint frame_height = self->parent.frame_height; gint stride = self->parent.row_stride[0]; g_assert (self->interpolate_scanline_packed != NULL); g_assert (self->copy_scanline_packed != NULL); if (cur_field_idx > 0) { fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf); } else { fieldp = NULL; } dest = GST_BUFFER_DATA (outbuf); field0 = GST_BUFFER_DATA (history[cur_field_idx].buf); g_assert (dm_class->fields_required <= 4); if (cur_field_idx + 1 < history_count) { field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf); } else { field1 = NULL; } if (cur_field_idx + 2 < history_count) { field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf); } else { field2 = NULL; } #define CLAMP_LOW(i) (((i)<0) ? (i+2) : (i)) #define CLAMP_HI(i) (((i)>=(frame_height)) ? (i-2) : (i)) #define LINE(x,i) ((x) + CLAMP_HI(CLAMP_LOW(i)) * (stride)) #define LINE2(x,i) ((x) ? LINE(x,i) : NULL) for (i = 0; i < frame_height; i++) { memset (&scanlines, 0, sizeof (scanlines)); scanlines.bottom_field = (cur_field_flags == PICTURE_INTERLACED_BOTTOM); if (!((i & 1) ^ scanlines.bottom_field)) { /* copying */ scanlines.tp = LINE2 (fieldp, i - 1); scanlines.bp = LINE2 (fieldp, i + 1); scanlines.tt0 = LINE2 (field0, (i - 2 >= 0) ? i - 2 : i); scanlines.m0 = LINE2 (field0, i); scanlines.bb0 = LINE2 (field0, (i + 2 < frame_height ? i + 2 : i)); scanlines.t1 = LINE2 (field1, i - 1); scanlines.b1 = LINE2 (field1, i + 1); scanlines.tt2 = LINE2 (field2, (i - 2 >= 0) ? i - 2 : i); scanlines.m2 = LINE2 (field2, i); scanlines.bb2 = LINE2 (field2, (i + 2 < frame_height ? i + 2 : i)); self->copy_scanline_packed (self, LINE (dest, i), &scanlines); } else { /* interpolating */ scanlines.ttp = LINE2 (fieldp, (i - 2 >= 0) ? i - 2 : i); scanlines.mp = LINE2 (fieldp, i); scanlines.bbp = LINE2 (fieldp, (i + 2 < frame_height ? i + 2 : i)); scanlines.t0 = LINE2 (field0, i - 1); scanlines.b0 = LINE2 (field0, i + 1); scanlines.tt1 = LINE2 (field1, (i - 2 >= 0) ? i - 2 : i); scanlines.m1 = LINE2 (field1, i); scanlines.bb1 = LINE2 (field1, (i + 2 < frame_height ? i + 2 : i)); scanlines.t2 = LINE2 (field2, i - 1); scanlines.b2 = LINE2 (field2, i + 1); self->interpolate_scanline_packed (self, LINE (dest, i), &scanlines); } } } static void gst_deinterlace_simple_method_interpolate_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } static void gst_deinterlace_simple_method_copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void gst_deinterlace_simple_method_interpolate_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m1, self->parent.row_stride[1]); } static void gst_deinterlace_simple_method_copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[1]); } static void gst_deinterlace_simple_method_interpolate_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m1, self->parent.row_stride[2]); } static void gst_deinterlace_simple_method_copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[2]); } static void gst_deinterlace_simple_method_deinterlace_frame_planar_plane (GstDeinterlaceSimpleMethod * self, guint8 * dest, const guint8 * field0, const guint8 * field1, const guint8 * field2, const guint8 * fieldp, guint cur_field_flags, gint plane, GstDeinterlaceSimpleMethodFunction copy_scanline, GstDeinterlaceSimpleMethodFunction interpolate_scanline) { GstDeinterlaceScanlineData scanlines; gint i; gint frame_height = self->parent.height[plane]; gint stride = self->parent.row_stride[plane]; g_assert (interpolate_scanline != NULL); g_assert (copy_scanline != NULL); for (i = 0; i < frame_height; i++) { memset (&scanlines, 0, sizeof (scanlines)); scanlines.bottom_field = (cur_field_flags == PICTURE_INTERLACED_BOTTOM); if (!((i & 1) ^ scanlines.bottom_field)) { /* copying */ scanlines.tp = LINE2 (fieldp, i - 1); scanlines.bp = LINE2 (fieldp, i + 1); scanlines.tt0 = LINE2 (field0, (i - 2 >= 0) ? i - 2 : i); scanlines.m0 = LINE2 (field0, i); scanlines.bb0 = LINE2 (field0, (i + 2 < frame_height ? i + 2 : i)); scanlines.t1 = LINE2 (field1, i - 1); scanlines.b1 = LINE2 (field1, i + 1); scanlines.tt2 = LINE2 (field2, (i - 2 >= 0) ? i - 2 : i); scanlines.m2 = LINE2 (field2, i); scanlines.bb2 = LINE2 (field2, (i + 2 < frame_height ? i + 2 : i)); copy_scanline (self, LINE (dest, i), &scanlines); } else { /* interpolating */ scanlines.ttp = LINE2 (fieldp, (i - 2 >= 0) ? i - 2 : i); scanlines.mp = LINE2 (fieldp, i); scanlines.bbp = LINE2 (fieldp, (i + 2 < frame_height ? i + 2 : i)); scanlines.t0 = LINE2 (field0, i - 1); scanlines.b0 = LINE2 (field0, i + 1); scanlines.tt1 = LINE2 (field1, (i - 2 >= 0) ? i - 2 : i); scanlines.m1 = LINE2 (field1, i); scanlines.bb1 = LINE2 (field1, (i + 2 < frame_height ? i + 2 : i)); scanlines.t2 = LINE2 (field2, i - 1); scanlines.b2 = LINE2 (field2, i + 1); interpolate_scanline (self, LINE (dest, i), &scanlines); } } } static void gst_deinterlace_simple_method_deinterlace_frame_planar (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, gint cur_field_idx) { GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); guint8 *out; const guint8 *field0, *field1, *field2, *fieldp; guint cur_field_flags = history[cur_field_idx].flags; gint i, offset; GstDeinterlaceSimpleMethodFunction copy_scanline; GstDeinterlaceSimpleMethodFunction interpolate_scanline; g_assert (self->interpolate_scanline_planar[0] != NULL); g_assert (self->interpolate_scanline_planar[1] != NULL); g_assert (self->interpolate_scanline_planar[2] != NULL); g_assert (self->copy_scanline_planar[0] != NULL); g_assert (self->copy_scanline_planar[1] != NULL); g_assert (self->copy_scanline_planar[2] != NULL); for (i = 0; i < 3; i++) { offset = self->parent.offset[i]; copy_scanline = self->copy_scanline_planar[i]; interpolate_scanline = self->interpolate_scanline_planar[i]; out = GST_BUFFER_DATA (outbuf) + offset; fieldp = NULL; if (cur_field_idx > 0) { fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + offset; } field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset; g_assert (dm_class->fields_required <= 4); field1 = NULL; if (cur_field_idx + 1 < history_count) { field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset; } field2 = NULL; if (cur_field_idx + 2 < history_count) { field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset; } gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, field0, field1, field2, fieldp, cur_field_flags, i, copy_scanline, interpolate_scanline); } } static void gst_deinterlace_simple_method_deinterlace_frame_nv12 (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, gint cur_field_idx) { GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); guint8 *out; const guint8 *field0, *field1, *field2, *fieldp; guint cur_field_flags = history[cur_field_idx].flags; gint i, offset; g_assert (self->interpolate_scanline_packed != NULL); g_assert (self->copy_scanline_packed != NULL); for (i = 0; i < 2; i++) { offset = self->parent.offset[i]; out = GST_BUFFER_DATA (outbuf) + offset; fieldp = NULL; if (cur_field_idx > 0) { fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + offset; } field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset; g_assert (dm_class->fields_required <= 4); field1 = NULL; if (cur_field_idx + 1 < history_count) { field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset; } field2 = NULL; if (cur_field_idx + 2 < history_count) { field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset; } gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, field0, field1, field2, fieldp, cur_field_flags, i, self->copy_scanline_packed, self->interpolate_scanline_packed); } } static void gst_deinterlace_simple_method_setup (GstDeinterlaceMethod * method, GstVideoFormat format, gint width, gint height) { GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); GstDeinterlaceSimpleMethodClass *klass = GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS (self); GST_DEINTERLACE_METHOD_CLASS (gst_deinterlace_simple_method_parent_class)->setup (method, format, width, height); self->interpolate_scanline_packed = NULL; self->copy_scanline_packed = NULL; self->interpolate_scanline_planar[0] = NULL; self->interpolate_scanline_planar[1] = NULL; self->interpolate_scanline_planar[2] = NULL; self->copy_scanline_planar[0] = NULL; self->copy_scanline_planar[1] = NULL; self->copy_scanline_planar[2] = NULL; if (format == GST_VIDEO_FORMAT_UNKNOWN) return; switch (format) { case GST_VIDEO_FORMAT_YUY2: self->interpolate_scanline_packed = klass->interpolate_scanline_yuy2; self->copy_scanline_packed = klass->copy_scanline_yuy2; break; case GST_VIDEO_FORMAT_YVYU: self->interpolate_scanline_packed = klass->interpolate_scanline_yvyu; self->copy_scanline_packed = klass->copy_scanline_yvyu; break; case GST_VIDEO_FORMAT_UYVY: self->interpolate_scanline_packed = klass->interpolate_scanline_uyvy; self->copy_scanline_packed = klass->copy_scanline_uyvy; break; case GST_VIDEO_FORMAT_AYUV: self->interpolate_scanline_packed = klass->interpolate_scanline_ayuv; self->copy_scanline_packed = klass->copy_scanline_ayuv; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_xRGB: self->interpolate_scanline_packed = klass->interpolate_scanline_argb; self->copy_scanline_packed = klass->copy_scanline_argb; break; case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_xBGR: self->interpolate_scanline_packed = klass->interpolate_scanline_abgr; self->copy_scanline_packed = klass->copy_scanline_abgr; break; case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_RGBx: self->interpolate_scanline_packed = klass->interpolate_scanline_rgba; self->copy_scanline_packed = klass->copy_scanline_rgba; break; case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_BGRx: self->interpolate_scanline_packed = klass->interpolate_scanline_bgra; self->copy_scanline_packed = klass->copy_scanline_bgra; break; case GST_VIDEO_FORMAT_RGB: self->interpolate_scanline_packed = klass->interpolate_scanline_rgb; self->copy_scanline_packed = klass->copy_scanline_rgb; break; case GST_VIDEO_FORMAT_BGR: self->interpolate_scanline_packed = klass->interpolate_scanline_bgr; self->copy_scanline_packed = klass->copy_scanline_bgr; break; case GST_VIDEO_FORMAT_NV12: self->interpolate_scanline_packed = klass->interpolate_scanline_nv12; self->copy_scanline_packed = klass->copy_scanline_nv12; break; case GST_VIDEO_FORMAT_NV21: self->interpolate_scanline_packed = klass->interpolate_scanline_nv21; self->copy_scanline_packed = klass->copy_scanline_nv21; break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y41B: self->interpolate_scanline_planar[0] = klass->interpolate_scanline_planar_y; self->copy_scanline_planar[0] = klass->copy_scanline_planar_y; self->interpolate_scanline_planar[1] = klass->interpolate_scanline_planar_u; self->copy_scanline_planar[1] = klass->copy_scanline_planar_u; self->interpolate_scanline_planar[2] = klass->interpolate_scanline_planar_v; self->copy_scanline_planar[2] = klass->copy_scanline_planar_v; break; default: break; } } static void gst_deinterlace_simple_method_class_init (GstDeinterlaceSimpleMethodClass * klass) { GstDeinterlaceMethodClass *dm_class = (GstDeinterlaceMethodClass *) klass; dm_class->deinterlace_frame_ayuv = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_yuy2 = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_yvyu = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_uyvy = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_argb = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_abgr = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_rgba = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_bgra = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_rgb = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_bgr = gst_deinterlace_simple_method_deinterlace_frame_packed; dm_class->deinterlace_frame_i420 = gst_deinterlace_simple_method_deinterlace_frame_planar; dm_class->deinterlace_frame_yv12 = gst_deinterlace_simple_method_deinterlace_frame_planar; dm_class->deinterlace_frame_y444 = gst_deinterlace_simple_method_deinterlace_frame_planar; dm_class->deinterlace_frame_y42b = gst_deinterlace_simple_method_deinterlace_frame_planar; dm_class->deinterlace_frame_y41b = gst_deinterlace_simple_method_deinterlace_frame_planar; dm_class->deinterlace_frame_nv12 = gst_deinterlace_simple_method_deinterlace_frame_nv12; dm_class->deinterlace_frame_nv21 = gst_deinterlace_simple_method_deinterlace_frame_nv12; dm_class->fields_required = 2; dm_class->setup = gst_deinterlace_simple_method_setup; dm_class->supported = gst_deinterlace_simple_method_supported; klass->interpolate_scanline_yuy2 = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_yuy2 = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_yvyu = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_yvyu = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_ayuv = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_ayuv = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_uyvy = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_uyvy = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_nv12 = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_nv12 = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_argb = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_argb = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_abgr = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_abgr = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_rgba = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_rgba = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_bgra = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_bgra = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_rgb = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_rgb = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_bgr = gst_deinterlace_simple_method_interpolate_scanline_packed; klass->copy_scanline_bgr = gst_deinterlace_simple_method_copy_scanline_packed; klass->interpolate_scanline_planar_y = gst_deinterlace_simple_method_interpolate_scanline_planar_y; klass->copy_scanline_planar_y = gst_deinterlace_simple_method_copy_scanline_planar_y; klass->interpolate_scanline_planar_u = gst_deinterlace_simple_method_interpolate_scanline_planar_u; klass->copy_scanline_planar_u = gst_deinterlace_simple_method_copy_scanline_planar_u; klass->interpolate_scanline_planar_v = gst_deinterlace_simple_method_interpolate_scanline_planar_v; klass->copy_scanline_planar_v = gst_deinterlace_simple_method_copy_scanline_planar_v; } static void gst_deinterlace_simple_method_init (GstDeinterlaceSimpleMethod * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime-dist.c0000644000175000017500000007113711720565302017502 00000000000000 /* autogenerated from tvtime.orc */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifndef _ORC_INTEGER_TYPEDEFS_ #define _ORC_INTEGER_TYPEDEFS_ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include typedef int8_t orc_int8; typedef int16_t orc_int16; typedef int32_t orc_int32; typedef int64_t orc_int64; typedef uint8_t orc_uint8; typedef uint16_t orc_uint16; typedef uint32_t orc_uint32; typedef uint64_t orc_uint64; #define ORC_UINT64_C(x) UINT64_C(x) #elif defined(_MSC_VER) typedef signed __int8 orc_int8; typedef signed __int16 orc_int16; typedef signed __int32 orc_int32; typedef signed __int64 orc_int64; typedef unsigned __int8 orc_uint8; typedef unsigned __int16 orc_uint16; typedef unsigned __int32 orc_uint32; typedef unsigned __int64 orc_uint64; #define ORC_UINT64_C(x) (x##Ui64) #define inline __inline #else #include typedef signed char orc_int8; typedef short orc_int16; typedef int orc_int32; typedef unsigned char orc_uint8; typedef unsigned short orc_uint16; typedef unsigned int orc_uint32; #if INT_MAX == LONG_MAX typedef long long orc_int64; typedef unsigned long long orc_uint64; #define ORC_UINT64_C(x) (x##ULL) #else typedef long orc_int64; typedef unsigned long orc_uint64; #define ORC_UINT64_C(x) (x##UL) #endif #endif typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; #endif #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif #ifndef DISABLE_ORC #include #endif void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n); void deinterlace_line_linear (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, int p1, int n); /* begin Orc C target preamble */ #define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) #define ORC_ABS(a) ((a)<0 ? -(a) : (a)) #define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) #define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) #define ORC_SB_MAX 127 #define ORC_SB_MIN (-1-ORC_SB_MAX) #define ORC_UB_MAX 255 #define ORC_UB_MIN 0 #define ORC_SW_MAX 32767 #define ORC_SW_MIN (-1-ORC_SW_MAX) #define ORC_UW_MAX 65535 #define ORC_UW_MIN 0 #define ORC_SL_MAX 2147483647 #define ORC_SL_MIN (-1-ORC_SL_MAX) #define ORC_UL_MAX 4294967295U #define ORC_UL_MIN 0 #define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) #define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) #define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) #define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) #define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) #define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) #define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) #define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) #define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) #define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) #define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) #define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) #define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) #define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif /* end Orc C target preamble */ /* deinterlace_line_vfir */ #ifdef DISABLE_ORC void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n) { int i; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; const orc_int8 *ORC_RESTRICT ptr6; const orc_int8 *ORC_RESTRICT ptr7; const orc_int8 *ORC_RESTRICT ptr8; orc_int8 var35; orc_int8 var36; orc_int8 var37; orc_int8 var38; orc_int8 var39; orc_union16 var40; orc_int8 var41; orc_union16 var42; orc_union16 var43; orc_union16 var44; orc_union16 var45; orc_union16 var46; orc_union16 var47; orc_union16 var48; orc_union16 var49; orc_union16 var50; orc_union16 var51; orc_union16 var52; orc_union16 var53; orc_union16 var54; ptr0 = (orc_int8 *) d1; ptr4 = (orc_int8 *) s1; ptr5 = (orc_int8 *) s2; ptr6 = (orc_int8 *) s3; ptr7 = (orc_int8 *) s4; ptr8 = (orc_int8 *) s5; /* 16: loadpw */ var40.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ for (i = 0; i < n; i++) { /* 0: loadb */ var35 = ptr4[i]; /* 1: convubw */ var42.i = (orc_uint8) var35; /* 2: loadb */ var36 = ptr8[i]; /* 3: convubw */ var43.i = (orc_uint8) var36; /* 4: addw */ var44.i = var42.i + var43.i; /* 5: loadb */ var37 = ptr5[i]; /* 6: convubw */ var45.i = (orc_uint8) var37; /* 7: loadb */ var38 = ptr7[i]; /* 8: convubw */ var46.i = (orc_uint8) var38; /* 9: addw */ var47.i = var45.i + var46.i; /* 10: shlw */ var48.i = var47.i << 2; /* 11: loadb */ var39 = ptr6[i]; /* 12: convubw */ var49.i = (orc_uint8) var39; /* 13: shlw */ var50.i = var49.i << 1; /* 14: subw */ var51.i = var48.i - var44.i; /* 15: addw */ var52.i = var51.i + var50.i; /* 17: addw */ var53.i = var52.i + var40.i; /* 18: shrsw */ var54.i = var53.i >> 3; /* 19: convsuswb */ var41 = ORC_CLAMP_UB (var54.i); /* 20: storeb */ ptr0[i] = var41; } } #else static void _backup_deinterlace_line_vfir (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; const orc_int8 *ORC_RESTRICT ptr6; const orc_int8 *ORC_RESTRICT ptr7; const orc_int8 *ORC_RESTRICT ptr8; orc_int8 var35; orc_int8 var36; orc_int8 var37; orc_int8 var38; orc_int8 var39; orc_union16 var40; orc_int8 var41; orc_union16 var42; orc_union16 var43; orc_union16 var44; orc_union16 var45; orc_union16 var46; orc_union16 var47; orc_union16 var48; orc_union16 var49; orc_union16 var50; orc_union16 var51; orc_union16 var52; orc_union16 var53; orc_union16 var54; ptr0 = (orc_int8 *) ex->arrays[0]; ptr4 = (orc_int8 *) ex->arrays[4]; ptr5 = (orc_int8 *) ex->arrays[5]; ptr6 = (orc_int8 *) ex->arrays[6]; ptr7 = (orc_int8 *) ex->arrays[7]; ptr8 = (orc_int8 *) ex->arrays[8]; /* 16: loadpw */ var40.i = (int) 0x00000004; /* 4 or 1.97626e-323f */ for (i = 0; i < n; i++) { /* 0: loadb */ var35 = ptr4[i]; /* 1: convubw */ var42.i = (orc_uint8) var35; /* 2: loadb */ var36 = ptr8[i]; /* 3: convubw */ var43.i = (orc_uint8) var36; /* 4: addw */ var44.i = var42.i + var43.i; /* 5: loadb */ var37 = ptr5[i]; /* 6: convubw */ var45.i = (orc_uint8) var37; /* 7: loadb */ var38 = ptr7[i]; /* 8: convubw */ var46.i = (orc_uint8) var38; /* 9: addw */ var47.i = var45.i + var46.i; /* 10: shlw */ var48.i = var47.i << 2; /* 11: loadb */ var39 = ptr6[i]; /* 12: convubw */ var49.i = (orc_uint8) var39; /* 13: shlw */ var50.i = var49.i << 1; /* 14: subw */ var51.i = var48.i - var44.i; /* 15: addw */ var52.i = var51.i + var50.i; /* 17: addw */ var53.i = var52.i + var40.i; /* 18: shrsw */ var54.i = var53.i >> 3; /* 19: convsuswb */ var41 = ORC_CLAMP_UB (var54.i); /* 20: storeb */ ptr0[i] = var41; } } void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "deinterlace_line_vfir"); orc_program_set_backup_function (p, _backup_deinterlace_line_vfir); orc_program_add_destination (p, 1, "d1"); orc_program_add_source (p, 1, "s1"); orc_program_add_source (p, 1, "s2"); orc_program_add_source (p, 1, "s3"); orc_program_add_source (p, 1, "s4"); orc_program_add_source (p, 1, "s5"); orc_program_add_constant (p, 4, 0x00000002, "c1"); orc_program_add_constant (p, 4, 0x00000001, "c2"); orc_program_add_constant (p, 4, 0x00000004, "c3"); orc_program_add_constant (p, 4, 0x00000003, "c4"); orc_program_add_temporary (p, 2, "t1"); orc_program_add_temporary (p, 2, "t2"); orc_program_add_temporary (p, 2, "t3"); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S5, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S4, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "shlw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "shlw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_C2, ORC_VAR_D1); orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C3, ORC_VAR_D1); orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C4, ORC_VAR_D1); orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->arrays[ORC_VAR_S2] = (void *) s2; ex->arrays[ORC_VAR_S3] = (void *) s3; ex->arrays[ORC_VAR_S4] = (void *) s4; ex->arrays[ORC_VAR_S5] = (void *) s5; func = p->code_exec; func (ex); } #endif /* deinterlace_line_linear */ #ifdef DISABLE_ORC void deinterlace_line_linear (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) { int i; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; orc_int8 var32; orc_int8 var33; orc_int8 var34; ptr0 = (orc_int8 *) d1; ptr4 = (orc_int8 *) s1; ptr5 = (orc_int8 *) s2; for (i = 0; i < n; i++) { /* 0: loadb */ var32 = ptr4[i]; /* 1: loadb */ var33 = ptr5[i]; /* 2: avgub */ var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; /* 3: storeb */ ptr0[i] = var34; } } #else static void _backup_deinterlace_line_linear (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; orc_int8 var32; orc_int8 var33; orc_int8 var34; ptr0 = (orc_int8 *) ex->arrays[0]; ptr4 = (orc_int8 *) ex->arrays[4]; ptr5 = (orc_int8 *) ex->arrays[5]; for (i = 0; i < n; i++) { /* 0: loadb */ var32 = ptr4[i]; /* 1: loadb */ var33 = ptr5[i]; /* 2: avgub */ var34 = ((orc_uint8) var32 + (orc_uint8) var33 + 1) >> 1; /* 3: storeb */ ptr0[i] = var34; } } void deinterlace_line_linear (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "deinterlace_line_linear"); orc_program_set_backup_function (p, _backup_deinterlace_line_linear); orc_program_add_destination (p, 1, "d1"); orc_program_add_source (p, 1, "s1"); orc_program_add_source (p, 1, "s2"); orc_program_append_2 (p, "avgub", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_S2, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->arrays[ORC_VAR_S2] = (void *) s2; func = p->code_exec; func (ex); } #endif /* deinterlace_line_linear_blend */ #ifdef DISABLE_ORC void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) { int i; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; const orc_int8 *ORC_RESTRICT ptr6; orc_int8 var35; orc_int8 var36; orc_int8 var37; orc_union16 var38; orc_int8 var39; orc_union16 var40; orc_union16 var41; orc_union16 var42; orc_union16 var43; orc_union16 var44; orc_union16 var45; orc_union16 var46; orc_union16 var47; ptr0 = (orc_int8 *) d1; ptr4 = (orc_int8 *) s1; ptr5 = (orc_int8 *) s2; ptr6 = (orc_int8 *) s3; /* 9: loadpw */ var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ for (i = 0; i < n; i++) { /* 0: loadb */ var35 = ptr4[i]; /* 1: convubw */ var40.i = (orc_uint8) var35; /* 2: loadb */ var36 = ptr5[i]; /* 3: convubw */ var41.i = (orc_uint8) var36; /* 4: loadb */ var37 = ptr6[i]; /* 5: convubw */ var42.i = (orc_uint8) var37; /* 6: addw */ var43.i = var40.i + var41.i; /* 7: addw */ var44.i = var42.i + var42.i; /* 8: addw */ var45.i = var43.i + var44.i; /* 10: addw */ var46.i = var45.i + var38.i; /* 11: shrsw */ var47.i = var46.i >> 2; /* 12: convsuswb */ var39 = ORC_CLAMP_UB (var47.i); /* 13: storeb */ ptr0[i] = var39; } } #else static void _backup_deinterlace_line_linear_blend (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; const orc_int8 *ORC_RESTRICT ptr6; orc_int8 var35; orc_int8 var36; orc_int8 var37; orc_union16 var38; orc_int8 var39; orc_union16 var40; orc_union16 var41; orc_union16 var42; orc_union16 var43; orc_union16 var44; orc_union16 var45; orc_union16 var46; orc_union16 var47; ptr0 = (orc_int8 *) ex->arrays[0]; ptr4 = (orc_int8 *) ex->arrays[4]; ptr5 = (orc_int8 *) ex->arrays[5]; ptr6 = (orc_int8 *) ex->arrays[6]; /* 9: loadpw */ var38.i = (int) 0x00000002; /* 2 or 9.88131e-324f */ for (i = 0; i < n; i++) { /* 0: loadb */ var35 = ptr4[i]; /* 1: convubw */ var40.i = (orc_uint8) var35; /* 2: loadb */ var36 = ptr5[i]; /* 3: convubw */ var41.i = (orc_uint8) var36; /* 4: loadb */ var37 = ptr6[i]; /* 5: convubw */ var42.i = (orc_uint8) var37; /* 6: addw */ var43.i = var40.i + var41.i; /* 7: addw */ var44.i = var42.i + var42.i; /* 8: addw */ var45.i = var43.i + var44.i; /* 10: addw */ var46.i = var45.i + var38.i; /* 11: shrsw */ var47.i = var46.i >> 2; /* 12: convsuswb */ var39 = ORC_CLAMP_UB (var47.i); /* 13: storeb */ ptr0[i] = var39; } } void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "deinterlace_line_linear_blend"); orc_program_set_backup_function (p, _backup_deinterlace_line_linear_blend); orc_program_add_destination (p, 1, "d1"); orc_program_add_source (p, 1, "s1"); orc_program_add_source (p, 1, "s2"); orc_program_add_source (p, 1, "s3"); orc_program_add_constant (p, 4, 0x00000002, "c1"); orc_program_add_temporary (p, 2, "t1"); orc_program_add_temporary (p, 2, "t2"); orc_program_add_temporary (p, 2, "t3"); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "convubw", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "addw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->arrays[ORC_VAR_S2] = (void *) s2; ex->arrays[ORC_VAR_S3] = (void *) s3; func = p->code_exec; func (ex); } #endif /* deinterlace_line_greedy */ #ifdef DISABLE_ORC void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, int p1, int n) { int i; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; const orc_int8 *ORC_RESTRICT ptr6; const orc_int8 *ORC_RESTRICT ptr7; orc_int8 var44; orc_int8 var45; orc_int8 var46; orc_int8 var47; orc_int8 var48; orc_int8 var49; orc_int8 var50; orc_int8 var51; orc_int8 var52; orc_int8 var53; orc_int8 var54; orc_int8 var55; orc_int8 var56; orc_int8 var57; orc_int8 var58; orc_int8 var59; orc_int8 var60; orc_int8 var61; orc_int8 var62; orc_int8 var63; orc_int8 var64; orc_int8 var65; orc_int8 var66; orc_int8 var67; orc_int8 var68; orc_int8 var69; orc_int8 var70; ptr0 = (orc_int8 *) d1; ptr4 = (orc_int8 *) s1; ptr5 = (orc_int8 *) s2; ptr6 = (orc_int8 *) s3; ptr7 = (orc_int8 *) s4; /* 11: loadpb */ var44 = (int) 0x00000080; /* 128 or 6.32404e-322f */ /* 13: loadpb */ var45 = (int) 0x00000080; /* 128 or 6.32404e-322f */ /* 21: loadpb */ var46 = p1; /* 23: loadpb */ var47 = p1; for (i = 0; i < n; i++) { /* 0: loadb */ var49 = ptr4[i]; /* 1: loadb */ var50 = ptr7[i]; /* 2: loadb */ var51 = ptr6[i]; /* 3: loadb */ var52 = ptr5[i]; /* 4: avgub */ var53 = ((orc_uint8) var52 + (orc_uint8) var51 + 1) >> 1; /* 5: maxub */ var54 = ORC_MAX ((orc_uint8) var49, (orc_uint8) var53); /* 6: minub */ var55 = ORC_MIN ((orc_uint8) var49, (orc_uint8) var53); /* 7: subb */ var56 = var54 - var55; /* 8: maxub */ var57 = ORC_MAX ((orc_uint8) var50, (orc_uint8) var53); /* 9: minub */ var58 = ORC_MIN ((orc_uint8) var50, (orc_uint8) var53); /* 10: subb */ var59 = var57 - var58; /* 12: xorb */ var60 = var56 ^ var44; /* 14: xorb */ var61 = var59 ^ var45; /* 15: cmpgtsb */ var62 = (var60 > var61) ? (~0) : 0; /* 16: andb */ var63 = var50 & var62; /* 17: andnb */ var64 = (~var62) & var49; /* 18: orb */ var65 = var63 | var64; /* 19: maxub */ var66 = ORC_MAX ((orc_uint8) var52, (orc_uint8) var51); /* 20: minub */ var67 = ORC_MIN ((orc_uint8) var52, (orc_uint8) var51); /* 22: addusb */ var68 = ORC_CLAMP_UB ((orc_uint8) var66 + (orc_uint8) var46); /* 24: subusb */ var69 = ORC_CLAMP_UB ((orc_uint8) var67 - (orc_uint8) var47); /* 25: minub */ var70 = ORC_MIN ((orc_uint8) var65, (orc_uint8) var68); /* 26: maxub */ var48 = ORC_MAX ((orc_uint8) var70, (orc_uint8) var69); /* 27: storeb */ ptr0[i] = var48; } } #else static void _backup_deinterlace_line_greedy (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_int8 *ORC_RESTRICT ptr0; const orc_int8 *ORC_RESTRICT ptr4; const orc_int8 *ORC_RESTRICT ptr5; const orc_int8 *ORC_RESTRICT ptr6; const orc_int8 *ORC_RESTRICT ptr7; orc_int8 var44; orc_int8 var45; orc_int8 var46; orc_int8 var47; orc_int8 var48; orc_int8 var49; orc_int8 var50; orc_int8 var51; orc_int8 var52; orc_int8 var53; orc_int8 var54; orc_int8 var55; orc_int8 var56; orc_int8 var57; orc_int8 var58; orc_int8 var59; orc_int8 var60; orc_int8 var61; orc_int8 var62; orc_int8 var63; orc_int8 var64; orc_int8 var65; orc_int8 var66; orc_int8 var67; orc_int8 var68; orc_int8 var69; orc_int8 var70; ptr0 = (orc_int8 *) ex->arrays[0]; ptr4 = (orc_int8 *) ex->arrays[4]; ptr5 = (orc_int8 *) ex->arrays[5]; ptr6 = (orc_int8 *) ex->arrays[6]; ptr7 = (orc_int8 *) ex->arrays[7]; /* 11: loadpb */ var44 = (int) 0x00000080; /* 128 or 6.32404e-322f */ /* 13: loadpb */ var45 = (int) 0x00000080; /* 128 or 6.32404e-322f */ /* 21: loadpb */ var46 = ex->params[24]; /* 23: loadpb */ var47 = ex->params[24]; for (i = 0; i < n; i++) { /* 0: loadb */ var49 = ptr4[i]; /* 1: loadb */ var50 = ptr7[i]; /* 2: loadb */ var51 = ptr6[i]; /* 3: loadb */ var52 = ptr5[i]; /* 4: avgub */ var53 = ((orc_uint8) var52 + (orc_uint8) var51 + 1) >> 1; /* 5: maxub */ var54 = ORC_MAX ((orc_uint8) var49, (orc_uint8) var53); /* 6: minub */ var55 = ORC_MIN ((orc_uint8) var49, (orc_uint8) var53); /* 7: subb */ var56 = var54 - var55; /* 8: maxub */ var57 = ORC_MAX ((orc_uint8) var50, (orc_uint8) var53); /* 9: minub */ var58 = ORC_MIN ((orc_uint8) var50, (orc_uint8) var53); /* 10: subb */ var59 = var57 - var58; /* 12: xorb */ var60 = var56 ^ var44; /* 14: xorb */ var61 = var59 ^ var45; /* 15: cmpgtsb */ var62 = (var60 > var61) ? (~0) : 0; /* 16: andb */ var63 = var50 & var62; /* 17: andnb */ var64 = (~var62) & var49; /* 18: orb */ var65 = var63 | var64; /* 19: maxub */ var66 = ORC_MAX ((orc_uint8) var52, (orc_uint8) var51); /* 20: minub */ var67 = ORC_MIN ((orc_uint8) var52, (orc_uint8) var51); /* 22: addusb */ var68 = ORC_CLAMP_UB ((orc_uint8) var66 + (orc_uint8) var46); /* 24: subusb */ var69 = ORC_CLAMP_UB ((orc_uint8) var67 - (orc_uint8) var47); /* 25: minub */ var70 = ORC_MIN ((orc_uint8) var65, (orc_uint8) var68); /* 26: maxub */ var48 = ORC_MAX ((orc_uint8) var70, (orc_uint8) var69); /* 27: storeb */ ptr0[i] = var48; } } void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, int p1, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "deinterlace_line_greedy"); orc_program_set_backup_function (p, _backup_deinterlace_line_greedy); orc_program_add_destination (p, 1, "d1"); orc_program_add_source (p, 1, "s1"); orc_program_add_source (p, 1, "s2"); orc_program_add_source (p, 1, "s3"); orc_program_add_source (p, 1, "s4"); orc_program_add_constant (p, 4, 0x00000080, "c1"); orc_program_add_parameter (p, 1, "p1"); orc_program_add_temporary (p, 1, "t1"); orc_program_add_temporary (p, 1, "t2"); orc_program_add_temporary (p, 1, "t3"); orc_program_add_temporary (p, 1, "t4"); orc_program_add_temporary (p, 1, "t5"); orc_program_add_temporary (p, 1, "t6"); orc_program_add_temporary (p, 1, "t7"); orc_program_add_temporary (p, 1, "t8"); orc_program_add_temporary (p, 1, "t9"); orc_program_add_temporary (p, 1, "t10"); orc_program_add_temporary (p, 1, "t11"); orc_program_add_temporary (p, 1, "t12"); orc_program_append_2 (p, "loadb", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "loadb", 0, ORC_VAR_T2, ORC_VAR_S4, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "loadb", 0, ORC_VAR_T3, ORC_VAR_S3, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "loadb", 0, ORC_VAR_T4, ORC_VAR_S2, ORC_VAR_D1, ORC_VAR_D1); orc_program_append_2 (p, "avgub", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "maxub", 0, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "minub", 0, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "subb", 0, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_T9, ORC_VAR_D1); orc_program_append_2 (p, "maxub", 0, ORC_VAR_T8, ORC_VAR_T2, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "minub", 0, ORC_VAR_T9, ORC_VAR_T2, ORC_VAR_T5, ORC_VAR_D1); orc_program_append_2 (p, "subb", 0, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_T9, ORC_VAR_D1); orc_program_append_2 (p, "xorb", 0, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "xorb", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C1, ORC_VAR_D1); orc_program_append_2 (p, "cmpgtsb", 0, ORC_VAR_T9, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1); orc_program_append_2 (p, "andb", 0, ORC_VAR_T8, ORC_VAR_T2, ORC_VAR_T9, ORC_VAR_D1); orc_program_append_2 (p, "andnb", 0, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1); orc_program_append_2 (p, "orb", 0, ORC_VAR_T10, ORC_VAR_T8, ORC_VAR_T9, ORC_VAR_D1); orc_program_append_2 (p, "maxub", 0, ORC_VAR_T12, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "minub", 0, ORC_VAR_T11, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1); orc_program_append_2 (p, "addusb", 0, ORC_VAR_T12, ORC_VAR_T12, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "subusb", 0, ORC_VAR_T11, ORC_VAR_T11, ORC_VAR_P1, ORC_VAR_D1); orc_program_append_2 (p, "minub", 0, ORC_VAR_T10, ORC_VAR_T10, ORC_VAR_T12, ORC_VAR_D1); orc_program_append_2 (p, "maxub", 0, ORC_VAR_D1, ORC_VAR_T10, ORC_VAR_T11, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->arrays[ORC_VAR_S1] = (void *) s1; ex->arrays[ORC_VAR_S2] = (void *) s2; ex->arrays[ORC_VAR_S3] = (void *) s3; ex->arrays[ORC_VAR_S4] = (void *) s4; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime-dist.h0000644000175000017500000000503711720560710017501 00000000000000 /* autogenerated from tvtime.orc */ #ifndef _TVTIME_H_ #define _TVTIME_H_ #include #ifdef __cplusplus extern "C" { #endif #ifndef _ORC_INTEGER_TYPEDEFS_ #define _ORC_INTEGER_TYPEDEFS_ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include typedef int8_t orc_int8; typedef int16_t orc_int16; typedef int32_t orc_int32; typedef int64_t orc_int64; typedef uint8_t orc_uint8; typedef uint16_t orc_uint16; typedef uint32_t orc_uint32; typedef uint64_t orc_uint64; #define ORC_UINT64_C(x) UINT64_C(x) #elif defined(_MSC_VER) typedef signed __int8 orc_int8; typedef signed __int16 orc_int16; typedef signed __int32 orc_int32; typedef signed __int64 orc_int64; typedef unsigned __int8 orc_uint8; typedef unsigned __int16 orc_uint16; typedef unsigned __int32 orc_uint32; typedef unsigned __int64 orc_uint64; #define ORC_UINT64_C(x) (x##Ui64) #define inline __inline #else #include typedef signed char orc_int8; typedef short orc_int16; typedef int orc_int32; typedef unsigned char orc_uint8; typedef unsigned short orc_uint16; typedef unsigned int orc_uint32; #if INT_MAX == LONG_MAX typedef long long orc_int64; typedef unsigned long long orc_uint64; #define ORC_UINT64_C(x) (x##ULL) #else typedef long orc_int64; typedef unsigned long orc_uint64; #define ORC_UINT64_C(x) (x##UL) #endif #endif typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; #endif #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif void deinterlace_line_vfir (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, const guint8 * ORC_RESTRICT s4, const guint8 * ORC_RESTRICT s5, int n); void deinterlace_line_linear (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, int n); void deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1, const guint8 * ORC_RESTRICT s1, const guint8 * ORC_RESTRICT s2, const guint8 * ORC_RESTRICT s3, int n); void deinterlace_line_greedy (orc_uint8 * ORC_RESTRICT d1, const orc_uint8 * ORC_RESTRICT s1, const orc_uint8 * ORC_RESTRICT s2, const orc_uint8 * ORC_RESTRICT s3, const orc_uint8 * ORC_RESTRICT s4, int p1, int n); #ifdef __cplusplus } #endif #endif gst-plugins-good-0.10.31/gst/deinterlace/gstdeinterlace.h0000644000175000017500000001245411707374600020234 00000000000000/* * GStreamer * Copyright (C) 2005 Martin Eikermann * Copyright (C) 2008-2010 Sebastian Dröge * * 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_DEINTERLACE_H__ #define __GST_DEINTERLACE_H__ #include #include #include "gstdeinterlacemethod.h" G_BEGIN_DECLS #define GST_TYPE_DEINTERLACE \ (gst_deinterlace_get_type()) #define GST_DEINTERLACE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEINTERLACE,GstDeinterlace)) #define GST_DEINTERLACE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEINTERLACE,GstDeinterlace)) #define GST_IS_DEINTERLACE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLACE)) #define GST_IS_DEINTERLACE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLACE)) typedef struct _GstDeinterlace GstDeinterlace; typedef struct _GstDeinterlaceClass GstDeinterlaceClass; typedef enum { GST_DEINTERLACE_TOMSMOCOMP, GST_DEINTERLACE_GREEDY_H, GST_DEINTERLACE_GREEDY_L, GST_DEINTERLACE_VFIR, GST_DEINTERLACE_LINEAR, GST_DEINTERLACE_LINEAR_BLEND, GST_DEINTERLACE_SCALER_BOB, GST_DEINTERLACE_WEAVE, GST_DEINTERLACE_WEAVE_TFF, GST_DEINTERLACE_WEAVE_BFF } GstDeinterlaceMethods; typedef enum { GST_DEINTERLACE_ALL, /* All (missing data is interp.) */ GST_DEINTERLACE_TF, /* Top Fields Only */ GST_DEINTERLACE_BF /* Bottom Fields Only */ } GstDeinterlaceFields; typedef enum { GST_DEINTERLACE_LAYOUT_AUTO, GST_DEINTERLACE_LAYOUT_TFF, GST_DEINTERLACE_LAYOUT_BFF } GstDeinterlaceFieldLayout; typedef enum { GST_DEINTERLACE_MODE_AUTO, GST_DEINTERLACE_MODE_INTERLACED, GST_DEINTERLACE_MODE_DISABLED } GstDeinterlaceMode; typedef enum { GST_DEINTERLACE_LOCKING_NONE, GST_DEINTERLACE_LOCKING_AUTO, GST_DEINTERLACE_LOCKING_ACTIVE, GST_DEINTERLACE_LOCKING_PASSIVE, } GstDeinterlaceLocking; #define GST_DEINTERLACE_MAX_FIELD_HISTORY 10 #define GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY 50 /* check max field history is large enough */ #if GST_DEINTERLACE_MAX_FIELD_HISTORY < GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * 3 #undef GST_DEINTERLACE_MAX_FIELD_HISTORY #define GST_DEINTERLACE_MAX_FIELD_HISTORY (GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * 3) #endif typedef struct _TelecinePattern TelecinePattern; struct _TelecinePattern { const gchar *nick; guint8 length; guint8 ratio_n, ratio_d; guint8 states[GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY]; }; typedef struct _GstDeinterlaceBufferState GstDeinterlaceBufferState; struct _GstDeinterlaceBufferState { GstClockTime timestamp; GstClockTime duration; guint8 state; }; struct _GstDeinterlace { GstElement parent; GstPad *srcpad, *sinkpad; /* */ GstDeinterlaceMode mode; GstDeinterlaceFieldLayout field_layout; GstDeinterlaceFields fields; /* current state (differs when flushing/inverse telecine using weave) */ GstDeinterlaceMethods method_id; /* property value */ GstDeinterlaceMethods user_set_method_id; GstDeinterlaceMethod *method; GstVideoFormat format; gint width, height; /* frame width & height */ guint frame_size; /* frame size in bytes */ gint fps_n, fps_d; /* frame rate */ gboolean interlaced; /* is input interlaced? */ gboolean passthrough; GstClockTime field_duration; /* Duration of one field */ /* The most recent pictures PictureHistory[0] is always the most recent. Pointers are NULL if the picture in question isn't valid, e.g. because the program just started or a picture was skipped. */ GstDeinterlaceField field_history[GST_DEINTERLACE_MAX_FIELD_HISTORY]; guint history_count; int cur_field_idx; /* Set to TRUE if we're in still frame mode, i.e. just forward all buffers */ gboolean still_frame_mode; /* Last buffer that was pushed in */ GstBuffer *last_buffer; /* Current segment */ GstSegment segment; /* QoS stuff */ gdouble proportion; GstClockTime earliest_time; GstCaps *request_caps; gboolean reconfigure; GstDeinterlaceMode new_mode; GstDeinterlaceFields new_fields; GstDeinterlaceLocking locking; gint low_latency; gboolean drop_orphans; gboolean ignore_obscure; gboolean pattern_lock; gboolean pattern_refresh; GstDeinterlaceBufferState buf_states[GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY]; gint state_count; gint pattern; guint8 pattern_phase; guint8 pattern_count; guint8 output_count; GstClockTime pattern_base_ts; GstClockTime pattern_buf_dur; gboolean need_more; gboolean have_eos; }; struct _GstDeinterlaceClass { GstElementClass parent_class; }; GType gst_deinterlace_get_type (void); G_END_DECLS #endif /* __GST_DEINTERLACE_H__ */ gst-plugins-good-0.10.31/gst/deinterlace/gstdeinterlace.c0000644000175000017500000025254011707374600020231 00000000000000/* * GStreamer * Copyright (C) 2005 Martin Eikermann * Copyright (C) 2008-2010 Sebastian Dröge * Copyright (C) 2011 Robert Swain * * 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-deinterlace * * deinterlace deinterlaces interlaced video frames to progressive video frames. * For this different algorithms can be selected which will be described later. * * * Example launch line * |[ * gst-launch -v filesrc location=/path/to/file ! decodebin2 ! ffmpegcolorspace ! deinterlace ! ffmpegcolorspace ! autovideosink * ]| This pipeline deinterlaces a video file with the default deinterlacing options. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstdeinterlace.h" #include "tvtime/plugins.h" #include #if HAVE_ORC #include #endif GST_DEBUG_CATEGORY_STATIC (deinterlace_debug); #define GST_CAT_DEFAULT (deinterlace_debug) /* Properties */ #define DEFAULT_MODE GST_DEINTERLACE_MODE_AUTO #define DEFAULT_METHOD GST_DEINTERLACE_LINEAR #define DEFAULT_FIELDS GST_DEINTERLACE_ALL #define DEFAULT_FIELD_LAYOUT GST_DEINTERLACE_LAYOUT_AUTO #define DEFAULT_LOCKING GST_DEINTERLACE_LOCKING_NONE #define DEFAULT_IGNORE_OBSCURE TRUE #define DEFAULT_DROP_ORPHANS TRUE enum { PROP_0, PROP_MODE, PROP_METHOD, PROP_FIELDS, PROP_FIELD_LAYOUT, PROP_LOCKING, PROP_IGNORE_OBSCURE, PROP_DROP_ORPHANS, PROP_LAST }; #define GST_DEINTERLACE_BUFFER_STATE_P (1<<0) #define GST_DEINTERLACE_BUFFER_STATE_I (1<<1) #define GST_DEINTERLACE_BUFFER_STATE_TC_B (1<<2) #define GST_DEINTERLACE_BUFFER_STATE_TC_T (1<<3) #define GST_DEINTERLACE_BUFFER_STATE_TC_P (1<<4) #define GST_DEINTERLACE_BUFFER_STATE_TC_M (1<<5) #define GST_DEINTERLACE_BUFFER_STATE_DROP (1<<6) #define GST_ONE \ (GST_DEINTERLACE_BUFFER_STATE_TC_T | GST_DEINTERLACE_BUFFER_STATE_TC_B) #define GST_PRG \ (GST_DEINTERLACE_BUFFER_STATE_P | GST_DEINTERLACE_BUFFER_STATE_TC_P) #define GST_INT \ (GST_DEINTERLACE_BUFFER_STATE_I | GST_DEINTERLACE_BUFFER_STATE_TC_M) #define GST_DRP (GST_DEINTERLACE_BUFFER_STATE_DROP) #define GST_DEINTERLACE_OBSCURE_THRESHOLD 5 static const TelecinePattern telecine_patterns[] = { /* 60i -> 60p or 50i -> 50p (NOTE THE WEIRD RATIOS) */ {"1:1", 1, 2, 1, {GST_ONE,}}, /* 60i -> 30p or 50i -> 25p */ {"2:2", 1, 1, 1, {GST_INT,}}, /* 60i telecine -> 24p */ {"2:3", 5, 4, 5, {GST_PRG, GST_PRG, GST_ONE, GST_ONE, GST_PRG,}}, {"3:2:2:3", 5, 4, 5, {GST_PRG, GST_ONE, GST_INT, GST_ONE, GST_PRG,}}, {"2:3:3:2", 5, 4, 5, {GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG,}}, /* The following patterns are obscure and are ignored if ignore-obscure is * set to true. If any patterns are added above this line, check and edit * GST_DEINTERLACE_OBSCURE_THRESHOLD */ /* 50i Euro pulldown -> 24p */ {"2-11:3", 25, 24, 25, {GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_ONE, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT, GST_ONE, GST_PRG,}}, /* 60i (NTSC 30000/1001) -> 16p (16000/1001) */ {"3:4-3", 15, 8, 15, {GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG,}}, /* 50i (PAL) -> 16p */ {"3-7:4", 25, 16, 25, {GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP, GST_PRG, GST_PRG, GST_DRP,}}, /* NTSC 60i -> 18p */ {"3:3:4", 5, 3, 5, {GST_PRG, GST_DRP, GST_PRG, GST_DRP, GST_PRG,}}, /* NTSC 60i -> 20p */ {"3:3", 3, 2, 3, {GST_PRG, GST_DRP, GST_PRG,}}, /* NTSC 60i -> 27.5 */ {"3:2-4", 11, 10, 11, {GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_ONE, GST_INT, GST_INT, GST_INT, GST_ONE,}}, /* PAL 50i -> 27.5 */ {"1:2-4", 9, 9, 10, {GST_PRG, GST_PRG, GST_PRG, GST_PRG, GST_INT, GST_INT, GST_INT, GST_INT, GST_INT,}}, }; static const GEnumValue methods_types[] = { {GST_DEINTERLACE_TOMSMOCOMP, "Motion Adaptive: Motion Search", "tomsmocomp"}, {GST_DEINTERLACE_GREEDY_H, "Motion Adaptive: Advanced Detection", "greedyh"}, {GST_DEINTERLACE_GREEDY_L, "Motion Adaptive: Simple Detection", "greedyl"}, {GST_DEINTERLACE_VFIR, "Blur Vertical", "vfir"}, {GST_DEINTERLACE_LINEAR, "Television: Full resolution", "linear"}, {GST_DEINTERLACE_LINEAR_BLEND, "Blur: Temporal (Do Not Use)", "linearblend"}, {GST_DEINTERLACE_SCALER_BOB, "Double lines", "scalerbob"}, {GST_DEINTERLACE_WEAVE, "Weave (Do Not Use)", "weave"}, {GST_DEINTERLACE_WEAVE_TFF, "Progressive: Top Field First (Do Not Use)", "weavetff"}, {GST_DEINTERLACE_WEAVE_BFF, "Progressive: Bottom Field First (Do Not Use)", "weavebff"}, {0, NULL, NULL}, }; static const GEnumValue locking_types[] = { {GST_DEINTERLACE_LOCKING_NONE, "No pattern locking", "none"}, {GST_DEINTERLACE_LOCKING_AUTO, "Choose passive/active locking depending on whether upstream is live", "auto"}, {GST_DEINTERLACE_LOCKING_ACTIVE, "Block until pattern-locked. Use accurate timestamp interpolation within a pattern repeat.", "active"}, {GST_DEINTERLACE_LOCKING_PASSIVE, "Do not block. Use naïve timestamp adjustment until pattern-locked based on state history.", "passive"}, {0, NULL, NULL}, }; #define GST_TYPE_DEINTERLACE_METHODS (gst_deinterlace_methods_get_type ()) static GType gst_deinterlace_methods_get_type (void) { static GType deinterlace_methods_type = 0; if (!deinterlace_methods_type) { deinterlace_methods_type = g_enum_register_static ("GstDeinterlaceMethods", methods_types); } return deinterlace_methods_type; } #define GST_TYPE_DEINTERLACE_FIELDS (gst_deinterlace_fields_get_type ()) static GType gst_deinterlace_fields_get_type (void) { static GType deinterlace_fields_type = 0; static const GEnumValue fields_types[] = { {GST_DEINTERLACE_ALL, "All fields", "all"}, {GST_DEINTERLACE_TF, "Top fields only", "top"}, {GST_DEINTERLACE_BF, "Bottom fields only", "bottom"}, {0, NULL, NULL}, }; if (!deinterlace_fields_type) { deinterlace_fields_type = g_enum_register_static ("GstDeinterlaceFields", fields_types); } return deinterlace_fields_type; } #define GST_TYPE_DEINTERLACE_FIELD_LAYOUT (gst_deinterlace_field_layout_get_type ()) static GType gst_deinterlace_field_layout_get_type (void) { static GType deinterlace_field_layout_type = 0; static const GEnumValue field_layout_types[] = { {GST_DEINTERLACE_LAYOUT_AUTO, "Auto detection", "auto"}, {GST_DEINTERLACE_LAYOUT_TFF, "Top field first", "tff"}, {GST_DEINTERLACE_LAYOUT_BFF, "Bottom field first", "bff"}, {0, NULL, NULL}, }; if (!deinterlace_field_layout_type) { deinterlace_field_layout_type = g_enum_register_static ("GstDeinterlaceFieldLayout", field_layout_types); } return deinterlace_field_layout_type; } #define GST_TYPE_DEINTERLACE_MODES (gst_deinterlace_modes_get_type ()) static GType gst_deinterlace_modes_get_type (void) { static GType deinterlace_modes_type = 0; static const GEnumValue modes_types[] = { {GST_DEINTERLACE_MODE_AUTO, "Auto detection", "auto"}, {GST_DEINTERLACE_MODE_INTERLACED, "Force deinterlacing", "interlaced"}, {GST_DEINTERLACE_MODE_DISABLED, "Run in passthrough mode", "disabled"}, {0, NULL, NULL}, }; if (!deinterlace_modes_type) { deinterlace_modes_type = g_enum_register_static ("GstDeinterlaceModes", modes_types); } return deinterlace_modes_type; } #define GST_TYPE_DEINTERLACE_LOCKING (gst_deinterlace_locking_get_type ()) static GType gst_deinterlace_locking_get_type (void) { static GType deinterlace_locking_type = 0; if (!deinterlace_locking_type) { deinterlace_locking_type = g_enum_register_static ("GstDeinterlaceLocking", locking_types); } return deinterlace_locking_type; } #define DEINTERLACE_CAPS \ GST_VIDEO_CAPS_YUV ("{ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12, NV21 }") ";" \ GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" \ GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" \ GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" \ GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx ";" \ GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (DEINTERLACE_CAPS) ); static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (DEINTERLACE_CAPS) ); static void gst_deinterlace_finalize (GObject * self); static void gst_deinterlace_set_property (GObject * self, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_deinterlace_get_property (GObject * self, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_deinterlace_getcaps (GstPad * pad); static gboolean gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_deinterlace_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_deinterlace_sink_query (GstPad * pad, GstQuery * query); static GstFlowReturn gst_deinterlace_chain (GstPad * pad, GstBuffer * buffer); static GstFlowReturn gst_deinterlace_alloc_buffer (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static GstStateChangeReturn gst_deinterlace_change_state (GstElement * element, GstStateChange transition); static gboolean gst_deinterlace_src_event (GstPad * pad, GstEvent * event); static gboolean gst_deinterlace_src_query (GstPad * pad, GstQuery * query); static const GstQueryType *gst_deinterlace_src_query_types (GstPad * pad); static GstFlowReturn gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing); static void gst_deinterlace_reset (GstDeinterlace * self); static void gst_deinterlace_update_qos (GstDeinterlace * self, gdouble proportion, GstClockTimeDiff diff, GstClockTime time); static void gst_deinterlace_reset_qos (GstDeinterlace * self); static void gst_deinterlace_read_qos (GstDeinterlace * self, gdouble * proportion, GstClockTime * time); static void gst_deinterlace_child_proxy_interface_init (gpointer g_iface, gpointer iface_data); static void _do_init (GType object_type) { const GInterfaceInfo child_proxy_interface_info = { (GInterfaceInitFunc) gst_deinterlace_child_proxy_interface_init, NULL, /* interface_finalize */ NULL /* interface_data */ }; g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, &child_proxy_interface_info); } GST_BOILERPLATE_FULL (GstDeinterlace, gst_deinterlace, GstElement, GST_TYPE_ELEMENT, _do_init); static const struct { GType (*get_type) (void); } _method_types[] = { { gst_deinterlace_method_tomsmocomp_get_type}, { gst_deinterlace_method_greedy_h_get_type}, { gst_deinterlace_method_greedy_l_get_type}, { gst_deinterlace_method_vfir_get_type}, { gst_deinterlace_method_linear_get_type}, { gst_deinterlace_method_linear_blend_get_type}, { gst_deinterlace_method_scaler_bob_get_type}, { gst_deinterlace_method_weave_get_type}, { gst_deinterlace_method_weave_tff_get_type}, { gst_deinterlace_method_weave_bff_get_type} }; static void gst_deinterlace_set_method (GstDeinterlace * self, GstDeinterlaceMethods method) { GType method_type; GST_DEBUG_OBJECT (self, "Setting new method %d", method); if (self->method) { if (self->method_id == method && gst_deinterlace_method_supported (G_TYPE_FROM_INSTANCE (self->method), self->format, self->width, self->height)) { GST_DEBUG_OBJECT (self, "Reusing current method"); return; } gst_child_proxy_child_removed (GST_OBJECT (self), GST_OBJECT (self->method)); gst_object_unparent (GST_OBJECT (self->method)); self->method = NULL; } method_type = _method_types[method].get_type != NULL ? _method_types[method].get_type () : G_TYPE_INVALID; if (method_type == G_TYPE_INVALID || !gst_deinterlace_method_supported (method_type, self->format, self->width, self->height)) { GType tmp; gint i; method_type = G_TYPE_INVALID; GST_WARNING_OBJECT (self, "Method doesn't support requested format"); for (i = 0; i < G_N_ELEMENTS (_method_types); i++) { if (_method_types[i].get_type == NULL) continue; tmp = _method_types[i].get_type (); if (gst_deinterlace_method_supported (tmp, self->format, self->width, self->height)) { GST_DEBUG_OBJECT (self, "Using method %d", i); method_type = tmp; method = i; break; } } /* If we get here we must have invalid caps! */ g_assert (method_type != G_TYPE_INVALID); } self->method = g_object_new (method_type, "name", "method", NULL); self->method_id = method; gst_object_set_parent (GST_OBJECT (self->method), GST_OBJECT (self)); gst_child_proxy_child_added (GST_OBJECT (self), GST_OBJECT (self->method)); if (self->method) gst_deinterlace_method_setup (self->method, self->format, self->width, self->height); } static gboolean gst_deinterlace_clip_buffer (GstDeinterlace * self, GstBuffer * buffer) { gboolean ret = TRUE; GstClockTime start, stop; gint64 cstart, cstop; GST_DEBUG_OBJECT (self, "Clipping buffer to the current segment: %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer))); GST_DEBUG_OBJECT (self, "Current segment: %" GST_SEGMENT_FORMAT, &self->segment); if (G_UNLIKELY (self->segment.format != GST_FORMAT_TIME)) goto beach; if (G_UNLIKELY (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))) goto beach; start = GST_BUFFER_TIMESTAMP (buffer); stop = start + GST_BUFFER_DURATION (buffer); if (!(ret = gst_segment_clip (&self->segment, GST_FORMAT_TIME, start, stop, &cstart, &cstop))) goto beach; GST_BUFFER_TIMESTAMP (buffer) = cstart; if (GST_CLOCK_TIME_IS_VALID (cstop)) GST_BUFFER_DURATION (buffer) = cstop - cstart; beach: if (ret) GST_DEBUG_OBJECT (self, "Clipped buffer to the current segment: %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer))); else GST_DEBUG_OBJECT (self, "Buffer outside the current segment -- dropping"); return ret; } static void gst_deinterlace_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_templ); gst_element_class_add_static_pad_template (element_class, &sink_templ); gst_element_class_set_details_simple (element_class, "Deinterlacer", "Filter/Effect/Video/Deinterlace", "Deinterlace Methods ported from DScaler/TvTime", "Martin Eikermann , " "Sebastian Dröge "); } static void gst_deinterlace_class_init (GstDeinterlaceClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *element_class = (GstElementClass *) klass; gobject_class->set_property = gst_deinterlace_set_property; gobject_class->get_property = gst_deinterlace_get_property; gobject_class->finalize = gst_deinterlace_finalize; /** * GstDeinterlace:mode * * This selects whether the deinterlacing methods should * always be applied or if they should only be applied * on content that has the "interlaced" flag on the caps. * */ g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Deinterlace Mode", GST_TYPE_DEINTERLACE_MODES, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); /** * GstDeinterlace:method * * Selects the different deinterlacing algorithms that can be used. * These provide different quality and CPU usage. * * Some methods provide parameters which can be set by getting * the "method" child via the #GstChildProxy interface and * setting the appropiate properties on it. * * * * * tomsmocomp * Motion Adaptive: Motion Search * * * * * greedyh * Motion Adaptive: Advanced Detection * * * * * greedyl * Motion Adaptive: Simple Detection * * * * * vfir * Blur vertical * * * * * linear * Linear interpolation * * * * * linearblend * Linear interpolation in time domain. Any motion causes significant * ghosting, so this method should not be used. * * * * * scalerbob * Double lines * * * * * weave * Weave. Bad quality, do not use. * * * * * weavetff * Progressive: Top Field First. Bad quality, do not use. * * * * * weavebff * Progressive: Bottom Field First. Bad quality, do not use. * * * */ g_object_class_install_property (gobject_class, PROP_METHOD, g_param_spec_enum ("method", "Method", "Deinterlace Method", GST_TYPE_DEINTERLACE_METHODS, DEFAULT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); /** * GstDeinterlace:fields * * This selects which fields should be output. If "all" is selected * the output framerate will be double. * */ g_object_class_install_property (gobject_class, PROP_FIELDS, g_param_spec_enum ("fields", "fields", "Fields to use for deinterlacing", GST_TYPE_DEINTERLACE_FIELDS, DEFAULT_FIELDS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); /** * GstDeinterlace:layout * * This selects which fields is the first in time. * */ g_object_class_install_property (gobject_class, PROP_FIELD_LAYOUT, g_param_spec_enum ("tff", "tff", "Deinterlace top field first", GST_TYPE_DEINTERLACE_FIELD_LAYOUT, DEFAULT_FIELD_LAYOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); /** * GstDeinterlace:locking * * This selects which approach to pattern locking is used which affects * processing latency and accuracy of timestamp adjustment for telecine * streams. * * Since: 0.10.31 * */ g_object_class_install_property (gobject_class, PROP_LOCKING, g_param_spec_enum ("locking", "locking", "Pattern locking mode", GST_TYPE_DEINTERLACE_LOCKING, DEFAULT_LOCKING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstDeinterlace:ignore-obscure * * This selects whether to ignore obscure/rare telecine patterns. * NTSC 2:3 pulldown variants are the only really common patterns. * * Since: 0.10.31 * */ g_object_class_install_property (gobject_class, PROP_IGNORE_OBSCURE, g_param_spec_boolean ("ignore-obscure", "ignore-obscure", "Ignore obscure telecine patterns (only consider P, I and 2:3 " "variants).", DEFAULT_IGNORE_OBSCURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstDeinterlace:drop-orphans * * This selects whether to drop orphan fields at the beginning of telecine * patterns in active locking mode. * * Since: 0.10.31 * */ g_object_class_install_property (gobject_class, PROP_DROP_ORPHANS, g_param_spec_boolean ("drop-orphans", "drop-orphans", "Drop orphan fields at the beginning of telecine patterns in " "active locking mode.", DEFAULT_DROP_ORPHANS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); element_class->change_state = GST_DEBUG_FUNCPTR (gst_deinterlace_change_state); } static GstObject * gst_deinterlace_child_proxy_get_child_by_index (GstChildProxy * child_proxy, guint index) { GstDeinterlace *self = GST_DEINTERLACE (child_proxy); g_return_val_if_fail (index == 0, NULL); return gst_object_ref (self->method); } static guint gst_deinterlace_child_proxy_get_children_count (GstChildProxy * child_proxy) { GstDeinterlace *self = GST_DEINTERLACE (child_proxy); return ((self->method) ? 1 : 0); } static void gst_deinterlace_child_proxy_interface_init (gpointer g_iface, gpointer iface_data) { GstChildProxyInterface *iface = g_iface; iface->get_child_by_index = gst_deinterlace_child_proxy_get_child_by_index; iface->get_children_count = gst_deinterlace_child_proxy_get_children_count; } static void gst_deinterlace_init (GstDeinterlace * self, GstDeinterlaceClass * klass) { self->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_deinterlace_chain)); gst_pad_set_event_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_deinterlace_sink_event)); gst_pad_set_setcaps_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_deinterlace_setcaps)); gst_pad_set_getcaps_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_deinterlace_getcaps)); gst_pad_set_query_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_deinterlace_sink_query)); gst_pad_set_bufferalloc_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_deinterlace_alloc_buffer)); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_templ, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_deinterlace_src_event)); gst_pad_set_query_type_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_deinterlace_src_query_types)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_deinterlace_src_query)); gst_pad_set_getcaps_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_deinterlace_getcaps)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); self->mode = DEFAULT_MODE; self->user_set_method_id = DEFAULT_METHOD; gst_deinterlace_set_method (self, self->user_set_method_id); self->fields = DEFAULT_FIELDS; self->field_layout = DEFAULT_FIELD_LAYOUT; self->locking = DEFAULT_LOCKING; self->ignore_obscure = DEFAULT_IGNORE_OBSCURE; self->drop_orphans = DEFAULT_DROP_ORPHANS; self->low_latency = -1; self->pattern = -1; self->pattern_phase = -1; self->pattern_count = 0; self->output_count = 0; self->pattern_base_ts = GST_CLOCK_TIME_NONE; self->pattern_buf_dur = GST_CLOCK_TIME_NONE; self->still_frame_mode = FALSE; gst_deinterlace_reset (self); } static void gst_deinterlace_reset_history (GstDeinterlace * self, gboolean drop_all) { gint i; if (!drop_all) { GST_DEBUG_OBJECT (self, "Flushing history (count %d)", self->history_count); while (self->history_count > 0) { if (gst_deinterlace_output_frame (self, TRUE) != GST_FLOW_OK) { /* Encountered error, or flushing -> skip and drop all remaining */ drop_all = TRUE; break; } } } if (drop_all) { GST_DEBUG_OBJECT (self, "Resetting history (count %d)", self->history_count); for (i = 0; i < self->history_count; i++) { if (self->field_history[i].buf) { gst_buffer_unref (self->field_history[i].buf); self->field_history[i].buf = NULL; } } } memset (self->field_history, 0, GST_DEINTERLACE_MAX_FIELD_HISTORY * sizeof (GstDeinterlaceField)); self->history_count = 0; memset (self->buf_states, 0, GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * sizeof (GstDeinterlaceBufferState)); self->state_count = 0; self->pattern_lock = FALSE; self->pattern_refresh = TRUE; self->cur_field_idx = -1; if (!self->still_frame_mode && self->last_buffer) { gst_buffer_unref (self->last_buffer); self->last_buffer = NULL; } } static void gst_deinterlace_update_passthrough (GstDeinterlace * self) { self->passthrough = (self->mode == GST_DEINTERLACE_MODE_DISABLED || (!self->interlaced && self->mode != GST_DEINTERLACE_MODE_INTERLACED)); GST_DEBUG_OBJECT (self, "Passthrough: %d", self->passthrough); } static void gst_deinterlace_reset (GstDeinterlace * self) { GST_DEBUG_OBJECT (self, "Resetting internal state"); self->format = GST_VIDEO_FORMAT_UNKNOWN; self->width = 0; self->height = 0; self->frame_size = 0; self->fps_n = self->fps_d = 0; self->passthrough = FALSE; self->reconfigure = FALSE; if (self->new_mode != -1) self->mode = self->new_mode; if (self->new_fields != -1) self->fields = self->new_fields; self->new_mode = -1; self->new_fields = -1; gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); if (self->request_caps) gst_caps_unref (self->request_caps); self->request_caps = NULL; gst_deinterlace_reset_history (self, TRUE); gst_deinterlace_reset_qos (self); self->need_more = FALSE; self->have_eos = FALSE; } static void gst_deinterlace_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDeinterlace *self; g_return_if_fail (GST_IS_DEINTERLACE (object)); self = GST_DEINTERLACE (object); switch (prop_id) { case PROP_MODE:{ gint new_mode; GST_OBJECT_LOCK (self); new_mode = g_value_get_enum (value); if (self->mode != new_mode && GST_PAD_CAPS (self->srcpad)) { self->reconfigure = TRUE; self->new_mode = new_mode; } else { self->mode = new_mode; gst_deinterlace_update_passthrough (self); } GST_OBJECT_UNLOCK (self); break; } case PROP_METHOD: self->user_set_method_id = g_value_get_enum (value); gst_deinterlace_set_method (self, self->user_set_method_id); break; case PROP_FIELDS:{ gint new_fields; GST_OBJECT_LOCK (self); new_fields = g_value_get_enum (value); if (self->fields != new_fields && GST_PAD_CAPS (self->srcpad)) { self->reconfigure = TRUE; self->new_fields = new_fields; } else { self->fields = new_fields; } GST_OBJECT_UNLOCK (self); break; } case PROP_FIELD_LAYOUT: self->field_layout = g_value_get_enum (value); break; case PROP_LOCKING: self->locking = g_value_get_enum (value); break; case PROP_IGNORE_OBSCURE: self->ignore_obscure = g_value_get_boolean (value); break; case PROP_DROP_ORPHANS: self->drop_orphans = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); } } static void gst_deinterlace_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDeinterlace *self; g_return_if_fail (GST_IS_DEINTERLACE (object)); self = GST_DEINTERLACE (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, self->mode); break; case PROP_METHOD: g_value_set_enum (value, self->user_set_method_id); break; case PROP_FIELDS: g_value_set_enum (value, self->fields); break; case PROP_FIELD_LAYOUT: g_value_set_enum (value, self->field_layout); break; case PROP_LOCKING: g_value_set_enum (value, self->locking); break; case PROP_IGNORE_OBSCURE: g_value_set_boolean (value, self->ignore_obscure); break; case PROP_DROP_ORPHANS: g_value_set_boolean (value, self->drop_orphans); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); } } static void gst_deinterlace_finalize (GObject * object) { GstDeinterlace *self = GST_DEINTERLACE (object); gst_deinterlace_reset (self); if (self->method) { gst_object_unparent (GST_OBJECT (self->method)); self->method = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_deinterlace_update_pattern_timestamps (GstDeinterlace * self) { gint state_idx; if (self->low_latency) { /* in low-latency mode the buffer state history contains old buffer * states as well as the current one and perhaps some future ones. * the current buffer's state is given by the number of field pairs * rounded up, minus 1. the below is equivalent */ state_idx = (self->history_count - 1) >> 1; } else { /* in high-latency mode state_count - 1 is the current buffer's state */ state_idx = self->state_count - 1; } self->pattern_base_ts = self->buf_states[state_idx].timestamp; self->pattern_buf_dur = (self->buf_states[state_idx].duration * telecine_patterns[self->pattern].ratio_d) / telecine_patterns[self->pattern].ratio_n; GST_DEBUG_OBJECT (self, "Starting a new pattern repeat with base ts %" GST_TIME_FORMAT " and dur %" GST_TIME_FORMAT, GST_TIME_ARGS (self->pattern_base_ts), GST_TIME_ARGS (self->pattern_buf_dur)); } static GstBuffer * gst_deinterlace_pop_history (GstDeinterlace * self) { GstBuffer *buffer; g_return_val_if_fail (self->history_count > 0, NULL); GST_DEBUG_OBJECT (self, "Pop last history buffer -- current history size %d", self->history_count); buffer = self->field_history[self->history_count - 1].buf; self->history_count--; if (self->locking != GST_DEINTERLACE_LOCKING_NONE && (!self->history_count || GST_BUFFER_DATA (buffer) != GST_BUFFER_DATA (self->field_history[self->history_count - 1].buf))) { if (!self->low_latency) self->state_count--; if (self->pattern_lock) { self->pattern_count++; if (self->pattern != -1 && self->pattern_count >= telecine_patterns[self->pattern].length) { self->pattern_count = 0; self->output_count = 0; gst_deinterlace_update_pattern_timestamps (self); } } } GST_DEBUG_OBJECT (self, "Returning buffer: %p %" GST_TIME_FORMAT " with duration %" GST_TIME_FORMAT " and size %u", buffer, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_BUFFER_SIZE (buffer)); return buffer; } typedef enum { GST_DEINTERLACE_PROGRESSIVE, GST_DEINTERLACE_INTERLACED, GST_DEINTERLACE_TELECINE, } GstDeinterlaceInterlacingMethod; static GstDeinterlaceInterlacingMethod gst_deinterlace_get_interlacing_method (const GstCaps * caps) { GstDeinterlaceInterlacingMethod method = 0; gboolean interlaced; /* check interlaced cap, defaulting to FALSE */ if (!gst_structure_get_boolean (gst_caps_get_structure (caps, 0), "interlaced", &interlaced)) interlaced = FALSE; method = interlaced ? GST_DEINTERLACE_INTERLACED : GST_DEINTERLACE_PROGRESSIVE; if (method == GST_DEINTERLACE_INTERLACED) { const gchar *temp = gst_structure_get_string (gst_caps_get_structure (caps, 0), "interlacing-method"); if (temp && g_str_equal (temp, "telecine")) method = GST_DEINTERLACE_TELECINE; } return method; } static void gst_deinterlace_get_buffer_state (GstDeinterlace * self, GstBuffer * buffer, guint8 * state, GstDeinterlaceInterlacingMethod * i_method) { GstDeinterlaceInterlacingMethod interlacing_method; if (!(i_method || state)) return; interlacing_method = gst_deinterlace_get_interlacing_method (GST_BUFFER_CAPS (buffer)); if (state) { if (interlacing_method == GST_DEINTERLACE_TELECINE) { if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_RFF)) { *state = GST_DEINTERLACE_BUFFER_STATE_DROP; } else if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_ONEFIELD)) { /* tc top if tff, tc bottom otherwise */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_TFF)) { *state = GST_DEINTERLACE_BUFFER_STATE_TC_T; } else { *state = GST_DEINTERLACE_BUFFER_STATE_TC_B; } } else if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_PROGRESSIVE)) { *state = GST_DEINTERLACE_BUFFER_STATE_TC_P; } else { *state = GST_DEINTERLACE_BUFFER_STATE_TC_M; } } else { if (interlacing_method == GST_DEINTERLACE_INTERLACED) { *state = GST_DEINTERLACE_BUFFER_STATE_I; } else { *state = GST_DEINTERLACE_BUFFER_STATE_P; } } } if (i_method) *i_method = interlacing_method; } static void gst_deinterlace_push_history (GstDeinterlace * self, GstBuffer * buffer) { int i = 1; GstClockTime timestamp; GstDeinterlaceFieldLayout field_layout = self->field_layout; gboolean repeated = GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_RFF); gboolean tff = GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_TFF); gboolean onefield = GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_ONEFIELD); GstBuffer *field1, *field2; guint fields_to_push = (onefield) ? 1 : (!repeated) ? 2 : 3; gint field1_flags, field2_flags; GstDeinterlaceInterlacingMethod interlacing_method; guint8 buf_state; g_return_if_fail (self->history_count < GST_DEINTERLACE_MAX_FIELD_HISTORY - fields_to_push); gst_deinterlace_get_buffer_state (self, buffer, &buf_state, &interlacing_method); GST_DEBUG_OBJECT (self, "Pushing new buffer to the history: ptr %p at %" GST_TIME_FORMAT " with duration %" GST_TIME_FORMAT ", size %u, state %u, interlacing method %s", GST_BUFFER_DATA (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_BUFFER_SIZE (buffer), buf_state, interlacing_method == GST_DEINTERLACE_TELECINE ? "TC" : interlacing_method == GST_DEINTERLACE_INTERLACED ? "I" : "P"); /* move up for new state */ memmove (&self->buf_states[1], &self->buf_states[0], (GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY - 1) * sizeof (GstDeinterlaceBufferState)); self->buf_states[0].state = buf_state; self->buf_states[0].timestamp = GST_BUFFER_TIMESTAMP (buffer); self->buf_states[0].duration = GST_BUFFER_DURATION (buffer); if (self->state_count < GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY) self->state_count++; if (buf_state == GST_DEINTERLACE_BUFFER_STATE_DROP) { GST_DEBUG_OBJECT (self, "Buffer contains only unneeded repeated fields, dropping and not" "adding to field history"); gst_buffer_unref (buffer); return; } /* telecine does not make use of repeated fields */ if (interlacing_method == GST_DEINTERLACE_TELECINE) repeated = FALSE; for (i = GST_DEINTERLACE_MAX_FIELD_HISTORY - 1; i >= fields_to_push; i--) { self->field_history[i].buf = self->field_history[i - fields_to_push].buf; self->field_history[i].flags = self->field_history[i - fields_to_push].flags; } if (field_layout == GST_DEINTERLACE_LAYOUT_AUTO) { if (!self->interlaced) { GST_WARNING_OBJECT (self, "Can't detect field layout -- assuming TFF"); field_layout = GST_DEINTERLACE_LAYOUT_TFF; } else if (tff) { field_layout = GST_DEINTERLACE_LAYOUT_TFF; } else { field_layout = GST_DEINTERLACE_LAYOUT_BFF; } } if (field_layout == GST_DEINTERLACE_LAYOUT_TFF) { GST_DEBUG_OBJECT (self, "Top field first"); field1 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); field1_flags = PICTURE_INTERLACED_TOP; field2 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); field2_flags = PICTURE_INTERLACED_BOTTOM; } else { GST_DEBUG_OBJECT (self, "Bottom field first"); field1 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); field1_flags = PICTURE_INTERLACED_BOTTOM; field2 = gst_buffer_make_metadata_writable (gst_buffer_ref (buffer)); field2_flags = PICTURE_INTERLACED_TOP; } if (interlacing_method != GST_DEINTERLACE_TELECINE) { /* Timestamps are assigned to the field buffers under the assumption that the timestamp of the buffer equals the first fields timestamp */ timestamp = GST_BUFFER_TIMESTAMP (buffer); GST_BUFFER_TIMESTAMP (field1) = timestamp; GST_BUFFER_TIMESTAMP (field2) = timestamp + self->field_duration; if (repeated) GST_BUFFER_TIMESTAMP (field2) += self->field_duration; } if (repeated) { self->field_history[2].buf = field1; self->field_history[2].flags = field1_flags; self->field_history[1].buf = field2; self->field_history[1].flags = field2_flags; self->field_history[0].buf = gst_buffer_make_metadata_writable (gst_buffer_ref (field1)); GST_BUFFER_TIMESTAMP (self->field_history[0].buf) += 2 * self->field_duration; self->field_history[0].flags = field1_flags; } else if (!onefield) { self->field_history[1].buf = field1; self->field_history[1].flags = field1_flags; self->field_history[0].buf = field2; self->field_history[0].flags = field2_flags; } else { /* onefield */ self->field_history[0].buf = field1; self->field_history[0].flags = field1_flags; gst_buffer_unref (field2); } self->history_count += fields_to_push; self->cur_field_idx += fields_to_push; GST_DEBUG_OBJECT (self, "Pushed buffer -- current history size %d, index %d", self->history_count, self->cur_field_idx); if (self->last_buffer) gst_buffer_unref (self->last_buffer); self->last_buffer = buffer; } static void gst_deinterlace_update_qos (GstDeinterlace * self, gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp) { GST_DEBUG_OBJECT (self, "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %" GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "", GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp)); GST_OBJECT_LOCK (self); self->proportion = proportion; if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { if (G_UNLIKELY (diff > 0)) self->earliest_time = timestamp + 2 * diff + ((self->fields == GST_DEINTERLACE_ALL) ? self->field_duration : 2 * self->field_duration); else self->earliest_time = timestamp + diff; } else { self->earliest_time = GST_CLOCK_TIME_NONE; } GST_OBJECT_UNLOCK (self); } static void gst_deinterlace_reset_qos (GstDeinterlace * self) { gst_deinterlace_update_qos (self, 0.5, 0, GST_CLOCK_TIME_NONE); } static void gst_deinterlace_read_qos (GstDeinterlace * self, gdouble * proportion, GstClockTime * time) { GST_OBJECT_LOCK (self); *proportion = self->proportion; *time = self->earliest_time; GST_OBJECT_UNLOCK (self); } /* Perform qos calculations before processing the next frame. Returns TRUE if * the frame should be processed, FALSE if the frame can be dropped entirely */ static gboolean gst_deinterlace_do_qos (GstDeinterlace * self, GstClockTime timestamp) { GstClockTime qostime, earliest_time; gdouble proportion; /* no timestamp, can't do QoS => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { GST_LOG_OBJECT (self, "invalid timestamp, can't do QoS, process frame"); return TRUE; } /* get latest QoS observation values */ gst_deinterlace_read_qos (self, &proportion, &earliest_time); /* skip qos if we have no observation (yet) => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { GST_LOG_OBJECT (self, "no observation yet, process frame"); return TRUE; } /* qos is done on running time */ qostime = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME, timestamp); /* see how our next timestamp relates to the latest qos timestamp */ GST_LOG_OBJECT (self, "qostime %" GST_TIME_FORMAT ", earliest %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { GST_DEBUG_OBJECT (self, "we are late, drop frame"); return FALSE; } GST_LOG_OBJECT (self, "process frame"); return TRUE; } static gboolean gst_deinterlace_fix_timestamps (GstDeinterlace * self, GstDeinterlaceField * field1, GstDeinterlaceField * field2) { GstDeinterlaceField *field3, *field4; GstDeinterlaceInterlacingMethod interlacing_method; if (self->pattern_lock && self->pattern > -1) { /* accurate pattern-locked timestamp adjustment */ if (!self->pattern_count) gst_deinterlace_update_pattern_timestamps (self); GST_BUFFER_TIMESTAMP (field1->buf) = self->pattern_base_ts + self->output_count * self->pattern_buf_dur; GST_BUFFER_DURATION (field1->buf) = self->pattern_buf_dur; self->output_count++; } else { /* naive (but low-latency) timestamp adjustment based on subsequent * fields/buffers */ if (field2 && GST_BUFFER_DATA (field1->buf) != GST_BUFFER_DATA (field2->buf)) { if (GST_BUFFER_TIMESTAMP (field1->buf) + GST_BUFFER_DURATION (field1->buf) == GST_BUFFER_TIMESTAMP (field2->buf)) { GST_BUFFER_TIMESTAMP (field1->buf) = GST_BUFFER_TIMESTAMP (field2->buf) = (GST_BUFFER_TIMESTAMP (field1->buf) + GST_BUFFER_TIMESTAMP (field2->buf)) / 2; } else { GST_BUFFER_TIMESTAMP (field2->buf) = GST_BUFFER_TIMESTAMP (field1->buf); } } if (self->history_count < 3) { GST_DEBUG_OBJECT (self, "Need more fields (have %d, need 3)", self->history_count); return FALSE; } field3 = &self->field_history[self->history_count - 3]; interlacing_method = gst_deinterlace_get_interlacing_method (GST_BUFFER_CAPS (field3->buf)); if (interlacing_method == GST_DEINTERLACE_TELECINE) { if (self->history_count < 4) { GST_DEBUG_OBJECT (self, "Need more fields (have %d, need 4)", self->history_count); return FALSE; } field4 = &self->field_history[self->history_count - 4]; if (GST_BUFFER_DATA (field3->buf) != GST_BUFFER_DATA (field4->buf)) { /* telecine fields in separate buffers */ GST_BUFFER_TIMESTAMP (field3->buf) = (GST_BUFFER_TIMESTAMP (field3->buf) + GST_BUFFER_TIMESTAMP (field4->buf)) / 2; } } GST_BUFFER_DURATION (field1->buf) = GST_BUFFER_TIMESTAMP (field3->buf) - GST_BUFFER_TIMESTAMP (field1->buf); } GST_DEBUG_OBJECT (self, "Field 1 adjusted to ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1->buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (field1->buf))); return TRUE; } static void gst_deinterlace_get_pattern_lock (GstDeinterlace * self, gboolean * flush_one) { /* loop over all possible patterns and all possible phases * giving each a score. the highest score gets the lock */ /* the score is calculated as the number of matched buffers in the * sequence starting at the phase offset with those from the history * then the longest duration pattern match is taken. if there is more than * one pattern matching all buffers, we take the longest pattern of those. * matches to complete patterns are preferred. if no non-trivial pattern is * matched, trivial patterns are tested. */ gint i, j, k, score, pattern, phase; const gint state_count = self->state_count; const gint n_required = self->ignore_obscure ? GST_DEINTERLACE_OBSCURE_THRESHOLD : GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY; /* set unknown pattern as this is used in logic outside this function */ self->pattern = -1; /* wait for more buffers */ if (!self->have_eos && state_count < n_required) { GST_DEBUG_OBJECT (self, "Need more buffers in state history - %d/%d", state_count, n_required); return; } score = pattern = phase = -1; /* loop over all patterns */ for (i = 0; i < G_N_ELEMENTS (telecine_patterns); i++) { const guint8 length = telecine_patterns[i].length; if (self->ignore_obscure && i >= GST_DEINTERLACE_OBSCURE_THRESHOLD) break; if (state_count < length) continue; /* loop over all phases */ for (j = 0; j < length; j++) { /* low-latency mode looks at past buffers, high latency at future buffers */ const gint state_idx = (self->low_latency ? length : state_count) - 1; /* loop over history, breaking on differing buffer states */ for (k = 0; k < length && k < state_count; k++) { const guint8 hist = self->buf_states[state_idx - k].state; const guint8 patt = telecine_patterns[i].states[(j + k) % length]; if (!(hist & patt)) break; } /* make complete matches more signficant */ if (k == length) k += GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY; /* take as new best pattern if the number of matched buffers is more than * for other patterns */ if (k > score) { score = k; pattern = i; phase = j; if (self->low_latency) { /* state_idx + 1 is the number of buffers yet to be pushed out * so length - state_idx - 1 is the number of old buffers in the * pattern */ phase = (phase + length - state_idx - 1) % length; } } } } GST_DEBUG_OBJECT (self, "Final pattern match result: pa %d, ph %d, l %d, s %d", pattern, phase, telecine_patterns[pattern].length, score); self->pattern = pattern; self->pattern_phase = phase; self->pattern_count = 0; self->output_count = 0; self->pattern_lock = TRUE; /* check for the case that the first field of the pattern is an orphan */ if (pattern > 1 && telecine_patterns[pattern].states[phase] & (GST_ONE | GST_INT)) { gint i = phase, field_count = 0; guint8 state = telecine_patterns[pattern].states[i]; do { if (state & GST_ONE) { field_count++; } else if (!(state & GST_DRP)) { field_count += 2; } i++; i %= telecine_patterns[pattern].length; state = telecine_patterns[pattern].states[i]; } while (!(state & GST_PRG)); /* if field_count is odd, we have an orphan field at the beginning of the * sequence * note - don't do this in low-latency mode as we are somewhere within the * pattern already */ if (!self->low_latency && (*flush_one = field_count & 1)) { GST_DEBUG_OBJECT (self, "Orphan field detected at the beginning of the " "pattern - it will be deinterlaced."); } } } static GstFlowReturn gst_deinterlace_output_frame (GstDeinterlace * self, gboolean flushing) { GstClockTime timestamp; GstFlowReturn ret; gint fields_required; GstBuffer *buf, *outbuf; GstDeinterlaceField *field1, *field2; GstDeinterlaceInterlacingMethod interlacing_method; guint8 buf_state; gboolean hl_no_lock; /* indicates high latency timestamp adjustment but no pattern lock (could be ONEF or I) */ gboolean same_buffer; /* are field1 and field2 in the same buffer? */ gboolean flush_one; /* used for flushing one field when in high latency mode and not locked */ TelecinePattern pattern; guint8 phase, count; const GstDeinterlaceLocking locking = self->locking; restart: ret = GST_FLOW_OK; fields_required = 0; hl_no_lock = FALSE; same_buffer = FALSE; flush_one = FALSE; self->need_more = FALSE; phase = self->pattern_phase; count = self->pattern_count; if (!self->history_count) { GST_DEBUG_OBJECT (self, "History is empty, waiting for more buffers!"); goto need_more; } field1 = &self->field_history[self->history_count - 1]; if (locking != GST_DEINTERLACE_LOCKING_NONE) { if (!self->state_count) { GST_ERROR_OBJECT (self, "BROKEN! Fields in history + no states should not happen!"); return GST_FLOW_ERROR; } gst_deinterlace_get_buffer_state (self, field1->buf, &buf_state, &interlacing_method); if (self->pattern != -1) pattern = telecine_patterns[self->pattern]; /* patterns 0 and 1 are interlaced, the rest are telecine */ if (self->pattern > 1) interlacing_method = GST_DEINTERLACE_TELECINE; if (self->pattern == -1 || self->pattern_refresh || !(buf_state & pattern.states[(phase + count) % pattern.length])) { /* no pattern, pattern refresh set or unexpected buffer state */ self->pattern_lock = FALSE; self->pattern_refresh = TRUE; /* refresh pattern lock */ gst_deinterlace_get_pattern_lock (self, &flush_one); if (self->pattern != -1) { /* locked onto a valid pattern so refresh complete */ GST_DEBUG_OBJECT (self, "Pattern locked! %s starting at %d", telecine_patterns[self->pattern].nick, self->pattern_phase); self->pattern_refresh = FALSE; } else if (!self->low_latency) { if (!self->pattern_lock) { goto need_more; } else { hl_no_lock = TRUE; } } /* setcaps on sink and src pads */ gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); if (flush_one && self->drop_orphans) { GST_DEBUG_OBJECT (self, "Dropping orphan first field"); self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); goto restart; } } } else { gst_deinterlace_get_buffer_state (self, field1->buf, NULL, &interlacing_method); } same_buffer = self->history_count >= 2 && (GST_BUFFER_DATA (field1->buf) == GST_BUFFER_DATA (self->field_history[self->history_count - 2].buf)); if ((flushing && self->history_count == 1) || (flush_one && !self->drop_orphans) || (hl_no_lock && (self->history_count == 1 || !same_buffer))) { GST_DEBUG_OBJECT (self, "Flushing one field using linear method"); gst_deinterlace_set_method (self, GST_DEINTERLACE_LINEAR); fields_required = gst_deinterlace_method_get_fields_required (self->method); } else if (interlacing_method == GST_DEINTERLACE_TELECINE && (self->low_latency > 0 || self->pattern != -1 || (hl_no_lock && same_buffer && GST_BUFFER_FLAG_IS_SET (field1->buf, GST_VIDEO_BUFFER_PROGRESSIVE)))) { /* telecined - we reconstruct frames by weaving pairs of fields */ fields_required = 2; if (!flushing && self->history_count < fields_required) { GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)", self->history_count, self->cur_field_idx + fields_required); goto need_more; } field2 = &self->field_history[self->history_count - 2]; if (!gst_deinterlace_fix_timestamps (self, field1, field2) && !flushing) goto need_more; if (same_buffer) { /* telecine progressive */ GstBuffer *field1_buf; GST_DEBUG_OBJECT (self, "Frame type: Telecine Progressive; pushing buffer as a frame"); /* pop and push */ self->cur_field_idx--; field1_buf = gst_deinterlace_pop_history (self); /* field2 is the same buffer as field1, but we need to remove it from * the history anyway */ self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); /* set the caps from the src pad on the buffer as they should be correct */ gst_buffer_set_caps (field1_buf, GST_PAD_CAPS (self->srcpad)); GST_DEBUG_OBJECT (self, "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (field1_buf)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf) + GST_BUFFER_DURATION (field1_buf))); return gst_pad_push (self->srcpad, field1_buf); } else { /* telecine fields in separate buffers */ /* check field1 and field2 buffer caps and flags are corresponding */ if (field1->flags == field2->flags) { /* ERROR - fields are of same parity - what should be done here? * perhaps deinterlace the tip field and start again? */ GST_ERROR_OBJECT (self, "Telecine mixed with fields of same parity!"); } GST_DEBUG_OBJECT (self, "Frame type: Telecine Mixed; weaving tip two fields into a frame"); /* set method to WEAVE */ gst_deinterlace_set_method (self, GST_DEINTERLACE_WEAVE); } } else if (interlacing_method == GST_DEINTERLACE_INTERLACED || (hl_no_lock && interlacing_method == GST_DEINTERLACE_TELECINE && same_buffer && !GST_BUFFER_FLAG_IS_SET (field1->buf, GST_VIDEO_BUFFER_PROGRESSIVE))) { gst_deinterlace_set_method (self, self->user_set_method_id); fields_required = gst_deinterlace_method_get_fields_required (self->method); if (flushing && self->history_count < fields_required) { /* note: we already checked for flushing with history count == 1 above * so we must have 2 or more fields in here */ gst_deinterlace_set_method (self, GST_DEINTERLACE_VFIR); fields_required = gst_deinterlace_method_get_fields_required (self->method); GST_DEBUG_OBJECT (self, "Flushing field(s) using %s method", methods_types[self->method_id].value_nick); } /* Not enough fields in the history */ if (!flushing && self->history_count < fields_required) { GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)", self->history_count, self->cur_field_idx + fields_required); goto need_more; } GST_DEBUG_OBJECT (self, "Frame type: Interlaced; deinterlacing using %s method", methods_types[self->method_id].value_nick); } else { GstBuffer *field1_buf; /* progressive */ fields_required = 2; /* Not enough fields in the history */ if (!flushing && self->history_count < fields_required) { GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)", self->history_count, self->cur_field_idx + fields_required); goto need_more; } field2 = &self->field_history[self->history_count - 2]; if (GST_BUFFER_DATA (field1->buf) != GST_BUFFER_DATA (field2->buf)) { /* ERROR - next two fields in field history are not one progressive buffer - weave? */ GST_ERROR_OBJECT (self, "Progressive buffer but two fields at tip aren't in the same buffer!"); } GST_DEBUG_OBJECT (self, "Frame type: Progressive; pushing buffer as a frame"); /* pop and push */ self->cur_field_idx--; field1_buf = gst_deinterlace_pop_history (self); /* field2 is the same buffer as field1, but we need to remove it from the * history anyway */ self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); GST_DEBUG_OBJECT (self, "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (field1_buf)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (field1_buf) + GST_BUFFER_DURATION (field1_buf))); return gst_pad_push (self->srcpad, field1_buf); } if (!flushing && self->cur_field_idx < 1) { goto need_more; } if (self->fields == GST_DEINTERLACE_ALL || interlacing_method == GST_DEINTERLACE_TELECINE) GST_DEBUG_OBJECT (self, "All fields"); else if (self->fields == GST_DEINTERLACE_TF) GST_DEBUG_OBJECT (self, "Top fields"); else if (self->fields == GST_DEINTERLACE_BF) GST_DEBUG_OBJECT (self, "Bottom fields"); if ((self->field_history[self->cur_field_idx].flags == PICTURE_INTERLACED_TOP && (self->fields == GST_DEINTERLACE_TF || interlacing_method == GST_DEINTERLACE_TELECINE)) || self->fields == GST_DEINTERLACE_ALL) { GST_DEBUG_OBJECT (self, "deinterlacing top field"); /* create new buffer */ ret = gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE, self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf); if (ret != GST_FLOW_OK) return ret; if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf) && !gst_caps_is_equal (GST_PAD_CAPS (self->srcpad), GST_BUFFER_CAPS (outbuf))) { gst_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf)); GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT, self->request_caps); gst_buffer_unref (outbuf); outbuf = gst_buffer_try_new_and_alloc (self->frame_size); if (!outbuf) return GST_FLOW_ERROR; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (self->srcpad)); } g_return_val_if_fail (self->history_count >= 1 + gst_deinterlace_method_get_latency (self->method), GST_FLOW_ERROR); buf = self->field_history[self->history_count - 1 - gst_deinterlace_method_get_latency (self->method)].buf; if (interlacing_method != GST_DEINTERLACE_TELECINE) { timestamp = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (self->fields == GST_DEINTERLACE_ALL) GST_BUFFER_DURATION (outbuf) = self->field_duration; else GST_BUFFER_DURATION (outbuf) = 2 * self->field_duration; } else { GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); } /* Check if we need to drop the frame because of QoS */ if (!gst_deinterlace_do_qos (self, GST_BUFFER_TIMESTAMP (buf))) { self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); gst_buffer_unref (outbuf); outbuf = NULL; ret = GST_FLOW_OK; } else { if (self->cur_field_idx < 0 && flushing) { if (self->history_count == 1) { gst_buffer_unref (gst_deinterlace_pop_history (self)); goto need_more; } self->cur_field_idx++; } if (self->cur_field_idx < 0) { goto need_more; } if (!flushing && self->cur_field_idx < 1) { goto need_more; } /* do magic calculus */ gst_deinterlace_method_deinterlace_frame (self->method, self->field_history, self->history_count, outbuf, self->cur_field_idx); self->cur_field_idx--; if (self->cur_field_idx + 1 + gst_deinterlace_method_get_latency (self->method) < self->history_count || flushing) { gst_buffer_unref (gst_deinterlace_pop_history (self)); } if (gst_deinterlace_clip_buffer (self, outbuf)) { GST_DEBUG_OBJECT (self, "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf) + GST_BUFFER_DURATION (outbuf))); ret = gst_pad_push (self->srcpad, outbuf); } else { ret = GST_FLOW_OK; gst_buffer_unref (outbuf); } outbuf = NULL; if (ret != GST_FLOW_OK) return ret; if (interlacing_method == GST_DEINTERLACE_TELECINE && self->method_id == GST_DEINTERLACE_WEAVE) { /* pop off the second field */ GST_DEBUG_OBJECT (self, "Removing unused field (count: %d)", self->history_count); self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); interlacing_method = GST_DEINTERLACE_INTERLACED; return ret; } } if (flush_one && !self->drop_orphans) { GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); goto restart; } } /* no calculation done: remove excess field */ else if (self->field_history[self->cur_field_idx].flags == PICTURE_INTERLACED_TOP && (self->fields == GST_DEINTERLACE_BF && interlacing_method != GST_DEINTERLACE_TELECINE)) { GST_DEBUG_OBJECT (self, "Removing unused top field"); self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); if (flush_one && !self->drop_orphans) { GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); goto restart; } } if (self->history_count < fields_required) return ret; if (self->cur_field_idx < 0) return ret; if (!flushing && self->cur_field_idx < 1) { return ret; } /* deinterlace bottom_field */ if ((self->field_history[self->cur_field_idx].flags == PICTURE_INTERLACED_BOTTOM && (self->fields == GST_DEINTERLACE_BF || interlacing_method == GST_DEINTERLACE_TELECINE)) || self->fields == GST_DEINTERLACE_ALL) { GST_DEBUG_OBJECT (self, "deinterlacing bottom field"); /* create new buffer */ ret = gst_pad_alloc_buffer (self->srcpad, GST_BUFFER_OFFSET_NONE, self->frame_size, GST_PAD_CAPS (self->srcpad), &outbuf); if (ret != GST_FLOW_OK) return ret; if (GST_PAD_CAPS (self->srcpad) != GST_BUFFER_CAPS (outbuf) && !gst_caps_is_equal (GST_PAD_CAPS (self->srcpad), GST_BUFFER_CAPS (outbuf))) { gst_caps_replace (&self->request_caps, GST_BUFFER_CAPS (outbuf)); GST_DEBUG_OBJECT (self, "Upstream wants new caps %" GST_PTR_FORMAT, self->request_caps); gst_buffer_unref (outbuf); outbuf = gst_buffer_try_new_and_alloc (self->frame_size); if (!outbuf) return GST_FLOW_ERROR; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (self->srcpad)); } g_return_val_if_fail (self->history_count - 1 - gst_deinterlace_method_get_latency (self->method) >= 0, GST_FLOW_ERROR); buf = self->field_history[self->history_count - 1 - gst_deinterlace_method_get_latency (self->method)].buf; if (interlacing_method != GST_DEINTERLACE_TELECINE) { timestamp = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (self->fields == GST_DEINTERLACE_ALL) GST_BUFFER_DURATION (outbuf) = self->field_duration; else GST_BUFFER_DURATION (outbuf) = 2 * self->field_duration; } else { GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); } /* Check if we need to drop the frame because of QoS */ if (!gst_deinterlace_do_qos (self, GST_BUFFER_TIMESTAMP (buf))) { self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); gst_buffer_unref (outbuf); outbuf = NULL; ret = GST_FLOW_OK; } else { /* do magic calculus */ gst_deinterlace_method_deinterlace_frame (self->method, self->field_history, self->history_count, outbuf, self->cur_field_idx); self->cur_field_idx--; if (self->cur_field_idx + 1 + gst_deinterlace_method_get_latency (self->method) < self->history_count) { gst_buffer_unref (gst_deinterlace_pop_history (self)); } if (gst_deinterlace_clip_buffer (self, outbuf)) { GST_DEBUG_OBJECT (self, "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf) + GST_BUFFER_DURATION (outbuf))); ret = gst_pad_push (self->srcpad, outbuf); } else { ret = GST_FLOW_OK; gst_buffer_unref (outbuf); } outbuf = NULL; if (ret != GST_FLOW_OK) return ret; if (interlacing_method == GST_DEINTERLACE_TELECINE && self->method_id == GST_DEINTERLACE_WEAVE) { /* pop off the second field */ GST_DEBUG_OBJECT (self, "Removing unused field (count: %d)", self->history_count); self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); interlacing_method = GST_DEINTERLACE_INTERLACED; return ret; } } if (flush_one && !self->drop_orphans) { GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); goto restart; } } /* no calculation done: remove excess field */ else if (self->field_history[self->cur_field_idx].flags == PICTURE_INTERLACED_BOTTOM && (self->fields == GST_DEINTERLACE_TF && interlacing_method != GST_DEINTERLACE_TELECINE)) { GST_DEBUG_OBJECT (self, "Removing unused bottom field"); self->cur_field_idx--; gst_buffer_unref (gst_deinterlace_pop_history (self)); if (flush_one && !self->drop_orphans) { GST_DEBUG_OBJECT (self, "Orphan field deinterlaced - reconfiguring"); goto restart; } } return ret; need_more: self->need_more = TRUE; return ret; } static gboolean gst_deinterlace_get_latency (GstDeinterlace * self) { if (self->locking == GST_DEINTERLACE_LOCKING_AUTO) { gboolean res; GstQuery *query; query = gst_query_new_latency (); if ((res = gst_pad_peer_query (self->sinkpad, query))) { gboolean is_live; /* if upstream is live, we use low-latency passive locking mode * else high-latency active locking mode */ gst_query_parse_latency (query, &is_live, NULL, NULL); GST_DEBUG_OBJECT (self, "Latency query indicates stream is %s", is_live ? "live - using passive locking" : "not live - using active locking"); gst_query_unref (query); return is_live; } else { /* conservatively use passive locking if the query fails */ GST_WARNING_OBJECT (self, "Latency query failed - fall back to using passive locking"); gst_query_unref (query); return TRUE; } } else { return self->locking - 2; } } static GstFlowReturn gst_deinterlace_chain (GstPad * pad, GstBuffer * buf) { GstDeinterlace *self = GST_DEINTERLACE (GST_PAD_PARENT (pad)); GstFlowReturn ret = GST_FLOW_OK; GST_OBJECT_LOCK (self); if (self->reconfigure) { if (self->new_fields != -1) self->fields = self->new_fields; if (self->new_mode != -1) self->mode = self->new_mode; self->new_mode = self->new_fields = -1; self->reconfigure = FALSE; GST_OBJECT_UNLOCK (self); if (GST_PAD_CAPS (self->srcpad)) gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); } else { GST_OBJECT_UNLOCK (self); } GST_DEBUG_OBJECT (self, "[IN] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf))); if (self->still_frame_mode || self->passthrough) { GST_DEBUG_OBJECT (self, "Frame type: Progressive?; pushing buffer using pass-through"); GST_DEBUG_OBJECT (self, "[OUT] ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", end %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf))); return gst_pad_push (self->srcpad, buf); } if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { GST_DEBUG_OBJECT (self, "DISCONT buffer, resetting history"); gst_deinterlace_reset_history (self, FALSE); } gst_deinterlace_push_history (self, buf); buf = NULL; do { ret = gst_deinterlace_output_frame (self, FALSE); } while (!self->need_more && self->history_count > 0 && ret == GST_FLOW_OK); return ret; } static gint gst_greatest_common_divisor (gint a, gint b) { while (b != 0) { int temp = a; a = b; b = temp % b; } return ABS (a); } static gboolean gst_fraction_double (gint * n_out, gint * d_out, gboolean half) { gint n, d, gcd; n = *n_out; d = *d_out; if (d == 0) return FALSE; if (n == 0 || (n == G_MAXINT && d == 1)) return TRUE; gcd = gst_greatest_common_divisor (n, d); n /= gcd; d /= gcd; if (!half) { if (G_MAXINT / 2 >= ABS (n)) { n *= 2; } else if (d >= 2) { d /= 2; } else { return FALSE; } } else { if (G_MAXINT / 2 >= ABS (d)) { d *= 2; } else if (n >= 2) { n /= 2; } else { return FALSE; } } *n_out = n; *d_out = d; return TRUE; } static GstCaps * gst_deinterlace_getcaps (GstPad * pad) { GstCaps *ret; GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); GstPad *otherpad; gint len; const GstCaps *ourcaps; GstCaps *peercaps; otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad; ourcaps = gst_pad_get_pad_template_caps (pad); peercaps = gst_pad_peer_get_caps (otherpad); if (peercaps) { GST_DEBUG_OBJECT (pad, "Peer has caps %" GST_PTR_FORMAT, peercaps); ret = gst_caps_intersect (ourcaps, peercaps); gst_caps_unref (peercaps); } else { ret = gst_caps_copy (ourcaps); } for (len = gst_caps_get_size (ret); len > 0; len--) { GstStructure *s = gst_caps_get_structure (ret, len - 1); if (pad == self->sinkpad || self->passthrough) gst_structure_remove_field (s, "interlaced"); else gst_structure_set (s, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL); if (!self->passthrough && self->fields == GST_DEINTERLACE_ALL) { const GValue *val; val = gst_structure_get_value (s, "framerate"); if (!val) continue; if (G_VALUE_TYPE (val) == GST_TYPE_FRACTION) { gint n, d; n = gst_value_get_fraction_numerator (val); d = gst_value_get_fraction_denominator (val); if (!gst_fraction_double (&n, &d, pad != self->srcpad)) { goto error; } gst_structure_set (s, "framerate", GST_TYPE_FRACTION, n, d, NULL); } else if (G_VALUE_TYPE (val) == GST_TYPE_FRACTION_RANGE) { const GValue *min, *max; GValue nrange = { 0, }, nmin = { 0,}, nmax = { 0,}; gint n, d; g_value_init (&nrange, GST_TYPE_FRACTION_RANGE); g_value_init (&nmin, GST_TYPE_FRACTION); g_value_init (&nmax, GST_TYPE_FRACTION); min = gst_value_get_fraction_range_min (val); max = gst_value_get_fraction_range_max (val); n = gst_value_get_fraction_numerator (min); d = gst_value_get_fraction_denominator (min); if (!gst_fraction_double (&n, &d, pad != self->srcpad)) { g_value_unset (&nrange); g_value_unset (&nmax); g_value_unset (&nmin); goto error; } gst_value_set_fraction (&nmin, n, d); n = gst_value_get_fraction_numerator (max); d = gst_value_get_fraction_denominator (max); if (!gst_fraction_double (&n, &d, pad != self->srcpad)) { g_value_unset (&nrange); g_value_unset (&nmax); g_value_unset (&nmin); goto error; } gst_value_set_fraction (&nmax, n, d); gst_value_set_fraction_range (&nrange, &nmin, &nmax); gst_structure_set_value (s, "framerate", &nrange); g_value_unset (&nmin); g_value_unset (&nmax); g_value_unset (&nrange); } else if (G_VALUE_TYPE (val) == GST_TYPE_LIST) { const GValue *lval; GValue nlist = { 0, }; GValue nval = { 0, }; gint i; g_value_init (&nlist, GST_TYPE_LIST); for (i = gst_value_list_get_size (val); i > 0; i--) { gint n, d; lval = gst_value_list_get_value (val, i); if (G_VALUE_TYPE (lval) != GST_TYPE_FRACTION) continue; n = gst_value_get_fraction_numerator (lval); d = gst_value_get_fraction_denominator (lval); /* Double/Half the framerate but if this fails simply * skip this value from the list */ if (!gst_fraction_double (&n, &d, pad != self->srcpad)) { continue; } g_value_init (&nval, GST_TYPE_FRACTION); gst_value_set_fraction (&nval, n, d); gst_value_list_append_value (&nlist, &nval); g_value_unset (&nval); } gst_structure_set_value (s, "framerate", &nlist); g_value_unset (&nlist); } } } GST_DEBUG_OBJECT (pad, "Returning caps %" GST_PTR_FORMAT, ret); gst_object_unref (self); return ret; error: GST_ERROR_OBJECT (pad, "Unable to transform peer caps"); gst_caps_unref (ret); return NULL; } static gboolean gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps) { gboolean res = TRUE; GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); GstCaps *srccaps; GstDeinterlaceInterlacingMethod interlacing_method; if (self->locking != GST_DEINTERLACE_LOCKING_NONE) { if (self->low_latency == -1) self->low_latency = gst_deinterlace_get_latency (self); if (self->pattern_lock) { /* refresh has been successful - we have a lock now */ self->pattern_refresh = FALSE; } else { /* if we were not refreshing (!pattern_refresh) the caps have changed * so we need to refresh and we don't have a lock anymore * otherwise we have pattern_fresh and !pattern_lock anyway */ self->pattern_refresh = TRUE; self->pattern_lock = FALSE; } } res = gst_video_format_parse_caps (caps, &self->format, &self->width, &self->height); res &= gst_video_parse_caps_framerate (caps, &self->fps_n, &self->fps_d); if (pad == self->sinkpad) res &= gst_video_format_parse_caps_interlaced (caps, &self->interlaced); if (!res) goto invalid_caps; gst_deinterlace_update_passthrough (self); interlacing_method = gst_deinterlace_get_interlacing_method (caps); if (self->pattern_lock) { srccaps = gst_caps_copy (caps); if (self->pattern != -1 && G_UNLIKELY (!gst_util_fraction_multiply (self->fps_n, self->fps_d, telecine_patterns[self->pattern].ratio_n, telecine_patterns[self->pattern].ratio_d, &self->fps_n, &self->fps_d))) GST_ERROR_OBJECT (self, "Multiplying the framerate by the telecine pattern ratio overflowed!"); gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, self->fps_n, self->fps_d, NULL); } else if (self->low_latency > 0) { if (interlacing_method == GST_DEINTERLACE_TELECINE) { /* for initial buffers of a telecine pattern, until there is a lock we * we output naïvely adjusted timestamps */ srccaps = gst_caps_copy (caps); gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); } else if (!self->passthrough && self->fields == GST_DEINTERLACE_ALL) { gint fps_n = self->fps_n, fps_d = self->fps_d; if (!gst_fraction_double (&fps_n, &fps_d, FALSE)) goto invalid_caps; srccaps = gst_caps_copy (caps); gst_caps_set_simple (srccaps, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); } else { srccaps = gst_caps_ref (caps); } } else { /* in high latency pattern locking mode if we don't have a pattern lock, * the sink pad caps are the best we know */ srccaps = gst_caps_ref (caps); } if (self->mode != GST_DEINTERLACE_MODE_DISABLED) { srccaps = gst_caps_make_writable (srccaps); gst_structure_remove_field (gst_caps_get_structure (srccaps, 0), "interlacing-method"); gst_caps_set_simple (srccaps, "interlaced", G_TYPE_BOOLEAN, FALSE, NULL); } if (!gst_pad_set_caps (self->srcpad, srccaps)) goto caps_not_accepted; self->frame_size = gst_video_format_get_size (self->format, self->width, self->height); if (G_LIKELY (self->fps_n != 0)) { self->field_duration = gst_util_uint64_scale (GST_SECOND, self->fps_d, 2 * self->fps_n); } else { self->field_duration = 0; } gst_deinterlace_set_method (self, self->method_id); gst_deinterlace_method_setup (self->method, self->format, self->width, self->height); GST_DEBUG_OBJECT (pad, "Sink caps: %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (pad, "Src caps: %" GST_PTR_FORMAT, srccaps); gst_caps_unref (srccaps); done: gst_object_unref (self); return res; invalid_caps: res = FALSE; GST_ERROR_OBJECT (pad, "Invalid caps: %" GST_PTR_FORMAT, caps); goto done; caps_not_accepted: res = FALSE; GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, srccaps); gst_caps_unref (srccaps); goto done; } static gboolean gst_deinterlace_sink_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); GST_LOG_OBJECT (pad, "received %s event: %" GST_PTR_FORMAT, GST_EVENT_TYPE_NAME (event), event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat fmt; gboolean is_update; gint64 start, end, base; gdouble rate, applied_rate; gst_event_parse_new_segment_full (event, &is_update, &rate, &applied_rate, &fmt, &start, &end, &base); gst_deinterlace_reset_qos (self); gst_deinterlace_reset_history (self, FALSE); if (fmt == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (pad, "Got NEWSEGMENT event in GST_FORMAT_TIME, passing on (%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", GST_TIME_ARGS (start), GST_TIME_ARGS (end)); gst_segment_set_newsegment_full (&self->segment, is_update, rate, applied_rate, fmt, start, end, base); } else { gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); } res = gst_pad_push_event (self->srcpad, event); break; } case GST_EVENT_CUSTOM_DOWNSTREAM:{ gboolean still_state; if (gst_video_event_parse_still_frame (event, &still_state)) { GST_DEBUG_OBJECT (self, "Received still frame event, state %d", still_state); if (still_state) { GstFlowReturn ret; GST_DEBUG_OBJECT (self, "Handling still frame"); self->still_frame_mode = TRUE; gst_deinterlace_reset_history (self, FALSE); if (self->last_buffer) { ret = gst_pad_push (self->srcpad, gst_buffer_ref (self->last_buffer)); GST_DEBUG_OBJECT (self, "Pushed still frame, result: %s", gst_flow_get_name (ret)); } else { GST_WARNING_OBJECT (self, "No pending buffer!"); } } else { GST_DEBUG_OBJECT (self, "Ending still frames"); self->still_frame_mode = FALSE; } } } /* fall through */ case GST_EVENT_EOS: self->have_eos = TRUE; gst_deinterlace_reset_history (self, FALSE); /* fall through */ default: res = gst_pad_push_event (self->srcpad, event); break; case GST_EVENT_FLUSH_STOP: if (self->still_frame_mode) { GST_DEBUG_OBJECT (self, "Ending still frames"); self->still_frame_mode = FALSE; } gst_deinterlace_reset_qos (self); res = gst_pad_push_event (self->srcpad, event); gst_deinterlace_reset_history (self, TRUE); break; } gst_object_unref (self); return res; } static gboolean gst_deinterlace_sink_query (GstPad * pad, GstQuery * query) { GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); gboolean res = FALSE; GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { default:{ GstPad *peer = gst_pad_get_peer (self->srcpad); if (peer) { res = gst_pad_query (peer, query); gst_object_unref (peer); } else { res = FALSE; } break; } } gst_object_unref (self); return res; } static GstStateChangeReturn gst_deinterlace_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstDeinterlace *self = GST_DEINTERLACE (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_deinterlace_reset (self); break; case GST_STATE_CHANGE_READY_TO_NULL: default: break; } return ret; } static gboolean gst_deinterlace_src_event (GstPad * pad, GstEvent * event) { GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); gboolean res; GST_DEBUG_OBJECT (pad, "received %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS:{ GstClockTimeDiff diff; GstClockTime timestamp; gdouble proportion; gst_event_parse_qos (event, &proportion, &diff, ×tamp); gst_deinterlace_update_qos (self, proportion, diff, timestamp); } /* fall through */ default: res = gst_pad_push_event (self->sinkpad, event); break; } gst_object_unref (self); return res; } static gboolean gst_deinterlace_src_query (GstPad * pad, GstQuery * query) { GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); gboolean res = FALSE; GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: if (!self->passthrough) { GstClockTime min, max; gboolean live; GstPad *peer; if ((peer = gst_pad_get_peer (self->sinkpad))) { if ((res = gst_pad_query (peer, query))) { GstClockTime latency; gint fields_required = 0; gint method_latency = 0; if (self->method) { fields_required = gst_deinterlace_method_get_fields_required (self->method); method_latency = gst_deinterlace_method_get_latency (self->method); } gst_query_parse_latency (query, &live, &min, &max); GST_DEBUG_OBJECT (self, "Peer latency: min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min), GST_TIME_ARGS (max)); /* add our own latency */ latency = (fields_required + method_latency) * self->field_duration; GST_DEBUG_OBJECT (self, "Our latency: min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, GST_TIME_ARGS (latency), GST_TIME_ARGS (latency)); min += latency; if (max != GST_CLOCK_TIME_NONE) max += latency; GST_DEBUG_OBJECT (self, "Calculated total latency : min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min), GST_TIME_ARGS (max)); gst_query_set_latency (query, live, min, max); } gst_object_unref (peer); } else { res = FALSE; } break; } default:{ GstPad *peer = gst_pad_get_peer (self->sinkpad); if (peer) { res = gst_pad_query (peer, query); gst_object_unref (peer); } else { res = FALSE; } break; } } gst_object_unref (self); return res; } static const GstQueryType * gst_deinterlace_src_query_types (GstPad * pad) { static const GstQueryType types[] = { GST_QUERY_LATENCY, GST_QUERY_NONE }; return types; } static GstFlowReturn gst_deinterlace_alloc_buffer (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad)); GstFlowReturn ret = GST_FLOW_OK; *buf = NULL; GST_DEBUG_OBJECT (pad, "alloc with caps %" GST_PTR_FORMAT ", size %u", caps, size); if (self->still_frame_mode || self->passthrough) { ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); } else if (G_LIKELY (!self->request_caps)) { *buf = gst_buffer_try_new_and_alloc (size); if (G_UNLIKELY (!*buf)) { ret = GST_FLOW_ERROR; } else { gst_buffer_set_caps (*buf, caps); GST_BUFFER_OFFSET (*buf) = offset; } } else { gint width, height; GstVideoFormat fmt; guint new_frame_size; GstCaps *new_caps = gst_caps_copy (self->request_caps); if (self->fields == GST_DEINTERLACE_ALL) { gint n, d; GstStructure *s = gst_caps_get_structure (new_caps, 0); gst_structure_get_fraction (s, "framerate", &n, &d); if (!gst_fraction_double (&n, &d, TRUE)) { gst_object_unref (self); gst_caps_unref (new_caps); return GST_FLOW_OK; } gst_structure_set (s, "framerate", GST_TYPE_FRACTION, n, d, NULL); } if (G_UNLIKELY (!gst_video_format_parse_caps (new_caps, &fmt, &width, &height))) { gst_object_unref (self); gst_caps_unref (new_caps); return GST_FLOW_OK; } new_frame_size = gst_video_format_get_size (fmt, width, height); *buf = gst_buffer_try_new_and_alloc (new_frame_size); if (G_UNLIKELY (!*buf)) { ret = GST_FLOW_ERROR; } else { gst_buffer_set_caps (*buf, new_caps); gst_caps_unref (self->request_caps); self->request_caps = NULL; gst_caps_unref (new_caps); } } gst_object_unref (self); return ret; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (deinterlace_debug, "deinterlace", 0, "Deinterlacer"); #if HAVE_ORC orc_init (); #endif if (!gst_element_register (plugin, "deinterlace", GST_RANK_NONE, GST_TYPE_DEINTERLACE)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "deinterlace", "Deinterlacer", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/deinterlace/tvtime/0000755000175000017500000000000011720565302016444 500000000000000gst-plugins-good-0.10.31/gst/deinterlace/tvtime/mmx.h0000644000175000017500000005457011671175353017361 00000000000000/* mmx.h MultiMedia eXtensions GCC interface library for IA32. To use this library, simply include this header file and compile with GCC. You MUST have inlining enabled in order for mmx_ok() to work; this can be done by simply using -O on the GCC command line. Compiling with -DMMX_TRACE will cause detailed trace output to be sent to stderr for each mmx operation. This adds lots of code, and obviously slows execution to a crawl, but can be very useful for debugging. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. 1997-98 by H. Dietz and R. Fisher History: 97-98* R.Fisher Early versions 980501 R.Fisher Original Release 980611* H.Dietz Rewrite, correctly implementing inlines, and R.Fisher including direct register accesses. 980616 R.Fisher Release of 980611 as 980616. 980714 R.Fisher Minor corrections to Makefile, etc. 980715 R.Fisher mmx_ok() now prevents optimizer from using clobbered values. mmx_ok() now checks if cpuid instruction is available before trying to use it. 980726* R.Fisher mm_support() searches for AMD 3DNow, Cyrix Extended MMX, and standard MMX. It returns a value which is positive if any of these are supported, and can be masked with constants to see which. mmx_ok() is now a call to this 980726* R.Fisher Added i2r support for shift functions 980919 R.Fisher Fixed AMD extended feature recognition bug. 980921 R.Fisher Added definition/check for _MMX_H. Added "float s[2]" to mmx_t for use with 3DNow and EMMX. So same mmx_t can be used. 981013 R.Fisher Fixed cpuid function 1 bug (looked at wrong reg) Fixed psllq_i2r error in mmxtest.c * Unreleased (internal or interim) versions Notes: It appears that the latest gas has the pand problem fixed, therefore I'll undefine BROKEN_PAND by default. String compares may be quicker than the multiple test/jumps in vendor test sequence in mmx_ok(), but I'm not concerned with that right now. Acknowledgments: Jussi Laako for pointing out the errors ultimately found to be connected to the failure to notify the optimizer of clobbered values. Roger Hardiman for reminding us that CPUID isn't everywhere, and that someone may actually try to use this on a machine without CPUID. Also for suggesting code for checking this. Robert Dale for pointing out the AMD recognition bug. Jimmy Mayfield and Carl Witty for pointing out the Intel recognition bug. Carl Witty for pointing out the psllq_i2r test bug. */ #ifndef _MMX_H #define _MMX_H /*#define MMX_TRACE */ /* Warning: at this writing, the version of GAS packaged with most Linux distributions does not handle the parallel AND operation mnemonic correctly. If the symbol BROKEN_PAND is defined, a slower alternative coding will be used. If execution of mmxtest results in an illegal instruction fault, define this symbol. */ #undef BROKEN_PAND /* The type of an value that fits in an MMX register (note that long long constant values MUST be suffixed by LL and unsigned long long values by ULL, lest they be truncated by the compiler) */ typedef union { long long q; /* Quadword (64-bit) value */ unsigned long long uq; /* Unsigned Quadword */ int d[2]; /* 2 Doubleword (32-bit) values */ unsigned int ud[2]; /* 2 Unsigned Doubleword */ short w[4]; /* 4 Word (16-bit) values */ unsigned short uw[4]; /* 4 Unsigned Word */ char b[8]; /* 8 Byte (8-bit) values */ unsigned char ub[8]; /* 8 Unsigned Byte */ float s[2]; /* Single-precision (32-bit) value */ } mmx_t; /* Function to test if multimedia instructions are supported... */ static inline int mm_support(void) { /* Returns 1 if MMX instructions are supported, 3 if Cyrix MMX and Extended MMX instructions are supported 5 if AMD MMX and 3DNow! instructions are supported 0 if hardware does not support any of these */ register int rval = 0; __asm__ __volatile__ ( /* See if CPUID instruction is supported ... */ /* ... Get copies of EFLAGS into eax and ecx */ "pushf\n\t" "popl %%eax\n\t" "movl %%eax, %%ecx\n\t" /* ... Toggle the ID bit in one copy and store */ /* to the EFLAGS reg */ "xorl $0x200000, %%eax\n\t" "push %%eax\n\t" "popf\n\t" /* ... Get the (hopefully modified) EFLAGS */ "pushf\n\t" "popl %%eax\n\t" /* ... Compare and test result */ "xorl %%eax, %%ecx\n\t" "testl $0x200000, %%ecx\n\t" "jz NotSupported1\n\t" /* Nothing supported */ /* Get standard CPUID information, and go to a specific vendor section */ "movl $0, %%eax\n\t" "cpuid\n\t" /* Check for Intel */ "cmpl $0x756e6547, %%ebx\n\t" "jne TryAMD\n\t" "cmpl $0x49656e69, %%edx\n\t" "jne TryAMD\n\t" "cmpl $0x6c65746e, %%ecx\n" "jne TryAMD\n\t" "jmp Intel\n\t" /* Check for AMD */ "\nTryAMD:\n\t" "cmpl $0x68747541, %%ebx\n\t" "jne TryCyrix\n\t" "cmpl $0x69746e65, %%edx\n\t" "jne TryCyrix\n\t" "cmpl $0x444d4163, %%ecx\n" "jne TryCyrix\n\t" "jmp AMD\n\t" /* Check for Cyrix */ "\nTryCyrix:\n\t" "cmpl $0x69727943, %%ebx\n\t" "jne NotSupported2\n\t" "cmpl $0x736e4978, %%edx\n\t" "jne NotSupported3\n\t" "cmpl $0x64616574, %%ecx\n\t" "jne NotSupported4\n\t" /* Drop through to Cyrix... */ /* Cyrix Section */ /* See if extended CPUID is supported */ "movl $0x80000000, %%eax\n\t" "cpuid\n\t" "cmpl $0x80000000, %%eax\n\t" "jl MMXtest\n\t" /* Try standard CPUID instead */ /* Extended CPUID supported, so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%eax\n\t" /* Test for MMX */ "jz NotSupported5\n\t" /* MMX not supported */ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ "jnz EMMXSupported\n\t" "movl $1, %0\n\n\t" /* MMX Supported */ "jmp Return\n\n" "EMMXSupported:\n\t" "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ "jmp Return\n\t" /* AMD Section */ "AMD:\n\t" /* See if extended CPUID is supported */ "movl $0x80000000, %%eax\n\t" "cpuid\n\t" "cmpl $0x80000000, %%eax\n\t" "jl MMXtest\n\t" /* Try standard CPUID instead */ /* Extended CPUID supported, so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported6\n\t" /* MMX not supported */ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ "jnz ThreeDNowSupported\n\t" "movl $1, %0\n\n\t" /* MMX Supported */ "jmp Return\n\n" "ThreeDNowSupported:\n\t" "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ "jmp Return\n\t" /* Intel Section */ "Intel:\n\t" /* Check for MMX */ "MMXtest:\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported7\n\t" /* MMX Not supported */ "movl $1, %0\n\n\t" /* MMX Supported */ "jmp Return\n\t" /* Nothing supported */ "\nNotSupported1:\n\t" "#movl $101, %0\n\n\t" "\nNotSupported2:\n\t" "#movl $102, %0\n\n\t" "\nNotSupported3:\n\t" "#movl $103, %0\n\n\t" "\nNotSupported4:\n\t" "#movl $104, %0\n\n\t" "\nNotSupported5:\n\t" "#movl $105, %0\n\n\t" "\nNotSupported6:\n\t" "#movl $106, %0\n\n\t" "\nNotSupported7:\n\t" "#movl $107, %0\n\n\t" "movl $0, %0\n\n\t" "Return:\n\t" : "=a" (rval) : /* no input */ : "eax", "ebx", "ecx", "edx" ); /* Return */ return(rval); } /* Function to test if mmx instructions are supported... */ static inline int mmx_ok(void) { /* Returns 1 if MMX instructions are supported, 0 otherwise */ return ( mm_support() & 0x1 ); } /* Helper functions for the instruction macros that follow... (note that memory-to-register, m2r, instructions are nearly as efficient as register-to-register, r2r, instructions; however, memory-to-memory instructions are really simulated as a convenience, and are only 1/3 as efficient) */ #ifdef MMX_TRACE /* Include the stuff for printing a trace to stderr... */ #include #define mmx_i2r(op, imm, reg) \ { \ mmx_t mmx_trace; \ mmx_trace = (imm); \ fprintf(stderr, #op "_i2r(" #imm "=0x%016llx, ", mmx_trace.q); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%016llx) => ", mmx_trace.q); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%016llx\n", mmx_trace.q); \ } #define mmx_m2r(op, mem, reg) \ { \ mmx_t mmx_trace; \ mmx_trace = (mem); \ fprintf(stderr, #op "_m2r(" #mem "=0x%016llx, ", mmx_trace.q); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%016llx) => ", mmx_trace.q); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (mem)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%016llx\n", mmx_trace.q); \ } #define mmx_r2m(op, reg, mem) \ { \ mmx_t mmx_trace; \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #op "_r2m(" #reg "=0x%016llx, ", mmx_trace.q); \ mmx_trace = (mem); \ fprintf(stderr, #mem "=0x%016llx) => ", mmx_trace.q); \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=X" (mem) \ : /* nothing */ ); \ mmx_trace = (mem); \ fprintf(stderr, #mem "=0x%016llx\n", mmx_trace.q); \ } #define mmx_r2r(op, regs, regd) \ { \ mmx_t mmx_trace; \ __asm__ __volatile__ ("movq %%" #regs ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #op "_r2r(" #regs "=0x%016llx, ", mmx_trace.q); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #regd "=0x%016llx) => ", mmx_trace.q); \ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #regd "=0x%016llx\n", mmx_trace.q); \ } #define mmx_m2m(op, mems, memd) \ { \ mmx_t mmx_trace; \ mmx_trace = (mems); \ fprintf(stderr, #op "_m2m(" #mems "=0x%016llx, ", mmx_trace.q); \ mmx_trace = (memd); \ fprintf(stderr, #memd "=0x%016llx) => ", mmx_trace.q); \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (memd) \ : "X" (mems)); \ mmx_trace = (memd); \ fprintf(stderr, #memd "=0x%016llx\n", mmx_trace.q); \ } #else /* These macros are a lot simpler without the tracing... */ #define mmx_i2r(op, imm, reg) \ __asm__ __volatile__ (#op " $" #imm ", %%" #reg \ : /* nothing */ \ : /* nothing */); #define mmx_m2r(op, mem, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "m" (mem)) #define mmx_r2m(op, reg, mem) \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=m" (mem) \ : /* nothing */ ) #define mmx_r2r(op, regs, regd) \ __asm__ __volatile__ (#op " %" #regs ", %" #regd) #define mmx_m2m(op, mems, memd) \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=m" (memd) \ : "m" (mems)) #endif /* 1x64 MOVe Quadword (this is both a load and a store... in fact, it is the only way to store) */ #define movq_m2r(var, reg) mmx_m2r(movq, var, reg) #define movq_r2m(reg, var) mmx_r2m(movq, reg, var) #define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) #define movq(vars, vard) \ __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 1x32 MOVe Doubleword (like movq, this is both load and store... but is most useful for moving things between mmx registers and ordinary registers) */ #define movd_m2r(var, reg) mmx_m2r(movd, var, reg) #define movd_r2m(reg, var) mmx_r2m(movd, reg, var) #define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) #define movd(vars, vard) \ __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ "movd %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 2x32, 4x16, and 8x8 Parallel ADDs */ #define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) #define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) #define paddd(vars, vard) mmx_m2m(paddd, vars, vard) #define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) #define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) #define paddw(vars, vard) mmx_m2m(paddw, vars, vard) #define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) #define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) #define paddb(vars, vard) mmx_m2m(paddb, vars, vard) /* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic */ #define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) #define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) #define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) #define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) #define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) #define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) /* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic */ #define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) #define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) #define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) #define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) #define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) #define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) /* 2x32, 4x16, and 8x8 Parallel SUBs */ #define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) #define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) #define psubd(vars, vard) mmx_m2m(psubd, vars, vard) #define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) #define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) #define psubw(vars, vard) mmx_m2m(psubw, vars, vard) #define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) #define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) #define psubb(vars, vard) mmx_m2m(psubb, vars, vard) /* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic */ #define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) #define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) #define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) #define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) #define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) #define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) /* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic */ #define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) #define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) #define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) #define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) #define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) #define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) /* 4x16 Parallel MULs giving Low 4x16 portions of results */ #define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) #define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) #define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) /* 4x16 Parallel MULs giving High 4x16 portions of results */ #define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) #define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) #define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) /* 4x16->2x32 Parallel Mul-ADD (muls like pmullw, then adds adjacent 16-bit fields in the multiply result to make the final 2x32 result) */ #define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) #define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) #define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) /* 1x64 bitwise AND */ #ifdef BROKEN_PAND #define pand_m2r(var, reg) \ { \ mmx_m2r(pandn, (mmx_t) -1LL, reg); \ mmx_m2r(pandn, var, reg); \ } #define pand_r2r(regs, regd) \ { \ mmx_m2r(pandn, (mmx_t) -1LL, regd); \ mmx_r2r(pandn, regs, regd); \ } #define pand(vars, vard) \ { \ movq_m2r(vard, mm0); \ mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ mmx_m2r(pandn, vars, mm0); \ movq_r2m(mm0, vard); \ } #else #define pand_m2r(var, reg) mmx_m2r(pand, var, reg) #define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) #define pand(vars, vard) mmx_m2m(pand, vars, vard) #endif /* 1x64 bitwise AND with Not the destination */ #define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) #define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) #define pandn(vars, vard) mmx_m2m(pandn, vars, vard) /* 1x64 bitwise OR */ #define por_m2r(var, reg) mmx_m2r(por, var, reg) #define por_r2r(regs, regd) mmx_r2r(por, regs, regd) #define por(vars, vard) mmx_m2m(por, vars, vard) /* 1x64 bitwise eXclusive OR */ #define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) #define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) #define pxor(vars, vard) mmx_m2m(pxor, vars, vard) /* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality (resulting fields are either 0 or -1) */ #define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) #define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) #define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) #define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) #define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) #define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) #define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) #define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) #define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) /* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than (resulting fields are either 0 or -1) */ #define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) #define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) #define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) #define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) #define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) #define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) #define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) #define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) #define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) /* 1x64, 2x32, and 4x16 Parallel Shift Left Logical */ #define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) #define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) #define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) #define psllq(vars, vard) mmx_m2m(psllq, vars, vard) #define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) #define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) #define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) #define pslld(vars, vard) mmx_m2m(pslld, vars, vard) #define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) #define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) #define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) #define psllw(vars, vard) mmx_m2m(psllw, vars, vard) /* 1x64, 2x32, and 4x16 Parallel Shift Right Logical */ #define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) #define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) #define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) #define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) #define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) #define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) #define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) #define psrld(vars, vard) mmx_m2m(psrld, vars, vard) #define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) #define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) #define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) #define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) /* 2x32 and 4x16 Parallel Shift Right Arithmetic */ #define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) #define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) #define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) #define psrad(vars, vard) mmx_m2m(psrad, vars, vard) #define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) #define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) #define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) #define psraw(vars, vard) mmx_m2m(psraw, vars, vard) /* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate (packs source and dest fields into dest in that order) */ #define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) #define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) #define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) #define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) #define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) #define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) /* 4x16->8x8 PACK and Unsigned Saturate (packs source and dest fields into dest in that order) */ #define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) #define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) #define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) /* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low (interleaves low half of dest with low half of source as padding in each result field) */ #define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) #define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) #define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) #define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) #define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) #define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) #define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) #define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) #define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) /* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High (interleaves high half of dest with high half of source as padding in each result field) */ #define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) #define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) #define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) #define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) #define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) #define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) #define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) #define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) #define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) /* Empty MMx State (used to clean-up when going from mmx to float use of the registers that are shared by both; note that there is no float-to-mmx operation needed, because only the float tag word info is corruptible) */ #ifdef MMX_TRACE #define emms() \ { \ fprintf(stderr, "emms()\n"); \ __asm__ __volatile__ ("emms"); \ } #else #define emms() __asm__ __volatile__ ("emms") #endif #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/linear.c0000644000175000017500000001236711671175353020023 00000000000000/* * Copyright (C) 2002 Billy Biggs . * Copyright (C) 2008,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #ifdef HAVE_ORC #include #endif #include "tvtime.h" #define GST_TYPE_DEINTERLACE_METHOD_LINEAR (gst_deinterlace_method_linear_get_type ()) #define GST_IS_DEINTERLACE_METHOD_LINEAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR)) #define GST_IS_DEINTERLACE_METHOD_LINEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR)) #define GST_DEINTERLACE_METHOD_LINEAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR, GstDeinterlaceMethodLinearClass)) #define GST_DEINTERLACE_METHOD_LINEAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR, GstDeinterlaceMethodLinear)) #define GST_DEINTERLACE_METHOD_LINEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR, GstDeinterlaceMethodLinearClass)) #define GST_DEINTERLACE_METHOD_LINEAR_CAST(obj) ((GstDeinterlaceMethodLinear*)(obj)) GType gst_deinterlace_method_linear_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodLinear; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodLinearClass; static void deinterlace_scanline_linear_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const guint8 * s1, const guint8 * s2, gint size) { deinterlace_line_linear (out, s1, s2, size); } static void deinterlace_scanline_linear_packed_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, self->parent.row_stride[0]); } static void deinterlace_scanline_linear_planar_y_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, self->parent.row_stride[0]); } static void deinterlace_scanline_linear_planar_u_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, self->parent.row_stride[1]); } static void deinterlace_scanline_linear_planar_v_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodLinear, gst_deinterlace_method_linear, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_linear_class_init (GstDeinterlaceMethodLinearClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; dim_class->fields_required = 1; dim_class->name = "Television: Full resolution"; dim_class->nick = "linear"; dim_class->latency = 0; dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_yvyu = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_uyvy = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_ayuv = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_argb = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_abgr = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_rgba = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_bgra = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_rgb = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_bgr = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_nv12 = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_nv21 = deinterlace_scanline_linear_packed_c; dism_class->interpolate_scanline_planar_y = deinterlace_scanline_linear_planar_y_c; dism_class->interpolate_scanline_planar_u = deinterlace_scanline_linear_planar_u_c; dism_class->interpolate_scanline_planar_v = deinterlace_scanline_linear_planar_v_c; } static void gst_deinterlace_method_linear_init (GstDeinterlaceMethodLinear * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/x86-64_macros.inc0000644000175000017500000000364011671175353021312 00000000000000/* * * GStreamer * Copyright (C) 2004 Dirk Ziegelmeier * * 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. */ /* * * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ /* * This file is copied from TVTIME's sources. * Original author: Achim Schneider */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef XAX #if defined (HAVE_CPU_I386) && !defined(HAVE_CPU_X86_64) #define XAX "eax" #define XBX "ebx" #define XCX "ecx" #define XDX "edx" #define XSI "esi" #define XDI "edi" #define XSP "esp" #define MOVX "movl" #define LEAX "leal" #define DECX "decl" #define PUSHX "pushl" #define POPX "popl" #define CMPX "cmpl" #define ADDX "addl" #define SHLX "shll" #define SHRX "shrl" #define SUBX "subl" #elif defined (HAVE_CPU_X86_64) #define XAX "rax" #define XBX "rbx" #define XCX "rcx" #define XDX "rdx" #define XSI "rsi" #define XDI "rdi" #define XSP "rsp" #define MOVX "movq" #define LEAX "leaq" #define DECX "decq" #define PUSHX "pushq" #define POPX "popq" #define CMPX "cmpq" #define ADDX "addq" #define SHLX "shlq" #define SHRX "shrq" #define SUBX "subq" #else #error Undefined architecture. Define either ARCH_X86 or ARCH_X86_64. #endif #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/greedyh.c0000644000175000017500000007015011707374600020166 00000000000000/* * * GStreamer * Copyright (C) 2004 Billy Biggs * Copyright (C) 2008,2010 Sebastian Dröge * * 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "greedyhmacros.h" #include #include #include #include "plugins.h" #include "gstdeinterlacemethod.h" #ifdef HAVE_ORC #include #endif #define GST_TYPE_DEINTERLACE_METHOD_GREEDY_H (gst_deinterlace_method_greedy_h_get_type ()) #define GST_IS_DEINTERLACE_METHOD_GREEDY_H(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H)) #define GST_IS_DEINTERLACE_METHOD_GREEDY_H_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H)) #define GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H, GstDeinterlaceMethodGreedyHClass)) #define GST_DEINTERLACE_METHOD_GREEDY_H(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H, GstDeinterlaceMethodGreedyH)) #define GST_DEINTERLACE_METHOD_GREEDY_H_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_H, GstDeinterlaceMethodGreedyHClass)) #define GST_DEINTERLACE_METHOD_GREEDY_H_CAST(obj) ((GstDeinterlaceMethodGreedyH*)(obj)) typedef struct { GstDeinterlaceMethod parent; guint max_comb, motion_threshold, motion_sense; } GstDeinterlaceMethodGreedyH; typedef void (*ScanlineFunction) (GstDeinterlaceMethodGreedyH * self, const guint8 * L2, const guint8 * L1, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width); typedef struct { GstDeinterlaceMethodClass parent_class; ScanlineFunction scanline_yuy2; /* This is for YVYU too */ ScanlineFunction scanline_uyvy; ScanlineFunction scanline_ayuv; ScanlineFunction scanline_planar_y; ScanlineFunction scanline_planar_uv; } GstDeinterlaceMethodGreedyHClass; static void greedyh_scanline_C_ayuv (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { gint Pos, Comp; guint8 l1, l1_1, l3, l3_1; guint8 avg, avg_1; guint8 avg__1[4] = { 0, }; guint8 avg_s; guint8 avg_sc; guint8 best; guint16 mov; guint8 out; guint8 l2, lp2; guint8 l2_diff, lp2_diff; guint8 min, max; guint max_comb = self->max_comb; guint motion_sense = self->motion_sense; guint motion_threshold = self->motion_threshold; width /= 4; for (Pos = 0; Pos < width; Pos++) { for (Comp = 0; Comp < 4; Comp++) { l1 = L1[0]; l3 = L3[0]; if (Pos == width - 1) { l1_1 = l1; l3_1 = l3; } else { l1_1 = L1[4]; l3_1 = L3[4]; } /* Average of L1 and L3 */ avg = (l1 + l3) / 2; if (Pos == 0) { avg__1[Comp] = avg; } /* Average of next L1 and next L3 */ avg_1 = (l1_1 + l3_1) / 2; /* Calculate average of one pixel forward and previous */ avg_s = (avg__1[Comp] + avg_1) / 2; /* Calculate average of center and surrounding pixels */ avg_sc = (avg + avg_s) / 2; /* move forward */ avg__1[Comp] = avg; /* Get best L2/L2P, i.e. least diff from above average */ l2 = L2[0]; lp2 = L2P[0]; l2_diff = ABS (l2 - avg_sc); lp2_diff = ABS (lp2 - avg_sc); if (l2_diff > lp2_diff) best = lp2; else best = l2; /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ max = MAX (l1, l3); min = MIN (l1, l3); if (max < 256 - max_comb) max += max_comb; else max = 255; if (min > max_comb) min -= max_comb; else min = 0; out = CLAMP (best, min, max); if (Comp < 2) { /* Do motion compensation for luma, i.e. how much * the weave pixel differs */ mov = ABS (l2 - lp2); if (mov > motion_threshold) mov -= motion_threshold; else mov = 0; mov = mov * motion_sense; if (mov > 256) mov = 256; /* Weighted sum on clipped weave pixel and average */ out = (out * (256 - mov) + avg_sc * mov) / 256; } Dest[0] = out; Dest += 1; L1 += 1; L2 += 1; L3 += 1; L2P += 1; } } } static void greedyh_scanline_C_yuy2 (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { gint Pos; guint8 l1_l, l1_1_l, l3_l, l3_1_l; guint8 l1_c, l1_1_c, l3_c, l3_1_c; guint8 avg_l, avg_c, avg_l_1, avg_c_1; guint8 avg_l__1 = 0, avg_c__1 = 0; guint8 avg_s_l, avg_s_c; guint8 avg_sc_l, avg_sc_c; guint8 best_l, best_c; guint16 mov_l; guint8 out_l, out_c; guint8 l2_l, l2_c, lp2_l, lp2_c; guint8 l2_l_diff, l2_c_diff, lp2_l_diff, lp2_c_diff; guint8 min_l, min_c, max_l, max_c; guint max_comb = self->max_comb; guint motion_sense = self->motion_sense; guint motion_threshold = self->motion_threshold; width /= 2; for (Pos = 0; Pos < width; Pos++) { l1_l = L1[0]; l1_c = L1[1]; l3_l = L3[0]; l3_c = L3[1]; if (Pos == width - 1) { l1_1_l = l1_l; l1_1_c = l1_c; l3_1_l = l3_l; l3_1_c = l3_c; } else { l1_1_l = L1[2]; l1_1_c = L1[3]; l3_1_l = L3[2]; l3_1_c = L3[3]; } /* Average of L1 and L3 */ avg_l = (l1_l + l3_l) / 2; avg_c = (l1_c + l3_c) / 2; if (Pos == 0) { avg_l__1 = avg_l; avg_c__1 = avg_c; } /* Average of next L1 and next L3 */ avg_l_1 = (l1_1_l + l3_1_l) / 2; avg_c_1 = (l1_1_c + l3_1_c) / 2; /* Calculate average of one pixel forward and previous */ avg_s_l = (avg_l__1 + avg_l_1) / 2; avg_s_c = (avg_c__1 + avg_c_1) / 2; /* Calculate average of center and surrounding pixels */ avg_sc_l = (avg_l + avg_s_l) / 2; avg_sc_c = (avg_c + avg_s_c) / 2; /* move forward */ avg_l__1 = avg_l; avg_c__1 = avg_c; /* Get best L2/L2P, i.e. least diff from above average */ l2_l = L2[0]; l2_c = L2[1]; lp2_l = L2P[0]; lp2_c = L2P[1]; l2_l_diff = ABS (l2_l - avg_sc_l); l2_c_diff = ABS (l2_c - avg_sc_c); lp2_l_diff = ABS (lp2_l - avg_sc_l); lp2_c_diff = ABS (lp2_c - avg_sc_c); if (l2_l_diff > lp2_l_diff) best_l = lp2_l; else best_l = l2_l; if (l2_c_diff > lp2_c_diff) best_c = lp2_c; else best_c = l2_c; /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ max_l = MAX (l1_l, l3_l); min_l = MIN (l1_l, l3_l); if (max_l < 256 - max_comb) max_l += max_comb; else max_l = 255; if (min_l > max_comb) min_l -= max_comb; else min_l = 0; max_c = MAX (l1_c, l3_c); min_c = MIN (l1_c, l3_c); if (max_c < 256 - max_comb) max_c += max_comb; else max_c = 255; if (min_c > max_comb) min_c -= max_comb; else min_c = 0; out_l = CLAMP (best_l, min_l, max_l); out_c = CLAMP (best_c, min_c, max_c); /* Do motion compensation for luma, i.e. how much * the weave pixel differs */ mov_l = ABS (l2_l - lp2_l); if (mov_l > motion_threshold) mov_l -= motion_threshold; else mov_l = 0; mov_l = mov_l * motion_sense; if (mov_l > 256) mov_l = 256; /* Weighted sum on clipped weave pixel and average */ out_l = (out_l * (256 - mov_l) + avg_sc_l * mov_l) / 256; Dest[0] = out_l; Dest[1] = out_c; Dest += 2; L1 += 2; L2 += 2; L3 += 2; L2P += 2; } } static void greedyh_scanline_C_uyvy (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { gint Pos; guint8 l1_l, l1_1_l, l3_l, l3_1_l; guint8 l1_c, l1_1_c, l3_c, l3_1_c; guint8 avg_l, avg_c, avg_l_1, avg_c_1; guint8 avg_l__1 = 0, avg_c__1 = 0; guint8 avg_s_l, avg_s_c; guint8 avg_sc_l, avg_sc_c; guint8 best_l, best_c; guint16 mov_l; guint8 out_l, out_c; guint8 l2_l, l2_c, lp2_l, lp2_c; guint8 l2_l_diff, l2_c_diff, lp2_l_diff, lp2_c_diff; guint8 min_l, min_c, max_l, max_c; guint max_comb = self->max_comb; guint motion_sense = self->motion_sense; guint motion_threshold = self->motion_threshold; width /= 2; for (Pos = 0; Pos < width; Pos++) { l1_l = L1[1]; l1_c = L1[0]; l3_l = L3[1]; l3_c = L3[0]; if (Pos == width - 1) { l1_1_l = l1_l; l1_1_c = l1_c; l3_1_l = l3_l; l3_1_c = l3_c; } else { l1_1_l = L1[3]; l1_1_c = L1[2]; l3_1_l = L3[3]; l3_1_c = L3[2]; } /* Average of L1 and L3 */ avg_l = (l1_l + l3_l) / 2; avg_c = (l1_c + l3_c) / 2; if (Pos == 0) { avg_l__1 = avg_l; avg_c__1 = avg_c; } /* Average of next L1 and next L3 */ avg_l_1 = (l1_1_l + l3_1_l) / 2; avg_c_1 = (l1_1_c + l3_1_c) / 2; /* Calculate average of one pixel forward and previous */ avg_s_l = (avg_l__1 + avg_l_1) / 2; avg_s_c = (avg_c__1 + avg_c_1) / 2; /* Calculate average of center and surrounding pixels */ avg_sc_l = (avg_l + avg_s_l) / 2; avg_sc_c = (avg_c + avg_s_c) / 2; /* move forward */ avg_l__1 = avg_l; avg_c__1 = avg_c; /* Get best L2/L2P, i.e. least diff from above average */ l2_l = L2[1]; l2_c = L2[0]; lp2_l = L2P[1]; lp2_c = L2P[0]; l2_l_diff = ABS (l2_l - avg_sc_l); l2_c_diff = ABS (l2_c - avg_sc_c); lp2_l_diff = ABS (lp2_l - avg_sc_l); lp2_c_diff = ABS (lp2_c - avg_sc_c); if (l2_l_diff > lp2_l_diff) best_l = lp2_l; else best_l = l2_l; if (l2_c_diff > lp2_c_diff) best_c = lp2_c; else best_c = l2_c; /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ max_l = MAX (l1_l, l3_l); min_l = MIN (l1_l, l3_l); if (max_l < 256 - max_comb) max_l += max_comb; else max_l = 255; if (min_l > max_comb) min_l -= max_comb; else min_l = 0; max_c = MAX (l1_c, l3_c); min_c = MIN (l1_c, l3_c); if (max_c < 256 - max_comb) max_c += max_comb; else max_c = 255; if (min_c > max_comb) min_c -= max_comb; else min_c = 0; out_l = CLAMP (best_l, min_l, max_l); out_c = CLAMP (best_c, min_c, max_c); /* Do motion compensation for luma, i.e. how much * the weave pixel differs */ mov_l = ABS (l2_l - lp2_l); if (mov_l > motion_threshold) mov_l -= motion_threshold; else mov_l = 0; mov_l = mov_l * motion_sense; if (mov_l > 256) mov_l = 256; /* Weighted sum on clipped weave pixel and average */ out_l = (out_l * (256 - mov_l) + avg_sc_l * mov_l) / 256; Dest[1] = out_l; Dest[0] = out_c; Dest += 2; L1 += 2; L2 += 2; L3 += 2; L2P += 2; } } static void greedyh_scanline_C_planar_y (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { gint Pos; guint8 l1, l1_1, l3, l3_1; guint8 avg, avg_1; guint8 avg__1 = 0; guint8 avg_s; guint8 avg_sc; guint8 best; guint16 mov; guint8 out; guint8 l2, lp2; guint8 l2_diff, lp2_diff; guint8 min, max; guint max_comb = self->max_comb; guint motion_sense = self->motion_sense; guint motion_threshold = self->motion_threshold; for (Pos = 0; Pos < width; Pos++) { l1 = L1[0]; l3 = L3[0]; if (Pos == width - 1) { l1_1 = l1; l3_1 = l3; } else { l1_1 = L1[1]; l3_1 = L3[1]; } /* Average of L1 and L3 */ avg = (l1 + l3) / 2; if (Pos == 0) { avg__1 = avg; } /* Average of next L1 and next L3 */ avg_1 = (l1_1 + l3_1) / 2; /* Calculate average of one pixel forward and previous */ avg_s = (avg__1 + avg_1) / 2; /* Calculate average of center and surrounding pixels */ avg_sc = (avg + avg_s) / 2; /* move forward */ avg__1 = avg; /* Get best L2/L2P, i.e. least diff from above average */ l2 = L2[0]; lp2 = L2P[0]; l2_diff = ABS (l2 - avg_sc); lp2_diff = ABS (lp2 - avg_sc); if (l2_diff > lp2_diff) best = lp2; else best = l2; /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ max = MAX (l1, l3); min = MIN (l1, l3); if (max < 256 - max_comb) max += max_comb; else max = 255; if (min > max_comb) min -= max_comb; else min = 0; out = CLAMP (best, min, max); /* Do motion compensation for luma, i.e. how much * the weave pixel differs */ mov = ABS (l2 - lp2); if (mov > motion_threshold) mov -= motion_threshold; else mov = 0; mov = mov * motion_sense; if (mov > 256) mov = 256; /* Weighted sum on clipped weave pixel and average */ out = (out * (256 - mov) + avg_sc * mov) / 256; Dest[0] = out; Dest += 1; L1 += 1; L2 += 1; L3 += 1; L2P += 1; } } static void greedyh_scanline_C_planar_uv (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { gint Pos; guint8 l1, l1_1, l3, l3_1; guint8 avg, avg_1; guint8 avg__1 = 0; guint8 avg_s; guint8 avg_sc; guint8 best; guint8 out; guint8 l2, lp2; guint8 l2_diff, lp2_diff; guint8 min, max; guint max_comb = self->max_comb; for (Pos = 0; Pos < width; Pos++) { l1 = L1[0]; l3 = L3[0]; if (Pos == width - 1) { l1_1 = l1; l3_1 = l3; } else { l1_1 = L1[1]; l3_1 = L3[1]; } /* Average of L1 and L3 */ avg = (l1 + l3) / 2; if (Pos == 0) { avg__1 = avg; } /* Average of next L1 and next L3 */ avg_1 = (l1_1 + l3_1) / 2; /* Calculate average of one pixel forward and previous */ avg_s = (avg__1 + avg_1) / 2; /* Calculate average of center and surrounding pixels */ avg_sc = (avg + avg_s) / 2; /* move forward */ avg__1 = avg; /* Get best L2/L2P, i.e. least diff from above average */ l2 = L2[0]; lp2 = L2P[0]; l2_diff = ABS (l2 - avg_sc); lp2_diff = ABS (lp2 - avg_sc); if (l2_diff > lp2_diff) best = lp2; else best = l2; /* Clip this best L2/L2P by L1/L3 and allow to differ by GreedyMaxComb */ max = MAX (l1, l3); min = MIN (l1, l3); if (max < 256 - max_comb) max += max_comb; else max = 255; if (min > max_comb) min -= max_comb; else min = 0; out = CLAMP (best, min, max); Dest[0] = out; Dest += 1; L1 += 1; L2 += 1; L3 += 1; L2P += 1; } } #ifdef BUILD_X86_ASM #define IS_MMXEXT #define SIMD_TYPE MMXEXT #define C_FUNCT_YUY2 greedyh_scanline_C_yuy2 #define C_FUNCT_UYVY greedyh_scanline_C_uyvy #define C_FUNCT_PLANAR_Y greedyh_scanline_C_planar_y #define C_FUNCT_PLANAR_UV greedyh_scanline_C_planar_uv #define FUNCT_NAME_YUY2 greedyh_scanline_MMXEXT_yuy2 #define FUNCT_NAME_UYVY greedyh_scanline_MMXEXT_uyvy #define FUNCT_NAME_PLANAR_Y greedyh_scanline_MMXEXT_planar_y #define FUNCT_NAME_PLANAR_UV greedyh_scanline_MMXEXT_planar_uv #include "greedyh.asm" #undef SIMD_TYPE #undef IS_MMXEXT #undef FUNCT_NAME_YUY2 #undef FUNCT_NAME_UYVY #undef FUNCT_NAME_PLANAR_Y #undef FUNCT_NAME_PLANAR_UV #define IS_3DNOW #define SIMD_TYPE 3DNOW #define FUNCT_NAME_YUY2 greedyh_scanline_3DNOW_yuy2 #define FUNCT_NAME_UYVY greedyh_scanline_3DNOW_uyvy #define FUNCT_NAME_PLANAR_Y greedyh_scanline_3DNOW_planar_y #define FUNCT_NAME_PLANAR_UV greedyh_scanline_3DNOW_planar_uv #include "greedyh.asm" #undef SIMD_TYPE #undef IS_3DNOW #undef FUNCT_NAME_YUY2 #undef FUNCT_NAME_UYVY #undef FUNCT_NAME_PLANAR_Y #undef FUNCT_NAME_PLANAR_UV #define IS_MMX #define SIMD_TYPE MMX #define FUNCT_NAME_YUY2 greedyh_scanline_MMX_yuy2 #define FUNCT_NAME_UYVY greedyh_scanline_MMX_uyvy #define FUNCT_NAME_PLANAR_Y greedyh_scanline_MMX_planar_y #define FUNCT_NAME_PLANAR_UV greedyh_scanline_MMX_planar_uv #include "greedyh.asm" #undef SIMD_TYPE #undef IS_MMX #undef FUNCT_NAME_YUY2 #undef FUNCT_NAME_UYVY #undef FUNCT_NAME_PLANAR_Y #undef FUNCT_NAME_PLANAR_UV #undef C_FUNCT_YUY2 #undef C_FUNCT_PLANAR_Y #undef C_FUNCT_PLANAR_UV #endif static void deinterlace_frame_di_greedyh_packed (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, int cur_field_idx) { GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (method); GstDeinterlaceMethodGreedyHClass *klass = GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS (self); gint InfoIsOdd = 0; gint Line; gint RowStride = method->row_stride[0]; gint FieldHeight = method->frame_height / 2; gint Pitch = method->row_stride[0] * 2; const guint8 *L1; // ptr to Line1, of 3 const guint8 *L2; // ptr to Line2, the weave line const guint8 *L3; // ptr to Line3 const guint8 *L2P; // ptr to prev Line2 guint8 *Dest = GST_BUFFER_DATA (outbuf); ScanlineFunction scanline; if (cur_field_idx + 2 > history_count || cur_field_idx < 1) { GstDeinterlaceMethod *backup_method; backup_method = g_object_new (gst_deinterlace_method_linear_get_type (), NULL); gst_deinterlace_method_setup (backup_method, method->format, method->frame_width, method->frame_height); gst_deinterlace_method_deinterlace_frame (backup_method, history, history_count, outbuf, cur_field_idx); g_object_unref (backup_method); return; } cur_field_idx += 2; switch (method->format) { case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: scanline = klass->scanline_yuy2; break; case GST_VIDEO_FORMAT_UYVY: scanline = klass->scanline_uyvy; break; case GST_VIDEO_FORMAT_AYUV: scanline = klass->scanline_ayuv; break; default: g_assert_not_reached (); return; } // copy first even line no matter what, and the first odd line if we're // processing an EVEN field. (note diff from other deint rtns.) if (history[cur_field_idx - 1].flags == PICTURE_INTERLACED_BOTTOM) { InfoIsOdd = 1; L1 = GST_BUFFER_DATA (history[cur_field_idx - 2].buf); if (history[cur_field_idx - 2].flags & PICTURE_INTERLACED_BOTTOM) L1 += RowStride; L2 = GST_BUFFER_DATA (history[cur_field_idx - 1].buf); if (history[cur_field_idx - 1].flags & PICTURE_INTERLACED_BOTTOM) L2 += RowStride; L3 = L1 + Pitch; L2P = GST_BUFFER_DATA (history[cur_field_idx - 3].buf); if (history[cur_field_idx - 3].flags & PICTURE_INTERLACED_BOTTOM) L2P += RowStride; // copy first even line memcpy (Dest, L1, RowStride); Dest += RowStride; } else { InfoIsOdd = 0; L1 = GST_BUFFER_DATA (history[cur_field_idx - 2].buf); if (history[cur_field_idx - 2].flags & PICTURE_INTERLACED_BOTTOM) L1 += RowStride; L2 = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + Pitch; if (history[cur_field_idx - 1].flags & PICTURE_INTERLACED_BOTTOM) L2 += RowStride; L3 = L1 + Pitch; L2P = GST_BUFFER_DATA (history[cur_field_idx - 3].buf) + Pitch; if (history[cur_field_idx - 3].flags & PICTURE_INTERLACED_BOTTOM) L2P += RowStride; // copy first even line memcpy (Dest, L1, RowStride); Dest += RowStride; // then first odd line memcpy (Dest, L1, RowStride); Dest += RowStride; } for (Line = 0; Line < (FieldHeight - 1); ++Line) { scanline (self, L1, L2, L3, L2P, Dest, RowStride); Dest += RowStride; memcpy (Dest, L3, RowStride); Dest += RowStride; L1 += Pitch; L2 += Pitch; L3 += Pitch; L2P += Pitch; } if (InfoIsOdd) { memcpy (Dest, L2, RowStride); } } static void deinterlace_frame_di_greedyh_planar_plane (GstDeinterlaceMethodGreedyH * self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint RowStride, gint FieldHeight, gint Pitch, gint InfoIsOdd, ScanlineFunction scanline) { gint Line; // copy first even line no matter what, and the first odd line if we're // processing an EVEN field. (note diff from other deint rtns.) if (InfoIsOdd) { // copy first even line memcpy (Dest, L1, RowStride); Dest += RowStride; } else { // copy first even line memcpy (Dest, L1, RowStride); Dest += RowStride; // then first odd line memcpy (Dest, L1, RowStride); Dest += RowStride; } for (Line = 0; Line < (FieldHeight - 1); ++Line) { scanline (self, L1, L2, L3, L2P, Dest, RowStride); Dest += RowStride; memcpy (Dest, L3, RowStride); Dest += RowStride; L1 += Pitch; L2 += Pitch; L3 += Pitch; L2P += Pitch; } if (InfoIsOdd) { memcpy (Dest, L2, RowStride); } } static void deinterlace_frame_di_greedyh_planar (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, int cur_field_idx) { GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (method); GstDeinterlaceMethodGreedyHClass *klass = GST_DEINTERLACE_METHOD_GREEDY_H_GET_CLASS (self); gint InfoIsOdd; gint RowStride; gint FieldHeight; gint Pitch; const guint8 *L1; // ptr to Line1, of 3 const guint8 *L2; // ptr to Line2, the weave line const guint8 *L3; // ptr to Line3 const guint8 *L2P; // ptr to prev Line2 guint8 *Dest; gint i; gint Offset; ScanlineFunction scanline; if (cur_field_idx + 2 > history_count || cur_field_idx < 1) { GstDeinterlaceMethod *backup_method; backup_method = g_object_new (gst_deinterlace_method_linear_get_type (), NULL); gst_deinterlace_method_setup (backup_method, method->format, method->frame_width, method->frame_height); gst_deinterlace_method_deinterlace_frame (backup_method, history, history_count, outbuf, cur_field_idx); g_object_unref (backup_method); return; } cur_field_idx += 2; for (i = 0; i < 3; i++) { Offset = method->offset[i]; InfoIsOdd = (history[cur_field_idx - 1].flags == PICTURE_INTERLACED_BOTTOM); RowStride = method->row_stride[i]; FieldHeight = method->height[i] / 2; Pitch = method->row_stride[i] * 2; if (i == 0) scanline = klass->scanline_planar_y; else scanline = klass->scanline_planar_uv; Dest = GST_BUFFER_DATA (outbuf) + Offset; L1 = GST_BUFFER_DATA (history[cur_field_idx - 2].buf) + Offset; if (history[cur_field_idx - 2].flags & PICTURE_INTERLACED_BOTTOM) L1 += RowStride; L2 = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + Offset; if (history[cur_field_idx - 1].flags & PICTURE_INTERLACED_BOTTOM) L2 += RowStride; L3 = L1 + Pitch; L2P = GST_BUFFER_DATA (history[cur_field_idx - 3].buf) + Offset; if (history[cur_field_idx - 3].flags & PICTURE_INTERLACED_BOTTOM) L2P += RowStride; deinterlace_frame_di_greedyh_planar_plane (self, L1, L2, L3, L2P, Dest, RowStride, FieldHeight, Pitch, InfoIsOdd, scanline); } } G_DEFINE_TYPE (GstDeinterlaceMethodGreedyH, gst_deinterlace_method_greedy_h, GST_TYPE_DEINTERLACE_METHOD); enum { PROP_0, PROP_MAX_COMB, PROP_MOTION_THRESHOLD, PROP_MOTION_SENSE }; static void gst_deinterlace_method_greedy_h_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (object); switch (prop_id) { case PROP_MAX_COMB: self->max_comb = g_value_get_uint (value); break; case PROP_MOTION_THRESHOLD: self->motion_threshold = g_value_get_uint (value); break; case PROP_MOTION_SENSE: self->motion_sense = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void gst_deinterlace_method_greedy_h_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDeinterlaceMethodGreedyH *self = GST_DEINTERLACE_METHOD_GREEDY_H (object); switch (prop_id) { case PROP_MAX_COMB: g_value_set_uint (value, self->max_comb); break; case PROP_MOTION_THRESHOLD: g_value_set_uint (value, self->motion_threshold); break; case PROP_MOTION_SENSE: g_value_set_uint (value, self->motion_sense); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void gst_deinterlace_method_greedy_h_class_init (GstDeinterlaceMethodGreedyHClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; #ifdef BUILD_X86_ASM guint cpu_flags = orc_target_get_default_flags (orc_target_get_by_name ("mmx")); #endif gobject_class->set_property = gst_deinterlace_method_greedy_h_set_property; gobject_class->get_property = gst_deinterlace_method_greedy_h_get_property; g_object_class_install_property (gobject_class, PROP_MAX_COMB, g_param_spec_uint ("max-comb", "Max comb", "Max Comb", 0, 255, 5, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property (gobject_class, PROP_MOTION_THRESHOLD, g_param_spec_uint ("motion-threshold", "Motion Threshold", "Motion Threshold", 0, 255, 25, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property (gobject_class, PROP_MOTION_SENSE, g_param_spec_uint ("motion-sense", "Motion Sense", "Motion Sense", 0, 255, 30, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); dim_class->fields_required = 4; dim_class->name = "Motion Adaptive: Advanced Detection"; dim_class->nick = "greedyh"; dim_class->latency = 1; dim_class->deinterlace_frame_yuy2 = deinterlace_frame_di_greedyh_packed; dim_class->deinterlace_frame_yvyu = deinterlace_frame_di_greedyh_packed; dim_class->deinterlace_frame_uyvy = deinterlace_frame_di_greedyh_packed; dim_class->deinterlace_frame_ayuv = deinterlace_frame_di_greedyh_packed; dim_class->deinterlace_frame_y444 = deinterlace_frame_di_greedyh_planar; dim_class->deinterlace_frame_i420 = deinterlace_frame_di_greedyh_planar; dim_class->deinterlace_frame_yv12 = deinterlace_frame_di_greedyh_planar; dim_class->deinterlace_frame_y42b = deinterlace_frame_di_greedyh_planar; dim_class->deinterlace_frame_y41b = deinterlace_frame_di_greedyh_planar; #ifdef BUILD_X86_ASM if (cpu_flags & ORC_TARGET_MMX_MMXEXT) { klass->scanline_yuy2 = greedyh_scanline_MMXEXT_yuy2; klass->scanline_uyvy = greedyh_scanline_MMXEXT_uyvy; } else if (cpu_flags & ORC_TARGET_MMX_3DNOW) { klass->scanline_yuy2 = greedyh_scanline_3DNOW_yuy2; klass->scanline_uyvy = greedyh_scanline_3DNOW_uyvy; } else if (cpu_flags & ORC_TARGET_MMX_MMX) { klass->scanline_yuy2 = greedyh_scanline_MMX_yuy2; klass->scanline_uyvy = greedyh_scanline_MMX_uyvy; } else { klass->scanline_yuy2 = greedyh_scanline_C_yuy2; klass->scanline_uyvy = greedyh_scanline_C_uyvy; } #else klass->scanline_yuy2 = greedyh_scanline_C_yuy2; klass->scanline_uyvy = greedyh_scanline_C_uyvy; #endif /* TODO: MMX implementation of these two */ klass->scanline_ayuv = greedyh_scanline_C_ayuv; klass->scanline_planar_y = greedyh_scanline_C_planar_y; klass->scanline_planar_uv = greedyh_scanline_C_planar_uv; } static void gst_deinterlace_method_greedy_h_init (GstDeinterlaceMethodGreedyH * self) { self->max_comb = 5; self->motion_threshold = 25; self->motion_sense = 30; } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/weavebff.c0000644000175000017500000001564111707374600020330 00000000000000/* * Weave frames, bottom-field-first. * Copyright (C) 2003 Billy Biggs . * Copyright (C) 2008,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #define GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF (gst_deinterlace_method_weave_bff_get_type ()) #define GST_IS_DEINTERLACE_METHOD_WEAVE_BFF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF)) #define GST_IS_DEINTERLACE_METHOD_WEAVE_BFF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF)) #define GST_DEINTERLACE_METHOD_WEAVE_BFF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF, GstDeinterlaceMethodWeaveBFFClass)) #define GST_DEINTERLACE_METHOD_WEAVE_BFF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF, GstDeinterlaceMethodWeaveBFF)) #define GST_DEINTERLACE_METHOD_WEAVE_BFF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_BFF, GstDeinterlaceMethodWeaveBFFClass)) #define GST_DEINTERLACE_METHOD_WEAVE_BFF_CAST(obj) ((GstDeinterlaceMethodWeaveBFF*)(obj)) GType gst_deinterlace_method_weave_bff_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodWeaveBFF; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodWeaveBFFClass; static void deinterlace_scanline_weave_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->b0, self->parent.row_stride[0]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } } static void deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->b0, self->parent.row_stride[0]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } } static void deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->b0, self->parent.row_stride[1]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[1]); } } static void deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->b0, self->parent.row_stride[2]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[2]); } } static void copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[1]); } static void copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodWeaveBFF, gst_deinterlace_method_weave_bff, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_weave_bff_class_init (GstDeinterlaceMethodWeaveBFFClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; dim_class->fields_required = 2; dim_class->name = "Progressive: Bottom Field First"; dim_class->nick = "weavebff"; dim_class->latency = 1; dism_class->interpolate_scanline_ayuv = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_nv21 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_bgra = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_rgb = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_bgr = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_planar_y = deinterlace_scanline_weave_planar_y; dism_class->interpolate_scanline_planar_u = deinterlace_scanline_weave_planar_u; dism_class->interpolate_scanline_planar_v = deinterlace_scanline_weave_planar_v; dism_class->copy_scanline_ayuv = copy_scanline_packed; dism_class->copy_scanline_yuy2 = copy_scanline_packed; dism_class->copy_scanline_yvyu = copy_scanline_packed; dism_class->copy_scanline_uyvy = copy_scanline_packed; dism_class->copy_scanline_nv12 = copy_scanline_packed; dism_class->copy_scanline_nv21 = copy_scanline_packed; dism_class->copy_scanline_argb = copy_scanline_packed; dism_class->copy_scanline_abgr = copy_scanline_packed; dism_class->copy_scanline_rgba = copy_scanline_packed; dism_class->copy_scanline_bgra = copy_scanline_packed; dism_class->copy_scanline_rgb = copy_scanline_packed; dism_class->copy_scanline_bgr = copy_scanline_packed; dism_class->copy_scanline_planar_y = copy_scanline_planar_y; dism_class->copy_scanline_planar_u = copy_scanline_planar_u; dism_class->copy_scanline_planar_v = copy_scanline_planar_v; } static void gst_deinterlace_method_weave_bff_init (GstDeinterlaceMethodWeaveBFF * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp.c0000644000175000017500000001516711671175353020747 00000000000000/* * Copyright (C) 2004 Billy Biggs * Copyright (C) 2008,2010 Sebastian Dröge * * 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #ifdef HAVE_ORC #include #endif #include "gstdeinterlacemethod.h" #include "plugins.h" #define GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP (gst_deinterlace_method_tomsmocomp_get_type ()) #define GST_IS_DEINTERLACE_METHOD_TOMSMOCOMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP)) #define GST_IS_DEINTERLACE_METHOD_TOMSMOCOMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP)) #define GST_DEINTERLACE_METHOD_TOMSMOCOMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP, GstDeinterlaceMethodTomsMoCompClass)) #define GST_DEINTERLACE_METHOD_TOMSMOCOMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP, GstDeinterlaceMethodTomsMoComp)) #define GST_DEINTERLACE_METHOD_TOMSMOCOMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_TOMSMOCOMP, GstDeinterlaceMethodTomsMoCompClass)) #define GST_DEINTERLACE_METHOD_TOMSMOCOMP_CAST(obj) ((GstDeinterlaceMethodTomsMoComp*)(obj)) typedef struct { GstDeinterlaceMethod parent; guint search_effort; gboolean strange_bob; } GstDeinterlaceMethodTomsMoComp; typedef GstDeinterlaceMethodClass GstDeinterlaceMethodTomsMoCompClass; static void Fieldcopy (guint8 * dest, const guint8 * src, gint count, gint rows, gint dst_pitch, gint src_pitch) { gint i; for (i = 0; i < rows; i++) { memcpy (dest, src, count); src += src_pitch; dest += dst_pitch; } } #define USE_FOR_DSCALER #define IS_C #define SIMD_TYPE C #define FUNCT_NAME tomsmocompDScaler_C #include "tomsmocomp/TomsMoCompAll.inc" #undef IS_C #undef SIMD_TYPE #undef FUNCT_NAME #ifdef BUILD_X86_ASM #include "tomsmocomp/tomsmocompmacros.h" #include "x86-64_macros.inc" #define IS_MMX #define SIMD_TYPE MMX #define FUNCT_NAME tomsmocompDScaler_MMX #include "tomsmocomp/TomsMoCompAll.inc" #undef IS_MMX #undef SIMD_TYPE #undef FUNCT_NAME #define IS_3DNOW #define SIMD_TYPE 3DNOW #define FUNCT_NAME tomsmocompDScaler_3DNOW #include "tomsmocomp/TomsMoCompAll.inc" #undef IS_3DNOW #undef SIMD_TYPE #undef FUNCT_NAME #define IS_MMXEXT #define SIMD_TYPE MMXEXT #define FUNCT_NAME tomsmocompDScaler_MMXEXT #include "tomsmocomp/TomsMoCompAll.inc" #undef IS_MMXEXT #undef SIMD_TYPE #undef FUNCT_NAME #endif G_DEFINE_TYPE (GstDeinterlaceMethodTomsMoComp, gst_deinterlace_method_tomsmocomp, GST_TYPE_DEINTERLACE_METHOD); enum { PROP_0, PROP_SEARCH_EFFORT, PROP_STRANGE_BOB }; static void gst_deinterlace_method_tomsmocomp_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (object); switch (prop_id) { case PROP_SEARCH_EFFORT: self->search_effort = g_value_get_uint (value); break; case PROP_STRANGE_BOB: self->strange_bob = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void gst_deinterlace_method_tomsmocomp_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (object); switch (prop_id) { case PROP_SEARCH_EFFORT: g_value_set_uint (value, self->search_effort); break; case PROP_STRANGE_BOB: g_value_set_boolean (value, self->strange_bob); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void gst_deinterlace_method_tomsmocomp_class_init (GstDeinterlaceMethodTomsMoCompClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; #ifdef BUILD_X86_ASM guint cpu_flags = orc_target_get_default_flags (orc_target_get_by_name ("mmx")); #endif gobject_class->set_property = gst_deinterlace_method_tomsmocomp_set_property; gobject_class->get_property = gst_deinterlace_method_tomsmocomp_get_property; g_object_class_install_property (gobject_class, PROP_SEARCH_EFFORT, g_param_spec_uint ("search-effort", "Search Effort", "Search Effort", 0, 27, 5, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property (gobject_class, PROP_STRANGE_BOB, g_param_spec_boolean ("strange-bob", "Strange Bob", "Use strange bob", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); dim_class->fields_required = 4; dim_class->name = "Motion Adaptive: Motion Search"; dim_class->nick = "tomsmocomp"; dim_class->latency = 1; #ifdef BUILD_X86_ASM if (cpu_flags & ORC_TARGET_MMX_MMXEXT) { dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_MMXEXT; dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_MMXEXT; } else if (cpu_flags & ORC_TARGET_MMX_3DNOW) { dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_3DNOW; dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_3DNOW; } else if (cpu_flags & ORC_TARGET_MMX_MMX) { dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_MMX; dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_MMX; } else { dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_C; dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_C; } #else dim_class->deinterlace_frame_yuy2 = tomsmocompDScaler_C; dim_class->deinterlace_frame_yvyu = tomsmocompDScaler_C; #endif } static void gst_deinterlace_method_tomsmocomp_init (GstDeinterlaceMethodTomsMoComp * self) { self->search_effort = 5; self->strange_bob = FALSE; } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/vfir.c0000644000175000017500000002721511707374600017511 00000000000000/* * * GStreamer * Copyright (C) 2004 Billy Biggs * Copyright (c) 2001, 2002, 2003 Fabrice Bellard. * Copyright (C) 2008,2010 Sebastian Dröge * * 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. */ /* * This file contains code from ffmpeg, see http://ffmpeg.org/ (LGPL) * and modifications by Billy Biggs. * * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #ifdef HAVE_ORC #include #endif #include "tvtime.h" #define GST_TYPE_DEINTERLACE_METHOD_VFIR (gst_deinterlace_method_vfir_get_type ()) #define GST_IS_DEINTERLACE_METHOD_VFIR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_VFIR)) #define GST_IS_DEINTERLACE_METHOD_VFIR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_VFIR)) #define GST_DEINTERLACE_METHOD_VFIR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_VFIR, GstDeinterlaceMethodVFIRClass)) #define GST_DEINTERLACE_METHOD_VFIR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_VFIR, GstDeinterlaceMethodVFIR)) #define GST_DEINTERLACE_METHOD_VFIR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_VFIR, GstDeinterlaceMethodVFIRClass)) #define GST_DEINTERLACE_METHOD_VFIR_CAST(obj) ((GstDeinterlaceMethodVFIR*)(obj)) GType gst_deinterlace_method_vfir_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodVFIR; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodVFIRClass; /* * The MPEG2 spec uses a slightly harsher filter, they specify * [-1 8 2 8 -1]. ffmpeg uses a similar filter but with more of * a tendancy to blur than to use the local information. The * filter taps here are: [-1 4 2 4 -1]. */ /* * C implementation. */ static inline void deinterlace_c (guint8 * dst, const guint8 * lum_m4, const guint8 * lum_m3, const guint8 * lum_m2, const guint8 * lum_m1, const guint8 * lum, gint size) { if (lum_m2 == NULL) { deinterlace_line_linear (dst, lum_m1, lum_m3, size); } else { deinterlace_line_vfir (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } } static void deinterlace_line_packed_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[0]; deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_planar_y_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[0]; deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_planar_u_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[1]; deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_planar_v_c (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[2]; deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } #undef BUILD_X86_ASM #ifdef BUILD_X86_ASM #include "mmx.h" static void deinterlace_mmx (guint8 * dst, const guint8 * lum_m4, const guint8 * lum_m3, const guint8 * lum_m2, const guint8 * lum_m1, const guint8 * lum, gint size) { mmx_t rounder; rounder.uw[0] = 4; rounder.uw[1] = 4; rounder.uw[2] = 4; rounder.uw[3] = 4; pxor_r2r (mm7, mm7); movq_m2r (rounder, mm6); for (; size > 3; size -= 4) { movd_m2r (*lum_m4, mm0); movd_m2r (*lum_m3, mm1); movd_m2r (*lum_m2, mm2); movd_m2r (*lum_m1, mm3); movd_m2r (*lum, mm4); punpcklbw_r2r (mm7, mm0); punpcklbw_r2r (mm7, mm1); punpcklbw_r2r (mm7, mm2); punpcklbw_r2r (mm7, mm3); punpcklbw_r2r (mm7, mm4); paddw_r2r (mm3, mm1); psllw_i2r (1, mm2); paddw_r2r (mm4, mm0); psllw_i2r (2, mm1); // 2 paddw_r2r (mm6, mm2); paddw_r2r (mm2, mm1); psubusw_r2r (mm0, mm1); psrlw_i2r (3, mm1); // 3 packuswb_r2r (mm7, mm1); movd_r2m (mm1, *dst); lum_m4 += 4; lum_m3 += 4; lum_m2 += 4; lum_m1 += 4; lum += 4; dst += 4; } emms (); /* Handle odd widths */ if (size > 0) deinterlace_c (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_packed_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[0]; deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_planar_y_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[0]; deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_planar_u_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[1]; deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } static void deinterlace_line_planar_v_mmx (GstDeinterlaceSimpleMethod * self, guint8 * dst, const GstDeinterlaceScanlineData * scanlines) { const guint8 *lum_m4 = scanlines->tt1; const guint8 *lum_m3 = scanlines->t0; const guint8 *lum_m2 = scanlines->m1; const guint8 *lum_m1 = scanlines->b0; const guint8 *lum = scanlines->bb1; gint size = self->parent.row_stride[2]; deinterlace_mmx (dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size); } #endif G_DEFINE_TYPE (GstDeinterlaceMethodVFIR, gst_deinterlace_method_vfir, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_vfir_class_init (GstDeinterlaceMethodVFIRClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; #ifdef BUILD_X86_ASM guint cpu_flags = orc_target_get_default_flags (orc_target_get_by_name ("mmx")); #endif dim_class->fields_required = 2; dim_class->name = "Blur Vertical"; dim_class->nick = "vfir"; dim_class->latency = 1; #ifdef BUILD_X86_ASM if (cpu_flags & ORC_TARGET_MMX_MMX) { dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_nv21 = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_argb = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_abgr = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_rgba = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_bgra = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_rgb = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_bgr = deinterlace_line_packed_mmx; dism_class->interpolate_scanline_planar_y = deinterlace_line_planar_y_mmx; dism_class->interpolate_scanline_planar_u = deinterlace_line_planar_u_mmx; dism_class->interpolate_scanline_planar_v = deinterlace_line_planar_v_mmx; } else { dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_c; dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_c; dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_c; dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_c; dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_c; dism_class->interpolate_scanline_nv21 = deinterlace_line_packed_c; dism_class->interpolate_scanline_argb = deinterlace_line_packed_c; dism_class->interpolate_scanline_abgr = deinterlace_line_packed_c; dism_class->interpolate_scanline_rgba = deinterlace_line_packed_c; dism_class->interpolate_scanline_bgra = deinterlace_line_packed_c; dism_class->interpolate_scanline_rgb = deinterlace_line_packed_c; dism_class->interpolate_scanline_bgr = deinterlace_line_packed_c; dism_class->interpolate_scanline_planar_y = deinterlace_line_planar_y_c; dism_class->interpolate_scanline_planar_u = deinterlace_line_planar_u_c; dism_class->interpolate_scanline_planar_v = deinterlace_line_planar_v_c; } #else dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_c; dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_c; dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_c; dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_c; dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_c; dism_class->interpolate_scanline_nv21 = deinterlace_line_packed_c; dism_class->interpolate_scanline_argb = deinterlace_line_packed_c; dism_class->interpolate_scanline_abgr = deinterlace_line_packed_c; dism_class->interpolate_scanline_rgba = deinterlace_line_packed_c; dism_class->interpolate_scanline_bgra = deinterlace_line_packed_c; dism_class->interpolate_scanline_rgb = deinterlace_line_packed_c; dism_class->interpolate_scanline_bgr = deinterlace_line_packed_c; dism_class->interpolate_scanline_planar_y = deinterlace_line_planar_y_c; dism_class->interpolate_scanline_planar_u = deinterlace_line_planar_u_c; dism_class->interpolate_scanline_planar_v = deinterlace_line_planar_v_c; #endif } static void gst_deinterlace_method_vfir_init (GstDeinterlaceMethodVFIR * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/linearblend.c0000644000175000017500000002067111707374600021021 00000000000000/* * Linear blend deinterlacing plugin. The idea for this algorithm came * from the linear blend deinterlacer which originated in the mplayer * sources. * * Copyright (C) 2002 Billy Biggs . * Copyright (C) 2008,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #ifdef HAVE_ORC #include #endif #include "tvtime.h" #define GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND (gst_deinterlace_method_linear_blend_get_type ()) #define GST_IS_DEINTERLACE_METHOD_LINEAR_BLEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND)) #define GST_IS_DEINTERLACE_METHOD_LINEAR_BLEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND)) #define GST_DEINTERLACE_METHOD_LINEAR_BLEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlendClass)) #define GST_DEINTERLACE_METHOD_LINEAR_BLEND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlend)) #define GST_DEINTERLACE_METHOD_LINEAR_BLEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlendClass)) #define GST_DEINTERLACE_METHOD_LINEAR_BLEND_CAST(obj) ((GstDeinterlaceMethodLinearBlend*)(obj)) GType gst_deinterlace_method_linear_blend_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodLinearBlend; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodLinearBlendClass; static inline void deinterlace_scanline_linear_blend_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const guint8 * t0, const guint8 * b0, const guint8 * m1, gint size) { if (m1 == NULL) { deinterlace_line_linear (out, t0, b0, size); } else { deinterlace_line_linear_blend (out, t0, b0, m1, size); } } static void deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, scanlines->m1, self->parent.row_stride[0]); } static void deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, scanlines->m1, self->parent.row_stride[0]); } static void deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, scanlines->m1, self->parent.row_stride[1]); } static void deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0, scanlines->m1, self->parent.row_stride[2]); } static inline void deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1, gint size) { if (t1 == NULL) { memcpy (out, m0, size); } else { deinterlace_line_linear_blend (out, t1, b1, m0, size); } } static void deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, scanlines->b1, self->parent.row_stride[0]); } static void deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, scanlines->b1, self->parent.row_stride[0]); } static void deinterlace_scanline_linear_blend2_planar_u_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, scanlines->b1, self->parent.row_stride[1]); } static void deinterlace_scanline_linear_blend2_planar_v_c (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1, scanlines->b1, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend, gst_deinterlace_method_linear_blend, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_linear_blend_class_init (GstDeinterlaceMethodLinearBlendClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; dim_class->fields_required = 2; dim_class->name = "Blur: Temporal"; dim_class->nick = "linearblend"; dim_class->latency = 1; dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_yvyu = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_uyvy = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_ayuv = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_argb = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_rgba = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_abgr = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_bgra = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_rgb = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_bgr = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_nv12 = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_nv21 = deinterlace_scanline_linear_blend_packed_c; dism_class->interpolate_scanline_planar_y = deinterlace_scanline_linear_blend_planar_y_c; dism_class->interpolate_scanline_planar_u = deinterlace_scanline_linear_blend_planar_u_c; dism_class->interpolate_scanline_planar_v = deinterlace_scanline_linear_blend_planar_v_c; dism_class->copy_scanline_yuy2 = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_yvyu = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_uyvy = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_ayuv = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_argb = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_abgr = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_rgba = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_bgra = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_rgb = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_bgr = deinterlace_scanline_linear_blend2_packed_c; dism_class->copy_scanline_planar_y = deinterlace_scanline_linear_blend2_planar_y_c; dism_class->copy_scanline_planar_u = deinterlace_scanline_linear_blend2_planar_u_c; dism_class->copy_scanline_planar_v = deinterlace_scanline_linear_blend2_planar_v_c; } static void gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/weave.c0000644000175000017500000001541411707374600017650 00000000000000/* * Weave frames * Copyright (C) 2002 Billy Biggs . * Copyright (C) 2008,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #define GST_TYPE_DEINTERLACE_METHOD_WEAVE (gst_deinterlace_method_weave_get_type ()) #define GST_IS_DEINTERLACE_METHOD_WEAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE)) #define GST_IS_DEINTERLACE_METHOD_WEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE)) #define GST_DEINTERLACE_METHOD_WEAVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE, GstDeinterlaceMethodWeaveClass)) #define GST_DEINTERLACE_METHOD_WEAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE, GstDeinterlaceMethodWeave)) #define GST_DEINTERLACE_METHOD_WEAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE, GstDeinterlaceMethodWeaveClass)) #define GST_DEINTERLACE_METHOD_WEAVE_CAST(obj) ((GstDeinterlaceMethodWeave*)(obj)) GType gst_deinterlace_method_weave_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodWeave; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodWeaveClass; static void deinterlace_scanline_weave_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[0]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } } static void deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[0]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } } static void deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[1]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[1]); } } static void deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[2]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[2]); } } static void copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[1]); } static void copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodWeave, gst_deinterlace_method_weave, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_weave_class_init (GstDeinterlaceMethodWeaveClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; dim_class->fields_required = 2; dim_class->name = "Weave"; dim_class->nick = "weave"; dim_class->latency = 1; dism_class->interpolate_scanline_ayuv = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_nv21 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_bgra = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_rgb = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_bgr = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_planar_y = deinterlace_scanline_weave_planar_y; dism_class->interpolate_scanline_planar_u = deinterlace_scanline_weave_planar_u; dism_class->interpolate_scanline_planar_v = deinterlace_scanline_weave_planar_v; dism_class->copy_scanline_ayuv = copy_scanline_packed; dism_class->copy_scanline_yuy2 = copy_scanline_packed; dism_class->copy_scanline_yvyu = copy_scanline_packed; dism_class->copy_scanline_uyvy = copy_scanline_packed; dism_class->copy_scanline_nv12 = copy_scanline_packed; dism_class->copy_scanline_nv21 = copy_scanline_packed; dism_class->copy_scanline_argb = copy_scanline_packed; dism_class->copy_scanline_abgr = copy_scanline_packed; dism_class->copy_scanline_rgba = copy_scanline_packed; dism_class->copy_scanline_bgra = copy_scanline_packed; dism_class->copy_scanline_rgb = copy_scanline_packed; dism_class->copy_scanline_bgr = copy_scanline_packed; dism_class->copy_scanline_planar_y = copy_scanline_planar_y; dism_class->copy_scanline_planar_u = copy_scanline_planar_u; dism_class->copy_scanline_planar_v = copy_scanline_planar_v; } static void gst_deinterlace_method_weave_init (GstDeinterlaceMethodWeave * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/scalerbob.c0000644000175000017500000001146411707374600020476 00000000000000/* * Double lines * Copyright (C) 2008,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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 "gstdeinterlacemethod.h" #include #define GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB (gst_deinterlace_method_scaler_bob_get_type ()) #define GST_IS_DEINTERLACE_METHOD_SCALER_BOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB)) #define GST_IS_DEINTERLACE_METHOD_SCALER_BOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB)) #define GST_DEINTERLACE_METHOD_SCALER_BOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB, GstDeinterlaceMethodScalerBobClass)) #define GST_DEINTERLACE_METHOD_SCALER_BOB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB, GstDeinterlaceMethodScalerBob)) #define GST_DEINTERLACE_METHOD_SCALER_BOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_SCALER_BOB, GstDeinterlaceMethodScalerBobClass)) #define GST_DEINTERLACE_METHOD_SCALER_BOB_CAST(obj) ((GstDeinterlaceMethodScalerBob*)(obj)) GType gst_deinterlace_method_scaler_bob_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodScalerBob; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodScalerBobClass; static void deinterlace_scanline_scaler_bob_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->t0, self->parent.row_stride[0]); } static void deinterlace_scanline_scaler_bob_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->t0, self->parent.row_stride[0]); } static void deinterlace_scanline_scaler_bob_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->t0, self->parent.row_stride[1]); } static void deinterlace_scanline_scaler_bob_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->t0, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodScalerBob, gst_deinterlace_method_scaler_bob, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_scaler_bob_class_init (GstDeinterlaceMethodScalerBobClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; dim_class->fields_required = 2; dim_class->name = "Double lines"; dim_class->nick = "scalerbob"; dim_class->latency = 1; dism_class->interpolate_scanline_ayuv = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_yvyu = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_uyvy = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_nv12 = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_nv21 = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_argb = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_abgr = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_rgba = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_bgra = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_rgb = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_bgr = deinterlace_scanline_scaler_bob_packed; dism_class->interpolate_scanline_planar_y = deinterlace_scanline_scaler_bob_planar_y; dism_class->interpolate_scanline_planar_u = deinterlace_scanline_scaler_bob_planar_u; dism_class->interpolate_scanline_planar_v = deinterlace_scanline_scaler_bob_planar_v; } static void gst_deinterlace_method_scaler_bob_init (GstDeinterlaceMethodScalerBob * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/greedyhmacros.h0000644000175000017500000000745611671175353021415 00000000000000/* * GStreamer * Copyright (c) 2001 Tom Barry All rights reserved. * * 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ // Define a few macros for CPU dependent instructions. // I suspect I don't really understand how the C macro preprocessor works but // this seems to get the job done. // TRB 7/01 // BEFORE USING THESE YOU MUST SET: // #define SIMD_TYPE MMXEXT (or MMX or 3DNOW) // some macros for pavgb instruction // V_PAVGB(mmr1, mmr2, mmr work register, smask) mmr2 may = mmrw if you can trash it #define V_PAVGB_MMX(mmr1, mmr2, mmrw, smask) \ "movq "mmr2", "mmrw"\n\t" \ "pand "smask", "mmrw"\n\t" \ "psrlw $1, "mmrw"\n\t" \ "pand "smask", "mmr1"\n\t" \ "psrlw $1, "mmr1"\n\t" \ "paddusb "mmrw", "mmr1"\n\t" #define V_PAVGB_MMXEXT(mmr1, mmr2, mmrw, smask) "pavgb "mmr2", "mmr1"\n\t" #define V_PAVGB_3DNOW(mmr1, mmr2, mmrw, smask) "pavgusb "mmr2", "mmr1"\n\t" #define V_PAVGB(mmr1, mmr2, mmrw, smask) V_PAVGB2(mmr1, mmr2, mmrw, smask, SIMD_TYPE) #define V_PAVGB2(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type) #define V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB_##simd_type(mmr1, mmr2, mmrw, smask) // some macros for pmaxub instruction #define V_PMAXUB_MMX(mmr1, mmr2) \ "psubusb "mmr2", "mmr1"\n\t" \ "paddusb "mmr2", "mmr1"\n\t" #define V_PMAXUB_MMXEXT(mmr1, mmr2) "pmaxub "mmr2", "mmr1"\n\t" #define V_PMAXUB_3DNOW(mmr1, mmr2) V_PMAXUB_MMX(mmr1, mmr2) // use MMX version #define V_PMAXUB(mmr1, mmr2) V_PMAXUB2(mmr1, mmr2, SIMD_TYPE) #define V_PMAXUB2(mmr1, mmr2, simd_type) V_PMAXUB3(mmr1, mmr2, simd_type) #define V_PMAXUB3(mmr1, mmr2, simd_type) V_PMAXUB_##simd_type(mmr1, mmr2) // some macros for pminub instruction // V_PMINUB(mmr1, mmr2, mmr work register) mmr2 may NOT = mmrw #define V_PMINUB_MMX(mmr1, mmr2, mmrw) \ "pcmpeqb "mmrw", "mmrw"\n\t" \ "psubusb "mmr2", "mmrw"\n\t" \ "paddusb "mmrw", "mmr1"\n\t" \ "psubusb "mmrw", "mmr1"\n\t" #define V_PMINUB_MMXEXT(mmr1, mmr2, mmrw) "pminub "mmr2", "mmr1"\n\t" #define V_PMINUB_3DNOW(mmr1, mmr2, mmrw) V_PMINUB_MMX(mmr1, mmr2, mmrw) // use MMX version #define V_PMINUB(mmr1, mmr2, mmrw) V_PMINUB2(mmr1, mmr2, mmrw, SIMD_TYPE) #define V_PMINUB2(mmr1, mmr2, mmrw, simd_type) V_PMINUB3(mmr1, mmr2, mmrw, simd_type) #define V_PMINUB3(mmr1, mmr2, mmrw, simd_type) V_PMINUB_##simd_type(mmr1, mmr2, mmrw) // some macros for movntq instruction // V_MOVNTQ(mmr1, mmr2) #define V_MOVNTQ_MMX(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t" #define V_MOVNTQ_3DNOW(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t" #define V_MOVNTQ_MMXEXT(mmr1, mmr2) "movntq "mmr2", "mmr1"\n\t" #define V_MOVNTQ(mmr1, mmr2) V_MOVNTQ2(mmr1, mmr2, SIMD_TYPE) #define V_MOVNTQ2(mmr1, mmr2, simd_type) V_MOVNTQ3(mmr1, mmr2, simd_type) #define V_MOVNTQ3(mmr1, mmr2, simd_type) V_MOVNTQ_##simd_type(mmr1, mmr2) // end of macros gst-plugins-good-0.10.31/gst/deinterlace/tvtime/weavetff.c0000644000175000017500000001563411707374600020354 00000000000000/* * Weave frames, top-field-first. * Copyright (C) 2003 Billy Biggs . * Copyright (C) 2008,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #define GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF (gst_deinterlace_method_weave_tff_get_type ()) #define GST_IS_DEINTERLACE_METHOD_WEAVE_TFF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF)) #define GST_IS_DEINTERLACE_METHOD_WEAVE_TFF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF)) #define GST_DEINTERLACE_METHOD_WEAVE_TFF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF, GstDeinterlaceMethodWeaveTFFClass)) #define GST_DEINTERLACE_METHOD_WEAVE_TFF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF, GstDeinterlaceMethodWeaveTFF)) #define GST_DEINTERLACE_METHOD_WEAVE_TFF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_WEAVE_TFF, GstDeinterlaceMethodWeaveTFFClass)) #define GST_DEINTERLACE_METHOD_WEAVE_TFF_CAST(obj) ((GstDeinterlaceMethodWeaveTFF*)(obj)) GType gst_deinterlace_method_weave_tff_get_type (void); typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodWeaveTFF; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodWeaveTFFClass; static void deinterlace_scanline_weave_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[0]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } } static void deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[0]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[0]); } } static void deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[1]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[1]); } } static void deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { if (scanlines->m1 == NULL) { memcpy (out, scanlines->t0, self->parent.row_stride[2]); } else { memcpy (out, scanlines->m1, self->parent.row_stride[2]); } } static void copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[1]); } static void copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodWeaveTFF, gst_deinterlace_method_weave_tff, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); static void gst_deinterlace_method_weave_tff_class_init (GstDeinterlaceMethodWeaveTFFClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; dim_class->fields_required = 2; dim_class->name = "Progressive: Top Field First"; dim_class->nick = "weavetff"; dim_class->latency = 1; dism_class->interpolate_scanline_ayuv = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_nv21 = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_bgra = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_rgb = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_bgr = deinterlace_scanline_weave_packed; dism_class->interpolate_scanline_planar_y = deinterlace_scanline_weave_planar_y; dism_class->interpolate_scanline_planar_u = deinterlace_scanline_weave_planar_u; dism_class->interpolate_scanline_planar_v = deinterlace_scanline_weave_planar_v; dism_class->copy_scanline_ayuv = copy_scanline_packed; dism_class->copy_scanline_yuy2 = copy_scanline_packed; dism_class->copy_scanline_yvyu = copy_scanline_packed; dism_class->copy_scanline_uyvy = copy_scanline_packed; dism_class->copy_scanline_nv12 = copy_scanline_packed; dism_class->copy_scanline_nv21 = copy_scanline_packed; dism_class->copy_scanline_argb = copy_scanline_packed; dism_class->copy_scanline_abgr = copy_scanline_packed; dism_class->copy_scanline_rgba = copy_scanline_packed; dism_class->copy_scanline_bgra = copy_scanline_packed; dism_class->copy_scanline_rgb = copy_scanline_packed; dism_class->copy_scanline_bgr = copy_scanline_packed; dism_class->copy_scanline_planar_y = copy_scanline_planar_y; dism_class->copy_scanline_planar_u = copy_scanline_planar_u; dism_class->copy_scanline_planar_v = copy_scanline_planar_v; } static void gst_deinterlace_method_weave_tff_init (GstDeinterlaceMethodWeaveTFF * self) { } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/greedyh.asm0000644000175000017500000005253611671175353020540 00000000000000/* * * GStreamer * Copyright (c) 2001 Tom Barry. All rights reserved. * Copyright (C) 2008,2010 Sebastian Dröge * * 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 aglong with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #include "x86-64_macros.inc" static void FUNCT_NAME_YUY2 (GstDeinterlaceMethodGreedyH *self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { // in tight loop some vars are accessed faster in local storage gint64 YMask = 0x00ff00ff00ff00ffull; // to keep only luma gint64 UVMask = 0xff00ff00ff00ff00ull; // to keep only chroma gint64 ShiftMask = 0xfefefefefefefefeull; // to avoid shifting chroma to luma gint64 QW256 = 0x0100010001000100ull; // 4 256's gint64 MaxComb; gint64 MotionThreshold; gint64 MotionSense; gint64 i; glong LoopCtr; glong oldbx; gint64 QW256B; gint64 LastAvg = 0; //interp value from left qword // FIXME: Use C implementation if the width is not a multiple of 4 // Do something more optimal later if (width % 4 != 0) C_FUNCT_YUY2 (self, L1, L2, L3, L2P, Dest, width); // Set up our two parms that are actually evaluated for each pixel i = self->max_comb; MaxComb = i << 56 | i << 48 | i << 40 | i << 32 | i << 24 | i << 16 | i << 8 | i; i = self->motion_threshold; // scale to range of 0-257 MotionThreshold = i << 48 | i << 32 | i << 16 | i | UVMask; i = self->motion_sense; // scale to range of 0-257 MotionSense = i << 48 | i << 32 | i << 16 | i; i = 0xffffffff - 256; QW256B = i << 48 | i << 32 | i << 16 | i; // save a couple instr on PMINSW instruct. LoopCtr = width / 8 - 1; // there are LineLength / 4 qwords per line but do 1 less, adj at end of loop // For ease of reading, the comments below assume that we're operating on an odd // field (i.e., that InfoIsOdd is true). Assume the obvious for even lines.. __asm__ __volatile__ ( // save ebx (-fPIC) MOVX " %%" XBX ", %[oldbx]\n\t" MOVX " %[L1], %%" XAX "\n\t" LEAX " 8(%%" XAX "), %%" XBX "\n\t" // next qword needed by DJR MOVX " %[L3], %%" XCX "\n\t" SUBX " %%" XAX ", %%" XCX "\n\t" // carry L3 addr as an offset MOVX " %[L2P], %%" XDX "\n\t" MOVX " %[L2], %%" XSI "\n\t" MOVX " %[Dest], %%" XDI "\n\t" // DL1 if Odd or DL2 if Even ".align 8\n\t" "1:\n\t" "movq (%%" XSI "), %%mm0\n\t" // L2 - the newest weave pixel value "movq (%%" XAX "), %%mm1\n\t" // L1 - the top pixel "movq (%%" XDX "), %%mm2\n\t" // L2P - the prev weave pixel "movq (%%" XAX ", %%" XCX "), %%mm3\n\t" // L3, next odd row "movq %%mm1, %%mm6\n\t" // L1 - get simple single pixel interp // pavgb mm6, mm3 // use macro below V_PAVGB ("%%mm6", "%%mm3", "%%mm4", "%[ShiftMask]") // DJR - Diagonal Jaggie Reduction // In the event that we are going to use an average (Bob) pixel we do not want a jagged // stair step effect. To combat this we avg in the 2 horizontally adjacen pixels into the // interpolated Bob mix. This will do horizontal smoothing for only the Bob'd pixels. "movq %[LastAvg], %%mm4\n\t" // the bob value from prev qword in row "movq %%mm6, %[LastAvg]\n\t" // save for next pass "psrlq $48, %%mm4\n\t" // right justify 1 pixel "movq %%mm6, %%mm7\n\t" // copy of simple bob pixel "psllq $16, %%mm7\n\t" // left justify 3 pixels "por %%mm7, %%mm4\n\t" // and combine "movq (%%" XBX "), %%mm5\n\t" // next horiz qword from L1 // pavgb mm5, qword ptr[ebx+ecx] // next horiz qword from L3, use macro below V_PAVGB ("%%mm5", "(%%" XBX ",%%" XCX ")", "%%mm7", "%[ShiftMask]") "psllq $48, %%mm5\n\t" // left just 1 pixel "movq %%mm6, %%mm7\n\t" // another copy of simple bob pixel "psrlq $16, %%mm7\n\t" // right just 3 pixels "por %%mm7, %%mm5\n\t" // combine // pavgb mm4, mm5 // avg of forward and prev by 1 pixel, use macro V_PAVGB ("%%mm4", "%%mm5", "%%mm5", "%[ShiftMask]") // mm5 gets modified if MMX // pavgb mm6, mm4 // avg of center and surround interp vals, use macro V_PAVGB ("%%mm6", "%%mm4", "%%mm7", "%[ShiftMask]") // Don't do any more averaging than needed for mmx. It hurts performance and causes rounding errors. #ifndef IS_MMX // pavgb mm4, mm6 // 1/4 center, 3/4 adjacent V_PAVGB ("%%mm4", "%%mm6", "%%mm7", "%[ShiftMask]") // pavgb mm6, mm4 // 3/8 center, 5/8 adjacent V_PAVGB ("%%mm6", "%%mm4", "%%mm7", "%[ShiftMask]") #endif // get abs value of possible L2 comb "movq %%mm6, %%mm4\n\t" // work copy of interp val "movq %%mm2, %%mm7\n\t" // L2 "psubusb %%mm4, %%mm7\n\t" // L2 - avg "movq %%mm4, %%mm5\n\t" // avg "psubusb %%mm2, %%mm5\n\t" // avg - L2 "por %%mm7, %%mm5\n\t" // abs(avg-L2) // get abs value of possible L2P comb "movq %%mm0, %%mm7\n\t" // L2P "psubusb %%mm4, %%mm7\n\t" // L2P - avg "psubusb %%mm0, %%mm4\n\t" // avg - L2P "por %%mm7, %%mm4\n\t" // abs(avg-L2P) // use L2 or L2P depending upon which makes smaller comb "psubusb %%mm5, %%mm4\n\t" // see if it goes to zero "psubusb %%mm5, %%mm5\n\t" // 0 "pcmpeqb %%mm5, %%mm4\n\t" // if (mm4=0) then FF else 0 "pcmpeqb %%mm4, %%mm5\n\t" // opposite of mm4 // if Comb(L2P) <= Comb(L2) then mm4=ff, mm5=0 else mm4=0, mm5 = 55 "pand %%mm2, %%mm5\n\t" // use L2 if mm5 == ff, else 0 "pand %%mm0, %%mm4\n\t" // use L2P if mm4 = ff, else 0 "por %%mm5, %%mm4\n\t" // may the best win // Inventory: at this point we have the following values: // mm0 = L2P (or L2) // mm1 = L1 // mm2 = L2 (or L2P) // mm3 = L3 // mm4 = the best of L2,L2P weave pixel, base upon comb // mm6 = the avg interpolated value, if we need to use it // Let's measure movement, as how much the weave pixel has changed "movq %%mm2, %%mm7\n\t" "psubusb %%mm0, %%mm2\n\t" "psubusb %%mm7, %%mm0\n\t" "por %%mm2, %%mm0\n\t" // abs value of change, used later // Now lets clip our chosen value to be not outside of the range // of the high/low range L1-L3 by more than MaxComb. // This allows some comb but limits the damages and also allows more // detail than a boring oversmoothed clip. "movq %%mm1, %%mm2\n\t" // copy L1 // pmaxub mm2, mm3 // use macro V_PMAXUB ("%%mm2", "%%mm3") // now = Max(L1,L3) "movq %%mm1, %%mm5\n\t" // copy L1 // pminub mm5, mm3 // now = Min(L1,L3), use macro V_PMINUB ("%%mm5", "%%mm3", "%%mm7") // allow the value to be above the high or below the low by amt of MaxComb "psubusb %[MaxComb], %%mm5\n\t" // lower min by diff "paddusb %[MaxComb], %%mm2\n\t" // increase max by diff // pmaxub mm4, mm5 // now = Max(best,Min(L1,L3) use macro V_PMAXUB ("%%mm4", "%%mm5") // pminub mm4, mm2 // now = Min( Max(best, Min(L1,L3), L2 )=L2 clipped V_PMINUB ("%%mm4", "%%mm2", "%%mm7") // Blend weave pixel with bob pixel, depending on motion val in mm0 "psubusb %[MotionThreshold], %%mm0\n\t" // test Threshold, clear chroma change "pmullw %[MotionSense], %%mm0\n\t" // mul by user factor, keep low 16 bits "movq %[QW256], %%mm7\n\t" #ifdef IS_MMXEXT "pminsw %%mm7, %%mm0\n\t" // max = 256 #else "paddusw %[QW256B], %%mm0\n\t" // add, may sat at fff.. "psubusw %[QW256B], %%mm0\n\t" // now = Min(L1,256) #endif "psubusw %%mm0, %%mm7\n\t" // so the 2 sum to 256, weighted avg "movq %%mm4, %%mm2\n\t" // save weave chroma info before trashing "pand %[YMask], %%mm4\n\t" // keep only luma from calc'd value "pmullw %%mm7, %%mm4\n\t" // use more weave for less motion "pand %[YMask], %%mm6\n\t" // keep only luma from calc'd value "pmullw %%mm0, %%mm6\n\t" // use more bob for large motion "paddusw %%mm6, %%mm4\n\t" // combine "psrlw $8, %%mm4\n\t" // div by 256 to get weighted avg // chroma comes from weave pixel "pand %[UVMask], %%mm2\n\t" // keep chroma "por %%mm4, %%mm2\n\t" // and combine V_MOVNTQ ("(%%" XDI ")", "%%mm2") // move in our clipped best, use macro // bump ptrs and loop LEAX " 8(%%" XAX "), %%" XAX "\n\t" LEAX " 8(%%" XBX "), %%" XBX "\n\t" LEAX " 8(%%" XDX "), %%" XDX "\n\t" LEAX " 8(%%" XDI "), %%" XDI "\n\t" LEAX " 8(%%" XSI "), %%" XSI "\n\t" DECX " %[LoopCtr]\n\t" "jg 1b\n\t" // loop if not to last line // note P-III default assumes backward branches taken "jl 1f\n\t" // done MOVX " %%" XAX ", %%" XBX "\n\t" // sharpness lookahead 1 byte only, be wrong on 1 "jmp 1b\n\t" "1:\n\t" MOVX " %[oldbx], %%" XBX "\n\t" "emms\n\t": /* no outputs */ :[LastAvg] "m" (LastAvg), [L1] "m" (L1), [L3] "m" (L3), [L2P] "m" (L2P), [L2] "m" (L2), [Dest] "m" (Dest), [ShiftMask] "m" (ShiftMask), [MaxComb] "m" (MaxComb), [MotionThreshold] "m" (MotionThreshold), [MotionSense] "m" (MotionSense), [QW256B] "m" (QW256B), [YMask] "m" (YMask), [UVMask] "m" (UVMask), [LoopCtr] "m" (LoopCtr), [QW256] "m" (QW256), [oldbx] "m" (oldbx) : XAX, XCX, XDX, XSI, XDI, "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", #ifdef __MMX__ "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", #endif "memory", "cc"); } static void FUNCT_NAME_UYVY (GstDeinterlaceMethodGreedyH *self, const guint8 * L1, const guint8 * L2, const guint8 * L3, const guint8 * L2P, guint8 * Dest, gint width) { // in tight loop some vars are accessed faster in local storage gint64 YMask = 0xff00ff00ff00ff00ull; // to keep only luma gint64 UVMask = 0x00ff00ff00ff00ffull; // to keep only chroma gint64 ShiftMask = 0xfefefefefefefefeull; // to avoid shifting chroma to luma gint64 QW256 = 0x0100010001000100ull; // 4 256's gint64 MaxComb; gint64 MotionThreshold; gint64 MotionSense; gint64 i; glong LoopCtr; glong oldbx; gint64 QW256B; gint64 LastAvg = 0; //interp value from left qword // FIXME: Use C implementation if the width is not a multiple of 4 // Do something more optimal later if (width % 4 != 0) C_FUNCT_UYVY (self, L1, L2, L3, L2P, Dest, width); // Set up our two parms that are actually evaluated for each pixel i = self->max_comb; MaxComb = i << 56 | i << 48 | i << 40 | i << 32 | i << 24 | i << 16 | i << 8 | i; i = self->motion_threshold; // scale to range of 0-257 MotionThreshold = i << 48 | i << 32 | i << 16 | i | UVMask; i = self->motion_sense; // scale to range of 0-257 MotionSense = i << 48 | i << 32 | i << 16 | i; i = 0xffffffff - 256; QW256B = i << 48 | i << 32 | i << 16 | i; // save a couple instr on PMINSW instruct. LoopCtr = width / 8 - 1; // there are LineLength / 4 qwords per line but do 1 less, adj at end of loop // For ease of reading, the comments below assume that we're operating on an odd // field (i.e., that InfoIsOdd is true). Assume the obvious for even lines.. __asm__ __volatile__ ( // save ebx (-fPIC) MOVX " %%" XBX ", %[oldbx]\n\t" MOVX " %[L1], %%" XAX "\n\t" LEAX " 8(%%" XAX "), %%" XBX "\n\t" // next qword needed by DJR MOVX " %[L3], %%" XCX "\n\t" SUBX " %%" XAX ", %%" XCX "\n\t" // carry L3 addr as an offset MOVX " %[L2P], %%" XDX "\n\t" MOVX " %[L2], %%" XSI "\n\t" MOVX " %[Dest], %%" XDI "\n\t" // DL1 if Odd or DL2 if Even ".align 8\n\t" "1:\n\t" "movq (%%" XSI "), %%mm0\n\t" // L2 - the newest weave pixel value "movq (%%" XAX "), %%mm1\n\t" // L1 - the top pixel "movq (%%" XDX "), %%mm2\n\t" // L2P - the prev weave pixel "movq (%%" XAX ", %%" XCX "), %%mm3\n\t" // L3, next odd row "movq %%mm1, %%mm6\n\t" // L1 - get simple single pixel interp // pavgb mm6, mm3 // use macro below V_PAVGB ("%%mm6", "%%mm3", "%%mm4", "%[ShiftMask]") // DJR - Diagonal Jaggie Reduction // In the event that we are going to use an average (Bob) pixel we do not want a jagged // stair step effect. To combat this we avg in the 2 horizontally adjacen pixels into the // interpolated Bob mix. This will do horizontal smoothing for only the Bob'd pixels. "movq %[LastAvg], %%mm4\n\t" // the bob value from prev qword in row "movq %%mm6, %[LastAvg]\n\t" // save for next pass "psrlq $48, %%mm4\n\t" // right justify 1 pixel "movq %%mm6, %%mm7\n\t" // copy of simple bob pixel "psllq $16, %%mm7\n\t" // left justify 3 pixels "por %%mm7, %%mm4\n\t" // and combine "movq (%%" XBX "), %%mm5\n\t" // next horiz qword from L1 // pavgb mm5, qword ptr[ebx+ecx] // next horiz qword from L3, use macro below V_PAVGB ("%%mm5", "(%%" XBX ",%%" XCX ")", "%%mm7", "%[ShiftMask]") "psllq $48, %%mm5\n\t" // left just 1 pixel "movq %%mm6, %%mm7\n\t" // another copy of simple bob pixel "psrlq $16, %%mm7\n\t" // right just 3 pixels "por %%mm7, %%mm5\n\t" // combine // pavgb mm4, mm5 // avg of forward and prev by 1 pixel, use macro V_PAVGB ("%%mm4", "%%mm5", "%%mm5", "%[ShiftMask]") // mm5 gets modified if MMX // pavgb mm6, mm4 // avg of center and surround interp vals, use macro V_PAVGB ("%%mm6", "%%mm4", "%%mm7", "%[ShiftMask]") // Don't do any more averaging than needed for mmx. It hurts performance and causes rounding errors. #ifndef IS_MMX // pavgb mm4, mm6 // 1/4 center, 3/4 adjacent V_PAVGB ("%%mm4", "%%mm6", "%%mm7", "%[ShiftMask]") // pavgb mm6, mm4 // 3/8 center, 5/8 adjacent V_PAVGB ("%%mm6", "%%mm4", "%%mm7", "%[ShiftMask]") #endif // get abs value of possible L2 comb "movq %%mm6, %%mm4\n\t" // work copy of interp val "movq %%mm2, %%mm7\n\t" // L2 "psubusb %%mm4, %%mm7\n\t" // L2 - avg "movq %%mm4, %%mm5\n\t" // avg "psubusb %%mm2, %%mm5\n\t" // avg - L2 "por %%mm7, %%mm5\n\t" // abs(avg-L2) // get abs value of possible L2P comb "movq %%mm0, %%mm7\n\t" // L2P "psubusb %%mm4, %%mm7\n\t" // L2P - avg "psubusb %%mm0, %%mm4\n\t" // avg - L2P "por %%mm7, %%mm4\n\t" // abs(avg-L2P) // use L2 or L2P depending upon which makes smaller comb "psubusb %%mm5, %%mm4\n\t" // see if it goes to zero "psubusb %%mm5, %%mm5\n\t" // 0 "pcmpeqb %%mm5, %%mm4\n\t" // if (mm4=0) then FF else 0 "pcmpeqb %%mm4, %%mm5\n\t" // opposite of mm4 // if Comb(L2P) <= Comb(L2) then mm4=ff, mm5=0 else mm4=0, mm5 = 55 "pand %%mm2, %%mm5\n\t" // use L2 if mm5 == ff, else 0 "pand %%mm0, %%mm4\n\t" // use L2P if mm4 = ff, else 0 "por %%mm5, %%mm4\n\t" // may the best win // Inventory: at this point we have the following values: // mm0 = L2P (or L2) // mm1 = L1 // mm2 = L2 (or L2P) // mm3 = L3 // mm4 = the best of L2,L2P weave pixel, base upon comb // mm6 = the avg interpolated value, if we need to use it // Let's measure movement, as how much the weave pixel has changed "movq %%mm2, %%mm7\n\t" "psubusb %%mm0, %%mm2\n\t" "psubusb %%mm7, %%mm0\n\t" "por %%mm2, %%mm0\n\t" // abs value of change, used later // Now lets clip our chosen value to be not outside of the range // of the high/low range L1-L3 by more than MaxComb. // This allows some comb but limits the damages and also allows more // detail than a boring oversmoothed clip. "movq %%mm1, %%mm2\n\t" // copy L1 // pmaxub mm2, mm3 // use macro V_PMAXUB ("%%mm2", "%%mm3") // now = Max(L1,L3) "movq %%mm1, %%mm5\n\t" // copy L1 // pminub mm5, mm3 // now = Min(L1,L3), use macro V_PMINUB ("%%mm5", "%%mm3", "%%mm7") // allow the value to be above the high or below the low by amt of MaxComb "psubusb %[MaxComb], %%mm5\n\t" // lower min by diff "paddusb %[MaxComb], %%mm2\n\t" // increase max by diff // pmaxub mm4, mm5 // now = Max(best,Min(L1,L3) use macro V_PMAXUB ("%%mm4", "%%mm5") // pminub mm4, mm2 // now = Min( Max(best, Min(L1,L3), L2 )=L2 clipped V_PMINUB ("%%mm4", "%%mm2", "%%mm7") // Blend weave pixel with bob pixel, depending on motion val in mm0 "psubusb %[MotionThreshold], %%mm0\n\t" // test Threshold, clear chroma change "psrlw $8, %%mm0\n\t" // div by 256 to get weighted avg "pmullw %[MotionSense], %%mm0\n\t" // mul by user factor, keep low 16 bits "movq %[QW256], %%mm7\n\t" #ifdef IS_MMXEXT "pminsw %%mm7, %%mm0\n\t" // max = 256 #else "paddusw %[QW256B], %%mm0\n\t" // add, may sat at fff.. "psubusw %[QW256B], %%mm0\n\t" // now = Min(L1,256) #endif "psubusw %%mm0, %%mm7\n\t" // so the 2 sum to 256, weighted avg "movq %%mm4, %%mm2\n\t" // save weave chroma info before trashing "pand %[YMask], %%mm4\n\t" // keep only luma from calc'd value "psrlw $8, %%mm4\n\t" // div by 256 to get weighted avg "pmullw %%mm7, %%mm4\n\t" // use more weave for less motion "pand %[YMask], %%mm6\n\t" // keep only luma from calc'd value "psrlw $8, %%mm6\n\t" // div by 256 to get weighted avg "pmullw %%mm0, %%mm6\n\t" // use more bob for large motion "paddusw %%mm6, %%mm4\n\t" // combine "pand %[YMask], %%mm4\n\t" // keep only luma from calc'd value // chroma comes from weave pixel "pand %[UVMask], %%mm2\n\t" // keep chroma "por %%mm4, %%mm2\n\t" // and combine V_MOVNTQ ("(%%" XDI ")", "%%mm2") // move in our clipped best, use macro // bump ptrs and loop LEAX " 8(%%" XAX "), %%" XAX "\n\t" LEAX " 8(%%" XBX "), %%" XBX "\n\t" LEAX " 8(%%" XDX "), %%" XDX "\n\t" LEAX " 8(%%" XDI "), %%" XDI "\n\t" LEAX " 8(%%" XSI "), %%" XSI "\n\t" DECX " %[LoopCtr]\n\t" "jg 1b\n\t" // loop if not to last line // note P-III default assumes backward branches taken "jl 1f\n\t" // done MOVX " %%" XAX ", %%" XBX "\n\t" // sharpness lookahead 1 byte only, be wrong on 1 "jmp 1b\n\t" "1:\n\t" MOVX " %[oldbx], %%" XBX "\n\t" "emms\n\t": /* no outputs */ :[LastAvg] "m" (LastAvg), [L1] "m" (L1), [L3] "m" (L3), [L2P] "m" (L2P), [L2] "m" (L2), [Dest] "m" (Dest), [ShiftMask] "m" (ShiftMask), [MaxComb] "m" (MaxComb), [MotionThreshold] "m" (MotionThreshold), [MotionSense] "m" (MotionSense), [QW256B] "m" (QW256B), [YMask] "m" (YMask), [UVMask] "m" (UVMask), [LoopCtr] "m" (LoopCtr), [QW256] "m" (QW256), [oldbx] "m" (oldbx) : XAX, XCX, XDX, XSI, XDI, "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", #ifdef __MMX__ "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", #endif "memory", "cc"); } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/plugins.h0000644000175000017500000000474311671175353020236 00000000000000/* * * GStreamer * Copyright (C) 2004 Billy Biggs * Copyright (C) 2008 Sebastian Dröge * * 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifndef TVTIME_PLUGINS_H_INCLUDED #define TVTIME_PLUGINS_H_INCLUDED #define GST_TYPE_DEINTERLACE_TOMSMOCOMP (gst_deinterlace_method_tomsmocomp_get_type ()) #define GST_TYPE_DEINTERLACE_GREEDY_H (gst_deinterlace_method_greedy_h_get_type ()) #define GST_TYPE_DEINTERLACE_GREEDY_L (gst_deinterlace_method_greedy_l_get_type ()) #define GST_TYPE_DEINTERLACE_VFIR (gst_deinterlace_method_vfir_get_type ()) #define GST_TYPE_DEINTERLACE_LINEAR (gst_deinterlace_method_linear_get_type ()) #define GST_TYPE_DEINTERLACE_LINEAR_BLEND (gst_deinterlace_method_linear_blend_get_type ()) #define GST_TYPE_DEINTERLACE_SCALER_BOB (gst_deinterlace_method_scaler_bob_get_type ()) #define GST_TYPE_DEINTERLACE_WEAVE (gst_deinterlace_method_weave_get_type ()) #define GST_TYPE_DEINTERLACE_WEAVE_TFF (gst_deinterlace_method_weave_tff_get_type ()) #define GST_TYPE_DEINTERLACE_WEAVE_BFF (gst_deinterlace_method_weave_bff_get_type ()) GType gst_deinterlace_method_tomsmocomp_get_type (void); GType gst_deinterlace_method_greedy_h_get_type (void); GType gst_deinterlace_method_greedy_l_get_type (void); GType gst_deinterlace_method_vfir_get_type (void); GType gst_deinterlace_method_linear_get_type (void); GType gst_deinterlace_method_linear_blend_get_type (void); GType gst_deinterlace_method_scaler_bob_get_type (void); GType gst_deinterlace_method_weave_get_type (void); GType gst_deinterlace_method_weave_tff_get_type (void); GType gst_deinterlace_method_weave_bff_get_type (void); #endif /* TVTIME_PLUGINS_H_INCLUDED */ gst-plugins-good-0.10.31/gst/deinterlace/tvtime/sse.h0000644000175000017500000007176411671175353017356 00000000000000/* sse.h Streaming SIMD Extenstions (a.k.a. Katmai New Instructions) GCC interface library for IA32. To use this library, simply include this header file and compile with GCC. You MUST have inlining enabled in order for sse_ok() to work; this can be done by simply using -O on the GCC command line. Compiling with -DSSE_TRACE will cause detailed trace output to be sent to stderr for each sse operation. This adds lots of code, and obviously slows execution to a crawl, but can be very useful for debugging. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. 1999 by R. Fisher Based on libmmx by H. Dietz and R. Fisher Notes: This is still extremely alpha. Because this library depends on an assembler which understands the SSE opcodes, you probably won't be able to use this yet. For now, do not use TRACE versions. These both make use of the MMX registers, not the SSE registers. This will be resolved at a later date. ToDo: Rewrite TRACE macros Major Debugging Work */ #ifndef _SSE_H #define _SSE_H /* The type of an value that fits in an SSE register (note that long long constant values MUST be suffixed by LL and unsigned long long values by ULL, lest they be truncated by the compiler) */ typedef union { float sf[4]; /* Single-precision (32-bit) value */ } __attribute__ ((aligned (16))) sse_t; /* On a 16 byte (128-bit) boundary */ #if 0 /* Function to test if multimedia instructions are supported... */ inline extern int mm_support(void) { /* Returns 1 if MMX instructions are supported, 3 if Cyrix MMX and Extended MMX instructions are supported 5 if AMD MMX and 3DNow! instructions are supported 9 if MMX and SSE instructions are supported 0 if hardware does not support any of these */ register int rval = 0; __asm__ __volatile__ ( /* See if CPUID instruction is supported ... */ /* ... Get copies of EFLAGS into eax and ecx */ "pushf\n\t" "popl %%eax\n\t" "movl %%eax, %%ecx\n\t" /* ... Toggle the ID bit in one copy and store */ /* to the EFLAGS reg */ "xorl $0x200000, %%eax\n\t" "push %%eax\n\t" "popf\n\t" /* ... Get the (hopefully modified) EFLAGS */ "pushf\n\t" "popl %%eax\n\t" /* ... Compare and test result */ "xorl %%eax, %%ecx\n\t" "testl $0x200000, %%ecx\n\t" "jz NotSupported1\n\t" /* CPUID not supported */ /* Get standard CPUID information, and go to a specific vendor section */ "movl $0, %%eax\n\t" "cpuid\n\t" /* Check for Intel */ "cmpl $0x756e6547, %%ebx\n\t" "jne TryAMD\n\t" "cmpl $0x49656e69, %%edx\n\t" "jne TryAMD\n\t" "cmpl $0x6c65746e, %%ecx\n" "jne TryAMD\n\t" "jmp Intel\n\t" /* Check for AMD */ "\nTryAMD:\n\t" "cmpl $0x68747541, %%ebx\n\t" "jne TryCyrix\n\t" "cmpl $0x69746e65, %%edx\n\t" "jne TryCyrix\n\t" "cmpl $0x444d4163, %%ecx\n" "jne TryCyrix\n\t" "jmp AMD\n\t" /* Check for Cyrix */ "\nTryCyrix:\n\t" "cmpl $0x69727943, %%ebx\n\t" "jne NotSupported2\n\t" "cmpl $0x736e4978, %%edx\n\t" "jne NotSupported3\n\t" "cmpl $0x64616574, %%ecx\n\t" "jne NotSupported4\n\t" /* Drop through to Cyrix... */ /* Cyrix Section */ /* See if extended CPUID level 80000001 is supported */ /* The value of CPUID/80000001 for the 6x86MX is undefined according to the Cyrix CPU Detection Guide (Preliminary Rev. 1.01 table 1), so we'll check the value of eax for CPUID/0 to see if standard CPUID level 2 is supported. According to the table, the only CPU which supports level 2 is also the only one which supports extended CPUID levels. */ "cmpl $0x2, %%eax\n\t" "jne MMXtest\n\t" /* Use standard CPUID instead */ /* Extended CPUID supported (in theory), so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%eax\n\t" /* Test for MMX */ "jz NotSupported5\n\t" /* MMX not supported */ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ "jnz EMMXSupported\n\t" "movl $1, %0:\n\n\t" /* MMX Supported */ "jmp Return\n\n" "EMMXSupported:\n\t" "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ "jmp Return\n\t" /* AMD Section */ "AMD:\n\t" /* See if extended CPUID is supported */ "movl $0x80000000, %%eax\n\t" "cpuid\n\t" "cmpl $0x80000000, %%eax\n\t" "jl MMXtest\n\t" /* Use standard CPUID instead */ /* Extended CPUID supported, so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported6\n\t" /* MMX not supported */ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ "jnz ThreeDNowSupported\n\t" "movl $1, %0:\n\n\t" /* MMX Supported */ "jmp Return\n\n" "ThreeDNowSupported:\n\t" "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ "jmp Return\n\t" /* Intel Section */ "Intel:\n\t" /* Check for SSE */ "SSEtest:\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "testl $0x02000000, %%edx\n\t" /* Test for SSE */ "jz MMXtest\n\t" /* SSE Not supported */ "movl $9, %0:\n\n\t" /* SSE Supported */ "jmp Return\n\t" /* Check for MMX */ "MMXtest:\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported7\n\t" /* MMX Not supported */ "movl $1, %0:\n\n\t" /* MMX Supported */ "jmp Return\n\t" /* Nothing supported */ "\nNotSupported1:\n\t" "#movl $101, %0:\n\n\t" "\nNotSupported2:\n\t" "#movl $102, %0:\n\n\t" "\nNotSupported3:\n\t" "#movl $103, %0:\n\n\t" "\nNotSupported4:\n\t" "#movl $104, %0:\n\n\t" "\nNotSupported5:\n\t" "#movl $105, %0:\n\n\t" "\nNotSupported6:\n\t" "#movl $106, %0:\n\n\t" "\nNotSupported7:\n\t" "#movl $107, %0:\n\n\t" "movl $0, %0:\n\n\t" "Return:\n\t" : "=a" (rval) : /* no input */ : "eax", "ebx", "ecx", "edx" ); /* Return */ return(rval); } /* Function to test if sse instructions are supported... */ inline extern int sse_ok(void) { /* Returns 1 if SSE instructions are supported, 0 otherwise */ return ( (mm_support() & 0x8) >> 3 ); } #endif /* Helper functions for the instruction macros that follow... (note that memory-to-register, m2r, instructions are nearly as efficient as register-to-register, r2r, instructions; however, memory-to-memory instructions are really simulated as a convenience, and are only 1/3 as efficient) */ #ifdef SSE_TRACE /* Include the stuff for printing a trace to stderr... */ #include #define sse_i2r(op, imm, reg) \ { \ sse_t sse_trace; \ sse_trace.uq = (imm); \ fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x) => ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x\n", \ sse_trace.d[1], sse_trace.d[0]); \ } #define sse_m2r(op, mem, reg) \ { \ sse_t sse_trace; \ sse_trace = (mem); \ fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x) => ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (mem)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x\n", \ sse_trace.d[1], sse_trace.d[0]); \ } #define sse_r2m(op, reg, mem) \ { \ sse_t sse_trace; \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ sse_trace.d[1], sse_trace.d[0]); \ sse_trace = (mem); \ fprintf(stderr, #mem "=0x%08x%08x) => ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=X" (mem) \ : /* nothing */ ); \ sse_trace = (mem); \ fprintf(stderr, #mem "=0x%08x%08x\n", \ sse_trace.d[1], sse_trace.d[0]); \ } #define sse_r2r(op, regs, regd) \ { \ sse_t sse_trace; \ __asm__ __volatile__ ("movq %%" #regs ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #regd "=0x%08x%08x) => ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (sse_trace) \ : /* nothing */ ); \ fprintf(stderr, #regd "=0x%08x%08x\n", \ sse_trace.d[1], sse_trace.d[0]); \ } #define sse_m2m(op, mems, memd) \ { \ sse_t sse_trace; \ sse_trace = (mems); \ fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ sse_trace.d[1], sse_trace.d[0]); \ sse_trace = (memd); \ fprintf(stderr, #memd "=0x%08x%08x) => ", \ sse_trace.d[1], sse_trace.d[0]); \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (memd) \ : "X" (mems)); \ sse_trace = (memd); \ fprintf(stderr, #memd "=0x%08x%08x\n", \ sse_trace.d[1], sse_trace.d[0]); \ } #else /* These macros are a lot simpler without the tracing... */ #define sse_i2r(op, imm, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm) ) #define sse_m2r(op, mem, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (mem)) #define sse_r2m(op, reg, mem) \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=X" (mem) \ : /* nothing */ ) #define sse_r2r(op, regs, regd) \ __asm__ __volatile__ (#op " %" #regs ", %" #regd) #define sse_r2ri(op, regs, regd, imm) \ __asm__ __volatile__ (#op " %0, %%" #regs ", %%" #regd \ : /* nothing */ \ : "X" (imm) ) /* Load data from mems to xmmreg, operate on xmmreg, and store data to memd */ #define sse_m2m(op, mems, memd, xmmreg) \ __asm__ __volatile__ ("movups %0, %%xmm0\n\t" \ #op " %1, %%xmm0\n\t" \ "movups %%mm0, %0" \ : "=X" (memd) \ : "X" (mems)) #define sse_m2ri(op, mem, reg, subop) \ __asm__ __volatile__ (#op " %0, %%" #reg ", " #subop \ : /* nothing */ \ : "X" (mem)) #define sse_m2mi(op, mems, memd, xmmreg, subop) \ __asm__ __volatile__ ("movups %0, %%xmm0\n\t" \ #op " %1, %%xmm0, " #subop "\n\t" \ "movups %%mm0, %0" \ : "=X" (memd) \ : "X" (mems)) #endif /* 1x128 MOVe Aligned four Packed Single-fp */ #define movaps_m2r(var, reg) sse_m2r(movaps, var, reg) #define movaps_r2m(reg, var) sse_r2m(movaps, reg, var) #define movaps_r2r(regs, regd) sse_r2r(movaps, regs, regd) #define movaps(vars, vard) \ __asm__ __volatile__ ("movaps %1, %%mm0\n\t" \ "movaps %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 1x128 MOVe aligned Non-Temporal four Packed Single-fp */ #define movntps_r2m(xmmreg, var) sse_r2m(movntps, xmmreg, var) /* 1x64 MOVe Non-Temporal Quadword */ #define movntq_r2m(mmreg, var) sse_r2m(movntq, mmreg, var) /* 1x128 MOVe Unaligned four Packed Single-fp */ #define movups_m2r(var, reg) sse_m2r(movups, var, reg) #define movups_r2m(reg, var) sse_r2m(movups, reg, var) #define movups_r2r(regs, regd) sse_r2r(movups, regs, regd) #define movups(vars, vard) \ __asm__ __volatile__ ("movups %1, %%mm0\n\t" \ "movups %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* MOVe High to Low Packed Single-fp high half of 4x32f (x) -> low half of 4x32f (y) */ #define movhlps_r2r(regs, regd) sse_r2r(movhlps, regs, regd) /* MOVe Low to High Packed Single-fp low half of 4x32f (x) -> high half of 4x32f (y) */ #define movlhps_r2r(regs, regd) sse_r2r(movlhps, regs, regd) /* MOVe High Packed Single-fp 2x32f -> high half of 4x32f */ #define movhps_m2r(var, reg) sse_m2r(movhps, var, reg) #define movhps_r2m(reg, var) sse_r2m(movhps, reg, var) #define movhps(vars, vard) \ __asm__ __volatile__ ("movhps %1, %%mm0\n\t" \ "movhps %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* MOVe Low Packed Single-fp 2x32f -> low half of 4x32f */ #define movlps_m2r(var, reg) sse_m2r(movlps, var, reg) #define movlps_r2m(reg, var) sse_r2m(movlps, reg, var) #define movlps(vars, vard) \ __asm__ __volatile__ ("movlps %1, %%mm0\n\t" \ "movlps %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* MOVe Scalar Single-fp lowest field of 4x32f (x) -> lowest field of 4x32f (y) */ #define movss_m2r(var, reg) sse_m2r(movss, var, reg) #define movss_r2m(reg, var) sse_r2m(movss, reg, var) #define movss_r2r(regs, regd) sse_r2r(movss, regs, regd) #define movss(vars, vard) \ __asm__ __volatile__ ("movss %1, %%mm0\n\t" \ "movss %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 4x16 Packed SHUFfle Word */ #define pshufw_m2r(var, reg, index) sse_m2ri(pshufw, var, reg, index) #define pshufw_r2r(regs, regd, index) sse_r2ri(pshufw, regs, regd, index) /* 1x128 SHUFfle Packed Single-fp */ #define shufps_m2r(var, reg, index) sse_m2ri(shufps, var, reg, index) #define shufps_r2r(regs, regd, index) sse_r2ri(shufps, regs, regd, index) /* ConVerT Packed signed Int32 to(2) Packed Single-fp */ #define cvtpi2ps_m2r(var, xmmreg) sse_m2r(cvtpi2ps, var, xmmreg) #define cvtpi2ps_r2r(mmreg, xmmreg) sse_r2r(cvtpi2ps, mmreg, xmmreg) /* ConVerT Packed Single-fp to(2) Packed signed Int32 */ #define cvtps2pi_m2r(var, mmreg) sse_m2r(cvtps2pi, var, mmreg) #define cvtps2pi_r2r(xmmreg, mmreg) sse_r2r(cvtps2pi, mmreg, xmmreg) /* ConVerT with Truncate Packed Single-fp to(2) Packed Int32 */ #define cvttps2pi_m2r(var, mmreg) sse_m2r(cvttps2pi, var, mmreg) #define cvttps2pi_r2r(xmmreg, mmreg) sse_r2r(cvttps2pi, mmreg, xmmreg) /* ConVerT Signed Int32 to(2) Single-fp (Scalar) */ #define cvtsi2ss_m2r(var, xmmreg) sse_m2r(cvtsi2ss, var, xmmreg) #define cvtsi2ss_r2r(reg, xmmreg) sse_r2r(cvtsi2ss, reg, xmmreg) /* ConVerT Scalar Single-fp to(2) Signed Int32 */ #define cvtss2si_m2r(var, reg) sse_m2r(cvtss2si, var, reg) #define cvtss2si_r2r(xmmreg, reg) sse_r2r(cvtss2si, xmmreg, reg) /* ConVerT with Truncate Scalar Single-fp to(2) Signed Int32 */ #define cvttss2si_m2r(var, reg) sse_m2r(cvtss2si, var, reg) #define cvttss2si_r2r(xmmreg, reg) sse_r2r(cvtss2si, xmmreg, reg) /* Parallel EXTRact Word from 4x16 */ #define pextrw_r2r(mmreg, reg, field) sse_r2ri(pextrw, mmreg, reg, field) /* Parallel INSeRt Word from 4x16 */ #define pinsrw_r2r(reg, mmreg, field) sse_r2ri(pinsrw, reg, mmreg, field) /* MOVe MaSK from Packed Single-fp */ #ifdef SSE_TRACE #define movmskps(xmmreg, reg) \ { \ fprintf(stderr, "movmskps()\n"); \ __asm__ __volatile__ ("movmskps %" #xmmreg ", %" #reg) \ } #else #define movmskps(xmmreg, reg) \ __asm__ __volatile__ ("movmskps %" #xmmreg ", %" #reg) #endif /* Parallel MOVe MaSK from mmx reg to 32-bit reg */ #ifdef SSE_TRACE #define pmovmskb(mmreg, reg) \ { \ fprintf(stderr, "movmskps()\n"); \ __asm__ __volatile__ ("movmskps %" #mmreg ", %" #reg) \ } #else #define pmovmskb(mmreg, reg) \ __asm__ __volatile__ ("movmskps %" #mmreg ", %" #reg) #endif /* MASKed MOVe from 8x8 to memory pointed to by (e)di register */ #define maskmovq(mmregs, fieldreg) sse_r2ri(maskmovq, mmregs, fieldreg) /* 4x32f Parallel ADDs */ #define addps_m2r(var, reg) sse_m2r(addps, var, reg) #define addps_r2r(regs, regd) sse_r2r(addps, regs, regd) #define addps(vars, vard, xmmreg) sse_m2m(addps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel ADDs */ #define addss_m2r(var, reg) sse_m2r(addss, var, reg) #define addss_r2r(regs, regd) sse_r2r(addss, regs, regd) #define addss(vars, vard, xmmreg) sse_m2m(addss, vars, vard, xmmreg) /* 4x32f Parallel SUBs */ #define subps_m2r(var, reg) sse_m2r(subps, var, reg) #define subps_r2r(regs, regd) sse_r2r(subps, regs, regd) #define subps(vars, vard, xmmreg) sse_m2m(subps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel SUBs */ #define subss_m2r(var, reg) sse_m2r(subss, var, reg) #define subss_r2r(regs, regd) sse_r2r(subss, regs, regd) #define subss(vars, vard, xmmreg) sse_m2m(subss, vars, vard, xmmreg) /* 8x8u -> 4x16u Packed Sum of Absolute Differences */ #define psadbw_m2r(var, reg) sse_m2r(psadbw, var, reg) #define psadbw_r2r(regs, regd) sse_r2r(psadbw, regs, regd) #define psadbw(vars, vard, mmreg) sse_m2m(psadbw, vars, vard, mmreg) /* 4x16u Parallel MUL High Unsigned */ #define pmulhuw_m2r(var, reg) sse_m2r(pmulhuw, var, reg) #define pmulhuw_r2r(regs, regd) sse_r2r(pmulhuw, regs, regd) #define pmulhuw(vars, vard, mmreg) sse_m2m(pmulhuw, vars, vard, mmreg) /* 4x32f Parallel MULs */ #define mulps_m2r(var, reg) sse_m2r(mulps, var, reg) #define mulps_r2r(regs, regd) sse_r2r(mulps, regs, regd) #define mulps(vars, vard, xmmreg) sse_m2m(mulps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel MULs */ #define mulss_m2r(var, reg) sse_m2r(mulss, var, reg) #define mulss_r2r(regs, regd) sse_r2r(mulss, regs, regd) #define mulss(vars, vard, xmmreg) sse_m2m(mulss, vars, vard, xmmreg) /* 4x32f Parallel DIVs */ #define divps_m2r(var, reg) sse_m2r(divps, var, reg) #define divps_r2r(regs, regd) sse_r2r(divps, regs, regd) #define divps(vars, vard, xmmreg) sse_m2m(divps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel DIVs */ #define divss_m2r(var, reg) sse_m2r(divss, var, reg) #define divss_r2r(regs, regd) sse_r2r(divss, regs, regd) #define divss(vars, vard, xmmreg) sse_m2m(divss, vars, vard, xmmreg) /* 4x32f Parallel Reciprocals */ #define rcpps_m2r(var, reg) sse_m2r(rcpps, var, reg) #define rcpps_r2r(regs, regd) sse_r2r(rcpps, regs, regd) #define rcpps(vars, vard, xmmreg) sse_m2m(rcpps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel Reciprocals */ #define rcpss_m2r(var, reg) sse_m2r(rcpss, var, reg) #define rcpss_r2r(regs, regd) sse_r2r(rcpss, regs, regd) #define rcpss(vars, vard, xmmreg) sse_m2m(rcpss, vars, vard, xmmreg) /* 4x32f Parallel Square Root of Reciprocals */ #define rsqrtps_m2r(var, reg) sse_m2r(rsqrtps, var, reg) #define rsqrtps_r2r(regs, regd) sse_r2r(rsqrtps, regs, regd) #define rsqrtps(vars, vard, xmmreg) sse_m2m(rsqrtps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel Square Root of Reciprocals */ #define rsqrtss_m2r(var, reg) sse_m2r(rsqrtss, var, reg) #define rsqrtss_r2r(regs, regd) sse_r2r(rsqrtss, regs, regd) #define rsqrtss(vars, vard, xmmreg) sse_m2m(rsqrtss, vars, vard, xmmreg) /* 4x32f Parallel Square Roots */ #define sqrtps_m2r(var, reg) sse_m2r(sqrtps, var, reg) #define sqrtps_r2r(regs, regd) sse_r2r(sqrtps, regs, regd) #define sqrtps(vars, vard, xmmreg) sse_m2m(sqrtps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel Square Roots */ #define sqrtss_m2r(var, reg) sse_m2r(sqrtss, var, reg) #define sqrtss_r2r(regs, regd) sse_r2r(sqrtss, regs, regd) #define sqrtss(vars, vard, xmmreg) sse_m2m(sqrtss, vars, vard, xmmreg) /* 8x8u and 4x16u Parallel AVeraGe */ #define pavgb_m2r(var, reg) sse_m2r(pavgb, var, reg) #define pavgb_r2r(regs, regd) sse_r2r(pavgb, regs, regd) #define pavgb(vars, vard, mmreg) sse_m2m(pavgb, vars, vard, mmreg) #define pavgw_m2r(var, reg) sse_m2r(pavgw, var, reg) #define pavgw_r2r(regs, regd) sse_r2r(pavgw, regs, regd) #define pavgw(vars, vard, mmreg) sse_m2m(pavgw, vars, vard, mmreg) /* 1x128 bitwise AND */ #define andps_m2r(var, reg) sse_m2r(andps, var, reg) #define andps_r2r(regs, regd) sse_r2r(andps, regs, regd) #define andps(vars, vard, xmmreg) sse_m2m(andps, vars, vard, xmmreg) /* 1x128 bitwise AND with Not the destination */ #define andnps_m2r(var, reg) sse_m2r(andnps, var, reg) #define andnps_r2r(regs, regd) sse_r2r(andnps, regs, regd) #define andnps(vars, vard, xmmreg) sse_m2m(andnps, vars, vard, xmmreg) /* 1x128 bitwise OR */ #define orps_m2r(var, reg) sse_m2r(orps, var, reg) #define orps_r2r(regs, regd) sse_r2r(orps, regs, regd) #define orps(vars, vard, xmmreg) sse_m2m(orps, vars, vard, xmmreg) /* 1x128 bitwise eXclusive OR */ #define xorps_m2r(var, reg) sse_m2r(xorps, var, reg) #define xorps_r2r(regs, regd) sse_r2r(xorps, regs, regd) #define xorps(vars, vard, xmmreg) sse_m2m(xorps, vars, vard, xmmreg) /* 8x8u, 4x16, and 4x32f Parallel Maximum */ #define pmaxub_m2r(var, reg) sse_m2r(pmaxub, var, reg) #define pmaxub_r2r(regs, regd) sse_r2r(pmaxub, regs, regd) #define pmaxub(vars, vard, mmreg) sse_m2m(pmaxub, vars, vard, mmreg) #define pmaxsw_m2r(var, reg) sse_m2r(pmaxsw, var, reg) #define pmaxsw_r2r(regs, regd) sse_r2r(pmaxsw, regs, regd) #define pmaxsw(vars, vard, mmreg) sse_m2m(pmaxsw, vars, vard, mmreg) #define maxps_m2r(var, reg) sse_m2r(maxps, var, reg) #define maxps_r2r(regs, regd) sse_r2r(maxps, regs, regd) #define maxps(vars, vard, xmmreg) sse_m2m(maxps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel Maximum */ #define maxss_m2r(var, reg) sse_m2r(maxss, var, reg) #define maxss_r2r(regs, regd) sse_r2r(maxss, regs, regd) #define maxss(vars, vard, xmmreg) sse_m2m(maxss, vars, vard, xmmreg) /* 8x8u, 4x16, and 4x32f Parallel Minimum */ #define pminub_m2r(var, reg) sse_m2r(pminub, var, reg) #define pminub_r2r(regs, regd) sse_r2r(pminub, regs, regd) #define pminub(vars, vard, mmreg) sse_m2m(pminub, vars, vard, mmreg) #define pminsw_m2r(var, reg) sse_m2r(pminsw, var, reg) #define pminsw_r2r(regs, regd) sse_r2r(pminsw, regs, regd) #define pminsw(vars, vard, mmreg) sse_m2m(pminsw, vars, vard, mmreg) #define minps_m2r(var, reg) sse_m2r(minps, var, reg) #define minps_r2r(regs, regd) sse_r2r(minps, regs, regd) #define minps(vars, vard, xmmreg) sse_m2m(minps, vars, vard, xmmreg) /* Lowest Field of 4x32f Parallel Minimum */ #define minss_m2r(var, reg) sse_m2r(minss, var, reg) #define minss_r2r(regs, regd) sse_r2r(minss, regs, regd) #define minss(vars, vard, xmmreg) sse_m2m(minss, vars, vard, xmmreg) /* 4x32f Parallel CoMPares (resulting fields are either 0 or -1) */ #define cmpps_m2r(var, reg, op) sse_m2ri(cmpps, var, reg, op) #define cmpps_r2r(regs, regd, op) sse_r2ri(cmpps, regs, regd, op) #define cmpps(vars, vard, op, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, op) #define cmpeqps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 0) #define cmpeqps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 0) #define cmpeqps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 0) #define cmpltps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 1) #define cmpltps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 1) #define cmpltps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 1) #define cmpleps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 2) #define cmpleps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 2) #define cmpleps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 2) #define cmpunordps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 3) #define cmpunordps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 3) #define cmpunordps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 3) #define cmpneqps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 4) #define cmpneqps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 4) #define cmpneqps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 4) #define cmpnltps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 5) #define cmpnltps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 5) #define cmpnltps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 5) #define cmpnleps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 6) #define cmpnleps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 6) #define cmpnleps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 6) #define cmpordps_m2r(var, reg) sse_m2ri(cmpps, var, reg, 7) #define cmpordps_r2r(regs, regd) sse_r2ri(cmpps, regs, regd, 7) #define cmpordps(vars, vard, xmmreg) sse_m2mi(cmpps, vars, vard, xmmreg, 7) /* Lowest Field of 4x32f Parallel CoMPares (resulting fields are either 0 or -1) */ #define cmpss_m2r(var, reg, op) sse_m2ri(cmpss, var, reg, op) #define cmpss_r2r(regs, regd, op) sse_r2ri(cmpss, regs, regd, op) #define cmpss(vars, vard, op, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, op) #define cmpeqss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 0) #define cmpeqss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 0) #define cmpeqss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 0) #define cmpltss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 1) #define cmpltss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 1) #define cmpltss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 1) #define cmpless_m2r(var, reg) sse_m2ri(cmpss, var, reg, 2) #define cmpless_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 2) #define cmpless(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 2) #define cmpunordss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 3) #define cmpunordss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 3) #define cmpunordss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 3) #define cmpneqss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 4) #define cmpneqss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 4) #define cmpneqss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 4) #define cmpnltss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 5) #define cmpnltss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 5) #define cmpnltss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 5) #define cmpnless_m2r(var, reg) sse_m2ri(cmpss, var, reg, 6) #define cmpnless_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 6) #define cmpnless(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 6) #define cmpordss_m2r(var, reg) sse_m2ri(cmpss, var, reg, 7) #define cmpordss_r2r(regs, regd) sse_r2ri(cmpss, regs, regd, 7) #define cmpordss(vars, vard, xmmreg) sse_m2mi(cmpss, vars, vard, xmmreg, 7) /* Lowest Field of 4x32f Parallel CoMPares to set EFLAGS (resulting fields are either 0 or -1) */ #define comiss_m2r(var, reg) sse_m2r(comiss, var, reg) #define comiss_r2r(regs, regd) sse_r2r(comiss, regs, regd) #define comiss(vars, vard, xmmreg) sse_m2m(comiss, vars, vard, xmmreg) /* Lowest Field of 4x32f Unordered Parallel CoMPares to set EFLAGS (resulting fields are either 0 or -1) */ #define ucomiss_m2r(var, reg) sse_m2r(ucomiss, var, reg) #define ucomiss_r2r(regs, regd) sse_r2r(ucomiss, regs, regd) #define ucomiss(vars, vard, xmmreg) sse_m2m(ucomiss, vars, vard, xmmreg) /* 2-(4x32f) -> 4x32f UNPaCK Low Packed Single-fp (interleaves low half of dest with low half of source as padding in each result field) */ #define unpcklps_m2r(var, reg) sse_m2r(unpcklps, var, reg) #define unpcklps_r2r(regs, regd) sse_r2r(unpcklps, regs, regd) /* 2-(4x32f) -> 4x32f UNPaCK High Packed Single-fp (interleaves high half of dest with high half of source as padding in each result field) */ #define unpckhps_m2r(var, reg) sse_m2r(unpckhps, var, reg) #define unpckhps_r2r(regs, regd) sse_r2r(unpckhps, regs, regd) /* Fp and mmX ReSTORe state */ #ifdef SSE_TRACE #define fxrstor(mem) \ { \ fprintf(stderr, "fxrstor()\n"); \ __asm__ __volatile__ ("fxrstor %0" \ : /* nothing */ \ : "X" (mem)) \ } #else #define fxrstor(mem) \ __asm__ __volatile__ ("fxrstor %0" \ : /* nothing */ \ : "X" (mem)) #endif /* Fp and mmX SAVE state */ #ifdef SSE_TRACE #define fxsave(mem) \ { \ fprintf(stderr, "fxsave()\n"); \ __asm__ __volatile__ ("fxsave %0" \ : /* nothing */ \ : "X" (mem)) \ } #else #define fxsave(mem) \ __asm__ __volatile__ ("fxsave %0" \ : /* nothing */ \ : "X" (mem)) #endif /* STore streaMing simd eXtensions Control/Status Register */ #ifdef SSE_TRACE #define stmxcsr(mem) \ { \ fprintf(stderr, "stmxcsr()\n"); \ __asm__ __volatile__ ("stmxcsr %0" \ : /* nothing */ \ : "X" (mem)) \ } #else #define stmxcsr(mem) \ __asm__ __volatile__ ("stmxcsr %0" \ : /* nothing */ \ : "X" (mem)) #endif /* LoaD streaMing simd eXtensions Control/Status Register */ #ifdef SSE_TRACE #define ldmxcsr(mem) \ { \ fprintf(stderr, "ldmxcsr()\n"); \ __asm__ __volatile__ ("ldmxcsr %0" \ : /* nothing */ \ : "X" (mem)) \ } #else #define ldmxcsr(mem) \ __asm__ __volatile__ ("ldmxcsr %0" \ : /* nothing */ \ : "X" (mem)) #endif /* Store FENCE - enforce ordering of stores before fence vs. stores occuring after fence in source code. */ #ifdef SSE_TRACE #define sfence() \ { \ fprintf(stderr, "sfence()\n"); \ __asm__ __volatile__ ("sfence\n\t") \ } #else #define sfence() \ __asm__ __volatile__ ("sfence\n\t") #endif /* PREFETCH data using T0, T1, T2, or NTA hint T0 = Prefetch into all cache levels T1 = Prefetch into all cache levels except 0th level T2 = Prefetch into all cache levels except 0th and 1st levels NTA = Prefetch data into non-temporal cache structure */ #ifdef SSE_TRACE #else #define prefetch(mem, hint) \ __asm__ __volatile__ ("prefetch" #hint " %0" \ : /* nothing */ \ : "X" (mem)) #define prefetcht0(mem) prefetch(mem, t0) #define prefetcht1(mem) prefetch(mem, t1) #define prefetcht2(mem) prefetch(mem, t2) #define prefetchnta(mem) prefetch(mem, nta) #endif #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/0000755000175000017500000000000011720565302020641 500000000000000gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA6.inc0000644000175000017500000000130011671175353024133 00000000000000// -*- c++ -*- // Searches 3 pixels to the left and right, in both the old // and new fields, but takes averages. These are odd // pixel addresses. Any chroma match will not be used. (YUY2) MERGE4PIXavg("-6(%%"XDI")", "6(%%"XSI", %%"XCX", 2)") // up left, down right MERGE4PIXavg("6(%%"XDI")", "-6(%%"XSI", %%"XCX", 2)") // up right, down left MERGE4PIXavg("-6(%%"XDI", %%"XCX")", "6(%%"XSI", %%"XCX")") // left, right MERGE4PIXavg("6(%%"XDI", %%"XCX")", "-6(%%"XSI", %%"XCX")") // right, left MERGE4PIXavg("-6(%%"XDI", %%"XCX", 2)", "6(%%"XSI")") // down left, up right MERGE4PIXavg("6(%%"XDI", %%"XCX", 2)", "-6(%%"XSI")") // down right, up left gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA2.inc0000644000175000017500000000052411671175353024136 00000000000000// Searches 1 pixel to the left and right, in both the old // and new fields, but takes averages. These are odd // pixel addresses. Any chroma match will not be used. (YUY2) MERGE4PIXavg("-2(%%"XDI", %%"XCX")", "2(%%"XSI", %%"XCX")") // left, right MERGE4PIXavg("2(%%"XDI", %%"XCX")", "-2(%%"XSI", %%"XCX")") // right, left gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll.inc0000644000175000017500000001711111707374600023747 00000000000000/* * GStreamer * Copyright (c) 2002 Tom Barry All rights reserved. * * 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifndef TopFirst #define TopFirst IsOdd #endif #ifdef SEFUNC #undef SEFUNC #endif #if defined(IS_MMXEXT) #define SEFUNC(x) Search_Effort_MMXEXT_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) #elif defined(IS_3DNOW) #define SEFUNC(x) Search_Effort_3DNOW_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) #elif defined(IS_MMX) #define SEFUNC(x) Search_Effort_MMX_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) #else #define SEFUNC(x) Search_Effort_C_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight) #endif #include "TomsMoCompAll2.inc" #define USE_STRANGE_BOB #include "TomsMoCompAll2.inc" #undef USE_STRANGE_BOB #undef SEFUNC #if defined(IS_MMXEXT) #define SEFUNC(x) Search_Effort_MMXEXT_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) #elif defined(IS_3DNOW) #define SEFUNC(x) Search_Effort_3DNOW_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) #elif defined(IS_MMX) #define SEFUNC(x) Search_Effort_MMX_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) #else #define SEFUNC(x) Search_Effort_C_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight) #endif static void FUNCT_NAME(GstDeinterlaceMethod *d_method, const GstDeinterlaceField* history, guint history_count, GstBuffer *outbuf, int cur_field_idx) { GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (d_method); glong SearchEffort = self->search_effort; gint UseStrangeBob = self->strange_bob; gint IsOdd; const guint8 *pWeaveSrc; const guint8 *pWeaveSrcP; guint8 *pWeaveDest; const guint8 *pCopySrc; const guint8 *pCopySrcP; guint8 *pCopyDest; gint src_pitch; gint dst_pitch; gint rowsize; gint FldHeight; if (cur_field_idx + 2 > history_count || cur_field_idx < 1) { GstDeinterlaceMethod *backup_method; backup_method = g_object_new (gst_deinterlace_method_linear_get_type(), NULL); gst_deinterlace_method_setup (backup_method, d_method->format, d_method->frame_width, d_method->frame_height); gst_deinterlace_method_deinterlace_frame (backup_method, history, history_count, outbuf, cur_field_idx); g_object_unref (backup_method); return; } /* double stride do address just every odd/even scanline */ src_pitch = self->parent.row_stride[0]*2; dst_pitch = self->parent.row_stride[0]; rowsize = self->parent.row_stride[0]; FldHeight = self->parent.frame_height / 2; pCopySrc = GST_BUFFER_DATA(history[history_count-1].buf); if (history[history_count - 1].flags & PICTURE_INTERLACED_BOTTOM) pCopySrc += rowsize; pCopySrcP = GST_BUFFER_DATA(history[history_count-3].buf); if (history[history_count - 3].flags & PICTURE_INTERLACED_BOTTOM) pCopySrcP += rowsize; pWeaveSrc = GST_BUFFER_DATA(history[history_count-2].buf); if (history[history_count - 2].flags & PICTURE_INTERLACED_BOTTOM) pWeaveSrc += rowsize; pWeaveSrcP = GST_BUFFER_DATA(history[history_count-4].buf); if (history[history_count - 4].flags & PICTURE_INTERLACED_BOTTOM) pWeaveSrcP += rowsize; /* use bottom field and interlace top field */ if (history[history_count-2].flags == PICTURE_INTERLACED_BOTTOM) { IsOdd = 1; // if we have an odd field we copy an even field and weave an odd field pCopyDest = GST_BUFFER_DATA(outbuf); pWeaveDest = pCopyDest + dst_pitch; } /* do it vice verca */ else { IsOdd = 0; // if we have an even field we copy an odd field and weave an even field pCopyDest = GST_BUFFER_DATA(outbuf) + dst_pitch; pWeaveDest = GST_BUFFER_DATA(outbuf); } // copy 1st and last weave lines Fieldcopy(pWeaveDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch); Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2, pCopySrc+(FldHeight-1)*src_pitch, rowsize, 1, dst_pitch*2, src_pitch); #ifdef USE_VERTICAL_FILTER // Vertical Filter currently not implemented for DScaler !! // copy 1st and last lines the copy field Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch); Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2, pCopySrc+(FldHeight-1)*src_pitch, rowsize, 1, dst_pitch*2, src_pitch); #else // copy all of the copy field Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch); #endif // then go fill in the hard part, being variously lazy depending upon // SearchEffort if(!UseStrangeBob) { if (SearchEffort == 0) { SEFUNC(0); } else if (SearchEffort <= 1) { SEFUNC(1); } /* else if (SearchEffort <= 2) { SEFUNC(2); } */ else if (SearchEffort <= 3) { SEFUNC(3); } else if (SearchEffort <= 5) { SEFUNC(5); } else if (SearchEffort <= 9) { SEFUNC(9); } else if (SearchEffort <= 11) { SEFUNC(11); } else if (SearchEffort <= 13) { SEFUNC(13); } else if (SearchEffort <= 15) { SEFUNC(15); } else if (SearchEffort <= 19) { SEFUNC(19); } else if (SearchEffort <= 21) { SEFUNC(21); } else { SEFUNC(Max); } } else { if (SearchEffort == 0) { SEFUNC(0SB); } else if (SearchEffort <= 1) { SEFUNC(1SB); } /* else if (SearchEffort <= 2) { SEFUNC(2SB); } */ else if (SearchEffort <= 3) { SEFUNC(3SB); } else if (SearchEffort <= 5) { SEFUNC(5SB); } else if (SearchEffort <= 9) { SEFUNC(9SB); } else if (SearchEffort <= 11) { SEFUNC(11SB); } else if (SearchEffort <= 13) { SEFUNC(13SB); } else if (SearchEffort <= 15) { SEFUNC(15SB); } else if (SearchEffort <= 19) { SEFUNC(19SB); } else if (SearchEffort <= 21) { SEFUNC(21SB); } else { SEFUNC(MaxSB); } } #if defined(BUILD_X86_ASM) && !defined(IS_C) __asm__ __volatile__("emms"); #endif } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopVAH.inc0000644000175000017500000000061611671175353023665 00000000000000// -*- c++ -*- // Searches the center vertical line above center and below, in both the old // and new fields, but takes averages. These are even pixel addresses. MERGE4PIXavgH("(%%"XDI", %%"XCX", 2)", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "(%%"XSI")") // down, up MERGE4PIXavgH("(%%"XDI")", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "(%%"XSI", %%"XCX", 2)") // up, down gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/TomsMoCompAll2.inc0000644000175000017500000001341011671175353024033 00000000000000// -*- c++ -*- #ifdef SEARCH_EFFORT_FUNC #undef SEARCH_EFFORT_FUNC #endif #ifdef USE_STRANGE_BOB #define SEARCH_EFFORT_FUNC(n) SEFUNC(n##SB) #else #define SEARCH_EFFORT_FUNC(n) SEFUNC(n) #endif static inline int SEARCH_EFFORT_FUNC(0) // we don't try at all ;-) { //see Search_Effort_Max() for comments #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH } static inline int SEARCH_EFFORT_FUNC(1) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see Search_Effort_Max() for comments #include "SearchLoopTop.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } static inline int SEARCH_EFFORT_FUNC(3) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see Search_Effort_Max() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA2.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } static inline int SEARCH_EFFORT_FUNC(5) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see Search_Effort_Max() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA2.inc" #include "SearchLoopOddAH2.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // 3x3 search static inline int SEARCH_EFFORT_FUNC(9) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchEffortMax() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoopVA.inc" #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // Search 9 with 2 H-half pels added static inline int SEARCH_EFFORT_FUNC(11) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchEffortMax() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA.inc" #include "SearchLoopOddAH2.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoopVA.inc" #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // Search 11 with 2 V-half pels added static inline int SEARCH_EFFORT_FUNC(13) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchEffortMax() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA.inc" #include "SearchLoopOddAH2.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoopVAH.inc" #include "SearchLoopVA.inc" #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // 5x3 static inline int SEARCH_EFFORT_FUNC(15) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchEffortMax() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoopEdgeA.inc" #include "SearchLoopVA.inc" #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // 5x3 + 4 half pels static inline int SEARCH_EFFORT_FUNC(19) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchEffortMax() for comments #include "SearchLoopTop.inc" #include "SearchLoopOddA.inc" #include "SearchLoopOddAH2.inc" RESET_CHROMA // pretend chroma diffs was 255 each #include "SearchLoopEdgeA.inc" #include "SearchLoopVAH.inc" #include "SearchLoopVA.inc" #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // Handle one 4x1 block of pixels // Search a 7x3 area, no half pels static inline int SEARCH_EFFORT_FUNC(21) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchLoopTop.inc for comments #include "SearchLoopTop.inc" // odd addresses -- the pixels at odd address wouldn't generate // good luma values but we will mask those off #include "SearchLoopOddA6.inc" // 4 odd v half pels, 3 to left & right #include "SearchLoopOddA.inc" // 6 odd pels, 1 to left & right RESET_CHROMA // pretend chroma diffs was 255 each // even addresses -- use both luma and chroma from these // search averages of 2 pixels left and right #include "SearchLoopEdgeA.inc" // search vertical line and averages, -1,0,+1 #include "SearchLoopVA.inc" // blend our results and loop #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } // Handle one 4x1 block of pixels // Search a 9x3 area, no half pels static inline int SEARCH_EFFORT_FUNC(Max) { #ifdef IS_C #define SKIP_SEARCH #include "SearchLoopTop.inc" #include "SearchLoopBottom.inc" #undef SKIP_SEARCH #else //see SearchLoopTop.inc for comments #include "SearchLoopTop.inc" // odd addresses -- the pixels at odd address wouldn't generate // good luma values but we will mask those off #include "SearchLoopOddA6.inc" // 4 odd v half pels, 3 to left & right #include "SearchLoopOddA.inc" // 6 odd pels, 1 to left & right RESET_CHROMA // pretend chroma diffs was 255 each // even addresses -- use both luma and chroma from these // search averages of 4 pixels left and right #include "SearchLoopEdgeA8.inc" // search averages of 2 pixels left and right #include "SearchLoopEdgeA.inc" // search vertical line and averages, -1,0,+1 #include "SearchLoopVA.inc" // blend our results and loop #include "SearchLoop0A.inc" #include "SearchLoopBottom.inc" #endif } #undef SEARCH_EFFORT_FUNC gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/StrangeBob.inc0000644000175000017500000003456011671175353023322 00000000000000// -*- c++ -*- // First, get and save our possible Bob values // Assume our pixels are layed out as follows with x the calc'd bob value // and the other pixels are from the current field // // j a b c k current field // x calculated line // m d e f n current field // // we calc the bob value luma value as: // if |j - n| < Thres && |a - m| > Thres // avg(j,n) // end if // if |k - m| < Thres && |c - n| > Thres // avg(k,m) // end if // if |c - d| < Thres && |b - f| > Thres // avg(c,d) // end if // if |a - f| < Thres && |b - d| > Thres // avg(a,f) // end if // if |b - e| < Thres // avg(b,e) // end if // pickup any thing not yet set with avg(b,e) #ifndef IS_C // j, n "pxor %%mm5, %%mm5\n\t" "pxor %%mm6, %%mm6\n\t" "pxor %%mm7, %%mm7\n\t" "movq -2(%%"XBX"), %%mm0\n\t" // value a from top left "movq -4(%%"XBX", %%"XCX"), %%mm1\n\t" // value m from bottom right "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(a,m) "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(a,m) > Thres else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(a,m) < Thres, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(a,m) > Thres, else 00 "movq -4(%%"XBX"), %%mm0\n\t" // value j "movq 4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(j,n) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm0\n\t" "psubusb %%mm3, %%mm1\n\t" "por %%mm1, %%mm0\n\t" // abs(j,n) "movq %%mm0, %%mm1\n\t" "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(j,n) > Thres else 0 "pxor %%mm3, %%mm3\n\t" "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(j,n) < Thres, else 00 "pand %%mm4, %%mm1\n\t" "pand %%mm1, %%mm2\n\t" "pand %%mm1, %%mm0\n\t" "movq %%mm1, %%mm3\n\t" "pxor %%mm5, %%mm3\n\t" "pand %%mm3, %%mm6\n\t" "pand %%mm3, %%mm7\n\t" "pand %%mm3, %%mm5\n\t" "por %%mm1, %%mm5\n\t" "por %%mm2, %%mm6\n\t" "por %%mm0, %%mm7\n\t" // k & m "movq 2(%%"XBX"), %%mm0\n\t" // value c from top left "movq 4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n from bottom right "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(c,n) "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(c,n) > Thres else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(c,n) < Thres, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(c,n) > Thres, else 00 "movq 4(%%"XBX"), %%mm0\n\t" // value k "movq -4(%%"XBX", %%"XCX"), %%mm1\n\t" // value m "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(k,m) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm0\n\t" "psubusb %%mm3, %%mm1\n\t" "por %%mm1, %%mm0\n\t" // abs(k,m) "movq %%mm0, %%mm1\n\t" "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(k,m) > Thres else 0 "pxor %%mm3, %%mm3\n\t" "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(k,m) < Thres, else 00 "pand %%mm4, %%mm1\n\t" "pand %%mm1, %%mm2\n\t" "pand %%mm1, %%mm0\n\t" "movq %%mm1, %%mm3\n\t" "pxor %%mm5, %%mm3\n\t" "pand %%mm3, %%mm6\n\t" "pand %%mm3, %%mm7\n\t" "pand %%mm3, %%mm5\n\t" "por %%mm1, %%mm5\n\t" "por %%mm2, %%mm6\n\t" "por %%mm0, %%mm7\n\t" // c & d "movq (%%"XBX"), %%mm0\n\t" // value b from top left "movq 2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f from bottom right "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(b,f) "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(b,f) > Thres else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(b,f) < Thres, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(b,f) > Thres, else 00 "movq 2(%%"XBX"), %%mm0\n\t" // value c "movq -2(%%"XBX", %%"XCX"), %%mm1\n\t" // value d "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(c,d) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm0\n\t" "psubusb %%mm3, %%mm1\n\t" "por %%mm1, %%mm0\n\t" // abs(c,d) "movq %%mm0, %%mm1\n\t" "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(c,d) > Thres else 0 "pxor %%mm3, %%mm3\n\t" "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(c,d) < Thres, else 00 "pand %%mm4, %%mm1\n\t" "pand %%mm1, %%mm2\n\t" "pand %%mm1, %%mm0\n\t" "movq %%mm1, %%mm3\n\t" "pxor %%mm5, %%mm3\n\t" "pand %%mm3, %%mm6\n\t" "pand %%mm3, %%mm7\n\t" "pand %%mm3, %%mm5\n\t" "por %%mm1, %%mm5\n\t" "por %%mm2, %%mm6\n\t" "por %%mm0, %%mm7\n\t" // a & f "movq (%%"XBX"), %%mm0\n\t" // value b from top left "movq -2(%%"XBX", %%"XCX"), %%mm1\n\t" // value d from bottom right "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(b,d) "psubusb "_DiffThres", %%mm3\n\t" // nonzero where abs(b,d) > Thres else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where abs(b,d) < Thres, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where abs(b,d) > Thres, else 00 "movq -2(%%"XBX"), %%mm0\n\t" // value a "movq 2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(a,f) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm0\n\t" "psubusb %%mm3, %%mm1\n\t" "por %%mm1, %%mm0\n\t" // abs(a,f) "movq %%mm0, %%mm1\n\t" "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(a,f) > Thres else 0 "pxor %%mm3, %%mm3\n\t" "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(a,f) < Thres, else 00 "pand %%mm4, %%mm1\n\t" "pand %%mm1, %%mm2\n\t" "pand %%mm1, %%mm0\n\t" "movq %%mm1, %%mm3\n\t" "pxor %%mm5, %%mm3\n\t" "pand %%mm3, %%mm6\n\t" "pand %%mm3, %%mm7\n\t" "pand %%mm3, %%mm5\n\t" "por %%mm1, %%mm5\n\t" "por %%mm2, %%mm6\n\t" "por %%mm0, %%mm7\n\t" "pand "_YMask", %%mm5\n\t" // mask out chroma from here "pand "_YMask", %%mm6\n\t" // mask out chroma from here "pand "_YMask", %%mm7\n\t" // mask out chroma from here // b,e "movq (%%"XBX"), %%mm0\n\t" // value b from top "movq (%%"XBX", %%"XCX"), %%mm1\n\t" // value e from bottom "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(b,e) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm0\n\t" "psubusb %%mm3, %%mm1\n\t" "por %%mm1, %%mm0\n\t" // abs(b,e) "movq %%mm0, %%mm1\n\t" "psubusb "_DiffThres", %%mm1\n\t" // nonzero where abs(b,e) > Thres else 0 "pxor %%mm3, %%mm3\n\t" "pcmpeqb %%mm3, %%mm1\n\t" // now ff where abs(b,e) < Thres, else 00 "pand %%mm1, %%mm2\n\t" "pand %%mm1, %%mm0\n\t" "movq %%mm1, %%mm3\n\t" "pxor %%mm5, %%mm3\n\t" "pand %%mm3, %%mm6\n\t" "pand %%mm3, %%mm7\n\t" "pand %%mm3, %%mm5\n\t" "por %%mm1, %%mm5\n\t" "por %%mm2, %%mm6\n\t" "por %%mm0, %%mm7\n\t" // bob in any leftovers "movq (%%"XBX"), %%mm0\n\t" // value b from top "movq (%%"XBX", %%"XCX"), %%mm1\n\t" // value e from bottom // We will also calc here the max/min values to later limit comb // so the max excursion will not exceed the Max_Comb constant #ifdef SKIP_SEARCH "movq %%mm0, %%mm2\n\t" // pminub %%mm2, %%mm1 V_PMINUB ("%%mm2", "%%mm1", "%%mm4") // pmaxub %%mm6, %%mm2 // clip our current results so far to be above this V_PMAXUB ("%%mm6", "%%mm2") "movq %%mm0, %%mm2\n\t" V_PMAXUB ("%%mm2", "%%mm1") // pminub %%mm6, %%mm2 // clip our current results so far to be below this V_PMINUB ("%%mm6", "%%mm2", "%%mm4") #else "movq %%mm0, %%mm2\n\t" "movq (%%"XAX"), %%mm4\n\t" "psubusb %%mm4, %%mm2\n\t" "psubusb %%mm0, %%mm4\n\t" "por %%mm2, %%mm4\n\t" // abs diff "movq %%mm1, %%mm2\n\t" "movq (%%"XAX", %%"XCX"), %%mm3\n\t" "psubusb %%mm3, %%mm2\n\t" "psubusb %%mm1, %%mm3\n\t" "por %%mm2, %%mm3\n\t" // abs diff // pmaxub %%mm3, %%mm4 // top or bottom pixel moved most V_PMAXUB ("%%mm3", "%%mm4") // top or bottom pixel moved most "psubusb "_DiffThres", %%mm3\n\t" // moved more than allowed? or goes to 0? "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where low motion, else high motion "movq %%mm0, %%mm2\n\t" // pminub %%mm2, %%mm1 V_PMINUB ("%%mm2", "%%mm1", "%%mm4") // pmaxub %%mm6, %%mm2 // clip our current results so far to be above this V_PMAXUB ("%%mm6", "%%mm2") "psubusb %%mm3, %%mm2\n\t" // maybe decrease it to 0000.. if no surround motion "movq %%mm2, "_Min_Vals"\n\t" "movq %%mm0, %%mm2\n\t" V_PMAXUB ("%%mm2", "%%mm1") // pminub %%mm6, %%mm2 // clip our current results so far to be below this V_PMINUB ("%%mm6", "%%mm2", "%%mm4") "paddusb %%mm3, %%mm2\n\t" // maybe increase it to ffffff if no surround motion "movq %%mm2, "_Max_Vals"\n\t" #endif "movq %%mm0, %%mm2\n\t" // pavgb %%mm2, %%mm1 // avg(b,e) V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(b,e) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(b,e) "movq %%mm3, %%mm1\n\t" // keep copy of diffs "pxor %%mm4, %%mm4\n\t" "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0 "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00 "pcmpeqb %%mm0, %%mm0\n\t" "pandn %%mm0, %%mm5\n\t" "por %%mm5, %%mm3\n\t" "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00 "pand %%mm3, %%mm1\n\t" "pand %%mm3, %%mm2\n\t" "pand %%mm4, %%mm6\n\t" "pand %%mm4, %%mm7\n\t" "por %%mm2, %%mm6\n\t" // our x2 value "por %%mm1, %%mm7\n\t" // our x2 diffs "movq %%mm7, %%mm4\n\t" // save as bob uncertainty indicator #else diff[0] = -1; diff[1] = -1; best[0] = 0; best[1] = 0; // j, n if (ABS (pBob[-2] - pBob[src_pitch2 - 4]) < DiffThres && ABS (pBob[-4] - pBob[src_pitch2 + 4]) > DiffThres) { best[0] = (pBob[-2] + pBob[src_pitch2 - 4]) / 2; diff[0] = ABS (pBob[-2] - pBob[src_pitch2 - 4]); } if (ABS (pBob[-1] - pBob[src_pitch2 - 3]) < DiffThres && ABS (pBob[-3] - pBob[src_pitch2 + 5]) > DiffThres) { best[1] = (pBob[-1] + pBob[src_pitch2 - 3]) / 2; diff[1] = ABS (pBob[-1] - pBob[src_pitch2 - 3]); } // k & m if (ABS (pBob[2] - pBob[src_pitch2 + 4]) < DiffThres && ABS (pBob[4] - pBob[src_pitch2 - 4]) > DiffThres) { best[0] = (pBob[4] + pBob[src_pitch2 - 4]) / 2; diff[0] = ABS (pBob[4] - pBob[src_pitch2 - 4]); } if (ABS (pBob[3] - pBob[src_pitch2 + 5]) < DiffThres && ABS (pBob[5] - pBob[src_pitch2 - 3]) > DiffThres) { best[1] = (pBob[5] + pBob[src_pitch2 - 3]) / 2; diff[1] = ABS (pBob[5] - pBob[src_pitch2 - 3]); } // c & d if (ABS (pBob[0] - pBob[src_pitch2 + 2]) < DiffThres && ABS (pBob[2] - pBob[src_pitch2 - 2]) > DiffThres) { best[0] = (pBob[2] + pBob[src_pitch2 - 2]) / 2; diff[0] = ABS (pBob[2] - pBob[src_pitch2 - 2]); } if (ABS (pBob[1] - pBob[src_pitch2 + 3]) < DiffThres && ABS (pBob[3] - pBob[src_pitch2 - 1]) > DiffThres) { best[1] = (pBob[3] + pBob[src_pitch2 - 1]) / 2; diff[1] = ABS (pBob[3] - pBob[src_pitch2 - 1]); } // a & f if (ABS (pBob[0] - pBob[src_pitch2 - 2]) < DiffThres && ABS (pBob[-2] - pBob[src_pitch2 + 2]) > DiffThres) { best[0] = (pBob[-2] + pBob[src_pitch2 + 2]) / 2; diff[0] = ABS (pBob[-2] - pBob[src_pitch2 + 2]); } if (ABS (pBob[1] - pBob[src_pitch2 - 1]) < DiffThres && ABS (pBob[-1] - pBob[src_pitch2 + 3]) > DiffThres) { best[1] = (pBob[-1] + pBob[src_pitch2 + 3]) / 2; diff[1] = ABS (pBob[-1] - pBob[src_pitch2 + 3]); } // b,e if (ABS (pBob[0] - pBob[src_pitch2]) < DiffThres) { best[0] = (pBob[0] + pBob[src_pitch2]) / 2; diff[0] = ABS (pBob[0] - pBob[src_pitch2]); } if (ABS (pBob[1] - pBob[src_pitch2 + 1]) < DiffThres) { best[1] = (pBob[1] + pBob[src_pitch2 + 1]) / 2; diff[1] = ABS (pBob[1] - pBob[src_pitch2 + 1]); } // We will also calc here the max/min values to later limit comb // so the max excursion will not exceed the Max_Comb constant #ifdef SKIP_SEARCH best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0])); best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1])); #else mov[0] = MAX (ABS (pBob[0] - pBobP[0]), ABS (pBob[src_pitch2] - pBobP[src_pitch2])); mov[1] = MAX (ABS (pBob[1] - pBobP[1]), ABS (pBob[src_pitch2 + 1] - pBobP[src_pitch2 + 1])); MinVals[0] = 0; MinVals[1] = 0; MaxVals[0] = 255; MaxVals[1] = 255; if (mov[0] > DiffThres) { MinVals[0] = MAX (MIN (pBob[0], pBob[src_pitch2]), best[0]); MaxVals[0] = MIN (MAX (pBob[0], pBob[src_pitch2]), best[0]); } if (mov[1] > DiffThres) { MinVals[1] = MAX (MIN (pBob[1], pBob[src_pitch2+1]), best[1]); MaxVals[1] = MIN (MAX (pBob[1], pBob[src_pitch2+1]), best[1]); } best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0])); best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1])); #endif avg[0] = (pBob[src_pitch2] + pBob[0]) / 2; avg[1] = (pBob[src_pitch2 + 1] + pBob[1]) / 2; diff2[0] = ABS (pBob[src_pitch2 + 1] - pBob[1]); diff2[1] = ABS (pBob[src_pitch2 + 1] - pBob[1]); if (diff[0] == -1 || diff2[0] < diff[0]) { best[0] = avg[0]; diff[0] = diff2[0]; } if (diff[1] == -1 || diff2[1] < diff[1]) { best[1] = avg[1]; diff[1] = diff2[1]; } #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopBottom.inc0000644000175000017500000001266711671175353024524 00000000000000// -*- c++ -*- // Version for non-SSE2 #ifndef IS_C #ifdef SKIP_SEARCH "movq %%mm6, %%mm0\n\t" // just use the results of our wierd bob #else // JA 9/Dec/2002 // failed experiment // but leave in placeholder for me to play about #ifdef DONT_USE_STRANGE_BOB // Use the best weave if diffs less than 10 as that // means the image is still or moving cleanly // if there is motion we will clip which will catch anything "psubusb "_FOURS", %%mm7\n\t" // sets bits to zero if weave diff < 4 "pxor %%mm0, %%mm0\n\t" "pcmpeqb %%mm0, %%mm7\n\t" // all ff where weave better, else 00 "pcmpeqb %%mm7, %%mm0\n\t" // all ff where bob better, else 00 "pand %%mm6, %%mm0\n\t" // use bob for these pixel values "pand %%mm5, %%mm7\n\t" // use weave for these "por %%mm7, %%mm0\n\t" // combine both #else // Use the better of bob or weave // pminub mm4, TENS // the most we care about V_PMINUB ("%%mm4", _TENS, "%%mm0") // the most we care about "psubusb %%mm4, %%mm7\n\t" // foregive that much from weave est? "psubusb "_FOURS", %%mm7\n\t" // bias it a bit toward weave "pxor %%mm0, %%mm0\n\t" "pcmpeqb %%mm0, %%mm7\n\t" // all ff where weave better, else 00 "pcmpeqb %%mm7, %%mm0\n\t" // all ff where bob better, else 00 "pand %%mm6, %%mm0\n\t" // use bob for these pixel values "pand %%mm5, %%mm7\n\t" // use weave for these "por %%mm7, %%mm0\n\t" // combine both #endif // pminub mm0, Max_Vals // but clip to catch the stray error V_PMINUB ("%%mm0", _Max_Vals, "%%mm1") // but clip to catch the stray error // pmaxub mm0, Min_Vals V_PMAXUB ("%%mm0", _Min_Vals) #endif MOVX" "_pDest", %%"XAX"\n\t" #ifdef USE_VERTICAL_FILTER "movq %%mm0, %%mm1\n\t" // pavgb mm0, qword ptr["XBX"] V_PAVGB ("%%mm0", "(%%"XBX")", "%%mm2", _ShiftMask) // movntq qword ptr["XAX"+"XDX"], mm0 V_MOVNTQ ("(%"XAX", %%"XDX")", "%%mm0") // pavgb mm1, qword ptr["XBX"+"XCX"] V_PAVGB ("%%mm1", "(%%"XBX", %%"XCX")", "%%mm2", _ShiftMask) //FIXME: XDX or XAX!! "addq "_dst_pitchw", %%"XBX // movntq qword ptr["XAX"+"XDX"], mm1 V_MOVNTQ ("(%%"XAX", %%"XDX")", "%%mm1") #else // movntq qword ptr["XAX"+"XDX"], mm0 V_MOVNTQ ("(%%"XAX", %%"XDX")", "%%mm0") #endif LEAX" 8(%%"XDX"), %%"XDX"\n\t" // bump offset pointer CMPX" "_Last8", %%"XDX"\n\t" // done with line? "jb 1b\n\t" // y MOVX" "_oldbx", %%"XBX"\n\t" : /* no outputs */ : "m"(pBob), "m"(src_pitch2), "m"(ShiftMask), "m"(pDest), "m"(dst_pitchw), "m"(Last8), "m"(pSrc), "m"(pSrcP), "m"(pBobP), "m"(DiffThres), "m"(Min_Vals), "m"(Max_Vals), "m"(FOURS), "m"(TENS), "m"(ONES), "m"(UVMask), "m"(Max_Mov), "m"(YMask), "m"(oldbx) : XAX, XCX, XDX, XSI, XDI, "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", #ifdef __MMX__ "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", #endif "memory", "cc" ); // adjust for next line pSrc += src_pitch2; pSrcP += src_pitch2; pDest += dst_pitch2; pBob += src_pitch2; pBobP += src_pitch2; } return 0; #else #ifdef SKIP_SEARCH out[0] = best[0]; // just use the results of our wierd bob out[1] = best[1]; #else diff[0] = diff[0] - MIN (diff[0], 10) - 4; diff[1] = diff[1] - MIN (diff[1] - 10) - 4; if (diff[0] < 0) out[0] = weave[0]; else out[0] = best[0]; if (diff[1] < 0) out[1] = weave[1]; else out[1] = best[1]; out[0] = CLAMP (out[0], MinVals[0], MaxVals[0]); out[1] = CLAMP (out[1], MinVals[1], MaxVals[1]); #endif #ifdef USE_VERTICAL_FILTER pDest[x] = (out[0] + pBob[0]) / 2; pDest[x + dst_pitchw] = (pBob[src_pitch2] + out[0]) / 2; pDest[x + 1] = (out[1] + pBob[1]) / 2; pDest[x + 1 + dst_pitchw] = (pBob[src_pitch2 + 1] + out[1]) / 2; #else pDest[x] = out[0]; pDest[x+1] = out[1]; #endif pBob += 2; pBobP += 2; pSrc += 2; pSrcP += 2; } // adjust for next line pSrc = src_pitch2 * (y+1) + pWeaveSrc; pSrcP = src_pitch2 * (y+1) + pWeaveSrcP; pDest = dst_pitch2 * (y+1) + pWeaveDest + dst_pitch2; if (TopFirst) { pBob = pCopySrc + src_pitch2; pBobP = pCopySrcP + src_pitch2; } else { pBob = pCopySrc; pBobP = pCopySrcP; } pBob += src_pitch2 * (y+1); pBobP += src_pitch2 * (y+1); } return 0; #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopVA.inc0000644000175000017500000000046411671175353023556 00000000000000// -*- c++ -*- // Searches the center vertical line above center and below, in both the old // and new fields, but takes averages. These are even pixel addresses. MERGE4PIXavg("(%%"XDI", %%"XCX", 2)", "(%%"XSI")") // down, up MERGE4PIXavg("(%%"XDI")", "(%%"XSI", %%"XCX", 2)") // up, down gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopTop.inc0000644000175000017500000002151211671175353024007 00000000000000// -*- c++ -*- unsigned char* pDest; const unsigned char* pSrcP; const unsigned char* pSrc; const unsigned char* pBob; const unsigned char* pBobP; // long is int32 on ARCH_368, int64 on ARCH_AMD64. Declaring it this way // saves a lot of xor's to delete 64bit garbage. #if defined(DBL_RESIZE) || defined(USE_FOR_DSCALER) long src_pitch2 = src_pitch; // even & odd lines are not interleaved in DScaler #else long src_pitch2 = 2 * src_pitch; // even & odd lines are interleaved in Avisynth #endif long dst_pitch2 = 2 * dst_pitch; long y; long Last8; pSrc = pWeaveSrc; // points 1 weave line above pSrcP = pWeaveSrcP; // " #ifdef DBL_RESIZE #ifdef USE_VERTICAL_FILTER pDest = pWeaveDest + dst_pitch2; #else pDest = pWeaveDest + 3*dst_pitch; #endif #else #ifdef USE_VERTICAL_FILTER pDest = pWeaveDest + dst_pitch; #else pDest = pWeaveDest + dst_pitch2; #endif #endif if (TopFirst) { pBob = pCopySrc + src_pitch2; // remember one weave line just copied previously pBobP = pCopySrcP + src_pitch2; } else { pBob = pCopySrc; pBobP = pCopySrcP; } #ifndef IS_C #ifndef _pBob #define _pBob "%0" #define _src_pitch2 "%1" #define _ShiftMask "%2" #define _pDest "%3" #define _dst_pitchw "%4" #define _Last8 "%5" #define _pSrc "%6" #define _pSrcP "%7" #define _pBobP "%8" #define _DiffThres "%9" #define _Min_Vals "%10" #define _Max_Vals "%11" #define _FOURS "%12" #define _TENS "%13" #define _ONES "%14" #define _UVMask "%15" #define _Max_Mov "%16" #define _YMask "%17" #define _oldbx "%18" #endif Last8 = (rowsize-8); for (y=1; y < FldHeight-1; y++) { long dst_pitchw = dst_pitch; // local stor so asm can ref int64_t Max_Mov = 0x0404040404040404ull; int64_t DiffThres = 0x0f0f0f0f0f0f0f0full; int64_t YMask = 0x00ff00ff00ff00ffull; // keeps only luma int64_t UVMask = 0xff00ff00ff00ff00ull; // keeps only chroma int64_t TENS = 0x0a0a0a0a0a0a0a0aull; int64_t FOURS = 0x0404040404040404ull; int64_t ONES = 0x0101010101010101ull; int64_t Min_Vals = 0x0000000000000000ull; int64_t Max_Vals = 0x0000000000000000ull; int64_t ShiftMask = 0xfefffefffefffeffull; long oldbx; // pretend it's indented -->> __asm__ __volatile__ ( // Loop general reg usage // // XAX - pBobP, then pDest // XBX - pBob // XCX - src_pitch2 // XDX - current offset // XDI - prev weave pixels, 1 line up // XSI - next weave pixels, 1 line up // Save "XBX" (-fPIC) MOVX" %%"XBX", "_oldbx"\n\t" // simple bob first 8 bytes MOVX" "_pBob", %%"XBX"\n\t" MOVX" "_src_pitch2", %%"XCX"\n\t" #ifdef USE_VERTICAL_FILTER "movq (%%"XBX"), %%mm0\n\t" "movq (%%"XBX", %%"XCX"), %%mm1\n\t" //, qword ptr["XBX"+"XCX"] "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // halfway between V_PAVGB ("%%mm0", "%%mm2", "%%mm3", _ShiftMask) // 1/4 way V_PAVGB ("%%mm1", "%%mm2", "%%mm3", _ShiftMask) // 3/4 way MOVX" "_pDest", %%"XDI"\n\t" MOVX" "_dst_pitchw", %%"XAX"\n\t" V_MOVNTQ ("(%%"XDI")", "%%mm0") V_MOVNTQ ("(%%"XDI", %%"XAX")", "%%mm1") // qword ptr["XDI"+"XAX"], mm1 // simple bob last 8 bytes MOVX" "_Last8", %%"XDX"\n\t" LEAX" (%%"XBX", %%"XDX"), %%"XSI"\n\t" // ["XBX"+"XDX"] "movq (%%"XSI"), %%mm0\n\t" "movq (%%"XSI", %%"XCX"), %%mm1\n\t" // qword ptr["XSI"+"XCX"] "movq %%mm0, %%mm2\n\t" V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // halfway between V_PAVGB ("%%mm0", "%%mm2", "%%mm3", _ShiftMask) // 1/4 way V_PAVGB ("%%mm1", "%%mm2", "%%mm3", _ShiftMask) // 3/4 way ADDX" %%"XDX", %%"XDI"\n\t" // last 8 bytes of dest V_MOVNTQ ("%%"XDI"", "%%mm0") V_MOVNTQ ("(%%"XDI", %%"XAX")", "%%mm1") // qword ptr["XDI"+"XAX"], mm1) #else "movq (%%"XBX"), %%mm0\n\t" // pavgb mm0, qword ptr["XBX"+"XCX"] V_PAVGB ("%%mm0", "(%%"XBX", %%"XCX")", "%%mm2", _ShiftMask) // qword ptr["XBX"+"XCX"], mm2, ShiftMask) MOVX" "_pDest", %%"XDI"\n\t" V_MOVNTQ ("(%%"XDI")", "%%mm0") // simple bob last 8 bytes MOVX" "_Last8", %%"XDX"\n\t" LEAX" (%%"XBX", %%"XDX"), %%"XSI"\n\t" //"XSI", ["XBX"+"XDX"] "movq (%%"XSI"), %%mm0\n\t" // pavgb mm0, qword ptr["XSI"+"XCX"] V_PAVGB ("%%mm0", "(%%"XSI", %%"XCX")", "%%mm2", _ShiftMask) // qword ptr["XSI"+"XCX"], mm2, ShiftMask) V_MOVNTQ ("(%%"XDI", %%"XDX")", "%%mm0") // qword ptr["XDI"+"XDX"], mm0) #endif // now loop and get the middle qwords MOVX" "_pSrc", %%"XSI"\n\t" MOVX" "_pSrcP", %%"XDI"\n\t" MOVX" $8, %%"XDX"\n\t" // curr offset longo all lines "1:\n\t" MOVX" "_pBobP", %%"XAX"\n\t" ADDX" $8, %%"XDI"\n\t" ADDX" $8, %%"XSI"\n\t" ADDX" $8, %%"XBX"\n\t" ADDX" %%"XDX", %%"XAX"\n\t" #ifdef USE_STRANGE_BOB #include "StrangeBob.inc" #else #include "WierdBob.inc" #endif // For non-SSE2: // through out most of the rest of this loop we will maintain // mm4 our min bob value // mm5 best weave pixels so far // mm6 our max Bob value // mm7 best weighted pixel ratings so far // We will keep a slight bias to using the weave pixels // from the current location, by rating them by the min distance // from the Bob value instead of the avg distance from that value. // our best and only rating so far "pcmpeqb %%mm7, %%mm7\n\t" // ffff, say we didn't find anything good yet #else Last8 = (rowsize - 4); for (y=1; y < FldHeight-1; y++) { #ifdef USE_STRANGE_BOB long DiffThres = 0x0f; #endif #ifndef SKIP_SEARCH long weave[2], MaxVals[2], MinVals[2]; #endif long diff[2], best[2], avg[2], diff2[2], out[2], x; #ifdef USE_VERTICAL_FILTER pDest[0] = (3 * pBob[0] + pBob[src_pitch2]) / 4; pDest[1] = (3 * pBob[1] + pBob[src_pitch2 + 1]) / 4; pDest[2] = (3 * pBob[2] + pBob[src_pitch2 + 2]) / 4; pDest[3] = (3 * pBob[3] + pBob[src_pitch2 + 3]) / 4; pDest[dst_pitchw] = (pBob[0] + 3 * pBob[src_pitch2]) / 4; pDest[dst_pitchw + 1] = (pBob[1] + 3 * pBob[src_pitch2 + 1]) / 4; pDest[dst_pitchw + 2] = (pBob[2] + 3 * pBob[src_pitch2 + 2]) / 4; pDest[dst_pitchw + 3] = (pBob[3] + 3 * pBob[src_pitch2 + 3]) / 4; // simple bob last byte pDest[Last8] = (3 * pBob[Last8] + pBob[Last8 + src_pitch2]) / 4; pDest[Last8 + 1] = (3 * pBob[Last8 + 1] + pBob[Last8 + src_pitch2 + 1]) / 4; pDest[Last8 + 2] = (3 * pBob[Last8 + 2] + pBob[Last8 + src_pitch2 + 2]) / 4; pDest[Last8 + 3] = (3 * pBob[Last8 + 3] + pBob[Last8 + src_pitch2 + 3]) / 4; pDest[Last8 + src_pitch2] = (pBob[Last8] + 3 * pBob[Last8 + src_pitch2]) / 4; pDest[Last8 + src_pitch2 + 1] = (pBob[Last8 + 1] + 3 * pBob[Last8 + src_pitch2 + 1]) / 4; pDest[Last8 + src_pitch2 + 2] = (pBob[Last8 + 2] + 3 * pBob[Last8 + src_pitch2 + 2]) / 4; pDest[Last8 + src_pitch2 + 3] = (pBob[Last8 + 3] + 3 * pBob[Last8 + src_pitch2 + 3]) / 4; #else pDest[0] = (pBob[0] + pBob[src_pitch2 + 1]) / 2; pDest[1] = (pBob[1] + pBob[src_pitch2 + 1]) / 2; pDest[2] = (pBob[2] + pBob[src_pitch2 + 2]) / 2; pDest[3] = (pBob[3] + pBob[src_pitch2 + 3]) / 2; // simple bob last byte pDest[Last8] = (pBob[Last8] + pBob[Last8 + src_pitch2]) / 2; pDest[Last8 + 1] = (pBob[Last8 + 1] + pBob[Last8 + src_pitch2 + 1]) / 2; pDest[Last8 + 2] = (pBob[Last8 + 2] + pBob[Last8 + src_pitch2 + 2]) / 2; pDest[Last8 + 3] = (pBob[Last8 + 3] + pBob[Last8 + src_pitch2 + 3]) / 2; #endif pBob += 4; pBobP += 4; pSrc += 4; pSrcP += 4; for (x=4; x < Last8; x += 2) { #ifdef USE_STRANGE_BOB #include "StrangeBob.inc" #else #include "WierdBob.inc" #endif // We will keep a slight bias to using the weave pixels // from the current location, by rating them by the min distance // from the Bob value instead of the avg distance from that value. // our best and only rating so far diff[0] = diff[1] = 255; #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA.inc0000644000175000017500000000127011671175353024211 00000000000000// -*- c++ -*- // Searches 2 pixel to the left and right, in both the old // and new fields, but takes averages. These are even // pixel addresses. Chroma match will be used. (YUY2) MERGE4PIXavg("-4(%%"XDI")", "4(%%"XSI", %%"XCX", 2)") // up left, down right MERGE4PIXavg("4(%%"XDI")", "-4(%%"XSI", %%"XCX", 2)") // up right, down left MERGE4PIXavg("-4(%%"XDI", %%"XCX")", "4(%%"XSI", %%"XCX")") // left, right MERGE4PIXavg("4(%%"XDI", %%"XCX")", "-4(%%"XSI", %%"XCX")") // right, left MERGE4PIXavg("-4(%%"XDI", %%"XCX", 2)", "4(%%"XSI")") // down left, up right MERGE4PIXavg("4(%%"XDI", %%"XCX", 2)", "-4(%%"XSI")") // down right, up left gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH.inc0000644000175000017500000000116211671175353024163 00000000000000// Searches 1 pixel to the left and right, in both the old // and new fields, but takes v-half pel averages. These are odd // pixel addresses. Any chroma match will not be used. (YUY2) __asm { MERGE4PIXavgH("XDI"-2, "XDI"+"XCX"-2, "XSI"+"XCX"+2, "XSI"+2*"XCX"+2) // up left, down right MERGE4PIXavgH("XDI"+2, "XDI"+"XCX"+2, "XSI"+"XCX"-2, "XSI"+2*"XCX"-2) // up right, down left MERGE4PIXavgH("XDI"+2*"XCX"-2, "XDI"+"XCX"-2, "XSI"+"XCX"+2, "XSI"+2) // down left, up right MERGE4PIXavgH("XDI"+2*"XCX"+2, "XDI"+"XCX"+2, "XSI"+"XCX"-2, "XSI"-2) // down right, up left } gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddAH2.inc0000644000175000017500000000066211671175353024251 00000000000000// Searches 1 pixel to the left and right, in both the old // and new fields, but takes vertical averages. These are odd // pixel addresses. Any chroma match will not be used. (YUY2) MERGE4PIXavgH("-2(%%"XDI", %%"XCX")", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "2(%%"XSI", %%"XCX")") // left, right MERGE4PIXavgH("2(%%"XDI", %%"XCX")", "(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")", "-2(%%"XSI", %%"XCX")") // right, left gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/tomsmocompmacros.h0000644000175000017500000002516611671175353024356 00000000000000#include #include // Define a few macros for CPU dependent instructions. // I suspect I don't really understand how the C macro preprocessor works but // this seems to get the job done. // TRB 7/01 // BEFORE USING THESE YOU MUST SET: // #define SIMD_TYPE MMXEXT (or MMX or 3DNOW) // some macros for pavgb instruction // V_PAVGB(mmr1, mmr2, mmr work register, smask) mmr2 may = mmrw if you can trash it #define V_PAVGB_MMX(mmr1, mmr2, mmrw, smask) \ "movq "mmr2", "mmrw"\n\t" \ "pand "smask", "mmrw"\n\t" \ "psrlw $1, "mmrw"\n\t" \ "pand "smask", "mmr1"\n\t" \ "psrlw $1, "mmr1"\n\t" \ "paddusb "mmrw", "mmr1"\n\t" #define V_PAVGB_MMXEXT(mmr1, mmr2, mmrw, smask) "pavgb "mmr2", "mmr1"\n\t" #define V_PAVGB_3DNOW(mmr1, mmr2, mmrw, smask) "pavgusb "mmr2", "mmr1"\n\t" #define V_PAVGB(mmr1, mmr2, mmrw, smask) V_PAVGB2(mmr1, mmr2, mmrw, smask, SIMD_TYPE) #define V_PAVGB2(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type) #define V_PAVGB3(mmr1, mmr2, mmrw, smask, simd_type) V_PAVGB_##simd_type(mmr1, mmr2, mmrw, smask) // some macros for pmaxub instruction #define V_PMAXUB_MMX(mmr1, mmr2) \ "psubusb "mmr2", "mmr1"\n\t" \ "paddusb "mmr2", "mmr1"\n\t" #define V_PMAXUB_MMXEXT(mmr1, mmr2) "pmaxub "mmr2", "mmr1"\n\t" #define V_PMAXUB_3DNOW(mmr1, mmr2) V_PMAXUB_MMX(mmr1, mmr2) // use MMX version #define V_PMAXUB(mmr1, mmr2) V_PMAXUB2(mmr1, mmr2, SIMD_TYPE) #define V_PMAXUB2(mmr1, mmr2, simd_type) V_PMAXUB3(mmr1, mmr2, simd_type) #define V_PMAXUB3(mmr1, mmr2, simd_type) V_PMAXUB_##simd_type(mmr1, mmr2) // some macros for pminub instruction // V_PMINUB(mmr1, mmr2, mmr work register) mmr2 may NOT = mmrw #define V_PMINUB_MMX(mmr1, mmr2, mmrw) \ "pcmpeqb "mmrw", "mmrw"\n\t" \ "psubusb "mmr2", "mmrw"\n\t" \ "paddusb "mmrw", "mmr1"\n\t" \ "psubusb "mmrw", "mmr1"\n\t" #define V_PMINUB_MMXEXT(mmr1, mmr2, mmrw) "pminub "mmr2", "mmr1"\n\t" #define V_PMINUB_3DNOW(mmr1, mmr2, mmrw) V_PMINUB_MMX(mmr1, mmr2, mmrw) // use MMX version #define V_PMINUB(mmr1, mmr2, mmrw) V_PMINUB2(mmr1, mmr2, mmrw, SIMD_TYPE) #define V_PMINUB2(mmr1, mmr2, mmrw, simd_type) V_PMINUB3(mmr1, mmr2, mmrw, simd_type) #define V_PMINUB3(mmr1, mmr2, mmrw, simd_type) V_PMINUB_##simd_type(mmr1, mmr2, mmrw) // some macros for movntq instruction // V_MOVNTQ(mmr1, mmr2) #define V_MOVNTQ_MMX(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t" #define V_MOVNTQ_3DNOW(mmr1, mmr2) "movq "mmr2", "mmr1"\n\t" #define V_MOVNTQ_MMXEXT(mmr1, mmr2) "movntq "mmr2", "mmr1"\n\t" #define V_MOVNTQ(mmr1, mmr2) V_MOVNTQ2(mmr1, mmr2, SIMD_TYPE) #define V_MOVNTQ2(mmr1, mmr2, simd_type) V_MOVNTQ3(mmr1, mmr2, simd_type) #define V_MOVNTQ3(mmr1, mmr2, simd_type) V_MOVNTQ_##simd_type(mmr1, mmr2) // end of macros #ifdef IS_SSE2 #define MERGE4PIXavg(PADDR1, PADDR2) \ "movdqu "PADDR1", %%xmm0\n\t" /* our 4 pixels */ \ "movdqu "PADDR2", %%xmm1\n\t" /* our pixel2 value */ \ "movdqa %%xmm0, %%xmm2\n\t" /* another copy of our pixel1 value */ \ "movdqa %%xmm1, %%xmm3\n\t" /* another copy of our pixel1 value */ \ "psubusb %%xmm1, %%xmm2\n\t" \ "psubusb %%xmm0, %%xmm3\n\t" \ "por %%xmm3, %%xmm2\n\t" \ "pavgb %%xmm1, %%xmm0\n\t" /* avg of 2 pixels */ \ "movdqa %%xmm2, %%xmm3\n\t" /* another copy of our our weights */ \ "pxor %%xmm1, %%xmm1\n\t" \ "psubusb %%xmm7, %%xmm3\n\t" /* nonzero where old weights lower, else 0 */ \ "pcmpeqb %%xmm1, %%xmm3\n\t" /* now ff where new better, else 00 */ \ "pcmpeqb %%xmm3, %%xmm1\n\t" /* here ff where old better, else 00 */ \ "pand %%xmm3, %%xmm0\n\t" /* keep only better new pixels */ \ "pand %%xmm3, %%xmm2\n\t" /* and weights */ \ "pand %%xmm1, %%xmm5\n\t" /* keep only better old pixels */ \ "pand %%xmm1, %%xmm7\n\t" \ "por %%xmm0, %%xmm5\n\t" /* and merge new & old vals */ \ "por %%xmm2, %%xmm7\n\t" #define MERGE4PIXavgH(PADDR1A, PADDR1B, PADDR2A, PADDR2B) \ "movdqu "PADDR1A", %%xmm0\n\t" /* our 4 pixels */ \ "movdqu "PADDR2A", %%xmm1\n\t" /* our pixel2 value */ \ "movdqu "PADDR1B", %%xmm2\n\t" /* our 4 pixels */ \ "movdqu "PADDR2B", %%xmm3\n\t" /* our pixel2 value */ \ "pavgb %%xmm2, %%xmm0\n\t" \ "pavgb %%xmm3, %%xmm1\n\t" \ "movdqa %%xmm0, %%xmm2\n\t" /* another copy of our pixel1 value */ \ "movdqa %%xmm1, %%xmm3\n\t" /* another copy of our pixel1 value */ \ "psubusb %%xmm1, %%xmm2\n\t" \ "psubusb %%xmm0, %%xmm3\n\t" \ "por %%xmm3, %%xmm2\n\t" \ "pavgb %%xmm1, %%xmm0\n\t" /* avg of 2 pixels */ \ "movdqa %%xmm2, %%xmm3\n\t" /* another copy of our our weights */ \ "pxor %%xmm1, %%xmm1\n\t" \ "psubusb %%xmm7, %%xmm3\n\t" /* nonzero where old weights lower, else 0 */ \ "pcmpeqb %%xmm1, %%xmm3\n\t" /* now ff where new better, else 00 */ \ "pcmpeqb %%xmm3, %%xmm1\n\t" /* here ff where old better, else 00 */ \ "pand %%xmm3, %%xmm0\n\t" /* keep only better new pixels */ \ "pand %%xmm3, %%xmm2\n\t" /* and weights */ \ "pand %%xmm1, %%xmm5\n\t" /* keep only better old pixels */ \ "pand %%xmm1, %%xmm7\n\t" \ "por %%xmm0, %%xmm5\n\t" /* and merge new & old vals */ \ "por %%xmm2, %%xmm7\n\t" #define RESET_CHROMA "por "_UVMask", %%xmm7\n\t" #else // ifdef IS_SSE2 #define MERGE4PIXavg(PADDR1, PADDR2) \ "movq "PADDR1", %%mm0\n\t" /* our 4 pixels */ \ "movq "PADDR2", %%mm1\n\t" /* our pixel2 value */ \ "movq %%mm0, %%mm2\n\t" /* another copy of our pixel1 value */ \ "movq %%mm1, %%mm3\n\t" /* another copy of our pixel1 value */ \ "psubusb %%mm1, %%mm2\n\t" \ "psubusb %%mm0, %%mm3\n\t" \ "por %%mm3, %%mm2\n\t" \ V_PAVGB ("%%mm0", "%%mm1", "%%mm3", _ShiftMask) /* avg of 2 pixels */ \ "movq %%mm2, %%mm3\n\t" /* another copy of our our weights */ \ "pxor %%mm1, %%mm1\n\t" \ "psubusb %%mm7, %%mm3\n\t" /* nonzero where old weights lower, else 0 */ \ "pcmpeqb %%mm1, %%mm3\n\t" /* now ff where new better, else 00 */ \ "pcmpeqb %%mm3, %%mm1\n\t" /* here ff where old better, else 00 */ \ "pand %%mm3, %%mm0\n\t" /* keep only better new pixels */ \ "pand %%mm3, %%mm2\n\t" /* and weights */ \ "pand %%mm1, %%mm5\n\t" /* keep only better old pixels */ \ "pand %%mm1, %%mm7\n\t" \ "por %%mm0, %%mm5\n\t" /* and merge new & old vals */ \ "por %%mm2, %%mm7\n\t" #define MERGE4PIXavgH(PADDR1A, PADDR1B, PADDR2A, PADDR2B) \ "movq "PADDR1A", %%mm0\n\t" /* our 4 pixels */ \ "movq "PADDR2A", %%mm1\n\t" /* our pixel2 value */ \ "movq "PADDR1B", %%mm2\n\t" /* our 4 pixels */ \ "movq "PADDR2B", %%mm3\n\t" /* our pixel2 value */ \ V_PAVGB("%%mm0", "%%mm2", "%%mm2", _ShiftMask) \ V_PAVGB("%%mm1", "%%mm3", "%%mm3", _ShiftMask) \ "movq %%mm0, %%mm2\n\t" /* another copy of our pixel1 value */ \ "movq %%mm1, %%mm3\n\t" /* another copy of our pixel1 value */ \ "psubusb %%mm1, %%mm2\n\t" \ "psubusb %%mm0, %%mm3\n\t" \ "por %%mm3, %%mm2\n\t" \ V_PAVGB("%%mm0", "%%mm1", "%%mm3", _ShiftMask) /* avg of 2 pixels */ \ "movq %%mm2, %%mm3\n\t" /* another copy of our our weights */ \ "pxor %%mm1, %%mm1\n\t" \ "psubusb %%mm7, %%mm3\n\t" /* nonzero where old weights lower, else 0 */ \ "pcmpeqb %%mm1, %%mm3\n\t" /* now ff where new better, else 00 */ \ "pcmpeqb %%mm3, %%mm1\n\t" /* here ff where old better, else 00 */ \ "pand %%mm3, %%mm0\n\t" /* keep only better new pixels */ \ "pand %%mm3, %%mm2\n\t" /* and weights */ \ "pand %%mm1, %%mm5\n\t" /* keep only better old pixels */ \ "pand %%mm1, %%mm7\n\t" \ "por %%mm0, %%mm5\n\t" /* and merge new & old vals */ \ "por %%mm2, %%mm7\n\t" #define RESET_CHROMA "por "_UVMask", %%mm7\n\t" #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopOddA.inc0000644000175000017500000000107311671175353024054 00000000000000// -*- c++ -*- // Searches 1 pixel to the left and right, in both the old // and new fields, but takes averages. These are odd // pixel addresses. Any chroma match will not be used. (YUY2) MERGE4PIXavg("-2(%%"XDI")", "2(%%"XSI", %%"XCX", 2)") // up left, down right MERGE4PIXavg("2(%%"XDI")", "-2(%%"XSI", %%"XCX", 2)") // up right, down left MERGE4PIXavg("-2(%%"XDI", %%"XCX", 2)", "2(%%"XSI")") // down left, up right MERGE4PIXavg("2(%%"XDI", %%"XCX", 2)", "-2(%%"XSI")") // down right, up left #include "SearchLoopOddA2.inc" gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoop0A.inc0000644000175000017500000000103111671175353023477 00000000000000// -*- c++ -*- // Searches just the center pixel, in both the old // and new fields, but takes averages. This is an even // pixel address. Any chroma match will be used. (YUY2) // We best like finding 0 motion so we will bias everything we found previously // up by a little, and adjust later #ifdef IS_SSE2 "paddusb "_ONES", %%xmm7\n\t" // bias toward no motion #else "paddusb "_ONES", %%mm7\n\t" // bias toward no motion #endif MERGE4PIXavg("(%%"XDI", %%"XCX")", "(%%"XSI", %%"XCX")") // center, in old and new gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/SearchLoopEdgeA8.inc0000644000175000017500000000127111671175353024302 00000000000000// -*- c++ -*- // Searches 4 pixel to the left and right, in both the old // and new fields, but takes averages. These are even // pixel addresses. Chroma match will be used. (YUY2) MERGE4PIXavg("-8(%%"XDI")", "8(%%"XSI", %%"XCX", 2)") // up left, down right MERGE4PIXavg("8(%%"XDI")", "-8(%%"XSI", %%"XCX", 2)") // up right, down left MERGE4PIXavg("-8(%%"XDI", %%"XCX")", "8(%%"XSI", %%"XCX")") // left, right MERGE4PIXavg("8(%%"XDI", %%"XCX")", "-8(%%"XSI", %%"XCX")") // right, left MERGE4PIXavg("-8(%%"XDI", %%"XCX", 2)", "8(%%"XSI")") // down left, up right MERGE4PIXavg("8(%%"XDI", %%"XCX", 2)", "-8(%%"XSI")") // down right, up left gst-plugins-good-0.10.31/gst/deinterlace/tvtime/tomsmocomp/WierdBob.inc0000644000175000017500000002325611671175353022771 00000000000000// -*- c++ -*- // First, get and save our possible Bob values // Assume our pixels are layed out as follows with x the calc'd bob value // and the other pixels are from the current field // // j a b c k current field // x calculated line // m d e f n current field // // we calc the bob value as: // x2 = either avg(a,f), avg(c,d), avg(b,e), avg(j,n), or avg(k,m) // selected for the smallest of abs(a,f), abs(c,d), or abs(b,e), etc. #ifndef IS_C // a,f "movq -2(%%"XBX"), %%mm0\n\t" // value a from top left "movq 2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f from bottom right "movq %%mm0, %%mm6\n\t" // pavgb %%mm6, %%mm1 // avg(a,f), also best so far V_PAVGB ("%%mm6", "%%mm1", "%%mm7", _ShiftMask) // avg(a,f), also best so far "movq %%mm0, %%mm7\n\t" "psubusb %%mm1, %%mm7\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm7\n\t" // abs diff, also best so far // c,d "movq 2(%%"XBX"), %%mm0\n\t" // value a from top left "movq -2(%%"XBX", %%"XCX"), %%mm1\n\t" // value f from bottom right "movq %%mm0, %%mm2\n\t" // pavgb %%mm2, %%mm1 // avg(c,d) V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(c,d) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(c,d) "movq %%mm3, %%mm1\n\t" // keep copy "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00 "pand %%mm3, %%mm1\n\t" // keep only better new avg and abs "pand %%mm3, %%mm2\n\t" "pand %%mm4, %%mm6\n\t" "pand %%mm4, %%mm7\n\t" "por %%mm2, %%mm6\n\t" // and merge new & old vals keeping best "por %%mm1, %%mm7\n\t" "por "_UVMask", %%mm7\n\t" // but we know chroma is worthless so far "pand "_YMask", %%mm5\n\t" // mask out chroma from here also // j,n "movq -4(%%"XBX"), %%mm0\n\t" // value j from top left "movq 4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n from bottom right "movq %%mm0, %%mm2\n\t" // pavgb %%mm2, %%mm1 // avg(j,n) V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(j,n) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(j-n) "movq %%mm3, %%mm1\n\t" // keep copy "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00 "pand %%mm3, %%mm1\n\t" // keep only better new avg and abs "pand %%mm2, %%mm3\n\t" "pand %%mm4, %%mm6\n\t" "pand %%mm4, %%mm7\n\t" "por %%mm3, %%mm6\n\t" // and merge new & old vals keeping best "por %%mm1, %%mm7\n\t" // " // k, m "movq 4(%%"XBX"), %%mm0\n\t" // value k from top right "movq -4(%%"XBX", %%"XCX"), %%mm1\n\t" // value n from bottom left "movq %%mm0, %%mm4\n\t" // pavgb %%mm4, %%mm1 // avg(k,m) V_PAVGB ("%%mm4", "%%mm1", "%%mm3", _ShiftMask) // avg(k,m) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(k,m) "movq %%mm3, %%mm1\n\t" // keep copy "movq %%mm4, %%mm2\n\t" // avg(k,m) "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0 "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00 "pand %%mm3, %%mm1\n\t" // keep only better new avg and abs "pand %%mm2, %%mm3\n\t" "pand %%mm4, %%mm6\n\t" "pand %%mm4, %%mm7\n\t" "por %%mm3, %%mm6\n\t" // and merge new & old vals keeping best "por %%mm1, %%mm7\n\t" // " // b,e "movq (%%"XBX"), %%mm0\n\t" // value b from top "movq (%%"XBX", %%"XCX"), %%mm1\n\t" // value e from bottom // We will also calc here the max/min values to later limit comb // so the max excursion will not exceed the Max_Comb constant #ifdef SKIP_SEARCH "movq %%mm0, %%mm2\n\t" // pminub %%mm2, %%mm1 V_PMINUB ("%%mm2", "%%mm1", "%%mm4") // pmaxub %%mm6, %%mm2 // clip our current results so far to be above this V_PMAXUB ("%%mm6", "%%mm2") "movq %%mm0, %%mm2\n\t" V_PMAXUB ("%%mm2", "%%mm1") // pminub %%mm6, %%mm2 // clip our current results so far to be below this V_PMINUB ("%%mm6", "%%mm2", "%%mm4") #else "movq %%mm0, %%mm2\n\t" "movq (%%"XAX"), %%mm4\n\t" "psubusb %%mm4, %%mm2\n\t" "psubusb %%mm0, %%mm4\n\t" "por %%mm2, %%mm4\n\t" // abs diff "movq %%mm1, %%mm2\n\t" "movq (%%"XAX", %%"XCX"), %%mm3\n\t" "psubusb %%mm3, %%mm2\n\t" "psubusb %%mm1, %%mm3\n\t" "por %%mm2, %%mm3\n\t" // abs diff // pmaxub %%mm3, %%mm4 // top or bottom pixel moved most V_PMAXUB ("%%mm3", "%%mm4") // top or bottom pixel moved most "psubusb "_Max_Mov", %%mm3\n\t" // moved more than allowed? or goes to 0? "pxor %%mm4, %%mm4\n\t" "pcmpeqb %%mm4, %%mm3\n\t" // now ff where low motion, else high motion "movq %%mm0, %%mm2\n\t" // pminub %%mm2, %%mm1 V_PMINUB ("%%mm2", "%%mm1", "%%mm4") // pmaxub %%mm6, %%mm2 // clip our current results so far to be above this V_PMAXUB ("%%mm6", "%%mm2") "psubusb %%mm3, %%mm2\n\t" // maybe decrease it to 0000.. if no surround motion "movq %%mm2, "_Min_Vals"\n\t" "movq %%mm0, %%mm2\n\t" V_PMAXUB ("%%mm2", "%%mm1") // pminub %%mm6, %%mm2 // clip our current results so far to be below this V_PMINUB ("%%mm6", "%%mm2", "%%mm4") "paddusb %%mm3, %%mm2\n\t" // maybe increase it to ffffff if no surround motion "movq %%mm2, "_Max_Vals"\n\t" #endif "movq %%mm0, %%mm2\n\t" // pavgb %%mm2, %%mm1 // avg(b,e) V_PAVGB ("%%mm2", "%%mm1", "%%mm3", _ShiftMask) // avg(b,e) "movq %%mm0, %%mm3\n\t" "psubusb %%mm1, %%mm3\n\t" "psubusb %%mm0, %%mm1\n\t" "por %%mm1, %%mm3\n\t" // abs(c,d) "movq %%mm3, %%mm1\n\t" // keep copy of diffs "pxor %%mm4, %%mm4\n\t" "psubusb %%mm7, %%mm3\n\t" // nonzero where new weights bigger, else 0 "pcmpeqb %%mm4, %%mm3\n\t" // now ff where new better, else 00 "pcmpeqb %%mm3, %%mm4\n\t" // here ff where old better, else 00 "pand %%mm3, %%mm1\n\t" "pand %%mm3, %%mm2\n\t" "pand %%mm4, %%mm6\n\t" "pand %%mm4, %%mm7\n\t" "por %%mm2, %%mm6\n\t" // our x2 value "por %%mm1, %%mm7\n\t" // our x2 diffs "movq %%mm7, %%mm4\n\t" // save as bob uncertainty indicator #else // a,f best[0] = (pBob[-2] + pBob[src_pitch2 + 2]) / 2; diff[0] = ABS (pBob[-2] - pBob[src_pitch2 + 2]); best[1] = (pBob[-1] + pBob[src_pitch2 + 3]) / 2; diff[1] = ABS (pBob[-1] - pBob[src_pitch2 + 3]); // c,d if (ABS (pBob[2] - pBob[src_pitch2 - 2]) < diff[0]) { best[0] = (pBob[2] + pBob[src_pitch2 - 2]) / 2; diff[0] = ABS (pBob[2] - pBob[src_pitch2 - 2]); } if (ABS (pBob[3] - pBob[src_pitch2 - 1]) < diff[1]) { best[1] = (pBob[3] + pBob[src_pitch2 - 1]) / 2; diff[1] = ABS (pBob[3] - pBob[src_pitch2 - 1]); } // j,n if (ABS (pBob[-4] - pBob[src_pitch2 + 4]) < diff[0]) { best[0] = (pBob[-4] + pBob[src_pitch2 + 4]) / 2; diff[0] = ABS (pBob[-4] - pBob[src_pitch2 + 4]); } if (ABS (pBob[-3] - pBob[src_pitch2 + 5]) < diff[1]) { best[1] = (pBob[-3] + pBob[src_pitch2 + 5]) / 2; diff[1] = ABS (pBob[-3] - pBob[src_pitch2 + 5]); } // k,m if (ABS (pBob[4] - pBob[src_pitch2 - 4]) < diff[0]) { best[0] = (pBob[4] + pBob[src_pitch2 - 4]) / 2; diff[0] = ABS (pBob[-4] - pBob[src_pitch2 - 4]); } if (ABS (pBob[5] - pBob[src_pitch2 - 3]) < diff[1]) { best[1] = (pBob[5] + pBob[src_pitch2 - 3]) / 2; diff[1] = ABS (pBob[-3] - pBob[src_pitch2 - 3]); } // k,m if (ABS (pBob[4] - pBob[src_pitch2 - 4]) < diff[0]) { best[0] = (pBob[4] + pBob[src_pitch2 - 4]) / 2; diff[0] = ABS (pBob[-4] - pBob[src_pitch2 - 4]); } if (ABS (pBob[5] - pBob[src_pitch2 - 3]) < diff[1]) { best[1] = (pBob[5] + pBob[src_pitch2 - 3]) / 2; diff[1] = ABS (pBob[-3] - pBob[src_pitch2 - 3]); } // We will also calc here the max/min values to later limit comb // so the max excursion will not exceed the Max_Comb constant #ifdef SKIP_SEARCH best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0])); best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1])); #else mov[0] = MAX (ABS (pBob[0] - pBobP[0]), ABS (pBob[src_pitch2] - pBobP[src_pitch2])); mov[1] = MAX (ABS (pBob[1] - pBobP[1]), ABS (pBob[src_pitch2 + 1] - pBobP[src_pitch2 + 1])); MinVals[0] = 0; MinVals[1] = 0; MaxVals[0] = 255; MaxVals[1] = 255; if (mov[0] > Max_Mov[0]) { MinVals[0] = MAX (MIN (pBob[0], pBob[src_pitch2]), best[0]); MaxVals[0] = MIN (MAX (pBob[0], pBob[src_pitch2]), best[0]); } if (mov[1] > Max_Mov[1]) { MinVals[1] = MAX (MIN (pBob[1], pBob[src_pitch2 + 1]), best[1]); MaxVals[1] = MIN (MAX (pBob[1], pBob[src_pitch2 + 1]), best[1]); } best[0] = CLAMP (best[0], MIN (pBob[src_pitch2], pBob[0]), MAX (pBob[src_pitch2], pBob[0])); best[1] = CLAMP (best[1], MIN (pBob[src_pitch2 + 1], pBob[1]), MAX (pBob[src_pitch2 + 1], pBob[1])); #endif avg[0] = (pBob[src_pitch2] + pBob[0]) / 2; avg[1] = (pBob[src_pitch2 + 1] + pBob[1]) / 2; diff2[0] = ABS (pBob[src_pitch2] - pBob[0]); diff2[1] = ABS (pBob[src_pitch2 + 1] - pBob[1]); if (diff2[0] < diff[0]) { best[0] = avg[0]; diff[0] = diff2[0]; } if (diff2[1] < diff[1]) { best[1] = avg[1]; diff[1] = diff2[1]; } #endif gst-plugins-good-0.10.31/gst/deinterlace/tvtime/greedy.c0000644000175000017500000002245311707374600020021 00000000000000/* * * GStreamer * Copyright (c) 2000 Tom Barry All rights reserved. * mmx.h port copyright (c) 2002 Billy Biggs . * * Copyright (C) 2008,2010 Sebastian Dröge * * 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. */ /* * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry * and Billy Biggs. * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578 */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "gstdeinterlacemethod.h" #include #include "tvtime.h" #define GST_TYPE_DEINTERLACE_METHOD_GREEDY_L (gst_deinterlace_method_greedy_l_get_type ()) #define GST_IS_DEINTERLACE_METHOD_GREEDY_L(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L)) #define GST_IS_DEINTERLACE_METHOD_GREEDY_L_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L)) #define GST_DEINTERLACE_METHOD_GREEDY_L_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L, GstDeinterlaceMethodGreedyLClass)) #define GST_DEINTERLACE_METHOD_GREEDY_L(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L, GstDeinterlaceMethodGreedyL)) #define GST_DEINTERLACE_METHOD_GREEDY_L_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_GREEDY_L, GstDeinterlaceMethodGreedyLClass)) #define GST_DEINTERLACE_METHOD_GREEDY_L_CAST(obj) ((GstDeinterlaceMethodGreedyL*)(obj)) GType gst_deinterlace_method_greedy_l_get_type (void); typedef struct { GstDeinterlaceSimpleMethod parent; guint max_comb; } GstDeinterlaceMethodGreedyL; typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodGreedyLClass; // This is a simple lightweight DeInterlace method that uses little CPU time // but gives very good results for low or intermedite motion. // It defers frames by one field, but that does not seem to produce noticeable // lip sync problems. // // The method used is to take either the older or newer weave pixel depending // upon which give the smaller comb factor, and then clip to avoid large damage // when wrong. // // I'd intended this to be part of a larger more elaborate method added to // Blended Clip but this give too good results for the CPU to ignore here. static inline void deinterlace_greedy_interpolate_scanline_orc (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { guint max_comb = GST_DEINTERLACE_METHOD_GREEDY_L (self)->max_comb; if (scanlines->m1 == NULL || scanlines->mp == NULL) { deinterlace_line_linear (out, scanlines->t0, scanlines->b0, self->parent.row_stride[0]); } else { deinterlace_line_greedy (out, scanlines->m1, scanlines->t0, scanlines->b0, scanlines->mp ? scanlines->mp : scanlines->m1, max_comb, self->parent.row_stride[0]); } } static inline void deinterlace_greedy_interpolate_scanline_orc_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { guint max_comb = GST_DEINTERLACE_METHOD_GREEDY_L (self)->max_comb; if (scanlines->m1 == NULL || scanlines->mp == NULL) { deinterlace_line_linear (out, scanlines->t0, scanlines->b0, self->parent.row_stride[1]); } else { deinterlace_line_greedy (out, scanlines->m1, scanlines->t0, scanlines->b0, scanlines->mp ? scanlines->mp : scanlines->m1, max_comb, self->parent.row_stride[1]); } } static inline void deinterlace_greedy_interpolate_scanline_orc_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { guint max_comb = GST_DEINTERLACE_METHOD_GREEDY_L (self)->max_comb; if (scanlines->m1 == NULL || scanlines->mp == NULL) { deinterlace_line_linear (out, scanlines->t0, scanlines->b0, self->parent.row_stride[2]); } else { deinterlace_line_greedy (out, scanlines->m1, scanlines->t0, scanlines->b0, scanlines->mp ? scanlines->mp : scanlines->m1, max_comb, self->parent.row_stride[2]); } } static void deinterlace_greedy_copy_scanline (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[0]); } static void deinterlace_greedy_copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[1]); } static void deinterlace_greedy_copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out, const GstDeinterlaceScanlineData * scanlines) { memcpy (out, scanlines->m0, self->parent.row_stride[2]); } G_DEFINE_TYPE (GstDeinterlaceMethodGreedyL, gst_deinterlace_method_greedy_l, GST_TYPE_DEINTERLACE_SIMPLE_METHOD); enum { PROP_0, PROP_MAX_COMB }; static void gst_deinterlace_method_greedy_l_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDeinterlaceMethodGreedyL *self = GST_DEINTERLACE_METHOD_GREEDY_L (object); switch (prop_id) { case PROP_MAX_COMB: self->max_comb = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void gst_deinterlace_method_greedy_l_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDeinterlaceMethodGreedyL *self = GST_DEINTERLACE_METHOD_GREEDY_L (object); switch (prop_id) { case PROP_MAX_COMB: g_value_set_uint (value, self->max_comb); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void gst_deinterlace_method_greedy_l_class_init (GstDeinterlaceMethodGreedyLClass * klass) { GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass; GstDeinterlaceSimpleMethodClass *dism_class = (GstDeinterlaceSimpleMethodClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_deinterlace_method_greedy_l_set_property; gobject_class->get_property = gst_deinterlace_method_greedy_l_get_property; g_object_class_install_property (gobject_class, PROP_MAX_COMB, g_param_spec_uint ("max-comb", "Max comb", "Max Comb", 0, 255, 15, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); dim_class->fields_required = 2; dim_class->name = "Motion Adaptive: Simple Detection"; dim_class->nick = "greedyl"; dim_class->latency = 1; dism_class->interpolate_scanline_ayuv = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_yuy2 = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_yvyu = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_uyvy = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_argb = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_abgr = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_rgba = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_bgra = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_rgb = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_bgr = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_planar_y = deinterlace_greedy_interpolate_scanline_orc; dism_class->interpolate_scanline_planar_u = deinterlace_greedy_interpolate_scanline_orc_planar_u; dism_class->interpolate_scanline_planar_v = deinterlace_greedy_interpolate_scanline_orc_planar_v; dism_class->copy_scanline_ayuv = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_yuy2 = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_yvyu = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_uyvy = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_argb = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_abgr = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_rgba = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_bgra = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_rgb = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_bgr = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_planar_y = deinterlace_greedy_copy_scanline; dism_class->copy_scanline_planar_u = deinterlace_greedy_copy_scanline_planar_u; dism_class->copy_scanline_planar_v = deinterlace_greedy_copy_scanline_planar_v; } static void gst_deinterlace_method_greedy_l_init (GstDeinterlaceMethodGreedyL * self) { self->max_comb = 15; } gst-plugins-good-0.10.31/gst/deinterlace/tvtime.orc0000644000175000017500000000302611671175353017102 00000000000000 .function deinterlace_line_vfir .dest 1 d1 guint8 .source 1 s1 guint8 .source 1 s2 guint8 .source 1 s3 guint8 .source 1 s4 guint8 .source 1 s5 guint8 .temp 2 t1 .temp 2 t2 .temp 2 t3 convubw t1, s1 convubw t2, s5 addw t1, t1, t2 convubw t2, s2 convubw t3, s4 addw t2, t2, t3 shlw t2, t2, 2 convubw t3, s3 shlw t3, t3, 1 subw t2, t2, t1 addw t2, t2, t3 addw t2, t2, 4 shrsw t2, t2, 3 convsuswb d1, t2 .function deinterlace_line_linear .dest 1 d1 guint8 .source 1 s1 guint8 .source 1 s2 guint8 avgub d1, s1, s2 .function deinterlace_line_linear_blend .dest 1 d1 guint8 .source 1 s1 guint8 .source 1 s2 guint8 .source 1 s3 guint8 .temp 2 t1 .temp 2 t2 .temp 2 t3 convubw t1, s1 convubw t2, s2 convubw t3, s3 addw t1, t1, t2 addw t3, t3, t3 addw t1, t1, t3 addw t1, t1, 2 shrsw t1, t1, 2 convsuswb d1, t1 .function deinterlace_line_greedy .dest 1 d1 .source 1 m0 .source 1 t1 .source 1 b1 .source 1 m2 .param 1 max_comb .temp 1 tm0 .temp 1 tm2 .temp 1 tb1 .temp 1 tt1 .temp 1 avg .temp 1 l2_diff .temp 1 lp2_diff .temp 1 t2 .temp 1 t3 .temp 1 best .temp 1 min .temp 1 max loadb tm0, m0 loadb tm2, m2 loadb tb1, b1 loadb tt1, t1 avgub avg, tt1, tb1 maxub t2, tm0, avg minub t3, tm0, avg subb l2_diff, t2, t3 maxub t2, tm2, avg minub t3, tm2, avg subb lp2_diff, t2, t3 xorb l2_diff, l2_diff, 0x80 xorb lp2_diff, lp2_diff, 0x80 cmpgtsb t3, l2_diff, lp2_diff andb t2, tm2, t3 andnb t3, t3, tm0 orb best, t2, t3 maxub max, tt1, tb1 minub min, tt1, tb1 addusb max, max, max_comb subusb min, min, max_comb minub best, best, max maxub d1, best, min gst-plugins-good-0.10.31/gst/deinterlace/gstdeinterlacemethod.h0000644000175000017500000002302511707374600021431 00000000000000/* * GStreamer * Copyright (C) 2008-2010 Sebastian Dröge * * 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_DEINTERLACE_METHOD_H__ #define __GST_DEINTERLACE_METHOD_H__ #include #include #if defined(HAVE_GCC_ASM) && defined(HAVE_ORC) #if defined(HAVE_CPU_I386) || defined(HAVE_CPU_X86_64) #define BUILD_X86_ASM #endif #endif G_BEGIN_DECLS #define GST_TYPE_DEINTERLACE_METHOD (gst_deinterlace_method_get_type ()) #define GST_IS_DEINTERLACE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD)) #define GST_IS_DEINTERLACE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD)) #define GST_DEINTERLACE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass)) #define GST_DEINTERLACE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethod)) #define GST_DEINTERLACE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass)) #define GST_DEINTERLACE_METHOD_CAST(obj) ((GstDeinterlaceMethod*)(obj)) typedef struct _GstDeinterlaceMethod GstDeinterlaceMethod; typedef struct _GstDeinterlaceMethodClass GstDeinterlaceMethodClass; #define PICTURE_PROGRESSIVE 0 #define PICTURE_INTERLACED_BOTTOM 1 #define PICTURE_INTERLACED_TOP 2 #define PICTURE_INTERLACED_MASK (PICTURE_INTERLACED_BOTTOM | PICTURE_INTERLACED_TOP) typedef struct { /* pointer to the start of data for this field */ GstBuffer *buf; /* see PICTURE_ flags in *.c */ guint flags; } GstDeinterlaceField; /* * This structure defines the deinterlacer plugin. */ typedef void (*GstDeinterlaceMethodDeinterlaceFunction) ( GstDeinterlaceMethod *self, const GstDeinterlaceField *history, guint history_count, GstBuffer *outbuf, int cur_field_idx); struct _GstDeinterlaceMethod { GstObject parent; GstVideoFormat format; gint frame_width, frame_height; gint width[4]; gint height[4]; gint offset[4]; gint row_stride[4]; gint pixel_stride[4]; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame; }; struct _GstDeinterlaceMethodClass { GstObjectClass parent_class; guint fields_required; guint latency; gboolean (*supported) (GstDeinterlaceMethodClass *klass, GstVideoFormat format, gint width, gint height); void (*setup) (GstDeinterlaceMethod *self, GstVideoFormat format, gint width, gint height); GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yuy2; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yvyu; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_uyvy; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_i420; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yv12; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y444; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y42b; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y41b; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_ayuv; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv12; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv21; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_argb; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_abgr; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgba; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgra; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgb; GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgr; const gchar *name; const gchar *nick; }; GType gst_deinterlace_method_get_type (void); gboolean gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, gint height); void gst_deinterlace_method_setup (GstDeinterlaceMethod * self, GstVideoFormat format, gint width, gint height); void gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, int cur_field_idx); gint gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self); gint gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self); #define GST_TYPE_DEINTERLACE_SIMPLE_METHOD (gst_deinterlace_simple_method_get_type ()) #define GST_IS_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD)) #define GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD)) #define GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass)) #define GST_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethod)) #define GST_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass)) #define GST_DEINTERLACE_SIMPLE_METHOD_CAST(obj) ((GstDeinterlaceSimpleMethod*)(obj)) typedef struct _GstDeinterlaceSimpleMethod GstDeinterlaceSimpleMethod; typedef struct _GstDeinterlaceSimpleMethodClass GstDeinterlaceSimpleMethodClass; typedef struct _GstDeinterlaceScanlineData GstDeinterlaceScanlineData; /* * This structure defines the simple deinterlacer plugin. */ struct _GstDeinterlaceScanlineData { const guint8 *ttp, *tp, *mp, *bp, *bbp; const guint8 *tt0, *t0, *m0, *b0, *bb0; const guint8 *tt1, *t1, *m1, *b1, *bb1; const guint8 *tt2, *t2, *m2, *b2, *bb2; gboolean bottom_field; }; /* * For interpolate_scanline the input is: * * | t-3 t-2 t-1 t t+1 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 * | TT3 | | TT1 | | TTp * | | T2 | | T0 | * | M3 | | M1 | | Mp * | | B2 | | B0 | * | BB3 | | BB1 | | BBp * * For copy_scanline the input is: * * | t-3 t-2 t-1 t t+1 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 * | | TT2 | | TT0 | * | T3 | | T1 | | Tp * | | M2 | | M0 | * | B3 | | B1 | | Bp * | | BB2 | | BB0 | * * All other values are NULL. */ typedef void (*GstDeinterlaceSimpleMethodFunction) (GstDeinterlaceSimpleMethod *self, guint8 *out, const GstDeinterlaceScanlineData *scanlines); struct _GstDeinterlaceSimpleMethod { GstDeinterlaceMethod parent; GstDeinterlaceSimpleMethodFunction interpolate_scanline_packed; GstDeinterlaceSimpleMethodFunction copy_scanline_packed; GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar[3]; GstDeinterlaceSimpleMethodFunction copy_scanline_planar[3]; }; struct _GstDeinterlaceSimpleMethodClass { GstDeinterlaceMethodClass parent_class; /* Packed formats */ GstDeinterlaceSimpleMethodFunction interpolate_scanline_yuy2; GstDeinterlaceSimpleMethodFunction copy_scanline_yuy2; GstDeinterlaceSimpleMethodFunction interpolate_scanline_yvyu; GstDeinterlaceSimpleMethodFunction copy_scanline_yvyu; GstDeinterlaceSimpleMethodFunction interpolate_scanline_uyvy; GstDeinterlaceSimpleMethodFunction copy_scanline_uyvy; GstDeinterlaceSimpleMethodFunction interpolate_scanline_ayuv; GstDeinterlaceSimpleMethodFunction copy_scanline_ayuv; GstDeinterlaceSimpleMethodFunction interpolate_scanline_argb; GstDeinterlaceSimpleMethodFunction copy_scanline_argb; GstDeinterlaceSimpleMethodFunction interpolate_scanline_abgr; GstDeinterlaceSimpleMethodFunction copy_scanline_abgr; GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgba; GstDeinterlaceSimpleMethodFunction copy_scanline_rgba; GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgra; GstDeinterlaceSimpleMethodFunction copy_scanline_bgra; GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgb; GstDeinterlaceSimpleMethodFunction copy_scanline_rgb; GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgr; GstDeinterlaceSimpleMethodFunction copy_scanline_bgr; /* Semi-planar formats */ GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv12; GstDeinterlaceSimpleMethodFunction copy_scanline_nv12; GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv21; GstDeinterlaceSimpleMethodFunction copy_scanline_nv21; /* Planar formats */ GstDeinterlaceSimpleMethodFunction copy_scanline_planar_y; GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_y; GstDeinterlaceSimpleMethodFunction copy_scanline_planar_u; GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_u; GstDeinterlaceSimpleMethodFunction copy_scanline_planar_v; GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_v; }; GType gst_deinterlace_simple_method_get_type (void); G_END_DECLS #endif /* __GST_DEINTERLACE_METHOD_H__ */ gst-plugins-good-0.10.31/gst/deinterlace/Makefile.in0000644000175000017500000013733311720560231017127 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # This is a makefile.am fragment to build Orc code. # # Define ORC_SOURCE and then include this file, such as: # # ORC_SOURCE=gstadderorc # include $(top_srcdir)/common/orc.mak # # This fragment will create tmp-orc.c and gstadderorc.h from # gstadderorc.orc. # # When 'make dist' is run at the top level, or 'make orc-update' # in a directory including this fragment, the generated source # files will be copied to $(ORC_SOURCE)-dist.[ch]. These files # should be checked in to git, since they are used if Orc is # disabled. # # Note that this file defines BUILT_SOURCES, so any later usage # of BUILT_SOURCES in the Makefile.am that includes this file # must use '+='. # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/common/orc.mak subdir = gst/deinterlace ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstdeinterlace_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstdeinterlace_la_OBJECTS = \ libgstdeinterlace_la-gstdeinterlace.lo \ libgstdeinterlace_la-gstdeinterlacemethod.lo \ libgstdeinterlace_la-tomsmocomp.lo \ libgstdeinterlace_la-greedy.lo libgstdeinterlace_la-greedyh.lo \ libgstdeinterlace_la-vfir.lo libgstdeinterlace_la-weavetff.lo \ libgstdeinterlace_la-weavebff.lo libgstdeinterlace_la-weave.lo \ libgstdeinterlace_la-linear.lo \ libgstdeinterlace_la-linearblend.lo \ libgstdeinterlace_la-scalerbob.lo am__objects_1 = libgstdeinterlace_la-tmp-orc.lo nodist_libgstdeinterlace_la_OBJECTS = $(am__objects_1) libgstdeinterlace_la_OBJECTS = $(am_libgstdeinterlace_la_OBJECTS) \ $(nodist_libgstdeinterlace_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstdeinterlace_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) \ $(libgstdeinterlace_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstdeinterlace_la_SOURCES) \ $(nodist_libgstdeinterlace_la_SOURCES) DIST_SOURCES = $(libgstdeinterlace_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstdeinterlace.la ORC_SOURCE = tvtime EXTRA_DIST = $(ORC_SOURCE).orc ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h orcc_v_gen = $(orcc_v_gen_$(V)) orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) orcc_v_gen_0 = @echo " ORCC $@"; cp_v_gen = $(cp_v_gen_$(V)) cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) cp_v_gen_0 = @echo " CP $@"; libgstdeinterlace_la_SOURCES = \ gstdeinterlace.c \ gstdeinterlacemethod.c \ tvtime/tomsmocomp.c \ tvtime/greedy.c \ tvtime/greedyh.c \ tvtime/vfir.c \ tvtime/weavetff.c \ tvtime/weavebff.c \ tvtime/weave.c \ tvtime/linear.c \ tvtime/linearblend.c \ tvtime/scalerbob.c nodist_libgstdeinterlace_la_SOURCES = $(ORC_NODIST_SOURCES) libgstdeinterlace_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(ORC_CFLAGS) libgstdeinterlace_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_LIBS) $(ORC_LIBS) libgstdeinterlace_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdeinterlace_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstdeinterlace.h \ gstdeinterlacemethod.h \ tvtime/mmx.h \ tvtime/sse.h \ tvtime/greedyh.asm \ tvtime/greedyhmacros.h \ tvtime/plugins.h \ tvtime/x86-64_macros.inc \ tvtime/tomsmocomp/SearchLoop0A.inc \ tvtime/tomsmocomp/SearchLoopBottom.inc \ tvtime/tomsmocomp/SearchLoopEdgeA8.inc \ tvtime/tomsmocomp/SearchLoopEdgeA.inc \ tvtime/tomsmocomp/SearchLoopOddA2.inc \ tvtime/tomsmocomp/SearchLoopOddA6.inc \ tvtime/tomsmocomp/SearchLoopOddAH2.inc \ tvtime/tomsmocomp/SearchLoopOddAH.inc \ tvtime/tomsmocomp/SearchLoopOddA.inc \ tvtime/tomsmocomp/SearchLoopTop.inc \ tvtime/tomsmocomp/SearchLoopVAH.inc \ tvtime/tomsmocomp/SearchLoopVA.inc \ tvtime/tomsmocomp/StrangeBob.inc \ tvtime/tomsmocomp/TomsMoCompAll2.inc \ tvtime/tomsmocomp/TomsMoCompAll.inc \ tvtime/tomsmocomp/tomsmocompmacros.h \ tvtime/tomsmocomp/WierdBob.inc all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/orc.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/deinterlace/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/deinterlace/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/orc.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstdeinterlace.la: $(libgstdeinterlace_la_OBJECTS) $(libgstdeinterlace_la_DEPENDENCIES) $(EXTRA_libgstdeinterlace_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstdeinterlace_la_LINK) -rpath $(plugindir) $(libgstdeinterlace_la_OBJECTS) $(libgstdeinterlace_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-greedy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-greedyh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-linear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-linearblend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-scalerbob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-tmp-orc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-vfir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-weave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-weavebff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdeinterlace_la-weavetff.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstdeinterlace_la-gstdeinterlace.lo: gstdeinterlace.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-gstdeinterlace.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Tpo -c -o libgstdeinterlace_la-gstdeinterlace.lo `test -f 'gstdeinterlace.c' || echo '$(srcdir)/'`gstdeinterlace.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Tpo $(DEPDIR)/libgstdeinterlace_la-gstdeinterlace.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdeinterlace.c' object='libgstdeinterlace_la-gstdeinterlace.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-gstdeinterlace.lo `test -f 'gstdeinterlace.c' || echo '$(srcdir)/'`gstdeinterlace.c libgstdeinterlace_la-gstdeinterlacemethod.lo: gstdeinterlacemethod.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-gstdeinterlacemethod.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Tpo -c -o libgstdeinterlace_la-gstdeinterlacemethod.lo `test -f 'gstdeinterlacemethod.c' || echo '$(srcdir)/'`gstdeinterlacemethod.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Tpo $(DEPDIR)/libgstdeinterlace_la-gstdeinterlacemethod.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdeinterlacemethod.c' object='libgstdeinterlace_la-gstdeinterlacemethod.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-gstdeinterlacemethod.lo `test -f 'gstdeinterlacemethod.c' || echo '$(srcdir)/'`gstdeinterlacemethod.c libgstdeinterlace_la-tomsmocomp.lo: tvtime/tomsmocomp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-tomsmocomp.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Tpo -c -o libgstdeinterlace_la-tomsmocomp.lo `test -f 'tvtime/tomsmocomp.c' || echo '$(srcdir)/'`tvtime/tomsmocomp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Tpo $(DEPDIR)/libgstdeinterlace_la-tomsmocomp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/tomsmocomp.c' object='libgstdeinterlace_la-tomsmocomp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-tomsmocomp.lo `test -f 'tvtime/tomsmocomp.c' || echo '$(srcdir)/'`tvtime/tomsmocomp.c libgstdeinterlace_la-greedy.lo: tvtime/greedy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-greedy.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-greedy.Tpo -c -o libgstdeinterlace_la-greedy.lo `test -f 'tvtime/greedy.c' || echo '$(srcdir)/'`tvtime/greedy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-greedy.Tpo $(DEPDIR)/libgstdeinterlace_la-greedy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/greedy.c' object='libgstdeinterlace_la-greedy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-greedy.lo `test -f 'tvtime/greedy.c' || echo '$(srcdir)/'`tvtime/greedy.c libgstdeinterlace_la-greedyh.lo: tvtime/greedyh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-greedyh.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-greedyh.Tpo -c -o libgstdeinterlace_la-greedyh.lo `test -f 'tvtime/greedyh.c' || echo '$(srcdir)/'`tvtime/greedyh.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-greedyh.Tpo $(DEPDIR)/libgstdeinterlace_la-greedyh.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/greedyh.c' object='libgstdeinterlace_la-greedyh.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-greedyh.lo `test -f 'tvtime/greedyh.c' || echo '$(srcdir)/'`tvtime/greedyh.c libgstdeinterlace_la-vfir.lo: tvtime/vfir.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-vfir.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-vfir.Tpo -c -o libgstdeinterlace_la-vfir.lo `test -f 'tvtime/vfir.c' || echo '$(srcdir)/'`tvtime/vfir.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-vfir.Tpo $(DEPDIR)/libgstdeinterlace_la-vfir.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/vfir.c' object='libgstdeinterlace_la-vfir.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-vfir.lo `test -f 'tvtime/vfir.c' || echo '$(srcdir)/'`tvtime/vfir.c libgstdeinterlace_la-weavetff.lo: tvtime/weavetff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-weavetff.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-weavetff.Tpo -c -o libgstdeinterlace_la-weavetff.lo `test -f 'tvtime/weavetff.c' || echo '$(srcdir)/'`tvtime/weavetff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-weavetff.Tpo $(DEPDIR)/libgstdeinterlace_la-weavetff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/weavetff.c' object='libgstdeinterlace_la-weavetff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-weavetff.lo `test -f 'tvtime/weavetff.c' || echo '$(srcdir)/'`tvtime/weavetff.c libgstdeinterlace_la-weavebff.lo: tvtime/weavebff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-weavebff.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-weavebff.Tpo -c -o libgstdeinterlace_la-weavebff.lo `test -f 'tvtime/weavebff.c' || echo '$(srcdir)/'`tvtime/weavebff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-weavebff.Tpo $(DEPDIR)/libgstdeinterlace_la-weavebff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/weavebff.c' object='libgstdeinterlace_la-weavebff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-weavebff.lo `test -f 'tvtime/weavebff.c' || echo '$(srcdir)/'`tvtime/weavebff.c libgstdeinterlace_la-weave.lo: tvtime/weave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-weave.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-weave.Tpo -c -o libgstdeinterlace_la-weave.lo `test -f 'tvtime/weave.c' || echo '$(srcdir)/'`tvtime/weave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-weave.Tpo $(DEPDIR)/libgstdeinterlace_la-weave.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/weave.c' object='libgstdeinterlace_la-weave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-weave.lo `test -f 'tvtime/weave.c' || echo '$(srcdir)/'`tvtime/weave.c libgstdeinterlace_la-linear.lo: tvtime/linear.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-linear.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-linear.Tpo -c -o libgstdeinterlace_la-linear.lo `test -f 'tvtime/linear.c' || echo '$(srcdir)/'`tvtime/linear.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-linear.Tpo $(DEPDIR)/libgstdeinterlace_la-linear.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/linear.c' object='libgstdeinterlace_la-linear.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-linear.lo `test -f 'tvtime/linear.c' || echo '$(srcdir)/'`tvtime/linear.c libgstdeinterlace_la-linearblend.lo: tvtime/linearblend.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-linearblend.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-linearblend.Tpo -c -o libgstdeinterlace_la-linearblend.lo `test -f 'tvtime/linearblend.c' || echo '$(srcdir)/'`tvtime/linearblend.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-linearblend.Tpo $(DEPDIR)/libgstdeinterlace_la-linearblend.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/linearblend.c' object='libgstdeinterlace_la-linearblend.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-linearblend.lo `test -f 'tvtime/linearblend.c' || echo '$(srcdir)/'`tvtime/linearblend.c libgstdeinterlace_la-scalerbob.lo: tvtime/scalerbob.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-scalerbob.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-scalerbob.Tpo -c -o libgstdeinterlace_la-scalerbob.lo `test -f 'tvtime/scalerbob.c' || echo '$(srcdir)/'`tvtime/scalerbob.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-scalerbob.Tpo $(DEPDIR)/libgstdeinterlace_la-scalerbob.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tvtime/scalerbob.c' object='libgstdeinterlace_la-scalerbob.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-scalerbob.lo `test -f 'tvtime/scalerbob.c' || echo '$(srcdir)/'`tvtime/scalerbob.c libgstdeinterlace_la-tmp-orc.lo: tmp-orc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -MT libgstdeinterlace_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstdeinterlace_la-tmp-orc.Tpo -c -o libgstdeinterlace_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdeinterlace_la-tmp-orc.Tpo $(DEPDIR)/libgstdeinterlace_la-tmp-orc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tmp-orc.c' object='libgstdeinterlace_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdeinterlace_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdeinterlace_la_CFLAGS) $(CFLAGS) -c -o libgstdeinterlace_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-local \ clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-local clean-pluginLTLIBRARIES ctags \ dist-hook distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-pluginLTLIBRARIES orc-update: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h @HAVE_ORCC_TRUE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_FALSE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c @HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c @HAVE_ORCC_FALSE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c @HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h clean-local: clean-orc .PHONY: clean-orc clean-orc: rm -f tmp-orc.c $(ORC_SOURCE).h dist-hook: dist-hook-orc .PHONY: dist-hook-orc # we try and copy updated orc -dist files below, but don't fail if it # doesn't work as the srcdir might not be writable dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c rm -f tmp-orc.c~ cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstdeinterlace -:SHARED libgstdeinterlace \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstdeinterlace_la_SOURCES) \ $(nodist_libgstdeinterlace_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdeinterlace_la_CFLAGS) \ -:LDFLAGS $(libgstdeinterlace_la_LDFLAGS) \ $(libgstdeinterlace_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/flx/0000755000175000017500000000000011720565303013447 500000000000000gst-plugins-good-0.10.31/gst/flx/flx_color.c0000644000175000017500000000547411671175353015543 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #include #include "flx_color.h" FlxColorSpaceConverter * flx_colorspace_converter_new (gint width, gint height) { FlxColorSpaceConverter *new = g_malloc (sizeof (FlxColorSpaceConverter)); new->width = width; new->height = height; memset (new->palvec, 0, sizeof (new->palvec)); return new; } void flx_colorspace_converter_destroy (FlxColorSpaceConverter * flxpal) { g_return_if_fail (flxpal != NULL); g_free (flxpal); } void flx_colorspace_convert (FlxColorSpaceConverter * flxpal, guchar * src, guchar * dest) { guint size, col; g_return_if_fail (flxpal != NULL); g_return_if_fail (src != dest); size = flxpal->width * flxpal->height; while (size--) { col = (*src++ * 3); #if G_BYTE_ORDER == G_BIG_ENDIAN *dest++ = 0; *dest++ = flxpal->palvec[col]; *dest++ = flxpal->palvec[col + 1]; *dest++ = flxpal->palvec[col + 2]; #else *dest++ = flxpal->palvec[col + 2]; *dest++ = flxpal->palvec[col + 1]; *dest++ = flxpal->palvec[col]; *dest++ = 0; #endif } } void flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, guint num, guchar * newpal, gint scale) { guint grab; g_return_if_fail (flxpal != NULL); g_return_if_fail (start < 0x100); grab = ((start + num) > 0x100 ? 0x100 - start : num); if (scale) { gint i = 0; start *= 3; while (grab) { flxpal->palvec[start++] = newpal[i++] << scale; flxpal->palvec[start++] = newpal[i++] << scale; flxpal->palvec[start++] = newpal[i++] << scale; grab--; } } else { memcpy (&flxpal->palvec[start * 3], newpal, grab * 3); } } void flx_set_color (FlxColorSpaceConverter * flxpal, guint colr, guint red, guint green, guint blue, gint scale) { g_return_if_fail (flxpal != NULL); g_return_if_fail (colr < 0x100); flxpal->palvec[(colr * 3)] = red << scale; flxpal->palvec[(colr * 3) + 1] = green << scale; flxpal->palvec[(colr * 3) + 2] = blue << scale; } gst-plugins-good-0.10.31/gst/flx/Makefile.am0000644000175000017500000000164211671175353015435 00000000000000plugin_LTLIBRARIES = libgstflxdec.la libgstflxdec_la_SOURCES = gstflxdec.c flx_color.c libgstflxdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstflxdec_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) libgstflxdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstflxdec_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = flx_fmt.h flx_color.h gstflxdec.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstflxdec -:SHARED libgstflxdec \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstflxdec_la_SOURCES) \ $(nodist_libgstflxdec_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflxdec_la_CFLAGS) \ -:LDFLAGS $(libgstflxdec_la_LDFLAGS) \ $(libgstflxdec_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/flx/flx_color.h0000644000175000017500000000323311671175353015537 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 __FLX_COLOR_H__ #define __FLX_COLOR_H__ #include G_BEGIN_DECLS typedef enum { FLX_COLORSPACE_RGB8, FLX_COLORSPACE_RGB32, } FlxColorSpaceType; typedef struct _FlxColorSpaceConverter FlxColorSpaceConverter; struct _FlxColorSpaceConverter { guint width; guint height; guchar palvec[768]; }; void flx_colorspace_converter_destroy(FlxColorSpaceConverter *flxpal); void flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest); FlxColorSpaceConverter * flx_colorspace_converter_new(gint width, gint height); void flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, guchar *newpal, gint scale); void flx_set_color(FlxColorSpaceConverter *flxpal, guint colr, guint red, guint green, guint blue, gint scale); G_END_DECLS #endif /* __FLX_COLOR_H__ */ gst-plugins-good-0.10.31/gst/flx/gstflxdec.c0000644000175000017500000004404611677341655015543 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-flxdec * * This element decodes fli/flc/flx-video into raw video */ /* * http://www.coolutils.com/Formats/FLI * http://woodshole.er.usgs.gov/operations/modeling/flc.html */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "flx_fmt.h" #include "gstflxdec.h" #include #define JIFFIE (GST_SECOND/70) GST_DEBUG_CATEGORY_STATIC (flxdec_debug); #define GST_CAT_DEFAULT flxdec_debug /* input */ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-fli") ); /* output */ static GstStaticPadTemplate src_video_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) ); static void gst_flxdec_class_init (GstFlxDecClass * klass); static void gst_flxdec_base_init (GstFlxDecClass * klass); static void gst_flxdec_init (GstFlxDec * flxdec); static void gst_flxdec_dispose (GstFlxDec * flxdec); static GstFlowReturn gst_flxdec_chain (GstPad * pad, GstBuffer * buf); static GstStateChangeReturn gst_flxdec_change_state (GstElement * element, GstStateChange transition); static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstQuery * query); static gboolean gst_flxdec_src_event_handler (GstPad * pad, GstEvent * event); static gboolean gst_flxdec_sink_event_handler (GstPad * pad, GstEvent * event); static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); #define rndalign(off) ((off) + ((off) & 1)) static GstElementClass *parent_class = NULL; GType gst_flxdec_get_type (void) { static GType flxdec_type = 0; if (!flxdec_type) { static const GTypeInfo flxdec_info = { sizeof (GstFlxDecClass), (GBaseInitFunc) gst_flxdec_base_init, NULL, (GClassInitFunc) gst_flxdec_class_init, NULL, NULL, sizeof (GstFlxDec), 0, (GInstanceInitFunc) gst_flxdec_init, }; flxdec_type = g_type_register_static (GST_TYPE_ELEMENT, "GstFlxDec", &flxdec_info, 0); } return flxdec_type; } static void gst_flxdec_base_init (GstFlxDecClass * klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (gstelement_class, "FLX video decoder", "Codec/Decoder/Video", "FLC/FLI/FLX video decoder", "Sepp Wijnands , Zeeshan Ali "); gst_element_class_add_static_pad_template (gstelement_class, &sink_factory); gst_element_class_add_static_pad_template (gstelement_class, &src_video_factory); } static void gst_flxdec_class_init (GstFlxDecClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->dispose = (GObjectFinalizeFunc) gst_flxdec_dispose; GST_DEBUG_CATEGORY_INIT (flxdec_debug, "flxdec", 0, "FLX video decoder"); gstelement_class->change_state = gst_flxdec_change_state; } static void gst_flxdec_init (GstFlxDec * flxdec) { flxdec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->sinkpad); gst_pad_set_chain_function (flxdec->sinkpad, gst_flxdec_chain); gst_pad_set_event_function (flxdec->sinkpad, gst_flxdec_sink_event_handler); flxdec->srcpad = gst_pad_new_from_static_template (&src_video_factory, "src"); gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->srcpad); gst_pad_set_query_function (flxdec->srcpad, gst_flxdec_src_query_handler); gst_pad_set_event_function (flxdec->srcpad, gst_flxdec_src_event_handler); gst_pad_use_fixed_caps (flxdec->srcpad); flxdec->frame = NULL; flxdec->delta = NULL; flxdec->adapter = gst_adapter_new (); } static void gst_flxdec_dispose (GstFlxDec * flxdec) { if (flxdec->adapter) { g_object_unref (flxdec->adapter); flxdec->adapter = NULL; } G_OBJECT_CLASS (parent_class)->dispose ((GObject *) flxdec); } static gboolean gst_flxdec_src_query_handler (GstPad * pad, GstQuery * query) { GstFlxDec *flxdec = (GstFlxDec *) gst_pad_get_parent (pad); gboolean ret = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); if (format != GST_FORMAT_TIME) goto done; gst_query_set_duration (query, format, flxdec->duration); ret = TRUE; } default: break; } done: gst_object_unref (flxdec); return ret; } static gboolean gst_flxdec_src_event_handler (GstPad * pad, GstEvent * event) { GstFlxDec *flxdec = (GstFlxDec *) gst_pad_get_parent (pad); gboolean ret; /* TODO: implement the seek and other event handling */ ret = gst_pad_push_event (flxdec->sinkpad, event); gst_object_unref (flxdec); return ret; } static gboolean gst_flxdec_sink_event_handler (GstPad * pad, GstEvent * event) { GstFlxDec *flxdec; gboolean ret; flxdec = GST_FLXDEC (gst_pad_get_parent (pad)); ret = gst_pad_push_event (flxdec->srcpad, event); gst_object_unref (flxdec); return ret; } static void flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, guchar * dest) { FlxFrameChunk *hdr; g_return_if_fail (data != NULL); while (count--) { hdr = (FlxFrameChunk *) data; FLX_FRAME_CHUNK_FIX_ENDIANNESS (hdr); data += FlxFrameChunkSize; switch (hdr->id) { case FLX_COLOR64: flx_decode_color (flxdec, data, dest, 2); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_COLOR256: flx_decode_color (flxdec, data, dest, 0); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_BRUN: flx_decode_brun (flxdec, data, dest); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_LC: flx_decode_delta_fli (flxdec, data, dest); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_SS2: flx_decode_delta_flc (flxdec, data, dest); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_BLACK: memset (dest, 0, flxdec->size); break; case FLX_MINI: data += rndalign (hdr->size) - FlxFrameChunkSize; break; default: GST_WARNING ("Unimplented chunk type: 0x%02x size: %d - skipping", hdr->id, hdr->size); data += rndalign (hdr->size) - FlxFrameChunkSize; break; } } } static void flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale) { guint packs, count, indx; g_return_if_fail (flxdec != NULL); packs = (data[0] + (data[1] << 8)); data += 2; indx = 0; GST_LOG ("GstFlxDec: cmap packs: %d", packs); while (packs--) { /* color map index + skip count */ indx += *data++; /* number of rgb triplets */ count = *data++ & 0xff; if (count == 0) count = 256; GST_LOG ("GstFlxDec: cmap count: %d (indx: %d)", count, indx); flx_set_palette_vector (flxdec->converter, indx, count, data, scale); data += (count * 3); } } static void flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) { gulong count, lines, row; guchar x; g_return_if_fail (flxdec != NULL); lines = flxdec->hdr.height; while (lines--) { /* packet count. * should not be used anymore, since the flc format can * contain more then 255 RLE packets. we use the frame * width instead. */ data++; row = flxdec->hdr.width; while (row) { count = *data++; if (count > 0x7f) { /* literal run */ count = 0x100 - count; row -= count; while (count--) *dest++ = *data++; } else { /* replicate run */ row -= count; x = *data++; while (count--) *dest++ = x; } } } } static void flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) { gulong count, packets, lines, start_line; guchar *start_p, x; g_return_if_fail (flxdec != NULL); g_return_if_fail (flxdec->delta != NULL); /* use last frame for delta */ memcpy (dest, GST_BUFFER_DATA (flxdec->delta), GST_BUFFER_SIZE (flxdec->delta)); start_line = (data[0] + (data[1] << 8)); lines = (data[2] + (data[3] << 8)); data += 4; /* start position of delta */ dest += (flxdec->hdr.width * start_line); start_p = dest; while (lines--) { /* packet count */ packets = *data++; while (packets--) { /* skip count */ dest += *data++; /* RLE count */ count = *data++; if (count > 0x7f) { /* literal run */ count = 0x100 - count; x = *data++; while (count--) *dest++ = x; } else { /* replicate run */ while (count--) *dest++ = *data++; } } start_p += flxdec->hdr.width; dest = start_p; } } static void flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) { gulong count, lines, start_l, opcode; guchar *start_p; g_return_if_fail (flxdec != NULL); g_return_if_fail (flxdec->delta != NULL); /* use last frame for delta */ memcpy (dest, GST_BUFFER_DATA (flxdec->delta), GST_BUFFER_SIZE (flxdec->delta)); lines = (data[0] + (data[1] << 8)); data += 2; start_p = dest; start_l = lines; while (lines) { dest = start_p + (flxdec->hdr.width * (start_l - lines)); /* process opcode(s) */ while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) { data += 2; if ((opcode & 0xc000) == 0xc000) { /* skip count */ start_l += (0x10000 - opcode); dest += flxdec->hdr.width * (0x10000 - opcode); } else { /* last pixel */ dest += flxdec->hdr.width; *dest++ = (opcode & 0xff); } } data += 2; /* last opcode is the packet count */ while (opcode--) { /* skip count */ dest += *data++; /* RLE count */ count = *data++; if (count > 0x7f) { /* replicate word run */ count = 0x100 - count; while (count--) { *dest++ = data[0]; *dest++ = data[1]; } data += 2; } else { /* literal word run */ while (count--) { *dest++ = *data++; *dest++ = *data++; } } } lines--; } } static GstFlowReturn gst_flxdec_chain (GstPad * pad, GstBuffer * buf) { GstCaps *caps; guint avail; GstFlowReturn res = GST_FLOW_OK; GstFlxDec *flxdec; FlxHeader *flxh; g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); flxdec = (GstFlxDec *) gst_pad_get_parent (pad); g_return_val_if_fail (flxdec != NULL, GST_FLOW_ERROR); gst_adapter_push (flxdec->adapter, buf); avail = gst_adapter_available (flxdec->adapter); if (flxdec->state == GST_FLXDEC_READ_HEADER) { if (avail >= FlxHeaderSize) { const guint8 *data = gst_adapter_peek (flxdec->adapter, FlxHeaderSize); memcpy ((gchar *) & flxdec->hdr, data, FlxHeaderSize); FLX_HDR_FIX_ENDIANNESS (&(flxdec->hdr)); gst_adapter_flush (flxdec->adapter, FlxHeaderSize); flxh = &flxdec->hdr; /* check header */ if (flxh->type != FLX_MAGICHDR_FLI && flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) goto wrong_type; GST_LOG ("size : %d", flxh->size); GST_LOG ("frames : %d", flxh->frames); GST_LOG ("width : %d", flxh->width); GST_LOG ("height : %d", flxh->height); GST_LOG ("depth : %d", flxh->depth); GST_LOG ("speed : %d", flxh->speed); flxdec->next_time = 0; if (flxh->type == FLX_MAGICHDR_FLI) { flxdec->frame_time = JIFFIE * flxh->speed; } else if (flxh->speed == 0) { flxdec->frame_time = GST_SECOND / 70; } else { flxdec->frame_time = flxh->speed * GST_MSECOND; } flxdec->duration = flxh->frames * flxdec->frame_time; GST_LOG ("duration : %" GST_TIME_FORMAT, GST_TIME_ARGS (flxdec->duration)); caps = gst_caps_from_string (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN); gst_caps_set_simple (caps, "width", G_TYPE_INT, flxh->width, "height", G_TYPE_INT, flxh->height, "framerate", GST_TYPE_FRACTION, (gint) GST_MSECOND, (gint) flxdec->frame_time / 1000, NULL); gst_pad_set_caps (flxdec->srcpad, caps); gst_caps_unref (caps); if (flxh->depth <= 8) flxdec->converter = flx_colorspace_converter_new (flxh->width, flxh->height); if (flxh->type == FLX_MAGICHDR_FLC || flxh->type == FLX_MAGICHDR_FLX) { GST_LOG ("(FLC) aspect_dx : %d", flxh->aspect_dx); GST_LOG ("(FLC) aspect_dy : %d", flxh->aspect_dy); GST_LOG ("(FLC) oframe1 : 0x%08x", flxh->oframe1); GST_LOG ("(FLC) oframe2 : 0x%08x", flxh->oframe2); } flxdec->size = (flxh->width * flxh->height); /* create delta and output frame */ flxdec->frame = gst_buffer_new (); flxdec->delta = gst_buffer_new (); GST_BUFFER_DATA (flxdec->frame) = g_malloc (flxdec->size); GST_BUFFER_MALLOCDATA (flxdec->frame) = GST_BUFFER_DATA (flxdec->frame); GST_BUFFER_SIZE (flxdec->frame) = flxdec->size; GST_BUFFER_DATA (flxdec->delta) = g_malloc (flxdec->size); GST_BUFFER_MALLOCDATA (flxdec->delta) = GST_BUFFER_DATA (flxdec->delta); GST_BUFFER_SIZE (flxdec->delta) = flxdec->size; flxdec->state = GST_FLXDEC_PLAYING; } } else if (flxdec->state == GST_FLXDEC_PLAYING) { GstBuffer *out; /* while we have enough data in the adapter */ while (avail >= FlxFrameChunkSize) { FlxFrameChunk flxfh; guchar *chunk; const guint8 *data; chunk = NULL; data = gst_adapter_peek (flxdec->adapter, FlxFrameChunkSize); memcpy (&flxfh, data, FlxFrameChunkSize); FLX_FRAME_CHUNK_FIX_ENDIANNESS (&flxfh); switch (flxfh.id) { case FLX_FRAME_TYPE: /* check if we have the complete frame */ if (avail < flxfh.size) goto need_more_data; /* flush header */ gst_adapter_flush (flxdec->adapter, FlxFrameChunkSize); chunk = gst_adapter_take (flxdec->adapter, flxfh.size - FlxFrameChunkSize); FLX_FRAME_TYPE_FIX_ENDIANNESS ((FlxFrameType *) chunk); if (((FlxFrameType *) chunk)->chunks == 0) break; /* create 32 bits output frame */ res = gst_pad_alloc_buffer_and_set_caps (flxdec->srcpad, GST_BUFFER_OFFSET_NONE, flxdec->size * 4, GST_PAD_CAPS (flxdec->srcpad), &out); if (res != GST_FLOW_OK) break; /* decode chunks */ flx_decode_chunks (flxdec, ((FlxFrameType *) chunk)->chunks, chunk + FlxFrameTypeSize, GST_BUFFER_DATA (flxdec->frame)); /* save copy of the current frame for possible delta. */ memcpy (GST_BUFFER_DATA (flxdec->delta), GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_SIZE (flxdec->delta)); /* convert current frame. */ flx_colorspace_convert (flxdec->converter, GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_DATA (out)); GST_BUFFER_TIMESTAMP (out) = flxdec->next_time; flxdec->next_time += flxdec->frame_time; gst_pad_push (flxdec->srcpad, out); break; } if (chunk) g_free (chunk); avail = gst_adapter_available (flxdec->adapter); } } need_more_data: gst_object_unref (flxdec); return res; /* ERRORS */ wrong_type: { GST_ELEMENT_ERROR (flxdec, STREAM, WRONG_TYPE, (NULL), ("not a flx file (type %x)", flxh->type)); gst_object_unref (flxdec); return GST_FLOW_ERROR; } } static GstStateChangeReturn gst_flxdec_change_state (GstElement * element, GstStateChange transition) { GstFlxDec *flxdec; GstStateChangeReturn ret; flxdec = GST_FLXDEC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (flxdec->adapter); flxdec->state = GST_FLXDEC_READ_HEADER; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: if (flxdec->frame) { gst_buffer_unref (flxdec->frame); flxdec->frame = NULL; } if (flxdec->delta) { gst_buffer_unref (flxdec->delta); flxdec->delta = NULL; } break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "flxdec", GST_RANK_PRIMARY, GST_TYPE_FLXDEC); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "flxdec", "FLC/FLI/FLX video decoder", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/flx/gstflxdec.h0000644000175000017500000000431511671175353015535 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_FLX_DECODER_H__ #define __GST_FLX_DECODER_H__ #include #include #include "flx_color.h" G_BEGIN_DECLS typedef enum { GST_FLXDEC_READ_HEADER, GST_FLXDEC_PLAYING, } GstFlxDecState; /* Definition of structure storing data for this element. */ typedef struct _GstFlxDec GstFlxDec; struct _GstFlxDec { GstElement element; GstPad *sinkpad,*srcpad; gboolean active, new_meta; GstBuffer *delta, *frame; GstAdapter *adapter; gulong size; GstFlxDecState state; gint64 frame_time; gint64 next_time; gint64 duration; FlxColorSpaceConverter *converter; FlxHeader hdr; }; /* Standard definition defining a class for this element. */ typedef struct _GstFlxDecClass GstFlxDecClass; struct _GstFlxDecClass { GstElementClass parent_class; }; /* Standard macros for defining types for this element. */ #define GST_TYPE_FLXDEC \ (gst_flxdec_get_type()) #define GST_FLXDEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLXDEC,GstFlxDec)) #define GST_FLXDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLXDEC,GstFlxDecClass)) #define GST_IS_FLXDEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLXDEC)) #define GST_IS_FLXDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLXDEC)) /* Standard function returning type information. */ GType gst_flxdec_get_type(void); G_END_DECLS #endif /* __GST_FLX_DECODER_H__ */ gst-plugins-good-0.10.31/gst/flx/flx_fmt.h0000644000175000017500000001310611671175353015207 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_FLX_FMT__H__ #define __GST_FLX_FMT_H__ #include G_BEGIN_DECLS enum Flx_TypeChunk { /* frame chunks */ FLX_PREFIX_TYPE = 0xf100, FLX_SCRIPT_CHUNK = 0xf1e0, FLX_FRAME_TYPE = 0xf1fa, FLX_SEGMENT_TABLE = 0xf1fb, FLX_HUFFMAN_TABLE = 0xf1fc, /* sub chunks */ FLX_CEL_DATA = 3, FLX_COLOR256 = 4, FLX_SS2 = 7, FLX_COLOR64 = 11, FLX_LC = 12, FLX_BLACK = 13, FLX_BRUN = 15, FLX_COPY = 16, FLX_MINI = 18, FLX_DTA_RUN = 25, FLX_DTA_COPY = 26, FLX_DTA_LC = 27, FLX_LABEL = 31, FLX_BMP_MASK = 32, FLX_MLEV_MASK = 33, FLX_SEGMENT = 34, FLX_KEY_IMAGE = 35, FLX_KEY_PAL = 36, FLX_REGION = 37, FLX_WAVE = 38, FLX_USERSTRING = 39, FLX_RGN_MASK = 40 }; enum Flx_MagicHdr { FLX_MAGICHDR_FLI = 0xaf11, FLX_MAGICHDR_FLC = 0xaf12, FLX_MAGICHDR_FLX = 0xaf44, FLX_MAGICHDR_HUFFBWT = 0xaf30 }; typedef struct _FlxHeader { guint32 size; guint16 type; guint16 frames; guint16 width,height,depth,flags; guint32 speed; guint16 reserved1; /* FLC */ guint32 created,creator,updated,updater; guint16 aspect_dx, aspect_dy; /* EGI */ guint16 ext_flags,keyframes,totalframes; guint32 req_memory; guint16 max_regions,transp_num; guchar reserved2[24]; /* FLC */ guint32 oframe1,oframe2; guchar reserved3[40]; } FlxHeader; #define FlxHeaderSize 128 typedef struct _FlxFrameChunk { guint32 size; guint16 id; } FlxFrameChunk; #define FlxFrameChunkSize 6 typedef struct _FlxPrefixChunk { guint16 chunks; guchar reserved[8]; } FlxPrefixChunk; typedef struct _FlxSegmentTable { guint16 segments; } FlxSegmentTable; typedef struct _FlxHuffmanTable { guint16 codelength; guint16 numcodes; guchar reserved[6]; } FlxHuffmanTable; typedef struct _FlxFrameType { guint16 chunks; guint16 delay; guchar reserved[6]; } FlxFrameType; #define FlxFrameTypeSize 10 #if G_BYTE_ORDER == G_BIG_ENDIAN #define LE_TO_BE_16(i16) ((guint16) (((i16) << 8) | ((i16) >> 8))) #define LE_TO_BE_32(i32) \ (((guint32) (LE_TO_BE_16((guint16) (i32))) << 16) | (LE_TO_BE_16((i32) >> 16))) #define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) \ do { \ (frm_type_p)->chunks = LE_TO_BE_16((frm_type_p)->chunks); \ (frm_type_p)->delay = LE_TO_BE_16((frm_type_p)->delay); \ } while(0) #define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) \ do { \ (hffmn_table_p)->codelength = \ LE_TO_BE_16((hffmn_table_p)->codelength); \ (hffmn_table_p)->numcodes = LE_TO_BE_16((hffmn_table_p)->numcodes); \ } while(0) #define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) \ ((sgmnt_table_p)->segments = LE_TO_BE_16((sgmnt_table_p)->segments)) #define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) \ do { \ (prfx_chnk_p)->chunks = LE_TO_BE_16((prfx_chnk_p)->chunks); \ } while(0) #define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) \ do { \ (frm_chnk_p)->size = LE_TO_BE_32((frm_chnk_p)->size); \ (frm_chnk_p)->id = LE_TO_BE_16((frm_chnk_p)->id); \ } while(0) #define FLX_HDR_FIX_ENDIANNESS(hdr_p) \ do { \ (hdr_p)->size = LE_TO_BE_32((hdr_p)->size); \ (hdr_p)->type = LE_TO_BE_16((hdr_p)->type); \ (hdr_p)->frames = LE_TO_BE_16((hdr_p)->frames); \ (hdr_p)->width = LE_TO_BE_16((hdr_p)->width); \ (hdr_p)->height = LE_TO_BE_16((hdr_p)->height); \ (hdr_p)->depth = LE_TO_BE_16((hdr_p)->depth); \ (hdr_p)->flags = LE_TO_BE_16((hdr_p)->flags); \ (hdr_p)->speed = LE_TO_BE_32((hdr_p)->speed); \ (hdr_p)->reserved1 = LE_TO_BE_16((hdr_p)->reserved1); \ (hdr_p)->created = LE_TO_BE_32((hdr_p)->created); \ (hdr_p)->creator = LE_TO_BE_32((hdr_p)->creator); \ (hdr_p)->updated = LE_TO_BE_32((hdr_p)->updated); \ (hdr_p)->updater = LE_TO_BE_32((hdr_p)->updater); \ (hdr_p)->aspect_dx = LE_TO_BE_16((hdr_p)->aspect_dx); \ (hdr_p)->aspect_dy = LE_TO_BE_16((hdr_p)->aspect_dy); \ (hdr_p)->ext_flags = LE_TO_BE_16((hdr_p)->ext_flags); \ (hdr_p)->keyframes = LE_TO_BE_16((hdr_p)->keyframes); \ (hdr_p)->totalframes = LE_TO_BE_16((hdr_p)->totalframes); \ (hdr_p)->req_memory = LE_TO_BE_32((hdr_p)->req_memory); \ (hdr_p)->max_regions = LE_TO_BE_16((hdr_p)->max_regions); \ (hdr_p)->transp_num = LE_TO_BE_16((hdr_p)->transp_num); \ (hdr_p)->oframe1 = LE_TO_BE_32((hdr_p)->oframe1); \ (hdr_p)->oframe2 = LE_TO_BE_32((hdr_p)->oframe2); \ } while(0) #else #define LE_TO_BE_16(i16) ((i16)) #define LE_TO_BE_32(i32) ((i32)) #define FLX_FRAME_TYPE_FIX_ENDIANNESS(frm_type_p) #define FLX_HUFFMAN_TABLE_FIX_ENDIANNESS(hffmn_table_p) #define FLX_SEGMENT_TABLE_FIX_ENDIANNESS(sgmnt_table_p) #define FLX_PREFIX_CHUNK_FIX_ENDIANNESS(prfx_chnk_p) #define FLX_FRAME_CHUNK_FIX_ENDIANNESS(frm_chnk_p) #define FLX_HDR_FIX_ENDIANNESS(hdr_p) #endif /* G_BYTE_ORDER == G_BIG_ENDIAN */ G_END_DECLS #endif /* __GST_FLX_FMT_H__ */ gst-plugins-good-0.10.31/gst/flx/Makefile.in0000644000175000017500000007072111720560232015437 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/flx DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstflxdec_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstflxdec_la_OBJECTS = libgstflxdec_la-gstflxdec.lo \ libgstflxdec_la-flx_color.lo libgstflxdec_la_OBJECTS = $(am_libgstflxdec_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstflxdec_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstflxdec_la_CFLAGS) $(CFLAGS) \ $(libgstflxdec_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstflxdec_la_SOURCES) DIST_SOURCES = $(libgstflxdec_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstflxdec.la libgstflxdec_la_SOURCES = gstflxdec.c flx_color.c libgstflxdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstflxdec_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) libgstflxdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstflxdec_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = flx_fmt.h flx_color.h gstflxdec.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/flx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/flx/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstflxdec.la: $(libgstflxdec_la_OBJECTS) $(libgstflxdec_la_DEPENDENCIES) $(EXTRA_libgstflxdec_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstflxdec_la_LINK) -rpath $(plugindir) $(libgstflxdec_la_OBJECTS) $(libgstflxdec_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflxdec_la-flx_color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstflxdec_la-gstflxdec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstflxdec_la-gstflxdec.lo: gstflxdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -MT libgstflxdec_la-gstflxdec.lo -MD -MP -MF $(DEPDIR)/libgstflxdec_la-gstflxdec.Tpo -c -o libgstflxdec_la-gstflxdec.lo `test -f 'gstflxdec.c' || echo '$(srcdir)/'`gstflxdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflxdec_la-gstflxdec.Tpo $(DEPDIR)/libgstflxdec_la-gstflxdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstflxdec.c' object='libgstflxdec_la-gstflxdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -c -o libgstflxdec_la-gstflxdec.lo `test -f 'gstflxdec.c' || echo '$(srcdir)/'`gstflxdec.c libgstflxdec_la-flx_color.lo: flx_color.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -MT libgstflxdec_la-flx_color.lo -MD -MP -MF $(DEPDIR)/libgstflxdec_la-flx_color.Tpo -c -o libgstflxdec_la-flx_color.lo `test -f 'flx_color.c' || echo '$(srcdir)/'`flx_color.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstflxdec_la-flx_color.Tpo $(DEPDIR)/libgstflxdec_la-flx_color.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='flx_color.c' object='libgstflxdec_la-flx_color.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstflxdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstflxdec_la_CFLAGS) $(CFLAGS) -c -o libgstflxdec_la-flx_color.lo `test -f 'flx_color.c' || echo '$(srcdir)/'`flx_color.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstflxdec -:SHARED libgstflxdec \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstflxdec_la_SOURCES) \ $(nodist_libgstflxdec_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstflxdec_la_CFLAGS) \ -:LDFLAGS $(libgstflxdec_la_LDFLAGS) \ $(libgstflxdec_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/id3demux/0000755000175000017500000000000011720565302014377 500000000000000gst-plugins-good-0.10.31/gst/id3demux/Makefile.am0000644000175000017500000000170611677341655016375 00000000000000plugin_LTLIBRARIES = libgstid3demux.la libgstid3demux_la_SOURCES = gstid3demux.c libgstid3demux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstid3demux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ $(GST_BASE_LIBS) libgstid3demux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstid3demux_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstid3demux.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstid3demux -:SHARED libgstid3demux \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstid3demux_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) \ -:LDFLAGS $(libgstid3demux_la_LDFLAGS) \ $(libgstid3demux_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/id3demux/gstid3demux.h0000644000175000017500000000342011671175353016737 00000000000000/* GStreamer ID3 tag demuxer * Copyright (C) 2005 Jan Schmidt * Copyright (C) 2003-2004 Benjamin Otte * * 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_ID3DEMUX_H__ #define __GST_ID3DEMUX_H__ #include G_BEGIN_DECLS #define GST_TYPE_ID3DEMUX \ (gst_id3demux_get_type()) #define GST_ID3DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ID3DEMUX,GstID3Demux)) #define GST_ID3DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ID3DEMUX,GstID3DemuxClass)) #define GST_IS_ID3DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ID3DEMUX)) #define GST_IS_ID3DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ID3DEMUX)) typedef struct _GstID3Demux GstID3Demux; typedef struct _GstID3DemuxClass GstID3DemuxClass; struct _GstID3Demux { GstTagDemux tagdemux; gboolean prefer_v1; /* prefer ID3v1 tags over ID3v2 tags? */ }; struct _GstID3DemuxClass { GstTagDemuxClass parent_class; }; GType gst_id3demux_get_type (void); G_END_DECLS #endif /* __GST_ID3DEMUX_H__ */ gst-plugins-good-0.10.31/gst/id3demux/gstid3demux.c0000644000175000017500000002146311677341655016747 00000000000000/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ /* GStreamer ID3 tag demuxer * Copyright (C) 2005 Jan Schmidt * Copyright (C) 2003-2004 Benjamin Otte * * 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-id3demux * * id3demux accepts data streams with either (or both) ID3v2 regions at the * start, or ID3v1 at the end. The mime type of the data between the tag blocks * is detected using typefind functions, and the appropriate output mime type * set on outgoing buffers. * * The element is only able to read ID3v1 tags from a seekable stream, because * they are at the end of the stream. That is, when get_range mode is supported * by the upstream elements. If get_range operation is available, id3demux makes * it available downstream. This means that elements which require get_range * mode, such as wavparse, can operate on files containing ID3 tag information. * * This id3demux element replaced an older element with the same name which * relied on libid3tag from the MAD project. * * * Example launch line * |[ * gst-launch filesrc location=file.mp3 ! id3demux ! fakesink -t * ]| This pipeline should read any available ID3 tag information and output it. * The contents of the file inside the ID3 tag regions should be detected, and * the appropriate mime type set on buffers produced from id3demux. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "gstid3demux.h" enum { ARG_0, ARG_PREFER_V1 }; #define DEFAULT_PREFER_V1 FALSE GST_DEBUG_CATEGORY (id3demux_debug); #define GST_CAT_DEFAULT (id3demux_debug) #define ID3V1_TAG_SIZE 128 #define ID3V2_HDR_SIZE GST_TAG_ID3V2_HEADER_SIZE static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-id3") ); static gboolean gst_id3demux_identify_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size); static GstTagDemuxResult gst_id3demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size, GstTagList ** tags); static GstTagList *gst_id3demux_merge_tags (GstTagDemux * tagdemux, const GstTagList * start_tags, const GstTagList * end_tags); static void gst_id3demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_id3demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstID3Demux, gst_id3demux, GstTagDemux, GST_TYPE_TAG_DEMUX); static void gst_id3demux_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "ID3 tag demuxer", "Codec/Demuxer/Metadata", "Read and output ID3v1 and ID3v2 tags while demuxing the contents", "Jan Schmidt "); } static void gst_id3demux_class_init (GstID3DemuxClass * klass) { GstTagDemuxClass *tagdemux_class = (GstTagDemuxClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_id3demux_set_property; gobject_class->get_property = gst_id3demux_get_property; g_object_class_install_property (gobject_class, ARG_PREFER_V1, g_param_spec_boolean ("prefer-v1", "Prefer version 1 tag", "Prefer tags from ID3v1 tag at end of file when both ID3v1 " "and ID3v2 tags are present", DEFAULT_PREFER_V1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); tagdemux_class->identify_tag = GST_DEBUG_FUNCPTR (gst_id3demux_identify_tag); tagdemux_class->parse_tag = GST_DEBUG_FUNCPTR (gst_id3demux_parse_tag); tagdemux_class->merge_tags = GST_DEBUG_FUNCPTR (gst_id3demux_merge_tags); tagdemux_class->min_start_size = ID3V2_HDR_SIZE; tagdemux_class->min_end_size = ID3V1_TAG_SIZE; } static void gst_id3demux_init (GstID3Demux * id3demux, GstID3DemuxClass * klass) { id3demux->prefer_v1 = DEFAULT_PREFER_V1; } static gboolean gst_id3demux_identify_tag (GstTagDemux * demux, GstBuffer * buf, gboolean start_tag, guint * tag_size) { const guint8 *data = GST_BUFFER_DATA (buf); if (start_tag) { if (data[0] != 'I' || data[1] != 'D' || data[2] != '3') goto no_marker; *tag_size = gst_tag_get_id3v2_tag_size (buf); } else { if (data[0] != 'T' || data[1] != 'A' || data[2] != 'G') goto no_marker; *tag_size = ID3V1_TAG_SIZE; } GST_INFO_OBJECT (demux, "Found ID3v%u marker, tag_size = %u", (start_tag) ? 2 : 1, *tag_size); return TRUE; no_marker: { GST_DEBUG_OBJECT (demux, "No ID3v%u marker found", (start_tag) ? 2 : 1); return FALSE; } } static void gst_id3demux_add_container_format (GstTagList * tags) { GstCaps *sink_caps; sink_caps = gst_static_pad_template_get_caps (&sink_factory); gst_pb_utils_add_codec_description_to_tag_list (tags, GST_TAG_CONTAINER_FORMAT, sink_caps); gst_caps_unref (sink_caps); } static GstTagDemuxResult gst_id3demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size, GstTagList ** tags) { if (start_tag) { *tag_size = gst_tag_get_id3v2_tag_size (buffer); *tags = gst_tag_list_from_id3v2_tag (buffer); if (G_LIKELY (*tags != NULL)) { gst_id3demux_add_container_format (*tags); return GST_TAG_DEMUX_RESULT_OK; } else { return GST_TAG_DEMUX_RESULT_BROKEN_TAG; } } else { *tags = gst_tag_list_new_from_id3v1 (GST_BUFFER_DATA (buffer)); if (G_UNLIKELY (*tags == NULL)) return GST_TAG_DEMUX_RESULT_BROKEN_TAG; gst_id3demux_add_container_format (*tags); *tag_size = ID3V1_TAG_SIZE; return GST_TAG_DEMUX_RESULT_OK; } } static GstTagList * gst_id3demux_merge_tags (GstTagDemux * tagdemux, const GstTagList * start_tags, const GstTagList * end_tags) { GstID3Demux *id3demux; GstTagList *merged; gboolean prefer_v1; id3demux = GST_ID3DEMUX (tagdemux); GST_OBJECT_LOCK (id3demux); prefer_v1 = id3demux->prefer_v1; GST_OBJECT_UNLOCK (id3demux); /* we merge in REPLACE mode, so put the less important tags first */ if (prefer_v1) merged = gst_tag_list_merge (start_tags, end_tags, GST_TAG_MERGE_REPLACE); else merged = gst_tag_list_merge (end_tags, start_tags, GST_TAG_MERGE_REPLACE); GST_LOG_OBJECT (id3demux, "start tags: %" GST_PTR_FORMAT, start_tags); GST_LOG_OBJECT (id3demux, "end tags: %" GST_PTR_FORMAT, end_tags); GST_LOG_OBJECT (id3demux, "merged tags: %" GST_PTR_FORMAT, merged); return merged; } static void gst_id3demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstID3Demux *id3demux; id3demux = GST_ID3DEMUX (object); switch (prop_id) { case ARG_PREFER_V1:{ GST_OBJECT_LOCK (id3demux); id3demux->prefer_v1 = g_value_get_boolean (value); GST_OBJECT_UNLOCK (id3demux); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_id3demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstID3Demux *id3demux; id3demux = GST_ID3DEMUX (object); switch (prop_id) { case ARG_PREFER_V1: GST_OBJECT_LOCK (id3demux); g_value_set_boolean (value, id3demux->prefer_v1); GST_OBJECT_UNLOCK (id3demux); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (id3demux_debug, "id3demux", 0, "GStreamer ID3 tag demuxer"); gst_tag_register_musicbrainz_tags (); return gst_element_register (plugin, "id3demux", GST_RANK_PRIMARY, GST_TYPE_ID3DEMUX); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "id3demux", "Demux ID3v1 and ID3v2 tags from a file", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/id3demux/Makefile.in0000644000175000017500000006657211720560233016402 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/id3demux DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstid3demux_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstid3demux_la_OBJECTS = libgstid3demux_la-gstid3demux.lo libgstid3demux_la_OBJECTS = $(am_libgstid3demux_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstid3demux_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstid3demux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstid3demux_la_CFLAGS) $(CFLAGS) \ $(libgstid3demux_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstid3demux_la_SOURCES) DIST_SOURCES = $(libgstid3demux_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstid3demux.la libgstid3demux_la_SOURCES = gstid3demux.c libgstid3demux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstid3demux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ $(GST_BASE_LIBS) libgstid3demux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstid3demux_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstid3demux.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/id3demux/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/id3demux/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstid3demux.la: $(libgstid3demux_la_OBJECTS) $(libgstid3demux_la_DEPENDENCIES) $(EXTRA_libgstid3demux_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstid3demux_la_LINK) -rpath $(plugindir) $(libgstid3demux_la_OBJECTS) $(libgstid3demux_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstid3demux_la-gstid3demux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstid3demux_la-gstid3demux.lo: gstid3demux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstid3demux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) $(CFLAGS) -MT libgstid3demux_la-gstid3demux.lo -MD -MP -MF $(DEPDIR)/libgstid3demux_la-gstid3demux.Tpo -c -o libgstid3demux_la-gstid3demux.lo `test -f 'gstid3demux.c' || echo '$(srcdir)/'`gstid3demux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstid3demux_la-gstid3demux.Tpo $(DEPDIR)/libgstid3demux_la-gstid3demux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstid3demux.c' object='libgstid3demux_la-gstid3demux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstid3demux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) $(CFLAGS) -c -o libgstid3demux_la-gstid3demux.lo `test -f 'gstid3demux.c' || echo '$(srcdir)/'`gstid3demux.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstid3demux -:SHARED libgstid3demux \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstid3demux_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstid3demux_la_CFLAGS) \ -:LDFLAGS $(libgstid3demux_la_LDFLAGS) \ $(libgstid3demux_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/level/0000755000175000017500000000000011720565303013765 500000000000000gst-plugins-good-0.10.31/gst/level/Makefile.am0000644000175000017500000000150411671175353015750 00000000000000plugin_LTLIBRARIES = libgstlevel.la libgstlevel_la_SOURCES = gstlevel.c libgstlevel_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstlevel_la_LIBADD = $(GST_BASE_LIBS) $(LIBM) libgstlevel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstlevel_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstlevel.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstlevel -:SHARED libgstlevel \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstlevel_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstlevel_la_CFLAGS) \ -:LDFLAGS $(libgstlevel_la_LDFLAGS) \ $(libgstlevel_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/level/gstlevel.h0000644000175000017500000000615111671175353015715 00000000000000/* GStreamer * Copyright (C) 1999 Erik Walthinsen * Copyright (C) 2000,2001,2002,2003,2005 * Thomas Vander Stichele * * 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_LEVEL_H__ #define __GST_LEVEL_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_LEVEL \ (gst_level_get_type()) #define GST_LEVEL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LEVEL,GstLevel)) #define GST_LEVEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LEVEL,GstLevelClass)) #define GST_LEVEL_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_LEVEL,GstLevelClass)) #define GST_IS_LEVEL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LEVEL)) #define GST_IS_LEVEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LEVEL)) typedef struct _GstLevel GstLevel; typedef struct _GstLevelClass GstLevelClass; /** * GstLevel: * * Opaque data structure. */ struct _GstLevel { GstBaseTransform element; gboolean message; /* whether or not to post messages */ guint64 interval; /* how many seconds between emits */ gint rate; /* caps variables */ gint width; gint channels; gdouble decay_peak_ttl; /* time to live for peak in seconds */ gdouble decay_peak_falloff; /* falloff in dB/sec */ gint num_frames; /* frame count (1 sample per channel) * since last emit */ gint interval_frames; /* after how many frame to sent a message */ GstClockTime message_ts; /* starttime for next message */ /* per-channel arrays for intermediate values */ gdouble *CS; /* normalized Cumulative Square */ gdouble *peak; /* normalized Peak value over buffer */ gdouble *last_peak; /* last normalized Peak value over interval */ gdouble *decay_peak; /* running decaying normalized Peak */ gdouble *decay_peak_base; /* value of last peak we are decaying from */ gdouble *MS; /* normalized Mean Square of buffer */ gdouble *RMS_dB; /* RMS in dB to emit */ GstClockTime *decay_peak_age; /* age of last peak */ void (*process)(gpointer, guint, guint, gdouble*, gdouble*); }; struct _GstLevelClass { GstBaseTransformClass parent_class; }; GType gst_level_get_type (void); G_END_DECLS #endif /* __GST_LEVEL_H__ */ gst-plugins-good-0.10.31/gst/level/Makefile.in0000644000175000017500000006614011720560233015756 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/level DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstlevel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstlevel_la_OBJECTS = libgstlevel_la-gstlevel.lo libgstlevel_la_OBJECTS = $(am_libgstlevel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstlevel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstlevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstlevel_la_CFLAGS) $(CFLAGS) \ $(libgstlevel_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstlevel_la_SOURCES) DIST_SOURCES = $(libgstlevel_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstlevel.la libgstlevel_la_SOURCES = gstlevel.c libgstlevel_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstlevel_la_LIBADD = $(GST_BASE_LIBS) $(LIBM) libgstlevel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstlevel_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstlevel.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/level/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/level/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstlevel.la: $(libgstlevel_la_OBJECTS) $(libgstlevel_la_DEPENDENCIES) $(EXTRA_libgstlevel_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstlevel_la_LINK) -rpath $(plugindir) $(libgstlevel_la_OBJECTS) $(libgstlevel_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstlevel_la-gstlevel.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstlevel_la-gstlevel.lo: gstlevel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlevel_la_CFLAGS) $(CFLAGS) -MT libgstlevel_la-gstlevel.lo -MD -MP -MF $(DEPDIR)/libgstlevel_la-gstlevel.Tpo -c -o libgstlevel_la-gstlevel.lo `test -f 'gstlevel.c' || echo '$(srcdir)/'`gstlevel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstlevel_la-gstlevel.Tpo $(DEPDIR)/libgstlevel_la-gstlevel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlevel.c' object='libgstlevel_la-gstlevel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstlevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstlevel_la_CFLAGS) $(CFLAGS) -c -o libgstlevel_la-gstlevel.lo `test -f 'gstlevel.c' || echo '$(srcdir)/'`gstlevel.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstlevel -:SHARED libgstlevel \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstlevel_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstlevel_la_CFLAGS) \ -:LDFLAGS $(libgstlevel_la_LDFLAGS) \ $(libgstlevel_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/level/gstlevel.c0000644000175000017500000006204311677341655015720 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) 2000,2001,2002,2003,2005 * Thomas Vander Stichele * * 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-level * * Level analyses incoming audio buffers and, if the #GstLevel:message property * is #TRUE, generates an element message named * "level": * after each interval of time given by the #GstLevel:interval property. * The message's structure contains these fields: * * * * #GstClockTime * "timestamp": * the timestamp of the buffer that triggered the message. * * * * * #GstClockTime * "stream-time": * the stream time of the buffer. * * * * * #GstClockTime * "running-time": * the running_time of the buffer. * * * * * #GstClockTime * "duration": * the duration of the buffer. * * * * * #GstClockTime * "endtime": * the end time of the buffer that triggered the message as stream time (this * is deprecated, as it can be calculated from stream-time + duration) * * * * * #GstValueList of #gdouble * "peak": * the peak power level in dB for each channel * * * * * #GstValueList of #gdouble * "decay": * the decaying peak power level in dB for each channel * the decaying peak level follows the peak level, but starts dropping * if no new peak is reached after the time given by * the the time to live. * When the decaying peak level drops, it does so at the decay rate * as specified by the * the peak falloff rate. * * * * * #GstValueList of #gdouble * "rms": * the Root Mean Square (or average power) level in dB for each channel * * * * * * Example application * |[ * * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "gstlevel.h" GST_DEBUG_CATEGORY_STATIC (level_debug); #define GST_CAT_DEFAULT level_debug #define EPSILON 1e-35f static GstStaticPadTemplate sink_template_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) { 8, 16, 32 }, " "depth = (int) { 8, 16, 32 }, " "signed = (boolean) true; " "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) {32, 64} ") ); static GstStaticPadTemplate src_template_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) { 8, 16, 32 }, " "depth = (int) { 8, 16, 32 }, " "signed = (boolean) true; " "audio/x-raw-float, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) {32, 64} ") ); enum { PROP_0, PROP_SIGNAL_LEVEL, PROP_SIGNAL_INTERVAL, PROP_PEAK_TTL, PROP_PEAK_FALLOFF }; GST_BOILERPLATE (GstLevel, gst_level, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_level_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_level_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_level_finalize (GObject * obj); static gboolean gst_level_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out); static gboolean gst_level_start (GstBaseTransform * trans); static GstFlowReturn gst_level_transform_ip (GstBaseTransform * trans, GstBuffer * in); static void gst_level_base_init (gpointer g_class) { GstElementClass *element_class = g_class; gst_element_class_add_static_pad_template (element_class, &sink_template_factory); gst_element_class_add_static_pad_template (element_class, &src_template_factory); gst_element_class_set_details_simple (element_class, "Level", "Filter/Analyzer/Audio", "RMS/Peak/Decaying Peak Level messager for audio/raw", "Thomas Vander Stichele "); } static void gst_level_class_init (GstLevelClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->set_property = gst_level_set_property; gobject_class->get_property = gst_level_get_property; gobject_class->finalize = gst_level_finalize; g_object_class_install_property (gobject_class, PROP_SIGNAL_LEVEL, g_param_spec_boolean ("message", "message", "Post a level message for each passed interval", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SIGNAL_INTERVAL, g_param_spec_uint64 ("interval", "Interval", "Interval of time between message posts (in nanoseconds)", 1, G_MAXUINT64, GST_SECOND / 10, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PEAK_TTL, g_param_spec_uint64 ("peak-ttl", "Peak TTL", "Time To Live of decay peak before it falls back (in nanoseconds)", 0, G_MAXUINT64, GST_SECOND / 10 * 3, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PEAK_FALLOFF, g_param_spec_double ("peak-falloff", "Peak Falloff", "Decay rate of decay peak after TTL (in dB/sec)", 0.0, G_MAXDOUBLE, 10.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (level_debug, "level", 0, "Level calculation"); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_level_set_caps); trans_class->start = GST_DEBUG_FUNCPTR (gst_level_start); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_level_transform_ip); trans_class->passthrough_on_same_caps = TRUE; } static void gst_level_init (GstLevel * filter, GstLevelClass * g_class) { filter->CS = NULL; filter->peak = NULL; filter->rate = 0; filter->width = 0; filter->channels = 0; filter->interval = GST_SECOND / 10; filter->decay_peak_ttl = GST_SECOND / 10 * 3; filter->decay_peak_falloff = 10.0; /* dB falloff (/sec) */ filter->message = TRUE; filter->process = NULL; gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (filter), TRUE); } static void gst_level_finalize (GObject * obj) { GstLevel *filter = GST_LEVEL (obj); g_free (filter->CS); g_free (filter->peak); g_free (filter->last_peak); g_free (filter->decay_peak); g_free (filter->decay_peak_base); g_free (filter->decay_peak_age); filter->CS = NULL; filter->peak = NULL; filter->last_peak = NULL; filter->decay_peak = NULL; filter->decay_peak_base = NULL; filter->decay_peak_age = NULL; G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_level_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstLevel *filter = GST_LEVEL (object); switch (prop_id) { case PROP_SIGNAL_LEVEL: filter->message = g_value_get_boolean (value); break; case PROP_SIGNAL_INTERVAL: filter->interval = g_value_get_uint64 (value); if (filter->rate) { filter->interval_frames = GST_CLOCK_TIME_TO_FRAMES (filter->interval, filter->rate); } break; case PROP_PEAK_TTL: filter->decay_peak_ttl = gst_guint64_to_gdouble (g_value_get_uint64 (value)); break; case PROP_PEAK_FALLOFF: filter->decay_peak_falloff = g_value_get_double (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_level_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstLevel *filter = GST_LEVEL (object); switch (prop_id) { case PROP_SIGNAL_LEVEL: g_value_set_boolean (value, filter->message); break; case PROP_SIGNAL_INTERVAL: g_value_set_uint64 (value, filter->interval); break; case PROP_PEAK_TTL: g_value_set_uint64 (value, filter->decay_peak_ttl); break; case PROP_PEAK_FALLOFF: g_value_set_double (value, filter->decay_peak_falloff); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* process one (interleaved) channel of incoming samples * calculate square sum of samples * normalize and average over number of samples * returns a normalized cumulative square value, which can be averaged * to return the average power as a double between 0 and 1 * also returns the normalized peak power (square of the highest amplitude) * * caller must assure num is a multiple of channels * samples for multiple channels are interleaved * input sample data enters in *in_data as 8 or 16 bit data * this filter only accepts signed audio data, so mid level is always 0 * * for 16 bit, this code considers the non-existant 32768 value to be * full-scale; so 32767 will not map to 1.0 */ #define DEFINE_INT_LEVEL_CALCULATOR(TYPE, RESOLUTION) \ static void inline \ gst_level_calculate_##TYPE (gpointer data, guint num, guint channels, \ gdouble *NCS, gdouble *NPS) \ { \ TYPE * in = (TYPE *)data; \ register guint j; \ gdouble squaresum = 0.0; /* square sum of the integer samples */ \ register gdouble square = 0.0; /* Square */ \ register gdouble peaksquare = 0.0; /* Peak Square Sample */ \ gdouble normalizer; /* divisor to get a [-1.0, 1.0] range */ \ \ /* *NCS = 0.0; Normalized Cumulative Square */ \ /* *NPS = 0.0; Normalized Peask Square */ \ \ normalizer = (gdouble) (G_GINT64_CONSTANT(1) << (RESOLUTION * 2)); \ \ /* oil_squaresum_shifted_s16(&squaresum,in,num); */ \ for (j = 0; j < num; j += channels) \ { \ square = ((gdouble) in[j]) * in[j]; \ if (square > peaksquare) peaksquare = square; \ squaresum += square; \ } \ \ *NCS = squaresum / normalizer; \ *NPS = peaksquare / normalizer; \ } DEFINE_INT_LEVEL_CALCULATOR (gint32, 31); DEFINE_INT_LEVEL_CALCULATOR (gint16, 15); DEFINE_INT_LEVEL_CALCULATOR (gint8, 7); #define DEFINE_FLOAT_LEVEL_CALCULATOR(TYPE) \ static void inline \ gst_level_calculate_##TYPE (gpointer data, guint num, guint channels, \ gdouble *NCS, gdouble *NPS) \ { \ TYPE * in = (TYPE *)data; \ register guint j; \ gdouble squaresum = 0.0; /* square sum of the integer samples */ \ register gdouble square = 0.0; /* Square */ \ register gdouble peaksquare = 0.0; /* Peak Square Sample */ \ \ /* *NCS = 0.0; Normalized Cumulative Square */ \ /* *NPS = 0.0; Normalized Peask Square */ \ \ /* oil_squaresum_f64(&squaresum,in,num); */ \ for (j = 0; j < num; j += channels) \ { \ square = ((gdouble) in[j]) * in[j]; \ if (square > peaksquare) peaksquare = square; \ squaresum += square; \ } \ \ *NCS = squaresum; \ *NPS = peaksquare; \ } DEFINE_FLOAT_LEVEL_CALCULATOR (gfloat); DEFINE_FLOAT_LEVEL_CALCULATOR (gdouble); /* we would need stride to deinterleave also static void inline gst_level_calculate_gdouble (gpointer data, guint num, guint channels, gdouble *NCS, gdouble *NPS) { oil_squaresum_f64(NCS,(gdouble *)data,num); *NPS = 0.0; } */ static gint structure_get_int (GstStructure * structure, const gchar * field) { gint ret; if (!gst_structure_get_int (structure, field, &ret)) g_assert_not_reached (); return ret; } static gboolean gst_level_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out) { GstLevel *filter = GST_LEVEL (trans); const gchar *mimetype; GstStructure *structure; gint i; structure = gst_caps_get_structure (in, 0); filter->rate = structure_get_int (structure, "rate"); filter->width = structure_get_int (structure, "width"); filter->channels = structure_get_int (structure, "channels"); mimetype = gst_structure_get_name (structure); /* FIXME: set calculator func depending on caps */ filter->process = NULL; if (strcmp (mimetype, "audio/x-raw-int") == 0) { GST_DEBUG_OBJECT (filter, "use int: %u", filter->width); switch (filter->width) { case 8: filter->process = gst_level_calculate_gint8; break; case 16: filter->process = gst_level_calculate_gint16; break; case 32: filter->process = gst_level_calculate_gint32; break; } } else if (strcmp (mimetype, "audio/x-raw-float") == 0) { GST_DEBUG_OBJECT (filter, "use float, %u", filter->width); switch (filter->width) { case 32: filter->process = gst_level_calculate_gfloat; break; case 64: filter->process = gst_level_calculate_gdouble; break; } } /* allocate channel variable arrays */ g_free (filter->CS); g_free (filter->peak); g_free (filter->last_peak); g_free (filter->decay_peak); g_free (filter->decay_peak_base); g_free (filter->decay_peak_age); filter->CS = g_new (gdouble, filter->channels); filter->peak = g_new (gdouble, filter->channels); filter->last_peak = g_new (gdouble, filter->channels); filter->decay_peak = g_new (gdouble, filter->channels); filter->decay_peak_base = g_new (gdouble, filter->channels); filter->decay_peak_age = g_new (GstClockTime, filter->channels); for (i = 0; i < filter->channels; ++i) { filter->CS[i] = filter->peak[i] = filter->last_peak[i] = filter->decay_peak[i] = filter->decay_peak_base[i] = 0.0; filter->decay_peak_age[i] = G_GUINT64_CONSTANT (0); } filter->interval_frames = GST_CLOCK_TIME_TO_FRAMES (filter->interval, filter->rate); return TRUE; } static gboolean gst_level_start (GstBaseTransform * trans) { GstLevel *filter = GST_LEVEL (trans); filter->num_frames = 0; return TRUE; } static GstMessage * gst_level_message_new (GstLevel * level, GstClockTime timestamp, GstClockTime duration) { GstBaseTransform *trans = GST_BASE_TRANSFORM_CAST (level); GstStructure *s; GValue v = { 0, }; GstClockTime endtime, running_time, stream_time; g_value_init (&v, GST_TYPE_LIST); running_time = gst_segment_to_running_time (&trans->segment, GST_FORMAT_TIME, timestamp); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); /* endtime is for backwards compatibility */ endtime = stream_time + duration; s = gst_structure_new ("level", "endtime", GST_TYPE_CLOCK_TIME, endtime, "timestamp", G_TYPE_UINT64, timestamp, "stream-time", G_TYPE_UINT64, stream_time, "running-time", G_TYPE_UINT64, running_time, "duration", G_TYPE_UINT64, duration, NULL); /* will copy-by-value */ gst_structure_set_value (s, "rms", &v); gst_structure_set_value (s, "peak", &v); gst_structure_set_value (s, "decay", &v); g_value_unset (&v); return gst_message_new_element (GST_OBJECT (level), s); } static void gst_level_message_append_channel (GstMessage * m, gdouble rms, gdouble peak, gdouble decay) { GstStructure *s; GValue v = { 0, }; GValue *l; g_value_init (&v, G_TYPE_DOUBLE); s = (GstStructure *) gst_message_get_structure (m); l = (GValue *) gst_structure_get_value (s, "rms"); g_value_set_double (&v, rms); gst_value_list_append_value (l, &v); /* copies by value */ l = (GValue *) gst_structure_get_value (s, "peak"); g_value_set_double (&v, peak); gst_value_list_append_value (l, &v); /* copies by value */ l = (GValue *) gst_structure_get_value (s, "decay"); g_value_set_double (&v, decay); gst_value_list_append_value (l, &v); /* copies by value */ g_value_unset (&v); } static GstFlowReturn gst_level_transform_ip (GstBaseTransform * trans, GstBuffer * in) { GstLevel *filter; guint8 *in_data; gdouble CS; guint i; guint num_frames = 0; guint num_int_samples = 0; /* number of interleaved samples * ie. total count for all channels combined */ GstClockTimeDiff falloff_time; filter = GST_LEVEL (trans); in_data = GST_BUFFER_DATA (in); num_int_samples = GST_BUFFER_SIZE (in) / (filter->width / 8); GST_LOG_OBJECT (filter, "analyzing %u sample frames at ts %" GST_TIME_FORMAT, num_int_samples, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (in))); g_return_val_if_fail (num_int_samples % filter->channels == 0, GST_FLOW_ERROR); num_frames = num_int_samples / filter->channels; for (i = 0; i < filter->channels; ++i) { if (!GST_BUFFER_FLAG_IS_SET (in, GST_BUFFER_FLAG_GAP)) { filter->process (in_data, num_int_samples, filter->channels, &CS, &filter->peak[i]); GST_LOG_OBJECT (filter, "channel %d, cumulative sum %f, peak %f, over %d samples/%d channels", i, CS, filter->peak[i], num_int_samples, filter->channels); filter->CS[i] += CS; } else { filter->peak[i] = 0.0; } in_data += (filter->width / 8); filter->decay_peak_age[i] += GST_FRAMES_TO_CLOCK_TIME (num_frames, filter->rate); GST_LOG_OBJECT (filter, "filter peak info [%d]: decay peak %f, age %" GST_TIME_FORMAT, i, filter->decay_peak[i], GST_TIME_ARGS (filter->decay_peak_age[i])); /* update running peak */ if (filter->peak[i] > filter->last_peak[i]) filter->last_peak[i] = filter->peak[i]; /* make decay peak fall off if too old */ falloff_time = GST_CLOCK_DIFF (gst_gdouble_to_guint64 (filter->decay_peak_ttl), filter->decay_peak_age[i]); if (falloff_time > 0) { gdouble falloff_dB; gdouble falloff; gdouble length; /* length of falloff time in seconds */ length = (gdouble) falloff_time / (gdouble) GST_SECOND; falloff_dB = filter->decay_peak_falloff * length; falloff = pow (10, falloff_dB / -20.0); GST_LOG_OBJECT (filter, "falloff: current %f, base %f, interval %" GST_TIME_FORMAT ", dB falloff %f, factor %e", filter->decay_peak[i], filter->decay_peak_base[i], GST_TIME_ARGS (falloff_time), falloff_dB, falloff); filter->decay_peak[i] = filter->decay_peak_base[i] * falloff; GST_LOG_OBJECT (filter, "peak is %" GST_TIME_FORMAT " old, decayed with factor %e to %f", GST_TIME_ARGS (filter->decay_peak_age[i]), falloff, filter->decay_peak[i]); } else { GST_LOG_OBJECT (filter, "peak not old enough, not decaying"); } /* if the peak of this run is higher, the decay peak gets reset */ if (filter->peak[i] >= filter->decay_peak[i]) { GST_LOG_OBJECT (filter, "new peak, %f", filter->peak[i]); filter->decay_peak[i] = filter->peak[i]; filter->decay_peak_base[i] = filter->peak[i]; filter->decay_peak_age[i] = G_GINT64_CONSTANT (0); } } if (G_UNLIKELY (!filter->num_frames)) { /* remember start timestamp for message */ filter->message_ts = GST_BUFFER_TIMESTAMP (in); } filter->num_frames += num_frames; /* do we need to message ? */ if (filter->num_frames >= filter->interval_frames) { if (filter->message) { GstMessage *m; GstClockTime duration = GST_FRAMES_TO_CLOCK_TIME (filter->num_frames, filter->rate); m = gst_level_message_new (filter, filter->message_ts, duration); GST_LOG_OBJECT (filter, "message: ts %" GST_TIME_FORMAT ", num_frames %d", GST_TIME_ARGS (filter->message_ts), filter->num_frames); for (i = 0; i < filter->channels; ++i) { gdouble RMS; gdouble RMSdB, lastdB, decaydB; RMS = sqrt (filter->CS[i] / filter->num_frames); GST_LOG_OBJECT (filter, "message: channel %d, CS %f, num_frames %d, RMS %f", i, filter->CS[i], filter->num_frames, RMS); GST_LOG_OBJECT (filter, "message: last_peak: %f, decay_peak: %f", filter->last_peak[i], filter->decay_peak[i]); /* RMS values are calculated in amplitude, so 20 * log 10 */ RMSdB = 20 * log10 (RMS + EPSILON); /* peak values are square sums, ie. power, so 10 * log 10 */ lastdB = 10 * log10 (filter->last_peak[i] + EPSILON); decaydB = 10 * log10 (filter->decay_peak[i] + EPSILON); if (filter->decay_peak[i] < filter->last_peak[i]) { /* this can happen in certain cases, for example when * the last peak is between decay_peak and decay_peak_base */ GST_DEBUG_OBJECT (filter, "message: decay peak dB %f smaller than last peak dB %f, copying", decaydB, lastdB); filter->decay_peak[i] = filter->last_peak[i]; } GST_LOG_OBJECT (filter, "message: RMS %f dB, peak %f dB, decay %f dB", RMSdB, lastdB, decaydB); gst_level_message_append_channel (m, RMSdB, lastdB, decaydB); /* reset cumulative and normal peak */ filter->CS[i] = 0.0; filter->last_peak[i] = 0.0; } gst_element_post_message (GST_ELEMENT (filter), m); } filter->num_frames = 0; } return GST_FLOW_OK; } static gboolean plugin_init (GstPlugin * plugin) { /*oil_init (); */ return gst_element_register (plugin, "level", GST_RANK_NONE, GST_TYPE_LEVEL); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "level", "Audio level plugin", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/apetag/0000755000175000017500000000000011720565301014115 500000000000000gst-plugins-good-0.10.31/gst/apetag/Makefile.am0000644000175000017500000000167611671175353016114 00000000000000plugin_LTLIBRARIES = libgstapetag.la libgstapetag_la_SOURCES = gstapedemux.c libgstapetag_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstapetag_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@\ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstapetag_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstapetag_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstapedemux.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstapetag -:SHARED libgstapetag \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstapetag_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapetag_la_CFLAGS) \ -:LDFLAGS $(libgstapetag_la_LDFLAGS) \ $(libgstapetag_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/apetag/gstapedemux.h0000644000175000017500000000337111671175353016551 00000000000000/* GStreamer APEv1/2 tag reader * Copyright (C) 2004 Ronald Bultje * Copyright (C) 2006 Tim-Philipp Müller * * 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_APE_DEMUX_H__ #define __GST_APE_DEMUX_H__ #include G_BEGIN_DECLS #define GST_TYPE_APE_DEMUX (gst_ape_demux_get_type()) #define GST_APE_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_APE_DEMUX,GstApeDemux)) #define GST_APE_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_APE_DEMUX,GstApeDemuxClass)) #define GST_IS_APE_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_APE_DEMUX)) #define GST_IS_APE_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_APE_DEMUX)) typedef struct _GstApeDemux GstApeDemux; typedef struct _GstApeDemuxClass GstApeDemuxClass; struct _GstApeDemux { GstTagDemux tagdemux; }; struct _GstApeDemuxClass { GstTagDemuxClass parent_class; }; GType gst_ape_demux_get_type (void); G_END_DECLS #endif /* __GST_APE_DEMUX_H__ */ gst-plugins-good-0.10.31/gst/apetag/Makefile.in0000644000175000017500000006650511720560230016112 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/apetag DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstapetag_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstapetag_la_OBJECTS = libgstapetag_la-gstapedemux.lo libgstapetag_la_OBJECTS = $(am_libgstapetag_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstapetag_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstapetag_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstapetag_la_CFLAGS) $(CFLAGS) \ $(libgstapetag_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstapetag_la_SOURCES) DIST_SOURCES = $(libgstapetag_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstapetag.la libgstapetag_la_SOURCES = gstapedemux.c libgstapetag_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstapetag_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@\ $(GST_BASE_LIBS) \ $(GST_LIBS) libgstapetag_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstapetag_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstapedemux.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/apetag/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/apetag/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstapetag.la: $(libgstapetag_la_OBJECTS) $(libgstapetag_la_DEPENDENCIES) $(EXTRA_libgstapetag_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstapetag_la_LINK) -rpath $(plugindir) $(libgstapetag_la_OBJECTS) $(libgstapetag_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapetag_la-gstapedemux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstapetag_la-gstapedemux.lo: gstapedemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapetag_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapetag_la_CFLAGS) $(CFLAGS) -MT libgstapetag_la-gstapedemux.lo -MD -MP -MF $(DEPDIR)/libgstapetag_la-gstapedemux.Tpo -c -o libgstapetag_la-gstapedemux.lo `test -f 'gstapedemux.c' || echo '$(srcdir)/'`gstapedemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstapetag_la-gstapedemux.Tpo $(DEPDIR)/libgstapetag_la-gstapedemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstapedemux.c' object='libgstapetag_la-gstapedemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapetag_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstapetag_la_CFLAGS) $(CFLAGS) -c -o libgstapetag_la-gstapedemux.lo `test -f 'gstapedemux.c' || echo '$(srcdir)/'`gstapedemux.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstapetag -:SHARED libgstapetag \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstapetag_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstapetag_la_CFLAGS) \ -:LDFLAGS $(libgstapetag_la_LDFLAGS) \ $(libgstapetag_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/apetag/gstapedemux.c0000644000175000017500000003251511677341654016553 00000000000000/* GStreamer APEv1/2 tag reader * Copyright (C) 2004 Ronald Bultje * Copyright (C) 2006 Tim-Philipp Müller * * 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-apedemux * * apedemux accepts data streams with APE tags at the start or at the end * (or both). The mime type of the data between the tag blocks is detected * using typefind functions, and the appropriate output mime type set on * outgoing buffers. * * The element is only able to read APE tags at the end of a stream from * a seekable stream, ie. when get_range mode is supported by the upstream * elements. If get_range operation is available, apedemux makes it available * downstream. This means that elements which require get_range mode, such as * wavparse or musepackdec, can operate on files containing APE tag * information. * * * Example launch line * |[ * gst-launch -t filesrc location=file.mpc ! apedemux ! fakesink * ]| This pipeline should read any available APE tag information and output it. * The contents of the file inside the APE tag regions should be detected, and * the appropriate mime type set on buffers produced from apedemux. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gstapedemux.h" #include #include #define APE_VERSION_MAJOR(ver) ((ver)/1000) GST_DEBUG_CATEGORY_STATIC (apedemux_debug); #define GST_CAT_DEFAULT (apedemux_debug) static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-apetag") ); static gboolean gst_ape_demux_identify_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size); static GstTagDemuxResult gst_ape_demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size, GstTagList ** tags); GST_BOILERPLATE (GstApeDemux, gst_ape_demux, GstTagDemux, GST_TYPE_TAG_DEMUX); static void gst_ape_demux_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "APE tag demuxer", "Codec/Demuxer/Metadata", "Read and output APE tags while demuxing the contents", "Tim-Philipp Müller "); GST_DEBUG_CATEGORY_INIT (apedemux_debug, "apedemux", 0, "GStreamer APE tag demuxer"); } static void gst_ape_demux_class_init (GstApeDemuxClass * klass) { GstTagDemuxClass *tagdemux_class; tagdemux_class = GST_TAG_DEMUX_CLASS (klass); tagdemux_class->identify_tag = GST_DEBUG_FUNCPTR (gst_ape_demux_identify_tag); tagdemux_class->parse_tag = GST_DEBUG_FUNCPTR (gst_ape_demux_parse_tag); /* no need for a merge function, the default behaviour to prefer start * tags (APEv2) over end tags (usually APEv1, but could theoretically also * be APEv2) is fine */ tagdemux_class->min_start_size = 32; tagdemux_class->min_end_size = 32; } static void gst_ape_demux_init (GstApeDemux * apedemux, GstApeDemuxClass * gclass) { /* nothing to do here */ } static const struct _GstApeDemuxTagTableEntry { const gchar *ape_tag; const gchar *gst_tag; } tag_table[] = { { "replaygain_track_gain", GST_TAG_TRACK_GAIN}, { "replaygain_track_peak", GST_TAG_TRACK_PEAK}, { "replaygain_album_gain", GST_TAG_ALBUM_GAIN}, { "replaygain_album_peak", GST_TAG_ALBUM_PEAK}, { "title", GST_TAG_TITLE}, { "artist", GST_TAG_ARTIST}, { "album", GST_TAG_ALBUM}, { "composer", GST_TAG_COMPOSER}, { "comment", GST_TAG_COMMENT}, { "comments", GST_TAG_COMMENT}, { "copyright", GST_TAG_COPYRIGHT}, { "genre", GST_TAG_GENRE}, { "isrc", GST_TAG_ISRC}, { "disc", GST_TAG_ALBUM_VOLUME_NUMBER}, { "disk", GST_TAG_ALBUM_VOLUME_NUMBER}, { "discnumber", GST_TAG_ALBUM_VOLUME_NUMBER}, { "disknumber", GST_TAG_ALBUM_VOLUME_NUMBER}, { "track", GST_TAG_TRACK_NUMBER}, { "tracknumber", GST_TAG_TRACK_NUMBER}, { "year", GST_TAG_DATE}, { "file", GST_TAG_LOCATION} }; static gboolean ape_demux_get_gst_tag_from_tag (const gchar * ape_tag, const gchar ** gst_tag, GType * gst_tag_type) { gint i; for (i = 0; i < G_N_ELEMENTS (tag_table); ++i) { if (g_ascii_strcasecmp (tag_table[i].ape_tag, ape_tag) == 0) { *gst_tag = tag_table[i].gst_tag; *gst_tag_type = gst_tag_get_type (tag_table[i].gst_tag); GST_LOG ("Mapped APE tag '%s' to GStreamer tag '%s'", ape_tag, *gst_tag); return TRUE; } } GST_WARNING ("Could not map APE tag '%s' to a GStreamer tag", ape_tag); return FALSE; } static GstTagList * ape_demux_parse_tags (const guint8 * data, gint size) { GstTagList *taglist = gst_tag_list_new (); GST_LOG ("Reading tags from chunk of size %u bytes", size); /* get rid of header/footer */ if (size >= 32 && memcmp (data, "APETAGEX", 8) == 0) { data += 32; size -= 32; } if (size > 32 && memcmp (data + size - 32, "APETAGEX", 8) == 0) { size -= 32; } /* read actual tags - at least 10 bytes for tag header */ while (size >= 10) { guint len, n = 8; gchar *tag, *val; const gchar *gst_tag; GType gst_tag_type; /* find tag type and size */ len = GST_READ_UINT32_LE (data); while (n < size && data[n] != 0x0) n++; if (n == size) break; g_assert (data[n] == 0x0); n++; if (size - n < len) break; /* If the tag is empty, skip to the next one */ if (len == 0) goto next_tag; /* read */ tag = g_strndup ((gchar *) data + 8, n - 9); val = g_strndup ((gchar *) data + n, len); GST_LOG ("tag [%s], val[%s]", tag, val); /* special-case 'media' tag, could be e.g. "CD 1/2" */ if (g_ascii_strcasecmp (tag, "media") == 0) { gchar *sp, *sp2; g_free (tag); tag = g_strdup ("discnumber"); /* get rid of the medium in front */ sp = strchr (val, ' '); while (sp != NULL && (sp2 = strchr (sp + 1, ' ')) != NULL) sp = sp2; if (sp) { g_memmove (val, sp + 1, strlen (sp + 1) + 1); } } if (ape_demux_get_gst_tag_from_tag (tag, &gst_tag, &gst_tag_type)) { GValue v = { 0, }; switch (gst_tag_type) { case G_TYPE_INT:{ gint v_int; if (sscanf (val, "%d", &v_int) == 1) { g_value_init (&v, G_TYPE_INT); g_value_set_int (&v, v_int); } break; } case G_TYPE_UINT:{ guint v_uint, count; if (strcmp (gst_tag, GST_TAG_TRACK_NUMBER) == 0) { gint dummy; if (sscanf (val, "%u", &v_uint) == 1 && v_uint > 0) { g_value_init (&v, G_TYPE_UINT); g_value_set_uint (&v, v_uint); } GST_LOG ("checking for track count: %s", val); /* might be 0/N or -1/N to specify that there is only a count */ if (sscanf (val, "%d/%u", &dummy, &count) == 2 && count > 0) { gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_TRACK_COUNT, count, NULL); } } else if (strcmp (gst_tag, GST_TAG_ALBUM_VOLUME_NUMBER) == 0) { gint dummy; if (sscanf (val, "%u", &v_uint) == 1 && v_uint > 0) { g_value_init (&v, G_TYPE_UINT); g_value_set_uint (&v, v_uint); } GST_LOG ("checking for volume count: %s", val); /* might be 0/N or -1/N to specify that there is only a count */ if (sscanf (val, "%d/%u", &dummy, &count) == 2 && count > 0) { gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_ALBUM_VOLUME_COUNT, count, NULL); } } else if (sscanf (val, "%u", &v_uint) == 1) { g_value_init (&v, G_TYPE_UINT); g_value_set_uint (&v, v_uint); } break; } case G_TYPE_STRING:{ g_value_init (&v, G_TYPE_STRING); g_value_set_string (&v, val); break; } case G_TYPE_DOUBLE:{ gdouble v_double; gchar *endptr; /* floating point strings can be "4,123" or "4.123" depending on * the locale. We need to be able to parse and read either version * no matter what our current locale is */ g_strdelimit (val, ",", '.'); v_double = g_ascii_strtod (val, &endptr); if (endptr != val) { g_value_init (&v, G_TYPE_DOUBLE); g_value_set_double (&v, v_double); } break; } default:{ if (gst_tag_type == GST_TYPE_DATE) { gint v_int; if (sscanf (val, "%d", &v_int) == 1) { GDate *date = g_date_new_dmy (1, 1, v_int); g_value_init (&v, GST_TYPE_DATE); gst_value_set_date (&v, date); g_date_free (date); } } else { GST_WARNING ("Unhandled tag type '%s' for tag '%s'", g_type_name (gst_tag_type), gst_tag); } break; } } if (G_VALUE_TYPE (&v) != 0) { gst_tag_list_add_values (taglist, GST_TAG_MERGE_APPEND, gst_tag, &v, NULL); g_value_unset (&v); } } GST_DEBUG ("Read tag %s: %s", tag, val); g_free (tag); g_free (val); /* move data pointer */ next_tag: size -= len + n; data += len + n; } GST_DEBUG ("Taglist: %" GST_PTR_FORMAT, taglist); return taglist; } static gboolean gst_ape_demux_identify_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size) { if (memcmp (GST_BUFFER_DATA (buffer), "APETAGEX", 8) != 0) { GST_DEBUG_OBJECT (demux, "No APETAGEX marker at %s - not an APE file", (start_tag) ? "start" : "end"); return FALSE; } *tag_size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buffer) + 12); /* size is without header, so add 32 to account for that */ *tag_size += 32; return TRUE; } static GstTagDemuxResult gst_ape_demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size, GstTagList ** tags) { const guint8 *data; const guint8 *footer; gboolean have_header; gboolean end_tag = !start_tag; GstCaps *sink_caps; guint version, footer_size; GST_LOG_OBJECT (demux, "Parsing buffer of size %u", GST_BUFFER_SIZE (buffer)); data = GST_BUFFER_DATA (buffer); footer = GST_BUFFER_DATA (buffer) + GST_BUFFER_SIZE (buffer) - 32; GST_LOG_OBJECT (demux, "Checking for footer at offset 0x%04x", (guint) (footer - data)); if (footer > data && memcmp (footer, "APETAGEX", 8) == 0) { GST_DEBUG_OBJECT (demux, "Found footer"); footer_size = 32; } else { GST_DEBUG_OBJECT (demux, "No footer"); footer_size = 0; } /* APE tags at the end must have a footer */ if (end_tag && footer_size == 0) { GST_WARNING_OBJECT (demux, "Tag at end of file without footer!"); return GST_TAG_DEMUX_RESULT_BROKEN_TAG; } /* don't trust the header/footer flags, better detect them ourselves */ have_header = (memcmp (data, "APETAGEX", 8) == 0); if (start_tag && !have_header) { GST_DEBUG_OBJECT (demux, "Tag at beginning of file without header!"); return GST_TAG_DEMUX_RESULT_BROKEN_TAG; } if (end_tag && !have_header) { GST_DEBUG_OBJECT (demux, "Tag at end of file has no header (APEv1)"); *tag_size -= 32; /* adjust tag size */ } if (have_header) { version = GST_READ_UINT32_LE (data + 8); } else { version = GST_READ_UINT32_LE (footer + 8); } /* skip header */ if (have_header) { data += 32; } GST_DEBUG_OBJECT (demux, "APE tag with version %u, size %u at offset 0x%08" G_GINT64_MODIFIER "x", version, *tag_size, GST_BUFFER_OFFSET (buffer) + ((have_header) ? 0 : 32)); if (APE_VERSION_MAJOR (version) != 1 && APE_VERSION_MAJOR (version) != 2) { GST_WARNING ("APE tag is version %u.%03u, but decoder only supports " "v1 or v2. Ignoring.", APE_VERSION_MAJOR (version), version % 1000); return GST_TAG_DEMUX_RESULT_OK; } *tags = ape_demux_parse_tags (data, *tag_size - footer_size); sink_caps = gst_static_pad_template_get_caps (&sink_factory); gst_pb_utils_add_codec_description_to_tag_list (*tags, GST_TAG_CONTAINER_FORMAT, sink_caps); gst_caps_unref (sink_caps); return GST_TAG_DEMUX_RESULT_OK; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "apedemux", GST_RANK_PRIMARY, GST_TYPE_APE_DEMUX); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "apetag", "APEv1/2 tag reader", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/law/0000755000175000017500000000000011720565303013441 500000000000000gst-plugins-good-0.10.31/gst/law/alaw.c0000644000175000017500000000502411671175353014461 00000000000000/* GStreamer PCM/A-Law conversions * * 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.1 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 "alaw-encode.h" #include "alaw-decode.h" GstStaticPadTemplate alaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") ); GstStaticPadTemplate alaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-alaw, " "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") ); GstStaticPadTemplate alaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") ); GstStaticPadTemplate alaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-alaw, " "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") ); static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "alawenc", GST_RANK_PRIMARY, GST_TYPE_ALAW_ENC) || !gst_element_register (plugin, "alawdec", GST_RANK_PRIMARY, GST_TYPE_ALAW_DEC)) return FALSE; return TRUE; } /* FIXME 0.11: merge alaw and mulaw into one plugin? */ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "alaw", "ALaw audio conversion routines", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/law/mulaw-encode.c0000644000175000017500000002030111677341655016116 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-mulawenc * * This element encode mulaw audio. Mulaw coding is also known as G.711. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "mulaw-encode.h" #include "mulaw-conversion.h" extern GstStaticPadTemplate mulaw_enc_src_factory; extern GstStaticPadTemplate mulaw_enc_sink_factory; /* Stereo signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static void gst_mulawenc_class_init (GstMuLawEncClass * klass); static void gst_mulawenc_base_init (GstMuLawEncClass * klass); static void gst_mulawenc_init (GstMuLawEnc * mulawenc); static GstFlowReturn gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer); static GstElementClass *parent_class = NULL; /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ static GstCaps * mulawenc_getcaps (GstPad * pad) { GstMuLawEnc *mulawenc; GstPad *otherpad; GstCaps *othercaps, *result; const GstCaps *templ; const gchar *name; gint i; mulawenc = GST_MULAWENC (GST_PAD_PARENT (pad)); /* figure out the name of the caps we are going to return */ if (pad == mulawenc->srcpad) { name = "audio/x-mulaw"; otherpad = mulawenc->sinkpad; } else { name = "audio/x-raw-int"; otherpad = mulawenc->srcpad; } /* get caps from the peer, this can return NULL when there is no peer */ othercaps = gst_pad_peer_get_caps (otherpad); /* get the template caps to make sure we return something acceptable */ templ = gst_pad_get_pad_template_caps (pad); if (othercaps) { /* there was a peer */ othercaps = gst_caps_make_writable (othercaps); /* go through the caps and remove the fields we don't want */ for (i = 0; i < gst_caps_get_size (othercaps); i++) { GstStructure *structure; structure = gst_caps_get_structure (othercaps, i); /* adjust the name */ gst_structure_set_name (structure, name); if (pad == mulawenc->srcpad) { /* remove the fields we don't want */ gst_structure_remove_fields (structure, "width", "depth", "endianness", "signed", NULL); } else { /* add fixed fields */ gst_structure_set (structure, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, NULL); } } /* filter against the allowed caps of the pad to return our result */ result = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); } else { /* there was no peer, return the template caps */ result = gst_caps_copy (templ); } return result; } static gboolean mulawenc_setcaps (GstPad * pad, GstCaps * caps) { GstMuLawEnc *mulawenc; GstPad *otherpad; GstStructure *structure; GstCaps *base_caps; mulawenc = GST_MULAWENC (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "channels", &mulawenc->channels); gst_structure_get_int (structure, "rate", &mulawenc->rate); if (pad == mulawenc->sinkpad) { otherpad = mulawenc->srcpad; } else { otherpad = mulawenc->sinkpad; } base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad)); structure = gst_caps_get_structure (base_caps, 0); gst_structure_set (structure, "rate", G_TYPE_INT, mulawenc->rate, NULL); gst_structure_set (structure, "channels", G_TYPE_INT, mulawenc->channels, NULL); gst_pad_set_caps (otherpad, base_caps); gst_object_unref (mulawenc); gst_caps_unref (base_caps); return TRUE; } GType gst_mulawenc_get_type (void) { static GType mulawenc_type = 0; if (!mulawenc_type) { static const GTypeInfo mulawenc_info = { sizeof (GstMuLawEncClass), (GBaseInitFunc) gst_mulawenc_base_init, NULL, (GClassInitFunc) gst_mulawenc_class_init, NULL, NULL, sizeof (GstMuLawEnc), 0, (GInstanceInitFunc) gst_mulawenc_init, }; mulawenc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawEnc", &mulawenc_info, 0); } return mulawenc_type; } static void gst_mulawenc_base_init (GstMuLawEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &mulaw_enc_src_factory); gst_element_class_add_static_pad_template (element_class, &mulaw_enc_sink_factory); gst_element_class_set_details_simple (element_class, "Mu Law audio encoder", "Codec/Encoder/Audio", "Convert 16bit PCM to 8bit mu law", "Zaheer Abbas Merali "); } static void gst_mulawenc_class_init (GstMuLawEncClass * klass) { parent_class = g_type_class_peek_parent (klass); } static void gst_mulawenc_init (GstMuLawEnc * mulawenc) { mulawenc->sinkpad = gst_pad_new_from_static_template (&mulaw_enc_sink_factory, "sink"); gst_pad_set_setcaps_function (mulawenc->sinkpad, mulawenc_setcaps); gst_pad_set_getcaps_function (mulawenc->sinkpad, mulawenc_getcaps); gst_pad_set_chain_function (mulawenc->sinkpad, gst_mulawenc_chain); gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->sinkpad); mulawenc->srcpad = gst_pad_new_from_static_template (&mulaw_enc_src_factory, "src"); gst_pad_set_setcaps_function (mulawenc->srcpad, mulawenc_setcaps); gst_pad_set_getcaps_function (mulawenc->srcpad, mulawenc_getcaps); gst_pad_use_fixed_caps (mulawenc->srcpad); gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->srcpad); /* init rest */ mulawenc->channels = 0; mulawenc->rate = 0; } static GstFlowReturn gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) { GstMuLawEnc *mulawenc; gint16 *linear_data; guint linear_size; guint8 *mulaw_data; guint mulaw_size; GstBuffer *outbuf; GstFlowReturn ret; GstClockTime timestamp, duration; mulawenc = GST_MULAWENC (gst_pad_get_parent (pad)); if (!mulawenc->rate || !mulawenc->channels) goto not_negotiated; linear_data = (gint16 *) GST_BUFFER_DATA (buffer); linear_size = GST_BUFFER_SIZE (buffer); mulaw_size = linear_size / 2; timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); ret = gst_pad_alloc_buffer_and_set_caps (mulawenc->srcpad, GST_BUFFER_OFFSET_NONE, mulaw_size, GST_PAD_CAPS (mulawenc->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto alloc_failed; if (duration == -1) { duration = gst_util_uint64_scale_int (mulaw_size, GST_SECOND, mulawenc->rate * mulawenc->channels); } if (GST_BUFFER_SIZE (outbuf) < mulaw_size) { /* pad-alloc can suggest a smaller size */ gst_buffer_unref (outbuf); outbuf = gst_buffer_new_and_alloc (mulaw_size); } mulaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawenc->srcpad)); mulaw_encode (linear_data, mulaw_data, mulaw_size); gst_buffer_unref (buffer); ret = gst_pad_push (mulawenc->srcpad, outbuf); done: gst_object_unref (mulawenc); return ret; not_negotiated: { GST_DEBUG_OBJECT (mulawenc, "no format negotiated"); ret = GST_FLOW_NOT_NEGOTIATED; gst_buffer_unref (buffer); goto done; } alloc_failed: { GST_DEBUG_OBJECT (mulawenc, "pad alloc failed"); gst_buffer_unref (buffer); goto done; } } gst-plugins-good-0.10.31/gst/law/mulaw-conversion.c0000644000175000017500000000722711671175353017054 00000000000000/* * This routine converts from linear to ulaw * 29 September 1989 * * Craig Reese: IDA/Supercomputing Research Center * Joe Campbell: Department of Defense * * References: * 1) CCITT Recommendation G.711 (very difficult to follow) * 2) "A New Digital Technique for Implementation of Any * Continuous PCM Companding Law," Villeret, Michel, * et al. 1973 IEEE Int. Conf. on Communications, Vol 1, * 1973, pg. 11.12-11.17 * 3) MIL-STD-188-113,"Interoperability and Performance Standards * for Analog-to_Digital Conversion Techniques," * 17 February 1987 * * Input: Signed 16 bit linear sample * Output: 8 bit ulaw sample */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "mulaw-conversion.h" #undef ZEROTRAP /* turn on the trap as per the MIL-STD */ #define BIAS 0x84 /* define the add-in bias for 16 bit samples */ #define CLIP 32635 void mulaw_encode (gint16 * in, guint8 * out, gint numsamples) { static gint16 exp_lut[256] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; gint16 sign, exponent, mantissa, i; gint16 sample; guint8 ulawbyte; for (i = 0; i < numsamples; i++) { sample = in[i]; /** get the sample into sign-magnitude **/ sign = (sample >> 8) & 0x80; /* set aside the sign */ if (sign != 0) { sample = -sample; /* get magnitude */ } /* sample can be zero because we can overflow in the inversion, * checking against the unsigned version solves this */ if (((guint16) sample) > CLIP) sample = CLIP; /* clip the magnitude */ /** convert from 16 bit linear to ulaw **/ sample = sample + BIAS; exponent = exp_lut[(sample >> 7) & 0xFF]; mantissa = (sample >> (exponent + 3)) & 0x0F; ulawbyte = ~(sign | (exponent << 4) | mantissa); #ifdef ZEROTRAP if (ulawbyte == 0) ulawbyte = 0x02; /* optional CCITT trap */ #endif out[i] = ulawbyte; } } /* * This routine converts from ulaw to 16 bit linear * 29 September 1989 * * Craig Reese: IDA/Supercomputing Research Center * * References: * 1) CCITT Recommendation G.711 (very difficult to follow) * 2) MIL-STD-188-113,"Interoperability and Performance Standards * for Analog-to_Digital Conversion Techniques," * 17 February 1987 * * Input: 8 bit ulaw sample * Output: signed 16 bit linear sample */ void mulaw_decode (guint8 * in, gint16 * out, gint numsamples) { static gint16 exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 }; gint16 sign, exponent, mantissa; guint8 ulawbyte; gint16 linear, i; for (i = 0; i < numsamples; i++) { ulawbyte = in[i]; ulawbyte = ~ulawbyte; sign = (ulawbyte & 0x80); exponent = (ulawbyte >> 4) & 0x07; mantissa = ulawbyte & 0x0F; linear = exp_lut[exponent] + (mantissa << (exponent + 3)); if (sign != 0) linear = -linear; out[i] = linear; } } gst-plugins-good-0.10.31/gst/law/Makefile.am0000644000175000017500000000305411671175353015426 00000000000000plugin_LTLIBRARIES = libgstalaw.la libgstmulaw.la libgstalaw_la_SOURCES = alaw-encode.c alaw-decode.c alaw.c libgstalaw_la_CFLAGS = $(GST_CFLAGS) libgstalaw_la_LIBADD = $(GST_LIBS) libgstalaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstalaw_la_LIBTOOLFLAGS = --tag=disable-static libgstmulaw_la_SOURCES = mulaw-encode.c mulaw-conversion.c mulaw-decode.c mulaw.c libgstmulaw_la_CFLAGS = $(GST_CFLAGS) libgstmulaw_la_LIBADD = $(GST_LIBS) libgstmulaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmulaw_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = mulaw-conversion.h alaw-encode.h alaw-decode.h mulaw-encode.h mulaw-decode.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstalaw -:SHARED libgstalaw \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstalaw_la_SOURCES) \ $(nodist_libgstalaw_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalaw_la_CFLAGS) \ -:LDFLAGS $(libgstalaw_la_LDFLAGS) \ $(libgstalaw_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ -:SHARED libgstmulaw \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmulaw_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmulaw_la_CFLAGS) \ -:LDFLAGS $(libgstmulaw_la_LDFLAGS) \ $(libgstmulaw_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/law/mulaw-encode.h0000644000175000017500000000325111671175353016122 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_MULAWENCODE_H__ #define __GST_MULAWENCODE_H__ #include G_BEGIN_DECLS #define GST_TYPE_MULAWENC \ (gst_mulawenc_get_type()) #define GST_MULAWENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULAWENC,GstMuLawEnc)) #define GST_MULAWENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULAWENC,GstMuLawEncClass)) #define GST_IS_MULAWENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULAWENC)) #define GST_IS_MULAWENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULAWENC)) typedef struct _GstMuLawEnc GstMuLawEnc; typedef struct _GstMuLawEncClass GstMuLawEncClass; struct _GstMuLawEnc { GstElement element; GstPad *sinkpad,*srcpad; gint channels; gint rate; }; struct _GstMuLawEncClass { GstElementClass parent_class; }; GType gst_mulawenc_get_type(void); G_END_DECLS #endif /* __GST_STEREO_H__ */ gst-plugins-good-0.10.31/gst/law/mulaw-decode.h0000644000175000017500000000325011671175353016107 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_MULAWDECODE_H__ #define __GST_MULAWDECODE_H__ #include G_BEGIN_DECLS #define GST_TYPE_MULAWDEC \ (gst_mulawdec_get_type()) #define GST_MULAWDEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULAWDEC,GstMuLawDec)) #define GST_MULAWDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULAWDEC,GstMuLawDecClass)) #define GST_IS_MULAWDEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULAWDEC)) #define GST_IS_MULAWDEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULAWDEC)) typedef struct _GstMuLawDec GstMuLawDec; typedef struct _GstMuLawDecClass GstMuLawDecClass; struct _GstMuLawDec { GstElement element; GstPad *sinkpad,*srcpad; gint rate; gint channels; }; struct _GstMuLawDecClass { GstElementClass parent_class; }; GType gst_mulawdec_get_type(void); G_END_DECLS #endif /* __GST_STEREO_H__ */ gst-plugins-good-0.10.31/gst/law/alaw-decode.h0000644000175000017500000000330311671175353015705 00000000000000/* GStreamer A-Law to PCM conversion * Copyright (C) 2000 by Abramo Bagnara * * 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_ALAW_DECODE_H__ #define __GST_ALAW_DECODE_H__ #include G_BEGIN_DECLS #define GST_TYPE_ALAW_DEC \ (gst_alaw_dec_get_type()) #define GST_ALAW_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALAW_DEC,GstALawDec)) #define GST_ALAW_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALAW_DEC,GstALawDecClass)) #define GST_IS_ALAW_DEC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALAW_DEC)) #define GST_IS_ALAW_DEC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALAW_DEC)) typedef struct _GstALawDec GstALawDec; typedef struct _GstALawDecClass GstALawDecClass; struct _GstALawDec { GstElement element; GstPad *sinkpad,*srcpad; gint rate; gint channels; }; struct _GstALawDecClass { GstElementClass parent_class; }; GType gst_alaw_dec_get_type(void); G_END_DECLS #endif /* __GST_ALAW_DECODE_H__ */ gst-plugins-good-0.10.31/gst/law/alaw-decode.c0000644000175000017500000002432411677341655015714 00000000000000/* GStreamer A-Law to PCM conversion * Copyright (C) 2000 by Abramo Bagnara * * 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.1 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-alawdec * * This element decodes alaw audio. Alaw coding is also known as G.711. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "alaw-decode.h" extern GstStaticPadTemplate alaw_dec_src_factory; extern GstStaticPadTemplate alaw_dec_sink_factory; GST_DEBUG_CATEGORY_STATIC (alaw_dec_debug); #define GST_CAT_DEFAULT alaw_dec_debug static GstStateChangeReturn gst_alaw_dec_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_alaw_dec_chain (GstPad * pad, GstBuffer * buffer); GST_BOILERPLATE (GstALawDec, gst_alaw_dec, GstElement, GST_TYPE_ELEMENT); /* some day we might have defines in gstconfig.h that tell us about the * desired cpu/memory/binary size trade-offs */ #define GST_ALAW_DEC_USE_TABLE #ifdef GST_ALAW_DEC_USE_TABLE static const gint alaw_to_s16_table[256] = { -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, -344, -328, -376, -360, -280, -264, -312, -296, -472, -456, -504, -488, -408, -392, -440, -424, -88, -72, -120, -104, -24, -8, -56, -40, -216, -200, -248, -232, -152, -136, -184, -168, -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, -688, -656, -752, -720, -560, -528, -624, -592, -944, -912, -1008, -976, -816, -784, -880, -848, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848 }; static inline gint alaw_to_s16 (guint8 a_val) { return alaw_to_s16_table[a_val]; } #else /* GST_ALAW_DEC_USE_TABLE */ static inline gint alaw_to_s16 (guint8 a_val) { gint t; gint seg; a_val ^= 0x55; t = a_val & 0x7f; if (t < 16) t = (t << 4) + 8; else { seg = (t >> 4) & 0x07; t = ((t & 0x0f) << 4) + 0x108; t <<= seg - 1; } return ((a_val & 0x80) ? t : -t); } #endif /* GST_ALAW_DEC_USE_TABLE */ static gboolean gst_alaw_dec_sink_setcaps (GstPad * pad, GstCaps * caps) { GstALawDec *alawdec; GstStructure *structure; int rate, channels; gboolean ret; GstCaps *outcaps; alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret &= gst_structure_get_int (structure, "channels", &channels); if (!ret) return FALSE; outcaps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); ret = gst_pad_set_caps (alawdec->srcpad, outcaps); gst_caps_unref (outcaps); if (ret) { GST_DEBUG_OBJECT (alawdec, "rate=%d, channels=%d", rate, channels); alawdec->rate = rate; alawdec->channels = channels; } return ret; } static GstCaps * gst_alaw_dec_getcaps (GstPad * pad) { GstALawDec *alawdec; GstPad *otherpad; GstCaps *othercaps, *result; const GstCaps *templ; const gchar *name; gint i; alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad)); /* figure out the name of the caps we are going to return */ if (pad == alawdec->srcpad) { name = "audio/x-raw-int"; otherpad = alawdec->sinkpad; } else { name = "audio/x-alaw"; otherpad = alawdec->srcpad; } /* get caps from the peer, this can return NULL when there is no peer */ othercaps = gst_pad_peer_get_caps (otherpad); /* get the template caps to make sure we return something acceptable */ templ = gst_pad_get_pad_template_caps (pad); if (othercaps) { /* there was a peer */ othercaps = gst_caps_make_writable (othercaps); /* go through the caps and remove the fields we don't want */ for (i = 0; i < gst_caps_get_size (othercaps); i++) { GstStructure *structure; structure = gst_caps_get_structure (othercaps, i); /* adjust the name */ gst_structure_set_name (structure, name); if (pad == alawdec->sinkpad) { /* remove the fields we don't want */ gst_structure_remove_fields (structure, "width", "depth", "endianness", "signed", NULL); } else { /* add fixed fields */ gst_structure_set (structure, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, NULL); } } /* filter against the allowed caps of the pad to return our result */ result = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); } else { /* there was no peer, return the template caps */ result = gst_caps_copy (templ); } return result; } static void gst_alaw_dec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &alaw_dec_src_factory); gst_element_class_add_static_pad_template (element_class, &alaw_dec_sink_factory); gst_element_class_set_details_simple (element_class, "A Law audio decoder", "Codec/Decoder/Audio", "Convert 8bit A law to 16bit PCM", "Zaheer Abbas Merali "); GST_DEBUG_CATEGORY_INIT (alaw_dec_debug, "alawdec", 0, "A Law audio decoder"); } static void gst_alaw_dec_class_init (GstALawDecClass * klass) { GstElementClass *element_class = (GstElementClass *) klass; element_class->change_state = GST_DEBUG_FUNCPTR (gst_alaw_dec_change_state); } static void gst_alaw_dec_init (GstALawDec * alawdec, GstALawDecClass * klass) { alawdec->sinkpad = gst_pad_new_from_static_template (&alaw_dec_sink_factory, "sink"); gst_pad_set_setcaps_function (alawdec->sinkpad, GST_DEBUG_FUNCPTR (gst_alaw_dec_sink_setcaps)); gst_pad_set_getcaps_function (alawdec->sinkpad, GST_DEBUG_FUNCPTR (gst_alaw_dec_getcaps)); gst_pad_set_chain_function (alawdec->sinkpad, GST_DEBUG_FUNCPTR (gst_alaw_dec_chain)); gst_element_add_pad (GST_ELEMENT (alawdec), alawdec->sinkpad); alawdec->srcpad = gst_pad_new_from_static_template (&alaw_dec_src_factory, "src"); gst_pad_use_fixed_caps (alawdec->srcpad); gst_pad_set_getcaps_function (alawdec->srcpad, GST_DEBUG_FUNCPTR (gst_alaw_dec_getcaps)); gst_element_add_pad (GST_ELEMENT (alawdec), alawdec->srcpad); } static GstFlowReturn gst_alaw_dec_chain (GstPad * pad, GstBuffer * buffer) { GstALawDec *alawdec; gint16 *linear_data; guint8 *alaw_data; guint alaw_size; GstBuffer *outbuf; gint i; GstFlowReturn ret; alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad)); if (G_UNLIKELY (alawdec->rate == 0)) goto not_negotiated; GST_LOG_OBJECT (alawdec, "buffer with ts=%" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); alaw_data = GST_BUFFER_DATA (buffer); alaw_size = GST_BUFFER_SIZE (buffer); ret = gst_pad_alloc_buffer_and_set_caps (alawdec->srcpad, GST_BUFFER_OFFSET_NONE, alaw_size * 2, GST_PAD_CAPS (alawdec->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto alloc_failed; linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawdec->srcpad)); for (i = 0; i < alaw_size; i++) { linear_data[i] = alaw_to_s16 (alaw_data[i]); } gst_buffer_unref (buffer); ret = gst_pad_push (alawdec->srcpad, outbuf); return ret; not_negotiated: { gst_buffer_unref (buffer); GST_WARNING_OBJECT (alawdec, "no input format set: not-negotiated"); return GST_FLOW_NOT_NEGOTIATED; } alloc_failed: { gst_buffer_unref (buffer); GST_DEBUG_OBJECT (alawdec, "pad alloc failed, flow: %s", gst_flow_get_name (ret)); return ret; } } static GstStateChangeReturn gst_alaw_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstALawDec *dec = GST_ALAW_DEC (element); switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: dec->rate = 0; dec->channels = 0; break; default: break; } return ret; } gst-plugins-good-0.10.31/gst/law/alaw-encode.h0000644000175000017500000000330411671175353015720 00000000000000/* GStreamer PCM to A-Law conversion * Copyright (C) 2000 by Abramo Bagnara * * 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_ALAW_ENCODE_H__ #define __GST_ALAW_ENCODE_H__ #include G_BEGIN_DECLS #define GST_TYPE_ALAW_ENC \ (gst_alaw_enc_get_type()) #define GST_ALAW_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ALAW_ENC,GstALawEnc)) #define GST_ALAW_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ALAW_ENC,GstALawEncClass)) #define GST_IS_ALAW_ENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ALAW_ENC)) #define GST_IS_ALAW_ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ALAW_ENC)) typedef struct _GstALawEnc GstALawEnc; typedef struct _GstALawEncClass GstALawEncClass; struct _GstALawEnc { GstElement element; GstPad *sinkpad,*srcpad; gint channels; gint rate; }; struct _GstALawEncClass { GstElementClass parent_class; }; GType gst_alaw_enc_get_type(void); G_END_DECLS #endif /* __GST_ALAW_ENCODE_H__ */ gst-plugins-good-0.10.31/gst/law/mulaw-decode.c0000644000175000017500000002113211677341655016107 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-mulawdec * * This element decodes mulaw audio. Mulaw coding is also known as G.711. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "mulaw-decode.h" #include "mulaw-conversion.h" extern GstStaticPadTemplate mulaw_dec_src_factory; extern GstStaticPadTemplate mulaw_dec_sink_factory; /* Stereo signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static void gst_mulawdec_class_init (GstMuLawDecClass * klass); static void gst_mulawdec_base_init (GstMuLawDecClass * klass); static void gst_mulawdec_init (GstMuLawDec * mulawdec); static GstStateChangeReturn gst_mulawdec_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer); static GstElementClass *parent_class = NULL; static gboolean mulawdec_sink_setcaps (GstPad * pad, GstCaps * caps) { GstMuLawDec *mulawdec; GstStructure *structure; int rate, channels; gboolean ret; GstCaps *outcaps; mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret = ret && gst_structure_get_int (structure, "channels", &channels); if (!ret) return FALSE; outcaps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); ret = gst_pad_set_caps (mulawdec->srcpad, outcaps); gst_caps_unref (outcaps); if (ret) { GST_DEBUG_OBJECT (mulawdec, "rate=%d, channels=%d", rate, channels); mulawdec->rate = rate; mulawdec->channels = channels; } return ret; } static GstCaps * mulawdec_getcaps (GstPad * pad) { GstMuLawDec *mulawdec; GstPad *otherpad; GstCaps *othercaps, *result; const GstCaps *templ; const gchar *name; gint i; mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); /* figure out the name of the caps we are going to return */ if (pad == mulawdec->srcpad) { name = "audio/x-raw-int"; otherpad = mulawdec->sinkpad; } else { name = "audio/x-mulaw"; otherpad = mulawdec->srcpad; } /* get caps from the peer, this can return NULL when there is no peer */ othercaps = gst_pad_peer_get_caps (otherpad); /* get the template caps to make sure we return something acceptable */ templ = gst_pad_get_pad_template_caps (pad); if (othercaps) { /* there was a peer */ othercaps = gst_caps_make_writable (othercaps); /* go through the caps and remove the fields we don't want */ for (i = 0; i < gst_caps_get_size (othercaps); i++) { GstStructure *structure; structure = gst_caps_get_structure (othercaps, i); /* adjust the name */ gst_structure_set_name (structure, name); if (pad == mulawdec->sinkpad) { /* remove the fields we don't want */ gst_structure_remove_fields (structure, "width", "depth", "endianness", "signed", NULL); } else { /* add fixed fields */ gst_structure_set (structure, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, NULL); } } /* filter against the allowed caps of the pad to return our result */ result = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); } else { /* there was no peer, return the template caps */ result = gst_caps_copy (templ); } return result; } GType gst_mulawdec_get_type (void) { static GType mulawdec_type = 0; if (!mulawdec_type) { static const GTypeInfo mulawdec_info = { sizeof (GstMuLawDecClass), (GBaseInitFunc) gst_mulawdec_base_init, NULL, (GClassInitFunc) gst_mulawdec_class_init, NULL, NULL, sizeof (GstMuLawDec), 0, (GInstanceInitFunc) gst_mulawdec_init, }; mulawdec_type = g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawDec", &mulawdec_info, 0); } return mulawdec_type; } static void gst_mulawdec_base_init (GstMuLawDecClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &mulaw_dec_src_factory); gst_element_class_add_static_pad_template (element_class, &mulaw_dec_sink_factory); gst_element_class_set_details_simple (element_class, "Mu Law audio decoder", "Codec/Decoder/Audio", "Convert 8bit mu law to 16bit PCM", "Zaheer Abbas Merali "); } static void gst_mulawdec_class_init (GstMuLawDecClass * klass) { GstElementClass *element_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); element_class->change_state = GST_DEBUG_FUNCPTR (gst_mulawdec_change_state); } static void gst_mulawdec_init (GstMuLawDec * mulawdec) { mulawdec->sinkpad = gst_pad_new_from_static_template (&mulaw_dec_sink_factory, "sink"); gst_pad_set_setcaps_function (mulawdec->sinkpad, mulawdec_sink_setcaps); gst_pad_set_getcaps_function (mulawdec->sinkpad, mulawdec_getcaps); gst_pad_set_chain_function (mulawdec->sinkpad, gst_mulawdec_chain); gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->sinkpad); mulawdec->srcpad = gst_pad_new_from_static_template (&mulaw_dec_src_factory, "src"); gst_pad_use_fixed_caps (mulawdec->srcpad); gst_pad_set_getcaps_function (mulawdec->srcpad, mulawdec_getcaps); gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->srcpad); } static GstFlowReturn gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer) { GstMuLawDec *mulawdec; gint16 *linear_data; guint8 *mulaw_data; guint mulaw_size; GstBuffer *outbuf; GstFlowReturn ret; mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); if (G_UNLIKELY (mulawdec->rate == 0)) goto not_negotiated; mulaw_data = (guint8 *) GST_BUFFER_DATA (buffer); mulaw_size = GST_BUFFER_SIZE (buffer); ret = gst_pad_alloc_buffer_and_set_caps (mulawdec->srcpad, GST_BUFFER_OFFSET_NONE, mulaw_size * 2, GST_PAD_CAPS (mulawdec->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto alloc_failed; linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); if (GST_BUFFER_DURATION (outbuf) == GST_CLOCK_TIME_NONE) GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, mulaw_size * 2, 2 * mulawdec->rate * mulawdec->channels); else GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawdec->srcpad)); mulaw_decode (mulaw_data, linear_data, mulaw_size); gst_buffer_unref (buffer); ret = gst_pad_push (mulawdec->srcpad, outbuf); return ret; /* ERRORS */ not_negotiated: { GST_WARNING_OBJECT (mulawdec, "no input format set: not-negotiated"); gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; } alloc_failed: { GST_DEBUG_OBJECT (mulawdec, "pad alloc failed, flow: %s", gst_flow_get_name (ret)); gst_buffer_unref (buffer); return ret; } } static GstStateChangeReturn gst_mulawdec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstMuLawDec *dec = GST_MULAWDEC (element); switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: dec->rate = 0; dec->channels = 0; break; default: break; } return ret; } gst-plugins-good-0.10.31/gst/law/mulaw.c0000644000175000017500000000474711671175353014675 00000000000000/* GStreamer PCM/A-Law conversions * * 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.1 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 "mulaw-encode.h" #include "mulaw-decode.h" GstStaticPadTemplate mulaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") ); GstStaticPadTemplate mulaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-mulaw, " "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") ); GstStaticPadTemplate mulaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ], " "endianness = (int) BYTE_ORDER, " "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") ); GstStaticPadTemplate mulaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-mulaw, " "rate = [ 8000 , 192000 ], " "channels = [ 1 , 2 ]") ); static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "mulawenc", GST_RANK_PRIMARY, GST_TYPE_MULAWENC) || !gst_element_register (plugin, "mulawdec", GST_RANK_PRIMARY, GST_TYPE_MULAWDEC)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "mulaw", "MuLaw audio conversion routines", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/law/Makefile.in0000644000175000017500000010740211720560233015427 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/law DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstalaw_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgstalaw_la_OBJECTS = libgstalaw_la-alaw-encode.lo \ libgstalaw_la-alaw-decode.lo libgstalaw_la-alaw.lo libgstalaw_la_OBJECTS = $(am_libgstalaw_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstalaw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstalaw_la_CFLAGS) $(CFLAGS) \ $(libgstalaw_la_LDFLAGS) $(LDFLAGS) -o $@ libgstmulaw_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgstmulaw_la_OBJECTS = libgstmulaw_la-mulaw-encode.lo \ libgstmulaw_la-mulaw-conversion.lo \ libgstmulaw_la-mulaw-decode.lo libgstmulaw_la-mulaw.lo libgstmulaw_la_OBJECTS = $(am_libgstmulaw_la_OBJECTS) libgstmulaw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstmulaw_la_CFLAGS) $(CFLAGS) \ $(libgstmulaw_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstalaw_la_SOURCES) $(libgstmulaw_la_SOURCES) DIST_SOURCES = $(libgstalaw_la_SOURCES) $(libgstmulaw_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstalaw.la libgstmulaw.la libgstalaw_la_SOURCES = alaw-encode.c alaw-decode.c alaw.c libgstalaw_la_CFLAGS = $(GST_CFLAGS) libgstalaw_la_LIBADD = $(GST_LIBS) libgstalaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstalaw_la_LIBTOOLFLAGS = --tag=disable-static libgstmulaw_la_SOURCES = mulaw-encode.c mulaw-conversion.c mulaw-decode.c mulaw.c libgstmulaw_la_CFLAGS = $(GST_CFLAGS) libgstmulaw_la_LIBADD = $(GST_LIBS) libgstmulaw_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmulaw_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = mulaw-conversion.h alaw-encode.h alaw-decode.h mulaw-encode.h mulaw-decode.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/law/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/law/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstalaw.la: $(libgstalaw_la_OBJECTS) $(libgstalaw_la_DEPENDENCIES) $(EXTRA_libgstalaw_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstalaw_la_LINK) -rpath $(plugindir) $(libgstalaw_la_OBJECTS) $(libgstalaw_la_LIBADD) $(LIBS) libgstmulaw.la: $(libgstmulaw_la_OBJECTS) $(libgstmulaw_la_DEPENDENCIES) $(EXTRA_libgstmulaw_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstmulaw_la_LINK) -rpath $(plugindir) $(libgstmulaw_la_OBJECTS) $(libgstmulaw_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalaw_la-alaw-decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalaw_la-alaw-encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstalaw_la-alaw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw-conversion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw-decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw-encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmulaw_la-mulaw.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstalaw_la-alaw-encode.lo: alaw-encode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -MT libgstalaw_la-alaw-encode.lo -MD -MP -MF $(DEPDIR)/libgstalaw_la-alaw-encode.Tpo -c -o libgstalaw_la-alaw-encode.lo `test -f 'alaw-encode.c' || echo '$(srcdir)/'`alaw-encode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalaw_la-alaw-encode.Tpo $(DEPDIR)/libgstalaw_la-alaw-encode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alaw-encode.c' object='libgstalaw_la-alaw-encode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -c -o libgstalaw_la-alaw-encode.lo `test -f 'alaw-encode.c' || echo '$(srcdir)/'`alaw-encode.c libgstalaw_la-alaw-decode.lo: alaw-decode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -MT libgstalaw_la-alaw-decode.lo -MD -MP -MF $(DEPDIR)/libgstalaw_la-alaw-decode.Tpo -c -o libgstalaw_la-alaw-decode.lo `test -f 'alaw-decode.c' || echo '$(srcdir)/'`alaw-decode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalaw_la-alaw-decode.Tpo $(DEPDIR)/libgstalaw_la-alaw-decode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alaw-decode.c' object='libgstalaw_la-alaw-decode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -c -o libgstalaw_la-alaw-decode.lo `test -f 'alaw-decode.c' || echo '$(srcdir)/'`alaw-decode.c libgstalaw_la-alaw.lo: alaw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -MT libgstalaw_la-alaw.lo -MD -MP -MF $(DEPDIR)/libgstalaw_la-alaw.Tpo -c -o libgstalaw_la-alaw.lo `test -f 'alaw.c' || echo '$(srcdir)/'`alaw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstalaw_la-alaw.Tpo $(DEPDIR)/libgstalaw_la-alaw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alaw.c' object='libgstalaw_la-alaw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstalaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstalaw_la_CFLAGS) $(CFLAGS) -c -o libgstalaw_la-alaw.lo `test -f 'alaw.c' || echo '$(srcdir)/'`alaw.c libgstmulaw_la-mulaw-encode.lo: mulaw-encode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw-encode.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw-encode.Tpo -c -o libgstmulaw_la-mulaw-encode.lo `test -f 'mulaw-encode.c' || echo '$(srcdir)/'`mulaw-encode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw-encode.Tpo $(DEPDIR)/libgstmulaw_la-mulaw-encode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw-encode.c' object='libgstmulaw_la-mulaw-encode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw-encode.lo `test -f 'mulaw-encode.c' || echo '$(srcdir)/'`mulaw-encode.c libgstmulaw_la-mulaw-conversion.lo: mulaw-conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw-conversion.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw-conversion.Tpo -c -o libgstmulaw_la-mulaw-conversion.lo `test -f 'mulaw-conversion.c' || echo '$(srcdir)/'`mulaw-conversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw-conversion.Tpo $(DEPDIR)/libgstmulaw_la-mulaw-conversion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw-conversion.c' object='libgstmulaw_la-mulaw-conversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw-conversion.lo `test -f 'mulaw-conversion.c' || echo '$(srcdir)/'`mulaw-conversion.c libgstmulaw_la-mulaw-decode.lo: mulaw-decode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw-decode.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw-decode.Tpo -c -o libgstmulaw_la-mulaw-decode.lo `test -f 'mulaw-decode.c' || echo '$(srcdir)/'`mulaw-decode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw-decode.Tpo $(DEPDIR)/libgstmulaw_la-mulaw-decode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw-decode.c' object='libgstmulaw_la-mulaw-decode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw-decode.lo `test -f 'mulaw-decode.c' || echo '$(srcdir)/'`mulaw-decode.c libgstmulaw_la-mulaw.lo: mulaw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -MT libgstmulaw_la-mulaw.lo -MD -MP -MF $(DEPDIR)/libgstmulaw_la-mulaw.Tpo -c -o libgstmulaw_la-mulaw.lo `test -f 'mulaw.c' || echo '$(srcdir)/'`mulaw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmulaw_la-mulaw.Tpo $(DEPDIR)/libgstmulaw_la-mulaw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mulaw.c' object='libgstmulaw_la-mulaw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmulaw_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmulaw_la_CFLAGS) $(CFLAGS) -c -o libgstmulaw_la-mulaw.lo `test -f 'mulaw.c' || echo '$(srcdir)/'`mulaw.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstalaw -:SHARED libgstalaw \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstalaw_la_SOURCES) \ $(nodist_libgstalaw_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstalaw_la_CFLAGS) \ -:LDFLAGS $(libgstalaw_la_LDFLAGS) \ $(libgstalaw_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ -:SHARED libgstmulaw \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmulaw_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmulaw_la_CFLAGS) \ -:LDFLAGS $(libgstmulaw_la_LDFLAGS) \ $(libgstmulaw_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/law/alaw-encode.c0000644000175000017500000005353111677341655015730 00000000000000/* GStreamer PCM to A-Law conversion * Copyright (C) 2000 by Abramo Bagnara * * 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.1 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-alawenc * * This element encode alaw audio. Alaw coding is also known as G.711. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "alaw-encode.h" GST_DEBUG_CATEGORY_STATIC (alaw_enc_debug); #define GST_CAT_DEFAULT alaw_enc_debug extern GstStaticPadTemplate alaw_enc_src_factory; extern GstStaticPadTemplate alaw_enc_sink_factory; static GstFlowReturn gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer); GST_BOILERPLATE (GstALawEnc, gst_alaw_enc, GstElement, GST_TYPE_ELEMENT); /* some day we might have defines in gstconfig.h that tell us about the * desired cpu/memory/binary size trade-offs */ #define GST_ALAW_ENC_USE_TABLE #ifdef GST_ALAW_ENC_USE_TABLE static const guint8 alaw_encode[2048 + 1] = { 0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde, 0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2, 0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4, 0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2, 0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8, 0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a }; static inline guint8 s16_to_alaw (gint16 pcm_val) { if (pcm_val >= 0) return alaw_encode[pcm_val / 16]; else return (0x7F & alaw_encode[pcm_val / -16]); } #else /* GST_ALAW_ENC_USE_TABLE */ /* * s16_to_alaw() - Convert a 16-bit linear PCM value to 8-bit A-law * * s16_to_alaw() accepts an 16-bit integer and encodes it as A-law data. * * Linear Input Code Compressed Code * ------------------------ --------------- * 0000000wxyza 000wxyz * 0000001wxyza 001wxyz * 000001wxyzab 010wxyz * 00001wxyzabc 011wxyz * 0001wxyzabcd 100wxyz * 001wxyzabcde 101wxyz * 01wxyzabcdef 110wxyz * 1wxyzabcdefg 111wxyz * * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ static inline gint val_seg (gint val) { gint r = 1; val >>= 8; if (val & 0xf0) { val >>= 4; r += 4; } if (val & 0x0c) { val >>= 2; r += 2; } if (val & 0x02) r += 1; return r; } static inline guint8 s16_to_alaw (gint pcm_val) { gint seg; guint8 mask; guint8 aval; if (pcm_val >= 0) { mask = 0xD5; } else { mask = 0x55; pcm_val = -pcm_val; if (pcm_val > 0x7fff) pcm_val = 0x7fff; } if (pcm_val < 256) aval = pcm_val >> 4; else { /* Convert the scaled magnitude to segment number. */ seg = val_seg (pcm_val); aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f); } return aval ^ mask; } #endif /* GST_ALAW_ENC_USE_TABLE */ static GstCaps * gst_alaw_enc_getcaps (GstPad * pad) { GstALawEnc *alawenc; GstPad *otherpad; GstCaps *othercaps, *result; const GstCaps *templ; const gchar *name; gint i; alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad)); /* figure out the name of the caps we are going to return */ if (pad == alawenc->srcpad) { name = "audio/x-alaw"; otherpad = alawenc->sinkpad; } else { name = "audio/x-raw-int"; otherpad = alawenc->srcpad; } /* get caps from the peer, this can return NULL when there is no peer */ othercaps = gst_pad_peer_get_caps (otherpad); /* get the template caps to make sure we return something acceptable */ templ = gst_pad_get_pad_template_caps (pad); if (othercaps) { /* there was a peer */ othercaps = gst_caps_make_writable (othercaps); /* go through the caps and remove the fields we don't want */ for (i = 0; i < gst_caps_get_size (othercaps); i++) { GstStructure *structure; structure = gst_caps_get_structure (othercaps, i); /* adjust the name */ gst_structure_set_name (structure, name); if (pad == alawenc->srcpad) { /* remove the fields we don't want */ gst_structure_remove_fields (structure, "width", "depth", "endianness", "signed", NULL); } else { /* add fixed fields */ gst_structure_set (structure, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, NULL); } } /* filter against the allowed caps of the pad to return our result */ result = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); } else { /* there was no peer, return the template caps */ result = gst_caps_copy (templ); } return result; } static gboolean gst_alaw_enc_setcaps (GstPad * pad, GstCaps * caps) { GstALawEnc *alawenc; GstPad *otherpad; GstStructure *structure; gboolean ret; GstCaps *base_caps; alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "channels", &alawenc->channels); gst_structure_get_int (structure, "rate", &alawenc->rate); if (pad == alawenc->sinkpad) { otherpad = alawenc->srcpad; } else { otherpad = alawenc->sinkpad; } base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad)); structure = gst_caps_get_structure (base_caps, 0); gst_structure_set (structure, "rate", G_TYPE_INT, alawenc->rate, NULL); gst_structure_set (structure, "channels", G_TYPE_INT, alawenc->channels, NULL); GST_DEBUG_OBJECT (alawenc, "rate=%d, channels=%d", alawenc->rate, alawenc->channels); ret = gst_pad_set_caps (otherpad, base_caps); gst_caps_unref (base_caps); return ret; } static void gst_alaw_enc_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &alaw_enc_src_factory); gst_element_class_add_static_pad_template (element_class, &alaw_enc_sink_factory); gst_element_class_set_details_simple (element_class, "A Law audio encoder", "Codec/Encoder/Audio", "Convert 16bit PCM to 8bit A law", "Zaheer Abbas Merali "); GST_DEBUG_CATEGORY_INIT (alaw_enc_debug, "alawenc", 0, "A Law audio encoder"); } static void gst_alaw_enc_class_init (GstALawEncClass * klass) { /* nothing to do here for now */ } static void gst_alaw_enc_init (GstALawEnc * alawenc, GstALawEncClass * klass) { alawenc->sinkpad = gst_pad_new_from_static_template (&alaw_enc_sink_factory, "sink"); gst_pad_set_setcaps_function (alawenc->sinkpad, GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps)); gst_pad_set_getcaps_function (alawenc->sinkpad, GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps)); gst_pad_set_chain_function (alawenc->sinkpad, GST_DEBUG_FUNCPTR (gst_alaw_enc_chain)); gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->sinkpad); alawenc->srcpad = gst_pad_new_from_static_template (&alaw_enc_src_factory, "src"); gst_pad_set_setcaps_function (alawenc->srcpad, GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps)); gst_pad_set_getcaps_function (alawenc->srcpad, GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps)); gst_pad_use_fixed_caps (alawenc->srcpad); gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->srcpad); /* init rest */ alawenc->channels = 0; alawenc->rate = 0; } static GstFlowReturn gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer) { GstALawEnc *alawenc; gint16 *linear_data; guint linear_size; guint8 *alaw_data; guint alaw_size; GstBuffer *outbuf; gint i; GstFlowReturn ret; GstClockTime timestamp, duration; alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad)); if (G_UNLIKELY (alawenc->rate == 0 || alawenc->channels == 0)) goto not_negotiated; linear_data = (gint16 *) GST_BUFFER_DATA (buffer); linear_size = GST_BUFFER_SIZE (buffer); alaw_size = linear_size / 2; timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); GST_LOG_OBJECT (alawenc, "buffer with ts=%" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); ret = gst_pad_alloc_buffer_and_set_caps (alawenc->srcpad, GST_BUFFER_OFFSET_NONE, alaw_size, GST_PAD_CAPS (alawenc->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto done; if (duration == GST_CLOCK_TIME_NONE) { duration = gst_util_uint64_scale_int (alaw_size, GST_SECOND, alawenc->rate * alawenc->channels); } if (GST_BUFFER_SIZE (outbuf) < alaw_size) { /* pad-alloc can return a smaller buffer */ gst_buffer_unref (outbuf); outbuf = gst_buffer_new_and_alloc (alaw_size); } alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawenc->srcpad)); for (i = 0; i < alaw_size; i++) { alaw_data[i] = s16_to_alaw (linear_data[i]); } ret = gst_pad_push (alawenc->srcpad, outbuf); done: gst_buffer_unref (buffer); return ret; not_negotiated: { ret = GST_FLOW_NOT_NEGOTIATED; goto done; } } gst-plugins-good-0.10.31/gst/law/mulaw-conversion.h0000644000175000017500000000036011671175353017050 00000000000000#ifndef _GST_ULAW_CONVERSION_H #define _GST_ULAW_CONVERSION_H #include void mulaw_encode(gint16* in, guint8* out, gint numsamples); void mulaw_decode(guint8* in,gint16* out,gint numsamples); #endif /* _GST_ULAW_CONVERSION_H */ gst-plugins-good-0.10.31/gst/multipart/0000755000175000017500000000000011720565304014700 500000000000000gst-plugins-good-0.10.31/gst/multipart/multipartdemux.c0000644000175000017500000005230411677341656020071 00000000000000/* GStreamer * Copyright (C) 2006 Sjoerd Simons * Copyright (C) 2004 Wim Taymans * * gstmultipartdemux.c: multipart stream demuxer * * 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-multipartdemux * @see_also: #GstMultipartMux * * MultipartDemux uses the Content-type field of incoming buffers to demux and * push data to dynamic source pads. Most of the time multipart streams are * sequential JPEG frames generated from a live source such as a network source * or a camera. * * The output buffers of the multipartdemux typically have no timestamps and are * usually played as fast as possible (at the rate that the source provides the * data). * * the content in multipart files is separated with a boundary string that can * be configured specifically with the #GstMultipartDemux:boundary property * otherwise it will be autodetected. * * * Sample pipelines * |[ * gst-launch filesrc location=/tmp/test.multipart ! multipartdemux ! jpegdec ! ffmpegcolorspace ! ximagesink * ]| a simple pipeline to demux a multipart file muxed with #GstMultipartMux * containing JPEG frames. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "multipartdemux.h" GST_DEBUG_CATEGORY_STATIC (gst_multipart_demux_debug); #define GST_CAT_DEFAULT gst_multipart_demux_debug /* signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_AUTOSCAN FALSE #define DEFAULT_BOUNDARY NULL #define DEFAULT_SINGLE_STREAM FALSE enum { PROP_0, PROP_AUTOSCAN, PROP_BOUNDARY, PROP_SINGLE_STREAM }; static GstStaticPadTemplate multipart_demux_src_template_factory = GST_STATIC_PAD_TEMPLATE ("src_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate multipart_demux_sink_template_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("multipart/x-mixed-replace") ); typedef struct { const gchar *key; const gchar *val; } GstNamesMap; /* convert from mime types to gst structure names. Add more when needed. The * mime-type is stored as lowercase */ static const GstNamesMap gstnames[] = { /* RFC 2046 says audio/basic is mulaw, mono, 8000Hz */ {"audio/basic", "audio/x-mulaw, channels=1, rate=8000"}, {"audio/g726-16", "audio/x-adpcm, bitrate=16000, layout=g726, channels=1, rate=8000"}, {"audio/g726-24", "audio/x-adpcm, bitrate=24000, layout=g726, channels=1, rate=8000"}, {"audio/g726-32", "audio/x-adpcm, bitrate=32000, layout=g726, channels=1, rate=8000"}, {"audio/g726-40", "audio/x-adpcm, bitrate=40000, layout=g726, channels=1, rate=8000"}, /* Panasonic Network Cameras non-standard types */ {"audio/g726", "audio/x-adpcm, bitrate=32000, layout=g726, channels=1, rate=8000"}, {NULL, NULL} }; static GstFlowReturn gst_multipart_demux_chain (GstPad * pad, GstBuffer * buf); static GstStateChangeReturn gst_multipart_demux_change_state (GstElement * element, GstStateChange transition); static void gst_multipart_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_multipart_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_multipart_demux_finalize (GObject * object); GST_BOILERPLATE (GstMultipartDemux, gst_multipart_demux, GstElement, GST_TYPE_ELEMENT); static void gst_multipart_demux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &multipart_demux_sink_template_factory); gst_element_class_add_static_pad_template (element_class, &multipart_demux_src_template_factory); gst_element_class_set_details_simple (element_class, "Multipart demuxer", "Codec/Demuxer", "demux multipart streams", "Wim Taymans , Sjoerd Simons "); } static void gst_multipart_demux_class_init (GstMultipartDemuxClass * klass) { int i; GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gobject_class->finalize = gst_multipart_demux_finalize; gobject_class->set_property = gst_multipart_set_property; gobject_class->get_property = gst_multipart_get_property; g_object_class_install_property (gobject_class, PROP_BOUNDARY, g_param_spec_string ("boundary", "Boundary", "The boundary string separating data, automatic if NULL", DEFAULT_BOUNDARY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_AUTOSCAN, g_param_spec_boolean ("autoscan", "autoscan", "Try to autofind the prefix (deprecated unused, see boundary)", DEFAULT_AUTOSCAN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstMultipartDemux::single-stream: * * Assume that there is only one stream whose content-type will * not change and emit no-more-pads as soon as the first boundary * content is parsed, decoded, and pads are linked. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_SINGLE_STREAM, g_param_spec_boolean ("single-stream", "Single Stream", "Assume that there is only one stream whose content-type will not change and emit no-more-pads as soon as the first boundary content is parsed, decoded, and pads are linked", DEFAULT_SINGLE_STREAM, G_PARAM_READWRITE)); /* populate gst names and mime types pairs */ klass->gstnames = g_hash_table_new (g_str_hash, g_str_equal); for (i = 0; gstnames[i].key; i++) { g_hash_table_insert (klass->gstnames, (gpointer) gstnames[i].key, (gpointer) gstnames[i].val); } gstelement_class->change_state = gst_multipart_demux_change_state; } static void gst_multipart_demux_init (GstMultipartDemux * multipart, GstMultipartDemuxClass * g_class) { /* create the sink pad */ multipart->sinkpad = gst_pad_new_from_static_template (&multipart_demux_sink_template_factory, "sink"); gst_element_add_pad (GST_ELEMENT_CAST (multipart), multipart->sinkpad); gst_pad_set_chain_function (multipart->sinkpad, GST_DEBUG_FUNCPTR (gst_multipart_demux_chain)); multipart->adapter = gst_adapter_new (); multipart->boundary = DEFAULT_BOUNDARY; multipart->mime_type = NULL; multipart->content_length = -1; multipart->header_completed = FALSE; multipart->scanpos = 0; multipart->autoscan = DEFAULT_AUTOSCAN; multipart->singleStream = DEFAULT_SINGLE_STREAM; } static void gst_multipart_pad_free (GstMultipartPad * mppad) { g_free (mppad->mime); g_free (mppad); } static void gst_multipart_demux_finalize (GObject * object) { GstMultipartDemux *demux = GST_MULTIPART_DEMUX (object); g_object_unref (demux->adapter); g_free (demux->boundary); g_free (demux->mime_type); g_slist_foreach (demux->srcpads, (GFunc) gst_multipart_pad_free, NULL); g_slist_free (demux->srcpads); G_OBJECT_CLASS (parent_class)->finalize (object); } static const gchar * gst_multipart_demux_get_gstname (GstMultipartDemux * demux, gchar * mimetype) { GstMultipartDemuxClass *klass; const gchar *gstname; klass = GST_MULTIPART_DEMUX_GET_CLASS (demux); /* use hashtable to convert to gst name */ gstname = g_hash_table_lookup (klass->gstnames, mimetype); if (gstname == NULL) { /* no gst name mapping, use mime type */ gstname = mimetype; } GST_DEBUG_OBJECT (demux, "gst name for %s is %s", mimetype, gstname); return gstname; } static GstFlowReturn gst_multipart_combine_flows (GstMultipartDemux * demux, GstMultipartPad * pad, GstFlowReturn ret) { GSList *walk; /* store the value */ pad->last_ret = ret; /* any other error that is not-linked can be returned right * away */ if (ret != GST_FLOW_NOT_LINKED) goto done; /* only return NOT_LINKED if all other pads returned NOT_LINKED */ for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstMultipartPad *opad = (GstMultipartPad *) walk->data; ret = opad->last_ret; /* some other return value (must be SUCCESS but we can return * other values as well) */ if (ret != GST_FLOW_NOT_LINKED) goto done; } /* if we get here, all other pads were unlinked and we return * NOT_LINKED then */ done: return ret; } static GstMultipartPad * gst_multipart_find_pad_by_mime (GstMultipartDemux * demux, gchar * mime, gboolean * created) { GSList *walk; walk = demux->srcpads; while (walk) { GstMultipartPad *pad = (GstMultipartPad *) walk->data; if (!strcmp (pad->mime, mime)) { if (created) { *created = FALSE; } return pad; } walk = walk->next; } /* pad not found, create it */ { GstPad *pad; GstMultipartPad *mppad; gchar *name; const gchar *capsname; GstCaps *caps; mppad = g_new0 (GstMultipartPad, 1); GST_DEBUG_OBJECT (demux, "creating pad with mime: %s", mime); name = g_strdup_printf ("src_%d", demux->numpads); pad = gst_pad_new_from_static_template (&multipart_demux_src_template_factory, name); g_free (name); /* take the mime type, convert it to the caps name */ capsname = gst_multipart_demux_get_gstname (demux, mime); caps = gst_caps_from_string (capsname); GST_DEBUG_OBJECT (demux, "caps for pad: %s", capsname); gst_pad_use_fixed_caps (pad); gst_pad_set_caps (pad, caps); gst_caps_unref (caps); mppad->pad = pad; mppad->mime = g_strdup (mime); mppad->last_ret = GST_FLOW_OK; demux->srcpads = g_slist_prepend (demux->srcpads, mppad); demux->numpads++; gst_pad_set_active (pad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (demux), pad); if (created) { *created = TRUE; } if (demux->singleStream) { gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); } return mppad; } } static gboolean get_line_end (const guint8 * data, const guint8 * dataend, guint8 ** end, guint8 ** next) { guint8 *x; gboolean foundr = FALSE; for (x = (guint8 *) data; x < dataend; x++) { if (*x == '\r') { foundr = TRUE; } else if (*x == '\n') { *end = x - (foundr ? 1 : 0); *next = x + 1; return TRUE; } } return FALSE; } static guint get_mime_len (const guint8 * data, guint maxlen) { guint8 *x; x = (guint8 *) data; while (*x != '\0' && *x != '\r' && *x != '\n' && *x != ';') { x++; } return x - data; } static gint multipart_parse_header (GstMultipartDemux * multipart) { const guint8 *data; const guint8 *dataend; gchar *boundary; int boundary_len; int datalen; guint8 *pos; guint8 *end, *next; datalen = gst_adapter_available (multipart->adapter); data = gst_adapter_peek (multipart->adapter, datalen); dataend = data + datalen; /* Skip leading whitespace, pos endposition should at least leave space for * the boundary and a \n */ for (pos = (guint8 *) data; pos < dataend - 4 && g_ascii_isspace (*pos); pos++); if (pos >= dataend - 4) { return MULTIPART_NEED_MORE_DATA; } if (G_UNLIKELY (pos[0] != '-' || pos[1] != '-')) { GST_DEBUG_OBJECT (multipart, "No boundary available"); goto wrong_header; } /* First the boundary */ if (!get_line_end (pos, dataend, &end, &next)) return MULTIPART_NEED_MORE_DATA; /* Ignore the leading -- */ boundary_len = end - pos - 2; boundary = (gchar *) pos + 2; if (boundary_len < 1) { GST_DEBUG_OBJECT (multipart, "No boundary available"); goto wrong_header; } if (G_UNLIKELY (multipart->boundary == NULL)) { /* First time we see the boundary, copy it */ multipart->boundary = g_strndup (boundary, boundary_len); multipart->boundary_len = boundary_len; } else if (G_UNLIKELY (boundary_len != multipart->boundary_len)) { /* Something odd is going on, either the boundary indicated EOS or it's * invalid */ if (G_UNLIKELY (boundary_len == multipart->boundary_len + 2 && !strncmp (boundary, multipart->boundary, multipart->boundary_len) && !strncmp (boundary + multipart->boundary_len, "--", 2))) { return MULTIPART_DATA_EOS; } GST_DEBUG_OBJECT (multipart, "Boundary length doesn't match detected boundary (%d <> %d", boundary_len, multipart->boundary_len); goto wrong_header; } else if (G_UNLIKELY (strncmp (boundary, multipart->boundary, boundary_len))) { GST_DEBUG_OBJECT (multipart, "Boundary doesn't match previous boundary"); goto wrong_header; } pos = next; while (get_line_end (pos, dataend, &end, &next)) { guint len = end - pos; if (len == 0) { /* empty line, data starts behind us */ GST_DEBUG_OBJECT (multipart, "Parsed the header - boundary: %s, mime-type: %s, content-length: %d", multipart->boundary, multipart->mime_type, multipart->content_length); return next - data; } if (len >= 14 && !g_ascii_strncasecmp ("content-type:", (gchar *) pos, 13)) { guint mime_len; /* only take the mime type up to the first ; if any. After ; there can be * properties that we don't handle yet. */ mime_len = get_mime_len (pos + 14, len - 14); g_free (multipart->mime_type); multipart->mime_type = g_ascii_strdown ((gchar *) pos + 14, mime_len); } else if (len >= 15 && !g_ascii_strncasecmp ("content-length:", (gchar *) pos, 15)) { multipart->content_length = g_ascii_strtoull ((gchar *) pos + 15, NULL, 10); } pos = next; } GST_DEBUG_OBJECT (multipart, "Need more data for the header"); return MULTIPART_NEED_MORE_DATA; wrong_header: { GST_ELEMENT_ERROR (multipart, STREAM, DEMUX, (NULL), ("Boundary not found in the multipart header")); return MULTIPART_DATA_ERROR; } } static gint multipart_find_boundary (GstMultipartDemux * multipart, gint * datalen) { /* Adaptor is positioned at the start of the data */ const guint8 *data, *pos; const guint8 *dataend; gint len; if (multipart->content_length >= 0) { /* fast path, known content length :) */ len = multipart->content_length; if (gst_adapter_available (multipart->adapter) >= len + 2) { *datalen = len; data = gst_adapter_peek (multipart->adapter, len + 1); /* If data[len] contains \r then assume a newline is \r\n */ if (data[len] == '\r') len += 2; else if (data[len] == '\n') len += 1; /* Don't check if boundary is actually there, but let the header parsing * bail out if it isn't */ return len; } else { /* need more data */ return MULTIPART_NEED_MORE_DATA; } } len = gst_adapter_available (multipart->adapter); if (len == 0) return MULTIPART_NEED_MORE_DATA; data = gst_adapter_peek (multipart->adapter, len); dataend = data + len; for (pos = data + multipart->scanpos; pos <= dataend - multipart->boundary_len - 2; pos++) { if (*pos == '-' && pos[1] == '-' && !strncmp ((gchar *) pos + 2, multipart->boundary, multipart->boundary_len)) { /* Found the boundary! Check if there was a newline before the boundary */ len = pos - data; if (pos - 2 > data && pos[-2] == '\r') len -= 2; else if (pos - 1 > data && pos[-1] == '\n') len -= 1; *datalen = len; multipart->scanpos = 0; return pos - data; } } multipart->scanpos = pos - data; return MULTIPART_NEED_MORE_DATA; } static GstFlowReturn gst_multipart_demux_chain (GstPad * pad, GstBuffer * buf) { GstMultipartDemux *multipart; GstAdapter *adapter; GstClockTime timestamp; gint size = 1; GstFlowReturn res; multipart = GST_MULTIPART_DEMUX (gst_pad_get_parent (pad)); adapter = multipart->adapter; res = GST_FLOW_OK; timestamp = GST_BUFFER_TIMESTAMP (buf); if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { gst_adapter_clear (adapter); } gst_adapter_push (adapter, buf); while (gst_adapter_available (adapter) > 0) { GstMultipartPad *srcpad; GstBuffer *outbuf; gboolean created; gint datalen; if (G_UNLIKELY (!multipart->header_completed)) { if ((size = multipart_parse_header (multipart)) < 0) { goto nodata; } else { gst_adapter_flush (adapter, size); multipart->header_completed = TRUE; } } if ((size = multipart_find_boundary (multipart, &datalen)) < 0) { goto nodata; } /* Invalidate header info */ multipart->header_completed = FALSE; multipart->content_length = -1; if (G_UNLIKELY (datalen <= 0)) { GST_DEBUG_OBJECT (multipart, "skipping empty content."); gst_adapter_flush (adapter, size - datalen); } else { srcpad = gst_multipart_find_pad_by_mime (multipart, multipart->mime_type, &created); outbuf = gst_adapter_take_buffer (adapter, datalen); gst_adapter_flush (adapter, size - datalen); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (srcpad->pad)); if (created) { GstTagList *tags; /* Push new segment, first buffer has 0 timestamp */ gst_pad_push_event (srcpad->pad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0)); tags = gst_tag_list_new_full (GST_TAG_CONTAINER_FORMAT, "Multipart", NULL); gst_pad_push_event (srcpad->pad, gst_event_new_tag (tags)); GST_BUFFER_TIMESTAMP (outbuf) = 0; } else { GST_BUFFER_TIMESTAMP (outbuf) = timestamp; } GST_DEBUG_OBJECT (multipart, "pushing buffer with timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); GST_DEBUG_OBJECT (multipart, "buffer has caps %" GST_PTR_FORMAT, GST_BUFFER_CAPS (outbuf)); res = gst_pad_push (srcpad->pad, outbuf); res = gst_multipart_combine_flows (multipart, srcpad, res); if (res != GST_FLOW_OK) break; } } nodata: gst_object_unref (multipart); if (G_UNLIKELY (size == MULTIPART_DATA_ERROR)) return GST_FLOW_ERROR; if (G_UNLIKELY (size == MULTIPART_DATA_EOS)) return GST_FLOW_UNEXPECTED; return res; } static GstStateChangeReturn gst_multipart_demux_change_state (GstElement * element, GstStateChange transition) { GstMultipartDemux *multipart; GstStateChangeReturn ret; multipart = GST_MULTIPART_DEMUX (element); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: multipart->header_completed = FALSE; g_free (multipart->boundary); multipart->boundary = NULL; g_free (multipart->mime_type); multipart->mime_type = NULL; gst_adapter_clear (multipart->adapter); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static void gst_multipart_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMultipartDemux *filter; g_return_if_fail (GST_IS_MULTIPART_DEMUX (object)); filter = GST_MULTIPART_DEMUX (object); switch (prop_id) { case PROP_BOUNDARY: /* Not really that usefull anymore as we can reliably autoscan */ g_free (filter->boundary); filter->boundary = g_value_dup_string (value); if (filter->boundary != NULL) { filter->boundary_len = strlen (filter->boundary); } break; case PROP_AUTOSCAN: filter->autoscan = g_value_get_boolean (value); break; case PROP_SINGLE_STREAM: filter->singleStream = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_multipart_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMultipartDemux *filter; g_return_if_fail (GST_IS_MULTIPART_DEMUX (object)); filter = GST_MULTIPART_DEMUX (object); switch (prop_id) { case PROP_BOUNDARY: g_value_set_string (value, filter->boundary); break; case PROP_AUTOSCAN: g_value_set_boolean (value, filter->autoscan); break; case PROP_SINGLE_STREAM: g_value_set_boolean (value, filter->singleStream); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_multipart_demux_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_multipart_demux_debug, "multipartdemux", 0, "multipart demuxer"); return gst_element_register (plugin, "multipartdemux", GST_RANK_PRIMARY, GST_TYPE_MULTIPART_DEMUX); } gst-plugins-good-0.10.31/gst/multipart/multipartmux.c0000644000175000017500000004626611677341656017572 00000000000000/* multipart muxer plugin for GStreamer * Copyright (C) 2004 Wim Taymans * * 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-multipartmux * * MultipartMux uses the #GstCaps of the sink pad as the Content-type field for * incoming buffers when muxing them to a multipart stream. Most of the time * multipart streams are sequential JPEG frames. * * * Sample pipelines * |[ * gst-launch videotestsrc ! video/x-raw-yuv, framerate='(fraction)'5/1 ! jpegenc ! multipartmux ! filesink location=/tmp/test.multipart * ]| a pipeline to mux 5 JPEG frames per second into a multipart stream * stored to a file. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "multipartmux.h" GST_DEBUG_CATEGORY_STATIC (gst_multipart_mux_debug); #define GST_CAT_DEFAULT gst_multipart_mux_debug #define DEFAULT_BOUNDARY "ThisRandomString" enum { ARG_0, ARG_BOUNDARY /* FILL ME */ }; static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("multipart/x-mixed-replace") ); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY /* we can take anything, really */ ); typedef struct { const gchar *key; const gchar *val; } MimeTypeMap; /* convert from gst structure names to mime types. Add more when needed. */ static const MimeTypeMap mimetypes[] = { {"audio/x-mulaw", "audio/basic"}, {NULL, NULL} }; static void gst_multipart_mux_base_init (gpointer g_class); static void gst_multipart_mux_class_init (GstMultipartMuxClass * klass); static void gst_multipart_mux_init (GstMultipartMux * multipart_mux); static void gst_multipart_mux_finalize (GObject * object); static gboolean gst_multipart_mux_handle_src_event (GstPad * pad, GstEvent * event); static GstPad *gst_multipart_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static GstStateChangeReturn gst_multipart_mux_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_multipart_mux_collected (GstCollectPads * pads, GstMultipartMux * mux); static void gst_multipart_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_multipart_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; GType gst_multipart_mux_get_type (void) { static GType multipart_mux_type = 0; if (!multipart_mux_type) { static const GTypeInfo multipart_mux_info = { sizeof (GstMultipartMuxClass), gst_multipart_mux_base_init, NULL, (GClassInitFunc) gst_multipart_mux_class_init, NULL, NULL, sizeof (GstMultipartMux), 0, (GInstanceInitFunc) gst_multipart_mux_init, }; multipart_mux_type = g_type_register_static (GST_TYPE_ELEMENT, "GstMultipartMux", &multipart_mux_info, 0); } return multipart_mux_type; } static void gst_multipart_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "Multipart muxer", "Codec/Muxer", "mux multipart streams", "Wim Taymans "); } static void gst_multipart_mux_class_init (GstMultipartMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gint i; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_multipart_mux_finalize; gobject_class->get_property = gst_multipart_mux_get_property; gobject_class->set_property = gst_multipart_mux_set_property; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BOUNDARY, g_param_spec_string ("boundary", "Boundary", "Boundary string", DEFAULT_BOUNDARY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->request_new_pad = gst_multipart_mux_request_new_pad; gstelement_class->change_state = gst_multipart_mux_change_state; /* populate mime types */ klass->mimetypes = g_hash_table_new (g_str_hash, g_str_equal); for (i = 0; mimetypes[i].key; i++) { g_hash_table_insert (klass->mimetypes, (gpointer) mimetypes[i].key, (gpointer) mimetypes[i].val); } } static void gst_multipart_mux_init (GstMultipartMux * multipart_mux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (multipart_mux); multipart_mux->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "src"), "src"); gst_pad_set_event_function (multipart_mux->srcpad, gst_multipart_mux_handle_src_event); gst_element_add_pad (GST_ELEMENT (multipart_mux), multipart_mux->srcpad); multipart_mux->boundary = g_strdup (DEFAULT_BOUNDARY); multipart_mux->collect = gst_collect_pads_new (); gst_collect_pads_set_function (multipart_mux->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_multipart_mux_collected), multipart_mux); } static void gst_multipart_mux_finalize (GObject * object) { GstMultipartMux *multipart_mux; multipart_mux = GST_MULTIPART_MUX (object); g_free (multipart_mux->boundary); if (multipart_mux->collect) gst_object_unref (multipart_mux->collect); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstPad * gst_multipart_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstMultipartMux *multipart_mux; GstPad *newpad; GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); gchar *name; if (templ != gst_element_class_get_pad_template (klass, "sink_%d")) goto wrong_template; multipart_mux = GST_MULTIPART_MUX (element); /* create new pad with the name */ name = g_strdup_printf ("sink_%02d", multipart_mux->numpads); newpad = gst_pad_new_from_template (templ, name); g_free (name); /* construct our own wrapper data structure for the pad to * keep track of its status */ { GstMultipartPadData *multipartpad; multipartpad = (GstMultipartPadData *) gst_collect_pads_add_pad (multipart_mux->collect, newpad, sizeof (GstMultipartPadData)); /* save a pointer to our data in the pad */ gst_pad_set_element_private (newpad, multipartpad); multipart_mux->numpads++; } /* add the pad to the element */ gst_element_add_pad (element, newpad); return newpad; /* ERRORS */ wrong_template: { g_warning ("multipart_mux: this is not our template!"); return NULL; } } /* handle events */ static gboolean gst_multipart_mux_handle_src_event (GstPad * pad, GstEvent * event) { GstMultipartMux *multipart_mux; GstEventType type; multipart_mux = GST_MULTIPART_MUX (gst_pad_get_parent (pad)); type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { case GST_EVENT_SEEK: /* disable seeking for now */ return FALSE; default: break; } gst_object_unref (multipart_mux); return gst_pad_event_default (pad, event); } static const gchar * gst_multipart_mux_get_mime (GstMultipartMux * mux, GstStructure * s) { GstMultipartMuxClass *klass; const gchar *mime; const gchar *name; gint rate; gint channels; gint bitrate = 0; klass = GST_MULTIPART_MUX_GET_CLASS (mux); name = gst_structure_get_name (s); /* use hashtable to convert to mime type */ mime = g_hash_table_lookup (klass->mimetypes, name); if (mime == NULL) { if (!strcmp (name, "audio/x-adpcm")) gst_structure_get_int (s, "bitrate", &bitrate); switch (bitrate) { case 16000: mime = "audio/G726-16"; break; case 24000: mime = "audio/G726-24"; break; case 32000: mime = "audio/G726-32"; break; case 40000: mime = "audio/G726-40"; break; default: /* no mime type mapping, use name */ mime = name; break; } } /* RFC2046 requires audio/basic to be mulaw 8000Hz mono */ if (g_ascii_strcasecmp (mime, "audio/basic") == 0) { if (gst_structure_get_int (s, "rate", &rate) && gst_structure_get_int (s, "channels", &channels)) { if (rate != 8000 || channels != 1) { mime = name; } } else { mime = name; } } return mime; } /* * Given two pads, compare the buffers queued on it and return 0 if they have * an equal priority, 1 if the new pad is better, -1 if the old pad is better */ static gint gst_multipart_mux_compare_pads (GstMultipartMux * multipart_mux, GstMultipartPadData * old, GstMultipartPadData * new) { guint64 oldtime, newtime; /* if the old pad doesn't contain anything or is even NULL, return * the new pad as best candidate and vice versa */ if (old == NULL || old->buffer == NULL) return 1; if (new == NULL || new->buffer == NULL) return -1; /* no timestamp on old buffer, it must go first */ oldtime = old->timestamp; if (oldtime == GST_CLOCK_TIME_NONE) return -1; /* no timestamp on new buffer, it must go first */ newtime = new->timestamp; if (newtime == GST_CLOCK_TIME_NONE) return 1; /* old buffer has higher timestamp, new one should go first */ if (newtime < oldtime) return 1; /* new buffer has higher timestamp, old one should go first */ else if (newtime > oldtime) return -1; /* same priority if all of the above failed */ return 0; } /* make sure a buffer is queued on all pads, returns a pointer to an multipartpad * that holds the best buffer or NULL when no pad was usable */ static GstMultipartPadData * gst_multipart_mux_queue_pads (GstMultipartMux * mux) { GSList *walk = NULL; GstMultipartPadData *bestpad = NULL; g_return_val_if_fail (GST_IS_MULTIPART_MUX (mux), NULL); /* try to make sure we have a buffer from each usable pad first */ walk = mux->collect->data; while (walk) { GstCollectData *data = (GstCollectData *) walk->data; GstMultipartPadData *pad = (GstMultipartPadData *) data; walk = g_slist_next (walk); /* try to get a new buffer for this pad if needed and possible */ if (pad->buffer == NULL) { GstBuffer *buf = NULL; buf = gst_collect_pads_pop (mux->collect, data); /* Store timestamp with segment_start and preroll */ if (buf && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { pad->timestamp = gst_segment_to_running_time (&data->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buf)); } else { pad->timestamp = GST_CLOCK_TIME_NONE; } pad->buffer = buf; } /* we should have a buffer now, see if it is the best stream to * pull on */ if (pad->buffer != NULL) { if (gst_multipart_mux_compare_pads (mux, bestpad, pad) > 0) { bestpad = pad; } } } return bestpad; } /* basic idea: * * 1) find a pad to pull on, this is done by pulling on all pads and * looking at the buffers to decide which one should be muxed first. * 2) create a new buffer for the header * 3) push both buffers on best pad, go to 1 */ static GstFlowReturn gst_multipart_mux_collected (GstCollectPads * pads, GstMultipartMux * mux) { GstMultipartPadData *best; GstFlowReturn ret = GST_FLOW_OK; gchar *header = NULL; size_t headerlen; GstBuffer *headerbuf = NULL; GstBuffer *footerbuf = NULL; GstBuffer *databuf = NULL; GstStructure *structure = NULL; const gchar *mime; GST_DEBUG_OBJECT (mux, "all pads are collected"); /* queue buffers on all pads; find a buffer with the lowest timestamp */ best = gst_multipart_mux_queue_pads (mux); if (!best) /* EOS */ goto eos; else if (!best->buffer) goto buffer_error; /* If not negotiated yet set caps on src pad */ if (!mux->negotiated) { GstCaps *newcaps; newcaps = gst_caps_new_simple ("multipart/x-mixed-replace", "boundary", G_TYPE_STRING, mux->boundary, NULL); if (!gst_pad_set_caps (mux->srcpad, newcaps)) { gst_caps_unref (newcaps); goto nego_error; } gst_caps_unref (newcaps); mux->negotiated = TRUE; } /* see if we need to push a segment */ if (mux->need_segment) { GstEvent *event; GstClockTime time; if (best->timestamp != -1) time = best->timestamp; else time = 0; /* for the segment, we take the first timestamp we see, we don't know the * length and the position is 0 */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, time, -1, 0); gst_pad_push_event (mux->srcpad, event); mux->need_segment = FALSE; } structure = gst_caps_get_structure (GST_BUFFER_CAPS (best->buffer), 0); if (!structure) goto no_caps; /* get the mime type for the structure */ mime = gst_multipart_mux_get_mime (mux, structure); header = g_strdup_printf ("--%s\r\nContent-Type: %s\r\n" "Content-Length: %u\r\n\r\n", mux->boundary, mime, GST_BUFFER_SIZE (best->buffer)); headerlen = strlen (header); ret = gst_pad_alloc_buffer_and_set_caps (mux->srcpad, GST_BUFFER_OFFSET_NONE, headerlen, GST_PAD_CAPS (mux->srcpad), &headerbuf); if (ret != GST_FLOW_OK) goto alloc_failed; memcpy (GST_BUFFER_DATA (headerbuf), header, headerlen); g_free (header); /* the header has the same timestamp as the data buffer (which we will push * below) and has a duration of 0 */ GST_BUFFER_TIMESTAMP (headerbuf) = best->timestamp; GST_BUFFER_DURATION (headerbuf) = 0; GST_BUFFER_OFFSET (headerbuf) = mux->offset; mux->offset += headerlen; GST_BUFFER_OFFSET_END (headerbuf) = mux->offset; GST_DEBUG_OBJECT (mux, "pushing %" G_GSIZE_FORMAT " bytes header buffer", headerlen); ret = gst_pad_push (mux->srcpad, headerbuf); if (ret != GST_FLOW_OK) /* push always takes ownership of the buffer, even after an error, so we * don't need to unref headerbuf here. */ goto beach; /* take best->buffer, we don't need to unref it later as we will push it * now. */ databuf = gst_buffer_make_metadata_writable (best->buffer); best->buffer = NULL; gst_buffer_set_caps (databuf, GST_PAD_CAPS (mux->srcpad)); /* we need to updated the timestamp to match the running_time */ GST_BUFFER_TIMESTAMP (databuf) = best->timestamp; GST_BUFFER_OFFSET (databuf) = mux->offset; mux->offset += GST_BUFFER_SIZE (databuf); GST_BUFFER_OFFSET_END (databuf) = mux->offset; GST_BUFFER_FLAG_SET (databuf, GST_BUFFER_FLAG_DELTA_UNIT); GST_DEBUG_OBJECT (mux, "pushing %u bytes data buffer", GST_BUFFER_SIZE (databuf)); ret = gst_pad_push (mux->srcpad, databuf); if (ret != GST_FLOW_OK) /* push always takes ownership of the buffer, even after an error, so we * don't need to unref headerbuf here. */ goto beach; ret = gst_pad_alloc_buffer_and_set_caps (mux->srcpad, GST_BUFFER_OFFSET_NONE, 2, GST_PAD_CAPS (mux->srcpad), &footerbuf); if (ret != GST_FLOW_OK) goto alloc_failed; memcpy (GST_BUFFER_DATA (footerbuf), "\r\n", 2); /* the footer has the same timestamp as the data buffer and has a * duration of 0 */ GST_BUFFER_TIMESTAMP (footerbuf) = best->timestamp; GST_BUFFER_DURATION (footerbuf) = 0; GST_BUFFER_OFFSET (footerbuf) = mux->offset; mux->offset += 2; GST_BUFFER_OFFSET_END (footerbuf) = mux->offset; GST_BUFFER_FLAG_SET (footerbuf, GST_BUFFER_FLAG_DELTA_UNIT); GST_DEBUG_OBJECT (mux, "pushing 2 bytes footer buffer"); ret = gst_pad_push (mux->srcpad, footerbuf); beach: if (best && best->buffer) { gst_buffer_unref (best->buffer); best->buffer = NULL; } return ret; /* ERRORS */ buffer_error: { /* There is a best but no buffer, this is not quite right.. */ GST_ELEMENT_ERROR (mux, STREAM, FAILED, (NULL), ("internal muxing error")); ret = GST_FLOW_ERROR; goto beach; } eos: { GST_DEBUG_OBJECT (mux, "Pushing EOS"); gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); ret = GST_FLOW_UNEXPECTED; goto beach; } nego_error: { GST_WARNING_OBJECT (mux, "failed to set caps"); GST_ELEMENT_ERROR (mux, CORE, NEGOTIATION, (NULL), (NULL)); ret = GST_FLOW_NOT_NEGOTIATED; goto beach; } no_caps: { GST_WARNING_OBJECT (mux, "no caps on the incoming buffer %p", best->buffer); GST_ELEMENT_ERROR (mux, CORE, NEGOTIATION, (NULL), (NULL)); ret = GST_FLOW_NOT_NEGOTIATED; goto beach; } alloc_failed: { GST_WARNING_OBJECT (mux, "failed allocating a %" G_GSIZE_FORMAT " bytes buffer", headerlen); g_free (header); goto beach; } } static void gst_multipart_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMultipartMux *mux; mux = GST_MULTIPART_MUX (object); switch (prop_id) { case ARG_BOUNDARY: g_value_set_string (value, mux->boundary); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_multipart_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMultipartMux *mux; mux = GST_MULTIPART_MUX (object); switch (prop_id) { case ARG_BOUNDARY: g_free (mux->boundary); mux->boundary = g_strdup (g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_multipart_mux_change_state (GstElement * element, GstStateChange transition) { GstMultipartMux *multipart_mux; GstStateChangeReturn ret; multipart_mux = GST_MULTIPART_MUX (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: multipart_mux->offset = 0; multipart_mux->negotiated = FALSE; multipart_mux->need_segment = TRUE; GST_DEBUG_OBJECT (multipart_mux, "starting collect pads"); gst_collect_pads_start (multipart_mux->collect); break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_DEBUG_OBJECT (multipart_mux, "stopping collect pads"); gst_collect_pads_stop (multipart_mux->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { default: break; } return ret; } gboolean gst_multipart_mux_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_multipart_mux_debug, "multipartmux", 0, "multipart muxer"); return gst_element_register (plugin, "multipartmux", GST_RANK_NONE, GST_TYPE_MULTIPART_MUX); } gst-plugins-good-0.10.31/gst/multipart/Makefile.am0000644000175000017500000000162311671175353016664 00000000000000plugin_LTLIBRARIES = libgstmultipart.la libgstmultipart_la_SOURCES = multipart.c multipartdemux.c multipartmux.c libgstmultipart_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstmultipart_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstmultipart_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmultipart_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = multipartdemux.h multipartmux.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmultipart -:SHARED libgstmultipart \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmultipart_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultipart_la_CFLAGS) \ -:LDFLAGS $(libgstmultipart_la_LDFLAGS) \ $(libgstmultipart_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/multipart/multipartdemux.h0000644000175000017500000000562611677341656020103 00000000000000/* GStreamer * Copyright (C) 2006 Sjoerd Simons * Copyright (C) 2004 Wim Taymans * * gstmultipartdemux.h: multipart stream demuxer * * 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_MULTIPART_DEMUX__ #define __GST_MULTIPART_DEMUX__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_MULTIPART_DEMUX (gst_multipart_demux_get_type()) #define GST_MULTIPART_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIPART_DEMUX, GstMultipartDemux)) #define GST_MULTIPART_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIPART_DEMUX, GstMultipartDemux)) #define GST_MULTIPART_DEMUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MULTIPART_DEMUX, GstMultipartDemuxClass)) #define GST_IS_MULTIPART_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIPART_DEMUX)) #define GST_IS_MULTIPART_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIPART_DEMUX)) typedef struct _GstMultipartDemux GstMultipartDemux; typedef struct _GstMultipartDemuxClass GstMultipartDemuxClass; #define MULTIPART_NEED_MORE_DATA -1 #define MULTIPART_DATA_ERROR -2 #define MULTIPART_DATA_EOS -3 /* all information needed for one multipart stream */ typedef struct { GstPad *pad; /* reference for this pad is held by element we belong to */ gchar *mime; GstFlowReturn last_ret; } GstMultipartPad; /** * GstMultipartDemux: * * The opaque #GstMultipartDemux structure. */ struct _GstMultipartDemux { GstElement element; /* pad */ GstPad *sinkpad; GSList *srcpads; gint numpads; GstAdapter *adapter; /* Header information of the current frame */ gboolean header_completed; gchar *boundary; guint boundary_len; gchar *mime_type; gint content_length; /* deprecated, unused */ gboolean autoscan; /* Index inside the current data when manually looking for the boundary */ gint scanpos; gboolean singleStream; }; struct _GstMultipartDemuxClass { GstElementClass parent_class; GHashTable *gstnames; }; GType gst_multipart_demux_get_type (void); gboolean gst_multipart_demux_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_MULTIPART_DEMUX__ */ gst-plugins-good-0.10.31/gst/multipart/multipartmux.h0000644000175000017500000000524511671175354017561 00000000000000/* GStreamer * Copyright (C) 2004 Wim Taymans * * gstmultipartmux.h: multipart stream muxer * * 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_MULTIPART_MUX__ #define __GST_MULTIPART_MUX__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_MULTIPART_MUX (gst_multipart_mux_get_type()) #define GST_MULTIPART_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTIPART_MUX, GstMultipartMux)) #define GST_MULTIPART_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIPART_MUX, GstMultipartMux)) #define GST_MULTIPART_MUX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MULTIPART_MUX, GstMultipartMuxClass)) #define GST_IS_MULTIPART_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTIPART_MUX)) #define GST_IS_MULTIPART_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIPART_MUX)) typedef struct _GstMultipartMux GstMultipartMux; typedef struct _GstMultipartMuxClass GstMultipartMuxClass; /* all information needed for one multipart stream */ typedef struct { GstCollectData collect; /* we extend the CollectData */ GstBuffer *buffer; /* the queued buffer for this pad */ GstClockTime timestamp; /* its timestamp, converted to running_time so that we can correctly sort over multiple segments. */ } GstMultipartPadData; /** * GstMultipartMux: * * The opaque #GstMultipartMux structure. */ struct _GstMultipartMux { GstElement element; /* pad */ GstPad *srcpad; /* sinkpads */ GstCollectPads *collect; gint numpads; /* offset in stream */ guint64 offset; /* boundary string */ gchar *boundary; gboolean negotiated; gboolean need_segment; }; struct _GstMultipartMuxClass { GstElementClass parent_class; GHashTable *mimetypes; }; GType gst_multipart_mux_get_type (void); gboolean gst_multipart_mux_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_MULTIPART_MUX__ */ gst-plugins-good-0.10.31/gst/multipart/multipart.c0000644000175000017500000000242011671175353017011 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #include "multipartdemux.h" #include "multipartmux.h" static gboolean plugin_init (GstPlugin * plugin) { gst_multipart_demux_plugin_init (plugin); gst_multipart_mux_plugin_init (plugin); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "multipart", "multipart stream manipulation", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/multipart/Makefile.in0000644000175000017500000007375511720560234016703 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/multipart DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstmultipart_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstmultipart_la_OBJECTS = libgstmultipart_la-multipart.lo \ libgstmultipart_la-multipartdemux.lo \ libgstmultipart_la-multipartmux.lo libgstmultipart_la_OBJECTS = $(am_libgstmultipart_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstmultipart_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstmultipart_la_CFLAGS) $(CFLAGS) \ $(libgstmultipart_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstmultipart_la_SOURCES) DIST_SOURCES = $(libgstmultipart_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstmultipart.la libgstmultipart_la_SOURCES = multipart.c multipartdemux.c multipartmux.c libgstmultipart_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstmultipart_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstmultipart_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmultipart_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = multipartdemux.h multipartmux.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/multipart/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/multipart/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstmultipart.la: $(libgstmultipart_la_OBJECTS) $(libgstmultipart_la_DEPENDENCIES) $(EXTRA_libgstmultipart_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstmultipart_la_LINK) -rpath $(plugindir) $(libgstmultipart_la_OBJECTS) $(libgstmultipart_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultipart_la-multipart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultipart_la-multipartdemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmultipart_la-multipartmux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstmultipart_la-multipart.lo: multipart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -MT libgstmultipart_la-multipart.lo -MD -MP -MF $(DEPDIR)/libgstmultipart_la-multipart.Tpo -c -o libgstmultipart_la-multipart.lo `test -f 'multipart.c' || echo '$(srcdir)/'`multipart.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultipart_la-multipart.Tpo $(DEPDIR)/libgstmultipart_la-multipart.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multipart.c' object='libgstmultipart_la-multipart.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -c -o libgstmultipart_la-multipart.lo `test -f 'multipart.c' || echo '$(srcdir)/'`multipart.c libgstmultipart_la-multipartdemux.lo: multipartdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -MT libgstmultipart_la-multipartdemux.lo -MD -MP -MF $(DEPDIR)/libgstmultipart_la-multipartdemux.Tpo -c -o libgstmultipart_la-multipartdemux.lo `test -f 'multipartdemux.c' || echo '$(srcdir)/'`multipartdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultipart_la-multipartdemux.Tpo $(DEPDIR)/libgstmultipart_la-multipartdemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multipartdemux.c' object='libgstmultipart_la-multipartdemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -c -o libgstmultipart_la-multipartdemux.lo `test -f 'multipartdemux.c' || echo '$(srcdir)/'`multipartdemux.c libgstmultipart_la-multipartmux.lo: multipartmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -MT libgstmultipart_la-multipartmux.lo -MD -MP -MF $(DEPDIR)/libgstmultipart_la-multipartmux.Tpo -c -o libgstmultipart_la-multipartmux.lo `test -f 'multipartmux.c' || echo '$(srcdir)/'`multipartmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmultipart_la-multipartmux.Tpo $(DEPDIR)/libgstmultipart_la-multipartmux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multipartmux.c' object='libgstmultipart_la-multipartmux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmultipart_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmultipart_la_CFLAGS) $(CFLAGS) -c -o libgstmultipart_la-multipartmux.lo `test -f 'multipartmux.c' || echo '$(srcdir)/'`multipartmux.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmultipart -:SHARED libgstmultipart \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmultipart_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstmultipart_la_CFLAGS) \ -:LDFLAGS $(libgstmultipart_la_LDFLAGS) \ $(libgstmultipart_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/auparse/0000755000175000017500000000000011720565301014314 500000000000000gst-plugins-good-0.10.31/gst/auparse/Makefile.am0000644000175000017500000000154311671175353016304 00000000000000plugin_LTLIBRARIES = libgstauparse.la libgstauparse_la_SOURCES = gstauparse.c libgstauparse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstauparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstauparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstauparse_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstauparse.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstauparse -:SHARED libgstauparse \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstauparse_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstauparse_la_CFLAGS) \ -:LDFLAGS $(libgstauparse_la_LDFLAGS) \ $(libgstauparse_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/auparse/gstauparse.h0000644000175000017500000000403611671175353016577 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Tim-Philipp Müller * * 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_AU_PARSE_H__ #define __GST_AU_PARSE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_AU_PARSE \ (gst_au_parse_get_type()) #define GST_AU_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AU_PARSE,GstAuParse)) #define GST_AU_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AU_PARSE,GstAuParseClass)) #define GST_IS_AU_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AU_PARSE)) #define GST_IS_AU_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AU_PARSE)) typedef struct _GstAuParse GstAuParse; typedef struct _GstAuParseClass GstAuParseClass; struct _GstAuParse { GstElement element; GstPad *sinkpad; GstPad *srcpad; GstCaps *src_caps; GstAdapter *adapter; /* GstSegment segment; */ gint64 offset; /* where sample data starts */ gint64 buffer_offset; guint sample_size; guint encoding; guint samplerate; guint endianness; guint channels; }; struct _GstAuParseClass { GstElementClass parent_class; }; GType gst_au_parse_get_type (void); G_END_DECLS #endif /* __GST_AU_PARSE_H__ */ gst-plugins-good-0.10.31/gst/auparse/gstauparse.c0000644000175000017500000005743211677341655016610 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Tim-Philipp Müller * * 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-auparse * * Parses .au files mostly originating from sun os based computers. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstauparse.h" #include GST_DEBUG_CATEGORY_STATIC (auparse_debug); #define GST_CAT_DEFAULT (auparse_debug) static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-au") ); #define GST_AU_PARSE_ALAW_PAD_TEMPLATE_CAPS \ "audio/x-alaw, " \ "rate = (int) [ 8000, 192000 ], " \ "channels = (int) [ 1, 2 ]" #define GST_AU_PARSE_MULAW_PAD_TEMPLATE_CAPS \ "audio/x-mulaw, " \ "rate = (int) [ 8000, 192000 ], " \ "channels = (int) [ 1, 2 ]" /* Nothing to decode those ADPCM streams for now */ #define GST_AU_PARSE_ADPCM_PAD_TEMPLATE_CAPS \ "audio/x-adpcm, " \ "layout = (string) { g721, g722, g723_3, g723_5 }" static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS ";" GST_AU_PARSE_ALAW_PAD_TEMPLATE_CAPS ";" GST_AU_PARSE_MULAW_PAD_TEMPLATE_CAPS ";" GST_AU_PARSE_ADPCM_PAD_TEMPLATE_CAPS)); static void gst_au_parse_dispose (GObject * object); static GstFlowReturn gst_au_parse_chain (GstPad * pad, GstBuffer * buf); static GstStateChangeReturn gst_au_parse_change_state (GstElement * element, GstStateChange transition); static void gst_au_parse_reset (GstAuParse * auparse); static gboolean gst_au_parse_remove_srcpad (GstAuParse * auparse); static gboolean gst_au_parse_add_srcpad (GstAuParse * auparse, GstCaps * caps); static gboolean gst_au_parse_src_query (GstPad * pad, GstQuery * query); static gboolean gst_au_parse_src_event (GstPad * pad, GstEvent * event); static gboolean gst_au_parse_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_au_parse_src_convert (GstAuParse * auparse, GstFormat src_format, gint64 srcval, GstFormat dest_format, gint64 * destval); GST_BOILERPLATE (GstAuParse, gst_au_parse, GstElement, GST_TYPE_ELEMENT); static void gst_au_parse_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "AU audio demuxer", "Codec/Demuxer/Audio", "Parse an .au file into raw audio", "Erik Walthinsen "); GST_DEBUG_CATEGORY_INIT (auparse_debug, "auparse", 0, ".au parser"); } static void gst_au_parse_class_init (GstAuParseClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->dispose = gst_au_parse_dispose; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_au_parse_change_state); } static void gst_au_parse_init (GstAuParse * auparse, GstAuParseClass * klass) { auparse->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_chain_function (auparse->sinkpad, GST_DEBUG_FUNCPTR (gst_au_parse_chain)); gst_pad_set_event_function (auparse->sinkpad, GST_DEBUG_FUNCPTR (gst_au_parse_sink_event)); gst_element_add_pad (GST_ELEMENT (auparse), auparse->sinkpad); auparse->srcpad = NULL; auparse->adapter = gst_adapter_new (); gst_au_parse_reset (auparse); } static void gst_au_parse_dispose (GObject * object) { GstAuParse *au = GST_AU_PARSE (object); if (au->adapter != NULL) { g_object_unref (au->adapter); au->adapter = NULL; } G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_au_parse_reset (GstAuParse * auparse) { gst_au_parse_remove_srcpad (auparse); auparse->offset = 0; auparse->buffer_offset = 0; auparse->encoding = 0; auparse->samplerate = 0; auparse->channels = 0; gst_adapter_clear (auparse->adapter); /* gst_segment_init (&auparse->segment, GST_FORMAT_TIME); */ } static gboolean gst_au_parse_add_srcpad (GstAuParse * auparse, GstCaps * new_caps) { if (auparse->src_caps && gst_caps_is_equal (new_caps, auparse->src_caps)) { GST_LOG_OBJECT (auparse, "same caps, nothing to do"); return TRUE; } gst_caps_replace (&auparse->src_caps, new_caps); if (auparse->srcpad != NULL) { GST_DEBUG_OBJECT (auparse, "Changing src pad caps to %" GST_PTR_FORMAT, auparse->src_caps); gst_pad_set_caps (auparse->srcpad, auparse->src_caps); } if (auparse->srcpad == NULL) { auparse->srcpad = gst_pad_new_from_static_template (&src_template, "src"); g_return_val_if_fail (auparse->srcpad != NULL, FALSE); #if 0 gst_pad_set_query_type_function (auparse->srcpad, GST_DEBUG_FUNCPTR (gst_au_parse_src_get_query_types)); #endif gst_pad_set_query_function (auparse->srcpad, GST_DEBUG_FUNCPTR (gst_au_parse_src_query)); gst_pad_set_event_function (auparse->srcpad, GST_DEBUG_FUNCPTR (gst_au_parse_src_event)); gst_pad_use_fixed_caps (auparse->srcpad); gst_pad_set_active (auparse->srcpad, TRUE); if (auparse->src_caps) gst_pad_set_caps (auparse->srcpad, auparse->src_caps); GST_DEBUG_OBJECT (auparse, "Adding src pad with caps %" GST_PTR_FORMAT, auparse->src_caps); gst_object_ref (auparse->srcpad); if (!gst_element_add_pad (GST_ELEMENT (auparse), auparse->srcpad)) return FALSE; gst_element_no_more_pads (GST_ELEMENT (auparse)); } return TRUE; } static gboolean gst_au_parse_remove_srcpad (GstAuParse * auparse) { gboolean res = TRUE; if (auparse->srcpad != NULL) { GST_DEBUG_OBJECT (auparse, "Removing src pad"); res = gst_element_remove_pad (GST_ELEMENT (auparse), auparse->srcpad); g_return_val_if_fail (res != FALSE, FALSE); gst_object_unref (auparse->srcpad); auparse->srcpad = NULL; } return res; } static GstFlowReturn gst_au_parse_parse_header (GstAuParse * auparse) { GstCaps *tempcaps; guint32 size; guint8 *head; gchar layout[7] = { 0, }; gint law = 0, depth = 0, ieee = 0; head = (guint8 *) gst_adapter_peek (auparse->adapter, 24); g_assert (head != NULL); GST_DEBUG_OBJECT (auparse, "[%c%c%c%c]", head[0], head[1], head[2], head[3]); switch (GST_READ_UINT32_BE (head)) { /* normal format is big endian (au is a Sparc format) */ case 0x2e736e64:{ /* ".snd" */ auparse->endianness = G_BIG_ENDIAN; break; } /* and of course, someone had to invent a little endian * version. Used by DEC systems. */ case 0x646e732e: /* dns. */ case 0x0064732e:{ /* other source say it is "dns." */ auparse->endianness = G_LITTLE_ENDIAN; break; } default:{ goto unknown_header; } } auparse->offset = GST_READ_UINT32_BE (head + 4); /* Do not trust size, could be set to -1 : unknown * otherwise: filesize = size + auparse->offset */ size = GST_READ_UINT32_BE (head + 8); auparse->encoding = GST_READ_UINT32_BE (head + 12); auparse->samplerate = GST_READ_UINT32_BE (head + 16); auparse->channels = GST_READ_UINT32_BE (head + 20); if (auparse->samplerate < 8000 || auparse->samplerate > 192000) goto unsupported_sample_rate; if (auparse->channels < 1 || auparse->channels > 2) goto unsupported_number_of_channels; GST_DEBUG_OBJECT (auparse, "offset %" G_GINT64_FORMAT ", size %u, " "encoding %u, frequency %u, channels %u", auparse->offset, size, auparse->encoding, auparse->samplerate, auparse->channels); /* Docs: * http://www.opengroup.org/public/pubs/external/auformat.html * http://astronomy.swin.edu.au/~pbourke/dataformats/au/ * Solaris headers : /usr/include/audio/au.h * libsndfile : src/au.c * * Samples : * http://www.tsp.ece.mcgill.ca/MMSP/Documents/AudioFormats/AU/Samples.html */ switch (auparse->encoding) { case 1: /* 8-bit ISDN mu-law G.711 */ law = 1; depth = 8; break; case 27: /* 8-bit ISDN A-law G.711 */ law = 2; depth = 8; break; case 2: /* 8-bit linear PCM */ depth = 8; break; case 3: /* 16-bit linear PCM */ depth = 16; break; case 4: /* 24-bit linear PCM */ depth = 24; break; case 5: /* 32-bit linear PCM */ depth = 32; break; case 6: /* 32-bit IEEE floating point */ ieee = 1; depth = 32; break; case 7: /* 64-bit IEEE floating point */ ieee = 1; depth = 64; break; case 23: /* 4-bit CCITT G.721 ADPCM 32kbps -> modplug/libsndfile (compressed 8-bit mu-law) */ strcpy (layout, "g721"); break; case 24: /* 8-bit CCITT G.722 ADPCM -> rtp */ strcpy (layout, "g722"); break; case 25: /* 3-bit CCITT G.723.3 ADPCM 24kbps -> rtp/xine/modplug/libsndfile */ strcpy (layout, "g723_3"); break; case 26: /* 5-bit CCITT G.723.5 ADPCM 40kbps -> rtp/xine/modplug/libsndfile */ strcpy (layout, "g723_5"); break; case 8: /* Fragmented sample data */ case 9: /* AU_ENCODING_NESTED */ case 10: /* DSP program */ case 11: /* DSP 8-bit fixed point */ case 12: /* DSP 16-bit fixed point */ case 13: /* DSP 24-bit fixed point */ case 14: /* DSP 32-bit fixed point */ case 16: /* AU_ENCODING_DISPLAY : non-audio display data */ case 17: /* AU_ENCODING_MULAW_SQUELCH */ case 18: /* 16-bit linear with emphasis */ case 19: /* 16-bit linear compressed (NeXT) */ case 20: /* 16-bit linear with emphasis and compression */ case 21: /* Music kit DSP commands */ case 22: /* Music kit DSP commands samples */ default: goto unknown_format; } if (law) { tempcaps = gst_caps_new_simple ((law == 1) ? "audio/x-mulaw" : "audio/x-alaw", "rate", G_TYPE_INT, auparse->samplerate, "channels", G_TYPE_INT, auparse->channels, NULL); auparse->sample_size = auparse->channels; } else if (ieee) { tempcaps = gst_caps_new_simple ("audio/x-raw-float", "rate", G_TYPE_INT, auparse->samplerate, "channels", G_TYPE_INT, auparse->channels, "endianness", G_TYPE_INT, auparse->endianness, "width", G_TYPE_INT, depth, NULL); auparse->sample_size = auparse->channels * depth / 8; } else if (layout[0]) { tempcaps = gst_caps_new_simple ("audio/x-adpcm", "layout", G_TYPE_STRING, layout, NULL); auparse->sample_size = 0; } else { tempcaps = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, auparse->samplerate, "channels", G_TYPE_INT, auparse->channels, "endianness", G_TYPE_INT, auparse->endianness, "depth", G_TYPE_INT, depth, "width", G_TYPE_INT, depth, /* FIXME: signed TRUE even for 8-bit PCM? */ "signed", G_TYPE_BOOLEAN, TRUE, NULL); auparse->sample_size = auparse->channels * depth / 8; } GST_DEBUG_OBJECT (auparse, "sample_size=%d", auparse->sample_size); if (!gst_au_parse_add_srcpad (auparse, tempcaps)) goto add_pad_failed; GST_DEBUG_OBJECT (auparse, "offset=%" G_GINT64_FORMAT, auparse->offset); gst_adapter_flush (auparse->adapter, auparse->offset); gst_caps_unref (tempcaps); return GST_FLOW_OK; /* ERRORS */ unknown_header: { GST_ELEMENT_ERROR (auparse, STREAM, WRONG_TYPE, (NULL), (NULL)); return GST_FLOW_ERROR; } unsupported_sample_rate: { GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), ("Unsupported samplerate: %u", auparse->samplerate)); return GST_FLOW_ERROR; } unsupported_number_of_channels: { GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), ("Unsupported number of channels: %u", auparse->channels)); return GST_FLOW_ERROR; } unknown_format: { GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), ("Unsupported encoding: %u", auparse->encoding)); return GST_FLOW_ERROR; } add_pad_failed: { GST_ELEMENT_ERROR (auparse, STREAM, FAILED, (NULL), ("Failed to add srcpad")); gst_caps_unref (tempcaps); return GST_FLOW_ERROR; } } #define AU_HEADER_SIZE 24 static GstFlowReturn gst_au_parse_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; GstAuParse *auparse; gint avail, sendnow = 0; gint64 timestamp; gint64 duration; gint64 offset; auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); GST_LOG_OBJECT (auparse, "got buffer of size %u", GST_BUFFER_SIZE (buf)); gst_adapter_push (auparse->adapter, buf); buf = NULL; /* if we haven't seen any data yet... */ if (auparse->srcpad == NULL) { if (gst_adapter_available (auparse->adapter) < AU_HEADER_SIZE) { GST_DEBUG_OBJECT (auparse, "need more data to parse header"); ret = GST_FLOW_OK; goto out; } ret = gst_au_parse_parse_header (auparse); if (ret != GST_FLOW_OK) goto out; gst_pad_push_event (auparse->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE, 0)); } avail = gst_adapter_available (auparse->adapter); if (auparse->sample_size > 0) { /* Ensure we push a buffer that's a multiple of the frame size downstream */ sendnow = avail - (avail % auparse->sample_size); } else { /* It's something non-trivial (such as ADPCM), we don't understand it, so * just push downstream and assume it will know what to do with it */ sendnow = avail; } if (sendnow > 0) { GstBuffer *outbuf; const guint8 *data; gint64 pos; ret = gst_pad_alloc_buffer_and_set_caps (auparse->srcpad, auparse->buffer_offset, sendnow, GST_PAD_CAPS (auparse->srcpad), &outbuf); if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (auparse, "pad alloc flow: %s", gst_flow_get_name (ret)); goto out; } data = gst_adapter_peek (auparse->adapter, sendnow); memcpy (GST_BUFFER_DATA (outbuf), data, sendnow); gst_adapter_flush (auparse->adapter, sendnow); pos = auparse->buffer_offset - auparse->offset; pos = MAX (pos, 0); if (auparse->sample_size > 0 && auparse->samplerate > 0) { gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, pos, GST_FORMAT_DEFAULT, &offset); gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, pos, GST_FORMAT_TIME, ×tamp); gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, sendnow, GST_FORMAT_TIME, &duration); GST_BUFFER_OFFSET (outbuf) = offset; GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; } auparse->buffer_offset += sendnow; ret = gst_pad_push (auparse->srcpad, outbuf); } out: gst_object_unref (auparse); return ret; } static gboolean gst_au_parse_src_convert (GstAuParse * auparse, GstFormat src_format, gint64 srcval, GstFormat dest_format, gint64 * destval) { gboolean ret = TRUE; guint samplesize, rate; if (dest_format == src_format) { *destval = srcval; return TRUE; } GST_OBJECT_LOCK (auparse); samplesize = auparse->sample_size; rate = auparse->samplerate; GST_OBJECT_UNLOCK (auparse); if (samplesize == 0 || rate == 0) { GST_LOG_OBJECT (auparse, "cannot convert, sample_size or rate unknown"); return FALSE; } switch (src_format) { case GST_FORMAT_BYTES: srcval /= samplesize; /* fallthrough */ case GST_FORMAT_DEFAULT:{ switch (dest_format) { case GST_FORMAT_DEFAULT: *destval = srcval; break; case GST_FORMAT_BYTES: *destval = srcval * samplesize; break; case GST_FORMAT_TIME: *destval = gst_util_uint64_scale_int (srcval, GST_SECOND, rate); break; default: ret = FALSE; break; } break; } case GST_FORMAT_TIME:{ switch (dest_format) { case GST_FORMAT_BYTES: *destval = samplesize * gst_util_uint64_scale_int (srcval, rate, GST_SECOND); break; case GST_FORMAT_DEFAULT: *destval = gst_util_uint64_scale_int (srcval, rate, GST_SECOND); break; default: ret = FALSE; break; } break; } default:{ ret = FALSE; break; } } if (!ret) { GST_DEBUG_OBJECT (auparse, "could not convert from %s to %s format", gst_format_get_name (src_format), gst_format_get_name (dest_format)); } return ret; } static gboolean gst_au_parse_src_query (GstPad * pad, GstQuery * query) { GstAuParse *auparse; gboolean ret = FALSE; auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION:{ GstFormat bformat = GST_FORMAT_BYTES; GstFormat format; gint64 len, val; gst_query_parse_duration (query, &format, NULL); if (!gst_pad_query_peer_duration (auparse->sinkpad, &bformat, &len)) { GST_DEBUG_OBJECT (auparse, "failed to query upstream length"); break; } GST_OBJECT_LOCK (auparse); len -= auparse->offset; GST_OBJECT_UNLOCK (auparse); ret = gst_au_parse_src_convert (auparse, bformat, len, format, &val); if (ret) { gst_query_set_duration (query, format, val); } break; } case GST_QUERY_POSITION:{ GstFormat bformat = GST_FORMAT_BYTES; GstFormat format; gint64 pos, val; gst_query_parse_position (query, &format, NULL); if (!gst_pad_query_peer_position (auparse->sinkpad, &bformat, &pos)) { GST_DEBUG_OBJECT (auparse, "failed to query upstream position"); break; } GST_OBJECT_LOCK (auparse); pos -= auparse->offset; GST_OBJECT_UNLOCK (auparse); ret = gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, pos, format, &val); if (ret) { gst_query_set_position (query, format, val); } break; } case GST_QUERY_SEEKING:{ GstFormat format; gst_query_parse_seeking (query, &format, NULL, NULL, NULL); /* FIXME: query duration in 'format' gst_query_set_seeking (query, format, TRUE, 0, duration); */ gst_query_set_seeking (query, format, TRUE, 0, GST_CLOCK_TIME_NONE); ret = TRUE; break; } default: ret = gst_pad_query_default (pad, query); break; } gst_object_unref (auparse); return ret; } static gboolean gst_au_parse_handle_seek (GstAuParse * auparse, GstEvent * event) { GstSeekType start_type, stop_type; GstSeekFlags flags; GstFormat format; gdouble rate; gint64 start, stop; gboolean res; gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, &stop_type, &stop); if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (auparse, "only support seeks in TIME format"); return FALSE; } res = gst_au_parse_src_convert (auparse, GST_FORMAT_TIME, start, GST_FORMAT_BYTES, &start); if (stop > 0) { res = gst_au_parse_src_convert (auparse, GST_FORMAT_TIME, stop, GST_FORMAT_BYTES, &stop); } GST_INFO_OBJECT (auparse, "seeking: %" G_GINT64_FORMAT " ... %" G_GINT64_FORMAT, start, stop); event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, start_type, start, stop_type, stop); res = gst_pad_push_event (auparse->sinkpad, event); return res; } static gboolean gst_au_parse_sink_event (GstPad * pad, GstEvent * event) { GstAuParse *auparse; gboolean ret = TRUE; auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time, offset = 0; gboolean update; GstSegment segment; GstEvent *new_event = NULL; gst_segment_init (&segment, GST_FORMAT_UNDEFINED); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); gst_segment_set_newsegment_full (&segment, update, rate, arate, format, start, stop, time); if (auparse->sample_size > 0) { if (start > 0) { offset = start; start -= auparse->offset; start = MAX (start, 0); } if (stop > 0) { stop -= auparse->offset; stop = MAX (stop, 0); } gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, start, GST_FORMAT_TIME, &start); gst_au_parse_src_convert (auparse, GST_FORMAT_BYTES, stop, GST_FORMAT_TIME, &stop); } if (auparse->srcpad) { GST_INFO_OBJECT (auparse, "new segment: %" GST_TIME_FORMAT " ... %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); new_event = gst_event_new_new_segment_full (update, rate, arate, GST_FORMAT_TIME, start, stop, start); ret = gst_pad_push_event (auparse->srcpad, new_event); } auparse->buffer_offset = offset; gst_event_unref (event); break; } case GST_EVENT_EOS: if (!auparse->srcpad) { GST_ELEMENT_ERROR (auparse, STREAM, WRONG_TYPE, ("No valid input found before end of stream"), (NULL)); } /* fall-through */ default: ret = gst_pad_event_default (pad, event); break; } gst_object_unref (auparse); return ret; } static gboolean gst_au_parse_src_event (GstPad * pad, GstEvent * event) { GstAuParse *auparse; gboolean ret; auparse = GST_AU_PARSE (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: ret = gst_au_parse_handle_seek (auparse, event); break; default: ret = gst_pad_event_default (pad, event); break; } gst_object_unref (auparse); return ret; } static GstStateChangeReturn gst_au_parse_change_state (GstElement * element, GstStateChange transition) { GstAuParse *auparse = GST_AU_PARSE (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; ret = parent_class->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_au_parse_reset (auparse); default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "auparse", GST_RANK_SECONDARY, GST_TYPE_AU_PARSE)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "auparse", "parses au streams", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/auparse/Makefile.in0000644000175000017500000006634411720560230016312 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/auparse DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstauparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstauparse_la_OBJECTS = libgstauparse_la-gstauparse.lo libgstauparse_la_OBJECTS = $(am_libgstauparse_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstauparse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstauparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstauparse_la_CFLAGS) $(CFLAGS) \ $(libgstauparse_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstauparse_la_SOURCES) DIST_SOURCES = $(libgstauparse_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstauparse.la libgstauparse_la_SOURCES = gstauparse.c libgstauparse_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstauparse_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstauparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstauparse_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstauparse.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/auparse/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/auparse/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstauparse.la: $(libgstauparse_la_OBJECTS) $(libgstauparse_la_DEPENDENCIES) $(EXTRA_libgstauparse_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstauparse_la_LINK) -rpath $(plugindir) $(libgstauparse_la_OBJECTS) $(libgstauparse_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstauparse_la-gstauparse.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstauparse_la-gstauparse.lo: gstauparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstauparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstauparse_la_CFLAGS) $(CFLAGS) -MT libgstauparse_la-gstauparse.lo -MD -MP -MF $(DEPDIR)/libgstauparse_la-gstauparse.Tpo -c -o libgstauparse_la-gstauparse.lo `test -f 'gstauparse.c' || echo '$(srcdir)/'`gstauparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstauparse_la-gstauparse.Tpo $(DEPDIR)/libgstauparse_la-gstauparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstauparse.c' object='libgstauparse_la-gstauparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstauparse_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstauparse_la_CFLAGS) $(CFLAGS) -c -o libgstauparse_la-gstauparse.lo `test -f 'gstauparse.c' || echo '$(srcdir)/'`gstauparse.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstauparse -:SHARED libgstauparse \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstauparse_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstauparse_la_CFLAGS) \ -:LDFLAGS $(libgstauparse_la_LDFLAGS) \ $(libgstauparse_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/smpte/0000755000175000017500000000000011720565312014006 500000000000000gst-plugins-good-0.10.31/gst/smpte/gstsmpte.c0000644000175000017500000004564711677341656015776 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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-smpte * * smpte can accept I420 video streams with the same width, height and * framerate. The two incomming buffers are blended together using an effect * specific alpha mask. * * The #GstSmpte:depth property defines the presision in bits of the mask. A * higher presision will create a mask with smoother gradients in order to avoid * banding. * * * Sample pipelines * |[ * gst-launch -v videotestsrc pattern=1 ! smpte name=s border=20000 type=234 duration=2000000000 ! ffmpegcolorspace ! ximagesink videotestsrc ! s. * ]| A pipeline to demonstrate the smpte transition. * It shows a pinwheel transition a from a snow videotestsrc to an smpte * pattern videotestsrc. The transition will take 2 seconds to complete. The * edges of the transition are smoothed with a 20000 big border. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstsmpte.h" #include #include "paint.h" GST_DEBUG_CATEGORY_STATIC (gst_smpte_debug); #define GST_CAT_DEFAULT gst_smpte_debug static GstStaticPadTemplate gst_smpte_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ) ); static GstStaticPadTemplate gst_smpte_sink1_template = GST_STATIC_PAD_TEMPLATE ("sink1", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ) ); static GstStaticPadTemplate gst_smpte_sink2_template = GST_STATIC_PAD_TEMPLATE ("sink2", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ) ); /* SMPTE signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_PROP_TYPE 1 #define DEFAULT_PROP_BORDER 0 #define DEFAULT_PROP_DEPTH 16 #define DEFAULT_PROP_FPS 0. #define DEFAULT_PROP_DURATION GST_SECOND #define DEFAULT_PROP_INVERT FALSE enum { PROP_0, PROP_TYPE, PROP_BORDER, PROP_DEPTH, PROP_FPS, PROP_DURATION, PROP_INVERT, PROP_LAST, }; #define I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) #define I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) #define I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(I420_Y_ROWSTRIDE(width)))/2) #define I420_Y_OFFSET(w,h) (0) #define I420_U_OFFSET(w,h) (I420_Y_OFFSET(w,h)+(I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) #define I420_V_OFFSET(w,h) (I420_U_OFFSET(w,h)+(I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) #define I420_SIZE(w,h) (I420_V_OFFSET(w,h)+(I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) #define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_transition_type_get_type()) static GType gst_smpte_transition_type_get_type (void) { static GType smpte_transition_type = 0; GEnumValue *smpte_transitions; if (!smpte_transition_type) { const GList *definitions; gint i = 0; definitions = gst_mask_get_definitions (); smpte_transitions = g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1); while (definitions) { GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data; definitions = g_list_next (definitions); smpte_transitions[i].value = definition->type; /* older GLib versions have the two fields as non-const, hence the cast */ smpte_transitions[i].value_nick = (gchar *) definition->short_name; smpte_transitions[i].value_name = (gchar *) definition->long_name; i++; } smpte_transition_type = g_enum_register_static ("GstSMPTETransitionType", smpte_transitions); } return smpte_transition_type; } static void gst_smpte_class_init (GstSMPTEClass * klass); static void gst_smpte_base_init (GstSMPTEClass * klass); static void gst_smpte_init (GstSMPTE * smpte); static void gst_smpte_finalize (GstSMPTE * smpte); static GstFlowReturn gst_smpte_collected (GstCollectPads * pads, GstSMPTE * smpte); static void gst_smpte_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_smpte_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_smpte_change_state (GstElement * element, GstStateChange transition); static GstElementClass *parent_class = NULL; /*static guint gst_smpte_signals[LAST_SIGNAL] = { 0 }; */ static GType gst_smpte_get_type (void) { static GType smpte_type = 0; if (!smpte_type) { static const GTypeInfo smpte_info = { sizeof (GstSMPTEClass), (GBaseInitFunc) gst_smpte_base_init, NULL, (GClassInitFunc) gst_smpte_class_init, NULL, NULL, sizeof (GstSMPTE), 0, (GInstanceInitFunc) gst_smpte_init, }; smpte_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0); } return smpte_type; } static void gst_smpte_base_init (GstSMPTEClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_smpte_sink1_template); gst_element_class_add_static_pad_template (element_class, &gst_smpte_sink2_template); gst_element_class_add_static_pad_template (element_class, &gst_smpte_src_template); gst_element_class_set_details_simple (element_class, "SMPTE transitions", "Filter/Editor/Video", "Apply the standard SMPTE transitions on video images", "Wim Taymans "); } static void gst_smpte_class_init (GstSMPTEClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_smpte_set_property; gobject_class->get_property = gst_smpte_get_property; gobject_class->finalize = (GObjectFinalizeFunc) gst_smpte_finalize; _gst_mask_init (); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TYPE, g_param_spec_enum ("type", "Type", "The type of transition to use", GST_TYPE_SMPTE_TRANSITION_TYPE, DEFAULT_PROP_TYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FPS, g_param_spec_float ("fps", "FPS", "Frames per second if no input files are given (deprecated)", 0., G_MAXFLOAT, DEFAULT_PROP_FPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER, g_param_spec_int ("border", "Border", "The border width of the transition", 0, G_MAXINT, DEFAULT_PROP_BORDER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEPTH, g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24, DEFAULT_PROP_DEPTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DURATION, g_param_spec_uint64 ("duration", "Duration", "Duration of the transition effect in nanoseconds", 0, G_MAXUINT64, DEFAULT_PROP_DURATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INVERT, g_param_spec_boolean ("invert", "Invert", "Invert transition mask", DEFAULT_PROP_INVERT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_smpte_change_state); } /* wht yel cya grn mag red blu blk -I Q */ static const int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 }; static const int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; static const int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; static void fill_i420 (guint8 * data, gint width, gint height, gint color) { gint size = I420_Y_ROWSTRIDE (width) * GST_ROUND_UP_2 (height); gint size4 = size >> 2; guint8 *yp = data; guint8 *up = data + I420_U_OFFSET (width, height); guint8 *vp = data + I420_V_OFFSET (width, height); memset (yp, y_colors[color], size); memset (up, u_colors[color], size4); memset (vp, v_colors[color], size4); } static gboolean gst_smpte_update_mask (GstSMPTE * smpte, gint type, gboolean invert, gint depth, gint width, gint height) { GstMask *newmask; if (smpte->mask) { if (smpte->type == type && smpte->invert == invert && smpte->depth == depth && smpte->width == width && smpte->height == height) return TRUE; } newmask = gst_mask_factory_new (type, invert, depth, width, height); if (newmask) { if (smpte->mask) { gst_mask_destroy (smpte->mask); } smpte->mask = newmask; smpte->type = type; smpte->invert = invert; smpte->depth = depth; smpte->width = width; smpte->height = height; return TRUE; } return FALSE; } static gboolean gst_smpte_setcaps (GstPad * pad, GstCaps * caps) { GstSMPTE *smpte; GstStructure *structure; gboolean ret; smpte = GST_SMPTE (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "width", &smpte->width); ret &= gst_structure_get_int (structure, "height", &smpte->height); ret &= gst_structure_get_fraction (structure, "framerate", &smpte->fps_num, &smpte->fps_denom); if (!ret) return FALSE; /* for backward compat, we store these here */ smpte->fps = ((gdouble) smpte->fps_num) / smpte->fps_denom; /* figure out the duration in frames */ smpte->end_position = gst_util_uint64_scale (smpte->duration, smpte->fps_num, GST_SECOND * smpte->fps_denom); GST_DEBUG_OBJECT (smpte, "duration: %d frames", smpte->end_position); ret = gst_smpte_update_mask (smpte, smpte->type, smpte->invert, smpte->depth, smpte->width, smpte->height); return ret; } static void gst_smpte_init (GstSMPTE * smpte) { smpte->sinkpad1 = gst_pad_new_from_static_template (&gst_smpte_sink1_template, "sink1"); gst_pad_set_setcaps_function (smpte->sinkpad1, GST_DEBUG_FUNCPTR (gst_smpte_setcaps)); gst_pad_set_getcaps_function (smpte->sinkpad1, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad1); smpte->sinkpad2 = gst_pad_new_from_static_template (&gst_smpte_sink2_template, "sink2"); gst_pad_set_setcaps_function (smpte->sinkpad2, GST_DEBUG_FUNCPTR (gst_smpte_setcaps)); gst_pad_set_getcaps_function (smpte->sinkpad2, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad2); smpte->srcpad = gst_pad_new_from_static_template (&gst_smpte_src_template, "src"); gst_element_add_pad (GST_ELEMENT (smpte), smpte->srcpad); smpte->collect = gst_collect_pads_new (); gst_collect_pads_set_function (smpte->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_smpte_collected), smpte); gst_collect_pads_start (smpte->collect); gst_collect_pads_add_pad (smpte->collect, smpte->sinkpad1, sizeof (GstCollectData)); gst_collect_pads_add_pad (smpte->collect, smpte->sinkpad2, sizeof (GstCollectData)); smpte->fps = DEFAULT_PROP_FPS; smpte->type = DEFAULT_PROP_TYPE; smpte->border = DEFAULT_PROP_BORDER; smpte->depth = DEFAULT_PROP_DEPTH; smpte->duration = DEFAULT_PROP_DURATION; smpte->invert = DEFAULT_PROP_INVERT; smpte->fps_num = 0; smpte->fps_denom = 1; } static void gst_smpte_finalize (GstSMPTE * smpte) { if (smpte->collect) { gst_object_unref (smpte->collect); } G_OBJECT_CLASS (parent_class)->finalize ((GObject *) smpte); } static void gst_smpte_reset (GstSMPTE * smpte) { smpte->width = -1; smpte->height = -1; smpte->position = 0; smpte->end_position = 0; } static void gst_smpte_blend_i420 (guint8 * in1, guint8 * in2, guint8 * out, GstMask * mask, gint width, gint height, gint border, gint pos) { guint32 *maskp; gint value; gint i, j; gint min, max; guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; gint lumsize = width * height; gint chromsize = lumsize >> 2; if (border == 0) border++; min = pos - border; max = pos; in1u = in1 + lumsize; in1v = in1u + chromsize; in2u = in2 + lumsize; in2v = in2u + chromsize; outu = out + lumsize; outv = outu + chromsize; maskp = mask->data; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { value = *maskp++; value = ((CLAMP (value, min, max) - min) << 8) / border; *out++ = ((*in1++ * value) + (*in2++ * (256 - value))) >> 8; if (!(i & 1) && !(j & 1)) { *outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8; *outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8; } } } } static GstFlowReturn gst_smpte_collected (GstCollectPads * pads, GstSMPTE * smpte) { GstBuffer *outbuf; GstClockTime ts; GstBuffer *in1 = NULL, *in2 = NULL; GSList *collected; if (G_UNLIKELY (smpte->fps_num == 0)) goto not_negotiated; if (!GST_PAD_CAPS (smpte->sinkpad1) || !GST_PAD_CAPS (smpte->sinkpad2)) goto not_negotiated; ts = gst_util_uint64_scale_int (smpte->position * GST_SECOND, smpte->fps_denom, smpte->fps_num); for (collected = pads->data; collected; collected = g_slist_next (collected)) { GstCollectData *data; data = (GstCollectData *) collected->data; if (data->pad == smpte->sinkpad1) in1 = gst_collect_pads_pop (pads, data); else if (data->pad == smpte->sinkpad2) in2 = gst_collect_pads_pop (pads, data); } if (in1 == NULL) { /* if no input, make picture black */ in1 = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height)); fill_i420 (GST_BUFFER_DATA (in1), smpte->width, smpte->height, 7); } if (in2 == NULL) { /* if no input, make picture white */ in2 = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height)); fill_i420 (GST_BUFFER_DATA (in2), smpte->width, smpte->height, 0); } if (GST_BUFFER_SIZE (in1) != GST_BUFFER_SIZE (in2)) goto input_formats_do_not_match; if (smpte->position < smpte->end_position) { outbuf = gst_buffer_new_and_alloc (I420_SIZE (smpte->width, smpte->height)); /* set caps if not done yet */ if (!GST_PAD_CAPS (smpte->srcpad)) { GstCaps *caps; caps = gst_caps_copy (gst_static_caps_get (&gst_smpte_src_template.static_caps)); gst_caps_set_simple (caps, "width", G_TYPE_INT, smpte->width, "height", G_TYPE_INT, smpte->height, "framerate", GST_TYPE_FRACTION, smpte->fps_num, smpte->fps_denom, NULL); gst_pad_set_caps (smpte->srcpad, caps); gst_pad_push_event (smpte->srcpad, gst_event_new_new_segment_full (FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0, -1, 0)); } gst_buffer_set_caps (outbuf, GST_PAD_CAPS (smpte->srcpad)); gst_smpte_blend_i420 (GST_BUFFER_DATA (in1), GST_BUFFER_DATA (in2), GST_BUFFER_DATA (outbuf), smpte->mask, smpte->width, smpte->height, smpte->border, ((1 << smpte->depth) + smpte->border) * smpte->position / smpte->end_position); } else { outbuf = in2; gst_buffer_ref (in2); } smpte->position++; if (in1) gst_buffer_unref (in1); if (in2) gst_buffer_unref (in2); GST_BUFFER_TIMESTAMP (outbuf) = ts; return gst_pad_push (smpte->srcpad, outbuf); /* ERRORS */ not_negotiated: { GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), ("No input format negotiated")); return GST_FLOW_NOT_NEGOTIATED; } input_formats_do_not_match: { GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), ("input formats don't match: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, GST_PAD_CAPS (smpte->sinkpad1), GST_PAD_CAPS (smpte->sinkpad2))); return GST_FLOW_ERROR; } } static void gst_smpte_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSMPTE *smpte; smpte = GST_SMPTE (object); switch (prop_id) { case PROP_TYPE: smpte->type = g_value_get_enum (value); break; case PROP_BORDER: smpte->border = g_value_get_int (value); break; case PROP_FPS: smpte->fps = g_value_get_float (value); break; case PROP_DEPTH: smpte->depth = g_value_get_int (value); break; case PROP_DURATION: smpte->duration = g_value_get_uint64 (value); break; case PROP_INVERT: smpte->invert = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_smpte_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSMPTE *smpte; smpte = GST_SMPTE (object); switch (prop_id) { case PROP_TYPE: g_value_set_enum (value, smpte->type); break; case PROP_FPS: g_value_set_float (value, smpte->fps); break; case PROP_BORDER: g_value_set_int (value, smpte->border); break; case PROP_DEPTH: g_value_set_int (value, smpte->depth); break; case PROP_DURATION: g_value_set_uint64 (value, smpte->duration); break; case PROP_INVERT: g_value_set_boolean (value, smpte->invert); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_smpte_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstSMPTE *smpte; smpte = GST_SMPTE (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_smpte_reset (smpte); GST_LOG_OBJECT (smpte, "starting collectpads"); gst_collect_pads_start (smpte->collect); break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_LOG_OBJECT (smpte, "stopping collectpads"); gst_collect_pads_stop (smpte->collect); break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_smpte_reset (smpte); break; default: break; } return ret; } gboolean gst_smpte_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_smpte_debug, "smpte", 0, "SMPTE transition effect"); return gst_element_register (plugin, "smpte", GST_RANK_NONE, GST_TYPE_SMPTE); } gst-plugins-good-0.10.31/gst/smpte/gstsmptealpha.c0000644000175000017500000005267511677341656017003 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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-smptealpha * * smptealpha can accept an I420 or AYUV video stream. An alpha channel is added * using an effect specific SMPTE mask in the I420 input case. In the AYUV case, * the alpha channel is modified using the effect specific SMPTE mask. * * The #GstSmpteAlpha:position property is a controllabe double between 0.0 and * 1.0 that specifies the position in the transition. 0.0 is the start of the * transition with the alpha channel to complete opaque where 1.0 has the alpha * channel set to completely transparent. * * The #GstSmpteAlpha:depth property defines the precision in bits of the mask. * A higher presision will create a mask with smoother gradients in order to * avoid banding. * * * Sample pipelines * * Here is a pipeline to demonstrate the smpte transition : * * gst-launch -v videotestsrc ! smptealpha border=20000 type=44 * position=0.5 ! videomixer ! ffmpegcolorspace ! ximagesink * * This shows a midway bowtie-h transition a from a videotestsrc to a * transparent image. The edges of the transition are smoothed with a * 20000 big border. * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstsmptealpha.h" #include "paint.h" GST_DEBUG_CATEGORY_STATIC (gst_smpte_alpha_debug); #define GST_CAT_DEFAULT gst_smpte_alpha_debug static GstStaticPadTemplate gst_smpte_alpha_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ARGB) ); static GstStaticPadTemplate gst_smpte_alpha_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_ARGB) ); /* SMPTE signals and properties */ #define DEFAULT_PROP_TYPE 1 #define DEFAULT_PROP_BORDER 0 #define DEFAULT_PROP_DEPTH 16 #define DEFAULT_PROP_POSITION 0.0 #define DEFAULT_PROP_INVERT FALSE enum { PROP_0, PROP_TYPE, PROP_BORDER, PROP_DEPTH, PROP_POSITION, PROP_INVERT, PROP_LAST, }; #define AYUV_SIZE(w,h) ((w) * (h) * 4) #define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_alpha_transition_type_get_type()) static GType gst_smpte_alpha_transition_type_get_type (void) { static GType smpte_transition_type = 0; GEnumValue *smpte_transitions; if (!smpte_transition_type) { const GList *definitions; gint i = 0; definitions = gst_mask_get_definitions (); smpte_transitions = g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1); while (definitions) { GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data; definitions = g_list_next (definitions); smpte_transitions[i].value = definition->type; /* older GLib versions have the two fields as non-const, hence the cast */ smpte_transitions[i].value_nick = (gchar *) definition->short_name; smpte_transitions[i].value_name = (gchar *) definition->long_name; i++; } smpte_transition_type = g_enum_register_static ("GstSMPTEAlphaTransitionType", smpte_transitions); } return smpte_transition_type; } static void gst_smpte_alpha_finalize (GstSMPTEAlpha * smpte); static void gst_smpte_alpha_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_smpte_alpha_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_smpte_alpha_setcaps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps); static gboolean gst_smpte_alpha_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size); static GstFlowReturn gst_smpte_alpha_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out); static void gst_smpte_alpha_before_transform (GstBaseTransform * trans, GstBuffer * buf); static GstCaps *gst_smpte_alpha_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * from); GST_BOILERPLATE (GstSMPTEAlpha, gst_smpte_alpha, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void gst_smpte_alpha_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_smpte_alpha_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_smpte_alpha_src_template); gst_element_class_set_details_simple (element_class, "SMPTE transitions", "Filter/Editor/Video", "Apply the standard SMPTE transitions as alpha on video images", "Wim Taymans "); } static void gst_smpte_alpha_class_init (GstSMPTEAlphaClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_smpte_alpha_set_property; gobject_class->get_property = gst_smpte_alpha_get_property; gobject_class->finalize = (GObjectFinalizeFunc) gst_smpte_alpha_finalize; _gst_mask_init (); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TYPE, g_param_spec_enum ("type", "Type", "The type of transition to use", GST_TYPE_SMPTE_TRANSITION_TYPE, DEFAULT_PROP_TYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER, g_param_spec_int ("border", "Border", "The border width of the transition", 0, G_MAXINT, DEFAULT_PROP_BORDER, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEPTH, g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24, DEFAULT_PROP_DEPTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_POSITION, g_param_spec_double ("position", "Position", "Position of the transition effect", 0.0, 1.0, DEFAULT_PROP_POSITION, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstSMPTEAlpha:invert: * * Set to TRUE to invert the transition mask (ie. flip it horizontally). * * Since: 0.10.23 */ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INVERT, g_param_spec_boolean ("invert", "Invert", "Invert transition mask", DEFAULT_PROP_POSITION, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_smpte_alpha_setcaps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_smpte_alpha_get_unit_size); trans_class->transform = GST_DEBUG_FUNCPTR (gst_smpte_alpha_transform); trans_class->before_transform = GST_DEBUG_FUNCPTR (gst_smpte_alpha_before_transform); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_smpte_alpha_transform_caps); } static gboolean gst_smpte_alpha_update_mask (GstSMPTEAlpha * smpte, gint type, gboolean invert, gint depth, gint width, gint height) { GstMask *newmask; /* try to avoid regenerating the mask if we already have one that is * correct */ if (smpte->mask) { if (smpte->type == type && smpte->invert == invert && smpte->depth == depth && smpte->width == width && smpte->height == height) return TRUE; } smpte->type = type; smpte->invert = invert; smpte->depth = depth; smpte->width = width; smpte->height = height; /* Not negotiated yet */ if (width == 0 || height == 0) { return TRUE; } newmask = gst_mask_factory_new (type, invert, depth, width, height); if (!newmask) goto mask_failed; if (smpte->mask) gst_mask_destroy (smpte->mask); smpte->mask = newmask; return TRUE; /* ERRORS */ mask_failed: { GST_ERROR_OBJECT (smpte, "failed to create a mask"); return FALSE; } } static void gst_smpte_alpha_init (GstSMPTEAlpha * smpte, GstSMPTEAlphaClass * klass) { smpte->type = DEFAULT_PROP_TYPE; smpte->border = DEFAULT_PROP_BORDER; smpte->depth = DEFAULT_PROP_DEPTH; smpte->position = DEFAULT_PROP_POSITION; smpte->invert = DEFAULT_PROP_INVERT; } #define CREATE_ARGB_FUNC(name, A, R, G, B) \ static void \ gst_smpte_alpha_process_##name##_##name (GstSMPTEAlpha * smpte, const guint8 * in, \ guint8 * out, GstMask * mask, gint width, gint height, gint border, \ gint pos) \ { \ gint i, j; \ const guint32 *maskp; \ gint value; \ gint min, max; \ \ if (border == 0) \ border++; \ \ min = pos - border; \ max = pos; \ GST_DEBUG_OBJECT (smpte, "pos %d, min %d, max %d, border %d", pos, min, max, \ border); \ \ maskp = mask->data; \ \ /* we basically copy the source to dest but we scale the alpha channel with \ * the mask */ \ for (i = 0; i < height; i++) { \ for (j = 0; j < width; j++) { \ value = *maskp++; \ out[A] = (in[A] * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; \ out[R] = in[R]; \ out[G] = in[G]; \ out[B] = in[B]; \ out += 4; \ in += 4; \ } \ } \ } CREATE_ARGB_FUNC (argb, 0, 1, 2, 3); CREATE_ARGB_FUNC (bgra, 3, 2, 1, 0); CREATE_ARGB_FUNC (abgr, 0, 3, 2, 1); CREATE_ARGB_FUNC (rgba, 3, 0, 1, 2); static void gst_smpte_alpha_process_ayuv_ayuv (GstSMPTEAlpha * smpte, const guint8 * in, guint8 * out, GstMask * mask, gint width, gint height, gint border, gint pos) { gint i, j; const guint32 *maskp; gint value; gint min, max; if (border == 0) border++; min = pos - border; max = pos; GST_DEBUG_OBJECT (smpte, "pos %d, min %d, max %d, border %d", pos, min, max, border); maskp = mask->data; /* we basically copy the source to dest but we scale the alpha channel with * the mask */ for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { value = *maskp++; *out++ = (*in++ * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; *out++ = *in++; *out++ = *in++; *out++ = *in++; } } } static void gst_smpte_alpha_process_i420_ayuv (GstSMPTEAlpha * smpte, const guint8 * in, guint8 * out, GstMask * mask, gint width, gint height, gint border, gint pos) { const guint8 *srcY; const guint8 *srcU; const guint8 *srcV; gint i, j; gint src_wrap, src_uv_wrap; gint y_stride, uv_stride; gboolean odd_width; const guint32 *maskp; gint value; gint min, max; if (border == 0) border++; min = pos - border; max = pos; GST_DEBUG_OBJECT (smpte, "pos %d, min %d, max %d, border %d", pos, min, max, border); maskp = mask->data; y_stride = gst_video_format_get_row_stride (smpte->in_format, 0, width); uv_stride = gst_video_format_get_row_stride (smpte->in_format, 1, width); src_wrap = y_stride - width; src_uv_wrap = uv_stride - (width / 2); srcY = in; srcU = in + gst_video_format_get_component_offset (smpte->in_format, 1, width, height); srcV = in + gst_video_format_get_component_offset (smpte->in_format, 2, width, height); odd_width = (width % 2 != 0); for (i = 0; i < height; i++) { for (j = 0; j < width / 2; j++) { value = *maskp++; *out++ = (0xff * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; *out++ = *srcY++; *out++ = *srcU; *out++ = *srcV; value = *maskp++; *out++ = (0xff * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; *out++ = *srcY++; *out++ = *srcU++; *out++ = *srcV++; } /* Might have one odd column left to do */ if (odd_width) { value = *maskp++; *out++ = (0xff * ((CLAMP (value, min, max) - min) << 8) / border) >> 8; *out++ = *srcY++; *out++ = *srcU; *out++ = *srcV; } if (i % 2 == 0) { srcU -= width / 2; srcV -= width / 2; } else { srcU += src_uv_wrap; srcV += src_uv_wrap; } srcY += src_wrap; } } static void gst_smpte_alpha_before_transform (GstBaseTransform * trans, GstBuffer * buf) { GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (trans); GstClockTime timestamp, stream_time; /* first sync the controller to the current stream_time of the buffer */ timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (smpte, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (smpte), stream_time); } static GstFlowReturn gst_smpte_alpha_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (trans); gdouble position; gint border; if (G_UNLIKELY (!smpte->process)) goto not_negotiated; /* these are the propertis we update with only the object lock, others are * only updated with the TRANSFORM_LOCK. */ GST_OBJECT_LOCK (smpte); position = smpte->position; border = smpte->border; GST_OBJECT_UNLOCK (smpte); /* run the type specific filter code */ smpte->process (smpte, GST_BUFFER_DATA (in), GST_BUFFER_DATA (out), smpte->mask, smpte->width, smpte->height, border, ((1 << smpte->depth) + border) * position); return GST_FLOW_OK; /* ERRORS */ not_negotiated: { GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), ("No input format negotiated")); return GST_FLOW_NOT_NEGOTIATED; } } static GstCaps * gst_smpte_alpha_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * from) { GstCaps *to = gst_caps_copy (from); GstStructure *s; gst_caps_truncate (to); s = gst_caps_get_structure (to, 0); if (gst_structure_has_name (s, "video/x-raw-yuv")) { GValue list = { 0, }; GValue val = { 0, }; gst_structure_remove_field (s, "format"); g_value_init (&list, GST_TYPE_LIST); g_value_init (&val, GST_TYPE_FOURCC); gst_value_set_fourcc (&val, GST_STR_FOURCC ("AYUV")); gst_value_list_append_value (&list, &val); g_value_reset (&val); gst_value_set_fourcc (&val, GST_STR_FOURCC ("I420")); gst_value_list_append_value (&list, &val); g_value_reset (&val); gst_value_set_fourcc (&val, GST_STR_FOURCC ("YV12")); gst_value_list_append_value (&list, &val); g_value_unset (&val); gst_structure_set_value (s, "format", &list); g_value_unset (&list); } else if (!gst_structure_has_name (s, "video/x-raw-rgb")) { gst_caps_unref (to); to = gst_caps_new_empty (); } return to; } static gboolean gst_smpte_alpha_setcaps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (btrans); gboolean ret; gint width, height; smpte->process = NULL; if (!gst_video_format_parse_caps (incaps, &smpte->in_format, &width, &height)) goto invalid_caps; if (!gst_video_format_parse_caps (outcaps, &smpte->out_format, &width, &height)) goto invalid_caps; /* try to update the mask now, this will also adjust the width/height on * success */ GST_OBJECT_LOCK (smpte); ret = gst_smpte_alpha_update_mask (smpte, smpte->type, smpte->invert, smpte->depth, width, height); GST_OBJECT_UNLOCK (smpte); if (!ret) goto mask_failed; switch (smpte->out_format) { case GST_VIDEO_FORMAT_AYUV: switch (smpte->in_format) { case GST_VIDEO_FORMAT_AYUV: smpte->process = gst_smpte_alpha_process_ayuv_ayuv; break; case GST_VIDEO_FORMAT_I420: smpte->process = gst_smpte_alpha_process_i420_ayuv; break; default: break; } break; case GST_VIDEO_FORMAT_ARGB: switch (smpte->in_format) { case GST_VIDEO_FORMAT_ARGB: smpte->process = gst_smpte_alpha_process_argb_argb; break; default: break; } break; case GST_VIDEO_FORMAT_RGBA: switch (smpte->in_format) { case GST_VIDEO_FORMAT_RGBA: smpte->process = gst_smpte_alpha_process_rgba_rgba; break; default: break; } break; case GST_VIDEO_FORMAT_ABGR: switch (smpte->in_format) { case GST_VIDEO_FORMAT_ABGR: smpte->process = gst_smpte_alpha_process_abgr_abgr; break; default: break; } break; case GST_VIDEO_FORMAT_BGRA: switch (smpte->in_format) { case GST_VIDEO_FORMAT_BGRA: smpte->process = gst_smpte_alpha_process_bgra_bgra; break; default: break; } break; default: break; } return ret; /* ERRORS */ invalid_caps: { GST_ERROR_OBJECT (smpte, "Invalid caps: %" GST_PTR_FORMAT, incaps); return FALSE; } mask_failed: { GST_ERROR_OBJECT (smpte, "failed creating the mask"); return FALSE; } } static gboolean gst_smpte_alpha_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size) { gint width, height; GstVideoFormat format; if (!gst_video_format_parse_caps (caps, &format, &width, &height)) return FALSE; *size = gst_video_format_get_size (format, width, height); return TRUE; } static void gst_smpte_alpha_finalize (GstSMPTEAlpha * smpte) { if (smpte->mask) gst_mask_destroy (smpte->mask); smpte->mask = NULL; G_OBJECT_CLASS (parent_class)->finalize ((GObject *) smpte); } static void gst_smpte_alpha_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstSMPTEAlpha *smpte = GST_SMPTE_ALPHA (object); switch (prop_id) { case PROP_TYPE:{ gint type; type = g_value_get_enum (value); GST_BASE_TRANSFORM_LOCK (smpte); GST_OBJECT_LOCK (smpte); gst_smpte_alpha_update_mask (smpte, type, smpte->invert, smpte->depth, smpte->width, smpte->height); GST_OBJECT_UNLOCK (smpte); GST_BASE_TRANSFORM_UNLOCK (smpte); break; } case PROP_BORDER: GST_OBJECT_LOCK (smpte); smpte->border = g_value_get_int (value); GST_OBJECT_UNLOCK (smpte); break; case PROP_DEPTH:{ gint depth; depth = g_value_get_int (value); GST_BASE_TRANSFORM_LOCK (smpte); /* also lock with the object lock so that reading the property doesn't * have to wait for the transform lock */ GST_OBJECT_LOCK (smpte); gst_smpte_alpha_update_mask (smpte, smpte->type, smpte->invert, depth, smpte->width, smpte->height); GST_OBJECT_UNLOCK (smpte); GST_BASE_TRANSFORM_UNLOCK (smpte); break; } case PROP_POSITION: GST_OBJECT_LOCK (smpte); smpte->position = g_value_get_double (value); GST_OBJECT_UNLOCK (smpte); break; case PROP_INVERT:{ gboolean invert; invert = g_value_get_boolean (value); GST_BASE_TRANSFORM_LOCK (smpte); /* also lock with the object lock so that reading the property doesn't * have to wait for the transform lock */ GST_OBJECT_LOCK (smpte); gst_smpte_alpha_update_mask (smpte, smpte->type, invert, smpte->depth, smpte->width, smpte->height); GST_OBJECT_UNLOCK (smpte); GST_BASE_TRANSFORM_UNLOCK (smpte); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_smpte_alpha_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstSMPTEAlpha *smpte; smpte = GST_SMPTE_ALPHA (object); switch (prop_id) { case PROP_TYPE: GST_OBJECT_LOCK (smpte); g_value_set_enum (value, smpte->type); GST_OBJECT_UNLOCK (smpte); break; case PROP_BORDER: GST_OBJECT_LOCK (smpte); g_value_set_int (value, smpte->border); GST_OBJECT_UNLOCK (smpte); break; case PROP_DEPTH: GST_OBJECT_LOCK (smpte); g_value_set_int (value, smpte->depth); GST_OBJECT_UNLOCK (smpte); break; case PROP_POSITION: GST_OBJECT_LOCK (smpte); g_value_set_double (value, smpte->position); GST_OBJECT_UNLOCK (smpte); break; case PROP_INVERT: GST_OBJECT_LOCK (smpte); g_value_set_boolean (value, smpte->invert); GST_OBJECT_UNLOCK (smpte); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_smpte_alpha_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_smpte_alpha_debug, "smptealpha", 0, "SMPTE alpha effect"); /* initialize gst controller library */ gst_controller_init (NULL, NULL); return gst_element_register (plugin, "smptealpha", GST_RANK_NONE, GST_TYPE_SMPTE_ALPHA); } gst-plugins-good-0.10.31/gst/smpte/barboxwipes.c0000644000175000017500000011342511671175354016435 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 "paint.h" #include "gstmask.h" enum { BOX_VERTICAL = 1, BOX_HORIZONTAL = 2, BOX_CLOCK = 3, TRIGANLE_LINEAR = 4 }; static const gint boxes_1b[][7] = { #define WIPE_B1_1 0 {BOX_VERTICAL, 0, 0, 0, 1, 1, 1}, #define WIPE_B1_2 1 {BOX_HORIZONTAL, 0, 0, 0, 1, 1, 1} }; static const gint boxes_2b[][7 * 2] = { #define WIPE_B2_21 0 {BOX_VERTICAL, 0, 0, 1, 1, 2, 0, BOX_VERTICAL, 1, 0, 0, 2, 2, 1}, #define WIPE_B2_22 1 {BOX_HORIZONTAL, 0, 0, 1, 2, 1, 0, BOX_HORIZONTAL, 0, 1, 0, 2, 2, 1}, }; static const gint box_clock_1b[][1 * 10] = { #define WIPE_B1_241 0 {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 1, 1}, #define WIPE_B1_242 1 {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1}, #define WIPE_B1_243 2 {BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B1_244 3 {BOX_CLOCK, 1, 0, 0, 0, 0, 0, 1, 1, 1}, }; #define WIPE_B2_221 0 static const gint box_clock_2b[][2 * 10] = { #define WIPE_B2_221 0 {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, BOX_CLOCK, 1, 0, 0, 1, 2, 1, 0, 0, 2}, #define WIPE_B2_222 1 {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1, BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 0, 2}, #define WIPE_B2_223 2 {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2}, #define WIPE_B2_224 3 {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, BOX_CLOCK, 0, 1, 0, 2, 1, 1, 0, 2, 2}, #define WIPE_B2_225 4 {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1}, #define WIPE_B2_226 5 {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1}, #define WIPE_B2_231 6 {BOX_CLOCK, 1, 0, 0, 1, 2, 0, 2, 0, 1, BOX_CLOCK, 1, 0, 0, 1, 2, 0, 0, 0, 1}, #define WIPE_B2_232 7 {BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 0, 1, BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 2, 1}, #define WIPE_B2_233 8 {BOX_CLOCK, 1, 2, 0, 1, 0, 0, 2, 2, 1, BOX_CLOCK, 1, 2, 0, 1, 0, 0, 0, 2, 1}, #define WIPE_B2_234 9 {BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 0, 1, BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 2, 1}, #define WIPE_B2_251 10 {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 2, 1, BOX_CLOCK, 2, 0, 0, 1, 0, 0, 2, 2, 1}, #define WIPE_B2_252 11 {BOX_CLOCK, 0, 0, 0, 0, 1, 0, 2, 0, 1, BOX_CLOCK, 0, 2, 0, 0, 1, 0, 2, 2, 1}, #define WIPE_B2_253 12 {BOX_CLOCK, 0, 2, 0, 1, 2, 0, 0, 0, 1, BOX_CLOCK, 2, 2, 0, 1, 2, 0, 2, 0, 1}, #define WIPE_B2_254 13 {BOX_CLOCK, 2, 0, 0, 2, 1, 0, 0, 0, 1, BOX_CLOCK, 2, 2, 0, 2, 1, 0, 0, 2, 1}, }; static const gint box_clock_4b[][4 * 10] = { #define WIPE_B4_201 0 {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, BOX_CLOCK, 1, 1, 0, 1, 2, 2, 0, 1, 3, BOX_CLOCK, 1, 1, 0, 0, 1, 3, 1, 0, 4}, #define WIPE_B4_202 1 {BOX_CLOCK, 1, 1, 0, 1, 0, 3, 2, 1, 4, BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, BOX_CLOCK, 1, 1, 0, 0, 1, 2, 1, 0, 3}, #define WIPE_B4_203 2 {BOX_CLOCK, 1, 1, 0, 1, 0, 2, 2, 1, 3, BOX_CLOCK, 1, 1, 0, 2, 1, 3, 1, 2, 4, BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, #define WIPE_B4_204 3 {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, BOX_CLOCK, 1, 1, 0, 2, 1, 2, 1, 2, 3, BOX_CLOCK, 1, 1, 0, 1, 2, 3, 0, 1, 4, BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_205 4 {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, #define WIPE_B4_206 5 {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_207 6 {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_211 7 {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 2, 2}, #define WIPE_B4_212 8 {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, BOX_CLOCK, 1, 1, 0, 1, 0, 1, 0, 1, 2, BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2}, #define WIPE_B4_213 9 {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, BOX_CLOCK, 1, 1, 0, 1, 2, 0, 2, 1, 1, BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1}, #define WIPE_B4_214 10 {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1, BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 2, 1}, #define WIPE_B4_227 11 {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 1, 1, BOX_CLOCK, 1, 0, 0, 1, 1, 1, 0, 0, 2, BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 1, 1, BOX_CLOCK, 1, 2, 0, 1, 1, 1, 0, 2, 2}, #define WIPE_B4_228 12 {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 1, 1, 1, BOX_CLOCK, 0, 1, 0, 1, 1, 1, 0, 2, 2, BOX_CLOCK, 2, 1, 0, 2, 0, 0, 1, 1, 1, BOX_CLOCK, 2, 1, 0, 1, 1, 1, 2, 2, 2}, #define WIPE_B4_235 13 {BOX_CLOCK, 1, 0, 0, 1, 1, 0, 0, 0, 1, BOX_CLOCK, 1, 0, 0, 1, 1, 0, 2, 0, 1, BOX_CLOCK, 1, 2, 0, 1, 1, 0, 2, 2, 1, BOX_CLOCK, 1, 2, 0, 1, 1, 0, 0, 2, 1}, #define WIPE_B4_236 14 {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1, BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 2, 1, BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 0, 1, BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 2, 1}, }; static const gint box_clock_8b[][8 * 10] = { #define WIPE_B8_261 0 {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 4, 1, 1, BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 0, 2, BOX_CLOCK, 2, 1, 0, 2, 0, 2, 0, 1, 3, BOX_CLOCK, 2, 1, 0, 0, 1, 3, 2, 2, 4, BOX_CLOCK, 2, 3, 0, 2, 2, 0, 4, 3, 1, BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 4, 2, BOX_CLOCK, 2, 3, 0, 2, 4, 2, 0, 3, 3, BOX_CLOCK, 2, 3, 0, 0, 3, 3, 2, 2, 4}, #define WIPE_B8_262 1 {BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 0, 1, BOX_CLOCK, 1, 2, 0, 1, 0, 1, 0, 2, 2, BOX_CLOCK, 1, 2, 0, 0, 2, 2, 1, 4, 3, BOX_CLOCK, 1, 2, 0, 1, 4, 3, 2, 2, 4, BOX_CLOCK, 3, 2, 0, 2, 2, 0, 3, 0, 1, BOX_CLOCK, 3, 2, 0, 3, 0, 1, 4, 2, 2, BOX_CLOCK, 3, 2, 0, 4, 2, 2, 3, 4, 3, BOX_CLOCK, 3, 2, 0, 3, 4, 3, 2, 2, 4}, #define WIPE_B8_263 2 {BOX_CLOCK, 2, 1, 0, 2, 0, 0, 4, 1, 1, BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 2, 2, BOX_CLOCK, 2, 1, 0, 2, 0, 0, 0, 1, 1, BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 2, 2, BOX_CLOCK, 2, 3, 0, 2, 4, 0, 4, 3, 1, BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 2, 2, BOX_CLOCK, 2, 3, 0, 2, 4, 0, 0, 3, 1, BOX_CLOCK, 2, 3, 0, 0, 3, 1, 2, 2, 2}, #define WIPE_B8_264 3 {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2, BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 4, 1, BOX_CLOCK, 1, 2, 0, 1, 4, 1, 2, 2, 2, BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 0, 1, BOX_CLOCK, 3, 2, 0, 3, 0, 1, 2, 2, 2, BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 4, 1, BOX_CLOCK, 3, 2, 0, 3, 4, 1, 2, 2, 2}, }; static const gint triangles_2t[][2 * 9] = { /* 3 -> 6 */ #define WIPE_T2_3 0 {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1}, #define WIPE_T2_4 WIPE_T2_3+1 {0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1}, #define WIPE_T2_5 WIPE_T2_4+1 {0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0}, #define WIPE_T2_6 WIPE_T2_5+1 {0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1}, #define WIPE_T2_41 WIPE_T2_6+1 {0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 2}, #define WIPE_T2_42 WIPE_T2_41+1 {0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 2, 1, 1, 1}, #define WIPE_T2_45 WIPE_T2_42+1 {0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1}, #define WIPE_T2_46 WIPE_T2_45+1 {0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}, #define WIPE_T2_245 WIPE_T2_46+1 {0, 0, 0, 2, 0, 0, 2, 2, 1, 2, 2, 0, 0, 2, 0, 0, 0, 1}, #define WIPE_T2_246 WIPE_T2_245+1 {0, 2, 0, 0, 0, 0, 2, 0, 1, 2, 0, 0, 2, 2, 0, 0, 2, 1}, }; static const gint triangles_3t[][3 * 9] = { /* 23 -> 26 */ #define WIPE_T3_23 0 {0, 0, 1, 1, 0, 0, 0, 2, 1, 1, 0, 0, 0, 2, 1, 2, 2, 1, 1, 0, 0, 2, 0, 1, 2, 2, 1}, #define WIPE_T3_24 1 {0, 0, 1, 2, 0, 1, 2, 1, 0, 0, 0, 1, 2, 1, 0, 0, 2, 1, 2, 1, 0, 0, 2, 1, 2, 2, 1}, #define WIPE_T3_25 2 {0, 0, 1, 0, 2, 1, 1, 2, 0, 0, 0, 1, 2, 0, 1, 1, 2, 0, 2, 0, 1, 1, 2, 0, 2, 2, 1}, #define WIPE_T3_26 3 {0, 0, 1, 2, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 2, 2, 1, 0, 1, 0, 0, 2, 1, 2, 2, 1}, }; static const gint triangles_4t[][4 * 9] = { #define WIPE_T4_61 0 {0, 0, 1, 1, 0, 0, 1, 2, 1, 0, 0, 1, 0, 2, 2, 1, 2, 1, 1, 0, 0, 2, 0, 1, 1, 2, 1, 2, 0, 1, 1, 2, 1, 2, 2, 2}, #define WIPE_T4_62 1 {0, 0, 2, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 1, 2, 1, 0, 2, 2, 1, 0, 1, 1, 0, 2, 2, 2, 2, 1}, #define WIPE_T4_63 2 {0, 0, 2, 1, 0, 1, 0, 2, 1, 1, 0, 1, 0, 2, 1, 1, 2, 0, 1, 0, 1, 1, 2, 0, 2, 2, 1, 1, 0, 1, 2, 0, 2, 2, 2, 1}, #define WIPE_T4_64 3 {0, 0, 1, 2, 0, 2, 2, 1, 1, 0, 0, 1, 0, 1, 0, 2, 1, 1, 0, 1, 0, 2, 1, 1, 0, 2, 1, 2, 1, 1, 0, 2, 1, 2, 2, 2}, #define WIPE_T4_65 4 {0, 0, 0, 1, 0, 1, 1, 2, 0, 0, 0, 0, 0, 2, 1, 1, 2, 0, 1, 0, 1, 2, 0, 0, 1, 2, 0, 2, 0, 0, 1, 2, 0, 2, 2, 1}, #define WIPE_T4_66 5 {0, 0, 1, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2, 1, 1, 0, 1, 0, 2, 1, 1, 2, 2, 0, 0, 1, 0, 0, 2, 1, 2, 2, 0}, #define WIPE_T4_67 6 {0, 0, 1, 1, 0, 0, 0, 2, 0, 1, 0, 0, 0, 2, 0, 1, 2, 1, 1, 0, 0, 1, 2, 1, 2, 2, 0, 1, 0, 0, 2, 0, 1, 2, 2, 0}, #define WIPE_T4_68 7 {0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 0, 1, 1, 2, 1, 0, 0, 2, 0, 2, 1, 0, 0, 2, 0, 2, 2, 1}, #define WIPE_T4_101 8 {0, 0, 1, 2, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 1, 2, 2, 1, 2, 0, 1, 1, 1, 0, 2, 2, 1}, }; static const gint triangles_8t[][8 * 9] = { /* 7 */ #define WIPE_T8_7 0 {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 1, 1, 1, 2, 0, 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, 2, 1, 2, 2, 0, 1, 1, 1, 0, 2, 0, 1, 2, 1, 0, 1, 1, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}, #define WIPE_T8_43 1 {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 2, 0, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 0, 2, 2, 1, 1, 1, 1, 0, 2, 1, 1, 2, 0, 0, 1, 2, 1, 1, 1, 0, 2, 1, 0, 0, 1, 0, 1, 2, 1, 1, 1}, #define WIPE_T8_44 2 {0, 0, 1, 1, 0, 2, 1, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 0, 1, 1, 1, 2, 1, 0, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 1, 1, 2, 2, 0, 1, 0, 1, 1, 1, 0, 2, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1}, #define WIPE_T8_47 3 {0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 2, 0, 0, 1, 1, 0, 2, 0, 0, 1, 1, 0, 2, 1, 1, 1, 1, 0, 2, 1, 1, 2, 2, 0, 1, 1, 0, 1, 2, 1, 2, 2, 0, 1, 1, 0, 0, 2, 0, 1, 2, 1, 0, 1, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}, #define WIPE_T8_48 4 {0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 2, 0, 1, 2, 1, 0, 1, 0, 0, 1, 1, 1, 2, 1, 0, 0, 1, 0, 1, 1, 1, 1, 2, 0, 0, 1, 0, 0, 2, 1, 1, 2, 0, 1, 1, 1, 2, 1, 0, 1, 2, 0, 2, 1, 0, 1, 2, 0, 2, 2, 1}, }; static const gint triangles_16t[][16 * 9] = { /* 8 */ #define WIPE_T16_8 0 {0, 0, 1, 2, 0, 1, 1, 1, 0, 2, 0, 1, 1, 1, 0, 2, 2, 1, 1, 1, 0, 0, 2, 1, 2, 2, 1, 0, 0, 1, 1, 1, 0, 0, 2, 1, 2, 0, 1, 4, 0, 1, 3, 1, 0, 4, 0, 1, 3, 1, 0, 4, 2, 1, 3, 1, 0, 2, 2, 1, 4, 2, 1, 2, 0, 1, 3, 1, 0, 2, 2, 1, 0, 2, 1, 2, 2, 1, 1, 3, 0, 2, 2, 1, 1, 3, 0, 2, 4, 1, 1, 3, 0, 0, 4, 1, 2, 4, 1, 0, 2, 1, 1, 3, 0, 0, 4, 1, 2, 2, 1, 4, 2, 1, 3, 3, 0, 4, 2, 1, 3, 3, 0, 4, 4, 1, 3, 3, 0, 2, 4, 1, 4, 4, 1, 2, 2, 1, 3, 3, 0, 2, 4, 1} }; typedef struct _GstWipeConfig GstWipeConfig; struct _GstWipeConfig { const gint *objects; gint nobjects; gint xscale; gint yscale; gint cscale; }; static const GstWipeConfig wipe_config[] = { #define WIPE_CONFIG_1 0 {boxes_1b[WIPE_B1_1], 1, 0, 0, 0}, /* 1 */ #define WIPE_CONFIG_2 WIPE_CONFIG_1+1 {boxes_1b[WIPE_B1_2], 1, 0, 0, 0}, /* 2 */ #define WIPE_CONFIG_3 WIPE_CONFIG_2+1 {triangles_2t[WIPE_T2_3], 2, 0, 0, 0}, /* 3 */ #define WIPE_CONFIG_4 WIPE_CONFIG_3+1 {triangles_2t[WIPE_T2_4], 2, 0, 0, 0}, /* 4 */ #define WIPE_CONFIG_5 WIPE_CONFIG_4+1 {triangles_2t[WIPE_T2_5], 2, 0, 0, 0}, /* 5 */ #define WIPE_CONFIG_6 WIPE_CONFIG_5+1 {triangles_2t[WIPE_T2_6], 2, 0, 0, 0}, /* 6 */ #define WIPE_CONFIG_7 WIPE_CONFIG_6+1 {triangles_8t[WIPE_T8_7], 8, 1, 1, 0}, /* 7 */ #define WIPE_CONFIG_8 WIPE_CONFIG_7+1 {triangles_16t[WIPE_T16_8], 16, 2, 2, 0}, /* 8 */ #define WIPE_CONFIG_21 WIPE_CONFIG_8+1 {boxes_2b[WIPE_B2_21], 2, 1, 1, 0}, /* 21 */ #define WIPE_CONFIG_22 WIPE_CONFIG_21+1 {boxes_2b[WIPE_B2_22], 2, 1, 1, 0}, /* 22 */ #define WIPE_CONFIG_23 WIPE_CONFIG_22+1 {triangles_3t[WIPE_T3_23], 3, 1, 1, 0}, /* 23 */ #define WIPE_CONFIG_24 WIPE_CONFIG_23+1 {triangles_3t[WIPE_T3_24], 3, 1, 1, 0}, /* 24 */ #define WIPE_CONFIG_25 WIPE_CONFIG_24+1 {triangles_3t[WIPE_T3_25], 3, 1, 1, 0}, /* 25 */ #define WIPE_CONFIG_26 WIPE_CONFIG_25+1 {triangles_3t[WIPE_T3_26], 3, 1, 1, 0}, /* 26 */ #define WIPE_CONFIG_41 WIPE_CONFIG_26+1 {triangles_2t[WIPE_T2_41], 2, 0, 0, 1}, /* 41 */ #define WIPE_CONFIG_42 WIPE_CONFIG_41+1 {triangles_2t[WIPE_T2_42], 2, 0, 0, 1}, /* 42 */ #define WIPE_CONFIG_43 WIPE_CONFIG_42+1 {triangles_8t[WIPE_T8_43], 8, 1, 1, 1}, /* 43 */ #define WIPE_CONFIG_44 WIPE_CONFIG_43+1 {triangles_8t[WIPE_T8_44], 8, 1, 1, 1}, /* 44 */ #define WIPE_CONFIG_45 WIPE_CONFIG_44+1 {triangles_2t[WIPE_T2_45], 2, 0, 0, 0}, /* 45 */ #define WIPE_CONFIG_46 WIPE_CONFIG_45+1 {triangles_2t[WIPE_T2_46], 2, 0, 0, 0}, /* 46 */ #define WIPE_CONFIG_47 WIPE_CONFIG_46+1 {triangles_8t[WIPE_T8_47], 8, 1, 1, 0}, /* 47 */ #define WIPE_CONFIG_48 WIPE_CONFIG_47+1 {triangles_8t[WIPE_T8_48], 8, 1, 1, 0}, /* 48 */ #define WIPE_CONFIG_61 WIPE_CONFIG_48+1 {triangles_4t[WIPE_T4_61], 4, 1, 1, 1}, /* 61 */ #define WIPE_CONFIG_62 WIPE_CONFIG_61+1 {triangles_4t[WIPE_T4_62], 4, 1, 1, 1}, /* 62 */ #define WIPE_CONFIG_63 WIPE_CONFIG_62+1 {triangles_4t[WIPE_T4_63], 4, 1, 1, 1}, /* 63 */ #define WIPE_CONFIG_64 WIPE_CONFIG_63+1 {triangles_4t[WIPE_T4_64], 4, 1, 1, 1}, /* 64 */ #define WIPE_CONFIG_65 WIPE_CONFIG_64+1 {triangles_4t[WIPE_T4_65], 4, 1, 1, 0}, /* 65 */ #define WIPE_CONFIG_66 WIPE_CONFIG_65+1 {triangles_4t[WIPE_T4_66], 4, 1, 1, 0}, /* 66 */ #define WIPE_CONFIG_67 WIPE_CONFIG_66+1 {triangles_4t[WIPE_T4_67], 4, 1, 1, 0}, /* 67 */ #define WIPE_CONFIG_68 WIPE_CONFIG_67+1 {triangles_4t[WIPE_T4_68], 4, 1, 1, 0}, /* 68 */ #define WIPE_CONFIG_101 WIPE_CONFIG_68+1 {triangles_4t[WIPE_T4_101], 4, 1, 1, 0}, /* 101 */ #define WIPE_CONFIG_201 WIPE_CONFIG_101+1 {box_clock_4b[WIPE_B4_201], 4, 1, 1, 2}, /* 201 */ #define WIPE_CONFIG_202 WIPE_CONFIG_201+1 {box_clock_4b[WIPE_B4_202], 4, 1, 1, 2}, /* 202 */ #define WIPE_CONFIG_203 WIPE_CONFIG_202+1 {box_clock_4b[WIPE_B4_203], 4, 1, 1, 2}, /* 203 */ #define WIPE_CONFIG_204 WIPE_CONFIG_203+1 {box_clock_4b[WIPE_B4_204], 4, 1, 1, 2}, /* 204 */ #define WIPE_CONFIG_205 WIPE_CONFIG_204+1 {box_clock_4b[WIPE_B4_205], 4, 1, 1, 1}, /* 205 */ #define WIPE_CONFIG_206 WIPE_CONFIG_205+1 {box_clock_4b[WIPE_B4_206], 4, 1, 1, 1}, /* 206 */ #define WIPE_CONFIG_207 WIPE_CONFIG_206+1 {box_clock_4b[WIPE_B4_207], 4, 1, 1, 0}, /* 207 */ #define WIPE_CONFIG_211 WIPE_CONFIG_207+1 {box_clock_4b[WIPE_B4_211], 4, 1, 1, 1}, /* 211 */ #define WIPE_CONFIG_212 WIPE_CONFIG_211+1 {box_clock_4b[WIPE_B4_212], 4, 1, 1, 1}, /* 212 */ #define WIPE_CONFIG_213 WIPE_CONFIG_212+1 {box_clock_4b[WIPE_B4_213], 4, 1, 1, 0}, /* 213 */ #define WIPE_CONFIG_214 WIPE_CONFIG_213+1 {box_clock_4b[WIPE_B4_214], 4, 1, 1, 0}, /* 214 */ #define WIPE_CONFIG_221 WIPE_CONFIG_214+1 {box_clock_2b[WIPE_B2_221], 2, 1, 1, 1}, /* 221 */ #define WIPE_CONFIG_222 WIPE_CONFIG_221+1 {box_clock_2b[WIPE_B2_222], 2, 1, 1, 1}, /* 222 */ #define WIPE_CONFIG_223 WIPE_CONFIG_222+1 {box_clock_2b[WIPE_B2_223], 2, 1, 1, 1}, /* 223 */ #define WIPE_CONFIG_224 WIPE_CONFIG_223+1 {box_clock_2b[WIPE_B2_224], 2, 1, 1, 1}, /* 224 */ #define WIPE_CONFIG_225 WIPE_CONFIG_224+1 {box_clock_2b[WIPE_B2_225], 2, 1, 1, 0}, /* 225 */ #define WIPE_CONFIG_226 WIPE_CONFIG_225+1 {box_clock_2b[WIPE_B2_226], 2, 1, 1, 0}, /* 226 */ #define WIPE_CONFIG_227 WIPE_CONFIG_226+1 {box_clock_4b[WIPE_B4_227], 4, 1, 1, 1}, /* 227 */ #define WIPE_CONFIG_228 WIPE_CONFIG_227+1 {box_clock_4b[WIPE_B4_228], 4, 1, 1, 1}, /* 228 */ #define WIPE_CONFIG_231 WIPE_CONFIG_228+1 {box_clock_2b[WIPE_B2_231], 2, 1, 1, 0}, /* 231 */ #define WIPE_CONFIG_232 WIPE_CONFIG_231+1 {box_clock_2b[WIPE_B2_232], 2, 1, 1, 0}, /* 232 */ #define WIPE_CONFIG_233 WIPE_CONFIG_232+1 {box_clock_2b[WIPE_B2_233], 2, 1, 1, 0}, /* 233 */ #define WIPE_CONFIG_234 WIPE_CONFIG_233+1 {box_clock_2b[WIPE_B2_234], 2, 1, 1, 0}, /* 234 */ #define WIPE_CONFIG_235 WIPE_CONFIG_234+1 {box_clock_4b[WIPE_B4_235], 4, 1, 1, 0}, /* 235 */ #define WIPE_CONFIG_236 WIPE_CONFIG_235+1 {box_clock_4b[WIPE_B4_236], 4, 1, 1, 0}, /* 236 */ #define WIPE_CONFIG_241 WIPE_CONFIG_236+1 {box_clock_1b[WIPE_B1_241], 1, 0, 0, 0}, /* 241 */ #define WIPE_CONFIG_242 WIPE_CONFIG_241+1 {box_clock_1b[WIPE_B1_242], 1, 0, 0, 0}, /* 242 */ #define WIPE_CONFIG_243 WIPE_CONFIG_242+1 {box_clock_1b[WIPE_B1_243], 1, 0, 0, 0}, /* 243 */ #define WIPE_CONFIG_244 WIPE_CONFIG_243+1 {box_clock_1b[WIPE_B1_244], 1, 0, 0, 0}, /* 244 */ #define WIPE_CONFIG_245 WIPE_CONFIG_244+1 {triangles_2t[WIPE_T2_245], 2, 1, 1, 0}, /* 245 */ #define WIPE_CONFIG_246 WIPE_CONFIG_245+1 {triangles_2t[WIPE_T2_246], 2, 1, 1, 0}, /* 246 */ #define WIPE_CONFIG_251 WIPE_CONFIG_246+1 {box_clock_2b[WIPE_B2_251], 2, 1, 1, 0}, /* 251 */ #define WIPE_CONFIG_252 WIPE_CONFIG_251+1 {box_clock_2b[WIPE_B2_252], 2, 1, 1, 0}, /* 252 */ #define WIPE_CONFIG_253 WIPE_CONFIG_252+1 {box_clock_2b[WIPE_B2_253], 2, 1, 1, 0}, /* 253 */ #define WIPE_CONFIG_254 WIPE_CONFIG_253+1 {box_clock_2b[WIPE_B2_254], 2, 1, 1, 0}, /* 254 */ #define WIPE_CONFIG_261 WIPE_CONFIG_254+1 {box_clock_8b[WIPE_B8_261], 8, 2, 2, 2}, /* 261 */ #define WIPE_CONFIG_262 WIPE_CONFIG_261+1 {box_clock_8b[WIPE_B8_262], 8, 2, 2, 2}, /* 262 */ #define WIPE_CONFIG_263 WIPE_CONFIG_262+1 {box_clock_8b[WIPE_B8_263], 8, 2, 2, 1}, /* 263 */ #define WIPE_CONFIG_264 WIPE_CONFIG_263+1 {box_clock_8b[WIPE_B8_264], 8, 2, 2, 1}, /* 264 */ }; static void gst_wipe_boxes_draw (GstMask * mask) { const GstWipeConfig *config = mask->user_data; const gint *impacts = config->objects; gint width = (mask->width >> config->xscale); gint height = (mask->height >> config->yscale); gint depth = (1 << mask->bpp) >> config->cscale; gint i; for (i = 0; i < config->nobjects; i++) { switch (impacts[0]) { case BOX_VERTICAL: /* vbox does not draw last pixels */ gst_smpte_paint_vbox (mask->data, mask->width, impacts[1] * width, impacts[2] * height, impacts[3] * depth, impacts[4] * width, impacts[5] * height, impacts[6] * depth); impacts += 7; break; case BOX_HORIZONTAL: /* hbox does not draw last pixels */ gst_smpte_paint_hbox (mask->data, mask->width, impacts[1] * width, impacts[2] * height, impacts[3] * depth, impacts[4] * width, impacts[5] * height, impacts[6] * depth); impacts += 7; break; case BOX_CLOCK: { gint x0, y0, x1, y1, x2, y2; /* make sure not to draw outside the area */ x0 = MIN (impacts[1] * width, mask->width - 1); y0 = MIN (impacts[2] * height, mask->height - 1); x1 = MIN (impacts[4] * width, mask->width - 1); y1 = MIN (impacts[5] * height, mask->height - 1); x2 = MIN (impacts[7] * width, mask->width - 1); y2 = MIN (impacts[8] * height, mask->height - 1); gst_smpte_paint_box_clock (mask->data, mask->width, x0, y0, impacts[3] * depth, x1, y1, impacts[6] * depth, x2, y2, impacts[9] * depth); impacts += 10; } default: break; } } } static void gst_wipe_triangles_clock_draw (GstMask * mask) { const GstWipeConfig *config = mask->user_data; const gint *impacts = config->objects; gint width = (mask->width >> config->xscale); gint height = (mask->height >> config->yscale); gint depth = (1 << mask->bpp) >> config->cscale; gint i; for (i = 0; i < config->nobjects; i++) { gint x0, y0, x1, y1, x2, y2; /* make sure not to draw outside the area */ x0 = MIN (impacts[0] * width, mask->width - 1); y0 = MIN (impacts[1] * height, mask->height - 1); x1 = MIN (impacts[3] * width, mask->width - 1); y1 = MIN (impacts[4] * height, mask->height - 1); x2 = MIN (impacts[6] * width, mask->width - 1); y2 = MIN (impacts[7] * height, mask->height - 1); gst_smpte_paint_triangle_clock (mask->data, mask->width, x0, y0, impacts[2] * depth, x1, y1, impacts[5] * depth, x2, y2, impacts[8] * depth); impacts += 9; } } static void gst_wipe_triangles_draw (GstMask * mask) { const GstWipeConfig *config = mask->user_data; const gint *impacts = config->objects; gint width = (mask->width >> config->xscale); gint height = (mask->height >> config->yscale); gint depth = (1 << mask->bpp) >> config->cscale; gint i; for (i = 0; i < config->nobjects; i++) { gint x0, y0, x1, y1, x2, y2; /* make sure not to draw outside the area */ x0 = MIN (impacts[0] * width, mask->width - 1); y0 = MIN (impacts[1] * height, mask->height - 1); x1 = MIN (impacts[3] * width, mask->width - 1); y1 = MIN (impacts[4] * height, mask->height - 1); x2 = MIN (impacts[6] * width, mask->width - 1); y2 = MIN (impacts[7] * height, mask->height - 1); gst_smpte_paint_triangle_linear (mask->data, mask->width, x0, y0, impacts[2] * depth, x1, y1, impacts[5] * depth, x2, y2, impacts[8] * depth); impacts += 9; } } /* see also: * http://www.w3c.rl.ac.uk/pasttalks/slidemaker/XML_Multimedia/htmls/transitions.html */ static const GstMaskDefinition definitions[] = { {1, "bar-wipe-lr", "A bar moves from left to right", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_1]}, {2, "bar-wipe-tb", "A bar moves from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_2]}, {3, "box-wipe-tl", "A box expands from the upper-left corner to the lower-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_3]}, {4, "box-wipe-tr", "A box expands from the upper-right corner to the lower-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_4]}, {5, "box-wipe-br", "A box expands from the lower-right corner to the upper-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_5]}, {6, "box-wipe-bl", "A box expands from the lower-left corner to the upper-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_6]}, {7, "four-box-wipe-ci", "A box shape expands from each of the four corners toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_7]}, {8, "four-box-wipe-co", "A box shape expands from the center of each quadrant toward the corners of each quadrant", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_8]}, {21, "barndoor-v", "A central, vertical line splits and expands toward the left and right edges", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_21]}, {22, "barndoor-h", "A central, horizontal line splits and expands toward the top and bottom edges", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_22]}, {23, "box-wipe-tc", "A box expands from the top edge's midpoint to the bottom corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_23]}, {24, "box-wipe-rc", "A box expands from the right edge's midpoint to the left corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_24]}, {25, "box-wipe-bc", "A box expands from the bottom edge's midpoint to the top corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_25]}, {26, "box-wipe-lc", "A box expands from the left edge's midpoint to the right corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_26]}, {41, "diagonal-tl", "A diagonal line moves from the upper-left corner to the lower-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_41]}, {42, "diagonal-tr", "A diagonal line moves from the upper right corner to the lower-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_42]}, {43, "bowtie-v", "Two wedge shapes slide in from the top and bottom edges toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_43]}, {44, "bowtie-h", "Two wedge shapes slide in from the left and right edges toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_44]}, {45, "barndoor-dbl", "A diagonal line from the lower-left to upper-right corners splits and expands toward the opposite corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_45]}, {46, "barndoor-dtl", "A diagonal line from upper-left to lower-right corners splits and expands toward the opposite corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_46]}, {47, "misc-diagonal-dbd", "Four wedge shapes split from the center and retract toward the four edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_47]}, {48, "misc-diagonal-dd", "A diamond connecting the four edge midpoints simultaneously contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_48]}, {61, "vee-d", "A wedge shape moves from top to bottom", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_61]}, {62, "vee-l", "A wedge shape moves from right to left", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_62]}, {63, "vee-u", "A wedge shape moves from bottom to top", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_63]}, {64, "vee-r", "A wedge shape moves from left to right", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_64]}, {65, "barnvee-d", "A 'V' shape extending from the bottom edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_65]}, {66, "barnvee-l", "A 'V' shape extending from the left edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_66]}, {67, "barnvee-u", "A 'V' shape extending from the top edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_67]}, {68, "barnvee-r", "A 'V' shape extending from the right edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_68]}, {101, "iris-rect", "A rectangle expands from the center.", gst_wipe_triangles_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_101]}, {201, "clock-cw12", "A radial hand sweeps clockwise from the twelve o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_201]}, {202, "clock-cw3", "A radial hand sweeps clockwise from the three o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_202]}, {203, "clock-cw6", "A radial hand sweeps clockwise from the six o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_203]}, {204, "clock-cw9", "A radial hand sweeps clockwise from the nine o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_204]}, {205, "pinwheel-tbv", "Two radial hands sweep clockwise from the twelve and six o'clock positions", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_205]}, {206, "pinwheel-tbh", "Two radial hands sweep clockwise from the nine and three o'clock positions", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_206]}, {207, "pinwheel-fb", "Four radial hands sweep clockwise", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_207]}, {211, "fan-ct", "A fan unfolds from the top edge, the fan axis at the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_211]}, {212, "fan-cr", "A fan unfolds from the right edge, the fan axis at the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_212]}, {213, "doublefan-fov", "Two fans, their axes at the center, unfold from the top and bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_213]}, {214, "doublefan-foh", "Two fans, their axes at the center, unfold from the left and right", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_214]}, {221, "singlesweep-cwt", "A radial hand sweeps clockwise from the top edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_221]}, {222, "singlesweep-cwr", "A radial hand sweeps clockwise from the right edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_222]}, {223, "singlesweep-cwb", "A radial hand sweeps clockwise from the bottom edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_223]}, {224, "singlesweep-cwl", "A radial hand sweeps clockwise from the left edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_224]}, {225, "doublesweep-pv", "Two radial hands sweep clockwise and counter-clockwise from the top and bottom edges' midpoints", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_225]}, {226, "doublesweep-pd", "Two radial hands sweep clockwise and counter-clockwise from the left and right edges' midpoints", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_226]}, {227, "doublesweep-ov", "Two radial hands attached at the top and bottom edges' midpoints sweep from right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_227]}, {228, "doublesweep-oh", "Two radial hands attached at the left and right edges' midpoints sweep from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_228]}, {231, "fan-t", "A fan unfolds from the bottom, the fan axis at the top edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_231]}, {232, "fan-r", "A fan unfolds from the left, the fan axis at the right edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_232]}, {233, "fan-b", "A fan unfolds from the top, the fan axis at the bottom edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_233]}, {234, "fan-l", "A fan unfolds from the right, the fan axis at the left edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_234]}, {235, "doublefan-fiv", "Two fans, their axes at the top and bottom, unfold from the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_235]}, {236, "doublefan-fih", "Two fans, their axes at the left and right, unfold from the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_236]}, {241, "singlesweep-cwtl", "A radial hand sweeps clockwise from the upper-left corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_241]}, {242, "singlesweep-cwbl", "A radial hand sweeps counter-clockwise from the lower-left corner.", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_242]}, {243, "singlesweep-cwbr", "A radial hand sweeps clockwise from the lower-right corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_243]}, {244, "singlesweep-cwtr", "A radial hand sweeps counter-clockwise from the upper-right corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_244]}, {245, "doublesweep-pdtl", "Two radial hands attached at the upper-left and lower-right corners sweep down and up", gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_245]}, {246, "doublesweep-pdbl", "Two radial hands attached at the lower-left and upper-right corners sweep down and up", gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_246]}, {251, "saloondoor-t", "Two radial hands attached at the upper-left and upper-right corners sweep down", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_251]}, {252, "saloondoor-l", "Two radial hands attached at the upper-left and lower-left corners sweep to the right", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_252]}, {253, "saloondoor-b", "Two radial hands attached at the lower-left and lower-right corners sweep up", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_253]}, {254, "saloondoor-r", "Two radial hands attached at the upper-right and lower-right corners sweep to the left", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_254]}, {261, "windshield-r", "Two radial hands attached at the midpoints of the top and bottom halves sweep from right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_261]}, {262, "windshield-u", "Two radial hands attached at the midpoints of the left and right halves sweep from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_262]}, {263, "windshield-v", "Two sets of radial hands attached at the midpoints of the top and bottom halves sweep from top to bottom and bottom to top", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_263]}, {264, "windshield-h", "Two sets of radial hands attached at the midpoints of the left and right halves sweep from left to right and right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, &wipe_config[WIPE_CONFIG_264]}, {0, NULL, NULL, NULL} }; void _gst_barboxwipes_register (void) { gint i = 0; while (definitions[i].short_name) { _gst_mask_register (&definitions[i]); i++; } } gst-plugins-good-0.10.31/gst/smpte/gstsmptealpha.h0000644000175000017500000000444711671175354016774 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SMPTE_ALPHA_H__ #define __GST_SMPTE_ALPHA_H__ #include #include #include G_BEGIN_DECLS #include "gstmask.h" #define GST_TYPE_SMPTE_ALPHA \ (gst_smpte_alpha_get_type()) #define GST_SMPTE_ALPHA(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMPTE_ALPHA,GstSMPTEAlpha)) #define GST_SMPTE_ALPHA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMPTE_ALPHA,GstSMPTEAlphaClass)) #define GST_IS_SMPTE_ALPHA(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMPTE_ALPHA)) #define GST_IS_SMPTE_ALPHA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMPTE_ALPHA)) typedef struct _GstSMPTEAlpha GstSMPTEAlpha; typedef struct _GstSMPTEAlphaClass GstSMPTEAlphaClass; struct _GstSMPTEAlpha { GstVideoFilter element; /* properties */ gint type; gint border; gint depth; gdouble position; gboolean invert; /* negotiated format */ GstVideoFormat in_format, out_format; gint width; gint height; /* state of the effect */ GstMask *mask; /* processing function */ void (*process) (GstSMPTEAlpha * smpte, const guint8 * in, guint8 * out, GstMask * mask, gint width, gint height, gint border, gint pos); }; struct _GstSMPTEAlphaClass { GstVideoFilterClass parent_class; }; GType gst_smpte_alpha_get_type (void); gboolean gst_smpte_alpha_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_SMPTE_ALPHA_H__ */ gst-plugins-good-0.10.31/gst/smpte/gstsmpte.h0000644000175000017500000000424211671175354015757 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SMPTE_H__ #define __GST_SMPTE_H__ #include #include G_BEGIN_DECLS #include "gstmask.h" #define GST_TYPE_SMPTE \ (gst_smpte_get_type()) #define GST_SMPTE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SMPTE,GstSMPTE)) #define GST_SMPTE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SMPTE,GstSMPTEClass)) #define GST_IS_SMPTE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SMPTE)) #define GST_IS_SMPTE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMPTE)) typedef struct _GstSMPTE GstSMPTE; typedef struct _GstSMPTEClass GstSMPTEClass; struct _GstSMPTE { GstElement element; /* pads */ GstPad *srcpad, *sinkpad1, *sinkpad2; GstCollectPads *collect; /* properties */ gint type; gint border; gint depth; guint64 duration; gboolean invert; /* negotiated format */ gint format; gint width; gint height; gdouble fps; gint fps_num; gint fps_denom; /* state of the effect */ gint position; gint end_position; GstMask *mask; }; struct _GstSMPTEClass { GstElementClass parent_class; }; gboolean gst_smpte_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_SMPTE_H__ */ gst-plugins-good-0.10.31/gst/smpte/Makefile.am0000644000175000017500000000200411671175354015766 00000000000000plugin_LTLIBRARIES = libgstsmpte.la libgstsmpte_la_SOURCES = gstsmpte.c gstmask.c barboxwipes.c paint.c gstsmptealpha.c plugin.c noinst_HEADERS = gstsmpte.h gstmask.h paint.h gstsmptealpha.h libgstsmpte_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) libgstsmpte_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(LIBM) \ -lgstvideo-$(GST_MAJORMINOR) \ $(GST_CONTROLLER_LIBS) libgstsmpte_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsmpte_la_LIBTOOLFLAGS = --tag=disable-static Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstsmpte -:SHARED libgstsmpte \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstsmpte_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsmpte_la_CFLAGS) \ -:LDFLAGS $(libgstsmpte_la_LDFLAGS) \ $(libgstsmpte_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/smpte/paint.c0000644000175000017500000002305111671175354015216 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #include #include "paint.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif void gst_smpte_paint_vbox (guint32 * dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) { gint i, j; gint width, height; width = x1 - x0; height = y1 - y0; g_assert (width > 0); g_assert (height > 0); dest = dest + y0 * stride + x0; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[j] = (c1 * j + c0 * (width - j)) / width; } dest += stride; } } void gst_smpte_paint_hbox (guint32 * dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) { gint i, j; gint width, height; width = x1 - x0; height = y1 - y0; g_assert (width > 0); g_assert (height > 0); dest = dest + y0 * stride + x0; for (i = 0; i < height; i++) { guint32 value = (c1 * i + c0 * (height - i)) / height; for (j = 0; j < width; j++) { dest[j] = value; } dest += stride; } } #define STEP_3D_LINE(dxabs,dyabs,dzabs,sdx,sdy,sdz,xr,yr,zr,px,py,pz) \ G_STMT_START { \ if (dxabs >= dyabs && dxabs >= dzabs) { \ yr += dyabs; \ zr += dzabs; \ if (yr >= dxabs) { \ py += sdy; \ yr -= dxabs; \ } \ if (zr >= dzabs) { \ pz += sdz; \ zr -= dxabs; \ } \ px += sdx; \ } else if (dyabs >= dxabs && dyabs >= dzabs) { \ xr += dxabs; \ zr += dzabs; \ if (xr >= dyabs) { \ px += sdx; \ xr -= dyabs; \ } \ if (zr >= dzabs) { \ pz += sdz; \ zr -= dyabs; \ } \ py += sdy; \ } else { \ yr += dyabs; \ xr += dxabs; \ if (yr >= dyabs) { \ py += sdy; \ yr -= dzabs; \ } \ if (xr >= dyabs) { \ px += sdx; \ xr -= dzabs; \ } \ pz += sdz; \ } \ } G_STMT_END #define SWAP_INT(a,b) \ G_STMT_START { \ gint tmp; \ tmp = (a); \ (a) = (b); \ (b) = (tmp); \ } G_STMT_END #define SIGN(a) ((a) < 0 ? -1 : 1) #define PREPARE_3D_LINE(x0,y0,z0,x1,y1,z1,dxabs,dyabs,dzabs,sdx,sdy,sdz,xr,yr,zr,px,py,pz)\ G_STMT_START { \ gint dx, dy, dz; \ dx = x1 - x0; \ dy = y1 - y0; \ dz = z1 - z0; \ dxabs = abs (dx); \ dyabs = abs (dy); \ dzabs = abs (dz); \ sdx = SIGN (dx); \ sdy = SIGN (dy); \ sdz = SIGN (dz); \ xr = dxabs >> 1; \ yr = dyabs >> 1; \ zr = dzabs >> 1; \ px = x0; \ py = y0; \ pz = z0; \ } G_STMT_END void gst_smpte_paint_triangle_linear (guint32 * dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gint sdxl, sdyl, sdcl, dxlabs, dylabs, dclabs, xrl, yrl, crl, pxl, pyl, pcl; gint sdxr, sdyr, sdcr, dxrabs, dyrabs, dcrabs, xrr, yrr, crr, pxr, pyr, pcr; gint i, j, k, seg_start, seg_end; if (y0 > y1) { SWAP_INT (x0, x1); SWAP_INT (y0, y1); SWAP_INT (c0, c1); } if (y0 > y2) { SWAP_INT (x0, x2); SWAP_INT (y0, y2); SWAP_INT (c0, c2); } if (y1 > y2) { SWAP_INT (x1, x2); SWAP_INT (y1, y2); SWAP_INT (c1, c2); } PREPARE_3D_LINE (x0, y0, c0, x2, y2, c2, dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, xrl, yrl, crl, pxl, pyl, pcl); PREPARE_3D_LINE (x0, y0, c0, x1, y1, c1, dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); dest = dest + stride * y0; seg_start = y0; seg_end = y1; /* do two passes */ for (k = 0; k < 2; k++) { for (i = seg_start; i < seg_end; i++) { gint s = pxl, e = pxr, sc = pcl, ec = pcr; gint sign = SIGN (e - s); e += sign; for (j = s; j != e; j += sign) { dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); } while (pyr == i) { STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); } while (pyl == i) { STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, xrl, yrl, crl, pxl, pyl, pcl); } dest += stride; } PREPARE_3D_LINE (x1, y1, c1, x2, y2, c2, dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); seg_start = y1; seg_end = y2; } } static void draw_bresenham_line (guint32 * dest, gint stride, gint x0, gint y0, gint x1, gint y1, guint32 col) { gint dx, dy; gint x_incr, y_incr; gint i, dpr, dpru, P, indep; dx = abs (x1 - x0); dy = abs (y1 - y0); dest = dest + y0 * stride + x0; x_incr = SIGN (x1 - x0); y_incr = SIGN (y1 - y0) * stride; if (dx >= dy) { dpr = dy << 1; i = dx; indep = x_incr; } else { dpr = dx << 1; i = dy; indep = y_incr; } dpru = dpr - (i << 1); P = dpr - i; for (; i >= 0; i--) { *dest = col; if (P > 0) { dest += x_incr; dest += y_incr; P += dpru; } else { dest += indep; P += dpr; } } } void gst_smpte_paint_triangle_clock (guint32 * dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gint i; gint sign; gfloat angle, angle_e; gfloat len1; angle_e = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0)) / (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * sqrt ((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0)))); len1 = sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); if (x1 == x2) { sign = SIGN (y2 - y1); for (i = y1; i != (y2 + sign); i += sign) { if (y1 == i) angle = 0; else angle = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (i - y0)) / (len1 * sqrt ((x1 - x0) * (x1 - x0) + (i - y0) * (i - y0)))) / angle_e; draw_bresenham_line (dest, stride, x0, y0, x1, i, (c2 * angle + c1 * (1.0 - angle))); } } else if (y1 == y2) { sign = SIGN (x2 - x1); for (i = x1; i != (x2 + sign); i += sign) { if (x1 == i) angle = 0; else angle = acos (((x1 - x0) * (i - x0) + (y1 - y0) * (y2 - y0)) / (len1 * sqrt ((i - x0) * (i - x0) + (y2 - y0) * (y2 - y0)))) / angle_e; draw_bresenham_line (dest, stride, x0, y0, i, y1, (c2 * angle + c1 * (1.0 - angle))); } } else { g_warning ("paint triangle clock: not supported"); return; } } void gst_smpte_paint_box_clock (guint32 * dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gfloat angle_m, col_m; gint xv, yv; if (x1 == x0) { xv = x2; yv = y1; } else if (y1 == y0) { xv = x1; yv = y2; } else { g_warning ("paint box clock: not supported"); return; } angle_m = 2 * acos (((x1 - x0) * (xv - x0) + (y1 - y0) * (yv - y0)) / (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * sqrt ((xv - x0) * (xv - x0) + (yv - y0) * (yv - y0)))) / M_PI; col_m = c2 * angle_m + c1 * (1.0 - angle_m); gst_smpte_paint_triangle_clock (dest, stride, x0, y0, c0, x1, y1, c1, xv, yv, col_m); gst_smpte_paint_triangle_clock (dest, stride, x0, y0, c0, xv, yv, col_m, x2, y2, c2); } gst-plugins-good-0.10.31/gst/smpte/plugin.c0000644000175000017500000000244711671175354015407 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 "gstsmpte.h" #include "gstsmptealpha.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_smpte_plugin_init (plugin)) return FALSE; if (!gst_smpte_alpha_plugin_init (plugin)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "smpte", "Apply the standard SMPTE transitions on video images", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/smpte/gstmask.h0000644000175000017500000000421611671175354015563 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_MASK_H__ #define __GST_MASK_H__ #include typedef struct _GstMask GstMask; typedef struct _GstMaskDefinition GstMaskDefinition; typedef void (*GstMaskDrawFunc) (GstMask *mask); typedef void (*GstMaskDestroyFunc) (GstMask *mask); struct _GstMaskDefinition { gint type; const gchar *short_name; const gchar *long_name; GstMaskDrawFunc draw_func; GstMaskDestroyFunc destroy_func; gconstpointer user_data; }; struct _GstMask { gint type; guint32 *data; gconstpointer user_data; gint width; gint height; gint bpp; GstMaskDestroyFunc destroy_func; }; void _gst_mask_init (void); void _gst_mask_register (const GstMaskDefinition *definition); void _gst_mask_default_destroy (GstMask *mask); const GList* gst_mask_get_definitions (void); GstMask* gst_mask_factory_new (gint type, gboolean invert, gint bpp, gint width, gint height); void gst_mask_destroy (GstMask *mask); void _gst_barboxwipes_register (void); #endif /* __GST_MASK_H__ */ gst-plugins-good-0.10.31/gst/smpte/paint.h0000644000175000017500000000420511671175354015223 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_SMPTE_PAINT_H__ #define __GST_SMPTE_PAINT_H__ #include void gst_smpte_paint_vbox (guint32 *dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1); void gst_smpte_paint_hbox (guint32 *dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1); void gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); void gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); void gst_smpte_paint_box_clock (guint32 *dest, gint stride, gint x0, gint y0, gint c0, gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); #endif /* __GST_SMPTE_PAINT_H__ */ gst-plugins-good-0.10.31/gst/smpte/Makefile.in0000644000175000017500000010254111720560235015775 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/smpte DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstsmpte_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstsmpte_la_OBJECTS = libgstsmpte_la-gstsmpte.lo \ libgstsmpte_la-gstmask.lo libgstsmpte_la-barboxwipes.lo \ libgstsmpte_la-paint.lo libgstsmpte_la-gstsmptealpha.lo \ libgstsmpte_la-plugin.lo libgstsmpte_la_OBJECTS = $(am_libgstsmpte_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstsmpte_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstsmpte_la_CFLAGS) $(CFLAGS) \ $(libgstsmpte_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstsmpte_la_SOURCES) DIST_SOURCES = $(libgstsmpte_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstsmpte.la libgstsmpte_la_SOURCES = gstsmpte.c gstmask.c barboxwipes.c paint.c gstsmptealpha.c plugin.c noinst_HEADERS = gstsmpte.h gstmask.h paint.h gstsmptealpha.h libgstsmpte_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) libgstsmpte_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(LIBM) \ -lgstvideo-$(GST_MAJORMINOR) \ $(GST_CONTROLLER_LIBS) libgstsmpte_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsmpte_la_LIBTOOLFLAGS = --tag=disable-static all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/smpte/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/smpte/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstsmpte.la: $(libgstsmpte_la_OBJECTS) $(libgstsmpte_la_DEPENDENCIES) $(EXTRA_libgstsmpte_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstsmpte_la_LINK) -rpath $(plugindir) $(libgstsmpte_la_OBJECTS) $(libgstsmpte_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-barboxwipes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-gstmask.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-gstsmpte.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-gstsmptealpha.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-paint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmpte_la-plugin.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstsmpte_la-gstsmpte.lo: gstsmpte.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-gstsmpte.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-gstsmpte.Tpo -c -o libgstsmpte_la-gstsmpte.lo `test -f 'gstsmpte.c' || echo '$(srcdir)/'`gstsmpte.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-gstsmpte.Tpo $(DEPDIR)/libgstsmpte_la-gstsmpte.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmpte.c' object='libgstsmpte_la-gstsmpte.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-gstsmpte.lo `test -f 'gstsmpte.c' || echo '$(srcdir)/'`gstsmpte.c libgstsmpte_la-gstmask.lo: gstmask.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-gstmask.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-gstmask.Tpo -c -o libgstsmpte_la-gstmask.lo `test -f 'gstmask.c' || echo '$(srcdir)/'`gstmask.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-gstmask.Tpo $(DEPDIR)/libgstsmpte_la-gstmask.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstmask.c' object='libgstsmpte_la-gstmask.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-gstmask.lo `test -f 'gstmask.c' || echo '$(srcdir)/'`gstmask.c libgstsmpte_la-barboxwipes.lo: barboxwipes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-barboxwipes.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-barboxwipes.Tpo -c -o libgstsmpte_la-barboxwipes.lo `test -f 'barboxwipes.c' || echo '$(srcdir)/'`barboxwipes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-barboxwipes.Tpo $(DEPDIR)/libgstsmpte_la-barboxwipes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='barboxwipes.c' object='libgstsmpte_la-barboxwipes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-barboxwipes.lo `test -f 'barboxwipes.c' || echo '$(srcdir)/'`barboxwipes.c libgstsmpte_la-paint.lo: paint.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-paint.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-paint.Tpo -c -o libgstsmpte_la-paint.lo `test -f 'paint.c' || echo '$(srcdir)/'`paint.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-paint.Tpo $(DEPDIR)/libgstsmpte_la-paint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint.c' object='libgstsmpte_la-paint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-paint.lo `test -f 'paint.c' || echo '$(srcdir)/'`paint.c libgstsmpte_la-gstsmptealpha.lo: gstsmptealpha.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-gstsmptealpha.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-gstsmptealpha.Tpo -c -o libgstsmpte_la-gstsmptealpha.lo `test -f 'gstsmptealpha.c' || echo '$(srcdir)/'`gstsmptealpha.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-gstsmptealpha.Tpo $(DEPDIR)/libgstsmpte_la-gstsmptealpha.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstsmptealpha.c' object='libgstsmpte_la-gstsmptealpha.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-gstsmptealpha.lo `test -f 'gstsmptealpha.c' || echo '$(srcdir)/'`gstsmptealpha.c libgstsmpte_la-plugin.lo: plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -MT libgstsmpte_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstsmpte_la-plugin.Tpo -c -o libgstsmpte_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmpte_la-plugin.Tpo $(DEPDIR)/libgstsmpte_la-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstsmpte_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmpte_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmpte_la_CFLAGS) $(CFLAGS) -c -o libgstsmpte_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstsmpte -:SHARED libgstsmpte \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstsmpte_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsmpte_la_CFLAGS) \ -:LDFLAGS $(libgstsmpte_la_LDFLAGS) \ $(libgstsmpte_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/smpte/gstmask.c0000644000175000017500000000516211671175354015557 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 "gstmask.h" #include "paint.h" static GList *masks = NULL; void _gst_mask_init (void) { _gst_barboxwipes_register (); } static gint gst_mask_compare (GstMaskDefinition * def1, GstMaskDefinition * def2) { return (def1->type - def2->type); } void _gst_mask_register (const GstMaskDefinition * definition) { masks = g_list_insert_sorted (masks, (gpointer) definition, (GCompareFunc) gst_mask_compare); } const GList * gst_mask_get_definitions (void) { return masks; } static GstMaskDefinition * gst_mask_find_definition (gint type) { GList *walk = masks; while (walk) { GstMaskDefinition *def = (GstMaskDefinition *) walk->data; if (def->type == type) return def; walk = g_list_next (walk); } return NULL; } GstMask * gst_mask_factory_new (gint type, gboolean invert, gint bpp, gint width, gint height) { GstMaskDefinition *definition; GstMask *mask = NULL; definition = gst_mask_find_definition (type); if (definition) { mask = g_new0 (GstMask, 1); mask->type = definition->type; mask->bpp = bpp; mask->width = width; mask->height = height; mask->destroy_func = definition->destroy_func; mask->user_data = definition->user_data; mask->data = g_malloc (width * height * sizeof (guint32)); definition->draw_func (mask); if (invert) { gint i, j; guint32 *datap = mask->data; guint32 max = (1 << bpp); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { *datap = max - *datap; datap++; } } } } return mask; } void _gst_mask_default_destroy (GstMask * mask) { g_free (mask->data); g_free (mask); } void gst_mask_destroy (GstMask * mask) { if (mask->destroy_func) mask->destroy_func (mask); } gst-plugins-good-0.10.31/gst/videofilter/0000755000175000017500000000000011720565301015170 500000000000000gst-plugins-good-0.10.31/gst/videofilter/gstvideotemplate.c0000644000175000017500000001541411671175354020653 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * 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. */ /* * This file was (probably) generated from * $Id$ * and * MAKEFILTERVERSION */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #define GST_TYPE_VIDEOTEMPLATE \ (gst_videotemplate_get_type()) #define GST_VIDEOTEMPLATE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEOTEMPLATE,GstVideotemplate)) #define GST_VIDEOTEMPLATE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEOTEMPLATE,GstVideotemplateClass)) #define GST_IS_VIDEOTEMPLATE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEOTEMPLATE)) #define GST_IS_VIDEOTEMPLATE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOTEMPLATE)) typedef struct _GstVideotemplate GstVideotemplate; typedef struct _GstVideotemplateClass GstVideotemplateClass; struct _GstVideotemplate { GstVideofilter videofilter; }; struct _GstVideotemplateClass { GstVideofilterClass parent_class; }; /* GstVideotemplate signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 /* FILL ME */ }; static void gst_videotemplate_base_init (gpointer g_class); static void gst_videotemplate_class_init (gpointer g_class, gpointer class_data); static void gst_videotemplate_init (GTypeInstance * instance, gpointer g_class); static void gst_videotemplate_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_videotemplate_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_videotemplate_planar411 (GstVideofilter * videofilter, void *dest, void *src); static void gst_videotemplate_setup (GstVideofilter * videofilter); GType gst_videotemplate_get_type (void) { static GType videotemplate_type = 0; if (!videotemplate_type) { static const GTypeInfo videotemplate_info = { sizeof (GstVideotemplateClass), gst_videotemplate_base_init, NULL, gst_videotemplate_class_init, NULL, NULL, sizeof (GstVideotemplate), 0, gst_videotemplate_init, }; videotemplate_type = g_type_register_static (GST_TYPE_VIDEOFILTER, "GstVideotemplate", &videotemplate_info, 0); } return videotemplate_type; } static GstVideofilterFormat gst_videotemplate_formats[] = { {"I420", 12, gst_videotemplate_planar411,}, }; static void gst_videotemplate_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); int i; gst_element_class_set_details_simple (element_class, "Video filter template", "Filter/Effect/Video", "Template for a video filter", "David Schleef "); for (i = 0; i < G_N_ELEMENTS (gst_videotemplate_formats); i++) { gst_videofilter_class_add_format (videofilter_class, gst_videotemplate_formats + i); } gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class)); } static void gst_videotemplate_class_init (gpointer g_class, gpointer class_data) { GObjectClass *gobject_class; GstVideofilterClass *videofilter_class; gobject_class = G_OBJECT_CLASS (g_class); videofilter_class = GST_VIDEOFILTER_CLASS (g_class); #if 0 g_object_class_install_property (gobject_class, ARG_METHOD, g_param_spec_enum ("method", "method", "method", GST_TYPE_VIDEOTEMPLATE_METHOD, GST_VIDEOTEMPLATE_METHOD_1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #endif gobject_class->set_property = gst_videotemplate_set_property; gobject_class->get_property = gst_videotemplate_get_property; videofilter_class->setup = gst_videotemplate_setup; } static void gst_videotemplate_init (GTypeInstance * instance, gpointer g_class) { GstVideotemplate *videotemplate = GST_VIDEOTEMPLATE (instance); GstVideofilter *videofilter; GST_DEBUG ("gst_videotemplate_init"); videofilter = GST_VIDEOFILTER (videotemplate); /* do stuff */ } static void gst_videotemplate_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideotemplate *src; g_return_if_fail (GST_IS_VIDEOTEMPLATE (object)); src = GST_VIDEOTEMPLATE (object); GST_DEBUG ("gst_videotemplate_set_property"); switch (prop_id) { #if 0 case ARG_METHOD: src->method = g_value_get_enum (value); break; #endif default: break; } } static void gst_videotemplate_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideotemplate *src; g_return_if_fail (GST_IS_VIDEOTEMPLATE (object)); src = GST_VIDEOTEMPLATE (object); switch (prop_id) { #if 0 case ARG_METHOD: g_value_set_enum (value, src->method); break; #endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "videotemplate", GST_RANK_NONE, GST_TYPE_VIDEOTEMPLATE); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "videotemplate", "Template for a video filter", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) static void gst_videotemplate_setup (GstVideofilter * videofilter) { GstVideotemplate *videotemplate; g_return_if_fail (GST_IS_VIDEOTEMPLATE (videofilter)); videotemplate = GST_VIDEOTEMPLATE (videofilter); /* if any setup needs to be done, do it here */ } static void gst_videotemplate_planar411 (GstVideofilter * videofilter, void *dest, void *src) { GstVideotemplate *videotemplate; int width = gst_videofilter_get_input_width (videofilter); int height = gst_videofilter_get_input_height (videofilter); g_return_if_fail (GST_IS_VIDEOTEMPLATE (videofilter)); videotemplate = GST_VIDEOTEMPLATE (videofilter); /* do something interesting here. This simply copies the source * to the destination. */ memcpy (dest, src, width * height + (width / 2) * (height / 2) * 2); } gst-plugins-good-0.10.31/gst/videofilter/gstvideobalance.h0000644000175000017500000000434711671175354020435 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_VIDEO_BALANCE_H__ #define __GST_VIDEO_BALANCE_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_VIDEO_BALANCE \ (gst_video_balance_get_type()) #define GST_VIDEO_BALANCE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_BALANCE,GstVideoBalance)) #define GST_VIDEO_BALANCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_BALANCE,GstVideoBalanceClass)) #define GST_IS_VIDEO_BALANCE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_BALANCE)) #define GST_IS_VIDEO_BALANCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_BALANCE)) typedef struct _GstVideoBalance GstVideoBalance; typedef struct _GstVideoBalanceClass GstVideoBalanceClass; /** * GstVideoBalance: * * Opaque data structure. */ struct _GstVideoBalance { GstVideoFilter videofilter; /* < private > */ /* channels for interface */ GList *channels; /* properties */ gdouble contrast; gdouble brightness; gdouble hue; gdouble saturation; /* format */ GstVideoFormat format; gint width; gint height; gint size; /* tables */ guint8 tabley[256]; guint8 *tableu[256]; guint8 *tablev[256]; void (*process) (GstVideoBalance *balance, guint8 *data); }; struct _GstVideoBalanceClass { GstVideoFilterClass parent_class; }; GType gst_video_balance_get_type(void); G_END_DECLS #endif /* __GST_VIDEO_BALANCE_H__ */ gst-plugins-good-0.10.31/gst/videofilter/gstvideobalance.c0000644000175000017500000006145311677341660020432 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2010> Sebastian Dröge * * 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. */ /* * This file was (probably) generated from gstvideobalance.c, * gstvideobalance.c,v 1.7 2003/11/08 02:48:59 dschleef Exp */ /** * SECTION:element-videobalance * * Adjusts brightness, contrast, hue, saturation on a video stream. * * * Example launch line * |[ * gst-launch videotestsrc ! videobalance saturation=0.0 ! ffmpegcolorspace ! ximagesink * ]| This pipeline converts the image to black and white by setting the * saturation to 0.0. * * * Last reviewed on 2010-04-18 (0.10.22) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstvideobalance.h" #include #include #include GST_DEBUG_CATEGORY_STATIC (videobalance_debug); #define GST_CAT_DEFAULT videobalance_debug /* GstVideoBalance properties */ #define DEFAULT_PROP_CONTRAST 1.0 #define DEFAULT_PROP_BRIGHTNESS 0.0 #define DEFAULT_PROP_HUE 0.0 #define DEFAULT_PROP_SATURATION 1.0 enum { PROP_0, PROP_CONTRAST, PROP_BRIGHTNESS, PROP_HUE, PROP_SATURATION }; static GstStaticPadTemplate gst_video_balance_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") ) ); static GstStaticPadTemplate gst_video_balance_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") ) ); static void gst_video_balance_colorbalance_init (GstColorBalanceClass * iface); static void gst_video_balance_interface_init (GstImplementsInterfaceClass * klass); static void gst_video_balance_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_video_balance_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void _do_init (GType video_balance_type) { static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) gst_video_balance_interface_init, NULL, NULL, }; static const GInterfaceInfo colorbalance_info = { (GInterfaceInitFunc) gst_video_balance_colorbalance_init, NULL, NULL, }; g_type_add_interface_static (video_balance_type, GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); g_type_add_interface_static (video_balance_type, GST_TYPE_COLOR_BALANCE, &colorbalance_info); } GST_BOILERPLATE_FULL (GstVideoBalance, gst_video_balance, GstVideoFilter, GST_TYPE_VIDEO_FILTER, _do_init); /* * look-up tables (LUT). */ static void gst_video_balance_update_tables (GstVideoBalance * vb) { gint i, j; gdouble y, u, v, hue_cos, hue_sin; /* Y */ for (i = 0; i < 256; i++) { y = 16 + ((i - 16) * vb->contrast + vb->brightness * 255); if (y < 0) y = 0; else if (y > 255) y = 255; vb->tabley[i] = rint (y); } hue_cos = cos (G_PI * vb->hue); hue_sin = sin (G_PI * vb->hue); /* U/V lookup tables are 2D, since we need both U/V for each table * separately. */ for (i = -128; i < 128; i++) { for (j = -128; j < 128; j++) { u = 128 + ((i * hue_cos + j * hue_sin) * vb->saturation); v = 128 + ((-i * hue_sin + j * hue_cos) * vb->saturation); if (u < 0) u = 0; else if (u > 255) u = 255; if (v < 0) v = 0; else if (v > 255) v = 255; vb->tableu[i + 128][j + 128] = rint (u); vb->tablev[i + 128][j + 128] = rint (v); } } } static gboolean gst_video_balance_is_passthrough (GstVideoBalance * videobalance) { return videobalance->contrast == 1.0 && videobalance->brightness == 0.0 && videobalance->hue == 0.0 && videobalance->saturation == 1.0; } static void gst_video_balance_update_properties (GstVideoBalance * videobalance) { gboolean passthrough = gst_video_balance_is_passthrough (videobalance); GstBaseTransform *base = GST_BASE_TRANSFORM (videobalance); base->passthrough = passthrough; if (!passthrough) gst_video_balance_update_tables (videobalance); } static void gst_video_balance_planar_yuv (GstVideoBalance * videobalance, guint8 * data) { gint x, y; guint8 *ydata; guint8 *udata, *vdata; gint ystride, ustride, vstride; GstVideoFormat format; gint width, height; gint width2, height2; guint8 *tabley = videobalance->tabley; guint8 **tableu = videobalance->tableu; guint8 **tablev = videobalance->tablev; format = videobalance->format; width = videobalance->width; height = videobalance->height; ydata = data + gst_video_format_get_component_offset (format, 0, width, height); ystride = gst_video_format_get_row_stride (format, 0, width); for (y = 0; y < height; y++) { guint8 *yptr; yptr = ydata + y * ystride; for (x = 0; x < width; x++) { *yptr = tabley[*yptr]; yptr++; } } width2 = gst_video_format_get_component_width (format, 1, width); height2 = gst_video_format_get_component_height (format, 1, height); udata = data + gst_video_format_get_component_offset (format, 1, width, height); vdata = data + gst_video_format_get_component_offset (format, 2, width, height); ustride = gst_video_format_get_row_stride (format, 1, width); vstride = gst_video_format_get_row_stride (format, 1, width); for (y = 0; y < height2; y++) { guint8 *uptr, *vptr; guint8 u1, v1; uptr = udata + y * ustride; vptr = vdata + y * vstride; for (x = 0; x < width2; x++) { u1 = *uptr; v1 = *vptr; *uptr++ = tableu[u1][v1]; *vptr++ = tablev[u1][v1]; } } } static void gst_video_balance_packed_yuv (GstVideoBalance * videobalance, guint8 * data) { gint x, y; guint8 *ydata; guint8 *udata, *vdata; gint ystride, ustride, vstride; gint yoff, uoff, voff; GstVideoFormat format; gint width, height; gint width2, height2; guint8 *tabley = videobalance->tabley; guint8 **tableu = videobalance->tableu; guint8 **tablev = videobalance->tablev; format = videobalance->format; width = videobalance->width; height = videobalance->height; ydata = data + gst_video_format_get_component_offset (format, 0, width, height); ystride = gst_video_format_get_row_stride (format, 0, width); yoff = gst_video_format_get_pixel_stride (format, 0); for (y = 0; y < height; y++) { guint8 *yptr; yptr = ydata + y * ystride; for (x = 0; x < width; x++) { *yptr = tabley[*yptr]; yptr += yoff; } } width2 = gst_video_format_get_component_width (format, 1, width); height2 = gst_video_format_get_component_height (format, 1, height); udata = data + gst_video_format_get_component_offset (format, 1, width, height); vdata = data + gst_video_format_get_component_offset (format, 2, width, height); ustride = gst_video_format_get_row_stride (format, 1, width); vstride = gst_video_format_get_row_stride (format, 1, width); uoff = gst_video_format_get_pixel_stride (format, 1); voff = gst_video_format_get_pixel_stride (format, 2); for (y = 0; y < height2; y++) { guint8 *uptr, *vptr; guint8 u1, v1; uptr = udata + y * ustride; vptr = vdata + y * vstride; for (x = 0; x < width2; x++) { u1 = *uptr; v1 = *vptr; *uptr = tableu[u1][v1]; *vptr = tablev[u1][v1]; uptr += uoff; vptr += voff; } } } static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { 298, 0, 409, -57068, 298, -100, -208, 34707, 298, 516, 0, -70870, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { 66, 129, 25, 4096, -38, -74, 112, 32768, 112, -94, -18, 32768, }; #define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) static void gst_video_balance_packed_rgb (GstVideoBalance * videobalance, guint8 * data) { gint i, j, height; gint width, row_stride, row_wrap; gint pixel_stride; gint offsets[3]; gint r, g, b; gint y, u, v; gint u_tmp, v_tmp; guint8 *tabley = videobalance->tabley; guint8 **tableu = videobalance->tableu; guint8 **tablev = videobalance->tablev; offsets[0] = gst_video_format_get_component_offset (videobalance->format, 0, videobalance->width, videobalance->height); offsets[1] = gst_video_format_get_component_offset (videobalance->format, 1, videobalance->width, videobalance->height); offsets[2] = gst_video_format_get_component_offset (videobalance->format, 2, videobalance->width, videobalance->height); width = gst_video_format_get_component_width (videobalance->format, 0, videobalance->width); height = gst_video_format_get_component_height (videobalance->format, 0, videobalance->height); row_stride = gst_video_format_get_row_stride (videobalance->format, 0, videobalance->width); pixel_stride = gst_video_format_get_pixel_stride (videobalance->format, 0); row_wrap = row_stride - pixel_stride * width; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { r = data[offsets[0]]; g = data[offsets[1]]; b = data[offsets[2]]; y = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 0, r, g, b); u_tmp = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 1, r, g, b); v_tmp = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 2, r, g, b); y = CLAMP (y, 0, 255); u_tmp = CLAMP (u_tmp, 0, 255); v_tmp = CLAMP (v_tmp, 0, 255); y = tabley[y]; u = tableu[u_tmp][v_tmp]; v = tablev[u_tmp][v_tmp]; r = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 0, y, u, v); g = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 1, y, u, v); b = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 2, y, u, v); data[offsets[0]] = CLAMP (r, 0, 255); data[offsets[1]] = CLAMP (g, 0, 255); data[offsets[2]] = CLAMP (b, 0, 255); data += pixel_stride; } data += row_wrap; } } /* get notified of caps and plug in the correct process function */ static gboolean gst_video_balance_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base); GST_DEBUG_OBJECT (videobalance, "in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); videobalance->process = NULL; if (!gst_video_format_parse_caps (incaps, &videobalance->format, &videobalance->width, &videobalance->height)) goto invalid_caps; videobalance->size = gst_video_format_get_size (videobalance->format, videobalance->width, videobalance->height); switch (videobalance->format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y444: videobalance->process = gst_video_balance_planar_yuv; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_UYVY: case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_YVYU: videobalance->process = gst_video_balance_packed_yuv; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: videobalance->process = gst_video_balance_packed_rgb; break; default: break; } return videobalance->process != NULL; invalid_caps: GST_ERROR_OBJECT (videobalance, "Invalid caps: %" GST_PTR_FORMAT, incaps); return FALSE; } static void gst_video_balance_before_transform (GstBaseTransform * base, GstBuffer * buf) { GstVideoBalance *balance = GST_VIDEO_BALANCE (base); GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (buf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (balance, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (balance), stream_time); } static GstFlowReturn gst_video_balance_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base); guint8 *data; guint size; if (!videobalance->process) goto not_negotiated; /* if no change is needed, we are done */ if (base->passthrough) goto done; data = GST_BUFFER_DATA (outbuf); size = GST_BUFFER_SIZE (outbuf); if (size != videobalance->size) goto wrong_size; GST_OBJECT_LOCK (videobalance); videobalance->process (videobalance, data); GST_OBJECT_UNLOCK (videobalance); done: return GST_FLOW_OK; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (videobalance, STREAM, FORMAT, (NULL), ("Invalid buffer size %d, expected %d", size, videobalance->size)); return GST_FLOW_ERROR; } not_negotiated: GST_ERROR_OBJECT (videobalance, "Not negotiated yet"); return GST_FLOW_NOT_NEGOTIATED; } static void gst_video_balance_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Video balance", "Filter/Effect/Video", "Adjusts brightness, contrast, hue, saturation on a video stream", "David Schleef "); gst_element_class_add_static_pad_template (element_class, &gst_video_balance_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_video_balance_src_template); } static void gst_video_balance_finalize (GObject * object) { GList *channels = NULL; GstVideoBalance *balance = GST_VIDEO_BALANCE (object); g_free (balance->tableu[0]); channels = balance->channels; while (channels) { GstColorBalanceChannel *channel = channels->data; g_object_unref (channel); channels->data = NULL; channels = g_list_next (channels); } if (balance->channels) g_list_free (balance->channels); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_video_balance_class_init (GstVideoBalanceClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; GST_DEBUG_CATEGORY_INIT (videobalance_debug, "videobalance", 0, "videobalance"); gobject_class->finalize = gst_video_balance_finalize; gobject_class->set_property = gst_video_balance_set_property; gobject_class->get_property = gst_video_balance_get_property; g_object_class_install_property (gobject_class, PROP_CONTRAST, g_param_spec_double ("contrast", "Contrast", "contrast", 0.0, 2.0, DEFAULT_PROP_CONTRAST, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_BRIGHTNESS, g_param_spec_double ("brightness", "Brightness", "brightness", -1.0, 1.0, DEFAULT_PROP_BRIGHTNESS, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_HUE, g_param_spec_double ("hue", "Hue", "hue", -1.0, 1.0, DEFAULT_PROP_HUE, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SATURATION, g_param_spec_double ("saturation", "Saturation", "saturation", 0.0, 2.0, DEFAULT_PROP_SATURATION, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_balance_set_caps); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_video_balance_transform_ip); trans_class->before_transform = GST_DEBUG_FUNCPTR (gst_video_balance_before_transform); } static void gst_video_balance_init (GstVideoBalance * videobalance, GstVideoBalanceClass * klass) { const gchar *channels[4] = { "HUE", "SATURATION", "BRIGHTNESS", "CONTRAST" }; gint i; /* Initialize propertiews */ videobalance->contrast = DEFAULT_PROP_CONTRAST; videobalance->brightness = DEFAULT_PROP_BRIGHTNESS; videobalance->hue = DEFAULT_PROP_HUE; videobalance->saturation = DEFAULT_PROP_SATURATION; videobalance->tableu[0] = g_new (guint8, 256 * 256 * 2); for (i = 0; i < 256; i++) { videobalance->tableu[i] = videobalance->tableu[0] + i * 256 * sizeof (guint8); videobalance->tablev[i] = videobalance->tableu[0] + 256 * 256 * sizeof (guint8) + i * 256 * sizeof (guint8); } gst_video_balance_update_properties (videobalance); /* Generate the channels list */ for (i = 0; i < G_N_ELEMENTS (channels); i++) { GstColorBalanceChannel *channel; channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); channel->label = g_strdup (channels[i]); channel->min_value = -1000; channel->max_value = 1000; videobalance->channels = g_list_append (videobalance->channels, channel); } } static gboolean gst_video_balance_interface_supported (GstImplementsInterface * iface, GType type) { g_assert (type == GST_TYPE_COLOR_BALANCE); return TRUE; } static void gst_video_balance_interface_init (GstImplementsInterfaceClass * klass) { klass->supported = gst_video_balance_interface_supported; } static const GList * gst_video_balance_colorbalance_list_channels (GstColorBalance * balance) { GstVideoBalance *videobalance = GST_VIDEO_BALANCE (balance); g_return_val_if_fail (videobalance != NULL, NULL); g_return_val_if_fail (GST_IS_VIDEO_BALANCE (videobalance), NULL); return videobalance->channels; } static void gst_video_balance_colorbalance_set_value (GstColorBalance * balance, GstColorBalanceChannel * channel, gint value) { GstVideoBalance *vb = GST_VIDEO_BALANCE (balance); gdouble new_val; gboolean changed = FALSE; g_return_if_fail (vb != NULL); g_return_if_fail (GST_IS_VIDEO_BALANCE (vb)); g_return_if_fail (GST_IS_VIDEO_FILTER (vb)); g_return_if_fail (channel->label != NULL); GST_BASE_TRANSFORM_LOCK (vb); GST_OBJECT_LOCK (vb); if (!g_ascii_strcasecmp (channel->label, "HUE")) { new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0; changed = new_val != vb->hue; vb->hue = new_val; } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { new_val = (value + 1000.0) * 2.0 / 2000.0; changed = new_val != vb->saturation; vb->saturation = new_val; } else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS")) { new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0; changed = new_val != vb->brightness; vb->brightness = new_val; } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { new_val = (value + 1000.0) * 2.0 / 2000.0; changed = new_val != vb->contrast; vb->contrast = new_val; } if (changed) gst_video_balance_update_properties (vb); GST_OBJECT_UNLOCK (vb); GST_BASE_TRANSFORM_UNLOCK (vb); if (changed) { gst_color_balance_value_changed (balance, channel, gst_color_balance_get_value (balance, channel)); } } static gint gst_video_balance_colorbalance_get_value (GstColorBalance * balance, GstColorBalanceChannel * channel) { GstVideoBalance *vb = GST_VIDEO_BALANCE (balance); gint value = 0; g_return_val_if_fail (vb != NULL, 0); g_return_val_if_fail (GST_IS_VIDEO_BALANCE (vb), 0); g_return_val_if_fail (channel->label != NULL, 0); if (!g_ascii_strcasecmp (channel->label, "HUE")) { value = (vb->hue + 1) * 2000.0 / 2.0 - 1000.0; } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { value = vb->saturation * 2000.0 / 2.0 - 1000.0; } else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS")) { value = (vb->brightness + 1) * 2000.0 / 2.0 - 1000.0; } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { value = vb->contrast * 2000.0 / 2.0 - 1000.0; } return value; } static void gst_video_balance_colorbalance_init (GstColorBalanceClass * iface) { GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_SOFTWARE; iface->list_channels = gst_video_balance_colorbalance_list_channels; iface->set_value = gst_video_balance_colorbalance_set_value; iface->get_value = gst_video_balance_colorbalance_get_value; } static GstColorBalanceChannel * gst_video_balance_find_channel (GstVideoBalance * balance, const gchar * label) { GList *l; for (l = balance->channels; l; l = l->next) { GstColorBalanceChannel *channel = l->data; if (g_ascii_strcasecmp (channel->label, label) == 0) return channel; } return NULL; } static void gst_video_balance_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoBalance *balance = GST_VIDEO_BALANCE (object); gdouble d; const gchar *label = NULL; GST_BASE_TRANSFORM_LOCK (balance); GST_OBJECT_LOCK (balance); switch (prop_id) { case PROP_CONTRAST: d = g_value_get_double (value); GST_DEBUG_OBJECT (balance, "Changing contrast from %lf to %lf", balance->contrast, d); if (d != balance->contrast) label = "CONTRAST"; balance->contrast = d; break; case PROP_BRIGHTNESS: d = g_value_get_double (value); GST_DEBUG_OBJECT (balance, "Changing brightness from %lf to %lf", balance->brightness, d); if (d != balance->brightness) label = "BRIGHTNESS"; balance->brightness = d; break; case PROP_HUE: d = g_value_get_double (value); GST_DEBUG_OBJECT (balance, "Changing hue from %lf to %lf", balance->hue, d); if (d != balance->hue) label = "HUE"; balance->hue = d; break; case PROP_SATURATION: d = g_value_get_double (value); GST_DEBUG_OBJECT (balance, "Changing saturation from %lf to %lf", balance->saturation, d); if (d != balance->saturation) label = "SATURATION"; balance->saturation = d; break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } gst_video_balance_update_properties (balance); GST_OBJECT_UNLOCK (balance); GST_BASE_TRANSFORM_UNLOCK (balance); if (label) { GstColorBalanceChannel *channel = gst_video_balance_find_channel (balance, label); gst_color_balance_value_changed (GST_COLOR_BALANCE (balance), channel, gst_color_balance_get_value (GST_COLOR_BALANCE (balance), channel)); } } static void gst_video_balance_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoBalance *balance = GST_VIDEO_BALANCE (object); switch (prop_id) { case PROP_CONTRAST: g_value_set_double (value, balance->contrast); break; case PROP_BRIGHTNESS: g_value_set_double (value, balance->brightness); break; case PROP_HUE: g_value_set_double (value, balance->hue); break; case PROP_SATURATION: g_value_set_double (value, balance->saturation); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/videofilter/make_filter0000755000175000017500000000157211671175354017337 00000000000000#!/bin/sh LANG=C export LANG LC_COLLATE=C export LC_COLLATE Template=$1; srcfile=$2; if test x"$1" = x ; then echo "$0 Objectname [srcfile]\n"; echo " creates gstobjectname.{c,h} implementing GstObjectname,\n"; echo " subclassing GstVideofilter.\n"; exit 1; fi if test x"$2" = x ; then srcfile="gstvideotemplate.c" fi id=`echo '$Id$' | sed \ -e 's/\$I[d]: \([^$]*\)\$/\1/g'` echo $id TEMPLATE=`echo $Template | tr [:lower:] [:upper:]` template=`echo $Template | tr [:upper:] [:lower:]` # remember to break up the Id: in the line below sed \ -e 's/gstvideotemplate\.c/SOURCEFILE/g' \ -e "s/Videotemplate/$Template/g" \ -e "s/videotemplate/$template/g" \ -e "s/VIDEOTEMPLATE/$TEMPLATE/g" \ -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ -e 's/SOURCEFILE/gstvideotemplate\.c/g' \ -e "s%MAKEFILTERVERSION%$id%g" \ $srcfile >gst$template.c.tmp && mv gst$template.c.tmp gst$template.c gst-plugins-good-0.10.31/gst/videofilter/Makefile.am0000644000175000017500000000263011671175354017157 00000000000000plugin_LTLIBRARIES = libgstvideofilter.la noinst_HEADERS = gstvideoflip.h gstvideobalance.h gstgamma.h EXTRA_DIST = gstvideotemplate.c make_filter CLEANFILES = gstvideoexample.c libgstvideofilter_la_SOURCES = plugin.c \ gstvideoflip.c \ gstvideobalance.c \ gstgamma.c libgstvideofilter_la_CFLAGS = $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstvideofilter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ \ -lgstinterfaces-@GST_MAJORMINOR@ \ $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) $(GST_LIBS) libgstvideofilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) libgstvideofilter_la_LIBTOOLFLAGS = --tag=disable-static gstvideoexample.c: $(srcdir)/make_filter $(srcdir)/gstvideotemplate.c $(srcdir)/make_filter Videoexample $(srcdir)/gstvideotemplate.c Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideofilter -:SHARED libgstvideofilter \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideofilter_la_SOURCES) \ $(nodist_libgstvideofilter_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideofilter_la_CFLAGS) \ -:LDFLAGS $(libgstvideofilter_la_LDFLAGS) \ $(libgstvideofilter_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/videofilter/plugin.c0000644000175000017500000000306411671175354016567 00000000000000/* GStreamer * Copyright (C) 2010 Sebastian Dröge * * 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 #include #include "gstgamma.h" #include "gstvideoflip.h" #include "gstvideobalance.h" static gboolean plugin_init (GstPlugin * plugin) { gst_controller_init (NULL, NULL); return (gst_element_register (plugin, "gamma", GST_RANK_NONE, GST_TYPE_GAMMA) && gst_element_register (plugin, "videobalance", GST_RANK_NONE, GST_TYPE_VIDEO_BALANCE) && gst_element_register (plugin, "videoflip", GST_RANK_NONE, GST_TYPE_VIDEO_FLIP)); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "videofilter", "Video filters plugin", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/videofilter/gstgamma.h0000644000175000017500000000412311671175354017073 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) 2003 Arwed v. Merkatz * Copyright (C) 2006 Mark Nauwelaerts * * 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_VIDEO_GAMMA_H__ #define __GST_VIDEO_GAMMA_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_GAMMA \ (gst_gamma_get_type()) #define GST_GAMMA(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GAMMA,GstGamma)) #define GST_GAMMA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GAMMA,GstGammaClass)) #define GST_IS_GAMMA(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GAMMA)) #define GST_IS_GAMMA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GAMMA)) typedef struct _GstGamma GstGamma; typedef struct _GstGammaClass GstGammaClass; /** * GstGamma: * * Opaque data structure. */ struct _GstGamma { GstVideoFilter videofilter; /* < private > */ /* format */ GstVideoFormat format; gint width; gint height; gint size; /* properties */ gdouble gamma; /* tables */ guint8 gamma_table[256]; void (*process) (GstGamma *gamma, guint8 *data); }; struct _GstGammaClass { GstVideoFilterClass parent_class; }; GType gst_gamma_get_type(void); G_END_DECLS #endif /* __GST_VIDEO_GAMMA_H__ */ gst-plugins-good-0.10.31/gst/videofilter/gstvideoflip.h0000644000175000017500000000545611671175354020004 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_VIDEO_FLIP_H__ #define __GST_VIDEO_FLIP_H__ #include #include #include G_BEGIN_DECLS /** * GstVideoFlipMethod: * @GST_VIDEO_FLIP_METHOD_IDENTITY: Identity (no rotation) * @GST_VIDEO_FLIP_METHOD_90R: Rotate clockwise 90 degrees * @GST_VIDEO_FLIP_METHOD_180: Rotate 180 degrees * @GST_VIDEO_FLIP_METHOD_90L: Rotate counter-clockwise 90 degrees * @GST_VIDEO_FLIP_METHOD_HORIZ: Flip horizontally * @GST_VIDEO_FLIP_METHOD_VERT: Flip vertically * @GST_VIDEO_FLIP_METHOD_TRANS: Flip across upper left/lower right diagonal * @GST_VIDEO_FLIP_METHOD_OTHER: Flip across upper right/lower left diagonal * * The different flip methods. */ typedef enum { GST_VIDEO_FLIP_METHOD_IDENTITY, GST_VIDEO_FLIP_METHOD_90R, GST_VIDEO_FLIP_METHOD_180, GST_VIDEO_FLIP_METHOD_90L, GST_VIDEO_FLIP_METHOD_HORIZ, GST_VIDEO_FLIP_METHOD_VERT, GST_VIDEO_FLIP_METHOD_TRANS, GST_VIDEO_FLIP_METHOD_OTHER } GstVideoFlipMethod; #define GST_TYPE_VIDEO_FLIP \ (gst_video_flip_get_type()) #define GST_VIDEO_FLIP(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_FLIP,GstVideoFlip)) #define GST_VIDEO_FLIP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_FLIP,GstVideoFlipClass)) #define GST_IS_VIDEO_FLIP(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_FLIP)) #define GST_IS_VIDEO_FLIP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_FLIP)) typedef struct _GstVideoFlip GstVideoFlip; typedef struct _GstVideoFlipClass GstVideoFlipClass; /** * GstVideoFlip: * * Opaque datastructure. */ struct _GstVideoFlip { GstVideoFilter videofilter; /* < private > */ GstVideoFormat format; gint from_width, from_height; gint to_width, to_height; GstVideoFlipMethod method; void (*process) (GstVideoFlip *videoflip, guint8 *dest, const guint8 *src); }; struct _GstVideoFlipClass { GstVideoFilterClass parent_class; }; GType gst_video_flip_get_type (void); G_END_DECLS #endif /* __GST_VIDEO_FLIP_H__ */ gst-plugins-good-0.10.31/gst/videofilter/gstvideoflip.c0000644000175000017500000010635211677341660017775 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2010> Sebastian Dröge * Copyright (C) <2011> Youness Alaoui * * 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. */ /* * This file was (probably) generated from gstvideoflip.c, * gstvideoflip.c,v 1.7 2003/11/08 02:48:59 dschleef Exp */ /** * SECTION:element-videoflip * * Flips and rotates video. * * * Example launch line * |[ * gst-launch videotestsrc ! videoflip method=clockwise ! ffmpegcolorspace ! ximagesink * ]| This pipeline flips the test image 90 degrees clockwise. * * * Last reviewed on 2010-04-18 (0.10.22) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstvideoflip.h" #include #include #include #include /* GstVideoFlip properties */ enum { PROP_0, PROP_METHOD /* FILL ME */ }; #define PROP_METHOD_DEFAULT GST_VIDEO_FLIP_METHOD_IDENTITY GST_DEBUG_CATEGORY_STATIC (video_flip_debug); #define GST_CAT_DEFAULT video_flip_debug static GstStaticPadTemplate gst_video_flip_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ) ); static GstStaticPadTemplate gst_video_flip_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ) ); #define GST_TYPE_VIDEO_FLIP_METHOD (gst_video_flip_method_get_type()) static const GEnumValue video_flip_methods[] = { {GST_VIDEO_FLIP_METHOD_IDENTITY, "Identity (no rotation)", "none"}, {GST_VIDEO_FLIP_METHOD_90R, "Rotate clockwise 90 degrees", "clockwise"}, {GST_VIDEO_FLIP_METHOD_180, "Rotate 180 degrees", "rotate-180"}, {GST_VIDEO_FLIP_METHOD_90L, "Rotate counter-clockwise 90 degrees", "counterclockwise"}, {GST_VIDEO_FLIP_METHOD_HORIZ, "Flip horizontally", "horizontal-flip"}, {GST_VIDEO_FLIP_METHOD_VERT, "Flip vertically", "vertical-flip"}, {GST_VIDEO_FLIP_METHOD_TRANS, "Flip across upper left/lower right diagonal", "upper-left-diagonal"}, {GST_VIDEO_FLIP_METHOD_OTHER, "Flip across upper right/lower left diagonal", "upper-right-diagonal"}, {0, NULL, NULL}, }; static GType gst_video_flip_method_get_type (void) { static GType video_flip_method_type = 0; if (!video_flip_method_type) { video_flip_method_type = g_enum_register_static ("GstVideoFlipMethod", video_flip_methods); } return video_flip_method_type; } GST_BOILERPLATE (GstVideoFlip, gst_video_flip, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static GstCaps * gst_video_flip_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps) { GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans); GstCaps *ret; gint width, height, i; ret = gst_caps_copy (caps); for (i = 0; i < gst_caps_get_size (ret); i++) { GstStructure *structure = gst_caps_get_structure (ret, i); gint par_n, par_d; if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { switch (videoflip->method) { case GST_VIDEO_FLIP_METHOD_90R: case GST_VIDEO_FLIP_METHOD_90L: case GST_VIDEO_FLIP_METHOD_TRANS: case GST_VIDEO_FLIP_METHOD_OTHER: gst_structure_set (structure, "width", G_TYPE_INT, height, "height", G_TYPE_INT, width, NULL); if (gst_structure_get_fraction (structure, "pixel-aspect-ratio", &par_n, &par_d)) { if (par_n != 1 || par_d != 1) { GValue val = { 0, }; g_value_init (&val, GST_TYPE_FRACTION); gst_value_set_fraction (&val, par_d, par_n); gst_structure_set_value (structure, "pixel-aspect-ratio", &val); g_value_unset (&val); } } break; case GST_VIDEO_FLIP_METHOD_IDENTITY: case GST_VIDEO_FLIP_METHOD_180: case GST_VIDEO_FLIP_METHOD_HORIZ: case GST_VIDEO_FLIP_METHOD_VERT: gst_structure_set (structure, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); break; default: g_assert_not_reached (); break; } } } GST_DEBUG_OBJECT (videoflip, "transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, caps, ret); return ret; } static gboolean gst_video_flip_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size) { GstVideoFormat format; gint width, height; if (!gst_video_format_parse_caps (caps, &format, &width, &height)) return FALSE; *size = gst_video_format_get_size (format, width, height); GST_DEBUG_OBJECT (btrans, "our frame size is %d bytes (%dx%d)", *size, width, height); return TRUE; } static void gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest, const guint8 * src) { gint x, y; guint8 const *s; guint8 *d; GstVideoFormat format = videoflip->format; gint sw = videoflip->from_width; gint sh = videoflip->from_height; gint dw = videoflip->to_width; gint dh = videoflip->to_height; gint src_y_stride, src_u_stride, src_v_stride; gint src_y_offset, src_u_offset, src_v_offset; gint src_y_height, src_u_height, src_v_height; gint src_y_width, src_u_width, src_v_width; gint dest_y_stride, dest_u_stride, dest_v_stride; gint dest_y_offset, dest_u_offset, dest_v_offset; gint dest_y_height, dest_u_height, dest_v_height; gint dest_y_width, dest_u_width, dest_v_width; src_y_stride = gst_video_format_get_row_stride (format, 0, sw); src_u_stride = gst_video_format_get_row_stride (format, 1, sw); src_v_stride = gst_video_format_get_row_stride (format, 2, sw); dest_y_stride = gst_video_format_get_row_stride (format, 0, dw); dest_u_stride = gst_video_format_get_row_stride (format, 1, dw); dest_v_stride = gst_video_format_get_row_stride (format, 2, dw); src_y_offset = gst_video_format_get_component_offset (format, 0, sw, sh); src_u_offset = gst_video_format_get_component_offset (format, 1, sw, sh); src_v_offset = gst_video_format_get_component_offset (format, 2, sw, sh); dest_y_offset = gst_video_format_get_component_offset (format, 0, dw, dh); dest_u_offset = gst_video_format_get_component_offset (format, 1, dw, dh); dest_v_offset = gst_video_format_get_component_offset (format, 2, dw, dh); src_y_width = gst_video_format_get_component_width (format, 0, sw); src_u_width = gst_video_format_get_component_width (format, 1, sw); src_v_width = gst_video_format_get_component_width (format, 2, sw); dest_y_width = gst_video_format_get_component_width (format, 0, dw); dest_u_width = gst_video_format_get_component_width (format, 1, dw); dest_v_width = gst_video_format_get_component_width (format, 2, dw); src_y_height = gst_video_format_get_component_height (format, 0, sh); src_u_height = gst_video_format_get_component_height (format, 1, sh); src_v_height = gst_video_format_get_component_height (format, 2, sh); dest_y_height = gst_video_format_get_component_height (format, 0, dh); dest_u_height = gst_video_format_get_component_height (format, 1, dh); dest_v_height = gst_video_format_get_component_height (format, 2, dh); switch (videoflip->method) { case GST_VIDEO_FLIP_METHOD_90R: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[(src_y_height - 1 - x) * src_y_stride + y]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[(src_u_height - 1 - x) * src_u_stride + y]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_v_height; y++) { for (x = 0; x < dest_v_width; x++) { d[y * dest_v_stride + x] = s[(src_v_height - 1 - x) * src_v_stride + y]; } } break; case GST_VIDEO_FLIP_METHOD_90L: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[x * src_y_stride + (src_y_width - 1 - y)]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[x * src_u_stride + (src_u_width - 1 - y)]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_v_height; y++) { for (x = 0; x < dest_v_width; x++) { d[y * dest_v_stride + x] = s[x * src_v_stride + (src_v_width - 1 - y)]; } } break; case GST_VIDEO_FLIP_METHOD_180: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[(src_y_height - 1 - y) * src_y_stride + (src_y_width - 1 - x)]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[(src_u_height - 1 - y) * src_u_stride + (src_u_width - 1 - x)]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_v_height; y++) { for (x = 0; x < dest_v_width; x++) { d[y * dest_v_stride + x] = s[(src_v_height - 1 - y) * src_v_stride + (src_v_width - 1 - x)]; } } break; case GST_VIDEO_FLIP_METHOD_HORIZ: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[y * src_y_stride + (src_y_width - 1 - x)]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[y * src_u_stride + (src_u_width - 1 - x)]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_v_height; y++) { for (x = 0; x < dest_v_width; x++) { d[y * dest_v_stride + x] = s[y * src_v_stride + (src_v_width - 1 - x)]; } } break; case GST_VIDEO_FLIP_METHOD_VERT: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[(src_y_height - 1 - y) * src_y_stride + x]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[(src_u_height - 1 - y) * src_u_stride + x]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_v_height; y++) { for (x = 0; x < dest_v_width; x++) { d[y * dest_v_stride + x] = s[(src_v_height - 1 - y) * src_v_stride + x]; } } break; case GST_VIDEO_FLIP_METHOD_TRANS: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[x * src_y_stride + y]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[x * src_u_stride + y]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_v_stride + x] = s[x * src_v_stride + y]; } } break; case GST_VIDEO_FLIP_METHOD_OTHER: /* Flip Y */ s = src + src_y_offset; d = dest + dest_y_offset; for (y = 0; y < dest_y_height; y++) { for (x = 0; x < dest_y_width; x++) { d[y * dest_y_stride + x] = s[(src_y_height - 1 - x) * src_y_stride + (src_y_width - 1 - y)]; } } /* Flip U */ s = src + src_u_offset; d = dest + dest_u_offset; for (y = 0; y < dest_u_height; y++) { for (x = 0; x < dest_u_width; x++) { d[y * dest_u_stride + x] = s[(src_u_height - 1 - x) * src_u_stride + (src_u_width - 1 - y)]; } } /* Flip V */ s = src + src_v_offset; d = dest + dest_v_offset; for (y = 0; y < dest_v_height; y++) { for (x = 0; x < dest_v_width; x++) { d[y * dest_v_stride + x] = s[(src_v_height - 1 - x) * src_v_stride + (src_v_width - 1 - y)]; } } break; case GST_VIDEO_FLIP_METHOD_IDENTITY: g_assert_not_reached (); break; default: g_assert_not_reached (); break; } } static void gst_video_flip_packed_simple (GstVideoFlip * videoflip, guint8 * dest, const guint8 * src) { gint x, y, z; guint8 const *s = src; guint8 *d = dest; GstVideoFormat format = videoflip->format; gint sw = videoflip->from_width; gint sh = videoflip->from_height; gint dw = videoflip->to_width; gint dh = videoflip->to_height; gint src_stride, dest_stride; gint bpp; src_stride = gst_video_format_get_row_stride (format, 0, sw); dest_stride = gst_video_format_get_row_stride (format, 0, dw); /* This is only true for non-subsampled formats! */ bpp = gst_video_format_get_pixel_stride (format, 0); switch (videoflip->method) { case GST_VIDEO_FLIP_METHOD_90R: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[(sh - 1 - x) * src_stride + y * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_90L: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[x * src_stride + (sw - 1 - y) * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_180: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[(sh - 1 - y) * src_stride + (sw - 1 - x) * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_HORIZ: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[y * src_stride + (sw - 1 - x) * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_VERT: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[(sh - 1 - y) * src_stride + x * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_TRANS: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[x * src_stride + y * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_OTHER: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x++) { for (z = 0; z < bpp; z++) { d[y * dest_stride + x * bpp + z] = s[(sh - 1 - x) * src_stride + (sw - 1 - y) * bpp + z]; } } } break; case GST_VIDEO_FLIP_METHOD_IDENTITY: g_assert_not_reached (); break; default: g_assert_not_reached (); break; } } static void gst_video_flip_y422 (GstVideoFlip * videoflip, guint8 * dest, const guint8 * src) { gint x, y; guint8 const *s = src; guint8 *d = dest; GstVideoFormat format = videoflip->format; gint sw = videoflip->from_width; gint sh = videoflip->from_height; gint dw = videoflip->to_width; gint dh = videoflip->to_height; gint src_stride, dest_stride; gint bpp; gint y_offset; gint u_offset; gint v_offset; gint y_stride; src_stride = gst_video_format_get_row_stride (format, 0, sw); dest_stride = gst_video_format_get_row_stride (format, 0, dw); y_offset = gst_video_format_get_component_offset (format, 0, sw, sh); u_offset = gst_video_format_get_component_offset (format, 1, sw, sh); v_offset = gst_video_format_get_component_offset (format, 2, sw, sh); y_stride = gst_video_format_get_pixel_stride (format, 0); bpp = y_stride; switch (videoflip->method) { case GST_VIDEO_FLIP_METHOD_90R: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_y = (y & ~1); u = s[(sh - 1 - x) * src_stride + even_y * bpp + u_offset]; if (x + 1 < dw) u = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + u_offset] + u) >> 1; v = s[(sh - 1 - x) * src_stride + even_y * bpp + v_offset]; if (x + 1 < dw) v = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + v_offset] + v) >> 1; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[(sh - 1 - x) * src_stride + y * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[(sh - 1 - (x + 1)) * src_stride + y * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_90L: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_y = ((sw - 1 - y) & ~1); u = s[x * src_stride + even_y * bpp + u_offset]; if (x + 1 < dw) u = (s[(x + 1) * src_stride + even_y * bpp + u_offset] + u) >> 1; v = s[x * src_stride + even_y * bpp + v_offset]; if (x + 1 < dw) v = (s[(x + 1) * src_stride + even_y * bpp + v_offset] + v) >> 1; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[x * src_stride + (sw - 1 - y) * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[(x + 1) * src_stride + (sw - 1 - y) * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_180: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_x = ((sw - 1 - x) & ~1); u = (s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset] + s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset]) / 2; v = (s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset] + s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset]) / 2; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[(sh - 1 - y) * src_stride + (sw - 1 - x) * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[(sh - 1 - y) * src_stride + (sw - 1 - (x + 1)) * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_HORIZ: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_x = ((sw - 1 - x) & ~1); u = (s[y * src_stride + even_x * bpp + u_offset] + s[y * src_stride + even_x * bpp + u_offset]) / 2; v = (s[y * src_stride + even_x * bpp + v_offset] + s[y * src_stride + even_x * bpp + v_offset]) / 2; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[y * src_stride + (sw - 1 - x) * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[y * src_stride + (sw - 1 - (x + 1)) * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_VERT: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_x = (x & ~1); u = (s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset] + s[(sh - 1 - y) * src_stride + even_x * bpp + u_offset]) / 2; v = (s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset] + s[(sh - 1 - y) * src_stride + even_x * bpp + v_offset]) / 2; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[(sh - 1 - y) * src_stride + x * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[(sh - 1 - y) * src_stride + (x + 1) * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_TRANS: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_y = (y & ~1); u = s[x * src_stride + even_y * bpp + u_offset]; if (x + 1 < dw) u = (s[(x + 1) * src_stride + even_y * bpp + u_offset] + u) >> 1; v = s[x * src_stride + even_y * bpp + v_offset]; if (x + 1 < dw) v = (s[(x + 1) * src_stride + even_y * bpp + v_offset] + v) >> 1; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[x * src_stride + y * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[(x + 1) * src_stride + y * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_OTHER: for (y = 0; y < dh; y++) { for (x = 0; x < dw; x += 2) { guint8 u; guint8 v; /* u/v must be calculated using the offset of the even column */ gint even_y = ((sw - 1 - y) & ~1); u = s[(sh - 1 - x) * src_stride + even_y * bpp + u_offset]; if (x + 1 < dw) u = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + u_offset] + u) >> 1; v = s[(sh - 1 - x) * src_stride + even_y * bpp + v_offset]; if (x + 1 < dw) v = (s[(sh - 1 - (x + 1)) * src_stride + even_y * bpp + v_offset] + v) >> 1; d[y * dest_stride + x * bpp + u_offset] = u; d[y * dest_stride + x * bpp + v_offset] = v; d[y * dest_stride + x * bpp + y_offset] = s[(sh - 1 - x) * src_stride + (sw - 1 - y) * bpp + y_offset]; if (x + 1 < dw) d[y * dest_stride + (x + 1) * bpp + y_offset] = s[(sh - 1 - (x + 1)) * src_stride + (sw - 1 - y) * bpp + y_offset]; } } break; case GST_VIDEO_FLIP_METHOD_IDENTITY: g_assert_not_reached (); break; default: g_assert_not_reached (); break; } } static gboolean gst_video_flip_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstVideoFlip *vf = GST_VIDEO_FLIP (btrans); GstVideoFormat in_format, out_format; gboolean ret = FALSE; vf->process = NULL; if (!gst_video_format_parse_caps (incaps, &in_format, &vf->from_width, &vf->from_height) || !gst_video_format_parse_caps (outcaps, &out_format, &vf->to_width, &vf->to_height)) goto invalid_caps; if (in_format != out_format) goto invalid_caps; vf->format = in_format; /* Check that they are correct */ switch (vf->method) { case GST_VIDEO_FLIP_METHOD_90R: case GST_VIDEO_FLIP_METHOD_90L: case GST_VIDEO_FLIP_METHOD_TRANS: case GST_VIDEO_FLIP_METHOD_OTHER: if ((vf->from_width != vf->to_height) || (vf->from_height != vf->to_width)) { GST_ERROR_OBJECT (vf, "we are inverting width and height but caps " "are not correct : %dx%d to %dx%d", vf->from_width, vf->from_height, vf->to_width, vf->to_height); goto beach; } break; case GST_VIDEO_FLIP_METHOD_IDENTITY: break; case GST_VIDEO_FLIP_METHOD_180: case GST_VIDEO_FLIP_METHOD_HORIZ: case GST_VIDEO_FLIP_METHOD_VERT: if ((vf->from_width != vf->to_width) || (vf->from_height != vf->to_height)) { GST_ERROR_OBJECT (vf, "we are keeping width and height but caps " "are not correct : %dx%d to %dx%d", vf->from_width, vf->from_height, vf->to_width, vf->to_height); goto beach; } break; default: g_assert_not_reached (); break; } ret = TRUE; switch (vf->format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y444: vf->process = gst_video_flip_planar_yuv; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_UYVY: case GST_VIDEO_FORMAT_YVYU: vf->process = gst_video_flip_y422; break; case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: vf->process = gst_video_flip_packed_simple; break; default: break; } beach: return ret && (vf->process != NULL); invalid_caps: GST_ERROR_OBJECT (vf, "Invalid caps: %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, incaps, outcaps); return FALSE; } static void gst_video_flip_before_transform (GstBaseTransform * trans, GstBuffer * in) { GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans); GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (videoflip, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (videoflip), stream_time); } static GstFlowReturn gst_video_flip_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans); guint8 *dest; const guint8 *src; if (G_UNLIKELY (videoflip->process == NULL)) goto not_negotiated; src = GST_BUFFER_DATA (in); dest = GST_BUFFER_DATA (out); GST_LOG_OBJECT (videoflip, "videoflip: flipping %dx%d to %dx%d (%s)", videoflip->from_width, videoflip->from_height, videoflip->to_width, videoflip->to_height, video_flip_methods[videoflip->method].value_nick); GST_OBJECT_LOCK (videoflip); videoflip->process (videoflip, dest, src); GST_OBJECT_UNLOCK (videoflip); return GST_FLOW_OK; not_negotiated: GST_ERROR_OBJECT (videoflip, "Not negotiated yet"); return GST_FLOW_NOT_NEGOTIATED; } static gboolean gst_video_flip_src_event (GstBaseTransform * trans, GstEvent * event) { GstVideoFlip *vf = GST_VIDEO_FLIP (trans); gdouble new_x, new_y, x, y; GstStructure *structure; gboolean ret; GST_DEBUG_OBJECT (vf, "handling %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: event = GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event))); structure = (GstStructure *) gst_event_get_structure (event); if (gst_structure_get_double (structure, "pointer_x", &x) && gst_structure_get_double (structure, "pointer_y", &y)) { GST_DEBUG_OBJECT (vf, "converting %fx%f", x, y); switch (vf->method) { case GST_VIDEO_FLIP_METHOD_90R: new_x = y; new_y = vf->to_width - x; break; case GST_VIDEO_FLIP_METHOD_90L: new_x = vf->to_height - y; new_y = x; break; case GST_VIDEO_FLIP_METHOD_OTHER: new_x = vf->to_height - y; new_y = vf->to_width - x; break; case GST_VIDEO_FLIP_METHOD_TRANS: new_x = y; new_y = x; break; case GST_VIDEO_FLIP_METHOD_180: new_x = vf->to_width - x; new_y = vf->to_height - y; break; case GST_VIDEO_FLIP_METHOD_HORIZ: new_x = vf->to_width - x; new_y = y; break; case GST_VIDEO_FLIP_METHOD_VERT: new_x = x; new_y = vf->to_height - y; break; default: new_x = x; new_y = y; break; } GST_DEBUG_OBJECT (vf, "to %fx%f", new_x, new_y); gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, new_x, "pointer_y", G_TYPE_DOUBLE, new_y, NULL); } break; default: break; } ret = GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event); return ret; } static void gst_video_flip_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoFlip *videoflip = GST_VIDEO_FLIP (object); switch (prop_id) { case PROP_METHOD: { GstVideoFlipMethod method; method = g_value_get_enum (value); GST_OBJECT_LOCK (videoflip); if (method != videoflip->method) { GstBaseTransform *btrans = GST_BASE_TRANSFORM (videoflip); GST_DEBUG_OBJECT (videoflip, "Changing method from %s to %s", video_flip_methods[videoflip->method].value_nick, video_flip_methods[method].value_nick); videoflip->method = method; GST_OBJECT_UNLOCK (videoflip); gst_base_transform_set_passthrough (btrans, method == GST_VIDEO_FLIP_METHOD_IDENTITY); gst_base_transform_reconfigure (btrans); } else { GST_OBJECT_UNLOCK (videoflip); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_video_flip_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoFlip *videoflip = GST_VIDEO_FLIP (object); switch (prop_id) { case PROP_METHOD: g_value_set_enum (value, videoflip->method); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_video_flip_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Video flipper", "Filter/Effect/Video", "Flips and rotates video", "David Schleef "); gst_element_class_add_static_pad_template (element_class, &gst_video_flip_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_video_flip_src_template); } static void gst_video_flip_class_init (GstVideoFlipClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; GST_DEBUG_CATEGORY_INIT (video_flip_debug, "videoflip", 0, "videoflip"); gobject_class->set_property = gst_video_flip_set_property; gobject_class->get_property = gst_video_flip_get_property; g_object_class_install_property (gobject_class, PROP_METHOD, g_param_spec_enum ("method", "method", "method", GST_TYPE_VIDEO_FLIP_METHOD, PROP_METHOD_DEFAULT, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_video_flip_transform_caps); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_flip_set_caps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_video_flip_get_unit_size); trans_class->transform = GST_DEBUG_FUNCPTR (gst_video_flip_transform); trans_class->before_transform = GST_DEBUG_FUNCPTR (gst_video_flip_before_transform); trans_class->src_event = GST_DEBUG_FUNCPTR (gst_video_flip_src_event); } static void gst_video_flip_init (GstVideoFlip * videoflip, GstVideoFlipClass * klass) { videoflip->method = PROP_METHOD_DEFAULT; gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (videoflip), TRUE); } gst-plugins-good-0.10.31/gst/videofilter/Makefile.in0000644000175000017500000007772011720560237017175 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/videofilter DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstvideofilter_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstvideofilter_la_OBJECTS = libgstvideofilter_la-plugin.lo \ libgstvideofilter_la-gstvideoflip.lo \ libgstvideofilter_la-gstvideobalance.lo \ libgstvideofilter_la-gstgamma.lo libgstvideofilter_la_OBJECTS = $(am_libgstvideofilter_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstvideofilter_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) \ $(libgstvideofilter_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstvideofilter_la_SOURCES) DIST_SOURCES = $(libgstvideofilter_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstvideofilter.la noinst_HEADERS = gstvideoflip.h gstvideobalance.h gstgamma.h EXTRA_DIST = gstvideotemplate.c make_filter CLEANFILES = gstvideoexample.c libgstvideofilter_la_SOURCES = plugin.c \ gstvideoflip.c \ gstvideobalance.c \ gstgamma.c libgstvideofilter_la_CFLAGS = $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstvideofilter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ \ -lgstinterfaces-@GST_MAJORMINOR@ \ $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) $(GST_LIBS) libgstvideofilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBM) libgstvideofilter_la_LIBTOOLFLAGS = --tag=disable-static all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videofilter/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/videofilter/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstvideofilter.la: $(libgstvideofilter_la_OBJECTS) $(libgstvideofilter_la_DEPENDENCIES) $(EXTRA_libgstvideofilter_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstvideofilter_la_LINK) -rpath $(plugindir) $(libgstvideofilter_la_OBJECTS) $(libgstvideofilter_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-gstgamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-gstvideobalance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-gstvideoflip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideofilter_la-plugin.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstvideofilter_la-plugin.lo: plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-plugin.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-plugin.Tpo -c -o libgstvideofilter_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-plugin.Tpo $(DEPDIR)/libgstvideofilter_la-plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libgstvideofilter_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c libgstvideofilter_la-gstvideoflip.lo: gstvideoflip.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-gstvideoflip.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-gstvideoflip.Tpo -c -o libgstvideofilter_la-gstvideoflip.lo `test -f 'gstvideoflip.c' || echo '$(srcdir)/'`gstvideoflip.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-gstvideoflip.Tpo $(DEPDIR)/libgstvideofilter_la-gstvideoflip.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideoflip.c' object='libgstvideofilter_la-gstvideoflip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-gstvideoflip.lo `test -f 'gstvideoflip.c' || echo '$(srcdir)/'`gstvideoflip.c libgstvideofilter_la-gstvideobalance.lo: gstvideobalance.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-gstvideobalance.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-gstvideobalance.Tpo -c -o libgstvideofilter_la-gstvideobalance.lo `test -f 'gstvideobalance.c' || echo '$(srcdir)/'`gstvideobalance.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-gstvideobalance.Tpo $(DEPDIR)/libgstvideofilter_la-gstvideobalance.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideobalance.c' object='libgstvideofilter_la-gstvideobalance.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-gstvideobalance.lo `test -f 'gstvideobalance.c' || echo '$(srcdir)/'`gstvideobalance.c libgstvideofilter_la-gstgamma.lo: gstgamma.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -MT libgstvideofilter_la-gstgamma.lo -MD -MP -MF $(DEPDIR)/libgstvideofilter_la-gstgamma.Tpo -c -o libgstvideofilter_la-gstgamma.lo `test -f 'gstgamma.c' || echo '$(srcdir)/'`gstgamma.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideofilter_la-gstgamma.Tpo $(DEPDIR)/libgstvideofilter_la-gstgamma.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgamma.c' object='libgstvideofilter_la-gstgamma.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideofilter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideofilter_la_CFLAGS) $(CFLAGS) -c -o libgstvideofilter_la-gstgamma.lo `test -f 'gstgamma.c' || echo '$(srcdir)/'`gstgamma.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES gstvideoexample.c: $(srcdir)/make_filter $(srcdir)/gstvideotemplate.c $(srcdir)/make_filter Videoexample $(srcdir)/gstvideotemplate.c Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideofilter -:SHARED libgstvideofilter \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideofilter_la_SOURCES) \ $(nodist_libgstvideofilter_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideofilter_la_CFLAGS) \ -:LDFLAGS $(libgstvideofilter_la_LDFLAGS) \ $(libgstvideofilter_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/videofilter/gstgamma.c0000644000175000017500000003317011677341660017073 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) 2003 Arwed v. Merkatz * Copyright (C) 2006 Mark Nauwelaerts * Copyright (C) 2010 Sebastian Dröge * * 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. */ /* * This file was (probably) generated from * gstvideotemplate.c,v 1.12 2004/01/07 21:07:12 ds Exp * and * make_filter,v 1.6 2004/01/07 21:33:01 ds Exp */ /** * SECTION:element-gamma * * Performs gamma correction on a video stream. * * * Example launch line * |[ * gst-launch videotestsrc ! gamma gamma=2.0 ! ffmpegcolorspace ! ximagesink * ]| This pipeline will make the image "brighter". * |[ * gst-launch videotestsrc ! gamma gamma=0.5 ! ffmpegcolorspace ! ximagesink * ]| This pipeline will make the image "darker". * * * Last reviewed on 2010-04-18 (0.10.22) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstgamma.h" #include #include #include #include GST_DEBUG_CATEGORY_STATIC (gamma_debug); #define GST_CAT_DEFAULT gamma_debug /* GstGamma properties */ enum { PROP_0, PROP_GAMMA /* FILL ME */ }; #define DEFAULT_PROP_GAMMA 1 static GstStaticPadTemplate gst_gamma_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("NV12") ";" GST_VIDEO_CAPS_YUV ("NV21") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") ) ); static GstStaticPadTemplate gst_gamma_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("NV12") ";" GST_VIDEO_CAPS_YUV ("NV21") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B") ) ); static void gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_gamma_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps); static GstFlowReturn gst_gamma_transform_ip (GstBaseTransform * transform, GstBuffer * buf); static void gst_gamma_before_transform (GstBaseTransform * transform, GstBuffer * buf); static void gst_gamma_calculate_tables (GstGamma * gamma); GST_BOILERPLATE (GstGamma, gst_gamma, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void gst_gamma_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Video gamma correction", "Filter/Effect/Video", "Adjusts gamma on a video stream", "Arwed v. Merkatz "); gst_element_class_add_static_pad_template (element_class, &gst_gamma_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_gamma_src_template); } static void gst_gamma_class_init (GstGammaClass * g_class) { GObjectClass *gobject_class = (GObjectClass *) g_class; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) g_class; GST_DEBUG_CATEGORY_INIT (gamma_debug, "gamma", 0, "gamma"); gobject_class->set_property = gst_gamma_set_property; gobject_class->get_property = gst_gamma_get_property; g_object_class_install_property (gobject_class, PROP_GAMMA, g_param_spec_double ("gamma", "Gamma", "gamma", 0.01, 10, DEFAULT_PROP_GAMMA, GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_gamma_set_caps); trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_gamma_transform_ip); trans_class->before_transform = GST_DEBUG_FUNCPTR (gst_gamma_before_transform); } static void gst_gamma_init (GstGamma * gamma, GstGammaClass * g_class) { /* properties */ gamma->gamma = DEFAULT_PROP_GAMMA; gst_gamma_calculate_tables (gamma); } static void gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGamma *gamma = GST_GAMMA (object); switch (prop_id) { case PROP_GAMMA:{ gdouble val = g_value_get_double (value); GST_DEBUG_OBJECT (gamma, "Changing gamma from %lf to %lf", gamma->gamma, val); GST_OBJECT_LOCK (gamma); gamma->gamma = val; gst_gamma_calculate_tables (gamma); GST_OBJECT_UNLOCK (gamma); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_gamma_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGamma *gamma = GST_GAMMA (object); switch (prop_id) { case PROP_GAMMA: g_value_set_double (value, gamma->gamma); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_gamma_calculate_tables (GstGamma * gamma) { gint n; gdouble val; gdouble exp; if (gamma->gamma == 1.0) { GST_BASE_TRANSFORM (gamma)->passthrough = TRUE; return; } GST_BASE_TRANSFORM (gamma)->passthrough = FALSE; exp = 1.0 / gamma->gamma; for (n = 0; n < 256; n++) { val = n / 255.0; val = pow (val, exp); val = 255.0 * val; gamma->gamma_table[n] = (guint8) floor (val + 0.5); } } static void gst_gamma_planar_yuv_ip (GstGamma * gamma, guint8 * data) { gint i, j, height; gint width, row_stride, row_wrap; const guint8 *table = gamma->gamma_table; data = data + gst_video_format_get_component_offset (gamma->format, 0, gamma->width, gamma->height); width = gst_video_format_get_component_width (gamma->format, 0, gamma->width); height = gst_video_format_get_component_height (gamma->format, 0, gamma->height); row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width); row_wrap = row_stride - width; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { *data = table[*data]; data++; } data += row_wrap; } } static void gst_gamma_packed_yuv_ip (GstGamma * gamma, guint8 * data) { gint i, j, height; gint width, row_stride, row_wrap; gint pixel_stride; const guint8 *table = gamma->gamma_table; data = data + gst_video_format_get_component_offset (gamma->format, 0, gamma->width, gamma->height); width = gst_video_format_get_component_width (gamma->format, 0, gamma->width); height = gst_video_format_get_component_height (gamma->format, 0, gamma->height); row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width); pixel_stride = gst_video_format_get_pixel_stride (gamma->format, 0); row_wrap = row_stride - pixel_stride * width; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { *data = table[*data]; data += pixel_stride; } data += row_wrap; } } static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { 298, 0, 409, -57068, 298, -100, -208, 34707, 298, 516, 0, -70870, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { 66, 129, 25, 4096, -38, -74, 112, 32768, 112, -94, -18, 32768, }; #define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) static void gst_gamma_packed_rgb_ip (GstGamma * gamma, guint8 * data) { gint i, j, height; gint width, row_stride, row_wrap; gint pixel_stride; const guint8 *table = gamma->gamma_table; gint offsets[3]; gint r, g, b; gint y, u, v; offsets[0] = gst_video_format_get_component_offset (gamma->format, 0, gamma->width, gamma->height); offsets[1] = gst_video_format_get_component_offset (gamma->format, 1, gamma->width, gamma->height); offsets[2] = gst_video_format_get_component_offset (gamma->format, 2, gamma->width, gamma->height); width = gst_video_format_get_component_width (gamma->format, 0, gamma->width); height = gst_video_format_get_component_height (gamma->format, 0, gamma->height); row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width); pixel_stride = gst_video_format_get_pixel_stride (gamma->format, 0); row_wrap = row_stride - pixel_stride * width; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { r = data[offsets[0]]; g = data[offsets[1]]; b = data[offsets[2]]; y = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 0, r, g, b); u = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 1, r, g, b); v = APPLY_MATRIX (cog_rgb_to_ycbcr_matrix_8bit_sdtv, 2, r, g, b); y = table[CLAMP (y, 0, 255)]; r = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 0, y, u, v); g = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 1, y, u, v); b = APPLY_MATRIX (cog_ycbcr_to_rgb_matrix_8bit_sdtv, 2, y, u, v); data[offsets[0]] = CLAMP (r, 0, 255); data[offsets[1]] = CLAMP (g, 0, 255); data[offsets[2]] = CLAMP (b, 0, 255); data += pixel_stride; } data += row_wrap; } } static gboolean gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstGamma *gamma = GST_GAMMA (base); GST_DEBUG_OBJECT (gamma, "setting caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); if (!gst_video_format_parse_caps (incaps, &gamma->format, &gamma->width, &gamma->height)) goto invalid_caps; gamma->size = gst_video_format_get_size (gamma->format, gamma->width, gamma->height); switch (gamma->format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_NV12: case GST_VIDEO_FORMAT_NV21: gamma->process = gst_gamma_planar_yuv_ip; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_UYVY: case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_YVYU: gamma->process = gst_gamma_packed_yuv_ip; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: gamma->process = gst_gamma_packed_rgb_ip; break; default: goto invalid_caps; break; } return TRUE; invalid_caps: GST_ERROR_OBJECT (gamma, "Invalid caps: %" GST_PTR_FORMAT, incaps); return FALSE; } static void gst_gamma_before_transform (GstBaseTransform * base, GstBuffer * outbuf) { GstGamma *gamma = GST_GAMMA (base); GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (outbuf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (gamma, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (gamma), stream_time); } static GstFlowReturn gst_gamma_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstGamma *gamma = GST_GAMMA (base); guint8 *data; guint size; if (!gamma->process) goto not_negotiated; if (base->passthrough) goto done; data = GST_BUFFER_DATA (outbuf); size = GST_BUFFER_SIZE (outbuf); if (size != gamma->size) goto wrong_size; GST_OBJECT_LOCK (gamma); gamma->process (gamma, data); GST_OBJECT_UNLOCK (gamma); done: return GST_FLOW_OK; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (gamma, STREAM, FORMAT, (NULL), ("Invalid buffer size %d, expected %d", size, gamma->size)); return GST_FLOW_ERROR; } not_negotiated: { GST_ERROR_OBJECT (gamma, "Not negotiated yet"); return GST_FLOW_NOT_NEGOTIATED; } } gst-plugins-good-0.10.31/gst/rtsp/0000755000175000017500000000000011720565311013645 500000000000000gst-plugins-good-0.10.31/gst/rtsp/gstrtsp.h0000644000175000017500000000427011671175354015460 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_RTSP_H__ #define __GST_RTSP_H__ G_BEGIN_DECLS G_END_DECLS #endif /* __GST_RTSP_H__ */ gst-plugins-good-0.10.31/gst/rtsp/gstrtsp.c0000644000175000017500000000550711671175354015457 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include "gstrtpdec.h" #include "gstrtspsrc.h" static gboolean plugin_init (GstPlugin * plugin) { #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ if (!gst_element_register (plugin, "rtspsrc", GST_RANK_NONE, GST_TYPE_RTSPSRC)) return FALSE; if (!gst_element_register (plugin, "rtpdec", GST_RANK_NONE, GST_TYPE_RTP_DEC)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "rtsp", "transfer data via RTSP", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/rtsp/gstrtspext.c0000644000175000017500000001701411671175354016174 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #include "gstrtspext.h" GST_DEBUG_CATEGORY_STATIC (rtspext_debug); #define GST_CAT_DEFAULT (rtspext_debug) static GList *extensions; static gboolean gst_rtsp_ext_list_filter (GstPluginFeature * feature, gpointer user_data) { GstElementFactory *factory; guint rank; /* we only care about element factories */ if (!GST_IS_ELEMENT_FACTORY (feature)) return FALSE; factory = GST_ELEMENT_FACTORY (feature); if (!gst_element_factory_has_interface (factory, "GstRTSPExtension")) return FALSE; /* only select elements with autoplugging rank */ rank = gst_plugin_feature_get_rank (feature); if (rank < GST_RANK_MARGINAL) return FALSE; return TRUE; } void gst_rtsp_ext_list_init (void) { GST_DEBUG_CATEGORY_INIT (rtspext_debug, "rtspext", 0, "RTSP extension"); /* get a list of all extensions */ extensions = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_rtsp_ext_list_filter, FALSE, NULL); } GstRTSPExtensionList * gst_rtsp_ext_list_get (void) { GstRTSPExtensionList *result; GList *walk; result = g_new0 (GstRTSPExtensionList, 1); for (walk = extensions; walk; walk = g_list_next (walk)) { GstElementFactory *factory = GST_ELEMENT_FACTORY (walk->data); GstElement *element; element = gst_element_factory_create (factory, NULL); if (!element) { GST_ERROR ("could not create extension instance"); continue; } GST_DEBUG ("added extension interface for '%s'", GST_ELEMENT_NAME (element)); result->extensions = g_list_prepend (result->extensions, element); } return result; } void gst_rtsp_ext_list_free (GstRTSPExtensionList * ext) { GList *walk; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; gst_object_unref (GST_OBJECT_CAST (elem)); } g_list_free (ext->extensions); g_free (ext); } gboolean gst_rtsp_ext_list_detect_server (GstRTSPExtensionList * ext, GstRTSPMessage * resp) { GList *walk; gboolean res = TRUE; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_detect_server (elem, resp); } return res; } GstRTSPResult gst_rtsp_ext_list_before_send (GstRTSPExtensionList * ext, GstRTSPMessage * req) { GList *walk; GstRTSPResult res = GST_RTSP_OK; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_before_send (elem, req); } return res; } GstRTSPResult gst_rtsp_ext_list_after_send (GstRTSPExtensionList * ext, GstRTSPMessage * req, GstRTSPMessage * resp) { GList *walk; GstRTSPResult res = GST_RTSP_OK; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_after_send (elem, req, resp); } return res; } GstRTSPResult gst_rtsp_ext_list_parse_sdp (GstRTSPExtensionList * ext, GstSDPMessage * sdp, GstStructure * s) { GList *walk; GstRTSPResult res = GST_RTSP_OK; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_parse_sdp (elem, sdp, s); } return res; } GstRTSPResult gst_rtsp_ext_list_setup_media (GstRTSPExtensionList * ext, GstSDPMedia * media) { GList *walk; GstRTSPResult res = GST_RTSP_OK; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_setup_media (elem, media); } return res; } gboolean gst_rtsp_ext_list_configure_stream (GstRTSPExtensionList * ext, GstCaps * caps) { GList *walk; gboolean res = TRUE; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_configure_stream (elem, caps); if (!res) break; } return res; } GstRTSPResult gst_rtsp_ext_list_get_transports (GstRTSPExtensionList * ext, GstRTSPLowerTrans protocols, gchar ** transport) { GList *walk; GstRTSPResult res = GST_RTSP_OK; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_get_transports (elem, protocols, transport); } return res; } GstRTSPResult gst_rtsp_ext_list_stream_select (GstRTSPExtensionList * ext, GstRTSPUrl * url) { GList *walk; GstRTSPResult res = GST_RTSP_OK; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_stream_select (elem, url); } return res; } void gst_rtsp_ext_list_connect (GstRTSPExtensionList * ext, const gchar * detailed_signal, GCallback c_handler, gpointer data) { GList *walk; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; g_signal_connect (elem, detailed_signal, c_handler, data); } } GstRTSPResult gst_rtsp_ext_list_receive_request (GstRTSPExtensionList * ext, GstRTSPMessage * req) { GList *walk; GstRTSPResult res = GST_RTSP_ENOTIMPL; for (walk = ext->extensions; walk; walk = g_list_next (walk)) { GstRTSPExtension *elem = (GstRTSPExtension *) walk->data; res = gst_rtsp_extension_receive_request (elem, req); if (res != GST_RTSP_ENOTIMPL) break; } return res; } gst-plugins-good-0.10.31/gst/rtsp/gstrtspsrc.c0000644000175000017500000060370611707324552016170 00000000000000/* GStreamer * Copyright (C) <2005,2006> Wim Taymans * <2006> Lutz Mueller * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ /** * SECTION:element-rtspsrc * * Makes a connection to an RTSP server and read the data. * rtspsrc strictly follows RFC 2326 and therefore does not (yet) support * RealMedia/Quicktime/Microsoft extensions. * * RTSP supports transport over TCP or UDP in unicast or multicast mode. By * default rtspsrc will negotiate a connection in the following order: * UDP unicast/UDP multicast/TCP. The order cannot be changed but the allowed * protocols can be controlled with the #GstRTSPSrc:protocols property. * * rtspsrc currently understands SDP as the format of the session description. * For each stream listed in the SDP a new rtp_stream%d pad will be created * with caps derived from the SDP media description. This is a caps of mime type * "application/x-rtp" that can be connected to any available RTP depayloader * element. * * rtspsrc will internally instantiate an RTP session manager element * that will handle the RTCP messages to and from the server, jitter removal, * packet reordering along with providing a clock for the pipeline. * This feature is implemented using the gstrtpbin element. * * rtspsrc acts like a live source and will therefore only generate data in the * PLAYING state. * * * Example launch line * |[ * gst-launch rtspsrc location=rtsp://some.server/url ! fakesink * ]| Establish a connection to an RTSP server and send the raw RTP packets to a * fakesink. * * * Last reviewed on 2006-08-18 (0.10.5) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #include #include #include #include #include #include #include "gst/gst-i18n-plugin.h" #include "gstrtspsrc.h" #ifdef G_OS_WIN32 #include #endif GST_DEBUG_CATEGORY_STATIC (rtspsrc_debug); #define GST_CAT_DEFAULT (rtspsrc_debug) static GstStaticPadTemplate rtptemplate = GST_STATIC_PAD_TEMPLATE ("stream%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp; application/x-rdt")); /* templates used internally */ static GstStaticPadTemplate anysrctemplate = GST_STATIC_PAD_TEMPLATE ("internalsrc%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate anysinktemplate = GST_STATIC_PAD_TEMPLATE ("internalsink%d", GST_PAD_SINK, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); enum { /* FILL ME */ LAST_SIGNAL }; enum _GstRtspSrcRtcpSyncMode { RTCP_SYNC_ALWAYS, RTCP_SYNC_INITIAL, RTCP_SYNC_RTP }; enum _GstRtspSrcBufferMode { BUFFER_MODE_NONE, BUFFER_MODE_SLAVE, BUFFER_MODE_BUFFER, BUFFER_MODE_AUTO }; #define GST_TYPE_RTSP_SRC_BUFFER_MODE (gst_rtsp_src_buffer_mode_get_type()) static GType gst_rtsp_src_buffer_mode_get_type (void) { static GType buffer_mode_type = 0; static const GEnumValue buffer_modes[] = { {BUFFER_MODE_NONE, "Only use RTP timestamps", "none"}, {BUFFER_MODE_SLAVE, "Slave receiver to sender clock", "slave"}, {BUFFER_MODE_BUFFER, "Do low/high watermark buffering", "buffer"}, {BUFFER_MODE_AUTO, "Choose mode depending on stream live", "auto"}, {0, NULL, NULL}, }; if (!buffer_mode_type) { buffer_mode_type = g_enum_register_static ("GstRTSPSrcBufferMode", buffer_modes); } return buffer_mode_type; } #define DEFAULT_LOCATION NULL #define DEFAULT_PROTOCOLS GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST | GST_RTSP_LOWER_TRANS_TCP #define DEFAULT_DEBUG FALSE #define DEFAULT_RETRY 20 #define DEFAULT_TIMEOUT 5000000 #define DEFAULT_UDP_BUFFER_SIZE 0x80000 #define DEFAULT_TCP_TIMEOUT 20000000 #define DEFAULT_LATENCY_MS 2000 #define DEFAULT_CONNECTION_SPEED 0 #define DEFAULT_NAT_METHOD GST_RTSP_NAT_DUMMY #define DEFAULT_DO_RTCP TRUE #define DEFAULT_PROXY NULL #define DEFAULT_RTP_BLOCKSIZE 0 #define DEFAULT_USER_ID NULL #define DEFAULT_USER_PW NULL #define DEFAULT_BUFFER_MODE BUFFER_MODE_AUTO #define DEFAULT_PORT_RANGE NULL #define DEFAULT_SHORT_HEADER FALSE enum { PROP_0, PROP_LOCATION, PROP_PROTOCOLS, PROP_DEBUG, PROP_RETRY, PROP_TIMEOUT, PROP_TCP_TIMEOUT, PROP_LATENCY, PROP_CONNECTION_SPEED, PROP_NAT_METHOD, PROP_DO_RTCP, PROP_PROXY, PROP_RTP_BLOCKSIZE, PROP_USER_ID, PROP_USER_PW, PROP_BUFFER_MODE, PROP_PORT_RANGE, PROP_UDP_BUFFER_SIZE, PROP_SHORT_HEADER, PROP_LAST }; #define GST_TYPE_RTSP_NAT_METHOD (gst_rtsp_nat_method_get_type()) static GType gst_rtsp_nat_method_get_type (void) { static GType rtsp_nat_method_type = 0; static const GEnumValue rtsp_nat_method[] = { {GST_RTSP_NAT_NONE, "None", "none"}, {GST_RTSP_NAT_DUMMY, "Send Dummy packets", "dummy"}, {0, NULL, NULL}, }; if (!rtsp_nat_method_type) { rtsp_nat_method_type = g_enum_register_static ("GstRTSPNatMethod", rtsp_nat_method); } return rtsp_nat_method_type; } static void gst_rtspsrc_finalize (GObject * object); static void gst_rtspsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtspsrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtspsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); static void gst_rtspsrc_sdp_attributes_to_caps (GArray * attributes, GstCaps * caps); static gboolean gst_rtspsrc_set_proxy (GstRTSPSrc * rtsp, const gchar * proxy); static void gst_rtspsrc_set_tcp_timeout (GstRTSPSrc * rtspsrc, guint64 timeout); static GstCaps *gst_rtspsrc_media_to_caps (gint pt, const GstSDPMedia * media); static GstStateChangeReturn gst_rtspsrc_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtspsrc_send_event (GstElement * element, GstEvent * event); static void gst_rtspsrc_handle_message (GstBin * bin, GstMessage * message); static gboolean gst_rtspsrc_setup_auth (GstRTSPSrc * src, GstRTSPMessage * response); static void gst_rtspsrc_loop_send_cmd (GstRTSPSrc * src, gint cmd, gboolean flush); static GstRTSPResult gst_rtspsrc_send_cb (GstRTSPExtension * ext, GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPSrc * src); static GstRTSPResult gst_rtspsrc_open (GstRTSPSrc * src, gboolean async); static GstRTSPResult gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async); static GstRTSPResult gst_rtspsrc_pause (GstRTSPSrc * src, gboolean idle, gboolean async); static GstRTSPResult gst_rtspsrc_close (GstRTSPSrc * src, gboolean async, gboolean only_close); static gboolean gst_rtspsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri); static gboolean gst_rtspsrc_activate_streams (GstRTSPSrc * src); static gboolean gst_rtspsrc_loop (GstRTSPSrc * src); static gboolean gst_rtspsrc_stream_push_event (GstRTSPSrc * src, GstRTSPStream * stream, GstEvent * event, gboolean source); static gboolean gst_rtspsrc_push_event (GstRTSPSrc * src, GstEvent * event, gboolean source); /* commands we send to out loop to notify it of events */ #define CMD_OPEN 0 #define CMD_PLAY 1 #define CMD_PAUSE 2 #define CMD_CLOSE 3 #define CMD_WAIT 4 #define CMD_RECONNECT 5 #define CMD_LOOP 6 #define GST_ELEMENT_PROGRESS(el, type, code, text) \ G_STMT_START { \ gchar *__txt = _gst_element_error_printf text; \ gst_element_post_message (GST_ELEMENT_CAST (el), \ gst_message_new_progress (GST_OBJECT_CAST (el), \ GST_PROGRESS_TYPE_ ##type, code, __txt)); \ g_free (__txt); \ } G_STMT_END /*static guint gst_rtspsrc_signals[LAST_SIGNAL] = { 0 }; */ static void _do_init (GType rtspsrc_type) { static const GInterfaceInfo urihandler_info = { gst_rtspsrc_uri_handler_init, NULL, NULL }; GST_DEBUG_CATEGORY_INIT (rtspsrc_debug, "rtspsrc", 0, "RTSP src"); g_type_add_interface_static (rtspsrc_type, GST_TYPE_URI_HANDLER, &urihandler_info); } GST_BOILERPLATE_FULL (GstRTSPSrc, gst_rtspsrc, GstBin, GST_TYPE_BIN, _do_init); static void gst_rtspsrc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &rtptemplate); gst_element_class_set_details_simple (element_class, "RTSP packet receiver", "Source/Network", "Receive data over the network via RTSP (RFC 2326)", "Wim Taymans , " "Thijs Vermeir , " "Lutz Mueller "); } static void gst_rtspsrc_class_init (GstRTSPSrcClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBinClass *gstbin_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbin_class = (GstBinClass *) klass; gobject_class->set_property = gst_rtspsrc_set_property; gobject_class->get_property = gst_rtspsrc_get_property; gobject_class->finalize = gst_rtspsrc_finalize; g_object_class_install_property (gobject_class, PROP_LOCATION, g_param_spec_string ("location", "RTSP Location", "Location of the RTSP url to read", DEFAULT_LOCATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PROTOCOLS, g_param_spec_flags ("protocols", "Protocols", "Allowed lower transport protocols", GST_TYPE_RTSP_LOWER_TRANS, DEFAULT_PROTOCOLS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEBUG, g_param_spec_boolean ("debug", "Debug", "Dump request and response messages to stdout", DEFAULT_DEBUG, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RETRY, g_param_spec_uint ("retry", "Retry", "Max number of retries when allocating RTP ports.", 0, G_MAXUINT16, DEFAULT_RETRY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TIMEOUT, g_param_spec_uint64 ("timeout", "Timeout", "Retry TCP transport after UDP timeout microseconds (0 = disabled)", 0, G_MAXUINT64, DEFAULT_TIMEOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TCP_TIMEOUT, g_param_spec_uint64 ("tcp-timeout", "TCP Timeout", "Fail after timeout microseconds on TCP connections (0 = disabled)", 0, G_MAXUINT64, DEFAULT_TCP_TIMEOUT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_LATENCY, g_param_spec_uint ("latency", "Buffer latency in ms", "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED, g_param_spec_uint ("connection-speed", "Connection Speed", "Network connection speed in kbps (0 = unknown)", 0, G_MAXINT / 1000, DEFAULT_CONNECTION_SPEED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NAT_METHOD, g_param_spec_enum ("nat-method", "NAT Method", "Method to use for traversing firewalls and NAT", GST_TYPE_RTSP_NAT_METHOD, DEFAULT_NAT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::do-rtcp * * Enable RTCP support. Some old server don't like RTCP and then this property * needs to be set to FALSE. * * Since: 0.10.15 */ g_object_class_install_property (gobject_class, PROP_DO_RTCP, g_param_spec_boolean ("do-rtcp", "Do RTCP", "Send RTCP packets, disable for old incompatible server.", DEFAULT_DO_RTCP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::proxy * * Set the proxy parameters. This has to be a string of the format * [http://][user:passwd@]host[:port]. * * Since: 0.10.15 */ g_object_class_install_property (gobject_class, PROP_PROXY, g_param_spec_string ("proxy", "Proxy", "Proxy settings for HTTP tunneling. Format: [http://][user:passwd@]host[:port]", DEFAULT_PROXY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::rtp_blocksize * * RTP package size to suggest to server. * * Since: 0.10.16 */ g_object_class_install_property (gobject_class, PROP_RTP_BLOCKSIZE, g_param_spec_uint ("rtp-blocksize", "RTP Blocksize", "RTP package size to suggest to server (0 = disabled)", 0, 65536, DEFAULT_RTP_BLOCKSIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_ID, g_param_spec_string ("user-id", "user-id", "RTSP location URI user id for authentication", DEFAULT_USER_ID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USER_PW, g_param_spec_string ("user-pw", "user-pw", "RTSP location URI user password for authentication", DEFAULT_USER_PW, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::buffer-mode: * * Control the buffering and timestamping mode used by the jitterbuffer. * * Since: 0.10.22 */ g_object_class_install_property (gobject_class, PROP_BUFFER_MODE, g_param_spec_enum ("buffer-mode", "Buffer Mode", "Control the buffering algorithm in use", GST_TYPE_RTSP_SRC_BUFFER_MODE, DEFAULT_BUFFER_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::port-range: * * Configure the client port numbers that can be used to recieve RTP and * RTCP. * * Since: 0.10.25 */ g_object_class_install_property (gobject_class, PROP_PORT_RANGE, g_param_spec_string ("port-range", "Port range", "Client port range that can be used to receive RTP and RTCP data, " "eg. 3000-3005 (NULL = no restrictions)", DEFAULT_PORT_RANGE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::udp-buffer-size: * * Size of the kernel UDP receive buffer in bytes. * * Since: 0.10.26 */ g_object_class_install_property (gobject_class, PROP_UDP_BUFFER_SIZE, g_param_spec_int ("udp-buffer-size", "UDP Buffer Size", "Size of the kernel UDP receive buffer in bytes, 0=default", 0, G_MAXINT, DEFAULT_UDP_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTSPSrc::short-header: * * Only send the basic RTSP headers for broken encoders. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_SHORT_HEADER, g_param_spec_boolean ("short-header", "Short Header", "Only send the basic RTSP headers for broken encoders", DEFAULT_SHORT_HEADER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->send_event = gst_rtspsrc_send_event; gstelement_class->change_state = gst_rtspsrc_change_state; gstbin_class->handle_message = gst_rtspsrc_handle_message; gst_rtsp_ext_list_init (); } static void gst_rtspsrc_init (GstRTSPSrc * src, GstRTSPSrcClass * g_class) { #ifdef G_OS_WIN32 WSADATA wsa_data; if (WSAStartup (MAKEWORD (2, 2), &wsa_data) != 0) { GST_ERROR_OBJECT (src, "WSAStartup failed: 0x%08x", WSAGetLastError ()); } #endif src->conninfo.location = g_strdup (DEFAULT_LOCATION); src->protocols = DEFAULT_PROTOCOLS; src->debug = DEFAULT_DEBUG; src->retry = DEFAULT_RETRY; src->udp_timeout = DEFAULT_TIMEOUT; gst_rtspsrc_set_tcp_timeout (src, DEFAULT_TCP_TIMEOUT); src->latency = DEFAULT_LATENCY_MS; src->connection_speed = DEFAULT_CONNECTION_SPEED; src->nat_method = DEFAULT_NAT_METHOD; src->do_rtcp = DEFAULT_DO_RTCP; gst_rtspsrc_set_proxy (src, DEFAULT_PROXY); src->rtp_blocksize = DEFAULT_RTP_BLOCKSIZE; src->user_id = g_strdup (DEFAULT_USER_ID); src->user_pw = g_strdup (DEFAULT_USER_PW); src->buffer_mode = DEFAULT_BUFFER_MODE; src->client_port_range.min = 0; src->client_port_range.max = 0; src->udp_buffer_size = DEFAULT_UDP_BUFFER_SIZE; src->short_header = DEFAULT_SHORT_HEADER; /* get a list of all extensions */ src->extensions = gst_rtsp_ext_list_get (); /* connect to send signal */ gst_rtsp_ext_list_connect (src->extensions, "send", (GCallback) gst_rtspsrc_send_cb, src); /* protects the streaming thread in interleaved mode or the polling * thread in UDP mode. */ src->stream_rec_lock = g_new (GStaticRecMutex, 1); g_static_rec_mutex_init (src->stream_rec_lock); /* protects our state changes from multiple invocations */ src->state_rec_lock = g_new (GStaticRecMutex, 1); g_static_rec_mutex_init (src->state_rec_lock); src->state = GST_RTSP_STATE_INVALID; GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } static void gst_rtspsrc_finalize (GObject * object) { GstRTSPSrc *rtspsrc; rtspsrc = GST_RTSPSRC (object); gst_rtsp_ext_list_free (rtspsrc->extensions); g_free (rtspsrc->conninfo.location); gst_rtsp_url_free (rtspsrc->conninfo.url); g_free (rtspsrc->conninfo.url_str); g_free (rtspsrc->user_id); g_free (rtspsrc->user_pw); if (rtspsrc->sdp) { gst_sdp_message_free (rtspsrc->sdp); rtspsrc->sdp = NULL; } /* free locks */ g_static_rec_mutex_free (rtspsrc->stream_rec_lock); g_free (rtspsrc->stream_rec_lock); g_static_rec_mutex_free (rtspsrc->state_rec_lock); g_free (rtspsrc->state_rec_lock); #ifdef G_OS_WIN32 WSACleanup (); #endif G_OBJECT_CLASS (parent_class)->finalize (object); } /* a proxy string of the format [user:passwd@]host[:port] */ static gboolean gst_rtspsrc_set_proxy (GstRTSPSrc * rtsp, const gchar * proxy) { gchar *p, *at, *col; g_free (rtsp->proxy_user); rtsp->proxy_user = NULL; g_free (rtsp->proxy_passwd); rtsp->proxy_passwd = NULL; g_free (rtsp->proxy_host); rtsp->proxy_host = NULL; rtsp->proxy_port = 0; p = (gchar *) proxy; if (p == NULL) return TRUE; /* we allow http:// in front but ignore it */ if (g_str_has_prefix (p, "http://")) p += 7; at = strchr (p, '@'); if (at) { /* look for user:passwd */ col = strchr (proxy, ':'); if (col == NULL || col > at) return FALSE; rtsp->proxy_user = g_strndup (p, col - p); col++; rtsp->proxy_passwd = g_strndup (col, at - col); /* move to host */ p = at + 1; } col = strchr (p, ':'); if (col) { /* everything before the colon is the hostname */ rtsp->proxy_host = g_strndup (p, col - p); p = col + 1; rtsp->proxy_port = strtoul (p, (char **) &p, 10); } else { rtsp->proxy_host = g_strdup (p); rtsp->proxy_port = 8080; } return TRUE; } static void gst_rtspsrc_set_tcp_timeout (GstRTSPSrc * rtspsrc, guint64 timeout) { rtspsrc->tcp_timeout.tv_sec = timeout / G_USEC_PER_SEC; rtspsrc->tcp_timeout.tv_usec = timeout % G_USEC_PER_SEC; if (timeout != 0) rtspsrc->ptcp_timeout = &rtspsrc->tcp_timeout; else rtspsrc->ptcp_timeout = NULL; } static void gst_rtspsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRTSPSrc *rtspsrc; rtspsrc = GST_RTSPSRC (object); switch (prop_id) { case PROP_LOCATION: gst_rtspsrc_uri_set_uri (GST_URI_HANDLER (rtspsrc), g_value_get_string (value)); break; case PROP_PROTOCOLS: rtspsrc->protocols = g_value_get_flags (value); break; case PROP_DEBUG: rtspsrc->debug = g_value_get_boolean (value); break; case PROP_RETRY: rtspsrc->retry = g_value_get_uint (value); break; case PROP_TIMEOUT: rtspsrc->udp_timeout = g_value_get_uint64 (value); break; case PROP_TCP_TIMEOUT: gst_rtspsrc_set_tcp_timeout (rtspsrc, g_value_get_uint64 (value)); break; case PROP_LATENCY: rtspsrc->latency = g_value_get_uint (value); break; case PROP_CONNECTION_SPEED: rtspsrc->connection_speed = g_value_get_uint (value); break; case PROP_NAT_METHOD: rtspsrc->nat_method = g_value_get_enum (value); break; case PROP_DO_RTCP: rtspsrc->do_rtcp = g_value_get_boolean (value); break; case PROP_PROXY: gst_rtspsrc_set_proxy (rtspsrc, g_value_get_string (value)); break; case PROP_RTP_BLOCKSIZE: rtspsrc->rtp_blocksize = g_value_get_uint (value); break; case PROP_USER_ID: if (rtspsrc->user_id) g_free (rtspsrc->user_id); rtspsrc->user_id = g_value_dup_string (value); break; case PROP_USER_PW: if (rtspsrc->user_pw) g_free (rtspsrc->user_pw); rtspsrc->user_pw = g_value_dup_string (value); break; case PROP_BUFFER_MODE: rtspsrc->buffer_mode = g_value_get_enum (value); break; case PROP_PORT_RANGE: { const gchar *str; str = g_value_get_string (value); if (str) { sscanf (str, "%u-%u", &rtspsrc->client_port_range.min, &rtspsrc->client_port_range.max); } else { rtspsrc->client_port_range.min = 0; rtspsrc->client_port_range.max = 0; } break; } case PROP_UDP_BUFFER_SIZE: rtspsrc->udp_buffer_size = g_value_get_int (value); break; case PROP_SHORT_HEADER: rtspsrc->short_header = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtspsrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRTSPSrc *rtspsrc; rtspsrc = GST_RTSPSRC (object); switch (prop_id) { case PROP_LOCATION: g_value_set_string (value, rtspsrc->conninfo.location); break; case PROP_PROTOCOLS: g_value_set_flags (value, rtspsrc->protocols); break; case PROP_DEBUG: g_value_set_boolean (value, rtspsrc->debug); break; case PROP_RETRY: g_value_set_uint (value, rtspsrc->retry); break; case PROP_TIMEOUT: g_value_set_uint64 (value, rtspsrc->udp_timeout); break; case PROP_TCP_TIMEOUT: { guint64 timeout; timeout = rtspsrc->tcp_timeout.tv_sec * G_USEC_PER_SEC + rtspsrc->tcp_timeout.tv_usec; g_value_set_uint64 (value, timeout); break; } case PROP_LATENCY: g_value_set_uint (value, rtspsrc->latency); break; case PROP_CONNECTION_SPEED: g_value_set_uint (value, rtspsrc->connection_speed); break; case PROP_NAT_METHOD: g_value_set_enum (value, rtspsrc->nat_method); break; case PROP_DO_RTCP: g_value_set_boolean (value, rtspsrc->do_rtcp); break; case PROP_PROXY: { gchar *str; if (rtspsrc->proxy_host) { str = g_strdup_printf ("%s:%d", rtspsrc->proxy_host, rtspsrc->proxy_port); } else { str = NULL; } g_value_take_string (value, str); break; } case PROP_RTP_BLOCKSIZE: g_value_set_uint (value, rtspsrc->rtp_blocksize); break; case PROP_USER_ID: g_value_set_string (value, rtspsrc->user_id); break; case PROP_USER_PW: g_value_set_string (value, rtspsrc->user_pw); break; case PROP_BUFFER_MODE: g_value_set_enum (value, rtspsrc->buffer_mode); break; case PROP_PORT_RANGE: { gchar *str; if (rtspsrc->client_port_range.min != 0) { str = g_strdup_printf ("%u-%u", rtspsrc->client_port_range.min, rtspsrc->client_port_range.max); } else { str = NULL; } g_value_take_string (value, str); break; } case PROP_UDP_BUFFER_SIZE: g_value_set_int (value, rtspsrc->udp_buffer_size); break; case PROP_SHORT_HEADER: g_value_set_boolean (value, rtspsrc->short_header); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gint find_stream_by_id (GstRTSPStream * stream, gint * id) { if (stream->id == *id) return 0; return -1; } static gint find_stream_by_channel (GstRTSPStream * stream, gint * channel) { if (stream->channel[0] == *channel || stream->channel[1] == *channel) return 0; return -1; } static gint find_stream_by_pt (GstRTSPStream * stream, gint * pt) { if (stream->pt == *pt) return 0; return -1; } static gint find_stream_by_udpsrc (GstRTSPStream * stream, gconstpointer a) { GstElement *src = (GstElement *) a; if (stream->udpsrc[0] == src) return 0; if (stream->udpsrc[1] == src) return 0; return -1; } static gint find_stream_by_setup (GstRTSPStream * stream, gconstpointer a) { /* check qualified setup_url */ if (!strcmp (stream->conninfo.location, (gchar *) a)) return 0; /* check original control_url */ if (!strcmp (stream->control_url, (gchar *) a)) return 0; /* check if qualified setup_url ends with string */ if (g_str_has_suffix (stream->control_url, (gchar *) a)) return 0; return -1; } static GstRTSPStream * find_stream (GstRTSPSrc * src, gconstpointer data, gconstpointer func) { GList *lstream; /* find and get stream */ if ((lstream = g_list_find_custom (src->streams, data, (GCompareFunc) func))) return (GstRTSPStream *) lstream->data; return NULL; } static const GstSDPBandwidth * gst_rtspsrc_get_bandwidth (GstRTSPSrc * src, const GstSDPMessage * sdp, const GstSDPMedia * media, const gchar * type) { guint i, len; /* first look in the media specific section */ len = gst_sdp_media_bandwidths_len (media); for (i = 0; i < len; i++) { const GstSDPBandwidth *bw = gst_sdp_media_get_bandwidth (media, i); if (strcmp (bw->bwtype, type) == 0) return bw; } /* then look in the message specific section */ len = gst_sdp_message_bandwidths_len (sdp); for (i = 0; i < len; i++) { const GstSDPBandwidth *bw = gst_sdp_message_get_bandwidth (sdp, i); if (strcmp (bw->bwtype, type) == 0) return bw; } return NULL; } static void gst_rtspsrc_collect_bandwidth (GstRTSPSrc * src, const GstSDPMessage * sdp, const GstSDPMedia * media, GstRTSPStream * stream) { const GstSDPBandwidth *bw; if ((bw = gst_rtspsrc_get_bandwidth (src, sdp, media, GST_SDP_BWTYPE_AS))) stream->as_bandwidth = bw->bandwidth; else stream->as_bandwidth = -1; if ((bw = gst_rtspsrc_get_bandwidth (src, sdp, media, GST_SDP_BWTYPE_RR))) stream->rr_bandwidth = bw->bandwidth; else stream->rr_bandwidth = -1; if ((bw = gst_rtspsrc_get_bandwidth (src, sdp, media, GST_SDP_BWTYPE_RS))) stream->rs_bandwidth = bw->bandwidth; else stream->rs_bandwidth = -1; } static void gst_rtspsrc_do_stream_connection (GstRTSPSrc * src, GstRTSPStream * stream, const GstSDPConnection * conn) { if (conn->nettype == NULL || strcmp (conn->nettype, "IN") != 0) return; if (conn->addrtype == NULL) return; /* check for IPV6 */ if (strcmp (conn->addrtype, "IP4") == 0) stream->is_ipv6 = FALSE; else if (strcmp (conn->addrtype, "IP6") == 0) stream->is_ipv6 = TRUE; else return; /* save address */ g_free (stream->destination); stream->destination = g_strdup (conn->address); /* check for multicast */ stream->is_multicast = gst_sdp_address_is_multicast (conn->nettype, conn->addrtype, conn->address); stream->ttl = conn->ttl; } /* Go over the connections for a stream. * - If we are dealing with IPV6, we will setup IPV6 sockets for sending and * receiving. * - If we are dealing with a localhost address, we disable multicast */ static void gst_rtspsrc_collect_connections (GstRTSPSrc * src, const GstSDPMessage * sdp, const GstSDPMedia * media, GstRTSPStream * stream) { const GstSDPConnection *conn; guint i, len; /* first look in the media specific section */ len = gst_sdp_media_connections_len (media); for (i = 0; i < len; i++) { conn = gst_sdp_media_get_connection (media, i); gst_rtspsrc_do_stream_connection (src, stream, conn); } /* then look in the message specific section */ if ((conn = gst_sdp_message_get_connection (sdp))) { gst_rtspsrc_do_stream_connection (src, stream, conn); } } static GstRTSPStream * gst_rtspsrc_create_stream (GstRTSPSrc * src, GstSDPMessage * sdp, gint idx) { GstRTSPStream *stream; const gchar *control_url; const gchar *payload; const GstSDPMedia *media; /* get media, should not return NULL */ media = gst_sdp_message_get_media (sdp, idx); if (media == NULL) return NULL; stream = g_new0 (GstRTSPStream, 1); stream->parent = src; /* we mark the pad as not linked, we will mark it as OK when we add the pad to * the element. */ stream->last_ret = GST_FLOW_NOT_LINKED; stream->added = FALSE; stream->disabled = FALSE; stream->id = src->numstreams++; stream->eos = FALSE; stream->discont = TRUE; stream->seqbase = -1; stream->timebase = -1; /* collect bandwidth information for this steam. FIXME, configure in the RTP * session manager to scale RTCP. */ gst_rtspsrc_collect_bandwidth (src, sdp, media, stream); /* collect connection info */ gst_rtspsrc_collect_connections (src, sdp, media, stream); /* we must have a payload. No payload means we cannot create caps */ /* FIXME, handle multiple formats. The problem here is that we just want to * take the first available format that we can handle but in order to do that * we need to scan for depayloader plugins. Scanning for payloader plugins is * also suboptimal because the user maybe just wants to save the raw stream * and then we don't care. */ if ((payload = gst_sdp_media_get_format (media, 0))) { stream->pt = atoi (payload); /* convert caps */ stream->caps = gst_rtspsrc_media_to_caps (stream->pt, media); GST_DEBUG ("mapping sdp session level attributes to caps"); gst_rtspsrc_sdp_attributes_to_caps (sdp->attributes, stream->caps); GST_DEBUG ("mapping sdp media level attributes to caps"); gst_rtspsrc_sdp_attributes_to_caps (media->attributes, stream->caps); if (stream->pt >= 96) { /* If we have a dynamic payload type, see if we have a stream with the * same payload number. If there is one, they are part of the same * container and we only need to add one pad. */ if (find_stream (src, &stream->pt, (gpointer) find_stream_by_pt)) { stream->container = TRUE; GST_DEBUG ("found another stream with pt %d, marking as container", stream->pt); } } } /* collect port number */ stream->port = gst_sdp_media_get_port (media); /* get control url to construct the setup url. The setup url is used to * configure the transport of the stream and is used to identity the stream in * the RTP-Info header field returned from PLAY. */ control_url = gst_sdp_media_get_attribute_val (media, "control"); if (control_url == NULL) control_url = gst_sdp_message_get_attribute_val_n (sdp, "control", 0); GST_DEBUG_OBJECT (src, "stream %d, (%p)", stream->id, stream); GST_DEBUG_OBJECT (src, " pt: %d", stream->pt); GST_DEBUG_OBJECT (src, " port: %d", stream->port); GST_DEBUG_OBJECT (src, " container: %d", stream->container); GST_DEBUG_OBJECT (src, " caps: %" GST_PTR_FORMAT, stream->caps); GST_DEBUG_OBJECT (src, " control: %s", GST_STR_NULL (control_url)); if (control_url != NULL) { stream->control_url = g_strdup (control_url); /* Build a fully qualified url using the content_base if any or by prefixing * the original request. * If the control_url starts with a '/' or a non rtsp: protocol we will most * likely build a URL that the server will fail to understand, this is ok, * we will fail then. */ if (g_str_has_prefix (control_url, "rtsp://")) stream->conninfo.location = g_strdup (control_url); else { const gchar *base; gboolean has_slash; if (g_strcmp0 (control_url, "*") == 0) control_url = ""; if (src->control) base = src->control; else if (src->content_base) base = src->content_base; else if (src->conninfo.url_str) base = src->conninfo.url_str; else base = "/"; /* check if the base ends or control starts with / */ has_slash = g_str_has_prefix (control_url, "/"); has_slash = has_slash || g_str_has_suffix (base, "/"); /* concatenate the two strings, insert / when not present */ stream->conninfo.location = g_strdup_printf ("%s%s%s", base, has_slash ? "" : "/", control_url); } } GST_DEBUG_OBJECT (src, " setup: %s", GST_STR_NULL (stream->conninfo.location)); /* we keep track of all streams */ src->streams = g_list_append (src->streams, stream); return stream; /* ERRORS */ } static void gst_rtspsrc_stream_free (GstRTSPSrc * src, GstRTSPStream * stream) { gint i; GST_DEBUG_OBJECT (src, "free stream %p", stream); if (stream->caps) gst_caps_unref (stream->caps); g_free (stream->destination); g_free (stream->control_url); g_free (stream->conninfo.location); for (i = 0; i < 2; i++) { if (stream->udpsrc[i]) { gst_element_set_state (stream->udpsrc[i], GST_STATE_NULL); gst_bin_remove (GST_BIN_CAST (src), stream->udpsrc[i]); gst_object_unref (stream->udpsrc[i]); stream->udpsrc[i] = NULL; } if (stream->channelpad[i]) { gst_object_unref (stream->channelpad[i]); stream->channelpad[i] = NULL; } if (stream->udpsink[i]) { gst_element_set_state (stream->udpsink[i], GST_STATE_NULL); gst_bin_remove (GST_BIN_CAST (src), stream->udpsink[i]); gst_object_unref (stream->udpsink[i]); stream->udpsink[i] = NULL; } } if (stream->fakesrc) { gst_element_set_state (stream->fakesrc, GST_STATE_NULL); gst_bin_remove (GST_BIN_CAST (src), stream->fakesrc); gst_object_unref (stream->fakesrc); stream->fakesrc = NULL; } if (stream->srcpad) { gst_pad_set_active (stream->srcpad, FALSE); if (stream->added) { gst_element_remove_pad (GST_ELEMENT_CAST (src), stream->srcpad); stream->added = FALSE; } stream->srcpad = NULL; } if (stream->rtcppad) { gst_object_unref (stream->rtcppad); stream->rtcppad = NULL; } if (stream->session) { g_object_unref (stream->session); stream->session = NULL; } g_free (stream); } static void gst_rtspsrc_cleanup (GstRTSPSrc * src) { GList *walk; GST_DEBUG_OBJECT (src, "cleanup"); for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; gst_rtspsrc_stream_free (src, stream); } g_list_free (src->streams); src->streams = NULL; if (src->manager) { if (src->manager_sig_id) { g_signal_handler_disconnect (src->manager, src->manager_sig_id); src->manager_sig_id = 0; } gst_element_set_state (src->manager, GST_STATE_NULL); gst_bin_remove (GST_BIN_CAST (src), src->manager); src->manager = NULL; } src->numstreams = 0; if (src->props) gst_structure_free (src->props); src->props = NULL; g_free (src->content_base); src->content_base = NULL; g_free (src->control); src->control = NULL; if (src->range) gst_rtsp_range_free (src->range); src->range = NULL; /* don't clear the SDP when it was used in the url */ if (src->sdp && !src->from_sdp) { gst_sdp_message_free (src->sdp); src->sdp = NULL; } } #define PARSE_INT(p, del, res) \ G_STMT_START { \ gchar *t = p; \ p = strstr (p, del); \ if (p == NULL) \ res = -1; \ else { \ *p = '\0'; \ p++; \ res = atoi (t); \ } \ } G_STMT_END #define PARSE_STRING(p, del, res) \ G_STMT_START { \ gchar *t = p; \ p = strstr (p, del); \ if (p == NULL) { \ res = NULL; \ p = t; \ } \ else { \ *p = '\0'; \ p++; \ res = t; \ } \ } G_STMT_END #define SKIP_SPACES(p) \ while (*p && g_ascii_isspace (*p)) \ p++; /* rtpmap contains: * * /[/] */ static gboolean gst_rtspsrc_parse_rtpmap (const gchar * rtpmap, gint * payload, gchar ** name, gint * rate, gchar ** params) { gchar *p, *t; p = (gchar *) rtpmap; PARSE_INT (p, " ", *payload); if (*payload == -1) return FALSE; SKIP_SPACES (p); if (*p == '\0') return FALSE; PARSE_STRING (p, "/", *name); if (*name == NULL) { GST_DEBUG ("no rate, name %s", p); /* no rate, assume -1 then, this is not supposed to happen but RealMedia * streams seem to omit the rate. */ *name = p; *rate = -1; return TRUE; } t = p; p = strstr (p, "/"); if (p == NULL) { *rate = atoi (t); return TRUE; } *p = '\0'; p++; *rate = atoi (t); t = p; if (*p == '\0') return TRUE; *params = t; return TRUE; } /* * Mapping SDP attributes to caps * * prepend 'a-' to IANA registered sdp attributes names * (ie: not prefixed with 'x-') in order to avoid * collision with gstreamer standard caps properties names */ static void gst_rtspsrc_sdp_attributes_to_caps (GArray * attributes, GstCaps * caps) { if (attributes->len > 0) { GstStructure *s; guint i; s = gst_caps_get_structure (caps, 0); for (i = 0; i < attributes->len; i++) { GstSDPAttribute *attr = &g_array_index (attributes, GstSDPAttribute, i); gchar *tofree, *key; key = attr->key; /* skip some of the attribute we already handle */ if (!strcmp (key, "fmtp")) continue; if (!strcmp (key, "rtpmap")) continue; if (!strcmp (key, "control")) continue; if (!strcmp (key, "range")) continue; /* string must be valid UTF8 */ if (!g_utf8_validate (attr->value, -1, NULL)) continue; if (!g_str_has_prefix (key, "x-")) tofree = key = g_strdup_printf ("a-%s", key); else tofree = NULL; GST_DEBUG ("adding caps: %s=%s", key, attr->value); gst_structure_set (s, key, G_TYPE_STRING, attr->value, NULL); g_free (tofree); } } } /* * Mapping of caps to and from SDP fields: * * m= RTP/AVP * a=rtpmap: /[/] * a=fmtp: [=];... */ static GstCaps * gst_rtspsrc_media_to_caps (gint pt, const GstSDPMedia * media) { GstCaps *caps; const gchar *rtpmap; const gchar *fmtp; gchar *name = NULL; gint rate = -1; gchar *params = NULL; gchar *tmp; GstStructure *s; gint payload = 0; gboolean ret; /* get and parse rtpmap */ if ((rtpmap = gst_sdp_media_get_attribute_val (media, "rtpmap"))) { ret = gst_rtspsrc_parse_rtpmap (rtpmap, &payload, &name, &rate, ¶ms); if (ret) { if (payload != pt) { /* we ignore the rtpmap if the payload type is different. */ g_warning ("rtpmap of wrong payload type, ignoring"); name = NULL; rate = -1; params = NULL; } } else { /* if we failed to parse the rtpmap for a dynamic payload type, we have an * error */ if (pt >= 96) goto no_rtpmap; /* else we can ignore */ g_warning ("error parsing rtpmap, ignoring"); } } else { /* dynamic payloads need rtpmap or we fail */ if (pt >= 96) goto no_rtpmap; } /* check if we have a rate, if not, we need to look up the rate from the * default rates based on the payload types. */ if (rate == -1) { const GstRTPPayloadInfo *info; if (GST_RTP_PAYLOAD_IS_DYNAMIC (pt)) { /* dynamic types, use media and encoding_name */ tmp = g_ascii_strdown (media->media, -1); info = gst_rtp_payload_info_for_name (tmp, name); g_free (tmp); } else { /* static types, use payload type */ info = gst_rtp_payload_info_for_pt (pt); } if (info) { if ((rate = info->clock_rate) == 0) rate = -1; } /* we fail if we cannot find one */ if (rate == -1) goto no_rate; } tmp = g_ascii_strdown (media->media, -1); caps = gst_caps_new_simple ("application/x-unknown", "media", G_TYPE_STRING, tmp, "payload", G_TYPE_INT, pt, NULL); g_free (tmp); s = gst_caps_get_structure (caps, 0); gst_structure_set (s, "clock-rate", G_TYPE_INT, rate, NULL); /* encoding name must be upper case */ if (name != NULL) { tmp = g_ascii_strup (name, -1); gst_structure_set (s, "encoding-name", G_TYPE_STRING, tmp, NULL); g_free (tmp); } /* params must be lower case */ if (params != NULL) { tmp = g_ascii_strdown (params, -1); gst_structure_set (s, "encoding-params", G_TYPE_STRING, tmp, NULL); g_free (tmp); } /* parse optional fmtp: field */ if ((fmtp = gst_sdp_media_get_attribute_val (media, "fmtp"))) { gchar *p; gint payload = 0; p = (gchar *) fmtp; /* p is now of the format [=];... */ PARSE_INT (p, " ", payload); if (payload != -1 && payload == pt) { gchar **pairs; gint i; /* [=] are separated with ';' */ pairs = g_strsplit (p, ";", 0); for (i = 0; pairs[i]; i++) { gchar *valpos; const gchar *val, *key; /* the key may not have a '=', the value can have other '='s */ valpos = strstr (pairs[i], "="); if (valpos) { /* we have a '=' and thus a value, remove the '=' with \0 */ *valpos = '\0'; /* value is everything between '=' and ';'. We split the pairs at ; * boundaries so we can take the remainder of the value. Some servers * put spaces around the value which we strip off here. Alternatively * we could strip those spaces in the depayloaders should these spaces * actually carry any meaning in the future. */ val = g_strstrip (valpos + 1); } else { /* simple ;.. is translated into =1;... */ val = "1"; } /* strip the key of spaces, convert key to lowercase but not the value. */ key = g_strstrip (pairs[i]); if (strlen (key) > 1) { tmp = g_ascii_strdown (key, -1); gst_structure_set (s, tmp, G_TYPE_STRING, val, NULL); g_free (tmp); } } g_strfreev (pairs); } } return caps; /* ERRORS */ no_rtpmap: { g_warning ("rtpmap type not given for dynamic payload %d", pt); return NULL; } no_rate: { g_warning ("rate unknown for payload type %d", pt); return NULL; } } static gboolean gst_rtspsrc_alloc_udp_ports (GstRTSPStream * stream, gint * rtpport, gint * rtcpport) { GstRTSPSrc *src; GstStateChangeReturn ret; GstElement *udpsrc0, *udpsrc1; gint tmp_rtp, tmp_rtcp; guint count; const gchar *host; src = stream->parent; udpsrc0 = NULL; udpsrc1 = NULL; count = 0; /* Start at next port */ tmp_rtp = src->next_port_num; if (stream->is_ipv6) host = "udp://[::0]"; else host = "udp://0.0.0.0"; /* try to allocate 2 UDP ports, the RTP port should be an even * number and the RTCP port should be the next (uneven) port */ again: if (tmp_rtp != 0 && src->client_port_range.max > 0 && tmp_rtp >= src->client_port_range.max) goto no_ports; udpsrc0 = gst_element_make_from_uri (GST_URI_SRC, host, NULL); if (udpsrc0 == NULL) goto no_udp_protocol; g_object_set (G_OBJECT (udpsrc0), "port", tmp_rtp, "reuse", FALSE, NULL); if (src->udp_buffer_size != 0) g_object_set (G_OBJECT (udpsrc0), "buffer-size", src->udp_buffer_size, NULL); ret = gst_element_set_state (udpsrc0, GST_STATE_PAUSED); if (ret == GST_STATE_CHANGE_FAILURE) { if (tmp_rtp != 0) { GST_DEBUG_OBJECT (src, "Unable to make udpsrc from RTP port %d", tmp_rtp); tmp_rtp += 2; if (++count > src->retry) goto no_ports; GST_DEBUG_OBJECT (src, "free RTP udpsrc"); gst_element_set_state (udpsrc0, GST_STATE_NULL); gst_object_unref (udpsrc0); GST_DEBUG_OBJECT (src, "retry %d", count); goto again; } goto no_udp_protocol; } g_object_get (G_OBJECT (udpsrc0), "port", &tmp_rtp, NULL); GST_DEBUG_OBJECT (src, "got RTP port %d", tmp_rtp); /* check if port is even */ if ((tmp_rtp & 0x01) != 0) { /* port not even, close and allocate another */ if (++count > src->retry) goto no_ports; GST_DEBUG_OBJECT (src, "RTP port not even"); GST_DEBUG_OBJECT (src, "free RTP udpsrc"); gst_element_set_state (udpsrc0, GST_STATE_NULL); gst_object_unref (udpsrc0); GST_DEBUG_OBJECT (src, "retry %d", count); tmp_rtp++; goto again; } /* allocate port+1 for RTCP now */ udpsrc1 = gst_element_make_from_uri (GST_URI_SRC, host, NULL); if (udpsrc1 == NULL) goto no_udp_rtcp_protocol; /* set port */ tmp_rtcp = tmp_rtp + 1; if (src->client_port_range.max > 0 && tmp_rtcp >= src->client_port_range.max) goto no_ports; g_object_set (G_OBJECT (udpsrc1), "port", tmp_rtcp, "reuse", FALSE, NULL); GST_DEBUG_OBJECT (src, "starting RTCP on port %d", tmp_rtcp); ret = gst_element_set_state (udpsrc1, GST_STATE_PAUSED); /* tmp_rtcp port is busy already : retry to make rtp/rtcp pair */ if (ret == GST_STATE_CHANGE_FAILURE) { GST_DEBUG_OBJECT (src, "Unable to make udpsrc from RTCP port %d", tmp_rtcp); if (++count > src->retry) goto no_ports; GST_DEBUG_OBJECT (src, "free RTP udpsrc"); gst_element_set_state (udpsrc0, GST_STATE_NULL); gst_object_unref (udpsrc0); GST_DEBUG_OBJECT (src, "free RTCP udpsrc"); gst_element_set_state (udpsrc1, GST_STATE_NULL); gst_object_unref (udpsrc1); udpsrc1 = NULL; tmp_rtp += 2; GST_DEBUG_OBJECT (src, "retry %d", count); goto again; } /* all fine, do port check */ g_object_get (G_OBJECT (udpsrc0), "port", rtpport, NULL); g_object_get (G_OBJECT (udpsrc1), "port", rtcpport, NULL); /* this should not happen... */ if (*rtpport != tmp_rtp || *rtcpport != tmp_rtcp) goto port_error; /* we keep these elements, we configure all in configure_transport when the * server told us to really use the UDP ports. */ stream->udpsrc[0] = gst_object_ref (udpsrc0); stream->udpsrc[1] = gst_object_ref (udpsrc1); /* keep track of next available port number when we have a range * configured */ if (src->next_port_num != 0) src->next_port_num = tmp_rtcp + 1; /* they are ours now */ gst_object_sink (udpsrc0); gst_object_sink (udpsrc1); return TRUE; /* ERRORS */ no_udp_protocol: { GST_DEBUG_OBJECT (src, "could not get UDP source"); goto cleanup; } no_ports: { GST_DEBUG_OBJECT (src, "could not allocate UDP port pair after %d retries", count); goto cleanup; } no_udp_rtcp_protocol: { GST_DEBUG_OBJECT (src, "could not get UDP source for RTCP"); goto cleanup; } port_error: { GST_DEBUG_OBJECT (src, "ports don't match rtp: %d<->%d, rtcp: %d<->%d", tmp_rtp, *rtpport, tmp_rtcp, *rtcpport); goto cleanup; } cleanup: { if (udpsrc0) { gst_element_set_state (udpsrc0, GST_STATE_NULL); gst_object_unref (udpsrc0); } if (udpsrc1) { gst_element_set_state (udpsrc1, GST_STATE_NULL); gst_object_unref (udpsrc1); } return FALSE; } } static void gst_rtspsrc_flush (GstRTSPSrc * src, gboolean flush, gboolean playing) { GstEvent *event; gint cmd, i; GstState state; GList *walk; GstClock *clock; GstClockTime base_time = GST_CLOCK_TIME_NONE; if (flush) { event = gst_event_new_flush_start (); GST_DEBUG_OBJECT (src, "start flush"); cmd = CMD_WAIT; state = GST_STATE_PAUSED; } else { event = gst_event_new_flush_stop (); GST_DEBUG_OBJECT (src, "stop flush; playing %d", playing); cmd = CMD_LOOP; if (playing) state = GST_STATE_PLAYING; else state = GST_STATE_PAUSED; clock = gst_element_get_clock (GST_ELEMENT_CAST (src)); if (clock) { base_time = gst_clock_get_time (clock); gst_object_unref (clock); } } gst_rtspsrc_push_event (src, event, FALSE); gst_rtspsrc_loop_send_cmd (src, cmd, flush); /* set up manager before data-flow resumes */ /* to manage jitterbuffer buffer mode */ if (src->manager) { gst_element_set_base_time (GST_ELEMENT_CAST (src->manager), base_time); /* and to have base_time trickle further down, * e.g. to jitterbuffer for its timeout handling */ if (base_time != -1) gst_element_set_state (GST_ELEMENT_CAST (src->manager), state); } /* make running time start start at 0 again */ for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; for (i = 0; i < 2; i++) { /* for udp case */ if (stream->udpsrc[i]) { if (base_time != -1) gst_element_set_base_time (stream->udpsrc[i], base_time); gst_element_set_state (stream->udpsrc[i], state); } } } /* for tcp interleaved case */ if (base_time != -1) gst_element_set_base_time (GST_ELEMENT_CAST (src), base_time); } static GstRTSPResult gst_rtspsrc_connection_send (GstRTSPSrc * src, GstRTSPConnection * conn, GstRTSPMessage * message, GTimeVal * timeout) { GstRTSPResult ret; if (conn) ret = gst_rtsp_connection_send (conn, message, timeout); else ret = GST_RTSP_ERROR; return ret; } static GstRTSPResult gst_rtspsrc_connection_receive (GstRTSPSrc * src, GstRTSPConnection * conn, GstRTSPMessage * message, GTimeVal * timeout) { GstRTSPResult ret; if (conn) ret = gst_rtsp_connection_receive (conn, message, timeout); else ret = GST_RTSP_ERROR; return ret; } static void gst_rtspsrc_get_position (GstRTSPSrc * src) { GstQuery *query; GList *walk; query = gst_query_new_position (GST_FORMAT_TIME); /* should be known somewhere down the stream (e.g. jitterbuffer) */ for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; GstFormat fmt; gint64 pos; if (stream->srcpad) { if (gst_pad_query (stream->srcpad, query)) { gst_query_parse_position (query, &fmt, &pos); GST_DEBUG_OBJECT (src, "retaining position %" GST_TIME_FORMAT, GST_TIME_ARGS (pos)); src->last_pos = pos; return; } } } src->last_pos = 0; } static gboolean gst_rtspsrc_do_seek (GstRTSPSrc * src, GstSegment * segment) { src->state = GST_RTSP_STATE_SEEKING; /* PLAY will add the range header now. */ src->need_range = TRUE; return TRUE; } static gboolean gst_rtspsrc_perform_seek (GstRTSPSrc * src, GstEvent * event) { gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; gint64 cur, stop; gboolean flush, skip; gboolean update; gboolean playing; GstSegment seeksegment = { 0, }; GList *walk; if (event) { GST_DEBUG_OBJECT (src, "doing seek with event"); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* no negative rates yet */ if (rate < 0.0) goto negative_rate; /* we need TIME format */ if (format != src->segment.format) goto no_format; } else { GST_DEBUG_OBJECT (src, "doing seek without event"); flags = 0; cur_type = GST_SEEK_TYPE_SET; stop_type = GST_SEEK_TYPE_SET; } /* get flush flag */ flush = flags & GST_SEEK_FLAG_FLUSH; skip = flags & GST_SEEK_FLAG_SKIP; /* now we need to make sure the streaming thread is stopped. We do this by * either sending a FLUSH_START event downstream which will cause the * streaming thread to stop with a WRONG_STATE. * For a non-flushing seek we simply pause the task, which will happen as soon * as it completes one iteration (and thus might block when the sink is * blocking in preroll). */ if (flush) { GST_DEBUG_OBJECT (src, "starting flush"); gst_rtspsrc_flush (src, TRUE, FALSE); } else { if (src->task) { gst_task_pause (src->task); } } /* we should now be able to grab the streaming thread because we stopped it * with the above flush/pause code */ GST_RTSP_STREAM_LOCK (src); GST_DEBUG_OBJECT (src, "stopped streaming"); /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &src->segment, sizeof (GstSegment)); /* configure the seek parameters in the seeksegment. We will then have the * right values in the segment to perform the seek */ if (event) { GST_DEBUG_OBJECT (src, "configuring seek"); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); } /* figure out the last position we need to play. If it's configured (stop != * -1), use that, else we play until the total duration of the file */ if ((stop = seeksegment.stop) == -1) stop = seeksegment.duration; playing = (src->state == GST_RTSP_STATE_PLAYING); /* if we were playing, pause first */ if (playing) { /* obtain current position in case seek fails */ gst_rtspsrc_get_position (src); gst_rtspsrc_pause (src, FALSE, FALSE); } gst_rtspsrc_do_seek (src, &seeksegment); /* and continue playing */ if (playing) gst_rtspsrc_play (src, &seeksegment, FALSE); /* prepare for streaming again */ if (flush) { /* if we started flush, we stop now */ GST_DEBUG_OBJECT (src, "stopping flush"); gst_rtspsrc_flush (src, FALSE, playing); } else if (src->running) { /* re-engage loop */ gst_rtspsrc_loop_send_cmd (src, CMD_LOOP, FALSE); /* we are running the current segment and doing a non-flushing seek, * close the segment first based on the previous last_stop. */ GST_DEBUG_OBJECT (src, "closing running segment %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, src->segment.accum, src->segment.last_stop); /* queue the segment for sending in the stream thread */ if (src->close_segment) gst_event_unref (src->close_segment); src->close_segment = gst_event_new_new_segment (TRUE, src->segment.rate, src->segment.format, src->segment.accum, src->segment.last_stop, src->segment.accum); /* keep track of our last_stop */ seeksegment.accum = src->segment.last_stop; } /* now we did the seek and can activate the new segment values */ memcpy (&src->segment, &seeksegment, sizeof (GstSegment)); /* if we're doing a segment seek, post a SEGMENT_START message */ if (src->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (src), gst_message_new_segment_start (GST_OBJECT_CAST (src), src->segment.format, src->segment.last_stop)); } /* now create the newsegment */ GST_DEBUG_OBJECT (src, "Creating newsegment from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, src->segment.last_stop, stop); /* store the newsegment event so it can be sent from the streaming thread. */ if (src->start_segment) gst_event_unref (src->start_segment); src->start_segment = gst_event_new_new_segment (FALSE, src->segment.rate, src->segment.format, src->segment.last_stop, stop, src->segment.last_stop); /* mark discont */ GST_DEBUG_OBJECT (src, "mark DISCONT, we did a seek to another position"); for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; stream->discont = TRUE; } src->skip = skip; GST_RTSP_STREAM_UNLOCK (src); return TRUE; /* ERRORS */ negative_rate: { GST_DEBUG_OBJECT (src, "negative playback rates are not supported yet."); return FALSE; } no_format: { GST_DEBUG_OBJECT (src, "unsupported format given, seek aborted."); return FALSE; } } static gboolean gst_rtspsrc_handle_src_event (GstPad * pad, GstEvent * event) { GstRTSPSrc *src; gboolean res = TRUE; gboolean forward; src = GST_RTSPSRC_CAST (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (src, "pad %s:%s received event %s", GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: res = gst_rtspsrc_perform_seek (src, event); forward = FALSE; break; case GST_EVENT_QOS: case GST_EVENT_NAVIGATION: case GST_EVENT_LATENCY: default: forward = TRUE; break; } if (forward) { GstPad *target; if ((target = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (pad)))) { res = gst_pad_send_event (target, event); gst_object_unref (target); } else { gst_event_unref (event); } } else { gst_event_unref (event); } gst_object_unref (src); return res; } /* this is the final event function we receive on the internal source pad when * we deal with TCP connections */ static gboolean gst_rtspsrc_handle_internal_src_event (GstPad * pad, GstEvent * event) { gboolean res; GST_DEBUG_OBJECT (pad, "received event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: case GST_EVENT_QOS: case GST_EVENT_NAVIGATION: case GST_EVENT_LATENCY: default: gst_event_unref (event); res = TRUE; break; } return res; } /* this is the final query function we receive on the internal source pad when * we deal with TCP connections */ static gboolean gst_rtspsrc_handle_internal_src_query (GstPad * pad, GstQuery * query) { GstRTSPSrc *src; gboolean res = TRUE; src = GST_RTSPSRC_CAST (gst_pad_get_element_private (pad)); GST_DEBUG_OBJECT (src, "pad %s:%s received query %s", GST_DEBUG_PAD_NAME (pad), GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { /* no idea */ break; } case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: gst_query_set_duration (query, format, src->segment.duration); break; default: res = FALSE; break; } break; } case GST_QUERY_LATENCY: { /* we are live with a min latency of 0 and unlimited max latency, this * result will be updated by the session manager if there is any. */ gst_query_set_latency (query, TRUE, 0, -1); break; } default: break; } return res; } /* this query is executed on the ghost source pad exposed on rtspsrc. */ static gboolean gst_rtspsrc_handle_src_query (GstPad * pad, GstQuery * query) { GstRTSPSrc *src; gboolean res = FALSE; src = GST_RTSPSRC_CAST (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (src, "pad %s:%s received query %s", GST_DEBUG_PAD_NAME (pad), GST_QUERY_TYPE_NAME (query)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: gst_query_set_duration (query, format, src->segment.duration); res = TRUE; break; default: break; } break; } case GST_QUERY_SEEKING: { GstFormat format; gst_query_parse_seeking (query, &format, NULL, NULL, NULL); if (format == GST_FORMAT_TIME) { gboolean seekable = src->cur_protocols != GST_RTSP_LOWER_TRANS_UDP_MCAST; /* seeking without duration is unlikely */ seekable = seekable && src->seekable && src->segment.duration && GST_CLOCK_TIME_IS_VALID (src->segment.duration); /* FIXME ?? should we have 0 and segment.duration here; see demuxers */ gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, src->segment.start, src->segment.stop); res = TRUE; } break; } default: { GstPad *target = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (pad)); /* forward the query to the proxy target pad */ if (target) { res = gst_pad_query (target, query); gst_object_unref (target); } break; } } gst_object_unref (src); return res; } /* callback for RTCP messages to be sent to the server when operating in TCP * mode. */ static GstFlowReturn gst_rtspsrc_sink_chain (GstPad * pad, GstBuffer * buffer) { GstRTSPSrc *src; GstRTSPStream *stream; GstFlowReturn res = GST_FLOW_OK; guint8 *data; guint size; GstRTSPResult ret; GstRTSPMessage message = { 0 }; GstRTSPConnection *conn; stream = (GstRTSPStream *) gst_pad_get_element_private (pad); src = stream->parent; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); gst_rtsp_message_init_data (&message, stream->channel[1]); /* lend the body data to the message */ gst_rtsp_message_take_body (&message, data, size); if (stream->conninfo.connection) conn = stream->conninfo.connection; else conn = src->conninfo.connection; GST_DEBUG_OBJECT (src, "sending %u bytes RTCP", size); ret = gst_rtspsrc_connection_send (src, conn, &message, NULL); GST_DEBUG_OBJECT (src, "sent RTCP, %d", ret); /* and steal it away again because we will free it when unreffing the * buffer */ gst_rtsp_message_steal_body (&message, &data, &size); gst_rtsp_message_unset (&message); gst_buffer_unref (buffer); return res; } static void pad_unblocked (GstPad * pad, gboolean blocked, GstRTSPSrc * src) { GST_DEBUG_OBJECT (src, "pad %s:%s unblocked", GST_DEBUG_PAD_NAME (pad)); } static void pad_blocked (GstPad * pad, gboolean blocked, GstRTSPSrc * src) { GST_DEBUG_OBJECT (src, "pad %s:%s blocked, activating streams", GST_DEBUG_PAD_NAME (pad)); /* activate the streams */ GST_OBJECT_LOCK (src); if (!src->need_activate) goto was_ok; src->need_activate = FALSE; GST_OBJECT_UNLOCK (src); gst_rtspsrc_activate_streams (src); return; was_ok: { GST_OBJECT_UNLOCK (src); return; } } /* this callback is called when the session manager generated a new src pad with * payloaded RTP packets. We simply ghost the pad here. */ static void new_manager_pad (GstElement * manager, GstPad * pad, GstRTSPSrc * src) { gchar *name; GstPadTemplate *template; gint id, ssrc, pt; GList *lstream; GstRTSPStream *stream; gboolean all_added; GST_DEBUG_OBJECT (src, "got new manager pad %" GST_PTR_FORMAT, pad); GST_RTSP_STATE_LOCK (src); /* find stream */ name = gst_object_get_name (GST_OBJECT_CAST (pad)); if (sscanf (name, "recv_rtp_src_%d_%d_%d", &id, &ssrc, &pt) != 3) goto unknown_stream; GST_DEBUG_OBJECT (src, "stream: %u, SSRC %d, PT %d", id, ssrc, pt); stream = find_stream (src, &id, (gpointer) find_stream_by_id); if (stream == NULL) goto unknown_stream; /* create a new pad we will use to stream to */ template = gst_static_pad_template_get (&rtptemplate); stream->srcpad = gst_ghost_pad_new_from_template (name, pad, template); gst_object_unref (template); g_free (name); stream->added = TRUE; gst_pad_set_event_function (stream->srcpad, gst_rtspsrc_handle_src_event); gst_pad_set_query_function (stream->srcpad, gst_rtspsrc_handle_src_query); gst_pad_set_active (stream->srcpad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (src), stream->srcpad); /* check if we added all streams */ all_added = TRUE; for (lstream = src->streams; lstream; lstream = g_list_next (lstream)) { stream = (GstRTSPStream *) lstream->data; GST_DEBUG_OBJECT (src, "stream %p, container %d, disabled %d, added %d", stream, stream->container, stream->disabled, stream->added); /* a container stream only needs one pad added. Also disabled streams don't * count */ if (!stream->container && !stream->disabled && !stream->added) { all_added = FALSE; break; } } GST_RTSP_STATE_UNLOCK (src); if (all_added) { GST_DEBUG_OBJECT (src, "We added all streams"); /* when we get here, all stream are added and we can fire the no-more-pads * signal. */ gst_element_no_more_pads (GST_ELEMENT_CAST (src)); } return; /* ERRORS */ unknown_stream: { GST_DEBUG_OBJECT (src, "ignoring unknown stream"); GST_RTSP_STATE_UNLOCK (src); g_free (name); return; } } static GstCaps * request_pt_map (GstElement * manager, guint session, guint pt, GstRTSPSrc * src) { GstRTSPStream *stream; GstCaps *caps; GST_DEBUG_OBJECT (src, "getting pt map for pt %d in session %d", pt, session); GST_RTSP_STATE_LOCK (src); stream = find_stream (src, &session, (gpointer) find_stream_by_id); if (!stream) goto unknown_stream; caps = stream->caps; if (caps) gst_caps_ref (caps); GST_RTSP_STATE_UNLOCK (src); return caps; unknown_stream: { GST_DEBUG_OBJECT (src, "unknown stream %d", session); GST_RTSP_STATE_UNLOCK (src); return NULL; } } static void gst_rtspsrc_do_stream_eos (GstRTSPSrc * src, GstRTSPStream * stream) { GST_DEBUG_OBJECT (src, "setting stream for session %u to EOS", stream->id); if (stream->eos) goto was_eos; stream->eos = TRUE; gst_rtspsrc_stream_push_event (src, stream, gst_event_new_eos (), TRUE); return; /* ERRORS */ was_eos: { GST_DEBUG_OBJECT (src, "stream for session %u was already EOS", stream->id); return; } } static void on_bye_ssrc (GObject * session, GObject * source, GstRTSPStream * stream) { GstRTSPSrc *src = stream->parent; GST_DEBUG_OBJECT (src, "source in session %u received BYE", stream->id); gst_rtspsrc_do_stream_eos (src, stream); } static void on_timeout (GObject * session, GObject * source, GstRTSPStream * stream) { GstRTSPSrc *src = stream->parent; GST_DEBUG_OBJECT (src, "source in session %u timed out", stream->id); gst_rtspsrc_do_stream_eos (src, stream); } static void on_npt_stop (GstElement * rtpbin, guint session, guint ssrc, GstRTSPSrc * src) { GstRTSPStream *stream; GST_DEBUG_OBJECT (src, "source in session %u reached NPT stop", session); /* get stream for session */ stream = find_stream (src, &session, (gpointer) find_stream_by_id); if (stream) { gst_rtspsrc_do_stream_eos (src, stream); } } static void on_ssrc_active (GObject * session, GObject * source, GstRTSPStream * stream) { GST_DEBUG_OBJECT (stream->parent, "source in session %u is active", stream->id); } /* try to get and configure a manager */ static gboolean gst_rtspsrc_stream_configure_manager (GstRTSPSrc * src, GstRTSPStream * stream, GstRTSPTransport * transport) { const gchar *manager; gchar *name; GstStateChangeReturn ret; /* find a manager */ if (gst_rtsp_transport_get_manager (transport->trans, &manager, 0) < 0) goto no_manager; if (manager) { GST_DEBUG_OBJECT (src, "using manager %s", manager); /* configure the manager */ if (src->manager == NULL) { GObjectClass *klass; GstState target; if (!(src->manager = gst_element_factory_make (manager, NULL))) { /* fallback */ if (gst_rtsp_transport_get_manager (transport->trans, &manager, 1) < 0) goto no_manager; if (!manager) goto use_no_manager; if (!(src->manager = gst_element_factory_make (manager, NULL))) goto manager_failed; } /* we manage this element */ gst_bin_add (GST_BIN_CAST (src), src->manager); GST_OBJECT_LOCK (src); target = GST_STATE_TARGET (src); GST_OBJECT_UNLOCK (src); ret = gst_element_set_state (src->manager, target); if (ret == GST_STATE_CHANGE_FAILURE) goto start_manager_failure; g_object_set (src->manager, "latency", src->latency, NULL); klass = G_OBJECT_GET_CLASS (G_OBJECT (src->manager)); if (g_object_class_find_property (klass, "buffer-mode")) { if (src->buffer_mode != BUFFER_MODE_AUTO) { g_object_set (src->manager, "buffer-mode", src->buffer_mode, NULL); } else { gboolean need_slave; GstStructure *s; const gchar *encoding; /* buffer mode pauses are handled by adding offsets to buffer times, * but some depayloaders may have a hard time syncing output times * with such input times, e.g. container ones, most notably ASF */ /* TODO alternatives are having an event that indicates these shifts, * or having rtsp extensions provide suggestion on buffer mode */ need_slave = stream->container; if (stream->caps && (s = gst_caps_get_structure (stream->caps, 0)) && (encoding = gst_structure_get_string (s, "encoding-name"))) need_slave = need_slave || (strcmp (encoding, "X-ASF-PF") == 0); GST_DEBUG_OBJECT (src, "auto buffering mode, need_slave %d", need_slave); /* valid duration implies not likely live pipeline, * so slaving in jitterbuffer does not make much sense * (and might mess things up due to bursts) */ if (GST_CLOCK_TIME_IS_VALID (src->segment.duration) && src->segment.duration && !need_slave) { GST_DEBUG_OBJECT (src, "selected buffer"); g_object_set (src->manager, "buffer-mode", BUFFER_MODE_BUFFER, NULL); } else { GST_DEBUG_OBJECT (src, "selected slave"); g_object_set (src->manager, "buffer-mode", BUFFER_MODE_SLAVE, NULL); } } } /* connect to signals if we did not already do so */ GST_DEBUG_OBJECT (src, "connect to signals on session manager, stream %p", stream); src->manager_sig_id = g_signal_connect (src->manager, "pad-added", (GCallback) new_manager_pad, src); src->manager_ptmap_id = g_signal_connect (src->manager, "request-pt-map", (GCallback) request_pt_map, src); g_signal_connect (src->manager, "on-npt-stop", (GCallback) on_npt_stop, src); } /* we stream directly to the manager, get some pads. Each RTSP stream goes * into a separate RTP session. */ name = g_strdup_printf ("recv_rtp_sink_%d", stream->id); stream->channelpad[0] = gst_element_get_request_pad (src->manager, name); g_free (name); name = g_strdup_printf ("recv_rtcp_sink_%d", stream->id); stream->channelpad[1] = gst_element_get_request_pad (src->manager, name); g_free (name); /* now configure the bandwidth in the manager */ if (g_signal_lookup ("get-internal-session", G_OBJECT_TYPE (src->manager)) != 0) { GObject *rtpsession; g_signal_emit_by_name (src->manager, "get-internal-session", stream->id, &rtpsession); if (rtpsession) { GST_INFO_OBJECT (src, "configure bandwidth in session %p", rtpsession); stream->session = rtpsession; if (stream->as_bandwidth != -1) { GST_INFO_OBJECT (src, "setting AS: %f", (gdouble) (stream->as_bandwidth * 1000)); g_object_set (rtpsession, "bandwidth", (gdouble) (stream->as_bandwidth * 1000), NULL); } if (stream->rr_bandwidth != -1) { GST_INFO_OBJECT (src, "setting RR: %u", stream->rr_bandwidth); g_object_set (rtpsession, "rtcp-rr-bandwidth", stream->rr_bandwidth, NULL); } if (stream->rs_bandwidth != -1) { GST_INFO_OBJECT (src, "setting RS: %u", stream->rs_bandwidth); g_object_set (rtpsession, "rtcp-rs-bandwidth", stream->rs_bandwidth, NULL); } g_signal_connect (rtpsession, "on-bye-ssrc", (GCallback) on_bye_ssrc, stream); g_signal_connect (rtpsession, "on-bye-timeout", (GCallback) on_timeout, stream); g_signal_connect (rtpsession, "on-timeout", (GCallback) on_timeout, stream); g_signal_connect (rtpsession, "on-ssrc-active", (GCallback) on_ssrc_active, stream); } } } use_no_manager: return TRUE; /* ERRORS */ no_manager: { GST_DEBUG_OBJECT (src, "cannot get a session manager"); return FALSE; } manager_failed: { GST_DEBUG_OBJECT (src, "no session manager element %s found", manager); return FALSE; } start_manager_failure: { GST_DEBUG_OBJECT (src, "could not start session manager"); return FALSE; } } /* free the UDP sources allocated when negotiating a transport. * This function is called when the server negotiated to a transport where the * UDP sources are not needed anymore, such as TCP or multicast. */ static void gst_rtspsrc_stream_free_udp (GstRTSPStream * stream) { gint i; for (i = 0; i < 2; i++) { if (stream->udpsrc[i]) { gst_element_set_state (stream->udpsrc[i], GST_STATE_NULL); gst_object_unref (stream->udpsrc[i]); stream->udpsrc[i] = NULL; } } } /* for TCP, create pads to send and receive data to and from the manager and to * intercept various events and queries */ static gboolean gst_rtspsrc_stream_configure_tcp (GstRTSPSrc * src, GstRTSPStream * stream, GstRTSPTransport * transport, GstPad ** outpad) { gchar *name; GstPadTemplate *template; GstPad *pad0, *pad1; /* configure for interleaved delivery, nothing needs to be done * here, the loop function will call the chain functions of the * session manager. */ stream->channel[0] = transport->interleaved.min; stream->channel[1] = transport->interleaved.max; GST_DEBUG_OBJECT (src, "stream %p on channels %d-%d", stream, stream->channel[0], stream->channel[1]); /* we can remove the allocated UDP ports now */ gst_rtspsrc_stream_free_udp (stream); /* no session manager, send data to srcpad directly */ if (!stream->channelpad[0]) { GST_DEBUG_OBJECT (src, "no manager, creating pad"); /* create a new pad we will use to stream to */ name = g_strdup_printf ("stream%d", stream->id); template = gst_static_pad_template_get (&rtptemplate); stream->channelpad[0] = gst_pad_new_from_template (template, name); gst_object_unref (template); g_free (name); /* set caps and activate */ gst_pad_use_fixed_caps (stream->channelpad[0]); gst_pad_set_active (stream->channelpad[0], TRUE); *outpad = gst_object_ref (stream->channelpad[0]); } else { GST_DEBUG_OBJECT (src, "using manager source pad"); template = gst_static_pad_template_get (&anysrctemplate); /* allocate pads for sending the channel data into the manager */ pad0 = gst_pad_new_from_template (template, "internalsrc0"); gst_pad_link (pad0, stream->channelpad[0]); gst_object_unref (stream->channelpad[0]); stream->channelpad[0] = pad0; gst_pad_set_event_function (pad0, gst_rtspsrc_handle_internal_src_event); gst_pad_set_query_function (pad0, gst_rtspsrc_handle_internal_src_query); gst_pad_set_element_private (pad0, src); gst_pad_set_active (pad0, TRUE); if (stream->channelpad[1]) { /* if we have a sinkpad for the other channel, create a pad and link to the * manager. */ pad1 = gst_pad_new_from_template (template, "internalsrc1"); gst_pad_set_event_function (pad1, gst_rtspsrc_handle_internal_src_event); gst_pad_link (pad1, stream->channelpad[1]); gst_object_unref (stream->channelpad[1]); stream->channelpad[1] = pad1; gst_pad_set_active (pad1, TRUE); } gst_object_unref (template); } /* setup RTCP transport back to the server if we have to. */ if (src->manager && src->do_rtcp) { GstPad *pad; template = gst_static_pad_template_get (&anysinktemplate); stream->rtcppad = gst_pad_new_from_template (template, "internalsink0"); gst_pad_set_chain_function (stream->rtcppad, gst_rtspsrc_sink_chain); gst_pad_set_element_private (stream->rtcppad, stream); gst_pad_set_active (stream->rtcppad, TRUE); /* get session RTCP pad */ name = g_strdup_printf ("send_rtcp_src_%d", stream->id); pad = gst_element_get_request_pad (src->manager, name); g_free (name); /* and link */ if (pad) { gst_pad_link (pad, stream->rtcppad); gst_object_unref (pad); } gst_object_unref (template); } return TRUE; } static void gst_rtspsrc_get_transport_info (GstRTSPSrc * src, GstRTSPStream * stream, GstRTSPTransport * transport, const gchar ** destination, gint * min, gint * max, guint * ttl) { if (transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST) { if (destination) { if (!(*destination = transport->destination)) *destination = stream->destination; } if (min && max) { /* transport first */ *min = transport->port.min; *max = transport->port.max; if (*min == -1 && *max == -1) { /* then try from SDP */ if (stream->port != 0) { *min = stream->port; *max = stream->port + 1; } } } if (ttl) { if (!(*ttl = transport->ttl)) *ttl = stream->ttl; } } else { if (destination) { /* first take the source, then the endpoint to figure out where to send * the RTCP. */ if (!(*destination = transport->source)) { if (src->conninfo.connection) *destination = gst_rtsp_connection_get_ip (src->conninfo.connection); else if (stream->conninfo.connection) *destination = gst_rtsp_connection_get_ip (stream->conninfo.connection); } } if (min && max) { /* for unicast we only expect the ports here */ *min = transport->server_port.min; *max = transport->server_port.max; } } } /* For multicast create UDP sources and join the multicast group. */ static gboolean gst_rtspsrc_stream_configure_mcast (GstRTSPSrc * src, GstRTSPStream * stream, GstRTSPTransport * transport, GstPad ** outpad) { gchar *uri; const gchar *destination; gint min, max; GST_DEBUG_OBJECT (src, "creating UDP sources for multicast"); /* we can remove the allocated UDP ports now */ gst_rtspsrc_stream_free_udp (stream); gst_rtspsrc_get_transport_info (src, stream, transport, &destination, &min, &max, NULL); /* we need a destination now */ if (destination == NULL) goto no_destination; /* we really need ports now or we won't be able to receive anything at all */ if (min == -1 && max == -1) goto no_ports; GST_DEBUG_OBJECT (src, "have destination '%s' and ports (%d)-(%d)", destination, min, max); /* creating UDP source for RTP */ if (min != -1) { uri = g_strdup_printf ("udp://%s:%d", destination, min); stream->udpsrc[0] = gst_element_make_from_uri (GST_URI_SRC, uri, NULL); g_free (uri); if (stream->udpsrc[0] == NULL) goto no_element; /* take ownership */ gst_object_ref (stream->udpsrc[0]); gst_object_sink (stream->udpsrc[0]); /* change state */ gst_element_set_state (stream->udpsrc[0], GST_STATE_PAUSED); } /* creating another UDP source for RTCP */ if (max != -1) { uri = g_strdup_printf ("udp://%s:%d", destination, max); stream->udpsrc[1] = gst_element_make_from_uri (GST_URI_SRC, uri, NULL); g_free (uri); if (stream->udpsrc[1] == NULL) goto no_element; /* take ownership */ gst_object_ref (stream->udpsrc[1]); gst_object_sink (stream->udpsrc[1]); gst_element_set_state (stream->udpsrc[1], GST_STATE_PAUSED); } return TRUE; /* ERRORS */ no_element: { GST_DEBUG_OBJECT (src, "no UDP source element found"); return FALSE; } no_destination: { GST_DEBUG_OBJECT (src, "no destination found"); return FALSE; } no_ports: { GST_DEBUG_OBJECT (src, "no ports found"); return FALSE; } } /* configure the remainder of the UDP ports */ static gboolean gst_rtspsrc_stream_configure_udp (GstRTSPSrc * src, GstRTSPStream * stream, GstRTSPTransport * transport, GstPad ** outpad) { /* we manage the UDP elements now. For unicast, the UDP sources where * allocated in the stream when we suggested a transport. */ if (stream->udpsrc[0]) { gst_bin_add (GST_BIN_CAST (src), stream->udpsrc[0]); GST_DEBUG_OBJECT (src, "setting up UDP source"); /* configure a timeout on the UDP port. When the timeout message is * posted, we assume UDP transport is not possible. We reconnect using TCP * if we can. */ g_object_set (G_OBJECT (stream->udpsrc[0]), "timeout", src->udp_timeout, NULL); /* get output pad of the UDP source. */ *outpad = gst_element_get_static_pad (stream->udpsrc[0], "src"); /* save it so we can unblock */ stream->blockedpad = *outpad; /* configure pad block on the pad. As soon as there is dataflow on the * UDP source, we know that UDP is not blocked by a firewall and we can * configure all the streams to let the application autoplug decoders. */ gst_pad_set_blocked_async (stream->blockedpad, TRUE, (GstPadBlockCallback) pad_blocked, src); if (stream->channelpad[0]) { GST_DEBUG_OBJECT (src, "connecting UDP source 0 to manager"); /* configure for UDP delivery, we need to connect the UDP pads to * the session plugin. */ gst_pad_link (*outpad, stream->channelpad[0]); gst_object_unref (*outpad); *outpad = NULL; /* we connected to pad-added signal to get pads from the manager */ } else { GST_DEBUG_OBJECT (src, "using UDP src pad as output"); } } /* RTCP port */ if (stream->udpsrc[1]) { gst_bin_add (GST_BIN_CAST (src), stream->udpsrc[1]); if (stream->channelpad[1]) { GstPad *pad; GST_DEBUG_OBJECT (src, "connecting UDP source 1 to manager"); pad = gst_element_get_static_pad (stream->udpsrc[1], "src"); gst_pad_link (pad, stream->channelpad[1]); gst_object_unref (pad); } else { /* leave unlinked */ } } return TRUE; } /* configure the UDP sink back to the server for status reports */ static gboolean gst_rtspsrc_stream_configure_udp_sinks (GstRTSPSrc * src, GstRTSPStream * stream, GstRTSPTransport * transport) { GstPad *pad; gint rtp_port, rtcp_port, sockfd = -1; gboolean do_rtp, do_rtcp; const gchar *destination; gchar *uri, *name; guint ttl = 0; /* get transport info */ gst_rtspsrc_get_transport_info (src, stream, transport, &destination, &rtp_port, &rtcp_port, &ttl); /* see what we need to do */ do_rtp = (rtp_port != -1); /* it's possible that the server does not want us to send RTCP in which case * the port is -1 */ do_rtcp = (rtcp_port != -1 && src->manager != NULL && src->do_rtcp); /* we need a destination when we have RTP or RTCP ports */ if (destination == NULL && (do_rtp || do_rtcp)) goto no_destination; /* try to construct the fakesrc to the RTP port of the server to open up any * NAT firewalls */ if (do_rtp) { GST_DEBUG_OBJECT (src, "configure RTP UDP sink for %s:%d", destination, rtp_port); uri = g_strdup_printf ("udp://%s:%d", destination, rtp_port); stream->udpsink[0] = gst_element_make_from_uri (GST_URI_SINK, uri, NULL); g_free (uri); if (stream->udpsink[0] == NULL) goto no_sink_element; /* don't join multicast group, we will have the source socket do that */ /* no sync or async state changes needed */ g_object_set (G_OBJECT (stream->udpsink[0]), "auto-multicast", FALSE, "loop", FALSE, "sync", FALSE, "async", FALSE, NULL); if (ttl > 0) g_object_set (G_OBJECT (stream->udpsink[0]), "ttl", ttl, NULL); if (stream->udpsrc[0]) { /* configure socket, we give it the same UDP socket as the udpsrc for RTP * so that NAT firewalls will open a hole for us */ g_object_get (G_OBJECT (stream->udpsrc[0]), "sock", &sockfd, NULL); GST_DEBUG_OBJECT (src, "RTP UDP src has sock %d", sockfd); /* configure socket and make sure udpsink does not close it when shutting * down, it belongs to udpsrc after all. */ g_object_set (G_OBJECT (stream->udpsink[0]), "sockfd", sockfd, "closefd", FALSE, NULL); } /* the source for the dummy packets to open up NAT */ stream->fakesrc = gst_element_factory_make ("fakesrc", NULL); if (stream->fakesrc == NULL) goto no_fakesrc_element; /* random data in 5 buffers, a size of 200 bytes should be fine */ g_object_set (G_OBJECT (stream->fakesrc), "filltype", 3, "num-buffers", 5, "sizetype", 2, "sizemax", 200, "silent", TRUE, NULL); /* we don't want to consider this a sink */ GST_OBJECT_FLAG_UNSET (stream->udpsink[0], GST_ELEMENT_IS_SINK); /* keep everything locked */ gst_element_set_locked_state (stream->udpsink[0], TRUE); gst_element_set_locked_state (stream->fakesrc, TRUE); gst_object_ref (stream->udpsink[0]); gst_bin_add (GST_BIN_CAST (src), stream->udpsink[0]); gst_object_ref (stream->fakesrc); gst_bin_add (GST_BIN_CAST (src), stream->fakesrc); gst_element_link (stream->fakesrc, stream->udpsink[0]); } if (do_rtcp) { GST_DEBUG_OBJECT (src, "configure RTCP UDP sink for %s:%d", destination, rtcp_port); uri = g_strdup_printf ("udp://%s:%d", destination, rtcp_port); stream->udpsink[1] = gst_element_make_from_uri (GST_URI_SINK, uri, NULL); g_free (uri); if (stream->udpsink[1] == NULL) goto no_sink_element; /* don't join multicast group, we will have the source socket do that */ /* no sync or async state changes needed */ g_object_set (G_OBJECT (stream->udpsink[1]), "auto-multicast", FALSE, "loop", FALSE, "sync", FALSE, "async", FALSE, NULL); if (ttl > 0) g_object_set (G_OBJECT (stream->udpsink[0]), "ttl", ttl, NULL); if (stream->udpsrc[1]) { /* configure socket, we give it the same UDP socket as the udpsrc for RTCP * because some servers check the port number of where it sends RTCP to identify * the RTCP packets it receives */ g_object_get (G_OBJECT (stream->udpsrc[1]), "sock", &sockfd, NULL); GST_DEBUG_OBJECT (src, "RTCP UDP src has sock %d", sockfd); /* configure socket and make sure udpsink does not close it when shutting * down, it belongs to udpsrc after all. */ g_object_set (G_OBJECT (stream->udpsink[1]), "sockfd", sockfd, "closefd", FALSE, NULL); } /* we don't want to consider this a sink */ GST_OBJECT_FLAG_UNSET (stream->udpsink[1], GST_ELEMENT_IS_SINK); /* we keep this playing always */ gst_element_set_locked_state (stream->udpsink[1], TRUE); gst_element_set_state (stream->udpsink[1], GST_STATE_PLAYING); gst_object_ref (stream->udpsink[1]); gst_bin_add (GST_BIN_CAST (src), stream->udpsink[1]); stream->rtcppad = gst_element_get_static_pad (stream->udpsink[1], "sink"); /* get session RTCP pad */ name = g_strdup_printf ("send_rtcp_src_%d", stream->id); pad = gst_element_get_request_pad (src->manager, name); g_free (name); /* and link */ if (pad) { gst_pad_link (pad, stream->rtcppad); gst_object_unref (pad); } } return TRUE; /* ERRORS */ no_destination: { GST_DEBUG_OBJECT (src, "no destination address specified"); return FALSE; } no_sink_element: { GST_DEBUG_OBJECT (src, "no UDP sink element found"); return FALSE; } no_fakesrc_element: { GST_DEBUG_OBJECT (src, "no fakesrc element found"); return FALSE; } } /* sets up all elements needed for streaming over the specified transport. * Does not yet expose the element pads, this will be done when there is actuall * dataflow detected, which might never happen when UDP is blocked in a * firewall, for example. */ static gboolean gst_rtspsrc_stream_configure_transport (GstRTSPStream * stream, GstRTSPTransport * transport) { GstRTSPSrc *src; GstPad *outpad = NULL; GstPadTemplate *template; gchar *name; GstStructure *s; const gchar *mime; src = stream->parent; GST_DEBUG_OBJECT (src, "configuring transport for stream %p", stream); s = gst_caps_get_structure (stream->caps, 0); /* get the proper mime type for this stream now */ if (gst_rtsp_transport_get_mime (transport->trans, &mime) < 0) goto unknown_transport; if (!mime) goto unknown_transport; /* configure the final mime type */ GST_DEBUG_OBJECT (src, "setting mime to %s", mime); gst_structure_set_name (s, mime); /* try to get and configure a manager, channelpad[0-1] will be configured with * the pads for the manager, or NULL when no manager is needed. */ if (!gst_rtspsrc_stream_configure_manager (src, stream, transport)) goto no_manager; switch (transport->lower_transport) { case GST_RTSP_LOWER_TRANS_TCP: if (!gst_rtspsrc_stream_configure_tcp (src, stream, transport, &outpad)) goto transport_failed; break; case GST_RTSP_LOWER_TRANS_UDP_MCAST: if (!gst_rtspsrc_stream_configure_mcast (src, stream, transport, &outpad)) goto transport_failed; /* fallthrough, the rest is the same for UDP and MCAST */ case GST_RTSP_LOWER_TRANS_UDP: if (!gst_rtspsrc_stream_configure_udp (src, stream, transport, &outpad)) goto transport_failed; /* configure udpsinks back to the server for RTCP messages and for the * dummy RTP messages to open NAT. */ if (!gst_rtspsrc_stream_configure_udp_sinks (src, stream, transport)) goto transport_failed; break; default: goto unknown_transport; } if (outpad) { GST_DEBUG_OBJECT (src, "creating ghostpad"); gst_pad_use_fixed_caps (outpad); /* create ghostpad, don't add just yet, this will be done when we activate * the stream. */ name = g_strdup_printf ("stream%d", stream->id); template = gst_static_pad_template_get (&rtptemplate); stream->srcpad = gst_ghost_pad_new_from_template (name, outpad, template); gst_pad_set_event_function (stream->srcpad, gst_rtspsrc_handle_src_event); gst_pad_set_query_function (stream->srcpad, gst_rtspsrc_handle_src_query); gst_object_unref (template); g_free (name); gst_object_unref (outpad); } /* mark pad as ok */ stream->last_ret = GST_FLOW_OK; return TRUE; /* ERRORS */ transport_failed: { GST_DEBUG_OBJECT (src, "failed to configure transport"); return FALSE; } unknown_transport: { GST_DEBUG_OBJECT (src, "unknown transport"); return FALSE; } no_manager: { GST_DEBUG_OBJECT (src, "cannot get a session manager"); return FALSE; } } /* send a couple of dummy random packets on the receiver RTP port to the server, * this should make a firewall think we initiated the data transfer and * hopefully allow packets to go from the sender port to our RTP receiver port */ static gboolean gst_rtspsrc_send_dummy_packets (GstRTSPSrc * src) { GList *walk; if (src->nat_method != GST_RTSP_NAT_DUMMY) return TRUE; for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; if (stream->fakesrc && stream->udpsink[0]) { GST_DEBUG_OBJECT (src, "sending dummy packet to stream %p", stream); gst_element_set_state (stream->udpsink[0], GST_STATE_NULL); gst_element_set_state (stream->fakesrc, GST_STATE_NULL); gst_element_set_state (stream->udpsink[0], GST_STATE_PLAYING); gst_element_set_state (stream->fakesrc, GST_STATE_PLAYING); } } return TRUE; } /* Adds the source pads of all configured streams to the element. * This code is performed when we detected dataflow. * * We detect dataflow from either the _loop function or with pad probes on the * udp sources. */ static gboolean gst_rtspsrc_activate_streams (GstRTSPSrc * src) { GList *walk; GST_DEBUG_OBJECT (src, "activating streams"); for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; if (stream->udpsrc[0]) { /* remove timeout, we are streaming now and timeouts will be handled by * the session manager and jitter buffer */ g_object_set (G_OBJECT (stream->udpsrc[0]), "timeout", (guint64) 0, NULL); } if (stream->srcpad) { /* if we don't have a session manager, set the caps now. If we have a * session, we will get a notification of the pad and the caps. */ if (!src->manager) { GST_DEBUG_OBJECT (src, "setting pad caps for stream %p", stream); gst_pad_set_caps (stream->srcpad, stream->caps); } GST_DEBUG_OBJECT (src, "activating stream pad %p", stream); gst_pad_set_active (stream->srcpad, TRUE); /* add the pad */ if (!stream->added) { GST_DEBUG_OBJECT (src, "adding stream pad %p", stream); gst_element_add_pad (GST_ELEMENT_CAST (src), stream->srcpad); stream->added = TRUE; } } } /* unblock all pads */ for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; if (stream->blockedpad) { GST_DEBUG_OBJECT (src, "unblocking stream pad %p", stream); gst_pad_set_blocked_async (stream->blockedpad, FALSE, (GstPadBlockCallback) pad_unblocked, src); stream->blockedpad = NULL; } } return TRUE; } static void gst_rtspsrc_configure_caps (GstRTSPSrc * src, GstSegment * segment) { GList *walk; guint64 start, stop; gdouble play_speed, play_scale; GST_DEBUG_OBJECT (src, "configuring stream caps"); start = segment->last_stop; stop = segment->duration; play_speed = segment->rate; play_scale = segment->applied_rate; for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; GstCaps *caps; if ((caps = stream->caps)) { caps = gst_caps_make_writable (caps); /* update caps */ if (stream->timebase != -1) gst_caps_set_simple (caps, "clock-base", G_TYPE_UINT, (guint) stream->timebase, NULL); if (stream->seqbase != -1) gst_caps_set_simple (caps, "seqnum-base", G_TYPE_UINT, (guint) stream->seqbase, NULL); gst_caps_set_simple (caps, "npt-start", G_TYPE_UINT64, start, NULL); if (stop != -1) gst_caps_set_simple (caps, "npt-stop", G_TYPE_UINT64, stop, NULL); gst_caps_set_simple (caps, "play-speed", G_TYPE_DOUBLE, play_speed, NULL); gst_caps_set_simple (caps, "play-scale", G_TYPE_DOUBLE, play_scale, NULL); stream->caps = caps; } GST_DEBUG_OBJECT (src, "stream %p, caps %" GST_PTR_FORMAT, stream, caps); } if (src->manager) { GST_DEBUG_OBJECT (src, "clear session"); g_signal_emit_by_name (src->manager, "clear-pt-map", NULL); } } static GstFlowReturn gst_rtspsrc_combine_flows (GstRTSPSrc * src, GstRTSPStream * stream, GstFlowReturn ret) { GList *streams; /* store the value */ stream->last_ret = ret; /* if it's success we can return the value right away */ if (ret == GST_FLOW_OK) goto done; /* any other error that is not-linked can be returned right * away */ if (ret != GST_FLOW_NOT_LINKED) goto done; /* only return NOT_LINKED if all other pads returned NOT_LINKED */ for (streams = src->streams; streams; streams = g_list_next (streams)) { GstRTSPStream *ostream = (GstRTSPStream *) streams->data; ret = ostream->last_ret; /* some other return value (must be SUCCESS but we can return * other values as well) */ if (ret != GST_FLOW_NOT_LINKED) goto done; } /* if we get here, all other pads were unlinked and we return * NOT_LINKED then */ done: return ret; } static gboolean gst_rtspsrc_stream_push_event (GstRTSPSrc * src, GstRTSPStream * stream, GstEvent * event, gboolean source) { gboolean res = TRUE; /* only streams that have a connection to the outside world */ if (stream->srcpad == NULL) goto done; if (source && stream->udpsrc[0]) { gst_event_ref (event); res = gst_element_send_event (stream->udpsrc[0], event); } else if (stream->channelpad[0]) { gst_event_ref (event); if (GST_PAD_IS_SRC (stream->channelpad[0])) res = gst_pad_push_event (stream->channelpad[0], event); else res = gst_pad_send_event (stream->channelpad[0], event); } if (source && stream->udpsrc[1]) { gst_event_ref (event); res &= gst_element_send_event (stream->udpsrc[1], event); } else if (stream->channelpad[1]) { gst_event_ref (event); if (GST_PAD_IS_SRC (stream->channelpad[1])) res &= gst_pad_push_event (stream->channelpad[1], event); else res &= gst_pad_send_event (stream->channelpad[1], event); } done: gst_event_unref (event); return res; } static gboolean gst_rtspsrc_push_event (GstRTSPSrc * src, GstEvent * event, gboolean source) { GList *streams; gboolean res = TRUE; for (streams = src->streams; streams; streams = g_list_next (streams)) { GstRTSPStream *ostream = (GstRTSPStream *) streams->data; gst_event_ref (event); res &= gst_rtspsrc_stream_push_event (src, ostream, event, source); } gst_event_unref (event); return res; } static GstRTSPResult gst_rtsp_conninfo_connect (GstRTSPSrc * src, GstRTSPConnInfo * info, gboolean async) { GstRTSPResult res; if (info->connection == NULL) { if (info->url == NULL) { GST_DEBUG_OBJECT (src, "parsing uri (%s)...", info->location); if ((res = gst_rtsp_url_parse (info->location, &info->url)) < 0) goto parse_error; } /* create connection */ GST_DEBUG_OBJECT (src, "creating connection (%s)...", info->location); if ((res = gst_rtsp_connection_create (info->url, &info->connection)) < 0) goto could_not_create; if (info->url_str) g_free (info->url_str); info->url_str = gst_rtsp_url_get_request_uri (info->url); GST_DEBUG_OBJECT (src, "sanitized uri %s", info->url_str); if (info->url->transports & GST_RTSP_LOWER_TRANS_HTTP) gst_rtsp_connection_set_tunneled (info->connection, TRUE); if (src->proxy_host) { GST_DEBUG_OBJECT (src, "setting proxy %s:%d", src->proxy_host, src->proxy_port); gst_rtsp_connection_set_proxy (info->connection, src->proxy_host, src->proxy_port); } } if (!info->connected) { /* connect */ if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "connect", ("Connecting to %s", info->location)); GST_DEBUG_OBJECT (src, "connecting (%s)...", info->location); if ((res = gst_rtsp_connection_connect (info->connection, src->ptcp_timeout)) < 0) goto could_not_connect; info->connected = TRUE; } return GST_RTSP_OK; /* ERRORS */ parse_error: { GST_ERROR_OBJECT (src, "No valid RTSP URL was provided"); return res; } could_not_create: { gchar *str = gst_rtsp_strresult (res); GST_ERROR_OBJECT (src, "Could not create connection. (%s)", str); g_free (str); return res; } could_not_connect: { gchar *str = gst_rtsp_strresult (res); GST_ERROR_OBJECT (src, "Could not connect to server. (%s)", str); g_free (str); return res; } } static GstRTSPResult gst_rtsp_conninfo_close (GstRTSPSrc * src, GstRTSPConnInfo * info, gboolean free) { if (info->connected) { GST_DEBUG_OBJECT (src, "closing connection..."); gst_rtsp_connection_close (info->connection); info->connected = FALSE; } if (free && info->connection) { /* free connection */ GST_DEBUG_OBJECT (src, "freeing connection..."); gst_rtsp_connection_free (info->connection); info->connection = NULL; } return GST_RTSP_OK; } static GstRTSPResult gst_rtsp_conninfo_reconnect (GstRTSPSrc * src, GstRTSPConnInfo * info, gboolean async) { GstRTSPResult res; GST_DEBUG_OBJECT (src, "reconnecting connection..."); gst_rtsp_conninfo_close (src, info, FALSE); res = gst_rtsp_conninfo_connect (src, info, async); return res; } static void gst_rtspsrc_connection_flush (GstRTSPSrc * src, gboolean flush) { GList *walk; GST_DEBUG_OBJECT (src, "set flushing %d", flush); if (src->conninfo.connection) { GST_DEBUG_OBJECT (src, "connection flush"); gst_rtsp_connection_flush (src->conninfo.connection, flush); } for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; GST_DEBUG_OBJECT (src, "stream %p flush", stream); if (stream->conninfo.connection) gst_rtsp_connection_flush (stream->conninfo.connection, flush); } } /* FIXME, handle server request, reply with OK, for now */ static GstRTSPResult gst_rtspsrc_handle_request (GstRTSPSrc * src, GstRTSPConnection * conn, GstRTSPMessage * request) { GstRTSPMessage response = { 0 }; GstRTSPResult res; GST_DEBUG_OBJECT (src, "got server request message"); if (src->debug) gst_rtsp_message_dump (request); res = gst_rtsp_ext_list_receive_request (src->extensions, request); if (res == GST_RTSP_ENOTIMPL) { /* default implementation, send OK */ res = gst_rtsp_message_init_response (&response, GST_RTSP_STS_OK, "OK", request); if (res < 0) goto send_error; GST_DEBUG_OBJECT (src, "replying with OK"); if (src->debug) gst_rtsp_message_dump (&response); res = gst_rtspsrc_connection_send (src, conn, &response, NULL); if (res < 0) goto send_error; gst_rtsp_message_unset (&response); } else if (res == GST_RTSP_EEOF) return res; return GST_RTSP_OK; /* ERRORS */ send_error: { gst_rtsp_message_unset (&response); return res; } } /* send server keep-alive */ static GstRTSPResult gst_rtspsrc_send_keep_alive (GstRTSPSrc * src) { GstRTSPMessage request = { 0 }; GstRTSPResult res; GstRTSPMethod method; gchar *control; GST_DEBUG_OBJECT (src, "creating server keep-alive"); /* find a method to use for keep-alive */ if (src->methods & GST_RTSP_GET_PARAMETER) method = GST_RTSP_GET_PARAMETER; else method = GST_RTSP_OPTIONS; if (src->control) control = src->control; else control = src->conninfo.url_str; if (control == NULL) goto no_control; res = gst_rtsp_message_init_request (&request, method, control); if (res < 0) goto send_error; if (src->debug) gst_rtsp_message_dump (&request); res = gst_rtspsrc_connection_send (src, src->conninfo.connection, &request, NULL); if (res < 0) goto send_error; gst_rtsp_connection_reset_timeout (src->conninfo.connection); gst_rtsp_message_unset (&request); return GST_RTSP_OK; /* ERRORS */ no_control: { GST_WARNING_OBJECT (src, "no control url to send keepalive"); return GST_RTSP_OK; } send_error: { gchar *str = gst_rtsp_strresult (res); gst_rtsp_message_unset (&request); GST_ELEMENT_WARNING (src, RESOURCE, WRITE, (NULL), ("Could not send keep-alive. (%s)", str)); g_free (str); return res; } } static GstFlowReturn gst_rtspsrc_loop_interleaved (GstRTSPSrc * src) { GstRTSPMessage message = { 0 }; GstRTSPResult res; gint channel; GstRTSPStream *stream; GstPad *outpad = NULL; guint8 *data; guint size; GstFlowReturn ret = GST_FLOW_OK; GstBuffer *buf; gboolean is_rtcp, have_data; /* here we are only interested in data messages */ have_data = FALSE; do { GTimeVal tv_timeout; /* get the next timeout interval */ gst_rtsp_connection_next_timeout (src->conninfo.connection, &tv_timeout); /* see if the timeout period expired */ if ((tv_timeout.tv_sec | tv_timeout.tv_usec) == 0) { GST_DEBUG_OBJECT (src, "timout, sending keep-alive"); /* send keep-alive, only act on interrupt, a warning will be posted for * other errors. */ if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) goto interrupt; /* get new timeout */ gst_rtsp_connection_next_timeout (src->conninfo.connection, &tv_timeout); } GST_DEBUG_OBJECT (src, "doing receive with timeout %ld seconds, %ld usec", tv_timeout.tv_sec, tv_timeout.tv_usec); /* protect the connection with the connection lock so that we can see when * we are finished doing server communication */ res = gst_rtspsrc_connection_receive (src, src->conninfo.connection, &message, src->ptcp_timeout); switch (res) { case GST_RTSP_OK: GST_DEBUG_OBJECT (src, "we received a server message"); break; case GST_RTSP_EINTR: /* we got interrupted this means we need to stop */ goto interrupt; case GST_RTSP_ETIMEOUT: /* no reply, send keep alive */ GST_DEBUG_OBJECT (src, "timeout, sending keep-alive"); if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) goto interrupt; continue; case GST_RTSP_EEOF: /* go EOS when the server closed the connection */ goto server_eof; default: goto receive_error; } switch (message.type) { case GST_RTSP_MESSAGE_REQUEST: /* server sends us a request message, handle it */ res = gst_rtspsrc_handle_request (src, src->conninfo.connection, &message); if (res == GST_RTSP_EEOF) goto server_eof; else if (res < 0) goto handle_request_failed; break; case GST_RTSP_MESSAGE_RESPONSE: /* we ignore response messages */ GST_DEBUG_OBJECT (src, "ignoring response message"); if (src->debug) gst_rtsp_message_dump (&message); break; case GST_RTSP_MESSAGE_DATA: GST_DEBUG_OBJECT (src, "got data message"); have_data = TRUE; break; default: GST_WARNING_OBJECT (src, "ignoring unknown message type %d", message.type); break; } } while (!have_data); channel = message.type_data.data.channel; stream = find_stream (src, &channel, (gpointer) find_stream_by_channel); if (!stream) goto unknown_stream; if (channel == stream->channel[0]) { outpad = stream->channelpad[0]; is_rtcp = FALSE; } else if (channel == stream->channel[1]) { outpad = stream->channelpad[1]; is_rtcp = TRUE; } else { is_rtcp = FALSE; } /* take a look at the body to figure out what we have */ gst_rtsp_message_get_body (&message, &data, &size); if (size < 2) goto invalid_length; /* channels are not correct on some servers, do extra check */ if (data[1] >= 200 && data[1] <= 204) { /* hmm RTCP message switch to the RTCP pad of the same stream. */ outpad = stream->channelpad[1]; is_rtcp = TRUE; } /* we have no clue what this is, just ignore then. */ if (outpad == NULL) goto unknown_stream; /* take the message body for further processing */ gst_rtsp_message_steal_body (&message, &data, &size); /* strip the trailing \0 */ size -= 1; buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = data; GST_BUFFER_MALLOCDATA (buf) = data; GST_BUFFER_SIZE (buf) = size; /* don't need message anymore */ gst_rtsp_message_unset (&message); GST_DEBUG_OBJECT (src, "pushing data of size %d on channel %d", size, channel); if (src->need_activate) { gst_rtspsrc_activate_streams (src); src->need_activate = FALSE; } if (!src->manager) { /* set stream caps on buffer when we don't have a session manager to do it * for us */ gst_buffer_set_caps (buf, stream->caps); } if (src->base_time == -1) { /* Take current running_time. This timestamp will be put on * the first buffer of each stream because we are a live source and so we * timestamp with the running_time. When we are dealing with TCP, we also * only timestamp the first buffer (using the DISCONT flag) because a server * typically bursts data, for which we don't want to compensate by speeding * up the media. The other timestamps will be interpollated from this one * using the RTP timestamps. */ GST_OBJECT_LOCK (src); if (GST_ELEMENT_CLOCK (src)) { GstClockTime now; GstClockTime base_time; now = gst_clock_get_time (GST_ELEMENT_CLOCK (src)); base_time = GST_ELEMENT_CAST (src)->base_time; src->base_time = now - base_time; GST_DEBUG_OBJECT (src, "first buffer at time %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT, GST_TIME_ARGS (now), GST_TIME_ARGS (base_time)); } GST_OBJECT_UNLOCK (src); } if (stream->discont && !is_rtcp) { /* mark first RTP buffer as discont */ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); stream->discont = FALSE; /* first buffer gets the timestamp, other buffers are not timestamped and * their presentation time will be interpollated from the rtp timestamps. */ GST_DEBUG_OBJECT (src, "setting timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (src->base_time)); GST_BUFFER_TIMESTAMP (buf) = src->base_time; } /* chain to the peer pad */ if (GST_PAD_IS_SINK (outpad)) ret = gst_pad_chain (outpad, buf); else ret = gst_pad_push (outpad, buf); if (!is_rtcp) { /* combine all stream flows for the data transport */ ret = gst_rtspsrc_combine_flows (src, stream, ret); } return ret; /* ERRORS */ unknown_stream: { GST_DEBUG_OBJECT (src, "unknown stream on channel %d, ignored", channel); gst_rtsp_message_unset (&message); return GST_FLOW_OK; } server_eof: { GST_DEBUG_OBJECT (src, "we got an eof from the server"); GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), ("The server closed the connection.")); src->conninfo.connected = FALSE; gst_rtsp_message_unset (&message); return GST_FLOW_UNEXPECTED; } interrupt: { gst_rtsp_message_unset (&message); GST_DEBUG_OBJECT (src, "got interrupted: stop connection flush"); gst_rtspsrc_connection_flush (src, FALSE); return GST_FLOW_WRONG_STATE; } receive_error: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Could not receive message. (%s)", str)); g_free (str); gst_rtsp_message_unset (&message); return GST_FLOW_ERROR; } handle_request_failed: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not handle server message. (%s)", str)); g_free (str); gst_rtsp_message_unset (&message); return GST_FLOW_ERROR; } invalid_length: { GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), ("Short message received, ignoring.")); gst_rtsp_message_unset (&message); return GST_FLOW_OK; } } static GstFlowReturn gst_rtspsrc_loop_udp (GstRTSPSrc * src) { GstRTSPResult res; GstRTSPMessage message = { 0 }; gint retry = 0; while (TRUE) { GTimeVal tv_timeout; /* get the next timeout interval */ gst_rtsp_connection_next_timeout (src->conninfo.connection, &tv_timeout); GST_DEBUG_OBJECT (src, "doing receive with timeout %d seconds", (gint) tv_timeout.tv_sec); gst_rtsp_message_unset (&message); /* we should continue reading the TCP socket because the server might * send us requests. When the session timeout expires, we need to send a * keep-alive request to keep the session open. */ res = gst_rtspsrc_connection_receive (src, src->conninfo.connection, &message, &tv_timeout); switch (res) { case GST_RTSP_OK: GST_DEBUG_OBJECT (src, "we received a server message"); break; case GST_RTSP_EINTR: /* we got interrupted, see what we have to do */ goto interrupt; case GST_RTSP_ETIMEOUT: /* send keep-alive, ignore the result, a warning will be posted. */ GST_DEBUG_OBJECT (src, "timeout, sending keep-alive"); if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) goto interrupt; continue; case GST_RTSP_EEOF: /* server closed the connection. not very fatal for UDP, reconnect and * see what happens. */ GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), ("The server closed the connection.")); if ((res = gst_rtsp_conninfo_reconnect (src, &src->conninfo, FALSE)) < 0) goto connect_error; continue; default: goto receive_error; } switch (message.type) { case GST_RTSP_MESSAGE_REQUEST: /* server sends us a request message, handle it */ res = gst_rtspsrc_handle_request (src, src->conninfo.connection, &message); if (res == GST_RTSP_EEOF) goto server_eof; else if (res < 0) goto handle_request_failed; break; case GST_RTSP_MESSAGE_RESPONSE: /* we ignore response and data messages */ GST_DEBUG_OBJECT (src, "ignoring response message"); if (src->debug) gst_rtsp_message_dump (&message); if (message.type_data.response.code == GST_RTSP_STS_UNAUTHORIZED) { GST_DEBUG_OBJECT (src, "but is Unauthorized response ..."); if (gst_rtspsrc_setup_auth (src, &message) && !(retry++)) { GST_DEBUG_OBJECT (src, "so retrying keep-alive"); if ((res = gst_rtspsrc_send_keep_alive (src)) == GST_RTSP_EINTR) goto interrupt; } } else { retry = 0; } break; case GST_RTSP_MESSAGE_DATA: /* we ignore response and data messages */ GST_DEBUG_OBJECT (src, "ignoring data message"); break; default: GST_WARNING_OBJECT (src, "ignoring unknown message type %d", message.type); break; } } /* we get here when the connection got interrupted */ interrupt: { gst_rtsp_message_unset (&message); GST_DEBUG_OBJECT (src, "got interrupted: stop connection flush"); gst_rtspsrc_connection_flush (src, FALSE); return GST_FLOW_WRONG_STATE; } connect_error: { gchar *str = gst_rtsp_strresult (res); GstFlowReturn ret; src->conninfo.connected = FALSE; if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), ("Could not connect to server. (%s)", str)); g_free (str); ret = GST_FLOW_ERROR; } else { ret = GST_FLOW_WRONG_STATE; } return ret; } receive_error: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Could not receive message. (%s)", str)); g_free (str); return GST_FLOW_ERROR; } handle_request_failed: { gchar *str = gst_rtsp_strresult (res); GstFlowReturn ret; gst_rtsp_message_unset (&message); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not handle server message. (%s)", str)); g_free (str); ret = GST_FLOW_ERROR; } else { ret = GST_FLOW_WRONG_STATE; } return ret; } server_eof: { GST_DEBUG_OBJECT (src, "we got an eof from the server"); GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), ("The server closed the connection.")); src->conninfo.connected = FALSE; gst_rtsp_message_unset (&message); return GST_FLOW_UNEXPECTED; } } static GstRTSPResult gst_rtspsrc_reconnect (GstRTSPSrc * src, gboolean async) { GstRTSPResult res = GST_RTSP_OK; gboolean restart; GST_DEBUG_OBJECT (src, "doing reconnect"); GST_OBJECT_LOCK (src); /* only restart when the pads were not yet activated, else we were * streaming over UDP */ restart = src->need_activate; GST_OBJECT_UNLOCK (src); /* no need to restart, we're done */ if (!restart) goto done; /* we can try only TCP now */ src->cur_protocols = GST_RTSP_LOWER_TRANS_TCP; /* close and cleanup our state */ if ((res = gst_rtspsrc_close (src, async, FALSE)) < 0) goto done; /* see if we have TCP left to try. Also don't try TCP when we were configured * with an SDP. */ if (!(src->protocols & GST_RTSP_LOWER_TRANS_TCP) || src->from_sdp) goto no_protocols; /* We post a warning message now to inform the user * that nothing happened. It's most likely a firewall thing. */ GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), ("Could not receive any UDP packets for %.4f seconds, maybe your " "firewall is blocking it. Retrying using a TCP connection.", gst_guint64_to_gdouble (src->udp_timeout / 1000000.0))); /* open new connection using tcp */ if (gst_rtspsrc_open (src, async) < 0) goto open_failed; /* start playback */ if (gst_rtspsrc_play (src, &src->segment, async) < 0) goto play_failed; done: return res; /* ERRORS */ no_protocols: { src->cur_protocols = 0; /* no transport possible, post an error and stop */ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Could not receive any UDP packets for %.4f seconds, maybe your " "firewall is blocking it. No other protocols to try.", gst_guint64_to_gdouble (src->udp_timeout / 1000000.0))); return GST_FLOW_ERROR; } open_failed: { GST_DEBUG_OBJECT (src, "open failed"); return GST_FLOW_OK; } play_failed: { GST_DEBUG_OBJECT (src, "play failed"); return GST_FLOW_OK; } } static void gst_rtspsrc_loop_start_cmd (GstRTSPSrc * src, gint cmd) { switch (cmd) { case CMD_OPEN: GST_ELEMENT_PROGRESS (src, START, "open", ("Opening Stream")); break; case CMD_PLAY: GST_ELEMENT_PROGRESS (src, START, "request", ("Sending PLAY request")); break; case CMD_PAUSE: GST_ELEMENT_PROGRESS (src, START, "request", ("Sending PAUSE request")); break; case CMD_CLOSE: GST_ELEMENT_PROGRESS (src, START, "close", ("Closing Stream")); break; default: break; } } static void gst_rtspsrc_loop_complete_cmd (GstRTSPSrc * src, gint cmd) { switch (cmd) { case CMD_OPEN: GST_ELEMENT_PROGRESS (src, COMPLETE, "open", ("Opened Stream")); break; case CMD_PLAY: GST_ELEMENT_PROGRESS (src, COMPLETE, "request", ("Sent PLAY request")); break; case CMD_PAUSE: GST_ELEMENT_PROGRESS (src, COMPLETE, "request", ("Sent PAUSE request")); break; case CMD_CLOSE: GST_ELEMENT_PROGRESS (src, COMPLETE, "close", ("Closed Stream")); break; default: break; } } static void gst_rtspsrc_loop_cancel_cmd (GstRTSPSrc * src, gint cmd) { switch (cmd) { case CMD_OPEN: GST_ELEMENT_PROGRESS (src, CANCELED, "open", ("Open canceled")); break; case CMD_PLAY: GST_ELEMENT_PROGRESS (src, CANCELED, "request", ("PLAY canceled")); break; case CMD_PAUSE: GST_ELEMENT_PROGRESS (src, CANCELED, "request", ("PAUSE canceled")); break; case CMD_CLOSE: GST_ELEMENT_PROGRESS (src, CANCELED, "close", ("Close canceled")); break; default: break; } } static void gst_rtspsrc_loop_error_cmd (GstRTSPSrc * src, gint cmd) { switch (cmd) { case CMD_OPEN: GST_ELEMENT_PROGRESS (src, ERROR, "open", ("Open failed")); break; case CMD_PLAY: GST_ELEMENT_PROGRESS (src, ERROR, "request", ("PLAY failed")); break; case CMD_PAUSE: GST_ELEMENT_PROGRESS (src, ERROR, "request", ("PAUSE failed")); break; case CMD_CLOSE: GST_ELEMENT_PROGRESS (src, ERROR, "close", ("Close failed")); break; default: break; } } static void gst_rtspsrc_loop_end_cmd (GstRTSPSrc * src, gint cmd, GstRTSPResult ret) { if (ret == GST_RTSP_OK) gst_rtspsrc_loop_complete_cmd (src, cmd); else if (ret == GST_RTSP_EINTR) gst_rtspsrc_loop_cancel_cmd (src, cmd); else gst_rtspsrc_loop_error_cmd (src, cmd); } static void gst_rtspsrc_loop_send_cmd (GstRTSPSrc * src, gint cmd, gboolean flush) { gint old; /* FIXME flush param mute; remove at discretion */ /* start new request */ gst_rtspsrc_loop_start_cmd (src, cmd); GST_DEBUG_OBJECT (src, "sending cmd %d", cmd); GST_OBJECT_LOCK (src); old = src->loop_cmd; if (old != CMD_WAIT) { src->loop_cmd = CMD_WAIT; GST_OBJECT_UNLOCK (src); /* cancel previous request */ gst_rtspsrc_loop_cancel_cmd (src, old); GST_OBJECT_LOCK (src); } src->loop_cmd = cmd; /* interrupt if allowed */ if (src->waiting) { GST_DEBUG_OBJECT (src, "start connection flush"); gst_rtspsrc_connection_flush (src, TRUE); } if (src->task) gst_task_start (src->task); GST_OBJECT_UNLOCK (src); } static gboolean gst_rtspsrc_loop (GstRTSPSrc * src) { GstFlowReturn ret; if (!src->conninfo.connection || !src->conninfo.connected) goto no_connection; if (src->interleaved) ret = gst_rtspsrc_loop_interleaved (src); else ret = gst_rtspsrc_loop_udp (src); if (ret != GST_FLOW_OK) goto pause; return TRUE; /* ERRORS */ no_connection: { GST_WARNING_OBJECT (src, "we are not connected"); ret = GST_FLOW_WRONG_STATE; goto pause; } pause: { const gchar *reason = gst_flow_get_name (ret); GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason); src->running = FALSE; if (ret == GST_FLOW_UNEXPECTED) { /* perform EOS logic */ if (src->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (src), gst_message_new_segment_done (GST_OBJECT_CAST (src), src->segment.format, src->segment.last_stop)); } else { gst_rtspsrc_push_event (src, gst_event_new_eos (), FALSE); } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { /* for fatal errors we post an error message, post the error before the * EOS so the app knows about the error first. */ GST_ELEMENT_ERROR (src, STREAM, FAILED, ("Internal data flow error."), ("streaming task paused, reason %s (%d)", reason, ret)); gst_rtspsrc_push_event (src, gst_event_new_eos (), FALSE); } return FALSE; } } #ifndef GST_DISABLE_GST_DEBUG static const gchar * gst_rtsp_auth_method_to_string (GstRTSPAuthMethod method) { gint index = 0; while (method != 0) { index++; method >>= 1; } switch (index) { case 0: return "None"; case 1: return "Basic"; case 2: return "Digest"; } return "Unknown"; } #endif static const gchar * gst_rtspsrc_skip_lws (const gchar * s) { while (g_ascii_isspace (*s)) s++; return s; } static const gchar * gst_rtspsrc_unskip_lws (const gchar * s, const gchar * start) { while (s > start && g_ascii_isspace (*(s - 1))) s--; return s; } static const gchar * gst_rtspsrc_skip_commas (const gchar * s) { /* The grammar allows for multiple commas */ while (g_ascii_isspace (*s) || *s == ',') s++; return s; } static const gchar * gst_rtspsrc_skip_item (const gchar * s) { gboolean quoted = FALSE; const gchar *start = s; /* A list item ends at the last non-whitespace character * before a comma which is not inside a quoted-string. Or at * the end of the string. */ while (*s) { if (*s == '"') quoted = !quoted; else if (quoted) { if (*s == '\\' && *(s + 1)) s++; } else { if (*s == ',') break; } s++; } return gst_rtspsrc_unskip_lws (s, start); } static void gst_rtsp_decode_quoted_string (gchar * quoted_string) { gchar *src, *dst; src = quoted_string + 1; dst = quoted_string; while (*src && *src != '"') { if (*src == '\\' && *(src + 1)) src++; *dst++ = *src++; } *dst = '\0'; } /* Extract the authentication tokens that the server provided for each method * into an array of structures and give those to the connection object. */ static void gst_rtspsrc_parse_digest_challenge (GstRTSPConnection * conn, const gchar * header, gboolean * stale) { GSList *list = NULL, *iter; const gchar *end; gchar *item, *eq, *name_end, *value; g_return_if_fail (stale != NULL); gst_rtsp_connection_clear_auth_params (conn); *stale = FALSE; /* Parse a header whose content is described by RFC2616 as * "#something", where "something" does not itself contain commas, * except as part of quoted-strings, into a list of allocated strings. */ header = gst_rtspsrc_skip_commas (header); while (*header) { end = gst_rtspsrc_skip_item (header); list = g_slist_prepend (list, g_strndup (header, end - header)); header = gst_rtspsrc_skip_commas (end); } if (!list) return; list = g_slist_reverse (list); for (iter = list; iter; iter = iter->next) { item = iter->data; eq = strchr (item, '='); if (eq) { name_end = (gchar *) gst_rtspsrc_unskip_lws (eq, item); if (name_end == item) { /* That's no good... */ g_free (item); continue; } *name_end = '\0'; value = (gchar *) gst_rtspsrc_skip_lws (eq + 1); if (*value == '"') gst_rtsp_decode_quoted_string (value); } else value = NULL; if (item && (strcmp (item, "stale") == 0) && value && (strcmp (value, "TRUE") == 0)) *stale = TRUE; gst_rtsp_connection_set_auth_param (conn, item, value); g_free (item); } g_slist_free (list); } /* Parse a WWW-Authenticate Response header and determine the * available authentication methods * * This code should also cope with the fact that each WWW-Authenticate * header can contain multiple challenge methods + tokens * * At the moment, for Basic auth, we just do a minimal check and don't * even parse out the realm */ static void gst_rtspsrc_parse_auth_hdr (gchar * hdr, GstRTSPAuthMethod * methods, GstRTSPConnection * conn, gboolean * stale) { gchar *start; g_return_if_fail (hdr != NULL); g_return_if_fail (methods != NULL); g_return_if_fail (stale != NULL); /* Skip whitespace at the start of the string */ for (start = hdr; start[0] != '\0' && g_ascii_isspace (start[0]); start++); if (g_ascii_strncasecmp (start, "basic", 5) == 0) *methods |= GST_RTSP_AUTH_BASIC; else if (g_ascii_strncasecmp (start, "digest ", 7) == 0) { *methods |= GST_RTSP_AUTH_DIGEST; gst_rtspsrc_parse_digest_challenge (conn, &start[7], stale); } } /** * gst_rtspsrc_setup_auth: * @src: the rtsp source * * Configure a username and password and auth method on the * connection object based on a response we received from the * peer. * * Currently, this requires that a username and password were supplied * in the uri. In the future, they may be requested on demand by sending * a message up the bus. * * Returns: TRUE if authentication information could be set up correctly. */ static gboolean gst_rtspsrc_setup_auth (GstRTSPSrc * src, GstRTSPMessage * response) { gchar *user = NULL; gchar *pass = NULL; GstRTSPAuthMethod avail_methods = GST_RTSP_AUTH_NONE; GstRTSPAuthMethod method; GstRTSPResult auth_result; GstRTSPUrl *url; GstRTSPConnection *conn; gchar *hdr; gboolean stale = FALSE; conn = src->conninfo.connection; /* Identify the available auth methods and see if any are supported */ if (gst_rtsp_message_get_header (response, GST_RTSP_HDR_WWW_AUTHENTICATE, &hdr, 0) == GST_RTSP_OK) { gst_rtspsrc_parse_auth_hdr (hdr, &avail_methods, conn, &stale); } if (avail_methods == GST_RTSP_AUTH_NONE) goto no_auth_available; /* For digest auth, if the response indicates that the session * data are stale, we just update them in the connection object and * return TRUE to retry the request */ if (stale) src->tried_url_auth = FALSE; url = gst_rtsp_connection_get_url (conn); /* Do we have username and password available? */ if (url != NULL && !src->tried_url_auth && url->user != NULL && url->passwd != NULL) { user = url->user; pass = url->passwd; src->tried_url_auth = TRUE; GST_DEBUG_OBJECT (src, "Attempting authentication using credentials from the URL"); } else { user = src->user_id; pass = src->user_pw; GST_DEBUG_OBJECT (src, "Attempting authentication using credentials from the properties"); } /* FIXME: If the url didn't contain username and password or we tried them * already, request a username and passwd from the application via some kind * of credentials request message */ /* If we don't have a username and passwd at this point, bail out. */ if (user == NULL || pass == NULL) goto no_user_pass; /* Try to configure for each available authentication method, strongest to * weakest */ for (method = GST_RTSP_AUTH_MAX; method != GST_RTSP_AUTH_NONE; method >>= 1) { /* Check if this method is available on the server */ if ((method & avail_methods) == 0) continue; /* Pass the credentials to the connection to try on the next request */ auth_result = gst_rtsp_connection_set_auth (conn, method, user, pass); /* INVAL indicates an invalid username/passwd were supplied, so we'll just * ignore it and end up retrying later */ if (auth_result == GST_RTSP_OK || auth_result == GST_RTSP_EINVAL) { GST_DEBUG_OBJECT (src, "Attempting %s authentication", gst_rtsp_auth_method_to_string (method)); break; } } if (method == GST_RTSP_AUTH_NONE) goto no_auth_available; return TRUE; no_auth_available: { /* Output an error indicating that we couldn't connect because there were * no supported authentication protocols */ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("No supported authentication protocol was found")); return FALSE; } no_user_pass: { /* We don't fire an error message, we just return FALSE and let the * normal NOT_AUTHORIZED error be propagated */ return FALSE; } } static GstRTSPResult gst_rtspsrc_try_send (GstRTSPSrc * src, GstRTSPConnection * conn, GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPStatusCode * code) { GstRTSPResult res; GstRTSPStatusCode thecode; gchar *content_base = NULL; gint try = 0; again: if (!src->short_header) gst_rtsp_ext_list_before_send (src->extensions, request); GST_DEBUG_OBJECT (src, "sending message"); if (src->debug) gst_rtsp_message_dump (request); res = gst_rtspsrc_connection_send (src, conn, request, src->ptcp_timeout); if (res < 0) goto send_error; gst_rtsp_connection_reset_timeout (conn); next: res = gst_rtspsrc_connection_receive (src, conn, response, src->ptcp_timeout); if (res < 0) goto receive_error; if (src->debug) gst_rtsp_message_dump (response); switch (response->type) { case GST_RTSP_MESSAGE_REQUEST: res = gst_rtspsrc_handle_request (src, conn, response); if (res == GST_RTSP_EEOF) goto server_eof; else if (res < 0) goto handle_request_failed; goto next; case GST_RTSP_MESSAGE_RESPONSE: /* ok, a response is good */ GST_DEBUG_OBJECT (src, "received response message"); break; case GST_RTSP_MESSAGE_DATA: /* get next response */ GST_DEBUG_OBJECT (src, "ignoring data response message"); goto next; default: GST_WARNING_OBJECT (src, "ignoring unknown message type %d", response->type); goto next; } thecode = response->type_data.response.code; GST_DEBUG_OBJECT (src, "got response message %d", thecode); /* if the caller wanted the result code, we store it. */ if (code) *code = thecode; /* If the request didn't succeed, bail out before doing any more */ if (thecode != GST_RTSP_STS_OK) return GST_RTSP_OK; /* store new content base if any */ gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE, &content_base, 0); if (content_base) { g_free (src->content_base); src->content_base = g_strdup (content_base); } gst_rtsp_ext_list_after_send (src->extensions, request, response); return GST_RTSP_OK; /* ERRORS */ send_error: { gchar *str = gst_rtsp_strresult (res); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not send message. (%s)", str)); } else { GST_WARNING_OBJECT (src, "send interrupted"); } g_free (str); return res; } receive_error: { switch (res) { case GST_RTSP_EEOF: GST_WARNING_OBJECT (src, "server closed connection, doing reconnect"); if (try == 0) { try++; /* if reconnect succeeds, try again */ if ((res = gst_rtsp_conninfo_reconnect (src, &src->conninfo, FALSE)) == 0) goto again; } /* only try once after reconnect, then fallthrough and error out */ default: { gchar *str = gst_rtsp_strresult (res); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Could not receive message. (%s)", str)); } else { GST_WARNING_OBJECT (src, "receive interrupted"); } g_free (str); break; } } return res; } handle_request_failed: { /* ERROR was posted */ gst_rtsp_message_unset (response); return res; } server_eof: { GST_DEBUG_OBJECT (src, "we got an eof from the server"); GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), ("The server closed the connection.")); gst_rtsp_message_unset (response); return res; } } /** * gst_rtspsrc_send: * @src: the rtsp source * @conn: the connection to send on * @request: must point to a valid request * @response: must point to an empty #GstRTSPMessage * @code: an optional code result * * send @request and retrieve the response in @response. optionally @code can be * non-NULL in which case it will contain the status code of the response. * * If This function returns #GST_RTSP_OK, @response will contain a valid response * message that should be cleaned with gst_rtsp_message_unset() after usage. * * If @code is NULL, this function will return #GST_RTSP_ERROR (with an invalid * @response message) if the response code was not 200 (OK). * * If the attempt results in an authentication failure, then this will attempt * to retrieve authentication credentials via gst_rtspsrc_setup_auth and retry * the request. * * Returns: #GST_RTSP_OK if the processing was successful. */ static GstRTSPResult gst_rtspsrc_send (GstRTSPSrc * src, GstRTSPConnection * conn, GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPStatusCode * code) { GstRTSPStatusCode int_code = GST_RTSP_STS_OK; GstRTSPResult res = GST_RTSP_ERROR; gint count; gboolean retry; GstRTSPMethod method = GST_RTSP_INVALID; count = 0; do { retry = FALSE; /* make sure we don't loop forever */ if (count++ > 8) break; /* save method so we can disable it when the server complains */ method = request->type_data.request.method; if ((res = gst_rtspsrc_try_send (src, conn, request, response, &int_code)) < 0) goto error; switch (int_code) { case GST_RTSP_STS_UNAUTHORIZED: if (gst_rtspsrc_setup_auth (src, response)) { /* Try the request/response again after configuring the auth info * and loop again */ retry = TRUE; } break; default: break; } } while (retry == TRUE); /* If the user requested the code, let them handle errors, otherwise * post an error below */ if (code != NULL) *code = int_code; else if (int_code != GST_RTSP_STS_OK) goto error_response; return res; /* ERRORS */ error: { GST_DEBUG_OBJECT (src, "got error %d", res); return res; } error_response: { res = GST_RTSP_ERROR; switch (response->type_data.response.code) { case GST_RTSP_STS_NOT_FOUND: GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("%s", response->type_data.response.reason)); break; case GST_RTSP_STS_MOVED_PERMANENTLY: case GST_RTSP_STS_MOVE_TEMPORARILY: { gchar *new_location; GstRTSPLowerTrans transports; GST_DEBUG_OBJECT (src, "got redirection"); /* if we don't have a Location Header, we must error */ if (gst_rtsp_message_get_header (response, GST_RTSP_HDR_LOCATION, &new_location, 0) < 0) break; /* When we receive a redirect result, we go back to the INIT state after * parsing the new URI. The caller should do the needed steps to issue * a new setup when it detects this state change. */ GST_DEBUG_OBJECT (src, "redirection to %s", new_location); /* save current transports */ if (src->conninfo.url) transports = src->conninfo.url->transports; else transports = GST_RTSP_LOWER_TRANS_UNKNOWN; gst_rtspsrc_uri_set_uri (GST_URI_HANDLER (src), new_location); /* set old transports */ if (src->conninfo.url && transports != GST_RTSP_LOWER_TRANS_UNKNOWN) src->conninfo.url->transports = transports; src->need_redirect = TRUE; src->state = GST_RTSP_STATE_INIT; res = GST_RTSP_OK; break; } case GST_RTSP_STS_NOT_ACCEPTABLE: case GST_RTSP_STS_NOT_IMPLEMENTED: case GST_RTSP_STS_METHOD_NOT_ALLOWED: GST_WARNING_OBJECT (src, "got NOT IMPLEMENTED, disable method %s", gst_rtsp_method_as_text (method)); src->methods &= ~method; res = GST_RTSP_OK; break; default: GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Got error response: %d (%s).", response->type_data.response.code, response->type_data.response.reason)); break; } /* if we return ERROR we should unset the response ourselves */ if (res == GST_RTSP_ERROR) gst_rtsp_message_unset (response); return res; } } static GstRTSPResult gst_rtspsrc_send_cb (GstRTSPExtension * ext, GstRTSPMessage * request, GstRTSPMessage * response, GstRTSPSrc * src) { return gst_rtspsrc_send (src, src->conninfo.connection, request, response, NULL); } /* parse the response and collect all the supported methods. We need this * information so that we don't try to send an unsupported request to the * server. */ static gboolean gst_rtspsrc_parse_methods (GstRTSPSrc * src, GstRTSPMessage * response) { GstRTSPHeaderField field; gchar *respoptions; gchar **options; gint indx = 0; gint i; /* reset supported methods */ src->methods = 0; /* Try Allow Header first */ field = GST_RTSP_HDR_ALLOW; while (TRUE) { respoptions = NULL; gst_rtsp_message_get_header (response, field, &respoptions, indx); if (indx == 0 && !respoptions) { /* if no Allow header was found then try the Public header... */ field = GST_RTSP_HDR_PUBLIC; gst_rtsp_message_get_header (response, field, &respoptions, indx); } if (!respoptions) break; /* If we get here, the server gave a list of supported methods, parse * them here. The string is like: * * OPTIONS, DESCRIBE, ANNOUNCE, PLAY, SETUP, ... */ options = g_strsplit (respoptions, ",", 0); for (i = 0; options[i]; i++) { gchar *stripped; gint method; stripped = g_strstrip (options[i]); method = gst_rtsp_find_method (stripped); /* keep bitfield of supported methods */ if (method != GST_RTSP_INVALID) src->methods |= method; } g_strfreev (options); indx++; } if (src->methods == 0) { /* neither Allow nor Public are required, assume the server supports * at least DESCRIBE, SETUP, we always assume it supports PLAY as * well. */ GST_DEBUG_OBJECT (src, "could not get OPTIONS"); src->methods = GST_RTSP_DESCRIBE | GST_RTSP_SETUP; } /* always assume PLAY, FIXME, extensions should be able to override * this */ src->methods |= GST_RTSP_PLAY; /* also assume it will support Range */ src->seekable = TRUE; /* we need describe and setup */ if (!(src->methods & GST_RTSP_DESCRIBE)) goto no_describe; if (!(src->methods & GST_RTSP_SETUP)) goto no_setup; return TRUE; /* ERRORS */ no_describe: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("Server does not support DESCRIBE.")); return FALSE; } no_setup: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("Server does not support SETUP.")); return FALSE; } } /* masks to be kept in sync with the hardcoded protocol order of preference * in code below */ static guint protocol_masks[] = { GST_RTSP_LOWER_TRANS_UDP, GST_RTSP_LOWER_TRANS_UDP_MCAST, GST_RTSP_LOWER_TRANS_TCP, 0 }; static GstRTSPResult gst_rtspsrc_create_transports_string (GstRTSPSrc * src, GstRTSPLowerTrans protocols, gchar ** transports) { GstRTSPResult res; GString *result; gboolean add_udp_str; *transports = NULL; res = gst_rtsp_ext_list_get_transports (src->extensions, protocols, transports); if (res < 0) goto failed; GST_DEBUG_OBJECT (src, "got transports %s", GST_STR_NULL (*transports)); /* extension listed transports, use those */ if (*transports != NULL) return GST_RTSP_OK; /* it's the default */ add_udp_str = FALSE; /* the default RTSP transports */ result = g_string_new (""); if (protocols & GST_RTSP_LOWER_TRANS_UDP) { GST_DEBUG_OBJECT (src, "adding UDP unicast"); g_string_append (result, "RTP/AVP"); if (add_udp_str) g_string_append (result, "/UDP"); g_string_append (result, ";unicast;client_port=%%u1-%%u2"); } else if (protocols & GST_RTSP_LOWER_TRANS_UDP_MCAST) { GST_DEBUG_OBJECT (src, "adding UDP multicast"); /* we don't have to allocate any UDP ports yet, if the selected transport * turns out to be multicast we can create them and join the multicast * group indicated in the transport reply */ if (result->len > 0) g_string_append (result, ","); g_string_append (result, "RTP/AVP"); if (add_udp_str) g_string_append (result, "/UDP"); g_string_append (result, ";multicast"); } else if (protocols & GST_RTSP_LOWER_TRANS_TCP) { GST_DEBUG_OBJECT (src, "adding TCP"); if (result->len > 0) g_string_append (result, ","); g_string_append (result, "RTP/AVP/TCP;unicast;interleaved=%%i1-%%i2"); } *transports = g_string_free (result, FALSE); GST_DEBUG_OBJECT (src, "prepared transports %s", GST_STR_NULL (*transports)); return GST_RTSP_OK; /* ERRORS */ failed: { return res; } } static GstRTSPResult gst_rtspsrc_prepare_transports (GstRTSPStream * stream, gchar ** transports, gint orig_rtpport, gint orig_rtcpport) { GstRTSPSrc *src; gint nr_udp, nr_int; gchar *next, *p; gint rtpport = 0, rtcpport = 0; GString *str; src = stream->parent; /* find number of placeholders first */ if (strstr (*transports, "%%i2")) nr_int = 2; else if (strstr (*transports, "%%i1")) nr_int = 1; else nr_int = 0; if (strstr (*transports, "%%u2")) nr_udp = 2; else if (strstr (*transports, "%%u1")) nr_udp = 1; else nr_udp = 0; if (nr_udp == 0 && nr_int == 0) goto done; if (nr_udp > 0) { if (!orig_rtpport || !orig_rtcpport) { if (!gst_rtspsrc_alloc_udp_ports (stream, &rtpport, &rtcpport)) goto failed; } else { rtpport = orig_rtpport; rtcpport = orig_rtcpport; } } str = g_string_new (""); p = *transports; while ((next = strstr (p, "%%"))) { g_string_append_len (str, p, next - p); if (next[2] == 'u') { if (next[3] == '1') g_string_append_printf (str, "%d", rtpport); else if (next[3] == '2') g_string_append_printf (str, "%d", rtcpport); } if (next[2] == 'i') { if (next[3] == '1') g_string_append_printf (str, "%d", src->free_channel); else if (next[3] == '2') g_string_append_printf (str, "%d", src->free_channel + 1); } p = next + 4; } /* append final part */ g_string_append (str, p); g_free (*transports); *transports = g_string_free (str, FALSE); done: return GST_RTSP_OK; /* ERRORS */ failed: { return GST_RTSP_ERROR; } } static gboolean gst_rtspsrc_stream_is_real_media (GstRTSPStream * stream) { gboolean res = FALSE; if (stream->caps) { GstStructure *s; const gchar *enc = NULL; s = gst_caps_get_structure (stream->caps, 0); if ((enc = gst_structure_get_string (s, "encoding-name"))) { res = (strstr (enc, "-REAL") != NULL); } } return res; } /* Perform the SETUP request for all the streams. * * We ask the server for a specific transport, which initially includes all the * ones we can support (UDP/TCP/MULTICAST). For the UDP transport we allocate * two local UDP ports that we send to the server. * * Once the server replied with a transport, we configure the other streams * with the same transport. * * This function will also configure the stream for the selected transport, * which basically means creating the pipeline. */ static GstRTSPResult gst_rtspsrc_setup_streams (GstRTSPSrc * src, gboolean async) { GList *walk; GstRTSPResult res = GST_RTSP_ERROR; GstRTSPMessage request = { 0 }; GstRTSPMessage response = { 0 }; GstRTSPStream *stream = NULL; GstRTSPLowerTrans protocols; GstRTSPStatusCode code; gboolean unsupported_real = FALSE; gint rtpport, rtcpport; GstRTSPUrl *url; gchar *hval; if (src->conninfo.connection) { url = gst_rtsp_connection_get_url (src->conninfo.connection); /* we initially allow all configured lower transports. based on the URL * transports and the replies from the server we narrow them down. */ protocols = url->transports & src->cur_protocols; } else { url = NULL; protocols = src->cur_protocols; } if (protocols == 0) goto no_protocols; /* reset some state */ src->free_channel = 0; src->interleaved = FALSE; src->need_activate = FALSE; /* keep track of next port number, 0 is random */ src->next_port_num = src->client_port_range.min; rtpport = rtcpport = 0; if (G_UNLIKELY (src->streams == NULL)) goto no_streams; for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPConnection *conn; gchar *transports; gint retry = 0; guint mask = 0; stream = (GstRTSPStream *) walk->data; /* see if we need to configure this stream */ if (!gst_rtsp_ext_list_configure_stream (src->extensions, stream->caps)) { GST_DEBUG_OBJECT (src, "skipping stream %p, disabled by extension", stream); stream->disabled = TRUE; continue; } /* merge/overwrite global caps */ if (stream->caps) { guint j, num; GstStructure *s; s = gst_caps_get_structure (stream->caps, 0); num = gst_structure_n_fields (src->props); for (j = 0; j < num; j++) { const gchar *name; const GValue *val; name = gst_structure_nth_field_name (src->props, j); val = gst_structure_get_value (src->props, name); gst_structure_set_value (s, name, val); GST_DEBUG_OBJECT (src, "copied %s", name); } } /* skip setup if we have no URL for it */ if (stream->conninfo.location == NULL) { GST_DEBUG_OBJECT (src, "skipping stream %p, no setup", stream); continue; } if (src->conninfo.connection == NULL) { if (!gst_rtsp_conninfo_connect (src, &stream->conninfo, async)) { GST_DEBUG_OBJECT (src, "skipping stream %p, failed to connect", stream); continue; } conn = stream->conninfo.connection; } else { conn = src->conninfo.connection; } GST_DEBUG_OBJECT (src, "doing setup of stream %p with %s", stream, stream->conninfo.location); /* if we have a multicast connection, only suggest multicast from now on */ if (stream->is_multicast) protocols &= GST_RTSP_LOWER_TRANS_UDP_MCAST; next_protocol: /* first selectable protocol */ while (protocol_masks[mask] && !(protocols & protocol_masks[mask])) mask++; if (!protocol_masks[mask]) goto no_protocols; retry: GST_DEBUG_OBJECT (src, "protocols = 0x%x, protocol mask = 0x%x", protocols, protocol_masks[mask]); /* create a string with first transport in line */ transports = NULL; res = gst_rtspsrc_create_transports_string (src, protocols & protocol_masks[mask], &transports); if (res < 0 || transports == NULL) goto setup_transport_failed; if (strlen (transports) == 0) { g_free (transports); GST_DEBUG_OBJECT (src, "no transports found"); mask++; goto next_protocol; } GST_DEBUG_OBJECT (src, "replace ports in %s", GST_STR_NULL (transports)); /* replace placeholders with real values, this function will optionally * allocate UDP ports and other info needed to execute the setup request */ res = gst_rtspsrc_prepare_transports (stream, &transports, retry > 0 ? rtpport : 0, retry > 0 ? rtcpport : 0); if (res < 0) { g_free (transports); goto setup_transport_failed; } GST_DEBUG_OBJECT (src, "transport is now %s", GST_STR_NULL (transports)); /* create SETUP request */ res = gst_rtsp_message_init_request (&request, GST_RTSP_SETUP, stream->conninfo.location); if (res < 0) { g_free (transports); goto create_request_failed; } /* select transport, copy is made when adding to header so we can free it. */ gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT, transports); g_free (transports); /* if the user wants a non default RTP packet size we add the blocksize * parameter */ if (src->rtp_blocksize > 0) { hval = g_strdup_printf ("%d", src->rtp_blocksize); gst_rtsp_message_add_header (&request, GST_RTSP_HDR_BLOCKSIZE, hval); g_free (hval); } if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("SETUP stream %d", stream->id)); /* handle the code ourselves */ if ((res = gst_rtspsrc_send (src, conn, &request, &response, &code) < 0)) goto send_error; switch (code) { case GST_RTSP_STS_OK: break; case GST_RTSP_STS_UNSUPPORTED_TRANSPORT: gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); /* cleanup of leftover transport */ gst_rtspsrc_stream_free_udp (stream); /* MS WMServer RTSP MUST use same UDP pair in all SETUP requests; * we might be in this case */ if (stream->container && rtpport && rtcpport && !retry) { GST_DEBUG_OBJECT (src, "retrying with original port pair %u-%u", rtpport, rtcpport); retry++; goto retry; } /* this transport did not go down well, but we may have others to try * that we did not send yet, try those and only give up then * but not without checking for lost cause/extension so we can * post a nicer/more useful error message later */ if (!unsupported_real) unsupported_real = gst_rtspsrc_stream_is_real_media (stream); /* select next available protocol, give up on this stream if none */ mask++; while (protocol_masks[mask] && !(protocols & protocol_masks[mask])) mask++; if (!protocol_masks[mask] || unsupported_real) continue; else goto retry; default: /* cleanup of leftover transport and move to the next stream */ gst_rtspsrc_stream_free_udp (stream); goto response_error; } /* parse response transport */ { gchar *resptrans = NULL; GstRTSPTransport transport = { 0 }; gst_rtsp_message_get_header (&response, GST_RTSP_HDR_TRANSPORT, &resptrans, 0); if (!resptrans) { gst_rtspsrc_stream_free_udp (stream); goto no_transport; } /* parse transport, go to next stream on parse error */ if (gst_rtsp_transport_parse (resptrans, &transport) != GST_RTSP_OK) { GST_WARNING_OBJECT (src, "failed to parse transport %s", resptrans); goto next; } /* update allowed transports for other streams. once the transport of * one stream has been determined, we make sure that all other streams * are configured in the same way */ switch (transport.lower_transport) { case GST_RTSP_LOWER_TRANS_TCP: GST_DEBUG_OBJECT (src, "stream %p as TCP interleaved", stream); protocols = GST_RTSP_LOWER_TRANS_TCP; src->interleaved = TRUE; /* update free channels */ src->free_channel = MAX (transport.interleaved.min, src->free_channel); src->free_channel = MAX (transport.interleaved.max, src->free_channel); src->free_channel++; break; case GST_RTSP_LOWER_TRANS_UDP_MCAST: /* only allow multicast for other streams */ GST_DEBUG_OBJECT (src, "stream %p as UDP multicast", stream); protocols = GST_RTSP_LOWER_TRANS_UDP_MCAST; break; case GST_RTSP_LOWER_TRANS_UDP: /* only allow unicast for other streams */ GST_DEBUG_OBJECT (src, "stream %p as UDP unicast", stream); protocols = GST_RTSP_LOWER_TRANS_UDP; break; default: GST_DEBUG_OBJECT (src, "stream %p unknown transport %d", stream, transport.lower_transport); break; } if (!stream->container || (!src->interleaved && !retry)) { /* now configure the stream with the selected transport */ if (!gst_rtspsrc_stream_configure_transport (stream, &transport)) { GST_DEBUG_OBJECT (src, "could not configure stream %p transport, skipping stream", stream); goto next; } else if (stream->udpsrc[0] && stream->udpsrc[1]) { /* retain the first allocated UDP port pair */ g_object_get (G_OBJECT (stream->udpsrc[0]), "port", &rtpport, NULL); g_object_get (G_OBJECT (stream->udpsrc[1]), "port", &rtcpport, NULL); } } /* we need to activate at least one streams when we detect activity */ src->need_activate = TRUE; next: /* clean up our transport struct */ gst_rtsp_transport_init (&transport); /* clean up used RTSP messages */ gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); } } /* store the transport protocol that was configured */ src->cur_protocols = protocols; gst_rtsp_ext_list_stream_select (src->extensions, url); /* if there is nothing to activate, error out */ if (!src->need_activate) goto nothing_to_activate; return res; /* ERRORS */ no_protocols: { /* no transport possible, post an error and stop */ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Could not connect to server, no protocols left")); return GST_RTSP_ERROR; } no_streams: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("SDP contains no streams")); return GST_RTSP_ERROR; } create_request_failed: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Could not create request. (%s)", str)); g_free (str); goto cleanup_error; } setup_transport_failed: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("Could not setup transport.")); res = GST_RTSP_ERROR; goto cleanup_error; } response_error: { const gchar *str = gst_rtsp_status_as_text (code); GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Error (%d): %s", code, GST_STR_NULL (str))); res = GST_RTSP_ERROR; goto cleanup_error; } send_error: { gchar *str = gst_rtsp_strresult (res); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not send message. (%s)", str)); } else { GST_WARNING_OBJECT (src, "send interrupted"); } g_free (str); goto cleanup_error; } no_transport: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("Server did not select transport.")); res = GST_RTSP_ERROR; goto cleanup_error; } nothing_to_activate: { /* none of the available error codes is really right .. */ if (unsupported_real) { GST_ELEMENT_ERROR (src, STREAM, CODEC_NOT_FOUND, (_("No supported stream was found. You might need to install a " "GStreamer RTSP extension plugin for Real media streams.")), (NULL)); } else { GST_ELEMENT_ERROR (src, STREAM, CODEC_NOT_FOUND, (_("No supported stream was found. You might need to allow " "more transport protocols or may otherwise be missing " "the right GStreamer RTSP extension plugin.")), (NULL)); } return GST_RTSP_ERROR; } cleanup_error: { gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); return res; } } static gboolean gst_rtspsrc_parse_range (GstRTSPSrc * src, const gchar * range, GstSegment * segment) { gint64 seconds; GstRTSPTimeRange *therange; if (src->range) gst_rtsp_range_free (src->range); if (gst_rtsp_range_parse (range, &therange) == GST_RTSP_OK) { GST_DEBUG_OBJECT (src, "parsed range %s", range); src->range = therange; } else { GST_DEBUG_OBJECT (src, "failed to parse range %s", range); src->range = NULL; gst_segment_init (segment, GST_FORMAT_TIME); return FALSE; } GST_DEBUG_OBJECT (src, "range: type %d, min %f - type %d, max %f ", therange->min.type, therange->min.seconds, therange->max.type, therange->max.seconds); if (therange->min.type == GST_RTSP_TIME_NOW) seconds = 0; else if (therange->min.type == GST_RTSP_TIME_END) seconds = 0; else seconds = therange->min.seconds * GST_SECOND; GST_DEBUG_OBJECT (src, "range: min %" GST_TIME_FORMAT, GST_TIME_ARGS (seconds)); /* we need to start playback without clipping from the position reported by * the server */ segment->start = seconds; segment->last_stop = seconds; if (therange->max.type == GST_RTSP_TIME_NOW) seconds = -1; else if (therange->max.type == GST_RTSP_TIME_END) seconds = -1; else seconds = therange->max.seconds * GST_SECOND; GST_DEBUG_OBJECT (src, "range: max %" GST_TIME_FORMAT, GST_TIME_ARGS (seconds)); /* live (WMS) server might send overflowed large max as its idea of infinity, * compensate to prevent problems later on */ if (seconds != -1 && seconds < 0) { seconds = -1; GST_DEBUG_OBJECT (src, "insane range, set to NONE"); } /* live (WMS) might send min == max, which is not worth recording */ if (segment->duration == -1 && seconds == segment->start) seconds = -1; /* don't change duration with unknown value, we might have a valid value * there that we want to keep. */ if (seconds != -1) gst_segment_set_duration (segment, GST_FORMAT_TIME, seconds); return TRUE; } /* must be called with the RTSP state lock */ static GstRTSPResult gst_rtspsrc_open_from_sdp (GstRTSPSrc * src, GstSDPMessage * sdp, gboolean async) { GstRTSPResult res; gint i, n_streams; /* prepare global stream caps properties */ if (src->props) gst_structure_remove_all_fields (src->props); else src->props = gst_structure_empty_new ("RTSPProperties"); if (src->debug) gst_sdp_message_dump (sdp); gst_rtsp_ext_list_parse_sdp (src->extensions, sdp, src->props); gst_segment_init (&src->segment, GST_FORMAT_TIME); /* parse range for duration reporting. */ { const gchar *range; for (i = 0;; i++) { range = gst_sdp_message_get_attribute_val_n (sdp, "range", i); if (range == NULL) break; /* keep track of the range and configure it in the segment */ if (gst_rtspsrc_parse_range (src, range, &src->segment)) break; } } /* try to find a global control attribute. Note that a '*' means that we should * do aggregate control with the current url (so we don't do anything and * leave the current connection as is) */ { const gchar *control; for (i = 0;; i++) { control = gst_sdp_message_get_attribute_val_n (sdp, "control", i); if (control == NULL) break; /* only take fully qualified urls */ if (g_str_has_prefix (control, "rtsp://")) break; } if (control) { g_free (src->conninfo.location); src->conninfo.location = g_strdup (control); /* make a connection for this, if there was a connection already, nothing * happens. */ if (gst_rtsp_conninfo_connect (src, &src->conninfo, async) < 0) { GST_ERROR_OBJECT (src, "could not connect"); } } /* we need to keep the control url separate from the connection url because * the rules for constructing the media control url need it */ g_free (src->control); src->control = g_strdup (control); } /* create streams */ n_streams = gst_sdp_message_medias_len (sdp); for (i = 0; i < n_streams; i++) { gst_rtspsrc_create_stream (src, sdp, i); } src->state = GST_RTSP_STATE_INIT; /* setup streams */ if ((res = gst_rtspsrc_setup_streams (src, async)) < 0) goto setup_failed; /* reset our state */ src->need_range = TRUE; src->skip = FALSE; src->state = GST_RTSP_STATE_READY; return res; /* ERRORS */ setup_failed: { GST_ERROR_OBJECT (src, "setup failed"); return res; } } static GstRTSPResult gst_rtspsrc_retrieve_sdp (GstRTSPSrc * src, GstSDPMessage ** sdp, gboolean async) { GstRTSPResult res; GstRTSPMessage request = { 0 }; GstRTSPMessage response = { 0 }; guint8 *data; guint size; gchar *respcont = NULL; restart: src->need_redirect = FALSE; /* can't continue without a valid url */ if (G_UNLIKELY (src->conninfo.url == NULL)) { res = GST_RTSP_EINVAL; goto no_url; } src->tried_url_auth = FALSE; if ((res = gst_rtsp_conninfo_connect (src, &src->conninfo, async)) < 0) goto connect_failed; /* create OPTIONS */ GST_DEBUG_OBJECT (src, "create options..."); res = gst_rtsp_message_init_request (&request, GST_RTSP_OPTIONS, src->conninfo.url_str); if (res < 0) goto create_request_failed; /* send OPTIONS */ GST_DEBUG_OBJECT (src, "send options..."); if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "open", ("Retrieving server options")); if ((res = gst_rtspsrc_send (src, src->conninfo.connection, &request, &response, NULL)) < 0) goto send_error; /* parse OPTIONS */ if (!gst_rtspsrc_parse_methods (src, &response)) goto methods_error; /* create DESCRIBE */ GST_DEBUG_OBJECT (src, "create describe..."); res = gst_rtsp_message_init_request (&request, GST_RTSP_DESCRIBE, src->conninfo.url_str); if (res < 0) goto create_request_failed; /* we only accept SDP for now */ gst_rtsp_message_add_header (&request, GST_RTSP_HDR_ACCEPT, "application/sdp"); /* send DESCRIBE */ GST_DEBUG_OBJECT (src, "send describe..."); if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "open", ("Retrieving media info")); if ((res = gst_rtspsrc_send (src, src->conninfo.connection, &request, &response, NULL)) < 0) goto send_error; /* we only perform redirect for the describe, currently */ if (src->need_redirect) { /* close connection, we don't have to send a TEARDOWN yet, ignore the * result. */ gst_rtsp_conninfo_close (src, &src->conninfo, TRUE); gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); /* and now retry */ goto restart; } /* it could be that the DESCRIBE method was not implemented */ if (!src->methods & GST_RTSP_DESCRIBE) goto no_describe; /* check if reply is SDP */ gst_rtsp_message_get_header (&response, GST_RTSP_HDR_CONTENT_TYPE, &respcont, 0); /* could not be set but since the request returned OK, we assume it * was SDP, else check it. */ if (respcont) { if (!g_ascii_strcasecmp (respcont, "application/sdp") == 0) goto wrong_content_type; } /* get message body and parse as SDP */ gst_rtsp_message_get_body (&response, &data, &size); if (data == NULL || size == 0) goto no_describe; GST_DEBUG_OBJECT (src, "parse SDP..."); gst_sdp_message_new (sdp); gst_sdp_message_parse_buffer (data, size, *sdp); /* clean up any messages */ gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); return res; /* ERRORS */ no_url: { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("No valid RTSP URL was provided")); goto cleanup_error; } connect_failed: { gchar *str = gst_rtsp_strresult (res); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL), ("Failed to connect. (%s)", str)); } else { GST_WARNING_OBJECT (src, "connect interrupted"); } g_free (str); goto cleanup_error; } create_request_failed: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Could not create request. (%s)", str)); g_free (str); goto cleanup_error; } send_error: { /* Don't post a message - the rtsp_send method will have * taken care of it because we passed NULL for the response code */ goto cleanup_error; } methods_error: { /* error was posted */ res = GST_RTSP_ERROR; goto cleanup_error; } wrong_content_type: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("Server does not support SDP, got %s.", respcont)); res = GST_RTSP_ERROR; goto cleanup_error; } no_describe: { GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL), ("Server can not provide an SDP.")); res = GST_RTSP_ERROR; goto cleanup_error; } cleanup_error: { if (src->conninfo.connection) { GST_DEBUG_OBJECT (src, "free connection"); gst_rtsp_conninfo_close (src, &src->conninfo, TRUE); } gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); return res; } } static GstRTSPResult gst_rtspsrc_open (GstRTSPSrc * src, gboolean async) { GstRTSPResult ret; src->methods = GST_RTSP_SETUP | GST_RTSP_PLAY | GST_RTSP_PAUSE | GST_RTSP_TEARDOWN; if (src->sdp == NULL) { if ((ret = gst_rtspsrc_retrieve_sdp (src, &src->sdp, async)) < 0) goto no_sdp; } if ((ret = gst_rtspsrc_open_from_sdp (src, src->sdp, async)) < 0) goto open_failed; done: if (async) gst_rtspsrc_loop_end_cmd (src, CMD_OPEN, ret); return ret; /* ERRORS */ no_sdp: { GST_WARNING_OBJECT (src, "can't get sdp"); src->open_error = TRUE; goto done; } open_failed: { GST_WARNING_OBJECT (src, "can't setup streaming from sdp"); src->open_error = TRUE; goto done; } } static GstRTSPResult gst_rtspsrc_close (GstRTSPSrc * src, gboolean async, gboolean only_close) { GstRTSPMessage request = { 0 }; GstRTSPMessage response = { 0 }; GstRTSPResult res = GST_RTSP_OK; GList *walk; gchar *control; GST_DEBUG_OBJECT (src, "TEARDOWN..."); if (src->state < GST_RTSP_STATE_READY) { GST_DEBUG_OBJECT (src, "not ready, doing cleanup"); goto close; } if (only_close) goto close; /* construct a control url */ if (src->control) control = src->control; else control = src->conninfo.url_str; if (!(src->methods & (GST_RTSP_PLAY | GST_RTSP_TEARDOWN))) goto not_supported; for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; gchar *setup_url; GstRTSPConnInfo *info; /* try aggregate control first but do non-aggregate control otherwise */ if (control) setup_url = control; else if ((setup_url = stream->conninfo.location) == NULL) continue; if (src->conninfo.connection) { info = &src->conninfo; } else if (stream->conninfo.connection) { info = &stream->conninfo; } else { continue; } if (!info->connected) goto next; /* do TEARDOWN */ res = gst_rtsp_message_init_request (&request, GST_RTSP_TEARDOWN, setup_url); if (res < 0) goto create_request_failed; if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "close", ("Closing stream")); if ((res = gst_rtspsrc_send (src, info->connection, &request, &response, NULL)) < 0) goto send_error; /* FIXME, parse result? */ gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); next: /* early exit when we did aggregate control */ if (control) break; } close: /* close connections */ GST_DEBUG_OBJECT (src, "closing connection..."); gst_rtsp_conninfo_close (src, &src->conninfo, TRUE); for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; gst_rtsp_conninfo_close (src, &stream->conninfo, TRUE); } /* cleanup */ gst_rtspsrc_cleanup (src); src->state = GST_RTSP_STATE_INVALID; if (async) gst_rtspsrc_loop_end_cmd (src, CMD_CLOSE, res); return res; /* ERRORS */ create_request_failed: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Could not create request. (%s)", str)); g_free (str); goto close; } send_error: { gchar *str = gst_rtsp_strresult (res); gst_rtsp_message_unset (&request); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not send message. (%s)", str)); } else { GST_WARNING_OBJECT (src, "TEARDOWN interrupted"); } g_free (str); goto close; } not_supported: { GST_DEBUG_OBJECT (src, "TEARDOWN and PLAY not supported, can't do TEARDOWN"); goto close; } } /* RTP-Info is of the format: * * url=;[seq=;rtptime=] [, url=...] * * rtptime corresponds to the timestamp for the NPT time given in the header * seqbase corresponds to the next sequence number we received. This number * indicates the first seqnum after the seek and should be used to discard * packets that are from before the seek. */ static gboolean gst_rtspsrc_parse_rtpinfo (GstRTSPSrc * src, gchar * rtpinfo) { gchar **infos; gint i, j; GST_DEBUG_OBJECT (src, "parsing RTP-Info %s", rtpinfo); infos = g_strsplit (rtpinfo, ",", 0); for (i = 0; infos[i]; i++) { gchar **fields; GstRTSPStream *stream; gint32 seqbase; gint64 timebase; GST_DEBUG_OBJECT (src, "parsing info %s", infos[i]); /* init values, types of seqbase and timebase are bigger than needed so we * can store -1 as uninitialized values */ stream = NULL; seqbase = -1; timebase = -1; /* parse url, find stream for url. * parse seq and rtptime. The seq number should be configured in the rtp * depayloader or session manager to detect gaps. Same for the rtptime, it * should be used to create an initial time newsegment. */ fields = g_strsplit (infos[i], ";", 0); for (j = 0; fields[j]; j++) { GST_DEBUG_OBJECT (src, "parsing field %s", fields[j]); /* remove leading whitespace */ fields[j] = g_strchug (fields[j]); if (g_str_has_prefix (fields[j], "url=")) { /* get the url and the stream */ stream = find_stream (src, (fields[j] + 4), (gpointer) find_stream_by_setup); } else if (g_str_has_prefix (fields[j], "seq=")) { seqbase = atoi (fields[j] + 4); } else if (g_str_has_prefix (fields[j], "rtptime=")) { timebase = g_ascii_strtoll (fields[j] + 8, NULL, 10); } } g_strfreev (fields); /* now we need to store the values for the caps of the stream */ if (stream != NULL) { GST_DEBUG_OBJECT (src, "found stream %p, setting: seqbase %d, timebase %" G_GINT64_FORMAT, stream, seqbase, timebase); /* we have a stream, configure detected params */ stream->seqbase = seqbase; stream->timebase = timebase; } } g_strfreev (infos); return TRUE; } static void gst_rtspsrc_handle_rtcp_interval (GstRTSPSrc * src, gchar * rtcp) { guint64 interval; GList *walk; interval = strtoul (rtcp, NULL, 10); GST_DEBUG_OBJECT (src, "rtcp interval: %" G_GUINT64_FORMAT " ms", interval); if (!interval) return; interval *= GST_MSECOND; for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; /* already (optionally) retrieved this when configuring manager */ if (stream->session) { GObject *rtpsession = stream->session; GST_DEBUG_OBJECT (src, "configure rtcp interval in session %p", rtpsession); g_object_set (rtpsession, "rtcp-min-interval", interval, NULL); } } /* now it happens that (Xenon) server sending this may also provide bogus * RTCP SR sync data (i.e. with quite some jitter), so never mind those * and just use RTP-Info to sync */ if (src->manager) { GObjectClass *klass; klass = G_OBJECT_GET_CLASS (G_OBJECT (src->manager)); if (g_object_class_find_property (klass, "rtcp-sync")) { GST_DEBUG_OBJECT (src, "configuring rtp sync method"); g_object_set (src->manager, "rtcp-sync", RTCP_SYNC_RTP, NULL); } } } static gdouble gst_rtspsrc_get_float (const gchar * dstr) { gchar s[G_ASCII_DTOSTR_BUF_SIZE] = { 0, }; /* canonicalise floating point string so we can handle float strings * in the form "24.930" or "24,930" irrespective of the current locale */ g_strlcpy (s, dstr, sizeof (s)); g_strdelimit (s, ",", '.'); return g_ascii_strtod (s, NULL); } static gchar * gen_range_header (GstRTSPSrc * src, GstSegment * segment) { gchar val_str[G_ASCII_DTOSTR_BUF_SIZE] = { 0, }; if (src->range && src->range->min.type == GST_RTSP_TIME_NOW) { g_strlcpy (val_str, "now", sizeof (val_str)); } else { if (segment->last_stop == 0) { g_strlcpy (val_str, "0", sizeof (val_str)); } else { g_ascii_dtostr (val_str, sizeof (val_str), ((gdouble) segment->last_stop) / GST_SECOND); } } return g_strdup_printf ("npt=%s-", val_str); } static void clear_rtp_base (GstRTSPSrc * src, GstRTSPStream * stream) { stream->timebase = -1; stream->seqbase = -1; if (stream->caps) { GstStructure *s; stream->caps = gst_caps_make_writable (stream->caps); s = gst_caps_get_structure (stream->caps, 0); gst_structure_remove_fields (s, "clock-base", "seqnum-base", NULL); } } static GstRTSPResult gst_rtspsrc_ensure_open (GstRTSPSrc * src, gboolean async) { GstRTSPResult res = GST_RTSP_OK; if (src->state < GST_RTSP_STATE_READY) { res = GST_RTSP_ERROR; if (src->open_error) { GST_DEBUG_OBJECT (src, "the stream was in error"); goto done; } if (async) gst_rtspsrc_loop_start_cmd (src, CMD_OPEN); if ((res = gst_rtspsrc_open (src, async)) < 0) { GST_DEBUG_OBJECT (src, "failed to open stream"); goto done; } } done: return res; } static GstRTSPResult gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async) { GstRTSPMessage request = { 0 }; GstRTSPMessage response = { 0 }; GstRTSPResult res = GST_RTSP_OK; GList *walk; gchar *hval; gint hval_idx; gchar *control; GST_DEBUG_OBJECT (src, "PLAY..."); if ((res = gst_rtspsrc_ensure_open (src, async)) < 0) goto open_failed; if (!(src->methods & GST_RTSP_PLAY)) goto not_supported; if (src->state == GST_RTSP_STATE_PLAYING) goto was_playing; if (!src->conninfo.connection || !src->conninfo.connected) goto done; /* send some dummy packets before we activate the receive in the * udp sources */ gst_rtspsrc_send_dummy_packets (src); /* activate receive elements; * only in async case, since receive elements may not have been affected * by overall state change (e.g. not around yet), * do not mess with state in sync case (e.g. seeking) */ if (async) gst_element_set_state (GST_ELEMENT_CAST (src), GST_STATE_PLAYING); /* construct a control url */ if (src->control) control = src->control; else control = src->conninfo.url_str; for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; gchar *setup_url; GstRTSPConnection *conn; /* try aggregate control first but do non-aggregate control otherwise */ if (control) setup_url = control; else if ((setup_url = stream->conninfo.location) == NULL) continue; if (src->conninfo.connection) { conn = src->conninfo.connection; } else if (stream->conninfo.connection) { conn = stream->conninfo.connection; } else { continue; } /* do play */ res = gst_rtsp_message_init_request (&request, GST_RTSP_PLAY, setup_url); if (res < 0) goto create_request_failed; if (src->need_range) { hval = gen_range_header (src, segment); gst_rtsp_message_add_header (&request, GST_RTSP_HDR_RANGE, hval); g_free (hval); } if (segment->rate != 1.0) { gchar hval[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_dtostr (hval, sizeof (hval), segment->rate); if (src->skip) gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SCALE, hval); else gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SPEED, hval); } if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("Sending PLAY request")); if ((res = gst_rtspsrc_send (src, conn, &request, &response, NULL)) < 0) goto send_error; /* seek may have silently failed as it is not supported */ if (!(src->methods & GST_RTSP_PLAY)) { GST_DEBUG_OBJECT (src, "PLAY Range not supported; re-enable PLAY"); /* obviously it is supported as we made it here */ src->methods |= GST_RTSP_PLAY; src->seekable = FALSE; /* but there is nothing to parse in the response, * so convey we have no idea and not to expect anything particular */ clear_rtp_base (src, stream); if (control) { GList *run; /* need to do for all streams */ for (run = src->streams; run; run = g_list_next (run)) clear_rtp_base (src, (GstRTSPStream *) run->data); } /* NOTE the above also disables npt based eos detection */ /* and below forces position to 0, * which is visible feedback we lost the plot */ segment->start = segment->last_stop = src->last_pos; } gst_rtsp_message_unset (&request); /* parse RTP npt field. This is the current position in the stream (Normal * Play Time) and should be put in the NEWSEGMENT position field. */ if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_RANGE, &hval, 0) == GST_RTSP_OK) gst_rtspsrc_parse_range (src, hval, segment); /* assume 1.0 rate now, overwrite when the SCALE or SPEED headers are present. */ segment->rate = 1.0; /* parse Speed header. This is the intended playback rate of the stream * and should be put in the NEWSEGMENT rate field. */ if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_SPEED, &hval, 0) == GST_RTSP_OK) { segment->rate = gst_rtspsrc_get_float (hval); } else if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_SCALE, &hval, 0) == GST_RTSP_OK) { segment->rate = gst_rtspsrc_get_float (hval); } /* parse the RTP-Info header field (if ANY) to get the base seqnum and timestamp * for the RTP packets. If this is not present, we assume all starts from 0... * This is info for the RTP session manager that we pass to it in caps. */ hval_idx = 0; while (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_RTP_INFO, &hval, hval_idx++) == GST_RTSP_OK) gst_rtspsrc_parse_rtpinfo (src, hval); /* some servers indicate RTCP parameters in PLAY response, * rather than properly in SDP */ if (gst_rtsp_message_get_header (&response, GST_RTSP_HDR_RTCP_INTERVAL, &hval, 0) == GST_RTSP_OK) gst_rtspsrc_handle_rtcp_interval (src, hval); gst_rtsp_message_unset (&response); /* early exit when we did aggregate control */ if (control) break; } /* set again when needed */ src->need_range = FALSE; /* configure the caps of the streams after we parsed all headers. */ gst_rtspsrc_configure_caps (src, segment); src->running = TRUE; src->base_time = -1; src->state = GST_RTSP_STATE_PLAYING; /* mark discont */ GST_DEBUG_OBJECT (src, "mark DISCONT, we did a seek to another position"); for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; stream->discont = TRUE; } done: if (async) gst_rtspsrc_loop_end_cmd (src, CMD_PLAY, res); return res; /* ERRORS */ open_failed: { GST_DEBUG_OBJECT (src, "failed to open stream"); goto done; } not_supported: { GST_DEBUG_OBJECT (src, "PLAY is not supported"); goto done; } was_playing: { GST_DEBUG_OBJECT (src, "we were already PLAYING"); goto done; } create_request_failed: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Could not create request. (%s)", str)); g_free (str); goto done; } send_error: { gchar *str = gst_rtsp_strresult (res); gst_rtsp_message_unset (&request); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not send message. (%s)", str)); } else { GST_WARNING_OBJECT (src, "PLAY interrupted"); } g_free (str); goto done; } } static GstRTSPResult gst_rtspsrc_pause (GstRTSPSrc * src, gboolean idle, gboolean async) { GstRTSPResult res = GST_RTSP_OK; GstRTSPMessage request = { 0 }; GstRTSPMessage response = { 0 }; GList *walk; gchar *control; GST_DEBUG_OBJECT (src, "PAUSE..."); if ((res = gst_rtspsrc_ensure_open (src, async)) < 0) goto open_failed; if (!(src->methods & GST_RTSP_PAUSE)) goto not_supported; if (src->state == GST_RTSP_STATE_READY) goto was_paused; if (!src->conninfo.connection || !src->conninfo.connected) goto no_connection; /* construct a control url */ if (src->control) control = src->control; else control = src->conninfo.url_str; /* loop over the streams. We might exit the loop early when we could do an * aggregate control */ for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; GstRTSPConnection *conn; gchar *setup_url; /* try aggregate control first but do non-aggregate control otherwise */ if (control) setup_url = control; else if ((setup_url = stream->conninfo.location) == NULL) continue; if (src->conninfo.connection) { conn = src->conninfo.connection; } else if (stream->conninfo.connection) { conn = stream->conninfo.connection; } else { continue; } if (async) GST_ELEMENT_PROGRESS (src, CONTINUE, "request", ("Sending PAUSE request")); if ((res = gst_rtsp_message_init_request (&request, GST_RTSP_PAUSE, setup_url)) < 0) goto create_request_failed; if ((res = gst_rtspsrc_send (src, conn, &request, &response, NULL)) < 0) goto send_error; gst_rtsp_message_unset (&request); gst_rtsp_message_unset (&response); /* exit early when we did agregate control */ if (control) break; } no_connection: src->state = GST_RTSP_STATE_READY; done: if (async) gst_rtspsrc_loop_end_cmd (src, CMD_PAUSE, res); return res; /* ERRORS */ open_failed: { GST_DEBUG_OBJECT (src, "failed to open stream"); goto done; } not_supported: { GST_DEBUG_OBJECT (src, "PAUSE is not supported"); goto done; } was_paused: { GST_DEBUG_OBJECT (src, "we were already PAUSED"); goto done; } create_request_failed: { gchar *str = gst_rtsp_strresult (res); GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Could not create request. (%s)", str)); g_free (str); goto done; } send_error: { gchar *str = gst_rtsp_strresult (res); gst_rtsp_message_unset (&request); if (res != GST_RTSP_EINTR) { GST_ELEMENT_ERROR (src, RESOURCE, WRITE, (NULL), ("Could not send message. (%s)", str)); } else { GST_WARNING_OBJECT (src, "PAUSE interrupted"); } g_free (str); goto done; } } static void gst_rtspsrc_handle_message (GstBin * bin, GstMessage * message) { GstRTSPSrc *rtspsrc; rtspsrc = GST_RTSPSRC (bin); switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_EOS: gst_message_unref (message); break; case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); if (gst_structure_has_name (s, "GstUDPSrcTimeout")) { gboolean ignore_timeout; GST_DEBUG_OBJECT (bin, "timeout on UDP port"); GST_OBJECT_LOCK (rtspsrc); ignore_timeout = rtspsrc->ignore_timeout; rtspsrc->ignore_timeout = TRUE; GST_OBJECT_UNLOCK (rtspsrc); /* we only act on the first udp timeout message, others are irrelevant * and can be ignored. */ if (!ignore_timeout) gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_RECONNECT, TRUE); /* eat and free */ gst_message_unref (message); return; } GST_BIN_CLASS (parent_class)->handle_message (bin, message); break; } case GST_MESSAGE_ERROR: { GstObject *udpsrc; GstRTSPStream *stream; GstFlowReturn ret; udpsrc = GST_MESSAGE_SRC (message); GST_DEBUG_OBJECT (rtspsrc, "got error from %s", GST_ELEMENT_NAME (udpsrc)); stream = find_stream (rtspsrc, udpsrc, (gpointer) find_stream_by_udpsrc); if (!stream) goto forward; /* we ignore the RTCP udpsrc */ if (stream->udpsrc[1] == GST_ELEMENT_CAST (udpsrc)) goto done; /* if we get error messages from the udp sources, that's not a problem as * long as not all of them error out. We also don't really know what the * problem is, the message does not give enough detail... */ ret = gst_rtspsrc_combine_flows (rtspsrc, stream, GST_FLOW_NOT_LINKED); GST_DEBUG_OBJECT (rtspsrc, "combined flows: %s", gst_flow_get_name (ret)); if (ret != GST_FLOW_OK) goto forward; done: gst_message_unref (message); break; forward: /* fatal but not our message, forward */ GST_BIN_CLASS (parent_class)->handle_message (bin, message); break; } default: { GST_BIN_CLASS (parent_class)->handle_message (bin, message); break; } } } /* the thread where everything happens */ static void gst_rtspsrc_thread (GstRTSPSrc * src) { gint cmd; GstRTSPResult ret; gboolean running = FALSE; GST_OBJECT_LOCK (src); cmd = src->loop_cmd; src->loop_cmd = CMD_WAIT; GST_DEBUG_OBJECT (src, "got command %d", cmd); /* we got the message command, so ensure communication is possible again */ gst_rtspsrc_connection_flush (src, FALSE); /* we allow these to be interrupted */ if (cmd == CMD_LOOP || cmd == CMD_CLOSE || cmd == CMD_PAUSE) src->waiting = TRUE; GST_OBJECT_UNLOCK (src); switch (cmd) { case CMD_OPEN: ret = gst_rtspsrc_open (src, TRUE); break; case CMD_PLAY: ret = gst_rtspsrc_play (src, &src->segment, TRUE); if (ret == GST_RTSP_OK) running = TRUE; break; case CMD_PAUSE: ret = gst_rtspsrc_pause (src, TRUE, TRUE); if (ret == GST_RTSP_OK) running = TRUE; break; case CMD_CLOSE: ret = gst_rtspsrc_close (src, TRUE, FALSE); break; case CMD_LOOP: running = gst_rtspsrc_loop (src); break; case CMD_RECONNECT: ret = gst_rtspsrc_reconnect (src, FALSE); if (ret == GST_RTSP_OK) running = TRUE; break; default: break; } GST_OBJECT_LOCK (src); /* and go back to sleep */ if (src->loop_cmd == CMD_WAIT) { if (running) src->loop_cmd = CMD_LOOP; else if (src->task) gst_task_pause (src->task); } /* reset waiting */ src->waiting = FALSE; GST_OBJECT_UNLOCK (src); } static gboolean gst_rtspsrc_start (GstRTSPSrc * src) { GST_DEBUG_OBJECT (src, "starting"); GST_OBJECT_LOCK (src); src->loop_cmd = CMD_WAIT; if (src->task == NULL) { src->task = gst_task_create ((GstTaskFunction) gst_rtspsrc_thread, src); if (src->task == NULL) goto task_error; gst_task_set_lock (src->task, GST_RTSP_STREAM_GET_LOCK (src)); } GST_OBJECT_UNLOCK (src); return TRUE; /* ERRORS */ task_error: { GST_ERROR_OBJECT (src, "failed to create task"); return FALSE; } } static gboolean gst_rtspsrc_stop (GstRTSPSrc * src) { GstTask *task; GST_DEBUG_OBJECT (src, "stopping"); /* also cancels pending task */ gst_rtspsrc_loop_send_cmd (src, CMD_WAIT, TRUE); GST_OBJECT_LOCK (src); if ((task = src->task)) { src->task = NULL; GST_OBJECT_UNLOCK (src); gst_task_stop (task); /* make sure it is not running */ GST_RTSP_STREAM_LOCK (src); GST_RTSP_STREAM_UNLOCK (src); /* now wait for the task to finish */ gst_task_join (task); /* and free the task */ gst_object_unref (GST_OBJECT (task)); GST_OBJECT_LOCK (src); } GST_OBJECT_UNLOCK (src); /* ensure synchronously all is closed and clean */ gst_rtspsrc_close (src, FALSE, TRUE); return TRUE; } static GstStateChangeReturn gst_rtspsrc_change_state (GstElement * element, GstStateChange transition) { GstRTSPSrc *rtspsrc; GstStateChangeReturn ret; rtspsrc = GST_RTSPSRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_rtspsrc_start (rtspsrc)) goto start_failed; break; case GST_STATE_CHANGE_READY_TO_PAUSED: /* init some state */ rtspsrc->cur_protocols = rtspsrc->protocols; /* first attempt, don't ignore timeouts */ rtspsrc->ignore_timeout = FALSE; rtspsrc->open_error = FALSE; gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_OPEN, FALSE); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: case GST_STATE_CHANGE_PLAYING_TO_PAUSED: /* unblock the tcp tasks and make the loop waiting */ gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_WAIT, TRUE); break; case GST_STATE_CHANGE_PAUSED_TO_READY: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto done; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_PLAY, FALSE); break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: /* send pause request and keep the idle task around */ gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_PAUSE, FALSE); ret = GST_STATE_CHANGE_NO_PREROLL; break; case GST_STATE_CHANGE_READY_TO_PAUSED: ret = GST_STATE_CHANGE_NO_PREROLL; break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_CLOSE, FALSE); break; case GST_STATE_CHANGE_READY_TO_NULL: gst_rtspsrc_stop (rtspsrc); break; default: break; } done: return ret; start_failed: { GST_DEBUG_OBJECT (rtspsrc, "start failed"); return GST_STATE_CHANGE_FAILURE; } } static gboolean gst_rtspsrc_send_event (GstElement * element, GstEvent * event) { gboolean res; GstRTSPSrc *rtspsrc; rtspsrc = GST_RTSPSRC (element); if (GST_EVENT_IS_DOWNSTREAM (event)) { res = gst_rtspsrc_push_event (rtspsrc, event, TRUE); } else { res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event); } return res; } /*** GSTURIHANDLER INTERFACE *************************************************/ static GstURIType gst_rtspsrc_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_rtspsrc_uri_get_protocols (void) { static const gchar *protocols[] = { "rtsp", "rtspu", "rtspt", "rtsph", "rtsp-sdp", NULL }; return (gchar **) protocols; } static const gchar * gst_rtspsrc_uri_get_uri (GstURIHandler * handler) { GstRTSPSrc *src = GST_RTSPSRC (handler); /* should not dup */ return src->conninfo.location; } static gboolean gst_rtspsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri) { GstRTSPSrc *src; GstRTSPResult res; GstRTSPUrl *newurl = NULL; GstSDPMessage *sdp = NULL; src = GST_RTSPSRC (handler); /* same URI, we're fine */ if (src->conninfo.location && uri && !strcmp (uri, src->conninfo.location)) goto was_ok; if (g_str_has_prefix (uri, "rtsp-sdp://")) { if ((res = gst_sdp_message_new (&sdp) < 0)) goto sdp_failed; GST_DEBUG_OBJECT (src, "parsing SDP message"); if ((res = gst_sdp_message_parse_uri (uri, sdp) < 0)) goto invalid_sdp; } else { /* try to parse */ GST_DEBUG_OBJECT (src, "parsing URI"); if ((res = gst_rtsp_url_parse (uri, &newurl)) < 0) goto parse_error; } /* if worked, free previous and store new url object along with the original * location. */ GST_DEBUG_OBJECT (src, "configuring URI"); g_free (src->conninfo.location); src->conninfo.location = g_strdup (uri); gst_rtsp_url_free (src->conninfo.url); src->conninfo.url = newurl; g_free (src->conninfo.url_str); if (newurl) src->conninfo.url_str = gst_rtsp_url_get_request_uri (src->conninfo.url); else src->conninfo.url_str = NULL; if (src->sdp) gst_sdp_message_free (src->sdp); src->sdp = sdp; src->from_sdp = sdp != NULL; GST_DEBUG_OBJECT (src, "set uri: %s", GST_STR_NULL (uri)); GST_DEBUG_OBJECT (src, "request uri is: %s", GST_STR_NULL (src->conninfo.url_str)); return TRUE; /* Special cases */ was_ok: { GST_DEBUG_OBJECT (src, "URI was ok: '%s'", GST_STR_NULL (uri)); return TRUE; } sdp_failed: { GST_ERROR_OBJECT (src, "Could not create new SDP (%d)", res); return FALSE; } invalid_sdp: { GST_ERROR_OBJECT (src, "Not a valid SDP (%d) '%s'", res, GST_STR_NULL (uri)); gst_sdp_message_free (sdp); return FALSE; } parse_error: { GST_ERROR_OBJECT (src, "Not a valid RTSP url '%s' (%d)", GST_STR_NULL (uri), res); return FALSE; } } static void gst_rtspsrc_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_rtspsrc_uri_get_type; iface->get_protocols = gst_rtspsrc_uri_get_protocols; iface->get_uri = gst_rtspsrc_uri_get_uri; iface->set_uri = gst_rtspsrc_uri_set_uri; } gst-plugins-good-0.10.31/gst/rtsp/Makefile.am0000644000175000017500000000211711671175354015633 00000000000000plugin_LTLIBRARIES = libgstrtsp.la libgstrtsp_la_SOURCES = gstrtsp.c gstrtspsrc.c \ gstrtpdec.c gstrtspext.c libgstrtsp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstrtsp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ -lgstinterfaces-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ -lgstrtsp-@GST_MAJORMINOR@ \ -lgstsdp-@GST_MAJORMINOR@ $(GST_LIBS) $(WIN32_LIBS) libgstrtsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrtsp_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstrtspsrc.h \ gstrtsp.h \ gstrtpdec.h \ gstrtspext.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstrtsp -:SHARED libgstrtsp \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstrtsp_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtsp_la_CFLAGS) \ -:LDFLAGS $(libgstrtsp_la_LDFLAGS) \ $(libgstrtsp_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/rtsp/gstrtspext.h0000644000175000017500000000746711671175354016214 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_RTSP_EXT_H__ #define __GST_RTSP_EXT_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTSPExtensionList GstRTSPExtensionList; struct _GstRTSPExtensionList { GList *extensions; }; void gst_rtsp_ext_list_init (void); GstRTSPExtensionList * gst_rtsp_ext_list_get (void); void gst_rtsp_ext_list_free (GstRTSPExtensionList *ext); gboolean gst_rtsp_ext_list_detect_server (GstRTSPExtensionList *ext, GstRTSPMessage *resp); GstRTSPResult gst_rtsp_ext_list_before_send (GstRTSPExtensionList *ext, GstRTSPMessage *req); GstRTSPResult gst_rtsp_ext_list_after_send (GstRTSPExtensionList *ext, GstRTSPMessage *req, GstRTSPMessage *resp); GstRTSPResult gst_rtsp_ext_list_parse_sdp (GstRTSPExtensionList *ext, GstSDPMessage *sdp, GstStructure *s); GstRTSPResult gst_rtsp_ext_list_setup_media (GstRTSPExtensionList *ext, GstSDPMedia *media); gboolean gst_rtsp_ext_list_configure_stream (GstRTSPExtensionList *ext, GstCaps *caps); GstRTSPResult gst_rtsp_ext_list_get_transports (GstRTSPExtensionList *ext, GstRTSPLowerTrans protocols, gchar **transport); GstRTSPResult gst_rtsp_ext_list_stream_select (GstRTSPExtensionList *ext, GstRTSPUrl *url); void gst_rtsp_ext_list_connect (GstRTSPExtensionList *ext, const gchar *detailed_signal, GCallback c_handler, gpointer data); GstRTSPResult gst_rtsp_ext_list_receive_request (GstRTSPExtensionList *ext, GstRTSPMessage *req); G_END_DECLS #endif /* __GST_RTSP_EXT_H__ */ gst-plugins-good-0.10.31/gst/rtsp/gstrtpdec.c0000644000175000017500000006612411677341656015760 00000000000000/* GStreamer * Copyright (C) <2005,2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ /* Element-Checklist-Version: 5 */ /** * SECTION:element-rtpdec * * A simple RTP session manager used internally by rtspsrc. * * Last reviewed on 2006-06-20 (0.10.4) */ /* #define HAVE_RTCP */ #include #ifdef HAVE_RTCP #include #endif #include "gstrtpdec.h" #include GST_DEBUG_CATEGORY_STATIC (rtpdec_debug); #define GST_CAT_DEFAULT (rtpdec_debug) /* GstRTPDec signals and args */ enum { SIGNAL_REQUEST_PT_MAP, SIGNAL_CLEAR_PT_MAP, SIGNAL_ON_NEW_SSRC, SIGNAL_ON_SSRC_COLLISION, SIGNAL_ON_SSRC_VALIDATED, SIGNAL_ON_BYE_SSRC, SIGNAL_ON_BYE_TIMEOUT, SIGNAL_ON_TIMEOUT, LAST_SIGNAL }; #define DEFAULT_LATENCY_MS 200 enum { PROP_0, PROP_LATENCY }; static GstStaticPadTemplate gst_rtp_dec_recv_rtp_sink_template = GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate gst_rtp_dec_recv_rtcp_sink_template = GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate gst_rtp_dec_recv_rtp_src_template = GST_STATIC_PAD_TEMPLATE ("recv_rtp_src_%d_%d_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate gst_rtp_dec_rtcp_src_template = GST_STATIC_PAD_TEMPLATE ("rtcp_src_%d", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); static void gst_rtp_dec_finalize (GObject * object); static void gst_rtp_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_dec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstClock *gst_rtp_dec_provide_clock (GstElement * element); static GstStateChangeReturn gst_rtp_dec_change_state (GstElement * element, GstStateChange transition); static GstPad *gst_rtp_dec_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_rtp_dec_release_pad (GstElement * element, GstPad * pad); static GstFlowReturn gst_rtp_dec_chain_rtp (GstPad * pad, GstBuffer * buffer); static GstFlowReturn gst_rtp_dec_chain_rtcp (GstPad * pad, GstBuffer * buffer); /* Manages the receiving end of the packets. * * There is one such structure for each RTP session (audio/video/...). * We get the RTP/RTCP packets and stuff them into the session manager. */ struct _GstRTPDecSession { /* session id */ gint id; /* the parent bin */ GstRTPDec *dec; gboolean active; /* we only support one ssrc and one pt */ guint32 ssrc; guint8 pt; GstCaps *caps; /* the pads of the session */ GstPad *recv_rtp_sink; GstPad *recv_rtp_src; GstPad *recv_rtcp_sink; GstPad *rtcp_src; }; /* find a session with the given id */ static GstRTPDecSession * find_session_by_id (GstRTPDec * rtpdec, gint id) { GSList *walk; for (walk = rtpdec->sessions; walk; walk = g_slist_next (walk)) { GstRTPDecSession *sess = (GstRTPDecSession *) walk->data; if (sess->id == id) return sess; } return NULL; } /* create a session with the given id */ static GstRTPDecSession * create_session (GstRTPDec * rtpdec, gint id) { GstRTPDecSession *sess; sess = g_new0 (GstRTPDecSession, 1); sess->id = id; sess->dec = rtpdec; rtpdec->sessions = g_slist_prepend (rtpdec->sessions, sess); return sess; } static void free_session (GstRTPDecSession * session) { g_free (session); } static guint gst_rtp_dec_signals[LAST_SIGNAL] = { 0 }; GST_BOILERPLATE (GstRTPDec, gst_rtp_dec, GstElement, GST_TYPE_ELEMENT); static void gst_rtp_dec_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); /* sink pads */ gst_element_class_add_static_pad_template (element_class, &gst_rtp_dec_recv_rtp_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_dec_recv_rtcp_sink_template); /* src pads */ gst_element_class_add_static_pad_template (element_class, &gst_rtp_dec_recv_rtp_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_dec_rtcp_src_template); gst_element_class_set_details_simple (element_class, "RTP Decoder", "Codec/Parser/Network", "Accepts raw RTP and RTCP packets and sends them forward", "Wim Taymans "); } /* BOXED:UINT,UINT */ #define g_marshal_value_peek_uint(v) g_value_get_uint (v) static void gst_rtp_dec_marshal_BOXED__UINT_UINT (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_BOXED__UINT_UINT) (gpointer data1, guint arg_1, guint arg_2, gpointer data2); register GMarshalFunc_BOXED__UINT_UINT callback; register GCClosure *cc = (GCClosure *) closure; register gpointer data1, data2; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOXED__UINT_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); g_value_take_boxed (return_value, v_return); } static void gst_rtp_dec_marshal_VOID__UINT_UINT (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, guint arg_1, guint arg_2, gpointer data2); register GMarshalFunc_VOID__UINT_UINT callback; register GCClosure *cc = (GCClosure *) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } static void gst_rtp_dec_class_init (GstRTPDecClass * g_class) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstRTPDecClass *klass; klass = (GstRTPDecClass *) g_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_rtp_dec_finalize; gobject_class->set_property = gst_rtp_dec_set_property; gobject_class->get_property = gst_rtp_dec_get_property; g_object_class_install_property (gobject_class, PROP_LATENCY, g_param_spec_uint ("latency", "Buffer latency in ms", "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRTPDec::request-pt-map: * @rtpdec: the object which received the signal * @session: the session * @pt: the pt * * Request the payload type as #GstCaps for @pt in @session. */ gst_rtp_dec_signals[SIGNAL_REQUEST_PT_MAP] = g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, request_pt_map), NULL, NULL, gst_rtp_dec_marshal_BOXED__UINT_UINT, GST_TYPE_CAPS, 2, G_TYPE_UINT, G_TYPE_UINT); gst_rtp_dec_signals[SIGNAL_CLEAR_PT_MAP] = g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** * GstRTPDec::on-new-ssrc: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a new SSRC that entered @session. */ gst_rtp_dec_signals[SIGNAL_ON_NEW_SSRC] = g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_new_ssrc), NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRTPDec::on-ssrc_collision: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify when we have an SSRC collision */ gst_rtp_dec_signals[SIGNAL_ON_SSRC_COLLISION] = g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_ssrc_collision), NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRTPDec::on-ssrc_validated: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a new SSRC that became validated. */ gst_rtp_dec_signals[SIGNAL_ON_SSRC_VALIDATED] = g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_ssrc_validated), NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRTPDec::on-bye-ssrc: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of an SSRC that became inactive because of a BYE packet. */ gst_rtp_dec_signals[SIGNAL_ON_BYE_SSRC] = g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_bye_ssrc), NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRTPDec::on-bye-timeout: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of an SSRC that has timed out because of BYE */ gst_rtp_dec_signals[SIGNAL_ON_BYE_TIMEOUT] = g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_bye_timeout), NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRTPDec::on-timeout: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of an SSRC that has timed out */ gst_rtp_dec_signals[SIGNAL_ON_TIMEOUT] = g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTPDecClass, on_timeout), NULL, NULL, gst_rtp_dec_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); gstelement_class->provide_clock = GST_DEBUG_FUNCPTR (gst_rtp_dec_provide_clock); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_dec_change_state); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_rtp_dec_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_dec_release_pad); GST_DEBUG_CATEGORY_INIT (rtpdec_debug, "rtpdec", 0, "RTP decoder"); } static void gst_rtp_dec_init (GstRTPDec * rtpdec, GstRTPDecClass * klass) { rtpdec->provided_clock = gst_system_clock_obtain (); rtpdec->latency = DEFAULT_LATENCY_MS; } static void gst_rtp_dec_finalize (GObject * object) { GstRTPDec *rtpdec; rtpdec = GST_RTP_DEC (object); g_slist_foreach (rtpdec->sessions, (GFunc) free_session, NULL); g_slist_free (rtpdec->sessions); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_dec_query_src (GstPad * pad, GstQuery * query) { gboolean res; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { /* we pretend to be live with a 3 second latency */ gst_query_set_latency (query, TRUE, 3 * GST_SECOND, -1); res = TRUE; break; } default: res = gst_pad_query_default (pad, query); break; } return res; } static GstFlowReturn gst_rtp_dec_chain_rtp (GstPad * pad, GstBuffer * buffer) { GstFlowReturn res; GstRTPDec *rtpdec; GstRTPDecSession *session; guint32 ssrc; guint8 pt; rtpdec = GST_RTP_DEC (GST_PAD_PARENT (pad)); GST_DEBUG_OBJECT (rtpdec, "got rtp packet"); if (!gst_rtp_buffer_validate (buffer)) goto bad_packet; ssrc = gst_rtp_buffer_get_ssrc (buffer); pt = gst_rtp_buffer_get_payload_type (buffer); GST_DEBUG_OBJECT (rtpdec, "SSRC %08x, PT %d", ssrc, pt); /* find session */ session = gst_pad_get_element_private (pad); /* see if we have the pad */ if (!session->active) { GstPadTemplate *templ; GstElementClass *klass; gchar *name; GstCaps *caps; GValue ret = { 0 }; GValue args[3] = { {0} , {0} , {0} }; GST_DEBUG_OBJECT (rtpdec, "creating stream"); session->ssrc = ssrc; session->pt = pt; /* get pt map */ g_value_init (&args[0], GST_TYPE_ELEMENT); g_value_set_object (&args[0], rtpdec); g_value_init (&args[1], G_TYPE_UINT); g_value_set_uint (&args[1], session->id); g_value_init (&args[2], G_TYPE_UINT); g_value_set_uint (&args[2], pt); g_value_init (&ret, GST_TYPE_CAPS); g_value_set_boxed (&ret, NULL); g_signal_emitv (args, gst_rtp_dec_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); caps = (GstCaps *) g_value_get_boxed (&ret); name = g_strdup_printf ("recv_rtp_src_%d_%u_%d", session->id, ssrc, pt); klass = GST_ELEMENT_GET_CLASS (rtpdec); templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%d_%d_%d"); session->recv_rtp_src = gst_pad_new_from_template (templ, name); g_free (name); gst_pad_set_caps (session->recv_rtp_src, caps); gst_pad_set_element_private (session->recv_rtp_src, session); gst_pad_set_query_function (session->recv_rtp_src, gst_rtp_dec_query_src); gst_pad_set_active (session->recv_rtp_src, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->recv_rtp_src); session->active = TRUE; } gst_buffer_set_caps (buffer, GST_PAD_CAPS (session->recv_rtp_src)); res = gst_pad_push (session->recv_rtp_src, buffer); return res; bad_packet: { GST_ELEMENT_WARNING (rtpdec, STREAM, DECODE, (NULL), ("RTP packet did not validate, dropping")); gst_buffer_unref (buffer); return GST_FLOW_OK; } } static GstFlowReturn gst_rtp_dec_chain_rtcp (GstPad * pad, GstBuffer * buffer) { GstRTPDec *src; #ifdef HAVE_RTCP gboolean valid; GstRTCPPacket packet; gboolean more; #endif src = GST_RTP_DEC (GST_PAD_PARENT (pad)); GST_DEBUG_OBJECT (src, "got rtcp packet"); #ifdef HAVE_RTCP valid = gst_rtcp_buffer_validate (buffer); if (!valid) goto bad_packet; /* position on first packet */ more = gst_rtcp_buffer_get_first_packet (buffer, &packet); while (more) { switch (gst_rtcp_packet_get_type (&packet)) { case GST_RTCP_TYPE_SR: { guint32 ssrc, rtptime, packet_count, octet_count; guint64 ntptime; guint count, i; gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime, &packet_count, &octet_count); GST_DEBUG_OBJECT (src, "got SR packet: SSRC %08x, NTP %" G_GUINT64_FORMAT ", RTP %u, PC %u, OC %u", ssrc, ntptime, rtptime, packet_count, octet_count); count = gst_rtcp_packet_get_rb_count (&packet); for (i = 0; i < count; i++) { guint32 ssrc, exthighestseq, jitter, lsr, dlsr; guint8 fractionlost; gint32 packetslost; gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, packetslost, exthighestseq, jitter, lsr, dlsr); } break; } case GST_RTCP_TYPE_RR: { guint32 ssrc; guint count, i; ssrc = gst_rtcp_packet_rr_get_ssrc (&packet); GST_DEBUG_OBJECT (src, "got RR packet: SSRC %08x", ssrc); count = gst_rtcp_packet_get_rb_count (&packet); for (i = 0; i < count; i++) { guint32 ssrc, exthighestseq, jitter, lsr, dlsr; guint8 fractionlost; gint32 packetslost; gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, packetslost, exthighestseq, jitter, lsr, dlsr); } break; } case GST_RTCP_TYPE_SDES: { guint chunks, i, j; gboolean more_chunks, more_items; chunks = gst_rtcp_packet_sdes_get_chunk_count (&packet); GST_DEBUG_OBJECT (src, "got SDES packet with %d chunks", chunks); more_chunks = gst_rtcp_packet_sdes_first_chunk (&packet); i = 0; while (more_chunks) { guint32 ssrc; ssrc = gst_rtcp_packet_sdes_get_ssrc (&packet); GST_DEBUG_OBJECT (src, "chunk %d, SSRC %08x", i, ssrc); more_items = gst_rtcp_packet_sdes_first_item (&packet); j = 0; while (more_items) { GstRTCPSDESType type; guint8 len; gchar *data; gst_rtcp_packet_sdes_get_item (&packet, &type, &len, &data); GST_DEBUG_OBJECT (src, "item %d, type %d, len %d, data %s", j, type, len, data); more_items = gst_rtcp_packet_sdes_next_item (&packet); j++; } more_chunks = gst_rtcp_packet_sdes_next_chunk (&packet); i++; } break; } case GST_RTCP_TYPE_BYE: { guint count, i; gchar *reason; reason = gst_rtcp_packet_bye_get_reason (&packet); GST_DEBUG_OBJECT (src, "got BYE packet (reason: %s)", GST_STR_NULL (reason)); g_free (reason); count = gst_rtcp_packet_bye_get_ssrc_count (&packet); for (i = 0; i < count; i++) { guint32 ssrc; ssrc = gst_rtcp_packet_bye_get_nth_ssrc (&packet, i); GST_DEBUG_OBJECT (src, "SSRC: %08x", ssrc); } break; } case GST_RTCP_TYPE_APP: GST_DEBUG_OBJECT (src, "got APP packet"); break; default: GST_WARNING_OBJECT (src, "got unknown RTCP packet"); break; } more = gst_rtcp_packet_move_to_next (&packet); } gst_buffer_unref (buffer); return GST_FLOW_OK; bad_packet: { GST_WARNING_OBJECT (src, "got invalid RTCP packet"); gst_buffer_unref (buffer); return GST_FLOW_OK; } #else gst_buffer_unref (buffer); return GST_FLOW_OK; #endif } static void gst_rtp_dec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRTPDec *src; src = GST_RTP_DEC (object); switch (prop_id) { case PROP_LATENCY: src->latency = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_dec_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRTPDec *src; src = GST_RTP_DEC (object); switch (prop_id) { case PROP_LATENCY: g_value_set_uint (value, src->latency); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstClock * gst_rtp_dec_provide_clock (GstElement * element) { GstRTPDec *rtpdec; rtpdec = GST_RTP_DEC (element); return GST_CLOCK_CAST (gst_object_ref (rtpdec->provided_clock)); } static GstStateChangeReturn gst_rtp_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_PLAYING_TO_PAUSED: /* we're NO_PREROLL when going to PAUSED */ ret = GST_STATE_CHANGE_NO_PREROLL; break; default: break; } return ret; } /* Create a pad for receiving RTP for the session in @name */ static GstPad * create_recv_rtp (GstRTPDec * rtpdec, GstPadTemplate * templ, const gchar * name) { guint sessid; GstRTPDecSession *session; /* first get the session number */ if (name == NULL || sscanf (name, "recv_rtp_sink_%d", &sessid) != 1) goto no_name; GST_DEBUG_OBJECT (rtpdec, "finding session %d", sessid); /* get or create session */ session = find_session_by_id (rtpdec, sessid); if (!session) { GST_DEBUG_OBJECT (rtpdec, "creating session %d", sessid); /* create session now */ session = create_session (rtpdec, sessid); if (session == NULL) goto create_error; } /* check if pad was requested */ if (session->recv_rtp_sink != NULL) goto existed; GST_DEBUG_OBJECT (rtpdec, "getting RTP sink pad"); session->recv_rtp_sink = gst_pad_new_from_template (templ, name); gst_pad_set_element_private (session->recv_rtp_sink, session); gst_pad_set_chain_function (session->recv_rtp_sink, gst_rtp_dec_chain_rtp); gst_pad_set_active (session->recv_rtp_sink, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->recv_rtp_sink); return session->recv_rtp_sink; /* ERRORS */ no_name: { g_warning ("rtpdec: invalid name given"); return NULL; } create_error: { /* create_session already warned */ return NULL; } existed: { g_warning ("rtpdec: recv_rtp pad already requested for session %d", sessid); return NULL; } } /* Create a pad for receiving RTCP for the session in @name */ static GstPad * create_recv_rtcp (GstRTPDec * rtpdec, GstPadTemplate * templ, const gchar * name) { guint sessid; GstRTPDecSession *session; /* first get the session number */ if (name == NULL || sscanf (name, "recv_rtcp_sink_%d", &sessid) != 1) goto no_name; GST_DEBUG_OBJECT (rtpdec, "finding session %d", sessid); /* get the session, it must exist or we error */ session = find_session_by_id (rtpdec, sessid); if (!session) goto no_session; /* check if pad was requested */ if (session->recv_rtcp_sink != NULL) goto existed; GST_DEBUG_OBJECT (rtpdec, "getting RTCP sink pad"); session->recv_rtcp_sink = gst_pad_new_from_template (templ, name); gst_pad_set_element_private (session->recv_rtp_sink, session); gst_pad_set_chain_function (session->recv_rtcp_sink, gst_rtp_dec_chain_rtcp); gst_pad_set_active (session->recv_rtcp_sink, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->recv_rtcp_sink); return session->recv_rtcp_sink; /* ERRORS */ no_name: { g_warning ("rtpdec: invalid name given"); return NULL; } no_session: { g_warning ("rtpdec: no session with id %d", sessid); return NULL; } existed: { g_warning ("rtpdec: recv_rtcp pad already requested for session %d", sessid); return NULL; } } /* Create a pad for sending RTCP for the session in @name */ static GstPad * create_rtcp (GstRTPDec * rtpdec, GstPadTemplate * templ, const gchar * name) { guint sessid; GstRTPDecSession *session; /* first get the session number */ if (name == NULL || sscanf (name, "rtcp_src_%d", &sessid) != 1) goto no_name; /* get or create session */ session = find_session_by_id (rtpdec, sessid); if (!session) goto no_session; /* check if pad was requested */ if (session->rtcp_src != NULL) goto existed; session->rtcp_src = gst_pad_new_from_template (templ, name); gst_pad_set_active (session->rtcp_src, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpdec), session->rtcp_src); return session->rtcp_src; /* ERRORS */ no_name: { g_warning ("rtpdec: invalid name given"); return NULL; } no_session: { g_warning ("rtpdec: session with id %d does not exist", sessid); return NULL; } existed: { g_warning ("rtpdec: rtcp_src pad already requested for session %d", sessid); return NULL; } } /* */ static GstPad * gst_rtp_dec_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name) { GstRTPDec *rtpdec; GstElementClass *klass; GstPad *result; g_return_val_if_fail (templ != NULL, NULL); g_return_val_if_fail (GST_IS_RTP_DEC (element), NULL); rtpdec = GST_RTP_DEC (element); klass = GST_ELEMENT_GET_CLASS (element); /* figure out the template */ if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%d")) { result = create_recv_rtp (rtpdec, templ, name); } else if (templ == gst_element_class_get_pad_template (klass, "recv_rtcp_sink_%d")) { result = create_recv_rtcp (rtpdec, templ, name); } else if (templ == gst_element_class_get_pad_template (klass, "rtcp_src_%d")) { result = create_rtcp (rtpdec, templ, name); } else goto wrong_template; return result; /* ERRORS */ wrong_template: { g_warning ("rtpdec: this is not our template"); return NULL; } } static void gst_rtp_dec_release_pad (GstElement * element, GstPad * pad) { } gst-plugins-good-0.10.31/gst/rtsp/README0000644000175000017500000003407511671175354014467 00000000000000RTSP source ----------- The RTSP source establishes a connection to an RTSP server and sets up the UDP sources and RTP session handlers. An RTSP session is created as follows: - Parse RTSP URL: ex: rtsp://thread:5454/south-rtsp.mp3 - Open a connection to the server with the url. All further conversation with the server should be done with this connection. Each request/reply has a CSeq number added to the header. - Send a DESCRIBE request for the url. We currently support a response in SDP. ex: >> DESCRIBE rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 >> Accept: application/sdp >> CSeq: 0 >> << RTSP/1.0 200 OK << Content-Length: 84 << Content-Type: application/sdp << CSeq: 0 << Date: Wed May 11 13:09:37 2005 GMT << << v=0 << o=- 0 0 IN IP4 192.168.1.1 << s=No Title << m=audio 0 RTP/AVP 14 << a=control:streamid=0 - Parse the SDP message, for each stream (m=) we create an GstRTPStream. We need to allocate two local UDP ports for receiving the RTP and RTCP data because we need to send the port numbers to the server in the next request. In RTSPSrc we first create an element that can handle the udp://0.0.0.0:0 uri. This will create an udp source element with a random port number. We get the port number by getting the "port" property of the element after setting the element to PAUSED. This element is used for the RTP packets and has to be an even number. If the random port number is not an even number we retry to allocate a new udp source. We then create another UDP source element with the next (uneven) port number to receive the RTCP packet on. After this step we have two udp ports we can use to accept RTP packets. +-----------------+ | +------------+ | | | udpsrc0 | | | | port=5000 | | | +------------+ | | +------------+ | | | udpsrc1 | | | | port=5001 | | | +------------+ | +-----------------+ - Send a SETUP message to the server with the RTP ports. We get the setup URI from the a= attribute in the SDP message. This can be an absolute URL or a relative url. ex: >> SETUP rtsp://thread:5454/south-rtsp.mp3/streamid=0 RTSP/1.0 >> CSeq: 1 >> Transport: RTP/AVP/UDP;unicast;client_port=5000-5001,RTP/AVP/UDP;multicast,RTP/AVP/TCP >> << RTSP/1.0 200 OK << Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=6000-6001 << CSeq: 1 << Date: Wed May 11 13:21:43 2005 GMT << Session: 5d5cb94413288ccd << The client needs to send the local ports to the server along with the supported transport types. The server selects the final transport which it returns in the Transport header field. The server also includes its ports where RTP and RTCP messages can be sent to. In the above example UDP was choosen as a transport. At this point the RTSPSrc element will furter configure its elements to process this stream. The RTSPSrc will create and connect an RTP session manager element and will connect it to the src pads of the udp element. The data pad from the RTP session manager is ghostpadded to RTPSrc. The RTCP pad of the rtpdec is routed to a new udpsink that sends data to the RTCP port of the server as returned in the Transport: header field. +---------------------------------------------+ | +------------+ | | | udpsrc0 | +--------+ | | | port=5000 ----- rtpdec -------------------- | +------------+ | | | | +------------+ | | +------------+ | | | udpsrc1 ----- RTCP ---- udpsink | | | | port=5001 | +--------+ | port=6001 | | | +------------+ +------------+ | +---------------------------------------------+ The output type of rtpdec is configured as the media type specified in the SDP message. - All the elements are set to PAUSED/PLAYING and the PLAY RTSP message is sent. >> PLAY rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 >> CSeq: 2 >> Session: 5d5cb94413288ccd >> << RTSP/1.0 200 OK << CSeq: 2 << Date: Wed May 11 13:21:43 2005 GMT << Session: 5d5cb94413288ccd << - The udp source elements receive data from that point and the RTP/RTCP messages are processed by the elements. - In the case of interleaved mode, the SETUP method yields: >> SETUP rtsp://thread:5454/south-rtsp.mp3/streamid=0 RTSP/1.0 >> CSeq: 1 >> Transport: RTP/AVP/UDP;unicast;client_port=5000-5001,RTP/AVP/UDP;multicast,RTP/AVP/TCP >> << RTSP/1.0 200 OK << Transport: RTP/AVP/TCP;interleaved=0-1 << CSeq: 1 << Date: Wed May 11 13:21:43 2005 GMT << Session: 5d5cb94413288ccd << This means that RTP/RTCP messages will be sent on channel 0/1 respectively and that the data will be received on the same connection as the RTSP connection. At this point, we remove the UDP source elements as we don't need them anymore. We set up the rtpsess session manager element though as follows: +---------------------------------------------+ | +------------+ | | | _loop() | +--------+ | | | ----- rtpses -------------------- | | | | | | | | | | | +------------+ | | | ----- RTCP ---- udpsink | | | | | +--------+ | port=6001 | | | +------------+ +------------+ | +---------------------------------------------+ We start an interal task to start reading from the RTSP connection waiting for data. The received data is then pushed to the rtpdec element. When reading from the RTSP connection we receive data packets in the following layout (see also RFC2326) $<1 byte channel><2 bytes length, big endian> RTSP server ----------- An RTSP server listen on a port (default 554) for client connections. The client typically keeps this channel open during the RTSP session to instruct the server to pause/play/stop the stream. The server exposes a stream consisting of one or more media streams using an URL. The media streams are typically audio and video. ex: rtsp://thread:5454/alien-rtsp.mpeg exposes an audio/video stream. The video is mpeg packetized in RTP and the audio is mp3 in RTP. The streaming server typically uses a different channel to send the media data to clients, typically using RTP over UDP. It is also possible to stream the data to the client using the initial RTSP TCP session (the interleaved mode). This last mode is usufull when the client is behind a firewall but does not take advantage of the RTP/UDP features. In both cases, media data is send to the clients in an unmultiplexed format packetized as RTP packets. The streaming server has to negotiate a connection protocol for each of the media streams with the client. Minimal server requirements: - The server should copy the CSeq header field in a client request to the response so that the client can match the response to the request. - The server should keep a session for each client after the client issued a SETUP command. The client should use the same session id for all future request to this server. - the server must support an OPTIONS request send over the RTSP connection. >> OPTIONS * RTSP/1.0 >> CSeq: 1 >> << RTSP/1.0 200 OK << CSeq: 1 << Date: Wed May 11 13:21:43 2005 GMT << Session: 5d5cb94413288ccd << Public: DESCRIBE, SETUP, TEARDOWN, PLAY << The OPTIONS request should list all supported methods on the server. - The server should support the DESCRIBE method. >> DESCRIBE rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 >> Accept: application/sdp >> CSeq: 2 >> << RTSP/1.0 200 OK << Content-Length: 84 << Content-Type: application/sdp << CSeq: 2 << Date: Wed May 11 13:09:37 2005 GMT << << v=0 << o=- 0 0 IN IP4 192.168.1.1 << s=No Title << m=audio 0 RTP/AVP 14 << a=control:streamid=0 The client issues a DESCRIBE command for a specific URL that corresponds to an available stream. The client will also send an Accept header to list its supported formats. The server answers this request with a reply in one of the client supported formats (application/sdp is the most common). The server typically sends a fixed reply to all clients for each configured stream. - The server must support the SETUP command to configure the media streams that were listed in the DESCRIBE command. >> SETUP rtsp://thread:5454/south-rtsp.mp3/streamid=0 RTSP/1.0 >> CSeq: 3 >> Transport: RTP/AVP/UDP;unicast;client_port=5000-5001,RTP/AVP/UDP;multicast,RTP/AVP/TCP >> << RTSP/1.0 200 OK << Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=6000-6001 << CSeq: 3 << Date: Wed May 11 13:21:43 2005 GMT << Session: 5d5cb94413288ccd The client will send a SETUP command for each of the streams listed in the DESCRIBE reply. For sdp will use a URL as listed in the a=control: property. The client will list the supported transports in the Transport: header field. Each transport is separated with a comma (,) and listed in order of preference. The server has to select the first supported transport. In the above example 3 transport are listed: RTP/AVP/UDP;unicast;client_port=5000-5001 The client will accept RTP over UDP on the port pair 5000-5001. Port 5000 will accept the RTP packets, 5001 the RTSP packets send by the server. RTP/AVP/UDP;multicast The client can join a multicast group for the specific media stream. The port numbers of the multicast group it will connect to have to be specified by the server in the reply. RTP/AVP/TCP the client can accept RTP packets interleaved on the RTSP connection. The server selects a supported transport an allocates an RTP port pair to receive RTP and RTSP data from the client. This last step is optional when the server does not accept RTP data. The server should allocate a session for the client and should send the sessionId to the client. The client should use this session id for all future requests. The server may refuse a client that does not use the same transport method for all media streams. The server stores all client port pairs in the server client session along with the transport method. ex: For an on-demand stream the server could construct a (minimal) RTP GStreamer pipeline for the client as follows (for an mp3 stream): +---------+ +-----------+ +------------+ +-------------+ | filesrc | | rtpmp3enc | | rtpsession | | udpsink | | | | | | | | host=XXX | | | | | | | | port=5000 | | src--sink src--rtpsink rtpsrc--sink | +---------+ +-----------+ | | +-------------+ | | +-------------+ | | | udpsink | | | | host=XXX | | | | port=5001 | | rtspsrc--sink | +------------+ +-------------+ The server would set the above pipeline to PAUSE to make sure no data is sent to the client yet. optionally udpsrc elements can be configured to receive client RTP and RTSP messages. ex: For a live stream the server could construct a (minimal) RTP GStreamer pipeline for the clients as follows (for an mp3 stream): +---------+ +--------+ +-----------+ +------------+ +--------------+ | source | | mp3enc | | rtpmp3enc | | rtpsession | | multiudpsink | | | | | | | | | | host=... | | | | | | | | | | port=... | | src--sink src--sink src--rtpsink rtpsrc--sink | +---------+ +--------+ +-----------+ | | +--------------+ | | +--------------+ | | | multiudpsink | | | | host=... | | | | port=... | | rtspsrc--sink | +------------+ +--------------+ Media data is streamed to clients by adding the client host and port numbers to the multiudpsinks. optionally udpsrc elements can be configured to receive client RTP and RTSP messages. - The server must support the PLAY command to start playback of the configured media streams. >> PLAY rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 >> CSeq: 2 >> Session: 5d5cb94413288ccd >> << RTSP/1.0 200 OK << CSeq: 2 << Date: Wed May 11 13:21:43 2005 GMT << Session: 5d5cb94413288ccd << Using the Session: header field, the server finds the pipeline of the session to PLAY and sets the pipeline to PLAYING at which point the client receives the media stream data. In case of a live stream, the server adds the port numbers to a multiudpsink element. - The server must support the TEARDOWN command to stop playback and free the session of a client. >> TEARDOWN rtsp://thread:5454/south-rtsp.mp3 RTSP/1.0 >> CSeq: 4 >> Session: 5d5cb94413288ccd >> << RTSP/1.0 200 OK << CSeq: 4 << Date: Wed May 11 13:21:43 2005 GMT << The server destroys the client pipeline in case of an on-demand stream or removes the client ports from the multiudpsinks. This effectively stops streaming to the client. gst-plugins-good-0.10.31/gst/rtsp/gstrtspsrc.h0000644000175000017500000001671011677341656016200 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * <2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_RTSPSRC_H__ #define __GST_RTSPSRC_H__ #include G_BEGIN_DECLS #include #include #include #include #include "gstrtspext.h" #define GST_TYPE_RTSPSRC \ (gst_rtspsrc_get_type()) #define GST_RTSPSRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSPSRC,GstRTSPSrc)) #define GST_RTSPSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSPSRC,GstRTSPSrcClass)) #define GST_IS_RTSPSRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSPSRC)) #define GST_IS_RTSPSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSPSRC)) #define GST_RTSPSRC_CAST(obj) \ ((GstRTSPSrc *)(obj)) typedef struct _GstRTSPSrc GstRTSPSrc; typedef struct _GstRTSPSrcClass GstRTSPSrcClass; #define GST_RTSP_STATE_GET_LOCK(rtsp) (GST_RTSPSRC_CAST(rtsp)->state_rec_lock) #define GST_RTSP_STATE_LOCK(rtsp) (g_static_rec_mutex_lock (GST_RTSP_STATE_GET_LOCK(rtsp))) #define GST_RTSP_STATE_UNLOCK(rtsp) (g_static_rec_mutex_unlock (GST_RTSP_STATE_GET_LOCK(rtsp))) #define GST_RTSP_STREAM_GET_LOCK(rtsp) (GST_RTSPSRC_CAST(rtsp)->stream_rec_lock) #define GST_RTSP_STREAM_LOCK(rtsp) (g_static_rec_mutex_lock (GST_RTSP_STREAM_GET_LOCK(rtsp))) #define GST_RTSP_STREAM_UNLOCK(rtsp) (g_static_rec_mutex_unlock (GST_RTSP_STREAM_GET_LOCK(rtsp))) typedef struct _GstRTSPConnInfo GstRTSPConnInfo; struct _GstRTSPConnInfo { gchar *location; GstRTSPUrl *url; gchar *url_str; GstRTSPConnection *connection; gboolean connected; }; typedef struct _GstRTSPStream GstRTSPStream; struct _GstRTSPStream { gint id; GstRTSPSrc *parent; /* parent, no extra ref to parent is taken */ /* pad we expose or NULL when it does not have an actual pad */ GstPad *srcpad; GstFlowReturn last_ret; gboolean added; gboolean disabled; gboolean eos; gboolean discont; /* for interleaved mode */ guint8 channel[2]; GstCaps *caps; GstPad *channelpad[2]; /* our udp sources */ GstElement *udpsrc[2]; GstPad *blockedpad; gboolean is_ipv6; /* our udp sinks back to the server */ GstElement *udpsink[2]; GstPad *rtcppad; /* fakesrc for sending dummy data */ GstElement *fakesrc; /* state */ gint pt; guint port; gboolean container; /* original control url */ gchar *control_url; guint32 ssrc; guint32 seqbase; guint64 timebase; /* per stream connection */ GstRTSPConnInfo conninfo; /* session */ GObject *session; /* bandwidth */ guint as_bandwidth; guint rs_bandwidth; guint rr_bandwidth; /* destination */ gchar *destination; gboolean is_multicast; guint ttl; }; /** * GstRTSPNatMethod: * @GST_RTSP_NAT_NONE: none * @GST_RTSP_NAT_DUMMY: send dummy packets * * Different methods for trying to traverse firewalls. */ typedef enum { GST_RTSP_NAT_NONE, GST_RTSP_NAT_DUMMY } GstRTSPNatMethod; struct _GstRTSPSrc { GstBin parent; /* task and mutex for interleaved mode */ gboolean interleaved; GstTask *task; GStaticRecMutex *stream_rec_lock; GstSegment segment; gboolean running; gboolean need_range; gboolean skip; gint free_channel; GstEvent *close_segment; GstEvent *start_segment; GstClockTime base_time; /* UDP mode loop */ gint loop_cmd; gboolean ignore_timeout; gboolean waiting; gboolean open_error; /* mutex for protecting state changes */ GStaticRecMutex *state_rec_lock; GstSDPMessage *sdp; gboolean from_sdp; gint numstreams; GList *streams; GstStructure *props; gboolean need_activate; /* properties */ GstRTSPLowerTrans protocols; gboolean debug; guint retry; guint64 udp_timeout; GTimeVal tcp_timeout; GTimeVal *ptcp_timeout; guint latency; guint connection_speed; GstRTSPNatMethod nat_method; gboolean do_rtcp; gchar *proxy_host; guint proxy_port; gchar *proxy_user; gchar *proxy_passwd; guint rtp_blocksize; gchar *user_id; gchar *user_pw; gint buffer_mode; GstRTSPRange client_port_range; gint udp_buffer_size; gboolean short_header; /* state */ GstRTSPState state; gchar *content_base; GstRTSPLowerTrans cur_protocols; gboolean tried_url_auth; gchar *addr; gboolean need_redirect; GstRTSPTimeRange *range; gchar *control; guint next_port_num; /* supported methods */ gint methods; gboolean seekable; GstClockTime last_pos; /* session management */ GstElement *manager; gulong manager_sig_id; gulong manager_ptmap_id; GstRTSPConnInfo conninfo; /* a list of RTSP extensions as GstElement */ GstRTSPExtensionList *extensions; }; struct _GstRTSPSrcClass { GstBinClass parent_class; }; GType gst_rtspsrc_get_type(void); G_END_DECLS #endif /* __GST_RTSPSRC_H__ */ gst-plugins-good-0.10.31/gst/rtsp/gstrtpdec.h0000644000175000017500000000706311671175354015754 00000000000000/* GStreamer * Copyright (C) <2005,2006> Wim Taymans * * 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. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * 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. */ #ifndef __GST_RTP_DEC_H__ #define __GST_RTP_DEC_H__ #include G_BEGIN_DECLS #define GST_TYPE_RTP_DEC (gst_rtp_dec_get_type()) #define GST_IS_RTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DEC)) #define GST_IS_RTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DEC)) #define GST_RTP_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DEC, GstRTPDec)) #define GST_RTP_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DEC, GstRTPDecClass)) typedef struct _GstRTPDec GstRTPDec; typedef struct _GstRTPDecClass GstRTPDecClass; typedef struct _GstRTPDecSession GstRTPDecSession; struct _GstRTPDec { GstElement element; guint latency; GSList *sessions; GstClock *provided_clock; }; struct _GstRTPDecClass { GstElementClass parent_class; /* get the caps for pt */ GstCaps* (*request_pt_map) (GstRTPDec *rtpdec, guint session, guint pt); void (*clear_pt_map) (GstRTPDec *rtpdec); void (*on_new_ssrc) (GstRTPDec *rtpdec, guint session, guint32 ssrc); void (*on_ssrc_collision) (GstRTPDec *rtpdec, guint session, guint32 ssrc); void (*on_ssrc_validated) (GstRTPDec *rtpdec, guint session, guint32 ssrc); void (*on_bye_ssrc) (GstRTPDec *rtpdec, guint session, guint32 ssrc); void (*on_bye_timeout) (GstRTPDec *rtpdec, guint session, guint32 ssrc); void (*on_timeout) (GstRTPDec *rtpdec, guint session, guint32 ssrc); }; GType gst_rtp_dec_get_type(void); G_END_DECLS #endif /* __GST_RTP_DEC_H__ */ gst-plugins-good-0.10.31/gst/rtsp/Makefile.in0000644000175000017500000007576611720560235015657 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/rtsp DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstrtsp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstrtsp_la_OBJECTS = libgstrtsp_la-gstrtsp.lo \ libgstrtsp_la-gstrtspsrc.lo libgstrtsp_la-gstrtpdec.lo \ libgstrtsp_la-gstrtspext.lo libgstrtsp_la_OBJECTS = $(am_libgstrtsp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstrtsp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstrtsp_la_CFLAGS) $(CFLAGS) \ $(libgstrtsp_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstrtsp_la_SOURCES) DIST_SOURCES = $(libgstrtsp_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstrtsp.la libgstrtsp_la_SOURCES = gstrtsp.c gstrtspsrc.c \ gstrtpdec.c gstrtspext.c libgstrtsp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstrtsp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ -lgstinterfaces-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ -lgstrtsp-@GST_MAJORMINOR@ \ -lgstsdp-@GST_MAJORMINOR@ $(GST_LIBS) $(WIN32_LIBS) libgstrtsp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrtsp_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstrtspsrc.h \ gstrtsp.h \ gstrtpdec.h \ gstrtspext.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/rtsp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/rtsp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstrtsp.la: $(libgstrtsp_la_OBJECTS) $(libgstrtsp_la_DEPENDENCIES) $(EXTRA_libgstrtsp_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstrtsp_la_LINK) -rpath $(plugindir) $(libgstrtsp_la_OBJECTS) $(libgstrtsp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtpdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtsp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtspext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtsp_la-gstrtspsrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstrtsp_la-gstrtsp.lo: gstrtsp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtsp.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtsp.Tpo -c -o libgstrtsp_la-gstrtsp.lo `test -f 'gstrtsp.c' || echo '$(srcdir)/'`gstrtsp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtsp.Tpo $(DEPDIR)/libgstrtsp_la-gstrtsp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtsp.c' object='libgstrtsp_la-gstrtsp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtsp.lo `test -f 'gstrtsp.c' || echo '$(srcdir)/'`gstrtsp.c libgstrtsp_la-gstrtspsrc.lo: gstrtspsrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtspsrc.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtspsrc.Tpo -c -o libgstrtsp_la-gstrtspsrc.lo `test -f 'gstrtspsrc.c' || echo '$(srcdir)/'`gstrtspsrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtspsrc.Tpo $(DEPDIR)/libgstrtsp_la-gstrtspsrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtspsrc.c' object='libgstrtsp_la-gstrtspsrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtspsrc.lo `test -f 'gstrtspsrc.c' || echo '$(srcdir)/'`gstrtspsrc.c libgstrtsp_la-gstrtpdec.lo: gstrtpdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtpdec.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtpdec.Tpo -c -o libgstrtsp_la-gstrtpdec.lo `test -f 'gstrtpdec.c' || echo '$(srcdir)/'`gstrtpdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtpdec.Tpo $(DEPDIR)/libgstrtsp_la-gstrtpdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdec.c' object='libgstrtsp_la-gstrtpdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtpdec.lo `test -f 'gstrtpdec.c' || echo '$(srcdir)/'`gstrtpdec.c libgstrtsp_la-gstrtspext.lo: gstrtspext.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -MT libgstrtsp_la-gstrtspext.lo -MD -MP -MF $(DEPDIR)/libgstrtsp_la-gstrtspext.Tpo -c -o libgstrtsp_la-gstrtspext.lo `test -f 'gstrtspext.c' || echo '$(srcdir)/'`gstrtspext.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtsp_la-gstrtspext.Tpo $(DEPDIR)/libgstrtsp_la-gstrtspext.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtspext.c' object='libgstrtsp_la-gstrtspext.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtsp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtsp_la_CFLAGS) $(CFLAGS) -c -o libgstrtsp_la-gstrtspext.lo `test -f 'gstrtspext.c' || echo '$(srcdir)/'`gstrtspext.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstrtsp -:SHARED libgstrtsp \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstrtsp_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtsp_la_CFLAGS) \ -:LDFLAGS $(libgstrtsp_la_LDFLAGS) \ $(libgstrtsp_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/matroska/0000755000175000017500000000000011720565303014477 500000000000000gst-plugins-good-0.10.31/gst/matroska/lzo.c0000644000175000017500000001641411671175353015404 00000000000000/* * LZO 1x decompression * Copyright (c) 2006 Reimar Doeffinger * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "_stdint.h" #include "lzo.h" /*! define if we may write up to 12 bytes beyond the output buffer */ /* #define OUTBUF_PADDED 1 */ /*! define if we may read up to 8 bytes beyond the input buffer */ /* #define INBUF_PADDED 1 */ typedef struct LZOContext { const uint8_t *in, *in_end; uint8_t *out_start, *out, *out_end; int error; } LZOContext; /* * \brief read one byte from input buffer, avoiding overrun * \return byte read */ static inline int get_byte (LZOContext * c) { if (c->in < c->in_end) return *c->in++; c->error |= LZO_INPUT_DEPLETED; return 1; } #ifdef INBUF_PADDED #define GETB(c) (*(c).in++) #else #define GETB(c) get_byte(&(c)) #endif /* * \brief decode a length value in the coding used by lzo * \param x previous byte value * \param mask bits used from x * \return decoded length value */ static inline int get_len (LZOContext * c, int x, int mask) { int cnt = x & mask; if (!cnt) { while (!(x = get_byte (c))) cnt += 255; cnt += mask + x; } return cnt; } /*#define UNALIGNED_LOADSTORE */ #define BUILTIN_MEMCPY #ifdef UNALIGNED_LOADSTORE #define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s); #define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s); #elif defined(BUILTIN_MEMCPY) #define COPY2(d, s) memcpy(d, s, 2); #define COPY4(d, s) memcpy(d, s, 4); #else #define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; #define COPY4(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2]; (d)[3] = (s)[3]; #endif /* * \brief copy bytes from input to output buffer with checking * \param cnt number of bytes to copy, must be >= 0 */ static inline void copy (LZOContext * c, int cnt) { register const uint8_t *src = c->in; register uint8_t *dst = c->out; if (cnt > c->in_end - src) { cnt = MAX (c->in_end - src, 0); c->error |= LZO_INPUT_DEPLETED; } if (cnt > c->out_end - dst) { cnt = MAX (c->out_end - dst, 0); c->error |= LZO_OUTPUT_FULL; } #if defined(INBUF_PADDED) && defined(OUTBUF_PADDED) COPY4 (dst, src); src += 4; dst += 4; cnt -= 4; if (cnt > 0) #endif memcpy (dst, src, cnt); c->in = src + cnt; c->out = dst + cnt; } /* * \brief copy previously decoded bytes to current position * \param back how many bytes back we start * \param cnt number of bytes to copy, must be >= 0 * * cnt > back is valid, this will copy the bytes we just copied, * thus creating a repeating pattern with a period length of back. */ static inline void copy_backptr (LZOContext * c, int back, int cnt) { register const uint8_t *src = &c->out[-back]; register uint8_t *dst = c->out; if (src < c->out_start || src > dst) { c->error |= LZO_INVALID_BACKPTR; return; } if (cnt > c->out_end - dst) { cnt = MAX (c->out_end - dst, 0); c->error |= LZO_OUTPUT_FULL; } if (back == 1) { memset (dst, *src, cnt); dst += cnt; } else { #ifdef OUTBUF_PADDED COPY2 (dst, src); COPY2 (dst + 2, src + 2); src += 4; dst += 4; cnt -= 4; if (cnt > 0) { COPY2 (dst, src); COPY2 (dst + 2, src + 2); COPY2 (dst + 4, src + 4); COPY2 (dst + 6, src + 6); src += 8; dst += 8; cnt -= 8; } #endif if (cnt > 0) { int blocklen = back; while (cnt > blocklen) { memcpy (dst, src, blocklen); dst += blocklen; cnt -= blocklen; blocklen <<= 1; } memcpy (dst, src, cnt); } dst += cnt; } c->out = dst; } /* * \brief decode LZO 1x compressed data * \param out output buffer * \param outlen size of output buffer, number of bytes left are returned here * \param in input buffer * \param inlen size of input buffer, number of bytes left are returned here * \return 0 on success, otherwise error flags, see lzo.h * * make sure all buffers are appropriately padded, in must provide * LZO_INPUT_PADDING, out must provide LZO_OUTPUT_PADDING additional bytes */ int lzo1x_decode (void *out, int *outlen, const void *in, int *inlen) { int state = 0; int x; LZOContext c; c.in = in; c.in_end = (const uint8_t *) in + *inlen; c.out = c.out_start = out; c.out_end = (uint8_t *) out + *outlen; c.error = 0; x = GETB (c); if (x > 17) { copy (&c, x - 17); x = GETB (c); if (x < 16) c.error |= LZO_ERROR; } if (c.in > c.in_end) c.error |= LZO_INPUT_DEPLETED; while (!c.error) { int cnt, back; if (x > 15) { if (x > 63) { cnt = (x >> 5) - 1; back = (GETB (c) << 3) + ((x >> 2) & 7) + 1; } else if (x > 31) { cnt = get_len (&c, x, 31); x = GETB (c); back = (GETB (c) << 6) + (x >> 2) + 1; } else { cnt = get_len (&c, x, 7); back = (1 << 14) + ((x & 8) << 11); x = GETB (c); back += (GETB (c) << 6) + (x >> 2); if (back == (1 << 14)) { if (cnt != 1) c.error |= LZO_ERROR; break; } } } else if (!state) { cnt = get_len (&c, x, 15); copy (&c, cnt + 3); x = GETB (c); if (x > 15) continue; cnt = 1; back = (1 << 11) + (GETB (c) << 2) + (x >> 2) + 1; } else { cnt = 0; back = (GETB (c) << 2) + (x >> 2) + 1; } copy_backptr (&c, back, cnt + 2); state = cnt = x & 3; copy (&c, cnt); x = GETB (c); } *inlen = c.in_end - c.in; if (c.in > c.in_end) *inlen = 0; *outlen = c.out_end - c.out; return c.error; } #ifdef TEST #include #include #include "log.h" #define MAXSZ (10*1024*1024) int main (int argc, char *argv[]) { FILE *in = fopen (argv[1], "rb"); uint8_t *orig = av_malloc (MAXSZ + 16); uint8_t *comp = av_malloc (2 * MAXSZ + 16); uint8_t *decomp = av_malloc (MAXSZ + 16); size_t s = fread (orig, 1, MAXSZ, in); lzo_uint clen = 0; long tmp[LZO1X_MEM_COMPRESS]; int inlen, outlen; int i; av_log_level = AV_LOG_DEBUG; lzo1x_999_compress (orig, s, comp, &clen, tmp); for (i = 0; i < 300; i++) { START_TIMER inlen = clen; outlen = MAXSZ; #ifdef LIBLZO if (lzo1x_decompress_safe (comp, inlen, decomp, &outlen, NULL)) #elif defined(LIBLZO_UNSAFE) if (lzo1x_decompress (comp, inlen, decomp, &outlen, NULL)) #else if (lzo1x_decode (decomp, &outlen, comp, &inlen)) #endif av_log (NULL, AV_LOG_ERROR, "decompression error\n"); STOP_TIMER ("lzod") } if (memcmp (orig, decomp, s)) av_log (NULL, AV_LOG_ERROR, "decompression incorrect\n"); else av_log (NULL, AV_LOG_ERROR, "decompression ok\n"); return 0; } #endif gst-plugins-good-0.10.31/gst/matroska/Makefile.am0000644000175000017500000000260711677341655016475 00000000000000plugin_LTLIBRARIES = libgstmatroska.la libgstmatroska_la_SOURCES = \ ebml-read.c \ ebml-write.c \ matroska.c \ matroska-demux.c \ matroska-parse.c \ matroska-ids.c \ matroska-mux.c \ matroska-read-common.c \ webm-mux.c \ lzo.c noinst_HEADERS = \ ebml-ids.h \ ebml-read.h \ ebml-write.h \ matroska-demux.h \ matroska-parse.h \ matroska-ids.h \ matroska-mux.h \ matroska-read-common.h \ webm-mux.h \ lzo.h libgstmatroska_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstmatroska_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(ZLIB_LIBS) \ $(BZ2_LIBS) \ $(LIBM) libgstmatroska_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmatroska_la_LIBTOOLFLAGS = --tag=disable-static Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmatroska -:SHARED libgstmatroska \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmatroska_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) \ -:LDFLAGS $(libgstmatroska_la_LDFLAGS) \ $(libgstmatroska_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/matroska/matroska-mux.h0000644000175000017500000000761411677341655017245 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2005 Michal Benes * * matroska-mux.h: matroska file/stream muxer object types * * 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_MATROSKA_MUX_H__ #define __GST_MATROSKA_MUX_H__ #include #include #include "ebml-write.h" #include "matroska-ids.h" G_BEGIN_DECLS #define GST_TYPE_MATROSKA_MUX \ (gst_matroska_mux_get_type ()) #define GST_MATROSKA_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_MUX, GstMatroskaMux)) #define GST_MATROSKA_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_MUX, GstMatroskaMuxClass)) #define GST_IS_MATROSKA_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_MUX)) #define GST_IS_MATROSKA_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_MUX)) typedef enum { GST_MATROSKA_MUX_STATE_START, GST_MATROSKA_MUX_STATE_HEADER, GST_MATROSKA_MUX_STATE_DATA, } GstMatroskaMuxState; typedef struct _GstMatroskaMetaSeekIndex { guint32 id; guint64 pos; } GstMatroskaMetaSeekIndex; /* all information needed for one matroska stream */ typedef struct { GstCollectData collect; /* we extend the CollectData */ GstMatroskaTrackContext *track; GstBuffer *buffer; /* the queued buffer for this pad */ guint64 duration; GstClockTime start_ts; GstClockTime end_ts; /* last timestamp + (if available) duration */ guint64 default_duration_scaled; } GstMatroskaPad; typedef struct _GstMatroskaMux { GstElement element; /* < private > */ /* pads */ GstPad *srcpad; GstCollectPads *collect; GstPadEventFunction collect_event; GstEbmlWrite *ebml_write; guint num_streams, num_v_streams, num_a_streams, num_t_streams; /* Application name (for the writing application header element) */ gchar *writing_app; /* EBML DocType. */ const gchar *doctype; /* DocType version. */ guint doctype_version; /* state */ GstMatroskaMuxState state; /* a cue (index) table */ GstMatroskaIndex *index; guint num_indexes; GstClockTimeDiff min_index_interval; gboolean streamable; /* timescale in the file */ guint64 time_scale; /* based on timescale, limit of nanoseconds you can have in a cluster */ guint64 max_cluster_duration; /* length, position (time, ns) */ guint64 duration; /* byte-positions of master-elements (for replacing contents) */ guint64 segment_pos, seekhead_pos, cues_pos, tags_pos, info_pos, tracks_pos, duration_pos, meta_pos; guint64 segment_master; /* current cluster */ guint64 cluster, cluster_time, cluster_pos, prev_cluster_size; /* GstForceKeyUnit event */ GstEvent *force_key_unit_event; } GstMatroskaMux; typedef struct _GstMatroskaMuxClass { GstElementClass parent; } GstMatroskaMuxClass; GType gst_matroska_mux_get_type (void); G_END_DECLS #endif /* __GST_MATROSKA_MUX_H__ */ gst-plugins-good-0.10.31/gst/matroska/ebml-ids.h0000644000175000017500000000345411671175353016301 00000000000000/* GStreamer EBML I/O * (c) 2003 Ronald Bultje * * ebml-ids.h: definition of EBML data IDs * * 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_EBML_IDS_H__ #define __GST_EBML_IDS_H__ G_BEGIN_DECLS /* EBML version supported */ #define GST_EBML_VERSION 1 /* Unknown size (all bits set to 1) */ #define GST_EBML_SIZE_UNKNOWN G_GINT64_CONSTANT(0x00ffffffffffffff) /* top-level master-IDs */ #define GST_EBML_ID_HEADER 0x1A45DFA3 /* IDs in the HEADER master */ #define GST_EBML_ID_EBMLVERSION 0x4286 #define GST_EBML_ID_EBMLREADVERSION 0x42F7 #define GST_EBML_ID_EBMLMAXIDLENGTH 0x42F2 #define GST_EBML_ID_EBMLMAXSIZELENGTH 0x42F3 #define GST_EBML_ID_DOCTYPE 0x4282 #define GST_EBML_ID_DOCTYPEVERSION 0x4287 #define GST_EBML_ID_DOCTYPEREADVERSION 0x4285 /* general EBML types */ #define GST_EBML_ID_VOID 0xEC #define GST_EBML_ID_CRC32 0xBF /* EbmlDate offset from the unix epoch in seconds, 2001/01/01 00:00:00 UTC */ #define GST_EBML_DATE_OFFSET 978307200 G_END_DECLS #endif /* __GST_EBML_IDS_H__ */ gst-plugins-good-0.10.31/gst/matroska/ebml-write.c0000644000175000017500000005277311677341655016665 00000000000000/* GStreamer EBML I/O * (c) 2003 Ronald Bultje * (c) 2005 Michal Benes * * ebml-write.c: write EBML data to file/stream * * 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 #include "ebml-write.h" #include "ebml-ids.h" GST_DEBUG_CATEGORY_STATIC (gst_ebml_write_debug); #define GST_CAT_DEFAULT gst_ebml_write_debug #define _do_init(thing) \ GST_DEBUG_CATEGORY_INIT (gst_ebml_write_debug, "ebmlwrite", 0, "Write EBML structured data") GST_BOILERPLATE_FULL (GstEbmlWrite, gst_ebml_write, GstObject, GST_TYPE_OBJECT, _do_init); static void gst_ebml_write_finalize (GObject * object); static void gst_ebml_write_base_init (gpointer g_class) { } static void gst_ebml_write_class_init (GstEbmlWriteClass * klass) { GObjectClass *object = G_OBJECT_CLASS (klass); object->finalize = gst_ebml_write_finalize; } static void gst_ebml_write_init (GstEbmlWrite * ebml, GstEbmlWriteClass * klass) { ebml->srcpad = NULL; ebml->pos = 0; ebml->last_pos = G_MAXUINT64; /* force newsegment event */ ebml->cache = NULL; ebml->streamheader = NULL; ebml->streamheader_pos = 0; ebml->writing_streamheader = FALSE; ebml->caps = NULL; } static void gst_ebml_write_finalize (GObject * object) { GstEbmlWrite *ebml = GST_EBML_WRITE (object); gst_object_unref (ebml->srcpad); if (ebml->cache) { gst_byte_writer_free (ebml->cache); ebml->cache = NULL; } if (ebml->streamheader) { gst_byte_writer_free (ebml->streamheader); ebml->streamheader = NULL; } if (ebml->caps) { gst_caps_unref (ebml->caps); ebml->caps = NULL; } GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); } /** * gst_ebml_write_new: * @srcpad: Source pad to which the output will be pushed. * * Creates a new #GstEbmlWrite. * * Returns: a new #GstEbmlWrite */ GstEbmlWrite * gst_ebml_write_new (GstPad * srcpad) { GstEbmlWrite *ebml = GST_EBML_WRITE (g_object_new (GST_TYPE_EBML_WRITE, NULL)); ebml->srcpad = gst_object_ref (srcpad); ebml->timestamp = GST_CLOCK_TIME_NONE; gst_ebml_write_reset (ebml); return ebml; } /** * gst_ebml_write_reset: * @ebml: a #GstEbmlWrite. * * Reset internal state of #GstEbmlWrite. */ void gst_ebml_write_reset (GstEbmlWrite * ebml) { ebml->pos = 0; ebml->last_pos = G_MAXUINT64; /* force newsegment event */ if (ebml->cache) { gst_byte_writer_free (ebml->cache); ebml->cache = NULL; } if (ebml->caps) { gst_caps_unref (ebml->caps); ebml->caps = NULL; } ebml->last_write_result = GST_FLOW_OK; ebml->timestamp = GST_CLOCK_TIME_NONE; } /** * gst_ebml_last_write_result: * @ebml: a #GstEbmlWrite. * * Returns: GST_FLOW_OK if there was not write error since the last call of * gst_ebml_last_write_result or code of the error. */ GstFlowReturn gst_ebml_last_write_result (GstEbmlWrite * ebml) { GstFlowReturn res = ebml->last_write_result; ebml->last_write_result = GST_FLOW_OK; return res; } void gst_ebml_start_streamheader (GstEbmlWrite * ebml) { g_return_if_fail (ebml->streamheader == NULL); GST_DEBUG ("Starting streamheader at %" G_GUINT64_FORMAT, ebml->pos); ebml->streamheader = gst_byte_writer_new_with_size (1000, FALSE); ebml->streamheader_pos = ebml->pos; ebml->writing_streamheader = TRUE; } GstBuffer * gst_ebml_stop_streamheader (GstEbmlWrite * ebml) { GstBuffer *buffer; if (!ebml->streamheader) return NULL; buffer = gst_byte_writer_free_and_get_buffer (ebml->streamheader); ebml->streamheader = NULL; GST_DEBUG ("Streamheader was size %d", GST_BUFFER_SIZE (buffer)); ebml->writing_streamheader = FALSE; return buffer; } /** * gst_ebml_write_set_cache: * @ebml: a #GstEbmlWrite. * @size: size of the cache. * Create a cache. * * The idea is that you use this for writing a lot * of small elements. This will just "queue" all of * them and they'll be pushed to the next element all * at once. This saves memory and time for buffer * allocation and init, and it looks better. */ void gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size) { g_return_if_fail (ebml->cache == NULL); GST_DEBUG ("Starting cache at %" G_GUINT64_FORMAT, ebml->pos); ebml->cache = gst_byte_writer_new_with_size (size, FALSE); ebml->cache_pos = ebml->pos; } static gboolean gst_ebml_writer_send_new_segment_event (GstEbmlWrite * ebml, guint64 new_pos) { gboolean res; GST_INFO ("seeking to %" G_GUINT64_FORMAT, new_pos); res = gst_pad_push_event (ebml->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, new_pos, -1, 0)); if (!res) GST_WARNING ("seek to %" G_GUINT64_FORMAT "failed", new_pos); return res; } /** * gst_ebml_write_flush_cache: * @ebml: a #GstEbmlWrite. * @timestamp: timestamp of the buffer. * * Flush the cache. */ void gst_ebml_write_flush_cache (GstEbmlWrite * ebml, gboolean is_keyframe, GstClockTime timestamp) { GstBuffer *buffer; if (!ebml->cache) return; buffer = gst_byte_writer_free_and_get_buffer (ebml->cache); ebml->cache = NULL; GST_DEBUG ("Flushing cache of size %d", GST_BUFFER_SIZE (buffer)); gst_buffer_set_caps (buffer, ebml->caps); GST_BUFFER_TIMESTAMP (buffer) = timestamp; GST_BUFFER_OFFSET (buffer) = ebml->pos - GST_BUFFER_SIZE (buffer); GST_BUFFER_OFFSET_END (buffer) = ebml->pos; if (ebml->last_write_result == GST_FLOW_OK) { if (GST_BUFFER_OFFSET (buffer) != ebml->last_pos) { gst_ebml_writer_send_new_segment_event (ebml, GST_BUFFER_OFFSET (buffer)); GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); } if (ebml->writing_streamheader) { GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_IN_CAPS); } if (!is_keyframe) { GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); } ebml->last_pos = ebml->pos; ebml->last_write_result = gst_pad_push (ebml->srcpad, buffer); } else { gst_buffer_unref (buffer); } } /** * gst_ebml_write_element_new: * @ebml: a #GstEbmlWrite. * @size: size of the requested buffer. * * Create a buffer for one element. If there is * a cache, use that instead. * * Returns: A new #GstBuffer. */ static GstBuffer * gst_ebml_write_element_new (GstEbmlWrite * ebml, guint8 ** data_out, guint size) { /* Create new buffer of size + ID + length */ GstBuffer *buf; /* length, ID */ size += 12; buf = gst_buffer_new_and_alloc (size); GST_BUFFER_TIMESTAMP (buf) = ebml->timestamp; *data_out = GST_BUFFER_DATA (buf); return buf; } /** * gst_ebml_write_element_id: * @data_inout: Pointer to data pointer * @id: Element ID that should be written. * * Write element ID into a buffer. */ static void gst_ebml_write_element_id (guint8 ** data_inout, guint32 id) { guint8 *data = *data_inout; guint bytes = 4, mask = 0x10; /* get ID length */ while (!(id & (mask << ((bytes - 1) * 8))) && bytes > 0) { mask <<= 1; bytes--; } /* if invalid ID, use dummy */ if (bytes == 0) { GST_WARNING ("Invalid ID, voiding"); bytes = 1; id = GST_EBML_ID_VOID; } /* write out, BE */ *data_inout += bytes; while (bytes--) { data[bytes] = id & 0xff; id >>= 8; } } /** * gst_ebml_write_element_size: * @data_inout: Pointer to data pointer * @size: Element length. * * Write element length into a buffer. */ static void gst_ebml_write_element_size (guint8 ** data_inout, guint64 size) { guint8 *data = *data_inout; guint bytes = 1, mask = 0x80; if (size != GST_EBML_SIZE_UNKNOWN) { /* how many bytes? - use mask-1 because an all-1 bitset is not allowed */ while ((size >> ((bytes - 1) * 8)) >= (mask - 1) && bytes <= 8) { mask >>= 1; bytes++; } /* if invalid size, use max. */ if (bytes > 8) { GST_WARNING ("Invalid size, writing size unknown"); mask = 0x01; bytes = 8; /* Now here's a real FIXME: we cannot read those yet! */ size = GST_EBML_SIZE_UNKNOWN; } } else { mask = 0x01; bytes = 8; } /* write out, BE, with length size marker */ *data_inout += bytes; while (bytes-- > 0) { data[bytes] = size & 0xff; size >>= 8; if (!bytes) *data |= mask; } } /** * gst_ebml_write_element_data: * @data_inout: Pointer to data pointer * @write: Data that should be written. * @length: Length of the data. * * Write element data into a buffer. */ static void gst_ebml_write_element_data (guint8 ** data_inout, guint8 * write, guint64 length) { memcpy (*data_inout, write, length); *data_inout += length; } /** * gst_ebml_write_element_push: * @ebml: #GstEbmlWrite * @buf: #GstBuffer to be written. * @buf_data: Start of data to push from @buf (or NULL for whole buffer). * @buf_data_end: Data pointer positioned after the last byte in @buf_data (or * NULL for whole buffer). * * Write out buffer by moving it to the next element. */ static void gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf, guint8 * buf_data, guint8 * buf_data_end) { guint data_size; if (!buf_data) buf_data = GST_BUFFER_DATA (buf); if (buf_data_end) { data_size = buf_data_end - buf_data; GST_BUFFER_SIZE (buf) = data_size; } else { data_size = GST_BUFFER_SIZE (buf); } ebml->pos += data_size; /* if there's no cache, then don't push it! */ if (ebml->writing_streamheader) { gst_byte_writer_put_data (ebml->streamheader, buf_data, data_size); } if (ebml->cache) { gst_byte_writer_put_data (ebml->cache, buf_data, data_size); gst_buffer_unref (buf); return; } if (ebml->last_write_result == GST_FLOW_OK) { buf = gst_buffer_make_metadata_writable (buf); gst_buffer_set_caps (buf, ebml->caps); GST_BUFFER_OFFSET (buf) = ebml->pos - data_size; GST_BUFFER_OFFSET_END (buf) = ebml->pos; if (ebml->writing_streamheader) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); } GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); if (GST_BUFFER_OFFSET (buf) != ebml->last_pos) { gst_ebml_writer_send_new_segment_event (ebml, GST_BUFFER_OFFSET (buf)); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); } ebml->last_pos = ebml->pos; ebml->last_write_result = gst_pad_push (ebml->srcpad, buf); } else { gst_buffer_unref (buf); } } /** * gst_ebml_write_seek: * @ebml: #GstEbmlWrite * @pos: Seek position. * * Seek. */ void gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos) { if (ebml->writing_streamheader) { GST_DEBUG ("wanting to seek to pos %" G_GUINT64_FORMAT, pos); if (pos >= ebml->streamheader_pos && pos <= ebml->streamheader_pos + ebml->streamheader->parent.size) { gst_byte_writer_set_pos (ebml->streamheader, pos - ebml->streamheader_pos); GST_DEBUG ("seeked in streamheader to position %" G_GUINT64_FORMAT, pos - ebml->streamheader_pos); } else { GST_WARNING ("we are writing streamheader still and seek is out of bounds"); } } /* Cache seeking. A bit dangerous, we assume the client writer * knows what he's doing... */ if (ebml->cache) { /* within bounds? */ if (pos >= ebml->cache_pos && pos <= ebml->cache_pos + ebml->cache->parent.size) { GST_DEBUG ("seeking in cache to %" G_GUINT64_FORMAT, pos); ebml->pos = pos; gst_byte_writer_set_pos (ebml->cache, ebml->pos - ebml->cache_pos); return; } else { GST_LOG ("Seek outside cache range. Clearing..."); gst_ebml_write_flush_cache (ebml, FALSE, GST_CLOCK_TIME_NONE); } } GST_INFO ("scheduling seek to %" G_GUINT64_FORMAT, pos); ebml->pos = pos; } /** * gst_ebml_write_get_uint_size: * @num: Number to be encoded. * * Get number of bytes needed to write a uint. * * Returns: Encoded uint length. */ static guint gst_ebml_write_get_uint_size (guint64 num) { guint size = 1; /* get size */ while (num >= (G_GINT64_CONSTANT (1) << (size * 8)) && size < 8) { size++; } return size; } /** * gst_ebml_write_set_uint: * @data_inout: Pointer to data pointer * @num: Number to be written. * @size: Encoded number length. * * Write an uint into a buffer. */ static void gst_ebml_write_set_uint (guint8 ** data_inout, guint64 num, guint size) { guint8 *data = *data_inout; *data_inout += size; while (size-- > 0) { data[size] = num & 0xff; num >>= 8; } } /** * gst_ebml_write_uint: * @ebml: #GstEbmlWrite * @id: Element ID. * @num: Number to be written. * * Write uint element. */ void gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num) { GstBuffer *buf; guint8 *data_start, *data_end; guint size = gst_ebml_write_get_uint_size (num); buf = gst_ebml_write_element_new (ebml, &data_start, sizeof (num)); data_end = data_start; /* write */ gst_ebml_write_element_id (&data_end, id); gst_ebml_write_element_size (&data_end, size); gst_ebml_write_set_uint (&data_end, num, size); gst_ebml_write_element_push (ebml, buf, data_start, data_end); } /** * gst_ebml_write_sint: * @ebml: #GstEbmlWrite * @id: Element ID. * @num: Number to be written. * * Write sint element. */ void gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num) { GstBuffer *buf; guint8 *data_start, *data_end; /* if the signed number is on the edge of a extra-byte, * then we'll fall over when detecting it. Example: if I * have a number (-)0x8000 (G_MINSHORT), then my abs()<<1 * will be 0x10000; this is G_MAXUSHORT+1! So: if (<0) -1. */ guint64 unum = (num < 0 ? (-num - 1) << 1 : num << 1); guint size = gst_ebml_write_get_uint_size (unum); buf = gst_ebml_write_element_new (ebml, &data_start, sizeof (num)); data_end = data_start; /* make unsigned */ if (num >= 0) { unum = num; } else { unum = 0x80 << (size - 1); unum += num; unum |= 0x80 << (size - 1); } /* write */ gst_ebml_write_element_id (&data_end, id); gst_ebml_write_element_size (&data_end, size); gst_ebml_write_set_uint (&data_end, unum, size); gst_ebml_write_element_push (ebml, buf, data_start, data_end); } /** * gst_ebml_write_float: * @ebml: #GstEbmlWrite * @id: Element ID. * @num: Number to be written. * * Write float element. */ void gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num) { GstBuffer *buf; guint8 *data_start, *data_end; buf = gst_ebml_write_element_new (ebml, &data_start, sizeof (num)); data_end = data_start; gst_ebml_write_element_id (&data_end, id); gst_ebml_write_element_size (&data_end, 8); num = GDOUBLE_TO_BE (num); gst_ebml_write_element_data (&data_end, (guint8 *) & num, 8); gst_ebml_write_element_push (ebml, buf, data_start, data_end); } /** * gst_ebml_write_ascii: * @ebml: #GstEbmlWrite * @id: Element ID. * @str: String to be written. * * Write string element. */ void gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str) { gint len = strlen (str) + 1; /* add trailing '\0' */ GstBuffer *buf; guint8 *data_start, *data_end; buf = gst_ebml_write_element_new (ebml, &data_start, len); data_end = data_start; gst_ebml_write_element_id (&data_end, id); gst_ebml_write_element_size (&data_end, len); gst_ebml_write_element_data (&data_end, (guint8 *) str, len); gst_ebml_write_element_push (ebml, buf, data_start, data_end); } /** * gst_ebml_write_utf8: * @ebml: #GstEbmlWrite * @id: Element ID. * @str: String to be written. * * Write utf8 encoded string element. */ void gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str) { gst_ebml_write_ascii (ebml, id, str); } /** * gst_ebml_write_date: * @ebml: #GstEbmlWrite * @id: Element ID. * @date: Date in seconds since the unix epoch. * * Write date element. */ void gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date) { gst_ebml_write_sint (ebml, id, (date - GST_EBML_DATE_OFFSET) * GST_SECOND); } /** * gst_ebml_write_master_start: * @ebml: #GstEbmlWrite * @id: Element ID. * * Start wiriting mater element. * * Master writing is annoying. We use a size marker of * the max. allowed length, so that we can later fill it * in validly. * * Returns: Master starting position. */ guint64 gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id) { guint64 pos = ebml->pos; GstBuffer *buf; guint8 *data_start, *data_end; buf = gst_ebml_write_element_new (ebml, &data_start, 0); data_end = data_start; gst_ebml_write_element_id (&data_end, id); pos += data_end - data_start; gst_ebml_write_element_size (&data_end, GST_EBML_SIZE_UNKNOWN); gst_ebml_write_element_push (ebml, buf, data_start, data_end); return pos; } /** * gst_ebml_write_master_finish_full: * @ebml: #GstEbmlWrite * @startpos: Master starting position. * * Finish writing master element. Size of master element is difference between * current position and the element start, and @extra_size added to this. */ void gst_ebml_write_master_finish_full (GstEbmlWrite * ebml, guint64 startpos, guint64 extra_size) { guint64 pos = ebml->pos; GstBuffer *buf; gst_ebml_write_seek (ebml, startpos); buf = gst_buffer_new_and_alloc (8); GST_WRITE_UINT64_BE (GST_BUFFER_DATA (buf), (G_GINT64_CONSTANT (1) << 56) | (pos - startpos - 8 + extra_size)); gst_ebml_write_element_push (ebml, buf, NULL, NULL); gst_ebml_write_seek (ebml, pos); } void gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos) { gst_ebml_write_master_finish_full (ebml, startpos, 0); } /** * gst_ebml_write_binary: * @ebml: #GstEbmlWrite * @id: Element ID. * @binary: Data to be written. * @length: Length of the data * * Write an element with binary data. */ void gst_ebml_write_binary (GstEbmlWrite * ebml, guint32 id, guint8 * binary, guint64 length) { GstBuffer *buf; guint8 *data_start, *data_end; buf = gst_ebml_write_element_new (ebml, &data_start, length); data_end = data_start; gst_ebml_write_element_id (&data_end, id); gst_ebml_write_element_size (&data_end, length); gst_ebml_write_element_data (&data_end, binary, length); gst_ebml_write_element_push (ebml, buf, data_start, data_end); } /** * gst_ebml_write_buffer_header: * @ebml: #GstEbmlWrite * @id: Element ID. * @length: Length of the data * * Write header of the binary element (use with gst_ebml_write_buffer function). * * For things like video frames and audio samples, * you want to use this function, as it doesn't have * the overhead of memcpy() that other functions * such as write_binary() do have. */ void gst_ebml_write_buffer_header (GstEbmlWrite * ebml, guint32 id, guint64 length) { GstBuffer *buf; guint8 *data_start, *data_end; buf = gst_ebml_write_element_new (ebml, &data_start, 0); data_end = data_start; gst_ebml_write_element_id (&data_end, id); gst_ebml_write_element_size (&data_end, length); gst_ebml_write_element_push (ebml, buf, data_start, data_end); } /** * gst_ebml_write_buffer: * @ebml: #GstEbmlWrite * @buf: #GstBuffer cointaining the data. * * Write binary element (see gst_ebml_write_buffer_header). */ void gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * buf) { gst_ebml_write_element_push (ebml, buf, NULL, NULL); } /** * gst_ebml_replace_uint: * @ebml: #GstEbmlWrite * @pos: Position of the uint that should be replaced. * @num: New value. * * Replace uint with a new value. * * When replacing a uint, we assume that it is *always* * 8-byte, since that's the safest guess we can do. This * is just for simplicity. * * FIXME: this function needs to be replaced with something * proper. This is a crude hack. */ void gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num) { guint64 oldpos = ebml->pos; GstBuffer *buf = gst_buffer_new_and_alloc (8); guint8 *data_start, *data_end; data_start = GST_BUFFER_DATA (buf); data_end = data_start; gst_ebml_write_seek (ebml, pos); gst_ebml_write_set_uint (&data_end, num, 8); gst_ebml_write_element_push (ebml, buf, data_start, data_end); gst_ebml_write_seek (ebml, oldpos); } /** * gst_ebml_write_header: * @ebml: #GstEbmlWrite * @doctype: Document type. * @version: Document type version. * * Write EBML header. */ void gst_ebml_write_header (GstEbmlWrite * ebml, const gchar * doctype, guint version) { guint64 pos; /* write the basic EBML header */ gst_ebml_write_set_cache (ebml, 0x40); pos = gst_ebml_write_master_start (ebml, GST_EBML_ID_HEADER); #if (GST_EBML_VERSION != 1) gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLVERSION, GST_EBML_VERSION); gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLREADVERSION, GST_EBML_VERSION); #endif #if 0 /* we don't write these until they're "non-default" (never!) */ gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLMAXIDLENGTH, sizeof (guint32)); gst_ebml_write_uint (ebml, GST_EBML_ID_EBMLMAXSIZELENGTH, sizeof (guint64)); #endif gst_ebml_write_ascii (ebml, GST_EBML_ID_DOCTYPE, doctype); gst_ebml_write_uint (ebml, GST_EBML_ID_DOCTYPEVERSION, version); gst_ebml_write_uint (ebml, GST_EBML_ID_DOCTYPEREADVERSION, version); gst_ebml_write_master_finish (ebml, pos); gst_ebml_write_flush_cache (ebml, FALSE, 0); } gst-plugins-good-0.10.31/gst/matroska/matroska.c0000644000175000017500000000352511677341656016427 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * * matroska.c: plugin loader * * 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 "matroska-demux.h" #include "matroska-parse.h" #include "matroska-read-common.h" #include "matroska-mux.h" #include "matroska-ids.h" #include "webm-mux.h" #include static gboolean plugin_init (GstPlugin * plugin) { gboolean ret; gst_pb_utils_init (); gst_matroska_register_tags (); GST_DEBUG_CATEGORY_INIT (matroskareadcommon_debug, "matroskareadcommon", 0, "Matroska demuxer/parser shared debug"); ret = gst_matroska_demux_plugin_init (plugin); ret &= gst_matroska_parse_plugin_init (plugin); ret &= gst_element_register (plugin, "matroskamux", GST_RANK_PRIMARY, GST_TYPE_MATROSKA_MUX); ret &= gst_element_register (plugin, "webmmux", GST_RANK_PRIMARY, GST_TYPE_WEBM_MUX); return ret; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "matroska", "Matroska and WebM stream handling", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/matroska/matroska-ids.h0000644000175000017500000006230611677341655017212 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * * matroska-ids.h: matroska file/stream data IDs * * 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_MATROSKA_IDS_H__ #define __GST_MATROSKA_IDS_H__ #include #include "ebml-ids.h" /* * EBML DocType. */ #define GST_MATROSKA_DOCTYPE_MATROSKA "matroska" #define GST_MATROSKA_DOCTYPE_WEBM "webm" /* * Matroska element IDs. max. 32-bit. */ /* toplevel Segment */ #define GST_MATROSKA_ID_SEGMENT 0x18538067 /* matroska top-level master IDs, childs of Segment */ #define GST_MATROSKA_ID_SEGMENTINFO 0x1549A966 #define GST_MATROSKA_ID_TRACKS 0x1654AE6B #define GST_MATROSKA_ID_CUES 0x1C53BB6B #define GST_MATROSKA_ID_TAGS 0x1254C367 #define GST_MATROSKA_ID_SEEKHEAD 0x114D9B74 #define GST_MATROSKA_ID_CLUSTER 0x1F43B675 #define GST_MATROSKA_ID_ATTACHMENTS 0x1941A469 #define GST_MATROSKA_ID_CHAPTERS 0x1043A770 /* IDs in the SegmentInfo master */ #define GST_MATROSKA_ID_TIMECODESCALE 0x2AD7B1 #define GST_MATROSKA_ID_DURATION 0x4489 #define GST_MATROSKA_ID_WRITINGAPP 0x5741 #define GST_MATROSKA_ID_MUXINGAPP 0x4D80 #define GST_MATROSKA_ID_DATEUTC 0x4461 #define GST_MATROSKA_ID_SEGMENTUID 0x73A4 #define GST_MATROSKA_ID_SEGMENTFILENAME 0x7384 #define GST_MATROSKA_ID_PREVUID 0x3CB923 #define GST_MATROSKA_ID_PREVFILENAME 0x3C83AB #define GST_MATROSKA_ID_NEXTUID 0x3EB923 #define GST_MATROSKA_ID_NEXTFILENAME 0x3E83BB #define GST_MATROSKA_ID_TITLE 0x7BA9 #define GST_MATROSKA_ID_SEGMENTFAMILY 0x4444 #define GST_MATROSKA_ID_CHAPTERTRANSLATE 0x6924 /* IDs in the ChapterTranslate master */ #define GST_MATROSKA_ID_CHAPTERTRANSLATEEDITIONUID 0x69FC #define GST_MATROSKA_ID_CHAPTERTRANSLATECODEC 0x69BF #define GST_MATROSKA_ID_CHAPTERTRANSLATEID 0x69A5 /* ID in the Tracks master */ #define GST_MATROSKA_ID_TRACKENTRY 0xAE /* IDs in the TrackEntry master */ #define GST_MATROSKA_ID_TRACKNUMBER 0xD7 #define GST_MATROSKA_ID_TRACKUID 0x73C5 #define GST_MATROSKA_ID_TRACKTYPE 0x83 #define GST_MATROSKA_ID_TRACKAUDIO 0xE1 #define GST_MATROSKA_ID_TRACKVIDEO 0xE0 #define GST_MATROSKA_ID_CONTENTENCODINGS 0x6D80 #define GST_MATROSKA_ID_CODECID 0x86 #define GST_MATROSKA_ID_CODECPRIVATE 0x63A2 #define GST_MATROSKA_ID_CODECNAME 0x258688 #define GST_MATROSKA_ID_TRACKNAME 0x536E #define GST_MATROSKA_ID_TRACKLANGUAGE 0x22B59C #define GST_MATROSKA_ID_TRACKFLAGENABLED 0xB9 #define GST_MATROSKA_ID_TRACKFLAGDEFAULT 0x88 #define GST_MATROSKA_ID_TRACKFLAGFORCED 0x55AA #define GST_MATROSKA_ID_TRACKFLAGLACING 0x9C #define GST_MATROSKA_ID_TRACKMINCACHE 0x6DE7 #define GST_MATROSKA_ID_TRACKMAXCACHE 0x6DF8 #define GST_MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383 #define GST_MATROSKA_ID_TRACKTIMECODESCALE 0x23314F #define GST_MATROSKA_ID_MAXBLOCKADDITIONID 0x55EE #define GST_MATROSKA_ID_TRACKATTACHMENTLINK 0x7446 #define GST_MATROSKA_ID_TRACKOVERLAY 0x6FAB #define GST_MATROSKA_ID_TRACKTRANSLATE 0x6624 /* semi-draft */ #define GST_MATROSKA_ID_TRACKOFFSET 0x537F /* semi-draft */ #define GST_MATROSKA_ID_CODECSETTINGS 0x3A9697 /* semi-draft */ #define GST_MATROSKA_ID_CODECINFOURL 0x3B4040 /* semi-draft */ #define GST_MATROSKA_ID_CODECDOWNLOADURL 0x26B240 /* semi-draft */ #define GST_MATROSKA_ID_CODECDECODEALL 0xAA /* IDs in the TrackTranslate master */ #define GST_MATROSKA_ID_TRACKTRANSLATEEDITIONUID 0x66FC #define GST_MATROSKA_ID_TRACKTRANSLATECODEC 0x66BF #define GST_MATROSKA_ID_TRACKTRANSLATETRACKID 0x66A5 /* IDs in the TrackVideo master */ /* NOTE: This one is here only for backward compatibility. * Use _TRACKDEFAULDURATION */ #define GST_MATROSKA_ID_VIDEOFRAMERATE 0x2383E3 #define GST_MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0 #define GST_MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA #define GST_MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2 #define GST_MATROSKA_ID_VIDEOPIXELWIDTH 0xB0 #define GST_MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA #define GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM 0x54AA #define GST_MATROSKA_ID_VIDEOPIXELCROPTOP 0x54BB #define GST_MATROSKA_ID_VIDEOPIXELCROPLEFT 0x54CC #define GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT 0x54DD #define GST_MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A /* semi-draft */ #define GST_MATROSKA_ID_VIDEOSTEREOMODE 0x53B8 #define GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3 #define GST_MATROSKA_ID_VIDEOCOLOURSPACE 0x2EB524 /* semi-draft */ #define GST_MATROSKA_ID_VIDEOGAMMAVALUE 0x2FB523 /* IDs in the TrackAudio master */ #define GST_MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5 #define GST_MATROSKA_ID_AUDIOBITDEPTH 0x6264 #define GST_MATROSKA_ID_AUDIOCHANNELS 0x9F /* semi-draft */ #define GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS 0x7D7B #define GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ 0x78B5 /* IDs in the TrackContentEncoding master */ #define GST_MATROSKA_ID_CONTENTENCODING 0x6240 /* IDs in the ContentEncoding master */ #define GST_MATROSKA_ID_CONTENTENCODINGORDER 0x5031 #define GST_MATROSKA_ID_CONTENTENCODINGSCOPE 0x5032 #define GST_MATROSKA_ID_CONTENTENCODINGTYPE 0x5033 #define GST_MATROSKA_ID_CONTENTCOMPRESSION 0x5034 #define GST_MATROSKA_ID_CONTENTENCRYPTION 0x5035 /* IDs in the ContentCompression master */ #define GST_MATROSKA_ID_CONTENTCOMPALGO 0x4254 #define GST_MATROSKA_ID_CONTENTCOMPSETTINGS 0x4255 /* IDs in the ContentEncryption master */ #define GST_MATROSKA_ID_CONTENTENCALGO 0x47E1 #define GST_MATROSKA_ID_CONTENTENCKEYID 0x47E2 #define GST_MATROSKA_ID_CONTENTSIGNATURE 0x47E3 #define GST_MATROSKA_ID_CONTENTSIGKEYID 0x47E4 #define GST_MATROSKA_ID_CONTENTSIGALGO 0x47E5 #define GST_MATROSKA_ID_CONTENTSIGHASHALGO 0x47E6 /* ID in the CUEs master */ #define GST_MATROSKA_ID_POINTENTRY 0xBB /* IDs in the pointentry master */ #define GST_MATROSKA_ID_CUETIME 0xB3 #define GST_MATROSKA_ID_CUETRACKPOSITIONS 0xB7 /* IDs in the CueTrackPositions master */ #define GST_MATROSKA_ID_CUETRACK 0xF7 #define GST_MATROSKA_ID_CUECLUSTERPOSITION 0xF1 #define GST_MATROSKA_ID_CUEBLOCKNUMBER 0x5378 /* semi-draft */ #define GST_MATROSKA_ID_CUECODECSTATE 0xEA /* semi-draft */ #define GST_MATROSKA_ID_CUEREFERENCE 0xDB /* IDs in the CueReference master */ /* semi-draft */ #define GST_MATROSKA_ID_CUEREFTIME 0x96 /* semi-draft */ #define GST_MATROSKA_ID_CUEREFCLUSTER 0x97 /* semi-draft */ #define GST_MATROSKA_ID_CUEREFNUMBER 0x535F /* semi-draft */ #define GST_MATROSKA_ID_CUEREFCODECSTATE 0xEB /* IDs in the Tags master */ #define GST_MATROSKA_ID_TAG 0x7373 /* in the Tag master */ #define GST_MATROSKA_ID_SIMPLETAG 0x67C8 #define GST_MATROSKA_ID_TARGETS 0x63C0 /* in the SimpleTag master */ #define GST_MATROSKA_ID_TAGNAME 0x45A3 #define GST_MATROSKA_ID_TAGSTRING 0x4487 #define GST_MATROSKA_ID_TAGLANGUAGE 0x447A #define GST_MATROSKA_ID_TAGDEFAULT 0x4484 #define GST_MATROSKA_ID_TAGBINARY 0x4485 /* in the Targets master */ #define GST_MATROSKA_ID_TARGETTYPEVALUE 0x68CA #define GST_MATROSKA_ID_TARGETTYPE 0x63CA #define GST_MATROSKA_ID_TARGETTRACKUID 0x63C5 #define GST_MATROSKA_ID_TARGETEDITIONUID 0x63C5 #define GST_MATROSKA_ID_TARGETCHAPTERUID 0x63C4 #define GST_MATROSKA_ID_TARGETATTACHMENTUID 0x63C6 /* IDs in the SeekHead master */ #define GST_MATROSKA_ID_SEEKENTRY 0x4DBB /* IDs in the SeekEntry master */ #define GST_MATROSKA_ID_SEEKID 0x53AB #define GST_MATROSKA_ID_SEEKPOSITION 0x53AC /* IDs in the Cluster master */ #define GST_MATROSKA_ID_CLUSTERTIMECODE 0xE7 #define GST_MATROSKA_ID_BLOCKGROUP 0xA0 #define GST_MATROSKA_ID_SIMPLEBLOCK 0xA3 #define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB #define GST_MATROSKA_ID_POSITION 0xA7 #define GST_MATROSKA_ID_PREVSIZE 0xAB /* semi-draft */ #define GST_MATROSKA_ID_ENCRYPTEDBLOCK 0xAF #define GST_MATROSKA_ID_SILENTTRACKS 0x5854 /* IDs in the SilentTracks master */ #define GST_MATROSKA_ID_SILENTTRACKNUMBER 0x58D7 /* IDs in the BlockGroup master */ #define GST_MATROSKA_ID_BLOCK 0xA1 #define GST_MATROSKA_ID_BLOCKDURATION 0x9B /* semi-draft */ #define GST_MATROSKA_ID_BLOCKVIRTUAL 0xA2 #define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB #define GST_MATROSKA_ID_BLOCKADDITIONS 0x75A1 #define GST_MATROSKA_ID_REFERENCEPRIORITY 0xFA /* semi-draft */ #define GST_MATROSKA_ID_REFERENCEVIRTUAL 0xFD /* semi-draft */ #define GST_MATROSKA_ID_CODECSTATE 0xA4 #define GST_MATROSKA_ID_SLICES 0x8E /* IDs in the BlockAdditions master */ #define GST_MATROSKA_ID_BLOCKMORE 0xA6 /* IDs in the BlockMore master */ #define GST_MATROSKA_ID_BLOCKADDID 0xEE #define GST_MATROSKA_ID_BLOCKADDITIONAL 0xA5 /* IDs in the Slices master */ #define GST_MATROSKA_ID_TIMESLICE 0xE8 /* IDs in the TimeSlice master */ #define GST_MATROSKA_ID_LACENUMBER 0xCC /* semi-draft */ #define GST_MATROSKA_ID_FRAMENUMBER 0xCD /* semi-draft */ #define GST_MATROSKA_ID_BLOCKADDITIONID 0xCB /* semi-draft */ #define GST_MATROSKA_ID_TIMESLICEDELAY 0xCE #define GST_MATROSKA_ID_TIMESLICEDURATION 0xCF /* IDs in the Attachments master */ #define GST_MATROSKA_ID_ATTACHEDFILE 0x61A7 /* IDs in the AttachedFile master */ #define GST_MATROSKA_ID_FILEDESCRIPTION 0x467E #define GST_MATROSKA_ID_FILENAME 0x466E #define GST_MATROSKA_ID_FILEMIMETYPE 0x4660 #define GST_MATROSKA_ID_FILEDATA 0x465C #define GST_MATROSKA_ID_FILEUID 0x46AE /* semi-draft */ #define GST_MATROSKA_ID_FILEREFERRAL 0x4675 /* IDs in the Chapters master */ #define GST_MATROSKA_ID_EDITIONENTRY 0x45B9 /* IDs in the EditionEntry master */ #define GST_MATROSKA_ID_EDITIONUID 0x45BC #define GST_MATROSKA_ID_EDITIONFLAGHIDDEN 0x45BD #define GST_MATROSKA_ID_EDITIONFLAGDEFAULT 0x45DB #define GST_MATROSKA_ID_EDITIONFLAGORDERED 0x45DD #define GST_MATROSKA_ID_CHAPTERATOM 0xB6 /* IDs in the ChapterAtom master */ #define GST_MATROSKA_ID_CHAPTERUID 0x73C4 #define GST_MATROSKA_ID_CHAPTERTIMESTART 0x91 #define GST_MATROSKA_ID_CHAPTERTIMESTOP 0x92 #define GST_MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98 #define GST_MATROSKA_ID_CHAPTERFLAGENABLED 0x4598 #define GST_MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67 #define GST_MATROSKA_ID_CHAPTERSEGMENTEDITIONUID 0x6EBC #define GST_MATROSKA_ID_CHAPTERPHYSICALEQUIV 0x63C3 #define GST_MATROSKA_ID_CHAPTERTRACK 0x8F #define GST_MATROSKA_ID_CHAPTERDISPLAY 0x80 #define GST_MATROSKA_ID_CHAPPROCESS 0x6944 /* IDs in the ChapProcess master */ #define GST_MATROSKA_ID_CHAPPROCESSCODECID 0x6955 #define GST_MATROSKA_ID_CHAPPROCESSPRIVATE 0x450D #define GST_MATROSKA_ID_CHAPPROCESSCOMMAND 0x6911 /* IDs in the ChapProcessCommand master */ #define GST_MATROSKA_ID_CHAPPROCESSTIME 0x6922 #define GST_MATROSKA_ID_CHAPPROCESSDATA 0x6933 /* IDs in the ChapterDisplay master */ #define GST_MATROSKA_ID_CHAPSTRING 0x85 #define GST_MATROSKA_ID_CHAPLANGUAGE 0x437C #define GST_MATROSKA_ID_CHAPCOUNTRY 0x437E /* IDs in the ChapterTrack master */ #define GST_MATROSKA_ID_CHAPTERTRACKNUMBER 0x89 /* * Matroska Codec IDs. Strings. */ #define GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC "V_MS/VFW/FOURCC" #define GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED "V_UNCOMPRESSED" #define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP "V_MPEG4/ISO/SP" #define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP "V_MPEG4/ISO/ASP" #define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP "V_MPEG4/ISO/AP" #define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC "V_MPEG4/ISO/AVC" #define GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3 "V_MPEG4/MS/V3" #define GST_MATROSKA_CODEC_ID_VIDEO_MPEG1 "V_MPEG1" #define GST_MATROSKA_CODEC_ID_VIDEO_MPEG2 "V_MPEG2" /* FIXME: not (yet) in the spec! */ #define GST_MATROSKA_CODEC_ID_VIDEO_MJPEG "V_MJPEG" #define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1 "V_REAL/RV10" #define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2 "V_REAL/RV20" #define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3 "V_REAL/RV30" #define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4 "V_REAL/RV40" #define GST_MATROSKA_CODEC_ID_VIDEO_THEORA "V_THEORA" #define GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME "V_QUICKTIME" #define GST_MATROSKA_CODEC_ID_VIDEO_SNOW "V_SNOW" #define GST_MATROSKA_CODEC_ID_VIDEO_DIRAC "V_DIRAC" #define GST_MATROSKA_CODEC_ID_VIDEO_VP8 "V_VP8" #define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1 "A_MPEG/L1" #define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2 "A_MPEG/L2" #define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3 "A_MPEG/L3" #define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE "A_PCM/INT/BIG" #define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE "A_PCM/INT/LIT" #define GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT "A_PCM/FLOAT/IEEE" #define GST_MATROSKA_CODEC_ID_AUDIO_AC3 "A_AC3" #define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID9 "A_AC3/BSID9" #define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10 "A_AC3/BSID10" #define GST_MATROSKA_CODEC_ID_AUDIO_EAC3 "A_EAC3" #define GST_MATROSKA_CODEC_ID_AUDIO_DTS "A_DTS" #define GST_MATROSKA_CODEC_ID_AUDIO_VORBIS "A_VORBIS" #define GST_MATROSKA_CODEC_ID_AUDIO_FLAC "A_FLAC" /* FIXME: not yet in the spec */ #define GST_MATROSKA_CODEC_ID_AUDIO_SPEEX "A_SPEEX" #define GST_MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM" #define GST_MATROSKA_CODEC_ID_AUDIO_TTA "A_TTA1" #define GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4 "A_WAVPACK4" #define GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4 "A_REAL/14_4" #define GST_MATROSKA_CODEC_ID_AUDIO_REAL_28_8 "A_REAL/28_8" #define GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK "A_REAL/COOK" #define GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR "A_REAL/SIPR" #define GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF "A_REAL/RALF" #define GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC "A_REAL/ATRC" #define GST_MATROSKA_CODEC_ID_AUDIO_AAC "A_AAC" #define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2 "A_AAC/MPEG2/" #define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4 "A_AAC/MPEG4/" #define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC "A_QUICKTIME/QDMC" #define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2 "A_QUICKTIME/QDM2" /* Undefined for now: #define GST_MATROSKA_CODEC_ID_AUDIO_MPC "A_MPC" */ #define GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII "S_TEXT/ASCII" #define GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8 "S_TEXT/UTF8" #define GST_MATROSKA_CODEC_ID_SUBTITLE_SSA "S_TEXT/SSA" #define GST_MATROSKA_CODEC_ID_SUBTITLE_ASS "S_TEXT/ASS" #define GST_MATROSKA_CODEC_ID_SUBTITLE_USF "S_TEXT/USF" #define GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB "S_VOBSUB" #define GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS "S_HDMV/PGS" #define GST_MATROSKA_CODEC_ID_SUBTITLE_BMP "S_IMAGE/BMP" #define GST_MATROSKA_CODEC_ID_SUBTITLE_KATE "S_KATE" /* * Matroska tags. Strings. */ #define GST_MATROSKA_TAG_ID_TITLE "TITLE" #define GST_MATROSKA_TAG_ID_AUTHOR "AUTHOR" #define GST_MATROSKA_TAG_ID_ARTIST "ARTIST" #define GST_MATROSKA_TAG_ID_ALBUM "ALBUM" #define GST_MATROSKA_TAG_ID_COMMENTS "COMMENTS" #define GST_MATROSKA_TAG_ID_BITSPS "BITSPS" #define GST_MATROSKA_TAG_ID_BPS "BPS" #define GST_MATROSKA_TAG_ID_ENCODER "ENCODER" #define GST_MATROSKA_TAG_ID_DATE "DATE" #define GST_MATROSKA_TAG_ID_ISRC "ISRC" #define GST_MATROSKA_TAG_ID_COPYRIGHT "COPYRIGHT" #define GST_MATROSKA_TAG_ID_BPM "BPM" #define GST_MATROSKA_TAG_ID_TERMS_OF_USE "TERMS_OF_USE" #define GST_MATROSKA_TAG_ID_DATE "DATE" #define GST_MATROSKA_TAG_ID_COMPOSER "COMPOSER" #define GST_MATROSKA_TAG_ID_LEAD_PERFORMER "LEAD_PERFOMER" #define GST_MATROSKA_TAG_ID_GENRE "GENRE" /* * TODO: add this tag & mappings * "REPLAYGAIN_GAIN" -> GST_TAG_*_GAIN see http://replaygain.hydrogenaudio.org/rg_data_format.html * "REPLAYGAIN_PEAK" -> GST_TAG_*_PEAK see http://replaygain.hydrogenaudio.org/peak_data_format.html * both are depending on the target (track, album?) * * "TOTAL_PARTS" -> GST_TAG_TRACK_COUNT depending on target * "PART_NUMBER" -> GST_TAG_TRACK_NUMBER depending on target * * "SORT_WITH" -> nested in other elements, GST_TAG_TITLE_SORTNAME, etc * * TODO: maybe add custom gstreamer tags for other standard matroska tags, * see http://matroska.org/technical/specs/tagging/index.html * * TODO: handle tag targets and nesting correctly */ /* * Enumerations for various types (mapping from binary * value to what it actually means). */ typedef enum { GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1, GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2, GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3, GST_MATROSKA_TRACK_TYPE_LOGO = 0x10, GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11, GST_MATROSKA_TRACK_TYPE_BUTTONS = 0x12, GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20, } GstMatroskaTrackType; typedef enum { GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0, GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1, GST_MATROSKA_ASPECT_RATIO_MODE_FIXED = 0x2, } GstMatroskaAspectRatioMode; /* * These aren't in any way "matroska-form" things, * it's just something I use in the muxer/demuxer. */ typedef enum { GST_MATROSKA_TRACK_ENABLED = (1<<0), GST_MATROSKA_TRACK_DEFAULT = (1<<1), GST_MATROSKA_TRACK_LACING = (1<<2), GST_MATROSKA_TRACK_FORCED = (1<<3), GST_MATROSKA_TRACK_SHIFT = (1<<16) } GstMatroskaTrackFlags; typedef enum { GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0) } GstMatroskaVideoTrackFlags; typedef struct _GstMatroskaTrackContext GstMatroskaTrackContext; /* TODO: check if all fields are used */ struct _GstMatroskaTrackContext { GstPad *pad; GstCaps *caps; guint index; GstFlowReturn last_flow; /* reverse playback */ GstClockTime from_time; gint64 from_offset; gint64 to_offset; GArray *index_table; gint index_writer_id; /* some often-used info */ gchar *codec_id, *codec_name, *name, *language; guint8 *codec_priv; guint codec_priv_size; guint8 *codec_state; guint codec_state_size; GstMatroskaTrackType type; guint uid, num; GstMatroskaTrackFlags flags; guint64 default_duration; guint64 pos; gdouble timecodescale; gboolean set_discont; /* TRUE = set DISCONT flag on next buffer */ /* Special flag for Vorbis and Theora, for which we need to send * codec_priv first before sending any data, and just testing * for time == 0 is not enough to detect that. Used by demuxer */ gboolean send_xiph_headers; /* Special flag for Flac, for which we need to reconstruct the header * buffer from the codec_priv data before sending any data, and just * testing for time == 0 is not enough to detect that. Used by demuxer */ gboolean send_flac_headers; /* Special flag for Speex, for which we need to reconstruct the header * buffer from the codec_priv data before sending any data, and just * testing for time == 0 is not enough to detect that. Used by demuxer */ gboolean send_speex_headers; /* Special flag for VobSub, for which we have to send colour table info * (if available) first before sending any data, and just testing * for time == 0 is not enough to detect that. Used by demuxer */ gboolean send_dvd_event; /* Special counter for muxer to skip the first N vorbis/theora headers - * they are put into codec private data, not muxed into the stream */ guint xiph_headers_to_skip; /* Used for postprocessing a frame before it is pushed from the demuxer */ GstFlowReturn (*postprocess_frame) (GstElement *element, GstMatroskaTrackContext *context, GstBuffer **buffer); /* Tags to send after newsegment event */ GstTagList *pending_tags; /* A GArray of GstMatroskaTrackEncoding structures which contain the * encoding (compression/encryption) settings for this track, if any */ GArray *encodings; /* Whether the stream is EOS */ gboolean eos; /* any alignment we need our output buffers to have */ gint alignment; }; typedef struct _GstMatroskaTrackVideoContext { GstMatroskaTrackContext parent; guint pixel_width, pixel_height; guint display_width, display_height; gdouble default_fps; GstMatroskaAspectRatioMode asr_mode; guint32 fourcc; /* QoS */ GstClockTime earliest_time; GstBuffer *dirac_unit; } GstMatroskaTrackVideoContext; typedef struct _GstMatroskaTrackAudioContext { GstMatroskaTrackContext parent; guint samplerate, channels, bitdepth; guint32 wvpk_block_index; } GstMatroskaTrackAudioContext; typedef struct _GstMatroskaTrackSubtitleContext { GstMatroskaTrackContext parent; gboolean check_utf8; /* buffers should be valid UTF-8 */ gboolean check_markup; /* check if buffers contain markup * or plaintext and escape characters */ gboolean invalid_utf8; /* work around broken files */ gboolean seen_markup_tag; /* markup found in text */ } GstMatroskaTrackSubtitleContext; typedef struct _GstMatroskaIndex { guint64 pos; /* of the corresponding *cluster*! */ guint16 track; /* reference to 'num' */ GstClockTime time; /* in nanoseconds */ guint32 block; /* number of the block in the cluster */ } GstMatroskaIndex; typedef struct _Wavpack4Header { guchar ck_id [4]; /* "wvpk" */ guint32 ck_size; /* size of entire frame (minus 8, of course) */ guint16 version; /* 0x403 for now */ guint8 track_no; /* track number (0 if not used, like now) */ guint8 index_no; /* remember these? (0 if not used, like now) */ guint32 total_samples; /* for entire file (-1 if unknown) */ guint32 block_index; /* index of first sample in block (to file begin) */ guint32 block_samples; /* # samples in this block */ guint32 flags; /* various flags for id and decoding */ guint32 crc; /* crc for actual decoded data */ } Wavpack4Header; typedef enum { GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME = (1<<0), GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA = (1<<1), GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING = (1<<2) } GstMatroskaTrackEncodingScope; typedef enum { GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_ZLIB = 0, GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_BZLIB = 1, GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_LZO1X = 2, GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_HEADERSTRIP = 3 } GstMatroskaTrackCompressionAlgorithm; typedef struct _GstMatroskaTrackEncoding { guint order; guint scope : 3; guint type : 1; guint comp_algo : 2; guint8 *comp_settings; guint comp_settings_length; } GstMatroskaTrackEncoding; gboolean gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context); gboolean gst_matroska_track_init_audio_context (GstMatroskaTrackContext ** p_context); gboolean gst_matroska_track_init_subtitle_context (GstMatroskaTrackContext ** p_context); void gst_matroska_register_tags (void); #endif /* __GST_MATROSKA_IDS_H__ */ gst-plugins-good-0.10.31/gst/matroska/matroska-parse.h0000644000175000017500000000644111677341655017543 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2011 Debarshi Ray * * matroska-parse.h: matroska file/stream parseer definition * * 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_MATROSKA_PARSE_H__ #define __GST_MATROSKA_PARSE_H__ #include #include "ebml-read.h" #include "matroska-ids.h" #include "matroska-read-common.h" G_BEGIN_DECLS #define GST_TYPE_MATROSKA_PARSE \ (gst_matroska_parse_get_type ()) #define GST_MATROSKA_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_PARSE, GstMatroskaParse)) #define GST_MATROSKA_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_PARSE, GstMatroskaParseClass)) #define GST_IS_MATROSKA_PARSE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_PARSE)) #define GST_IS_MATROSKA_PARSE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_PARSE)) typedef struct _GstMatroskaParse { GstElement parent; /* < private > */ GstMatroskaReadCommon common; /* pads */ GstPad *srcpad; GstClock *clock; guint num_v_streams; guint num_a_streams; guint num_t_streams; GstBuffer *streamheader; gboolean pushed_headers; GstClockTime last_timestamp; /* state */ //gboolean streaming; guint level_up; guint64 seek_block; gboolean seek_first; /* did we parse cues/tracks/segmentinfo already? */ gboolean tracks_parsed; GList *seek_parsed; /* keeping track of playback position */ gboolean segment_running; GstClockTime last_stop_end; GstEvent *close_segment; GstEvent *new_segment; /* some state saving */ GstClockTime cluster_time; guint64 cluster_offset; guint64 first_cluster_offset; guint64 next_cluster_offset; /* index stuff */ gboolean seekable; gboolean building_index; guint64 index_offset; GstEvent *seek_event; gboolean need_newsegment; /* reverse playback */ GArray *seek_index; gint seek_entry; } GstMatroskaParse; typedef struct _GstMatroskaParseClass { GstElementClass parent; } GstMatroskaParseClass; gboolean gst_matroska_parse_plugin_init (GstPlugin *plugin); G_END_DECLS #endif /* __GST_MATROSKA_PARSE_H__ */ gst-plugins-good-0.10.31/gst/matroska/webm-mux.h0000644000175000017500000000320111671175353016334 00000000000000/* GStreamer WebM muxer * Copyright (c) 2010 Sebastian Dröge * * 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_WEBM_MUX_H__ #define __GST_WEBM_MUX_H__ #include "matroska-mux.h" #define GST_TYPE_WEBM_MUX \ (gst_webm_mux_get_type ()) #define GST_WEBM_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WEBM_MUX, GstWebMMux)) #define GST_WEBM_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WEBM_MUX, GstWebMMuxClass)) #define GST_IS_WEBM_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WEBM_MUX)) #define GST_IS_WEBM_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WEBM_MUX)) typedef struct _GstWebMMux GstWebMMux; typedef struct _GstWebMMuxClass GstWebMMuxClass; struct _GstWebMMux { GstMatroskaMux matroskamux; }; struct _GstWebMMuxClass { GstMatroskaMuxClass matroskamuxclass; }; GType gst_webm_mux_get_type (void); #endif /* __GST_WEBM_MUX_H__ */ gst-plugins-good-0.10.31/gst/matroska/ebml-write.h0000644000175000017500000001300711671175353016647 00000000000000/* GStreamer EBML I/O * (c) 2003 Ronald Bultje * (c) 2005 Michal Benes * * ebml-write.c: write EBML data to file/stream * * 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_EBML_WRITE_H__ #define __GST_EBML_WRITE_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_EBML_WRITE \ (gst_ebml_write_get_type ()) #define GST_EBML_WRITE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EBML_WRITE, GstEbmlWrite)) #define GST_EBML_WRITE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_WRITE, GstEbmlWriteClass)) #define GST_IS_EBML_WRITE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_WRITE)) #define GST_IS_EBML_WRITE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_WRITE)) #define GST_EBML_WRITE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_WRITE, GstEbmlWriteClass)) typedef struct _GstEbmlWrite { GstObject object; GstPad *srcpad; guint64 pos; guint64 last_pos; GstClockTime timestamp; GstByteWriter *cache; guint64 cache_pos; GstFlowReturn last_write_result; gboolean writing_streamheader; GstByteWriter *streamheader; guint64 streamheader_pos; GstCaps *caps; } GstEbmlWrite; typedef struct _GstEbmlWriteClass { GstObjectClass parent; } GstEbmlWriteClass; GType gst_ebml_write_get_type (void); GstEbmlWrite *gst_ebml_write_new (GstPad *srcpad); void gst_ebml_write_reset (GstEbmlWrite *ebml); GstFlowReturn gst_ebml_last_write_result (GstEbmlWrite *ebml); /* Used to create streamheaders */ void gst_ebml_start_streamheader (GstEbmlWrite *ebml); GstBuffer* gst_ebml_stop_streamheader (GstEbmlWrite *ebml); /* * Caching means that we do not push one buffer for * each element, but fill this one until a flush. */ void gst_ebml_write_set_cache (GstEbmlWrite *ebml, guint size); void gst_ebml_write_flush_cache (GstEbmlWrite *ebml, gboolean is_keyframe, GstClockTime timestamp); /* * Seeking. */ void gst_ebml_write_seek (GstEbmlWrite *ebml, guint64 pos); /* * Data writing. */ void gst_ebml_write_uint (GstEbmlWrite *ebml, guint32 id, guint64 num); void gst_ebml_write_sint (GstEbmlWrite *ebml, guint32 id, gint64 num); void gst_ebml_write_float (GstEbmlWrite *ebml, guint32 id, gdouble num); void gst_ebml_write_ascii (GstEbmlWrite *ebml, guint32 id, const gchar *str); void gst_ebml_write_utf8 (GstEbmlWrite *ebml, guint32 id, const gchar *str); void gst_ebml_write_date (GstEbmlWrite *ebml, guint32 id, gint64 date); guint64 gst_ebml_write_master_start (GstEbmlWrite *ebml, guint32 id); void gst_ebml_write_master_finish (GstEbmlWrite *ebml, guint64 startpos); void gst_ebml_write_master_finish_full (GstEbmlWrite * ebml, guint64 startpos, guint64 extra_size); void gst_ebml_write_binary (GstEbmlWrite *ebml, guint32 id, guchar *binary, guint64 length); void gst_ebml_write_header (GstEbmlWrite *ebml, const gchar *doctype, guint version); /* * Note: this is supposed to be used only for media data. */ void gst_ebml_write_buffer_header (GstEbmlWrite *ebml, guint32 id, guint64 length); void gst_ebml_write_buffer (GstEbmlWrite *ebml, GstBuffer *data); /* * A hack, basically... See matroska-mux.c. I should actually * make a nice _replace_element_with_size() or so, but this * works for now. */ void gst_ebml_replace_uint (GstEbmlWrite *ebml, guint64 pos, guint64 num); G_END_DECLS #endif /* __GST_EBML_WRITE_H__ */ gst-plugins-good-0.10.31/gst/matroska/matroska-mux.c0000644000175000017500000030457311712574351017233 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2005 Michal Benes * (c) 2008 Sebastian Dröge * * matroska-mux.c: matroska file/stream muxer * * 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. */ /* TODO: - check everywhere that we don't write invalid values * - make sure timestamps are correctly scaled everywhere */ /** * SECTION:element-matroskamux * * matroskamux muxes different input streams into a Matroska file. * * * Example launch line * |[ * gst-launch -v filesrc location=/path/to/mp3 ! mp3parse ! matroskamux name=mux ! filesink location=test.mkv filesrc location=/path/to/theora.ogg ! oggdemux ! theoraparse ! mux. * ]| This pipeline muxes an MP3 file and a Ogg Theora video into a Matroska file. * |[ * gst-launch -v audiotestsrc num-buffers=100 ! audioconvert ! vorbisenc ! matroskamux ! filesink location=test.mka * ]| This pipeline muxes a 440Hz sine wave encoded with the Vorbis codec into a Matroska file. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "matroska-mux.h" #include "matroska-ids.h" GST_DEBUG_CATEGORY_STATIC (matroskamux_debug); #define GST_CAT_DEFAULT matroskamux_debug enum { ARG_0, ARG_WRITING_APP, ARG_DOCTYPE_VERSION, ARG_MIN_INDEX_INTERVAL, ARG_STREAMABLE }; #define DEFAULT_DOCTYPE_VERSION 2 #define DEFAULT_WRITING_APP "GStreamer Matroska muxer" #define DEFAULT_MIN_INDEX_INTERVAL 0 #define DEFAULT_STREAMABLE FALSE /* WAVEFORMATEX is gst_riff_strf_auds + an extra guint16 extension size */ #define WAVEFORMATEX_SIZE (2 + sizeof (gst_riff_strf_auds)) static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-matroska") ); #define COMMON_VIDEO_CAPS \ "width = (int) [ 16, 4096 ], " \ "height = (int) [ 16, 4096 ], " \ "framerate = (fraction) [ 0, MAX ]" #define COMMON_VIDEO_CAPS_NO_FRAMERATE \ "width = (int) [ 16, 4096 ], " \ "height = (int) [ 16, 4096 ] " /* FIXME: * * require codec data, etc as needed */ static GstStaticPadTemplate videosink_templ = GST_STATIC_PAD_TEMPLATE ("video_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/mpeg, " "mpegversion = (int) { 1, 2, 4 }, " "systemstream = (boolean) false, " COMMON_VIDEO_CAPS "; " "video/x-h264, stream-format=avc, alignment=au, " COMMON_VIDEO_CAPS "; " "video/x-divx, " COMMON_VIDEO_CAPS "; " "video/x-xvid, " COMMON_VIDEO_CAPS "; " "video/x-huffyuv, " COMMON_VIDEO_CAPS "; " "video/x-dv, " COMMON_VIDEO_CAPS "; " "video/x-h263, " COMMON_VIDEO_CAPS "; " "video/x-msmpeg, " COMMON_VIDEO_CAPS "; " "image/jpeg, " COMMON_VIDEO_CAPS_NO_FRAMERATE "; " "video/x-theora; " "video/x-dirac, " COMMON_VIDEO_CAPS "; " "video/x-pn-realvideo, " "rmversion = (int) [1, 4], " COMMON_VIDEO_CAPS "; " "video/x-vp8, " COMMON_VIDEO_CAPS "; " "video/x-raw-yuv, " "format = (fourcc) { YUY2, I420, YV12, UYVY, AYUV }, " COMMON_VIDEO_CAPS "; " "video/x-wmv, " "wmvversion = (int) [ 1, 3 ], " COMMON_VIDEO_CAPS) ); #define COMMON_AUDIO_CAPS \ "channels = (int) [ 1, MAX ], " \ "rate = (int) [ 1, MAX ]" /* FIXME: * * require codec data, etc as needed */ static GstStaticPadTemplate audiosink_templ = GST_STATIC_PAD_TEMPLATE ("audio_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ], " COMMON_AUDIO_CAPS "; " "audio/mpeg, " "mpegversion = (int) { 2, 4 }, " "stream-format = (string) raw, " COMMON_AUDIO_CAPS "; " "audio/x-ac3, " COMMON_AUDIO_CAPS "; " "audio/x-eac3, " COMMON_AUDIO_CAPS "; " "audio/x-dts, " COMMON_AUDIO_CAPS "; " "audio/x-vorbis, " COMMON_AUDIO_CAPS "; " "audio/x-flac, " COMMON_AUDIO_CAPS "; " "audio/x-speex, " COMMON_AUDIO_CAPS "; " "audio/x-raw-int, " "width = (int) 8, " "depth = (int) 8, " "signed = (boolean) false, " COMMON_AUDIO_CAPS ";" "audio/x-raw-int, " "width = (int) 16, " "depth = (int) 16, " "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " "signed = (boolean) true, " COMMON_AUDIO_CAPS ";" "audio/x-raw-int, " "width = (int) 24, " "depth = (int) 24, " "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " "signed = (boolean) true, " COMMON_AUDIO_CAPS ";" "audio/x-raw-int, " "width = (int) 32, " "depth = (int) 32, " "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " "signed = (boolean) true, " COMMON_AUDIO_CAPS ";" "audio/x-raw-float, " "width = (int) [ 32, 64 ], " "endianness = (int) LITTLE_ENDIAN, " COMMON_AUDIO_CAPS ";" "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 }, " COMMON_AUDIO_CAPS "; " "audio/x-wma, " "wmaversion = (int) [ 1, 3 ], " "block_align = (int) [ 0, 65535 ], bitrate = (int) [ 0, 524288 ], " COMMON_AUDIO_CAPS ";" "audio/x-alaw, " "channels = (int) {1, 2}, " "rate = (int) [ 8000, 192000 ]; " "audio/x-mulaw, " "channels = (int) {1, 2}, " "rate = (int) [ 8000, 192000 ]") ); static GstStaticPadTemplate subtitlesink_templ = GST_STATIC_PAD_TEMPLATE ("subtitle_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("subtitle/x-kate")); static GArray *used_uids; G_LOCK_DEFINE_STATIC (used_uids); static void gst_matroska_mux_add_interfaces (GType type); GST_BOILERPLATE_FULL (GstMatroskaMux, gst_matroska_mux, GstElement, GST_TYPE_ELEMENT, gst_matroska_mux_add_interfaces); /* Matroska muxer destructor */ static void gst_matroska_mux_finalize (GObject * object); /* Pads collected callback */ static GstFlowReturn gst_matroska_mux_collected (GstCollectPads * pads, gpointer user_data); /* pad functions */ static gboolean gst_matroska_mux_handle_src_event (GstPad * pad, GstEvent * event); static GstPad *gst_matroska_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_matroska_mux_release_pad (GstElement * element, GstPad * pad); /* gst internal change state handler */ static GstStateChangeReturn gst_matroska_mux_change_state (GstElement * element, GstStateChange transition); /* gobject bla bla */ static void gst_matroska_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_matroska_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* reset muxer */ static void gst_matroska_mux_reset (GstElement * element); /* uid generation */ static guint64 gst_matroska_mux_create_uid (); static gboolean theora_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context); static gboolean vorbis_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context); static gboolean speex_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context); static gboolean kate_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context); static gboolean flac_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context); static void gst_matroska_mux_write_simple_tag (const GstTagList * list, const gchar * tag, gpointer data); static void gst_matroska_mux_add_interfaces (GType type) { static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info); } static void gst_matroska_mux_base_init (gpointer g_class) { } static void gst_matroska_mux_class_init (GstMatroskaMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gst_element_class_add_static_pad_template (gstelement_class, &videosink_templ); gst_element_class_add_static_pad_template (gstelement_class, &audiosink_templ); gst_element_class_add_static_pad_template (gstelement_class, &subtitlesink_templ); gst_element_class_add_static_pad_template (gstelement_class, &src_templ); gst_element_class_set_details_simple (gstelement_class, "Matroska muxer", "Codec/Muxer", "Muxes video/audio/subtitle streams into a matroska stream", "GStreamer maintainers "); GST_DEBUG_CATEGORY_INIT (matroskamux_debug, "matroskamux", 0, "Matroska muxer"); gobject_class->finalize = gst_matroska_mux_finalize; gobject_class->get_property = gst_matroska_mux_get_property; gobject_class->set_property = gst_matroska_mux_set_property; g_object_class_install_property (gobject_class, ARG_WRITING_APP, g_param_spec_string ("writing-app", "Writing application.", "The name the application that creates the matroska file.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_DOCTYPE_VERSION, g_param_spec_int ("version", "DocType version", "This parameter determines what Matroska features can be used.", 1, 2, DEFAULT_DOCTYPE_VERSION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_MIN_INDEX_INTERVAL, g_param_spec_int64 ("min-index-interval", "Minimum time between index " "entries", "An index entry is created every so many nanoseconds.", 0, G_MAXINT64, DEFAULT_MIN_INDEX_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_STREAMABLE, g_param_spec_boolean ("streamable", "Determines whether output should " "be streamable", "If set to true, the output should be as if it is " "to be streamed and hence no indexes written or duration written.", DEFAULT_STREAMABLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_matroska_mux_change_state); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_matroska_mux_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_matroska_mux_release_pad); } /** * Start of pad option handler code */ #define DEFAULT_PAD_FRAME_DURATION TRUE #define DEFAULT_PAD_FRAME_DURATION_VP8 FALSE enum { PROP_PAD_0, PROP_PAD_FRAME_DURATION }; typedef struct { GstPad parent; gboolean frame_duration; gboolean frame_duration_user; } GstMatroskamuxPad; static void gst_matroskamux_pad_class_init (GstPadClass * klass); static GType gst_matroskamux_pad_get_type (void) { static GType type = 0; if (G_UNLIKELY (type == 0)) { type = g_type_register_static_simple (GST_TYPE_PAD, g_intern_static_string ("GstMatroskamuxPad"), sizeof (GstPadClass), (GClassInitFunc) gst_matroskamux_pad_class_init, sizeof (GstMatroskamuxPad), NULL, 0); } return type; } #define GST_TYPE_MATROSKAMUX_PAD (gst_matroskamux_pad_get_type()) #define GST_MATROSKAMUX_PAD(pad) (G_TYPE_CHECK_INSTANCE_CAST((pad),GST_TYPE_MATROSKAMUX_PAD,GstMatroskamuxPad)) #define GST_MATROSKAMUX_PAD_CAST(pad) ((GstMatroskamuxPad *) pad) #define GST_IS_MATROSKAMUX_PAD(pad) (G_TYPE_CHECK_INSTANCE_TYPE((pad),GST_TYPE_MATROSKAMUX_PAD)) static void gst_matroskamux_pad_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskamuxPad *pad = GST_MATROSKAMUX_PAD (object); switch (prop_id) { case PROP_PAD_FRAME_DURATION: g_value_set_boolean (value, pad->frame_duration); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_matroskamux_pad_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMatroskamuxPad *pad = GST_MATROSKAMUX_PAD (object); switch (prop_id) { case PROP_PAD_FRAME_DURATION: pad->frame_duration = g_value_get_boolean (value); pad->frame_duration_user = TRUE; break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_matroskamux_pad_class_init (GstPadClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_matroskamux_pad_set_property; gobject_class->get_property = gst_matroskamux_pad_get_property; g_object_class_install_property (gobject_class, PROP_PAD_FRAME_DURATION, g_param_spec_boolean ("frame-duration", "Frame duration", "Default frame duration", DEFAULT_PAD_FRAME_DURATION, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); } static void gst_matroskamux_pad_init (GstMatroskamuxPad * pad) { pad->frame_duration = DEFAULT_PAD_FRAME_DURATION; pad->frame_duration_user = FALSE; } /* * End of pad option handler code **/ /** * gst_matroska_mux_init: * @mux: #GstMatroskaMux that should be initialized. * @g_class: Class of the muxer. * * Matroska muxer constructor. */ static void gst_matroska_mux_init (GstMatroskaMux * mux, GstMatroskaMuxClass * g_class) { GstPadTemplate *templ; templ = gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src"); mux->srcpad = gst_pad_new_from_template (templ, "src"); gst_pad_set_event_function (mux->srcpad, gst_matroska_mux_handle_src_event); gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); mux->collect = gst_collect_pads_new (); gst_collect_pads_set_function (mux->collect, (GstCollectPadsFunction) GST_DEBUG_FUNCPTR (gst_matroska_mux_collected), mux); mux->ebml_write = gst_ebml_write_new (mux->srcpad); mux->doctype = GST_MATROSKA_DOCTYPE_MATROSKA; /* property defaults */ mux->doctype_version = DEFAULT_DOCTYPE_VERSION; mux->writing_app = g_strdup (DEFAULT_WRITING_APP); mux->min_index_interval = DEFAULT_MIN_INDEX_INTERVAL; mux->streamable = DEFAULT_STREAMABLE; /* initialize internal variables */ mux->index = NULL; mux->num_streams = 0; mux->num_a_streams = 0; mux->num_t_streams = 0; mux->num_v_streams = 0; /* initialize remaining variables */ gst_matroska_mux_reset (GST_ELEMENT (mux)); } /** * gst_matroska_mux_finalize: * @object: #GstMatroskaMux that should be finalized. * * Finalize matroska muxer. */ static void gst_matroska_mux_finalize (GObject * object) { GstMatroskaMux *mux = GST_MATROSKA_MUX (object); gst_event_replace (&mux->force_key_unit_event, NULL); gst_object_unref (mux->collect); gst_object_unref (mux->ebml_write); if (mux->writing_app) g_free (mux->writing_app); G_OBJECT_CLASS (parent_class)->finalize (object); } /** * gst_matroska_mux_create_uid: * * Generate new unused track UID. * * Returns: New track UID. */ static guint64 gst_matroska_mux_create_uid (void) { guint64 uid = 0; G_LOCK (used_uids); if (!used_uids) used_uids = g_array_sized_new (FALSE, FALSE, sizeof (guint64), 10); while (!uid) { guint i; uid = (((guint64) g_random_int ()) << 32) | g_random_int (); for (i = 0; i < used_uids->len; i++) { if (g_array_index (used_uids, guint64, i) == uid) { uid = 0; break; } } g_array_append_val (used_uids, uid); } G_UNLOCK (used_uids); return uid; } /** * gst_matroska_pad_reset: * @collect_pad: the #GstMatroskaPad * * Reset and/or release resources of a matroska collect pad. */ static void gst_matroska_pad_reset (GstMatroskaPad * collect_pad, gboolean full) { gchar *name = NULL; GstMatroskaTrackType type = 0; /* free track information */ if (collect_pad->track != NULL) { /* retrieve for optional later use */ name = collect_pad->track->name; type = collect_pad->track->type; /* extra for video */ if (type == GST_MATROSKA_TRACK_TYPE_VIDEO) { GstMatroskaTrackVideoContext *ctx = (GstMatroskaTrackVideoContext *) collect_pad->track; if (ctx->dirac_unit) { gst_buffer_unref (ctx->dirac_unit); ctx->dirac_unit = NULL; } } g_free (collect_pad->track->codec_id); g_free (collect_pad->track->codec_name); if (full) g_free (collect_pad->track->name); g_free (collect_pad->track->language); g_free (collect_pad->track->codec_priv); g_free (collect_pad->track); collect_pad->track = NULL; } /* free cached buffer */ if (collect_pad->buffer != NULL) { gst_buffer_unref (collect_pad->buffer); collect_pad->buffer = NULL; } if (!full && type != 0) { GstMatroskaTrackContext *context; /* create a fresh context */ switch (type) { case GST_MATROSKA_TRACK_TYPE_VIDEO: context = (GstMatroskaTrackContext *) g_new0 (GstMatroskaTrackVideoContext, 1); break; case GST_MATROSKA_TRACK_TYPE_AUDIO: context = (GstMatroskaTrackContext *) g_new0 (GstMatroskaTrackAudioContext, 1); break; case GST_MATROSKA_TRACK_TYPE_SUBTITLE: context = (GstMatroskaTrackContext *) g_new0 (GstMatroskaTrackSubtitleContext, 1); break; default: g_assert_not_reached (); return; } context->type = type; context->name = name; /* TODO: check default values for the context */ context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT; collect_pad->track = context; collect_pad->buffer = NULL; collect_pad->duration = 0; collect_pad->start_ts = GST_CLOCK_TIME_NONE; collect_pad->end_ts = GST_CLOCK_TIME_NONE; } } /** * gst_matroska_pad_free: * @collect_pad: the #GstMatroskaPad * * Release resources of a matroska collect pad. */ static void gst_matroska_pad_free (GstMatroskaPad * collect_pad) { gst_matroska_pad_reset (collect_pad, TRUE); } /** * gst_matroska_mux_reset: * @element: #GstMatroskaMux that should be reseted. * * Reset matroska muxer back to initial state. */ static void gst_matroska_mux_reset (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); GSList *walk; /* reset EBML write */ gst_ebml_write_reset (mux->ebml_write); /* reset input */ mux->state = GST_MATROSKA_MUX_STATE_START; /* clean up existing streams */ for (walk = mux->collect->data; walk; walk = g_slist_next (walk)) { GstMatroskaPad *collect_pad; collect_pad = (GstMatroskaPad *) walk->data; /* reset collect pad to pristine state */ gst_matroska_pad_reset (collect_pad, FALSE); } /* reset indexes */ mux->num_indexes = 0; g_free (mux->index); mux->index = NULL; /* reset timers */ mux->time_scale = GST_MSECOND; mux->max_cluster_duration = G_MAXINT16 * mux->time_scale; mux->duration = 0; /* reset cluster */ mux->cluster = 0; mux->cluster_time = 0; mux->cluster_pos = 0; mux->prev_cluster_size = 0; /* reset tags */ gst_tag_setter_reset_tags (GST_TAG_SETTER (mux)); } /** * gst_matroska_mux_handle_src_event: * @pad: Pad which received the event. * @event: Received event. * * handle events - copied from oggmux without understanding * * Returns: #TRUE on success. */ static gboolean gst_matroska_mux_handle_src_event (GstPad * pad, GstEvent * event) { GstEventType type; type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { case GST_EVENT_SEEK: /* disable seeking for now */ return FALSE; default: break; } return gst_pad_event_default (pad, event); } /** * gst_matroska_mux_handle_sink_event: * @pad: Pad which received the event. * @event: Received event. * * handle events - informational ones like tags * * Returns: #TRUE on success. */ static gboolean gst_matroska_mux_handle_sink_event (GstPad * pad, GstEvent * event) { GstMatroskaTrackContext *context; GstMatroskaPad *collect_pad; GstMatroskaMux *mux; GstTagList *list; gboolean ret = TRUE; mux = GST_MATROSKA_MUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ gchar *lang = NULL; GST_DEBUG_OBJECT (mux, "received tag event"); gst_event_parse_tag (event, &list); collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); g_assert (collect_pad); context = collect_pad->track; g_assert (context); /* Matroska wants ISO 639-2B code, taglist most likely contains 639-1 */ if (gst_tag_list_get_string (list, GST_TAG_LANGUAGE_CODE, &lang)) { const gchar *lang_code; lang_code = gst_tag_get_language_code_iso_639_2B (lang); if (lang_code) { GST_INFO_OBJECT (pad, "Setting language to '%s'", lang_code); context->language = g_strdup (lang_code); } else { GST_WARNING_OBJECT (pad, "Did not get language code for '%s'", lang); } g_free (lang); } /* FIXME: what about stream-specific tags? */ gst_tag_setter_merge_tags (GST_TAG_SETTER (mux), list, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (mux))); gst_event_unref (event); /* handled this, don't want collectpads to forward it downstream */ event = NULL; break; } case GST_EVENT_NEWSEGMENT:{ GstFormat format; gst_event_parse_new_segment (event, NULL, NULL, &format, NULL, NULL, NULL); if (format != GST_FORMAT_TIME) { ret = FALSE; gst_event_unref (event); event = NULL; } break; } case GST_EVENT_CUSTOM_DOWNSTREAM:{ const GstStructure *structure; structure = gst_event_get_structure (event); if (gst_structure_has_name (structure, "GstForceKeyUnit")) { gst_event_replace (&mux->force_key_unit_event, NULL); mux->force_key_unit_event = event; event = NULL; } break; } default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ if (event) ret = mux->collect_event (pad, event); gst_object_unref (mux); return ret; } /** * gst_matroska_mux_video_pad_setcaps: * @pad: Pad which got the caps. * @caps: New caps. * * Setcaps function for video sink pad. * * Returns: #TRUE on success. */ static gboolean gst_matroska_mux_video_pad_setcaps (GstPad * pad, GstCaps * caps) { GstMatroskaTrackContext *context = NULL; GstMatroskaTrackVideoContext *videocontext; GstMatroskaMux *mux; GstMatroskaPad *collect_pad; GstStructure *structure; const gchar *mimetype; const GValue *value = NULL; const GstBuffer *codec_buf = NULL; gint width, height, pixel_width, pixel_height; gint fps_d, fps_n; gboolean interlaced = FALSE; mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); /* find context */ collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); g_assert (collect_pad); context = collect_pad->track; g_assert (context); g_assert (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO); videocontext = (GstMatroskaTrackVideoContext *) context; /* gst -> matroska ID'ing */ structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); if (gst_structure_get_boolean (structure, "interlaced", &interlaced) && interlaced) context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; if (!strcmp (mimetype, "video/x-theora")) { /* we'll extract the details later from the theora identification header */ goto skip_details; } /* get general properties */ /* spec says it is mandatory */ if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "height", &height)) goto refuse_caps; videocontext->pixel_width = width; videocontext->pixel_height = height; /* set vp8 defaults or let user override it */ if (GST_MATROSKAMUX_PAD_CAST (pad)->frame_duration_user == FALSE && (!strcmp (mimetype, "video/x-vp8"))) GST_MATROSKAMUX_PAD_CAST (pad)->frame_duration = DEFAULT_PAD_FRAME_DURATION_VP8; if (GST_MATROSKAMUX_PAD_CAST (pad)->frame_duration && gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d) && fps_n > 0) { context->default_duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n); GST_LOG_OBJECT (pad, "default duration = %" GST_TIME_FORMAT, GST_TIME_ARGS (context->default_duration)); } else { context->default_duration = 0; } if (gst_structure_get_fraction (structure, "pixel-aspect-ratio", &pixel_width, &pixel_height)) { if (pixel_width > pixel_height) { videocontext->display_width = width * pixel_width / pixel_height; videocontext->display_height = height; } else if (pixel_width < pixel_height) { videocontext->display_width = width; videocontext->display_height = height * pixel_height / pixel_width; } else { videocontext->display_width = 0; videocontext->display_height = 0; } } else { videocontext->display_width = 0; videocontext->display_height = 0; } skip_details: videocontext->asr_mode = GST_MATROSKA_ASPECT_RATIO_MODE_FREE; videocontext->fourcc = 0; /* TODO: - check if we handle all codecs by the spec, i.e. codec private * data and other settings * - add new formats */ /* extract codec_data, may turn out needed */ value = gst_structure_get_value (structure, "codec_data"); if (value) codec_buf = gst_value_get_buffer (value); /* find type */ if (!strcmp (mimetype, "video/x-raw-yuv")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED); gst_structure_get_fourcc (structure, "format", &videocontext->fourcc); } else if (!strcmp (mimetype, "video/x-xvid") /* MS/VfW compatibility cases */ ||!strcmp (mimetype, "video/x-huffyuv") || !strcmp (mimetype, "video/x-divx") || !strcmp (mimetype, "video/x-dv") || !strcmp (mimetype, "video/x-h263") || !strcmp (mimetype, "video/x-msmpeg") || !strcmp (mimetype, "video/x-wmv") || !strcmp (mimetype, "image/jpeg")) { gst_riff_strf_vids *bih; gint size = sizeof (gst_riff_strf_vids); guint32 fourcc = 0; if (!strcmp (mimetype, "video/x-xvid")) fourcc = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); else if (!strcmp (mimetype, "video/x-huffyuv")) fourcc = GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'); else if (!strcmp (mimetype, "video/x-dv")) fourcc = GST_MAKE_FOURCC ('D', 'V', 'S', 'D'); else if (!strcmp (mimetype, "video/x-h263")) fourcc = GST_MAKE_FOURCC ('H', '2', '6', '3'); else if (!strcmp (mimetype, "video/x-divx")) { gint divxversion; gst_structure_get_int (structure, "divxversion", &divxversion); switch (divxversion) { case 3: fourcc = GST_MAKE_FOURCC ('D', 'I', 'V', '3'); break; case 4: fourcc = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); break; case 5: fourcc = GST_MAKE_FOURCC ('D', 'X', '5', '0'); break; } } else if (!strcmp (mimetype, "video/x-msmpeg")) { gint msmpegversion; gst_structure_get_int (structure, "msmpegversion", &msmpegversion); switch (msmpegversion) { case 41: fourcc = GST_MAKE_FOURCC ('M', 'P', 'G', '4'); break; case 42: fourcc = GST_MAKE_FOURCC ('M', 'P', '4', '2'); break; case 43: goto msmpeg43; break; } } else if (!strcmp (mimetype, "video/x-wmv")) { gint wmvversion; guint32 format; if (gst_structure_get_fourcc (structure, "format", &format)) { fourcc = format; } else if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) { if (wmvversion == 2) { fourcc = GST_MAKE_FOURCC ('W', 'M', 'V', '2'); } else if (wmvversion == 1) { fourcc = GST_MAKE_FOURCC ('W', 'M', 'V', '1'); } else if (wmvversion == 3) { fourcc = GST_MAKE_FOURCC ('W', 'M', 'V', '3'); } } } else if (!strcmp (mimetype, "image/jpeg")) { fourcc = GST_MAKE_FOURCC ('M', 'J', 'P', 'G'); } if (!fourcc) goto refuse_caps; bih = g_new0 (gst_riff_strf_vids, 1); GST_WRITE_UINT32_LE (&bih->size, size); GST_WRITE_UINT32_LE (&bih->width, videocontext->pixel_width); GST_WRITE_UINT32_LE (&bih->height, videocontext->pixel_height); GST_WRITE_UINT32_LE (&bih->compression, fourcc); GST_WRITE_UINT16_LE (&bih->planes, (guint16) 1); GST_WRITE_UINT16_LE (&bih->bit_cnt, (guint16) 24); GST_WRITE_UINT32_LE (&bih->image_size, videocontext->pixel_width * videocontext->pixel_height * 3); /* process codec private/initialization data, if any */ if (codec_buf) { size += GST_BUFFER_SIZE (codec_buf); bih = g_realloc (bih, size); GST_WRITE_UINT32_LE (&bih->size, size); memcpy ((guint8 *) bih + sizeof (gst_riff_strf_vids), GST_BUFFER_DATA (codec_buf), GST_BUFFER_SIZE (codec_buf)); } context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC); context->codec_priv = (gpointer) bih; context->codec_priv_size = size; } else if (!strcmp (mimetype, "video/x-h264")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC); if (context->codec_priv != NULL) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; } /* Create avcC header */ if (codec_buf != NULL) { context->codec_priv_size = GST_BUFFER_SIZE (codec_buf); context->codec_priv = g_malloc0 (context->codec_priv_size); memcpy (context->codec_priv, GST_BUFFER_DATA (codec_buf), context->codec_priv_size); } } else if (!strcmp (mimetype, "video/x-theora")) { const GValue *streamheader; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_THEORA); if (context->codec_priv != NULL) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; } streamheader = gst_structure_get_value (structure, "streamheader"); if (!theora_streamheader_to_codecdata (streamheader, context)) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("theora stream headers missing or malformed")); goto refuse_caps; } } else if (!strcmp (mimetype, "video/x-dirac")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_DIRAC); } else if (!strcmp (mimetype, "video/x-vp8")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_VP8); } else if (!strcmp (mimetype, "video/mpeg")) { gint mpegversion; gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 1: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG1); break; case 2: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG2); break; case 4: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); break; default: goto refuse_caps; } /* global headers may be in codec data */ if (codec_buf != NULL) { context->codec_priv_size = GST_BUFFER_SIZE (codec_buf); context->codec_priv = g_malloc0 (context->codec_priv_size); memcpy (context->codec_priv, GST_BUFFER_DATA (codec_buf), context->codec_priv_size); } } else if (!strcmp (mimetype, "video/x-msmpeg")) { msmpeg43: /* can only make it here if preceding case verified it was version 3 */ context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3); } else if (!strcmp (mimetype, "video/x-pn-realvideo")) { gint rmversion; const GValue *mdpr_data; gst_structure_get_int (structure, "rmversion", &rmversion); switch (rmversion) { case 1: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1); break; case 2: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2); break; case 3: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3); break; case 4: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4); break; default: goto refuse_caps; } mdpr_data = gst_structure_get_value (structure, "mdpr_data"); if (mdpr_data != NULL) { guint8 *priv_data = NULL; guint priv_data_size = 0; GstBuffer *codec_data_buf = g_value_peek_pointer (mdpr_data); priv_data_size = GST_BUFFER_SIZE (codec_data_buf); priv_data = g_malloc0 (priv_data_size); memcpy (priv_data, GST_BUFFER_DATA (codec_data_buf), priv_data_size); context->codec_priv = priv_data; context->codec_priv_size = priv_data_size; } } return TRUE; /* ERRORS */ refuse_caps: { GST_WARNING_OBJECT (mux, "pad %s refused caps %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); return FALSE; } } /* N > 0 to expect a particular number of headers, negative if the number of headers is variable */ static gboolean xiphN_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context, GstBuffer ** p_buf0, int N) { GstBuffer **buf = NULL; GArray *bufarr; guint8 *priv_data; guint bufi, i, offset, priv_data_size; if (streamheader == NULL) goto no_stream_headers; if (G_VALUE_TYPE (streamheader) != GST_TYPE_ARRAY) goto wrong_type; bufarr = g_value_peek_pointer (streamheader); if (bufarr->len <= 0 || bufarr->len > 255) /* at least one header, and count stored in a byte */ goto wrong_count; if (N > 0 && bufarr->len != N) goto wrong_count; context->xiph_headers_to_skip = bufarr->len; buf = (GstBuffer **) g_malloc0 (sizeof (GstBuffer *) * bufarr->len); for (i = 0; i < bufarr->len; i++) { GValue *bufval = &g_array_index (bufarr, GValue, i); if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { g_free (buf); goto wrong_content_type; } buf[i] = g_value_peek_pointer (bufval); } priv_data_size = 1; if (bufarr->len > 0) { for (i = 0; i < bufarr->len - 1; i++) { priv_data_size += GST_BUFFER_SIZE (buf[i]) / 0xff + 1; } } for (i = 0; i < bufarr->len; ++i) { priv_data_size += GST_BUFFER_SIZE (buf[i]); } priv_data = g_malloc0 (priv_data_size); priv_data[0] = bufarr->len - 1; offset = 1; if (bufarr->len > 0) { for (bufi = 0; bufi < bufarr->len - 1; bufi++) { for (i = 0; i < GST_BUFFER_SIZE (buf[bufi]) / 0xff; ++i) { priv_data[offset++] = 0xff; } priv_data[offset++] = GST_BUFFER_SIZE (buf[bufi]) % 0xff; } } for (i = 0; i < bufarr->len; ++i) { memcpy (priv_data + offset, GST_BUFFER_DATA (buf[i]), GST_BUFFER_SIZE (buf[i])); offset += GST_BUFFER_SIZE (buf[i]); } context->codec_priv = priv_data; context->codec_priv_size = priv_data_size; if (p_buf0) *p_buf0 = gst_buffer_ref (buf[0]); g_free (buf); return TRUE; /* ERRORS */ no_stream_headers: { GST_WARNING ("required streamheaders missing in sink caps!"); return FALSE; } wrong_type: { GST_WARNING ("streamheaders are not a GST_TYPE_ARRAY, but a %s", G_VALUE_TYPE_NAME (streamheader)); return FALSE; } wrong_count: { GST_WARNING ("got %u streamheaders, not %d as expected", bufarr->len, N); return FALSE; } wrong_content_type: { GST_WARNING ("streamheaders array does not contain GstBuffers"); return FALSE; } } static gboolean vorbis_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context) { GstBuffer *buf0 = NULL; if (!xiphN_streamheader_to_codecdata (streamheader, context, &buf0, 3)) return FALSE; if (buf0 == NULL || GST_BUFFER_SIZE (buf0) < 1 + 6 + 4) { GST_WARNING ("First vorbis header too small, ignoring"); } else { if (memcmp (GST_BUFFER_DATA (buf0) + 1, "vorbis", 6) == 0) { GstMatroskaTrackAudioContext *audiocontext; guint8 *hdr; hdr = GST_BUFFER_DATA (buf0) + 1 + 6 + 4; audiocontext = (GstMatroskaTrackAudioContext *) context; audiocontext->channels = GST_READ_UINT8 (hdr); audiocontext->samplerate = GST_READ_UINT32_LE (hdr + 1); } } if (buf0) gst_buffer_unref (buf0); return TRUE; } static gboolean theora_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context) { GstBuffer *buf0 = NULL; if (!xiphN_streamheader_to_codecdata (streamheader, context, &buf0, 3)) return FALSE; if (buf0 == NULL || GST_BUFFER_SIZE (buf0) < 1 + 6 + 26) { GST_WARNING ("First theora header too small, ignoring"); } else if (memcmp (GST_BUFFER_DATA (buf0), "\200theora\003\002", 9) != 0) { GST_WARNING ("First header not a theora identification header, ignoring"); } else { GstMatroskaTrackVideoContext *videocontext; guint fps_num, fps_denom, par_num, par_denom; guint8 *hdr; hdr = GST_BUFFER_DATA (buf0) + 1 + 6 + 3 + 2 + 2; videocontext = (GstMatroskaTrackVideoContext *) context; videocontext->pixel_width = GST_READ_UINT32_BE (hdr) >> 8; videocontext->pixel_height = GST_READ_UINT32_BE (hdr + 3) >> 8; hdr += 3 + 3 + 1 + 1; fps_num = GST_READ_UINT32_BE (hdr); fps_denom = GST_READ_UINT32_BE (hdr + 4); context->default_duration = gst_util_uint64_scale_int (GST_SECOND, fps_denom, fps_num); hdr += 4 + 4; par_num = GST_READ_UINT32_BE (hdr) >> 8; par_denom = GST_READ_UINT32_BE (hdr + 3) >> 8; if (par_num > 0 && par_num > 0) { if (par_num > par_denom) { videocontext->display_width = videocontext->pixel_width * par_num / par_denom; videocontext->display_height = videocontext->pixel_height; } else if (par_num < par_denom) { videocontext->display_width = videocontext->pixel_width; videocontext->display_height = videocontext->pixel_height * par_denom / par_num; } else { videocontext->display_width = 0; videocontext->display_height = 0; } } else { videocontext->display_width = 0; videocontext->display_height = 0; } hdr += 3 + 3; } if (buf0) gst_buffer_unref (buf0); return TRUE; } static gboolean kate_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context) { GstBuffer *buf0 = NULL; if (!xiphN_streamheader_to_codecdata (streamheader, context, &buf0, -1)) return FALSE; if (buf0 == NULL || GST_BUFFER_SIZE (buf0) < 64) { /* Kate ID header is 64 bytes */ GST_WARNING ("First kate header too small, ignoring"); } else if (memcmp (GST_BUFFER_DATA (buf0), "\200kate\0\0\0", 8) != 0) { GST_WARNING ("First header not a kate identification header, ignoring"); } if (buf0) gst_buffer_unref (buf0); return TRUE; } static gboolean flac_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context) { GArray *bufarr; gint i; GValue *bufval; GstBuffer *buffer; if (streamheader == NULL || G_VALUE_TYPE (streamheader) != GST_TYPE_ARRAY) { GST_WARNING ("No or invalid streamheader field in the caps"); return FALSE; } bufarr = g_value_peek_pointer (streamheader); if (bufarr->len < 2) { GST_WARNING ("Too few headers in streamheader field"); return FALSE; } context->xiph_headers_to_skip = bufarr->len + 1; bufval = &g_array_index (bufarr, GValue, 0); if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { GST_WARNING ("streamheaders array does not contain GstBuffers"); return FALSE; } buffer = g_value_peek_pointer (bufval); /* Need at least OggFLAC mapping header, fLaC marker and STREAMINFO block */ if (GST_BUFFER_SIZE (buffer) < 9 + 4 + 4 + 34 || memcmp (GST_BUFFER_DATA (buffer) + 1, "FLAC", 4) != 0 || memcmp (GST_BUFFER_DATA (buffer) + 9, "fLaC", 4) != 0) { GST_WARNING ("Invalid streamheader for FLAC"); return FALSE; } context->codec_priv = g_malloc (GST_BUFFER_SIZE (buffer) - 9); context->codec_priv_size = GST_BUFFER_SIZE (buffer) - 9; memcpy (context->codec_priv, GST_BUFFER_DATA (buffer) + 9, GST_BUFFER_SIZE (buffer) - 9); for (i = 1; i < bufarr->len; i++) { bufval = &g_array_index (bufarr, GValue, i); if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; GST_WARNING ("streamheaders array does not contain GstBuffers"); return FALSE; } buffer = g_value_peek_pointer (bufval); context->codec_priv = g_realloc (context->codec_priv, context->codec_priv_size + GST_BUFFER_SIZE (buffer)); memcpy ((guint8 *) context->codec_priv + context->codec_priv_size, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); context->codec_priv_size = context->codec_priv_size + GST_BUFFER_SIZE (buffer); } return TRUE; } static gboolean speex_streamheader_to_codecdata (const GValue * streamheader, GstMatroskaTrackContext * context) { GArray *bufarr; GValue *bufval; GstBuffer *buffer; if (streamheader == NULL || G_VALUE_TYPE (streamheader) != GST_TYPE_ARRAY) { GST_WARNING ("No or invalid streamheader field in the caps"); return FALSE; } bufarr = g_value_peek_pointer (streamheader); if (bufarr->len != 2) { GST_WARNING ("Too few headers in streamheader field"); return FALSE; } context->xiph_headers_to_skip = bufarr->len + 1; bufval = &g_array_index (bufarr, GValue, 0); if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { GST_WARNING ("streamheaders array does not contain GstBuffers"); return FALSE; } buffer = g_value_peek_pointer (bufval); if (GST_BUFFER_SIZE (buffer) < 80 || memcmp (GST_BUFFER_DATA (buffer), "Speex ", 8) != 0) { GST_WARNING ("Invalid streamheader for Speex"); return FALSE; } context->codec_priv = g_malloc (GST_BUFFER_SIZE (buffer)); context->codec_priv_size = GST_BUFFER_SIZE (buffer); memcpy (context->codec_priv, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); bufval = &g_array_index (bufarr, GValue, 1); if (G_VALUE_TYPE (bufval) != GST_TYPE_BUFFER) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; GST_WARNING ("streamheaders array does not contain GstBuffers"); return FALSE; } buffer = g_value_peek_pointer (bufval); context->codec_priv = g_realloc (context->codec_priv, context->codec_priv_size + GST_BUFFER_SIZE (buffer)); memcpy ((guint8 *) context->codec_priv + context->codec_priv_size, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); context->codec_priv_size = context->codec_priv_size + GST_BUFFER_SIZE (buffer); return TRUE; } static const gchar * aac_codec_data_to_codec_id (const GstBuffer * buf) { const gchar *result; gint profile; /* default to MAIN */ profile = 1; if (GST_BUFFER_SIZE (buf) >= 2) { profile = GST_READ_UINT8 (GST_BUFFER_DATA (buf)); profile >>= 3; } switch (profile) { case 1: result = "MAIN"; break; case 2: result = "LC"; break; case 3: result = "SSR"; break; case 4: result = "LTP"; break; default: GST_WARNING ("unknown AAC profile, defaulting to MAIN"); result = "MAIN"; break; } return result; } /** * gst_matroska_mux_audio_pad_setcaps: * @pad: Pad which got the caps. * @caps: New caps. * * Setcaps function for audio sink pad. * * Returns: #TRUE on success. */ static gboolean gst_matroska_mux_audio_pad_setcaps (GstPad * pad, GstCaps * caps) { GstMatroskaTrackContext *context = NULL; GstMatroskaTrackAudioContext *audiocontext; GstMatroskaMux *mux; GstMatroskaPad *collect_pad; const gchar *mimetype; gint samplerate = 0, channels = 0; GstStructure *structure; const GValue *codec_data = NULL; const GstBuffer *buf = NULL; const gchar *stream_format = NULL; mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); /* find context */ collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); g_assert (collect_pad); context = collect_pad->track; g_assert (context); g_assert (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO); audiocontext = (GstMatroskaTrackAudioContext *) context; structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); /* general setup */ gst_structure_get_int (structure, "rate", &samplerate); gst_structure_get_int (structure, "channels", &channels); audiocontext->samplerate = samplerate; audiocontext->channels = channels; audiocontext->bitdepth = 0; context->default_duration = 0; codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) buf = gst_value_get_buffer (codec_data); /* TODO: - check if we handle all codecs by the spec, i.e. codec private * data and other settings * - add new formats */ if (!strcmp (mimetype, "audio/mpeg")) { gint mpegversion = 0; gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 1:{ gint layer; gint version = 1; gint spf; gst_structure_get_int (structure, "layer", &layer); if (!gst_structure_get_int (structure, "mpegaudioversion", &version)) { GST_WARNING_OBJECT (mux, "Unable to determine MPEG audio version, assuming 1"); version = 1; } if (layer == 1) spf = 384; else if (layer == 2) spf = 1152; else if (version == 2) spf = 576; else spf = 1152; context->default_duration = gst_util_uint64_scale (GST_SECOND, spf, audiocontext->samplerate); switch (layer) { case 1: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); break; case 2: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); break; case 3: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); break; default: goto refuse_caps; } break; } case 2: case 4: stream_format = gst_structure_get_string (structure, "stream-format"); /* check this is raw aac */ if (stream_format) { if (strcmp (stream_format, "raw") != 0) { GST_WARNING_OBJECT (mux, "AAC stream-format must be 'raw', not %s", stream_format); } } else { GST_WARNING_OBJECT (mux, "AAC stream-format not specified, " "assuming 'raw'"); } if (buf) { if (mpegversion == 2) context->codec_id = g_strdup_printf (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2 "%s", aac_codec_data_to_codec_id (buf)); else if (mpegversion == 4) context->codec_id = g_strdup_printf (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4 "%s", aac_codec_data_to_codec_id (buf)); else g_assert_not_reached (); } else { GST_DEBUG_OBJECT (mux, "no AAC codec_data; not packetized"); goto refuse_caps; } break; default: goto refuse_caps; } } else if (!strcmp (mimetype, "audio/x-raw-int")) { gint width, depth; gint endianness = G_LITTLE_ENDIAN; gboolean signedness = TRUE; if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "depth", &depth) || !gst_structure_get_boolean (structure, "signed", &signedness)) { GST_DEBUG_OBJECT (mux, "broken caps, width/depth/signed field missing"); goto refuse_caps; } if (depth > 8 && !gst_structure_get_int (structure, "endianness", &endianness)) { GST_DEBUG_OBJECT (mux, "broken caps, no endianness specified"); goto refuse_caps; } if (width != depth) { GST_DEBUG_OBJECT (mux, "width must be same as depth!"); goto refuse_caps; } /* FIXME: where is this spec'ed out? (tpm) */ if ((width == 8 && signedness) || (width >= 16 && !signedness)) { GST_DEBUG_OBJECT (mux, "8-bit PCM must be unsigned, 16-bit PCM signed"); goto refuse_caps; } audiocontext->bitdepth = depth; if (endianness == G_BIG_ENDIAN) context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE); else context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE); } else if (!strcmp (mimetype, "audio/x-raw-float")) { gint width; if (!gst_structure_get_int (structure, "width", &width)) { GST_DEBUG_OBJECT (mux, "broken caps, width field missing"); goto refuse_caps; } audiocontext->bitdepth = width; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT); } else if (!strcmp (mimetype, "audio/x-vorbis")) { const GValue *streamheader; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_VORBIS); if (context->codec_priv != NULL) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; } streamheader = gst_structure_get_value (structure, "streamheader"); if (!vorbis_streamheader_to_codecdata (streamheader, context)) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("vorbis stream headers missing or malformed")); goto refuse_caps; } } else if (!strcmp (mimetype, "audio/x-flac")) { const GValue *streamheader; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_FLAC); if (context->codec_priv != NULL) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; } streamheader = gst_structure_get_value (structure, "streamheader"); if (!flac_streamheader_to_codecdata (streamheader, context)) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("flac stream headers missing or malformed")); goto refuse_caps; } } else if (!strcmp (mimetype, "audio/x-speex")) { const GValue *streamheader; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_SPEEX); if (context->codec_priv != NULL) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; } streamheader = gst_structure_get_value (structure, "streamheader"); if (!speex_streamheader_to_codecdata (streamheader, context)) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("speex stream headers missing or malformed")); goto refuse_caps; } } else if (!strcmp (mimetype, "audio/x-ac3")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_AC3); } else if (!strcmp (mimetype, "audio/x-eac3")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_EAC3); } else if (!strcmp (mimetype, "audio/x-dts")) { context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_DTS); } else if (!strcmp (mimetype, "audio/x-tta")) { gint width; /* TTA frame duration */ context->default_duration = 1.04489795918367346939 * GST_SECOND; gst_structure_get_int (structure, "width", &width); audiocontext->bitdepth = width; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_TTA); } else if (!strcmp (mimetype, "audio/x-pn-realaudio")) { gint raversion; const GValue *mdpr_data; gst_structure_get_int (structure, "raversion", &raversion); switch (raversion) { case 1: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4); break; case 2: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_REAL_28_8); break; case 8: context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK); break; default: goto refuse_caps; } mdpr_data = gst_structure_get_value (structure, "mdpr_data"); if (mdpr_data != NULL) { guint8 *priv_data = NULL; guint priv_data_size = 0; GstBuffer *codec_data_buf = g_value_peek_pointer (mdpr_data); priv_data_size = GST_BUFFER_SIZE (codec_data_buf); priv_data = g_malloc0 (priv_data_size); memcpy (priv_data, GST_BUFFER_DATA (codec_data_buf), priv_data_size); context->codec_priv = priv_data; context->codec_priv_size = priv_data_size; } } else if (!strcmp (mimetype, "audio/x-wma") || !strcmp (mimetype, "audio/x-alaw") || !strcmp (mimetype, "audio/x-mulaw")) { guint8 *codec_priv; guint codec_priv_size; guint16 format = 0; gint block_align; gint bitrate; if (samplerate == 0 || channels == 0) { GST_WARNING_OBJECT (mux, "Missing channels/samplerate on caps"); goto refuse_caps; } if (!strcmp (mimetype, "audio/x-wma")) { gint wmaversion; gint depth; if (!gst_structure_get_int (structure, "wmaversion", &wmaversion) || !gst_structure_get_int (structure, "block_align", &block_align) || !gst_structure_get_int (structure, "bitrate", &bitrate)) { GST_WARNING_OBJECT (mux, "Missing wmaversion/block_align/bitrate" " on WMA caps"); goto refuse_caps; } switch (wmaversion) { case 1: format = GST_RIFF_WAVE_FORMAT_WMAV1; break; case 2: format = GST_RIFF_WAVE_FORMAT_WMAV2; break; case 3: format = GST_RIFF_WAVE_FORMAT_WMAV3; break; default: GST_WARNING_OBJECT (mux, "Unexpected WMA version: %d", wmaversion); goto refuse_caps; } if (gst_structure_get_int (structure, "depth", &depth)) audiocontext->bitdepth = depth; } else if (!strcmp (mimetype, "audio/x-alaw") || !strcmp (mimetype, "audio/x-mulaw")) { audiocontext->bitdepth = 8; if (!strcmp (mimetype, "audio/x-alaw")) format = GST_RIFF_WAVE_FORMAT_ALAW; else format = GST_RIFF_WAVE_FORMAT_MULAW; block_align = channels; bitrate = block_align * samplerate; } g_assert (format != 0); codec_priv_size = WAVEFORMATEX_SIZE; if (buf) codec_priv_size += GST_BUFFER_SIZE (buf); /* serialize waveformatex structure */ codec_priv = g_malloc0 (codec_priv_size); GST_WRITE_UINT16_LE (codec_priv, format); GST_WRITE_UINT16_LE (codec_priv + 2, channels); GST_WRITE_UINT32_LE (codec_priv + 4, samplerate); GST_WRITE_UINT32_LE (codec_priv + 8, bitrate / 8); GST_WRITE_UINT16_LE (codec_priv + 12, block_align); GST_WRITE_UINT16_LE (codec_priv + 14, 0); if (buf) GST_WRITE_UINT16_LE (codec_priv + 16, GST_BUFFER_SIZE (buf)); else GST_WRITE_UINT16_LE (codec_priv + 16, 0); /* process codec private/initialization data, if any */ if (buf) { memcpy ((guint8 *) codec_priv + WAVEFORMATEX_SIZE, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_ACM); context->codec_priv = (gpointer) codec_priv; context->codec_priv_size = codec_priv_size; } return TRUE; /* ERRORS */ refuse_caps: { GST_WARNING_OBJECT (mux, "pad %s refused caps %" GST_PTR_FORMAT, GST_PAD_NAME (pad), caps); return FALSE; } } /** * gst_matroska_mux_subtitle_pad_setcaps: * @pad: Pad which got the caps. * @caps: New caps. * * Setcaps function for subtitle sink pad. * * Returns: #TRUE on success. */ static gboolean gst_matroska_mux_subtitle_pad_setcaps (GstPad * pad, GstCaps * caps) { /* FIXME: * Consider this as boilerplate code for now. There is * no single subtitle creation element in GStreamer, * neither do I know how subtitling works at all. */ /* There is now (at least) one such alement (kateenc), and I'm going to handle it here and claim it works when it can be piped back through GStreamer and VLC */ GstMatroskaTrackContext *context = NULL; GstMatroskaTrackSubtitleContext *scontext; GstMatroskaMux *mux; GstMatroskaPad *collect_pad; const gchar *mimetype; GstStructure *structure; mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); /* find context */ collect_pad = (GstMatroskaPad *) gst_pad_get_element_private (pad); g_assert (collect_pad); context = collect_pad->track; g_assert (context); g_assert (context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE); scontext = (GstMatroskaTrackSubtitleContext *) context; structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); /* general setup */ scontext->check_utf8 = 1; scontext->invalid_utf8 = 0; context->default_duration = 0; /* TODO: - other format than Kate */ if (!strcmp (mimetype, "subtitle/x-kate")) { const GValue *streamheader; context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_SUBTITLE_KATE); if (context->codec_priv != NULL) { g_free (context->codec_priv); context->codec_priv = NULL; context->codec_priv_size = 0; } streamheader = gst_structure_get_value (structure, "streamheader"); if (!kate_streamheader_to_codecdata (streamheader, context)) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("kate stream headers missing or malformed")); return FALSE; } return TRUE; } return FALSE; } /** * gst_matroska_mux_request_new_pad: * @element: #GstMatroskaMux. * @templ: #GstPadTemplate. * @pad_name: New pad name. * * Request pad function for sink templates. * * Returns: New #GstPad. */ static GstPad * gst_matroska_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); GstMatroskaMux *mux = GST_MATROSKA_MUX (element); GstMatroskaPad *collect_pad; GstMatroskamuxPad *newpad; gchar *name = NULL; const gchar *pad_name = NULL; GstPadSetCapsFunction setcapsfunc = NULL; GstMatroskaTrackContext *context = NULL; gint pad_id; if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { /* don't mix named and unnamed pads, if the pad already exists we fail when * trying to add it */ if (req_name != NULL && sscanf (req_name, "audio_%d", &pad_id) == 1) { pad_name = req_name; } else { name = g_strdup_printf ("audio_%d", mux->num_a_streams++); pad_name = name; } setcapsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_audio_pad_setcaps); context = (GstMatroskaTrackContext *) g_new0 (GstMatroskaTrackAudioContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_AUDIO; context->name = g_strdup ("Audio"); } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { /* don't mix named and unnamed pads, if the pad already exists we fail when * trying to add it */ if (req_name != NULL && sscanf (req_name, "video_%d", &pad_id) == 1) { pad_name = req_name; } else { name = g_strdup_printf ("video_%d", mux->num_v_streams++); pad_name = name; } setcapsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_video_pad_setcaps); context = (GstMatroskaTrackContext *) g_new0 (GstMatroskaTrackVideoContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_VIDEO; context->name = g_strdup ("Video"); } else if (templ == gst_element_class_get_pad_template (klass, "subtitle_%d")) { /* don't mix named and unnamed pads, if the pad already exists we fail when * trying to add it */ if (req_name != NULL && sscanf (req_name, "subtitle_%d", &pad_id) == 1) { pad_name = req_name; } else { name = g_strdup_printf ("subtitle_%d", mux->num_t_streams++); pad_name = name; } setcapsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_subtitle_pad_setcaps); context = (GstMatroskaTrackContext *) g_new0 (GstMatroskaTrackSubtitleContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE; context->name = g_strdup ("Subtitle"); } else { GST_WARNING_OBJECT (mux, "This is not our template!"); return NULL; } newpad = g_object_new (GST_TYPE_MATROSKAMUX_PAD, "name", pad_name, "direction", templ->direction, "template", templ, NULL); g_free (name); gst_matroskamux_pad_init (newpad); collect_pad = (GstMatroskaPad *) gst_collect_pads_add_pad_full (mux->collect, GST_PAD (newpad), sizeof (GstMatroskamuxPad), (GstCollectDataDestroyNotify) gst_matroska_pad_free); collect_pad->track = context; gst_matroska_pad_reset (collect_pad, FALSE); /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events. * TODO GstCollectPads should really give its 'users' a clean chance to * properly handle events that are not meant for collectpads itself. * Perhaps a callback or so, though rejected (?) in #340060. * This would allow (clean) transcoding of info from demuxer/streams * to another muxer */ mux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad); gst_pad_set_event_function (GST_PAD (newpad), GST_DEBUG_FUNCPTR (gst_matroska_mux_handle_sink_event)); gst_pad_set_setcaps_function (GST_PAD (newpad), setcapsfunc); gst_pad_set_active (GST_PAD (newpad), TRUE); if (!gst_element_add_pad (element, GST_PAD (newpad))) goto pad_add_failed; mux->num_streams++; GST_DEBUG_OBJECT (newpad, "Added new request pad"); return GST_PAD (newpad); /* ERROR cases */ pad_add_failed: { GST_WARNING_OBJECT (mux, "Adding the new pad '%s' failed", pad_name); gst_object_unref (newpad); return NULL; } } /** * gst_matroska_mux_release_pad: * @element: #GstMatroskaMux. * @pad: Pad to release. * * Release a previously requested pad. */ static void gst_matroska_mux_release_pad (GstElement * element, GstPad * pad) { GstMatroskaMux *mux; GSList *walk; mux = GST_MATROSKA_MUX (GST_PAD_PARENT (pad)); for (walk = mux->collect->data; walk; walk = g_slist_next (walk)) { GstCollectData *cdata = (GstCollectData *) walk->data; GstMatroskaPad *collect_pad = (GstMatroskaPad *) cdata; if (cdata->pad == pad) { GstClockTime min_dur; /* observed minimum duration */ if (GST_CLOCK_TIME_IS_VALID (collect_pad->start_ts) && GST_CLOCK_TIME_IS_VALID (collect_pad->end_ts)) { min_dur = GST_CLOCK_DIFF (collect_pad->start_ts, collect_pad->end_ts); if (collect_pad->duration < min_dur) collect_pad->duration = min_dur; } if (GST_CLOCK_TIME_IS_VALID (collect_pad->duration) && mux->duration < collect_pad->duration) mux->duration = collect_pad->duration; break; } } gst_collect_pads_remove_pad (mux->collect, pad); if (gst_element_remove_pad (element, pad)) mux->num_streams--; } /** * gst_matroska_mux_track_header: * @mux: #GstMatroskaMux * @context: Tack context. * * Write a track header. */ static void gst_matroska_mux_track_header (GstMatroskaMux * mux, GstMatroskaTrackContext * context) { GstEbmlWrite *ebml = mux->ebml_write; guint64 master; /* TODO: check if everything necessary is written and check default values */ /* track type goes before the type-specific stuff */ gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKNUMBER, context->num); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKTYPE, context->type); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKUID, gst_matroska_mux_create_uid ()); if (context->default_duration) { gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKDEFAULTDURATION, context->default_duration); } if (context->language) { gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKLANGUAGE, context->language); } /* type-specific stuff */ switch (context->type) { case GST_MATROSKA_TRACK_TYPE_VIDEO:{ GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) context; master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKVIDEO); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELWIDTH, videocontext->pixel_width); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELHEIGHT, videocontext->pixel_height); if (videocontext->display_width && videocontext->display_height) { gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYWIDTH, videocontext->display_width); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT, videocontext->display_height); } if (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1); if (videocontext->fourcc) { guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc); gst_ebml_write_binary (ebml, GST_MATROSKA_ID_VIDEOCOLOURSPACE, (gpointer) & fcc_le, 4); } gst_ebml_write_master_finish (ebml, master); break; } case GST_MATROSKA_TRACK_TYPE_AUDIO:{ GstMatroskaTrackAudioContext *audiocontext = (GstMatroskaTrackAudioContext *) context; master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKAUDIO); if (audiocontext->samplerate != 8000) gst_ebml_write_float (ebml, GST_MATROSKA_ID_AUDIOSAMPLINGFREQ, audiocontext->samplerate); if (audiocontext->channels != 1) gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOCHANNELS, audiocontext->channels); if (audiocontext->bitdepth) { gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOBITDEPTH, audiocontext->bitdepth); } gst_ebml_write_master_finish (ebml, master); break; } default: /* doesn't need type-specific data */ break; } gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_CODECID, context->codec_id); if (context->codec_priv) gst_ebml_write_binary (ebml, GST_MATROSKA_ID_CODECPRIVATE, context->codec_priv, context->codec_priv_size); /* FIXME: until we have a nice way of getting the codecname * out of the caps, I'm not going to enable this. Too much * (useless, double, boring) work... */ /* TODO: Use value from tags if any */ /*gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_CODECNAME, context->codec_name); */ gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKNAME, context->name); } /** * gst_matroska_mux_start: * @mux: #GstMatroskaMux * * Start a new matroska file (write headers etc...) */ static void gst_matroska_mux_start (GstMatroskaMux * mux) { GstEbmlWrite *ebml = mux->ebml_write; const gchar *doctype; guint32 seekhead_id[] = { GST_MATROSKA_ID_SEGMENTINFO, GST_MATROSKA_ID_TRACKS, GST_MATROSKA_ID_CUES, GST_MATROSKA_ID_TAGS, 0 }; guint64 master, child; GSList *collected; int i; guint tracknum = 1; GstClockTime duration = 0; guint32 segment_uid[4]; GTimeVal time = { 0, 0 }; if (!strcmp (mux->doctype, GST_MATROSKA_DOCTYPE_WEBM)) { ebml->caps = gst_caps_new_simple ("video/webm", NULL); } else { ebml->caps = gst_caps_new_simple ("video/x-matroska", NULL); } /* we start with a EBML header */ doctype = mux->doctype; GST_INFO_OBJECT (ebml, "DocType: %s, Version: %d", doctype, mux->doctype_version); gst_ebml_write_header (ebml, doctype, mux->doctype_version); /* the rest of the header is cached */ gst_ebml_write_set_cache (ebml, 0x1000); /* start a segment */ mux->segment_pos = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENT); mux->segment_master = ebml->pos; if (!mux->streamable) { /* seekhead (table of contents) - we set the positions later */ mux->seekhead_pos = ebml->pos; master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEEKHEAD); for (i = 0; seekhead_id[i] != 0; i++) { child = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEEKENTRY); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_SEEKID, seekhead_id[i]); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_SEEKPOSITION, -1); gst_ebml_write_master_finish (ebml, child); } gst_ebml_write_master_finish (ebml, master); } if (mux->streamable) { const GstTagList *tags; /* tags */ tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux)); if (tags != NULL && !gst_tag_list_is_empty (tags)) { guint64 master_tags, master_tag; GST_DEBUG ("Writing tags"); /* TODO: maybe limit via the TARGETS id by looking at the source pad */ mux->tags_pos = ebml->pos; master_tags = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAGS); master_tag = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAG); gst_tag_list_foreach (tags, gst_matroska_mux_write_simple_tag, ebml); gst_ebml_write_master_finish (ebml, master_tag); gst_ebml_write_master_finish (ebml, master_tags); } } /* segment info */ mux->info_pos = ebml->pos; master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENTINFO); for (i = 0; i < 4; i++) { segment_uid[i] = g_random_int (); } gst_ebml_write_binary (ebml, GST_MATROSKA_ID_SEGMENTUID, (guint8 *) segment_uid, 16); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TIMECODESCALE, mux->time_scale); mux->duration_pos = ebml->pos; /* get duration */ if (!mux->streamable) { for (collected = mux->collect->data; collected; collected = g_slist_next (collected)) { GstMatroskaPad *collect_pad; GstFormat format = GST_FORMAT_TIME; GstPad *thepad; gint64 trackduration; collect_pad = (GstMatroskaPad *) collected->data; thepad = collect_pad->collect.pad; /* Query the total length of the track. */ GST_DEBUG_OBJECT (thepad, "querying peer duration"); if (gst_pad_query_peer_duration (thepad, &format, &trackduration)) { GST_DEBUG_OBJECT (thepad, "duration: %" GST_TIME_FORMAT, GST_TIME_ARGS (trackduration)); if (trackduration != GST_CLOCK_TIME_NONE && trackduration > duration) { duration = (GstClockTime) trackduration; } } } gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, gst_guint64_to_gdouble (duration) / gst_guint64_to_gdouble (mux->time_scale)); } gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_MUXINGAPP, "GStreamer plugin version " PACKAGE_VERSION); if (mux->writing_app && mux->writing_app[0]) { gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_WRITINGAPP, mux->writing_app); } g_get_current_time (&time); gst_ebml_write_date (ebml, GST_MATROSKA_ID_DATEUTC, time.tv_sec); gst_ebml_write_master_finish (ebml, master); /* tracks */ mux->tracks_pos = ebml->pos; master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKS); for (collected = mux->collect->data; collected; collected = g_slist_next (collected)) { GstMatroskaPad *collect_pad; GstPad *thepad; collect_pad = (GstMatroskaPad *) collected->data; thepad = collect_pad->collect.pad; if (gst_pad_is_linked (thepad) && gst_pad_is_active (thepad) && collect_pad->track->codec_id != 0) { collect_pad->track->num = tracknum++; child = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKENTRY); gst_matroska_mux_track_header (mux, collect_pad->track); gst_ebml_write_master_finish (ebml, child); /* some remaing pad/track setup */ collect_pad->default_duration_scaled = gst_util_uint64_scale (collect_pad->track->default_duration, 1, mux->time_scale); } } gst_ebml_write_master_finish (ebml, master); /* lastly, flush the cache */ gst_ebml_write_flush_cache (ebml, FALSE, 0); } static void gst_matroska_mux_write_simple_tag (const GstTagList * list, const gchar * tag, gpointer data) { /* TODO: more sensible tag mappings */ static const struct { const gchar *matroska_tagname; const gchar *gstreamer_tagname; } tag_conv[] = { { GST_MATROSKA_TAG_ID_TITLE, GST_TAG_TITLE}, { GST_MATROSKA_TAG_ID_ARTIST, GST_TAG_ARTIST}, { GST_MATROSKA_TAG_ID_ALBUM, GST_TAG_ALBUM}, { GST_MATROSKA_TAG_ID_COMMENTS, GST_TAG_COMMENT}, { GST_MATROSKA_TAG_ID_BITSPS, GST_TAG_BITRATE}, { GST_MATROSKA_TAG_ID_BPS, GST_TAG_BITRATE}, { GST_MATROSKA_TAG_ID_ENCODER, GST_TAG_ENCODER}, { GST_MATROSKA_TAG_ID_DATE, GST_TAG_DATE}, { GST_MATROSKA_TAG_ID_ISRC, GST_TAG_ISRC}, { GST_MATROSKA_TAG_ID_COPYRIGHT, GST_TAG_COPYRIGHT}, { GST_MATROSKA_TAG_ID_BPM, GST_TAG_BEATS_PER_MINUTE}, { GST_MATROSKA_TAG_ID_TERMS_OF_USE, GST_TAG_LICENSE}, { GST_MATROSKA_TAG_ID_COMPOSER, GST_TAG_COMPOSER}, { GST_MATROSKA_TAG_ID_LEAD_PERFORMER, GST_TAG_PERFORMER}, { GST_MATROSKA_TAG_ID_GENRE, GST_TAG_GENRE} }; GstEbmlWrite *ebml = (GstEbmlWrite *) data; guint i; guint64 simpletag_master; for (i = 0; i < G_N_ELEMENTS (tag_conv); i++) { const gchar *tagname_gst = tag_conv[i].gstreamer_tagname; const gchar *tagname_mkv = tag_conv[i].matroska_tagname; if (strcmp (tagname_gst, tag) == 0) { GValue src = { 0, }; gchar *dest; if (!gst_tag_list_copy_value (&src, list, tag)) break; if ((dest = gst_value_serialize (&src))) { simpletag_master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SIMPLETAG); gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_TAGNAME, tagname_mkv); gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TAGSTRING, dest); gst_ebml_write_master_finish (ebml, simpletag_master); g_free (dest); } else { GST_WARNING ("Can't transform tag '%s' to string", tagname_mkv); } g_value_unset (&src); break; } } } /** * gst_matroska_mux_finish: * @mux: #GstMatroskaMux * * Finish a new matroska file (write index etc...) */ static void gst_matroska_mux_finish (GstMatroskaMux * mux) { GstEbmlWrite *ebml = mux->ebml_write; guint64 pos; guint64 duration = 0; GSList *collected; const GstTagList *tags; /* finish last cluster */ if (mux->cluster) { gst_ebml_write_master_finish (ebml, mux->cluster); } /* cues */ if (mux->index != NULL) { guint n; guint64 master, pointentry_master, trackpos_master; mux->cues_pos = ebml->pos; gst_ebml_write_set_cache (ebml, 12 + 41 * mux->num_indexes); master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CUES); for (n = 0; n < mux->num_indexes; n++) { GstMatroskaIndex *idx = &mux->index[n]; pointentry_master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_POINTENTRY); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUETIME, idx->time / mux->time_scale); trackpos_master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CUETRACKPOSITIONS); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUETRACK, idx->track); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUECLUSTERPOSITION, idx->pos - mux->segment_master); gst_ebml_write_master_finish (ebml, trackpos_master); gst_ebml_write_master_finish (ebml, pointentry_master); } gst_ebml_write_master_finish (ebml, master); gst_ebml_write_flush_cache (ebml, FALSE, GST_CLOCK_TIME_NONE); } /* tags */ tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (mux)); if (tags != NULL && !gst_tag_list_is_empty (tags)) { guint64 master_tags, master_tag; GST_DEBUG ("Writing tags"); /* TODO: maybe limit via the TARGETS id by looking at the source pad */ mux->tags_pos = ebml->pos; master_tags = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAGS); master_tag = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TAG); gst_tag_list_foreach (tags, gst_matroska_mux_write_simple_tag, ebml); gst_ebml_write_master_finish (ebml, master_tag); gst_ebml_write_master_finish (ebml, master_tags); } /* update seekhead. We know that: * - a seekhead contains 4 entries. * - order of entries is as above. * - a seekhead has a 4-byte header + 8-byte length * - each entry is 2-byte master, 2-byte ID pointer, * 2-byte length pointer, all 8/1-byte length, 4- * byte ID and 8-byte length pointer, where the * length pointer starts at 20. * - all entries are local to the segment (so pos - segment_master). * - so each entry is at 12 + 20 + num * 28. */ gst_ebml_replace_uint (ebml, mux->seekhead_pos + 32, mux->info_pos - mux->segment_master); gst_ebml_replace_uint (ebml, mux->seekhead_pos + 60, mux->tracks_pos - mux->segment_master); if (mux->index != NULL) { gst_ebml_replace_uint (ebml, mux->seekhead_pos + 88, mux->cues_pos - mux->segment_master); } else { /* void'ify */ guint64 my_pos = ebml->pos; gst_ebml_write_seek (ebml, mux->seekhead_pos + 68); gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 26); gst_ebml_write_seek (ebml, my_pos); } if (tags != NULL) { gst_ebml_replace_uint (ebml, mux->seekhead_pos + 116, mux->tags_pos - mux->segment_master); } else { /* void'ify */ guint64 my_pos = ebml->pos; gst_ebml_write_seek (ebml, mux->seekhead_pos + 96); gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 26); gst_ebml_write_seek (ebml, my_pos); } /* update duration */ /* first get the overall duration */ /* a released track may have left a duration in here */ duration = mux->duration; for (collected = mux->collect->data; collected; collected = g_slist_next (collected)) { GstMatroskaPad *collect_pad; GstClockTime min_duration; /* observed minimum duration */ collect_pad = (GstMatroskaPad *) collected->data; GST_DEBUG_OBJECT (mux, "Pad %" GST_PTR_FORMAT " start ts %" GST_TIME_FORMAT " end ts %" GST_TIME_FORMAT, collect_pad, GST_TIME_ARGS (collect_pad->start_ts), GST_TIME_ARGS (collect_pad->end_ts)); if (GST_CLOCK_TIME_IS_VALID (collect_pad->start_ts) && GST_CLOCK_TIME_IS_VALID (collect_pad->end_ts)) { min_duration = GST_CLOCK_DIFF (collect_pad->start_ts, collect_pad->end_ts); if (collect_pad->duration < min_duration) collect_pad->duration = min_duration; GST_DEBUG_OBJECT (collect_pad, "final track duration: %" GST_TIME_FORMAT, GST_TIME_ARGS (collect_pad->duration)); } if (GST_CLOCK_TIME_IS_VALID (collect_pad->duration) && duration < collect_pad->duration) duration = collect_pad->duration; } if (duration != 0) { GST_DEBUG_OBJECT (mux, "final total duration: %" GST_TIME_FORMAT, GST_TIME_ARGS (duration)); pos = mux->ebml_write->pos; gst_ebml_write_seek (ebml, mux->duration_pos); gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, gst_guint64_to_gdouble (duration) / gst_guint64_to_gdouble (mux->time_scale)); gst_ebml_write_seek (ebml, pos); } else { /* void'ify */ guint64 my_pos = ebml->pos; gst_ebml_write_seek (ebml, mux->duration_pos); gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 8); gst_ebml_write_seek (ebml, my_pos); } GST_DEBUG_OBJECT (mux, "finishing segment"); /* finish segment - this also writes element length */ gst_ebml_write_master_finish (ebml, mux->segment_pos); } /** * gst_matroska_mux_best_pad: * @mux: #GstMatroskaMux * @popped: True if at least one buffer was popped from #GstCollectPads * * Find a pad with the oldest data * (data from this pad should be written first). * * Returns: Selected pad. */ static GstMatroskaPad * gst_matroska_mux_best_pad (GstMatroskaMux * mux, gboolean * popped) { GSList *collected; GstMatroskaPad *best = NULL; *popped = FALSE; for (collected = mux->collect->data; collected; collected = g_slist_next (collected)) { GstMatroskaPad *collect_pad; collect_pad = (GstMatroskaPad *) collected->data; /* fetch a new buffer if needed */ if (collect_pad->buffer == NULL) { collect_pad->buffer = gst_collect_pads_pop (mux->collect, (GstCollectData *) collect_pad); if (collect_pad->buffer != NULL) { GstClockTime time; *popped = TRUE; /* convert to running time */ time = GST_BUFFER_TIMESTAMP (collect_pad->buffer); /* invalid should pass */ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { time = gst_segment_to_running_time (&collect_pad->collect.segment, GST_FORMAT_TIME, time); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { GST_DEBUG_OBJECT (mux, "clipping buffer on pad %s outside segment", GST_PAD_NAME (collect_pad->collect.pad)); gst_buffer_unref (collect_pad->buffer); collect_pad->buffer = NULL; return NULL; } else { GST_LOG_OBJECT (mux, "buffer ts %" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT " running time", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (collect_pad->buffer)), GST_TIME_ARGS (time)); collect_pad->buffer = gst_buffer_make_metadata_writable (collect_pad->buffer); GST_BUFFER_TIMESTAMP (collect_pad->buffer) = time; } } } } /* if we have a buffer check if it is better then the current best one */ if (collect_pad->buffer != NULL) { if (best == NULL || !GST_BUFFER_TIMESTAMP_IS_VALID (collect_pad->buffer) || (GST_BUFFER_TIMESTAMP_IS_VALID (best->buffer) && GST_BUFFER_TIMESTAMP (collect_pad->buffer) < GST_BUFFER_TIMESTAMP (best->buffer))) { best = collect_pad; } } } return best; } /** * gst_matroska_mux_buffer_header: * @track: Track context. * @relative_timestamp: relative timestamp of the buffer * @flags: Buffer flags. * * Create a buffer containing buffer header. * * Returns: New buffer. */ static GstBuffer * gst_matroska_mux_create_buffer_header (GstMatroskaTrackContext * track, gint16 relative_timestamp, int flags) { GstBuffer *hdr; hdr = gst_buffer_new_and_alloc (4); /* track num - FIXME: what if num >= 0x80 (unlikely)? */ GST_BUFFER_DATA (hdr)[0] = track->num | 0x80; /* time relative to clustertime */ GST_WRITE_UINT16_BE (GST_BUFFER_DATA (hdr) + 1, relative_timestamp); /* flags */ GST_BUFFER_DATA (hdr)[3] = flags; return hdr; } #define DIRAC_PARSE_CODE_SEQUENCE_HEADER 0x00 #define DIRAC_PARSE_CODE_END_OF_SEQUENCE 0x10 #define DIRAC_PARSE_CODE_IS_PICTURE(x) ((x & 0x08) != 0) static GstBuffer * gst_matroska_mux_handle_dirac_packet (GstMatroskaMux * mux, GstMatroskaPad * collect_pad, GstBuffer * buf) { GstMatroskaTrackVideoContext *ctx = (GstMatroskaTrackVideoContext *) collect_pad->track; const guint8 *data = GST_BUFFER_DATA (buf); guint size = GST_BUFFER_SIZE (buf); guint8 parse_code; guint32 next_parse_offset; GstBuffer *ret = NULL; gboolean is_muxing_unit = FALSE; if (GST_BUFFER_SIZE (buf) < 13) { gst_buffer_unref (buf); return ret; } /* Check if this buffer contains a picture or end-of-sequence packet */ while (size >= 13) { if (GST_READ_UINT32_BE (data) != 0x42424344 /* 'BBCD' */ ) { gst_buffer_unref (buf); return ret; } parse_code = GST_READ_UINT8 (data + 4); if (parse_code == DIRAC_PARSE_CODE_SEQUENCE_HEADER) { if (ctx->dirac_unit) { gst_buffer_unref (ctx->dirac_unit); ctx->dirac_unit = NULL; } } else if (DIRAC_PARSE_CODE_IS_PICTURE (parse_code) || parse_code == DIRAC_PARSE_CODE_END_OF_SEQUENCE) { is_muxing_unit = TRUE; break; } next_parse_offset = GST_READ_UINT32_BE (data + 5); if (G_UNLIKELY (next_parse_offset == 0 || next_parse_offset > size)) break; data += next_parse_offset; size -= next_parse_offset; } if (ctx->dirac_unit) ctx->dirac_unit = gst_buffer_join (ctx->dirac_unit, gst_buffer_ref (buf)); else ctx->dirac_unit = gst_buffer_ref (buf); if (is_muxing_unit) { ret = gst_buffer_make_metadata_writable (ctx->dirac_unit); ctx->dirac_unit = NULL; gst_buffer_copy_metadata (ret, buf, GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_CAPS); gst_buffer_unref (buf); } else { gst_buffer_unref (buf); ret = NULL; } return ret; } static void gst_matroska_mux_stop_streamheader (GstMatroskaMux * mux) { GstCaps *caps; GstStructure *s; GValue streamheader = { 0 }; GValue bufval = { 0 }; GstBuffer *streamheader_buffer; GstEbmlWrite *ebml = mux->ebml_write; streamheader_buffer = gst_ebml_stop_streamheader (ebml); if (!strcmp (mux->doctype, GST_MATROSKA_DOCTYPE_WEBM)) { caps = gst_caps_new_simple ("video/webm", NULL); } else { caps = gst_caps_new_simple ("video/x-matroska", NULL); } s = gst_caps_get_structure (caps, 0); g_value_init (&streamheader, GST_TYPE_ARRAY); g_value_init (&bufval, GST_TYPE_BUFFER); GST_BUFFER_FLAG_SET (streamheader_buffer, GST_BUFFER_FLAG_IN_CAPS); gst_value_set_buffer (&bufval, streamheader_buffer); gst_value_array_append_value (&streamheader, &bufval); g_value_unset (&bufval); gst_structure_set_value (s, "streamheader", &streamheader); g_value_unset (&streamheader); gst_caps_replace (&ebml->caps, caps); gst_buffer_unref (streamheader_buffer); gst_caps_unref (caps); } /** * gst_matroska_mux_write_data: * @mux: #GstMatroskaMux * @collect_pad: #GstMatroskaPad with the data * * Write collected data (called from gst_matroska_mux_collected). * * Returns: Result of the gst_pad_push issued to write the data. */ static GstFlowReturn gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) { GstEbmlWrite *ebml = mux->ebml_write; GstBuffer *buf, *hdr; guint64 blockgroup; gboolean write_duration; gint16 relative_timestamp; gint64 relative_timestamp64; guint64 block_duration; gboolean is_video_keyframe = FALSE; GstMatroskamuxPad *pad; /* write data */ buf = collect_pad->buffer; collect_pad->buffer = NULL; pad = GST_MATROSKAMUX_PAD_CAST (collect_pad->collect.pad); /* vorbis/theora headers are retrieved from caps and put in CodecPrivate */ if (collect_pad->track->xiph_headers_to_skip > 0) { GST_LOG_OBJECT (collect_pad->collect.pad, "dropping streamheader buffer"); gst_buffer_unref (buf); --collect_pad->track->xiph_headers_to_skip; return GST_FLOW_OK; } /* for dirac we have to queue up everything up to a picture unit */ if (collect_pad->track->codec_id != NULL && strcmp (collect_pad->track->codec_id, GST_MATROSKA_CODEC_ID_VIDEO_DIRAC) == 0) { buf = gst_matroska_mux_handle_dirac_packet (mux, collect_pad, buf); if (!buf) return GST_FLOW_OK; } /* hm, invalid timestamp (due to --to be fixed--- element upstream); * this would wreak havoc with time stored in matroska file */ /* TODO: maybe calculate a timestamp by using the previous timestamp * and default duration */ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { GST_WARNING_OBJECT (collect_pad->collect.pad, "Invalid buffer timestamp; dropping buffer"); gst_buffer_unref (buf); return GST_FLOW_OK; } /* set the timestamp for outgoing buffers */ ebml->timestamp = GST_BUFFER_TIMESTAMP (buf); if (collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_VIDEO && !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) { GST_LOG_OBJECT (mux, "have video keyframe, ts=%" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); is_video_keyframe = TRUE; } if (mux->cluster) { /* start a new cluster at every keyframe, at every GstForceKeyUnit event, * or when we may be reaching the limit of the relative timestamp */ if (mux->cluster_time + mux->max_cluster_duration < GST_BUFFER_TIMESTAMP (buf) || is_video_keyframe || mux->force_key_unit_event) { if (!mux->streamable) gst_ebml_write_master_finish (ebml, mux->cluster); /* Forward the GstForceKeyUnit event after finishing the cluster */ if (mux->force_key_unit_event) { gst_pad_push_event (mux->srcpad, mux->force_key_unit_event); mux->force_key_unit_event = NULL; } mux->prev_cluster_size = ebml->pos - mux->cluster_pos; mux->cluster_pos = ebml->pos; gst_ebml_write_set_cache (ebml, 0x20); mux->cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE, gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (buf), 1, mux->time_scale)); GST_LOG_OBJECT (mux, "cluster timestamp %" G_GUINT64_FORMAT, gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (buf), 1, mux->time_scale)); gst_ebml_write_flush_cache (ebml, TRUE, GST_BUFFER_TIMESTAMP (buf)); mux->cluster_time = GST_BUFFER_TIMESTAMP (buf); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_PREVSIZE, mux->prev_cluster_size); } } else { /* first cluster */ mux->cluster_pos = ebml->pos; gst_ebml_write_set_cache (ebml, 0x20); mux->cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE, gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (buf), 1, mux->time_scale)); gst_ebml_write_flush_cache (ebml, TRUE, GST_BUFFER_TIMESTAMP (buf)); mux->cluster_time = GST_BUFFER_TIMESTAMP (buf); } /* update duration of this track */ if (GST_BUFFER_DURATION_IS_VALID (buf)) collect_pad->duration += GST_BUFFER_DURATION (buf); /* We currently write index entries for all video tracks or for the audio * track in a single-track audio file. This could be improved by keeping the * index only for the *first* video track. */ /* TODO: index is useful for every track, should contain the number of * the block in the cluster which contains the timestamp, should also work * for files with multiple audio tracks. */ if (!mux->streamable && (is_video_keyframe || ((collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_AUDIO) && (mux->num_streams == 1)))) { gint last_idx = -1; if (mux->min_index_interval != 0) { for (last_idx = mux->num_indexes - 1; last_idx >= 0; last_idx--) { if (mux->index[last_idx].track == collect_pad->track->num) break; } } if (last_idx < 0 || mux->min_index_interval == 0 || (GST_CLOCK_DIFF (mux->index[last_idx].time, GST_BUFFER_TIMESTAMP (buf)) >= mux->min_index_interval)) { GstMatroskaIndex *idx; if (mux->num_indexes % 32 == 0) { mux->index = g_renew (GstMatroskaIndex, mux->index, mux->num_indexes + 32); } idx = &mux->index[mux->num_indexes++]; idx->pos = mux->cluster_pos; idx->time = GST_BUFFER_TIMESTAMP (buf); idx->track = collect_pad->track->num; } } /* Check if the duration differs from the default duration. */ write_duration = FALSE; block_duration = 0; if (pad->frame_duration && GST_BUFFER_DURATION_IS_VALID (buf)) { block_duration = gst_util_uint64_scale (GST_BUFFER_DURATION (buf), 1, mux->time_scale); /* small difference should be ok. */ if (block_duration > collect_pad->default_duration_scaled + 1 || block_duration < collect_pad->default_duration_scaled - 1) { write_duration = TRUE; } } /* write the block, for doctype v2 use SimpleBlock if possible * one slice (*breath*). * FIXME: Need to do correct lacing! */ relative_timestamp64 = GST_BUFFER_TIMESTAMP (buf) - mux->cluster_time; if (relative_timestamp64 >= 0) { /* round the timestamp */ relative_timestamp64 += gst_util_uint64_scale (mux->time_scale, 1, 2); } else { /* round the timestamp */ relative_timestamp64 -= gst_util_uint64_scale (mux->time_scale, 1, 2); } relative_timestamp = gst_util_uint64_scale (relative_timestamp64, 1, mux->time_scale); if (mux->doctype_version > 1 && !write_duration) { int flags = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : 0x80; hdr = gst_matroska_mux_create_buffer_header (collect_pad->track, relative_timestamp, flags); gst_ebml_write_set_cache (ebml, 0x40); gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_SIMPLEBLOCK, GST_BUFFER_SIZE (buf) + GST_BUFFER_SIZE (hdr)); gst_ebml_write_buffer (ebml, hdr); gst_ebml_write_flush_cache (ebml, FALSE, GST_BUFFER_TIMESTAMP (buf)); gst_ebml_write_buffer (ebml, buf); return gst_ebml_last_write_result (ebml); } else { gst_ebml_write_set_cache (ebml, GST_BUFFER_SIZE (buf) * 2); /* write and call order slightly unnatural, * but avoids seek and minizes pushing */ blockgroup = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_BLOCKGROUP); hdr = gst_matroska_mux_create_buffer_header (collect_pad->track, relative_timestamp, 0); if (write_duration) gst_ebml_write_uint (ebml, GST_MATROSKA_ID_BLOCKDURATION, block_duration); gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK, GST_BUFFER_SIZE (buf) + GST_BUFFER_SIZE (hdr)); gst_ebml_write_buffer (ebml, hdr); gst_ebml_write_master_finish_full (ebml, blockgroup, GST_BUFFER_SIZE (buf)); gst_ebml_write_flush_cache (ebml, FALSE, GST_BUFFER_TIMESTAMP (buf)); gst_ebml_write_buffer (ebml, buf); return gst_ebml_last_write_result (ebml); } } /** * gst_matroska_mux_collected: * @pads: #GstCollectPads * @uuser_data: #GstMatroskaMux * * Collectpads callback. * * Returns: #GstFlowReturn */ static GstFlowReturn gst_matroska_mux_collected (GstCollectPads * pads, gpointer user_data) { GstMatroskaMux *mux = GST_MATROSKA_MUX (user_data); GstEbmlWrite *ebml = mux->ebml_write; GstMatroskaPad *best; gboolean popped; GstFlowReturn ret = GST_FLOW_OK; GST_DEBUG_OBJECT (mux, "Collected pads"); /* start with a header */ if (mux->state == GST_MATROSKA_MUX_STATE_START) { if (mux->collect->data == NULL) { GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL), ("No input streams configured")); return GST_FLOW_ERROR; } mux->state = GST_MATROSKA_MUX_STATE_HEADER; gst_ebml_start_streamheader (ebml); gst_matroska_mux_start (mux); gst_matroska_mux_stop_streamheader (mux); mux->state = GST_MATROSKA_MUX_STATE_DATA; } do { /* which stream to write from? */ best = gst_matroska_mux_best_pad (mux, &popped); /* if there is no best pad, we have reached EOS */ if (best == NULL) { /* buffer popped, but none returned means it was clipped */ if (popped) break; GST_DEBUG_OBJECT (mux, "No best pad finishing..."); if (!mux->streamable) { gst_matroska_mux_finish (mux); } else { GST_DEBUG_OBJECT (mux, "... but streamable, nothing to finish"); } gst_pad_push_event (mux->srcpad, gst_event_new_eos ()); ret = GST_FLOW_UNEXPECTED; break; } GST_DEBUG_OBJECT (best->collect.pad, "best pad - buffer ts %" GST_TIME_FORMAT " dur %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (best->buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (best->buffer))); /* make note of first and last encountered timestamps, so we can calculate * the actual duration later when we send an updated header on eos */ if (GST_BUFFER_TIMESTAMP_IS_VALID (best->buffer)) { GstClockTime start_ts = GST_BUFFER_TIMESTAMP (best->buffer); GstClockTime end_ts = start_ts; if (GST_BUFFER_DURATION_IS_VALID (best->buffer)) end_ts += GST_BUFFER_DURATION (best->buffer); else if (best->track->default_duration) end_ts += best->track->default_duration; if (!GST_CLOCK_TIME_IS_VALID (best->end_ts) || end_ts > best->end_ts) best->end_ts = end_ts; if (G_UNLIKELY (best->start_ts == GST_CLOCK_TIME_NONE || start_ts < best->start_ts)) best->start_ts = start_ts; } /* write one buffer */ ret = gst_matroska_mux_write_data (mux, best); } while (ret == GST_FLOW_OK && !popped); return ret; } /** * gst_matroska_mux_change_state: * @element: #GstMatroskaMux * @transition: State change transition. * * Change the muxer state. * * Returns: #GstStateChangeReturn */ static GstStateChangeReturn gst_matroska_mux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstMatroskaMux *mux = GST_MATROSKA_MUX (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_collect_pads_start (mux->collect); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_collect_pads_stop (mux->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_matroska_mux_reset (GST_ELEMENT (mux)); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static void gst_matroska_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMatroskaMux *mux; g_return_if_fail (GST_IS_MATROSKA_MUX (object)); mux = GST_MATROSKA_MUX (object); switch (prop_id) { case ARG_WRITING_APP: if (!g_value_get_string (value)) { GST_WARNING_OBJECT (mux, "writing-app property can not be NULL"); break; } g_free (mux->writing_app); mux->writing_app = g_value_dup_string (value); break; case ARG_DOCTYPE_VERSION: mux->doctype_version = g_value_get_int (value); break; case ARG_MIN_INDEX_INTERVAL: mux->min_index_interval = g_value_get_int64 (value); break; case ARG_STREAMABLE: mux->streamable = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_matroska_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskaMux *mux; g_return_if_fail (GST_IS_MATROSKA_MUX (object)); mux = GST_MATROSKA_MUX (object); switch (prop_id) { case ARG_WRITING_APP: g_value_set_string (value, mux->writing_app); break; case ARG_DOCTYPE_VERSION: g_value_set_int (value, mux->doctype_version); break; case ARG_MIN_INDEX_INTERVAL: g_value_set_int64 (value, mux->min_index_interval); break; case ARG_STREAMABLE: g_value_set_boolean (value, mux->streamable); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/matroska/matroska-read-common.c0000644000175000017500000015243711705514232020615 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2006 Tim-Philipp Müller * (c) 2008 Sebastian Dröge * (c) 2011 Debarshi Ray * * matroska-read-common.c: shared by matroska file/stream demuxer and parser * * 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 #include #ifdef HAVE_ZLIB #include #endif #ifdef HAVE_BZ2 #include #endif #include #include #include "lzo.h" #include "ebml-read.h" #include "matroska-read-common.h" GST_DEBUG_CATEGORY (matroskareadcommon_debug); #define GST_CAT_DEFAULT matroskareadcommon_debug #define DEBUG_ELEMENT_START(common, ebml, element) \ GST_DEBUG_OBJECT (common, "Parsing " element " element at offset %" \ G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml)) #define DEBUG_ELEMENT_STOP(common, ebml, element, ret) \ GST_DEBUG_OBJECT (common, "Parsing " element " element " \ " finished with '%s'", gst_flow_get_name (ret)) static gboolean gst_matroska_decompress_data (GstMatroskaTrackEncoding * enc, guint8 ** data_out, guint * size_out, GstMatroskaTrackCompressionAlgorithm algo) { guint8 *new_data = NULL; guint new_size = 0; guint8 *data = *data_out; guint size = *size_out; gboolean ret = TRUE; if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_ZLIB) { #ifdef HAVE_ZLIB /* zlib encoded data */ z_stream zstream; guint orig_size; int result; orig_size = size; zstream.zalloc = (alloc_func) 0; zstream.zfree = (free_func) 0; zstream.opaque = (voidpf) 0; if (inflateInit (&zstream) != Z_OK) { GST_WARNING ("zlib initialization failed."); ret = FALSE; goto out; } zstream.next_in = (Bytef *) data; zstream.avail_in = orig_size; new_size = orig_size; new_data = g_malloc (new_size); zstream.avail_out = new_size; zstream.next_out = (Bytef *) new_data; do { result = inflate (&zstream, Z_NO_FLUSH); if (result != Z_OK && result != Z_STREAM_END) { GST_WARNING ("zlib decompression failed."); g_free (new_data); inflateEnd (&zstream); break; } new_size += 4000; new_data = g_realloc (new_data, new_size); zstream.next_out = (Bytef *) (new_data + zstream.total_out); zstream.avail_out += 4000; } while (zstream.avail_in != 0 && result != Z_STREAM_END); if (result != Z_STREAM_END) { ret = FALSE; goto out; } else { new_size = zstream.total_out; inflateEnd (&zstream); } #else GST_WARNING ("zlib encoded tracks not supported."); ret = FALSE; goto out; #endif } else if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_BZLIB) { #ifdef HAVE_BZ2 /* bzip2 encoded data */ bz_stream bzstream; guint orig_size; int result; bzstream.bzalloc = NULL; bzstream.bzfree = NULL; bzstream.opaque = NULL; orig_size = size; if (BZ2_bzDecompressInit (&bzstream, 0, 0) != BZ_OK) { GST_WARNING ("bzip2 initialization failed."); ret = FALSE; goto out; } bzstream.next_in = (char *) data; bzstream.avail_in = orig_size; new_size = orig_size; new_data = g_malloc (new_size); bzstream.avail_out = new_size; bzstream.next_out = (char *) new_data; do { result = BZ2_bzDecompress (&bzstream); if (result != BZ_OK && result != BZ_STREAM_END) { GST_WARNING ("bzip2 decompression failed."); g_free (new_data); BZ2_bzDecompressEnd (&bzstream); break; } new_size += 4000; new_data = g_realloc (new_data, new_size); bzstream.next_out = (char *) (new_data + bzstream.total_out_lo32); bzstream.avail_out += 4000; } while (bzstream.avail_in != 0 && result != BZ_STREAM_END); if (result != BZ_STREAM_END) { ret = FALSE; goto out; } else { new_size = bzstream.total_out_lo32; BZ2_bzDecompressEnd (&bzstream); } #else GST_WARNING ("bzip2 encoded tracks not supported."); ret = FALSE; goto out; #endif } else if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_LZO1X) { /* lzo encoded data */ int result; int orig_size, out_size; orig_size = size; out_size = size; new_size = size; new_data = g_malloc (new_size); do { orig_size = size; out_size = new_size; result = lzo1x_decode (new_data, &out_size, data, &orig_size); if (orig_size > 0) { new_size += 4000; new_data = g_realloc (new_data, new_size); } } while (orig_size > 0 && result == LZO_OUTPUT_FULL); new_size -= out_size; if (result != LZO_OUTPUT_FULL) { GST_WARNING ("lzo decompression failed"); g_free (new_data); ret = FALSE; goto out; } } else if (algo == GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_HEADERSTRIP) { /* header stripped encoded data */ if (enc->comp_settings_length > 0) { new_data = g_malloc (size + enc->comp_settings_length); new_size = size + enc->comp_settings_length; memcpy (new_data, enc->comp_settings, enc->comp_settings_length); memcpy (new_data + enc->comp_settings_length, data, size); } } else { GST_ERROR ("invalid compression algorithm %d", algo); ret = FALSE; } out: if (!ret) { *data_out = NULL; *size_out = 0; } else { *data_out = new_data; *size_out = new_size; } return ret; } GstFlowReturn gst_matroska_decode_content_encodings (GArray * encodings) { gint i; if (encodings == NULL) return GST_FLOW_OK; for (i = 0; i < encodings->len; i++) { GstMatroskaTrackEncoding *enc = &g_array_index (encodings, GstMatroskaTrackEncoding, i); guint8 *data = NULL; guint size; if ((enc->scope & GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING) == 0) continue; /* Encryption not supported yet */ if (enc->type != 0) return GST_FLOW_ERROR; if (i + 1 >= encodings->len) return GST_FLOW_ERROR; if (enc->comp_settings_length == 0) continue; data = enc->comp_settings; size = enc->comp_settings_length; if (!gst_matroska_decompress_data (enc, &data, &size, enc->comp_algo)) return GST_FLOW_ERROR; g_free (enc->comp_settings); enc->comp_settings = data; enc->comp_settings_length = size; } return GST_FLOW_OK; } gboolean gst_matroska_decode_data (GArray * encodings, guint8 ** data_out, guint * size_out, GstMatroskaTrackEncodingScope scope, gboolean free) { guint8 *data; guint size; gboolean ret = TRUE; gint i; g_return_val_if_fail (encodings != NULL, FALSE); g_return_val_if_fail (data_out != NULL && *data_out != NULL, FALSE); g_return_val_if_fail (size_out != NULL, FALSE); data = *data_out; size = *size_out; for (i = 0; i < encodings->len; i++) { GstMatroskaTrackEncoding *enc = &g_array_index (encodings, GstMatroskaTrackEncoding, i); guint8 *new_data = NULL; guint new_size = 0; if ((enc->scope & scope) == 0) continue; /* Encryption not supported yet */ if (enc->type != 0) { ret = FALSE; break; } new_data = data; new_size = size; ret = gst_matroska_decompress_data (enc, &new_data, &new_size, enc->comp_algo); if (!ret) break; if ((data == *data_out && free) || (data != *data_out)) g_free (data); data = new_data; size = new_size; } if (!ret) { if ((data == *data_out && free) || (data != *data_out)) g_free (data); *data_out = NULL; *size_out = 0; } else { *data_out = data; *size_out = size; } return ret; } static gint gst_matroska_index_compare (GstMatroskaIndex * i1, GstMatroskaIndex * i2) { if (i1->time < i2->time) return -1; else if (i1->time > i2->time) return 1; else if (i1->block < i2->block) return -1; else if (i1->block > i2->block) return 1; else return 0; } gint gst_matroska_index_seek_find (GstMatroskaIndex * i1, GstClockTime * time, gpointer user_data) { if (i1->time < *time) return -1; else if (i1->time > *time) return 1; else return 0; } GstMatroskaIndex * gst_matroska_read_common_do_index_seek (GstMatroskaReadCommon * common, GstMatroskaTrackContext * track, gint64 seek_pos, GArray ** _index, gint * _entry_index) { GstMatroskaIndex *entry = NULL; GArray *index; if (!common->index || !common->index->len) return NULL; /* find entry just before or at the requested position */ if (track && track->index_table) index = track->index_table; else index = common->index; entry = gst_util_array_binary_search (index->data, index->len, sizeof (GstMatroskaIndex), (GCompareDataFunc) gst_matroska_index_seek_find, GST_SEARCH_MODE_BEFORE, &seek_pos, NULL); if (entry == NULL) entry = &g_array_index (index, GstMatroskaIndex, 0); if (_index) *_index = index; if (_entry_index) *_entry_index = entry - (GstMatroskaIndex *) index->data; return entry; } static gint gst_matroska_read_common_encoding_cmp (GstMatroskaTrackEncoding * a, GstMatroskaTrackEncoding * b) { if (b->order > a->order) return 1; else if (b->order < a->order) return -1; else return 0; } static gboolean gst_matroska_read_common_encoding_order_unique (GArray * encodings, guint64 order) { gint i; if (encodings == NULL || encodings->len == 0) return TRUE; for (i = 0; i < encodings->len; i++) if (g_array_index (encodings, GstMatroskaTrackEncoding, i).order == order) return FALSE; return TRUE; } /* takes ownership of taglist */ void gst_matroska_read_common_found_global_tag (GstMatroskaReadCommon * common, GstElement * el, GstTagList * taglist) { if (common->global_tags) { /* nothing sent yet, add to cache */ gst_tag_list_insert (common->global_tags, taglist, GST_TAG_MERGE_APPEND); gst_tag_list_free (taglist); } else { /* hm, already sent, no need to cache and wait anymore */ GST_DEBUG_OBJECT (common, "Sending late global tags %" GST_PTR_FORMAT, taglist); gst_element_found_tags (el, taglist); } } gint64 gst_matroska_read_common_get_length (GstMatroskaReadCommon * common) { GstFormat fmt = GST_FORMAT_BYTES; gint64 end = -1; if (!gst_pad_query_peer_duration (common->sinkpad, &fmt, &end) || fmt != GST_FORMAT_BYTES || end < 0) GST_DEBUG_OBJECT (common, "no upstream length"); return end; } /* determine track to seek in */ GstMatroskaTrackContext * gst_matroska_read_common_get_seek_track (GstMatroskaReadCommon * common, GstMatroskaTrackContext * track) { gint i; if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO) return track; for (i = 0; i < common->src->len; i++) { GstMatroskaTrackContext *stream; stream = g_ptr_array_index (common->src, i); if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table) track = stream; } return track; } /* skip unknown or alike element */ GstFlowReturn gst_matroska_read_common_parse_skip (GstMatroskaReadCommon * common, GstEbmlRead * ebml, const gchar * parent_name, guint id) { if (id == GST_EBML_ID_VOID) { GST_DEBUG_OBJECT (common, "Skipping EBML Void element"); } else if (id == GST_EBML_ID_CRC32) { GST_DEBUG_OBJECT (common, "Skipping EBML CRC32 element"); } else { GST_WARNING_OBJECT (common, "Unknown %s subelement 0x%x - ignoring", parent_name, id); } return gst_ebml_read_skip (ebml); } static GstFlowReturn gst_matroska_read_common_parse_attached_file (GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstTagList * taglist) { guint32 id; GstFlowReturn ret; gchar *description = NULL; gchar *filename = NULL; gchar *mimetype = NULL; guint8 *data = NULL; guint64 datalen = 0; DEBUG_ELEMENT_START (common, ebml, "AttachedFile"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "AttachedFile", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { /* read all sub-entries */ if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_FILEDESCRIPTION: if (description) { GST_WARNING_OBJECT (common, "FileDescription can only appear once"); break; } ret = gst_ebml_read_utf8 (ebml, &id, &description); GST_DEBUG_OBJECT (common, "FileDescription: %s", GST_STR_NULL (description)); break; case GST_MATROSKA_ID_FILENAME: if (filename) { GST_WARNING_OBJECT (common, "FileName can only appear once"); break; } ret = gst_ebml_read_utf8 (ebml, &id, &filename); GST_DEBUG_OBJECT (common, "FileName: %s", GST_STR_NULL (filename)); break; case GST_MATROSKA_ID_FILEMIMETYPE: if (mimetype) { GST_WARNING_OBJECT (common, "FileMimeType can only appear once"); break; } ret = gst_ebml_read_ascii (ebml, &id, &mimetype); GST_DEBUG_OBJECT (common, "FileMimeType: %s", GST_STR_NULL (mimetype)); break; case GST_MATROSKA_ID_FILEDATA: if (data) { GST_WARNING_OBJECT (common, "FileData can only appear once"); break; } ret = gst_ebml_read_binary (ebml, &id, &data, &datalen); GST_DEBUG_OBJECT (common, "FileData of size %" G_GUINT64_FORMAT, datalen); break; default: ret = gst_matroska_read_common_parse_skip (common, ebml, "AttachedFile", id); break; case GST_MATROSKA_ID_FILEUID: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "AttachedFile", ret); if (filename && mimetype && data && datalen > 0) { GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE; GstBuffer *tagbuffer = NULL; GstCaps *caps; gchar *filename_lc = g_utf8_strdown (filename, -1); GST_DEBUG_OBJECT (common, "Creating tag for attachment with " "filename '%s', mimetype '%s', description '%s', " "size %" G_GUINT64_FORMAT, filename, mimetype, GST_STR_NULL (description), datalen); /* TODO: better heuristics for different image types */ if (strstr (filename_lc, "cover")) { if (strstr (filename_lc, "back")) image_type = GST_TAG_IMAGE_TYPE_BACK_COVER; else image_type = GST_TAG_IMAGE_TYPE_FRONT_COVER; } else if (g_str_has_prefix (mimetype, "image/") || g_str_has_suffix (filename_lc, "png") || g_str_has_suffix (filename_lc, "jpg") || g_str_has_suffix (filename_lc, "jpeg") || g_str_has_suffix (filename_lc, "gif") || g_str_has_suffix (filename_lc, "bmp")) { image_type = GST_TAG_IMAGE_TYPE_UNDEFINED; } g_free (filename_lc); /* First try to create an image tag buffer from this */ if (image_type != GST_TAG_IMAGE_TYPE_NONE) { tagbuffer = gst_tag_image_data_to_image_buffer (data, datalen, image_type); if (!tagbuffer) image_type = GST_TAG_IMAGE_TYPE_NONE; } /* if this failed create an attachment buffer */ if (!tagbuffer) { tagbuffer = gst_buffer_new_and_alloc (datalen); memcpy (GST_BUFFER_DATA (tagbuffer), data, datalen); GST_BUFFER_SIZE (tagbuffer) = datalen; caps = gst_type_find_helper_for_buffer (NULL, tagbuffer, NULL); if (caps == NULL) caps = gst_caps_new_simple (mimetype, NULL); gst_buffer_set_caps (tagbuffer, caps); gst_caps_unref (caps); } /* Set filename and description on the caps */ caps = GST_BUFFER_CAPS (tagbuffer); gst_caps_set_simple (caps, "filename", G_TYPE_STRING, filename, NULL); if (description) gst_caps_set_simple (caps, "description", G_TYPE_STRING, description, NULL); GST_DEBUG_OBJECT (common, "Created attachment buffer with caps: %" GST_PTR_FORMAT, caps); /* and append to the tag list */ if (image_type != GST_TAG_IMAGE_TYPE_NONE) gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, tagbuffer, NULL); else gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_ATTACHMENT, tagbuffer, NULL); /* the tag list adds it own ref */ gst_buffer_unref (tagbuffer); } g_free (filename); g_free (mimetype); g_free (data); g_free (description); return ret; } GstFlowReturn gst_matroska_read_common_parse_attachments (GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml) { guint32 id; GstFlowReturn ret = GST_FLOW_OK; GstTagList *taglist; DEBUG_ELEMENT_START (common, ebml, "Attachments"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "Attachments", ret); return ret; } taglist = gst_tag_list_new (); while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_ATTACHEDFILE: ret = gst_matroska_read_common_parse_attached_file (common, ebml, taglist); break; default: ret = gst_matroska_read_common_parse_skip (common, ebml, "Attachments", id); break; } } DEBUG_ELEMENT_STOP (common, ebml, "Attachments", ret); if (gst_structure_n_fields (GST_STRUCTURE (taglist)) > 0) { GST_DEBUG_OBJECT (common, "Storing attachment tags"); gst_matroska_read_common_found_global_tag (common, el, taglist); } else { GST_DEBUG_OBJECT (common, "No valid attachments found"); gst_tag_list_free (taglist); } common->attachments_parsed = TRUE; return ret; } GstFlowReturn gst_matroska_read_common_parse_chapters (GstMatroskaReadCommon * common, GstEbmlRead * ebml) { guint32 id; GstFlowReturn ret = GST_FLOW_OK; GST_WARNING_OBJECT (common, "Parsing of chapters not implemented yet"); /* TODO: implement parsing of chapters */ DEBUG_ELEMENT_START (common, ebml, "Chapters"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "Chapters", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { default: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "Chapters", ret); return ret; } GstFlowReturn gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common, GstEbmlRead * ebml) { GstFlowReturn ret; gchar *doctype; guint version; guint32 id; /* this function is the first to be called */ /* default init */ doctype = NULL; version = 1; ret = gst_ebml_peek_id (ebml, &id); if (ret != GST_FLOW_OK) return ret; GST_DEBUG_OBJECT (common, "id: %08x", id); if (id != GST_EBML_ID_HEADER) { GST_ERROR_OBJECT (common, "Failed to read header"); goto exit; } ret = gst_ebml_read_master (ebml, &id); if (ret != GST_FLOW_OK) return ret; while (gst_ebml_read_has_remaining (ebml, 1, TRUE)) { ret = gst_ebml_peek_id (ebml, &id); if (ret != GST_FLOW_OK) return ret; switch (id) { /* is our read version uptodate? */ case GST_EBML_ID_EBMLREADVERSION:{ guint64 num; ret = gst_ebml_read_uint (ebml, &id, &num); if (ret != GST_FLOW_OK) return ret; if (num != GST_EBML_VERSION) { GST_ERROR_OBJECT (ebml, "Unsupported EBML version %" G_GUINT64_FORMAT, num); return GST_FLOW_ERROR; } GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num); break; } /* we only handle 8 byte lengths at max */ case GST_EBML_ID_EBMLMAXSIZELENGTH:{ guint64 num; ret = gst_ebml_read_uint (ebml, &id, &num); if (ret != GST_FLOW_OK) return ret; if (num > sizeof (guint64)) { GST_ERROR_OBJECT (ebml, "Unsupported EBML maximum size %" G_GUINT64_FORMAT, num); return GST_FLOW_ERROR; } GST_DEBUG_OBJECT (ebml, "EbmlMaxSizeLength: %" G_GUINT64_FORMAT, num); break; } /* we handle 4 byte IDs at max */ case GST_EBML_ID_EBMLMAXIDLENGTH:{ guint64 num; ret = gst_ebml_read_uint (ebml, &id, &num); if (ret != GST_FLOW_OK) return ret; if (num > sizeof (guint32)) { GST_ERROR_OBJECT (ebml, "Unsupported EBML maximum ID %" G_GUINT64_FORMAT, num); return GST_FLOW_ERROR; } GST_DEBUG_OBJECT (ebml, "EbmlMaxIdLength: %" G_GUINT64_FORMAT, num); break; } case GST_EBML_ID_DOCTYPE:{ gchar *text; ret = gst_ebml_read_ascii (ebml, &id, &text); if (ret != GST_FLOW_OK) return ret; GST_DEBUG_OBJECT (ebml, "EbmlDocType: %s", GST_STR_NULL (text)); if (doctype) g_free (doctype); doctype = text; break; } case GST_EBML_ID_DOCTYPEREADVERSION:{ guint64 num; ret = gst_ebml_read_uint (ebml, &id, &num); if (ret != GST_FLOW_OK) return ret; version = num; GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num); break; } default: ret = gst_matroska_read_common_parse_skip (common, ebml, "EBML header", id); if (ret != GST_FLOW_OK) return ret; break; /* we ignore these two, as they don't tell us anything we care about */ case GST_EBML_ID_EBMLVERSION: case GST_EBML_ID_DOCTYPEVERSION: ret = gst_ebml_read_skip (ebml); if (ret != GST_FLOW_OK) return ret; break; } } exit: if ((doctype != NULL && !strcmp (doctype, GST_MATROSKA_DOCTYPE_MATROSKA)) || (doctype != NULL && !strcmp (doctype, GST_MATROSKA_DOCTYPE_WEBM)) || (doctype == NULL)) { if (version <= 2) { if (doctype) { GST_INFO_OBJECT (common, "Input is %s version %d", doctype, version); } else { GST_WARNING_OBJECT (common, "Input is EBML without doctype, assuming " "matroska (version %d)", version); } ret = GST_FLOW_OK; } else { GST_ELEMENT_ERROR (common, STREAM, DEMUX, (NULL), ("Demuxer version (2) is too old to read %s version %d", GST_STR_NULL (doctype), version)); ret = GST_FLOW_ERROR; } g_free (doctype); } else { GST_ELEMENT_ERROR (common, STREAM, WRONG_TYPE, (NULL), ("Input is not a matroska stream (doctype=%s)", doctype)); ret = GST_FLOW_ERROR; g_free (doctype); } return ret; } static GstFlowReturn gst_matroska_read_common_parse_index_cuetrack (GstMatroskaReadCommon * common, GstEbmlRead * ebml, guint * nentries) { guint32 id; GstFlowReturn ret; GstMatroskaIndex idx; idx.pos = (guint64) - 1; idx.track = 0; idx.time = GST_CLOCK_TIME_NONE; idx.block = 1; DEBUG_ELEMENT_START (common, ebml, "CueTrackPositions"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "CueTrackPositions", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* track number */ case GST_MATROSKA_ID_CUETRACK: { guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { idx.track = 0; GST_WARNING_OBJECT (common, "Invalid CueTrack 0"); break; } GST_DEBUG_OBJECT (common, "CueTrack: %" G_GUINT64_FORMAT, num); idx.track = num; break; } /* position in file */ case GST_MATROSKA_ID_CUECLUSTERPOSITION: { guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num > G_MAXINT64) { GST_WARNING_OBJECT (common, "CueClusterPosition %" G_GUINT64_FORMAT " too large", num); break; } idx.pos = num; break; } /* number of block in the cluster */ case GST_MATROSKA_ID_CUEBLOCKNUMBER: { guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (common, "Invalid CueBlockNumber 0"); break; } GST_DEBUG_OBJECT (common, "CueBlockNumber: %" G_GUINT64_FORMAT, num); idx.block = num; /* mild sanity check, disregard strange cases ... */ if (idx.block > G_MAXUINT16) { GST_DEBUG_OBJECT (common, "... looks suspicious, ignoring"); idx.block = 1; } break; } default: ret = gst_matroska_read_common_parse_skip (common, ebml, "CueTrackPositions", id); break; case GST_MATROSKA_ID_CUECODECSTATE: case GST_MATROSKA_ID_CUEREFERENCE: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "CueTrackPositions", ret); /* (e.g.) lavf typically creates entries without a block number, * which is bogus and leads to contradictory information */ if (common->index->len) { GstMatroskaIndex *last_idx; last_idx = &g_array_index (common->index, GstMatroskaIndex, common->index->len - 1); if (last_idx->block == idx.block && last_idx->pos == idx.pos && last_idx->track == idx.track && idx.time > last_idx->time) { GST_DEBUG_OBJECT (common, "Cue entry refers to same location, " "but has different time than previous entry; discarding"); idx.track = 0; } } if ((ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) && idx.pos != (guint64) - 1 && idx.track > 0) { g_array_append_val (common->index, idx); (*nentries)++; } else if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) { GST_DEBUG_OBJECT (common, "CueTrackPositions without valid content"); } return ret; } static GstFlowReturn gst_matroska_read_common_parse_index_pointentry (GstMatroskaReadCommon * common, GstEbmlRead * ebml) { guint32 id; GstFlowReturn ret; GstClockTime time = GST_CLOCK_TIME_NONE; guint nentries = 0; DEBUG_ELEMENT_START (common, ebml, "CuePoint"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "CuePoint", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* one single index entry ('point') */ case GST_MATROSKA_ID_CUETIME: { if ((ret = gst_ebml_read_uint (ebml, &id, &time)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (common, "CueTime: %" G_GUINT64_FORMAT, time); time = time * common->time_scale; break; } /* position in the file + track to which it belongs */ case GST_MATROSKA_ID_CUETRACKPOSITIONS: { if ((ret = gst_matroska_read_common_parse_index_cuetrack (common, ebml, &nentries)) != GST_FLOW_OK) break; break; } default: ret = gst_matroska_read_common_parse_skip (common, ebml, "CuePoint", id); break; } } DEBUG_ELEMENT_STOP (common, ebml, "CuePoint", ret); if (nentries > 0) { if (time == GST_CLOCK_TIME_NONE) { GST_WARNING_OBJECT (common, "CuePoint without valid time"); g_array_remove_range (common->index, common->index->len - nentries, nentries); } else { gint i; for (i = common->index->len - nentries; i < common->index->len; i++) { GstMatroskaIndex *idx = &g_array_index (common->index, GstMatroskaIndex, i); idx->time = time; GST_DEBUG_OBJECT (common, "Index entry: pos=%" G_GUINT64_FORMAT ", time=%" GST_TIME_FORMAT ", track=%u, block=%u", idx->pos, GST_TIME_ARGS (idx->time), (guint) idx->track, (guint) idx->block); } } } else { GST_DEBUG_OBJECT (common, "Empty CuePoint"); } return ret; } gint gst_matroska_read_common_stream_from_num (GstMatroskaReadCommon * common, guint track_num) { guint n; g_assert (common->src->len == common->num_streams); for (n = 0; n < common->src->len; n++) { GstMatroskaTrackContext *context = g_ptr_array_index (common->src, n); if (context->num == track_num) { return n; } } if (n == common->num_streams) GST_WARNING_OBJECT (common, "Failed to find corresponding pad for tracknum %d", track_num); return -1; } GstFlowReturn gst_matroska_read_common_parse_index (GstMatroskaReadCommon * common, GstEbmlRead * ebml) { guint32 id; GstFlowReturn ret = GST_FLOW_OK; guint i; if (common->index) g_array_free (common->index, TRUE); common->index = g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaIndex), 128); DEBUG_ELEMENT_START (common, ebml, "Cues"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "Cues", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* one single index entry ('point') */ case GST_MATROSKA_ID_POINTENTRY: ret = gst_matroska_read_common_parse_index_pointentry (common, ebml); break; default: ret = gst_matroska_read_common_parse_skip (common, ebml, "Cues", id); break; } } DEBUG_ELEMENT_STOP (common, ebml, "Cues", ret); /* Sort index by time, smallest time first, for easier searching */ g_array_sort (common->index, (GCompareFunc) gst_matroska_index_compare); /* Now sort the track specific index entries into their own arrays */ for (i = 0; i < common->index->len; i++) { GstMatroskaIndex *idx = &g_array_index (common->index, GstMatroskaIndex, i); gint track_num; GstMatroskaTrackContext *ctx; if (common->element_index) { gint writer_id; if (idx->track != 0 && (track_num = gst_matroska_read_common_stream_from_num (common, idx->track)) != -1) { ctx = g_ptr_array_index (common->src, track_num); if (ctx->index_writer_id == -1) gst_index_get_writer_id (common->element_index, GST_OBJECT (ctx->pad), &ctx->index_writer_id); writer_id = ctx->index_writer_id; } else { if (common->element_index_writer_id == -1) gst_index_get_writer_id (common->element_index, GST_OBJECT (common), &common->element_index_writer_id); writer_id = common->element_index_writer_id; } GST_LOG_OBJECT (common, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT " for writer id %d", GST_TIME_ARGS (idx->time), idx->pos, writer_id); gst_index_add_association (common->element_index, writer_id, GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, idx->time, GST_FORMAT_BYTES, idx->pos + common->ebml_segment_start, NULL); } if (idx->track == 0) continue; track_num = gst_matroska_read_common_stream_from_num (common, idx->track); if (track_num == -1) continue; ctx = g_ptr_array_index (common->src, track_num); if (ctx->index_table == NULL) ctx->index_table = g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaIndex), 128); g_array_append_vals (ctx->index_table, idx, 1); } common->index_parsed = TRUE; /* sanity check; empty index normalizes to no index */ if (common->index->len == 0) { g_array_free (common->index, TRUE); common->index = NULL; } return ret; } GstFlowReturn gst_matroska_read_common_parse_info (GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml) { GstFlowReturn ret = GST_FLOW_OK; gdouble dur_f = -1.0; guint32 id; DEBUG_ELEMENT_START (common, ebml, "SegmentInfo"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "SegmentInfo", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* cluster timecode */ case GST_MATROSKA_ID_TIMECODESCALE:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (common, "TimeCodeScale: %" G_GUINT64_FORMAT, num); common->time_scale = num; break; } case GST_MATROSKA_ID_DURATION:{ if ((ret = gst_ebml_read_float (ebml, &id, &dur_f)) != GST_FLOW_OK) break; if (dur_f <= 0.0) { GST_WARNING_OBJECT (common, "Invalid duration %lf", dur_f); break; } GST_DEBUG_OBJECT (common, "Duration: %lf", dur_f); break; } case GST_MATROSKA_ID_WRITINGAPP:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (common, "WritingApp: %s", GST_STR_NULL (text)); common->writing_app = text; break; } case GST_MATROSKA_ID_MUXINGAPP:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (common, "MuxingApp: %s", GST_STR_NULL (text)); common->muxing_app = text; break; } case GST_MATROSKA_ID_DATEUTC:{ gint64 time; if ((ret = gst_ebml_read_date (ebml, &id, &time)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (common, "DateUTC: %" G_GINT64_FORMAT, time); common->created = time; break; } case GST_MATROSKA_ID_TITLE:{ gchar *text; GstTagList *taglist; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (common, "Title: %s", GST_STR_NULL (text)); taglist = gst_tag_list_new (); gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, text, NULL); gst_matroska_read_common_found_global_tag (common, el, taglist); g_free (text); break; } default: ret = gst_matroska_read_common_parse_skip (common, ebml, "SegmentInfo", id); break; /* fall through */ case GST_MATROSKA_ID_SEGMENTUID: case GST_MATROSKA_ID_SEGMENTFILENAME: case GST_MATROSKA_ID_PREVUID: case GST_MATROSKA_ID_PREVFILENAME: case GST_MATROSKA_ID_NEXTUID: case GST_MATROSKA_ID_NEXTFILENAME: case GST_MATROSKA_ID_SEGMENTFAMILY: case GST_MATROSKA_ID_CHAPTERTRANSLATE: ret = gst_ebml_read_skip (ebml); break; } } if (dur_f > 0.0) { GstClockTime dur_u; dur_u = gst_gdouble_to_guint64 (dur_f * gst_guint64_to_gdouble (common->time_scale)); if (GST_CLOCK_TIME_IS_VALID (dur_u) && dur_u <= G_MAXINT64) gst_segment_set_duration (&common->segment, GST_FORMAT_TIME, dur_u); } DEBUG_ELEMENT_STOP (common, ebml, "SegmentInfo", ret); common->segmentinfo_parsed = TRUE; return ret; } static GstFlowReturn gst_matroska_read_common_parse_metadata_id_simple_tag (GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstTagList ** p_taglist) { /* FIXME: check if there are more useful mappings */ static const struct { const gchar *matroska_tagname; const gchar *gstreamer_tagname; } tag_conv[] = { { GST_MATROSKA_TAG_ID_TITLE, GST_TAG_TITLE}, { GST_MATROSKA_TAG_ID_ARTIST, GST_TAG_ARTIST}, { GST_MATROSKA_TAG_ID_AUTHOR, GST_TAG_ARTIST}, { GST_MATROSKA_TAG_ID_ALBUM, GST_TAG_ALBUM}, { GST_MATROSKA_TAG_ID_COMMENTS, GST_TAG_COMMENT}, { GST_MATROSKA_TAG_ID_BITSPS, GST_TAG_BITRATE}, { GST_MATROSKA_TAG_ID_BPS, GST_TAG_BITRATE}, { GST_MATROSKA_TAG_ID_ENCODER, GST_TAG_ENCODER}, { GST_MATROSKA_TAG_ID_DATE, GST_TAG_DATE}, { GST_MATROSKA_TAG_ID_ISRC, GST_TAG_ISRC}, { GST_MATROSKA_TAG_ID_COPYRIGHT, GST_TAG_COPYRIGHT}, { GST_MATROSKA_TAG_ID_BPM, GST_TAG_BEATS_PER_MINUTE}, { GST_MATROSKA_TAG_ID_TERMS_OF_USE, GST_TAG_LICENSE}, { GST_MATROSKA_TAG_ID_COMPOSER, GST_TAG_COMPOSER}, { GST_MATROSKA_TAG_ID_LEAD_PERFORMER, GST_TAG_PERFORMER}, { GST_MATROSKA_TAG_ID_GENRE, GST_TAG_GENRE} }; GstFlowReturn ret; guint32 id; gchar *value = NULL; gchar *tag = NULL; DEBUG_ELEMENT_START (common, ebml, "SimpleTag"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "SimpleTag", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { /* read all sub-entries */ if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_TAGNAME: g_free (tag); tag = NULL; ret = gst_ebml_read_ascii (ebml, &id, &tag); GST_DEBUG_OBJECT (common, "TagName: %s", GST_STR_NULL (tag)); break; case GST_MATROSKA_ID_TAGSTRING: g_free (value); value = NULL; ret = gst_ebml_read_utf8 (ebml, &id, &value); GST_DEBUG_OBJECT (common, "TagString: %s", GST_STR_NULL (value)); break; default: ret = gst_matroska_read_common_parse_skip (common, ebml, "SimpleTag", id); break; /* fall-through */ case GST_MATROSKA_ID_TAGLANGUAGE: case GST_MATROSKA_ID_TAGDEFAULT: case GST_MATROSKA_ID_TAGBINARY: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "SimpleTag", ret); if (tag && value) { guint i; for (i = 0; i < G_N_ELEMENTS (tag_conv); i++) { const gchar *tagname_gst = tag_conv[i].gstreamer_tagname; const gchar *tagname_mkv = tag_conv[i].matroska_tagname; if (strcmp (tagname_mkv, tag) == 0) { GValue dest = { 0, }; GType dest_type = gst_tag_get_type (tagname_gst); /* Ensure that any date string is complete */ if (dest_type == GST_TYPE_DATE) { guint year = 1901, month = 1, day = 1; /* Dates can be yyyy-MM-dd, yyyy-MM or yyyy, but we need * the first type */ if (sscanf (value, "%04u-%02u-%02u", &year, &month, &day) != 0) { g_free (value); value = g_strdup_printf ("%04u-%02u-%02u", year, month, day); } } g_value_init (&dest, dest_type); if (gst_value_deserialize (&dest, value)) { gst_tag_list_add_values (*p_taglist, GST_TAG_MERGE_APPEND, tagname_gst, &dest, NULL); } else { GST_WARNING_OBJECT (common, "Can't transform tag '%s' with " "value '%s' to target type '%s'", tag, value, g_type_name (dest_type)); } g_value_unset (&dest); break; } } } g_free (tag); g_free (value); return ret; } static GstFlowReturn gst_matroska_read_common_parse_metadata_id_tag (GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstTagList ** p_taglist) { guint32 id; GstFlowReturn ret; DEBUG_ELEMENT_START (common, ebml, "Tag"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "Tag", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { /* read all sub-entries */ if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_SIMPLETAG: ret = gst_matroska_read_common_parse_metadata_id_simple_tag (common, ebml, p_taglist); break; default: ret = gst_matroska_read_common_parse_skip (common, ebml, "Tag", id); break; } } DEBUG_ELEMENT_STOP (common, ebml, "Tag", ret); return ret; } GstFlowReturn gst_matroska_read_common_parse_metadata (GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml) { GstTagList *taglist; GstFlowReturn ret = GST_FLOW_OK; guint32 id; GList *l; guint64 curpos; curpos = gst_ebml_read_get_pos (ebml); /* Make sure we don't parse a tags element twice and * post it's tags twice */ curpos = gst_ebml_read_get_pos (ebml); for (l = common->tags_parsed; l; l = l->next) { guint64 *pos = l->data; if (*pos == curpos) { GST_DEBUG_OBJECT (common, "Skipping already parsed Tags at offset %" G_GUINT64_FORMAT, curpos); return GST_FLOW_OK; } } common->tags_parsed = g_list_prepend (common->tags_parsed, g_slice_new (guint64)); *((guint64 *) common->tags_parsed->data) = curpos; /* fall-through */ if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "Tags", ret); return ret; } taglist = gst_tag_list_new (); while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_TAG: ret = gst_matroska_read_common_parse_metadata_id_tag (common, ebml, &taglist); break; default: ret = gst_matroska_read_common_parse_skip (common, ebml, "Tags", id); break; /* FIXME: Use to limit the tags to specific pads */ case GST_MATROSKA_ID_TARGETS: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "Tags", ret); gst_matroska_read_common_found_global_tag (common, el, taglist); return ret; } static GstFlowReturn gst_matroska_read_common_peek_adapter (GstMatroskaReadCommon * common, guint peek, const guint8 ** data) { *data = gst_adapter_peek (common->adapter, peek); if (*data == NULL) return GST_FLOW_UNEXPECTED; return GST_FLOW_OK; } /* * Calls pull_range for (offset,size) without advancing our offset */ GstFlowReturn gst_matroska_read_common_peek_bytes (GstMatroskaReadCommon * common, guint64 offset, guint size, GstBuffer ** p_buf, guint8 ** bytes) { GstFlowReturn ret; /* Caching here actually makes much less difference than one would expect. * We do it mainly to avoid pulling buffers of 1 byte all the time */ if (common->cached_buffer) { guint64 cache_offset = GST_BUFFER_OFFSET (common->cached_buffer); guint cache_size = GST_BUFFER_SIZE (common->cached_buffer); if (cache_offset <= common->offset && (common->offset + size) <= (cache_offset + cache_size)) { if (p_buf) *p_buf = gst_buffer_create_sub (common->cached_buffer, common->offset - cache_offset, size); if (bytes) *bytes = GST_BUFFER_DATA (common->cached_buffer) + common->offset - cache_offset; return GST_FLOW_OK; } /* not enough data in the cache, free cache and get a new one */ gst_buffer_unref (common->cached_buffer); common->cached_buffer = NULL; } /* refill the cache */ ret = gst_pad_pull_range (common->sinkpad, common->offset, MAX (size, 64 * 1024), &common->cached_buffer); if (ret != GST_FLOW_OK) { common->cached_buffer = NULL; return ret; } if (GST_BUFFER_SIZE (common->cached_buffer) >= size) { if (p_buf) *p_buf = gst_buffer_create_sub (common->cached_buffer, 0, size); if (bytes) *bytes = GST_BUFFER_DATA (common->cached_buffer); return GST_FLOW_OK; } /* Not possible to get enough data, try a last time with * requesting exactly the size we need */ gst_buffer_unref (common->cached_buffer); common->cached_buffer = NULL; ret = gst_pad_pull_range (common->sinkpad, common->offset, size, &common->cached_buffer); if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (common, "pull_range returned %d", ret); if (p_buf) *p_buf = NULL; if (bytes) *bytes = NULL; return ret; } if (GST_BUFFER_SIZE (common->cached_buffer) < size) { GST_WARNING_OBJECT (common, "Dropping short buffer at offset %" G_GUINT64_FORMAT ": wanted %u bytes, got %u bytes", common->offset, size, GST_BUFFER_SIZE (common->cached_buffer)); gst_buffer_unref (common->cached_buffer); common->cached_buffer = NULL; if (p_buf) *p_buf = NULL; if (bytes) *bytes = NULL; return GST_FLOW_UNEXPECTED; } if (p_buf) *p_buf = gst_buffer_create_sub (common->cached_buffer, 0, size); if (bytes) *bytes = GST_BUFFER_DATA (common->cached_buffer); return GST_FLOW_OK; } static GstFlowReturn gst_matroska_read_common_peek_pull (GstMatroskaReadCommon * common, guint peek, guint8 ** data) { return gst_matroska_read_common_peek_bytes (common, common->offset, peek, NULL, data); } GstFlowReturn gst_matroska_read_common_peek_id_length_pull (GstMatroskaReadCommon * common, GstElement * el, guint32 * _id, guint64 * _length, guint * _needed) { return gst_ebml_peek_id_length (_id, _length, _needed, (GstPeekData) gst_matroska_read_common_peek_pull, (gpointer) common, el, common->offset); } GstFlowReturn gst_matroska_read_common_peek_id_length_push (GstMatroskaReadCommon * common, GstElement * el, guint32 * _id, guint64 * _length, guint * _needed) { return gst_ebml_peek_id_length (_id, _length, _needed, (GstPeekData) gst_matroska_read_common_peek_adapter, (gpointer) common, el, common->offset); } static GstFlowReturn gst_matroska_read_common_read_track_encoding (GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstMatroskaTrackContext * context) { GstMatroskaTrackEncoding enc = { 0, }; GstFlowReturn ret; guint32 id; DEBUG_ELEMENT_START (common, ebml, "ContentEncoding"); /* Set default values */ enc.scope = 1; /* All other default values are 0 */ if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "ContentEncoding", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_CONTENTENCODINGORDER:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (!gst_matroska_read_common_encoding_order_unique (context->encodings, num)) { GST_ERROR_OBJECT (common, "ContentEncodingOrder %" G_GUINT64_FORMAT "is not unique for track %d", num, context->num); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (common, "ContentEncodingOrder: %" G_GUINT64_FORMAT, num); enc.order = num; break; } case GST_MATROSKA_ID_CONTENTENCODINGSCOPE:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num > 7 && num == 0) { GST_ERROR_OBJECT (common, "Invalid ContentEncodingScope %" G_GUINT64_FORMAT, num); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (common, "ContentEncodingScope: %" G_GUINT64_FORMAT, num); enc.scope = num; break; } case GST_MATROSKA_ID_CONTENTENCODINGTYPE:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num > 1) { GST_ERROR_OBJECT (common, "Invalid ContentEncodingType %" G_GUINT64_FORMAT, num); ret = GST_FLOW_ERROR; break; } else if (num != 0) { GST_ERROR_OBJECT (common, "Encrypted tracks are not supported yet"); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (common, "ContentEncodingType: %" G_GUINT64_FORMAT, num); enc.type = num; break; } case GST_MATROSKA_ID_CONTENTCOMPRESSION:{ DEBUG_ELEMENT_START (common, ebml, "ContentCompression"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) break; while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_CONTENTCOMPALGO:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) { break; } if (num > 3) { GST_ERROR_OBJECT (common, "Invalid ContentCompAlgo %" G_GUINT64_FORMAT, num); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (common, "ContentCompAlgo: %" G_GUINT64_FORMAT, num); enc.comp_algo = num; break; } case GST_MATROSKA_ID_CONTENTCOMPSETTINGS:{ guint8 *data; guint64 size; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &size)) != GST_FLOW_OK) { break; } enc.comp_settings = data; enc.comp_settings_length = size; GST_DEBUG_OBJECT (common, "ContentCompSettings of size %" G_GUINT64_FORMAT, size); break; } default: GST_WARNING_OBJECT (common, "Unknown ContentCompression subelement 0x%x - ignoring", id); ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "ContentCompression", ret); break; } case GST_MATROSKA_ID_CONTENTENCRYPTION: GST_ERROR_OBJECT (common, "Encrypted tracks not yet supported"); gst_ebml_read_skip (ebml); ret = GST_FLOW_ERROR; break; default: GST_WARNING_OBJECT (common, "Unknown ContentEncoding subelement 0x%x - ignoring", id); ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "ContentEncoding", ret); if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) return ret; /* TODO: Check if the combination of values is valid */ g_array_append_val (context->encodings, enc); return ret; } GstFlowReturn gst_matroska_read_common_read_track_encodings (GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstMatroskaTrackContext * context) { GstFlowReturn ret; guint32 id; DEBUG_ELEMENT_START (common, ebml, "ContentEncodings"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (common, ebml, "ContentEncodings", ret); return ret; } context->encodings = g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaTrackEncoding), 1); while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_CONTENTENCODING: ret = gst_matroska_read_common_read_track_encoding (common, ebml, context); break; default: GST_WARNING_OBJECT (common, "Unknown ContentEncodings subelement 0x%x - ignoring", id); ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (common, ebml, "ContentEncodings", ret); if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) return ret; /* Sort encodings according to their order */ g_array_sort (context->encodings, (GCompareFunc) gst_matroska_read_common_encoding_cmp); return gst_matroska_decode_content_encodings (context->encodings); } /* call with object lock held */ void gst_matroska_read_common_reset_streams (GstMatroskaReadCommon * common, GstClockTime time, gboolean full) { gint i; GST_DEBUG_OBJECT (common, "resetting stream state"); g_assert (common->src->len == common->num_streams); for (i = 0; i < common->src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (common->src, i); context->pos = time; context->set_discont = TRUE; context->eos = FALSE; context->from_time = GST_CLOCK_TIME_NONE; if (full) context->last_flow = GST_FLOW_OK; if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) context; /* demux object lock held by caller */ videocontext->earliest_time = GST_CLOCK_TIME_NONE; } } } gboolean gst_matroska_read_common_tracknumber_unique (GstMatroskaReadCommon * common, guint64 num) { gint i; g_assert (common->src->len == common->num_streams); for (i = 0; i < common->src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (common->src, i); if (context->num == num) return FALSE; } return TRUE; } gst-plugins-good-0.10.31/gst/matroska/webm-mux.c0000644000175000017500000000700111677341656016340 00000000000000/* GStreamer WebM muxer * Copyright (c) 2010 Sebastian Dröge * * 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-webmmux * * webmmux muxes VP8 video and Vorbis audio streams into a WebM file. * * * Example launch line * |[ * gst-launch-0.10 webmmux name=mux ! filesink location=newfile.webm \ * uridecodebin uri=file:///path/to/somefile.ogv name=demux \ * demux. ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 \ * demux. ! progressreport ! audioconvert ! audiorate ! vorbisenc ! queue ! mux.audio_0 * ]| This pipeline re-encodes a video file of any format into a WebM file. * |[ * gst-launch-0.10 webmmux name=mux ! filesink location=test.webm \ * videotestsrc num-buffers=250 ! video/x-raw-yuv,framerate=25/1 ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 \ * audiotestsrc samplesperbuffer=44100 num-buffers=10 ! audio/x-raw-float,rate=44100 ! vorbisenc ! queue ! mux.audio_0 * ]| This pipeline muxes a test video and a sine wave into a WebM file. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "webm-mux.h" #define COMMON_VIDEO_CAPS \ "width = (int) [ 16, 4096 ], " \ "height = (int) [ 16, 4096 ], " \ "framerate = (fraction) [ 0, MAX ]" #define COMMON_AUDIO_CAPS \ "channels = (int) [ 1, MAX ], " \ "rate = (int) [ 1, MAX ]" GST_BOILERPLATE (GstWebMMux, gst_webm_mux, GstMatroskaMux, GST_TYPE_MATROSKA_MUX); static GstStaticPadTemplate webm_src_templ = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/webm") ); static GstStaticPadTemplate webm_videosink_templ = GST_STATIC_PAD_TEMPLATE ("video_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/x-vp8, " COMMON_VIDEO_CAPS) ); static GstStaticPadTemplate webm_audiosink_templ = GST_STATIC_PAD_TEMPLATE ("audio_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/x-vorbis, " COMMON_AUDIO_CAPS) ); static void gst_webm_mux_base_init (gpointer g_class) { } static void gst_webm_mux_class_init (GstWebMMuxClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; gst_element_class_add_static_pad_template (gstelement_class, &webm_videosink_templ); gst_element_class_add_static_pad_template (gstelement_class, &webm_audiosink_templ); gst_element_class_add_static_pad_template (gstelement_class, &webm_src_templ); gst_element_class_set_details_simple (gstelement_class, "WebM muxer", "Codec/Muxer", "Muxes video and audio streams into a WebM stream", "GStreamer maintainers "); } static void gst_webm_mux_init (GstWebMMux * mux, GstWebMMuxClass * g_class) { GST_MATROSKA_MUX (mux)->doctype = GST_MATROSKA_DOCTYPE_WEBM; } gst-plugins-good-0.10.31/gst/matroska/ebml-read.h0000644000175000017500000001345711677341655016447 00000000000000/* GStreamer EBML I/O * (c) 2003 Ronald Bultje * * ebml-read.c: read EBML data from file/stream * * 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_EBML_READ_H__ #define __GST_EBML_READ_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_EBML_READ \ (gst_ebml_read_get_type ()) #define GST_EBML_READ(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EBML_READ, GstEbmlRead)) #define GST_EBML_READ_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_READ, GstEbmlReadClass)) #define GST_IS_EBML_READ(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_READ)) #define GST_IS_EBML_READ_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_READ)) #define GST_EBML_READ_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_READ, GstEbmlReadClass)) GST_DEBUG_CATEGORY_EXTERN (ebmlread_debug); /* custom flow return code */ #define GST_FLOW_PARSE GST_FLOW_CUSTOM_ERROR typedef struct _GstEbmlMaster { guint64 offset; GstByteReader br; } GstEbmlMaster; typedef struct _GstEbmlRead { GstElement *el; GstBuffer *buf; guint64 offset; GArray *readers; } GstEbmlRead; typedef GstFlowReturn (*GstPeekData) (gpointer * context, guint peek, const guint8 ** data); /* returns UNEXPECTED if not enough data */ GstFlowReturn gst_ebml_peek_id_length (guint32 * _id, guint64 * _length, guint * _needed, GstPeekData peek, gpointer * ctx, GstElement * el, guint64 offset); void gst_ebml_read_init (GstEbmlRead * ebml, GstElement * el, GstBuffer * buf, guint64 offset); void gst_ebml_read_clear (GstEbmlRead * ebml); GstFlowReturn gst_ebml_peek_id (GstEbmlRead * ebml, guint32 * id); /* return _PARSE if not enough data to read what is needed, _ERROR or _OK */ GstFlowReturn gst_ebml_read_skip (GstEbmlRead *ebml); GstFlowReturn gst_ebml_read_buffer (GstEbmlRead *ebml, guint32 *id, GstBuffer **buf); GstFlowReturn gst_ebml_read_uint (GstEbmlRead *ebml, guint32 *id, guint64 *num); GstFlowReturn gst_ebml_read_sint (GstEbmlRead *ebml, guint32 *id, gint64 *num); GstFlowReturn gst_ebml_read_float (GstEbmlRead *ebml, guint32 *id, gdouble *num); GstFlowReturn gst_ebml_read_ascii (GstEbmlRead *ebml, guint32 *id, gchar **str); GstFlowReturn gst_ebml_read_utf8 (GstEbmlRead *ebml, guint32 *id, gchar **str); GstFlowReturn gst_ebml_read_date (GstEbmlRead *ebml, guint32 *id, gint64 *date); GstFlowReturn gst_ebml_read_master (GstEbmlRead *ebml, guint32 *id); GstFlowReturn gst_ebml_read_pop_master (GstEbmlRead *ebml); GstFlowReturn gst_ebml_read_binary (GstEbmlRead *ebml, guint32 *id, guint8 **binary, guint64 *length); GstFlowReturn gst_ebml_read_header (GstEbmlRead *read, gchar **doctype, guint *version); /* Returns current (absolute) position of Ebml parser, * i.e. taking into account offset provided at init */ static inline guint64 gst_ebml_read_get_pos (GstEbmlRead * ebml) { GstEbmlMaster *m; g_return_val_if_fail (ebml->readers, 0); g_return_val_if_fail (ebml->readers->len, 0); m = &(g_array_index (ebml->readers, GstEbmlMaster, ebml->readers->len - 1)); return m->offset + gst_byte_reader_get_pos (&m->br); } /* Returns starting offset of Ebml parser */ static inline guint64 gst_ebml_read_get_offset (GstEbmlRead * ebml) { return ebml->offset; } static inline GstByteReader * gst_ebml_read_br (GstEbmlRead * ebml) { g_return_val_if_fail (ebml->readers, NULL); g_return_val_if_fail (ebml->readers->len, NULL); return &(g_array_index (ebml->readers, GstEbmlMaster, ebml->readers->len - 1).br); } static inline gboolean gst_ebml_read_has_remaining (GstEbmlRead * ebml, guint64 bytes_needed, gboolean auto_pop) { gboolean res; res = (gst_byte_reader_get_remaining (gst_ebml_read_br (ebml)) >= bytes_needed); if (G_LIKELY (!res && auto_pop)) { gst_ebml_read_pop_master (ebml); } return G_LIKELY (res); } G_END_DECLS #endif /* __GST_EBML_READ_H__ */ gst-plugins-good-0.10.31/gst/matroska/Makefile.in0000644000175000017500000011674111720560234016474 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/matroska DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstmatroska_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstmatroska_la_OBJECTS = libgstmatroska_la-ebml-read.lo \ libgstmatroska_la-ebml-write.lo libgstmatroska_la-matroska.lo \ libgstmatroska_la-matroska-demux.lo \ libgstmatroska_la-matroska-parse.lo \ libgstmatroska_la-matroska-ids.lo \ libgstmatroska_la-matroska-mux.lo \ libgstmatroska_la-matroska-read-common.lo \ libgstmatroska_la-webm-mux.lo libgstmatroska_la-lzo.lo libgstmatroska_la_OBJECTS = $(am_libgstmatroska_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstmatroska_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstmatroska_la_CFLAGS) $(CFLAGS) \ $(libgstmatroska_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstmatroska_la_SOURCES) DIST_SOURCES = $(libgstmatroska_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstmatroska.la libgstmatroska_la_SOURCES = \ ebml-read.c \ ebml-write.c \ matroska.c \ matroska-demux.c \ matroska-parse.c \ matroska-ids.c \ matroska-mux.c \ matroska-read-common.c \ webm-mux.c \ lzo.c noinst_HEADERS = \ ebml-ids.h \ ebml-read.h \ ebml-write.h \ matroska-demux.h \ matroska-parse.h \ matroska-ids.h \ matroska-mux.h \ matroska-read-common.h \ webm-mux.h \ lzo.h libgstmatroska_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) libgstmatroska_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(ZLIB_LIBS) \ $(BZ2_LIBS) \ $(LIBM) libgstmatroska_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstmatroska_la_LIBTOOLFLAGS = --tag=disable-static all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/matroska/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/matroska/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstmatroska.la: $(libgstmatroska_la_OBJECTS) $(libgstmatroska_la_DEPENDENCIES) $(EXTRA_libgstmatroska_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstmatroska_la_LINK) -rpath $(plugindir) $(libgstmatroska_la_OBJECTS) $(libgstmatroska_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-ebml-read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-ebml-write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-lzo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-demux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-ids.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-mux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-parse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska-read-common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-matroska.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmatroska_la-webm-mux.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstmatroska_la-ebml-read.lo: ebml-read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-ebml-read.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-ebml-read.Tpo -c -o libgstmatroska_la-ebml-read.lo `test -f 'ebml-read.c' || echo '$(srcdir)/'`ebml-read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-ebml-read.Tpo $(DEPDIR)/libgstmatroska_la-ebml-read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ebml-read.c' object='libgstmatroska_la-ebml-read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-ebml-read.lo `test -f 'ebml-read.c' || echo '$(srcdir)/'`ebml-read.c libgstmatroska_la-ebml-write.lo: ebml-write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-ebml-write.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-ebml-write.Tpo -c -o libgstmatroska_la-ebml-write.lo `test -f 'ebml-write.c' || echo '$(srcdir)/'`ebml-write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-ebml-write.Tpo $(DEPDIR)/libgstmatroska_la-ebml-write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ebml-write.c' object='libgstmatroska_la-ebml-write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-ebml-write.lo `test -f 'ebml-write.c' || echo '$(srcdir)/'`ebml-write.c libgstmatroska_la-matroska.lo: matroska.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska.Tpo -c -o libgstmatroska_la-matroska.lo `test -f 'matroska.c' || echo '$(srcdir)/'`matroska.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska.Tpo $(DEPDIR)/libgstmatroska_la-matroska.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska.c' object='libgstmatroska_la-matroska.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska.lo `test -f 'matroska.c' || echo '$(srcdir)/'`matroska.c libgstmatroska_la-matroska-demux.lo: matroska-demux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-demux.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-demux.Tpo -c -o libgstmatroska_la-matroska-demux.lo `test -f 'matroska-demux.c' || echo '$(srcdir)/'`matroska-demux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-demux.Tpo $(DEPDIR)/libgstmatroska_la-matroska-demux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-demux.c' object='libgstmatroska_la-matroska-demux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-demux.lo `test -f 'matroska-demux.c' || echo '$(srcdir)/'`matroska-demux.c libgstmatroska_la-matroska-parse.lo: matroska-parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-parse.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-parse.Tpo -c -o libgstmatroska_la-matroska-parse.lo `test -f 'matroska-parse.c' || echo '$(srcdir)/'`matroska-parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-parse.Tpo $(DEPDIR)/libgstmatroska_la-matroska-parse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-parse.c' object='libgstmatroska_la-matroska-parse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-parse.lo `test -f 'matroska-parse.c' || echo '$(srcdir)/'`matroska-parse.c libgstmatroska_la-matroska-ids.lo: matroska-ids.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-ids.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-ids.Tpo -c -o libgstmatroska_la-matroska-ids.lo `test -f 'matroska-ids.c' || echo '$(srcdir)/'`matroska-ids.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-ids.Tpo $(DEPDIR)/libgstmatroska_la-matroska-ids.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-ids.c' object='libgstmatroska_la-matroska-ids.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-ids.lo `test -f 'matroska-ids.c' || echo '$(srcdir)/'`matroska-ids.c libgstmatroska_la-matroska-mux.lo: matroska-mux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-mux.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-mux.Tpo -c -o libgstmatroska_la-matroska-mux.lo `test -f 'matroska-mux.c' || echo '$(srcdir)/'`matroska-mux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-mux.Tpo $(DEPDIR)/libgstmatroska_la-matroska-mux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-mux.c' object='libgstmatroska_la-matroska-mux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-mux.lo `test -f 'matroska-mux.c' || echo '$(srcdir)/'`matroska-mux.c libgstmatroska_la-matroska-read-common.lo: matroska-read-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-matroska-read-common.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-matroska-read-common.Tpo -c -o libgstmatroska_la-matroska-read-common.lo `test -f 'matroska-read-common.c' || echo '$(srcdir)/'`matroska-read-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-matroska-read-common.Tpo $(DEPDIR)/libgstmatroska_la-matroska-read-common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='matroska-read-common.c' object='libgstmatroska_la-matroska-read-common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-matroska-read-common.lo `test -f 'matroska-read-common.c' || echo '$(srcdir)/'`matroska-read-common.c libgstmatroska_la-webm-mux.lo: webm-mux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-webm-mux.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-webm-mux.Tpo -c -o libgstmatroska_la-webm-mux.lo `test -f 'webm-mux.c' || echo '$(srcdir)/'`webm-mux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-webm-mux.Tpo $(DEPDIR)/libgstmatroska_la-webm-mux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webm-mux.c' object='libgstmatroska_la-webm-mux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-webm-mux.lo `test -f 'webm-mux.c' || echo '$(srcdir)/'`webm-mux.c libgstmatroska_la-lzo.lo: lzo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -MT libgstmatroska_la-lzo.lo -MD -MP -MF $(DEPDIR)/libgstmatroska_la-lzo.Tpo -c -o libgstmatroska_la-lzo.lo `test -f 'lzo.c' || echo '$(srcdir)/'`lzo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstmatroska_la-lzo.Tpo $(DEPDIR)/libgstmatroska_la-lzo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lzo.c' object='libgstmatroska_la-lzo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmatroska_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) $(CFLAGS) -c -o libgstmatroska_la-lzo.lo `test -f 'lzo.c' || echo '$(srcdir)/'`lzo.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstmatroska -:SHARED libgstmatroska \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstmatroska_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(libgstmatroska_la_CFLAGS) \ -:LDFLAGS $(libgstmatroska_la_LDFLAGS) \ $(libgstmatroska_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/matroska/matroska-ids.c0000644000175000017500000000720511677341655017202 00000000000000/* GStreamer Matroska muxer/demuxer * (C) 2003 Ronald Bultje * (C) 2006 Tim-Philipp Müller * * matroska-ids.c: matroska track context utility functions * * 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 "matroska-ids.h" gboolean gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context) { GstMatroskaTrackVideoContext *video_context; g_assert (p_context != NULL && *p_context != NULL); /* already set up? (track info might come before track type) */ if ((*p_context)->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { GST_LOG ("video context already set up"); return TRUE; } /* it better not have been set up as some other track type ... */ if ((*p_context)->type != 0) { g_return_val_if_reached (FALSE); } video_context = g_renew (GstMatroskaTrackVideoContext, *p_context, 1); *p_context = (GstMatroskaTrackContext *) video_context; /* defaults */ (*p_context)->type = GST_MATROSKA_TRACK_TYPE_VIDEO; video_context->display_width = 0; video_context->display_height = 0; video_context->pixel_width = 0; video_context->pixel_height = 0; video_context->asr_mode = 0; video_context->fourcc = 0; video_context->default_fps = 0.0; video_context->earliest_time = GST_CLOCK_TIME_NONE; return TRUE; } gboolean gst_matroska_track_init_audio_context (GstMatroskaTrackContext ** p_context) { GstMatroskaTrackAudioContext *audio_context; g_assert (p_context != NULL && *p_context != NULL); /* already set up? (track info might come before track type) */ if ((*p_context)->type == GST_MATROSKA_TRACK_TYPE_AUDIO) return TRUE; /* it better not have been set up as some other track type ... */ if ((*p_context)->type != 0) { g_return_val_if_reached (FALSE); } audio_context = g_renew (GstMatroskaTrackAudioContext, *p_context, 1); *p_context = (GstMatroskaTrackContext *) audio_context; /* defaults */ (*p_context)->type = GST_MATROSKA_TRACK_TYPE_AUDIO; audio_context->channels = 1; audio_context->samplerate = 8000; return TRUE; } gboolean gst_matroska_track_init_subtitle_context (GstMatroskaTrackContext ** p_context) { GstMatroskaTrackSubtitleContext *subtitle_context; g_assert (p_context != NULL && *p_context != NULL); /* already set up? (track info might come before track type) */ if ((*p_context)->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE) return TRUE; /* it better not have been set up as some other track type ... */ if ((*p_context)->type != 0) { g_return_val_if_reached (FALSE); } subtitle_context = g_renew (GstMatroskaTrackSubtitleContext, *p_context, 1); *p_context = (GstMatroskaTrackContext *) subtitle_context; (*p_context)->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE; subtitle_context->invalid_utf8 = FALSE; subtitle_context->seen_markup_tag = FALSE; return TRUE; } void gst_matroska_register_tags (void) { /* TODO: register other custom tags */ } gst-plugins-good-0.10.31/gst/matroska/ebml-read.c0000644000175000017500000003627411677341655016444 00000000000000/* GStreamer EBML I/O * (c) 2003 Ronald Bultje * * ebml-read.c: read EBML data from file/stream * * 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 #include "ebml-read.h" #include "ebml-ids.h" #include /* NAN is supposed to be in math.h, Microsoft defines it in xmath.h */ #ifdef _MSC_VER #include #endif /* If everything goes wrong try 0.0/0.0 which should be NAN */ #ifndef NAN #define NAN (0.0 / 0.0) #endif GST_DEBUG_CATEGORY (ebmlread_debug); #define GST_CAT_DEFAULT ebmlread_debug /* Peeks following element id and element length in datastream provided * by @peek with @ctx as user data. * Returns GST_FLOW_UNEXPECTED if not enough data to read id and length. * Otherwise, @needed provides the prefix length (id + length), and * @length provides element length. * * @object and @offset are provided for informative messaging/debug purposes. */ GstFlowReturn gst_ebml_peek_id_length (guint32 * _id, guint64 * _length, guint * _needed, GstPeekData peek, gpointer * ctx, GstElement * el, guint64 offset) { guint needed; const guint8 *buf; gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; guint64 total; guint8 b; GstFlowReturn ret; g_return_val_if_fail (_id != NULL, GST_FLOW_ERROR); g_return_val_if_fail (_length != NULL, GST_FLOW_ERROR); g_return_val_if_fail (_needed != NULL, GST_FLOW_ERROR); /* well ... */ *_id = (guint32) GST_EBML_SIZE_UNKNOWN; *_length = GST_EBML_SIZE_UNKNOWN; /* read element id */ needed = 2; ret = peek (ctx, needed, &buf); if (ret != GST_FLOW_OK) goto peek_error; b = GST_READ_UINT8 (buf); total = (guint64) b; while (read <= 4 && !(total & len_mask)) { read++; len_mask >>= 1; } if (G_UNLIKELY (read > 4)) goto invalid_id; /* need id and at least something for subsequent length */ needed = read + 1; ret = peek (ctx, needed, &buf); if (ret != GST_FLOW_OK) goto peek_error; while (n < read) { b = GST_READ_UINT8 (buf + n); total = (total << 8) | b; ++n; } *_id = (guint32) total; /* read element length */ b = GST_READ_UINT8 (buf + n); total = (guint64) b; len_mask = 0x80; read = 1; while (read <= 8 && !(total & len_mask)) { read++; len_mask >>= 1; } if (G_UNLIKELY (read > 8)) goto invalid_length; if ((total &= (len_mask - 1)) == len_mask - 1) num_ffs++; needed += read - 1; ret = peek (ctx, needed, &buf); if (ret != GST_FLOW_OK) goto peek_error; buf += (needed - read); n = 1; while (n < read) { guint8 b = GST_READ_UINT8 (buf + n); if (G_UNLIKELY (b == 0xff)) num_ffs++; total = (total << 8) | b; ++n; } if (G_UNLIKELY (read == num_ffs)) *_length = G_MAXUINT64; else *_length = total; *_needed = needed; return GST_FLOW_OK; /* ERRORS */ peek_error: { GST_WARNING_OBJECT (el, "peek failed, ret = %d", ret); *_needed = needed; return ret; } invalid_id: { GST_ERROR_OBJECT (el, "Invalid EBML ID size tag (0x%x) at position %" G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x)", (guint) b, offset, offset); return GST_FLOW_ERROR; } invalid_length: { GST_ERROR_OBJECT (el, "Invalid EBML length size tag (0x%x) at position %" G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x)", (guint) b, offset, offset); return GST_FLOW_ERROR; } } /* setup for parsing @buf at position @offset on behalf of @el. * Takes ownership of @buf. */ void gst_ebml_read_init (GstEbmlRead * ebml, GstElement * el, GstBuffer * buf, guint64 offset) { GstEbmlMaster m; g_return_if_fail (el); g_return_if_fail (buf); ebml->el = el; ebml->offset = offset; ebml->buf = buf; ebml->readers = g_array_sized_new (FALSE, FALSE, sizeof (GstEbmlMaster), 10); m.offset = ebml->offset; gst_byte_reader_init (&m.br, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); g_array_append_val (ebml->readers, m); } void gst_ebml_read_clear (GstEbmlRead * ebml) { if (ebml->readers) g_array_free (ebml->readers, TRUE); ebml->readers = NULL; if (ebml->buf) gst_buffer_unref (ebml->buf); ebml->buf = NULL; ebml->el = NULL; } static GstFlowReturn gst_ebml_read_peek (GstByteReader * br, guint peek, const guint8 ** data) { if (G_LIKELY (gst_byte_reader_peek_data (br, peek, data))) return GST_FLOW_OK; else return GST_FLOW_UNEXPECTED; } static GstFlowReturn gst_ebml_peek_id_full (GstEbmlRead * ebml, guint32 * id, guint64 * length, guint * prefix) { GstFlowReturn ret; ret = gst_ebml_peek_id_length (id, length, prefix, (GstPeekData) gst_ebml_read_peek, (gpointer) gst_ebml_read_br (ebml), ebml->el, gst_ebml_read_get_pos (ebml)); if (ret != GST_FLOW_OK) return ret; GST_LOG_OBJECT (ebml->el, "id 0x%x at offset 0x%" G_GINT64_MODIFIER "x" " of length %" G_GUINT64_FORMAT ", prefix %d", *id, gst_ebml_read_get_pos (ebml), *length, *prefix); #ifndef GST_DISABLE_GST_DEBUG { const guint8 *data = NULL; GstByteReader *br = gst_ebml_read_br (ebml); guint size = gst_byte_reader_get_remaining (br); gst_byte_reader_peek_data (br, size, &data); GST_LOG_OBJECT (ebml->el, "current br %p; remaining %d", br, size); if (data) GST_MEMDUMP_OBJECT (ebml->el, "element", data, MIN (size, *length)); } #endif return ret; } GstFlowReturn gst_ebml_peek_id (GstEbmlRead * ebml, guint32 * id) { guint64 length; guint needed; return gst_ebml_peek_id_full (ebml, id, &length, &needed); } /* * Read the next element, the contents are supposed to be sub-elements which * can be read separately. A new bytereader is setup for doing so. */ GstFlowReturn gst_ebml_read_master (GstEbmlRead * ebml, guint32 * id) { guint64 length; guint prefix; const guint8 *data = NULL; GstFlowReturn ret; GstEbmlMaster m; ret = gst_ebml_peek_id_full (ebml, id, &length, &prefix); if (ret != GST_FLOW_OK) return ret; /* we just at least peeked the id */ if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), prefix)) return GST_FLOW_ERROR; /* FIXME: do proper error handling */ m.offset = gst_ebml_read_get_pos (ebml); if (!gst_byte_reader_get_data (gst_ebml_read_br (ebml), length, &data)) return GST_FLOW_PARSE; GST_LOG_OBJECT (ebml->el, "pushing level %d at offset %" G_GUINT64_FORMAT, ebml->readers->len, m.offset); gst_byte_reader_init (&m.br, data, length); g_array_append_val (ebml->readers, m); return GST_FLOW_OK; } /* explicitly pop a bytereader from stack. Usually invoked automagically. */ GstFlowReturn gst_ebml_read_pop_master (GstEbmlRead * ebml) { g_return_val_if_fail (ebml->readers, GST_FLOW_ERROR); /* never remove initial bytereader */ if (ebml->readers->len > 1) { GST_LOG_OBJECT (ebml->el, "popping level %d", ebml->readers->len - 1); g_array_remove_index (ebml->readers, ebml->readers->len - 1); } return GST_FLOW_OK; } /* * Skip the next element. */ GstFlowReturn gst_ebml_read_skip (GstEbmlRead * ebml) { guint64 length; guint32 id; guint prefix; GstFlowReturn ret; ret = gst_ebml_peek_id_full (ebml, &id, &length, &prefix); if (ret != GST_FLOW_OK) return ret; if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), length + prefix)) return GST_FLOW_PARSE; return ret; } /* * Read the next element as a GstBuffer (binary). */ GstFlowReturn gst_ebml_read_buffer (GstEbmlRead * ebml, guint32 * id, GstBuffer ** buf) { guint64 length; guint prefix; GstFlowReturn ret; ret = gst_ebml_peek_id_full (ebml, id, &length, &prefix); if (ret != GST_FLOW_OK) return ret; /* we just at least peeked the id */ if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), prefix)) return GST_FLOW_ERROR; /* FIXME: do proper error handling */ if (G_LIKELY (length > 0)) { guint offset; offset = gst_ebml_read_get_pos (ebml) - ebml->offset; if (G_LIKELY (gst_byte_reader_skip (gst_ebml_read_br (ebml), length))) { *buf = gst_buffer_create_sub (ebml->buf, offset, length); } else { *buf = NULL; return GST_FLOW_PARSE; } } else { *buf = gst_buffer_new (); } return ret; } /* * Read the next element, return a pointer to it and its size. */ static GstFlowReturn gst_ebml_read_bytes (GstEbmlRead * ebml, guint32 * id, const guint8 ** data, guint * size) { guint64 length; guint prefix; GstFlowReturn ret; *size = 0; ret = gst_ebml_peek_id_full (ebml, id, &length, &prefix); if (ret != GST_FLOW_OK) return ret; /* we just at least peeked the id */ if (!gst_byte_reader_skip (gst_ebml_read_br (ebml), prefix)) return GST_FLOW_ERROR; /* FIXME: do proper error handling */ *data = NULL; if (G_LIKELY (length >= 0)) { if (!gst_byte_reader_get_data (gst_ebml_read_br (ebml), length, data)) return GST_FLOW_PARSE; } *size = length; return ret; } /* * Read the next element as an unsigned int. */ GstFlowReturn gst_ebml_read_uint (GstEbmlRead * ebml, guint32 * id, guint64 * num) { const guint8 *data; guint size; GstFlowReturn ret; ret = gst_ebml_read_bytes (ebml, id, &data, &size); if (ret != GST_FLOW_OK) return ret; if (size > 8) { GST_ERROR_OBJECT (ebml->el, "Invalid integer element size %d at position %" G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x)", size, gst_ebml_read_get_pos (ebml) - size, gst_ebml_read_get_pos (ebml) - size); return GST_FLOW_ERROR; } if (size == 0) { *num = 0; return ret; } *num = 0; while (size > 0) { *num = (*num << 8) | *data; size--; data++; } return ret; } /* * Read the next element as a signed int. */ GstFlowReturn gst_ebml_read_sint (GstEbmlRead * ebml, guint32 * id, gint64 * num) { const guint8 *data; guint size; gboolean negative = 0; GstFlowReturn ret; ret = gst_ebml_read_bytes (ebml, id, &data, &size); if (ret != GST_FLOW_OK) return ret; if (size > 8) { GST_ERROR_OBJECT (ebml->el, "Invalid integer element size %d at position %" G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x)", size, gst_ebml_read_get_pos (ebml) - size, gst_ebml_read_get_pos (ebml) - size); return GST_FLOW_ERROR; } if (size == 0) { *num = 0; return ret; } *num = 0; if (*data & 0x80) { negative = 1; *num = *data & ~0x80; size--; data++; } while (size > 0) { *num = (*num << 8) | *data; size--; data++; } /* make signed */ if (negative) { *num = 0 - *num; } return ret; } /* Convert 80 bit extended precision float in big endian format to double. * Code taken from libavutil/intfloat_readwrite.c from ffmpeg, * licensed under LGPL */ struct _ext_float { guint8 exponent[2]; guint8 mantissa[8]; }; static gdouble _ext2dbl (const guint8 * data) { struct _ext_float ext; guint64 m = 0; gint e, i; memcpy (&ext.exponent, data, 2); memcpy (&ext.mantissa, data + 2, 8); for (i = 0; i < 8; i++) m = (m << 8) + ext.mantissa[i]; e = (((gint) ext.exponent[0] & 0x7f) << 8) | ext.exponent[1]; if (e == 0x7fff && m) return NAN; e -= 16383 + 63; /* In IEEE 80 bits, the whole (i.e. 1.xxxx) * mantissa bit is written as opposed to the * single and double precision formats */ if (ext.exponent[0] & 0x80) m = -m; return ldexp (m, e); } /* * Read the next element as a float. */ GstFlowReturn gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num) { const guint8 *data; guint size; GstFlowReturn ret; ret = gst_ebml_read_bytes (ebml, id, &data, &size); if (ret != GST_FLOW_OK) return ret; if (size != 0 && size != 4 && size != 8 && size != 10) { GST_ERROR_OBJECT (ebml->el, "Invalid float element size %d at position %" G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x)", size, gst_ebml_read_get_pos (ebml) - size, gst_ebml_read_get_pos (ebml) - size); return GST_FLOW_ERROR; } if (size == 4) { gfloat f; memcpy (&f, data, 4); f = GFLOAT_FROM_BE (f); *num = f; } else if (size == 8) { gdouble d; memcpy (&d, data, 8); d = GDOUBLE_FROM_BE (d); *num = d; } else if (size == 10) { *num = _ext2dbl (data); } else { /* size == 0 means a value of 0.0 */ *num = 0.0; } return ret; } /* * Read the next element as a C string. */ static GstFlowReturn gst_ebml_read_string (GstEbmlRead * ebml, guint32 * id, gchar ** str) { const guint8 *data; guint size; GstFlowReturn ret; ret = gst_ebml_read_bytes (ebml, id, &data, &size); if (ret != GST_FLOW_OK) return ret; *str = g_malloc (size + 1); memcpy (*str, data, size); (*str)[size] = '\0'; return ret; } /* * Read the next element as an ASCII string. */ GstFlowReturn gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str_out) { GstFlowReturn ret; gchar *str; gchar *iter; #ifndef GST_DISABLE_GST_DEBUG guint64 oldoff = ebml->offset; #endif ret = gst_ebml_read_string (ebml, id, &str); if (ret != GST_FLOW_OK) return ret; for (iter = str; *iter != '\0'; iter++) { if (G_UNLIKELY (*iter & 0x80)) { GST_ERROR_OBJECT (ebml, "Invalid ASCII string at offset %" G_GUINT64_FORMAT, oldoff); g_free (str); return GST_FLOW_ERROR; } } *str_out = str; return ret; } /* * Read the next element as a UTF-8 string. */ GstFlowReturn gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str) { GstFlowReturn ret; #ifndef GST_DISABLE_GST_DEBUG guint64 oldoff = gst_ebml_read_get_pos (ebml); #endif ret = gst_ebml_read_string (ebml, id, str); if (ret != GST_FLOW_OK) return ret; if (str != NULL && *str != NULL && **str != '\0' && !g_utf8_validate (*str, -1, NULL)) { GST_WARNING_OBJECT (ebml->el, "Invalid UTF-8 string at offset %" G_GUINT64_FORMAT, oldoff); } return ret; } /* * Read the next element as a date. * Returns the seconds since the unix epoch. */ GstFlowReturn gst_ebml_read_date (GstEbmlRead * ebml, guint32 * id, gint64 * date) { gint64 ebml_date; GstFlowReturn ret; ret = gst_ebml_read_sint (ebml, id, &ebml_date); if (ret != GST_FLOW_OK) return ret; *date = (ebml_date / GST_SECOND) + GST_EBML_DATE_OFFSET; return ret; } /* * Read the next element as binary data. */ GstFlowReturn gst_ebml_read_binary (GstEbmlRead * ebml, guint32 * id, guint8 ** binary, guint64 * length) { const guint8 *data; guint size; GstFlowReturn ret; ret = gst_ebml_read_bytes (ebml, id, &data, &size); if (ret != GST_FLOW_OK) return ret; *length = size; *binary = g_memdup (data, size); return GST_FLOW_OK; } gst-plugins-good-0.10.31/gst/matroska/lzo.h0000644000175000017500000000216011671175353015402 00000000000000/* * LZO 1x decompression * copyright (c) 2006 Reimar Doeffinger * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef FFMPEG_LZO_H #define FFMPEG_LZO_H #define LZO_INPUT_DEPLETED 1 #define LZO_OUTPUT_FULL 2 #define LZO_INVALID_BACKPTR 4 #define LZO_ERROR 8 #define LZO_INPUT_PADDING 8 #define LZO_OUTPUT_PADDING 12 int lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); #endif /* FFMPEG_LZO_H */ gst-plugins-good-0.10.31/gst/matroska/matroska-read-common.h0000644000175000017500000001244611677341655020634 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2011 Debarshi Ray * * matroska-read-common.h: shared by matroska file/stream demuxer and parser * * 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_MATROSKA_READ_COMMON_H__ #define __GST_MATROSKA_READ_COMMON_H__ #include #include #include #include "matroska-ids.h" G_BEGIN_DECLS GST_DEBUG_CATEGORY_EXTERN(matroskareadcommon_debug); typedef enum { GST_MATROSKA_READ_STATE_START, GST_MATROSKA_READ_STATE_SEGMENT, GST_MATROSKA_READ_STATE_HEADER, GST_MATROSKA_READ_STATE_DATA, GST_MATROSKA_READ_STATE_SEEK, GST_MATROSKA_READ_STATE_SCANNING } GstMatroskaReadState; typedef struct _GstMatroskaReadCommon { GstIndex *element_index; gint element_index_writer_id; /* pads */ GstPad *sinkpad; GPtrArray *src; guint num_streams; /* metadata */ gchar *muxing_app; gchar *writing_app; gint64 created; /* state */ GstMatroskaReadState state; /* did we parse cues/tracks/segmentinfo already? */ gboolean index_parsed; gboolean segmentinfo_parsed; gboolean attachments_parsed; GList *tags_parsed; /* start-of-segment */ guint64 ebml_segment_start; /* a cue (index) table */ GArray *index; /* timescale in the file */ guint64 time_scale; /* keeping track of playback position */ GstSegment segment; GstTagList *global_tags; /* pull mode caching */ GstBuffer *cached_buffer; /* push and pull mode */ guint64 offset; /* push based mode usual suspects */ GstAdapter *adapter; } GstMatroskaReadCommon; GstFlowReturn gst_matroska_decode_content_encodings (GArray * encodings); gboolean gst_matroska_decode_data (GArray * encodings, guint8 ** data_out, guint * size_out, GstMatroskaTrackEncodingScope scope, gboolean free); gint gst_matroska_index_seek_find (GstMatroskaIndex * i1, GstClockTime * time, gpointer user_data); GstMatroskaIndex * gst_matroska_read_common_do_index_seek ( GstMatroskaReadCommon * common, GstMatroskaTrackContext * track, gint64 seek_pos, GArray ** _index, gint * _entry_index); void gst_matroska_read_common_found_global_tag (GstMatroskaReadCommon * common, GstElement * el, GstTagList * taglist); gint64 gst_matroska_read_common_get_length (GstMatroskaReadCommon * common); GstMatroskaTrackContext * gst_matroska_read_common_get_seek_track ( GstMatroskaReadCommon * common, GstMatroskaTrackContext * track); GstFlowReturn gst_matroska_read_common_parse_index (GstMatroskaReadCommon * common, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_info (GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_attachments ( GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_chapters (GstMatroskaReadCommon * common, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_metadata (GstMatroskaReadCommon * common, GstElement * el, GstEbmlRead * ebml); GstFlowReturn gst_matroska_read_common_parse_skip (GstMatroskaReadCommon * common, GstEbmlRead * ebml, const gchar * parent_name, guint id); GstFlowReturn gst_matroska_read_common_peek_bytes (GstMatroskaReadCommon * common, guint64 offset, guint size, GstBuffer ** p_buf, guint8 ** bytes); GstFlowReturn gst_matroska_read_common_peek_id_length_pull (GstMatroskaReadCommon * common, GstElement * el, guint32 * _id, guint64 * _length, guint * _needed); GstFlowReturn gst_matroska_read_common_peek_id_length_push (GstMatroskaReadCommon * common, GstElement * el, guint32 * _id, guint64 * _length, guint * _needed); gint gst_matroska_read_common_stream_from_num (GstMatroskaReadCommon * common, guint track_num); GstFlowReturn gst_matroska_read_common_read_track_encodings ( GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstMatroskaTrackContext * context); void gst_matroska_read_common_reset_streams (GstMatroskaReadCommon * common, GstClockTime time, gboolean full); gboolean gst_matroska_read_common_tracknumber_unique (GstMatroskaReadCommon * common, guint64 num); G_END_DECLS #endif /* __GST_MATROSKA_READ_COMMON_H__ */ gst-plugins-good-0.10.31/gst/matroska/matroska-demux.c0000644000175000017500000054732311717041666017551 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2006 Tim-Philipp Müller * (c) 2008 Sebastian Dröge * (c) 2011 Debarshi Ray * * matroska-demux.c: matroska file/stream demuxer * * 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. */ /* TODO: check CRC32 if present * TODO: there can be a segment after the first segment. Handle like * chained oggs. Fixes #334082 * TODO: Test samples: http://www.matroska.org/samples/matrix/index.html * http://samples.mplayerhq.hu/Matroska/ * TODO: check if demuxing is done correct for all codecs according to spec * TODO: seeking with incomplete or without CUE */ /** * SECTION:element-matroskademux * * matroskademux demuxes a Matroska file into the different contained streams. * * * Example launch line * |[ * gst-launch -v filesrc location=/path/to/mkv ! matroskademux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink * ]| This pipeline demuxes a Matroska file and outputs the contained Vorbis audio. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include /* For AVI compatibility mode and for fourcc stuff */ #include #include #include #include #include #include "matroska-demux.h" #include "matroska-ids.h" GST_DEBUG_CATEGORY_STATIC (matroskademux_debug); #define GST_CAT_DEFAULT matroskademux_debug #define DEBUG_ELEMENT_START(demux, ebml, element) \ GST_DEBUG_OBJECT (demux, "Parsing " element " element at offset %" \ G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml)) #define DEBUG_ELEMENT_STOP(demux, ebml, element, ret) \ GST_DEBUG_OBJECT (demux, "Parsing " element " element " \ " finished with '%s'", gst_flow_get_name (ret)) enum { ARG_0, ARG_METADATA, ARG_STREAMINFO, ARG_MAX_GAP_TIME }; #define DEFAULT_MAX_GAP_TIME (2 * GST_SECOND) static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-matroska; video/webm") ); /* TODO: fill in caps! */ static GstStaticPadTemplate audio_src_templ = GST_STATIC_PAD_TEMPLATE ("audio_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("ANY") ); static GstStaticPadTemplate video_src_templ = GST_STATIC_PAD_TEMPLATE ("video_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("ANY") ); static GstStaticPadTemplate subtitle_src_templ = GST_STATIC_PAD_TEMPLATE ("subtitle_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("text/x-pango-markup; application/x-ssa; " "application/x-ass;application/x-usf; video/x-dvd-subpicture; " "subpicture/x-pgs; subtitle/x-kate; " "application/x-subtitle-unknown") ); static GstFlowReturn gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id, guint64 length, guint needed); /* element functions */ static void gst_matroska_demux_loop (GstPad * pad); static gboolean gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event); static gboolean gst_matroska_demux_element_query (GstElement * element, GstQuery * query); /* pad functions */ static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad, gboolean active); static gboolean gst_matroska_demux_sink_activate (GstPad * sinkpad); static gboolean gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, GstPad * pad, GstEvent * event); static gboolean gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event); static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad * pad); static gboolean gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query); static gboolean gst_matroska_demux_handle_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_matroska_demux_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_matroska_demux_change_state (GstElement * element, GstStateChange transition); static void gst_matroska_demux_set_index (GstElement * element, GstIndex * index); static GstIndex *gst_matroska_demux_get_index (GstElement * element); /* caps functions */ static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext * videocontext, const gchar * codec_id, guint8 * data, guint size, gchar ** codec_name, guint32 * riff_fourcc); static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * audiocontext, const gchar * codec_id, guint8 * data, guint size, gchar ** codec_name, guint16 * riff_audio_fmt); static GstCaps * gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * subtitlecontext, const gchar * codec_id, gpointer data, guint size); /* stream methods */ static void gst_matroska_demux_reset (GstElement * element); static gboolean perform_seek_to_offset (GstMatroskaDemux * demux, guint64 offset); /* gobject functions */ static void gst_matroska_demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_matroska_demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GType gst_matroska_demux_get_type (void); GST_BOILERPLATE (GstMatroskaDemux, gst_matroska_demux, GstElement, GST_TYPE_ELEMENT); static void gst_matroska_demux_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &video_src_templ); gst_element_class_add_static_pad_template (element_class, &audio_src_templ); gst_element_class_add_static_pad_template (element_class, &subtitle_src_templ); gst_element_class_add_static_pad_template (element_class, &sink_templ); gst_element_class_set_details_simple (element_class, "Matroska demuxer", "Codec/Demuxer", "Demuxes Matroska/WebM streams into video/audio/subtitles", "GStreamer maintainers "); } static void gst_matroska_demux_finalize (GObject * object) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (object); if (demux->common.src) { g_ptr_array_free (demux->common.src, TRUE); demux->common.src = NULL; } if (demux->common.global_tags) { gst_tag_list_free (demux->common.global_tags); demux->common.global_tags = NULL; } g_object_unref (demux->common.adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; GST_DEBUG_CATEGORY_INIT (matroskademux_debug, "matroskademux", 0, "Matroska demuxer"); gobject_class->finalize = gst_matroska_demux_finalize; gobject_class->get_property = gst_matroska_demux_get_property; gobject_class->set_property = gst_matroska_demux_set_property; g_object_class_install_property (gobject_class, ARG_MAX_GAP_TIME, g_param_spec_uint64 ("max-gap-time", "Maximum gap time", "The demuxer sends out newsegment events for skipping " "gaps longer than this (0 = disabled).", 0, G_MAXUINT64, DEFAULT_MAX_GAP_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_matroska_demux_change_state); gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_matroska_demux_element_send_event); gstelement_class->query = GST_DEBUG_FUNCPTR (gst_matroska_demux_element_query); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_matroska_demux_set_index); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_matroska_demux_get_index); } static void gst_matroska_demux_init (GstMatroskaDemux * demux, GstMatroskaDemuxClass * klass) { demux->common.sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); gst_pad_set_activate_function (demux->common.sinkpad, GST_DEBUG_FUNCPTR (gst_matroska_demux_sink_activate)); gst_pad_set_activatepull_function (demux->common.sinkpad, GST_DEBUG_FUNCPTR (gst_matroska_demux_sink_activate_pull)); gst_pad_set_chain_function (demux->common.sinkpad, GST_DEBUG_FUNCPTR (gst_matroska_demux_chain)); gst_pad_set_event_function (demux->common.sinkpad, GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_sink_event)); gst_element_add_pad (GST_ELEMENT (demux), demux->common.sinkpad); /* initial stream no. */ demux->common.src = NULL; demux->common.writing_app = NULL; demux->common.muxing_app = NULL; demux->common.index = NULL; demux->common.global_tags = NULL; demux->common.adapter = gst_adapter_new (); /* property defaults */ demux->max_gap_time = DEFAULT_MAX_GAP_TIME; /* finish off */ gst_matroska_demux_reset (GST_ELEMENT (demux)); } static void gst_matroska_track_free (GstMatroskaTrackContext * track) { g_free (track->codec_id); g_free (track->codec_name); g_free (track->name); g_free (track->language); g_free (track->codec_priv); g_free (track->codec_state); if (track->encodings != NULL) { int i; for (i = 0; i < track->encodings->len; ++i) { GstMatroskaTrackEncoding *enc = &g_array_index (track->encodings, GstMatroskaTrackEncoding, i); g_free (enc->comp_settings); } g_array_free (track->encodings, TRUE); } if (track->pending_tags) gst_tag_list_free (track->pending_tags); if (track->index_table) g_array_free (track->index_table, TRUE); g_free (track); } /* * Returns the aggregated GstFlowReturn. */ static GstFlowReturn gst_matroska_demux_combine_flows (GstMatroskaDemux * demux, GstMatroskaTrackContext * track, GstFlowReturn ret) { guint i; /* store the value */ track->last_flow = ret; /* any other error that is not-linked can be returned right away */ if (ret != GST_FLOW_NOT_LINKED) goto done; /* only return NOT_LINKED if all other pads returned NOT_LINKED */ g_assert (demux->common.src->len == demux->common.num_streams); for (i = 0; i < demux->common.src->len; i++) { GstMatroskaTrackContext *ostream = g_ptr_array_index (demux->common.src, i); if (ostream == NULL) continue; ret = ostream->last_flow; /* some other return value (must be SUCCESS but we can return * other values as well) */ if (ret != GST_FLOW_NOT_LINKED) goto done; } /* if we get here, all other pads were unlinked and we return * NOT_LINKED then */ done: GST_LOG_OBJECT (demux, "combined return %s", gst_flow_get_name (ret)); return ret; } static void gst_matroska_demux_free_parsed_el (gpointer mem, gpointer user_data) { g_slice_free (guint64, mem); } static void gst_matroska_demux_reset (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); guint i; GST_DEBUG_OBJECT (demux, "Resetting state"); /* reset input */ demux->common.state = GST_MATROSKA_READ_STATE_START; /* clean up existing streams */ if (demux->common.src) { g_assert (demux->common.src->len == demux->common.num_streams); for (i = 0; i < demux->common.src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, i); if (context->pad != NULL) gst_element_remove_pad (GST_ELEMENT (demux), context->pad); gst_caps_replace (&context->caps, NULL); gst_matroska_track_free (context); } g_ptr_array_free (demux->common.src, TRUE); } demux->common.src = g_ptr_array_new (); demux->common.num_streams = 0; demux->num_a_streams = 0; demux->num_t_streams = 0; demux->num_v_streams = 0; /* reset media info */ g_free (demux->common.writing_app); demux->common.writing_app = NULL; g_free (demux->common.muxing_app); demux->common.muxing_app = NULL; /* reset indexes */ if (demux->common.index) { g_array_free (demux->common.index, TRUE); demux->common.index = NULL; } if (demux->clusters) { g_array_free (demux->clusters, TRUE); demux->clusters = NULL; } /* reset timers */ demux->clock = NULL; demux->common.time_scale = 1000000; demux->common.created = G_MININT64; demux->common.index_parsed = FALSE; demux->tracks_parsed = FALSE; demux->common.segmentinfo_parsed = FALSE; demux->common.attachments_parsed = FALSE; g_list_foreach (demux->common.tags_parsed, (GFunc) gst_matroska_demux_free_parsed_el, NULL); g_list_free (demux->common.tags_parsed); demux->common.tags_parsed = NULL; g_list_foreach (demux->seek_parsed, (GFunc) gst_matroska_demux_free_parsed_el, NULL); g_list_free (demux->seek_parsed); demux->seek_parsed = NULL; gst_segment_init (&demux->common.segment, GST_FORMAT_TIME); demux->last_stop_end = GST_CLOCK_TIME_NONE; demux->seek_block = 0; demux->stream_start_time = GST_CLOCK_TIME_NONE; demux->common.offset = 0; demux->cluster_time = GST_CLOCK_TIME_NONE; demux->cluster_offset = 0; demux->next_cluster_offset = 0; demux->index_offset = 0; demux->seekable = FALSE; demux->need_newsegment = FALSE; demux->building_index = FALSE; if (demux->seek_event) { gst_event_unref (demux->seek_event); demux->seek_event = NULL; } demux->seek_index = NULL; demux->seek_entry = 0; if (demux->close_segment) { gst_event_unref (demux->close_segment); demux->close_segment = NULL; } if (demux->new_segment) { gst_event_unref (demux->new_segment); demux->new_segment = NULL; } if (demux->common.element_index) { gst_object_unref (demux->common.element_index); demux->common.element_index = NULL; } demux->common.element_index_writer_id = -1; if (demux->common.global_tags) { gst_tag_list_free (demux->common.global_tags); } demux->common.global_tags = gst_tag_list_new (); if (demux->common.cached_buffer) { gst_buffer_unref (demux->common.cached_buffer); demux->common.cached_buffer = NULL; } demux->invalid_duration = FALSE; } static GstBuffer * gst_matroska_decode_buffer (GstMatroskaTrackContext * context, GstBuffer * buf) { guint8 *data; guint size; GstBuffer *new_buf; g_return_val_if_fail (GST_IS_BUFFER (buf), NULL); GST_DEBUG ("decoding buffer %p", buf); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); g_return_val_if_fail (data != NULL && size > 0, buf); if (gst_matroska_decode_data (context->encodings, &data, &size, GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME, FALSE)) { new_buf = gst_buffer_new (); GST_BUFFER_MALLOCDATA (new_buf) = (guint8 *) data; GST_BUFFER_DATA (new_buf) = (guint8 *) data; GST_BUFFER_SIZE (new_buf) = size; gst_buffer_unref (buf); buf = new_buf; return buf; } else { GST_DEBUG ("decode data failed"); gst_buffer_unref (buf); return NULL; } } static GstFlowReturn gst_matroska_demux_add_stream (GstMatroskaDemux * demux, GstEbmlRead * ebml) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); GstMatroskaTrackContext *context; GstPadTemplate *templ = NULL; GstCaps *caps = NULL; gchar *padname = NULL; GstFlowReturn ret; guint32 id, riff_fourcc = 0; guint16 riff_audio_fmt = 0; GstTagList *list = NULL; gchar *codec = NULL; DEBUG_ELEMENT_START (demux, ebml, "TrackEntry"); /* start with the master */ if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (demux, ebml, "TrackEntry", ret); return ret; } /* allocate generic... if we know the type, we'll g_renew() * with the precise type */ context = g_new0 (GstMatroskaTrackContext, 1); g_ptr_array_add (demux->common.src, context); context->index = demux->common.num_streams; context->index_writer_id = -1; context->type = 0; /* no type yet */ context->default_duration = 0; context->pos = 0; context->set_discont = TRUE; context->timecodescale = 1.0; context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT | GST_MATROSKA_TRACK_LACING; context->last_flow = GST_FLOW_OK; context->to_offset = G_MAXINT64; context->alignment = 1; demux->common.num_streams++; g_assert (demux->common.src->len == demux->common.num_streams); GST_DEBUG_OBJECT (demux, "Stream number %d", context->index); /* try reading the trackentry headers */ while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* track number (unique stream ID) */ case GST_MATROSKA_ID_TRACKNUMBER:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_ERROR_OBJECT (demux, "Invalid TrackNumber 0"); ret = GST_FLOW_ERROR; break; } else if (!gst_matroska_read_common_tracknumber_unique (&demux->common, num)) { GST_ERROR_OBJECT (demux, "TrackNumber %" G_GUINT64_FORMAT " is not unique", num); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (demux, "TrackNumber: %" G_GUINT64_FORMAT, num); context->num = num; break; } /* track UID (unique identifier) */ case GST_MATROSKA_ID_TRACKUID:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_ERROR_OBJECT (demux, "Invalid TrackUID 0"); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (demux, "TrackUID: %" G_GUINT64_FORMAT, num); context->uid = num; break; } /* track type (video, audio, combined, subtitle, etc.) */ case GST_MATROSKA_ID_TRACKTYPE:{ guint64 track_type; if ((ret = gst_ebml_read_uint (ebml, &id, &track_type)) != GST_FLOW_OK) { break; } if (context->type != 0 && context->type != track_type) { GST_WARNING_OBJECT (demux, "More than one tracktype defined in a TrackEntry - skipping"); break; } else if (track_type < 1 || track_type > 254) { GST_WARNING_OBJECT (demux, "Invalid TrackType %" G_GUINT64_FORMAT, track_type); break; } GST_DEBUG_OBJECT (demux, "TrackType: %" G_GUINT64_FORMAT, track_type); /* ok, so we're actually going to reallocate this thing */ switch (track_type) { case GST_MATROSKA_TRACK_TYPE_VIDEO: gst_matroska_track_init_video_context (&context); break; case GST_MATROSKA_TRACK_TYPE_AUDIO: gst_matroska_track_init_audio_context (&context); break; case GST_MATROSKA_TRACK_TYPE_SUBTITLE: gst_matroska_track_init_subtitle_context (&context); break; case GST_MATROSKA_TRACK_TYPE_COMPLEX: case GST_MATROSKA_TRACK_TYPE_LOGO: case GST_MATROSKA_TRACK_TYPE_BUTTONS: case GST_MATROSKA_TRACK_TYPE_CONTROL: default: GST_WARNING_OBJECT (demux, "Unknown or unsupported TrackType %" G_GUINT64_FORMAT, track_type); context->type = 0; break; } g_ptr_array_index (demux->common.src, demux->common.num_streams - 1) = context; break; } /* tracktype specific stuff for video */ case GST_MATROSKA_ID_TRACKVIDEO:{ GstMatroskaTrackVideoContext *videocontext; DEBUG_ELEMENT_START (demux, ebml, "TrackVideo"); if (!gst_matroska_track_init_video_context (&context)) { GST_WARNING_OBJECT (demux, "TrackVideo element in non-video track - ignoring track"); ret = GST_FLOW_ERROR; break; } else if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { break; } videocontext = (GstMatroskaTrackVideoContext *) context; g_ptr_array_index (demux->common.src, demux->common.num_streams - 1) = context; while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* Should be one level up but some broken muxers write it here. */ case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackDefaultDuration 0"); break; } GST_DEBUG_OBJECT (demux, "TrackDefaultDuration: %" G_GUINT64_FORMAT, num); context->default_duration = num; break; } /* video framerate */ /* NOTE: This one is here only for backward compatibility. * Use _TRACKDEFAULDURATION one level up. */ case GST_MATROSKA_ID_VIDEOFRAMERATE:{ gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) break; if (num <= 0.0) { GST_WARNING_OBJECT (demux, "Invalid TrackVideoFPS %lf", num); break; } GST_DEBUG_OBJECT (demux, "TrackVideoFrameRate: %lf", num); if (context->default_duration == 0) context->default_duration = gst_gdouble_to_guint64 ((gdouble) GST_SECOND * (1.0 / num)); videocontext->default_fps = num; break; } /* width of the size to display the video at */ case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackVideoDisplayWidth 0"); break; } GST_DEBUG_OBJECT (demux, "TrackVideoDisplayWidth: %" G_GUINT64_FORMAT, num); videocontext->display_width = num; break; } /* height of the size to display the video at */ case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackVideoDisplayHeight 0"); break; } GST_DEBUG_OBJECT (demux, "TrackVideoDisplayHeight: %" G_GUINT64_FORMAT, num); videocontext->display_height = num; break; } /* width of the video in the file */ case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackVideoPixelWidth 0"); break; } GST_DEBUG_OBJECT (demux, "TrackVideoPixelWidth: %" G_GUINT64_FORMAT, num); videocontext->pixel_width = num; break; } /* height of the video in the file */ case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackVideoPixelHeight 0"); break; } GST_DEBUG_OBJECT (demux, "TrackVideoPixelHeight: %" G_GUINT64_FORMAT, num); videocontext->pixel_height = num; break; } /* whether the video is interlaced */ case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; else context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; GST_DEBUG_OBJECT (demux, "TrackVideoInterlaced: %d", (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 : 0); break; } /* aspect ratio behaviour */ case GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { GST_WARNING_OBJECT (demux, "Unknown TrackVideoAspectRatioType 0x%x", (guint) num); break; } GST_DEBUG_OBJECT (demux, "TrackVideoAspectRatioType: %" G_GUINT64_FORMAT, num); videocontext->asr_mode = num; break; } /* colourspace (only matters for raw video) fourcc */ case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{ guint8 *data; guint64 datalen; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &datalen)) != GST_FLOW_OK) break; if (datalen != 4) { g_free (data); GST_WARNING_OBJECT (demux, "Invalid TrackVideoColourSpace length %" G_GUINT64_FORMAT, datalen); break; } memcpy (&videocontext->fourcc, data, 4); GST_DEBUG_OBJECT (demux, "TrackVideoColourSpace: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (videocontext->fourcc)); g_free (data); break; } default: GST_WARNING_OBJECT (demux, "Unknown TrackVideo subelement 0x%x - ignoring", id); /* fall through */ case GST_MATROSKA_ID_VIDEOSTEREOMODE: case GST_MATROSKA_ID_VIDEODISPLAYUNIT: case GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM: case GST_MATROSKA_ID_VIDEOPIXELCROPTOP: case GST_MATROSKA_ID_VIDEOPIXELCROPLEFT: case GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT: case GST_MATROSKA_ID_VIDEOGAMMAVALUE: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (demux, ebml, "TrackVideo", ret); break; } /* tracktype specific stuff for audio */ case GST_MATROSKA_ID_TRACKAUDIO:{ GstMatroskaTrackAudioContext *audiocontext; DEBUG_ELEMENT_START (demux, ebml, "TrackAudio"); if (!gst_matroska_track_init_audio_context (&context)) { GST_WARNING_OBJECT (demux, "TrackAudio element in non-audio track - ignoring track"); ret = GST_FLOW_ERROR; break; } if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) break; audiocontext = (GstMatroskaTrackAudioContext *) context; g_ptr_array_index (demux->common.src, demux->common.num_streams - 1) = context; while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* samplerate */ case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{ gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) break; if (num <= 0.0) { GST_WARNING_OBJECT (demux, "Invalid TrackAudioSamplingFrequency %lf", num); break; } GST_DEBUG_OBJECT (demux, "TrackAudioSamplingFrequency: %lf", num); audiocontext->samplerate = num; break; } /* bitdepth */ case GST_MATROSKA_ID_AUDIOBITDEPTH:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackAudioBitDepth 0"); break; } GST_DEBUG_OBJECT (demux, "TrackAudioBitDepth: %" G_GUINT64_FORMAT, num); audiocontext->bitdepth = num; break; } /* channels */ case GST_MATROSKA_ID_AUDIOCHANNELS:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackAudioChannels 0"); break; } GST_DEBUG_OBJECT (demux, "TrackAudioChannels: %" G_GUINT64_FORMAT, num); audiocontext->channels = num; break; } default: GST_WARNING_OBJECT (demux, "Unknown TrackAudio subelement 0x%x - ignoring", id); /* fall through */ case GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS: case GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (demux, ebml, "TrackAudio", ret); break; } /* codec identifier */ case GST_MATROSKA_ID_CODECID:{ gchar *text; if ((ret = gst_ebml_read_ascii (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (demux, "CodecID: %s", GST_STR_NULL (text)); context->codec_id = text; break; } /* codec private data */ case GST_MATROSKA_ID_CODECPRIVATE:{ guint8 *data; guint64 size; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &size)) != GST_FLOW_OK) break; context->codec_priv = data; context->codec_priv_size = size; GST_DEBUG_OBJECT (demux, "CodecPrivate of size %" G_GUINT64_FORMAT, size); break; } /* name of the codec */ case GST_MATROSKA_ID_CODECNAME:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (demux, "CodecName: %s", GST_STR_NULL (text)); context->codec_name = text; break; } /* name of this track */ case GST_MATROSKA_ID_TRACKNAME:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; context->name = text; GST_DEBUG_OBJECT (demux, "TrackName: %s", GST_STR_NULL (text)); break; } /* language (matters for audio/subtitles, mostly) */ case GST_MATROSKA_ID_TRACKLANGUAGE:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; context->language = text; /* fre-ca => fre */ if (strlen (context->language) >= 4 && context->language[3] == '-') context->language[3] = '\0'; GST_DEBUG_OBJECT (demux, "TrackLanguage: %s", GST_STR_NULL (context->language)); break; } /* whether this is actually used */ case GST_MATROSKA_ID_TRACKFLAGENABLED:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_ENABLED; else context->flags &= ~GST_MATROSKA_TRACK_ENABLED; GST_DEBUG_OBJECT (demux, "TrackEnabled: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* whether it's the default for this track type */ case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_DEFAULT; else context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; GST_DEBUG_OBJECT (demux, "TrackDefault: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* whether the track must be used during playback */ case GST_MATROSKA_ID_TRACKFLAGFORCED:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_FORCED; else context->flags &= ~GST_MATROSKA_TRACK_FORCED; GST_DEBUG_OBJECT (demux, "TrackForced: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* lacing (like MPEG, where blocks don't end/start on frame * boundaries) */ case GST_MATROSKA_ID_TRACKFLAGLACING:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_LACING; else context->flags &= ~GST_MATROSKA_TRACK_LACING; GST_DEBUG_OBJECT (demux, "TrackLacing: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* default length (in time) of one data block in this track */ case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (demux, "Invalid TrackDefaultDuration 0"); break; } GST_DEBUG_OBJECT (demux, "TrackDefaultDuration: %" G_GUINT64_FORMAT, num); context->default_duration = num; break; } case GST_MATROSKA_ID_CONTENTENCODINGS:{ ret = gst_matroska_read_common_read_track_encodings (&demux->common, ebml, context); break; } case GST_MATROSKA_ID_TRACKTIMECODESCALE:{ gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) break; if (num <= 0.0) { GST_WARNING_OBJECT (demux, "Invalid TrackTimeCodeScale %lf", num); break; } GST_DEBUG_OBJECT (demux, "TrackTimeCodeScale: %lf", num); context->timecodescale = num; break; } default: GST_WARNING ("Unknown TrackEntry subelement 0x%x - ignoring", id); /* pass-through */ /* we ignore these because they're nothing useful (i.e. crap) * or simply not implemented yet. */ case GST_MATROSKA_ID_TRACKMINCACHE: case GST_MATROSKA_ID_TRACKMAXCACHE: case GST_MATROSKA_ID_MAXBLOCKADDITIONID: case GST_MATROSKA_ID_TRACKATTACHMENTLINK: case GST_MATROSKA_ID_TRACKOVERLAY: case GST_MATROSKA_ID_TRACKTRANSLATE: case GST_MATROSKA_ID_TRACKOFFSET: case GST_MATROSKA_ID_CODECSETTINGS: case GST_MATROSKA_ID_CODECINFOURL: case GST_MATROSKA_ID_CODECDOWNLOADURL: case GST_MATROSKA_ID_CODECDECODEALL: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (demux, ebml, "TrackEntry", ret); /* Decode codec private data if necessary */ if (context->encodings && context->encodings->len > 0 && context->codec_priv && context->codec_priv_size > 0) { if (!gst_matroska_decode_data (context->encodings, &context->codec_priv, &context->codec_priv_size, GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) { GST_WARNING_OBJECT (demux, "Decoding codec private data failed"); ret = GST_FLOW_ERROR; } } if (context->type == 0 || context->codec_id == NULL || (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)) { if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) GST_WARNING_OBJECT (ebml, "Unknown stream/codec in track entry header"); demux->common.num_streams--; g_ptr_array_remove_index (demux->common.src, demux->common.num_streams); g_assert (demux->common.src->len == demux->common.num_streams); if (context) { gst_matroska_track_free (context); } return ret; } /* now create the GStreamer connectivity */ switch (context->type) { case GST_MATROSKA_TRACK_TYPE_VIDEO:{ GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) context; padname = g_strdup_printf ("video_%02d", demux->num_v_streams++); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_matroska_demux_video_caps (videocontext, context->codec_id, (guint8 *) context->codec_priv, context->codec_priv_size, &codec, &riff_fourcc); if (codec) { list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_VIDEO_CODEC, codec, NULL); g_free (codec); } break; } case GST_MATROSKA_TRACK_TYPE_AUDIO:{ GstMatroskaTrackAudioContext *audiocontext = (GstMatroskaTrackAudioContext *) context; padname = g_strdup_printf ("audio_%02d", demux->num_a_streams++); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); caps = gst_matroska_demux_audio_caps (audiocontext, context->codec_id, context->codec_priv, context->codec_priv_size, &codec, &riff_audio_fmt); if (codec) { list = gst_tag_list_new (); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_AUDIO_CODEC, codec, NULL); g_free (codec); } break; } case GST_MATROSKA_TRACK_TYPE_SUBTITLE:{ GstMatroskaTrackSubtitleContext *subtitlecontext = (GstMatroskaTrackSubtitleContext *) context; padname = g_strdup_printf ("subtitle_%02d", demux->num_t_streams++); templ = gst_element_class_get_pad_template (klass, "subtitle_%02d"); caps = gst_matroska_demux_subtitle_caps (subtitlecontext, context->codec_id, context->codec_priv, context->codec_priv_size); break; } case GST_MATROSKA_TRACK_TYPE_COMPLEX: case GST_MATROSKA_TRACK_TYPE_LOGO: case GST_MATROSKA_TRACK_TYPE_BUTTONS: case GST_MATROSKA_TRACK_TYPE_CONTROL: default: /* we should already have quit by now */ g_assert_not_reached (); } if ((context->language == NULL || *context->language == '\0') && (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO || context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE)) { GST_LOG ("stream %d: language=eng (assuming default)", context->index); context->language = g_strdup ("eng"); } if (context->language) { const gchar *lang; if (!list) list = gst_tag_list_new (); /* Matroska contains ISO 639-2B codes, we want ISO 639-1 */ lang = gst_tag_get_language_code (context->language); gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_LANGUAGE_CODE, (lang) ? lang : context->language, NULL); } if (caps == NULL) { GST_WARNING_OBJECT (demux, "could not determine caps for stream with " "codec_id='%s'", context->codec_id); switch (context->type) { case GST_MATROSKA_TRACK_TYPE_VIDEO: caps = gst_caps_new_simple ("video/x-unknown", NULL); break; case GST_MATROSKA_TRACK_TYPE_AUDIO: caps = gst_caps_new_simple ("audio/x-unknown", NULL); break; case GST_MATROSKA_TRACK_TYPE_SUBTITLE: caps = gst_caps_new_simple ("application/x-subtitle-unknown", NULL); break; case GST_MATROSKA_TRACK_TYPE_COMPLEX: default: caps = gst_caps_new_simple ("application/x-matroska-unknown", NULL); break; } gst_caps_set_simple (caps, "codec-id", G_TYPE_STRING, context->codec_id, NULL); /* add any unrecognised riff fourcc / audio format, but after codec-id */ if (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO && riff_audio_fmt != 0) gst_caps_set_simple (caps, "format", G_TYPE_INT, riff_audio_fmt, NULL); else if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO && riff_fourcc != 0) gst_caps_set_simple (caps, "fourcc", GST_TYPE_FOURCC, riff_fourcc, NULL); } /* the pad in here */ context->pad = gst_pad_new_from_template (templ, padname); context->caps = caps; gst_pad_set_event_function (context->pad, GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_src_event)); gst_pad_set_query_type_function (context->pad, GST_DEBUG_FUNCPTR (gst_matroska_demux_get_src_query_types)); gst_pad_set_query_function (context->pad, GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_src_query)); GST_INFO_OBJECT (demux, "Adding pad '%s' with caps %" GST_PTR_FORMAT, padname, caps); context->pending_tags = list; gst_pad_set_element_private (context->pad, context); gst_pad_use_fixed_caps (context->pad); gst_pad_set_caps (context->pad, context->caps); gst_pad_set_active (context->pad, TRUE); gst_element_add_pad (GST_ELEMENT (demux), context->pad); g_free (padname); /* tadaah! */ return ret; } static const GstQueryType * gst_matroska_demux_get_src_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_SEEKING, 0 }; return query_types; } static gboolean gst_matroska_demux_query (GstMatroskaDemux * demux, GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstMatroskaTrackContext *context = NULL; if (pad) { context = gst_pad_get_element_private (pad); } switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); if (format == GST_FORMAT_TIME) { GST_OBJECT_LOCK (demux); if (context) gst_query_set_position (query, GST_FORMAT_TIME, MAX (context->pos, demux->stream_start_time) - demux->stream_start_time); else gst_query_set_position (query, GST_FORMAT_TIME, MAX (demux->common.segment.last_stop, demux->stream_start_time) - demux->stream_start_time); GST_OBJECT_UNLOCK (demux); } else if (format == GST_FORMAT_DEFAULT && context && context->default_duration) { GST_OBJECT_LOCK (demux); gst_query_set_position (query, GST_FORMAT_DEFAULT, context->pos / context->default_duration); GST_OBJECT_UNLOCK (demux); } else { GST_DEBUG_OBJECT (demux, "only position query in TIME and DEFAULT format is supported"); } res = TRUE; break; } case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); if (format == GST_FORMAT_TIME) { GST_OBJECT_LOCK (demux); gst_query_set_duration (query, GST_FORMAT_TIME, demux->common.segment.duration); GST_OBJECT_UNLOCK (demux); } else if (format == GST_FORMAT_DEFAULT && context && context->default_duration) { GST_OBJECT_LOCK (demux); gst_query_set_duration (query, GST_FORMAT_DEFAULT, demux->common.segment.duration / context->default_duration); GST_OBJECT_UNLOCK (demux); } else { GST_DEBUG_OBJECT (demux, "only duration query in TIME and DEFAULT format is supported"); } res = TRUE; break; } case GST_QUERY_SEEKING: { GstFormat fmt; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); GST_OBJECT_LOCK (demux); if (fmt == GST_FORMAT_TIME) { gboolean seekable; if (demux->streaming) { /* assuming we'll be able to get an index ... */ seekable = demux->seekable; } else { seekable = TRUE; } gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, demux->common.segment.duration); res = TRUE; } GST_OBJECT_UNLOCK (demux); break; } default: res = gst_pad_query_default (pad, query); break; } return res; } static gboolean gst_matroska_demux_element_query (GstElement * element, GstQuery * query) { return gst_matroska_demux_query (GST_MATROSKA_DEMUX (element), NULL, query); } static gboolean gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query) { gboolean ret; GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); ret = gst_matroska_demux_query (demux, pad, query); gst_object_unref (demux); return ret; } /* returns FALSE if there are no pads to deliver event to, * otherwise TRUE (whatever the outcome of event sending), * takes ownership of the passed event! */ static gboolean gst_matroska_demux_send_event (GstMatroskaDemux * demux, GstEvent * event) { gboolean is_newsegment; gboolean ret = FALSE; gint i; g_return_val_if_fail (event != NULL, FALSE); GST_DEBUG_OBJECT (demux, "Sending event of type %s to all source pads", GST_EVENT_TYPE_NAME (event)); is_newsegment = (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT); g_assert (demux->common.src->len == demux->common.num_streams); for (i = 0; i < demux->common.src->len; i++) { GstMatroskaTrackContext *stream; stream = g_ptr_array_index (demux->common.src, i); gst_event_ref (event); gst_pad_push_event (stream->pad, event); ret = TRUE; /* FIXME: send global tags before stream tags */ if (G_UNLIKELY (is_newsegment && stream->pending_tags != NULL)) { GST_DEBUG_OBJECT (demux, "Sending pending_tags %p for pad %s:%s : %" GST_PTR_FORMAT, stream->pending_tags, GST_DEBUG_PAD_NAME (stream->pad), stream->pending_tags); gst_element_found_tags_for_pad (GST_ELEMENT (demux), stream->pad, stream->pending_tags); stream->pending_tags = NULL; } } if (G_UNLIKELY (is_newsegment && demux->common.global_tags != NULL)) { gst_tag_list_add (demux->common.global_tags, GST_TAG_MERGE_REPLACE, GST_TAG_CONTAINER_FORMAT, "Matroska", NULL); GST_DEBUG_OBJECT (demux, "Sending global_tags %p : %" GST_PTR_FORMAT, demux->common.global_tags, demux->common.global_tags); gst_element_found_tags (GST_ELEMENT (demux), demux->common.global_tags); demux->common.global_tags = NULL; } gst_event_unref (event); return ret; } static gboolean gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); gboolean res; g_return_val_if_fail (event != NULL, FALSE); if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { res = gst_matroska_demux_handle_seek_event (demux, NULL, event); } else { GST_WARNING_OBJECT (demux, "Unhandled event of type %s", GST_EVENT_TYPE_NAME (event)); res = FALSE; } gst_event_unref (event); return res; } static gboolean gst_matroska_demux_move_to_entry (GstMatroskaDemux * demux, GstMatroskaIndex * entry, gboolean reset) { gint i; GST_OBJECT_LOCK (demux); /* seek (relative to matroska segment) */ /* position might be invalid; will error when streaming resumes ... */ demux->common.offset = entry->pos + demux->common.ebml_segment_start; GST_DEBUG_OBJECT (demux, "Seeked to offset %" G_GUINT64_FORMAT ", block %d, " "time %" GST_TIME_FORMAT, entry->pos + demux->common.ebml_segment_start, entry->block, GST_TIME_ARGS (entry->time)); /* update the time */ gst_matroska_read_common_reset_streams (&demux->common, entry->time, TRUE); demux->common.segment.last_stop = entry->time; demux->seek_block = entry->block; demux->seek_first = TRUE; demux->last_stop_end = GST_CLOCK_TIME_NONE; for (i = 0; i < demux->common.src->len; i++) { GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); if (reset) { stream->to_offset = G_MAXINT64; } else { if (stream->from_offset != -1) stream->to_offset = stream->from_offset; } stream->from_offset = -1; } GST_OBJECT_UNLOCK (demux); return TRUE; } static gint gst_matroska_cluster_compare (gint64 * i1, gint64 * i2) { if (*i1 < *i2) return -1; else if (*i1 > *i2) return 1; else return 0; } /* searches for a cluster start from @pos, * return GST_FLOW_OK and cluster position in @pos if found */ static GstFlowReturn gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) { gint64 newpos = *pos; gint64 orig_offset; GstFlowReturn ret = GST_FLOW_OK; const guint chunk = 64 * 1024; GstBuffer *buf = NULL; guint64 length; guint32 id; guint needed; orig_offset = demux->common.offset; GST_LOG_OBJECT (demux, "searching cluster following offset %" G_GINT64_FORMAT, *pos); if (demux->clusters) { gint64 *cpos; cpos = gst_util_array_binary_search (demux->clusters->data, demux->clusters->len, sizeof (gint64), (GCompareDataFunc) gst_matroska_cluster_compare, GST_SEARCH_MODE_AFTER, pos, NULL); /* sanity check */ if (cpos) { GST_DEBUG_OBJECT (demux, "cluster reported at offset %" G_GINT64_FORMAT, *cpos); demux->common.offset = *cpos; ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (ret == GST_FLOW_OK && id == GST_MATROSKA_ID_CLUSTER) { newpos = *cpos; goto exit; } } } /* read in at newpos and scan for ebml cluster id */ while (1) { GstByteReader reader; gint cluster_pos; if (buf != NULL) { gst_buffer_unref (buf); buf = NULL; } ret = gst_pad_pull_range (demux->common.sinkpad, newpos, chunk, &buf); if (ret != GST_FLOW_OK) break; GST_DEBUG_OBJECT (demux, "read buffer size %d at offset %" G_GINT64_FORMAT, GST_BUFFER_SIZE (buf), newpos); gst_byte_reader_init_from_buffer (&reader, buf); resume: cluster_pos = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, GST_MATROSKA_ID_CLUSTER, 0, gst_byte_reader_get_remaining (&reader)); if (cluster_pos >= 0) { newpos += cluster_pos; /* prepare resuming at next byte */ gst_byte_reader_skip (&reader, cluster_pos + 1); GST_DEBUG_OBJECT (demux, "found cluster ebml id at offset %" G_GINT64_FORMAT, newpos); /* extra checks whether we really sync'ed to a cluster: * - either it is the first and only cluster * - either there is a cluster after this one * - either cluster length is undefined */ /* ok if first cluster (there may not a subsequent one) */ if (newpos == demux->first_cluster_offset) { GST_DEBUG_OBJECT (demux, "cluster is first cluster -> OK"); break; } demux->common.offset = newpos; ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (demux, "need more data -> continue"); continue; } g_assert (id == GST_MATROSKA_ID_CLUSTER); GST_DEBUG_OBJECT (demux, "cluster size %" G_GUINT64_FORMAT ", prefix %d", length, needed); /* ok if undefined length or first cluster */ if (length == GST_EBML_SIZE_UNKNOWN || length == G_MAXUINT64) { GST_DEBUG_OBJECT (demux, "cluster has undefined length -> OK"); break; } /* skip cluster */ demux->common.offset += length + needed; ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (ret != GST_FLOW_OK) goto resume; GST_DEBUG_OBJECT (demux, "next element is %scluster", id == GST_MATROSKA_ID_CLUSTER ? "" : "not "); if (id == GST_MATROSKA_ID_CLUSTER) break; /* not ok, resume */ goto resume; } else { /* partial cluster id may have been in tail of buffer */ newpos += MAX (gst_byte_reader_get_remaining (&reader), 4) - 3; } } if (buf) { gst_buffer_unref (buf); buf = NULL; } exit: demux->common.offset = orig_offset; *pos = newpos; return ret; } /* bisect and scan through file for cluster starting before @time, * returns fake index entry with corresponding info on cluster */ static GstMatroskaIndex * gst_matroska_demux_search_pos (GstMatroskaDemux * demux, GstClockTime time) { GstMatroskaIndex *entry = NULL; GstMatroskaReadState current_state; GstClockTime otime, prev_cluster_time, current_cluster_time, cluster_time; gint64 opos, newpos, startpos = 0, current_offset; gint64 prev_cluster_offset = -1, current_cluster_offset, cluster_offset; const guint chunk = 64 * 1024; GstFlowReturn ret; guint64 length; guint32 id; guint needed; /* (under)estimate new position, resync using cluster ebml id, * and scan forward to appropriate cluster * (and re-estimate if need to go backward) */ prev_cluster_time = GST_CLOCK_TIME_NONE; /* store some current state */ current_state = demux->common.state; g_return_val_if_fail (current_state == GST_MATROSKA_READ_STATE_DATA, NULL); current_cluster_offset = demux->cluster_offset; current_cluster_time = demux->cluster_time; current_offset = demux->common.offset; demux->common.state = GST_MATROSKA_READ_STATE_SCANNING; /* estimate using start and current position */ GST_OBJECT_LOCK (demux); opos = demux->common.offset - demux->common.ebml_segment_start; otime = demux->common.segment.last_stop; GST_OBJECT_UNLOCK (demux); /* sanitize */ time = MAX (time, demux->stream_start_time); /* avoid division by zero in first estimation below */ if (otime <= demux->stream_start_time) otime = time; retry: GST_LOG_OBJECT (demux, "opos: %" G_GUINT64_FORMAT ", otime: %" GST_TIME_FORMAT ", %" GST_TIME_FORMAT " in stream time (start %" GST_TIME_FORMAT "), time %" GST_TIME_FORMAT, opos, GST_TIME_ARGS (otime), GST_TIME_ARGS (otime - demux->stream_start_time), GST_TIME_ARGS (demux->stream_start_time), GST_TIME_ARGS (time)); newpos = gst_util_uint64_scale (opos - demux->common.ebml_segment_start, time - demux->stream_start_time, otime - demux->stream_start_time) - chunk; if (newpos < 0) newpos = 0; /* favour undershoot */ newpos = newpos * 90 / 100; newpos += demux->common.ebml_segment_start; GST_DEBUG_OBJECT (demux, "estimated offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT, GST_TIME_ARGS (time), newpos); /* and at least start scanning before previous scan start to avoid looping */ startpos = startpos * 90 / 100; if (startpos && startpos < newpos) newpos = startpos; /* read in at newpos and scan for ebml cluster id */ startpos = newpos; while (1) { ret = gst_matroska_demux_search_cluster (demux, &newpos); if (ret == GST_FLOW_UNEXPECTED) { /* heuristic HACK */ newpos = startpos * 80 / 100; GST_DEBUG_OBJECT (demux, "EOS; " "new estimated offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT, GST_TIME_ARGS (time), newpos); startpos = newpos; continue; } else if (ret != GST_FLOW_OK) { goto exit; } else { break; } } /* then start scanning and parsing for cluster time, * re-estimate if overshoot, otherwise next cluster and so on */ demux->common.offset = newpos; demux->cluster_time = cluster_time = GST_CLOCK_TIME_NONE; while (1) { guint64 cluster_size = 0; /* peek and parse some elements */ ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (ret != GST_FLOW_OK) goto error; GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " "size %" G_GUINT64_FORMAT ", needed %d", demux->common.offset, id, length, needed); ret = gst_matroska_demux_parse_id (demux, id, length, needed); if (ret != GST_FLOW_OK) goto error; if (id == GST_MATROSKA_ID_CLUSTER) { cluster_time = GST_CLOCK_TIME_NONE; if (length == G_MAXUINT64) cluster_size = 0; else cluster_size = length + needed; } if (demux->cluster_time != GST_CLOCK_TIME_NONE && cluster_time == GST_CLOCK_TIME_NONE) { cluster_time = demux->cluster_time * demux->common.time_scale; cluster_offset = demux->cluster_offset; GST_DEBUG_OBJECT (demux, "found cluster at offset %" G_GINT64_FORMAT " with time %" GST_TIME_FORMAT, cluster_offset, GST_TIME_ARGS (cluster_time)); if (cluster_time > time) { GST_DEBUG_OBJECT (demux, "overshot target"); /* cluster overshoots */ if (cluster_offset == demux->first_cluster_offset) { /* but no prev one */ GST_DEBUG_OBJECT (demux, "but using first cluster anyway"); prev_cluster_time = cluster_time; prev_cluster_offset = cluster_offset; break; } if (prev_cluster_time != GST_CLOCK_TIME_NONE) { /* prev cluster did not overshoot, so prev cluster is target */ break; } else { /* re-estimate using this new position info */ opos = cluster_offset; otime = cluster_time; goto retry; } } else { /* cluster undershoots, goto next one */ prev_cluster_time = cluster_time; prev_cluster_offset = cluster_offset; /* skip cluster if length is defined, * otherwise will be skippingly parsed into */ if (cluster_size) { GST_DEBUG_OBJECT (demux, "skipping to next cluster"); demux->common.offset = cluster_offset + cluster_size; demux->cluster_time = GST_CLOCK_TIME_NONE; } else { GST_DEBUG_OBJECT (demux, "parsing/skipping cluster elements"); } } } continue; error: if (ret == GST_FLOW_UNEXPECTED) { if (prev_cluster_time != GST_CLOCK_TIME_NONE) break; } goto exit; } entry = g_new0 (GstMatroskaIndex, 1); entry->time = prev_cluster_time; entry->pos = prev_cluster_offset - demux->common.ebml_segment_start; GST_DEBUG_OBJECT (demux, "simulated index entry; time %" GST_TIME_FORMAT ", pos %" G_GUINT64_FORMAT, GST_TIME_ARGS (entry->time), entry->pos); exit: /* restore some state */ demux->cluster_offset = current_cluster_offset; demux->cluster_time = current_cluster_time; demux->common.offset = current_offset; demux->common.state = current_state; return entry; } static gboolean gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux, GstPad * pad, GstEvent * event) { GstMatroskaIndex *entry = NULL; GstMatroskaIndex scan_entry; GstSeekFlags flags; GstSeekType cur_type, stop_type; GstFormat format; gboolean flush, keyunit; gdouble rate; gint64 cur, stop; GstMatroskaTrackContext *track = NULL; GstSegment seeksegment = { 0, }; gboolean update = TRUE; if (pad) track = gst_pad_get_element_private (pad); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* we can only seek on time */ if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (demux, "Can only seek on TIME"); return FALSE; } /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &demux->common.segment, sizeof (GstSegment)); /* pull mode without index means that the actual duration is not known, * we might be playing a file that's still being recorded * so, invalidate our current duration, which is only a moving target, * and should not be used to clamp anything */ if (!demux->streaming && !demux->common.index && demux->invalid_duration) { gst_segment_set_duration (&seeksegment, GST_FORMAT_TIME, GST_CLOCK_TIME_NONE); } if (event) { GST_DEBUG_OBJECT (demux, "configuring seek"); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); /* compensate for clip start time */ if (GST_CLOCK_TIME_IS_VALID (demux->stream_start_time)) { seeksegment.last_stop += demux->stream_start_time; seeksegment.start += demux->stream_start_time; if (GST_CLOCK_TIME_IS_VALID (seeksegment.stop)) seeksegment.stop += demux->stream_start_time; /* note that time should stay at indicated position */ } } /* restore segment duration (if any effect), * would be determined again when parsing, but anyway ... */ gst_segment_set_duration (&seeksegment, GST_FORMAT_TIME, demux->common.segment.duration); flush = ! !(flags & GST_SEEK_FLAG_FLUSH); keyunit = ! !(flags & GST_SEEK_FLAG_KEY_UNIT); GST_DEBUG_OBJECT (demux, "New segment %" GST_SEGMENT_FORMAT, &seeksegment); if (!update) { /* only have to update some segment, * but also still have to honour flush and so on */ GST_DEBUG_OBJECT (demux, "... no update"); /* bad goto, bad ... */ goto next; } /* check sanity before we start flushing and all that */ GST_OBJECT_LOCK (demux); track = gst_matroska_read_common_get_seek_track (&demux->common, track); if ((entry = gst_matroska_read_common_do_index_seek (&demux->common, track, seeksegment.last_stop, &demux->seek_index, &demux->seek_entry)) == NULL) { /* pull mode without index can scan later on */ if (demux->streaming) { GST_DEBUG_OBJECT (demux, "No matching seek entry in index"); GST_OBJECT_UNLOCK (demux); return FALSE; } } GST_DEBUG_OBJECT (demux, "Seek position looks sane"); GST_OBJECT_UNLOCK (demux); if (demux->streaming) { /* need to seek to cluster start to pick up cluster time */ /* upstream takes care of flushing and all that * ... and newsegment event handling takes care of the rest */ return perform_seek_to_offset (demux, entry->pos + demux->common.ebml_segment_start); } next: if (flush) { GST_DEBUG_OBJECT (demux, "Starting flush"); gst_pad_push_event (demux->common.sinkpad, gst_event_new_flush_start ()); gst_matroska_demux_send_event (demux, gst_event_new_flush_start ()); } else { GST_DEBUG_OBJECT (demux, "Non-flushing seek, pausing task"); gst_pad_pause_task (demux->common.sinkpad); } /* ouch */ if (!update) goto exit; /* now grab the stream lock so that streaming cannot continue, for * non flushing seeks when the element is in PAUSED this could block * forever. */ GST_DEBUG_OBJECT (demux, "Waiting for streaming to stop"); GST_PAD_STREAM_LOCK (demux->common.sinkpad); /* pull mode without index can do some scanning */ if (!demux->streaming && !entry) { /* need to stop flushing upstream as we need it next */ if (flush) gst_pad_push_event (demux->common.sinkpad, gst_event_new_flush_stop ()); entry = gst_matroska_demux_search_pos (demux, seeksegment.last_stop); /* keep local copy */ if (entry) { scan_entry = *entry; g_free (entry); entry = &scan_entry; } else { GST_DEBUG_OBJECT (demux, "Scan failed to find matching position"); if (flush) gst_matroska_demux_send_event (demux, gst_event_new_flush_stop ()); goto seek_error; } } if (keyunit) { GST_DEBUG_OBJECT (demux, "seek to key unit, adjusting segment start to %" GST_TIME_FORMAT, GST_TIME_ARGS (entry->time)); seeksegment.start = MAX (entry->time, demux->stream_start_time); seeksegment.last_stop = seeksegment.start; seeksegment.time = seeksegment.start - demux->stream_start_time; } exit: if (flush) { GST_DEBUG_OBJECT (demux, "Stopping flush"); gst_pad_push_event (demux->common.sinkpad, gst_event_new_flush_stop ()); gst_matroska_demux_send_event (demux, gst_event_new_flush_stop ()); } else if (demux->segment_running && update) { GST_DEBUG_OBJECT (demux, "Closing currently running segment"); GST_OBJECT_LOCK (demux); if (demux->close_segment) gst_event_unref (demux->close_segment); demux->close_segment = gst_event_new_new_segment (TRUE, demux->common.segment.rate, GST_FORMAT_TIME, demux->common.segment.start, demux->common.segment.last_stop, demux->common.segment.time); GST_OBJECT_UNLOCK (demux); } GST_OBJECT_LOCK (demux); /* now update the real segment info */ GST_DEBUG_OBJECT (demux, "Committing new seek segment"); memcpy (&demux->common.segment, &seeksegment, sizeof (GstSegment)); GST_OBJECT_UNLOCK (demux); /* update some (segment) state */ if (update && !gst_matroska_demux_move_to_entry (demux, entry, TRUE)) goto seek_error; /* notify start of new segment */ if (demux->common.segment.flags & GST_SEEK_FLAG_SEGMENT) { GstMessage *msg; msg = gst_message_new_segment_start (GST_OBJECT (demux), GST_FORMAT_TIME, demux->common.segment.start); gst_element_post_message (GST_ELEMENT (demux), msg); } GST_OBJECT_LOCK (demux); if (demux->new_segment) gst_event_unref (demux->new_segment); demux->new_segment = gst_event_new_new_segment_full (!update, demux->common.segment.rate, demux->common.segment.applied_rate, demux->common.segment.format, demux->common.segment.start, demux->common.segment.stop, demux->common.segment.time); GST_OBJECT_UNLOCK (demux); /* restart our task since it might have been stopped when we did the * flush. */ demux->segment_running = TRUE; gst_pad_start_task (demux->common.sinkpad, (GstTaskFunction) gst_matroska_demux_loop, demux->common.sinkpad); /* streaming can continue now */ GST_PAD_STREAM_UNLOCK (demux->common.sinkpad); return TRUE; seek_error: { GST_PAD_STREAM_UNLOCK (demux->common.sinkpad); GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Got a seek error")); return FALSE; } } /* * Handle whether we can perform the seek event or if we have to let the chain * function handle seeks to build the seek indexes first. */ static gboolean gst_matroska_demux_handle_seek_push (GstMatroskaDemux * demux, GstPad * pad, GstEvent * event) { GstSeekFlags flags; GstSeekType cur_type, stop_type; GstFormat format; gdouble rate; gint64 cur, stop; gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* sanity checks */ /* we can only seek on time */ if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (demux, "Can only seek on TIME"); return FALSE; } if (stop_type != GST_SEEK_TYPE_NONE && stop != GST_CLOCK_TIME_NONE) { GST_DEBUG_OBJECT (demux, "Seek end-time not supported in streaming mode"); return FALSE; } if (!(flags & GST_SEEK_FLAG_FLUSH)) { GST_DEBUG_OBJECT (demux, "Non-flushing seek not supported in streaming mode"); return FALSE; } if (flags & GST_SEEK_FLAG_SEGMENT) { GST_DEBUG_OBJECT (demux, "Segment seek not supported in streaming mode"); return FALSE; } /* check for having parsed index already */ if (!demux->common.index_parsed) { gboolean building_index; guint64 offset = 0; if (!demux->index_offset) { GST_DEBUG_OBJECT (demux, "no index (location); no seek in push mode"); return FALSE; } GST_OBJECT_LOCK (demux); /* handle the seek event in the chain function */ demux->common.state = GST_MATROSKA_READ_STATE_SEEK; /* no more seek can be issued until state reset to _DATA */ /* copy the event */ if (demux->seek_event) gst_event_unref (demux->seek_event); demux->seek_event = gst_event_ref (event); /* set the building_index flag so that only one thread can setup the * structures for index seeking. */ building_index = demux->building_index; if (!building_index) { demux->building_index = TRUE; offset = demux->index_offset; } GST_OBJECT_UNLOCK (demux); if (!building_index) { /* seek to the first subindex or legacy index */ GST_INFO_OBJECT (demux, "Seeking to Cues at %" G_GUINT64_FORMAT, offset); return perform_seek_to_offset (demux, offset); } /* well, we are handling it already */ return TRUE; } /* delegate to tweaked regular seek */ return gst_matroska_demux_handle_seek_event (demux, pad, event); } static gboolean gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); gboolean res = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: /* no seeking until we are (safely) ready */ if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) { GST_DEBUG_OBJECT (demux, "not ready for seeking yet"); return FALSE; } if (!demux->streaming) res = gst_matroska_demux_handle_seek_event (demux, pad, event); else res = gst_matroska_demux_handle_seek_push (demux, pad, event); gst_event_unref (event); break; case GST_EVENT_QOS: { GstMatroskaTrackContext *context = gst_pad_get_element_private (pad); if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) context; gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; gst_event_parse_qos (event, &proportion, &diff, ×tamp); GST_OBJECT_LOCK (demux); videocontext->earliest_time = timestamp + diff; GST_OBJECT_UNLOCK (demux); } res = TRUE; gst_event_unref (event); break; } /* events we don't need to handle */ case GST_EVENT_NAVIGATION: gst_event_unref (event); res = FALSE; break; case GST_EVENT_LATENCY: default: res = gst_pad_push_event (demux->common.sinkpad, event); break; } gst_object_unref (demux); return res; } static GstFlowReturn gst_matroska_demux_seek_to_previous_keyframe (GstMatroskaDemux * demux) { GstFlowReturn ret = GST_FLOW_UNEXPECTED; gboolean done = TRUE; gint i; g_return_val_if_fail (demux->seek_index, GST_FLOW_UNEXPECTED); g_return_val_if_fail (demux->seek_entry < demux->seek_index->len, GST_FLOW_UNEXPECTED); GST_DEBUG_OBJECT (demux, "locating previous keyframe"); if (!demux->seek_entry) { GST_DEBUG_OBJECT (demux, "no earlier index entry"); goto exit; } for (i = 0; i < demux->common.src->len; i++) { GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i); GST_DEBUG_OBJECT (demux, "segment start %" GST_TIME_FORMAT ", stream %d at %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->common.segment.start), stream->index, GST_TIME_ARGS (stream->from_time)); if (GST_CLOCK_TIME_IS_VALID (stream->from_time)) { if (stream->from_time > demux->common.segment.start) { GST_DEBUG_OBJECT (demux, "stream %d not finished yet", stream->index); done = FALSE; } } else { /* nothing pushed for this stream; * likely seek entry did not start at keyframe, so all was skipped. * So we need an earlier entry */ done = FALSE; } } if (!done) { GstMatroskaIndex *entry; entry = &g_array_index (demux->seek_index, GstMatroskaIndex, --demux->seek_entry); if (!gst_matroska_demux_move_to_entry (demux, entry, FALSE)) goto exit; ret = GST_FLOW_OK; } exit: return ret; } static GstFlowReturn gst_matroska_demux_parse_tracks (GstMatroskaDemux * demux, GstEbmlRead * ebml) { GstFlowReturn ret = GST_FLOW_OK; guint32 id; DEBUG_ELEMENT_START (demux, ebml, "Tracks"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* one track within the "all-tracks" header */ case GST_MATROSKA_ID_TRACKENTRY: ret = gst_matroska_demux_add_stream (demux, ebml); break; default: ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, "Track", id); break; } } DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret); demux->tracks_parsed = TRUE; return ret; } /* * Read signed/unsigned "EBML" numbers. * Return: number of bytes processed. */ static gint gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num) { gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; guint64 total; if (size <= 0) { return -1; } total = data[0]; while (read <= 8 && !(total & len_mask)) { read++; len_mask >>= 1; } if (read > 8) return -1; if ((total &= (len_mask - 1)) == len_mask - 1) num_ffs++; if (size < read) return -1; while (n < read) { if (data[n] == 0xff) num_ffs++; total = (total << 8) | data[n]; n++; } if (read == num_ffs && total != 0) *num = G_MAXUINT64; else *num = total; return read; } static gint gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num) { guint64 unum; gint res; /* read as unsigned number first */ if ((res = gst_matroska_ebmlnum_uint (data, size, &unum)) < 0) return -1; /* make signed */ if (unum == G_MAXUINT64) *num = G_MAXINT64; else *num = unum - ((1 << ((7 * res) - 1)) - 1); return res; } /* * Mostly used for subtitles. We add void filler data for each * lagging stream to make sure we don't deadlock. */ static void gst_matroska_demux_sync_streams (GstMatroskaDemux * demux) { gint stream_nr; GST_OBJECT_LOCK (demux); GST_LOG_OBJECT (demux, "Sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (demux->common.segment.last_stop)); g_assert (demux->common.num_streams == demux->common.src->len); for (stream_nr = 0; stream_nr < demux->common.src->len; stream_nr++) { GstMatroskaTrackContext *context; context = g_ptr_array_index (demux->common.src, stream_nr); GST_LOG_OBJECT (demux, "Checking for resync on stream %d (%" GST_TIME_FORMAT ")", stream_nr, GST_TIME_ARGS (context->pos)); if (G_LIKELY (context->type != GST_MATROSKA_TRACK_TYPE_SUBTITLE)) { GST_LOG_OBJECT (demux, "Skipping sync on non-subtitle stream"); continue; } /* does it lag? 0.5 seconds is a random threshold... * lag need only be considered if we have advanced into requested segment */ if (GST_CLOCK_TIME_IS_VALID (context->pos) && GST_CLOCK_TIME_IS_VALID (demux->common.segment.last_stop) && demux->common.segment.last_stop > demux->common.segment.start && context->pos + (GST_SECOND / 2) < demux->common.segment.last_stop) { gint64 new_start; GstEvent *event; new_start = demux->common.segment.last_stop - (GST_SECOND / 2); if (GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop)) new_start = MIN (new_start, demux->common.segment.stop); GST_DEBUG_OBJECT (demux, "Synchronizing stream %d with others by advancing time " "from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, stream_nr, GST_TIME_ARGS (context->pos), GST_TIME_ARGS (new_start)); context->pos = new_start; /* advance stream time */ event = gst_event_new_new_segment (TRUE, demux->common.segment.rate, demux->common.segment.format, new_start, demux->common.segment.stop, new_start); GST_OBJECT_UNLOCK (demux); gst_pad_push_event (context->pad, event); GST_OBJECT_LOCK (demux); } } GST_OBJECT_UNLOCK (demux); } static GstFlowReturn gst_matroska_demux_push_hdr_buf (GstMatroskaDemux * demux, GstMatroskaTrackContext * stream, guint8 * data, guint len) { GstFlowReturn ret, cret; GstBuffer *header_buf; header_buf = gst_buffer_new_and_alloc (len); gst_buffer_set_caps (header_buf, stream->caps); memcpy (GST_BUFFER_DATA (header_buf), data, len); if (stream->set_discont) { GST_BUFFER_FLAG_SET (header_buf, GST_BUFFER_FLAG_DISCONT); stream->set_discont = FALSE; } ret = gst_pad_push (stream->pad, header_buf); /* combine flows */ cret = gst_matroska_demux_combine_flows (demux, stream, ret); return cret; } static GstFlowReturn gst_matroska_demux_push_flac_codec_priv_data (GstMatroskaDemux * demux, GstMatroskaTrackContext * stream) { GstFlowReturn ret; guint8 *pdata; guint off, len; GST_LOG_OBJECT (demux, "priv data size = %u", stream->codec_priv_size); pdata = (guint8 *) stream->codec_priv; /* need at least 'fLaC' marker + STREAMINFO metadata block */ if (stream->codec_priv_size < ((4) + (4 + 34))) { GST_WARNING_OBJECT (demux, "not enough codec priv data for flac headers"); return GST_FLOW_ERROR; } if (memcmp (pdata, "fLaC", 4) != 0) { GST_WARNING_OBJECT (demux, "no flac marker at start of stream headers"); return GST_FLOW_ERROR; } ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata, 4); if (ret != GST_FLOW_OK) return ret; off = 4; /* skip fLaC marker */ while (off < stream->codec_priv_size) { len = GST_READ_UINT8 (pdata + off + 1) << 16; len |= GST_READ_UINT8 (pdata + off + 2) << 8; len |= GST_READ_UINT8 (pdata + off + 3); GST_DEBUG_OBJECT (demux, "header packet: len=%u bytes, flags=0x%02x", len, (guint) pdata[off]); ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata + off, len + 4); if (ret != GST_FLOW_OK) return ret; off += 4 + len; } return GST_FLOW_OK; } static GstFlowReturn gst_matroska_demux_push_speex_codec_priv_data (GstMatroskaDemux * demux, GstMatroskaTrackContext * stream) { GstFlowReturn ret; guint8 *pdata; GST_LOG_OBJECT (demux, "priv data size = %u", stream->codec_priv_size); pdata = (guint8 *) stream->codec_priv; /* need at least 'fLaC' marker + STREAMINFO metadata block */ if (stream->codec_priv_size < 80) { GST_WARNING_OBJECT (demux, "not enough codec priv data for speex headers"); return GST_FLOW_ERROR; } if (memcmp (pdata, "Speex ", 8) != 0) { GST_WARNING_OBJECT (demux, "no Speex marker at start of stream headers"); return GST_FLOW_ERROR; } ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata, 80); if (ret != GST_FLOW_OK) return ret; if (stream->codec_priv_size == 80) return ret; else return gst_matroska_demux_push_hdr_buf (demux, stream, pdata + 80, stream->codec_priv_size - 80); } static GstFlowReturn gst_matroska_demux_push_xiph_codec_priv_data (GstMatroskaDemux * demux, GstMatroskaTrackContext * stream) { GstFlowReturn ret; guint8 *p = (guint8 *) stream->codec_priv; gint i, offset, num_packets; guint *length, last; if (stream->codec_priv == NULL || stream->codec_priv_size == 0) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Missing codec private data for xiph headers, broken file")); return GST_FLOW_ERROR; } /* start of the stream and vorbis audio or theora video, need to * send the codec_priv data as first three packets */ num_packets = p[0] + 1; GST_DEBUG_OBJECT (demux, "%u stream headers, total length=%u bytes", (guint) num_packets, stream->codec_priv_size); length = g_alloca (num_packets * sizeof (guint)); last = 0; offset = 1; /* first packets, read length values */ for (i = 0; i < num_packets - 1; i++) { length[i] = 0; while (offset < stream->codec_priv_size) { length[i] += p[offset]; if (p[offset++] != 0xff) break; } last += length[i]; } if (offset + last > stream->codec_priv_size) return GST_FLOW_ERROR; /* last packet is the remaining size */ length[i] = stream->codec_priv_size - offset - last; for (i = 0; i < num_packets; i++) { GST_DEBUG_OBJECT (demux, "buffer %d: length=%u bytes", i, (guint) length[i]); if (offset + length[i] > stream->codec_priv_size) return GST_FLOW_ERROR; ret = gst_matroska_demux_push_hdr_buf (demux, stream, p + offset, length[i]); if (ret != GST_FLOW_OK) return ret; offset += length[i]; } return GST_FLOW_OK; } static void gst_matroska_demux_push_dvd_clut_change_event (GstMatroskaDemux * demux, GstMatroskaTrackContext * stream) { gchar *buf, *start; g_assert (!strcmp (stream->codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB)); if (!stream->codec_priv) return; /* ideally, VobSub private data should be parsed and stored more convenient * elsewhere, but for now, only interested in a small part */ /* make sure we have terminating 0 */ buf = g_strndup ((gchar *) stream->codec_priv, stream->codec_priv_size); /* just locate and parse palette part */ start = strstr (buf, "palette:"); if (start) { gint i; guint32 clut[16]; guint32 col; guint8 r, g, b, y, u, v; start += 8; while (g_ascii_isspace (*start)) start++; for (i = 0; i < 16; i++) { if (sscanf (start, "%06x", &col) != 1) break; start += 6; while ((*start == ',') || g_ascii_isspace (*start)) start++; /* sigh, need to convert this from vobsub pseudo-RGB to YUV */ r = (col >> 16) & 0xff; g = (col >> 8) & 0xff; b = col & 0xff; y = CLAMP ((0.1494 * r + 0.6061 * g + 0.2445 * b) * 219 / 255 + 16, 0, 255); u = CLAMP (0.6066 * r - 0.4322 * g - 0.1744 * b + 128, 0, 255); v = CLAMP (-0.08435 * r - 0.3422 * g + 0.4266 * b + 128, 0, 255); clut[i] = (y << 16) | (u << 8) | v; } /* got them all without problems; build and send event */ if (i == 16) { GstStructure *s; s = gst_structure_new ("application/x-gst-dvd", "event", G_TYPE_STRING, "dvd-spu-clut-change", "clut00", G_TYPE_INT, clut[0], "clut01", G_TYPE_INT, clut[1], "clut02", G_TYPE_INT, clut[2], "clut03", G_TYPE_INT, clut[3], "clut04", G_TYPE_INT, clut[4], "clut05", G_TYPE_INT, clut[5], "clut06", G_TYPE_INT, clut[6], "clut07", G_TYPE_INT, clut[7], "clut08", G_TYPE_INT, clut[8], "clut09", G_TYPE_INT, clut[9], "clut10", G_TYPE_INT, clut[10], "clut11", G_TYPE_INT, clut[11], "clut12", G_TYPE_INT, clut[12], "clut13", G_TYPE_INT, clut[13], "clut14", G_TYPE_INT, clut[14], "clut15", G_TYPE_INT, clut[15], NULL); gst_pad_push_event (stream->pad, gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s)); } } g_free (buf); } static GstFlowReturn gst_matroska_demux_add_mpeg_seq_header (GstElement * element, GstMatroskaTrackContext * stream, GstBuffer ** buf) { guint8 *seq_header; guint seq_header_len; guint32 header; if (stream->codec_state) { seq_header = stream->codec_state; seq_header_len = stream->codec_state_size; } else if (stream->codec_priv) { seq_header = stream->codec_priv; seq_header_len = stream->codec_priv_size; } else { return GST_FLOW_OK; } /* Sequence header only needed for keyframes */ if (GST_BUFFER_FLAG_IS_SET (*buf, GST_BUFFER_FLAG_DELTA_UNIT)) return GST_FLOW_OK; if (GST_BUFFER_SIZE (*buf) < 4) return GST_FLOW_OK; header = GST_READ_UINT32_BE (GST_BUFFER_DATA (*buf)); /* Sequence start code, if not found prepend */ if (header != 0x000001b3) { GstBuffer *newbuf; newbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (*buf) + seq_header_len); gst_buffer_set_caps (newbuf, stream->caps); GST_DEBUG_OBJECT (element, "Prepending MPEG sequence header"); gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); g_memmove (GST_BUFFER_DATA (newbuf), seq_header, seq_header_len); g_memmove (GST_BUFFER_DATA (newbuf) + seq_header_len, GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf)); gst_buffer_unref (*buf); *buf = newbuf; } return GST_FLOW_OK; } static GstFlowReturn gst_matroska_demux_add_wvpk_header (GstElement * element, GstMatroskaTrackContext * stream, GstBuffer ** buf) { GstMatroskaTrackAudioContext *audiocontext = (GstMatroskaTrackAudioContext *) stream; GstBuffer *newbuf = NULL; guint8 *data; guint newlen; Wavpack4Header wvh; wvh.ck_id[0] = 'w'; wvh.ck_id[1] = 'v'; wvh.ck_id[2] = 'p'; wvh.ck_id[3] = 'k'; wvh.version = GST_READ_UINT16_LE (stream->codec_priv); wvh.track_no = 0; wvh.index_no = 0; wvh.total_samples = -1; wvh.block_index = audiocontext->wvpk_block_index; if (audiocontext->channels <= 2) { guint32 block_samples; block_samples = GST_READ_UINT32_LE (GST_BUFFER_DATA (*buf)); /* we need to reconstruct the header of the wavpack block */ /* -20 because ck_size is the size of the wavpack block -8 * and lace_size is the size of the wavpack block + 12 * (the three guint32 of the header that already are in the buffer) */ wvh.ck_size = GST_BUFFER_SIZE (*buf) + sizeof (Wavpack4Header) - 20; /* block_samples, flags and crc are already in the buffer */ newlen = GST_BUFFER_SIZE (*buf) + sizeof (Wavpack4Header) - 12; newbuf = gst_buffer_new_and_alloc (newlen); gst_buffer_set_caps (newbuf, stream->caps); data = GST_BUFFER_DATA (newbuf); data[0] = 'w'; data[1] = 'v'; data[2] = 'p'; data[3] = 'k'; GST_WRITE_UINT32_LE (data + 4, wvh.ck_size); GST_WRITE_UINT16_LE (data + 8, wvh.version); GST_WRITE_UINT8 (data + 10, wvh.track_no); GST_WRITE_UINT8 (data + 11, wvh.index_no); GST_WRITE_UINT32_LE (data + 12, wvh.total_samples); GST_WRITE_UINT32_LE (data + 16, wvh.block_index); g_memmove (data + 20, GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf)); gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); gst_buffer_unref (*buf); *buf = newbuf; audiocontext->wvpk_block_index += block_samples; } else { guint8 *outdata; guint outpos = 0; guint size; guint32 block_samples, flags, crc, blocksize; data = GST_BUFFER_DATA (*buf); size = GST_BUFFER_SIZE (*buf); if (size < 4) { GST_ERROR_OBJECT (element, "Too small wavpack buffer"); return GST_FLOW_ERROR; } block_samples = GST_READ_UINT32_LE (data); data += 4; size -= 4; while (size > 12) { flags = GST_READ_UINT32_LE (data); data += 4; size -= 4; crc = GST_READ_UINT32_LE (data); data += 4; size -= 4; blocksize = GST_READ_UINT32_LE (data); data += 4; size -= 4; if (blocksize == 0 || size < blocksize) break; if (newbuf == NULL) { newbuf = gst_buffer_new_and_alloc (sizeof (Wavpack4Header) + blocksize); gst_buffer_set_caps (newbuf, stream->caps); gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS); outpos = 0; outdata = GST_BUFFER_DATA (newbuf); } else { GST_BUFFER_SIZE (newbuf) += sizeof (Wavpack4Header) + blocksize; GST_BUFFER_DATA (newbuf) = g_realloc (GST_BUFFER_DATA (newbuf), GST_BUFFER_SIZE (newbuf)); GST_BUFFER_MALLOCDATA (newbuf) = GST_BUFFER_DATA (newbuf); outdata = GST_BUFFER_DATA (newbuf); } outdata[outpos] = 'w'; outdata[outpos + 1] = 'v'; outdata[outpos + 2] = 'p'; outdata[outpos + 3] = 'k'; outpos += 4; GST_WRITE_UINT32_LE (outdata + outpos, blocksize + sizeof (Wavpack4Header) - 8); GST_WRITE_UINT16_LE (outdata + outpos + 4, wvh.version); GST_WRITE_UINT8 (outdata + outpos + 6, wvh.track_no); GST_WRITE_UINT8 (outdata + outpos + 7, wvh.index_no); GST_WRITE_UINT32_LE (outdata + outpos + 8, wvh.total_samples); GST_WRITE_UINT32_LE (outdata + outpos + 12, wvh.block_index); GST_WRITE_UINT32_LE (outdata + outpos + 16, block_samples); GST_WRITE_UINT32_LE (outdata + outpos + 20, flags); GST_WRITE_UINT32_LE (outdata + outpos + 24, crc); outpos += 28; g_memmove (outdata + outpos, data, blocksize); outpos += blocksize; data += blocksize; size -= blocksize; } gst_buffer_unref (*buf); *buf = newbuf; audiocontext->wvpk_block_index += block_samples; } return GST_FLOW_OK; } /* @text must be null-terminated */ static gboolean gst_matroska_demux_subtitle_chunk_has_tag (GstElement * element, const gchar * text) { gchar *tag; /* yes, this might all lead to false positives ... */ tag = (gchar *) text; while ((tag = strchr (tag, '<'))) { tag++; if (*tag != '\0' && *(tag + 1) == '>') { /* some common convenience ones */ /* maybe any character will do here ? */ switch (*tag) { case 'b': case 'i': case 'u': case 's': return TRUE; default: return FALSE; } } } if (strstr (text, "invalid_utf8) { if (g_utf8_validate (data, size, NULL)) { goto next; } GST_WARNING_OBJECT (element, "subtitle stream %d is not valid UTF-8, this " "is broken according to the matroska specification", stream->num); sub_stream->invalid_utf8 = TRUE; } /* file with broken non-UTF8 subtitle, do the best we can do to fix it */ encoding = g_getenv ("GST_SUBTITLE_ENCODING"); if (encoding == NULL || *encoding == '\0') { /* if local encoding is UTF-8 and no encoding specified * via the environment variable, assume ISO-8859-15 */ if (g_get_charset (&encoding)) { encoding = "ISO-8859-15"; } } utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*", NULL, NULL, &err); if (err) { GST_LOG_OBJECT (element, "could not convert string from '%s' to UTF-8: %s", encoding, err->message); g_error_free (err); g_free (utf8); /* invalid input encoding, fall back to ISO-8859-15 (always succeeds) */ encoding = "ISO-8859-15"; utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*", NULL, NULL, NULL); } GST_LOG_OBJECT (element, "converted subtitle text from %s to UTF-8 %s", encoding, (err) ? "(using ISO-8859-15 as fallback)" : ""); if (utf8 == NULL) utf8 = g_strdup ("invalid subtitle"); newbuf = gst_buffer_new (); GST_BUFFER_MALLOCDATA (newbuf) = (guint8 *) utf8; GST_BUFFER_DATA (newbuf) = (guint8 *) utf8; GST_BUFFER_SIZE (newbuf) = strlen (utf8); gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_ALL); gst_buffer_unref (*buf); *buf = newbuf; data = (const gchar *) GST_BUFFER_DATA (*buf); size = GST_BUFFER_SIZE (*buf); next: if (sub_stream->check_markup) { /* caps claim markup text, so we need to escape text, * except if text is already markup and then needs no further escaping */ sub_stream->seen_markup_tag = sub_stream->seen_markup_tag || gst_matroska_demux_subtitle_chunk_has_tag (element, data); if (!sub_stream->seen_markup_tag) { utf8 = g_markup_escape_text (data, size); newbuf = gst_buffer_new (); GST_BUFFER_MALLOCDATA (newbuf) = (guint8 *) utf8; GST_BUFFER_DATA (newbuf) = (guint8 *) utf8; GST_BUFFER_SIZE (newbuf) = strlen (utf8); gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_ALL); gst_buffer_unref (*buf); *buf = newbuf; } } return GST_FLOW_OK; } static GstFlowReturn gst_matroska_demux_check_aac (GstElement * element, GstMatroskaTrackContext * stream, GstBuffer ** buf) { const guint8 *data; guint size; data = GST_BUFFER_DATA (*buf); size = GST_BUFFER_SIZE (*buf); if (size > 2 && data[0] == 0xff && (data[1] >> 4 == 0x0f)) { GstCaps *new_caps; GstStructure *s; /* tss, ADTS data, remove codec_data * still assume it is at least parsed */ new_caps = gst_caps_copy (stream->caps); s = gst_caps_get_structure (new_caps, 0); g_assert (s); gst_structure_remove_field (s, "codec_data"); gst_caps_replace (&stream->caps, new_caps); gst_pad_set_caps (stream->pad, new_caps); gst_buffer_set_caps (*buf, new_caps); GST_DEBUG_OBJECT (element, "ADTS AAC audio data; removing codec-data, " "new caps: %" GST_PTR_FORMAT, new_caps); gst_caps_unref (new_caps); } /* disable subsequent checking */ stream->postprocess_frame = NULL; return GST_FLOW_OK; } static GstFlowReturn gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset, gboolean is_simpleblock) { GstMatroskaTrackContext *stream = NULL; GstFlowReturn ret = GST_FLOW_OK; gboolean readblock = FALSE; guint32 id; guint64 block_duration = -1; GstBuffer *buf = NULL; gint stream_num = -1, n, laces = 0; guint size = 0; gint *lace_size = NULL; gint64 time = 0; gint flags = 0; gint64 referenceblock = 0; gint64 offset; offset = gst_ebml_read_get_offset (ebml); while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if (!is_simpleblock) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) { goto data_error; } } else { id = GST_MATROSKA_ID_SIMPLEBLOCK; } switch (id) { /* one block inside the group. Note, block parsing is one * of the harder things, so this code is a bit complicated. * See http://www.matroska.org/ for documentation. */ case GST_MATROSKA_ID_SIMPLEBLOCK: case GST_MATROSKA_ID_BLOCK: { guint64 num; guint8 *data; if (buf) { gst_buffer_unref (buf); buf = NULL; } if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK) break; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* first byte(s): blocknum */ if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) goto data_error; data += n; size -= n; /* fetch stream from num */ stream_num = gst_matroska_read_common_stream_from_num (&demux->common, num); if (G_UNLIKELY (size < 3)) { GST_WARNING_OBJECT (demux, "Invalid size %u", size); /* non-fatal, try next block(group) */ ret = GST_FLOW_OK; goto done; } else if (G_UNLIKELY (stream_num < 0 || stream_num >= demux->common.num_streams)) { /* let's not give up on a stray invalid track number */ GST_WARNING_OBJECT (demux, "Invalid stream %d for track number %" G_GUINT64_FORMAT "; ignoring block", stream_num, num); goto done; } stream = g_ptr_array_index (demux->common.src, stream_num); /* time (relative to cluster time) */ time = ((gint16) GST_READ_UINT16_BE (data)); data += 2; size -= 2; flags = GST_READ_UINT8 (data); data += 1; size -= 1; GST_LOG_OBJECT (demux, "time %" G_GUINT64_FORMAT ", flags %d", time, flags); switch ((flags & 0x06) >> 1) { case 0x0: /* no lacing */ laces = 1; lace_size = g_new (gint, 1); lace_size[0] = size; break; case 0x1: /* xiph lacing */ case 0x2: /* fixed-size lacing */ case 0x3: /* EBML lacing */ if (size == 0) goto invalid_lacing; laces = GST_READ_UINT8 (data) + 1; data += 1; size -= 1; lace_size = g_new0 (gint, laces); switch ((flags & 0x06) >> 1) { case 0x1: /* xiph lacing */ { guint temp, total = 0; for (n = 0; ret == GST_FLOW_OK && n < laces - 1; n++) { while (1) { if (size == 0) goto invalid_lacing; temp = GST_READ_UINT8 (data); lace_size[n] += temp; data += 1; size -= 1; if (temp != 0xff) break; } total += lace_size[n]; } lace_size[n] = size - total; break; } case 0x2: /* fixed-size lacing */ for (n = 0; n < laces; n++) lace_size[n] = size / laces; break; case 0x3: /* EBML lacing */ { guint total; if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) goto data_error; data += n; size -= n; total = lace_size[0] = num; for (n = 1; ret == GST_FLOW_OK && n < laces - 1; n++) { gint64 snum; gint r; if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) goto data_error; data += r; size -= r; lace_size[n] = lace_size[n - 1] + snum; total += lace_size[n]; } if (n < laces) lace_size[n] = size - total; break; } } break; } if (stream->send_xiph_headers) { ret = gst_matroska_demux_push_xiph_codec_priv_data (demux, stream); stream->send_xiph_headers = FALSE; } if (stream->send_flac_headers) { ret = gst_matroska_demux_push_flac_codec_priv_data (demux, stream); stream->send_flac_headers = FALSE; } if (stream->send_speex_headers) { ret = gst_matroska_demux_push_speex_codec_priv_data (demux, stream); stream->send_speex_headers = FALSE; } if (stream->send_dvd_event) { gst_matroska_demux_push_dvd_clut_change_event (demux, stream); /* FIXME: should we send this event again after (flushing) seek ? */ stream->send_dvd_event = FALSE; } if (ret != GST_FLOW_OK) break; readblock = TRUE; break; } case GST_MATROSKA_ID_BLOCKDURATION:{ ret = gst_ebml_read_uint (ebml, &id, &block_duration); GST_DEBUG_OBJECT (demux, "BlockDuration: %" G_GUINT64_FORMAT, block_duration); break; } case GST_MATROSKA_ID_REFERENCEBLOCK:{ ret = gst_ebml_read_sint (ebml, &id, &referenceblock); GST_DEBUG_OBJECT (demux, "ReferenceBlock: %" G_GINT64_FORMAT, referenceblock); break; } case GST_MATROSKA_ID_CODECSTATE:{ guint8 *data; guint64 data_len = 0; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &data_len)) != GST_FLOW_OK) break; if (G_UNLIKELY (stream == NULL)) { GST_WARNING_OBJECT (demux, "Unexpected CodecState subelement - ignoring"); break; } g_free (stream->codec_state); stream->codec_state = data; stream->codec_state_size = data_len; /* Decode if necessary */ if (stream->encodings && stream->encodings->len > 0 && stream->codec_state && stream->codec_state_size > 0) { if (!gst_matroska_decode_data (stream->encodings, &stream->codec_state, &stream->codec_state_size, GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) { GST_WARNING_OBJECT (demux, "Decoding codec state failed"); } } GST_DEBUG_OBJECT (demux, "CodecState of %u bytes", stream->codec_state_size); break; } default: ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, "BlockGroup", id); break; case GST_MATROSKA_ID_BLOCKVIRTUAL: case GST_MATROSKA_ID_BLOCKADDITIONS: case GST_MATROSKA_ID_REFERENCEPRIORITY: case GST_MATROSKA_ID_REFERENCEVIRTUAL: case GST_MATROSKA_ID_SLICES: GST_DEBUG_OBJECT (demux, "Skipping BlockGroup subelement 0x%x - ignoring", id); ret = gst_ebml_read_skip (ebml); break; } if (is_simpleblock) break; } /* reading a number or so could have failed */ if (ret != GST_FLOW_OK) goto data_error; if (ret == GST_FLOW_OK && readblock) { guint64 duration = 0; gint64 lace_time = 0; gboolean delta_unit; stream = g_ptr_array_index (demux->common.src, stream_num); if (cluster_time != GST_CLOCK_TIME_NONE) { /* FIXME: What to do with negative timestamps? Give timestamp 0 or -1? * Drop unless the lace contains timestamp 0? */ if (time < 0 && (-time) > cluster_time) { lace_time = 0; } else { if (stream->timecodescale == 1.0) lace_time = (cluster_time + time) * demux->common.time_scale; else lace_time = gst_util_guint64_to_gdouble ((cluster_time + time) * demux->common.time_scale) * stream->timecodescale; } } else { lace_time = GST_CLOCK_TIME_NONE; } /* need to refresh segment info ASAP */ if (GST_CLOCK_TIME_IS_VALID (lace_time) && demux->need_newsegment) { guint64 clace_time; GST_DEBUG_OBJECT (demux, "generating segment starting at %" GST_TIME_FORMAT, GST_TIME_ARGS (lace_time)); if (!GST_CLOCK_TIME_IS_VALID (demux->stream_start_time)) { demux->stream_start_time = lace_time; GST_DEBUG_OBJECT (demux, "Setting stream start time to %" GST_TIME_FORMAT, GST_TIME_ARGS (lace_time)); } clace_time = MAX (lace_time, demux->stream_start_time); gst_segment_set_newsegment (&demux->common.segment, FALSE, demux->common.segment.rate, GST_FORMAT_TIME, clace_time, GST_CLOCK_TIME_NONE, clace_time - demux->stream_start_time); /* now convey our segment notion downstream */ gst_matroska_demux_send_event (demux, gst_event_new_new_segment (FALSE, demux->common.segment.rate, demux->common.segment.format, demux->common.segment.start, demux->common.segment.stop, demux->common.segment.start)); demux->need_newsegment = FALSE; } if (block_duration != -1) { if (stream->timecodescale == 1.0) duration = gst_util_uint64_scale (block_duration, demux->common.time_scale, 1); else duration = gst_util_gdouble_to_guint64 (gst_util_guint64_to_gdouble (gst_util_uint64_scale (block_duration, demux->common.time_scale, 1)) * stream->timecodescale); } else if (stream->default_duration) { duration = stream->default_duration * laces; } /* else duration is diff between timecode of this and next block */ /* For SimpleBlock, look at the keyframe bit in flags. Otherwise, a ReferenceBlock implies that this is not a keyframe. In either case, it only makes sense for video streams. */ delta_unit = stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && ((is_simpleblock && !(flags & 0x80)) || referenceblock); if (delta_unit && stream->set_discont) { /* When doing seeks or such, we need to restart on key frames or * decoders might choke. */ GST_DEBUG_OBJECT (demux, "skipping delta unit"); goto done; } for (n = 0; n < laces; n++) { GstBuffer *sub; if (G_UNLIKELY (lace_size[n] > size)) { GST_WARNING_OBJECT (demux, "Invalid lace size"); break; } /* QoS for video track with an index. the assumption is that index entries point to keyframes, but if that is not true we will instad skip until the next keyframe. */ if (GST_CLOCK_TIME_IS_VALID (lace_time) && stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table && demux->common.segment.rate > 0.0) { GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) stream; GstClockTime earliest_time; GstClockTime earliest_stream_time; GST_OBJECT_LOCK (demux); earliest_time = videocontext->earliest_time; GST_OBJECT_UNLOCK (demux); earliest_stream_time = gst_segment_to_position (&demux->common.segment, GST_FORMAT_TIME, earliest_time); if (GST_CLOCK_TIME_IS_VALID (lace_time) && GST_CLOCK_TIME_IS_VALID (earliest_stream_time) && lace_time <= earliest_stream_time) { /* find index entry (keyframe) <= earliest_stream_time */ GstMatroskaIndex *entry = gst_util_array_binary_search (stream->index_table->data, stream->index_table->len, sizeof (GstMatroskaIndex), (GCompareDataFunc) gst_matroska_index_seek_find, GST_SEARCH_MODE_BEFORE, &earliest_stream_time, NULL); /* if that entry (keyframe) is after the current the current buffer, we can skip pushing (and thus decoding) all buffers until that keyframe. */ if (entry && GST_CLOCK_TIME_IS_VALID (entry->time) && entry->time > lace_time) { GST_LOG_OBJECT (demux, "Skipping lace before late keyframe"); stream->set_discont = TRUE; goto next_lace; } } } sub = gst_buffer_create_sub (buf, GST_BUFFER_SIZE (buf) - size, lace_size[n]); GST_DEBUG_OBJECT (demux, "created subbuffer %p", sub); if (delta_unit) GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT); else GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT); if (stream->encodings != NULL && stream->encodings->len > 0) sub = gst_matroska_decode_buffer (stream, sub); if (sub == NULL) { GST_WARNING_OBJECT (demux, "Decoding buffer failed"); goto next_lace; } GST_BUFFER_TIMESTAMP (sub) = lace_time; if (GST_CLOCK_TIME_IS_VALID (lace_time)) { GstClockTime last_stop_end; /* Check if this stream is after segment stop */ if (GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop) && lace_time >= demux->common.segment.stop) { GST_DEBUG_OBJECT (demux, "Stream %d after segment stop %" GST_TIME_FORMAT, stream->index, GST_TIME_ARGS (demux->common.segment.stop)); gst_buffer_unref (sub); goto eos; } if (offset >= stream->to_offset) { GST_DEBUG_OBJECT (demux, "Stream %d after playback section", stream->index); gst_buffer_unref (sub); goto eos; } /* handle gaps, e.g. non-zero start-time, or an cue index entry * that landed us with timestamps not quite intended */ GST_OBJECT_LOCK (demux); if (demux->max_gap_time && GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) && demux->common.segment.rate > 0.0) { GstClockTimeDiff diff; GstEvent *event1, *event2; /* only send newsegments with increasing start times, * otherwise if these go back and forth downstream (sinks) increase * accumulated time and running_time */ diff = GST_CLOCK_DIFF (demux->last_stop_end, lace_time); if (diff > 0 && diff > demux->max_gap_time && lace_time > demux->common.segment.start && (!GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop) || lace_time < demux->common.segment.stop)) { GST_DEBUG_OBJECT (demux, "Gap of %" G_GINT64_FORMAT " ns detected in" "stream %d (%" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "). " "Sending updated NEWSEGMENT events", diff, stream->index, GST_TIME_ARGS (stream->pos), GST_TIME_ARGS (lace_time)); /* send newsegment events such that the gap is not accounted in * accum time, hence running_time */ /* close ahead of gap */ event1 = gst_event_new_new_segment (TRUE, demux->common.segment.rate, demux->common.segment.format, demux->last_stop_end, demux->last_stop_end, demux->last_stop_end); /* skip gap */ event2 = gst_event_new_new_segment (FALSE, demux->common.segment.rate, demux->common.segment.format, lace_time, demux->common.segment.stop, lace_time); GST_OBJECT_UNLOCK (demux); gst_matroska_demux_send_event (demux, event1); gst_matroska_demux_send_event (demux, event2); GST_OBJECT_LOCK (demux); /* align segment view with downstream, * prevents double-counting accum when closing segment */ gst_segment_set_newsegment (&demux->common.segment, FALSE, demux->common.segment.rate, demux->common.segment.format, lace_time, demux->common.segment.stop, lace_time); demux->common.segment.last_stop = lace_time; } } if (!GST_CLOCK_TIME_IS_VALID (demux->common.segment.last_stop) || demux->common.segment.last_stop < lace_time) { demux->common.segment.last_stop = lace_time; } GST_OBJECT_UNLOCK (demux); last_stop_end = lace_time; if (duration) { GST_BUFFER_DURATION (sub) = duration / laces; last_stop_end += GST_BUFFER_DURATION (sub); } if (!GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) || demux->last_stop_end < last_stop_end) demux->last_stop_end = last_stop_end; GST_OBJECT_LOCK (demux); if (demux->common.segment.duration == -1 || demux->stream_start_time + demux->common.segment.duration < last_stop_end) { gst_segment_set_duration (&demux->common.segment, GST_FORMAT_TIME, last_stop_end - demux->stream_start_time); GST_OBJECT_UNLOCK (demux); if (!demux->invalid_duration) { gst_element_post_message (GST_ELEMENT_CAST (demux), gst_message_new_duration (GST_OBJECT_CAST (demux), GST_FORMAT_TIME, GST_CLOCK_TIME_NONE)); demux->invalid_duration = TRUE; } } else { GST_OBJECT_UNLOCK (demux); } } stream->pos = lace_time; gst_matroska_demux_sync_streams (demux); if (stream->set_discont) { GST_DEBUG_OBJECT (demux, "marking DISCONT"); GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DISCONT); stream->set_discont = FALSE; } /* reverse playback book-keeping */ if (!GST_CLOCK_TIME_IS_VALID (stream->from_time)) stream->from_time = lace_time; if (stream->from_offset == -1) stream->from_offset = offset; GST_DEBUG_OBJECT (demux, "Pushing lace %d, data of size %d for stream %d, time=%" GST_TIME_FORMAT " and duration=%" GST_TIME_FORMAT, n, GST_BUFFER_SIZE (sub), stream_num, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), GST_TIME_ARGS (GST_BUFFER_DURATION (sub))); if (demux->common.element_index) { if (stream->index_writer_id == -1) gst_index_get_writer_id (demux->common.element_index, GST_OBJECT (stream->pad), &stream->index_writer_id); GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT " for writer id %d", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), cluster_offset, stream->index_writer_id); gst_index_add_association (demux->common.element_index, stream->index_writer_id, GST_BUFFER_FLAG_IS_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (sub), GST_FORMAT_BYTES, cluster_offset, NULL); } gst_buffer_set_caps (sub, GST_PAD_CAPS (stream->pad)); /* Postprocess the buffers depending on the codec used */ if (stream->postprocess_frame) { GST_LOG_OBJECT (demux, "running post process"); ret = stream->postprocess_frame (GST_ELEMENT (demux), stream, &sub); } /* At this point, we have a sub-buffer pointing at data within a larger buffer. This data might not be aligned with anything. If the data is raw samples though, we want it aligned to the raw type (eg, 4 bytes for 32 bit samples, etc), or bad things will happen downstream as elements typically assume minimal alignment. Therefore, create an aligned copy if necessary. */ g_assert (stream->alignment <= G_MEM_ALIGN); if (((guintptr) GST_BUFFER_DATA (sub)) & (stream->alignment - 1)) { GstBuffer *buffer = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (sub)); memcpy (GST_BUFFER_DATA (buffer), GST_BUFFER_DATA (sub), GST_BUFFER_SIZE (sub)); gst_buffer_copy_metadata (buffer, sub, GST_BUFFER_COPY_ALL); GST_DEBUG_OBJECT (demux, "We want output aligned on %d, reallocated", stream->alignment); gst_buffer_unref (sub); sub = buffer; } ret = gst_pad_push (stream->pad, sub); if (demux->common.segment.rate < 0) { if (lace_time > demux->common.segment.stop && ret == GST_FLOW_UNEXPECTED) { /* In reverse playback we can get a GST_FLOW_UNEXPECTED when * we are at the end of the segment, so we just need to jump * back to the previous section. */ GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); ret = GST_FLOW_OK; } } /* combine flows */ ret = gst_matroska_demux_combine_flows (demux, stream, ret); next_lace: size -= lace_size[n]; if (lace_time != GST_CLOCK_TIME_NONE && duration) lace_time += duration / laces; else lace_time = GST_CLOCK_TIME_NONE; } } done: if (buf) gst_buffer_unref (buf); g_free (lace_size); return ret; /* EXITS */ eos: { stream->eos = TRUE; ret = GST_FLOW_OK; /* combine flows */ ret = gst_matroska_demux_combine_flows (demux, stream, ret); goto done; } invalid_lacing: { GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Invalid lacing size")); /* non-fatal, try next block(group) */ ret = GST_FLOW_OK; goto done; } data_error: { GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Data error")); /* non-fatal, try next block(group) */ ret = GST_FLOW_OK; goto done; } } /* return FALSE if block(group) should be skipped (due to a seek) */ static inline gboolean gst_matroska_demux_seek_block (GstMatroskaDemux * demux) { if (G_UNLIKELY (demux->seek_block)) { if (!(--demux->seek_block)) { return TRUE; } else { GST_LOG_OBJECT (demux, "should skip block due to seek"); return FALSE; } } else { return TRUE; } } static GstFlowReturn gst_matroska_demux_parse_contents_seekentry (GstMatroskaDemux * demux, GstEbmlRead * ebml) { GstFlowReturn ret; guint64 seek_pos = (guint64) - 1; guint32 seek_id = 0; guint32 id; DEBUG_ELEMENT_START (demux, ebml, "Seek"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (demux, ebml, "Seek", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_SEEKID: { guint64 t; if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (demux, "SeekID: %" G_GUINT64_FORMAT, t); seek_id = t; break; } case GST_MATROSKA_ID_SEEKPOSITION: { guint64 t; if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) break; if (t > G_MAXINT64) { GST_WARNING_OBJECT (demux, "Too large SeekPosition %" G_GUINT64_FORMAT, t); break; } GST_DEBUG_OBJECT (demux, "SeekPosition: %" G_GUINT64_FORMAT, t); seek_pos = t; break; } default: ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, "SeekHead", id); break; } } if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) return ret; if (!seek_id || seek_pos == (guint64) - 1) { GST_WARNING_OBJECT (demux, "Incomplete seekhead entry (0x%x/%" G_GUINT64_FORMAT ")", seek_id, seek_pos); return GST_FLOW_OK; } switch (seek_id) { case GST_MATROSKA_ID_SEEKHEAD: { } case GST_MATROSKA_ID_CUES: case GST_MATROSKA_ID_TAGS: case GST_MATROSKA_ID_TRACKS: case GST_MATROSKA_ID_SEGMENTINFO: case GST_MATROSKA_ID_ATTACHMENTS: case GST_MATROSKA_ID_CHAPTERS: { guint64 before_pos, length; guint needed; /* remember */ length = gst_matroska_read_common_get_length (&demux->common); before_pos = demux->common.offset; if (length == (guint64) - 1) { GST_DEBUG_OBJECT (demux, "no upstream length, skipping SeakHead entry"); break; } /* check for validity */ if (seek_pos + demux->common.ebml_segment_start + 12 >= length) { GST_WARNING_OBJECT (demux, "SeekHead reference lies outside file!" " (%" G_GUINT64_FORMAT "+%" G_GUINT64_FORMAT "+12 >= %" G_GUINT64_FORMAT ")", seek_pos, demux->common.ebml_segment_start, length); break; } /* only pick up index location when streaming */ if (demux->streaming) { if (seek_id == GST_MATROSKA_ID_CUES) { demux->index_offset = seek_pos + demux->common.ebml_segment_start; GST_DEBUG_OBJECT (demux, "Cues located at offset %" G_GUINT64_FORMAT, demux->index_offset); } break; } /* seek */ demux->common.offset = seek_pos + demux->common.ebml_segment_start; /* check ID */ if ((ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed)) != GST_FLOW_OK) goto finish; if (id != seek_id) { GST_WARNING_OBJECT (demux, "We looked for ID=0x%x but got ID=0x%x (pos=%" G_GUINT64_FORMAT ")", seek_id, id, seek_pos + demux->common.ebml_segment_start); } else { /* now parse */ ret = gst_matroska_demux_parse_id (demux, id, length, needed); } finish: /* seek back */ demux->common.offset = before_pos; break; } case GST_MATROSKA_ID_CLUSTER: { guint64 pos = seek_pos + demux->common.ebml_segment_start; GST_LOG_OBJECT (demux, "Cluster position"); if (G_UNLIKELY (!demux->clusters)) demux->clusters = g_array_sized_new (TRUE, TRUE, sizeof (guint64), 100); g_array_append_val (demux->clusters, pos); break; } default: GST_DEBUG_OBJECT (demux, "Ignoring Seek entry for ID=0x%x", seek_id); break; } DEBUG_ELEMENT_STOP (demux, ebml, "Seek", ret); return ret; } static GstFlowReturn gst_matroska_demux_parse_contents (GstMatroskaDemux * demux, GstEbmlRead * ebml) { GstFlowReturn ret = GST_FLOW_OK; guint32 id; DEBUG_ELEMENT_START (demux, ebml, "SeekHead"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_SEEKENTRY: { ret = gst_matroska_demux_parse_contents_seekentry (demux, ebml); /* Ignore EOS and errors here */ if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (demux, "Ignoring %s", gst_flow_get_name (ret)); ret = GST_FLOW_OK; } break; } default: ret = gst_matroska_read_common_parse_skip (&demux->common, ebml, "SeekHead", id); break; } } DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret); /* Sort clusters by position for easier searching */ if (demux->clusters) g_array_sort (demux->clusters, (GCompareFunc) gst_matroska_cluster_compare); return ret; } #define GST_FLOW_OVERFLOW GST_FLOW_CUSTOM_ERROR #define MAX_BLOCK_SIZE (15 * 1024 * 1024) static inline GstFlowReturn gst_matroska_demux_check_read_size (GstMatroskaDemux * demux, guint64 bytes) { if (G_UNLIKELY (bytes > MAX_BLOCK_SIZE)) { /* only a few blocks are expected/allowed to be large, * and will be recursed into, whereas others will be read and must fit */ if (demux->streaming) { /* fatal in streaming case, as we can't step over easily */ GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("reading large block of size %" G_GUINT64_FORMAT " not supported; " "file might be corrupt.", bytes)); return GST_FLOW_ERROR; } else { /* indicate higher level to quietly give up */ GST_DEBUG_OBJECT (demux, "too large block of size %" G_GUINT64_FORMAT, bytes); return GST_FLOW_ERROR; } } else { return GST_FLOW_OK; } } /* returns TRUE if we truely are in error state, and should give up */ static inline gboolean gst_matroska_demux_check_parse_error (GstMatroskaDemux * demux) { if (!demux->streaming && demux->next_cluster_offset > 0) { /* just repositioning to where next cluster should be and try from there */ GST_WARNING_OBJECT (demux, "parse error, trying next cluster expected at %" G_GUINT64_FORMAT, demux->next_cluster_offset); demux->common.offset = demux->next_cluster_offset; demux->next_cluster_offset = 0; return FALSE; } else { gint64 pos; /* sigh, one last attempt above and beyond call of duty ...; * search for cluster mark following current pos */ pos = demux->common.offset; GST_WARNING_OBJECT (demux, "parse error, looking for next cluster"); if (gst_matroska_demux_search_cluster (demux, &pos) != GST_FLOW_OK) { /* did not work, give up */ return TRUE; } else { GST_DEBUG_OBJECT (demux, "... found at %" G_GUINT64_FORMAT, pos); /* try that position */ demux->common.offset = pos; return FALSE; } } } static inline GstFlowReturn gst_matroska_demux_flush (GstMatroskaDemux * demux, guint flush) { GST_LOG_OBJECT (demux, "skipping %d bytes", flush); demux->common.offset += flush; if (demux->streaming) { GstFlowReturn ret; /* hard to skip large blocks when streaming */ ret = gst_matroska_demux_check_read_size (demux, flush); if (ret != GST_FLOW_OK) return ret; if (flush <= gst_adapter_available (demux->common.adapter)) gst_adapter_flush (demux->common.adapter, flush); else return GST_FLOW_UNEXPECTED; } return GST_FLOW_OK; } /* initializes @ebml with @bytes from input stream at current offset. * Returns UNEXPECTED if insufficient available, * ERROR if too much was attempted to read. */ static inline GstFlowReturn gst_matroska_demux_take (GstMatroskaDemux * demux, guint64 bytes, GstEbmlRead * ebml) { GstBuffer *buffer = NULL; GstFlowReturn ret = GST_FLOW_OK; GST_LOG_OBJECT (demux, "taking %" G_GUINT64_FORMAT " bytes for parsing", bytes); ret = gst_matroska_demux_check_read_size (demux, bytes); if (G_UNLIKELY (ret != GST_FLOW_OK)) { if (!demux->streaming) { /* in pull mode, we can skip */ if ((ret = gst_matroska_demux_flush (demux, bytes)) == GST_FLOW_OK) ret = GST_FLOW_OVERFLOW; } else { /* otherwise fatal */ ret = GST_FLOW_ERROR; } goto exit; } if (demux->streaming) { if (gst_adapter_available (demux->common.adapter) >= bytes) buffer = gst_adapter_take_buffer (demux->common.adapter, bytes); else ret = GST_FLOW_UNEXPECTED; } else ret = gst_matroska_read_common_peek_bytes (&demux->common, demux->common.offset, bytes, &buffer, NULL); if (G_LIKELY (buffer)) { gst_ebml_read_init (ebml, GST_ELEMENT_CAST (demux), buffer, demux->common.offset); demux->common.offset += bytes; } exit: return ret; } static void gst_matroska_demux_check_seekability (GstMatroskaDemux * demux) { GstQuery *query; gboolean seekable = FALSE; gint64 start = -1, stop = -1; query = gst_query_new_seeking (GST_FORMAT_BYTES); if (!gst_pad_peer_query (demux->common.sinkpad, query)) { GST_DEBUG_OBJECT (demux, "seeking query failed"); goto done; } gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); /* try harder to query upstream size if we didn't get it the first time */ if (seekable && stop == -1) { GstFormat fmt = GST_FORMAT_BYTES; GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop"); gst_pad_query_peer_duration (demux->common.sinkpad, &fmt, &stop); } /* if upstream doesn't know the size, it's likely that it's not seekable in * practice even if it technically may be seekable */ if (seekable && (start != 0 || stop <= start)) { GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable"); seekable = FALSE; } done: GST_INFO_OBJECT (demux, "seekable: %d (%" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT ")", seekable, start, stop); demux->seekable = seekable; gst_query_unref (query); } static GstFlowReturn gst_matroska_demux_find_tracks (GstMatroskaDemux * demux) { guint32 id; guint64 before_pos; guint64 length; guint needed; GstFlowReturn ret = GST_FLOW_OK; GST_WARNING_OBJECT (demux, "Found Cluster element before Tracks, searching Tracks"); /* remember */ before_pos = demux->common.offset; /* Search Tracks element */ while (TRUE) { ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (ret != GST_FLOW_OK) break; if (id != GST_MATROSKA_ID_TRACKS) { /* we may be skipping large cluster here, so forego size check etc */ /* ... but we can't skip undefined size; force error */ if (length == G_MAXUINT64) { ret = gst_matroska_demux_check_read_size (demux, length); break; } else { demux->common.offset += needed; demux->common.offset += length; } continue; } /* will lead to track parsing ... */ ret = gst_matroska_demux_parse_id (demux, id, length, needed); break; } /* seek back */ demux->common.offset = before_pos; return ret; } #define GST_READ_CHECK(stmt) \ G_STMT_START { \ if (G_UNLIKELY ((ret = (stmt)) != GST_FLOW_OK)) { \ if (ret == GST_FLOW_OVERFLOW) { \ ret = GST_FLOW_OK; \ } \ goto read_error; \ } \ } G_STMT_END static GstFlowReturn gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id, guint64 length, guint needed) { GstEbmlRead ebml = { 0, }; GstFlowReturn ret = GST_FLOW_OK; guint64 read; GST_LOG_OBJECT (demux, "Parsing Element id 0x%x, " "size %" G_GUINT64_FORMAT ", prefix %d", id, length, needed); /* if we plan to read and parse this element, we need prefix (id + length) * and the contents */ /* mind about overflow wrap-around when dealing with undefined size */ read = length; if (G_LIKELY (length != G_MAXUINT64)) read += needed; switch (demux->common.state) { case GST_MATROSKA_READ_STATE_START: switch (id) { case GST_EBML_ID_HEADER: GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_read_common_parse_header (&demux->common, &ebml); if (ret != GST_FLOW_OK) goto parse_failed; demux->common.state = GST_MATROSKA_READ_STATE_SEGMENT; gst_matroska_demux_check_seekability (demux); break; default: goto invalid_header; break; } break; case GST_MATROSKA_READ_STATE_SEGMENT: switch (id) { case GST_MATROSKA_ID_SEGMENT: /* eat segment prefix */ GST_READ_CHECK (gst_matroska_demux_flush (demux, needed)); GST_DEBUG_OBJECT (demux, "Found Segment start at offset %" G_GUINT64_FORMAT, demux->common.offset); /* seeks are from the beginning of the segment, * after the segment ID/length */ demux->common.ebml_segment_start = demux->common.offset; demux->common.state = GST_MATROSKA_READ_STATE_HEADER; break; default: GST_WARNING_OBJECT (demux, "Expected a Segment ID (0x%x), but received 0x%x!", GST_MATROSKA_ID_SEGMENT, id); GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); break; } break; case GST_MATROSKA_READ_STATE_SCANNING: if (id != GST_MATROSKA_ID_CLUSTER && id != GST_MATROSKA_ID_CLUSTERTIMECODE) goto skip; /* fall-through */ case GST_MATROSKA_READ_STATE_HEADER: case GST_MATROSKA_READ_STATE_DATA: case GST_MATROSKA_READ_STATE_SEEK: switch (id) { case GST_MATROSKA_ID_SEGMENTINFO: if (!demux->common.segmentinfo_parsed) { GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_read_common_parse_info (&demux->common, GST_ELEMENT_CAST (demux), &ebml); } else { GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); } break; case GST_MATROSKA_ID_TRACKS: if (!demux->tracks_parsed) { GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_demux_parse_tracks (demux, &ebml); } else { GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); } break; case GST_MATROSKA_ID_CLUSTER: if (G_UNLIKELY (!demux->tracks_parsed)) { if (demux->streaming) { GST_DEBUG_OBJECT (demux, "Cluster before Track"); goto not_streamable; } else { ret = gst_matroska_demux_find_tracks (demux); if (!demux->tracks_parsed) goto no_tracks; } } if (G_UNLIKELY (demux->common.state == GST_MATROSKA_READ_STATE_HEADER)) { demux->common.state = GST_MATROSKA_READ_STATE_DATA; demux->first_cluster_offset = demux->common.offset; GST_DEBUG_OBJECT (demux, "signaling no more pads"); gst_element_no_more_pads (GST_ELEMENT (demux)); /* send initial newsegment - we wait till we know the first incoming timestamp, so we can properly set the start of the segment. */ demux->need_newsegment = TRUE; } demux->cluster_time = GST_CLOCK_TIME_NONE; demux->cluster_offset = demux->common.offset; if (G_UNLIKELY (!demux->seek_first && demux->seek_block)) { GST_DEBUG_OBJECT (demux, "seek target block %" G_GUINT64_FORMAT " not found in Cluster, trying next Cluster's first block instead", demux->seek_block); demux->seek_block = 0; } demux->seek_first = FALSE; /* record next cluster for recovery */ if (read != G_MAXUINT64) demux->next_cluster_offset = demux->cluster_offset + read; /* eat cluster prefix */ gst_matroska_demux_flush (demux, needed); break; case GST_MATROSKA_ID_CLUSTERTIMECODE: { guint64 num; GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); if ((ret = gst_ebml_read_uint (&ebml, &id, &num)) != GST_FLOW_OK) goto parse_failed; GST_DEBUG_OBJECT (demux, "ClusterTimeCode: %" G_GUINT64_FORMAT, num); demux->cluster_time = num; if (demux->common.element_index) { if (demux->common.element_index_writer_id == -1) gst_index_get_writer_id (demux->common.element_index, GST_OBJECT (demux), &demux->common.element_index_writer_id); GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT " for writer id %d", GST_TIME_ARGS (demux->cluster_time), demux->cluster_offset, demux->common.element_index_writer_id); gst_index_add_association (demux->common.element_index, demux->common.element_index_writer_id, GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, demux->cluster_time, GST_FORMAT_BYTES, demux->cluster_offset, NULL); } break; } case GST_MATROSKA_ID_BLOCKGROUP: if (!gst_matroska_demux_seek_block (demux)) goto skip; GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); DEBUG_ELEMENT_START (demux, &ebml, "BlockGroup"); if ((ret = gst_ebml_read_master (&ebml, &id)) == GST_FLOW_OK) { ret = gst_matroska_demux_parse_blockgroup_or_simpleblock (demux, &ebml, demux->cluster_time, demux->cluster_offset, FALSE); } DEBUG_ELEMENT_STOP (demux, &ebml, "BlockGroup", ret); break; case GST_MATROSKA_ID_SIMPLEBLOCK: if (!gst_matroska_demux_seek_block (demux)) goto skip; GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); DEBUG_ELEMENT_START (demux, &ebml, "SimpleBlock"); ret = gst_matroska_demux_parse_blockgroup_or_simpleblock (demux, &ebml, demux->cluster_time, demux->cluster_offset, TRUE); DEBUG_ELEMENT_STOP (demux, &ebml, "SimpleBlock", ret); break; case GST_MATROSKA_ID_ATTACHMENTS: if (!demux->common.attachments_parsed) { GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_read_common_parse_attachments (&demux->common, GST_ELEMENT_CAST (demux), &ebml); } else { GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); } break; case GST_MATROSKA_ID_TAGS: GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_read_common_parse_metadata (&demux->common, GST_ELEMENT_CAST (demux), &ebml); break; case GST_MATROSKA_ID_CHAPTERS: GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_read_common_parse_chapters (&demux->common, &ebml); break; case GST_MATROSKA_ID_SEEKHEAD: GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_demux_parse_contents (demux, &ebml); break; case GST_MATROSKA_ID_CUES: if (demux->common.index_parsed) { GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); break; } GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml)); ret = gst_matroska_read_common_parse_index (&demux->common, &ebml); /* only push based; delayed index building */ if (ret == GST_FLOW_OK && demux->common.state == GST_MATROSKA_READ_STATE_SEEK) { GstEvent *event; GST_OBJECT_LOCK (demux); event = demux->seek_event; demux->seek_event = NULL; GST_OBJECT_UNLOCK (demux); g_assert (event); /* unlikely to fail, since we managed to seek to this point */ if (!gst_matroska_demux_handle_seek_event (demux, NULL, event)) goto seek_failed; /* resume data handling, main thread clear to seek again */ GST_OBJECT_LOCK (demux); demux->common.state = GST_MATROSKA_READ_STATE_DATA; GST_OBJECT_UNLOCK (demux); } break; case GST_MATROSKA_ID_POSITION: case GST_MATROSKA_ID_PREVSIZE: case GST_MATROSKA_ID_ENCRYPTEDBLOCK: case GST_MATROSKA_ID_SILENTTRACKS: GST_DEBUG_OBJECT (demux, "Skipping Cluster subelement 0x%x - ignoring", id); /* fall-through */ default: skip: GST_DEBUG_OBJECT (demux, "skipping Element 0x%x", id); GST_READ_CHECK (gst_matroska_demux_flush (demux, read)); break; } break; } if (ret == GST_FLOW_PARSE) goto parse_failed; exit: gst_ebml_read_clear (&ebml); return ret; /* ERRORS */ read_error: { /* simply exit, maybe not enough data yet */ /* no ebml to clear if read error */ return ret; } parse_failed: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Failed to parse Element 0x%x", id)); ret = GST_FLOW_ERROR; goto exit; } not_streamable: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("File layout does not permit streaming")); ret = GST_FLOW_ERROR; goto exit; } no_tracks: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("No Tracks element found")); ret = GST_FLOW_ERROR; goto exit; } invalid_header: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Invalid header")); ret = GST_FLOW_ERROR; goto exit; } seek_failed: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Failed to seek")); ret = GST_FLOW_ERROR; goto exit; } } static void gst_matroska_demux_loop (GstPad * pad) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad)); GstFlowReturn ret; guint32 id; guint64 length; guint needed; /* If we have to close a segment, send a new segment to do this now */ if (G_LIKELY (demux->common.state == GST_MATROSKA_READ_STATE_DATA)) { if (G_UNLIKELY (demux->close_segment)) { gst_matroska_demux_send_event (demux, demux->close_segment); demux->close_segment = NULL; } if (G_UNLIKELY (demux->new_segment)) { gst_matroska_demux_send_event (demux, demux->new_segment); demux->new_segment = NULL; } } ret = gst_matroska_read_common_peek_id_length_pull (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (ret == GST_FLOW_UNEXPECTED) goto eos; if (ret != GST_FLOW_OK) { if (gst_matroska_demux_check_parse_error (demux)) goto pause; else return; } GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " "size %" G_GUINT64_FORMAT ", needed %d", demux->common.offset, id, length, needed); ret = gst_matroska_demux_parse_id (demux, id, length, needed); if (ret == GST_FLOW_UNEXPECTED) goto eos; if (ret != GST_FLOW_OK) goto pause; /* check if we're at the end of a configured segment */ if (G_LIKELY (demux->common.src->len)) { guint i; g_assert (demux->common.num_streams == demux->common.src->len); for (i = 0; i < demux->common.src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src, i); GST_DEBUG_OBJECT (context->pad, "pos %" GST_TIME_FORMAT, GST_TIME_ARGS (context->pos)); if (context->eos == FALSE) goto next; } GST_INFO_OBJECT (demux, "All streams are EOS"); ret = GST_FLOW_UNEXPECTED; goto eos; } next: if (G_UNLIKELY (demux->common.offset == gst_matroska_read_common_get_length (&demux->common))) { GST_LOG_OBJECT (demux, "Reached end of stream"); ret = GST_FLOW_UNEXPECTED; goto eos; } return; /* ERRORS */ eos: { if (demux->common.segment.rate < 0.0) { ret = gst_matroska_demux_seek_to_previous_keyframe (demux); if (ret == GST_FLOW_OK) return; } /* fall-through */ } pause: { const gchar *reason = gst_flow_get_name (ret); gboolean push_eos = FALSE; GST_LOG_OBJECT (demux, "pausing task, reason %s", reason); demux->segment_running = FALSE; gst_pad_pause_task (demux->common.sinkpad); if (ret == GST_FLOW_UNEXPECTED) { /* perform EOS logic */ /* If we were in the headers, make sure we send no-more-pads. This will ensure decodebin2 does not get stuck thinking the chain is not complete yet, and waiting indefinitely. */ if (G_UNLIKELY (demux->common.state == GST_MATROSKA_READ_STATE_HEADER)) { if (demux->common.src->len == 0) { GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), ("No pads created")); } else { GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Failed to finish reading headers")); } gst_element_no_more_pads (GST_ELEMENT (demux)); } /* Close the segment, i.e. update segment stop with the duration * if no stop was set */ if (GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) && !GST_CLOCK_TIME_IS_VALID (demux->common.segment.stop) && GST_CLOCK_TIME_IS_VALID (demux->common.segment.start) && demux->last_stop_end > demux->common.segment.start) { /* arrange to accumulate duration downstream, but avoid sending * newsegment with decreasing start (w.r.t. sync newsegment events) */ GstEvent *event = gst_event_new_new_segment_full (TRUE, demux->common.segment.rate, demux->common.segment.applied_rate, demux->common.segment.format, demux->last_stop_end, demux->last_stop_end, demux->common.segment.time + (demux->last_stop_end - demux->common.segment.start)); gst_matroska_demux_send_event (demux, event); } if (demux->common.segment.flags & GST_SEEK_FLAG_SEGMENT) { gint64 stop; /* for segment playback we need to post when (in stream time) * we stopped, this is either stop (when set) or the duration. */ if ((stop = demux->common.segment.stop) == -1) stop = demux->last_stop_end; GST_LOG_OBJECT (demux, "Sending segment done, at end of segment"); gst_element_post_message (GST_ELEMENT (demux), gst_message_new_segment_done (GST_OBJECT (demux), GST_FORMAT_TIME, stop)); } else { push_eos = TRUE; } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { /* for fatal errors we post an error message */ GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), ("stream stopped, reason %s", reason)); push_eos = TRUE; } if (push_eos) { /* send EOS, and prevent hanging if no streams yet */ GST_LOG_OBJECT (demux, "Sending EOS, at end of stream"); if (!gst_matroska_demux_send_event (demux, gst_event_new_eos ()) && (ret == GST_FLOW_UNEXPECTED)) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("got eos but no streams (yet)")); } } return; } } /* * Create and push a flushing seek event upstream */ static gboolean perform_seek_to_offset (GstMatroskaDemux * demux, guint64 offset) { GstEvent *event; gboolean res = 0; GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); event = gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, -1); res = gst_pad_push_event (demux->common.sinkpad, event); /* newsegment event will update offset */ return res; } static GstFlowReturn gst_matroska_demux_chain (GstPad * pad, GstBuffer * buffer) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad)); guint available; GstFlowReturn ret = GST_FLOW_OK; guint needed = 0; guint32 id; guint64 length; if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buffer))) { GST_DEBUG_OBJECT (demux, "got DISCONT"); gst_adapter_clear (demux->common.adapter); GST_OBJECT_LOCK (demux); gst_matroska_read_common_reset_streams (&demux->common, GST_CLOCK_TIME_NONE, FALSE); GST_OBJECT_UNLOCK (demux); } gst_adapter_push (demux->common.adapter, buffer); buffer = NULL; next: available = gst_adapter_available (demux->common.adapter); ret = gst_matroska_read_common_peek_id_length_push (&demux->common, GST_ELEMENT_CAST (demux), &id, &length, &needed); if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)) return ret; GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " "size %" G_GUINT64_FORMAT ", needed %d, available %d", demux->common.offset, id, length, needed, available); if (needed > available) return GST_FLOW_OK; ret = gst_matroska_demux_parse_id (demux, id, length, needed); if (ret == GST_FLOW_UNEXPECTED) { /* need more data */ return GST_FLOW_OK; } else if (ret != GST_FLOW_OK) { return ret; } else goto next; } static gboolean gst_matroska_demux_handle_sink_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad)); GST_DEBUG_OBJECT (demux, "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time = 0; gboolean update; GstSegment segment; /* some debug output */ gst_segment_init (&segment, GST_FORMAT_UNDEFINED); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); gst_segment_set_newsegment_full (&segment, update, rate, arate, format, start, stop, time); GST_DEBUG_OBJECT (demux, "received format %d newsegment %" GST_SEGMENT_FORMAT, format, &segment); if (demux->common.state < GST_MATROSKA_READ_STATE_DATA) { GST_DEBUG_OBJECT (demux, "still starting"); goto exit; } /* we only expect a BYTE segment, e.g. following a seek */ if (format != GST_FORMAT_BYTES) { GST_DEBUG_OBJECT (demux, "unsupported segment format, ignoring"); goto exit; } GST_DEBUG_OBJECT (demux, "clearing segment state"); GST_OBJECT_LOCK (demux); /* clear current segment leftover */ gst_adapter_clear (demux->common.adapter); /* and some streaming setup */ demux->common.offset = start; /* do not know where we are; * need to come across a cluster and generate newsegment */ demux->common.segment.last_stop = GST_CLOCK_TIME_NONE; demux->cluster_time = GST_CLOCK_TIME_NONE; demux->cluster_offset = 0; demux->need_newsegment = TRUE; /* but keep some of the upstream segment */ demux->common.segment.rate = rate; GST_OBJECT_UNLOCK (demux); exit: /* chain will send initial newsegment after pads have been added, * or otherwise come up with one */ GST_DEBUG_OBJECT (demux, "eating event"); gst_event_unref (event); res = TRUE; break; } case GST_EVENT_EOS: { if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) { gst_event_unref (event); GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("got eos and didn't receive a complete header object")); } else if (demux->common.num_streams == 0) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("got eos but no streams (yet)")); } else { gst_matroska_demux_send_event (demux, event); } break; } case GST_EVENT_FLUSH_STOP: { gst_adapter_clear (demux->common.adapter); GST_OBJECT_LOCK (demux); gst_matroska_read_common_reset_streams (&demux->common, GST_CLOCK_TIME_NONE, TRUE); demux->common.segment.last_stop = GST_CLOCK_TIME_NONE; demux->cluster_time = GST_CLOCK_TIME_NONE; demux->cluster_offset = 0; GST_OBJECT_UNLOCK (demux); /* fall-through */ } default: res = gst_pad_event_default (pad, event); break; } return res; } static gboolean gst_matroska_demux_sink_activate (GstPad * sinkpad) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (sinkpad)); if (gst_pad_check_pull_range (sinkpad)) { GST_DEBUG ("going to pull mode"); demux->streaming = FALSE; return gst_pad_activate_pull (sinkpad, TRUE); } else { GST_DEBUG ("going to push (streaming) mode"); demux->streaming = TRUE; return gst_pad_activate_push (sinkpad, TRUE); } return FALSE; } static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad, gboolean active) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (sinkpad)); if (active) { /* if we have a scheduler we can start the task */ demux->segment_running = TRUE; gst_pad_start_task (sinkpad, (GstTaskFunction) gst_matroska_demux_loop, sinkpad); } else { demux->segment_running = FALSE; gst_pad_stop_task (sinkpad); } return TRUE; } static void gst_duration_to_fraction (guint64 duration, gint * dest_n, gint * dest_d) { static const int common_den[] = { 1, 2, 3, 4, 1001 }; int n, d; int i; guint64 a; for (i = 0; i < G_N_ELEMENTS (common_den); i++) { d = common_den[i]; n = floor (0.5 + (d * 1e9) / duration); a = gst_util_uint64_scale_int (1000000000, d, n); if (duration >= a - 1 && duration <= a + 1) { goto out; } } gst_util_double_to_fraction (1e9 / duration, &n, &d); out: /* set results */ *dest_n = n; *dest_d = d; } static GstCaps * gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext * videocontext, const gchar * codec_id, guint8 * data, guint size, gchar ** codec_name, guint32 * riff_fourcc) { GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) videocontext; GstCaps *caps = NULL; g_assert (videocontext != NULL); g_assert (codec_name != NULL); context->send_xiph_headers = FALSE; context->send_flac_headers = FALSE; context->send_speex_headers = FALSE; if (riff_fourcc) *riff_fourcc = 0; /* TODO: check if we have all codec types from matroska-ids.h * check if we have to do more special things with codec_private * * Add support for * GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME * GST_MATROSKA_CODEC_ID_VIDEO_SNOW */ if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC)) { gst_riff_strf_vids *vids = NULL; if (data) { GstBuffer *buf = NULL; vids = (gst_riff_strf_vids *) data; /* assure size is big enough */ if (size < 24) { GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size); return NULL; } if (size < sizeof (gst_riff_strf_vids)) { vids = g_new (gst_riff_strf_vids, 1); memcpy (vids, data, size); } /* little-endian -> byte-order */ vids->size = GUINT32_FROM_LE (vids->size); vids->width = GUINT32_FROM_LE (vids->width); vids->height = GUINT32_FROM_LE (vids->height); vids->planes = GUINT16_FROM_LE (vids->planes); vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt); vids->compression = GUINT32_FROM_LE (vids->compression); vids->image_size = GUINT32_FROM_LE (vids->image_size); vids->xpels_meter = GUINT32_FROM_LE (vids->xpels_meter); vids->ypels_meter = GUINT32_FROM_LE (vids->ypels_meter); vids->num_colors = GUINT32_FROM_LE (vids->num_colors); vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); if (size > sizeof (gst_riff_strf_vids)) { /* some extra_data */ buf = gst_buffer_new_and_alloc (size - sizeof (gst_riff_strf_vids)); memcpy (GST_BUFFER_DATA (buf), (guint8 *) vids + sizeof (gst_riff_strf_vids), GST_BUFFER_SIZE (buf)); } if (riff_fourcc) *riff_fourcc = vids->compression; caps = gst_riff_create_video_caps (vids->compression, NULL, vids, buf, NULL, codec_name); if (caps == NULL) { GST_WARNING ("Unhandled RIFF fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (vids->compression)); } if (buf) gst_buffer_unref (buf); if (vids != (gst_riff_strf_vids *) data) g_free (vids); } } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED)) { guint32 fourcc = 0; switch (videocontext->fourcc) { case GST_MAKE_FOURCC ('I', '4', '2', '0'): *codec_name = g_strdup ("Raw planar YUV 4:2:0"); fourcc = videocontext->fourcc; break; case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): *codec_name = g_strdup ("Raw packed YUV 4:2:2"); fourcc = videocontext->fourcc; break; case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): *codec_name = g_strdup ("Raw packed YUV 4:2:0"); fourcc = videocontext->fourcc; break; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): *codec_name = g_strdup ("Raw packed YUV 4:2:2"); fourcc = videocontext->fourcc; break; case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): *codec_name = g_strdup ("Raw packed YUV 4:4:4 with alpha channel"); fourcc = videocontext->fourcc; break; default: GST_DEBUG ("Unknown fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (videocontext->fourcc)); return NULL; } caps = gst_caps_new_simple ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, fourcc, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP)) { caps = gst_caps_new_simple ("video/x-divx", "divxversion", G_TYPE_INT, 4, NULL); *codec_name = g_strdup ("MPEG-4 simple profile"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP) || !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) { #if 0 caps = gst_caps_new_full (gst_structure_new ("video/x-divx", "divxversion", G_TYPE_INT, 5, NULL), gst_structure_new ("video/x-xvid", NULL), gst_structure_new ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), NULL); #endif caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); if (data) { GstBuffer *priv = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (priv), data, size); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); gst_buffer_unref (priv); } if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP)) *codec_name = g_strdup ("MPEG-4 advanced simple profile"); else *codec_name = g_strdup ("MPEG-4 advanced profile"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3)) { #if 0 caps = gst_caps_new_full (gst_structure_new ("video/x-divx", "divxversion", G_TYPE_INT, 3, NULL), gst_structure_new ("video/x-msmpeg", "msmpegversion", G_TYPE_INT, 43, NULL), NULL); #endif caps = gst_caps_new_simple ("video/x-msmpeg", "msmpegversion", G_TYPE_INT, 43, NULL); *codec_name = g_strdup ("Microsoft MPEG-4 v.3"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1) || !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) { gint mpegversion; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1)) mpegversion = 1; else mpegversion = 2; caps = gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, FALSE, "mpegversion", G_TYPE_INT, mpegversion, NULL); *codec_name = g_strdup_printf ("MPEG-%d video", mpegversion); context->postprocess_frame = gst_matroska_demux_add_mpeg_seq_header; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MJPEG)) { caps = gst_caps_new_simple ("image/jpeg", NULL); *codec_name = g_strdup ("Motion-JPEG"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC)) { caps = gst_caps_new_simple ("video/x-h264", NULL); if (data) { GstBuffer *priv = gst_buffer_new_and_alloc (size); /* First byte is the version, second is the profile indication, and third * is the 5 contraint_set_flags and 3 reserved bits. Fourth byte is the * level indication. */ gst_codec_utils_h264_caps_set_level_and_profile (caps, data + 1, size - 1); memcpy (GST_BUFFER_DATA (priv), data, size); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); gst_buffer_unref (priv); gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", NULL); } else { GST_WARNING ("No codec data found, assuming output is byte-stream"); gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "byte-stream", NULL); } *codec_name = g_strdup ("H264"); } else if ((!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1)) || (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2)) || (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3)) || (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4))) { gint rmversion = -1; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1)) rmversion = 1; else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2)) rmversion = 2; else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3)) rmversion = 3; else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4)) rmversion = 4; caps = gst_caps_new_simple ("video/x-pn-realvideo", "rmversion", G_TYPE_INT, rmversion, NULL); GST_DEBUG ("data:%p, size:0x%x", data, size); /* We need to extract the extradata ! */ if (data && (size >= 0x22)) { GstBuffer *priv; guint rformat; guint subformat; subformat = GST_READ_UINT32_BE (data + 0x1a); rformat = GST_READ_UINT32_BE (data + 0x1e); priv = gst_buffer_new_and_alloc (size - 0x1a); memcpy (GST_BUFFER_DATA (priv), data + 0x1a, size - 0x1a); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, "format", G_TYPE_INT, rformat, "subformat", G_TYPE_INT, subformat, NULL); gst_buffer_unref (priv); } *codec_name = g_strdup_printf ("RealVideo %d.0", rmversion); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_THEORA)) { caps = gst_caps_new_simple ("video/x-theora", NULL); context->send_xiph_headers = TRUE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_DIRAC)) { caps = gst_caps_new_simple ("video/x-dirac", NULL); *codec_name = g_strdup_printf ("Dirac"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP8)) { caps = gst_caps_new_simple ("video/x-vp8", NULL); *codec_name = g_strdup_printf ("On2 VP8"); } else { GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); return NULL; } if (caps != NULL) { int i; GstStructure *structure; for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_caps_get_structure (caps, i); /* FIXME: use the real unit here! */ GST_DEBUG ("video size %dx%d, target display size %dx%d (any unit)", videocontext->pixel_width, videocontext->pixel_height, videocontext->display_width, videocontext->display_height); /* pixel width and height are the w and h of the video in pixels */ if (videocontext->pixel_width > 0 && videocontext->pixel_height > 0) { gint w = videocontext->pixel_width; gint h = videocontext->pixel_height; gst_structure_set (structure, "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, NULL); } if (videocontext->display_width > 0 || videocontext->display_height > 0) { int n, d; if (videocontext->display_width <= 0) videocontext->display_width = videocontext->pixel_width; if (videocontext->display_height <= 0) videocontext->display_height = videocontext->pixel_height; /* calculate the pixel aspect ratio using the display and pixel w/h */ n = videocontext->display_width * videocontext->pixel_height; d = videocontext->display_height * videocontext->pixel_width; GST_DEBUG ("setting PAR to %d/%d", n, d); gst_structure_set (structure, "pixel-aspect-ratio", GST_TYPE_FRACTION, videocontext->display_width * videocontext->pixel_height, videocontext->display_height * videocontext->pixel_width, NULL); } if (videocontext->default_fps > 0.0) { GValue fps_double = { 0, }; GValue fps_fraction = { 0, }; g_value_init (&fps_double, G_TYPE_DOUBLE); g_value_init (&fps_fraction, GST_TYPE_FRACTION); g_value_set_double (&fps_double, videocontext->default_fps); g_value_transform (&fps_double, &fps_fraction); GST_DEBUG ("using default fps %f", videocontext->default_fps); gst_structure_set_value (structure, "framerate", &fps_fraction); g_value_unset (&fps_double); g_value_unset (&fps_fraction); } else if (context->default_duration > 0) { int fps_n, fps_d; gst_duration_to_fraction (context->default_duration, &fps_n, &fps_d); GST_INFO ("using default duration %" G_GUINT64_FORMAT " framerate %d/%d", context->default_duration, fps_n, fps_d); gst_structure_set (structure, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); } else { /* sort of a hack to get most codecs to support, * even if the default_duration is missing */ gst_structure_set (structure, "framerate", GST_TYPE_FRACTION, 25, 1, NULL); } if (videocontext->parent.flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) gst_structure_set (structure, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL); } gst_caps_do_simplify (caps); } return caps; } /* * Some AAC specific code... *sigh* * FIXME: maybe we should use '15' and code the sample rate explicitly * if the sample rate doesn't match the predefined rates exactly? (tpm) */ static gint aac_rate_idx (gint rate) { if (92017 <= rate) return 0; else if (75132 <= rate) return 1; else if (55426 <= rate) return 2; else if (46009 <= rate) return 3; else if (37566 <= rate) return 4; else if (27713 <= rate) return 5; else if (23004 <= rate) return 6; else if (18783 <= rate) return 7; else if (13856 <= rate) return 8; else if (11502 <= rate) return 9; else if (9391 <= rate) return 10; else return 11; } static gint aac_profile_idx (const gchar * codec_id) { gint profile; if (strlen (codec_id) <= 12) profile = 3; else if (!strncmp (&codec_id[12], "MAIN", 4)) profile = 0; else if (!strncmp (&codec_id[12], "LC", 2)) profile = 1; else if (!strncmp (&codec_id[12], "SSR", 3)) profile = 2; else profile = 3; return profile; } #define AAC_SYNC_EXTENSION_TYPE 0x02b7 static GstCaps * gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * audiocontext, const gchar * codec_id, guint8 * data, guint size, gchar ** codec_name, guint16 * riff_audio_fmt) { GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) audiocontext; GstCaps *caps = NULL; g_assert (audiocontext != NULL); g_assert (codec_name != NULL); if (riff_audio_fmt) *riff_audio_fmt = 0; context->send_xiph_headers = FALSE; context->send_flac_headers = FALSE; context->send_speex_headers = FALSE; /* TODO: check if we have all codec types from matroska-ids.h * check if we have to do more special things with codec_private * check if we need bitdepth in different places too * implement channel position magic * Add support for: * GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID9 * GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10 * GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC * GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2 */ if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1) || !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2) || !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3)) { gint layer; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1)) layer = 1; else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2)) layer = 2; else layer = 3; caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, layer, NULL); *codec_name = g_strdup_printf ("MPEG-1 layer %d", layer); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE) || !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) { gint endianness; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE)) endianness = G_BIG_ENDIAN; else endianness = G_LITTLE_ENDIAN; caps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, audiocontext->bitdepth, "depth", G_TYPE_INT, audiocontext->bitdepth, "signed", G_TYPE_BOOLEAN, audiocontext->bitdepth != 8, "endianness", G_TYPE_INT, endianness, NULL); *codec_name = g_strdup_printf ("Raw %d-bit PCM audio", audiocontext->bitdepth); context->alignment = audiocontext->bitdepth / 8; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT)) { caps = gst_caps_new_simple ("audio/x-raw-float", "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, "width", G_TYPE_INT, audiocontext->bitdepth, NULL); *codec_name = g_strdup_printf ("Raw %d-bit floating-point audio", audiocontext->bitdepth); context->alignment = audiocontext->bitdepth / 8; } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AC3, strlen (GST_MATROSKA_CODEC_ID_AUDIO_AC3))) { caps = gst_caps_new_simple ("audio/x-ac3", "framed", G_TYPE_BOOLEAN, TRUE, NULL); *codec_name = g_strdup ("AC-3 audio"); } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_EAC3, strlen (GST_MATROSKA_CODEC_ID_AUDIO_EAC3))) { caps = gst_caps_new_simple ("audio/x-eac3", "framed", G_TYPE_BOOLEAN, TRUE, NULL); *codec_name = g_strdup ("E-AC-3 audio"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) { caps = gst_caps_new_simple ("audio/x-dts", NULL); *codec_name = g_strdup ("DTS audio"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS)) { caps = gst_caps_new_simple ("audio/x-vorbis", NULL); context->send_xiph_headers = TRUE; /* vorbis decoder does tags */ } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_FLAC)) { caps = gst_caps_new_simple ("audio/x-flac", NULL); context->send_flac_headers = TRUE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_SPEEX)) { caps = gst_caps_new_simple ("audio/x-speex", NULL); context->send_speex_headers = TRUE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_ACM)) { gst_riff_strf_auds auds; if (data) { GstBuffer *codec_data = gst_buffer_new (); /* little-endian -> byte-order */ auds.format = GST_READ_UINT16_LE (data); auds.channels = GST_READ_UINT16_LE (data + 2); auds.rate = GST_READ_UINT32_LE (data + 4); auds.av_bps = GST_READ_UINT32_LE (data + 8); auds.blockalign = GST_READ_UINT16_LE (data + 12); auds.size = GST_READ_UINT16_LE (data + 16); /* 18 is the waveformatex size */ gst_buffer_set_data (codec_data, data + 18, auds.size); if (riff_audio_fmt) *riff_audio_fmt = auds.format; caps = gst_riff_create_audio_caps (auds.format, NULL, &auds, NULL, codec_data, codec_name); gst_buffer_unref (codec_data); if (caps == NULL) { GST_WARNING ("Unhandled RIFF audio format 0x%02x", auds.format); } } } else if (g_str_has_prefix (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC)) { GstBuffer *priv = NULL; gint mpegversion; gint rate_idx, profile; guint8 *data = NULL; /* unspecified AAC profile with opaque private codec data */ if (strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC) == 0) { if (context->codec_priv_size >= 2) { guint obj_type, freq_index, explicit_freq_bytes = 0; codec_id = GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4; mpegversion = 4; freq_index = (GST_READ_UINT16_BE (context->codec_priv) & 0x780) >> 7; obj_type = (GST_READ_UINT16_BE (context->codec_priv) & 0xF800) >> 11; if (freq_index == 15) explicit_freq_bytes = 3; GST_DEBUG ("obj_type = %u, freq_index = %u", obj_type, freq_index); priv = gst_buffer_new_and_alloc (context->codec_priv_size); memcpy (GST_BUFFER_DATA (priv), context->codec_priv, context->codec_priv_size); /* assume SBR if samplerate <= 24kHz */ if (obj_type == 5 || (freq_index >= 6 && freq_index != 15) || (context->codec_priv_size == (5 + explicit_freq_bytes))) { audiocontext->samplerate *= 2; } } else { GST_WARNING ("Opaque A_AAC codec ID, but no codec private data"); /* this is pretty broken; * maybe we need to make up some default private, * or maybe ADTS data got dumped in. * Let's set up some private data now, and check actual data later */ /* just try this and see what happens ... */ codec_id = GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4; context->postprocess_frame = gst_matroska_demux_check_aac; } } /* make up decoder-specific data if it is not supplied */ if (priv == NULL) { priv = gst_buffer_new_and_alloc (5); data = GST_BUFFER_DATA (priv); rate_idx = aac_rate_idx (audiocontext->samplerate); profile = aac_profile_idx (codec_id); data[0] = ((profile + 1) << 3) | ((rate_idx & 0xE) >> 1); data[1] = ((rate_idx & 0x1) << 7) | (audiocontext->channels << 3); GST_BUFFER_SIZE (priv) = 2; if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2, strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2))) { mpegversion = 2; } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4, strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4))) { mpegversion = 4; if (g_strrstr (codec_id, "SBR")) { /* HE-AAC (aka SBR AAC) */ audiocontext->samplerate *= 2; rate_idx = aac_rate_idx (audiocontext->samplerate); data[2] = AAC_SYNC_EXTENSION_TYPE >> 3; data[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5; data[4] = (1 << 7) | (rate_idx << 3); GST_BUFFER_SIZE (priv) = 5; } } else { gst_buffer_unref (priv); priv = NULL; GST_ERROR ("Unknown AAC profile and no codec private data"); } } if (priv) { caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, mpegversion, "framed", G_TYPE_BOOLEAN, TRUE, NULL); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); *codec_name = g_strdup_printf ("MPEG-%d AAC audio", mpegversion); gst_buffer_unref (priv); } } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_TTA)) { caps = gst_caps_new_simple ("audio/x-tta", "width", G_TYPE_INT, audiocontext->bitdepth, NULL); *codec_name = g_strdup ("TTA audio"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4)) { caps = gst_caps_new_simple ("audio/x-wavpack", "width", G_TYPE_INT, audiocontext->bitdepth, "framed", G_TYPE_BOOLEAN, TRUE, NULL); *codec_name = g_strdup ("Wavpack audio"); context->postprocess_frame = gst_matroska_demux_add_wvpk_header; audiocontext->wvpk_block_index = 0; } else if ((!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) || (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) || (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK))) { gint raversion = -1; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) raversion = 1; else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK)) raversion = 8; else raversion = 2; caps = gst_caps_new_simple ("audio/x-pn-realaudio", "raversion", G_TYPE_INT, raversion, NULL); /* Extract extra information from caps, mapping varies based on codec */ if (data && (size >= 0x50)) { GstBuffer *priv; guint flavor; guint packet_size; guint height; guint leaf_size; guint sample_width; guint extra_data_size; GST_ERROR ("real audio raversion:%d", raversion); if (raversion == 8) { /* COOK */ flavor = GST_READ_UINT16_BE (data + 22); packet_size = GST_READ_UINT32_BE (data + 24); height = GST_READ_UINT16_BE (data + 40); leaf_size = GST_READ_UINT16_BE (data + 44); sample_width = GST_READ_UINT16_BE (data + 58); extra_data_size = GST_READ_UINT32_BE (data + 74); GST_ERROR ("flavor:%d, packet_size:%d, height:%d, leaf_size:%d, sample_width:%d, extra_data_size:%d", flavor, packet_size, height, leaf_size, sample_width, extra_data_size); gst_caps_set_simple (caps, "flavor", G_TYPE_INT, flavor, "packet_size", G_TYPE_INT, packet_size, "height", G_TYPE_INT, height, "leaf_size", G_TYPE_INT, leaf_size, "width", G_TYPE_INT, sample_width, NULL); if ((size - 78) >= extra_data_size) { priv = gst_buffer_new_and_alloc (extra_data_size); memcpy (GST_BUFFER_DATA (priv), data + 78, extra_data_size); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL); gst_buffer_unref (priv); } } } *codec_name = g_strdup_printf ("RealAudio %d.0", raversion); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR)) { caps = gst_caps_new_simple ("audio/x-sipro", NULL); *codec_name = g_strdup ("Sipro/ACELP.NET Voice Codec"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF)) { caps = gst_caps_new_simple ("audio/x-ralf-mpeg4-generic", NULL); *codec_name = g_strdup ("Real Audio Lossless"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC)) { caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL); *codec_name = g_strdup ("Sony ATRAC3"); } else { GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); return NULL; } if (caps != NULL) { if (audiocontext->samplerate > 0 && audiocontext->channels > 0) { gint i; for (i = 0; i < gst_caps_get_size (caps); i++) { gst_structure_set (gst_caps_get_structure (caps, i), "channels", G_TYPE_INT, audiocontext->channels, "rate", G_TYPE_INT, audiocontext->samplerate, NULL); } } gst_caps_do_simplify (caps); } return caps; } static GstCaps * gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * subtitlecontext, const gchar * codec_id, gpointer data, guint size) { GstCaps *caps = NULL; GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) subtitlecontext; /* for backwards compatibility */ if (!g_ascii_strcasecmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII)) codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8; else if (!g_ascii_strcasecmp (codec_id, "S_SSA")) codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_SSA; else if (!g_ascii_strcasecmp (codec_id, "S_ASS")) codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_ASS; else if (!g_ascii_strcasecmp (codec_id, "S_USF")) codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_USF; /* TODO: Add GST_MATROSKA_CODEC_ID_SUBTITLE_BMP support * Check if we have to do something with codec_private */ if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8)) { /* well, plain text simply does not have a lot of markup ... */ caps = gst_caps_new_simple ("text/x-pango-markup", NULL); context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; subtitlecontext->check_markup = TRUE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_SSA)) { caps = gst_caps_new_simple ("application/x-ssa", NULL); context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; subtitlecontext->check_markup = FALSE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_ASS)) { caps = gst_caps_new_simple ("application/x-ass", NULL); context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; subtitlecontext->check_markup = FALSE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_USF)) { caps = gst_caps_new_simple ("application/x-usf", NULL); context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer; subtitlecontext->check_markup = FALSE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB)) { caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL); ((GstMatroskaTrackContext *) subtitlecontext)->send_dvd_event = TRUE; } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS)) { caps = gst_caps_new_simple ("subpicture/x-pgs", NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_KATE)) { caps = gst_caps_new_simple ("subtitle/x-kate", NULL); context->send_xiph_headers = TRUE; } else { GST_DEBUG ("Unknown subtitle stream: codec_id='%s'", codec_id); caps = gst_caps_new_simple ("application/x-subtitle-unknown", NULL); } if (data != NULL && size > 0) { GstBuffer *buf; buf = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (buf), data, size); gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); } return caps; } static void gst_matroska_demux_set_index (GstElement * element, GstIndex * index) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); GST_OBJECT_LOCK (demux); if (demux->common.element_index) gst_object_unref (demux->common.element_index); demux->common.element_index = index ? gst_object_ref (index) : NULL; GST_OBJECT_UNLOCK (demux); GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT, demux->common.element_index); } static GstIndex * gst_matroska_demux_get_index (GstElement * element) { GstIndex *result = NULL; GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); GST_OBJECT_LOCK (demux); if (demux->common.element_index) result = gst_object_ref (demux->common.element_index); GST_OBJECT_UNLOCK (demux); GST_DEBUG_OBJECT (demux, "Returning index %" GST_PTR_FORMAT, result); return result; } static GstStateChangeReturn gst_matroska_demux_change_state (GstElement * element, GstStateChange transition) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; /* handle upwards state changes here */ switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); /* handle downwards state changes */ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_matroska_demux_reset (GST_ELEMENT (demux)); break; default: break; } return ret; } static void gst_matroska_demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMatroskaDemux *demux; g_return_if_fail (GST_IS_MATROSKA_DEMUX (object)); demux = GST_MATROSKA_DEMUX (object); switch (prop_id) { case ARG_MAX_GAP_TIME: GST_OBJECT_LOCK (demux); demux->max_gap_time = g_value_get_uint64 (value); GST_OBJECT_UNLOCK (demux); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_matroska_demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskaDemux *demux; g_return_if_fail (GST_IS_MATROSKA_DEMUX (object)); demux = GST_MATROSKA_DEMUX (object); switch (prop_id) { case ARG_MAX_GAP_TIME: GST_OBJECT_LOCK (demux); g_value_set_uint64 (value, demux->max_gap_time); GST_OBJECT_UNLOCK (demux); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_matroska_demux_plugin_init (GstPlugin * plugin) { gst_riff_init (); /* parser helper separate debug */ GST_DEBUG_CATEGORY_INIT (ebmlread_debug, "ebmlread", 0, "EBML stream helper class"); /* create an elementfactory for the matroska_demux element */ if (!gst_element_register (plugin, "matroskademux", GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX)) return FALSE; return TRUE; } gst-plugins-good-0.10.31/gst/matroska/matroska-parse.c0000644000175000017500000031015411677341655017535 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2006 Tim-Philipp Müller * (c) 2008 Sebastian Dröge * (c) 2011 Debarshi Ray * * matroska-parse.c: matroska file/stream parser * * 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. */ /* TODO: check CRC32 if present * TODO: there can be a segment after the first segment. Handle like * chained oggs. Fixes #334082 * TODO: Test samples: http://www.matroska.org/samples/matrix/index.html * http://samples.mplayerhq.hu/Matroska/ * TODO: check if parseing is done correct for all codecs according to spec * TODO: seeking with incomplete or without CUE */ /** * SECTION:element-matroskaparse * * matroskaparse parsees a Matroska file into the different contained streams. * * * Example launch line * |[ * gst-launch -v filesrc location=/path/to/mkv ! matroskaparse ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink * ]| This pipeline parsees a Matroska file and outputs the contained Vorbis audio. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include /* For AVI compatibility mode and for fourcc stuff */ #include #include #include #include #include #include "matroska-parse.h" #include "matroska-ids.h" GST_DEBUG_CATEGORY_STATIC (matroskaparse_debug); #define GST_CAT_DEFAULT matroskaparse_debug #define DEBUG_ELEMENT_START(parse, ebml, element) \ GST_DEBUG_OBJECT (parse, "Parsing " element " element at offset %" \ G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml)) #define DEBUG_ELEMENT_STOP(parse, ebml, element, ret) \ GST_DEBUG_OBJECT (parse, "Parsing " element " element " \ " finished with '%s'", gst_flow_get_name (ret)) enum { ARG_0, ARG_METADATA, ARG_STREAMINFO }; static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-matroska; video/webm") ); static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-matroska; video/webm") ); static GstFlowReturn gst_matroska_parse_parse_id (GstMatroskaParse * parse, guint32 id, guint64 length, guint needed); /* element functions */ //static void gst_matroska_parse_loop (GstPad * pad); static gboolean gst_matroska_parse_element_send_event (GstElement * element, GstEvent * event); static gboolean gst_matroska_parse_element_query (GstElement * element, GstQuery * query); /* pad functions */ static gboolean gst_matroska_parse_handle_seek_event (GstMatroskaParse * parse, GstPad * pad, GstEvent * event); static gboolean gst_matroska_parse_handle_src_event (GstPad * pad, GstEvent * event); static const GstQueryType *gst_matroska_parse_get_src_query_types (GstPad * pad); static gboolean gst_matroska_parse_handle_src_query (GstPad * pad, GstQuery * query); static gboolean gst_matroska_parse_handle_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_matroska_parse_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_matroska_parse_change_state (GstElement * element, GstStateChange transition); static void gst_matroska_parse_set_index (GstElement * element, GstIndex * index); static GstIndex *gst_matroska_parse_get_index (GstElement * element); /* stream methods */ static void gst_matroska_parse_reset (GstElement * element); static gboolean perform_seek_to_offset (GstMatroskaParse * parse, guint64 offset); GType gst_matroska_parse_get_type (void); GST_BOILERPLATE (GstMatroskaParse, gst_matroska_parse, GstElement, GST_TYPE_ELEMENT); static void gst_matroska_parse_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &src_templ); gst_element_class_add_static_pad_template (element_class, &sink_templ); gst_element_class_set_details_simple (element_class, "Matroska parser", "Codec/Parser", "Parses Matroska/WebM streams into video/audio/subtitles", "GStreamer maintainers "); } static void gst_matroska_parse_finalize (GObject * object) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (object); if (parse->common.src) { g_ptr_array_free (parse->common.src, TRUE); parse->common.src = NULL; } if (parse->common.global_tags) { gst_tag_list_free (parse->common.global_tags); parse->common.global_tags = NULL; } g_object_unref (parse->common.adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_matroska_parse_class_init (GstMatroskaParseClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; GST_DEBUG_CATEGORY_INIT (matroskaparse_debug, "matroskaparse", 0, "Matroska parser"); gobject_class->finalize = gst_matroska_parse_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_matroska_parse_change_state); gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_matroska_parse_element_send_event); gstelement_class->query = GST_DEBUG_FUNCPTR (gst_matroska_parse_element_query); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_matroska_parse_set_index); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_matroska_parse_get_index); } static void gst_matroska_parse_init (GstMatroskaParse * parse, GstMatroskaParseClass * klass) { parse->common.sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); gst_pad_set_chain_function (parse->common.sinkpad, GST_DEBUG_FUNCPTR (gst_matroska_parse_chain)); gst_pad_set_event_function (parse->common.sinkpad, GST_DEBUG_FUNCPTR (gst_matroska_parse_handle_sink_event)); gst_element_add_pad (GST_ELEMENT (parse), parse->common.sinkpad); parse->srcpad = gst_pad_new_from_static_template (&src_templ, "src"); gst_pad_set_event_function (parse->srcpad, GST_DEBUG_FUNCPTR (gst_matroska_parse_handle_src_event)); gst_pad_set_query_type_function (parse->srcpad, GST_DEBUG_FUNCPTR (gst_matroska_parse_get_src_query_types)); gst_pad_set_query_function (parse->srcpad, GST_DEBUG_FUNCPTR (gst_matroska_parse_handle_src_query)); gst_pad_use_fixed_caps (parse->srcpad); gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad); /* initial stream no. */ parse->common.src = NULL; parse->common.writing_app = NULL; parse->common.muxing_app = NULL; parse->common.index = NULL; parse->common.global_tags = NULL; parse->common.adapter = gst_adapter_new (); /* finish off */ gst_matroska_parse_reset (GST_ELEMENT (parse)); } static void gst_matroska_track_free (GstMatroskaTrackContext * track) { g_free (track->codec_id); g_free (track->codec_name); g_free (track->name); g_free (track->language); g_free (track->codec_priv); g_free (track->codec_state); if (track->encodings != NULL) { int i; for (i = 0; i < track->encodings->len; ++i) { GstMatroskaTrackEncoding *enc = &g_array_index (track->encodings, GstMatroskaTrackEncoding, i); g_free (enc->comp_settings); } g_array_free (track->encodings, TRUE); } if (track->pending_tags) gst_tag_list_free (track->pending_tags); if (track->index_table) g_array_free (track->index_table, TRUE); g_free (track); } static void gst_matroska_parse_free_parsed_el (gpointer mem, gpointer user_data) { g_slice_free (guint64, mem); } static void gst_matroska_parse_reset (GstElement * element) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); guint i; GST_DEBUG_OBJECT (parse, "Resetting state"); /* reset input */ parse->common.state = GST_MATROSKA_READ_STATE_START; /* clean up existing streams */ if (parse->common.src) { g_assert (parse->common.src->len == parse->common.num_streams); for (i = 0; i < parse->common.src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (parse->common.src, i); gst_caps_replace (&context->caps, NULL); gst_matroska_track_free (context); } g_ptr_array_free (parse->common.src, TRUE); } parse->common.src = g_ptr_array_new (); parse->common.num_streams = 0; parse->num_a_streams = 0; parse->num_t_streams = 0; parse->num_v_streams = 0; /* reset media info */ g_free (parse->common.writing_app); parse->common.writing_app = NULL; g_free (parse->common.muxing_app); parse->common.muxing_app = NULL; /* reset indexes */ if (parse->common.index) { g_array_free (parse->common.index, TRUE); parse->common.index = NULL; } /* reset timers */ parse->clock = NULL; parse->common.time_scale = 1000000; parse->common.created = G_MININT64; parse->common.index_parsed = FALSE; parse->tracks_parsed = FALSE; parse->common.segmentinfo_parsed = FALSE; parse->common.attachments_parsed = FALSE; g_list_foreach (parse->common.tags_parsed, (GFunc) gst_matroska_parse_free_parsed_el, NULL); g_list_free (parse->common.tags_parsed); parse->common.tags_parsed = NULL; g_list_foreach (parse->seek_parsed, (GFunc) gst_matroska_parse_free_parsed_el, NULL); g_list_free (parse->seek_parsed); parse->seek_parsed = NULL; gst_segment_init (&parse->common.segment, GST_FORMAT_TIME); parse->last_stop_end = GST_CLOCK_TIME_NONE; parse->seek_block = 0; parse->common.offset = 0; parse->cluster_time = GST_CLOCK_TIME_NONE; parse->cluster_offset = 0; parse->next_cluster_offset = 0; parse->index_offset = 0; parse->seekable = FALSE; parse->need_newsegment = FALSE; parse->building_index = FALSE; if (parse->seek_event) { gst_event_unref (parse->seek_event); parse->seek_event = NULL; } parse->seek_index = NULL; parse->seek_entry = 0; if (parse->close_segment) { gst_event_unref (parse->close_segment); parse->close_segment = NULL; } if (parse->new_segment) { gst_event_unref (parse->new_segment); parse->new_segment = NULL; } if (parse->common.element_index) { gst_object_unref (parse->common.element_index); parse->common.element_index = NULL; } parse->common.element_index_writer_id = -1; if (parse->common.global_tags) { gst_tag_list_free (parse->common.global_tags); } parse->common.global_tags = gst_tag_list_new (); if (parse->common.cached_buffer) { gst_buffer_unref (parse->common.cached_buffer); parse->common.cached_buffer = NULL; } if (parse->streamheader != NULL) { gst_buffer_unref (parse->streamheader); parse->streamheader = NULL; } } static GstFlowReturn gst_matroska_parse_add_stream (GstMatroskaParse * parse, GstEbmlRead * ebml) { GstMatroskaTrackContext *context; GstFlowReturn ret; guint32 id; DEBUG_ELEMENT_START (parse, ebml, "TrackEntry"); /* start with the master */ if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (parse, ebml, "TrackEntry", ret); return ret; } /* allocate generic... if we know the type, we'll g_renew() * with the precise type */ context = g_new0 (GstMatroskaTrackContext, 1); g_ptr_array_add (parse->common.src, context); context->index = parse->common.num_streams; context->index_writer_id = -1; context->type = 0; /* no type yet */ context->default_duration = 0; context->pos = 0; context->set_discont = TRUE; context->timecodescale = 1.0; context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT | GST_MATROSKA_TRACK_LACING; context->last_flow = GST_FLOW_OK; context->to_offset = G_MAXINT64; context->alignment = 1; parse->common.num_streams++; g_assert (parse->common.src->len == parse->common.num_streams); GST_DEBUG_OBJECT (parse, "Stream number %d", context->index); /* try reading the trackentry headers */ while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* track number (unique stream ID) */ case GST_MATROSKA_ID_TRACKNUMBER:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_ERROR_OBJECT (parse, "Invalid TrackNumber 0"); ret = GST_FLOW_ERROR; break; } else if (!gst_matroska_read_common_tracknumber_unique (&parse->common, num)) { GST_ERROR_OBJECT (parse, "TrackNumber %" G_GUINT64_FORMAT " is not unique", num); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (parse, "TrackNumber: %" G_GUINT64_FORMAT, num); context->num = num; break; } /* track UID (unique identifier) */ case GST_MATROSKA_ID_TRACKUID:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_ERROR_OBJECT (parse, "Invalid TrackUID 0"); ret = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (parse, "TrackUID: %" G_GUINT64_FORMAT, num); context->uid = num; break; } /* track type (video, audio, combined, subtitle, etc.) */ case GST_MATROSKA_ID_TRACKTYPE:{ guint64 track_type; if ((ret = gst_ebml_read_uint (ebml, &id, &track_type)) != GST_FLOW_OK) { break; } if (context->type != 0 && context->type != track_type) { GST_WARNING_OBJECT (parse, "More than one tracktype defined in a TrackEntry - skipping"); break; } else if (track_type < 1 || track_type > 254) { GST_WARNING_OBJECT (parse, "Invalid TrackType %" G_GUINT64_FORMAT, track_type); break; } GST_DEBUG_OBJECT (parse, "TrackType: %" G_GUINT64_FORMAT, track_type); /* ok, so we're actually going to reallocate this thing */ switch (track_type) { case GST_MATROSKA_TRACK_TYPE_VIDEO: gst_matroska_track_init_video_context (&context); break; case GST_MATROSKA_TRACK_TYPE_AUDIO: gst_matroska_track_init_audio_context (&context); break; case GST_MATROSKA_TRACK_TYPE_SUBTITLE: gst_matroska_track_init_subtitle_context (&context); break; case GST_MATROSKA_TRACK_TYPE_COMPLEX: case GST_MATROSKA_TRACK_TYPE_LOGO: case GST_MATROSKA_TRACK_TYPE_BUTTONS: case GST_MATROSKA_TRACK_TYPE_CONTROL: default: GST_WARNING_OBJECT (parse, "Unknown or unsupported TrackType %" G_GUINT64_FORMAT, track_type); context->type = 0; break; } g_ptr_array_index (parse->common.src, parse->common.num_streams - 1) = context; break; } /* tracktype specific stuff for video */ case GST_MATROSKA_ID_TRACKVIDEO:{ GstMatroskaTrackVideoContext *videocontext; DEBUG_ELEMENT_START (parse, ebml, "TrackVideo"); if (!gst_matroska_track_init_video_context (&context)) { GST_WARNING_OBJECT (parse, "TrackVideo element in non-video track - ignoring track"); ret = GST_FLOW_ERROR; break; } else if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { break; } videocontext = (GstMatroskaTrackVideoContext *) context; g_ptr_array_index (parse->common.src, parse->common.num_streams - 1) = context; while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* Should be one level up but some broken muxers write it here. */ case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackDefaultDuration 0"); break; } GST_DEBUG_OBJECT (parse, "TrackDefaultDuration: %" G_GUINT64_FORMAT, num); context->default_duration = num; break; } /* video framerate */ /* NOTE: This one is here only for backward compatibility. * Use _TRACKDEFAULDURATION one level up. */ case GST_MATROSKA_ID_VIDEOFRAMERATE:{ gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) break; if (num <= 0.0) { GST_WARNING_OBJECT (parse, "Invalid TrackVideoFPS %lf", num); break; } GST_DEBUG_OBJECT (parse, "TrackVideoFrameRate: %lf", num); if (context->default_duration == 0) context->default_duration = gst_gdouble_to_guint64 ((gdouble) GST_SECOND * (1.0 / num)); videocontext->default_fps = num; break; } /* width of the size to display the video at */ case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackVideoDisplayWidth 0"); break; } GST_DEBUG_OBJECT (parse, "TrackVideoDisplayWidth: %" G_GUINT64_FORMAT, num); videocontext->display_width = num; break; } /* height of the size to display the video at */ case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackVideoDisplayHeight 0"); break; } GST_DEBUG_OBJECT (parse, "TrackVideoDisplayHeight: %" G_GUINT64_FORMAT, num); videocontext->display_height = num; break; } /* width of the video in the file */ case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackVideoPixelWidth 0"); break; } GST_DEBUG_OBJECT (parse, "TrackVideoPixelWidth: %" G_GUINT64_FORMAT, num); videocontext->pixel_width = num; break; } /* height of the video in the file */ case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackVideoPixelHeight 0"); break; } GST_DEBUG_OBJECT (parse, "TrackVideoPixelHeight: %" G_GUINT64_FORMAT, num); videocontext->pixel_height = num; break; } /* whether the video is interlaced */ case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; else context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; GST_DEBUG_OBJECT (parse, "TrackVideoInterlaced: %d", (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 : 0); break; } /* aspect ratio behaviour */ case GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { GST_WARNING_OBJECT (parse, "Unknown TrackVideoAspectRatioType 0x%x", (guint) num); break; } GST_DEBUG_OBJECT (parse, "TrackVideoAspectRatioType: %" G_GUINT64_FORMAT, num); videocontext->asr_mode = num; break; } /* colourspace (only matters for raw video) fourcc */ case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{ guint8 *data; guint64 datalen; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &datalen)) != GST_FLOW_OK) break; if (datalen != 4) { g_free (data); GST_WARNING_OBJECT (parse, "Invalid TrackVideoColourSpace length %" G_GUINT64_FORMAT, datalen); break; } memcpy (&videocontext->fourcc, data, 4); GST_DEBUG_OBJECT (parse, "TrackVideoColourSpace: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (videocontext->fourcc)); g_free (data); break; } default: GST_WARNING_OBJECT (parse, "Unknown TrackVideo subelement 0x%x - ignoring", id); /* fall through */ case GST_MATROSKA_ID_VIDEOSTEREOMODE: case GST_MATROSKA_ID_VIDEODISPLAYUNIT: case GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM: case GST_MATROSKA_ID_VIDEOPIXELCROPTOP: case GST_MATROSKA_ID_VIDEOPIXELCROPLEFT: case GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT: case GST_MATROSKA_ID_VIDEOGAMMAVALUE: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (parse, ebml, "TrackVideo", ret); break; } /* tracktype specific stuff for audio */ case GST_MATROSKA_ID_TRACKAUDIO:{ GstMatroskaTrackAudioContext *audiocontext; DEBUG_ELEMENT_START (parse, ebml, "TrackAudio"); if (!gst_matroska_track_init_audio_context (&context)) { GST_WARNING_OBJECT (parse, "TrackAudio element in non-audio track - ignoring track"); ret = GST_FLOW_ERROR; break; } if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) break; audiocontext = (GstMatroskaTrackAudioContext *) context; g_ptr_array_index (parse->common.src, parse->common.num_streams - 1) = context; while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* samplerate */ case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{ gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) break; if (num <= 0.0) { GST_WARNING_OBJECT (parse, "Invalid TrackAudioSamplingFrequency %lf", num); break; } GST_DEBUG_OBJECT (parse, "TrackAudioSamplingFrequency: %lf", num); audiocontext->samplerate = num; break; } /* bitdepth */ case GST_MATROSKA_ID_AUDIOBITDEPTH:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackAudioBitDepth 0"); break; } GST_DEBUG_OBJECT (parse, "TrackAudioBitDepth: %" G_GUINT64_FORMAT, num); audiocontext->bitdepth = num; break; } /* channels */ case GST_MATROSKA_ID_AUDIOCHANNELS:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackAudioChannels 0"); break; } GST_DEBUG_OBJECT (parse, "TrackAudioChannels: %" G_GUINT64_FORMAT, num); audiocontext->channels = num; break; } default: GST_WARNING_OBJECT (parse, "Unknown TrackAudio subelement 0x%x - ignoring", id); /* fall through */ case GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS: case GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (parse, ebml, "TrackAudio", ret); break; } /* codec identifier */ case GST_MATROSKA_ID_CODECID:{ gchar *text; if ((ret = gst_ebml_read_ascii (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (parse, "CodecID: %s", GST_STR_NULL (text)); context->codec_id = text; break; } /* codec private data */ case GST_MATROSKA_ID_CODECPRIVATE:{ guint8 *data; guint64 size; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &size)) != GST_FLOW_OK) break; context->codec_priv = data; context->codec_priv_size = size; GST_DEBUG_OBJECT (parse, "CodecPrivate of size %" G_GUINT64_FORMAT, size); break; } /* name of the codec */ case GST_MATROSKA_ID_CODECNAME:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (parse, "CodecName: %s", GST_STR_NULL (text)); context->codec_name = text; break; } /* name of this track */ case GST_MATROSKA_ID_TRACKNAME:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; context->name = text; GST_DEBUG_OBJECT (parse, "TrackName: %s", GST_STR_NULL (text)); break; } /* language (matters for audio/subtitles, mostly) */ case GST_MATROSKA_ID_TRACKLANGUAGE:{ gchar *text; if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK) break; context->language = text; /* fre-ca => fre */ if (strlen (context->language) >= 4 && context->language[3] == '-') context->language[3] = '\0'; GST_DEBUG_OBJECT (parse, "TrackLanguage: %s", GST_STR_NULL (context->language)); break; } /* whether this is actually used */ case GST_MATROSKA_ID_TRACKFLAGENABLED:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_ENABLED; else context->flags &= ~GST_MATROSKA_TRACK_ENABLED; GST_DEBUG_OBJECT (parse, "TrackEnabled: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* whether it's the default for this track type */ case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_DEFAULT; else context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; GST_DEBUG_OBJECT (parse, "TrackDefault: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* whether the track must be used during playback */ case GST_MATROSKA_ID_TRACKFLAGFORCED:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_FORCED; else context->flags &= ~GST_MATROSKA_TRACK_FORCED; GST_DEBUG_OBJECT (parse, "TrackForced: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* lacing (like MPEG, where blocks don't end/start on frame * boundaries) */ case GST_MATROSKA_ID_TRACKFLAGLACING:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num) context->flags |= GST_MATROSKA_TRACK_LACING; else context->flags &= ~GST_MATROSKA_TRACK_LACING; GST_DEBUG_OBJECT (parse, "TrackLacing: %d", (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0); break; } /* default length (in time) of one data block in this track */ case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ guint64 num; if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) break; if (num == 0) { GST_WARNING_OBJECT (parse, "Invalid TrackDefaultDuration 0"); break; } GST_DEBUG_OBJECT (parse, "TrackDefaultDuration: %" G_GUINT64_FORMAT, num); context->default_duration = num; break; } case GST_MATROSKA_ID_CONTENTENCODINGS:{ ret = gst_matroska_read_common_read_track_encodings (&parse->common, ebml, context); break; } case GST_MATROSKA_ID_TRACKTIMECODESCALE:{ gdouble num; if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK) break; if (num <= 0.0) { GST_WARNING_OBJECT (parse, "Invalid TrackTimeCodeScale %lf", num); break; } GST_DEBUG_OBJECT (parse, "TrackTimeCodeScale: %lf", num); context->timecodescale = num; break; } default: GST_WARNING ("Unknown TrackEntry subelement 0x%x - ignoring", id); /* pass-through */ /* we ignore these because they're nothing useful (i.e. crap) * or simply not implemented yet. */ case GST_MATROSKA_ID_TRACKMINCACHE: case GST_MATROSKA_ID_TRACKMAXCACHE: case GST_MATROSKA_ID_MAXBLOCKADDITIONID: case GST_MATROSKA_ID_TRACKATTACHMENTLINK: case GST_MATROSKA_ID_TRACKOVERLAY: case GST_MATROSKA_ID_TRACKTRANSLATE: case GST_MATROSKA_ID_TRACKOFFSET: case GST_MATROSKA_ID_CODECSETTINGS: case GST_MATROSKA_ID_CODECINFOURL: case GST_MATROSKA_ID_CODECDOWNLOADURL: case GST_MATROSKA_ID_CODECDECODEALL: ret = gst_ebml_read_skip (ebml); break; } } DEBUG_ELEMENT_STOP (parse, ebml, "TrackEntry", ret); /* Decode codec private data if necessary */ if (context->encodings && context->encodings->len > 0 && context->codec_priv && context->codec_priv_size > 0) { if (!gst_matroska_decode_data (context->encodings, &context->codec_priv, &context->codec_priv_size, GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) { GST_WARNING_OBJECT (parse, "Decoding codec private data failed"); ret = GST_FLOW_ERROR; } } if (context->type == 0 || context->codec_id == NULL || (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)) { if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED) GST_WARNING_OBJECT (ebml, "Unknown stream/codec in track entry header"); parse->common.num_streams--; g_ptr_array_remove_index (parse->common.src, parse->common.num_streams); g_assert (parse->common.src->len == parse->common.num_streams); if (context) { gst_matroska_track_free (context); } return ret; } if ((context->language == NULL || *context->language == '\0') && (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO || context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE)) { GST_LOG ("stream %d: language=eng (assuming default)", context->index); context->language = g_strdup ("eng"); } /* tadaah! */ return ret; } static const GstQueryType * gst_matroska_parse_get_src_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_SEEKING, 0 }; return query_types; } static gboolean gst_matroska_parse_query (GstMatroskaParse * parse, GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstMatroskaTrackContext *context = NULL; if (pad) { context = gst_pad_get_element_private (pad); } switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); if (format == GST_FORMAT_TIME) { GST_OBJECT_LOCK (parse); if (context) gst_query_set_position (query, GST_FORMAT_TIME, context->pos); else gst_query_set_position (query, GST_FORMAT_TIME, parse->common.segment.last_stop); GST_OBJECT_UNLOCK (parse); } else if (format == GST_FORMAT_DEFAULT && context && context->default_duration) { GST_OBJECT_LOCK (parse); gst_query_set_position (query, GST_FORMAT_DEFAULT, context->pos / context->default_duration); GST_OBJECT_UNLOCK (parse); } else { GST_DEBUG_OBJECT (parse, "only position query in TIME and DEFAULT format is supported"); } res = TRUE; break; } case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); if (format == GST_FORMAT_TIME) { GST_OBJECT_LOCK (parse); gst_query_set_duration (query, GST_FORMAT_TIME, parse->common.segment.duration); GST_OBJECT_UNLOCK (parse); } else if (format == GST_FORMAT_DEFAULT && context && context->default_duration) { GST_OBJECT_LOCK (parse); gst_query_set_duration (query, GST_FORMAT_DEFAULT, parse->common.segment.duration / context->default_duration); GST_OBJECT_UNLOCK (parse); } else { GST_DEBUG_OBJECT (parse, "only duration query in TIME and DEFAULT format is supported"); } res = TRUE; break; } case GST_QUERY_SEEKING: { GstFormat fmt; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); if (fmt == GST_FORMAT_TIME) { gboolean seekable; /* assuming we'll be able to get an index ... */ seekable = parse->seekable; gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, parse->common.segment.duration); res = TRUE; } break; } default: res = gst_pad_query_default (pad, query); break; } return res; } static gboolean gst_matroska_parse_element_query (GstElement * element, GstQuery * query) { return gst_matroska_parse_query (GST_MATROSKA_PARSE (element), NULL, query); } static gboolean gst_matroska_parse_handle_src_query (GstPad * pad, GstQuery * query) { gboolean ret; GstMatroskaParse *parse = GST_MATROSKA_PARSE (gst_pad_get_parent (pad)); ret = gst_matroska_parse_query (parse, pad, query); gst_object_unref (parse); return ret; } /* returns FALSE if there are no pads to deliver event to, * otherwise TRUE (whatever the outcome of event sending), * takes ownership of the passed event! */ static gboolean gst_matroska_parse_send_event (GstMatroskaParse * parse, GstEvent * event) { gboolean ret = FALSE; g_return_val_if_fail (event != NULL, FALSE); GST_DEBUG_OBJECT (parse, "Sending event of type %s to all source pads", GST_EVENT_TYPE_NAME (event)); gst_pad_push_event (parse->srcpad, event); return ret; } static gboolean gst_matroska_parse_element_send_event (GstElement * element, GstEvent * event) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); gboolean res; g_return_val_if_fail (event != NULL, FALSE); if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { res = gst_matroska_parse_handle_seek_event (parse, NULL, event); } else { GST_WARNING_OBJECT (parse, "Unhandled event of type %s", GST_EVENT_TYPE_NAME (event)); res = FALSE; } gst_event_unref (event); return res; } /* searches for a cluster start from @pos, * return GST_FLOW_OK and cluster position in @pos if found */ static GstFlowReturn gst_matroska_parse_search_cluster (GstMatroskaParse * parse, gint64 * pos) { gint64 newpos = *pos; gint64 orig_offset; GstFlowReturn ret = GST_FLOW_OK; const guint chunk = 64 * 1024; GstBuffer *buf = NULL; guint64 length; guint32 id; guint needed; orig_offset = parse->common.offset; /* read in at newpos and scan for ebml cluster id */ while (1) { GstByteReader reader; gint cluster_pos; ret = gst_pad_pull_range (parse->common.sinkpad, newpos, chunk, &buf); if (ret != GST_FLOW_OK) break; GST_DEBUG_OBJECT (parse, "read buffer size %d at offset %" G_GINT64_FORMAT, GST_BUFFER_SIZE (buf), newpos); gst_byte_reader_init_from_buffer (&reader, buf); cluster_pos = 0; resume: cluster_pos = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, GST_MATROSKA_ID_CLUSTER, cluster_pos, GST_BUFFER_SIZE (buf) - cluster_pos); if (cluster_pos >= 0) { newpos += cluster_pos; GST_DEBUG_OBJECT (parse, "found cluster ebml id at offset %" G_GINT64_FORMAT, newpos); /* extra checks whether we really sync'ed to a cluster: * - either it is the first and only cluster * - either there is a cluster after this one * - either cluster length is undefined */ /* ok if first cluster (there may not a subsequent one) */ if (newpos == parse->first_cluster_offset) { GST_DEBUG_OBJECT (parse, "cluster is first cluster -> OK"); break; } parse->common.offset = newpos; ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, GST_ELEMENT_CAST (parse), &id, &length, &needed); if (ret != GST_FLOW_OK) goto resume; g_assert (id == GST_MATROSKA_ID_CLUSTER); GST_DEBUG_OBJECT (parse, "cluster size %" G_GUINT64_FORMAT ", prefix %d", length, needed); /* ok if undefined length or first cluster */ if (length == G_MAXUINT64) { GST_DEBUG_OBJECT (parse, "cluster has undefined length -> OK"); break; } /* skip cluster */ parse->common.offset += length + needed; ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, GST_ELEMENT_CAST (parse), &id, &length, &needed); if (ret != GST_FLOW_OK) goto resume; GST_DEBUG_OBJECT (parse, "next element is %scluster", id == GST_MATROSKA_ID_CLUSTER ? "" : "not "); if (id == GST_MATROSKA_ID_CLUSTER) break; /* not ok, resume */ goto resume; } else { /* partial cluster id may have been in tail of buffer */ newpos += MAX (GST_BUFFER_SIZE (buf), 4) - 3; gst_buffer_unref (buf); buf = NULL; } } if (buf) { gst_buffer_unref (buf); buf = NULL; } parse->common.offset = orig_offset; *pos = newpos; return ret; } static gboolean gst_matroska_parse_handle_seek_event (GstMatroskaParse * parse, GstPad * pad, GstEvent * event) { GstMatroskaIndex *entry = NULL; GstSeekFlags flags; GstSeekType cur_type, stop_type; GstFormat format; gdouble rate; gint64 cur, stop; GstMatroskaTrackContext *track = NULL; GstSegment seeksegment = { 0, }; gboolean update; if (pad) track = gst_pad_get_element_private (pad); track = gst_matroska_read_common_get_seek_track (&parse->common, track); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* we can only seek on time */ if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (parse, "Can only seek on TIME"); return FALSE; } /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &parse->common.segment, sizeof (GstSegment)); if (event) { GST_DEBUG_OBJECT (parse, "configuring seek"); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); } GST_DEBUG_OBJECT (parse, "New segment %" GST_SEGMENT_FORMAT, &seeksegment); /* check sanity before we start flushing and all that */ GST_OBJECT_LOCK (parse); if ((entry = gst_matroska_read_common_do_index_seek (&parse->common, track, seeksegment.last_stop, &parse->seek_index, &parse->seek_entry)) == NULL) { /* pull mode without index can scan later on */ GST_DEBUG_OBJECT (parse, "No matching seek entry in index"); GST_OBJECT_UNLOCK (parse); return FALSE; } GST_DEBUG_OBJECT (parse, "Seek position looks sane"); GST_OBJECT_UNLOCK (parse); /* need to seek to cluster start to pick up cluster time */ /* upstream takes care of flushing and all that * ... and newsegment event handling takes care of the rest */ return perform_seek_to_offset (parse, entry->pos + parse->common.ebml_segment_start); } /* * Handle whether we can perform the seek event or if we have to let the chain * function handle seeks to build the seek indexes first. */ static gboolean gst_matroska_parse_handle_seek_push (GstMatroskaParse * parse, GstPad * pad, GstEvent * event) { GstSeekFlags flags; GstSeekType cur_type, stop_type; GstFormat format; gdouble rate; gint64 cur, stop; gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* sanity checks */ /* we can only seek on time */ if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (parse, "Can only seek on TIME"); return FALSE; } if (stop_type != GST_SEEK_TYPE_NONE && stop != GST_CLOCK_TIME_NONE) { GST_DEBUG_OBJECT (parse, "Seek end-time not supported in streaming mode"); return FALSE; } if (!(flags & GST_SEEK_FLAG_FLUSH)) { GST_DEBUG_OBJECT (parse, "Non-flushing seek not supported in streaming mode"); return FALSE; } if (flags & GST_SEEK_FLAG_SEGMENT) { GST_DEBUG_OBJECT (parse, "Segment seek not supported in streaming mode"); return FALSE; } /* check for having parsed index already */ if (!parse->common.index_parsed) { gboolean building_index; guint64 offset = 0; if (!parse->index_offset) { GST_DEBUG_OBJECT (parse, "no index (location); no seek in push mode"); return FALSE; } GST_OBJECT_LOCK (parse); /* handle the seek event in the chain function */ parse->common.state = GST_MATROSKA_READ_STATE_SEEK; /* no more seek can be issued until state reset to _DATA */ /* copy the event */ if (parse->seek_event) gst_event_unref (parse->seek_event); parse->seek_event = gst_event_ref (event); /* set the building_index flag so that only one thread can setup the * structures for index seeking. */ building_index = parse->building_index; if (!building_index) { parse->building_index = TRUE; offset = parse->index_offset; } GST_OBJECT_UNLOCK (parse); if (!building_index) { /* seek to the first subindex or legacy index */ GST_INFO_OBJECT (parse, "Seeking to Cues at %" G_GUINT64_FORMAT, offset); return perform_seek_to_offset (parse, offset); } /* well, we are handling it already */ return TRUE; } /* delegate to tweaked regular seek */ return gst_matroska_parse_handle_seek_event (parse, pad, event); } static gboolean gst_matroska_parse_handle_src_event (GstPad * pad, GstEvent * event) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (gst_pad_get_parent (pad)); gboolean res = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: /* no seeking until we are (safely) ready */ if (parse->common.state != GST_MATROSKA_READ_STATE_DATA) { GST_DEBUG_OBJECT (parse, "not ready for seeking yet"); return FALSE; } res = gst_matroska_parse_handle_seek_push (parse, pad, event); gst_event_unref (event); break; case GST_EVENT_QOS: { GstMatroskaTrackContext *context = gst_pad_get_element_private (pad); if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) { GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) context; gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; gst_event_parse_qos (event, &proportion, &diff, ×tamp); GST_OBJECT_LOCK (parse); videocontext->earliest_time = timestamp + diff; GST_OBJECT_UNLOCK (parse); } res = TRUE; gst_event_unref (event); break; } /* events we don't need to handle */ case GST_EVENT_NAVIGATION: gst_event_unref (event); res = FALSE; break; case GST_EVENT_LATENCY: default: res = gst_pad_push_event (parse->common.sinkpad, event); break; } gst_object_unref (parse); return res; } static GstFlowReturn gst_matroska_parse_parse_tracks (GstMatroskaParse * parse, GstEbmlRead * ebml) { GstFlowReturn ret = GST_FLOW_OK; guint32 id; DEBUG_ELEMENT_START (parse, ebml, "Tracks"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (parse, ebml, "Tracks", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { /* one track within the "all-tracks" header */ case GST_MATROSKA_ID_TRACKENTRY: ret = gst_matroska_parse_add_stream (parse, ebml); break; default: ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, "Track", id); break; } } DEBUG_ELEMENT_STOP (parse, ebml, "Tracks", ret); parse->tracks_parsed = TRUE; return ret; } /* * Read signed/unsigned "EBML" numbers. * Return: number of bytes processed. */ static gint gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num) { gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; guint64 total; if (size <= 0) { return -1; } total = data[0]; while (read <= 8 && !(total & len_mask)) { read++; len_mask >>= 1; } if (read > 8) return -1; if ((total &= (len_mask - 1)) == len_mask - 1) num_ffs++; if (size < read) return -1; while (n < read) { if (data[n] == 0xff) num_ffs++; total = (total << 8) | data[n]; n++; } if (read == num_ffs && total != 0) *num = G_MAXUINT64; else *num = total; return read; } static gint gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num) { guint64 unum; gint res; /* read as unsigned number first */ if ((res = gst_matroska_ebmlnum_uint (data, size, &unum)) < 0) return -1; /* make signed */ if (unum == G_MAXUINT64) *num = G_MAXINT64; else *num = unum - ((1 << ((7 * res) - 1)) - 1); return res; } static GstFlowReturn gst_matroska_parse_parse_blockgroup_or_simpleblock (GstMatroskaParse * parse, GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset, gboolean is_simpleblock) { GstMatroskaTrackContext *stream = NULL; GstFlowReturn ret = GST_FLOW_OK; gboolean readblock = FALSE; guint32 id; guint64 block_duration = 0; GstBuffer *buf = NULL; gint stream_num = -1, n, laces = 0; guint size = 0; gint *lace_size = NULL; gint64 time = 0; gint flags = 0; gint64 referenceblock = 0; while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if (!is_simpleblock) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) { goto data_error; } } else { id = GST_MATROSKA_ID_SIMPLEBLOCK; } switch (id) { /* one block inside the group. Note, block parsing is one * of the harder things, so this code is a bit complicated. * See http://www.matroska.org/ for documentation. */ case GST_MATROSKA_ID_SIMPLEBLOCK: case GST_MATROSKA_ID_BLOCK: { guint64 num; guint8 *data; if (buf) { gst_buffer_unref (buf); buf = NULL; } if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK) break; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* first byte(s): blocknum */ if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) goto data_error; data += n; size -= n; /* fetch stream from num */ stream_num = gst_matroska_read_common_stream_from_num (&parse->common, num); if (G_UNLIKELY (size < 3)) { GST_WARNING_OBJECT (parse, "Invalid size %u", size); /* non-fatal, try next block(group) */ ret = GST_FLOW_OK; goto done; } else if (G_UNLIKELY (stream_num < 0 || stream_num >= parse->common.num_streams)) { /* let's not give up on a stray invalid track number */ GST_WARNING_OBJECT (parse, "Invalid stream %d for track number %" G_GUINT64_FORMAT "; ignoring block", stream_num, num); goto done; } stream = g_ptr_array_index (parse->common.src, stream_num); /* time (relative to cluster time) */ time = ((gint16) GST_READ_UINT16_BE (data)); data += 2; size -= 2; flags = GST_READ_UINT8 (data); data += 1; size -= 1; GST_LOG_OBJECT (parse, "time %" G_GUINT64_FORMAT ", flags %d", time, flags); switch ((flags & 0x06) >> 1) { case 0x0: /* no lacing */ laces = 1; lace_size = g_new (gint, 1); lace_size[0] = size; break; case 0x1: /* xiph lacing */ case 0x2: /* fixed-size lacing */ case 0x3: /* EBML lacing */ if (size == 0) goto invalid_lacing; laces = GST_READ_UINT8 (data) + 1; data += 1; size -= 1; lace_size = g_new0 (gint, laces); switch ((flags & 0x06) >> 1) { case 0x1: /* xiph lacing */ { guint temp, total = 0; for (n = 0; ret == GST_FLOW_OK && n < laces - 1; n++) { while (1) { if (size == 0) goto invalid_lacing; temp = GST_READ_UINT8 (data); lace_size[n] += temp; data += 1; size -= 1; if (temp != 0xff) break; } total += lace_size[n]; } lace_size[n] = size - total; break; } case 0x2: /* fixed-size lacing */ for (n = 0; n < laces; n++) lace_size[n] = size / laces; break; case 0x3: /* EBML lacing */ { guint total; if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) goto data_error; data += n; size -= n; total = lace_size[0] = num; for (n = 1; ret == GST_FLOW_OK && n < laces - 1; n++) { gint64 snum; gint r; if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) goto data_error; data += r; size -= r; lace_size[n] = lace_size[n - 1] + snum; total += lace_size[n]; } if (n < laces) lace_size[n] = size - total; break; } } break; } if (ret != GST_FLOW_OK) break; readblock = TRUE; break; } case GST_MATROSKA_ID_BLOCKDURATION:{ ret = gst_ebml_read_uint (ebml, &id, &block_duration); GST_DEBUG_OBJECT (parse, "BlockDuration: %" G_GUINT64_FORMAT, block_duration); break; } case GST_MATROSKA_ID_REFERENCEBLOCK:{ ret = gst_ebml_read_sint (ebml, &id, &referenceblock); GST_DEBUG_OBJECT (parse, "ReferenceBlock: %" G_GINT64_FORMAT, referenceblock); break; } case GST_MATROSKA_ID_CODECSTATE:{ guint8 *data; guint64 data_len = 0; if ((ret = gst_ebml_read_binary (ebml, &id, &data, &data_len)) != GST_FLOW_OK) break; if (G_UNLIKELY (stream == NULL)) { GST_WARNING_OBJECT (parse, "Unexpected CodecState subelement - ignoring"); break; } g_free (stream->codec_state); stream->codec_state = data; stream->codec_state_size = data_len; break; } default: ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, "BlockGroup", id); break; case GST_MATROSKA_ID_BLOCKVIRTUAL: case GST_MATROSKA_ID_BLOCKADDITIONS: case GST_MATROSKA_ID_REFERENCEPRIORITY: case GST_MATROSKA_ID_REFERENCEVIRTUAL: case GST_MATROSKA_ID_SLICES: GST_DEBUG_OBJECT (parse, "Skipping BlockGroup subelement 0x%x - ignoring", id); ret = gst_ebml_read_skip (ebml); break; } if (is_simpleblock) break; } /* reading a number or so could have failed */ if (ret != GST_FLOW_OK) goto data_error; if (ret == GST_FLOW_OK && readblock) { guint64 duration = 0; gint64 lace_time = 0; gboolean delta_unit; stream = g_ptr_array_index (parse->common.src, stream_num); if (cluster_time != GST_CLOCK_TIME_NONE) { /* FIXME: What to do with negative timestamps? Give timestamp 0 or -1? * Drop unless the lace contains timestamp 0? */ if (time < 0 && (-time) > cluster_time) { lace_time = 0; } else { if (stream->timecodescale == 1.0) lace_time = (cluster_time + time) * parse->common.time_scale; else lace_time = gst_util_guint64_to_gdouble ((cluster_time + time) * parse->common.time_scale) * stream->timecodescale; } } else { lace_time = GST_CLOCK_TIME_NONE; } if (lace_time != GST_CLOCK_TIME_NONE) { parse->last_timestamp = lace_time; } /* need to refresh segment info ASAP */ if (GST_CLOCK_TIME_IS_VALID (lace_time) && parse->need_newsegment) { GST_DEBUG_OBJECT (parse, "generating segment starting at %" GST_TIME_FORMAT, GST_TIME_ARGS (lace_time)); /* pretend we seeked here */ gst_segment_set_seek (&parse->common.segment, parse->common.segment.rate, GST_FORMAT_TIME, 0, GST_SEEK_TYPE_SET, lace_time, GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE, NULL); /* now convey our segment notion downstream */ gst_matroska_parse_send_event (parse, gst_event_new_new_segment (FALSE, parse->common.segment.rate, parse->common.segment.format, parse->common.segment.start, parse->common.segment.stop, parse->common.segment.start)); parse->need_newsegment = FALSE; } if (block_duration) { if (stream->timecodescale == 1.0) duration = gst_util_uint64_scale (block_duration, parse->common.time_scale, 1); else duration = gst_util_gdouble_to_guint64 (gst_util_guint64_to_gdouble (gst_util_uint64_scale (block_duration, parse->common.time_scale, 1)) * stream->timecodescale); } else if (stream->default_duration) { duration = stream->default_duration * laces; } /* else duration is diff between timecode of this and next block */ /* For SimpleBlock, look at the keyframe bit in flags. Otherwise, a ReferenceBlock implies that this is not a keyframe. In either case, it only makes sense for video streams. */ delta_unit = stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && ((is_simpleblock && !(flags & 0x80)) || referenceblock); if (delta_unit && stream->set_discont) { /* When doing seeks or such, we need to restart on key frames or * decoders might choke. */ GST_DEBUG_OBJECT (parse, "skipping delta unit"); goto done; } for (n = 0; n < laces; n++) { if (G_UNLIKELY (lace_size[n] > size)) { GST_WARNING_OBJECT (parse, "Invalid lace size"); break; } /* QoS for video track with an index. the assumption is that index entries point to keyframes, but if that is not true we will instad skip until the next keyframe. */ if (GST_CLOCK_TIME_IS_VALID (lace_time) && stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table && parse->common.segment.rate > 0.0) { GstMatroskaTrackVideoContext *videocontext = (GstMatroskaTrackVideoContext *) stream; GstClockTime earliest_time; GstClockTime earliest_stream_time; GST_OBJECT_LOCK (parse); earliest_time = videocontext->earliest_time; GST_OBJECT_UNLOCK (parse); earliest_stream_time = gst_segment_to_position (&parse->common.segment, GST_FORMAT_TIME, earliest_time); if (GST_CLOCK_TIME_IS_VALID (lace_time) && GST_CLOCK_TIME_IS_VALID (earliest_stream_time) && lace_time <= earliest_stream_time) { /* find index entry (keyframe) <= earliest_stream_time */ GstMatroskaIndex *entry = gst_util_array_binary_search (stream->index_table->data, stream->index_table->len, sizeof (GstMatroskaIndex), (GCompareDataFunc) gst_matroska_index_seek_find, GST_SEARCH_MODE_BEFORE, &earliest_stream_time, NULL); /* if that entry (keyframe) is after the current the current buffer, we can skip pushing (and thus decoding) all buffers until that keyframe. */ if (entry && GST_CLOCK_TIME_IS_VALID (entry->time) && entry->time > lace_time) { GST_LOG_OBJECT (parse, "Skipping lace before late keyframe"); stream->set_discont = TRUE; goto next_lace; } } } #if 0 sub = gst_buffer_create_sub (buf, GST_BUFFER_SIZE (buf) - size, lace_size[n]); GST_DEBUG_OBJECT (parse, "created subbuffer %p", sub); if (delta_unit) GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT); else GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT); if (stream->encodings != NULL && stream->encodings->len > 0) sub = gst_matroska_decode_buffer (stream, sub); if (sub == NULL) { GST_WARNING_OBJECT (parse, "Decoding buffer failed"); goto next_lace; } GST_BUFFER_TIMESTAMP (sub) = lace_time; if (GST_CLOCK_TIME_IS_VALID (lace_time)) { GstClockTime last_stop_end; /* Check if this stream is after segment stop */ if (GST_CLOCK_TIME_IS_VALID (parse->common.segment.stop) && lace_time >= parse->common.segment.stop) { GST_DEBUG_OBJECT (parse, "Stream %d after segment stop %" GST_TIME_FORMAT, stream->index, GST_TIME_ARGS (parse->common.segment.stop)); gst_buffer_unref (sub); goto eos; } if (offset >= stream->to_offset) { GST_DEBUG_OBJECT (parse, "Stream %d after playback section", stream->index); gst_buffer_unref (sub); goto eos; } /* handle gaps, e.g. non-zero start-time, or an cue index entry * that landed us with timestamps not quite intended */ if (GST_CLOCK_TIME_IS_VALID (parse->segment.last_stop) && parse->segment.rate > 0.0) { GstClockTimeDiff diff; /* only send newsegments with increasing start times, * otherwise if these go back and forth downstream (sinks) increase * accumulated time and running_time */ diff = GST_CLOCK_DIFF (parse->segment.last_stop, lace_time); if (diff > 2 * GST_SECOND && lace_time > parse->segment.start && (!GST_CLOCK_TIME_IS_VALID (parse->segment.stop) || lace_time < parse->segment.stop)) { GST_DEBUG_OBJECT (parse, "Gap of %" G_GINT64_FORMAT " ns detected in" "stream %d (%" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "). " "Sending updated NEWSEGMENT events", diff, stream->index, GST_TIME_ARGS (stream->pos), GST_TIME_ARGS (lace_time)); /* send newsegment events such that the gap is not accounted in * accum time, hence running_time */ /* close ahead of gap */ gst_matroska_parse_send_event (parse, gst_event_new_new_segment (TRUE, parse->segment.rate, parse->segment.format, parse->segment.last_stop, parse->segment.last_stop, parse->segment.last_stop)); /* skip gap */ gst_matroska_parse_send_event (parse, gst_event_new_new_segment (FALSE, parse->segment.rate, parse->segment.format, lace_time, parse->segment.stop, lace_time)); /* align segment view with downstream, * prevents double-counting accum when closing segment */ gst_segment_set_newsegment (&parse->segment, FALSE, parse->segment.rate, parse->segment.format, lace_time, parse->segment.stop, lace_time); parse->segment.last_stop = lace_time; } } if (!GST_CLOCK_TIME_IS_VALID (parse->segment.last_stop) || parse->segment.last_stop < lace_time) { parse->segment.last_stop = lace_time; } last_stop_end = lace_time; if (duration) { GST_BUFFER_DURATION (sub) = duration / laces; last_stop_end += GST_BUFFER_DURATION (sub); } if (!GST_CLOCK_TIME_IS_VALID (parse->last_stop_end) || parse->last_stop_end < last_stop_end) parse->last_stop_end = last_stop_end; if (parse->segment.duration == -1 || parse->segment.duration < lace_time) { gst_segment_set_duration (&parse->segment, GST_FORMAT_TIME, last_stop_end); gst_element_post_message (GST_ELEMENT_CAST (parse), gst_message_new_duration (GST_OBJECT_CAST (parse), GST_FORMAT_TIME, GST_CLOCK_TIME_NONE)); } } stream->pos = lace_time; gst_matroska_parse_sync_streams (parse); if (stream->set_discont) { GST_DEBUG_OBJECT (parse, "marking DISCONT"); GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DISCONT); stream->set_discont = FALSE; } /* reverse playback book-keeping */ if (!GST_CLOCK_TIME_IS_VALID (stream->from_time)) stream->from_time = lace_time; if (stream->from_offset == -1) stream->from_offset = offset; GST_DEBUG_OBJECT (parse, "Pushing lace %d, data of size %d for stream %d, time=%" GST_TIME_FORMAT " and duration=%" GST_TIME_FORMAT, n, GST_BUFFER_SIZE (sub), stream_num, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), GST_TIME_ARGS (GST_BUFFER_DURATION (sub))); if (parse->element_index) { if (stream->index_writer_id == -1) gst_index_get_writer_id (parse->element_index, GST_OBJECT (stream->pad), &stream->index_writer_id); GST_LOG_OBJECT (parse, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT " for writer id %d", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), cluster_offset, stream->index_writer_id); gst_index_add_association (parse->element_index, stream->index_writer_id, GST_BUFFER_FLAG_IS_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (sub), GST_FORMAT_BYTES, cluster_offset, NULL); } gst_buffer_set_caps (sub, GST_PAD_CAPS (parse->srcpad)); /* Postprocess the buffers depending on the codec used */ if (stream->postprocess_frame) { GST_LOG_OBJECT (parse, "running post process"); ret = stream->postprocess_frame (GST_ELEMENT (parse), stream, &sub); } ret = gst_pad_push (stream->pad, sub); if (parse->segment.rate < 0) { if (lace_time > parse->segment.stop && ret == GST_FLOW_UNEXPECTED) { /* In reverse playback we can get a GST_FLOW_UNEXPECTED when * we are at the end of the segment, so we just need to jump * back to the previous section. */ GST_DEBUG_OBJECT (parse, "downstream has reached end of segment"); ret = GST_FLOW_OK; } } /* combine flows */ ret = gst_matroska_parse_combine_flows (parse, stream, ret); #endif next_lace: size -= lace_size[n]; if (lace_time != GST_CLOCK_TIME_NONE && duration) lace_time += duration / laces; else lace_time = GST_CLOCK_TIME_NONE; } } done: if (buf) gst_buffer_unref (buf); g_free (lace_size); return ret; /* EXITS */ invalid_lacing: { GST_ELEMENT_WARNING (parse, STREAM, DEMUX, (NULL), ("Invalid lacing size")); /* non-fatal, try next block(group) */ ret = GST_FLOW_OK; goto done; } data_error: { GST_ELEMENT_WARNING (parse, STREAM, DEMUX, (NULL), ("Data error")); /* non-fatal, try next block(group) */ ret = GST_FLOW_OK; goto done; } } /* return FALSE if block(group) should be skipped (due to a seek) */ static inline gboolean gst_matroska_parse_seek_block (GstMatroskaParse * parse) { if (G_UNLIKELY (parse->seek_block)) { if (!(--parse->seek_block)) { return TRUE; } else { GST_LOG_OBJECT (parse, "should skip block due to seek"); return FALSE; } } else { return TRUE; } } static GstFlowReturn gst_matroska_parse_parse_contents_seekentry (GstMatroskaParse * parse, GstEbmlRead * ebml) { GstFlowReturn ret; guint64 seek_pos = (guint64) - 1; guint32 seek_id = 0; guint32 id; DEBUG_ELEMENT_START (parse, ebml, "Seek"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (parse, ebml, "Seek", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_SEEKID: { guint64 t; if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) break; GST_DEBUG_OBJECT (parse, "SeekID: %" G_GUINT64_FORMAT, t); seek_id = t; break; } case GST_MATROSKA_ID_SEEKPOSITION: { guint64 t; if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK) break; if (t > G_MAXINT64) { GST_WARNING_OBJECT (parse, "Too large SeekPosition %" G_GUINT64_FORMAT, t); break; } GST_DEBUG_OBJECT (parse, "SeekPosition: %" G_GUINT64_FORMAT, t); seek_pos = t; break; } default: ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, "SeekHead", id); break; } } if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) return ret; if (!seek_id || seek_pos == (guint64) - 1) { GST_WARNING_OBJECT (parse, "Incomplete seekhead entry (0x%x/%" G_GUINT64_FORMAT ")", seek_id, seek_pos); return GST_FLOW_OK; } switch (seek_id) { case GST_MATROSKA_ID_SEEKHEAD: { } case GST_MATROSKA_ID_CUES: case GST_MATROSKA_ID_TAGS: case GST_MATROSKA_ID_TRACKS: case GST_MATROSKA_ID_SEGMENTINFO: case GST_MATROSKA_ID_ATTACHMENTS: case GST_MATROSKA_ID_CHAPTERS: { guint64 length; /* remember */ length = gst_matroska_read_common_get_length (&parse->common); if (length == (guint64) - 1) { GST_DEBUG_OBJECT (parse, "no upstream length, skipping SeakHead entry"); break; } /* check for validity */ if (seek_pos + parse->common.ebml_segment_start + 12 >= length) { GST_WARNING_OBJECT (parse, "SeekHead reference lies outside file!" " (%" G_GUINT64_FORMAT "+%" G_GUINT64_FORMAT "+12 >= %" G_GUINT64_FORMAT ")", seek_pos, parse->common.ebml_segment_start, length); break; } /* only pick up index location when streaming */ if (seek_id == GST_MATROSKA_ID_CUES) { parse->index_offset = seek_pos + parse->common.ebml_segment_start; GST_DEBUG_OBJECT (parse, "Cues located at offset %" G_GUINT64_FORMAT, parse->index_offset); } break; } default: GST_DEBUG_OBJECT (parse, "Ignoring Seek entry for ID=0x%x", seek_id); break; } DEBUG_ELEMENT_STOP (parse, ebml, "Seek", ret); return ret; } static GstFlowReturn gst_matroska_parse_parse_contents (GstMatroskaParse * parse, GstEbmlRead * ebml) { GstFlowReturn ret = GST_FLOW_OK; guint32 id; DEBUG_ELEMENT_START (parse, ebml, "SeekHead"); if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) { DEBUG_ELEMENT_STOP (parse, ebml, "SeekHead", ret); return ret; } while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) { if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) break; switch (id) { case GST_MATROSKA_ID_SEEKENTRY: { ret = gst_matroska_parse_parse_contents_seekentry (parse, ebml); /* Ignore EOS and errors here */ if (ret != GST_FLOW_OK) { GST_DEBUG_OBJECT (parse, "Ignoring %s", gst_flow_get_name (ret)); ret = GST_FLOW_OK; } break; } default: ret = gst_matroska_read_common_parse_skip (&parse->common, ebml, "SeekHead", id); break; } } DEBUG_ELEMENT_STOP (parse, ebml, "SeekHead", ret); return ret; } #define GST_FLOW_OVERFLOW GST_FLOW_CUSTOM_ERROR #define MAX_BLOCK_SIZE (15 * 1024 * 1024) static inline GstFlowReturn gst_matroska_parse_check_read_size (GstMatroskaParse * parse, guint64 bytes) { if (G_UNLIKELY (bytes > MAX_BLOCK_SIZE)) { /* only a few blocks are expected/allowed to be large, * and will be recursed into, whereas others will be read and must fit */ /* fatal in streaming case, as we can't step over easily */ GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("reading large block of size %" G_GUINT64_FORMAT " not supported; " "file might be corrupt.", bytes)); return GST_FLOW_ERROR; } else { return GST_FLOW_OK; } } /* returns TRUE if we truely are in error state, and should give up */ static inline gboolean gst_matroska_parse_check_parse_error (GstMatroskaParse * parse) { gint64 pos; /* sigh, one last attempt above and beyond call of duty ...; * search for cluster mark following current pos */ pos = parse->common.offset; GST_WARNING_OBJECT (parse, "parse error, looking for next cluster"); if (gst_matroska_parse_search_cluster (parse, &pos) != GST_FLOW_OK) { /* did not work, give up */ return TRUE; } else { GST_DEBUG_OBJECT (parse, "... found at %" G_GUINT64_FORMAT, pos); /* try that position */ parse->common.offset = pos; return FALSE; } } /* initializes @ebml with @bytes from input stream at current offset. * Returns UNEXPECTED if insufficient available, * ERROR if too much was attempted to read. */ static inline GstFlowReturn gst_matroska_parse_take (GstMatroskaParse * parse, guint64 bytes, GstEbmlRead * ebml) { GstBuffer *buffer = NULL; GstFlowReturn ret = GST_FLOW_OK; GST_LOG_OBJECT (parse, "taking %" G_GUINT64_FORMAT " bytes for parsing", bytes); ret = gst_matroska_parse_check_read_size (parse, bytes); if (G_UNLIKELY (ret != GST_FLOW_OK)) { /* otherwise fatal */ ret = GST_FLOW_ERROR; goto exit; } if (gst_adapter_available (parse->common.adapter) >= bytes) buffer = gst_adapter_take_buffer (parse->common.adapter, bytes); else ret = GST_FLOW_UNEXPECTED; if (G_LIKELY (buffer)) { gst_ebml_read_init (ebml, GST_ELEMENT_CAST (parse), buffer, parse->common.offset); parse->common.offset += bytes; } exit: return ret; } static void gst_matroska_parse_check_seekability (GstMatroskaParse * parse) { GstQuery *query; gboolean seekable = FALSE; gint64 start = -1, stop = -1; query = gst_query_new_seeking (GST_FORMAT_BYTES); if (!gst_pad_peer_query (parse->common.sinkpad, query)) { GST_DEBUG_OBJECT (parse, "seeking query failed"); goto done; } gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); /* try harder to query upstream size if we didn't get it the first time */ if (seekable && stop == -1) { GstFormat fmt = GST_FORMAT_BYTES; GST_DEBUG_OBJECT (parse, "doing duration query to fix up unset stop"); gst_pad_query_peer_duration (parse->common.sinkpad, &fmt, &stop); } /* if upstream doesn't know the size, it's likely that it's not seekable in * practice even if it technically may be seekable */ if (seekable && (start != 0 || stop <= start)) { GST_DEBUG_OBJECT (parse, "seekable but unknown start/stop -> disable"); seekable = FALSE; } done: GST_INFO_OBJECT (parse, "seekable: %d (%" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT ")", seekable, start, stop); parse->seekable = seekable; gst_query_unref (query); } #if 0 static GstFlowReturn gst_matroska_parse_find_tracks (GstMatroskaParse * parse) { guint32 id; guint64 before_pos; guint64 length; guint needed; GstFlowReturn ret = GST_FLOW_OK; GST_WARNING_OBJECT (parse, "Found Cluster element before Tracks, searching Tracks"); /* remember */ before_pos = parse->common.offset; /* Search Tracks element */ while (TRUE) { ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, GST_ELEMENT_CAST (parse), &id, &length, &needed); if (ret != GST_FLOW_OK) break; if (id != GST_MATROSKA_ID_TRACKS) { /* we may be skipping large cluster here, so forego size check etc */ /* ... but we can't skip undefined size; force error */ if (length == G_MAXUINT64) { ret = gst_matroska_parse_check_read_size (parse, length); break; } else { parse->common.offset += needed; parse->offset += length; } continue; } /* will lead to track parsing ... */ ret = gst_matroska_parse_parse_id (parse, id, length, needed); break; } /* seek back */ parse->offset = before_pos; return ret; } #endif #define GST_READ_CHECK(stmt) \ G_STMT_START { \ if (G_UNLIKELY ((ret = (stmt)) != GST_FLOW_OK)) { \ if (ret == GST_FLOW_OVERFLOW) { \ ret = GST_FLOW_OK; \ } \ goto read_error; \ } \ } G_STMT_END static void gst_matroska_parse_accumulate_streamheader (GstMatroskaParse * parse, GstBuffer * buffer) { if (parse->pushed_headers) { GST_WARNING_OBJECT (parse, "Accumulating headers, but headers are already pushed"); } if (parse->streamheader) { GstBuffer *buf; buf = gst_buffer_span (parse->streamheader, 0, buffer, GST_BUFFER_SIZE (parse->streamheader) + GST_BUFFER_SIZE (buffer)); gst_buffer_unref (parse->streamheader); parse->streamheader = buf; } else { parse->streamheader = gst_buffer_ref (buffer); } GST_DEBUG ("%d", GST_BUFFER_SIZE (parse->streamheader)); } static GstFlowReturn gst_matroska_parse_output (GstMatroskaParse * parse, GstBuffer * buffer, gboolean keyframe) { GstFlowReturn ret = GST_FLOW_OK; if (!parse->pushed_headers) { GstCaps *caps; GstStructure *s; GValue streamheader = { 0 }; GValue bufval = { 0 }; GstBuffer *buf; caps = gst_caps_new_simple ("video/x-matroska", NULL); s = gst_caps_get_structure (caps, 0); g_value_init (&streamheader, GST_TYPE_ARRAY); g_value_init (&bufval, GST_TYPE_BUFFER); buf = gst_buffer_copy (parse->streamheader); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); gst_value_set_buffer (&bufval, buf); gst_buffer_unref (buf); gst_value_array_append_value (&streamheader, &bufval); g_value_unset (&bufval); gst_structure_set_value (s, "streamheader", &streamheader); g_value_unset (&streamheader); //gst_caps_replace (parse->caps, caps); gst_pad_set_caps (parse->srcpad, caps); buf = gst_buffer_copy (parse->streamheader); gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); ret = gst_pad_push (parse->srcpad, buf); parse->pushed_headers = TRUE; } if (!keyframe) { GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); } else { GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); } if (GST_BUFFER_TIMESTAMP (buffer) != GST_CLOCK_TIME_NONE) { parse->last_timestamp = GST_BUFFER_TIMESTAMP (buffer); } else { GST_BUFFER_TIMESTAMP (buffer) = parse->last_timestamp; } gst_buffer_set_caps (buffer, GST_PAD_CAPS (parse->srcpad)); ret = gst_pad_push (parse->srcpad, gst_buffer_ref (buffer)); return ret; } static GstFlowReturn gst_matroska_parse_parse_id (GstMatroskaParse * parse, guint32 id, guint64 length, guint needed) { GstEbmlRead ebml = { 0, }; GstFlowReturn ret = GST_FLOW_OK; guint64 read; //GstBuffer *buffer; GST_DEBUG_OBJECT (parse, "Parsing Element id 0x%x, " "size %" G_GUINT64_FORMAT ", prefix %d", id, length, needed); #if 0 if (gst_adapter_available (parse->adapter) >= length + needed) { buffer = gst_adapter_take_buffer (parse->adapter, length + needed); gst_pad_push (parse->srcpad, buffer); } else { ret = GST_FLOW_UNEXPECTED; } //GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); return ret; #endif /* if we plan to read and parse this element, we need prefix (id + length) * and the contents */ /* mind about overflow wrap-around when dealing with undefined size */ read = length; if (G_LIKELY (length != G_MAXUINT64)) read += needed; switch (parse->common.state) { case GST_MATROSKA_READ_STATE_START: switch (id) { case GST_EBML_ID_HEADER: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); ret = gst_matroska_read_common_parse_header (&parse->common, &ebml); if (ret != GST_FLOW_OK) goto parse_failed; parse->common.state = GST_MATROSKA_READ_STATE_SEGMENT; gst_matroska_parse_check_seekability (parse); gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; default: goto invalid_header; break; } break; case GST_MATROSKA_READ_STATE_SEGMENT: switch (id) { case GST_MATROSKA_ID_SEGMENT: /* eat segment prefix */ GST_READ_CHECK (gst_matroska_parse_take (parse, needed, &ebml)); GST_DEBUG_OBJECT (parse, "Found Segment start at offset %" G_GUINT64_FORMAT, parse->common.offset); /* seeks are from the beginning of the segment, * after the segment ID/length */ parse->common.ebml_segment_start = parse->common.offset; parse->common.state = GST_MATROSKA_READ_STATE_HEADER; gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; default: GST_WARNING_OBJECT (parse, "Expected a Segment ID (0x%x), but received 0x%x!", GST_MATROSKA_ID_SEGMENT, id); GST_READ_CHECK (gst_matroska_parse_take (parse, needed, &ebml)); gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; } break; case GST_MATROSKA_READ_STATE_SCANNING: if (id != GST_MATROSKA_ID_CLUSTER && id != GST_MATROSKA_ID_CLUSTERTIMECODE) goto skip; /* fall-through */ case GST_MATROSKA_READ_STATE_HEADER: case GST_MATROSKA_READ_STATE_DATA: case GST_MATROSKA_READ_STATE_SEEK: switch (id) { case GST_MATROSKA_ID_SEGMENTINFO: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); if (!parse->common.segmentinfo_parsed) { ret = gst_matroska_read_common_parse_info (&parse->common, GST_ELEMENT_CAST (parse), &ebml); } gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; case GST_MATROSKA_ID_TRACKS: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); if (!parse->tracks_parsed) { ret = gst_matroska_parse_parse_tracks (parse, &ebml); } gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; case GST_MATROSKA_ID_CLUSTER: if (G_UNLIKELY (!parse->tracks_parsed)) { GST_DEBUG_OBJECT (parse, "Cluster before Track"); goto not_streamable; } if (G_UNLIKELY (parse->common.state == GST_MATROSKA_READ_STATE_HEADER)) { parse->common.state = GST_MATROSKA_READ_STATE_DATA; parse->first_cluster_offset = parse->common.offset; GST_DEBUG_OBJECT (parse, "signaling no more pads"); } parse->cluster_time = GST_CLOCK_TIME_NONE; parse->cluster_offset = parse->common.offset; if (G_UNLIKELY (!parse->seek_first && parse->seek_block)) { GST_DEBUG_OBJECT (parse, "seek target block %" G_GUINT64_FORMAT " not found in Cluster, trying next Cluster's first block instead", parse->seek_block); parse->seek_block = 0; } parse->seek_first = FALSE; /* record next cluster for recovery */ if (read != G_MAXUINT64) parse->next_cluster_offset = parse->cluster_offset + read; /* eat cluster prefix */ GST_READ_CHECK (gst_matroska_parse_take (parse, needed, &ebml)); ret = gst_matroska_parse_output (parse, ebml.buf, TRUE); //gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; case GST_MATROSKA_ID_CLUSTERTIMECODE: { guint64 num; GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); if ((ret = gst_ebml_read_uint (&ebml, &id, &num)) != GST_FLOW_OK) goto parse_failed; GST_DEBUG_OBJECT (parse, "ClusterTimeCode: %" G_GUINT64_FORMAT, num); parse->cluster_time = num; if (parse->common.element_index) { if (parse->common.element_index_writer_id == -1) gst_index_get_writer_id (parse->common.element_index, GST_OBJECT (parse), &parse->common.element_index_writer_id); GST_LOG_OBJECT (parse, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT " for writer id %d", GST_TIME_ARGS (parse->cluster_time), parse->cluster_offset, parse->common.element_index_writer_id); gst_index_add_association (parse->common.element_index, parse->common.element_index_writer_id, GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, parse->cluster_time, GST_FORMAT_BYTES, parse->cluster_offset, NULL); } gst_matroska_parse_output (parse, ebml.buf, FALSE); break; } case GST_MATROSKA_ID_BLOCKGROUP: if (!gst_matroska_parse_seek_block (parse)) goto skip; GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); DEBUG_ELEMENT_START (parse, &ebml, "BlockGroup"); if ((ret = gst_ebml_read_master (&ebml, &id)) == GST_FLOW_OK) { ret = gst_matroska_parse_parse_blockgroup_or_simpleblock (parse, &ebml, parse->cluster_time, parse->cluster_offset, FALSE); } DEBUG_ELEMENT_STOP (parse, &ebml, "BlockGroup", ret); gst_matroska_parse_output (parse, ebml.buf, FALSE); break; case GST_MATROSKA_ID_SIMPLEBLOCK: if (!gst_matroska_parse_seek_block (parse)) goto skip; GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); DEBUG_ELEMENT_START (parse, &ebml, "SimpleBlock"); ret = gst_matroska_parse_parse_blockgroup_or_simpleblock (parse, &ebml, parse->cluster_time, parse->cluster_offset, TRUE); DEBUG_ELEMENT_STOP (parse, &ebml, "SimpleBlock", ret); gst_matroska_parse_output (parse, ebml.buf, FALSE); break; case GST_MATROSKA_ID_ATTACHMENTS: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); if (!parse->common.attachments_parsed) { ret = gst_matroska_read_common_parse_attachments (&parse->common, GST_ELEMENT_CAST (parse), &ebml); } gst_matroska_parse_output (parse, ebml.buf, FALSE); break; case GST_MATROSKA_ID_TAGS: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); ret = gst_matroska_read_common_parse_metadata (&parse->common, GST_ELEMENT_CAST (parse), &ebml); gst_matroska_parse_accumulate_streamheader (parse, ebml.buf); break; case GST_MATROSKA_ID_CHAPTERS: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); ret = gst_matroska_read_common_parse_chapters (&parse->common, &ebml); gst_matroska_parse_output (parse, ebml.buf, FALSE); break; case GST_MATROSKA_ID_SEEKHEAD: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); ret = gst_matroska_parse_parse_contents (parse, &ebml); gst_matroska_parse_output (parse, ebml.buf, FALSE); break; case GST_MATROSKA_ID_CUES: GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); if (!parse->common.index_parsed) { ret = gst_matroska_read_common_parse_index (&parse->common, &ebml); /* only push based; delayed index building */ if (ret == GST_FLOW_OK && parse->common.state == GST_MATROSKA_READ_STATE_SEEK) { GstEvent *event; GST_OBJECT_LOCK (parse); event = parse->seek_event; parse->seek_event = NULL; GST_OBJECT_UNLOCK (parse); g_assert (event); /* unlikely to fail, since we managed to seek to this point */ if (!gst_matroska_parse_handle_seek_event (parse, NULL, event)) goto seek_failed; /* resume data handling, main thread clear to seek again */ GST_OBJECT_LOCK (parse); parse->common.state = GST_MATROSKA_READ_STATE_DATA; GST_OBJECT_UNLOCK (parse); } } gst_matroska_parse_output (parse, ebml.buf, FALSE); break; case GST_MATROSKA_ID_POSITION: case GST_MATROSKA_ID_PREVSIZE: case GST_MATROSKA_ID_ENCRYPTEDBLOCK: case GST_MATROSKA_ID_SILENTTRACKS: GST_DEBUG_OBJECT (parse, "Skipping Cluster subelement 0x%x - ignoring", id); /* fall-through */ default: skip: GST_DEBUG_OBJECT (parse, "skipping Element 0x%x", id); GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml)); gst_matroska_parse_output (parse, ebml.buf, FALSE); break; } break; } if (ret == GST_FLOW_PARSE) goto parse_failed; exit: gst_ebml_read_clear (&ebml); return ret; /* ERRORS */ read_error: { /* simply exit, maybe not enough data yet */ /* no ebml to clear if read error */ return ret; } parse_failed: { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("Failed to parse Element 0x%x", id)); ret = GST_FLOW_ERROR; goto exit; } not_streamable: { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("File layout does not permit streaming")); ret = GST_FLOW_ERROR; goto exit; } #if 0 no_tracks: { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("No Tracks element found")); ret = GST_FLOW_ERROR; goto exit; } #endif invalid_header: { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("Invalid header")); ret = GST_FLOW_ERROR; goto exit; } seek_failed: { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("Failed to seek")); ret = GST_FLOW_ERROR; goto exit; } } #if 0 static void gst_matroska_parse_loop (GstPad * pad) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (GST_PAD_PARENT (pad)); GstFlowReturn ret; guint32 id; guint64 length; guint needed; /* If we have to close a segment, send a new segment to do this now */ if (G_LIKELY (parse->common.state == GST_MATROSKA_READ_STATE_DATA)) { if (G_UNLIKELY (parse->close_segment)) { gst_matroska_parse_send_event (parse, parse->close_segment); parse->close_segment = NULL; } if (G_UNLIKELY (parse->new_segment)) { gst_matroska_parse_send_event (parse, parse->new_segment); parse->new_segment = NULL; } } ret = gst_matroska_read_common_peek_id_length_pull (&parse->common, GST_ELEMENT_CAST (parse), &id, &length, &needed); if (ret == GST_FLOW_UNEXPECTED) goto eos; if (ret != GST_FLOW_OK) { if (gst_matroska_parse_check_parse_error (parse)) goto pause; else return; } GST_LOG_OBJECT (parse, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " "size %" G_GUINT64_FORMAT ", needed %d", parse->offset, id, length, needed); ret = gst_matroska_parse_parse_id (parse, id, length, needed); if (ret == GST_FLOW_UNEXPECTED) goto eos; if (ret != GST_FLOW_OK) goto pause; /* check if we're at the end of a configured segment */ if (G_LIKELY (parse->src->len)) { guint i; g_assert (parse->num_streams == parse->src->len); for (i = 0; i < parse->src->len; i++) { GstMatroskaTrackContext *context = g_ptr_array_index (parse->src, i); GST_DEBUG_OBJECT (context->pad, "pos %" GST_TIME_FORMAT, GST_TIME_ARGS (context->pos)); if (context->eos == FALSE) goto next; } GST_INFO_OBJECT (parse, "All streams are EOS"); ret = GST_FLOW_UNEXPECTED; goto eos; } next: if (G_UNLIKELY (parse->offset == gst_matroska_read_common_get_length (&parse->common))) { GST_LOG_OBJECT (parse, "Reached end of stream"); ret = GST_FLOW_UNEXPECTED; goto eos; } return; /* ERRORS */ eos: { if (parse->segment.rate < 0.0) { ret = gst_matroska_parse_seek_to_previous_keyframe (parse); if (ret == GST_FLOW_OK) return; } /* fall-through */ } pause: { const gchar *reason = gst_flow_get_name (ret); gboolean push_eos = FALSE; GST_LOG_OBJECT (parse, "pausing task, reason %s", reason); parse->segment_running = FALSE; gst_pad_pause_task (parse->common.sinkpad); if (ret == GST_FLOW_UNEXPECTED) { /* perform EOS logic */ /* Close the segment, i.e. update segment stop with the duration * if no stop was set */ if (GST_CLOCK_TIME_IS_VALID (parse->last_stop_end) && !GST_CLOCK_TIME_IS_VALID (parse->segment.stop)) { GstEvent *event = gst_event_new_new_segment_full (TRUE, parse->segment.rate, parse->segment.applied_rate, parse->segment.format, parse->segment.start, MAX (parse->last_stop_end, parse->segment.start), parse->segment.time); gst_matroska_parse_send_event (parse, event); } if (parse->segment.flags & GST_SEEK_FLAG_SEGMENT) { gint64 stop; /* for segment playback we need to post when (in stream time) * we stopped, this is either stop (when set) or the duration. */ if ((stop = parse->segment.stop) == -1) stop = parse->last_stop_end; GST_LOG_OBJECT (parse, "Sending segment done, at end of segment"); gst_element_post_message (GST_ELEMENT (parse), gst_message_new_segment_done (GST_OBJECT (parse), GST_FORMAT_TIME, stop)); } else { push_eos = TRUE; } } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { /* for fatal errors we post an error message */ GST_ELEMENT_ERROR (parse, STREAM, FAILED, (NULL), ("stream stopped, reason %s", reason)); push_eos = TRUE; } if (push_eos) { /* send EOS, and prevent hanging if no streams yet */ GST_LOG_OBJECT (parse, "Sending EOS, at end of stream"); if (!gst_matroska_parse_send_event (parse, gst_event_new_eos ()) && (ret == GST_FLOW_UNEXPECTED)) { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("got eos but no streams (yet)")); } } return; } } #endif /* * Create and push a flushing seek event upstream */ static gboolean perform_seek_to_offset (GstMatroskaParse * parse, guint64 offset) { GstEvent *event; gboolean res = 0; GST_DEBUG_OBJECT (parse, "Seeking to %" G_GUINT64_FORMAT, offset); event = gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, -1); res = gst_pad_push_event (parse->common.sinkpad, event); /* newsegment event will update offset */ return res; } static GstFlowReturn gst_matroska_parse_chain (GstPad * pad, GstBuffer * buffer) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (GST_PAD_PARENT (pad)); guint available; GstFlowReturn ret = GST_FLOW_OK; guint needed = 0; guint32 id; guint64 length; if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buffer))) { GST_DEBUG_OBJECT (parse, "got DISCONT"); gst_adapter_clear (parse->common.adapter); GST_OBJECT_LOCK (parse); gst_matroska_read_common_reset_streams (&parse->common, GST_CLOCK_TIME_NONE, FALSE); GST_OBJECT_UNLOCK (parse); } gst_adapter_push (parse->common.adapter, buffer); buffer = NULL; next: available = gst_adapter_available (parse->common.adapter); ret = gst_matroska_read_common_peek_id_length_push (&parse->common, GST_ELEMENT_CAST (parse), &id, &length, &needed); if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)) return ret; GST_LOG_OBJECT (parse, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, " "size %" G_GUINT64_FORMAT ", needed %d, available %d", parse->common.offset, id, length, needed, available); if (needed > available) return GST_FLOW_OK; ret = gst_matroska_parse_parse_id (parse, id, length, needed); if (ret == GST_FLOW_UNEXPECTED) { /* need more data */ return GST_FLOW_OK; } else if (ret != GST_FLOW_OK) { return ret; } else goto next; } static gboolean gst_matroska_parse_handle_sink_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstMatroskaParse *parse = GST_MATROSKA_PARSE (GST_PAD_PARENT (pad)); GST_DEBUG_OBJECT (parse, "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time = 0; gboolean update; GstSegment segment; /* some debug output */ gst_segment_init (&segment, GST_FORMAT_UNDEFINED); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); gst_segment_set_newsegment_full (&segment, update, rate, arate, format, start, stop, time); GST_DEBUG_OBJECT (parse, "received format %d newsegment %" GST_SEGMENT_FORMAT, format, &segment); if (parse->common.state < GST_MATROSKA_READ_STATE_DATA) { GST_DEBUG_OBJECT (parse, "still starting"); goto exit; } /* we only expect a BYTE segment, e.g. following a seek */ if (format != GST_FORMAT_BYTES) { GST_DEBUG_OBJECT (parse, "unsupported segment format, ignoring"); goto exit; } GST_DEBUG_OBJECT (parse, "clearing segment state"); /* clear current segment leftover */ gst_adapter_clear (parse->common.adapter); /* and some streaming setup */ parse->common.offset = start; /* do not know where we are; * need to come across a cluster and generate newsegment */ parse->common.segment.last_stop = GST_CLOCK_TIME_NONE; parse->cluster_time = GST_CLOCK_TIME_NONE; parse->cluster_offset = 0; parse->need_newsegment = TRUE; /* but keep some of the upstream segment */ parse->common.segment.rate = rate; exit: /* chain will send initial newsegment after pads have been added, * or otherwise come up with one */ GST_DEBUG_OBJECT (parse, "eating event"); gst_event_unref (event); res = TRUE; break; } case GST_EVENT_EOS: { if (parse->common.state != GST_MATROSKA_READ_STATE_DATA) { gst_event_unref (event); GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("got eos and didn't receive a complete header object")); } else if (parse->common.num_streams == 0) { GST_ELEMENT_ERROR (parse, STREAM, DEMUX, (NULL), ("got eos but no streams (yet)")); } else { gst_matroska_parse_send_event (parse, event); } break; } case GST_EVENT_FLUSH_STOP: { gst_adapter_clear (parse->common.adapter); GST_OBJECT_LOCK (parse); gst_matroska_read_common_reset_streams (&parse->common, GST_CLOCK_TIME_NONE, TRUE); GST_OBJECT_UNLOCK (parse); parse->common.segment.last_stop = GST_CLOCK_TIME_NONE; parse->cluster_time = GST_CLOCK_TIME_NONE; parse->cluster_offset = 0; /* fall-through */ } default: res = gst_pad_event_default (pad, event); break; } return res; } static void gst_matroska_parse_set_index (GstElement * element, GstIndex * index) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); GST_OBJECT_LOCK (parse); if (parse->common.element_index) gst_object_unref (parse->common.element_index); parse->common.element_index = index ? gst_object_ref (index) : NULL; GST_OBJECT_UNLOCK (parse); GST_DEBUG_OBJECT (parse, "Set index %" GST_PTR_FORMAT, parse->common.element_index); } static GstIndex * gst_matroska_parse_get_index (GstElement * element) { GstIndex *result = NULL; GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); GST_OBJECT_LOCK (parse); if (parse->common.element_index) result = gst_object_ref (parse->common.element_index); GST_OBJECT_UNLOCK (parse); GST_DEBUG_OBJECT (parse, "Returning index %" GST_PTR_FORMAT, result); return result; } static GstStateChangeReturn gst_matroska_parse_change_state (GstElement * element, GstStateChange transition) { GstMatroskaParse *parse = GST_MATROSKA_PARSE (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; /* handle upwards state changes here */ switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); /* handle downwards state changes */ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_matroska_parse_reset (GST_ELEMENT (parse)); break; default: break; } return ret; } gboolean gst_matroska_parse_plugin_init (GstPlugin * plugin) { gst_riff_init (); /* create an elementfactory for the matroska_parse element */ if (!gst_element_register (plugin, "matroskaparse", GST_RANK_NONE, GST_TYPE_MATROSKA_PARSE)) return FALSE; return TRUE; } gst-plugins-good-0.10.31/gst/matroska/matroska-demux.h0000644000175000017500000000671311677341655017555 00000000000000/* GStreamer Matroska muxer/demuxer * (c) 2003 Ronald Bultje * (c) 2011 Debarshi Ray * * matroska-demux.h: matroska file/stream demuxer definition * * 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_MATROSKA_DEMUX_H__ #define __GST_MATROSKA_DEMUX_H__ #include #include "ebml-read.h" #include "matroska-ids.h" #include "matroska-read-common.h" G_BEGIN_DECLS #define GST_TYPE_MATROSKA_DEMUX \ (gst_matroska_demux_get_type ()) #define GST_MATROSKA_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemux)) #define GST_MATROSKA_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemuxClass)) #define GST_IS_MATROSKA_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_DEMUX)) #define GST_IS_MATROSKA_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_DEMUX)) typedef struct _GstMatroskaDemux { GstElement parent; /* < private > */ GstMatroskaReadCommon common; /* pads */ GstClock *clock; guint num_v_streams; guint num_a_streams; guint num_t_streams; /* state */ gboolean streaming; guint level_up; guint64 seek_block; gboolean seek_first; /* did we parse cues/tracks/segmentinfo already? */ gboolean tracks_parsed; GList *seek_parsed; /* cluster positions (optional) */ GArray *clusters; /* keeping track of playback position */ gboolean segment_running; GstClockTime last_stop_end; GstClockTime stream_start_time; GstEvent *close_segment; GstEvent *new_segment; /* some state saving */ GstClockTime cluster_time; guint64 cluster_offset; guint64 first_cluster_offset; guint64 next_cluster_offset; /* index stuff */ gboolean seekable; gboolean building_index; guint64 index_offset; GstEvent *seek_event; gboolean need_newsegment; /* reverse playback */ GArray *seek_index; gint seek_entry; /* gap handling */ guint64 max_gap_time; /* for non-finalized files, with invalid segment duration */ gboolean invalid_duration; } GstMatroskaDemux; typedef struct _GstMatroskaDemuxClass { GstElementClass parent; } GstMatroskaDemuxClass; gboolean gst_matroska_demux_plugin_init (GstPlugin *plugin); G_END_DECLS #endif /* __GST_MATROSKA_DEMUX_H__ */ gst-plugins-good-0.10.31/gst/cutter/0000755000175000017500000000000011720565301014162 500000000000000gst-plugins-good-0.10.31/gst/cutter/Makefile.am0000644000175000017500000000165011671175353016151 00000000000000plugin_LTLIBRARIES = libgstcutter.la libgstcutter_la_SOURCES = gstcutter.c libgstcutter_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstcutter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LIBM) libgstcutter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcutter_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstcutter.h filter.func EXTRA_DIST = README Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstcutter -:SHARED libgstcutter \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstcutter_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstcutter_la_CFLAGS) \ -:LDFLAGS $(libgstcutter_la_LDFLAGS) \ $(libgstcutter_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/cutter/gstcutter.h0000644000175000017500000000511011671175353016305 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_CUTTER_H__ #define __GST_CUTTER_H__ #include /* #include */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define GST_TYPE_CUTTER \ (gst_cutter_get_type()) #define GST_CUTTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUTTER,GstCutter)) #define GST_CUTTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CUTTER,GstCutterClass)) #define GST_IS_CUTTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUTTER)) #define GST_IS_CUTTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CUTTER)) typedef struct _GstCutter GstCutter; typedef struct _GstCutterClass GstCutterClass; struct _GstCutter { GstElement element; GstPad *sinkpad, *srcpad; double threshold_level; /* level below which to cut */ double threshold_length; /* how long signal has to remain * below this level before cutting */ double silent_run_length; /* how long has it been below threshold ? */ gboolean silent; gboolean silent_prev; double pre_length; /* how long can the pre-record buffer be ? */ double pre_run_length; /* how long is it currently ? */ GList *pre_buffer; /* list of GstBuffers in pre-record buffer */ gboolean leaky; /* do we leak an overflowing prebuffer ? */ gboolean have_caps; /* did we get the needed caps yet ? */ gint width; /* bit width of data */ long max_sample; /* maximum sample value */ }; struct _GstCutterClass { GstElementClass parent_class; void (*cut_start) (GstCutter* filter); void (*cut_stop) (GstCutter* filter); }; GType gst_cutter_get_type (void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __GST_STEREO_H__ */ gst-plugins-good-0.10.31/gst/cutter/gstcutter.c0000644000175000017500000004011511705527502016277 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) 2002,2003,2005 * Thomas Vander Stichele * * 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-cutter * * Analyses the audio signal for periods of silence. The start and end of * silence is signalled by bus messages named * "cutter". * The message's structure contains two fields: * * * * #GstClockTime * "timestamp": * the timestamp of the buffer that triggered the message. * * * * * gboolean * "above": * %TRUE for begin of silence and %FALSE for end of silence. * * * * * * Example launch line * |[ * gst-launch -m filesrc location=foo.ogg ! decodebin ! audioconvert ! cutter ! autoaudiosink * ]| Show cut messages. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstcutter.h" #include "math.h" GST_DEBUG_CATEGORY_STATIC (cutter_debug); #define GST_CAT_DEFAULT cutter_debug #define CUTTER_DEFAULT_THRESHOLD_LEVEL 0.1 #define CUTTER_DEFAULT_THRESHOLD_LENGTH (500 * GST_MSECOND) #define CUTTER_DEFAULT_PRE_LENGTH (200 * GST_MSECOND) static GstStaticPadTemplate cutter_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) { 8, 16 }, " "depth = (int) { 8, 16 }, " "signed = (boolean) true") ); static GstStaticPadTemplate cutter_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ], " "endianness = (int) BYTE_ORDER, " "width = (int) { 8, 16 }, " "depth = (int) { 8, 16 }, " "signed = (boolean) true") ); enum { PROP_0, PROP_THRESHOLD, PROP_THRESHOLD_DB, PROP_RUN_LENGTH, PROP_PRE_LENGTH, PROP_LEAKY }; GST_BOILERPLATE (GstCutter, gst_cutter, GstElement, GST_TYPE_ELEMENT); static void gst_cutter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_cutter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_cutter_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_cutter_get_caps (GstPad * pad, GstCutter * filter); static void gst_cutter_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &cutter_src_factory); gst_element_class_add_static_pad_template (element_class, &cutter_sink_factory); gst_element_class_set_details_simple (element_class, "Audio cutter", "Filter/Editor/Audio", "Audio Cutter to split audio into non-silent bits", "Thomas Vander Stichele "); } static void gst_cutter_class_init (GstCutterClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->set_property = gst_cutter_set_property; gobject_class->get_property = gst_cutter_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_THRESHOLD, g_param_spec_double ("threshold", "Threshold", "Volume threshold before trigger", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_THRESHOLD_DB, g_param_spec_double ("threshold-dB", "Threshold (dB)", "Volume threshold before trigger (in dB)", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_RUN_LENGTH, g_param_spec_uint64 ("run-length", "Run length", "Length of drop below threshold before cut_stop (in nanoseconds)", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PRE_LENGTH, g_param_spec_uint64 ("pre-length", "Pre-recording buffer length", "Length of pre-recording buffer (in nanoseconds)", 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LEAKY, g_param_spec_boolean ("leaky", "Leaky", "do we leak buffers when below threshold ?", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (cutter_debug, "cutter", 0, "Audio cutting"); } static void gst_cutter_init (GstCutter * filter, GstCutterClass * g_class) { filter->sinkpad = gst_pad_new_from_static_template (&cutter_sink_factory, "sink"); filter->srcpad = gst_pad_new_from_static_template (&cutter_src_factory, "src"); filter->threshold_level = CUTTER_DEFAULT_THRESHOLD_LEVEL; filter->threshold_length = CUTTER_DEFAULT_THRESHOLD_LENGTH; filter->silent_run_length = 0 * GST_SECOND; filter->silent = TRUE; filter->silent_prev = FALSE; /* previous value of silent */ filter->pre_length = CUTTER_DEFAULT_PRE_LENGTH; filter->pre_run_length = 0 * GST_SECOND; filter->pre_buffer = NULL; filter->leaky = FALSE; gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_pad_set_chain_function (filter->sinkpad, gst_cutter_chain); gst_pad_use_fixed_caps (filter->sinkpad); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); gst_pad_use_fixed_caps (filter->srcpad); } static GstMessage * gst_cutter_message_new (GstCutter * c, gboolean above, GstClockTime timestamp) { GstStructure *s; s = gst_structure_new ("cutter", "above", G_TYPE_BOOLEAN, above, "timestamp", GST_TYPE_CLOCK_TIME, timestamp, NULL); return gst_message_new_element (GST_OBJECT (c), s); } /* Calculate the Normalized Cumulative Square over a buffer of the given type * and over all channels combined */ #define DEFINE_CUTTER_CALCULATOR(TYPE, RESOLUTION) \ static void inline \ gst_cutter_calculate_##TYPE (TYPE * in, guint num, \ double *NCS) \ { \ register int j; \ double squaresum = 0.0; /* square sum of the integer samples */ \ register double square = 0.0; /* Square */ \ gdouble normalizer; /* divisor to get a [-1.0, 1.0] range */ \ \ *NCS = 0.0; /* Normalized Cumulative Square */ \ \ normalizer = (double) (1 << (RESOLUTION * 2)); \ \ for (j = 0; j < num; j++) \ { \ square = ((double) in[j]) * in[j]; \ squaresum += square; \ } \ \ \ *NCS = squaresum / normalizer; \ } DEFINE_CUTTER_CALCULATOR (gint16, 15); DEFINE_CUTTER_CALCULATOR (gint8, 7); static GstFlowReturn gst_cutter_chain (GstPad * pad, GstBuffer * buf) { GstCutter *filter; gint16 *in_data; guint num_samples; gdouble NCS = 0.0; /* Normalized Cumulative Square of buffer */ gdouble RMS = 0.0; /* RMS of signal in buffer */ gdouble NMS = 0.0; /* Normalized Mean Square of buffer */ GstBuffer *prebuf; /* pointer to a prebuffer element */ g_return_val_if_fail (pad != NULL, GST_FLOW_ERROR); g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR); g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); filter = GST_CUTTER (GST_OBJECT_PARENT (pad)); g_return_val_if_fail (filter != NULL, GST_FLOW_ERROR); g_return_val_if_fail (GST_IS_CUTTER (filter), GST_FLOW_ERROR); if (!filter->have_caps) { if (!(gst_cutter_get_caps (pad, filter))) return GST_FLOW_NOT_NEGOTIATED; } in_data = (gint16 *) GST_BUFFER_DATA (buf); GST_LOG_OBJECT (filter, "length of prerec buffer: %" GST_TIME_FORMAT, GST_TIME_ARGS (filter->pre_run_length)); /* calculate mean square value on buffer */ switch (filter->width) { case 16: num_samples = GST_BUFFER_SIZE (buf) / 2; gst_cutter_calculate_gint16 (in_data, num_samples, &NCS); NMS = NCS / num_samples; break; case 8: num_samples = GST_BUFFER_SIZE (buf); gst_cutter_calculate_gint8 ((gint8 *) in_data, num_samples, &NCS); NMS = NCS / num_samples; break; default: /* this shouldn't happen */ g_warning ("no mean square function for width %d\n", filter->width); break; } filter->silent_prev = filter->silent; RMS = sqrt (NMS); /* if RMS below threshold, add buffer length to silent run length count * if not, reset */ GST_LOG_OBJECT (filter, "buffer stats: NMS %f, RMS %f, audio length %f", NMS, RMS, gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer (filter->sinkpad, buf))); if (RMS < filter->threshold_level) filter->silent_run_length += gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer (filter->sinkpad, buf)); else { filter->silent_run_length = 0 * GST_SECOND; filter->silent = FALSE; } if (filter->silent_run_length > filter->threshold_length) /* it has been silent long enough, flag it */ filter->silent = TRUE; /* has the silent status changed ? if so, send right signal * and, if from silent -> not silent, flush pre_record buffer */ if (filter->silent != filter->silent_prev) { if (filter->silent) { GstMessage *m = gst_cutter_message_new (filter, FALSE, GST_BUFFER_TIMESTAMP (buf)); GST_DEBUG_OBJECT (filter, "signaling CUT_STOP"); gst_element_post_message (GST_ELEMENT (filter), m); } else { gint count = 0; GstMessage *m = gst_cutter_message_new (filter, TRUE, GST_BUFFER_TIMESTAMP (buf)); GST_DEBUG_OBJECT (filter, "signaling CUT_START"); gst_element_post_message (GST_ELEMENT (filter), m); /* first of all, flush current buffer */ GST_DEBUG_OBJECT (filter, "flushing buffer of length %" GST_TIME_FORMAT, GST_TIME_ARGS (filter->pre_run_length)); while (filter->pre_buffer) { prebuf = (g_list_first (filter->pre_buffer))->data; filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); gst_pad_push (filter->srcpad, prebuf); ++count; } GST_DEBUG_OBJECT (filter, "flushed %d buffers", count); filter->pre_run_length = 0 * GST_SECOND; } } /* now check if we have to send the new buffer to the internal buffer cache * or to the srcpad */ if (filter->silent) { filter->pre_buffer = g_list_append (filter->pre_buffer, buf); filter->pre_run_length += gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer (filter->sinkpad, buf)); while (filter->pre_run_length > filter->pre_length) { prebuf = (g_list_first (filter->pre_buffer))->data; g_assert (GST_IS_BUFFER (prebuf)); filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); filter->pre_run_length -= gst_guint64_to_gdouble (gst_audio_duration_from_pad_buffer (filter->sinkpad, prebuf)); /* only pass buffers if we don't leak */ if (!filter->leaky) gst_pad_push (filter->srcpad, prebuf); else gst_buffer_unref (prebuf); } } else gst_pad_push (filter->srcpad, buf); return GST_FLOW_OK; } static gboolean gst_cutter_get_caps (GstPad * pad, GstCutter * filter) { GstCaps *caps; GstStructure *structure; caps = gst_pad_get_caps (pad); if (!caps) { GST_INFO ("no caps on pad %s:%s", GST_DEBUG_PAD_NAME (pad)); return FALSE; } structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &filter->width); filter->max_sample = 1 << (filter->width - 1); /* signed */ filter->have_caps = TRUE; gst_caps_unref (caps); return TRUE; } static void gst_cutter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstCutter *filter; g_return_if_fail (GST_IS_CUTTER (object)); filter = GST_CUTTER (object); switch (prop_id) { case PROP_THRESHOLD: filter->threshold_level = g_value_get_double (value); GST_DEBUG ("DEBUG: set threshold level to %f", filter->threshold_level); break; case PROP_THRESHOLD_DB: /* set the level given in dB * value in dB = 20 * log (value) * values in dB < 0 result in values between 0 and 1 */ filter->threshold_level = pow (10, g_value_get_double (value) / 20); GST_DEBUG_OBJECT (filter, "set threshold level to %f", filter->threshold_level); break; case PROP_RUN_LENGTH: /* set the minimum length of the silent run required */ filter->threshold_length = gst_guint64_to_gdouble (g_value_get_uint64 (value)); break; case PROP_PRE_LENGTH: /* set the length of the pre-record block */ filter->pre_length = gst_guint64_to_gdouble (g_value_get_uint64 (value)); break; case PROP_LEAKY: /* set if the pre-record buffer is leaky or not */ filter->leaky = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_cutter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstCutter *filter; g_return_if_fail (GST_IS_CUTTER (object)); filter = GST_CUTTER (object); switch (prop_id) { case PROP_RUN_LENGTH: g_value_set_uint64 (value, filter->threshold_length); break; case PROP_THRESHOLD: g_value_set_double (value, filter->threshold_level); break; case PROP_THRESHOLD_DB: g_value_set_double (value, 20 * log (filter->threshold_level)); break; case PROP_PRE_LENGTH: g_value_set_uint64 (value, filter->pre_length); break; case PROP_LEAKY: g_value_set_boolean (value, filter->leaky); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "cutter", GST_RANK_NONE, GST_TYPE_CUTTER)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "cutter", "Audio Cutter to split audio into non-silent bits", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/cutter/README0000644000175000017500000000302011671175353014766 00000000000000cutter plugin by thomas SYNOPSIS This plugin emits signals when RMS level of audio signal crosses a threshold for a given amount of time. As soon as the buffer's RMS is greater than the threshold value, the plugin fires a CUT_START signal. When the buffer's RMS level drops below the threshold value for a consecutive run length longer than the given runlength, it sends a CUT_STOP signal. When a pre-recording buffer is used, the plugin will delay throughput of data when it's in "silent" mode for a maximum length equal to the pre-recording buffer length. As soon as the input level crosses the threshold level, this pre-recorded buffer is flushed to the src pad (so you can actually record the audio just before the threshold crossing) after sending the signal. ARGUMENTS GstCutter::threshold level (between 0 and 1) of threshold GstCutter::threshold_dB level of threshold in dB (between -inf and 0) GstCutter::runlength minimum length (in seconds) before plugin sends cut_stop signal GstCutter::prelength length of pre-recording buffer SIGNALS CUT_START gets sent when the level of the signal goes above threshold level CUT_STOP gets sent when the level of the signal has been below the threshold level for a number of consecutive iterations of which the cumulative length is more than the runlength LIMITATIONS * RMS value is calculated over the whole data buffer, so the time resolution is limited to the buffer length * RMS value is calculated over all of the channels combined gst-plugins-good-0.10.31/gst/cutter/filter.func0000644000175000017500000000050611671175353016256 00000000000000{ guint j; register double squaresum = 0.0; /* * process data here * input sample data enters in *in_data as 8 or 16 bit data * samples for left and right channel are interleaved */ for (j = 0; j < num_samples; j++) squaresum += data[j] * data[j]; return (squaresum / (float) num_samples); } gst-plugins-good-0.10.31/gst/cutter/Makefile.in0000644000175000017500000006642311720560231016157 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/cutter DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstcutter_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstcutter_la_OBJECTS = libgstcutter_la-gstcutter.lo libgstcutter_la_OBJECTS = $(am_libgstcutter_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstcutter_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstcutter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstcutter_la_CFLAGS) $(CFLAGS) \ $(libgstcutter_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstcutter_la_SOURCES) DIST_SOURCES = $(libgstcutter_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstcutter.la libgstcutter_la_SOURCES = gstcutter.c libgstcutter_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstcutter_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(LIBM) libgstcutter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstcutter_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstcutter.h filter.func EXTRA_DIST = README all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/cutter/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/cutter/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstcutter.la: $(libgstcutter_la_OBJECTS) $(libgstcutter_la_DEPENDENCIES) $(EXTRA_libgstcutter_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstcutter_la_LINK) -rpath $(plugindir) $(libgstcutter_la_OBJECTS) $(libgstcutter_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcutter_la-gstcutter.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstcutter_la-gstcutter.lo: gstcutter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcutter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcutter_la_CFLAGS) $(CFLAGS) -MT libgstcutter_la-gstcutter.lo -MD -MP -MF $(DEPDIR)/libgstcutter_la-gstcutter.Tpo -c -o libgstcutter_la-gstcutter.lo `test -f 'gstcutter.c' || echo '$(srcdir)/'`gstcutter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcutter_la-gstcutter.Tpo $(DEPDIR)/libgstcutter_la-gstcutter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcutter.c' object='libgstcutter_la-gstcutter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcutter_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcutter_la_CFLAGS) $(CFLAGS) -c -o libgstcutter_la-gstcutter.lo `test -f 'gstcutter.c' || echo '$(srcdir)/'`gstcutter.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstcutter -:SHARED libgstcutter \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstcutter_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstcutter_la_CFLAGS) \ -:LDFLAGS $(libgstcutter_la_LDFLAGS) \ $(libgstcutter_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/debugutils/0000755000175000017500000000000011720565301015023 500000000000000gst-plugins-good-0.10.31/gst/debugutils/gstnavseek.h0000644000175000017500000000337711671175353017311 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_NAVSEEK_H__ #define __GST_NAVSEEK_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_NAVSEEK \ (gst_navseek_get_type()) #define GST_NAVSEEK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NAVSEEK,GstNavSeek)) #define GST_NAVSEEK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NAVSEEK,GstNavSeekClass)) #define GST_IS_NAVSEEK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NAVSEEK)) #define GST_IS_NAVSEEK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NAVSEEK)) typedef struct _GstNavSeek GstNavSeek; typedef struct _GstNavSeekClass GstNavSeekClass; struct _GstNavSeek { GstBaseTransform basetransform; gdouble seek_offset; gboolean loop; gboolean grab_seg_start; gboolean grab_seg_end; GstClockTime segment_start; GstClockTime segment_end; }; struct _GstNavSeekClass { GstBaseTransformClass parent_class; }; G_END_DECLS #endif /* __GST_NAVSEEK_H__ */ gst-plugins-good-0.10.31/gst/debugutils/testplugin.c0000644000175000017500000002027411677341655017331 00000000000000/* GStreamer * Copyright (C) 2004 Benjamin Otte * * 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 #include #include "tests.h" GST_DEBUG_CATEGORY_STATIC (gst_test_debug); #define GST_CAT_DEFAULT gst_test_debug /* This plugin does all the tests registered in the tests.h file */ #define GST_TYPE_TEST \ (gst_test_get_type()) #define GST_TEST(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEST,GstTest)) #define GST_TEST_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEST,GstTestClass)) #define GST_TEST_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_TEST,GstTestClass)) #define GST_IS_TEST(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEST)) #define GST_IS_TEST_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEST)) typedef struct _GstTest GstTest; typedef struct _GstTestClass GstTestClass; struct _GstTest { GstBaseSink basesink; gpointer tests[TESTS_COUNT]; GValue values[TESTS_COUNT]; }; struct _GstTestClass { GstBaseSinkClass parent_class; gchar *param_names[2 * TESTS_COUNT]; }; static void gst_test_finalize (GstTest * test); static gboolean gst_test_start (GstBaseSink * trans); static gboolean gst_test_stop (GstBaseSink * trans); static gboolean gst_test_sink_event (GstBaseSink * basesink, GstEvent * event); static GstFlowReturn gst_test_render_buffer (GstBaseSink * basesink, GstBuffer * buf); static void gst_test_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_test_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_test_debug, "testsink", 0, \ "debugging category for testsink element"); GType gst_test_get_type (void); GST_BOILERPLATE_FULL (GstTest, gst_test, GstBaseSink, GST_TYPE_BASE_SINK, DEBUG_INIT); static void gst_test_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); gst_element_class_set_details_simple (gstelement_class, "Test plugin", "Testing", "perform a number of tests", "Benjamin Otte "); } static void gst_test_class_init (GstTestClass * klass) { GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); guint i; object_class->set_property = gst_test_set_property; object_class->get_property = gst_test_get_property; object_class->finalize = (GObjectFinalizeFunc) gst_test_finalize; for (i = 0; i < TESTS_COUNT; i++) { GParamSpec *spec; spec = tests[i].get_spec (&tests[i], FALSE); klass->param_names[2 * i] = g_strdup (g_param_spec_get_name (spec)); g_object_class_install_property (object_class, 2 * i + 1, spec); spec = tests[i].get_spec (&tests[i], TRUE); klass->param_names[2 * i + 1] = g_strdup (g_param_spec_get_name (spec)); g_object_class_install_property (object_class, 2 * i + 2, spec); } basesink_class->render = GST_DEBUG_FUNCPTR (gst_test_render_buffer); basesink_class->event = GST_DEBUG_FUNCPTR (gst_test_sink_event); basesink_class->start = GST_DEBUG_FUNCPTR (gst_test_start); basesink_class->stop = GST_DEBUG_FUNCPTR (gst_test_stop); } static void gst_test_init (GstTest * test, GstTestClass * g_class) { GstTestClass *klass; guint i; klass = GST_TEST_GET_CLASS (test); for (i = 0; i < TESTS_COUNT; i++) { GParamSpec *spec = g_object_class_find_property (G_OBJECT_CLASS (klass), klass->param_names[2 * i + 1]); g_value_init (&test->values[i], G_PARAM_SPEC_VALUE_TYPE (spec)); } } static void gst_test_finalize (GstTest * test) { guint i; for (i = 0; i < TESTS_COUNT; i++) { g_value_unset (&test->values[i]); } G_OBJECT_CLASS (parent_class)->finalize ((GObject *) test); } static void tests_unset (GstTest * test) { guint i; for (i = 0; i < TESTS_COUNT; i++) { if (test->tests[i]) { tests[i].free (test->tests[i]); test->tests[i] = NULL; } } } static void tests_set (GstTest * test) { guint i; for (i = 0; i < TESTS_COUNT; i++) { g_assert (test->tests[i] == NULL); test->tests[i] = tests[i].new (&tests[i]); } } static gboolean gst_test_sink_event (GstBaseSink * basesink, GstEvent * event) { GstTestClass *klass = GST_TEST_GET_CLASS (basesink); GstTest *test = GST_TEST (basesink); gboolean ret = FALSE; switch (GST_EVENT_TYPE (event)) { /* case GST_EVENT_NEWSEGMENT: if (GST_EVENT_DISCONT_NEW_MEDIA (event)) { tests_unset (test); tests_set (test); } break; */ case GST_EVENT_EOS:{ gint i; g_object_freeze_notify (G_OBJECT (test)); for (i = 0; i < TESTS_COUNT; i++) { if (test->tests[i]) { if (!tests[i].finish (test->tests[i], &test->values[i])) { GValue v = { 0, }; gchar *real, *expected; expected = gst_value_serialize (&test->values[i]); g_value_init (&v, G_VALUE_TYPE (&test->values[i])); g_object_get_property (G_OBJECT (test), klass->param_names[2 * i], &v); real = gst_value_serialize (&v); g_value_unset (&v); GST_ELEMENT_ERROR (test, STREAM, FORMAT, (NULL), ("test %s returned value \"%s\" and not expected value \"%s\"", klass->param_names[2 * i], real, expected)); g_free (real); g_free (expected); } g_object_notify (G_OBJECT (test), klass->param_names[2 * i]); } } g_object_thaw_notify (G_OBJECT (test)); ret = TRUE; break; } default: break; } return ret; } static GstFlowReturn gst_test_render_buffer (GstBaseSink * basesink, GstBuffer * buf) { GstTest *test = GST_TEST (basesink); guint i; for (i = 0; i < TESTS_COUNT; i++) { if (test->tests[i]) { tests[i].add (test->tests[i], buf); } } return GST_FLOW_OK; } static gboolean gst_test_start (GstBaseSink * sink) { GstTest *test = GST_TEST (sink); tests_set (test); return TRUE; } static gboolean gst_test_stop (GstBaseSink * sink) { GstTest *test = GST_TEST (sink); tests_unset (test); return TRUE; } static void gst_test_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstTest *test = GST_TEST (object); if (prop_id == 0 || prop_id > 2 * TESTS_COUNT) { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); return; } if (prop_id % 2) { /* real values can't be set */ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } else { /* expected values */ GST_OBJECT_LOCK (test); g_value_copy (value, &test->values[prop_id / 2 - 1]); GST_OBJECT_UNLOCK (test); } } static void gst_test_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstTest *test = GST_TEST (object); guint id = (prop_id - 1) / 2; if (prop_id == 0 || prop_id > 2 * TESTS_COUNT) { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); return; } GST_OBJECT_LOCK (test); if (prop_id % 2) { /* real values */ tests[id].get_value (test->tests[id], value); } else { /* expected values */ g_value_copy (&test->values[id], value); } GST_OBJECT_UNLOCK (test); } gst-plugins-good-0.10.31/gst/debugutils/gstpushfilesrc.h0000644000175000017500000000342311671175353020174 00000000000000/* GStreamer Push File Source * Copyright (C) <2007> Tim-Philipp Müller * * 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_PUSH_FILE_SRC_H__ #define __GST_PUSH_FILE_SRC_H__ #include G_BEGIN_DECLS #define GST_TYPE_PUSH_FILE_SRC \ (gst_push_file_src_get_type()) #define GST_PUSH_FILE_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PUSH_FILE_SRC,GstPushFileSrc)) #define GST_PUSH_FILE_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PUSH_FILE_SRC,GstPushFileSrcClass)) #define GST_IS_PUSH_FILE_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PUSH_FILE_SRC)) #define GST_IS_PUSH_FILE_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PUSH_FILE_SRC)) typedef struct _GstPushFileSrc GstPushFileSrc; typedef struct _GstPushFileSrcClass GstPushFileSrcClass; struct _GstPushFileSrc { GstBin parent; /*< private > */ GstElement *filesrc; GstPad *srcpad; }; struct _GstPushFileSrcClass { GstBinClass parent_class; }; GType gst_push_file_src_get_type (void); G_END_DECLS #endif /* __GST_PUSH_FILE_SRC_H__ */ gst-plugins-good-0.10.31/gst/debugutils/gsttaginject.c0000644000175000017500000001365411677341655017625 00000000000000/* GStreamer * Copyright (C) 2008 Stefan Kost * * gsttaginject.c: * * 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-taginject * * Element that injects new metadata tags, but passes incomming data through * unmodified. * * * Example launch lines * |[ * gst-launch audiotestsrc num-buffers=100 ! taginject tags="title=testsrc,artist=gstreamer" ! vorbisenc ! oggmux ! filesink location=test.ogg * ]| set title and artist * |[ * gst-launch audiotestsrc num-buffers=100 ! taginject tags="keywords=\{\"testone\",\"audio\"\},title=\"audio testtone\"" ! vorbisenc ! oggmux ! filesink location=test.ogg * ]| set keywords and title demonstrating quoting of special chars and handling lists * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include "gsttaginject.h" static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GST_DEBUG_CATEGORY_STATIC (gst_tag_inject_debug); #define GST_CAT_DEFAULT gst_tag_inject_debug enum { PROP_TAGS = 1 }; #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_tag_inject_debug, "taginject", 0, "tag inject element"); GST_BOILERPLATE_FULL (GstTagInject, gst_tag_inject, GstBaseTransform, GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); static void gst_tag_inject_finalize (GObject * object); static void gst_tag_inject_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_tag_inject_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_tag_inject_transform_ip (GstBaseTransform * trans, GstBuffer * buf); static gboolean gst_tag_inject_start (GstBaseTransform * trans); static void gst_tag_inject_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (gstelement_class, "TagInject", "Generic", "inject metadata tags", "Stefan Kost "); gst_element_class_add_static_pad_template (gstelement_class, &srctemplate); gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); } static void gst_tag_inject_finalize (GObject * object) { GstTagInject *self = GST_TAG_INJECT (object); if (self->tags) { gst_tag_list_free (self->tags); self->tags = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_tag_inject_class_init (GstTagInjectClass * klass) { GObjectClass *gobject_class; GstBaseTransformClass *gstbasetrans_class; gobject_class = G_OBJECT_CLASS (klass); gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->set_property = gst_tag_inject_set_property; gobject_class->get_property = gst_tag_inject_get_property; g_object_class_install_property (gobject_class, PROP_TAGS, g_param_spec_string ("tags", "taglist", "List of tags to inject into the target file", NULL, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); gobject_class->finalize = gst_tag_inject_finalize; gstbasetrans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_tag_inject_transform_ip); gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_tag_inject_start); } static void gst_tag_inject_init (GstTagInject * self, GstTagInjectClass * g_class) { GstBaseTransform *trans = GST_BASE_TRANSFORM (self); gst_base_transform_set_gap_aware (trans, TRUE); self->tags = NULL; } static GstFlowReturn gst_tag_inject_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstTagInject *self = GST_TAG_INJECT (trans); if (G_UNLIKELY (!self->tags_sent)) { self->tags_sent = TRUE; /* send tags */ if (self->tags && !gst_tag_list_is_empty (self->tags)) { GST_DEBUG ("tag event :%" GST_PTR_FORMAT, self->tags); gst_element_found_tags (GST_ELEMENT (trans), gst_tag_list_copy (self->tags)); } } return GST_FLOW_OK; } static void gst_tag_inject_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstTagInject *self = GST_TAG_INJECT (object); switch (prop_id) { case PROP_TAGS:{ gchar *structure = g_strdup_printf ("taglist,%s", g_value_get_string (value)); if (!(self->tags = gst_structure_from_string (structure, NULL))) { GST_WARNING ("unparsable taglist = '%s'", structure); } /* make sure that tags will be send */ self->tags_sent = FALSE; g_free (structure); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_tag_inject_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { /*GstTagInject *self = GST_TAG_INJECT (object); */ switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_tag_inject_start (GstBaseTransform * trans) { GstTagInject *self = GST_TAG_INJECT (trans); /* we need to sent tags _transform_ip() once */ self->tags_sent = FALSE; return TRUE; } gst-plugins-good-0.10.31/gst/debugutils/gstnavigationtest.h0000644000175000017500000000367411671175353020714 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_NAVIGATIONTEST_H__ #define __GST_NAVIGATIONTEST_H__ #include G_BEGIN_DECLS #define GST_TYPE_NAVIGATIONTEST \ (gst_navigationtest_get_type()) #define GST_NAVIGATIONTEST(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NAVIGATIONTEST,GstNavigationtest)) #define GST_NAVIGATIONTEST_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NAVIGATIONTEST,GstNavigationtestClass)) #define GST_IS_NAVIGATIONTEST(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NAVIGATIONTEST)) #define GST_IS_NAVIGATIONTEST_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NAVIGATIONTEST)) typedef struct _GstNavigationtest GstNavigationtest; typedef struct _GstNavigationtestClass GstNavigationtestClass; typedef struct { gdouble x; gdouble y; gint images_left; guint8 cy, cu, cv; } ButtonClick; struct _GstNavigationtest { GstVideoFilter videofilter; gint width, height; GValue framerate; gdouble x, y; GSList *clicks; }; struct _GstNavigationtestClass { GstVideoFilterClass parent_class; }; GType gst_navigationtest_get_type (void); G_END_DECLS #endif /* __GST_NAVIGATIONTEST_H__ */ gst-plugins-good-0.10.31/gst/debugutils/gstcapsdebug.h0000644000175000017500000000324211671175353017601 00000000000000/* GStreamer * Copyright (C) 2010 FIXME * * 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_CAPS_DEBUG_H_ #define _GST_CAPS_DEBUG_H_ #include #include G_BEGIN_DECLS #define GST_TYPE_CAPS_DEBUG (gst_caps_debug_get_type()) #define GST_CAPS_DEBUG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAPS_DEBUG,GstCapsDebug)) #define GST_CAPS_DEBUG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAPS_DEBUG,GstCapsDebugClass)) #define GST_IS_CAPS_DEBUG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAPS_DEBUG)) #define GST_IS_CAPS_DEBUG_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAPS_DEBUG)) typedef struct _GstCapsDebug GstCapsDebug; typedef struct _GstCapsDebugClass GstCapsDebugClass; struct _GstCapsDebug { GstElement base_capsdebug; GstPad *srcpad; GstPad *sinkpad; }; struct _GstCapsDebugClass { GstElementClass base_capsdebug_class; }; GType gst_caps_debug_get_type (void); G_END_DECLS #endif gst-plugins-good-0.10.31/gst/debugutils/Makefile.am0000644000175000017500000000354311671175353017015 00000000000000if GST_HAVE_MMAP EFENCE_PLUGIN=libgstefence.la else EFENCE_PLUGIN= endif plugin_LTLIBRARIES = $(EFENCE_PLUGIN) libgstdebug.la libgstnavigationtest.la noinst_HEADERS = \ cpureport.h \ efence.h \ gstcapsdebug.h \ gstcapssetter.h \ gstnavigationtest.h \ gstnavseek.h \ gstpushfilesrc.h \ gsttaginject.h \ progressreport.h \ tests.h libgstefence_la_SOURCES = efence.c libgstefence_la_CFLAGS = $(GST_CFLAGS) libgstefence_la_LIBADD = $(GST_LIBS) libgstefence_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstefence_la_LIBTOOLFLAGS = --tag=disable-static libgstnavigationtest_la_SOURCES = gstnavigationtest.c libgstnavigationtest_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstnavigationtest_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(LIBM) libgstnavigationtest_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstnavigationtest_la_LIBTOOLFLAGS = --tag=disable-static libgstdebug_la_SOURCES = \ gstdebug.c \ breakmydata.c \ gstcapsdebug.c \ gstcapssetter.c \ gstnavseek.c \ gstpushfilesrc.c \ gsttaginject.c \ rndbuffersize.c \ progressreport.c \ tests.c \ cpureport.c \ testplugin.c libgstdebug_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstdebug_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstdebug_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdebug_la_LIBTOOLFLAGS = --tag=disable-static Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstdebug -:SHARED libgstdebug \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstdebug_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdebug_la_CFLAGS) \ -:LDFLAGS $(libgstdebug_la_LDFLAGS) \ $(libgstdebug_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/debugutils/gstcapsdebug.c0000644000175000017500000001635511677341655017613 00000000000000/* GStreamer * Copyright (C) 2010 David Schleef * * 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 #include #include "gstcapsdebug.h" GST_DEBUG_CATEGORY_STATIC (gst_caps_debug_debug); #define GST_CAT_DEFAULT gst_caps_debug_debug /* prototypes */ static void gst_caps_debug_dispose (GObject * object); static void gst_caps_debug_finalize (GObject * object); static GstFlowReturn gst_caps_debug_sink_chain (GstPad * pad, GstBuffer * buffer); static GstCaps *gst_caps_debug_getcaps (GstPad * pad); static gboolean gst_caps_debug_acceptcaps (GstPad * pad, GstCaps * caps); static GstFlowReturn gst_caps_debug_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static GstStateChangeReturn gst_caps_debug_change_state (GstElement * element, GstStateChange transition); /* pad templates */ static GstStaticPadTemplate gst_caps_debug_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_caps_debug_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); /* class initialization */ #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_caps_debug_debug, "capsdebug", 0, \ "debug category for capsdebug element"); GST_BOILERPLATE_FULL (GstCapsDebug, gst_caps_debug, GstElement, GST_TYPE_ELEMENT, DEBUG_INIT); static void gst_caps_debug_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_caps_debug_src_template); gst_element_class_add_static_pad_template (element_class, &gst_caps_debug_sink_template); gst_element_class_set_details_simple (element_class, "Caps debug", "Generic", "Debug caps negotiation", "David Schleef "); } static void gst_caps_debug_class_init (GstCapsDebugClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gobject_class->dispose = gst_caps_debug_dispose; gobject_class->finalize = gst_caps_debug_finalize; element_class->change_state = GST_DEBUG_FUNCPTR (gst_caps_debug_change_state); } static void gst_caps_debug_init (GstCapsDebug * capsdebug, GstCapsDebugClass * capsdebug_class) { capsdebug->srcpad = gst_pad_new_from_static_template (&gst_caps_debug_src_template, "src"); gst_pad_set_getcaps_function (capsdebug->srcpad, GST_DEBUG_FUNCPTR (gst_caps_debug_getcaps)); gst_pad_set_acceptcaps_function (capsdebug->srcpad, GST_DEBUG_FUNCPTR (gst_caps_debug_acceptcaps)); gst_element_add_pad (GST_ELEMENT (capsdebug), capsdebug->srcpad); capsdebug->sinkpad = gst_pad_new_from_static_template (&gst_caps_debug_sink_template, "sink"); gst_pad_set_chain_function (capsdebug->sinkpad, GST_DEBUG_FUNCPTR (gst_caps_debug_sink_chain)); gst_pad_set_bufferalloc_function (capsdebug->sinkpad, GST_DEBUG_FUNCPTR (gst_caps_debug_bufferalloc)); gst_pad_set_getcaps_function (capsdebug->sinkpad, GST_DEBUG_FUNCPTR (gst_caps_debug_getcaps)); gst_pad_set_acceptcaps_function (capsdebug->sinkpad, GST_DEBUG_FUNCPTR (gst_caps_debug_acceptcaps)); gst_element_add_pad (GST_ELEMENT (capsdebug), capsdebug->sinkpad); } void gst_caps_debug_dispose (GObject * object) { /* clean up as possible. may be called multiple times */ G_OBJECT_CLASS (parent_class)->dispose (object); } void gst_caps_debug_finalize (GObject * object) { /* clean up object here */ G_OBJECT_CLASS (parent_class)->finalize (object); } static GstStateChangeReturn gst_caps_debug_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return ret; } static GstFlowReturn gst_caps_debug_sink_chain (GstPad * pad, GstBuffer * buffer) { GstFlowReturn ret; GstCapsDebug *capsdebug; capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); ret = gst_pad_push (capsdebug->srcpad, buffer); gst_object_unref (capsdebug); return ret; } #define THISPAD ((pad == capsdebug->srcpad) ? "downstream" : "upstream") #define OTHERPAD ((pad == capsdebug->srcpad) ? "upstream" : "downstream") static GstCaps * gst_caps_debug_getcaps (GstPad * pad) { GstCaps *caps; GstCapsDebug *capsdebug; gchar *s; GstPad *otherpad; capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); otherpad = (pad == capsdebug->srcpad) ? capsdebug->sinkpad : capsdebug->srcpad; GST_INFO ("%s called getcaps", THISPAD); caps = gst_pad_peer_get_caps (otherpad); s = gst_caps_to_string (caps); GST_INFO ("%s returned %s", OTHERPAD, s); g_free (s); if (caps == NULL) caps = gst_caps_new_any (); gst_object_unref (capsdebug); return caps; } static gboolean gst_caps_debug_acceptcaps (GstPad * pad, GstCaps * caps) { GstCapsDebug *capsdebug; gchar *s; gboolean ret; GstPad *otherpad; capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); otherpad = (pad == capsdebug->srcpad) ? capsdebug->sinkpad : capsdebug->srcpad; s = gst_caps_to_string (caps); GST_INFO ("%s called acceptcaps with %s", THISPAD, s); g_free (s); ret = gst_pad_peer_accept_caps (otherpad, caps); GST_INFO ("%s returned %s", OTHERPAD, ret ? "TRUE" : "FALSE"); gst_object_unref (capsdebug); return ret; } static GstFlowReturn gst_caps_debug_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstCapsDebug *capsdebug; gchar *s; gchar *t; GstFlowReturn ret; GstPad *otherpad; gboolean newcaps; capsdebug = GST_CAPS_DEBUG (gst_pad_get_parent (pad)); otherpad = (pad == capsdebug->srcpad) ? capsdebug->sinkpad : capsdebug->srcpad; newcaps = (caps != GST_PAD_CAPS (pad)); if (newcaps) { s = gst_caps_to_string (caps); GST_INFO ("%s called bufferalloc with new caps, offset=%" G_GUINT64_FORMAT " size=%d caps=%s", THISPAD, offset, size, s); g_free (s); } ret = gst_pad_alloc_buffer_and_set_caps (otherpad, offset, size, caps, buf); if (newcaps) { GST_INFO ("%s returned %s", OTHERPAD, gst_flow_get_name (ret)); } if (caps != GST_BUFFER_CAPS (*buf)) { s = gst_caps_to_string (caps); t = gst_caps_to_string (GST_BUFFER_CAPS (*buf)); GST_INFO ("%s returned from bufferalloc with different caps, requested=%s returned=%s", OTHERPAD, s, t); g_free (s); g_free (t); } gst_object_unref (capsdebug); return ret; } gst-plugins-good-0.10.31/gst/debugutils/efence.c0000644000175000017500000003575011677341655016365 00000000000000/* * GStreamer * Copyright (C) 1999-2001 Erik Walthinsen * Copyright (C) 2002 David A. Schleef * * 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 #include #include #include #include "efence.h" #ifndef MAP_ANONYMOUS #ifdef MAP_ANON #define MAP_ANONYMOUS MAP_ANON #else /* assume we don't need it */ #define MAP_ANONYMOUS 0 #endif #endif GST_DEBUG_CATEGORY_STATIC (gst_efence_debug); #define GST_CAT_DEFAULT gst_efence_debug /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, ARG_FENCE_TOP }; static GstStaticPadTemplate gst_efence_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_efence_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_efence_base_init (gpointer g_class); static void gst_efence_class_init (GstEFenceClass * klass); static void gst_efence_init (GstEFence * filter); static void gst_efence_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_efence_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_efence_chain (GstPad * pad, GstBuffer * buf); static GstFlowReturn gst_efence_getrange (GstPad * pad, guint64 offset, guint length, GstBuffer ** buffer); static gboolean gst_efence_checkgetrange (GstPad * pad); static gboolean gst_efence_activate_src_pull (GstPad * pad, gboolean active); static GstElementClass *parent_class = NULL; typedef struct _GstFencedBuffer GstFencedBuffer; struct _GstFencedBuffer { GstBuffer buffer; void *region; unsigned int length; }; GType gst_fenced_buffer_get_type (void); static void gst_fenced_buffer_finalize (GstFencedBuffer * buf); static GstFencedBuffer *gst_fenced_buffer_copy (const GstBuffer * buffer); static void *gst_fenced_buffer_alloc (GstBuffer * buffer, unsigned int length, gboolean fence_top); static GstFlowReturn gst_efence_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); #define GST_TYPE_FENCED_BUFFER (gst_fenced_buffer_get_type()) #define GST_IS_FENCED_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_FENCED_BUFFER)) #define GST_FENCED_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_FENCED_BUFFER, GstFencedBuffer)) GType gst_gst_efence_get_type (void) { static GType plugin_type = 0; if (!plugin_type) { static const GTypeInfo plugin_info = { sizeof (GstEFenceClass), gst_efence_base_init, NULL, (GClassInitFunc) gst_efence_class_init, NULL, NULL, sizeof (GstEFence), 0, (GInstanceInitFunc) gst_efence_init, }; plugin_type = g_type_register_static (GST_TYPE_ELEMENT, "GstEFence", &plugin_info, 0); } return plugin_type; } static void gst_efence_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_efence_sink_factory); gst_element_class_add_static_pad_template (element_class, &gst_efence_src_factory); gst_element_class_set_details_simple (element_class, "Electric Fence", "Testing", "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 " "\"Electric Fence\".", "David A. Schleef "); } /* initialize the plugin's class */ static void gst_efence_class_init (GstEFenceClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_efence_set_property; gobject_class->get_property = gst_efence_get_property; g_object_class_install_property (gobject_class, ARG_FENCE_TOP, g_param_spec_boolean ("fence-top", "Fence Top", "Align buffers with top of fenced region", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } /* initialize the new element * instantiate pads and add them to element * set functions * initialize structure */ static void gst_efence_init (GstEFence * filter) { filter->sinkpad = gst_pad_new_from_static_template (&gst_efence_sink_factory, "sink"); gst_pad_set_getcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_pad_set_setcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); gst_pad_set_chain_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_efence_chain)); gst_pad_set_bufferalloc_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_efence_buffer_alloc)); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); filter->srcpad = gst_pad_new_from_static_template (&gst_efence_src_factory, "src"); gst_pad_set_getcaps_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_pad_set_setcaps_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); gst_pad_set_checkgetrange_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_efence_checkgetrange)); gst_pad_set_getrange_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_efence_getrange)); gst_pad_set_activatepull_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_efence_activate_src_pull)); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->fence_top = TRUE; } /* chain function * this function does the actual processing */ static GstFlowReturn gst_efence_chain (GstPad * pad, GstBuffer * buffer) { GstEFence *efence; GstBuffer *copy; efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); g_return_val_if_fail (GST_IS_EFENCE (efence), GST_FLOW_ERROR); if (GST_IS_FENCED_BUFFER (buffer)) { GST_DEBUG_OBJECT (efence, "Passing on existing fenced buffer with caps %" GST_PTR_FORMAT, GST_BUFFER_CAPS (buffer)); return gst_pad_push (efence->srcpad, buffer); } copy = (GstBuffer *) gst_fenced_buffer_copy (buffer); GST_DEBUG_OBJECT (efence, "Pushing newly fenced buffer with caps %" GST_PTR_FORMAT ", data=%p, size=%u", GST_BUFFER_CAPS (copy), GST_BUFFER_DATA (copy), GST_BUFFER_SIZE (copy)); gst_buffer_unref (buffer); return gst_pad_push (efence->srcpad, copy); } static GstFlowReturn gst_efence_getrange (GstPad * pad, guint64 offset, guint length, GstBuffer ** buffer) { GstEFence *efence; GstFlowReturn ret; GstBuffer *ownbuf; GstPad *peer; efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); peer = gst_pad_get_peer (efence->sinkpad); if (!peer) return GST_FLOW_NOT_LINKED; if ((ret = gst_pad_get_range (peer, offset, length, buffer)) != GST_FLOW_OK) goto beach; ownbuf = (GstBuffer *) gst_fenced_buffer_copy (*buffer); gst_buffer_unref ((GstBuffer *) * buffer); *buffer = ownbuf; beach: gst_object_unref (peer); return ret; } static gboolean gst_efence_checkgetrange (GstPad * pad) { GstEFence *efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); return gst_pad_check_pull_range (efence->sinkpad); } static gboolean gst_efence_activate_src_pull (GstPad * pad, gboolean active) { GstEFence *efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); return gst_pad_activate_pull (efence->sinkpad, active); } static GstFlowReturn gst_efence_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstBuffer *buffer; GstEFence *efence; g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR); efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); buffer = (GstBuffer *) gst_mini_object_new (GST_TYPE_FENCED_BUFFER); GST_BUFFER_DATA (buffer) = gst_fenced_buffer_alloc (buffer, size, efence->fence_top); GST_BUFFER_SIZE (buffer) = size; GST_BUFFER_OFFSET (buffer) = offset; if (caps) gst_buffer_set_caps (buffer, caps); *buf = buffer; GST_DEBUG_OBJECT (efence, "Allocated buffer of size %u, caps: %" GST_PTR_FORMAT, GST_BUFFER_SIZE (buffer), GST_BUFFER_CAPS (buffer)); return GST_FLOW_OK; } static void gst_efence_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstEFence *filter; g_return_if_fail (GST_IS_EFENCE (object)); filter = GST_EFENCE (object); switch (prop_id) { case ARG_FENCE_TOP: filter->fence_top = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_efence_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstEFence *filter; g_return_if_fail (GST_IS_EFENCE (object)); filter = GST_EFENCE (object); switch (prop_id) { case ARG_FENCE_TOP: g_value_set_boolean (value, filter->fence_top); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* entry point to initialize the plug-in * initialize the plug-in itself * register the element factories and pad templates * register the features */ static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "efence", GST_RANK_NONE, GST_TYPE_EFENCE)) return FALSE; GST_DEBUG_CATEGORY_INIT (gst_efence_debug, "efence", 0, "Debug output from the efence element"); /* plugin initialisation succeeded */ return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "efence", "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 " "\"Electric Fence\".", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); static GstBufferClass *fenced_buffer_parent_class = NULL; static void gst_fenced_buffer_finalize (GstFencedBuffer * buffer) { GstFencedBuffer *fenced_buffer; GST_DEBUG ("free buffer=%p", buffer); fenced_buffer = GST_FENCED_BUFFER (buffer); /* free our data */ if (GST_BUFFER_DATA (buffer)) { GST_DEBUG ("free region %p %d", fenced_buffer->region, fenced_buffer->length); munmap (fenced_buffer->region, fenced_buffer->length); } GST_MINI_OBJECT_CLASS (fenced_buffer_parent_class)->finalize (GST_MINI_OBJECT (buffer)); } static GstFencedBuffer * gst_fenced_buffer_copy (const GstBuffer * buffer) { GstBuffer *copy; void *ptr; guint mask; g_return_val_if_fail (buffer != NULL, NULL); /* create a fresh new buffer */ copy = (GstBuffer *) gst_mini_object_new (GST_TYPE_FENCED_BUFFER); /* we simply copy everything from our parent */ ptr = gst_fenced_buffer_alloc (GST_BUFFER (copy), GST_BUFFER_SIZE (buffer), TRUE); memcpy (ptr, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); /* copy relevant flags */ mask = GST_BUFFER_FLAG_PREROLL | GST_BUFFER_FLAG_IN_CAPS | GST_BUFFER_FLAG_DELTA_UNIT; GST_MINI_OBJECT (copy)->flags |= GST_MINI_OBJECT (buffer)->flags & mask; GST_BUFFER_DATA (copy) = ptr; GST_BUFFER_SIZE (copy) = GST_BUFFER_SIZE (buffer); GST_BUFFER_TIMESTAMP (copy) = GST_BUFFER_TIMESTAMP (buffer); GST_BUFFER_DURATION (copy) = GST_BUFFER_DURATION (buffer); GST_BUFFER_OFFSET (copy) = GST_BUFFER_OFFSET (buffer); GST_BUFFER_OFFSET_END (copy) = GST_BUFFER_OFFSET_END (buffer); if (GST_BUFFER_CAPS (buffer)) GST_BUFFER_CAPS (copy) = gst_caps_ref (GST_BUFFER_CAPS (buffer)); else GST_BUFFER_CAPS (copy) = NULL; GST_DEBUG ("Copied buffer %p with ts %" GST_TIME_FORMAT ", caps: %" GST_PTR_FORMAT, buffer, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (copy)), GST_BUFFER_CAPS (copy)); return GST_FENCED_BUFFER (copy); } void * gst_fenced_buffer_alloc (GstBuffer * buffer, unsigned int length, gboolean fence_top) { int alloc_size; void *region; GstFencedBuffer *fenced_buffer = (GstFencedBuffer *) buffer; int page_size; GST_DEBUG ("buffer=%p length=%d fence_top=%d", buffer, length, fence_top); if (length == 0) return NULL; #ifdef _SC_PAGESIZE page_size = sysconf (_SC_PAGESIZE); #else page_size = getpagesize (); #endif /* Allocate a complete page, and one on either side */ alloc_size = ((length - 1) & ~(page_size - 1)) + page_size; alloc_size += 2 * page_size; region = mmap (NULL, alloc_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (region == MAP_FAILED) { g_warning ("mmap failed"); return NULL; } #if 0 munmap (region, page_size); munmap (region + alloc_size - page_size, page_size); fenced_buffer->region = region + page_size; fenced_buffer->length = alloc_size - page_size; #else mprotect (region, page_size, PROT_NONE); mprotect ((char *) region + alloc_size - page_size, page_size, PROT_NONE); fenced_buffer->region = region; fenced_buffer->length = alloc_size; #endif GST_DEBUG ("new region %p %d", fenced_buffer->region, fenced_buffer->length); if (fence_top) { int offset; /* Align to top of region, but force alignment to 4 bytes */ offset = alloc_size - page_size - length; offset &= ~0x3; return (void *) ((char *) region + offset); } else { return (void *) ((char *) region + page_size); } } static void gst_fenced_buffer_class_init (gpointer g_class, gpointer class_data) { GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); fenced_buffer_parent_class = g_type_class_peek_parent (g_class); mini_object_class->finalize = (GstMiniObjectFinalizeFunction) gst_fenced_buffer_finalize; mini_object_class->copy = (GstMiniObjectCopyFunction) gst_fenced_buffer_copy; } GType gst_fenced_buffer_get_type (void) { static GType fenced_buf_type = 0; if (G_UNLIKELY (!fenced_buf_type)) { static const GTypeInfo fenced_buf_info = { sizeof (GstBufferClass), NULL, NULL, (GClassInitFunc) gst_fenced_buffer_class_init, NULL, NULL, sizeof (GstFencedBuffer), 0, NULL, }; fenced_buf_type = g_type_register_static (GST_TYPE_BUFFER, "GstFencedBuffer", &fenced_buf_info, 0); } return fenced_buf_type; } gst-plugins-good-0.10.31/gst/debugutils/gstnavseek.c0000644000175000017500000002724111677341655017306 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * 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. */ /* * This file was (probably) generated from gstnavseek.c, * gstnavseek.c,v 1.7 2003/11/08 02:48:59 dschleef Exp */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstnavseek.h" #include #include enum { ARG_0, ARG_SEEKOFFSET }; GstStaticPadTemplate navseek_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GstStaticPadTemplate navseek_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static gboolean gst_navseek_event (GstBaseTransform * trans, GstEvent * event); static GstFlowReturn gst_navseek_transform_ip (GstBaseTransform * basetrans, GstBuffer * buf); static gboolean gst_navseek_handle_src_event (GstPad * pad, GstEvent * event); static gboolean gst_navseek_stop (GstBaseTransform * trans); static gboolean gst_navseek_start (GstBaseTransform * trans); static void gst_navseek_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_navseek_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GType gst_navseek_get_type (void); GST_BOILERPLATE (GstNavSeek, gst_navseek, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_navseek_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &navseek_sink_template); gst_element_class_add_static_pad_template (element_class, &navseek_src_template); gst_element_class_set_details_simple (element_class, "Seek based on left-right arrows", "Filter/Video", "Seek based on navigation keys left-right", "Jan Schmidt "); } static void gst_navseek_class_init (GstNavSeekClass * klass) { GstBaseTransformClass *gstbasetrans_class; GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->set_property = gst_navseek_set_property; gobject_class->get_property = gst_navseek_get_property; g_object_class_install_property (gobject_class, ARG_SEEKOFFSET, g_param_spec_double ("seek-offset", "Seek Offset", "Time in seconds to seek by", 0.0, G_MAXDOUBLE, 5.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_navseek_event); gstbasetrans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_navseek_transform_ip); gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_navseek_start); gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_navseek_stop); } static void gst_navseek_init (GstNavSeek * navseek, GstNavSeekClass * g_class) { gst_pad_set_event_function (GST_BASE_TRANSFORM (navseek)->srcpad, GST_DEBUG_FUNCPTR (gst_navseek_handle_src_event)); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (navseek), TRUE); navseek->seek_offset = 5.0; navseek->loop = FALSE; navseek->grab_seg_start = FALSE; navseek->grab_seg_end = FALSE; navseek->segment_start = GST_CLOCK_TIME_NONE; navseek->segment_end = GST_CLOCK_TIME_NONE; } static void gst_navseek_seek (GstNavSeek * navseek, gint64 offset) { GstFormat peer_format = GST_FORMAT_TIME; gboolean ret; GstPad *peer_pad; gint64 peer_value; /* Query for the current time then attempt to set to time + offset */ peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); ret = gst_pad_query_position (peer_pad, &peer_format, &peer_value); if (ret && peer_format == GST_FORMAT_TIME) { GstEvent *event; peer_value += offset; if (peer_value < 0) peer_value = 0; event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, peer_value, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); gst_pad_send_event (peer_pad, event); } gst_object_unref (peer_pad); } static void gst_navseek_change_playback_rate (GstNavSeek * navseek, gdouble rate) { GstFormat peer_format = GST_FORMAT_TIME; gboolean ret; GstPad *peer_pad; gint64 current_position; peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); ret = gst_pad_query_position (peer_pad, &peer_format, ¤t_position); if (ret && peer_format == GST_FORMAT_TIME) { GstEvent *event; gint64 start; gint64 stop; if (rate > 0.0) { start = current_position; stop = -1; } else { /* negative rate: we play from stop to start */ start = 0; stop = current_position; } event = gst_event_new_seek (rate, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); gst_pad_send_event (peer_pad, event); } } static void gst_navseek_segseek (GstNavSeek * navseek) { GstEvent *event; GstPad *peer_pad; if ((navseek->segment_start == GST_CLOCK_TIME_NONE) || (navseek->segment_end == GST_CLOCK_TIME_NONE) || (!GST_PAD_IS_LINKED (GST_BASE_TRANSFORM (navseek)->sinkpad))) { return; } if (navseek->loop) { event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, navseek->segment_start, GST_SEEK_TYPE_SET, navseek->segment_end); } else { event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, navseek->segment_start, GST_SEEK_TYPE_SET, navseek->segment_end); } peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); gst_pad_send_event (peer_pad, event); gst_object_unref (peer_pad); } static void gst_navseek_toggle_play_pause (GstNavSeek * navseek) { GstStateChangeReturn sret; GstState current, pending, state; sret = gst_element_get_state (GST_ELEMENT (navseek), ¤t, &pending, 0); if (sret == GST_STATE_CHANGE_FAILURE) return; state = (pending != GST_STATE_VOID_PENDING) ? pending : current; gst_element_post_message (GST_ELEMENT (navseek), gst_message_new_request_state (GST_OBJECT (navseek), (state == GST_STATE_PLAYING) ? GST_STATE_PAUSED : GST_STATE_PLAYING)); } static gboolean gst_navseek_handle_src_event (GstPad * pad, GstEvent * event) { GstNavSeek *navseek; gboolean ret = TRUE; navseek = GST_NAVSEEK (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: /* Check for a keyup and convert left/right to a seek event */ { const GstStructure *structure; const gchar *event_type; structure = gst_event_get_structure (event); g_return_val_if_fail (structure != NULL, FALSE); event_type = gst_structure_get_string (structure, "event"); g_return_val_if_fail (event_type != NULL, FALSE); if (strcmp (event_type, "key-press") == 0) { const gchar *key; key = gst_structure_get_string (structure, "key"); g_return_val_if_fail (key != NULL, FALSE); if (strcmp (key, "Left") == 0) { /* Seek backward by 5 secs */ gst_navseek_seek (navseek, -1.0 * navseek->seek_offset * GST_SECOND); } else if (strcmp (key, "Right") == 0) { /* Seek forward */ gst_navseek_seek (navseek, navseek->seek_offset * GST_SECOND); } else if (strcmp (key, "s") == 0) { /* Grab the next frame as the start frame of a segment */ navseek->grab_seg_start = TRUE; } else if (strcmp (key, "e") == 0) { /* Grab the next frame as the end frame of a segment */ navseek->grab_seg_end = TRUE; } else if (strcmp (key, "l") == 0) { /* Toggle the loop flag. If we have both start and end segment times send a seek */ navseek->loop = !navseek->loop; gst_navseek_segseek (navseek); } else if (strcmp (key, "f") == 0) { /* fast forward */ gst_navseek_change_playback_rate (navseek, 2.0); } else if (strcmp (key, "r") == 0) { /* rewind */ gst_navseek_change_playback_rate (navseek, -2.0); } else if (strcmp (key, "n") == 0) { /* normal speed */ gst_navseek_change_playback_rate (navseek, 1.0); } else if (strcmp (key, "space") == 0) { gst_navseek_toggle_play_pause (navseek); } } else { break; } gst_event_unref (event); event = NULL; } break; default: break; } if (event && GST_PAD_IS_LINKED (GST_BASE_TRANSFORM (navseek)->sinkpad)) { GstPad *peer_pad = gst_pad_get_peer (GST_BASE_TRANSFORM (navseek)->sinkpad); ret = gst_pad_send_event (peer_pad, event); gst_object_unref (peer_pad); } return ret; } static void gst_navseek_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstNavSeek *navseek = GST_NAVSEEK (object); switch (prop_id) { case ARG_SEEKOFFSET: GST_OBJECT_LOCK (navseek); navseek->seek_offset = g_value_get_double (value); GST_OBJECT_UNLOCK (navseek); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_navseek_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstNavSeek *navseek = GST_NAVSEEK (object); switch (prop_id) { case ARG_SEEKOFFSET: GST_OBJECT_LOCK (navseek); g_value_set_double (value, navseek->seek_offset); GST_OBJECT_UNLOCK (navseek); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_navseek_event (GstBaseTransform * trans, GstEvent * event) { GstNavSeek *navseek = GST_NAVSEEK (trans); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: GST_OBJECT_LOCK (navseek); if (navseek->loop) gst_navseek_segseek (navseek); GST_OBJECT_UNLOCK (navseek); break; default: break; } return GST_BASE_TRANSFORM_CLASS (parent_class)->event (trans, event); } static GstFlowReturn gst_navseek_transform_ip (GstBaseTransform * basetrans, GstBuffer * buf) { GstNavSeek *navseek = GST_NAVSEEK (basetrans); GST_OBJECT_LOCK (navseek); if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { if (navseek->grab_seg_start) { navseek->segment_start = GST_BUFFER_TIMESTAMP (buf); navseek->segment_end = GST_CLOCK_TIME_NONE; navseek->grab_seg_start = FALSE; } if (navseek->grab_seg_end) { navseek->segment_end = GST_BUFFER_TIMESTAMP (buf); navseek->grab_seg_end = FALSE; gst_navseek_segseek (navseek); } } GST_OBJECT_UNLOCK (navseek); return GST_FLOW_OK; } static gboolean gst_navseek_start (GstBaseTransform * trans) { /* anything we should be doing here? */ return TRUE; } static gboolean gst_navseek_stop (GstBaseTransform * trans) { /* anything we should be doing here? */ return TRUE; } gst-plugins-good-0.10.31/gst/debugutils/progressreport.c0000644000175000017500000003763511677341655020244 00000000000000/* GStreamer Progress Report Element * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2004> Jan Schmidt * Copyright (C) <2006> Tim-Philipp Müller * * 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-progressreport * * The progressreport element can be put into a pipeline to report progress, * which is done by doing upstream duration and position queries in regular * (real-time) intervals. Both the interval and the prefered query format * can be specified via the #GstProgressReport:update-freq and the * #GstProgressReport:format property. * * Element messages containing a "progress" structure are posted on the bus * whenever progress has been queried (since gst-plugins-good 0.10.6 only). * * Since the element was originally designed for debugging purposes, it will * by default also print information about the current progress to the * terminal. This can be prevented by setting the #GstProgressReport:silent * property to %TRUE. * * This element is most useful in transcoding pipelines or other situations * where just querying the pipeline might not lead to the wanted result. For * progress in TIME format, the element is best placed in a 'raw stream' * section of the pipeline (or after any demuxers/decoders/parsers). * * Three more things should be pointed out: firstly, the element will only * query progress when data flow happens. If data flow is stalled for some * reason, no progress messages will be posted. Secondly, there are other * elements (like qtdemux, for example) that may also post "progress" element * messages on the bus. Applications should check the source of any element * messages they receive, if needed. Finally, applications should not take * action on receiving notification of progress being 100%, they should only * take action when they receive an EOS message (since the progress reported * is in reference to an internal point of a pipeline and not the pipeline as * a whole). * * * Example launch line * |[ * gst-launch -m filesrc location=foo.ogg ! decodebin ! progressreport update-freq=1 ! audioconvert ! audioresample ! autoaudiosink * ]| This shows a progress query where a duration is available. * |[ * gst-launch -m audiotestsrc ! progressreport update-freq=1 ! audioconvert ! autoaudiosink * ]| This shows a progress query where no duration is available. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "progressreport.h" enum { ARG_0, ARG_UPDATE_FREQ, ARG_SILENT, ARG_DO_QUERY, ARG_FORMAT }; GstStaticPadTemplate progress_report_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GstStaticPadTemplate progress_report_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); #define DEFAULT_UPDATE_FREQ 5 #define DEFAULT_SILENT FALSE #define DEFAULT_DO_QUERY TRUE #define DEFAULT_FORMAT "auto" static void gst_progress_report_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_progress_report_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_progress_report_event (GstBaseTransform * trans, GstEvent * event); static GstFlowReturn gst_progress_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf); static gboolean gst_progress_report_start (GstBaseTransform * trans); static gboolean gst_progress_report_stop (GstBaseTransform * trans); GST_BOILERPLATE (GstProgressReport, gst_progress_report, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_progress_report_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &progress_report_sink_template); gst_element_class_add_static_pad_template (element_class, &progress_report_src_template); gst_element_class_set_details_simple (element_class, "Progress report", "Testing", "Periodically query and report on processing progress", "Jan Schmidt "); } static void gst_progress_report_finalize (GObject * obj) { GstProgressReport *filter = GST_PROGRESS_REPORT (obj); g_free (filter->format); filter->format = NULL; G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_progress_report_class_init (GstProgressReportClass * g_class) { GstBaseTransformClass *gstbasetrans_class; GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (g_class); gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (g_class); gobject_class->finalize = gst_progress_report_finalize; gobject_class->set_property = gst_progress_report_set_property; gobject_class->get_property = gst_progress_report_get_property; g_object_class_install_property (gobject_class, ARG_UPDATE_FREQ, g_param_spec_int ("update-freq", "Update Frequency", "Number of seconds between reports when data is flowing", 1, G_MAXINT, DEFAULT_UPDATE_FREQ, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_SILENT, g_param_spec_boolean ("silent", "Do not print output to stdout", "Do not print output to stdout", DEFAULT_SILENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_DO_QUERY, g_param_spec_boolean ("do-query", "Use a query instead of buffer metadata to determine stream position", "Use a query instead of buffer metadata to determine stream position", DEFAULT_DO_QUERY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_FORMAT, g_param_spec_string ("format", "format", "Format to use for the querying", DEFAULT_FORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_progress_report_event); gstbasetrans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_progress_report_transform_ip); gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_progress_report_start); gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_progress_report_stop); } static void gst_progress_report_init (GstProgressReport * report, GstProgressReportClass * g_class) { gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (report), TRUE); report->update_freq = DEFAULT_UPDATE_FREQ; report->silent = DEFAULT_SILENT; report->do_query = DEFAULT_DO_QUERY; report->format = g_strdup (DEFAULT_FORMAT); } static void gst_progress_report_post_progress (GstProgressReport * filter, GstFormat format, gint64 current, gint64 total) { GstStructure *s = NULL; if (current >= 0 && total > 0) { gdouble perc; perc = gst_util_guint64_to_gdouble (current) * 100.0 / gst_util_guint64_to_gdouble (total); perc = CLAMP (perc, 0.0, 100.0); /* we provide a "percent" field of integer type to stay compatible * with qtdemux, but add a second "percent-double" field for those who * want more precision and are too lazy to calculate it themselves */ s = gst_structure_new ("progress", "percent", G_TYPE_INT, (gint) perc, "percent-double", G_TYPE_DOUBLE, perc, "current", G_TYPE_INT64, current, "total", G_TYPE_INT64, total, NULL); } else if (current >= 0) { s = gst_structure_new ("progress", "current", G_TYPE_INT64, current, NULL); } if (s) { GST_LOG_OBJECT (filter, "posting progress message: %" GST_PTR_FORMAT, s); gst_structure_set (s, "format", GST_TYPE_FORMAT, format, NULL); /* can't post it right here because we're holding the object lock */ filter->pending_msg = gst_message_new_element (GST_OBJECT_CAST (filter), s); } } static gboolean gst_progress_report_do_query (GstProgressReport * filter, GstFormat format, gint hh, gint mm, gint ss, GstBuffer * buf) { const gchar *format_name = NULL; GstPad *sink_pad; gint64 cur, total; sink_pad = GST_BASE_TRANSFORM (filter)->sinkpad; GST_LOG_OBJECT (filter, "querying using format %d (%s)", format, gst_format_get_name (format)); if (filter->do_query || !buf) { GST_LOG_OBJECT (filter, "using upstream query"); if (!gst_pad_query_peer_position (sink_pad, &format, &cur) || !gst_pad_query_peer_duration (sink_pad, &format, &total)) { return FALSE; } } else { GstBaseTransform *base = GST_BASE_TRANSFORM (filter); GST_LOG_OBJECT (filter, "using buffer metadata"); if (format == GST_FORMAT_TIME && base->have_newsegment && base->segment.format == GST_FORMAT_TIME) { cur = gst_segment_to_stream_time (&base->segment, format, GST_BUFFER_TIMESTAMP (buf)); total = base->segment.duration; } else { return FALSE; } } switch (format) { case GST_FORMAT_BYTES: format_name = "bytes"; break; case GST_FORMAT_BUFFERS: format_name = "buffers"; break; case GST_FORMAT_PERCENT: format_name = "percent"; break; case GST_FORMAT_TIME: format_name = "seconds"; cur /= GST_SECOND; total /= GST_SECOND; break; case GST_FORMAT_DEFAULT:{ GstCaps *caps; format_name = "bogounits"; caps = GST_PAD_CAPS (GST_BASE_TRANSFORM (filter)->sinkpad); if (caps && gst_caps_is_fixed (caps) && !gst_caps_is_any (caps)) { GstStructure *s = gst_caps_get_structure (caps, 0); const gchar *mime_type = gst_structure_get_name (s); if (g_str_has_prefix (mime_type, "video/") || g_str_has_prefix (mime_type, "image/")) { format_name = "frames"; } else if (g_str_has_prefix (mime_type, "audio/")) { format_name = "samples"; } } break; } default:{ const GstFormatDefinition *details; details = gst_format_get_details (format); if (details) { format_name = details->nick; } else { format_name = "unknown"; } break; } } if (!filter->silent) { if (total > 0) { g_print ("%s (%02d:%02d:%02d): %" G_GINT64_FORMAT " / %" G_GINT64_FORMAT " %s (%4.1f %%)\n", GST_OBJECT_NAME (filter), hh, mm, ss, cur, total, format_name, (gdouble) cur / total * 100.0); } else { g_print ("%s (%02d:%02d:%02d): %" G_GINT64_FORMAT " %s\n", GST_OBJECT_NAME (filter), hh, mm, ss, cur, format_name); } } gst_progress_report_post_progress (filter, format, cur, total); return TRUE; } static void gst_progress_report_report (GstProgressReport * filter, GTimeVal cur_time, GstBuffer * buf) { GstFormat try_formats[] = { GST_FORMAT_TIME, GST_FORMAT_BYTES, GST_FORMAT_PERCENT, GST_FORMAT_BUFFERS, GST_FORMAT_DEFAULT }; GstMessage *msg; GstFormat format = GST_FORMAT_UNDEFINED; gboolean done = FALSE; glong run_time; gint hh, mm, ss; run_time = cur_time.tv_sec - filter->start_time.tv_sec; hh = (run_time / 3600) % 100; mm = (run_time / 60) % 60; ss = (run_time % 60); GST_OBJECT_LOCK (filter); if (filter->format != NULL && strcmp (filter->format, "auto") != 0) { format = gst_format_get_by_nick (filter->format); } if (format != GST_FORMAT_UNDEFINED) { done = gst_progress_report_do_query (filter, format, hh, mm, ss, buf); } else { gint i; for (i = 0; i < G_N_ELEMENTS (try_formats); ++i) { done = gst_progress_report_do_query (filter, try_formats[i], hh, mm, ss, buf); if (done) break; } } if (!done && !filter->silent) { g_print ("%s (%2d:%2d:%2d): Could not query position and/or duration\n", GST_OBJECT_NAME (filter), hh, mm, ss); } msg = filter->pending_msg; filter->pending_msg = NULL; GST_OBJECT_UNLOCK (filter); if (msg) { gst_element_post_message (GST_ELEMENT_CAST (filter), msg); } } static gboolean gst_progress_report_event (GstBaseTransform * trans, GstEvent * event) { GstProgressReport *filter; filter = GST_PROGRESS_REPORT (trans); if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { GTimeVal cur_time; g_get_current_time (&cur_time); gst_progress_report_report (filter, cur_time, NULL); } return GST_BASE_TRANSFORM_CLASS (parent_class)->event (trans, event); } static GstFlowReturn gst_progress_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstProgressReport *filter; gboolean need_update; GTimeVal cur_time; g_get_current_time (&cur_time); filter = GST_PROGRESS_REPORT (trans); /* Check if update_freq seconds have passed since the last update */ GST_OBJECT_LOCK (filter); need_update = ((cur_time.tv_sec - filter->last_report.tv_sec) >= filter->update_freq); GST_OBJECT_UNLOCK (filter); if (need_update) { gst_progress_report_report (filter, cur_time, buf); GST_OBJECT_LOCK (filter); filter->last_report = cur_time; GST_OBJECT_UNLOCK (filter); } return GST_FLOW_OK; } static gboolean gst_progress_report_start (GstBaseTransform * trans) { GstProgressReport *filter; filter = GST_PROGRESS_REPORT (trans); g_get_current_time (&filter->last_report); filter->start_time = filter->last_report; return TRUE; } static gboolean gst_progress_report_stop (GstBaseTransform * trans) { /* anything we should be doing here? */ return TRUE; } static void gst_progress_report_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstProgressReport *filter; filter = GST_PROGRESS_REPORT (object); switch (prop_id) { case ARG_UPDATE_FREQ: GST_OBJECT_LOCK (filter); filter->update_freq = g_value_get_int (value); GST_OBJECT_UNLOCK (filter); break; case ARG_SILENT: GST_OBJECT_LOCK (filter); filter->silent = g_value_get_boolean (value); GST_OBJECT_UNLOCK (filter); break; case ARG_DO_QUERY: GST_OBJECT_LOCK (filter); filter->do_query = g_value_get_boolean (value); GST_OBJECT_UNLOCK (filter); break; case ARG_FORMAT: GST_OBJECT_LOCK (filter); g_free (filter->format); filter->format = g_value_dup_string (value); if (filter->format == NULL) filter->format = g_strdup ("auto"); GST_OBJECT_UNLOCK (filter); break; default: break; } } static void gst_progress_report_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstProgressReport *filter; filter = GST_PROGRESS_REPORT (object); switch (prop_id) { case ARG_UPDATE_FREQ: GST_OBJECT_LOCK (filter); g_value_set_int (value, filter->update_freq); GST_OBJECT_UNLOCK (filter); break; case ARG_SILENT: GST_OBJECT_LOCK (filter); g_value_set_boolean (value, filter->silent); GST_OBJECT_UNLOCK (filter); break; case ARG_DO_QUERY: GST_OBJECT_LOCK (filter); g_value_set_boolean (value, filter->do_query); GST_OBJECT_UNLOCK (filter); break; case ARG_FORMAT: GST_OBJECT_LOCK (filter); g_value_set_string (value, filter->format); GST_OBJECT_UNLOCK (filter); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/debugutils/breakmydata.c0000644000175000017500000002064211677341655017416 00000000000000/* GStreamer * Copyright (C) 2004 Benjamin Otte * * 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-breakmydata * * This element modifies the contents of the buffer it is passed randomly * according to the parameters set. * It otherwise acts as an identity. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include GST_DEBUG_CATEGORY_STATIC (gst_break_my_data_debug); #define GST_CAT_DEFAULT gst_break_my_data_debug #define GST_TYPE_BREAK_MY_DATA \ (gst_break_my_data_get_type()) #define GST_BREAK_MY_DATA(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BREAK_MY_DATA,GstBreakMyData)) #define GST_BREAK_MY_DATA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BREAK_MY_DATA,GstBreakMyDataClass)) #define GST_IS_BREAK_MY_DATA(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BREAK_MY_DATA)) #define GST_IS_BREAK_MY_DATA_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BREAK_MY_DATA)) enum { ARG_0, ARG_SEED, ARG_SET_TO, ARG_SKIP, ARG_PROBABILITY }; typedef struct _GstBreakMyData GstBreakMyData; typedef struct _GstBreakMyDataClass GstBreakMyDataClass; struct _GstBreakMyData { GstBaseTransform basetransform; GRand *rand; guint skipped; guint32 seed; gint set; guint skip; gdouble probability; }; struct _GstBreakMyDataClass { GstBaseTransformClass parent_class; }; static void gst_break_my_data_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_break_my_data_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_break_my_data_transform_ip (GstBaseTransform * trans, GstBuffer * buf); static gboolean gst_break_my_data_stop (GstBaseTransform * trans); static gboolean gst_break_my_data_start (GstBaseTransform * trans); GstStaticPadTemplate bmd_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GstStaticPadTemplate bmd_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_break_my_data_debug, "breakmydata", 0, \ "debugging category for breakmydata element"); GType gst_break_my_data_get_type (void); GST_BOILERPLATE_FULL (GstBreakMyData, gst_break_my_data, GstBaseTransform, GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); static void gst_break_my_data_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (gstelement_class, &bmd_sink_template); gst_element_class_add_static_pad_template (gstelement_class, &bmd_src_template); gst_element_class_set_details_simple (gstelement_class, "Break my data", "Testing", "randomly change data in the stream", "Benjamin Otte "); } static void gst_break_my_data_class_init (GstBreakMyDataClass * klass) { GstBaseTransformClass *gstbasetrans_class; GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->set_property = gst_break_my_data_set_property; gobject_class->get_property = gst_break_my_data_get_property; g_object_class_install_property (gobject_class, ARG_SEED, g_param_spec_uint ("seed", "seed", "seed for randomness (initialized when going from READY to PAUSED)", 0, G_MAXUINT32, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_SET_TO, g_param_spec_int ("set-to", "set-to", "set changed bytes to this value (-1 means random value", -1, G_MAXUINT8, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_SKIP, g_param_spec_uint ("skip", "skip", "amount of bytes skipped at the beginning of stream", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_PROBABILITY, g_param_spec_double ("probability", "probability", "probability for each byte in the buffer to be changed", 0.0, 1.0, 0.0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); gstbasetrans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_break_my_data_transform_ip); gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_break_my_data_start); gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_break_my_data_stop); } static void gst_break_my_data_init (GstBreakMyData * bmd, GstBreakMyDataClass * g_class) { gst_base_transform_set_in_place (GST_BASE_TRANSFORM (bmd), TRUE); } static void gst_break_my_data_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstBreakMyData *bmd = GST_BREAK_MY_DATA (object); GST_OBJECT_LOCK (bmd); switch (prop_id) { case ARG_SEED: bmd->seed = g_value_get_uint (value); break; case ARG_SET_TO: bmd->set = g_value_get_int (value); break; case ARG_SKIP: bmd->skip = g_value_get_uint (value); break; case ARG_PROBABILITY: bmd->probability = g_value_get_double (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (bmd); } static void gst_break_my_data_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstBreakMyData *bmd = GST_BREAK_MY_DATA (object); GST_OBJECT_LOCK (bmd); switch (prop_id) { case ARG_SEED: g_value_set_uint (value, bmd->seed); break; case ARG_SET_TO: g_value_set_int (value, bmd->set); break; case ARG_SKIP: g_value_set_uint (value, bmd->skip); break; case ARG_PROBABILITY: g_value_set_double (value, bmd->probability); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (bmd); } static GstFlowReturn gst_break_my_data_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstBreakMyData *bmd = GST_BREAK_MY_DATA (trans); guint i, size; g_return_val_if_fail (gst_buffer_is_writable (buf), GST_FLOW_ERROR); GST_OBJECT_LOCK (bmd); if (bmd->skipped < bmd->skip) { i = bmd->skip - bmd->skipped; } else { i = 0; } size = GST_BUFFER_SIZE (buf); GST_LOG_OBJECT (bmd, "got buffer %p (size %u, timestamp %" G_GUINT64_FORMAT ", offset %" G_GUINT64_FORMAT "", buf, size, GST_BUFFER_TIMESTAMP (buf), GST_BUFFER_OFFSET (buf)); for (; i < size; i++) { if (g_rand_double_range (bmd->rand, 0, 1.0) <= bmd->probability) { guint8 new; if (bmd->set < 0) { new = g_rand_int_range (bmd->rand, 0, 256); } else { new = bmd->set; } GST_INFO_OBJECT (bmd, "changing byte %u from 0x%02X to 0x%02X", i, (guint) GST_READ_UINT8 (GST_BUFFER_DATA (buf) + i), (guint) ((guint8) new)); GST_BUFFER_DATA (buf)[i] = new; } } /* don't overflow */ bmd->skipped += MIN (G_MAXUINT - bmd->skipped, GST_BUFFER_SIZE (buf)); GST_OBJECT_UNLOCK (bmd); return GST_FLOW_OK; } static gboolean gst_break_my_data_start (GstBaseTransform * trans) { GstBreakMyData *bmd = GST_BREAK_MY_DATA (trans); GST_OBJECT_LOCK (bmd); bmd->rand = g_rand_new_with_seed (bmd->seed); bmd->skipped = 0; GST_OBJECT_UNLOCK (bmd); return TRUE; } static gboolean gst_break_my_data_stop (GstBaseTransform * trans) { GstBreakMyData *bmd = GST_BREAK_MY_DATA (trans); GST_OBJECT_LOCK (bmd); g_rand_free (bmd->rand); bmd->rand = NULL; GST_OBJECT_UNLOCK (bmd); return TRUE; } gst-plugins-good-0.10.31/gst/debugutils/cpureport.h0000644000175000017500000000344511671175353017156 00000000000000/* GStreamer CPU Report Element * Copyright (C) <2010> Zaheer Abbas Merali * * 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_CPU_REPORT_H__ #define __GST_CPU_REPORT_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_CPU_REPORT \ (gst_cpu_report_get_type()) #define GST_CPU_REPORT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CPU_REPORT,GstCpuReport)) #define GST_CPU_REPORT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CPU_REPORT,GstCpuReportClass)) #define GST_IS_CPU_REPORT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CPU_REPORT)) #define GST_IS_CPU_REPORT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CPU_REPORT)) typedef struct _GstCpuReport GstCpuReport; typedef struct _GstCpuReportClass GstCpuReportClass; struct _GstCpuReport { GstBaseTransform basetransform; GTimeVal start_time; GTimeVal last_time; clock_t last_cpu_time; }; struct _GstCpuReportClass { GstBaseTransformClass parent_class; }; GType gst_cpu_report_get_type (void); G_END_DECLS #endif /* __GST_CPU_REPORT_H__ */ gst-plugins-good-0.10.31/gst/debugutils/gstpushfilesrc.c0000644000175000017500000001273511677341655020203 00000000000000/* GStreamer Push File Source * Copyright (C) <2007> Tim-Philipp Müller * * 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-pushfilesrc * @see_also: filesrc * * This element is only useful for debugging purposes. It implements an URI * protocol handler for the 'pushfile' protocol and behaves like a file source * element that cannot be activated in pull-mode. This makes it very easy to * debug demuxers or decoders that can operate both pull and push-based in * connection with the playbin element (which creates a source based on the * URI passed). * * * Example launch line * |[ * gst-launch -m playbin uri=pushfile:///home/you/some/file.ogg * ]| This plays back the given file using playbin, with the demuxer operating * push-based. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstpushfilesrc.h" #include GST_DEBUG_CATEGORY_STATIC (pushfilesrc_debug); #define GST_CAT_DEFAULT pushfilesrc_debug static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_push_file_src_uri_handler_init (gpointer g_iface, gpointer iface_data); static void gst_file_push_src_add_uri_handler (GType type); GST_BOILERPLATE_FULL (GstPushFileSrc, gst_push_file_src, GstBin, GST_TYPE_BIN, gst_file_push_src_add_uri_handler); static void gst_file_push_src_add_uri_handler (GType type) { static const GInterfaceInfo info = { gst_push_file_src_uri_handler_init, NULL, NULL }; g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &info); GST_DEBUG_CATEGORY_INIT (pushfilesrc_debug, "pushfilesrc", 0, "pushfilesrc element"); } static void gst_push_file_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &srctemplate); gst_element_class_set_details_simple (element_class, "Push File Source", "Testing", "Implements pushfile:// URI-handler for push-based file access", "Tim-Philipp Müller "); } static void gst_push_file_src_dispose (GObject * obj) { GstPushFileSrc *src = GST_PUSH_FILE_SRC (obj); if (src->srcpad) { gst_element_remove_pad (GST_ELEMENT (src), src->srcpad); src->srcpad = NULL; } if (src->filesrc) { gst_bin_remove (GST_BIN (src), src->filesrc); src->filesrc = NULL; } G_OBJECT_CLASS (parent_class)->dispose (obj); } static void gst_push_file_src_class_init (GstPushFileSrcClass * g_class) { GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (g_class); gobject_class->dispose = gst_push_file_src_dispose; } static gboolean gst_push_file_src_ghostpad_checkgetrange (GstPad * pad) { return FALSE; } static void gst_push_file_src_init (GstPushFileSrc * src, GstPushFileSrcClass * g_class) { src->filesrc = gst_element_factory_make ("filesrc", "real-filesrc"); if (src->filesrc) { GstPad *pad; gst_bin_add (GST_BIN (src), src->filesrc); pad = gst_element_get_static_pad (src->filesrc, "src"); g_assert (pad != NULL); src->srcpad = gst_ghost_pad_new ("src", pad); /* FIXME^H^HCORE: try pushfile:///foo/bar.ext ! typefind ! fakesink without * this and watch core bugginess (some pad stays in flushing state) */ gst_pad_set_checkgetrange_function (src->srcpad, GST_DEBUG_FUNCPTR (gst_push_file_src_ghostpad_checkgetrange)); gst_element_add_pad (GST_ELEMENT (src), src->srcpad); gst_object_unref (pad); } } /*** GSTURIHANDLER INTERFACE *************************************************/ static GstURIType gst_push_file_src_uri_get_type (void) { return GST_URI_SRC; } static gchar ** gst_push_file_src_uri_get_protocols (void) { static gchar *protocols[] = { (char *) "pushfile", NULL }; return protocols; } static const gchar * gst_push_file_src_uri_get_uri (GstURIHandler * handler) { GstPushFileSrc *src = GST_PUSH_FILE_SRC (handler); if (src->filesrc == NULL) return NULL; return gst_uri_handler_get_uri (GST_URI_HANDLER (src->filesrc)); } static gboolean gst_push_file_src_uri_set_uri (GstURIHandler * handler, const gchar * uri) { GstPushFileSrc *src = GST_PUSH_FILE_SRC (handler); if (src->filesrc == NULL || !g_str_has_prefix (uri, "pushfile://")) return FALSE; /* skip 'push' bit */ return gst_uri_handler_set_uri (GST_URI_HANDLER (src->filesrc), uri + 4); } static void gst_push_file_src_uri_handler_init (gpointer g_iface, gpointer iface_data) { GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; iface->get_type = gst_push_file_src_uri_get_type; iface->get_protocols = gst_push_file_src_uri_get_protocols; iface->get_uri = gst_push_file_src_uri_get_uri; iface->set_uri = gst_push_file_src_uri_set_uri; } gst-plugins-good-0.10.31/gst/debugutils/rndbuffersize.c0000644000175000017500000002511211677341655017777 00000000000000/* GStreamer * Copyright (C) 2007 Nokia Corporation (contact ) * * 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-rndbuffersize * * This element pulls buffers with random sizes from the source. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include GST_DEBUG_CATEGORY_STATIC (gst_rnd_buffer_size_debug); #define GST_CAT_DEFAULT gst_rnd_buffer_size_debug #define GST_TYPE_RND_BUFFER_SIZE (gst_rnd_buffer_size_get_type()) #define GST_RND_BUFFER_SIZE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RND_BUFFER_SIZE,GstRndBufferSize)) #define GST_RND_BUFFER_SIZE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RND_BUFFER_SIZE,GstRndBufferSizeClass)) #define GST_IS_RND_BUFFER_SIZE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RND_BUFFER_SIZE)) #define GST_IS_RND_BUFFER_SIZE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RND_BUFFER_SIZE)) typedef struct _GstRndBufferSize GstRndBufferSize; typedef struct _GstRndBufferSizeClass GstRndBufferSizeClass; struct _GstRndBufferSize { GstElement parent; /*< private > */ GRand *rand; gulong seed; glong min, max; GstPad *sinkpad, *srcpad; guint64 offset; }; struct _GstRndBufferSizeClass { GstElementClass parent_class; }; enum { ARG_SEED = 1, ARG_MINIMUM, ARG_MAXIMUM }; #define DEFAULT_SEED 0 #define DEFAULT_MIN 1 #define DEFAULT_MAX (8*1024) static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_rnd_buffer_size_finalize (GObject * object); static void gst_rnd_buffer_size_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rnd_buffer_size_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rnd_buffer_size_activate (GstPad * pad); static gboolean gst_rnd_buffer_size_activate_pull (GstPad * pad, gboolean active); static void gst_rnd_buffer_size_loop (GstRndBufferSize * self); static GstStateChangeReturn gst_rnd_buffer_size_change_state (GstElement * element, GstStateChange transition); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_rnd_buffer_size_debug, "rndbuffersize", 0, \ "rndbuffersize element"); GType gst_rnd_buffer_size_get_type (void); GST_BOILERPLATE_FULL (GstRndBufferSize, gst_rnd_buffer_size, GstElement, GST_TYPE_ELEMENT, DEBUG_INIT); static void gst_rnd_buffer_size_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (gstelement_class, &sink_template); gst_element_class_add_static_pad_template (gstelement_class, &src_template); gst_element_class_set_details_simple (gstelement_class, "Random buffer size", "Testing", "pull random sized buffers", "Stefan Kost "); } static void gst_rnd_buffer_size_class_init (GstRndBufferSizeClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gobject_class->set_property = gst_rnd_buffer_size_set_property; gobject_class->get_property = gst_rnd_buffer_size_get_property; gobject_class->finalize = gst_rnd_buffer_size_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_change_state); /* FIXME 0.11: these should all be int instead of long, to avoid bugs * when passing these as varargs with g_object_set(), and there was no * reason to use long in the first place here */ g_object_class_install_property (gobject_class, ARG_SEED, g_param_spec_ulong ("seed", "random number seed", "seed for randomness (initialized when going from READY to PAUSED)", 0, G_MAXUINT32, DEFAULT_SEED, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_MINIMUM, g_param_spec_long ("min", "mininum", "mininum buffer size", 0, G_MAXINT32, DEFAULT_MIN, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, ARG_MAXIMUM, g_param_spec_long ("max", "maximum", "maximum buffer size", 1, G_MAXINT32, DEFAULT_MAX, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); } static void gst_rnd_buffer_size_init (GstRndBufferSize * self, GstRndBufferSizeClass * g_class) { self->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_activate_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_activate)); gst_pad_set_activatepull_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_activate_pull)); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_template, "src"); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); } static void gst_rnd_buffer_size_finalize (GObject * object) { GstRndBufferSize *self = GST_RND_BUFFER_SIZE (object); if (self->rand) { g_rand_free (self->rand); self->rand = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rnd_buffer_size_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRndBufferSize *self = GST_RND_BUFFER_SIZE (object); switch (prop_id) { case ARG_SEED: self->seed = g_value_get_ulong (value); break; case ARG_MINIMUM: self->min = g_value_get_long (value); break; case ARG_MAXIMUM: self->max = g_value_get_long (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rnd_buffer_size_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRndBufferSize *self = GST_RND_BUFFER_SIZE (object); switch (prop_id) { case ARG_SEED: g_value_set_ulong (value, self->seed); break; case ARG_MINIMUM: g_value_set_long (value, self->min); break; case ARG_MAXIMUM: g_value_set_long (value, self->max); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_rnd_buffer_size_activate (GstPad * pad) { if (gst_pad_check_pull_range (pad)) { return gst_pad_activate_pull (pad, TRUE); } else { GST_INFO_OBJECT (pad, "push mode not supported"); return FALSE; } } static gboolean gst_rnd_buffer_size_activate_pull (GstPad * pad, gboolean active) { GstRndBufferSize *self = GST_RND_BUFFER_SIZE (GST_OBJECT_PARENT (pad)); if (active) { GST_INFO_OBJECT (self, "starting pull"); return gst_pad_start_task (pad, (GstTaskFunction) gst_rnd_buffer_size_loop, self); } else { GST_INFO_OBJECT (self, "stopping pull"); return gst_pad_stop_task (pad); } } static void gst_rnd_buffer_size_loop (GstRndBufferSize * self) { GstBuffer *buf = NULL; GstFlowReturn ret; guint num_bytes; if (G_UNLIKELY (self->min > self->max)) goto bogus_minmax; if (G_UNLIKELY (self->min != self->max)) { num_bytes = g_rand_int_range (self->rand, self->min, self->max); } else { num_bytes = self->min; } GST_LOG_OBJECT (self, "pulling %u bytes at offset %" G_GUINT64_FORMAT, num_bytes, self->offset); ret = gst_pad_pull_range (self->sinkpad, self->offset, num_bytes, &buf); if (ret != GST_FLOW_OK) goto pull_failed; if (GST_BUFFER_SIZE (buf) < num_bytes) { GST_WARNING_OBJECT (self, "short buffer: %u bytes", GST_BUFFER_SIZE (buf)); } self->offset += GST_BUFFER_SIZE (buf); ret = gst_pad_push (self->srcpad, buf); if (ret != GST_FLOW_OK) goto push_failed; return; pause_task: { GST_DEBUG_OBJECT (self, "pausing task"); gst_pad_pause_task (self->sinkpad); return; } pull_failed: { if (ret == GST_FLOW_UNEXPECTED) { GST_DEBUG_OBJECT (self, "eos"); gst_pad_push_event (self->srcpad, gst_event_new_eos ()); } else { GST_WARNING_OBJECT (self, "pull_range flow: %s", gst_flow_get_name (ret)); } goto pause_task; } push_failed: { GST_DEBUG_OBJECT (self, "push flow: %s", gst_flow_get_name (ret)); if (ret == GST_FLOW_UNEXPECTED) { GST_DEBUG_OBJECT (self, "eos"); gst_pad_push_event (self->srcpad, gst_event_new_eos ()); } else if (ret < GST_FLOW_UNEXPECTED || ret == GST_FLOW_NOT_LINKED) { GST_ELEMENT_ERROR (self, STREAM, FAILED, ("Internal data stream error."), ("streaming stopped, reason: %s", gst_flow_get_name (ret))); } goto pause_task; } bogus_minmax: { GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, ("The minimum buffer size is smaller than the maximum buffer size."), ("buffer sizes: max=%ld, min=%ld", self->min, self->max)); goto pause_task; } } static GstStateChangeReturn gst_rnd_buffer_size_change_state (GstElement * element, GstStateChange transition) { GstRndBufferSize *self = GST_RND_BUFFER_SIZE (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: self->offset = 0; if (!self->rand) { self->rand = g_rand_new_with_seed (self->seed); } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: if (self->rand) { g_rand_free (self->rand); self->rand = NULL; } break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gst-plugins-good-0.10.31/gst/debugutils/tests.h0000644000175000017500000000255111671175353016272 00000000000000/* GStreamer * Copyright (C) 2004 Benjamin Otte * * 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 #ifndef __GST_TESTS_H__ #define __GST_TESTS_H__ typedef struct _GstTestInfo GstTestInfo; struct _GstTestInfo { GParamSpec *(*get_spec) (const GstTestInfo * info, gboolean compare_value); gpointer (*new) (const GstTestInfo * info); void (*add) (gpointer test, GstBuffer * buffer); gboolean (*finish) (gpointer test, GValue * value); void (*get_value) (gpointer test, GValue * value); void (*free) (gpointer test); }; extern const GstTestInfo tests[]; /* keep up to date! */ #define TESTS_COUNT (4) #endif /* __GST_TESTS_H__ */ gst-plugins-good-0.10.31/gst/debugutils/gstdebug.c0000644000175000017500000000534211671175353016730 00000000000000/* GStreamer * Copyright (C) 2004 Benjamin Otte * * 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 GType gst_break_my_data_get_type (void); GType gst_caps_debug_get_type (void); GType gst_caps_setter_get_type (void); GType gst_rnd_buffer_size_get_type (void); GType gst_navseek_get_type (void); GType gst_progress_report_get_type (void); GType gst_tag_inject_get_type (void); GType gst_test_get_type (void); GType gst_push_file_src_get_type (void); /* GType gst_gst_negotiation_get_type (void); */ GType gst_cpu_report_get_type (void); static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "breakmydata", GST_RANK_NONE, gst_break_my_data_get_type ()) || !gst_element_register (plugin, "capssetter", GST_RANK_NONE, gst_caps_setter_get_type ()) || !gst_element_register (plugin, "rndbuffersize", GST_RANK_NONE, gst_rnd_buffer_size_get_type ()) || !gst_element_register (plugin, "navseek", GST_RANK_NONE, gst_navseek_get_type ()) || !gst_element_register (plugin, "pushfilesrc", GST_RANK_NONE, gst_push_file_src_get_type ()) || /* !gst_element_register (plugin, "negotiation", GST_RANK_NONE, gst_gst_negotiation_get_type ()) || */ !gst_element_register (plugin, "progressreport", GST_RANK_NONE, gst_progress_report_get_type ()) || !gst_element_register (plugin, "taginject", GST_RANK_NONE, gst_tag_inject_get_type ()) || !gst_element_register (plugin, "testsink", GST_RANK_NONE, gst_test_get_type ()) || !gst_element_register (plugin, "capsdebug", GST_RANK_NONE, gst_caps_debug_get_type ()) || !gst_element_register (plugin, "cpureport", GST_RANK_NONE, gst_cpu_report_get_type ())) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "debug", "elements for testing and debugging", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/debugutils/tests.c0000644000175000017500000001430711671175353016267 00000000000000/* GStreamer * Copyright (C) 2004 Benjamin Otte * * includes code based on glibc 2.2.3's crypt/md5.c, * Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc. * * 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 "tests.h" #include #include #include /* *** LENGTH *** */ typedef struct { gint64 value; } LengthTest; static GParamSpec * length_get_spec (const GstTestInfo * info, gboolean compare_value) { if (compare_value) { return g_param_spec_int64 ("expected-length", "expected length", "expected length of stream", -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); } else { return g_param_spec_int64 ("length", "length", "length of stream", -1, G_MAXINT64, -1, G_PARAM_READABLE); } } static gpointer length_new (const GstTestInfo * info) { return g_new0 (LengthTest, 1); } static void length_add (gpointer test, GstBuffer * buffer) { LengthTest *t = test; t->value += GST_BUFFER_SIZE (buffer); } static gboolean length_finish (gpointer test, GValue * value) { LengthTest *t = test; if (g_value_get_int64 (value) == -1) return TRUE; return t->value == g_value_get_int64 (value); } static void length_get_value (gpointer test, GValue * value) { LengthTest *t = test; g_value_set_int64 (value, t ? t->value : -1); } /* *** BUFFER COUNT *** */ static GParamSpec * buffer_count_get_spec (const GstTestInfo * info, gboolean compare_value) { if (compare_value) { return g_param_spec_int64 ("expected-buffer-count", "expected buffer count", "expected number of buffers in stream", -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); } else { return g_param_spec_int64 ("buffer-count", "buffer count", "number of buffers in stream", -1, G_MAXINT64, -1, G_PARAM_READABLE); } } static void buffer_count_add (gpointer test, GstBuffer * buffer) { LengthTest *t = test; t->value++; } /* *** TIMESTAMP / DURATION MATCHING *** */ typedef struct { guint64 diff; guint count; GstClockTime expected; } TimeDurTest; static GParamSpec * timedur_get_spec (const GstTestInfo * info, gboolean compare_value) { if (compare_value) { return g_param_spec_int64 ("allowed-timestamp-deviation", "allowed timestamp deviation", "allowed average difference in usec between timestamp of next buffer " "and expected timestamp from analyzing last buffer", -1, G_MAXINT64, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); } else { return g_param_spec_int64 ("timestamp-deviation", "timestamp deviation", "average difference in usec between timestamp of next buffer " "and expected timestamp from analyzing last buffer", -1, G_MAXINT64, -1, G_PARAM_READABLE); } } static gpointer timedur_new (const GstTestInfo * info) { TimeDurTest *ret = g_new0 (TimeDurTest, 1); ret->expected = GST_CLOCK_TIME_NONE; return ret; } static void timedur_add (gpointer test, GstBuffer * buffer) { TimeDurTest *t = test; if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && GST_CLOCK_TIME_IS_VALID (t->expected)) { t->diff += labs (GST_BUFFER_TIMESTAMP (buffer) - t->expected); t->count++; } if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && GST_BUFFER_DURATION_IS_VALID (buffer)) { t->expected = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer); } else { t->expected = GST_CLOCK_TIME_NONE; } } static gboolean timedur_finish (gpointer test, GValue * value) { TimeDurTest *t = test; if (g_value_get_int64 (value) == -1) return TRUE; return (t->diff / MAX (1, t->count)) <= g_value_get_int64 (value); } static void timedur_get_value (gpointer test, GValue * value) { TimeDurTest *t = test; g_value_set_int64 (value, t ? (t->diff / MAX (1, t->count)) : -1); } /* *** MD5 *** */ static GParamSpec * md5_get_spec (const GstTestInfo * info, gboolean compare_value) { if (compare_value) { return g_param_spec_string ("expected-md5", "expected md5", "expected md5 of processing the whole data", "---", G_PARAM_READWRITE | G_PARAM_CONSTRUCT); } else { return g_param_spec_string ("md5", "md5", "md5 of processing the whole data", "---", G_PARAM_READABLE); } } static gpointer md5_new (const GstTestInfo * info) { return g_checksum_new (G_CHECKSUM_MD5); } static void md5_add (gpointer checksum, GstBuffer * buffer) { g_checksum_update (checksum, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); } static gboolean md5_finish (gpointer checksum, GValue * value) { const gchar *expected, *result; expected = g_value_get_string (value); result = g_checksum_get_string (checksum); if (g_str_equal (expected, "---")) return TRUE; if (g_str_equal (expected, result)) return TRUE; return FALSE; } static void md5_get_value (gpointer checksum, GValue * value) { if (!checksum) { g_value_set_string (value, "---"); } else { g_value_set_string (value, g_checksum_get_string (checksum)); } } static void md5_free (gpointer checksum) { g_checksum_free (checksum); } /* *** TESTINFO *** */ const GstTestInfo tests[] = { {length_get_spec, length_new, length_add, length_finish, length_get_value, g_free}, {buffer_count_get_spec, length_new, buffer_count_add, length_finish, length_get_value, g_free}, {timedur_get_spec, timedur_new, timedur_add, timedur_finish, timedur_get_value, g_free}, {md5_get_spec, md5_new, md5_add, md5_finish, md5_get_value, md5_free} }; gst-plugins-good-0.10.31/gst/debugutils/gstcapssetter.c0000644000175000017500000002360211677341655020024 00000000000000/* GStreamer Element * Copyright (C) 2006-2009 Mark Nauwelaerts * * 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., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1307, USA. */ /** * SECTION:element-capssetter * * * * Sets or merges caps on a stream's buffers. * That is, a buffer's caps are updated using (fields of) * caps. Note that this may * contain multiple structures (though not likely recommended), but each * of these must be fixed (or will otherwise be rejected). * * * If join * is TRUE, then the incoming caps' mime-type is compared to the mime-type(s) * of provided caps and only matching structure(s) are considered for updating. * * * If replace * is TRUE, then any caps update is preceded by clearing existing fields, * making provided fields (as a whole) replace incoming ones. * Otherwise, no clearing is performed, in which case provided fields are * added/merged onto incoming caps * * * Although this element might mainly serve as debug helper, * it can also practically be used to correct a faulty pixel-aspect-ratio, * or to modify a yuv fourcc value to effectively swap chroma components or such * alike. * * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstcapssetter.h" #include GST_DEBUG_CATEGORY_STATIC (caps_setter_debug); #define GST_CAT_DEFAULT caps_setter_debug /* signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_CAPS, PROP_JOIN, PROP_REPLACE /* FILL ME */ }; #define DEFAULT_JOIN TRUE #define DEFAULT_REPLACE FALSE static GstStaticPadTemplate gst_caps_setter_src_template = GST_STATIC_PAD_TEMPLATE (GST_BASE_TRANSFORM_SRC_NAME, GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_caps_setter_sink_template = GST_STATIC_PAD_TEMPLATE (GST_BASE_TRANSFORM_SINK_NAME, GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static gboolean gst_caps_setter_transform_size (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize); static GstCaps *gst_caps_setter_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps); static GstFlowReturn gst_caps_setter_transform_ip (GstBaseTransform * btrans, GstBuffer * in); static void gst_caps_setter_finalize (GObject * object); static void gst_caps_setter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_caps_setter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstCapsSetter, gst_caps_setter, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_caps_setter_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "CapsSetter", "Generic", "Set/merge caps on stream", "Mark Nauwelaerts "); gst_element_class_add_static_pad_template (element_class, &gst_caps_setter_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_caps_setter_src_template); } static void gst_caps_setter_class_init (GstCapsSetterClass * g_class) { GObjectClass *gobject_class = (GObjectClass *) g_class; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) g_class; GST_DEBUG_CATEGORY_INIT (caps_setter_debug, "capssetter", 0, "capssetter"); gobject_class->set_property = gst_caps_setter_set_property; gobject_class->get_property = gst_caps_setter_get_property; gobject_class->finalize = gst_caps_setter_finalize; g_object_class_install_property (gobject_class, PROP_CAPS, g_param_spec_boxed ("caps", "Merge caps", "Merge these caps (thereby overwriting) in the stream", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_JOIN, g_param_spec_boolean ("join", "Join", "Match incoming caps' mime-type to mime-type of provided caps", DEFAULT_JOIN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_REPLACE, g_param_spec_boolean ("replace", "Replace", "Drop fields of incoming caps", DEFAULT_REPLACE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->transform_size = GST_DEBUG_FUNCPTR (gst_caps_setter_transform_size); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_caps_setter_transform_caps); /* dummy seems needed */ trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_caps_setter_transform_ip); } static void gst_caps_setter_init (GstCapsSetter * filter, GstCapsSetterClass * g_class) { filter->caps = gst_caps_new_any (); filter->join = DEFAULT_JOIN; filter->replace = DEFAULT_REPLACE; } static void gst_caps_setter_finalize (GObject * object) { GstCapsSetter *filter = GST_CAPS_SETTER (object); gst_caps_replace (&filter->caps, NULL); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_caps_setter_transform_size (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, guint size, GstCaps * othercaps, guint * othersize) { *othersize = size; return TRUE; } static GstCaps * gst_caps_setter_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps) { GstCapsSetter *filter = GST_CAPS_SETTER (trans); GstCaps *ret, *filter_caps; GstStructure *structure, *merge; const gchar *name; gint i, j; GST_DEBUG_OBJECT (trans, "receiving caps: %" GST_PTR_FORMAT, caps); ret = gst_caps_copy (caps); /* this function is always called with a simple caps */ if (!GST_CAPS_IS_SIMPLE (ret) || direction != GST_PAD_SINK) return ret; structure = gst_caps_get_structure (ret, 0); name = gst_structure_get_name (structure); GST_OBJECT_LOCK (filter); filter_caps = gst_caps_ref (filter->caps); GST_OBJECT_UNLOCK (filter); for (i = 0; i < gst_caps_get_size (filter_caps); ++i) { merge = gst_caps_get_structure (filter_caps, i); if (gst_structure_has_name (merge, name) || !filter->join) { if (!filter->join) gst_structure_set_name (structure, gst_structure_get_name (merge)); if (filter->replace) gst_structure_remove_all_fields (structure); for (j = 0; j < gst_structure_n_fields (merge); ++j) { const gchar *fname; fname = gst_structure_nth_field_name (merge, j); gst_structure_set_value (structure, fname, gst_structure_get_value (merge, fname)); } } } GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret); gst_caps_unref (filter_caps); return ret; } static GstFlowReturn gst_caps_setter_transform_ip (GstBaseTransform * btrans, GstBuffer * in) { return GST_FLOW_OK; } static gboolean gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value, gpointer unused) { return gst_value_is_fixed (value); } static void gst_caps_setter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstCapsSetter *filter = GST_CAPS_SETTER (object); switch (prop_id) { case PROP_CAPS:{ GstCaps *new_caps; const GstCaps *new_caps_val = gst_value_get_caps (value); gint i; if (new_caps_val == NULL) { new_caps = gst_caps_new_any (); } else { new_caps = gst_caps_copy (new_caps_val); } for (i = 0; new_caps && (i < gst_caps_get_size (new_caps)); ++i) { GstStructure *s; s = gst_caps_get_structure (new_caps, i); if (!gst_structure_foreach (s, gst_caps_is_fixed_foreach, NULL)) { GST_ERROR_OBJECT (filter, "rejected unfixed caps: %" GST_PTR_FORMAT, new_caps); gst_caps_unref (new_caps); new_caps = NULL; break; } } if (new_caps) { GST_OBJECT_LOCK (filter); gst_caps_replace (&filter->caps, new_caps); /* drop extra ref */ gst_caps_unref (new_caps); GST_OBJECT_UNLOCK (filter); GST_DEBUG_OBJECT (filter, "set new caps %" GST_PTR_FORMAT, new_caps); } /* try to activate these new caps next time around */ gst_base_transform_reconfigure (GST_BASE_TRANSFORM (filter)); break; } case PROP_JOIN: filter->join = g_value_get_boolean (value); break; case PROP_REPLACE: filter->replace = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_caps_setter_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstCapsSetter *filter = GST_CAPS_SETTER (object); switch (prop_id) { case PROP_CAPS: gst_value_set_caps (value, filter->caps); break; case PROP_JOIN: g_value_set_boolean (value, filter->join); break; case PROP_REPLACE: g_value_set_boolean (value, filter->replace); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/debugutils/efence.h0000644000175000017500000000160111671175353016350 00000000000000/* * efence.h */ #ifndef __GST_EFENCE_H__ #define __GST_EFENCE_H__ #include G_BEGIN_DECLS /* #define's don't like whitespacey bits */ #define GST_TYPE_EFENCE \ (gst_gst_efence_get_type()) #define GST_EFENCE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EFENCE,GstEFence)) #define GST_EFENCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EFENCE,GstEFenceClass)) #define GST_IS_EFENCE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EFENCE)) #define GST_IS_EFENCE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EFENCE)) typedef struct _GstEFence GstEFence; typedef struct _GstEFenceClass GstEFenceClass; struct _GstEFence { GstElement element; GstPad *sinkpad, *srcpad; gboolean fence_top; }; struct _GstEFenceClass { GstElementClass parent_class; }; GType gst_gst_efence_get_type (void); G_END_DECLS #endif /* __GST_EFENCE_H__ */ gst-plugins-good-0.10.31/gst/debugutils/cpureport.c0000644000175000017500000001021211677341655017145 00000000000000/* GStreamer Cpu Report Element * Copyright (C) <2010> Zaheer Abbas Merali * * 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 #include #include #include #include "cpureport.h" enum { ARG_0, }; GstStaticPadTemplate cpu_report_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GstStaticPadTemplate cpu_report_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstFlowReturn gst_cpu_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf); static gboolean gst_cpu_report_start (GstBaseTransform * trans); static gboolean gst_cpu_report_stop (GstBaseTransform * trans); GST_BOILERPLATE (GstCpuReport, gst_cpu_report, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_cpu_report_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &cpu_report_sink_template); gst_element_class_add_static_pad_template (element_class, &cpu_report_src_template); gst_element_class_set_details_simple (element_class, "CPU report", "Testing", "Post cpu usage information every buffer", "Zaheer Abbas Merali "); } static void gst_cpu_report_finalize (GObject * obj) { G_OBJECT_CLASS (parent_class)->finalize (obj); } static void gst_cpu_report_class_init (GstCpuReportClass * g_class) { GstBaseTransformClass *gstbasetrans_class; GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (g_class); gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (g_class); gobject_class->finalize = gst_cpu_report_finalize; gstbasetrans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_cpu_report_transform_ip); gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_cpu_report_start); gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_cpu_report_stop); } static void gst_cpu_report_init (GstCpuReport * report, GstCpuReportClass * g_class) { gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (report), TRUE); } static GstFlowReturn gst_cpu_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstCpuReport *filter; GTimeVal cur_time; clock_t cur_cpu_time; GstMessage *msg; GstStructure *s; gint64 time_taken; g_get_current_time (&cur_time); cur_cpu_time = clock (); filter = GST_CPU_REPORT (trans); time_taken = GST_TIMEVAL_TO_TIME (cur_time) - GST_TIMEVAL_TO_TIME (filter->last_time); s = gst_structure_new ("cpu-report", "cpu-time", G_TYPE_DOUBLE, ((gdouble) (cur_cpu_time - filter->last_cpu_time)), "actual-time", G_TYPE_INT64, time_taken, "buffer-time", G_TYPE_INT64, GST_BUFFER_TIMESTAMP (buf), NULL); msg = gst_message_new_element (GST_OBJECT_CAST (filter), s); gst_element_post_message (GST_ELEMENT_CAST (filter), msg); filter->last_time = cur_time; filter->last_cpu_time = cur_cpu_time; return GST_FLOW_OK; } static gboolean gst_cpu_report_start (GstBaseTransform * trans) { GstCpuReport *filter; filter = GST_CPU_REPORT (trans); g_get_current_time (&filter->last_time); filter->start_time = filter->last_time; filter->last_cpu_time = clock (); return TRUE; } static gboolean gst_cpu_report_stop (GstBaseTransform * trans) { /* anything we should be doing here? */ return TRUE; } gst-plugins-good-0.10.31/gst/debugutils/gstnavigationtest.c0000644000175000017500000002455711677341655020720 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * 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 "gstnavigationtest.h" #include #include #include #ifdef _MSC_VER #define rint(x) (floor((x)+0.5)) #endif GST_DEBUG_CATEGORY_STATIC (navigationtest_debug); #define GST_CAT_DEFAULT navigationtest_debug static GstStaticPadTemplate gst_navigationtest_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstStaticPadTemplate gst_navigationtest_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) ); static GstVideoFilterClass *parent_class = NULL; static gboolean gst_navigationtest_handle_src_event (GstPad * pad, GstEvent * event) { GstNavigationtest *navtest; const gchar *type; navtest = GST_NAVIGATIONTEST (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: { const GstStructure *s = gst_event_get_structure (event); gint fps_n, fps_d; fps_n = gst_value_get_fraction_numerator ((&navtest->framerate)); fps_d = gst_value_get_fraction_denominator ((&navtest->framerate)); type = gst_structure_get_string (s, "event"); if (g_str_equal (type, "mouse-move")) { gst_structure_get_double (s, "pointer_x", &navtest->x); gst_structure_get_double (s, "pointer_y", &navtest->y); } else if (g_str_equal (type, "mouse-button-press")) { ButtonClick *click = g_new (ButtonClick, 1); gst_structure_get_double (s, "pointer_x", &click->x); gst_structure_get_double (s, "pointer_y", &click->y); click->images_left = (fps_n + fps_d - 1) / fps_d; /* green */ click->cy = 150; click->cu = 46; click->cv = 21; navtest->clicks = g_slist_prepend (navtest->clicks, click); } else if (g_str_equal (type, "mouse-button-release")) { ButtonClick *click = g_new (ButtonClick, 1); gst_structure_get_double (s, "pointer_x", &click->x); gst_structure_get_double (s, "pointer_y", &click->y); click->images_left = (fps_n + fps_d - 1) / fps_d; /* red */ click->cy = 76; click->cu = 85; click->cv = 255; navtest->clicks = g_slist_prepend (navtest->clicks, click); } break; } default: break; } return gst_pad_event_default (pad, event); } /* Useful macros */ #define GST_VIDEO_I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width)) #define GST_VIDEO_I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2) #define GST_VIDEO_I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(GST_VIDEO_I420_Y_ROWSTRIDE(width)))/2) #define GST_VIDEO_I420_Y_OFFSET(w,h) (0) #define GST_VIDEO_I420_U_OFFSET(w,h) (GST_VIDEO_I420_Y_OFFSET(w,h)+(GST_VIDEO_I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h))) #define GST_VIDEO_I420_V_OFFSET(w,h) (GST_VIDEO_I420_U_OFFSET(w,h)+(GST_VIDEO_I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) #define GST_VIDEO_I420_SIZE(w,h) (GST_VIDEO_I420_V_OFFSET(w,h)+(GST_VIDEO_I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2)) static gboolean gst_navigationtest_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, guint * size) { GstNavigationtest *navtest; GstStructure *structure; gboolean ret = FALSE; gint width, height; navtest = GST_NAVIGATIONTEST (btrans); structure = gst_caps_get_structure (caps, 0); if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { *size = GST_VIDEO_I420_SIZE (width, height); ret = TRUE; GST_DEBUG_OBJECT (navtest, "our frame size is %d bytes (%dx%d)", *size, width, height); } return ret; } static gboolean gst_navigationtest_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstNavigationtest *navtest = GST_NAVIGATIONTEST (btrans); gboolean ret = FALSE; GstStructure *structure; structure = gst_caps_get_structure (incaps, 0); if (gst_structure_get_int (structure, "width", &navtest->width) && gst_structure_get_int (structure, "height", &navtest->height)) { const GValue *framerate; framerate = gst_structure_get_value (structure, "framerate"); if (framerate && GST_VALUE_HOLDS_FRACTION (framerate)) { g_value_copy (framerate, &navtest->framerate); ret = TRUE; } } return ret; } static void draw_box_planar411 (guint8 * dest, int width, int height, int x, int y, guint8 colory, guint8 coloru, guint8 colorv) { int x1, x2, y1, y2; guint8 *d = dest; if (x < 0 || y < 0 || x >= width || y >= height) return; x1 = MAX (x - 5, 0); x2 = MIN (x + 5, width); y1 = MAX (y - 5, 0); y2 = MIN (y + 5, height); for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { ((guint8 *) d)[y * GST_VIDEO_I420_Y_ROWSTRIDE (width) + x] = colory; } } d = dest + GST_VIDEO_I420_U_OFFSET (width, height); x1 /= 2; x2 /= 2; y1 /= 2; y2 /= 2; for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { ((guint8 *) d)[y * GST_VIDEO_I420_U_ROWSTRIDE (width) + x] = coloru; } } d = dest + GST_VIDEO_I420_V_OFFSET (width, height); for (y = y1; y < y2; y++) { for (x = x1; x < x2; x++) { ((guint8 *) d)[y * GST_VIDEO_I420_V_ROWSTRIDE (width) + x] = colorv; } } } static GstFlowReturn gst_navigationtest_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstNavigationtest *navtest = GST_NAVIGATIONTEST (trans); GSList *walk; GstFlowReturn ret = GST_FLOW_OK; /* do something interesting here. This simply copies the source * to the destination. */ gst_buffer_copy_metadata (out, in, GST_BUFFER_COPY_TIMESTAMPS); memcpy (GST_BUFFER_DATA (out), GST_BUFFER_DATA (in), MIN (GST_BUFFER_SIZE (in), GST_BUFFER_SIZE (out))); walk = navtest->clicks; while (walk) { ButtonClick *click = walk->data; walk = g_slist_next (walk); draw_box_planar411 (GST_BUFFER_DATA (out), navtest->width, navtest->height, rint (click->x), rint (click->y), click->cy, click->cu, click->cv); if (--click->images_left < 1) { navtest->clicks = g_slist_remove (navtest->clicks, click); g_free (click); } } draw_box_planar411 (GST_BUFFER_DATA (out), navtest->width, navtest->height, rint (navtest->x), rint (navtest->y), 0, 128, 128); return ret; } static GstStateChangeReturn gst_navigationtest_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstNavigationtest *navtest = GST_NAVIGATIONTEST (element); if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); /* downwards state changes */ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: { g_slist_foreach (navtest->clicks, (GFunc) g_free, NULL); g_slist_free (navtest->clicks); navtest->clicks = NULL; break; } default: break; } return ret; } static void gst_navigationtest_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Video navigation test", "Filter/Effect/Video", "Handle navigation events showing a black square following mouse pointer", "David Schleef "); gst_element_class_add_static_pad_template (element_class, &gst_navigationtest_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_navigationtest_src_template); } static void gst_navigationtest_class_init (gpointer klass, gpointer class_data) { GstElementClass *element_class; GstBaseTransformClass *trans_class; element_class = (GstElementClass *) klass; trans_class = (GstBaseTransformClass *) klass; parent_class = g_type_class_peek_parent (klass); element_class->change_state = GST_DEBUG_FUNCPTR (gst_navigationtest_change_state); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_navigationtest_set_caps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_navigationtest_get_unit_size); trans_class->transform = GST_DEBUG_FUNCPTR (gst_navigationtest_transform); } static void gst_navigationtest_init (GTypeInstance * instance, gpointer g_class) { GstNavigationtest *navtest = GST_NAVIGATIONTEST (instance); GstBaseTransform *btrans = GST_BASE_TRANSFORM (instance); gst_pad_set_event_function (btrans->srcpad, GST_DEBUG_FUNCPTR (gst_navigationtest_handle_src_event)); navtest->x = -1; navtest->y = -1; g_value_init (&navtest->framerate, GST_TYPE_FRACTION); } GType gst_navigationtest_get_type (void) { static GType navigationtest_type = 0; if (!navigationtest_type) { static const GTypeInfo navigationtest_info = { sizeof (GstNavigationtestClass), gst_navigationtest_base_init, NULL, gst_navigationtest_class_init, NULL, NULL, sizeof (GstNavigationtest), 0, gst_navigationtest_init, }; navigationtest_type = g_type_register_static (GST_TYPE_VIDEO_FILTER, "GstNavigationtest", &navigationtest_info, 0); } return navigationtest_type; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (navigationtest_debug, "navigationtest", 0, "navigationtest"); return gst_element_register (plugin, "navigationtest", GST_RANK_NONE, GST_TYPE_NAVIGATIONTEST); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "navigationtest", "Template for a video filter", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/debugutils/Makefile.in0000644000175000017500000013404711720560231017016 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/debugutils DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstdebug_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstdebug_la_OBJECTS = libgstdebug_la-gstdebug.lo \ libgstdebug_la-breakmydata.lo libgstdebug_la-gstcapsdebug.lo \ libgstdebug_la-gstcapssetter.lo libgstdebug_la-gstnavseek.lo \ libgstdebug_la-gstpushfilesrc.lo \ libgstdebug_la-gsttaginject.lo libgstdebug_la-rndbuffersize.lo \ libgstdebug_la-progressreport.lo libgstdebug_la-tests.lo \ libgstdebug_la-cpureport.lo libgstdebug_la-testplugin.lo libgstdebug_la_OBJECTS = $(am_libgstdebug_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstdebug_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstdebug_la_CFLAGS) $(CFLAGS) \ $(libgstdebug_la_LDFLAGS) $(LDFLAGS) -o $@ libgstefence_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgstefence_la_OBJECTS = libgstefence_la-efence.lo libgstefence_la_OBJECTS = $(am_libgstefence_la_OBJECTS) libgstefence_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstefence_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstefence_la_CFLAGS) $(CFLAGS) \ $(libgstefence_la_LDFLAGS) $(LDFLAGS) -o $@ @GST_HAVE_MMAP_TRUE@am_libgstefence_la_rpath = -rpath $(plugindir) libgstnavigationtest_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstnavigationtest_la_OBJECTS = \ libgstnavigationtest_la-gstnavigationtest.lo libgstnavigationtest_la_OBJECTS = \ $(am_libgstnavigationtest_la_OBJECTS) libgstnavigationtest_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstnavigationtest_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstnavigationtest_la_CFLAGS) \ $(CFLAGS) $(libgstnavigationtest_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstdebug_la_SOURCES) $(libgstefence_la_SOURCES) \ $(libgstnavigationtest_la_SOURCES) DIST_SOURCES = $(libgstdebug_la_SOURCES) $(libgstefence_la_SOURCES) \ $(libgstnavigationtest_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @GST_HAVE_MMAP_FALSE@EFENCE_PLUGIN = @GST_HAVE_MMAP_TRUE@EFENCE_PLUGIN = libgstefence.la plugin_LTLIBRARIES = $(EFENCE_PLUGIN) libgstdebug.la libgstnavigationtest.la noinst_HEADERS = \ cpureport.h \ efence.h \ gstcapsdebug.h \ gstcapssetter.h \ gstnavigationtest.h \ gstnavseek.h \ gstpushfilesrc.h \ gsttaginject.h \ progressreport.h \ tests.h libgstefence_la_SOURCES = efence.c libgstefence_la_CFLAGS = $(GST_CFLAGS) libgstefence_la_LIBADD = $(GST_LIBS) libgstefence_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstefence_la_LIBTOOLFLAGS = --tag=disable-static libgstnavigationtest_la_SOURCES = gstnavigationtest.c libgstnavigationtest_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_PLUGINS_BASE_CFLAGS) libgstnavigationtest_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ $(LIBM) libgstnavigationtest_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstnavigationtest_la_LIBTOOLFLAGS = --tag=disable-static libgstdebug_la_SOURCES = \ gstdebug.c \ breakmydata.c \ gstcapsdebug.c \ gstcapssetter.c \ gstnavseek.c \ gstpushfilesrc.c \ gsttaginject.c \ rndbuffersize.c \ progressreport.c \ tests.c \ cpureport.c \ testplugin.c libgstdebug_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstdebug_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstdebug_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstdebug_la_LIBTOOLFLAGS = --tag=disable-static all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/debugutils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/debugutils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstdebug.la: $(libgstdebug_la_OBJECTS) $(libgstdebug_la_DEPENDENCIES) $(EXTRA_libgstdebug_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstdebug_la_LINK) -rpath $(plugindir) $(libgstdebug_la_OBJECTS) $(libgstdebug_la_LIBADD) $(LIBS) libgstefence.la: $(libgstefence_la_OBJECTS) $(libgstefence_la_DEPENDENCIES) $(EXTRA_libgstefence_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstefence_la_LINK) $(am_libgstefence_la_rpath) $(libgstefence_la_OBJECTS) $(libgstefence_la_LIBADD) $(LIBS) libgstnavigationtest.la: $(libgstnavigationtest_la_OBJECTS) $(libgstnavigationtest_la_DEPENDENCIES) $(EXTRA_libgstnavigationtest_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstnavigationtest_la_LINK) -rpath $(plugindir) $(libgstnavigationtest_la_OBJECTS) $(libgstnavigationtest_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-breakmydata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-cpureport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstcapsdebug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstcapssetter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstdebug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstnavseek.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gstpushfilesrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-gsttaginject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-progressreport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-rndbuffersize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-testplugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdebug_la-tests.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstefence_la-efence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstdebug_la-gstdebug.lo: gstdebug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstdebug.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstdebug.Tpo -c -o libgstdebug_la-gstdebug.lo `test -f 'gstdebug.c' || echo '$(srcdir)/'`gstdebug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstdebug.Tpo $(DEPDIR)/libgstdebug_la-gstdebug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdebug.c' object='libgstdebug_la-gstdebug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstdebug.lo `test -f 'gstdebug.c' || echo '$(srcdir)/'`gstdebug.c libgstdebug_la-breakmydata.lo: breakmydata.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-breakmydata.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-breakmydata.Tpo -c -o libgstdebug_la-breakmydata.lo `test -f 'breakmydata.c' || echo '$(srcdir)/'`breakmydata.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-breakmydata.Tpo $(DEPDIR)/libgstdebug_la-breakmydata.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='breakmydata.c' object='libgstdebug_la-breakmydata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-breakmydata.lo `test -f 'breakmydata.c' || echo '$(srcdir)/'`breakmydata.c libgstdebug_la-gstcapsdebug.lo: gstcapsdebug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstcapsdebug.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstcapsdebug.Tpo -c -o libgstdebug_la-gstcapsdebug.lo `test -f 'gstcapsdebug.c' || echo '$(srcdir)/'`gstcapsdebug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstcapsdebug.Tpo $(DEPDIR)/libgstdebug_la-gstcapsdebug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcapsdebug.c' object='libgstdebug_la-gstcapsdebug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstcapsdebug.lo `test -f 'gstcapsdebug.c' || echo '$(srcdir)/'`gstcapsdebug.c libgstdebug_la-gstcapssetter.lo: gstcapssetter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstcapssetter.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstcapssetter.Tpo -c -o libgstdebug_la-gstcapssetter.lo `test -f 'gstcapssetter.c' || echo '$(srcdir)/'`gstcapssetter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstcapssetter.Tpo $(DEPDIR)/libgstdebug_la-gstcapssetter.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstcapssetter.c' object='libgstdebug_la-gstcapssetter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstcapssetter.lo `test -f 'gstcapssetter.c' || echo '$(srcdir)/'`gstcapssetter.c libgstdebug_la-gstnavseek.lo: gstnavseek.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstnavseek.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstnavseek.Tpo -c -o libgstdebug_la-gstnavseek.lo `test -f 'gstnavseek.c' || echo '$(srcdir)/'`gstnavseek.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstnavseek.Tpo $(DEPDIR)/libgstdebug_la-gstnavseek.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstnavseek.c' object='libgstdebug_la-gstnavseek.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstnavseek.lo `test -f 'gstnavseek.c' || echo '$(srcdir)/'`gstnavseek.c libgstdebug_la-gstpushfilesrc.lo: gstpushfilesrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gstpushfilesrc.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gstpushfilesrc.Tpo -c -o libgstdebug_la-gstpushfilesrc.lo `test -f 'gstpushfilesrc.c' || echo '$(srcdir)/'`gstpushfilesrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gstpushfilesrc.Tpo $(DEPDIR)/libgstdebug_la-gstpushfilesrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstpushfilesrc.c' object='libgstdebug_la-gstpushfilesrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gstpushfilesrc.lo `test -f 'gstpushfilesrc.c' || echo '$(srcdir)/'`gstpushfilesrc.c libgstdebug_la-gsttaginject.lo: gsttaginject.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-gsttaginject.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-gsttaginject.Tpo -c -o libgstdebug_la-gsttaginject.lo `test -f 'gsttaginject.c' || echo '$(srcdir)/'`gsttaginject.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-gsttaginject.Tpo $(DEPDIR)/libgstdebug_la-gsttaginject.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttaginject.c' object='libgstdebug_la-gsttaginject.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-gsttaginject.lo `test -f 'gsttaginject.c' || echo '$(srcdir)/'`gsttaginject.c libgstdebug_la-rndbuffersize.lo: rndbuffersize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-rndbuffersize.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-rndbuffersize.Tpo -c -o libgstdebug_la-rndbuffersize.lo `test -f 'rndbuffersize.c' || echo '$(srcdir)/'`rndbuffersize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-rndbuffersize.Tpo $(DEPDIR)/libgstdebug_la-rndbuffersize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rndbuffersize.c' object='libgstdebug_la-rndbuffersize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-rndbuffersize.lo `test -f 'rndbuffersize.c' || echo '$(srcdir)/'`rndbuffersize.c libgstdebug_la-progressreport.lo: progressreport.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-progressreport.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-progressreport.Tpo -c -o libgstdebug_la-progressreport.lo `test -f 'progressreport.c' || echo '$(srcdir)/'`progressreport.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-progressreport.Tpo $(DEPDIR)/libgstdebug_la-progressreport.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='progressreport.c' object='libgstdebug_la-progressreport.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-progressreport.lo `test -f 'progressreport.c' || echo '$(srcdir)/'`progressreport.c libgstdebug_la-tests.lo: tests.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-tests.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-tests.Tpo -c -o libgstdebug_la-tests.lo `test -f 'tests.c' || echo '$(srcdir)/'`tests.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-tests.Tpo $(DEPDIR)/libgstdebug_la-tests.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests.c' object='libgstdebug_la-tests.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-tests.lo `test -f 'tests.c' || echo '$(srcdir)/'`tests.c libgstdebug_la-cpureport.lo: cpureport.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-cpureport.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-cpureport.Tpo -c -o libgstdebug_la-cpureport.lo `test -f 'cpureport.c' || echo '$(srcdir)/'`cpureport.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-cpureport.Tpo $(DEPDIR)/libgstdebug_la-cpureport.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cpureport.c' object='libgstdebug_la-cpureport.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-cpureport.lo `test -f 'cpureport.c' || echo '$(srcdir)/'`cpureport.c libgstdebug_la-testplugin.lo: testplugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -MT libgstdebug_la-testplugin.lo -MD -MP -MF $(DEPDIR)/libgstdebug_la-testplugin.Tpo -c -o libgstdebug_la-testplugin.lo `test -f 'testplugin.c' || echo '$(srcdir)/'`testplugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdebug_la-testplugin.Tpo $(DEPDIR)/libgstdebug_la-testplugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testplugin.c' object='libgstdebug_la-testplugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdebug_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdebug_la_CFLAGS) $(CFLAGS) -c -o libgstdebug_la-testplugin.lo `test -f 'testplugin.c' || echo '$(srcdir)/'`testplugin.c libgstefence_la-efence.lo: efence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstefence_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstefence_la_CFLAGS) $(CFLAGS) -MT libgstefence_la-efence.lo -MD -MP -MF $(DEPDIR)/libgstefence_la-efence.Tpo -c -o libgstefence_la-efence.lo `test -f 'efence.c' || echo '$(srcdir)/'`efence.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstefence_la-efence.Tpo $(DEPDIR)/libgstefence_la-efence.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='efence.c' object='libgstefence_la-efence.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstefence_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstefence_la_CFLAGS) $(CFLAGS) -c -o libgstefence_la-efence.lo `test -f 'efence.c' || echo '$(srcdir)/'`efence.c libgstnavigationtest_la-gstnavigationtest.lo: gstnavigationtest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnavigationtest_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnavigationtest_la_CFLAGS) $(CFLAGS) -MT libgstnavigationtest_la-gstnavigationtest.lo -MD -MP -MF $(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Tpo -c -o libgstnavigationtest_la-gstnavigationtest.lo `test -f 'gstnavigationtest.c' || echo '$(srcdir)/'`gstnavigationtest.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Tpo $(DEPDIR)/libgstnavigationtest_la-gstnavigationtest.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstnavigationtest.c' object='libgstnavigationtest_la-gstnavigationtest.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnavigationtest_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnavigationtest_la_CFLAGS) $(CFLAGS) -c -o libgstnavigationtest_la-gstnavigationtest.lo `test -f 'gstnavigationtest.c' || echo '$(srcdir)/'`gstnavigationtest.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstdebug -:SHARED libgstdebug \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstdebug_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstdebug_la_CFLAGS) \ -:LDFLAGS $(libgstdebug_la_LDFLAGS) \ $(libgstdebug_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/debugutils/gstcapssetter.h0000644000175000017500000000347311671175353020027 00000000000000/* GStreamer Element * Copyright (C) 2006-2009 Mark Nauwelaerts * * 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., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1307, USA. */ #ifndef __GST_CAPS_SETTER_H__ #define __GST_CAPS_SETTER_H__ #include G_BEGIN_DECLS #define GST_TYPE_CAPS_SETTER \ (gst_caps_setter_get_type()) #define GST_CAPS_SETTER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAPS_SETTER,GstCapsSetter)) #define GST_CAPS_SETTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAPS_SETTER,GstCapsSetterClass)) #define GST_IS_CAPS_SETTER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAPS_SETTER)) #define GST_IS_CAPS_SETTER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAPS_SETTER)) GType gst_caps_setter_get_type (void); typedef struct _GstCapsSetter GstCapsSetter; typedef struct _GstCapsSetterClass GstCapsSetterClass; struct _GstCapsSetter { GstBaseTransform parent; /* < private > */ /* properties */ GstCaps *caps; gboolean join; gboolean replace; }; struct _GstCapsSetterClass { GstBaseTransformClass parent_class; }; G_END_DECLS #endif /* __GST_CAPS_SETTER_H__ */ gst-plugins-good-0.10.31/gst/debugutils/gsttaginject.h0000644000175000017500000000352411671175353017617 00000000000000/* GStreamer * Copyright (C) 2008 Stefan Kost * * gsttaginject.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_TAG_INJECT_H__ #define __GST_TAG_INJECT_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_TAG_INJECT \ (gst_tag_inject_get_type()) #define GST_TAG_INJECT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TAG_INJECT,GstTagInject)) #define GST_TAG_INJECT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TAG_INJECT,GstTagInjectClass)) #define GST_IS_TAG_INJECT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TAG_INJECT)) #define GST_IS_TAG_INJECT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TAG_INJECT)) typedef struct _GstTagInject GstTagInject; typedef struct _GstTagInjectClass GstTagInjectClass; /** * GstTagInject: * * Opaque #GstTagInject data structure */ struct _GstTagInject { GstBaseTransform element; /*< private > */ GstTagList *tags; gboolean tags_sent; }; struct _GstTagInjectClass { GstBaseTransformClass parent_class; }; GType gst_tag_inject_get_type (void); G_END_DECLS #endif /* __GST_TAG_INJECT_H__ */ gst-plugins-good-0.10.31/gst/debugutils/progressreport.h0000644000175000017500000000441311671175353020227 00000000000000/* GStreamer Progress Report Element * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2004> Jan Schmidt * Copyright (C) <2006> Tim-Philipp Müller * * 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_PROGRESS_REPORT_H__ #define __GST_PROGRESS_REPORT_H__ #include G_BEGIN_DECLS #define GST_TYPE_PROGRESS_REPORT \ (gst_progress_report_get_type()) #define GST_PROGRESS_REPORT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PROGRESS_REPORT,GstProgressReport)) #define GST_PROGRESS_REPORT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PROGRESS_REPORT,GstProgressReportClass)) #define GST_IS_PROGRESS_REPORT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PROGRESS_REPORT)) #define GST_IS_PROGRESS_REPORT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PROGRESS_REPORT)) typedef struct _GstProgressReport GstProgressReport; typedef struct _GstProgressReportClass GstProgressReportClass; struct _GstProgressReport { GstBaseTransform basetransform; GstMessage *pending_msg; gint update_freq; gboolean silent; gboolean do_query; GTimeVal start_time; GTimeVal last_report; /* Format used for querying. Using a string here because the * format might not be registered yet when the property is set */ gchar *format; }; struct _GstProgressReportClass { GstBaseTransformClass parent_class; }; GType gst_progress_report_get_type (void); G_END_DECLS #endif /* __GST_PROGRESS_REPORT_H__ */ gst-plugins-good-0.10.31/gst/videobox/0000755000175000017500000000000011720565315014500 500000000000000gst-plugins-good-0.10.31/gst/videobox/gstvideoboxorc.orc0000644000175000017500000000010711671175354020171 00000000000000 .function orc_splat_u32 .dest 4 d1 guint32 .param 4 p1 copyl d1, p1 gst-plugins-good-0.10.31/gst/videobox/gstvideobox.c0000644000175000017500000033367311712574371017143 00000000000000/* GStreamer * Copyright (C) 1999 Erik Walthinsen * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2010 Sebastian Dröge * * 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-videobox * @see_also: #GstVideoCrop * * This plugin crops or enlarges the image. It takes 4 values as input, a * top, bottom, left and right offset. Positive values will crop that much * pixels from the respective border of the image, negative values will add * that much pixels. When pixels are added, you can specify their color. * Some predefined colors are usable with an enum property. * * The plugin is alpha channel aware and will try to negotiate with a format * that supports alpha channels first. When alpha channel is active two * other properties, alpha and border_alpha can be used to set the alpha * values of the inner picture and the border respectively. an alpha value of * 0.0 means total transparency, 1.0 is opaque. * * The videobox plugin has many uses such as doing a mosaic of pictures, * letterboxing video, cutting out pieces of video, picture in picture, etc.. * * Setting autocrop to true changes the behavior of the plugin so that * caps determine crop properties rather than the other way around: given * input and output dimensions, the crop values are selected so that the * smaller frame is effectively centered in the larger frame. This * involves either cropping or padding. * * If you use autocrop there is little point in setting the other * properties manually because they will be overriden if the caps change, * but nothing stops you from doing so. * * Sample pipeline: * |[ * gst-launch videotestsrc ! videobox autocrop=true ! \ * "video/x-raw-yuv, width=600, height=400" ! ffmpegcolorspace ! ximagesink * ]| */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstvideobox.h" #include "gstvideoboxorc.h" #include #include #include #include "gst/glib-compat-private.h" GST_DEBUG_CATEGORY_STATIC (videobox_debug); #define GST_CAT_DEFAULT videobox_debug /* From videotestsrc.c */ static const guint8 yuv_sdtv_colors_Y[VIDEO_BOX_FILL_LAST] = { 16, 145, 41, 81, 210, 235 }; static const guint8 yuv_sdtv_colors_U[VIDEO_BOX_FILL_LAST] = { 128, 54, 240, 90, 16, 128 }; static const guint8 yuv_sdtv_colors_V[VIDEO_BOX_FILL_LAST] = { 128, 34, 110, 240, 146, 128 }; static const guint8 yuv_hdtv_colors_Y[VIDEO_BOX_FILL_LAST] = { 16, 173, 32, 63, 219, 235 }; static const guint8 yuv_hdtv_colors_U[VIDEO_BOX_FILL_LAST] = { 128, 42, 240, 102, 16, 128 }; static const guint8 yuv_hdtv_colors_V[VIDEO_BOX_FILL_LAST] = { 128, 26, 118, 240, 138, 128 }; static const guint8 rgb_colors_R[VIDEO_BOX_FILL_LAST] = { 0, 0, 0, 255, 255, 255 }; static const guint8 rgb_colors_G[VIDEO_BOX_FILL_LAST] = { 0, 255, 0, 0, 255, 255 }; static const guint8 rgb_colors_B[VIDEO_BOX_FILL_LAST] = { 0, 0, 255, 0, 0, 255 }; /* Generated by -bad/ext/cog/generate_tables */ static const int cog_ycbcr_to_rgb_matrix_8bit_hdtv[] = { 298, 0, 459, -63514, 298, -55, -136, 19681, 298, 541, 0, -73988, }; static const int cog_ycbcr_to_rgb_matrix_8bit_sdtv[] = { 298, 0, 409, -57068, 298, -100, -208, 34707, 298, 516, 0, -70870, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_hdtv[] = { 47, 157, 16, 4096, -26, -87, 112, 32768, 112, -102, -10, 32768, }; static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = { 66, 129, 25, 4096, -38, -74, 112, 32768, 112, -94, -18, 32768, }; static const gint cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit[] = { 256, -30, -53, 10600, 0, 261, 29, -4367, 0, 19, 262, -3289, }; static const gint cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit[] = { 256, 25, 49, -9536, 0, 253, -28, 3958, 0, -19, 252, 2918, }; static const gint cog_identity_matrix_8bit[] = { 256, 0, 0, 0, 0, 256, 0, 0, 0, 0, 256, 0, }; #define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8) static void fill_ayuv (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, gint height) { guint32 empty_pixel; b_alpha = CLAMP (b_alpha, 0, 255); if (sdtv) empty_pixel = GUINT32_FROM_BE ((b_alpha << 24) | (yuv_sdtv_colors_Y[fill_type] << 16) | (yuv_sdtv_colors_U[fill_type] << 8) | yuv_sdtv_colors_V[fill_type]); else empty_pixel = GUINT32_FROM_BE ((b_alpha << 24) | (yuv_hdtv_colors_Y[fill_type] << 16) | (yuv_hdtv_colors_U[fill_type] << 8) | yuv_hdtv_colors_V[fill_type]); orc_splat_u32 ((guint32 *) dest, empty_pixel, width * height); } static void copy_ayuv_ayuv (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; gint src_stride = 4 * src_width; gint dest_stride = 4 * dest_width; dest = dest + dest_y * dest_width * 4 + dest_x * 4; src = src + src_y * src_width * 4 + src_x * 4; w *= 4; if (dest_sdtv != src_sdtv) { gint matrix[12]; gint y, u, v; memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { /* ORC FIXME */ dest[j] = (src[j] * i_alpha) >> 8; y = src[j + 1]; u = src[j + 2]; v = src[j + 3]; dest[j + 1] = APPLY_MATRIX (matrix, 0, y, u, v); dest[j + 2] = APPLY_MATRIX (matrix, 1, y, u, v); dest[j + 3] = APPLY_MATRIX (matrix, 2, y, u, v); } dest += dest_stride; src += src_stride; } } else { for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { /* ORC FIXME */ dest[j] = (src[j] * i_alpha) >> 8; dest[j + 1] = src[j + 1]; dest[j + 2] = src[j + 2]; dest[j + 3] = src[j + 3]; } dest += dest_stride; src += src_stride; } } } static void copy_ayuv_i420 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; guint8 *destY, *destY2, *destU, *destV; gint dest_strideY, dest_strideUV; const guint8 *src2; gint src_stride; gint y_idx, uv_idx; gint y1, y2, y3, y4; gint u1, u2, u3, u4; gint v1, v2, v3, v4; gint matrix[12]; dest_strideY = gst_video_format_get_row_stride (dest_format, 0, dest_width); dest_strideUV = gst_video_format_get_row_stride (dest_format, 1, dest_width); src_stride = 4 * src_width; destY = dest + gst_video_format_get_component_offset (dest_format, 0, dest_width, dest_height); destU = dest + gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); destV = dest + gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); destY = destY + dest_y * dest_strideY + dest_x; destY2 = (dest_y < dest_height) ? destY + dest_strideY : destY; destU = destU + (dest_y / 2) * dest_strideUV + dest_x / 2; destV = destV + (dest_y / 2) * dest_strideUV + dest_x / 2; src = src + src_y * src_stride + src_x * 4; src2 = (src_y < src_height) ? src + src_stride : src; h = dest_y + h; w = dest_x + w; if (src_sdtv != dest_sdtv) memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); else memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); /* 1. Handle the first destination scanline specially if it * doesn't start at the macro pixel boundary, i.e. blend * with the background! */ if (dest_y % 2 == 1) { /* 1.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = src[4 * 0 + 1]; u1 = src[4 * 0 + 2]; v1 = src[4 * 0 + 3]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); j = dest_x + 1; y_idx = uv_idx = 1; } else { j = dest_x; y_idx = uv_idx = 0; } /* 1.2. Copy all macro pixels from the source to the destination * but blend with the background because we're only filling * the lower part of the macro pixels. */ for (; j < w - 1; j += 2) { y1 = src[4 * y_idx + 1]; y2 = src[4 * y_idx + 4 + 1]; u1 = src[4 * y_idx + 2]; u2 = src[4 * y_idx + 4 + 2]; v1 = src[4 * y_idx + 3]; v2 = src[4 * y_idx + 4 + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[uv_idx] = CLAMP ( (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[uv_idx] = CLAMP ( (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); y_idx += 2; uv_idx++; } /* 1.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = src[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[uv_idx] = CLAMP ( (destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[uv_idx] = CLAMP ( (destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 1) { y1 = src[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[uv_idx] = CLAMP ( (3 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[uv_idx] = CLAMP ((3 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); } destY += dest_strideY; destY2 += dest_strideY; destU += dest_strideUV; destV += dest_strideUV; src += src_stride; src2 += src_stride; i = dest_y + 1; } else { i = dest_y; } /* 2. Copy all macro pixel scanlines, the destination scanline * now starts at macro pixel boundary. */ for (; i < h - 1; i += 2) { /* 2.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = src[4 * 0 + 1]; y2 = src2[4 * 0 + 1]; u1 = src[4 * 0 + 2]; u2 = src2[4 * 0 + 2]; v1 = src[4 * 0 + 3]; v2 = src2[4 * 0 + 3]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY2[0] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[0] = CLAMP ( (2 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[0] = CLAMP ( (2 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); j = dest_x + 1; y_idx = uv_idx = 1; } else { j = dest_x; y_idx = uv_idx = 0; } /* 2.2. Copy all macro pixels from the source to the destination. * All pixels now start at macro pixel boundary, i.e. no * blending with the background is necessary. */ for (; j < w - 1; j += 2) { y1 = src[4 * y_idx + 1]; y2 = src[4 * y_idx + 4 + 1]; y3 = src2[4 * y_idx + 1]; y4 = src2[4 * y_idx + 4 + 1]; u1 = src[4 * y_idx + 2]; u2 = src[4 * y_idx + 4 + 2]; u3 = src2[4 * y_idx + 2]; u4 = src2[4 * y_idx + 4 + 2]; v1 = src[4 * y_idx + 3]; v2 = src[4 * y_idx + 4 + 3]; v3 = src2[4 * y_idx + 3]; v4 = src2[4 * y_idx + 4 + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destY2[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u3, v3), 0, 255); destY2[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y4, u4, v4), 0, 255); destU[uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2) + APPLY_MATRIX (matrix, 1, y3, u3, v3) + APPLY_MATRIX (matrix, 1, y4, u4, v4)) / 4, 0, 255); destV[uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2) + APPLY_MATRIX (matrix, 2, y3, u3, v3) + APPLY_MATRIX (matrix, 2, y4, u4, v4)) / 4, 0, 255); y_idx += 2; uv_idx++; } /* 2.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = src[4 * y_idx + 1]; y2 = src2[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; u2 = src2[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; v2 = src2[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY2[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 2, 0, 255); destV[uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 2, 0, 255); } else if (j == w - 1) { y1 = src[4 * y_idx + 1]; y2 = src2[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; u2 = src2[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; v2 = src2[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY2[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[uv_idx] = CLAMP ( (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); destV[uv_idx] = CLAMP ( (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); } destY += 2 * dest_strideY; destY2 += 2 * dest_strideY; destU += dest_strideUV; destV += dest_strideUV; src += 2 * src_stride; src2 += 2 * src_stride; } /* 3. Handle the last scanline if one exists. This again * doesn't start at macro pixel boundary but should * only fill the upper part of the macro pixels. */ if (i == h - 1 && i == dest_height - 1) { /* 3.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = src[4 * 0 + 1]; u1 = src[4 * 0 + 2]; v1 = src[4 * 0 + 3]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ((destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[0] = CLAMP ((destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); j = dest_x + 1; y_idx = uv_idx = 1; } else { j = dest_x; y_idx = uv_idx = 0; } /* 3.2. Copy all macro pixels from the source to the destination * but blend with the background because we're only filling * the upper part of the macro pixels. */ for (; j < w - 1; j += 2) { y1 = src[4 * y_idx + 1]; y2 = src[4 * y_idx + 4 + 1]; u1 = src[4 * y_idx + 2]; u2 = src[4 * y_idx + 4 + 2]; v1 = src[4 * y_idx + 3]; v2 = src[4 * y_idx + 4 + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[uv_idx] = CLAMP ( (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[uv_idx] = CLAMP ( (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); y_idx += 2; uv_idx++; } /* 3.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = src[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[uv_idx] = CLAMP ( (destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[uv_idx] = CLAMP ( (destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 1) { y1 = src[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[uv_idx] = CLAMP ( (3 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[uv_idx] = CLAMP ((3 * destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); } } else if (i == h - 1) { /* 3.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = src[4 * 0 + 1]; u1 = src[4 * 0 + 2]; v1 = src[4 * 0 + 3]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); j = dest_x + 1; y_idx = uv_idx = 1; } else { j = dest_x; y_idx = uv_idx = 0; } /* 3.2. Copy all macro pixels from the source to the destination * but blend with the background because we're only filling * the upper part of the macro pixels. */ for (; j < w - 1; j += 2) { y1 = src[4 * y_idx + 1]; y2 = src[4 * y_idx + 4 + 1]; u1 = src[4 * y_idx + 2]; u2 = src[4 * y_idx + 4 + 2]; v1 = src[4 * y_idx + 3]; v2 = src[4 * y_idx + 4 + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[uv_idx] = CLAMP ( (2 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[uv_idx] = CLAMP ( (2 * destV[uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); y_idx += 2; uv_idx++; } /* 3.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = src[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[uv_idx] = CLAMP ( (destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[uv_idx] = CLAMP ( (destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 1) { y1 = src[4 * y_idx + 1]; u1 = src[4 * y_idx + 2]; v1 = src[4 * y_idx + 3]; destY[y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[uv_idx] = CLAMP ( (3 * destU[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[uv_idx] = CLAMP ((3 * destV[uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); } } } static void fill_planar_yuv (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, gint height) { guint8 empty_pixel[3]; guint8 *destY, *destU, *destV; gint strideY, strideUV; gint heightY, heightUV; if (sdtv) { empty_pixel[0] = yuv_sdtv_colors_Y[fill_type]; empty_pixel[1] = yuv_sdtv_colors_U[fill_type]; empty_pixel[2] = yuv_sdtv_colors_V[fill_type]; } else { empty_pixel[0] = yuv_hdtv_colors_Y[fill_type]; empty_pixel[1] = yuv_hdtv_colors_U[fill_type]; empty_pixel[2] = yuv_hdtv_colors_V[fill_type]; } strideY = gst_video_format_get_row_stride (format, 0, width); strideUV = gst_video_format_get_row_stride (format, 1, width); destY = dest + gst_video_format_get_component_offset (format, 0, width, height); destU = dest + gst_video_format_get_component_offset (format, 1, width, height); destV = dest + gst_video_format_get_component_offset (format, 2, width, height); heightY = gst_video_format_get_component_height (format, 0, height); heightUV = gst_video_format_get_component_height (format, 1, height); memset (destY, empty_pixel[0], strideY * heightY); memset (destU, empty_pixel[1], strideUV * heightUV); memset (destV, empty_pixel[2], strideUV * heightUV); } static void copy_y444_y444 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; guint8 *destY, *destU, *destV; const guint8 *srcY, *srcU, *srcV; gint dest_stride; gint src_stride; dest_stride = gst_video_format_get_row_stride (dest_format, 0, dest_width); src_stride = gst_video_format_get_row_stride (src_format, 0, src_width); destY = dest + gst_video_format_get_component_offset (dest_format, 0, dest_width, dest_height); destU = dest + gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); destV = dest + gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); srcY = src + gst_video_format_get_component_offset (src_format, 0, src_width, src_height); srcU = src + gst_video_format_get_component_offset (src_format, 1, src_width, src_height); srcV = src + gst_video_format_get_component_offset (src_format, 2, src_width, src_height); destY = destY + dest_y * dest_stride + dest_x; destU = destU + dest_y * dest_stride + dest_x; destV = destV + dest_y * dest_stride + dest_x; srcY = srcY + src_y * src_stride + src_x; srcU = srcU + src_y * src_stride + src_x; srcV = srcV + src_y * src_stride + src_x; if (src_sdtv != dest_sdtv) { gint matrix[12]; gint y, u, v; memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { y = APPLY_MATRIX (matrix, 0, srcY[j], srcU[j], srcV[j]); u = APPLY_MATRIX (matrix, 1, srcY[j], srcU[j], srcV[j]); v = APPLY_MATRIX (matrix, 2, srcY[j], srcU[j], srcV[j]); destY[j] = y; destU[j] = u; destV[j] = v; } destY += dest_stride; destU += dest_stride; destV += dest_stride; srcY += src_stride; srcU += src_stride; srcV += src_stride; } } else { for (i = 0; i < h; i++) { memcpy (destY, srcY, w); memcpy (destU, srcU, w); memcpy (destV, srcV, w); destY += dest_stride; destU += dest_stride; destV += dest_stride; srcY += src_stride; srcU += src_stride; srcV += src_stride; } } } static void copy_y42b_y42b (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; guint8 *destY, *destU, *destV; const guint8 *srcY, *srcU, *srcV; gint dest_strideY, dest_strideUV; gint src_strideY, src_strideUV; gint src_y_idx, src_uv_idx; gint dest_y_idx, dest_uv_idx; gint matrix[12]; gint y1, y2; gint u1, u2; gint v1, v2; dest_strideY = gst_video_format_get_row_stride (dest_format, 0, dest_width); dest_strideUV = gst_video_format_get_row_stride (dest_format, 1, dest_width); src_strideY = gst_video_format_get_row_stride (src_format, 0, src_width); src_strideUV = gst_video_format_get_row_stride (src_format, 1, src_width); destY = dest + gst_video_format_get_component_offset (dest_format, 0, dest_width, dest_height); destU = dest + gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); destV = dest + gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); srcY = src + gst_video_format_get_component_offset (src_format, 0, src_width, src_height); srcU = src + gst_video_format_get_component_offset (src_format, 1, src_width, src_height); srcV = src + gst_video_format_get_component_offset (src_format, 2, src_width, src_height); destY = destY + dest_y * dest_strideY + dest_x; destU = destU + dest_y * dest_strideUV + dest_x / 2; destV = destV + dest_y * dest_strideUV + dest_x / 2; srcY = srcY + src_y * src_strideY + src_x; srcU = srcU + src_y * src_strideUV + src_x / 2; srcV = srcV + src_y * src_strideUV + src_x / 2; h = dest_y + h; w = dest_x + w; if (src_sdtv != dest_sdtv) memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); else memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); /* 1. Copy all macro pixel scanlines, the destination scanline * now starts at macro pixel boundary. */ for (i = dest_y; i < h; i++) { /* 1.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = srcY[0]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ( (destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[0] = CLAMP ( (destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); j = dest_x + 1; src_y_idx = dest_y_idx = dest_uv_idx = 1; src_uv_idx = (src_x % 2) + 1; } else { j = dest_x; src_y_idx = dest_y_idx = dest_uv_idx = 0; src_uv_idx = (src_x % 2); } /* 1.2. Copy all macro pixels from the source to the destination. * All pixels now start at macro pixel boundary, i.e. no * blending with the background is necessary. */ for (; j < w - 1; j += 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; src_uv_idx++; u2 = srcU[src_uv_idx / 2]; v2 = srcV[src_uv_idx / 2]; src_uv_idx++; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 2, 0, 255); dest_y_idx += 2; src_y_idx += 2; dest_uv_idx++; } /* 1.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); } else if (j == w - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ( (destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); } destY += dest_strideY; destU += dest_strideUV; destV += dest_strideUV; srcY += src_strideY; srcU += src_strideUV; srcV += src_strideUV; } } static void copy_y41b_y41b (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; guint8 *destY, *destU, *destV; const guint8 *srcY, *srcU, *srcV; gint dest_strideY, dest_strideUV; gint src_strideY, src_strideUV; gint src_y_idx, src_uv_idx; gint dest_y_idx, dest_uv_idx; gint matrix[12]; gint y1, y2, y3, y4; gint u1, u2, u3, u4; gint v1, v2, v3, v4; dest_strideY = gst_video_format_get_row_stride (dest_format, 0, dest_width); dest_strideUV = gst_video_format_get_row_stride (dest_format, 1, dest_width); src_strideY = gst_video_format_get_row_stride (src_format, 0, src_width); src_strideUV = gst_video_format_get_row_stride (src_format, 1, src_width); destY = dest + gst_video_format_get_component_offset (dest_format, 0, dest_width, dest_height); destU = dest + gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); destV = dest + gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); srcY = src + gst_video_format_get_component_offset (src_format, 0, src_width, src_height); srcU = src + gst_video_format_get_component_offset (src_format, 1, src_width, src_height); srcV = src + gst_video_format_get_component_offset (src_format, 2, src_width, src_height); destY = destY + dest_y * dest_strideY + dest_x; destU = destU + dest_y * dest_strideUV + dest_x / 4; destV = destV + dest_y * dest_strideUV + dest_x / 4; srcY = srcY + src_y * src_strideY + src_x; srcU = srcU + src_y * src_strideUV + src_x / 4; srcV = srcV + src_y * src_strideUV + src_x / 4; h = dest_y + h; w = dest_x + w; if (src_sdtv != dest_sdtv) memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); else memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); /* 1. Copy all macro pixel scanlines, the destination scanline * now starts at macro pixel boundary. */ for (i = dest_y; i < h; i++) { /* 1.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 4 == 1) { y1 = srcY[0]; y2 = srcY[1]; y3 = srcY[2]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); destY[2] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u1, v1), 0, 255); destU[0] = CLAMP ( (destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u1, v1) + APPLY_MATRIX (matrix, 1, y3, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ((destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u1, v1) + APPLY_MATRIX (matrix, 2, y3, u1, v1)) / 4, 0, 255); j = dest_x + 3; src_y_idx = dest_y_idx = 3; dest_uv_idx = 1; src_uv_idx = (src_x % 4) + 3; } else if (dest_x % 4 == 2) { y1 = srcY[0]; y2 = srcY[1]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); destU[0] = CLAMP ( (2 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ((2 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u1, v1)) / 4, 0, 255); j = dest_x + 2; src_y_idx = dest_y_idx = 2; dest_uv_idx = 1; src_uv_idx = (src_x % 4) + 2; } else if (dest_x % 4 == 3) { y1 = srcY[0]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ( (3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ( (3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); j = dest_x + 1; src_y_idx = dest_y_idx = 1; dest_uv_idx = 1; src_uv_idx = (src_x % 4) + 1; } else { j = dest_x; src_y_idx = dest_y_idx = dest_uv_idx = 0; src_uv_idx = (src_x % 4); } /* 1.2. Copy all macro pixels from the source to the destination. * All pixels now start at macro pixel boundary, i.e. no * blending with the background is necessary. */ for (; j < w - 3; j += 4) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; y3 = srcY[src_y_idx + 2]; y4 = srcY[src_y_idx + 3]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; src_uv_idx++; u2 = srcU[src_uv_idx / 4]; v2 = srcV[src_uv_idx / 4]; src_uv_idx++; u3 = srcU[src_uv_idx / 4]; v3 = srcV[src_uv_idx / 4]; src_uv_idx++; u4 = srcU[src_uv_idx / 4]; v4 = srcV[src_uv_idx / 4]; src_uv_idx++; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destY[dest_y_idx + 2] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u3, v3), 0, 255); destY[dest_y_idx + 3] = CLAMP (APPLY_MATRIX (matrix, 0, y4, u4, v4), 0, 255); destU[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2) + APPLY_MATRIX (matrix, 1, y3, u3, v3) + APPLY_MATRIX (matrix, 1, y4, u4, v4)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ((APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2) + APPLY_MATRIX (matrix, 2, y3, u3, v3) + APPLY_MATRIX (matrix, 2, y4, u4, v4)) / 4, 0, 255); dest_y_idx += 4; src_y_idx += 4; dest_uv_idx++; } /* 1.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); } else if (j == w - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (destU[dest_uv_idx] + 3 * APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ( (destV[dest_uv_idx] + 3 * APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); } else if (j == w - 2 && j == dest_width - 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); } else if (j == w - 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ((destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 3 && j == dest_width - 3) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; y3 = srcY[src_y_idx + 2]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); destY[dest_y_idx + 2] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); destV[dest_uv_idx] = CLAMP (APPLY_MATRIX (matrix, 1, y1, u1, v1), 0, 255); } else if (j == w - 3) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; y3 = srcY[src_y_idx + 2]; u1 = srcU[src_uv_idx / 4]; v1 = srcV[src_uv_idx / 4]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u1, v1), 0, 255); destY[dest_y_idx + 2] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ((3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); } destY += dest_strideY; destU += dest_strideUV; destV += dest_strideUV; srcY += src_strideY; srcU += src_strideUV; srcV += src_strideUV; } } static void copy_i420_i420 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; guint8 *destY, *destU, *destV; const guint8 *srcY, *srcU, *srcV; guint8 *destY2; const guint8 *srcY2, *srcU2, *srcV2; gint dest_strideY, dest_strideUV; gint src_strideY, src_strideUV; gint src_y_idx, src_uv_idx; gint dest_y_idx, dest_uv_idx; gint matrix[12]; gint y1, y2, y3, y4; gint u1, u2, u3, u4; gint v1, v2, v3, v4; dest_strideY = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, dest_width); dest_strideUV = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, dest_width); src_strideY = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, src_width); src_strideUV = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, src_width); destY = dest + gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, dest_width, dest_height); destU = dest + gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); destV = dest + gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); srcY = src + gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, src_width, src_height); srcU = src + gst_video_format_get_component_offset (src_format, 1, src_width, src_height); srcV = src + gst_video_format_get_component_offset (src_format, 2, src_width, src_height); destY = destY + dest_y * dest_strideY + dest_x; destU = destU + (dest_y / 2) * dest_strideUV + dest_x / 2; destV = destV + (dest_y / 2) * dest_strideUV + dest_x / 2; srcY = srcY + src_y * src_strideY + src_x; srcU = srcU + (src_y / 2) * src_strideUV + src_x / 2; srcV = srcV + (src_y / 2) * src_strideUV + src_x / 2; destY2 = destY + dest_strideY; srcY2 = srcY + src_strideY; h = dest_y + h; w = dest_x + w; if (src_sdtv != dest_sdtv) memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); else memcpy (matrix, cog_identity_matrix_8bit, 12 * sizeof (gint)); /* 1. Handle the first destination scanline specially if it * doesn't start at the macro pixel boundary, i.e. blend * with the background! */ if (dest_y % 2 == 1) { /* 1.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = srcY[0]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); j = dest_x + 1; src_y_idx = dest_y_idx = dest_uv_idx = 1; src_uv_idx = (src_x % 2) + 1; } else { j = dest_x; src_y_idx = dest_y_idx = dest_uv_idx = 0; src_uv_idx = (src_x % 2); } /* 1.2. Copy all macro pixels from the source to the destination * but blend with the background because we're only filling * the lower part of the macro pixels. */ for (; j < w - 1; j += 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; src_uv_idx++; u2 = srcU[src_uv_idx / 2]; v2 = srcV[src_uv_idx / 2]; src_uv_idx++; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[dest_uv_idx] = CLAMP ((2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ((2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); dest_y_idx += 2; src_y_idx += 2; dest_uv_idx++; } /* 1.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); } destY += dest_strideY; destY2 += dest_strideY; destU += dest_strideUV; destV += dest_strideUV; srcY += src_strideY; srcY2 += src_strideY; src_y++; if (src_y % 2 == 0) { srcU += src_strideUV; srcV += src_strideUV; } i = dest_y + 1; } else { i = dest_y; } /* 2. Copy all macro pixel scanlines, the destination scanline * now starts at macro pixel boundary. */ for (; i < h - 1; i += 2) { /* 2.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ srcU2 = srcU; srcV2 = srcV; if (src_y % 2 == 1) { srcU2 += src_strideUV; srcV2 += src_strideUV; } if (dest_x % 2 == 1) { y1 = srcY[0]; y2 = srcY2[0]; u1 = srcU[0]; v1 = srcV[0]; u2 = srcU2[0]; v2 = srcV2[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY2[0] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[0] = CLAMP ( (2 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[0] = CLAMP ( (2 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); j = dest_x + 1; src_y_idx = dest_y_idx = dest_uv_idx = 1; src_uv_idx = (src_x % 2) + 1; } else { j = dest_x; src_y_idx = dest_y_idx = dest_uv_idx = 0; src_uv_idx = (src_x % 2); } /* 2.2. Copy all macro pixels from the source to the destination. * All pixels now start at macro pixel boundary, i.e. no * blending with the background is necessary. */ for (; j < w - 1; j += 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; y3 = srcY2[src_y_idx]; y4 = srcY2[src_y_idx + 1]; u1 = srcU[src_uv_idx / 2]; u3 = srcU2[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; v3 = srcV2[src_uv_idx / 2]; src_uv_idx++; u2 = srcU[src_uv_idx / 2]; u4 = srcU2[src_uv_idx / 2]; v2 = srcV[src_uv_idx / 2]; v4 = srcV2[src_uv_idx / 2]; src_uv_idx++; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destY2[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y3, u3, v3), 0, 255); destY2[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y4, u4, v4), 0, 255); destU[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2) + APPLY_MATRIX (matrix, 1, y3, u3, v3) + APPLY_MATRIX (matrix, 1, y4, u4, v4)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2) + APPLY_MATRIX (matrix, 2, y3, u3, v3) + APPLY_MATRIX (matrix, 2, y4, u4, v4)) / 4, 0, 255); dest_y_idx += 2; src_y_idx += 2; dest_uv_idx++; } /* 2.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = srcY[src_y_idx]; y2 = srcY2[src_y_idx]; u1 = srcU[src_uv_idx / 2]; u2 = srcU2[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; v2 = srcV2[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY2[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ( (APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 2, 0, 255); } else if (j == w - 1) { y1 = srcY[src_y_idx]; y2 = srcY2[src_y_idx]; u1 = srcU[src_uv_idx / 2]; u2 = srcU2[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; v2 = srcV2[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY2[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[dest_uv_idx] = CLAMP ( (2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ( (2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); } destY += 2 * dest_strideY; destY2 += 2 * dest_strideY; destU += dest_strideUV; destV += dest_strideUV; srcY += 2 * src_strideY; srcY2 += 2 * src_strideY; src_y += 2; srcU += src_strideUV; srcV += src_strideUV; } /* 3. Handle the last scanline if one exists. This again * doesn't start at macro pixel boundary but should * only fill the upper part of the macro pixels. */ if (i == h - 1 && i == dest_height - 1) { /* 3.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = srcY[0]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ((destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[0] = CLAMP ((destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 2, 0, 255); j = dest_x + 1; src_y_idx = dest_y_idx = dest_uv_idx = 1; src_uv_idx = (src_x % 2) + 1; } else { j = dest_x; src_y_idx = dest_y_idx = dest_uv_idx = 0; src_uv_idx = (src_x % 2); } /* 3.2. Copy all macro pixels from the source to the destination * but blend with the background because we're only filling * the upper part of the macro pixels. */ for (; j < w - 1; j += 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; src_uv_idx++; u2 = srcU[src_uv_idx / 2]; v2 = srcV[src_uv_idx / 2]; src_uv_idx++; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[dest_uv_idx] = CLAMP ( (2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ( (2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); dest_y_idx += 2; src_y_idx += 2; dest_uv_idx++; } /* 3.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); } } else if (i == h - 1) { /* 3.1. Handle the first destination pixel if it doesn't * start at the macro pixel boundary, i.e. blend with * the background! */ if (dest_x % 2 == 1) { y1 = srcY[0]; u1 = srcU[0]; v1 = srcV[0]; destY[0] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[0] = CLAMP ((3 * destU[0] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[0] = CLAMP ((3 * destV[0] + APPLY_MATRIX (matrix, 2, y1, u1, v1)) / 4, 0, 255); j = dest_x + 1; src_y_idx = dest_y_idx = dest_uv_idx = 1; src_uv_idx = (src_x % 2) + 1; } else { j = dest_x; src_y_idx = dest_y_idx = dest_uv_idx = 0; src_uv_idx = (src_x % 2); } /* 3.2. Copy all macro pixels from the source to the destination * but blend with the background because we're only filling * the upper part of the macro pixels. */ for (; j < w - 1; j += 2) { y1 = srcY[src_y_idx]; y2 = srcY[src_y_idx + 1]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; src_uv_idx++; u2 = srcU[src_uv_idx / 2]; v2 = srcV[src_uv_idx / 2]; src_uv_idx++; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destY[dest_y_idx + 1] = CLAMP (APPLY_MATRIX (matrix, 0, y2, u2, v2), 0, 255); destU[dest_uv_idx] = CLAMP ( (2 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1) + APPLY_MATRIX (matrix, 1, y2, u2, v2)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ( (2 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 2, y1, u1, v1) + APPLY_MATRIX (matrix, 2, y2, u2, v2)) / 4, 0, 255); dest_y_idx += 2; src_y_idx += 2; dest_uv_idx++; } /* 3.3. Now copy the last pixel if one exists and blend it * with the background because we only fill part of * the macro pixel. In case this is the last pixel of * the destination we will a larger part. */ if (j == w - 1 && j == dest_width - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); destV[dest_uv_idx] = CLAMP ((destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 2, 0, 255); } else if (j == w - 1) { y1 = srcY[src_y_idx]; u1 = srcU[src_uv_idx / 2]; v1 = srcV[src_uv_idx / 2]; destY[dest_y_idx] = CLAMP (APPLY_MATRIX (matrix, 0, y1, u1, v1), 0, 255); destU[dest_uv_idx] = CLAMP ( (3 * destU[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); destV[dest_uv_idx] = CLAMP ((3 * destV[dest_uv_idx] + APPLY_MATRIX (matrix, 1, y1, u1, v1)) / 4, 0, 255); } } } static void copy_i420_ayuv (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { const guint8 *srcY, *srcU, *srcV; gint src_strideY, src_strideUV; gint dest_stride; src_strideY = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 0, src_width); src_strideUV = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 1, src_width); srcY = src + gst_video_format_get_component_offset (GST_VIDEO_FORMAT_I420, 0, src_width, src_height); srcU = src + gst_video_format_get_component_offset (src_format, 1, src_width, src_height); srcV = src + gst_video_format_get_component_offset (src_format, 2, src_width, src_height); dest_stride = dest_width * 4; dest = dest + dest_y * dest_stride + dest_x * 4; srcY = srcY + src_y * src_strideY + src_x; srcU = srcU + (src_y / 2) * src_strideUV + src_x / 2; srcV = srcV + (src_y / 2) * src_strideUV + src_x / 2; i_alpha = CLAMP (i_alpha, 0, 255); if (src_sdtv != dest_sdtv) { gint i, j, uv_idx; gint y, u, v; gint y1, u1, v1; gint matrix[12]; memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); for (i = 0; i < h; i++) { for (j = 0, uv_idx = src_x % 2; j < w; j++, uv_idx++) { y = srcY[j]; u = srcU[uv_idx / 2]; v = srcV[uv_idx / 2]; y1 = APPLY_MATRIX (matrix, 0, y, u, v); u1 = APPLY_MATRIX (matrix, 1, y, u, v); v1 = APPLY_MATRIX (matrix, 2, y, u, v); dest[4 * j + 0] = i_alpha; dest[4 * j + 1] = y1; dest[4 * j + 2] = u1; dest[4 * j + 3] = v1; } dest += dest_stride; src_y++; srcY += src_strideY; if (src_y % 2 == 0) { srcU += src_strideUV; srcV += src_strideUV; } } } else { gint i, j, uv_idx; gint y, u, v; for (i = 0; i < h; i++) { for (j = 0, uv_idx = src_x % 2; j < w; j++, uv_idx++) { y = srcY[j]; u = srcU[uv_idx / 2]; v = srcV[uv_idx / 2]; dest[4 * j + 0] = i_alpha; dest[4 * j + 1] = y; dest[4 * j + 2] = u; dest[4 * j + 3] = v; } dest += dest_stride; src_y++; srcY += src_strideY; if (src_y % 2 == 0) { srcU += src_strideUV; srcV += src_strideUV; } } } } static void fill_rgb32 (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, gint height) { guint32 empty_pixel; gint p[4]; p[0] = gst_video_format_get_component_offset (format, 3, width, height); p[1] = gst_video_format_get_component_offset (format, 0, width, height); p[2] = gst_video_format_get_component_offset (format, 1, width, height); p[3] = gst_video_format_get_component_offset (format, 2, width, height); b_alpha = CLAMP (b_alpha, 0, 255); empty_pixel = GUINT32_FROM_LE ((b_alpha << (p[0] * 8)) | (rgb_colors_R[fill_type] << (p[1] * 8)) | (rgb_colors_G[fill_type] << (p[2] * 8)) | (rgb_colors_B[fill_type] << (p[3] * 8))); orc_splat_u32 ((guint32 *) dest, empty_pixel, width * height); } static void fill_rgb24 (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, gint height) { gint dest_stride = GST_ROUND_UP_4 (width * 3); gint p[4]; gint i, j; p[0] = gst_video_format_get_component_offset (format, 3, width, height); p[1] = gst_video_format_get_component_offset (format, 0, width, height); p[2] = gst_video_format_get_component_offset (format, 1, width, height); p[3] = gst_video_format_get_component_offset (format, 2, width, height); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[3 * j + p[1]] = rgb_colors_R[fill_type]; dest[3 * j + p[2]] = rgb_colors_G[fill_type]; dest[3 * j + p[3]] = rgb_colors_B[fill_type]; } dest += dest_stride; } } static void copy_rgb32 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; gint src_stride, dest_stride; gboolean in_alpha, out_alpha; gint in_bpp, out_bpp; gint p_out[4]; gint p_in[4]; gboolean packed_out = (dest_format == GST_VIDEO_FORMAT_RGB || dest_format == GST_VIDEO_FORMAT_BGR); gboolean packed_in = (src_format == GST_VIDEO_FORMAT_RGB || src_format == GST_VIDEO_FORMAT_BGR); src_stride = (packed_in) ? GST_ROUND_UP_4 (3 * src_width) : 4 * src_width; dest_stride = (packed_out) ? GST_ROUND_UP_4 (3 * dest_width) : 4 * dest_width; in_bpp = (packed_in) ? 3 : 4; out_bpp = (packed_out) ? 3 : 4; out_alpha = gst_video_format_has_alpha (dest_format); p_out[0] = gst_video_format_get_component_offset (dest_format, 3, dest_width, dest_height); p_out[1] = gst_video_format_get_component_offset (dest_format, 0, dest_width, dest_height); p_out[2] = gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); p_out[3] = gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); in_alpha = gst_video_format_has_alpha (src_format); p_in[0] = gst_video_format_get_component_offset (src_format, 3, src_width, src_height); p_in[1] = gst_video_format_get_component_offset (src_format, 0, src_width, src_height); p_in[2] = gst_video_format_get_component_offset (src_format, 1, src_width, src_height); p_in[3] = gst_video_format_get_component_offset (src_format, 2, src_width, src_height); dest = dest + dest_y * dest_stride + dest_x * out_bpp; src = src + src_y * src_stride + src_x * in_bpp; if (in_alpha && out_alpha) { w *= 4; for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { dest[j + p_out[0]] = (src[j + p_in[0]] * i_alpha) >> 8; dest[j + p_out[1]] = src[j + p_in[1]]; dest[j + p_out[2]] = src[j + p_in[2]]; dest[j + p_out[3]] = src[j + p_in[3]]; } dest += dest_stride; src += src_stride; } } else if (out_alpha && !packed_in) { w *= 4; i_alpha = CLAMP (i_alpha, 0, 255); for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { dest[j + p_out[0]] = i_alpha; dest[j + p_out[1]] = src[j + p_in[1]]; dest[j + p_out[2]] = src[j + p_in[2]]; dest[j + p_out[3]] = src[j + p_in[3]]; } dest += dest_stride; src += src_stride; } } else if (out_alpha && packed_in) { i_alpha = CLAMP (i_alpha, 0, 255); for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { dest[4 * j + p_out[0]] = i_alpha; dest[4 * j + p_out[1]] = src[in_bpp * j + p_in[1]]; dest[4 * j + p_out[2]] = src[in_bpp * j + p_in[2]]; dest[4 * j + p_out[3]] = src[in_bpp * j + p_in[3]]; } dest += dest_stride; src += src_stride; } } else if (!packed_out && !packed_in) { w *= 4; for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { dest[j + p_out[1]] = src[j + p_in[1]]; dest[j + p_out[2]] = src[j + p_in[2]]; dest[j + p_out[3]] = src[j + p_in[3]]; } dest += dest_stride; src += src_stride; } } else { for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { dest[out_bpp * j + p_out[1]] = src[in_bpp * j + p_in[1]]; dest[out_bpp * j + p_out[2]] = src[in_bpp * j + p_in[2]]; dest[out_bpp * j + p_out[3]] = src[in_bpp * j + p_in[3]]; } dest += dest_stride; src += src_stride; } } } static void copy_rgb32_ayuv (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; gint src_stride, dest_stride; gboolean in_alpha; gint in_bpp; gint p_in[4]; gboolean packed_in = (src_format == GST_VIDEO_FORMAT_RGB || src_format == GST_VIDEO_FORMAT_BGR); gint matrix[12]; gint a; gint y, u, v; gint r, g, b; src_stride = (packed_in) ? GST_ROUND_UP_4 (3 * src_width) : 4 * src_width; dest_stride = 4 * dest_width; in_bpp = (packed_in) ? 3 : 4; in_alpha = gst_video_format_has_alpha (src_format); p_in[0] = gst_video_format_get_component_offset (src_format, 3, src_width, src_height); p_in[1] = gst_video_format_get_component_offset (src_format, 0, src_width, src_height); p_in[2] = gst_video_format_get_component_offset (src_format, 1, src_width, src_height); p_in[3] = gst_video_format_get_component_offset (src_format, 2, src_width, src_height); memcpy (matrix, (dest_sdtv) ? cog_rgb_to_ycbcr_matrix_8bit_sdtv : cog_rgb_to_ycbcr_matrix_8bit_hdtv, 12 * sizeof (gint)); dest = dest + dest_y * dest_stride + dest_x * 4; src = src + src_y * src_stride + src_x * in_bpp; if (in_alpha) { w *= 4; for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { a = (src[j + p_in[0]] * i_alpha) >> 8; r = src[j + p_in[1]]; g = src[j + p_in[2]]; b = src[j + p_in[3]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b); v = APPLY_MATRIX (matrix, 2, r, g, b); dest[j + 0] = a; dest[j + 1] = CLAMP (y, 0, 255); dest[j + 2] = CLAMP (u, 0, 255); dest[j + 3] = CLAMP (v, 0, 255); } dest += dest_stride; src += src_stride; } } else if (!packed_in) { w *= 4; i_alpha = CLAMP (i_alpha, 0, 255); for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { a = i_alpha; r = src[j + p_in[1]]; g = src[j + p_in[2]]; b = src[j + p_in[3]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b); v = APPLY_MATRIX (matrix, 2, r, g, b); dest[j + 0] = a; dest[j + 1] = CLAMP (y, 0, 255); dest[j + 2] = CLAMP (u, 0, 255); dest[j + 3] = CLAMP (v, 0, 255); } dest += dest_stride; src += src_stride; } } else { i_alpha = CLAMP (i_alpha, 0, 255); for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { a = i_alpha; r = src[in_bpp * j + p_in[1]]; g = src[in_bpp * j + p_in[2]]; b = src[in_bpp * j + p_in[3]]; y = APPLY_MATRIX (matrix, 0, r, g, b); u = APPLY_MATRIX (matrix, 1, r, g, b); v = APPLY_MATRIX (matrix, 2, r, g, b); dest[4 * j + 0] = a; dest[4 * j + 1] = CLAMP (y, 0, 255); dest[4 * j + 2] = CLAMP (u, 0, 255); dest[4 * j + 3] = CLAMP (v, 0, 255); } dest += dest_stride; src += src_stride; } } } static void copy_ayuv_rgb32 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; gint src_stride, dest_stride; gboolean out_alpha; gint out_bpp; gint p_out[4]; gboolean packed_out = (dest_format == GST_VIDEO_FORMAT_RGB || dest_format == GST_VIDEO_FORMAT_BGR); gint matrix[12]; gint a; gint y, u, v; gint r, g, b; dest_stride = (packed_out) ? GST_ROUND_UP_4 (3 * dest_width) : 4 * dest_width; src_stride = 4 * src_width; out_bpp = (packed_out) ? 3 : 4; out_alpha = gst_video_format_has_alpha (dest_format); p_out[0] = gst_video_format_get_component_offset (dest_format, 3, dest_width, dest_height); p_out[1] = gst_video_format_get_component_offset (dest_format, 0, dest_width, dest_height); p_out[2] = gst_video_format_get_component_offset (dest_format, 1, dest_width, dest_height); p_out[3] = gst_video_format_get_component_offset (dest_format, 2, dest_width, dest_height); memcpy (matrix, (src_sdtv) ? cog_ycbcr_to_rgb_matrix_8bit_sdtv : cog_ycbcr_to_rgb_matrix_8bit_hdtv, 12 * sizeof (gint)); dest = dest + dest_y * dest_stride + dest_x * out_bpp; src = src + src_y * src_stride + src_x * 4; if (out_alpha) { w *= 4; for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { a = (src[j + 0] * i_alpha) >> 8; y = src[j + 1]; u = src[j + 2]; v = src[j + 3]; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[j + p_out[0]] = a; dest[j + p_out[1]] = CLAMP (r, 0, 255); dest[j + p_out[2]] = CLAMP (g, 0, 255); dest[j + p_out[3]] = CLAMP (b, 0, 255); } dest += dest_stride; src += src_stride; } } else if (!packed_out) { w *= 4; for (i = 0; i < h; i++) { for (j = 0; j < w; j += 4) { y = src[j + 1]; u = src[j + 2]; v = src[j + 3]; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[j + p_out[1]] = CLAMP (r, 0, 255); dest[j + p_out[2]] = CLAMP (g, 0, 255); dest[j + p_out[3]] = CLAMP (b, 0, 255); } dest += dest_stride; src += src_stride; } } else { for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { y = src[4 * j + 1]; u = src[4 * j + 2]; v = src[4 * j + 3]; r = APPLY_MATRIX (matrix, 0, y, u, v); g = APPLY_MATRIX (matrix, 1, y, u, v); b = APPLY_MATRIX (matrix, 2, y, u, v); dest[out_bpp * j + p_out[1]] = CLAMP (r, 0, 255); dest[out_bpp * j + p_out[2]] = CLAMP (g, 0, 255); dest[out_bpp * j + p_out[3]] = CLAMP (b, 0, 255); } dest += dest_stride; src += src_stride; } } } static void fill_gray (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, gint height) { gint i, j; gint dest_stride; if (format == GST_VIDEO_FORMAT_GRAY8) { guint8 val = yuv_sdtv_colors_Y[fill_type]; dest_stride = GST_ROUND_UP_4 (width); for (i = 0; i < height; i++) { memset (dest, val, width); dest += dest_stride; } } else { guint16 val = yuv_sdtv_colors_Y[fill_type] << 8; dest_stride = GST_ROUND_UP_4 (width * 2); if (format == GST_VIDEO_FORMAT_GRAY16_BE) { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { GST_WRITE_UINT16_BE (dest + 2 * j, val); } dest += dest_stride; } } else { for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { GST_WRITE_UINT16_LE (dest + 2 * j, val); } dest += dest_stride; } } } } static void copy_packed_simple (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i; gint src_stride, dest_stride; gint pixel_stride, row_size; src_stride = gst_video_format_get_row_stride (src_format, 0, src_width); dest_stride = gst_video_format_get_row_stride (dest_format, 0, dest_width); pixel_stride = gst_video_format_get_pixel_stride (dest_format, 0); row_size = w * pixel_stride; dest = dest + dest_y * dest_stride + dest_x * pixel_stride; src = src + src_y * src_stride + src_x * pixel_stride; for (i = 0; i < h; i++) { memcpy (dest, src, row_size); dest += dest_stride; src += src_stride; } } static void fill_yuy2 (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 * dest, gboolean sdtv, gint width, gint height) { guint8 y, u, v; gint i, j; gint stride = gst_video_format_get_row_stride (format, 0, width); y = (sdtv) ? yuv_sdtv_colors_Y[fill_type] : yuv_hdtv_colors_Y[fill_type]; u = (sdtv) ? yuv_sdtv_colors_U[fill_type] : yuv_hdtv_colors_U[fill_type]; v = (sdtv) ? yuv_sdtv_colors_V[fill_type] : yuv_hdtv_colors_V[fill_type]; width = width + (width % 2); if (format == GST_VIDEO_FORMAT_YUY2) { for (i = 0; i < height; i++) { for (j = 0; j < width; j += 2) { dest[j * 2 + 0] = y; dest[j * 2 + 1] = u; dest[j * 2 + 2] = y; dest[j * 2 + 3] = v; } dest += stride; } } else if (format == GST_VIDEO_FORMAT_YVYU) { for (i = 0; i < height; i++) { for (j = 0; j < width; j += 2) { dest[j * 2 + 0] = y; dest[j * 2 + 1] = v; dest[j * 2 + 2] = y; dest[j * 2 + 3] = u; } dest += stride; } } else { for (i = 0; i < height; i++) { for (j = 0; j < width; j += 2) { dest[j * 2 + 0] = u; dest[j * 2 + 1] = y; dest[j * 2 + 2] = v; dest[j * 2 + 3] = y; } dest += stride; } } } static void copy_yuy2_yuy2 (guint i_alpha, GstVideoFormat dest_format, guint8 * dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 * src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h) { gint i, j; gint src_stride, dest_stride; src_stride = gst_video_format_get_row_stride (src_format, 0, src_width); dest_stride = gst_video_format_get_row_stride (dest_format, 0, dest_width); dest_x = (dest_x & ~1); src_x = (src_x & ~1); w = w + (w % 2); dest = dest + dest_y * dest_stride + dest_x * 2; src = src + src_y * src_stride + src_x * 2; if (src_sdtv != dest_sdtv) { gint y1, u1, v1; gint y2, u2, v2; gint matrix[12]; memcpy (matrix, dest_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit : cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit, 12 * sizeof (gint)); if (src_format == GST_VIDEO_FORMAT_YUY2) { for (i = 0; i < h; i++) { for (j = 0; j < w; j += 2) { y1 = src[j * 2 + 0]; y2 = src[j * 2 + 2]; u1 = u2 = src[j * 2 + 1]; v1 = v2 = src[j * 2 + 3]; dest[j * 2 + 0] = APPLY_MATRIX (matrix, 0, y1, u1, v1); dest[j * 2 + 1] = APPLY_MATRIX (matrix, 1, y1, u1, v1); dest[j * 2 + 2] = APPLY_MATRIX (matrix, 0, y1, u2, v2); dest[j * 2 + 3] = APPLY_MATRIX (matrix, 2, y2, u2, v2); } dest += dest_stride; src += src_stride; } } else if (src_format == GST_VIDEO_FORMAT_YVYU) { for (i = 0; i < h; i++) { for (j = 0; j < w; j += 2) { y1 = src[j * 2 + 0]; y2 = src[j * 2 + 2]; v1 = v2 = src[j * 2 + 1]; u1 = u2 = src[j * 2 + 3]; dest[j * 2 + 0] = APPLY_MATRIX (matrix, 0, y1, u1, v1); dest[j * 2 + 1] = APPLY_MATRIX (matrix, 2, y1, u1, v1); dest[j * 2 + 2] = APPLY_MATRIX (matrix, 0, y1, u2, v2); dest[j * 2 + 3] = APPLY_MATRIX (matrix, 1, y2, u2, v2); } dest += dest_stride; src += src_stride; } } else { for (i = 0; i < h; i++) { for (j = 0; j < w; j += 2) { u1 = u2 = src[j * 2 + 0]; v1 = v2 = src[j * 2 + 2]; y1 = src[j * 2 + 1]; y2 = src[j * 2 + 3]; dest[j * 2 + 1] = APPLY_MATRIX (matrix, 0, y1, u1, v1); dest[j * 2 + 0] = APPLY_MATRIX (matrix, 1, y1, u1, v1); dest[j * 2 + 3] = APPLY_MATRIX (matrix, 0, y1, u2, v2); dest[j * 2 + 2] = APPLY_MATRIX (matrix, 2, y2, u2, v2); } dest += dest_stride; src += src_stride; } } } else { for (i = 0; i < h; i++) { memcpy (dest, src, w * 2); dest += dest_stride; src += src_stride; } } } #define DEFAULT_LEFT 0 #define DEFAULT_RIGHT 0 #define DEFAULT_TOP 0 #define DEFAULT_BOTTOM 0 #define DEFAULT_FILL_TYPE VIDEO_BOX_FILL_BLACK #define DEFAULT_ALPHA 1.0 #define DEFAULT_BORDER_ALPHA 1.0 enum { PROP_0, PROP_LEFT, PROP_RIGHT, PROP_TOP, PROP_BOTTOM, PROP_FILL_TYPE, PROP_ALPHA, PROP_BORDER_ALPHA, PROP_AUTOCROP /* FILL ME */ }; static GstStaticPadTemplate gst_video_box_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_GRAY8 ";" GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN") ";" GST_VIDEO_CAPS_GRAY16 ("LITTLE_ENDIAN")) ); static GstStaticPadTemplate gst_video_box_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";" GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";" GST_VIDEO_CAPS_YUV ("Y444") ";" GST_VIDEO_CAPS_YUV ("Y42B") ";" GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("YVYU") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";" GST_VIDEO_CAPS_YUV ("I420") ";" GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("Y41B") ";" GST_VIDEO_CAPS_GRAY8 ";" GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN") ";" GST_VIDEO_CAPS_GRAY16 ("LITTLE_ENDIAN")) ); GST_BOILERPLATE (GstVideoBox, gst_video_box, GstBaseTransform, GST_TYPE_BASE_TRANSFORM); static void gst_video_box_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_video_box_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_video_box_recalc_transform (GstVideoBox * video_box); static GstCaps *gst_video_box_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * from); static gboolean gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out); static gboolean gst_video_box_get_unit_size (GstBaseTransform * trans, GstCaps * caps, guint * size); static GstFlowReturn gst_video_box_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out); static void gst_video_box_before_transform (GstBaseTransform * trans, GstBuffer * in); static void gst_video_box_fixate_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); static gboolean gst_video_box_src_event (GstBaseTransform * trans, GstEvent * event); #define GST_TYPE_VIDEO_BOX_FILL (gst_video_box_fill_get_type()) static GType gst_video_box_fill_get_type (void) { static GType video_box_fill_type = 0; static const GEnumValue video_box_fill[] = { {VIDEO_BOX_FILL_BLACK, "Black", "black"}, {VIDEO_BOX_FILL_GREEN, "Green", "green"}, {VIDEO_BOX_FILL_BLUE, "Blue", "blue"}, {VIDEO_BOX_FILL_RED, "Red", "red"}, {VIDEO_BOX_FILL_YELLOW, "Yellow", "yellow"}, {VIDEO_BOX_FILL_WHITE, "White", "white"}, {0, NULL, NULL}, }; if (!video_box_fill_type) { video_box_fill_type = g_enum_register_static ("GstVideoBoxFill", video_box_fill); } return video_box_fill_type; } static void gst_video_box_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Video box filter", "Filter/Effect/Video", "Resizes a video by adding borders or cropping", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &gst_video_box_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_video_box_src_template); } static void gst_video_box_finalize (GObject * object) { GstVideoBox *video_box = GST_VIDEO_BOX (object); if (video_box->mutex) { g_mutex_free (video_box->mutex); video_box->mutex = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_video_box_class_init (GstVideoBoxClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_video_box_set_property; gobject_class->get_property = gst_video_box_get_property; gobject_class->finalize = gst_video_box_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILL_TYPE, g_param_spec_enum ("fill", "Fill", "How to fill the borders", GST_TYPE_VIDEO_BOX_FILL, DEFAULT_FILL_TYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LEFT, g_param_spec_int ("left", "Left", "Pixels to box at left (<0 = add a border)", G_MININT, G_MAXINT, DEFAULT_LEFT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_RIGHT, g_param_spec_int ("right", "Right", "Pixels to box at right (<0 = add a border)", G_MININT, G_MAXINT, DEFAULT_RIGHT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TOP, g_param_spec_int ("top", "Top", "Pixels to box at top (<0 = add a border)", G_MININT, G_MAXINT, DEFAULT_TOP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BOTTOM, g_param_spec_int ("bottom", "Bottom", "Pixels to box at bottom (<0 = add a border)", G_MININT, G_MAXINT, DEFAULT_BOTTOM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ALPHA, g_param_spec_double ("alpha", "Alpha", "Alpha value picture", 0.0, 1.0, DEFAULT_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER_ALPHA, g_param_spec_double ("border-alpha", "Border Alpha", "Alpha value of the border", 0.0, 1.0, DEFAULT_BORDER_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); /** * GstVideoBox:autocrop * * If set to %TRUE videobox will automatically crop/pad the input * video to be centered in the output. * * Since: 0.10.16 **/ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_AUTOCROP, g_param_spec_boolean ("autocrop", "Auto crop", "Auto crop", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->transform = GST_DEBUG_FUNCPTR (gst_video_box_transform); trans_class->before_transform = GST_DEBUG_FUNCPTR (gst_video_box_before_transform); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_video_box_transform_caps); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_box_set_caps); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_video_box_get_unit_size); trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_video_box_fixate_caps); trans_class->src_event = GST_DEBUG_FUNCPTR (gst_video_box_src_event); } static void gst_video_box_init (GstVideoBox * video_box, GstVideoBoxClass * g_class) { video_box->box_right = DEFAULT_RIGHT; video_box->box_left = DEFAULT_LEFT; video_box->box_top = DEFAULT_TOP; video_box->box_bottom = DEFAULT_BOTTOM; video_box->crop_right = 0; video_box->crop_left = 0; video_box->crop_top = 0; video_box->crop_bottom = 0; video_box->fill_type = DEFAULT_FILL_TYPE; video_box->alpha = DEFAULT_ALPHA; video_box->border_alpha = DEFAULT_BORDER_ALPHA; video_box->autocrop = FALSE; video_box->mutex = g_mutex_new (); } static void gst_video_box_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideoBox *video_box = GST_VIDEO_BOX (object); g_mutex_lock (video_box->mutex); switch (prop_id) { case PROP_LEFT: video_box->box_left = g_value_get_int (value); if (video_box->box_left < 0) { video_box->border_left = -video_box->box_left; video_box->crop_left = 0; } else { video_box->border_left = 0; video_box->crop_left = video_box->box_left; } break; case PROP_RIGHT: video_box->box_right = g_value_get_int (value); if (video_box->box_right < 0) { video_box->border_right = -video_box->box_right; video_box->crop_right = 0; } else { video_box->border_right = 0; video_box->crop_right = video_box->box_right; } break; case PROP_TOP: video_box->box_top = g_value_get_int (value); if (video_box->box_top < 0) { video_box->border_top = -video_box->box_top; video_box->crop_top = 0; } else { video_box->border_top = 0; video_box->crop_top = video_box->box_top; } break; case PROP_BOTTOM: video_box->box_bottom = g_value_get_int (value); if (video_box->box_bottom < 0) { video_box->border_bottom = -video_box->box_bottom; video_box->crop_bottom = 0; } else { video_box->border_bottom = 0; video_box->crop_bottom = video_box->box_bottom; } break; case PROP_FILL_TYPE: video_box->fill_type = g_value_get_enum (value); break; case PROP_ALPHA: video_box->alpha = g_value_get_double (value); break; case PROP_BORDER_ALPHA: video_box->border_alpha = g_value_get_double (value); break; case PROP_AUTOCROP: video_box->autocrop = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } gst_video_box_recalc_transform (video_box); GST_DEBUG_OBJECT (video_box, "Calling reconfigure"); gst_base_transform_reconfigure (GST_BASE_TRANSFORM_CAST (video_box)); g_mutex_unlock (video_box->mutex); } static void gst_video_box_autocrop (GstVideoBox * video_box) { gint crop_w = video_box->in_width - video_box->out_width; gint crop_h = video_box->in_height - video_box->out_height; video_box->box_left = crop_w / 2; if (video_box->box_left < 0) { video_box->border_left = -video_box->box_left; video_box->crop_left = 0; } else { video_box->border_left = 0; video_box->crop_left = video_box->box_left; } /* Round down/up for odd width differences */ if (crop_w < 0) crop_w -= 1; else crop_w += 1; video_box->box_right = crop_w / 2; if (video_box->box_right < 0) { video_box->border_right = -video_box->box_right; video_box->crop_right = 0; } else { video_box->border_right = 0; video_box->crop_right = video_box->box_right; } video_box->box_top = crop_h / 2; if (video_box->box_top < 0) { video_box->border_top = -video_box->box_top; video_box->crop_top = 0; } else { video_box->border_top = 0; video_box->crop_top = video_box->box_top; } /* Round down/up for odd height differences */ if (crop_h < 0) crop_h -= 1; else crop_h += 1; video_box->box_bottom = crop_h / 2; if (video_box->box_bottom < 0) { video_box->border_bottom = -video_box->box_bottom; video_box->crop_bottom = 0; } else { video_box->border_bottom = 0; video_box->crop_bottom = video_box->box_bottom; } } static void gst_video_box_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVideoBox *video_box = GST_VIDEO_BOX (object); switch (prop_id) { case PROP_LEFT: g_value_set_int (value, video_box->box_left); break; case PROP_RIGHT: g_value_set_int (value, video_box->box_right); break; case PROP_TOP: g_value_set_int (value, video_box->box_top); break; case PROP_BOTTOM: g_value_set_int (value, video_box->box_bottom); break; case PROP_FILL_TYPE: g_value_set_enum (value, video_box->fill_type); break; case PROP_ALPHA: g_value_set_double (value, video_box->alpha); break; case PROP_BORDER_ALPHA: g_value_set_double (value, video_box->border_alpha); break; case PROP_AUTOCROP: g_value_set_boolean (value, video_box->autocrop); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static inline gint gst_video_box_transform_dimension (gint val, gint delta) { gint64 new_val = (gint64) val + (gint64) delta; new_val = CLAMP (new_val, 1, G_MAXINT); return (gint) new_val; } static gboolean gst_video_box_transform_dimension_value (const GValue * src_val, gint delta, GValue * dest_val) { gboolean ret = TRUE; g_value_init (dest_val, G_VALUE_TYPE (src_val)); if (G_VALUE_HOLDS_INT (src_val)) { gint ival = g_value_get_int (src_val); ival = gst_video_box_transform_dimension (ival, delta); g_value_set_int (dest_val, ival); } else if (GST_VALUE_HOLDS_INT_RANGE (src_val)) { gint min = gst_value_get_int_range_min (src_val); gint max = gst_value_get_int_range_max (src_val); min = gst_video_box_transform_dimension (min, delta); max = gst_video_box_transform_dimension (max, delta); if (min > max) { ret = FALSE; g_value_unset (dest_val); } else { gst_value_set_int_range (dest_val, min, max); } } else if (GST_VALUE_HOLDS_LIST (src_val)) { gint i; for (i = 0; i < gst_value_list_get_size (src_val); ++i) { const GValue *list_val; GValue newval = { 0, }; list_val = gst_value_list_get_value (src_val, i); if (gst_video_box_transform_dimension_value (list_val, delta, &newval)) gst_value_list_append_value (dest_val, &newval); g_value_unset (&newval); } if (gst_value_list_get_size (dest_val) == 0) { g_value_unset (dest_val); ret = FALSE; } } else { g_value_unset (dest_val); ret = FALSE; } return ret; } static GstCaps * gst_video_box_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * from) { GstVideoBox *video_box = GST_VIDEO_BOX (trans); GstCaps *to, *ret; const GstCaps *templ; const gchar *name; GstStructure *structure; GstPad *other; to = gst_caps_copy (from); /* Just to be sure... */ gst_caps_truncate (to); structure = gst_caps_get_structure (to, 0); /* Transform width/height */ if (video_box->autocrop) { gst_structure_remove_field (structure, "width"); gst_structure_remove_field (structure, "height"); } else { gint dw = 0, dh = 0; const GValue *v; GValue w_val = { 0, }; GValue h_val = { 0, }; /* calculate width and height */ if (direction == GST_PAD_SINK) { dw -= video_box->box_left; dw -= video_box->box_right; } else { dw += video_box->box_left; dw += video_box->box_right; } if (direction == GST_PAD_SINK) { dh -= video_box->box_top; dh -= video_box->box_bottom; } else { dh += video_box->box_top; dh += video_box->box_bottom; } v = gst_structure_get_value (structure, "width"); if (!gst_video_box_transform_dimension_value (v, dw, &w_val)) { GST_WARNING_OBJECT (video_box, "could not tranform width value with dw=%d" ", caps structure=%" GST_PTR_FORMAT, dw, structure); gst_caps_unref (to); to = gst_caps_new_empty (); return to; } gst_structure_set_value (structure, "width", &w_val); v = gst_structure_get_value (structure, "height"); if (!gst_video_box_transform_dimension_value (v, dh, &h_val)) { g_value_unset (&w_val); GST_WARNING_OBJECT (video_box, "could not tranform height value with dh=%d" ", caps structure=%" GST_PTR_FORMAT, dh, structure); gst_caps_unref (to); to = gst_caps_new_empty (); return to; } gst_structure_set_value (structure, "height", &h_val); g_value_unset (&w_val); g_value_unset (&h_val); } /* Supported conversions: * I420->AYUV * I420->YV12 * YV12->AYUV * YV12->I420 * AYUV->I420 * AYUV->YV12 * AYUV->xRGB (24bpp, 32bpp, incl. alpha) * xRGB->xRGB (24bpp, 32bpp, from/to all variants, incl. alpha) * xRGB->AYUV (24bpp, 32bpp, incl. alpha) * * Passthrough only for everything else. */ name = gst_structure_get_name (structure); if (g_str_equal (name, "video/x-raw-yuv")) { guint32 fourcc; if (gst_structure_get_fourcc (structure, "format", &fourcc) && (fourcc == GST_STR_FOURCC ("AYUV") || fourcc == GST_STR_FOURCC ("I420") || fourcc == GST_STR_FOURCC ("YV12"))) { GValue list = { 0, }; GValue val = { 0, }; GstStructure *s2; /* get rid of format */ gst_structure_remove_field (structure, "format"); gst_structure_remove_field (structure, "color-matrix"); gst_structure_remove_field (structure, "chroma-site"); s2 = gst_structure_copy (structure); g_value_init (&list, GST_TYPE_LIST); g_value_init (&val, GST_TYPE_FOURCC); gst_value_set_fourcc (&val, GST_STR_FOURCC ("AYUV")); gst_value_list_append_value (&list, &val); g_value_reset (&val); gst_value_set_fourcc (&val, GST_STR_FOURCC ("I420")); gst_value_list_append_value (&list, &val); g_value_reset (&val); gst_value_set_fourcc (&val, GST_STR_FOURCC ("YV12")); gst_value_list_append_value (&list, &val); g_value_unset (&val); gst_structure_set_value (structure, "format", &list); g_value_unset (&list); /* We can only convert to RGB if input is AYUV */ if (fourcc == GST_STR_FOURCC ("AYUV")) { gst_structure_set_name (s2, "video/x-raw-rgb"); g_value_init (&list, GST_TYPE_LIST); g_value_init (&val, G_TYPE_INT); g_value_set_int (&val, 32); gst_value_list_append_value (&list, &val); g_value_reset (&val); g_value_set_int (&val, 24); gst_value_list_append_value (&list, &val); g_value_unset (&val); gst_structure_set_value (s2, "depth", &list); gst_structure_set_value (s2, "bpp", &list); g_value_unset (&list); gst_caps_append_structure (to, s2); } else { gst_structure_free (s2); } } } else if (g_str_equal (name, "video/x-raw-rgb")) { gint bpp; if (gst_structure_get_int (structure, "bpp", &bpp) && (bpp == 32 || bpp == 24)) { GValue list = { 0, }; GValue val = { 0, }; GstStructure *s2; /* get rid of format */ gst_structure_remove_field (structure, "depth"); gst_structure_remove_field (structure, "bpp"); gst_structure_remove_field (structure, "red_mask"); gst_structure_remove_field (structure, "green_mask"); gst_structure_remove_field (structure, "blue_mask"); gst_structure_remove_field (structure, "alpha_mask"); s2 = gst_structure_copy (structure); g_value_init (&list, GST_TYPE_LIST); g_value_init (&val, G_TYPE_INT); g_value_set_int (&val, 32); gst_value_list_append_value (&list, &val); g_value_reset (&val); g_value_set_int (&val, 24); gst_value_list_append_value (&list, &val); g_value_unset (&val); gst_structure_set_value (structure, "depth", &list); gst_structure_set_value (structure, "bpp", &list); g_value_unset (&list); gst_structure_set_name (s2, "video/x-raw-yuv"); gst_structure_set (s2, "format", GST_TYPE_FOURCC, GST_STR_FOURCC ("AYUV"), NULL); gst_caps_append_structure (to, s2); } } /* filter against set allowed caps on the pad */ other = (direction == GST_PAD_SINK) ? trans->srcpad : trans->sinkpad; templ = gst_pad_get_pad_template_caps (other); ret = gst_caps_intersect (to, templ); gst_caps_unref (to); GST_DEBUG_OBJECT (video_box, "direction %d, transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, direction, from, ret); return ret; } static gboolean gst_video_box_recalc_transform (GstVideoBox * video_box) { gboolean res = TRUE; /* if we have the same format in and out and we don't need to perform any * cropping at all, we can just operate in passthrough mode */ if (video_box->in_format == video_box->out_format && video_box->box_left == 0 && video_box->box_right == 0 && video_box->box_top == 0 && video_box->box_bottom == 0 && video_box->in_sdtv == video_box->out_sdtv) { GST_LOG_OBJECT (video_box, "we are using passthrough"); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM_CAST (video_box), TRUE); } else { GST_LOG_OBJECT (video_box, "we are not using passthrough"); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM_CAST (video_box), FALSE); } return res; } static gboolean gst_video_box_select_processing_functions (GstVideoBox * video_box) { switch (video_box->out_format) { case GST_VIDEO_FORMAT_AYUV: video_box->fill = fill_ayuv; switch (video_box->in_format) { case GST_VIDEO_FORMAT_AYUV: video_box->copy = copy_ayuv_ayuv; break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: video_box->copy = copy_i420_ayuv; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: video_box->copy = copy_rgb32_ayuv; break; default: break; } break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: video_box->fill = fill_planar_yuv; switch (video_box->in_format) { case GST_VIDEO_FORMAT_AYUV: video_box->copy = copy_ayuv_i420; break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: video_box->copy = copy_i420_i420; break; default: break; } break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: video_box->fill = (video_box->out_format == GST_VIDEO_FORMAT_BGR || video_box->out_format == GST_VIDEO_FORMAT_RGB) ? fill_rgb24 : fill_rgb32; switch (video_box->in_format) { case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: video_box->copy = copy_rgb32; break; case GST_VIDEO_FORMAT_AYUV: video_box->copy = copy_ayuv_rgb32; default: break; } break; case GST_VIDEO_FORMAT_GRAY8: case GST_VIDEO_FORMAT_GRAY16_BE: case GST_VIDEO_FORMAT_GRAY16_LE: video_box->fill = fill_gray; switch (video_box->in_format) { case GST_VIDEO_FORMAT_GRAY8: case GST_VIDEO_FORMAT_GRAY16_BE: case GST_VIDEO_FORMAT_GRAY16_LE: video_box->copy = copy_packed_simple; break; default: break; } break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: video_box->fill = fill_yuy2; switch (video_box->in_format) { case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YVYU: case GST_VIDEO_FORMAT_UYVY: video_box->copy = copy_yuy2_yuy2; break; default: break; } break; case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y41B: video_box->fill = fill_planar_yuv; switch (video_box->in_format) { case GST_VIDEO_FORMAT_Y444: video_box->copy = copy_y444_y444; break; case GST_VIDEO_FORMAT_Y42B: video_box->copy = copy_y42b_y42b; break; case GST_VIDEO_FORMAT_Y41B: video_box->copy = copy_y41b_y41b; break; default: break; } break; default: break; } return video_box->fill != NULL && video_box->copy != NULL; } static gboolean gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out) { GstVideoBox *video_box = GST_VIDEO_BOX (trans); gboolean ret; const gchar *matrix; g_mutex_lock (video_box->mutex); ret = gst_video_format_parse_caps (in, &video_box->in_format, &video_box->in_width, &video_box->in_height); ret &= gst_video_format_parse_caps (out, &video_box->out_format, &video_box->out_width, &video_box->out_height); matrix = gst_video_parse_caps_color_matrix (in); video_box->in_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; matrix = gst_video_parse_caps_color_matrix (out); video_box->out_sdtv = matrix ? g_str_equal (matrix, "sdtv") : TRUE; /* something wrong getting the caps */ if (!ret) goto no_caps; GST_DEBUG_OBJECT (trans, "Input w: %d h: %d", video_box->in_width, video_box->in_height); GST_DEBUG_OBJECT (trans, "Output w: %d h: %d", video_box->out_width, video_box->out_height); if (video_box->autocrop) gst_video_box_autocrop (video_box); /* recalc the transformation strategy */ ret = gst_video_box_recalc_transform (video_box); if (ret) ret = gst_video_box_select_processing_functions (video_box); g_mutex_unlock (video_box->mutex); return ret; /* ERRORS */ no_caps: { GST_DEBUG_OBJECT (video_box, "Invalid caps: %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, in, out); g_mutex_unlock (video_box->mutex); return FALSE; } } static gboolean gst_video_box_get_unit_size (GstBaseTransform * trans, GstCaps * caps, guint * size) { GstVideoFormat format; gint width, height; gboolean ret; g_assert (size); ret = gst_video_format_parse_caps (caps, &format, &width, &height); if (!ret) { GST_ERROR_OBJECT (trans, "Invalid caps: %" GST_PTR_FORMAT, caps); return FALSE; } *size = gst_video_format_get_size (format, width, height); GST_LOG_OBJECT (trans, "Returning from _unit_size %d", *size); return TRUE; } static void gst_video_box_fixate_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) { gint width, height; GstStructure *s; gboolean ret; ret = gst_video_format_parse_caps (caps, NULL, &width, &height); if (!ret) return; s = gst_caps_get_structure (othercaps, 0); gst_structure_fixate_field_nearest_int (s, "width", width); gst_structure_fixate_field_nearest_int (s, "height", height); } static gboolean gst_video_box_src_event (GstBaseTransform * trans, GstEvent * event) { GstVideoBox *video_box = GST_VIDEO_BOX (trans); GstStructure *new_structure; const GstStructure *structure; const gchar *event_name; gdouble pointer_x; gdouble pointer_y; GST_OBJECT_LOCK (video_box); if (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION && (video_box->box_left != 0 || video_box->box_top != 0)) { structure = gst_event_get_structure (event); event_name = gst_structure_get_string (structure, "event"); if (event_name && (strcmp (event_name, "mouse-move") == 0 || strcmp (event_name, "mouse-button-press") == 0 || strcmp (event_name, "mouse-button-release") == 0)) { if (gst_structure_get_double (structure, "pointer_x", &pointer_x) && gst_structure_get_double (structure, "pointer_y", &pointer_y)) { gdouble new_pointer_x, new_pointer_y; GstEvent *new_event; new_pointer_x = pointer_x + video_box->box_left; new_pointer_y = pointer_y + video_box->box_top; new_structure = gst_structure_copy (structure); gst_structure_set (new_structure, "pointer_x", G_TYPE_DOUBLE, (gdouble) (new_pointer_x), "pointer_y", G_TYPE_DOUBLE, (gdouble) (new_pointer_y), NULL); new_event = gst_event_new_navigation (new_structure); gst_event_unref (event); event = new_event; } else { GST_WARNING_OBJECT (video_box, "Failed to read navigation event"); } } } GST_OBJECT_UNLOCK (video_box); return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event); } static void gst_video_box_process (GstVideoBox * video_box, const guint8 * src, guint8 * dest) { guint b_alpha = CLAMP (video_box->border_alpha * 256, 0, 255); guint i_alpha = CLAMP (video_box->alpha * 256, 0, 255); GstVideoBoxFill fill_type = video_box->fill_type; gint br, bl, bt, bb, crop_w, crop_h; crop_h = 0; crop_w = 0; br = video_box->box_right; bl = video_box->box_left; bt = video_box->box_top; bb = video_box->box_bottom; if (br >= 0 && bl >= 0) { crop_w = video_box->in_width - (br + bl); } else if (br >= 0 && bl < 0) { crop_w = video_box->in_width - (br); } else if (br < 0 && bl >= 0) { crop_w = video_box->in_width - (bl); } else if (br < 0 && bl < 0) { crop_w = video_box->in_width; } if (bb >= 0 && bt >= 0) { crop_h = video_box->in_height - (bb + bt); } else if (bb >= 0 && bt < 0) { crop_h = video_box->in_height - (bb); } else if (bb < 0 && bt >= 0) { crop_h = video_box->in_height - (bt); } else if (bb < 0 && bt < 0) { crop_h = video_box->in_height; } GST_DEBUG_OBJECT (video_box, "Borders are: L:%d, R:%d, T:%d, B:%d", bl, br, bt, bb); GST_DEBUG_OBJECT (video_box, "Alpha value is: %u (frame) %u (border)", i_alpha, b_alpha); if (crop_h < 0 || crop_w < 0) { video_box->fill (fill_type, b_alpha, video_box->out_format, dest, video_box->out_sdtv, video_box->out_width, video_box->out_height); } else if (bb == 0 && bt == 0 && br == 0 && bl == 0) { video_box->copy (i_alpha, video_box->out_format, dest, video_box->out_sdtv, video_box->out_width, video_box->out_height, 0, 0, video_box->in_format, src, video_box->in_sdtv, video_box->in_width, video_box->in_height, 0, 0, crop_w, crop_h); } else { gint src_x = 0, src_y = 0; gint dest_x = 0, dest_y = 0; /* Fill everything if a border should be added somewhere */ if (bt < 0 || bb < 0 || br < 0 || bl < 0) video_box->fill (fill_type, b_alpha, video_box->out_format, dest, video_box->out_sdtv, video_box->out_width, video_box->out_height); /* Top border */ if (bt < 0) { dest_y += -bt; } else { src_y += bt; } /* Left border */ if (bl < 0) { dest_x += -bl; } else { src_x += bl; } /* Frame */ video_box->copy (i_alpha, video_box->out_format, dest, video_box->out_sdtv, video_box->out_width, video_box->out_height, dest_x, dest_y, video_box->in_format, src, video_box->in_sdtv, video_box->in_width, video_box->in_height, src_x, src_y, crop_w, crop_h); } GST_LOG_OBJECT (video_box, "image created"); } static void gst_video_box_before_transform (GstBaseTransform * trans, GstBuffer * in) { GstVideoBox *video_box = GST_VIDEO_BOX (trans); GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (video_box, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (video_box), stream_time); } static GstFlowReturn gst_video_box_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstVideoBox *video_box = GST_VIDEO_BOX (trans); const guint8 *indata; guint8 *outdata; indata = GST_BUFFER_DATA (in); outdata = GST_BUFFER_DATA (out); g_mutex_lock (video_box->mutex); gst_video_box_process (video_box, indata, outdata); g_mutex_unlock (video_box->mutex); return GST_FLOW_OK; } /* FIXME: 0.11 merge with videocrop plugin */ static gboolean plugin_init (GstPlugin * plugin) { gst_controller_init (NULL, NULL); GST_DEBUG_CATEGORY_INIT (videobox_debug, "videobox", 0, "Resizes a video by adding borders or cropping"); return gst_element_register (plugin, "videobox", GST_RANK_NONE, GST_TYPE_VIDEO_BOX); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "videobox", "resizes a video by adding borders or cropping", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/videobox/gstvideoboxorc-dist.h0000644000175000017500000000363311720561024020571 00000000000000 /* autogenerated from gstvideoboxorc.orc */ #ifndef _GSTVIDEOBOXORC_H_ #define _GSTVIDEOBOXORC_H_ #include #ifdef __cplusplus extern "C" { #endif #ifndef _ORC_INTEGER_TYPEDEFS_ #define _ORC_INTEGER_TYPEDEFS_ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include typedef int8_t orc_int8; typedef int16_t orc_int16; typedef int32_t orc_int32; typedef int64_t orc_int64; typedef uint8_t orc_uint8; typedef uint16_t orc_uint16; typedef uint32_t orc_uint32; typedef uint64_t orc_uint64; #define ORC_UINT64_C(x) UINT64_C(x) #elif defined(_MSC_VER) typedef signed __int8 orc_int8; typedef signed __int16 orc_int16; typedef signed __int32 orc_int32; typedef signed __int64 orc_int64; typedef unsigned __int8 orc_uint8; typedef unsigned __int16 orc_uint16; typedef unsigned __int32 orc_uint32; typedef unsigned __int64 orc_uint64; #define ORC_UINT64_C(x) (x##Ui64) #define inline __inline #else #include typedef signed char orc_int8; typedef short orc_int16; typedef int orc_int32; typedef unsigned char orc_uint8; typedef unsigned short orc_uint16; typedef unsigned int orc_uint32; #if INT_MAX == LONG_MAX typedef long long orc_int64; typedef unsigned long long orc_uint64; #define ORC_UINT64_C(x) (x##ULL) #else typedef long orc_int64; typedef unsigned long orc_uint64; #define ORC_UINT64_C(x) (x##UL) #endif #endif typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; #endif #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); #ifdef __cplusplus } #endif #endif gst-plugins-good-0.10.31/gst/videobox/gstvideobox.h0000644000175000017500000000542411671175354017140 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 #include #include #ifndef __GST_VIDEO_BOX_H__ #define __GST_VIDEO_BOX_H__ #define GST_TYPE_VIDEO_BOX \ (gst_video_box_get_type()) #define GST_VIDEO_BOX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_BOX,GstVideoBox)) #define GST_VIDEO_BOX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_BOX,GstVideoBoxClass)) #define GST_IS_VIDEO_BOX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_BOX)) #define GST_IS_VIDEO_BOX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_BOX)) typedef struct _GstVideoBox GstVideoBox; typedef struct _GstVideoBoxClass GstVideoBoxClass; typedef enum { VIDEO_BOX_FILL_BLACK, VIDEO_BOX_FILL_GREEN, VIDEO_BOX_FILL_BLUE, VIDEO_BOX_FILL_RED, VIDEO_BOX_FILL_YELLOW, VIDEO_BOX_FILL_WHITE, VIDEO_BOX_FILL_LAST } GstVideoBoxFill; struct _GstVideoBox { GstBaseTransform element; /* */ /* Guarding everything below */ GMutex *mutex; /* caps */ GstVideoFormat in_format; gint in_width, in_height; gboolean in_sdtv; GstVideoFormat out_format; gint out_width, out_height; gboolean out_sdtv; gint box_left, box_right, box_top, box_bottom; gint border_left, border_right, border_top, border_bottom; gint crop_left, crop_right, crop_top, crop_bottom; gdouble alpha; gdouble border_alpha; GstVideoBoxFill fill_type; gboolean autocrop; void (*fill) (GstVideoBoxFill fill_type, guint b_alpha, GstVideoFormat format, guint8 *dest, gboolean sdtv, gint width, gint height); void (*copy) (guint i_alpha, GstVideoFormat dest_format, guint8 *dest, gboolean dest_sdtv, gint dest_width, gint dest_height, gint dest_x, gint dest_y, GstVideoFormat src_format, const guint8 *src, gboolean src_sdtv, gint src_width, gint src_height, gint src_x, gint src_y, gint w, gint h); }; struct _GstVideoBoxClass { GstBaseTransformClass parent_class; }; GType gst_video_box_get_type (void); #endif /* __GST_VIDEO_BOX_H__ */ gst-plugins-good-0.10.31/gst/videobox/Makefile.am0000644000175000017500000000236211671175354016464 00000000000000plugin_LTLIBRARIES = libgstvideobox.la ORC_SOURCE=gstvideoboxorc include $(top_srcdir)/common/orc.mak libgstvideobox_la_SOURCES = gstvideobox.c nodist_libgstvideobox_la_SOURCES = $(ORC_NODIST_SOURCES) libgstvideobox_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(ORC_CFLAGS) libgstvideobox_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(ORC_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideobox_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstvideobox.h EXTRA_DIST += README Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideobox -:SHARED libgstvideobox \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideobox_la_SOURCES) \ $(nodist_libgstvideobox_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideobox_la_CFLAGS) \ -:LDFLAGS $(libgstvideobox_la_LDFLAGS) \ $(libgstvideobox_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/videobox/gstvideoboxorc-dist.c0000644000175000017500000001320511720565315020567 00000000000000 /* autogenerated from gstvideoboxorc.orc */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifndef _ORC_INTEGER_TYPEDEFS_ #define _ORC_INTEGER_TYPEDEFS_ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #include typedef int8_t orc_int8; typedef int16_t orc_int16; typedef int32_t orc_int32; typedef int64_t orc_int64; typedef uint8_t orc_uint8; typedef uint16_t orc_uint16; typedef uint32_t orc_uint32; typedef uint64_t orc_uint64; #define ORC_UINT64_C(x) UINT64_C(x) #elif defined(_MSC_VER) typedef signed __int8 orc_int8; typedef signed __int16 orc_int16; typedef signed __int32 orc_int32; typedef signed __int64 orc_int64; typedef unsigned __int8 orc_uint8; typedef unsigned __int16 orc_uint16; typedef unsigned __int32 orc_uint32; typedef unsigned __int64 orc_uint64; #define ORC_UINT64_C(x) (x##Ui64) #define inline __inline #else #include typedef signed char orc_int8; typedef short orc_int16; typedef int orc_int32; typedef unsigned char orc_uint8; typedef unsigned short orc_uint16; typedef unsigned int orc_uint32; #if INT_MAX == LONG_MAX typedef long long orc_int64; typedef unsigned long long orc_uint64; #define ORC_UINT64_C(x) (x##ULL) #else typedef long orc_int64; typedef unsigned long orc_uint64; #define ORC_UINT64_C(x) (x##UL) #endif #endif typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; typedef union { orc_int64 i; double f; orc_int32 x2[2]; float x2f[2]; orc_int16 x4[4]; } orc_union64; #endif #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif #ifndef DISABLE_ORC #include #endif void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n); /* begin Orc C target preamble */ #define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) #define ORC_ABS(a) ((a)<0 ? -(a) : (a)) #define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) #define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) #define ORC_SB_MAX 127 #define ORC_SB_MIN (-1-ORC_SB_MAX) #define ORC_UB_MAX 255 #define ORC_UB_MIN 0 #define ORC_SW_MAX 32767 #define ORC_SW_MIN (-1-ORC_SW_MAX) #define ORC_UW_MAX 65535 #define ORC_UW_MIN 0 #define ORC_SL_MAX 2147483647 #define ORC_SL_MIN (-1-ORC_SL_MAX) #define ORC_UL_MAX 4294967295U #define ORC_UL_MIN 0 #define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) #define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) #define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) #define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) #define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) #define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) #define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) #define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) #define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56)) #define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) #define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) #define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) #define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff))) #define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0)) #ifndef ORC_RESTRICT #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define ORC_RESTRICT restrict #elif defined(__GNUC__) && __GNUC__ >= 4 #define ORC_RESTRICT __restrict__ #else #define ORC_RESTRICT #endif #endif /* end Orc C target preamble */ /* orc_splat_u32 */ #ifdef DISABLE_ORC void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) { int i; orc_union32 *ORC_RESTRICT ptr0; orc_union32 var32; orc_union32 var33; ptr0 = (orc_union32 *) d1; /* 0: loadpl */ var32.i = p1; for (i = 0; i < n; i++) { /* 1: copyl */ var33.i = var32.i; /* 2: storel */ ptr0[i] = var33; } } #else static void _backup_orc_splat_u32 (OrcExecutor * ORC_RESTRICT ex) { int i; int n = ex->n; orc_union32 *ORC_RESTRICT ptr0; orc_union32 var32; orc_union32 var33; ptr0 = (orc_union32 *) ex->arrays[0]; /* 0: loadpl */ var32.i = ex->params[24]; for (i = 0; i < n; i++) { /* 1: copyl */ var33.i = var32.i; /* 2: storel */ ptr0[i] = var33; } } void orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n) { OrcExecutor _ex, *ex = &_ex; static volatile int p_inited = 0; static OrcProgram *p = 0; void (*func) (OrcExecutor *); if (!p_inited) { orc_once_mutex_lock (); if (!p_inited) { p = orc_program_new (); orc_program_set_name (p, "orc_splat_u32"); orc_program_set_backup_function (p, _backup_orc_splat_u32); orc_program_add_destination (p, 4, "d1"); orc_program_add_parameter (p, 4, "p1"); orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1, ORC_VAR_D1); orc_program_compile (p); } p_inited = TRUE; orc_once_mutex_unlock (); } ex->program = p; ex->n = n; ex->arrays[ORC_VAR_D1] = d1; ex->params[ORC_VAR_P1] = p1; func = p->code_exec; func (ex); } #endif gst-plugins-good-0.10.31/gst/videobox/README0000644000175000017500000000163111671175354015306 00000000000000Videobox -------- This plugin crops or enlarges the image. It takes 4 values as input, a top, bottom, left and right offset. Positive values will crop that much pixels from the respective border of the image, negative values will add that much pixels. When pixels are added, you can specify their color. Some predefined colors are usable with an enum property. The plugin is alpha channel aware and will try to negotiate with a format that supports alpha channels first. When alpha channel is active two other properties, alpha and border_alpha can be used to set the alpha values of the inner picture and the border respectively. an alpha value of 0.0 means total transparency, 1.0 is opaque. The videobox plugin has many uses such as doing a mosaic of pictures, letterboxing video, cutting out pieces of video, picture in picture, etc.. TODO - add enum to specify common aspect ratios/sizes and add borders/crop gst-plugins-good-0.10.31/gst/videobox/Makefile.in0000644000175000017500000010000211720560236016453 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # This is a makefile.am fragment to build Orc code. # # Define ORC_SOURCE and then include this file, such as: # # ORC_SOURCE=gstadderorc # include $(top_srcdir)/common/orc.mak # # This fragment will create tmp-orc.c and gstadderorc.h from # gstadderorc.orc. # # When 'make dist' is run at the top level, or 'make orc-update' # in a directory including this fragment, the generated source # files will be copied to $(ORC_SOURCE)-dist.[ch]. These files # should be checked in to git, since they are used if Orc is # disabled. # # Note that this file defines BUILT_SOURCES, so any later usage # of BUILT_SOURCES in the Makefile.am that includes this file # must use '+='. # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/common/orc.mak subdir = gst/videobox ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstvideobox_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstvideobox_la_OBJECTS = libgstvideobox_la-gstvideobox.lo am__objects_1 = libgstvideobox_la-tmp-orc.lo nodist_libgstvideobox_la_OBJECTS = $(am__objects_1) libgstvideobox_la_OBJECTS = $(am_libgstvideobox_la_OBJECTS) \ $(nodist_libgstvideobox_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstvideobox_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstvideobox_la_CFLAGS) $(CFLAGS) \ $(libgstvideobox_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstvideobox_la_SOURCES) \ $(nodist_libgstvideobox_la_SOURCES) DIST_SOURCES = $(libgstvideobox_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstvideobox.la ORC_SOURCE = gstvideoboxorc EXTRA_DIST = $(ORC_SOURCE).orc README ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h BUILT_SOURCES = tmp-orc.c $(ORC_SOURCE).h orcc_v_gen = $(orcc_v_gen_$(V)) orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) orcc_v_gen_0 = @echo " ORCC $@"; cp_v_gen = $(cp_v_gen_$(V)) cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) cp_v_gen_0 = @echo " CP $@"; libgstvideobox_la_SOURCES = gstvideobox.c nodist_libgstvideobox_la_SOURCES = $(ORC_NODIST_SOURCES) libgstvideobox_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ $(ORC_CFLAGS) libgstvideobox_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(ORC_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstvideobox_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstvideobox.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/orc.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videobox/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/videobox/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/orc.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstvideobox.la: $(libgstvideobox_la_OBJECTS) $(libgstvideobox_la_DEPENDENCIES) $(EXTRA_libgstvideobox_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstvideobox_la_LINK) -rpath $(plugindir) $(libgstvideobox_la_OBJECTS) $(libgstvideobox_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideobox_la-gstvideobox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideobox_la-tmp-orc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstvideobox_la-gstvideobox.lo: gstvideobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -MT libgstvideobox_la-gstvideobox.lo -MD -MP -MF $(DEPDIR)/libgstvideobox_la-gstvideobox.Tpo -c -o libgstvideobox_la-gstvideobox.lo `test -f 'gstvideobox.c' || echo '$(srcdir)/'`gstvideobox.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideobox_la-gstvideobox.Tpo $(DEPDIR)/libgstvideobox_la-gstvideobox.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvideobox.c' object='libgstvideobox_la-gstvideobox.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -c -o libgstvideobox_la-gstvideobox.lo `test -f 'gstvideobox.c' || echo '$(srcdir)/'`gstvideobox.c libgstvideobox_la-tmp-orc.lo: tmp-orc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -MT libgstvideobox_la-tmp-orc.lo -MD -MP -MF $(DEPDIR)/libgstvideobox_la-tmp-orc.Tpo -c -o libgstvideobox_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideobox_la-tmp-orc.Tpo $(DEPDIR)/libgstvideobox_la-tmp-orc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tmp-orc.c' object='libgstvideobox_la-tmp-orc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideobox_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideobox_la_CFLAGS) $(CFLAGS) -c -o libgstvideobox_la-tmp-orc.lo `test -f 'tmp-orc.c' || echo '$(srcdir)/'`tmp-orc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-local \ clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-local clean-pluginLTLIBRARIES ctags \ dist-hook distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-pluginLTLIBRARIES orc-update: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h @HAVE_ORCC_TRUE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --implementation --include glib.h -o tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_TRUE@ $(orcc_v_gen)$(ORCC) $(ORCC_FLAGS) --header --include glib.h -o $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc @HAVE_ORCC_FALSE@tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c @HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c @HAVE_ORCC_FALSE@$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc $(srcdir)/$(ORC_SOURCE)-dist.c @HAVE_ORCC_FALSE@ $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h clean-local: clean-orc .PHONY: clean-orc clean-orc: rm -f tmp-orc.c $(ORC_SOURCE).h dist-hook: dist-hook-orc .PHONY: dist-hook-orc # we try and copy updated orc -dist files below, but don't fail if it # doesn't work as the srcdir might not be writable dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h $(top_srcdir)/common/gst-indent tmp-orc.c rm -f tmp-orc.c~ cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || true cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || true cp -p tmp-orc.c $(distdir)/$(ORC_SOURCE)-dist.c cp -p $(ORC_SOURCE).h $(distdir)/$(ORC_SOURCE)-dist.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstvideobox -:SHARED libgstvideobox \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstvideobox_la_SOURCES) \ $(nodist_libgstvideobox_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideobox_la_CFLAGS) \ -:LDFLAGS $(libgstvideobox_la_LDFLAGS) \ $(libgstvideobox_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/autodetect/0000755000175000017500000000000011720565301015015 500000000000000gst-plugins-good-0.10.31/gst/autodetect/gstautoaudiosrc.c0000644000175000017500000003212611677341655020344 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jan Schmidt * (c) 2008 Stefan Kost * * 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-autoaudiosrc * @see_also: autovideosrc, alsasrc, osssrc * * autoaudiosrc is an audio source that automatically detects an appropriate * audio source to use. It does so by scanning the registry for all elements * that have Source and Audio in the class field * of their element information, and also have a non-zero autoplugging rank. * * * Example launch line * |[ * gst-launch -v -m autoaudiosrc ! audioconvert ! audioresample ! autoaudiosink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstautoaudiosrc.h" #include "gstautodetect.h" /* Properties */ enum { PROP_0, PROP_CAPS, }; static GstStateChangeReturn gst_auto_audio_src_change_state (GstElement * element, GstStateChange transition); static void gst_auto_audio_src_dispose (GstAutoAudioSrc * src); static void gst_auto_audio_src_clear_kid (GstAutoAudioSrc * src); static void gst_auto_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_auto_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstAutoAudioSrc, gst_auto_audio_src, GstBin, GST_TYPE_BIN); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_auto_audio_src_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (eklass, &src_template); gst_element_class_set_details_simple (eklass, "Auto audio source", "Source/Audio", "Wrapper audio source for automatically detected audio source", "Jan Schmidt , " "Stefan Kost "); } static void gst_auto_audio_src_class_init (GstAutoAudioSrcClass * klass) { GObjectClass *gobject_class; GstElementClass *eklass; gobject_class = G_OBJECT_CLASS (klass); eklass = GST_ELEMENT_CLASS (klass); gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_audio_src_dispose; gobject_class->set_property = gst_auto_audio_src_set_property; gobject_class->get_property = gst_auto_audio_src_get_property; eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_audio_src_change_state); /** * GstAutoAudioSrc:filter-caps * * This property will filter out candidate sinks that can handle the specified * caps. By default only audio sinks that support raw floating point and * integer audio are selected. * * This property can only be set before the element goes to the READY state. * * Since: 0.10.14 **/ g_object_class_install_property (gobject_class, PROP_CAPS, g_param_spec_boxed ("filter-caps", "Filter caps", "Filter sink candidates using these caps.", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_auto_audio_src_dispose (GstAutoAudioSrc * src) { gst_auto_audio_src_clear_kid (src); if (src->filter_caps) gst_caps_unref (src->filter_caps); src->filter_caps = NULL; G_OBJECT_CLASS (parent_class)->dispose ((GObject *) src); } static void gst_auto_audio_src_clear_kid (GstAutoAudioSrc * src) { if (src->kid) { gst_element_set_state (src->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (src), src->kid); src->kid = NULL; /* Don't lose SOURCE flag */ GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } } /* * Hack to make initial linking work; ideally, this'd work even when * no target has been assigned to the ghostpad yet. */ static void gst_auto_audio_src_reset (GstAutoAudioSrc * src) { GstPad *targetpad; gst_auto_audio_src_clear_kid (src); /* fakesink placeholder */ src->kid = gst_element_factory_make ("fakesrc", "tempsrc"); gst_bin_add (GST_BIN (src), src->kid); /* pad */ targetpad = gst_element_get_static_pad (src->kid, "src"); gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); gst_object_unref (targetpad); } static GstStaticCaps raw_caps = GST_STATIC_CAPS ("audio/x-raw-int; audio/x-raw-float"); static void gst_auto_audio_src_init (GstAutoAudioSrc * src, GstAutoAudioSrcClass * g_class) { src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); gst_element_add_pad (GST_ELEMENT (src), src->pad); gst_auto_audio_src_reset (src); /* set the default raw audio caps */ src->filter_caps = gst_static_caps_get (&raw_caps); /* mark as source */ GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } static gboolean gst_auto_audio_src_factory_filter (GstPluginFeature * feature, gpointer data) { guint rank; const gchar *klass; /* we only care about element factories */ if (!GST_IS_ELEMENT_FACTORY (feature)) return FALSE; /* audio sinks */ klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); if (!(strstr (klass, "Source") && strstr (klass, "Audio"))) return FALSE; /* only select elements with autoplugging rank */ rank = gst_plugin_feature_get_rank (feature); if (rank < GST_RANK_MARGINAL) return FALSE; return TRUE; } static gint gst_auto_audio_src_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) { gint diff; diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); if (diff != 0) return diff; return strcmp (gst_plugin_feature_get_name (f2), gst_plugin_feature_get_name (f1)); } static GstElement * gst_auto_audio_src_create_element_with_pretty_name (GstAutoAudioSrc * src, GstElementFactory * factory) { GstElement *element; gchar *name, *marker; marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); if (g_str_has_suffix (marker, "src")) marker[strlen (marker) - 4] = '\0'; if (g_str_has_prefix (marker, "gst")) g_memmove (marker, marker + 3, strlen (marker + 3) + 1); name = g_strdup_printf ("%s-actual-src-%s", GST_OBJECT_NAME (src), marker); g_free (marker); element = gst_element_factory_create (factory, name); g_free (name); return element; } static GstElement * gst_auto_audio_src_find_best (GstAutoAudioSrc * src) { GList *list, *item; GstElement *choice = NULL; GstMessage *message = NULL; GSList *errors = NULL; GstBus *bus = gst_bus_new (); GstPad *el_pad = NULL; GstCaps *el_caps = NULL; gboolean no_match = TRUE; list = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_auto_audio_src_factory_filter, FALSE, src); list = g_list_sort (list, (GCompareFunc) gst_auto_audio_src_compare_ranks); /* We don't treat sound server sources special. Our policy is that sound * server sources that have a rank must not auto-spawn a daemon under any * circumstances, so there's nothing for us to worry about here */ GST_LOG_OBJECT (src, "Trying to find usable audio devices ..."); for (item = list; item != NULL; item = item->next) { GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); GstElement *el; if ((el = gst_auto_audio_src_create_element_with_pretty_name (src, f))) { GstStateChangeReturn ret; GST_DEBUG_OBJECT (src, "Testing %s", GST_PLUGIN_FEATURE (f)->name); /* If autoAudioSrc has been provided with filter caps, * accept only sources that match with the filter caps */ if (src->filter_caps) { el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "src"); el_caps = gst_pad_get_caps (el_pad); gst_object_unref (el_pad); GST_DEBUG_OBJECT (src, "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, src->filter_caps, el_caps); no_match = !gst_caps_can_intersect (src->filter_caps, el_caps); gst_caps_unref (el_caps); if (no_match) { GST_DEBUG_OBJECT (src, "Incompatible caps"); gst_object_unref (el); continue; } else { GST_DEBUG_OBJECT (src, "Found compatible caps"); } } gst_element_set_bus (el, bus); ret = gst_element_set_state (el, GST_STATE_READY); if (ret == GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (src, "This worked!"); choice = el; break; } /* collect all error messages */ while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { GST_DEBUG_OBJECT (src, "error message %" GST_PTR_FORMAT, message); errors = g_slist_append (errors, message); } gst_element_set_state (el, GST_STATE_NULL); gst_object_unref (el); } } GST_DEBUG_OBJECT (src, "done trying"); if (!choice) { if (errors) { /* FIXME: we forward the first error for now; but later on it might make * sense to actually analyse them */ gst_message_ref (GST_MESSAGE (errors->data)); GST_DEBUG_OBJECT (src, "reposting message %p", errors->data); gst_element_post_message (GST_ELEMENT (src), GST_MESSAGE (errors->data)); } else { /* send warning message to application and use a fakesrc */ GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), ("Failed to find a usable audio source")); choice = gst_element_factory_make ("fakesrc", "fake-audio-src"); if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) g_object_set (choice, "sync", TRUE, NULL); gst_element_set_state (choice, GST_STATE_READY); } } gst_object_unref (bus); gst_plugin_feature_list_free (list); g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); g_slist_free (errors); return choice; } static gboolean gst_auto_audio_src_detect (GstAutoAudioSrc * src) { GstElement *esrc; GstPad *targetpad; gst_auto_audio_src_clear_kid (src); /* find element */ GST_DEBUG_OBJECT (src, "Creating new kid"); if (!(esrc = gst_auto_audio_src_find_best (src))) goto no_src; src->kid = esrc; /* Ensure the child is brought up to the right state to match the parent * although it's currently always in READY and * we're always doing NULL->READY. */ if (GST_STATE (src->kid) < GST_STATE (src)) gst_element_set_state (src->kid, GST_STATE (src)); gst_bin_add (GST_BIN (src), esrc); /* attach ghost pad */ GST_DEBUG_OBJECT (src, "Re-assigning ghostpad"); targetpad = gst_element_get_static_pad (src->kid, "src"); if (!gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad)) goto target_failed; gst_object_unref (targetpad); GST_DEBUG_OBJECT (src, "done changing auto audio source"); return TRUE; /* ERRORS */ no_src: { GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Failed to find a supported audio source")); return FALSE; } target_failed: { GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Failed to set target pad")); gst_object_unref (targetpad); return FALSE; } } static GstStateChangeReturn gst_auto_audio_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstAutoAudioSrc *src = GST_AUTO_AUDIO_SRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_auto_audio_src_detect (src)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_auto_audio_src_reset (src); break; default: break; } return ret; } static void gst_auto_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAutoAudioSrc *src = GST_AUTO_AUDIO_SRC (object); switch (prop_id) { case PROP_CAPS: if (src->filter_caps) gst_caps_unref (src->filter_caps); src->filter_caps = gst_caps_copy (gst_value_get_caps (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_auto_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAutoAudioSrc *src = GST_AUTO_AUDIO_SRC (object); switch (prop_id) { case PROP_CAPS:{ gst_value_set_caps (value, src->filter_caps); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/autodetect/gstautoaudiosink.h0000644000175000017500000000354211671175353020520 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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_AUTO_AUDIO_SINK_H__ #define __GST_AUTO_AUDIO_SINK_H__ #include G_BEGIN_DECLS #define GST_TYPE_AUTO_AUDIO_SINK \ (gst_auto_audio_sink_get_type ()) #define GST_AUTO_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_AUDIO_SINK, \ GstAutoAudioSink)) #define GST_AUTO_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_AUDIO_SINK, \ GstAutoAudioSinkClass)) #define GST_IS_AUTO_AUDIO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_AUDIO_SINK)) #define GST_IS_AUTO_AUDIO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_AUDIO_SINK)) typedef struct _GstAutoAudioSink { GstBin parent; /* explicit pointers to stuff used */ GstPad *pad; GstElement *kid; GstCaps *filter_caps; } GstAutoAudioSink; typedef struct _GstAutoAudioSinkClass { GstBinClass parent_class; } GstAutoAudioSinkClass; GType gst_auto_audio_sink_get_type (void); G_END_DECLS #endif /* __GST_AUTO_AUDIO_SINK_H__ */ gst-plugins-good-0.10.31/gst/autodetect/Makefile.am0000644000175000017500000000200011671175353016772 00000000000000plugin_LTLIBRARIES = libgstautodetect.la libgstautodetect_la_SOURCES = \ gstautoaudiosink.c \ gstautoaudiosrc.c \ gstautodetect.c \ gstautovideosink.c \ gstautovideosrc.c libgstautodetect_la_CFLAGS = $(GST_CFLAGS) libgstautodetect_la_LIBADD = $(GST_LIBS) libgstautodetect_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstautodetect_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstautoaudiosink.h \ gstautoaudiosrc.h \ gstautodetect.h \ gstautovideosink.h \ gstautovideosrc.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstautodetect -:SHARED libgstautodetect \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstautodetect_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstautodetect_la_CFLAGS) \ -:LDFLAGS $(libgstautodetect_la_LDFLAGS) \ $(libgstautodetect_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/autodetect/gstautoaudiosrc.h0000644000175000017500000000357511671175353020351 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2008 Stefan Kost * * 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_AUTO_AUDIO_SRC_H__ #define __GST_AUTO_AUDIO_SRC_H__ #include G_BEGIN_DECLS #define GST_TYPE_AUTO_AUDIO_SRC \ (gst_auto_audio_src_get_type ()) #define GST_AUTO_AUDIO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_AUDIO_SRC, \ GstAutoAudioSrc)) #define GST_AUTO_AUDIO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_AUDIO_SRC, \ GstAutoAudioSrcClass)) #define GST_IS_AUTO_AUDIO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_AUDIO_SRC)) #define GST_IS_AUTO_AUDIO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_AUDIO_SRC)) typedef struct _GstAutoAudioSrc { GstBin parent; /* explicit pointers to stuff used */ GstPad *pad; GstElement *kid; GstCaps *filter_caps; } GstAutoAudioSrc; typedef struct _GstAutoAudioSrcClass { GstBinClass parent_class; } GstAutoAudioSrcClass; GType gst_auto_audio_src_get_type (void); G_END_DECLS #endif /* __GST_AUTO_AUDIO_SRC_H__ */ gst-plugins-good-0.10.31/gst/autodetect/gstautovideosink.c0000644000175000017500000003117511677341655020531 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jan Schmidt * * 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-autovideosink * @see_also: autoaudiosink, ximagesink, xvimagesink, sdlvideosink * * autovideosink is a video sink that automatically detects an appropriate * video sink to use. It does so by scanning the registry for all elements * that have Sink and Video in the class field * of their element information, and also have a non-zero autoplugging rank. * * * Example launch line * |[ * gst-launch -v -m videotestsrc ! autovideosink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstautovideosink.h" #include "gstautodetect.h" /* Properties */ enum { PROP_0, PROP_CAPS, }; static GstStateChangeReturn gst_auto_video_sink_change_state (GstElement * element, GstStateChange transition); static void gst_auto_video_sink_dispose (GstAutoVideoSink * sink); static void gst_auto_video_sink_clear_kid (GstAutoVideoSink * sink); static void gst_auto_video_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_auto_video_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstAutoVideoSink, gst_auto_video_sink, GstBin, GST_TYPE_BIN); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_auto_video_sink_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (eklass, &sink_template); gst_element_class_set_details_simple (eklass, "Auto video sink", "Sink/Video", "Wrapper video sink for automatically detected video sink", "Jan Schmidt "); } static void gst_auto_video_sink_class_init (GstAutoVideoSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gobject_class = G_OBJECT_CLASS (klass); gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_video_sink_dispose; gobject_class->set_property = gst_auto_video_sink_set_property; gobject_class->get_property = gst_auto_video_sink_get_property; eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_video_sink_change_state); /** * GstAutoVideoSink:filter-caps * * This property will filter out candidate sinks that can handle the specified * caps. By default only video sinks that support raw rgb and yuv video * are selected. * * This property can only be set before the element goes to the READY state. * * Since: 0.10.7 **/ g_object_class_install_property (gobject_class, PROP_CAPS, g_param_spec_boxed ("filter-caps", "Filter caps", "Filter sink candidates using these caps.", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_auto_video_sink_dispose (GstAutoVideoSink * sink) { gst_auto_video_sink_clear_kid (sink); if (sink->filter_caps) gst_caps_unref (sink->filter_caps); sink->filter_caps = NULL; G_OBJECT_CLASS (parent_class)->dispose ((GObject *) sink); } static void gst_auto_video_sink_clear_kid (GstAutoVideoSink * sink) { if (sink->kid) { gst_element_set_state (sink->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (sink), sink->kid); sink->kid = NULL; /* Don't lose the SINK flag */ GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } } /* * Hack to make initial linking work; ideally, this'd work even when * no target has been assigned to the ghostpad yet. */ static void gst_auto_video_sink_reset (GstAutoVideoSink * sink) { GstPad *targetpad; /* Remove any existing element */ gst_auto_video_sink_clear_kid (sink); /* fakesink placeholder */ sink->kid = gst_element_factory_make ("fakesink", "tempsink"); gst_bin_add (GST_BIN (sink), sink->kid); /* pad, setting this target should always work */ targetpad = gst_element_get_static_pad (sink->kid, "sink"); gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); gst_object_unref (targetpad); } static GstStaticCaps raw_caps = GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb"); static void gst_auto_video_sink_init (GstAutoVideoSink * sink, GstAutoVideoSinkClass * g_class) { sink->pad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); gst_element_add_pad (GST_ELEMENT (sink), sink->pad); gst_auto_video_sink_reset (sink); /* set the default raw video caps */ sink->filter_caps = gst_static_caps_get (&raw_caps); /* mark as sink */ GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } static gboolean gst_auto_video_sink_factory_filter (GstPluginFeature * feature, gpointer data) { guint rank; const gchar *klass; /* we only care about element factories */ if (!GST_IS_ELEMENT_FACTORY (feature)) return FALSE; /* video sinks */ klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); if (!(strstr (klass, "Sink") && strstr (klass, "Video"))) return FALSE; /* only select elements with autoplugging rank */ rank = gst_plugin_feature_get_rank (feature); if (rank < GST_RANK_MARGINAL) return FALSE; return TRUE; } static gint gst_auto_video_sink_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) { gint diff; diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); if (diff != 0) return diff; return strcmp (gst_plugin_feature_get_name (f2), gst_plugin_feature_get_name (f1)); } static GstElement * gst_auto_video_sink_create_element_with_pretty_name (GstAutoVideoSink * sink, GstElementFactory * factory) { GstElement *element; gchar *name, *marker; marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); if (g_str_has_suffix (marker, "sink")) marker[strlen (marker) - 4] = '\0'; if (g_str_has_prefix (marker, "gst")) g_memmove (marker, marker + 3, strlen (marker + 3) + 1); name = g_strdup_printf ("%s-actual-sink-%s", GST_OBJECT_NAME (sink), marker); g_free (marker); element = gst_element_factory_create (factory, name); g_free (name); return element; } static GstElement * gst_auto_video_sink_find_best (GstAutoVideoSink * sink) { GList *list, *item; GstElement *choice = NULL; GstMessage *message = NULL; GSList *errors = NULL; GstBus *bus = gst_bus_new (); GstPad *el_pad = NULL; GstCaps *el_caps = NULL; gboolean no_match = TRUE; list = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_auto_video_sink_factory_filter, FALSE, sink); list = g_list_sort (list, (GCompareFunc) gst_auto_video_sink_compare_ranks); GST_LOG_OBJECT (sink, "Trying to find usable video devices ..."); for (item = list; item != NULL; item = item->next) { GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); GstElement *el; if ((el = gst_auto_video_sink_create_element_with_pretty_name (sink, f))) { GstStateChangeReturn ret; GST_DEBUG_OBJECT (sink, "Testing %s", GST_PLUGIN_FEATURE (f)->name); /* If autovideosink has been provided with filter caps, * accept only sinks that match with the filter caps */ if (sink->filter_caps) { el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "sink"); el_caps = gst_pad_get_caps (el_pad); gst_object_unref (el_pad); GST_DEBUG_OBJECT (sink, "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, sink->filter_caps, el_caps); no_match = !gst_caps_can_intersect (sink->filter_caps, el_caps); gst_caps_unref (el_caps); if (no_match) { GST_DEBUG_OBJECT (sink, "Incompatible caps"); gst_object_unref (el); continue; } else { GST_DEBUG_OBJECT (sink, "Found compatible caps"); } } gst_element_set_bus (el, bus); ret = gst_element_set_state (el, GST_STATE_READY); if (ret == GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (sink, "This worked!"); choice = el; break; } /* collect all error messages */ while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { GST_DEBUG_OBJECT (sink, "error message %" GST_PTR_FORMAT, message); errors = g_slist_append (errors, message); } gst_element_set_state (el, GST_STATE_NULL); gst_object_unref (el); } } GST_DEBUG_OBJECT (sink, "done trying"); if (!choice) { if (errors) { /* FIXME: we forward the first error for now; but later on it might make * sense to actually analyse them */ gst_message_ref (GST_MESSAGE (errors->data)); GST_DEBUG_OBJECT (sink, "reposting message %p", errors->data); gst_element_post_message (GST_ELEMENT (sink), GST_MESSAGE (errors->data)); } else { /* send warning message to application and use a fakesink */ GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), ("Failed to find a usable video sink")); choice = gst_element_factory_make ("fakesink", "fake-video-sink"); if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) g_object_set (choice, "sync", TRUE, NULL); gst_element_set_state (choice, GST_STATE_READY); } } gst_object_unref (bus); gst_plugin_feature_list_free (list); g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); g_slist_free (errors); return choice; } static gboolean gst_auto_video_sink_detect (GstAutoVideoSink * sink) { GstElement *esink; GstPad *targetpad; gst_auto_video_sink_clear_kid (sink); /* find element */ GST_DEBUG_OBJECT (sink, "Creating new kid"); if (!(esink = gst_auto_video_sink_find_best (sink))) goto no_sink; sink->kid = esink; gst_bin_add (GST_BIN (sink), esink); /* attach ghost pad */ GST_DEBUG_OBJECT (sink, "Re-assigning ghostpad"); targetpad = gst_element_get_static_pad (sink->kid, "sink"); if (!gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad)) goto target_failed; gst_object_unref (targetpad); GST_DEBUG_OBJECT (sink, "done changing auto video sink"); return TRUE; /* ERRORS */ no_sink: { GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), ("Failed to find a supported video sink")); return FALSE; } target_failed: { GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), ("Failed to set target pad")); gst_object_unref (targetpad); return FALSE; } } static GstStateChangeReturn gst_auto_video_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstAutoVideoSink *sink = GST_AUTO_VIDEO_SINK (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_auto_video_sink_detect (sink)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_auto_video_sink_reset (sink); break; default: break; } return ret; } static void gst_auto_video_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAutoVideoSink *sink = GST_AUTO_VIDEO_SINK (object); switch (prop_id) { case PROP_CAPS: if (sink->filter_caps) gst_caps_unref (sink->filter_caps); sink->filter_caps = gst_caps_copy (gst_value_get_caps (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_auto_video_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAutoVideoSink *sink = GST_AUTO_VIDEO_SINK (object); switch (prop_id) { case PROP_CAPS:{ gst_value_set_caps (value, sink->filter_caps); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/autodetect/gstautovideosrc.h0000644000175000017500000000357511671175353020356 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2008 Stefan Kost * * 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_AUTO_VIDEO_SRC_H__ #define __GST_AUTO_VIDEO_SRC_H__ #include G_BEGIN_DECLS #define GST_TYPE_AUTO_VIDEO_SRC \ (gst_auto_video_src_get_type ()) #define GST_AUTO_VIDEO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_VIDEO_SRC, \ GstAutoVideoSrc)) #define GST_AUTO_VIDEO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_VIDEO_SRC, \ GstAutoVideoSrcClass)) #define GST_IS_AUTO_VIDEO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_VIDEO_SRC)) #define GST_IS_AUTO_VIDEO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_VIDEO_SRC)) typedef struct _GstAutoVideoSrc { GstBin parent; /* explicit pointers to stuff used */ GstPad *pad; GstElement *kid; GstCaps *filter_caps; } GstAutoVideoSrc; typedef struct _GstAutoVideoSrcClass { GstBinClass parent_class; } GstAutoVideoSrcClass; GType gst_auto_video_src_get_type (void); G_END_DECLS #endif /* __GST_AUTO_VIDEO_SRC_H__ */ gst-plugins-good-0.10.31/gst/autodetect/gstautodetect.h0000644000175000017500000000175511671175353020006 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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_AUTO_DETECT_H__ #define __GST_AUTO_DETECT_H__ GST_DEBUG_CATEGORY_EXTERN (autodetect_debug); #define GST_CAT_DEFAULT autodetect_debug #endif /* __GST_AUTO_DETECT_H__ */ gst-plugins-good-0.10.31/gst/autodetect/gstautovideosrc.c0000644000175000017500000003104011677341655020343 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jan Schmidt * (c) 2008 Stefan Kost * * 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-autovideosrc * @see_also: autoaudiosrc, v4l2src, v4lsrc * * autovideosrc is a video src that automatically detects an appropriate * video source to use. It does so by scanning the registry for all elements * that have Source and Video in the class field * of their element information, and also have a non-zero autoplugging rank. * * * Example launch line * |[ * gst-launch -v -m autovideosrc ! xvimagesink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstautovideosrc.h" #include "gstautodetect.h" /* Properties */ enum { PROP_0, PROP_CAPS, }; static GstStateChangeReturn gst_auto_video_src_change_state (GstElement * element, GstStateChange transition); static void gst_auto_video_src_dispose (GstAutoVideoSrc * src); static void gst_auto_video_src_clear_kid (GstAutoVideoSrc * src); static void gst_auto_video_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_auto_video_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstAutoVideoSrc, gst_auto_video_src, GstBin, GST_TYPE_BIN); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_auto_video_src_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (eklass, &src_template); gst_element_class_set_details_simple (eklass, "Auto video source", "Source/Video", "Wrapper video source for automatically detected video source", "Jan Schmidt , " "Stefan Kost "); } static void gst_auto_video_src_class_init (GstAutoVideoSrcClass * klass) { GObjectClass *gobject_class; GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gobject_class = G_OBJECT_CLASS (klass); gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_video_src_dispose; gobject_class->set_property = gst_auto_video_src_set_property; gobject_class->get_property = gst_auto_video_src_get_property; eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_video_src_change_state); /** * GstAutoVideoSrc:filter-caps * * This property will filter out candidate sources that can handle the specified * caps. By default only video sources that support raw rgb and yuv video * are selected. * * This property can only be set before the element goes to the READY state. * * Since: 0.10.14 **/ g_object_class_install_property (gobject_class, PROP_CAPS, g_param_spec_boxed ("filter-caps", "Filter caps", "Filter src candidates using these caps.", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_auto_video_src_dispose (GstAutoVideoSrc * src) { gst_auto_video_src_clear_kid (src); if (src->filter_caps) gst_caps_unref (src->filter_caps); src->filter_caps = NULL; G_OBJECT_CLASS (parent_class)->dispose ((GObject *) src); } static void gst_auto_video_src_clear_kid (GstAutoVideoSrc * src) { if (src->kid) { gst_element_set_state (src->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (src), src->kid); src->kid = NULL; /* Don't loose SOURCE flag */ GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } } /* * Hack to make initial linking work; ideally, this'd work even when * no target has been assigned to the ghostpad yet. */ static void gst_auto_video_src_reset (GstAutoVideoSrc * src) { GstPad *targetpad; /* Remove any existing element */ gst_auto_video_src_clear_kid (src); /* fakesrc placeholder */ src->kid = gst_element_factory_make ("fakesrc", "tempsrc"); gst_bin_add (GST_BIN (src), src->kid); /* pad */ targetpad = gst_element_get_static_pad (src->kid, "src"); gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad); gst_object_unref (targetpad); } static GstStaticCaps raw_caps = GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb"); static void gst_auto_video_src_init (GstAutoVideoSrc * src, GstAutoVideoSrcClass * g_class) { src->pad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); gst_element_add_pad (GST_ELEMENT (src), src->pad); gst_auto_video_src_reset (src); /* set the default raw video caps */ src->filter_caps = gst_static_caps_get (&raw_caps); /* mark as source */ GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SOURCE); } static gboolean gst_auto_video_src_factory_filter (GstPluginFeature * feature, gpointer data) { guint rank; const gchar *klass; /* we only care about element factories */ if (!GST_IS_ELEMENT_FACTORY (feature)) return FALSE; /* video sources */ klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); if (!(strstr (klass, "Source") && strstr (klass, "Video"))) return FALSE; /* only select elements with autoplugging rank */ rank = gst_plugin_feature_get_rank (feature); if (rank < GST_RANK_MARGINAL) return FALSE; return TRUE; } static gint gst_auto_video_src_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) { gint diff; diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); if (diff != 0) return diff; return strcmp (gst_plugin_feature_get_name (f2), gst_plugin_feature_get_name (f1)); } static GstElement * gst_auto_video_src_create_element_with_pretty_name (GstAutoVideoSrc * src, GstElementFactory * factory) { GstElement *element; gchar *name, *marker; marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); if (g_str_has_suffix (marker, "src")) marker[strlen (marker) - 4] = '\0'; if (g_str_has_prefix (marker, "gst")) g_memmove (marker, marker + 3, strlen (marker + 3) + 1); name = g_strdup_printf ("%s-actual-src-%s", GST_OBJECT_NAME (src), marker); g_free (marker); element = gst_element_factory_create (factory, name); g_free (name); return element; } static GstElement * gst_auto_video_src_find_best (GstAutoVideoSrc * src) { GList *list, *item; GstElement *choice = NULL; GstMessage *message = NULL; GSList *errors = NULL; GstBus *bus = gst_bus_new (); GstPad *el_pad = NULL; GstCaps *el_caps = NULL; gboolean no_match = TRUE; list = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_auto_video_src_factory_filter, FALSE, src); list = g_list_sort (list, (GCompareFunc) gst_auto_video_src_compare_ranks); GST_LOG_OBJECT (src, "Trying to find usable video devices ..."); for (item = list; item != NULL; item = item->next) { GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); GstElement *el; if ((el = gst_auto_video_src_create_element_with_pretty_name (src, f))) { GstStateChangeReturn ret; GST_DEBUG_OBJECT (src, "Testing %s", GST_PLUGIN_FEATURE (f)->name); /* If AutoVideoSrc has been provided with filter caps, * accept only sources that match with the filter caps */ if (src->filter_caps) { el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "src"); el_caps = gst_pad_get_caps (el_pad); gst_object_unref (el_pad); GST_DEBUG_OBJECT (src, "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, src->filter_caps, el_caps); no_match = !gst_caps_can_intersect (src->filter_caps, el_caps); gst_caps_unref (el_caps); if (no_match) { GST_DEBUG_OBJECT (src, "Incompatible caps"); gst_object_unref (el); continue; } else { GST_DEBUG_OBJECT (src, "Found compatible caps"); } } gst_element_set_bus (el, bus); ret = gst_element_set_state (el, GST_STATE_READY); if (ret == GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (src, "This worked!"); choice = el; break; } /* collect all error messages */ while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { GST_DEBUG_OBJECT (src, "error message %" GST_PTR_FORMAT, message); errors = g_slist_append (errors, message); } gst_element_set_state (el, GST_STATE_NULL); gst_object_unref (el); } } GST_DEBUG_OBJECT (src, "done trying"); if (!choice) { if (errors) { /* FIXME: we forward the first error for now; but later on it might make * sense to actually analyse them */ gst_message_ref (GST_MESSAGE (errors->data)); GST_DEBUG_OBJECT (src, "reposting message %p", errors->data); gst_element_post_message (GST_ELEMENT (src), GST_MESSAGE (errors->data)); } else { /* send warning message to application and use a fakesrc */ GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL), ("Failed to find a usable video source")); choice = gst_element_factory_make ("fakesrc", "fake-video-src"); if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) g_object_set (choice, "sync", TRUE, NULL); gst_element_set_state (choice, GST_STATE_READY); } } gst_object_unref (bus); gst_plugin_feature_list_free (list); g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); g_slist_free (errors); return choice; } static gboolean gst_auto_video_src_detect (GstAutoVideoSrc * src) { GstElement *esrc; GstPad *targetpad; gst_auto_video_src_clear_kid (src); /* find element */ GST_DEBUG_OBJECT (src, "Creating new kid"); if (!(esrc = gst_auto_video_src_find_best (src))) goto no_src; src->kid = esrc; gst_bin_add (GST_BIN (src), esrc); /* attach ghost pad */ GST_DEBUG_OBJECT (src, "Re-assigning ghostpad"); targetpad = gst_element_get_static_pad (src->kid, "src"); if (!gst_ghost_pad_set_target (GST_GHOST_PAD (src->pad), targetpad)) goto target_failed; gst_object_unref (targetpad); GST_DEBUG_OBJECT (src, "done changing auto video source"); return TRUE; /* ERRORS */ no_src: { GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Failed to find a supported video source")); return FALSE; } target_failed: { GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("Failed to set target pad")); gst_object_unref (targetpad); return FALSE; } } static GstStateChangeReturn gst_auto_video_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstAutoVideoSrc *src = GST_AUTO_VIDEO_SRC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_auto_video_src_detect (src)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_auto_video_src_reset (src); break; default: break; } return ret; } static void gst_auto_video_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAutoVideoSrc *src = GST_AUTO_VIDEO_SRC (object); switch (prop_id) { case PROP_CAPS: if (src->filter_caps) gst_caps_unref (src->filter_caps); src->filter_caps = gst_caps_copy (gst_value_get_caps (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_auto_video_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAutoVideoSrc *src = GST_AUTO_VIDEO_SRC (object); switch (prop_id) { case PROP_CAPS:{ gst_value_set_caps (value, src->filter_caps); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/autodetect/gstautodetect.c0000644000175000017500000000355211671175353017776 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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 #include "gstautodetect.h" #include "gstautoaudiosink.h" #include "gstautoaudiosrc.h" #include "gstautovideosink.h" #include "gstautovideosrc.h" GST_DEBUG_CATEGORY (autodetect_debug); static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (autodetect_debug, "autodetect", 0, "Autodetection audio/video output wrapper elements"); return gst_element_register (plugin, "autovideosink", GST_RANK_NONE, GST_TYPE_AUTO_VIDEO_SINK) && gst_element_register (plugin, "autovideosrc", GST_RANK_NONE, GST_TYPE_AUTO_VIDEO_SRC) && gst_element_register (plugin, "autoaudiosink", GST_RANK_NONE, GST_TYPE_AUTO_AUDIO_SINK) && gst_element_register (plugin, "autoaudiosrc", GST_RANK_NONE, GST_TYPE_AUTO_AUDIO_SRC); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "autodetect", "Plugin contains auto-detection plugins for video/audio in- and outputs", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/autodetect/gstautovideosink.h0000644000175000017500000000354211671175353020525 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * * 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_AUTO_VIDEO_SINK_H__ #define __GST_AUTO_VIDEO_SINK_H__ #include G_BEGIN_DECLS #define GST_TYPE_AUTO_VIDEO_SINK \ (gst_auto_video_sink_get_type ()) #define GST_AUTO_VIDEO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AUTO_VIDEO_SINK, \ GstAutoVideoSink)) #define GST_AUTO_VIDEO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AUTO_VIDEO_SINK, \ GstAutoVideoSinkClass)) #define GST_IS_AUTO_VIDEO_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AUTO_VIDEO_SINK)) #define GST_IS_AUTO_VIDEO_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AUTO_VIDEO_SINK)) typedef struct _GstAutoVideoSink { GstBin parent; /* explicit pointers to stuff used */ GstPad *pad; GstElement *kid; GstCaps *filter_caps; } GstAutoVideoSink; typedef struct _GstAutoVideoSinkClass { GstBinClass parent_class; } GstAutoVideoSinkClass; GType gst_auto_video_sink_get_type (void); G_END_DECLS #endif /* __GST_AUTO_VIDEO_SINK_H__ */ gst-plugins-good-0.10.31/gst/autodetect/Makefile.in0000644000175000017500000010205011720560230016774 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/autodetect DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstautodetect_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgstautodetect_la_OBJECTS = \ libgstautodetect_la-gstautoaudiosink.lo \ libgstautodetect_la-gstautoaudiosrc.lo \ libgstautodetect_la-gstautodetect.lo \ libgstautodetect_la-gstautovideosink.lo \ libgstautodetect_la-gstautovideosrc.lo libgstautodetect_la_OBJECTS = $(am_libgstautodetect_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstautodetect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstautodetect_la_CFLAGS) $(CFLAGS) \ $(libgstautodetect_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstautodetect_la_SOURCES) DIST_SOURCES = $(libgstautodetect_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstautodetect.la libgstautodetect_la_SOURCES = \ gstautoaudiosink.c \ gstautoaudiosrc.c \ gstautodetect.c \ gstautovideosink.c \ gstautovideosrc.c libgstautodetect_la_CFLAGS = $(GST_CFLAGS) libgstautodetect_la_LIBADD = $(GST_LIBS) libgstautodetect_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstautodetect_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ gstautoaudiosink.h \ gstautoaudiosrc.h \ gstautodetect.h \ gstautovideosink.h \ gstautovideosrc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/autodetect/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/autodetect/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstautodetect.la: $(libgstautodetect_la_OBJECTS) $(libgstautodetect_la_DEPENDENCIES) $(EXTRA_libgstautodetect_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstautodetect_la_LINK) -rpath $(plugindir) $(libgstautodetect_la_OBJECTS) $(libgstautodetect_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautodetect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautovideosink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstautodetect_la-gstautovideosrc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstautodetect_la-gstautoaudiosink.lo: gstautoaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautoaudiosink.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Tpo -c -o libgstautodetect_la-gstautoaudiosink.lo `test -f 'gstautoaudiosink.c' || echo '$(srcdir)/'`gstautoaudiosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Tpo $(DEPDIR)/libgstautodetect_la-gstautoaudiosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautoaudiosink.c' object='libgstautodetect_la-gstautoaudiosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautoaudiosink.lo `test -f 'gstautoaudiosink.c' || echo '$(srcdir)/'`gstautoaudiosink.c libgstautodetect_la-gstautoaudiosrc.lo: gstautoaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautoaudiosrc.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Tpo -c -o libgstautodetect_la-gstautoaudiosrc.lo `test -f 'gstautoaudiosrc.c' || echo '$(srcdir)/'`gstautoaudiosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Tpo $(DEPDIR)/libgstautodetect_la-gstautoaudiosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautoaudiosrc.c' object='libgstautodetect_la-gstautoaudiosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautoaudiosrc.lo `test -f 'gstautoaudiosrc.c' || echo '$(srcdir)/'`gstautoaudiosrc.c libgstautodetect_la-gstautodetect.lo: gstautodetect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautodetect.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautodetect.Tpo -c -o libgstautodetect_la-gstautodetect.lo `test -f 'gstautodetect.c' || echo '$(srcdir)/'`gstautodetect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautodetect.Tpo $(DEPDIR)/libgstautodetect_la-gstautodetect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautodetect.c' object='libgstautodetect_la-gstautodetect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautodetect.lo `test -f 'gstautodetect.c' || echo '$(srcdir)/'`gstautodetect.c libgstautodetect_la-gstautovideosink.lo: gstautovideosink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautovideosink.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautovideosink.Tpo -c -o libgstautodetect_la-gstautovideosink.lo `test -f 'gstautovideosink.c' || echo '$(srcdir)/'`gstautovideosink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautovideosink.Tpo $(DEPDIR)/libgstautodetect_la-gstautovideosink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautovideosink.c' object='libgstautodetect_la-gstautovideosink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautovideosink.lo `test -f 'gstautovideosink.c' || echo '$(srcdir)/'`gstautovideosink.c libgstautodetect_la-gstautovideosrc.lo: gstautovideosrc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -MT libgstautodetect_la-gstautovideosrc.lo -MD -MP -MF $(DEPDIR)/libgstautodetect_la-gstautovideosrc.Tpo -c -o libgstautodetect_la-gstautovideosrc.lo `test -f 'gstautovideosrc.c' || echo '$(srcdir)/'`gstautovideosrc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstautodetect_la-gstautovideosrc.Tpo $(DEPDIR)/libgstautodetect_la-gstautovideosrc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstautovideosrc.c' object='libgstautodetect_la-gstautovideosrc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstautodetect_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstautodetect_la_CFLAGS) $(CFLAGS) -c -o libgstautodetect_la-gstautovideosrc.lo `test -f 'gstautovideosrc.c' || echo '$(srcdir)/'`gstautovideosrc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstautodetect -:SHARED libgstautodetect \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstautodetect_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstautodetect_la_CFLAGS) \ -:LDFLAGS $(libgstautodetect_la_LDFLAGS) \ $(libgstautodetect_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/autodetect/gstautoaudiosink.c0000644000175000017500000003216711677341655020526 00000000000000/* GStreamer * (c) 2005 Ronald S. Bultje * (c) 2006 Jan Schmidt * * 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-autoaudiosink * @see_also: autovideosink, alsasink, osssink * * autoaudiosink is an audio sink that automatically detects an appropriate * audio sink to use. It does so by scanning the registry for all elements * that have Sink and Audio in the class field * of their element information, and also have a non-zero autoplugging rank. * * * Example launch line * |[ * gst-launch -v -m audiotestsrc ! audioconvert ! audioresample ! autoaudiosink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstautoaudiosink.h" #include "gstautodetect.h" /* Properties */ enum { PROP_0, PROP_CAPS, }; static GstStateChangeReturn gst_auto_audio_sink_change_state (GstElement * element, GstStateChange transition); static void gst_auto_audio_sink_dispose (GstAutoAudioSink * sink); static void gst_auto_audio_sink_clear_kid (GstAutoAudioSink * sink); static void gst_auto_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_auto_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstAutoAudioSink, gst_auto_audio_sink, GstBin, GST_TYPE_BIN); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static void gst_auto_audio_sink_base_init (gpointer klass) { GstElementClass *eklass = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (eklass, &sink_template); gst_element_class_set_details_simple (eklass, "Auto audio sink", "Sink/Audio", "Wrapper audio sink for automatically detected audio sink", "Jan Schmidt "); } static void gst_auto_audio_sink_class_init (GstAutoAudioSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *eklass; gobject_class = G_OBJECT_CLASS (klass); eklass = GST_ELEMENT_CLASS (klass); gobject_class->dispose = (GObjectFinalizeFunc) gst_auto_audio_sink_dispose; gobject_class->set_property = gst_auto_audio_sink_set_property; gobject_class->get_property = gst_auto_audio_sink_get_property; eklass->change_state = GST_DEBUG_FUNCPTR (gst_auto_audio_sink_change_state); /** * GstAutoAudioSink:filter-caps * * This property will filter out candidate sinks that can handle the specified * caps. By default only audio sinks that support raw floating point and * integer audio are selected. * * This property can only be set before the element goes to the READY state. * * Since: 0.10.7 **/ g_object_class_install_property (gobject_class, PROP_CAPS, g_param_spec_boxed ("filter-caps", "Filter caps", "Filter sink candidates using these caps.", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_auto_audio_sink_dispose (GstAutoAudioSink * sink) { gst_auto_audio_sink_clear_kid (sink); if (sink->filter_caps) gst_caps_unref (sink->filter_caps); sink->filter_caps = NULL; G_OBJECT_CLASS (parent_class)->dispose ((GObject *) sink); } static void gst_auto_audio_sink_clear_kid (GstAutoAudioSink * sink) { if (sink->kid) { gst_element_set_state (sink->kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (sink), sink->kid); sink->kid = NULL; /* Don't lose the SINK flag */ GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } } /* * Hack to make initial linking work; ideally, this'd work even when * no target has been assigned to the ghostpad yet. */ static void gst_auto_audio_sink_reset (GstAutoAudioSink * sink) { GstPad *targetpad; gst_auto_audio_sink_clear_kid (sink); /* fakesink placeholder */ sink->kid = gst_element_factory_make ("fakesink", "tempsink"); gst_bin_add (GST_BIN (sink), sink->kid); /* pad */ targetpad = gst_element_get_static_pad (sink->kid, "sink"); gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad); gst_object_unref (targetpad); } static GstStaticCaps raw_caps = GST_STATIC_CAPS ("audio/x-raw-int; audio/x-raw-float"); static void gst_auto_audio_sink_init (GstAutoAudioSink * sink, GstAutoAudioSinkClass * g_class) { sink->pad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); gst_element_add_pad (GST_ELEMENT (sink), sink->pad); gst_auto_audio_sink_reset (sink); /* set the default raw audio caps */ sink->filter_caps = gst_static_caps_get (&raw_caps); /* mark as sink */ GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } static gboolean gst_auto_audio_sink_factory_filter (GstPluginFeature * feature, gpointer data) { guint rank; const gchar *klass; /* we only care about element factories */ if (!GST_IS_ELEMENT_FACTORY (feature)) return FALSE; /* audio sinks */ klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature)); if (!(strstr (klass, "Sink") && strstr (klass, "Audio"))) return FALSE; /* only select elements with autoplugging rank */ rank = gst_plugin_feature_get_rank (feature); if (rank < GST_RANK_MARGINAL) return FALSE; return TRUE; } static gint gst_auto_audio_sink_compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2) { gint diff; diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1); if (diff != 0) return diff; return strcmp (gst_plugin_feature_get_name (f2), gst_plugin_feature_get_name (f1)); } static GstElement * gst_auto_audio_sink_create_element_with_pretty_name (GstAutoAudioSink * sink, GstElementFactory * factory) { GstElement *element; gchar *name, *marker; marker = g_strdup (GST_PLUGIN_FEATURE (factory)->name); if (g_str_has_suffix (marker, "sink")) marker[strlen (marker) - 4] = '\0'; if (g_str_has_prefix (marker, "gst")) g_memmove (marker, marker + 3, strlen (marker + 3) + 1); name = g_strdup_printf ("%s-actual-sink-%s", GST_OBJECT_NAME (sink), marker); g_free (marker); element = gst_element_factory_create (factory, name); g_free (name); return element; } static GstElement * gst_auto_audio_sink_find_best (GstAutoAudioSink * sink) { GList *list, *item; GstElement *choice = NULL; GstMessage *message = NULL; GSList *errors = NULL; GstBus *bus = gst_bus_new (); GstPad *el_pad = NULL; GstCaps *el_caps = NULL; gboolean no_match = TRUE; list = gst_registry_feature_filter (gst_registry_get_default (), (GstPluginFeatureFilter) gst_auto_audio_sink_factory_filter, FALSE, sink); list = g_list_sort (list, (GCompareFunc) gst_auto_audio_sink_compare_ranks); /* We don't treat sound server sinks special. Our policy is that sound * server sinks that have a rank must not auto-spawn a daemon under any * circumstances, so there's nothing for us to worry about here */ GST_LOG_OBJECT (sink, "Trying to find usable audio devices ..."); for (item = list; item != NULL; item = item->next) { GstElementFactory *f = GST_ELEMENT_FACTORY (item->data); GstElement *el; if ((el = gst_auto_audio_sink_create_element_with_pretty_name (sink, f))) { GstStateChangeReturn ret; GST_DEBUG_OBJECT (sink, "Testing %s", GST_PLUGIN_FEATURE (f)->name); /* If autoaudiosink has been provided with filter caps, * accept only sinks that match with the filter caps */ if (sink->filter_caps) { el_pad = gst_element_get_static_pad (GST_ELEMENT (el), "sink"); el_caps = gst_pad_get_caps (el_pad); gst_object_unref (el_pad); GST_DEBUG_OBJECT (sink, "Checking caps: %" GST_PTR_FORMAT " vs. %" GST_PTR_FORMAT, sink->filter_caps, el_caps); no_match = !gst_caps_can_intersect (sink->filter_caps, el_caps); gst_caps_unref (el_caps); if (no_match) { GST_DEBUG_OBJECT (sink, "Incompatible caps"); gst_object_unref (el); continue; } else { GST_DEBUG_OBJECT (sink, "Found compatible caps"); } } gst_element_set_bus (el, bus); ret = gst_element_set_state (el, GST_STATE_READY); if (ret == GST_STATE_CHANGE_SUCCESS) { GST_DEBUG_OBJECT (sink, "This worked!"); choice = el; break; } /* collect all error messages */ while ((message = gst_bus_pop_filtered (bus, GST_MESSAGE_ERROR))) { GST_DEBUG_OBJECT (sink, "error message %" GST_PTR_FORMAT, message); errors = g_slist_append (errors, message); } gst_element_set_state (el, GST_STATE_NULL); gst_object_unref (el); } } GST_DEBUG_OBJECT (sink, "done trying"); if (!choice) { if (errors) { /* FIXME: we forward the first error for now; but later on it might make * sense to actually analyse them */ gst_message_ref (GST_MESSAGE (errors->data)); GST_DEBUG_OBJECT (sink, "reposting message %p", errors->data); gst_element_post_message (GST_ELEMENT (sink), GST_MESSAGE (errors->data)); } else { /* send warning message to application and use a fakesink */ GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL), ("Failed to find a usable audio sink")); choice = gst_element_factory_make ("fakesink", "fake-audio-sink"); if (g_object_class_find_property (G_OBJECT_GET_CLASS (choice), "sync")) g_object_set (choice, "sync", TRUE, NULL); gst_element_set_state (choice, GST_STATE_READY); } } gst_object_unref (bus); gst_plugin_feature_list_free (list); g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL); g_slist_free (errors); return choice; } static gboolean gst_auto_audio_sink_detect (GstAutoAudioSink * sink) { GstElement *esink; GstPad *targetpad; gst_auto_audio_sink_clear_kid (sink); /* find element */ GST_DEBUG_OBJECT (sink, "Creating new kid"); if (!(esink = gst_auto_audio_sink_find_best (sink))) goto no_sink; sink->kid = esink; /* Ensure the child is brought up to the right state to match the parent * although it's currently always in READY and * we're always doing NULL->READY. */ if (GST_STATE (sink->kid) < GST_STATE (sink)) gst_element_set_state (sink->kid, GST_STATE (sink)); gst_bin_add (GST_BIN (sink), esink); /* attach ghost pad */ GST_DEBUG_OBJECT (sink, "Re-assigning ghostpad"); targetpad = gst_element_get_static_pad (sink->kid, "sink"); if (!gst_ghost_pad_set_target (GST_GHOST_PAD (sink->pad), targetpad)) goto target_failed; gst_object_unref (targetpad); GST_DEBUG_OBJECT (sink, "done changing auto audio sink"); return TRUE; /* ERRORS */ no_sink: { GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), ("Failed to find a supported audio sink")); return FALSE; } target_failed: { GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL), ("Failed to set target pad")); gst_object_unref (targetpad); return FALSE; } } static GstStateChangeReturn gst_auto_audio_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstAutoAudioSink *sink = GST_AUTO_AUDIO_SINK (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_auto_audio_sink_detect (sink)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_auto_audio_sink_reset (sink); break; default: break; } return ret; } static void gst_auto_audio_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAutoAudioSink *sink = GST_AUTO_AUDIO_SINK (object); switch (prop_id) { case PROP_CAPS: if (sink->filter_caps) gst_caps_unref (sink->filter_caps); sink->filter_caps = gst_caps_copy (gst_value_get_caps (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_auto_audio_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAutoAudioSink *sink = GST_AUTO_AUDIO_SINK (object); switch (prop_id) { case PROP_CAPS:{ gst_value_set_caps (value, sink->filter_caps); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/effectv/0000755000175000017500000000000011720565302014277 500000000000000gst-plugins-good-0.10.31/gst/effectv/gstrev.c0000644000175000017500000001712311677341655015717 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001 FUKUCHI Kentarou * * revTV based on Rutt-Etra Video Synthesizer 1974? * (c)2002 Ed Tannenbaum * * This effect acts like a waveform monitor on each line. * It was originally done by deflecting the electron beam on a monitor using * additional electromagnets on the yoke of a b/w CRT. * Here it is emulated digitally. * Experimaental tapes were made with this system by Bill and * Louise Etra and Woody and Steina Vasulka * The line spacing can be controlled using the 1 and 2 Keys. * The gain is controlled using the 3 and 4 keys. * The update rate is controlled using the 0 and - keys. * EffecTV is free software. 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-quarktv * * RevTV acts like a video waveform monitor for each line of video * processed. This creates a pseudo 3D effect based on the brightness * of the video along each line. * * * Example launch line * |[ * gst-launch -v videotestsrc ! revtv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of revtv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstrev.h" #include #include #define THE_COLOR 0xffffffff enum { PROP_0, PROP_DELAY, PROP_LINESPACE, PROP_GAIN }; GST_BOILERPLATE (GstRevTV, gst_revtv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx #else #define CAPS_STR GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_xRGB #endif static GstStaticPadTemplate gst_revtv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_revtv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static gboolean gst_revtv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstRevTV *filter = GST_REVTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static GstFlowReturn gst_revtv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstRevTV *filter = GST_REVTV (trans); guint32 *src, *dest; gint width, height; guint32 *nsrc; gint y, x, R, G, B, yval; GstFlowReturn ret = GST_FLOW_OK; gint linespace, vscale; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); GST_OBJECT_LOCK (filter); width = filter->width; height = filter->height; /* Clear everything to black */ memset (dest, 0, width * height * sizeof (guint32)); linespace = filter->linespace; vscale = filter->vscale; /* draw the offset lines */ for (y = 0; y < height; y += linespace) { for (x = 0; x <= width; x++) { nsrc = src + (y * width) + x; /* Calc Y Value for curpix */ R = ((*nsrc) & 0xff0000) >> (16 - 1); G = ((*nsrc) & 0xff00) >> (8 - 2); B = (*nsrc) & 0xff; yval = y - ((short) (R + G + B) / vscale); if (yval > 0) { dest[x + (yval * width)] = THE_COLOR; } } } GST_OBJECT_UNLOCK (filter); return ret; } static void gst_revtv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRevTV *filter = GST_REVTV (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_DELAY: filter->vgrabtime = g_value_get_int (value); break; case PROP_LINESPACE: filter->linespace = g_value_get_int (value); break; case PROP_GAIN: filter->vscale = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_revtv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRevTV *filter = GST_REVTV (object); switch (prop_id) { case PROP_DELAY: g_value_set_int (value, filter->vgrabtime); break; case PROP_LINESPACE: g_value_set_int (value, filter->linespace); break; case PROP_GAIN: g_value_set_int (value, filter->vscale); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_revtv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "RevTV effect", "Filter/Effect/Video", "A video waveform monitor for each line of video processed", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &gst_revtv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_revtv_src_template); } static void gst_revtv_class_init (GstRevTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_revtv_set_property; gobject_class->get_property = gst_revtv_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DELAY, g_param_spec_int ("delay", "Delay", "Delay in frames between updates", 1, 100, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LINESPACE, g_param_spec_int ("linespace", "Linespace", "Control line spacing", 1, 100, 6, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GAIN, g_param_spec_int ("gain", "Gain", "Control gain", 1, 200, 50, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_revtv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_revtv_transform); } static void gst_revtv_init (GstRevTV * restv, GstRevTVClass * klass) { restv->vgrabtime = 1; restv->vgrab = 0; restv->linespace = 6; restv->vscale = 50; } gst-plugins-good-0.10.31/gst/effectv/gstwarp.h0000644000175000017500000000356111671175353016074 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001 FUKUCHI Kentarou * * 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_WARP_H__ #define __GST_WARP_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_WARPTV \ (gst_warptv_get_type()) #define GST_WARPTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WARPTV,GstWarpTV)) #define GST_WARPTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WARPTV,GstWarpTVClass)) #define GST_IS_WARPTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WARPTV)) #define GST_IS_WARPTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WARPTV)) typedef struct _GstWarpTV GstWarpTV; typedef struct _GstWarpTVClass GstWarpTVClass; struct _GstWarpTV { GstVideoFilter videofilter; /* < private > */ gint width, height; gint *offstable; gint32 *disttable; gint32 ctable[1024]; gint tval; }; struct _GstWarpTVClass { GstVideoFilterClass parent_class; }; GType gst_warptv_get_type (void); G_END_DECLS #endif /* __GST_WARP_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstshagadelic.c0000644000175000017500000001637511677341655017217 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * Inspired by Adrian Likin's script for the GIMP. * EffecTV is free software. 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-shagadelictv * * Oh behave, ShagedelicTV makes images shagadelic! * * * Example launch line * |[ * gst-launch -v videotestsrc ! shagadelictv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of shagadelictv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstshagadelic.h" #include "gsteffectv.h" #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif GST_BOILERPLATE (GstShagadelicTV, gst_shagadelictv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void gst_shagadelic_initialize (GstShagadelicTV * filter); #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_BGRx #else #define CAPS_STR GST_VIDEO_CAPS_xRGB #endif static GstStaticPadTemplate gst_shagadelictv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_shagadelictv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static gboolean gst_shagadelictv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstShagadelicTV *filter = GST_SHAGADELICTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { gint area = filter->width * filter->height; g_free (filter->ripple); g_free (filter->spiral); filter->ripple = (guint8 *) g_malloc (area * 4); filter->spiral = (guint8 *) g_malloc (area); gst_shagadelic_initialize (filter); ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static void gst_shagadelic_initialize (GstShagadelicTV * filter) { int i, x, y; #ifdef PS2 float xx, yy; #else double xx, yy; #endif i = 0; for (y = 0; y < filter->height * 2; y++) { yy = y - filter->height; yy *= yy; for (x = 0; x < filter->width * 2; x++) { xx = x - filter->width; #ifdef PS2 filter->ripple[i++] = ((unsigned int) (sqrtf (xx * xx + yy) * 8)) & 255; #else filter->ripple[i++] = ((unsigned int) (sqrt (xx * xx + yy) * 8)) & 255; #endif } } i = 0; for (y = 0; y < filter->height; y++) { yy = y - filter->height / 2; for (x = 0; x < filter->width; x++) { xx = x - filter->width / 2; #ifdef PS2 filter->spiral[i++] = ((unsigned int) ((atan2f (xx, yy) / ((float) M_PI) * 256 * 9) + (sqrtf (xx * xx + yy * yy) * 5))) & 255; #else filter->spiral[i++] = ((unsigned int) ((atan2 (xx, yy) / M_PI * 256 * 9) + (sqrt (xx * xx + yy * yy) * 5))) & 255; #endif /* Here is another Swinger! * ((atan2(xx, yy)/M_PI*256) + (sqrt(xx*xx+yy*yy)*10))&255; */ } } filter->rx = fastrand () % filter->width; filter->ry = fastrand () % filter->height; filter->bx = fastrand () % filter->width; filter->by = fastrand () % filter->height; filter->rvx = -2; filter->rvy = -2; filter->bvx = 2; filter->bvy = 2; filter->phase = 0; } static GstFlowReturn gst_shagadelictv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstShagadelicTV *filter = GST_SHAGADELICTV (trans); guint32 *src, *dest; gint x, y; guint32 v; guint8 r, g, b; gint width, height; GstFlowReturn ret = GST_FLOW_OK; src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); GST_OBJECT_LOCK (filter); width = filter->width; height = filter->height; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { v = *src++ | 0x1010100; v = (v - 0x707060) & 0x1010100; v -= v >> 8; /* Try another Babe! * v = *src++; * *dest++ = v & ((r<<16)|(g<<8)|b); */ r = ((gint8) (filter->ripple[(filter->ry + y) * width * 2 + filter->rx + x] + filter->phase * 2)) >> 7; g = ((gint8) (filter->spiral[y * width + x] + filter->phase * 3)) >> 7; b = ((gint8) (filter->ripple[(filter->by + y) * width * 2 + filter->bx + x] - filter->phase)) >> 7; *dest++ = v & ((r << 16) | (g << 8) | b); } } filter->phase -= 8; if ((filter->rx + filter->rvx) < 0 || (filter->rx + filter->rvx) >= width) filter->rvx = -filter->rvx; if ((filter->ry + filter->rvy) < 0 || (filter->ry + filter->rvy) >= height) filter->rvy = -filter->rvy; if ((filter->bx + filter->bvx) < 0 || (filter->bx + filter->bvx) >= width) filter->bvx = -filter->bvx; if ((filter->by + filter->bvy) < 0 || (filter->by + filter->bvy) >= height) filter->bvy = -filter->bvy; filter->rx += filter->rvx; filter->ry += filter->rvy; filter->bx += filter->bvx; filter->by += filter->bvy; GST_OBJECT_UNLOCK (filter); return ret; } static void gst_shagadelictv_finalize (GObject * object) { GstShagadelicTV *filter = GST_SHAGADELICTV (object); if (filter->ripple) g_free (filter->ripple); filter->ripple = NULL; if (filter->spiral) g_free (filter->spiral); filter->spiral = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_shagadelictv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "ShagadelicTV", "Filter/Effect/Video", "Oh behave, ShagedelicTV makes images shagadelic!", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &gst_shagadelictv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_shagadelictv_src_template); } static void gst_shagadelictv_class_init (GstShagadelicTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->finalize = gst_shagadelictv_finalize; trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_shagadelictv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_shagadelictv_transform); } static void gst_shagadelictv_init (GstShagadelicTV * filter, GstShagadelicTVClass * klass) { filter->ripple = NULL; filter->spiral = NULL; } gst-plugins-good-0.10.31/gst/effectv/gsteffectv.c0000644000175000017500000000437111671175353016540 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * EffecTV is free software. 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 "gsteffectv.h" #include "gstaging.h" #include "gstdice.h" #include "gstedge.h" #include "gstquark.h" #include "gstrev.h" #include "gstshagadelic.h" #include "gstvertigo.h" #include "gstwarp.h" #include "gstop.h" #include "gstradioac.h" #include "gststreak.h" #include "gstripple.h" struct _elements_entry { const gchar *name; GType (*type) (void); }; static const struct _elements_entry _elements[] = { {"edgetv", gst_edgetv_get_type}, {"agingtv", gst_agingtv_get_type}, {"dicetv", gst_dicetv_get_type}, {"warptv", gst_warptv_get_type}, {"shagadelictv", gst_shagadelictv_get_type}, {"vertigotv", gst_vertigotv_get_type}, {"revtv", gst_revtv_get_type}, {"quarktv", gst_quarktv_get_type}, {"optv", gst_optv_get_type}, {"radioactv", gst_radioactv_get_type}, {"streaktv", gst_streaktv_get_type}, {"rippletv", gst_rippletv_get_type}, {NULL, 0}, }; static gboolean plugin_init (GstPlugin * plugin) { gint i = 0; while (_elements[i].name) { if (!gst_element_register (plugin, _elements[i].name, GST_RANK_NONE, (_elements[i].type) ())) return FALSE; i++; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "effectv", "effect plugins from the effectv project", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/effectv/gstradioac.c0000644000175000017500000004056011677341655016526 00000000000000/* GStreamer * Cradioacyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Cradioacyright (C) 2001-2006 FUKUCHI Kentaro * * RadioacTV - motion-enlightment effect. * Cradioacyright (C) 2001-2002 FUKUCHI Kentaro * * EffecTV is free software. 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 radioaction) any later version. * * This library is distributed in the hradioace 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 cradioacy 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-radioactv * * RadioacTV does *NOT* detect a radioactivity. It detects a difference * from previous frame and blurs it. * * RadioacTV has 4 mode, normal, strobe1, strobe2 and trigger. * In trigger mode, effect appears only when the trigger property is %TRUE. * * strobe1 and strobe2 mode drops some frames. strobe1 mode uses the difference between * current frame and previous frame dropped, while strobe2 mode uses the difference from * previous frame displayed. The effect of strobe2 is stronger than strobe1. * * * Example launch line * |[ * gst-launch -v videotestsrc ! radioactv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of radioactv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstradioac.h" #include "gsteffectv.h" #include #include enum { RADIOAC_NORMAL = 0, RADIOAC_STROBE, RADIOAC_STROBE2, RADIOAC_TRIGGER }; enum { COLOR_RED = 0, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE }; #define GST_TYPE_RADIOACTV_MODE (gst_radioactv_mode_get_type()) static GType gst_radioactv_mode_get_type (void) { static GType type = 0; static const GEnumValue enumvalue[] = { {RADIOAC_NORMAL, "Normal", "normal"}, {RADIOAC_STROBE, "Strobe 1", "strobe1"}, {RADIOAC_STROBE2, "Strobe 2", "strobe2"}, {RADIOAC_TRIGGER, "Trigger", "trigger"}, {0, NULL, NULL}, }; if (!type) { type = g_enum_register_static ("GstRadioacTVMode", enumvalue); } return type; } #define GST_TYPE_RADIOACTV_COLOR (gst_radioactv_color_get_type()) static GType gst_radioactv_color_get_type (void) { static GType type = 0; static const GEnumValue enumvalue[] = { {COLOR_RED, "Red", "red"}, {COLOR_GREEN, "Green", "green"}, {COLOR_BLUE, "Blue", "blue"}, {COLOR_WHITE, "White", "white"}, {0, NULL, NULL}, }; if (!type) { type = g_enum_register_static ("GstRadioacTVColor", enumvalue); } return type; } #define DEFAULT_MODE RADIOAC_NORMAL #define DEFAULT_COLOR COLOR_WHITE #define DEFAULT_INTERVAL 3 #define DEFAULT_TRIGGER FALSE enum { PROP_0, PROP_MODE, PROP_COLOR, PROP_INTERVAL, PROP_TRIGGER }; #define COLORS 32 #define PATTERN 4 #define MAGIC_THRESHOLD 40 #define RATIO 0.95 static guint32 palettes[COLORS * PATTERN]; static gint swap_tab[] = { 2, 1, 0, 3 }; GST_BOILERPLATE (GstRadioacTV, gst_radioactv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_RGBx "; " GST_VIDEO_CAPS_BGRx #else #define CAPS_STR GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB #endif static GstStaticPadTemplate gst_radioactv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_radioactv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static void makePalette (void) { gint i; #define DELTA (255/(COLORS/2-1)) /* red, gree, blue */ for (i = 0; i < COLORS / 2; i++) { palettes[i] = i * DELTA; palettes[COLORS + i] = (i * DELTA) << 8; palettes[COLORS * 2 + i] = (i * DELTA) << 16; } for (i = 0; i < COLORS / 2; i++) { palettes[i + COLORS / 2] = 255 | (i * DELTA) << 16 | (i * DELTA) << 8; palettes[COLORS + i + COLORS / 2] = (255 << 8) | (i * DELTA) << 16 | i * DELTA; palettes[COLORS * 2 + i + COLORS / 2] = (255 << 16) | (i * DELTA) << 8 | i * DELTA; } /* white */ for (i = 0; i < COLORS; i++) { palettes[COLORS * 3 + i] = (255 * i / COLORS) * 0x10101; } for (i = 0; i < COLORS * PATTERN; i++) { palettes[i] = palettes[i] & 0xfefeff; } #undef DELTA } #define VIDEO_HWIDTH (filter->buf_width/2) #define VIDEO_HHEIGHT (filter->buf_height/2) /* this table assumes that video_width is times of 32 */ static void setTable (GstRadioacTV * filter) { guint bits; gint x, y, tx, ty, xx; gint ptr, prevptr; prevptr = (gint) (0.5 + RATIO * (-VIDEO_HWIDTH) + VIDEO_HWIDTH); for (xx = 0; xx < (filter->buf_width_blocks); xx++) { bits = 0; for (x = 0; x < 32; x++) { ptr = (gint) (0.5 + RATIO * (xx * 32 + x - VIDEO_HWIDTH) + VIDEO_HWIDTH); bits = bits >> 1; if (ptr != prevptr) bits |= 0x80000000; prevptr = ptr; } filter->blurzoomx[xx] = bits; } ty = (gint) (0.5 + RATIO * (-VIDEO_HHEIGHT) + VIDEO_HHEIGHT); tx = (gint) (0.5 + RATIO * (-VIDEO_HWIDTH) + VIDEO_HWIDTH); xx = (gint) (0.5 + RATIO * (filter->buf_width - 1 - VIDEO_HWIDTH) + VIDEO_HWIDTH); filter->blurzoomy[0] = ty * filter->buf_width + tx; prevptr = ty * filter->buf_width + xx; for (y = 1; y < filter->buf_height; y++) { ty = (gint) (0.5 + RATIO * (y - VIDEO_HHEIGHT) + VIDEO_HHEIGHT); filter->blurzoomy[y] = ty * filter->buf_width + tx - prevptr; prevptr = ty * filter->buf_width + xx; } } #undef VIDEO_HWIDTH #undef VIDEO_HHEIGHT static void blur (GstRadioacTV * filter) { gint x, y; gint width; guint8 *p, *q; guint8 v; width = filter->buf_width; p = filter->blurzoombuf + filter->width + 1; q = p + filter->buf_area; for (y = filter->buf_height - 2; y > 0; y--) { for (x = width - 2; x > 0; x--) { v = (*(p - width) + *(p - 1) + *(p + 1) + *(p + width)) / 4 - 1; if (v == 255) v = 0; *q = v; p++; q++; } p += 2; q += 2; } } static void zoom (GstRadioacTV * filter) { gint b, x, y; guint8 *p, *q; gint blocks, height; gint dx; p = filter->blurzoombuf + filter->buf_area; q = filter->blurzoombuf; height = filter->buf_height; blocks = filter->buf_width_blocks; for (y = 0; y < height; y++) { p += filter->blurzoomy[y]; for (b = 0; b < blocks; b++) { dx = filter->blurzoomx[b]; for (x = 0; x < 32; x++) { p += (dx & 1); *q++ = *p; dx = dx >> 1; } } } } static void blurzoomcore (GstRadioacTV * filter) { blur (filter); zoom (filter); } /* Background image is refreshed every frame */ static void image_bgsubtract_update_y (guint32 * src, gint16 * background, guint8 * diff, gint video_area, gint y_threshold) { gint i; gint R, G, B; guint32 *p; gint16 *q; guint8 *r; gint v; p = src; q = background; r = diff; for (i = 0; i < video_area; i++) { R = ((*p) & 0xff0000) >> (16 - 1); G = ((*p) & 0xff00) >> (8 - 2); B = (*p) & 0xff; v = (R + G + B) - (gint) (*q); *q = (gint16) (R + G + B); *r = ((v + y_threshold) >> 24) | ((y_threshold - v) >> 24); p++; q++; r++; } } static GstFlowReturn gst_radioactv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstRadioacTV *filter = GST_RADIOACTV (trans); guint32 *src, *dest; GstFlowReturn ret = GST_FLOW_OK; GstClockTime timestamp, stream_time; gint x, y; guint32 a, b; guint8 *diff, *p; guint32 *palette; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); GST_OBJECT_LOCK (filter); #if G_BYTE_ORDER == G_LITTLE_ENDIAN if (filter->format == GST_VIDEO_FORMAT_RGBx) { palette = &palettes[COLORS * filter->color]; } else { palette = &palettes[COLORS * swap_tab[filter->color]]; } #else if (filter->format == GST_VIDEO_FORMAT_xBGR) { palette = &palettes[COLORS * filter->color]; } else { palette = &palettes[COLORS * swap_tab[filter->color]]; } #endif diff = filter->diff; if (filter->mode == 3 && filter->trigger) filter->snaptime = 0; else if (filter->mode == 3 && !filter->trigger) filter->snaptime = 1; if (filter->mode != 2 || filter->snaptime <= 0) { image_bgsubtract_update_y (src, filter->background, diff, filter->width * filter->height, MAGIC_THRESHOLD * 7); if (filter->mode == 0 || filter->snaptime <= 0) { diff += filter->buf_margin_left; p = filter->blurzoombuf; for (y = 0; y < filter->buf_height; y++) { for (x = 0; x < filter->buf_width; x++) { p[x] |= diff[x] >> 3; } diff += filter->width; p += filter->buf_width; } if (filter->mode == 1 || filter->mode == 2) { memcpy (filter->snapframe, src, filter->width * filter->height * 4); } } } blurzoomcore (filter); if (filter->mode == 1 || filter->mode == 2) { src = filter->snapframe; } p = filter->blurzoombuf; for (y = 0; y < filter->height; y++) { for (x = 0; x < filter->buf_margin_left; x++) { *dest++ = *src++; } for (x = 0; x < filter->buf_width; x++) { a = *src++ & 0xfefeff; b = palette[*p++]; a += b; b = a & 0x1010100; *dest++ = a | (b - (b >> 8)); } for (x = 0; x < filter->buf_margin_right; x++) { *dest++ = *src++; } } if (filter->mode == 1 || filter->mode == 2) { filter->snaptime--; if (filter->snaptime < 0) { filter->snaptime = filter->interval; } } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_radioactv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstRadioacTV *filter = GST_RADIOACTV (btrans); gboolean ret = FALSE; GST_OBJECT_LOCK (filter); if (gst_video_format_parse_caps (incaps, &filter->format, &filter->width, &filter->height)) { filter->buf_width_blocks = filter->width / 32; if (filter->buf_width_blocks > 255) goto out; filter->buf_width = filter->buf_width_blocks * 32; filter->buf_height = filter->height; filter->buf_area = filter->buf_height * filter->buf_width; filter->buf_margin_left = (filter->width - filter->buf_width) / 2; filter->buf_margin_right = filter->height - filter->buf_width - filter->buf_margin_left; if (filter->blurzoombuf) g_free (filter->blurzoombuf); filter->blurzoombuf = g_new0 (guint8, filter->buf_area * 2); if (filter->blurzoomx) g_free (filter->blurzoomx); filter->blurzoomx = g_new0 (gint, filter->buf_width); if (filter->blurzoomy) g_free (filter->blurzoomy); filter->blurzoomy = g_new0 (gint, filter->buf_height); if (filter->snapframe) g_free (filter->snapframe); filter->snapframe = g_new (guint32, filter->width * filter->height); if (filter->diff) g_free (filter->diff); filter->diff = g_new (guint8, filter->width * filter->height); if (filter->background) g_free (filter->background); filter->background = g_new0 (gint16, filter->width * filter->height); setTable (filter); ret = TRUE; } out: GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_radioactv_start (GstBaseTransform * trans) { GstRadioacTV *filter = GST_RADIOACTV (trans); filter->snaptime = 0; return TRUE; } static void gst_radioactv_finalize (GObject * object) { GstRadioacTV *filter = GST_RADIOACTV (object); if (filter->snapframe) g_free (filter->snapframe); filter->snapframe = NULL; if (filter->blurzoombuf) g_free (filter->blurzoombuf); filter->blurzoombuf = NULL; if (filter->diff) g_free (filter->diff); filter->diff = NULL; if (filter->background) g_free (filter->background); filter->background = NULL; if (filter->blurzoomx) g_free (filter->blurzoomx); filter->blurzoomx = NULL; if (filter->blurzoomy) g_free (filter->blurzoomy); filter->blurzoomy = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_radioactv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRadioacTV *filter = GST_RADIOACTV (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_MODE: filter->mode = g_value_get_enum (value); if (filter->mode == 3) filter->snaptime = 1; break; case PROP_COLOR: filter->color = g_value_get_enum (value); break; case PROP_INTERVAL: filter->interval = g_value_get_uint (value); break; case PROP_TRIGGER: filter->trigger = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_radioactv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRadioacTV *filter = GST_RADIOACTV (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, filter->mode); break; case PROP_COLOR: g_value_set_enum (value, filter->color); break; case PROP_INTERVAL: g_value_set_uint (value, filter->interval); break; case PROP_TRIGGER: g_value_set_boolean (value, filter->trigger); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_radioactv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "RadioacTV effect", "Filter/Effect/Video", "motion-enlightment effect", "FUKUCHI, Kentarou , " "Sebastian Dröge "); gst_element_class_add_static_pad_template (element_class, &gst_radioactv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_radioactv_src_template); } static void gst_radioactv_class_init (GstRadioacTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_radioactv_set_property; gobject_class->get_property = gst_radioactv_get_property; gobject_class->finalize = gst_radioactv_finalize; g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Mode", GST_TYPE_RADIOACTV_MODE, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_COLOR, g_param_spec_enum ("color", "Color", "Color", GST_TYPE_RADIOACTV_COLOR, DEFAULT_COLOR, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_INTERVAL, g_param_spec_uint ("interval", "Interval", "Snapshot interval (in strobe mode)", 0, G_MAXINT, DEFAULT_INTERVAL, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_TRIGGER, g_param_spec_boolean ("trigger", "Trigger", "Trigger (in trigger mode)", DEFAULT_TRIGGER, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_radioactv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_radioactv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_radioactv_start); makePalette (); } static void gst_radioactv_init (GstRadioacTV * filter, GstRadioacTVClass * klass) { filter->mode = DEFAULT_MODE; filter->color = DEFAULT_COLOR; filter->interval = DEFAULT_INTERVAL; filter->trigger = DEFAULT_TRIGGER; } gst-plugins-good-0.10.31/gst/effectv/gstaging.h0000644000175000017500000000433111671175353016204 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2002 FUKUCHI Kentarou * * AgingTV - film-aging effect. * * 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_AGING_H__ #define __GST_AGING_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_AGINGTV \ (gst_agingtv_get_type()) #define GST_AGINGTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AGINGTV,GstAgingTV)) #define GST_AGINGTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AGINGTV,GstAgingTVClass)) #define GST_IS_AGINGTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AGINGTV)) #define GST_IS_AGINGTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AGINGTV)) typedef struct _scratch { gint life; gint x; gint dx; gint init; } scratch; #define SCRATCH_MAX 20 typedef struct _GstAgingTV GstAgingTV; typedef struct _GstAgingTVClass GstAgingTVClass; struct _GstAgingTV { GstVideoFilter videofilter; /* < private > */ gint width, height; gboolean color_aging; gboolean pits; gboolean dusts; gint coloraging_state; scratch scratches[SCRATCH_MAX]; gint scratch_lines; gint dust_interval; gint pits_interval; }; struct _GstAgingTVClass { GstVideoFilterClass parent_class; }; GType gst_agingtv_get_type (void); G_END_DECLS #endif /* __GST_AGING_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstop.h0000644000175000017500000000366311671175353015544 00000000000000/* GStreamer * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2006 FUKUCHI Kentaro * * OpTV - Optical art meets real-time video effect. * Copyright (C) 2004-2005 FUKUCHI Kentaro * * EffecTV is free software. 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_OP_H__ #define __GST_OP_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_OPTV \ (gst_optv_get_type()) #define GST_OPTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OPTV,GstOpTV)) #define GST_OPTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OPTV,GstOpTVClass)) #define GST_IS_OPTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OPTV)) #define GST_IS_OPTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OPTV)) typedef struct _GstOpTV GstOpTV; typedef struct _GstOpTVClass GstOpTVClass; struct _GstOpTV { GstVideoFilter element; /* < private > */ gint width, height; gint mode; gint speed; guint threshold; gint8 *opmap[4]; guint8 *diff; guint8 phase; }; struct _GstOpTVClass { GstVideoFilterClass parent_class; }; GType gst_optv_get_type (void); G_END_DECLS #endif /* __GST_OP_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstop.c0000644000175000017500000002505111677341655015540 00000000000000/* GStreamer * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2006 FUKUCHI Kentaro * * OpTV - Optical art meets real-time video effect. * Copyright (C) 2004-2005 FUKUCHI Kentaro * * EffecTV is free software. 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-optv * * Traditional black-white optical animation is now resurrected as a * real-time video effect. Input images are binarized and combined with * various optical pattern. * * * Example launch line * |[ * gst-launch -v videotestsrc ! optv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of optv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstop.h" #include "gsteffectv.h" #include #include enum { OP_SPIRAL1 = 0, OP_SPIRAL2, OP_PARABOLA, OP_HSTRIPE }; #define GST_TYPE_OPTV_MODE (gst_optv_mode_get_type()) static GType gst_optv_mode_get_type (void) { static GType type = 0; static const GEnumValue enumvalue[] = { {OP_SPIRAL1, "Maelstrom", "maelstrom"}, {OP_SPIRAL2, "Radiation", "radiation"}, {OP_PARABOLA, "Horizontal Stripes", "horizontal-stripes"}, {OP_HSTRIPE, "Vertical Stripes", "vertical-stripes"}, {0, NULL, NULL}, }; if (!type) { type = g_enum_register_static ("GstOpTVMode", enumvalue); } return type; } #define DEFAULT_MODE OP_SPIRAL1 #define DEFAULT_SPEED 16 #define DEFAULT_THRESHOLD 60 enum { PROP_0, PROP_MODE, PROP_SPEED, PROP_THRESHOLD }; static guint32 palette[256]; GST_BOILERPLATE (GstOpTV, gst_optv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx #else #define CAPS_STR GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_xRGB #endif static GstStaticPadTemplate gst_optv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_optv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static void initPalette (void) { gint i; guint8 v; for (i = 0; i < 112; i++) { palette[i] = 0; palette[i + 128] = 0xffffff; } for (i = 0; i < 16; i++) { v = 16 * (i + 1) - 1; palette[i + 112] = (v << 16) | (v << 8) | v; v = 255 - v; palette[i + 240] = (v << 16) | (v << 8) | v; } } static void setOpmap (gint8 * opmap[4], gint width, gint height) { gint i, j, x, y; #ifndef PS2 gdouble xx, yy, r, at, rr; #else gfloat xx, yy, r, at, rr; #endif gint sci; sci = 640 / width; i = 0; for (y = 0; y < height; y++) { yy = (gdouble) (y - height / 2) / width; for (x = 0; x < width; x++) { xx = (gdouble) x / width - 0.5; #ifndef PS2 r = sqrt (xx * xx + yy * yy); at = atan2 (xx, yy); #else r = sqrtf (xx * xx + yy * yy); at = atan2f (xx, yy); #endif opmap[OP_SPIRAL1][i] = ((guint) ((at / G_PI * 256) + (r * 4000))) & 255; j = r * 300 / 32; rr = r * 300 - j * 32; j *= 64; j += (rr > 28) ? (rr - 28) * 16 : 0; opmap[OP_SPIRAL2][i] = ((guint) ((at / G_PI * 4096) + (r * 1600) - j)) & 255; opmap[OP_PARABOLA][i] = ((guint) (yy / (xx * xx * 0.3 + 0.1) * 400)) & 255; opmap[OP_HSTRIPE][i] = x * 8 * sci; i++; } } } /* Taken from effectv/image.c */ /* Y value filters */ static void image_y_over (guint32 * src, guint8 * diff, gint y_threshold, gint video_area) { gint i; gint R, G, B, v; guint8 *p = diff; for (i = video_area; i > 0; i--) { R = ((*src) & 0xff0000) >> (16 - 1); G = ((*src) & 0xff00) >> (8 - 2); B = (*src) & 0xff; v = y_threshold * 7 - (R + G + B); *p = (guint8) (v >> 24); src++; p++; } } static GstFlowReturn gst_optv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstOpTV *filter = GST_OPTV (trans); guint32 *src, *dest; GstFlowReturn ret = GST_FLOW_OK; gint8 *p; guint8 *diff; gint x, y, width, height; GstClockTime timestamp, stream_time; guint8 phase; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); if (G_UNLIKELY (filter->opmap[0] == NULL)) return GST_FLOW_NOT_NEGOTIATED; GST_OBJECT_LOCK (filter); switch (filter->mode) { default: case 0: p = filter->opmap[OP_SPIRAL1]; break; case 1: p = filter->opmap[OP_SPIRAL2]; break; case 2: p = filter->opmap[OP_PARABOLA]; break; case 3: p = filter->opmap[OP_HSTRIPE]; break; } filter->phase -= filter->speed; diff = filter->diff; image_y_over (src, diff, filter->threshold, filter->width * filter->height); height = filter->height; width = filter->width; phase = filter->phase; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { *dest++ = palette[(((guint8) (*p + phase)) ^ *diff++) & 255]; p++; } } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_optv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstOpTV *filter = GST_OPTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { gint i; for (i = 0; i < 4; i++) { if (filter->opmap[i]) g_free (filter->opmap[i]); filter->opmap[i] = g_new (gint8, filter->width * filter->height); } setOpmap (filter->opmap, filter->width, filter->height); if (filter->diff) g_free (filter->diff); filter->diff = g_new (guint8, filter->width * filter->height); ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_optv_start (GstBaseTransform * trans) { GstOpTV *filter = GST_OPTV (trans); filter->phase = 0; return TRUE; } static void gst_optv_finalize (GObject * object) { GstOpTV *filter = GST_OPTV (object); if (filter->opmap[0]) { gint i; for (i = 0; i < 4; i++) { if (filter->opmap[i]) g_free (filter->opmap[i]); filter->opmap[i] = NULL; } } if (filter->diff) g_free (filter->diff); filter->diff = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_optv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOpTV *filter = GST_OPTV (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_MODE: filter->mode = g_value_get_enum (value); break; case PROP_SPEED: filter->speed = g_value_get_int (value); break; case PROP_THRESHOLD: filter->threshold = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_optv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstOpTV *filter = GST_OPTV (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, filter->mode); break; case PROP_SPEED: g_value_set_int (value, filter->speed); break; case PROP_THRESHOLD: g_value_set_uint (value, filter->threshold); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_optv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "OpTV effect", "Filter/Effect/Video", "Optical art meets real-time video effect", "FUKUCHI, Kentarou , " "Sebastian Dröge "); gst_element_class_add_static_pad_template (element_class, &gst_optv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_optv_src_template); } static void gst_optv_class_init (GstOpTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_optv_set_property; gobject_class->get_property = gst_optv_get_property; gobject_class->finalize = gst_optv_finalize; g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Mode", GST_TYPE_OPTV_MODE, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SPEED, g_param_spec_int ("speed", "Speed", "Effect speed", G_MININT, G_MAXINT, DEFAULT_SPEED, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_THRESHOLD, g_param_spec_uint ("threshold", "Threshold", "Luma threshold", 0, G_MAXINT, DEFAULT_THRESHOLD, GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_optv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_optv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_optv_start); initPalette (); } static void gst_optv_init (GstOpTV * filter, GstOpTVClass * klass) { filter->speed = DEFAULT_SPEED; filter->mode = DEFAULT_MODE; filter->threshold = DEFAULT_THRESHOLD; } gst-plugins-good-0.10.31/gst/effectv/Makefile.am0000644000175000017500000000246211671175353016267 00000000000000plugin_LTLIBRARIES = libgsteffectv.la libgsteffectv_la_SOURCES = \ gsteffectv.c gstedge.c gstaging.c gstdice.c gstwarp.c \ gstshagadelic.c gstvertigo.c gstrev.c gstquark.c gstop.c \ gstradioac.c gststreak.c gstripple.c libgsteffectv_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ -I$(top_srcdir)/gst/videofilter libgsteffectv_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(LIBM) libgsteffectv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsteffectv_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsteffectv.h gstaging.h gstdice.h gstedge.h \ gstquark.h gstrev.h gstshagadelic.h gstvertigo.h gstwarp.h gstop.h \ gstradioac.h gststreak.h gstripple.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgsteffectv -:SHARED libgsteffectv \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgsteffectv_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsteffectv_la_CFLAGS) \ -:LDFLAGS $(libgsteffectv_la_LDFLAGS) \ $(libgsteffectv_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/effectv/gstquark.c0000644000175000017500000002054611677341655016251 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * EffecTV: * Copyright (C) 2001-2002 FUKUCHI Kentarou * * QuarkTV - motion disolver. * * EffecTV is free software. 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-quarktv * * QuarkTV disolves moving objects. It picks up pixels from * the last frames randomly. * * * Example launch line * |[ * gst-launch -v videotestsrc ! quarktv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of quarktv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstquark.h" #include "gsteffectv.h" #include #include /* number of frames of time-buffer. It should be as a configurable paramater */ /* This number also must be 2^n just for the speed. */ #define PLANES 16 enum { PROP_0, PROP_PLANES }; GST_BOILERPLATE (GstQuarkTV, gst_quarktv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void gst_quarktv_planetable_clear (GstQuarkTV * filter); static GstStaticPadTemplate gst_quarktv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) ); static GstStaticPadTemplate gst_quarktv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) ); static gboolean gst_quarktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstQuarkTV *filter = GST_QUARKTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { gst_quarktv_planetable_clear (filter); filter->area = filter->width * filter->height; ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static GstFlowReturn gst_quarktv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstQuarkTV *filter = GST_QUARKTV (trans); gint area; guint32 *src, *dest; GstFlowReturn ret = GST_FLOW_OK; GstClockTime timestamp; GstBuffer **planetable; gint planes, current_plane; timestamp = GST_BUFFER_TIMESTAMP (in); timestamp = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (timestamp)) gst_object_sync_values (G_OBJECT (filter), timestamp); if (G_UNLIKELY (filter->planetable == NULL)) return GST_FLOW_WRONG_STATE; GST_OBJECT_LOCK (filter); area = filter->area; src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); planetable = filter->planetable; planes = filter->planes; current_plane = filter->current_plane; if (planetable[current_plane]) gst_buffer_unref (planetable[current_plane]); planetable[current_plane] = gst_buffer_ref (in); /* For each pixel */ while (--area) { GstBuffer *rand; /* pick a random buffer */ rand = planetable[(current_plane + (fastrand () >> 24)) % planes]; /* Copy the pixel from the random buffer to dest */ dest[area] = (rand ? ((guint32 *) GST_BUFFER_DATA (rand))[area] : src[area]); } filter->current_plane--; if (filter->current_plane < 0) filter->current_plane = planes - 1; GST_OBJECT_UNLOCK (filter); return ret; } static void gst_quarktv_planetable_clear (GstQuarkTV * filter) { gint i; if (filter->planetable == NULL) return; for (i = 0; i < filter->planes; i++) { if (GST_IS_BUFFER (filter->planetable[i])) { gst_buffer_unref (filter->planetable[i]); } filter->planetable[i] = NULL; } } static gboolean gst_quarktv_start (GstBaseTransform * trans) { GstQuarkTV *filter = GST_QUARKTV (trans); if (filter->planetable) { gst_quarktv_planetable_clear (filter); g_free (filter->planetable); } filter->planetable = (GstBuffer **) g_malloc0 (filter->planes * sizeof (GstBuffer *)); return TRUE; } static void gst_quarktv_finalize (GObject * object) { GstQuarkTV *filter = GST_QUARKTV (object); if (filter->planetable) { gst_quarktv_planetable_clear (filter); g_free (filter->planetable); filter->planetable = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstQuarkTV *filter = GST_QUARKTV (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_PLANES: { gint new_n_planes = g_value_get_int (value); GstBuffer **new_planetable; gint i; /* If the number of planes changed, copy across any existing planes */ if (new_n_planes != filter->planes) { new_planetable = (GstBuffer **) g_malloc0 (new_n_planes * sizeof (GstBuffer *)); if (filter->planetable) { for (i = 0; (i < new_n_planes) && (i < filter->planes); i++) { new_planetable[i] = filter->planetable[i]; } for (; i < filter->planes; i++) { if (filter->planetable[i]) gst_buffer_unref (filter->planetable[i]); } g_free (filter->planetable); } filter->planetable = new_planetable; filter->planes = new_n_planes; filter->current_plane = filter->planes - 1; } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_quarktv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstQuarkTV *filter = GST_QUARKTV (object); switch (prop_id) { case PROP_PLANES: g_value_set_int (value, filter->planes); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_quarktv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "QuarkTV effect", "Filter/Effect/Video", "Motion dissolver", "FUKUCHI, Kentarou "); gst_element_class_add_static_pad_template (element_class, &gst_quarktv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_quarktv_src_template); } static void gst_quarktv_class_init (GstQuarkTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_quarktv_set_property; gobject_class->get_property = gst_quarktv_get_property; gobject_class->finalize = gst_quarktv_finalize; g_object_class_install_property (gobject_class, PROP_PLANES, g_param_spec_int ("planes", "Planes", "Number of planes", 0, 64, PLANES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_quarktv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_quarktv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_quarktv_start); } static void gst_quarktv_init (GstQuarkTV * filter, GstQuarkTVClass * klass) { filter->planes = PLANES; filter->current_plane = filter->planes - 1; } gst-plugins-good-0.10.31/gst/effectv/gstshagadelic.h0000644000175000017500000000404411671175353017204 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * Inspired by Adrian Likin's script for the GIMP. * EffecTV is free software. 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_SHAGADELIC_H__ #define __GST_SHAGADELIC_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_SHAGADELICTV \ (gst_shagadelictv_get_type()) #define GST_SHAGADELICTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SHAGADELICTV,GstShagadelicTV)) #define GST_SHAGADELICTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SHAGADELICTV,GstShagadelicTVClass)) #define GST_IS_SHAGADELICTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SHAGADELICTV)) #define GST_IS_SHAGADELICTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHAGADELICTV)) typedef struct _GstShagadelicTV GstShagadelicTV; typedef struct _GstShagadelicTVClass GstShagadelicTVClass; struct _GstShagadelicTV { GstVideoFilter videofilter; /* < private > */ gint width, height; gint stat; guint8 *ripple; guint8 *spiral; guint8 phase; gint rx, ry; gint bx, by; gint rvx, rvy; gint bvx, bvy; }; struct _GstShagadelicTVClass { GstVideoFilterClass parent_class; }; GType gst_shagadelictv_get_type (void); G_END_DECLS #endif /* __GST_SHAGADELIC_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstripple.c0000644000175000017500000003740711677341655016425 00000000000000/* GStreamer * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2006 FUKUCHI Kentaro * * RippleTV - Water ripple effect. * Copyright (C) 2001-2002 FUKUCHI Kentaro * * This combines the RippleTV and BaltanTV effects, which are * very similar. BaltanTV is used if the feedback property is set * to TRUE, otherwise RippleTV is used. * * EffecTV is free software. 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-rippletv * * RippleTV does ripple mark effect on the video input. The ripple is caused * by motion or random rain drops. * * * Example launch line * |[ * gst-launch -v videotestsrc ! rippletv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of rippletv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstripple.h" #include "gsteffectv.h" #include #include #define DEFAULT_MODE 0 enum { PROP_0, PROP_RESET, PROP_MODE }; static gint sqrtable[256]; #define GST_TYPE_RIPPLETV_MODE (gst_rippletv_mode_get_type()) static GType gst_rippletv_mode_get_type (void) { static GType type = 0; static const GEnumValue enumvalue[] = { {0, "Motion Detection", "motion-detection"}, {1, "Rain", "rain"}, {0, NULL, NULL}, }; if (!type) { type = g_enum_register_static ("GstRippleTVMode", enumvalue); } return type; } GST_BOILERPLATE (GstRippleTV, gst_rippletv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static GstStaticPadTemplate gst_rippletv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) ); static GstStaticPadTemplate gst_rippletv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) ); static const gint point = 16; static const gint impact = 2; static const gint decay = 8; static const gint loopnum = 2; static void setTable (void) { gint i; for (i = 0; i < 128; i++) { sqrtable[i] = i * i; } for (i = 1; i <= 128; i++) { sqrtable[256 - i] = -i * i; } } static void image_bgset_y (guint32 * src, gint16 * background, gint video_area) { gint i; gint R, G, B; guint32 *p; gint16 *q; p = src; q = background; for (i = 0; i < video_area; i++) { R = ((*p) & 0xff0000) >> (16 - 1); G = ((*p) & 0xff00) >> (8 - 2); B = (*p) & 0xff; *q = (gint16) (R + G + B); p++; q++; } } static gint setBackground (GstRippleTV * filter, guint32 * src) { image_bgset_y (src, filter->background, filter->width * filter->height); filter->bg_is_set = TRUE; return 0; } static void image_bgsubtract_update_y (guint32 * src, gint16 * background, guint8 * diff, gint video_area) { gint i; gint R, G, B; guint32 *p; gint16 *q; guint8 *r; gint v; p = src; q = background; r = diff; for (i = 0; i < video_area; i++) { R = ((*p) & 0xff0000) >> (16 - 1); G = ((*p) & 0xff00) >> (8 - 2); B = (*p) & 0xff; v = (R + G + B) - (gint) (*q); *q = (gint16) (R + G + B); *r = ((v + 70 * 7) >> 24) | ((70 * 7 - v) >> 24); p++; q++; r++; } } static void motiondetect (GstRippleTV * filter, guint32 * src) { guint8 *diff = filter->diff; gint width = filter->width; gint *p, *q; gint x, y, h; if (!filter->bg_is_set) setBackground (filter, src); image_bgsubtract_update_y (src, filter->background, filter->diff, filter->width * filter->height); p = filter->map1 + filter->map_w + 1; q = filter->map2 + filter->map_w + 1; diff += filter->width + 2; for (y = filter->map_h - 2; y > 0; y--) { for (x = filter->map_w - 2; x > 0; x--) { h = (gint) * diff + (gint) * (diff + 1) + (gint) * (diff + width) + (gint) * (diff + width + 1); if (h > 0) { *p = h << (point + impact - 8); *q = *p; } p++; q++; diff += 2; } diff += width + 2; p += 2; q += 2; } } static inline void drop (gint power, gint * map1, gint * map2, gint map_w, gint map_h) { gint x, y; gint *p, *q; x = fastrand () % (map_w - 4) + 2; y = fastrand () % (map_h - 4) + 2; p = map1 + y * map_w + x; q = map2 + y * map_w + x; *p = power; *q = power; *(p - map_w) = *(p - 1) = *(p + 1) = *(p + map_w) = power / 2; *(p - map_w - 1) = *(p - map_w + 1) = *(p + map_w - 1) = *(p + map_w + 1) = power / 4; *(q - map_w) = *(q - 1) = *(q + 1) = *(q + map_w) = power / 2; *(q - map_w - 1) = *(q - map_w + 1) = *(q + map_w - 1) = *(p + map_w + 1) = power / 4; } static void raindrop (GstRippleTV * filter) { gint i; if (filter->period == 0) { switch (filter->rain_stat) { case 0: filter->period = (fastrand () >> 23) + 100; filter->drop_prob = 0; filter->drop_prob_increment = 0x00ffffff / filter->period; filter->drop_power = (-(fastrand () >> 28) - 2) << point; filter->drops_per_frame_max = 2 << (fastrand () >> 30); // 2,4,8 or 16 filter->rain_stat = 1; break; case 1: filter->drop_prob = 0x00ffffff; filter->drops_per_frame = 1; filter->drop_prob_increment = 1; filter->period = (filter->drops_per_frame_max - 1) * 16; filter->rain_stat = 2; break; case 2: filter->period = (fastrand () >> 22) + 1000; filter->drop_prob_increment = 0; filter->rain_stat = 3; break; case 3: filter->period = (filter->drops_per_frame_max - 1) * 16; filter->drop_prob_increment = -1; filter->rain_stat = 4; break; case 4: filter->period = (fastrand () >> 24) + 60; filter->drop_prob_increment = -(filter->drop_prob / filter->period); filter->rain_stat = 5; break; case 5: default: filter->period = (fastrand () >> 23) + 500; filter->drop_prob = 0; filter->rain_stat = 0; break; } } switch (filter->rain_stat) { default: case 0: break; case 1: case 5: if ((fastrand () >> 8) < filter->drop_prob) { drop (filter->drop_power, filter->map1, filter->map2, filter->map_w, filter->map_h); } filter->drop_prob += filter->drop_prob_increment; break; case 2: case 3: case 4: for (i = filter->drops_per_frame / 16; i > 0; i--) { drop (filter->drop_power, filter->map1, filter->map2, filter->map_w, filter->map_h); } filter->drops_per_frame += filter->drop_prob_increment; break; } filter->period--; } static GstFlowReturn gst_rippletv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstRippleTV *filter = GST_RIPPLETV (trans); guint32 *src, *dest; GstFlowReturn ret = GST_FLOW_OK; gint x, y, i; gint dx, dy, o_dx; gint h, v; gint m_w, m_h, v_w, v_h; gint *p, *q, *r; gint8 *vp; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); GST_OBJECT_LOCK (filter); /* impact from the motion or rain drop */ if (filter->mode) raindrop (filter); else motiondetect (filter, src); m_w = filter->map_w; m_h = filter->map_h; v_w = filter->width; v_h = filter->height; /* simulate surface wave */ /* This function is called only 30 times per second. To increase a speed * of wave, iterates this loop several times. */ for (i = loopnum; i > 0; i--) { /* wave simulation */ p = filter->map1 + m_w + 1; q = filter->map2 + m_w + 1; r = filter->map3 + m_w + 1; for (y = m_h - 2; y > 0; y--) { for (x = m_w - 2; x > 0; x--) { h = *(p - m_w - 1) + *(p - m_w + 1) + *(p + m_w - 1) + *(p + m_w + 1) + *(p - m_w) + *(p - 1) + *(p + 1) + *(p + m_w) - (*p) * 9; h = h >> 3; v = *p - *q; v += h - (v >> decay); *r = v + *p; p++; q++; r++; } p += 2; q += 2; r += 2; } /* low pass filter */ p = filter->map3 + m_w + 1; q = filter->map2 + m_w + 1; for (y = m_h - 2; y > 0; y--) { for (x = m_w - 2; x > 0; x--) { h = *(p - m_w) + *(p - 1) + *(p + 1) + *(p + m_w) + (*p) * 60; *q = h >> 6; p++; q++; } p += 2; q += 2; } p = filter->map1; filter->map1 = filter->map2; filter->map2 = p; } vp = filter->vtable; p = filter->map1; for (y = m_h - 1; y > 0; y--) { for (x = m_w - 1; x > 0; x--) { /* difference of the height between two voxel. They are twiced to * emphasise the wave. */ vp[0] = sqrtable[((p[0] - p[1]) >> (point - 1)) & 0xff]; vp[1] = sqrtable[((p[0] - p[m_w]) >> (point - 1)) & 0xff]; p++; vp += 2; } p++; vp += 2; } vp = filter->vtable; /* draw refracted image. The vector table is stretched. */ for (y = 0; y < v_h; y += 2) { for (x = 0; x < v_w; x += 2) { h = (gint) vp[0]; v = (gint) vp[1]; dx = x + h; dy = y + v; dx = CLAMP (dx, 0, (v_w - 2)); dy = CLAMP (dy, 0, (v_h - 2)); dest[0] = src[dy * v_w + dx]; o_dx = dx; dx = x + 1 + (h + (gint) vp[2]) / 2; dx = CLAMP (dx, 0, (v_w - 2)); dest[1] = src[dy * v_w + dx]; dy = y + 1 + (v + (gint) vp[m_w * 2 + 1]) / 2; dy = CLAMP (dy, 0, (v_h - 2)); dest[v_w] = src[dy * v_w + o_dx]; dest[v_w + 1] = src[dy * v_w + dx]; dest += 2; vp += 2; } dest += v_w; vp += 2; } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_rippletv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstRippleTV *filter = GST_RIPPLETV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { filter->map_h = filter->height / 2 + 1; filter->map_w = filter->width / 2 + 1; /* we over allocate the buffers, as the render code does not handle clipping * very well */ if (filter->map) g_free (filter->map); filter->map = g_new0 (gint, (1 + filter->map_h) * filter->map_w * 3); filter->map1 = filter->map; filter->map2 = filter->map + filter->map_w * filter->map_h; filter->map3 = filter->map + filter->map_w * filter->map_h * 2; if (filter->vtable) g_free (filter->vtable); filter->vtable = g_new0 (gint8, (1 + filter->map_h) * filter->map_w * 2); if (filter->background) g_free (filter->background); filter->background = g_new0 (gint16, filter->width * (filter->height + 1)); if (filter->diff) g_free (filter->diff); filter->diff = g_new0 (guint8, filter->width * (filter->height + 1)); ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_rippletv_start (GstBaseTransform * trans) { GstRippleTV *filter = GST_RIPPLETV (trans); filter->bg_is_set = FALSE; filter->period = 0; filter->rain_stat = 0; filter->drop_prob = 0; filter->drop_prob_increment = 0; filter->drops_per_frame_max = 0; filter->drops_per_frame = 0; filter->drop_power = 0; return TRUE; } static void gst_rippletv_finalize (GObject * object) { GstRippleTV *filter = GST_RIPPLETV (object); if (filter->map) g_free (filter->map); filter->map = NULL; if (filter->vtable) g_free (filter->vtable); filter->vtable = NULL; if (filter->background) g_free (filter->background); filter->background = NULL; if (filter->diff) g_free (filter->diff); filter->diff = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rippletv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRippleTV *filter = GST_RIPPLETV (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_RESET:{ memset (filter->map, 0, filter->map_h * filter->map_w * 2 * sizeof (gint)); break; } case PROP_MODE: filter->mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (filter); } static void gst_rippletv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRippleTV *filter = GST_RIPPLETV (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, filter->mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rippletv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "RippleTV effect", "Filter/Effect/Video", "RippleTV does ripple mark effect on the video input", "FUKUCHI, Kentarou , " "Sebastian Dröge "); gst_element_class_add_static_pad_template (element_class, &gst_rippletv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rippletv_src_template); } static void gst_rippletv_class_init (GstRippleTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_rippletv_set_property; gobject_class->get_property = gst_rippletv_get_property; gobject_class->finalize = gst_rippletv_finalize; g_object_class_install_property (gobject_class, PROP_RESET, g_param_spec_boolean ("reset", "Reset", "Reset all current ripples", FALSE, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Mode", GST_TYPE_RIPPLETV_MODE, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_rippletv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_rippletv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_rippletv_start); setTable (); } static void gst_rippletv_init (GstRippleTV * filter, GstRippleTVClass * klass) { filter->mode = DEFAULT_MODE; /* FIXME: remove this when memory corruption after resizes are fixed */ gst_pad_use_fixed_caps (GST_BASE_TRANSFORM_SRC_PAD (filter)); gst_pad_use_fixed_caps (GST_BASE_TRANSFORM_SINK_PAD (filter)); } gst-plugins-good-0.10.31/gst/effectv/gstrev.h0000644000175000017500000000466611671175353015726 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001 FUKUCHI Kentarou * * revTV based on Rutt-Etra Video Synthesizer 1974? * (c)2002 Ed Tannenbaum * * This effect acts like a waveform monitor on each line. * It was originally done by deflecting the electron beam on a monitor using * additional electromagnets on the yoke of a b/w CRT. * Here it is emulated digitally. * Experimaental tapes were made with this system by Bill and * Louise Etra and Woody and Steina Vasulka * The line spacing can be controlled using the 1 and 2 Keys. * The gain is controlled using the 3 and 4 keys. * The update rate is controlled using the 0 and - keys. * EffecTV is free software. 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_REV_H__ #define __GST_REV_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_REVTV \ (gst_revtv_get_type()) #define GST_REVTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_REVTV,GstRevTV)) #define GST_REVTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_REVTV,GstRevTVClass)) #define GST_IS_REVTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_REVTV)) #define GST_IS_REVTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_REVTV)) typedef struct _GstRevTV GstRevTV; typedef struct _GstRevTVClass GstRevTVClass; struct _GstRevTV { GstVideoFilter videofilter; /* < private > */ gint width, height; gint vgrabtime; gint vgrab; gint linespace; gint vscale; }; struct _GstRevTVClass { GstVideoFilterClass parent_class; }; GType gst_revtv_get_type (void); G_END_DECLS #endif /* __GST_REV_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstvertigo.h0000644000175000017500000000370511671175353016602 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * EffecTV is free software. 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_VERTIGO_H__ #define __GST_VERTIGO_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_VERTIGOTV \ (gst_vertigotv_get_type()) #define GST_VERTIGOTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VERTIGOTV,GstVertigoTV)) #define GST_VERTIGOTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VERTIGOTV,GstVertigoTVClass)) #define GST_IS_VERTIGOTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VERTIGOTV)) #define GST_IS_VERTIGOTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VERTIGOTV)) typedef struct _GstVertigoTV GstVertigoTV; typedef struct _GstVertigoTVClass GstVertigoTVClass; struct _GstVertigoTV { GstVideoFilter videofilter; /* < private > */ gint width, height; guint32 *buffer; guint32 *current_buffer, *alt_buffer; gint dx, dy; gint sx, sy; gdouble phase; gdouble phase_increment; gdouble zoomrate; }; struct _GstVertigoTVClass { GstVideoFilterClass parent_class; }; GType gst_vertigotv_get_type (void); G_END_DECLS #endif /* __GST_VERTIGO_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstedge.h0000644000175000017500000000371211671175353016025 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * EffecTV: * Copyright (C) 2001-2002 FUKUCHI Kentarou * * EdgeTV - detects edge and display it in good old computer way * * EffecTV is free software. 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_EDGE_H__ #define __GST_EDGE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_EDGETV \ (gst_edgetv_get_type()) #define GST_EDGETV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EDGETV,GstEdgeTV)) #define GST_EDGETV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EDGETV,GstEdgeTVClass)) #define GST_IS_EDGETV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EDGETV)) #define GST_IS_EDGETV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EDGETV)) typedef struct _GstEdgeTV GstEdgeTV; typedef struct _GstEdgeTVClass GstEdgeTVClass; struct _GstEdgeTV { GstVideoFilter videofilter; /* < private > */ gint width, height; gint map_width, map_height; guint32 *map; gint video_width_margin; }; struct _GstEdgeTVClass { GstVideoFilterClass parent_class; }; GType gst_edgetv_get_type (void); G_END_DECLS #endif /* __GST_EDGE_H__ */ gst-plugins-good-0.10.31/gst/effectv/gststreak.c0000644000175000017500000001674411677341655016424 00000000000000/* GStreamer * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2006 FUKUCHI Kentaro * * StreakTV - afterimage effector. * Copyright (C) 2001-2002 FUKUCHI Kentaro * * This combines the StreakTV and BaltanTV effects, which are * very similar. BaltanTV is used if the feedback property is set * to TRUE, otherwise StreakTV is used. * * EffecTV is free software. 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-streaktv * * StreakTV makes after images of moving objects. * * * Example launch line * |[ * gst-launch -v videotestsrc ! streaktv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of streaktv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gststreak.h" #include "gsteffectv.h" #include #define DEFAULT_FEEDBACK FALSE enum { PROP_0, PROP_FEEDBACK }; GST_BOILERPLATE (GstStreakTV, gst_streaktv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static GstStaticPadTemplate gst_streaktv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) ); static GstStaticPadTemplate gst_streaktv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xBGR "; " GST_VIDEO_CAPS_xRGB) ); static GstFlowReturn gst_streaktv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstStreakTV *filter = GST_STREAKTV (trans); guint32 *src, *dest; GstFlowReturn ret = GST_FLOW_OK; gint i, cf; gint video_area = filter->width * filter->height; guint32 **planetable = filter->planetable; gint plane = filter->plane; guint stride_mask, stride_shift, stride; GST_OBJECT_LOCK (filter); if (filter->feedback) { stride_mask = 0xfcfcfcfc; stride = 8; stride_shift = 2; } else { stride_mask = 0xf8f8f8f8; stride = 4; stride_shift = 3; } src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); for (i = 0; i < video_area; i++) { planetable[plane][i] = (src[i] & stride_mask) >> stride_shift; } cf = plane & (stride - 1); if (filter->feedback) { for (i = 0; i < video_area; i++) { dest[i] = planetable[cf][i] + planetable[cf + stride][i] + planetable[cf + stride * 2][i] + planetable[cf + stride * 3][i]; planetable[plane][i] = (dest[i] & stride_mask) >> stride_shift; } } else { for (i = 0; i < video_area; i++) { dest[i] = planetable[cf][i] + planetable[cf + stride][i] + planetable[cf + stride * 2][i] + planetable[cf + stride * 3][i] + planetable[cf + stride * 4][i] + planetable[cf + stride * 5][i] + planetable[cf + stride * 6][i] + planetable[cf + stride * 7][i]; } } plane++; filter->plane = plane & (PLANES - 1); GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_streaktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstStreakTV *filter = GST_STREAKTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { gint i; if (filter->planebuffer) g_free (filter->planebuffer); filter->planebuffer = g_new0 (guint32, filter->width * filter->height * 4 * PLANES); for (i = 0; i < PLANES; i++) filter->planetable[i] = &filter->planebuffer[filter->width * filter->height * i]; ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_streaktv_start (GstBaseTransform * trans) { GstStreakTV *filter = GST_STREAKTV (trans); filter->plane = 0; return TRUE; } static void gst_streaktv_finalize (GObject * object) { GstStreakTV *filter = GST_STREAKTV (object); if (filter->planebuffer) { g_free (filter->planebuffer); filter->planebuffer = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_streaktv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstStreakTV *filter = GST_STREAKTV (object); switch (prop_id) { case PROP_FEEDBACK: if (G_UNLIKELY (GST_STATE (filter) >= GST_STATE_PAUSED)) { g_warning ("Changing the \"feedback\" property only allowed " "in state < PLAYING"); return; } filter->feedback = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_streaktv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstStreakTV *filter = GST_STREAKTV (object); switch (prop_id) { case PROP_FEEDBACK: g_value_set_boolean (value, filter->feedback); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_streaktv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "StreakTV effect", "Filter/Effect/Video", "StreakTV makes after images of moving objects", "FUKUCHI, Kentarou , " "Sebastian Dröge "); gst_element_class_add_static_pad_template (element_class, &gst_streaktv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_streaktv_src_template); } static void gst_streaktv_class_init (GstStreakTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_streaktv_set_property; gobject_class->get_property = gst_streaktv_get_property; gobject_class->finalize = gst_streaktv_finalize; g_object_class_install_property (gobject_class, PROP_FEEDBACK, g_param_spec_boolean ("feedback", "Feedback", "Feedback", DEFAULT_FEEDBACK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_streaktv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_streaktv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_streaktv_start); } static void gst_streaktv_init (GstStreakTV * filter, GstStreakTVClass * klass) { filter->feedback = DEFAULT_FEEDBACK; } gst-plugins-good-0.10.31/gst/effectv/gstdice.c0000644000175000017500000002237211677341655016031 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * dice.c: a 'dicing' effect * copyright (c) 2001 Sam Mertens. This code is subject to the provisions of * the GNU Library Public License. * * I suppose this looks similar to PuzzleTV, but it's not. The screen is * divided into small squares, each of which is rotated either 0, 90, 180 or * 270 degrees. The amount of rotation for each square is chosen at random. * * 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-dicetv * * DiceTV 'dices' the screen up into many small squares, each defaulting * to a size of 16 pixels by 16 pixels.. Each square is rotated randomly * in one of four directions: up (no change), down (180 degrees, or * upside down), right (90 degrees clockwise), or left (90 degrees * counterclockwise). The direction of each square normally remains * consistent between each frame. * * * Example launch line * |[ * gst-launch -v videotestsrc ! dicetv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of dicetv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstdice.h" #include "gsteffectv.h" #include #include #define DEFAULT_CUBE_BITS 4 #define MAX_CUBE_BITS 5 #define MIN_CUBE_BITS 0 typedef enum _dice_dir { DICE_UP = 0, DICE_RIGHT = 1, DICE_DOWN = 2, DICE_LEFT = 3 } DiceDir; GST_BOILERPLATE (GstDiceTV, gst_dicetv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void gst_dicetv_create_map (GstDiceTV * filter); static GstStaticPadTemplate gst_dicetv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) ); static GstStaticPadTemplate gst_dicetv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) ); enum { PROP_0, PROP_CUBE_BITS }; static gboolean gst_dicetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstDiceTV *filter = GST_DICETV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { g_free (filter->dicemap); filter->dicemap = (guint8 *) g_malloc (filter->height * filter->width); gst_dicetv_create_map (filter); ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static GstFlowReturn gst_dicetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstDiceTV *filter = GST_DICETV (trans); guint32 *src, *dest; gint i, map_x, map_y, map_i, base, dx, dy, di; gint video_width, g_cube_bits, g_cube_size; gint g_map_height, g_map_width; GstFlowReturn ret = GST_FLOW_OK; GstClockTime timestamp, stream_time; const guint8 *dicemap; src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); GST_OBJECT_LOCK (filter); video_width = filter->width; g_cube_bits = filter->g_cube_bits; g_cube_size = filter->g_cube_size; g_map_height = filter->g_map_height; g_map_width = filter->g_map_width; dicemap = filter->dicemap; map_i = 0; for (map_y = 0; map_y < g_map_height; map_y++) { for (map_x = 0; map_x < g_map_width; map_x++) { base = (map_y << g_cube_bits) * video_width + (map_x << g_cube_bits); switch (dicemap[map_i]) { case DICE_UP: for (dy = 0; dy < g_cube_size; dy++) { i = base + dy * video_width; for (dx = 0; dx < g_cube_size; dx++) { dest[i] = src[i]; i++; } } break; case DICE_LEFT: for (dy = 0; dy < g_cube_size; dy++) { i = base + dy * video_width; for (dx = 0; dx < g_cube_size; dx++) { di = base + (dx * video_width) + (g_cube_size - dy - 1); dest[di] = src[i]; i++; } } break; case DICE_DOWN: for (dy = 0; dy < g_cube_size; dy++) { di = base + dy * video_width; i = base + (g_cube_size - dy - 1) * video_width + g_cube_size; for (dx = 0; dx < g_cube_size; dx++) { i--; dest[di] = src[i]; di++; } } break; case DICE_RIGHT: for (dy = 0; dy < g_cube_size; dy++) { i = base + (dy * video_width); for (dx = 0; dx < g_cube_size; dx++) { di = base + dy + (g_cube_size - dx - 1) * video_width; dest[di] = src[i]; i++; } } break; default: g_assert_not_reached (); break; } map_i++; } } GST_OBJECT_UNLOCK (filter); return ret; } static void gst_dicetv_create_map (GstDiceTV * filter) { gint x, y, i; if (filter->height <= 0 || filter->width <= 0) return; filter->g_map_height = filter->height >> filter->g_cube_bits; filter->g_map_width = filter->width >> filter->g_cube_bits; filter->g_cube_size = 1 << filter->g_cube_bits; i = 0; for (y = 0; y < filter->g_map_height; y++) { for (x = 0; x < filter->g_map_width; x++) { // dicemap[i] = ((i + y) & 0x3); /* Up, Down, Left or Right */ filter->dicemap[i] = (fastrand () >> 24) & 0x03; i++; } } } static void gst_dicetv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDiceTV *filter = GST_DICETV (object); switch (prop_id) { case PROP_CUBE_BITS: GST_OBJECT_LOCK (filter); filter->g_cube_bits = g_value_get_int (value); gst_dicetv_create_map (filter); GST_OBJECT_UNLOCK (filter); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_dicetv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDiceTV *filter = GST_DICETV (object); switch (prop_id) { case PROP_CUBE_BITS: g_value_set_int (value, filter->g_cube_bits); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_dicetv_finalize (GObject * object) { GstDiceTV *filter = GST_DICETV (object); g_free (filter->dicemap); filter->dicemap = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_dicetv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "DiceTV effect", "Filter/Effect/Video", "'Dices' the screen up into many small squares", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &gst_dicetv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_dicetv_src_template); } static void gst_dicetv_class_init (GstDiceTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_dicetv_set_property; gobject_class->get_property = gst_dicetv_get_property; gobject_class->finalize = gst_dicetv_finalize; g_object_class_install_property (gobject_class, PROP_CUBE_BITS, g_param_spec_int ("square-bits", "Square Bits", "The size of the Squares", MIN_CUBE_BITS, MAX_CUBE_BITS, DEFAULT_CUBE_BITS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_dicetv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_dicetv_transform); } static void gst_dicetv_init (GstDiceTV * filter, GstDiceTVClass * klass) { filter->dicemap = NULL; filter->g_cube_bits = DEFAULT_CUBE_BITS; filter->g_cube_size = 0; filter->g_map_height = 0; filter->g_map_width = 0; } gst-plugins-good-0.10.31/gst/effectv/gstradioac.h0000644000175000017500000000452211677341655016531 00000000000000/* GStreamer * Cradioacyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Cradioacyright (C) 2001-2006 FUKUCHI Kentaro * * RadioacTV - motion-enlightment effect. * Copyright (C) 2001-2002 FUKUCHI Kentaro * * EffecTV is free software. 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 radioaction) any later version. * * This library is distributed in the hradioace 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 cradioacy 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_RADIOAC_H__ #define __GST_RADIOAC_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RADIOACTV \ (gst_radioactv_get_type()) #define GST_RADIOACTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RADIOACTV,GstRadioacTV)) #define GST_RADIOACTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RADIOACTV,GstRadioacTVClass)) #define GST_IS_RADIOACTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RADIOACTV)) #define GST_IS_RADIOACTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RADIOACTV)) typedef struct _GstRadioacTV GstRadioacTV; typedef struct _GstRadioacTVClass GstRadioacTVClass; struct _GstRadioacTV { GstVideoFilter element; /* < private > */ gint width, height; GstVideoFormat format; gint mode; gint color; guint interval; gboolean trigger; gint snaptime; guint32 *snapframe; guint8 *blurzoombuf; guint8 *diff; gint16 *background; gint *blurzoomx; gint *blurzoomy; gint buf_width_blocks; gint buf_width; gint buf_height; gint buf_area; gint buf_margin_right; gint buf_margin_left; }; struct _GstRadioacTVClass { GstVideoFilterClass parent_class; }; GType gst_radioactv_get_type (void); G_END_DECLS #endif /* __GST_RADIOAC_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstaging.c0000644000175000017500000002636511677341655016220 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2002 FUKUCHI Kentarou * * AgingTV - film-aging effect. * * 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-agingtv * * AgingTV ages a video stream in realtime, changes the colors and adds * scratches and dust. * * * Example launch line * |[ * gst-launch -v videotestsrc ! agingtv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of agingtv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstaging.h" #include "gsteffectv.h" #include #include static const gint dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; static const gint dy[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; enum { PROP_0 = 0, PROP_SCRATCH_LINES, PROP_COLOR_AGING, PROP_PITS, PROP_DUSTS }; #define DEFAULT_SCRATCH_LINES 7 #define DEFAULT_COLOR_AGING TRUE #define DEFAULT_PITS TRUE #define DEFAULT_DUSTS TRUE #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx #else #define CAPS_STR GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR #endif static GstStaticPadTemplate gst_agingtv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_agingtv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); GST_BOILERPLATE (GstAgingTV, gst_agingtv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static gboolean gst_agingtv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstAgingTV *filter = GST_AGINGTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static void coloraging (guint32 * src, guint32 * dest, gint video_area, gint * c) { guint32 a, b; gint i; gint c_tmp = *c; c_tmp -= (gint) (fastrand ()) >> 28; if (c_tmp < 0) c_tmp = 0; if (c_tmp > 0x18) c_tmp = 0x18; for (i = 0; i < video_area; i++) { a = *src++; b = (a & 0xfcfcfc) >> 2; *dest++ = a - b + (c_tmp | (c_tmp << 8) | (c_tmp << 16)) + ((fastrand () >> 8) & 0x101010); } *c = c_tmp; } static void scratching (scratch * scratches, gint scratch_lines, guint32 * dest, gint width, gint height) { gint i, y, y1, y2; guint32 *p, a, b; scratch *scratch; for (i = 0; i < scratch_lines; i++) { scratch = &scratches[i]; if (scratch->life) { scratch->x = scratch->x + scratch->dx; if (scratch->x < 0 || scratch->x > width * 256) { scratch->life = 0; break; } p = dest + (scratch->x >> 8); if (scratch->init) { y1 = scratch->init; scratch->init = 0; } else { y1 = 0; } scratch->life--; if (scratch->life) { y2 = height; } else { y2 = fastrand () % height; } for (y = y1; y < y2; y++) { a = *p & 0xfefeff; a += 0x202020; b = a & 0x1010100; *p = a | (b - (b >> 8)); p += width; } } else { if ((fastrand () & 0xf0000000) == 0) { scratch->life = 2 + (fastrand () >> 27); scratch->x = fastrand () % (width * 256); scratch->dx = ((int) fastrand ()) >> 23; scratch->init = (fastrand () % (height - 1)) + 1; } } } } static void dusts (guint32 * dest, gint width, gint height, gint * dust_interval, gint area_scale) { gint i, j; gint dnum; gint d, len; guint x, y; if (*dust_interval == 0) { if ((fastrand () & 0xf0000000) == 0) { *dust_interval = fastrand () >> 29; } return; } dnum = area_scale * 4 + (fastrand () >> 27); for (i = 0; i < dnum; i++) { x = fastrand () % width; y = fastrand () % height; d = fastrand () >> 29; len = fastrand () % area_scale + 5; for (j = 0; j < len; j++) { dest[y * width + x] = 0x101010; y += dy[d]; x += dx[d]; if (y >= height || x >= width) break; d = (d + fastrand () % 3 - 1) & 7; } } *dust_interval = *dust_interval - 1; } static void pits (guint32 * dest, gint width, gint height, gint area_scale, gint * pits_interval) { gint i, j; gint pnum, size, pnumscale; guint x, y; pnumscale = area_scale * 2; if (*pits_interval) { pnum = pnumscale + (fastrand () % pnumscale); *pits_interval = *pits_interval - 1; } else { pnum = fastrand () % pnumscale; if ((fastrand () & 0xf8000000) == 0) { *pits_interval = (fastrand () >> 28) + 20; } } for (i = 0; i < pnum; i++) { x = fastrand () % (width - 1); y = fastrand () % (height - 1); size = fastrand () >> 28; for (j = 0; j < size; j++) { x = x + fastrand () % 3 - 1; y = y + fastrand () % 3 - 1; if (y >= height || x >= width) break; dest[y * width + x] = 0xc0c0c0; } } } static void gst_agingtv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAgingTV *agingtv = GST_AGINGTV (object); GST_OBJECT_LOCK (agingtv); switch (prop_id) { case PROP_SCRATCH_LINES: g_value_set_uint (value, agingtv->scratch_lines); break; case PROP_COLOR_AGING: g_value_set_boolean (value, agingtv->color_aging); break; case PROP_PITS: g_value_set_boolean (value, agingtv->pits); break; case PROP_DUSTS: g_value_set_boolean (value, agingtv->dusts); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } GST_OBJECT_UNLOCK (agingtv); } static void gst_agingtv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAgingTV *agingtv = GST_AGINGTV (object); switch (prop_id) { case PROP_SCRATCH_LINES: agingtv->scratch_lines = g_value_get_uint (value); break; case PROP_COLOR_AGING: agingtv->color_aging = g_value_get_boolean (value); break; case PROP_PITS: agingtv->pits = g_value_get_boolean (value); break; case PROP_DUSTS: agingtv->dusts = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static gboolean gst_agingtv_start (GstBaseTransform * trans) { GstAgingTV *agingtv = GST_AGINGTV (trans); agingtv->coloraging_state = 0x18; agingtv->dust_interval = 0; agingtv->pits_interval = 0; memset (agingtv->scratches, 0, sizeof (agingtv->scratches)); return TRUE; } static GstFlowReturn gst_agingtv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstAgingTV *agingtv = GST_AGINGTV (trans); gint width, height, video_size; guint32 *src = (guint32 *) GST_BUFFER_DATA (in); guint32 *dest = (guint32 *) GST_BUFFER_DATA (out); gint area_scale; GstFlowReturn ret = GST_FLOW_OK; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (agingtv, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (agingtv), stream_time); GST_OBJECT_LOCK (agingtv); width = agingtv->width; height = agingtv->height; video_size = width * height; area_scale = width * height / 64 / 480; if (area_scale <= 0) area_scale = 1; if (agingtv->color_aging) coloraging (src, dest, video_size, &agingtv->coloraging_state); else memcpy (dest, src, GST_BUFFER_SIZE (in)); scratching (agingtv->scratches, agingtv->scratch_lines, dest, width, height); if (agingtv->pits) pits (dest, width, height, area_scale, &agingtv->pits_interval); if (area_scale > 1 && agingtv->dusts) dusts (dest, width, height, &agingtv->dust_interval, area_scale); GST_OBJECT_UNLOCK (agingtv); return ret; } static void gst_agingtv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "AgingTV effect", "Filter/Effect/Video", "AgingTV adds age to video input using scratches and dust", "Sam Lantinga "); gst_element_class_add_static_pad_template (element_class, &gst_agingtv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_agingtv_src_template); } static void gst_agingtv_class_init (GstAgingTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_agingtv_set_property; gobject_class->get_property = gst_agingtv_get_property; g_object_class_install_property (gobject_class, PROP_SCRATCH_LINES, g_param_spec_uint ("scratch-lines", "Scratch Lines", "Number of scratch lines", 0, SCRATCH_MAX, DEFAULT_SCRATCH_LINES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_COLOR_AGING, g_param_spec_boolean ("color-aging", "Color Aging", "Color Aging", DEFAULT_COLOR_AGING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_PITS, g_param_spec_boolean ("pits", "Pits", "Pits", DEFAULT_PITS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_DUSTS, g_param_spec_boolean ("dusts", "Dusts", "Dusts", DEFAULT_DUSTS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_agingtv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_agingtv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_agingtv_start); } static void gst_agingtv_init (GstAgingTV * agingtv, GstAgingTVClass * klass) { agingtv->scratch_lines = DEFAULT_SCRATCH_LINES; agingtv->color_aging = DEFAULT_COLOR_AGING; agingtv->pits = DEFAULT_PITS; agingtv->dusts = DEFAULT_DUSTS; } gst-plugins-good-0.10.31/gst/effectv/gstedge.c0000644000175000017500000001617711677341655016037 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * EffecTV: * Copyright (C) 2001-2002 FUKUCHI Kentarou * * EdgeTV - detects edge and display it in good old computer way * * EffecTV is free software. 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-edgetv * * EdgeTV detects edges and display it in good old low resolution * computer way. * * * Example launch line * |[ * gst-launch -v videotestsrc ! edgetv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of edgetv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstedge.h" #include GST_BOILERPLATE (GstEdgeTV, gst_edgetv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_RGBx #else #define CAPS_STR GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_xRGB #endif static GstStaticPadTemplate gst_edgetv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_edgetv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static gboolean gst_edgetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstEdgeTV *edgetv = GST_EDGETV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (edgetv); if (gst_structure_get_int (structure, "width", &edgetv->width) && gst_structure_get_int (structure, "height", &edgetv->height)) { guint map_size; edgetv->map_width = edgetv->width / 4; edgetv->map_height = edgetv->height / 4; edgetv->video_width_margin = edgetv->width % 4; map_size = edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2; g_free (edgetv->map); edgetv->map = (guint32 *) g_malloc0 (map_size); ret = TRUE; } GST_OBJECT_UNLOCK (edgetv); return ret; } static GstFlowReturn gst_edgetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstEdgeTV *filter = GST_EDGETV (trans); gint x, y, r, g, b; guint32 *src, *dest; guint32 p, q; guint32 v0, v1, v2, v3; gint width, map_height, map_width; gint video_width_margin; guint32 *map; GstFlowReturn ret = GST_FLOW_OK; src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); GST_OBJECT_LOCK (filter); map = filter->map; width = filter->width; map_height = filter->map_height; map_width = filter->map_width; video_width_margin = filter->video_width_margin; src += width * 4 + 4; dest += width * 4 + 4; for (y = 1; y < map_height - 1; y++) { for (x = 1; x < map_width - 1; x++) { p = *src; q = *(src - 4); /* difference between the current pixel and left neighbor. */ r = ((p & 0xff0000) - (q & 0xff0000)) >> 16; g = ((p & 0xff00) - (q & 0xff00)) >> 8; b = (p & 0xff) - (q & 0xff); r *= r; g *= g; b *= b; r = r >> 5; /* To lack the lower bit for saturated addition, */ g = g >> 5; /* devide the value with 32, instead of 16. It is */ b = b >> 4; /* same as `v2 &= 0xfefeff' */ if (r > 127) r = 127; if (g > 127) g = 127; if (b > 255) b = 255; v2 = (r << 17) | (g << 9) | b; /* difference between the current pixel and upper neighbor. */ q = *(src - width * 4); r = ((p & 0xff0000) - (q & 0xff0000)) >> 16; g = ((p & 0xff00) - (q & 0xff00)) >> 8; b = (p & 0xff) - (q & 0xff); r *= r; g *= g; b *= b; r = r >> 5; g = g >> 5; b = b >> 4; if (r > 127) r = 127; if (g > 127) g = 127; if (b > 255) b = 255; v3 = (r << 17) | (g << 9) | b; v0 = map[(y - 1) * map_width * 2 + x * 2]; v1 = map[y * map_width * 2 + (x - 1) * 2 + 1]; map[y * map_width * 2 + x * 2] = v2; map[y * map_width * 2 + x * 2 + 1] = v3; r = v0 + v1; g = r & 0x01010100; dest[0] = r | (g - (g >> 8)); r = v0 + v3; g = r & 0x01010100; dest[1] = r | (g - (g >> 8)); dest[2] = v3; dest[3] = v3; r = v2 + v1; g = r & 0x01010100; dest[width] = r | (g - (g >> 8)); r = v2 + v3; g = r & 0x01010100; dest[width + 1] = r | (g - (g >> 8)); dest[width + 2] = v3; dest[width + 3] = v3; dest[width * 2] = v2; dest[width * 2 + 1] = v2; dest[width * 2 + 2] = 0; dest[width * 2 + 3] = 0; dest[width * 3] = v2; dest[width * 3 + 1] = v2; dest[width * 3 + 2] = 0; dest[width * 3 + 3] = 0; src += 4; dest += 4; } src += width * 3 + 8 + video_width_margin; dest += width * 3 + 8 + video_width_margin; } GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_edgetv_start (GstBaseTransform * trans) { GstEdgeTV *edgetv = GST_EDGETV (trans); if (edgetv->map) memset (edgetv->map, 0, edgetv->map_width * edgetv->map_height * sizeof (guint32) * 2); return TRUE; } static void gst_edgetv_finalize (GObject * object) { GstEdgeTV *edgetv = GST_EDGETV (object); g_free (edgetv->map); edgetv->map = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_edgetv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "EdgeTV effect", "Filter/Effect/Video", "Apply edge detect on video", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &gst_edgetv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_edgetv_src_template); } static void gst_edgetv_class_init (GstEdgeTVClass * klass) { GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->finalize = gst_edgetv_finalize; trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_edgetv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_edgetv_transform); trans_class->start = GST_DEBUG_FUNCPTR (gst_edgetv_start); } static void gst_edgetv_init (GstEdgeTV * edgetv, GstEdgeTVClass * klass) { } gst-plugins-good-0.10.31/gst/effectv/gsteffectv.h0000644000175000017500000000204411671175353016540 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * EffecTV is free software. 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 static inline guint fastrand (void) { static guint fastrand_val; return (fastrand_val = fastrand_val * 1103515245 + 12345); } gst-plugins-good-0.10.31/gst/effectv/gstdice.h0000644000175000017500000000430111671175353016020 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * dice.c: a 'dicing' effect * copyright (c) 2001 Sam Mertens. This code is subject to the provisions of * the GNU Library Public License. * * I suppose this looks similar to PuzzleTV, but it's not. The screen is * divided into small squares, each of which is rotated either 0, 90, 180 or * 270 degrees. The amount of rotation for each square is chosen at random. * * 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_DICE_H__ #define __GST_DICE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_DICETV \ (gst_dicetv_get_type()) #define GST_DICETV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DICETV,GstDiceTV)) #define GST_DICETV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DICETV,GstDiceTVClass)) #define GST_IS_DICETV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DICETV)) #define GST_IS_DICETV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DICETV)) typedef struct _GstDiceTV GstDiceTV; typedef struct _GstDiceTVClass GstDiceTVClass; struct _GstDiceTV { GstVideoFilter videofilter; /* < private > */ gint width, height; guint8 *dicemap; gint g_cube_bits; gint g_cube_size; gint g_map_height; gint g_map_width; }; struct _GstDiceTVClass { GstVideoFilterClass parent_class; }; GType gst_dicetv_get_type (void); G_END_DECLS #endif /* __GST_DICE_H__ */ gst-plugins-good-0.10.31/gst/effectv/Makefile.in0000644000175000017500000012476111720560232016274 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/effectv DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgsteffectv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgsteffectv_la_OBJECTS = libgsteffectv_la-gsteffectv.lo \ libgsteffectv_la-gstedge.lo libgsteffectv_la-gstaging.lo \ libgsteffectv_la-gstdice.lo libgsteffectv_la-gstwarp.lo \ libgsteffectv_la-gstshagadelic.lo \ libgsteffectv_la-gstvertigo.lo libgsteffectv_la-gstrev.lo \ libgsteffectv_la-gstquark.lo libgsteffectv_la-gstop.lo \ libgsteffectv_la-gstradioac.lo libgsteffectv_la-gststreak.lo \ libgsteffectv_la-gstripple.lo libgsteffectv_la_OBJECTS = $(am_libgsteffectv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgsteffectv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgsteffectv_la_CFLAGS) $(CFLAGS) \ $(libgsteffectv_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsteffectv_la_SOURCES) DIST_SOURCES = $(libgsteffectv_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgsteffectv.la libgsteffectv_la_SOURCES = \ gsteffectv.c gstedge.c gstaging.c gstdice.c gstwarp.c \ gstshagadelic.c gstvertigo.c gstrev.c gstquark.c gstop.c \ gstradioac.c gststreak.c gstripple.c libgsteffectv_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CONTROLLER_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ -I$(top_srcdir)/gst/videofilter libgsteffectv_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ $(GST_CONTROLLER_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ $(LIBM) libgsteffectv_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgsteffectv_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gsteffectv.h gstaging.h gstdice.h gstedge.h \ gstquark.h gstrev.h gstshagadelic.h gstvertigo.h gstwarp.h gstop.h \ gstradioac.h gststreak.h gstripple.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/effectv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/effectv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsteffectv.la: $(libgsteffectv_la_OBJECTS) $(libgsteffectv_la_DEPENDENCIES) $(EXTRA_libgsteffectv_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsteffectv_la_LINK) -rpath $(plugindir) $(libgsteffectv_la_OBJECTS) $(libgsteffectv_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstaging.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstdice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstedge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gsteffectv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstquark.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstradioac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstrev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstripple.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstshagadelic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gststreak.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstvertigo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsteffectv_la-gstwarp.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgsteffectv_la-gsteffectv.lo: gsteffectv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gsteffectv.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gsteffectv.Tpo -c -o libgsteffectv_la-gsteffectv.lo `test -f 'gsteffectv.c' || echo '$(srcdir)/'`gsteffectv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gsteffectv.Tpo $(DEPDIR)/libgsteffectv_la-gsteffectv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsteffectv.c' object='libgsteffectv_la-gsteffectv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gsteffectv.lo `test -f 'gsteffectv.c' || echo '$(srcdir)/'`gsteffectv.c libgsteffectv_la-gstedge.lo: gstedge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstedge.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstedge.Tpo -c -o libgsteffectv_la-gstedge.lo `test -f 'gstedge.c' || echo '$(srcdir)/'`gstedge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstedge.Tpo $(DEPDIR)/libgsteffectv_la-gstedge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstedge.c' object='libgsteffectv_la-gstedge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstedge.lo `test -f 'gstedge.c' || echo '$(srcdir)/'`gstedge.c libgsteffectv_la-gstaging.lo: gstaging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstaging.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstaging.Tpo -c -o libgsteffectv_la-gstaging.lo `test -f 'gstaging.c' || echo '$(srcdir)/'`gstaging.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstaging.Tpo $(DEPDIR)/libgsteffectv_la-gstaging.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstaging.c' object='libgsteffectv_la-gstaging.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstaging.lo `test -f 'gstaging.c' || echo '$(srcdir)/'`gstaging.c libgsteffectv_la-gstdice.lo: gstdice.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstdice.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstdice.Tpo -c -o libgsteffectv_la-gstdice.lo `test -f 'gstdice.c' || echo '$(srcdir)/'`gstdice.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstdice.Tpo $(DEPDIR)/libgsteffectv_la-gstdice.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstdice.c' object='libgsteffectv_la-gstdice.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstdice.lo `test -f 'gstdice.c' || echo '$(srcdir)/'`gstdice.c libgsteffectv_la-gstwarp.lo: gstwarp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstwarp.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstwarp.Tpo -c -o libgsteffectv_la-gstwarp.lo `test -f 'gstwarp.c' || echo '$(srcdir)/'`gstwarp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstwarp.Tpo $(DEPDIR)/libgsteffectv_la-gstwarp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwarp.c' object='libgsteffectv_la-gstwarp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstwarp.lo `test -f 'gstwarp.c' || echo '$(srcdir)/'`gstwarp.c libgsteffectv_la-gstshagadelic.lo: gstshagadelic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstshagadelic.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstshagadelic.Tpo -c -o libgsteffectv_la-gstshagadelic.lo `test -f 'gstshagadelic.c' || echo '$(srcdir)/'`gstshagadelic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstshagadelic.Tpo $(DEPDIR)/libgsteffectv_la-gstshagadelic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstshagadelic.c' object='libgsteffectv_la-gstshagadelic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstshagadelic.lo `test -f 'gstshagadelic.c' || echo '$(srcdir)/'`gstshagadelic.c libgsteffectv_la-gstvertigo.lo: gstvertigo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstvertigo.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstvertigo.Tpo -c -o libgsteffectv_la-gstvertigo.lo `test -f 'gstvertigo.c' || echo '$(srcdir)/'`gstvertigo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstvertigo.Tpo $(DEPDIR)/libgsteffectv_la-gstvertigo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstvertigo.c' object='libgsteffectv_la-gstvertigo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstvertigo.lo `test -f 'gstvertigo.c' || echo '$(srcdir)/'`gstvertigo.c libgsteffectv_la-gstrev.lo: gstrev.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstrev.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstrev.Tpo -c -o libgsteffectv_la-gstrev.lo `test -f 'gstrev.c' || echo '$(srcdir)/'`gstrev.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstrev.Tpo $(DEPDIR)/libgsteffectv_la-gstrev.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrev.c' object='libgsteffectv_la-gstrev.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstrev.lo `test -f 'gstrev.c' || echo '$(srcdir)/'`gstrev.c libgsteffectv_la-gstquark.lo: gstquark.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstquark.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstquark.Tpo -c -o libgsteffectv_la-gstquark.lo `test -f 'gstquark.c' || echo '$(srcdir)/'`gstquark.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstquark.Tpo $(DEPDIR)/libgsteffectv_la-gstquark.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstquark.c' object='libgsteffectv_la-gstquark.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstquark.lo `test -f 'gstquark.c' || echo '$(srcdir)/'`gstquark.c libgsteffectv_la-gstop.lo: gstop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstop.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstop.Tpo -c -o libgsteffectv_la-gstop.lo `test -f 'gstop.c' || echo '$(srcdir)/'`gstop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstop.Tpo $(DEPDIR)/libgsteffectv_la-gstop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstop.c' object='libgsteffectv_la-gstop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstop.lo `test -f 'gstop.c' || echo '$(srcdir)/'`gstop.c libgsteffectv_la-gstradioac.lo: gstradioac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstradioac.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstradioac.Tpo -c -o libgsteffectv_la-gstradioac.lo `test -f 'gstradioac.c' || echo '$(srcdir)/'`gstradioac.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstradioac.Tpo $(DEPDIR)/libgsteffectv_la-gstradioac.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstradioac.c' object='libgsteffectv_la-gstradioac.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstradioac.lo `test -f 'gstradioac.c' || echo '$(srcdir)/'`gstradioac.c libgsteffectv_la-gststreak.lo: gststreak.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gststreak.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gststreak.Tpo -c -o libgsteffectv_la-gststreak.lo `test -f 'gststreak.c' || echo '$(srcdir)/'`gststreak.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gststreak.Tpo $(DEPDIR)/libgsteffectv_la-gststreak.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gststreak.c' object='libgsteffectv_la-gststreak.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gststreak.lo `test -f 'gststreak.c' || echo '$(srcdir)/'`gststreak.c libgsteffectv_la-gstripple.lo: gstripple.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -MT libgsteffectv_la-gstripple.lo -MD -MP -MF $(DEPDIR)/libgsteffectv_la-gstripple.Tpo -c -o libgsteffectv_la-gstripple.lo `test -f 'gstripple.c' || echo '$(srcdir)/'`gstripple.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgsteffectv_la-gstripple.Tpo $(DEPDIR)/libgsteffectv_la-gstripple.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstripple.c' object='libgsteffectv_la-gstripple.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsteffectv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsteffectv_la_CFLAGS) $(CFLAGS) -c -o libgsteffectv_la-gstripple.lo `test -f 'gstripple.c' || echo '$(srcdir)/'`gstripple.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgsteffectv -:SHARED libgsteffectv \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgsteffectv_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgsteffectv_la_CFLAGS) \ -:LDFLAGS $(libgsteffectv_la_LDFLAGS) \ $(libgsteffectv_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/effectv/gstwarp.c0000644000175000017500000001625111677341655016075 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001 FUKUCHI Kentarou * * 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. */ /* * This file was (probably) generated from gstvideotemplate.c, * gstvideotemplate.c,v 1.11 2004/01/07 08:56:45 ds Exp */ /* From main.c of warp-1.1: * * Simple DirectMedia Layer demo * Realtime picture 'gooing' * by sam lantinga slouken@devolution.com */ /** * SECTION:element-warptv * * WarpTV does realtime goo'ing of the video input. * * * Example launch line * |[ * gst-launch -v videotestsrc ! warptv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of warptv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstwarp.h" #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif GST_BOILERPLATE (GstWarpTV, gst_warptv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void initSinTable (); static void initOffsTable (GstWarpTV * filter); static void initDistTable (GstWarpTV * filter); static GstStaticPadTemplate gst_warptv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) ); static GstStaticPadTemplate gst_warptv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR) ); static gboolean gst_warptv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstWarpTV *filter = GST_WARPTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { g_free (filter->disttable); g_free (filter->offstable); filter->offstable = g_malloc (filter->height * sizeof (guint32)); filter->disttable = g_malloc (filter->width * filter->height * sizeof (guint32)); initOffsTable (filter); initDistTable (filter); ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static gint32 sintable[1024 + 256]; static void initSinTable (void) { gint32 *tptr, *tsinptr; gint i; tsinptr = tptr = sintable; for (i = 0; i < 1024; i++) *tptr++ = (int) (sin (i * M_PI / 512) * 32767); for (i = 0; i < 256; i++) *tptr++ = *tsinptr++; } static void initOffsTable (GstWarpTV * filter) { gint y; for (y = 0; y < filter->height; y++) { filter->offstable[y] = y * filter->width; } } static void initDistTable (GstWarpTV * filter) { gint32 halfw, halfh, *distptr; gint x, y; float m; halfw = filter->width >> 1; halfh = filter->height >> 1; distptr = filter->disttable; m = sqrt ((double) (halfw * halfw + halfh * halfh)); for (y = -halfh; y < halfh; y++) for (x = -halfw; x < halfw; x++) #ifdef PS2 *distptr++ = ((int) ((sqrtf (x * x + y * y) * 511.9999) / m)) << 1; #else *distptr++ = ((int) ((sqrt (x * x + y * y) * 511.9999) / m)) << 1; #endif } static GstFlowReturn gst_warptv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstWarpTV *warptv = GST_WARPTV (trans); gint width, height; guint32 *src = (guint32 *) GST_BUFFER_DATA (in); guint32 *dest = (guint32 *) GST_BUFFER_DATA (out); gint xw, yw, cw; gint32 c, i, x, y, dx, dy, maxx, maxy; gint32 skip, *ctptr, *distptr; gint32 *ctable; GstFlowReturn ret = GST_FLOW_OK; GST_OBJECT_LOCK (warptv); width = warptv->width; height = warptv->height; xw = (gint) (sin ((warptv->tval + 100) * M_PI / 128) * 30); yw = (gint) (sin ((warptv->tval) * M_PI / 256) * -35); cw = (gint) (sin ((warptv->tval - 70) * M_PI / 64) * 50); xw += (gint) (sin ((warptv->tval - 10) * M_PI / 512) * 40); yw += (gint) (sin ((warptv->tval + 30) * M_PI / 512) * 40); ctptr = warptv->ctable; distptr = warptv->disttable; ctable = warptv->ctable; skip = 0; /* video_width*sizeof(RGB32)/4 - video_width;; */ c = 0; for (x = 0; x < 512; x++) { i = (c >> 3) & 0x3FE; *ctptr++ = ((sintable[i] * yw) >> 15); *ctptr++ = ((sintable[i + 256] * xw) >> 15); c += cw; } maxx = width - 2; maxy = height - 2; for (y = 0; y < height - 1; y++) { for (x = 0; x < width; x++) { i = *distptr++; dx = ctable[i + 1] + x; dy = ctable[i] + y; if (dx < 0) dx = 0; else if (dx > maxx) dx = maxx; if (dy < 0) dy = 0; else if (dy > maxy) dy = maxy; *dest++ = src[warptv->offstable[dy] + dx]; } dest += skip; } warptv->tval = (warptv->tval + 1) & 511; GST_OBJECT_UNLOCK (warptv); return ret; } static gboolean gst_warptv_start (GstBaseTransform * trans) { GstWarpTV *warptv = GST_WARPTV (trans); warptv->tval = 0; return TRUE; } static void gst_warptv_finalize (GObject * object) { GstWarpTV *warptv = GST_WARPTV (object); g_free (warptv->offstable); warptv->offstable = NULL; g_free (warptv->disttable); warptv->disttable = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_warptv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "WarpTV effect", "Filter/Effect/Video", "WarpTV does realtime goo'ing of the video input", "Sam Lantinga "); gst_element_class_add_static_pad_template (element_class, &gst_warptv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_warptv_src_template); } static void gst_warptv_class_init (GstWarpTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->finalize = gst_warptv_finalize; trans_class->start = GST_DEBUG_FUNCPTR (gst_warptv_start); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_warptv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_warptv_transform); initSinTable (); } static void gst_warptv_init (GstWarpTV * warptv, GstWarpTVClass * klass) { /* nothing to do */ } gst-plugins-good-0.10.31/gst/effectv/gstquark.h0000644000175000017500000000367311671175353016252 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2009> Sebastian Dröge * * EffecTV: * Copyright (C) 2001-2002 FUKUCHI Kentarou * * QuarkTV - motion disolver. * * EffecTV is free software. 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_QUARK_H__ #define __GST_QUARK_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_QUARKTV \ (gst_quarktv_get_type()) #define GST_QUARKTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUARKTV,GstQuarkTV)) #define GST_QUARKTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUARKTV,GstQuarkTVClass)) #define GST_IS_QUARKTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUARKTV)) #define GST_IS_QUARKTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUARKTV)) typedef struct _GstQuarkTV GstQuarkTV; typedef struct _GstQuarkTVClass GstQuarkTVClass; struct _GstQuarkTV { GstVideoFilter element; /* < private > */ gint width, height; gint area; gint planes; gint current_plane; GstBuffer **planetable; }; struct _GstQuarkTVClass { GstVideoFilterClass parent_class; }; GType gst_quarktv_get_type (void); G_END_DECLS #endif /* __GST_QUARK_H__ */ gst-plugins-good-0.10.31/gst/effectv/gststreak.h0000644000175000017500000000400611671175353016407 00000000000000/* GStreamer * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2006 FUKUCHI Kentaro * * StreakTV - afterimage effector. * Copyright (C) 2001-2002 FUKUCHI Kentaro * * EffecTV is free software. 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_STREAK_H__ #define __GST_STREAK_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_STREAKTV \ (gst_streaktv_get_type()) #define GST_STREAKTV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STREAKTV,GstStreakTV)) #define GST_STREAKTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STREAKTV,GstStreakTVClass)) #define GST_IS_STREAKTV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STREAKTV)) #define GST_IS_STREAKTV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STREAKTV)) typedef struct _GstStreakTV GstStreakTV; typedef struct _GstStreakTVClass GstStreakTVClass; #define PLANES 32 struct _GstStreakTV { GstVideoFilter element; /* < private > */ gint width, height; gboolean feedback; guint32 *planebuffer; guint32 *planetable[PLANES]; gint plane; }; struct _GstStreakTVClass { GstVideoFilterClass parent_class; }; GType gst_streaktv_get_type (void); G_END_DECLS #endif /* __GST_STREAK_H__ */ gst-plugins-good-0.10.31/gst/effectv/gstvertigo.c0000644000175000017500000002071111677341655016577 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * EffecTV: * Copyright (C) 2001 FUKUCHI Kentarou * * EffecTV is free software. 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-vertigotv * * VertigoTV is a loopback alpha blending effector with rotating and scaling. * * * Example launch line * |[ * gst-launch -v videotestsrc ! vertigotv ! ffmpegcolorspace ! autovideosink * ]| This pipeline shows the effect of vertigotv on a test stream. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstvertigo.h" #include #include GST_BOILERPLATE (GstVertigoTV, gst_vertigotv, GstVideoFilter, GST_TYPE_VIDEO_FILTER); /* Filter signals and args */ enum { PROP_0, PROP_SPEED, PROP_ZOOM_SPEED }; #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define CAPS_STR GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx #else #define CAPS_STR GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR #endif static GstStaticPadTemplate gst_vertigotv_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static GstStaticPadTemplate gst_vertigotv_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (CAPS_STR) ); static gboolean gst_vertigotv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstVertigoTV *filter = GST_VERTIGOTV (btrans); GstStructure *structure; gboolean ret = FALSE; structure = gst_caps_get_structure (incaps, 0); GST_OBJECT_LOCK (filter); if (gst_structure_get_int (structure, "width", &filter->width) && gst_structure_get_int (structure, "height", &filter->height)) { gint area = filter->width * filter->height; g_free (filter->buffer); filter->buffer = (guint32 *) g_malloc0 (area * 2 * sizeof (guint32)); filter->current_buffer = filter->buffer; filter->alt_buffer = filter->buffer + area; filter->phase = 0; ret = TRUE; } GST_OBJECT_UNLOCK (filter); return ret; } static void gst_vertigotv_set_parms (GstVertigoTV * filter) { double vx, vy; double t; double x, y; double dizz; dizz = sin (filter->phase) * 10 + sin (filter->phase * 1.9 + 5) * 5; x = filter->width / 2; y = filter->height / 2; t = (x * x + y * y) * filter->zoomrate; if (filter->width > filter->height) { if (dizz >= 0) { if (dizz > x) dizz = x; vx = (x * (x - dizz) + y * y) / t; } else { if (dizz < -x) dizz = -x; vx = (x * (x + dizz) + y * y) / t; } vy = (dizz * y) / t; } else { if (dizz >= 0) { if (dizz > y) dizz = y; vx = (x * x + y * (y - dizz)) / t; } else { if (dizz < -y) dizz = -y; vx = (x * x + y * (y + dizz)) / t; } vy = (dizz * x) / t; } filter->dx = vx * 65536; filter->dy = vy * 65536; filter->sx = (-vx * x + vy * y + x + cos (filter->phase * 5) * 2) * 65536; filter->sy = (-vx * y - vy * x + y + sin (filter->phase * 6) * 2) * 65536; filter->phase += filter->phase_increment; if (filter->phase > 5700000) filter->phase = 0; } static GstFlowReturn gst_vertigotv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out) { GstVertigoTV *filter = GST_VERTIGOTV (trans); guint32 *src, *dest, *p; guint32 v; gint x, y, ox, oy, i, width, height, area; GstFlowReturn ret = GST_FLOW_OK; GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (in); stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (G_OBJECT (filter), stream_time); src = (guint32 *) GST_BUFFER_DATA (in); dest = (guint32 *) GST_BUFFER_DATA (out); GST_OBJECT_LOCK (filter); width = filter->width; height = filter->height; area = width * height; gst_vertigotv_set_parms (filter); p = filter->alt_buffer; for (y = height; y > 0; y--) { ox = filter->sx; oy = filter->sy; for (x = width; x > 0; x--) { i = (oy >> 16) * width + (ox >> 16); if (i < 0) i = 0; if (i >= area) i = area; v = filter->current_buffer[i] & 0xfcfcff; v = (v * 3) + ((*src++) & 0xfcfcff); *p++ = (v >> 2); ox += filter->dx; oy += filter->dy; } filter->sx -= filter->dy; filter->sy += filter->dx; } memcpy (dest, filter->alt_buffer, area * sizeof (guint32)); p = filter->current_buffer; filter->current_buffer = filter->alt_buffer; filter->alt_buffer = p; GST_OBJECT_UNLOCK (filter); return ret; } static gboolean gst_vertigotv_start (GstBaseTransform * trans) { GstVertigoTV *filter = GST_VERTIGOTV (trans); filter->phase = 0.0; return TRUE; } static void gst_vertigotv_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVertigoTV *filter = GST_VERTIGOTV (object); GST_OBJECT_LOCK (filter); switch (prop_id) { case PROP_SPEED: filter->phase_increment = g_value_get_float (value); break; case PROP_ZOOM_SPEED: filter->zoomrate = g_value_get_float (value); break; default: break; } GST_OBJECT_UNLOCK (filter); } static void gst_vertigotv_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstVertigoTV *filter = GST_VERTIGOTV (object); switch (prop_id) { case PROP_SPEED: g_value_set_float (value, filter->phase_increment); break; case PROP_ZOOM_SPEED: g_value_set_float (value, filter->zoomrate); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_vertigotv_finalize (GObject * object) { GstVertigoTV *filter = GST_VERTIGOTV (object); g_free (filter->buffer); filter->buffer = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_vertigotv_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "VertigoTV effect", "Filter/Effect/Video", "A loopback alpha blending effector with rotating and scaling", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &gst_vertigotv_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_vertigotv_src_template); } static void gst_vertigotv_class_init (GstVertigoTVClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_vertigotv_set_property; gobject_class->get_property = gst_vertigotv_get_property; gobject_class->finalize = gst_vertigotv_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SPEED, g_param_spec_float ("speed", "Speed", "Control the speed of movement", 0.01, 100.0, 0.02, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ZOOM_SPEED, g_param_spec_float ("zoom-speed", "Zoom Speed", "Control the rate of zooming", 1.01, 1.1, 1.01, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); trans_class->start = GST_DEBUG_FUNCPTR (gst_vertigotv_start); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_vertigotv_set_caps); trans_class->transform = GST_DEBUG_FUNCPTR (gst_vertigotv_transform); } static void gst_vertigotv_init (GstVertigoTV * filter, GstVertigoTVClass * klass) { filter->buffer = NULL; filter->phase = 0.0; filter->phase_increment = 0.02; filter->zoomrate = 1.01; } gst-plugins-good-0.10.31/gst/effectv/gstripple.h0000644000175000017500000000430511671175353016413 00000000000000/* GStreamer * Copyright (C) <2009> Sebastian Dröge * * EffecTV - Realtime Digital Video Effector * Copyright (C) 2001-2006 FUKUCHI Kentaro * * RippleTV - Water ripple effect. * Copyright (C) 2001-2002 FUKUCHI Kentaro * * EffecTV is free software. 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_RIPPLE_H__ #define __GST_RIPPLE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RIPPLETV \ (gst_rippletv_get_type()) #define GST_RIPPLETV(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RIPPLETV,GstRippleTV)) #define GST_RIPPLETV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RIPPLETV,GstRippleTVClass)) #define GST_IS_RIPPLETV(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RIPPLETV)) #define GST_IS_RIPPLETV_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RIPPLETV)) typedef struct _GstRippleTV GstRippleTV; typedef struct _GstRippleTVClass GstRippleTVClass; struct _GstRippleTV { GstVideoFilter element; /* < private > */ gint width, height; gint mode; gint16 *background; guint8 *diff; gint *map, *map1, *map2, *map3; gint map_h, map_w; gint8 *vtable; gboolean bg_is_set; gint period; gint rain_stat; guint drop_prob; gint drop_prob_increment; gint drops_per_frame_max; gint drops_per_frame; gint drop_power; }; struct _GstRippleTVClass { GstVideoFilterClass parent_class; }; GType gst_rippletv_get_type (void); G_END_DECLS #endif /* __GST_RIPPLE_H__ */ gst-plugins-good-0.10.31/gst/rtpmanager/0000755000175000017500000000000011720565310015014 500000000000000gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpsession.c0000644000175000017500000021022511677341656020051 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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-gstrtpsession * @see_also: gstrtpjitterbuffer, gstrtpbin, gstrtpptdemux, gstrtpssrcdemux * * The RTP session manager models one participant with a unique SSRC in an RTP * session. This session can be used to send and receive RTP and RTCP packets. * Based on what REQUEST pads are requested from the session manager, specific * functionality can be activated. * * The session manager currently implements RFC 3550 including: * * * RTP packet validation based on consecutive sequence numbers. * * * Maintainance of the SSRC participant database. * * * Keeping per participant statistics based on received RTCP packets. * * * Scheduling of RR/SR RTCP packets. * * * * The gstrtpsession will not demux packets based on SSRC or payload type, nor will * it correct for packet reordering and jitter. Use #GstRtpsSrcDemux, * #GstRtpPtDemux and GstRtpJitterBuffer in addition to #GstRtpSession to * perform these tasks. It is usually a good idea to use #GstRtpBin, which * combines all these features in one element. * * To use #GstRtpSession as an RTP receiver, request a recv_rtp_sink pad, which will * automatically create recv_rtp_src pad. Data received on the recv_rtp_sink pad * will be processed in the session and after being validated forwarded on the * recv_rtp_src pad. * * To also use #GstRtpSession as an RTCP receiver, request a recv_rtcp_sink pad, * which will automatically create a sync_src pad. Packets received on the RTCP * pad will be used by the session manager to update the stats and database of * the other participants. SR packets will be forwarded on the sync_src pad * so that they can be used to perform inter-stream synchronisation when needed. * * If you want the session manager to generate and send RTCP packets, request * the send_rtcp_src pad. Packet pushed on this pad contain SR/RR RTCP reports * that should be sent to all participants in the session. * * To use #GstRtpSession as a sender, request a send_rtp_sink pad, which will * automatically create a send_rtp_src pad. The session manager will modify the * SSRC in the RTP packets to its own SSRC and wil forward the packets on the * send_rtp_src pad after updating its internal state. * * The session manager needs the clock-rate of the payload types it is handling * and will signal the #GstRtpSession::request-pt-map signal when it needs such a * mapping. One can clear the cached values with the #GstRtpSession::clear-pt-map * signal. * * * Example pipelines * |[ * gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink * ]| Receive theora RTP packets from port 5000 and send them to the depayloader, * decoder and display. Note that the application/x-rtp caps on udpsrc should be * configured based on some negotiation process such as RTSP for this pipeline * to work correctly. * |[ * gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink gstrtpsession name=session \ * .recv_rtp_src ! rtptheoradepay ! theoradec ! xvimagesink \ * udpsrc port=5001 caps="application/x-rtcp" ! session.recv_rtcp_sink * ]| Receive theora RTP packets from port 5000 and send them to the depayloader, * decoder and display. Receive RTCP packets from port 5001 and process them in * the session manager. * Note that the application/x-rtp caps on udpsrc should be * configured based on some negotiation process such as RTSP for this pipeline * to work correctly. * |[ * gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession .send_rtp_src ! udpsink port=5000 * ]| Send theora RTP packets through the session manager and out on UDP port * 5000. * |[ * gst-launch videotestsrc ! theoraenc ! rtptheorapay ! .send_rtp_sink gstrtpsession name=session .send_rtp_src \ * ! udpsink port=5000 session.send_rtcp_src ! udpsink port=5001 * ]| Send theora RTP packets through the session manager and out on UDP port * 5000. Send RTCP packets on port 5001. Note that this pipeline will not preroll * correctly because the second udpsink will not preroll correctly (no RTCP * packets are sent in the PAUSED state). Applications should manually set and * keep (see gst_element_set_locked_state()) the RTCP udpsink to the PLAYING state. * * * Last reviewed on 2007-05-28 (0.10.5) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstrtpbin-marshal.h" #include "gstrtpsession.h" #include "rtpsession.h" GST_DEBUG_CATEGORY_STATIC (gst_rtp_session_debug); #define GST_CAT_DEFAULT gst_rtp_session_debug /* sink pads */ static GstStaticPadTemplate rtpsession_recv_rtp_sink_template = GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtpsession_recv_rtcp_sink_template = GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate rtpsession_send_rtp_sink_template = GST_STATIC_PAD_TEMPLATE ("send_rtp_sink", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp") ); /* src pads */ static GstStaticPadTemplate rtpsession_recv_rtp_src_template = GST_STATIC_PAD_TEMPLATE ("recv_rtp_src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtpsession_sync_src_template = GST_STATIC_PAD_TEMPLATE ("sync_src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate rtpsession_send_rtp_src_template = GST_STATIC_PAD_TEMPLATE ("send_rtp_src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtpsession_send_rtcp_src_template = GST_STATIC_PAD_TEMPLATE ("send_rtcp_src", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); /* signals and args */ enum { SIGNAL_REQUEST_PT_MAP, SIGNAL_CLEAR_PT_MAP, SIGNAL_ON_NEW_SSRC, SIGNAL_ON_SSRC_COLLISION, SIGNAL_ON_SSRC_VALIDATED, SIGNAL_ON_SSRC_ACTIVE, SIGNAL_ON_SSRC_SDES, SIGNAL_ON_BYE_SSRC, SIGNAL_ON_BYE_TIMEOUT, SIGNAL_ON_TIMEOUT, SIGNAL_ON_SENDER_TIMEOUT, LAST_SIGNAL }; #define DEFAULT_NTP_NS_BASE 0 #define DEFAULT_BANDWIDTH RTP_STATS_BANDWIDTH #define DEFAULT_RTCP_FRACTION (RTP_STATS_BANDWIDTH * RTP_STATS_RTCP_FRACTION) #define DEFAULT_RTCP_RR_BANDWIDTH -1 #define DEFAULT_RTCP_RS_BANDWIDTH -1 #define DEFAULT_SDES NULL #define DEFAULT_NUM_SOURCES 0 #define DEFAULT_NUM_ACTIVE_SOURCES 0 #define DEFAULT_USE_PIPELINE_CLOCK FALSE #define DEFAULT_RTCP_MIN_INTERVAL (RTP_STATS_MIN_INTERVAL * GST_SECOND) enum { PROP_0, PROP_NTP_NS_BASE, PROP_BANDWIDTH, PROP_RTCP_FRACTION, PROP_RTCP_RR_BANDWIDTH, PROP_RTCP_RS_BANDWIDTH, PROP_SDES, PROP_NUM_SOURCES, PROP_NUM_ACTIVE_SOURCES, PROP_INTERNAL_SESSION, PROP_USE_PIPELINE_CLOCK, PROP_RTCP_MIN_INTERVAL, PROP_LAST }; #define GST_RTP_SESSION_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_RTP_SESSION, GstRtpSessionPrivate)) #define GST_RTP_SESSION_LOCK(sess) g_mutex_lock ((sess)->priv->lock) #define GST_RTP_SESSION_UNLOCK(sess) g_mutex_unlock ((sess)->priv->lock) struct _GstRtpSessionPrivate { GMutex *lock; GstClock *sysclock; RTPSession *session; /* thread for sending out RTCP */ GstClockID id; gboolean stop_thread; GThread *thread; gboolean thread_stopped; /* caps mapping */ GHashTable *ptmap; /* NTP base time */ guint64 ntpnsbase; gboolean use_pipeline_clock; }; /* callbacks to handle actions from the session manager */ static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gpointer user_data); static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src, gpointer data, gpointer user_data); static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gboolean eos, gpointer user_data); static GstFlowReturn gst_rtp_session_sync_rtcp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gpointer user_data); static gint gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload, gpointer user_data); static void gst_rtp_session_reconsider (RTPSession * sess, gpointer user_data); static void gst_rtp_session_request_key_unit (RTPSession * sess, gboolean all_headers, gpointer user_data); static GstClockTime gst_rtp_session_request_time (RTPSession * session, gpointer user_data); static RTPSessionCallbacks callbacks = { gst_rtp_session_process_rtp, gst_rtp_session_send_rtp, gst_rtp_session_sync_rtcp, gst_rtp_session_send_rtcp, gst_rtp_session_clock_rate, gst_rtp_session_reconsider, gst_rtp_session_request_key_unit, gst_rtp_session_request_time }; /* GObject vmethods */ static void gst_rtp_session_finalize (GObject * object); static void gst_rtp_session_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_session_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* GstElement vmethods */ static GstStateChangeReturn gst_rtp_session_change_state (GstElement * element, GstStateChange transition); static GstPad *gst_rtp_session_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_rtp_session_release_pad (GstElement * element, GstPad * pad); static void gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession); static guint gst_rtp_session_signals[LAST_SIGNAL] = { 0 }; static void on_new_ssrc (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_NEW_SSRC], 0, src->ssrc); } static void on_ssrc_collision (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_COLLISION], 0, src->ssrc); } static void on_ssrc_validated (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED], 0, src->ssrc); } static void on_ssrc_active (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE], 0, src->ssrc); } static void on_ssrc_sdes (RTPSession * session, RTPSource * src, GstRtpSession * sess) { GstStructure *s; GstMessage *m; /* convert the new SDES info into a message */ RTP_SESSION_LOCK (session); g_object_get (src, "sdes", &s, NULL); RTP_SESSION_UNLOCK (session); m = gst_message_new_custom (GST_MESSAGE_ELEMENT, GST_OBJECT (sess), s); gst_element_post_message (GST_ELEMENT_CAST (sess), m); g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SSRC_SDES], 0, src->ssrc); } static void on_bye_ssrc (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_BYE_SSRC], 0, src->ssrc); } static void on_bye_timeout (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT], 0, src->ssrc); } static void on_timeout (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_TIMEOUT], 0, src->ssrc); } static void on_sender_timeout (RTPSession * session, RTPSource * src, GstRtpSession * sess) { g_signal_emit (sess, gst_rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT], 0, src->ssrc); } GST_BOILERPLATE (GstRtpSession, gst_rtp_session, GstElement, GST_TYPE_ELEMENT); static void gst_rtp_session_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); /* sink pads */ gst_element_class_add_static_pad_template (element_class, &rtpsession_recv_rtp_sink_template); gst_element_class_add_static_pad_template (element_class, &rtpsession_recv_rtcp_sink_template); gst_element_class_add_static_pad_template (element_class, &rtpsession_send_rtp_sink_template); /* src pads */ gst_element_class_add_static_pad_template (element_class, &rtpsession_recv_rtp_src_template); gst_element_class_add_static_pad_template (element_class, &rtpsession_sync_src_template); gst_element_class_add_static_pad_template (element_class, &rtpsession_send_rtp_src_template); gst_element_class_add_static_pad_template (element_class, &rtpsession_send_rtcp_src_template); gst_element_class_set_details_simple (element_class, "RTP Session", "Filter/Network/RTP", "Implement an RTP session", "Wim Taymans "); } static void gst_rtp_session_class_init (GstRtpSessionClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; g_type_class_add_private (klass, sizeof (GstRtpSessionPrivate)); gobject_class->finalize = gst_rtp_session_finalize; gobject_class->set_property = gst_rtp_session_set_property; gobject_class->get_property = gst_rtp_session_get_property; /** * GstRtpSession::request-pt-map: * @sess: the object which received the signal * @pt: the pt * * Request the payload type as #GstCaps for @pt. */ gst_rtp_session_signals[SIGNAL_REQUEST_PT_MAP] = g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, request_pt_map), NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT, GST_TYPE_CAPS, 1, G_TYPE_UINT); /** * GstRtpSession::clear-pt-map: * @sess: the object which received the signal * * Clear the cached pt-maps requested with #GstRtpSession::request-pt-map. */ gst_rtp_session_signals[SIGNAL_CLEAR_PT_MAP] = g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpSessionClass, clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** * GstRtpSession::on-new-ssrc: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of a new SSRC that entered @session. */ gst_rtp_session_signals[SIGNAL_ON_NEW_SSRC] = g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_new_ssrc), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-ssrc_collision: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify when we have an SSRC collision */ gst_rtp_session_signals[SIGNAL_ON_SSRC_COLLISION] = g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_ssrc_collision), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-ssrc_validated: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of a new SSRC that became validated. */ gst_rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED] = g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_ssrc_validated), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-ssrc_active: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of a SSRC that is active, i.e., sending RTCP. */ gst_rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE] = g_signal_new ("on-ssrc-active", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_ssrc_active), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-ssrc-sdes: * @session: the object which received the signal * @src: the SSRC * * Notify that a new SDES was received for SSRC. */ gst_rtp_session_signals[SIGNAL_ON_SSRC_SDES] = g_signal_new ("on-ssrc-sdes", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_ssrc_sdes), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-bye-ssrc: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of an SSRC that became inactive because of a BYE packet. */ gst_rtp_session_signals[SIGNAL_ON_BYE_SSRC] = g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_bye_ssrc), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-bye-timeout: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of an SSRC that has timed out because of BYE */ gst_rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT] = g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_bye_timeout), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-timeout: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of an SSRC that has timed out */ gst_rtp_session_signals[SIGNAL_ON_TIMEOUT] = g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_timeout), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpSession::on-sender-timeout: * @sess: the object which received the signal * @ssrc: the SSRC * * Notify of a sender SSRC that has timed out and became a receiver */ gst_rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT] = g_signal_new ("on-sender-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSessionClass, on_sender_timeout), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); g_object_class_install_property (gobject_class, PROP_NTP_NS_BASE, g_param_spec_uint64 ("ntp-ns-base", "NTP base time", "The NTP base time corresponding to running_time 0 (deprecated)", 0, G_MAXUINT64, DEFAULT_NTP_NS_BASE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_BANDWIDTH, g_param_spec_double ("bandwidth", "Bandwidth", "The bandwidth of the session in bytes per second (0 for auto-discover)", 0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_FRACTION, g_param_spec_double ("rtcp-fraction", "RTCP Fraction", "The RTCP bandwidth of the session in bytes per second " "(or as a real fraction of the RTP bandwidth if < 1.0)", 0.0, G_MAXDOUBLE, DEFAULT_RTCP_FRACTION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_RR_BANDWIDTH, g_param_spec_int ("rtcp-rr-bandwidth", "RTCP RR bandwidth", "The RTCP bandwidth used for receivers in bytes per second (-1 = default)", -1, G_MAXINT, DEFAULT_RTCP_RR_BANDWIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_RS_BANDWIDTH, g_param_spec_int ("rtcp-rs-bandwidth", "RTCP RS bandwidth", "The RTCP bandwidth used for senders in bytes per second (-1 = default)", -1, G_MAXINT, DEFAULT_RTCP_RS_BANDWIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SDES, g_param_spec_boxed ("sdes", "SDES", "The SDES items of this session", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NUM_SOURCES, g_param_spec_uint ("num-sources", "Num Sources", "The number of sources in the session", 0, G_MAXUINT, DEFAULT_NUM_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NUM_ACTIVE_SOURCES, g_param_spec_uint ("num-active-sources", "Num Active Sources", "The number of active sources in the session", 0, G_MAXUINT, DEFAULT_NUM_ACTIVE_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_INTERNAL_SESSION, g_param_spec_object ("internal-session", "Internal Session", "The internal RTPSession object", RTP_TYPE_SESSION, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USE_PIPELINE_CLOCK, g_param_spec_boolean ("use-pipeline-clock", "Use pipeline clock", "Use the pipeline clock to set the NTP time in the RTCP SR messages", DEFAULT_USE_PIPELINE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_MIN_INTERVAL, g_param_spec_uint64 ("rtcp-min-interval", "Minimum RTCP interval", "Minimum interval between Regular RTCP packet (in ns)", 0, G_MAXUINT64, DEFAULT_RTCP_MIN_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_session_change_state); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_rtp_session_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_session_release_pad); klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_session_clear_pt_map); GST_DEBUG_CATEGORY_INIT (gst_rtp_session_debug, "rtpsession", 0, "RTP Session"); } static void gst_rtp_session_init (GstRtpSession * rtpsession, GstRtpSessionClass * klass) { rtpsession->priv = GST_RTP_SESSION_GET_PRIVATE (rtpsession); rtpsession->priv->lock = g_mutex_new (); rtpsession->priv->sysclock = gst_system_clock_obtain (); rtpsession->priv->session = rtp_session_new (); rtpsession->priv->use_pipeline_clock = DEFAULT_USE_PIPELINE_CLOCK; /* configure callbacks */ rtp_session_set_callbacks (rtpsession->priv->session, &callbacks, rtpsession); /* configure signals */ g_signal_connect (rtpsession->priv->session, "on-new-ssrc", (GCallback) on_new_ssrc, rtpsession); g_signal_connect (rtpsession->priv->session, "on-ssrc-collision", (GCallback) on_ssrc_collision, rtpsession); g_signal_connect (rtpsession->priv->session, "on-ssrc-validated", (GCallback) on_ssrc_validated, rtpsession); g_signal_connect (rtpsession->priv->session, "on-ssrc-active", (GCallback) on_ssrc_active, rtpsession); g_signal_connect (rtpsession->priv->session, "on-ssrc-sdes", (GCallback) on_ssrc_sdes, rtpsession); g_signal_connect (rtpsession->priv->session, "on-bye-ssrc", (GCallback) on_bye_ssrc, rtpsession); g_signal_connect (rtpsession->priv->session, "on-bye-timeout", (GCallback) on_bye_timeout, rtpsession); g_signal_connect (rtpsession->priv->session, "on-timeout", (GCallback) on_timeout, rtpsession); g_signal_connect (rtpsession->priv->session, "on-sender-timeout", (GCallback) on_sender_timeout, rtpsession); rtpsession->priv->ptmap = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) gst_caps_unref); gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED); rtpsession->priv->thread_stopped = TRUE; } static void gst_rtp_session_finalize (GObject * object) { GstRtpSession *rtpsession; rtpsession = GST_RTP_SESSION (object); g_hash_table_destroy (rtpsession->priv->ptmap); g_mutex_free (rtpsession->priv->lock); g_object_unref (rtpsession->priv->sysclock); g_object_unref (rtpsession->priv->session); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_session_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; rtpsession = GST_RTP_SESSION (object); priv = rtpsession->priv; switch (prop_id) { case PROP_NTP_NS_BASE: GST_OBJECT_LOCK (rtpsession); priv->ntpnsbase = g_value_get_uint64 (value); GST_DEBUG_OBJECT (rtpsession, "setting NTP base to %" GST_TIME_FORMAT, GST_TIME_ARGS (priv->ntpnsbase)); GST_OBJECT_UNLOCK (rtpsession); break; case PROP_BANDWIDTH: g_object_set_property (G_OBJECT (priv->session), "bandwidth", value); break; case PROP_RTCP_FRACTION: g_object_set_property (G_OBJECT (priv->session), "rtcp-fraction", value); break; case PROP_RTCP_RR_BANDWIDTH: g_object_set_property (G_OBJECT (priv->session), "rtcp-rr-bandwidth", value); break; case PROP_RTCP_RS_BANDWIDTH: g_object_set_property (G_OBJECT (priv->session), "rtcp-rs-bandwidth", value); break; case PROP_SDES: rtp_session_set_sdes_struct (priv->session, g_value_get_boxed (value)); break; case PROP_USE_PIPELINE_CLOCK: priv->use_pipeline_clock = g_value_get_boolean (value); break; case PROP_RTCP_MIN_INTERVAL: g_object_set_property (G_OBJECT (priv->session), "rtcp-min-interval", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_session_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; rtpsession = GST_RTP_SESSION (object); priv = rtpsession->priv; switch (prop_id) { case PROP_NTP_NS_BASE: GST_OBJECT_LOCK (rtpsession); g_value_set_uint64 (value, priv->ntpnsbase); GST_OBJECT_UNLOCK (rtpsession); break; case PROP_BANDWIDTH: g_object_get_property (G_OBJECT (priv->session), "bandwidth", value); break; case PROP_RTCP_FRACTION: g_object_get_property (G_OBJECT (priv->session), "rtcp-fraction", value); break; case PROP_RTCP_RR_BANDWIDTH: g_object_get_property (G_OBJECT (priv->session), "rtcp-rr-bandwidth", value); break; case PROP_RTCP_RS_BANDWIDTH: g_object_get_property (G_OBJECT (priv->session), "rtcp-rs-bandwidth", value); break; case PROP_SDES: g_value_take_boxed (value, rtp_session_get_sdes_struct (priv->session)); break; case PROP_NUM_SOURCES: g_value_set_uint (value, rtp_session_get_num_sources (priv->session)); break; case PROP_NUM_ACTIVE_SOURCES: g_value_set_uint (value, rtp_session_get_num_active_sources (priv->session)); break; case PROP_INTERNAL_SESSION: g_value_set_object (value, priv->session); break; case PROP_USE_PIPELINE_CLOCK: g_value_set_boolean (value, priv->use_pipeline_clock); break; case PROP_RTCP_MIN_INTERVAL: g_object_get_property (G_OBJECT (priv->session), "rtcp-min-interval", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void get_current_times (GstRtpSession * rtpsession, GstClockTime * running_time, guint64 * ntpnstime) { guint64 ntpns; GstClock *clock; GstClockTime base_time, rt, clock_time; GST_OBJECT_LOCK (rtpsession); if ((clock = GST_ELEMENT_CLOCK (rtpsession))) { base_time = GST_ELEMENT_CAST (rtpsession)->base_time; gst_object_ref (clock); GST_OBJECT_UNLOCK (rtpsession); clock_time = gst_clock_get_time (clock); if (rtpsession->priv->use_pipeline_clock) { ntpns = clock_time; } else { GTimeVal current; /* get current NTP time */ g_get_current_time (¤t); ntpns = GST_TIMEVAL_TO_TIME (current); } /* add constant to convert from 1970 based time to 1900 based time */ ntpns += (2208988800LL * GST_SECOND); /* get current clock time and convert to running time */ rt = clock_time - base_time; gst_object_unref (clock); } else { GST_OBJECT_UNLOCK (rtpsession); rt = -1; ntpns = -1; } if (running_time) *running_time = rt; if (ntpnstime) *ntpnstime = ntpns; } static void rtcp_thread (GstRtpSession * rtpsession) { GstClockID id; GstClockTime current_time; GstClockTime next_timeout; guint64 ntpnstime; GstClockTime running_time; RTPSession *session; GstClock *sysclock; GST_DEBUG_OBJECT (rtpsession, "entering RTCP thread"); GST_RTP_SESSION_LOCK (rtpsession); sysclock = rtpsession->priv->sysclock; current_time = gst_clock_get_time (sysclock); session = rtpsession->priv->session; GST_DEBUG_OBJECT (rtpsession, "starting at %" GST_TIME_FORMAT, GST_TIME_ARGS (current_time)); session->start_time = current_time; while (!rtpsession->priv->stop_thread) { GstClockReturn res; /* get initial estimate */ next_timeout = rtp_session_next_timeout (session, current_time); GST_DEBUG_OBJECT (rtpsession, "next check time %" GST_TIME_FORMAT, GST_TIME_ARGS (next_timeout)); /* leave if no more timeouts, the session ended */ if (next_timeout == GST_CLOCK_TIME_NONE) break; id = rtpsession->priv->id = gst_clock_new_single_shot_id (sysclock, next_timeout); GST_RTP_SESSION_UNLOCK (rtpsession); res = gst_clock_id_wait (id, NULL); GST_RTP_SESSION_LOCK (rtpsession); gst_clock_id_unref (id); rtpsession->priv->id = NULL; if (rtpsession->priv->stop_thread) break; /* update current time */ current_time = gst_clock_get_time (sysclock); /* get current NTP time */ get_current_times (rtpsession, &running_time, &ntpnstime); /* we get unlocked because we need to perform reconsideration, don't perform * the timeout but get a new reporting estimate. */ GST_DEBUG_OBJECT (rtpsession, "unlocked %d, current %" GST_TIME_FORMAT, res, GST_TIME_ARGS (current_time)); /* perform actions, we ignore result. Release lock because it might push. */ GST_RTP_SESSION_UNLOCK (rtpsession); rtp_session_on_timeout (session, current_time, ntpnstime, running_time); GST_RTP_SESSION_LOCK (rtpsession); } /* mark the thread as stopped now */ rtpsession->priv->thread_stopped = TRUE; GST_RTP_SESSION_UNLOCK (rtpsession); GST_DEBUG_OBJECT (rtpsession, "leaving RTCP thread"); } static gboolean start_rtcp_thread (GstRtpSession * rtpsession) { GError *error = NULL; gboolean res; GST_DEBUG_OBJECT (rtpsession, "starting RTCP thread"); GST_RTP_SESSION_LOCK (rtpsession); rtpsession->priv->stop_thread = FALSE; if (rtpsession->priv->thread_stopped) { /* if the thread stopped, and we still have a handle to the thread, join it * now. We can safely join with the lock held, the thread will not take it * anymore. */ if (rtpsession->priv->thread) g_thread_join (rtpsession->priv->thread); /* only create a new thread if the old one was stopped. Otherwise we can * just reuse the currently running one. */ #if !GLIB_CHECK_VERSION (2, 31, 0) rtpsession->priv->thread = g_thread_create ((GThreadFunc) rtcp_thread, rtpsession, TRUE, &error); #else rtpsession->priv->thread = g_thread_try_new ("rtpsession-rtcp-thread", (GThreadFunc) rtcp_thread, rtpsession, &error); #endif rtpsession->priv->thread_stopped = FALSE; } GST_RTP_SESSION_UNLOCK (rtpsession); if (error != NULL) { res = FALSE; GST_DEBUG_OBJECT (rtpsession, "failed to start thread, %s", error->message); g_error_free (error); } else { res = TRUE; } return res; } static void stop_rtcp_thread (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "stopping RTCP thread"); GST_RTP_SESSION_LOCK (rtpsession); rtpsession->priv->stop_thread = TRUE; if (rtpsession->priv->id) gst_clock_id_unschedule (rtpsession->priv->id); GST_RTP_SESSION_UNLOCK (rtpsession); } static void join_rtcp_thread (GstRtpSession * rtpsession) { GST_RTP_SESSION_LOCK (rtpsession); /* don't try to join when we have no thread */ if (rtpsession->priv->thread != NULL) { GST_DEBUG_OBJECT (rtpsession, "joining RTCP thread"); GST_RTP_SESSION_UNLOCK (rtpsession); g_thread_join (rtpsession->priv->thread); GST_RTP_SESSION_LOCK (rtpsession); /* after the join, take the lock and clear the thread structure. The caller * is supposed to not concurrently call start and join. */ rtpsession->priv->thread = NULL; } GST_RTP_SESSION_UNLOCK (rtpsession); } static GstStateChangeReturn gst_rtp_session_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn res; GstRtpSession *rtpsession; rtpsession = GST_RTP_SESSION (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_PAUSED_TO_READY: /* no need to join yet, we might want to continue later. Also, the * dataflow could block downstream so that a join could just block * forever. */ stop_rtcp_thread (rtpsession); break; default: break; } res = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: if (!start_rtcp_thread (rtpsession)) goto failed_thread; break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* downstream is now releasing the dataflow and we can join. */ join_rtcp_thread (rtpsession); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return res; /* ERRORS */ failed_thread: { return GST_STATE_CHANGE_FAILURE; } } static gboolean return_true (gpointer key, gpointer value, gpointer user_data) { return TRUE; } static void gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession) { g_hash_table_foreach_remove (rtpsession->priv->ptmap, return_true, NULL); } /* called when the session manager has an RTP packet or a list of packets * ready for further processing */ static GstFlowReturn gst_rtp_session_process_rtp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gpointer user_data) { GstFlowReturn result; GstRtpSession *rtpsession; GstPad *rtp_src; rtpsession = GST_RTP_SESSION (user_data); GST_RTP_SESSION_LOCK (rtpsession); if ((rtp_src = rtpsession->recv_rtp_src)) gst_object_ref (rtp_src); GST_RTP_SESSION_UNLOCK (rtpsession); if (rtp_src) { GST_LOG_OBJECT (rtpsession, "pushing received RTP packet"); result = gst_pad_push (rtp_src, buffer); gst_object_unref (rtp_src); } else { GST_DEBUG_OBJECT (rtpsession, "dropping received RTP packet"); gst_buffer_unref (buffer); result = GST_FLOW_OK; } return result; } /* called when the session manager has an RTP packet ready for further * sending */ static GstFlowReturn gst_rtp_session_send_rtp (RTPSession * sess, RTPSource * src, gpointer data, gpointer user_data) { GstFlowReturn result; GstRtpSession *rtpsession; GstPad *rtp_src; rtpsession = GST_RTP_SESSION (user_data); GST_RTP_SESSION_LOCK (rtpsession); if ((rtp_src = rtpsession->send_rtp_src)) gst_object_ref (rtp_src); GST_RTP_SESSION_UNLOCK (rtpsession); if (rtp_src) { if (GST_IS_BUFFER (data)) { GST_LOG_OBJECT (rtpsession, "sending RTP packet"); result = gst_pad_push (rtp_src, GST_BUFFER_CAST (data)); } else { GST_LOG_OBJECT (rtpsession, "sending RTP list"); result = gst_pad_push_list (rtp_src, GST_BUFFER_LIST_CAST (data)); } gst_object_unref (rtp_src); } else { gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); result = GST_FLOW_OK; } return result; } /* called when the session manager has an RTCP packet ready for further * sending. The eos flag is set when an EOS event should be sent downstream as * well. */ static GstFlowReturn gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gboolean eos, gpointer user_data) { GstFlowReturn result; GstRtpSession *rtpsession; GstPad *rtcp_src; rtpsession = GST_RTP_SESSION (user_data); GST_RTP_SESSION_LOCK (rtpsession); if (rtpsession->priv->stop_thread) goto stopping; if ((rtcp_src = rtpsession->send_rtcp_src)) { GstCaps *caps; /* set rtcp caps on output pad */ if (!(caps = GST_PAD_CAPS (rtcp_src))) { caps = gst_caps_new_simple ("application/x-rtcp", NULL); gst_pad_set_caps (rtcp_src, caps); } else gst_caps_ref (caps); gst_buffer_set_caps (buffer, caps); gst_caps_unref (caps); gst_object_ref (rtcp_src); GST_RTP_SESSION_UNLOCK (rtpsession); GST_LOG_OBJECT (rtpsession, "sending RTCP"); result = gst_pad_push (rtcp_src, buffer); /* we have to send EOS after this packet */ if (eos) { GST_LOG_OBJECT (rtpsession, "sending EOS"); gst_pad_push_event (rtcp_src, gst_event_new_eos ()); } gst_object_unref (rtcp_src); } else { GST_RTP_SESSION_UNLOCK (rtpsession); GST_DEBUG_OBJECT (rtpsession, "not sending RTCP, no output pad"); gst_buffer_unref (buffer); result = GST_FLOW_OK; } return result; /* ERRORS */ stopping: { GST_DEBUG_OBJECT (rtpsession, "we are stopping"); gst_buffer_unref (buffer); GST_RTP_SESSION_UNLOCK (rtpsession); return GST_FLOW_OK; } } /* called when the session manager has an SR RTCP packet ready for handling * inter stream synchronisation */ static GstFlowReturn gst_rtp_session_sync_rtcp (RTPSession * sess, RTPSource * src, GstBuffer * buffer, gpointer user_data) { GstFlowReturn result; GstRtpSession *rtpsession; GstPad *sync_src; rtpsession = GST_RTP_SESSION (user_data); GST_RTP_SESSION_LOCK (rtpsession); if (rtpsession->priv->stop_thread) goto stopping; if ((sync_src = rtpsession->sync_src)) { GstCaps *caps; /* set rtcp caps on output pad */ if (!(caps = GST_PAD_CAPS (sync_src))) { caps = gst_caps_new_simple ("application/x-rtcp", NULL); gst_pad_set_caps (sync_src, caps); } else gst_caps_ref (caps); gst_buffer_set_caps (buffer, caps); gst_caps_unref (caps); gst_object_ref (sync_src); GST_RTP_SESSION_UNLOCK (rtpsession); GST_LOG_OBJECT (rtpsession, "sending Sync RTCP"); result = gst_pad_push (sync_src, buffer); gst_object_unref (sync_src); } else { GST_RTP_SESSION_UNLOCK (rtpsession); GST_DEBUG_OBJECT (rtpsession, "not sending Sync RTCP, no output pad"); gst_buffer_unref (buffer); result = GST_FLOW_OK; } return result; /* ERRORS */ stopping: { GST_DEBUG_OBJECT (rtpsession, "we are stopping"); gst_buffer_unref (buffer); GST_RTP_SESSION_UNLOCK (rtpsession); return GST_FLOW_OK; } } static void gst_rtp_session_cache_caps (GstRtpSession * rtpsession, GstCaps * caps) { GstRtpSessionPrivate *priv; const GstStructure *s; gint payload; priv = rtpsession->priv; GST_DEBUG_OBJECT (rtpsession, "parsing caps"); s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "payload", &payload)) return; if (g_hash_table_lookup (priv->ptmap, GINT_TO_POINTER (payload))) return; g_hash_table_insert (priv->ptmap, GINT_TO_POINTER (payload), gst_caps_ref (caps)); } static GstCaps * gst_rtp_session_get_caps_for_pt (GstRtpSession * rtpsession, guint payload) { GstCaps *caps = NULL; GValue args[2] = { {0}, {0} }; GValue ret = { 0 }; GST_RTP_SESSION_LOCK (rtpsession); caps = g_hash_table_lookup (rtpsession->priv->ptmap, GINT_TO_POINTER (payload)); if (caps) { gst_caps_ref (caps); goto done; } /* not found in the cache, try to get it with a signal */ g_value_init (&args[0], GST_TYPE_ELEMENT); g_value_set_object (&args[0], rtpsession); g_value_init (&args[1], G_TYPE_UINT); g_value_set_uint (&args[1], payload); g_value_init (&ret, GST_TYPE_CAPS); g_value_set_boxed (&ret, NULL); GST_RTP_SESSION_UNLOCK (rtpsession); g_signal_emitv (args, gst_rtp_session_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); GST_RTP_SESSION_LOCK (rtpsession); g_value_unset (&args[0]); g_value_unset (&args[1]); caps = (GstCaps *) g_value_dup_boxed (&ret); g_value_unset (&ret); if (!caps) goto no_caps; gst_rtp_session_cache_caps (rtpsession, caps); done: GST_RTP_SESSION_UNLOCK (rtpsession); return caps; no_caps: { GST_DEBUG_OBJECT (rtpsession, "could not get caps"); goto done; } } /* called when the session manager needs the clock rate */ static gint gst_rtp_session_clock_rate (RTPSession * sess, guint8 payload, gpointer user_data) { gint result = -1; GstRtpSession *rtpsession; GstCaps *caps; const GstStructure *s; rtpsession = GST_RTP_SESSION_CAST (user_data); caps = gst_rtp_session_get_caps_for_pt (rtpsession, payload); if (!caps) goto done; s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "clock-rate", &result)) goto no_clock_rate; gst_caps_unref (caps); GST_DEBUG_OBJECT (rtpsession, "parsed clock-rate %d", result); done: return result; /* ERRORS */ no_clock_rate: { gst_caps_unref (caps); GST_DEBUG_OBJECT (rtpsession, "No clock-rate in caps!"); goto done; } } /* called when the session manager asks us to reconsider the timeout */ static void gst_rtp_session_reconsider (RTPSession * sess, gpointer user_data) { GstRtpSession *rtpsession; rtpsession = GST_RTP_SESSION_CAST (user_data); GST_RTP_SESSION_LOCK (rtpsession); GST_DEBUG_OBJECT (rtpsession, "unlock timer for reconsideration"); if (rtpsession->priv->id) gst_clock_id_unschedule (rtpsession->priv->id); GST_RTP_SESSION_UNLOCK (rtpsession); } static gboolean gst_rtp_session_event_recv_rtp_sink (GstPad * pad, GstEvent * event) { GstRtpSession *rtpsession; gboolean ret = FALSE; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); if (G_UNLIKELY (rtpsession == NULL)) { gst_event_unref (event); return FALSE; } GST_DEBUG_OBJECT (rtpsession, "received event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); break; case GST_EVENT_NEWSEGMENT: { gboolean update; gdouble rate, arate; GstFormat format; gint64 start, stop, time; GstSegment *segment; segment = &rtpsession->recv_rtp_seg; /* the newsegment event is needed to convert the RTP timestamp to * running_time, which is needed to generate a mapping from RTP to NTP * timestamps in SR reports */ gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); GST_DEBUG_OBJECT (rtpsession, "configured NEWSEGMENT update %d, rate %lf, applied rate %lf, " "format GST_FORMAT_TIME, " "%" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT ", accum %" GST_TIME_FORMAT, update, rate, arate, GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop), GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->accum)); gst_segment_set_newsegment_full (segment, update, rate, arate, format, start, stop, time); /* push event forward */ ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); break; } default: ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); break; } gst_object_unref (rtpsession); return ret; } static gboolean gst_rtp_session_request_remote_key_unit (GstRtpSession * rtpsession, guint32 ssrc, guint payload, gboolean all_headers, gint count) { GstCaps *caps; caps = gst_rtp_session_get_caps_for_pt (rtpsession, payload); if (caps) { const GstStructure *s = gst_caps_get_structure (caps, 0); gboolean pli; gboolean fir; pli = gst_structure_has_field (s, "rtcp-fb-nack-pli"); fir = gst_structure_has_field (s, "rtcp-fb-ccm-fir") && all_headers; /* Google Talk uses FIR for repair, so send it even if we just want a * regular PLI */ if (!pli && gst_structure_has_field (s, "rtcp-fb-x-gstreamer-fir-as-repair")) fir = TRUE; gst_caps_unref (caps); if (pli || fir) return rtp_session_request_key_unit (rtpsession->priv->session, ssrc, gst_clock_get_time (rtpsession->priv->sysclock), fir, count); } return FALSE; } static gboolean gst_rtp_session_event_recv_rtp_src (GstPad * pad, GstEvent * event) { GstRtpSession *rtpsession; gboolean forward = TRUE; gboolean ret = TRUE; const GstStructure *s; guint32 ssrc; guint pt; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); if (G_UNLIKELY (rtpsession == NULL)) { gst_event_unref (event); return FALSE; } switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_UPSTREAM: s = gst_event_get_structure (event); if (gst_structure_has_name (s, "GstForceKeyUnit") && gst_structure_get_uint (s, "ssrc", &ssrc) && gst_structure_get_uint (s, "payload", &pt)) { gboolean all_headers = FALSE; gint count = -1; gst_structure_get_boolean (s, "all-headers", &all_headers); if (gst_structure_get_int (s, "count", &count) && count < 0) count += G_MAXINT; /* Make sure count is positive if present */ if (gst_rtp_session_request_remote_key_unit (rtpsession, ssrc, pt, all_headers, count)) forward = FALSE; } break; default: break; } if (forward) ret = gst_pad_push_event (rtpsession->recv_rtp_sink, event); gst_object_unref (rtpsession); return ret; } static GstIterator * gst_rtp_session_iterate_internal_links (GstPad * pad) { GstRtpSession *rtpsession; GstPad *otherpad = NULL; GstIterator *it = NULL; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); if (G_UNLIKELY (rtpsession == NULL)) return NULL; GST_RTP_SESSION_LOCK (rtpsession); if (pad == rtpsession->recv_rtp_src) { otherpad = gst_object_ref (rtpsession->recv_rtp_sink); } else if (pad == rtpsession->recv_rtp_sink) { otherpad = gst_object_ref (rtpsession->recv_rtp_src); } else if (pad == rtpsession->send_rtp_src) { otherpad = gst_object_ref (rtpsession->send_rtp_sink); } else if (pad == rtpsession->send_rtp_sink) { otherpad = gst_object_ref (rtpsession->send_rtp_src); } GST_RTP_SESSION_UNLOCK (rtpsession); if (otherpad) { it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); gst_object_unref (otherpad); } gst_object_unref (rtpsession); return it; } static gboolean gst_rtp_session_sink_setcaps (GstPad * pad, GstCaps * caps) { GstRtpSession *rtpsession; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); GST_RTP_SESSION_LOCK (rtpsession); gst_rtp_session_cache_caps (rtpsession, caps); GST_RTP_SESSION_UNLOCK (rtpsession); gst_object_unref (rtpsession); return TRUE; } /* receive a packet from a sender, send it to the RTP session manager and * forward the packet on the rtp_src pad */ static GstFlowReturn gst_rtp_session_chain_recv_rtp (GstPad * pad, GstBuffer * buffer) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; GstFlowReturn ret; GstClockTime current_time, running_time; GstClockTime timestamp; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); priv = rtpsession->priv; GST_LOG_OBJECT (rtpsession, "received RTP packet"); /* get NTP time when this packet was captured, this depends on the timestamp. */ timestamp = GST_BUFFER_TIMESTAMP (buffer); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { /* convert to running time using the segment values */ running_time = gst_segment_to_running_time (&rtpsession->recv_rtp_seg, GST_FORMAT_TIME, timestamp); } else { get_current_times (rtpsession, &running_time, NULL); } current_time = gst_clock_get_time (priv->sysclock); ret = rtp_session_process_rtp (priv->session, buffer, current_time, running_time); if (ret != GST_FLOW_OK) goto push_error; done: gst_object_unref (rtpsession); return ret; /* ERRORS */ push_error: { GST_DEBUG_OBJECT (rtpsession, "process returned %s", gst_flow_get_name (ret)); goto done; } } static gboolean gst_rtp_session_event_recv_rtcp_sink (GstPad * pad, GstEvent * event) { GstRtpSession *rtpsession; gboolean ret = FALSE; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (rtpsession, "received event %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { default: ret = gst_pad_push_event (rtpsession->sync_src, event); break; } gst_object_unref (rtpsession); return ret; } /* Receive an RTCP packet from a sender, send it to the RTP session manager and * forward the SR packets to the sync_src pad. */ static GstFlowReturn gst_rtp_session_chain_recv_rtcp (GstPad * pad, GstBuffer * buffer) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; GstClockTime current_time; guint64 ntpnstime; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); priv = rtpsession->priv; GST_LOG_OBJECT (rtpsession, "received RTCP packet"); current_time = gst_clock_get_time (priv->sysclock); get_current_times (rtpsession, NULL, &ntpnstime); rtp_session_process_rtcp (priv->session, buffer, current_time, ntpnstime); gst_object_unref (rtpsession); return GST_FLOW_OK; /* always return OK */ } static gboolean gst_rtp_session_query_send_rtcp_src (GstPad * pad, GstQuery * query) { GstRtpSession *rtpsession; gboolean ret = FALSE; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (rtpsession, "received QUERY"); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: ret = TRUE; /* use the defaults for the latency query. */ gst_query_set_latency (query, FALSE, 0, -1); break; default: /* other queries simply fail for now */ break; } gst_object_unref (rtpsession); return ret; } static gboolean gst_rtp_session_event_send_rtcp_src (GstPad * pad, GstEvent * event) { GstRtpSession *rtpsession; gboolean ret = TRUE; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); if (G_UNLIKELY (rtpsession == NULL)) { gst_event_unref (event); return FALSE; } GST_DEBUG_OBJECT (rtpsession, "received EVENT"); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: case GST_EVENT_LATENCY: gst_event_unref (event); ret = TRUE; break; default: /* other events simply fail for now */ gst_event_unref (event); ret = FALSE; break; } gst_object_unref (rtpsession); return ret; } static gboolean gst_rtp_session_event_send_rtp_sink (GstPad * pad, GstEvent * event) { GstRtpSession *rtpsession; gboolean ret = FALSE; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (rtpsession, "received event"); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED); ret = gst_pad_push_event (rtpsession->send_rtp_src, event); break; case GST_EVENT_NEWSEGMENT:{ gboolean update; gdouble rate, arate; GstFormat format; gint64 start, stop, time; GstSegment *segment; segment = &rtpsession->send_rtp_seg; /* the newsegment event is needed to convert the RTP timestamp to * running_time, which is needed to generate a mapping from RTP to NTP * timestamps in SR reports */ gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); GST_DEBUG_OBJECT (rtpsession, "configured NEWSEGMENT update %d, rate %lf, applied rate %lf, " "format GST_FORMAT_TIME, " "%" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT ", accum %" GST_TIME_FORMAT, update, rate, arate, GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop), GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->accum)); gst_segment_set_newsegment_full (segment, update, rate, arate, format, start, stop, time); /* push event forward */ ret = gst_pad_push_event (rtpsession->send_rtp_src, event); break; } case GST_EVENT_EOS:{ GstClockTime current_time; /* push downstream FIXME, we are not supposed to leave the session just * because we stop sending. */ ret = gst_pad_push_event (rtpsession->send_rtp_src, event); current_time = gst_clock_get_time (rtpsession->priv->sysclock); GST_DEBUG_OBJECT (rtpsession, "scheduling BYE message"); rtp_session_schedule_bye (rtpsession->priv->session, "End of stream", current_time); break; } default:{ GstPad *send_rtp_src = NULL; GST_RTP_SESSION_LOCK (rtpsession); if (rtpsession->send_rtp_src) send_rtp_src = gst_object_ref (rtpsession->send_rtp_src); GST_RTP_SESSION_UNLOCK (rtpsession); if (send_rtp_src) { ret = gst_pad_push_event (send_rtp_src, event); gst_object_unref (send_rtp_src); } else gst_event_unref (event); break; } } gst_object_unref (rtpsession); return ret; } static GstCaps * gst_rtp_session_getcaps_send_rtp (GstPad * pad) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; GstCaps *result; GstStructure *s1, *s2; guint ssrc; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); priv = rtpsession->priv; ssrc = rtp_session_get_internal_ssrc (priv->session); /* we can basically accept anything but we prefer to receive packets with our * internal SSRC so that we don't have to patch it. Create a structure with * the SSRC and another one without. */ s1 = gst_structure_new ("application/x-rtp", "ssrc", G_TYPE_UINT, ssrc, NULL); s2 = gst_structure_new ("application/x-rtp", NULL); result = gst_caps_new_full (s1, s2, NULL); GST_DEBUG_OBJECT (rtpsession, "getting caps %" GST_PTR_FORMAT, result); gst_object_unref (rtpsession); return result; } static gboolean gst_rtp_session_setcaps_send_rtp (GstPad * pad, GstCaps * caps) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; GstStructure *s = gst_caps_get_structure (caps, 0); guint ssrc; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); priv = rtpsession->priv; if (gst_structure_get_uint (s, "ssrc", &ssrc)) { GST_DEBUG_OBJECT (rtpsession, "setting internal SSRC to %08x", ssrc); rtp_session_set_internal_ssrc (priv->session, ssrc); } gst_object_unref (rtpsession); return TRUE; } /* Recieve an RTP packet or a list of packets to be send to the receivers, * send to RTP session manager and forward to send_rtp_src. */ static GstFlowReturn gst_rtp_session_chain_send_rtp_common (GstPad * pad, gpointer data, gboolean is_list) { GstRtpSession *rtpsession; GstRtpSessionPrivate *priv; GstFlowReturn ret; GstClockTime timestamp, running_time; GstClockTime current_time; rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad)); priv = rtpsession->priv; GST_LOG_OBJECT (rtpsession, "received RTP %s", is_list ? "list" : "packet"); /* get NTP time when this packet was captured, this depends on the timestamp. */ if (is_list) { GstBuffer *buffer = NULL; /* All groups in an list have the same timestamp. * So, just take it from the first group. */ buffer = gst_buffer_list_get (GST_BUFFER_LIST_CAST (data), 0, 0); if (buffer) timestamp = GST_BUFFER_TIMESTAMP (buffer); else timestamp = -1; } else { timestamp = GST_BUFFER_TIMESTAMP (GST_BUFFER_CAST (data)); } if (GST_CLOCK_TIME_IS_VALID (timestamp)) { /* convert to running time using the segment start value. */ running_time = gst_segment_to_running_time (&rtpsession->send_rtp_seg, GST_FORMAT_TIME, timestamp); } else { /* no timestamp. */ running_time = -1; } current_time = gst_clock_get_time (priv->sysclock); ret = rtp_session_send_rtp (priv->session, data, is_list, current_time, running_time); if (ret != GST_FLOW_OK) goto push_error; done: gst_object_unref (rtpsession); return ret; /* ERRORS */ push_error: { GST_DEBUG_OBJECT (rtpsession, "process returned %s", gst_flow_get_name (ret)); goto done; } } static GstFlowReturn gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer) { return gst_rtp_session_chain_send_rtp_common (pad, buffer, FALSE); } static GstFlowReturn gst_rtp_session_chain_send_rtp_list (GstPad * pad, GstBufferList * list) { return gst_rtp_session_chain_send_rtp_common (pad, list, TRUE); } /* Create sinkpad to receive RTP packets from senders. This will also create a * srcpad for the RTP packets. */ static GstPad * create_recv_rtp_sink (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "creating RTP sink pad"); rtpsession->recv_rtp_sink = gst_pad_new_from_static_template (&rtpsession_recv_rtp_sink_template, "recv_rtp_sink"); gst_pad_set_chain_function (rtpsession->recv_rtp_sink, gst_rtp_session_chain_recv_rtp); gst_pad_set_event_function (rtpsession->recv_rtp_sink, (GstPadEventFunction) gst_rtp_session_event_recv_rtp_sink); gst_pad_set_setcaps_function (rtpsession->recv_rtp_sink, gst_rtp_session_sink_setcaps); gst_pad_set_iterate_internal_links_function (rtpsession->recv_rtp_sink, gst_rtp_session_iterate_internal_links); gst_pad_set_active (rtpsession->recv_rtp_sink, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtp_sink); GST_DEBUG_OBJECT (rtpsession, "creating RTP src pad"); rtpsession->recv_rtp_src = gst_pad_new_from_static_template (&rtpsession_recv_rtp_src_template, "recv_rtp_src"); gst_pad_set_event_function (rtpsession->recv_rtp_src, (GstPadEventFunction) gst_rtp_session_event_recv_rtp_src); gst_pad_set_iterate_internal_links_function (rtpsession->recv_rtp_src, gst_rtp_session_iterate_internal_links); gst_pad_use_fixed_caps (rtpsession->recv_rtp_src); gst_pad_set_active (rtpsession->recv_rtp_src, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtp_src); return rtpsession->recv_rtp_sink; } /* Remove sinkpad to receive RTP packets from senders. This will also remove * the srcpad for the RTP packets. */ static void remove_recv_rtp_sink (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "removing RTP sink pad"); /* deactivate from source to sink */ gst_pad_set_active (rtpsession->recv_rtp_src, FALSE); gst_pad_set_active (rtpsession->recv_rtp_sink, FALSE); /* remove pads */ gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtp_sink); rtpsession->recv_rtp_sink = NULL; GST_DEBUG_OBJECT (rtpsession, "removing RTP src pad"); gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtp_src); rtpsession->recv_rtp_src = NULL; } /* Create a sinkpad to receive RTCP messages from senders, this will also create a * sync_src pad for the SR packets. */ static GstPad * create_recv_rtcp_sink (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "creating RTCP sink pad"); rtpsession->recv_rtcp_sink = gst_pad_new_from_static_template (&rtpsession_recv_rtcp_sink_template, "recv_rtcp_sink"); gst_pad_set_chain_function (rtpsession->recv_rtcp_sink, gst_rtp_session_chain_recv_rtcp); gst_pad_set_event_function (rtpsession->recv_rtcp_sink, (GstPadEventFunction) gst_rtp_session_event_recv_rtcp_sink); gst_pad_set_iterate_internal_links_function (rtpsession->recv_rtcp_sink, gst_rtp_session_iterate_internal_links); gst_pad_set_active (rtpsession->recv_rtcp_sink, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtcp_sink); GST_DEBUG_OBJECT (rtpsession, "creating sync src pad"); rtpsession->sync_src = gst_pad_new_from_static_template (&rtpsession_sync_src_template, "sync_src"); gst_pad_set_iterate_internal_links_function (rtpsession->sync_src, gst_rtp_session_iterate_internal_links); gst_pad_use_fixed_caps (rtpsession->sync_src); gst_pad_set_active (rtpsession->sync_src, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->sync_src); return rtpsession->recv_rtcp_sink; } static void remove_recv_rtcp_sink (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "removing RTCP sink pad"); gst_pad_set_active (rtpsession->sync_src, FALSE); gst_pad_set_active (rtpsession->recv_rtcp_sink, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->recv_rtcp_sink); rtpsession->recv_rtcp_sink = NULL; GST_DEBUG_OBJECT (rtpsession, "removing sync src pad"); gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->sync_src); rtpsession->sync_src = NULL; } /* Create a sinkpad to receive RTP packets for receivers. This will also create a * send_rtp_src pad. */ static GstPad * create_send_rtp_sink (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "creating pad"); rtpsession->send_rtp_sink = gst_pad_new_from_static_template (&rtpsession_send_rtp_sink_template, "send_rtp_sink"); gst_pad_set_chain_function (rtpsession->send_rtp_sink, gst_rtp_session_chain_send_rtp); gst_pad_set_chain_list_function (rtpsession->send_rtp_sink, gst_rtp_session_chain_send_rtp_list); gst_pad_set_getcaps_function (rtpsession->send_rtp_sink, gst_rtp_session_getcaps_send_rtp); gst_pad_set_setcaps_function (rtpsession->send_rtp_sink, gst_rtp_session_setcaps_send_rtp); gst_pad_set_event_function (rtpsession->send_rtp_sink, (GstPadEventFunction) gst_rtp_session_event_send_rtp_sink); gst_pad_set_iterate_internal_links_function (rtpsession->send_rtp_sink, gst_rtp_session_iterate_internal_links); gst_pad_set_active (rtpsession->send_rtp_sink, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtp_sink); rtpsession->send_rtp_src = gst_pad_new_from_static_template (&rtpsession_send_rtp_src_template, "send_rtp_src"); gst_pad_set_iterate_internal_links_function (rtpsession->send_rtp_src, gst_rtp_session_iterate_internal_links); gst_pad_set_active (rtpsession->send_rtp_src, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtp_src); return rtpsession->send_rtp_sink; } static void remove_send_rtp_sink (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "removing pad"); gst_pad_set_active (rtpsession->send_rtp_src, FALSE); gst_pad_set_active (rtpsession->send_rtp_sink, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtp_sink); rtpsession->send_rtp_sink = NULL; gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtp_src); rtpsession->send_rtp_src = NULL; } /* Create a srcpad with the RTCP packets to send out. * This pad will be driven by the RTP session manager when it wants to send out * RTCP packets. */ static GstPad * create_send_rtcp_src (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "creating pad"); rtpsession->send_rtcp_src = gst_pad_new_from_static_template (&rtpsession_send_rtcp_src_template, "send_rtcp_src"); gst_pad_use_fixed_caps (rtpsession->send_rtcp_src); gst_pad_set_active (rtpsession->send_rtcp_src, TRUE); gst_pad_set_iterate_internal_links_function (rtpsession->send_rtcp_src, gst_rtp_session_iterate_internal_links); gst_pad_set_query_function (rtpsession->send_rtcp_src, gst_rtp_session_query_send_rtcp_src); gst_pad_set_event_function (rtpsession->send_rtcp_src, gst_rtp_session_event_send_rtcp_src); gst_element_add_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtcp_src); return rtpsession->send_rtcp_src; } static void remove_send_rtcp_src (GstRtpSession * rtpsession) { GST_DEBUG_OBJECT (rtpsession, "removing pad"); gst_pad_set_active (rtpsession->send_rtcp_src, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpsession), rtpsession->send_rtcp_src); rtpsession->send_rtcp_src = NULL; } static GstPad * gst_rtp_session_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name) { GstRtpSession *rtpsession; GstElementClass *klass; GstPad *result; g_return_val_if_fail (templ != NULL, NULL); g_return_val_if_fail (GST_IS_RTP_SESSION (element), NULL); rtpsession = GST_RTP_SESSION (element); klass = GST_ELEMENT_GET_CLASS (element); GST_DEBUG_OBJECT (element, "requesting pad %s", GST_STR_NULL (name)); GST_RTP_SESSION_LOCK (rtpsession); /* figure out the template */ if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink")) { if (rtpsession->recv_rtp_sink != NULL) goto exists; result = create_recv_rtp_sink (rtpsession); } else if (templ == gst_element_class_get_pad_template (klass, "recv_rtcp_sink")) { if (rtpsession->recv_rtcp_sink != NULL) goto exists; result = create_recv_rtcp_sink (rtpsession); } else if (templ == gst_element_class_get_pad_template (klass, "send_rtp_sink")) { if (rtpsession->send_rtp_sink != NULL) goto exists; result = create_send_rtp_sink (rtpsession); } else if (templ == gst_element_class_get_pad_template (klass, "send_rtcp_src")) { if (rtpsession->send_rtcp_src != NULL) goto exists; result = create_send_rtcp_src (rtpsession); } else goto wrong_template; GST_RTP_SESSION_UNLOCK (rtpsession); return result; /* ERRORS */ wrong_template: { GST_RTP_SESSION_UNLOCK (rtpsession); g_warning ("gstrtpsession: this is not our template"); return NULL; } exists: { GST_RTP_SESSION_UNLOCK (rtpsession); g_warning ("gstrtpsession: pad already requested"); return NULL; } } static void gst_rtp_session_release_pad (GstElement * element, GstPad * pad) { GstRtpSession *rtpsession; g_return_if_fail (GST_IS_RTP_SESSION (element)); g_return_if_fail (GST_IS_PAD (pad)); rtpsession = GST_RTP_SESSION (element); GST_DEBUG_OBJECT (element, "releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad)); GST_RTP_SESSION_LOCK (rtpsession); if (rtpsession->recv_rtp_sink == pad) { remove_recv_rtp_sink (rtpsession); } else if (rtpsession->recv_rtcp_sink == pad) { remove_recv_rtcp_sink (rtpsession); } else if (rtpsession->send_rtp_sink == pad) { remove_send_rtp_sink (rtpsession); } else if (rtpsession->send_rtcp_src == pad) { remove_send_rtcp_src (rtpsession); } else goto wrong_pad; GST_RTP_SESSION_UNLOCK (rtpsession); return; /* ERRORS */ wrong_pad: { GST_RTP_SESSION_UNLOCK (rtpsession); g_warning ("gstrtpsession: asked to release an unknown pad"); return; } } static void gst_rtp_session_request_key_unit (RTPSession * sess, gboolean all_headers, gpointer user_data) { GstRtpSession *rtpsession = GST_RTP_SESSION (user_data); GstEvent *event; event = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, gst_structure_new ("GstForceKeyUnit", "all-headers", G_TYPE_BOOLEAN, all_headers, NULL)); gst_pad_push_event (rtpsession->send_rtp_sink, event); } static GstClockTime gst_rtp_session_request_time (RTPSession * session, gpointer user_data) { GstRtpSession *rtpsession = GST_RTP_SESSION (user_data); return gst_clock_get_time (rtpsession->priv->sysclock); } gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpssrcdemux.c0000644000175000017500000005472611705514245020403 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * RTP SSRC demuxer * * 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-gstrtpssrcdemux * * gstrtpssrcdemux acts as a demuxer for RTP packets based on the SSRC of the * packets. Its main purpose is to allow an application to easily receive and * decode an RTP stream with multiple SSRCs. * * For each SSRC that is detected, a new pad will be created and the * #GstRtpSsrcDemux::new-ssrc-pad signal will be emitted. * * * Example pipelines * |[ * gst-launch udpsrc caps="application/x-rtp" ! gstrtpssrcdemux ! fakesink * ]| Takes an RTP stream and send the RTP packets with the first detected SSRC * to fakesink, discarding the other SSRCs. * * * Last reviewed on 2007-05-28 (0.10.5) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include #include "gstrtpbin-marshal.h" #include "gstrtpssrcdemux.h" GST_DEBUG_CATEGORY_STATIC (gst_rtp_ssrc_demux_debug); #define GST_CAT_DEFAULT gst_rtp_ssrc_demux_debug /* generic templates */ static GstStaticPadTemplate rtp_ssrc_demux_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtp_ssrc_demux_rtcp_sink_template = GST_STATIC_PAD_TEMPLATE ("rtcp_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate rtp_ssrc_demux_src_template = GST_STATIC_PAD_TEMPLATE ("src_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtp_ssrc_demux_rtcp_src_template = GST_STATIC_PAD_TEMPLATE ("rtcp_src_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtcp") ); #define GST_PAD_LOCK(obj) (g_static_rec_mutex_lock (&(obj)->padlock)) #define GST_PAD_UNLOCK(obj) (g_static_rec_mutex_unlock (&(obj)->padlock)) /* signals */ enum { SIGNAL_NEW_SSRC_PAD, SIGNAL_REMOVED_SSRC_PAD, SIGNAL_CLEAR_SSRC, LAST_SIGNAL }; GST_BOILERPLATE (GstRtpSsrcDemux, gst_rtp_ssrc_demux, GstElement, GST_TYPE_ELEMENT); /* GObject vmethods */ static void gst_rtp_ssrc_demux_dispose (GObject * object); static void gst_rtp_ssrc_demux_finalize (GObject * object); /* GstElement vmethods */ static GstStateChangeReturn gst_rtp_ssrc_demux_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_ssrc_demux_clear_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc); /* sinkpad stuff */ static GstFlowReturn gst_rtp_ssrc_demux_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_rtp_ssrc_demux_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_rtp_ssrc_demux_rtcp_sink_event (GstPad * pad, GstEvent * event); static GstIterator *gst_rtp_ssrc_demux_iterate_internal_links_sink (GstPad * pad); /* srcpad stuff */ static gboolean gst_rtp_ssrc_demux_src_event (GstPad * pad, GstEvent * event); static GstIterator *gst_rtp_ssrc_demux_iterate_internal_links_src (GstPad * pad); static gboolean gst_rtp_ssrc_demux_src_query (GstPad * pad, GstQuery * query); static guint gst_rtp_ssrc_demux_signals[LAST_SIGNAL] = { 0 }; /* * Item for storing GstPad <-> SSRC pairs. */ struct _GstRtpSsrcDemuxPad { guint32 ssrc; GstPad *rtp_pad; GstCaps *caps; GstPad *rtcp_pad; }; /* find a src pad for a given SSRC, returns NULL if the SSRC was not found */ static GstRtpSsrcDemuxPad * find_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc) { GSList *walk; for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data; if (pad->ssrc == ssrc) return pad; } return NULL; } /* with PAD_LOCK */ static GstRtpSsrcDemuxPad * find_or_create_demux_pad_for_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc) { GstPad *rtp_pad, *rtcp_pad; GstElementClass *klass; GstPadTemplate *templ; gchar *padname; GstRtpSsrcDemuxPad *demuxpad; GST_DEBUG_OBJECT (demux, "creating pad for SSRC %08x", ssrc); demuxpad = find_demux_pad_for_ssrc (demux, ssrc); if (demuxpad != NULL) { return demuxpad; } klass = GST_ELEMENT_GET_CLASS (demux); templ = gst_element_class_get_pad_template (klass, "src_%d"); padname = g_strdup_printf ("src_%d", ssrc); rtp_pad = gst_pad_new_from_template (templ, padname); g_free (padname); templ = gst_element_class_get_pad_template (klass, "rtcp_src_%d"); padname = g_strdup_printf ("rtcp_src_%d", ssrc); rtcp_pad = gst_pad_new_from_template (templ, padname); g_free (padname); /* wrap in structure and add to list */ demuxpad = g_new0 (GstRtpSsrcDemuxPad, 1); demuxpad->ssrc = ssrc; demuxpad->rtp_pad = rtp_pad; demuxpad->rtcp_pad = rtcp_pad; gst_pad_set_element_private (rtp_pad, demuxpad); gst_pad_set_element_private (rtcp_pad, demuxpad); demux->srcpads = g_slist_prepend (demux->srcpads, demuxpad); /* copy caps from input */ gst_pad_set_caps (rtp_pad, GST_PAD_CAPS (demux->rtp_sink)); gst_pad_use_fixed_caps (rtp_pad); gst_pad_set_caps (rtcp_pad, GST_PAD_CAPS (demux->rtcp_sink)); gst_pad_use_fixed_caps (rtcp_pad); gst_pad_set_event_function (rtp_pad, gst_rtp_ssrc_demux_src_event); gst_pad_set_query_function (rtp_pad, gst_rtp_ssrc_demux_src_query); gst_pad_set_iterate_internal_links_function (rtp_pad, gst_rtp_ssrc_demux_iterate_internal_links_src); gst_pad_set_active (rtp_pad, TRUE); gst_pad_set_event_function (rtcp_pad, gst_rtp_ssrc_demux_src_event); gst_pad_set_iterate_internal_links_function (rtcp_pad, gst_rtp_ssrc_demux_iterate_internal_links_src); gst_pad_set_active (rtcp_pad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (demux), rtp_pad); gst_element_add_pad (GST_ELEMENT_CAST (demux), rtcp_pad); g_signal_emit (G_OBJECT (demux), gst_rtp_ssrc_demux_signals[SIGNAL_NEW_SSRC_PAD], 0, ssrc, rtp_pad); return demuxpad; } static void gst_rtp_ssrc_demux_base_init (gpointer g_class) { GstElementClass *gstelement_klass = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (gstelement_klass, &rtp_ssrc_demux_sink_template); gst_element_class_add_static_pad_template (gstelement_klass, &rtp_ssrc_demux_rtcp_sink_template); gst_element_class_add_static_pad_template (gstelement_klass, &rtp_ssrc_demux_src_template); gst_element_class_add_static_pad_template (gstelement_klass, &rtp_ssrc_demux_rtcp_src_template); gst_element_class_set_details_simple (gstelement_klass, "RTP SSRC Demux", "Demux/Network/RTP", "Splits RTP streams based on the SSRC", "Wim Taymans "); } static void gst_rtp_ssrc_demux_class_init (GstRtpSsrcDemuxClass * klass) { GObjectClass *gobject_klass; GstElementClass *gstelement_klass; GstRtpSsrcDemuxClass *gstrtpssrcdemux_klass; gobject_klass = (GObjectClass *) klass; gstelement_klass = (GstElementClass *) klass; gstrtpssrcdemux_klass = (GstRtpSsrcDemuxClass *) klass; gobject_klass->dispose = gst_rtp_ssrc_demux_dispose; gobject_klass->finalize = gst_rtp_ssrc_demux_finalize; /** * GstRtpSsrcDemux::new-ssrc-pad: * @demux: the object which received the signal * @ssrc: the SSRC of the pad * @pad: the new pad. * * Emited when a new SSRC pad has been created. */ gst_rtp_ssrc_demux_signals[SIGNAL_NEW_SSRC_PAD] = g_signal_new ("new-ssrc-pad", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSsrcDemuxClass, new_ssrc_pad), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_OBJECT, G_TYPE_NONE, 2, G_TYPE_UINT, GST_TYPE_PAD); /** * GstRtpSsrcDemux::removed-ssrc-pad: * @demux: the object which received the signal * @ssrc: the SSRC of the pad * @pad: the removed pad. * * Emited when a SSRC pad has been removed. */ gst_rtp_ssrc_demux_signals[SIGNAL_REMOVED_SSRC_PAD] = g_signal_new ("removed-ssrc-pad", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpSsrcDemuxClass, removed_ssrc_pad), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_OBJECT, G_TYPE_NONE, 2, G_TYPE_UINT, GST_TYPE_PAD); /** * GstRtpSsrcDemux::clear-ssrc: * @demux: the object which received the signal * @ssrc: the SSRC of the pad * * Action signal to remove the pad for SSRC. */ gst_rtp_ssrc_demux_signals[SIGNAL_CLEAR_SSRC] = g_signal_new ("clear-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpSsrcDemuxClass, clear_ssrc), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); gstelement_klass->change_state = GST_DEBUG_FUNCPTR (gst_rtp_ssrc_demux_change_state); gstrtpssrcdemux_klass->clear_ssrc = GST_DEBUG_FUNCPTR (gst_rtp_ssrc_demux_clear_ssrc); GST_DEBUG_CATEGORY_INIT (gst_rtp_ssrc_demux_debug, "rtpssrcdemux", 0, "RTP SSRC demuxer"); } static void gst_rtp_ssrc_demux_init (GstRtpSsrcDemux * demux, GstRtpSsrcDemuxClass * g_class) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); demux->rtp_sink = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); gst_pad_set_chain_function (demux->rtp_sink, gst_rtp_ssrc_demux_chain); gst_pad_set_event_function (demux->rtp_sink, gst_rtp_ssrc_demux_sink_event); gst_pad_set_iterate_internal_links_function (demux->rtp_sink, gst_rtp_ssrc_demux_iterate_internal_links_sink); gst_element_add_pad (GST_ELEMENT_CAST (demux), demux->rtp_sink); demux->rtcp_sink = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "rtcp_sink"), "rtcp_sink"); gst_pad_set_chain_function (demux->rtcp_sink, gst_rtp_ssrc_demux_rtcp_chain); gst_pad_set_event_function (demux->rtcp_sink, gst_rtp_ssrc_demux_rtcp_sink_event); gst_pad_set_iterate_internal_links_function (demux->rtcp_sink, gst_rtp_ssrc_demux_iterate_internal_links_sink); gst_element_add_pad (GST_ELEMENT_CAST (demux), demux->rtcp_sink); g_static_rec_mutex_init (&demux->padlock); gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); } static void gst_rtp_ssrc_demux_reset (GstRtpSsrcDemux * demux) { GSList *walk; for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) walk->data; gst_pad_set_active (dpad->rtp_pad, FALSE); gst_pad_set_active (dpad->rtcp_pad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtp_pad); gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtcp_pad); g_free (dpad); } g_slist_free (demux->srcpads); demux->srcpads = NULL; } static void gst_rtp_ssrc_demux_dispose (GObject * object) { GstRtpSsrcDemux *demux; demux = GST_RTP_SSRC_DEMUX (object); gst_rtp_ssrc_demux_reset (demux); G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_rtp_ssrc_demux_finalize (GObject * object) { GstRtpSsrcDemux *demux; demux = GST_RTP_SSRC_DEMUX (object); g_static_rec_mutex_free (&demux->padlock); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_ssrc_demux_clear_ssrc (GstRtpSsrcDemux * demux, guint32 ssrc) { GstRtpSsrcDemuxPad *dpad; GST_PAD_LOCK (demux); dpad = find_demux_pad_for_ssrc (demux, ssrc); if (dpad == NULL) { GST_PAD_UNLOCK (demux); goto unknown_pad; } GST_DEBUG_OBJECT (demux, "clearing pad for SSRC %08x", ssrc); demux->srcpads = g_slist_remove (demux->srcpads, dpad); GST_PAD_UNLOCK (demux); gst_pad_set_active (dpad->rtp_pad, FALSE); gst_pad_set_active (dpad->rtcp_pad, FALSE); g_signal_emit (G_OBJECT (demux), gst_rtp_ssrc_demux_signals[SIGNAL_REMOVED_SSRC_PAD], 0, ssrc, dpad->rtp_pad); gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtp_pad); gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtcp_pad); g_free (dpad); return; /* ERRORS */ unknown_pad: { GST_WARNING_OBJECT (demux, "unknown SSRC %08x", ssrc); return; } } static gboolean gst_rtp_ssrc_demux_sink_event (GstPad * pad, GstEvent * event) { GstRtpSsrcDemux *demux; gboolean res = FALSE; demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); if (G_UNLIKELY (demux == NULL)) { gst_event_unref (event); return FALSE; } switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); case GST_EVENT_NEWSEGMENT: default: { GSList *walk; GSList *pads = NULL; res = TRUE; /* need local snapshot of pads; * should not push downstream while holding lock as that might deadlock * with stuff traveling upstream tyring to get this lock while holding * other (stream)lock */ GST_PAD_LOCK (demux); for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data; pads = g_slist_prepend (pads, gst_object_ref (pad->rtp_pad)); } GST_PAD_UNLOCK (demux); for (walk = pads; walk; walk = g_slist_next (walk)) { GstPad *pad = (GstPad *) walk->data; gst_event_ref (event); res &= gst_pad_push_event (pad, event); gst_object_unref (pad); } g_slist_free (pads); gst_event_unref (event); break; } } gst_object_unref (demux); return res; } static gboolean gst_rtp_ssrc_demux_rtcp_sink_event (GstPad * pad, GstEvent * event) { GstRtpSsrcDemux *demux; gboolean res = FALSE; demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: default: { GSList *walk; GSList *pads = NULL; res = TRUE; GST_PAD_LOCK (demux); for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpSsrcDemuxPad *pad = (GstRtpSsrcDemuxPad *) walk->data; pads = g_slist_prepend (pads, gst_object_ref (pad->rtcp_pad)); } GST_PAD_UNLOCK (demux); for (walk = pads; walk; walk = g_slist_next (walk)) { GstPad *pad = (GstPad *) walk->data; gst_event_ref (event); res &= gst_pad_push_event (pad, event); gst_object_unref (pad); } g_slist_free (pads); gst_event_unref (event); break; } } gst_object_unref (demux); return res; } static GstFlowReturn gst_rtp_ssrc_demux_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret; GstRtpSsrcDemux *demux; guint32 ssrc; GstRtpSsrcDemuxPad *dpad; GstPad *srcpad; demux = GST_RTP_SSRC_DEMUX (GST_OBJECT_PARENT (pad)); if (!gst_rtp_buffer_validate (buf)) goto invalid_payload; ssrc = gst_rtp_buffer_get_ssrc (buf); GST_DEBUG_OBJECT (demux, "received buffer of SSRC %08x", ssrc); GST_PAD_LOCK (demux); dpad = find_or_create_demux_pad_for_ssrc (demux, ssrc); if (dpad == NULL) { GST_PAD_UNLOCK (demux); goto create_failed; } srcpad = gst_object_ref (dpad->rtp_pad); GST_PAD_UNLOCK (demux); /* push to srcpad */ ret = gst_pad_push (srcpad, buf); gst_object_unref (srcpad); return ret; /* ERRORS */ invalid_payload: { /* this is fatal and should be filtered earlier */ GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), ("Dropping invalid RTP payload")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } create_failed: { GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), ("Could not create new pad")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static GstFlowReturn gst_rtp_ssrc_demux_rtcp_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret; GstRtpSsrcDemux *demux; guint32 ssrc; GstRtpSsrcDemuxPad *dpad; GstRTCPPacket packet; GstPad *srcpad; demux = GST_RTP_SSRC_DEMUX (GST_OBJECT_PARENT (pad)); if (!gst_rtcp_buffer_validate (buf)) goto invalid_rtcp; if (!gst_rtcp_buffer_get_first_packet (buf, &packet)) goto invalid_rtcp; /* first packet must be SR or RR or else the validate would have failed */ switch (gst_rtcp_packet_get_type (&packet)) { case GST_RTCP_TYPE_SR: /* get the ssrc so that we can route it to the right source pad */ gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, NULL, NULL, NULL, NULL); break; default: goto unexpected_rtcp; } GST_DEBUG_OBJECT (demux, "received RTCP of SSRC %08x", ssrc); GST_PAD_LOCK (demux); dpad = find_or_create_demux_pad_for_ssrc (demux, ssrc); if (dpad == NULL) { GST_PAD_UNLOCK (demux); goto create_failed; } srcpad = gst_object_ref (dpad->rtcp_pad); GST_PAD_UNLOCK (demux); /* push to srcpad */ ret = gst_pad_push (srcpad, buf); gst_object_unref (srcpad); return ret; /* ERRORS */ invalid_rtcp: { /* this is fatal and should be filtered earlier */ GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), ("Dropping invalid RTCP packet")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } unexpected_rtcp: { GST_DEBUG_OBJECT (demux, "dropping unexpected RTCP packet"); gst_buffer_unref (buf); return GST_FLOW_OK; } create_failed: { GST_ELEMENT_ERROR (demux, STREAM, DECODE, (NULL), ("Could not create new pad")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static gboolean gst_rtp_ssrc_demux_src_event (GstPad * pad, GstEvent * event) { GstRtpSsrcDemux *demux; const GstStructure *s; demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_UPSTREAM: case GST_EVENT_CUSTOM_BOTH: case GST_EVENT_CUSTOM_BOTH_OOB: s = gst_event_get_structure (event); if (s && !gst_structure_has_field (s, "ssrc")) { GSList *walk; for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) walk->data; if (dpad->rtp_pad == pad || dpad->rtcp_pad == pad) { event = GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (event))); gst_structure_set (event->structure, "ssrc", G_TYPE_UINT, dpad->ssrc, NULL); break; } } } break; default: break; } gst_object_unref (demux); return gst_pad_event_default (pad, event); } static GstIterator * gst_rtp_ssrc_demux_iterate_internal_links_src (GstPad * pad) { GstRtpSsrcDemux *demux; GstPad *otherpad = NULL; GstIterator *it = NULL; GSList *current; demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); if (!demux) return NULL; GST_PAD_LOCK (demux); for (current = demux->srcpads; current; current = g_slist_next (current)) { GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) current->data; if (pad == dpad->rtp_pad) { otherpad = demux->rtp_sink; break; } else if (pad == dpad->rtcp_pad) { otherpad = demux->rtcp_sink; break; } } it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); GST_PAD_UNLOCK (demux); gst_object_unref (demux); return it; } /* Should return 0 for elements to be included */ static gint src_pad_compare_func (gconstpointer a, gconstpointer b) { GstPad *pad = GST_PAD (a); const gchar *prefix = b; gint res = 1; GST_OBJECT_LOCK (pad); res = !GST_PAD_NAME (pad) || g_str_has_prefix (GST_PAD_NAME (pad), prefix); GST_OBJECT_UNLOCK (pad); return res; } static GstIterator * gst_rtp_ssrc_demux_iterate_internal_links_sink (GstPad * pad) { GstRtpSsrcDemux *demux; GstIterator *it = NULL; const gchar *prefix = NULL; demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); if (!demux) return NULL; if (pad == demux->rtp_sink) prefix = "src_"; else if (pad == demux->rtcp_sink) prefix = "rtcp_src_"; else g_assert_not_reached (); it = gst_element_iterate_src_pads (GST_ELEMENT (demux)); it = gst_iterator_filter (it, src_pad_compare_func, (gpointer) prefix); gst_object_unref (demux); return it; } static gboolean gst_rtp_ssrc_demux_src_query (GstPad * pad, GstQuery * query) { GstRtpSsrcDemux *demux; gboolean res = FALSE; demux = GST_RTP_SSRC_DEMUX (gst_pad_get_parent (pad)); if (G_UNLIKELY (demux == NULL)) return FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { if ((res = gst_pad_peer_query (demux->rtp_sink, query))) { gboolean live; GstClockTime min_latency, max_latency; GstRtpSsrcDemuxPad *demuxpad; demuxpad = gst_pad_get_element_private (pad); gst_query_parse_latency (query, &live, &min_latency, &max_latency); GST_DEBUG_OBJECT (demux, "peer min latency %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency)); GST_DEBUG_OBJECT (demux, "latency for SSRC %08x", demuxpad->ssrc); gst_query_set_latency (query, live, min_latency, max_latency); } break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (demux); return res; } static GstStateChangeReturn gst_rtp_ssrc_demux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRtpSsrcDemux *demux; demux = GST_RTP_SSRC_DEMUX (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_PAUSED_TO_PLAYING: default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_ssrc_demux_reset (demux); break; case GST_STATE_CHANGE_READY_TO_NULL: default: break; } return ret; } gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpbin.h0000644000175000017500000000704211677341656017144 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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_RTP_BIN_H__ #define __GST_RTP_BIN_H__ #include #include "rtpsession.h" #include "rtpjitterbuffer.h" #define GST_TYPE_RTP_BIN \ (gst_rtp_bin_get_type()) #define GST_RTP_BIN(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BIN,GstRtpBin)) #define GST_RTP_BIN_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BIN,GstRtpBinClass)) #define GST_IS_RTP_BIN(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BIN)) #define GST_IS_RTP_BIN_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BIN)) typedef struct _GstRtpBin GstRtpBin; typedef struct _GstRtpBinClass GstRtpBinClass; typedef struct _GstRtpBinPrivate GstRtpBinPrivate; struct _GstRtpBin { GstBin bin; /*< private >*/ /* default latency for sessions */ guint latency_ms; guint64 latency_ns; gboolean do_lost; gboolean ignore_pt; gboolean ntp_sync; gint rtcp_sync; guint rtcp_sync_interval; RTPJitterBufferMode buffer_mode; gboolean buffering; gboolean use_pipeline_clock; GstClockTime buffer_start; /* a list of session */ GSList *sessions; /* a list of clients, these are streams with the same CNAME */ GSList *clients; /* the default SDES items for sessions */ GstStructure *sdes; /*< private >*/ GstRtpBinPrivate *priv; }; struct _GstRtpBinClass { GstBinClass parent_class; /* get the caps for pt */ GstCaps* (*request_pt_map) (GstRtpBin *rtpbin, guint session, guint pt); void (*payload_type_change) (GstRtpBin *rtpbin, guint session, guint pt); /* action signals */ void (*clear_pt_map) (GstRtpBin *rtpbin); void (*reset_sync) (GstRtpBin *rtpbin); RTPSession* (*get_internal_session) (GstRtpBin *rtpbin, guint session_id); /* session manager signals */ void (*on_new_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_ssrc_collision) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_ssrc_validated) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_ssrc_active) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_ssrc_sdes) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_bye_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_bye_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_sender_timeout) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_npt_stop) (GstRtpBin *rtpbin, guint session, guint32 ssrc); }; GType gst_rtp_bin_get_type (void); #endif /* __GST_RTP_BIN_H__ */ gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpssrcdemux.h0000644000175000017500000000417411677341656020414 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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_RTP_SSRC_DEMUX_H__ #define __GST_RTP_SSRC_DEMUX_H__ #include #define GST_TYPE_RTP_SSRC_DEMUX (gst_rtp_ssrc_demux_get_type()) #define GST_RTP_SSRC_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SSRC_DEMUX,GstRtpSsrcDemux)) #define GST_RTP_SSRC_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SSRC_DEMUX,GstRtpSsrcDemuxClass)) #define GST_IS_RTP_SSRC_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SSRC_DEMUX)) #define GST_IS_RTP_SSRC_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SSRC_DEMUX)) typedef struct _GstRtpSsrcDemux GstRtpSsrcDemux; typedef struct _GstRtpSsrcDemuxClass GstRtpSsrcDemuxClass; typedef struct _GstRtpSsrcDemuxPad GstRtpSsrcDemuxPad; struct _GstRtpSsrcDemux { GstElement parent; GstSegment segment; GstPad *rtp_sink; GstPad *rtcp_sink; GStaticRecMutex padlock; GSList *srcpads; }; struct _GstRtpSsrcDemuxClass { GstElementClass parent_class; /* signals */ void (*new_ssrc_pad) (GstRtpSsrcDemux *demux, guint32 ssrc, GstPad *pad); void (*removed_ssrc_pad) (GstRtpSsrcDemux *demux, guint32 ssrc, GstPad *pad); /* actions */ void (*clear_ssrc) (GstRtpSsrcDemux *demux, guint32 ssrc); }; GType gst_rtp_ssrc_demux_get_type (void); #endif /* __GST_RTP_SSRC_DEMUX_H__ */ gst-plugins-good-0.10.31/gst/rtpmanager/rtpsource.h0000644000175000017500000002270611677341656017162 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 __RTP_SOURCE_H__ #define __RTP_SOURCE_H__ #include #include #include #include "rtpstats.h" /* the default number of consecutive RTP packets we need to receive before the * source is considered valid */ #define RTP_NO_PROBATION 0 #define RTP_DEFAULT_PROBATION 2 #define RTP_SEQ_MOD (1 << 16) typedef struct _RTPSource RTPSource; typedef struct _RTPSourceClass RTPSourceClass; #define RTP_TYPE_SOURCE (rtp_source_get_type()) #define RTP_SOURCE(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_SOURCE,RTPSource)) #define RTP_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SOURCE,RTPSourceClass)) #define RTP_IS_SOURCE(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_SOURCE)) #define RTP_IS_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SOURCE)) #define RTP_SOURCE_CAST(src) ((RTPSource *)(src)) /** * RTP_SOURCE_IS_ACTIVE: * @src: an #RTPSource * * Check if @src is active. A source is active when it has been validated * and has not yet received a BYE packet. */ #define RTP_SOURCE_IS_ACTIVE(src) (src->validated && !src->received_bye) /** * RTP_SOURCE_IS_SENDER: * @src: an #RTPSource * * Check if @src is a sender. */ #define RTP_SOURCE_IS_SENDER(src) (src->is_sender) /** * RTPSourcePushRTP: * @src: an #RTPSource * @buffer: the RTP buffer ready for processing * @user_data: user data specified when registering * * This callback will be called when @src has @buffer ready for further * processing. * * Returns: a #GstFlowReturn. */ typedef GstFlowReturn (*RTPSourcePushRTP) (RTPSource *src, GstBuffer *buffer, gpointer user_data); /** * RTPSourceClockRate: * @src: an #RTPSource * @payload: a payload type * @user_data: user data specified when registering * * This callback will be called when @src needs the clock-rate of the * @payload. * * Returns: a clock-rate for @payload. */ typedef gint (*RTPSourceClockRate) (RTPSource *src, guint8 payload, gpointer user_data); /** * RTPSourceCallbacks: * @push_rtp: a packet becomes available for handling * @clock_rate: a clock-rate is requested * @get_time: the current clock time is requested * * Callbacks performed by #RTPSource when actions need to be performed. */ typedef struct { RTPSourcePushRTP push_rtp; RTPSourceClockRate clock_rate; } RTPSourceCallbacks; /** * RTPConflictingAddress: * @address: #GstNetAddress which conflicted * @last_conflict_time: time when the last conflict was seen * * This structure is used to account for addresses that have conflicted to find * loops. */ typedef struct { GstNetAddress address; GstClockTime time; } RTPConflictingAddress; /** * RTPSource: * * A source in the #RTPSession * * @conflicting_addresses: GList of conflicting addresses */ struct _RTPSource { GObject object; /*< private >*/ guint32 ssrc; gint probation; gboolean validated; gboolean internal; gboolean is_csrc; gboolean is_sender; gboolean closing; GstStructure *sdes; gboolean received_bye; gchar *bye_reason; gboolean have_rtp_from; GstNetAddress rtp_from; gboolean have_rtcp_from; GstNetAddress rtcp_from; gint payload; GstCaps *caps; gint clock_rate; gint32 seqnum_base; GstClockTime bye_time; GstClockTime last_activity; GstClockTime last_rtp_activity; GstClockTime last_rtime; GstClockTime last_rtptime; /* for bitrate estimation */ guint64 bitrate; GstClockTime prev_rtime; guint64 bytes_sent; guint64 bytes_received; GQueue *packets; RTPSourceCallbacks callbacks; gpointer user_data; RTPSourceStats stats; RTPReceiverReport last_rr; GList *conflicting_addresses; GQueue *retained_feedback; gboolean send_pli; gboolean send_fir; guint8 current_send_fir_seqnum; gint last_fir_count; }; struct _RTPSourceClass { GObjectClass parent_class; }; GType rtp_source_get_type (void); /* managing lifetime of sources */ RTPSource* rtp_source_new (guint32 ssrc); void rtp_source_set_callbacks (RTPSource *src, RTPSourceCallbacks *cb, gpointer data); /* properties */ guint32 rtp_source_get_ssrc (RTPSource *src); void rtp_source_set_as_csrc (RTPSource *src); gboolean rtp_source_is_as_csrc (RTPSource *src); gboolean rtp_source_is_active (RTPSource *src); gboolean rtp_source_is_validated (RTPSource *src); gboolean rtp_source_is_sender (RTPSource *src); gboolean rtp_source_received_bye (RTPSource *src); gchar * rtp_source_get_bye_reason (RTPSource *src); void rtp_source_update_caps (RTPSource *src, GstCaps *caps); /* SDES info */ gboolean rtp_source_set_sdes_string (RTPSource *src, GstRTCPSDESType type, const gchar *data); gchar* rtp_source_get_sdes_string (RTPSource *src, GstRTCPSDESType type); const GstStructure * rtp_source_get_sdes_struct (RTPSource * src); gboolean rtp_source_set_sdes_struct (RTPSource * src, GstStructure *sdes); /* handling network address */ void rtp_source_set_rtp_from (RTPSource *src, GstNetAddress *address); void rtp_source_set_rtcp_from (RTPSource *src, GstNetAddress *address); /* handling RTP */ GstFlowReturn rtp_source_process_rtp (RTPSource *src, GstBuffer *buffer, RTPArrivalStats *arrival); GstFlowReturn rtp_source_send_rtp (RTPSource *src, gpointer data, gboolean is_list, GstClockTime running_time); /* RTCP messages */ void rtp_source_process_bye (RTPSource *src, const gchar *reason); void rtp_source_process_sr (RTPSource *src, GstClockTime time, guint64 ntptime, guint32 rtptime, guint32 packet_count, guint32 octet_count); void rtp_source_process_rb (RTPSource *src, guint64 ntpnstime, guint8 fractionlost, gint32 packetslost, guint32 exthighestseq, guint32 jitter, guint32 lsr, guint32 dlsr); gboolean rtp_source_get_new_sr (RTPSource *src, guint64 ntpnstime, GstClockTime running_time, guint64 *ntptime, guint32 *rtptime, guint32 *packet_count, guint32 *octet_count); gboolean rtp_source_get_new_rb (RTPSource *src, GstClockTime time, guint8 *fractionlost, gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter, guint32 *lsr, guint32 *dlsr); gboolean rtp_source_get_last_sr (RTPSource *src, GstClockTime *time, guint64 *ntptime, guint32 *rtptime, guint32 *packet_count, guint32 *octet_count); gboolean rtp_source_get_last_rb (RTPSource *src, guint8 *fractionlost, gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter, guint32 *lsr, guint32 *dlsr, guint32 *round_trip); void rtp_source_reset (RTPSource * src); gboolean rtp_source_find_conflicting_address (RTPSource * src, GstNetAddress *address, GstClockTime time); void rtp_source_add_conflicting_address (RTPSource * src, GstNetAddress *address, GstClockTime time); void rtp_source_timeout (RTPSource * src, GstClockTime current_time, GstClockTime collision_timeout, GstClockTime feedback_retention_window); void rtp_source_retain_rtcp_packet (RTPSource * src, GstRTCPPacket *pkt, GstClockTime running_time); gboolean rtp_source_has_retained (RTPSource * src, GCompareFunc func, gconstpointer data); #endif /* __RTP_SOURCE_H__ */ gst-plugins-good-0.10.31/gst/rtpmanager/rtpsession.c0000644000175000017500000031120711710031413017304 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include #include #include #include "gstrtpbin-marshal.h" #include "rtpsession.h" GST_DEBUG_CATEGORY_STATIC (rtp_session_debug); #define GST_CAT_DEFAULT rtp_session_debug /* signals and args */ enum { SIGNAL_GET_SOURCE_BY_SSRC, SIGNAL_ON_NEW_SSRC, SIGNAL_ON_SSRC_COLLISION, SIGNAL_ON_SSRC_VALIDATED, SIGNAL_ON_SSRC_ACTIVE, SIGNAL_ON_SSRC_SDES, SIGNAL_ON_BYE_SSRC, SIGNAL_ON_BYE_TIMEOUT, SIGNAL_ON_TIMEOUT, SIGNAL_ON_SENDER_TIMEOUT, SIGNAL_ON_SENDING_RTCP, SIGNAL_ON_FEEDBACK_RTCP, SIGNAL_SEND_RTCP, LAST_SIGNAL }; #define DEFAULT_INTERNAL_SOURCE NULL #define DEFAULT_BANDWIDTH RTP_STATS_BANDWIDTH #define DEFAULT_RTCP_FRACTION (RTP_STATS_RTCP_FRACTION * RTP_STATS_BANDWIDTH) #define DEFAULT_RTCP_RR_BANDWIDTH -1 #define DEFAULT_RTCP_RS_BANDWIDTH -1 #define DEFAULT_RTCP_MTU 1400 #define DEFAULT_SDES NULL #define DEFAULT_NUM_SOURCES 0 #define DEFAULT_NUM_ACTIVE_SOURCES 0 #define DEFAULT_SOURCES NULL #define DEFAULT_RTCP_MIN_INTERVAL (RTP_STATS_MIN_INTERVAL * GST_SECOND) #define DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW (2 * GST_SECOND) #define DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD (3) enum { PROP_0, PROP_INTERNAL_SSRC, PROP_INTERNAL_SOURCE, PROP_BANDWIDTH, PROP_RTCP_FRACTION, PROP_RTCP_RR_BANDWIDTH, PROP_RTCP_RS_BANDWIDTH, PROP_RTCP_MTU, PROP_SDES, PROP_NUM_SOURCES, PROP_NUM_ACTIVE_SOURCES, PROP_SOURCES, PROP_FAVOR_NEW, PROP_RTCP_MIN_INTERVAL, PROP_RTCP_FEEDBACK_RETENTION_WINDOW, PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, PROP_LAST }; /* update average packet size */ #define INIT_AVG(avg, val) \ (avg) = (val); #define UPDATE_AVG(avg, val) \ if ((avg) == 0) \ (avg) = (val); \ else \ (avg) = ((val) + (15 * (avg))) >> 4; /* The number RTCP intervals after which to timeout entries in the * collision table */ #define RTCP_INTERVAL_COLLISION_TIMEOUT 10 /* GObject vmethods */ static void rtp_session_finalize (GObject * object); static void rtp_session_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void rtp_session_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean rtp_session_on_sending_rtcp (RTPSession * sess, GstBuffer * buffer, gboolean early); static void rtp_session_send_rtcp (RTPSession * sess, GstClockTimeDiff max_delay); static guint rtp_session_signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (RTPSession, rtp_session, G_TYPE_OBJECT); static RTPSource *obtain_source (RTPSession * sess, guint32 ssrc, gboolean * created, RTPArrivalStats * arrival, gboolean rtp); static GstFlowReturn rtp_session_schedule_bye_locked (RTPSession * sess, const gchar * reason, GstClockTime current_time); static GstClockTime calculate_rtcp_interval (RTPSession * sess, gboolean deterministic, gboolean first); static gboolean accumulate_trues (GSignalInvocationHint * ihint, GValue * return_accu, const GValue * handler_return, gpointer data) { if (g_value_get_boolean (handler_return)) g_value_set_boolean (return_accu, TRUE); return TRUE; } static void gst_rtp_bin_marshal_BOOLEAN__MINIOBJECT_BOOLEAN (GClosure * closure, GValue * return_value G_GNUC_UNUSED, guint n_param_values, const GValue * param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__MINIOBJECT_BOOLEAN) (gpointer data1, gpointer arg_1, gboolean arg_2, gpointer data2); register GMarshalFunc_BOOLEAN__MINIOBJECT_BOOLEAN callback; register GCClosure *cc = (GCClosure *) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__MINIOBJECT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, gst_value_get_mini_object (param_values + 1), g_value_get_boolean (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } static void gst_rtp_bin_marshal_VOID__UINT_UINT_UINT_UINT_MINIOBJECT (GClosure * closure, GValue * return_value G_GNUC_UNUSED, guint n_param_values, const GValue * param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_MINIOBJECT) (gpointer data1, guint arg_1, guint arg_2, guint arg_3, guint arg_4, gpointer arg_5, gpointer data2); register GMarshalFunc_VOID__UINT_UINT_UINT_UINT_MINIOBJECT callback; register GCClosure *cc = (GCClosure *) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 6); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_MINIOBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_value_get_uint (param_values + 1), g_value_get_uint (param_values + 2), g_value_get_uint (param_values + 3), g_value_get_uint (param_values + 4), gst_value_get_mini_object (param_values + 5), data2); } static void rtp_session_class_init (RTPSessionClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->finalize = rtp_session_finalize; gobject_class->set_property = rtp_session_set_property; gobject_class->get_property = rtp_session_get_property; /** * RTPSession::get-source-by-ssrc: * @session: the object which received the signal * @ssrc: the SSRC of the RTPSource * * Request the #RTPSource object with SSRC @ssrc in @session. */ rtp_session_signals[SIGNAL_GET_SOURCE_BY_SSRC] = g_signal_new ("get-source-by-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (RTPSessionClass, get_source_by_ssrc), NULL, NULL, gst_rtp_bin_marshal_OBJECT__UINT, RTP_TYPE_SOURCE, 1, G_TYPE_UINT); /** * RTPSession::on-new-ssrc: * @session: the object which received the signal * @src: the new RTPSource * * Notify of a new SSRC that entered @session. */ rtp_session_signals[SIGNAL_ON_NEW_SSRC] = g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_new_ssrc), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-ssrc-collision: * @session: the object which received the signal * @src: the #RTPSource that caused a collision * * Notify when we have an SSRC collision */ rtp_session_signals[SIGNAL_ON_SSRC_COLLISION] = g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_collision), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-ssrc-validated: * @session: the object which received the signal * @src: the new validated RTPSource * * Notify of a new SSRC that became validated. */ rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED] = g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_validated), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-ssrc-active: * @session: the object which received the signal * @src: the active RTPSource * * Notify of a SSRC that is active, i.e., sending RTCP. */ rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE] = g_signal_new ("on-ssrc-active", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_active), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-ssrc-sdes: * @session: the object which received the signal * @src: the RTPSource * * Notify that a new SDES was received for SSRC. */ rtp_session_signals[SIGNAL_ON_SSRC_SDES] = g_signal_new ("on-ssrc-sdes", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_ssrc_sdes), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-bye-ssrc: * @session: the object which received the signal * @src: the RTPSource that went away * * Notify of an SSRC that became inactive because of a BYE packet. */ rtp_session_signals[SIGNAL_ON_BYE_SSRC] = g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_bye_ssrc), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-bye-timeout: * @session: the object which received the signal * @src: the RTPSource that timed out * * Notify of an SSRC that has timed out because of BYE */ rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT] = g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_bye_timeout), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-timeout: * @session: the object which received the signal * @src: the RTPSource that timed out * * Notify of an SSRC that has timed out */ rtp_session_signals[SIGNAL_ON_TIMEOUT] = g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_timeout), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-sender-timeout: * @session: the object which received the signal * @src: the RTPSource that timed out * * Notify of an SSRC that was a sender but timed out and became a receiver. */ rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT] = g_signal_new ("on-sender-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_sender_timeout), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, RTP_TYPE_SOURCE); /** * RTPSession::on-sending-rtcp * @session: the object which received the signal * @buffer: the #GstBuffer containing the RTCP packet about to be sent * @early: %TRUE if the packet is early, %FALSE if it is regular * * This signal is emitted before sending an RTCP packet, it can be used * to add extra RTCP Packets. * * Returns: %TRUE if the RTCP buffer should NOT be suppressed, %FALSE * if suppressing it is acceptable */ rtp_session_signals[SIGNAL_ON_SENDING_RTCP] = g_signal_new ("on-sending-rtcp", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_sending_rtcp), accumulate_trues, NULL, gst_rtp_bin_marshal_BOOLEAN__MINIOBJECT_BOOLEAN, G_TYPE_BOOLEAN, 2, GST_TYPE_BUFFER, G_TYPE_BOOLEAN); /** * RTPSession::on-feedback-rtcp: * @session: the object which received the signal * @type: Type of RTCP packet, will be %GST_RTCP_TYPE_RTPFB or * %GST_RTCP_TYPE_RTPFB * @fbtype: The type of RTCP FB packet, probably part of #GstRTCPFBType * @sender_ssrc: The SSRC of the sender * @media_ssrc: The SSRC of the media this refers to * @fci: a #GstBuffer with the FCI data from the FB packet or %NULL if * there was no FCI * * Notify that a RTCP feedback packet has been received */ rtp_session_signals[SIGNAL_ON_FEEDBACK_RTCP] = g_signal_new ("on-feedback-rtcp", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (RTPSessionClass, on_feedback_rtcp), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT_UINT_UINT_MINIOBJECT, G_TYPE_NONE, 5, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, GST_TYPE_BUFFER); /** * RTPSession::send-rtcp: * @session: the object which received the signal * @max_delay: The maximum delay after which the feedback will not be useful * anymore * * Requests that the #RTPSession initiate a new RTCP packet as soon as * possible within the requested delay. */ rtp_session_signals[SIGNAL_SEND_RTCP] = g_signal_new ("send-rtcp", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (RTPSessionClass, send_rtcp), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); g_object_class_install_property (gobject_class, PROP_INTERNAL_SSRC, g_param_spec_uint ("internal-ssrc", "Internal SSRC", "The internal SSRC used for the session", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_INTERNAL_SOURCE, g_param_spec_object ("internal-source", "Internal Source", "The internal source element of the session", RTP_TYPE_SOURCE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_BANDWIDTH, g_param_spec_double ("bandwidth", "Bandwidth", "The bandwidth of the session (0 for auto-discover)", 0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_FRACTION, g_param_spec_double ("rtcp-fraction", "RTCP Fraction", "The fraction of the bandwidth used for RTCP (or as a real fraction of the RTP bandwidth if < 1)", 0.0, G_MAXDOUBLE, DEFAULT_RTCP_FRACTION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_RR_BANDWIDTH, g_param_spec_int ("rtcp-rr-bandwidth", "RTCP RR bandwidth", "The RTCP bandwidth used for receivers in bytes per second (-1 = default)", -1, G_MAXINT, DEFAULT_RTCP_RR_BANDWIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_RS_BANDWIDTH, g_param_spec_int ("rtcp-rs-bandwidth", "RTCP RS bandwidth", "The RTCP bandwidth used for senders in bytes per second (-1 = default)", -1, G_MAXINT, DEFAULT_RTCP_RS_BANDWIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_MTU, g_param_spec_uint ("rtcp-mtu", "RTCP MTU", "The maximum size of the RTCP packets", 16, G_MAXINT16, DEFAULT_RTCP_MTU, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_SDES, g_param_spec_boxed ("sdes", "SDES", "The SDES items of this session", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NUM_SOURCES, g_param_spec_uint ("num-sources", "Num Sources", "The number of sources in the session", 0, G_MAXUINT, DEFAULT_NUM_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NUM_ACTIVE_SOURCES, g_param_spec_uint ("num-active-sources", "Num Active Sources", "The number of active sources in the session", 0, G_MAXUINT, DEFAULT_NUM_ACTIVE_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * RTPSource::sources * * Get a GValue Array of all sources in the session. * * * Getting the #RTPSources of a session * <programlisting> * { * GValueArray *arr; * GValue *val; * guint i; * * g_object_get (sess, "sources", &arr, NULL); * * for (i = 0; i < arr->n_values; i++) { * RTPSource *source; * * val = g_value_array_get_nth (arr, i); * source = g_value_get_object (val); * } * g_value_array_free (arr); * } * </programlisting> * </example> */ g_object_class_install_property (gobject_class, PROP_SOURCES, g_param_spec_boxed ("sources", "Sources", "An array of all known sources in the session", G_TYPE_VALUE_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_FAVOR_NEW, g_param_spec_boolean ("favor-new", "Favor new sources", "Resolve SSRC conflict in favor of new sources", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_MIN_INTERVAL, g_param_spec_uint64 ("rtcp-min-interval", "Minimum RTCP interval", "Minimum interval between Regular RTCP packet (in ns)", 0, G_MAXUINT64, DEFAULT_RTCP_MIN_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_FEEDBACK_RETENTION_WINDOW, g_param_spec_uint64 ("rtcp-feedback-retention-window", "RTCP Feedback retention window", "Duration during which RTCP Feedback packets are retained (in ns)", 0, G_MAXUINT64, DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, g_param_spec_uint ("rtcp-immediate-feedback-threshold", "RTCP Immediate Feedback threshold", "The maximum number of members of a RTP session for which immediate" " feedback is used", 0, G_MAXUINT, DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); klass->get_source_by_ssrc = GST_DEBUG_FUNCPTR (rtp_session_get_source_by_ssrc); klass->on_sending_rtcp = GST_DEBUG_FUNCPTR (rtp_session_on_sending_rtcp); klass->send_rtcp = GST_DEBUG_FUNCPTR (rtp_session_send_rtcp); GST_DEBUG_CATEGORY_INIT (rtp_session_debug, "rtpsession", 0, "RTP Session"); } static void rtp_session_init (RTPSession * sess) { gint i; gchar *str; sess->lock = g_mutex_new (); sess->key = g_random_int (); sess->mask_idx = 0; sess->mask = 0; for (i = 0; i < 32; i++) { sess->ssrcs[i] = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref); } sess->cnames = g_hash_table_new_full (NULL, NULL, g_free, NULL); rtp_stats_init_defaults (&sess->stats); sess->recalc_bandwidth = TRUE; sess->bandwidth = DEFAULT_BANDWIDTH; sess->rtcp_bandwidth = DEFAULT_RTCP_FRACTION; sess->rtcp_rr_bandwidth = DEFAULT_RTCP_RR_BANDWIDTH; sess->rtcp_rs_bandwidth = DEFAULT_RTCP_RS_BANDWIDTH; /* create an active SSRC for this session manager */ sess->source = rtp_session_create_source (sess); sess->source->validated = TRUE; sess->source->internal = TRUE; sess->stats.active_sources++; INIT_AVG (sess->stats.avg_rtcp_packet_size, 100); sess->source->stats.prev_rtcptime = 0; sess->source->stats.last_rtcptime = 1; rtp_stats_set_min_interval (&sess->stats, (gdouble) DEFAULT_RTCP_MIN_INTERVAL / GST_SECOND); /* default UDP header length */ sess->header_len = 28; sess->mtu = DEFAULT_RTCP_MTU; /* some default SDES entries */ /* we do not want to leak details like the username or hostname here */ str = g_strdup_printf ("user%u@host-%x", g_random_int (), g_random_int ()); rtp_source_set_sdes_string (sess->source, GST_RTCP_SDES_CNAME, str); g_free (str); #if 0 /* we do not want to leak the user's real name here */ str = g_strdup_printf ("Anon%u", g_random_int ()); rtp_source_set_sdes_string (sess->source, GST_RTCP_SDES_NAME, str); g_free (str); #endif rtp_source_set_sdes_string (sess->source, GST_RTCP_SDES_TOOL, "GStreamer"); sess->first_rtcp = TRUE; sess->allow_early = TRUE; sess->rtcp_feedback_retention_window = DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW; sess->rtcp_immediate_feedback_threshold = DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD; sess->last_keyframe_request = GST_CLOCK_TIME_NONE; GST_DEBUG ("%p: session using SSRC: %08x", sess, sess->source->ssrc); } static void rtp_session_finalize (GObject * object) { RTPSession *sess; gint i; sess = RTP_SESSION_CAST (object); g_mutex_free (sess->lock); for (i = 0; i < 32; i++) g_hash_table_destroy (sess->ssrcs[i]); g_free (sess->bye_reason); g_hash_table_destroy (sess->cnames); g_object_unref (sess->source); G_OBJECT_CLASS (rtp_session_parent_class)->finalize (object); } static void copy_source (gpointer key, RTPSource * source, GValueArray * arr) { GValue value = { 0 }; g_value_init (&value, RTP_TYPE_SOURCE); g_value_take_object (&value, source); /* copies the value */ g_value_array_append (arr, &value); } static GValueArray * rtp_session_create_sources (RTPSession * sess) { GValueArray *res; guint size; RTP_SESSION_LOCK (sess); /* get number of elements in the table */ size = g_hash_table_size (sess->ssrcs[sess->mask_idx]); /* create the result value array */ res = g_value_array_new (size); /* and copy all values into the array */ g_hash_table_foreach (sess->ssrcs[sess->mask_idx], (GHFunc) copy_source, res); RTP_SESSION_UNLOCK (sess); return res; } static void rtp_session_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { RTPSession *sess; sess = RTP_SESSION (object); switch (prop_id) { case PROP_INTERNAL_SSRC: rtp_session_set_internal_ssrc (sess, g_value_get_uint (value)); break; case PROP_BANDWIDTH: sess->bandwidth = g_value_get_double (value); sess->recalc_bandwidth = TRUE; break; case PROP_RTCP_FRACTION: sess->rtcp_bandwidth = g_value_get_double (value); sess->recalc_bandwidth = TRUE; break; case PROP_RTCP_RR_BANDWIDTH: sess->rtcp_rr_bandwidth = g_value_get_int (value); sess->recalc_bandwidth = TRUE; break; case PROP_RTCP_RS_BANDWIDTH: sess->rtcp_rs_bandwidth = g_value_get_int (value); sess->recalc_bandwidth = TRUE; break; case PROP_RTCP_MTU: sess->mtu = g_value_get_uint (value); break; case PROP_SDES: rtp_session_set_sdes_struct (sess, g_value_get_boxed (value)); break; case PROP_FAVOR_NEW: sess->favor_new = g_value_get_boolean (value); break; case PROP_RTCP_MIN_INTERVAL: rtp_stats_set_min_interval (&sess->stats, (gdouble) g_value_get_uint64 (value) / GST_SECOND); /* trigger reconsideration */ RTP_SESSION_LOCK (sess); sess->next_rtcp_check_time = 0; RTP_SESSION_UNLOCK (sess); if (sess->callbacks.reconsider) sess->callbacks.reconsider (sess, sess->reconsider_user_data); break; case PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD: sess->rtcp_immediate_feedback_threshold = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void rtp_session_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { RTPSession *sess; sess = RTP_SESSION (object); switch (prop_id) { case PROP_INTERNAL_SSRC: g_value_set_uint (value, rtp_session_get_internal_ssrc (sess)); break; case PROP_INTERNAL_SOURCE: g_value_take_object (value, rtp_session_get_internal_source (sess)); break; case PROP_BANDWIDTH: g_value_set_double (value, sess->bandwidth); break; case PROP_RTCP_FRACTION: g_value_set_double (value, sess->rtcp_bandwidth); break; case PROP_RTCP_RR_BANDWIDTH: g_value_set_int (value, sess->rtcp_rr_bandwidth); break; case PROP_RTCP_RS_BANDWIDTH: g_value_set_int (value, sess->rtcp_rs_bandwidth); break; case PROP_RTCP_MTU: g_value_set_uint (value, sess->mtu); break; case PROP_SDES: g_value_take_boxed (value, rtp_session_get_sdes_struct (sess)); break; case PROP_NUM_SOURCES: g_value_set_uint (value, rtp_session_get_num_sources (sess)); break; case PROP_NUM_ACTIVE_SOURCES: g_value_set_uint (value, rtp_session_get_num_active_sources (sess)); break; case PROP_SOURCES: g_value_take_boxed (value, rtp_session_create_sources (sess)); break; case PROP_FAVOR_NEW: g_value_set_boolean (value, sess->favor_new); break; case PROP_RTCP_MIN_INTERVAL: g_value_set_uint64 (value, sess->stats.min_interval * GST_SECOND); break; case PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD: g_value_set_uint (value, sess->rtcp_immediate_feedback_threshold); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void on_new_ssrc (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_NEW_SSRC], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_ssrc_collision (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_COLLISION], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_ssrc_validated (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_VALIDATED], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_ssrc_active (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_ACTIVE], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_ssrc_sdes (RTPSession * sess, RTPSource * source) { g_object_ref (source); GST_DEBUG ("SDES changed for SSRC %08x", source->ssrc); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SSRC_SDES], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_bye_ssrc (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_BYE_SSRC], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_bye_timeout (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_BYE_TIMEOUT], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_timeout (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_TIMEOUT], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } static void on_sender_timeout (RTPSession * sess, RTPSource * source) { g_object_ref (source); RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SENDER_TIMEOUT], 0, source); RTP_SESSION_LOCK (sess); g_object_unref (source); } /** * rtp_session_new: * * Create a new session object. * * Returns: a new #RTPSession. g_object_unref() after usage. */ RTPSession * rtp_session_new (void) { RTPSession *sess; sess = g_object_new (RTP_TYPE_SESSION, NULL); return sess; } /** * rtp_session_set_callbacks: * @sess: an #RTPSession * @callbacks: callbacks to configure * @user_data: user data passed in the callbacks * * Configure a set of callbacks to be notified of actions. */ void rtp_session_set_callbacks (RTPSession * sess, RTPSessionCallbacks * callbacks, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); if (callbacks->process_rtp) { sess->callbacks.process_rtp = callbacks->process_rtp; sess->process_rtp_user_data = user_data; } if (callbacks->send_rtp) { sess->callbacks.send_rtp = callbacks->send_rtp; sess->send_rtp_user_data = user_data; } if (callbacks->send_rtcp) { sess->callbacks.send_rtcp = callbacks->send_rtcp; sess->send_rtcp_user_data = user_data; } if (callbacks->sync_rtcp) { sess->callbacks.sync_rtcp = callbacks->sync_rtcp; sess->sync_rtcp_user_data = user_data; } if (callbacks->clock_rate) { sess->callbacks.clock_rate = callbacks->clock_rate; sess->clock_rate_user_data = user_data; } if (callbacks->reconsider) { sess->callbacks.reconsider = callbacks->reconsider; sess->reconsider_user_data = user_data; } if (callbacks->request_key_unit) { sess->callbacks.request_key_unit = callbacks->request_key_unit; sess->request_key_unit_user_data = user_data; } if (callbacks->request_time) { sess->callbacks.request_time = callbacks->request_time; sess->request_time_user_data = user_data; } } /** * rtp_session_set_process_rtp_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the process_rtp callback to be notified of the process_rtp action. */ void rtp_session_set_process_rtp_callback (RTPSession * sess, RTPSessionProcessRTP callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.process_rtp = callback; sess->process_rtp_user_data = user_data; } /** * rtp_session_set_send_rtp_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the send_rtp callback to be notified of the send_rtp action. */ void rtp_session_set_send_rtp_callback (RTPSession * sess, RTPSessionSendRTP callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.send_rtp = callback; sess->send_rtp_user_data = user_data; } /** * rtp_session_set_send_rtcp_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the send_rtcp callback to be notified of the send_rtcp action. */ void rtp_session_set_send_rtcp_callback (RTPSession * sess, RTPSessionSendRTCP callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.send_rtcp = callback; sess->send_rtcp_user_data = user_data; } /** * rtp_session_set_sync_rtcp_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the sync_rtcp callback to be notified of the sync_rtcp action. */ void rtp_session_set_sync_rtcp_callback (RTPSession * sess, RTPSessionSyncRTCP callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.sync_rtcp = callback; sess->sync_rtcp_user_data = user_data; } /** * rtp_session_set_clock_rate_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the clock_rate callback to be notified of the clock_rate action. */ void rtp_session_set_clock_rate_callback (RTPSession * sess, RTPSessionClockRate callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.clock_rate = callback; sess->clock_rate_user_data = user_data; } /** * rtp_session_set_reconsider_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the reconsider callback to be notified of the reconsider action. */ void rtp_session_set_reconsider_callback (RTPSession * sess, RTPSessionReconsider callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.reconsider = callback; sess->reconsider_user_data = user_data; } /** * rtp_session_set_request_time_callback: * @sess: an #RTPSession * @callback: callback to set * @user_data: user data passed in the callback * * Configure only the request_time callback */ void rtp_session_set_request_time_callback (RTPSession * sess, RTPSessionRequestTime callback, gpointer user_data) { g_return_if_fail (RTP_IS_SESSION (sess)); sess->callbacks.request_time = callback; sess->request_time_user_data = user_data; } /** * rtp_session_set_bandwidth: * @sess: an #RTPSession * @bandwidth: the bandwidth allocated * * Set the session bandwidth in bytes per second. */ void rtp_session_set_bandwidth (RTPSession * sess, gdouble bandwidth) { g_return_if_fail (RTP_IS_SESSION (sess)); RTP_SESSION_LOCK (sess); sess->stats.bandwidth = bandwidth; RTP_SESSION_UNLOCK (sess); } /** * rtp_session_get_bandwidth: * @sess: an #RTPSession * * Get the session bandwidth. * * Returns: the session bandwidth. */ gdouble rtp_session_get_bandwidth (RTPSession * sess) { gdouble result; g_return_val_if_fail (RTP_IS_SESSION (sess), 0); RTP_SESSION_LOCK (sess); result = sess->stats.bandwidth; RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_set_rtcp_fraction: * @sess: an #RTPSession * @bandwidth: the RTCP bandwidth * * Set the bandwidth in bytes per second that should be used for RTCP * messages. */ void rtp_session_set_rtcp_fraction (RTPSession * sess, gdouble bandwidth) { g_return_if_fail (RTP_IS_SESSION (sess)); RTP_SESSION_LOCK (sess); sess->stats.rtcp_bandwidth = bandwidth; RTP_SESSION_UNLOCK (sess); } /** * rtp_session_get_rtcp_fraction: * @sess: an #RTPSession * * Get the session bandwidth used for RTCP. * * Returns: The bandwidth used for RTCP messages. */ gdouble rtp_session_get_rtcp_fraction (RTPSession * sess) { gdouble result; g_return_val_if_fail (RTP_IS_SESSION (sess), 0.0); RTP_SESSION_LOCK (sess); result = sess->stats.rtcp_bandwidth; RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_set_sdes_string: * @sess: an #RTPSession * @type: the type of the SDES item * @item: a null-terminated string to set. * * Store an SDES item of @type in @sess. * * Returns: %FALSE if the data was unchanged @type is invalid. */ gboolean rtp_session_set_sdes_string (RTPSession * sess, GstRTCPSDESType type, const gchar * item) { gboolean result; g_return_val_if_fail (RTP_IS_SESSION (sess), FALSE); RTP_SESSION_LOCK (sess); result = rtp_source_set_sdes_string (sess->source, type, item); RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_get_sdes_string: * @sess: an #RTPSession * @type: the type of the SDES item * * Get the SDES item of @type from @sess. * * Returns: a null-terminated copy of the SDES item or NULL when @type was not * valid. g_free() after usage. */ gchar * rtp_session_get_sdes_string (RTPSession * sess, GstRTCPSDESType type) { gchar *result; g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); RTP_SESSION_LOCK (sess); result = rtp_source_get_sdes_string (sess->source, type); RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_get_sdes_struct: * @sess: an #RTSPSession * * Get the SDES data as a #GstStructure * * Returns: a GstStructure with SDES items for @sess. This function returns a * copy of the SDES structure, use gst_structure_free() after usage. */ GstStructure * rtp_session_get_sdes_struct (RTPSession * sess) { const GstStructure *sdes; GstStructure *result = NULL; g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); RTP_SESSION_LOCK (sess); sdes = rtp_source_get_sdes_struct (sess->source); if (sdes) result = gst_structure_copy (sdes); RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_set_sdes_struct: * @sess: an #RTSPSession * @sdes: a #GstStructure * * Set the SDES data as a #GstStructure. This function makes a copy of @sdes. */ void rtp_session_set_sdes_struct (RTPSession * sess, const GstStructure * sdes) { g_return_if_fail (sdes); g_return_if_fail (RTP_IS_SESSION (sess)); RTP_SESSION_LOCK (sess); rtp_source_set_sdes_struct (sess->source, gst_structure_copy (sdes)); RTP_SESSION_UNLOCK (sess); } static GstFlowReturn source_push_rtp (RTPSource * source, gpointer data, RTPSession * session) { GstFlowReturn result = GST_FLOW_OK; if (source == session->source) { GST_LOG ("source %08x pushed sender RTP packet", source->ssrc); RTP_SESSION_UNLOCK (session); if (session->callbacks.send_rtp) result = session->callbacks.send_rtp (session, source, data, session->send_rtp_user_data); else { gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); } } else { GST_LOG ("source %08x pushed receiver RTP packet", source->ssrc); RTP_SESSION_UNLOCK (session); if (session->callbacks.process_rtp) result = session->callbacks.process_rtp (session, source, GST_BUFFER_CAST (data), session->process_rtp_user_data); else gst_buffer_unref (GST_BUFFER_CAST (data)); } RTP_SESSION_LOCK (session); return result; } static gint source_clock_rate (RTPSource * source, guint8 pt, RTPSession * session) { gint result; RTP_SESSION_UNLOCK (session); if (session->callbacks.clock_rate) result = session->callbacks.clock_rate (session, pt, session->clock_rate_user_data); else result = -1; RTP_SESSION_LOCK (session); GST_DEBUG ("got clock-rate %d for pt %d", result, pt); return result; } static RTPSourceCallbacks callbacks = { (RTPSourcePushRTP) source_push_rtp, (RTPSourceClockRate) source_clock_rate, }; static gboolean check_collision (RTPSession * sess, RTPSource * source, RTPArrivalStats * arrival, gboolean rtp) { /* If we have no arrival address, we can't do collision checking */ if (!arrival->have_address) return FALSE; if (sess->source != source) { GstNetAddress *from; gboolean have_from; /* This is not our local source, but lets check if two remote * source collide */ if (rtp) { from = &source->rtp_from; have_from = source->have_rtp_from; } else { from = &source->rtcp_from; have_from = source->have_rtcp_from; } if (have_from) { if (gst_netaddress_equal (from, &arrival->address)) { /* Address is the same */ return FALSE; } else { GST_LOG ("we have a third-party collision or loop ssrc:%x", rtp_source_get_ssrc (source)); if (sess->favor_new) { if (rtp_source_find_conflicting_address (source, &arrival->address, arrival->current_time)) { gchar buf1[40]; gst_netaddress_to_string (&arrival->address, buf1, 40); GST_LOG ("Known conflict on %x for %s, dropping packet", rtp_source_get_ssrc (source), buf1); return TRUE; } else { gchar buf1[40], buf2[40]; /* Current address is not a known conflict, lets assume this is * a new source. Save old address in possible conflict list */ rtp_source_add_conflicting_address (source, from, arrival->current_time); gst_netaddress_to_string (from, buf1, 40); gst_netaddress_to_string (&arrival->address, buf2, 40); GST_DEBUG ("New conflict for ssrc %x, replacing %s with %s," " saving old as known conflict", rtp_source_get_ssrc (source), buf1, buf2); if (rtp) rtp_source_set_rtp_from (source, &arrival->address); else rtp_source_set_rtcp_from (source, &arrival->address); return FALSE; } } else { /* Don't need to save old addresses, we ignore new sources */ return TRUE; } } } else { /* We don't already have a from address for RTP, just set it */ if (rtp) rtp_source_set_rtp_from (source, &arrival->address); else rtp_source_set_rtcp_from (source, &arrival->address); return FALSE; } /* FIXME: Log 3rd party collision somehow * Maybe should be done in upper layer, only the SDES can tell us * if its a collision or a loop */ /* If the source has been inactive for some time, we assume that it has * simply changed its transport source address. Hence, there is no true * third-party collision - only a simulated one. */ if (arrival->current_time > source->last_activity) { GstClockTime inactivity_period = arrival->current_time - source->last_activity; if (inactivity_period > 1 * GST_SECOND) { /* Use new network address */ if (rtp) { g_assert (source->have_rtp_from); rtp_source_set_rtp_from (source, &arrival->address); } else { g_assert (source->have_rtcp_from); rtp_source_set_rtcp_from (source, &arrival->address); } return FALSE; } } } else { /* This is sending with our ssrc, is it an address we already know */ if (rtp_source_find_conflicting_address (source, &arrival->address, arrival->current_time)) { /* Its a known conflict, its probably a loop, not a collision * lets just drop the incoming packet */ GST_DEBUG ("Our packets are being looped back to us, dropping"); } else { /* Its a new collision, lets change our SSRC */ rtp_source_add_conflicting_address (source, &arrival->address, arrival->current_time); GST_DEBUG ("Collision for SSRC %x", rtp_source_get_ssrc (source)); on_ssrc_collision (sess, source); rtp_session_schedule_bye_locked (sess, "SSRC Collision", arrival->current_time); sess->change_ssrc = TRUE; } } return TRUE; } /* must be called with the session lock, the returned source needs to be * unreffed after usage. */ static RTPSource * obtain_source (RTPSession * sess, guint32 ssrc, gboolean * created, RTPArrivalStats * arrival, gboolean rtp) { RTPSource *source; source = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc)); if (source == NULL) { /* make new Source in probation and insert */ source = rtp_source_new (ssrc); /* for RTP packets we need to set the source in probation. Receiving RTCP * packets of an SSRC, on the other hand, is a strong indication that we * are dealing with a valid source. */ if (rtp) source->probation = RTP_DEFAULT_PROBATION; else source->probation = 0; /* store from address, if any */ if (arrival->have_address) { if (rtp) rtp_source_set_rtp_from (source, &arrival->address); else rtp_source_set_rtcp_from (source, &arrival->address); } /* configure a callback on the source */ rtp_source_set_callbacks (source, &callbacks, sess); g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc), source); /* we have one more source now */ sess->total_sources++; *created = TRUE; } else { *created = FALSE; /* check for collision, this updates the address when not previously set */ if (check_collision (sess, source, arrival, rtp)) { return NULL; } } /* update last activity */ source->last_activity = arrival->current_time; if (rtp) source->last_rtp_activity = arrival->current_time; g_object_ref (source); return source; } /** * rtp_session_get_internal_source: * @sess: a #RTPSession * * Get the internal #RTPSource of @sess. * * Returns: The internal #RTPSource. g_object_unref() after usage. */ RTPSource * rtp_session_get_internal_source (RTPSession * sess) { RTPSource *result; g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); result = g_object_ref (sess->source); return result; } /** * rtp_session_set_internal_ssrc: * @sess: a #RTPSession * @ssrc: an SSRC * * Set the SSRC of @sess to @ssrc. */ void rtp_session_set_internal_ssrc (RTPSession * sess, guint32 ssrc) { RTP_SESSION_LOCK (sess); if (ssrc != sess->source->ssrc) { g_hash_table_steal (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (sess->source->ssrc)); GST_DEBUG ("setting internal SSRC to %08x", ssrc); /* After this call, any receiver of the old SSRC either in RTP or RTCP * packets will timeout on the old SSRC, we could potentially schedule a * BYE RTCP for the old SSRC... */ sess->source->ssrc = ssrc; rtp_source_reset (sess->source); /* rehash with the new SSRC */ g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (sess->source->ssrc), sess->source); } RTP_SESSION_UNLOCK (sess); g_object_notify (G_OBJECT (sess), "internal-ssrc"); } /** * rtp_session_get_internal_ssrc: * @sess: a #RTPSession * * Get the internal SSRC of @sess. * * Returns: The SSRC of the session. */ guint32 rtp_session_get_internal_ssrc (RTPSession * sess) { guint32 ssrc; RTP_SESSION_LOCK (sess); ssrc = sess->source->ssrc; RTP_SESSION_UNLOCK (sess); return ssrc; } /** * rtp_session_add_source: * @sess: a #RTPSession * @src: #RTPSource to add * * Add @src to @session. * * Returns: %TRUE on success, %FALSE if a source with the same SSRC already * existed in the session. */ gboolean rtp_session_add_source (RTPSession * sess, RTPSource * src) { gboolean result = FALSE; RTPSource *find; g_return_val_if_fail (RTP_IS_SESSION (sess), FALSE); g_return_val_if_fail (src != NULL, FALSE); RTP_SESSION_LOCK (sess); find = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (src->ssrc)); if (find == NULL) { g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (src->ssrc), src); /* we have one more source now */ sess->total_sources++; result = TRUE; } RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_get_num_sources: * @sess: an #RTPSession * * Get the number of sources in @sess. * * Returns: The number of sources in @sess. */ guint rtp_session_get_num_sources (RTPSession * sess) { guint result; g_return_val_if_fail (RTP_IS_SESSION (sess), FALSE); RTP_SESSION_LOCK (sess); result = sess->total_sources; RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_get_num_active_sources: * @sess: an #RTPSession * * Get the number of active sources in @sess. A source is considered active when * it has been validated and has not yet received a BYE RTCP message. * * Returns: The number of active sources in @sess. */ guint rtp_session_get_num_active_sources (RTPSession * sess) { guint result; g_return_val_if_fail (RTP_IS_SESSION (sess), 0); RTP_SESSION_LOCK (sess); result = sess->stats.active_sources; RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_get_source_by_ssrc: * @sess: an #RTPSession * @ssrc: an SSRC * * Find the source with @ssrc in @sess. * * Returns: a #RTPSource with SSRC @ssrc or NULL if the source was not found. * g_object_unref() after usage. */ RTPSource * rtp_session_get_source_by_ssrc (RTPSession * sess, guint32 ssrc) { RTPSource *result; g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); RTP_SESSION_LOCK (sess); result = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc)); if (result) g_object_ref (result); RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_get_source_by_cname: * @sess: a #RTPSession * @cname: an CNAME * * Find the source with @cname in @sess. * * Returns: a #RTPSource with CNAME @cname or NULL if the source was not found. * g_object_unref() after usage. */ RTPSource * rtp_session_get_source_by_cname (RTPSession * sess, const gchar * cname) { RTPSource *result; g_return_val_if_fail (RTP_IS_SESSION (sess), NULL); g_return_val_if_fail (cname != NULL, NULL); RTP_SESSION_LOCK (sess); result = g_hash_table_lookup (sess->cnames, cname); if (result) g_object_ref (result); RTP_SESSION_UNLOCK (sess); return result; } /* should be called with the SESSION lock */ static guint32 rtp_session_create_new_ssrc (RTPSession * sess) { guint32 ssrc; while (TRUE) { ssrc = g_random_int (); /* see if it exists in the session, we're done if it doesn't */ if (g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc)) == NULL) break; } return ssrc; } /** * rtp_session_create_source: * @sess: an #RTPSession * * Create an #RTPSource for use in @sess. This function will create a source * with an ssrc that is currently not used by any participants in the session. * * Returns: an #RTPSource. */ RTPSource * rtp_session_create_source (RTPSession * sess) { guint32 ssrc; RTPSource *source; RTP_SESSION_LOCK (sess); ssrc = rtp_session_create_new_ssrc (sess); source = rtp_source_new (ssrc); rtp_source_set_callbacks (source, &callbacks, sess); /* we need an additional ref for the source in the hashtable */ g_object_ref (source); g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (ssrc), source); /* we have one more source now */ sess->total_sources++; RTP_SESSION_UNLOCK (sess); return source; } /* update the RTPArrivalStats structure with the current time and other bits * about the current buffer we are handling. * This function is typically called when a validated packet is received. * This function should be called with the SESSION_LOCK */ static void update_arrival_stats (RTPSession * sess, RTPArrivalStats * arrival, gboolean rtp, GstBuffer * buffer, GstClockTime current_time, GstClockTime running_time, guint64 ntpnstime) { /* get time of arrival */ arrival->current_time = current_time; arrival->running_time = running_time; arrival->ntpnstime = ntpnstime; /* get packet size including header overhead */ arrival->bytes = GST_BUFFER_SIZE (buffer) + sess->header_len; if (rtp) { arrival->payload_len = gst_rtp_buffer_get_payload_len (buffer); } else { arrival->payload_len = 0; } /* for netbuffer we can store the IP address to check for collisions */ arrival->have_address = GST_IS_NETBUFFER (buffer); if (arrival->have_address) { GstNetBuffer *netbuf = (GstNetBuffer *) buffer; memcpy (&arrival->address, &netbuf->from, sizeof (GstNetAddress)); } } /** * rtp_session_process_rtp: * @sess: and #RTPSession * @buffer: an RTP buffer * @current_time: the current system time * @running_time: the running_time of @buffer * * Process an RTP buffer in the session manager. This function takes ownership * of @buffer. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_session_process_rtp (RTPSession * sess, GstBuffer * buffer, GstClockTime current_time, GstClockTime running_time) { GstFlowReturn result; guint32 ssrc; RTPSource *source; gboolean created; gboolean prevsender, prevactive; RTPArrivalStats arrival; guint32 csrcs[16]; guint8 i, count; guint64 oldrate; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); if (!gst_rtp_buffer_validate (buffer)) goto invalid_packet; RTP_SESSION_LOCK (sess); /* update arrival stats */ update_arrival_stats (sess, &arrival, TRUE, buffer, current_time, running_time, -1); /* ignore more RTP packets when we left the session */ if (sess->source->received_bye) goto ignore; /* get SSRC and look up in session database */ ssrc = gst_rtp_buffer_get_ssrc (buffer); source = obtain_source (sess, ssrc, &created, &arrival, TRUE); if (!source) goto collision; prevsender = RTP_SOURCE_IS_SENDER (source); prevactive = RTP_SOURCE_IS_ACTIVE (source); oldrate = source->bitrate; /* copy available csrc for later */ count = gst_rtp_buffer_get_csrc_count (buffer); /* make sure to not overflow our array. An RTP buffer can maximally contain * 16 CSRCs */ count = MIN (count, 16); for (i = 0; i < count; i++) csrcs[i] = gst_rtp_buffer_get_csrc (buffer, i); /* let source process the packet */ result = rtp_source_process_rtp (source, buffer, &arrival); /* source became active */ if (prevactive != RTP_SOURCE_IS_ACTIVE (source)) { sess->stats.active_sources++; GST_DEBUG ("source: %08x became active, %d active sources", ssrc, sess->stats.active_sources); on_ssrc_validated (sess, source); } if (prevsender != RTP_SOURCE_IS_SENDER (source)) { sess->stats.sender_sources++; GST_DEBUG ("source: %08x became sender, %d sender sources", ssrc, sess->stats.sender_sources); } if (oldrate != source->bitrate) sess->recalc_bandwidth = TRUE; if (created) on_new_ssrc (sess, source); if (source->validated) { gboolean created; /* for validated sources, we add the CSRCs as well */ for (i = 0; i < count; i++) { guint32 csrc; RTPSource *csrc_src; csrc = csrcs[i]; /* get source */ csrc_src = obtain_source (sess, csrc, &created, &arrival, TRUE); if (!csrc_src) continue; if (created) { GST_DEBUG ("created new CSRC: %08x", csrc); rtp_source_set_as_csrc (csrc_src); if (RTP_SOURCE_IS_ACTIVE (csrc_src)) sess->stats.active_sources++; on_new_ssrc (sess, csrc_src); } g_object_unref (csrc_src); } } g_object_unref (source); RTP_SESSION_UNLOCK (sess); return result; /* ERRORS */ invalid_packet: { gst_buffer_unref (buffer); GST_DEBUG ("invalid RTP packet received"); return GST_FLOW_OK; } ignore: { gst_buffer_unref (buffer); RTP_SESSION_UNLOCK (sess); GST_DEBUG ("ignoring RTP packet because we are leaving"); return GST_FLOW_OK; } collision: { gst_buffer_unref (buffer); RTP_SESSION_UNLOCK (sess); GST_DEBUG ("ignoring packet because its collisioning"); return GST_FLOW_OK; } } static void rtp_session_process_rb (RTPSession * sess, RTPSource * source, GstRTCPPacket * packet, RTPArrivalStats * arrival) { guint count, i; count = gst_rtcp_packet_get_rb_count (packet); for (i = 0; i < count; i++) { guint32 ssrc, exthighestseq, jitter, lsr, dlsr; guint8 fractionlost; gint32 packetslost; gst_rtcp_packet_get_rb (packet, i, &ssrc, &fractionlost, &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); GST_DEBUG ("RB %d: SSRC %08x, jitter %" G_GUINT32_FORMAT, i, ssrc, jitter); if (ssrc == sess->source->ssrc) { /* only deal with report blocks for our session, we update the stats of * the sender of the RTCP message. We could also compare our stats against * the other sender to see if we are better or worse. */ rtp_source_process_rb (source, arrival->ntpnstime, fractionlost, packetslost, exthighestseq, jitter, lsr, dlsr); } } on_ssrc_active (sess, source); } /* A Sender report contains statistics about how the sender is doing. This * includes timing informataion such as the relation between RTP and NTP * timestamps and the number of packets/bytes it sent to us. * * In this report is also included a set of report blocks related to how this * sender is receiving data (in case we (or somebody else) is also sending stuff * to it). This info includes the packet loss, jitter and seqnum. It also * contains information to calculate the round trip time (LSR/DLSR). */ static void rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet, RTPArrivalStats * arrival, gboolean * do_sync) { guint32 senderssrc, rtptime, packet_count, octet_count; guint64 ntptime; RTPSource *source; gboolean created, prevsender; gst_rtcp_packet_sr_get_sender_info (packet, &senderssrc, &ntptime, &rtptime, &packet_count, &octet_count); GST_DEBUG ("got SR packet: SSRC %08x, time %" GST_TIME_FORMAT, senderssrc, GST_TIME_ARGS (arrival->current_time)); source = obtain_source (sess, senderssrc, &created, arrival, FALSE); if (!source) return; /* don't try to do lip-sync for sources that sent a BYE */ if (rtp_source_received_bye (source)) *do_sync = FALSE; else *do_sync = TRUE; prevsender = RTP_SOURCE_IS_SENDER (source); /* first update the source */ rtp_source_process_sr (source, arrival->current_time, ntptime, rtptime, packet_count, octet_count); if (prevsender != RTP_SOURCE_IS_SENDER (source)) { sess->stats.sender_sources++; GST_DEBUG ("source: %08x became sender, %d sender sources", senderssrc, sess->stats.sender_sources); } if (created) on_new_ssrc (sess, source); rtp_session_process_rb (sess, source, packet, arrival); g_object_unref (source); } /* A receiver report contains statistics about how a receiver is doing. It * includes stuff like packet loss, jitter and the seqnum it received last. It * also contains info to calculate the round trip time. * * We are only interested in how the sender of this report is doing wrt to us. */ static void rtp_session_process_rr (RTPSession * sess, GstRTCPPacket * packet, RTPArrivalStats * arrival) { guint32 senderssrc; RTPSource *source; gboolean created; senderssrc = gst_rtcp_packet_rr_get_ssrc (packet); GST_DEBUG ("got RR packet: SSRC %08x", senderssrc); source = obtain_source (sess, senderssrc, &created, arrival, FALSE); if (!source) return; if (created) on_new_ssrc (sess, source); rtp_session_process_rb (sess, source, packet, arrival); g_object_unref (source); } /* Get SDES items and store them in the SSRC */ static void rtp_session_process_sdes (RTPSession * sess, GstRTCPPacket * packet, RTPArrivalStats * arrival) { guint items, i, j; gboolean more_items, more_entries; items = gst_rtcp_packet_sdes_get_item_count (packet); GST_DEBUG ("got SDES packet with %d items", items); more_items = gst_rtcp_packet_sdes_first_item (packet); i = 0; while (more_items) { guint32 ssrc; gboolean changed, created, validated; RTPSource *source; GstStructure *sdes; ssrc = gst_rtcp_packet_sdes_get_ssrc (packet); GST_DEBUG ("item %d, SSRC %08x", i, ssrc); changed = FALSE; /* find src, no probation when dealing with RTCP */ source = obtain_source (sess, ssrc, &created, arrival, FALSE); if (!source) return; sdes = gst_structure_new ("application/x-rtp-source-sdes", NULL); more_entries = gst_rtcp_packet_sdes_first_entry (packet); j = 0; while (more_entries) { GstRTCPSDESType type; guint8 len; guint8 *data; gchar *name; gchar *value; gst_rtcp_packet_sdes_get_entry (packet, &type, &len, &data); GST_DEBUG ("entry %d, type %d, len %d, data %.*s", j, type, len, len, data); if (type == GST_RTCP_SDES_PRIV) { name = g_strndup ((const gchar *) &data[1], data[0]); len -= data[0] + 1; data += data[0] + 1; } else { name = g_strdup (gst_rtcp_sdes_type_to_name (type)); } value = g_strndup ((const gchar *) data, len); gst_structure_set (sdes, name, G_TYPE_STRING, value, NULL); g_free (name); g_free (value); more_entries = gst_rtcp_packet_sdes_next_entry (packet); j++; } /* takes ownership of sdes */ changed = rtp_source_set_sdes_struct (source, sdes); validated = !RTP_SOURCE_IS_ACTIVE (source); source->validated = TRUE; /* source became active */ if (validated) { sess->stats.active_sources++; GST_DEBUG ("source: %08x became active, %d active sources", ssrc, sess->stats.active_sources); on_ssrc_validated (sess, source); } if (created) on_new_ssrc (sess, source); if (changed) on_ssrc_sdes (sess, source); g_object_unref (source); more_items = gst_rtcp_packet_sdes_next_item (packet); i++; } } /* BYE is sent when a client leaves the session */ static void rtp_session_process_bye (RTPSession * sess, GstRTCPPacket * packet, RTPArrivalStats * arrival) { guint count, i; gchar *reason; gboolean reconsider = FALSE; reason = gst_rtcp_packet_bye_get_reason (packet); GST_DEBUG ("got BYE packet (reason: %s)", GST_STR_NULL (reason)); count = gst_rtcp_packet_bye_get_ssrc_count (packet); for (i = 0; i < count; i++) { guint32 ssrc; RTPSource *source; gboolean created, prevactive, prevsender; guint pmembers, members; ssrc = gst_rtcp_packet_bye_get_nth_ssrc (packet, i); GST_DEBUG ("SSRC: %08x", ssrc); if (ssrc == sess->source->ssrc) return; /* find src and mark bye, no probation when dealing with RTCP */ source = obtain_source (sess, ssrc, &created, arrival, FALSE); if (!source) return; /* store time for when we need to time out this source */ source->bye_time = arrival->current_time; prevactive = RTP_SOURCE_IS_ACTIVE (source); prevsender = RTP_SOURCE_IS_SENDER (source); /* let the source handle the rest */ rtp_source_process_bye (source, reason); pmembers = sess->stats.active_sources; if (prevactive && !RTP_SOURCE_IS_ACTIVE (source)) { sess->stats.active_sources--; GST_DEBUG ("source: %08x became inactive, %d active sources", ssrc, sess->stats.active_sources); } if (prevsender && !RTP_SOURCE_IS_SENDER (source)) { sess->stats.sender_sources--; GST_DEBUG ("source: %08x became non sender, %d sender sources", ssrc, sess->stats.sender_sources); } members = sess->stats.active_sources; if (!sess->source->received_bye && members < pmembers) { /* some members went away since the previous timeout estimate. * Perform reverse reconsideration but only when we are not scheduling a * BYE ourselves. */ if (arrival->current_time < sess->next_rtcp_check_time) { GstClockTime time_remaining; time_remaining = sess->next_rtcp_check_time - arrival->current_time; sess->next_rtcp_check_time = gst_util_uint64_scale (time_remaining, members, pmembers); GST_DEBUG ("reverse reconsideration %" GST_TIME_FORMAT, GST_TIME_ARGS (sess->next_rtcp_check_time)); sess->next_rtcp_check_time += arrival->current_time; /* mark pending reconsider. We only want to signal the reconsideration * once after we handled all the source in the bye packet */ reconsider = TRUE; } } if (created) on_new_ssrc (sess, source); on_bye_ssrc (sess, source); g_object_unref (source); } if (reconsider) { RTP_SESSION_UNLOCK (sess); /* notify app of reconsideration */ if (sess->callbacks.reconsider) sess->callbacks.reconsider (sess, sess->reconsider_user_data); RTP_SESSION_LOCK (sess); } g_free (reason); } static void rtp_session_process_app (RTPSession * sess, GstRTCPPacket * packet, RTPArrivalStats * arrival) { GST_DEBUG ("received APP"); } static gboolean rtp_session_request_local_key_unit (RTPSession * sess, RTPSource * src, gboolean fir, GstClockTime current_time) { guint32 round_trip = 0; rtp_source_get_last_rb (src, NULL, NULL, NULL, NULL, NULL, NULL, &round_trip); if (sess->last_keyframe_request != GST_CLOCK_TIME_NONE && round_trip) { GstClockTime round_trip_in_ns = gst_util_uint64_scale (round_trip, GST_SECOND, 65536); if (sess->last_keyframe_request != GST_CLOCK_TIME_NONE && current_time - sess->last_keyframe_request < 2 * round_trip_in_ns) { GST_DEBUG ("Ignoring %s request because one was send without one " "RTT (%" GST_TIME_FORMAT " < %" GST_TIME_FORMAT ")", fir ? "FIR" : "PLI", GST_TIME_ARGS (current_time - sess->last_keyframe_request), GST_TIME_ARGS (round_trip_in_ns));; return FALSE; } } sess->last_keyframe_request = current_time; GST_LOG ("received %s request from %X %p(%p)", fir ? "FIR" : "PLI", rtp_source_get_ssrc (src), sess->callbacks.process_rtp, sess->callbacks.request_key_unit); RTP_SESSION_UNLOCK (sess); sess->callbacks.request_key_unit (sess, fir, sess->request_key_unit_user_data); RTP_SESSION_LOCK (sess); return TRUE; } static void rtp_session_process_pli (RTPSession * sess, guint32 sender_ssrc, guint32 media_ssrc, GstClockTime current_time) { RTPSource *src; if (!sess->callbacks.request_key_unit) return; src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (sender_ssrc)); if (!src) return; rtp_session_request_local_key_unit (sess, src, FALSE, current_time); } static void rtp_session_process_fir (RTPSession * sess, guint32 sender_ssrc, guint8 * fci_data, guint fci_length, GstClockTime current_time) { RTPSource *src; guint32 ssrc; guint position = 0; gboolean our_request = FALSE; if (!sess->callbacks.request_key_unit) return; if (fci_length < 8) return; src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (sender_ssrc)); /* Hack because Google fails to set the sender_ssrc correctly */ if (!src && sender_ssrc == 1) { GHashTableIter iter; if (sess->stats.sender_sources > RTP_SOURCE_IS_SENDER (sess->source) ? 2 : 1) return; g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]); while (g_hash_table_iter_next (&iter, NULL, (gpointer *) & src)) { if (src != sess->source && rtp_source_is_sender (src)) break; src = NULL; } } if (!src) return; for (position = 0; position < fci_length; position += 8) { guint8 *data = fci_data + position; ssrc = GST_READ_UINT32_BE (data); if (ssrc == rtp_source_get_ssrc (sess->source)) { our_request = TRUE; break; } } if (!our_request) return; rtp_session_request_local_key_unit (sess, src, TRUE, current_time); } static void rtp_session_process_feedback (RTPSession * sess, GstRTCPPacket * packet, RTPArrivalStats * arrival, GstClockTime current_time) { GstRTCPType type = gst_rtcp_packet_get_type (packet); GstRTCPFBType fbtype = gst_rtcp_packet_fb_get_type (packet); guint32 sender_ssrc = gst_rtcp_packet_fb_get_sender_ssrc (packet); guint32 media_ssrc = gst_rtcp_packet_fb_get_media_ssrc (packet); guint8 *fci_data = gst_rtcp_packet_fb_get_fci (packet); guint fci_length = 4 * gst_rtcp_packet_fb_get_fci_length (packet); GST_DEBUG ("received feedback %d:%d from %08X about %08X with FCI of " "length %d", type, fbtype, sender_ssrc, media_ssrc, fci_length); if (g_signal_has_handler_pending (sess, rtp_session_signals[SIGNAL_ON_FEEDBACK_RTCP], 0, TRUE)) { GstBuffer *fci_buffer = NULL; if (fci_length > 0) { fci_buffer = gst_buffer_create_sub (packet->buffer, fci_data - GST_BUFFER_DATA (packet->buffer), fci_length); GST_BUFFER_TIMESTAMP (fci_buffer) = arrival->running_time; } RTP_SESSION_UNLOCK (sess); g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_FEEDBACK_RTCP], 0, type, fbtype, sender_ssrc, media_ssrc, fci_buffer); RTP_SESSION_LOCK (sess); if (fci_buffer) gst_buffer_unref (fci_buffer); } if (sess->rtcp_feedback_retention_window) { RTPSource *src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (media_ssrc)); if (src) rtp_source_retain_rtcp_packet (src, packet, arrival->running_time); } if (rtp_source_get_ssrc (sess->source) == media_ssrc || /* PSFB FIR puts the media ssrc inside the FCI */ (type == GST_RTCP_TYPE_PSFB && fbtype == GST_RTCP_PSFB_TYPE_FIR)) { switch (type) { case GST_RTCP_TYPE_PSFB: switch (fbtype) { case GST_RTCP_PSFB_TYPE_PLI: rtp_session_process_pli (sess, sender_ssrc, media_ssrc, current_time); break; case GST_RTCP_PSFB_TYPE_FIR: rtp_session_process_fir (sess, sender_ssrc, fci_data, fci_length, current_time); break; default: break; } break; case GST_RTCP_TYPE_RTPFB: default: break; } } } /** * rtp_session_process_rtcp: * @sess: and #RTPSession * @buffer: an RTCP buffer * @current_time: the current system time * @ntpnstime: the current NTP time in nanoseconds * * Process an RTCP buffer in the session manager. This function takes ownership * of @buffer. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer, GstClockTime current_time, guint64 ntpnstime) { GstRTCPPacket packet; gboolean more, is_bye = FALSE, do_sync = FALSE; RTPArrivalStats arrival; GstFlowReturn result = GST_FLOW_OK; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); if (!gst_rtcp_buffer_validate (buffer)) goto invalid_packet; GST_DEBUG ("received RTCP packet"); RTP_SESSION_LOCK (sess); /* update arrival stats */ update_arrival_stats (sess, &arrival, FALSE, buffer, current_time, -1, ntpnstime); if (sess->sent_bye) goto ignore; /* start processing the compound packet */ more = gst_rtcp_buffer_get_first_packet (buffer, &packet); while (more) { GstRTCPType type; type = gst_rtcp_packet_get_type (&packet); /* when we are leaving the session, we should ignore all non-BYE messages */ if (sess->source->received_bye && type != GST_RTCP_TYPE_BYE) { GST_DEBUG ("ignoring non-BYE RTCP packet because we are leaving"); goto next; } switch (type) { case GST_RTCP_TYPE_SR: rtp_session_process_sr (sess, &packet, &arrival, &do_sync); break; case GST_RTCP_TYPE_RR: rtp_session_process_rr (sess, &packet, &arrival); break; case GST_RTCP_TYPE_SDES: rtp_session_process_sdes (sess, &packet, &arrival); break; case GST_RTCP_TYPE_BYE: is_bye = TRUE; /* don't try to attempt lip-sync anymore for streams with a BYE */ do_sync = FALSE; rtp_session_process_bye (sess, &packet, &arrival); break; case GST_RTCP_TYPE_APP: rtp_session_process_app (sess, &packet, &arrival); break; case GST_RTCP_TYPE_RTPFB: case GST_RTCP_TYPE_PSFB: rtp_session_process_feedback (sess, &packet, &arrival, current_time); break; default: GST_WARNING ("got unknown RTCP packet"); break; } next: more = gst_rtcp_packet_move_to_next (&packet); } /* if we are scheduling a BYE, we only want to count bye packets, else we * count everything */ if (sess->source->received_bye) { if (is_bye) { sess->stats.bye_members++; UPDATE_AVG (sess->stats.avg_rtcp_packet_size, arrival.bytes); } } else { /* keep track of average packet size */ UPDATE_AVG (sess->stats.avg_rtcp_packet_size, arrival.bytes); } GST_DEBUG ("%p, received RTCP packet, avg size %u, %u", &sess->stats, sess->stats.avg_rtcp_packet_size, arrival.bytes); RTP_SESSION_UNLOCK (sess); /* notify caller of sr packets in the callback */ if (do_sync && sess->callbacks.sync_rtcp) { /* make writable, we might want to change the buffer */ buffer = gst_buffer_make_metadata_writable (buffer); result = sess->callbacks.sync_rtcp (sess, sess->source, buffer, sess->sync_rtcp_user_data); } else gst_buffer_unref (buffer); return result; /* ERRORS */ invalid_packet: { GST_DEBUG ("invalid RTCP packet received"); gst_buffer_unref (buffer); return GST_FLOW_OK; } ignore: { gst_buffer_unref (buffer); RTP_SESSION_UNLOCK (sess); GST_DEBUG ("ignoring RTP packet because we left"); return GST_FLOW_OK; } } /** * rtp_session_send_rtp: * @sess: an #RTPSession * @data: pointer to either an RTP buffer or a list of RTP buffers * @is_list: TRUE when @data is a buffer list * @current_time: the current system time * @running_time: the running time of @data * * Send the RTP buffer in the session manager. This function takes ownership of * @buffer. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_session_send_rtp (RTPSession * sess, gpointer data, gboolean is_list, GstClockTime current_time, GstClockTime running_time) { GstFlowReturn result; RTPSource *source; gboolean prevsender; gboolean valid_packet; guint64 oldrate; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR); if (is_list) { valid_packet = gst_rtp_buffer_list_validate (GST_BUFFER_LIST_CAST (data)); } else { valid_packet = gst_rtp_buffer_validate (GST_BUFFER_CAST (data)); } if (!valid_packet) goto invalid_packet; GST_LOG ("received RTP %s for sending", is_list ? "list" : "packet"); RTP_SESSION_LOCK (sess); source = sess->source; /* update last activity */ source->last_rtp_activity = current_time; prevsender = RTP_SOURCE_IS_SENDER (source); oldrate = source->bitrate; /* we use our own source to send */ result = rtp_source_send_rtp (source, data, is_list, running_time); if (RTP_SOURCE_IS_SENDER (source) && !prevsender) sess->stats.sender_sources++; if (oldrate != source->bitrate) sess->recalc_bandwidth = TRUE; RTP_SESSION_UNLOCK (sess); return result; /* ERRORS */ invalid_packet: { gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); GST_DEBUG ("invalid RTP packet received"); return GST_FLOW_OK; } } static void add_bitrates (gpointer key, RTPSource * source, gdouble * bandwidth) { *bandwidth += source->bitrate; } static GstClockTime calculate_rtcp_interval (RTPSession * sess, gboolean deterministic, gboolean first) { GstClockTime result; /* recalculate bandwidth when it changed */ if (sess->recalc_bandwidth) { gdouble bandwidth; if (sess->bandwidth > 0) bandwidth = sess->bandwidth; else { /* If it is <= 0, then try to estimate the actual bandwidth */ bandwidth = sess->source->bitrate; g_hash_table_foreach (sess->cnames, (GHFunc) add_bitrates, &bandwidth); bandwidth /= 8.0; } if (bandwidth < 8000) bandwidth = RTP_STATS_BANDWIDTH; rtp_stats_set_bandwidths (&sess->stats, bandwidth, sess->rtcp_bandwidth, sess->rtcp_rs_bandwidth, sess->rtcp_rr_bandwidth); sess->recalc_bandwidth = FALSE; } if (sess->source->received_bye) { result = rtp_stats_calculate_bye_interval (&sess->stats); } else { result = rtp_stats_calculate_rtcp_interval (&sess->stats, RTP_SOURCE_IS_SENDER (sess->source), first); } GST_DEBUG ("next deterministic interval: %" GST_TIME_FORMAT ", first %d", GST_TIME_ARGS (result), first); if (!deterministic && result != GST_CLOCK_TIME_NONE) result = rtp_stats_add_rtcp_jitter (&sess->stats, result); GST_DEBUG ("next interval: %" GST_TIME_FORMAT, GST_TIME_ARGS (result)); return result; } /* Stop the current @sess and schedule a BYE message for the other members. * One must have the session lock to call this function */ static GstFlowReturn rtp_session_schedule_bye_locked (RTPSession * sess, const gchar * reason, GstClockTime current_time) { GstFlowReturn result = GST_FLOW_OK; RTPSource *source; GstClockTime interval; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); source = sess->source; /* ignore more BYEs */ if (source->received_bye) goto done; /* we have BYE now */ source->received_bye = TRUE; /* at least one member wants to send a BYE */ g_free (sess->bye_reason); sess->bye_reason = g_strdup (reason); INIT_AVG (sess->stats.avg_rtcp_packet_size, 100); sess->stats.bye_members = 1; sess->first_rtcp = TRUE; sess->sent_bye = FALSE; sess->allow_early = TRUE; /* reschedule transmission */ sess->last_rtcp_send_time = current_time; interval = calculate_rtcp_interval (sess, FALSE, TRUE); sess->next_rtcp_check_time = current_time + interval; GST_DEBUG ("Schedule BYE for %" GST_TIME_FORMAT ", %" GST_TIME_FORMAT, GST_TIME_ARGS (interval), GST_TIME_ARGS (sess->next_rtcp_check_time)); RTP_SESSION_UNLOCK (sess); /* notify app of reconsideration */ if (sess->callbacks.reconsider) sess->callbacks.reconsider (sess, sess->reconsider_user_data); RTP_SESSION_LOCK (sess); done: return result; } /** * rtp_session_schedule_bye: * @sess: an #RTPSession * @reason: a reason or NULL * @current_time: the current system time * * Stop the current @sess and schedule a BYE message for the other members. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_session_schedule_bye (RTPSession * sess, const gchar * reason, GstClockTime current_time) { GstFlowReturn result = GST_FLOW_OK; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); RTP_SESSION_LOCK (sess); result = rtp_session_schedule_bye_locked (sess, reason, current_time); RTP_SESSION_UNLOCK (sess); return result; } /** * rtp_session_next_timeout: * @sess: an #RTPSession * @current_time: the current system time * * Get the next time we should perform session maintenance tasks. * * Returns: a time when rtp_session_on_timeout() should be called with the * current system time. */ GstClockTime rtp_session_next_timeout (RTPSession * sess, GstClockTime current_time) { GstClockTime result, interval = 0; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_CLOCK_TIME_NONE); RTP_SESSION_LOCK (sess); if (GST_CLOCK_TIME_IS_VALID (sess->next_early_rtcp_time)) { result = sess->next_early_rtcp_time; goto early_exit; } result = sess->next_rtcp_check_time; GST_DEBUG ("current time: %" GST_TIME_FORMAT ", next :%" GST_TIME_FORMAT, GST_TIME_ARGS (current_time), GST_TIME_ARGS (result)); if (result < current_time) { GST_DEBUG ("take current time as base"); /* our previous check time expired, start counting from the current time * again. */ result = current_time; } if (sess->source->received_bye) { if (sess->sent_bye) { GST_DEBUG ("we sent BYE already"); interval = GST_CLOCK_TIME_NONE; } else if (sess->stats.active_sources >= 50) { GST_DEBUG ("reconsider BYE, more than 50 sources"); /* reconsider BYE if members >= 50 */ interval = calculate_rtcp_interval (sess, FALSE, TRUE); } } else { if (sess->first_rtcp) { GST_DEBUG ("first RTCP packet"); /* we are called for the first time */ interval = calculate_rtcp_interval (sess, FALSE, TRUE); } else if (sess->next_rtcp_check_time < current_time) { GST_DEBUG ("old check time expired, getting new timeout"); /* get a new timeout when we need to */ interval = calculate_rtcp_interval (sess, FALSE, FALSE); } } if (interval != GST_CLOCK_TIME_NONE) result += interval; else result = GST_CLOCK_TIME_NONE; sess->next_rtcp_check_time = result; early_exit: GST_DEBUG ("current time: %" GST_TIME_FORMAT ", next time: %" GST_TIME_FORMAT, GST_TIME_ARGS (current_time), GST_TIME_ARGS (result)); RTP_SESSION_UNLOCK (sess); return result; } typedef struct { RTPSession *sess; GstBuffer *rtcp; GstClockTime current_time; guint64 ntpnstime; GstClockTime running_time; GstClockTime interval; GstRTCPPacket packet; gboolean is_bye; gboolean has_sdes; gboolean is_early; gboolean may_suppress; } ReportData; static void session_start_rtcp (RTPSession * sess, ReportData * data) { GstRTCPPacket *packet = &data->packet; RTPSource *own = sess->source; data->rtcp = gst_rtcp_buffer_new (sess->mtu); if (RTP_SOURCE_IS_SENDER (own)) { guint64 ntptime; guint32 rtptime; guint32 packet_count, octet_count; /* we are a sender, create SR */ GST_DEBUG ("create SR for SSRC %08x", own->ssrc); gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_SR, packet); /* get latest stats */ rtp_source_get_new_sr (own, data->ntpnstime, data->running_time, &ntptime, &rtptime, &packet_count, &octet_count); /* store stats */ rtp_source_process_sr (own, data->current_time, ntptime, rtptime, packet_count, octet_count); /* fill in sender report info */ gst_rtcp_packet_sr_set_sender_info (packet, own->ssrc, ntptime, rtptime, packet_count, octet_count); } else { /* we are only receiver, create RR */ GST_DEBUG ("create RR for SSRC %08x", own->ssrc); gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_RR, packet); gst_rtcp_packet_rr_set_ssrc (packet, own->ssrc); } } /* construct a Sender or Receiver Report */ static void session_report_blocks (const gchar * key, RTPSource * source, ReportData * data) { RTPSession *sess = data->sess; GstRTCPPacket *packet = &data->packet; /* create a new buffer if needed */ if (data->rtcp == NULL) { session_start_rtcp (sess, data); } else if (data->is_early) { /* Put a single RR or SR in minimal compound packets */ return; } if (gst_rtcp_packet_get_rb_count (packet) < GST_RTCP_MAX_RB_COUNT) { /* only report about other sender sources */ if (source != sess->source && RTP_SOURCE_IS_SENDER (source)) { guint8 fractionlost; gint32 packetslost; guint32 exthighestseq, jitter; guint32 lsr, dlsr; /* get new stats */ rtp_source_get_new_rb (source, data->current_time, &fractionlost, &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); /* store last generated RR packet */ source->last_rr.is_valid = TRUE; source->last_rr.fractionlost = fractionlost; source->last_rr.packetslost = packetslost; source->last_rr.exthighestseq = exthighestseq; source->last_rr.jitter = jitter; source->last_rr.lsr = lsr; source->last_rr.dlsr = dlsr; /* packet is not yet filled, add report block for this source. */ gst_rtcp_packet_add_rb (packet, source->ssrc, fractionlost, packetslost, exthighestseq, jitter, lsr, dlsr); } } } /* perform cleanup of sources that timed out */ static void session_cleanup (const gchar * key, RTPSource * source, ReportData * data) { gboolean remove = FALSE; gboolean byetimeout = FALSE; gboolean sendertimeout = FALSE; gboolean is_sender, is_active; RTPSession *sess = data->sess; GstClockTime interval, binterval; GstClockTime btime; is_sender = RTP_SOURCE_IS_SENDER (source); is_active = RTP_SOURCE_IS_ACTIVE (source); /* our own rtcp interval may have been forced low by secondary configuration, * while sender side may still operate with higher interval, * so do not just take our interval to decide on timing out sender, * but take (if data->interval <= 5 * GST_SECOND): * interval = CLAMP (sender_interval, data->interval, 5 * GST_SECOND) * where sender_interval is difference between last 2 received RTCP reports */ if (data->interval >= 5 * GST_SECOND || (source == sess->source)) { binterval = data->interval; } else { GST_LOG ("prev_rtcp %" GST_TIME_FORMAT ", last_rtcp %" GST_TIME_FORMAT, GST_TIME_ARGS (source->stats.prev_rtcptime), GST_TIME_ARGS (source->stats.last_rtcptime)); /* if not received enough yet, fallback to larger default */ if (source->stats.last_rtcptime > source->stats.prev_rtcptime) binterval = source->stats.last_rtcptime - source->stats.prev_rtcptime; else binterval = 5 * GST_SECOND; binterval = CLAMP (binterval, data->interval, 5 * GST_SECOND); } GST_LOG ("timeout base interval %" GST_TIME_FORMAT, GST_TIME_ARGS (binterval)); /* check for our own source, we don't want to delete our own source. */ if (!(source == sess->source)) { if (source->received_bye) { /* if we received a BYE from the source, remove the source after some * time. */ if (data->current_time > source->bye_time && data->current_time - source->bye_time > sess->stats.bye_timeout) { GST_DEBUG ("removing BYE source %08x", source->ssrc); remove = TRUE; byetimeout = TRUE; } } /* sources that were inactive for more than 5 times the deterministic reporting * interval get timed out. the min timeout is 5 seconds. */ /* mind old time that might pre-date last time going to PLAYING */ btime = MAX (source->last_activity, sess->start_time); if (data->current_time > btime) { interval = MAX (binterval * 5, 5 * GST_SECOND); if (data->current_time - btime > interval) { GST_DEBUG ("removing timeout source %08x, last %" GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime)); remove = TRUE; } } } /* senders that did not send for a long time become a receiver, this also * holds for our own source. */ if (is_sender) { /* mind old time that might pre-date last time going to PLAYING */ btime = MAX (source->last_rtp_activity, sess->start_time); if (data->current_time > btime) { interval = MAX (binterval * 2, 5 * GST_SECOND); if (data->current_time - btime > interval) { GST_DEBUG ("sender source %08x timed out and became receiver, last %" GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime)); source->is_sender = FALSE; sess->stats.sender_sources--; sendertimeout = TRUE; } } } if (remove) { sess->total_sources--; if (is_sender) sess->stats.sender_sources--; if (is_active) sess->stats.active_sources--; if (byetimeout) on_bye_timeout (sess, source); else on_timeout (sess, source); } else { if (sendertimeout) on_sender_timeout (sess, source); } source->closing = remove; } static void session_sdes (RTPSession * sess, ReportData * data) { GstRTCPPacket *packet = &data->packet; const GstStructure *sdes; gint i, n_fields; /* add SDES packet */ gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_SDES, packet); gst_rtcp_packet_sdes_add_item (packet, sess->source->ssrc); sdes = rtp_source_get_sdes_struct (sess->source); /* add all fields in the structure, the order is not important. */ n_fields = gst_structure_n_fields (sdes); for (i = 0; i < n_fields; ++i) { const gchar *field; const gchar *value; GstRTCPSDESType type; field = gst_structure_nth_field_name (sdes, i); if (field == NULL) continue; value = gst_structure_get_string (sdes, field); if (value == NULL) continue; type = gst_rtcp_sdes_name_to_type (field); /* Early packets are minimal and only include the CNAME */ if (data->is_early && type != GST_RTCP_SDES_CNAME) continue; if (type > GST_RTCP_SDES_END && type < GST_RTCP_SDES_PRIV) { gst_rtcp_packet_sdes_add_entry (packet, type, strlen (value), (const guint8 *) value); } else if (type == GST_RTCP_SDES_PRIV) { gsize prefix_len; gsize value_len; gsize data_len; guint8 data[256]; /* don't accept entries that are too big */ prefix_len = strlen (field); if (prefix_len > 255) continue; value_len = strlen (value); if (value_len > 255) continue; data_len = 1 + prefix_len + value_len; if (data_len > 255) continue; data[0] = prefix_len; memcpy (&data[1], field, prefix_len); memcpy (&data[1 + prefix_len], value, value_len); gst_rtcp_packet_sdes_add_entry (packet, type, data_len, data); } } data->has_sdes = TRUE; } /* schedule a BYE packet */ static void session_bye (RTPSession * sess, ReportData * data) { GstRTCPPacket *packet = &data->packet; /* open packet */ session_start_rtcp (sess, data); /* add SDES */ session_sdes (sess, data); /* add a BYE packet */ gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_BYE, packet); gst_rtcp_packet_bye_add_ssrc (packet, sess->source->ssrc); if (sess->bye_reason) gst_rtcp_packet_bye_set_reason (packet, sess->bye_reason); /* we have a BYE packet now */ data->is_bye = TRUE; } static gboolean is_rtcp_time (RTPSession * sess, GstClockTime current_time, ReportData * data) { GstClockTime new_send_time, elapsed; if (data->is_early && sess->next_early_rtcp_time < current_time) goto early; /* no need to check yet */ if (sess->next_rtcp_check_time > current_time) { GST_DEBUG ("no check time yet, next %" GST_TIME_FORMAT " > now %" GST_TIME_FORMAT, GST_TIME_ARGS (sess->next_rtcp_check_time), GST_TIME_ARGS (current_time)); return FALSE; } /* get elapsed time since we last reported */ elapsed = current_time - sess->last_rtcp_send_time; /* perform forward reconsideration */ new_send_time = rtp_stats_add_rtcp_jitter (&sess->stats, data->interval); GST_DEBUG ("forward reconsideration %" GST_TIME_FORMAT ", elapsed %" GST_TIME_FORMAT, GST_TIME_ARGS (new_send_time), GST_TIME_ARGS (elapsed)); new_send_time += sess->last_rtcp_send_time; /* check if reconsideration */ if (current_time < new_send_time) { GST_DEBUG ("reconsider RTCP for %" GST_TIME_FORMAT, GST_TIME_ARGS (new_send_time)); /* store new check time */ sess->next_rtcp_check_time = new_send_time; return FALSE; } early: new_send_time = calculate_rtcp_interval (sess, FALSE, FALSE); GST_DEBUG ("can send RTCP now, next interval %" GST_TIME_FORMAT, GST_TIME_ARGS (new_send_time)); sess->next_rtcp_check_time = current_time + new_send_time; /* Apply the rules from RFC 4585 section 3.5.3 */ if (sess->stats.min_interval != 0 && !sess->first_rtcp) { GstClockTimeDiff T_rr_current_interval = g_random_double_range (0.5, 1.5) * sess->stats.min_interval; /* This will caused the RTCP to be suppressed if no FB packets are added */ if (sess->last_rtcp_send_time + T_rr_current_interval > sess->next_rtcp_check_time) { GST_DEBUG ("RTCP packet could be suppressed min: %" GST_TIME_FORMAT " last: %" GST_TIME_FORMAT " + T_rr_current_interval: %" GST_TIME_FORMAT " > sess->next_rtcp_check_time: %" GST_TIME_FORMAT, GST_TIME_ARGS (sess->stats.min_interval), GST_TIME_ARGS (sess->last_rtcp_send_time), GST_TIME_ARGS (T_rr_current_interval), GST_TIME_ARGS (sess->next_rtcp_check_time)); data->may_suppress = TRUE; } } return TRUE; } static void clone_ssrcs_hashtable (gchar * key, RTPSource * source, GHashTable * hash_table) { g_hash_table_insert (hash_table, key, g_object_ref (source)); } static gboolean remove_closing_sources (const gchar * key, RTPSource * source, gpointer * data) { return source->closing; } /** * rtp_session_on_timeout: * @sess: an #RTPSession * @current_time: the current system time * @ntpnstime: the current NTP time in nanoseconds * @running_time: the current running_time of the pipeline * * Perform maintenance actions after the timeout obtained with * rtp_session_next_timeout() expired. * * This function will perform timeouts of receivers and senders, send a BYE * packet or generate RTCP packets with current session stats. * * This function can call the #RTPSessionSendRTCP callback, possibly multiple * times, for each packet that should be processed. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time, guint64 ntpnstime, GstClockTime running_time) { GstFlowReturn result = GST_FLOW_OK; ReportData data; RTPSource *own; GHashTable *table_copy; gboolean notify = FALSE; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); GST_DEBUG ("reporting at %" GST_TIME_FORMAT ", NTP time %" GST_TIME_FORMAT, GST_TIME_ARGS (current_time), GST_TIME_ARGS (ntpnstime)); data.sess = sess; data.rtcp = NULL; data.current_time = current_time; data.ntpnstime = ntpnstime; data.is_bye = FALSE; data.has_sdes = FALSE; data.may_suppress = FALSE; data.running_time = running_time; own = sess->source; RTP_SESSION_LOCK (sess); /* get a new interval, we need this for various cleanups etc */ data.interval = calculate_rtcp_interval (sess, TRUE, sess->first_rtcp); /* Make a local copy of the hashtable. We need to do this because the * cleanup stage below releases the session lock. */ table_copy = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref); g_hash_table_foreach (sess->ssrcs[sess->mask_idx], (GHFunc) clone_ssrcs_hashtable, table_copy); /* Clean up the session, mark the source for removing, this might release the * session lock. */ g_hash_table_foreach (table_copy, (GHFunc) session_cleanup, &data); g_hash_table_destroy (table_copy); /* Now remove the marked sources */ g_hash_table_foreach_remove (sess->ssrcs[sess->mask_idx], (GHRFunc) remove_closing_sources, NULL); if (GST_CLOCK_TIME_IS_VALID (sess->next_early_rtcp_time)) data.is_early = TRUE; else data.is_early = FALSE; /* see if we need to generate SR or RR packets */ if (is_rtcp_time (sess, current_time, &data)) { if (own->received_bye) { /* generate BYE instead */ GST_DEBUG ("generating BYE message"); session_bye (sess, &data); sess->sent_bye = TRUE; } else { /* loop over all known sources and do something */ g_hash_table_foreach (sess->ssrcs[sess->mask_idx], (GHFunc) session_report_blocks, &data); } } if (data.rtcp) { /* we keep track of the last report time in order to timeout inactive * receivers or senders */ if (!data.is_early && !data.may_suppress) sess->last_rtcp_send_time = data.current_time; sess->first_rtcp = FALSE; sess->next_early_rtcp_time = GST_CLOCK_TIME_NONE; /* add SDES for this source when not already added */ if (!data.has_sdes) session_sdes (sess, &data); } /* check for outdated collisions */ GST_DEBUG ("Timing out collisions"); rtp_source_timeout (sess->source, current_time, /* "a relatively long time" -- RFC 3550 section 8.2 */ RTP_STATS_MIN_INTERVAL * GST_SECOND * 10, running_time - sess->rtcp_feedback_retention_window); if (sess->change_ssrc) { GST_DEBUG ("need to change our SSRC (%08x)", own->ssrc); g_hash_table_steal (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (own->ssrc)); own->ssrc = rtp_session_create_new_ssrc (sess); rtp_source_reset (own); g_hash_table_insert (sess->ssrcs[sess->mask_idx], GINT_TO_POINTER (own->ssrc), own); g_free (sess->bye_reason); sess->bye_reason = NULL; sess->sent_bye = FALSE; sess->change_ssrc = FALSE; notify = TRUE; GST_DEBUG ("changed our SSRC to %08x", own->ssrc); } sess->allow_early = TRUE; RTP_SESSION_UNLOCK (sess); if (notify) g_object_notify (G_OBJECT (sess), "internal-ssrc"); /* push out the RTCP packet */ if (data.rtcp) { gboolean do_not_suppress; /* Give the user a change to add its own packet */ g_signal_emit (sess, rtp_session_signals[SIGNAL_ON_SENDING_RTCP], 0, data.rtcp, data.is_early, &do_not_suppress); if (sess->callbacks.send_rtcp && (do_not_suppress || !data.may_suppress)) { guint packet_size; /* close the RTCP packet */ gst_rtcp_buffer_end (data.rtcp); packet_size = GST_BUFFER_SIZE (data.rtcp) + sess->header_len; UPDATE_AVG (sess->stats.avg_rtcp_packet_size, packet_size); GST_DEBUG ("%p, sending RTCP packet, avg size %u, %u", &sess->stats, sess->stats.avg_rtcp_packet_size, packet_size); result = sess->callbacks.send_rtcp (sess, own, data.rtcp, sess->sent_bye, sess->send_rtcp_user_data); } else { GST_DEBUG ("freeing packet callback: %p" " do_not_suppress: %d may_suppress: %d", sess->callbacks.send_rtcp, do_not_suppress, data.may_suppress); gst_buffer_unref (data.rtcp); } } return result; } void rtp_session_request_early_rtcp (RTPSession * sess, GstClockTime current_time, GstClockTimeDiff max_delay) { GstClockTime T_dither_max; /* Implements the algorithm described in RFC 4585 section 3.5.2 */ RTP_SESSION_LOCK (sess); /* Check if already requested */ /* RFC 4585 section 3.5.2 step 2 */ if (GST_CLOCK_TIME_IS_VALID (sess->next_early_rtcp_time)) goto dont_send; /* Ignore the request a scheduled packet will be in time anyway */ if (current_time + max_delay > sess->next_rtcp_check_time) goto dont_send; /* RFC 4585 section 3.5.2 step 2b */ /* If the total sources is <=2, then there is only us and one peer */ if (sess->total_sources <= 2) { T_dither_max = 0; } else { /* Divide by 2 because l = 0.5 */ T_dither_max = sess->next_rtcp_check_time - sess->last_rtcp_send_time; T_dither_max /= 2; } /* RFC 4585 section 3.5.2 step 3 */ if (current_time + T_dither_max > sess->next_rtcp_check_time) goto dont_send; /* RFC 4585 section 3.5.2 step 4 * Don't send if allow_early is FALSE, but not if we are in * immediate mode, meaning we are part of a group of at most the * application-specific threshold. */ if (sess->total_sources > sess->rtcp_immediate_feedback_threshold && sess->allow_early == FALSE) goto dont_send; if (T_dither_max) { /* Schedule an early transmission later */ sess->next_early_rtcp_time = g_random_double () * T_dither_max + current_time; } else { /* If no dithering, schedule it for NOW */ sess->next_early_rtcp_time = current_time; } RTP_SESSION_UNLOCK (sess); /* notify app of need to send packet early * and therefore of timeout change */ if (sess->callbacks.reconsider) sess->callbacks.reconsider (sess, sess->reconsider_user_data); return; dont_send: RTP_SESSION_UNLOCK (sess); } gboolean rtp_session_request_key_unit (RTPSession * sess, guint32 ssrc, GstClockTime now, gboolean fir, gint count) { RTPSource *src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx], GUINT_TO_POINTER (ssrc)); if (!src) return FALSE; if (fir) { src->send_pli = FALSE; src->send_fir = TRUE; if (count == -1 || count != src->last_fir_count) src->current_send_fir_seqnum++; src->last_fir_count = count; } else if (!src->send_fir) { src->send_pli = TRUE; } rtp_session_request_early_rtcp (sess, now, 200 * GST_MSECOND); return TRUE; } static gboolean has_pli_compare_func (gconstpointer a, gconstpointer ignored) { GstRTCPPacket packet; packet.buffer = (GstBuffer *) a; packet.offset = 0; if (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_PSFB && gst_rtcp_packet_fb_get_type (&packet) == GST_RTCP_PSFB_TYPE_PLI) return TRUE; else return FALSE; } static gboolean rtp_session_on_sending_rtcp (RTPSession * sess, GstBuffer * buffer, gboolean early) { gboolean ret = FALSE; GHashTableIter iter; gpointer key, value; gboolean started_fir = FALSE; GstRTCPPacket fir_rtcppacket; RTP_SESSION_LOCK (sess); g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]); while (g_hash_table_iter_next (&iter, &key, &value)) { guint media_ssrc = GPOINTER_TO_UINT (key); RTPSource *media_src = value; guint8 *fci_data; if (media_src->send_fir) { if (!started_fir) { if (!gst_rtcp_buffer_add_packet (buffer, GST_RTCP_TYPE_PSFB, &fir_rtcppacket)) break; gst_rtcp_packet_fb_set_type (&fir_rtcppacket, GST_RTCP_PSFB_TYPE_FIR); gst_rtcp_packet_fb_set_sender_ssrc (&fir_rtcppacket, rtp_source_get_ssrc (sess->source)); gst_rtcp_packet_fb_set_media_ssrc (&fir_rtcppacket, 0); if (!gst_rtcp_packet_fb_set_fci_length (&fir_rtcppacket, 2)) { gst_rtcp_packet_remove (&fir_rtcppacket); break; } ret = TRUE; started_fir = TRUE; } else { if (!gst_rtcp_packet_fb_set_fci_length (&fir_rtcppacket, !gst_rtcp_packet_fb_get_fci_length (&fir_rtcppacket) + 2)) break; } fci_data = gst_rtcp_packet_fb_get_fci (&fir_rtcppacket) - ((gst_rtcp_packet_fb_get_fci_length (&fir_rtcppacket) - 2) * 4); GST_WRITE_UINT32_BE (fci_data, media_ssrc); fci_data += 4; fci_data[0] = media_src->current_send_fir_seqnum; fci_data[1] = fci_data[2] = fci_data[3] = 0; media_src->send_fir = FALSE; } } g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]); while (g_hash_table_iter_next (&iter, &key, &value)) { guint media_ssrc = GPOINTER_TO_UINT (key); RTPSource *media_src = value; GstRTCPPacket pli_rtcppacket; if (media_src->send_pli && !rtp_source_has_retained (media_src, has_pli_compare_func, NULL)) { if (gst_rtcp_buffer_add_packet (buffer, GST_RTCP_TYPE_PSFB, &pli_rtcppacket)) { gst_rtcp_packet_fb_set_type (&pli_rtcppacket, GST_RTCP_PSFB_TYPE_PLI); gst_rtcp_packet_fb_set_sender_ssrc (&pli_rtcppacket, rtp_source_get_ssrc (sess->source)); gst_rtcp_packet_fb_set_media_ssrc (&pli_rtcppacket, media_ssrc); ret = TRUE; } else { /* Break because the packet is full, will put next request in a * further packet */ break; } } media_src->send_pli = FALSE; } RTP_SESSION_UNLOCK (sess); return ret; } static void rtp_session_send_rtcp (RTPSession * sess, GstClockTimeDiff max_delay) { GstClockTime now; if (!sess->callbacks.send_rtcp) return; now = sess->callbacks.request_time (sess, sess->request_time_user_data); rtp_session_request_early_rtcp (sess, now, max_delay); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/Makefile.am�������������������������������������������������0000644�0001750�0001750�00000003605�11671175354�017006� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������plugin_LTLIBRARIES = libgstrtpmanager.la glib_enum_define = GST_RTP_BIN glib_gen_prefix = gst_rtp_bin glib_gen_basename = gstrtpbin include $(top_srcdir)/common/gst-glib-gen.mak built_sources = gstrtpbin-marshal.c built_headers = gstrtpbin-marshal.h BUILT_SOURCES = $(built_sources) $(built_headers) libgstrtpmanager_la_SOURCES = gstrtpmanager.c \ gstrtpbin.c \ gstrtpjitterbuffer.c \ gstrtpptdemux.c \ gstrtpssrcdemux.c \ rtpjitterbuffer.c \ rtpsession.c \ rtpsource.c \ rtpstats.c \ gstrtpsession.c nodist_libgstrtpmanager_la_SOURCES = \ $(built_sources) noinst_HEADERS = gstrtpbin.h \ gstrtpjitterbuffer.h \ gstrtpptdemux.h \ gstrtpssrcdemux.h \ rtpjitterbuffer.h \ rtpsession.h \ rtpsource.h \ rtpstats.h \ gstrtpsession.h libgstrtpmanager_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ $(WARNING_CFLAGS) $(ERROR_CFLAGS) libgstrtpmanager_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS_LIBS) libgstrtpmanager_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrtpmanager_la_LIBTOOLFLAGS = --tag=disable-static CLEANFILES = $(BUILT_SOURCES) EXTRA_DIST = gstrtpbin-marshal.list Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstrtpmanager -:SHARED libgstrtpmanager \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstrtpmanager_la_SOURCES) \ $(nodist_libgstrtpmanager_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtpmanager_la_CFLAGS) \ -:LDFLAGS $(libgstrtpmanager_la_LDFLAGS) \ $(libgstrtpmanager_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ ���������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/rtpsession.h������������������������������������������������0000644�0001750�0001750�00000034177�11677341656�017352� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GStreamer * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __RTP_SESSION_H__ #define __RTP_SESSION_H__ #include <gst/gst.h> #include <gst/netbuffer/gstnetbuffer.h> #include "rtpsource.h" typedef struct _RTPSession RTPSession; typedef struct _RTPSessionClass RTPSessionClass; #define RTP_TYPE_SESSION (rtp_session_get_type()) #define RTP_SESSION(sess) (G_TYPE_CHECK_INSTANCE_CAST((sess),RTP_TYPE_SESSION,RTPSession)) #define RTP_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SESSION,RTPSessionClass)) #define RTP_IS_SESSION(sess) (G_TYPE_CHECK_INSTANCE_TYPE((sess),RTP_TYPE_SESSION)) #define RTP_IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SESSION)) #define RTP_SESSION_CAST(sess) ((RTPSession *)(sess)) #define RTP_SESSION_LOCK(sess) (g_mutex_lock ((sess)->lock)) #define RTP_SESSION_UNLOCK(sess) (g_mutex_unlock ((sess)->lock)) /** * RTPSessionProcessRTP: * @sess: an #RTPSession * @src: the #RTPSource * @buffer: the RTP buffer ready for processing * @user_data: user data specified when registering * * This callback will be called when @sess has @buffer ready for further * processing. Processing the buffer typically includes decoding and displaying * the buffer. * * Returns: a #GstFlowReturn. */ typedef GstFlowReturn (*RTPSessionProcessRTP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data); /** * RTPSessionSendRTP: * @sess: an #RTPSession * @src: the #RTPSource * @buffer: the RTP buffer ready for sending * @user_data: user data specified when registering * * This callback will be called when @sess has @buffer ready for sending to * all listening participants in this session. * * Returns: a #GstFlowReturn. */ typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, gpointer data, gpointer user_data); /** * RTPSessionSendRTCP: * @sess: an #RTPSession * @src: the #RTPSource * @buffer: the RTCP buffer ready for sending * @eos: if an EOS event should be pushed * @user_data: user data specified when registering * * This callback will be called when @sess has @buffer ready for sending to * all listening participants in this session. * * Returns: a #GstFlowReturn. */ typedef GstFlowReturn (*RTPSessionSendRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gboolean eos, gpointer user_data); /** * RTPSessionSyncRTCP: * @sess: an #RTPSession * @src: the #RTPSource * @buffer: the RTCP buffer ready for synchronisation * @user_data: user data specified when registering * * This callback will be called when @sess has an SR @buffer ready for doing * synchronisation between streams. * * Returns: a #GstFlowReturn. */ typedef GstFlowReturn (*RTPSessionSyncRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data); /** * RTPSessionClockRate: * @sess: an #RTPSession * @payload: the payload * @user_data: user data specified when registering * * This callback will be called when @sess needs the clock-rate of @payload. * * Returns: the clock-rate of @pt. */ typedef gint (*RTPSessionClockRate) (RTPSession *sess, guint8 payload, gpointer user_data); /** * RTPSessionReconsider: * @sess: an #RTPSession * @user_data: user data specified when registering * * This callback will be called when @sess needs to cancel the current timeout. * The currently running timeout should be canceled and a new reporting interval * should be requested from @sess. */ typedef void (*RTPSessionReconsider) (RTPSession *sess, gpointer user_data); /** * RTPSessionRequestKeyUnit: * @sess: an #RTPSession * @all_headers: %TRUE if "all-headers" property should be set on the key unit * request * @user_data: user data specified when registering * * Asks the encoder to produce a key unit as soon as possibly within the * bandwidth constraints */ typedef void (*RTPSessionRequestKeyUnit) (RTPSession *sess, gboolean all_headers, gpointer user_data); /** * RTPSessionRequestTime: * @sess: an #RTPSession * @user_data: user data specified when registering * * This callback will be called when @sess needs the current time. The time * should be returned as a #GstClockTime */ typedef GstClockTime (*RTPSessionRequestTime) (RTPSession *sess, gpointer user_data); /** * RTPSessionCallbacks: * @RTPSessionProcessRTP: callback to process RTP packets * @RTPSessionSendRTP: callback for sending RTP packets * @RTPSessionSendRTCP: callback for sending RTCP packets * @RTPSessionSyncRTCP: callback for handling SR packets * @RTPSessionReconsider: callback for reconsidering the timeout * @RTPSessionRequestKeyUnit: callback for requesting a new key unit * * These callbacks can be installed on the session manager to get notification * when RTP and RTCP packets are ready for further processing. These callbacks * are not implemented with signals for performance reasons. */ typedef struct { RTPSessionProcessRTP process_rtp; RTPSessionSendRTP send_rtp; RTPSessionSyncRTCP sync_rtcp; RTPSessionSendRTCP send_rtcp; RTPSessionClockRate clock_rate; RTPSessionReconsider reconsider; RTPSessionRequestKeyUnit request_key_unit; RTPSessionRequestTime request_time; } RTPSessionCallbacks; /** * RTPSession: * @lock: lock to protect the session * @source: the source of this session * @ssrcs: Hashtable of sources indexed by SSRC * @cnames: Hashtable of sources indexed by CNAME * @num_sources: the number of sources * @activecount: the number of active sources * @callbacks: callbacks * @user_data: user data passed in callbacks * @stats: session statistics * * The RTP session manager object */ struct _RTPSession { GObject object; GMutex *lock; guint header_len; guint mtu; /* bandwidths */ gboolean recalc_bandwidth; guint bandwidth; gdouble rtcp_bandwidth; guint rtcp_rr_bandwidth; guint rtcp_rs_bandwidth; RTPSource *source; /* for sender/receiver counting */ guint32 key; guint32 mask_idx; guint32 mask; GHashTable *ssrcs[32]; GHashTable *cnames; guint total_sources; GstClockTime next_rtcp_check_time; GstClockTime last_rtcp_send_time; GstClockTime start_time; gboolean first_rtcp; gboolean allow_early; GstClockTime next_early_rtcp_time; gchar *bye_reason; gboolean sent_bye; RTPSessionCallbacks callbacks; gpointer process_rtp_user_data; gpointer send_rtp_user_data; gpointer send_rtcp_user_data; gpointer sync_rtcp_user_data; gpointer clock_rate_user_data; gpointer reconsider_user_data; gpointer request_key_unit_user_data; gpointer request_time_user_data; RTPSessionStats stats; gboolean change_ssrc; gboolean favor_new; GstClockTime rtcp_feedback_retention_window; guint rtcp_immediate_feedback_threshold; GstClockTime last_keyframe_request; gboolean last_keyframe_all_headers; }; /** * RTPSessionClass: * @on_new_ssrc: emited when a new source is found * @on_bye_ssrc: emited when a source is gone * * The session class. */ struct _RTPSessionClass { GObjectClass parent_class; /* action signals */ RTPSource* (*get_source_by_ssrc) (RTPSession *sess, guint32 ssrc); /* signals */ void (*on_new_ssrc) (RTPSession *sess, RTPSource *source); void (*on_ssrc_collision) (RTPSession *sess, RTPSource *source); void (*on_ssrc_validated) (RTPSession *sess, RTPSource *source); void (*on_ssrc_active) (RTPSession *sess, RTPSource *source); void (*on_ssrc_sdes) (RTPSession *sess, RTPSource *source); void (*on_bye_ssrc) (RTPSession *sess, RTPSource *source); void (*on_bye_timeout) (RTPSession *sess, RTPSource *source); void (*on_timeout) (RTPSession *sess, RTPSource *source); void (*on_sender_timeout) (RTPSession *sess, RTPSource *source); gboolean (*on_sending_rtcp) (RTPSession *sess, GstBuffer *buffer, gboolean early); void (*on_feedback_rtcp) (RTPSession *sess, guint type, guint fbtype, guint sender_ssrc, guint media_ssrc, GstBuffer *fci); void (*send_rtcp) (RTPSession *sess, GstClockTimeDiff max_delay); }; GType rtp_session_get_type (void); /* create and configure */ RTPSession* rtp_session_new (void); void rtp_session_set_callbacks (RTPSession *sess, RTPSessionCallbacks *callbacks, gpointer user_data); void rtp_session_set_process_rtp_callback (RTPSession * sess, RTPSessionProcessRTP callback, gpointer user_data); void rtp_session_set_send_rtp_callback (RTPSession * sess, RTPSessionSendRTP callback, gpointer user_data); void rtp_session_set_send_rtcp_callback (RTPSession * sess, RTPSessionSendRTCP callback, gpointer user_data); void rtp_session_set_sync_rtcp_callback (RTPSession * sess, RTPSessionSyncRTCP callback, gpointer user_data); void rtp_session_set_clock_rate_callback (RTPSession * sess, RTPSessionClockRate callback, gpointer user_data); void rtp_session_set_reconsider_callback (RTPSession * sess, RTPSessionReconsider callback, gpointer user_data); void rtp_session_set_request_time_callback (RTPSession * sess, RTPSessionRequestTime callback, gpointer user_data); void rtp_session_set_bandwidth (RTPSession *sess, gdouble bandwidth); gdouble rtp_session_get_bandwidth (RTPSession *sess); void rtp_session_set_rtcp_fraction (RTPSession *sess, gdouble fraction); gdouble rtp_session_get_rtcp_fraction (RTPSession *sess); gboolean rtp_session_set_sdes_string (RTPSession *sess, GstRTCPSDESType type, const gchar *cname); gchar* rtp_session_get_sdes_string (RTPSession *sess, GstRTCPSDESType type); GstStructure * rtp_session_get_sdes_struct (RTPSession *sess); void rtp_session_set_sdes_struct (RTPSession *sess, const GstStructure *sdes); /* handling sources */ RTPSource* rtp_session_get_internal_source (RTPSession *sess); void rtp_session_set_internal_ssrc (RTPSession *sess, guint32 ssrc); guint32 rtp_session_get_internal_ssrc (RTPSession *sess); gboolean rtp_session_add_source (RTPSession *sess, RTPSource *src); guint rtp_session_get_num_sources (RTPSession *sess); guint rtp_session_get_num_active_sources (RTPSession *sess); RTPSource* rtp_session_get_source_by_ssrc (RTPSession *sess, guint32 ssrc); RTPSource* rtp_session_get_source_by_cname (RTPSession *sess, const gchar *cname); RTPSource* rtp_session_create_source (RTPSession *sess); /* processing packets from receivers */ GstFlowReturn rtp_session_process_rtp (RTPSession *sess, GstBuffer *buffer, GstClockTime current_time, GstClockTime running_time); GstFlowReturn rtp_session_process_rtcp (RTPSession *sess, GstBuffer *buffer, GstClockTime current_time, guint64 ntpnstime); /* processing packets for sending */ GstFlowReturn rtp_session_send_rtp (RTPSession *sess, gpointer data, gboolean is_list, GstClockTime current_time, GstClockTime running_time); /* stopping the session */ GstFlowReturn rtp_session_schedule_bye (RTPSession *sess, const gchar *reason, GstClockTime current_time); /* get interval for next RTCP interval */ GstClockTime rtp_session_next_timeout (RTPSession *sess, GstClockTime current_time); GstFlowReturn rtp_session_on_timeout (RTPSession *sess, GstClockTime current_time, guint64 ntpnstime, GstClockTime running_time); /* request the transmittion of an early RTCP packet */ void rtp_session_request_early_rtcp (RTPSession * sess, GstClockTime current_time, GstClockTimeDiff max_delay); /* Notify session of a request for a new key unit */ gboolean rtp_session_request_key_unit (RTPSession * sess, guint32 ssrc, GstClockTime now, gboolean fir, gint count); #endif /* __RTP_SESSION_H__ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/rtpsource.c�������������������������������������������������0000644�0001750�0001750�00000146002�11677341656�017151� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GStreamer * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.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. */ #include <string.h> #include <gst/rtp/gstrtpbuffer.h> #include <gst/rtp/gstrtcpbuffer.h> #include "rtpsource.h" GST_DEBUG_CATEGORY_STATIC (rtp_source_debug); #define GST_CAT_DEFAULT rtp_source_debug #define RTP_MAX_PROBATION_LEN 32 /* signals and args */ enum { LAST_SIGNAL }; #define DEFAULT_SSRC 0 #define DEFAULT_IS_CSRC FALSE #define DEFAULT_IS_VALIDATED FALSE #define DEFAULT_IS_SENDER FALSE #define DEFAULT_SDES NULL enum { PROP_0, PROP_SSRC, PROP_IS_CSRC, PROP_IS_VALIDATED, PROP_IS_SENDER, PROP_SDES, PROP_STATS, PROP_LAST }; /* GObject vmethods */ static void rtp_source_finalize (GObject * object); static void rtp_source_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void rtp_source_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* static guint rtp_source_signals[LAST_SIGNAL] = { 0 }; */ G_DEFINE_TYPE (RTPSource, rtp_source, G_TYPE_OBJECT); static void rtp_source_class_init (RTPSourceClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->finalize = rtp_source_finalize; gobject_class->set_property = rtp_source_set_property; gobject_class->get_property = rtp_source_get_property; g_object_class_install_property (gobject_class, PROP_SSRC, g_param_spec_uint ("ssrc", "SSRC", "The SSRC of this source", 0, G_MAXUINT, DEFAULT_SSRC, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IS_CSRC, g_param_spec_boolean ("is-csrc", "Is CSRC", "If this SSRC is acting as a contributing source", DEFAULT_IS_CSRC, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IS_VALIDATED, g_param_spec_boolean ("is-validated", "Is Validated", "If this SSRC is validated", DEFAULT_IS_VALIDATED, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IS_SENDER, g_param_spec_boolean ("is-sender", "Is Sender", "If this SSRC is a sender", DEFAULT_IS_SENDER, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * RTPSource::sdes * * The current SDES items of the source. Returns a structure with name * application/x-rtp-source-sdes and may contain the following fields: * * 'cname' G_TYPE_STRING : The canonical name * 'name' G_TYPE_STRING : The user name * 'email' G_TYPE_STRING : The user's electronic mail address * 'phone' G_TYPE_STRING : The user's phone number * 'location' G_TYPE_STRING : The geographic user location * 'tool' G_TYPE_STRING : The name of application or tool * 'note' G_TYPE_STRING : A notice about the source * * other fields may be present and these represent private items in * the SDES where the field name is the prefix. */ g_object_class_install_property (gobject_class, PROP_SDES, g_param_spec_boxed ("sdes", "SDES", "The SDES information for this source", GST_TYPE_STRUCTURE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * RTPSource::stats * * The statistics of the source. This property returns a GstStructure with * name application/x-rtp-source-stats with the following fields: * * "ssrc" G_TYPE_UINT The SSRC of this source * "internal" G_TYPE_BOOLEAN If this source is the source of the session * "validated" G_TYPE_BOOLEAN If the source is validated * "received-bye" G_TYPE_BOOLEAN If we received a BYE from this source * "is-csrc" G_TYPE_BOOLEAN If this source was found as CSRC * "is-sender" G_TYPE_BOOLEAN If this source is a sender * "seqnum-base" G_TYPE_INT first seqnum if known * "clock-rate" G_TYPE_INT the clock rate of the media * * The following two fields are only present when known. * * "rtp-from" G_TYPE_STRING where we received the last RTP packet from * "rtcp-from" G_TYPE_STRING where we received the last RTCP packet from * * The following fields make sense for internal sources and will only increase * when "is-sender" is TRUE: * * "octets-sent" G_TYPE_UINT64 number of bytes we sent * "packets-sent" G_TYPE_UINT64 number of packets we sent * * The following fields make sense for non-internal sources and will only * increase when "is-sender" is TRUE. * * "octets-received" G_TYPE_UINT64 total number of bytes received * "packets-received" G_TYPE_UINT64 total number of packets received * * Following fields are updated when "is-sender" is TRUE. * * "bitrate" G_TYPE_UINT64 bitrate in bits per second * "jitter" G_TYPE_UINT estimated jitter * "packets-lost" G_TYPE_INT estimated amount of packets lost * * The last SR report this source sent. This only updates when "is-sender" is * TRUE. * * "have-sr" G_TYPE_BOOLEAN the source has sent SR * "sr-ntptime" G_TYPE_UINT64 ntptime of SR * "sr-rtptime" G_TYPE_UINT rtptime of SR * "sr-octet-count" G_TYPE_UINT the number of bytes in the SR * "sr-packet-count" G_TYPE_UINT the number of packets in the SR * * The following fields are only present for non-internal sources and * represent the content of the last RB packet that was sent to this source. * These values are only updated when the source is sending. * * "sent-rb" G_TYPE_BOOLEAN we have sent an RB * "sent-rb-fractionlost" G_TYPE_UINT calculated lost fraction * "sent-rb-packetslost" G_TYPE_INT lost packets * "sent-rb-exthighestseq" G_TYPE_UINT last seen seqnum * "sent-rb-jitter" G_TYPE_UINT jitter * "sent-rb-lsr" G_TYPE_UINT last SR time * "sent-rb-dlsr" G_TYPE_UINT delay since last SR * * The following fields are only present for non-internal sources and * represents the last RB that this source sent. This is only updated * when the source is receiving data and sending RB blocks. * * "have-rb" G_TYPE_BOOLEAN the source has sent RB * "rb-fractionlost" G_TYPE_UINT lost fraction * "rb-packetslost" G_TYPE_INT lost packets * "rb-exthighestseq" G_TYPE_UINT highest received seqnum * "rb-jitter" G_TYPE_UINT reception jitter * "rb-lsr" G_TYPE_UINT last SR time * "rb-dlsr" G_TYPE_UINT delay since last SR * * The round trip of this source. This is calculated from the last RB * values and the recption time of the last RB packet. Only present for * non-internal sources. * * "rb-round-trip" G_TYPE_UINT the round trip time in nanoseconds */ g_object_class_install_property (gobject_class, PROP_STATS, g_param_spec_boxed ("stats", "Stats", "The stats of this source", GST_TYPE_STRUCTURE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (rtp_source_debug, "rtpsource", 0, "RTP Source"); } /** * rtp_source_reset: * @src: an #RTPSource * * Reset the stats of @src. */ void rtp_source_reset (RTPSource * src) { src->received_bye = FALSE; src->stats.cycles = -1; src->stats.jitter = 0; src->stats.transit = -1; src->stats.curr_sr = 0; src->stats.curr_rr = 0; } static void rtp_source_init (RTPSource * src) { /* sources are initialy on probation until we receive enough valid RTP * packets or a valid RTCP packet */ src->validated = FALSE; src->internal = FALSE; src->probation = RTP_DEFAULT_PROBATION; src->closing = FALSE; src->sdes = gst_structure_new ("application/x-rtp-source-sdes", NULL); src->payload = -1; src->clock_rate = -1; src->packets = g_queue_new (); src->seqnum_base = -1; src->last_rtptime = -1; src->retained_feedback = g_queue_new (); rtp_source_reset (src); } static void rtp_source_finalize (GObject * object) { RTPSource *src; GstBuffer *buffer; src = RTP_SOURCE_CAST (object); while ((buffer = g_queue_pop_head (src->packets))) gst_buffer_unref (buffer); g_queue_free (src->packets); gst_structure_free (src->sdes); g_free (src->bye_reason); gst_caps_replace (&src->caps, NULL); g_list_foreach (src->conflicting_addresses, (GFunc) g_free, NULL); g_list_free (src->conflicting_addresses); while ((buffer = g_queue_pop_head (src->retained_feedback))) gst_buffer_unref (buffer); g_queue_free (src->retained_feedback); G_OBJECT_CLASS (rtp_source_parent_class)->finalize (object); } static GstStructure * rtp_source_create_stats (RTPSource * src) { GstStructure *s; gboolean is_sender = src->is_sender; gboolean internal = src->internal; gchar address_str[GST_NETADDRESS_MAX_LEN]; gboolean have_rb; guint8 fractionlost = 0; gint32 packetslost = 0; guint32 exthighestseq = 0; guint32 jitter = 0; guint32 lsr = 0; guint32 dlsr = 0; guint32 round_trip = 0; gboolean have_sr; GstClockTime time = 0; guint64 ntptime = 0; guint32 rtptime = 0; guint32 packet_count = 0; guint32 octet_count = 0; /* common data for all types of sources */ s = gst_structure_new ("application/x-rtp-source-stats", "ssrc", G_TYPE_UINT, (guint) src->ssrc, "internal", G_TYPE_BOOLEAN, internal, "validated", G_TYPE_BOOLEAN, src->validated, "received-bye", G_TYPE_BOOLEAN, src->received_bye, "is-csrc", G_TYPE_BOOLEAN, src->is_csrc, "is-sender", G_TYPE_BOOLEAN, is_sender, "seqnum-base", G_TYPE_INT, src->seqnum_base, "clock-rate", G_TYPE_INT, src->clock_rate, NULL); /* add address and port */ if (src->have_rtp_from) { gst_netaddress_to_string (&src->rtp_from, address_str, sizeof (address_str)); gst_structure_set (s, "rtp-from", G_TYPE_STRING, address_str, NULL); } if (src->have_rtcp_from) { gst_netaddress_to_string (&src->rtcp_from, address_str, sizeof (address_str)); gst_structure_set (s, "rtcp-from", G_TYPE_STRING, address_str, NULL); } gst_structure_set (s, "octets-sent", G_TYPE_UINT64, src->stats.octets_sent, "packets-sent", G_TYPE_UINT64, src->stats.packets_sent, "octets-received", G_TYPE_UINT64, src->stats.octets_received, "packets-received", G_TYPE_UINT64, src->stats.packets_received, "bitrate", G_TYPE_UINT64, src->bitrate, "packets-lost", G_TYPE_INT, (gint) rtp_stats_get_packets_lost (&src->stats), "jitter", G_TYPE_UINT, (guint) (src->stats.jitter >> 4), NULL); /* get the last SR. */ have_sr = rtp_source_get_last_sr (src, &time, &ntptime, &rtptime, &packet_count, &octet_count); gst_structure_set (s, "have-sr", G_TYPE_BOOLEAN, have_sr, "sr-ntptime", G_TYPE_UINT64, ntptime, "sr-rtptime", G_TYPE_UINT, (guint) rtptime, "sr-octet-count", G_TYPE_UINT, (guint) octet_count, "sr-packet-count", G_TYPE_UINT, (guint) packet_count, NULL); if (!internal) { /* get the last RB we sent */ gst_structure_set (s, "sent-rb", G_TYPE_BOOLEAN, src->last_rr.is_valid, "sent-rb-fractionlost", G_TYPE_UINT, (guint) src->last_rr.fractionlost, "sent-rb-packetslost", G_TYPE_INT, (gint) src->last_rr.packetslost, "sent-rb-exthighestseq", G_TYPE_UINT, (guint) src->last_rr.exthighestseq, "sent-rb-jitter", G_TYPE_UINT, (guint) src->last_rr.jitter, "sent-rb-lsr", G_TYPE_UINT, (guint) src->last_rr.lsr, "sent-rb-dlsr", G_TYPE_UINT, (guint) src->last_rr.dlsr, NULL); /* get the last RB */ have_rb = rtp_source_get_last_rb (src, &fractionlost, &packetslost, &exthighestseq, &jitter, &lsr, &dlsr, &round_trip); gst_structure_set (s, "have-rb", G_TYPE_BOOLEAN, have_rb, "rb-fractionlost", G_TYPE_UINT, (guint) fractionlost, "rb-packetslost", G_TYPE_INT, (gint) packetslost, "rb-exthighestseq", G_TYPE_UINT, (guint) exthighestseq, "rb-jitter", G_TYPE_UINT, (guint) jitter, "rb-lsr", G_TYPE_UINT, (guint) lsr, "rb-dlsr", G_TYPE_UINT, (guint) dlsr, "rb-round-trip", G_TYPE_UINT, (guint) round_trip, NULL); } return s; } /** * rtp_source_get_sdes_struct: * @src: an #RTPSource * * Get the SDES from @src. See the SDES property for more details. * * Returns: %GstStructure of type "application/x-rtp-source-sdes". The result is * valid until the SDES items of @src are modified. */ const GstStructure * rtp_source_get_sdes_struct (RTPSource * src) { g_return_val_if_fail (RTP_IS_SOURCE (src), NULL); return src->sdes; } static gboolean sdes_struct_compare_func (GQuark field_id, const GValue * value, gpointer user_data) { GstStructure *old; const gchar *field; old = GST_STRUCTURE (user_data); field = g_quark_to_string (field_id); if (!gst_structure_has_field (old, field)) return FALSE; g_assert (G_VALUE_HOLDS_STRING (value)); return strcmp (g_value_get_string (value), gst_structure_get_string (old, field)) == 0; } /** * rtp_source_set_sdes: * @src: an #RTPSource * @sdes: the SDES structure * * Store the @sdes in @src. @sdes must be a structure of type * "application/x-rtp-source-sdes", see the SDES property for more details. * * This function takes ownership of @sdes. * * Returns: %FALSE if the SDES was unchanged. */ gboolean rtp_source_set_sdes_struct (RTPSource * src, GstStructure * sdes) { gboolean changed; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); g_return_val_if_fail (strcmp (gst_structure_get_name (sdes), "application/x-rtp-source-sdes") == 0, FALSE); changed = !gst_structure_foreach (sdes, sdes_struct_compare_func, src->sdes); if (changed) { gst_structure_free (src->sdes); src->sdes = sdes; } else { gst_structure_free (sdes); } return changed; } static void rtp_source_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { RTPSource *src; src = RTP_SOURCE (object); switch (prop_id) { case PROP_SSRC: src->ssrc = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void rtp_source_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { RTPSource *src; src = RTP_SOURCE (object); switch (prop_id) { case PROP_SSRC: g_value_set_uint (value, rtp_source_get_ssrc (src)); break; case PROP_IS_CSRC: g_value_set_boolean (value, rtp_source_is_as_csrc (src)); break; case PROP_IS_VALIDATED: g_value_set_boolean (value, rtp_source_is_validated (src)); break; case PROP_IS_SENDER: g_value_set_boolean (value, rtp_source_is_sender (src)); break; case PROP_SDES: g_value_set_boxed (value, rtp_source_get_sdes_struct (src)); break; case PROP_STATS: g_value_take_boxed (value, rtp_source_create_stats (src)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /** * rtp_source_new: * @ssrc: an SSRC * * Create a #RTPSource with @ssrc. * * Returns: a new #RTPSource. Use g_object_unref() after usage. */ RTPSource * rtp_source_new (guint32 ssrc) { RTPSource *src; src = g_object_new (RTP_TYPE_SOURCE, NULL); src->ssrc = ssrc; return src; } /** * rtp_source_set_callbacks: * @src: an #RTPSource * @cb: callback functions * @user_data: user data * * Set the callbacks for the source. */ void rtp_source_set_callbacks (RTPSource * src, RTPSourceCallbacks * cb, gpointer user_data) { g_return_if_fail (RTP_IS_SOURCE (src)); src->callbacks.push_rtp = cb->push_rtp; src->callbacks.clock_rate = cb->clock_rate; src->user_data = user_data; } /** * rtp_source_get_ssrc: * @src: an #RTPSource * * Get the SSRC of @source. * * Returns: the SSRC of src. */ guint32 rtp_source_get_ssrc (RTPSource * src) { guint32 result; g_return_val_if_fail (RTP_IS_SOURCE (src), 0); result = src->ssrc; return result; } /** * rtp_source_set_as_csrc: * @src: an #RTPSource * * Configure @src as a CSRC, this will also validate @src. */ void rtp_source_set_as_csrc (RTPSource * src) { g_return_if_fail (RTP_IS_SOURCE (src)); src->validated = TRUE; src->is_csrc = TRUE; } /** * rtp_source_is_as_csrc: * @src: an #RTPSource * * Check if @src is a contributing source. * * Returns: %TRUE if @src is acting as a contributing source. */ gboolean rtp_source_is_as_csrc (RTPSource * src) { gboolean result; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); result = src->is_csrc; return result; } /** * rtp_source_is_active: * @src: an #RTPSource * * Check if @src is an active source. A source is active if it has been * validated and has not yet received a BYE packet * * Returns: %TRUE if @src is an qactive source. */ gboolean rtp_source_is_active (RTPSource * src) { gboolean result; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); result = RTP_SOURCE_IS_ACTIVE (src); return result; } /** * rtp_source_is_validated: * @src: an #RTPSource * * Check if @src is a validated source. * * Returns: %TRUE if @src is a validated source. */ gboolean rtp_source_is_validated (RTPSource * src) { gboolean result; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); result = src->validated; return result; } /** * rtp_source_is_sender: * @src: an #RTPSource * * Check if @src is a sending source. * * Returns: %TRUE if @src is a sending source. */ gboolean rtp_source_is_sender (RTPSource * src) { gboolean result; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); result = RTP_SOURCE_IS_SENDER (src); return result; } /** * rtp_source_received_bye: * @src: an #RTPSource * * Check if @src has receoved a BYE packet. * * Returns: %TRUE if @src has received a BYE packet. */ gboolean rtp_source_received_bye (RTPSource * src) { gboolean result; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); result = src->received_bye; return result; } /** * rtp_source_get_bye_reason: * @src: an #RTPSource * * Get the BYE reason for @src. Check if the source receoved a BYE message first * with rtp_source_received_bye(). * * Returns: The BYE reason or NULL when no reason was given or the source did * not receive a BYE message yet. g_fee() after usage. */ gchar * rtp_source_get_bye_reason (RTPSource * src) { gchar *result; g_return_val_if_fail (RTP_IS_SOURCE (src), NULL); result = g_strdup (src->bye_reason); return result; } /** * rtp_source_update_caps: * @src: an #RTPSource * @caps: a #GstCaps * * Parse @caps and store all relevant information in @source. */ void rtp_source_update_caps (RTPSource * src, GstCaps * caps) { GstStructure *s; guint val; gint ival; /* nothing changed, return */ if (caps == NULL || src->caps == caps) return; s = gst_caps_get_structure (caps, 0); if (gst_structure_get_int (s, "payload", &ival)) src->payload = ival; else src->payload = -1; GST_DEBUG ("got payload %d", src->payload); if (gst_structure_get_int (s, "clock-rate", &ival)) src->clock_rate = ival; else src->clock_rate = -1; GST_DEBUG ("got clock-rate %d", src->clock_rate); if (gst_structure_get_uint (s, "seqnum-base", &val)) src->seqnum_base = val; else src->seqnum_base = -1; GST_DEBUG ("got seqnum-base %" G_GINT32_FORMAT, src->seqnum_base); gst_caps_replace (&src->caps, caps); } /** * rtp_source_set_sdes_string: * @src: an #RTPSource * @type: the type of the SDES item * @data: the SDES data * * Store an SDES item of @type in @src. * * Returns: %FALSE if the SDES item was unchanged or @type is unknown. */ gboolean rtp_source_set_sdes_string (RTPSource * src, GstRTCPSDESType type, const gchar * data) { const gchar *old; const gchar *field; field = gst_rtcp_sdes_type_to_name (type); if (gst_structure_has_field (src->sdes, field)) old = gst_structure_get_string (src->sdes, field); else old = NULL; if (old == NULL && data == NULL) return FALSE; if (old != NULL && data != NULL && strcmp (old, data) == 0) return FALSE; if (data == NULL) gst_structure_remove_field (src->sdes, field); else gst_structure_set (src->sdes, field, G_TYPE_STRING, data, NULL); return TRUE; } /** * rtp_source_get_sdes_string: * @src: an #RTPSource * @type: the type of the SDES item * * Get the SDES item of @type from @src. * * Returns: a null-terminated copy of the SDES item or NULL when @type was not * valid or the SDES item was unset. g_free() after usage. */ gchar * rtp_source_get_sdes_string (RTPSource * src, GstRTCPSDESType type) { gchar *result; const gchar *type_name; g_return_val_if_fail (RTP_IS_SOURCE (src), NULL); if (type < 0 || type > GST_RTCP_SDES_PRIV - 1) return NULL; type_name = gst_rtcp_sdes_type_to_name (type); if (!gst_structure_has_field (src->sdes, type_name)) return NULL; result = g_strdup (gst_structure_get_string (src->sdes, type_name)); return result; } /** * rtp_source_set_rtp_from: * @src: an #RTPSource * @address: the RTP address to set * * Set that @src is receiving RTP packets from @address. This is used for * collistion checking. */ void rtp_source_set_rtp_from (RTPSource * src, GstNetAddress * address) { g_return_if_fail (RTP_IS_SOURCE (src)); src->have_rtp_from = TRUE; memcpy (&src->rtp_from, address, sizeof (GstNetAddress)); } /** * rtp_source_set_rtcp_from: * @src: an #RTPSource * @address: the RTCP address to set * * Set that @src is receiving RTCP packets from @address. This is used for * collistion checking. */ void rtp_source_set_rtcp_from (RTPSource * src, GstNetAddress * address) { g_return_if_fail (RTP_IS_SOURCE (src)); src->have_rtcp_from = TRUE; memcpy (&src->rtcp_from, address, sizeof (GstNetAddress)); } static GstFlowReturn push_packet (RTPSource * src, GstBuffer * buffer) { GstFlowReturn ret = GST_FLOW_OK; /* push queued packets first if any */ while (!g_queue_is_empty (src->packets)) { GstBuffer *buffer = GST_BUFFER_CAST (g_queue_pop_head (src->packets)); GST_LOG ("pushing queued packet"); if (src->callbacks.push_rtp) src->callbacks.push_rtp (src, buffer, src->user_data); else gst_buffer_unref (buffer); } GST_LOG ("pushing new packet"); /* push packet */ if (src->callbacks.push_rtp) ret = src->callbacks.push_rtp (src, buffer, src->user_data); else gst_buffer_unref (buffer); return ret; } static gint get_clock_rate (RTPSource * src, guint8 payload) { if (src->payload == -1) { /* first payload received, nothing was in the caps, lock on to this payload */ src->payload = payload; GST_DEBUG ("first payload %d", payload); } else if (payload != src->payload) { /* we have a different payload than before, reset the clock-rate */ GST_DEBUG ("new payload %d", payload); src->payload = payload; src->clock_rate = -1; src->stats.transit = -1; } if (src->clock_rate == -1) { gint clock_rate = -1; if (src->callbacks.clock_rate) clock_rate = src->callbacks.clock_rate (src, payload, src->user_data); GST_DEBUG ("got clock-rate %d", clock_rate); src->clock_rate = clock_rate; } return src->clock_rate; } /* Jitter is the variation in the delay of received packets in a flow. It is * measured by comparing the interval when RTP packets were sent to the interval * at which they were received. For instance, if packet #1 and packet #2 leave * 50 milliseconds apart and arrive 60 milliseconds apart, then the jitter is 10 * milliseconds. */ static void calculate_jitter (RTPSource * src, GstBuffer * buffer, RTPArrivalStats * arrival) { GstClockTime running_time; guint32 rtparrival, transit, rtptime; gint32 diff; gint clock_rate; guint8 pt; /* get arrival time */ if ((running_time = arrival->running_time) == GST_CLOCK_TIME_NONE) goto no_time; pt = gst_rtp_buffer_get_payload_type (buffer); GST_LOG ("SSRC %08x got payload %d", src->ssrc, pt); /* get clockrate */ if ((clock_rate = get_clock_rate (src, pt)) == -1) goto no_clock_rate; rtptime = gst_rtp_buffer_get_timestamp (buffer); /* convert arrival time to RTP timestamp units, truncate to 32 bits, we don't * care about the absolute value, just the difference. */ rtparrival = gst_util_uint64_scale_int (running_time, clock_rate, GST_SECOND); /* transit time is difference with RTP timestamp */ transit = rtparrival - rtptime; /* get ABS diff with previous transit time */ if (src->stats.transit != -1) { if (transit > src->stats.transit) diff = transit - src->stats.transit; else diff = src->stats.transit - transit; } else diff = 0; src->stats.transit = transit; /* update jitter, the value we store is scaled up so we can keep precision. */ src->stats.jitter += diff - ((src->stats.jitter + 8) >> 4); src->stats.prev_rtptime = src->stats.last_rtptime; src->stats.last_rtptime = rtparrival; GST_LOG ("rtparrival %u, rtptime %u, clock-rate %d, diff %d, jitter: %f", rtparrival, rtptime, clock_rate, diff, (src->stats.jitter) / 16.0); return; /* ERRORS */ no_time: { GST_WARNING ("cannot get current running_time"); return; } no_clock_rate: { GST_WARNING ("cannot get clock-rate for pt %d", pt); return; } } static void init_seq (RTPSource * src, guint16 seq) { src->stats.base_seq = seq; src->stats.max_seq = seq; src->stats.bad_seq = RTP_SEQ_MOD + 1; /* so seq == bad_seq is false */ src->stats.cycles = 0; src->stats.packets_received = 0; src->stats.octets_received = 0; src->stats.bytes_received = 0; src->stats.prev_received = 0; src->stats.prev_expected = 0; GST_DEBUG ("base_seq %d", seq); } #define BITRATE_INTERVAL (2 * GST_SECOND) static void do_bitrate_estimation (RTPSource * src, GstClockTime running_time, guint64 * bytes_handled) { guint64 elapsed; if (src->prev_rtime) { elapsed = running_time - src->prev_rtime; if (elapsed > BITRATE_INTERVAL) { guint64 rate; rate = gst_util_uint64_scale (*bytes_handled, 8 * GST_SECOND, elapsed); GST_LOG ("Elapsed %" G_GUINT64_FORMAT ", bytes %" G_GUINT64_FORMAT ", rate %" G_GUINT64_FORMAT, elapsed, *bytes_handled, rate); if (src->bitrate == 0) src->bitrate = rate; else src->bitrate = ((src->bitrate * 3) + rate) / 4; src->prev_rtime = running_time; *bytes_handled = 0; } } else { GST_LOG ("Reset bitrate measurement"); src->prev_rtime = running_time; src->bitrate = 0; } } /** * rtp_source_process_rtp: * @src: an #RTPSource * @buffer: an RTP buffer * * Let @src handle the incomming RTP @buffer. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_source_process_rtp (RTPSource * src, GstBuffer * buffer, RTPArrivalStats * arrival) { GstFlowReturn result = GST_FLOW_OK; guint16 seqnr, udelta; RTPSourceStats *stats; guint16 expected; g_return_val_if_fail (RTP_IS_SOURCE (src), GST_FLOW_ERROR); g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); stats = &src->stats; seqnr = gst_rtp_buffer_get_seq (buffer); rtp_source_update_caps (src, GST_BUFFER_CAPS (buffer)); if (stats->cycles == -1) { GST_DEBUG ("received first buffer"); /* first time we heard of this source */ init_seq (src, seqnr); src->stats.max_seq = seqnr - 1; src->probation = RTP_DEFAULT_PROBATION; } udelta = seqnr - stats->max_seq; /* if we are still on probation, check seqnum */ if (src->probation) { expected = src->stats.max_seq + 1; /* when in probation, we require consecutive seqnums */ if (seqnr == expected) { /* expected packet */ GST_DEBUG ("probation: seqnr %d == expected %d", seqnr, expected); src->probation--; src->stats.max_seq = seqnr; if (src->probation == 0) { GST_DEBUG ("probation done!"); init_seq (src, seqnr); } else { GstBuffer *q; GST_DEBUG ("probation %d: queue buffer", src->probation); /* when still in probation, keep packets in a list. */ g_queue_push_tail (src->packets, buffer); /* remove packets from queue if there are too many */ while (g_queue_get_length (src->packets) > RTP_MAX_PROBATION_LEN) { q = g_queue_pop_head (src->packets); gst_buffer_unref (q); } goto done; } } else { /* unexpected seqnum in probation */ goto probation_seqnum; } } else if (udelta < RTP_MAX_DROPOUT) { /* in order, with permissible gap */ if (seqnr < stats->max_seq) { /* sequence number wrapped - count another 64K cycle. */ stats->cycles += RTP_SEQ_MOD; } stats->max_seq = seqnr; } else if (udelta <= RTP_SEQ_MOD - RTP_MAX_MISORDER) { /* the sequence number made a very large jump */ if (seqnr == stats->bad_seq) { /* two sequential packets -- assume that the other side * restarted without telling us so just re-sync * (i.e., pretend this was the first packet). */ init_seq (src, seqnr); } else { /* unacceptable jump */ stats->bad_seq = (seqnr + 1) & (RTP_SEQ_MOD - 1); goto bad_sequence; } } else { /* duplicate or reordered packet, will be filtered by jitterbuffer. */ GST_WARNING ("duplicate or reordered packet"); } src->stats.octets_received += arrival->payload_len; src->stats.bytes_received += arrival->bytes; src->stats.packets_received++; /* for the bitrate estimation */ src->bytes_received += arrival->payload_len; /* the source that sent the packet must be a sender */ src->is_sender = TRUE; src->validated = TRUE; do_bitrate_estimation (src, arrival->running_time, &src->bytes_received); GST_LOG ("seq %d, PC: %" G_GUINT64_FORMAT ", OC: %" G_GUINT64_FORMAT, seqnr, src->stats.packets_received, src->stats.octets_received); /* calculate jitter for the stats */ calculate_jitter (src, buffer, arrival); /* we're ready to push the RTP packet now */ result = push_packet (src, buffer); done: return result; /* ERRORS */ bad_sequence: { GST_WARNING ("unacceptable seqnum received"); gst_buffer_unref (buffer); return GST_FLOW_OK; } probation_seqnum: { GST_WARNING ("probation: seqnr %d != expected %d", seqnr, expected); src->probation = RTP_DEFAULT_PROBATION; src->stats.max_seq = seqnr; gst_buffer_unref (buffer); return GST_FLOW_OK; } } /** * rtp_source_process_bye: * @src: an #RTPSource * @reason: the reason for leaving * * Notify @src that a BYE packet has been received. This will make the source * inactive. */ void rtp_source_process_bye (RTPSource * src, const gchar * reason) { g_return_if_fail (RTP_IS_SOURCE (src)); GST_DEBUG ("marking SSRC %08x as BYE, reason: %s", src->ssrc, GST_STR_NULL (reason)); /* copy the reason and mark as received_bye */ g_free (src->bye_reason); src->bye_reason = g_strdup (reason); src->received_bye = TRUE; } static GstBufferListItem set_ssrc (GstBuffer ** buffer, guint group, guint idx, RTPSource * src) { *buffer = gst_buffer_make_writable (*buffer); gst_rtp_buffer_set_ssrc (*buffer, src->ssrc); return GST_BUFFER_LIST_SKIP_GROUP; } /** * rtp_source_send_rtp: * @src: an #RTPSource * @data: an RTP buffer or a list of RTP buffers * @is_list: if @data is a buffer or list * @running_time: the running time of @data * * Send @data (an RTP buffer or list of buffers) originating from @src. * This will make @src a sender. This function takes ownership of @data and * modifies the SSRC in the RTP packet to that of @src when needed. * * Returns: a #GstFlowReturn. */ GstFlowReturn rtp_source_send_rtp (RTPSource * src, gpointer data, gboolean is_list, GstClockTime running_time) { GstFlowReturn result; guint len; guint32 rtptime; guint64 ext_rtptime; guint64 rt_diff, rtp_diff; GstBufferList *list = NULL; GstBuffer *buffer = NULL; guint packets; guint32 ssrc; g_return_val_if_fail (RTP_IS_SOURCE (src), GST_FLOW_ERROR); g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR); if (is_list) { list = GST_BUFFER_LIST_CAST (data); /* We can grab the caps from the first group, since all * groups of a buffer list have same caps. */ buffer = gst_buffer_list_get (list, 0, 0); if (!buffer) goto no_buffer; } else { buffer = GST_BUFFER_CAST (data); } rtp_source_update_caps (src, GST_BUFFER_CAPS (buffer)); /* we are a sender now */ src->is_sender = TRUE; if (is_list) { /* Each group makes up a network packet. */ packets = gst_buffer_list_n_groups (list); len = gst_rtp_buffer_list_get_payload_len (list); } else { packets = 1; len = gst_rtp_buffer_get_payload_len (buffer); } /* update stats for the SR */ src->stats.packets_sent += packets; src->stats.octets_sent += len; src->bytes_sent += len; do_bitrate_estimation (src, running_time, &src->bytes_sent); if (is_list) { rtptime = gst_rtp_buffer_list_get_timestamp (list); } else { rtptime = gst_rtp_buffer_get_timestamp (buffer); } ext_rtptime = src->last_rtptime; ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); GST_LOG ("SSRC %08x, RTP %" G_GUINT64_FORMAT ", running_time %" GST_TIME_FORMAT, src->ssrc, ext_rtptime, GST_TIME_ARGS (running_time)); if (ext_rtptime > src->last_rtptime) { rtp_diff = ext_rtptime - src->last_rtptime; rt_diff = running_time - src->last_rtime; /* calc the diff so we can detect drift at the sender. This can also be used * to guestimate the clock rate if the NTP time is locked to the RTP * timestamps (as is the case when the capture device is providing the clock). */ GST_LOG ("SSRC %08x, diff RTP %" G_GUINT64_FORMAT ", diff running_time %" GST_TIME_FORMAT, src->ssrc, rtp_diff, GST_TIME_ARGS (rt_diff)); } /* we keep track of the last received RTP timestamp and the corresponding * buffer running_time so that we can use this info when constructing SR reports */ src->last_rtime = running_time; src->last_rtptime = ext_rtptime; /* push packet */ if (!src->callbacks.push_rtp) goto no_callback; if (is_list) { ssrc = gst_rtp_buffer_list_get_ssrc (list); } else { ssrc = gst_rtp_buffer_get_ssrc (buffer); } if (ssrc != src->ssrc) { /* the SSRC of the packet is not correct, make a writable buffer and * update the SSRC. This could involve a complete copy of the packet when * it is not writable. Usually the payloader will use caps negotiation to * get the correct SSRC from the session manager before pushing anything. */ /* FIXME, we don't want to warn yet because we can't inform any payloader * of the changes SSRC yet because we don't implement pad-alloc. */ GST_LOG ("updating SSRC from %08x to %08x, fix the payloader", ssrc, src->ssrc); if (is_list) { list = gst_buffer_list_make_writable (list); gst_buffer_list_foreach (list, (GstBufferListFunc) set_ssrc, src); } else { set_ssrc (&buffer, 0, 0, src); } } GST_LOG ("pushing RTP %s %" G_GUINT64_FORMAT, is_list ? "list" : "packet", src->stats.packets_sent); result = src->callbacks.push_rtp (src, data, src->user_data); return result; /* ERRORS */ no_buffer: { GST_WARNING ("no buffers in buffer list"); gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); return GST_FLOW_OK; } no_callback: { GST_WARNING ("no callback installed, dropping packet"); gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); return GST_FLOW_OK; } } /** * rtp_source_process_sr: * @src: an #RTPSource * @time: time of packet arrival * @ntptime: the NTP time in 32.32 fixed point * @rtptime: the RTP time * @packet_count: the packet count * @octet_count: the octect count * * Update the sender report in @src. */ void rtp_source_process_sr (RTPSource * src, GstClockTime time, guint64 ntptime, guint32 rtptime, guint32 packet_count, guint32 octet_count) { RTPSenderReport *curr; gint curridx; g_return_if_fail (RTP_IS_SOURCE (src)); GST_DEBUG ("got SR packet: SSRC %08x, NTP %08x:%08x, RTP %" G_GUINT32_FORMAT ", PC %" G_GUINT32_FORMAT ", OC %" G_GUINT32_FORMAT, src->ssrc, (guint32) (ntptime >> 32), (guint32) (ntptime & 0xffffffff), rtptime, packet_count, octet_count); curridx = src->stats.curr_sr ^ 1; curr = &src->stats.sr[curridx]; /* this is a sender now */ src->is_sender = TRUE; /* update current */ curr->is_valid = TRUE; curr->ntptime = ntptime; curr->rtptime = rtptime; curr->packet_count = packet_count; curr->octet_count = octet_count; curr->time = time; /* make current */ src->stats.curr_sr = curridx; src->stats.prev_rtcptime = src->stats.last_rtcptime; src->stats.last_rtcptime = time; } /** * rtp_source_process_rb: * @src: an #RTPSource * @ntpnstime: the current time in nanoseconds since 1970 * @fractionlost: fraction lost since last SR/RR * @packetslost: the cumululative number of packets lost * @exthighestseq: the extended last sequence number received * @jitter: the interarrival jitter * @lsr: the last SR packet from this source * @dlsr: the delay since last SR packet * * Update the report block in @src. */ void rtp_source_process_rb (RTPSource * src, guint64 ntpnstime, guint8 fractionlost, gint32 packetslost, guint32 exthighestseq, guint32 jitter, guint32 lsr, guint32 dlsr) { RTPReceiverReport *curr; gint curridx; guint32 ntp, A; guint64 f_ntp; g_return_if_fail (RTP_IS_SOURCE (src)); GST_DEBUG ("got RB packet: SSRC %08x, FL %2x, PL %d, HS %" G_GUINT32_FORMAT ", jitter %" G_GUINT32_FORMAT ", LSR %04x:%04x, DLSR %04x:%04x", src->ssrc, fractionlost, packetslost, exthighestseq, jitter, lsr >> 16, lsr & 0xffff, dlsr >> 16, dlsr & 0xffff); curridx = src->stats.curr_rr ^ 1; curr = &src->stats.rr[curridx]; /* update current */ curr->is_valid = TRUE; curr->fractionlost = fractionlost; curr->packetslost = packetslost; curr->exthighestseq = exthighestseq; curr->jitter = jitter; curr->lsr = lsr; curr->dlsr = dlsr; /* convert the NTP time in nanoseconds to 32.32 fixed point */ f_ntp = gst_util_uint64_scale (ntpnstime, (1LL << 32), GST_SECOND); /* calculate round trip, round the time up */ ntp = ((f_ntp + 0xffff) >> 16) & 0xffffffff; A = dlsr + lsr; if (A > 0 && ntp > A) A = ntp - A; else A = 0; curr->round_trip = A; GST_DEBUG ("NTP %04x:%04x, round trip %04x:%04x", ntp >> 16, ntp & 0xffff, A >> 16, A & 0xffff); /* make current */ src->stats.curr_rr = curridx; } /** * rtp_source_get_new_sr: * @src: an #RTPSource * @ntpnstime: the current time in nanoseconds since 1970 * @running_time: the current running_time of the pipeline. * @ntptime: the NTP time in 32.32 fixed point * @rtptime: the RTP time corresponding to @ntptime * @packet_count: the packet count * @octet_count: the octect count * * Get new values to put into a new SR report from this source. * * @running_time and @ntpnstime are captured at the same time and represent the * running time of the pipeline clock and the absolute current system time in * nanoseconds respectively. Together with the last running_time and rtp timestamp * we have observed in the source, we can generate @ntptime and @rtptime for an SR * packet. @ntptime is basically the fixed point representation of @ntpnstime * and @rtptime the associated RTP timestamp. * * Returns: %TRUE on success. */ gboolean rtp_source_get_new_sr (RTPSource * src, guint64 ntpnstime, GstClockTime running_time, guint64 * ntptime, guint32 * rtptime, guint32 * packet_count, guint32 * octet_count) { guint64 t_rtp; guint64 t_current_ntp; GstClockTimeDiff diff; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); /* We last saw a buffer with last_rtptime at last_rtime. Given a running_time * and an NTP time, we can scale the RTP timestamps so that they match the * given NTP time. for scaling, we assume that the slope of the rtptime vs * running_time vs ntptime curve is close to 1, which is certainly * sufficient for the frequency at which we report SR and the rate we send * out RTP packets. */ t_rtp = src->last_rtptime; GST_DEBUG ("last_rtime %" GST_TIME_FORMAT ", last_rtptime %" G_GUINT64_FORMAT, GST_TIME_ARGS (src->last_rtime), t_rtp); if (src->clock_rate != -1) { /* get the diff between the clock running_time and the buffer running_time. * This is the elapsed time, as measured against the pipeline clock, between * when the rtp timestamp was observed and the current running_time. * * We need to apply this diff to the RTP timestamp to get the RTP timestamp * for the given ntpnstime. */ diff = GST_CLOCK_DIFF (src->last_rtime, running_time); /* now translate the diff to RTP time, handle positive and negative cases. * If there is no diff, we already set rtptime correctly above. */ if (diff > 0) { GST_DEBUG ("running_time %" GST_TIME_FORMAT ", diff %" GST_TIME_FORMAT, GST_TIME_ARGS (running_time), GST_TIME_ARGS (diff)); t_rtp += gst_util_uint64_scale_int (diff, src->clock_rate, GST_SECOND); } else { diff = -diff; GST_DEBUG ("running_time %" GST_TIME_FORMAT ", diff -%" GST_TIME_FORMAT, GST_TIME_ARGS (running_time), GST_TIME_ARGS (diff)); t_rtp -= gst_util_uint64_scale_int (diff, src->clock_rate, GST_SECOND); } } else { GST_WARNING ("no clock-rate, cannot interpolate rtp time"); } /* convert the NTP time in nanoseconds to 32.32 fixed point */ t_current_ntp = gst_util_uint64_scale (ntpnstime, (1LL << 32), GST_SECOND); GST_DEBUG ("NTP %08x:%08x, RTP %" G_GUINT32_FORMAT, (guint32) (t_current_ntp >> 32), (guint32) (t_current_ntp & 0xffffffff), (guint32) t_rtp); if (ntptime) *ntptime = t_current_ntp; if (rtptime) *rtptime = t_rtp; if (packet_count) *packet_count = src->stats.packets_sent; if (octet_count) *octet_count = src->stats.octets_sent; return TRUE; } /** * rtp_source_get_new_rb: * @src: an #RTPSource * @time: the current time of the system clock * @fractionlost: fraction lost since last SR/RR * @packetslost: the cumululative number of packets lost * @exthighestseq: the extended last sequence number received * @jitter: the interarrival jitter * @lsr: the last SR packet from this source * @dlsr: the delay since last SR packet * * Get new values to put into a new report block from this source. * * Returns: %TRUE on success. */ gboolean rtp_source_get_new_rb (RTPSource * src, GstClockTime time, guint8 * fractionlost, gint32 * packetslost, guint32 * exthighestseq, guint32 * jitter, guint32 * lsr, guint32 * dlsr) { RTPSourceStats *stats; guint64 extended_max, expected; guint64 expected_interval, received_interval, ntptime; gint64 lost, lost_interval; guint32 fraction, LSR, DLSR; GstClockTime sr_time; stats = &src->stats; extended_max = stats->cycles + stats->max_seq; expected = extended_max - stats->base_seq + 1; GST_DEBUG ("ext_max %" G_GUINT64_FORMAT ", expected %" G_GUINT64_FORMAT ", received %" G_GUINT64_FORMAT ", base_seq %" G_GUINT32_FORMAT, extended_max, expected, stats->packets_received, stats->base_seq); lost = expected - stats->packets_received; lost = CLAMP (lost, -0x800000, 0x7fffff); expected_interval = expected - stats->prev_expected; stats->prev_expected = expected; received_interval = stats->packets_received - stats->prev_received; stats->prev_received = stats->packets_received; lost_interval = expected_interval - received_interval; if (expected_interval == 0 || lost_interval <= 0) fraction = 0; else fraction = (lost_interval << 8) / expected_interval; GST_DEBUG ("add RR for SSRC %08x", src->ssrc); /* we scaled the jitter up for additional precision */ GST_DEBUG ("fraction %" G_GUINT32_FORMAT ", lost %" G_GINT64_FORMAT ", extseq %" G_GUINT64_FORMAT ", jitter %d", fraction, lost, extended_max, stats->jitter >> 4); if (rtp_source_get_last_sr (src, &sr_time, &ntptime, NULL, NULL, NULL)) { GstClockTime diff; /* LSR is middle 32 bits of the last ntptime */ LSR = (ntptime >> 16) & 0xffffffff; diff = time - sr_time; GST_DEBUG ("last SR time diff %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); /* DLSR, delay since last SR is expressed in 1/65536 second units */ DLSR = gst_util_uint64_scale_int (diff, 65536, GST_SECOND); } else { /* No valid SR received, LSR/DLSR are set to 0 then */ GST_DEBUG ("no valid SR received"); LSR = 0; DLSR = 0; } GST_DEBUG ("LSR %04x:%04x, DLSR %04x:%04x", LSR >> 16, LSR & 0xffff, DLSR >> 16, DLSR & 0xffff); if (fractionlost) *fractionlost = fraction; if (packetslost) *packetslost = lost; if (exthighestseq) *exthighestseq = extended_max; if (jitter) *jitter = stats->jitter >> 4; if (lsr) *lsr = LSR; if (dlsr) *dlsr = DLSR; return TRUE; } /** * rtp_source_get_last_sr: * @src: an #RTPSource * @time: time of packet arrival * @ntptime: the NTP time in 32.32 fixed point * @rtptime: the RTP time * @packet_count: the packet count * @octet_count: the octect count * * Get the values of the last sender report as set with rtp_source_process_sr(). * * Returns: %TRUE if there was a valid SR report. */ gboolean rtp_source_get_last_sr (RTPSource * src, GstClockTime * time, guint64 * ntptime, guint32 * rtptime, guint32 * packet_count, guint32 * octet_count) { RTPSenderReport *curr; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); curr = &src->stats.sr[src->stats.curr_sr]; if (!curr->is_valid) return FALSE; if (ntptime) *ntptime = curr->ntptime; if (rtptime) *rtptime = curr->rtptime; if (packet_count) *packet_count = curr->packet_count; if (octet_count) *octet_count = curr->octet_count; if (time) *time = curr->time; return TRUE; } /** * rtp_source_get_last_rb: * @src: an #RTPSource * @fractionlost: fraction lost since last SR/RR * @packetslost: the cumululative number of packets lost * @exthighestseq: the extended last sequence number received * @jitter: the interarrival jitter * @lsr: the last SR packet from this source * @dlsr: the delay since last SR packet * @round_trip: the round trip time * * Get the values of the last RB report set with rtp_source_process_rb(). * * Returns: %TRUE if there was a valid SB report. */ gboolean rtp_source_get_last_rb (RTPSource * src, guint8 * fractionlost, gint32 * packetslost, guint32 * exthighestseq, guint32 * jitter, guint32 * lsr, guint32 * dlsr, guint32 * round_trip) { RTPReceiverReport *curr; g_return_val_if_fail (RTP_IS_SOURCE (src), FALSE); curr = &src->stats.rr[src->stats.curr_rr]; if (!curr->is_valid) return FALSE; if (fractionlost) *fractionlost = curr->fractionlost; if (packetslost) *packetslost = curr->packetslost; if (exthighestseq) *exthighestseq = curr->exthighestseq; if (jitter) *jitter = curr->jitter; if (lsr) *lsr = curr->lsr; if (dlsr) *dlsr = curr->dlsr; if (round_trip) *round_trip = curr->round_trip; return TRUE; } /** * rtp_source_find_conflicting_address: * @src: The source the packet came in * @address: address to check for * @time: The time when the packet that is possibly in conflict arrived * * Checks if an address which has a conflict is already known. If it is * a known conflict, remember the time * * Returns: TRUE if it was a known conflict, FALSE otherwise */ gboolean rtp_source_find_conflicting_address (RTPSource * src, GstNetAddress * address, GstClockTime time) { GList *item; for (item = g_list_first (src->conflicting_addresses); item; item = g_list_next (item)) { RTPConflictingAddress *known_conflict = item->data; if (gst_netaddress_equal (address, &known_conflict->address)) { known_conflict->time = time; return TRUE; } } return FALSE; } /** * rtp_source_add_conflicting_address: * @src: The source the packet came in * @address: address to remember * @time: The time when the packet that is in conflict arrived * * Adds a new conflict address */ void rtp_source_add_conflicting_address (RTPSource * src, GstNetAddress * address, GstClockTime time) { RTPConflictingAddress *new_conflict; new_conflict = g_new0 (RTPConflictingAddress, 1); memcpy (&new_conflict->address, address, sizeof (GstNetAddress)); new_conflict->time = time; src->conflicting_addresses = g_list_prepend (src->conflicting_addresses, new_conflict); } /** * rtp_source_timeout: * @src: The #RTPSource * @current_time: The current time * @collision_timeout: The amount of time after which a collision is timed out * @feedback_retention_window: The running time before which retained feedback * packets have to be discarded * * This is processed on each RTCP interval. It times out old collisions. * It also times out old retained feedback packets */ void rtp_source_timeout (RTPSource * src, GstClockTime current_time, GstClockTime collision_timeout, GstClockTime feedback_retention_window) { GList *item; GstRTCPPacket *pkt; item = g_list_first (src->conflicting_addresses); while (item) { RTPConflictingAddress *known_conflict = item->data; GList *next_item = g_list_next (item); if (known_conflict->time < current_time - collision_timeout) { gchar buf[40]; src->conflicting_addresses = g_list_delete_link (src->conflicting_addresses, item); gst_netaddress_to_string (&known_conflict->address, buf, 40); GST_DEBUG ("collision %p timed out: %s", known_conflict, buf); g_free (known_conflict); } item = next_item; } /* Time out AVPF packets that are older than the desired length */ while ((pkt = g_queue_peek_tail (src->retained_feedback)) && GST_BUFFER_TIMESTAMP (pkt) < feedback_retention_window) gst_buffer_unref (g_queue_pop_tail (src->retained_feedback)); } static gint compare_buffers (gconstpointer a, gconstpointer b, gpointer user_data) { const GstBuffer *bufa = a; const GstBuffer *bufb = b; return GST_BUFFER_TIMESTAMP (bufa) - GST_BUFFER_TIMESTAMP (bufb); } void rtp_source_retain_rtcp_packet (RTPSource * src, GstRTCPPacket * packet, GstClockTime running_time) { GstBuffer *buffer; buffer = gst_buffer_create_sub (packet->buffer, packet->offset, (gst_rtcp_packet_get_length (packet) + 1) * 4); GST_BUFFER_TIMESTAMP (buffer) = running_time; g_queue_insert_sorted (src->retained_feedback, buffer, compare_buffers, NULL); } gboolean rtp_source_has_retained (RTPSource * src, GCompareFunc func, gconstpointer data) { if (g_queue_find_custom (src->retained_feedback, data, func)) return TRUE; else return FALSE; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpjitterbuffer.h����������������������������������������0000644�0001750�0001750�00000005171�11671175354�021062� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Farsight Voice+Video library * * Copyright 2007 Collabora Ltd, * Copyright 2007 Nokia Corporation * @author: Philippe Kalaf <philippe.kalaf@collabora.co.uk>. * Copyright 2007 Wim Taymans <wim.taymans@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ #ifndef __GST_RTP_JITTER_BUFFER_H__ #define __GST_RTP_JITTER_BUFFER_H__ #include <gst/gst.h> #include <gst/rtp/gstrtpbuffer.h> G_BEGIN_DECLS /* #define's don't like whitespacey bits */ #define GST_TYPE_RTP_JITTER_BUFFER \ (gst_rtp_jitter_buffer_get_type()) #define GST_RTP_JITTER_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), \ GST_TYPE_RTP_JITTER_BUFFER,GstRtpJitterBuffer)) #define GST_RTP_JITTER_BUFFER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), \ GST_TYPE_RTP_JITTER_BUFFER,GstRtpJitterBufferClass)) #define GST_IS_RTP_JITTER_BUFFER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JITTER_BUFFER)) #define GST_IS_RTP_JITTER_BUFFER_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JITTER_BUFFER)) typedef struct _GstRtpJitterBuffer GstRtpJitterBuffer; typedef struct _GstRtpJitterBufferClass GstRtpJitterBufferClass; typedef struct _GstRtpJitterBufferPrivate GstRtpJitterBufferPrivate; /** * GstRtpJitterBuffer: * * Opaque jitterbuffer structure. */ struct _GstRtpJitterBuffer { GstElement parent; /*< private >*/ GstRtpJitterBufferPrivate *priv; /* FIXME: remove? */ }; struct _GstRtpJitterBufferClass { GstElementClass parent_class; /* signals */ GstCaps* (*request_pt_map) (GstRtpJitterBuffer *buffer, guint pt); void (*handle_sync) (GstRtpJitterBuffer *buffer, GstStructure *s); void (*on_npt_stop) (GstRtpJitterBuffer *buffer); /* actions */ void (*clear_pt_map) (GstRtpJitterBuffer *buffer); GstClockTime (*set_active) (GstRtpJitterBuffer *buffer, gboolean active, guint64 elapsed); }; GType gst_rtp_jitter_buffer_get_type (void); G_END_DECLS #endif /* __GST_RTP_JITTER_BUFFER_H__ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpmanager.c���������������������������������������������0000644�0001750�0001750�00000003544�11671175354�017776� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GStreamer * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.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 "gstrtpbin.h" #include "gstrtpjitterbuffer.h" #include "gstrtpptdemux.h" #include "gstrtpsession.h" #include "gstrtpssrcdemux.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "gstrtpbin", GST_RANK_NONE, GST_TYPE_RTP_BIN)) return FALSE; if (!gst_element_register (plugin, "gstrtpjitterbuffer", GST_RANK_NONE, GST_TYPE_RTP_JITTER_BUFFER)) return FALSE; if (!gst_element_register (plugin, "gstrtpptdemux", GST_RANK_NONE, GST_TYPE_RTP_PT_DEMUX)) return FALSE; if (!gst_element_register (plugin, "gstrtpsession", GST_RANK_NONE, GST_TYPE_RTP_SESSION)) return FALSE; if (!gst_element_register (plugin, "gstrtpssrcdemux", GST_RANK_NONE, GST_TYPE_RTP_SSRC_DEMUX)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "gstrtpmanager", "RTP session management plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) ������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/rtpjitterbuffer.h�������������������������������������������0000644�0001750�0001750�00000012532�11671175354�020343� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GStreamer * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __RTP_JITTER_BUFFER_H__ #define __RTP_JITTER_BUFFER_H__ #include <gst/gst.h> #include <gst/rtp/gstrtcpbuffer.h> typedef struct _RTPJitterBuffer RTPJitterBuffer; typedef struct _RTPJitterBufferClass RTPJitterBufferClass; #define RTP_TYPE_JITTER_BUFFER (rtp_jitter_buffer_get_type()) #define RTP_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_JITTER_BUFFER,RTPJitterBuffer)) #define RTP_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_JITTER_BUFFER,RTPJitterBufferClass)) #define RTP_IS_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_JITTER_BUFFER)) #define RTP_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_JITTER_BUFFER)) #define RTP_JITTER_BUFFER_CAST(src) ((RTPJitterBuffer *)(src)) /** * RTPJitterBufferMode: * * RTP_JITTER_BUFFER_MODE_NONE: don't do any skew correction, outgoing * timestamps are calculated directly from the RTP timestamps. This mode is * good for recording but not for real-time applications. * RTP_JITTER_BUFFER_MODE_SLAVE: calculate the skew between sender and receiver * and produce smoothed adjusted outgoing timestamps. This mode is good for * low latency communications. * RTP_JITTER_BUFFER_MODE_BUFFER: buffer packets between low/high watermarks. * This mode is good for streaming communication. * RTP_JITTER_BUFFER_MODE_LAST: last buffer mode. * * The different buffer modes for a jitterbuffer. */ typedef enum { RTP_JITTER_BUFFER_MODE_NONE = 0, RTP_JITTER_BUFFER_MODE_SLAVE = 1, RTP_JITTER_BUFFER_MODE_BUFFER = 2, RTP_JITTER_BUFFER_MODE_LAST } RTPJitterBufferMode; #define RTP_TYPE_JITTER_BUFFER_MODE (rtp_jitter_buffer_mode_get_type()) GType rtp_jitter_buffer_mode_get_type (void); #define RTP_JITTER_BUFFER_MAX_WINDOW 512 /** * RTPJitterBuffer: * * A JitterBuffer in the #RTPSession */ struct _RTPJitterBuffer { GObject object; GQueue *packets; RTPJitterBufferMode mode; GstClockTime delay; /* for buffering */ gboolean buffering; guint64 low_level; guint64 high_level; /* for calculating skew */ GstClockTime base_time; GstClockTime base_rtptime; guint32 clock_rate; GstClockTime base_extrtp; GstClockTime prev_out_time; guint64 ext_rtptime; guint64 last_rtptime; gint64 window[RTP_JITTER_BUFFER_MAX_WINDOW]; guint window_pos; guint window_size; gboolean window_filling; gint64 window_min; gint64 skew; gint64 prev_send_diff; }; struct _RTPJitterBufferClass { GObjectClass parent_class; }; GType rtp_jitter_buffer_get_type (void); /* managing lifetime */ RTPJitterBuffer* rtp_jitter_buffer_new (void); RTPJitterBufferMode rtp_jitter_buffer_get_mode (RTPJitterBuffer *jbuf); void rtp_jitter_buffer_set_mode (RTPJitterBuffer *jbuf, RTPJitterBufferMode mode); GstClockTime rtp_jitter_buffer_get_delay (RTPJitterBuffer *jbuf); void rtp_jitter_buffer_set_delay (RTPJitterBuffer *jbuf, GstClockTime delay); void rtp_jitter_buffer_reset_skew (RTPJitterBuffer *jbuf); gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf, GstBuffer *buf, GstClockTime time, guint32 clock_rate, gboolean *tail, gint *percent); GstBuffer * rtp_jitter_buffer_peek (RTPJitterBuffer *jbuf); GstBuffer * rtp_jitter_buffer_pop (RTPJitterBuffer *jbuf, gint *percent); void rtp_jitter_buffer_flush (RTPJitterBuffer *jbuf); gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf); void rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering); gint rtp_jitter_buffer_get_percent (RTPJitterBuffer * jbuf); guint rtp_jitter_buffer_num_packets (RTPJitterBuffer *jbuf); guint32 rtp_jitter_buffer_get_ts_diff (RTPJitterBuffer *jbuf); void rtp_jitter_buffer_get_sync (RTPJitterBuffer *jbuf, guint64 *rtptime, guint64 *timestamp, guint32 *clock_rate, guint64 *last_rtptime); #endif /* __RTP_JITTER_BUFFER_H__ */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/rtpstats.c��������������������������������������������������0000644�0001750�0001750�00000021260�11671175354�016777� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GStreamer * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.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. */ #include "rtpstats.h" /** * rtp_stats_init_defaults: * @stats: an #RTPSessionStats struct * * Initialize @stats with its default values. */ void rtp_stats_init_defaults (RTPSessionStats * stats) { rtp_stats_set_bandwidths (stats, -1, -1, -1, -1); stats->min_interval = RTP_STATS_MIN_INTERVAL; stats->bye_timeout = RTP_STATS_BYE_TIMEOUT; } /** * rtp_stats_set_bandwidths: * @stats: an #RTPSessionStats struct * @rtp_bw: RTP bandwidth * @rtcp_bw: RTCP bandwidth * @rs: sender RTCP bandwidth * @rr: receiver RTCP bandwidth * * Configure the bandwidth parameters in the stats. When an input variable is * set to -1, it will be calculated from the other input variables and from the * defaults. */ void rtp_stats_set_bandwidths (RTPSessionStats * stats, guint rtp_bw, gdouble rtcp_bw, guint rs, guint rr) { GST_DEBUG ("recalc bandwidths: RTP %u, RTCP %f, RS %u, RR %u", rtp_bw, rtcp_bw, rs, rr); /* when given, sender and receive bandwidth add up to the total * rtcp bandwidth */ if (rs != -1 && rr != -1) rtcp_bw = rs + rr; /* If rtcp_bw is between 0 and 1, it is a fraction of rtp_bw */ if (rtcp_bw > 0.0 && rtcp_bw < 1.0) { if (rtp_bw > 0.0) rtcp_bw = rtp_bw * rtcp_bw; else rtcp_bw = -1.0; } /* RTCP is 5% of the RTP bandwidth */ if (rtp_bw == -1 && rtcp_bw > 1.0) rtp_bw = rtcp_bw * 20; else if (rtp_bw != -1 && rtcp_bw < 0.0) rtcp_bw = rtp_bw / 20; else if (rtp_bw == -1 && rtcp_bw < 0.0) { /* nothing given, take defaults */ rtp_bw = RTP_STATS_BANDWIDTH; rtcp_bw = rtp_bw * RTP_STATS_RTCP_FRACTION; } stats->bandwidth = rtp_bw; stats->rtcp_bandwidth = rtcp_bw; /* now figure out the fractions */ if (rs == -1) { /* rs unknown */ if (rr == -1) { /* both not given, use defaults */ rs = stats->rtcp_bandwidth * RTP_STATS_SENDER_FRACTION; rr = stats->rtcp_bandwidth * RTP_STATS_RECEIVER_FRACTION; } else { /* rr known, calculate rs */ if (stats->rtcp_bandwidth > rr) rs = stats->rtcp_bandwidth - rr; else rs = 0; } } else if (rr == -1) { /* rs known, calculate rr */ if (stats->rtcp_bandwidth > rs) rr = stats->rtcp_bandwidth - rs; else rr = 0; } if (stats->rtcp_bandwidth > 0) { stats->sender_fraction = ((gdouble) rs) / ((gdouble) stats->rtcp_bandwidth); stats->receiver_fraction = 1.0 - stats->sender_fraction; } else { /* no RTCP bandwidth, set dummy values */ stats->sender_fraction = 0.0; stats->receiver_fraction = 0.0; } GST_DEBUG ("bandwidths: RTP %u, RTCP %u, RS %f, RR %f", stats->bandwidth, stats->rtcp_bandwidth, stats->sender_fraction, stats->receiver_fraction); } /** * rtp_stats_calculate_rtcp_interval: * @stats: an #RTPSessionStats struct * @sender: if we are a sender * @first: if this is the first time * * Calculate the RTCP interval. The result of this function is the amount of * time to wait (in nanoseconds) before sending a new RTCP message. * * Returns: the RTCP interval. */ GstClockTime rtp_stats_calculate_rtcp_interval (RTPSessionStats * stats, gboolean we_send, gboolean first) { gdouble members, senders, n; gdouble avg_rtcp_size, rtcp_bw; gdouble interval; gdouble rtcp_min_time; /* Very first call at application start-up uses half the min * delay for quicker notification while still allowing some time * before reporting for randomization and to learn about other * sources so the report interval will converge to the correct * interval more quickly. */ rtcp_min_time = stats->min_interval; if (first) rtcp_min_time /= 2.0; /* Dedicate a fraction of the RTCP bandwidth to senders unless * the number of senders is large enough that their share is * more than that fraction. */ n = members = stats->active_sources; senders = (gdouble) stats->sender_sources; rtcp_bw = stats->rtcp_bandwidth; if (senders <= members * stats->sender_fraction) { if (we_send) { rtcp_bw *= stats->sender_fraction; n = senders; } else { rtcp_bw *= stats->receiver_fraction; n -= senders; } } /* no bandwidth for RTCP, return NONE to signal that we don't want to send * RTCP packets */ if (rtcp_bw <= 0.00001) return GST_CLOCK_TIME_NONE; avg_rtcp_size = stats->avg_rtcp_packet_size; /* * The effective number of sites times the average packet size is * the total number of octets sent when each site sends a report. * Dividing this by the effective bandwidth gives the time * interval over which those packets must be sent in order to * meet the bandwidth target, with a minimum enforced. In that * time interval we send one report so this time is also our * average time between reports. */ GST_DEBUG ("avg size %f, n %f, rtcp_bw %f", avg_rtcp_size, n, rtcp_bw); interval = avg_rtcp_size * n / rtcp_bw; if (interval < rtcp_min_time) interval = rtcp_min_time; return interval * GST_SECOND; } /** * rtp_stats_add_rtcp_jitter: * @stats: an #RTPSessionStats struct * @interval: an RTCP interval * * Apply a random jitter to the @interval. @interval is typically obtained with * rtp_stats_calculate_rtcp_interval(). * * Returns: the new RTCP interval. */ GstClockTime rtp_stats_add_rtcp_jitter (RTPSessionStats * stats, GstClockTime interval) { gdouble temp; /* see RFC 3550 p 30 * To compensate for "unconditional reconsideration" converging to a * value below the intended average. */ #define COMPENSATION (2.71828 - 1.5); temp = (interval * g_random_double_range (0.5, 1.5)) / COMPENSATION; return (GstClockTime) temp; } /** * rtp_stats_calculate_bye_interval: * @stats: an #RTPSessionStats struct * * Calculate the BYE interval. The result of this function is the amount of * time to wait (in nanoseconds) before sending a BYE message. * * Returns: the BYE interval. */ GstClockTime rtp_stats_calculate_bye_interval (RTPSessionStats * stats) { gdouble members; gdouble avg_rtcp_size, rtcp_bw; gdouble interval; gdouble rtcp_min_time; /* no interval when we have less than 50 members */ if (stats->active_sources < 50) return 0; rtcp_min_time = (stats->min_interval) / 2.0; /* Dedicate a fraction of the RTCP bandwidth to senders unless * the number of senders is large enough that their share is * more than that fraction. */ members = stats->bye_members; rtcp_bw = stats->rtcp_bandwidth * stats->receiver_fraction; /* no bandwidth for RTCP, return NONE to signal that we don't want to send * RTCP packets */ if (rtcp_bw <= 0.0001) return GST_CLOCK_TIME_NONE; avg_rtcp_size = stats->avg_rtcp_packet_size; /* * The effective number of sites times the average packet size is * the total number of octets sent when each site sends a report. * Dividing this by the effective bandwidth gives the time * interval over which those packets must be sent in order to * meet the bandwidth target, with a minimum enforced. In that * time interval we send one report so this time is also our * average time between reports. */ interval = avg_rtcp_size * members / rtcp_bw; if (interval < rtcp_min_time) interval = rtcp_min_time; return interval * GST_SECOND; } /** * rtp_stats_get_packets_lost: * @stats: an #RTPSourceStats struct * * Calculate the total number of RTP packets lost since beginning of * reception. Packets that arrive late are not considered lost, and * duplicates are not taken into account. Hence, the loss may be negative * if there are duplicates. * * Returns: total RTP packets lost. */ gint64 rtp_stats_get_packets_lost (const RTPSourceStats * stats) { gint64 lost; guint64 extended_max, expected; extended_max = stats->cycles + stats->max_seq; expected = extended_max - stats->base_seq + 1; lost = expected - stats->packets_received; return lost; } void rtp_stats_set_min_interval (RTPSessionStats * stats, gdouble min_interval) { stats->min_interval = min_interval; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpbin-marshal.list��������������������������������������0000644�0001750�0001750�00000000215�11671175354�021302� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������UINT:UINT BOXED:UINT BOXED:UINT,UINT OBJECT:UINT VOID:UINT,OBJECT VOID:UINT VOID:UINT,UINT VOID:OBJECT,OBJECT UINT64:BOOL,UINT64 VOID:UINT64 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpsession.h���������������������������������������������0000644�0001750�0001750�00000005476�11671175354�020062� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GStreamer * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_RTP_SESSION_H__ #define __GST_RTP_SESSION_H__ #include <gst/gst.h> #define GST_TYPE_RTP_SESSION \ (gst_rtp_session_get_type()) #define GST_RTP_SESSION(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SESSION,GstRtpSession)) #define GST_RTP_SESSION_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SESSION,GstRtpSessionClass)) #define GST_IS_RTP_SESSION(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SESSION)) #define GST_IS_RTP_SESSION_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SESSION)) #define GST_RTP_SESSION_CAST(obj) ((GstRtpSession *)(obj)) typedef struct _GstRtpSession GstRtpSession; typedef struct _GstRtpSessionClass GstRtpSessionClass; typedef struct _GstRtpSessionPrivate GstRtpSessionPrivate; struct _GstRtpSession { GstElement element; /*< private >*/ GstPad *recv_rtp_sink; GstSegment recv_rtp_seg; GstPad *recv_rtcp_sink; GstPad *send_rtp_sink; GstSegment send_rtp_seg; GstPad *recv_rtp_src; GstPad *sync_src; GstPad *send_rtp_src; GstPad *send_rtcp_src; GstRtpSessionPrivate *priv; }; struct _GstRtpSessionClass { GstElementClass parent_class; /* signals */ GstCaps* (*request_pt_map) (GstRtpSession *sess, guint pt); void (*clear_pt_map) (GstRtpSession *sess); void (*on_new_ssrc) (GstRtpSession *sess, guint32 ssrc); void (*on_ssrc_collision) (GstRtpSession *sess, guint32 ssrc); void (*on_ssrc_validated) (GstRtpSession *sess, guint32 ssrc); void (*on_ssrc_active) (GstRtpSession *sess, guint32 ssrc); void (*on_ssrc_sdes) (GstRtpSession *sess, guint32 ssrc); void (*on_bye_ssrc) (GstRtpSession *sess, guint32 ssrc); void (*on_bye_timeout) (GstRtpSession *sess, guint32 ssrc); void (*on_timeout) (GstRtpSession *sess, guint32 ssrc); void (*on_sender_timeout) (GstRtpSession *sess, guint32 ssrc); }; GType gst_rtp_session_get_type (void); #endif /* __GST_RTP_SESSION_H__ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpjitterbuffer.c����������������������������������������0000644�0001750�0001750�00000213106�11677341656�021062� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Farsight Voice+Video library * * Copyright 2007 Collabora Ltd, * Copyright 2007 Nokia Corporation * @author: Philippe Kalaf <philippe.kalaf@collabora.co.uk>. * Copyright 2007 Wim Taymans <wim.taymans@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ /** * SECTION:element-gstrtpjitterbuffer * * This element reorders and removes duplicate RTP packets as they are received * from a network source. It will also wait for missing packets up to a * configurable time limit using the #GstRtpJitterBuffer:latency property. * Packets arriving too late are considered to be lost packets. * * This element acts as a live element and so adds #GstRtpJitterBuffer:latency * to the pipeline. * * The element needs the clock-rate of the RTP payload in order to estimate the * delay. This information is obtained either from the caps on the sink pad or, * when no caps are present, from the #GstRtpJitterBuffer::request-pt-map signal. * To clear the previous pt-map use the #GstRtpJitterBuffer::clear-pt-map signal. * * This element will automatically be used inside gstrtpbin. * * <refsect2> * <title>Example pipelines * |[ * gst-launch rtspsrc location=rtsp://192.168.1.133:8554/mpeg1or2AudioVideoTest ! gstrtpjitterbuffer ! rtpmpvdepay ! mpeg2dec ! xvimagesink * ]| Connect to a streaming server and decode the MPEG video. The jitterbuffer is * inserted into the pipeline to smooth out network jitter and to reorder the * out-of-order RTP packets. * * * Last reviewed on 2007-05-28 (0.10.5) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gstrtpbin-marshal.h" #include "gstrtpjitterbuffer.h" #include "rtpjitterbuffer.h" #include "rtpstats.h" #include GST_DEBUG_CATEGORY (rtpjitterbuffer_debug); #define GST_CAT_DEFAULT (rtpjitterbuffer_debug) /* RTPJitterBuffer signals and args */ enum { SIGNAL_REQUEST_PT_MAP, SIGNAL_CLEAR_PT_MAP, SIGNAL_HANDLE_SYNC, SIGNAL_ON_NPT_STOP, SIGNAL_SET_ACTIVE, LAST_SIGNAL }; #define DEFAULT_LATENCY_MS 200 #define DEFAULT_DROP_ON_LATENCY FALSE #define DEFAULT_TS_OFFSET 0 #define DEFAULT_DO_LOST FALSE #define DEFAULT_MODE RTP_JITTER_BUFFER_MODE_SLAVE #define DEFAULT_PERCENT 0 enum { PROP_0, PROP_LATENCY, PROP_DROP_ON_LATENCY, PROP_TS_OFFSET, PROP_DO_LOST, PROP_MODE, PROP_PERCENT, PROP_LAST }; #define JBUF_LOCK(priv) (g_mutex_lock ((priv)->jbuf_lock)) #define JBUF_LOCK_CHECK(priv,label) G_STMT_START { \ JBUF_LOCK (priv); \ if (G_UNLIKELY (priv->srcresult != GST_FLOW_OK)) \ goto label; \ } G_STMT_END #define JBUF_UNLOCK(priv) (g_mutex_unlock ((priv)->jbuf_lock)) #define JBUF_WAIT(priv) (g_cond_wait ((priv)->jbuf_cond, (priv)->jbuf_lock)) #define JBUF_WAIT_CHECK(priv,label) G_STMT_START { \ JBUF_WAIT(priv); \ if (G_UNLIKELY (priv->srcresult != GST_FLOW_OK)) \ goto label; \ } G_STMT_END #define JBUF_SIGNAL(priv) (g_cond_signal ((priv)->jbuf_cond)) struct _GstRtpJitterBufferPrivate { GstPad *sinkpad, *srcpad; GstPad *rtcpsinkpad; RTPJitterBuffer *jbuf; GMutex *jbuf_lock; GCond *jbuf_cond; gboolean waiting; gboolean discont; gboolean active; guint64 out_offset; /* properties */ guint latency_ms; guint64 latency_ns; gboolean drop_on_latency; gint64 ts_offset; gboolean do_lost; /* the last seqnum we pushed out */ guint32 last_popped_seqnum; /* the next expected seqnum we push */ guint32 next_seqnum; /* last output time */ GstClockTime last_out_time; /* the next expected seqnum we receive */ guint32 next_in_seqnum; /* start and stop ranges */ GstClockTime npt_start; GstClockTime npt_stop; guint64 ext_timestamp; guint64 last_elapsed; guint64 estimated_eos; GstClockID eos_id; gboolean reached_npt_stop; /* state */ gboolean eos; /* clock rate and rtp timestamp offset */ gint last_pt; gint32 clock_rate; gint64 clock_base; gint64 prev_ts_offset; /* when we are shutting down */ GstFlowReturn srcresult; gboolean blocked; /* for sync */ GstSegment segment; GstClockID clock_id; gboolean unscheduled; /* the latency of the upstream peer, we have to take this into account when * synchronizing the buffers. */ GstClockTime peer_latency; /* some accounting */ guint64 num_late; guint64 num_duplicates; }; #define GST_RTP_JITTER_BUFFER_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_RTP_JITTER_BUFFER, \ GstRtpJitterBufferPrivate)) static GstStaticPadTemplate gst_rtp_jitter_buffer_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "clock-rate = (int) [ 1, 2147483647 ]" /* "payload = (int) , " * "encoding-name = (string) " */ ) ); static GstStaticPadTemplate gst_rtp_jitter_buffer_sink_rtcp_template = GST_STATIC_PAD_TEMPLATE ("sink_rtcp", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate gst_rtp_jitter_buffer_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp" /* "payload = (int) , " * "clock-rate = (int) , " * "encoding-name = (string) " */ ) ); static guint gst_rtp_jitter_buffer_signals[LAST_SIGNAL] = { 0 }; GST_BOILERPLATE (GstRtpJitterBuffer, gst_rtp_jitter_buffer, GstElement, GST_TYPE_ELEMENT); /* object overrides */ static void gst_rtp_jitter_buffer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_jitter_buffer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_jitter_buffer_finalize (GObject * object); /* element overrides */ static GstStateChangeReturn gst_rtp_jitter_buffer_change_state (GstElement * element, GstStateChange transition); static GstPad *gst_rtp_jitter_buffer_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_rtp_jitter_buffer_release_pad (GstElement * element, GstPad * pad); static GstClock *gst_rtp_jitter_buffer_provide_clock (GstElement * element); /* pad overrides */ static GstCaps *gst_rtp_jitter_buffer_getcaps (GstPad * pad); static GstIterator *gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad); /* sinkpad overrides */ static gboolean gst_jitter_buffer_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_rtp_jitter_buffer_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_rtp_jitter_buffer_sink_rtcp_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, GstBuffer * buffer); /* srcpad overrides */ static gboolean gst_rtp_jitter_buffer_src_event (GstPad * pad, GstEvent * event); static gboolean gst_rtp_jitter_buffer_src_activate_push (GstPad * pad, gboolean active); static void gst_rtp_jitter_buffer_loop (GstRtpJitterBuffer * jitterbuffer); static gboolean gst_rtp_jitter_buffer_query (GstPad * pad, GstQuery * query); static void gst_rtp_jitter_buffer_clear_pt_map (GstRtpJitterBuffer * jitterbuffer); static GstClockTime gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jitterbuffer, gboolean active, guint64 base_time); static void gst_rtp_jitter_buffer_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jitter_buffer_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jitter_buffer_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jitter_buffer_sink_rtcp_template); gst_element_class_set_details_simple (element_class, "RTP packet jitter-buffer", "Filter/Network/RTP", "A buffer that deals with network jitter and other transmission faults", "Philippe Kalaf , " "Wim Taymans "); } static void gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; g_type_class_add_private (klass, sizeof (GstRtpJitterBufferPrivate)); gobject_class->finalize = gst_rtp_jitter_buffer_finalize; gobject_class->set_property = gst_rtp_jitter_buffer_set_property; gobject_class->get_property = gst_rtp_jitter_buffer_get_property; /** * GstRtpJitterBuffer::latency: * * The maximum latency of the jitterbuffer. Packets will be kept in the buffer * for at most this time. */ g_object_class_install_property (gobject_class, PROP_LATENCY, g_param_spec_uint ("latency", "Buffer latency in ms", "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpJitterBuffer::drop-on-latency: * * Drop oldest buffers when the queue is completely filled. */ g_object_class_install_property (gobject_class, PROP_DROP_ON_LATENCY, g_param_spec_boolean ("drop-on-latency", "Drop buffers when maximum latency is reached", "Tells the jitterbuffer to never exceed the given latency in size", DEFAULT_DROP_ON_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpJitterBuffer::ts-offset: * * Adjust GStreamer output buffer timestamps in the jitterbuffer with offset. * This is mainly used to ensure interstream synchronisation. */ g_object_class_install_property (gobject_class, PROP_TS_OFFSET, g_param_spec_int64 ("ts-offset", "Timestamp Offset", "Adjust buffer timestamps with offset in nanoseconds", G_MININT64, G_MAXINT64, DEFAULT_TS_OFFSET, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpJitterBuffer::do-lost: * * Send out a GstRTPPacketLost event downstream when a packet is considered * lost. */ g_object_class_install_property (gobject_class, PROP_DO_LOST, g_param_spec_boolean ("do-lost", "Do Lost", "Send an event downstream when a packet is lost", DEFAULT_DO_LOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpJitterBuffer::mode: * * Control the buffering and timestamping mode used by the jitterbuffer. */ g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "Control the buffering algorithm in use", RTP_TYPE_JITTER_BUFFER_MODE, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpJitterBuffer::percent: * * The percent of the jitterbuffer that is filled. * * Since: 0.10.19 */ g_object_class_install_property (gobject_class, PROP_PERCENT, g_param_spec_int ("percent", "percent", "The buffer filled percent", 0, 100, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** * GstRtpJitterBuffer::request-pt-map: * @buffer: the object which received the signal * @pt: the pt * * Request the payload type as #GstCaps for @pt. */ gst_rtp_jitter_buffer_signals[SIGNAL_REQUEST_PT_MAP] = g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpJitterBufferClass, request_pt_map), NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT, GST_TYPE_CAPS, 1, G_TYPE_UINT); /** * GstRtpJitterBuffer::handle-sync: * @buffer: the object which received the signal * @struct: a GstStructure containing sync values. * * Be notified of new sync values. */ gst_rtp_jitter_buffer_signals[SIGNAL_HANDLE_SYNC] = g_signal_new ("handle-sync", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpJitterBufferClass, handle_sync), NULL, NULL, g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_STRUCTURE | G_SIGNAL_TYPE_STATIC_SCOPE); /** * GstRtpJitterBuffer::on-npt-stop * @buffer: the object which received the signal * * Signal that the jitterbufer has pushed the RTP packet that corresponds to * the npt-stop position. */ gst_rtp_jitter_buffer_signals[SIGNAL_ON_NPT_STOP] = g_signal_new ("on-npt-stop", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpJitterBufferClass, on_npt_stop), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** * GstRtpJitterBuffer::clear-pt-map: * @buffer: the object which received the signal * * Invalidate the clock-rate as obtained with the * #GstRtpJitterBuffer::request-pt-map signal. */ gst_rtp_jitter_buffer_signals[SIGNAL_CLEAR_PT_MAP] = g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpJitterBufferClass, clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** * GstRtpJitterBuffer::set-active: * @buffer: the object which received the signal * * Start pushing out packets with the given base time. This signal is only * useful in buffering mode. * * Returns: the time of the last pushed packet. * * Since: 0.10.19 */ gst_rtp_jitter_buffer_signals[SIGNAL_SET_ACTIVE] = g_signal_new ("set-active", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpJitterBufferClass, set_active), NULL, NULL, gst_rtp_bin_marshal_UINT64__BOOL_UINT64, G_TYPE_UINT64, 2, G_TYPE_BOOLEAN, G_TYPE_UINT64); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_change_state); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_release_pad); gstelement_class->provide_clock = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_provide_clock); klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_clear_pt_map); klass->set_active = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_set_active); GST_DEBUG_CATEGORY_INIT (rtpjitterbuffer_debug, "gstrtpjitterbuffer", 0, "RTP Jitter Buffer"); } static void gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer, GstRtpJitterBufferClass * klass) { GstRtpJitterBufferPrivate *priv; priv = GST_RTP_JITTER_BUFFER_GET_PRIVATE (jitterbuffer); jitterbuffer->priv = priv; priv->latency_ms = DEFAULT_LATENCY_MS; priv->latency_ns = priv->latency_ms * GST_MSECOND; priv->drop_on_latency = DEFAULT_DROP_ON_LATENCY; priv->do_lost = DEFAULT_DO_LOST; priv->jbuf = rtp_jitter_buffer_new (); priv->jbuf_lock = g_mutex_new (); priv->jbuf_cond = g_cond_new (); /* reset skew detection initialy */ rtp_jitter_buffer_reset_skew (priv->jbuf); rtp_jitter_buffer_set_delay (priv->jbuf, priv->latency_ns); rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE); priv->active = TRUE; priv->srcpad = gst_pad_new_from_static_template (&gst_rtp_jitter_buffer_src_template, "src"); gst_pad_set_activatepush_function (priv->srcpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_src_activate_push)); gst_pad_set_query_function (priv->srcpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_query)); gst_pad_set_getcaps_function (priv->srcpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_getcaps)); gst_pad_set_event_function (priv->srcpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_src_event)); priv->sinkpad = gst_pad_new_from_static_template (&gst_rtp_jitter_buffer_sink_template, "sink"); gst_pad_set_chain_function (priv->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_chain)); gst_pad_set_event_function (priv->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_sink_event)); gst_pad_set_setcaps_function (priv->sinkpad, GST_DEBUG_FUNCPTR (gst_jitter_buffer_sink_setcaps)); gst_pad_set_getcaps_function (priv->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_getcaps)); gst_element_add_pad (GST_ELEMENT (jitterbuffer), priv->srcpad); gst_element_add_pad (GST_ELEMENT (jitterbuffer), priv->sinkpad); } static void gst_rtp_jitter_buffer_finalize (GObject * object) { GstRtpJitterBuffer *jitterbuffer; jitterbuffer = GST_RTP_JITTER_BUFFER (object); g_mutex_free (jitterbuffer->priv->jbuf_lock); g_cond_free (jitterbuffer->priv->jbuf_cond); g_object_unref (jitterbuffer->priv->jbuf); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstIterator * gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad) { GstRtpJitterBuffer *jitterbuffer; GstPad *otherpad = NULL; GstIterator *it; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (pad == jitterbuffer->priv->sinkpad) { otherpad = jitterbuffer->priv->srcpad; } else if (pad == jitterbuffer->priv->srcpad) { otherpad = jitterbuffer->priv->sinkpad; } else if (pad == jitterbuffer->priv->rtcpsinkpad) { otherpad = NULL; } it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); gst_object_unref (jitterbuffer); return it; } static GstPad * create_rtcp_sink (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; GST_DEBUG_OBJECT (jitterbuffer, "creating RTCP sink pad"); priv->rtcpsinkpad = gst_pad_new_from_static_template (&gst_rtp_jitter_buffer_sink_rtcp_template, "sink_rtcp"); gst_pad_set_chain_function (priv->rtcpsinkpad, gst_rtp_jitter_buffer_chain_rtcp); gst_pad_set_event_function (priv->rtcpsinkpad, (GstPadEventFunction) gst_rtp_jitter_buffer_sink_rtcp_event); gst_pad_set_iterate_internal_links_function (priv->rtcpsinkpad, gst_rtp_jitter_buffer_iterate_internal_links); gst_pad_set_active (priv->rtcpsinkpad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (jitterbuffer), priv->rtcpsinkpad); return priv->rtcpsinkpad; } static void remove_rtcp_sink (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; GST_DEBUG_OBJECT (jitterbuffer, "removing RTCP sink pad"); gst_pad_set_active (priv->rtcpsinkpad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (jitterbuffer), priv->rtcpsinkpad); priv->rtcpsinkpad = NULL; } static GstPad * gst_rtp_jitter_buffer_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name) { GstRtpJitterBuffer *jitterbuffer; GstElementClass *klass; GstPad *result; GstRtpJitterBufferPrivate *priv; g_return_val_if_fail (templ != NULL, NULL); g_return_val_if_fail (GST_IS_RTP_JITTER_BUFFER (element), NULL); jitterbuffer = GST_RTP_JITTER_BUFFER (element); priv = jitterbuffer->priv; klass = GST_ELEMENT_GET_CLASS (element); GST_DEBUG_OBJECT (element, "requesting pad %s", GST_STR_NULL (name)); /* figure out the template */ if (templ == gst_element_class_get_pad_template (klass, "sink_rtcp")) { if (priv->rtcpsinkpad != NULL) goto exists; result = create_rtcp_sink (jitterbuffer); } else goto wrong_template; return result; /* ERRORS */ wrong_template: { g_warning ("gstrtpjitterbuffer: this is not our template"); return NULL; } exists: { g_warning ("gstrtpjitterbuffer: pad already requested"); return NULL; } } static void gst_rtp_jitter_buffer_release_pad (GstElement * element, GstPad * pad) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; g_return_if_fail (GST_IS_RTP_JITTER_BUFFER (element)); g_return_if_fail (GST_IS_PAD (pad)); jitterbuffer = GST_RTP_JITTER_BUFFER (element); priv = jitterbuffer->priv; GST_DEBUG_OBJECT (element, "releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad)); if (priv->rtcpsinkpad == pad) { remove_rtcp_sink (jitterbuffer); } else goto wrong_pad; return; /* ERRORS */ wrong_pad: { g_warning ("gstjitterbuffer: asked to release an unknown pad"); return; } } static GstClock * gst_rtp_jitter_buffer_provide_clock (GstElement * element) { return gst_system_clock_obtain (); } static void gst_rtp_jitter_buffer_clear_pt_map (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; /* this will trigger a new pt-map request signal, FIXME, do something better. */ JBUF_LOCK (priv); priv->clock_rate = -1; /* do not clear current content, but refresh state for new arrival */ GST_DEBUG_OBJECT (jitterbuffer, "reset jitterbuffer"); rtp_jitter_buffer_reset_skew (priv->jbuf); priv->last_popped_seqnum = -1; priv->next_seqnum = -1; JBUF_UNLOCK (priv); } static GstClockTime gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jbuf, gboolean active, guint64 offset) { GstRtpJitterBufferPrivate *priv; GstClockTime last_out; GstBuffer *head; priv = jbuf->priv; JBUF_LOCK (priv); GST_DEBUG_OBJECT (jbuf, "setting active %d with offset %" GST_TIME_FORMAT, active, GST_TIME_ARGS (offset)); if (active != priv->active) { /* add the amount of time spent in paused to the output offset. All * outgoing buffers will have this offset applied to their timestamps in * order to make them arrive in time in the sink. */ priv->out_offset = offset; GST_DEBUG_OBJECT (jbuf, "out offset %" GST_TIME_FORMAT, GST_TIME_ARGS (priv->out_offset)); priv->active = active; JBUF_SIGNAL (priv); } if (!active) { rtp_jitter_buffer_set_buffering (priv->jbuf, TRUE); } if ((head = rtp_jitter_buffer_peek (priv->jbuf))) { /* head buffer timestamp and offset gives our output time */ last_out = GST_BUFFER_TIMESTAMP (head) + priv->ts_offset; } else { /* use last known time when the buffer is empty */ last_out = priv->last_out_time; } JBUF_UNLOCK (priv); return last_out; } static GstCaps * gst_rtp_jitter_buffer_getcaps (GstPad * pad) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; GstPad *other; GstCaps *caps; const GstCaps *templ; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); priv = jitterbuffer->priv; other = (pad == priv->srcpad ? priv->sinkpad : priv->srcpad); caps = gst_pad_peer_get_caps (other); templ = gst_pad_get_pad_template_caps (pad); if (caps == NULL) { GST_DEBUG_OBJECT (jitterbuffer, "copy template"); caps = gst_caps_copy (templ); } else { GstCaps *intersect; GST_DEBUG_OBJECT (jitterbuffer, "intersect with template"); intersect = gst_caps_intersect (caps, templ); gst_caps_unref (caps); caps = intersect; } gst_object_unref (jitterbuffer); return caps; } /* * Must be called with JBUF_LOCK held */ static gboolean gst_jitter_buffer_sink_parse_caps (GstRtpJitterBuffer * jitterbuffer, GstCaps * caps) { GstRtpJitterBufferPrivate *priv; GstStructure *caps_struct; guint val; GstClockTime tval; priv = jitterbuffer->priv; /* first parse the caps */ caps_struct = gst_caps_get_structure (caps, 0); GST_DEBUG_OBJECT (jitterbuffer, "got caps"); /* we need a clock-rate to convert the rtp timestamps to GStreamer time and to * measure the amount of data in the buffer */ if (!gst_structure_get_int (caps_struct, "clock-rate", &priv->clock_rate)) goto error; if (priv->clock_rate <= 0) goto wrong_rate; GST_DEBUG_OBJECT (jitterbuffer, "got clock-rate %d", priv->clock_rate); /* The clock base is the RTP timestamp corrsponding to the npt-start value. We * can use this to track the amount of time elapsed on the sender. */ if (gst_structure_get_uint (caps_struct, "clock-base", &val)) priv->clock_base = val; else priv->clock_base = -1; priv->ext_timestamp = priv->clock_base; GST_DEBUG_OBJECT (jitterbuffer, "got clock-base %" G_GINT64_FORMAT, priv->clock_base); if (gst_structure_get_uint (caps_struct, "seqnum-base", &val)) { /* first expected seqnum, only update when we didn't have a previous base. */ if (priv->next_in_seqnum == -1) priv->next_in_seqnum = val; if (priv->next_seqnum == -1) priv->next_seqnum = val; } GST_DEBUG_OBJECT (jitterbuffer, "got seqnum-base %d", priv->next_in_seqnum); /* the start and stop times. The seqnum-base corresponds to the start time. We * will keep track of the seqnums on the output and when we reach the one * corresponding to npt-stop, we emit the npt-stop-reached signal */ if (gst_structure_get_clock_time (caps_struct, "npt-start", &tval)) priv->npt_start = tval; else priv->npt_start = 0; if (gst_structure_get_clock_time (caps_struct, "npt-stop", &tval)) priv->npt_stop = tval; else priv->npt_stop = -1; GST_DEBUG_OBJECT (jitterbuffer, "npt start/stop: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT, GST_TIME_ARGS (priv->npt_start), GST_TIME_ARGS (priv->npt_stop)); return TRUE; /* ERRORS */ error: { GST_DEBUG_OBJECT (jitterbuffer, "No clock-rate in caps!"); return FALSE; } wrong_rate: { GST_DEBUG_OBJECT (jitterbuffer, "Invalid clock-rate %d", priv->clock_rate); return FALSE; } } static gboolean gst_jitter_buffer_sink_setcaps (GstPad * pad, GstCaps * caps) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; gboolean res; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); priv = jitterbuffer->priv; JBUF_LOCK (priv); res = gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); JBUF_UNLOCK (priv); /* set same caps on srcpad on success */ if (res) gst_pad_set_caps (priv->srcpad, caps); gst_object_unref (jitterbuffer); return res; } static void gst_rtp_jitter_buffer_flush_start (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; JBUF_LOCK (priv); /* mark ourselves as flushing */ priv->srcresult = GST_FLOW_WRONG_STATE; GST_DEBUG_OBJECT (jitterbuffer, "Disabling pop on queue"); /* this unblocks any waiting pops on the src pad task */ JBUF_SIGNAL (priv); /* unlock clock, we just unschedule, the entry will be released by the * locking streaming thread. */ if (priv->clock_id) { gst_clock_id_unschedule (priv->clock_id); priv->unscheduled = TRUE; } JBUF_UNLOCK (priv); } static void gst_rtp_jitter_buffer_flush_stop (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; JBUF_LOCK (priv); GST_DEBUG_OBJECT (jitterbuffer, "Enabling pop on queue"); /* Mark as non flushing */ priv->srcresult = GST_FLOW_OK; gst_segment_init (&priv->segment, GST_FORMAT_TIME); priv->last_popped_seqnum = -1; priv->last_out_time = -1; priv->next_seqnum = -1; priv->next_in_seqnum = -1; priv->clock_rate = -1; priv->eos = FALSE; priv->estimated_eos = -1; priv->last_elapsed = 0; priv->reached_npt_stop = FALSE; priv->ext_timestamp = -1; GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer"); rtp_jitter_buffer_flush (priv->jbuf); rtp_jitter_buffer_reset_skew (priv->jbuf); JBUF_UNLOCK (priv); } static gboolean gst_rtp_jitter_buffer_src_activate_push (GstPad * pad, gboolean active) { gboolean result = TRUE; GstRtpJitterBuffer *jitterbuffer = NULL; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (active) { /* allow data processing */ gst_rtp_jitter_buffer_flush_stop (jitterbuffer); /* start pushing out buffers */ GST_DEBUG_OBJECT (jitterbuffer, "Starting task on srcpad"); gst_pad_start_task (jitterbuffer->priv->srcpad, (GstTaskFunction) gst_rtp_jitter_buffer_loop, jitterbuffer); } else { /* make sure all data processing stops ASAP */ gst_rtp_jitter_buffer_flush_start (jitterbuffer); /* NOTE this will hardlock if the state change is called from the src pad * task thread because we will _join() the thread. */ GST_DEBUG_OBJECT (jitterbuffer, "Stopping task on srcpad"); result = gst_pad_stop_task (pad); } gst_object_unref (jitterbuffer); return result; } static GstStateChangeReturn gst_rtp_jitter_buffer_change_state (GstElement * element, GstStateChange transition) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; jitterbuffer = GST_RTP_JITTER_BUFFER (element); priv = jitterbuffer->priv; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: JBUF_LOCK (priv); /* reset negotiated values */ priv->clock_rate = -1; priv->clock_base = -1; priv->peer_latency = 0; priv->last_pt = -1; /* block until we go to PLAYING */ priv->blocked = TRUE; JBUF_UNLOCK (priv); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: JBUF_LOCK (priv); /* unblock to allow streaming in PLAYING */ priv->blocked = FALSE; JBUF_SIGNAL (priv); JBUF_UNLOCK (priv); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: /* we are a live element because we sync to the clock, which we can only * do in the PLAYING state */ if (ret != GST_STATE_CHANGE_FAILURE) ret = GST_STATE_CHANGE_NO_PREROLL; break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: JBUF_LOCK (priv); /* block to stop streaming when PAUSED */ priv->blocked = TRUE; JBUF_UNLOCK (priv); if (ret != GST_STATE_CHANGE_FAILURE) ret = GST_STATE_CHANGE_NO_PREROLL; break; case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static gboolean gst_rtp_jitter_buffer_src_event (GstPad * pad, GstEvent * event) { gboolean ret = TRUE; GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (G_UNLIKELY (jitterbuffer == NULL)) { gst_event_unref (event); return FALSE; } priv = jitterbuffer->priv; GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_LATENCY: { GstClockTime latency; gst_event_parse_latency (event, &latency); JBUF_LOCK (priv); /* adjust the overall buffer delay to the total pipeline latency in * buffering mode because if downstream consumes too fast (because of * large latency or queues, we would start rebuffering again. */ if (rtp_jitter_buffer_get_mode (priv->jbuf) == RTP_JITTER_BUFFER_MODE_BUFFER) { rtp_jitter_buffer_set_delay (priv->jbuf, latency); } JBUF_UNLOCK (priv); ret = gst_pad_push_event (priv->sinkpad, event); break; } default: ret = gst_pad_push_event (priv->sinkpad, event); break; } gst_object_unref (jitterbuffer); return ret; } static gboolean gst_rtp_jitter_buffer_sink_event (GstPad * pad, GstEvent * event) { gboolean ret = TRUE; GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (G_UNLIKELY (jitterbuffer == NULL)) { gst_event_unref (event); return FALSE; } priv = jitterbuffer->priv; GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time; gboolean update; gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); /* we need time for now */ if (format != GST_FORMAT_TIME) goto newseg_wrong_format; GST_DEBUG_OBJECT (jitterbuffer, "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (time)); /* now configure the values, we need these to time the release of the * buffers on the srcpad. */ gst_segment_set_newsegment_full (&priv->segment, update, rate, arate, format, start, stop, time); /* FIXME, push SEGMENT in the queue. Sorting order might be difficult. */ ret = gst_pad_push_event (priv->srcpad, event); break; } case GST_EVENT_FLUSH_START: gst_rtp_jitter_buffer_flush_start (jitterbuffer); ret = gst_pad_push_event (priv->srcpad, event); break; case GST_EVENT_FLUSH_STOP: ret = gst_pad_push_event (priv->srcpad, event); ret = gst_rtp_jitter_buffer_src_activate_push (priv->srcpad, TRUE); break; case GST_EVENT_EOS: { /* push EOS in queue. We always push it at the head */ JBUF_LOCK (priv); /* check for flushing, we need to discard the event and return FALSE when * we are flushing */ ret = priv->srcresult == GST_FLOW_OK; if (ret && !priv->eos) { GST_INFO_OBJECT (jitterbuffer, "queuing EOS"); priv->eos = TRUE; JBUF_SIGNAL (priv); } else if (priv->eos) { GST_DEBUG_OBJECT (jitterbuffer, "dropping EOS, we are already EOS"); } else { GST_DEBUG_OBJECT (jitterbuffer, "dropping EOS, reason %s", gst_flow_get_name (priv->srcresult)); } JBUF_UNLOCK (priv); gst_event_unref (event); break; } default: ret = gst_pad_push_event (priv->srcpad, event); break; } done: gst_object_unref (jitterbuffer); return ret; /* ERRORS */ newseg_wrong_format: { GST_DEBUG_OBJECT (jitterbuffer, "received non TIME newsegment"); ret = FALSE; gst_event_unref (event); goto done; } } static gboolean gst_rtp_jitter_buffer_sink_rtcp_event (GstPad * pad, GstEvent * event) { GstRtpJitterBuffer *jitterbuffer; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: break; case GST_EVENT_FLUSH_STOP: break; default: break; } gst_event_unref (event); gst_object_unref (jitterbuffer); return TRUE; } /* * Must be called with JBUF_LOCK held, will release the LOCK when emiting the * signal. The function returns GST_FLOW_ERROR when a parsing error happened and * GST_FLOW_WRONG_STATE when the element is shutting down. On success * GST_FLOW_OK is returned. */ static GstFlowReturn gst_rtp_jitter_buffer_get_clock_rate (GstRtpJitterBuffer * jitterbuffer, guint8 pt) { GValue ret = { 0 }; GValue args[2] = { {0}, {0} }; GstCaps *caps; gboolean res; g_value_init (&args[0], GST_TYPE_ELEMENT); g_value_set_object (&args[0], jitterbuffer); g_value_init (&args[1], G_TYPE_UINT); g_value_set_uint (&args[1], pt); g_value_init (&ret, GST_TYPE_CAPS); g_value_set_boxed (&ret, NULL); JBUF_UNLOCK (jitterbuffer->priv); g_signal_emitv (args, gst_rtp_jitter_buffer_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); JBUF_LOCK_CHECK (jitterbuffer->priv, out_flushing); g_value_unset (&args[0]); g_value_unset (&args[1]); caps = (GstCaps *) g_value_dup_boxed (&ret); g_value_unset (&ret); if (!caps) goto no_caps; res = gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); gst_caps_unref (caps); if (G_UNLIKELY (!res)) goto parse_failed; return GST_FLOW_OK; /* ERRORS */ no_caps: { GST_DEBUG_OBJECT (jitterbuffer, "could not get caps"); return GST_FLOW_ERROR; } out_flushing: { GST_DEBUG_OBJECT (jitterbuffer, "we are flushing"); return GST_FLOW_WRONG_STATE; } parse_failed: { GST_DEBUG_OBJECT (jitterbuffer, "parse failed"); return GST_FLOW_ERROR; } } /* call with jbuf lock held */ static void check_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint * percent) { GstRtpJitterBufferPrivate *priv = jitterbuffer->priv; /* too short a stream, or too close to EOS will never really fill buffer */ if (*percent != -1 && priv->npt_stop != -1 && priv->npt_stop - priv->npt_start <= rtp_jitter_buffer_get_delay (priv->jbuf)) { GST_DEBUG_OBJECT (jitterbuffer, "short stream; faking full buffer"); rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE); *percent = 100; } } static void post_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint percent) { GstMessage *message; /* Post a buffering message */ message = gst_message_new_buffering (GST_OBJECT_CAST (jitterbuffer), percent); gst_message_set_buffering_stats (message, GST_BUFFERING_LIVE, -1, -1, -1); gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), message); } static GstFlowReturn gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; guint16 seqnum; GstFlowReturn ret = GST_FLOW_OK; GstClockTime timestamp; guint64 latency_ts; gboolean tail; gint percent = -1; guint8 pt; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (G_UNLIKELY (!gst_rtp_buffer_validate (buffer))) goto invalid_buffer; priv = jitterbuffer->priv; pt = gst_rtp_buffer_get_payload_type (buffer); /* take the timestamp of the buffer. This is the time when the packet was * received and is used to calculate jitter and clock skew. We will adjust * this timestamp with the smoothed value after processing it in the * jitterbuffer. */ timestamp = GST_BUFFER_TIMESTAMP (buffer); /* bring to running time */ timestamp = gst_segment_to_running_time (&priv->segment, GST_FORMAT_TIME, timestamp); seqnum = gst_rtp_buffer_get_seq (buffer); GST_DEBUG_OBJECT (jitterbuffer, "Received packet #%d at time %" GST_TIME_FORMAT, seqnum, GST_TIME_ARGS (timestamp)); JBUF_LOCK_CHECK (priv, out_flushing); if (G_UNLIKELY (priv->last_pt != pt)) { GstCaps *caps; GST_DEBUG_OBJECT (jitterbuffer, "pt changed from %u to %u", priv->last_pt, pt); priv->last_pt = pt; /* reset clock-rate so that we get a new one */ priv->clock_rate = -1; /* Try to get the clock-rate from the caps first if we can. If there are no * caps we must fire the signal to get the clock-rate. */ if ((caps = GST_BUFFER_CAPS (buffer))) { gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); } } if (G_UNLIKELY (priv->clock_rate == -1)) { /* no clock rate given on the caps, try to get one with the signal */ if (gst_rtp_jitter_buffer_get_clock_rate (jitterbuffer, pt) == GST_FLOW_WRONG_STATE) goto out_flushing; if (G_UNLIKELY (priv->clock_rate == -1)) goto no_clock_rate; } /* don't accept more data on EOS */ if (G_UNLIKELY (priv->eos)) goto have_eos; /* now check against our expected seqnum */ if (G_LIKELY (priv->next_in_seqnum != -1)) { gint gap; gboolean reset = FALSE; gap = gst_rtp_buffer_compare_seqnum (priv->next_in_seqnum, seqnum); if (G_UNLIKELY (gap != 0)) { GST_DEBUG_OBJECT (jitterbuffer, "expected #%d, got #%d, gap of %d", priv->next_in_seqnum, seqnum, gap); /* priv->next_in_seqnum >= seqnum, this packet is too late or the * sender might have been restarted with different seqnum. */ if (gap < -RTP_MAX_MISORDER) { GST_DEBUG_OBJECT (jitterbuffer, "reset: buffer too old %d", gap); reset = TRUE; } /* priv->next_in_seqnum < seqnum, this is a new packet */ else if (G_UNLIKELY (gap > RTP_MAX_DROPOUT)) { GST_DEBUG_OBJECT (jitterbuffer, "reset: too many dropped packets %d", gap); reset = TRUE; } else { GST_DEBUG_OBJECT (jitterbuffer, "tolerable gap"); } } if (G_UNLIKELY (reset)) { GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer"); rtp_jitter_buffer_flush (priv->jbuf); rtp_jitter_buffer_reset_skew (priv->jbuf); priv->last_popped_seqnum = -1; priv->next_seqnum = seqnum; } } priv->next_in_seqnum = (seqnum + 1) & 0xffff; /* let's check if this buffer is too late, we can only accept packets with * bigger seqnum than the one we last pushed. */ if (G_LIKELY (priv->last_popped_seqnum != -1)) { gint gap; gap = gst_rtp_buffer_compare_seqnum (priv->last_popped_seqnum, seqnum); /* priv->last_popped_seqnum >= seqnum, we're too late. */ if (G_UNLIKELY (gap <= 0)) goto too_late; } /* let's drop oldest packet if the queue is already full and drop-on-latency * is set. We can only do this when there actually is a latency. When no * latency is set, we just pump it in the queue and let the other end push it * out as fast as possible. */ if (priv->latency_ms && priv->drop_on_latency) { latency_ts = gst_util_uint64_scale_int (priv->latency_ms, priv->clock_rate, 1000); if (G_UNLIKELY (rtp_jitter_buffer_get_ts_diff (priv->jbuf) >= latency_ts)) { GstBuffer *old_buf; old_buf = rtp_jitter_buffer_pop (priv->jbuf, &percent); GST_DEBUG_OBJECT (jitterbuffer, "Queue full, dropping old packet #%d", gst_rtp_buffer_get_seq (old_buf)); gst_buffer_unref (old_buf); } } /* we need to make the metadata writable before pushing it in the jitterbuffer * because the jitterbuffer will update the timestamp */ buffer = gst_buffer_make_metadata_writable (buffer); /* now insert the packet into the queue in sorted order. This function returns * FALSE if a packet with the same seqnum was already in the queue, meaning we * have a duplicate. */ if (G_UNLIKELY (!rtp_jitter_buffer_insert (priv->jbuf, buffer, timestamp, priv->clock_rate, &tail, &percent))) goto duplicate; /* signal addition of new buffer when the _loop is waiting. */ if (priv->waiting) JBUF_SIGNAL (priv); /* let's unschedule and unblock any waiting buffers. We only want to do this * when the tail buffer changed */ if (G_UNLIKELY (priv->clock_id && tail)) { GST_DEBUG_OBJECT (jitterbuffer, "Unscheduling waiting buffer, new tail buffer"); gst_clock_id_unschedule (priv->clock_id); priv->unscheduled = TRUE; } GST_DEBUG_OBJECT (jitterbuffer, "Pushed packet #%d, now %d packets, tail: %d", seqnum, rtp_jitter_buffer_num_packets (priv->jbuf), tail); check_buffering_percent (jitterbuffer, &percent); finished: JBUF_UNLOCK (priv); if (percent != -1) post_buffering_percent (jitterbuffer, percent); gst_object_unref (jitterbuffer); return ret; /* ERRORS */ invalid_buffer: { /* this is not fatal but should be filtered earlier */ GST_ELEMENT_WARNING (jitterbuffer, STREAM, DECODE, (NULL), ("Received invalid RTP payload, dropping")); gst_buffer_unref (buffer); gst_object_unref (jitterbuffer); return GST_FLOW_OK; } no_clock_rate: { GST_WARNING_OBJECT (jitterbuffer, "No clock-rate in caps!, dropping buffer"); gst_buffer_unref (buffer); goto finished; } out_flushing: { ret = priv->srcresult; GST_DEBUG_OBJECT (jitterbuffer, "flushing %s", gst_flow_get_name (ret)); gst_buffer_unref (buffer); goto finished; } have_eos: { ret = GST_FLOW_UNEXPECTED; GST_WARNING_OBJECT (jitterbuffer, "we are EOS, refusing buffer"); gst_buffer_unref (buffer); goto finished; } too_late: { GST_WARNING_OBJECT (jitterbuffer, "Packet #%d too late as #%d was already" " popped, dropping", seqnum, priv->last_popped_seqnum); priv->num_late++; gst_buffer_unref (buffer); goto finished; } duplicate: { GST_WARNING_OBJECT (jitterbuffer, "Duplicate packet #%d detected, dropping", seqnum); priv->num_duplicates++; gst_buffer_unref (buffer); goto finished; } } static GstClockTime apply_offset (GstRtpJitterBuffer * jitterbuffer, GstClockTime timestamp) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; if (timestamp == -1) return -1; /* apply the timestamp offset, this is used for inter stream sync */ timestamp += priv->ts_offset; /* add the offset, this is used when buffering */ timestamp += priv->out_offset; return timestamp; } static GstClockTime get_sync_time (GstRtpJitterBuffer * jitterbuffer, GstClockTime timestamp) { GstClockTime result; GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; result = timestamp + GST_ELEMENT_CAST (jitterbuffer)->base_time; /* add latency, this includes our own latency and the peer latency. */ result += priv->latency_ns; result += priv->peer_latency; return result; } static gboolean eos_reached (GstClock * clock, GstClockTime time, GstClockID id, GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; JBUF_LOCK_CHECK (priv, flushing); if (priv->waiting) { GST_INFO_OBJECT (jitterbuffer, "got the NPT timeout"); priv->reached_npt_stop = TRUE; JBUF_SIGNAL (priv); } JBUF_UNLOCK (priv); return TRUE; /* ERRORS */ flushing: { JBUF_UNLOCK (priv); return FALSE; } } static GstClockTime compute_elapsed (GstRtpJitterBuffer * jitterbuffer, GstBuffer * outbuf) { guint64 ext_time, elapsed; guint32 rtp_time; GstRtpJitterBufferPrivate *priv; priv = jitterbuffer->priv; rtp_time = gst_rtp_buffer_get_timestamp (outbuf); GST_LOG_OBJECT (jitterbuffer, "rtp %" G_GUINT32_FORMAT ", ext %" G_GUINT64_FORMAT, rtp_time, priv->ext_timestamp); if (rtp_time < priv->ext_timestamp) { ext_time = priv->ext_timestamp; } else { ext_time = gst_rtp_buffer_ext_timestamp (&priv->ext_timestamp, rtp_time); } if (ext_time > priv->clock_base) elapsed = ext_time - priv->clock_base; else elapsed = 0; elapsed = gst_util_uint64_scale_int (elapsed, GST_SECOND, priv->clock_rate); return elapsed; } /* * This funcion will push out buffers on the source pad. * * For each pushed buffer, the seqnum is recorded, if the next buffer B has a * different seqnum (missing packets before B), this function will wait for the * missing packet to arrive up to the timestamp of buffer B. */ static void gst_rtp_jitter_buffer_loop (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; GstBuffer *outbuf; GstFlowReturn result; guint16 seqnum; guint32 next_seqnum; GstClockTime timestamp, out_time; gboolean discont = FALSE; gint gap; GstClock *clock; GstClockID id; GstClockTime sync_time; gint percent = -1; priv = jitterbuffer->priv; JBUF_LOCK_CHECK (priv, flushing); again: GST_DEBUG_OBJECT (jitterbuffer, "Peeking item"); while (TRUE) { id = NULL; /* always wait if we are blocked */ if (G_LIKELY (!priv->blocked)) { /* we're buffering but not EOS, wait. */ if (!priv->eos && (!priv->active || rtp_jitter_buffer_is_buffering (priv->jbuf))) { GstClockTime elapsed, delay, left; if (priv->estimated_eos == -1) goto do_wait; outbuf = rtp_jitter_buffer_peek (priv->jbuf); if (outbuf != NULL) { elapsed = compute_elapsed (jitterbuffer, outbuf); if (GST_BUFFER_DURATION_IS_VALID (outbuf)) elapsed += GST_BUFFER_DURATION (outbuf); } else { GST_INFO_OBJECT (jitterbuffer, "no buffer, using last_elapsed"); elapsed = priv->last_elapsed; } delay = rtp_jitter_buffer_get_delay (priv->jbuf); if (priv->estimated_eos > elapsed) left = priv->estimated_eos - elapsed; else left = 0; GST_INFO_OBJECT (jitterbuffer, "buffering, elapsed %" GST_TIME_FORMAT " estimated_eos %" GST_TIME_FORMAT " left %" GST_TIME_FORMAT " delay %" GST_TIME_FORMAT, GST_TIME_ARGS (elapsed), GST_TIME_ARGS (priv->estimated_eos), GST_TIME_ARGS (left), GST_TIME_ARGS (delay)); if (left > delay) goto do_wait; } /* if we have a packet, we can exit the loop and grab it */ if (rtp_jitter_buffer_num_packets (priv->jbuf) > 0) break; /* no packets but we are EOS, do eos logic */ if (G_UNLIKELY (priv->eos)) goto do_eos; /* underrun, wait for packets or flushing now if we are expecting an EOS * timeout, set the async timer for it too */ if (priv->estimated_eos != -1 && !priv->reached_npt_stop) { sync_time = get_sync_time (jitterbuffer, priv->estimated_eos); GST_OBJECT_LOCK (jitterbuffer); clock = GST_ELEMENT_CLOCK (jitterbuffer); if (clock) { GST_INFO_OBJECT (jitterbuffer, "scheduling timeout"); id = gst_clock_new_single_shot_id (clock, sync_time); gst_clock_id_wait_async (id, (GstClockCallback) eos_reached, jitterbuffer); } GST_OBJECT_UNLOCK (jitterbuffer); } } do_wait: /* now we wait */ GST_DEBUG_OBJECT (jitterbuffer, "waiting"); priv->waiting = TRUE; JBUF_WAIT (priv); priv->waiting = FALSE; GST_DEBUG_OBJECT (jitterbuffer, "waiting done"); if (id) { /* unschedule any pending async notifications we might have */ gst_clock_id_unschedule (id); gst_clock_id_unref (id); } if (G_UNLIKELY (priv->srcresult != GST_FLOW_OK)) goto flushing; if (id && priv->reached_npt_stop) { goto do_npt_stop; } } /* peek a buffer, we're just looking at the timestamp and the sequence number. * If all is fine, we'll pop and push it. If the sequence number is wrong we * wait on the timestamp. In the chain function we will unlock the wait when a * new buffer is available. The peeked buffer is valid for as long as we hold * the jitterbuffer lock. */ outbuf = rtp_jitter_buffer_peek (priv->jbuf); /* get the seqnum and the next expected seqnum */ seqnum = gst_rtp_buffer_get_seq (outbuf); next_seqnum = priv->next_seqnum; /* get the timestamp, this is already corrected for clock skew by the * jitterbuffer */ timestamp = GST_BUFFER_TIMESTAMP (outbuf); GST_DEBUG_OBJECT (jitterbuffer, "Peeked buffer #%d, expect #%d, timestamp %" GST_TIME_FORMAT ", now %d left", seqnum, next_seqnum, GST_TIME_ARGS (timestamp), rtp_jitter_buffer_num_packets (priv->jbuf)); /* apply our timestamp offset to the incomming buffer, this will be our output * timestamp. */ out_time = apply_offset (jitterbuffer, timestamp); /* get the gap between this and the previous packet. If we don't know the * previous packet seqnum assume no gap. */ if (G_LIKELY (next_seqnum != -1)) { gap = gst_rtp_buffer_compare_seqnum (next_seqnum, seqnum); /* if we have a packet that we already pushed or considered dropped, pop it * off and get the next packet */ if (G_UNLIKELY (gap < 0)) { GST_DEBUG_OBJECT (jitterbuffer, "Old packet #%d, next #%d dropping", seqnum, next_seqnum); outbuf = rtp_jitter_buffer_pop (priv->jbuf, &percent); gst_buffer_unref (outbuf); goto again; } } else { GST_DEBUG_OBJECT (jitterbuffer, "no next seqnum known, first packet"); gap = -1; } /* If we don't know what the next seqnum should be (== -1) we have to wait * because it might be possible that we are not receiving this buffer in-order, * a buffer with a lower seqnum could arrive later and we want to push that * earlier buffer before this buffer then. * If we know the expected seqnum, we can compare it to the current seqnum to * determine if we have missing a packet. If we have a missing packet (which * must be before this packet) we can wait for it until the deadline for this * packet expires. */ if (G_UNLIKELY (gap != 0 && out_time != -1)) { GstClockReturn ret; GstClockTime duration = GST_CLOCK_TIME_NONE; if (gap > 0) { /* we have a gap */ GST_DEBUG_OBJECT (jitterbuffer, "Sequence number GAP detected: expected %d instead of %d (%d missing)", next_seqnum, seqnum, gap); if (priv->last_out_time != -1) { GST_DEBUG_OBJECT (jitterbuffer, "out_time %" GST_TIME_FORMAT ", last %" GST_TIME_FORMAT, GST_TIME_ARGS (out_time), GST_TIME_ARGS (priv->last_out_time)); /* interpolate between the current time and the last time based on * number of packets we are missing, this is the estimated duration * for the missing packet based on equidistant packet spacing. Also make * sure we never go negative. */ if (out_time >= priv->last_out_time) duration = (out_time - priv->last_out_time) / (gap + 1); else goto lost; GST_DEBUG_OBJECT (jitterbuffer, "duration %" GST_TIME_FORMAT, GST_TIME_ARGS (duration)); /* add this duration to the timestamp of the last packet we pushed */ out_time = (priv->last_out_time + duration); } } else { /* we don't know what the next_seqnum should be, wait for the last * possible moment to push this buffer, maybe we get an earlier seqnum * while we wait */ GST_DEBUG_OBJECT (jitterbuffer, "First buffer %d, do sync", seqnum); } GST_OBJECT_LOCK (jitterbuffer); clock = GST_ELEMENT_CLOCK (jitterbuffer); if (!clock) { GST_OBJECT_UNLOCK (jitterbuffer); /* let's just push if there is no clock */ GST_DEBUG_OBJECT (jitterbuffer, "No clock, push right away"); goto push_buffer; } GST_DEBUG_OBJECT (jitterbuffer, "sync to timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (out_time)); /* prepare for sync against clock */ sync_time = get_sync_time (jitterbuffer, out_time); /* create an entry for the clock */ id = priv->clock_id = gst_clock_new_single_shot_id (clock, sync_time); priv->unscheduled = FALSE; GST_OBJECT_UNLOCK (jitterbuffer); /* release the lock so that the other end can push stuff or unlock */ JBUF_UNLOCK (priv); ret = gst_clock_id_wait (id, NULL); JBUF_LOCK (priv); /* and free the entry */ gst_clock_id_unref (id); priv->clock_id = NULL; /* at this point, the clock could have been unlocked by a timeout, a new * tail element was added to the queue or because we are shutting down. Check * for shutdown first. */ if G_UNLIKELY ((priv->srcresult != GST_FLOW_OK)) goto flushing; /* if we got unscheduled and we are not flushing, it's because a new tail * element became available in the queue or we flushed the queue. * Grab it and try to push or sync. */ if (ret == GST_CLOCK_UNSCHEDULED || priv->unscheduled) { GST_DEBUG_OBJECT (jitterbuffer, "Wait got unscheduled, will retry to push with new buffer"); goto again; } lost: /* we now timed out, this means we lost a packet or finished synchronizing * on the first buffer. */ if (gap > 0) { GstEvent *event; /* we had a gap and thus we lost a packet. Create an event for this. */ GST_DEBUG_OBJECT (jitterbuffer, "Packet #%d lost", next_seqnum); priv->num_late++; discont = TRUE; /* update our expected next packet */ priv->last_popped_seqnum = next_seqnum; priv->last_out_time = out_time; priv->next_seqnum = (next_seqnum + 1) & 0xffff; if (priv->do_lost) { /* create paket lost event */ event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, gst_structure_new ("GstRTPPacketLost", "seqnum", G_TYPE_UINT, (guint) next_seqnum, "timestamp", G_TYPE_UINT64, out_time, "duration", G_TYPE_UINT64, duration, NULL)); JBUF_UNLOCK (priv); gst_pad_push_event (priv->srcpad, event); JBUF_LOCK_CHECK (priv, flushing); } /* look for next packet */ goto again; } /* there was no known gap,just the first packet, exit the loop and push */ GST_DEBUG_OBJECT (jitterbuffer, "First packet #%d synced", seqnum); /* get new timestamp, latency might have changed */ out_time = apply_offset (jitterbuffer, timestamp); } push_buffer: /* when we get here we are ready to pop and push the buffer */ outbuf = rtp_jitter_buffer_pop (priv->jbuf, &percent); check_buffering_percent (jitterbuffer, &percent); if (G_UNLIKELY (discont || priv->discont)) { /* set DISCONT flag when we missed a packet. We pushed the buffer writable * into the jitterbuffer so we can modify now. */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); priv->discont = FALSE; } /* apply timestamp with offset to buffer now */ GST_BUFFER_TIMESTAMP (outbuf) = out_time; /* update the elapsed time when we need to check against the npt stop time. */ if (priv->npt_stop != -1 && priv->ext_timestamp != -1 && priv->clock_base != -1 && priv->clock_rate > 0) { guint64 elapsed, estimated; elapsed = compute_elapsed (jitterbuffer, outbuf); if (elapsed > priv->last_elapsed || !priv->last_elapsed) { guint64 left; priv->last_elapsed = elapsed; left = priv->npt_stop - priv->npt_start; GST_LOG_OBJECT (jitterbuffer, "left %" GST_TIME_FORMAT, GST_TIME_ARGS (left)); if (elapsed > 0) estimated = gst_util_uint64_scale (out_time, left, elapsed); else { /* if there is almost nothing left, * we may never advance enough to end up in the above case */ if (left < GST_SECOND) estimated = GST_SECOND; else estimated = -1; } GST_LOG_OBJECT (jitterbuffer, "elapsed %" GST_TIME_FORMAT ", estimated %" GST_TIME_FORMAT, GST_TIME_ARGS (elapsed), GST_TIME_ARGS (estimated)); priv->estimated_eos = estimated; } } /* now we are ready to push the buffer. Save the seqnum and release the lock * so the other end can push stuff in the queue again. */ priv->last_popped_seqnum = seqnum; priv->last_out_time = out_time; priv->next_seqnum = (seqnum + 1) & 0xffff; JBUF_UNLOCK (priv); if (percent != -1) post_buffering_percent (jitterbuffer, percent); /* push buffer */ GST_DEBUG_OBJECT (jitterbuffer, "Pushing buffer %d, timestamp %" GST_TIME_FORMAT, seqnum, GST_TIME_ARGS (out_time)); result = gst_pad_push (priv->srcpad, outbuf); if (G_UNLIKELY (result != GST_FLOW_OK)) goto pause; return; /* ERRORS */ do_eos: { /* store result, we are flushing now */ GST_DEBUG_OBJECT (jitterbuffer, "We are EOS, pushing EOS downstream"); priv->srcresult = GST_FLOW_UNEXPECTED; gst_pad_pause_task (priv->srcpad); JBUF_UNLOCK (priv); gst_pad_push_event (priv->srcpad, gst_event_new_eos ()); return; } do_npt_stop: { /* store result, we are flushing now */ GST_DEBUG_OBJECT (jitterbuffer, "We reached the NPT stop"); JBUF_UNLOCK (priv); g_signal_emit (jitterbuffer, gst_rtp_jitter_buffer_signals[SIGNAL_ON_NPT_STOP], 0, NULL); return; } flushing: { GST_DEBUG_OBJECT (jitterbuffer, "we are flushing"); gst_pad_pause_task (priv->srcpad); JBUF_UNLOCK (priv); return; } pause: { GST_DEBUG_OBJECT (jitterbuffer, "pausing task, reason %s", gst_flow_get_name (result)); JBUF_LOCK (priv); /* store result */ priv->srcresult = result; /* we don't post errors or anything because upstream will do that for us * when we pass the return value upstream. */ gst_pad_pause_task (priv->srcpad); JBUF_UNLOCK (priv); return; } } static GstFlowReturn gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, GstBuffer * buffer) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; GstFlowReturn ret = GST_FLOW_OK; guint64 base_rtptime, base_time; guint32 clock_rate; guint64 last_rtptime; guint32 ssrc; GstRTCPPacket packet; guint64 ext_rtptime, diff; guint32 rtptime; gboolean drop = FALSE; guint64 clock_base; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (G_UNLIKELY (!gst_rtcp_buffer_validate (buffer))) goto invalid_buffer; priv = jitterbuffer->priv; if (!gst_rtcp_buffer_get_first_packet (buffer, &packet)) goto invalid_buffer; /* first packet must be SR or RR or else the validate would have failed */ switch (gst_rtcp_packet_get_type (&packet)) { case GST_RTCP_TYPE_SR: gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, NULL, &rtptime, NULL, NULL); break; default: goto ignore_buffer; } GST_DEBUG_OBJECT (jitterbuffer, "received RTCP of SSRC %08x", ssrc); JBUF_LOCK (priv); /* convert the RTP timestamp to our extended timestamp, using the same offset * we used in the jitterbuffer */ ext_rtptime = priv->jbuf->ext_rtptime; ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); /* get the last values from the jitterbuffer */ rtp_jitter_buffer_get_sync (priv->jbuf, &base_rtptime, &base_time, &clock_rate, &last_rtptime); clock_base = priv->clock_base; GST_DEBUG_OBJECT (jitterbuffer, "ext SR %" G_GUINT64_FORMAT ", base %" G_GUINT64_FORMAT ", clock-rate %" G_GUINT32_FORMAT ", clock-base %" G_GUINT64_FORMAT, ext_rtptime, base_rtptime, clock_rate, clock_base); if (base_rtptime == -1 || clock_rate == -1 || base_time == -1) { GST_DEBUG_OBJECT (jitterbuffer, "dropping, no RTP values"); drop = TRUE; } else { /* we can't accept anything that happened before we did the last resync */ if (base_rtptime > ext_rtptime) { GST_DEBUG_OBJECT (jitterbuffer, "dropping, older than base time"); drop = TRUE; } else { /* the SR RTP timestamp must be something close to what we last observed * in the jitterbuffer */ if (ext_rtptime > last_rtptime) { /* check how far ahead it is to our RTP timestamps */ diff = ext_rtptime - last_rtptime; /* if bigger than 1 second, we drop it */ if (diff > clock_rate) { GST_DEBUG_OBJECT (jitterbuffer, "too far ahead"); /* should drop this, but some RTSP servers end up with bogus * way too ahead RTCP packet when repeated PAUSE/PLAY, * so still trigger rptbin sync but invalidate RTCP data * (sync might use other methods) */ ext_rtptime = -1; } GST_DEBUG_OBJECT (jitterbuffer, "ext last %" G_GUINT64_FORMAT ", diff %" G_GUINT64_FORMAT, last_rtptime, diff); } } } JBUF_UNLOCK (priv); if (!drop) { GstStructure *s; s = gst_structure_new ("application/x-rtp-sync", "base-rtptime", G_TYPE_UINT64, base_rtptime, "base-time", G_TYPE_UINT64, base_time, "clock-rate", G_TYPE_UINT, clock_rate, "clock-base", G_TYPE_UINT64, clock_base, "sr-ext-rtptime", G_TYPE_UINT64, ext_rtptime, "sr-buffer", GST_TYPE_BUFFER, buffer, NULL); GST_DEBUG_OBJECT (jitterbuffer, "signaling sync"); g_signal_emit (jitterbuffer, gst_rtp_jitter_buffer_signals[SIGNAL_HANDLE_SYNC], 0, s); gst_structure_free (s); } else { GST_DEBUG_OBJECT (jitterbuffer, "dropping RTCP packet"); ret = GST_FLOW_OK; } done: gst_buffer_unref (buffer); gst_object_unref (jitterbuffer); return ret; invalid_buffer: { /* this is not fatal but should be filtered earlier */ GST_ELEMENT_WARNING (jitterbuffer, STREAM, DECODE, (NULL), ("Received invalid RTCP payload, dropping")); ret = GST_FLOW_OK; goto done; } ignore_buffer: { GST_DEBUG_OBJECT (jitterbuffer, "ignoring RTCP packet"); ret = GST_FLOW_OK; goto done; } } static gboolean gst_rtp_jitter_buffer_query (GstPad * pad, GstQuery * query) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; gboolean res = FALSE; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); if (G_UNLIKELY (jitterbuffer == NULL)) return FALSE; priv = jitterbuffer->priv; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { /* We need to send the query upstream and add the returned latency to our * own */ GstClockTime min_latency, max_latency; gboolean us_live; GstClockTime our_latency; if ((res = gst_pad_peer_query (priv->sinkpad, query))) { gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); GST_DEBUG_OBJECT (jitterbuffer, "Peer latency: min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); /* store this so that we can safely sync on the peer buffers. */ JBUF_LOCK (priv); priv->peer_latency = min_latency; our_latency = priv->latency_ns; JBUF_UNLOCK (priv); GST_DEBUG_OBJECT (jitterbuffer, "Our latency: %" GST_TIME_FORMAT, GST_TIME_ARGS (our_latency)); /* we add some latency but can buffer an infinite amount of time */ min_latency += our_latency; max_latency = -1; GST_DEBUG_OBJECT (jitterbuffer, "Calculated total latency : min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); gst_query_set_latency (query, TRUE, min_latency, max_latency); } break; } case GST_QUERY_POSITION: { GstClockTime start, last_out; GstFormat fmt; gst_query_parse_position (query, &fmt, NULL); if (fmt != GST_FORMAT_TIME) { res = gst_pad_query_default (pad, query); break; } JBUF_LOCK (priv); start = priv->npt_start; last_out = priv->last_out_time; JBUF_UNLOCK (priv); GST_DEBUG_OBJECT (jitterbuffer, "npt start %" GST_TIME_FORMAT ", last out %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (last_out)); if (GST_CLOCK_TIME_IS_VALID (start) && GST_CLOCK_TIME_IS_VALID (last_out)) { /* bring 0-based outgoing time to stream time */ gst_query_set_position (query, GST_FORMAT_TIME, start + last_out); res = TRUE; } else { res = gst_pad_query_default (pad, query); } break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (jitterbuffer); return res; } static void gst_rtp_jitter_buffer_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; jitterbuffer = GST_RTP_JITTER_BUFFER (object); priv = jitterbuffer->priv; switch (prop_id) { case PROP_LATENCY: { guint new_latency, old_latency; new_latency = g_value_get_uint (value); JBUF_LOCK (priv); old_latency = priv->latency_ms; priv->latency_ms = new_latency; priv->latency_ns = priv->latency_ms * GST_MSECOND; rtp_jitter_buffer_set_delay (priv->jbuf, priv->latency_ns); JBUF_UNLOCK (priv); /* post message if latency changed, this will inform the parent pipeline * that a latency reconfiguration is possible/needed. */ if (new_latency != old_latency) { GST_DEBUG_OBJECT (jitterbuffer, "latency changed to: %" GST_TIME_FORMAT, GST_TIME_ARGS (new_latency * GST_MSECOND)); gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), gst_message_new_latency (GST_OBJECT_CAST (jitterbuffer))); } break; } case PROP_DROP_ON_LATENCY: JBUF_LOCK (priv); priv->drop_on_latency = g_value_get_boolean (value); JBUF_UNLOCK (priv); break; case PROP_TS_OFFSET: JBUF_LOCK (priv); priv->ts_offset = g_value_get_int64 (value); /* FIXME, we don't really have a method for signaling a timestamp * DISCONT without also making this a data discont. */ /* priv->discont = TRUE; */ JBUF_UNLOCK (priv); break; case PROP_DO_LOST: JBUF_LOCK (priv); priv->do_lost = g_value_get_boolean (value); JBUF_UNLOCK (priv); break; case PROP_MODE: JBUF_LOCK (priv); rtp_jitter_buffer_set_mode (priv->jbuf, g_value_get_enum (value)); JBUF_UNLOCK (priv); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_jitter_buffer_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; jitterbuffer = GST_RTP_JITTER_BUFFER (object); priv = jitterbuffer->priv; switch (prop_id) { case PROP_LATENCY: JBUF_LOCK (priv); g_value_set_uint (value, priv->latency_ms); JBUF_UNLOCK (priv); break; case PROP_DROP_ON_LATENCY: JBUF_LOCK (priv); g_value_set_boolean (value, priv->drop_on_latency); JBUF_UNLOCK (priv); break; case PROP_TS_OFFSET: JBUF_LOCK (priv); g_value_set_int64 (value, priv->ts_offset); JBUF_UNLOCK (priv); break; case PROP_DO_LOST: JBUF_LOCK (priv); g_value_set_boolean (value, priv->do_lost); JBUF_UNLOCK (priv); break; case PROP_MODE: JBUF_LOCK (priv); g_value_set_enum (value, rtp_jitter_buffer_get_mode (priv->jbuf)); JBUF_UNLOCK (priv); break; case PROP_PERCENT: { gint percent; JBUF_LOCK (priv); if (priv->srcresult != GST_FLOW_OK) percent = 100; else percent = rtp_jitter_buffer_get_percent (priv->jbuf); g_value_set_int (value, percent); JBUF_UNLOCK (priv); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gst-plugins-good-0.10.31/gst/rtpmanager/Makefile.in0000644000175000017500000013131311720560235017004 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # these are the variables your Makefile.am should set # the example is based on the colorbalance interface #glib_enum_headers=$(colorbalance_headers) #glib_enum_define=GST_COLOR_BALANCE #glib_gen_prefix=gst_color_balance #glib_gen_basename=colorbalance VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/common/gst-glib-gen.mak subdir = gst/rtpmanager ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstrtpmanager_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstrtpmanager_la_OBJECTS = libgstrtpmanager_la-gstrtpmanager.lo \ libgstrtpmanager_la-gstrtpbin.lo \ libgstrtpmanager_la-gstrtpjitterbuffer.lo \ libgstrtpmanager_la-gstrtpptdemux.lo \ libgstrtpmanager_la-gstrtpssrcdemux.lo \ libgstrtpmanager_la-rtpjitterbuffer.lo \ libgstrtpmanager_la-rtpsession.lo \ libgstrtpmanager_la-rtpsource.lo \ libgstrtpmanager_la-rtpstats.lo \ libgstrtpmanager_la-gstrtpsession.lo am__objects_1 = libgstrtpmanager_la-gstrtpbin-marshal.lo nodist_libgstrtpmanager_la_OBJECTS = $(am__objects_1) libgstrtpmanager_la_OBJECTS = $(am_libgstrtpmanager_la_OBJECTS) \ $(nodist_libgstrtpmanager_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstrtpmanager_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) \ $(libgstrtpmanager_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstrtpmanager_la_SOURCES) \ $(nodist_libgstrtpmanager_la_SOURCES) DIST_SOURCES = $(libgstrtpmanager_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstrtpmanager.la glib_enum_define = GST_RTP_BIN glib_gen_prefix = gst_rtp_bin glib_gen_basename = gstrtpbin enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") built_sources = gstrtpbin-marshal.c built_headers = gstrtpbin-marshal.h BUILT_SOURCES = $(built_sources) $(built_headers) libgstrtpmanager_la_SOURCES = gstrtpmanager.c \ gstrtpbin.c \ gstrtpjitterbuffer.c \ gstrtpptdemux.c \ gstrtpssrcdemux.c \ rtpjitterbuffer.c \ rtpsession.c \ rtpsource.c \ rtpstats.c \ gstrtpsession.c nodist_libgstrtpmanager_la_SOURCES = \ $(built_sources) noinst_HEADERS = gstrtpbin.h \ gstrtpjitterbuffer.h \ gstrtpptdemux.h \ gstrtpssrcdemux.h \ rtpjitterbuffer.h \ rtpsession.h \ rtpsource.h \ rtpstats.h \ gstrtpsession.h libgstrtpmanager_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ $(WARNING_CFLAGS) $(ERROR_CFLAGS) libgstrtpmanager_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstnetbuffer-@GST_MAJORMINOR@ -lgstrtp-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS_LIBS) libgstrtpmanager_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrtpmanager_la_LIBTOOLFLAGS = --tag=disable-static CLEANFILES = $(BUILT_SOURCES) EXTRA_DIST = gstrtpbin-marshal.list all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/gst-glib-gen.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/rtpmanager/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/rtpmanager/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/gst-glib-gen.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstrtpmanager.la: $(libgstrtpmanager_la_OBJECTS) $(libgstrtpmanager_la_DEPENDENCIES) $(EXTRA_libgstrtpmanager_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstrtpmanager_la_LINK) -rpath $(plugindir) $(libgstrtpmanager_la_OBJECTS) $(libgstrtpmanager_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpsession.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpsource.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtpmanager_la-rtpstats.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstrtpmanager_la-gstrtpmanager.lo: gstrtpmanager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpmanager.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Tpo -c -o libgstrtpmanager_la-gstrtpmanager.lo `test -f 'gstrtpmanager.c' || echo '$(srcdir)/'`gstrtpmanager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpmanager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmanager.c' object='libgstrtpmanager_la-gstrtpmanager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpmanager.lo `test -f 'gstrtpmanager.c' || echo '$(srcdir)/'`gstrtpmanager.c libgstrtpmanager_la-gstrtpbin.lo: gstrtpbin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpbin.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Tpo -c -o libgstrtpmanager_la-gstrtpbin.lo `test -f 'gstrtpbin.c' || echo '$(srcdir)/'`gstrtpbin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpbin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbin.c' object='libgstrtpmanager_la-gstrtpbin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpbin.lo `test -f 'gstrtpbin.c' || echo '$(srcdir)/'`gstrtpbin.c libgstrtpmanager_la-gstrtpjitterbuffer.lo: gstrtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpjitterbuffer.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Tpo -c -o libgstrtpmanager_la-gstrtpjitterbuffer.lo `test -f 'gstrtpjitterbuffer.c' || echo '$(srcdir)/'`gstrtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpjitterbuffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpjitterbuffer.c' object='libgstrtpmanager_la-gstrtpjitterbuffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpjitterbuffer.lo `test -f 'gstrtpjitterbuffer.c' || echo '$(srcdir)/'`gstrtpjitterbuffer.c libgstrtpmanager_la-gstrtpptdemux.lo: gstrtpptdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpptdemux.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Tpo -c -o libgstrtpmanager_la-gstrtpptdemux.lo `test -f 'gstrtpptdemux.c' || echo '$(srcdir)/'`gstrtpptdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpptdemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpptdemux.c' object='libgstrtpmanager_la-gstrtpptdemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpptdemux.lo `test -f 'gstrtpptdemux.c' || echo '$(srcdir)/'`gstrtpptdemux.c libgstrtpmanager_la-gstrtpssrcdemux.lo: gstrtpssrcdemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpssrcdemux.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Tpo -c -o libgstrtpmanager_la-gstrtpssrcdemux.lo `test -f 'gstrtpssrcdemux.c' || echo '$(srcdir)/'`gstrtpssrcdemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpssrcdemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpssrcdemux.c' object='libgstrtpmanager_la-gstrtpssrcdemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpssrcdemux.lo `test -f 'gstrtpssrcdemux.c' || echo '$(srcdir)/'`gstrtpssrcdemux.c libgstrtpmanager_la-rtpjitterbuffer.lo: rtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpjitterbuffer.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Tpo -c -o libgstrtpmanager_la-rtpjitterbuffer.lo `test -f 'rtpjitterbuffer.c' || echo '$(srcdir)/'`rtpjitterbuffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpjitterbuffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpjitterbuffer.c' object='libgstrtpmanager_la-rtpjitterbuffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpjitterbuffer.lo `test -f 'rtpjitterbuffer.c' || echo '$(srcdir)/'`rtpjitterbuffer.c libgstrtpmanager_la-rtpsession.lo: rtpsession.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpsession.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpsession.Tpo -c -o libgstrtpmanager_la-rtpsession.lo `test -f 'rtpsession.c' || echo '$(srcdir)/'`rtpsession.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpsession.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpsession.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpsession.c' object='libgstrtpmanager_la-rtpsession.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpsession.lo `test -f 'rtpsession.c' || echo '$(srcdir)/'`rtpsession.c libgstrtpmanager_la-rtpsource.lo: rtpsource.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpsource.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpsource.Tpo -c -o libgstrtpmanager_la-rtpsource.lo `test -f 'rtpsource.c' || echo '$(srcdir)/'`rtpsource.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpsource.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpsource.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpsource.c' object='libgstrtpmanager_la-rtpsource.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpsource.lo `test -f 'rtpsource.c' || echo '$(srcdir)/'`rtpsource.c libgstrtpmanager_la-rtpstats.lo: rtpstats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-rtpstats.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-rtpstats.Tpo -c -o libgstrtpmanager_la-rtpstats.lo `test -f 'rtpstats.c' || echo '$(srcdir)/'`rtpstats.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-rtpstats.Tpo $(DEPDIR)/libgstrtpmanager_la-rtpstats.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtpstats.c' object='libgstrtpmanager_la-rtpstats.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-rtpstats.lo `test -f 'rtpstats.c' || echo '$(srcdir)/'`rtpstats.c libgstrtpmanager_la-gstrtpsession.lo: gstrtpsession.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpsession.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Tpo -c -o libgstrtpmanager_la-gstrtpsession.lo `test -f 'gstrtpsession.c' || echo '$(srcdir)/'`gstrtpsession.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpsession.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsession.c' object='libgstrtpmanager_la-gstrtpsession.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpsession.lo `test -f 'gstrtpsession.c' || echo '$(srcdir)/'`gstrtpsession.c libgstrtpmanager_la-gstrtpbin-marshal.lo: gstrtpbin-marshal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -MT libgstrtpmanager_la-gstrtpbin-marshal.lo -MD -MP -MF $(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Tpo -c -o libgstrtpmanager_la-gstrtpbin-marshal.lo `test -f 'gstrtpbin-marshal.c' || echo '$(srcdir)/'`gstrtpbin-marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Tpo $(DEPDIR)/libgstrtpmanager_la-gstrtpbin-marshal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbin-marshal.c' object='libgstrtpmanager_la-gstrtpbin-marshal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtpmanager_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtpmanager_la_CFLAGS) $(CFLAGS) -c -o libgstrtpmanager_la-gstrtpbin-marshal.lo `test -f 'gstrtpbin-marshal.c' || echo '$(srcdir)/'`gstrtpbin-marshal.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES # these are all the rules generating the relevant files $(glib_gen_basename)-marshal.h: $(glib_gen_basename)-marshal.list $(AM_V_GEN)glib-genmarshal --header --prefix=$(glib_gen_prefix)_marshal $^ > $(glib_gen_basename)-marshal.h.tmp && \ mv $(glib_gen_basename)-marshal.h.tmp $(glib_gen_basename)-marshal.h $(glib_gen_basename)-marshal.c: $(glib_gen_basename)-marshal.list $(AM_V_GEN)echo "#include \"$(glib_gen_basename)-marshal.h\"" >> $(glib_gen_basename)-marshal.c.tmp && \ glib-genmarshal --body --prefix=$(glib_gen_prefix)_marshal $^ >> $(glib_gen_basename)-marshal.c.tmp && \ mv $(glib_gen_basename)-marshal.c.tmp $(glib_gen_basename)-marshal.c $(glib_gen_basename)-enumtypes.h: $(glib_enum_headers) $(AM_V_GEN)glib-mkenums \ --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ --fprod "\n/* enumerations from \"@filename@\" */\n" \ --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ $^ > $@ $(glib_gen_basename)-enumtypes.c: $(glib_enum_headers) @if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi $(AM_V_GEN)glib-mkenums \ --fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \ --fprod "\n/* enumerations from \"@filename@\" */" \ --vhead "GType\n@enum_name@_get_type (void)\n{\n static volatile gsize g_define_type_id__volatile = 0;\n if (g_once_init_enter (&g_define_type_id__volatile)) {\n static const G@Type@Value values[] = {" \ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ --vtail " { 0, NULL, NULL }\n };\n GType g_define_type_id = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);\n }\n return g_define_type_id__volatile;\n}\n" \ $^ > $@ # a hack rule to make sure .Plo files exist because they get include'd # from Makefile's .deps/%-marshal.Plo: @touch $@ .deps/%-enumtypes.Plo: @touch $@ Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstrtpmanager -:SHARED libgstrtpmanager \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstrtpmanager_la_SOURCES) \ $(nodist_libgstrtpmanager_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtpmanager_la_CFLAGS) \ -:LDFLAGS $(libgstrtpmanager_la_LDFLAGS) \ $(libgstrtpmanager_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/rtpmanager/rtpjitterbuffer.c0000644000175000017500000006425211677341656020352 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include #include #include "rtpjitterbuffer.h" GST_DEBUG_CATEGORY_STATIC (rtp_jitter_buffer_debug); #define GST_CAT_DEFAULT rtp_jitter_buffer_debug #define MAX_WINDOW RTP_JITTER_BUFFER_MAX_WINDOW #define MAX_TIME (2 * GST_SECOND) /* signals and args */ enum { LAST_SIGNAL }; enum { PROP_0 }; /* GObject vmethods */ static void rtp_jitter_buffer_finalize (GObject * object); GType rtp_jitter_buffer_mode_get_type (void) { static GType jitter_buffer_mode_type = 0; static const GEnumValue jitter_buffer_modes[] = { {RTP_JITTER_BUFFER_MODE_NONE, "Only use RTP timestamps", "none"}, {RTP_JITTER_BUFFER_MODE_SLAVE, "Slave receiver to sender clock", "slave"}, {RTP_JITTER_BUFFER_MODE_BUFFER, "Do low/high watermark buffering", "buffer"}, {0, NULL, NULL}, }; if (!jitter_buffer_mode_type) { jitter_buffer_mode_type = g_enum_register_static ("RTPJitterBufferMode", jitter_buffer_modes); } return jitter_buffer_mode_type; } /* static guint rtp_jitter_buffer_signals[LAST_SIGNAL] = { 0 }; */ G_DEFINE_TYPE (RTPJitterBuffer, rtp_jitter_buffer, G_TYPE_OBJECT); static void rtp_jitter_buffer_class_init (RTPJitterBufferClass * klass) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) klass; gobject_class->finalize = rtp_jitter_buffer_finalize; GST_DEBUG_CATEGORY_INIT (rtp_jitter_buffer_debug, "rtpjitterbuffer", 0, "RTP Jitter Buffer"); } static void rtp_jitter_buffer_init (RTPJitterBuffer * jbuf) { jbuf->packets = g_queue_new (); jbuf->mode = RTP_JITTER_BUFFER_MODE_SLAVE; rtp_jitter_buffer_reset_skew (jbuf); } static void rtp_jitter_buffer_finalize (GObject * object) { RTPJitterBuffer *jbuf; jbuf = RTP_JITTER_BUFFER_CAST (object); rtp_jitter_buffer_flush (jbuf); g_queue_free (jbuf->packets); G_OBJECT_CLASS (rtp_jitter_buffer_parent_class)->finalize (object); } /** * rtp_jitter_buffer_new: * * Create an #RTPJitterBuffer. * * Returns: a new #RTPJitterBuffer. Use g_object_unref() after usage. */ RTPJitterBuffer * rtp_jitter_buffer_new (void) { RTPJitterBuffer *jbuf; jbuf = g_object_new (RTP_TYPE_JITTER_BUFFER, NULL); return jbuf; } /** * rtp_jitter_buffer_get_mode: * @jbuf: an #RTPJitterBuffer * * Get the current jitterbuffer mode. * * Returns: the current jitterbuffer mode. */ RTPJitterBufferMode rtp_jitter_buffer_get_mode (RTPJitterBuffer * jbuf) { return jbuf->mode; } /** * rtp_jitter_buffer_set_mode: * @jbuf: an #RTPJitterBuffer * @mode: a #RTPJitterBufferMode * * Set the buffering and clock slaving algorithm used in the @jbuf. */ void rtp_jitter_buffer_set_mode (RTPJitterBuffer * jbuf, RTPJitterBufferMode mode) { jbuf->mode = mode; } GstClockTime rtp_jitter_buffer_get_delay (RTPJitterBuffer * jbuf) { return jbuf->delay; } void rtp_jitter_buffer_set_delay (RTPJitterBuffer * jbuf, GstClockTime delay) { jbuf->delay = delay; jbuf->low_level = (delay * 15) / 100; /* the high level is at 90% in order to release packets before we fill up the * buffer up to the latency */ jbuf->high_level = (delay * 90) / 100; GST_DEBUG ("delay %" GST_TIME_FORMAT ", min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, GST_TIME_ARGS (jbuf->delay), GST_TIME_ARGS (jbuf->low_level), GST_TIME_ARGS (jbuf->high_level)); } /** * rtp_jitter_buffer_reset_skew: * @jbuf: an #RTPJitterBuffer * * Reset the skew calculations in @jbuf. */ void rtp_jitter_buffer_reset_skew (RTPJitterBuffer * jbuf) { jbuf->base_time = -1; jbuf->base_rtptime = -1; jbuf->base_extrtp = -1; jbuf->clock_rate = -1; jbuf->ext_rtptime = -1; jbuf->last_rtptime = -1; jbuf->window_pos = 0; jbuf->window_filling = TRUE; jbuf->window_min = 0; jbuf->skew = 0; jbuf->prev_send_diff = -1; jbuf->prev_out_time = -1; GST_DEBUG ("reset skew correction"); } static void rtp_jitter_buffer_resync (RTPJitterBuffer * jbuf, GstClockTime time, GstClockTime gstrtptime, guint64 ext_rtptime, gboolean reset_skew) { jbuf->base_time = time; jbuf->base_rtptime = gstrtptime; jbuf->base_extrtp = ext_rtptime; jbuf->prev_out_time = -1; jbuf->prev_send_diff = -1; if (reset_skew) { jbuf->window_filling = TRUE; jbuf->window_pos = 0; jbuf->window_min = 0; jbuf->window_size = 0; jbuf->skew = 0; } } static guint64 get_buffer_level (RTPJitterBuffer * jbuf) { GstBuffer *high_buf = NULL, *low_buf = NULL; guint64 level; GList *find; /* first first buffer with timestamp */ find = g_queue_peek_head_link (jbuf->packets); while (find) { high_buf = find->data; if (GST_BUFFER_TIMESTAMP (high_buf) != -1) break; high_buf = NULL; find = g_list_next (find); } find = g_queue_peek_tail_link (jbuf->packets); while (find) { low_buf = find->data; if (GST_BUFFER_TIMESTAMP (low_buf) != -1) break; low_buf = NULL; find = g_list_previous (find); } if (!high_buf || !low_buf || high_buf == low_buf) { level = 0; } else { guint64 high_ts, low_ts; high_ts = GST_BUFFER_TIMESTAMP (high_buf); low_ts = GST_BUFFER_TIMESTAMP (low_buf); if (high_ts > low_ts) level = high_ts - low_ts; else level = 0; GST_LOG_OBJECT (jbuf, "low %" GST_TIME_FORMAT " high %" GST_TIME_FORMAT " level %" G_GUINT64_FORMAT, GST_TIME_ARGS (low_ts), GST_TIME_ARGS (high_ts), level); } return level; } static void update_buffer_level (RTPJitterBuffer * jbuf, gint * percent) { gboolean post = FALSE; guint64 level; level = get_buffer_level (jbuf); GST_DEBUG ("buffer level %" GST_TIME_FORMAT, GST_TIME_ARGS (level)); if (jbuf->buffering) { post = TRUE; if (level > jbuf->high_level) { GST_DEBUG ("buffering finished"); jbuf->buffering = FALSE; } } else { if (level < jbuf->low_level) { GST_DEBUG ("buffering started"); jbuf->buffering = TRUE; post = TRUE; } } if (post) { gint perc; if (jbuf->buffering && (jbuf->high_level != 0)) { perc = (level * 100 / jbuf->high_level); perc = MIN (perc, 100); } else { perc = 100; } if (percent) *percent = perc; GST_DEBUG ("buffering %d", perc); } } /* For the clock skew we use a windowed low point averaging algorithm as can be * found in Fober, Orlarey and Letz, 2005, "Real Time Clock Skew Estimation * over Network Delays": * http://www.grame.fr/Ressources/pub/TR-050601.pdf * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.1546 * * The idea is that the jitter is composed of: * * J = N + n * * N : a constant network delay. * n : random added noise. The noise is concentrated around 0 * * In the receiver we can track the elapsed time at the sender with: * * send_diff(i) = (Tsi - Ts0); * * Tsi : The time at the sender at packet i * Ts0 : The time at the sender at the first packet * * This is the difference between the RTP timestamp in the first received packet * and the current packet. * * At the receiver we have to deal with the jitter introduced by the network. * * recv_diff(i) = (Tri - Tr0) * * Tri : The time at the receiver at packet i * Tr0 : The time at the receiver at the first packet * * Both of these values contain a jitter Ji, a jitter for packet i, so we can * write: * * recv_diff(i) = (Cri + D + ni) - (Cr0 + D + n0)) * * Cri : The time of the clock at the receiver for packet i * D + ni : The jitter when receiving packet i * * We see that the network delay is irrelevant here as we can elliminate D: * * recv_diff(i) = (Cri + ni) - (Cr0 + n0)) * * The drift is now expressed as: * * Drift(i) = recv_diff(i) - send_diff(i); * * We now keep the W latest values of Drift and find the minimum (this is the * one with the lowest network jitter and thus the one which is least affected * by it). We average this lowest value to smooth out the resulting network skew. * * Both the window and the weighting used for averaging influence the accuracy * of the drift estimation. Finding the correct parameters turns out to be a * compromise between accuracy and inertia. * * We use a 2 second window or up to 512 data points, which is statistically big * enough to catch spikes (FIXME, detect spikes). * We also use a rather large weighting factor (125) to smoothly adapt. During * startup, when filling the window, we use a parabolic weighting factor, the * more the window is filled, the faster we move to the detected possible skew. * * Returns: @time adjusted with the clock skew. */ static GstClockTime calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time, guint32 clock_rate) { guint64 ext_rtptime; guint64 send_diff, recv_diff; gint64 delta; gint64 old; gint pos, i; GstClockTime gstrtptime, out_time; guint64 slope; ext_rtptime = gst_rtp_buffer_ext_timestamp (&jbuf->ext_rtptime, rtptime); gstrtptime = gst_util_uint64_scale_int (ext_rtptime, GST_SECOND, clock_rate); /* keep track of the last extended rtptime */ jbuf->last_rtptime = ext_rtptime; if (jbuf->clock_rate != clock_rate) { if (jbuf->clock_rate == -1) { GST_DEBUG ("Clock rate changed from %" G_GUINT32_FORMAT " to %" G_GUINT32_FORMAT, jbuf->clock_rate, clock_rate); } else { GST_WARNING ("Clock rate changed from %" G_GUINT32_FORMAT " to %" G_GUINT32_FORMAT, jbuf->clock_rate, clock_rate); } jbuf->base_time = -1; jbuf->base_rtptime = -1; jbuf->clock_rate = clock_rate; jbuf->prev_out_time = -1; jbuf->prev_send_diff = -1; } /* first time, lock on to time and gstrtptime */ if (G_UNLIKELY (jbuf->base_time == -1)) { jbuf->base_time = time; jbuf->prev_out_time = -1; GST_DEBUG ("Taking new base time %" GST_TIME_FORMAT, GST_TIME_ARGS (time)); } if (G_UNLIKELY (jbuf->base_rtptime == -1)) { jbuf->base_rtptime = gstrtptime; jbuf->base_extrtp = ext_rtptime; jbuf->prev_send_diff = -1; GST_DEBUG ("Taking new base rtptime %" GST_TIME_FORMAT, GST_TIME_ARGS (gstrtptime)); } if (G_LIKELY (gstrtptime >= jbuf->base_rtptime)) send_diff = gstrtptime - jbuf->base_rtptime; else if (time != -1) { /* elapsed time at sender, timestamps can go backwards and thus be smaller * than our base time, take a new base time in that case. */ GST_WARNING ("backward timestamps at server, taking new base time"); rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, FALSE); send_diff = 0; } else { GST_WARNING ("backward timestamps at server but no timestamps"); send_diff = 0; /* at least try to get a new timestamp.. */ jbuf->base_time = -1; } GST_DEBUG ("extrtp %" G_GUINT64_FORMAT ", gstrtp %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT, ext_rtptime, GST_TIME_ARGS (gstrtptime), GST_TIME_ARGS (jbuf->base_rtptime), GST_TIME_ARGS (send_diff)); /* we don't have an arrival timestamp so we can't do skew detection. we * should still apply a timestamp based on RTP timestamp and base_time */ if (time == -1 || jbuf->base_time == -1) goto no_skew; /* elapsed time at receiver, includes the jitter */ recv_diff = time - jbuf->base_time; /* measure the diff */ delta = ((gint64) recv_diff) - ((gint64) send_diff); /* measure the slope, this gives a rought estimate between the sender speed * and the receiver speed. This should be approximately 8, higher values * indicate a burst (especially when the connection starts) */ if (recv_diff > 0) slope = (send_diff * 8) / recv_diff; else slope = 8; GST_DEBUG ("time %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", recv_diff %" GST_TIME_FORMAT ", slope %" G_GUINT64_FORMAT, GST_TIME_ARGS (time), GST_TIME_ARGS (jbuf->base_time), GST_TIME_ARGS (recv_diff), slope); /* if the difference between the sender timeline and the receiver timeline * changed too quickly we have to resync because the server likely restarted * its timestamps. */ if (ABS (delta - jbuf->skew) > GST_SECOND) { GST_WARNING ("delta - skew: %" GST_TIME_FORMAT " too big, reset skew", GST_TIME_ARGS (delta - jbuf->skew)); rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, TRUE); send_diff = 0; delta = 0; } pos = jbuf->window_pos; if (G_UNLIKELY (jbuf->window_filling)) { /* we are filling the window */ GST_DEBUG ("filling %d, delta %" G_GINT64_FORMAT, pos, delta); jbuf->window[pos++] = delta; /* calc the min delta we observed */ if (G_UNLIKELY (pos == 1 || delta < jbuf->window_min)) jbuf->window_min = delta; if (G_UNLIKELY (send_diff >= MAX_TIME || pos >= MAX_WINDOW)) { jbuf->window_size = pos; /* window filled */ GST_DEBUG ("min %" G_GINT64_FORMAT, jbuf->window_min); /* the skew is now the min */ jbuf->skew = jbuf->window_min; jbuf->window_filling = FALSE; } else { gint perc_time, perc_window, perc; /* figure out how much we filled the window, this depends on the amount of * time we have or the max number of points we keep. */ perc_time = send_diff * 100 / MAX_TIME; perc_window = pos * 100 / MAX_WINDOW; perc = MAX (perc_time, perc_window); /* make a parabolic function, the closer we get to the MAX, the more value * we give to the scaling factor of the new value */ perc = perc * perc; /* quickly go to the min value when we are filling up, slowly when we are * just starting because we're not sure it's a good value yet. */ jbuf->skew = (perc * jbuf->window_min + ((10000 - perc) * jbuf->skew)) / 10000; jbuf->window_size = pos + 1; } } else { /* pick old value and store new value. We keep the previous value in order * to quickly check if the min of the window changed */ old = jbuf->window[pos]; jbuf->window[pos++] = delta; if (G_UNLIKELY (delta <= jbuf->window_min)) { /* if the new value we inserted is smaller or equal to the current min, * it becomes the new min */ jbuf->window_min = delta; } else if (G_UNLIKELY (old == jbuf->window_min)) { gint64 min = G_MAXINT64; /* if we removed the old min, we have to find a new min */ for (i = 0; i < jbuf->window_size; i++) { /* we found another value equal to the old min, we can stop searching now */ if (jbuf->window[i] == old) { min = old; break; } if (jbuf->window[i] < min) min = jbuf->window[i]; } jbuf->window_min = min; } /* average the min values */ jbuf->skew = (jbuf->window_min + (124 * jbuf->skew)) / 125; GST_DEBUG ("delta %" G_GINT64_FORMAT ", new min: %" G_GINT64_FORMAT, delta, jbuf->window_min); } /* wrap around in the window */ if (G_UNLIKELY (pos >= jbuf->window_size)) pos = 0; jbuf->window_pos = pos; no_skew: /* the output time is defined as the base timestamp plus the RTP time * adjusted for the clock skew .*/ if (jbuf->base_time != -1) { out_time = jbuf->base_time + send_diff; /* skew can be negative and we don't want to make invalid timestamps */ if (jbuf->skew < 0 && out_time < -jbuf->skew) { out_time = 0; } else { out_time += jbuf->skew; } /* check if timestamps are not going backwards, we can only check this if we * have a previous out time and a previous send_diff */ if (G_LIKELY (jbuf->prev_out_time != -1 && jbuf->prev_send_diff != -1)) { /* now check for backwards timestamps */ if (G_UNLIKELY ( /* if the server timestamps went up and the out_time backwards */ (send_diff > jbuf->prev_send_diff && out_time < jbuf->prev_out_time) || /* if the server timestamps went backwards and the out_time forwards */ (send_diff < jbuf->prev_send_diff && out_time > jbuf->prev_out_time) || /* if the server timestamps did not change */ send_diff == jbuf->prev_send_diff)) { GST_DEBUG ("backwards timestamps, using previous time"); out_time = jbuf->prev_out_time; } } if (time != -1 && out_time + jbuf->delay < time) { /* if we are going to produce a timestamp that is later than the input * timestamp, we need to reset the jitterbuffer. Likely the server paused * temporarily */ GST_DEBUG ("out %" GST_TIME_FORMAT " + %" G_GUINT64_FORMAT " < time %" GST_TIME_FORMAT ", reset jitterbuffer", GST_TIME_ARGS (out_time), jbuf->delay, GST_TIME_ARGS (time)); rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, TRUE); out_time = time; send_diff = 0; } } else out_time = -1; jbuf->prev_out_time = out_time; jbuf->prev_send_diff = send_diff; GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, jbuf->skew, GST_TIME_ARGS (out_time)); return out_time; } /** * rtp_jitter_buffer_insert: * @jbuf: an #RTPJitterBuffer * @buf: a buffer * @time: a running_time when this buffer was received in nanoseconds * @clock_rate: the clock-rate of the payload of @buf * @max_delay: the maximum lateness of @buf * @tail: TRUE when the tail element changed. * * Inserts @buf into the packet queue of @jbuf. The sequence number of the * packet will be used to sort the packets. This function takes ownerhip of * @buf when the function returns %TRUE. * @buf should have writable metadata when calling this function. * * Returns: %FALSE if a packet with the same number already existed. */ gboolean rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, GstBuffer * buf, GstClockTime time, guint32 clock_rate, gboolean * tail, gint * percent) { GList *list; guint32 rtptime; guint16 seqnum; g_return_val_if_fail (jbuf != NULL, FALSE); g_return_val_if_fail (buf != NULL, FALSE); seqnum = gst_rtp_buffer_get_seq (buf); /* loop the list to skip strictly smaller seqnum buffers */ for (list = jbuf->packets->head; list; list = g_list_next (list)) { guint16 qseq; gint gap; qseq = gst_rtp_buffer_get_seq (GST_BUFFER_CAST (list->data)); /* compare the new seqnum to the one in the buffer */ gap = gst_rtp_buffer_compare_seqnum (seqnum, qseq); /* we hit a packet with the same seqnum, notify a duplicate */ if (G_UNLIKELY (gap == 0)) goto duplicate; /* seqnum > qseq, we can stop looking */ if (G_LIKELY (gap < 0)) break; } rtptime = gst_rtp_buffer_get_timestamp (buf); /* rtp time jumps are checked for during skew calculation, but bypassed * in other mode, so mind those here and reset jb if needed. * Only reset if valid input time, which is likely for UDP input * where we expect this might happen due to async thread effects * (in seek and state change cycles), but not so much for TCP input */ if (GST_CLOCK_TIME_IS_VALID (time) && jbuf->mode != RTP_JITTER_BUFFER_MODE_SLAVE && jbuf->base_time != -1 && jbuf->last_rtptime != -1) { GstClockTime ext_rtptime = jbuf->ext_rtptime; ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime); if (ext_rtptime > jbuf->last_rtptime + 3 * clock_rate || ext_rtptime + 3 * clock_rate < jbuf->last_rtptime) { /* reset even if we don't have valid incoming time; * still better than producing possibly very bogus output timestamp */ GST_WARNING ("rtp delta too big, reset skew"); rtp_jitter_buffer_reset_skew (jbuf); } } switch (jbuf->mode) { case RTP_JITTER_BUFFER_MODE_NONE: case RTP_JITTER_BUFFER_MODE_BUFFER: /* send 0 as the first timestamp and -1 for the other ones. This will * interpollate them from the RTP timestamps with a 0 origin. In buffering * mode we will adjust the outgoing timestamps according to the amount of * time we spent buffering. */ if (jbuf->base_time == -1) time = 0; else time = -1; break; case RTP_JITTER_BUFFER_MODE_SLAVE: default: break; } /* do skew calculation by measuring the difference between rtptime and the * receive time, this function will retimestamp @buf with the skew corrected * running time. */ time = calculate_skew (jbuf, rtptime, time, clock_rate); GST_BUFFER_TIMESTAMP (buf) = time; /* It's more likely that the packet was inserted in the front of the buffer */ if (G_LIKELY (list)) g_queue_insert_before (jbuf->packets, list, buf); else g_queue_push_tail (jbuf->packets, buf); /* buffering mode, update buffer stats */ if (jbuf->mode == RTP_JITTER_BUFFER_MODE_BUFFER) update_buffer_level (jbuf, percent); else *percent = -1; /* tail was changed when we did not find a previous packet, we set the return * flag when requested. */ if (G_LIKELY (tail)) *tail = (list == NULL); return TRUE; /* ERRORS */ duplicate: { GST_WARNING ("duplicate packet %d found", (gint) seqnum); return FALSE; } } /** * rtp_jitter_buffer_pop: * @jbuf: an #RTPJitterBuffer * @percent: the buffering percent * * Pops the oldest buffer from the packet queue of @jbuf. The popped buffer will * have its timestamp adjusted with the incomming running_time and the detected * clock skew. * * Returns: a #GstBuffer or %NULL when there was no packet in the queue. */ GstBuffer * rtp_jitter_buffer_pop (RTPJitterBuffer * jbuf, gint * percent) { GstBuffer *buf; g_return_val_if_fail (jbuf != NULL, NULL); buf = g_queue_pop_tail (jbuf->packets); /* buffering mode, update buffer stats */ if (jbuf->mode == RTP_JITTER_BUFFER_MODE_BUFFER) update_buffer_level (jbuf, percent); else *percent = -1; return buf; } /** * rtp_jitter_buffer_peek: * @jbuf: an #RTPJitterBuffer * * Peek the oldest buffer from the packet queue of @jbuf. Register a callback * with rtp_jitter_buffer_set_tail_changed() to be notified when an older packet * was inserted in the queue. * * Returns: a #GstBuffer or %NULL when there was no packet in the queue. */ GstBuffer * rtp_jitter_buffer_peek (RTPJitterBuffer * jbuf) { GstBuffer *buf; g_return_val_if_fail (jbuf != NULL, NULL); buf = g_queue_peek_tail (jbuf->packets); return buf; } /** * rtp_jitter_buffer_flush: * @jbuf: an #RTPJitterBuffer * * Flush all packets from the jitterbuffer. */ void rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf) { GstBuffer *buffer; g_return_if_fail (jbuf != NULL); while ((buffer = g_queue_pop_head (jbuf->packets))) gst_buffer_unref (buffer); } /** * rtp_jitter_buffer_is_buffering: * @jbuf: an #RTPJitterBuffer * * Check if @jbuf is buffering currently. Users of the jitterbuffer should not * pop packets while in buffering mode. * * Returns: the buffering state of @jbuf */ gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf) { return jbuf->buffering; } /** * rtp_jitter_buffer_set_buffering: * @jbuf: an #RTPJitterBuffer * @buffering: the new buffering state * * Forces @jbuf to go into the buffering state. */ void rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering) { jbuf->buffering = buffering; } /** * rtp_jitter_buffer_get_percent: * @jbuf: an #RTPJitterBuffer * * Get the buffering percent of the jitterbuffer. * * Returns: the buffering percent */ gint rtp_jitter_buffer_get_percent (RTPJitterBuffer * jbuf) { gint percent; guint64 level; if (G_UNLIKELY (jbuf->high_level == 0)) return 100; level = get_buffer_level (jbuf); percent = (level * 100 / jbuf->high_level); percent = MIN (percent, 100); return percent; } /** * rtp_jitter_buffer_num_packets: * @jbuf: an #RTPJitterBuffer * * Get the number of packets currently in "jbuf. * * Returns: The number of packets in @jbuf. */ guint rtp_jitter_buffer_num_packets (RTPJitterBuffer * jbuf) { g_return_val_if_fail (jbuf != NULL, 0); return jbuf->packets->length; } /** * rtp_jitter_buffer_get_ts_diff: * @jbuf: an #RTPJitterBuffer * * Get the difference between the timestamps of first and last packet in the * jitterbuffer. * * Returns: The difference expressed in the timestamp units of the packets. */ guint32 rtp_jitter_buffer_get_ts_diff (RTPJitterBuffer * jbuf) { guint64 high_ts, low_ts; GstBuffer *high_buf, *low_buf; guint32 result; g_return_val_if_fail (jbuf != NULL, 0); high_buf = g_queue_peek_head (jbuf->packets); low_buf = g_queue_peek_tail (jbuf->packets); if (!high_buf || !low_buf || high_buf == low_buf) return 0; high_ts = gst_rtp_buffer_get_timestamp (high_buf); low_ts = gst_rtp_buffer_get_timestamp (low_buf); /* it needs to work if ts wraps */ if (high_ts >= low_ts) { result = (guint32) (high_ts - low_ts); } else { result = (guint32) (high_ts + G_MAXUINT32 + 1 - low_ts); } return result; } /** * rtp_jitter_buffer_get_sync: * @jbuf: an #RTPJitterBuffer * @rtptime: result RTP time * @timestamp: result GStreamer timestamp * @clock_rate: clock-rate of @rtptime * @last_rtptime: last seen rtptime. * * Calculates the relation between the RTP timestamp and the GStreamer timestamp * used for constructing timestamps. * * For extended RTP timestamp @rtptime with a clock-rate of @clock_rate, * the GStreamer timestamp is currently @timestamp. * * The last seen extended RTP timestamp with clock-rate @clock-rate is returned in * @last_rtptime. */ void rtp_jitter_buffer_get_sync (RTPJitterBuffer * jbuf, guint64 * rtptime, guint64 * timestamp, guint32 * clock_rate, guint64 * last_rtptime) { if (rtptime) *rtptime = jbuf->base_extrtp; if (timestamp) *timestamp = jbuf->base_time + jbuf->skew; if (clock_rate) *clock_rate = jbuf->clock_rate; if (last_rtptime) *last_rtptime = jbuf->last_rtptime; } gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpptdemux.c0000644000175000017500000003745411705514311020045 00000000000000/* * RTP Demux element * * Copyright (C) 2005 Nokia Corporation. * @author Kai Vehmanen * * Loosely based on GStreamer gstdecodebin * Copyright (C) <2004> Wim Taymans * * 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-gstrtpptdemux * * gstrtpptdemux acts as a demuxer for RTP packets based on the payload type of * the packets. Its main purpose is to allow an application to easily receive * and decode an RTP stream with multiple payload types. * * For each payload type that is detected, a new pad will be created and the * #GstRtpPtDemux::new-payload-type signal will be emitted. When the payload for * the RTP stream changes, the #GstRtpPtDemux::payload-type-change signal will be * emitted. * * The element will try to set complete and unique application/x-rtp caps on the * outgoing buffers and pads based on the result of the * #GstRtpPtDemux::request-pt-map signal. * * * Example pipelines * |[ * gst-launch udpsrc caps="application/x-rtp" ! gstrtpptdemux ! fakesink * ]| Takes an RTP stream and send the RTP packets with the first detected * payload type to fakesink, discarding the other payload types. * * * Last reviewed on 2007-05-28 (0.10.5) */ /* * Contributors: * Andre Moreira Magalhaes */ /* * Status: * - works with the test_rtpdemux.c tool * * Check: * - is emitting a signal enough, or should we * use GstEvent to notify downstream elements * of the new packet... no? * * Notes: * - emits event both for new PTs, and whenever * a PT is changed */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "gstrtpbin-marshal.h" #include "gstrtpptdemux.h" /* generic templates */ static GstStaticPadTemplate rtp_pt_demux_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtp_pt_demux_src_template = GST_STATIC_PAD_TEMPLATE ("src_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp, " "payload = (int) [ 0, 255 ]") ); GST_DEBUG_CATEGORY_STATIC (gst_rtp_pt_demux_debug); #define GST_CAT_DEFAULT gst_rtp_pt_demux_debug /* * Item for storing GstPad<->pt pairs. */ struct _GstRtpPtDemuxPad { GstPad *pad; /**< pointer to the actual pad */ gint pt; /**< RTP payload-type attached to pad */ gboolean newcaps; }; /* signals */ enum { SIGNAL_REQUEST_PT_MAP, SIGNAL_NEW_PAYLOAD_TYPE, SIGNAL_PAYLOAD_TYPE_CHANGE, SIGNAL_CLEAR_PT_MAP, LAST_SIGNAL }; GST_BOILERPLATE (GstRtpPtDemux, gst_rtp_pt_demux, GstElement, GST_TYPE_ELEMENT); static void gst_rtp_pt_demux_finalize (GObject * object); static void gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux); static gboolean gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux); static gboolean gst_rtp_pt_demux_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf); static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_pt_demux_clear_pt_map (GstRtpPtDemux * rtpdemux); static GstRtpPtDemuxPad *find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt); static gboolean gst_rtp_pt_demux_src_event (GstPad * pad, GstEvent * event); static guint gst_rtp_pt_demux_signals[LAST_SIGNAL] = { 0 }; static void gst_rtp_pt_demux_base_init (gpointer g_class) { GstElementClass *gstelement_klass = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (gstelement_klass, &rtp_pt_demux_sink_template); gst_element_class_add_static_pad_template (gstelement_klass, &rtp_pt_demux_src_template); gst_element_class_set_details_simple (gstelement_klass, "RTP Demux", "Demux/Network/RTP", "Parses codec streams transmitted in the same RTP session", "Kai Vehmanen "); } static void gst_rtp_pt_demux_class_init (GstRtpPtDemuxClass * klass) { GObjectClass *gobject_klass; GstElementClass *gstelement_klass; gobject_klass = (GObjectClass *) klass; gstelement_klass = (GstElementClass *) klass; /** * GstRtpPtDemux::request-pt-map: * @demux: the object which received the signal * @pt: the payload type * * Request the payload type as #GstCaps for @pt. */ gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP] = g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, request_pt_map), NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT, GST_TYPE_CAPS, 1, G_TYPE_UINT); /** * GstRtpPtDemux::new-payload-type: * @demux: the object which received the signal * @pt: the payload type * @pad: the pad with the new payload * * Emited when a new payload type pad has been created in @demux. */ gst_rtp_pt_demux_signals[SIGNAL_NEW_PAYLOAD_TYPE] = g_signal_new ("new-payload-type", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, new_payload_type), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_OBJECT, G_TYPE_NONE, 2, G_TYPE_UINT, GST_TYPE_PAD); /** * GstRtpPtDemux::payload-type-change: * @demux: the object which received the signal * @pt: the new payload type * * Emited when the payload type changed. */ gst_rtp_pt_demux_signals[SIGNAL_PAYLOAD_TYPE_CHANGE] = g_signal_new ("payload-type-change", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, payload_type_change), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * GstRtpPtDemux::clear-pt-map: * @demux: the object which received the signal * * The application can call this signal to instruct the element to discard the * currently cached payload type map. */ gst_rtp_pt_demux_signals[SIGNAL_CLEAR_PT_MAP] = g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_ACTION | G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpPtDemuxClass, clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); gobject_klass->finalize = gst_rtp_pt_demux_finalize; gstelement_klass->change_state = GST_DEBUG_FUNCPTR (gst_rtp_pt_demux_change_state); klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_pt_demux_clear_pt_map); GST_DEBUG_CATEGORY_INIT (gst_rtp_pt_demux_debug, "rtpptdemux", 0, "RTP codec demuxer"); } static void gst_rtp_pt_demux_init (GstRtpPtDemux * ptdemux, GstRtpPtDemuxClass * g_class) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (ptdemux); ptdemux->sink = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); g_assert (ptdemux->sink != NULL); gst_pad_set_chain_function (ptdemux->sink, gst_rtp_pt_demux_chain); gst_pad_set_event_function (ptdemux->sink, gst_rtp_pt_demux_sink_event); gst_element_add_pad (GST_ELEMENT (ptdemux), ptdemux->sink); } static void gst_rtp_pt_demux_finalize (GObject * object) { gst_rtp_pt_demux_release (GST_RTP_PT_DEMUX (object)); G_OBJECT_CLASS (parent_class)->finalize (object); } static GstCaps * gst_rtp_pt_demux_get_caps (GstRtpPtDemux * rtpdemux, guint pt) { GstCaps *caps; GValue ret = { 0 }; GValue args[2] = { {0}, {0} }; /* figure out the caps */ g_value_init (&args[0], GST_TYPE_ELEMENT); g_value_set_object (&args[0], rtpdemux); g_value_init (&args[1], G_TYPE_UINT); g_value_set_uint (&args[1], pt); g_value_init (&ret, GST_TYPE_CAPS); g_value_set_boxed (&ret, NULL); g_signal_emitv (args, gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); g_value_unset (&args[0]); g_value_unset (&args[1]); caps = g_value_dup_boxed (&ret); g_value_unset (&ret); if (caps == NULL) { caps = GST_PAD_CAPS (rtpdemux->sink); if (caps) gst_caps_ref (caps); } GST_DEBUG ("pt %d, got caps %" GST_PTR_FORMAT, pt, caps); return caps; } static void gst_rtp_pt_demux_clear_pt_map (GstRtpPtDemux * rtpdemux) { GSList *walk; GST_OBJECT_LOCK (rtpdemux); GST_DEBUG ("clearing pt map"); for (walk = rtpdemux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpPtDemuxPad *pad = walk->data; pad->newcaps = TRUE; } GST_OBJECT_UNLOCK (rtpdemux); } static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; GstRtpPtDemux *rtpdemux; GstElement *element = GST_ELEMENT (GST_OBJECT_PARENT (pad)); guint8 pt; GstPad *srcpad; GstRtpPtDemuxPad *rtpdemuxpad; GstCaps *caps; rtpdemux = GST_RTP_PT_DEMUX (GST_OBJECT_PARENT (pad)); if (!gst_rtp_buffer_validate (buf)) goto invalid_buffer; pt = gst_rtp_buffer_get_payload_type (buf); GST_DEBUG_OBJECT (rtpdemux, "received buffer for pt %d", pt); rtpdemuxpad = find_pad_for_pt (rtpdemux, pt); if (rtpdemuxpad == NULL) { /* new PT, create a src pad */ GstElementClass *klass; GstPadTemplate *templ; gchar *padname; caps = gst_rtp_pt_demux_get_caps (rtpdemux, pt); if (!caps) goto no_caps; klass = GST_ELEMENT_GET_CLASS (rtpdemux); templ = gst_element_class_get_pad_template (klass, "src_%d"); padname = g_strdup_printf ("src_%d", pt); srcpad = gst_pad_new_from_template (templ, padname); gst_pad_use_fixed_caps (srcpad); g_free (padname); gst_pad_set_event_function (srcpad, gst_rtp_pt_demux_src_event); caps = gst_caps_make_writable (caps); gst_caps_set_simple (caps, "payload", G_TYPE_INT, pt, NULL); gst_pad_set_caps (srcpad, caps); gst_caps_unref (caps); GST_DEBUG ("Adding pt=%d to the list.", pt); rtpdemuxpad = g_new0 (GstRtpPtDemuxPad, 1); rtpdemuxpad->pt = pt; rtpdemuxpad->newcaps = FALSE; rtpdemuxpad->pad = srcpad; GST_OBJECT_LOCK (rtpdemux); rtpdemux->srcpads = g_slist_append (rtpdemux->srcpads, rtpdemuxpad); GST_OBJECT_UNLOCK (rtpdemux); gst_pad_set_active (srcpad, TRUE); gst_element_add_pad (element, srcpad); GST_DEBUG ("emitting new-payload-type for pt %d", pt); g_signal_emit (G_OBJECT (rtpdemux), gst_rtp_pt_demux_signals[SIGNAL_NEW_PAYLOAD_TYPE], 0, pt, srcpad); } srcpad = rtpdemuxpad->pad; if (pt != rtpdemux->last_pt) { gint emit_pt = pt; /* our own signal with an extra flag that this is the only pad */ rtpdemux->last_pt = pt; GST_DEBUG ("emitting payload-type-changed for pt %d", emit_pt); g_signal_emit (G_OBJECT (rtpdemux), gst_rtp_pt_demux_signals[SIGNAL_PAYLOAD_TYPE_CHANGE], 0, emit_pt); } if (rtpdemuxpad->newcaps) { GST_DEBUG ("need new caps"); caps = gst_rtp_pt_demux_get_caps (rtpdemux, pt); if (!caps) goto no_caps; caps = gst_caps_make_writable (caps); gst_caps_set_simple (caps, "payload", G_TYPE_INT, pt, NULL); gst_pad_set_caps (srcpad, caps); gst_caps_unref (caps); rtpdemuxpad->newcaps = FALSE; } gst_buffer_set_caps (buf, GST_PAD_CAPS (srcpad)); /* push to srcpad */ ret = gst_pad_push (srcpad, buf); return ret; /* ERRORS */ invalid_buffer: { /* this is fatal and should be filtered earlier */ GST_ELEMENT_ERROR (rtpdemux, STREAM, DECODE, (NULL), ("Dropping invalid RTP payload")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } no_caps: { GST_ELEMENT_ERROR (rtpdemux, STREAM, DECODE, (NULL), ("Could not get caps for payload")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static GstRtpPtDemuxPad * find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt) { GstRtpPtDemuxPad *respad = NULL; GSList *walk; for (walk = rtpdemux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpPtDemuxPad *pad = walk->data; if (pad->pt == pt) { respad = pad; break; } } return respad; } static gboolean gst_rtp_pt_demux_sink_event (GstPad * pad, GstEvent * event) { GstRtpPtDemux *rtpdemux; gboolean res = FALSE; rtpdemux = GST_RTP_PT_DEMUX (gst_pad_get_parent (pad)); if (G_UNLIKELY (rtpdemux == NULL)) { gst_event_unref (event); return FALSE; } switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_DOWNSTREAM: { const GstStructure *s; s = gst_event_get_structure (event); if (gst_structure_has_name (s, "GstRTPPacketLost")) { GstRtpPtDemuxPad *rtpdemuxpad = find_pad_for_pt (rtpdemux, rtpdemux->last_pt); if (rtpdemuxpad) res = gst_pad_push_event (rtpdemuxpad->pad, event); else gst_event_unref (event); } else { res = gst_pad_event_default (pad, event); } break; } default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (rtpdemux); return res; } static gboolean gst_rtp_pt_demux_src_event (GstPad * pad, GstEvent * event) { GstRtpPtDemux *demux; const GstStructure *s; demux = GST_RTP_PT_DEMUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_UPSTREAM: case GST_EVENT_CUSTOM_BOTH: case GST_EVENT_CUSTOM_BOTH_OOB: s = gst_event_get_structure (event); if (s && !gst_structure_has_field (s, "payload")) { GSList *walk; for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpPtDemuxPad *dpad = (GstRtpPtDemuxPad *) walk->data; if (dpad->pad == pad) { event = GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (event))); gst_structure_set (event->structure, "payload", G_TYPE_UINT, dpad->pt, NULL); break; } } } break; default: break; } gst_object_unref (demux); return gst_pad_event_default (pad, event); } /* * Reserves resources for the object. */ static gboolean gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux) { ptdemux->srcpads = NULL; ptdemux->last_pt = 0xFFFF; return TRUE; } /* * Free resources for the object. */ static void gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux) { GSList *walk; for (walk = ptdemux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpPtDemuxPad *pad = walk->data; gst_pad_set_active (pad->pad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (ptdemux), pad->pad); g_free (pad); } g_slist_free (ptdemux->srcpads); ptdemux->srcpads = NULL; } static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRtpPtDemux *ptdemux; ptdemux = GST_RTP_PT_DEMUX (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (gst_rtp_pt_demux_setup (ptdemux) != TRUE) ret = GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_PAUSED_TO_PLAYING: default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: gst_rtp_pt_demux_release (ptdemux); break; default: break; } return ret; } gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpptdemux.h0000644000175000017500000000452211671175354020054 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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_RTP_PT_DEMUX_H__ #define __GST_RTP_PT_DEMUX_H__ #include #define GST_TYPE_RTP_PT_DEMUX (gst_rtp_pt_demux_get_type()) #define GST_RTP_PT_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PT_DEMUX,GstRtpPtDemux)) #define GST_RTP_PT_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PT_DEMUX,GstRtpPtDemuxClass)) #define GST_IS_RTP_PT_DEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PT_DEMUX)) #define GST_IS_RTP_PT_DEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PT_DEMUX)) typedef struct _GstRtpPtDemux GstRtpPtDemux; typedef struct _GstRtpPtDemuxClass GstRtpPtDemuxClass; typedef struct _GstRtpPtDemuxPad GstRtpPtDemuxPad; struct _GstRtpPtDemux { GstElement parent; /**< parent class */ GstPad *sink; /**< the sink pad */ guint16 last_pt; /**< pt of the last packet 0xFFFF if none */ GSList *srcpads; /**< a linked list of GstRtpPtDemuxPad objects */ }; struct _GstRtpPtDemuxClass { GstElementClass parent_class; /* get the caps for pt */ GstCaps* (*request_pt_map) (GstRtpPtDemux *demux, guint pt); /* signal emmited when a new PT is found from the incoming stream */ void (*new_payload_type) (GstRtpPtDemux *demux, guint pt, GstPad * pad); /* signal emitted when the payload type changes */ void (*payload_type_change) (GstRtpPtDemux *demux, guint pt); void (*clear_pt_map) (GstRtpPtDemux *demux); }; GType gst_rtp_pt_demux_get_type (void); #endif /* __GST_RTP_PT_DEMUX_H__ */ gst-plugins-good-0.10.31/gst/rtpmanager/gstrtpbin.c0000644000175000017500000030504111710031413017106 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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-gstrtpbin * @see_also: gstrtpjitterbuffer, gstrtpsession, gstrtpptdemux, gstrtpssrcdemux * * RTP bin combines the functions of #GstRtpSession, #GstRtpSsrcDemux, * #GstRtpJitterBuffer and #GstRtpPtDemux in one element. It allows for multiple * RTP sessions that will be synchronized together using RTCP SR packets. * * #GstRtpBin is configured with a number of request pads that define the * functionality that is activated, similar to the #GstRtpSession element. * * To use #GstRtpBin as an RTP receiver, request a recv_rtp_sink_\%d pad. The session * number must be specified in the pad name. * Data received on the recv_rtp_sink_\%d pad will be processed in the #GstRtpSession * manager and after being validated forwarded on #GstRtpSsrcDemux element. Each * RTP stream is demuxed based on the SSRC and send to a #GstRtpJitterBuffer. After * the packets are released from the jitterbuffer, they will be forwarded to a * #GstRtpPtDemux element. The #GstRtpPtDemux element will demux the packets based * on the payload type and will create a unique pad recv_rtp_src_\%d_\%d_\%d on * gstrtpbin with the session number, SSRC and payload type respectively as the pad * name. * * To also use #GstRtpBin as an RTCP receiver, request a recv_rtcp_sink_\%d pad. The * session number must be specified in the pad name. * * If you want the session manager to generate and send RTCP packets, request * the send_rtcp_src_\%d pad with the session number in the pad name. Packet pushed * on this pad contain SR/RR RTCP reports that should be sent to all participants * in the session. * * To use #GstRtpBin as a sender, request a send_rtp_sink_\%d pad, which will * automatically create a send_rtp_src_\%d pad. If the session number is not provided, * the pad from the lowest available session will be returned. The session manager will modify the * SSRC in the RTP packets to its own SSRC and wil forward the packets on the * send_rtp_src_\%d pad after updating its internal state. * * The session manager needs the clock-rate of the payload types it is handling * and will signal the #GstRtpSession::request-pt-map signal when it needs such a * mapping. One can clear the cached values with the #GstRtpSession::clear-pt-map * signal. * * Access to the internal statistics of gstrtpbin is provided with the * get-internal-session property. This action signal gives access to the * RTPSession object which further provides action signals to retrieve the * internal source and other sources. * * * Example pipelines * |[ * gst-launch udpsrc port=5000 caps="application/x-rtp, ..." ! .recv_rtp_sink_0 \ * gstrtpbin ! rtptheoradepay ! theoradec ! xvimagesink * ]| Receive RTP data from port 5000 and send to the session 0 in gstrtpbin. * |[ * gst-launch gstrtpbin name=rtpbin \ * v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \ * rtpbin.send_rtp_src_0 ! udpsink port=5000 \ * rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false \ * udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ * audiotestsrc ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1 \ * rtpbin.send_rtp_src_1 ! udpsink port=5002 \ * rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false \ * udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1 * ]| Encode and payload H263 video captured from a v4l2src. Encode and payload AMR * audio generated from audiotestsrc. The video is sent to session 0 in rtpbin * and the audio is sent to session 1. Video packets are sent on UDP port 5000 * and audio packets on port 5002. The video RTCP packets for session 0 are sent * on port 5001 and the audio RTCP packets for session 0 are sent on port 5003. * RTCP packets for session 0 are received on port 5005 and RTCP for session 1 * is received on port 5007. Since RTCP packets from the sender should be sent * as soon as possible and do not participate in preroll, sync=false and * async=false is configured on udpsink * |[ * gst-launch -v gstrtpbin name=rtpbin \ * udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998" \ * port=5000 ! rtpbin.recv_rtp_sink_0 \ * rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink \ * udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ * rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false \ * udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" \ * port=5002 ! rtpbin.recv_rtp_sink_1 \ * rtpbin. ! rtpamrdepay ! amrnbdec ! alsasink \ * udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ * rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false * ]| Receive H263 on port 5000, send it through rtpbin in session 0, depayload, * decode and display the video. * Receive AMR on port 5002, send it through rtpbin in session 1, depayload, * decode and play the audio. * Receive server RTCP packets for session 0 on port 5001 and RTCP packets for * session 1 on port 5003. These packets will be used for session management and * synchronisation. * Send RTCP reports for session 0 on port 5005 and RTCP reports for session 1 * on port 5007. * * * Last reviewed on 2007-08-30 (0.10.6) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "gstrtpbin-marshal.h" #include "gstrtpbin.h" #include "rtpsession.h" #include "gstrtpsession.h" #include "gstrtpjitterbuffer.h" #include GST_DEBUG_CATEGORY_STATIC (gst_rtp_bin_debug); #define GST_CAT_DEFAULT gst_rtp_bin_debug /* sink pads */ static GstStaticPadTemplate rtpbin_recv_rtp_sink_template = GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtpbin_recv_rtcp_sink_template = GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate rtpbin_send_rtp_sink_template = GST_STATIC_PAD_TEMPLATE ("send_rtp_sink_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtp") ); /* src pads */ static GstStaticPadTemplate rtpbin_recv_rtp_src_template = GST_STATIC_PAD_TEMPLATE ("recv_rtp_src_%d_%d_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate rtpbin_send_rtcp_src_template = GST_STATIC_PAD_TEMPLATE ("send_rtcp_src_%d", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate rtpbin_send_rtp_src_template = GST_STATIC_PAD_TEMPLATE ("send_rtp_src_%d", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-rtp") ); #define GST_RTP_BIN_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_RTP_BIN, GstRtpBinPrivate)) #define GST_RTP_BIN_LOCK(bin) g_mutex_lock ((bin)->priv->bin_lock) #define GST_RTP_BIN_UNLOCK(bin) g_mutex_unlock ((bin)->priv->bin_lock) /* lock to protect dynamic callbacks, like pad-added and new ssrc. */ #define GST_RTP_BIN_DYN_LOCK(bin) g_mutex_lock ((bin)->priv->dyn_lock) #define GST_RTP_BIN_DYN_UNLOCK(bin) g_mutex_unlock ((bin)->priv->dyn_lock) /* lock for shutdown */ #define GST_RTP_BIN_SHUTDOWN_LOCK(bin,label) \ G_STMT_START { \ if (g_atomic_int_get (&bin->priv->shutdown)) \ goto label; \ GST_RTP_BIN_DYN_LOCK (bin); \ if (g_atomic_int_get (&bin->priv->shutdown)) { \ GST_RTP_BIN_DYN_UNLOCK (bin); \ goto label; \ } \ } G_STMT_END /* unlock for shutdown */ #define GST_RTP_BIN_SHUTDOWN_UNLOCK(bin) \ GST_RTP_BIN_DYN_UNLOCK (bin); \ struct _GstRtpBinPrivate { GMutex *bin_lock; /* lock protecting dynamic adding/removing */ GMutex *dyn_lock; /* if we are shutting down or not */ gint shutdown; gboolean autoremove; /* UNIX (ntp) time of last SR sync used */ guint64 last_unix; }; /* signals and args */ enum { SIGNAL_REQUEST_PT_MAP, SIGNAL_PAYLOAD_TYPE_CHANGE, SIGNAL_CLEAR_PT_MAP, SIGNAL_RESET_SYNC, SIGNAL_GET_INTERNAL_SESSION, SIGNAL_ON_NEW_SSRC, SIGNAL_ON_SSRC_COLLISION, SIGNAL_ON_SSRC_VALIDATED, SIGNAL_ON_SSRC_ACTIVE, SIGNAL_ON_SSRC_SDES, SIGNAL_ON_BYE_SSRC, SIGNAL_ON_BYE_TIMEOUT, SIGNAL_ON_TIMEOUT, SIGNAL_ON_SENDER_TIMEOUT, SIGNAL_ON_NPT_STOP, LAST_SIGNAL }; #define DEFAULT_LATENCY_MS 200 #define DEFAULT_SDES NULL #define DEFAULT_DO_LOST FALSE #define DEFAULT_IGNORE_PT FALSE #define DEFAULT_NTP_SYNC FALSE #define DEFAULT_AUTOREMOVE FALSE #define DEFAULT_BUFFER_MODE RTP_JITTER_BUFFER_MODE_SLAVE #define DEFAULT_USE_PIPELINE_CLOCK FALSE #define DEFAULT_RTCP_SYNC GST_RTP_BIN_RTCP_SYNC_ALWAYS #define DEFAULT_RTCP_SYNC_INTERVAL 0 enum { PROP_0, PROP_LATENCY, PROP_SDES, PROP_DO_LOST, PROP_IGNORE_PT, PROP_NTP_SYNC, PROP_RTCP_SYNC, PROP_RTCP_SYNC_INTERVAL, PROP_AUTOREMOVE, PROP_BUFFER_MODE, PROP_USE_PIPELINE_CLOCK, PROP_LAST }; enum { GST_RTP_BIN_RTCP_SYNC_ALWAYS, GST_RTP_BIN_RTCP_SYNC_INITIAL, GST_RTP_BIN_RTCP_SYNC_RTP }; #define GST_RTP_BIN_RTCP_SYNC_TYPE (gst_rtp_bin_rtcp_sync_get_type()) static GType gst_rtp_bin_rtcp_sync_get_type (void) { static GType rtcp_sync_type = 0; static const GEnumValue rtcp_sync_types[] = { {GST_RTP_BIN_RTCP_SYNC_ALWAYS, "always", "always"}, {GST_RTP_BIN_RTCP_SYNC_INITIAL, "initial", "initial"}, {GST_RTP_BIN_RTCP_SYNC_RTP, "rtp-info", "rtp-info"}, {0, NULL, NULL}, }; if (!rtcp_sync_type) { rtcp_sync_type = g_enum_register_static ("GstRTCPSync", rtcp_sync_types); } return rtcp_sync_type; } /* helper objects */ typedef struct _GstRtpBinSession GstRtpBinSession; typedef struct _GstRtpBinStream GstRtpBinStream; typedef struct _GstRtpBinClient GstRtpBinClient; static guint gst_rtp_bin_signals[LAST_SIGNAL] = { 0 }; static GstCaps *pt_map_requested (GstElement * element, guint pt, GstRtpBinSession * session); static void payload_type_change (GstElement * element, guint pt, GstRtpBinSession * session); static void free_client (GstRtpBinClient * client, GstRtpBin * bin); static void free_stream (GstRtpBinStream * stream); /* Manages the RTP stream for one SSRC. * * We pipe the stream (comming from the SSRC demuxer) into a jitterbuffer. * If we see an SDES RTCP packet that links multiple SSRCs together based on a * common CNAME, we create a GstRtpBinClient structure to group the SSRCs * together (see below). */ struct _GstRtpBinStream { /* the SSRC of this stream */ guint32 ssrc; /* parent bin */ GstRtpBin *bin; /* the session this SSRC belongs to */ GstRtpBinSession *session; /* the jitterbuffer of the SSRC */ GstElement *buffer; gulong buffer_handlesync_sig; gulong buffer_ptreq_sig; gulong buffer_ntpstop_sig; gint percent; /* the PT demuxer of the SSRC */ GstElement *demux; gulong demux_newpad_sig; gulong demux_padremoved_sig; gulong demux_ptreq_sig; gulong demux_ptchange_sig; /* if we have calculated a valid rt_delta for this stream */ gboolean have_sync; /* mapping to local RTP and NTP time */ gint64 rt_delta; gint64 rtp_delta; /* base rtptime in gst time */ gint64 clock_base; }; #define GST_RTP_SESSION_LOCK(sess) g_mutex_lock ((sess)->lock) #define GST_RTP_SESSION_UNLOCK(sess) g_mutex_unlock ((sess)->lock) /* Manages the receiving end of the packets. * * There is one such structure for each RTP session (audio/video/...). * We get the RTP/RTCP packets and stuff them into the session manager. From * there they are pushed into an SSRC demuxer that splits the stream based on * SSRC. Each of the SSRC streams go into their own jitterbuffer (managed with * the GstRtpBinStream above). */ struct _GstRtpBinSession { /* session id */ gint id; /* the parent bin */ GstRtpBin *bin; /* the session element */ GstElement *session; /* the SSRC demuxer */ GstElement *demux; gulong demux_newpad_sig; gulong demux_padremoved_sig; GMutex *lock; /* list of GstRtpBinStream */ GSList *streams; /* mapping of payload type to caps */ GHashTable *ptmap; /* the pads of the session */ GstPad *recv_rtp_sink; GstPad *recv_rtp_sink_ghost; GstPad *recv_rtp_src; GstPad *recv_rtcp_sink; GstPad *recv_rtcp_sink_ghost; GstPad *sync_src; GstPad *send_rtp_sink; GstPad *send_rtp_sink_ghost; GstPad *send_rtp_src; GstPad *send_rtp_src_ghost; GstPad *send_rtcp_src; GstPad *send_rtcp_src_ghost; }; /* Manages the RTP streams that come from one client and should therefore be * synchronized. */ struct _GstRtpBinClient { /* the common CNAME for the streams */ gchar *cname; guint cname_len; /* the streams */ guint nstreams; GSList *streams; }; /* find a session with the given id. Must be called with RTP_BIN_LOCK */ static GstRtpBinSession * find_session_by_id (GstRtpBin * rtpbin, gint id) { GSList *walk; for (walk = rtpbin->sessions; walk; walk = g_slist_next (walk)) { GstRtpBinSession *sess = (GstRtpBinSession *) walk->data; if (sess->id == id) return sess; } return NULL; } /* find a session with the given request pad. Must be called with RTP_BIN_LOCK */ static GstRtpBinSession * find_session_by_pad (GstRtpBin * rtpbin, GstPad * pad) { GSList *walk; for (walk = rtpbin->sessions; walk; walk = g_slist_next (walk)) { GstRtpBinSession *sess = (GstRtpBinSession *) walk->data; if ((sess->recv_rtp_sink_ghost == pad) || (sess->recv_rtcp_sink_ghost == pad) || (sess->send_rtp_sink_ghost == pad) || (sess->send_rtcp_src_ghost == pad)) return sess; } return NULL; } static void on_new_ssrc (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_NEW_SSRC], 0, sess->id, ssrc); } static void on_ssrc_collision (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_COLLISION], 0, sess->id, ssrc); } static void on_ssrc_validated (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_VALIDATED], 0, sess->id, ssrc); } static void on_ssrc_active (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_ACTIVE], 0, sess->id, ssrc); } static void on_ssrc_sdes (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SSRC_SDES], 0, sess->id, ssrc); } static void on_bye_ssrc (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_BYE_SSRC], 0, sess->id, ssrc); } static void on_bye_timeout (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_BYE_TIMEOUT], 0, sess->id, ssrc); if (sess->bin->priv->autoremove) g_signal_emit_by_name (sess->demux, "clear-ssrc", ssrc, NULL); } static void on_timeout (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_TIMEOUT], 0, sess->id, ssrc); if (sess->bin->priv->autoremove) g_signal_emit_by_name (sess->demux, "clear-ssrc", ssrc, NULL); } static void on_sender_timeout (GstElement * session, guint32 ssrc, GstRtpBinSession * sess) { g_signal_emit (sess->bin, gst_rtp_bin_signals[SIGNAL_ON_SENDER_TIMEOUT], 0, sess->id, ssrc); } static void on_npt_stop (GstElement * jbuf, GstRtpBinStream * stream) { g_signal_emit (stream->bin, gst_rtp_bin_signals[SIGNAL_ON_NPT_STOP], 0, stream->session->id, stream->ssrc); } /* must be called with the SESSION lock */ static GstRtpBinStream * find_stream_by_ssrc (GstRtpBinSession * session, guint32 ssrc) { GSList *walk; for (walk = session->streams; walk; walk = g_slist_next (walk)) { GstRtpBinStream *stream = (GstRtpBinStream *) walk->data; if (stream->ssrc == ssrc) return stream; } return NULL; } static void ssrc_demux_pad_removed (GstElement * element, guint ssrc, GstPad * pad, GstRtpBinSession * session) { GstRtpBinStream *stream = NULL; GST_RTP_SESSION_LOCK (session); if ((stream = find_stream_by_ssrc (session, ssrc))) session->streams = g_slist_remove (session->streams, stream); GST_RTP_SESSION_UNLOCK (session); if (stream) free_stream (stream); } /* create a session with the given id. Must be called with RTP_BIN_LOCK */ static GstRtpBinSession * create_session (GstRtpBin * rtpbin, gint id) { GstRtpBinSession *sess; GstElement *session, *demux; GstState target; if (!(session = gst_element_factory_make ("gstrtpsession", NULL))) goto no_session; if (!(demux = gst_element_factory_make ("gstrtpssrcdemux", NULL))) goto no_demux; sess = g_new0 (GstRtpBinSession, 1); sess->lock = g_mutex_new (); sess->id = id; sess->bin = rtpbin; sess->session = session; sess->demux = demux; sess->ptmap = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) gst_caps_unref); rtpbin->sessions = g_slist_prepend (rtpbin->sessions, sess); /* configure SDES items */ GST_OBJECT_LOCK (rtpbin); g_object_set (session, "sdes", rtpbin->sdes, "use-pipeline-clock", rtpbin->use_pipeline_clock, NULL); GST_OBJECT_UNLOCK (rtpbin); /* provide clock_rate to the session manager when needed */ g_signal_connect (session, "request-pt-map", (GCallback) pt_map_requested, sess); g_signal_connect (sess->session, "on-new-ssrc", (GCallback) on_new_ssrc, sess); g_signal_connect (sess->session, "on-ssrc-collision", (GCallback) on_ssrc_collision, sess); g_signal_connect (sess->session, "on-ssrc-validated", (GCallback) on_ssrc_validated, sess); g_signal_connect (sess->session, "on-ssrc-active", (GCallback) on_ssrc_active, sess); g_signal_connect (sess->session, "on-ssrc-sdes", (GCallback) on_ssrc_sdes, sess); g_signal_connect (sess->session, "on-bye-ssrc", (GCallback) on_bye_ssrc, sess); g_signal_connect (sess->session, "on-bye-timeout", (GCallback) on_bye_timeout, sess); g_signal_connect (sess->session, "on-timeout", (GCallback) on_timeout, sess); g_signal_connect (sess->session, "on-sender-timeout", (GCallback) on_sender_timeout, sess); gst_bin_add (GST_BIN_CAST (rtpbin), session); gst_bin_add (GST_BIN_CAST (rtpbin), demux); GST_OBJECT_LOCK (rtpbin); target = GST_STATE_TARGET (rtpbin); GST_OBJECT_UNLOCK (rtpbin); /* change state only to what's needed */ gst_element_set_state (demux, target); gst_element_set_state (session, target); return sess; /* ERRORS */ no_session: { g_warning ("gstrtpbin: could not create gstrtpsession element"); return NULL; } no_demux: { gst_object_unref (session); g_warning ("gstrtpbin: could not create gstrtpssrcdemux element"); return NULL; } } static void free_session (GstRtpBinSession * sess, GstRtpBin * bin) { GSList *client_walk; GST_DEBUG_OBJECT (bin, "freeing session %p", sess); gst_element_set_locked_state (sess->demux, TRUE); gst_element_set_locked_state (sess->session, TRUE); gst_element_set_state (sess->demux, GST_STATE_NULL); gst_element_set_state (sess->session, GST_STATE_NULL); if (sess->recv_rtp_sink != NULL) { gst_element_release_request_pad (sess->session, sess->recv_rtp_sink); gst_object_unref (sess->recv_rtp_sink); } if (sess->recv_rtp_src != NULL) gst_object_unref (sess->recv_rtp_src); if (sess->recv_rtcp_sink != NULL) { gst_element_release_request_pad (sess->session, sess->recv_rtcp_sink); gst_object_unref (sess->recv_rtcp_sink); } if (sess->sync_src != NULL) gst_object_unref (sess->sync_src); if (sess->send_rtp_sink != NULL) { gst_element_release_request_pad (sess->session, sess->send_rtp_sink); gst_object_unref (sess->send_rtp_sink); } if (sess->send_rtp_src != NULL) gst_object_unref (sess->send_rtp_src); if (sess->send_rtcp_src != NULL) { gst_element_release_request_pad (sess->session, sess->send_rtcp_src); gst_object_unref (sess->send_rtcp_src); } gst_bin_remove (GST_BIN_CAST (bin), sess->session); gst_bin_remove (GST_BIN_CAST (bin), sess->demux); /* remove any references in bin->clients to the streams in sess->streams */ client_walk = bin->clients; while (client_walk) { GSList *client_node = client_walk; GstRtpBinClient *client = (GstRtpBinClient *) client_node->data; GSList *stream_walk = client->streams; while (stream_walk) { GSList *stream_node = stream_walk; GstRtpBinStream *stream = (GstRtpBinStream *) stream_node->data; GSList *inner_walk; stream_walk = g_slist_next (stream_walk); for (inner_walk = sess->streams; inner_walk; inner_walk = g_slist_next (inner_walk)) { if ((GstRtpBinStream *) inner_walk->data == stream) { client->streams = g_slist_delete_link (client->streams, stream_node); --client->nstreams; break; } } } client_walk = g_slist_next (client_walk); g_assert ((client->streams && client->nstreams > 0) || (!client->streams && client->streams == 0)); if (client->nstreams == 0) { free_client (client, bin); bin->clients = g_slist_delete_link (bin->clients, client_node); } } g_slist_foreach (sess->streams, (GFunc) free_stream, NULL); g_slist_free (sess->streams); g_mutex_free (sess->lock); g_hash_table_destroy (sess->ptmap); g_free (sess); } /* get the payload type caps for the specific payload @pt in @session */ static GstCaps * get_pt_map (GstRtpBinSession * session, guint pt) { GstCaps *caps = NULL; GstRtpBin *bin; GValue ret = { 0 }; GValue args[3] = { {0}, {0}, {0} }; GST_DEBUG ("searching pt %d in cache", pt); GST_RTP_SESSION_LOCK (session); /* first look in the cache */ caps = g_hash_table_lookup (session->ptmap, GINT_TO_POINTER (pt)); if (caps) { gst_caps_ref (caps); goto done; } bin = session->bin; GST_DEBUG ("emiting signal for pt %d in session %d", pt, session->id); /* not in cache, send signal to request caps */ g_value_init (&args[0], GST_TYPE_ELEMENT); g_value_set_object (&args[0], bin); g_value_init (&args[1], G_TYPE_UINT); g_value_set_uint (&args[1], session->id); g_value_init (&args[2], G_TYPE_UINT); g_value_set_uint (&args[2], pt); g_value_init (&ret, GST_TYPE_CAPS); g_value_set_boxed (&ret, NULL); GST_RTP_SESSION_UNLOCK (session); g_signal_emitv (args, gst_rtp_bin_signals[SIGNAL_REQUEST_PT_MAP], 0, &ret); GST_RTP_SESSION_LOCK (session); g_value_unset (&args[0]); g_value_unset (&args[1]); g_value_unset (&args[2]); /* look in the cache again because we let the lock go */ caps = g_hash_table_lookup (session->ptmap, GINT_TO_POINTER (pt)); if (caps) { gst_caps_ref (caps); g_value_unset (&ret); goto done; } caps = (GstCaps *) g_value_dup_boxed (&ret); g_value_unset (&ret); if (!caps) goto no_caps; GST_DEBUG ("caching pt %d as %" GST_PTR_FORMAT, pt, caps); /* store in cache, take additional ref */ g_hash_table_insert (session->ptmap, GINT_TO_POINTER (pt), gst_caps_ref (caps)); done: GST_RTP_SESSION_UNLOCK (session); return caps; /* ERRORS */ no_caps: { GST_RTP_SESSION_UNLOCK (session); GST_DEBUG ("no pt map could be obtained"); return NULL; } } static gboolean return_true (gpointer key, gpointer value, gpointer user_data) { return TRUE; } static void gst_rtp_bin_reset_sync (GstRtpBin * rtpbin) { GSList *clients, *streams; GST_DEBUG_OBJECT (rtpbin, "Reset sync on all clients"); GST_RTP_BIN_LOCK (rtpbin); for (clients = rtpbin->clients; clients; clients = g_slist_next (clients)) { GstRtpBinClient *client = (GstRtpBinClient *) clients->data; /* reset sync on all streams for this client */ for (streams = client->streams; streams; streams = g_slist_next (streams)) { GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; /* make use require a new SR packet for this stream before we attempt new * lip-sync */ stream->have_sync = FALSE; stream->rt_delta = 0; stream->rtp_delta = 0; stream->clock_base = -100 * GST_SECOND; } } GST_RTP_BIN_UNLOCK (rtpbin); } static void gst_rtp_bin_clear_pt_map (GstRtpBin * bin) { GSList *sessions, *streams; GST_RTP_BIN_LOCK (bin); GST_DEBUG_OBJECT (bin, "clearing pt map"); for (sessions = bin->sessions; sessions; sessions = g_slist_next (sessions)) { GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; GST_DEBUG_OBJECT (bin, "clearing session %p", session); g_signal_emit_by_name (session->session, "clear-pt-map", NULL); GST_RTP_SESSION_LOCK (session); g_hash_table_foreach_remove (session->ptmap, return_true, NULL); for (streams = session->streams; streams; streams = g_slist_next (streams)) { GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; GST_DEBUG_OBJECT (bin, "clearing stream %p", stream); g_signal_emit_by_name (stream->buffer, "clear-pt-map", NULL); if (stream->demux) g_signal_emit_by_name (stream->demux, "clear-pt-map", NULL); } GST_RTP_SESSION_UNLOCK (session); } GST_RTP_BIN_UNLOCK (bin); /* reset sync too */ gst_rtp_bin_reset_sync (bin); } static RTPSession * gst_rtp_bin_get_internal_session (GstRtpBin * bin, guint session_id) { RTPSession *internal_session = NULL; GstRtpBinSession *session; GST_RTP_BIN_LOCK (bin); GST_DEBUG_OBJECT (bin, "retrieving internal RTPSession object, index: %d", session_id); session = find_session_by_id (bin, (gint) session_id); if (session) { g_object_get (session->session, "internal-session", &internal_session, NULL); } GST_RTP_BIN_UNLOCK (bin); return internal_session; } static void gst_rtp_bin_propagate_property_to_jitterbuffer (GstRtpBin * bin, const gchar * name, const GValue * value) { GSList *sessions, *streams; GST_RTP_BIN_LOCK (bin); for (sessions = bin->sessions; sessions; sessions = g_slist_next (sessions)) { GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; GST_RTP_SESSION_LOCK (session); for (streams = session->streams; streams; streams = g_slist_next (streams)) { GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; g_object_set_property (G_OBJECT (stream->buffer), name, value); } GST_RTP_SESSION_UNLOCK (session); } GST_RTP_BIN_UNLOCK (bin); } /* get a client with the given SDES name. Must be called with RTP_BIN_LOCK */ static GstRtpBinClient * get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created) { GstRtpBinClient *result = NULL; GSList *walk; for (walk = bin->clients; walk; walk = g_slist_next (walk)) { GstRtpBinClient *client = (GstRtpBinClient *) walk->data; if (len != client->cname_len) continue; if (!strncmp ((gchar *) data, client->cname, client->cname_len)) { GST_DEBUG_OBJECT (bin, "found existing client %p with CNAME %s", client, client->cname); result = client; break; } } /* nothing found, create one */ if (result == NULL) { result = g_new0 (GstRtpBinClient, 1); result->cname = g_strndup ((gchar *) data, len); result->cname_len = len; bin->clients = g_slist_prepend (bin->clients, result); GST_DEBUG_OBJECT (bin, "created new client %p with CNAME %s", result, result->cname); } return result; } static void free_client (GstRtpBinClient * client, GstRtpBin * bin) { GST_DEBUG_OBJECT (bin, "freeing client %p", client); g_slist_free (client->streams); g_free (client->cname); g_free (client); } static void get_current_times (GstRtpBin * bin, GstClockTime * running_time, guint64 * ntpnstime) { guint64 ntpns; GstClock *clock; GstClockTime base_time, rt, clock_time; GST_OBJECT_LOCK (bin); if ((clock = GST_ELEMENT_CLOCK (bin))) { base_time = GST_ELEMENT_CAST (bin)->base_time; gst_object_ref (clock); GST_OBJECT_UNLOCK (bin); clock_time = gst_clock_get_time (clock); if (bin->use_pipeline_clock) { ntpns = clock_time; } else { GTimeVal current; /* get current NTP time */ g_get_current_time (¤t); ntpns = GST_TIMEVAL_TO_TIME (current); } /* add constant to convert from 1970 based time to 1900 based time */ ntpns += (2208988800LL * GST_SECOND); /* get current clock time and convert to running time */ rt = clock_time - base_time; gst_object_unref (clock); } else { GST_OBJECT_UNLOCK (bin); rt = -1; ntpns = -1; } if (running_time) *running_time = rt; if (ntpnstime) *ntpnstime = ntpns; } static void stream_set_ts_offset (GstRtpBin * bin, GstRtpBinStream * stream, gint64 ts_offset) { gint64 prev_ts_offset; g_object_get (stream->buffer, "ts-offset", &prev_ts_offset, NULL); /* delta changed, see how much */ if (prev_ts_offset != ts_offset) { gint64 diff; diff = prev_ts_offset - ts_offset; GST_DEBUG_OBJECT (bin, "ts-offset %" G_GINT64_FORMAT ", prev %" G_GINT64_FORMAT ", diff: %" G_GINT64_FORMAT, ts_offset, prev_ts_offset, diff); /* only change diff when it changed more than 4 milliseconds. This * compensates for rounding errors in NTP to RTP timestamp * conversions */ if (ABS (diff) > 4 * GST_MSECOND) { if (ABS (diff) < (3 * GST_SECOND)) { g_object_set (stream->buffer, "ts-offset", ts_offset, NULL); } else { GST_WARNING_OBJECT (bin, "offset unusually large, ignoring"); } } else { GST_DEBUG_OBJECT (bin, "offset too small, ignoring"); } } GST_DEBUG_OBJECT (bin, "stream SSRC %08x, delta %" G_GINT64_FORMAT, stream->ssrc, ts_offset); } /* associate a stream to the given CNAME. This will make sure all streams for * that CNAME are synchronized together. * Must be called with GST_RTP_BIN_LOCK */ static void gst_rtp_bin_associate (GstRtpBin * bin, GstRtpBinStream * stream, guint8 len, guint8 * data, guint64 ntptime, guint64 last_extrtptime, guint64 base_rtptime, guint64 base_time, guint clock_rate, gint64 rtp_clock_base) { GstRtpBinClient *client; gboolean created; GSList *walk; guint64 local_rt; guint64 local_rtp; GstClockTime running_time; guint64 ntpnstime; gint64 ntpdiff, rtdiff; guint64 last_unix; /* first find or create the CNAME */ client = get_client (bin, len, data, &created); /* find stream in the client */ for (walk = client->streams; walk; walk = g_slist_next (walk)) { GstRtpBinStream *ostream = (GstRtpBinStream *) walk->data; if (ostream == stream) break; } /* not found, add it to the list */ if (walk == NULL) { GST_DEBUG_OBJECT (bin, "new association of SSRC %08x with client %p with CNAME %s", stream->ssrc, client, client->cname); client->streams = g_slist_prepend (client->streams, stream); client->nstreams++; } else { GST_DEBUG_OBJECT (bin, "found association of SSRC %08x with client %p with CNAME %s", stream->ssrc, client, client->cname); } if (!GST_CLOCK_TIME_IS_VALID (last_extrtptime)) { GST_DEBUG_OBJECT (bin, "invalidated sync data"); if (bin->rtcp_sync == GST_RTP_BIN_RTCP_SYNC_RTP) { /* we don't need that data, so carry on, * but make some values look saner */ last_extrtptime = base_rtptime; } else { /* nothing we can do with this data in this case */ GST_DEBUG_OBJECT (bin, "bailing out"); return; } } /* Take the extended rtptime we found in the SR packet and map it to the * local rtptime. The local rtp time is used to construct timestamps on the * buffers so we will calculate what running_time corresponds to the RTP * timestamp in the SR packet. */ local_rtp = last_extrtptime - base_rtptime; GST_DEBUG_OBJECT (bin, "base %" G_GUINT64_FORMAT ", extrtptime %" G_GUINT64_FORMAT ", local RTP %" G_GUINT64_FORMAT ", clock-rate %d, " "clock-base %" G_GINT64_FORMAT, base_rtptime, last_extrtptime, local_rtp, clock_rate, rtp_clock_base); /* calculate local RTP time in gstreamer timestamp, we essentially perform the * same conversion that a jitterbuffer would use to convert an rtp timestamp * into a corresponding gstreamer timestamp. Note that the base_time also * contains the drift between sender and receiver. */ local_rt = gst_util_uint64_scale_int (local_rtp, GST_SECOND, clock_rate); local_rt += base_time; /* convert ntptime to unix time since 1900 */ last_unix = gst_util_uint64_scale (ntptime, GST_SECOND, (G_GINT64_CONSTANT (1) << 32)); stream->have_sync = TRUE; GST_DEBUG_OBJECT (bin, "local UNIX %" G_GUINT64_FORMAT ", remote UNIX %" G_GUINT64_FORMAT, local_rt, last_unix); /* recalc inter stream playout offset, but only if there is more than one * stream or we're doing NTP sync. */ if (bin->ntp_sync) { /* For NTP sync we need to first get a snapshot of running_time and NTP * time. We know at what running_time we play a certain RTP time, we also * calculated when we would play the RTP time in the SR packet. Now we need * to know how the running_time and the NTP time relate to eachother. */ get_current_times (bin, &running_time, &ntpnstime); /* see how far away the NTP time is. This is the difference between the * current NTP time and the NTP time in the last SR packet. */ ntpdiff = ntpnstime - last_unix; /* see how far away the running_time is. This is the difference between the * current running_time and the running_time of the RTP timestamp in the * last SR packet. */ rtdiff = running_time - local_rt; GST_DEBUG_OBJECT (bin, "NTP time %" G_GUINT64_FORMAT ", last unix %" G_GUINT64_FORMAT, ntpnstime, last_unix); GST_DEBUG_OBJECT (bin, "NTP diff %" G_GINT64_FORMAT ", RT diff %" G_GINT64_FORMAT, ntpdiff, rtdiff); /* combine to get the final diff to apply to the running_time */ stream->rt_delta = rtdiff - ntpdiff; stream_set_ts_offset (bin, stream, stream->rt_delta); } else { gint64 min, rtp_min, clock_base = stream->clock_base; gboolean all_sync, use_rtp; gboolean rtcp_sync = g_atomic_int_get (&bin->rtcp_sync); /* calculate delta between server and receiver. last_unix is created by * converting the ntptime in the last SR packet to a gstreamer timestamp. This * delta expresses the difference to our timeline and the server timeline. The * difference in itself doesn't mean much but we can combine the delta of * multiple streams to create a stream specific offset. */ stream->rt_delta = last_unix - local_rt; /* calculate the min of all deltas, ignoring streams that did not yet have a * valid rt_delta because we did not yet receive an SR packet for those * streams. * We calculate the mininum because we would like to only apply positive * offsets to streams, delaying their playback instead of trying to speed up * other streams (which might be imposible when we have to create negative * latencies). * The stream that has the smallest diff is selected as the reference stream, * all other streams will have a positive offset to this difference. */ /* some alternative setting allow ignoring RTCP as much as possible, * for servers generating bogus ntp timeline */ min = rtp_min = G_MAXINT64; use_rtp = FALSE; if (rtcp_sync == GST_RTP_BIN_RTCP_SYNC_RTP) { guint64 ext_base; use_rtp = TRUE; /* signed version for convienience */ clock_base = base_rtptime; /* deal with possible wrap-around */ ext_base = base_rtptime; rtp_clock_base = gst_rtp_buffer_ext_timestamp (&ext_base, rtp_clock_base); /* sanity check; base rtp and provided clock_base should be close */ if (rtp_clock_base >= clock_base) { if (rtp_clock_base - clock_base < 10 * clock_rate) { rtp_clock_base = base_time + gst_util_uint64_scale_int (rtp_clock_base - clock_base, GST_SECOND, clock_rate); } else { use_rtp = FALSE; } } else { if (clock_base - rtp_clock_base < 10 * clock_rate) { rtp_clock_base = base_time - gst_util_uint64_scale_int (clock_base - rtp_clock_base, GST_SECOND, clock_rate); } else { use_rtp = FALSE; } } /* warn and bail for clarity out if no sane values */ if (!use_rtp) { GST_WARNING_OBJECT (bin, "unable to sync to provided rtptime"); return; } /* store to track changes */ clock_base = rtp_clock_base; /* generate a fake as before, * now equating rtptime obtained from RTP-Info, * where the large time represent the otherwise irrelevant npt/ntp time */ stream->rtp_delta = (GST_SECOND << 28) - rtp_clock_base; } for (walk = client->streams; walk; walk = g_slist_next (walk)) { GstRtpBinStream *ostream = (GstRtpBinStream *) walk->data; if (!ostream->have_sync) { all_sync = FALSE; continue; } /* change in current stream's base from previously init'ed value * leads to reset of all stream's base */ if (stream != ostream && stream->clock_base >= 0 && (stream->clock_base != clock_base)) { GST_DEBUG_OBJECT (bin, "reset upon clock base change"); ostream->clock_base = -100 * GST_SECOND; ostream->rtp_delta = 0; } if (ostream->rt_delta < min) min = ostream->rt_delta; if (ostream->rtp_delta < rtp_min) rtp_min = ostream->rtp_delta; } /* arrange to re-sync for each stream upon significant change, * e.g. post-seek */ all_sync = (stream->clock_base == clock_base); stream->clock_base = clock_base; /* may need init performed above later on, but nothing more to do now */ if (client->nstreams <= 1) return; GST_DEBUG_OBJECT (bin, "client %p min delta %" G_GINT64_FORMAT " all sync %d", client, min, all_sync); GST_DEBUG_OBJECT (bin, "rtcp sync mode %d, use_rtp %d", rtcp_sync, use_rtp); switch (rtcp_sync) { case GST_RTP_BIN_RTCP_SYNC_RTP: if (!use_rtp) break; GST_DEBUG_OBJECT (bin, "using rtp generated reports; " "client %p min rtp delta %" G_GINT64_FORMAT, client, rtp_min); /* fall-through */ case GST_RTP_BIN_RTCP_SYNC_INITIAL: /* if all have been synced already, do not bother further */ if (all_sync) { GST_DEBUG_OBJECT (bin, "all streams already synced; done"); return; } break; default: break; } /* bail out if we adjusted recently enough */ if (all_sync && (last_unix - bin->priv->last_unix) < bin->rtcp_sync_interval * GST_MSECOND) { GST_DEBUG_OBJECT (bin, "discarding RTCP sender packet for sync; " "previous sender info too recent " "(previous UNIX %" G_GUINT64_FORMAT ")", bin->priv->last_unix); return; } bin->priv->last_unix = last_unix; /* calculate offsets for each stream */ for (walk = client->streams; walk; walk = g_slist_next (walk)) { GstRtpBinStream *ostream = (GstRtpBinStream *) walk->data; gint64 ts_offset; /* ignore streams for which we didn't receive an SR packet yet, we * can't synchronize them yet. We can however sync other streams just * fine. */ if (!ostream->have_sync) continue; /* calculate offset to our reference stream, this should always give a * positive number. */ if (use_rtp) ts_offset = ostream->rtp_delta - rtp_min; else ts_offset = ostream->rt_delta - min; stream_set_ts_offset (bin, ostream, ts_offset); } } return; } #define GST_RTCP_BUFFER_FOR_PACKETS(b,buffer,packet) \ for ((b) = gst_rtcp_buffer_get_first_packet ((buffer), (packet)); (b); \ (b) = gst_rtcp_packet_move_to_next ((packet))) #define GST_RTCP_SDES_FOR_ITEMS(b,packet) \ for ((b) = gst_rtcp_packet_sdes_first_item ((packet)); (b); \ (b) = gst_rtcp_packet_sdes_next_item ((packet))) #define GST_RTCP_SDES_FOR_ENTRIES(b,packet) \ for ((b) = gst_rtcp_packet_sdes_first_entry ((packet)); (b); \ (b) = gst_rtcp_packet_sdes_next_entry ((packet))) static void gst_rtp_bin_handle_sync (GstElement * jitterbuffer, GstStructure * s, GstRtpBinStream * stream) { GstRtpBin *bin; GstRTCPPacket packet; guint32 ssrc; guint64 ntptime; gboolean have_sr, have_sdes; gboolean more; guint64 base_rtptime; guint64 base_time; guint clock_rate; guint64 clock_base; guint64 extrtptime; GstBuffer *buffer; bin = stream->bin; GST_DEBUG_OBJECT (bin, "sync handler called"); /* get the last relation between the rtp timestamps and the gstreamer * timestamps. We get this info directly from the jitterbuffer which * constructs gstreamer timestamps from rtp timestamps and so it know exactly * what the current situation is. */ base_rtptime = g_value_get_uint64 (gst_structure_get_value (s, "base-rtptime")); base_time = g_value_get_uint64 (gst_structure_get_value (s, "base-time")); clock_rate = g_value_get_uint (gst_structure_get_value (s, "clock-rate")); clock_base = g_value_get_uint64 (gst_structure_get_value (s, "clock-base")); extrtptime = g_value_get_uint64 (gst_structure_get_value (s, "sr-ext-rtptime")); buffer = gst_value_get_buffer (gst_structure_get_value (s, "sr-buffer")); have_sr = FALSE; have_sdes = FALSE; GST_RTCP_BUFFER_FOR_PACKETS (more, buffer, &packet) { /* first packet must be SR or RR or else the validate would have failed */ switch (gst_rtcp_packet_get_type (&packet)) { case GST_RTCP_TYPE_SR: /* only parse first. There is only supposed to be one SR in the packet * but we will deal with malformed packets gracefully */ if (have_sr) break; /* get NTP and RTP times */ gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, NULL, NULL, NULL); GST_DEBUG_OBJECT (bin, "received sync packet from SSRC %08x", ssrc); /* ignore SR that is not ours */ if (ssrc != stream->ssrc) continue; have_sr = TRUE; break; case GST_RTCP_TYPE_SDES: { gboolean more_items, more_entries; /* only deal with first SDES, there is only supposed to be one SDES in * the RTCP packet but we deal with bad packets gracefully. Also bail * out if we have not seen an SR item yet. */ if (have_sdes || !have_sr) break; GST_RTCP_SDES_FOR_ITEMS (more_items, &packet) { /* skip items that are not about the SSRC of the sender */ if (gst_rtcp_packet_sdes_get_ssrc (&packet) != ssrc) continue; /* find the CNAME entry */ GST_RTCP_SDES_FOR_ENTRIES (more_entries, &packet) { GstRTCPSDESType type; guint8 len; guint8 *data; gst_rtcp_packet_sdes_get_entry (&packet, &type, &len, &data); if (type == GST_RTCP_SDES_CNAME) { GST_RTP_BIN_LOCK (bin); /* associate the stream to CNAME */ gst_rtp_bin_associate (bin, stream, len, data, ntptime, extrtptime, base_rtptime, base_time, clock_rate, clock_base); GST_RTP_BIN_UNLOCK (bin); } } } have_sdes = TRUE; break; } default: /* we can ignore these packets */ break; } } } /* create a new stream with @ssrc in @session. Must be called with * RTP_SESSION_LOCK. */ static GstRtpBinStream * create_stream (GstRtpBinSession * session, guint32 ssrc) { GstElement *buffer, *demux = NULL; GstRtpBinStream *stream; GstRtpBin *rtpbin; GstState target; rtpbin = session->bin; if (!(buffer = gst_element_factory_make ("gstrtpjitterbuffer", NULL))) goto no_jitterbuffer; if (!rtpbin->ignore_pt) if (!(demux = gst_element_factory_make ("gstrtpptdemux", NULL))) goto no_demux; stream = g_new0 (GstRtpBinStream, 1); stream->ssrc = ssrc; stream->bin = rtpbin; stream->session = session; stream->buffer = buffer; stream->demux = demux; stream->have_sync = FALSE; stream->rt_delta = 0; stream->rtp_delta = 0; stream->percent = 100; stream->clock_base = -100 * GST_SECOND; session->streams = g_slist_prepend (session->streams, stream); /* provide clock_rate to the jitterbuffer when needed */ stream->buffer_ptreq_sig = g_signal_connect (buffer, "request-pt-map", (GCallback) pt_map_requested, session); stream->buffer_ntpstop_sig = g_signal_connect (buffer, "on-npt-stop", (GCallback) on_npt_stop, stream); g_object_set_data (G_OBJECT (buffer), "GstRTPBin.session", session); g_object_set_data (G_OBJECT (buffer), "GstRTPBin.stream", stream); /* configure latency and packet lost */ g_object_set (buffer, "latency", rtpbin->latency_ms, NULL); g_object_set (buffer, "do-lost", rtpbin->do_lost, NULL); g_object_set (buffer, "mode", rtpbin->buffer_mode, NULL); if (!rtpbin->ignore_pt) gst_bin_add (GST_BIN_CAST (rtpbin), demux); gst_bin_add (GST_BIN_CAST (rtpbin), buffer); /* link stuff */ if (demux) gst_element_link (buffer, demux); if (rtpbin->buffering) { guint64 last_out; GST_INFO_OBJECT (rtpbin, "bin is buffering, set jitterbuffer as not active"); g_signal_emit_by_name (buffer, "set-active", FALSE, (gint64) 0, &last_out); } GST_OBJECT_LOCK (rtpbin); target = GST_STATE_TARGET (rtpbin); GST_OBJECT_UNLOCK (rtpbin); /* from sink to source */ if (demux) gst_element_set_state (demux, target); gst_element_set_state (buffer, target); return stream; /* ERRORS */ no_jitterbuffer: { g_warning ("gstrtpbin: could not create gstrtpjitterbuffer element"); return NULL; } no_demux: { gst_object_unref (buffer); g_warning ("gstrtpbin: could not create gstrtpptdemux element"); return NULL; } } static void free_stream (GstRtpBinStream * stream) { GstRtpBinSession *session; session = stream->session; if (stream->demux) { g_signal_handler_disconnect (stream->demux, stream->demux_newpad_sig); g_signal_handler_disconnect (stream->demux, stream->demux_ptreq_sig); g_signal_handler_disconnect (stream->demux, stream->demux_ptchange_sig); } g_signal_handler_disconnect (stream->buffer, stream->buffer_handlesync_sig); g_signal_handler_disconnect (stream->buffer, stream->buffer_ptreq_sig); g_signal_handler_disconnect (stream->buffer, stream->buffer_ntpstop_sig); if (stream->demux) gst_element_set_locked_state (stream->demux, TRUE); gst_element_set_locked_state (stream->buffer, TRUE); if (stream->demux) gst_element_set_state (stream->demux, GST_STATE_NULL); gst_element_set_state (stream->buffer, GST_STATE_NULL); /* now remove this signal, we need this while going to NULL because it to * do some cleanups */ if (stream->demux) g_signal_handler_disconnect (stream->demux, stream->demux_padremoved_sig); gst_bin_remove (GST_BIN_CAST (session->bin), stream->buffer); if (stream->demux) gst_bin_remove (GST_BIN_CAST (session->bin), stream->demux); g_free (stream); } /* GObject vmethods */ static void gst_rtp_bin_dispose (GObject * object); static void gst_rtp_bin_finalize (GObject * object); static void gst_rtp_bin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_bin_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); /* GstElement vmethods */ static GstStateChangeReturn gst_rtp_bin_change_state (GstElement * element, GstStateChange transition); static GstPad *gst_rtp_bin_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_rtp_bin_release_pad (GstElement * element, GstPad * pad); static void gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message); GST_BOILERPLATE (GstRtpBin, gst_rtp_bin, GstBin, GST_TYPE_BIN); static void gst_rtp_bin_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); /* sink pads */ gst_element_class_add_static_pad_template (element_class, &rtpbin_recv_rtp_sink_template); gst_element_class_add_static_pad_template (element_class, &rtpbin_recv_rtcp_sink_template); gst_element_class_add_static_pad_template (element_class, &rtpbin_send_rtp_sink_template); /* src pads */ gst_element_class_add_static_pad_template (element_class, &rtpbin_recv_rtp_src_template); gst_element_class_add_static_pad_template (element_class, &rtpbin_send_rtcp_src_template); gst_element_class_add_static_pad_template (element_class, &rtpbin_send_rtp_src_template); gst_element_class_set_details_simple (element_class, "RTP Bin", "Filter/Network/RTP", "Real-Time Transport Protocol bin", "Wim Taymans "); } static void gst_rtp_bin_class_init (GstRtpBinClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBinClass *gstbin_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbin_class = (GstBinClass *) klass; g_type_class_add_private (klass, sizeof (GstRtpBinPrivate)); gobject_class->dispose = gst_rtp_bin_dispose; gobject_class->finalize = gst_rtp_bin_finalize; gobject_class->set_property = gst_rtp_bin_set_property; gobject_class->get_property = gst_rtp_bin_get_property; g_object_class_install_property (gobject_class, PROP_LATENCY, g_param_spec_uint ("latency", "Buffer latency in ms", "Default amount of ms to buffer in the jitterbuffers", 0, G_MAXUINT, DEFAULT_LATENCY_MS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpBin::request-pt-map: * @rtpbin: the object which received the signal * @session: the session * @pt: the pt * * Request the payload type as #GstCaps for @pt in @session. */ gst_rtp_bin_signals[SIGNAL_REQUEST_PT_MAP] = g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, request_pt_map), NULL, NULL, gst_rtp_bin_marshal_BOXED__UINT_UINT, GST_TYPE_CAPS, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::payload-type-change: * @rtpbin: the object which received the signal * @session: the session * @pt: the pt * * Signal that the current payload type changed to @pt in @session. * * Since: 0.10.17 */ gst_rtp_bin_signals[SIGNAL_PAYLOAD_TYPE_CHANGE] = g_signal_new ("payload-type-change", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, payload_type_change), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::clear-pt-map: * @rtpbin: the object which received the signal * * Clear all previously cached pt-mapping obtained with * #GstRtpBin::request-pt-map. */ gst_rtp_bin_signals[SIGNAL_CLEAR_PT_MAP] = g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** * GstRtpBin::reset-sync: * @rtpbin: the object which received the signal * * Reset all currently configured lip-sync parameters and require new SR * packets for all streams before lip-sync is attempted again. */ gst_rtp_bin_signals[SIGNAL_RESET_SYNC] = g_signal_new ("reset-sync", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, reset_sync), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); /** * GstRtpBin::get-internal-session: * @rtpbin: the object which received the signal * @id: the session id * * Request the internal RTPSession object as #GObject in session @id. */ gst_rtp_bin_signals[SIGNAL_GET_INTERNAL_SESSION] = g_signal_new ("get-internal-session", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, get_internal_session), NULL, NULL, gst_rtp_bin_marshal_OBJECT__UINT, RTP_TYPE_SESSION, 1, G_TYPE_UINT); /** * GstRtpBin::on-new-ssrc: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a new SSRC that entered @session. */ gst_rtp_bin_signals[SIGNAL_ON_NEW_SSRC] = g_signal_new ("on-new-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_new_ssrc), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-ssrc-collision: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify when we have an SSRC collision */ gst_rtp_bin_signals[SIGNAL_ON_SSRC_COLLISION] = g_signal_new ("on-ssrc-collision", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_collision), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-ssrc-validated: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a new SSRC that became validated. */ gst_rtp_bin_signals[SIGNAL_ON_SSRC_VALIDATED] = g_signal_new ("on-ssrc-validated", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_validated), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-ssrc-active: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a SSRC that is active, i.e., sending RTCP. */ gst_rtp_bin_signals[SIGNAL_ON_SSRC_ACTIVE] = g_signal_new ("on-ssrc-active", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_active), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-ssrc-sdes: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a SSRC that is active, i.e., sending RTCP. */ gst_rtp_bin_signals[SIGNAL_ON_SSRC_SDES] = g_signal_new ("on-ssrc-sdes", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_ssrc_sdes), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-bye-ssrc: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of an SSRC that became inactive because of a BYE packet. */ gst_rtp_bin_signals[SIGNAL_ON_BYE_SSRC] = g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_bye_ssrc), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-bye-timeout: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of an SSRC that has timed out because of BYE */ gst_rtp_bin_signals[SIGNAL_ON_BYE_TIMEOUT] = g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_bye_timeout), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-timeout: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of an SSRC that has timed out */ gst_rtp_bin_signals[SIGNAL_ON_TIMEOUT] = g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_timeout), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-sender-timeout: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify of a sender SSRC that has timed out and became a receiver */ gst_rtp_bin_signals[SIGNAL_ON_SENDER_TIMEOUT] = g_signal_new ("on-sender-timeout", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_sender_timeout), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * GstRtpBin::on-npt-stop: * @rtpbin: the object which received the signal * @session: the session * @ssrc: the SSRC * * Notify that SSRC sender has sent data up to the configured NPT stop time. */ gst_rtp_bin_signals[SIGNAL_ON_NPT_STOP] = g_signal_new ("on-npt-stop", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRtpBinClass, on_npt_stop), NULL, NULL, gst_rtp_bin_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); g_object_class_install_property (gobject_class, PROP_SDES, g_param_spec_boxed ("sdes", "SDES", "The SDES items of this session", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DO_LOST, g_param_spec_boolean ("do-lost", "Do Lost", "Send an event downstream when a packet is lost", DEFAULT_DO_LOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_AUTOREMOVE, g_param_spec_boolean ("autoremove", "Auto Remove", "Automatically remove timed out sources", DEFAULT_AUTOREMOVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_IGNORE_PT, g_param_spec_boolean ("ignore-pt", "Ignore PT", "Do not demultiplex based on PT values", DEFAULT_IGNORE_PT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_USE_PIPELINE_CLOCK, g_param_spec_boolean ("use-pipeline-clock", "Use pipeline clock", "Use the pipeline clock to set the NTP time in the RTCP SR messages", DEFAULT_USE_PIPELINE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpBin::buffer-mode: * * Control the buffering and timestamping mode used by the jitterbuffer. * * Since: 0.10.17 */ g_object_class_install_property (gobject_class, PROP_BUFFER_MODE, g_param_spec_enum ("buffer-mode", "Buffer Mode", "Control the buffering algorithm in use", RTP_TYPE_JITTER_BUFFER_MODE, DEFAULT_BUFFER_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpBin::ntp-sync: * * Synchronize received streams to the NTP clock. When the NTP clock is shared * between the receivers and the senders (such as when using ntpd) this option * can be used to synchronize receivers on multiple machines. * * Since: 0.10.21 */ g_object_class_install_property (gobject_class, PROP_NTP_SYNC, g_param_spec_boolean ("ntp-sync", "Sync on NTP clock", "Synchronize received streams to the NTP clock", DEFAULT_NTP_SYNC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpBin::rtcp-sync: * * If not synchronizing (directly) to the NTP clock, determines how to sync * the various streams. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_RTCP_SYNC, g_param_spec_enum ("rtcp-sync", "RTCP Sync", "Use of RTCP SR in synchronization", GST_RTP_BIN_RTCP_SYNC_TYPE, DEFAULT_RTCP_SYNC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * GstRtpBin::rtcp-sync-interval: * * Determines how often to sync streams using RTCP data. * * Since: 0.10.31 */ g_object_class_install_property (gobject_class, PROP_RTCP_SYNC_INTERVAL, g_param_spec_uint ("rtcp-sync-interval", "RTCP Sync Interval", "RTCP SR interval synchronization (ms) (0 = always)", 0, G_MAXUINT, DEFAULT_RTCP_SYNC_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_bin_change_state); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_rtp_bin_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_bin_release_pad); gstbin_class->handle_message = GST_DEBUG_FUNCPTR (gst_rtp_bin_handle_message); klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_bin_clear_pt_map); klass->reset_sync = GST_DEBUG_FUNCPTR (gst_rtp_bin_reset_sync); klass->get_internal_session = GST_DEBUG_FUNCPTR (gst_rtp_bin_get_internal_session); GST_DEBUG_CATEGORY_INIT (gst_rtp_bin_debug, "rtpbin", 0, "RTP bin"); } static void gst_rtp_bin_init (GstRtpBin * rtpbin, GstRtpBinClass * klass) { gchar *cname; rtpbin->priv = GST_RTP_BIN_GET_PRIVATE (rtpbin); rtpbin->priv->bin_lock = g_mutex_new (); rtpbin->priv->dyn_lock = g_mutex_new (); rtpbin->latency_ms = DEFAULT_LATENCY_MS; rtpbin->latency_ns = DEFAULT_LATENCY_MS * GST_MSECOND; rtpbin->do_lost = DEFAULT_DO_LOST; rtpbin->ignore_pt = DEFAULT_IGNORE_PT; rtpbin->ntp_sync = DEFAULT_NTP_SYNC; rtpbin->rtcp_sync = DEFAULT_RTCP_SYNC; rtpbin->rtcp_sync_interval = DEFAULT_RTCP_SYNC_INTERVAL; rtpbin->priv->autoremove = DEFAULT_AUTOREMOVE; rtpbin->buffer_mode = DEFAULT_BUFFER_MODE; rtpbin->use_pipeline_clock = DEFAULT_USE_PIPELINE_CLOCK; /* some default SDES entries */ cname = g_strdup_printf ("user%u@host-%x", g_random_int (), g_random_int ()); rtpbin->sdes = gst_structure_new ("application/x-rtp-source-sdes", "cname", G_TYPE_STRING, cname, "tool", G_TYPE_STRING, "GStreamer", NULL); g_free (cname); } static void gst_rtp_bin_dispose (GObject * object) { GstRtpBin *rtpbin; rtpbin = GST_RTP_BIN (object); GST_DEBUG_OBJECT (object, "freeing sessions"); g_slist_foreach (rtpbin->sessions, (GFunc) free_session, rtpbin); g_slist_free (rtpbin->sessions); rtpbin->sessions = NULL; GST_DEBUG_OBJECT (object, "freeing clients"); g_slist_foreach (rtpbin->clients, (GFunc) free_client, rtpbin); g_slist_free (rtpbin->clients); rtpbin->clients = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_rtp_bin_finalize (GObject * object) { GstRtpBin *rtpbin; rtpbin = GST_RTP_BIN (object); if (rtpbin->sdes) gst_structure_free (rtpbin->sdes); g_mutex_free (rtpbin->priv->bin_lock); g_mutex_free (rtpbin->priv->dyn_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_bin_set_sdes_struct (GstRtpBin * bin, const GstStructure * sdes) { GSList *item; if (sdes == NULL) return; GST_RTP_BIN_LOCK (bin); GST_OBJECT_LOCK (bin); if (bin->sdes) gst_structure_free (bin->sdes); bin->sdes = gst_structure_copy (sdes); GST_OBJECT_UNLOCK (bin); /* store in all sessions */ for (item = bin->sessions; item; item = g_slist_next (item)) { GstRtpBinSession *session = item->data; g_object_set (session->session, "sdes", sdes, NULL); } GST_RTP_BIN_UNLOCK (bin); } static GstStructure * gst_rtp_bin_get_sdes_struct (GstRtpBin * bin) { GstStructure *result; GST_OBJECT_LOCK (bin); result = gst_structure_copy (bin->sdes); GST_OBJECT_UNLOCK (bin); return result; } static void gst_rtp_bin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpBin *rtpbin; rtpbin = GST_RTP_BIN (object); switch (prop_id) { case PROP_LATENCY: GST_RTP_BIN_LOCK (rtpbin); rtpbin->latency_ms = g_value_get_uint (value); rtpbin->latency_ns = rtpbin->latency_ms * GST_MSECOND; GST_RTP_BIN_UNLOCK (rtpbin); /* propagate the property down to the jitterbuffer */ gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin, "latency", value); break; case PROP_SDES: gst_rtp_bin_set_sdes_struct (rtpbin, g_value_get_boxed (value)); break; case PROP_DO_LOST: GST_RTP_BIN_LOCK (rtpbin); rtpbin->do_lost = g_value_get_boolean (value); GST_RTP_BIN_UNLOCK (rtpbin); gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin, "do-lost", value); break; case PROP_NTP_SYNC: rtpbin->ntp_sync = g_value_get_boolean (value); break; case PROP_RTCP_SYNC: g_atomic_int_set (&rtpbin->rtcp_sync, g_value_get_enum (value)); break; case PROP_RTCP_SYNC_INTERVAL: rtpbin->rtcp_sync_interval = g_value_get_uint (value); break; case PROP_IGNORE_PT: rtpbin->ignore_pt = g_value_get_boolean (value); break; case PROP_AUTOREMOVE: rtpbin->priv->autoremove = g_value_get_boolean (value); break; case PROP_USE_PIPELINE_CLOCK: { GSList *sessions; GST_RTP_BIN_LOCK (rtpbin); rtpbin->use_pipeline_clock = g_value_get_boolean (value); for (sessions = rtpbin->sessions; sessions; sessions = g_slist_next (sessions)) { GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; g_object_set (G_OBJECT (session->session), "use-pipeline-clock", rtpbin->use_pipeline_clock, NULL); } GST_RTP_BIN_UNLOCK (rtpbin); } break; case PROP_BUFFER_MODE: GST_RTP_BIN_LOCK (rtpbin); rtpbin->buffer_mode = g_value_get_enum (value); GST_RTP_BIN_UNLOCK (rtpbin); /* propagate the property down to the jitterbuffer */ gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin, "mode", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_bin_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpBin *rtpbin; rtpbin = GST_RTP_BIN (object); switch (prop_id) { case PROP_LATENCY: GST_RTP_BIN_LOCK (rtpbin); g_value_set_uint (value, rtpbin->latency_ms); GST_RTP_BIN_UNLOCK (rtpbin); break; case PROP_SDES: g_value_take_boxed (value, gst_rtp_bin_get_sdes_struct (rtpbin)); break; case PROP_DO_LOST: GST_RTP_BIN_LOCK (rtpbin); g_value_set_boolean (value, rtpbin->do_lost); GST_RTP_BIN_UNLOCK (rtpbin); break; case PROP_IGNORE_PT: g_value_set_boolean (value, rtpbin->ignore_pt); break; case PROP_NTP_SYNC: g_value_set_boolean (value, rtpbin->ntp_sync); break; case PROP_RTCP_SYNC: g_value_set_enum (value, g_atomic_int_get (&rtpbin->rtcp_sync)); break; case PROP_RTCP_SYNC_INTERVAL: g_value_set_uint (value, rtpbin->rtcp_sync_interval); break; case PROP_AUTOREMOVE: g_value_set_boolean (value, rtpbin->priv->autoremove); break; case PROP_BUFFER_MODE: g_value_set_enum (value, rtpbin->buffer_mode); break; case PROP_USE_PIPELINE_CLOCK: g_value_set_boolean (value, rtpbin->use_pipeline_clock); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message) { GstRtpBin *rtpbin; rtpbin = GST_RTP_BIN (bin); switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); /* we change the structure name and add the session ID to it */ if (gst_structure_has_name (s, "application/x-rtp-source-sdes")) { GstRtpBinSession *sess; /* find the session we set it as object data */ sess = g_object_get_data (G_OBJECT (GST_MESSAGE_SRC (message)), "GstRTPBin.session"); if (G_LIKELY (sess)) { message = gst_message_make_writable (message); s = gst_message_get_structure (message); gst_structure_set ((GstStructure *) s, "session", G_TYPE_UINT, sess->id, NULL); } } GST_BIN_CLASS (parent_class)->handle_message (bin, message); break; } case GST_MESSAGE_BUFFERING: { gint percent; gint min_percent = 100; GSList *sessions, *streams; GstRtpBinStream *stream; gboolean change = FALSE, active = FALSE; GstClockTime min_out_time; GstBufferingMode mode; gint avg_in, avg_out; gint64 buffering_left; gst_message_parse_buffering (message, &percent); gst_message_parse_buffering_stats (message, &mode, &avg_in, &avg_out, &buffering_left); stream = g_object_get_data (G_OBJECT (GST_MESSAGE_SRC (message)), "GstRTPBin.stream"); GST_DEBUG_OBJECT (bin, "got percent %d from stream %p", percent, stream); /* get the stream */ if (G_LIKELY (stream)) { GST_RTP_BIN_LOCK (rtpbin); /* fill in the percent */ stream->percent = percent; /* calculate the min value for all streams */ for (sessions = rtpbin->sessions; sessions; sessions = g_slist_next (sessions)) { GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; GST_RTP_SESSION_LOCK (session); if (session->streams) { for (streams = session->streams; streams; streams = g_slist_next (streams)) { GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; GST_DEBUG_OBJECT (bin, "stream %p percent %d", stream, stream->percent); /* find min percent */ if (min_percent > stream->percent) min_percent = stream->percent; } } else { GST_INFO_OBJECT (bin, "session has no streams, setting min_percent to 0"); min_percent = 0; } GST_RTP_SESSION_UNLOCK (session); } GST_DEBUG_OBJECT (bin, "min percent %d", min_percent); if (rtpbin->buffering) { if (min_percent == 100) { rtpbin->buffering = FALSE; active = TRUE; change = TRUE; } } else { if (min_percent < 100) { /* pause the streams */ rtpbin->buffering = TRUE; active = FALSE; change = TRUE; } } GST_RTP_BIN_UNLOCK (rtpbin); gst_message_unref (message); /* make a new buffering message with the min value */ message = gst_message_new_buffering (GST_OBJECT_CAST (bin), min_percent); gst_message_set_buffering_stats (message, mode, avg_in, avg_out, buffering_left); if (G_UNLIKELY (change)) { GstClock *clock; guint64 running_time = 0; guint64 offset = 0; /* figure out the running time when we have a clock */ if (G_LIKELY ((clock = gst_element_get_clock (GST_ELEMENT_CAST (bin))))) { guint64 now, base_time; now = gst_clock_get_time (clock); base_time = gst_element_get_base_time (GST_ELEMENT_CAST (bin)); running_time = now - base_time; gst_object_unref (clock); } GST_DEBUG_OBJECT (bin, "running time now %" GST_TIME_FORMAT, GST_TIME_ARGS (running_time)); GST_RTP_BIN_LOCK (rtpbin); /* when we reactivate, calculate the offsets so that all streams have * an output time that is at least as big as the running_time */ offset = 0; if (active) { if (running_time > rtpbin->buffer_start) { offset = running_time - rtpbin->buffer_start; if (offset >= rtpbin->latency_ns) offset -= rtpbin->latency_ns; else offset = 0; } } /* pause all streams */ min_out_time = -1; for (sessions = rtpbin->sessions; sessions; sessions = g_slist_next (sessions)) { GstRtpBinSession *session = (GstRtpBinSession *) sessions->data; GST_RTP_SESSION_LOCK (session); for (streams = session->streams; streams; streams = g_slist_next (streams)) { GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; GstElement *element = stream->buffer; guint64 last_out; g_signal_emit_by_name (element, "set-active", active, offset, &last_out); if (!active) { g_object_get (element, "percent", &stream->percent, NULL); if (last_out == -1) last_out = 0; if (min_out_time == -1 || last_out < min_out_time) min_out_time = last_out; } GST_DEBUG_OBJECT (bin, "setting %p to %d, offset %" GST_TIME_FORMAT ", last %" GST_TIME_FORMAT ", percent %d", element, active, GST_TIME_ARGS (offset), GST_TIME_ARGS (last_out), stream->percent); } GST_RTP_SESSION_UNLOCK (session); } GST_DEBUG_OBJECT (bin, "min out time %" GST_TIME_FORMAT, GST_TIME_ARGS (min_out_time)); /* the buffer_start is the min out time of all paused jitterbuffers */ if (!active) rtpbin->buffer_start = min_out_time; GST_RTP_BIN_UNLOCK (rtpbin); } } GST_BIN_CLASS (parent_class)->handle_message (bin, message); break; } default: { GST_BIN_CLASS (parent_class)->handle_message (bin, message); break; } } } static GstStateChangeReturn gst_rtp_bin_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn res; GstRtpBin *rtpbin; GstRtpBinPrivate *priv; rtpbin = GST_RTP_BIN (element); priv = rtpbin->priv; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: priv->last_unix = 0; GST_LOG_OBJECT (rtpbin, "clearing shutdown flag"); g_atomic_int_set (&priv->shutdown, 0); break; case GST_STATE_CHANGE_PAUSED_TO_READY: GST_LOG_OBJECT (rtpbin, "setting shutdown flag"); g_atomic_int_set (&priv->shutdown, 1); /* wait for all callbacks to end by taking the lock. No new callbacks will * be able to happen as we set the shutdown flag. */ GST_RTP_BIN_DYN_LOCK (rtpbin); GST_LOG_OBJECT (rtpbin, "dynamic lock taken, we can continue shutdown"); GST_RTP_BIN_DYN_UNLOCK (rtpbin); break; default: break; } res = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return res; } /* a new pad (SSRC) was created in @session. This signal is emited from the * payload demuxer. */ static void new_payload_found (GstElement * element, guint pt, GstPad * pad, GstRtpBinStream * stream) { GstRtpBin *rtpbin; GstElementClass *klass; GstPadTemplate *templ; gchar *padname; GstPad *gpad; rtpbin = stream->bin; GST_DEBUG ("new payload pad %d", pt); GST_RTP_BIN_SHUTDOWN_LOCK (rtpbin, shutdown); /* ghost the pad to the parent */ klass = GST_ELEMENT_GET_CLASS (rtpbin); templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%d_%d_%d"); padname = g_strdup_printf ("recv_rtp_src_%d_%u_%d", stream->session->id, stream->ssrc, pt); gpad = gst_ghost_pad_new_from_template (padname, pad, templ); g_free (padname); g_object_set_data (G_OBJECT (pad), "GstRTPBin.ghostpad", gpad); gst_pad_set_caps (gpad, GST_PAD_CAPS (pad)); gst_pad_set_active (gpad, TRUE); GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), gpad); return; shutdown: { GST_DEBUG ("ignoring, we are shutting down"); return; } } static void payload_pad_removed (GstElement * element, GstPad * pad, GstRtpBinStream * stream) { GstRtpBin *rtpbin; GstPad *gpad; rtpbin = stream->bin; GST_DEBUG ("payload pad removed"); GST_RTP_BIN_DYN_LOCK (rtpbin); if ((gpad = g_object_get_data (G_OBJECT (pad), "GstRTPBin.ghostpad"))) { g_object_set_data (G_OBJECT (pad), "GstRTPBin.ghostpad", NULL); gst_pad_set_active (gpad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), gpad); } GST_RTP_BIN_DYN_UNLOCK (rtpbin); } static GstCaps * pt_map_requested (GstElement * element, guint pt, GstRtpBinSession * session) { GstRtpBin *rtpbin; GstCaps *caps; rtpbin = session->bin; GST_DEBUG_OBJECT (rtpbin, "payload map requested for pt %d in session %d", pt, session->id); caps = get_pt_map (session, pt); if (!caps) goto no_caps; return caps; /* ERRORS */ no_caps: { GST_DEBUG_OBJECT (rtpbin, "could not get caps"); return NULL; } } static void payload_type_change (GstElement * element, guint pt, GstRtpBinSession * session) { GST_DEBUG_OBJECT (session->bin, "emiting signal for pt type changed to %d in session %d", pt, session->id); g_signal_emit (session->bin, gst_rtp_bin_signals[SIGNAL_PAYLOAD_TYPE_CHANGE], 0, session->id, pt); } /* emited when caps changed for the session */ static void caps_changed (GstPad * pad, GParamSpec * pspec, GstRtpBinSession * session) { GstRtpBin *bin; GstCaps *caps; gint payload; const GstStructure *s; bin = session->bin; g_object_get (pad, "caps", &caps, NULL); if (caps == NULL) return; GST_DEBUG_OBJECT (bin, "got caps %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); /* get payload, finish when it's not there */ if (!gst_structure_get_int (s, "payload", &payload)) return; GST_RTP_SESSION_LOCK (session); GST_DEBUG_OBJECT (bin, "insert caps for payload %d", payload); g_hash_table_insert (session->ptmap, GINT_TO_POINTER (payload), caps); GST_RTP_SESSION_UNLOCK (session); } /* a new pad (SSRC) was created in @session */ static void new_ssrc_pad_found (GstElement * element, guint ssrc, GstPad * pad, GstRtpBinSession * session) { GstRtpBin *rtpbin; GstRtpBinStream *stream; GstPad *sinkpad, *srcpad; gchar *padname; rtpbin = session->bin; GST_DEBUG_OBJECT (rtpbin, "new SSRC pad %08x, %s:%s", ssrc, GST_DEBUG_PAD_NAME (pad)); GST_RTP_BIN_SHUTDOWN_LOCK (rtpbin, shutdown); GST_RTP_SESSION_LOCK (session); /* create new stream */ stream = create_stream (session, ssrc); if (!stream) goto no_stream; /* get pad and link */ GST_DEBUG_OBJECT (rtpbin, "linking jitterbuffer RTP"); padname = g_strdup_printf ("src_%d", ssrc); srcpad = gst_element_get_static_pad (element, padname); g_free (padname); sinkpad = gst_element_get_static_pad (stream->buffer, "sink"); gst_pad_link (srcpad, sinkpad); gst_object_unref (sinkpad); gst_object_unref (srcpad); GST_DEBUG_OBJECT (rtpbin, "linking jitterbuffer RTCP"); padname = g_strdup_printf ("rtcp_src_%d", ssrc); srcpad = gst_element_get_static_pad (element, padname); g_free (padname); sinkpad = gst_element_get_request_pad (stream->buffer, "sink_rtcp"); gst_pad_link (srcpad, sinkpad); gst_object_unref (sinkpad); gst_object_unref (srcpad); /* connect to the RTCP sync signal from the jitterbuffer */ GST_DEBUG_OBJECT (rtpbin, "connecting sync signal"); stream->buffer_handlesync_sig = g_signal_connect (stream->buffer, "handle-sync", (GCallback) gst_rtp_bin_handle_sync, stream); if (stream->demux) { /* connect to the new-pad signal of the payload demuxer, this will expose the * new pad by ghosting it. */ stream->demux_newpad_sig = g_signal_connect (stream->demux, "new-payload-type", (GCallback) new_payload_found, stream); stream->demux_padremoved_sig = g_signal_connect (stream->demux, "pad-removed", (GCallback) payload_pad_removed, stream); /* connect to the request-pt-map signal. This signal will be emited by the * demuxer so that it can apply a proper caps on the buffers for the * depayloaders. */ stream->demux_ptreq_sig = g_signal_connect (stream->demux, "request-pt-map", (GCallback) pt_map_requested, session); /* connect to the signal so it can be forwarded. */ stream->demux_ptchange_sig = g_signal_connect (stream->demux, "payload-type-change", (GCallback) payload_type_change, session); } else { /* add gstrtpjitterbuffer src pad to pads */ GstElementClass *klass; GstPadTemplate *templ; gchar *padname; GstPad *gpad, *pad; pad = gst_element_get_static_pad (stream->buffer, "src"); /* ghost the pad to the parent */ klass = GST_ELEMENT_GET_CLASS (rtpbin); templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%d_%d_%d"); padname = g_strdup_printf ("recv_rtp_src_%d_%u_%d", stream->session->id, stream->ssrc, 255); gpad = gst_ghost_pad_new_from_template (padname, pad, templ); g_free (padname); gst_pad_set_caps (gpad, GST_PAD_CAPS (pad)); gst_pad_set_active (gpad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), gpad); gst_object_unref (pad); } GST_RTP_SESSION_UNLOCK (session); GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); return; /* ERRORS */ shutdown: { GST_DEBUG_OBJECT (rtpbin, "we are shutting down"); return; } no_stream: { GST_RTP_SESSION_UNLOCK (session); GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); GST_DEBUG_OBJECT (rtpbin, "could not create stream"); return; } } /* Create a pad for receiving RTP for the session in @name. Must be called with * RTP_BIN_LOCK. */ static GstPad * create_recv_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) { GstPad *sinkdpad; guint sessid; GstRtpBinSession *session; GstPadLinkReturn lres; /* first get the session number */ if (name == NULL || sscanf (name, "recv_rtp_sink_%d", &sessid) != 1) goto no_name; GST_DEBUG_OBJECT (rtpbin, "finding session %d", sessid); /* get or create session */ session = find_session_by_id (rtpbin, sessid); if (!session) { GST_DEBUG_OBJECT (rtpbin, "creating session %d", sessid); /* create session now */ session = create_session (rtpbin, sessid); if (session == NULL) goto create_error; } /* check if pad was requested */ if (session->recv_rtp_sink_ghost != NULL) return session->recv_rtp_sink_ghost; GST_DEBUG_OBJECT (rtpbin, "getting RTP sink pad"); /* get recv_rtp pad and store */ session->recv_rtp_sink = gst_element_get_request_pad (session->session, "recv_rtp_sink"); if (session->recv_rtp_sink == NULL) goto pad_failed; g_signal_connect (session->recv_rtp_sink, "notify::caps", (GCallback) caps_changed, session); GST_DEBUG_OBJECT (rtpbin, "getting RTP src pad"); /* get srcpad, link to SSRCDemux */ session->recv_rtp_src = gst_element_get_static_pad (session->session, "recv_rtp_src"); if (session->recv_rtp_src == NULL) goto pad_failed; GST_DEBUG_OBJECT (rtpbin, "getting demuxer RTP sink pad"); sinkdpad = gst_element_get_static_pad (session->demux, "sink"); GST_DEBUG_OBJECT (rtpbin, "linking demuxer RTP sink pad"); lres = gst_pad_link (session->recv_rtp_src, sinkdpad); gst_object_unref (sinkdpad); if (lres != GST_PAD_LINK_OK) goto link_failed; /* connect to the new-ssrc-pad signal of the SSRC demuxer */ session->demux_newpad_sig = g_signal_connect (session->demux, "new-ssrc-pad", (GCallback) new_ssrc_pad_found, session); session->demux_padremoved_sig = g_signal_connect (session->demux, "removed-ssrc-pad", (GCallback) ssrc_demux_pad_removed, session); GST_DEBUG_OBJECT (rtpbin, "ghosting session sink pad"); session->recv_rtp_sink_ghost = gst_ghost_pad_new_from_template (name, session->recv_rtp_sink, templ); gst_pad_set_active (session->recv_rtp_sink_ghost, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->recv_rtp_sink_ghost); return session->recv_rtp_sink_ghost; /* ERRORS */ no_name: { g_warning ("gstrtpbin: invalid name given"); return NULL; } create_error: { /* create_session already warned */ return NULL; } pad_failed: { g_warning ("gstrtpbin: failed to get session pad"); return NULL; } link_failed: { g_warning ("gstrtpbin: failed to link pads"); return NULL; } } static void remove_recv_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session) { if (session->demux_newpad_sig) { g_signal_handler_disconnect (session->demux, session->demux_newpad_sig); session->demux_newpad_sig = 0; } if (session->demux_padremoved_sig) { g_signal_handler_disconnect (session->demux, session->demux_padremoved_sig); session->demux_padremoved_sig = 0; } if (session->recv_rtp_src) { gst_object_unref (session->recv_rtp_src); session->recv_rtp_src = NULL; } if (session->recv_rtp_sink) { gst_element_release_request_pad (session->session, session->recv_rtp_sink); gst_object_unref (session->recv_rtp_sink); session->recv_rtp_sink = NULL; } if (session->recv_rtp_sink_ghost) { gst_pad_set_active (session->recv_rtp_sink_ghost, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), session->recv_rtp_sink_ghost); session->recv_rtp_sink_ghost = NULL; } } /* Create a pad for receiving RTCP for the session in @name. Must be called with * RTP_BIN_LOCK. */ static GstPad * create_recv_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) { guint sessid; GstRtpBinSession *session; GstPad *sinkdpad; GstPadLinkReturn lres; /* first get the session number */ if (name == NULL || sscanf (name, "recv_rtcp_sink_%d", &sessid) != 1) goto no_name; GST_DEBUG_OBJECT (rtpbin, "finding session %d", sessid); /* get or create the session */ session = find_session_by_id (rtpbin, sessid); if (!session) { GST_DEBUG_OBJECT (rtpbin, "creating session %d", sessid); /* create session now */ session = create_session (rtpbin, sessid); if (session == NULL) goto create_error; } /* check if pad was requested */ if (session->recv_rtcp_sink_ghost != NULL) return session->recv_rtcp_sink_ghost; /* get recv_rtp pad and store */ GST_DEBUG_OBJECT (rtpbin, "getting RTCP sink pad"); session->recv_rtcp_sink = gst_element_get_request_pad (session->session, "recv_rtcp_sink"); if (session->recv_rtcp_sink == NULL) goto pad_failed; /* get srcpad, link to SSRCDemux */ GST_DEBUG_OBJECT (rtpbin, "getting sync src pad"); session->sync_src = gst_element_get_static_pad (session->session, "sync_src"); if (session->sync_src == NULL) goto pad_failed; GST_DEBUG_OBJECT (rtpbin, "getting demuxer RTCP sink pad"); sinkdpad = gst_element_get_static_pad (session->demux, "rtcp_sink"); lres = gst_pad_link (session->sync_src, sinkdpad); gst_object_unref (sinkdpad); if (lres != GST_PAD_LINK_OK) goto link_failed; session->recv_rtcp_sink_ghost = gst_ghost_pad_new_from_template (name, session->recv_rtcp_sink, templ); gst_pad_set_active (session->recv_rtcp_sink_ghost, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->recv_rtcp_sink_ghost); return session->recv_rtcp_sink_ghost; /* ERRORS */ no_name: { g_warning ("gstrtpbin: invalid name given"); return NULL; } create_error: { /* create_session already warned */ return NULL; } pad_failed: { g_warning ("gstrtpbin: failed to get session pad"); return NULL; } link_failed: { g_warning ("gstrtpbin: failed to link pads"); return NULL; } } static void remove_recv_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session) { if (session->recv_rtcp_sink_ghost) { gst_pad_set_active (session->recv_rtcp_sink_ghost, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), session->recv_rtcp_sink_ghost); session->recv_rtcp_sink_ghost = NULL; } if (session->sync_src) { /* releasing the request pad should also unref the sync pad */ gst_object_unref (session->sync_src); session->sync_src = NULL; } if (session->recv_rtcp_sink) { gst_element_release_request_pad (session->session, session->recv_rtcp_sink); gst_object_unref (session->recv_rtcp_sink); session->recv_rtcp_sink = NULL; } } /* Create a pad for sending RTP for the session in @name. Must be called with * RTP_BIN_LOCK. */ static GstPad * create_send_rtp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) { gchar *gname; guint sessid; GstRtpBinSession *session; GstElementClass *klass; /* first get the session number */ if (name == NULL || sscanf (name, "send_rtp_sink_%d", &sessid) != 1) goto no_name; /* get or create session */ session = find_session_by_id (rtpbin, sessid); if (!session) { /* create session now */ session = create_session (rtpbin, sessid); if (session == NULL) goto create_error; } /* check if pad was requested */ if (session->send_rtp_sink_ghost != NULL) return session->send_rtp_sink_ghost; /* get send_rtp pad and store */ session->send_rtp_sink = gst_element_get_request_pad (session->session, "send_rtp_sink"); if (session->send_rtp_sink == NULL) goto pad_failed; session->send_rtp_sink_ghost = gst_ghost_pad_new_from_template (name, session->send_rtp_sink, templ); gst_pad_set_active (session->send_rtp_sink_ghost, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtp_sink_ghost); /* get srcpad */ session->send_rtp_src = gst_element_get_static_pad (session->session, "send_rtp_src"); if (session->send_rtp_src == NULL) goto no_srcpad; /* ghost the new source pad */ klass = GST_ELEMENT_GET_CLASS (rtpbin); gname = g_strdup_printf ("send_rtp_src_%d", sessid); templ = gst_element_class_get_pad_template (klass, "send_rtp_src_%d"); session->send_rtp_src_ghost = gst_ghost_pad_new_from_template (gname, session->send_rtp_src, templ); gst_pad_set_active (session->send_rtp_src_ghost, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtp_src_ghost); g_free (gname); return session->send_rtp_sink_ghost; /* ERRORS */ no_name: { g_warning ("gstrtpbin: invalid name given"); return NULL; } create_error: { /* create_session already warned */ return NULL; } pad_failed: { g_warning ("gstrtpbin: failed to get session pad for session %d", sessid); return NULL; } no_srcpad: { g_warning ("gstrtpbin: failed to get rtp source pad for session %d", sessid); return NULL; } } static void remove_send_rtp (GstRtpBin * rtpbin, GstRtpBinSession * session) { if (session->send_rtp_src_ghost) { gst_pad_set_active (session->send_rtp_src_ghost, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtp_src_ghost); session->send_rtp_src_ghost = NULL; } if (session->send_rtp_src) { gst_object_unref (session->send_rtp_src); session->send_rtp_src = NULL; } if (session->send_rtp_sink) { gst_element_release_request_pad (GST_ELEMENT_CAST (session->session), session->send_rtp_sink); gst_object_unref (session->send_rtp_sink); session->send_rtp_sink = NULL; } if (session->send_rtp_sink_ghost) { gst_pad_set_active (session->send_rtp_sink_ghost, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtp_sink_ghost); session->send_rtp_sink_ghost = NULL; } } /* Create a pad for sending RTCP for the session in @name. Must be called with * RTP_BIN_LOCK. */ static GstPad * create_rtcp (GstRtpBin * rtpbin, GstPadTemplate * templ, const gchar * name) { guint sessid; GstRtpBinSession *session; /* first get the session number */ if (name == NULL || sscanf (name, "send_rtcp_src_%d", &sessid) != 1) goto no_name; /* get or create session */ session = find_session_by_id (rtpbin, sessid); if (!session) goto no_session; /* check if pad was requested */ if (session->send_rtcp_src_ghost != NULL) return session->send_rtcp_src_ghost; /* get rtcp_src pad and store */ session->send_rtcp_src = gst_element_get_request_pad (session->session, "send_rtcp_src"); if (session->send_rtcp_src == NULL) goto pad_failed; session->send_rtcp_src_ghost = gst_ghost_pad_new_from_template (name, session->send_rtcp_src, templ); gst_pad_set_active (session->send_rtcp_src_ghost, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtcp_src_ghost); return session->send_rtcp_src_ghost; /* ERRORS */ no_name: { g_warning ("gstrtpbin: invalid name given"); return NULL; } no_session: { g_warning ("gstrtpbin: session with id %d does not exist", sessid); return NULL; } pad_failed: { g_warning ("gstrtpbin: failed to get rtcp pad for session %d", sessid); return NULL; } } static void remove_rtcp (GstRtpBin * rtpbin, GstRtpBinSession * session) { if (session->send_rtcp_src_ghost) { gst_pad_set_active (session->send_rtcp_src_ghost, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (rtpbin), session->send_rtcp_src_ghost); session->send_rtcp_src_ghost = NULL; } if (session->send_rtcp_src) { gst_element_release_request_pad (session->session, session->send_rtcp_src); gst_object_unref (session->send_rtcp_src); session->send_rtcp_src = NULL; } } /* If the requested name is NULL we should create a name with * the session number assuming we want the lowest posible session * with a free pad like the template */ static gchar * gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ) { gboolean name_found = FALSE; gint session = 0; GstIterator *pad_it = NULL; gchar *pad_name = NULL; GST_DEBUG_OBJECT (element, "find a free pad name for template"); while (!name_found) { gboolean done = FALSE; g_free (pad_name); pad_name = g_strdup_printf (templ->name_template, session++); pad_it = gst_element_iterate_pads (GST_ELEMENT (element)); name_found = TRUE; while (!done) { gpointer data; switch (gst_iterator_next (pad_it, &data)) { case GST_ITERATOR_OK: { GstPad *pad; gchar *name; pad = GST_PAD_CAST (data); name = gst_pad_get_name (pad); if (strcmp (name, pad_name) == 0) { done = TRUE; name_found = FALSE; } g_free (name); gst_object_unref (pad); break; } case GST_ITERATOR_ERROR: case GST_ITERATOR_RESYNC: /* restart iteration */ done = TRUE; name_found = FALSE; session = 0; break; case GST_ITERATOR_DONE: done = TRUE; break; } } gst_iterator_free (pad_it); } GST_DEBUG_OBJECT (element, "free pad name found: '%s'", pad_name); return pad_name; } /* */ static GstPad * gst_rtp_bin_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name) { GstRtpBin *rtpbin; GstElementClass *klass; GstPad *result; gchar *pad_name = NULL; g_return_val_if_fail (templ != NULL, NULL); g_return_val_if_fail (GST_IS_RTP_BIN (element), NULL); rtpbin = GST_RTP_BIN (element); klass = GST_ELEMENT_GET_CLASS (element); GST_RTP_BIN_LOCK (rtpbin); if (name == NULL) { /* use a free pad name */ pad_name = gst_rtp_bin_get_free_pad_name (element, templ); } else { /* use the provided name */ pad_name = g_strdup (name); } GST_DEBUG_OBJECT (rtpbin, "Trying to request a pad with name %s", pad_name); /* figure out the template */ if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%d")) { result = create_recv_rtp (rtpbin, templ, pad_name); } else if (templ == gst_element_class_get_pad_template (klass, "recv_rtcp_sink_%d")) { result = create_recv_rtcp (rtpbin, templ, pad_name); } else if (templ == gst_element_class_get_pad_template (klass, "send_rtp_sink_%d")) { result = create_send_rtp (rtpbin, templ, pad_name); } else if (templ == gst_element_class_get_pad_template (klass, "send_rtcp_src_%d")) { result = create_rtcp (rtpbin, templ, pad_name); } else goto wrong_template; g_free (pad_name); GST_RTP_BIN_UNLOCK (rtpbin); return result; /* ERRORS */ wrong_template: { g_free (pad_name); GST_RTP_BIN_UNLOCK (rtpbin); g_warning ("gstrtpbin: this is not our template"); return NULL; } } static void gst_rtp_bin_release_pad (GstElement * element, GstPad * pad) { GstRtpBinSession *session; GstRtpBin *rtpbin; g_return_if_fail (GST_IS_GHOST_PAD (pad)); g_return_if_fail (GST_IS_RTP_BIN (element)); rtpbin = GST_RTP_BIN (element); GST_RTP_BIN_LOCK (rtpbin); GST_DEBUG_OBJECT (rtpbin, "Trying to release pad %s:%s", GST_DEBUG_PAD_NAME (pad)); if (!(session = find_session_by_pad (rtpbin, pad))) goto unknown_pad; if (session->recv_rtp_sink_ghost == pad) { remove_recv_rtp (rtpbin, session); } else if (session->recv_rtcp_sink_ghost == pad) { remove_recv_rtcp (rtpbin, session); } else if (session->send_rtp_sink_ghost == pad) { remove_send_rtp (rtpbin, session); } else if (session->send_rtcp_src_ghost == pad) { remove_rtcp (rtpbin, session); } /* no more request pads, free the complete session */ if (session->recv_rtp_sink_ghost == NULL && session->recv_rtcp_sink_ghost == NULL && session->send_rtp_sink_ghost == NULL && session->send_rtcp_src_ghost == NULL) { GST_DEBUG_OBJECT (rtpbin, "no more pads for session %p", session); rtpbin->sessions = g_slist_remove (rtpbin->sessions, session); free_session (session, rtpbin); } GST_RTP_BIN_UNLOCK (rtpbin); return; /* ERROR */ unknown_pad: { GST_RTP_BIN_UNLOCK (rtpbin); g_warning ("gstrtpbin: %s:%s is not one of our request pads", GST_DEBUG_PAD_NAME (pad)); return; } } gst-plugins-good-0.10.31/gst/rtpmanager/rtpstats.h0000644000175000017500000001510311671175354017003 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 __RTP_STATS_H__ #define __RTP_STATS_H__ #include #include /** * RTPSenderReport: * * A sender report structure. */ typedef struct { gboolean is_valid; guint64 ntptime; guint32 rtptime; guint32 packet_count; guint32 octet_count; GstClockTime time; } RTPSenderReport; /** * RTPReceiverReport: * * A receiver report structure. */ typedef struct { gboolean is_valid; guint32 ssrc; /* who the report is from */ guint8 fractionlost; guint32 packetslost; guint32 exthighestseq; guint32 jitter; guint32 lsr; guint32 dlsr; guint32 round_trip; } RTPReceiverReport; /** * RTPArrivalStats: * @current_time: current time according to the system clock * @running_time: arrival time of a packet as buffer running_time * @ntpnstime: arrival time of a packet NTP time in nanoseconds * @have_address: if the @address field contains a valid address * @address: address of the sender of the packet * @bytes: bytes of the packet including lowlevel overhead * @payload_len: bytes of the RTP payload * * Structure holding information about the arrival stats of a packet. */ typedef struct { GstClockTime current_time; GstClockTime running_time; guint64 ntpnstime; gboolean have_address; GstNetAddress address; guint bytes; guint payload_len; } RTPArrivalStats; /** * RTPSourceStats: * @packetsreceived: number of received packets in total * @prevpacketsreceived: number of packets received in previous reporting * interval * @octetsreceived: number of payload bytes received * @bytesreceived: number of total bytes received including headers and lower * protocol level overhead * @max_seqnr: highest sequence number received * @transit: previous transit time used for calculating @jitter * @jitter: current jitter * @prev_rtptime: previous time when an RTP packet was received * @prev_rtcptime: previous time when an RTCP packet was received * @last_rtptime: time when last RTP packet received * @last_rtcptime: time when last RTCP packet received * @curr_rr: index of current @rr block * @rr: previous and current receiver report block * @curr_sr: index of current @sr block * @sr: previous and current sender report block * * Stats about a source. */ typedef struct { guint64 packets_received; guint64 octets_received; guint64 bytes_received; guint32 prev_expected; guint32 prev_received; guint16 max_seq; guint64 cycles; guint32 base_seq; guint32 bad_seq; guint32 transit; guint32 jitter; guint64 packets_sent; guint64 octets_sent; /* when we received stuff */ GstClockTime prev_rtptime; GstClockTime prev_rtcptime; GstClockTime last_rtptime; GstClockTime last_rtcptime; /* sender and receiver reports */ gint curr_rr; RTPReceiverReport rr[2]; gint curr_sr; RTPSenderReport sr[2]; } RTPSourceStats; #define RTP_STATS_BANDWIDTH 64000 #define RTP_STATS_RTCP_FRACTION 0.05 /* * Minimum average time between RTCP packets from this site (in * seconds). This time prevents the reports from `clumping' when * sessions are small and the law of large numbers isn't helping * to smooth out the traffic. It also keeps the report interval * from becoming ridiculously small during transient outages like * a network partition. */ #define RTP_STATS_MIN_INTERVAL 5.0 /* * Fraction of the RTCP bandwidth to be shared among active * senders. (This fraction was chosen so that in a typical * session with one or two active senders, the computed report * time would be roughly equal to the minimum report time so that * we don't unnecessarily slow down receiver reports.) The * receiver fraction must be 1 - the sender fraction. */ #define RTP_STATS_SENDER_FRACTION (0.25) #define RTP_STATS_RECEIVER_FRACTION (1.0 - RTP_STATS_SENDER_FRACTION) /* * When receiving a BYE from a source, remove the source from the database * after this timeout. */ #define RTP_STATS_BYE_TIMEOUT (2 * GST_SECOND) /* * The maximum number of missing packets we tollerate. These are packets with a * sequence number bigger than the last seen packet. */ #define RTP_MAX_DROPOUT 3000 /* * The maximum number of misordered packets we tollerate. These are packets with * a sequence number smaller than the last seen packet. */ #define RTP_MAX_MISORDER 100 /** * RTPSessionStats: * * Stats kept for a session and used to produce RTCP packet timeouts. */ typedef struct { guint bandwidth; guint rtcp_bandwidth; gdouble sender_fraction; gdouble receiver_fraction; gdouble min_interval; GstClockTime bye_timeout; guint sender_sources; guint active_sources; guint avg_rtcp_packet_size; guint bye_members; } RTPSessionStats; void rtp_stats_init_defaults (RTPSessionStats *stats); void rtp_stats_set_bandwidths (RTPSessionStats *stats, guint rtp_bw, gdouble rtcp_bw, guint rs, guint rr); GstClockTime rtp_stats_calculate_rtcp_interval (RTPSessionStats *stats, gboolean sender, gboolean first); GstClockTime rtp_stats_add_rtcp_jitter (RTPSessionStats *stats, GstClockTime interval); GstClockTime rtp_stats_calculate_bye_interval (RTPSessionStats *stats); gint64 rtp_stats_get_packets_lost (const RTPSourceStats *stats); void rtp_stats_set_min_interval (RTPSessionStats *stats, gdouble min_interval); #endif /* __RTP_STATS_H__ */ gst-plugins-good-0.10.31/gst/wavenc/0000755000175000017500000000000011720565315014144 500000000000000gst-plugins-good-0.10.31/gst/wavenc/Makefile.am0000644000175000017500000000156611671175354016135 00000000000000plugin_LTLIBRARIES = libgstwavenc.la libgstwavenc_la_SOURCES = gstwavenc.c libgstwavenc_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CFLAGS) libgstwavenc_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ $(GST_LIBS) libgstwavenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstwavenc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstwavenc.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstwavenc -:SHARED libgstwavenc \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstwavenc_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavenc_la_CFLAGS) \ -:LDFLAGS $(libgstwavenc_la_LDFLAGS) \ $(libgstwavenc_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/wavenc/gstwavenc.h0000644000175000017500000000345411671175354016251 00000000000000/* GStreamer * Copyright (C) 2002, Iain Holmes * * 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_WAV_ENC_H__ #define __GST_WAV_ENC_H__ #include G_BEGIN_DECLS #define GST_TYPE_WAVENC \ (gst_wavenc_get_type()) #define GST_WAVENC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAVENC,GstWavEnc)) #define GST_WAVENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAVENC,GstWavEncClass)) #define GST_IS_WAVENC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAVENC)) #define GST_IS_WAVENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAVENC)) typedef struct _GstWavEnc GstWavEnc; typedef struct _GstWavEncClass GstWavEncClass; struct _GstWavEnc { GstElement element; GstPad *sinkpad; GstPad *srcpad; /* useful audio data */ guint16 format; guint width; guint rate; guint channels; guint32 length; gboolean sent_header; gboolean finished_properly; }; struct _GstWavEncClass { GstElementClass parent_class; }; GType gst_wavenc_get_type (void); G_END_DECLS #endif /* __GST_WAV_ENC_H__ */ gst-plugins-good-0.10.31/gst/wavenc/gstwavenc.c0000644000175000017500000005222511677341660016245 00000000000000/* -*- mOde: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */ /* GStreamer .wav encoder * Copyright (C) <2002> Iain Holmes * Copyright (C) <2006> Tim-Philipp Müller * * 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-wavenc * * Format a audio stream into the wav format. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstwavenc.h" #include GST_DEBUG_CATEGORY_STATIC (wavenc_debug); #define GST_CAT_DEFAULT wavenc_debug struct riff_struct { guint8 id[4]; /* RIFF */ guint32 len; guint8 wav_id[4]; /* WAVE */ }; struct chunk_struct { guint8 id[4]; guint32 len; }; struct common_struct { guint16 wFormatTag; guint16 wChannels; guint32 dwSamplesPerSec; guint32 dwAvgBytesPerSec; guint16 wBlockAlign; guint16 wBitsPerSample; /* Only for PCM */ }; struct wave_header { struct riff_struct riff; struct chunk_struct format; struct common_struct common; struct chunk_struct data; }; /* FIXME: mono doesn't produce correct files it seems, at least mplayer xruns */ /* Max. of two channels, more channels need WAVFORMATEX with * channel layout, which we do not support yet */ #define SINK_CAPS \ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "endianness = (int) LITTLE_ENDIAN, " \ "width = (int) 32, " \ "depth = (int) 32, " \ "signed = (boolean) true" \ "; " \ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "endianness = (int) LITTLE_ENDIAN, " \ "width = (int) 24, " \ "depth = (int) 24, " \ "signed = (boolean) true" \ "; " \ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "endianness = (int) LITTLE_ENDIAN, " \ "width = (int) 16, " \ "depth = (int) 16, " \ "signed = (boolean) true" \ "; " \ "audio/x-raw-int, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "width = (int) 8, " \ "depth = (int) 8, " \ "signed = (boolean) false" \ "; " \ "audio/x-raw-float, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) [ 1, 2 ], " \ "endianness = (int) LITTLE_ENDIAN, " \ "width = (int) { 32, 64 }; " \ "audio/x-alaw, " \ "rate = (int) [ 8000, 192000 ], " \ "channels = (int) [ 1, 2 ], " \ "width = (int) 8, " \ "depth = (int) 8, " \ "signed = (boolean) false; " \ "audio/x-mulaw, " \ "rate = (int) [ 8000, 192000 ], " \ "channels = (int) [ 1, 2 ], " \ "width = (int) 8, " \ "depth = (int) 8, " \ "signed = (boolean) false" static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SINK_CAPS) ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-wav") ); GST_BOILERPLATE (GstWavEnc, gst_wavenc, GstElement, GST_TYPE_ELEMENT); static GstFlowReturn gst_wavenc_chain (GstPad * pad, GstBuffer * buf); static gboolean gst_wavenc_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_wavenc_change_state (GstElement * element, GstStateChange transition); static gboolean gst_wavenc_sink_setcaps (GstPad * pad, GstCaps * caps); static void gst_wavenc_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "WAV audio muxer", "Codec/Muxer/Audio", "Encode raw audio into WAV", "Iain Holmes "); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); GST_DEBUG_CATEGORY_INIT (wavenc_debug, "wavenc", 0, "WAV encoder element"); } static void gst_wavenc_class_init (GstWavEncClass * klass) { GstElementClass *element_class; element_class = (GstElementClass *) klass; element_class->change_state = GST_DEBUG_FUNCPTR (gst_wavenc_change_state); } static void gst_wavenc_init (GstWavEnc * wavenc, GstWavEncClass * klass) { wavenc->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_pad_set_chain_function (wavenc->sinkpad, GST_DEBUG_FUNCPTR (gst_wavenc_chain)); gst_pad_set_event_function (wavenc->sinkpad, GST_DEBUG_FUNCPTR (gst_wavenc_event)); gst_pad_set_setcaps_function (wavenc->sinkpad, GST_DEBUG_FUNCPTR (gst_wavenc_sink_setcaps)); gst_pad_use_fixed_caps (wavenc->sinkpad); gst_element_add_pad (GST_ELEMENT (wavenc), wavenc->sinkpad); wavenc->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_use_fixed_caps (wavenc->srcpad); gst_pad_set_caps (wavenc->srcpad, gst_static_pad_template_get_caps (&src_factory)); gst_element_add_pad (GST_ELEMENT (wavenc), wavenc->srcpad); } #define WAV_HEADER_LEN 44 static GstBuffer * gst_wavenc_create_header_buf (GstWavEnc * wavenc, guint audio_data_size) { struct wave_header wave; GstBuffer *buf; guint8 *header; buf = gst_buffer_new_and_alloc (WAV_HEADER_LEN); header = GST_BUFFER_DATA (buf); memset (header, 0, WAV_HEADER_LEN); wave.common.wChannels = wavenc->channels; wave.common.wBitsPerSample = wavenc->width; wave.common.dwSamplesPerSec = wavenc->rate; /* Fill out our wav-header with some information */ memcpy (wave.riff.id, "RIFF", 4); wave.riff.len = audio_data_size + WAV_HEADER_LEN - 8; memcpy (wave.riff.wav_id, "WAVE", 4); memcpy (wave.format.id, "fmt ", 4); wave.format.len = 16; wave.common.wFormatTag = wavenc->format; wave.common.wBlockAlign = (wavenc->width / 8) * wave.common.wChannels; wave.common.dwAvgBytesPerSec = wave.common.wBlockAlign * wave.common.dwSamplesPerSec; memcpy (wave.data.id, "data", 4); wave.data.len = audio_data_size; memcpy (header, (char *) wave.riff.id, 4); GST_WRITE_UINT32_LE (header + 4, wave.riff.len); memcpy (header + 8, (char *) wave.riff.wav_id, 4); memcpy (header + 12, (char *) wave.format.id, 4); GST_WRITE_UINT32_LE (header + 16, wave.format.len); GST_WRITE_UINT16_LE (header + 20, wave.common.wFormatTag); GST_WRITE_UINT16_LE (header + 22, wave.common.wChannels); GST_WRITE_UINT32_LE (header + 24, wave.common.dwSamplesPerSec); GST_WRITE_UINT32_LE (header + 28, wave.common.dwAvgBytesPerSec); GST_WRITE_UINT16_LE (header + 32, wave.common.wBlockAlign); GST_WRITE_UINT16_LE (header + 34, wave.common.wBitsPerSample); memcpy (header + 36, (char *) wave.data.id, 4); GST_WRITE_UINT32_LE (header + 40, wave.data.len); gst_buffer_set_caps (buf, GST_PAD_CAPS (wavenc->srcpad)); return buf; } static GstFlowReturn gst_wavenc_push_header (GstWavEnc * wavenc, guint audio_data_size) { GstFlowReturn ret; GstBuffer *outbuf; /* seek to beginning of file */ gst_pad_push_event (wavenc->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); GST_DEBUG_OBJECT (wavenc, "writing header with datasize=%u", audio_data_size); outbuf = gst_wavenc_create_header_buf (wavenc, audio_data_size); GST_BUFFER_OFFSET (outbuf) = 0; ret = gst_pad_push (wavenc->srcpad, outbuf); if (ret != GST_FLOW_OK) { GST_WARNING_OBJECT (wavenc, "push header failed: flow = %s", gst_flow_get_name (ret)); } return ret; } static gboolean gst_wavenc_sink_setcaps (GstPad * pad, GstCaps * caps) { GstWavEnc *wavenc; GstStructure *structure; const gchar *name; gint chans, rate, width; wavenc = GST_WAVENC (gst_pad_get_parent (pad)); if (wavenc->sent_header && !gst_caps_can_intersect (caps, GST_PAD_CAPS (pad))) { GST_WARNING_OBJECT (wavenc, "cannot change format in middle of stream"); goto fail; } GST_DEBUG_OBJECT (wavenc, "got caps: %" GST_PTR_FORMAT, caps); structure = gst_caps_get_structure (caps, 0); name = gst_structure_get_name (structure); if (!gst_structure_get_int (structure, "channels", &chans) || !gst_structure_get_int (structure, "rate", &rate)) { GST_WARNING_OBJECT (wavenc, "caps incomplete"); goto fail; } if (strcmp (name, "audio/x-raw-int") == 0) { if (!gst_structure_get_int (structure, "width", &width)) { GST_WARNING_OBJECT (wavenc, "caps incomplete"); goto fail; } wavenc->format = GST_RIFF_WAVE_FORMAT_PCM; wavenc->width = width; } else if (strcmp (name, "audio/x-raw-float") == 0) { if (!gst_structure_get_int (structure, "width", &width)) { GST_WARNING_OBJECT (wavenc, "caps incomplete"); goto fail; } wavenc->format = GST_RIFF_WAVE_FORMAT_IEEE_FLOAT; wavenc->width = width; } else if (strcmp (name, "audio/x-alaw") == 0) { wavenc->format = GST_RIFF_WAVE_FORMAT_ALAW; wavenc->width = 8; } else if (strcmp (name, "audio/x-mulaw") == 0) { wavenc->format = GST_RIFF_WAVE_FORMAT_MULAW; wavenc->width = 8; } else { GST_WARNING_OBJECT (wavenc, "Unsupported format %s", name); goto fail; } wavenc->channels = chans; wavenc->rate = rate; GST_LOG_OBJECT (wavenc, "accepted caps: format=0x%04x chans=%u width=%u rate=%u", wavenc->format, wavenc->channels, wavenc->width, wavenc->rate); gst_object_unref (wavenc); return TRUE; fail: gst_object_unref (wavenc); return FALSE; } #if 0 static struct _maps { const guint32 id; const gchar *name; } maps[] = { { GST_RIFF_INFO_IARL, "Location"}, { GST_RIFF_INFO_IART, "Artist"}, { GST_RIFF_INFO_ICMS, "Commissioner"}, { GST_RIFF_INFO_ICMT, "Comment"}, { GST_RIFF_INFO_ICOP, "Copyright"}, { GST_RIFF_INFO_ICRD, "Creation Date"}, { GST_RIFF_INFO_IENG, "Engineer"}, { GST_RIFF_INFO_IGNR, "Genre"}, { GST_RIFF_INFO_IKEY, "Keywords"}, { GST_RIFF_INFO_INAM, "Title"}, { GST_RIFF_INFO_IPRD, "Product"}, { GST_RIFF_INFO_ISBJ, "Subject"}, { GST_RIFF_INFO_ISFT, "Software"}, { GST_RIFF_INFO_ITCH, "Technician"} }; static guint32 get_id_from_name (const char *name) { int i; for (i = 0; i < G_N_ELEMENTS (maps); i++) { if (strcasecmp (maps[i].name, name) == 0) { return maps[i].id; } } return 0; } static void write_metadata (GstWavEnc * wavenc) { GString *info_str; GList *props; int total = 4; gboolean need_to_write = FALSE; info_str = g_string_new ("LIST INFO"); for (props = wavenc->metadata->properties->properties; props; props = props->next) { GstPropsEntry *entry = props->data; const char *name; guint32 id; name = gst_props_entry_get_name (entry); id = get_id_from_name (name); if (id != 0) { const char *text; char *tmp; int len, req, i; need_to_write = TRUE; /* We've got at least one entry */ gst_props_entry_get_string (entry, &text); len = strlen (text) + 1; /* The length in the file includes the \0 */ tmp = g_strdup_printf ("%" GST_FOURCC_FORMAT "%d%s", GST_FOURCC_ARGS (id), GUINT32_TO_LE (len), text); g_string_append (info_str, tmp); g_free (tmp); /* Check that we end on an even boundary */ req = ((len + 8) + 1) & ~1; for (i = 0; i < req - len; i++) { g_string_append_printf (info_str, "%c", 0); } total += req; } } if (need_to_write) { GstBuffer *buf; /* Now we've got all the strings together, we can write our length in */ info_str->str[4] = GUINT32_TO_LE (total); buf = gst_buffer_new (); gst_buffer_set_data (buf, info_str->str, info_str->len); gst_pad_push (wavenc->srcpad, GST_DATA (buf)); g_string_free (info_str, FALSE); } } static void write_cues (GstWavEnc * wavenc) { GString *cue_string, *point_string; GstBuffer *buf; GList *cue_list, *c; int num_cues, total = 4; if (gst_props_get (wavenc->metadata->properties, "cues", &cue_list, NULL) == FALSE) { /* No cues, move along please, nothing to see here */ return; } /* Space for 'cue ', chunk size and number of cuepoints */ cue_string = g_string_new ("cue "); #define CUEPOINT_SIZE 24 point_string = g_string_sized_new (CUEPOINT_SIZE); for (c = cue_list, num_cues = 0; c; c = c->next, num_cues++) { GstCaps *cue_caps = c->data; guint32 pos; gst_props_get (cue_caps->properties, "position", &pos, NULL); point_string->str[0] = GUINT32_TO_LE (num_cues + 1); point_string->str[4] = GUINT32_TO_LE (0); /* Fixme: There is probably a macro for this */ point_string->str[8] = 'd'; point_string->str[9] = 'a'; point_string->str[10] = 't'; point_string->str[11] = 'a'; point_string->str[12] = GUINT32_TO_LE (0); point_string->str[16] = GUINT32_TO_LE (0); point_string->str[20] = GUINT32_TO_LE (pos); total += CUEPOINT_SIZE; } /* Set the length and chunk size */ cue_string->str[4] = GUINT32_TO_LE (total); cue_string->str[8] = GUINT32_TO_LE (num_cues); /* Stick the cue points on the end */ g_string_append (cue_string, point_string->str); g_string_free (point_string, TRUE); buf = gst_buffer_new (); gst_buffer_set_data (buf, cue_string->str, cue_string->len); gst_pad_push (wavenc->srcpad, GST_DATA (buf)); g_string_free (cue_string, FALSE); } static void write_labels (GstWavEnc * wavenc) { GstBuffer *buf; GString *info_str; int total = 4; GList *caps; info_str = g_string_new ("LIST adtl"); if (gst_props_get (wavenc->metadata->properties, "ltxts", &caps, NULL)) { GList *p; int i; for (p = caps, i = 1; p; p = p->next, i++) { GstCaps *ltxt_caps = p->data; GString *ltxt; char *label = NULL; int len, req, j; gst_props_get (ltxt_caps->properties, "name", &label, NULL); len = strlen (label); #define LTXT_SIZE 28 ltxt = g_string_new ("ltxt "); ltxt->str[8] = GUINT32_TO_LE (i); /* Identifier */ ltxt->str[12] = GUINT32_TO_LE (0); /* Sample Length */ ltxt->str[16] = GUINT32_TO_LE (0); /* FIXME: Don't save the purpose yet */ ltxt->str[20] = GUINT16_TO_LE (0); /* Country */ ltxt->str[22] = GUINT16_TO_LE (0); /* Language */ ltxt->str[24] = GUINT16_TO_LE (0); /* Dialect */ ltxt->str[26] = GUINT16_TO_LE (0); /* Code Page */ g_string_append (ltxt, label); g_free (label); len += LTXT_SIZE; ltxt->str[4] = GUINT32_TO_LE (len); /* Check that we end on an even boundary */ req = ((len + 8) + 1) & ~1; for (j = 0; j < req - len; j++) { g_string_append_printf (ltxt, "%c", 0); } total += req; g_string_append (info_str, ltxt->str); g_string_free (ltxt, TRUE); } } if (gst_props_get (wavenc->metadata->properties, "labels", &caps, NULL)) { GList *p; int i; for (p = caps, i = 1; p; p = p->next, i++) { GstCaps *labl_caps = p->data; GString *labl; char *label = NULL; int len, req, j; gst_props_get (labl_caps->properties, "name", &label, NULL); len = strlen (label); #define LABL_SIZE 4 labl = g_string_new ("labl "); labl->str[8] = GUINT32_TO_LE (i); g_string_append (labl, label); g_free (label); len += LABL_SIZE; labl->str[4] = GUINT32_TO_LE (len); /* Check our size */ req = ((len + 8) + 1) & ~1; for (j = 0; j < req - len; j++) { g_string_append_printf (labl, "%c", 0); } total += req; g_string_append (info_str, labl->str); g_string_free (labl, TRUE); } } if (gst_props_get (wavenc->metadata->properties, "notes", &caps, NULL)) { GList *p; int i; for (p = caps, i = 1; p; p = p->next, i++) { GstCaps *note_caps = p->data; GString *note; char *label = NULL; int len, req, j; gst_props_get (note_caps->properties, "name", &label, NULL); len = strlen (label); #define NOTE_SIZE 4 note = g_string_new ("note "); note->str[8] = GUINT32_TO_LE (i); g_string_append (note, label); g_free (label); len += NOTE_SIZE; note->str[4] = GUINT32_TO_LE (len); /* Size check */ req = ((len + 8) + 1) & ~1; for (j = 0; j < req - len; j++) { g_string_append_printf (note, "%c", 0); } total += req; g_string_append (info_str, note->str); g_string_free (note, TRUE); } } info_str->str[4] = GUINT32_TO_LE (total); buf = gst_buffer_new (); gst_buffer_set_data (buf, info_str->str, info_str->len); gst_pad_push (wavenc->srcpad, GST_DATA (buf)); g_string_free (info_str, FALSE); } #endif static gboolean gst_wavenc_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstWavEnc *wavenc; wavenc = GST_WAVENC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS:{ GST_DEBUG_OBJECT (wavenc, "got EOS"); #if 0 /* Write our metadata if we have any */ if (wavenc->metadata) { write_metadata (wavenc); write_cues (wavenc); write_labels (wavenc); } #endif /* write header with correct length values */ gst_wavenc_push_header (wavenc, wavenc->length); /* we're done with this file */ wavenc->finished_properly = TRUE; /* and forward the EOS event */ res = gst_pad_event_default (pad, event); break; } case GST_EVENT_NEWSEGMENT: /* Just drop it, it's probably in TIME format * anyway. We'll send our own newsegment event */ gst_event_unref (event); break; default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (wavenc); return res; } static GstFlowReturn gst_wavenc_chain (GstPad * pad, GstBuffer * buf) { GstWavEnc *wavenc = GST_WAVENC (GST_PAD_PARENT (pad)); GstFlowReturn flow = GST_FLOW_OK; g_return_val_if_fail (wavenc->channels > 0, GST_FLOW_WRONG_STATE); if (!wavenc->sent_header) { /* use bogus size initially, we'll write the real * header when we get EOS and know the exact length */ flow = gst_wavenc_push_header (wavenc, 0x7FFF0000); /* starting a file, means we have to finish it properly */ wavenc->finished_properly = FALSE; if (flow != GST_FLOW_OK) return flow; GST_DEBUG_OBJECT (wavenc, "wrote dummy header"); wavenc->sent_header = TRUE; } GST_LOG_OBJECT (wavenc, "pushing %u bytes raw audio, ts=%" GST_TIME_FORMAT, GST_BUFFER_SIZE (buf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); buf = gst_buffer_make_metadata_writable (buf); gst_buffer_set_caps (buf, GST_PAD_CAPS (wavenc->srcpad)); GST_BUFFER_OFFSET (buf) = WAV_HEADER_LEN + wavenc->length; GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE; wavenc->length += GST_BUFFER_SIZE (buf); flow = gst_pad_push (wavenc->srcpad, buf); return flow; } static GstStateChangeReturn gst_wavenc_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstWavEnc *wavenc = GST_WAVENC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: wavenc->format = 0; wavenc->channels = 0; wavenc->width = 0; wavenc->rate = 0; wavenc->length = 0; wavenc->sent_header = FALSE; /* its true because we haven't writen anything */ wavenc->finished_properly = TRUE; break; default: break; } ret = parent_class->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: if (!wavenc->finished_properly) { GST_ELEMENT_WARNING (wavenc, STREAM, MUX, ("Wav stream not finished properly"), ("Wav stream not finished properly, no EOS received " "before shutdown")); } break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "wavenc", GST_RANK_PRIMARY, GST_TYPE_WAVENC); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "wavenc", "Encode raw audio into WAV", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/wavenc/Makefile.in0000644000175000017500000006630511720560237016141 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/wavenc DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstwavenc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstwavenc_la_OBJECTS = libgstwavenc_la-gstwavenc.lo libgstwavenc_la_OBJECTS = $(am_libgstwavenc_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstwavenc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstwavenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstwavenc_la_CFLAGS) $(CFLAGS) \ $(libgstwavenc_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstwavenc_la_SOURCES) DIST_SOURCES = $(libgstwavenc_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstwavenc.la libgstwavenc_la_SOURCES = gstwavenc.c libgstwavenc_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_CFLAGS) libgstwavenc_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ $(GST_LIBS) libgstwavenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstwavenc_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstwavenc.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/wavenc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/wavenc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstwavenc.la: $(libgstwavenc_la_OBJECTS) $(libgstwavenc_la_DEPENDENCIES) $(EXTRA_libgstwavenc_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstwavenc_la_LINK) -rpath $(plugindir) $(libgstwavenc_la_OBJECTS) $(libgstwavenc_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstwavenc_la-gstwavenc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstwavenc_la-gstwavenc.lo: gstwavenc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavenc_la_CFLAGS) $(CFLAGS) -MT libgstwavenc_la-gstwavenc.lo -MD -MP -MF $(DEPDIR)/libgstwavenc_la-gstwavenc.Tpo -c -o libgstwavenc_la-gstwavenc.lo `test -f 'gstwavenc.c' || echo '$(srcdir)/'`gstwavenc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstwavenc_la-gstwavenc.Tpo $(DEPDIR)/libgstwavenc_la-gstwavenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstwavenc.c' object='libgstwavenc_la-gstwavenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstwavenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstwavenc_la_CFLAGS) $(CFLAGS) -c -o libgstwavenc_la-gstwavenc.lo `test -f 'gstwavenc.c' || echo '$(srcdir)/'`gstwavenc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstwavenc -:SHARED libgstwavenc \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstwavenc_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstwavenc_la_CFLAGS) \ -:LDFLAGS $(libgstwavenc_la_LDFLAGS) \ $(libgstwavenc_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/Makefile.in0000644000175000017500000006214511720560230014645 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # include this at the end of $MODULE/ext/Makefile.am to force make to # build subdirectories in parallel when make -jN is used. We will end up # descending into all subdirectories a second time, but only after the first # (parallel) run has finished, so it should go right through the second time. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/common/parallel-subdirs.mak subdir = gst ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = $(GST_PLUGINS_SELECTED) DIST_SUBDIRS = $(GST_PLUGINS_ALL) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/parallel-subdirs.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/common/parallel-subdirs.mak: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: independent-subdirs $(SUBDIRS) independent-subdirs: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ all-recursive: independent-subdirs # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/goom2k1/0000755000175000017500000000000011720565303014135 500000000000000gst-plugins-good-0.10.31/gst/goom2k1/goom_tools.h0000644000175000017500000000117511671175353016422 00000000000000#ifndef _GOOMTOOLS_H #define _GOOMTOOLS_H #define NB_RAND 0x10000 #define RAND_INIT(gd,i) \ srand (i); \ if (gd->rand_tab == NULL) \ gd->rand_tab = g_malloc (NB_RAND * sizeof(gint)) ;\ gd->rand_pos = 0; \ while (gd->rand_pos < NB_RAND) \ gd->rand_tab [gd->rand_pos++] = rand (); #define RAND(gd) \ (gd->rand_tab[gd->rand_pos = ((gd->rand_pos + 1) % NB_RAND)]) #define RAND_CLOSE(gd) \ g_free (gd->rand_tab); \ gd->rand_tab = NULL; /*#define iRAND(i) ((guint32)((float)i * RAND()/RAND_MAX)) */ #define iRAND(gd,i) (RAND(gd) % i) #endif gst-plugins-good-0.10.31/gst/goom2k1/filters.h0000644000175000017500000000344611671175353015714 00000000000000#ifndef FILTERS_H #define FILTERS_H #include #include "graphic.h" #include "goom_core.h" #define NORMAL_MODE 0 #define WAVE_MODE 1 #define CRYSTAL_BALL_MODE 2 #define SCRUNCH_MODE 3 #define AMULETTE_MODE 4 #define WATER_MODE 5 struct ZoomFilterData { int vitesse; unsigned char pertedec; unsigned char sqrtperte; int middleX; int middleY; char reverse; char mode; /** @since June 2001 */ int hPlaneEffect; int vPlaneEffect; char noisify; guint32 res_x; guint32 res_y; guint32 buffsize; guint32 *buffer; guint32 *pos10; guint32 *c[4]; int *firedec; int wave; int wavesp; }; void pointFilter(GoomData *goomdata, Color c, float t1, float t2, float t3, float t4, guint32 cycle); /* filtre de zoom : le contenu de pix1 est copie dans pix2, avec l'effet appliqu midx et midy represente le centre du zoom void zoomFilter(Uint *pix1, Uint *pix2, Uint middleX, Uint middleY); void zoomFilterRGB(Uint *pix1, Uint *pix2, Uint middleX, Uint middleY); */ ZoomFilterData *zoomFilterNew (void); void zoomFilterDestroy (ZoomFilterData *zf); void zoomFilterFastRGB (GoomData *goomdata, ZoomFilterData *zf, int zfd_update); /* filtre sin : le contenu de pix1 est copie dans pix2, avec l'effet appliqu cycle est la variable de temps. mode vaut SIN_MUL ou SIN_ADD rate est le pourcentage de l'effet appliqu lenght : la longueur d'onde (1..10) [5] speed : la vitesse (1..100) [10] */ /* void sinFilter(Uint *pix1,Uint *pix2, Uint cycle, Uint mode, Uint rate, char lenght, Uint speed); */ #define SIN_MUL 1 #define SIN_ADD 2 #endif gst-plugins-good-0.10.31/gst/goom2k1/goom_core.h0000644000175000017500000000223611671175353016211 00000000000000#ifndef _GOOMCORE_H #define _GOOMCORE_H #include typedef struct ZoomFilterData ZoomFilterData; typedef struct { /**-----------------------------------------------------** ** SHARED DATA ** **-----------------------------------------------------**/ guint32 *pixel; guint32 *back; guint32 *p1, *p2; guint32 cycle; guint32 resolx, resoly, buffsize; int lockvar; /* pour empecher de nouveaux changements */ int goomvar; /* boucle des gooms */ int totalgoom; /* nombre de gooms par seconds */ int agoom; /* un goom a eu lieu.. */ int loopvar; /* mouvement des points */ int speedvar; /* vitesse des particules */ int lineMode; /* l'effet lineaire a dessiner */ char goomlimit; /* sensibilité du goom */ ZoomFilterData *zfd; /* Random table */ gint *rand_tab; guint rand_pos; } GoomData; void goom_init (GoomData *goomdata, guint32 resx, guint32 resy); void goom_set_resolution (GoomData *goomdata, guint32 resx, guint32 resy); guint32 *goom_update (GoomData *goomdata, gint16 data [2][512]); void goom_close (GoomData *goomdata); #endif gst-plugins-good-0.10.31/gst/goom2k1/goom_core.c0000644000175000017500000002745611677341655016225 00000000000000#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "goom_core.h" #include "goom_tools.h" #include "filters.h" #include "lines.h" /*#define VERBOSE */ #ifdef VERBOSE #include #endif #define STOP_SPEED 128 void goom_init (GoomData * goomdata, guint32 resx, guint32 resy) { #ifdef VERBOSE printf ("GOOM: init (%d, %d);\n", resx, resy); #endif goomdata->resolx = 0; goomdata->resoly = 0; goomdata->buffsize = 0; goomdata->pixel = NULL; goomdata->back = NULL; goomdata->p1 = NULL; goomdata->p2 = NULL; goom_set_resolution (goomdata, resx, resy); RAND_INIT (goomdata, GPOINTER_TO_INT (goomdata->pixel)); goomdata->cycle = 0; goomdata->goomlimit = 2; /* sensibilit du goom */ goomdata->zfd = zoomFilterNew (); goomdata->lockvar = 0; /* pour empecher de nouveaux changements */ goomdata->goomvar = 0; /* boucle des gooms */ goomdata->totalgoom = 0; /* nombre de gooms par seconds */ goomdata->agoom = 0; /* un goom a eu lieu.. */ goomdata->loopvar = 0; /* mouvement des points */ goomdata->speedvar = 0; /* vitesse des particules */ goomdata->lineMode = 0; /* l'effet lineaire a dessiner */ } void goom_set_resolution (GoomData * goomdata, guint32 resx, guint32 resy) { guint32 buffsize = resx * resy; if ((goomdata->resolx == resx) && (goomdata->resoly == resy)) return; if (goomdata->buffsize < buffsize) { if (goomdata->pixel) free (goomdata->pixel); if (goomdata->back) free (goomdata->back); goomdata->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); goomdata->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); goomdata->buffsize = buffsize; goomdata->p1 = (void *) (((guintptr) goomdata->pixel + 0x7f) & (~0x7f)); goomdata->p2 = (void *) (((guintptr) goomdata->back + 0x7f) & (~0x7f)); } goomdata->resolx = resx; goomdata->resoly = resy; memset (goomdata->pixel, 0, buffsize * sizeof (guint32) + 128); memset (goomdata->back, 0, buffsize * sizeof (guint32) + 128); } guint32 * goom_update (GoomData * goomdata, gint16 data[2][512]) { guint32 *return_val; guint32 pointWidth; guint32 pointHeight; int incvar; /* volume du son */ int accelvar; /* acceleration des particules */ int i; float largfactor; /* elargissement de l'intervalle d'volution des points */ int zfd_update = 0; int resolx = goomdata->resolx; int resoly = goomdata->resoly; ZoomFilterData *pzfd = goomdata->zfd; guint32 *tmp; /* test if the config has changed, update it if so */ pointWidth = (resolx * 2) / 5; pointHeight = (resoly * 2) / 5; /* ! etude du signal ... */ incvar = 0; for (i = 0; i < 512; i++) { if (incvar < data[0][i]) incvar = data[0][i]; } accelvar = incvar / 5000; if (goomdata->speedvar > 5) { accelvar--; if (goomdata->speedvar > 20) accelvar--; if (goomdata->speedvar > 40) goomdata->speedvar = 40; } accelvar--; goomdata->speedvar += accelvar; if (goomdata->speedvar < 0) goomdata->speedvar = 0; if (goomdata->speedvar > 40) goomdata->speedvar = 40; /* ! calcul du deplacement des petits points ... */ largfactor = ((float) goomdata->speedvar / 40.0f + (float) incvar / 50000.0f) / 1.5f; if (largfactor > 1.5f) largfactor = 1.5f; for (i = 1; i * 15 <= goomdata->speedvar + 15; i++) { goomdata->loopvar += goomdata->speedvar + 1; pointFilter (goomdata, YELLOW, ((pointWidth - 6.0f) * largfactor + 5.0f), ((pointHeight - 6.0f) * largfactor + 5.0f), i * 152.0f, 128.0f, goomdata->loopvar + i * 2032); pointFilter (goomdata, ORANGE, ((pointWidth / 2) * largfactor) / i + 10.0f * i, ((pointHeight / 2) * largfactor) / i + 10.0f * i, 96.0f, i * 80.0f, goomdata->loopvar / i); pointFilter (goomdata, VIOLET, ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, i + 122.0f, 134.0f, goomdata->loopvar / i); pointFilter (goomdata, BLACK, ((pointHeight / 3) * largfactor + 20.0f), ((pointHeight / 3) * largfactor + 20.0f), 58.0f, i * 66.0f, goomdata->loopvar / i); pointFilter (goomdata, WHITE, (pointHeight * largfactor + 10.0f * i) / i, (pointHeight * largfactor + 10.0f * i) / i, 66.0f, 74.0f, goomdata->loopvar + i * 500); } /* diminuer de 1 le temps de lockage */ /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ /* changement d'etat du plugins juste apres un autre changement d'etat. oki ? */ if (--goomdata->lockvar < 0) goomdata->lockvar = 0; /* temps du goom */ if (--goomdata->agoom < 0) goomdata->agoom = 0; /* on verifie qu'il ne se pas un truc interressant avec le son. */ if ((accelvar > goomdata->goomlimit) || (accelvar < -goomdata->goomlimit)) { /* UN GOOM !!! YAHOO ! */ goomdata->totalgoom++; goomdata->agoom = 20; /* mais pdt 20 cycles, il n'y en aura plus. */ goomdata->lineMode = (goomdata->lineMode + 1) % 20; /* Tous les 10 gooms on change de mode lineaire */ /* changement eventuel de mode */ switch (iRAND (goomdata, 10)) { case 0: case 1: case 2: pzfd->mode = WAVE_MODE; pzfd->vitesse = STOP_SPEED - 1; pzfd->reverse = 0; break; case 3: case 4: pzfd->mode = CRYSTAL_BALL_MODE; break; case 5: pzfd->mode = AMULETTE_MODE; break; case 6: pzfd->mode = WATER_MODE; break; case 7: pzfd->mode = SCRUNCH_MODE; break; default: pzfd->mode = NORMAL_MODE; } } /* tout ceci ne sera fait qu'en cas de non-blocage */ if (goomdata->lockvar == 0) { /* reperage de goom (acceleration forte de l'acceleration du volume) */ /* -> coup de boost de la vitesse si besoin.. */ if ((accelvar > goomdata->goomlimit) || (accelvar < -goomdata->goomlimit)) { goomdata->goomvar++; /*if (goomvar % 1 == 0) */ { guint32 vtmp; guint32 newvit; newvit = STOP_SPEED - goomdata->speedvar / 2; /* retablir le zoom avant.. */ if ((pzfd->reverse) && (!(goomdata->cycle % 12)) && (rand () % 3 == 0)) { pzfd->reverse = 0; pzfd->vitesse = STOP_SPEED - 2; goomdata->lockvar = 50; } if (iRAND (goomdata, 10) == 0) { pzfd->reverse = 1; goomdata->lockvar = 100; } /* changement de milieu.. */ switch (iRAND (goomdata, 20)) { case 0: pzfd->middleY = resoly - 1; pzfd->middleX = resolx / 2; break; case 1: pzfd->middleX = resolx - 1; break; case 2: pzfd->middleX = 1; break; default: pzfd->middleY = resoly / 2; pzfd->middleX = resolx / 2; } if (pzfd->mode == WATER_MODE) { pzfd->middleX = resolx / 2; pzfd->middleY = resoly / 2; } switch (vtmp = (iRAND (goomdata, 27))) { case 0: pzfd->vPlaneEffect = iRAND (goomdata, 3); pzfd->vPlaneEffect -= iRAND (goomdata, 3); pzfd->hPlaneEffect = iRAND (goomdata, 3); pzfd->hPlaneEffect -= iRAND (goomdata, 3); break; case 3: pzfd->vPlaneEffect = 0; pzfd->hPlaneEffect = iRAND (goomdata, 8); pzfd->hPlaneEffect -= iRAND (goomdata, 8); break; case 4: case 5: case 6: case 7: pzfd->vPlaneEffect = iRAND (goomdata, 5); pzfd->vPlaneEffect -= iRAND (goomdata, 5); pzfd->hPlaneEffect = -pzfd->vPlaneEffect; break; case 8: pzfd->hPlaneEffect = 5 + iRAND (goomdata, 8); pzfd->vPlaneEffect = -pzfd->hPlaneEffect; break; case 9: pzfd->vPlaneEffect = 5 + iRAND (goomdata, 8); pzfd->hPlaneEffect = -pzfd->hPlaneEffect; break; case 13: pzfd->hPlaneEffect = 0; pzfd->vPlaneEffect = iRAND (goomdata, 10); pzfd->vPlaneEffect -= iRAND (goomdata, 10); break; default: if (vtmp < 10) { pzfd->vPlaneEffect = 0; pzfd->hPlaneEffect = 0; } } if (iRAND (goomdata, 3) != 0) pzfd->noisify = 0; else { pzfd->noisify = iRAND (goomdata, 3) + 2; goomdata->lockvar *= 3; } if (pzfd->mode == AMULETTE_MODE) { pzfd->vPlaneEffect = 0; pzfd->hPlaneEffect = 0; pzfd->noisify = 0; } if ((pzfd->middleX == 1) || (pzfd->middleX == resolx - 1)) { pzfd->vPlaneEffect = 0; pzfd->hPlaneEffect = iRAND (goomdata, 2) ? 0 : pzfd->hPlaneEffect; } if (newvit < pzfd->vitesse) { /* on accelere */ zfd_update = 1; if (((newvit < STOP_SPEED - 7) && (pzfd->vitesse < STOP_SPEED - 6) && (goomdata->cycle % 3 == 0)) || (iRAND (goomdata, 40) == 0)) { pzfd->vitesse = STOP_SPEED - 1; pzfd->reverse = !pzfd->reverse; } else { pzfd->vitesse = (newvit + pzfd->vitesse * 4) / 5; } goomdata->lockvar += 50; } } } /* mode mega-lent */ if (iRAND (goomdata, 1000) == 0) { /* printf ("coup du sort...\n") ; */ zfd_update = 1; pzfd->vitesse = STOP_SPEED - 1; pzfd->pertedec = 8; pzfd->sqrtperte = 16; goomdata->goomvar = 1; goomdata->lockvar += 70; } } /* gros frein si la musique est calme */ if ((goomdata->speedvar < 1) && (pzfd->vitesse < STOP_SPEED - 4) && (goomdata->cycle % 16 == 0)) { /* printf ("++slow part... %i\n", zfd.vitesse) ; */ zfd_update = 1; pzfd->vitesse += 3; pzfd->pertedec = 8; pzfd->sqrtperte = 16; goomdata->goomvar = 0; /* printf ("--slow part... %i\n", zfd.vitesse) ; */ } /* baisser regulierement la vitesse... */ if ((goomdata->cycle % 73 == 0) && (pzfd->vitesse < STOP_SPEED - 5)) { /* printf ("slow down...\n") ; */ zfd_update = 1; pzfd->vitesse++; } /* arreter de decrmenter au bout d'un certain temps */ if ((goomdata->cycle % 101 == 0) && (pzfd->pertedec == 7)) { zfd_update = 1; pzfd->pertedec = 8; pzfd->sqrtperte = 16; } /* Zoom here ! */ zoomFilterFastRGB (goomdata, pzfd, zfd_update); /* si on est dans un goom : afficher les lignes... */ if (goomdata->agoom > 15) goom_lines (goomdata, data, ((pzfd->middleX == resolx / 2) && (pzfd->middleY == resoly / 2) && (pzfd->mode != WATER_MODE)) ? (goomdata->lineMode / 10) : 0, goomdata->p2, goomdata->agoom - 15); return_val = goomdata->p2; tmp = goomdata->p1; goomdata->p1 = goomdata->p2; goomdata->p2 = tmp; /* affichage et swappage des buffers.. */ goomdata->cycle++; /* tous les 100 cycles : vrifier si le taux de goom est correct */ /* et le modifier sinon.. */ if (!(goomdata->cycle % 100)) { if (goomdata->totalgoom > 15) { /* printf ("less gooms\n") ; */ goomdata->goomlimit++; } else { if ((goomdata->totalgoom == 0) && (goomdata->goomlimit > 1)) goomdata->goomlimit--; } goomdata->totalgoom = 0; } return return_val; } void goom_close (GoomData * goomdata) { if (goomdata->pixel != NULL) free (goomdata->pixel); if (goomdata->back != NULL) free (goomdata->back); if (goomdata->zfd != NULL) { zoomFilterDestroy (goomdata->zfd); goomdata->zfd = NULL; } goomdata->pixel = goomdata->back = NULL; RAND_CLOSE (goomdata); } gst-plugins-good-0.10.31/gst/goom2k1/filters.c0000644000175000017500000003520211671175353015702 00000000000000/* filter.c version 0.7 * contient les filtres applicable a un buffer * creation : 01/10/2000 * -ajout de sinFilter() * -ajout de zoomFilter() * -copie de zoomFilter() en zoomFilterRGB(), grant les 3 couleurs * -optimisation de sinFilter (utilisant une table de sin) * -asm * -optimisation de la procedure de gnration du buffer de transformation * la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] */ /*#define _DEBUG_PIXEL; */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "filters.h" #include "graphic.h" #include "goom_tools.h" #include "goom_core.h" #include #include #include #ifdef MMX #define USE_ASM #endif #ifdef POWERPC #define USE_ASM #endif #ifdef USE_ASM #define EFFECT_DISTORS 4 #else #define EFFECT_DISTORS 10 #endif #ifdef USE_ASM #ifdef MMX int mmx_zoom (); guint32 mmx_zoom_size; #endif /* MMX */ #ifdef POWERPC extern unsigned int useAltivec; extern void ppc_zoom (void); extern void ppc_zoom_altivec (void); unsigned int ppcsize4; #endif /* PowerPC */ unsigned int *coeffs = 0, *freecoeffs = 0; guint32 *expix1 = 0; /* pointeur exporte vers p1 */ guint32 *expix2 = 0; /* pointeur exporte vers p2 */ guint32 zoom_width; #endif /* ASM */ static int firstTime = 1; static int sintable[0xffff]; ZoomFilterData * zoomFilterNew (void) { ZoomFilterData *zf = malloc (sizeof (ZoomFilterData)); zf->vitesse = 128; zf->pertedec = 8; zf->sqrtperte = 16; zf->middleX = 1; zf->middleY = 1; zf->reverse = 0; zf->mode = WAVE_MODE; zf->hPlaneEffect = 0; zf->vPlaneEffect = 0; zf->noisify = 0; zf->buffsize = 0; zf->res_x = 0; zf->res_y = 0; zf->buffer = NULL; zf->firedec = NULL; zf->wave = 0; zf->wavesp = 0; return zf; } /* retourne x>>s , en testant le signe de x */ static inline int ShiftRight (int x, const unsigned char s) { if (x < 0) return -(-x >> s); else return x >> s; } /* calculer px et py en fonction de x,y,middleX,middleY et theMode px et py indique la nouvelle position (en sqrtperte ieme de pixel) (valeur * 16) */ static void calculatePXandPY (GoomData * gd, int x, int y, int *px, int *py) { ZoomFilterData *zf = gd->zfd; int middleX, middleY; guint32 resoly = zf->res_y; int vPlaneEffect = zf->vPlaneEffect; int hPlaneEffect = zf->hPlaneEffect; int vitesse = zf->vitesse; char theMode = zf->mode; if (theMode == WATER_MODE) { int wavesp = zf->wavesp; int wave = zf->wave; int yy = y + RAND (gd) % 4 + wave / 10; yy -= RAND (gd) % 4; if (yy < 0) yy = 0; if (yy >= resoly) yy = resoly - 1; *px = (x << 4) + zf->firedec[yy] + (wave / 10); *py = (y << 4) + 132 - ((vitesse < 132) ? vitesse : 131); wavesp += RAND (gd) % 3; wavesp -= RAND (gd) % 3; if (wave < -10) wavesp += 2; if (wave > 10) wavesp -= 2; wave += (wavesp / 10) + RAND (gd) % 3; wave -= RAND (gd) % 3; if (wavesp > 100) wavesp = (wavesp * 9) / 10; zf->wavesp = wavesp; zf->wave = wave; } else { int dist; register int vx, vy; int fvitesse = vitesse << 4; middleX = zf->middleX; middleY = zf->middleY; if (zf->noisify) { x += RAND (gd) % zf->noisify; x -= RAND (gd) % zf->noisify; y += RAND (gd) % zf->noisify; y -= RAND (gd) % zf->noisify; } if (hPlaneEffect) vx = ((x - middleX) << 9) + hPlaneEffect * (y - middleY); else vx = (x - middleX) << 9; if (vPlaneEffect) vy = ((y - middleY) << 9) + vPlaneEffect * (x - middleX); else vy = (y - middleY) << 9; switch (theMode) { case WAVE_MODE: dist = ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, 9) * ShiftRight (vy, 9); fvitesse *= 1024 + ShiftRight (sintable[(unsigned short) (0xffff * dist * EFFECT_DISTORS)], 6); fvitesse /= 1024; break; case CRYSTAL_BALL_MODE: dist = ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, 9) * ShiftRight (vy, 9); fvitesse += (dist * EFFECT_DISTORS >> 10); break; case AMULETTE_MODE: dist = ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, 9) * ShiftRight (vy, 9); fvitesse -= (dist * EFFECT_DISTORS >> 4); break; case SCRUNCH_MODE: dist = ShiftRight (vx, 9) * ShiftRight (vx, 9) + ShiftRight (vy, 9) * ShiftRight (vy, 9); fvitesse -= (dist * EFFECT_DISTORS >> 9); break; } if (vx < 0) *px = (middleX << 4) - (-(vx * fvitesse) >> 16); else *px = (middleX << 4) + ((vx * fvitesse) >> 16); if (vy < 0) *py = (middleY << 4) - (-(vy * fvitesse) >> 16); else *py = (middleY << 4) + ((vy * fvitesse) >> 16); } } /*#define _DEBUG */ static inline void setPixelRGB (Uint * buffer, Uint x, Uint y, Color c, guint32 resolx, guint32 resoly) { /* buffer[ y*WIDTH + x ] = (c.r<<16)|(c.v<<8)|c.b */ #ifdef _DEBUG_PIXEL if (x + y * resolx >= resolx * resoly) { fprintf (stderr, "setPixel ERROR : hors du tableau... %i, %i\n", x, y); /*exit (1) ; */ } #endif #ifdef USE_DGA buffer[y * resolx + x] = (c.b << 16) | (c.v << 8) | c.r; #else buffer[y * resolx + x] = (c.r << 16) | (c.v << 8) | c.b; #endif } static inline void setPixelRGB_ (Uint * buffer, Uint x, Color c, guint32 resolx, guint32 resoly) { #ifdef _DEBUG if (x >= resolx * resoly) { printf ("setPixel ERROR : hors du tableau... %i >= %i*%i (%i)\n", x, resolx, resoly, resolx * resoly); exit (1); } #endif #ifdef USE_DGA buffer[x] = (c.b << 16) | (c.v << 8) | c.r; #else buffer[x] = (c.r << 16) | (c.v << 8) | c.b; #endif } static inline void getPixelRGB (Uint * buffer, Uint x, Uint y, Color * c, guint32 resolx, guint32 resoly) { register unsigned char *tmp8; #ifdef _DEBUG if (x + y * resolx >= resolx * resoly) { printf ("getPixel ERROR : hors du tableau... %i, %i\n", x, y); exit (1); } #endif #ifdef __BIG_ENDIAN__ c->b = *(unsigned char *) (tmp8 = (unsigned char *) (buffer + (x + y * resolx))); c->r = *(unsigned char *) (++tmp8); c->v = *(unsigned char *) (++tmp8); c->b = *(unsigned char *) (++tmp8); #else /* ATTENTION AU PETIT INDIEN */ c->b = *(unsigned char *) (tmp8 = (unsigned char *) (buffer + (x + y * resolx))); c->v = *(unsigned char *) (++tmp8); c->r = *(unsigned char *) (++tmp8); /* *c = (Color) buffer[x+y*WIDTH] ; */ #endif } static inline void getPixelRGB_ (Uint * buffer, Uint x, Color * c, guint32 resolx, guint32 resoly) { register unsigned char *tmp8; #ifdef _DEBUG if (x >= resolx * resoly) { printf ("getPixel ERROR : hors du tableau... %i\n", x); exit (1); } #endif #ifdef __BIG_ENDIAN__ c->b = *(unsigned char *) (tmp8 = (unsigned char *) (buffer + x)); c->r = *(unsigned char *) (++tmp8); c->v = *(unsigned char *) (++tmp8); c->b = *(unsigned char *) (++tmp8); #else /* ATTENTION AU PETIT INDIEN */ tmp8 = (unsigned char *) (buffer + x); c->b = *(unsigned char *) (tmp8++); c->v = *(unsigned char *) (tmp8++); c->r = *(unsigned char *) (tmp8); /* *c = (Color) buffer[x+y*WIDTH] ; */ #endif } static void zoomFilterSetResolution (GoomData * gd, ZoomFilterData * zf) { unsigned short us; if (zf->buffsize >= gd->buffsize) { zf->res_x = gd->resolx; zf->res_y = gd->resoly; zf->middleX = gd->resolx / 2; zf->middleY = gd->resoly - 1; return; } #ifndef USE_ASM if (zf->buffer) free (zf->buffer); zf->buffer = 0; #else if (coeffs) free (freecoeffs); coeffs = 0; #endif zf->middleX = gd->resolx / 2; zf->middleY = gd->resoly - 1; zf->res_x = gd->resolx; zf->res_y = gd->resoly; if (zf->firedec) free (zf->firedec); zf->firedec = 0; zf->buffsize = gd->resolx * gd->resoly * sizeof (unsigned int); #ifdef USE_ASM freecoeffs = (unsigned int *) malloc (resx * resy * 2 * sizeof (unsigned int) + 128); coeffs = (guint32 *) ((1 + ((unsigned int) (freecoeffs)) / 128) * 128); #else zf->buffer = calloc (sizeof (guint32), zf->buffsize * 5); zf->pos10 = zf->buffer; zf->c[0] = zf->pos10 + zf->buffsize; zf->c[1] = zf->c[0] + zf->buffsize; zf->c[2] = zf->c[1] + zf->buffsize; zf->c[3] = zf->c[2] + zf->buffsize; #endif zf->firedec = (int *) malloc (zf->res_y * sizeof (int)); if (firstTime) { firstTime = 0; /* generation d'une table de sinus */ for (us = 0; us < 0xffff; us++) { sintable[us] = (int) (1024.0f * sin (us * 2 * 3.31415f / 0xffff)); } } { int loopv; for (loopv = zf->res_y; loopv != 0;) { int decc = 0; int spdc = 0; int accel = 0; loopv--; zf->firedec[loopv] = decc; decc += spdc / 10; spdc += RAND (gd) % 3; spdc -= RAND (gd) % 3; if (decc > 4) spdc -= 1; if (decc < -4) spdc += 1; if (spdc > 30) spdc = spdc - RAND (gd) % 3 + accel / 10; if (spdc < -30) spdc = spdc + RAND (gd) % 3 + accel / 10; if (decc > 8 && spdc > 1) spdc -= RAND (gd) % 3 - 2; if (decc < -8 && spdc < -1) spdc += RAND (gd) % 3 + 2; if (decc > 8 || decc < -8) decc = decc * 8 / 9; accel += RAND (gd) % 2; accel -= RAND (gd) % 2; if (accel > 20) accel -= 2; if (accel < -20) accel += 2; } } } void zoomFilterDestroy (ZoomFilterData * zf) { if (zf) { if (zf->firedec) free (zf->firedec); if (zf->buffer) free (zf->buffer); free (zf); } } /*===============================================================*/ void zoomFilterFastRGB (GoomData * goomdata, ZoomFilterData * zf, int zfd_update) { guint32 prevX = goomdata->resolx; guint32 prevY = goomdata->resoly; guint32 *pix1 = goomdata->p1; guint32 *pix2 = goomdata->p2; unsigned int *pos10; unsigned int **c; Uint x, y; /* static unsigned int prevX = 0, prevY = 0; */ #ifdef USE_ASM expix1 = pix1; expix2 = pix2; #else Color couleur; Color col1, col2, col3, col4; Uint position; #endif if ((goomdata->resolx != zf->res_x) || (goomdata->resoly != zf->res_y)) { zoomFilterSetResolution (goomdata, zf); } pos10 = zf->pos10; c = zf->c; if (zfd_update) { guchar sqrtperte = zf->sqrtperte; gint start_y = 0; if (zf->reverse) zf->vitesse = 256 - zf->vitesse; /* generation du buffer */ for (y = 0; y < zf->res_y; y++) { gint y_16 = y << 4; gint max_px = (prevX - 1) * sqrtperte; gint max_py = (prevY - 1) * sqrtperte; for (x = 0; x < zf->res_x; x++) { gint px, py; guchar coefv, coefh; /* calculer px et py en fonction de */ /* x,y,middleX,middleY et theMode */ calculatePXandPY (goomdata, x, y, &px, &py); if ((px == x << 4) && (py == y_16)) py += 8; if ((py < 0) || (px < 0) || (py >= max_py) || (px >= max_px)) { #ifdef USE_ASM coeffs[(y * prevX + x) * 2] = 0; coeffs[(y * prevX + x) * 2 + 1] = 0; #else pos10[start_y + x] = 0; c[0][start_y + x] = 0; c[1][start_y + x] = 0; c[2][start_y + x] = 0; c[3][start_y + x] = 0; #endif } else { int npx10; int npy10; int pos; npx10 = (px / sqrtperte); npy10 = (py / sqrtperte); /* if (npx10 >= prevX) fprintf(stderr,"error npx:%d",npx10); if (npy10 >= prevY) fprintf(stderr,"error npy:%d",npy10); */ coefh = px % sqrtperte; coefv = py % sqrtperte; #ifdef USE_ASM pos = (y * prevX + x) * 2; coeffs[pos] = (npx10 + prevX * npy10) * 4; if (!(coefh || coefv)) coeffs[pos + 1] = (sqrtperte * sqrtperte - 1); else coeffs[pos + 1] = ((sqrtperte - coefh) * (sqrtperte - coefv)); coeffs[pos + 1] |= (coefh * (sqrtperte - coefv)) << 8; coeffs[pos + 1] |= ((sqrtperte - coefh) * coefv) << 16; coeffs[pos + 1] |= (coefh * coefv) << 24; #else pos = start_y + x; pos10[pos] = npx10 + prevX * npy10; if (!(coefh || coefv)) c[0][pos] = sqrtperte * sqrtperte - 1; else c[0][pos] = (sqrtperte - coefh) * (sqrtperte - coefv); c[1][pos] = coefh * (sqrtperte - coefv); c[2][pos] = (sqrtperte - coefh) * coefv; c[3][pos] = coefh * coefv; #endif } } /* Advance start of line index */ start_y += prevX; } } #ifdef USE_ASM #ifdef MMX zoom_width = prevX; mmx_zoom_size = prevX * prevY; mmx_zoom (); #endif #ifdef POWERPC zoom_width = prevX; if (useAltivec) { ppcsize4 = ((unsigned int) (prevX * prevY)) / 4; ppc_zoom_altivec (); } else { ppcsize4 = ((unsigned int) (prevX * prevY)); ppc_zoom (); } #endif #else for (position = 0; position < prevX * prevY; position++) { getPixelRGB_ (pix1, pos10[position], &col1, goomdata->resolx, goomdata->resoly); getPixelRGB_ (pix1, pos10[position] + 1, &col2, goomdata->resolx, goomdata->resoly); getPixelRGB_ (pix1, pos10[position] + prevX, &col3, goomdata->resolx, goomdata->resoly); getPixelRGB_ (pix1, pos10[position] + prevX + 1, &col4, goomdata->resolx, goomdata->resoly); couleur.r = col1.r * c[0][position] + col2.r * c[1][position] + col3.r * c[2][position] + col4.r * c[3][position]; couleur.r >>= zf->pertedec; couleur.v = col1.v * c[0][position] + col2.v * c[1][position] + col3.v * c[2][position] + col4.v * c[3][position]; couleur.v >>= zf->pertedec; couleur.b = col1.b * c[0][position] + col2.b * c[1][position] + col3.b * c[2][position] + col4.b * c[3][position]; couleur.b >>= zf->pertedec; setPixelRGB_ (pix2, position, couleur, goomdata->resolx, goomdata->resoly); } #endif } void pointFilter (GoomData * goomdata, Color c, float t1, float t2, float t3, float t4, Uint cycle) { Uint *pix1 = goomdata->p1; ZoomFilterData *zf = goomdata->zfd; Uint x = (Uint) (zf->middleX + (int) (t1 * cos ((float) cycle / t3))); Uint y = (Uint) (zf->middleY + (int) (t2 * sin ((float) cycle / t4))); if ((x > 1) && (y > 1) && (x < goomdata->resolx - 2) && (y < goomdata->resoly - 2)) { setPixelRGB (pix1, x + 1, y, c, goomdata->resolx, goomdata->resoly); setPixelRGB (pix1, x, y + 1, c, goomdata->resolx, goomdata->resoly); setPixelRGB (pix1, x + 1, y + 1, WHITE, goomdata->resolx, goomdata->resoly); setPixelRGB (pix1, x + 2, y + 1, c, goomdata->resolx, goomdata->resoly); setPixelRGB (pix1, x + 1, y + 2, c, goomdata->resolx, goomdata->resoly); } } gst-plugins-good-0.10.31/gst/goom2k1/Makefile.am0000644000175000017500000000210111671175353016112 00000000000000plugin_LTLIBRARIES = libgstgoom2k1.la GOOM_FILTER_FILES = filters.c GOOM_FILTER_CFLAGS = -UMMX -UUSE_ASM noinst_HEADERS = gstgoom.h filters.h goom_core.h goom_tools.h graphic.h lines.h libgstgoom2k1_la_SOURCES = gstgoom.c goom_core.c $(GOOM_FILTER_FILES) graphic.c lines.c libgstgoom2k1_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) libgstgoom2k1_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstgoom2k1_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgoom2k1_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = filters.c Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstgoom2k1 -:SHARED libgstgoom2k1 \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstgoom2k1_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom2k1_la_CFLAGS) \ -:LDFLAGS $(libgstgoom2k1_la_LDFLAGS) \ $(libgstgoom2k1_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/goom2k1/lines.c0000644000175000017500000000543411671175353015350 00000000000000/* * lines.c * iTunesXPlugIn * * Created by guillaum on Tue Aug 14 2001. * Copyright (c) 2001 __CompanyName__. All rights reserved. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "lines.h" #include static inline unsigned char lighten (unsigned char value, unsigned char power) { unsigned char i; for (i = 0; i < power; i++) value += (255 - value) / 5; return value; } void goom_lines (GoomData * goomdata, gint16 data[2][512], unsigned int ID, unsigned int *p, guint32 power) { guint32 color1; guint32 color2; guint32 resolx = goomdata->resolx; guint32 resoly = goomdata->resoly; unsigned char *color = 1 + (unsigned char *) &color1; switch (ID) { case 0: /* Horizontal stereo lines */ { color1 = 0x0000AA00; color2 = 0x00AA0000; break; } case 1: /* Stereo circles */ { color1 = 0x00AA33DD; color2 = 0x00AA33DD; break; } } *color = lighten (*color, power); color++; *color = lighten (*color, power); color++; *color = lighten (*color, power); color = 1 + (unsigned char *) &color2; *color = lighten (*color, power); color++; *color = lighten (*color, power); color++; *color = lighten (*color, power); switch (ID) { case 0: /* Horizontal stereo lines */ { unsigned int i; for (i = 0; i < 512; i++) { guint32 plot; plot = i * resolx / 512 + (resoly / 4 + data[0][i] / 1600) * resolx; p[plot] = color1; p[plot + 1] = color1; plot = i * resolx / 512 + (resoly * 3 / 4 - data[1][i] / 1600) * resolx; p[plot] = color2; p[plot + 1] = color2; } break; } case 1: /* Stereo circles */ { float z; unsigned int monX = resolx / 2; float monY = resoly / 4; float monY2 = resoly / 2; for (z = 0; z < 6.2832f; z += 1.0f / monY) { /* float offset1 = 128+data[1][(unsigned int)(z*81.33f)])/200000; */ p[monX + (unsigned int) ((monY + ((float) resoly) * (128 + data[1][(unsigned int) (z * 81.33f)]) / 200000) * cos (z) + resolx * (unsigned int) (monY2 + (monY + ((float) resoly) * (128 + data[1][(unsigned int) (z * 81.33f)]) / 400000) * sin (z)))] = color1; p[monX + (unsigned int) ((monY - ((float) resoly) * (128 + data[0][(unsigned int) (z * 81.33f)]) / 200000) * cos (z) + resolx * (unsigned int) (monY2 + (monY - ((float) resoly) * (128 + data[0][(unsigned int) (z * 81.33f)]) / 400000) * sin (z)))] = color2; } break; } } } gst-plugins-good-0.10.31/gst/goom2k1/lines.h0000644000175000017500000000045511671175353015353 00000000000000/* * lines.h * iGoom * * Created by guillaum on Tue Aug 14 2001. * Copyright (c) 2001 ios. All rights reserved. * */ #include #include "graphic.h" #include "goom_core.h" void goom_lines(GoomData *goomdata, gint16 data [2][512], unsigned int ID,unsigned int* p, guint32 power); gst-plugins-good-0.10.31/gst/goom2k1/README0000644000175000017500000000032411671175353014743 00000000000000The Goom plugin is based on the Goom visualization code from the Goom homepage found at: http://ios.free.fr/?page=projet&quoi=1 Like the original library so is the Goom plugin available under the LGPL license gst-plugins-good-0.10.31/gst/goom2k1/gstgoom.h0000644000175000017500000000426411671175353015722 00000000000000/* gstgoom.c: implementation of goom drawing element * Copyright (C) <2001> Richard Boulton * * 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_GOOM_H__ #define __GST_GOOM_H__ G_BEGIN_DECLS #include #include #include "goom_core.h" #define GOOM_SAMPLES 512 #define GST_TYPE_GOOM (gst_goom_get_type()) #define GST_GOOM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GOOM,GstGoom)) #define GST_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GOOM,GstGoomClass)) #define GST_IS_GOOM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GOOM)) #define GST_IS_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GOOM)) typedef struct _GstGoom GstGoom; typedef struct _GstGoomClass GstGoomClass; struct _GstGoom { GstElement element; /* pads */ GstPad *sinkpad, *srcpad; GstAdapter *adapter; /* input tracking */ gint rate; gint channels; guint bps; /* video state */ gint fps_n; gint fps_d; gint width; gint height; GstClockTime duration; guint outsize; /* samples per frame */ guint spf; /* bytes per frame */ guint bpf; /* goom stuff */ gint16 datain[2][GOOM_SAMPLES]; GoomData goomdata; /* segment state */ GstSegment segment; /* QoS stuff *//* with LOCK */ gdouble proportion; GstClockTime earliest_time; }; struct _GstGoomClass { GstElementClass parent_class; }; GType gst_goom_get_type (void); G_END_DECLS #endif /* __GST_GOOM_H__ */ gst-plugins-good-0.10.31/gst/goom2k1/Makefile.in0000644000175000017500000010044311720560232016120 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/goom2k1 DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstgoom2k1_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_1 = libgstgoom2k1_la-filters.lo am_libgstgoom2k1_la_OBJECTS = libgstgoom2k1_la-gstgoom.lo \ libgstgoom2k1_la-goom_core.lo $(am__objects_1) \ libgstgoom2k1_la-graphic.lo libgstgoom2k1_la-lines.lo libgstgoom2k1_la_OBJECTS = $(am_libgstgoom2k1_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstgoom2k1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) \ $(libgstgoom2k1_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstgoom2k1_la_SOURCES) DIST_SOURCES = $(libgstgoom2k1_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstgoom2k1.la GOOM_FILTER_FILES = filters.c GOOM_FILTER_CFLAGS = -UMMX -UUSE_ASM noinst_HEADERS = gstgoom.h filters.h goom_core.h goom_tools.h graphic.h lines.h libgstgoom2k1_la_SOURCES = gstgoom.c goom_core.c $(GOOM_FILTER_FILES) graphic.c lines.c libgstgoom2k1_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) libgstgoom2k1_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstgoom2k1_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgoom2k1_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = filters.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/goom2k1/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/goom2k1/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstgoom2k1.la: $(libgstgoom2k1_la_OBJECTS) $(libgstgoom2k1_la_DEPENDENCIES) $(EXTRA_libgstgoom2k1_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstgoom2k1_la_LINK) -rpath $(plugindir) $(libgstgoom2k1_la_OBJECTS) $(libgstgoom2k1_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-goom_core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-graphic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-gstgoom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom2k1_la-lines.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstgoom2k1_la-gstgoom.lo: gstgoom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-gstgoom.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-gstgoom.Tpo -c -o libgstgoom2k1_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-gstgoom.Tpo $(DEPDIR)/libgstgoom2k1_la-gstgoom.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgoom.c' object='libgstgoom2k1_la-gstgoom.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c libgstgoom2k1_la-goom_core.lo: goom_core.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-goom_core.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-goom_core.Tpo -c -o libgstgoom2k1_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-goom_core.Tpo $(DEPDIR)/libgstgoom2k1_la-goom_core.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goom_core.c' object='libgstgoom2k1_la-goom_core.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c libgstgoom2k1_la-filters.lo: filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-filters.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-filters.Tpo -c -o libgstgoom2k1_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-filters.Tpo $(DEPDIR)/libgstgoom2k1_la-filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='libgstgoom2k1_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c libgstgoom2k1_la-graphic.lo: graphic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-graphic.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-graphic.Tpo -c -o libgstgoom2k1_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-graphic.Tpo $(DEPDIR)/libgstgoom2k1_la-graphic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='graphic.c' object='libgstgoom2k1_la-graphic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c libgstgoom2k1_la-lines.lo: lines.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -MT libgstgoom2k1_la-lines.lo -MD -MP -MF $(DEPDIR)/libgstgoom2k1_la-lines.Tpo -c -o libgstgoom2k1_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom2k1_la-lines.Tpo $(DEPDIR)/libgstgoom2k1_la-lines.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lines.c' object='libgstgoom2k1_la-lines.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom2k1_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom2k1_la_CFLAGS) $(CFLAGS) -c -o libgstgoom2k1_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstgoom2k1 -:SHARED libgstgoom2k1 \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstgoom2k1_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom2k1_la_CFLAGS) \ -:LDFLAGS $(libgstgoom2k1_la_LDFLAGS) \ $(libgstgoom2k1_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/goom2k1/graphic.h0000644000175000017500000000063211671175353015653 00000000000000#ifndef GRAPHIC_H #define GRAPHIC_H #include /* defines inline for better portability */ typedef unsigned int Uint; typedef struct { unsigned short r,v,b; } Color; extern const Color BLACK; extern const Color WHITE; extern const Color RED; extern const Color BLUE; extern const Color GREEN; extern const Color YELLOW; extern const Color ORANGE; extern const Color VIOLET; #endif /*GRAPHIC_H*/ gst-plugins-good-0.10.31/gst/goom2k1/gstgoom.c0000644000175000017500000004401511677341655015721 00000000000000/* gstgoom.c: implementation of goom drawing element * Copyright (C) <2001> Richard Boulton * (C) <2006> Wim Taymans * * 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-goom2k1 * @see_also: goom, synaesthesia * * Goom2k1 is an audio visualisation element. It creates warping structures * based on the incomming audio signal. Goom2k1 is the older version of the * visualisation. Also available is goom2k4, with a different look. * * * Example launch line * |[ * gst-launch -v audiotestsrc ! goom2k1 ! ffmpegcolorspace ! xvimagesink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstgoom.h" #include #include "goom_core.h" GST_DEBUG_CATEGORY_STATIC (goom_debug); #define GST_CAT_DEFAULT goom_debug #define DEFAULT_WIDTH 320 #define DEFAULT_HEIGHT 240 #define DEFAULT_FPS_N 25 #define DEFAULT_FPS_D 1 /* signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 /* FILL ME */ }; static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", /* the name of the pads */ GST_PAD_SINK, /* type of the pad */ GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */ GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 8000, 96000 ], " "channels = (int) { 1, 2 }") ); static void gst_goom_class_init (GstGoomClass * klass); static void gst_goom_base_init (GstGoomClass * klass); static void gst_goom_init (GstGoom * goom); static void gst_goom_finalize (GObject * object); static GstStateChangeReturn gst_goom_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_goom_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_goom_src_event (GstPad * pad, GstEvent * event); static gboolean gst_goom_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_goom_src_query (GstPad * pad, GstQuery * query); static gboolean gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_goom_src_setcaps (GstPad * pad, GstCaps * caps); static GstElementClass *parent_class = NULL; GType gst_goom_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo info = { sizeof (GstGoomClass), (GBaseInitFunc) gst_goom_base_init, NULL, (GClassInitFunc) gst_goom_class_init, NULL, NULL, sizeof (GstGoom), 0, (GInstanceInitFunc) gst_goom_init, }; type = g_type_register_static (GST_TYPE_ELEMENT, "GstGoom2k1", &info, 0); } return type; } static void gst_goom_base_init (GstGoomClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (element_class, "GOOM: what a GOOM! 2k1 edition", "Visualization", "Takes frames of data and outputs video frames using the GOOM 2k1 filter", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); } static void gst_goom_class_init (GstGoomClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_goom_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_goom_change_state); GST_DEBUG_CATEGORY_INIT (goom_debug, "goom", 0, "goom visualisation element"); } static void gst_goom_init (GstGoom * goom) { /* create the sink and src pads */ goom->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_chain_function (goom->sinkpad, GST_DEBUG_FUNCPTR (gst_goom_chain)); gst_pad_set_event_function (goom->sinkpad, GST_DEBUG_FUNCPTR (gst_goom_sink_event)); gst_pad_set_setcaps_function (goom->sinkpad, GST_DEBUG_FUNCPTR (gst_goom_sink_setcaps)); gst_element_add_pad (GST_ELEMENT (goom), goom->sinkpad); goom->srcpad = gst_pad_new_from_static_template (&src_template, "src"); gst_pad_set_setcaps_function (goom->srcpad, GST_DEBUG_FUNCPTR (gst_goom_src_setcaps)); gst_pad_set_event_function (goom->srcpad, GST_DEBUG_FUNCPTR (gst_goom_src_event)); gst_pad_set_query_function (goom->srcpad, GST_DEBUG_FUNCPTR (gst_goom_src_query)); gst_element_add_pad (GST_ELEMENT (goom), goom->srcpad); goom->adapter = gst_adapter_new (); goom->width = DEFAULT_WIDTH; goom->height = DEFAULT_HEIGHT; goom->fps_n = DEFAULT_FPS_N; /* desired frame rate */ goom->fps_d = DEFAULT_FPS_D; /* desired frame rate */ goom->channels = 0; goom->rate = 0; goom->duration = 0; goom_init (&(goom->goomdata), goom->width, goom->height); } static void gst_goom_finalize (GObject * object) { GstGoom *goom = GST_GOOM (object); goom_close (&(goom->goomdata)); g_object_unref (goom->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_goom_reset (GstGoom * goom) { gst_adapter_clear (goom->adapter); gst_segment_init (&goom->segment, GST_FORMAT_UNDEFINED); GST_OBJECT_LOCK (goom); goom->proportion = 1.0; goom->earliest_time = -1; GST_OBJECT_UNLOCK (goom); } static gboolean gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps) { GstGoom *goom; GstStructure *structure; gboolean res; goom = GST_GOOM (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); res = gst_structure_get_int (structure, "channels", &goom->channels); res &= gst_structure_get_int (structure, "rate", &goom->rate); goom->bps = goom->channels * sizeof (gint16); return res; } static gboolean gst_goom_src_setcaps (GstPad * pad, GstCaps * caps) { GstGoom *goom; GstStructure *structure; goom = GST_GOOM (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "width", &goom->width) || !gst_structure_get_int (structure, "height", &goom->height) || !gst_structure_get_fraction (structure, "framerate", &goom->fps_n, &goom->fps_d)) return FALSE; goom_set_resolution (&(goom->goomdata), goom->width, goom->height); /* size of the output buffer in bytes, depth is always 4 bytes */ goom->outsize = goom->width * goom->height * 4; goom->duration = gst_util_uint64_scale_int (GST_SECOND, goom->fps_d, goom->fps_n); goom->spf = gst_util_uint64_scale_int (goom->rate, goom->fps_d, goom->fps_n); goom->bpf = goom->spf * goom->bps; GST_DEBUG_OBJECT (goom, "dimension %dx%d, framerate %d/%d, spf %d", goom->width, goom->height, goom->fps_n, goom->fps_d, goom->spf); return TRUE; } static gboolean gst_goom_src_negotiate (GstGoom * goom) { GstCaps *othercaps, *target; GstStructure *structure; const GstCaps *templ; templ = gst_pad_get_pad_template_caps (goom->srcpad); GST_DEBUG_OBJECT (goom, "performing negotiation"); /* see what the peer can do */ othercaps = gst_pad_peer_get_caps (goom->srcpad); if (othercaps) { target = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); if (gst_caps_is_empty (target)) goto no_format; gst_caps_truncate (target); } else { target = gst_caps_ref ((GstCaps *) templ); } structure = gst_caps_get_structure (target, 0); gst_structure_fixate_field_nearest_int (structure, "width", DEFAULT_WIDTH); gst_structure_fixate_field_nearest_int (structure, "height", DEFAULT_HEIGHT); gst_structure_fixate_field_nearest_fraction (structure, "framerate", DEFAULT_FPS_N, DEFAULT_FPS_D); gst_pad_set_caps (goom->srcpad, target); gst_caps_unref (target); return TRUE; no_format: { gst_caps_unref (target); return FALSE; } } static gboolean gst_goom_src_event (GstPad * pad, GstEvent * event) { gboolean res; GstGoom *goom; goom = GST_GOOM (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS: { gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; gst_event_parse_qos (event, &proportion, &diff, ×tamp); /* save stuff for the _chain() function */ GST_OBJECT_LOCK (goom); goom->proportion = proportion; if (diff >= 0) /* we're late, this is a good estimate for next displayable * frame (see part-qos.txt) */ goom->earliest_time = timestamp + 2 * diff + goom->duration; else goom->earliest_time = timestamp + diff; GST_OBJECT_UNLOCK (goom); res = gst_pad_push_event (goom->sinkpad, event); break; } default: res = gst_pad_push_event (goom->sinkpad, event); break; } gst_object_unref (goom); return res; } static gboolean gst_goom_sink_event (GstPad * pad, GstEvent * event) { gboolean res; GstGoom *goom; goom = GST_GOOM (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: res = gst_pad_push_event (goom->srcpad, event); break; case GST_EVENT_FLUSH_STOP: gst_goom_reset (goom); res = gst_pad_push_event (goom->srcpad, event); break; case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time; gboolean update; /* the newsegment values are used to clip the input samples * and to convert the incomming timestamps to running time so * we can do QoS */ gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); /* now configure the values */ gst_segment_set_newsegment_full (&goom->segment, update, rate, arate, format, start, stop, time); res = gst_pad_push_event (goom->srcpad, event); break; } default: res = gst_pad_push_event (goom->srcpad, event); break; } gst_object_unref (goom); return res; } static gboolean gst_goom_src_query (GstPad * pad, GstQuery * query) { gboolean res; GstGoom *goom; goom = GST_GOOM (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { /* We need to send the query upstream and add the returned latency to our * own */ GstClockTime min_latency, max_latency; gboolean us_live; GstClockTime our_latency; guint max_samples; if ((res = gst_pad_peer_query (goom->sinkpad, query))) { gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); GST_DEBUG_OBJECT (goom, "Peer latency: min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); /* the max samples we must buffer buffer */ max_samples = MAX (GOOM_SAMPLES, goom->spf); our_latency = gst_util_uint64_scale_int (max_samples, GST_SECOND, goom->rate); GST_DEBUG_OBJECT (goom, "Our latency: %" GST_TIME_FORMAT, GST_TIME_ARGS (our_latency)); /* we add some latency but only if we need to buffer more than what * upstream gives us */ min_latency += our_latency; if (max_latency != -1) max_latency += our_latency; GST_DEBUG_OBJECT (goom, "Calculated total latency : min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); gst_query_set_latency (query, TRUE, min_latency, max_latency); } break; } default: res = gst_pad_peer_query (goom->sinkpad, query); break; } gst_object_unref (goom); return res; } static GstFlowReturn get_buffer (GstGoom * goom, GstBuffer ** outbuf) { GstFlowReturn ret; if (GST_PAD_CAPS (goom->srcpad) == NULL) { if (!gst_goom_src_negotiate (goom)) return GST_FLOW_NOT_NEGOTIATED; } GST_DEBUG_OBJECT (goom, "allocating output buffer with caps %" GST_PTR_FORMAT, GST_PAD_CAPS (goom->srcpad)); ret = gst_pad_alloc_buffer_and_set_caps (goom->srcpad, GST_BUFFER_OFFSET_NONE, goom->outsize, GST_PAD_CAPS (goom->srcpad), outbuf); if (ret != GST_FLOW_OK) return ret; return GST_FLOW_OK; } static GstFlowReturn gst_goom_chain (GstPad * pad, GstBuffer * buffer) { GstGoom *goom; GstFlowReturn ret; GstBuffer *outbuf = NULL; goom = GST_GOOM (gst_pad_get_parent (pad)); /* If we don't have an output format yet, preallocate a buffer to try and * set one */ if (GST_PAD_CAPS (goom->srcpad) == NULL) { ret = get_buffer (goom, &outbuf); if (ret != GST_FLOW_OK) { gst_buffer_unref (buffer); goto beach; } } /* don't try to combine samples from discont buffer */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { gst_adapter_clear (goom->adapter); } GST_DEBUG_OBJECT (goom, "Input buffer has %d samples, time=%" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer) / goom->bps, GST_BUFFER_TIMESTAMP (buffer)); /* Collect samples until we have enough for an output frame */ gst_adapter_push (goom->adapter, buffer); ret = GST_FLOW_OK; while (TRUE) { const guint16 *data; gboolean need_skip; guchar *out_frame; gint i; guint avail, to_flush; guint64 dist, timestamp; avail = gst_adapter_available (goom->adapter); GST_DEBUG_OBJECT (goom, "avail now %u", avail); /* we need GOOM_SAMPLES to get a meaningful result from goom. */ if (avail < (GOOM_SAMPLES * goom->bps)) break; /* we also need enough samples to produce one frame at least */ if (avail < goom->bpf) break; GST_DEBUG_OBJECT (goom, "processing buffer"); /* get timestamp of the current adapter byte */ timestamp = gst_adapter_prev_timestamp (goom->adapter, &dist); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { /* convert bytes to time */ dist /= goom->bps; timestamp += gst_util_uint64_scale_int (dist, GST_SECOND, goom->rate); } if (timestamp != -1) { gint64 qostime; qostime = gst_segment_to_running_time (&goom->segment, GST_FORMAT_TIME, timestamp); qostime += goom->duration; GST_OBJECT_LOCK (goom); /* check for QoS, don't compute buffers that are known to be late */ need_skip = goom->earliest_time != -1 && qostime <= goom->earliest_time; GST_OBJECT_UNLOCK (goom); if (need_skip) { GST_WARNING_OBJECT (goom, "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (goom->earliest_time)); goto skip; } } /* get next GOOM_SAMPLES, we have at least this amount of samples */ data = (const guint16 *) gst_adapter_peek (goom->adapter, GOOM_SAMPLES * goom->bps); if (goom->channels == 2) { for (i = 0; i < GOOM_SAMPLES; i++) { goom->datain[0][i] = *data++; goom->datain[1][i] = *data++; } } else { for (i = 0; i < GOOM_SAMPLES; i++) { goom->datain[0][i] = *data; goom->datain[1][i] = *data++; } } /* alloc a buffer if we don't have one yet, this happens * when we pushed a buffer in this while loop before */ if (outbuf == NULL) { ret = get_buffer (goom, &outbuf); if (ret != GST_FLOW_OK) { goto beach; } } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = goom->duration; GST_BUFFER_SIZE (outbuf) = goom->outsize; out_frame = (guchar *) goom_update (&(goom->goomdata), goom->datain); memcpy (GST_BUFFER_DATA (outbuf), out_frame, goom->outsize); GST_DEBUG ("Pushing frame with time=%" GST_TIME_FORMAT ", duration=%" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (goom->duration)); ret = gst_pad_push (goom->srcpad, outbuf); outbuf = NULL; skip: /* Now flush the samples we needed for this frame, which might be more than * the samples we used (GOOM_SAMPLES). */ to_flush = goom->bpf; GST_DEBUG_OBJECT (goom, "finished frame, flushing %u bytes from input", to_flush); gst_adapter_flush (goom->adapter, to_flush); if (ret != GST_FLOW_OK) break; } if (outbuf != NULL) gst_buffer_unref (outbuf); beach: gst_object_unref (goom); return ret; } static GstStateChangeReturn gst_goom_change_state (GstElement * element, GstStateChange transition) { GstGoom *goom = GST_GOOM (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_goom_reset (goom); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "goom2k1", GST_RANK_NONE, GST_TYPE_GOOM); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "goom2k1", "GOOM 2k1 visualization filter", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/goom2k1/graphic.c0000644000175000017500000000057411671175353015653 00000000000000#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "graphic.h" const Color BLACK = { 0, 0, 0 }; const Color WHITE = { 0xff, 0xff, 0xff }; const Color RED = { 0xff, 0, 0 }; const Color GREEN = { 0, 0xff, 0 }; const Color BLUE = { 0, 0, 0xff }; const Color YELLOW = { 0xff, 0xff, 0x33 }; const Color ORANGE = { 0xff, 0xcc, 0x00 }; const Color VIOLET = { 0x55, 0x00, 0xff }; gst-plugins-good-0.10.31/gst/goom/0000755000175000017500000000000011720565303013617 500000000000000gst-plugins-good-0.10.31/gst/goom/goom_tools.h0000644000175000017500000000312511671175353016101 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _GOOMTOOLS_H #define _GOOMTOOLS_H #include "goom_config.h" /** * Random number generator wrapper for faster random number. */ #define GOOM_NB_RAND 0x10000 typedef struct _GOOM_RANDOM { int array[GOOM_NB_RAND]; unsigned short pos; } GoomRandom; GoomRandom *goom_random_init(int i); void goom_random_free(GoomRandom *grandom); inline static int goom_random(GoomRandom *grandom) { grandom->pos++; /* works because pos is an unsigned short */ return grandom->array[grandom->pos]; } inline static int goom_irand(GoomRandom *grandom, int i) { grandom->pos++; return grandom->array[grandom->pos] % i; } /* called to change the specified number of value in the array, so that the array does not remain the same*/ void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); #endif gst-plugins-good-0.10.31/gst/goom/mmx.h0000644000175000017500000005440211671175353014525 00000000000000/* mmx.h MultiMedia eXtensions GCC interface library for IA32. To use this library, simply include this header file and compile with GCC. You MUST have inlining enabled in order for mmx_ok() to work; this can be done by simply using -O on the GCC command line. Compiling with -DMMX_TRACE will cause detailed trace output to be sent to stderr for each mmx operation. This adds lots of code, and obviously slows execution to a crawl, but can be very useful for debugging. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. 1997-99 by H. Dietz and R. Fisher Notes: It appears that the latest gas has the pand problem fixed, therefore I'll undefine BROKEN_PAND by default. */ #ifndef _MMX_H #define _MMX_H #include "goom_graphic.h" /* Warning: at this writing, the version of GAS packaged with most Linux distributions does not handle the parallel AND operation mnemonic correctly. If the symbol BROKEN_PAND is defined, a slower alternative coding will be used. If execution of mmxtest results in an illegal instruction fault, define this symbol. */ #undef BROKEN_PAND /* The type of an value that fits in an MMX register (note that long long constant values MUST be suffixed by LL and unsigned long long values by ULL, lest they be truncated by the compiler) */ typedef union { long long q; /* Quadword (64-bit) value */ unsigned long long uq; /* Unsigned Quadword */ int d[2]; /* 2 Doubleword (32-bit) values */ unsigned int ud[2]; /* 2 Unsigned Doubleword */ short w[4]; /* 4 Word (16-bit) values */ unsigned short uw[4]; /* 4 Unsigned Word */ char b[8]; /* 8 Byte (8-bit) values */ unsigned char ub[8]; /* 8 Unsigned Byte */ float s[2]; /* Single-precision (32-bit) value */ } __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ /* Function to test if multimedia instructions are supported... */ static int mm_support(void) { /* Returns 1 if MMX instructions are supported, 3 if Cyrix MMX and Extended MMX instructions are supported 5 if AMD MMX and 3DNow! instructions are supported 13 if AMD Extended MMX, &3dNow supported 0 if hardware does not support any of these */ register int rval = 0; __asm__ __volatile__ ( /* See if CPUID instruction is supported ... */ /* ... Get copies of EFLAGS into eax and ecx */ "pushl %%ebx\n\t" "pushf\n\t" "popl %%eax\n\t" "movl %%eax, %%ecx\n\t" /* ... Toggle the ID bit in one copy and store */ /* to the EFLAGS reg */ "xorl $0x200000, %%eax\n\t" "push %%eax\n\t" "popf\n\t" /* ... Get the (hopefully modified) EFLAGS */ "pushf\n\t" "popl %%eax\n\t" /* ... Compare and test result */ "xorl %%eax, %%ecx\n\t" "testl $0x200000, %%ecx\n\t" "jz NotSupported1\n\t" /* CPUID not supported */ /* Get standard CPUID information, and go to a specific vendor section */ "movl $0, %%eax\n\t" "cpuid\n\t" /* Check for Intel */ "cmpl $0x756e6547, %%ebx\n\t" "jne TryAMD\n\t" "cmpl $0x49656e69, %%edx\n\t" "jne TryAMD\n\t" "cmpl $0x6c65746e, %%ecx\n" "jne TryAMD\n\t" "jmp Intel\n\t" /* Check for AMD */ "\nTryAMD:\n\t" "cmpl $0x68747541, %%ebx\n\t" "jne TryCyrix\n\t" "cmpl $0x69746e65, %%edx\n\t" "jne TryCyrix\n\t" "cmpl $0x444d4163, %%ecx\n" "jne TryCyrix\n\t" "jmp AMD\n\t" /* Check for Cyrix */ "\nTryCyrix:\n\t" "cmpl $0x69727943, %%ebx\n\t" "jne NotSupported2\n\t" "cmpl $0x736e4978, %%edx\n\t" "jne NotSupported3\n\t" "cmpl $0x64616574, %%ecx\n\t" "jne NotSupported4\n\t" /* Drop through to Cyrix... */ /* Cyrix Section */ /* See if extended CPUID level 80000001 is supported */ /* The value of CPUID/80000001 for the 6x86MX is undefined according to the Cyrix CPU Detection Guide (Preliminary Rev. 1.01 table 1), so we'll check the value of eax for CPUID/0 to see if standard CPUID level 2 is supported. According to the table, the only CPU which supports level 2 is also the only one which supports extended CPUID levels. */ "cmpl $0x2, %%eax\n\t" "jne MMXtest\n\t" /* Use standard CPUID instead */ /* Extended CPUID supported (in theory), so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%eax\n\t" /* Test for MMX */ "jz NotSupported5\n\t" /* MMX not supported */ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ "jnz EMMXSupported\n\t" "movl $1, %0\n\n\t" /* MMX Supported */ "jmp Return\n\n" "EMMXSupported:\n\t" "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ "jmp Return\n\t" /* AMD Section */ "AMD:\n\t" /* See if extended CPUID is supported */ "movl $0x80000000, %%eax\n\t" "cpuid\n\t" "cmpl $0x80000000, %%eax\n\t" "jl MMXtest\n\t" /* Use standard CPUID instead */ /* Extended CPUID supported, so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported6\n\t" /* MMX not supported */ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ "jnz ThreeDNowSupported\n\t" "movl $1, %0\n\n\t" /* MMX Supported */ "jmp Return\n\n" "ThreeDNowSupported:\n\t" "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ "jnz AMDXMMXSupported\n\t" "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ "jmp Return\n\t" "AMDXMMXSupported:\n\t" "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ "jmp Return\n\t" /* Intel Section */ "Intel:\n\t" /* Check for MMX */ "MMXtest:\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported7\n\t" /* MMX Not supported */ "movl $1, %0\n\n\t" /* MMX Supported */ "jmp Return\n\t" /* Nothing supported */ "\nNotSupported1:\n\t" "#movl $101, %0\n\n\t" "\nNotSupported2:\n\t" "#movl $102, %0\n\n\t" "\nNotSupported3:\n\t" "#movl $103, %0\n\n\t" "\nNotSupported4:\n\t" "#movl $104, %0\n\n\t" "\nNotSupported5:\n\t" "#movl $105, %0\n\n\t" "\nNotSupported6:\n\t" "#movl $106, %0\n\n\t" "\nNotSupported7:\n\t" "#movl $107, %0\n\n\t" "movl $0, %0\n\n\t" "Return:\n\t" "popl %%ebx\n\t" : "=X" (rval) : /* no input */ : "eax", "ecx", "edx" ); /* Return */ return(rval); } /* Function to test if mmx instructions are supported... */ static inline int mmx_ok(void) { /* Returns 1 if MMX instructions are supported, 0 otherwise */ return ( mm_support() & 0x1 ); } int mmx_supported (void); int xmmx_supported (void); /* MMX optimized implementations */ void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); /* Helper functions for the instruction macros that follow... (note that memory-to-register, m2r, instructions are nearly as efficient as register-to-register, r2r, instructions; however, memory-to-memory instructions are really simulated as a convenience, and are only 1/3 as efficient) */ #ifdef MMX_TRACE /* Include the stuff for printing a trace to stderr... */ #include #define mmx_i2r(op, imm, reg) \ { \ mmx_t mmx_trace; \ mmx_trace.uq = (imm); \ printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#reg "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#reg "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_m2r(op, mem, reg) \ { \ mmx_t mmx_trace; \ mmx_trace = (mem); \ printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#reg "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "m" (mem)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#reg "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_r2m(op, reg, mem) \ { \ mmx_t mmx_trace; \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ mmx_trace = (mem); \ printf(#mem "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=m" (mem) \ : /* nothing */ ); \ mmx_trace = (mem); \ printf(#mem "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_r2r(op, regs, regd) \ { \ mmx_t mmx_trace; \ __asm__ __volatile__ ("movq %%" #regs ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#regd "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ printf(#regd "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_m2m(op, mems, memd) \ { \ mmx_t mmx_trace; \ mmx_trace = (mems); \ printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ mmx_trace = (memd); \ printf(#memd "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=m" (memd) \ : "m" (mems)); \ mmx_trace = (memd); \ printf(#memd "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #else /* These macros are a lot simpler without the tracing... */ #define mmx_i2r(op, imm, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm) ) #define mmx_m2r(op, mem, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "m" (mem)) #define mmx_r2m(op, reg, mem) \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=m" (mem) \ : /* nothing */ ) #define mmx_r2r(op, regs, regd) \ __asm__ __volatile__ (#op " %" #regs ", %" #regd) #define mmx_m2m(op, mems, memd) \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=m" (memd) \ : "m" (mems)) #endif /* 1x64 MOVe Quadword (this is both a load and a store... in fact, it is the only way to store) */ #define movq_m2r(var, reg) mmx_m2r(movq, var, reg) #define movq_r2m(reg, var) mmx_r2m(movq, reg, var) #define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) #define movq(vars, vard) \ __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 1x32 MOVe Doubleword (like movq, this is both load and store... but is most useful for moving things between mmx registers and ordinary registers) */ #define movd_m2r(var, reg) mmx_m2r(movd, var, reg) #define movd_r2m(reg, var) mmx_r2m(movd, reg, var) #define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) #define movd(vars, vard) \ __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ "movd %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 2x32, 4x16, and 8x8 Parallel ADDs */ #define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) #define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) #define paddd(vars, vard) mmx_m2m(paddd, vars, vard) #define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) #define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) #define paddw(vars, vard) mmx_m2m(paddw, vars, vard) #define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) #define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) #define paddb(vars, vard) mmx_m2m(paddb, vars, vard) /* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic */ #define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) #define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) #define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) #define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) #define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) #define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) /* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic */ #define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) #define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) #define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) #define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) #define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) #define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) /* 2x32, 4x16, and 8x8 Parallel SUBs */ #define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) #define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) #define psubd(vars, vard) mmx_m2m(psubd, vars, vard) #define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) #define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) #define psubw(vars, vard) mmx_m2m(psubw, vars, vard) #define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) #define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) #define psubb(vars, vard) mmx_m2m(psubb, vars, vard) /* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic */ #define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) #define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) #define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) #define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) #define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) #define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) /* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic */ #define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) #define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) #define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) #define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) #define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) #define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) /* 4x16 Parallel MULs giving Low 4x16 portions of results */ #define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) #define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) #define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) /* 4x16 Parallel MULs giving High 4x16 portions of results */ #define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) #define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) #define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) /* 4x16->2x32 Parallel Mul-ADD (muls like pmullw, then adds adjacent 16-bit fields in the multiply result to make the final 2x32 result) */ #define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) #define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) #define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) /* 1x64 bitwise AND */ #ifdef BROKEN_PAND #define pand_m2r(var, reg) \ { \ mmx_m2r(pandn, (mmx_t) -1LL, reg); \ mmx_m2r(pandn, var, reg); \ } #define pand_r2r(regs, regd) \ { \ mmx_m2r(pandn, (mmx_t) -1LL, regd); \ mmx_r2r(pandn, regs, regd) \ } #define pand(vars, vard) \ { \ movq_m2r(vard, mm0); \ mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ mmx_m2r(pandn, vars, mm0); \ movq_r2m(mm0, vard); \ } #else #define pand_m2r(var, reg) mmx_m2r(pand, var, reg) #define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) #define pand(vars, vard) mmx_m2m(pand, vars, vard) #endif /* 1x64 bitwise AND with Not the destination */ #define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) #define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) #define pandn(vars, vard) mmx_m2m(pandn, vars, vard) /* 1x64 bitwise OR */ #define por_m2r(var, reg) mmx_m2r(por, var, reg) #define por_r2r(regs, regd) mmx_r2r(por, regs, regd) #define por(vars, vard) mmx_m2m(por, vars, vard) /* 1x64 bitwise eXclusive OR */ #define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) #define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) #define pxor(vars, vard) mmx_m2m(pxor, vars, vard) /* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality (resulting fields are either 0 or -1) */ #define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) #define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) #define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) #define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) #define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) #define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) #define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) #define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) #define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) /* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than (resulting fields are either 0 or -1) */ #define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) #define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) #define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) #define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) #define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) #define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) #define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) #define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) #define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) /* 1x64, 2x32, and 4x16 Parallel Shift Left Logical */ #define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) #define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) #define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) #define psllq(vars, vard) mmx_m2m(psllq, vars, vard) #define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) #define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) #define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) #define pslld(vars, vard) mmx_m2m(pslld, vars, vard) #define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) #define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) #define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) #define psllw(vars, vard) mmx_m2m(psllw, vars, vard) /* 1x64, 2x32, and 4x16 Parallel Shift Right Logical */ #define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) #define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) #define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) #define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) #define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) #define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) #define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) #define psrld(vars, vard) mmx_m2m(psrld, vars, vard) #define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) #define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) #define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) #define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) /* 2x32 and 4x16 Parallel Shift Right Arithmetic */ #define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) #define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) #define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) #define psrad(vars, vard) mmx_m2m(psrad, vars, vard) #define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) #define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) #define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) #define psraw(vars, vard) mmx_m2m(psraw, vars, vard) /* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate (packs source and dest fields into dest in that order) */ #define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) #define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) #define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) #define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) #define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) #define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) /* 4x16->8x8 PACK and Unsigned Saturate (packs source and dest fields into dest in that order) */ #define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) #define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) #define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) /* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low (interleaves low half of dest with low half of source as padding in each result field) */ #define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) #define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) #define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) #define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) #define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) #define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) #define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) #define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) #define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) /* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High (interleaves high half of dest with high half of source as padding in each result field) */ #define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) #define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) #define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) #define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) #define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) #define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) #define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) #define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) #define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) /* Empty MMx State (used to clean-up when going from mmx to float use of the registers that are shared by both; note that there is no float-to-mmx operation needed, because only the float tag word info is corruptible) */ #ifdef MMX_TRACE #define emms() \ { \ printf("emms()\n"); \ __asm__ __volatile__ ("emms" \ "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ } #else #define emms() __asm__ __volatile__ ("emms"::: \ "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") #endif #endif gst-plugins-good-0.10.31/gst/goom/goom_graphic.h0000644000175000017500000000410511671175353016355 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 GRAPHIC_H #define GRAPHIC_H typedef unsigned int Uint; typedef struct { unsigned short r, v, b; } Color; extern const Color BLACK; extern const Color WHITE; extern const Color RED; extern const Color BLUE; extern const Color GREEN; extern const Color YELLOW; extern const Color ORANGE; extern const Color VIOLET; #ifdef COLOR_BGRA #define B_CHANNEL 0xFF000000 #define G_CHANNEL 0x00FF0000 #define R_CHANNEL 0x0000FF00 #define A_CHANNEL 0x000000FF #define B_OFFSET 24 #define G_OFFSET 16 #define R_OFFSET 8 #define A_OFFSET 0 typedef union _PIXEL { struct { unsigned char b; unsigned char g; unsigned char r; unsigned char a; } channels; unsigned int val; unsigned char cop[4]; } Pixel; #else #define A_CHANNEL 0xFF000000 #define R_CHANNEL 0x00FF0000 #define G_CHANNEL 0x0000FF00 #define B_CHANNEL 0x000000FF #define A_OFFSET 24 #define R_OFFSET 16 #define G_OFFSET 8 #define B_OFFSET 0 typedef union _PIXEL { struct { unsigned char a; unsigned char r; unsigned char g; unsigned char b; } channels; unsigned int val; unsigned char cop[4]; } Pixel; #endif /* COLOR_BGRA */ /* inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); */ #endif /* GRAPHIC_H */ gst-plugins-good-0.10.31/gst/goom/goom_filters.h0000644000175000017500000000470511671175353016416 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 FILTERS_H #define FILTERS_H #include "goom_config.h" #include "goom_typedefs.h" #include "goom_visual_fx.h" #include "goom_graphic.h" void zoomFilterVisualFXWrapper_create(VisualFX *fx); struct _ZOOM_FILTER_DATA { int vitesse; /* 128 = vitesse nule... * * 256 = en arriere * hyper vite.. * * 0 = en avant hype vite. */ unsigned char pertedec; unsigned char sqrtperte; int middleX, middleY; /* milieu de l'effet */ char reverse; /* inverse la vitesse */ char mode; /* type d'effet � appliquer (cf les #define) */ /** @since June 2001 */ int hPlaneEffect; /* deviation horitontale */ int vPlaneEffect; /* deviation verticale */ /** @since April 2002 */ int waveEffect; /* applique une "surcouche" de wave effect */ int hypercosEffect; /* applique une "surcouche de hypercos effect */ char noisify; /* ajoute un bruit a la transformation */ }; #define NORMAL_MODE 0 #define WAVE_MODE 1 #define CRYSTAL_BALL_MODE 2 #define SCRUNCH_MODE 3 #define AMULETTE_MODE 4 #define WATER_MODE 5 #define HYPERCOS1_MODE 6 #define HYPERCOS2_MODE 7 #define YONLY_MODE 8 #define SPEEDWAY_MODE 9 void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, guint32 cycle); /* filtre de zoom : * le contenu de pix1 est copie dans pix2. * zf : si non NULL, configure l'effet. * resx,resy : taille des buffers. */ void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, guint32 resy, int switchIncr, float switchMult); #endif gst-plugins-good-0.10.31/gst/goom/goom_visual_fx.h0000644000175000017500000000230511671175353016740 00000000000000/* Goom Project * Copyright (C) <2003> Jean-Christophe Hoelt * * 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 _VISUAL_FX_H #define _VISUAL_FX_H #include "goom_config_param.h" #include "goom_graphic.h" #include "goom_typedefs.h" struct _VISUAL_FX { void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); void (*free) (struct _VISUAL_FX *_this); void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); void *fx_data; PluginParameters *params; }; #endif gst-plugins-good-0.10.31/gst/goom/sound_tester.c0000644000175000017500000001150111671175353016426 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "sound_tester.h" #include #include /* some constants */ #define BIG_GOOM_DURATION 100 #define BIG_GOOM_SPEED_LIMIT 0.1f #define ACCEL_MULT 0.95f #define SPEED_MULT 0.99f void evaluate_sound (gint16 data[2][512], SoundInfo * info) { int i; float difaccel; float prevspeed; /* find the max */ int incvar = 0; for (i = 0; i < 512; i += 2) { if (incvar < data[0][i]) incvar = data[0][i]; } if (incvar > info->allTimesMax) info->allTimesMax = incvar; /* volume sonore */ info->volume = (float) incvar / (float) info->allTimesMax; memcpy (info->samples[0], data[0], 512 * sizeof (short)); memcpy (info->samples[1], data[1], 512 * sizeof (short)); difaccel = info->accelvar; info->accelvar = info->volume; /* accel entre 0 et 1 */ /* transformations sur la vitesse du son */ if (info->speedvar > 1.0f) info->speedvar = 1.0f; if (info->speedvar < 0.1f) info->accelvar *= (1.0f - (float) info->speedvar); else if (info->speedvar < 0.3f) info->accelvar *= (0.9f - (float) (info->speedvar - 0.1f) / 2.0f); else info->accelvar *= (0.8f - (float) (info->speedvar - 0.3f) / 4.0f); /* adoucissement de l'acceleration */ info->accelvar *= ACCEL_MULT; if (info->accelvar < 0) info->accelvar = 0; difaccel = info->accelvar - difaccel; if (difaccel < 0) difaccel = -difaccel; /* mise a jour de la vitesse */ prevspeed = info->speedvar; info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; info->speedvar *= SPEED_MULT; info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; if (info->speedvar < 0) info->speedvar = 0; if (info->speedvar > 1) info->speedvar = 1; /* temps du goom */ info->timeSinceLastGoom++; info->timeSinceLastBigGoom++; info->cycle++; /* detection des nouveaux gooms */ if ((info->speedvar > (float) IVAL (info->biggoom_speed_limit_p) / 100.0f) && (info->accelvar > info->bigGoomLimit) && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { info->timeSinceLastBigGoom = 0; } if (info->accelvar > info->goom_limit) { /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ info->totalgoom++; info->timeSinceLastGoom = 0; info->goomPower = info->accelvar - info->goom_limit; } if (info->accelvar > info->prov_max) info->prov_max = info->accelvar; if (info->goom_limit > 1) info->goom_limit = 1; /* toute les 2 secondes : v�rifier si le taux de goom est correct * et le modifier sinon.. */ if (info->cycle % 64 == 0) { if (info->speedvar < 0.01f) info->goom_limit *= 0.91; if (info->totalgoom > 4) { info->goom_limit += 0.02; } if (info->totalgoom > 7) { info->goom_limit *= 1.03f; info->goom_limit += 0.03; } if (info->totalgoom > 16) { info->goom_limit *= 1.05f; info->goom_limit += 0.04; } if (info->totalgoom == 0) { info->goom_limit = info->prov_max - 0.02; } if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) info->goom_limit -= 0.01; info->totalgoom = 0; info->bigGoomLimit = info->goom_limit * (1.0f + (float) IVAL (info->biggoom_factor_p) / 500.0f); info->prov_max = 0; } /* mise a jour des parametres pour la GUI */ FVAL (info->volume_p) = info->volume; info->volume_p.change_listener (&info->volume_p); FVAL (info->speed_p) = info->speedvar * 4; info->speed_p.change_listener (&info->speed_p); FVAL (info->accel_p) = info->accelvar; info->accel_p.change_listener (&info->accel_p); FVAL (info->goom_limit_p) = info->goom_limit; info->goom_limit_p.change_listener (&info->goom_limit_p); FVAL (info->goom_power_p) = info->goomPower; info->goom_power_p.change_listener (&info->goom_power_p); FVAL (info->last_goom_p) = 1.0 - ((float) info->timeSinceLastGoom / 20.0f); info->last_goom_p.change_listener (&info->last_goom_p); FVAL (info->last_biggoom_p) = 1.0 - ((float) info->timeSinceLastBigGoom / 40.0f); info->last_biggoom_p.change_listener (&info->last_biggoom_p); /* bigGoomLimit ==goomLimit*9/8+7 ? */ } gst-plugins-good-0.10.31/gst/goom/sound_tester.h0000644000175000017500000000177011671175353016442 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _SOUND_TESTER_H #define _SOUND_TESTER_H #include "goom_plugin_info.h" #include "goom_config.h" /** change les donnees du SoundInfo */ void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); #endif gst-plugins-good-0.10.31/gst/goom/mmx.c0000644000175000017500000001703711671175353014523 00000000000000/* mmx.c MultiMedia eXtensions GCC interface library for IA32. To use this library, simply include this header file and compile with GCC. You MUST have inlining enabled in order for mmx_ok() to work; this can be done by simply using -O on the GCC command line. Compiling with -DMMX_TRACE will cause detailed trace output to be sent to stderr for each mmx operation. This adds lots of code, and obviously slows execution to a crawl, but can be very useful for debugging. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. 1997-99 by H. Dietz and R. Fisher Notes: It appears that the latest gas has the pand problem fixed, therefore I'll undefine BROKEN_PAND by default. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "goom_config.h" #ifdef HAVE_MMX #define BUFFPOINTNB 16 #define BUFFPOINTMASK 0xffff #define BUFFINCR 0xff #include "mmx.h" #include "goom_graphic.h" #define sqrtperte 16 // faire : a % sqrtperte <=> a & pertemask #define PERTEMASK 0xf // faire : a / sqrtperte <=> a >> PERTEDEC #define PERTEDEC 4 int mmx_supported (void) { return (mm_support () & 0x1); } void zoom_filter_mmx (int prevX, int prevY, Pixel * expix1, Pixel * expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; int bufsize = prevX * prevY; int loop; __asm__ __volatile__ ("pxor %mm7,%mm7"); for (loop = 0; loop < bufsize; loop++) { /* int couleur; */ int px, py; int pos; int coeffs; int myPos = loop << 1, myPos2 = myPos + 1; int brutSmypos = brutS[myPos]; px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); brutSmypos = brutS[myPos2]; py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); if ((py >= ay) || (px >= ax)) { pos = coeffs = 0; } else { pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); // coef en modulo 15 coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; } __asm__ __volatile__ ("movd %2, %%mm6 \n\t" /* recuperation des deux premiers pixels dans mm0 et mm1 */ "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ /* depackage du premier pixel */ "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ /* depackage du 2ieme pixel */ "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ /* extraction des coefficients... */ "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ /* multiplication des pixels par les coefficients */ "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ "paddw %%mm1, %%mm0 \n\t" /* ...extraction des 2 derniers coefficients */ "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ /* ajouter la longueur de ligne a esi */ "addl 8(%%ebp),%1 \n\t" /* recuperation des 2 derniers pixels */ "movq (%3,%1,4), %%mm1 \n\t" "movq %%mm1, %%mm2 \n\t" /* depackage des pixels */ "punpcklbw %%mm7, %%mm1 \n\t" "punpckhbw %%mm7, %%mm2 \n\t" /* multiplication pas les coeffs */ "pmullw %%mm4, %%mm1 \n\t" "pmullw %%mm5, %%mm2 \n\t" /* ajout des valeurs obtenues ? la valeur finale */ "paddw %%mm1, %%mm0 \n\t" "paddw %%mm2, %%mm0 \n\t" /* division par 256 = 16+16+16+16, puis repackage du pixel final */ "psrlw $8, %%mm0 \n\t" "packuswb %%mm7, %%mm0 \n\t" "movd %%mm0,%0 \n\t":"=g" (expix2[loop]) :"r" (pos), "r" (coeffs), "r" (expix1) ); emms (); } } #define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ { \ movd_m2r(_backbuf, mm0); \ paddusb_m2r(_col, mm0); \ movd_r2m(mm0, _out); \ } #define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) void draw_line_mmx (Pixel * data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) { int x, y, dx, dy, yy, xx; Pixel *p; if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) goto end_of_line; dx = x2 - x1; dy = y2 - y1; if (x1 >= x2) { int tmp; tmp = x1; x1 = x2; x2 = tmp; tmp = y1; y1 = y2; y2 = tmp; dx = x2 - x1; dy = y2 - y1; } /* vertical line */ if (dx == 0) { if (y1 < y2) { p = &(data[(screenx * y1) + x1]); for (y = y1; y <= y2; y++) { DRAWMETHOD; p += screenx; } } else { p = &(data[(screenx * y2) + x1]); for (y = y2; y <= y1; y++) { DRAWMETHOD; p += screenx; } } goto end_of_line; } /* horizontal line */ if (dy == 0) { if (x1 < x2) { p = &(data[(screenx * y1) + x1]); for (x = x1; x <= x2; x++) { DRAWMETHOD; p++; } goto end_of_line; } else { p = &(data[(screenx * y1) + x2]); for (x = x2; x <= x1; x++) { DRAWMETHOD; p++; } goto end_of_line; } } /* 1 */ /* \ */ /* \ */ /* 2 */ if (y2 > y1) { /* steep */ if (dy > dx) { dx = ((dx << 16) / dy); x = x1 << 16; for (y = y1; y <= y2; y++) { xx = x >> 16; p = &(data[(screenx * y) + xx]); DRAWMETHOD; if (xx < (screenx - 1)) { p++; /* DRAWMETHOD; */ } x += dx; } goto end_of_line; } /* shallow */ else { dy = ((dy << 16) / dx); y = y1 << 16; for (x = x1; x <= x2; x++) { yy = y >> 16; p = &(data[(screenx * yy) + x]); DRAWMETHOD; if (yy < (screeny - 1)) { p += screeny; /* DRAWMETHOD; */ } y += dy; } } } /* 2 */ /* / */ /* / */ /* 1 */ else { /* steep */ if (-dy > dx) { dx = ((dx << 16) / -dy); x = (x1 + 1) << 16; for (y = y1; y >= y2; y--) { xx = x >> 16; p = &(data[(screenx * y) + xx]); DRAWMETHOD; if (xx < (screenx - 1)) { p--; /* DRAWMETHOD; */ } x += dx; } goto end_of_line; } /* shallow */ else { dy = ((dy << 16) / dx); y = y1 << 16; for (x = x1; x <= x2; x++) { yy = y >> 16; p = &(data[(screenx * yy) + x]); DRAWMETHOD; if (yy < (screeny - 1)) { p += screeny; /* DRAWMETHOD; */ } y += dy; } goto end_of_line; } } end_of_line: emms (); /* __asm__ __volatile__ ("emms"); */ } #else int mmx_supported (void) { return (0); } #endif /* HAVE_MMX */ gst-plugins-good-0.10.31/gst/goom/mathtools.c0000644000175000017500000001437011671175353015731 00000000000000/* Goom Project * Copyright (C) <2003> Jean-Christophe Hoelt * * goom_core.c:Contains the core of goom's work. * * 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 "mathtools.h" float sin256[256] = { 0, 0.0245412, 0.0490677, 0.0735646, 0.0980171, 0.122411, 0.14673, 0.170962, 0.19509, 0.219101, 0.24298, 0.266713, 0.290285, 0.313682, 0.33689, 0.359895, 0.382683, 0.405241, 0.427555, 0.449611, 0.471397, 0.492898, 0.514103, 0.534998, 0.55557, 0.575808, 0.595699, 0.615232, 0.634393, 0.653173, 0.671559, 0.689541, 0.707107, 0.724247, 0.740951, 0.757209, 0.77301, 0.788346, 0.803208, 0.817585, 0.83147, 0.844854, 0.857729, 0.870087, 0.881921, 0.893224, 0.903989, 0.91421, 0.92388, 0.932993, 0.941544, 0.949528, 0.95694, 0.963776, 0.970031, 0.975702, 0.980785, 0.985278, 0.989177, 0.99248, 0.995185, 0.99729, 0.998795, 0.999699, 1, 0.999699, 0.998795, 0.99729, 0.995185, 0.99248, 0.989177, 0.985278, 0.980785, 0.975702, 0.970031, 0.963776, 0.95694, 0.949528, 0.941544, 0.932993, 0.92388, 0.91421, 0.903989, 0.893224, 0.881921, 0.870087, 0.857729, 0.844854, 0.83147, 0.817585, 0.803208, 0.788346, 0.77301, 0.757209, 0.740951, 0.724247, 0.707107, 0.689541, 0.671559, 0.653173, 0.634393, 0.615232, 0.595699, 0.575808, 0.55557, 0.534998, 0.514103, 0.492898, 0.471397, 0.449611, 0.427555, 0.405241, 0.382683, 0.359895, 0.33689, 0.313682, 0.290285, 0.266713, 0.24298, 0.219101, 0.19509, 0.170962, 0.14673, 0.122411, 0.0980171, 0.0735646, 0.0490677, 0.0245412, 1.22465e-16, -0.0245412, -0.0490677, -0.0735646, -0.0980171, -0.122411, -0.14673, -0.170962, -0.19509, -0.219101, -0.24298, -0.266713, -0.290285, -0.313682, -0.33689, -0.359895, -0.382683, -0.405241, -0.427555, -0.449611, -0.471397, -0.492898, -0.514103, -0.534998, -0.55557, -0.575808, -0.595699, -0.615232, -0.634393, -0.653173, -0.671559, -0.689541, -0.707107, -0.724247, -0.740951, -0.757209, -0.77301, -0.788346, -0.803208, -0.817585, -0.83147, -0.844854, -0.857729, -0.870087, -0.881921, -0.893224, -0.903989, -0.91421, -0.92388, -0.932993, -0.941544, -0.949528, -0.95694, -0.963776, -0.970031, -0.975702, -0.980785, -0.985278, -0.989177, -0.99248, -0.995185, -0.99729, -0.998795, -0.999699, -1, -0.999699, -0.998795, -0.99729, -0.995185, -0.99248, -0.989177, -0.985278, -0.980785, -0.975702, -0.970031, -0.963776, -0.95694, -0.949528, -0.941544, -0.932993, -0.92388, -0.91421, -0.903989, -0.893224, -0.881921, -0.870087, -0.857729, -0.844854, -0.83147, -0.817585, -0.803208, -0.788346, -0.77301, -0.757209, -0.740951, -0.724247, -0.707107, -0.689541, -0.671559, -0.653173, -0.634393, -0.615232, -0.595699, -0.575808, -0.55557, -0.534998, -0.514103, -0.492898, -0.471397, -0.449611, -0.427555, -0.405241, -0.382683, -0.359895, -0.33689, -0.313682, -0.290285, -0.266713, -0.24298, -0.219101, -0.19509, -0.170962, -0.14673, -0.122411, -0.0980171, -0.0735646, -0.0490677, -0.0245412 }; float cos256[256] = { 0, 0.999699, 0.998795, 0.99729, 0.995185, 0.99248, 0.989177, 0.985278, 0.980785, 0.975702, 0.970031, 0.963776, 0.95694, 0.949528, 0.941544, 0.932993, 0.92388, 0.91421, 0.903989, 0.893224, 0.881921, 0.870087, 0.857729, 0.844854, 0.83147, 0.817585, 0.803208, 0.788346, 0.77301, 0.757209, 0.740951, 0.724247, 0.707107, 0.689541, 0.671559, 0.653173, 0.634393, 0.615232, 0.595699, 0.575808, 0.55557, 0.534998, 0.514103, 0.492898, 0.471397, 0.449611, 0.427555, 0.405241, 0.382683, 0.359895, 0.33689, 0.313682, 0.290285, 0.266713, 0.24298, 0.219101, 0.19509, 0.170962, 0.14673, 0.122411, 0.0980171, 0.0735646, 0.0490677, 0.0245412, 6.12323e-17, -0.0245412, -0.0490677, -0.0735646, -0.0980171, -0.122411, -0.14673, -0.170962, -0.19509, -0.219101, -0.24298, -0.266713, -0.290285, -0.313682, -0.33689, -0.359895, -0.382683, -0.405241, -0.427555, -0.449611, -0.471397, -0.492898, -0.514103, -0.534998, -0.55557, -0.575808, -0.595699, -0.615232, -0.634393, -0.653173, -0.671559, -0.689541, -0.707107, -0.724247, -0.740951, -0.757209, -0.77301, -0.788346, -0.803208, -0.817585, -0.83147, -0.844854, -0.857729, -0.870087, -0.881921, -0.893224, -0.903989, -0.91421, -0.92388, -0.932993, -0.941544, -0.949528, -0.95694, -0.963776, -0.970031, -0.975702, -0.980785, -0.985278, -0.989177, -0.99248, -0.995185, -0.99729, -0.998795, -0.999699, -1, -0.999699, -0.998795, -0.99729, -0.995185, -0.99248, -0.989177, -0.985278, -0.980785, -0.975702, -0.970031, -0.963776, -0.95694, -0.949528, -0.941544, -0.932993, -0.92388, -0.91421, -0.903989, -0.893224, -0.881921, -0.870087, -0.857729, -0.844854, -0.83147, -0.817585, -0.803208, -0.788346, -0.77301, -0.757209, -0.740951, -0.724247, -0.707107, -0.689541, -0.671559, -0.653173, -0.634393, -0.615232, -0.595699, -0.575808, -0.55557, -0.534998, -0.514103, -0.492898, -0.471397, -0.449611, -0.427555, -0.405241, -0.382683, -0.359895, -0.33689, -0.313682, -0.290285, -0.266713, -0.24298, -0.219101, -0.19509, -0.170962, -0.14673, -0.122411, -0.0980171, -0.0735646, -0.0490677, -0.0245412, -1.83697e-16, 0.0245412, 0.0490677, 0.0735646, 0.0980171, 0.122411, 0.14673, 0.170962, 0.19509, 0.219101, 0.24298, 0.266713, 0.290285, 0.313682, 0.33689, 0.359895, 0.382683, 0.405241, 0.427555, 0.449611, 0.471397, 0.492898, 0.514103, 0.534998, 0.55557, 0.575808, 0.595699, 0.615232, 0.634393, 0.653173, 0.671559, 0.689541, 0.707107, 0.724247, 0.740951, 0.757209, 0.77301, 0.788346, 0.803208, 0.817585, 0.83147, 0.844854, 0.857729, 0.870087, 0.881921, 0.893224, 0.903989, 0.91421, 0.92388, 0.932993, 0.941544, 0.949528, 0.95694, 0.963776, 0.970031, 0.975702, 0.980785, 0.985278, 0.989177, 0.99248, 0.995185, 0.99729, 0.998795, 0.999699 }; gst-plugins-good-0.10.31/gst/goom/goom_plugin_info.h0000644000175000017500000001120311671175353017246 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _PLUGIN_INFO_H #define _PLUGIN_INFO_H #include "goom_typedefs.h" #include "goom_config.h" #include "goom_graphic.h" #include "goom_config_param.h" #include "goom_visual_fx.h" #include "goom_filters.h" #include "goom_tools.h" typedef struct { char drawIFS; char drawPoints; char drawTentacle; char drawScope; int farScope; int rangemin; int rangemax; } GoomState; #define STATES_MAX_NB 128 /** * Gives informations about the sound. */ struct _SOUND_INFO { /* nota : a Goom is just a sound event... */ int timeSinceLastGoom; /* >= 0 */ float goomPower; /* power of the last Goom [0..1] */ int timeSinceLastBigGoom; /* >= 0 */ float volume; /* [0..1] */ short samples[2][512]; /* other "internal" datas for the sound_tester */ float goom_limit; /* auto-updated limit of goom_detection */ float bigGoomLimit; float accelvar; /* acceleration of the sound - [0..1] */ float speedvar; /* speed of the sound - [0..100] */ int allTimesMax; int totalgoom; /* number of goom since last reset * (a reset every 64 cycles) */ float prov_max; /* accel max since last reset */ int cycle; /* private */ PluginParam volume_p; PluginParam speed_p; PluginParam accel_p; PluginParam goom_limit_p; PluginParam goom_power_p; PluginParam last_goom_p; PluginParam last_biggoom_p; PluginParam biggoom_speed_limit_p; PluginParam biggoom_factor_p; PluginParameters params; /* contains the previously defined parameters. */ }; /** * Allows FXs to know the current state of the plugin. */ struct _PLUGIN_INFO { /* public datas */ int nbParams; PluginParameters *params; /* private datas */ struct _SIZE_TYPE { int width; int height; int size; /* == screen.height * screen.width. */ } screen; SoundInfo sound; int nbVisuals; VisualFX **visuals; /* pointers on all the visual fx */ /** The known FX */ VisualFX convolve_fx; VisualFX star_fx; VisualFX zoomFilter_fx; VisualFX tentacles_fx; VisualFX ifs_fx; /** image buffers */ guint32 *pixel; guint32 *back; Pixel *p1, *p2; Pixel *conv; Pixel *outputBuf; /** state of goom */ guint32 cycle; GoomState states[STATES_MAX_NB]; int statesNumber; int statesRangeMax; GoomState *curGState; /** effet de ligne.. */ GMLine *gmline1; GMLine *gmline2; /** sinus table */ int sintable[0x10000]; /* INTERNALS */ /** goom_update internals. * I took all static variables from goom_update and put them here.. for the moment. */ struct { int lockvar; /* pour empecher de nouveaux changements */ int goomvar; /* boucle des gooms */ int loopvar; /* mouvement des points */ int stop_lines; int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ int decay_ifs; /* disparition de l'ifs */ int recay_ifs; /* dedisparition de l'ifs */ int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ int lineMode; /* l'effet lineaire a dessiner */ float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ int switchIncrAmount; /* 0x7f */ float switchMult; /* 1.0f */ int switchIncr; /* = SWITCHINCR; */ int stateSelectionRnd; int stateSelectionBlocker; int previousZoomSpeed; ZoomFilterData zoomFilterData; } update; struct { void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); } methods; GoomRandom *gRandom; }; void plugin_info_init(PluginInfo *p, int nbVisual); void plugin_info_free(PluginInfo *p); /* i = [0..p->nbVisual-1] */ void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); #endif gst-plugins-good-0.10.31/gst/goom/goom_core.c0000644000175000017500000007033011671175353015666 00000000000000/* Goom Project * Copyright (C) <2003> Jean-Christophe Hoelt * * goom_core.c:Contains the core of goom's work. * * 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 #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #include "goom.h" #include "goom_tools.h" #include "goom_filters.h" #include "lines.h" #include "ifs.h" #include "tentacle3d.h" #include "sound_tester.h" #include "goom_plugin_info.h" #include "goom_fx.h" /* #define VERBOSE */ #define STOP_SPEED 128 /* TODO: put that as variable in PluginInfo */ #define TIME_BTW_CHG 300 static void choose_a_goom_line (PluginInfo * goomInfo, float *param1, float *param2, int *couleur, int *mode, float *amplitude, int far); static void init_buffers (PluginInfo * goomInfo, int buffsize) { goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); memset (goomInfo->pixel, 0, buffsize * sizeof (guint32) + 128); goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); memset (goomInfo->back, 0, buffsize * sizeof (guint32) + 128); goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); memset (goomInfo->conv, 0, buffsize * sizeof (guint32) + 128); goomInfo->outputBuf = goomInfo->conv; goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); } /************************** * INIT * **************************/ PluginInfo * goom_init (guint32 resx, guint32 resy) { PluginInfo *goomInfo = (PluginInfo *) malloc (sizeof (PluginInfo)); #ifdef VERBOSE printf ("GOOM: init (%d, %d);\n", resx, resy); #endif plugin_info_init (goomInfo, 4); goomInfo->screen.width = resx; goomInfo->screen.height = resy; goomInfo->screen.size = resx * resy; init_buffers (goomInfo, goomInfo->screen.size); goomInfo->gRandom = goom_random_init ((uintptr_t) goomInfo->pixel); goomInfo->cycle = 0; flying_star_create (&goomInfo->star_fx); goomInfo->star_fx.init (&goomInfo->star_fx, goomInfo); zoomFilterVisualFXWrapper_create (&goomInfo->zoomFilter_fx); goomInfo->zoomFilter_fx.init (&goomInfo->zoomFilter_fx, goomInfo); tentacle_fx_create (&goomInfo->tentacles_fx); goomInfo->tentacles_fx.init (&goomInfo->tentacles_fx, goomInfo); convolve_create (&goomInfo->convolve_fx); goomInfo->convolve_fx.init (&goomInfo->convolve_fx, goomInfo); plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); ifs_visualfx_create (&goomInfo->ifs_fx); goomInfo->ifs_fx.init (&goomInfo->ifs_fx, goomInfo); goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, GML_HLINE, goomInfo->screen.height, GML_BLACK, GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, GML_HLINE, 0, GML_BLACK, GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ return goomInfo; } void goom_set_resolution (PluginInfo * goomInfo, guint32 resx, guint32 resy) { free (goomInfo->pixel); free (goomInfo->back); free (goomInfo->conv); goomInfo->screen.width = resx; goomInfo->screen.height = resy; goomInfo->screen.size = resx * resy; init_buffers (goomInfo, goomInfo->screen.size); /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ goomInfo->ifs_fx.free (&goomInfo->ifs_fx); goomInfo->ifs_fx.init (&goomInfo->ifs_fx, goomInfo); goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); } int goom_set_screenbuffer (PluginInfo * goomInfo, void *buffer) { goomInfo->outputBuf = (Pixel *) buffer; return 1; } /******************************************** * UPDATE * ******************************************** * WARNING: this is a 600 lines function ! (21-11-2003) */ guint32 * goom_update (PluginInfo * goomInfo, gint16 data[2][512], int forceMode, float fps) { Pixel *return_val; guint32 pointWidth; guint32 pointHeight; int i; float largfactor; /* elargissement de l'intervalle d'�volution des points */ Pixel *tmp; ZoomFilterData *pzfd; /* test if the config has changed, update it if so */ pointWidth = (goomInfo->screen.width * 2) / 5; pointHeight = ((goomInfo->screen.height) * 2) / 5; /* ! etude du signal ... */ evaluate_sound (data, &(goomInfo->sound)); /* goom_execute_main_script(goomInfo); */ /* ! calcul du deplacement des petits points ... */ largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; if (largfactor > 1.5f) largfactor = 1.5f; goomInfo->update.decay_ifs--; if (goomInfo->update.decay_ifs > 0) goomInfo->update.ifs_incr += 2; if (goomInfo->update.decay_ifs == 0) goomInfo->update.ifs_incr = 0; if (goomInfo->update.recay_ifs) { goomInfo->update.ifs_incr -= 2; goomInfo->update.recay_ifs--; if ((goomInfo->update.recay_ifs == 0) && (goomInfo->update.ifs_incr <= 0)) goomInfo->update.ifs_incr = 1; } if (goomInfo->update.ifs_incr > 0) goomInfo->ifs_fx.apply (&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); if (goomInfo->curGState->drawPoints) { for (i = 1; i * 15 <= goomInfo->sound.speedvar * 80.0f + 15; i++) { goomInfo->update.loopvar += goomInfo->sound.speedvar * 50 + 1; pointFilter (goomInfo, goomInfo->p1, YELLOW, ((pointWidth - 6.0f) * largfactor + 5.0f), ((pointHeight - 6.0f) * largfactor + 5.0f), i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); pointFilter (goomInfo, goomInfo->p1, ORANGE, ((pointWidth / 2) * largfactor) / i + 10.0f * i, ((pointHeight / 2) * largfactor) / i + 10.0f * i, 96.0f, i * 80.0f, goomInfo->update.loopvar / i); pointFilter (goomInfo, goomInfo->p1, VIOLET, ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, i + 122.0f, 134.0f, goomInfo->update.loopvar / i); pointFilter (goomInfo, goomInfo->p1, BLACK, ((pointHeight / 3) * largfactor + 20.0f), ((pointHeight / 3) * largfactor + 20.0f), 58.0f, i * 66.0f, goomInfo->update.loopvar / i); pointFilter (goomInfo, goomInfo->p1, WHITE, (pointHeight * largfactor + 10.0f * i) / i, (pointHeight * largfactor + 10.0f * i) / i, 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); } } /* par d�faut pas de changement de zoom */ pzfd = NULL; /* * Test forceMode */ #ifdef VERBOSE if (forceMode != 0) { printf ("forcemode = %d\n", forceMode); } #endif /* diminuer de 1 le temps de lockage */ /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ if (--goomInfo->update.lockvar < 0) goomInfo->update.lockvar = 0; /* on verifie qu'il ne se pas un truc interressant avec le son. */ if ((goomInfo->sound.timeSinceLastGoom == 0) || (forceMode > 0) || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { /* changement eventuel de mode */ if (goom_irand (goomInfo->gRandom, 16) == 0) switch (goom_irand (goomInfo->gRandom, 34)) { case 0: case 10: goomInfo->update.zoomFilterData.hypercosEffect = goom_irand (goomInfo->gRandom, 2); case 13: case 20: case 21: goomInfo->update.zoomFilterData.mode = WAVE_MODE; goomInfo->update.zoomFilterData.reverse = 0; goomInfo->update.zoomFilterData.waveEffect = (goom_irand (goomInfo->gRandom, 3) == 0); if (goom_irand (goomInfo->gRandom, 2)) goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; break; case 1: case 11: goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = 0; break; case 2: case 12: goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = 0; break; case 3: goomInfo->update.zoomFilterData.mode = WATER_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = 0; break; case 4: case 14: goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = 0; break; case 5: case 15: case 22: goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand (goomInfo->gRandom, 3) == 0); break; case 6: case 16: goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = 0; break; case 7: case 17: goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; goomInfo->update.zoomFilterData.waveEffect = (goom_irand (goomInfo->gRandom, 4) == 0); goomInfo->update.zoomFilterData.hypercosEffect = goom_irand (goomInfo->gRandom, 2); break; case 8: case 18: case 19: goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; goomInfo->update.zoomFilterData.waveEffect = 1; goomInfo->update.zoomFilterData.hypercosEffect = 1; break; case 29: case 30: goomInfo->update.zoomFilterData.mode = YONLY_MODE; break; case 31: case 32: case 33: goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; break; default: goomInfo->update.zoomFilterData.mode = NORMAL_MODE; goomInfo->update.zoomFilterData.waveEffect = 0; goomInfo->update.zoomFilterData.hypercosEffect = 0; } } /* tout ceci ne sera fait qu'en cas de non-blocage */ if (goomInfo->update.lockvar == 0) { /* reperage de goom (acceleration forte de l'acceleration du volume) */ /* -> coup de boost de la vitesse si besoin.. */ if (goomInfo->sound.timeSinceLastGoom == 0) { int i; goomInfo->update.goomvar++; /* SELECTION OF THE GOOM STATE */ if ((!goomInfo->update.stateSelectionBlocker) && (goom_irand (goomInfo->gRandom, 3))) { goomInfo->update.stateSelectionRnd = goom_irand (goomInfo->gRandom, goomInfo->statesRangeMax); goomInfo->update.stateSelectionBlocker = 3; } else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; for (i = 0; i < goomInfo->statesNumber; i++) if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) goomInfo->curGState = &(goomInfo->states[i]); if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr <= 0)) { goomInfo->update.recay_ifs = 5; goomInfo->update.ifs_incr = 11; } if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr > 0) && (goomInfo->update.decay_ifs <= 0)) goomInfo->update.decay_ifs = 100; if (!goomInfo->curGState->drawScope) goomInfo->update.stop_lines = 0xf000 & 5; if (!goomInfo->curGState->drawScope) { goomInfo->update.stop_lines = 0; goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; } /* if (goomInfo->update.goomvar % 1 == 0) */ { guint32 vtmp; guint32 newvit; goomInfo->update.lockvar = 50; newvit = STOP_SPEED + 1 - ((float) 3.5f * log10 (goomInfo->sound.speedvar * 60 + 1)); /* retablir le zoom avant.. */ if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { goomInfo->update.zoomFilterData.reverse = 0; goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; goomInfo->update.lockvar = 75; } if (goom_irand (goomInfo->gRandom, 10) == 0) { goomInfo->update.zoomFilterData.reverse = 1; goomInfo->update.lockvar = 100; } if (goom_irand (goomInfo->gRandom, 10) == 0) goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; if (goom_irand (goomInfo->gRandom, 12) == 0) goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; /* changement de milieu.. */ switch (goom_irand (goomInfo->gRandom, 25)) { case 0: case 3: case 6: goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; break; case 1: case 4: goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; break; case 2: case 5: goomInfo->update.zoomFilterData.middleX = 1; break; default: goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; } if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; } switch (vtmp = (goom_irand (goomInfo->gRandom, 15))) { case 0: goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand (goomInfo->gRandom, 3) - goom_irand (goomInfo->gRandom, 3); goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand (goomInfo->gRandom, 3) - goom_irand (goomInfo->gRandom, 3); break; case 3: goomInfo->update.zoomFilterData.vPlaneEffect = 0; goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand (goomInfo->gRandom, 8) - goom_irand (goomInfo->gRandom, 8); break; case 4: case 5: case 6: case 7: goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand (goomInfo->gRandom, 5) - goom_irand (goomInfo->gRandom, 5); goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; break; case 8: goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand (goomInfo->gRandom, 8); goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; break; case 9: goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand (goomInfo->gRandom, 8); goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; break; case 13: goomInfo->update.zoomFilterData.hPlaneEffect = 0; goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand (goomInfo->gRandom, 10) - goom_irand (goomInfo->gRandom, 10); break; case 14: goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand (goomInfo->gRandom, 10) - goom_irand (goomInfo->gRandom, 10); goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand (goomInfo->gRandom, 10) - goom_irand (goomInfo->gRandom, 10); break; default: if (vtmp < 10) { goomInfo->update.zoomFilterData.vPlaneEffect = 0; goomInfo->update.zoomFilterData.hPlaneEffect = 0; } } if (goom_irand (goomInfo->gRandom, 5) != 0) goomInfo->update.zoomFilterData.noisify = 0; else { goomInfo->update.zoomFilterData.noisify = goom_irand (goomInfo->gRandom, 2) + 1; goomInfo->update.lockvar *= 2; } if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { goomInfo->update.zoomFilterData.vPlaneEffect = 0; goomInfo->update.zoomFilterData.hPlaneEffect = 0; goomInfo->update.zoomFilterData.noisify = 0; } if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int) goomInfo->screen.width - 1)) { goomInfo->update.zoomFilterData.vPlaneEffect = 0; if (goom_irand (goomInfo->gRandom, 2)) goomInfo->update.zoomFilterData.hPlaneEffect = 0; } if ((signed int) newvit < goomInfo->update.zoomFilterData.vitesse) { /* on accelere */ pzfd = &goomInfo->update.zoomFilterData; if (((newvit < STOP_SPEED - 7) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && (goomInfo->cycle % 3 == 0)) || (goom_irand (goomInfo->gRandom, 40) == 0)) { goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand (goomInfo->gRandom, 2) + goom_irand (goomInfo->gRandom, 2); goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; } else { goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; } goomInfo->update.lockvar += 50; } } if (goomInfo->update.lockvar > 150) { goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; goomInfo->update.switchMult = 1.0f; } } /* mode mega-lent */ if (goom_irand (goomInfo->gRandom, 700) == 0) { /* * printf ("coup du sort...\n") ; */ pzfd = &goomInfo->update.zoomFilterData; goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; goomInfo->update.zoomFilterData.pertedec = 8; goomInfo->update.zoomFilterData.sqrtperte = 16; goomInfo->update.goomvar = 1; goomInfo->update.lockvar += 50; goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; goomInfo->update.switchMult = 1.0f; } } /* * gros frein si la musique est calme */ if ((goomInfo->sound.speedvar < 0.01f) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) && (goomInfo->cycle % 16 == 0)) { pzfd = &goomInfo->update.zoomFilterData; goomInfo->update.zoomFilterData.vitesse += 3; goomInfo->update.zoomFilterData.pertedec = 8; goomInfo->update.zoomFilterData.sqrtperte = 16; goomInfo->update.goomvar = 0; } /* * baisser regulierement la vitesse... */ if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { pzfd = &goomInfo->update.zoomFilterData; goomInfo->update.zoomFilterData.vitesse++; } /* * arreter de decr�menter au bout d'un certain temps */ if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { pzfd = &goomInfo->update.zoomFilterData; goomInfo->update.zoomFilterData.pertedec = 8; goomInfo->update.zoomFilterData.sqrtperte = 16; } /* * Permet de forcer un effet. */ if ((forceMode > 0) && (forceMode <= NB_FX)) { pzfd = &goomInfo->update.zoomFilterData; pzfd->mode = forceMode - 1; } if (forceMode == -1) { pzfd = NULL; } /* * Changement d'effet de zoom ! */ if (pzfd != NULL) { int dif; goomInfo->update.cyclesSinceLastChange = 0; goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; if (dif < 0) dif = -dif; if (dif > 2) { goomInfo->update.switchIncr *= (dif + 2) / 2; } goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; goomInfo->update.switchMult = 1.0f; if (((goomInfo->sound.timeSinceLastGoom == 0) && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { goomInfo->update.switchIncr = 0; goomInfo->update.switchMult = goomInfo->update.switchMultAmount; } } else { if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { pzfd = &goomInfo->update.zoomFilterData; goomInfo->update.cyclesSinceLastChange = 0; } else goomInfo->update.cyclesSinceLastChange++; } #ifdef VERBOSE if (pzfd) { printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); } #endif /* Zoom here ! */ zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, goomInfo->update.switchIncr, goomInfo->update.switchMult); /* * Affichage tentacule */ goomInfo->tentacles_fx.apply (&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); goomInfo->star_fx.apply (&goomInfo->star_fx, goomInfo->p2, goomInfo->p1, goomInfo); /* * Gestion du Scope */ /* * arret demande */ if ((goomInfo->update.stop_lines & 0xf000) || (!goomInfo->curGState->drawScope)) { float param1, param2, amplitude; int couleur; int mode; choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude, 1); couleur = GML_BLACK; goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); goomInfo->update.stop_lines &= 0x0fff; } /* * arret aleatore.. changement de mode de ligne.. */ if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { goomInfo->update.lineMode--; if (goomInfo->update.lineMode == -1) goomInfo->update.lineMode = 0; } else if ((goomInfo->cycle % 80 == 0) && (goom_irand (goomInfo->gRandom, 5) == 0) && goomInfo->update.lineMode) goomInfo->update.lineMode--; if ((goomInfo->cycle % 120 == 0) && (goom_irand (goomInfo->gRandom, 4) == 0) && (goomInfo->curGState->drawScope)) { if (goomInfo->update.lineMode == 0) goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { float param1, param2, amplitude; int couleur1, couleur2; int mode; goomInfo->update.lineMode--; choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, &mode, &litude, goomInfo->update.stop_lines); couleur2 = 5 - couleur1; if (goomInfo->update.stop_lines) { goomInfo->update.stop_lines--; if (goom_irand (goomInfo->gRandom, 2)) couleur2 = couleur1 = GML_BLACK; } goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); } } /* * si on est dans un goom : afficher les lignes... */ if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { goomInfo->gmline2->power = goomInfo->gmline1->power; goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); if (((goomInfo->cycle % 121) == 9) && (goom_irand (goomInfo->gRandom, 3) == 1) && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { float param1, param2, amplitude; int couleur1, couleur2; int mode; choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, &mode, &litude, goomInfo->update.stop_lines); couleur2 = 5 - couleur1; if (goomInfo->update.stop_lines) { goomInfo->update.stop_lines--; if (goom_irand (goomInfo->gRandom, 2)) couleur2 = couleur1 = GML_BLACK; } goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); } } return_val = goomInfo->p1; tmp = goomInfo->p1; goomInfo->p1 = goomInfo->p2; goomInfo->p2 = tmp; /* affichage et swappage des buffers.. */ goomInfo->cycle++; goomInfo->convolve_fx.apply (&goomInfo->convolve_fx, return_val, goomInfo->outputBuf, goomInfo); return (guint32 *) goomInfo->outputBuf; } /**************************************** * CLOSE * ****************************************/ void goom_close (PluginInfo * goomInfo) { if (goomInfo->pixel != NULL) free (goomInfo->pixel); if (goomInfo->back != NULL) free (goomInfo->back); if (goomInfo->conv != NULL) free (goomInfo->conv); goomInfo->pixel = goomInfo->back = NULL; goomInfo->conv = NULL; goom_random_free (goomInfo->gRandom); goom_lines_free (&goomInfo->gmline1); goom_lines_free (&goomInfo->gmline2); /* release_ifs (); */ goomInfo->ifs_fx.free (&goomInfo->ifs_fx); goomInfo->convolve_fx.free (&goomInfo->convolve_fx); goomInfo->star_fx.free (&goomInfo->star_fx); goomInfo->tentacles_fx.free (&goomInfo->tentacles_fx); goomInfo->zoomFilter_fx.free (&goomInfo->zoomFilter_fx); plugin_info_free (goomInfo); free (goomInfo); } /* *** */ void choose_a_goom_line (PluginInfo * goomInfo, float *param1, float *param2, int *couleur, int *mode, float *amplitude, int far) { *mode = goom_irand (goomInfo->gRandom, 3); *amplitude = 1.0f; switch (*mode) { case GML_CIRCLE: if (far) { *param1 = *param2 = 0.47f; *amplitude = 0.8f; break; } if (goom_irand (goomInfo->gRandom, 3) == 0) { *param1 = *param2 = 0; *amplitude = 3.0f; } else if (goom_irand (goomInfo->gRandom, 2)) { *param1 = 0.40f * goomInfo->screen.height; *param2 = 0.22f * goomInfo->screen.height; } else { *param1 = *param2 = goomInfo->screen.height * 0.35; } break; case GML_HLINE: if (goom_irand (goomInfo->gRandom, 4) || far) { *param1 = goomInfo->screen.height / 7; *param2 = 6.0f * goomInfo->screen.height / 7.0f; } else { *param1 = *param2 = goomInfo->screen.height / 2.0f; *amplitude = 2.0f; } break; case GML_VLINE: if (goom_irand (goomInfo->gRandom, 3) || far) { *param1 = goomInfo->screen.width / 7.0f; *param2 = 6.0f * goomInfo->screen.width / 7.0f; } else { *param1 = *param2 = goomInfo->screen.width / 2.0f; *amplitude = 1.5f; } break; } *couleur = goom_irand (goomInfo->gRandom, 6); } gst-plugins-good-0.10.31/gst/goom/filters.c0000644000175000017500000005742611671175353015400 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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. */ // --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- /* filter.c version 0.7 * contient les filtres applicable a un buffer * creation : 01/10/2000 * -ajout de sinFilter() * -ajout de zoomFilter() * -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs * -optimisation de sinFilter (utilisant une table de sin) * -asm * -optimisation de la procedure de generation du buffer de transformation * la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] */ /* #define _DEBUG_PIXEL */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #include "goom_filters.h" #include "goom_graphic.h" #include "goom_tools.h" #include "goom_plugin_info.h" #include "goom_fx.h" #include "v3d.h" /* TODO : MOVE THIS AWAY !!! */ /* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ static inline void setPixelRGB (PluginInfo * goomInfo, Pixel * buffer, Uint x, Uint y, Color c) { Pixel i; i.channels.b = c.b; i.channels.g = c.v; i.channels.r = c.r; *(buffer + (x + y * goomInfo->screen.width)) = i; } static inline void setPixelRGB_ (Pixel * buffer, Uint x, Color c) { buffer[x].channels.r = c.r; buffer[x].channels.g = c.v; buffer[x].channels.b = c.b; } static inline void getPixelRGB (PluginInfo * goomInfo, Pixel * buffer, Uint x, Uint y, Color * c) { Pixel i = *(buffer + (x + y * goomInfo->screen.width)); c->b = i.channels.b; c->v = i.channels.g; c->r = i.channels.r; } static inline void getPixelRGB_ (Pixel * buffer, Uint x, Color * c) { Pixel i = *(buffer + x); c->b = i.channels.b; c->v = i.channels.g; c->r = i.channels.r; } /* END TODO */ /* DEPRECATED */ // retourne x>>s , en testant le signe de x //#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) //#define EFFECT_DISTORS 4 //#define EFFECT_DISTORS_SL 2 //#define INTERLACE_ADD 9 //#define INTERLACE_AND 0xf /* END DEPRECATED */ #define BUFFPOINTNB 16 #define BUFFPOINTNBF 16.0f #define BUFFPOINTMASK 0xffff #define sqrtperte 16 /* faire : a % sqrtperte <=> a & pertemask */ #define PERTEMASK 0xf /* faire : a / sqrtperte <=> a >> PERTEDEC */ #define PERTEDEC 4 /* pure c version of the zoom filter */ static void c_zoom (Pixel * expix1, Pixel * expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); /* simple wrapper to give it the same proto than the others */ void zoom_filter_c (int sizeX, int sizeY, Pixel * src, Pixel * dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { c_zoom (src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); } static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { PluginParam enabled_bp; PluginParameters params; unsigned int *coeffs, *freecoeffs; signed int *brutS, *freebrutS; /* source */ signed int *brutD, *freebrutD; /* dest */ signed int *brutT, *freebrutT; /* temp (en cours de generation) */ guint32 zoom_width; unsigned int prevX, prevY; float general_speed; int reverse; /* reverse the speed */ char theMode; int waveEffect; int hypercosEffect; int vPlaneEffect; int hPlaneEffect; char noisify; int middleX, middleY; int mustInitBuffers; int interlace_start; /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ int buffratio; int *firedec; /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; /** calculatePXandPY statics */ int wave; int wavesp; } ZoomFilterFXWrapperData; static inline void zoomVector (v2g * vecteur, ZoomFilterFXWrapperData * data, float X, float Y) { float vx, vy; float sq_dist = X * X + Y * Y; /* sx = (X < 0.0f) ? -1.0f : 1.0f; sy = (Y < 0.0f) ? -1.0f : 1.0f; */ float coefVitesse = (1.0f + data->general_speed) / 50.0f; // Effects /* Centralized FX */ switch (data->theMode) { case CRYSTAL_BALL_MODE: coefVitesse -= (sq_dist - 0.3f) / 15.0f; break; case AMULETTE_MODE: coefVitesse += sq_dist * 3.5f; break; case WAVE_MODE: coefVitesse += sin (sq_dist * 20.0f) / 100.0f; break; case SCRUNCH_MODE: coefVitesse += sq_dist / 10.0f; break; //case HYPERCOS1_MODE: break; //case HYPERCOS2_MODE: break; //case YONLY_MODE: break; case SPEEDWAY_MODE: coefVitesse *= 4.0f * Y; break; default: break; } if (coefVitesse < -2.01f) coefVitesse = -2.01f; if (coefVitesse > 2.01f) coefVitesse = 2.01f; vx = coefVitesse * X; vy = coefVitesse * Y; /* Amulette 2 */ // vx = X * tan(dist); // vy = Y * tan(dist); /* Rotate */ //vx = (X+Y)*0.1; //vy = (Y-X)*0.1; // Effects adds-on /* Noise */ if (data->noisify) { vx += (((float) rand ()) / ((float) RAND_MAX) - 0.5f) / 50.0f; vy += (((float) rand ()) / ((float) RAND_MAX) - 0.5f) / 50.0f; } /* Hypercos */ if (data->hypercosEffect) { vx += sin (Y * 10.0f) / 120.0f; vy += sin (X * 10.0f) / 120.0f; } /* H Plane */ if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; /* V Plane */ if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; /* TODO : Water Mode */ // if (data->waveEffect) vecteur->x = vx; vecteur->y = vy; } /* * Makes a stripe of a transform buffer (brutT) * * The transform is (in order) : * Translation (-data->middleX, -data->middleY) * Homothetie (Center : 0,0 Coeff : 2/data->prevX) */ static void makeZoomBufferStripe (ZoomFilterFXWrapperData * data, int INTERLACE_INCR) { // Position of the pixel to compute in pixmap coordinates Uint x, y; // Where (verticaly) to stop generating the buffer stripe int maxEnd; // Ratio from pixmap to normalized coordinates float ratio = 2.0f / ((float) data->prevX); // Ratio from normalized to virtual pixmap coordinates float inv_ratio = BUFFPOINTNBF / ratio; float min = ratio / BUFFPOINTNBF; // Y position of the pixel to compute in normalized coordinates float Y = ((float) (data->interlace_start - data->middleY)) * ratio; maxEnd = data->prevY; if (maxEnd > (data->interlace_start + INTERLACE_INCR)) maxEnd = (data->interlace_start + INTERLACE_INCR); for (y = data->interlace_start; (y < data->prevY) && ((signed int) y < maxEnd); y++) { Uint premul_y_prevX = y * data->prevX * 2; float X = -((float) data->middleX) * ratio; for (x = 0; x < data->prevX; x++) { v2g vector; zoomVector (&vector, data, X, Y); /* Finish and avoid null displacement */ if (fabs (vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; if (fabs (vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; data->brutT[premul_y_prevX] = ((int) ((X - vector.x) * inv_ratio) + ((int) (data->middleX * BUFFPOINTNB))); data->brutT[premul_y_prevX + 1] = ((int) ((Y - vector.y) * inv_ratio) + ((int) (data->middleY * BUFFPOINTNB))); premul_y_prevX += 2; X += ratio; } Y += ratio; } data->interlace_start += INTERLACE_INCR; if (y >= data->prevY - 1) data->interlace_start = -1; } /* * calculer px et py en fonction de x,y,middleX,middleY et theMode * px et py indique la nouvelle position (en sqrtperte ieme de pixel) * (valeur * 16) inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) { if (data->theMode == WATER_MODE) { int yy; yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; if (yy < 0) yy = 0; if (yy >= (signed int)goomInfo->screen.height) yy = goomInfo->screen.height - 1; *px = (x << 4) + data->firedec[yy] + (data->wave / 10); *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); if (data->wave < -10) data->wavesp += 2; if (data->wave > 10) data->wavesp -= 2; data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); if (data->wavesp > 100) data->wavesp = (data->wavesp * 9) / 10; } else { int dist = 0, vx9, vy9; int vx, vy; int ppx, ppy; int fvitesse = data->vitesse << 4; if (data->noisify) { x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); } vx = (x - data->middleX) << 9; vy = (y - data->middleY) << 9; if (data->hPlaneEffect) vx += data->hPlaneEffect * (y - data->middleY); if (data->vPlaneEffect) vy += data->vPlaneEffect * (x - data->middleX); if (data->waveEffect) { fvitesse *= 1024 + ShiftRight (goomInfo->sintable [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); fvitesse /= 1024; } if (data->hypercosEffect) { vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); } vx9 = ShiftRight (vx, 9); vy9 = ShiftRight (vy, 9); dist = vx9 * vx9 + vy9 * vy9; switch (data->theMode) { case WAVE_MODE: fvitesse *= 1024 + ShiftRight (goomInfo->sintable [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); fvitesse>>=10; break; case CRYSTAL_BALL_MODE: fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); break; case AMULETTE_MODE: fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); break; case SCRUNCH_MODE: fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); break; case HYPERCOS1_MODE: vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); break; case HYPERCOS2_MODE: vx = vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); vy = vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); fvitesse = 128 << 4; break; case YONLY_MODE: fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); fvitesse >>= 10; break; case SPEEDWAY_MODE: fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); break; } if (fvitesse < -3024) fvitesse = -3024; if (vx < 0) // pb avec decalage sur nb negatif ppx = -(-(vx * fvitesse) >> 16); // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) // * * * * * 9 = nb chiffre virgule de vx) else ppx = ((vx * fvitesse) >> 16); if (vy < 0) ppy = -(-(vy * fvitesse) >> 16); else ppy = ((vy * fvitesse) >> 16); *px = (data->middleX << 4) + ppx; *py = (data->middleY << 4) + ppy; } } */ static void c_zoom (Pixel * expix1, Pixel * expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[16][16]) { int myPos, myPos2; Color couleur; unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; int bufsize = prevX * prevY * 2; int bufwidth = prevX; expix1[0].val = expix1[prevX - 1].val = expix1[prevX * prevY - 1].val = expix1[prevX * prevY - prevX].val = 0; for (myPos = 0; myPos < bufsize; myPos += 2) { Color col1, col2, col3, col4; int c1, c2, c3, c4, px, py; int pos; int coeffs; int brutSmypos = brutS[myPos]; myPos2 = myPos + 1; px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); brutSmypos = brutS[myPos2]; py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); if ((py >= ay) || (px >= ax)) { pos = coeffs = 0; } else { pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); /* coef en modulo 15 */ coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; } getPixelRGB_ (expix1, pos, &col1); getPixelRGB_ (expix1, pos + 1, &col2); getPixelRGB_ (expix1, pos + bufwidth, &col3); getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); c1 = coeffs; c2 = (c1 >> 8) & 0xFF; c3 = (c1 >> 16) & 0xFF; c4 = (c1 >> 24) & 0xFF; c1 = c1 & 0xff; couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; if (couleur.r > 5) couleur.r -= 5; couleur.r >>= 8; couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; if (couleur.v > 5) couleur.v -= 5; couleur.v >>= 8; couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; if (couleur.b > 5) couleur.b -= 5; couleur.b >>= 8; setPixelRGB_ (expix2, myPos >> 1, couleur); } } /** generate the water fx horizontal direction buffer */ static void generateTheWaterFXHorizontalDirectionBuffer (PluginInfo * goomInfo, ZoomFilterFXWrapperData * data) { int loopv; int decc = goom_irand (goomInfo->gRandom, 8) - 4; int spdc = goom_irand (goomInfo->gRandom, 8) - 4; int accel = goom_irand (goomInfo->gRandom, 8) - 4; for (loopv = data->prevY; loopv != 0;) { loopv--; data->firedec[loopv] = decc; decc += spdc / 10; spdc += goom_irand (goomInfo->gRandom, 3) - goom_irand (goomInfo->gRandom, 3); if (decc > 4) spdc -= 1; if (decc < -4) spdc += 1; if (spdc > 30) spdc = spdc - goom_irand (goomInfo->gRandom, 3) + accel / 10; if (spdc < -30) spdc = spdc + goom_irand (goomInfo->gRandom, 3) + accel / 10; if (decc > 8 && spdc > 1) spdc -= goom_irand (goomInfo->gRandom, 3) - 2; if (decc < -8 && spdc < -1) spdc += goom_irand (goomInfo->gRandom, 3) + 2; if (decc > 8 || decc < -8) decc = decc * 8 / 9; accel += goom_irand (goomInfo->gRandom, 2) - goom_irand (goomInfo->gRandom, 2); if (accel > 20) accel -= 2; if (accel < -20) accel += 2; } } /** * Main work for the dynamic displacement map. * * Reads data from pix1, write to pix2. * * Useful datas for this FX are stored in ZoomFilterData. * * If you think that this is a strange function name, let me say that a long time ago, * there has been a slow version and a gray-level only one. Then came these function, * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. * So that is why you have this name, for the nostalgy of the first days of goom * when it was just a tiny program writen in Turbo Pascal on my i486... */ void zoomFilterFastRGB (PluginInfo * goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) { Uint x, y; ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData *) goomInfo->zoomFilter_fx.fx_data; if (!BVAL (data->enabled_bp)) return; /** changement de taille **/ if ((data->prevX != resx) || (data->prevY != resy)) { data->prevX = resx; data->prevY = resy; if (data->brutS) free (data->freebrutS); data->brutS = 0; if (data->brutD) free (data->freebrutD); data->brutD = 0; if (data->brutT) free (data->freebrutT); data->brutT = 0; data->middleX = resx / 2; data->middleY = resy / 2; data->mustInitBuffers = 1; if (data->firedec) free (data->firedec); data->firedec = 0; } if (data->interlace_start != -2) zf = NULL; /** changement de config **/ if (zf) { data->reverse = zf->reverse; data->general_speed = (float) (zf->vitesse - 128) / 128.0f; if (data->reverse) data->general_speed = -data->general_speed; data->middleX = zf->middleX; data->middleY = zf->middleY; data->theMode = zf->mode; data->hPlaneEffect = zf->hPlaneEffect; data->vPlaneEffect = zf->vPlaneEffect; data->waveEffect = zf->waveEffect; data->hypercosEffect = zf->hypercosEffect; data->noisify = zf->noisify; data->interlace_start = 0; } if (data->mustInitBuffers) { data->mustInitBuffers = 0; data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof (unsigned int)); data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof (unsigned int)); data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof (unsigned int)); data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); data->buffratio = 0; data->firedec = (int *) malloc (data->prevY * sizeof (int)); generateTheWaterFXHorizontalDirectionBuffer (goomInfo, data); data->interlace_start = 0; makeZoomBufferStripe (data, resy); /* Copy the data from temp to dest and source */ memcpy (data->brutS, data->brutT, resx * resy * 2 * sizeof (int)); memcpy (data->brutD, data->brutT, resx * resy * 2 * sizeof (int)); } /* generation du buffer de trans */ if (data->interlace_start == -1) { /* sauvegarde de l'etat actuel dans la nouvelle source * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ y = data->prevX * data->prevY * 2; for (x = 0; x < y; x += 2) { int brutSmypos = data->brutS[x]; int x2 = x + 1; data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); brutSmypos = data->brutS[x2]; data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); } data->buffratio = 0; } if (data->interlace_start == -1) { signed int *tmp; tmp = data->brutD; data->brutD = data->brutT; data->brutT = tmp; tmp = data->freebrutD; data->freebrutD = data->freebrutT; data->freebrutT = tmp; data->interlace_start = -2; } if (data->interlace_start >= 0) { /* creation de la nouvelle destination */ makeZoomBufferStripe (data, resy / 16); } if (switchIncr != 0) { data->buffratio += switchIncr; if (data->buffratio > BUFFPOINTMASK) data->buffratio = BUFFPOINTMASK; } if (switchMult != 1.0f) { data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + (float) data->buffratio * switchMult); } data->zoom_width = data->prevX; goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, data->brutS, data->brutD, data->buffratio, data->precalCoef); } static void generatePrecalCoef (int precalCoef[16][16]) { int coefh, coefv; for (coefh = 0; coefh < 16; coefh++) { for (coefv = 0; coefv < 16; coefv++) { int i; int diffcoeffh; int diffcoeffv; diffcoeffh = sqrtperte - coefh; diffcoeffv = sqrtperte - coefv; if (!(coefh || coefv)) { i = 255; } else { int i1, i2, i3, i4; i1 = diffcoeffh * diffcoeffv; i2 = coefh * diffcoeffv; i3 = diffcoeffh * coefv; i4 = coefh * coefv; // TODO: faire mieux... if (i1) i1--; if (i2) i2--; if (i3) i3--; if (i4) i4--; i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); } precalCoef[coefh][coefv] = i; } } } /* VisualFX Wrapper */ static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo * info) { ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData *) malloc (sizeof (ZoomFilterFXWrapperData)); data->coeffs = 0; data->freecoeffs = 0; data->brutS = 0; data->freebrutS = 0; data->brutD = 0; data->freebrutD = 0; data->brutT = 0; data->freebrutT = 0; data->prevX = 0; data->prevY = 0; data->mustInitBuffers = 1; data->interlace_start = -2; data->general_speed = 0.0f; data->reverse = 0; data->theMode = AMULETTE_MODE; data->waveEffect = 0; data->hypercosEffect = 0; data->vPlaneEffect = 0; data->hPlaneEffect = 0; data->noisify = 2; /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ data->buffratio = 0; data->firedec = 0; data->wave = data->wavesp = 0; secure_b_param (&data->enabled_bp, "Enabled", 1); plugin_parameters (&data->params, "Zoom Filter", 1); data->params.params[0] = &data->enabled_bp; _this->params = &data->params; _this->fx_data = (void *) data; /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ generatePrecalCoef (data->precalCoef); } static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) { ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData *) _this->fx_data; if (data->freebrutT) free (data->freebrutT); if (data->freebrutS) free (data->freebrutS); if (data->freebrutD) free (data->freebrutD); if (data->firedec) free (data->firedec); goom_plugin_parameters_free (_this->params); free (_this->fx_data); } static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel * src, Pixel * dest, PluginInfo * info) { } void zoomFilterVisualFXWrapper_create (VisualFX * fx) { fx->init = zoomFilterVisualFXWrapper_init; fx->free = zoomFilterVisualFXWrapper_free; fx->apply = zoomFilterVisualFXWrapper_apply; fx->params = NULL; fx->fx_data = NULL; } /* TODO : MOVE THIS AWAY */ void pointFilter (PluginInfo * goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) { Uint x = (Uint) ((int) (goomInfo->screen.width / 2) + (int) (t1 * cos ((float) cycle / t3))); Uint y = (Uint) ((int) (goomInfo->screen.height / 2) + (int) (t2 * sin ((float) cycle / t4))); if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { setPixelRGB (goomInfo, pix1, x + 1, y, c); setPixelRGB (goomInfo, pix1, x, y + 1, c); setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); } } gst-plugins-good-0.10.31/gst/goom/config_param.c0000644000175000017500000000567611671175353016355 00000000000000/* Goom Project * Copyright (C) <2003> Jean-Christophe Hoelt * * 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 "goom_config_param.h" #include /* TODO: Ajouter goom_ devant ces fonctions */ static void empty_fct (PluginParam * dummy) { } void goom_secure_param (PluginParam * p) { p->changed = empty_fct; p->change_listener = empty_fct; p->user_data = 0; p->name = p->desc = 0; p->rw = 1; } void goom_secure_f_param (PluginParam * p, const char *name) { secure_param (p); p->name = name; p->type = PARAM_FLOATVAL; FVAL (*p) = 0.5f; FMIN (*p) = 0.0f; FMAX (*p) = 1.0f; FSTEP (*p) = 0.01f; } void goom_secure_f_feedback (PluginParam * p, const char *name) { secure_f_param (p, name); p->rw = 0; } void goom_secure_s_param (PluginParam * p, const char *name) { secure_param (p); p->name = name; p->type = PARAM_STRVAL; SVAL (*p) = 0; } void goom_secure_b_param (PluginParam * p, const char *name, int value) { secure_param (p); p->name = name; p->type = PARAM_BOOLVAL; BVAL (*p) = value; } void goom_secure_i_param (PluginParam * p, const char *name) { secure_param (p); p->name = name; p->type = PARAM_INTVAL; IVAL (*p) = 50; IMIN (*p) = 0; IMAX (*p) = 100; ISTEP (*p) = 1; } void goom_secure_i_feedback (PluginParam * p, const char *name) { secure_i_param (p, name); p->rw = 0; } void goom_plugin_parameters (PluginParameters * p, const char *name, int nb) { p->name = name; p->desc = ""; p->nbParams = nb; p->params = malloc (nb * sizeof (PluginParam *)); } void goom_plugin_parameters_free (PluginParameters * p) { free (p->params); } /*---------------------------------------------------------------------------*/ void goom_set_str_param_value (PluginParam * p, const char *str) { int len = strlen (str); if (SVAL (*p)) SVAL (*p) = (char *) realloc (SVAL (*p), len + 1); else SVAL (*p) = (char *) malloc (len + 1); memcpy (SVAL (*p), str, len + 1); } void goom_set_list_param_value (PluginParam * p, const char *str) { int len = strlen (str); #ifdef VERBOSE printf ("%s: %d\n", str, len); #endif if (LVAL (*p)) LVAL (*p) = (char *) realloc (LVAL (*p), len + 1); else LVAL (*p) = (char *) malloc (len + 1); memcpy (LVAL (*p), str, len + 1); } gst-plugins-good-0.10.31/gst/goom/tentacle3d.c0000644000175000017500000002217211671175353015744 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 #include "v3d.h" #include "surf3d.h" #include "goom_tools.h" #include "goom_config.h" #include "goom_plugin_info.h" #include "tentacle3d.h" #define D 256.0f #define nbgrid 6 #define definitionx 15 #define definitionz 45 typedef struct _TENTACLE_FX_DATA { PluginParam enabled_bp; PluginParameters params; float cycle; grid3d *grille[nbgrid]; float *vals; #define NB_TENTACLE_COLORS 4 int colors[NB_TENTACLE_COLORS]; int col; int dstcol; float lig; float ligs; /* statics from pretty_move */ float distt; float distt2; float rot; /* entre 0 et 2 * G_PI */ int happens; int rotation; int lock; } TentacleFXData; static void tentacle_new (TentacleFXData * data); static void tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, int W, int H, short[2][512], float, int drawit, TentacleFXData * data); static void tentacle_free (TentacleFXData * data); /* * VisualFX wrapper for the tentacles */ static void tentacle_fx_init (VisualFX * _this, PluginInfo * info) { TentacleFXData *data = (TentacleFXData *) malloc (sizeof (TentacleFXData)); secure_b_param (&data->enabled_bp, "Enabled", 1); plugin_parameters (&data->params, "3D Tentacles", 1); data->params.params[0] = &data->enabled_bp; data->cycle = 0.0f; data->col = (0x28 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x5f << (BLEU * 8)); data->dstcol = 0; data->lig = 1.15f; data->ligs = 0.1f; data->distt = 10.0f; data->distt2 = 0.0f; data->rot = 0.0f; /* entre 0 et 2 * G_PI */ data->happens = 0; data->rotation = 0; data->lock = 0; data->colors[0] = (0x18 << (ROUGE * 8)) | (0x4c << (VERT * 8)) | (0x2f << (BLEU * 8)); data->colors[1] = (0x48 << (ROUGE * 8)) | (0x2c << (VERT * 8)) | (0x6f << (BLEU * 8)); data->colors[2] = (0x58 << (ROUGE * 8)) | (0x3c << (VERT * 8)) | (0x0f << (BLEU * 8)); data->colors[3] = (0x87 << (ROUGE * 8)) | (0x55 << (VERT * 8)) | (0x74 << (BLEU * 8)); tentacle_new (data); _this->params = &data->params; _this->fx_data = (void *) data; } static void tentacle_fx_apply (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * goomInfo) { TentacleFXData *data = (TentacleFXData *) _this->fx_data; if (BVAL (data->enabled_bp)) { tentacle_update (goomInfo, dest, src, goomInfo->screen.width, goomInfo->screen.height, goomInfo->sound.samples, (float) goomInfo->sound.accelvar, goomInfo->curGState->drawTentacle, data); } } static void tentacle_fx_free (VisualFX * _this) { tentacle_free ((TentacleFXData *) _this->fx_data); free (_this->fx_data); } void tentacle_fx_create (VisualFX * fx) { fx->init = tentacle_fx_init; fx->apply = tentacle_fx_apply; fx->free = tentacle_fx_free; fx->fx_data = NULL; fx->params = NULL; } /* ----- */ static void tentacle_free (TentacleFXData * data) { int tmp; /* FREE GRID */ for (tmp = 0; tmp < nbgrid; tmp++) grid3d_free (data->grille[tmp]); free (data->vals); goom_plugin_parameters_free (&data->params); } static void tentacle_new (TentacleFXData * data) { int tmp; v3d center = { 0, -17.0, 0 }; data->vals = (float *) malloc ((definitionx + 20) * sizeof (float)); for (tmp = 0; tmp < nbgrid; tmp++) { int x, z; z = 45 + rand () % 30; x = 85 + rand () % 5; center.z = z; data->grille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand () % 10, center); center.y += 8; } } static inline unsigned char lighten (unsigned char value, float power) { int val = value; float t = (float) val * log10 (power) / 2.0; if (t > 0) { val = (int) t; /* (32.0f * log (t)); */ if (val > 255) val = 255; if (val < 0) val = 0; return val; } else { return 0; } } static void lightencolor (int *col, float power) { unsigned char *color; color = (unsigned char *) col; *color = lighten (*color, power); color++; *color = lighten (*color, power); color++; *color = lighten (*color, power); color++; *color = lighten (*color, power); } /* retourne x>>s , en testant le signe de x */ #define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) static int evolutecolor (unsigned int src, unsigned int dest, unsigned int mask, unsigned int incr) { int color = src & (~mask); src &= mask; dest &= mask; if ((src != mask) && (src < dest)) src += incr; if (src > dest) src -= incr; return (src & mask) | color; } static void pretty_move (PluginInfo * goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData * fx_data) { float tmp; /* many magic numbers here... I don't really like that. */ if (fx_data->happens) fx_data->happens -= 1; else if (fx_data->lock == 0) { fx_data->happens = goom_irand (goomInfo->gRandom, 200) ? 0 : 100 + goom_irand (goomInfo->gRandom, 60); fx_data->lock = fx_data->happens * 3 / 2; } else fx_data->lock--; tmp = fx_data->happens ? 8.0f : 0; *dist2 = fx_data->distt2 = (tmp + 15.0f * fx_data->distt2) / 16.0f; tmp = 30 + D - 90.0f * (1.0f + sin (cycle * 19 / 20)); if (fx_data->happens) tmp *= 0.6f; *dist = fx_data->distt = (tmp + 3.0f * fx_data->distt) / 4.0f; if (!fx_data->happens) { tmp = G_PI * sin (cycle) / 32 + 3 * G_PI / 2; } else { fx_data->rotation = goom_irand (goomInfo->gRandom, 500) ? fx_data->rotation : goom_irand (goomInfo->gRandom, 2); if (fx_data->rotation) cycle *= 2.0f * G_PI; else cycle *= -1.0f * G_PI; tmp = cycle - (G_PI * 2.0) * floor (cycle / (G_PI * 2.0)); } if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * G_PI))) { fx_data->rot = (tmp + 15.0f * (fx_data->rot + 2 * G_PI)) / 16.0f; if (fx_data->rot > 2.0 * G_PI) fx_data->rot -= 2.0 * G_PI; *rotangle = fx_data->rot; } else if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot - 2.0 * G_PI))) { fx_data->rot = (tmp + 15.0f * (fx_data->rot - 2.0 * G_PI)) / 16.0f; if (fx_data->rot < 0.0f) fx_data->rot += 2.0 * G_PI; *rotangle = fx_data->rot; } else *rotangle = fx_data->rot = (tmp + 15.0f * fx_data->rot) / 16.0f; } static void tentacle_update (PluginInfo * goomInfo, Pixel * buf, Pixel * back, int W, int H, short data[2][512], float rapport, int drawit, TentacleFXData * fx_data) { int tmp; int tmp2; int color; int colorlow; float dist, dist2, rotangle; if ((!drawit) && (fx_data->ligs > 0.0f)) fx_data->ligs = -fx_data->ligs; fx_data->lig += fx_data->ligs; if (fx_data->lig > 1.01f) { if ((fx_data->lig > 10.0f) | (fx_data->lig < 1.1f)) fx_data->ligs = -fx_data->ligs; if ((fx_data->lig < 6.3f) && (goom_irand (goomInfo->gRandom, 30) == 0)) fx_data->dstcol = goom_irand (goomInfo->gRandom, NB_TENTACLE_COLORS); fx_data->col = evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff, 0x01); fx_data->col = evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff00, 0x0100); fx_data->col = evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff0000, 0x010000); fx_data->col = evolutecolor (fx_data->col, fx_data->colors[fx_data->dstcol], 0xff000000, 0x01000000); color = fx_data->col; colorlow = fx_data->col; lightencolor (&color, fx_data->lig * 2.0f + 2.0f); lightencolor (&colorlow, (fx_data->lig / 3.0f) + 0.67f); rapport = 1.0f + 2.0f * (rapport - 1.0f); rapport *= 1.2f; if (rapport > 1.12f) rapport = 1.12f; pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); for (tmp = 0; tmp < nbgrid; tmp++) { for (tmp2 = 0; tmp2 < definitionx; tmp2++) { float val = (float) (ShiftRight (data[0][goom_irand (goomInfo->gRandom, 511)], 10)) * rapport; fx_data->vals[tmp2] = val; } grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); } fx_data->cycle += 0.01f; for (tmp = 0; tmp < nbgrid; tmp++) grid3d_draw (goomInfo, fx_data->grille[tmp], color, colorlow, dist, buf, back, W, H); } else { fx_data->lig = 1.05f; if (fx_data->ligs < 0.0f) fx_data->ligs = -fx_data->ligs; pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); fx_data->cycle += 0.1f; if (fx_data->cycle > 1000) fx_data->cycle = 0; } } gst-plugins-good-0.10.31/gst/goom/tentacle3d.h0000644000175000017500000000163211671175353015747 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _TENTACLE3D_H #define _TENTACLE3D_H #include "goom_visual_fx.h" void tentacle_fx_create(VisualFX *fx); #endif gst-plugins-good-0.10.31/gst/goom/Makefile.am0000644000175000017500000000367711671175353015617 00000000000000 plugin_LTLIBRARIES = libgstgoom.la PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s ppc_drawings.h ppc_zoom_ultimate.h MMX_FILES=mmx.c xmmx.c mmx.h xmmx.h if HAVE_CPU_PPC # disable until someone figures out how to build these correctly on ppc #ARCH_FILES = $(PPC_FILES) ARCH_FILES = endif if HAVE_CPU_PPC64 # disable until someone figures out how to build these correctly on ppc #ARCH_FILES = $(PPC_FILES) ARCH_FILES = endif if HAVE_CPU_I386 ARCH_FILES = $(MMX_FILES) ARCH_CFLAGS = -DBUILD_MMX endif libgstgoom_la_SOURCES = \ gstgoom.c gstgoom.h \ drawmethods.c drawmethods.h \ sound_tester.c sound_tester.h \ mathtools.c mathtools.h \ lines.c lines.h ifs.c ifs.h surf3d.c surf3d.h \ tentacle3d.c tentacle3d.h v3d.c v3d.h \ convolve_fx.c flying_stars_fx.c \ goom_fx.h goom_visual_fx.h \ motif_goom1.h motif_goom2.h \ plugin_info.c goom_plugin_info.h \ goom_tools.c \ config_param.c filters.c goom_core.c graphic.c \ goom.h goom_typedefs.h goom_graphic.h \ goom_config_param.h goom_visual_fx.h goom_filters.h \ goom_tools.h goom_tools.h goom_config.h \ $(ARCH_FILES) libgstgoom_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) $(ARCH_CFLAGS) $(ORC_CFLAGS) libgstgoom_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ORC_LIBS) libgstgoom_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgoom_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = $(PPC_FILES) $(MMX_FILES) .NOTPARALLEL: Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstgoom -:SHARED libgstgoom \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstgoom_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom_la_CFLAGS) \ -:LDFLAGS $(libgstgoom_la_LDFLAGS) \ $(libgstgoom_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/goom/goom.h0000644000175000017500000000262511671175353014665 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _GOOMCORE_H #define _GOOMCORE_H #include "goom_config.h" #include "goom_plugin_info.h" #define NB_FX 10 PluginInfo *goom_init (guint32 resx, guint32 resy); void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); /* * forceMode == 0 : do nothing * forceMode == -1 : lock the FX * forceMode == 1..NB_FX : force a switch to FX n# forceMode */ guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps); /* returns 0 if the buffer wasn't accepted */ int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); void goom_close (PluginInfo *goomInfo); #endif gst-plugins-good-0.10.31/gst/goom/lines.c0000644000175000017500000001435711671175353015036 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "lines.h" #include #include #include #include "goom_tools.h" #include "drawmethods.h" #include "goom_plugin_info.h" static inline unsigned char lighten (unsigned char value, float power) { int val = value; float t = (float) val * log10 (power) / 2.0; if (t > 0) { val = (int) t; /* (32.0f * log (t)); */ if (val > 255) val = 255; if (val < 0) val = 0; return val; } else { return 0; } } static void lightencolor (guint32 * col, float power) { unsigned char *color; color = (unsigned char *) col; *color = lighten (*color, power); color++; *color = lighten (*color, power); color++; *color = lighten (*color, power); color++; *color = lighten (*color, power); } static void genline (int id, float param, GMUnitPointer * l, int rx, int ry) { int i; switch (id) { case GML_HLINE: for (i = 0; i < 512; i++) { l[i].x = ((float) i * rx) / 512.0f; l[i].y = param; l[i].angle = G_PI / 2.0f; } return; case GML_VLINE: for (i = 0; i < 512; i++) { l[i].y = ((float) i * ry) / 512.0f; l[i].x = param; l[i].angle = 0.0f; } return; case GML_CIRCLE: for (i = 0; i < 512; i++) { float cosa, sina; l[i].angle = 2.0f * G_PI * (float) i / 512.0f; cosa = param * cos (l[i].angle); sina = param * sin (l[i].angle); l[i].x = ((float) rx / 2.0f) + cosa; l[i].y = (float) ry / 2.0f + sina; } return; } } static guint32 getcouleur (int mode) { switch (mode) { case GML_RED: return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); case GML_ORANGE_J: return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); case GML_ORANGE_V: return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); case GML_BLEUBLANC: return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); case GML_VERT: return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); case GML_BLEU: return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); case GML_BLACK: return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); } return 0; } void goom_lines_set_res (GMLine * gml, int rx, int ry) { if (gml != NULL) { gml->screenX = rx; gml->screenY = ry; genline (gml->IDdest, gml->param, gml->points2, rx, ry); } } static void goom_lines_move (GMLine * l) { int i; unsigned char *c1, *c2; for (i = 0; i < 512; i++) { l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; l->points[i].angle = (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; } c1 = (unsigned char *) &l->color; c2 = (unsigned char *) &l->color2; for (i = 0; i < 4; i++) { int cc1, cc2; cc1 = *c1; cc2 = *c2; *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); ++c1; ++c2; } l->power += l->powinc; if (l->power < 1.1f) { l->power = 1.1f; l->powinc = (float) (goom_irand (l->goomInfo->gRandom, 20) + 10) / 300.0f; } if (l->power > 17.5f) { l->power = 17.5f; l->powinc = -(float) (goom_irand (l->goomInfo->gRandom, 20) + 10) / 300.0f; } l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; } void goom_lines_switch_to (GMLine * gml, int IDdest, float param, float amplitude, int col) { genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); gml->IDdest = IDdest; gml->param = param; gml->amplitudeF = amplitude; gml->color2 = getcouleur (col); } GMLine * goom_lines_init (PluginInfo * goomInfo, int rx, int ry, int IDsrc, float paramS, int coulS, int IDdest, float paramD, int coulD) { GMLine *l = (GMLine *) malloc (sizeof (GMLine)); l->goomInfo = goomInfo; l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); l->nbPoints = 512; l->IDdest = IDdest; l->param = paramD; l->amplitude = l->amplitudeF = 1.0f; genline (IDsrc, paramS, l->points, rx, ry); genline (IDdest, paramD, l->points2, rx, ry); l->color = getcouleur (coulS); l->color2 = getcouleur (coulD); l->screenX = rx; l->screenY = ry; l->power = 0.0f; l->powinc = 0.01f; goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); return l; } void goom_lines_free (GMLine ** l) { free ((*l)->points2); free ((*l)->points); free (*l); l = NULL; } void goom_lines_draw (PluginInfo * plug, GMLine * line, gint16 data[512], Pixel * p) { if (line != NULL) { int i, x1, y1; guint32 color = line->color; GMUnitPointer *pt = &(line->points[0]); float cosa = cos (pt->angle) / 1000.0f; float sina = sin (pt->angle) / 1000.0f; lightencolor (&color, line->power); x1 = (int) (pt->x + cosa * line->amplitude * data[0]); y1 = (int) (pt->y + sina * line->amplitude * data[0]); for (i = 1; i < 512; i++) { int x2, y2; GMUnitPointer *pt = &(line->points[i]); float cosa = cos (pt->angle) / 1000.0f; float sina = sin (pt->angle) / 1000.0f; x2 = (int) (pt->x + cosa * line->amplitude * data[i]); y2 = (int) (pt->y + sina * line->amplitude * data[i]); plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); x1 = x2; y1 = y2; } goom_lines_move (line); } } gst-plugins-good-0.10.31/gst/goom/v3d.h0000644000175000017500000000366211671175353014422 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _V3D_H #define _V3D_H #include #include #include #include "mathtools.h" typedef struct { float x,y,z; } v3d; typedef struct { int x,y; } v2d; typedef struct { double x,y; } v2g; /* * projete le vertex 3D sur le plan d'affichage * retourne (0,0) si le point ne doit pas etre affiche. * * bonne valeur pour distance : 256 */ #define V3D_TO_V2D(v3,v2,width,height,distance) \ { \ int Xp, Yp; \ if (v3.z > 2) { \ F2I((distance * v3.x / v3.z),Xp) ; \ F2I((distance * v3.y / v3.z),Yp) ; \ v2.x = Xp + (width>>1); \ v2.y = -Yp + (height>>1); \ } \ else v2.x=v2.y=-666; \ } void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); /* * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) * centerz = centre de rotation en z */ #define Y_ROTATE_V3D(vi,vf,sina,cosa)\ {\ vf.x = vi.x * cosa - vi.z * sina;\ vf.z = vi.x * sina + vi.z * cosa;\ vf.y = vi.y;\ } /* * translation */ #define TRANSLATE_V3D(vsrc,vdest)\ {\ vdest.x += vsrc.x;\ vdest.y += vsrc.y;\ vdest.z += vsrc.z;\ } #define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} #endif gst-plugins-good-0.10.31/gst/goom/xmmx.c0000644000175000017500000002466111671175353014714 00000000000000/* xmmx.c eXtended MultiMedia eXtensions GCC interface library for IA32. To use this library, simply include this header file and compile with GCC. You MUST have inlining enabled in order for xmmx_ok() to work; this can be done by simply using -O on the GCC command line. Compiling with -DXMMX_TRACE will cause detailed trace output to be sent to stderr for each mmx operation. This adds lots of code, and obviously slows execution to a crawl, but can be very useful for debugging. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. 1999 by R. Fisher Based on libmmx, 1997-99 by H. Dietz and R. Fisher Notes: It appears that the latest gas has the pand problem fixed, therefore I'll undefine BROKEN_PAND by default. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "goom_config.h" #ifdef HAVE_MMX /* a definir pour avoir exactement le meme resultat que la fonction C * (un chouillat plus lent).. mais la difference est assez peu notable. */ // #define STRICT_COMPAT #define BUFFPOINTNB 16 #define BUFFPOINTMASK 0xffff #define BUFFINCR 0xff #define sqrtperte 16 /* faire : a % sqrtperte <=> a & pertemask*/ #define PERTEMASK 0xf /* faire : a / sqrtperte <=> a >> PERTEDEC*/ #define PERTEDEC 4 /*#define MMX_TRACE*/ #include "mmx.h" /*#include "xmmx.h"*/ #include "goom_graphic.h" int xmmx_supported (void) { return (mm_support () & 0x8) >> 3; } void zoom_filter_xmmx (int prevX, int prevY, Pixel * expix1, Pixel * expix2, int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]) { int bufsize = prevX * prevY; /* taille du buffer */ volatile int loop; /* variable de boucle */ mmx_t *brutS = (mmx_t *) lbruS; /* buffer de transformation source */ mmx_t *brutD = (mmx_t *) lbruD; /* buffer de transformation dest */ volatile mmx_t prevXY; volatile mmx_t ratiox; /* volatile mmx_t interpix; */ expix1[0].val = expix1[prevX - 1].val = expix1[prevX * prevY - 1].val = expix1[prevX * prevY - prevX].val = 0; prevXY.ud[0] = (prevX - 1) << PERTEDEC; prevXY.ud[1] = (prevY - 1) << PERTEDEC; ratiox.d[0] = buffratio; ratiox.d[1] = buffratio; asm volatile ("\n\t movq %[ratio], %%mm6" "\n\t pslld $16, %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */ "\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ ::[ratio] "m" (ratiox)); loop = 0; /* * NOTE : mm6 et mm7 ne sont pas modifies dans la boucle. */ while (loop < bufsize) { /* Thread #1 * pre : mm6 = [rat16|rat16] * post : mm0 = S + ((D-S)*rat16 format [X|Y] * modified = mm0,mm1,mm2 */ asm volatile ("#1 \n\t movq 0(%[brutS]), %%mm0" "#1 \n\t movq 0(%[brutD]), %%mm1" "#1 \n\t psubd %%mm0, %%mm1" /* mm1 = D - S */ "#1 \n\t movq %%mm1, %%mm2" /* mm2 = D - S */ "#1 \n\t pslld $16, %%mm1" "#1 \n\t pmullw %%mm6, %%mm2" "#1 \n\t pmulhuw %%mm6, %%mm1" "#1 \n\t pslld $16, %%mm0" "#1 \n\t paddd %%mm2, %%mm1" /* mm1 = (D - S) * buffratio >> 16 */ "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ "#1 \n\t psrld $16, %%mm0"::[brutS] "r" (&brutS[loop]), [brutD] "r" (&brutD[loop]) ); /* mm0 = S */ /* * pre : mm0 : position vector on screen * prevXY : coordinate of the lower-right point on screen * post : clipped mm0 * modified : mm0,mm1,mm2 */ asm volatile ("#1 \n\t movq %[prevXY], %%mm1" "#1 \n\t pcmpgtd %%mm0, %%mm1" /* mm0 en X contient (idem pour Y) : * 1111 si prevXY > px * 0000 si prevXY <= px */ #ifdef STRICT_COMPAT "#1 \n\t movq %%mm1, %%mm2" "#1 \n\t punpckhdq %%mm2, %%mm2" "#1 \n\t punpckldq %%mm1, %%mm1" "#1 \n\t pand %%mm2, %%mm0" #endif "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ ::[prevXY] "m" (prevXY)); /* Thread #2 * pre : mm0 : clipped position on screen * * post : mm3 : coefs for this position * mm1 : X vector [0|X] * * modif : eax,esi */ __asm__ __volatile__ ("#2 \n\t movd %%mm0,%%esi" "#2 \n\t movq %%mm0,%%mm1" "#2 \n\t andl $15,%%esi" "#2 \n\t psrlq $32,%%mm1" "#2 \n\t shll $6,%%esi" "#2 \n\t movd %%mm1,%%eax" "#2 \n\t addl %[precalCoef],%%esi" "#2 \n\t andl $15,%%eax" "#2 \n\t movd (%%esi,%%eax,4),%%mm3"::[precalCoef] "g" (precalCoef):"eax", "esi"); /* * extraction des coefficients... (Thread #3) * * pre : coef dans mm3 * * post : coef extraits dans mm3 (c1 & c2) * et mm4 (c3 & c4) * * modif : mm5 */ /* (Thread #4) * pre : mm0 : Y pos [*|Y] * mm1 : X pos [*|X] * * post : mm0 : expix1[position] * mm2 : expix1[position+largeur] * * modif : eax, esi */ __asm__ __volatile__ ("#2 \n\t psrld $4, %%mm0" "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ "#4 \n\t movd %%mm1,%%eax" "#3 \n\t movq %%mm3,%%mm5" "#4 \n\t mull %[prevX]" "#4 \n\t movd %%mm0,%%esi" "#3 \n\t punpcklbw %%mm5, %%mm3" "#4 \n\t addl %%esi, %%eax" "#3 \n\t movq %%mm3, %%mm4" "#3 \n\t movq %%mm3, %%mm5" "#4 \n\t movl %[expix1], %%esi" "#3 \n\t punpcklbw %%mm5, %%mm3" "#4 \n\t movq (%%esi,%%eax,4),%%mm0" "#3 \n\t punpckhbw %%mm5, %%mm4" "#4 \n\t addl %[prevX],%%eax" "#4 \n\t movq (%%esi,%%eax,4),%%mm2"::[expix1] "g" (expix1) ,[prevX] "g" (prevX) :"eax", "esi", "edx"); /* * pre : mm0 : expix1[position] * mm2 : expix1[position+largeur] * mm3 & mm4 : coefs */ /* recopie des deux premiers pixels dans mm0 et mm1 */ movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ /* depackage du premier pixel */ punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ /* extraction des coefficients... */ movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ /*^en parrallele^ *//* depackage du 2ieme pixel */ /*^ */ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ /* multiplication des pixels par les coefficients */ pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ paddw_r2r (mm1, mm0); /* ...extraction des 2 derniers coefficients */ movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ /* recuperation des 2 derniers pixels */ movq_r2r (mm2, mm1); /* depackage des pixels */ punpcklbw_r2r (mm7, mm1); punpckhbw_r2r (mm7, mm2); /* multiplication pas les coeffs */ pmullw_r2r (mm4, mm1); pmullw_r2r (mm5, mm2); /* ajout des valeurs obtenues � la valeur finale */ paddw_r2r (mm1, mm0); paddw_r2r (mm2, mm0); /* division par 256 = 16+16+16+16, puis repackage du pixel final */ psrlw_i2r (8, mm0); packuswb_r2r (mm7, mm0); movd_r2m (mm0, expix2[loop]); ++loop; } /* this was femms, which is AMD 3dnow */ __asm__ __volatile__ ("emms\n"); } #define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ { \ movd_m2r(_backbuf, mm0); \ paddusb_m2r(_col, mm0); \ movd_r2m(mm0, _out); \ } #define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) void draw_line_xmmx (Pixel * data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) { int x, y, dx, dy, yy, xx; Pixel *p; if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) goto end_of_line; dx = x2 - x1; dy = y2 - y1; if (x1 >= x2) { int tmp; tmp = x1; x1 = x2; x2 = tmp; tmp = y1; y1 = y2; y2 = tmp; dx = x2 - x1; dy = y2 - y1; } /* vertical line */ if (dx == 0) { if (y1 < y2) { p = &(data[(screenx * y1) + x1]); for (y = y1; y <= y2; y++) { DRAWMETHOD; p += screenx; } } else { p = &(data[(screenx * y2) + x1]); for (y = y2; y <= y1; y++) { DRAWMETHOD; p += screenx; } } goto end_of_line; } /* horizontal line */ if (dy == 0) { if (x1 < x2) { p = &(data[(screenx * y1) + x1]); for (x = x1; x <= x2; x++) { DRAWMETHOD; p++; } goto end_of_line; } else { p = &(data[(screenx * y1) + x2]); for (x = x2; x <= x1; x++) { DRAWMETHOD; p++; } goto end_of_line; } } /* 1 */ /* \ */ /* \ */ /* 2 */ if (y2 > y1) { /* steep */ if (dy > dx) { dx = ((dx << 16) / dy); x = x1 << 16; for (y = y1; y <= y2; y++) { xx = x >> 16; p = &(data[(screenx * y) + xx]); DRAWMETHOD; if (xx < (screenx - 1)) { p++; /* DRAWMETHOD; */ } x += dx; } goto end_of_line; } /* shallow */ else { dy = ((dy << 16) / dx); y = y1 << 16; for (x = x1; x <= x2; x++) { yy = y >> 16; p = &(data[(screenx * yy) + x]); DRAWMETHOD; if (yy < (screeny - 1)) { p += screeny; /* DRAWMETHOD; */ } y += dy; } } } /* 2 */ /* / */ /* / */ /* 1 */ else { /* steep */ if (-dy > dx) { dx = ((dx << 16) / -dy); x = (x1 + 1) << 16; for (y = y1; y >= y2; y--) { xx = x >> 16; p = &(data[(screenx * y) + xx]); DRAWMETHOD; if (xx < (screenx - 1)) { p--; /* DRAWMETHOD; */ } x += dx; } goto end_of_line; } /* shallow */ else { dy = ((dy << 16) / dx); y = y1 << 16; for (x = x1; x <= x2; x++) { yy = y >> 16; p = &(data[(screenx * yy) + x]); DRAWMETHOD; if (yy < (screeny - 1)) { p += screeny; /* DRAWMETHOD; */ } y += dy; } goto end_of_line; } } end_of_line: /* this was femms, which is AMD 3dnow */ __asm__ __volatile__ ("emms\n"); } #else int xmmx_supported (void) { return (0); } #endif gst-plugins-good-0.10.31/gst/goom/convolve_fx.c0000644000175000017500000002441311671175353016246 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "goom_fx.h" #include "goom_plugin_info.h" #include "goom_config.h" #include #include #include #include //#define CONV_MOTIF_W 32 //#define CONV_MOTIF_WMASK 0x1f /* Define if you like the wacky GOOM logo: */ #undef DRAW_MOTIF #define CONV_MOTIF_W 128 #define CONV_MOTIF_WMASK 0x7f typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; #include "motif_goom1.h" #include "motif_goom2.h" #define NB_THETA 512 typedef struct _CONV_DATA { PluginParam light; PluginParam factor_adj_p; PluginParam factor_p; PluginParameters params; /* rotozoom */ int theta; float ftheta; int h_sin[NB_THETA]; int h_cos[NB_THETA]; int h_height; float visibility; Motif conv_motif; int inverse_motif; } ConvData; /* init rotozoom tables */ static void compute_tables (VisualFX * _this, PluginInfo * info) { ConvData *data = (ConvData *) _this->fx_data; double screen_coef; int i; double h; double radian; if (data->h_height == info->screen.height) return; screen_coef = 2.0 * 300.0 / (double) info->screen.height; data->h_height = info->screen.height; for (i = 0; i < NB_THETA; i++) { radian = 2 * i * G_PI / NB_THETA; h = (0.2 + cos (radian) / 15.0 * sin (radian * 2.0 + 12.123)) * screen_coef; data->h_cos[i] = 0x10000 * (-h * cos (radian) * cos (radian)); data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin (radian)); } } static void set_motif (ConvData * data, Motif motif) { int i, j; for (i = 0; i < CONV_MOTIF_W; ++i) for (j = 0; j < CONV_MOTIF_W; ++j) data->conv_motif[i][j] = motif[CONV_MOTIF_W - i - 1][CONV_MOTIF_W - j - 1]; } static void convolve_init (VisualFX * _this, PluginInfo * info) { ConvData *data; data = (ConvData *) malloc (sizeof (ConvData)); _this->fx_data = (void *) data; secure_f_param (&data->light, "Screen Brightness"); data->light.param.fval.max = 300.0f; data->light.param.fval.step = 1.0f; data->light.param.fval.value = 100.0f; secure_f_param (&data->factor_adj_p, "Flash Intensity"); data->factor_adj_p.param.fval.max = 200.0f; data->factor_adj_p.param.fval.step = 1.0f; data->factor_adj_p.param.fval.value = 70.0f; secure_f_feedback (&data->factor_p, "Factor"); plugin_parameters (&data->params, "Bright Flash", 5); data->params.params[0] = &data->light; data->params.params[1] = &data->factor_adj_p; data->params.params[2] = 0; data->params.params[3] = &data->factor_p; data->params.params[4] = 0; data->h_height = 0; /* init rotozoom tables */ compute_tables (_this, info); data->theta = 0; data->ftheta = 0.0; data->visibility = 1.0; set_motif (data, CONV_MOTIF2); data->inverse_motif = 0; _this->params = &data->params; } static void convolve_free (VisualFX * _this) { ConvData *data = (ConvData *) _this->fx_data; goom_plugin_parameters_free (&data->params); free (_this->fx_data); } #ifdef DRAW_MOTIF static void create_output_with_brightness (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * info, int iff) { ConvData *data = (ConvData *) _this->fx_data; int x, y; int i = 0; //info->screen.height * info->screen.width - 1; const int c = data->h_cos[data->theta]; const int s = data->h_sin[data->theta]; const int xi = -(info->screen.width / 2) * c; const int yi = (info->screen.width / 2) * s; const int xj = -(info->screen.height / 2) * s; const int yj = -(info->screen.height / 2) * c; int xprime = xj; int yprime = yj; int ifftab[16]; if (data->inverse_motif) { int i; for (i = 0; i < 16; ++i) ifftab[i] = (double) iff *(1.0 + data->visibility * (15.0 - i) / 15.0); } else { int i; for (i = 0; i < 16; ++i) ifftab[i] = (double) iff / (1.0 + data->visibility * (15.0 - i) / 15.0); } for (y = info->screen.height; y--;) { int xtex, ytex; xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; xprime += s; ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; yprime += c; #ifdef HAVE_MMX __asm__ __volatile__ ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ "\n\t movd %[xtex], %%mm2" "\n\t movd %[ytex], %%mm3" "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ "\n\t movd %[c], %%mm4" "\n\t movd %[s], %%mm6" "\n\t pxor %%mm5, %%mm5" "\n\t psubd %%mm6, %%mm5" "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ "\n\t movd %[motif], %%mm6" /* mm6 = motif */ ::[xtex] "g" (xtex),[ytex] "g" (ytex) ,[c] "g" (c),[s] "g" (s) ,[motif] "g" (&data->conv_motif[0][0])); for (x = info->screen.width; x--;) { __asm__ __volatile__ ("\n\t movd %[src], %%mm0" /* mm0 = src */ "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ "\n\t movq %%mm2, %%mm3" "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ "\n\t movd %%mm3, %%eax" /* eax = xtex' */ "\n\t psrlq $25, %%mm3" "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ "\n\t andl $127, %%eax" "\n\t andl $16256, %%ecx" "\n\t addl %%ecx, %%eax" "\n\t movd %%mm6, %%esi" /* esi = motif */ "\n\t xorl %%ecx, %%ecx" "\n\t movb (%%eax,%%esi), %%cl" "\n\t movl %[ifftab], %%eax" "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ "\n\t punpcklwd %%mm1, %%mm1" "\n\t punpcklbw %%mm7, %%mm0" "\n\t punpckldq %%mm1, %%mm1" "\n\t psrlw $1, %%mm0" "\n\t psrlw $2, %%mm1" "\n\t pmullw %%mm1, %%mm0" "\n\t psrlw $5, %%mm0" "\n\t packuswb %%mm7, %%mm0" "\n\t movd %%mm0, %[dest]":[dest] "=g" (dest[i].val) :[src] "g" (src[i].val) ,[ifftab] "g" (&ifftab[0]) :"eax", "ecx"); i++; } #else for (x = info->screen.width; x--;) { int iff2; unsigned int f0, f1, f2, f3; xtex += c; ytex -= s; iff2 = ifftab[(int) data->conv_motif[(ytex >> 16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; #define sat(a) ((a)>0xFF?0xFF:(a)) f0 = src[i].val; f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; dest[i].val = (sat (f1) << R_OFFSET) | (sat (f2) << G_OFFSET) | (sat (f3) << B_OFFSET); /* f0 = (src[i].cop[0] * iff2) >> 8; f1 = (src[i].cop[1] * iff2) >> 8; f2 = (src[i].cop[2] * iff2) >> 8; f3 = (src[i].cop[3] * iff2) >> 8; dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; */ i++; } #endif } #ifdef HAVE_MMX __asm__ __volatile__ ("\n\t emms"); #endif compute_tables (_this, info); } #endif /*#include static uint64_t GetTick() { uint64_t x; asm volatile ("RDTSC" : "=A" (x)); return x; }*/ static void convolve_apply (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * info) { ConvData *data = (ConvData *) _this->fx_data; #ifdef DRAW_MOTIF float ff; int iff; ff = (FVAL (data->factor_p) * FVAL (data->factor_adj_p) + FVAL (data->light)) / 100.0f; iff = (unsigned int) (ff * 256); #endif { double fcycle = (double) info->cycle; double rotate_param, rotate_coef; float INCREASE_RATE = 1.5; float DECAY_RATE = 0.955; if (FVAL (info->sound.last_goom_p) > 0.8) FVAL (data->factor_p) += FVAL (info->sound.goom_power_p) * INCREASE_RATE; FVAL (data->factor_p) *= DECAY_RATE; rotate_param = FVAL (info->sound.last_goom_p); if (rotate_param < 0.0) rotate_param = 0.0; rotate_param += FVAL (info->sound.goom_power_p); rotate_coef = 4.0 + FVAL (info->sound.goom_power_p) * 6.0; data->ftheta = (data->ftheta + rotate_coef * sin (rotate_param * 6.3)); data->theta = ((unsigned int) data->ftheta) % NB_THETA; data->visibility = (cos (fcycle * 0.001 + 1.5) * sin (fcycle * 0.008) + cos (fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; if (data->visibility < 0.0) data->visibility = 0.0; data->factor_p.change_listener (&data->factor_p); } if (data->visibility < 0.01) { switch (goom_irand (info->gRandom, 300)) { case 1: set_motif (data, CONV_MOTIF1); data->inverse_motif = 1; break; case 2: set_motif (data, CONV_MOTIF2); data->inverse_motif = 0; break; } } #ifdef DRAW_MOTIF if ((ff > 0.98f) && (ff < 1.02f)) memcpy (dest, src, info->screen.size * sizeof (Pixel)); else create_output_with_brightness (_this, src, dest, info, iff); #else memcpy (dest, src, info->screen.size * sizeof (Pixel)); #endif /* // Benching suite... { uint64_t before, after; double timed; static double stimed = 10000.0; before = GetTick(); data->visibility = 1.0; create_output_with_brightness(_this,src,dest,info,iff); after = GetTick(); timed = (double)((after-before) / info->screen.size); if (timed < stimed) { stimed = timed; printf ("CLK = %3.0f CPP\n", stimed); } } */ } void convolve_create (VisualFX * vfx) { vfx->init = convolve_init; vfx->free = convolve_free; vfx->apply = convolve_apply; vfx->fx_data = NULL; vfx->params = NULL; } gst-plugins-good-0.10.31/gst/goom/drawmethods.c0000644000175000017500000001151611671175353016237 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "drawmethods.h" #define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ {\ int tra=0,i=0;\ unsigned char *bra = (unsigned char*)&(_backbuf);\ unsigned char *dra = (unsigned char*)&(_out);\ unsigned char *cra = (unsigned char*)&(_col);\ for (;i<4;i++) {\ tra = *cra;\ tra += *bra;\ if (tra>255) tra=255;\ *dra = tra;\ ++dra;++cra;++bra;\ }\ } #define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) void draw_line (Pixel * data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) { int x, y, dx, dy, yy, xx; Pixel *p; if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; /* clip to top edge if ((y1 < 0) && (y2 < 0)) return; if (y1 < 0) { x1 += (y1 * (x1 - x2)) / (y2 - y1); y1 = 0; } if (y2 < 0) { x2 += (y2 * (x1 - x2)) / (y2 - y1); y2 = 0; } clip to bottom edge if ((y1 >= screeny) && (y2 >= screeny)) return; if (y1 >= screeny) { x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); y1 = screeny - 1; } if (y2 >= screeny) { x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); y2 = screeny - 1; } clip to left edge if ((x1 < 0) && (x2 < 0)) return; if (x1 < 0) { y1 += (x1 * (y1 - y2)) / (x2 - x1); x1 = 0; } if (x2 < 0) { y2 += (x2 * (y1 - y2)) / (x2 - x1); x2 = 0; } clip to right edge if ((x1 >= screenx) && (x2 >= screenx)) return; if (x1 >= screenx) { y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); x1 = screenx - 1; } if (x2 >= screenx) { y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); x2 = screenx - 1; } */ dx = x2 - x1; dy = y2 - y1; if (x1 > x2) { int tmp; tmp = x1; x1 = x2; x2 = tmp; tmp = y1; y1 = y2; y2 = tmp; dx = x2 - x1; dy = y2 - y1; } /* vertical line */ if (dx == 0) { if (y1 < y2) { p = &(data[(screenx * y1) + x1]); for (y = y1; y <= y2; y++) { DRAWMETHOD; p += screenx; } } else { p = &(data[(screenx * y2) + x1]); for (y = y2; y <= y1; y++) { DRAWMETHOD; p += screenx; } } return; } /* horizontal line */ if (dy == 0) { if (x1 < x2) { p = &(data[(screenx * y1) + x1]); for (x = x1; x <= x2; x++) { DRAWMETHOD; p++; } return; } else { p = &(data[(screenx * y1) + x2]); for (x = x2; x <= x1; x++) { DRAWMETHOD; p++; } return; } } /* 1 */ /* \ */ /* \ */ /* 2 */ if (y2 > y1) { /* steep */ if (dy > dx) { dx = ((dx << 16) / dy); x = x1 << 16; for (y = y1; y <= y2; y++) { xx = x >> 16; p = &(data[(screenx * y) + xx]); DRAWMETHOD; if (xx < (screenx - 1)) { p++; /* DRAWMETHOD; */ } x += dx; } return; } /* shallow */ else { dy = ((dy << 16) / dx); y = y1 << 16; for (x = x1; x <= x2; x++) { yy = y >> 16; p = &(data[(screenx * yy) + x]); DRAWMETHOD; if (yy < (screeny - 1)) { p += screeny; /* DRAWMETHOD; */ } y += dy; } } } /* 2 */ /* / */ /* / */ /* 1 */ else { /* steep */ if (-dy > dx) { dx = ((dx << 16) / -dy); x = (x1 + 1) << 16; for (y = y1; y >= y2; y--) { xx = x >> 16; p = &(data[(screenx * y) + xx]); DRAWMETHOD; if (xx < (screenx - 1)) { p--; /* DRAWMETHOD; */ } x += dx; } return; } /* shallow */ else { dy = ((dy << 16) / dx); y = y1 << 16; for (x = x1; x <= x2; x++) { yy = y >> 16; p = &(data[(screenx * yy) + x]); DRAWMETHOD; if (yy < (screeny - 1)) { p += screeny; /* DRAWMETHOD; */ } y += dy; } return; } } } gst-plugins-good-0.10.31/gst/goom/motif_goom1.h0000644000175000017500000014256611671175353016155 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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. */ static Motif CONV_MOTIF1 = { {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15} }; gst-plugins-good-0.10.31/gst/goom/surf3d.c0000644000175000017500000000667111671175353015132 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "surf3d.h" #include "goom_plugin_info.h" #include #include #include grid3d * grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { int x = defx; int y = defz; grid3d *g = malloc (sizeof (grid3d)); surf3d *s = &(g->surf); s->nbvertex = x * y; s->vertex = malloc (x * y * sizeof (v3d)); s->svertex = malloc (x * y * sizeof (v3d)); s->center = center; g->defx = defx; g->sizex = sizex; g->defz = defz; g->sizez = sizez; g->mode = 0; while (y) { --y; x = defx; while (x) { --x; s->vertex[x + defx * y].x = (float) (x - defx / 2) * sizex / defx; s->vertex[x + defx * y].y = 0; s->vertex[x + defx * y].z = (float) (y - defz / 2) * sizez / defz; } } return g; } void grid3d_free (grid3d * g) { surf3d *s = &(g->surf); free (s->vertex); free (s->svertex); free (g); } void grid3d_draw (PluginInfo * plug, grid3d * g, int color, int colorlow, int dist, Pixel * buf, Pixel * back, int W, int H) { int x; v2d v2, v2x; v2d *v2_array = malloc (g->surf.nbvertex * sizeof (v2d)); v3d_to_v2d (g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); for (x = 0; x < g->defx; x++) { int z; v2x = v2_array[x]; for (z = 1; z < g->defz; z++) { v2 = v2_array[z * g->defx + x]; if (((v2.x != -666) || (v2.y != -666)) && ((v2x.x != -666) || (v2x.y != -666))) { plug->methods.draw_line (buf, v2x.x, v2x.y, v2.x, v2.y, colorlow, W, H); plug->methods.draw_line (back, v2x.x, v2x.y, v2.x, v2.y, color, W, H); } v2x = v2; } } free (v2_array); } void surf3d_rotate (surf3d * s, float angle) { int i; float cosa; float sina; SINCOS (angle, sina, cosa); for (i = 0; i < s->nbvertex; i++) { Y_ROTATE_V3D (s->vertex[i], s->svertex[i], cosa, sina); } } void surf3d_translate (surf3d * s) { int i; for (i = 0; i < s->nbvertex; i++) { TRANSLATE_V3D (s->center, s->svertex[i]); } } void grid3d_update (grid3d * g, float angle, float *vals, float dist) { int i; float cosa; float sina; surf3d *s = &(g->surf); v3d cam = s->center; cam.z += dist; SINCOS ((angle / 4.3f), sina, cosa); cam.y += sina * 2.0f; SINCOS (angle, sina, cosa); if (g->mode == 0) { if (vals) for (i = 0; i < g->defx; i++) s->vertex[i].y = s->vertex[i].y * 0.2 + vals[i] * 0.8; for (i = g->defx; i < s->nbvertex; i++) { s->vertex[i].y *= 0.255f; s->vertex[i].y += (s->vertex[i - g->defx].y * 0.777f); } } for (i = 0; i < s->nbvertex; i++) { Y_ROTATE_V3D (s->vertex[i], s->svertex[i], cosa, sina); TRANSLATE_V3D (cam, s->svertex[i]); } } gst-plugins-good-0.10.31/gst/goom/ppc_drawings.s0000644000175000017500000002331511671175353016416 00000000000000; PowerPC optimized drawing methods for Goom ; © 2003 Guillaume Borios ; 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. ; Change log : ; 30 May 2003 : File creation ; Section definition : We use a read only code section for the whole file .section __TEXT,__text,regular,pure_instructions ; -------------------------------------------------------------------------------------- ; Single 32b pixel drawing macros ; Usage : ; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 ; Only the work registers (WR) can be touched by the macros ; ; Available methods : ; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) ; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) ; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing ; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) ; DRAWMETHOD_B_OR_MACRO : Bitwise OR ; DRAWMETHOD_BAND_MACRO : Bitwise AND ; DRAWMETHOD_BXOR_MACRO : Bitwise XOR ; DRAWMETHOD_BNOT_MACRO : Bitwise NOT ; -------------------------------------------------------------------------------------- .macro DRAWMETHOD_OVRW_MACRO stw $2,0($1) ;; *$1 <- $2 .endmacro .macro DRAWMETHOD_B_OR_MACRO lwz $3,0($0) ;; $3 <- *$0 or $3,$3,$2 ;; $3 <- $3 | $2 stw $3,0($1) ;; *$1 <- $3 .endmacro .macro DRAWMETHOD_BAND_MACRO lwz $3,0($0) ;; $3 <- *$0 and $3,$3,$2 ;; $3 <- $3 & $2 stw $3,0($1) ;; *$1 <- $3 .endmacro .macro DRAWMETHOD_BXOR_MACRO lwz $3,0($0) ;; $3 <- *$0 xor $3,$3,$2 ;; $3 <- $3 ^ $2 stw $3,0($1) ;; *$1 <- $3 .endmacro .macro DRAWMETHOD_BNOT_MACRO lwz $3,0($0) ;; $3 <- *$0 nand $3,$3,$3 ;; $3 <- ~$3 stw $3,0($1) ;; *$1 <- $3 .endmacro .macro DRAWMETHOD_PLUS_MACRO lwz $4,0($0) ;; $4 <- *$0 andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 add $3,$3,$5 ;; $3 <- $3 + $5 rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) or $3,$3,$5 ;; $3 <- $3 | $5 lis $5,0xFF ;; $5 <- 0x00FF00FF addi $5,$5,0xFF and $4,$4,$5 ;; $4 <- $4 & $5 and $6,$2,$5 ;; $6 <- $2 & $5 add $4,$4,$6 ;; $4 <- $4 + $6 rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] or $4,$4,$6 ;; $4 <- $4 | $6 rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] stw $4,0($1) ;; *$1 <- $4 .endmacro .macro DRAWMETHOD_HALF_MACRO lwz $4,0($0) ;; $4 <- *$0 andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 add $3,$3,$5 ;; $3 <- $3 + $5 lis $5,0xFF ;; $5 <- 0x00FF00FF addi $5,$5,0xFF and $4,$4,$5 ;; $4 <- $4 & $5 and $5,$2,$5 ;; $5 <- $2 & $5 add $4,$4,$5 ;; $4 <- $4 + $5 srwi $4,$4,1 ;; $4 <- $4 >> 1 rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] stw $4,0($1) ;; *$1 <- $4 .endmacro .macro DRAWMETHOD_DFLT_MACRO DRAWMETHOD_PLUS_MACRO .endmacro ; -------------------------------------------------------------------------------------- ; ************************************************************************************** ; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); ; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); ; ************************************************************************************** .globl _DRAWMETHOD_PLUS_2_PPC .align 3 _DRAWMETHOD_PLUS_2_PPC: DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 blr ;; return .globl _DRAWMETHOD_PLUS_PPC .align 3 _DRAWMETHOD_PLUS_PPC: DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 blr ;; return ; ************************************************************************************** ; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); ; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); ; ************************************************************************************** .globl _DRAWMETHOD_HALF_2_PPC .align 3 _DRAWMETHOD_HALF_2_PPC: DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 blr ;; return .globl _DRAWMETHOD_HALF_PPC .align 3 _DRAWMETHOD_HALF_PPC: DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 blr ;; return ; ************************************************************************************** ; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, ; unsigned int screenx, unsigned int screeny) ; ************************************************************************************** .globl _DRAW_LINE_PPC .align 3 _DRAW_LINE_PPC: ;; NOT IMPLEMENTED YET blr ;; return ; ************************************************************************************** ; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) ; ************************************************************************************** .const .align 4 vectorZERO: .long 0,0,0,0 .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F .section __TEXT,__text,regular,pure_instructions .globl _ppc_brightness_G4 .align 3 _ppc_brightness_G4: ;; PowerPC Altivec code srwi r5,r5,2 mtctr r5 ;;vrsave mfspr r11,256 lis r12,0xCFFC mtspr 256,r12 mflr r0 bcl 20,31,"L00000000001$pb" "L00000000001$pb": mflr r10 mtlr r0 addis r9,r10,ha16(vectorZERO-"L00000000001$pb") addi r9,r9,lo16(vectorZERO-"L00000000001$pb") vxor v0,v0,v0 ;; V0 = NULL vector addi r9,r9,16 lvx v10,0,r9 addi r9,r9,16 lvx v11,0,r9 addi r9,r9,16 lvx v12,0,r9 addi r9,r9,16 lvx v13,0,r9 addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") stw r6,0(r9) li r6,8 stw r6,4(r9) lvx v9,0,r9 li r9,128 vspltw v8,v9,0 vspltw v9,v9,1 ;; elt counter li r9,0 lis r7,0x0F01 b L7 .align 4 L7: lvx v1,r9,r3 vperm v4,v1,v0,v10 ;********************* add r10,r9,r3 ;********************* vperm v5,v1,v0,v11 vperm v6,v1,v0,v12 vperm v7,v1,v0,v13 vmulouh v4,v4,v8 ;********************* dst r10,r7,3 ;********************* vmulouh v5,v5,v8 vmulouh v6,v6,v8 vmulouh v7,v7,v8 vsrw v4,v4,v9 vsrw v5,v5,v9 vsrw v6,v6,v9 vsrw v7,v7,v9 vpkuwus v4,v4,v5 vpkuwus v6,v6,v7 vpkuhus v1,v4,v6 stvx v1,r9,r4 addi r9,r9,16 bdnz L7 mtspr 256,r11 blr .globl _ppc_brightness_G5 .align 3 _ppc_brightness_G5: ;; PowerPC Altivec G5 code srwi r5,r5,2 mtctr r5 ;;vrsave mfspr r11,256 lis r12,0xCFFC mtspr 256,r12 mflr r0 bcl 20,31,"L00000000002$pb" "L00000000002$pb": mflr r10 mtlr r0 addis r9,r10,ha16(vectorZERO-"L00000000002$pb") addi r9,r9,lo16(vectorZERO-"L00000000002$pb") vxor v0,v0,v0 ;; V0 = NULL vector addi r9,r9,16 lvx v10,0,r9 addi r9,r9,16 lvx v11,0,r9 addi r9,r9,16 lvx v12,0,r9 addi r9,r9,16 lvx v13,0,r9 addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") stw r6,0(r9) li r6,8 stw r6,4(r9) lvx v9,0,r9 li r9,128 vspltw v8,v9,0 vspltw v9,v9,1 ;; elt counter li r9,0 lis r7,0x0F01 b L6 .align 4 L6: lvx v1,r9,r3 vperm v4,v1,v0,v10 ;********************* add r10,r9,r3 ;********************* vperm v5,v1,v0,v11 vperm v6,v1,v0,v12 vperm v7,v1,v0,v13 vmulouh v4,v4,v8 vmulouh v5,v5,v8 vmulouh v6,v6,v8 vmulouh v7,v7,v8 vsrw v4,v4,v9 vsrw v5,v5,v9 vsrw v6,v6,v9 vsrw v7,v7,v9 vpkuwus v4,v4,v5 vpkuwus v6,v6,v7 vpkuhus v1,v4,v6 stvx v1,r9,r4 addi r9,r9,16 bdnz L6 mtspr 256,r11 blr .globl _ppc_brightness_generic .align 3 _ppc_brightness_generic: lis r12,0x00FF ori r12,r12,0x00FF subi r3,r3,4 subi r4,r4,4 mtctr r5 b L1 .align 4 L1: lwzu r7,4(r3) rlwinm r8,r7,16,24,31 rlwinm r9,r7,24,24,31 mullw r8,r8,r6 rlwinm r10,r7,0,24,31 mullw r9,r9,r6 srwi r8,r8,8 mullw r10,r10,r6 srwi r9,r9,8 rlwinm. r11,r8,0,0,23 beq L2 li r8,0xFF L2: srwi r10,r10,8 rlwinm. r11,r9,0,0,23 beq L3 li r9,0xFF L3: rlwinm r7,r8,16,8,15 rlwinm. r11,r10,0,0,23 beq L4 li r10,0xFF L4: rlwimi r7,r9,8,16,23 rlwimi r7,r10,0,24,31 stwu r7,4(r4) bdnz L1 blr .static_data .align 4 vectortmpwork: .long 0,0,0,0 gst-plugins-good-0.10.31/gst/goom/lines.h0000644000175000017500000000441311671175353015033 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _LINES_H #define _LINES_H #include "goom_typedefs.h" #include "goom_graphic.h" #include "goom_config.h" struct _GMUNITPOINTER { float x; float y; float angle; }; /* tableau de points */ struct _GMLINE { GMUnitPointer *points; GMUnitPointer *points2; int IDdest; float param; float amplitudeF; float amplitude; int nbPoints; guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ guint32 color2; int screenX; int screenY; float power; float powinc; PluginInfo *goomInfo; }; /* les ID possibles */ #define GML_CIRCLE 0 /* (param = radius) */ #define GML_HLINE 1 /* (param = y) */ #define GML_VLINE 2 /* (param = x) */ /* les modes couleur possible (si tu mets un autre c'est noir) */ #define GML_BLEUBLANC 0 #define GML_RED 1 #define GML_ORANGE_V 2 #define GML_ORANGE_J 3 #define GML_VERT 4 #define GML_BLEU 5 #define GML_BLACK 6 /* construit un effet de line (une ligne horitontale pour commencer) */ GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, int IDsrc, float paramS, int modeCoulSrc, int IDdest, float paramD, int modeCoulDest); void goom_lines_switch_to (GMLine * gml, int IDdest, float param, float amplitude, int modeCoul); void goom_lines_set_res (GMLine * gml, int rx, int ry); void goom_lines_free (GMLine ** gml); void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); #endif /* _LINES_H */ gst-plugins-good-0.10.31/gst/goom/motif_goom2.h0000644000175000017500000014326611671175353016154 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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. */ static Motif CONV_MOTIF2 = { {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15} }; gst-plugins-good-0.10.31/gst/goom/ppc_zoom_ultimate.s0000644000175000017500000002436011671175353017471 00000000000000; PowerPC optimized zoom for Goom ; © 2001-2003 Guillaume Borios ; 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. ; Change log : ; 21 Dec 2003 : Use of altivec is now determined with a parameter ; Section definition : We use a read only section .text ; name of the function to call by C program : ppc_zoom ; We declare this label as a global to extend its scope outside this file .globl _ppc_zoom_generic .globl _ppc_zoom_G4 ; Description : ; This routine dynamically computes and applies a zoom filter ; parameters : ; r3 <=> unsigned int sizeX (in pixels) ; r4 <=> unsigned int sizeY (in pixels) ; r5 <=> unsigned int * frompixmap ; r6 <=> unsigned int * topixmap ; r7 <=> unsigned int * brutS ; r8 <=> unsigned int * brutD ; r9 <=> unsigned int buffratio ; r10 <=> int [16][16] precalccoeffs ; globals after init ; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) ; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) ; r3 <=> ax = x max in 16th of pixels (replaces old r3) ; r4 <=> ay = y max in 16th of pixels (replaces old r4) ; r20 <=> row size in bytes ; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) ; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) ; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) ; ABI notes : ; r1 is the Stack Pointer (SP) => Do not use ; r13..r31 are non-volatiles => Do not use _ppc_zoom_generic: ; Saves the used non volatile registers in the Mach-O stack s Red-Zone stmw r18,-56(r1) ; init li r18,0 ; Default value if out of range : 0 (Black) mr r11,r10 lis r12,0xFF mullw r2,r3,r4 ; Number of pixels to compute subi r30,r8,0 slwi r20,r3,2 srawi r19,r20,2 ori r12,r12,0xFF subi r3,r3,1 subi r4,r4,1 mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) subi r31,r7,0 subi r6,r6,4 slwi r3,r3,4 slwi r4,r4,4 ;pre init for loop lwz r2,0(r31) ; px lwz r29,4(r31) ; py lwz r8,0(r30) ; px2 lwz r10,4(r30) ; py2 b L1 .align 5 L1: ; computes dynamically the position to fetch sub r8,r8,r2 sub r10,r10,r29 mullw r8,r8,r9 addi r31,r31,8 mullw r10,r10,r9 addi r30,r30,8 srawi r8,r8,16 srawi r10,r10,16 add r2,r2,r8 add r29,r29,r10 ; if px>ax or py>ay goto outofrange ; computes the attenuation coeffs and the original point address rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) cmpl cr4,0,r2,r3 rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) cmpl cr7,0,r29,r4 srawi r29,r29,4 ; pos computing bge- cr4,L4 srawi r2,r2,4 ; pos computing mullw r29, r29,r19 ; pos computing bge- cr7,L4 ; Channels notation : 00112233 (AARRVVBB) add r2,r2,r29 ; pos computing lwzx r10,r11,r10 ; Loads coefs slwi r2,r2,2 ; pos computing add r2,r2,r5 ; pos computing rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) lwz r25,0(r2) ; Loads col1 -> r25 lwz r26,4(r2) ; Loads col2 -> r26 rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) add r2,r2,r20 ; Adds one line for future load of col3 and col4 and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 ; computes final pixel color and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX lwz r27,0(r2) ; Loads col3 -> r27 mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 lwz r28,4(r2) ; Loads col4 -> r28 add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX add r25,r25,r29 ; Adds col1 & col2 channel 2 mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 lwz r2,0(r31) ; px add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 lwz r8,0(r30) ; px2 andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 lwz r10,4(r30) ; py2 mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 lwz r29,4(r31) ; py add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) stwu r7,4(r6) ; Stores the computed pixel bdnz L1 ; Iterate again if needed b L3 ;goto end ; If not, returns from the function ; if out of range L4: stwu r18,4(r6) lwz r8,0(r30) ; px2 lwz r10,4(r30) ; py2 lwz r2,0(r31) ; px lwz r29,4(r31) ; py bdnz L1 L3: ; Restore saved registers and return lmw r18,-56(r1) blr _ppc_zoom_G4: ; Saves the used non volatile registers in the Mach-O stack s Red-Zone stmw r17,-60(r1) ; init li r18,0 ; Default value if out of range : 0 (Black) mr r11,r10 lis r12,0xFF mullw r2,r3,r4 ; Number of pixels to compute subi r30,r8,0 slwi r20,r3,2 srawi r19,r20,2 ori r12,r12,0xFF subi r3,r3,1 subi r4,r4,1 mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) subi r31,r7,0 subi r6,r6,4 slwi r3,r3,4 slwi r4,r4,4 ;pre init for loop lwz r2,0(r31) ; px lwz r29,4(r31) ; py lwz r8,0(r30) ; px2 lwz r10,4(r30) ; py2 ;********************* lis r17,0x0F01 b L100 .align 5 L100: addi r6,r6,4 ; Optimization to ensure the destination buffer ; won't be loaded into the data cache rlwinm. r0,r6,0,27,31 bne+ L500 dcbz 0,r6 ;dcba 0,r6 L500: ; computes dynamically the position to fetch ;mullw r8,r8,r29 ;mullw r2,r2,r29 ;add r2,r8,r2 ;srawi r2,r2,17 sub r8,r8,r2 sub r10,r10,r29 mullw r8,r8,r9 addi r31,r31,8 mullw r10,r10,r9 addi r30,r30,8 dst r30,r17,0 srawi r8,r8,16 srawi r10,r10,16 add r2,r2,r8 add r29,r29,r10 dst r31,r17,1 ; if px>ax or py>ay goto outofrange ; computes the attenuation coeffs and the original point address rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) cmpl cr4,0,r2,r3 rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) cmpl cr7,0,r29,r4 srawi r29,r29,4 ; pos computing bge- cr4,L400 srawi r2,r2,4 ; pos computing mullw r29, r29,r19 ; pos computing bge- cr7,L400 ; Channels notation : 00112233 (AARRVVBB) add r2,r2,r29 ; pos computing lwzx r10,r11,r10 ; Loads coefs slwi r2,r2,2 ; pos computing add r2,r2,r5 ; pos computing rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) lwz r25,0(r2) ; Loads col1 -> r25 lwz r26,4(r2) ; Loads col2 -> r26 rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) add r2,r2,r20 ; Adds one line for future load of col3 and col4 and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) dst r2,r17,2 rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 ;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 ; computes final pixel color and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX lwz r27,0(r2) ; Loads col3 -> r27 mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 ;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 lwz r28,4(r2) ; Loads col4 -> r28 add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX add r25,r25,r29 ; Adds col1 & col2 channel 2 mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 ;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 lwz r2,0(r31) ; px add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 lwz r8,0(r30) ; px2 rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 ;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 lwz r10,4(r30) ; py2 mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 lwz r29,4(r31) ; py add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) stw r7,0(r6) ; Stores the computed pixel bdnz L100 ; Iterate again if needed b L300 ;goto end ; If not, returns from the function ; if out of range L400: stw r18,0(r6) lwz r8,0(r30) ; px2 lwz r10,4(r30) ; py2 lwz r2,0(r31) ; px lwz r29,4(r31) ; py bdnz L100 L300: ; Restore saved registers and return lmw r17,-60(r1) blr gst-plugins-good-0.10.31/gst/goom/ifs.h0000644000175000017500000000373511671175353014510 00000000000000/*- * Copyright (c) 1997 by Massimino Pascal * * ifs.h: modified iterated functions system for goom. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * * If this mode is weird and you have an old MetroX server, it is buggy. * There is a free SuSE-enhanced MetroX X server that is fine. * * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." * * Revision History: * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) * 01-Nov-2000: Allocation checks * 10-May-1997: jwz@jwz.org: turned into a standalone program. * Made it render into an offscreen bitmap and then copy * that onto the screen, to reduce flicker. */ #ifndef IFS_H #define IFS_H #include "goom_config.h" #include "goom_graphic.h" #include "goom_plugin_info.h" #include "goom_visual_fx.h" void ifs_visualfx_create(VisualFX *vfx); /* init ifs for a (width)x(height) output. * / void init_ifs (PluginInfo *goomInfo, int width, int height); / * draw an ifs on the buffer (which size is width * height) increment means that we draw 1/increment of the ifs's points * / void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); / * free all ifs's data. * / void release_ifs (void); */ #endif gst-plugins-good-0.10.31/gst/goom/drawmethods.h0000644000175000017500000000200211671175353016232 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _DRAWMETHODS_H #define _DRAWMETHODS_H #include "goom_config.h" #include "goom_graphic.h" void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); #endif /* _DRAWMETHODS_H */ gst-plugins-good-0.10.31/gst/goom/mathtools.h0000644000175000017500000000324711671175353015737 00000000000000/* Goom Project * Copyright (C) <2003> Jean-Christophe Hoelt * * goom_core.c:Contains the core of goom's work. * * 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 MATHTOOLS_H #define MATHTOOLS_H #include #define _double2fixmagic (68719476736.0*1.5) /* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ #define _shiftamt 16 /* 16.16 fixed point representation */ #if G_BYTE_ORDER == G_BIG_ENDIAN #define iexp_ 0 #define iman_ 1 #else #define iexp_ 1 #define iman_ 0 #endif /* BigEndian_ */ /* TODO: this optimization is very efficient: put it again when all works #ifdef HAVE_MMX #define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} #else*/ #define F2I(dbl,i) i=(int)dbl; /*#endif*/ #if 0 #define SINCOS(f,s,c) \ __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) #else #define SINCOS(f,s,c) {s=sin(f);c=cos(f);} #endif extern float sin256[256]; extern float cos256[256]; #endif gst-plugins-good-0.10.31/gst/goom/README0000644000175000017500000000066411671175353014434 00000000000000The Goom plugin is based on the Goom visualization code from the Goom homepage found at: http://ios.free.fr/?page=projet&quoi=1 Like the original library so is the Goom plugin available under the LGPL license This is based on goom2k4 with changes to plugin_info.c and mmx.h to use Orc for CPU detection and GStreamer-specific ifdef's for architecture detection. These files are not in use right now: filters_mmx.s goomsl* surf3d.s gst-plugins-good-0.10.31/gst/goom/goom_tools.c0000644000175000017500000000265011671175353016076 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "goom_tools.h" #include GoomRandom * goom_random_init (int i) { GoomRandom *grandom = (GoomRandom *) malloc (sizeof (GoomRandom)); srand (i); grandom->pos = 1; goom_random_update_array (grandom, GOOM_NB_RAND); return grandom; } void goom_random_free (GoomRandom * grandom) { free (grandom); } void goom_random_update_array (GoomRandom * grandom, int numberOfValuesToChange) { while (numberOfValuesToChange > 0) { #if RAND_MAX < 0x10000 grandom->array[grandom->pos++] = ((rand () << 16) + rand ()) / 127; #else grandom->array[grandom->pos++] = rand () / 127; #endif numberOfValuesToChange--; } } gst-plugins-good-0.10.31/gst/goom/gstgoom.h0000644000175000017500000000426011671175353015400 00000000000000/* gstgoom.c: implementation of goom drawing element * Copyright (C) <2001> Richard Boulton * * 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_GOOM_H__ #define __GST_GOOM_H__ G_BEGIN_DECLS #include #include #include "goom.h" #define GOOM_SAMPLES 512 #define GST_TYPE_GOOM (gst_goom_get_type()) #define GST_GOOM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GOOM,GstGoom)) #define GST_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GOOM,GstGoomClass)) #define GST_IS_GOOM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GOOM)) #define GST_IS_GOOM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GOOM)) typedef struct _GstGoom GstGoom; typedef struct _GstGoomClass GstGoomClass; struct _GstGoom { GstElement element; /* pads */ GstPad *sinkpad, *srcpad; GstAdapter *adapter; /* input tracking */ gint rate; gint channels; guint bps; /* video state */ gint fps_n; gint fps_d; gint width; gint height; GstClockTime duration; guint outsize; /* samples per frame */ guint spf; /* bytes per frame */ guint bpf; /* goom stuff */ gint16 datain[2][GOOM_SAMPLES]; PluginInfo *plugin; /* segment state */ GstSegment segment; /* QoS stuff *//* with LOCK */ gdouble proportion; GstClockTime earliest_time; }; struct _GstGoomClass { GstElementClass parent_class; }; GType gst_goom_get_type (void); G_END_DECLS #endif /* __GST_GOOM_H__ */ gst-plugins-good-0.10.31/gst/goom/ifs.c0000644000175000017500000004361511671175353014504 00000000000000/*- * Copyright (c) 1997 by Massimino Pascal * * ifs.c: modified iterated functions system for goom. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * * If this mode is weird and you have an old MetroX server, it is buggy. * There is a free SuSE-enhanced MetroX X server that is fine. * * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." * * Revision History: * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) * 01-Nov-2000: Allocation checks * 10-May-1997: jwz@jwz.org: turned into a standalone program. * Made it render into an offscreen bitmap and then copy * that onto the screen, to reduce flicker. */ /* #ifdef STANDALONE */ #include #include #include #include "goom_config.h" #ifdef HAVE_MMX #include "mmx.h" #endif #include "goom_graphic.h" #include "ifs.h" #include "goom_tools.h" typedef struct _ifsPoint { gint32 x, y; } IFSPoint; #define MODE_ifs #define PROGCLASS "IFS" #define HACK_INIT init_ifs #define HACK_DRAW draw_ifs #define ifs_opts xlockmore_opts #define DEFAULTS "*delay: 20000 \n" \ "*ncolors: 100 \n" #define SMOOTH_COLORS #define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) #define NRAND(n) ((int) (LRAND() % (n))) #if RAND_MAX < 0x10000 #define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) #else #define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ #endif /*****************************************************/ typedef float DBL; typedef int F_PT; /* typedef float F_PT; */ /*****************************************************/ #define FIX 12 #define UNIT ( 1<c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (G_PI / 180.0); Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (G_PI / 180.0); Cur++; } } static void free_ifs_buffers (FRACTAL * Fractal) { if (Fractal->Buffer1 != NULL) { (void) free ((void *) Fractal->Buffer1); Fractal->Buffer1 = (IFSPoint *) NULL; } if (Fractal->Buffer2 != NULL) { (void) free ((void *) Fractal->Buffer2); Fractal->Buffer2 = (IFSPoint *) NULL; } } static void free_ifs (FRACTAL * Fractal) { free_ifs_buffers (Fractal); } /***************************************************************/ static void init_ifs (PluginInfo * goomInfo, IfsData * data) { int i; FRACTAL *Fractal; int width = goomInfo->screen.width; int height = goomInfo->screen.height; if (data->Root == NULL) { data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); if (data->Root == NULL) return; data->Root->Buffer1 = (IFSPoint *) NULL; data->Root->Buffer2 = (IFSPoint *) NULL; } Fractal = data->Root; free_ifs_buffers (Fractal); i = (NRAND (4)) + 2; /* Number of centers */ switch (i) { case 3: Fractal->Depth = MAX_DEPTH_3; Fractal->r_mean = .6; Fractal->dr_mean = .4; Fractal->dr2_mean = .3; break; case 4: Fractal->Depth = MAX_DEPTH_4; Fractal->r_mean = .5; Fractal->dr_mean = .4; Fractal->dr2_mean = .3; break; case 5: Fractal->Depth = MAX_DEPTH_5; Fractal->r_mean = .5; Fractal->dr_mean = .4; Fractal->dr2_mean = .3; break; default: case 2: Fractal->Depth = MAX_DEPTH_2; Fractal->r_mean = .7; Fractal->dr_mean = .3; Fractal->dr2_mean = .4; break; } Fractal->Nb_Simi = i; Fractal->Max_Pt = Fractal->Nb_Simi - 1; for (i = 0; i <= Fractal->Depth + 2; ++i) Fractal->Max_Pt *= Fractal->Nb_Simi; if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, sizeof (IFSPoint))) == NULL) { free_ifs (Fractal); return; } if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, sizeof (IFSPoint))) == NULL) { free_ifs (Fractal); return; } Fractal->Speed = 6; Fractal->Width = width; /* modif by JeKo */ Fractal->Height = height; /* modif by JeKo */ Fractal->Cur_Pt = 0; Fractal->Count = 0; Fractal->Lx = (Fractal->Width - 1) / 2; Fractal->Ly = (Fractal->Height - 1) / 2; Fractal->Col = rand () % (width * height); /* modif by JeKo */ Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); } /***************************************************************/ static inline void Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) { F_PT xx, yy; xo = xo - Simi->Cx; xo = (xo * Simi->R) >> FIX; /* / UNIT; */ yo = yo - Simi->Cy; yo = (yo * Simi->R) >> FIX; /* / UNIT; */ xx = xo - Simi->Cx; xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ yy = -yo - Simi->Cy; yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ *x = ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) >> FIX /* / UNIT */ ) + Simi->Cx; *y = ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) >> FIX /* / UNIT */ ) + Simi->Cy; } /***************************************************************/ static void Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData * data) { F_PT x, y, i; SIMI *Cur; Cur = data->Cur_F->Components; for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { Transform (Cur, xo, yo, &x, &y); data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX + 1) /* /(UNIT*2) */ ); data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX + 1) /* /(UNIT*2) */ ); data->Buf++; data->Cur_Pt++; if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { F->Depth--; Trace (F, x, y, data); F->Depth++; } } } static void Draw_Fractal (IfsData * data) { FRACTAL *F = data->Root; int i, j; F_PT x, y, xo, yo; SIMI *Cur, *Simi; for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { Cur->Cx = DBL_To_F_PT (Cur->c_x); Cur->Cy = DBL_To_F_PT (Cur->c_y); Cur->Ct = DBL_To_F_PT (cos (Cur->A)); Cur->St = DBL_To_F_PT (sin (Cur->A)); Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); Cur->R = DBL_To_F_PT (Cur->r); Cur->R2 = DBL_To_F_PT (Cur->r2); } data->Cur_Pt = 0; data->Cur_F = F; data->Buf = F->Buffer2; for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { xo = Cur->Cx; yo = Cur->Cy; for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { if (Simi == Cur) continue; Transform (Simi, xo, yo, &x, &y); Trace (F, x, y, data); } } /* Erase previous */ F->Cur_Pt = data->Cur_Pt; data->Buf = F->Buffer1; F->Buffer1 = F->Buffer2; F->Buffer2 = data->Buf; } static IFSPoint * draw_ifs (PluginInfo * goomInfo, int *nbpt, IfsData * data) { int i; DBL u, uu, v, vv, u0, u1, u2, u3; SIMI *S, *S1, *S2, *S3, *S4; FRACTAL *F; if (data->Root == NULL) return NULL; F = data->Root; if (F->Buffer1 == NULL) return NULL; u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; uu = u * u; v = 1.0 - u; vv = v * v; u0 = vv * v; u1 = 3.0 * vv * u; u2 = 3.0 * v * uu; u3 = u * uu; S = F->Components; S1 = S + F->Nb_Simi; S2 = S1 + F->Nb_Simi; S3 = S2 + F->Nb_Simi; S4 = S3 + F->Nb_Simi; for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; } Draw_Fractal (data); if (F->Count >= 1000 / F->Speed) { S = F->Components; S1 = S + F->Nb_Simi; S2 = S1 + F->Nb_Simi; S3 = S2 + F->Nb_Simi; S4 = S3 + F->Nb_Simi; for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { S2->c_x = 2.0 * S4->c_x - S3->c_x; S2->c_y = 2.0 * S4->c_y - S3->c_y; S2->r = 2.0 * S4->r - S3->r; S2->r2 = 2.0 * S4->r2 - S3->r2; S2->A = 2.0 * S4->A - S3->A; S2->A2 = 2.0 * S4->A2 - S3->A2; *S1 = *S4; } Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); F->Count = 0; } else F->Count++; F->Col++; (*nbpt) = data->Cur_Pt; return F->Buffer2; } /***************************************************************/ static void release_ifs (IfsData * data) { if (data->Root != NULL) { free_ifs (data->Root); (void) free ((void *) data->Root); data->Root = (FRACTAL *) NULL; } } #define RAND() goom_random(goomInfo->gRandom) static void ifs_update (PluginInfo * goomInfo, Pixel * data, Pixel * back, int increment, IfsData * fx_data) { static unsigned int couleur = 0xc0c0c0c0; static int v[4] = { 2, 4, 3, 2 }; static int col[4] = { 2, 4, 3, 2 }; #define MOD_MER 0 #define MOD_FEU 1 #define MOD_MERVER 2 static int mode = MOD_MERVER; static int justChanged = 0; static int cycle = 0; int cycle10; int nbpt = 0; IFSPoint *points; int i; unsigned int couleursl = couleur; int width = goomInfo->screen.width; int height = goomInfo->screen.height; cycle++; if (cycle >= 80) cycle = 0; if (cycle < 40) cycle10 = cycle / 10; else cycle10 = 7 - cycle / 10; { unsigned char *tmp = (unsigned char *) &couleursl; for (i = 0; i < 4; i++) { *tmp = (*tmp) >> cycle10; tmp++; } } points = draw_ifs (goomInfo, &nbpt, fx_data); nbpt--; #ifdef HAVE_MMX movd_m2r (couleursl, mm1); punpckldq_r2r (mm1, mm1); for (i = 0; i < nbpt; i += increment) { int x = points[i].x; int y = points[i].y; if ((x < width) && (y < height) && (x > 0) && (y > 0)) { int pos = x + (y * width); movd_m2r (back[pos], mm0); paddusb_r2r (mm1, mm0); movd_r2m (mm0, data[pos]); } } emms (); /*__asm__ __volatile__ ("emms");*/ #else for (i = 0; i < nbpt; i += increment) { int x = (int) points[i].x & 0x7fffffff; int y = (int) points[i].y & 0x7fffffff; if ((x < width) && (y < height)) { int pos = x + (int) (y * width); int tra = 0, i = 0; unsigned char *bra = (unsigned char *) &back[pos]; unsigned char *dra = (unsigned char *) &data[pos]; unsigned char *cra = (unsigned char *) &couleursl; for (; i < 4; i++) { tra = *cra; tra += *bra; if (tra > 255) tra = 255; *dra = tra; ++dra; ++cra; ++bra; } } } #endif /*MMX*/ justChanged--; col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; col[BLEU] = couleur >> (BLEU * 8) & 0xff; col[VERT] = couleur >> (VERT * 8) & 0xff; col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; if (mode == MOD_MER) { col[BLEU] += v[BLEU]; if (col[BLEU] > 255) { col[BLEU] = 255; v[BLEU] = -(RAND () % 4) - 1; } if (col[BLEU] < 32) { col[BLEU] = 32; v[BLEU] = (RAND () % 4) + 1; } col[VERT] += v[VERT]; if (col[VERT] > 200) { col[VERT] = 200; v[VERT] = -(RAND () % 3) - 2; } if (col[VERT] > col[BLEU]) { col[VERT] = col[BLEU]; v[VERT] = v[BLEU]; } if (col[VERT] < 32) { col[VERT] = 32; v[VERT] = (RAND () % 3) + 2; } col[ROUGE] += v[ROUGE]; if (col[ROUGE] > 64) { col[ROUGE] = 64; v[ROUGE] = -(RAND () % 4) - 1; } if (col[ROUGE] < 0) { col[ROUGE] = 0; v[ROUGE] = (RAND () % 4) + 1; } col[ALPHA] += v[ALPHA]; if (col[ALPHA] > 0) { col[ALPHA] = 0; v[ALPHA] = -(RAND () % 4) - 1; } if (col[ALPHA] < 0) { col[ALPHA] = 0; v[ALPHA] = (RAND () % 4) + 1; } if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) && (RAND () % 20 == 0)) && (justChanged < 0)) { mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; justChanged = 250; } } else if (mode == MOD_MERVER) { col[BLEU] += v[BLEU]; if (col[BLEU] > 128) { col[BLEU] = 128; v[BLEU] = -(RAND () % 4) - 1; } if (col[BLEU] < 16) { col[BLEU] = 16; v[BLEU] = (RAND () % 4) + 1; } col[VERT] += v[VERT]; if (col[VERT] > 200) { col[VERT] = 200; v[VERT] = -(RAND () % 3) - 2; } if (col[VERT] > col[ALPHA]) { col[VERT] = col[ALPHA]; v[VERT] = v[ALPHA]; } if (col[VERT] < 32) { col[VERT] = 32; v[VERT] = (RAND () % 3) + 2; } col[ROUGE] += v[ROUGE]; if (col[ROUGE] > 128) { col[ROUGE] = 128; v[ROUGE] = -(RAND () % 4) - 1; } if (col[ROUGE] < 0) { col[ROUGE] = 0; v[ROUGE] = (RAND () % 4) + 1; } col[ALPHA] += v[ALPHA]; if (col[ALPHA] > 255) { col[ALPHA] = 255; v[ALPHA] = -(RAND () % 4) - 1; } if (col[ALPHA] < 0) { col[ALPHA] = 0; v[ALPHA] = (RAND () % 4) + 1; } if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) && (RAND () % 20 == 0)) && (justChanged < 0)) { mode = RAND () % 3 ? MOD_FEU : MOD_MER; justChanged = 250; } } else if (mode == MOD_FEU) { col[BLEU] += v[BLEU]; if (col[BLEU] > 64) { col[BLEU] = 64; v[BLEU] = -(RAND () % 4) - 1; } if (col[BLEU] < 0) { col[BLEU] = 0; v[BLEU] = (RAND () % 4) + 1; } col[VERT] += v[VERT]; if (col[VERT] > 200) { col[VERT] = 200; v[VERT] = -(RAND () % 3) - 2; } if (col[VERT] > col[ROUGE] + 20) { col[VERT] = col[ROUGE] + 20; v[VERT] = -(RAND () % 3) - 2; v[ROUGE] = (RAND () % 4) + 1; v[BLEU] = (RAND () % 4) + 1; } if (col[VERT] < 0) { col[VERT] = 0; v[VERT] = (RAND () % 3) + 2; } col[ROUGE] += v[ROUGE]; if (col[ROUGE] > 255) { col[ROUGE] = 255; v[ROUGE] = -(RAND () % 4) - 1; } if (col[ROUGE] > col[VERT] + 40) { col[ROUGE] = col[VERT] + 40; v[ROUGE] = -(RAND () % 4) - 1; } if (col[ROUGE] < 0) { col[ROUGE] = 0; v[ROUGE] = (RAND () % 4) + 1; } col[ALPHA] += v[ALPHA]; if (col[ALPHA] > 0) { col[ALPHA] = 0; v[ALPHA] = -(RAND () % 4) - 1; } if (col[ALPHA] < 0) { col[ALPHA] = 0; v[ALPHA] = (RAND () % 4) + 1; } if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) && (col[BLEU] > 32) && (RAND () % 20 == 0)) && (justChanged < 0)) { mode = RAND () % 2 ? MOD_MER : MOD_MERVER; justChanged = 250; } } couleur = (col[ALPHA] << (ALPHA * 8)) | (col[BLEU] << (BLEU * 8)) | (col[VERT] << (VERT * 8)) | (col[ROUGE] << (ROUGE * 8)); } /** VISUAL_FX WRAPPER FOR IFS */ static void ifs_vfx_apply (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * goomInfo) { IfsData *data = (IfsData *) _this->fx_data; if (!data->initalized) { data->initalized = 1; init_ifs (goomInfo, data); } ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ } static void ifs_vfx_init (VisualFX * _this, PluginInfo * info) { IfsData *data = (IfsData *) malloc (sizeof (IfsData)); data->Root = (FRACTAL *) NULL; data->initalized = 0; _this->fx_data = data; } static void ifs_vfx_free (VisualFX * _this) { IfsData *data = (IfsData *) _this->fx_data; release_ifs (data); free (data); } void ifs_visualfx_create (VisualFX * vfx) { vfx->init = ifs_vfx_init; vfx->free = ifs_vfx_free; vfx->apply = ifs_vfx_apply; vfx->fx_data = NULL; vfx->params = NULL; } gst-plugins-good-0.10.31/gst/goom/goom_config.h0000644000175000017500000000227411671175353016212 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 #if G_BYTE_ORDER == G_BIG_ENDIAN #define COLOR_ARGB #else #define COLOR_BGRA #endif #if 1 /* ndef COLOR_BGRA */ /** position des composantes **/ #define BLEU 0 #define VERT 1 #define ROUGE 2 #define ALPHA 3 #else #define ROUGE 1 #define BLEU 3 #define VERT 2 #define ALPHA 0 #endif #if defined (BUILD_MMX) && defined (HAVE_GCC_ASM) #define HAVE_MMX #endif gst-plugins-good-0.10.31/gst/goom/goom_typedefs.h0000644000175000017500000000211311671175353016560 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _GOOM_TYPEDEFS_H #define _GOOM_TYPEDEFS_H typedef struct _PLUGIN_INFO PluginInfo; typedef struct _SOUND_INFO SoundInfo; typedef struct _GMLINE GMLine; typedef struct _GMUNITPOINTER GMUnitPointer; typedef struct _ZOOM_FILTER_DATA ZoomFilterData; typedef struct _VISUAL_FX VisualFX; #endif gst-plugins-good-0.10.31/gst/goom/ppc_zoom_ultimate.h0000644000175000017500000000224211671175353017451 00000000000000/* Goom Project * Copyright (C) <2003> Guillaume Borios, iOS-Software * * 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. */ /* Generic PowerPC Code */ void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); /* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); gst-plugins-good-0.10.31/gst/goom/surf3d.h0000644000175000017500000000312411671175353015125 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _SURF3D_H #define _SURF3D_H #include "v3d.h" #include "goom_graphic.h" #include "goom_typedefs.h" typedef struct { v3d *vertex; v3d *svertex; int nbvertex; v3d center; } surf3d; typedef struct { surf3d surf; int defx; int sizex; int defz; int sizez; int mode; } grid3d; /* hi-level */ /* works on grid3d */ grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); void grid3d_free (grid3d *g); void grid3d_update (grid3d *s, float angle, float *vals, float dist); /* low level */ void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); void surf3d_rotate (surf3d *s, float angle); void surf3d_translate (surf3d *s); #endif gst-plugins-good-0.10.31/gst/goom/flying_stars_fx.c0000644000175000017500000002130011671175353017107 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "goom_fx.h" #include "goom_plugin_info.h" #include "goom_tools.h" #include "mathtools.h" /* TODO:-- FAIRE PROPREMENT... BOAH... */ #define NCOL 15 /*static const int colval[] = { 0xfdf6f5, 0xfae4e4, 0xf7d1d1, 0xf3b6b5, 0xefa2a2, 0xec9190, 0xea8282, 0xe87575, 0xe46060, 0xe14b4c, 0xde3b3b, 0xdc2d2f, 0xd92726, 0xd81619, 0xd50c09, 0 }; */ static const int colval[] = { 0x1416181a, 0x1419181a, 0x141f181a, 0x1426181a, 0x142a181a, 0x142f181a, 0x1436181a, 0x142f1819, 0x14261615, 0x13201411, 0x111a100a, 0x0c180508, 0x08100304, 0x00050101, 0x0 }; /* The different modes of the visual FX. * Put this values on fx_mode */ #define FIREWORKS_FX 0 #define RAIN_FX 1 #define FOUNTAIN_FX 2 #define LAST_FX 3 typedef struct _FS_STAR { float x, y; float vx, vy; float ax, ay; float age, vage; } Star; typedef struct _FS_DATA { int fx_mode; int nbStars; int maxStars; Star *stars; float min_age; float max_age; PluginParam min_age_p; PluginParam max_age_p; PluginParam nbStars_p; PluginParam nbStars_limit_p; PluginParam fx_mode_p; PluginParameters params; } FSData; static void fs_init (VisualFX * _this, PluginInfo * info) { FSData *data; data = (FSData *) malloc (sizeof (FSData)); data->fx_mode = FIREWORKS_FX; data->maxStars = 4096; data->stars = (Star *) malloc (data->maxStars * sizeof (Star)); data->nbStars = 0; secure_i_param (&data->max_age_p, "Fireworks Smallest Bombs"); IVAL (data->max_age_p) = 80; IMIN (data->max_age_p) = 0; IMAX (data->max_age_p) = 100; ISTEP (data->max_age_p) = 1; secure_i_param (&data->min_age_p, "Fireworks Largest Bombs"); IVAL (data->min_age_p) = 99; IMIN (data->min_age_p) = 0; IMAX (data->min_age_p) = 100; ISTEP (data->min_age_p) = 1; secure_i_param (&data->nbStars_limit_p, "Max Number of Particules"); IVAL (data->nbStars_limit_p) = 512; IMIN (data->nbStars_limit_p) = 0; IMAX (data->nbStars_limit_p) = data->maxStars; ISTEP (data->nbStars_limit_p) = 64; secure_i_param (&data->fx_mode_p, "FX Mode"); IVAL (data->fx_mode_p) = data->fx_mode; IMIN (data->fx_mode_p) = 1; IMAX (data->fx_mode_p) = 3; ISTEP (data->fx_mode_p) = 1; secure_f_feedback (&data->nbStars_p, "Number of Particules (% of Max)"); plugin_parameters (&data->params, "Particule System", 7); data->params.params[0] = &data->fx_mode_p; data->params.params[1] = &data->nbStars_limit_p; data->params.params[2] = 0; data->params.params[3] = &data->min_age_p; data->params.params[4] = &data->max_age_p; data->params.params[5] = 0; data->params.params[6] = &data->nbStars_p; _this->params = &data->params; _this->fx_data = (void *) data; } static void fs_free (VisualFX * _this) { FSData *data = (FSData *) _this->fx_data; goom_plugin_parameters_free (&data->params); free (data->stars); free (_this->fx_data); } /** * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. */ static void addABomb (FSData * fs, int mx, int my, float radius, float vage, float gravity, PluginInfo * info) { int i = fs->nbStars; float ro; int theta; if (fs->nbStars >= fs->maxStars) return; fs->nbStars++; fs->stars[i].x = mx; fs->stars[i].y = my; ro = radius * (float) goom_irand (info->gRandom, 100) / 100.0f; ro *= (float) goom_irand (info->gRandom, 100) / 100.0f + 1.0f; theta = goom_irand (info->gRandom, 256); fs->stars[i].vx = ro * cos256[theta]; fs->stars[i].vy = -0.2f + ro * sin256[theta]; fs->stars[i].ax = 0; fs->stars[i].ay = gravity; fs->stars[i].age = 0; if (vage < fs->min_age) vage = fs->min_age; fs->stars[i].vage = vage; } /** * Met a jour la position et vitesse d'une particule. */ static void updateStar (Star * s) { s->x += s->vx; s->y += s->vy; s->vx += s->ax; s->vy += s->ay; s->age += s->vage; } /** * Ajoute de nouvelles particules au moment d'un evenement sonore. */ static void fs_sound_event_occured (VisualFX * _this, PluginInfo * info) { FSData *data = (FSData *) _this->fx_data; int i; int max = (int) ((1.0f + info->sound.goomPower) * goom_irand (info->gRandom, 150)) + 100; float radius = (1.0f + info->sound.goomPower) * (float) (goom_irand (info->gRandom, 150) + 50) / 300; int mx; int my; float vage, gravity = 0.02f; switch (data->fx_mode) { case FIREWORKS_FX: { double dx, dy; do { mx = goom_irand (info->gRandom, info->screen.width); my = goom_irand (info->gRandom, info->screen.height); dx = (mx - info->screen.width / 2); dy = (my - info->screen.height / 2); } while (dx * dx + dy * dy < (info->screen.height / 2) * (info->screen.height / 2)); vage = data->max_age * (1.0f - info->sound.goomPower); } break; case RAIN_FX: mx = goom_irand (info->gRandom, info->screen.width); if (mx > info->screen.width / 2) mx = info->screen.width; else mx = 0; my = -(info->screen.height / 3) - goom_irand (info->gRandom, info->screen.width / 3); radius *= 1.5; vage = 0.002f; break; case FOUNTAIN_FX: my = info->screen.height + 2; vage = 0.001f; radius += 1.0f; mx = info->screen.width / 2; gravity = 0.04f; break; default: return; /* my = i R A N D (info->screen.height); vage = 0.01f; */ } radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ max *= info->screen.height / 200.0f; if (info->sound.timeSinceLastBigGoom < 1) { radius *= 1.5; max *= 2; } for (i = 0; i < max; ++i) addABomb (data, mx, my, radius, vage, gravity, info); } /** * Main methode of the FX. */ static void fs_apply (VisualFX * _this, Pixel * src, Pixel * dest, PluginInfo * info) { int i; int col; FSData *data = (FSData *) _this->fx_data; /* Get the new parameters values */ data->min_age = 1.0f - (float) IVAL (data->min_age_p) / 100.0f; data->max_age = 1.0f - (float) IVAL (data->max_age_p) / 100.0f; FVAL (data->nbStars_p) = (float) data->nbStars / (float) data->maxStars; data->nbStars_p.change_listener (&data->nbStars_p); data->maxStars = IVAL (data->nbStars_limit_p); data->fx_mode = IVAL (data->fx_mode_p); /* look for events */ if (info->sound.timeSinceLastGoom < 1) { fs_sound_event_occured (_this, info); if (goom_irand (info->gRandom, 20) == 1) { IVAL (data->fx_mode_p) = goom_irand (info->gRandom, (LAST_FX * 3)); data->fx_mode_p.change_listener (&data->fx_mode_p); } } /* update particules */ for (i = 0; i < data->nbStars; ++i) { updateStar (&data->stars[i]); /* dead particule */ if (data->stars[i].age >= NCOL) continue; /* choose the color of the particule */ col = colval[(int) data->stars[i].age]; /* draws the particule */ info->methods.draw_line (dest, (int) data->stars[i].x, (int) data->stars[i].y, (int) (data->stars[i].x - data->stars[i].vx * 6), (int) (data->stars[i].y - data->stars[i].vy * 6), col, (int) info->screen.width, (int) info->screen.height); info->methods.draw_line (dest, (int) data->stars[i].x, (int) data->stars[i].y, (int) (data->stars[i].x - data->stars[i].vx * 2), (int) (data->stars[i].y - data->stars[i].vy * 2), col, (int) info->screen.width, (int) info->screen.height); } /* look for dead particules */ for (i = 0; i < data->nbStars;) { if ((data->stars[i].x > info->screen.width + 64) || ((data->stars[i].vy >= 0) && (data->stars[i].y - 16 * data->stars[i].vy > info->screen.height)) || (data->stars[i].x < -64) || (data->stars[i].age >= NCOL)) { data->stars[i] = data->stars[data->nbStars - 1]; data->nbStars--; } else ++i; } } void flying_star_create (VisualFX * vfx) { vfx->init = fs_init; vfx->free = fs_free; vfx->apply = fs_apply; vfx->fx_data = NULL; vfx->params = NULL; } gst-plugins-good-0.10.31/gst/goom/v3d.c0000644000175000017500000000230311671175353014404 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "v3d.h" void v3d_to_v2d (v3d * v3, int nbvertex, int width, int height, float distance, v2d * v2) { int i; for (i = 0; i < nbvertex; ++i) { if (v3[i].z > 2) { int Xp, Yp; F2I ((distance * v3[i].x / v3[i].z), Xp); F2I ((distance * v3[i].y / v3[i].z), Yp); v2[i].x = Xp + (width >> 1); v2[i].y = -Yp + (height >> 1); } else v2[i].x = v2[i].y = -666; } } gst-plugins-good-0.10.31/gst/goom/plugin_info.c0000644000175000017500000001717311677341655016242 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 #include "goom_config.h" #include "goom_plugin_info.h" #include "goom_fx.h" #include "drawmethods.h" #include #include #ifdef HAVE_ORC #include #endif #if defined (HAVE_CPU_PPC64) || defined (HAVE_CPU_PPC) #include "ppc_zoom_ultimate.h" #include "ppc_drawings.h" #endif /* HAVE_CPU_PPC64 || HAVE_CPU_PPC */ #ifdef HAVE_MMX #include "mmx.h" #endif /* HAVE_MMX */ #include GST_DEBUG_CATEGORY_EXTERN (goom_debug); #define GST_CAT_DEFAULT goom_debug static void setOptimizedMethods (PluginInfo * p) { #ifdef HAVE_ORC unsigned int cpuFlavour = orc_target_get_default_flags (orc_target_get_by_name ("mmx")); #else unsigned int cpuFlavour = 0; #endif /* set default methods */ p->methods.draw_line = draw_line; p->methods.zoom_filter = zoom_filter_c; /* p->methods.create_output_with_brightness = create_output_with_brightness;*/ GST_INFO ("orc cpu flags: 0x%08x", cpuFlavour); /* FIXME: what about HAVE_CPU_X86_64 ? */ #ifdef HAVE_CPU_I386 #ifdef HAVE_MMX #ifdef HAVE_ORC GST_INFO ("have an x86"); if (cpuFlavour & ORC_TARGET_MMX_MMXEXT) { GST_INFO ("Extended MMX detected. Using the fastest methods!"); p->methods.draw_line = draw_line_xmmx; p->methods.zoom_filter = zoom_filter_xmmx; } else if (cpuFlavour & ORC_TARGET_MMX_MMX) { GST_INFO ("MMX detected. Using fast methods!"); p->methods.draw_line = draw_line_mmx; p->methods.zoom_filter = zoom_filter_mmx; } else { GST_INFO ("Too bad ! No SIMD optimization available for your CPU."); } #endif #endif #endif /* HAVE_CPU_I386 */ /* disable all PPC stuff until someone finds out what to use here instead of * CPU_OPTION_64_BITS, and until someone fixes the assembly build for ppc */ #if 0 #ifdef HAVE_CPU_PPC64 if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { /* p->methods.create_output_with_brightness = ppc_brightness_G5; */ p->methods.zoom_filter = ppc_zoom_generic; } #endif /* HAVE_CPU_PPC64 */ #ifdef HAVE_CPU_PPC if ((cpuFlavour & ORC_TARGET_ALTIVEC_ALTIVEC) != 0) { /* p->methods.create_output_with_brightness = ppc_brightness_G4; */ p->methods.zoom_filter = ppc_zoom_G4; } else { /* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ p->methods.zoom_filter = ppc_zoom_generic; } #endif /* HAVE_CPU_PPC */ #endif cpuFlavour = 0; /* trick compiler into thinking variable is used */ } void plugin_info_init (PluginInfo * pp, int nbVisuals) { int i; memset (pp, 0, sizeof (PluginInfo)); pp->sound.speedvar = pp->sound.accelvar = pp->sound.totalgoom = 0; pp->sound.prov_max = 0; pp->sound.goom_limit = 1; pp->sound.allTimesMax = 1; pp->sound.timeSinceLastGoom = 1; pp->sound.timeSinceLastBigGoom = 1; pp->sound.cycle = 0; secure_f_feedback (&pp->sound.volume_p, "Sound Volume"); secure_f_feedback (&pp->sound.accel_p, "Sound Acceleration"); secure_f_feedback (&pp->sound.speed_p, "Sound Speed"); secure_f_feedback (&pp->sound.goom_limit_p, "Goom Limit"); secure_f_feedback (&pp->sound.last_goom_p, "Goom Detection"); secure_f_feedback (&pp->sound.last_biggoom_p, "Big Goom Detection"); secure_f_feedback (&pp->sound.goom_power_p, "Goom Power"); secure_i_param (&pp->sound.biggoom_speed_limit_p, "Big Goom Speed Limit"); IVAL (pp->sound.biggoom_speed_limit_p) = 10; IMIN (pp->sound.biggoom_speed_limit_p) = 0; IMAX (pp->sound.biggoom_speed_limit_p) = 100; ISTEP (pp->sound.biggoom_speed_limit_p) = 1; secure_i_param (&pp->sound.biggoom_factor_p, "Big Goom Factor"); IVAL (pp->sound.biggoom_factor_p) = 10; IMIN (pp->sound.biggoom_factor_p) = 0; IMAX (pp->sound.biggoom_factor_p) = 100; ISTEP (pp->sound.biggoom_factor_p) = 1; plugin_parameters (&pp->sound.params, "Sound", 11); pp->nbParams = 0; pp->params = NULL; pp->nbVisuals = nbVisuals; pp->visuals = (VisualFX **) malloc (sizeof (VisualFX *) * nbVisuals); pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; pp->sound.params.params[2] = 0; pp->sound.params.params[3] = &pp->sound.volume_p; pp->sound.params.params[4] = &pp->sound.accel_p; pp->sound.params.params[5] = &pp->sound.speed_p; pp->sound.params.params[6] = 0; pp->sound.params.params[7] = &pp->sound.goom_limit_p; pp->sound.params.params[8] = &pp->sound.goom_power_p; pp->sound.params.params[9] = &pp->sound.last_goom_p; pp->sound.params.params[10] = &pp->sound.last_biggoom_p; pp->statesNumber = 8; pp->statesRangeMax = 510; { GoomState states[8] = { {1, 0, 0, 1, 4, 0, 100} , {1, 0, 0, 0, 1, 101, 140} , {1, 0, 0, 1, 2, 141, 200} , {0, 1, 0, 1, 2, 201, 260} , {0, 1, 0, 1, 0, 261, 330} , {0, 1, 1, 1, 4, 331, 400} , {0, 0, 1, 0, 5, 401, 450} , {0, 0, 1, 1, 1, 451, 510} }; for (i = 0; i < 8; ++i) pp->states[i] = states[i]; } pp->curGState = &(pp->states[6]); /* datas for the update loop */ pp->update.lockvar = 0; pp->update.goomvar = 0; pp->update.loopvar = 0; pp->update.stop_lines = 0; pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ pp->update.decay_ifs = 0; /* disparition de l'ifs */ pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ pp->update.cyclesSinceLastChange = 0; pp->update.drawLinesDuration = 80; pp->update.lineMode = pp->update.drawLinesDuration; pp->update.switchMultAmount = (29.0f / 30.0f); pp->update.switchIncrAmount = 0x7f; pp->update.switchMult = 1.0f; pp->update.switchIncr = pp->update.switchIncrAmount; pp->update.stateSelectionRnd = 0; pp->update.stateSelectionBlocker = 0; pp->update.previousZoomSpeed = 128; { ZoomFilterData zfd = { 127, 8, 16, 1, 1, 0, NORMAL_MODE, 0, 0, 0, 0, 0 }; pp->update.zoomFilterData = zfd; } setOptimizedMethods (pp); for (i = 0; i < 0xffff; i++) { pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ } } void plugin_info_add_visual (PluginInfo * p, int i, VisualFX * visual) { p->visuals[i] = visual; if (i == p->nbVisuals - 1) { ++i; p->nbParams = 1; while (i--) { if (p->visuals[i]->params) p->nbParams++; } p->params = (PluginParameters *) malloc (sizeof (PluginParameters) * p->nbParams); i = p->nbVisuals; p->nbParams = 1; p->params[0] = p->sound.params; while (i--) { if (p->visuals[i]->params) p->params[p->nbParams++] = *(p->visuals[i]->params); } } } void plugin_info_free (PluginInfo * p) { goom_plugin_parameters_free (&p->sound.params); if (p->params) free (p->params); free (p->visuals); } gst-plugins-good-0.10.31/gst/goom/ppc_drawings.h0000644000175000017500000000225411671175353016402 00000000000000/* Goom Project * Copyright (C) <2003> Guillaume Borios, iOS-Software * * 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. */ /* Generic PowerPC Code */ void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); /* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); /* G5 Specific PowerPC Code (Possible use of Altivec) */ void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); gst-plugins-good-0.10.31/gst/goom/Makefile.in0000644000175000017500000014423711720560232015613 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/goom DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstgoom_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libgstgoom_la_SOURCES_DIST = gstgoom.c gstgoom.h drawmethods.c \ drawmethods.h sound_tester.c sound_tester.h mathtools.c \ mathtools.h lines.c lines.h ifs.c ifs.h surf3d.c surf3d.h \ tentacle3d.c tentacle3d.h v3d.c v3d.h convolve_fx.c \ flying_stars_fx.c goom_fx.h goom_visual_fx.h motif_goom1.h \ motif_goom2.h plugin_info.c goom_plugin_info.h goom_tools.c \ config_param.c filters.c goom_core.c graphic.c goom.h \ goom_typedefs.h goom_graphic.h goom_config_param.h \ goom_filters.h goom_tools.h goom_config.h mmx.c xmmx.c mmx.h \ xmmx.h am__objects_1 = libgstgoom_la-mmx.lo libgstgoom_la-xmmx.lo @HAVE_CPU_I386_TRUE@am__objects_2 = $(am__objects_1) am_libgstgoom_la_OBJECTS = libgstgoom_la-gstgoom.lo \ libgstgoom_la-drawmethods.lo libgstgoom_la-sound_tester.lo \ libgstgoom_la-mathtools.lo libgstgoom_la-lines.lo \ libgstgoom_la-ifs.lo libgstgoom_la-surf3d.lo \ libgstgoom_la-tentacle3d.lo libgstgoom_la-v3d.lo \ libgstgoom_la-convolve_fx.lo libgstgoom_la-flying_stars_fx.lo \ libgstgoom_la-plugin_info.lo libgstgoom_la-goom_tools.lo \ libgstgoom_la-config_param.lo libgstgoom_la-filters.lo \ libgstgoom_la-goom_core.lo libgstgoom_la-graphic.lo \ $(am__objects_2) libgstgoom_la_OBJECTS = $(am_libgstgoom_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstgoom_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstgoom_la_CFLAGS) $(CFLAGS) \ $(libgstgoom_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstgoom_la_SOURCES) DIST_SOURCES = $(am__libgstgoom_la_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstgoom.la PPC_FILES = ppc_zoom_ultimate.s ppc_drawings.s ppc_drawings.h ppc_zoom_ultimate.h MMX_FILES = mmx.c xmmx.c mmx.h xmmx.h @HAVE_CPU_I386_TRUE@ARCH_FILES = $(MMX_FILES) # disable until someone figures out how to build these correctly on ppc #ARCH_FILES = $(PPC_FILES) @HAVE_CPU_PPC64_TRUE@ARCH_FILES = # disable until someone figures out how to build these correctly on ppc #ARCH_FILES = $(PPC_FILES) @HAVE_CPU_PPC_TRUE@ARCH_FILES = @HAVE_CPU_I386_TRUE@ARCH_CFLAGS = -DBUILD_MMX libgstgoom_la_SOURCES = \ gstgoom.c gstgoom.h \ drawmethods.c drawmethods.h \ sound_tester.c sound_tester.h \ mathtools.c mathtools.h \ lines.c lines.h ifs.c ifs.h surf3d.c surf3d.h \ tentacle3d.c tentacle3d.h v3d.c v3d.h \ convolve_fx.c flying_stars_fx.c \ goom_fx.h goom_visual_fx.h \ motif_goom1.h motif_goom2.h \ plugin_info.c goom_plugin_info.h \ goom_tools.c \ config_param.c filters.c goom_core.c graphic.c \ goom.h goom_typedefs.h goom_graphic.h \ goom_config_param.h goom_visual_fx.h goom_filters.h \ goom_tools.h goom_tools.h goom_config.h \ $(ARCH_FILES) libgstgoom_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GOOM_FILTER_CFLAGS) $(ARCH_CFLAGS) $(ORC_CFLAGS) libgstgoom_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(ORC_LIBS) libgstgoom_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgoom_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = $(PPC_FILES) $(MMX_FILES) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/goom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/goom/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstgoom.la: $(libgstgoom_la_OBJECTS) $(libgstgoom_la_DEPENDENCIES) $(EXTRA_libgstgoom_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstgoom_la_LINK) -rpath $(plugindir) $(libgstgoom_la_OBJECTS) $(libgstgoom_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-config_param.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-convolve_fx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-drawmethods.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-flying_stars_fx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-goom_core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-goom_tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-graphic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-gstgoom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-ifs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-lines.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-mathtools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-mmx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-plugin_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-sound_tester.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-surf3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-tentacle3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-v3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgoom_la-xmmx.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstgoom_la-gstgoom.lo: gstgoom.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-gstgoom.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-gstgoom.Tpo -c -o libgstgoom_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-gstgoom.Tpo $(DEPDIR)/libgstgoom_la-gstgoom.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstgoom.c' object='libgstgoom_la-gstgoom.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-gstgoom.lo `test -f 'gstgoom.c' || echo '$(srcdir)/'`gstgoom.c libgstgoom_la-drawmethods.lo: drawmethods.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-drawmethods.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-drawmethods.Tpo -c -o libgstgoom_la-drawmethods.lo `test -f 'drawmethods.c' || echo '$(srcdir)/'`drawmethods.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-drawmethods.Tpo $(DEPDIR)/libgstgoom_la-drawmethods.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drawmethods.c' object='libgstgoom_la-drawmethods.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-drawmethods.lo `test -f 'drawmethods.c' || echo '$(srcdir)/'`drawmethods.c libgstgoom_la-sound_tester.lo: sound_tester.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-sound_tester.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-sound_tester.Tpo -c -o libgstgoom_la-sound_tester.lo `test -f 'sound_tester.c' || echo '$(srcdir)/'`sound_tester.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-sound_tester.Tpo $(DEPDIR)/libgstgoom_la-sound_tester.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sound_tester.c' object='libgstgoom_la-sound_tester.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-sound_tester.lo `test -f 'sound_tester.c' || echo '$(srcdir)/'`sound_tester.c libgstgoom_la-mathtools.lo: mathtools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-mathtools.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-mathtools.Tpo -c -o libgstgoom_la-mathtools.lo `test -f 'mathtools.c' || echo '$(srcdir)/'`mathtools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-mathtools.Tpo $(DEPDIR)/libgstgoom_la-mathtools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mathtools.c' object='libgstgoom_la-mathtools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-mathtools.lo `test -f 'mathtools.c' || echo '$(srcdir)/'`mathtools.c libgstgoom_la-lines.lo: lines.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-lines.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-lines.Tpo -c -o libgstgoom_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-lines.Tpo $(DEPDIR)/libgstgoom_la-lines.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lines.c' object='libgstgoom_la-lines.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-lines.lo `test -f 'lines.c' || echo '$(srcdir)/'`lines.c libgstgoom_la-ifs.lo: ifs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-ifs.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-ifs.Tpo -c -o libgstgoom_la-ifs.lo `test -f 'ifs.c' || echo '$(srcdir)/'`ifs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-ifs.Tpo $(DEPDIR)/libgstgoom_la-ifs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ifs.c' object='libgstgoom_la-ifs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-ifs.lo `test -f 'ifs.c' || echo '$(srcdir)/'`ifs.c libgstgoom_la-surf3d.lo: surf3d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-surf3d.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-surf3d.Tpo -c -o libgstgoom_la-surf3d.lo `test -f 'surf3d.c' || echo '$(srcdir)/'`surf3d.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-surf3d.Tpo $(DEPDIR)/libgstgoom_la-surf3d.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surf3d.c' object='libgstgoom_la-surf3d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-surf3d.lo `test -f 'surf3d.c' || echo '$(srcdir)/'`surf3d.c libgstgoom_la-tentacle3d.lo: tentacle3d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-tentacle3d.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-tentacle3d.Tpo -c -o libgstgoom_la-tentacle3d.lo `test -f 'tentacle3d.c' || echo '$(srcdir)/'`tentacle3d.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-tentacle3d.Tpo $(DEPDIR)/libgstgoom_la-tentacle3d.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tentacle3d.c' object='libgstgoom_la-tentacle3d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-tentacle3d.lo `test -f 'tentacle3d.c' || echo '$(srcdir)/'`tentacle3d.c libgstgoom_la-v3d.lo: v3d.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-v3d.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-v3d.Tpo -c -o libgstgoom_la-v3d.lo `test -f 'v3d.c' || echo '$(srcdir)/'`v3d.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-v3d.Tpo $(DEPDIR)/libgstgoom_la-v3d.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v3d.c' object='libgstgoom_la-v3d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-v3d.lo `test -f 'v3d.c' || echo '$(srcdir)/'`v3d.c libgstgoom_la-convolve_fx.lo: convolve_fx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-convolve_fx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-convolve_fx.Tpo -c -o libgstgoom_la-convolve_fx.lo `test -f 'convolve_fx.c' || echo '$(srcdir)/'`convolve_fx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-convolve_fx.Tpo $(DEPDIR)/libgstgoom_la-convolve_fx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convolve_fx.c' object='libgstgoom_la-convolve_fx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-convolve_fx.lo `test -f 'convolve_fx.c' || echo '$(srcdir)/'`convolve_fx.c libgstgoom_la-flying_stars_fx.lo: flying_stars_fx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-flying_stars_fx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-flying_stars_fx.Tpo -c -o libgstgoom_la-flying_stars_fx.lo `test -f 'flying_stars_fx.c' || echo '$(srcdir)/'`flying_stars_fx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-flying_stars_fx.Tpo $(DEPDIR)/libgstgoom_la-flying_stars_fx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='flying_stars_fx.c' object='libgstgoom_la-flying_stars_fx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-flying_stars_fx.lo `test -f 'flying_stars_fx.c' || echo '$(srcdir)/'`flying_stars_fx.c libgstgoom_la-plugin_info.lo: plugin_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-plugin_info.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-plugin_info.Tpo -c -o libgstgoom_la-plugin_info.lo `test -f 'plugin_info.c' || echo '$(srcdir)/'`plugin_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-plugin_info.Tpo $(DEPDIR)/libgstgoom_la-plugin_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin_info.c' object='libgstgoom_la-plugin_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-plugin_info.lo `test -f 'plugin_info.c' || echo '$(srcdir)/'`plugin_info.c libgstgoom_la-goom_tools.lo: goom_tools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-goom_tools.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-goom_tools.Tpo -c -o libgstgoom_la-goom_tools.lo `test -f 'goom_tools.c' || echo '$(srcdir)/'`goom_tools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-goom_tools.Tpo $(DEPDIR)/libgstgoom_la-goom_tools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goom_tools.c' object='libgstgoom_la-goom_tools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-goom_tools.lo `test -f 'goom_tools.c' || echo '$(srcdir)/'`goom_tools.c libgstgoom_la-config_param.lo: config_param.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-config_param.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-config_param.Tpo -c -o libgstgoom_la-config_param.lo `test -f 'config_param.c' || echo '$(srcdir)/'`config_param.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-config_param.Tpo $(DEPDIR)/libgstgoom_la-config_param.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config_param.c' object='libgstgoom_la-config_param.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-config_param.lo `test -f 'config_param.c' || echo '$(srcdir)/'`config_param.c libgstgoom_la-filters.lo: filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-filters.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-filters.Tpo -c -o libgstgoom_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-filters.Tpo $(DEPDIR)/libgstgoom_la-filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='libgstgoom_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c libgstgoom_la-goom_core.lo: goom_core.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-goom_core.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-goom_core.Tpo -c -o libgstgoom_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-goom_core.Tpo $(DEPDIR)/libgstgoom_la-goom_core.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='goom_core.c' object='libgstgoom_la-goom_core.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-goom_core.lo `test -f 'goom_core.c' || echo '$(srcdir)/'`goom_core.c libgstgoom_la-graphic.lo: graphic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-graphic.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-graphic.Tpo -c -o libgstgoom_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-graphic.Tpo $(DEPDIR)/libgstgoom_la-graphic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='graphic.c' object='libgstgoom_la-graphic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-graphic.lo `test -f 'graphic.c' || echo '$(srcdir)/'`graphic.c libgstgoom_la-mmx.lo: mmx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-mmx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-mmx.Tpo -c -o libgstgoom_la-mmx.lo `test -f 'mmx.c' || echo '$(srcdir)/'`mmx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-mmx.Tpo $(DEPDIR)/libgstgoom_la-mmx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mmx.c' object='libgstgoom_la-mmx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-mmx.lo `test -f 'mmx.c' || echo '$(srcdir)/'`mmx.c libgstgoom_la-xmmx.lo: xmmx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -MT libgstgoom_la-xmmx.lo -MD -MP -MF $(DEPDIR)/libgstgoom_la-xmmx.Tpo -c -o libgstgoom_la-xmmx.lo `test -f 'xmmx.c' || echo '$(srcdir)/'`xmmx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstgoom_la-xmmx.Tpo $(DEPDIR)/libgstgoom_la-xmmx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xmmx.c' object='libgstgoom_la-xmmx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstgoom_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgoom_la_CFLAGS) $(CFLAGS) -c -o libgstgoom_la-xmmx.lo `test -f 'xmmx.c' || echo '$(srcdir)/'`xmmx.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES .NOTPARALLEL: Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstgoom -:SHARED libgstgoom \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstgoom_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstgoom_la_CFLAGS) \ -:LDFLAGS $(libgstgoom_la_LDFLAGS) \ $(libgstgoom_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/goom/goom_fx.h0000644000175000017500000000213511671175353015356 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _GOOM_FX_H #define _GOOM_FX_H #include "goom_visual_fx.h" #include "goom_plugin_info.h" void convolve_create (VisualFX *vfx); void flying_star_create (VisualFX *vfx); void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); #endif gst-plugins-good-0.10.31/gst/goom/gstgoom.c0000644000175000017500000004410611677341655015404 00000000000000/* gstgoom.c: implementation of goom drawing element * Copyright (C) <2001> Richard Boulton * (C) <2006> Wim Taymans * * 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-goom * @see_also: synaesthesia * * Goom is an audio visualisation element. It creates warping structures * based on the incoming audio signal. * * * Example launch line * |[ * gst-launch -v audiotestsrc ! goom ! ffmpegcolorspace ! xvimagesink * ]| * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstgoom.h" #include #include "goom.h" #if HAVE_ORC #include #endif GST_DEBUG_CATEGORY (goom_debug); #define GST_CAT_DEFAULT goom_debug #define DEFAULT_WIDTH 320 #define DEFAULT_HEIGHT 240 #define DEFAULT_FPS_N 25 #define DEFAULT_FPS_D 1 /* signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 /* FILL ME */ }; static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) ); static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", /* the name of the pads */ GST_PAD_SINK, /* type of the pad */ GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */ GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BYTE_ORDER, " "signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 8000, 96000 ], " "channels = (int) { 1, 2 }") ); static void gst_goom_class_init (GstGoomClass * klass); static void gst_goom_base_init (GstGoomClass * klass); static void gst_goom_init (GstGoom * goom); static void gst_goom_finalize (GObject * object); static GstStateChangeReturn gst_goom_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_goom_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_goom_src_event (GstPad * pad, GstEvent * event); static gboolean gst_goom_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_goom_src_query (GstPad * pad, GstQuery * query); static gboolean gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_goom_src_setcaps (GstPad * pad, GstCaps * caps); static GstElementClass *parent_class = NULL; GType gst_goom_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo info = { sizeof (GstGoomClass), (GBaseInitFunc) gst_goom_base_init, NULL, (GClassInitFunc) gst_goom_class_init, NULL, NULL, sizeof (GstGoom), 0, (GInstanceInitFunc) gst_goom_init, }; type = g_type_register_static (GST_TYPE_ELEMENT, "GstGoom", &info, 0); } return type; } static void gst_goom_base_init (GstGoomClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_details_simple (element_class, "GOOM: what a GOOM!", "Visualization", "Takes frames of data and outputs video frames using the GOOM filter", "Wim Taymans "); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); } static void gst_goom_class_init (GstGoomClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_goom_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_goom_change_state); } static void gst_goom_init (GstGoom * goom) { /* create the sink and src pads */ goom->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_chain_function (goom->sinkpad, GST_DEBUG_FUNCPTR (gst_goom_chain)); gst_pad_set_event_function (goom->sinkpad, GST_DEBUG_FUNCPTR (gst_goom_sink_event)); gst_pad_set_setcaps_function (goom->sinkpad, GST_DEBUG_FUNCPTR (gst_goom_sink_setcaps)); gst_element_add_pad (GST_ELEMENT (goom), goom->sinkpad); goom->srcpad = gst_pad_new_from_static_template (&src_template, "src"); gst_pad_set_setcaps_function (goom->srcpad, GST_DEBUG_FUNCPTR (gst_goom_src_setcaps)); gst_pad_set_event_function (goom->srcpad, GST_DEBUG_FUNCPTR (gst_goom_src_event)); gst_pad_set_query_function (goom->srcpad, GST_DEBUG_FUNCPTR (gst_goom_src_query)); gst_element_add_pad (GST_ELEMENT (goom), goom->srcpad); goom->adapter = gst_adapter_new (); goom->width = DEFAULT_WIDTH; goom->height = DEFAULT_HEIGHT; goom->fps_n = DEFAULT_FPS_N; /* desired frame rate */ goom->fps_d = DEFAULT_FPS_D; /* desired frame rate */ goom->channels = 0; goom->rate = 0; goom->duration = 0; goom->plugin = goom_init (goom->width, goom->height); } static void gst_goom_finalize (GObject * object) { GstGoom *goom = GST_GOOM (object); goom_close (goom->plugin); goom->plugin = NULL; g_object_unref (goom->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_goom_reset (GstGoom * goom) { gst_adapter_clear (goom->adapter); gst_segment_init (&goom->segment, GST_FORMAT_UNDEFINED); GST_OBJECT_LOCK (goom); goom->proportion = 1.0; goom->earliest_time = -1; GST_OBJECT_UNLOCK (goom); } static gboolean gst_goom_sink_setcaps (GstPad * pad, GstCaps * caps) { GstGoom *goom; GstStructure *structure; gboolean res; goom = GST_GOOM (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); res = gst_structure_get_int (structure, "channels", &goom->channels); res &= gst_structure_get_int (structure, "rate", &goom->rate); goom->bps = goom->channels * sizeof (gint16); return res; } static gboolean gst_goom_src_setcaps (GstPad * pad, GstCaps * caps) { GstGoom *goom; GstStructure *structure; goom = GST_GOOM (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "width", &goom->width) || !gst_structure_get_int (structure, "height", &goom->height) || !gst_structure_get_fraction (structure, "framerate", &goom->fps_n, &goom->fps_d)) return FALSE; goom_set_resolution (goom->plugin, goom->width, goom->height); /* size of the output buffer in bytes, depth is always 4 bytes */ goom->outsize = goom->width * goom->height * 4; goom->duration = gst_util_uint64_scale_int (GST_SECOND, goom->fps_d, goom->fps_n); goom->spf = gst_util_uint64_scale_int (goom->rate, goom->fps_d, goom->fps_n); goom->bpf = goom->spf * goom->bps; GST_DEBUG_OBJECT (goom, "dimension %dx%d, framerate %d/%d, spf %d", goom->width, goom->height, goom->fps_n, goom->fps_d, goom->spf); return TRUE; } static gboolean gst_goom_src_negotiate (GstGoom * goom) { GstCaps *othercaps, *target; GstStructure *structure; const GstCaps *templ; templ = gst_pad_get_pad_template_caps (goom->srcpad); GST_DEBUG_OBJECT (goom, "performing negotiation"); /* see what the peer can do */ othercaps = gst_pad_peer_get_caps (goom->srcpad); if (othercaps) { target = gst_caps_intersect (othercaps, templ); gst_caps_unref (othercaps); if (gst_caps_is_empty (target)) goto no_format; gst_caps_truncate (target); } else { target = gst_caps_ref ((GstCaps *) templ); } structure = gst_caps_get_structure (target, 0); gst_structure_fixate_field_nearest_int (structure, "width", DEFAULT_WIDTH); gst_structure_fixate_field_nearest_int (structure, "height", DEFAULT_HEIGHT); gst_structure_fixate_field_nearest_fraction (structure, "framerate", DEFAULT_FPS_N, DEFAULT_FPS_D); gst_pad_set_caps (goom->srcpad, target); gst_caps_unref (target); return TRUE; no_format: { gst_caps_unref (target); return FALSE; } } static gboolean gst_goom_src_event (GstPad * pad, GstEvent * event) { gboolean res; GstGoom *goom; goom = GST_GOOM (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS: { gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; gst_event_parse_qos (event, &proportion, &diff, ×tamp); /* save stuff for the _chain() function */ GST_OBJECT_LOCK (goom); goom->proportion = proportion; if (diff >= 0) /* we're late, this is a good estimate for next displayable * frame (see part-qos.txt) */ goom->earliest_time = timestamp + 2 * diff + goom->duration; else goom->earliest_time = timestamp + diff; GST_OBJECT_UNLOCK (goom); res = gst_pad_push_event (goom->sinkpad, event); break; } default: res = gst_pad_push_event (goom->sinkpad, event); break; } gst_object_unref (goom); return res; } static gboolean gst_goom_sink_event (GstPad * pad, GstEvent * event) { gboolean res; GstGoom *goom; goom = GST_GOOM (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: res = gst_pad_push_event (goom->srcpad, event); break; case GST_EVENT_FLUSH_STOP: gst_goom_reset (goom); res = gst_pad_push_event (goom->srcpad, event); break; case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time; gboolean update; /* the newsegment values are used to clip the input samples * and to convert the incomming timestamps to running time so * we can do QoS */ gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); /* now configure the values */ gst_segment_set_newsegment_full (&goom->segment, update, rate, arate, format, start, stop, time); res = gst_pad_push_event (goom->srcpad, event); break; } default: res = gst_pad_push_event (goom->srcpad, event); break; } gst_object_unref (goom); return res; } static gboolean gst_goom_src_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstGoom *goom; goom = GST_GOOM (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { /* We need to send the query upstream and add the returned latency to our * own */ GstClockTime min_latency, max_latency; gboolean us_live; GstClockTime our_latency; guint max_samples; if (goom->rate == 0) break; if ((res = gst_pad_peer_query (goom->sinkpad, query))) { gst_query_parse_latency (query, &us_live, &min_latency, &max_latency); GST_DEBUG_OBJECT (goom, "Peer latency: min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); /* the max samples we must buffer buffer */ max_samples = MAX (GOOM_SAMPLES, goom->spf); our_latency = gst_util_uint64_scale_int (max_samples, GST_SECOND, goom->rate); GST_DEBUG_OBJECT (goom, "Our latency: %" GST_TIME_FORMAT, GST_TIME_ARGS (our_latency)); /* we add some latency but only if we need to buffer more than what * upstream gives us */ min_latency += our_latency; if (max_latency != -1) max_latency += our_latency; GST_DEBUG_OBJECT (goom, "Calculated total latency : min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); gst_query_set_latency (query, TRUE, min_latency, max_latency); } break; } default: res = gst_pad_peer_query (goom->sinkpad, query); break; } gst_object_unref (goom); return res; } static GstFlowReturn get_buffer (GstGoom * goom, GstBuffer ** outbuf) { GstFlowReturn ret; if (GST_PAD_CAPS (goom->srcpad) == NULL) { if (!gst_goom_src_negotiate (goom)) return GST_FLOW_NOT_NEGOTIATED; } GST_DEBUG_OBJECT (goom, "allocating output buffer with caps %" GST_PTR_FORMAT, GST_PAD_CAPS (goom->srcpad)); ret = gst_pad_alloc_buffer_and_set_caps (goom->srcpad, GST_BUFFER_OFFSET_NONE, goom->outsize, GST_PAD_CAPS (goom->srcpad), outbuf); if (ret != GST_FLOW_OK) return ret; return GST_FLOW_OK; } static GstFlowReturn gst_goom_chain (GstPad * pad, GstBuffer * buffer) { GstGoom *goom; GstFlowReturn ret; GstBuffer *outbuf = NULL; goom = GST_GOOM (gst_pad_get_parent (pad)); if (goom->bps == 0) { ret = GST_FLOW_NOT_NEGOTIATED; goto beach; } /* If we don't have an output format yet, preallocate a buffer to try and * set one */ if (GST_PAD_CAPS (goom->srcpad) == NULL) { ret = get_buffer (goom, &outbuf); if (ret != GST_FLOW_OK) { gst_buffer_unref (buffer); goto beach; } } /* don't try to combine samples from discont buffer */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { gst_adapter_clear (goom->adapter); } GST_DEBUG_OBJECT (goom, "Input buffer has %d samples, time=%" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer) / goom->bps, GST_BUFFER_TIMESTAMP (buffer)); /* Collect samples until we have enough for an output frame */ gst_adapter_push (goom->adapter, buffer); ret = GST_FLOW_OK; while (TRUE) { const guint16 *data; gboolean need_skip; guchar *out_frame; gint i; guint avail, to_flush; guint64 dist, timestamp; avail = gst_adapter_available (goom->adapter); GST_DEBUG_OBJECT (goom, "avail now %u", avail); /* we need GOOM_SAMPLES to get a meaningful result from goom. */ if (avail < (GOOM_SAMPLES * goom->bps)) break; /* we also need enough samples to produce one frame at least */ if (avail < goom->bpf) break; GST_DEBUG_OBJECT (goom, "processing buffer"); /* get timestamp of the current adapter byte */ timestamp = gst_adapter_prev_timestamp (goom->adapter, &dist); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { /* convert bytes to time */ dist /= goom->bps; timestamp += gst_util_uint64_scale_int (dist, GST_SECOND, goom->rate); } if (timestamp != -1) { gint64 qostime; qostime = gst_segment_to_running_time (&goom->segment, GST_FORMAT_TIME, timestamp); qostime += goom->duration; GST_OBJECT_LOCK (goom); /* check for QoS, don't compute buffers that are known to be late */ need_skip = goom->earliest_time != -1 && qostime <= goom->earliest_time; GST_OBJECT_UNLOCK (goom); if (need_skip) { GST_WARNING_OBJECT (goom, "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (goom->earliest_time)); goto skip; } } /* get next GOOM_SAMPLES, we have at least this amount of samples */ data = (const guint16 *) gst_adapter_peek (goom->adapter, GOOM_SAMPLES * goom->bps); if (goom->channels == 2) { for (i = 0; i < GOOM_SAMPLES; i++) { goom->datain[0][i] = *data++; goom->datain[1][i] = *data++; } } else { for (i = 0; i < GOOM_SAMPLES; i++) { goom->datain[0][i] = *data; goom->datain[1][i] = *data++; } } /* alloc a buffer if we don't have one yet, this happens * when we pushed a buffer in this while loop before */ if (outbuf == NULL) { ret = get_buffer (goom, &outbuf); if (ret != GST_FLOW_OK) { goto beach; } } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = goom->duration; GST_BUFFER_SIZE (outbuf) = goom->outsize; out_frame = (guchar *) goom_update (goom->plugin, goom->datain, 0, 0); memcpy (GST_BUFFER_DATA (outbuf), out_frame, goom->outsize); GST_DEBUG ("Pushing frame with time=%" GST_TIME_FORMAT ", duration=%" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (goom->duration)); ret = gst_pad_push (goom->srcpad, outbuf); outbuf = NULL; skip: /* Now flush the samples we needed for this frame, which might be more than * the samples we used (GOOM_SAMPLES). */ to_flush = goom->bpf; GST_DEBUG_OBJECT (goom, "finished frame, flushing %u bytes from input", to_flush); gst_adapter_flush (goom->adapter, to_flush); if (ret != GST_FLOW_OK) break; } if (outbuf != NULL) gst_buffer_unref (outbuf); beach: gst_object_unref (goom); return ret; } static GstStateChangeReturn gst_goom_change_state (GstElement * element, GstStateChange transition) { GstGoom *goom = GST_GOOM (element); GstStateChangeReturn ret; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_goom_reset (goom); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (goom_debug, "goom", 0, "goom visualisation element"); #if HAVE_ORC orc_init (); #endif return gst_element_register (plugin, "goom", GST_RANK_NONE, GST_TYPE_GOOM); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "goom", "GOOM visualization filter", plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/goom/xmmx.h0000644000175000017500000003525711671175353014724 00000000000000/* xmmx.h eXtended MultiMedia eXtensions GCC interface library for IA32. To use this library, simply include this header file and compile with GCC. You MUST have inlining enabled in order for xmmx_ok() to work; this can be done by simply using -O on the GCC command line. Compiling with -DXMMX_TRACE will cause detailed trace output to be sent to stderr for each mmx operation. This adds lots of code, and obviously slows execution to a crawl, but can be very useful for debugging. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. 1999 by R. Fisher Based on libmmx, 1997-99 by H. Dietz and R. Fisher Notes: It appears that the latest gas has the pand problem fixed, therefore I'll undefine BROKEN_PAND by default. */ #ifndef _XMMX_H #define _XMMX_H /* Warning: at this writing, the version of GAS packaged with most Linux distributions does not handle the parallel AND operation mnemonic correctly. If the symbol BROKEN_PAND is defined, a slower alternative coding will be used. If execution of mmxtest results in an illegal instruction fault, define this symbol. */ #undef BROKEN_PAND /* The type of an value that fits in an (Extended) MMX register (note that long long constant values MUST be suffixed by LL and unsigned long long values by ULL, lest they be truncated by the compiler) */ #ifndef _MMX_H typedef union { long long q; /* Quadword (64-bit) value */ unsigned long long uq; /* Unsigned Quadword */ int d[2]; /* 2 Doubleword (32-bit) values */ unsigned int ud[2]; /* 2 Unsigned Doubleword */ short w[4]; /* 4 Word (16-bit) values */ unsigned short uw[4]; /* 4 Unsigned Word */ char b[8]; /* 8 Byte (8-bit) values */ unsigned char ub[8]; /* 8 Unsigned Byte */ float s[2]; /* Single-precision (32-bit) value */ } __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ #endif /* Function to test if multimedia instructions are supported... */ static int mm_support(void) { /* Returns 1 if MMX instructions are supported, 3 if Cyrix MMX and Extended MMX instructions are supported 5 if AMD MMX and 3DNow! instructions are supported 0 if hardware does not support any of these */ register int rval = 0; __asm__ __volatile__ ( /* See if CPUID instruction is supported ... */ /* ... Get copies of EFLAGS into eax and ecx */ "pushf\n\t" "popl %%eax\n\t" "movl %%eax, %%ecx\n\t" /* ... Toggle the ID bit in one copy and store */ /* to the EFLAGS reg */ "xorl $0x200000, %%eax\n\t" "push %%eax\n\t" "popf\n\t" /* ... Get the (hopefully modified) EFLAGS */ "pushf\n\t" "popl %%eax\n\t" /* ... Compare and test result */ "xorl %%eax, %%ecx\n\t" "testl $0x200000, %%ecx\n\t" "jz NotSupported1\n\t" /* CPUID not supported */ /* Get standard CPUID information, and go to a specific vendor section */ "movl $0, %%eax\n\t" "cpuid\n\t" /* Check for Intel */ "cmpl $0x756e6547, %%ebx\n\t" "jne TryAMD\n\t" "cmpl $0x49656e69, %%edx\n\t" "jne TryAMD\n\t" "cmpl $0x6c65746e, %%ecx\n" "jne TryAMD\n\t" "jmp Intel\n\t" /* Check for AMD */ "\nTryAMD:\n\t" "cmpl $0x68747541, %%ebx\n\t" "jne TryCyrix\n\t" "cmpl $0x69746e65, %%edx\n\t" "jne TryCyrix\n\t" "cmpl $0x444d4163, %%ecx\n" "jne TryCyrix\n\t" "jmp AMD\n\t" /* Check for Cyrix */ "\nTryCyrix:\n\t" "cmpl $0x69727943, %%ebx\n\t" "jne NotSupported2\n\t" "cmpl $0x736e4978, %%edx\n\t" "jne NotSupported3\n\t" "cmpl $0x64616574, %%ecx\n\t" "jne NotSupported4\n\t" /* Drop through to Cyrix... */ /* Cyrix Section */ /* See if extended CPUID level 80000001 is supported */ /* The value of CPUID/80000001 for the 6x86MX is undefined according to the Cyrix CPU Detection Guide (Preliminary Rev. 1.01 table 1), so we'll check the value of eax for CPUID/0 to see if standard CPUID level 2 is supported. According to the table, the only CPU which supports level 2 is also the only one which supports extended CPUID levels. */ "cmpl $0x2, %%eax\n\t" "jne MMXtest\n\t" /* Use standard CPUID instead */ /* Extended CPUID supported (in theory), so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%eax\n\t" /* Test for MMX */ "jz NotSupported5\n\t" /* MMX not supported */ "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ "jnz EMMXSupported\n\t" "movl $1, %0:\n\n\t" /* MMX Supported */ "jmp Return\n\n" "EMMXSupported:\n\t" "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ "jmp Return\n\t" /* AMD Section */ "AMD:\n\t" /* See if extended CPUID is supported */ "movl $0x80000000, %%eax\n\t" "cpuid\n\t" "cmpl $0x80000000, %%eax\n\t" "jl MMXtest\n\t" /* Use standard CPUID instead */ /* Extended CPUID supported, so get extended features */ "movl $0x80000001, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported6\n\t" /* MMX not supported */ "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ "jnz ThreeDNowSupported\n\t" "movl $1, %0:\n\n\t" /* MMX Supported */ "jmp Return\n\n" "ThreeDNowSupported:\n\t" "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ "jmp Return\n\t" /* Intel Section */ "Intel:\n\t" /* Check for MMX */ "MMXtest:\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "testl $0x00800000, %%edx\n\t" /* Test for MMX */ "jz NotSupported7\n\t" /* MMX Not supported */ "movl $1, %0:\n\n\t" /* MMX Supported */ "jmp Return\n\t" /* Nothing supported */ "\nNotSupported1:\n\t" "#movl $101, %0:\n\n\t" "\nNotSupported2:\n\t" "#movl $102, %0:\n\n\t" "\nNotSupported3:\n\t" "#movl $103, %0:\n\n\t" "\nNotSupported4:\n\t" "#movl $104, %0:\n\n\t" "\nNotSupported5:\n\t" "#movl $105, %0:\n\n\t" "\nNotSupported6:\n\t" "#movl $106, %0:\n\n\t" "\nNotSupported7:\n\t" "#movl $107, %0:\n\n\t" "movl $0, %0:\n\n\t" "Return:\n\t" : "=a" (rval) : /* no input */ : "eax", "ebx", "ecx", "edx" ); /* Return */ return(rval); } /* Function to test if mmx instructions are supported... */ #ifndef _XMMX_H inline extern int mmx_ok(void) { /* Returns 1 if MMX instructions are supported, 0 otherwise */ return ( mm_support() & 0x1 ); } #endif /* Function to test if xmmx instructions are supported... */ inline extern int xmmx_ok(void) { /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ return ( (mm_support() & 0x2) >> 1 ); } /* Helper functions for the instruction macros that follow... (note that memory-to-register, m2r, instructions are nearly as efficient as register-to-register, r2r, instructions; however, memory-to-memory instructions are really simulated as a convenience, and are only 1/3 as efficient) */ #ifdef XMMX_TRACE /* Include the stuff for printing a trace to stderr... */ #include #define mmx_i2r(op, imm, reg) \ { \ mmx_t mmx_trace; \ mmx_trace.uq = (imm); \ fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_m2r(op, mem, reg) \ { \ mmx_t mmx_trace; \ mmx_trace = (mem); \ fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (mem)); \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #reg "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_r2m(op, reg, mem) \ { \ mmx_t mmx_trace; \ __asm__ __volatile__ ("movq %%" #reg ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ mmx_trace = (mem); \ fprintf(stderr, #mem "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=X" (mem) \ : /* nothing */ ); \ mmx_trace = (mem); \ fprintf(stderr, #mem "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_r2r(op, regs, regd) \ { \ mmx_t mmx_trace; \ __asm__ __volatile__ ("movq %%" #regs ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #regd "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ __asm__ __volatile__ ("movq %%" #regd ", %0" \ : "=X" (mmx_trace) \ : /* nothing */ ); \ fprintf(stderr, #regd "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #define mmx_m2m(op, mems, memd) \ { \ mmx_t mmx_trace; \ mmx_trace = (mems); \ fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ mmx_trace.d[1], mmx_trace.d[0]); \ mmx_trace = (memd); \ fprintf(stderr, #memd "=0x%08x%08x) => ", \ mmx_trace.d[1], mmx_trace.d[0]); \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (memd) \ : "X" (mems)); \ mmx_trace = (memd); \ fprintf(stderr, #memd "=0x%08x%08x\n", \ mmx_trace.d[1], mmx_trace.d[0]); \ } #else /* These macros are a lot simpler without the tracing... */ #define mmx_i2r(op, imm, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (imm) ) #define mmx_m2r(op, mem, reg) \ __asm__ __volatile__ (#op " %0, %%" #reg \ : /* nothing */ \ : "X" (mem)) #define mmx_m2ir(op, mem, rs) \ __asm__ __volatile__ (#op " %0, %%" #rs \ : /* nothing */ \ : "X" (mem) ) #define mmx_r2m(op, reg, mem) \ __asm__ __volatile__ (#op " %%" #reg ", %0" \ : "=X" (mem) \ : /* nothing */ ) #define mmx_r2r(op, regs, regd) \ __asm__ __volatile__ (#op " %" #regs ", %" #regd) #define mmx_r2ir(op, rs1, rs2) \ __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ : /* nothing */ \ : /* nothing */ ) #define mmx_m2m(op, mems, memd) \ __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ #op " %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (memd) \ : "X" (mems)) #endif /* 1x64 MOVe Quadword (this is both a load and a store... in fact, it is the only way to store) */ #define movq_m2r(var, reg) mmx_m2r(movq, var, reg) #define movq_r2m(reg, var) mmx_r2m(movq, reg, var) #define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) #define movq(vars, vard) \ __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ "movq %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 1x32 MOVe Doubleword (like movq, this is both load and store... but is most useful for moving things between mmx registers and ordinary registers) */ #define movd_m2r(var, reg) mmx_m2r(movd, var, reg) #define movd_r2m(reg, var) mmx_r2m(movd, reg, var) #define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) #define movd(vars, vard) \ __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ "movd %%mm0, %0" \ : "=X" (vard) \ : "X" (vars)) /* 4x16 Parallel MAGnitude */ #define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) #define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) #define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) /* 4x16 Parallel ADDs using Saturation arithmetic and Implied destination */ #define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) #define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) #define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) /* 4x16 Parallel SUBs using Saturation arithmetic and Implied destination */ #define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) #define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) #define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) /* 4x16 Parallel MULs giving High 4x16 portions of results Rounded with 1/2 bit 15. */ #define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) #define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) #define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) /* 4x16 Parallel MULs giving High 4x16 portions of results Rounded with 1/2 bit 15, storing to Implied register */ #define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) #define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) #define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) /* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions of results Rounded with 1/2 bit 15, accumulating with Implied register */ #define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) #define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) #define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) /* 8x8u Parallel AVErage */ #define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) #define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) #define paveb(vars, vard) mmx_m2m(paveb, vars, vard) /* 8x8u Parallel DISTance and accumulate with unsigned saturation to Implied register */ #define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) #define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) /* 8x8 Parallel conditional MoVe if implied register field is Zero */ #define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) /* 8x8 Parallel conditional MoVe if implied register field is Not Zero */ #define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) /* 8x8 Parallel conditional MoVe if implied register field is Less than Zero */ #define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) /* 8x8 Parallel conditional MoVe if implied register field is Greater than or Equal to Zero */ #define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) /* Fast Empty MMx State (used to clean-up when going from mmx to float use of the registers that are shared by both; note that there is no float-to-xmmx operation needed, because only the float tag word info is corruptible) */ #ifdef XMMX_TRACE #define femms() \ { \ fprintf(stderr, "femms()\n"); \ __asm__ __volatile__ ("femms"); \ } #else #define femms() __asm__ __volatile__ ("femms") #endif #endif gst-plugins-good-0.10.31/gst/goom/goom_config_param.h0000644000175000017500000000701411671175353017367 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 _CONFIG_PARAM_H #define _CONFIG_PARAM_H #include /* * File created on 2003-05-24 by Jeko. * (c)2003, JC Hoelt for iOS-software. * * LGPL Licence. */ typedef enum { PARAM_INTVAL, PARAM_FLOATVAL, PARAM_BOOLVAL, PARAM_STRVAL, PARAM_LISTVAL, } ParamType; struct IntVal { int value; int min; int max; int step; }; struct FloatVal { float value; float min; float max; float step; }; struct StrVal { char *value; }; struct ListVal { char *value; int nbChoices; char **choices; }; struct BoolVal { int value; }; typedef struct _PARAM { const char *name; const char *desc; char rw; ParamType type; union { struct IntVal ival; struct FloatVal fval; struct StrVal sval; struct ListVal slist; struct BoolVal bval; } param; /* used by the core to inform the GUI of a change */ void (*change_listener)(struct _PARAM *_this); /* used by the GUI to inform the core of a change */ void (*changed)(struct _PARAM *_this); void *user_data; /* can be used by the GUI */ } PluginParam; #define IVAL(p) ((p).param.ival.value) #define SVAL(p) ((p).param.sval.value) #define FVAL(p) ((p).param.fval.value) #define BVAL(p) ((p).param.bval.value) #define LVAL(p) ((p).param.slist.value) #define FMIN(p) ((p).param.fval.min) #define FMAX(p) ((p).param.fval.max) #define FSTEP(p) ((p).param.fval.step) #define IMIN(p) ((p).param.ival.min) #define IMAX(p) ((p).param.ival.max) #define ISTEP(p) ((p).param.ival.step) void goom_secure_param(PluginParam *p); void goom_secure_f_param(PluginParam *p, const char *name); void goom_secure_i_param(PluginParam *p, const char *name); void goom_secure_b_param(PluginParam *p, const char *name, int value); void goom_secure_s_param(PluginParam *p, const char *name); void goom_secure_f_feedback(PluginParam *p, const char *name); void goom_secure_i_feedback(PluginParam *p, const char *name); void goom_set_str_param_value(PluginParam *p, const char *str); void goom_set_list_param_value(PluginParam *p, const char *str); typedef struct _PARAMETERS { const char *name; const char *desc; int nbParams; PluginParam **params; } PluginParameters; void goom_plugin_parameters(PluginParameters *p, const char *name, int nb); void goom_plugin_parameters_free(PluginParameters *p); #define secure_param goom_secure_param #define secure_f_param goom_secure_f_param #define secure_i_param goom_secure_i_param #define secure_b_param goom_secure_b_param #define secure_s_param goom_secure_s_param #define secure_f_feedback goom_secure_f_feedback #define secure_i_feedback goom_secure_i_feedback #define set_list_param_value goom_set_list_param_value #define set_str_param_value goom_set_str_param_value #define plugin_parameters goom_plugin_parameters #endif gst-plugins-good-0.10.31/gst/goom/graphic.c0000644000175000017500000000220311671175353015324 00000000000000/* Goom Project * Copyright (C) <2003> iOS-Software * * 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 "goom_graphic.h" const Color BLACK = { 0, 0, 0 }; const Color WHITE = { 0xff, 0xff, 0xff }; const Color RED = { 0xff, 0x05, 0x05 }; const Color GREEN = { 0x05, 0xff, 0x05 }; const Color BLUE = { 0x05, 0x05, 0xff }; const Color YELLOW = { 0xff, 0xff, 0x33 }; const Color ORANGE = { 0xff, 0xcc, 0x05 }; const Color VIOLET = { 0x55, 0x05, 0xff }; gst-plugins-good-0.10.31/gst/rtp/0000755000175000017500000000000011720565306013466 500000000000000gst-plugins-good-0.10.31/gst/rtp/gstrtpg726depay.c0000644000175000017500000002730311677341656016546 00000000000000/* GStreamer * Copyright (C) 1999 Erik Walthinsen * Copyright (C) 2005 Edgard Lima * Copyright (C) 2005 Zeeshan Ali * Copyright (C) 2008 Axis Communications * * 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 #include #include #include #include "gstrtpg726depay.h" GST_DEBUG_CATEGORY_STATIC (rtpg726depay_debug); #define GST_CAT_DEFAULT (rtpg726depay_debug) #define DEFAULT_BIT_RATE 32000 #define SAMPLE_RATE 8000 #define LAYOUT_G726 "g726" /* RtpG726Depay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_FORCE_AAL2 TRUE enum { PROP_0, PROP_FORCE_AAL2, PROP_LAST }; static GstStaticPadTemplate gst_rtp_g726_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "encoding-name = (string) { \"G726\", \"G726-16\", \"G726-24\", \"G726-32\", \"G726-40\", " "\"AAL2-G726-16\", \"AAL2-G726-24\", \"AAL2-G726-32\", \"AAL2-G726-40\" }, " "clock-rate = (int) 8000;") ); static GstStaticPadTemplate gst_rtp_g726_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-adpcm, " "channels = (int) 1, " "rate = (int) 8000, " "bitrate = (int) { 16000, 24000, 32000, 40000 }, " "layout = (string) \"g726\"") ); static void gst_rtp_g726_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_g726_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static GstBuffer *gst_rtp_g726_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_g726_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRtpG726Depay, gst_rtp_g726_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_g726_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g726_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g726_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP G.726 depayloader", "Codec/Depayloader/Network/RTP", "Extracts G.726 audio from RTP packets", "Axis Communications "); } static void gst_rtp_g726_depay_class_init (GstRtpG726DepayClass * klass) { GObjectClass *gobject_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->set_property = gst_rtp_g726_depay_set_property; gobject_class->get_property = gst_rtp_g726_depay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FORCE_AAL2, g_param_spec_boolean ("force-aal2", "Force AAL2", "Force AAL2 decoding for compatibility with bad payloaders", DEFAULT_FORCE_AAL2, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasertpdepayload_class->process = gst_rtp_g726_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_g726_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpg726depay_debug, "rtpg726depay", 0, "G.726 RTP Depayloader"); } static void gst_rtp_g726_depay_init (GstRtpG726Depay * rtpG726depay, GstRtpG726DepayClass * klass) { GstBaseRTPDepayload *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtpG726depay); gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); rtpG726depay->force_aal2 = DEFAULT_FORCE_AAL2; } static gboolean gst_rtp_g726_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; GstStructure *structure; gboolean ret; gint clock_rate; const gchar *encoding_name; GstRtpG726Depay *depay; depay = GST_RTP_G726_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; /* default */ depayload->clock_rate = clock_rate; depay->aal2 = FALSE; encoding_name = gst_structure_get_string (structure, "encoding-name"); if (encoding_name == NULL || g_ascii_strcasecmp (encoding_name, "G726") == 0) { depay->bitrate = DEFAULT_BIT_RATE; } else { if (g_str_has_prefix (encoding_name, "AAL2-")) { depay->aal2 = TRUE; encoding_name += 5; } if (g_ascii_strcasecmp (encoding_name, "G726-16") == 0) { depay->bitrate = 16000; } else if (g_ascii_strcasecmp (encoding_name, "G726-24") == 0) { depay->bitrate = 24000; } else if (g_ascii_strcasecmp (encoding_name, "G726-32") == 0) { depay->bitrate = 32000; } else if (g_ascii_strcasecmp (encoding_name, "G726-40") == 0) { depay->bitrate = 40000; } else goto unknown_encoding; } GST_DEBUG ("RTP G.726 depayloader, bitrate set to %d\n", depay->bitrate); srccaps = gst_caps_new_simple ("audio/x-adpcm", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, "bitrate", G_TYPE_INT, depay->bitrate, "layout", G_TYPE_STRING, LAYOUT_G726, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; /* ERRORS */ unknown_encoding: { GST_WARNING ("Could not determine bitrate from encoding-name (%s)", encoding_name); return FALSE; } } static GstBuffer * gst_rtp_g726_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpG726Depay *depay; GstBuffer *outbuf = NULL; gboolean marker; depay = GST_RTP_G726_DEPAY (depayload); marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); if (depay->aal2 || depay->force_aal2) { /* AAL2, we can just copy the bytes */ outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (!outbuf) goto bad_len; } else { guint8 *in, *out, tmp; guint len; in = gst_rtp_buffer_get_payload (buf); len = gst_rtp_buffer_get_payload_len (buf); if (gst_buffer_is_writable (buf)) { outbuf = gst_rtp_buffer_get_payload_buffer (buf); } else { GstBuffer *copy; /* copy buffer */ copy = gst_buffer_copy (buf); outbuf = gst_rtp_buffer_get_payload_buffer (copy); gst_buffer_unref (copy); } if (!outbuf) goto bad_len; out = GST_BUFFER_DATA (outbuf); /* we need to reshuffle the bytes, input is always of the form * A B C D ... with the number of bits depending on the bitrate. */ switch (depay->bitrate) { case 16000: { /* 0 * 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+- * |D D|C C|B B|A A| ... * |0 1|0 1|0 1|0 1| * +-+-+-+-+-+-+-+-+- */ while (len > 0) { tmp = *in++; *out++ = ((tmp & 0xc0) >> 6) | ((tmp & 0x30) >> 2) | ((tmp & 0x0c) << 2) | ((tmp & 0x03) << 6); len--; } break; } case 24000: { /* 0 1 2 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * |C C|B B B|A A A|F|E E E|D D D|C|H H H|G G G|F F| ... * |1 2|0 1 2|0 1 2|2|0 1 2|0 1 2|0|0 1 2|0 1 2|0 1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */ while (len > 2) { tmp = *in++; *out++ = ((tmp & 0xe0) >> 5) | ((tmp & 0x1c) << 1) | ((tmp & 0x03) << 6); tmp = *in++; *out++ = ((tmp & 0x80) >> 7) | ((tmp & 0x70) >> 3) | ((tmp & 0x0e) << 4) | ((tmp & 0x01) << 7); tmp = *in++; *out++ = ((tmp & 0xc0) >> 6) | ((tmp & 0x38) >> 1) | ((tmp & 0x07) << 5); len -= 3; } break; } case 32000: { /* 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * |B B B B|A A A A|D D D D|C C C C| ... * |0 1 2 3|0 1 2 3|0 1 2 3|0 1 2 3| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */ while (len > 0) { tmp = *in++; *out++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); len--; } break; } case 40000: { /* 0 1 2 3 4 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * |B B B|A A A A A|D|C C C C C|B B|E E E E|D D D D|G G|F F F F F|E|H H H H H|G G G| * |2 3 4|0 1 2 3 4|4|0 1 2 3 4|0 1|1 2 3 4|0 1 2 3|3 4|0 1 2 3 4|0|0 1 2 3 4|0 1 2| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */ while (len > 4) { tmp = *in++; *out++ = ((tmp & 0xf8) >> 3) | ((tmp & 0x07) << 5); tmp = *in++; *out++ = ((tmp & 0xc0) >> 6) | ((tmp & 0x3e) << 1) | ((tmp & 0x01) << 7); tmp = *in++; *out++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); tmp = *in++; *out++ = ((tmp & 0x80) >> 7) | ((tmp & 0x7c) >> 1) | ((tmp & 0x03) << 6); tmp = *in++; *out++ = ((tmp & 0xe0) >> 5) | ((tmp & 0x1f) << 3); len -= 5; } break; } } } if (marker) { /* mark start of talkspurt with discont */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } return outbuf; bad_len: return NULL; } static void gst_rtp_g726_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpG726Depay *rtpg726depay; rtpg726depay = GST_RTP_G726_DEPAY (object); switch (prop_id) { case PROP_FORCE_AAL2: rtpg726depay->force_aal2 = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_g726_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpG726Depay *rtpg726depay; rtpg726depay = GST_RTP_G726_DEPAY (object); switch (prop_id) { case PROP_FORCE_AAL2: g_value_set_boolean (value, rtpg726depay->force_aal2); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_g726_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg726depay", GST_RANK_SECONDARY, GST_TYPE_RTP_G726_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpgsmpay.h0000644000175000017500000000341611671175354016334 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_RTP_GSM_PAY_H__ #define __GST_RTP_GSM_PAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTPGSMPay GstRTPGSMPay; typedef struct _GstRTPGSMPayClass GstRTPGSMPayClass; #define GST_TYPE_RTP_GSM_PAY \ (gst_rtp_gsm_pay_get_type()) #define GST_RTP_GSM_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_PAY,GstRTPGSMPay)) #define GST_RTP_GSM_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_PAY,GstRTPGSMPayClass)) #define GST_IS_RTP_GSM_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_PAY)) #define GST_IS_RTP_GSM_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_PAY)) struct _GstRTPGSMPay { GstBaseRTPPayload payload; }; struct _GstRTPGSMPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_gsm_pay_get_type (void); gboolean gst_rtp_gsm_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_GSM_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpamrdepay.c0000644000175000017500000003162711677341656016644 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include #include "gstrtpamrdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpamrdepay_debug); #define GST_CAT_DEFAULT (rtpamrdepay_debug) /* references: * * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File * Storage Format for the Adaptive Multi-Rate (AMR) and Adaptive Multi-Rate * Wideband (AMR-WB) Audio Codecs. */ /* RtpAMRDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; /* input is an RTP packet * * params see RFC 3267, section 8.1 */ static GstStaticPadTemplate gst_rtp_amr_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"AMR\", " "encoding-params = (string) \"1\", " /* NOTE that all values must be strings in orde to be able to do SDP <-> * GstCaps mapping. */ "octet-align = (string) \"1\", " "crc = (string) { \"0\", \"1\" }, " "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\";" /* following options are not needed for a decoder * "mode-set = (int) [ 0, 7 ], " "mode-change-period = (int) [ 1, MAX ], " "mode-change-neighbor = (boolean) { TRUE, FALSE }, " "maxptime = (int) [ 20, MAX ], " "ptime = (int) [ 20, MAX ]" */ "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 16000, " "encoding-name = (string) \"AMR-WB\", " "encoding-params = (string) \"1\", " /* NOTE that all values must be strings in orde to be able to do SDP <-> * GstCaps mapping. */ "octet-align = (string) \"1\", " "crc = (string) { \"0\", \"1\" }, " "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\"" /* following options are not needed for a decoder * "mode-set = (int) [ 0, 7 ], " "mode-change-period = (int) [ 1, MAX ], " "mode-change-neighbor = (boolean) { TRUE, FALSE }, " "maxptime = (int) [ 20, MAX ], " "ptime = (int) [ 20, MAX ]" */ ) ); static GstStaticPadTemplate gst_rtp_amr_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/AMR, " "channels = (int) 1," "rate = (int) 8000;" "audio/AMR-WB, " "channels = (int) 1," "rate = (int) 16000") ); static gboolean gst_rtp_amr_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_amr_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); GST_BOILERPLATE (GstRtpAMRDepay, gst_rtp_amr_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_amr_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_amr_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_amr_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP AMR depayloader", "Codec/Depayloader/Network/RTP", "Extracts AMR or AMR-WB audio from RTP packets (RFC 3267)", "Wim Taymans "); } static void gst_rtp_amr_depay_class_init (GstRtpAMRDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_amr_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_amr_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpamrdepay_debug, "rtpamrdepay", 0, "AMR/AMR-WB RTP Depayloader"); } static void gst_rtp_amr_depay_init (GstRtpAMRDepay * rtpamrdepay, GstRtpAMRDepayClass * klass) { GstBaseRTPDepayload *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtpamrdepay); gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); } static gboolean gst_rtp_amr_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstCaps *srccaps; GstRtpAMRDepay *rtpamrdepay; const gchar *params; const gchar *str, *type; gint clock_rate, need_clock_rate; gboolean res; rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); /* figure out the mode first and set the clock rates */ if ((str = gst_structure_get_string (structure, "encoding-name"))) { if (strcmp (str, "AMR") == 0) { rtpamrdepay->mode = GST_RTP_AMR_DP_MODE_NB; need_clock_rate = 8000; type = "audio/AMR"; } else if (strcmp (str, "AMR-WB") == 0) { rtpamrdepay->mode = GST_RTP_AMR_DP_MODE_WB; need_clock_rate = 16000; type = "audio/AMR-WB"; } else goto invalid_mode; } else goto invalid_mode; if (!(str = gst_structure_get_string (structure, "octet-align"))) rtpamrdepay->octet_align = FALSE; else rtpamrdepay->octet_align = (atoi (str) == 1); if (!(str = gst_structure_get_string (structure, "crc"))) rtpamrdepay->crc = FALSE; else rtpamrdepay->crc = (atoi (str) == 1); if (rtpamrdepay->crc) { /* crc mode implies octet aligned mode */ rtpamrdepay->octet_align = TRUE; } if (!(str = gst_structure_get_string (structure, "robust-sorting"))) rtpamrdepay->robust_sorting = FALSE; else rtpamrdepay->robust_sorting = (atoi (str) == 1); if (rtpamrdepay->robust_sorting) { /* robust_sorting mode implies octet aligned mode */ rtpamrdepay->octet_align = TRUE; } if (!(str = gst_structure_get_string (structure, "interleaving"))) rtpamrdepay->interleaving = FALSE; else rtpamrdepay->interleaving = (atoi (str) == 1); if (rtpamrdepay->interleaving) { /* interleaving mode implies octet aligned mode */ rtpamrdepay->octet_align = TRUE; } if (!(params = gst_structure_get_string (structure, "encoding-params"))) rtpamrdepay->channels = 1; else { rtpamrdepay->channels = atoi (params); } if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = need_clock_rate; depayload->clock_rate = clock_rate; /* we require 1 channel, 8000 Hz, octet aligned, no CRC, * no robust sorting, no interleaving for now */ if (rtpamrdepay->channels != 1) return FALSE; if (clock_rate != need_clock_rate) return FALSE; if (rtpamrdepay->octet_align != TRUE) return FALSE; if (rtpamrdepay->robust_sorting != FALSE) return FALSE; if (rtpamrdepay->interleaving != FALSE) return FALSE; srccaps = gst_caps_new_simple (type, "channels", G_TYPE_INT, rtpamrdepay->channels, "rate", G_TYPE_INT, clock_rate, NULL); res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ invalid_mode: { GST_ERROR_OBJECT (rtpamrdepay, "invalid encoding-name"); return FALSE; } } /* -1 is invalid */ static const gint nb_frame_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, -1, -1, -1, -1, -1, -1, 0 }; static const gint wb_frame_size[16] = { 17, 23, 32, 36, 40, 46, 50, 58, 60, 5, -1, -1, -1, -1, -1, 0 }; static GstBuffer * gst_rtp_amr_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpAMRDepay *rtpamrdepay; const gint *frame_size; GstBuffer *outbuf = NULL; gint payload_len; rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); /* setup frame size pointer */ if (rtpamrdepay->mode == GST_RTP_AMR_DP_MODE_NB) frame_size = nb_frame_size; else frame_size = wb_frame_size; /* when we get here, 1 channel, 8000/16000 Hz, octet aligned, no CRC, * no robust sorting, no interleaving data is to be depayloaded */ { guint8 *payload, *p, *dp; gint i, num_packets, num_nonempty_packets; gint amr_len; gint ILL, ILP; payload_len = gst_rtp_buffer_get_payload_len (buf); /* need at least 2 bytes for the header */ if (payload_len < 2) goto too_small; payload = gst_rtp_buffer_get_payload (buf); /* depay CMR. The CMR is used by the sender to request * a new encoding mode. * * 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+ * | CMR |R|R|R|R| * +-+-+-+-+-+-+-+-+ */ /* CMR = (payload[0] & 0xf0) >> 4; */ /* strip CMR header now, pack FT and the data for the decoder */ payload_len -= 1; payload += 1; GST_DEBUG_OBJECT (rtpamrdepay, "payload len %d", payload_len); if (rtpamrdepay->interleaving) { ILL = (payload[0] & 0xf0) >> 4; ILP = (payload[0] & 0x0f); payload_len -= 1; payload += 1; if (ILP > ILL) goto wrong_interleaving; } /* * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 * +-+-+-+-+-+-+-+-+.. * |F| FT |Q|P|P| more FT.. * +-+-+-+-+-+-+-+-+.. */ /* count number of packets by counting the FTs. Also * count number of amr data bytes and number of non-empty * packets (this is also the number of CRCs if present). */ amr_len = 0; num_nonempty_packets = 0; num_packets = 0; for (i = 0; i < payload_len; i++) { gint fr_size; guint8 FT; FT = (payload[i] & 0x78) >> 3; fr_size = frame_size[FT]; GST_DEBUG_OBJECT (rtpamrdepay, "frame size %d", fr_size); if (fr_size == -1) goto wrong_framesize; if (fr_size > 0) { amr_len += fr_size; num_nonempty_packets++; } num_packets++; if ((payload[i] & 0x80) == 0) break; } if (rtpamrdepay->crc) { /* data len + CRC len + header bytes should be smaller than payload_len */ if (num_packets + num_nonempty_packets + amr_len > payload_len) goto wrong_length_1; } else { /* data len + header bytes should be smaller than payload_len */ if (num_packets + amr_len > payload_len) goto wrong_length_2; } outbuf = gst_buffer_new_and_alloc (payload_len); /* point to destination */ p = GST_BUFFER_DATA (outbuf); /* point to first data packet */ dp = payload + num_packets; if (rtpamrdepay->crc) { /* skip CRC if present */ dp += num_nonempty_packets; } for (i = 0; i < num_packets; i++) { gint fr_size; /* copy FT, clear F bit */ *p++ = payload[i] & 0x7f; fr_size = frame_size[(payload[i] & 0x78) >> 3]; if (fr_size > 0) { /* copy data packet, FIXME, calc CRC here. */ memcpy (p, dp, fr_size); p += fr_size; dp += fr_size; } } /* we can set the duration because each packet is 20 milliseconds */ GST_BUFFER_DURATION (outbuf) = num_packets * 20 * GST_MSECOND; if (gst_rtp_buffer_get_marker (buf)) { /* marker bit marks a discont buffer after a talkspurt. */ GST_DEBUG_OBJECT (depayload, "marker bit was set"); GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); } return outbuf; /* ERRORS */ too_small: { GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, (NULL), ("AMR RTP payload too small (%d)", payload_len)); goto bad_packet; } wrong_interleaving: { GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, (NULL), ("AMR RTP wrong interleaving")); goto bad_packet; } wrong_framesize: { GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, (NULL), ("AMR RTP frame size == -1")); goto bad_packet; } wrong_length_1: { GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, (NULL), ("AMR RTP wrong length 1")); goto bad_packet; } wrong_length_2: { GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, (NULL), ("AMR RTP wrong length 2")); goto bad_packet; } bad_packet: { /* no fatal error */ return NULL; } } gboolean gst_rtp_amr_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpamrdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_AMR_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp2tpay.h0000644000175000017500000000362311671175354016430 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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_RTP_MP2T_PAY_H__ #define __GST_RTP_MP2T_PAY_H__ #include #include #include G_BEGIN_DECLS typedef struct _GstRTPMP2TPay GstRTPMP2TPay; typedef struct _GstRTPMP2TPayClass GstRTPMP2TPayClass; #define GST_TYPE_RTP_MP2T_PAY \ (gst_rtp_mp2t_pay_get_type()) #define GST_RTP_MP2T_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP2T_PAY,GstRTPMP2TPay)) #define GST_RTP_MP2T_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP2T_PAY,GstRTPMP2TPayClass)) #define GST_IS_RTP_MP2T_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_PAY)) #define GST_IS_RTP_MP2T_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_PAY)) struct _GstRTPMP2TPay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_ts; GstClockTime duration; }; struct _GstRTPMP2TPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_mp2t_pay_get_type (void); gboolean gst_rtp_mp2t_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP2T_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtph263ppay.h0000644000175000017500000000415311671175354016407 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_H263P_PAY_H__ #define __GST_RTP_H263P_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_H263P_PAY \ (gst_rtp_h263p_pay_get_type()) #define GST_RTP_H263P_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263P_PAY,GstRtpH263PPay)) #define GST_RTP_H263P_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263P_PAY,GstRtpH263PPayClass)) #define GST_IS_RTP_H263P_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263P_PAY)) #define GST_IS_RTP_H263P_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263P_PAY)) typedef struct _GstRtpH263PPay GstRtpH263PPay; typedef struct _GstRtpH263PPayClass GstRtpH263PPayClass; typedef enum { GST_FRAGMENTATION_MODE_NORMAL = 0, GST_FRAGMENTATION_MODE_SYNC = 1 } GstFragmentationMode; struct _GstRtpH263PPay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_timestamp; GstClockTime first_duration; GstFragmentationMode fragmentation_mode; }; struct _GstRtpH263PPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_h263p_pay_get_type (void); gboolean gst_rtp_h263p_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H263P_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg729pay.c0000644000175000017500000003020211677341656016230 00000000000000/* GStreamer * Copyright (C) <2007> Nokia Corporation * Copyright (C) <2007> Collabora Ltd * @author: Olivier Crete * * 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. */ /* * This payloader assumes that the data will ALWAYS come as zero or more * 10 bytes frame of audio followed by 0 or 1 2 byte frame of silence. * Any other buffer format won't work */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "gstrtpg729pay.h" GST_DEBUG_CATEGORY_STATIC (rtpg729pay_debug); #define GST_CAT_DEFAULT (rtpg729pay_debug) #define G729_FRAME_SIZE 10 #define G729B_CN_FRAME_SIZE 2 #define G729_FRAME_DURATION (10 * GST_MSECOND) #define G729_FRAME_DURATION_MS (10) static gboolean gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_g729_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_g729_pay_change_state (GstElement * element, GstStateChange transition); static GstStaticPadTemplate gst_rtp_g729_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/G729, " /* according to RFC 3555 */ "channels = (int) 1, " "rate = (int) 8000") ); static GstStaticPadTemplate gst_rtp_g729_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_G729_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"G729\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"G729\"") ); GST_BOILERPLATE (GstRTPG729Pay, gst_rtp_g729_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_g729_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g729_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g729_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP G.729 payloader", "Codec/Payloader/Network/RTP", "Packetize G.729 audio into RTP packets", "Olivier Crete "); GST_DEBUG_CATEGORY_INIT (rtpg729pay_debug, "rtpg729pay", 0, "G.729 RTP Payloader"); } static void gst_rtp_g729_pay_finalize (GObject * object) { GstRTPG729Pay *pay = GST_RTP_G729_PAY (object); g_object_unref (pay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_g729_pay_class_init (GstRTPG729PayClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; GstBaseRTPPayloadClass *payload_class = GST_BASE_RTP_PAYLOAD_CLASS (klass); gobject_class->finalize = gst_rtp_g729_pay_finalize; gstelement_class->change_state = gst_rtp_g729_pay_change_state; payload_class->set_caps = gst_rtp_g729_pay_set_caps; payload_class->handle_buffer = gst_rtp_g729_pay_handle_buffer; } static void gst_rtp_g729_pay_init (GstRTPG729Pay * pay, GstRTPG729PayClass * klass) { GstBaseRTPPayload *payload = GST_BASE_RTP_PAYLOAD (pay); payload->pt = GST_RTP_PAYLOAD_G729; gst_basertppayload_set_options (payload, "audio", FALSE, "G729", 8000); pay->adapter = gst_adapter_new (); } static void gst_rtp_g729_pay_reset (GstRTPG729Pay * pay) { gst_adapter_clear (pay->adapter); pay->discont = FALSE; pay->next_rtp_time = 0; pay->first_ts = GST_CLOCK_TIME_NONE; pay->first_rtp_time = 0; } static gboolean gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; GstStructure *structure; gint pt; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "payload", &pt)) pt = GST_RTP_PAYLOAD_G729; payload->pt = pt; payload->dynamic = pt != GST_RTP_PAYLOAD_G729; res = gst_basertppayload_set_outcaps (payload, NULL); return res; } static GstFlowReturn gst_rtp_g729_pay_push (GstRTPG729Pay * rtpg729pay, const guint8 * data, guint payload_len) { GstBaseRTPPayload *basepayload; GstClockTime duration; guint frames; GstBuffer *outbuf; guint8 *payload; GstFlowReturn ret; basepayload = GST_BASE_RTP_PAYLOAD (rtpg729pay); GST_DEBUG_OBJECT (rtpg729pay, "Pushing %d bytes ts %" GST_TIME_FORMAT, payload_len, GST_TIME_ARGS (rtpg729pay->next_ts)); /* create buffer to hold the payload */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy payload */ payload = gst_rtp_buffer_get_payload (outbuf); memcpy (payload, data, payload_len); /* set metadata */ frames = (payload_len / G729_FRAME_SIZE) + ((payload_len % G729_FRAME_SIZE) >> 1); duration = frames * G729_FRAME_DURATION; GST_BUFFER_TIMESTAMP (outbuf) = rtpg729pay->next_ts; GST_BUFFER_DURATION (outbuf) = duration; GST_BUFFER_OFFSET (outbuf) = rtpg729pay->next_rtp_time; rtpg729pay->next_ts += duration; rtpg729pay->next_rtp_time += frames * 80; if (G_UNLIKELY (rtpg729pay->discont)) { GST_DEBUG_OBJECT (basepayload, "discont, setting marker bit"); GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); gst_rtp_buffer_set_marker (outbuf, TRUE); rtpg729pay->discont = FALSE; } ret = gst_basertppayload_push (basepayload, outbuf); return ret; } static void gst_rtp_g729_pay_recalc_rtp_time (GstRTPG729Pay * rtpg729pay, GstClockTime time) { if (GST_CLOCK_TIME_IS_VALID (rtpg729pay->first_ts) && GST_CLOCK_TIME_IS_VALID (time) && time >= rtpg729pay->first_ts) { GstClockTime diff; guint32 rtpdiff; diff = time - rtpg729pay->first_ts; rtpdiff = (diff / GST_MSECOND) * 8; rtpg729pay->next_rtp_time = rtpg729pay->first_rtp_time + rtpdiff; GST_DEBUG_OBJECT (rtpg729pay, "elapsed time %" GST_TIME_FORMAT ", rtp %" G_GUINT32_FORMAT ", " "new offset %" G_GUINT32_FORMAT, GST_TIME_ARGS (diff), rtpdiff, rtpg729pay->next_rtp_time); } } static GstFlowReturn gst_rtp_g729_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; GstRTPG729Pay *rtpg729pay = GST_RTP_G729_PAY (payload); GstAdapter *adapter = NULL; guint payload_len; guint available; guint maxptime_octets = G_MAXUINT; guint minptime_octets = 0; guint min_payload_len; guint max_payload_len; available = GST_BUFFER_SIZE (buf); if (available % G729_FRAME_SIZE != 0 && available % G729_FRAME_SIZE != G729B_CN_FRAME_SIZE) goto invalid_size; /* max number of bytes based on given ptime, has to be multiple of * frame_duration */ if (payload->max_ptime != -1) { guint ptime_ms = payload->max_ptime / GST_MSECOND; maxptime_octets = G729_FRAME_SIZE * (int) (ptime_ms / G729_FRAME_DURATION_MS); if (maxptime_octets < G729_FRAME_SIZE) { GST_WARNING_OBJECT (payload, "Given ptime %" G_GINT64_FORMAT " is smaller than minimum %d ns, overwriting to minimum", payload->max_ptime, G729_FRAME_DURATION_MS); maxptime_octets = G729_FRAME_SIZE; } } max_payload_len = MIN ( /* MTU max */ (int) (gst_rtp_buffer_calc_payload_len (GST_BASE_RTP_PAYLOAD_MTU (payload), 0, 0) / G729_FRAME_SIZE) * G729_FRAME_SIZE, /* ptime max */ maxptime_octets); /* min number of bytes based on a given ptime, has to be a multiple of frame duration */ { guint64 min_ptime = payload->min_ptime; min_ptime = min_ptime / GST_MSECOND; minptime_octets = G729_FRAME_SIZE * (int) (min_ptime / G729_FRAME_DURATION_MS); } min_payload_len = MAX (minptime_octets, G729_FRAME_SIZE); if (min_payload_len > max_payload_len) { min_payload_len = max_payload_len; } /* If the ptime is specified in the caps, tried to adhere to it exactly */ if (payload->abidata.ABI.ptime) { guint64 ptime = payload->abidata.ABI.ptime / GST_MSECOND; guint ptime_in_bytes = G729_FRAME_SIZE * (guint) (ptime / G729_FRAME_DURATION_MS); /* clip to computed min and max lengths */ ptime_in_bytes = MAX (min_payload_len, ptime_in_bytes); ptime_in_bytes = MIN (max_payload_len, ptime_in_bytes); min_payload_len = max_payload_len = ptime_in_bytes; } GST_LOG_OBJECT (payload, "Calculated min_payload_len %u and max_payload_len %u", min_payload_len, max_payload_len); adapter = rtpg729pay->adapter; available = gst_adapter_available (adapter); /* resync rtp time on discont or a discontinuous cn packet */ if (GST_BUFFER_IS_DISCONT (buf)) { /* flush remainder */ if (available > 0) { gst_rtp_g729_pay_push (rtpg729pay, gst_adapter_take (adapter, available), available); available = 0; } rtpg729pay->discont = TRUE; gst_rtp_g729_pay_recalc_rtp_time (rtpg729pay, GST_BUFFER_TIMESTAMP (buf)); } if (GST_BUFFER_SIZE (buf) < G729_FRAME_SIZE) gst_rtp_g729_pay_recalc_rtp_time (rtpg729pay, GST_BUFFER_TIMESTAMP (buf)); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (rtpg729pay->first_ts))) { rtpg729pay->first_ts = GST_BUFFER_TIMESTAMP (buf); rtpg729pay->first_rtp_time = rtpg729pay->next_rtp_time; } /* let's reset the base timestamp when the adapter is empty */ if (available == 0) rtpg729pay->next_ts = GST_BUFFER_TIMESTAMP (buf); if (available == 0 && GST_BUFFER_SIZE (buf) >= min_payload_len && GST_BUFFER_SIZE (buf) <= max_payload_len) { ret = gst_rtp_g729_pay_push (rtpg729pay, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); gst_buffer_unref (buf); return ret; } gst_adapter_push (adapter, buf); available = gst_adapter_available (adapter); /* as long as we have full frames */ /* this loop will push all available buffers till the last frame */ while (available >= min_payload_len || available % G729_FRAME_SIZE == G729B_CN_FRAME_SIZE) { /* We send as much as we can */ if (available <= max_payload_len) { payload_len = available; } else { payload_len = MIN (max_payload_len, (available / G729_FRAME_SIZE) * G729_FRAME_SIZE); } ret = gst_rtp_g729_pay_push (rtpg729pay, gst_adapter_take (adapter, payload_len), payload_len); available -= payload_len; } return ret; /* ERRORS */ invalid_size: { GST_ELEMENT_ERROR (payload, STREAM, WRONG_TYPE, ("Invalid input buffer size"), ("Invalid buffer size, should be a multiple of" " G729_FRAME_SIZE(10) with an optional G729B_CN_FRAME_SIZE(2)" " added to it, but it is %u", available)); gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static GstStateChangeReturn gst_rtp_g729_pay_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; /* handle upwards state changes here */ switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); /* handle downwards state changes */ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_g729_pay_reset (GST_RTP_G729_PAY (element)); break; default: break; } return ret; } gboolean gst_rtp_g729_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg729pay", GST_RANK_SECONDARY, GST_TYPE_RTP_G729_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4vpay.c0000644000175000017500000004616711677341656016447 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpmp4vpay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4vpay_debug); #define GST_CAT_DEFAULT (rtpmp4vpay_debug) static GstStaticPadTemplate gst_rtp_mp4v_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg," "mpegversion=(int) 4," "systemstream=(boolean)false;" "video/x-xvid") ); static GstStaticPadTemplate gst_rtp_mp4v_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4V-ES\"" /* two string params * "profile-level-id = (string) [1,MAX]" "config = (string) [1,MAX]" */ ) ); #define DEFAULT_SEND_CONFIG FALSE #define DEFAULT_BUFFER_LIST FALSE #define DEFAULT_CONFIG_INTERVAL 0 enum { ARG_0, ARG_SEND_CONFIG, ARG_BUFFER_LIST, ARG_CONFIG_INTERVAL }; static void gst_rtp_mp4v_pay_finalize (GObject * object); static void gst_rtp_mp4v_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_mp4v_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rtp_mp4v_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_mp4v_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static gboolean gst_rtp_mp4v_pay_handle_event (GstPad * pad, GstEvent * event); GST_BOILERPLATE (GstRtpMP4VPay, gst_rtp_mp4v_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_mp4v_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4v_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4v_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG4 Video payloader", "Codec/Payloader/Network/RTP", "Payload MPEG-4 video as RTP packets (RFC 3016)", "Wim Taymans "); } static void gst_rtp_mp4v_pay_class_init (GstRtpMP4VPayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_rtp_mp4v_pay_set_property; gobject_class->get_property = gst_rtp_mp4v_pay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SEND_CONFIG, g_param_spec_boolean ("send-config", "Send Config", "Send the config parameters in RTP packets as well(deprecated " "see config-interval)", DEFAULT_SEND_CONFIG, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BUFFER_LIST, g_param_spec_boolean ("buffer-list", "Buffer Array", "Use Buffer Arrays", DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CONFIG_INTERVAL, g_param_spec_uint ("config-interval", "Config Send Interval", "Send Config Insertion Interval in seconds (configuration headers " "will be multiplexed in the data stream when detected.) (0 = disabled)", 0, 3600, DEFAULT_CONFIG_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); gobject_class->finalize = gst_rtp_mp4v_pay_finalize; gstbasertppayload_class->set_caps = gst_rtp_mp4v_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mp4v_pay_handle_buffer; gstbasertppayload_class->handle_event = gst_rtp_mp4v_pay_handle_event; GST_DEBUG_CATEGORY_INIT (rtpmp4vpay_debug, "rtpmp4vpay", 0, "MP4 video RTP Payloader"); } static void gst_rtp_mp4v_pay_init (GstRtpMP4VPay * rtpmp4vpay, GstRtpMP4VPayClass * klass) { rtpmp4vpay->adapter = gst_adapter_new (); rtpmp4vpay->rate = 90000; rtpmp4vpay->profile = 1; rtpmp4vpay->buffer_list = DEFAULT_BUFFER_LIST; rtpmp4vpay->send_config = DEFAULT_SEND_CONFIG; rtpmp4vpay->need_config = TRUE; rtpmp4vpay->config_interval = DEFAULT_CONFIG_INTERVAL; rtpmp4vpay->last_config = -1; rtpmp4vpay->config = NULL; } static void gst_rtp_mp4v_pay_finalize (GObject * object) { GstRtpMP4VPay *rtpmp4vpay; rtpmp4vpay = GST_RTP_MP4V_PAY (object); if (rtpmp4vpay->config) { gst_buffer_unref (rtpmp4vpay->config); rtpmp4vpay->config = NULL; } g_object_unref (rtpmp4vpay->adapter); rtpmp4vpay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_mp4v_pay_new_caps (GstRtpMP4VPay * rtpmp4vpay) { gchar *profile, *config; GValue v = { 0 }; gboolean res; profile = g_strdup_printf ("%d", rtpmp4vpay->profile); g_value_init (&v, GST_TYPE_BUFFER); gst_value_set_buffer (&v, rtpmp4vpay->config); config = gst_value_serialize (&v); res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), "profile-level-id", G_TYPE_STRING, profile, "config", G_TYPE_STRING, config, NULL); g_value_unset (&v); g_free (profile); g_free (config); return res; } static gboolean gst_rtp_mp4v_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { GstRtpMP4VPay *rtpmp4vpay; GstStructure *structure; const GValue *codec_data; gboolean res; rtpmp4vpay = GST_RTP_MP4V_PAY (payload); gst_basertppayload_set_options (payload, "video", TRUE, "MP4V-ES", rtpmp4vpay->rate); res = TRUE; structure = gst_caps_get_structure (caps, 0); codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { GST_LOG_OBJECT (rtpmp4vpay, "got codec_data"); if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { GstBuffer *buffer; guint8 *data; guint size; buffer = gst_value_get_buffer (codec_data); data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < 5) goto done; rtpmp4vpay->profile = data[4]; GST_LOG_OBJECT (rtpmp4vpay, "configuring codec_data, profile %d", data[4]); if (rtpmp4vpay->config) gst_buffer_unref (rtpmp4vpay->config); rtpmp4vpay->config = gst_buffer_copy (buffer); res = gst_rtp_mp4v_pay_new_caps (rtpmp4vpay); } } done: return res; } static void gst_rtp_mp4v_pay_empty (GstRtpMP4VPay * rtpmp4vpay) { gst_adapter_clear (rtpmp4vpay->adapter); } static GstFlowReturn gst_rtp_mp4v_pay_flush (GstRtpMP4VPay * rtpmp4vpay) { guint avail; GstBuffer *outbuf; GstBuffer *outbuf_data = NULL; GstFlowReturn ret; GstBufferList *list = NULL; GstBufferListIterator *it = NULL; /* the data available in the adapter is either smaller * than the MTU or bigger. In the case it is smaller, the complete * adapter contents can be put in one packet. In the case the * adapter has more than one MTU, we need to split the MP4V data * over multiple packets. */ avail = gst_adapter_available (rtpmp4vpay->adapter); if (rtpmp4vpay->config == NULL && rtpmp4vpay->need_config) { /* when we don't have a config yet, flush things out */ gst_adapter_flush (rtpmp4vpay->adapter, avail); avail = 0; } if (!avail) return GST_FLOW_OK; ret = GST_FLOW_OK; if (rtpmp4vpay->buffer_list) { /* Use buffer lists. Each frame will be put into a list * of buffers and the whole list will be pushed downstream * at once */ list = gst_buffer_list_new (); it = gst_buffer_list_iterate (list); } while (avail > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total lenght of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (avail, 0, 0); /* fill one MTU or all available bytes */ towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpmp4vpay)); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); if (rtpmp4vpay->buffer_list) { /* create buffer without payload. The payload will be put * in next buffer instead. Both buffers will be then added * to the list */ outbuf = gst_rtp_buffer_new_allocate (0, 0, 0); /* Take buffer with the payload from the adapter */ outbuf_data = gst_adapter_take_buffer (rtpmp4vpay->adapter, payload_len); } else { /* create buffer to hold the payload */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy payload */ payload = gst_rtp_buffer_get_payload (outbuf); gst_adapter_copy (rtpmp4vpay->adapter, payload, 0, payload_len); gst_adapter_flush (rtpmp4vpay->adapter, payload_len); } avail -= payload_len; gst_rtp_buffer_set_marker (outbuf, avail == 0); GST_BUFFER_TIMESTAMP (outbuf) = rtpmp4vpay->first_timestamp; if (rtpmp4vpay->buffer_list) { /* create a new group to hold the rtp header and the payload */ gst_buffer_list_iterator_add_group (it); gst_buffer_list_iterator_add (it, outbuf); gst_buffer_list_iterator_add (it, outbuf_data); } else { ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), outbuf); } } if (rtpmp4vpay->buffer_list) { gst_buffer_list_iterator_free (it); /* push the whole buffer list at once */ ret = gst_basertppayload_push_list (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), list); } return ret; } #define VOS_STARTCODE 0x000001B0 #define VOS_ENDCODE 0x000001B1 #define USER_DATA_STARTCODE 0x000001B2 #define GOP_STARTCODE 0x000001B3 #define VISUAL_OBJECT_STARTCODE 0x000001B5 #define VOP_STARTCODE 0x000001B6 static gboolean gst_rtp_mp4v_pay_depay_data (GstRtpMP4VPay * enc, guint8 * data, guint size, gint * strip, gboolean * vopi) { guint32 code; gboolean result; *vopi = FALSE; *strip = 0; if (size < 5) return FALSE; code = GST_READ_UINT32_BE (data); GST_DEBUG_OBJECT (enc, "start code 0x%08x", code); switch (code) { case VOS_STARTCODE: case 0x00000101: { gint i; guint8 profile; gboolean newprofile = FALSE; gboolean equal; if (code == VOS_STARTCODE) { /* profile_and_level_indication */ profile = data[4]; GST_DEBUG_OBJECT (enc, "VOS profile 0x%08x", profile); if (profile != enc->profile) { newprofile = TRUE; enc->profile = profile; } } /* up to the next GOP_STARTCODE or VOP_STARTCODE is * the config information */ code = 0xffffffff; for (i = 5; i < size - 4; i++) { code = (code << 8) | data[i]; if (code == GOP_STARTCODE || code == VOP_STARTCODE) break; } i -= 3; /* see if config changed */ equal = FALSE; if (enc->config) { if (GST_BUFFER_SIZE (enc->config) == i) { equal = memcmp (GST_BUFFER_DATA (enc->config), data, i) == 0; } } /* if config string changed or new profile, make new caps */ if (!equal || newprofile) { if (enc->config) gst_buffer_unref (enc->config); enc->config = gst_buffer_new_and_alloc (i); memcpy (GST_BUFFER_DATA (enc->config), data, i); gst_rtp_mp4v_pay_new_caps (enc); } *strip = i; /* we need to flush out the current packet. */ result = TRUE; break; } case VOP_STARTCODE: GST_DEBUG_OBJECT (enc, "VOP"); /* VOP startcode, we don't have to flush the packet */ result = FALSE; /* vop-coding-type == I-frame */ if (size > 4 && (data[4] >> 6 == 0)) { GST_DEBUG_OBJECT (enc, "VOP-I"); *vopi = TRUE; } break; case GOP_STARTCODE: GST_DEBUG_OBJECT (enc, "GOP"); *vopi = TRUE; result = TRUE; break; case 0x00000100: enc->need_config = FALSE; result = TRUE; break; default: if (code >= 0x20 && code <= 0x2f) { GST_DEBUG_OBJECT (enc, "short header"); result = FALSE; } else { GST_DEBUG_OBJECT (enc, "other startcode"); /* all other startcodes need a flush */ result = TRUE; } break; } return result; } /* we expect buffers starting on startcodes. */ static GstFlowReturn gst_rtp_mp4v_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpMP4VPay *rtpmp4vpay; GstFlowReturn ret; guint size, avail; guint packet_len; guint8 *data; gboolean flush; gint strip; GstClockTime timestamp, duration; gboolean vopi; gboolean send_config; ret = GST_FLOW_OK; send_config = FALSE; rtpmp4vpay = GST_RTP_MP4V_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); avail = gst_adapter_available (rtpmp4vpay->adapter); if (duration == -1) duration = 0; /* empty buffer, take timestamp */ if (avail == 0) { rtpmp4vpay->first_timestamp = timestamp; rtpmp4vpay->duration = 0; } /* depay incomming data and see if we need to start a new RTP * packet */ flush = gst_rtp_mp4v_pay_depay_data (rtpmp4vpay, data, size, &strip, &vopi); if (strip) { /* strip off config if requested */ if (!(rtpmp4vpay->config_interval > 0)) { GstBuffer *subbuf; GST_LOG_OBJECT (rtpmp4vpay, "stripping config at %d, size %d", strip, size - strip); /* strip off header */ subbuf = gst_buffer_create_sub (buffer, strip, size - strip); GST_BUFFER_TIMESTAMP (subbuf) = timestamp; gst_buffer_unref (buffer); buffer = subbuf; size = GST_BUFFER_SIZE (buffer); } else { GST_LOG_OBJECT (rtpmp4vpay, "found config in stream"); rtpmp4vpay->last_config = timestamp; } } /* there is a config request, see if we need to insert it */ if (vopi && (rtpmp4vpay->config_interval > 0) && rtpmp4vpay->config) { if (rtpmp4vpay->last_config != -1) { guint64 diff; GST_LOG_OBJECT (rtpmp4vpay, "now %" GST_TIME_FORMAT ", last VOP-I %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (rtpmp4vpay->last_config)); /* calculate diff between last config in milliseconds */ if (timestamp > rtpmp4vpay->last_config) { diff = timestamp - rtpmp4vpay->last_config; } else { diff = 0; } GST_DEBUG_OBJECT (rtpmp4vpay, "interval since last config %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); /* bigger than interval, queue config */ /* FIXME should convert timestamps to running time */ if (GST_TIME_AS_SECONDS (diff) >= rtpmp4vpay->config_interval) { GST_DEBUG_OBJECT (rtpmp4vpay, "time to send config"); send_config = TRUE; } } else { /* no known previous config time, send now */ GST_DEBUG_OBJECT (rtpmp4vpay, "no previous config time, send now"); send_config = TRUE; } if (send_config) { /* we need to send config now first */ GstBuffer *superbuf; GST_LOG_OBJECT (rtpmp4vpay, "inserting config in stream"); /* insert header */ superbuf = gst_buffer_merge (rtpmp4vpay->config, buffer); GST_BUFFER_TIMESTAMP (superbuf) = timestamp; gst_buffer_unref (buffer); buffer = superbuf; size = GST_BUFFER_SIZE (buffer); if (timestamp != -1) { rtpmp4vpay->last_config = timestamp; } } } /* if we need to flush, do so now */ if (flush) { ret = gst_rtp_mp4v_pay_flush (rtpmp4vpay); rtpmp4vpay->first_timestamp = timestamp; rtpmp4vpay->duration = 0; avail = 0; } /* get packet length of data and see if we exceeded MTU. */ packet_len = gst_rtp_buffer_calc_packet_len (avail + size, 0, 0); if (gst_basertppayload_is_filled (basepayload, packet_len, rtpmp4vpay->duration + duration)) { ret = gst_rtp_mp4v_pay_flush (rtpmp4vpay); rtpmp4vpay->first_timestamp = timestamp; rtpmp4vpay->duration = 0; } /* push new data */ gst_adapter_push (rtpmp4vpay->adapter, buffer); rtpmp4vpay->duration += duration; return ret; } static gboolean gst_rtp_mp4v_pay_handle_event (GstPad * pad, GstEvent * event) { GstRtpMP4VPay *rtpmp4vpay; rtpmp4vpay = GST_RTP_MP4V_PAY (gst_pad_get_parent (pad)); GST_DEBUG ("Got event: %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: case GST_EVENT_EOS: /* This flush call makes sure that the last buffer is always pushed * to the base payloader */ gst_rtp_mp4v_pay_flush (rtpmp4vpay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_mp4v_pay_empty (rtpmp4vpay); break; default: break; } g_object_unref (rtpmp4vpay); /* let parent handle event too */ return FALSE; } static void gst_rtp_mp4v_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpMP4VPay *rtpmp4vpay; rtpmp4vpay = GST_RTP_MP4V_PAY (object); switch (prop_id) { case ARG_SEND_CONFIG: rtpmp4vpay->send_config = g_value_get_boolean (value); /* send the configuration once every minute */ if (rtpmp4vpay->send_config && !(rtpmp4vpay->config_interval > 0)) { rtpmp4vpay->config_interval = 60; } break; case ARG_BUFFER_LIST: rtpmp4vpay->buffer_list = g_value_get_boolean (value); break; case ARG_CONFIG_INTERVAL: rtpmp4vpay->config_interval = g_value_get_uint (value); break; default: break; } } static void gst_rtp_mp4v_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpMP4VPay *rtpmp4vpay; rtpmp4vpay = GST_RTP_MP4V_PAY (object); switch (prop_id) { case ARG_SEND_CONFIG: g_value_set_boolean (value, rtpmp4vpay->send_config); break; case ARG_BUFFER_LIST: g_value_set_boolean (value, rtpmp4vpay->buffer_list); break; case ARG_CONFIG_INTERVAL: g_value_set_uint (value, rtpmp4vpay->config_interval); break; default: break; } } gboolean gst_rtp_mp4v_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4vpay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP4V_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpdvdepay.c0000644000175000017500000003062011677341656016466 00000000000000/* Farsight * Copyright (C) 2006 Marcel Moreaux * (C) 2008 Wim Taymans * * 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. */ /* * RTP DV depayloader. * * Important note for NTSC-users: * * Because the author uses PAL video, and he does not have proper DV * documentation (the DV format specification is not freely available), * this code may very well contain PAL-specific assumptions. */ #include #include #include #include "gstrtpdvdepay.h" GST_DEBUG_CATEGORY (rtpdvdepay_debug); #define GST_CAT_DEFAULT (rtpdvdepay_debug) /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, }; static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-dv") ); static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) { \"video\", \"audio\" }," "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "encoding-name = (string) \"DV\", " "clock-rate = (int) 90000," "encode = (string) { \"SD-VCR/525-60\", \"SD-VCR/625-50\", \"HD-VCR/1125-60\"," "\"HD-VCR/1250-50\", \"SDL-VCR/525-60\", \"SDL-VCR/625-50\"," "\"306M/525-60\", \"306M/625-50\", \"314M-25/525-60\"," "\"314M-25/625-50\", \"314M-50/525-60\", \"314M-50/625-50\" }" /* optional parameters can't go in the template * "audio = (string) { \"bundled\", \"none\" }" */ ) ); static GstStateChangeReturn gst_rtp_dv_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_dv_depay_process (GstBaseRTPDepayload * base, GstBuffer * in); static gboolean gst_rtp_dv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRTPDVDepay, gst_rtp_dv_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD) static void gst_rtp_dv_depay_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_details_simple (element_class, "RTP DV Depayloader", "Codec/Depayloader/Network/RTP", "Depayloads DV from RTP packets (RFC 3189)", "Marcel Moreaux , Wim Taymans "); } /* initialize the plugin's class */ static void gst_rtp_dv_depay_class_init (GstRTPDVDepayClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; GstBaseRTPDepayloadClass *gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_dv_depay_change_state); gstbasertpdepayload_class->process = GST_DEBUG_FUNCPTR (gst_rtp_dv_depay_process); gstbasertpdepayload_class->set_caps = GST_DEBUG_FUNCPTR (gst_rtp_dv_depay_setcaps); GST_DEBUG_CATEGORY_INIT (rtpdvdepay_debug, "rtpdvdepay", 0, "DV RTP Depayloader"); } /* initialize the new element * instantiate pads and add them to element * set functions * initialize structure */ static void gst_rtp_dv_depay_init (GstRTPDVDepay * filter, GstRTPDVDepayClass * klass) { } static gboolean parse_encode (GstRTPDVDepay * rtpdvdepay, const gchar * encode) { rtpdvdepay->width = 720; if (!strcmp (encode, "314M-25/525-60")) { rtpdvdepay->frame_size = 240000; rtpdvdepay->height = 480; rtpdvdepay->rate_num = 30000; rtpdvdepay->rate_denom = 1001; } else if (!strcmp (encode, "SD-VCR/525-60")) { rtpdvdepay->frame_size = 120000; rtpdvdepay->height = 480; rtpdvdepay->rate_num = 30000; rtpdvdepay->rate_denom = 1001; } else if (!strcmp (encode, "314M-50/625-50")) { rtpdvdepay->frame_size = 288000; rtpdvdepay->height = 576; rtpdvdepay->rate_num = 25; rtpdvdepay->rate_denom = 1; } else if (!strcmp (encode, "SD-VCR/625-50")) { rtpdvdepay->frame_size = 144000; rtpdvdepay->height = 576; rtpdvdepay->rate_num = 25; rtpdvdepay->rate_denom = 1; } else if (!strcmp (encode, "314M-25/625-50")) { rtpdvdepay->frame_size = 144000; rtpdvdepay->height = 576; rtpdvdepay->rate_num = 25; rtpdvdepay->rate_denom = 1; } else rtpdvdepay->frame_size = -1; return rtpdvdepay->frame_size != -1; } static gboolean gst_rtp_dv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRTPDVDepay *rtpdvdepay; GstCaps *srccaps; gint clock_rate; gboolean systemstream, ret; const gchar *encode, *media; rtpdvdepay = GST_RTP_DV_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; /* we really need the encode property to figure out the frame size, it's also * required by the spec */ if (!(encode = gst_structure_get_string (structure, "encode"))) goto no_encode; /* figure out the size of one frame */ if (!parse_encode (rtpdvdepay, encode)) goto unknown_encode; /* check the media, this tells us that the stream has video or not */ if (!(media = gst_structure_get_string (structure, "media"))) goto no_media; systemstream = FALSE; if (!strcmp (media, "audio")) { /* we need a demuxer for audio only */ systemstream = TRUE; } else if (!strcmp (media, "video")) { const gchar *audio; /* check the optional audio field, if it's present and set to bundled, we * are dealing with a system stream. */ if ((audio = gst_structure_get_string (structure, "audio"))) { if (!strcmp (audio, "bundled")) systemstream = TRUE; } } /* allocate accumulator */ rtpdvdepay->acc = gst_buffer_new_and_alloc (rtpdvdepay->frame_size); /* Initialize the new accumulator frame. * If the previous frame exists, copy that into the accumulator frame. * This way, missing packets in the stream won't show up badly. */ memset (GST_BUFFER_DATA (rtpdvdepay->acc), 0, rtpdvdepay->frame_size); srccaps = gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, systemstream, "width", G_TYPE_INT, rtpdvdepay->width, "height", G_TYPE_INT, rtpdvdepay->height, "framerate", GST_TYPE_FRACTION, rtpdvdepay->rate_num, rtpdvdepay->rate_denom, NULL); ret = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return ret; /* ERRORS */ no_encode: { GST_ERROR_OBJECT (rtpdvdepay, "required encode property not found in caps"); return FALSE; } unknown_encode: { GST_ERROR_OBJECT (rtpdvdepay, "unknown encode property %s found", encode); return FALSE; } no_media: { GST_ERROR_OBJECT (rtpdvdepay, "required media property not found in caps"); return FALSE; } } /* A DV frame consists of a bunch of 80-byte DIF blocks. * Each DIF block contains a 3-byte header telling where in the DV frame the * DIF block should go. We use this information to calculate its position. */ static guint calculate_difblock_location (guint8 * block) { gint block_type, dif_sequence, dif_block; guint location; block_type = block[0] >> 5; dif_sequence = block[1] >> 4; dif_block = block[2]; location = dif_sequence * 150; switch (block_type) { case 0: /* Header block, no offset */ break; case 1: /* Subcode block */ location += (1 + dif_block); break; case 2: /* VAUX block */ location += (3 + dif_block); break; case 3: /* Audio block */ location += (6 + dif_block * 16); break; case 4: /* Video block */ location += (7 + (dif_block / 15) + dif_block); break; default: /* Something bogus */ GST_DEBUG ("UNKNOWN BLOCK"); location = -1; break; } return location; } /* Process one RTP packet. Accumulate RTP payload in the proper place in a DV * frame, and return that frame if we detect a new frame, or NULL otherwise. * We assume a DV frame is 144000 bytes. That should accomodate PAL as well as * NTSC. */ static GstBuffer * gst_rtp_dv_depay_process (GstBaseRTPDepayload * base, GstBuffer * in) { GstBuffer *out = NULL; guint8 *payload; guint32 rtp_ts; guint payload_len, location; GstRTPDVDepay *dvdepay = GST_RTP_DV_DEPAY (base); gboolean marker; marker = gst_rtp_buffer_get_marker (in); /* Check if the received packet contains (the start of) a new frame, we do * this by checking the RTP timestamp. */ rtp_ts = gst_rtp_buffer_get_timestamp (in); /* we cannot copy the packet yet if the marker is set, we will do that below * after taking out the data */ if (dvdepay->prev_ts != -1 && rtp_ts != dvdepay->prev_ts && !marker) { /* the timestamp changed */ GST_DEBUG_OBJECT (dvdepay, "new frame with ts %u, old ts %u", rtp_ts, dvdepay->prev_ts); /* return copy of accumulator. */ out = gst_buffer_copy (dvdepay->acc); } /* Extract the payload */ payload_len = gst_rtp_buffer_get_payload_len (in); payload = gst_rtp_buffer_get_payload (in); /* copy all DIF chunks in their place. */ while (payload_len >= 80) { guint offset; /* Calculate where in the frame the payload should go */ location = calculate_difblock_location (payload); if (location < 6) { /* part of a header, set the flag to mark that we have the header. */ dvdepay->header_mask |= (1 << location); GST_LOG_OBJECT (dvdepay, "got header at location %d, now %02x", location, dvdepay->header_mask); } else { GST_LOG_OBJECT (dvdepay, "got block at location %d", location); } /* get the byte offset of the dif block */ offset = location * 80; /* And copy it in, provided the location is sane. */ if (offset >= 0 && offset <= dvdepay->frame_size - 80) memcpy (GST_BUFFER_DATA (dvdepay->acc) + offset, payload, 80); payload += 80; payload_len -= 80; } if (marker) { GST_DEBUG_OBJECT (dvdepay, "marker bit complete frame %u", rtp_ts); /* only copy the frame when we have a complete header */ if (dvdepay->header_mask == 0x3f) { /* The marker marks the end of a frame that we need to push. The next frame * will change the timestamp but we won't copy the accumulator again because * we set the prev_ts to -1. */ out = gst_buffer_copy (dvdepay->acc); } else { GST_WARNING_OBJECT (dvdepay, "waiting for frame headers %02x", dvdepay->header_mask); } dvdepay->prev_ts = -1; } else { /* save last timestamp */ dvdepay->prev_ts = rtp_ts; } return out; } static void gst_rtp_dv_depay_reset (GstRTPDVDepay * depay) { if (depay->acc) gst_buffer_unref (depay->acc); depay->acc = NULL; depay->prev_ts = -1; depay->header_mask = 0; } static GstStateChangeReturn gst_rtp_dv_depay_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRTPDVDepay *depay = GST_RTP_DV_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_dv_depay_reset (depay); break; default: break; } ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_FAILURE); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_dv_depay_reset (depay); break; default: break; } return ret; } gboolean gst_rtp_dv_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpdvdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_DV_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmpvdepay.c0000644000175000017500000001412211677341656016656 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include "gstrtpmpvdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmpvdepay_debug); #define GST_CAT_DEFAULT (rtpmpvdepay_debug) /* FIXME, we set the mpeg version to 2, we should ideally be looking at contents * of the stream to figure out the version */ static GstStaticPadTemplate gst_rtp_mpv_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg, mpegversion = (int) 2, systemstream = (boolean) FALSE") ); static GstStaticPadTemplate gst_rtp_mpv_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPV\";" "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_MPV_STRING ", " "clock-rate = (int) 90000") ); GST_BOILERPLATE (GstRtpMPVDepay, gst_rtp_mpv_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mpv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mpv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mpv_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpv_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpv_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG video depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG video from RTP packets (RFC 2250)", "Wim Taymans "); } static void gst_rtp_mpv_depay_class_init (GstRtpMPVDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->set_caps = gst_rtp_mpv_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_mpv_depay_process; GST_DEBUG_CATEGORY_INIT (rtpmpvdepay_debug, "rtpmpvdepay", 0, "MPEG Video RTP Depayloader"); } static void gst_rtp_mpv_depay_init (GstRtpMPVDepay * rtpmpvdepay, GstRtpMPVDepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static gboolean gst_rtp_mpv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; gint clock_rate; GstCaps *outcaps; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; outcaps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); return res; } static GstBuffer * gst_rtp_mpv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMPVDepay *rtpmpvdepay; GstBuffer *outbuf; rtpmpvdepay = GST_RTP_MPV_DEPAY (depayload); { gint payload_len, payload_header; guint8 *payload; guint8 T; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); payload_header = 0; if (payload_len <= 4) goto empty_packet; /* 3.4 MPEG Video-specific header * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ |T| TR | |N|S|B|E| P | | BFC | | FFC | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * AN FBV FFV */ T = (payload[0] & 0x04); payload_len -= 4; payload_header += 4; payload += 4; if (T) { /* * 3.4.1 MPEG-2 Video-specific header extension * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |X|E|f_[0,0]|f_[0,1]|f_[1,0]|f_[1,1]| DC| PS|T|P|C|Q|V|A|R|H|G|D| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ if (payload_len <= 4) goto empty_packet; payload_len -= 4; payload_header += 4; payload += 4; } outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, payload_header, -1); if (outbuf) { GST_DEBUG_OBJECT (rtpmpvdepay, "gst_rtp_mpv_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); } return outbuf; } return NULL; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpmpvdepay, STREAM, DECODE, (NULL), ("Empty payload.")); return NULL; } } gboolean gst_rtp_mpv_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmpvdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MPV_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpbvpay.h0000644000175000017500000000343011671175354016151 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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_RTP_BV_PAY_H__ #define __GST_RTP_BV_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_BV_PAY \ (gst_rtp_bv_pay_get_type()) #define GST_RTP_BV_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BV_PAY,GstRTPBVPay)) #define GST_RTP_BV_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BV_PAY,GstRTPBVPayClass)) #define GST_IS_RTP_BV_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BV_PAY)) #define GST_IS_RTP_BV_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BV_PAY)) typedef struct _GstRTPBVPay GstRTPBVPay; typedef struct _GstRTPBVPayClass GstRTPBVPayClass; struct _GstRTPBVPay { GstBaseRTPAudioPayload audiopayload; gint mode; }; struct _GstRTPBVPayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_bv_pay_get_type (void); gboolean gst_rtp_bv_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_BV_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpilbcdepay.h0000644000175000017500000000370311671175354016767 00000000000000/* GStreamer * Copyright (C) <2006> Philippe Khalaf * * 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_RTP_ILBC_DEPAY_H__ #define __GST_RTP_ILBC_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTPiLBCDepay GstRTPiLBCDepay; typedef struct _GstRTPiLBCDepayClass GstRTPiLBCDepayClass; #define GST_TYPE_RTP_ILBC_DEPAY \ (gst_rtp_ilbc_depay_get_type()) #define GST_RTP_ILBC_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ILBC_DEPAY,GstRTPiLBCDepay)) #define GST_RTP_ILBC_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ILBC_DEPAY,GstRTPiLBCDepayClass)) #define GST_IS_RTP_ILBC_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ILBC_DEPAY)) #define GST_IS_RTP_ILBC_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ILBC_DEPAY)) typedef enum { GST_ILBC_MODE_20 = 20, GST_ILBC_MODE_30 = 30 } GstiLBCMode; struct _GstRTPiLBCDepay { GstBaseRTPDepayload depayload; GstiLBCMode mode; }; struct _GstRTPiLBCDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_ilbc_depay_get_type (void); gboolean gst_rtp_ilbc_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_ILBC_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4adepay.c0000644000175000017500000003133311707323557016712 00000000000000/* GStreamer * Copyright (C) <2007> Nokia Corporation (contact ) * <2007> Wim Taymans * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. * * 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 #include #include #include "gstrtpmp4adepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4adepay_debug); #define GST_CAT_DEFAULT (rtpmp4adepay_debug) static GstStaticPadTemplate gst_rtp_mp4a_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg," "mpegversion = (int) 4," "framed = (boolean) true, " "stream-format = (string) raw") ); static GstStaticPadTemplate gst_rtp_mp4a_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4A-LATM\"" /* All optional parameters * * "profile-level-id=[1,MAX]" * "config=" */ ) ); GST_BOILERPLATE (GstRtpMP4ADepay, gst_rtp_mp4a_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_mp4a_depay_finalize (GObject * object); static gboolean gst_rtp_mp4a_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp4a_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_mp4a_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mp4a_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4a_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4a_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG4 audio depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG4 audio from RTP packets (RFC 3016)", "Nokia Corporation (contact ), " "Wim Taymans "); } static void gst_rtp_mp4a_depay_class_init (GstRtpMP4ADepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_mp4a_depay_finalize; gstelement_class->change_state = gst_rtp_mp4a_depay_change_state; gstbasertpdepayload_class->process = gst_rtp_mp4a_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp4a_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpmp4adepay_debug, "rtpmp4adepay", 0, "MPEG4 audio RTP Depayloader"); } static void gst_rtp_mp4a_depay_init (GstRtpMP4ADepay * rtpmp4adepay, GstRtpMP4ADepayClass * klass) { rtpmp4adepay->adapter = gst_adapter_new (); } static void gst_rtp_mp4a_depay_finalize (GObject * object) { GstRtpMP4ADepay *rtpmp4adepay; rtpmp4adepay = GST_RTP_MP4A_DEPAY (object); g_object_unref (rtpmp4adepay->adapter); rtpmp4adepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 }; static gboolean gst_rtp_mp4a_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpMP4ADepay *rtpmp4adepay; GstCaps *srccaps; const gchar *str; gint clock_rate; gint object_type; gint channels = 2; /* default */ gboolean res; rtpmp4adepay = GST_RTP_MP4A_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; if (!gst_structure_get_int (structure, "object", &object_type)) object_type = 2; /* AAC LC default */ srccaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, "framed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, channels, "stream-format", G_TYPE_STRING, "raw", NULL); if ((str = gst_structure_get_string (structure, "config"))) { GValue v = { 0 }; g_value_init (&v, GST_TYPE_BUFFER); if (gst_value_deserialize (&v, str)) { GstBuffer *buffer; guint8 *data; guint size; gint i; guint32 rate = 0; guint8 obj_type = 0, sr_idx = 0, channels = 0; GstBitReader br; buffer = gst_value_get_buffer (&v); gst_buffer_ref (buffer); g_value_unset (&v); data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < 2) { GST_WARNING_OBJECT (depayload, "config too short (%d < 2)", size); goto bad_config; } /* Parse StreamMuxConfig according to ISO/IEC 14496-3: * * audioMuxVersion == 0 (1 bit) * allStreamsSameTimeFraming == 1 (1 bit) * numSubFrames == rtpmp4adepay->numSubFrames (6 bits) * numProgram == 0 (4 bits) * numLayer == 0 (3 bits) * * We only require audioMuxVersion == 0; * * The remaining bit of the second byte and the rest of the bits are used * for audioSpecificConfig which we need to set in codec_info. */ if ((data[0] & 0x80) != 0x00) { GST_WARNING_OBJECT (depayload, "unknown audioMuxVersion 1"); goto bad_config; } rtpmp4adepay->numSubFrames = (data[0] & 0x3F); GST_LOG_OBJECT (rtpmp4adepay, "numSubFrames %d", rtpmp4adepay->numSubFrames); /* shift rest of string 15 bits down */ size -= 2; for (i = 0; i < size; i++) { data[i] = ((data[i + 1] & 1) << 7) | ((data[i + 2] & 0xfe) >> 1); } /* ignore remaining bit, we're only interested in full bytes */ GST_BUFFER_SIZE (buffer) = size; gst_bit_reader_init (&br, data, size); /* any object type is fine, we need to copy it to the profile-level-id field. */ if (!gst_bit_reader_get_bits_uint8 (&br, &obj_type, 5)) goto bad_config; if (obj_type == 0) { GST_WARNING_OBJECT (depayload, "invalid object type 0"); goto bad_config; } if (!gst_bit_reader_get_bits_uint8 (&br, &sr_idx, 4)) goto bad_config; if (sr_idx >= G_N_ELEMENTS (aac_sample_rates) && sr_idx != 15) { GST_WARNING_OBJECT (depayload, "invalid sample rate index %d", sr_idx); goto bad_config; } GST_LOG_OBJECT (rtpmp4adepay, "sample rate index %u", sr_idx); if (!gst_bit_reader_get_bits_uint8 (&br, &channels, 4)) goto bad_config; if (channels > 7) { GST_WARNING_OBJECT (depayload, "invalid channels %u", (guint) channels); goto bad_config; } /* rtp rate depends on sampling rate of the audio */ if (sr_idx == 15) { /* index of 15 means we get the rate in the next 24 bits */ if (!gst_bit_reader_get_bits_uint32 (&br, &rate, 24)) goto bad_config; } else if (sr_idx >= G_N_ELEMENTS (aac_sample_rates)) { goto bad_config; } else { /* else use the rate from the table */ rate = aac_sample_rates[sr_idx]; } rtpmp4adepay->frame_len = 1024; switch (obj_type) { case 1: case 2: case 3: case 4: case 6: case 7: { guint8 frameLenFlag = 0; if (gst_bit_reader_get_bits_uint8 (&br, &frameLenFlag, 1)) if (frameLenFlag) rtpmp4adepay->frame_len = 960; break; } default: break; } gst_caps_set_simple (srccaps, "channels", G_TYPE_INT, (gint) channels, "rate", G_TYPE_INT, (gint) rate, "codec_data", GST_TYPE_BUFFER, buffer, NULL); gst_buffer_unref (buffer); } else { g_warning ("cannot convert config to buffer"); } } bad_config: res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; } static GstBuffer * gst_rtp_mp4a_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMP4ADepay *rtpmp4adepay; GstBuffer *outbuf; rtpmp4adepay = GST_RTP_MP4A_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { gst_adapter_clear (rtpmp4adepay->adapter); } outbuf = gst_rtp_buffer_get_payload_buffer (buf); gst_buffer_copy_metadata (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS); gst_adapter_push (rtpmp4adepay->adapter, outbuf); /* RTP marker bit indicates the last packet of the AudioMuxElement => create * and push a buffer */ if (gst_rtp_buffer_get_marker (buf)) { guint avail; guint i; guint8 *data; guint pos; GstClockTime timestamp; avail = gst_adapter_available (rtpmp4adepay->adapter); timestamp = gst_adapter_prev_timestamp (rtpmp4adepay->adapter, NULL); GST_LOG_OBJECT (rtpmp4adepay, "have marker and %u available", avail); outbuf = gst_adapter_take_buffer (rtpmp4adepay->adapter, avail); data = GST_BUFFER_DATA (outbuf); /* position in data we are at */ pos = 0; /* looping through the number of sub-frames in the audio payload */ for (i = 0; i <= rtpmp4adepay->numSubFrames; i++) { /* determine payload length and set buffer data pointer accordingly */ guint skip; guint data_len; GstBuffer *tmp = NULL; /* each subframe starts with a variable length encoding */ data_len = 0; for (skip = 0; skip < avail; skip++) { data_len += data[skip]; if (data[skip] != 0xff) break; } skip++; /* this can not be possible, we have not enough data or the length * decoding failed because we ran out of data. */ if (skip + data_len > avail) goto wrong_size; GST_LOG_OBJECT (rtpmp4adepay, "subframe %u, header len %u, data len %u, left %u", i, skip, data_len, avail); /* take data out, skip the header */ pos += skip; tmp = gst_buffer_create_sub (outbuf, pos, data_len); /* skip data too */ skip += data_len; pos += data_len; /* update our pointers whith what we consumed */ data += skip; avail -= skip; GST_BUFFER_TIMESTAMP (tmp) = timestamp; gst_base_rtp_depayload_push (depayload, tmp); /* shift ts for next buffers */ if (rtpmp4adepay->frame_len && timestamp != -1 && depayload->clock_rate != 0) { timestamp += gst_util_uint64_scale_int (rtpmp4adepay->frame_len, GST_SECOND, depayload->clock_rate); } } /* just a check that lengths match */ if (avail) { GST_ELEMENT_WARNING (depayload, STREAM, DECODE, ("Packet invalid"), ("Not all payload consumed: " "possible wrongly encoded packet.")); } gst_buffer_unref (outbuf); } return NULL; /* ERRORS */ wrong_size: { GST_ELEMENT_WARNING (rtpmp4adepay, STREAM, DECODE, ("Packet did not validate"), ("wrong packet size")); gst_buffer_unref (outbuf); return NULL; } } static GstStateChangeReturn gst_rtp_mp4a_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpMP4ADepay *rtpmp4adepay; GstStateChangeReturn ret; rtpmp4adepay = GST_RTP_MP4A_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpmp4adepay->adapter); rtpmp4adepay->frame_len = 0; rtpmp4adepay->numSubFrames = 0; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { default: break; } return ret; } gboolean gst_rtp_mp4a_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4adepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP4A_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmpadepay.c0000644000175000017500000001252311677341656016634 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpmpadepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmpadepay_debug); #define GST_CAT_DEFAULT (rtpmpadepay_debug) static GstStaticPadTemplate gst_rtp_mpa_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") ); static GstStaticPadTemplate gst_rtp_mpa_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\";" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " "clock-rate = (int) 90000") ); GST_BOILERPLATE (GstRtpMPADepay, gst_rtp_mpa_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mpa_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mpa_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mpa_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpa_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpa_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG audio depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG audio from RTP packets (RFC 2038)", "Wim Taymans "); } static void gst_rtp_mpa_depay_class_init (GstRtpMPADepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->set_caps = gst_rtp_mpa_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_mpa_depay_process; GST_DEBUG_CATEGORY_INIT (rtpmpadepay_debug, "rtpmpadepay", 0, "MPEG Audio RTP Depayloader"); } static void gst_rtp_mpa_depay_init (GstRtpMPADepay * rtpmpadepay, GstRtpMPADepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static gboolean gst_rtp_mpa_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstCaps *outcaps; gint clock_rate; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; outcaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, NULL); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); return res; } static GstBuffer * gst_rtp_mpa_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMPADepay *rtpmpadepay; GstBuffer *outbuf; rtpmpadepay = GST_RTP_MPA_DEPAY (depayload); { gint payload_len; gboolean marker; payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len <= 4) goto empty_packet; /* strip off header * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ /* frag_offset = (payload[2] << 8) | payload[3]; */ /* subbuffer skipping the 4 header bytes */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 4, -1); marker = gst_rtp_buffer_get_marker (buf); if (marker) { /* mark start of talkspurt with discont */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } GST_DEBUG_OBJECT (rtpmpadepay, "gst_rtp_mpa_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); /* FIXME, we can push half mpeg frames when they are split over multiple * RTP packets */ return outbuf; } return NULL; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } } gboolean gst_rtp_mpa_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmpadepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MPA_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpceltpay.h0000644000175000017500000000344211671175354016474 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 */ #ifndef __GST_RTP_CELT_PAY_H__ #define __GST_RTP_CELT_PAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpCELTPay GstRtpCELTPay; typedef struct _GstRtpCELTPayClass GstRtpCELTPayClass; #define GST_TYPE_RTP_CELT_PAY \ (gst_rtp_celt_pay_get_type()) #define GST_RTP_CELT_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_CELT_PAY,GstRtpCELTPay)) #define GST_RTP_CELT_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_CELT_PAY,GstRtpCELTPayClass)) #define GST_IS_RTP_CELT_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_CELT_PAY)) #define GST_IS_RTP_CELT_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_CELT_PAY)) struct _GstRtpCELTPay { GstBaseRTPPayload payload; guint64 packet; /* queue to hold packets */ GQueue *queue; guint sbytes; /* bytes queued for sizes */ guint bytes; /* bytes queued for data */ GstClockTime qduration; /* queued duration */ }; struct _GstRtpCELTPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_celt_pay_get_type (void); gboolean gst_rtp_celt_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_CELT_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtppcmupay.h0000644000175000017500000000312311671175354016505 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 */ #ifndef __GST_RTP_PCMU_PAY_H__ #define __GST_RTP_PCMU_PAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpPcmuPay GstRtpPcmuPay; typedef struct _GstRtpPcmuPayClass GstRtpPcmuPayClass; #define GST_TYPE_RTP_PCMU_PAY \ (gst_rtp_pcmu_pay_get_type()) #define GST_RTP_PCMU_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMU_PAY,GstRtpPcmuPay)) #define GST_RTP_PCMU_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMU_PAY,GstRtpPcmuPayClass)) #define GST_IS_RTP_PCMU_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMU_PAY)) #define GST_IS_RTP_PCMU_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMU_PAY)) struct _GstRtpPcmuPay { GstBaseRTPAudioPayload audiopayload; }; struct _GstRtpPcmuPayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_pcmu_pay_get_type (void); gboolean gst_rtp_pcmu_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_PCMU_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp2tdepay.c0000644000175000017500000001477011677341656016747 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpmp2tdepay.h" /* RtpMP2TDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_SKIP_FIRST_BYTES 0 enum { PROP_0, PROP_SKIP_FIRST_BYTES }; static GstStaticPadTemplate gst_rtp_mp2t_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpegts," "packetsize=(int)188," "systemstream=(boolean)true") ); static GstStaticPadTemplate gst_rtp_mp2t_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP2T-ES\";" /* All optional parameters * * "profile-level-id=[1,MAX]" * "config=" */ "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_MP2T_STRING ", " "clock-rate = (int) [1, MAX ]") ); GST_BOILERPLATE (GstRtpMP2TDepay, gst_rtp_mp2t_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_mp2t_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp2t_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp2t_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG Transport Stream depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG2 TS from RTP packets (RFC 2250)", "Wim Taymans , " "Thijs Vermeir "); } static void gst_rtp_mp2t_depay_class_init (GstRtpMP2TDepayClass * klass) { GObjectClass *gobject_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_mp2t_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp2t_depay_setcaps; gobject_class->set_property = gst_rtp_mp2t_depay_set_property; gobject_class->get_property = gst_rtp_mp2t_depay_get_property; g_object_class_install_property (gobject_class, PROP_SKIP_FIRST_BYTES, g_param_spec_uint ("skip-first-bytes", "Skip first bytes", "The amount of bytes that need to be skipped at the beginning of the payload", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * rtpmp2tdepay, GstRtpMP2TDepayClass * klass) { rtpmp2tdepay->skip_first_bytes = DEFAULT_SKIP_FIRST_BYTES; } static gboolean gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; GstStructure *structure; gint clock_rate; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/mpegts", "packetsize", G_TYPE_INT, 188, "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return res; } static GstBuffer * gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMP2TDepay *rtpmp2tdepay; GstBuffer *outbuf; gint payload_len; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); if (G_UNLIKELY (payload_len <= rtpmp2tdepay->skip_first_bytes)) goto empty_packet; outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, rtpmp2tdepay->skip_first_bytes, -1); if (outbuf) GST_DEBUG ("gst_rtp_mp2t_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, (NULL), ("Packet was empty")); return NULL; } } static void gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpMP2TDepay *rtpmp2tdepay; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object); switch (prop_id) { case PROP_SKIP_FIRST_BYTES: rtpmp2tdepay->skip_first_bytes = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpMP2TDepay *rtpmp2tdepay; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object); switch (prop_id) { case PROP_SKIP_FIRST_BYTES: g_value_set_uint (value, rtpmp2tdepay->skip_first_bytes); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp2tdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP2T_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpdepay.c0000644000175000017500000001174411677341656016142 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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. */ /* Element-Checklist-Version: 5 */ #include "gstrtpdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpdepay_debug); #define GST_CAT_DEFAULT (rtpdepay_debug) static GstStaticPadTemplate gst_rtp_depay_src_rtp_template = GST_STATIC_PAD_TEMPLATE ("srcrtp", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate gst_rtp_depay_src_rtcp_template = GST_STATIC_PAD_TEMPLATE ("srcrtcp", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtcp") ); static GstStaticPadTemplate gst_rtp_depay_sink_rtp_template = GST_STATIC_PAD_TEMPLATE ("sinkrtp", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp") ); static GstStaticPadTemplate gst_rtp_depay_sink_rtcp_template = GST_STATIC_PAD_TEMPLATE ("sinkrtcp", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtcp") ); static GstCaps *gst_rtp_depay_getcaps (GstPad * pad); static GstFlowReturn gst_rtp_depay_chain_rtp (GstPad * pad, GstBuffer * buffer); static GstFlowReturn gst_rtp_depay_chain_rtcp (GstPad * pad, GstBuffer * buffer); GST_BOILERPLATE (GstRTPDepay, gst_rtp_depay, GstElement, GST_TYPE_ELEMENT); static void gst_rtp_depay_base_init (gpointer klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (gstelement_class, &gst_rtp_depay_src_rtp_template); gst_element_class_add_static_pad_template (gstelement_class, &gst_rtp_depay_src_rtcp_template); gst_element_class_add_static_pad_template (gstelement_class, &gst_rtp_depay_sink_rtp_template); gst_element_class_add_static_pad_template (gstelement_class, &gst_rtp_depay_sink_rtcp_template); gst_element_class_set_details_simple (gstelement_class, "Dummy RTP session manager", "Codec/Depayloader/Network/RTP", "Accepts raw RTP and RTCP packets and sends them forward", "Wim Taymans "); } static void gst_rtp_depay_class_init (GstRTPDepayClass * klass) { GST_DEBUG_CATEGORY_INIT (rtpdepay_debug, "rtpdepay", 0, "RTP decoder"); } static void gst_rtp_depay_init (GstRTPDepay * rtpdepay, GstRTPDepayClass * klass) { /* the input rtp pad */ rtpdepay->sink_rtp = gst_pad_new_from_static_template (&gst_rtp_depay_sink_rtp_template, "sinkrtp"); gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->sink_rtp); gst_pad_set_getcaps_function (rtpdepay->sink_rtp, gst_rtp_depay_getcaps); gst_pad_set_chain_function (rtpdepay->sink_rtp, gst_rtp_depay_chain_rtp); /* the input rtcp pad */ rtpdepay->sink_rtcp = gst_pad_new_from_static_template (&gst_rtp_depay_sink_rtcp_template, "sinkrtcp"); gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->sink_rtcp); gst_pad_set_chain_function (rtpdepay->sink_rtcp, gst_rtp_depay_chain_rtcp); /* the output rtp pad */ rtpdepay->src_rtp = gst_pad_new_from_static_template (&gst_rtp_depay_src_rtp_template, "srcrtp"); gst_pad_set_getcaps_function (rtpdepay->src_rtp, gst_rtp_depay_getcaps); gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->src_rtp); /* the output rtcp pad */ rtpdepay->src_rtcp = gst_pad_new_from_static_template (&gst_rtp_depay_src_rtcp_template, "srcrtcp"); gst_element_add_pad (GST_ELEMENT (rtpdepay), rtpdepay->src_rtcp); } static GstCaps * gst_rtp_depay_getcaps (GstPad * pad) { GstRTPDepay *src; GstPad *other; GstCaps *caps; src = GST_RTP_DEPAY (GST_PAD_PARENT (pad)); other = pad == src->src_rtp ? src->sink_rtp : src->src_rtp; caps = gst_pad_peer_get_caps (other); if (caps == NULL) caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); return caps; } static GstFlowReturn gst_rtp_depay_chain_rtp (GstPad * pad, GstBuffer * buffer) { GstRTPDepay *src; src = GST_RTP_DEPAY (GST_PAD_PARENT (pad)); GST_DEBUG ("got rtp packet"); return gst_pad_push (src->src_rtp, buffer); } static GstFlowReturn gst_rtp_depay_chain_rtcp (GstPad * pad, GstBuffer * buffer) { GST_DEBUG ("got rtcp packet"); gst_buffer_unref (buffer); return GST_FLOW_OK; } gboolean gst_rtp_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpspeexpay.h0000644000175000017500000000315111671175354016666 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 */ #ifndef __GST_RTP_SPEEX_PAY_H__ #define __GST_RTP_SPEEX_PAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpSPEEXPay GstRtpSPEEXPay; typedef struct _GstRtpSPEEXPayClass GstRtpSPEEXPayClass; #define GST_TYPE_RTP_SPEEX_PAY \ (gst_rtp_speex_pay_get_type()) #define GST_RTP_SPEEX_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SPEEX_PAY,GstRtpSPEEXPay)) #define GST_RTP_SPEEX_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SPEEX_PAY,GstRtpSPEEXPayClass)) #define GST_IS_RTP_SPEEX_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SPEEX_PAY)) #define GST_IS_RTP_SPEEX_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SPEEX_PAY)) struct _GstRtpSPEEXPay { GstBaseRTPPayload payload; guint64 packet; }; struct _GstRtpSPEEXPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_speex_pay_get_type (void); gboolean gst_rtp_speex_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_SPEEX_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpchannels.h0000644000175000017500000001421611671175354016627 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include #include typedef struct { const gchar *name; gint channels; const GstAudioChannelPosition *pos; } GstRTPChannelOrder; static const GstAudioChannelPosition pos_4_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT }; static const GstAudioChannelPosition pos_4_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE }; static const GstAudioChannelPosition pos_4_3[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE }; static const GstAudioChannelPosition pos_5_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER }; static const GstAudioChannelPosition pos_6_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE }; static const GstAudioChannelPosition pos_6_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT }; static const GstAudioChannelPosition pos_8_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT }; static const GstAudioChannelPosition pos_8_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT }; static const GstAudioChannelPosition pos_8_3[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT }; static const GstAudioChannelPosition pos_def_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_MONO }; static const GstAudioChannelPosition pos_def_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT }; static const GstAudioChannelPosition pos_def_3[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER }; static const GstAudioChannelPosition pos_def_4[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_LFE }; static const GstAudioChannelPosition pos_def_5[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT }; static const GstAudioChannelPosition pos_def_6[] = { GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_LFE }; static const GstRTPChannelOrder channel_orders[] = { /* 4 channels */ { "DV.LRLsRs", 4, pos_4_1 }, { "DV.LRCS", 4, pos_4_2 }, { "DV.LRCWo", 4, pos_4_3 }, /* 5 channels */ { "DV.LRLsRsC", 5, pos_5_1 }, /* 6 channels */ { "DV.LRLsRsCS", 6, pos_6_1 }, { "DV.LmixRmixTWoQ1Q2", 6, pos_6_2 }, /* 8 channels */ { "DV.LRCWoLsRsLmixRmix", 8, pos_8_1 }, { "DV.LRCWoLs1Rs1Ls2Rs2", 8, pos_8_2 }, { "DV.LRCWoLsRsLcRc", 8, pos_8_3 }, /* default layouts */ { NULL, 1, pos_def_1 }, { NULL, 2, pos_def_2 }, { NULL, 3, pos_def_3 }, { NULL, 4, pos_def_4 }, { NULL, 5, pos_def_5 }, { NULL, 6, pos_def_6 }, /* terminator, invalid entry */ { NULL, 0, NULL }, }; const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition *pos); const GstRTPChannelOrder * gst_rtp_channels_get_by_order (gint channels, const gchar *order); const GstRTPChannelOrder * gst_rtp_channels_get_by_index (gint channels, guint idx); GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels); gst-plugins-good-0.10.31/gst/rtp/gstrtpg722pay.h0000644000175000017500000000352211671175354016225 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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_RTP_G722_PAY_H__ #define __GST_RTP_G722_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_G722_PAY \ (gst_rtp_g722_pay_get_type()) #define GST_RTP_G722_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G722_PAY,GstRtpG722Pay)) #define GST_RTP_G722_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G722_PAY,GstRtpG722PayClass)) #define GST_IS_RTP_G722_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G722_PAY)) #define GST_IS_RTP_G722_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G722_PAY)) typedef struct _GstRtpG722Pay GstRtpG722Pay; typedef struct _GstRtpG722PayClass GstRtpG722PayClass; struct _GstRtpG722Pay { GstBaseRTPAudioPayload payload; gint rate; gint channels; }; struct _GstRtpG722PayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_g722_pay_get_type (void); gboolean gst_rtp_g722_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G722_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpgsmdepay.c0000644000175000017500000001113411677341656016642 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2005> Zeeshan Ali * * 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 #include #include "gstrtpgsmdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpgsmdepay_debug); #define GST_CAT_DEFAULT (rtpgsmdepay_debug) /* RTPGSMDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; static GstStaticPadTemplate gst_rtp_gsm_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = 1") ); static GstStaticPadTemplate gst_rtp_gsm_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\";" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_GSM_STRING ", " "clock-rate = (int) 8000") ); static GstBuffer *gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, GstBuffer * buf); static gboolean gst_rtp_gsm_depay_setcaps (GstBaseRTPDepayload * _depayload, GstCaps * caps); GST_BOILERPLATE (GstRTPGSMDepay, gst_rtp_gsm_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_gsm_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gsm_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gsm_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP GSM depayloader", "Codec/Depayloader/Network/RTP", "Extracts GSM audio from RTP packets", "Zeeshan Ali "); } static void gst_rtp_gsm_depay_class_init (GstRTPGSMDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertp_depayload_class; gstbasertp_depayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertp_depayload_class->process = gst_rtp_gsm_depay_process; gstbasertp_depayload_class->set_caps = gst_rtp_gsm_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpgsmdepay_debug, "rtpgsmdepay", 0, "GSM Audio RTP Depayloader"); } static void gst_rtp_gsm_depay_init (GstRTPGSMDepay * rtpgsmdepay, GstRTPGSMDepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static gboolean gst_rtp_gsm_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; gboolean ret; GstStructure *structure; gint clock_rate; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("audio/x-gsm", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; } static GstBuffer * gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, GstBuffer * buf) { GstBuffer *outbuf = NULL; gboolean marker; marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (marker && outbuf) { /* mark start of talkspurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } return outbuf; } gboolean gst_rtp_gsm_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgsmdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_GSM_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpg726pay.h0000644000175000017500000000331611671175354016232 00000000000000/* GStreamer * Copyright (C) 2005 Edgard Lima * Copyright (C) 2007,2008 Axis Communications * * 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 */ #ifndef __GST_RTP_G726_PAY_H__ #define __GST_RTP_G726_PAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpG726Pay GstRtpG726Pay; typedef struct _GstRtpG726PayClass GstRtpG726PayClass; #define GST_TYPE_RTP_G726_PAY \ (gst_rtp_g726_pay_get_type()) #define GST_RTP_G726_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G726_PAY,GstRtpG726Pay)) #define GST_RTP_G726_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G726_PAY,GstRtpG726PayClass)) #define GST_IS_RTP_G726_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G726_PAY)) #define GST_IS_RTP_G726_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G726_PAY)) struct _GstRtpG726Pay { GstBaseRTPAudioPayload audiopayload; gboolean aal2; gboolean force_aal2; gint bitrate; }; struct _GstRtpG726PayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_g726_pay_get_type (void); gboolean gst_rtp_g726_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G726_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpsirendepay.h0000644000175000017500000000361611671175354017201 00000000000000/* * Siren Depayloader Gst Element * * @author: Youness Alaoui * * 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_RTP_SIREN_DEPAY_H__ #define __GST_RTP_SIREN_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTPSirenDepay GstRTPSirenDepay; typedef struct _GstRTPSirenDepayClass GstRTPSirenDepayClass; #define GST_TYPE_RTP_SIREN_DEPAY \ (gst_rtp_siren_depay_get_type()) #define GST_RTP_SIREN_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SIREN_DEPAY,GstRTPSirenDepay)) #define GST_RTP_SIREN_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SIREN_DEPAY,GstRTPSirenDepayClass)) #define GST_IS_RTP_SIREN_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SIREN_DEPAY)) #define GST_IS_RTP_SIREN_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SIREN_DEPAY)) struct _GstRTPSirenDepay { GstBaseRTPDepayload depayload; }; struct _GstRTPSirenDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_siren_depay_get_type (void); gboolean gst_rtp_siren_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_SIREN_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpilbcdepay.c0000644000175000017500000001533511677341656016774 00000000000000/* GStreamer * Copyright (C) <2006> Philippe Khalaf * * 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 #include #include #include "gstrtpilbcdepay.h" /* RtpiLBCDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; #define DEFAULT_MODE GST_ILBC_MODE_30 enum { PROP_0, PROP_MODE }; /* FIXME, mode should be string because it is a parameter in SDP fmtp */ static GstStaticPadTemplate gst_rtp_ilbc_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"ILBC\", " "mode = (string) { \"20\", \"30\" }") ); static GstStaticPadTemplate gst_rtp_ilbc_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-iLBC, " "mode = (int) { 20, 30 }") ); static void gst_ilbc_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_ilbc_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstBuffer *gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_ilbc_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRTPiLBCDepay, gst_rtp_ilbc_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); #define GST_TYPE_ILBC_MODE (gst_ilbc_mode_get_type()) static GType gst_ilbc_mode_get_type (void) { static GType ilbc_mode_type = 0; static const GEnumValue ilbc_modes[] = { {GST_ILBC_MODE_20, "20ms frames", "20ms"}, {GST_ILBC_MODE_30, "30ms frames", "30ms"}, {0, NULL, NULL}, }; if (!ilbc_mode_type) { ilbc_mode_type = g_enum_register_static ("iLBCMode", ilbc_modes); } return ilbc_mode_type; } static void gst_rtp_ilbc_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ilbc_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ilbc_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP iLBC depayloader", "Codec/Depayloader/Network/RTP", "Extracts iLBC audio from RTP packets (RFC 3952)", "Philippe Kalaf "); } static void gst_rtp_ilbc_depay_class_init (GstRTPiLBCDepayClass * klass) { GObjectClass *gobject_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->set_property = gst_ilbc_depay_set_property; gobject_class->get_property = gst_ilbc_depay_get_property; /* FIXME, mode is in the caps */ g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "iLBC frame mode", GST_TYPE_ILBC_MODE, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasertpdepayload_class->process = gst_rtp_ilbc_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_ilbc_depay_setcaps; } static void gst_rtp_ilbc_depay_init (GstRTPiLBCDepay * rtpilbcdepay, GstRTPiLBCDepayClass * klass) { /* Set default mode */ rtpilbcdepay->mode = DEFAULT_MODE; } static gboolean gst_rtp_ilbc_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (depayload); GstCaps *srccaps; GstStructure *structure; const gchar *mode_str = NULL; gint mode, clock_rate; gboolean ret; structure = gst_caps_get_structure (caps, 0); mode = rtpilbcdepay->mode; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; depayload->clock_rate = clock_rate; /* parse mode, if we can */ mode_str = gst_structure_get_string (structure, "mode"); if (mode_str) { mode = strtol (mode_str, NULL, 10); if (mode != 20 && mode != 30) mode = rtpilbcdepay->mode; } rtpilbcdepay->mode = mode; srccaps = gst_caps_new_simple ("audio/x-iLBC", "mode", G_TYPE_INT, rtpilbcdepay->mode, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); gst_caps_unref (srccaps); return ret; } static GstBuffer * gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf; gboolean marker; marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (marker && outbuf) { /* mark start of talkspurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } return outbuf; } static void gst_ilbc_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (object); switch (prop_id) { case PROP_MODE: rtpilbcdepay->mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_ilbc_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, rtpilbcdepay->mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_ilbc_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpilbcdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_ILBC_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpg722depay.c0000644000175000017500000001626611677341656016550 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include #include #include "gstrtpg722depay.h" #include "gstrtpchannels.h" GST_DEBUG_CATEGORY_STATIC (rtpg722depay_debug); #define GST_CAT_DEFAULT (rtpg722depay_debug) static GstStaticPadTemplate gst_rtp_g722_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/G722, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") ); static GstStaticPadTemplate gst_rtp_g722_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " /* "channels = (int) [1, MAX]" */ /* "channel-order = (string) ANY" */ "encoding-name = (string) \"G722\";" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_G722_STRING ", " "clock-rate = (int) [ 1, MAX ]" /* "channels = (int) [1, MAX]" */ /* "emphasis = (string) ANY" */ /* "channel-order = (string) ANY" */ ) ); GST_BOILERPLATE (GstRtpG722Depay, gst_rtp_g722_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_g722_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_g722_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_g722_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g722_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g722_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP audio depayloader", "Codec/Depayloader/Network/RTP", "Extracts G722 audio from RTP packets", "Wim Taymans "); } static void gst_rtp_g722_depay_class_init (GstRtpG722DepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->set_caps = gst_rtp_g722_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_g722_depay_process; GST_DEBUG_CATEGORY_INIT (rtpg722depay_debug, "rtpg722depay", 0, "G722 RTP Depayloader"); } static void gst_rtp_g722_depay_init (GstRtpG722Depay * rtpg722depay, GstRtpG722DepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static gint gst_rtp_g722_depay_parse_int (GstStructure * structure, const gchar * field, gint def) { const gchar *str; gint res; if ((str = gst_structure_get_string (structure, field))) return atoi (str); if (gst_structure_get_int (structure, field, &res)) return res; return def; } static gboolean gst_rtp_g722_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpG722Depay *rtpg722depay; gint clock_rate, payload, samplerate; gint channels; GstCaps *srccaps; gboolean res; const gchar *channel_order; const GstRTPChannelOrder *order; rtpg722depay = GST_RTP_G722_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); payload = 96; gst_structure_get_int (structure, "payload", &payload); switch (payload) { case GST_RTP_PAYLOAD_G722: channels = 1; clock_rate = 8000; samplerate = 16000; break; default: /* no fixed mapping, we need clock-rate */ channels = 0; clock_rate = 0; samplerate = 0; break; } /* caps can overwrite defaults */ clock_rate = gst_rtp_g722_depay_parse_int (structure, "clock-rate", clock_rate); if (clock_rate == 0) goto no_clockrate; if (clock_rate == 8000) samplerate = 16000; if (samplerate == 0) samplerate = clock_rate; channels = gst_rtp_g722_depay_parse_int (structure, "encoding-params", channels); if (channels == 0) { channels = gst_rtp_g722_depay_parse_int (structure, "channels", channels); if (channels == 0) { /* channels defaults to 1 otherwise */ channels = 1; } } depayload->clock_rate = clock_rate; rtpg722depay->rate = samplerate; rtpg722depay->channels = channels; srccaps = gst_caps_new_simple ("audio/G722", "rate", G_TYPE_INT, samplerate, "channels", G_TYPE_INT, channels, NULL); /* add channel positions */ channel_order = gst_structure_get_string (structure, "channel-order"); order = gst_rtp_channels_get_by_order (channels, channel_order); if (order) { gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), order->pos); } else { GstAudioChannelPosition *pos; GST_ELEMENT_WARNING (rtpg722depay, STREAM, DECODE, (NULL), ("Unknown channel order '%s' for %d channels", GST_STR_NULL (channel_order), channels)); /* create default NONE layout */ pos = gst_rtp_channels_create_default (channels); gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), pos); g_free (pos); } res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ no_clockrate: { GST_ERROR_OBJECT (depayload, "no clock-rate specified"); return FALSE; } } static GstBuffer * gst_rtp_g722_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpG722Depay *rtpg722depay; GstBuffer *outbuf; gint payload_len; gboolean marker; rtpg722depay = GST_RTP_G722_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len <= 0) goto empty_packet; GST_DEBUG_OBJECT (rtpg722depay, "got payload of %d bytes", payload_len); outbuf = gst_rtp_buffer_get_payload_buffer (buf); marker = gst_rtp_buffer_get_marker (buf); if (marker && outbuf) { /* mark talk spurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } return outbuf; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpg722depay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } } gboolean gst_rtp_g722_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg722depay", GST_RANK_SECONDARY, GST_TYPE_RTP_G722_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4vdepay.c0000644000175000017500000001474011677341656016750 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpmp4vdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4vdepay_debug); #define GST_CAT_DEFAULT (rtpmp4vdepay_debug) static GstStaticPadTemplate gst_rtp_mp4v_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg," "mpegversion=(int) 4," "systemstream=(boolean)false") ); static GstStaticPadTemplate gst_rtp_mp4v_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4V-ES\"" /* All optional parameters * * "profile-level-id=[1,MAX]" * "config=" */ ) ); GST_BOILERPLATE (GstRtpMP4VDepay, gst_rtp_mp4v_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_mp4v_depay_finalize (GObject * object); static gboolean gst_rtp_mp4v_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp4v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_mp4v_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mp4v_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4v_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4v_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG4 video depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG4 video from RTP packets (RFC 3016)", "Wim Taymans "); } static void gst_rtp_mp4v_depay_class_init (GstRtpMP4VDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_mp4v_depay_finalize; gstelement_class->change_state = gst_rtp_mp4v_depay_change_state; gstbasertpdepayload_class->process = gst_rtp_mp4v_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp4v_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpmp4vdepay_debug, "rtpmp4vdepay", 0, "MPEG4 video RTP Depayloader"); } static void gst_rtp_mp4v_depay_init (GstRtpMP4VDepay * rtpmp4vdepay, GstRtpMP4VDepayClass * klass) { rtpmp4vdepay->adapter = gst_adapter_new (); } static void gst_rtp_mp4v_depay_finalize (GObject * object) { GstRtpMP4VDepay *rtpmp4vdepay; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (object); g_object_unref (rtpmp4vdepay->adapter); rtpmp4vdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_mp4v_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstCaps *srccaps; const gchar *str; gint clock_rate; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); if ((str = gst_structure_get_string (structure, "config"))) { GValue v = { 0 }; g_value_init (&v, GST_TYPE_BUFFER); if (gst_value_deserialize (&v, str)) { GstBuffer *buffer; buffer = gst_value_get_buffer (&v); gst_caps_set_simple (srccaps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); /* caps takes ref */ g_value_unset (&v); } else { g_warning ("cannot convert config to buffer"); } } res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; } static GstBuffer * gst_rtp_mp4v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMP4VDepay *rtpmp4vdepay; GstBuffer *outbuf; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) gst_adapter_clear (rtpmp4vdepay->adapter); outbuf = gst_rtp_buffer_get_payload_buffer (buf); gst_adapter_push (rtpmp4vdepay->adapter, outbuf); /* if this was the last packet of the VOP, create and push a buffer */ if (gst_rtp_buffer_get_marker (buf)) { guint avail; avail = gst_adapter_available (rtpmp4vdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4vdepay->adapter, avail); GST_DEBUG ("gst_rtp_mp4v_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } return NULL; } static GstStateChangeReturn gst_rtp_mp4v_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpMP4VDepay *rtpmp4vdepay; GstStateChangeReturn ret; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpmp4vdepay->adapter); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { default: break; } return ret; } gboolean gst_rtp_mp4v_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4vdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP4V_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpilbcpay.c0000644000175000017500000001455411677341656016465 00000000000000/* GStreamer * Copyright (C) <2006> Philippe Khalaf * * 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 #include #include "gstrtpilbcpay.h" GST_DEBUG_CATEGORY_STATIC (rtpilbcpay_debug); #define GST_CAT_DEFAULT (rtpilbcpay_debug) static GstStaticPadTemplate gst_rtp_ilbc_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-iLBC, " "mode = (int) {20, 30}") ); static GstStaticPadTemplate gst_rtp_ilbc_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"ILBC\", " "mode = (string) { \"20\", \"30\" }") ); static GstCaps *gst_rtp_ilbc_pay_sink_getcaps (GstBaseRTPPayload * payload, GstPad * pad); static gboolean gst_rtp_ilbc_pay_sink_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); GST_BOILERPLATE (GstRTPILBCPay, gst_rtp_ilbc_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_ilbc_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ilbc_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ilbc_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP iLBC Payloader", "Codec/Payloader/Network/RTP", "Packetize iLBC audio streams into RTP packets", "Philippe Kalaf "); } static void gst_rtp_ilbc_pay_class_init (GstRTPILBCPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_ilbc_pay_sink_setcaps; gstbasertppayload_class->get_caps = gst_rtp_ilbc_pay_sink_getcaps; GST_DEBUG_CATEGORY_INIT (rtpilbcpay_debug, "rtpilbcpay", 0, "iLBC audio RTP payloader"); } static void gst_rtp_ilbc_pay_init (GstRTPILBCPay * rtpilbcpay, GstRTPILBCPayClass * klass) { GstBaseRTPPayload *basertppayload; GstBaseRTPAudioPayload *basertpaudiopayload; basertppayload = GST_BASE_RTP_PAYLOAD (rtpilbcpay); basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpilbcpay); /* we don't set the payload type, it should be set by the application using * the pt property or the default 96 will be used */ basertppayload->clock_rate = 8000; rtpilbcpay->mode = -1; /* tell basertpaudiopayload that this is a frame based codec */ gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); } static gboolean gst_rtp_ilbc_pay_sink_setcaps (GstBaseRTPPayload * basertppayload, GstCaps * caps) { GstRTPILBCPay *rtpilbcpay; GstBaseRTPAudioPayload *basertpaudiopayload; gboolean ret; gint mode; gchar *mode_str; GstStructure *structure; const char *payload_name; rtpilbcpay = GST_RTP_ILBC_PAY (basertppayload); basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); structure = gst_caps_get_structure (caps, 0); payload_name = gst_structure_get_name (structure); if (g_ascii_strcasecmp ("audio/x-iLBC", payload_name)) goto wrong_caps; if (!gst_structure_get_int (structure, "mode", &mode)) goto no_mode; if (mode != 20 && mode != 30) goto wrong_mode; gst_basertppayload_set_options (basertppayload, "audio", TRUE, "ILBC", 8000); /* set options for this frame based audio codec */ gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, mode, mode == 30 ? 50 : 38); mode_str = g_strdup_printf ("%d", mode); ret = gst_basertppayload_set_outcaps (basertppayload, "mode", G_TYPE_STRING, mode_str, NULL); g_free (mode_str); if (mode != rtpilbcpay->mode && rtpilbcpay->mode != -1) goto mode_changed; rtpilbcpay->mode = mode; return ret; /* ERRORS */ wrong_caps: { GST_ERROR_OBJECT (rtpilbcpay, "expected audio/x-iLBC, received %s", payload_name); return FALSE; } no_mode: { GST_ERROR_OBJECT (rtpilbcpay, "did not receive a mode"); return FALSE; } wrong_mode: { GST_ERROR_OBJECT (rtpilbcpay, "mode must be 20 or 30, received %d", mode); return FALSE; } mode_changed: { GST_ERROR_OBJECT (rtpilbcpay, "Mode has changed from %d to %d! " "Mode cannot change while streaming", rtpilbcpay->mode, mode); return FALSE; } } /* we return the padtemplate caps with the mode field fixated to a value if we * can */ static GstCaps * gst_rtp_ilbc_pay_sink_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) { GstCaps *otherpadcaps; GstCaps *caps; otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { GstStructure *structure; const gchar *mode_str; gint mode; structure = gst_caps_get_structure (otherpadcaps, 0); /* parse mode, if we can */ mode_str = gst_structure_get_string (structure, "mode"); if (mode_str) { mode = strtol (mode_str, NULL, 10); if (mode == 20 || mode == 30) { structure = gst_caps_get_structure (caps, 0); gst_structure_set (structure, "mode", G_TYPE_INT, mode, NULL); } } } gst_caps_unref (otherpadcaps); } return caps; } gboolean gst_rtp_ilbc_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpilbcpay", GST_RANK_SECONDARY, GST_TYPE_RTP_ILBC_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpqcelpdepay.h0000644000175000017500000000366211671175354017166 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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_RTP_QCELP_DEPAY_H__ #define __GST_RTP_QCELP_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_QCELP_DEPAY \ (gst_rtp_qcelp_depay_get_type()) #define GST_RTP_QCELP_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_QCELP_DEPAY,GstRtpQCELPDepay)) #define GST_RTP_QCELP_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_QCELP_DEPAY,GstRtpQCELPDepayClass)) #define GST_IS_RTP_QCELP_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_QCELP_DEPAY)) #define GST_IS_RTP_QCELP_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_QCELP_DEPAY)) typedef struct _GstRtpQCELPDepay GstRtpQCELPDepay; typedef struct _GstRtpQCELPDepayClass GstRtpQCELPDepayClass; struct _GstRtpQCELPDepay { GstBaseRTPDepayload depayload; gboolean interleaved; guint bundling; GPtrArray *packets; }; struct _GstRtpQCELPDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_qcelp_depay_get_type (void); gboolean gst_rtp_qcelp_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_QCELP_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpvorbisdepay.c0000644000175000017500000005205511677341656017367 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include #include "gstrtpvorbisdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpvorbisdepay_debug); #define GST_CAT_DEFAULT (rtpvorbisdepay_debug) /* references: * http://www.rfc-editor.org/rfc/rfc5215.txt */ static GstStaticPadTemplate gst_rtp_vorbis_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"VORBIS\"" /* All required parameters * * "encoding-params = (string) " * "configuration = (string) ANY" */ ) ); static GstStaticPadTemplate gst_rtp_vorbis_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-vorbis") ); GST_BOILERPLATE (GstRtpVorbisDepay, gst_rtp_vorbis_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_vorbis_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_vorbis_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_vorbis_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_vorbis_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_vorbis_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vorbis_depay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vorbis_depay_src_template); gst_element_class_set_details_simple (element_class, "RTP Vorbis depayloader", "Codec/Depayloader/Network/RTP", "Extracts Vorbis Audio from RTP packets (RFC 5215)", "Wim Taymans "); } static void gst_rtp_vorbis_depay_class_init (GstRtpVorbisDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_vorbis_depay_finalize; gstelement_class->change_state = gst_rtp_vorbis_depay_change_state; gstbasertpdepayload_class->process = gst_rtp_vorbis_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_vorbis_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpvorbisdepay_debug, "rtpvorbisdepay", 0, "Vorbis RTP Depayloader"); } static void gst_rtp_vorbis_depay_init (GstRtpVorbisDepay * rtpvorbisdepay, GstRtpVorbisDepayClass * klass) { rtpvorbisdepay->adapter = gst_adapter_new (); } static void free_config (GstRtpVorbisConfig * conf) { GList *headers; for (headers = conf->headers; headers; headers = g_list_next (headers)) { GstBuffer *header = GST_BUFFER_CAST (headers->data); gst_buffer_unref (header); } g_list_free (conf->headers); g_free (conf); } static void free_indents (GstRtpVorbisDepay * rtpvorbisdepay) { GList *walk; for (walk = rtpvorbisdepay->configs; walk; walk = g_list_next (walk)) { free_config ((GstRtpVorbisConfig *) walk->data); } g_list_free (rtpvorbisdepay->configs); rtpvorbisdepay->configs = NULL; } static void gst_rtp_vorbis_depay_finalize (GObject * object) { GstRtpVorbisDepay *rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (object); g_object_unref (rtpvorbisdepay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } /* takes ownership of confbuf */ static gboolean gst_rtp_vorbis_depay_parse_configuration (GstRtpVorbisDepay * rtpvorbisdepay, GstBuffer * confbuf) { GstBuffer *buf; guint32 num_headers; guint8 *data; guint size; guint offset; gint i, j; data = GST_BUFFER_DATA (confbuf); size = GST_BUFFER_SIZE (confbuf); GST_DEBUG_OBJECT (rtpvorbisdepay, "config size %u", size); /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of packed headers | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | .... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ if (size < 4) goto too_small; num_headers = GST_READ_UINT32_BE (data); size -= 4; data += 4; offset = 4; GST_DEBUG_OBJECT (rtpvorbisdepay, "have %u headers", num_headers); /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | length .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | n. of headers | length1 | length2 .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Identification Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Comment Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Comment Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Setup Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Setup Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ for (i = 0; i < num_headers; i++) { guint32 ident; guint16 length; guint8 n_headers, b; GstRtpVorbisConfig *conf; guint *h_sizes; guint extra = 1; if (size < 6) goto too_small; ident = (data[0] << 16) | (data[1] << 8) | data[2]; length = (data[3] << 8) | data[4]; n_headers = data[5]; size -= 6; data += 6; offset += 6; GST_DEBUG_OBJECT (rtpvorbisdepay, "header %d, ident 0x%08x, length %u, left %u", i, ident, length, size); /* FIXME check if we already got this ident */ /* length might also include count of following size fields */ if (size < length && size + 1 != length) goto too_small; /* read header sizes we read 2 sizes, the third size (for which we allocate * space) must be derived from the total packed header length. */ h_sizes = g_newa (guint, n_headers + 1); for (j = 0; j < n_headers; j++) { guint h_size; h_size = 0; do { if (size < 1) goto too_small; b = *data++; offset++; extra++; size--; h_size = (h_size << 7) | (b & 0x7f); } while (b & 0x80); GST_DEBUG_OBJECT (rtpvorbisdepay, "headers %d: size: %u", j, h_size); if (length < h_size) goto too_small; h_sizes[j] = h_size; length -= h_size; } /* last header length is the remaining space */ GST_DEBUG_OBJECT (rtpvorbisdepay, "last header size: %u", length); h_sizes[j] = length; GST_DEBUG_OBJECT (rtpvorbisdepay, "preparing headers"); conf = g_new0 (GstRtpVorbisConfig, 1); conf->ident = ident; for (j = 0; j <= n_headers; j++) { guint h_size; h_size = h_sizes[j]; if (size < h_size) { if (j != n_headers || size + extra != h_size) { free_config (conf); goto too_small; } else { /* otherwise means that overall length field contained total length, * including extra fields */ h_size -= extra; } } GST_DEBUG_OBJECT (rtpvorbisdepay, "reading header %d, size %u", j, h_size); buf = gst_buffer_create_sub (confbuf, offset, h_size); conf->headers = g_list_append (conf->headers, buf); offset += h_size; size -= h_size; } rtpvorbisdepay->configs = g_list_append (rtpvorbisdepay->configs, conf); } gst_buffer_unref (confbuf); return TRUE; /* ERRORS */ too_small: { GST_DEBUG_OBJECT (rtpvorbisdepay, "configuration too small"); gst_buffer_unref (confbuf); return FALSE; } } static gboolean gst_rtp_vorbis_depay_parse_inband_configuration (GstRtpVorbisDepay * rtpvorbisdepay, guint ident, guint8 * configuration, guint size, guint length) { GstBuffer *confbuf; guint8 *conf; if (G_UNLIKELY (size < 4)) return FALSE; /* transform inline to out-of-band and parse that one */ confbuf = gst_buffer_new_and_alloc (size + 9); conf = GST_BUFFER_DATA (confbuf); /* 1 header */ GST_WRITE_UINT32_BE (conf, 1); /* write Ident */ GST_WRITE_UINT24_BE (conf + 4, ident); /* write sort-of-length */ GST_WRITE_UINT16_BE (conf + 7, length); /* copy remainder */ memcpy (conf + 9, configuration, size); return gst_rtp_vorbis_depay_parse_configuration (rtpvorbisdepay, confbuf); } static gboolean gst_rtp_vorbis_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpVorbisDepay *rtpvorbisdepay; GstCaps *srccaps; const gchar *configuration; gint clock_rate; gboolean res; rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); /* get clockrate */ if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_rate; /* read and parse configuration string */ configuration = gst_structure_get_string (structure, "configuration"); if (configuration) { GstBuffer *confbuf; guint8 *data; gsize size; /* deserialize base64 to buffer */ data = g_base64_decode (configuration, &size); confbuf = gst_buffer_new (); GST_BUFFER_DATA (confbuf) = data; GST_BUFFER_MALLOCDATA (confbuf) = data; GST_BUFFER_SIZE (confbuf) = size; if (!gst_rtp_vorbis_depay_parse_configuration (rtpvorbisdepay, confbuf)) goto invalid_configuration; } else { GST_WARNING_OBJECT (rtpvorbisdepay, "no configuration specified"); } /* caps seem good, configure element */ depayload->clock_rate = clock_rate; /* set caps on pad and on header */ srccaps = gst_caps_new_simple ("audio/x-vorbis", NULL); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ invalid_configuration: { GST_ERROR_OBJECT (rtpvorbisdepay, "invalid configuration specified"); return FALSE; } no_rate: { GST_ERROR_OBJECT (rtpvorbisdepay, "no clock-rate specified"); return FALSE; } } static gboolean gst_rtp_vorbis_depay_switch_codebook (GstRtpVorbisDepay * rtpvorbisdepay, guint32 ident) { GList *walk; gboolean res = FALSE; GST_DEBUG_OBJECT (rtpvorbisdepay, "Looking up code book ident 0x%08x", ident); for (walk = rtpvorbisdepay->configs; walk; walk = g_list_next (walk)) { GstRtpVorbisConfig *conf = (GstRtpVorbisConfig *) walk->data; if (conf->ident == ident) { GList *headers; /* FIXME, remove pads, create new pad.. */ /* push out all the headers */ for (headers = conf->headers; headers; headers = g_list_next (headers)) { GstBuffer *header = GST_BUFFER_CAST (headers->data); gst_buffer_ref (header); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpvorbisdepay), header); } /* remember the current config */ rtpvorbisdepay->config = conf; res = TRUE; } } if (!res) { /* we don't know about the headers, figure out an alternative method for * getting the codebooks. FIXME, fail for now. */ } return res; } static GstBuffer * gst_rtp_vorbis_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpVorbisDepay *rtpvorbisdepay; GstBuffer *outbuf; GstFlowReturn ret; gint payload_len; guint8 *payload, *to_free = NULL; guint32 timestamp; guint32 header, ident; guint8 F, VDT, packets; rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len); /* we need at least 4 bytes for the packet header */ if (G_UNLIKELY (payload_len < 4)) goto packet_short; payload = gst_rtp_buffer_get_payload (buf); header = GST_READ_UINT32_BE (payload); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | F |VDT|# pkts.| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * F: Fragment type (0=none, 1=start, 2=cont, 3=end) * VDT: Vorbis data type (0=vorbis, 1=config, 2=comment, 3=reserved) * pkts: number of packets. */ VDT = (header & 0x30) >> 4; if (G_UNLIKELY (VDT == 3)) goto ignore_reserved; GST_DEBUG_OBJECT (depayload, "header: 0x%08x", header); ident = (header >> 8) & 0xffffff; F = (header & 0xc0) >> 6; packets = (header & 0xf); if (VDT == 0) { gboolean do_switch = FALSE; /* we have a raw payload, find the codebook for the ident */ if (!rtpvorbisdepay->config) { /* we don't have an active codebook, find the codebook and * activate it */ GST_DEBUG_OBJECT (rtpvorbisdepay, "No active codebook, switching"); do_switch = TRUE; } else if (rtpvorbisdepay->config->ident != ident) { /* codebook changed */ GST_DEBUG_OBJECT (rtpvorbisdepay, "codebook changed, switching"); do_switch = TRUE; } if (do_switch) { if (!gst_rtp_vorbis_depay_switch_codebook (rtpvorbisdepay, ident)) goto switch_failed; } } /* skip header */ payload += 4; payload_len -= 4; GST_DEBUG_OBJECT (depayload, "ident: %u, F: %d, VDT: %d, packets: %d", ident, F, VDT, packets); /* fragmented packets, assemble */ if (F != 0) { GstBuffer *vdata; guint headerskip; if (F == 1) { /* if we start a packet, clear adapter and start assembling. */ gst_adapter_clear (rtpvorbisdepay->adapter); GST_DEBUG_OBJECT (depayload, "start assemble"); rtpvorbisdepay->assembling = TRUE; } if (!rtpvorbisdepay->assembling) goto no_output; /* first assembled packet, reuse 2 bytes to store the length */ headerskip = (F == 1 ? 4 : 6); /* skip header and length. */ vdata = gst_rtp_buffer_get_payload_subbuffer (buf, headerskip, -1); GST_DEBUG_OBJECT (depayload, "assemble vorbis packet"); gst_adapter_push (rtpvorbisdepay->adapter, vdata); /* packet is not complete, we are done */ if (F != 3) goto no_output; /* construct assembled buffer */ payload_len = gst_adapter_available (rtpvorbisdepay->adapter); payload = gst_adapter_take (rtpvorbisdepay->adapter, payload_len); /* fix the length */ payload[0] = ((payload_len - 2) >> 8) & 0xff; payload[1] = (payload_len - 2) & 0xff; to_free = payload; } GST_DEBUG_OBJECT (depayload, "assemble done"); /* we not assembling anymore now */ rtpvorbisdepay->assembling = FALSE; gst_adapter_clear (rtpvorbisdepay->adapter); /* payload now points to a length with that many vorbis data bytes. * Iterate over the packets and send them out. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | length | vorbis data .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. vorbis data | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | length | next vorbis packet data .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. vorbis data | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* */ timestamp = gst_rtp_buffer_get_timestamp (buf); while (payload_len > 2) { guint16 length; length = GST_READ_UINT16_BE (payload); payload += 2; payload_len -= 2; GST_DEBUG_OBJECT (depayload, "read length %u, avail: %d", length, payload_len); /* skip packet if something odd happens */ if (G_UNLIKELY (length > payload_len)) goto length_short; /* handle in-band configuration */ if (G_UNLIKELY (VDT == 1)) { GST_DEBUG_OBJECT (rtpvorbisdepay, "in-band configuration"); if (!gst_rtp_vorbis_depay_parse_inband_configuration (rtpvorbisdepay, ident, payload, payload_len, length)) goto invalid_configuration; goto no_output; } /* create buffer for packet */ if (G_UNLIKELY (to_free)) { outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = payload; GST_BUFFER_MALLOCDATA (outbuf) = to_free; GST_BUFFER_SIZE (outbuf) = length; to_free = NULL; } else { outbuf = gst_buffer_new_and_alloc (length); memcpy (GST_BUFFER_DATA (outbuf), payload, length); } payload += length; payload_len -= length; if (timestamp != -1) /* push with timestamp of the last packet, which is the same timestamp that * should apply to the first assembled packet. */ ret = gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); else ret = gst_base_rtp_depayload_push (depayload, outbuf); if (ret != GST_FLOW_OK) break; /* make sure we don't set a timestamp on next buffers */ timestamp = -1; } g_free (to_free); return NULL; no_output: { return NULL; } /* ERORRS */ switch_failed: { GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, (NULL), ("Could not switch codebooks")); return NULL; } packet_short: { GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, (NULL), ("Packet was too short (%d < 4)", payload_len)); return NULL; } ignore_reserved: { GST_WARNING_OBJECT (rtpvorbisdepay, "reserved VDT ignored"); return NULL; } length_short: { GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, (NULL), ("Packet contains invalid data")); return NULL; } invalid_configuration: { /* fatal, as we otherwise risk carrying on without output */ GST_ELEMENT_ERROR (rtpvorbisdepay, STREAM, DECODE, (NULL), ("Packet contains invalid configuration")); return NULL; } } static GstStateChangeReturn gst_rtp_vorbis_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpVorbisDepay *rtpvorbisdepay; GstStateChangeReturn ret; rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: free_indents (rtpvorbisdepay); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpvorbisdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_VORBIS_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtptheorapay.h0000644000175000017500000000474511671175354017036 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_THEORA_PAY_H__ #define __GST_RTP_THEORA_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_THEORA_PAY \ (gst_rtp_theora_pay_get_type()) #define GST_RTP_THEORA_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_THEORA_PAY,GstRtpTheoraPay)) #define GST_RTP_THEORA_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_THEORA_PAY,GstRtpTheoraPayClass)) #define GST_IS_RTP_THEORA_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_THEORA_PAY)) #define GST_IS_RTP_THEORA_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_THEORA_PAY)) typedef struct _GstRtpTheoraPay GstRtpTheoraPay; typedef struct _GstRtpTheoraPayClass GstRtpTheoraPayClass; struct _GstRtpTheoraPay { GstBaseRTPPayload payload; /* the headers */ gboolean need_headers; GList *headers; /* queues of buffers along with some stats. */ GstBuffer *packet; guint payload_pos; guint payload_left; guint32 payload_ident; guint8 payload_F; guint8 payload_TDT; guint payload_pkts; GstClockTime payload_timestamp; GstClockTime payload_duration; /* config (re-sending) */ guint8 *config_data; guint config_size; guint config_extra_len; guint config_interval; GstClockTime last_config; gint width; gint height; }; struct _GstRtpTheoraPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_theora_pay_get_type (void); gboolean gst_rtp_theora_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_THEORA_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmpapay.h0000644000175000017500000000357011671175354016324 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MPA_PAY_H__ #define __GST_RTP_MPA_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MPA_PAY \ (gst_rtp_mpa_pay_get_type()) #define GST_RTP_MPA_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPA_PAY,GstRtpMPAPay)) #define GST_RTP_MPA_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPA_PAY,GstRtpMPAPayClass)) #define GST_IS_RTP_MPA_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPA_PAY)) #define GST_IS_RTP_MPA_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPA_PAY)) typedef struct _GstRtpMPAPay GstRtpMPAPay; typedef struct _GstRtpMPAPayClass GstRtpMPAPayClass; struct _GstRtpMPAPay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_ts; GstClockTime duration; }; struct _GstRtpMPAPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_mpa_pay_get_type (void); gboolean gst_rtp_mpa_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MPA_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpjpegpay.h0000644000175000017500000000362211671175354016472 00000000000000/* GStreamer * Copyright (C) 2008 Axis Communications * * 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_RTP_JPEG_PAY_H__ #define __GST_RTP_JPEG_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_JPEG_PAY \ (gst_rtp_jpeg_pay_get_type()) #define GST_RTP_JPEG_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_JPEG_PAY,GstRtpJPEGPay)) #define GST_RTP_JPEG_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_JPEG_PAY,GstRtpJPEGPayClass)) #define GST_IS_RTP_JPEG_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JPEG_PAY)) #define GST_IS_RTP_JPEG_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JPEG_PAY)) typedef struct _GstRtpJPEGPay GstRtpJPEGPay; typedef struct _GstRtpJPEGPayClass GstRtpJPEGPayClass; struct _GstRtpJPEGPay { GstBaseRTPPayload payload; guint8 quality; guint8 type; gint height; gint width; gboolean buffer_list; guint8 quant; }; struct _GstRtpJPEGPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_jpeg_pay_get_type (void); gboolean gst_rtp_jpeg_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_JPEG_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpac3depay.h0000644000175000017500000000350311671175354016522 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_AC3_DEPAY_H__ #define __GST_RTP_AC3_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_AC3_DEPAY \ (gst_rtp_ac3_depay_get_type()) #define GST_RTP_AC3_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AC3_DEPAY,GstRtpAC3Depay)) #define GST_RTP_AC3_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AC3_DEPAY,GstRtpAC3DepayClass)) #define GST_IS_RTP_AC3_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AC3_DEPAY)) #define GST_IS_RTP_AC3_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AC3_DEPAY)) typedef struct _GstRtpAC3Depay GstRtpAC3Depay; typedef struct _GstRtpAC3DepayClass GstRtpAC3DepayClass; struct _GstRtpAC3Depay { GstBaseRTPDepayload depayload; }; struct _GstRtpAC3DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_ac3_depay_get_type (void); gboolean gst_rtp_ac3_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_AC3_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtph263pdepay.h0000644000175000017500000000370411671175354016721 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_H263P_DEPAY_H__ #define __GST_RTP_H263P_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_H263P_DEPAY \ (gst_rtp_h263p_depay_get_type()) #define GST_RTP_H263P_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263P_DEPAY,GstRtpH263PDepay)) #define GST_RTP_H263P_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263P_DEPAY,GstRtpH263PDepayClass)) #define GST_IS_RTP_H263P_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263P_DEPAY)) #define GST_IS_RTP_H263P_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263P_DEPAY)) typedef struct _GstRtpH263PDepay GstRtpH263PDepay; typedef struct _GstRtpH263PDepayClass GstRtpH263PDepayClass; struct _GstRtpH263PDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; gboolean wait_start; }; struct _GstRtpH263PDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_h263p_depay_get_type (void); gboolean gst_rtp_h263p_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H263P_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg723depay.h0000644000175000017500000000353511671175354016543 00000000000000/* GStreamer * * Copyright (C) <2010> Wim Taymans * * 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_RTP_G723_DEPAY_H__ #define __GST_RTP_G723_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_G723_DEPAY \ (gst_rtp_g723_depay_get_type()) #define GST_RTP_G723_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G723_DEPAY,GstRtpG723Depay)) #define GST_RTP_G723_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G723_DEPAY,GstRtpG723DepayClass)) #define GST_IS_RTP_G723_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G723_DEPAY)) #define GST_IS_RTP_G723_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G723_DEPAY)) typedef struct _GstRtpG723Depay GstRtpG723Depay; typedef struct _GstRtpG723DepayClass GstRtpG723DepayClass; struct _GstRtpG723Depay { GstBaseRTPDepayload depayload; }; struct _GstRtpG723DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_g723_depay_get_type (void); gboolean gst_rtp_g723_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G723_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpL16pay.c0000644000175000017500000001626711677341656016121 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include #include #include "gstrtpL16pay.h" #include "gstrtpchannels.h" GST_DEBUG_CATEGORY_STATIC (rtpL16pay_debug); #define GST_CAT_DEFAULT (rtpL16pay_debug) static GstStaticPadTemplate gst_rtp_L16_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BIG_ENDIAN, " "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") ); static GstStaticPadTemplate gst_rtp_L16_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) [ 96, 127 ], " "clock-rate = (int) [ 1, MAX ], " "encoding-name = (string) \"L16\", " "channels = (int) [ 1, MAX ];" "application/x-rtp, " "media = (string) \"audio\", " "encoding-name = (string) \"L16\", " "payload = (int) " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " "clock-rate = (int) 44100;" "application/x-rtp, " "media = (string) \"audio\", " "encoding-name = (string) \"L16\", " "payload = (int) " GST_RTP_PAYLOAD_L16_MONO_STRING ", " "clock-rate = (int) 44100") ); static gboolean gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstCaps *gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad); GST_BOILERPLATE (GstRtpL16Pay, gst_rtp_L16_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_L16_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_L16_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_L16_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP audio payloader", "Codec/Payloader/Network/RTP", "Payload-encode Raw audio into RTP packets (RFC 3551)", "Wim Taymans "); } static void gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_L16_pay_setcaps; gstbasertppayload_class->get_caps = gst_rtp_L16_pay_getcaps; GST_DEBUG_CATEGORY_INIT (rtpL16pay_debug, "rtpL16pay", 0, "L16 RTP Payloader"); } static void gst_rtp_L16_pay_init (GstRtpL16Pay * rtpL16pay, GstRtpL16PayClass * klass) { GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpL16pay); /* tell basertpaudiopayload that this is a sample based codec */ gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); } static gboolean gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstRtpL16Pay *rtpL16pay; GstStructure *structure; gint channels, rate; gboolean res; gchar *params; GstAudioChannelPosition *pos; const GstRTPChannelOrder *order; GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basepayload); rtpL16pay = GST_RTP_L16_PAY (basepayload); structure = gst_caps_get_structure (caps, 0); /* first parse input caps */ if (!gst_structure_get_int (structure, "rate", &rate)) goto no_rate; if (!gst_structure_get_int (structure, "channels", &channels)) goto no_channels; /* get the channel order */ pos = gst_audio_get_channel_positions (structure); if (pos) order = gst_rtp_channels_get_by_pos (channels, pos); else order = NULL; gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); params = g_strdup_printf ("%d", channels); if (!order && channels > 2) { GST_ELEMENT_WARNING (rtpL16pay, STREAM, DECODE, (NULL), ("Unknown channel order for %d channels", channels)); } if (order && order->name) { res = gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, channels, "channel-order", G_TYPE_STRING, order->name, NULL); } else { res = gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, channels, NULL); } g_free (params); g_free (pos); rtpL16pay->rate = rate; rtpL16pay->channels = channels; /* octet-per-sample is 2 * channels for L16 */ gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 2 * rtpL16pay->channels); return res; /* ERRORS */ no_rate: { GST_DEBUG_OBJECT (rtpL16pay, "no rate given"); return FALSE; } no_channels: { GST_DEBUG_OBJECT (rtpL16pay, "no channels given"); return FALSE; } } static GstCaps * gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) { GstCaps *otherpadcaps; GstCaps *caps; otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { GstStructure *structure; gint channels; gint pt; gint rate; structure = gst_caps_get_structure (otherpadcaps, 0); if (gst_structure_get_int (structure, "channels", &channels)) { gst_caps_set_simple (caps, "channels", G_TYPE_INT, channels, NULL); } else if (gst_structure_get_int (structure, "payload", &pt)) { if (pt == 10) gst_caps_set_simple (caps, "channels", G_TYPE_INT, 2, NULL); else if (pt == 11) gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); } if (gst_structure_get_int (structure, "clock-rate", &rate)) { gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL); } else if (gst_structure_get_int (structure, "payload", &pt)) { if (pt == 10 || pt == 11) gst_caps_set_simple (caps, "rate", G_TYPE_INT, 44100, NULL); } } gst_caps_unref (otherpadcaps); } return caps; } gboolean gst_rtp_L16_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpL16pay", GST_RANK_SECONDARY, GST_TYPE_RTP_L16_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpspeexdepay.c0000644000175000017500000001466011677341656017207 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 #include #include #include "gstrtpspeexdepay.h" /* RtpSPEEXDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static GstStaticPadTemplate gst_rtp_speex_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [6000, 48000], " "encoding-name = (string) \"SPEEX\", " "encoding-params = (string) \"1\"") ); static GstStaticPadTemplate gst_rtp_speex_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-speex") ); static GstBuffer *gst_rtp_speex_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_speex_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRtpSPEEXDepay, gst_rtp_speex_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_speex_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_speex_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_speex_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP Speex depayloader", "Codec/Depayloader/Network/RTP", "Extracts Speex audio from RTP packets", "Edgard Lima "); } static void gst_rtp_speex_depay_class_init (GstRtpSPEEXDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_speex_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_speex_depay_setcaps; } static void gst_rtp_speex_depay_init (GstRtpSPEEXDepay * rtpspeexdepay, GstRtpSPEEXDepayClass * klass) { } static gint gst_rtp_speex_depay_get_mode (gint rate) { if (rate > 25000) return 2; else if (rate > 12500) return 1; else return 0; } /* len 4 bytes LE, * vendor string (len bytes), * user_len 4 (0) bytes LE */ static const gchar gst_rtp_speex_comment[] = "\045\0\0\0Depayloaded with GStreamer speexdepay\0\0\0\0"; static gboolean gst_rtp_speex_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpSPEEXDepay *rtpspeexdepay; gint clock_rate, nb_channels; GstBuffer *buf; guint8 *data; const gchar *params; GstCaps *srccaps; gboolean res; rtpspeexdepay = GST_RTP_SPEEX_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_clockrate; depayload->clock_rate = clock_rate; if (!(params = gst_structure_get_string (structure, "encoding-params"))) nb_channels = 1; else { nb_channels = atoi (params); } /* construct minimal header and comment packet for the decoder */ buf = gst_buffer_new_and_alloc (80); data = GST_BUFFER_DATA (buf); memcpy (data, "Speex ", 8); data += 8; memcpy (data, "1.1.12", 7); data += 20; GST_WRITE_UINT32_LE (data, 1); /* version */ data += 4; GST_WRITE_UINT32_LE (data, 80); /* header_size */ data += 4; GST_WRITE_UINT32_LE (data, clock_rate); /* rate */ data += 4; GST_WRITE_UINT32_LE (data, gst_rtp_speex_depay_get_mode (clock_rate)); /* mode */ data += 4; GST_WRITE_UINT32_LE (data, 4); /* mode_bitstream_version */ data += 4; GST_WRITE_UINT32_LE (data, nb_channels); /* nb_channels */ data += 4; GST_WRITE_UINT32_LE (data, -1); /* bitrate */ data += 4; GST_WRITE_UINT32_LE (data, 0xa0); /* frame_size */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* VBR */ data += 4; GST_WRITE_UINT32_LE (data, 1); /* frames_per_packet */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* extra_headers */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* reserved1 */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* reserved2 */ srccaps = gst_caps_new_simple ("audio/x-speex", NULL); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay), buf); buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_speex_comment)); memcpy (GST_BUFFER_DATA (buf), gst_rtp_speex_comment, sizeof (gst_rtp_speex_comment)); gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay), buf); return res; /* ERRORS */ no_clockrate: { GST_DEBUG_OBJECT (depayload, "no clock-rate specified"); return FALSE; } } static GstBuffer * gst_rtp_speex_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf = NULL; GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), gst_rtp_buffer_get_marker (buf), gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); /* nothing special to be done */ outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (outbuf) GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; return outbuf; } gboolean gst_rtp_speex_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpspeexdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_SPEEX_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpceltdepay.c0000644000175000017500000002017711677341656017012 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 #include #include #include "gstrtpceltdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpceltdepay_debug); #define GST_CAT_DEFAULT (rtpceltdepay_debug) /* RtpCELTDepay signals and args */ #define DEFAULT_FRAMESIZE 480 #define DEFAULT_CHANNELS 1 #define DEFAULT_CLOCKRATE 32000 enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static GstStaticPadTemplate gst_rtp_celt_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [32000, 48000], " "encoding-name = (string) \"CELT\"") ); static GstStaticPadTemplate gst_rtp_celt_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-celt") ); static GstBuffer *gst_rtp_celt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_celt_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRtpCELTDepay, gst_rtp_celt_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_celt_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_celt_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_celt_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP CELT depayloader", "Codec/Depayloader/Network/RTP", "Extracts CELT audio from RTP packets", "Wim Taymans "); GST_DEBUG_CATEGORY_INIT (rtpceltdepay_debug, "rtpceltdepay", 0, "CELT RTP Depayloader"); } static void gst_rtp_celt_depay_class_init (GstRtpCELTDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_celt_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_celt_depay_setcaps; } static void gst_rtp_celt_depay_init (GstRtpCELTDepay * rtpceltdepay, GstRtpCELTDepayClass * klass) { } /* len 4 bytes LE, * vendor string (len bytes), * user_len 4 (0) bytes LE */ static const gchar gst_rtp_celt_comment[] = "\045\0\0\0Depayloaded with GStreamer celtdepay\0\0\0\0"; static gboolean gst_rtp_celt_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpCELTDepay *rtpceltdepay; gint clock_rate, nb_channels = 0, frame_size = 0; GstBuffer *buf; guint8 *data; const gchar *params; GstCaps *srccaps; gboolean res; rtpceltdepay = GST_RTP_CELT_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_clockrate; depayload->clock_rate = clock_rate; if ((params = gst_structure_get_string (structure, "encoding-params"))) nb_channels = atoi (params); if (!nb_channels) nb_channels = DEFAULT_CHANNELS; if ((params = gst_structure_get_string (structure, "frame-size"))) frame_size = atoi (params); if (!frame_size) frame_size = DEFAULT_FRAMESIZE; rtpceltdepay->frame_size = frame_size; GST_DEBUG_OBJECT (depayload, "clock-rate=%d channels=%d frame-size=%d", clock_rate, nb_channels, frame_size); /* construct minimal header and comment packet for the decoder */ buf = gst_buffer_new_and_alloc (60); data = GST_BUFFER_DATA (buf); memcpy (data, "CELT ", 8); data += 8; memcpy (data, "1.1.12", 7); data += 20; GST_WRITE_UINT32_LE (data, 0x80000006); /* version */ data += 4; GST_WRITE_UINT32_LE (data, 56); /* header_size */ data += 4; GST_WRITE_UINT32_LE (data, clock_rate); /* rate */ data += 4; GST_WRITE_UINT32_LE (data, nb_channels); /* channels */ data += 4; GST_WRITE_UINT32_LE (data, frame_size); /* frame-size */ data += 4; GST_WRITE_UINT32_LE (data, -1); /* overlap */ data += 4; GST_WRITE_UINT32_LE (data, -1); /* bytes_per_packet */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* extra headers */ srccaps = gst_caps_new_simple ("audio/x-celt", NULL); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpceltdepay), buf); buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_celt_comment)); memcpy (GST_BUFFER_DATA (buf), gst_rtp_celt_comment, sizeof (gst_rtp_celt_comment)); gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpceltdepay), buf); return res; /* ERRORS */ no_clockrate: { GST_ERROR_OBJECT (depayload, "no clock-rate specified"); return FALSE; } } static GstBuffer * gst_rtp_celt_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf = NULL; guint8 *payload; guint offset, pos, payload_len, total_size, size; guint8 s; gint clock_rate = 0, frame_size = 0; GstClockTime framesize_ns = 0, timestamp; guint n = 0; GstRtpCELTDepay *rtpceltdepay; rtpceltdepay = GST_RTP_CELT_DEPAY (depayload); clock_rate = depayload->clock_rate; frame_size = rtpceltdepay->frame_size; framesize_ns = gst_util_uint64_scale_int (frame_size, GST_SECOND, clock_rate); timestamp = GST_BUFFER_TIMESTAMP (buf); GST_LOG_OBJECT (depayload, "got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), gst_rtp_buffer_get_marker (buf), gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); GST_LOG_OBJECT (depayload, "got clock-rate=%d, frame_size=%d, " "_ns=%" GST_TIME_FORMAT ", timestamp=%" GST_TIME_FORMAT, clock_rate, frame_size, GST_TIME_ARGS (framesize_ns), GST_TIME_ARGS (timestamp)); payload = gst_rtp_buffer_get_payload (buf); payload_len = gst_rtp_buffer_get_payload_len (buf); /* first count how many bytes are consumed by the size headers and make offset * point to the first data byte */ total_size = 0; offset = 0; while (total_size < payload_len) { do { s = payload[offset++]; total_size += s + 1; } while (s == 0xff); } /* offset is now pointing to the payload */ total_size = 0; pos = 0; while (total_size < payload_len) { n++; size = 0; do { s = payload[pos++]; size += s; total_size += size + 1; } while (s == 0xff); outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, size); offset += size; if (frame_size != -1 && clock_rate != -1) { GST_BUFFER_TIMESTAMP (outbuf) = timestamp + framesize_ns * n; GST_BUFFER_DURATION (outbuf) = framesize_ns; } GST_LOG_OBJECT (depayload, "push timestamp=%" GST_TIME_FORMAT ", duration=%" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); gst_base_rtp_depayload_push (depayload, outbuf); } return NULL; } gboolean gst_rtp_celt_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpceltdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_CELT_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpsv3vdepay.h0000644000175000017500000000374011671175354016760 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_SV3V_DEPAY_H__ #define __GST_RTP_SV3V_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_SV3V_DEPAY \ (gst_rtp_sv3v_depay_get_type()) #define GST_RTP_SV3V_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SV3V_DEPAY,GstRtpSV3VDepay)) #define GST_RTP_SV3V_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SV3V_DEPAY,GstRtpSV3VDepayClass)) #define GST_IS_RTP_SV3V_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SV3V_DEPAY)) #define GST_IS_RTP_SV3V_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SV3V_DEPAY)) typedef struct _GstRtpSV3VDepay GstRtpSV3VDepay; typedef struct _GstRtpSV3VDepayClass GstRtpSV3VDepayClass; struct _GstRtpSV3VDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; gboolean configured; guint16 nextseq; guint width; guint height; }; struct _GstRtpSV3VDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_sv3v_depay_get_type (void); gboolean gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_SV3V_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4adepay.h0000644000175000017500000000361411671175354016720 00000000000000/* GStreamer * Copyright (C) <2007> Nokia Corporation (contact ) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. * * 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_RTP_MP4A_DEPAY_H__ #define __GST_RTP_MP4A_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP4A_DEPAY \ (gst_rtp_mp4a_depay_get_type()) #define GST_RTP_MP4A_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4A_DEPAY,GstRtpMP4ADepay)) #define GST_RTP_MP4A_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4A_DEPAY,GstRtpMP4ADepayClass)) #define GST_IS_RTP_MP4A_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4A_DEPAY)) #define GST_IS_RTP_MP4A_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4A_DEPAY)) typedef struct _GstRtpMP4ADepay GstRtpMP4ADepay; typedef struct _GstRtpMP4ADepayClass GstRtpMP4ADepayClass; struct _GstRtpMP4ADepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; guint8 numSubFrames; guint frame_len; }; struct _GstRtpMP4ADepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mp4a_depay_get_type (void); gboolean gst_rtp_mp4a_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4A_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg726depay.h0000644000175000017500000000335711671175354016550 00000000000000/* GStreamer * Copyright (C) 2005 Edgard Lima * Copyright (C) 2008 Axis Communications AB * * 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 */ #ifndef __GST_RTP_G726_DEPAY_H__ #define __GST_RTP_G726_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpG726Depay GstRtpG726Depay; typedef struct _GstRtpG726DepayClass GstRtpG726DepayClass; #define GST_TYPE_RTP_G726_DEPAY \ (gst_rtp_g726_depay_get_type()) #define GST_RTP_G726_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G726_DEPAY,GstRtpG726Depay)) #define GST_RTP_G726_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G726_DEPAY,GstRtpG726DepayClass)) #define GST_IS_RTP_G726_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G726_DEPAY)) #define GST_IS_RTP_G726_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G726_DEPAY)) struct _GstRtpG726Depay { GstBaseRTPDepayload depayload; gboolean aal2; gboolean force_aal2; gint bitrate; }; struct _GstRtpG726DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_g726_depay_get_type (void); gboolean gst_rtp_g726_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G726_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg726pay.c0000644000175000017500000003152711677341656016240 00000000000000/* GStreamer * Copyright (C) 1999 Erik Walthinsen * Copyright (C) 2005 Edgard Lima * Copyright (C) 2005 Nokia Corporation * Copyright (C) 2007,2008 Axis Communications * * 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 #include #include #include "gstrtpg726pay.h" GST_DEBUG_CATEGORY_STATIC (rtpg726pay_debug); #define GST_CAT_DEFAULT (rtpg726pay_debug) #define DEFAULT_FORCE_AAL2 TRUE enum { PROP_0, PROP_FORCE_AAL2, PROP_LAST }; static GstStaticPadTemplate gst_rtp_g726_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-adpcm, " "channels = (int) 1, " "rate = (int) 8000, " "bitrate = (int) { 16000, 24000, 32000, 40000 }, " "layout = (string) \"g726\"") ); static GstStaticPadTemplate gst_rtp_g726_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) { \"G726-16\", \"G726-24\", \"G726-32\", \"G726-40\", " " \"AAL2-G726-16\", \"AAL2-G726-24\", \"AAL2-G726-32\", \"AAL2-G726-40\" } ") ); static void gst_rtp_g726_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_g726_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static gboolean gst_rtp_g726_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_g726_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpG726Pay, gst_rtp_g726_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_g726_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g726_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g726_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP G.726 payloader", "Codec/Payloader/Network/RTP", "Payload-encodes G.726 audio into a RTP packet", "Axis Communications "); } static void gst_rtp_g726_pay_class_init (GstRtpG726PayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_rtp_g726_pay_set_property; gobject_class->get_property = gst_rtp_g726_pay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FORCE_AAL2, g_param_spec_boolean ("force-aal2", "Force AAL2", "Force AAL2 encoding for compatibility with bad depayloaders", DEFAULT_FORCE_AAL2, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasertppayload_class->set_caps = gst_rtp_g726_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_g726_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpg726pay_debug, "rtpg726pay", 0, "G.726 RTP Payloader"); } static void gst_rtp_g726_pay_init (GstRtpG726Pay * rtpg726pay, GstRtpG726PayClass * klass) { GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpg726pay); GST_BASE_RTP_PAYLOAD (rtpg726pay)->clock_rate = 8000; rtpg726pay->force_aal2 = DEFAULT_FORCE_AAL2; /* sample based codec */ gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); } static gboolean gst_rtp_g726_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gchar *encoding_name; GstStructure *structure; GstBaseRTPAudioPayload *basertpaudiopayload; GstRtpG726Pay *pay; GstCaps *peercaps; gboolean res; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (payload); pay = GST_RTP_G726_PAY (payload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "bitrate", &pay->bitrate)) pay->bitrate = 32000; GST_DEBUG_OBJECT (payload, "using bitrate %d", pay->bitrate); pay->aal2 = FALSE; /* first see what we can do with the bitrate */ switch (pay->bitrate) { case 16000: encoding_name = g_strdup ("G726-16"); gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, 2); break; case 24000: encoding_name = g_strdup ("G726-24"); gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, 3); break; case 32000: encoding_name = g_strdup ("G726-32"); gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, 4); break; case 40000: encoding_name = g_strdup ("G726-40"); gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, 5); break; default: goto invalid_bitrate; } GST_DEBUG_OBJECT (payload, "selected base encoding %s", encoding_name); /* now see if we need to produce AAL2 or not */ peercaps = gst_pad_peer_get_caps (payload->srcpad); if (peercaps) { GstCaps *filter, *intersect; gchar *capsstr; GST_DEBUG_OBJECT (payload, "have peercaps %" GST_PTR_FORMAT, peercaps); capsstr = g_strdup_printf ("application/x-rtp, " "media = (string) \"audio\", " "clock-rate = (int) 8000, " "encoding-name = (string) %s; " "application/x-rtp, " "media = (string) \"audio\", " "clock-rate = (int) 8000, " "encoding-name = (string) AAL2-%s", encoding_name, encoding_name); filter = gst_caps_from_string (capsstr); g_free (capsstr); /* intersect to filter */ intersect = gst_caps_intersect (peercaps, filter); gst_caps_unref (peercaps); GST_DEBUG_OBJECT (payload, "intersected to %" GST_PTR_FORMAT, intersect); if (!intersect) goto no_format; if (gst_caps_is_empty (intersect)) { gst_caps_unref (intersect); goto no_format; } structure = gst_caps_get_structure (intersect, 0); /* now see what encoding name we settled on, we need to dup because the * string goes away when we unref the intersection below. */ encoding_name = g_strdup (gst_structure_get_string (structure, "encoding-name")); /* if we managed to negotiate to AAL2, we definatly are going to do AAL2 * encoding. Else we only encode AAL2 when explicitly set by the * property. */ if (g_str_has_prefix (encoding_name, "AAL2-")) pay->aal2 = TRUE; else pay->aal2 = pay->force_aal2; GST_DEBUG_OBJECT (payload, "final encoding %s, AAL2 %d", encoding_name, pay->aal2); gst_caps_unref (intersect); } else { /* downstream can do anything but we prefer the better supported non-AAL2 */ pay->aal2 = pay->force_aal2; GST_DEBUG_OBJECT (payload, "no peer caps, AAL2 %d", pay->aal2); } gst_basertppayload_set_options (payload, "audio", TRUE, encoding_name, 8000); res = gst_basertppayload_set_outcaps (payload, NULL); g_free (encoding_name); return res; /* ERRORS */ invalid_bitrate: { GST_ERROR_OBJECT (payload, "invalid bitrate %d specified", pay->bitrate); return FALSE; } no_format: { GST_ERROR_OBJECT (payload, "could not negotiate format"); return FALSE; } } static GstFlowReturn gst_rtp_g726_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) { GstFlowReturn res; GstRtpG726Pay *pay; pay = GST_RTP_G726_PAY (payload); if (!pay->aal2) { guint8 *data, tmp; guint len; /* for non AAL2, we need to reshuffle the bytes, we can do this in-place * when the buffer is writable. */ buffer = gst_buffer_make_writable (buffer); data = GST_BUFFER_DATA (buffer); len = GST_BUFFER_SIZE (buffer); GST_LOG_OBJECT (pay, "packing %u bytes of data", len); /* we need to reshuffle the bytes, output is of the form: * A B C D .. with the number of bits depending on the bitrate. */ switch (pay->bitrate) { case 16000: { /* 0 * 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+- * |D D|C C|B B|A A| ... * |0 1|0 1|0 1|0 1| * +-+-+-+-+-+-+-+-+- */ while (len > 0) { tmp = *data; *data++ = ((tmp & 0xc0) >> 6) | ((tmp & 0x30) >> 2) | ((tmp & 0x0c) << 2) | ((tmp & 0x03) << 6); len--; } break; } case 24000: { /* 0 1 2 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * |C C|B B B|A A A|F|E E E|D D D|C|H H H|G G G|F F| ... * |1 2|0 1 2|0 1 2|2|0 1 2|0 1 2|0|0 1 2|0 1 2|0 1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */ while (len > 2) { tmp = *data; *data++ = ((tmp & 0xc0) >> 6) | ((tmp & 0x38) >> 1) | ((tmp & 0x07) << 5); tmp = *data; *data++ = ((tmp & 0x80) >> 7) | ((tmp & 0x70) >> 3) | ((tmp & 0x0e) << 4) | ((tmp & 0x01) << 7); tmp = *data; *data++ = ((tmp & 0xe0) >> 5) | ((tmp & 0x1c) >> 2) | ((tmp & 0x03) << 6); len -= 3; } break; } case 32000: { /* 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * |B B B B|A A A A|D D D D|C C C C| ... * |0 1 2 3|0 1 2 3|0 1 2 3|0 1 2 3| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */ while (len > 0) { tmp = *data; *data++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); len--; } break; } case 40000: { /* 0 1 2 3 4 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * |B B B|A A A A A|D|C C C C C|B B|E E E E|D D D D|G G|F F F F F|E|H H H H H|G G G| * |2 3 4|0 1 2 3 4|4|0 1 2 3 4|0 1|1 2 3 4|0 1 2 3|3 4|0 1 2 3 4|0|0 1 2 3 4|0 1 2| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */ while (len > 4) { tmp = *data; *data++ = ((tmp & 0xe0) >> 5) | ((tmp & 0x1f) << 3); tmp = *data; *data++ = ((tmp & 0x80) >> 7) | ((tmp & 0x7c) >> 2) | ((tmp & 0x03) << 6); tmp = *data; *data++ = ((tmp & 0xf0) >> 4) | ((tmp & 0x0f) << 4); tmp = *data; *data++ = ((tmp & 0xc0) >> 6) | ((tmp & 0x3e) << 2) | ((tmp & 0x01) << 7); tmp = *data; *data++ = ((tmp & 0xf8) >> 3) | ((tmp & 0x07) << 5); len -= 5; } break; } } } res = GST_BASE_RTP_PAYLOAD_CLASS (parent_class)->handle_buffer (payload, buffer); return res; } static void gst_rtp_g726_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpG726Pay *rtpg726pay; rtpg726pay = GST_RTP_G726_PAY (object); switch (prop_id) { case PROP_FORCE_AAL2: rtpg726pay->force_aal2 = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_g726_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpG726Pay *rtpg726pay; rtpg726pay = GST_RTP_G726_PAY (object); switch (prop_id) { case PROP_FORCE_AAL2: g_value_set_boolean (value, rtpg726pay->force_aal2); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_g726_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg726pay", GST_RANK_SECONDARY, GST_TYPE_RTP_G726_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph263ppay.c0000644000175000017500000005746111705527434016412 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include #include #include "gstrtph263ppay.h" #define DEFAULT_FRAGMENTATION_MODE GST_FRAGMENTATION_MODE_NORMAL enum { PROP_0, PROP_FRAGMENTATION_MODE }; #define GST_TYPE_FRAGMENTATION_MODE (gst_fragmentation_mode_get_type()) static GType gst_fragmentation_mode_get_type (void) { static GType fragmentation_mode_type = 0; static const GEnumValue fragmentation_mode[] = { {GST_FRAGMENTATION_MODE_NORMAL, "Normal", "normal"}, {GST_FRAGMENTATION_MODE_SYNC, "Fragment at sync points", "sync"}, {0, NULL, NULL}, }; if (!fragmentation_mode_type) { fragmentation_mode_type = g_enum_register_static ("GstFragmentationMode", fragmentation_mode); } return fragmentation_mode_type; } GST_DEBUG_CATEGORY_STATIC (rtph263ppay_debug); #define GST_CAT_DEFAULT rtph263ppay_debug static GstStaticPadTemplate gst_rtp_h263p_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h263, " "variant = (string) \"itu\"") ); /* * We also return these in getcaps() as required by the SDP caps * * width = (int) [16, 4096] * height = (int) [16, 4096] * "annex-f = (boolean) {true, false}," * "annex-i = (boolean) {true, false}," * "annex-j = (boolean) {true, false}," * "annex-l = (boolean) {true, false}," * "annex-t = (boolean) {true, false}," * "annex-v = (boolean) {true, false}") */ static GstStaticPadTemplate gst_rtp_h263p_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-1998\"; " "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-2000\"") ); static void gst_rtp_h263p_pay_finalize (GObject * object); static void gst_rtp_h263p_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_h263p_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rtp_h263p_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstCaps *gst_rtp_h263p_pay_sink_getcaps (GstBaseRTPPayload * payload, GstPad * pad); static GstFlowReturn gst_rtp_h263p_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpH263PPay, gst_rtp_h263p_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_h263p_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263p_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263p_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP H263 payloader", "Codec/Payloader/Network/RTP", "Payload-encodes H263/+/++ video in RTP packets (RFC 4629)", "Wim Taymans "); } static void gst_rtp_h263p_pay_class_init (GstRtpH263PPayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_h263p_pay_finalize; gobject_class->set_property = gst_rtp_h263p_pay_set_property; gobject_class->get_property = gst_rtp_h263p_pay_get_property; gstbasertppayload_class->set_caps = gst_rtp_h263p_pay_setcaps; gstbasertppayload_class->get_caps = gst_rtp_h263p_pay_sink_getcaps; gstbasertppayload_class->handle_buffer = gst_rtp_h263p_pay_handle_buffer; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FRAGMENTATION_MODE, g_param_spec_enum ("fragmentation-mode", "Fragmentation Mode", "Packet Fragmentation Mode", GST_TYPE_FRAGMENTATION_MODE, DEFAULT_FRAGMENTATION_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (rtph263ppay_debug, "rtph263ppay", 0, "rtph263ppay (RFC 4629)"); } static void gst_rtp_h263p_pay_init (GstRtpH263PPay * rtph263ppay, GstRtpH263PPayClass * klass) { rtph263ppay->adapter = gst_adapter_new (); rtph263ppay->fragmentation_mode = DEFAULT_FRAGMENTATION_MODE; } static void gst_rtp_h263p_pay_finalize (GObject * object) { GstRtpH263PPay *rtph263ppay; rtph263ppay = GST_RTP_H263P_PAY (object); g_object_unref (rtph263ppay->adapter); rtph263ppay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_h263p_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; GstCaps *peercaps; gchar *encoding_name = NULL; g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); peercaps = gst_pad_peer_get_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload)); if (peercaps) { GstCaps *intersect = gst_caps_intersect (peercaps, gst_pad_get_pad_template_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload))); gst_caps_unref (peercaps); if (!gst_caps_is_empty (intersect)) { GstStructure *s = gst_caps_get_structure (intersect, 0); encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name")); } gst_caps_unref (intersect); } if (!encoding_name) encoding_name = g_strdup ("H263-1998"); gst_basertppayload_set_options (payload, "video", TRUE, (gchar *) encoding_name, 90000); res = gst_basertppayload_set_outcaps (payload, NULL); g_free (encoding_name); return res; } static void caps_append (GstCaps * caps, GstStructure * in_s, guint x, guint y, guint mpi) { GstStructure *s; if (!in_s) return; if (mpi < 1 || mpi > 32) return; s = gst_structure_copy (in_s); gst_structure_set (s, "width", GST_TYPE_INT_RANGE, 1, x, "height", GST_TYPE_INT_RANGE, 1, y, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 1001 * mpi, NULL); gst_caps_merge_structure (caps, s); } static GstCaps * gst_rtp_h263p_pay_sink_getcaps (GstBaseRTPPayload * payload, GstPad * pad) { GstRtpH263PPay *rtph263ppay; GstCaps *caps = NULL; GstCaps *peercaps = NULL; GstCaps *intersect = NULL; guint i; rtph263ppay = GST_RTP_H263P_PAY (payload); peercaps = gst_pad_peer_get_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload)); if (!peercaps) return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_RTP_PAYLOAD_SINKPAD (payload))); intersect = gst_caps_intersect (peercaps, gst_pad_get_pad_template_caps (GST_BASE_RTP_PAYLOAD_SRCPAD (payload))); gst_caps_unref (peercaps); if (gst_caps_is_empty (intersect)) return intersect; caps = gst_caps_new_empty (); for (i = 0; i < gst_caps_get_size (intersect); i++) { GstStructure *s = gst_caps_get_structure (intersect, i); const gchar *encoding_name = gst_structure_get_string (s, "encoding-name"); if (!strcmp (encoding_name, "H263-2000")) { const gchar *profile_str = gst_structure_get_string (s, "profile"); const gchar *level_str = gst_structure_get_string (s, "level"); int profile = 0; int level = 0; if (profile_str && level_str) { gboolean i = FALSE, j = FALSE, l = FALSE, t = FALSE, f = FALSE, v = FALSE; GstStructure *new_s = gst_structure_new ("video/x-h263", "variant", G_TYPE_STRING, "itu", NULL); profile = atoi (profile_str); level = atoi (level_str); /* These profiles are defined in the H.263 Annex X */ switch (profile) { case 0: /* The Baseline Profile (Profile 0) */ break; case 1: /* H.320 Coding Efficiency Version 2 Backward-Compatibility Profile * (Profile 1) * Baseline + Annexes I, J, L.4 and T */ i = j = l = t = TRUE; break; case 2: /* Version 1 Backward-Compatibility Profile (Profile 2) * Baseline + Annex F */ i = j = l = t = f = TRUE; break; case 3: /* Version 2 Interactive and Streaming Wireless Profile * Baseline + Annexes I, J, T */ i = j = t = TRUE; break; case 4: /* Version 3 Interactive and Streaming Wireless Profile (Profile 4) * Baseline + Annexes I, J, T, V, W.6.3.8, */ /* Missing W.6.3.8 */ i = j = t = v = TRUE; break; case 5: /* Conversational High Compression Profile (Profile 5) * Baseline + Annexes F, I, J, L.4, T, D, U */ /* Missing D, U */ f = i = j = l = t = TRUE; break; case 6: /* Conversational Internet Profile (Profile 6) * Baseline + Annexes F, I, J, L.4, T, D, U and * K with arbitratry slice ordering */ /* Missing D, U, K with arbitratry slice ordering */ f = i = j = l = t = TRUE; break; case 7: /* Conversational Interlace Profile (Profile 7) * Baseline + Annexes F, I, J, L.4, T, D, U, W.6.3.11 */ /* Missing D, U, W.6.3.11 */ f = i = j = l = t = TRUE; break; case 8: /* High Latency Profile (Profile 8) * Baseline + Annexes F, I, J, L.4, T, D, U, P.5, O.1.1 and * K with arbitratry slice ordering */ /* Missing D, U, P.5, O.1.1 */ f = i = j = l = t = TRUE; break; } if (f || i || j || t || l || v) { GValue list = { 0 }; GValue vstr = { 0 }; g_value_init (&list, GST_TYPE_LIST); g_value_init (&vstr, G_TYPE_STRING); g_value_set_static_string (&vstr, "h263"); gst_value_list_append_value (&list, &vstr); g_value_set_static_string (&vstr, "h263p"); gst_value_list_append_value (&list, &vstr); if (l || v) { g_value_set_static_string (&vstr, "h263pp"); gst_value_list_append_value (&list, &vstr); } g_value_unset (&vstr); gst_structure_set_value (new_s, "h263version", &list); g_value_unset (&list); } else { gst_structure_set (new_s, "h263version", G_TYPE_STRING, "h263", NULL); } if (!f) gst_structure_set (new_s, "annex-f", G_TYPE_BOOLEAN, FALSE, NULL); if (!i) gst_structure_set (new_s, "annex-i", G_TYPE_BOOLEAN, FALSE, NULL); if (!j) gst_structure_set (new_s, "annex-j", G_TYPE_BOOLEAN, FALSE, NULL); if (!t) gst_structure_set (new_s, "annex-t", G_TYPE_BOOLEAN, FALSE, NULL); if (!l) gst_structure_set (new_s, "annex-l", G_TYPE_BOOLEAN, FALSE, NULL); if (!v) gst_structure_set (new_s, "annex-v", G_TYPE_BOOLEAN, FALSE, NULL); if (level <= 10 || level == 45) { gst_structure_set (new_s, "width", GST_TYPE_INT_RANGE, 1, 176, "height", GST_TYPE_INT_RANGE, 1, 144, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 2002, NULL); gst_caps_merge_structure (caps, new_s); } else if (level <= 20) { GstStructure *s_copy = gst_structure_copy (new_s); gst_structure_set (new_s, "width", GST_TYPE_INT_RANGE, 1, 352, "height", GST_TYPE_INT_RANGE, 1, 288, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 2002, NULL); gst_caps_merge_structure (caps, new_s); gst_structure_set (s_copy, "width", GST_TYPE_INT_RANGE, 1, 176, "height", GST_TYPE_INT_RANGE, 1, 144, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 1001, NULL); gst_caps_merge_structure (caps, s_copy); } else if (level <= 40) { gst_structure_set (new_s, "width", GST_TYPE_INT_RANGE, 1, 352, "height", GST_TYPE_INT_RANGE, 1, 288, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30000, 1001, NULL); gst_caps_merge_structure (caps, new_s); } else if (level <= 50) { GstStructure *s_copy = gst_structure_copy (new_s); gst_structure_set (new_s, "width", GST_TYPE_INT_RANGE, 1, 352, "height", GST_TYPE_INT_RANGE, 1, 288, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 50, 1, NULL); gst_caps_merge_structure (caps, new_s); gst_structure_set (s_copy, "width", GST_TYPE_INT_RANGE, 1, 352, "height", GST_TYPE_INT_RANGE, 1, 240, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 60000, 1001, NULL); gst_caps_merge_structure (caps, s_copy); } else if (level <= 60) { GstStructure *s_copy = gst_structure_copy (new_s); gst_structure_set (new_s, "width", GST_TYPE_INT_RANGE, 1, 720, "height", GST_TYPE_INT_RANGE, 1, 288, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 50, 1, NULL); gst_caps_merge_structure (caps, new_s); gst_structure_set (s_copy, "width", GST_TYPE_INT_RANGE, 1, 720, "height", GST_TYPE_INT_RANGE, 1, 240, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 60000, 1001, NULL); gst_caps_merge_structure (caps, s_copy); } else if (level <= 70) { GstStructure *s_copy = gst_structure_copy (new_s); gst_structure_set (new_s, "width", GST_TYPE_INT_RANGE, 1, 720, "height", GST_TYPE_INT_RANGE, 1, 576, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 50, 1, NULL); gst_caps_merge_structure (caps, new_s); gst_structure_set (s_copy, "width", GST_TYPE_INT_RANGE, 1, 720, "height", GST_TYPE_INT_RANGE, 1, 480, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 60000, 1001, NULL); gst_caps_merge_structure (caps, s_copy); } else { gst_caps_merge_structure (caps, new_s); } } else { GstStructure *new_s = gst_structure_new ("video/x-h263", "variant", G_TYPE_STRING, "itu", "h263version", G_TYPE_STRING, "h263", NULL); GST_DEBUG_OBJECT (rtph263ppay, "No profile or level specified" " for H263-2000, defaulting to baseline H263"); gst_caps_merge_structure (caps, new_s); } } else { gboolean f = FALSE, i = FALSE, j = FALSE, t = FALSE; /* FIXME: ffmpeg support the Appendix K too, how do we express it ? * guint k; */ const gchar *str; GstStructure *new_s = gst_structure_new ("video/x-h263", "variant", G_TYPE_STRING, "itu", NULL); gboolean added = FALSE; str = gst_structure_get_string (s, "f"); if (str && !strcmp (str, "1")) f = TRUE; str = gst_structure_get_string (s, "i"); if (str && !strcmp (str, "1")) i = TRUE; str = gst_structure_get_string (s, "j"); if (str && !strcmp (str, "1")) j = TRUE; str = gst_structure_get_string (s, "t"); if (str && !strcmp (str, "1")) t = TRUE; if (f || i || j || t) { GValue list = { 0 }; GValue vstr = { 0 }; g_value_init (&list, GST_TYPE_LIST); g_value_init (&vstr, G_TYPE_STRING); g_value_set_static_string (&vstr, "h263"); gst_value_list_append_value (&list, &vstr); g_value_set_static_string (&vstr, "h263p"); gst_value_list_append_value (&list, &vstr); g_value_unset (&vstr); gst_structure_set_value (new_s, "h263version", &list); g_value_unset (&list); } else { gst_structure_set (new_s, "h263version", G_TYPE_STRING, "h263", NULL); } if (!f) gst_structure_set (new_s, "annex-f", G_TYPE_BOOLEAN, FALSE, NULL); if (!i) gst_structure_set (new_s, "annex-i", G_TYPE_BOOLEAN, FALSE, NULL); if (!j) gst_structure_set (new_s, "annex-j", G_TYPE_BOOLEAN, FALSE, NULL); if (!t) gst_structure_set (new_s, "annex-t", G_TYPE_BOOLEAN, FALSE, NULL); str = gst_structure_get_string (s, "custom"); if (str) { unsigned int xmax, ymax, mpi; if (sscanf (str, "%u,%u,%u", &xmax, &ymax, &mpi) == 3) { if (xmax % 4 && ymax % 4 && mpi >= 1 && mpi <= 32) { caps_append (caps, new_s, xmax, ymax, mpi); added = TRUE; } else { GST_WARNING_OBJECT (rtph263ppay, "Invalid custom framesize/MPI" " %u x %u at %u, ignoring", xmax, ymax, mpi); } } else { GST_WARNING_OBJECT (rtph263ppay, "Invalid custom framesize/MPI: %s," " ignoring", str); } } str = gst_structure_get_string (s, "16cif"); if (str) { int mpi = atoi (str); caps_append (caps, new_s, 1408, 1152, mpi); added = TRUE; } str = gst_structure_get_string (s, "4cif"); if (str) { int mpi = atoi (str); caps_append (caps, new_s, 704, 576, mpi); added = TRUE; } str = gst_structure_get_string (s, "cif"); if (str) { int mpi = atoi (str); caps_append (caps, new_s, 352, 288, mpi); added = TRUE; } str = gst_structure_get_string (s, "qcif"); if (str) { int mpi = atoi (str); caps_append (caps, new_s, 176, 144, mpi); added = TRUE; } str = gst_structure_get_string (s, "sqcif"); if (str) { int mpi = atoi (str); caps_append (caps, new_s, 128, 96, mpi); added = TRUE; } if (added) gst_structure_free (new_s); else gst_caps_merge_structure (caps, new_s); } } gst_caps_unref (intersect); return caps; } static void gst_rtp_h263p_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpH263PPay *rtph263ppay; rtph263ppay = GST_RTP_H263P_PAY (object); switch (prop_id) { case PROP_FRAGMENTATION_MODE: rtph263ppay->fragmentation_mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_h263p_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpH263PPay *rtph263ppay; rtph263ppay = GST_RTP_H263P_PAY (object); switch (prop_id) { case PROP_FRAGMENTATION_MODE: g_value_set_enum (value, rtph263ppay->fragmentation_mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstFlowReturn gst_rtp_h263p_pay_flush (GstRtpH263PPay * rtph263ppay) { guint avail; GstBuffer *outbuf; GstFlowReturn ret; gboolean fragmented; avail = gst_adapter_available (rtph263ppay->adapter); if (avail == 0) return GST_FLOW_OK; fragmented = FALSE; /* This algorithm assumes the H263/+/++ encoder sends complete frames in each * buffer */ /* With Fragmentation Mode at GST_FRAGMENTATION_MODE_NORMAL: * This algorithm implements the Follow-on packets method for packetization. * This assumes low packet loss network. * With Fragmentation Mode at GST_FRAGMENTATION_MODE_SYNC: * This algorithm separates large frames at synchronisation points (Segments) * (See RFC 4629 section 6). It would be interesting to have a property such as network * quality to select between both packetization methods */ /* TODO Add VRC supprt (See RFC 4629 section 5.2) */ while (avail > 0) { guint towrite; guint8 *payload; guint payload_len; gint header_len; guint next_gop = 0; gboolean found_gob = FALSE; if (rtph263ppay->fragmentation_mode == GST_FRAGMENTATION_MODE_SYNC) { /* start after 1st gop possible */ guint parsed_len = 3; const guint8 *parse_data = NULL; parse_data = gst_adapter_peek (rtph263ppay->adapter, avail); /* Check if we have a gob or eos , eossbs */ /* FIXME EOS and EOSSBS packets should never contain any gobs and vice-versa */ if (avail >= 3 && *parse_data == 0 && *(parse_data + 1) == 0 && *(parse_data + 2) >= 0x80) { GST_DEBUG_OBJECT (rtph263ppay, " Found GOB header"); found_gob = TRUE; } /* Find next and cut the packet accordingly */ /* TODO we should get as many gobs as possible until MTU is reached, this * code seems to just get one GOB per packet */ while (parsed_len + 2 < avail) { if (parse_data[parsed_len] == 0 && parse_data[parsed_len + 1] == 0 && parse_data[parsed_len + 2] >= 0x80) { next_gop = parsed_len; GST_DEBUG_OBJECT (rtph263ppay, " Next GOB Detected at : %d", next_gop); break; } parsed_len++; } } /* for picture start frames (non-fragmented), we need to remove the first * two 0x00 bytes and set P=1 */ header_len = (fragmented && !found_gob) ? 2 : 0; towrite = MIN (avail, gst_rtp_buffer_calc_payload_len (GST_BASE_RTP_PAYLOAD_MTU (rtph263ppay) - header_len, 0, 0)); if (next_gop > 0) towrite = MIN (next_gop, towrite); payload_len = header_len + towrite; outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* last fragment gets the marker bit set */ gst_rtp_buffer_set_marker (outbuf, avail > towrite ? 0 : 1); payload = gst_rtp_buffer_get_payload (outbuf); gst_adapter_copy (rtph263ppay->adapter, &payload[header_len], 0, towrite); /* 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | RR |P|V| PLEN |PEBIT| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ /* if fragmented or gop header , write p bit =1 */ payload[0] = (fragmented && !found_gob) ? 0x00 : 0x04; payload[1] = 0; GST_BUFFER_TIMESTAMP (outbuf) = rtph263ppay->first_timestamp; GST_BUFFER_DURATION (outbuf) = rtph263ppay->first_duration; gst_adapter_flush (rtph263ppay->adapter, towrite); ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtph263ppay), outbuf); avail -= towrite; fragmented = TRUE; } return ret; } static GstFlowReturn gst_rtp_h263p_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) { GstRtpH263PPay *rtph263ppay; GstFlowReturn ret; rtph263ppay = GST_RTP_H263P_PAY (payload); rtph263ppay->first_timestamp = GST_BUFFER_TIMESTAMP (buffer); rtph263ppay->first_duration = GST_BUFFER_DURATION (buffer); /* we always encode and flush a full picture */ gst_adapter_push (rtph263ppay->adapter, buffer); ret = gst_rtp_h263p_pay_flush (rtph263ppay); return ret; } gboolean gst_rtp_h263p_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtph263ppay", GST_RANK_SECONDARY, GST_TYPE_RTP_H263P_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph263depay.c0000644000175000017500000002753411677341656016551 00000000000000/* GStreamer * * Copyright 2007 Nokia Corporation * Copyright 2007 Collabora Ltd, * @author: Philippe Kalaf * * Copyright (C) <2005> Wim Taymans * <2007> Edward Hervey * * 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 #include #include "gstrtph263depay.h" GST_DEBUG_CATEGORY_STATIC (rtph263depay_debug); #define GST_CAT_DEFAULT (rtph263depay_debug) #define GST_RFC2190A_HEADER_LEN 4 #define GST_RFC2190B_HEADER_LEN 8 #define GST_RFC2190C_HEADER_LEN 12 static GstStaticPadTemplate gst_rtp_h263_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h263, " "variant = (string) \"itu\", " "h263version = (string) \"h263\"") ); static GstStaticPadTemplate gst_rtp_h263_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_H263_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"; " "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"") ); GST_BOILERPLATE (GstRtpH263Depay, gst_rtp_h263_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_h263_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_h263_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_h263_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); gboolean gst_rtp_h263_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static void gst_rtp_h263_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP H263 depayloader", "Codec/Depayloader/Network/RTP", "Extracts H263 video from RTP packets (RFC 2190)", "Philippe Kalaf , " "Edward Hervey "); } static void gst_rtp_h263_depay_class_init (GstRtpH263DepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_h263_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_h263_depay_setcaps; gobject_class->finalize = gst_rtp_h263_depay_finalize; gstelement_class->change_state = gst_rtp_h263_depay_change_state; GST_DEBUG_CATEGORY_INIT (rtph263depay_debug, "rtph263depay", 0, "H263 Video RTP Depayloader"); } static void gst_rtp_h263_depay_init (GstRtpH263Depay * rtph263depay, GstRtpH263DepayClass * klass) { rtph263depay->adapter = gst_adapter_new (); rtph263depay->offset = 0; rtph263depay->leftover = 0; } static void gst_rtp_h263_depay_finalize (GObject * object) { GstRtpH263Depay *rtph263depay; rtph263depay = GST_RTP_H263_DEPAY (object); g_object_unref (rtph263depay->adapter); rtph263depay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } gboolean gst_rtp_h263_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) { GstCaps *srccaps; GstStructure *structure = gst_caps_get_structure (caps, 0); gint clock_rate; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ filter->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/x-h263", "variant", G_TYPE_STRING, "itu", "h263version", G_TYPE_STRING, "h263", NULL); gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); gst_caps_unref (srccaps); return TRUE; } static GstBuffer * gst_rtp_h263_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpH263Depay *rtph263depay; GstBuffer *outbuf; gint payload_len; guint8 *payload; guint header_len; guint SBIT, EBIT; gboolean F, P, M; gboolean I; rtph263depay = GST_RTP_H263_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { GST_LOG_OBJECT (depayload, "Discont buffer, flushing adapter"); gst_adapter_clear (rtph263depay->adapter); rtph263depay->offset = 0; rtph263depay->leftover = 0; rtph263depay->start = FALSE; } payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); M = gst_rtp_buffer_get_marker (buf); /* Let's see what mode we are using */ F = (payload[0] & 0x80) == 0x80; P = (payload[0] & 0x40) == 0x40; /* Bit shifting */ SBIT = (payload[0] & 0x38) >> 3; EBIT = (payload[0] & 0x07); /* Figure out header length and I-flag */ if (F == 0) { /* F == 0 and P == 0 or 1 * mode A */ header_len = GST_RFC2190A_HEADER_LEN; GST_LOG ("Mode A"); /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |F|P|SBIT |EBIT | SRC |I|U|S|A|R |DBQ| TRB | TR | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ I = (payload[1] & 0x10) == 0x10; } else { if (P == 0) { /* F == 1 and P == 0 * mode B */ header_len = GST_RFC2190B_HEADER_LEN; GST_LOG ("Mode B"); /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |F|P|SBIT |EBIT | SRC | QUANT | GOBN | MBA |R | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |I|U|S|A| HMV1 | VMV1 | HMV2 | VMV2 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ I = (payload[4] & 0x80) == 0x80; } else { /* F == 1 and P == 1 * mode C */ header_len = GST_RFC2190C_HEADER_LEN; GST_LOG ("Mode C"); /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |F|P|SBIT |EBIT | SRC | QUANT | GOBN | MBA |R | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |I|U|S|A| HMV1 | VMV1 | HMV2 | VMV2 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | RR |DBQ| TRB | TR | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ I = (payload[4] & 0x80) == 0x80; } } GST_LOG ("F/P/M/I : %d/%d/%d/%d", F, P, M, I); GST_LOG ("SBIT : %d , EBIT : %d", SBIT, EBIT); GST_LOG ("payload_len : %d, header_len : %d , leftover : 0x%x", payload_len, header_len, rtph263depay->leftover); /* skip header */ payload += header_len; payload_len -= header_len; if (!rtph263depay->start) { /* do not skip this fragment if it is a Mode A with picture start code */ if (!F && payload_len > 4 && (GST_READ_UINT32_BE (payload) >> 10 == 0x20)) { GST_DEBUG ("Mode A with PSC => frame start"); rtph263depay->start = TRUE; if (!!(payload[4] & 0x02) != I) { GST_DEBUG ("Wrong Picture Coding Type Flag in rtp header"); I = !I; } rtph263depay->psc_I = I; } else { GST_DEBUG ("no frame start yet, skipping payload"); goto skip; } } /* only trust I info from Mode A starting packet * from buggy payloaders or hw */ I = rtph263depay->psc_I; if (SBIT) { /* take the leftover and merge it at the beginning, FIXME make the buffer * data writable. */ GST_LOG ("payload[0] : 0x%x", payload[0]); payload[0] &= 0xFF >> SBIT; GST_LOG ("payload[0] : 0x%x", payload[0]); payload[0] |= rtph263depay->leftover; GST_LOG ("payload[0] : 0x%x", payload[0]); rtph263depay->leftover = 0; rtph263depay->offset = 0; } if (!EBIT) { GstBuffer *tmp; /* Take the entire buffer */ tmp = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, payload_len); gst_adapter_push (rtph263depay->adapter, tmp); } else { GstBuffer *tmp; /* Take the entire buffer except for the last byte */ tmp = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, payload_len - 1); gst_adapter_push (rtph263depay->adapter, tmp); /* Put the last byte into the leftover */ GST_DEBUG ("payload[payload_len - 1] : 0x%x", payload[payload_len - 1]); GST_DEBUG ("mask : 0x%x", 0xFF << EBIT); rtph263depay->leftover = (payload[payload_len - 1] >> EBIT) << EBIT; rtph263depay->offset = 1; GST_DEBUG ("leftover : 0x%x", rtph263depay->leftover); } skip: if (M) { if (rtph263depay->start) { /* frame is completed */ guint avail; guint32 timestamp; if (rtph263depay->offset) { /* push in the leftover */ GstBuffer *buf = gst_buffer_new_and_alloc (1); GST_DEBUG ("Pushing leftover in adapter"); GST_BUFFER_DATA (buf)[0] = rtph263depay->leftover; gst_adapter_push (rtph263depay->adapter, buf); } avail = gst_adapter_available (rtph263depay->adapter); outbuf = gst_adapter_take_buffer (rtph263depay->adapter, avail); if (I) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); GST_DEBUG ("Pushing out a buffer of %d bytes", avail); timestamp = gst_rtp_buffer_get_timestamp (buf); gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); rtph263depay->offset = 0; rtph263depay->leftover = 0; rtph263depay->start = FALSE; } else { rtph263depay->start = TRUE; } } return NULL; } static GstStateChangeReturn gst_rtp_h263_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpH263Depay *rtph263depay; GstStateChangeReturn ret; rtph263depay = GST_RTP_H263_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtph263depay->adapter); rtph263depay->start = TRUE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_h263_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtph263depay", GST_RANK_SECONDARY, GST_TYPE_RTP_H263_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpdepay.h0000644000175000017500000000343311671175354016135 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_DEPAY_H__ #define __GST_RTP_DEPAY_H__ #include G_BEGIN_DECLS #define GST_TYPE_RTP_DEPAY (gst_rtp_depay_get_type()) #define GST_IS_RTP_DEPAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DEPAY)) #define GST_IS_RTP_DEPAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DEPAY)) #define GST_RTP_DEPAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DEPAY, GstRTPDepay)) #define GST_RTP_DEPAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DEPAY, GstRTPDepayClass)) typedef struct _GstRTPDepay GstRTPDepay; typedef struct _GstRTPDepayClass GstRTPDepayClass; struct _GstRTPDepay { GstElement element; GstPad *sink_rtp; GstPad *sink_rtcp; GstPad *src_rtp; GstPad *src_rtcp; }; struct _GstRTPDepayClass { GstElementClass parent_class; }; gboolean gst_rtp_depay_plugin_init (GstPlugin * plugin); GType gst_rtp_depay_get_type(void); G_END_DECLS #endif /* __GST_RTP_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpgsmdepay.h0000644000175000017500000000350411671175354016643 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_RTP_GSM_DEPAY_H__ #define __GST_RTP_GSM_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTPGSMDepay GstRTPGSMDepay; typedef struct _GstRTPGSMDepayClass GstRTPGSMDepayClass; #define GST_TYPE_RTP_GSM_DEPAY \ (gst_rtp_gsm_depay_get_type()) #define GST_RTP_GSM_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_DEPAY,GstRTPGSMDepay)) #define GST_RTP_GSM_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_DEPAY,GstRTPGSMDepayClass)) #define GST_IS_RTP_GSM_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_DEPAY)) #define GST_IS_RTP_GSM_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_DEPAY)) struct _GstRTPGSMDepay { GstBaseRTPDepayload _depayload; }; struct _GstRTPGSMDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_gsm_depay_get_type (void); gboolean gst_rtp_gsm_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_GSM_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpj2kdepay.c0000644000175000017500000004574211677341656016556 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 #include #include "gstrtpj2kdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpj2kdepay_debug); #define GST_CAT_DEFAULT (rtpj2kdepay_debug) static GstStaticPadTemplate gst_rtp_j2k_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/x-jpc") ); static GstStaticPadTemplate gst_rtp_j2k_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"JPEG2000\"") ); typedef enum { J2K_MARKER = 0xFF, J2K_MARKER_SOC = 0x4F, J2K_MARKER_SOT = 0x90, J2K_MARKER_SOP = 0x91, J2K_MARKER_SOD = 0x93, J2K_MARKER_EOC = 0xD9 } RtpJ2KMarker; #define DEFAULT_BUFFER_LIST TRUE enum { PROP_0, PROP_BUFFER_LIST, PROP_LAST }; GST_BOILERPLATE (GstRtpJ2KDepay, gst_rtp_j2k_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_j2k_depay_finalize (GObject * object); static void gst_rtp_j2k_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_j2k_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_j2k_depay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_j2k_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_j2k_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_j2k_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_j2k_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_j2k_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP JPEG 2000 depayloader", "Codec/Depayloader/Network/RTP", "Extracts JPEG 2000 video from RTP packets (RFC 5371)", "Wim Taymans "); } static void gst_rtp_j2k_depay_class_init (GstRtpJ2KDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_j2k_depay_finalize; gobject_class->set_property = gst_rtp_j2k_depay_set_property; gobject_class->get_property = gst_rtp_j2k_depay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, g_param_spec_boolean ("buffer-list", "Buffer List", "Use Buffer Lists", DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = gst_rtp_j2k_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_j2k_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_j2k_depay_process; GST_DEBUG_CATEGORY_INIT (rtpj2kdepay_debug, "rtpj2kdepay", 0, "J2K Video RTP Depayloader"); } static void gst_rtp_j2k_depay_init (GstRtpJ2KDepay * rtpj2kdepay, GstRtpJ2KDepayClass * klass) { rtpj2kdepay->buffer_list = DEFAULT_BUFFER_LIST; rtpj2kdepay->pu_adapter = gst_adapter_new (); rtpj2kdepay->t_adapter = gst_adapter_new (); rtpj2kdepay->f_adapter = gst_adapter_new (); } static void store_mheader (GstRtpJ2KDepay * rtpj2kdepay, guint idx, GstBuffer * buf) { GstBuffer *old; GST_DEBUG_OBJECT (rtpj2kdepay, "storing main header %p at index %u", buf, idx); if ((old = rtpj2kdepay->MH[idx])) gst_buffer_unref (old); rtpj2kdepay->MH[idx] = buf; } static void clear_mheaders (GstRtpJ2KDepay * rtpj2kdepay) { guint i; for (i = 0; i < 8; i++) store_mheader (rtpj2kdepay, i, NULL); } static void gst_rtp_j2k_depay_reset (GstRtpJ2KDepay * rtpj2kdepay) { clear_mheaders (rtpj2kdepay); gst_adapter_clear (rtpj2kdepay->pu_adapter); gst_adapter_clear (rtpj2kdepay->t_adapter); gst_adapter_clear (rtpj2kdepay->f_adapter); rtpj2kdepay->next_frag = 0; } static void gst_rtp_j2k_depay_finalize (GObject * object) { GstRtpJ2KDepay *rtpj2kdepay; rtpj2kdepay = GST_RTP_J2K_DEPAY (object); clear_mheaders (rtpj2kdepay); g_object_unref (rtpj2kdepay->pu_adapter); g_object_unref (rtpj2kdepay->t_adapter); g_object_unref (rtpj2kdepay->f_adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_j2k_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; gint clock_rate; GstCaps *outcaps; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; outcaps = gst_caps_new_simple ("image/x-jpc", "framerate", GST_TYPE_FRACTION, 0, 1, "fields", G_TYPE_INT, 1, "fourcc", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('s', 'Y', 'U', 'V'), NULL); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); return res; } static void gst_rtp_j2k_depay_clear_pu (GstRtpJ2KDepay * rtpj2kdepay) { gst_adapter_clear (rtpj2kdepay->pu_adapter); rtpj2kdepay->have_sync = FALSE; } static GstFlowReturn gst_rtp_j2k_depay_flush_pu (GstBaseRTPDepayload * depayload) { GstRtpJ2KDepay *rtpj2kdepay; GstBuffer *mheader; guint avail, MHF, mh_id; rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); /* take all available buffers */ avail = gst_adapter_available (rtpj2kdepay->pu_adapter); if (avail == 0) goto done; MHF = rtpj2kdepay->pu_MHF; mh_id = rtpj2kdepay->last_mh_id; GST_DEBUG_OBJECT (rtpj2kdepay, "flushing PU of size %u", avail); if (MHF == 0) { GList *packets, *walk; packets = gst_adapter_take_list (rtpj2kdepay->pu_adapter, avail); /* append packets */ for (walk = packets; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); GST_DEBUG_OBJECT (rtpj2kdepay, "append pu packet of size %u", GST_BUFFER_SIZE (buf)); gst_adapter_push (rtpj2kdepay->t_adapter, buf); } g_list_free (packets); } else { /* we have a header */ GST_DEBUG_OBJECT (rtpj2kdepay, "keeping header %u", mh_id); /* we managed to see the start and end of the header, take all from * adapter and keep in header */ mheader = gst_adapter_take_buffer (rtpj2kdepay->pu_adapter, avail); store_mheader (rtpj2kdepay, mh_id, mheader); } done: rtpj2kdepay->have_sync = FALSE; return GST_FLOW_OK; } static GstFlowReturn gst_rtp_j2k_depay_flush_tile (GstBaseRTPDepayload * depayload) { GstRtpJ2KDepay *rtpj2kdepay; guint avail, mh_id; GList *packets, *walk; guint8 end[2]; GstFlowReturn ret = GST_FLOW_OK; rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); /* flush pending PU */ gst_rtp_j2k_depay_flush_pu (depayload); /* take all available buffers */ avail = gst_adapter_available (rtpj2kdepay->t_adapter); if (avail == 0) goto done; mh_id = rtpj2kdepay->last_mh_id; GST_DEBUG_OBJECT (rtpj2kdepay, "flushing tile of size %u", avail); if (gst_adapter_available (rtpj2kdepay->f_adapter) == 0) { GstBuffer *mheader; /* we need a header now */ if ((mheader = rtpj2kdepay->MH[mh_id]) == NULL) goto waiting_header; /* push header in the adapter */ GST_DEBUG_OBJECT (rtpj2kdepay, "pushing header %u", mh_id); gst_adapter_push (rtpj2kdepay->f_adapter, gst_buffer_ref (mheader)); } /* check for last bytes */ gst_adapter_copy (rtpj2kdepay->t_adapter, end, avail - 2, 2); /* now append the tile packets to the frame */ packets = gst_adapter_take_list (rtpj2kdepay->t_adapter, avail); for (walk = packets; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); if (walk == packets) { guint8 *data; guint size; /* first buffer should contain the SOT */ data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); if (size < 12) goto invalid_tile; if (data[0] == 0xff && data[1] == J2K_MARKER_SOT) { guint Psot, nPsot; if (end[0] == 0xff && end[1] == J2K_MARKER_EOC) nPsot = avail - 2; else nPsot = avail; Psot = GST_READ_UINT32_BE (&data[6]); if (Psot != nPsot && Psot != 0) { /* Psot must match the size of the tile */ GST_DEBUG_OBJECT (rtpj2kdepay, "set Psot from %u to %u", Psot, nPsot); buf = gst_buffer_make_writable (buf); data = GST_BUFFER_DATA (buf); GST_WRITE_UINT32_BE (&data[6], nPsot); } } } GST_DEBUG_OBJECT (rtpj2kdepay, "append pu packet of size %u", GST_BUFFER_SIZE (buf)); gst_adapter_push (rtpj2kdepay->f_adapter, buf); } g_list_free (packets); done: rtpj2kdepay->last_tile = -1; return ret; /* errors */ waiting_header: { GST_DEBUG_OBJECT (rtpj2kdepay, "waiting for header %u", mh_id); gst_adapter_clear (rtpj2kdepay->t_adapter); rtpj2kdepay->last_tile = -1; return ret; } invalid_tile: { GST_ELEMENT_WARNING (rtpj2kdepay, STREAM, DECODE, ("Invalid tile"), (NULL)); gst_adapter_clear (rtpj2kdepay->t_adapter); rtpj2kdepay->last_tile = -1; return ret; } } static GstFlowReturn gst_rtp_j2k_depay_flush_frame (GstBaseRTPDepayload * depayload) { GstRtpJ2KDepay *rtpj2kdepay; guint8 end[2]; guint8 *data; guint avail; GstFlowReturn ret = GST_FLOW_OK; rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); /* flush pending tile */ gst_rtp_j2k_depay_flush_tile (depayload); /* last buffer take all data out of the adapter */ avail = gst_adapter_available (rtpj2kdepay->f_adapter); if (avail == 0) goto done; if (avail > 2) { GstBuffer *outbuf; /* take the last bytes of the JPEG 2000 data to see if there is an EOC * marker */ gst_adapter_copy (rtpj2kdepay->f_adapter, end, avail - 2, 2); if (end[0] != 0xff && end[1] != 0xd9) { GST_DEBUG_OBJECT (rtpj2kdepay, "no EOC marker, adding one"); /* no EOI marker, add one */ outbuf = gst_buffer_new_and_alloc (2); data = GST_BUFFER_DATA (outbuf); data[0] = 0xff; data[1] = 0xd9; gst_adapter_push (rtpj2kdepay->f_adapter, outbuf); avail += 2; } if (rtpj2kdepay->buffer_list) { GList *list; GstBufferList *buflist; GstBufferListIterator *it; GST_DEBUG_OBJECT (rtpj2kdepay, "pushing buffer list of %u bytes", avail); list = gst_adapter_take_list (rtpj2kdepay->f_adapter, avail); buflist = gst_buffer_list_new (); it = gst_buffer_list_iterate (buflist); gst_buffer_list_iterator_add_group (it); gst_buffer_list_iterator_add_list (it, list); gst_buffer_list_iterator_free (it); ret = gst_base_rtp_depayload_push_list (depayload, buflist); } else { GST_DEBUG_OBJECT (rtpj2kdepay, "pushing buffer of %u bytes", avail); outbuf = gst_adapter_take_buffer (rtpj2kdepay->f_adapter, avail); ret = gst_base_rtp_depayload_push (depayload, outbuf); } } else { GST_WARNING_OBJECT (rtpj2kdepay, "empty packet"); gst_adapter_clear (rtpj2kdepay->f_adapter); } /* we accept any mh_id now */ rtpj2kdepay->last_mh_id = -1; /* reset state */ rtpj2kdepay->next_frag = 0; rtpj2kdepay->have_sync = FALSE; done: /* we can't keep headers with mh_id of 0 */ store_mheader (rtpj2kdepay, 0, NULL); return ret; } static GstBuffer * gst_rtp_j2k_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpJ2KDepay *rtpj2kdepay; guint8 *payload; guint MHF, mh_id, frag_offset, tile, payload_len, j2klen; gint gap; guint32 rtptime; rtpj2kdepay = GST_RTP_J2K_DEPAY (depayload); payload = gst_rtp_buffer_get_payload (buf); payload_len = gst_rtp_buffer_get_payload_len (buf); /* we need at least a header */ if (payload_len < 8) goto empty_packet; rtptime = gst_rtp_buffer_get_timestamp (buf); /* new timestamp marks new frame */ if (rtpj2kdepay->last_rtptime != rtptime) { rtpj2kdepay->last_rtptime = rtptime; /* flush pending frame */ gst_rtp_j2k_depay_flush_frame (depayload); } /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |tp |MHF|mh_id|T| priority | tile number | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |reserved | fragment offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ MHF = (payload[0] & 0x30) >> 4; mh_id = (payload[0] & 0xe) >> 1; if (rtpj2kdepay->last_mh_id == -1) rtpj2kdepay->last_mh_id = mh_id; else if (rtpj2kdepay->last_mh_id != mh_id) goto wrong_mh_id; tile = (payload[2] << 8) | payload[3]; frag_offset = (payload[5] << 16) | (payload[6] << 8) | payload[7]; j2klen = payload_len - 8; GST_DEBUG_OBJECT (rtpj2kdepay, "MHF %u, tile %u, frag %u, expected %u", MHF, tile, frag_offset, rtpj2kdepay->next_frag); /* calculate the gap between expected frag */ gap = frag_offset - rtpj2kdepay->next_frag; /* calculate next frag */ rtpj2kdepay->next_frag = frag_offset + j2klen; if (gap != 0) { GST_DEBUG_OBJECT (rtpj2kdepay, "discont of %d, clear PU", gap); /* discont, clear pu adapter and resync */ gst_rtp_j2k_depay_clear_pu (rtpj2kdepay); } /* check for sync code */ if (j2klen > 2 && payload[8] == 0xff) { guint marker = payload[9]; /* packets must start with SOC, SOT or SOP */ switch (marker) { case J2K_MARKER_SOC: GST_DEBUG_OBJECT (rtpj2kdepay, "found SOC packet"); /* flush the previous frame, should have happened when the timestamp * changed above. */ gst_rtp_j2k_depay_flush_frame (depayload); rtpj2kdepay->have_sync = TRUE; break; case J2K_MARKER_SOT: /* flush the previous tile */ gst_rtp_j2k_depay_flush_tile (depayload); GST_DEBUG_OBJECT (rtpj2kdepay, "found SOT packet"); rtpj2kdepay->have_sync = TRUE; /* we sync on the tile now */ rtpj2kdepay->last_tile = tile; break; case J2K_MARKER_SOP: GST_DEBUG_OBJECT (rtpj2kdepay, "found SOP packet"); /* flush the previous PU */ gst_rtp_j2k_depay_flush_pu (depayload); if (rtpj2kdepay->last_tile != tile) { /* wrong tile, we lose sync and we need a new SOT or SOC to regain * sync. First flush out the previous tile if we have one. */ if (rtpj2kdepay->last_tile != -1) gst_rtp_j2k_depay_flush_tile (depayload); /* now we have no more valid tile and no sync */ rtpj2kdepay->last_tile = -1; rtpj2kdepay->have_sync = FALSE; } else { rtpj2kdepay->have_sync = TRUE; } break; default: GST_DEBUG_OBJECT (rtpj2kdepay, "no sync packet 0x%02d", marker); break; } } if (rtpj2kdepay->have_sync) { GstBuffer *pu_frag; if (gst_adapter_available (rtpj2kdepay->pu_adapter) == 0) { /* first part of pu, record state */ GST_DEBUG_OBJECT (rtpj2kdepay, "first PU"); rtpj2kdepay->pu_MHF = MHF; } /* and push in pu adapter */ GST_DEBUG_OBJECT (rtpj2kdepay, "push pu of size %u in adapter", j2klen); pu_frag = gst_rtp_buffer_get_payload_subbuffer (buf, 8, -1); gst_adapter_push (rtpj2kdepay->pu_adapter, pu_frag); if (MHF & 2) { /* last part of main header received, we can flush it */ GST_DEBUG_OBJECT (rtpj2kdepay, "header end, flush pu"); gst_rtp_j2k_depay_flush_pu (depayload); } } else { GST_DEBUG_OBJECT (rtpj2kdepay, "discard packet, no sync"); } /* marker bit finishes the frame */ if (gst_rtp_buffer_get_marker (buf)) { GST_DEBUG_OBJECT (rtpj2kdepay, "marker set, last buffer"); /* then flush frame */ gst_rtp_j2k_depay_flush_frame (depayload); } return NULL; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpj2kdepay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } wrong_mh_id: { GST_ELEMENT_WARNING (rtpj2kdepay, STREAM, DECODE, ("Invalid mh_id %u, expected %u", mh_id, rtpj2kdepay->last_mh_id), (NULL)); gst_rtp_j2k_depay_clear_pu (rtpj2kdepay); return NULL; } } static void gst_rtp_j2k_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpJ2KDepay *rtpj2kdepay; rtpj2kdepay = GST_RTP_J2K_DEPAY (object); switch (prop_id) { case PROP_BUFFER_LIST: rtpj2kdepay->buffer_list = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_j2k_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpJ2KDepay *rtpj2kdepay; rtpj2kdepay = GST_RTP_J2K_DEPAY (object); switch (prop_id) { case PROP_BUFFER_LIST: g_value_set_boolean (value, rtpj2kdepay->buffer_list); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_rtp_j2k_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpJ2KDepay *rtpj2kdepay; GstStateChangeReturn ret; rtpj2kdepay = GST_RTP_J2K_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_j2k_depay_reset (rtpj2kdepay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_j2k_depay_reset (rtpj2kdepay); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_j2k_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpj2kdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_J2K_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp2tpay.c0000644000175000017500000001404211712574514016415 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include #include "gstrtpmp2tpay.h" static GstStaticPadTemplate gst_rtp_mp2t_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpegts," "packetsize=(int)188," "systemstream=(boolean)true") ); static GstStaticPadTemplate gst_rtp_mp2t_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MP2T-ES\"") ); static gboolean gst_rtp_mp2t_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_mp2t_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static GstFlowReturn gst_rtp_mp2t_pay_flush (GstRTPMP2TPay * rtpmp2tpay); static void gst_rtp_mp2t_pay_finalize (GObject * object); GST_BOILERPLATE (GstRTPMP2TPay, gst_rtp_mp2t_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_mp2t_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp2t_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp2t_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP MPEG2 Transport Stream payloader", "Codec/Payloader/Network/RTP", "Payload-encodes MPEG2 TS into RTP packets (RFC 2250)", "Wim Taymans "); } static void gst_rtp_mp2t_pay_class_init (GstRTPMP2TPayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_mp2t_pay_finalize; gstbasertppayload_class->set_caps = gst_rtp_mp2t_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mp2t_pay_handle_buffer; } static void gst_rtp_mp2t_pay_init (GstRTPMP2TPay * rtpmp2tpay, GstRTPMP2TPayClass * klass) { GST_BASE_RTP_PAYLOAD (rtpmp2tpay)->clock_rate = 90000; GST_BASE_RTP_PAYLOAD_PT (rtpmp2tpay) = GST_RTP_PAYLOAD_MP2T; rtpmp2tpay->adapter = gst_adapter_new (); } static void gst_rtp_mp2t_pay_finalize (GObject * object) { GstRTPMP2TPay *rtpmp2tpay; rtpmp2tpay = GST_RTP_MP2T_PAY (object); g_object_unref (rtpmp2tpay->adapter); rtpmp2tpay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_mp2t_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; gst_basertppayload_set_options (payload, "video", TRUE, "MP2T-ES", 90000); res = gst_basertppayload_set_outcaps (payload, NULL); return res; } static GstFlowReturn gst_rtp_mp2t_pay_flush (GstRTPMP2TPay * rtpmp2tpay) { guint avail; guint8 *payload; GstFlowReturn ret; GstBuffer *outbuf; avail = gst_adapter_available (rtpmp2tpay->adapter); if (avail == 0) return GST_FLOW_OK; outbuf = gst_rtp_buffer_new_allocate (avail, 0, 0); /* get payload */ payload = gst_rtp_buffer_get_payload (outbuf); /* copy stuff from adapter to payload */ gst_adapter_copy (rtpmp2tpay->adapter, payload, 0, avail); GST_BUFFER_TIMESTAMP (outbuf) = rtpmp2tpay->first_ts; GST_BUFFER_DURATION (outbuf) = rtpmp2tpay->duration; GST_DEBUG_OBJECT (rtpmp2tpay, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp2tpay), outbuf); /* flush the adapter content */ gst_adapter_flush (rtpmp2tpay->adapter, avail); return ret; } static GstFlowReturn gst_rtp_mp2t_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRTPMP2TPay *rtpmp2tpay; guint size, avail, packet_len; GstClockTime timestamp, duration; GstFlowReturn ret; rtpmp2tpay = GST_RTP_MP2T_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); ret = GST_FLOW_OK; avail = gst_adapter_available (rtpmp2tpay->adapter); /* Initialize new RTP payload */ if (avail == 0) { rtpmp2tpay->first_ts = timestamp; rtpmp2tpay->duration = duration; } /* get packet length of previous data and this new data, * payload length includes a 4 byte header */ packet_len = gst_rtp_buffer_calc_packet_len (4 + avail + size, 0, 0); /* if this buffer is going to overflow the packet, flush what we * have. */ if (gst_basertppayload_is_filled (basepayload, packet_len, rtpmp2tpay->duration + duration)) { ret = gst_rtp_mp2t_pay_flush (rtpmp2tpay); rtpmp2tpay->first_ts = timestamp; rtpmp2tpay->duration = duration; /* keep filling the payload */ } else { if (GST_CLOCK_TIME_IS_VALID (duration)) rtpmp2tpay->duration += duration; } /* copy buffer to adapter */ gst_adapter_push (rtpmp2tpay->adapter, buffer); return ret; } gboolean gst_rtp_mp2t_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp2tpay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP2T_PAY); } gst-plugins-good-0.10.31/gst/rtp/Makefile.am0000644000175000017500000001032211677341656015453 00000000000000plugin_LTLIBRARIES = libgstrtp.la libgstrtp_la_SOURCES = \ fnv1hash.c \ gstrtp.c \ gstrtpchannels.c \ gstrtpdepay.c \ gstrtpac3depay.c \ gstrtpac3pay.c \ gstrtpbvdepay.c \ gstrtpbvpay.c \ gstrtpceltdepay.c \ gstrtpceltpay.c \ gstrtpdvdepay.c \ gstrtpdvpay.c \ gstrtpgstdepay.c \ gstrtpgstpay.c \ gstrtpilbcdepay.c \ gstrtpilbcpay.c \ gstrtpmpadepay.c \ gstrtpmpapay.c \ gstrtpmparobustdepay.c \ gstrtpmpvdepay.c \ gstrtpmpvpay.c \ gstrtppcmadepay.c \ gstrtppcmudepay.c \ gstrtppcmupay.c \ gstrtppcmapay.c \ gstrtpg722depay.c \ gstrtpg722pay.c \ gstrtpg723depay.c \ gstrtpg723pay.c \ gstrtpg726pay.c \ gstrtpg726depay.c \ gstrtpg729pay.c \ gstrtpg729depay.c \ gstrtpgsmdepay.c \ gstrtpgsmpay.c \ gstrtpamrdepay.c \ gstrtpamrpay.c \ gstrtph263pdepay.c \ gstrtph263ppay.c \ gstrtph263depay.c \ gstrtph263pay.c \ gstrtph264depay.c \ gstrtph264pay.c \ gstrtpj2kdepay.c \ gstrtpj2kpay.c \ gstrtpjpegdepay.c \ gstrtpjpegpay.c \ gstrtpL16depay.c \ gstrtpL16pay.c \ gstasteriskh263.c \ gstrtpmp1sdepay.c \ gstrtpmp2tdepay.c \ gstrtpmp2tpay.c \ gstrtpmp4vdepay.c \ gstrtpmp4vpay.c \ gstrtpmp4gdepay.c \ gstrtpmp4gpay.c \ gstrtpmp4adepay.c \ gstrtpmp4apay.c \ gstrtpqcelpdepay.c \ gstrtpqdmdepay.c \ gstrtpsirenpay.c \ gstrtpsirendepay.c \ gstrtpspeexdepay.c \ gstrtpspeexpay.c \ gstrtpsv3vdepay.c \ gstrtptheoradepay.c \ gstrtptheorapay.c \ gstrtpvorbisdepay.c \ gstrtpvorbispay.c \ gstrtpvrawdepay.c \ gstrtpvrawpay.c if HAVE_WINSOCK2_H WINSOCK2_LIBS = -lws2_32 else WINSOCK2_LIBS = endif libgstrtp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstrtp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) \ $(WINSOCK2_LIBS) $(LIBM) libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrtp_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ fnv1hash.h \ gstrtpchannels.h \ gstrtpL16depay.h \ gstrtpL16pay.h \ gstrtpac3depay.h \ gstrtpac3pay.h \ gstrtpbvdepay.h \ gstrtpbvpay.h \ gstrtpceltpay.h \ gstrtpceltdepay.h \ gstrtpdvdepay.h \ gstrtpdvpay.h \ gstrtpamrdepay.h \ gstrtpamrpay.h \ gstrtpgstdepay.h \ gstrtpgstpay.h \ gstrtpilbcdepay.h \ gstrtpilbcpay.h \ gstrtppcmadepay.h \ gstrtppcmudepay.h \ gstrtppcmupay.h \ gstrtppcmapay.h \ gstrtpg722depay.h \ gstrtpg722pay.h \ gstrtpg723depay.h \ gstrtpg723pay.h \ gstrtpg726depay.h \ gstrtpg726pay.h \ gstrtpg729depay.h \ gstrtpg729pay.h \ gstrtpgsmdepay.h \ gstrtpgsmpay.h \ gstrtpmpadepay.h \ gstrtpmparobustdepay.h \ gstrtpmpapay.h \ gstrtpmpvdepay.h \ gstrtpmpvpay.h \ gstrtph263pdepay.h \ gstrtph263ppay.h \ gstrtph263depay.h \ gstrtph263pay.h \ gstrtph264depay.h \ gstrtph264pay.h \ gstrtpj2kdepay.h \ gstrtpj2kpay.h \ gstrtpjpegdepay.h \ gstrtpjpegpay.h \ gstrtpmp1sdepay.h \ gstrtpmp2tdepay.h \ gstrtpmp2tpay.h \ gstrtpmp4vdepay.h \ gstrtpmp4vpay.h \ gstrtpmp4gdepay.h \ gstrtpmp4gpay.h \ gstrtpmp4adepay.h \ gstrtpmp4apay.h \ gstrtpdepay.h \ gstasteriskh263.h \ gstrtpqcelpdepay.h \ gstrtpqdmdepay.h \ gstrtpsirenpay.h \ gstrtpsirendepay.h \ gstrtpspeexdepay.h \ gstrtpspeexpay.h \ gstrtpsv3vdepay.h \ gstrtptheoradepay.h \ gstrtptheorapay.h \ gstrtpvorbisdepay.h \ gstrtpvorbispay.h \ gstrtpvrawdepay.h \ gstrtpvrawpay.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstrtp -:SHARED libgstrtp \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstrtp_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtp_la_CFLAGS) \ -:LDFLAGS $(libgstrtp_la_LDFLAGS) \ $(libgstrtp_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/rtp/gstrtpL16pay.h0000644000175000017500000000347311671175354016113 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_L16_PAY_H__ #define __GST_RTP_L16_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_L16_PAY \ (gst_rtp_L16_pay_get_type()) #define GST_RTP_L16_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_PAY,GstRtpL16Pay)) #define GST_RTP_L16_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_PAY,GstRtpL16PayClass)) #define GST_IS_RTP_L16_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_PAY)) #define GST_IS_RTP_L16_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_PAY)) typedef struct _GstRtpL16Pay GstRtpL16Pay; typedef struct _GstRtpL16PayClass GstRtpL16PayClass; struct _GstRtpL16Pay { GstBaseRTPAudioPayload payload; gint rate; gint channels; }; struct _GstRtpL16PayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_L16_pay_get_type (void); gboolean gst_rtp_L16_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_L16_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4gpay.c0000644000175000017500000004373611677341656016427 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include #include "gstrtpmp4gpay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4gpay_debug); #define GST_CAT_DEFAULT (rtpmp4gpay_debug) static GstStaticPadTemplate gst_rtp_mp4g_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg," "mpegversion=(int) 4," "systemstream=(boolean)false;" "audio/mpeg," "mpegversion=(int) 4, " "stream-format=(string) raw") ); static GstStaticPadTemplate gst_rtp_mp4g_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) { \"video\", \"audio\", \"application\" }, " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MPEG4-GENERIC\", " /* required string params */ "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ /* "profile-level-id = (string) [1,MAX], " */ /* "config = (string) [1,MAX]" */ "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " /* Optional general parameters */ /* "objecttype = (string) [1,MAX], " */ /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ /* "constantduration = (string) [1,MAX], " *//* constant duration of each AU */ /* "maxdisplacement = (string) [1,MAX], " */ /* "de-interleavebuffersize = (string) [1,MAX], " */ /* Optional configuration parameters */ /* "sizelength = (string) [1, 16], " *//* max 16 bits, should be enough... */ /* "indexlength = (string) [1, 8], " */ /* "indexdeltalength = (string) [1, 8], " */ /* "ctsdeltalength = (string) [1, 64], " */ /* "dtsdeltalength = (string) [1, 64], " */ /* "randomaccessindication = (string) {0, 1}, " */ /* "streamstateindication = (string) [0, 64], " */ /* "auxiliarydatasizelength = (string) [0, 64]" */ ) ); static void gst_rtp_mp4g_pay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_mp4g_pay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_mp4g_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_mp4g_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static gboolean gst_rtp_mp4g_pay_handle_event (GstPad * pad, GstEvent * event); GST_BOILERPLATE (GstRtpMP4GPay, gst_rtp_mp4g_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_mp4g_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4g_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4g_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG4 ES payloader", "Codec/Payloader/Network/RTP", "Payload MPEG4 elementary streams as RTP packets (RFC 3640)", "Wim Taymans "); } static void gst_rtp_mp4g_pay_class_init (GstRtpMP4GPayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_mp4g_pay_finalize; gstelement_class->change_state = gst_rtp_mp4g_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_mp4g_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mp4g_pay_handle_buffer; gstbasertppayload_class->handle_event = gst_rtp_mp4g_pay_handle_event; GST_DEBUG_CATEGORY_INIT (rtpmp4gpay_debug, "rtpmp4gpay", 0, "MP4-generic RTP Payloader"); } static void gst_rtp_mp4g_pay_init (GstRtpMP4GPay * rtpmp4gpay, GstRtpMP4GPayClass * klass) { rtpmp4gpay->adapter = gst_adapter_new (); } static void gst_rtp_mp4g_pay_reset (GstRtpMP4GPay * rtpmp4gpay) { GST_DEBUG_OBJECT (rtpmp4gpay, "reset"); gst_adapter_clear (rtpmp4gpay->adapter); rtpmp4gpay->offset = 0; } static void gst_rtp_mp4g_pay_cleanup (GstRtpMP4GPay * rtpmp4gpay) { gst_rtp_mp4g_pay_reset (rtpmp4gpay); g_free (rtpmp4gpay->params); rtpmp4gpay->params = NULL; if (rtpmp4gpay->config) gst_buffer_unref (rtpmp4gpay->config); rtpmp4gpay->config = NULL; g_free (rtpmp4gpay->profile); rtpmp4gpay->profile = NULL; rtpmp4gpay->streamtype = NULL; rtpmp4gpay->mode = NULL; rtpmp4gpay->frame_len = 0; } static void gst_rtp_mp4g_pay_finalize (GObject * object) { GstRtpMP4GPay *rtpmp4gpay; rtpmp4gpay = GST_RTP_MP4G_PAY (object); gst_rtp_mp4g_pay_cleanup (rtpmp4gpay); g_object_unref (rtpmp4gpay->adapter); rtpmp4gpay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static const unsigned int sampling_table[16] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0 }; static gboolean gst_rtp_mp4g_pay_parse_audio_config (GstRtpMP4GPay * rtpmp4gpay, GstBuffer * buffer) { guint8 *data; guint size; guint8 objectType = 0; guint8 samplingIdx = 0; guint8 channelCfg = 0; GstBitReader br; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); gst_bit_reader_init (&br, data, size); /* any object type is fine, we need to copy it to the profile-level-id field. */ if (!gst_bit_reader_get_bits_uint8 (&br, &objectType, 5)) goto too_short; if (objectType == 0) goto invalid_object; if (!gst_bit_reader_get_bits_uint8 (&br, &samplingIdx, 4)) goto too_short; /* only fixed values for now */ if (samplingIdx > 12 && samplingIdx != 15) goto wrong_freq; if (!gst_bit_reader_get_bits_uint8 (&br, &channelCfg, 4)) goto too_short; if (channelCfg > 7) goto wrong_channels; /* rtp rate depends on sampling rate of the audio */ if (samplingIdx == 15) { guint32 rate = 0; /* index of 15 means we get the rate in the next 24 bits */ if (!gst_bit_reader_get_bits_uint32 (&br, &rate, 24)) goto too_short; rtpmp4gpay->rate = rate; } else { /* else use the rate from the table */ rtpmp4gpay->rate = sampling_table[samplingIdx]; } rtpmp4gpay->frame_len = 1024; switch (objectType) { case 1: case 2: case 3: case 4: case 6: case 7: { guint8 frameLenFlag = 0; if (gst_bit_reader_get_bits_uint8 (&br, &frameLenFlag, 1)) if (frameLenFlag) rtpmp4gpay->frame_len = 960; break; } default: break; } /* extra rtp params contain the number of channels */ g_free (rtpmp4gpay->params); rtpmp4gpay->params = g_strdup_printf ("%d", channelCfg); /* audio stream type */ rtpmp4gpay->streamtype = "5"; /* mode only high bitrate for now */ rtpmp4gpay->mode = "AAC-hbr"; /* profile */ g_free (rtpmp4gpay->profile); rtpmp4gpay->profile = g_strdup_printf ("%d", objectType); GST_DEBUG_OBJECT (rtpmp4gpay, "objectType: %d, samplingIdx: %d (%d), channelCfg: %d, frame_len %d", objectType, samplingIdx, rtpmp4gpay->rate, channelCfg, rtpmp4gpay->frame_len); return TRUE; /* ERROR */ too_short: { GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, (NULL), ("config string too short")); return FALSE; } invalid_object: { GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, (NULL), ("invalid object type")); return FALSE; } wrong_freq: { GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, NOT_IMPLEMENTED, (NULL), ("unsupported frequency index %d", samplingIdx)); return FALSE; } wrong_channels: { GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, NOT_IMPLEMENTED, (NULL), ("unsupported number of channels %d, must < 8", channelCfg)); return FALSE; } } #define VOS_STARTCODE 0x000001B0 static gboolean gst_rtp_mp4g_pay_parse_video_config (GstRtpMP4GPay * rtpmp4gpay, GstBuffer * buffer) { guint8 *data; guint size; guint32 code; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < 5) goto too_short; code = GST_READ_UINT32_BE (data); g_free (rtpmp4gpay->profile); if (code == VOS_STARTCODE) { /* get profile */ rtpmp4gpay->profile = g_strdup_printf ("%d", (gint) data[4]); } else { GST_ELEMENT_WARNING (rtpmp4gpay, STREAM, FORMAT, (NULL), ("profile not found in config string, assuming \'1\'")); rtpmp4gpay->profile = g_strdup ("1"); } /* fixed rate */ rtpmp4gpay->rate = 90000; /* video stream type */ rtpmp4gpay->streamtype = "4"; /* no params for video */ rtpmp4gpay->params = NULL; /* mode */ rtpmp4gpay->mode = "generic"; GST_LOG_OBJECT (rtpmp4gpay, "profile %s", rtpmp4gpay->profile); return TRUE; /* ERROR */ too_short: { GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, (NULL), ("config string too short")); return FALSE; } } static gboolean gst_rtp_mp4g_pay_new_caps (GstRtpMP4GPay * rtpmp4gpay) { gchar *config; GValue v = { 0 }; gboolean res; #define MP4GCAPS \ "streamtype", G_TYPE_STRING, rtpmp4gpay->streamtype, \ "profile-level-id", G_TYPE_STRING, rtpmp4gpay->profile, \ "mode", G_TYPE_STRING, rtpmp4gpay->mode, \ "config", G_TYPE_STRING, config, \ "sizelength", G_TYPE_STRING, "13", \ "indexlength", G_TYPE_STRING, "3", \ "indexdeltalength", G_TYPE_STRING, "3", \ NULL g_value_init (&v, GST_TYPE_BUFFER); gst_value_set_buffer (&v, rtpmp4gpay->config); config = gst_value_serialize (&v); /* hmm, silly */ if (rtpmp4gpay->params) { res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), "encoding-params", G_TYPE_STRING, rtpmp4gpay->params, MP4GCAPS); } else { res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), MP4GCAPS); } g_value_unset (&v); g_free (config); #undef MP4GCAPS return res; } static gboolean gst_rtp_mp4g_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { GstRtpMP4GPay *rtpmp4gpay; GstStructure *structure; const GValue *codec_data; const gchar *media_type = NULL; gboolean res; rtpmp4gpay = GST_RTP_MP4G_PAY (payload); structure = gst_caps_get_structure (caps, 0); codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { GST_LOG_OBJECT (rtpmp4gpay, "got codec_data"); if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { GstBuffer *buffer; const gchar *name; buffer = gst_value_get_buffer (codec_data); GST_LOG_OBJECT (rtpmp4gpay, "configuring codec_data"); name = gst_structure_get_name (structure); /* parse buffer */ if (!strcmp (name, "audio/mpeg")) { res = gst_rtp_mp4g_pay_parse_audio_config (rtpmp4gpay, buffer); media_type = "audio"; } else if (!strcmp (name, "video/mpeg")) { res = gst_rtp_mp4g_pay_parse_video_config (rtpmp4gpay, buffer); media_type = "video"; } else { res = FALSE; } if (!res) goto config_failed; /* now we can configure the buffer */ if (rtpmp4gpay->config) gst_buffer_unref (rtpmp4gpay->config); rtpmp4gpay->config = gst_buffer_copy (buffer); } } if (media_type == NULL) goto config_failed; gst_basertppayload_set_options (payload, media_type, TRUE, "MPEG4-GENERIC", rtpmp4gpay->rate); res = gst_rtp_mp4g_pay_new_caps (rtpmp4gpay); return res; /* ERRORS */ config_failed: { GST_DEBUG_OBJECT (rtpmp4gpay, "failed to parse config"); return FALSE; } } static GstFlowReturn gst_rtp_mp4g_pay_flush (GstRtpMP4GPay * rtpmp4gpay) { guint avail, total; GstBuffer *outbuf; GstFlowReturn ret; guint mtu; /* the data available in the adapter is either smaller * than the MTU or bigger. In the case it is smaller, the complete * adapter contents can be put in one packet. In the case the * adapter has more than one MTU, we need to fragment the MPEG data * over multiple packets. */ total = avail = gst_adapter_available (rtpmp4gpay->adapter); ret = GST_FLOW_OK; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpmp4gpay); while (avail > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total lenght of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (avail, 0, 0); /* fill one MTU or all available bytes, we need 4 spare bytes for * the AU header. */ towrite = MIN (packet_len, mtu - 4); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); GST_DEBUG_OBJECT (rtpmp4gpay, "avail %d, towrite %d, packet_len %d, payload_len %d", avail, towrite, packet_len, payload_len); /* create buffer to hold the payload, also make room for the 4 header bytes. */ outbuf = gst_rtp_buffer_new_allocate (payload_len + 4, 0, 0); /* copy payload */ payload = gst_rtp_buffer_get_payload (outbuf); /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ * |AU-headers-length|AU-header|AU-header| |AU-header|padding| * | | (1) | (2) | | (n) | bits | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ */ /* AU-headers-length, we only have 1 AU-header */ payload[0] = 0x00; payload[1] = 0x10; /* we use 16 bits for the header */ /* +---------------------------------------+ * | AU-size | * +---------------------------------------+ * | AU-Index / AU-Index-delta | * +---------------------------------------+ * | CTS-flag | * +---------------------------------------+ * | CTS-delta | * +---------------------------------------+ * | DTS-flag | * +---------------------------------------+ * | DTS-delta | * +---------------------------------------+ * | RAP-flag | * +---------------------------------------+ * | Stream-state | * +---------------------------------------+ */ /* The AU-header, no CTS, DTS, RAP, Stream-state * * AU-size is always the total size of the AU, not the fragmented size */ payload[2] = (total & 0x1fe0) >> 5; payload[3] = (total & 0x1f) << 3; /* we use 13 bits for the size, 3 bits index */ /* copy stuff from adapter to payload */ gst_adapter_copy (rtpmp4gpay->adapter, &payload[4], 0, payload_len); gst_adapter_flush (rtpmp4gpay->adapter, payload_len); /* marker only if the packet is complete */ gst_rtp_buffer_set_marker (outbuf, avail <= payload_len); GST_BUFFER_TIMESTAMP (outbuf) = rtpmp4gpay->first_timestamp; GST_BUFFER_DURATION (outbuf) = rtpmp4gpay->first_duration; if (rtpmp4gpay->frame_len) { GST_BUFFER_OFFSET (outbuf) = rtpmp4gpay->offset; rtpmp4gpay->offset += rtpmp4gpay->frame_len; } ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), outbuf); avail -= payload_len; } return ret; } /* we expect buffers as exactly one complete AU */ static GstFlowReturn gst_rtp_mp4g_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpMP4GPay *rtpmp4gpay; rtpmp4gpay = GST_RTP_MP4G_PAY (basepayload); rtpmp4gpay->first_timestamp = GST_BUFFER_TIMESTAMP (buffer); rtpmp4gpay->first_duration = GST_BUFFER_DURATION (buffer); /* we always encode and flush a full AU */ gst_adapter_push (rtpmp4gpay->adapter, buffer); return gst_rtp_mp4g_pay_flush (rtpmp4gpay); } static gboolean gst_rtp_mp4g_pay_handle_event (GstPad * pad, GstEvent * event) { GstRtpMP4GPay *rtpmp4gpay; rtpmp4gpay = GST_RTP_MP4G_PAY (gst_pad_get_parent (pad)); GST_DEBUG ("Got event: %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: case GST_EVENT_EOS: /* This flush call makes sure that the last buffer is always pushed * to the base payloader */ gst_rtp_mp4g_pay_flush (rtpmp4gpay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_mp4g_pay_reset (rtpmp4gpay); break; default: break; } g_object_unref (rtpmp4gpay); /* let parent handle event too */ return FALSE; } static GstStateChangeReturn gst_rtp_mp4g_pay_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRtpMP4GPay *rtpmp4gpay; rtpmp4gpay = GST_RTP_MP4G_PAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_mp4g_pay_cleanup (rtpmp4gpay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_mp4g_pay_cleanup (rtpmp4gpay); break; default: break; } return ret; } gboolean gst_rtp_mp4g_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4gpay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP4G_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtptheoradepay.h0000644000175000017500000000425711671175354017345 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_THEORA_DEPAY_H__ #define __GST_RTP_THEORA_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_THEORA_DEPAY \ (gst_rtp_theora_depay_get_type()) #define GST_RTP_THEORA_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_THEORA_DEPAY,GstRtpTheoraDepay)) #define GST_RTP_THEORA_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_THEORA_DEPAY,GstRtpTheoraDepayClass)) #define GST_IS_RTP_THEORA_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_THEORA_DEPAY)) #define GST_IS_RTP_THEORA_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_THEORA_DEPAY)) typedef struct _GstRtpTheoraDepay GstRtpTheoraDepay; typedef struct _GstRtpTheoraDepayClass GstRtpTheoraDepayClass; typedef struct _GstRtpTheoraConfig { guint32 ident; GList *headers; } GstRtpTheoraConfig; struct _GstRtpTheoraDepay { GstBaseRTPDepayload parent; GList *configs; GstRtpTheoraConfig *config; GstAdapter *adapter; gboolean assembling; gboolean needs_keyframe; }; struct _GstRtpTheoraDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_theora_depay_get_type (void); gboolean gst_rtp_theora_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_THEORA_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmpvpay.c0000644000175000017500000002124211677341656016346 00000000000000/* GStreamer * Copyright (C) <2007> Thijs Vermeir * * 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 #include #include #include "gstrtpmpvpay.h" GST_DEBUG_CATEGORY_STATIC (rtpmpvpay_debug); #define GST_CAT_DEFAULT (rtpmpvpay_debug) static GstStaticPadTemplate gst_rtp_mpv_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg, " "mpegversion = (int) 2, systemstream = (boolean) FALSE") ); static GstStaticPadTemplate gst_rtp_mpv_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_MPV_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPV\"") ); static GstStateChangeReturn gst_rtp_mpv_pay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mpv_pay_finalize (GObject * object); static GstFlowReturn gst_rtp_mpv_pay_flush (GstRTPMPVPay * rtpmpvpay); static gboolean gst_rtp_mpv_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_mpv_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static gboolean gst_rtp_mpv_pay_handle_event (GstPad * pad, GstEvent * event); GST_BOILERPLATE (GstRTPMPVPay, gst_rtp_mpv_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_mpv_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpv_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpv_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP MPEG2 ES video payloader", "Codec/Payloader/Network/RTP", "Payload-encodes MPEG2 ES into RTP packets (RFC 2250)", "Thijs Vermeir "); } static void gst_rtp_mpv_pay_class_init (GstRTPMPVPayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_mpv_pay_finalize; gstelement_class->change_state = gst_rtp_mpv_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_mpv_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mpv_pay_handle_buffer; gstbasertppayload_class->handle_event = gst_rtp_mpv_pay_handle_event; GST_DEBUG_CATEGORY_INIT (rtpmpvpay_debug, "rtpmpvpay", 0, "MPEG2 ES Video RTP Payloader"); } static void gst_rtp_mpv_pay_init (GstRTPMPVPay * rtpmpvpay, GstRTPMPVPayClass * klass) { GST_BASE_RTP_PAYLOAD (rtpmpvpay)->clock_rate = 90000; GST_BASE_RTP_PAYLOAD_PT (rtpmpvpay) = GST_RTP_PAYLOAD_MPV; rtpmpvpay->adapter = gst_adapter_new (); } static void gst_rtp_mpv_pay_finalize (GObject * object) { GstRTPMPVPay *rtpmpvpay; rtpmpvpay = GST_RTP_MPV_PAY (object); g_object_unref (rtpmpvpay->adapter); rtpmpvpay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_mpv_pay_reset (GstRTPMPVPay * pay) { pay->first_ts = -1; pay->duration = 0; gst_adapter_clear (pay->adapter); GST_DEBUG_OBJECT (pay, "reset depayloader"); } static gboolean gst_rtp_mpv_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gst_basertppayload_set_options (payload, "video", FALSE, "MPV", 90000); return gst_basertppayload_set_outcaps (payload, NULL); } static gboolean gst_rtp_mpv_pay_handle_event (GstPad * pad, GstEvent * event) { GstRTPMPVPay *rtpmpvpay; rtpmpvpay = GST_RTP_MPV_PAY (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* make sure we push the last packets in the adapter on EOS */ gst_rtp_mpv_pay_flush (rtpmpvpay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_mpv_pay_reset (rtpmpvpay); break; default: break; } gst_object_unref (rtpmpvpay); /* FALSE to let the parent handle the event as well */ return FALSE; } static GstFlowReturn gst_rtp_mpv_pay_flush (GstRTPMPVPay * rtpmpvpay) { GstBuffer *outbuf; GstFlowReturn ret; guint avail; guint8 *payload; avail = gst_adapter_available (rtpmpvpay->adapter); ret = GST_FLOW_OK; while (avail > 0) { guint towrite; guint packet_len; guint payload_len; packet_len = gst_rtp_buffer_calc_packet_len (avail, 4, 0); towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpmpvpay)); payload_len = gst_rtp_buffer_calc_payload_len (towrite, 4, 0); outbuf = gst_rtp_buffer_new_allocate (payload_len, 4, 0); payload = gst_rtp_buffer_get_payload (outbuf); /* enable MPEG Video-specific header * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ |T| TR | |N|S|B|E| P | | BFC | | FFC | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * AN FBV FFV */ /* fill in the MPEG Video-specific header * data is set to 0x0 here */ memset (payload, 0x0, 4); gst_adapter_copy (rtpmpvpay->adapter, payload + 4, 0, payload_len); gst_adapter_flush (rtpmpvpay->adapter, payload_len); avail -= payload_len; gst_rtp_buffer_set_marker (outbuf, avail == 0); GST_BUFFER_TIMESTAMP (outbuf) = rtpmpvpay->first_ts; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmpvpay), outbuf); } return ret; } static GstFlowReturn gst_rtp_mpv_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRTPMPVPay *rtpmpvpay; guint avail, packet_len; GstClockTime timestamp, duration; GstFlowReturn ret = GST_FLOW_OK; rtpmpvpay = GST_RTP_MPV_PAY (basepayload); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (rtpmpvpay, "DISCONT"); gst_rtp_mpv_pay_reset (rtpmpvpay); } avail = gst_adapter_available (rtpmpvpay->adapter); if (duration == -1) duration = 0; if (rtpmpvpay->first_ts == GST_CLOCK_TIME_NONE || avail == 0) rtpmpvpay->first_ts = timestamp; if (avail == 0) { rtpmpvpay->duration = duration; } else { rtpmpvpay->duration += duration; } gst_adapter_push (rtpmpvpay->adapter, buffer); avail = gst_adapter_available (rtpmpvpay->adapter); /* get packet length of previous data and this new data, * payload length includes a 4 byte MPEG video-specific header */ packet_len = gst_rtp_buffer_calc_packet_len (avail, 4, 0); GST_LOG_OBJECT (rtpmpvpay, "available %d, rtp packet length %d", avail, packet_len); if (gst_basertppayload_is_filled (basepayload, packet_len, rtpmpvpay->duration)) { ret = gst_rtp_mpv_pay_flush (rtpmpvpay); } else { rtpmpvpay->first_ts = timestamp; } return ret; } static GstStateChangeReturn gst_rtp_mpv_pay_change_state (GstElement * element, GstStateChange transition) { GstRTPMPVPay *rtpmpvpay; GstStateChangeReturn ret; rtpmpvpay = GST_RTP_MPV_PAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_mpv_pay_reset (rtpmpvpay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_mpv_pay_reset (rtpmpvpay); break; default: break; } return ret; } gboolean gst_rtp_mpv_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmpvpay", GST_RANK_SECONDARY, GST_TYPE_RTP_MPV_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4gdepay.h0000644000175000017500000000456211671175354016731 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MP4G_DEPAY_H__ #define __GST_RTP_MP4G_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP4G_DEPAY \ (gst_rtp_mp4g_depay_get_type()) #define GST_RTP_MP4G_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4G_DEPAY,GstRtpMP4GDepay)) #define GST_RTP_MP4G_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4G_DEPAY,GstRtpMP4GDepayClass)) #define GST_IS_RTP_MP4G_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4G_DEPAY)) #define GST_IS_RTP_MP4G_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4G_DEPAY)) typedef struct _GstRtpMP4GDepay GstRtpMP4GDepay; typedef struct _GstRtpMP4GDepayClass GstRtpMP4GDepayClass; struct _GstRtpMP4GDepay { GstBaseRTPDepayload depayload; gint profile_level_id; gint streamtype; gint constantSize; gint constantDuration; gint maxDisplacement; gint sizelength; gint indexlength; gint indexdeltalength; gint ctsdeltalength; gint dtsdeltalength; gint randomaccessindication; gint streamstateindication; gint auxiliarydatasizelength; guint max_AU_index; guint prev_AU_index; guint last_AU_index; guint next_AU_index; guint32 prev_rtptime; guint prev_AU_num; GQueue *packets; GstAdapter *adapter; }; struct _GstRtpMP4GDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mp4g_depay_get_type (void); gboolean gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4G_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg722depay.h0000644000175000017500000000406111671175354016535 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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_RTP_G722_DEPAY_H__ #define __GST_RTP_G722_DEPAY_H__ #include #include G_BEGIN_DECLS /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_G722_DEPAY \ (gst_rtp_g722_depay_get_type()) #define GST_RTP_G722_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G722_DEPAY,GstRtpG722Depay)) #define GST_RTP_G722_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G722_DEPAY,GstRtpG722DepayClass)) #define GST_IS_RTP_G722_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G722_DEPAY)) #define GST_IS_RTP_G722_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G722_DEPAY)) typedef struct _GstRtpG722Depay GstRtpG722Depay; typedef struct _GstRtpG722DepayClass GstRtpG722DepayClass; /* Definition of structure storing data for this element. */ struct _GstRtpG722Depay { GstBaseRTPDepayload depayload; guint rate; guint channels; }; /* Standard definition defining a class for this element. */ struct _GstRtpG722DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_g722_depay_get_type (void); gboolean gst_rtp_g722_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G722_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpj2kpay.c0000644000175000017500000004167511677341656016246 00000000000000/* GStreamer * Copyright (C) 2009 Wim Taymans * * 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-rtpj2kpay * * Payload encode JPEG 2000 pictures into RTP packets according to RFC 5371. * For detailed information see: http://www.rfc-editor.org/rfc/rfc5371.txt * * The payloader takes a JPEG 2000 picture, scans the header for packetization * units and constructs the RTP packet header followed by the actual JPEG 2000 * codestream. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "gstrtpj2kpay.h" static GstStaticPadTemplate gst_rtp_j2k_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/x-jpc") ); static GstStaticPadTemplate gst_rtp_j2k_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " " media = (string) \"video\", " " payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " " clock-rate = (int) 90000, " " encoding-name = (string) \"JPEG2000\"") ); GST_DEBUG_CATEGORY_STATIC (rtpj2kpay_debug); #define GST_CAT_DEFAULT (rtpj2kpay_debug) /* * RtpJ2KMarker: * @J2K_MARKER: Prefix for JPEG 2000 marker * @J2K_MARKER_SOC: Start of Codestream * @J2K_MARKER_SOT: Start of tile * @J2K_MARKER_EOC: End of Codestream * * Identifers for markers in JPEG 2000 codestreams */ typedef enum { J2K_MARKER = 0xFF, J2K_MARKER_SOC = 0x4F, J2K_MARKER_SOT = 0x90, J2K_MARKER_SOP = 0x91, J2K_MARKER_EPH = 0x92, J2K_MARKER_SOD = 0x93, J2K_MARKER_EOC = 0xD9 } RtpJ2KMarker; #define DEFAULT_BUFFER_LIST TRUE enum { PROP_0, PROP_BUFFER_LIST, PROP_LAST }; typedef struct { guint tp:2; guint MHF:2; guint mh_id:3; guint T:1; guint priority:8; guint tile:16; guint offset:24; } RtpJ2KHeader; #define HEADER_SIZE 8 static void gst_rtp_j2k_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_j2k_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rtp_j2k_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstFlowReturn gst_rtp_j2k_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); GST_BOILERPLATE (GstRtpJ2KPay, gst_rtp_j2k_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_j2k_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_j2k_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_j2k_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP JPEG 2000 payloader", "Codec/Payloader/Network/RTP", "Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)", "Wim Taymans "); } static void gst_rtp_j2k_pay_class_init (GstRtpJ2KPayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_rtp_j2k_pay_set_property; gobject_class->get_property = gst_rtp_j2k_pay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, g_param_spec_boolean ("buffer-list", "Buffer List", "Use Buffer Lists", DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasertppayload_class->set_caps = gst_rtp_j2k_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_j2k_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpj2kpay_debug, "rtpj2kpay", 0, "JPEG 2000 RTP Payloader"); } static void gst_rtp_j2k_pay_init (GstRtpJ2KPay * pay, GstRtpJ2KPayClass * klass) { pay->buffer_list = DEFAULT_BUFFER_LIST; } static gboolean gst_rtp_j2k_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstStructure *caps_structure = gst_caps_get_structure (caps, 0); GstRtpJ2KPay *pay; gint width = 0, height = 0; gboolean res; pay = GST_RTP_J2K_PAY (basepayload); /* these properties are not mandatory, we can get them from the stream */ if (gst_structure_get_int (caps_structure, "height", &height)) { pay->height = height; } if (gst_structure_get_int (caps_structure, "width", &width)) { pay->width = width; } gst_basertppayload_set_options (basepayload, "video", TRUE, "JPEG2000", 90000); res = gst_basertppayload_set_outcaps (basepayload, NULL); return res; } static guint gst_rtp_j2k_pay_header_size (const guint8 * data, guint offset) { return data[offset] << 8 | data[offset + 1]; } static RtpJ2KMarker gst_rtp_j2k_pay_scan_marker (const guint8 * data, guint size, guint * offset) { while ((data[(*offset)++] != J2K_MARKER) && ((*offset) < size)); if (G_UNLIKELY ((*offset) >= size)) { return J2K_MARKER_EOC; } else { guint8 marker = data[(*offset)++]; return marker; } } typedef struct { RtpJ2KHeader header; gboolean bitstream; guint n_tiles; guint next_sot; gboolean force_packet; } RtpJ2KState; static guint find_pu_end (GstRtpJ2KPay * pay, const guint8 * data, guint size, guint offset, RtpJ2KState * state) { gboolean cut_sop = FALSE; RtpJ2KMarker marker; /* parse the j2k header for 'start of codestream' */ GST_LOG_OBJECT (pay, "checking from offset %u", offset); while (offset < size) { marker = gst_rtp_j2k_pay_scan_marker (data, size, &offset); if (state->bitstream) { /* parsing bitstream, only look for SOP */ switch (marker) { case J2K_MARKER_SOP: GST_LOG_OBJECT (pay, "found SOP at %u", offset); if (cut_sop) return offset - 2; cut_sop = TRUE; break; case J2K_MARKER_EPH: /* just skip over EPH */ GST_LOG_OBJECT (pay, "found EPH at %u", offset); break; default: if (offset >= state->next_sot) { GST_LOG_OBJECT (pay, "reached next SOT at %u", offset); state->bitstream = FALSE; state->force_packet = TRUE; if (marker == J2K_MARKER_EOC && state->next_sot + 2 <= size) /* include EOC but never go past the max size */ return state->next_sot + 2; else return state->next_sot; } break; } } else { switch (marker) { case J2K_MARKER_SOC: GST_LOG_OBJECT (pay, "found SOC at %u", offset); state->header.MHF = 1; break; case J2K_MARKER_SOT: { guint len, Psot; GST_LOG_OBJECT (pay, "found SOT at %u", offset); /* we found SOT but also had a header first */ if (state->header.MHF) { state->force_packet = TRUE; return offset - 2; } /* parse SOT but do some sanity checks first */ len = gst_rtp_j2k_pay_header_size (data, offset); GST_LOG_OBJECT (pay, "SOT length %u", len); if (len < 8) return size; if (offset + len >= size) return size; if (state->n_tiles == 0) /* first tile, T is valid */ state->header.T = 0; else /* more tiles, T becomes invalid */ state->header.T = 1; state->header.tile = GST_READ_UINT16_BE (&data[offset + 2]); state->n_tiles++; /* get offset of next tile, if it's 0, it goes all the way to the end of * the data */ Psot = GST_READ_UINT32_BE (&data[offset + 4]); if (Psot == 0) state->next_sot = size; else state->next_sot = offset - 2 + Psot; offset += len; GST_LOG_OBJECT (pay, "Isot %u, Psot %u, next %u", state->header.tile, Psot, state->next_sot); break; } case J2K_MARKER_SOD: GST_LOG_OBJECT (pay, "found SOD at %u", offset); /* can't have more tiles now */ state->n_tiles = 0; /* go to bitstream parsing */ state->bitstream = TRUE; /* cut at the next SOP or else include all data */ cut_sop = TRUE; /* force a new packet when we see SOP, this can be optional but the * spec recommends packing headers separately */ state->force_packet = TRUE; break; case J2K_MARKER_EOC: GST_LOG_OBJECT (pay, "found EOC at %u", offset); return offset; default: { guint len = gst_rtp_j2k_pay_header_size (data, offset); GST_LOG_OBJECT (pay, "skip 0x%02x len %u", marker, len); offset += len; break; } } } } GST_DEBUG_OBJECT (pay, "reached end of data"); return size; } static GstFlowReturn gst_rtp_j2k_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpJ2KPay *pay; GstClockTime timestamp; GstFlowReturn ret = GST_FLOW_ERROR; RtpJ2KState state; GstBufferList *list = NULL; GstBufferListIterator *it = NULL; guint8 *data; guint size; guint mtu, max_size; guint offset; guint end, pos; pay = GST_RTP_J2K_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (pay); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); offset = pos = end = 0; GST_LOG_OBJECT (pay, "got buffer size %u, timestamp %" GST_TIME_FORMAT, size, GST_TIME_ARGS (timestamp)); /* do some header defaults first */ state.header.tp = 0; /* only progressive scan */ state.header.MHF = 0; /* no header */ state.header.mh_id = 0; /* always 0 for now */ state.header.T = 1; /* invalid tile */ state.header.priority = 255; /* always 255 for now */ state.header.tile = 0; /* no tile number */ state.header.offset = 0; /* offset of 0 */ state.bitstream = FALSE; state.n_tiles = 0; state.next_sot = 0; state.force_packet = FALSE; if (pay->buffer_list) { list = gst_buffer_list_new (); it = gst_buffer_list_iterate (list); } /* get max packet length */ max_size = gst_rtp_buffer_calc_payload_len (mtu - HEADER_SIZE, 0, 0); do { GstBuffer *outbuf; guint8 *header; guint payload_size; guint pu_size; /* try to pack as much as we can */ do { /* see how much we have scanned already */ pu_size = end - offset; GST_DEBUG_OBJECT (pay, "scanned pu size %u", pu_size); /* we need to make a new packet */ if (state.force_packet) { GST_DEBUG_OBJECT (pay, "need to force a new packet"); state.force_packet = FALSE; pos = end; break; } /* else see if we have enough */ if (pu_size > max_size) { if (pos != offset) /* the packet became too large, use previous scanpos */ pu_size = pos - offset; else /* the already scanned data was already too big, make sure we start * scanning from the last searched position */ pos = end; GST_DEBUG_OBJECT (pay, "max size exceeded pu_size %u", pu_size); break; } pos = end; /* exit when finished */ if (pos == size) break; /* scan next packetization unit and fill in the header */ end = find_pu_end (pay, data, size, pos, &state); } while (TRUE); while (pu_size > 0) { guint packet_size, data_size; /* calculate the packet size */ packet_size = gst_rtp_buffer_calc_packet_len (pu_size + HEADER_SIZE, 0, 0); if (packet_size > mtu) { GST_DEBUG_OBJECT (pay, "needed packet size %u clamped to MTU %u", packet_size, mtu); packet_size = mtu; } else { GST_DEBUG_OBJECT (pay, "needed packet size %u fits in MTU %u", packet_size, mtu); } /* get total payload size and data size */ payload_size = gst_rtp_buffer_calc_payload_len (packet_size, 0, 0); data_size = payload_size - HEADER_SIZE; if (pay->buffer_list) { /* make buffer for header */ outbuf = gst_rtp_buffer_new_allocate (HEADER_SIZE, 0, 0); } else { /* make buffer for header and data */ outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; /* get pointer to header */ header = gst_rtp_buffer_get_payload (outbuf); pu_size -= data_size; if (pu_size == 0) { /* reached the end of a packetization unit */ if (state.header.MHF) { /* we were doing a header, see if all fit in one packet or if * we had to fragment it */ if (offset == 0) state.header.MHF = 3; else state.header.MHF = 2; } if (end >= size) gst_rtp_buffer_set_marker (outbuf, TRUE); } /* * RtpJ2KHeader: * @tp: type (0 progressive, 1 odd field, 2 even field) * @MHF: Main Header Flag * @mh_id: Main Header Identification * @T: Tile field invalidation flag * @priority: priority * @tile number: the tile number of the payload * @reserved: set to 0 * @fragment offset: the byte offset of the current payload * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |tp |MHF|mh_id|T| priority | tile number | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |reserved | fragment offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ header[0] = (state.header.tp << 6) | (state.header.MHF << 4) | (state.header.mh_id << 1) | state.header.T; header[1] = state.header.priority; header[2] = state.header.tile >> 8; header[3] = state.header.tile & 0xff; header[4] = 0; header[5] = state.header.offset >> 16; header[6] = (state.header.offset >> 8) & 0xff; header[7] = state.header.offset & 0xff; if (pay->buffer_list) { GstBuffer *paybuf; /* make subbuffer of j2k data */ paybuf = gst_buffer_create_sub (buffer, offset, data_size); /* create a new group to hold the header and the payload */ gst_buffer_list_iterator_add_group (it); /* add both buffers to the buffer list */ gst_buffer_list_iterator_add (it, outbuf); gst_buffer_list_iterator_add (it, paybuf); } else { /* copy payload */ memcpy (header + HEADER_SIZE, &data[offset], data_size); ret = gst_basertppayload_push (basepayload, outbuf); if (ret != GST_FLOW_OK) goto done; } /* reset header for next round */ state.header.MHF = 0; state.header.T = 1; state.header.tile = 0; offset += data_size; } offset = pos; } while (offset < size); done: gst_buffer_unref (buffer); if (pay->buffer_list) { /* free iterator and push the whole buffer list at once */ gst_buffer_list_iterator_free (it); ret = gst_basertppayload_push_list (basepayload, list); } return ret; } static void gst_rtp_j2k_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpJ2KPay *rtpj2kpay; rtpj2kpay = GST_RTP_J2K_PAY (object); switch (prop_id) { case PROP_BUFFER_LIST: rtpj2kpay->buffer_list = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_j2k_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpJ2KPay *rtpj2kpay; rtpj2kpay = GST_RTP_J2K_PAY (object); switch (prop_id) { case PROP_BUFFER_LIST: g_value_set_boolean (value, rtpj2kpay->buffer_list); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_j2k_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpj2kpay", GST_RANK_SECONDARY, GST_TYPE_RTP_J2K_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpjpegdepay.h0000644000175000017500000000410511671175354017000 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_JPEG_DEPAY_H__ #define __GST_RTP_JPEG_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_JPEG_DEPAY \ (gst_rtp_jpeg_depay_get_type()) #define GST_RTP_JPEG_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_JPEG_DEPAY,GstRtpJPEGDepay)) #define GST_RTP_JPEG_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_JPEG_DEPAY,GstRtpJPEGDepayClass)) #define GST_IS_RTP_JPEG_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JPEG_DEPAY)) #define GST_IS_RTP_JPEG_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JPEG_DEPAY)) typedef struct _GstRtpJPEGDepay GstRtpJPEGDepay; typedef struct _GstRtpJPEGDepayClass GstRtpJPEGDepayClass; struct _GstRtpJPEGDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; gboolean discont; /* cached quant tables */ guint8 * qtables[255]; gint frate_num; gint frate_denom; gint media_width; gint media_height; gint width, height; }; struct _GstRtpJPEGDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_jpeg_depay_get_type (void); gboolean gst_rtp_jpeg_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_JPEG_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpvorbispay.h0000644000175000017500000000445711671175354017060 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_VORBIS_PAY_H__ #define __GST_RTP_VORBIS_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_VORBIS_PAY \ (gst_rtp_vorbis_pay_get_type()) #define GST_RTP_VORBIS_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VORBIS_PAY,GstRtpVorbisPay)) #define GST_RTP_VORBIS_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VORBIS_PAY,GstRtpVorbisPayClass)) #define GST_IS_RTP_VORBIS_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VORBIS_PAY)) #define GST_IS_RTP_VORBIS_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VORBIS_PAY)) typedef struct _GstRtpVorbisPay GstRtpVorbisPay; typedef struct _GstRtpVorbisPayClass GstRtpVorbisPayClass; struct _GstRtpVorbisPay { GstBaseRTPPayload payload; /* the headers */ gboolean need_headers; GList *headers; /* queues of buffers along with some stats. */ GstBuffer *packet; guint payload_pos; guint payload_left; guint32 payload_ident; guint8 payload_F; guint8 payload_VDT; guint payload_pkts; GstClockTime payload_timestamp; GstClockTime payload_duration; gint rate; gint channels; }; struct _GstRtpVorbisPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_vorbis_pay_get_type (void); gboolean gst_rtp_vorbis_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_VORBIS_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4apay.h0000644000175000017500000000370411671175354016407 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MP4A_PAY_H__ #define __GST_RTP_MP4A_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP4A_PAY \ (gst_rtp_mp4a_pay_get_type()) #define GST_RTP_MP4A_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4A_PAY,GstRtpMP4APay)) #define GST_RTP_MP4A_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4A_PAY,GstRtpMP4APayClass)) #define GST_IS_RTP_MP4A_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4A_PAY)) #define GST_IS_RTP_MP4A_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4A_PAY)) typedef struct _GstRtpMP4APay GstRtpMP4APay; typedef struct _GstRtpMP4APayClass GstRtpMP4APayClass; struct _GstRtpMP4APay { GstBaseRTPPayload payload; gint rate; gchar *params; gchar *profile; const gchar *streamtype; GstBuffer *config; }; struct _GstRtpMP4APayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_mp4a_pay_get_type (void); gboolean gst_rtp_mp4a_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4A_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpqcelpdepay.c0000644000175000017500000002624211677341656017166 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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 #include #include #include "gstrtpqcelpdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpqcelpdepay_debug); #define GST_CAT_DEFAULT (rtpqcelpdepay_debug) /* references: * * RFC 2658 - RTP Payload Format for PureVoice(tm) Audio */ #define FRAME_DURATION (20 * GST_MSECOND) /* RtpQCELPDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static GstStaticPadTemplate gst_rtp_qcelp_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"QCELP\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_QCELP_STRING ", " "clock-rate = (int) 8000") ); static GstStaticPadTemplate gst_rtp_qcelp_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/qcelp, " "channels = (int) 1," "rate = (int) 8000") ); static void gst_rtp_qcelp_depay_finalize (GObject * object); static gboolean gst_rtp_qcelp_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_qcelp_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); GST_BOILERPLATE (GstRtpQCELPDepay, gst_rtp_qcelp_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_qcelp_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_qcelp_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_qcelp_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP QCELP depayloader", "Codec/Depayloader/Network/RTP", "Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658)", "Wim Taymans "); } static void gst_rtp_qcelp_depay_class_init (GstRtpQCELPDepayClass * klass) { GObjectClass *gobject_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_qcelp_depay_finalize; gstbasertpdepayload_class->process = gst_rtp_qcelp_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_qcelp_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpqcelpdepay_debug, "rtpqcelpdepay", 0, "QCELP RTP Depayloader"); } static void gst_rtp_qcelp_depay_init (GstRtpQCELPDepay * rtpqcelpdepay, GstRtpQCELPDepayClass * klass) { GstBaseRTPDepayload G_GNUC_UNUSED *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtpqcelpdepay); } static void gst_rtp_qcelp_depay_finalize (GObject * object) { GstRtpQCELPDepay *depay; depay = GST_RTP_QCELP_DEPAY (object); if (depay->packets != NULL) { g_ptr_array_foreach (depay->packets, (GFunc) gst_buffer_unref, NULL); g_ptr_array_free (depay->packets, TRUE); depay->packets = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_qcelp_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; gboolean res; srccaps = gst_caps_new_simple ("audio/qcelp", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return res; } static const gint frame_size[16] = { 1, 4, 8, 17, 35, -8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }; /* get the frame length, 0 is invalid, negative values are invalid but can be * recovered from. */ static gint get_frame_len (GstRtpQCELPDepay * depay, guint8 frame_type) { if (frame_type >= G_N_ELEMENTS (frame_size)) return 0; return frame_size[frame_type]; } static guint count_packets (GstRtpQCELPDepay * depay, guint8 * data, guint size) { guint count = 0; while (size > 0) { gint frame_len; frame_len = get_frame_len (depay, data[0]); /* 0 is invalid and we throw away the remainder of the frames */ if (frame_len == 0) break; if (frame_len < 0) frame_len = -frame_len; if (frame_len > size) break; size -= frame_len; data += frame_len; count++; } return count; } static void flush_packets (GstRtpQCELPDepay * depay) { guint i, size; GST_DEBUG_OBJECT (depay, "flushing packets"); size = depay->packets->len; for (i = 0; i < size; i++) { GstBuffer *outbuf; outbuf = g_ptr_array_index (depay->packets, i); g_ptr_array_index (depay->packets, i) = NULL; gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (depay), outbuf); } /* and reset interleaving state */ depay->interleaved = FALSE; depay->bundling = 0; } static void add_packet (GstRtpQCELPDepay * depay, guint LLL, guint NNN, guint index, GstBuffer * outbuf) { guint idx; GstBuffer *old; /* figure out the position in the array, note that index is never 0 because we * push those packets immediately. */ idx = NNN + ((LLL + 1) * (index - 1)); GST_DEBUG_OBJECT (depay, "adding packet at index %u", idx); /* free old buffer (should not happen) */ old = g_ptr_array_index (depay->packets, idx); if (old) gst_buffer_unref (old); /* store new buffer */ g_ptr_array_index (depay->packets, idx) = outbuf; } static GstBuffer * create_erasure_buffer (GstRtpQCELPDepay * depay) { GstBuffer *outbuf; outbuf = gst_buffer_new_and_alloc (1); GST_BUFFER_DATA (outbuf)[0] = 14; return outbuf; } static GstBuffer * gst_rtp_qcelp_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpQCELPDepay *depay; GstBuffer *outbuf; GstClockTime timestamp; guint payload_len, offset, index; guint8 *payload; guint LLL, NNN; depay = GST_RTP_QCELP_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 2) goto too_small; timestamp = GST_BUFFER_TIMESTAMP (buf); payload = gst_rtp_buffer_get_payload (buf); /* 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+ * |RR | LLL | NNN | * +-+-+-+-+-+-+-+-+ */ /* RR = payload[0] >> 6; */ LLL = (payload[0] & 0x38) >> 3; NNN = (payload[0] & 0x07); payload_len--; payload++; GST_DEBUG_OBJECT (depay, "LLL %u, NNN %u", LLL, NNN); if (LLL > 5) goto invalid_lll; if (NNN > LLL) goto invalid_nnn; if (LLL != 0) { /* we are interleaved */ if (!depay->interleaved) { guint size; GST_DEBUG_OBJECT (depay, "starting interleaving group"); /* bundling is not allowed to change in one interleave group */ depay->bundling = count_packets (depay, payload, payload_len); GST_DEBUG_OBJECT (depay, "got bundling of %u", depay->bundling); /* we have one bundle where NNN goes from 0 to L, we don't store the index * 0 frames, so L+1 packets. Each packet has 'bundling - 1' packets */ size = (depay->bundling - 1) * (LLL + 1); /* create the array to hold the packets */ if (depay->packets == NULL) depay->packets = g_ptr_array_sized_new (size); GST_DEBUG_OBJECT (depay, "created packet array of size %u", size); g_ptr_array_set_size (depay->packets, size); /* we were previously not interleaved, figure out how much space we * need to deinterleave */ depay->interleaved = TRUE; } } else { /* we are not interleaved */ if (depay->interleaved) { GST_DEBUG_OBJECT (depay, "stopping interleaving"); /* flush packets if we were previously interleaved */ flush_packets (depay); } depay->bundling = 0; } index = 0; offset = 1; while (payload_len > 0) { gint frame_len; gboolean do_erasure; frame_len = get_frame_len (depay, payload[0]); GST_DEBUG_OBJECT (depay, "got frame len %d", frame_len); if (frame_len == 0) goto invalid_frame; if (frame_len < 0) { /* need to add an erasure frame but we can recover */ frame_len = -frame_len; do_erasure = TRUE; } else { do_erasure = FALSE; } if (frame_len > payload_len) goto invalid_frame; if (do_erasure) { /* create erasure frame */ outbuf = create_erasure_buffer (depay); } else { /* each frame goes into its buffer */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, frame_len); } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = FRAME_DURATION; if (!depay->interleaved || index == 0) { /* not interleaved or first frame in packet, just push */ gst_base_rtp_depayload_push (depayload, outbuf); if (timestamp != -1) timestamp += FRAME_DURATION; } else { /* put in interleave buffer */ add_packet (depay, LLL, NNN, index, outbuf); if (timestamp != -1) timestamp += (FRAME_DURATION * (LLL + 1)); } payload_len -= frame_len; payload += frame_len; offset += frame_len; index++; /* discard excess packets */ if (depay->bundling > 0 && depay->bundling <= index) break; } while (index < depay->bundling) { GST_DEBUG_OBJECT (depay, "filling with erasure buffer"); /* fill remainder with erasure packets */ outbuf = create_erasure_buffer (depay); add_packet (depay, LLL, NNN, index, outbuf); index++; } if (depay->interleaved && LLL == NNN) { GST_DEBUG_OBJECT (depay, "interleave group ended, flushing"); /* we have the complete interleave group, flush */ flush_packets (depay); } return NULL; /* ERRORS */ too_small: { GST_ELEMENT_WARNING (depay, STREAM, DECODE, (NULL), ("QCELP RTP payload too small (%d)", payload_len)); return NULL; } invalid_lll: { GST_ELEMENT_WARNING (depay, STREAM, DECODE, (NULL), ("QCELP RTP invalid LLL received (%d)", LLL)); return NULL; } invalid_nnn: { GST_ELEMENT_WARNING (depay, STREAM, DECODE, (NULL), ("QCELP RTP invalid NNN received (%d)", NNN)); return NULL; } invalid_frame: { GST_ELEMENT_WARNING (depay, STREAM, DECODE, (NULL), ("QCELP RTP invalid frame received")); return NULL; } } gboolean gst_rtp_qcelp_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpqcelpdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_QCELP_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpgsmpay.c0000644000175000017500000001252511677341656016336 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2005> Zeeshan Ali * * 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 #include #include #include "gstrtpgsmpay.h" GST_DEBUG_CATEGORY_STATIC (rtpgsmpay_debug); #define GST_CAT_DEFAULT (rtpgsmpay_debug) static GstStaticPadTemplate gst_rtp_gsm_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = (int) 1") ); static GstStaticPadTemplate gst_rtp_gsm_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_GSM_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"") ); static gboolean gst_rtp_gsm_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_gsm_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRTPGSMPay, gst_rtp_gsm_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_gsm_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gsm_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gsm_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP GSM payloader", "Codec/Payloader/Network/RTP", "Payload-encodes GSM audio into a RTP packet", "Zeeshan Ali "); } static void gst_rtp_gsm_pay_class_init (GstRTPGSMPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_gsm_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_gsm_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpgsmpay_debug, "rtpgsmpay", 0, "GSM Audio RTP Payloader"); } static void gst_rtp_gsm_pay_init (GstRTPGSMPay * rtpgsmpay, GstRTPGSMPayClass * klass) { GST_BASE_RTP_PAYLOAD (rtpgsmpay)->clock_rate = 8000; GST_BASE_RTP_PAYLOAD_PT (rtpgsmpay) = GST_RTP_PAYLOAD_GSM; } static gboolean gst_rtp_gsm_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { const char *stname; GstStructure *structure; gboolean res; structure = gst_caps_get_structure (caps, 0); stname = gst_structure_get_name (structure); if (strcmp ("audio/x-gsm", stname)) goto invalid_type; gst_basertppayload_set_options (payload, "audio", FALSE, "GSM", 8000); res = gst_basertppayload_set_outcaps (payload, NULL); return res; /* ERRORS */ invalid_type: { GST_WARNING_OBJECT (payload, "invalid media type received"); return FALSE; } } static GstFlowReturn gst_rtp_gsm_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRTPGSMPay *rtpgsmpay; guint size, payload_len; GstBuffer *outbuf; guint8 *payload, *data; GstClockTime timestamp, duration; GstFlowReturn ret; rtpgsmpay = GST_RTP_GSM_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); /* FIXME, only one GSM frame per RTP packet for now */ payload_len = size; /* FIXME, just error out for now */ if (payload_len > GST_BASE_RTP_PAYLOAD_MTU (rtpgsmpay)) { GST_ELEMENT_ERROR (rtpgsmpay, STREAM, ENCODE, (NULL), ("payload_len %u > mtu %u", payload_len, GST_BASE_RTP_PAYLOAD_MTU (rtpgsmpay))); return GST_FLOW_ERROR; } outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy timestamp and duration */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; /* get payload */ payload = gst_rtp_buffer_get_payload (outbuf); data = GST_BUFFER_DATA (buffer); /* copy data in payload */ memcpy (&payload[0], data, size); gst_buffer_unref (buffer); GST_DEBUG ("gst_rtp_gsm_pay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); ret = gst_basertppayload_push (basepayload, outbuf); return ret; } gboolean gst_rtp_gsm_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgsmpay", GST_RANK_SECONDARY, GST_TYPE_RTP_GSM_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpdvpay.h0000644000175000017500000000357711671175354016167 00000000000000/* Farsight * Copyright (C) 2006 Marcel Moreaux * * 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 __GSTRTPDVPAY_H__ #define __GSTRTPDVPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTPDVPay GstRTPDVPay; typedef struct _GstRTPDVPayClass GstRTPDVPayClass; #define GST_TYPE_RTP_DV_PAY \ (gst_rtp_dv_pay_get_type()) #define GST_RTP_DV_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DV_PAY,GstRTPDVPay)) #define GST_RTP_DV_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DV_PAY,GstRTPDVPay)) #define GST_IS_RTP_DV_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DV_PAY)) #define GST_IS_RTP_DV_PAY_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DV_PAY)) typedef enum { GST_DV_PAY_MODE_VIDEO, GST_DV_PAY_MODE_BUNDLED, GST_DV_PAY_MODE_AUDIO } GstDVPayMode; struct _GstRTPDVPay { GstBaseRTPPayload payload; gboolean negotiated; GstDVPayMode mode; }; struct _GstRTPDVPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_dv_pay_get_type (void); gboolean gst_rtp_dv_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GSTRTPDVPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpamrpay.c0000644000175000017500000003132411677341656016325 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpamrpay.h" GST_DEBUG_CATEGORY_STATIC (rtpamrpay_debug); #define GST_CAT_DEFAULT (rtpamrpay_debug) /* references: * * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File * Storage Format for the Adaptive Multi-Rate (AMR) and Adaptive * Multi-Rate Wideband (AMR-WB) Audio Codecs. * * ETSI TS 126 201 V6.0.0 (2004-12) - Digital cellular telecommunications system (Phase 2+); * Universal Mobile Telecommunications System (UMTS); * AMR speech codec, wideband; * Frame structure * (3GPP TS 26.201 version 6.0.0 Release 6) */ static GstStaticPadTemplate gst_rtp_amr_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/AMR, channels=(int)1, rate=(int)8000; " "audio/AMR-WB, channels=(int)1, rate=(int)16000") ); static GstStaticPadTemplate gst_rtp_amr_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"AMR\", " "encoding-params = (string) \"1\", " "octet-align = (string) \"1\", " "crc = (string) \"0\", " "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\", " "mode-set = (int) [ 0, 7 ], " "mode-change-period = (int) [ 1, MAX ], " "mode-change-neighbor = (string) { \"0\", \"1\" }, " "maxptime = (int) [ 20, MAX ], " "ptime = (int) [ 20, MAX ];" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 16000, " "encoding-name = (string) \"AMR-WB\", " "encoding-params = (string) \"1\", " "octet-align = (string) \"1\", " "crc = (string) \"0\", " "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\", " "mode-set = (int) [ 0, 7 ], " "mode-change-period = (int) [ 1, MAX ], " "mode-change-neighbor = (string) { \"0\", \"1\" }, " "maxptime = (int) [ 20, MAX ], " "ptime = (int) [ 20, MAX ]") ); static gboolean gst_rtp_amr_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstFlowReturn gst_rtp_amr_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); static GstStateChangeReturn gst_rtp_amr_pay_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstRtpAMRPay, gst_rtp_amr_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_amr_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_amr_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_amr_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP AMR payloader", "Codec/Payloader/Network/RTP", "Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267)", "Wim Taymans "); } static void gst_rtp_amr_pay_class_init (GstRtpAMRPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; GstElementClass *gstelement_class; gstelement_class = (GstElementClass *) klass; gstelement_class->change_state = gst_rtp_amr_pay_change_state; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_amr_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_amr_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpamrpay_debug, "rtpamrpay", 0, "AMR/AMR-WB RTP Payloader"); } static void gst_rtp_amr_pay_init (GstRtpAMRPay * rtpamrpay, GstRtpAMRPayClass * klass) { /* needed because of GST_BOILERPLATE */ } static void gst_rtp_amr_pay_reset (GstRtpAMRPay * pay) { pay->next_rtp_time = 0; pay->first_ts = GST_CLOCK_TIME_NONE; pay->first_rtp_time = 0; } static gboolean gst_rtp_amr_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstRtpAMRPay *rtpamrpay; gboolean res; const GstStructure *s; const gchar *str; rtpamrpay = GST_RTP_AMR_PAY (basepayload); /* figure out the mode Narrow or Wideband */ s = gst_caps_get_structure (caps, 0); if ((str = gst_structure_get_name (s))) { if (strcmp (str, "audio/AMR") == 0) rtpamrpay->mode = GST_RTP_AMR_P_MODE_NB; else if (strcmp (str, "audio/AMR-WB") == 0) rtpamrpay->mode = GST_RTP_AMR_P_MODE_WB; else goto wrong_type; } else goto wrong_type; if (rtpamrpay->mode == GST_RTP_AMR_P_MODE_NB) gst_basertppayload_set_options (basepayload, "audio", TRUE, "AMR", 8000); else gst_basertppayload_set_options (basepayload, "audio", TRUE, "AMR-WB", 16000); res = gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, "1", "octet-align", G_TYPE_STRING, "1", /* don't set the defaults * * "crc", G_TYPE_STRING, "0", * "robust-sorting", G_TYPE_STRING, "0", * "interleaving", G_TYPE_STRING, "0", */ NULL); return res; /* ERRORS */ wrong_type: { GST_ERROR_OBJECT (rtpamrpay, "unsupported media type '%s'", GST_STR_NULL (str)); return FALSE; } } static void gst_rtp_amr_pay_recalc_rtp_time (GstRtpAMRPay * rtpamrpay, GstClockTime timestamp) { /* re-sync rtp time */ if (GST_CLOCK_TIME_IS_VALID (rtpamrpay->first_ts) && GST_CLOCK_TIME_IS_VALID (timestamp) && timestamp >= rtpamrpay->first_ts) { GstClockTime diff; guint32 rtpdiff; /* interpolate to reproduce gap from start, rather than intermediate * intervals to avoid roundup accumulation errors */ diff = timestamp - rtpamrpay->first_ts; rtpdiff = ((diff / GST_MSECOND) * 8) << (rtpamrpay->mode == GST_RTP_AMR_P_MODE_WB); rtpamrpay->next_rtp_time = rtpamrpay->first_rtp_time + rtpdiff; GST_DEBUG_OBJECT (rtpamrpay, "elapsed time %" GST_TIME_FORMAT ", rtp %" G_GUINT32_FORMAT ", " "new offset %" G_GUINT32_FORMAT, GST_TIME_ARGS (diff), rtpdiff, rtpamrpay->next_rtp_time); } } /* -1 is invalid */ static const gint nb_frame_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, -1, -1, -1, -1, -1, -1, 0 }; static const gint wb_frame_size[16] = { 17, 23, 32, 36, 40, 46, 50, 58, 60, 5, -1, -1, -1, -1, -1, 0 }; static GstFlowReturn gst_rtp_amr_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpAMRPay *rtpamrpay; const gint *frame_size; GstFlowReturn ret; guint size, payload_len; GstBuffer *outbuf; guint8 *payload, *data, *payload_amr; GstClockTime timestamp, duration; guint packet_len, mtu; gint i, num_packets, num_nonempty_packets; gint amr_len; gboolean sid = FALSE; rtpamrpay = GST_RTP_AMR_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpamrpay); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); /* setup frame size pointer */ if (rtpamrpay->mode == GST_RTP_AMR_P_MODE_NB) frame_size = nb_frame_size; else frame_size = wb_frame_size; GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); /* FIXME, only * octet aligned, no interleaving, single channel, no CRC, * no robust-sorting. To fix this you need to implement the downstream * negotiation function. */ /* first count number of packets and total amr frame size */ amr_len = num_packets = num_nonempty_packets = 0; for (i = 0; i < size; i++) { guint8 FT; gint fr_size; FT = (data[i] & 0x78) >> 3; fr_size = frame_size[FT]; GST_DEBUG_OBJECT (basepayload, "frame type %d, frame size %d", FT, fr_size); /* FIXME, we don't handle this yet.. */ if (fr_size <= 0) goto wrong_size; if (fr_size == 5) sid = TRUE; amr_len += fr_size; num_nonempty_packets++; num_packets++; i += fr_size; } if (amr_len > size) goto incomplete_frame; /* we need one extra byte for the CMR, the ToC is in the input * data */ payload_len = size + 1; /* get packet len to check against MTU */ packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); if (packet_len > mtu) goto too_big; /* now alloc output buffer */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy timestamp */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (duration != GST_CLOCK_TIME_NONE) GST_BUFFER_DURATION (outbuf) = duration; else { GST_BUFFER_DURATION (outbuf) = num_packets * 20 * GST_MSECOND; } if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (basepayload, "discont, setting marker bit"); GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); gst_rtp_buffer_set_marker (outbuf, TRUE); gst_rtp_amr_pay_recalc_rtp_time (rtpamrpay, timestamp); } if (G_UNLIKELY (sid)) { gst_rtp_amr_pay_recalc_rtp_time (rtpamrpay, timestamp); } /* perfect rtptime */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (rtpamrpay->first_ts))) { rtpamrpay->first_ts = timestamp; rtpamrpay->first_rtp_time = rtpamrpay->next_rtp_time; } GST_BUFFER_OFFSET (outbuf) = rtpamrpay->next_rtp_time; rtpamrpay->next_rtp_time += (num_packets * 160) << (rtpamrpay->mode == GST_RTP_AMR_P_MODE_WB); /* get payload, this is now writable */ payload = gst_rtp_buffer_get_payload (outbuf); /* 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+ * | CMR |R|R|R|R| * +-+-+-+-+-+-+-+-+ */ payload[0] = 0xF0; /* CMR, no specific mode requested */ /* this is where we copy the AMR data, after num_packets FTs and the * CMR. */ payload_amr = payload + num_packets + 1; /* copy data in payload, first we copy all the FTs then all * the AMR data. The last FT has to have the F flag cleared. */ for (i = 1; i <= num_packets; i++) { guint8 FT; gint fr_size; /* 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+ * |F| FT |Q|P|P| more FT... * +-+-+-+-+-+-+-+-+ */ FT = (*data & 0x78) >> 3; fr_size = frame_size[FT]; if (i == num_packets) /* last packet, clear F flag */ payload[i] = *data & 0x7f; else /* set F flag */ payload[i] = *data | 0x80; memcpy (payload_amr, &data[1], fr_size); /* all sizes are > 0 since we checked for that above */ data += fr_size + 1; payload_amr += fr_size; } gst_buffer_unref (buffer); ret = gst_basertppayload_push (basepayload, outbuf); return ret; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, (NULL), ("received AMR frame with size <= 0")); gst_buffer_unref (buffer); return GST_FLOW_ERROR; } incomplete_frame: { GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, (NULL), ("received incomplete AMR frames")); gst_buffer_unref (buffer); return GST_FLOW_ERROR; } too_big: { GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, (NULL), ("received too many AMR frames for MTU")); gst_buffer_unref (buffer); return GST_FLOW_ERROR; } } static GstStateChangeReturn gst_rtp_amr_pay_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; /* handle upwards state changes here */ switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); /* handle downwards state changes */ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_amr_pay_reset (GST_RTP_AMR_PAY (element)); break; default: break; } return ret; } gboolean gst_rtp_amr_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpamrpay", GST_RANK_SECONDARY, GST_TYPE_RTP_AMR_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4vdepay.h0000644000175000017500000000362511671175354016747 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MP4V_DEPAY_H__ #define __GST_RTP_MP4V_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP4V_DEPAY \ (gst_rtp_mp4v_depay_get_type()) #define GST_RTP_MP4V_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4V_DEPAY,GstRtpMP4VDepay)) #define GST_RTP_MP4V_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4V_DEPAY,GstRtpMP4VDepayClass)) #define GST_IS_RTP_MP4V_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4V_DEPAY)) #define GST_IS_RTP_MP4V_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4V_DEPAY)) typedef struct _GstRtpMP4VDepay GstRtpMP4VDepay; typedef struct _GstRtpMP4VDepayClass GstRtpMP4VDepayClass; struct _GstRtpMP4VDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; }; struct _GstRtpMP4VDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mp4v_depay_get_type (void); gboolean gst_rtp_mp4v_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4V_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpbvdepay.c0000644000175000017500000001242411677341656016466 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 #include #include #include "gstrtpbvdepay.h" static GstStaticPadTemplate gst_rtp_bv_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"BV16\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 16000, " "encoding-name = (string) \"BV32\"") ); static GstStaticPadTemplate gst_rtp_bv_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-bv, " "mode = (int) { 16, 32 }") ); static GstBuffer *gst_rtp_bv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_bv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRTPBVDepay, gst_rtp_bv_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_bv_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_bv_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_bv_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP BroadcomVoice depayloader", "Codec/Depayloader/Network/RTP", "Extracts BroadcomVoice audio from RTP packets (RFC 4298)", "Wim Taymans "); } static void gst_rtp_bv_depay_class_init (GstRTPBVDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_bv_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_bv_depay_setcaps; } static void gst_rtp_bv_depay_init (GstRTPBVDepay * rtpbvdepay, GstRTPBVDepayClass * klass) { rtpbvdepay->mode = -1; } static gboolean gst_rtp_bv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstRTPBVDepay *rtpbvdepay = GST_RTP_BV_DEPAY (depayload); GstCaps *srccaps; GstStructure *structure; const gchar *mode_str = NULL; gint mode, clock_rate, expected_rate; gboolean ret; structure = gst_caps_get_structure (caps, 0); mode_str = gst_structure_get_string (structure, "encoding-name"); if (!mode_str) goto no_mode; if (!strcmp (mode_str, "BV16")) { mode = 16; expected_rate = 8000; } else if (!strcmp (mode_str, "BV32")) { mode = 32; expected_rate = 16000; } else goto invalid_mode; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = expected_rate; else if (clock_rate != expected_rate) goto wrong_rate; depayload->clock_rate = clock_rate; rtpbvdepay->mode = mode; srccaps = gst_caps_new_simple ("audio/x-bv", "mode", G_TYPE_INT, rtpbvdepay->mode, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); gst_caps_unref (srccaps); return ret; /* ERRORS */ no_mode: { GST_ERROR_OBJECT (rtpbvdepay, "did not receive an encoding-name"); return FALSE; } invalid_mode: { GST_ERROR_OBJECT (rtpbvdepay, "invalid encoding-name, expected BV16 or BV32, got %s", mode_str); return FALSE; } wrong_rate: { GST_ERROR_OBJECT (rtpbvdepay, "invalid clock-rate, expected %d, got %d", expected_rate, clock_rate); return FALSE; } } static GstBuffer * gst_rtp_bv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf; gboolean marker; marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (marker && outbuf) { /* mark start of talkspurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } return outbuf; } gboolean gst_rtp_bv_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpbvdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_BV_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpvrawpay.h0000644000175000017500000000376011671175354016527 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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_RTP_VRAW_PAY_H__ #define __GST_RTP_VRAW_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_VRAW_PAY \ (gst_rtp_vraw_pay_get_type()) #define GST_RTP_VRAW_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VRAW_PAY,GstRtpVRawPay)) #define GST_RTP_VRAW_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VRAW_PAY,GstRtpVRawPayClass)) #define GST_IS_RTP_VRAW_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VRAW_PAY)) #define GST_IS_RTP_VRAW_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VRAW_PAY)) typedef struct _GstRtpVRawPay GstRtpVRawPay; typedef struct _GstRtpVRawPayClass GstRtpVRawPayClass; struct _GstRtpVRawPay { GstBaseRTPPayload payload; gint width, height; GstVideoFormat sampling; gint pgroup; gint xinc, yinc; guint yp, up, vp; gint ystride; gint uvstride; gboolean interlaced; gint depth; }; struct _GstRtpVRawPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_vraw_pay_get_type (void); gboolean gst_rtp_vraw_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_VRAW_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtph264depay.h0000644000175000017500000000440311677341656016545 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_H264_DEPAY_H__ #define __GST_RTP_H264_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_H264_DEPAY \ (gst_rtp_h264_depay_get_type()) #define GST_RTP_H264_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_DEPAY,GstRtpH264Depay)) #define GST_RTP_H264_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_DEPAY,GstRtpH264DepayClass)) #define GST_IS_RTP_H264_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_DEPAY)) #define GST_IS_RTP_H264_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_DEPAY)) typedef struct _GstRtpH264Depay GstRtpH264Depay; typedef struct _GstRtpH264DepayClass GstRtpH264DepayClass; struct _GstRtpH264Depay { GstBaseRTPDepayload depayload; gboolean byte_stream; GstBuffer *codec_data; GstAdapter *adapter; gboolean wait_start; /* nal merging */ gboolean merge; GstAdapter *picture_adapter; gboolean picture_start; GstClockTime last_ts; gboolean last_keyframe; /* Work around broken payloaders wrt. FU-A & FU-B */ guint8 current_fu_type; GstClockTime fu_timestamp; gboolean fu_marker; }; struct _GstRtpH264DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_h264_depay_get_type (void); gboolean gst_rtp_h264_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H264_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpvrawdepay.c0000644000175000017500000004202211677341656017033 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include #include "gstrtpvrawdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpvrawdepay_debug); #define GST_CAT_DEFAULT (rtpvrawdepay_debug) static GstStaticPadTemplate gst_rtp_vraw_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv") ); static GstStaticPadTemplate gst_rtp_vraw_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"RAW\"") ); GST_BOILERPLATE (GstRtpVRawDepay, gst_rtp_vraw_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_vraw_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_vraw_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_vraw_depay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_vraw_depay_handle_event (GstBaseRTPDepayload * filter, GstEvent * event); static void gst_rtp_vraw_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vraw_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vraw_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP Raw Video depayloader", "Codec/Depayloader/Network/RTP", "Extracts raw video from RTP packets (RFC 4175)", "Wim Taymans "); } static void gst_rtp_vraw_depay_class_init (GstRtpVRawDepayClass * klass) { GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstelement_class->change_state = gst_rtp_vraw_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_vraw_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_vraw_depay_process; gstbasertpdepayload_class->handle_event = gst_rtp_vraw_depay_handle_event; GST_DEBUG_CATEGORY_INIT (rtpvrawdepay_debug, "rtpvrawdepay", 0, "raw video RTP Depayloader"); } static void gst_rtp_vraw_depay_init (GstRtpVRawDepay * rtpvrawdepay, GstRtpVRawDepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static void gst_rtp_vraw_depay_reset (GstRtpVRawDepay * rtpvrawdepay) { if (rtpvrawdepay->outbuf) { gst_buffer_unref (rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; } rtpvrawdepay->timestamp = -1; } static gboolean gst_rtp_vraw_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpVRawDepay *rtpvrawdepay; gint clock_rate; const gchar *str, *type; gint format, width, height, pgroup, xinc, yinc; guint ystride, uvstride, yp, up, vp, outsize; GstCaps *srccaps; guint32 fourcc = 0; gboolean res; gint rmask = 0, gmask = 0, bmask = 0, amask = 0, bpp = 0, depth = 0; rtpvrawdepay = GST_RTP_VRAW_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); yp = up = vp = uvstride = 0; xinc = yinc = 1; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; if (!(str = gst_structure_get_string (structure, "width"))) goto no_width; width = atoi (str); if (!(str = gst_structure_get_string (structure, "height"))) goto no_height; height = atoi (str); /* optional interlace value but we don't handle interlaced * formats yet */ if (gst_structure_get_string (structure, "interlace")) goto interlaced; if (!(str = gst_structure_get_string (structure, "sampling"))) goto no_sampling; if (!strcmp (str, "RGB")) { format = GST_VIDEO_FORMAT_RGB; pgroup = 3; ystride = GST_ROUND_UP_4 (width * 3); outsize = ystride * height; type = "video/x-raw-rgb"; rmask = 0x00ff0000; gmask = 0x0000ff00; bmask = 0x000000ff; depth = 24; bpp = 24; } else if (!strcmp (str, "RGBA")) { format = GST_VIDEO_FORMAT_RGBA; pgroup = 4; ystride = width * 4; outsize = ystride * height; type = "video/x-raw-rgb"; rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; depth = 32; bpp = 32; } else if (!strcmp (str, "BGR")) { format = GST_VIDEO_FORMAT_BGR; pgroup = 3; ystride = GST_ROUND_UP_4 (width * 3); outsize = ystride * height; type = "video/x-raw-rgb"; rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; depth = 24; bpp = 24; } else if (!strcmp (str, "BGRA")) { format = GST_VIDEO_FORMAT_BGRA; pgroup = 4; ystride = width * 4; outsize = ystride * height; type = "video/x-raw-rgb"; rmask = 0x0000ff00; gmask = 0x00ff0000; bmask = 0xff000000; amask = 0x000000ff; depth = 32; bpp = 32; } else if (!strcmp (str, "YCbCr-4:4:4")) { format = GST_VIDEO_FORMAT_AYUV; pgroup = 3; ystride = width * 4; outsize = ystride * height; type = "video/x-raw-yuv"; fourcc = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'); } else if (!strcmp (str, "YCbCr-4:2:2")) { format = GST_VIDEO_FORMAT_UYVY; pgroup = 4; ystride = GST_ROUND_UP_2 (width) * 2; outsize = ystride * height; type = "video/x-raw-yuv"; fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); xinc = 2; } else if (!strcmp (str, "YCbCr-4:2:0")) { format = GST_VIDEO_FORMAT_I420; pgroup = 6; ystride = GST_ROUND_UP_4 (width); uvstride = GST_ROUND_UP_8 (width) / 2; up = ystride * GST_ROUND_UP_2 (height); vp = up + uvstride * GST_ROUND_UP_2 (height) / 2; outsize = vp + uvstride * GST_ROUND_UP_2 (height) / 2; type = "video/x-raw-yuv"; fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); xinc = yinc = 2; } else if (!strcmp (str, "YCbCr-4:1:1")) { format = GST_VIDEO_FORMAT_Y41B; pgroup = 6; ystride = GST_ROUND_UP_4 (width); uvstride = GST_ROUND_UP_8 (width) / 4; up = ystride * height; vp = up + uvstride * height; outsize = vp + uvstride * height; type = "video/x-raw-yuv"; fourcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); xinc = 4; } else goto unknown_format; rtpvrawdepay->width = width; rtpvrawdepay->height = height; rtpvrawdepay->format = format; rtpvrawdepay->yp = yp; rtpvrawdepay->up = up; rtpvrawdepay->vp = vp; rtpvrawdepay->pgroup = pgroup; rtpvrawdepay->xinc = xinc; rtpvrawdepay->yinc = yinc; rtpvrawdepay->ystride = ystride; rtpvrawdepay->uvstride = uvstride; rtpvrawdepay->outsize = outsize; srccaps = gst_caps_new_simple (type, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "format", GST_TYPE_FOURCC, fourcc, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); if (!strcmp (type, "video/x-raw-rgb")) { gst_caps_set_simple (srccaps, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, rmask, "green_mask", G_TYPE_INT, gmask, "blue_mask", G_TYPE_INT, bmask, "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, NULL); if (amask > 0) { gst_caps_set_simple (srccaps, "alpha_mask", G_TYPE_INT, amask, NULL); } } res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); GST_DEBUG_OBJECT (depayload, "width %d, height %d, format %d", width, height, format); GST_DEBUG_OBJECT (depayload, "yp %d, up %d, vp %d", yp, up, vp); GST_DEBUG_OBJECT (depayload, "xinc %d, yinc %d", xinc, yinc); GST_DEBUG_OBJECT (depayload, "pgroup %d, ystride %d, uvstride %d", pgroup, ystride, uvstride); GST_DEBUG_OBJECT (depayload, "outsize %u", outsize); return res; /* ERRORS */ no_width: { GST_ERROR_OBJECT (depayload, "no width specified"); return FALSE; } no_height: { GST_ERROR_OBJECT (depayload, "no height specified"); return FALSE; } interlaced: { GST_ERROR_OBJECT (depayload, "interlaced formats not supported yet"); return FALSE; } no_sampling: { GST_ERROR_OBJECT (depayload, "no sampling specified"); return FALSE; } unknown_format: { GST_ERROR_OBJECT (depayload, "unknown sampling format '%s'", str); return FALSE; } } static GstBuffer * gst_rtp_vraw_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpVRawDepay *rtpvrawdepay; guint8 *payload, *data, *yp, *up, *vp, *headers; guint32 timestamp; guint cont, ystride, uvstride, pgroup, payload_len; gint width, height, xinc, yinc; rtpvrawdepay = GST_RTP_VRAW_DEPAY (depayload); timestamp = gst_rtp_buffer_get_timestamp (buf); if (timestamp != rtpvrawdepay->timestamp || rtpvrawdepay->outbuf == NULL) { GstBuffer *outbuf; GstFlowReturn ret; GST_LOG_OBJECT (depayload, "new frame with timestamp %u", timestamp); /* new timestamp, flush old buffer and create new output buffer */ if (rtpvrawdepay->outbuf) { gst_base_rtp_depayload_push_ts (depayload, rtpvrawdepay->timestamp, rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; } ret = gst_pad_alloc_buffer (depayload->srcpad, -1, rtpvrawdepay->outsize, GST_PAD_CAPS (depayload->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto alloc_failed; /* clear timestamp from alloc... */ GST_BUFFER_TIMESTAMP (outbuf) = -1; rtpvrawdepay->outbuf = outbuf; rtpvrawdepay->timestamp = timestamp; } data = GST_BUFFER_DATA (rtpvrawdepay->outbuf); /* get pointer and strides of the planes */ yp = data + rtpvrawdepay->yp; up = data + rtpvrawdepay->up; vp = data + rtpvrawdepay->vp; ystride = rtpvrawdepay->ystride; uvstride = rtpvrawdepay->uvstride; pgroup = rtpvrawdepay->pgroup; width = rtpvrawdepay->width; height = rtpvrawdepay->height; xinc = rtpvrawdepay->xinc; yinc = rtpvrawdepay->yinc; payload = gst_rtp_buffer_get_payload (buf); payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 3) goto short_packet; /* skip extended seqnum */ payload += 2; payload_len -= 2; /* remember header position */ headers = payload; /* find data start */ do { if (payload_len < 6) goto short_packet; cont = payload[4] & 0x80; payload += 6; payload_len -= 6; } while (cont); while (TRUE) { guint length, line, offs, plen; guint8 *datap; /* stop when we run out of data */ if (payload_len == 0) break; /* read length and cont. This should work because we iterated the headers * above. */ length = (headers[0] << 8) | headers[1]; line = ((headers[2] & 0x7f) << 8) | headers[3]; offs = ((headers[4] & 0x7f) << 8) | headers[5]; cont = headers[4] & 0x80; headers += 6; /* length must be a multiple of pgroup */ if (length % pgroup != 0) goto wrong_length; if (length > payload_len) length = payload_len; /* sanity check */ if (line > (height - yinc)) { GST_WARNING_OBJECT (depayload, "skipping line %d: out of range", line); goto next; } if (offs > (width - xinc)) { GST_WARNING_OBJECT (depayload, "skipping offset %d: out of range", offs); goto next; } /* calculate the maximim amount of bytes we can use per line */ if (offs + ((length / pgroup) * xinc) > width) { plen = ((width - offs) * pgroup) / xinc; GST_WARNING_OBJECT (depayload, "clipping length %d, offset %d, plen %d", length, offs, plen); } else plen = length; GST_LOG_OBJECT (depayload, "writing length %u/%u, line %u, offset %u, remaining %u", plen, length, line, offs, payload_len); switch (rtpvrawdepay->format) { case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGR: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_UYVY: /* samples are packed just like gstreamer packs them */ offs /= xinc; datap = yp + (line * ystride) + (offs * pgroup); memcpy (datap, payload, plen); break; case GST_VIDEO_FORMAT_AYUV: { gint i; guint8 *p; datap = yp + (line * ystride) + (offs * 4); p = payload; /* samples are packed in order Cb-Y-Cr for both interlaced and * progressive frames */ for (i = 0; i < plen; i += pgroup) { *datap++ = 0; *datap++ = p[1]; *datap++ = p[0]; *datap++ = p[2]; p += pgroup; } break; } case GST_VIDEO_FORMAT_I420: { gint i; guint uvoff; guint8 *yd1p, *yd2p, *udp, *vdp, *p; yd1p = yp + (line * ystride) + (offs); yd2p = yd1p + ystride; uvoff = (line / yinc * uvstride) + (offs / xinc); udp = up + uvoff; vdp = vp + uvoff; p = payload; /* line 0/1: Y00-Y01-Y10-Y11-Cb00-Cr00 Y02-Y03-Y12-Y13-Cb01-Cr01 ... */ for (i = 0; i < plen; i += pgroup) { *yd1p++ = p[0]; *yd1p++ = p[1]; *yd2p++ = p[2]; *yd2p++ = p[3]; *udp++ = p[4]; *vdp++ = p[5]; p += pgroup; } break; } case GST_VIDEO_FORMAT_Y41B: { gint i; guint uvoff; guint8 *ydp, *udp, *vdp, *p; ydp = yp + (line * ystride) + (offs); uvoff = (line / yinc * uvstride) + (offs / xinc); udp = up + uvoff; vdp = vp + uvoff; p = payload; /* Samples are packed in order Cb0-Y0-Y1-Cr0-Y2-Y3 for both interlaced * and progressive scan lines */ for (i = 0; i < plen; i += pgroup) { *udp++ = p[0]; *ydp++ = p[1]; *ydp++ = p[2]; *vdp++ = p[3]; *ydp++ = p[4]; *ydp++ = p[5]; p += pgroup; } break; } default: goto unknown_sampling; } next: if (!cont) break; payload += length; payload_len -= length; } if (gst_rtp_buffer_get_marker (buf)) { GST_LOG_OBJECT (depayload, "marker, flushing frame"); if (rtpvrawdepay->outbuf) { gst_base_rtp_depayload_push_ts (depayload, timestamp, rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; } rtpvrawdepay->timestamp = -1; } return NULL; /* ERRORS */ unknown_sampling: { GST_ELEMENT_ERROR (depayload, STREAM, FORMAT, (NULL), ("unimplemented sampling")); return NULL; } alloc_failed: { GST_WARNING_OBJECT (depayload, "failed to alloc output buffer"); return NULL; } wrong_length: { GST_WARNING_OBJECT (depayload, "length not multiple of pgroup"); return NULL; } short_packet: { GST_WARNING_OBJECT (depayload, "short packet"); return NULL; } } static gboolean gst_rtp_vraw_depay_handle_event (GstBaseRTPDepayload * filter, GstEvent * event) { gboolean ret; GstRtpVRawDepay *rtpvrawdepay; rtpvrawdepay = GST_RTP_VRAW_DEPAY (filter); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_rtp_vraw_depay_reset (rtpvrawdepay); break; default: break; } ret = GST_BASE_RTP_DEPAYLOAD_CLASS (parent_class)->handle_event (filter, event); return ret; } static GstStateChangeReturn gst_rtp_vraw_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpVRawDepay *rtpvrawdepay; GstStateChangeReturn ret; rtpvrawdepay = GST_RTP_VRAW_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_vraw_depay_reset (rtpvrawdepay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_vraw_depay_reset (rtpvrawdepay); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_vraw_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpvrawdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_VRAW_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtptheoradepay.c0000644000175000017500000005154211677341656017345 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include #include "gstrtptheoradepay.h" GST_DEBUG_CATEGORY_STATIC (rtptheoradepay_debug); #define GST_CAT_DEFAULT (rtptheoradepay_debug) static GstStaticPadTemplate gst_rtp_theora_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"THEORA\"" /* All required parameters * * "sampling = (string) { "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCr-4:4:4" } " * "width = (string) [1, 1048561] (multiples of 16) " * "height = (string) [1, 1048561] (multiples of 16) " * "delivery-method = (string) { inline, in_band, out_band/ } " * "configuration = (string) ANY" */ /* All optional parameters * * "configuration-uri =" */ ) ); static GstStaticPadTemplate gst_rtp_theora_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-theora") ); GST_BOILERPLATE (GstRtpTheoraDepay, gst_rtp_theora_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_theora_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_theora_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_theora_depay_packet_lost (GstBaseRTPDepayload * depayload, GstEvent * event); static void gst_rtp_theora_depay_finalize (GObject * object); static void gst_rtp_theora_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_theora_depay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_theora_depay_src_template); gst_element_class_set_details_simple (element_class, "RTP Theora depayloader", "Codec/Depayloader/Network/RTP", "Extracts Theora video from RTP packets (draft-01 of RFC XXXX)", "Wim Taymans "); } static void gst_rtp_theora_depay_class_init (GstRtpTheoraDepayClass * klass) { GObjectClass *gobject_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_theora_depay_finalize; gstbasertpdepayload_class->process = gst_rtp_theora_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_theora_depay_setcaps; gstbasertpdepayload_class->packet_lost = gst_rtp_theora_depay_packet_lost; GST_DEBUG_CATEGORY_INIT (rtptheoradepay_debug, "rtptheoradepay", 0, "Theora RTP Depayloader"); } static void gst_rtp_theora_depay_init (GstRtpTheoraDepay * rtptheoradepay, GstRtpTheoraDepayClass * klass) { rtptheoradepay->adapter = gst_adapter_new (); } static void gst_rtp_theora_depay_finalize (GObject * object) { GstRtpTheoraDepay *rtptheoradepay = GST_RTP_THEORA_DEPAY (object); g_object_unref (rtptheoradepay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_theora_depay_parse_configuration (GstRtpTheoraDepay * rtptheoradepay, GstBuffer * confbuf) { GstBuffer *buf; guint32 num_headers; guint8 *data; guint size; gint i, j; data = GST_BUFFER_DATA (confbuf); size = GST_BUFFER_SIZE (confbuf); GST_DEBUG_OBJECT (rtptheoradepay, "config size %u", size); /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of packed headers | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | .... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ if (size < 4) goto too_small; num_headers = GST_READ_UINT32_BE (data); size -= 4; data += 4; GST_DEBUG_OBJECT (rtptheoradepay, "have %u headers", num_headers); /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | length .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | n. of headers | length1 | length2 .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Identification Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Comment Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Comment Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Setup Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Setup Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ for (i = 0; i < num_headers; i++) { guint32 ident; guint16 length; guint8 n_headers, b; GstRtpTheoraConfig *conf; guint *h_sizes; guint extra = 1; if (size < 6) goto too_small; ident = (data[0] << 16) | (data[1] << 8) | data[2]; length = (data[3] << 8) | data[4]; n_headers = data[5]; size -= 6; data += 6; GST_DEBUG_OBJECT (rtptheoradepay, "header %d, ident 0x%08x, length %u, left %u", i, ident, length, size); /* FIXME check if we already got this ident */ /* length might also include count of following size fields */ if (size < length && size + 1 != length) goto too_small; /* read header sizes we read 2 sizes, the third size (for which we allocate * space) must be derived from the total packed header length. */ h_sizes = g_newa (guint, n_headers + 1); for (j = 0; j < n_headers; j++) { guint h_size; h_size = 0; do { if (size < 1) goto too_small; b = *data++; size--; extra++; h_size = (h_size << 7) | (b & 0x7f); } while (b & 0x80); GST_DEBUG_OBJECT (rtptheoradepay, "headers %d: size: %u", j, h_size); h_sizes[j] = h_size; length -= h_size; } /* last header length is the remaining space */ GST_DEBUG_OBJECT (rtptheoradepay, "last header size: %u", length); h_sizes[j] = length; GST_DEBUG_OBJECT (rtptheoradepay, "preparing headers"); conf = g_new0 (GstRtpTheoraConfig, 1); conf->ident = ident; for (j = 0; j <= n_headers; j++) { guint h_size; h_size = h_sizes[j]; if (size < h_size) { if (j != n_headers || size + extra != h_size) { goto too_small; } else { /* otherwise means that overall length field contained total length, * including extra fields */ h_size -= extra; } } GST_DEBUG_OBJECT (rtptheoradepay, "reading header %d, size %u", j, h_size); buf = gst_buffer_new_and_alloc (h_size); memcpy (GST_BUFFER_DATA (buf), data, h_size); conf->headers = g_list_append (conf->headers, buf); data += h_size; size -= h_size; } rtptheoradepay->configs = g_list_append (rtptheoradepay->configs, conf); } return TRUE; /* ERRORS */ too_small: { GST_DEBUG_OBJECT (rtptheoradepay, "configuration too small"); return FALSE; } } static gboolean gst_rtp_theora_depay_parse_inband_configuration (GstRtpTheoraDepay * rtptheoradepay, guint ident, guint8 * configuration, guint size, guint length) { GstBuffer *confbuf; guint8 *conf; if (G_UNLIKELY (size < 4)) return FALSE; /* transform inline to out-of-band and parse that one */ confbuf = gst_buffer_new_and_alloc (size + 9); conf = GST_BUFFER_DATA (confbuf); /* 1 header */ GST_WRITE_UINT32_BE (conf, 1); /* write Ident */ GST_WRITE_UINT24_BE (conf + 4, ident); /* write sort-of-length */ GST_WRITE_UINT16_BE (conf + 7, length); /* copy remainder */ memcpy (conf + 9, configuration, size); return gst_rtp_theora_depay_parse_configuration (rtptheoradepay, confbuf); } static gboolean gst_rtp_theora_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpTheoraDepay *rtptheoradepay; GstCaps *srccaps; const gchar *configuration; gboolean res; rtptheoradepay = GST_RTP_THEORA_DEPAY (depayload); rtptheoradepay->needs_keyframe = FALSE; structure = gst_caps_get_structure (caps, 0); /* read and parse configuration string */ configuration = gst_structure_get_string (structure, "configuration"); if (configuration) { GstBuffer *confbuf; guint8 *data; gsize size; /* configure string should be in the caps */ if (configuration == NULL) goto no_configuration; /* deserialize base64 to buffer */ data = g_base64_decode (configuration, &size); confbuf = gst_buffer_new (); GST_BUFFER_DATA (confbuf) = data; GST_BUFFER_MALLOCDATA (confbuf) = data; GST_BUFFER_SIZE (confbuf) = size; if (!gst_rtp_theora_depay_parse_configuration (rtptheoradepay, confbuf)) goto invalid_configuration; } /* set caps on pad and on header */ srccaps = gst_caps_new_simple ("video/x-theora", NULL); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); /* Clock rate is always 90000 according to draft-barbato-avt-rtp-theora-01 */ depayload->clock_rate = 90000; return res; /* ERRORS */ no_configuration: { GST_ERROR_OBJECT (rtptheoradepay, "no configuration specified"); return FALSE; } invalid_configuration: { GST_ERROR_OBJECT (rtptheoradepay, "invalid configuration specified"); return FALSE; } } static gboolean gst_rtp_theora_depay_switch_codebook (GstRtpTheoraDepay * rtptheoradepay, guint32 ident) { GList *walk; gboolean res = FALSE; for (walk = rtptheoradepay->configs; walk; walk = g_list_next (walk)) { GstRtpTheoraConfig *conf = (GstRtpTheoraConfig *) walk->data; if (conf->ident == ident) { GList *headers; /* FIXME, remove pads, create new pad.. */ /* push out all the headers */ for (headers = conf->headers; headers; headers = g_list_next (headers)) { GstBuffer *header = GST_BUFFER_CAST (headers->data); gst_buffer_ref (header); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtptheoradepay), header); } /* remember the current config */ rtptheoradepay->config = conf; res = TRUE; } } if (!res) { /* we don't know about the headers, figure out an alternative method for * getting the codebooks. FIXME, fail for now. */ } return res; } static GstBuffer * gst_rtp_theora_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpTheoraDepay *rtptheoradepay; GstBuffer *outbuf; GstFlowReturn ret; gint payload_len; guint8 *payload, *to_free = NULL; guint32 timestamp; guint32 header, ident; guint8 F, TDT, packets; rtptheoradepay = GST_RTP_THEORA_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len); /* we need at least 4 bytes for the packet header */ if (G_UNLIKELY (payload_len < 4)) goto packet_short; payload = gst_rtp_buffer_get_payload (buf); header = GST_READ_UINT32_BE (payload); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | F |TDT|# pkts.| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * F: Fragment type (0=none, 1=start, 2=cont, 3=end) * TDT: Theora data type (0=theora, 1=config, 2=comment, 3=reserved) * pkts: number of packets. */ TDT = (header & 0x30) >> 4; if (G_UNLIKELY (TDT == 3)) goto ignore_reserved; ident = (header >> 8) & 0xffffff; F = (header & 0xc0) >> 6; packets = (header & 0xf); GST_DEBUG_OBJECT (depayload, "ident: 0x%08x, F: %d, TDT: %d, packets: %d", ident, F, TDT, packets); if (TDT == 0) { gboolean do_switch = FALSE; /* we have a raw payload, find the codebook for the ident */ if (!rtptheoradepay->config) { /* we don't have an active codebook, find the codebook and * activate it */ do_switch = TRUE; } else if (rtptheoradepay->config->ident != ident) { /* codebook changed */ do_switch = TRUE; } if (do_switch) { if (!gst_rtp_theora_depay_switch_codebook (rtptheoradepay, ident)) goto switch_failed; } } /* skip header */ payload += 4; payload_len -= 4; /* fragmented packets, assemble */ if (F != 0) { GstBuffer *vdata; guint headerskip; if (F == 1) { /* if we start a packet, clear adapter and start assembling. */ gst_adapter_clear (rtptheoradepay->adapter); GST_DEBUG_OBJECT (depayload, "start assemble"); rtptheoradepay->assembling = TRUE; } if (!rtptheoradepay->assembling) goto no_output; /* first assembled packet, reuse 2 bytes to store the length */ headerskip = (F == 1 ? 4 : 6); /* skip header and length. */ vdata = gst_rtp_buffer_get_payload_subbuffer (buf, headerskip, -1); GST_DEBUG_OBJECT (depayload, "assemble theora packet"); gst_adapter_push (rtptheoradepay->adapter, vdata); /* packet is not complete, we are done */ if (F != 3) goto no_output; /* construct assembled buffer */ payload_len = gst_adapter_available (rtptheoradepay->adapter); payload = gst_adapter_take (rtptheoradepay->adapter, payload_len); /* fix the length */ payload[0] = ((payload_len - 2) >> 8) & 0xff; payload[1] = (payload_len - 2) & 0xff; to_free = payload; } GST_DEBUG_OBJECT (depayload, "assemble done, payload_len %d", payload_len); /* we not assembling anymore now */ rtptheoradepay->assembling = FALSE; gst_adapter_clear (rtptheoradepay->adapter); /* payload now points to a length with that many theora data bytes. * Iterate over the packets and send them out. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | length | theora data .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. theora data | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | length | next theora packet data .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. theora data | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* */ timestamp = gst_rtp_buffer_get_timestamp (buf); while (payload_len >= 2) { guint16 length; length = GST_READ_UINT16_BE (payload); payload += 2; payload_len -= 2; GST_DEBUG_OBJECT (depayload, "read length %u, avail: %d", length, payload_len); /* skip packet if something odd happens */ if (G_UNLIKELY (length > payload_len)) goto length_short; /* handle in-band configuration */ if (G_UNLIKELY (TDT == 1)) { GST_DEBUG_OBJECT (rtptheoradepay, "in-band configuration"); if (!gst_rtp_theora_depay_parse_inband_configuration (rtptheoradepay, ident, payload, payload_len, length)) goto invalid_configuration; goto no_output; } /* create buffer for packet */ if (G_UNLIKELY (to_free)) { outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = payload; GST_BUFFER_MALLOCDATA (outbuf) = to_free; GST_BUFFER_SIZE (outbuf) = length; to_free = NULL; } else { outbuf = gst_buffer_new_and_alloc (length); memcpy (GST_BUFFER_DATA (outbuf), payload, length); } if (payload_len > 0 && (payload[0] & 0xC0) == 0x0) rtptheoradepay->needs_keyframe = FALSE; payload += length; payload_len -= length; if (timestamp != -1) /* push with timestamp of the last packet, which is the same timestamp that * should apply to the first assembled packet. */ ret = gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); else ret = gst_base_rtp_depayload_push (depayload, outbuf); if (ret != GST_FLOW_OK) break; /* make sure we don't set a timestamp on next buffers */ timestamp = -1; } g_free (to_free); if (rtptheoradepay->needs_keyframe) goto request_keyframe; return NULL; no_output: { return NULL; } /* ERORRS */ switch_failed: { GST_ELEMENT_WARNING (rtptheoradepay, STREAM, DECODE, (NULL), ("Could not switch codebooks")); goto request_config; } packet_short: { GST_ELEMENT_WARNING (rtptheoradepay, STREAM, DECODE, (NULL), ("Packet was too short (%d < 4)", payload_len)); goto request_keyframe; } ignore_reserved: { GST_WARNING_OBJECT (rtptheoradepay, "reserved TDT ignored"); return NULL; } length_short: { GST_ELEMENT_WARNING (rtptheoradepay, STREAM, DECODE, (NULL), ("Packet contains invalid data")); goto request_keyframe; } invalid_configuration: { /* fatal, as we otherwise risk carrying on without output */ GST_ELEMENT_ERROR (rtptheoradepay, STREAM, DECODE, (NULL), ("Packet contains invalid configuration")); goto request_config; } request_config: { gst_pad_push_event (GST_BASE_RTP_DEPAYLOAD_SINKPAD (depayload), gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, gst_structure_new ("GstForceKeyUnit", "all-headers", G_TYPE_BOOLEAN, TRUE, NULL))); return NULL; } request_keyframe: { rtptheoradepay->needs_keyframe = TRUE; gst_pad_push_event (GST_BASE_RTP_DEPAYLOAD_SINKPAD (depayload), gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, gst_structure_new ("GstForceKeyUnit", NULL))); return NULL; } } gboolean gst_rtp_theora_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtptheoradepay", GST_RANK_SECONDARY, GST_TYPE_RTP_THEORA_DEPAY); } static gboolean gst_rtp_theora_depay_packet_lost (GstBaseRTPDepayload * depayload, GstEvent * event) { GstRtpTheoraDepay *rtptheoradepay = GST_RTP_THEORA_DEPAY (depayload); guint seqnum = 0; gst_structure_get_uint (event->structure, "seqnum", &seqnum); GST_LOG_OBJECT (depayload, "Requested keyframe because frame with seqnum %u" " is missing", seqnum); rtptheoradepay->needs_keyframe = TRUE; gst_pad_push_event (GST_BASE_RTP_DEPAYLOAD_SINKPAD (depayload), gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, gst_structure_new ("GstForceKeyUnit", NULL))); return TRUE; } gst-plugins-good-0.10.31/gst/rtp/gstrtph264pay.h0000644000175000017500000000443611677341656016242 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_H264_PAY_H__ #define __GST_RTP_H264_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_H264_PAY \ (gst_rtp_h264_pay_get_type()) #define GST_RTP_H264_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_PAY,GstRtpH264Pay)) #define GST_RTP_H264_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_PAY,GstRtpH264PayClass)) #define GST_IS_RTP_H264_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_PAY)) #define GST_IS_RTP_H264_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_PAY)) typedef enum { GST_H264_SCAN_MODE_BYTESTREAM, GST_H264_SCAN_MODE_MULTI_NAL, GST_H264_SCAN_MODE_SINGLE_NAL } GstH264ScanMode; typedef struct _GstRtpH264Pay GstRtpH264Pay; typedef struct _GstRtpH264PayClass GstRtpH264PayClass; struct _GstRtpH264Pay { GstBaseRTPPayload payload; guint profile; GList *sps, *pps; gboolean packetized; gboolean au_alignment; guint nal_length_size; GArray *queue; gchar *sprop_parameter_sets; gboolean update_caps; GstH264ScanMode scan_mode; GstAdapter *adapter; guint spspps_interval; gboolean send_spspps; GstClockTime last_spspps; gboolean buffer_list; }; struct _GstRtpH264PayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_h264_pay_get_type (void); gboolean gst_rtp_h264_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H264_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpbvdepay.h0000644000175000017500000000347211671175354016470 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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_RTP_BV_DEPAY_H__ #define __GST_RTP_BV_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRTPBVDepay GstRTPBVDepay; typedef struct _GstRTPBVDepayClass GstRTPBVDepayClass; #define GST_TYPE_RTP_BV_DEPAY \ (gst_rtp_bv_depay_get_type()) #define GST_RTP_BV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_BV_DEPAY,GstRTPBVDepay)) #define GST_RTP_BV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_BV_DEPAY,GstRTPBVDepayClass)) #define GST_IS_RTP_BV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_BV_DEPAY)) #define GST_IS_RTP_BV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_BV_DEPAY)) struct _GstRTPBVDepay { GstBaseRTPDepayload depayload; gint mode; }; struct _GstRTPBVDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_bv_depay_get_type (void); gboolean gst_rtp_bv_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_BV_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtph264depay.c0000644000175000017500000007131211712574470016533 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include #include "gstrtph264depay.h" GST_DEBUG_CATEGORY_STATIC (rtph264depay_debug); #define GST_CAT_DEFAULT (rtph264depay_debug) #define DEFAULT_BYTE_STREAM TRUE #define DEFAULT_ACCESS_UNIT FALSE enum { PROP_0, PROP_BYTE_STREAM, PROP_ACCESS_UNIT, PROP_LAST }; /* 3 zero bytes syncword */ static const guint8 sync_bytes[] = { 0, 0, 0, 1 }; static GstStaticPadTemplate gst_rtp_h264_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h264") ); static GstStaticPadTemplate gst_rtp_h264_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") /** optional parameters **/ /* "profile-level-id = (string) ANY, " */ /* "max-mbps = (string) ANY, " */ /* "max-fs = (string) ANY, " */ /* "max-cpb = (string) ANY, " */ /* "max-dpb = (string) ANY, " */ /* "max-br = (string) ANY, " */ /* "redundant-pic-cap = (string) { \"0\", \"1\" }, " */ /* "sprop-parameter-sets = (string) ANY, " */ /* "parameter-add = (string) { \"0\", \"1\" }, " */ /* "packetization-mode = (string) { \"0\", \"1\", \"2\" }, " */ /* "sprop-interleaving-depth = (string) ANY, " */ /* "sprop-deint-buf-req = (string) ANY, " */ /* "deint-buf-cap = (string) ANY, " */ /* "sprop-init-buf-time = (string) ANY, " */ /* "sprop-max-don-diff = (string) ANY, " */ /* "max-rcmd-nalu-size = (string) ANY " */ ); GST_BOILERPLATE (GstRtpH264Depay, gst_rtp_h264_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_h264_depay_finalize (GObject * object); static void gst_rtp_h264_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_h264_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_h264_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static gboolean gst_rtp_h264_depay_handle_event (GstBaseRTPDepayload * depay, GstEvent * event); static void gst_rtp_h264_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h264_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h264_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP H264 depayloader", "Codec/Depayloader/Network/RTP", "Extracts H264 video from RTP packets (RFC 3984)", "Wim Taymans "); } static void gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_h264_depay_finalize; gobject_class->set_property = gst_rtp_h264_depay_set_property; gobject_class->get_property = gst_rtp_h264_depay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BYTE_STREAM, g_param_spec_boolean ("byte-stream", "Byte Stream", "Generate byte stream format of NALU (deprecated; use caps)", DEFAULT_BYTE_STREAM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ACCESS_UNIT, g_param_spec_boolean ("access-unit", "Access Unit", "Merge NALU into AU (picture) (deprecated; use caps)", DEFAULT_ACCESS_UNIT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = gst_rtp_h264_depay_change_state; gstbasertpdepayload_class->process = gst_rtp_h264_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_h264_depay_setcaps; gstbasertpdepayload_class->handle_event = gst_rtp_h264_depay_handle_event; GST_DEBUG_CATEGORY_INIT (rtph264depay_debug, "rtph264depay", 0, "H264 Video RTP Depayloader"); } static void gst_rtp_h264_depay_init (GstRtpH264Depay * rtph264depay, GstRtpH264DepayClass * klass) { rtph264depay->adapter = gst_adapter_new (); rtph264depay->picture_adapter = gst_adapter_new (); rtph264depay->byte_stream = DEFAULT_BYTE_STREAM; rtph264depay->merge = DEFAULT_ACCESS_UNIT; } static void gst_rtp_h264_depay_reset (GstRtpH264Depay * rtph264depay) { gst_adapter_clear (rtph264depay->adapter); rtph264depay->wait_start = TRUE; gst_adapter_clear (rtph264depay->picture_adapter); rtph264depay->picture_start = FALSE; rtph264depay->last_keyframe = FALSE; rtph264depay->last_ts = 0; rtph264depay->current_fu_type = 0; } static void gst_rtp_h264_depay_finalize (GObject * object) { GstRtpH264Depay *rtph264depay; rtph264depay = GST_RTP_H264_DEPAY (object); if (rtph264depay->codec_data) gst_buffer_unref (rtph264depay->codec_data); g_object_unref (rtph264depay->adapter); g_object_unref (rtph264depay->picture_adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_h264_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpH264Depay *rtph264depay; rtph264depay = GST_RTP_H264_DEPAY (object); switch (prop_id) { case PROP_BYTE_STREAM: rtph264depay->byte_stream = g_value_get_boolean (value); break; case PROP_ACCESS_UNIT: rtph264depay->merge = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_h264_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpH264Depay *rtph264depay; rtph264depay = GST_RTP_H264_DEPAY (object); switch (prop_id) { case PROP_BYTE_STREAM: g_value_set_boolean (value, rtph264depay->byte_stream); break; case PROP_ACCESS_UNIT: g_value_set_boolean (value, rtph264depay->merge); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_h264_depay_negotiate (GstRtpH264Depay * rtph264depay) { GstCaps *caps; gint byte_stream = -1; gint merge = -1; caps = gst_pad_get_allowed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (rtph264depay)); GST_DEBUG_OBJECT (rtph264depay, "allowed caps: %" GST_PTR_FORMAT, caps); if (caps) { if (gst_caps_get_size (caps) > 0) { GstStructure *s = gst_caps_get_structure (caps, 0); const gchar *str = NULL; if ((str = gst_structure_get_string (s, "stream-format"))) { if (strcmp (str, "avc") == 0) { byte_stream = FALSE; } else if (strcmp (str, "byte-stream") == 0) { byte_stream = TRUE; } else { GST_DEBUG_OBJECT (rtph264depay, "unknown stream-format: %s", str); } } if ((str = gst_structure_get_string (s, "alignment"))) { if (strcmp (str, "au") == 0) { merge = TRUE; } else if (strcmp (str, "nal") == 0) { merge = FALSE; } else { GST_DEBUG_OBJECT (rtph264depay, "unknown alignment: %s", str); } } } gst_caps_unref (caps); } if (byte_stream >= 0) { GST_DEBUG_OBJECT (rtph264depay, "downstream requires byte-stream %d", byte_stream); if (rtph264depay->byte_stream != byte_stream) { GST_WARNING_OBJECT (rtph264depay, "overriding property setting based on caps"); rtph264depay->byte_stream = byte_stream; } } if (merge >= 0) { GST_DEBUG_OBJECT (rtph264depay, "downstream requires merge %d", merge); if (rtph264depay->merge != merge) { GST_WARNING_OBJECT (rtph264depay, "overriding property setting based on caps"); rtph264depay->merge = merge; } } } static gboolean gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; gint clock_rate; GstStructure *structure = gst_caps_get_structure (caps, 0); GstRtpH264Depay *rtph264depay; const gchar *ps, *profile; GstBuffer *codec_data; guint8 *b64; gboolean res; rtph264depay = GST_RTP_H264_DEPAY (depayload); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/x-h264", NULL); /* Base64 encoded, comma separated config NALs */ ps = gst_structure_get_string (structure, "sprop-parameter-sets"); /* hex: AVCProfileIndication:8 | profile_compat:8 | AVCLevelIndication:8 */ profile = gst_structure_get_string (structure, "profile-level-id"); /* negotiate with downstream w.r.t. output format and alignment */ gst_rtp_h264_depay_negotiate (rtph264depay); if (rtph264depay->byte_stream && ps != NULL) { /* for bytestream we only need the parameter sets but we don't error out * when they are not there, we assume they are in the stream. */ gchar **params; guint len, total; gint i; params = g_strsplit (ps, ",", 0); /* count total number of bytes in base64. Also include the sync bytes in * front of the params. */ len = 0; for (i = 0; params[i]; i++) { len += strlen (params[i]); len += sizeof (sync_bytes); } /* we seriously overshoot the length, but it's fine. */ codec_data = gst_buffer_new_and_alloc (len); b64 = GST_BUFFER_DATA (codec_data); total = 0; for (i = 0; params[i]; i++) { guint save = 0; gint state = 0; GST_DEBUG_OBJECT (depayload, "decoding param %d (%s)", i, params[i]); memcpy (b64, sync_bytes, sizeof (sync_bytes)); b64 += sizeof (sync_bytes); len = g_base64_decode_step (params[i], strlen (params[i]), b64, &state, &save); GST_DEBUG_OBJECT (depayload, "decoded %d bytes", len); total += len + sizeof (sync_bytes); b64 += len; } GST_BUFFER_SIZE (codec_data) = total; g_strfreev (params); /* keep the codec_data, we need to send it as the first buffer. We cannot * push it in the adapter because the adapter might be flushed on discont. */ if (rtph264depay->codec_data) gst_buffer_unref (rtph264depay->codec_data); rtph264depay->codec_data = codec_data; } else if (!rtph264depay->byte_stream) { gchar **params; guint8 **sps, **pps; guint len, num_sps, num_pps; gint i; guint8 *data; if (ps == NULL) goto incomplete_caps; params = g_strsplit (ps, ",", 0); len = g_strv_length (params); GST_DEBUG_OBJECT (depayload, "we have %d params", len); sps = g_new0 (guint8 *, len + 1); pps = g_new0 (guint8 *, len + 1); num_sps = num_pps = 0; /* start with 7 bytes header */ len = 7; for (i = 0; params[i]; i++) { gsize nal_len; guint8 *nalp; guint save = 0; gint state = 0; nal_len = strlen (params[i]); nalp = g_malloc (nal_len + 2); nal_len = g_base64_decode_step (params[i], nal_len, nalp + 2, &state, &save); nalp[0] = (nal_len >> 8) & 0xff; nalp[1] = nal_len & 0xff; len += nal_len + 2; /* copy to the right list */ if ((nalp[2] & 0x1f) == 7) { GST_DEBUG_OBJECT (depayload, "adding param %d as SPS %d", i, num_sps); sps[num_sps++] = nalp; } else { GST_DEBUG_OBJECT (depayload, "adding param %d as PPS %d", i, num_pps); pps[num_pps++] = nalp; } } g_strfreev (params); if (num_sps == 0 || (GST_READ_UINT16_BE (sps[0]) < 3) || num_pps == 0) { g_strfreev ((gchar **) pps); g_strfreev ((gchar **) sps); goto incomplete_caps; } codec_data = gst_buffer_new_and_alloc (len); data = GST_BUFFER_DATA (codec_data); /* 8 bits version == 1 */ *data++ = 1; if (profile) { guint32 profile_id; /* hex: AVCProfileIndication:8 | profile_compat:8 | AVCLevelIndication:8 */ sscanf (profile, "%6x", &profile_id); *data++ = (profile_id >> 16) & 0xff; *data++ = (profile_id >> 8) & 0xff; *data++ = profile_id & 0xff; } else { /* extract from SPS */ *data++ = sps[0][3]; *data++ = sps[0][4]; *data++ = sps[0][5]; } /* 6 bits reserved | 2 bits lengthSizeMinusOn */ *data++ = 0xff; /* 3 bits reserved | 5 bits numOfSequenceParameterSets */ *data++ = 0xe0 | (num_sps & 0x1f); /* copy all SPS */ for (i = 0; sps[i]; i++) { len = ((sps[i][0] << 8) | sps[i][1]) + 2; GST_DEBUG_OBJECT (depayload, "copy SPS %d of length %d", i, len); memcpy (data, sps[i], len); g_free (sps[i]); data += len; } g_free (sps); /* 8 bits numOfPictureParameterSets */ *data++ = num_pps; /* copy all PPS */ for (i = 0; pps[i]; i++) { len = ((pps[i][0] << 8) | pps[i][1]) + 2; GST_DEBUG_OBJECT (depayload, "copy PPS %d of length %d", i, len); memcpy (data, pps[i], len); g_free (pps[i]); data += len; } g_free (pps); GST_BUFFER_SIZE (codec_data) = data - GST_BUFFER_DATA (codec_data); gst_caps_set_simple (srccaps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL); gst_buffer_unref (codec_data); } gst_caps_set_simple (srccaps, "stream-format", G_TYPE_STRING, rtph264depay->byte_stream ? "byte-stream" : "avc", "alignment", G_TYPE_STRING, rtph264depay->merge ? "au" : "nal", NULL); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ incomplete_caps: { GST_DEBUG_OBJECT (depayload, "we have incomplete caps"); gst_caps_unref (srccaps); return FALSE; } } static GstBuffer * gst_rtp_h264_complete_au (GstRtpH264Depay * rtph264depay, GstClockTime * out_timestamp, gboolean * out_keyframe) { guint outsize; GstBuffer *outbuf; /* we had a picture in the adapter and we completed it */ GST_DEBUG_OBJECT (rtph264depay, "taking completed AU"); outsize = gst_adapter_available (rtph264depay->picture_adapter); outbuf = gst_adapter_take_buffer (rtph264depay->picture_adapter, outsize); *out_timestamp = rtph264depay->last_ts; *out_keyframe = rtph264depay->last_keyframe; rtph264depay->last_keyframe = FALSE; rtph264depay->picture_start = FALSE; return outbuf; } /* SPS/PPS/IDR considered key, all others DELTA; * so downstream waiting for keyframe can pick up at SPS/PPS/IDR */ #define NAL_TYPE_IS_KEY(nt) (((nt) == 5) || ((nt) == 7) || ((nt) == 8)) static GstBuffer * gst_rtp_h264_depay_handle_nal (GstRtpH264Depay * rtph264depay, GstBuffer * nal, GstClockTime in_timestamp, gboolean marker) { GstBaseRTPDepayload *depayload = GST_BASE_RTP_DEPAYLOAD (rtph264depay); gint nal_type; guint size; guint8 *data; GstBuffer *outbuf = NULL; GstClockTime out_timestamp; gboolean keyframe, out_keyframe; size = GST_BUFFER_SIZE (nal); if (G_UNLIKELY (size < 5)) goto short_nal; data = GST_BUFFER_DATA (nal); nal_type = data[4] & 0x1f; GST_DEBUG_OBJECT (rtph264depay, "handle NAL type %d", nal_type); keyframe = NAL_TYPE_IS_KEY (nal_type); out_keyframe = keyframe; out_timestamp = in_timestamp; if (rtph264depay->merge) { gboolean start = FALSE, complete = FALSE; /* consider a coded slices (IDR or not) to start a picture, * (so ending the previous one) if first_mb_in_slice == 0 * (non-0 is part of previous one) */ /* NOTE this is not entirely according to Access Unit specs in 7.4.1.2.4, * but in practice it works in sane cases, needs not much parsing, * and also works with broken frame_num in NAL (where spec-wise would fail) */ if (nal_type == 1 || nal_type == 2 || nal_type == 5) { /* we have a picture start */ start = TRUE; if (data[5] & 0x80) { /* first_mb_in_slice == 0 completes a picture */ complete = TRUE; } } else if (nal_type >= 6 && nal_type <= 9) { /* SEI, SPS, PPS, AU terminate picture */ complete = TRUE; } GST_DEBUG_OBJECT (depayload, "start %d, complete %d", start, complete); if (complete && rtph264depay->picture_start) outbuf = gst_rtp_h264_complete_au (rtph264depay, &out_timestamp, &out_keyframe); /* add to adapter */ GST_DEBUG_OBJECT (depayload, "adding NAL to picture adapter"); gst_adapter_push (rtph264depay->picture_adapter, nal); rtph264depay->last_ts = in_timestamp; rtph264depay->last_keyframe |= keyframe; rtph264depay->picture_start |= start; if (marker) outbuf = gst_rtp_h264_complete_au (rtph264depay, &out_timestamp, &out_keyframe); } else { /* no merge, output is input nal */ GST_DEBUG_OBJECT (depayload, "using NAL as output"); outbuf = nal; } if (outbuf) { /* prepend codec_data */ if (rtph264depay->codec_data) { GST_DEBUG_OBJECT (depayload, "prepending codec_data"); outbuf = gst_buffer_join (rtph264depay->codec_data, outbuf); rtph264depay->codec_data = NULL; out_keyframe = TRUE; } outbuf = gst_buffer_make_metadata_writable (outbuf); GST_BUFFER_TIMESTAMP (outbuf) = out_timestamp; if (out_keyframe) GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); else GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); } return outbuf; /* ERRORS */ short_nal: { GST_WARNING_OBJECT (depayload, "dropping short NAL"); gst_buffer_unref (nal); return NULL; } } static GstBuffer * gst_rtp_h264_push_fragmentation_unit (GstRtpH264Depay * rtph264depay, gboolean send) { guint outsize; guint8 *outdata; GstBuffer *outbuf; outsize = gst_adapter_available (rtph264depay->adapter); outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); outdata = GST_BUFFER_DATA (outbuf); GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize); if (rtph264depay->byte_stream) { memcpy (outdata, sync_bytes, sizeof (sync_bytes)); } else { outsize -= 4; outdata[0] = (outsize >> 24); outdata[1] = (outsize >> 16); outdata[2] = (outsize >> 8); outdata[3] = (outsize); } rtph264depay->current_fu_type = 0; if (send) { outbuf = gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, rtph264depay->fu_timestamp, rtph264depay->fu_marker); if (outbuf) gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtph264depay), outbuf); return NULL; } else { return gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, rtph264depay->fu_timestamp, rtph264depay->fu_marker); } } static GstBuffer * gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpH264Depay *rtph264depay; GstBuffer *outbuf = NULL; guint8 nal_unit_type; rtph264depay = GST_RTP_H264_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { gst_adapter_clear (rtph264depay->adapter); rtph264depay->wait_start = TRUE; rtph264depay->current_fu_type = 0; } { gint payload_len; guint8 *payload; guint header_len; guint8 nal_ref_idc; guint8 *outdata; guint outsize, nalu_size; GstClockTime timestamp; gboolean marker; timestamp = GST_BUFFER_TIMESTAMP (buf); payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG_OBJECT (rtph264depay, "receiving %d bytes", payload_len); if (payload_len == 0) return NULL; /* +---------------+ * |0|1|2|3|4|5|6|7| * +-+-+-+-+-+-+-+-+ * |F|NRI| Type | * +---------------+ * * F must be 0. */ nal_ref_idc = (payload[0] & 0x60) >> 5; nal_unit_type = payload[0] & 0x1f; /* at least one byte header with type */ header_len = 1; GST_DEBUG_OBJECT (rtph264depay, "NRI %d, Type %d", nal_ref_idc, nal_unit_type); /* If FU unit was being processed, but the current nal is of a different * type. Assume that the remote payloader is buggy (didn't set the end bit * when the FU ended) and send out what we gathered thusfar */ if (G_UNLIKELY (rtph264depay->current_fu_type != 0 && nal_unit_type != rtph264depay->current_fu_type)) gst_rtp_h264_push_fragmentation_unit (rtph264depay, TRUE); switch (nal_unit_type) { case 0: case 30: case 31: /* undefined */ goto undefined_type; case 25: /* STAP-B Single-time aggregation packet 5.7.1 */ /* 2 byte extra header for DON */ header_len += 2; /* fallthrough */ case 24: { /* strip headers */ payload += header_len; payload_len -= header_len; rtph264depay->wait_start = FALSE; /* STAP-A Single-time aggregation packet 5.7.1 */ while (payload_len > 2) { /* 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | NALU Size | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ nalu_size = (payload[0] << 8) | payload[1]; /* dont include nalu_size */ if (nalu_size > (payload_len - 2)) nalu_size = payload_len - 2; outsize = nalu_size + sizeof (sync_bytes); outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); if (rtph264depay->byte_stream) { memcpy (outdata, sync_bytes, sizeof (sync_bytes)); } else { outdata[0] = outdata[1] = 0; outdata[2] = payload[0]; outdata[3] = payload[1]; } /* strip NALU size */ payload += 2; payload_len -= 2; outdata += sizeof (sync_bytes); memcpy (outdata, payload, nalu_size); gst_adapter_push (rtph264depay->adapter, outbuf); payload += nalu_size; payload_len -= nalu_size; } outsize = gst_adapter_available (rtph264depay->adapter); outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); outbuf = gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, timestamp, marker); break; } case 26: /* MTAP16 Multi-time aggregation packet 5.7.2 */ header_len = 5; /* fallthrough, not implemented */ case 27: /* MTAP24 Multi-time aggregation packet 5.7.2 */ header_len = 6; goto not_implemented; break; case 28: case 29: { /* FU-A Fragmentation unit 5.8 */ /* FU-B Fragmentation unit 5.8 */ gboolean S, E; /* +---------------+ * |0|1|2|3|4|5|6|7| * +-+-+-+-+-+-+-+-+ * |S|E|R| Type | * +---------------+ * * R is reserved and always 0 */ S = (payload[1] & 0x80) == 0x80; E = (payload[1] & 0x40) == 0x40; GST_DEBUG_OBJECT (rtph264depay, "S %d, E %d", S, E); if (rtph264depay->wait_start && !S) goto waiting_start; if (S) { /* NAL unit starts here */ guint8 nal_header; /* If a new FU unit started, while still processing an older one. * Assume that the remote payloader is buggy (doesn't set the end * bit) and send out what we've gathered thusfar */ if (G_UNLIKELY (rtph264depay->current_fu_type != 0)) gst_rtp_h264_push_fragmentation_unit (rtph264depay, TRUE); rtph264depay->current_fu_type = nal_unit_type; rtph264depay->fu_timestamp = timestamp; rtph264depay->wait_start = FALSE; /* reconstruct NAL header */ nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f); /* strip type header, keep FU header, we'll reuse it to reconstruct * the NAL header. */ payload += 1; payload_len -= 1; nalu_size = payload_len; outsize = nalu_size + sizeof (sync_bytes); outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); outdata += sizeof (sync_bytes); memcpy (outdata, payload, nalu_size); outdata[0] = nal_header; GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize); /* and assemble in the adapter */ gst_adapter_push (rtph264depay->adapter, outbuf); } else { /* strip off FU indicator and FU header bytes */ payload += 2; payload_len -= 2; outsize = payload_len; outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); memcpy (outdata, payload, outsize); GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize); /* and assemble in the adapter */ gst_adapter_push (rtph264depay->adapter, outbuf); } outbuf = NULL; rtph264depay->fu_marker = marker; /* if NAL unit ends, flush the adapter */ if (E) outbuf = gst_rtp_h264_push_fragmentation_unit (rtph264depay, FALSE); break; } default: { rtph264depay->wait_start = FALSE; /* 1-23 NAL unit Single NAL unit packet per H.264 5.6 */ /* the entire payload is the output buffer */ nalu_size = payload_len; outsize = nalu_size + sizeof (sync_bytes); outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); if (rtph264depay->byte_stream) { memcpy (outdata, sync_bytes, sizeof (sync_bytes)); } else { outdata[0] = outdata[1] = 0; outdata[2] = nalu_size >> 8; outdata[3] = nalu_size & 0xff; } outdata += sizeof (sync_bytes); memcpy (outdata, payload, nalu_size); outbuf = gst_rtp_h264_depay_handle_nal (rtph264depay, outbuf, timestamp, marker); break; } } } return outbuf; /* ERRORS */ undefined_type: { GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, (NULL), ("Undefined packet type")); return NULL; } waiting_start: { GST_DEBUG_OBJECT (rtph264depay, "waiting for start"); return NULL; } not_implemented: { GST_ELEMENT_ERROR (rtph264depay, STREAM, FORMAT, (NULL), ("NAL unit type %d not supported yet", nal_unit_type)); return NULL; } } static gboolean gst_rtp_h264_depay_handle_event (GstBaseRTPDepayload * depay, GstEvent * event) { GstRtpH264Depay *rtph264depay; rtph264depay = GST_RTP_H264_DEPAY (depay); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_rtp_h264_depay_reset (rtph264depay); break; default: break; } return GST_BASE_RTP_DEPAYLOAD_CLASS (parent_class)->handle_event (depay, event); } static GstStateChangeReturn gst_rtp_h264_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpH264Depay *rtph264depay; GstStateChangeReturn ret; rtph264depay = GST_RTP_H264_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_h264_depay_reset (rtph264depay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_h264_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtph264depay", GST_RANK_SECONDARY, GST_TYPE_RTP_H264_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpjpegpay.c0000644000175000017500000006172411677341656016502 00000000000000/* GStreamer * Copyright (C) 2008 Axis Communications * @author Bjorn Ostby * @author Peter Kjellerstedt * * 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-rtpjpegpay * * Payload encode JPEG pictures into RTP packets according to RFC 2435. * For detailed information see: http://www.rfc-editor.org/rfc/rfc2435.txt * * The payloader takes a JPEG picture, scans the header for quantization * tables (if needed) and constructs the RTP packet header followed by * the actual JPEG entropy scan. * * The payloader assumes that correct width and height is found in the caps. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include "gstrtpjpegpay.h" static GstStaticPadTemplate gst_rtp_jpeg_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg; " "video/x-jpeg") ); static GstStaticPadTemplate gst_rtp_jpeg_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " " media = (string) \"video\", " " payload = (int) 26 , " " clock-rate = (int) 90000, " " encoding-name = (string) \"JPEG\"") ); GST_DEBUG_CATEGORY_STATIC (rtpjpegpay_debug); #define GST_CAT_DEFAULT (rtpjpegpay_debug) /* * QUANT_PREFIX_LEN: * * Prefix length in the header before the quantization tables: * Two size bytes and one byte for precision */ #define QUANT_PREFIX_LEN 3 /* * DEFAULT_BUFFER_LIST: * */ #define DEFAULT_BUFFER_LIST FALSE typedef enum _RtpJpegMarker RtpJpegMarker; /* * RtpJpegMarker: * @JPEG_MARKER: Prefix for JPEG marker * @JPEG_MARKER_SOI: Start of Image marker * @JPEG_MARKER_JFIF: JFIF marker * @JPEG_MARKER_CMT: Comment marker * @JPEG_MARKER_DQT: Define Quantization Table marker * @JPEG_MARKER_SOF: Start of Frame marker * @JPEG_MARKER_DHT: Define Huffman Table marker * @JPEG_MARKER_SOS: Start of Scan marker * @JPEG_MARKER_EOI: End of Image marker * @JPEG_MARKER_DRI: Define Restart Interval marker * @JPEG_MARKER_H264: H264 marker * * Identifers for markers in JPEG header */ enum _RtpJpegMarker { JPEG_MARKER = 0xFF, JPEG_MARKER_SOI = 0xD8, JPEG_MARKER_JFIF = 0xE0, JPEG_MARKER_CMT = 0xFE, JPEG_MARKER_DQT = 0xDB, JPEG_MARKER_SOF = 0xC0, JPEG_MARKER_DHT = 0xC4, JPEG_MARKER_SOS = 0xDA, JPEG_MARKER_EOI = 0xD9, JPEG_MARKER_DRI = 0xDD, JPEG_MARKER_H264 = 0xE4 }; #define DEFAULT_JPEG_QUANT 255 #define DEFAULT_JPEG_QUALITY 255 #define DEFAULT_JPEG_TYPE 1 enum { PROP_0, PROP_JPEG_QUALITY, PROP_JPEG_TYPE, PROP_BUFFER_LIST, PROP_LAST }; enum { Q_TABLE_0 = 0, Q_TABLE_1, Q_TABLE_MAX /* only support for two tables at the moment */ }; typedef struct _RtpJpegHeader RtpJpegHeader; /* * RtpJpegHeader: * @type_spec: type specific * @offset: fragment offset * @type: type field * @q: quantization table for this frame * @width: width of image in 8-pixel multiples * @height: height of image in 8-pixel multiples * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type-specific | Fragment Offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type | Q | Width | Height | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ struct _RtpJpegHeader { guint type_spec:8; guint offset:24; guint8 type; guint8 q; guint8 width; guint8 height; }; /* * RtpQuantHeader * @mbz: must be zero * @precision: specify size of quantization tables * @length: length of quantization data * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | Precision | Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Quantization Table Data | * | ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ typedef struct { guint8 mbz; guint8 precision; guint16 length; } RtpQuantHeader; typedef struct { guint8 size; const guint8 *data; } RtpQuantTable; /* * RtpRestartMarkerHeader: * @restartInterval: number of MCUs that appear between restart markers * @restartFirstLastCount: a combination of the first packet mark in the chunk * last packet mark in the chunk and the position of the * first restart interval in the current "chunk" * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Restart Interval |F|L| Restart Count | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * The restart marker header is implemented according to the following * methodology specified in section 3.1.7 of rfc2435.txt. * * "If the restart intervals in a frame are not guaranteed to be aligned * with packet boundaries, the F (first) and L (last) bits MUST be set * to 1 and the Restart Count MUST be set to 0x3FFF. This indicates * that a receiver MUST reassemble the entire frame before decoding it." * */ typedef struct { guint16 restart_interval; guint16 restart_count; } RtpRestartMarkerHeader; typedef struct { guint8 id; guint8 samp; guint8 qt; } CompInfo; /* FIXME: restart marker header currently unsupported */ static void gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rtp_jpeg_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstFlowReturn gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); GST_BOILERPLATE (GstRtpJPEGPay, gst_rtp_jpeg_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_jpeg_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jpeg_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jpeg_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP JPEG payloader", "Codec/Payloader/Network/RTP", "Payload-encodes JPEG pictures into RTP packets (RFC 2435)", "Axis Communications "); } static void gst_rtp_jpeg_pay_class_init (GstRtpJPEGPayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_rtp_jpeg_pay_set_property; gobject_class->get_property = gst_rtp_jpeg_pay_get_property; gstbasertppayload_class->set_caps = gst_rtp_jpeg_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_jpeg_pay_handle_buffer; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_JPEG_QUALITY, g_param_spec_int ("quality", "Quality", "Quality factor on JPEG data (unused)", 0, 255, 255, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_JPEG_TYPE, g_param_spec_int ("type", "Type", "Default JPEG Type, overwritten by SOF when present", 0, 255, DEFAULT_JPEG_TYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, g_param_spec_boolean ("buffer-list", "Buffer List", "Use Buffer Lists", DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (rtpjpegpay_debug, "rtpjpegpay", 0, "Motion JPEG RTP Payloader"); } static void gst_rtp_jpeg_pay_init (GstRtpJPEGPay * pay, GstRtpJPEGPayClass * klass) { pay->quality = DEFAULT_JPEG_QUALITY; pay->quant = DEFAULT_JPEG_QUANT; pay->type = DEFAULT_JPEG_TYPE; pay->buffer_list = DEFAULT_BUFFER_LIST; } static gboolean gst_rtp_jpeg_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstStructure *caps_structure = gst_caps_get_structure (caps, 0); GstRtpJPEGPay *pay; gboolean res; gint width = 0, height = 0; pay = GST_RTP_JPEG_PAY (basepayload); /* these properties are not mandatory, we can get them from the SOF, if there * is one. */ if (gst_structure_get_int (caps_structure, "height", &height)) { if (height <= 0 || height > 2040) goto invalid_dimension; } pay->height = GST_ROUND_UP_8 (height) / 8; if (gst_structure_get_int (caps_structure, "width", &width)) { if (width <= 0 || width > 2040) goto invalid_dimension; } pay->width = GST_ROUND_UP_8 (width) / 8; gst_basertppayload_set_options (basepayload, "video", TRUE, "JPEG", 90000); res = gst_basertppayload_set_outcaps (basepayload, NULL); return res; /* ERRORS */ invalid_dimension: { GST_ERROR_OBJECT (pay, "Invalid width/height from caps"); return FALSE; } } static guint gst_rtp_jpeg_pay_header_size (const guint8 * data, guint offset) { return data[offset] << 8 | data[offset + 1]; } static guint gst_rtp_jpeg_pay_read_quant_table (const guint8 * data, guint size, guint offset, RtpQuantTable tables[]) { guint quant_size, tab_size; guint8 prec; guint8 id; if (offset + 2 > size) goto too_small; quant_size = gst_rtp_jpeg_pay_header_size (data, offset); if (quant_size < 2) goto small_quant_size; /* clamp to available data */ if (offset + quant_size > size) quant_size = size - offset; offset += 2; quant_size -= 2; while (quant_size > 0) { /* not enough to read the id */ if (offset + 1 > size) break; id = data[offset] & 0x0f; if (id == 15) /* invalid id received - corrupt data */ goto invalid_id; prec = (data[offset] & 0xf0) >> 4; if (prec) tab_size = 128; else tab_size = 64; /* there is not enough for the table */ if (quant_size < tab_size + 1) goto no_table; GST_LOG ("read quant table %d, tab_size %d, prec %02x", id, tab_size, prec); tables[id].size = tab_size; tables[id].data = &data[offset + 1]; tab_size += 1; quant_size -= tab_size; offset += tab_size; } done: return offset + quant_size; /* ERRORS */ too_small: { GST_WARNING ("not enough data"); return size; } small_quant_size: { GST_WARNING ("quant_size too small (%u < 2)", quant_size); return size; } invalid_id: { GST_WARNING ("invalid id"); goto done; } no_table: { GST_WARNING ("not enough data for table (%u < %u)", quant_size, tab_size + 1); goto done; } } static gboolean gst_rtp_jpeg_pay_read_sof (GstRtpJPEGPay * pay, const guint8 * data, guint size, guint * offset, CompInfo info[]) { guint sof_size, off; guint width, height, infolen; CompInfo elem; gint i, j; off = *offset; /* we need at least 17 bytes for the SOF */ if (off + 17 > size) goto wrong_size; sof_size = gst_rtp_jpeg_pay_header_size (data, off); if (sof_size < 17) goto wrong_length; *offset += sof_size; /* skip size */ off += 2; /* precision should be 8 */ if (data[off++] != 8) goto bad_precision; /* read dimensions */ height = data[off] << 8 | data[off + 1]; width = data[off + 2] << 8 | data[off + 3]; off += 4; GST_LOG_OBJECT (pay, "got dimensions %ux%u", height, width); if (height == 0 || height > 2040) goto invalid_dimension; if (width == 0 || width > 2040) goto invalid_dimension; pay->height = GST_ROUND_UP_8 (height) / 8; pay->width = GST_ROUND_UP_8 (width) / 8; /* we only support 3 components */ if (data[off++] != 3) goto bad_components; infolen = 0; for (i = 0; i < 3; i++) { elem.id = data[off++]; elem.samp = data[off++]; elem.qt = data[off++]; GST_LOG_OBJECT (pay, "got comp %d, samp %02x, qt %d", elem.id, elem.samp, elem.qt); /* insertion sort from the last element to the first */ for (j = infolen; j > 1; j--) { if (G_LIKELY (info[j - 1].id < elem.id)) break; info[j] = info[j - 1]; } info[j] = elem; infolen++; } /* see that the components are supported */ if (info[0].samp == 0x21) pay->type = 0; else if (info[0].samp == 0x22) pay->type = 1; else goto invalid_comp; if (!(info[1].samp == 0x11)) goto invalid_comp; if (!(info[2].samp == 0x11)) goto invalid_comp; /* the other components are free to use any quant table but they have to * have the same table id */ if (info[1].qt != info[2].qt) goto invalid_comp; return TRUE; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Wrong size %u (needed %u).", size, off + 17), (NULL)); return FALSE; } wrong_length: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Wrong SOF length %u.", sof_size), (NULL)); return FALSE; } bad_precision: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Wrong precision, expecting 8."), (NULL)); return FALSE; } invalid_dimension: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Wrong dimension, size %ux%u", width, height), (NULL)); return FALSE; } bad_components: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Wrong number of components"), (NULL)); return FALSE; } invalid_comp: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Invalid component"), (NULL)); return FALSE; } } static gboolean gst_rtp_jpeg_pay_read_dri (GstRtpJPEGPay * pay, const guint8 * data, guint size, guint * offset, RtpRestartMarkerHeader * dri) { guint dri_size, off; off = *offset; /* we need at least 4 bytes for the DRI */ if (off + 4 > size) goto wrong_size; dri_size = gst_rtp_jpeg_pay_header_size (data, off); if (dri_size < 4) goto wrong_length; *offset += dri_size; off += 2; dri->restart_interval = g_htons ((data[off] << 8) | (data[off + 1])); dri->restart_count = g_htons (0xFFFF); return dri->restart_interval > 0; wrong_size: { GST_WARNING ("not enough data for DRI"); *offset = size; return FALSE; } wrong_length: { GST_WARNING ("DRI size too small (%u)", dri_size); *offset += dri_size; return FALSE; } } static RtpJpegMarker gst_rtp_jpeg_pay_scan_marker (const guint8 * data, guint size, guint * offset) { while ((data[(*offset)++] != JPEG_MARKER) && ((*offset) < size)); if (G_UNLIKELY ((*offset) >= size)) { GST_LOG ("found EOI marker"); return JPEG_MARKER_EOI; } else { guint8 marker; marker = data[*offset]; GST_LOG ("found 0x%02x marker at offset %u", marker, *offset); (*offset)++; return marker; } } static GstFlowReturn gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpJPEGPay *pay; GstClockTime timestamp; GstFlowReturn ret = GST_FLOW_ERROR; RtpJpegHeader jpeg_header; RtpQuantHeader quant_header; RtpRestartMarkerHeader restart_marker_header; RtpQuantTable tables[15] = { {0, NULL}, }; CompInfo info[3] = { {0,}, }; guint quant_data_size; guint8 *data; guint size; guint mtu; guint bytes_left; guint jpeg_header_size = 0; guint offset; gboolean frame_done; gboolean sos_found, sof_found, dqt_found, dri_found; gint i; GstBufferList *list = NULL; GstBufferListIterator *it = NULL; pay = GST_RTP_JPEG_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (pay); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); offset = 0; GST_LOG_OBJECT (pay, "got buffer size %u, timestamp %" GST_TIME_FORMAT, size, GST_TIME_ARGS (timestamp)); /* parse the jpeg header for 'start of scan' and read quant tables if needed */ sos_found = FALSE; dqt_found = FALSE; sof_found = FALSE; dri_found = FALSE; while (!sos_found && (offset < size)) { GST_LOG_OBJECT (pay, "checking from offset %u", offset); switch (gst_rtp_jpeg_pay_scan_marker (data, size, &offset)) { case JPEG_MARKER_JFIF: case JPEG_MARKER_CMT: case JPEG_MARKER_DHT: case JPEG_MARKER_H264: GST_LOG_OBJECT (pay, "skipping marker"); offset += gst_rtp_jpeg_pay_header_size (data, offset); break; case JPEG_MARKER_SOF: if (!gst_rtp_jpeg_pay_read_sof (pay, data, size, &offset, info)) goto invalid_format; sof_found = TRUE; break; case JPEG_MARKER_DQT: GST_LOG ("DQT found"); offset = gst_rtp_jpeg_pay_read_quant_table (data, size, offset, tables); dqt_found = TRUE; break; case JPEG_MARKER_SOS: sos_found = TRUE; GST_LOG_OBJECT (pay, "SOS found"); jpeg_header_size = offset + gst_rtp_jpeg_pay_header_size (data, offset); break; case JPEG_MARKER_EOI: GST_WARNING_OBJECT (pay, "EOI reached before SOS!"); break; case JPEG_MARKER_SOI: GST_LOG_OBJECT (pay, "SOI found"); break; case JPEG_MARKER_DRI: GST_LOG_OBJECT (pay, "DRI found"); if (gst_rtp_jpeg_pay_read_dri (pay, data, size, &offset, &restart_marker_header)) dri_found = TRUE; break; default: break; } } if (!dqt_found || !sof_found) goto unsupported_jpeg; /* by now we should either have negotiated the width/height or the SOF header * should have filled us in */ if (pay->width == 0 || pay->height == 0) goto no_dimension; GST_LOG_OBJECT (pay, "header size %u", jpeg_header_size); size -= jpeg_header_size; data += jpeg_header_size; offset = 0; if (dri_found) pay->type += 64; /* prepare stuff for the jpeg header */ jpeg_header.type_spec = 0; jpeg_header.type = pay->type; jpeg_header.q = pay->quant; jpeg_header.width = pay->width; jpeg_header.height = pay->height; /* collect the quant headers sizes */ quant_header.mbz = 0; quant_header.precision = 0; quant_header.length = 0; quant_data_size = 0; if (pay->quant > 127) { /* for the Y and U component, look up the quant table and its size. quant * tables for U and V should be the same */ for (i = 0; i < 2; i++) { guint qsize; guint qt; qt = info[i].qt; if (qt >= G_N_ELEMENTS (tables)) goto invalid_quant; qsize = tables[qt].size; if (qsize == 0) goto invalid_quant; quant_header.precision |= (qsize == 64 ? 0 : (1 << i)); quant_data_size += qsize; } quant_header.length = g_htons (quant_data_size); quant_data_size += sizeof (quant_header); } GST_LOG_OBJECT (pay, "quant_data size %u", quant_data_size); if (pay->buffer_list) { list = gst_buffer_list_new (); it = gst_buffer_list_iterate (list); } bytes_left = sizeof (jpeg_header) + quant_data_size + size; if (dri_found) bytes_left += sizeof (restart_marker_header); frame_done = FALSE; do { GstBuffer *outbuf; guint8 *payload; guint payload_size = (bytes_left < mtu ? bytes_left : mtu); if (pay->buffer_list) { guint header_size; header_size = sizeof (jpeg_header) + quant_data_size; if (dri_found) header_size += sizeof (restart_marker_header); outbuf = gst_rtp_buffer_new_allocate (header_size, 0, 0); } else { outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (payload_size == bytes_left) { GST_LOG_OBJECT (pay, "last packet of frame"); frame_done = TRUE; gst_rtp_buffer_set_marker (outbuf, 1); } payload = gst_rtp_buffer_get_payload (outbuf); /* update offset */ #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) jpeg_header.offset = ((offset & 0x0000FF) << 16) | ((offset & 0xFF0000) >> 16) | (offset & 0x00FF00); #else jpeg_header.offset = offset; #endif memcpy (payload, &jpeg_header, sizeof (jpeg_header)); payload += sizeof (jpeg_header); payload_size -= sizeof (jpeg_header); if (dri_found) { memcpy (payload, &restart_marker_header, sizeof (restart_marker_header)); payload += sizeof (restart_marker_header); payload_size -= sizeof (restart_marker_header); } /* only send quant table with first packet */ if (G_UNLIKELY (quant_data_size > 0)) { memcpy (payload, &quant_header, sizeof (quant_header)); payload += sizeof (quant_header); /* copy the quant tables for luma and chrominance */ for (i = 0; i < 2; i++) { guint qsize; guint qt; qt = info[i].qt; qsize = tables[qt].size; memcpy (payload, tables[qt].data, qsize); GST_LOG_OBJECT (pay, "component %d using quant %d, size %d", i, qt, qsize); payload += qsize; } payload_size -= quant_data_size; bytes_left -= quant_data_size; quant_data_size = 0; } GST_LOG_OBJECT (pay, "sending payload size %d", payload_size); if (pay->buffer_list) { GstBuffer *paybuf; /* create a new buf to hold the payload */ paybuf = gst_buffer_create_sub (buffer, jpeg_header_size + offset, payload_size); /* create a new group to hold the rtp header and the payload */ gst_buffer_list_iterator_add_group (it); gst_buffer_list_iterator_add (it, outbuf); gst_buffer_list_iterator_add (it, paybuf); } else { memcpy (payload, data, payload_size); ret = gst_basertppayload_push (basepayload, outbuf); if (ret != GST_FLOW_OK) break; } bytes_left -= payload_size; offset += payload_size; data += payload_size; } while (!frame_done); if (pay->buffer_list) { gst_buffer_list_iterator_free (it); /* push the whole buffer list at once */ ret = gst_basertppayload_push_list (basepayload, list); } gst_buffer_unref (buffer); return ret; /* ERRORS */ unsupported_jpeg: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Unsupported JPEG"), (NULL)); gst_buffer_unref (buffer); return GST_FLOW_NOT_SUPPORTED; } no_dimension: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("No size given"), (NULL)); gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; } invalid_format: { /* error was posted */ gst_buffer_unref (buffer); return GST_FLOW_ERROR; } invalid_quant: { GST_ELEMENT_ERROR (pay, STREAM, FORMAT, ("Invalid quant tables"), (NULL)); gst_buffer_unref (buffer); return GST_FLOW_ERROR; } } static void gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpJPEGPay *rtpjpegpay; rtpjpegpay = GST_RTP_JPEG_PAY (object); switch (prop_id) { case PROP_JPEG_QUALITY: rtpjpegpay->quality = g_value_get_int (value); GST_DEBUG_OBJECT (object, "quality = %d", rtpjpegpay->quality); break; case PROP_JPEG_TYPE: rtpjpegpay->type = g_value_get_int (value); GST_DEBUG_OBJECT (object, "type = %d", rtpjpegpay->type); break; case PROP_BUFFER_LIST: rtpjpegpay->buffer_list = g_value_get_boolean (value); GST_DEBUG_OBJECT (object, "buffer_list = %d", rtpjpegpay->buffer_list); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpJPEGPay *rtpjpegpay; rtpjpegpay = GST_RTP_JPEG_PAY (object); switch (prop_id) { case PROP_JPEG_QUALITY: g_value_set_int (value, rtpjpegpay->quality); break; case PROP_JPEG_TYPE: g_value_set_int (value, rtpjpegpay->type); break; case PROP_BUFFER_LIST: g_value_set_boolean (value, rtpjpegpay->buffer_list); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_jpeg_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpjpegpay", GST_RANK_SECONDARY, GST_TYPE_RTP_JPEG_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmparobustdepay.h0000644000175000017500000000477011671175354020077 00000000000000/* GStreamer * Copyright (C) <2010> Mark Nauwelaerts * Copyright (C) <2010> Nokia Corporation * * 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_RTP_MPA_ROBUST_DEPAY_H__ #define __GST_RTP_MPA_ROBUST_DEPAY_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MPA_ROBUST_DEPAY \ (gst_rtp_mpa_robust_depay_get_type()) #define GST_RTP_MPA_ROBUST_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPA_ROBUST_DEPAY,GstRtpMPARobustDepay)) #define GST_RTP_MPA_ROBUST_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPA_ROBUST_DEPAY,GstRtpMPARobustDepayClass)) #define GST_IS_RTP_MPA_ROBUST_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPA_ROBUST_DEPAY)) #define GST_IS_RTP_MPA_ROBUST_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPA_ROBUST_DEPAY)) typedef struct _GstRtpMPARobustDepay GstRtpMPARobustDepay; typedef struct _GstRtpMPARobustDepayClass GstRtpMPARobustDepayClass; struct _GstRtpMPARobustDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; gboolean has_descriptor; /* last interleave index */ gint last_ii; /* last interleave cycle count */ gint last_icc; /* buffers pending deinterleaving */ GstBuffer *deinter[256]; /* ADU buffers pending MP3 transformation */ GQueue *adu_frames; GList *cur_adu_frame; gint offset; gint size; GstByteWriter *mp3_frame; }; struct _GstRtpMPARobustDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mpa_robust_depay_get_type (void); gboolean gst_rtp_mpa_robust_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MPA_ROBUST_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmparobustdepay.c0000644000175000017500000006114711677341656020101 00000000000000/* GStreamer * Copyright (C) <2010> Mark Nauwelaerts * Copyright (C) <2010> Nokia Corporation * * 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 #include #include #include "gstrtpmparobustdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmparobustdepay_debug); #define GST_CAT_DEFAULT (rtpmparobustdepay_debug) static GstStaticPadTemplate gst_rtp_mpa_robust_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") ); static GstStaticPadTemplate gst_rtp_mpa_robust_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA-ROBUST\" " "; " /* draft versions appear still in use out there */ "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX], " "encoding-name = (string) { \"X-MP3-DRAFT-00\", \"X-MP3-DRAFT-01\", " " \"X-MP3-DRAFT-02\", \"X-MP3-DRAFT-03\", \"X-MP3-DRAFT-04\", " " \"X-MP3-DRAFT-05\", \"X-MP3-DRAFT-06\" }") ); typedef struct _GstADUFrame { guint32 header; gint size; gint side_info; gint data_size; gint layer; gint backpointer; GstBuffer *buffer; } GstADUFrame; GST_BOILERPLATE (GstRtpMPARobustDepay, gst_rtp_mpa_robust_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static GstStateChangeReturn gst_rtp_mpa_robust_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_mpa_robust_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mpa_robust_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mpa_robust_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpa_robust_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpa_robust_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG audio depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG audio from RTP packets (RFC 5219)", "Mark Nauwelaerts "); } static void gst_rtp_mpa_robust_depay_finalize (GObject * object) { GstRtpMPARobustDepay *rtpmpadepay; rtpmpadepay = (GstRtpMPARobustDepay *) object; g_object_unref (rtpmpadepay->adapter); g_queue_free (rtpmpadepay->adu_frames); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_mpa_robust_depay_class_init (GstRtpMPARobustDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_mpa_robust_depay_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_mpa_robust_change_state); gstbasertpdepayload_class->set_caps = gst_rtp_mpa_robust_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_mpa_robust_depay_process; GST_DEBUG_CATEGORY_INIT (rtpmparobustdepay_debug, "rtpmparobustdepay", 0, "Robust MPEG Audio RTP Depayloader"); } static void gst_rtp_mpa_robust_depay_init (GstRtpMPARobustDepay * rtpmpadepay, GstRtpMPARobustDepayClass * klass) { rtpmpadepay->adapter = gst_adapter_new (); rtpmpadepay->adu_frames = g_queue_new (); } static gboolean gst_rtp_mpa_robust_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstRtpMPARobustDepay *rtpmpadepay; GstStructure *structure; GstCaps *outcaps; gint clock_rate, draft; gboolean res; const gchar *encoding; rtpmpadepay = GST_RTP_MPA_ROBUST_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; rtpmpadepay->has_descriptor = TRUE; if ((encoding = gst_structure_get_string (structure, "encoding-name"))) { if (sscanf (encoding, "X-MP3-DRAFT-%d", &draft) && (draft == 0)) rtpmpadepay->has_descriptor = FALSE; } outcaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, NULL); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); return res; } /* thanks again go to mp3parse ... */ static const guint mp3types_bitrates[2][3][16] = { { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} }, { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} }, }; static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, {22050, 24000, 16000}, {11025, 12000, 8000} }; static inline guint mp3_type_frame_length_from_header (GstElement * mp3parse, guint32 header, guint * put_version, guint * put_layer, guint * put_channels, guint * put_bitrate, guint * put_samplerate, guint * put_mode, guint * put_crc) { guint length; gulong mode, samplerate, bitrate, layer, channels, padding, crc; gulong version; gint lsf, mpg25; if (header & (1 << 20)) { lsf = (header & (1 << 19)) ? 0 : 1; mpg25 = 0; } else { lsf = 1; mpg25 = 1; } version = 1 + lsf + mpg25; layer = 4 - ((header >> 17) & 0x3); crc = (header >> 16) & 0x1; bitrate = (header >> 12) & 0xF; bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; /* The caller has ensured we have a valid header, so bitrate can't be zero here. */ if (bitrate == 0) { GST_DEBUG_OBJECT (mp3parse, "invalid bitrate"); return 0; } samplerate = (header >> 10) & 0x3; samplerate = mp3types_freqs[lsf + mpg25][samplerate]; padding = (header >> 9) & 0x1; mode = (header >> 6) & 0x3; channels = (mode == 3) ? 1 : 2; switch (layer) { case 1: length = 4 * ((bitrate * 12) / samplerate + padding); break; case 2: length = (bitrate * 144) / samplerate + padding; break; default: case 3: length = (bitrate * 144) / (samplerate << lsf) + padding; break; } GST_LOG_OBJECT (mp3parse, "Calculated mp3 frame length of %u bytes", length); GST_LOG_OBJECT (mp3parse, "samplerate = %lu, bitrate = %lu, version = %lu, " "layer = %lu, channels = %lu, mode = %lu", samplerate, bitrate, version, layer, channels, mode); if (put_version) *put_version = version; if (put_layer) *put_layer = layer; if (put_channels) *put_channels = channels; if (put_bitrate) *put_bitrate = bitrate; if (put_samplerate) *put_samplerate = samplerate; if (put_mode) *put_mode = mode; if (put_crc) *put_crc = crc; GST_LOG_OBJECT (mp3parse, "size = %u", length); return length; } /* generate empty/silent/dummy frame that mimics @frame, * except for rate, where maximum possible is selected */ static GstADUFrame * gst_rtp_mpa_robust_depay_generate_dummy_frame (GstRtpMPARobustDepay * rtpmpadepay, GstADUFrame * frame) { GstADUFrame *dummy; dummy = g_slice_dup (GstADUFrame, frame); /* go for maximum bitrate */ dummy->header = (frame->header & ~(0xf << 12)) | (0xe << 12); dummy->size = mp3_type_frame_length_from_header (GST_ELEMENT_CAST (rtpmpadepay), dummy->header, NULL, NULL, NULL, NULL, NULL, NULL, NULL); dummy->data_size = dummy->size - dummy->side_info; dummy->backpointer = 0; dummy->buffer = gst_buffer_new_and_alloc (dummy->side_info + 4); memset (GST_BUFFER_DATA (dummy->buffer), 0, dummy->side_info + 4); GST_WRITE_UINT32_BE (GST_BUFFER_DATA (dummy->buffer), dummy->header); GST_BUFFER_TIMESTAMP (dummy->buffer) = GST_BUFFER_TIMESTAMP (frame->buffer); return dummy; } /* validates and parses @buf, and queues for further transformation if valid, * otherwise discards @buf * Takes ownership of @buf. */ static gboolean gst_rtp_mpa_robust_depay_queue_frame (GstRtpMPARobustDepay * rtpmpadepay, GstBuffer * buf) { GstADUFrame *frame = NULL; guint version, layer, channels, size; guint crc; g_return_val_if_fail (buf != NULL, FALSE); if (GST_BUFFER_SIZE (buf) < 6) { goto corrupt_frame; } frame = g_slice_new0 (GstADUFrame); frame->header = GST_READ_UINT32_BE (GST_BUFFER_DATA (buf)); size = mp3_type_frame_length_from_header (GST_ELEMENT_CAST (rtpmpadepay), frame->header, &version, &layer, &channels, NULL, NULL, NULL, &crc); if (!size) goto corrupt_frame; frame->size = size; frame->layer = layer; if (version == 1 && channels == 2) frame->side_info = 32; else if ((version == 1 && channels == 1) || (version >= 2 && channels == 2)) frame->side_info = 17; else if (version >= 2 && channels == 1) frame->side_info = 9; else { g_assert_not_reached (); goto corrupt_frame; } /* backpointer */ if (layer == 3) { frame->backpointer = GST_READ_UINT16_BE (GST_BUFFER_DATA (buf) + 4); frame->backpointer >>= 7; GST_LOG_OBJECT (rtpmpadepay, "backpointer: %d", frame->backpointer); } if (!crc) frame->side_info += 2; GST_LOG_OBJECT (rtpmpadepay, "side info: %d", frame->side_info); frame->data_size = frame->size - 4 - frame->side_info; /* some size validation checks */ if (4 + frame->side_info > GST_BUFFER_SIZE (buf)) goto corrupt_frame; /* ADU data would then extend past MP3 frame, * even using past byte reservoir */ if (-frame->backpointer + (gint) (GST_BUFFER_SIZE (buf)) > frame->size) goto corrupt_frame; /* ok, take buffer and queue */ frame->buffer = buf; g_queue_push_tail (rtpmpadepay->adu_frames, frame); return TRUE; /* ERRORS */ corrupt_frame: { GST_DEBUG_OBJECT (rtpmpadepay, "frame is corrupt"); gst_buffer_unref (buf); if (frame) g_slice_free (GstADUFrame, frame); return FALSE; } } static inline void gst_rtp_mpa_robust_depay_free_frame (GstADUFrame * frame) { if (frame->buffer) gst_buffer_unref (frame->buffer); g_slice_free (GstADUFrame, frame); } static inline void gst_rtp_mpa_robust_depay_dequeue_frame (GstRtpMPARobustDepay * rtpmpadepay) { GstADUFrame *head; GST_LOG_OBJECT (rtpmpadepay, "dequeueing ADU frame"); if (rtpmpadepay->adu_frames->head == rtpmpadepay->cur_adu_frame) rtpmpadepay->cur_adu_frame = NULL; head = g_queue_pop_head (rtpmpadepay->adu_frames); g_assert (head->buffer); gst_rtp_mpa_robust_depay_free_frame (head); return; } /* returns TRUE if at least one new ADU frame was enqueued for MP3 conversion. * Takes ownership of @buf. */ static gboolean gst_rtp_mpa_robust_depay_deinterleave (GstRtpMPARobustDepay * rtpmpadepay, GstBuffer * buf) { gboolean ret = FALSE; guint8 *data; guint val, iindex, icc; data = GST_BUFFER_DATA (buf); val = GST_READ_UINT16_BE (data) >> 5; iindex = val >> 3; icc = val & 0x7; GST_LOG_OBJECT (rtpmpadepay, "sync: 0x%x, index: %u, cycle count: %u", val, iindex, icc); /* basic case; no interleaving ever seen */ if (val == 0x7ff && rtpmpadepay->last_icc < 0) { ret = gst_rtp_mpa_robust_depay_queue_frame (rtpmpadepay, buf); } else { if (G_UNLIKELY (rtpmpadepay->last_icc < 0)) { rtpmpadepay->last_icc = icc; rtpmpadepay->last_ii = iindex; } if (icc != rtpmpadepay->last_icc || iindex == rtpmpadepay->last_ii) { gint i; for (i = 0; i < 256; ++i) { if (rtpmpadepay->deinter[i] != NULL) { ret |= gst_rtp_mpa_robust_depay_queue_frame (rtpmpadepay, rtpmpadepay->deinter[i]); rtpmpadepay->deinter[i] = NULL; } } } /* rewrite buffer sync header */ val = GST_READ_UINT16_BE (buf); val = (0x7ff << 5) | val; GST_WRITE_UINT16_BE (buf, val); /* store and keep track of last indices */ rtpmpadepay->last_icc = icc; rtpmpadepay->last_ii = iindex; rtpmpadepay->deinter[iindex] = buf; } return ret; } /* Head ADU frame corresponds to mp3_frame (i.e. in header in side-info) that * is currently being written * cur_adu_frame refers to ADU frame whose data should be bytewritten next * (possibly starting from offset rather than start 0) (and is typicall tail * at time of last push round). * If at start, position where it should start writing depends on (data) sizes * of previous mp3 frames (corresponding to foregoing ADU frames) kept in size, * and its backpointer */ static GstFlowReturn gst_rtp_mpa_robust_depay_push_mp3_frames (GstRtpMPARobustDepay * rtpmpadepay) { GstBuffer *buf; GstADUFrame *frame, *head; gint av; GstFlowReturn ret = GST_FLOW_OK; while (1) { if (G_UNLIKELY (!rtpmpadepay->cur_adu_frame)) { rtpmpadepay->cur_adu_frame = rtpmpadepay->adu_frames->head; rtpmpadepay->offset = 0; rtpmpadepay->size = 0; } if (G_UNLIKELY (!rtpmpadepay->cur_adu_frame)) break; frame = (GstADUFrame *) rtpmpadepay->cur_adu_frame->data; head = (GstADUFrame *) rtpmpadepay->adu_frames->head->data; /* special case: non-layer III are sent straight through */ if (G_UNLIKELY (frame->layer != 3)) { GST_DEBUG_OBJECT (rtpmpadepay, "layer %d frame, sending as-is", frame->layer); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmpadepay), frame->buffer); frame->buffer = NULL; /* and remove it from any further consideration */ g_slice_free (GstADUFrame, frame); g_queue_delete_link (rtpmpadepay->adu_frames, rtpmpadepay->cur_adu_frame); rtpmpadepay->cur_adu_frame = NULL; continue; } if (rtpmpadepay->offset == GST_BUFFER_SIZE (frame->buffer)) { if (g_list_next (rtpmpadepay->cur_adu_frame)) { GST_LOG_OBJECT (rtpmpadepay, "moving to next ADU frame, size %d, side_info %d", frame->size, frame->side_info); rtpmpadepay->size += frame->data_size; rtpmpadepay->cur_adu_frame = g_list_next (rtpmpadepay->cur_adu_frame); frame = (GstADUFrame *) rtpmpadepay->cur_adu_frame->data; rtpmpadepay->offset = 0; /* layer I and II packets have no bitreservoir and must be sent as-is; * so flush any pending frame */ if (G_UNLIKELY (frame->layer != 3 && rtpmpadepay->mp3_frame)) goto flush; } else { break; } } if (G_UNLIKELY (!rtpmpadepay->mp3_frame)) { GST_LOG_OBJECT (rtpmpadepay, "setting up new MP3 frame of size %d, side_info %d", head->size, head->side_info); rtpmpadepay->mp3_frame = gst_byte_writer_new_with_size (head->size, TRUE); /* 0-fill possible gaps */ gst_byte_writer_fill (rtpmpadepay->mp3_frame, 0, head->size); gst_byte_writer_set_pos (rtpmpadepay->mp3_frame, 0); /* bytewriter corresponds to head frame, * i.e. the header and the side info must match */ gst_byte_writer_put_data (rtpmpadepay->mp3_frame, GST_BUFFER_DATA (head->buffer), 4 + head->side_info); } buf = frame->buffer; av = gst_byte_writer_get_remaining (rtpmpadepay->mp3_frame); GST_LOG_OBJECT (rtpmpadepay, "current mp3 frame remaining: %d", av); GST_LOG_OBJECT (rtpmpadepay, "accumulated ADU frame data_size: %d", rtpmpadepay->size); if (rtpmpadepay->offset) { /* no need to position, simply append */ g_assert (GST_BUFFER_SIZE (buf) > rtpmpadepay->offset); av = MIN (av, GST_BUFFER_SIZE (buf) - rtpmpadepay->offset); GST_LOG_OBJECT (rtpmpadepay, "appending %d bytes from ADU frame at offset %d", av, rtpmpadepay->offset); gst_byte_writer_put_data (rtpmpadepay->mp3_frame, GST_BUFFER_DATA (buf) + rtpmpadepay->offset, av); rtpmpadepay->offset += av; } else { gint pos, tpos; /* position writing according to ADU frame backpointer */ pos = gst_byte_writer_get_pos (rtpmpadepay->mp3_frame); tpos = rtpmpadepay->size - frame->backpointer + 4 + head->side_info; GST_LOG_OBJECT (rtpmpadepay, "current MP3 frame at position %d, " "starting new ADU frame data at offset %d", pos, tpos); if (tpos < pos) { GstADUFrame *dummy; /* try to insert as few frames as possible, * so go for a reasonably large dummy frame size */ GST_LOG_OBJECT (rtpmpadepay, "overlapping previous data; inserting dummy frame"); dummy = gst_rtp_mpa_robust_depay_generate_dummy_frame (rtpmpadepay, frame); g_queue_insert_before (rtpmpadepay->adu_frames, rtpmpadepay->cur_adu_frame, dummy); /* offset is known to be zero, so we can shift current one */ rtpmpadepay->cur_adu_frame = rtpmpadepay->cur_adu_frame->prev; if (!rtpmpadepay->size) { g_assert (rtpmpadepay->cur_adu_frame == rtpmpadepay->adu_frames->head); GST_LOG_OBJECT (rtpmpadepay, "... which is new head frame"); gst_byte_writer_free (rtpmpadepay->mp3_frame); rtpmpadepay->mp3_frame = NULL; } /* ... and continue adding that empty one immediately, * and then see if that provided enough extra space */ continue; } else if (tpos >= pos + av) { /* ADU frame no longer needs current MP3 frame; move to its end */ GST_LOG_OBJECT (rtpmpadepay, "passed current MP3 frame"); gst_byte_writer_set_pos (rtpmpadepay->mp3_frame, pos + av); } else { /* position and append */ GST_LOG_OBJECT (rtpmpadepay, "adding to current MP3 frame"); gst_byte_writer_set_pos (rtpmpadepay->mp3_frame, tpos); av = MIN (av, GST_BUFFER_SIZE (buf) - 4 - frame->side_info); gst_byte_writer_put_data (rtpmpadepay->mp3_frame, GST_BUFFER_DATA (buf) + 4 + frame->side_info, av); rtpmpadepay->offset += av + 4 + frame->side_info; } } /* if mp3 frame filled, send on its way */ if (gst_byte_writer_get_remaining (rtpmpadepay->mp3_frame) == 0) { flush: buf = gst_byte_writer_free_and_get_buffer (rtpmpadepay->mp3_frame); rtpmpadepay->mp3_frame = NULL; GST_BUFFER_TIMESTAMP (buf) = GST_BUFFER_TIMESTAMP (head->buffer); /* no longer need head ADU frame header and side info */ /* NOTE maybe head == current, then size and offset go off a bit, * but current gets reset to NULL, and then also offset and size */ rtpmpadepay->size -= head->data_size; gst_rtp_mpa_robust_depay_dequeue_frame (rtpmpadepay); /* send */ ret = gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmpadepay), buf); } } return ret; } /* process ADU frame @buf through: * - deinterleaving * - converting to MP3 frames * Takes ownership of @buf. */ static GstFlowReturn gst_rtp_mpa_robust_depay_submit_adu (GstRtpMPARobustDepay * rtpmpadepay, GstBuffer * buf) { if (gst_rtp_mpa_robust_depay_deinterleave (rtpmpadepay, buf)) return gst_rtp_mpa_robust_depay_push_mp3_frames (rtpmpadepay); return GST_FLOW_OK; } static GstBuffer * gst_rtp_mpa_robust_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMPARobustDepay *rtpmpadepay; gint payload_len, offset; guint8 *payload; gboolean cont, dtype; guint av, size; GstClockTime timestamp; rtpmpadepay = GST_RTP_MPA_ROBUST_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); timestamp = GST_BUFFER_TIMESTAMP (buf); if (payload_len <= 1) goto short_read; payload = gst_rtp_buffer_get_payload (buf); offset = 0; GST_LOG_OBJECT (rtpmpadepay, "payload_len: %d", payload_len); /* strip off descriptor * * 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |C|T| ADU size | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * C: if 1, data is continuation * T: if 1, size is 14 bits, otherwise 6 bits * ADU size: size of following packet (not including descriptor) */ while (payload_len) { if (G_LIKELY (rtpmpadepay->has_descriptor)) { cont = !!(payload[offset] & 0x80); dtype = !!(payload[offset] & 0x40); if (dtype) { size = (payload[offset] & 0x3f) << 8 | payload[offset + 1]; payload_len--; offset++; } else if (payload_len >= 2) { size = (payload[offset] & 0x3f); payload_len -= 2; offset += 2; } else { goto short_read; } } else { cont = FALSE; dtype = -1; size = payload_len; } GST_LOG_OBJECT (rtpmpadepay, "offset %d has cont: %d, dtype: %d, size: %d", offset, cont, dtype, size); buf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, MIN (size, payload_len)); if (cont) { av = gst_adapter_available (rtpmpadepay->adapter); if (G_UNLIKELY (!av)) { GST_DEBUG_OBJECT (rtpmpadepay, "discarding continuation fragment without prior fragment"); gst_buffer_unref (buf); } else { av += GST_BUFFER_SIZE (buf); gst_adapter_push (rtpmpadepay->adapter, buf); if (av == size) { timestamp = gst_adapter_prev_timestamp (rtpmpadepay->adapter, NULL); buf = gst_adapter_take_buffer (rtpmpadepay->adapter, size); GST_BUFFER_TIMESTAMP (buf) = timestamp; gst_rtp_mpa_robust_depay_submit_adu (rtpmpadepay, buf); } else if (av > size) { GST_DEBUG_OBJECT (rtpmpadepay, "assembled ADU size %d larger than expected %d; discarding", av, size); gst_adapter_clear (rtpmpadepay->adapter); } } size = payload_len; } else { /* not continuation, first fragment or whole ADU */ if (payload_len == size) { /* whole ADU */ GST_BUFFER_TIMESTAMP (buf) = timestamp; gst_rtp_mpa_robust_depay_submit_adu (rtpmpadepay, buf); } else if (payload_len < size) { /* first fragment */ gst_adapter_push (rtpmpadepay->adapter, buf); size = payload_len; } } offset += size; payload_len -= size; /* timestamp applies to first payload, no idea for subsequent ones */ timestamp = GST_CLOCK_TIME_NONE; } return NULL; /* ERRORS */ short_read: { GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, (NULL), ("Packet contains invalid data")); return NULL; } } static GstStateChangeReturn gst_rtp_mpa_robust_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRtpMPARobustDepay *rtpmpadepay; rtpmpadepay = GST_RTP_MPA_ROBUST_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: rtpmpadepay->last_ii = -1; rtpmpadepay->last_icc = -1; rtpmpadepay->size = 0; rtpmpadepay->offset = 0; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret != GST_STATE_CHANGE_SUCCESS) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: { gint i; gst_adapter_clear (rtpmpadepay->adapter); for (i = 0; i < G_N_ELEMENTS (rtpmpadepay->deinter); i++) { gst_buffer_replace (&rtpmpadepay->deinter[i], NULL); } rtpmpadepay->cur_adu_frame = NULL; g_queue_foreach (rtpmpadepay->adu_frames, (GFunc) gst_rtp_mpa_robust_depay_free_frame, NULL); g_queue_clear (rtpmpadepay->adu_frames); break; } default: break; } return ret; } gboolean gst_rtp_mpa_robust_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmparobustdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MPA_ROBUST_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpamrpay.h0000644000175000017500000000403511671175354016323 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_AMR_PAY_H__ #define __GST_RTP_AMR_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_AMR_PAY \ (gst_rtp_amr_pay_get_type()) #define GST_RTP_AMR_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AMR_PAY,GstRtpAMRPay)) #define GST_RTP_AMR_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AMR_PAY,GstRtpAMRPayClass)) #define GST_IS_RTP_AMR_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AMR_PAY)) #define GST_IS_RTP_AMR_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AMR_PAY)) typedef struct _GstRtpAMRPay GstRtpAMRPay; typedef struct _GstRtpAMRPayClass GstRtpAMRPayClass; typedef enum { GST_RTP_AMR_P_MODE_INVALID = 0, GST_RTP_AMR_P_MODE_NB = 1, GST_RTP_AMR_P_MODE_WB = 2 } GstRtpAMRPayMode; struct _GstRtpAMRPay { GstBaseRTPPayload payload; GstRtpAMRPayMode mode; GstClockTime first_ts; guint32 first_rtp_time; guint32 next_rtp_time; }; struct _GstRtpAMRPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_amr_pay_get_type (void); gboolean gst_rtp_amr_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_AMR_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg729depay.c0000644000175000017500000001353611677341656016554 00000000000000/* GStreamer * * 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 #include #include #include "gstrtpg729depay.h" GST_DEBUG_CATEGORY_STATIC (rtpg729depay_debug); #define GST_CAT_DEFAULT (rtpg729depay_debug) /* references: * * RFC 3551 (4.5.6) */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; /* input is an RTP packet * */ static GstStaticPadTemplate gst_rtp_g729_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"G729\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_G729_STRING ", " "clock-rate = (int) 8000") ); static GstStaticPadTemplate gst_rtp_g729_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/G729, " "channels = (int) 1," "rate = (int) 8000") ); static gboolean gst_rtp_g729_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_g729_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); GST_BOILERPLATE (GstRtpG729Depay, gst_rtp_g729_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_g729_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g729_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g729_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP G.729 depayloader", "Codec/Depayloader/Network/RTP", "Extracts G.729 audio from RTP packets (RFC 3551)", "Laurent Glayal "); GST_DEBUG_CATEGORY_INIT (rtpg729depay_debug, "rtpg729depay", 0, "G.729 RTP Depayloader"); } static void gst_rtp_g729_depay_class_init (GstRtpG729DepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_g729_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_g729_depay_setcaps; } static void gst_rtp_g729_depay_init (GstRtpG729Depay * rtpg729depay, GstRtpG729DepayClass * klass) { GstBaseRTPDepayload *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtpg729depay); gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); } static gboolean gst_rtp_g729_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstCaps *srccaps; GstRtpG729Depay *rtpg729depay; const gchar *params; gint clock_rate, channels; gboolean ret; rtpg729depay = GST_RTP_G729_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!(params = gst_structure_get_string (structure, "encoding-params"))) channels = 1; else { channels = atoi (params); } if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; if (channels != 1) goto wrong_channels; if (clock_rate != 8000) goto wrong_clock_rate; depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("audio/G729", "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, clock_rate, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; /* ERRORS */ wrong_channels: { GST_DEBUG_OBJECT (rtpg729depay, "expected 1 channel, got %d", channels); return FALSE; } wrong_clock_rate: { GST_DEBUG_OBJECT (rtpg729depay, "expected 8000 clock-rate, got %d", clock_rate); return FALSE; } } static GstBuffer * gst_rtp_g729_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpG729Depay *rtpg729depay; GstBuffer *outbuf = NULL; gint payload_len; gboolean marker; rtpg729depay = GST_RTP_G729_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); /* At least 2 bytes (CNG from G729 Annex B) */ if (payload_len < 2) { GST_ELEMENT_WARNING (rtpg729depay, STREAM, DECODE, (NULL), ("G729 RTP payload too small (%d)", payload_len)); goto bad_packet; } GST_LOG_OBJECT (rtpg729depay, "payload len %d", payload_len); if ((payload_len % 10) == 2) { GST_LOG_OBJECT (rtpg729depay, "G729 payload contains CNG frame"); } outbuf = gst_rtp_buffer_get_payload_buffer (buf); marker = gst_rtp_buffer_get_marker (buf); if (marker) { /* marker bit starts talkspurt */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } GST_LOG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; /* ERRORS */ bad_packet: { /* no fatal error */ return NULL; } } gboolean gst_rtp_g729_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg729depay", GST_RANK_SECONDARY, GST_TYPE_RTP_G729_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstasteriskh263.h0000644000175000017500000000357311671175354016542 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_ASTERISK_H263_H__ #define __GST_ASTERISK_H263_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_ASTERISK_H263 \ (gst_asteriskh263_get_type()) #define GST_ASTERISK_H263(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ASTERISK_H263,GstAsteriskh263)) #define GST_ASTERISK_H263_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ASTERISK_H263,GstAsteriskh263Class)) #define GST_IS_ASTERISK_H263(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ASTERISK_H263)) #define GST_IS_ASTERISK_H263_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ASTERISK_H263)) typedef struct _GstAsteriskh263 GstAsteriskh263; typedef struct _GstAsteriskh263Class GstAsteriskh263Class; struct _GstAsteriskh263 { GstElement element; GstPad *sinkpad; GstPad *srcpad; GstAdapter *adapter; guint32 lastts; }; struct _GstAsteriskh263Class { GstElementClass parent_class; }; GType gst_asteriskh263_get_type (void); gboolean gst_asteriskh263_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_ASTERISK_H263_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpvrawpay.c0000644000175000017500000004636311677341656016536 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include "gstrtpvrawpay.h" GST_DEBUG_CATEGORY_STATIC (rtpvrawpay_debug); #define GST_CAT_DEFAULT (rtpvrawpay_debug) static GstStaticPadTemplate gst_rtp_vraw_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-rgb, " "bpp = (int) 24, " "depth = (int) 24, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) 0x00FF0000, " "green_mask = (int) 0x0000FF00, " "blue_mask = (int) 0x000000FF, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; " "video/x-raw-rgb, " "bpp = (int) 32, " "depth = (int) 32, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) 0xFF000000, " "green_mask = (int) 0x00FF0000, " "blue_mask = (int) 0x0000FF00, " "alpha_mask = (int) 0x000000FF, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; " "video/x-raw-rgb, " "bpp = (int) 24, " "depth = (int) 24, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) 0x000000FF, " "green_mask = (int) 0x0000FF00, " "blue_mask = (int) 0x00FF0000, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; " "video/x-raw-rgb, " "bpp = (int) 32, " "depth = (int) 32, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) 0x0000FF00, " "green_mask = (int) 0x00FF0000, " "blue_mask = (int) 0xFF000000, " "alpha_mask = (int) 0x000000FF, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; " "video/x-raw-yuv, " "format = (fourcc) { AYUV, UYVY, I420, Y41B, UYVP }, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; ") ); static GstStaticPadTemplate gst_rtp_vraw_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"RAW\"," "sampling = (string) { \"RGB\", \"RGBA\", \"BGR\", \"BGRA\", " "\"YCbCr-4:4:4\", \"YCbCr-4:2:2\", \"YCbCr-4:2:0\", " "\"YCbCr-4:1:1\" }," /* we cannot express these as strings * "width = (string) [1 32767]," * "height = (string) [1 32767]," */ "depth = (string) { \"8\", \"10\", \"12\", \"16\" }," "colorimetry = (string) { \"BT601-5\", \"BT709-2\", \"SMPTE240M\" }" /* optional * interlace = * top-field-first = * chroma-position = (string) * gamma = (float) */ ) ); static gboolean gst_rtp_vraw_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_vraw_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpVRawPay, gst_rtp_vraw_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_vraw_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vraw_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vraw_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP Raw Video payloader", "Codec/Payloader/Network/RTP", "Payload raw video as RTP packets (RFC 4175)", "Wim Taymans "); } static void gst_rtp_vraw_pay_class_init (GstRtpVRawPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_vraw_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_vraw_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpvrawpay_debug, "rtpvrawpay", 0, "Raw video RTP Payloader"); } static void gst_rtp_vraw_pay_init (GstRtpVRawPay * rtpvrawpay, GstRtpVRawPayClass * klass) { } static gboolean gst_rtp_vraw_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { GstRtpVRawPay *rtpvrawpay; GstStructure *s; gboolean res; const gchar *name; gint width, height; gint yp, up, vp; gint pgroup, ystride, uvstride = 0, xinc, yinc; GstVideoFormat sampling; const gchar *depthstr, *samplingstr, *colorimetrystr; gchar *wstr, *hstr; gboolean interlaced; const gchar *color_matrix; gint depth; rtpvrawpay = GST_RTP_VRAW_PAY (payload); s = gst_caps_get_structure (caps, 0); /* start parsing the format */ name = gst_structure_get_name (s); /* these values are the only thing we can do */ depthstr = "8"; /* parse common width/height */ res = gst_structure_get_int (s, "width", &width); res &= gst_structure_get_int (s, "height", &height); if (!res) goto missing_dimension; if (!gst_structure_get_boolean (s, "interlaced", &interlaced)) interlaced = FALSE; color_matrix = gst_structure_get_string (s, "color-matrix"); colorimetrystr = "SMPTE240M"; if (color_matrix) { if (g_str_equal (color_matrix, "sdtv")) { /* BT.601 implies a bit more than just color-matrix */ colorimetrystr = "BT601-5"; } else if (g_str_equal (color_matrix, "hdtv")) { colorimetrystr = "BT709-2"; } } yp = up = vp = 0; xinc = yinc = 1; if (!strcmp (name, "video/x-raw-rgb")) { gint amask, rmask; gboolean has_alpha; has_alpha = gst_structure_get_int (s, "alpha_mask", &amask); depth = 8; if (!gst_structure_get_int (s, "red_mask", &rmask)) goto unknown_mask; if (has_alpha) { pgroup = 4; ystride = width * 4; if (rmask == 0xFF000000) { sampling = GST_VIDEO_FORMAT_RGBA; samplingstr = "RGBA"; } else { sampling = GST_VIDEO_FORMAT_BGRA; samplingstr = "BGRA"; } } else { pgroup = 3; ystride = GST_ROUND_UP_4 (width * 3); if (rmask == 0x00FF0000) { sampling = GST_VIDEO_FORMAT_RGB; samplingstr = "RGB"; } else { sampling = GST_VIDEO_FORMAT_BGR; samplingstr = "BGR"; } } } else if (!strcmp (name, "video/x-raw-yuv")) { guint32 fourcc; if (!gst_structure_get_fourcc (s, "format", &fourcc)) goto unknown_fourcc; GST_LOG_OBJECT (payload, "have fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); switch (fourcc) { case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): sampling = GST_VIDEO_FORMAT_AYUV; samplingstr = "YCbCr-4:4:4"; pgroup = 3; ystride = width * 4; depth = 8; break; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): sampling = GST_VIDEO_FORMAT_UYVY; samplingstr = "YCbCr-4:2:2"; pgroup = 4; xinc = 2; ystride = GST_ROUND_UP_2 (width) * 2; depth = 8; break; case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): sampling = GST_VIDEO_FORMAT_Y41B; samplingstr = "YCbCr-4:1:1"; pgroup = 6; xinc = 4; ystride = GST_ROUND_UP_4 (width); uvstride = GST_ROUND_UP_8 (width) / 4; up = ystride * height; vp = up + uvstride * height; depth = 8; break; case GST_MAKE_FOURCC ('I', '4', '2', '0'): sampling = GST_VIDEO_FORMAT_I420; samplingstr = "YCbCr-4:2:0"; pgroup = 6; xinc = yinc = 2; ystride = GST_ROUND_UP_4 (width); uvstride = GST_ROUND_UP_8 (width) / 2; up = ystride * GST_ROUND_UP_2 (height); vp = up + uvstride * GST_ROUND_UP_2 (height) / 2; depth = 8; break; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'): #define GST_VIDEO_FORMAT_UYVP GST_VIDEO_FORMAT_UYVY /* FIXME */ sampling = GST_VIDEO_FORMAT_UYVP; samplingstr = "YCbCr-4:2:2"; pgroup = 4; xinc = 2; ystride = GST_ROUND_UP_2 (width) * 2; depth = 10; break; default: goto unknown_fourcc; } } else goto unknown_format; if (interlaced) { yinc *= 2; } if (depth == 10) { depthstr = "10"; } rtpvrawpay->width = width; rtpvrawpay->height = height; rtpvrawpay->sampling = sampling; rtpvrawpay->pgroup = pgroup; rtpvrawpay->xinc = xinc; rtpvrawpay->yinc = yinc; rtpvrawpay->yp = yp; rtpvrawpay->up = up; rtpvrawpay->vp = vp; rtpvrawpay->ystride = ystride; rtpvrawpay->uvstride = uvstride; rtpvrawpay->interlaced = interlaced; rtpvrawpay->depth = depth; GST_DEBUG_OBJECT (payload, "width %d, height %d, sampling %d", width, height, sampling); GST_DEBUG_OBJECT (payload, "yp %d, up %d, vp %d", yp, up, vp); GST_DEBUG_OBJECT (payload, "pgroup %d, ystride %d, uvstride %d", pgroup, ystride, uvstride); wstr = g_strdup_printf ("%d", rtpvrawpay->width); hstr = g_strdup_printf ("%d", rtpvrawpay->height); gst_basertppayload_set_options (payload, "video", TRUE, "RAW", 90000); if (interlaced) { res = gst_basertppayload_set_outcaps (payload, "sampling", G_TYPE_STRING, samplingstr, "depth", G_TYPE_STRING, depthstr, "width", G_TYPE_STRING, wstr, "height", G_TYPE_STRING, hstr, "colorimetry", G_TYPE_STRING, colorimetrystr, "interlace", G_TYPE_STRING, "true", NULL); } else { res = gst_basertppayload_set_outcaps (payload, "sampling", G_TYPE_STRING, samplingstr, "depth", G_TYPE_STRING, depthstr, "width", G_TYPE_STRING, wstr, "height", G_TYPE_STRING, hstr, "colorimetry", G_TYPE_STRING, colorimetrystr, NULL); } g_free (wstr); g_free (hstr); return res; /* ERRORS */ unknown_mask: { GST_ERROR_OBJECT (payload, "unknown red mask specified"); return FALSE; } unknown_format: { GST_ERROR_OBJECT (payload, "unknown caps format"); return FALSE; } unknown_fourcc: { GST_ERROR_OBJECT (payload, "invalid or missing fourcc"); return FALSE; } missing_dimension: { GST_ERROR_OBJECT (payload, "missing width or height property"); return FALSE; } } static GstFlowReturn gst_rtp_vraw_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) { GstRtpVRawPay *rtpvrawpay; GstFlowReturn ret = GST_FLOW_OK; guint line, offset; guint8 *data, *yp, *up, *vp; guint ystride, uvstride; guint size, pgroup; guint mtu; guint width, height; gint field; rtpvrawpay = GST_RTP_VRAW_PAY (payload); data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); GST_LOG_OBJECT (rtpvrawpay, "new frame of %u bytes", size); /* get pointer and strides of the planes */ yp = data + rtpvrawpay->yp; up = data + rtpvrawpay->up; vp = data + rtpvrawpay->vp; ystride = rtpvrawpay->ystride; uvstride = rtpvrawpay->uvstride; mtu = GST_BASE_RTP_PAYLOAD_MTU (payload); /* amount of bytes for one pixel */ pgroup = rtpvrawpay->pgroup; width = rtpvrawpay->width; height = rtpvrawpay->height; /* start with line 0, offset 0 */ for (field = 0; field < 1 + rtpvrawpay->interlaced; field++) { line = field; offset = 0; /* write all lines */ while (line < height) { guint left; GstBuffer *out; guint8 *outdata, *headers; gboolean next_line; guint length, cont, pixels; /* get the max allowed payload length size, we try to fill the complete MTU */ left = gst_rtp_buffer_calc_payload_len (mtu, 0, 0); out = gst_rtp_buffer_new_allocate (left, 0, 0); if (field == 0) { GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (buffer); } else { GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer) / 2; } outdata = gst_rtp_buffer_get_payload (out); GST_LOG_OBJECT (rtpvrawpay, "created buffer of size %u for MTU %u", left, mtu); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Extended Sequence Number | Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |F| Line No |C| Offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Length |F| Line No | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |C| Offset | . * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ . * . . * . Two (partial) lines of video data . * . . * +---------------------------------------------------------------+ */ /* need 2 bytes for the extended sequence number */ *outdata++ = 0; *outdata++ = 0; left -= 2; /* the headers start here */ headers = outdata; /* while we can fit at least one header and one pixel */ while (left > (6 + pgroup)) { /* we need a 6 bytes header */ left -= 6; /* get how may bytes we need for the remaining pixels */ pixels = width - offset; length = (pixels * pgroup) / rtpvrawpay->xinc; if (left >= length) { /* pixels and header fit completely, we will write them and skip to the * next line. */ next_line = TRUE; } else { /* line does not fit completely, see how many pixels fit */ pixels = (left / pgroup) * rtpvrawpay->xinc; length = (pixels * pgroup) / rtpvrawpay->xinc; next_line = FALSE; } GST_LOG_OBJECT (rtpvrawpay, "filling %u bytes in %u pixels", length, pixels); left -= length; /* write length */ *outdata++ = (length >> 8) & 0xff; *outdata++ = length & 0xff; /* write line no */ *outdata++ = ((line >> 8) & 0x7f) | ((field << 7) & 0x80); *outdata++ = line & 0xff; if (next_line) { /* go to next line we do this here to make the check below easier */ line += rtpvrawpay->yinc; } /* calculate continuation marker */ cont = (left > (6 + pgroup) && line < height) ? 0x80 : 0x00; /* write offset and continuation marker */ *outdata++ = ((offset >> 8) & 0x7f) | cont; *outdata++ = offset & 0xff; if (next_line) { /* reset offset */ offset = 0; GST_LOG_OBJECT (rtpvrawpay, "go to next line %u", line); } else { offset += pixels; GST_LOG_OBJECT (rtpvrawpay, "next offset %u", offset); } if (!cont) break; } GST_LOG_OBJECT (rtpvrawpay, "consumed %u bytes", (guint) (outdata - headers)); /* second pass, read headers and write the data */ while (TRUE) { guint offs, lin; /* read length and cont */ length = (headers[0] << 8) | headers[1]; lin = ((headers[2] & 0x7f) << 8) | headers[3]; offs = ((headers[4] & 0x7f) << 8) | headers[5]; cont = headers[4] & 0x80; pixels = length / pgroup; headers += 6; GST_LOG_OBJECT (payload, "writing length %u, line %u, offset %u, cont %d", length, lin, offs, cont); switch (rtpvrawpay->sampling) { case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGR: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_UYVY: offs /= rtpvrawpay->xinc; memcpy (outdata, yp + (lin * ystride) + (offs * pgroup), length); outdata += length; break; case GST_VIDEO_FORMAT_AYUV: { gint i; guint8 *datap; datap = yp + (lin * ystride) + (offs * 4); for (i = 0; i < pixels; i++) { *outdata++ = datap[2]; *outdata++ = datap[1]; *outdata++ = datap[3]; datap += 4; } break; } case GST_VIDEO_FORMAT_I420: { gint i; guint uvoff; guint8 *yd1p, *yd2p, *udp, *vdp; yd1p = yp + (lin * ystride) + (offs); yd2p = yd1p + ystride; uvoff = (lin / rtpvrawpay->yinc * uvstride) + (offs / rtpvrawpay->xinc); udp = up + uvoff; vdp = vp + uvoff; for (i = 0; i < pixels; i++) { *outdata++ = *yd1p++; *outdata++ = *yd1p++; *outdata++ = *yd2p++; *outdata++ = *yd2p++; *outdata++ = *udp++; *outdata++ = *vdp++; } break; } case GST_VIDEO_FORMAT_Y41B: { gint i; guint uvoff; guint8 *ydp, *udp, *vdp; ydp = yp + (lin * ystride) + offs; uvoff = (lin / rtpvrawpay->yinc * uvstride) + (offs / rtpvrawpay->xinc); udp = up + uvoff; vdp = vp + uvoff; for (i = 0; i < pixels; i++) { *outdata++ = *udp++; *outdata++ = *ydp++; *outdata++ = *ydp++; *outdata++ = *vdp++; *outdata++ = *ydp++; *outdata++ = *ydp++; } break; } default: gst_buffer_unref (out); goto unknown_sampling; } if (!cont) break; } if (line >= height) { GST_LOG_OBJECT (rtpvrawpay, "field/frame complete, set marker"); gst_rtp_buffer_set_marker (out, TRUE); } if (left > 0) { GST_LOG_OBJECT (rtpvrawpay, "we have %u bytes left", left); GST_BUFFER_SIZE (out) -= left; } /* push buffer */ ret = gst_basertppayload_push (payload, out); } } gst_buffer_unref (buffer); return ret; /* ERRORS */ unknown_sampling: { GST_ELEMENT_ERROR (payload, STREAM, FORMAT, (NULL), ("unimplemented sampling")); gst_buffer_unref (buffer); return GST_FLOW_NOT_SUPPORTED; } } gboolean gst_rtp_vraw_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpvrawpay", GST_RANK_SECONDARY, GST_TYPE_RTP_VRAW_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpgstpay.c0000644000175000017500000001554011677341656016345 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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 #include #include "gstrtpgstpay.h" /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |C| CV |D|X|Y|Z| MBZ | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * C: caps inlined flag * When C set, first part of payload contains caps definition. Caps definition * starts with variable-length length prefix and then a string of that length. * the length is encoded in big endian 7 bit chunks, the top 1 bit of a byte * is the continuation marker and the 7 next bits the data. A continuation * marker of 1 means that the next byte contains more data. * * CV: caps version, 0 = caps from SDP, 1 - 7 inlined caps * D: delta unit buffer * X: media 1 flag * Y: media 2 flag * Z: media 3 flag * * */ static GstStaticPadTemplate gst_rtp_gst_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_rtp_gst_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"application\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"X-GST\"") ); static gboolean gst_rtp_gst_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_gst_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpGSTPay, gst_rtp_gst_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_gst_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gst_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gst_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP GStreamer payloader", "Codec/Payloader/Network/RTP", "Payload GStreamer buffers as RTP packets", "Wim Taymans "); } static void gst_rtp_gst_pay_class_init (GstRtpGSTPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_gst_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_gst_pay_handle_buffer; } static void gst_rtp_gst_pay_init (GstRtpGSTPay * rtpgstpay, GstRtpGSTPayClass * klass) { } static gboolean gst_rtp_gst_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; gchar *capsstr, *capsenc; capsstr = gst_caps_to_string (caps); capsenc = g_base64_encode ((guchar *) capsstr, strlen (capsstr)); g_free (capsstr); gst_basertppayload_set_options (payload, "application", TRUE, "X-GST", 90000); res = gst_basertppayload_set_outcaps (payload, "caps", G_TYPE_STRING, capsenc, NULL); g_free (capsenc); return res; } static GstFlowReturn gst_rtp_gst_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpGSTPay *rtpgstpay; guint8 *data; guint size; GstBuffer *outbuf; GstFlowReturn ret; GstClockTime timestamp; guint32 frag_offset; guint flags; rtpgstpay = GST_RTP_GST_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); ret = GST_FLOW_OK; /* caps always from SDP for now */ flags = 0; if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)) flags |= (1 << 3); if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MEDIA1)) flags |= (1 << 2); if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MEDIA2)) flags |= (1 << 1); if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_MEDIA3)) flags |= (1 << 0); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |C| CV |D|X|Y|Z| MBZ | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ frag_offset = 0; while (size > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total lenght of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (8 + size, 0, 0); /* fill one MTU or all available bytes */ towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpgstpay)); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); /* create buffer to hold the payload */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); payload = gst_rtp_buffer_get_payload (outbuf); payload[0] = flags; payload[1] = payload[2] = payload[3] = 0; payload[4] = frag_offset >> 24; payload[5] = frag_offset >> 16; payload[6] = frag_offset >> 8; payload[7] = frag_offset & 0xff; payload += 8; payload_len -= 8; memcpy (payload, data, payload_len); data += payload_len; size -= payload_len; frag_offset += payload_len; if (size == 0) gst_rtp_buffer_set_marker (outbuf, TRUE); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; ret = gst_basertppayload_push (basepayload, outbuf); } gst_buffer_unref (buffer); return ret; } gboolean gst_rtp_gst_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgstpay", GST_RANK_NONE, GST_TYPE_RTP_GST_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpg723depay.c0000644000175000017500000001347311677341656016546 00000000000000/* GStreamer * * Copyright (C) <2010> Wim Taymans * * 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 #include #include #include "gstrtpg723depay.h" GST_DEBUG_CATEGORY_STATIC (rtpg723depay_debug); #define GST_CAT_DEFAULT (rtpg723depay_debug) /* references: * * RFC 3551 (4.5.3) */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; /* input is an RTP packet * */ static GstStaticPadTemplate gst_rtp_g723_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"G723\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_G723_STRING ", " "clock-rate = (int) 8000") ); static GstStaticPadTemplate gst_rtp_g723_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/G723, " "channels = (int) 1," "rate = (int) 8000") ); static gboolean gst_rtp_g723_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_g723_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); GST_BOILERPLATE (GstRtpG723Depay, gst_rtp_g723_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_g723_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g723_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g723_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP G.723 depayloader", "Codec/Depayloader/Network/RTP", "Extracts G.723 audio from RTP packets (RFC 3551)", "Wim Taymans "); GST_DEBUG_CATEGORY_INIT (rtpg723depay_debug, "rtpg723depay", 0, "G.723 RTP Depayloader"); } static void gst_rtp_g723_depay_class_init (GstRtpG723DepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_g723_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_g723_depay_setcaps; } static void gst_rtp_g723_depay_init (GstRtpG723Depay * rtpg723depay, GstRtpG723DepayClass * klass) { GstBaseRTPDepayload *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtpg723depay); gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); } static gboolean gst_rtp_g723_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstCaps *srccaps; GstRtpG723Depay *rtpg723depay; const gchar *params; gint clock_rate, channels; gboolean ret; rtpg723depay = GST_RTP_G723_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!(params = gst_structure_get_string (structure, "encoding-params"))) channels = 1; else { channels = atoi (params); } if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; if (channels != 1) goto wrong_channels; if (clock_rate != 8000) goto wrong_clock_rate; depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("audio/G723", "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, clock_rate, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; /* ERRORS */ wrong_channels: { GST_DEBUG_OBJECT (rtpg723depay, "expected 1 channel, got %d", channels); return FALSE; } wrong_clock_rate: { GST_DEBUG_OBJECT (rtpg723depay, "expected 8000 clock-rate, got %d", clock_rate); return FALSE; } } static GstBuffer * gst_rtp_g723_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpG723Depay *rtpg723depay; GstBuffer *outbuf = NULL; gint payload_len; gboolean marker; rtpg723depay = GST_RTP_G723_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); /* At least 4 bytes */ if (payload_len < 4) goto too_small; GST_LOG_OBJECT (rtpg723depay, "payload len %d", payload_len); outbuf = gst_rtp_buffer_get_payload_buffer (buf); marker = gst_rtp_buffer_get_marker (buf); if (marker) { /* marker bit starts talkspurt */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } GST_LOG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; /* ERRORS */ too_small: { GST_ELEMENT_WARNING (rtpg723depay, STREAM, DECODE, (NULL), ("G723 RTP payload too small (%d)", payload_len)); goto bad_packet; } bad_packet: { /* no fatal error */ return NULL; } } gboolean gst_rtp_g723_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg723depay", GST_RANK_SECONDARY, GST_TYPE_RTP_G723_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/fnv1hash.h0000644000175000017500000000226511671175354015307 00000000000000/* GStreamer * Copyright (C) 2007 Thomas Vander Stichele * * 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_FNV1_HASH_H__ #define __GST_FNV1_HASH_H__ #include #include #include G_BEGIN_DECLS guint32 fnv1_hash_32_new (void); guint32 fnv1_hash_32_update (guint32 hash, const guchar *data, guint length); guint32 fnv1_hash_32_to_24 (guint32 hash); G_END_DECLS #endif /* __GST_FNV1_HASH_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpceltpay.c0000644000175000017500000003173411677341656016502 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 #include #include #include "gstrtpceltpay.h" GST_DEBUG_CATEGORY_STATIC (rtpceltpay_debug); #define GST_CAT_DEFAULT (rtpceltpay_debug) static GstStaticPadTemplate gst_rtp_celt_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-celt, " "rate = (int) [ 32000, 64000 ], " "channels = (int) [1, 2], " "frame-size = (int) [ 64, 512 ]") ); static GstStaticPadTemplate gst_rtp_celt_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [ 32000, 48000 ], " "encoding-name = (string) \"CELT\"") ); static void gst_rtp_celt_pay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_celt_pay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_celt_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstCaps *gst_rtp_celt_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad); static GstFlowReturn gst_rtp_celt_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpCELTPay, gst_rtp_celt_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_celt_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_celt_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_celt_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP CELT payloader", "Codec/Payloader/Network/RTP", "Payload-encodes CELT audio into a RTP packet", "Wim Taymans "); GST_DEBUG_CATEGORY_INIT (rtpceltpay_debug, "rtpceltpay", 0, "CELT RTP Payloader"); } static void gst_rtp_celt_pay_class_init (GstRtpCELTPayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_celt_pay_finalize; gstelement_class->change_state = gst_rtp_celt_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_celt_pay_setcaps; gstbasertppayload_class->get_caps = gst_rtp_celt_pay_getcaps; gstbasertppayload_class->handle_buffer = gst_rtp_celt_pay_handle_buffer; } static void gst_rtp_celt_pay_init (GstRtpCELTPay * rtpceltpay, GstRtpCELTPayClass * klass) { rtpceltpay->queue = g_queue_new (); } static void gst_rtp_celt_pay_finalize (GObject * object) { GstRtpCELTPay *rtpceltpay; rtpceltpay = GST_RTP_CELT_PAY (object); g_queue_free (rtpceltpay->queue); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_celt_pay_clear_queued (GstRtpCELTPay * rtpceltpay) { GstBuffer *buf; while ((buf = g_queue_pop_head (rtpceltpay->queue))) gst_buffer_unref (buf); rtpceltpay->bytes = 0; rtpceltpay->sbytes = 0; rtpceltpay->qduration = 0; } static void gst_rtp_celt_pay_add_queued (GstRtpCELTPay * rtpceltpay, GstBuffer * buffer, guint ssize, guint size, GstClockTime duration) { g_queue_push_tail (rtpceltpay->queue, buffer); rtpceltpay->sbytes += ssize; rtpceltpay->bytes += size; /* only add durations when we have a valid previous duration */ if (rtpceltpay->qduration != -1) { if (duration != -1) /* only add valid durations */ rtpceltpay->qduration += duration; else /* if we add a buffer without valid duration, our total queued duration * becomes unknown */ rtpceltpay->qduration = -1; } } static gboolean gst_rtp_celt_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { /* don't configure yet, we wait for the ident packet */ return TRUE; } static GstCaps * gst_rtp_celt_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad) { GstCaps *otherpadcaps; GstCaps *caps; const gchar *params; otherpadcaps = gst_pad_get_allowed_caps (payload->srcpad); caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { GstStructure *ps = gst_caps_get_structure (otherpadcaps, 0); GstStructure *s = gst_caps_get_structure (caps, 0); gint clock_rate = 0, frame_size = 0, channels = 1; if (gst_structure_get_int (ps, "clock-rate", &clock_rate)) { gst_structure_fixate_field_nearest_int (s, "rate", clock_rate); } if ((params = gst_structure_get_string (ps, "frame-size"))) frame_size = atoi (params); if (frame_size) gst_structure_set (s, "frame-size", G_TYPE_INT, frame_size, NULL); if ((params = gst_structure_get_string (ps, "encoding-params"))) { channels = atoi (params); gst_structure_fixate_field_nearest_int (s, "channels", channels); } GST_DEBUG_OBJECT (payload, "clock-rate=%d frame-size=%d channels=%d", clock_rate, frame_size, channels); } gst_caps_unref (otherpadcaps); } return caps; } static gboolean gst_rtp_celt_pay_parse_ident (GstRtpCELTPay * rtpceltpay, const guint8 * data, guint size) { guint32 version, header_size, rate, nb_channels, frame_size, overlap; guint32 bytes_per_packet; GstBaseRTPPayload *payload; gchar *cstr, *fsstr; gboolean res; /* we need the header string (8), the version string (20), the version * and the header length. */ if (size < 36) goto too_small; if (!g_str_has_prefix ((const gchar *) data, "CELT ")) goto wrong_header; /* skip header and version string */ data += 28; version = GST_READ_UINT32_LE (data); GST_DEBUG_OBJECT (rtpceltpay, "version %08x", version); #if 0 if (version != 1) goto wrong_version; #endif data += 4; /* ensure sizes */ header_size = GST_READ_UINT32_LE (data); if (header_size < 56) goto header_too_small; if (size < header_size) goto payload_too_small; data += 4; rate = GST_READ_UINT32_LE (data); data += 4; nb_channels = GST_READ_UINT32_LE (data); data += 4; frame_size = GST_READ_UINT32_LE (data); data += 4; overlap = GST_READ_UINT32_LE (data); data += 4; bytes_per_packet = GST_READ_UINT32_LE (data); GST_DEBUG_OBJECT (rtpceltpay, "rate %d, nb_channels %d, frame_size %d", rate, nb_channels, frame_size); GST_DEBUG_OBJECT (rtpceltpay, "overlap %d, bytes_per_packet %d", overlap, bytes_per_packet); payload = GST_BASE_RTP_PAYLOAD (rtpceltpay); gst_basertppayload_set_options (payload, "audio", FALSE, "CELT", rate); cstr = g_strdup_printf ("%d", nb_channels); fsstr = g_strdup_printf ("%d", frame_size); res = gst_basertppayload_set_outcaps (payload, "encoding-params", G_TYPE_STRING, cstr, "frame-size", G_TYPE_STRING, fsstr, NULL); g_free (cstr); g_free (fsstr); return res; /* ERRORS */ too_small: { GST_DEBUG_OBJECT (rtpceltpay, "ident packet too small, need at least 32 bytes"); return FALSE; } wrong_header: { GST_DEBUG_OBJECT (rtpceltpay, "ident packet does not start with \"CELT \""); return FALSE; } #if 0 wrong_version: { GST_DEBUG_OBJECT (rtpceltpay, "can only handle version 1, have version %d", version); return FALSE; } #endif header_too_small: { GST_DEBUG_OBJECT (rtpceltpay, "header size too small, need at least 80 bytes, " "got only %d", header_size); return FALSE; } payload_too_small: { GST_DEBUG_OBJECT (rtpceltpay, "payload too small, need at least %d bytes, got only %d", header_size, size); return FALSE; } } static GstFlowReturn gst_rtp_celt_pay_flush_queued (GstRtpCELTPay * rtpceltpay) { GstFlowReturn ret; GstBuffer *buf, *outbuf; guint8 *payload, *spayload; guint payload_len; GstClockTime duration; payload_len = rtpceltpay->bytes + rtpceltpay->sbytes; duration = rtpceltpay->qduration; GST_DEBUG_OBJECT (rtpceltpay, "flushing out %u, duration %" GST_TIME_FORMAT, payload_len, GST_TIME_ARGS (rtpceltpay->qduration)); /* get a big enough packet for the sizes + payloads */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); GST_BUFFER_DURATION (outbuf) = duration; /* point to the payload for size headers and data */ spayload = gst_rtp_buffer_get_payload (outbuf); payload = spayload + rtpceltpay->sbytes; while ((buf = g_queue_pop_head (rtpceltpay->queue))) { guint size; /* copy first timestamp to output */ if (GST_BUFFER_TIMESTAMP (outbuf) == -1) GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); /* write the size to the header */ size = GST_BUFFER_SIZE (buf); while (size > 0xff) { *spayload++ = 0xff; size -= 0xff; } *spayload++ = size; size = GST_BUFFER_SIZE (buf); /* copy payload */ memcpy (payload, GST_BUFFER_DATA (buf), size); payload += size; gst_buffer_unref (buf); } /* we consumed it all */ rtpceltpay->bytes = 0; rtpceltpay->sbytes = 0; rtpceltpay->qduration = 0; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpceltpay), outbuf); return ret; } static GstFlowReturn gst_rtp_celt_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstFlowReturn ret; GstRtpCELTPay *rtpceltpay; guint size, payload_len; guint8 *data; GstClockTime duration, packet_dur; guint i, ssize, packet_len; rtpceltpay = GST_RTP_CELT_PAY (basepayload); ret = GST_FLOW_OK; size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); switch (rtpceltpay->packet) { case 0: /* ident packet. We need to parse the headers to construct the RTP * properties. */ if (!gst_rtp_celt_pay_parse_ident (rtpceltpay, data, size)) goto parse_error; goto done; case 1: /* comment packet, we ignore it */ goto done; default: /* other packets go in the payload */ break; } duration = GST_BUFFER_DURATION (buffer); GST_LOG_OBJECT (rtpceltpay, "got buffer of duration %" GST_TIME_FORMAT ", size %u", GST_TIME_ARGS (duration), size); /* calculate the size of the size field and the payload */ ssize = 1; for (i = size; i > 0xff; i -= 0xff) ssize++; GST_DEBUG_OBJECT (rtpceltpay, "bytes for size %u", ssize); /* calculate what the new size and duration would be of the packet */ payload_len = ssize + size + rtpceltpay->bytes + rtpceltpay->sbytes; if (rtpceltpay->qduration != -1 && duration != -1) packet_dur = rtpceltpay->qduration + duration; else packet_dur = 0; packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); if (gst_basertppayload_is_filled (basepayload, packet_len, packet_dur)) { /* size or duration would overflow the packet, flush the queued data */ ret = gst_rtp_celt_pay_flush_queued (rtpceltpay); } /* queue the packet */ gst_rtp_celt_pay_add_queued (rtpceltpay, buffer, ssize, size, duration); done: rtpceltpay->packet++; return ret; /* ERRORS */ parse_error: { GST_ELEMENT_ERROR (rtpceltpay, STREAM, DECODE, (NULL), ("Error parsing first identification packet.")); return GST_FLOW_ERROR; } } static GstStateChangeReturn gst_rtp_celt_pay_change_state (GstElement * element, GstStateChange transition) { GstRtpCELTPay *rtpceltpay; GstStateChangeReturn ret; rtpceltpay = GST_RTP_CELT_PAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: rtpceltpay->packet = 0; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_celt_pay_clear_queued (rtpceltpay); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_celt_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpceltpay", GST_RANK_SECONDARY, GST_TYPE_RTP_CELT_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmpvpay.h0000644000175000017500000000357511671175354016356 00000000000000/* GStreamer * Copyright (C) <2007> Thijs Vermeir * * 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_RTP_MPV_PAY_H__ #define __GST_RTP_MPV_PAY_H__ #include #include #include G_BEGIN_DECLS typedef struct _GstRTPMPVPay GstRTPMPVPay; typedef struct _GstRTPMPVPayClass GstRTPMPVPayClass; #define GST_TYPE_RTP_MPV_PAY \ (gst_rtp_mpv_pay_get_type()) #define GST_RTP_MPV_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPV_PAY,GstRTPMPVPay)) #define GST_RTP_MPV_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPV_PAY,GstRTPMPVPayClass)) #define GST_IS_RTP_MPV_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPV_PAY)) #define GST_IS_RTP_MPV_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPV_PAY)) struct _GstRTPMPVPay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_ts; GstClockTime duration; }; struct _GstRTPMPVPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_mpv_pay_get_type (void); gboolean gst_rtp_mpv_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MPV_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpL16depay.c0000644000175000017500000001674611677341656016434 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include #include #include "gstrtpL16depay.h" #include "gstrtpchannels.h" GST_DEBUG_CATEGORY_STATIC (rtpL16depay_debug); #define GST_CAT_DEFAULT (rtpL16depay_debug) static GstStaticPadTemplate gst_rtp_L16_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) BIG_ENDIAN, " "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") ); static GstStaticPadTemplate gst_rtp_L16_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [ 1, MAX ], " /* "channels = (int) [1, MAX]" */ /* "emphasis = (string) ANY" */ /* "channel-order = (string) ANY" */ "encoding-name = (string) \"L16\";" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) { " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " GST_RTP_PAYLOAD_L16_MONO_STRING " }," "clock-rate = (int) [ 1, MAX ]" /* "channels = (int) [1, MAX]" */ /* "emphasis = (string) ANY" */ /* "channel-order = (string) ANY" */ ) ); GST_BOILERPLATE (GstRtpL16Depay, gst_rtp_L16_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_L16_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_L16_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_L16_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_L16_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_L16_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP audio depayloader", "Codec/Depayloader/Network/RTP", "Extracts raw audio from RTP packets", "Zeeshan Ali ," "Wim Taymans "); } static void gst_rtp_L16_depay_class_init (GstRtpL16DepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->set_caps = gst_rtp_L16_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_L16_depay_process; GST_DEBUG_CATEGORY_INIT (rtpL16depay_debug, "rtpL16depay", 0, "Raw Audio RTP Depayloader"); } static void gst_rtp_L16_depay_init (GstRtpL16Depay * rtpL16depay, GstRtpL16DepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static gint gst_rtp_L16_depay_parse_int (GstStructure * structure, const gchar * field, gint def) { const gchar *str; gint res; if ((str = gst_structure_get_string (structure, field))) return atoi (str); if (gst_structure_get_int (structure, field, &res)) return res; return def; } static gboolean gst_rtp_L16_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpL16Depay *rtpL16depay; gint clock_rate, payload; gint channels; GstCaps *srccaps; gboolean res; const gchar *channel_order; const GstRTPChannelOrder *order; rtpL16depay = GST_RTP_L16_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); payload = 96; gst_structure_get_int (structure, "payload", &payload); switch (payload) { case GST_RTP_PAYLOAD_L16_STEREO: channels = 2; clock_rate = 44100; break; case GST_RTP_PAYLOAD_L16_MONO: channels = 1; clock_rate = 44100; break; default: /* no fixed mapping, we need clock-rate */ channels = 0; clock_rate = 0; break; } /* caps can overwrite defaults */ clock_rate = gst_rtp_L16_depay_parse_int (structure, "clock-rate", clock_rate); if (clock_rate == 0) goto no_clockrate; channels = gst_rtp_L16_depay_parse_int (structure, "encoding-params", channels); if (channels == 0) { channels = gst_rtp_L16_depay_parse_int (structure, "channels", channels); if (channels == 0) { /* channels defaults to 1 otherwise */ channels = 1; } } depayload->clock_rate = clock_rate; rtpL16depay->rate = clock_rate; rtpL16depay->channels = channels; srccaps = gst_caps_new_simple ("audio/x-raw-int", "endianness", G_TYPE_INT, G_BIG_ENDIAN, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "rate", G_TYPE_INT, clock_rate, "channels", G_TYPE_INT, channels, NULL); /* add channel positions */ channel_order = gst_structure_get_string (structure, "channel-order"); order = gst_rtp_channels_get_by_order (channels, channel_order); if (order) { gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), order->pos); } else { GstAudioChannelPosition *pos; GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, (NULL), ("Unknown channel order '%s' for %d channels", GST_STR_NULL (channel_order), channels)); /* create default NONE layout */ pos = gst_rtp_channels_create_default (channels); gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), pos); g_free (pos); } res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ no_clockrate: { GST_ERROR_OBJECT (depayload, "no clock-rate specified"); return FALSE; } } static GstBuffer * gst_rtp_L16_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpL16Depay *rtpL16depay; GstBuffer *outbuf; gint payload_len; gboolean marker; rtpL16depay = GST_RTP_L16_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len <= 0) goto empty_packet; GST_DEBUG_OBJECT (rtpL16depay, "got payload of %d bytes", payload_len); outbuf = gst_rtp_buffer_get_payload_buffer (buf); marker = gst_rtp_buffer_get_marker (buf); if (marker) { /* mark talk spurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } return outbuf; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } } gboolean gst_rtp_L16_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpL16depay", GST_RANK_SECONDARY, GST_TYPE_RTP_L16_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/TODO0000644000175000017500000000057311671175354014110 00000000000000* MPEG4 header - ffmpeg mpeg4 decoder gives error message when sending only the config string, parsing is OK, error just means no picture was found in the stream. * compare H263 encoders and H263+ * better RTP packetizing for h263 * bitrate tuning in ffmpeg - fixed the qmax values so we can quantize more. * make ffmpeg negotiate only with accepted framerates gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4gpay.h0000644000175000017500000000420211671175354016407 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MP4G_PAY_H__ #define __GST_RTP_MP4G_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP4G_PAY \ (gst_rtp_mp4g_pay_get_type()) #define GST_RTP_MP4G_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4G_PAY,GstRtpMP4GPay)) #define GST_RTP_MP4G_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4G_PAY,GstRtpMP4GPayClass)) #define GST_IS_RTP_MP4G_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4G_PAY)) #define GST_IS_RTP_MP4G_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4G_PAY)) typedef struct _GstRtpMP4GPay GstRtpMP4GPay; typedef struct _GstRtpMP4GPayClass GstRtpMP4GPayClass; struct _GstRtpMP4GPay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_timestamp; GstClockTime first_duration; GstClockTime duration; guint64 offset; gint rate; gchar *params; gchar *profile; const gchar *streamtype; const gchar *mode; GstBuffer *config; guint frame_len; }; struct _GstRtpMP4GPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_mp4g_pay_get_type (void); gboolean gst_rtp_mp4g_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4G_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpdvpay.c0000644000175000017500000002606311677341656016163 00000000000000/* Farsight * Copyright (C) 2006 Marcel Moreaux * (C) 2008 Wim Taymans * * 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 #include #include #include "gstrtpdvpay.h" GST_DEBUG_CATEGORY (rtpdvpay_debug); #define GST_CAT_DEFAULT (rtpdvpay_debug) #define DEFAULT_MODE GST_DV_PAY_MODE_VIDEO enum { PROP_0, PROP_MODE }; /* takes both system and non-system streams */ static GstStaticPadTemplate gst_rtp_dv_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-dv") ); static GstStaticPadTemplate gst_rtp_dv_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) { \"video\", \"audio\" } ," "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "encoding-name = (string) \"DV\", " "clock-rate = (int) 90000," "encode = (string) { \"SD-VCR/525-60\", \"SD-VCR/625-50\", \"HD-VCR/1125-60\"," "\"HD-VCR/1250-50\", \"SDL-VCR/525-60\", \"SDL-VCR/625-50\"," "\"306M/525-60\", \"306M/625-50\", \"314M-25/525-60\"," "\"314M-25/625-50\", \"314M-50/525-60\", \"314M-50/625-50\" }" /* optional parameters can't go in the template * "audio = (string) { \"bundled\", \"none\" }" */ ) ); static gboolean gst_rtp_dv_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_dv_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); #define GST_TYPE_DV_PAY_MODE (gst_dv_pay_mode_get_type()) static GType gst_dv_pay_mode_get_type (void) { static GType dv_pay_mode_type = 0; static const GEnumValue dv_pay_modes[] = { {GST_DV_PAY_MODE_VIDEO, "Video only", "video"}, {GST_DV_PAY_MODE_BUNDLED, "Video and Audio bundled", "bundled"}, {GST_DV_PAY_MODE_AUDIO, "Audio only", "audio"}, {0, NULL, NULL}, }; if (!dv_pay_mode_type) { dv_pay_mode_type = g_enum_register_static ("GstDVPayMode", dv_pay_modes); } return dv_pay_mode_type; } static void gst_dv_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_dv_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); GST_BOILERPLATE (GstRTPDVPay, gst_rtp_dv_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_dv_pay_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &gst_rtp_dv_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_dv_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP DV Payloader", "Codec/Payloader/Network/RTP", "Payloads DV into RTP packets (RFC 3189)", "Marcel Moreaux , Wim Taymans "); } static void gst_rtp_dv_pay_class_init (GstRTPDVPayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_dv_pay_set_property; gobject_class->get_property = gst_dv_pay_get_property; gstbasertppayload_class->set_caps = gst_rtp_dv_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_dv_pay_handle_buffer; g_object_class_install_property (gobject_class, PROP_MODE, g_param_spec_enum ("mode", "Mode", "The payload mode of payloading", GST_TYPE_DV_PAY_MODE, DEFAULT_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (rtpdvpay_debug, "rtpdvpay", 0, "DV RTP Payloader"); } static void gst_rtp_dv_pay_init (GstRTPDVPay * rtpdvpay, GstRTPDVPayClass * klass) { } static void gst_dv_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRTPDVPay *rtpdvpay = GST_RTP_DV_PAY (object); switch (prop_id) { case PROP_MODE: rtpdvpay->mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_dv_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRTPDVPay *rtpdvpay = GST_RTP_DV_PAY (object); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, rtpdvpay->mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_rtp_dv_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { /* We don't do anything here, but we could check if it's a system stream and if * it's not, default to sending the video only. We will negotiate downstream * caps when we get to see the first frame. */ return TRUE; } static gboolean gst_dv_pay_negotiate (GstRTPDVPay * rtpdvpay, guint8 * data, guint size) { const gchar *encode, *media; gboolean audio_bundled, res; if ((data[3] & 0x80) == 0) { /* DSF flag */ /* it's an NTSC format */ if ((data[80 * 5 + 48 + 3] & 0x4) && (data[80 * 5 + 48] == 0x60)) { /* 4:2:2 sampling */ /* NTSC 50Mbps */ encode = "314M-25/525-60"; } else { /* 4:1:1 sampling */ /* NTSC 25Mbps */ encode = "SD-VCR/525-60"; } } else { /* it's a PAL format */ if ((data[80 * 5 + 48 + 3] & 0x4) && (data[80 * 5 + 48] == 0x60)) { /* 4:2:2 sampling */ /* PAL 50Mbps */ encode = "314M-50/625-50"; } else if ((data[5] & 0x07) == 0) { /* APT flag */ /* PAL 25Mbps 4:2:0 */ encode = "SD-VCR/625-50"; } else /* PAL 25Mbps 4:1:1 */ encode = "314M-25/625-50"; } media = "video"; audio_bundled = FALSE; switch (rtpdvpay->mode) { case GST_DV_PAY_MODE_AUDIO: media = "audio"; break; case GST_DV_PAY_MODE_BUNDLED: audio_bundled = TRUE; break; default: break; } gst_basertppayload_set_options (GST_BASE_RTP_PAYLOAD (rtpdvpay), media, TRUE, "DV", 90000); if (audio_bundled) { res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpdvpay), "encode", G_TYPE_STRING, encode, "audio", G_TYPE_STRING, "bundled", NULL); } else { res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpdvpay), "encode", G_TYPE_STRING, encode, NULL); } return res; } static gboolean include_dif (GstRTPDVPay * rtpdvpay, guint8 * data) { gint block_type; gboolean res; block_type = data[0] >> 5; switch (block_type) { case 0: /* Header block */ case 1: /* Subcode block */ case 2: /* VAUX block */ /* always include these blocks */ res = TRUE; break; case 3: /* Audio block */ /* never include audio if we are doing video only */ if (rtpdvpay->mode == GST_DV_PAY_MODE_VIDEO) res = FALSE; else res = TRUE; break; case 4: /* Video block */ /* never include video if we are doing audio only */ if (rtpdvpay->mode == GST_DV_PAY_MODE_AUDIO) res = FALSE; else res = TRUE; break; default: /* Something bogus, just ignore */ res = FALSE; break; } return res; } /* Get a DV frame, chop it up in pieces, and push the pieces to the RTP layer. */ static GstFlowReturn gst_rtp_dv_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRTPDVPay *rtpdvpay; guint max_payload_size; GstBuffer *outbuf; GstFlowReturn ret = GST_FLOW_OK; gint hdrlen; guint size; guint8 *data; guint8 *dest; guint filled; rtpdvpay = GST_RTP_DV_PAY (basepayload); hdrlen = gst_rtp_buffer_calc_header_len (0); /* DV frames are made up from a bunch of DIF blocks. DIF blocks are 80 bytes * each, and we should put an integral number of them in each RTP packet. * Therefore, we round the available room down to the nearest multiple of 80. * * The available room is just the packet MTU, minus the RTP header length. */ max_payload_size = ((GST_BASE_RTP_PAYLOAD_MTU (rtpdvpay) - hdrlen) / 80) * 80; /* The length of the buffer to transmit. */ size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); GST_DEBUG_OBJECT (rtpdvpay, "DV RTP payloader got buffer of %u bytes, splitting in %u byte " "payload fragments, at time %" GST_TIME_FORMAT, size, max_payload_size, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); if (!rtpdvpay->negotiated) { gst_dv_pay_negotiate (rtpdvpay, data, size); /* if we have not yet scanned the stream for its type, do so now */ rtpdvpay->negotiated = TRUE; } outbuf = NULL; dest = NULL; filled = 0; /* while we have a complete DIF chunks left */ while (size >= 80) { /* Allocate a new buffer, set the timestamp */ if (outbuf == NULL) { outbuf = gst_rtp_buffer_new_allocate (max_payload_size, 0, 0); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); dest = gst_rtp_buffer_get_payload (outbuf); filled = 0; } /* inspect the DIF chunk, if we don't need to include it, skip to the next one. */ if (include_dif (rtpdvpay, data)) { /* copy data in packet */ memcpy (dest, data, 80); dest += 80; filled += 80; } /* go to next dif chunk */ size -= 80; data += 80; /* push out the buffer if the next one would exceed the max packet size or * when we are pushing the last packet */ if (filled + 80 > max_payload_size || size < 80) { if (size < 160) { guint hlen; /* set marker */ gst_rtp_buffer_set_marker (outbuf, TRUE); /* shrink buffer to last packet */ hlen = gst_rtp_buffer_get_header_len (outbuf); gst_rtp_buffer_set_packet_len (outbuf, hlen + filled); } /* Push out the created piece, and check for errors. */ ret = gst_basertppayload_push (basepayload, outbuf); if (ret != GST_FLOW_OK) break; outbuf = NULL; } } gst_buffer_unref (buffer); return ret; } gboolean gst_rtp_dv_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpdvpay", GST_RANK_SECONDARY, GST_TYPE_RTP_DV_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph263pay.h0000644000175000017500000003365511671175354016240 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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. * * Author: Dejan Sakelsak sahel@kiberpipa.org */ #ifndef __GST_RTP_H263_PAY_H__ #define __GST_RTP_H263_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_H263_PAY \ (gst_rtp_h263_pay_get_type()) #define GST_RTP_H263_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263_PAY,GstRtpH263Pay)) #define GST_RTP_H263_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263_PAY,GstRtpH263PayClass)) #define GST_IS_RTP_H263_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263_PAY)) #define GST_IS_RTP_H263_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263_PAY)) // blocks per macroblock #define N_BLOCKS 6 #define DEFAULT_MODE_A FALSE #define MTU_SECURITY_OFFSET 50 typedef enum _GstRtpH263PayHeaderMode { GST_RTP_H263_PAYLOAD_HEADER_MODE_A = 4, GST_RTP_H263_PAYLOAD_HEADER_MODE_B = 8, GST_RTP_H263_PAYLOAD_HEADER_MODE_C = 12 } GstRtpH263PayHeaderMode; typedef struct _GstRtpH263PayContext GstRtpH263PayContext; typedef struct _GstRtpH263PayPic GstRtpH263PayPic; typedef struct _GstRtpH263PayClass GstRtpH263PayClass; typedef struct _GstRtpH263Pay GstRtpH263Pay; typedef struct _GstRtpH263PayBoundry GstRtpH263PayBoundry; typedef struct _GstRtpH263PayMB GstRtpH263PayMB; typedef struct _GstRtpH263PayGob GstRtpH263PayGob; typedef struct _GstRtpH263PayPackage GstRtpH263PayPackage; //typedef enum _GstRtpH263PayHeaderMode GstRtpH263PayHeaderMode; struct _GstRtpH263Pay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_ts; gboolean prop_payload_mode; guint8 *data; guint available_data; }; struct _GstRtpH263PayContext { GstRtpH263PayPic *piclayer; guint mtu; guint window; guint8 *win_end; guint8 cpm; guint no_gobs; GstRtpH263PayGob **gobs; }; struct _GstRtpH263PayClass { GstBaseRTPPayloadClass parent_class; }; typedef struct _GstRtpH263PayAHeader { #if G_BYTE_ORDER == G_LITTLE_ENDIAN unsigned int ebit:3; /* End position */ unsigned int sbit:3; /* Start position */ unsigned int p:1; /* PB-frames mode */ unsigned int f:1; /* flag bit */ unsigned int r1:1; /* Reserved */ unsigned int a:1; /* Advanced Prediction */ unsigned int s:1; /* syntax based arithmetic coding */ unsigned int u:1; /* Unrestricted motion vector */ unsigned int i:1; /* Picture coding type */ unsigned int src:3; /* Source format */ unsigned int trb:3; /* Temporal ref for B frame */ unsigned int dbq:2; /* Differential Quantisation parameter */ unsigned int r2:3; /* Reserved */ #elif G_BYTE_ORDER == G_BIG_ENDIAN unsigned int f:1; /* flag bit */ unsigned int p:1; /* PB-frames mode */ unsigned int sbit:3; /* Start position */ unsigned int ebit:3; /* End position */ unsigned int src:3; /* Source format */ unsigned int i:1; /* Picture coding type */ unsigned int u:1; /* Unrestricted motion vector */ unsigned int s:1; /* syntax based arithmetic coding */ unsigned int a:1; /* Advanced Prediction */ unsigned int r1:1; /* Reserved */ unsigned int r2:3; /* Reserved */ unsigned int dbq:2; /* Differential Quantisation parameter */ unsigned int trb:3; /* Temporal ref for B frame */ #else #error "G_BYTE_ORDER should be big or little endian." #endif unsigned int tr:8; /* Temporal ref for P frame */ } GstRtpH263PayAHeader; typedef struct _GstRtpH263PayBHeader { #if G_BYTE_ORDER == G_LITTLE_ENDIAN unsigned int ebit:3; /* End position */ unsigned int sbit:3; /* Start position */ unsigned int p:1; /* PB-frames mode */ unsigned int f:1; /* flag bit */ unsigned int quant:5; /* Quantization value for first MB */ unsigned int src:3; /* Source format */ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ unsigned int gobn:5; /* GOB number in effect at start of packet */ unsigned int r:2; /* Reserved */ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ unsigned int a:1; /* Advanced Prediction */ unsigned int s:1; /* syntax based arithmetic coding */ unsigned int u:1; /* Unrestricted motion vector */ unsigned int i:1; /* Picture coding type */ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ #elif G_BYTE_ORDER == G_BIG_ENDIAN unsigned int f:1; /* flag bit */ unsigned int p:1; /* PB-frames mode */ unsigned int sbit:3; /* Start position */ unsigned int ebit:3; /* End position */ unsigned int src:3; /* Source format */ unsigned int quant:5; /* Quantization value for first MB */ unsigned int gobn:5; /* GOB number in effect at start of packet */ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ unsigned int r:2; /* Reserved */ unsigned int i:1; /* Picture coding type */ unsigned int u:1; /* Unrestricted motion vector */ unsigned int s:1; /* syntax based arithmetic coding */ unsigned int a:1; /* Advanced Prediction */ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ #else #error "G_BYTE_ORDER should be big or little endian." #endif } GstRtpH263PayBHeader; typedef struct _GstRtpH263PayCHeader { #if G_BYTE_ORDER == G_LITTLE_ENDIAN unsigned int ebit:3; /* End position */ unsigned int sbit:3; /* Start position */ unsigned int p:1; /* PB-frames mode */ unsigned int f:1; /* flag bit */ unsigned int quant:5; /* Quantization value for first MB */ unsigned int src:3; /* Source format */ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ unsigned int gobn:5; /* GOB number in effect at start of packet */ unsigned int r:2; /* Reserved */ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ unsigned int a:1; /* Advanced Prediction */ unsigned int s:1; /* syntax based arithmetic coding */ unsigned int u:1; /* Unrestricted motion vector */ unsigned int i:1; /* Picture coding type */ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ unsigned int rr1:8; /* reserved */ unsigned int rr2:8; /* reserved */ unsigned int trb:3; /* Temporal Reference for the B */ unsigned int dbq:2; /* Differential quantization parameter */ unsigned int rr3:3; /* reserved */ unsigned int tr:8; /* Temporal Reference for the P frame */ #elif G_BYTE_ORDER == G_BIG_ENDIAN unsigned int f:1; /* flag bit */ unsigned int p:1; /* PB-frames mode */ unsigned int sbit:3; /* Start position */ unsigned int ebit:3; /* End position */ unsigned int src:3; /* Source format */ unsigned int quant:5; /* Quantization value for first MB */ unsigned int gobn:5; /* GOB number in effect at start of packet */ unsigned int mba1:3; /* Address of first MB starting count from 0 - part1 */ unsigned int mba2:6; /* Address of first MB starting count from 0 - part2 */ unsigned int r:2; /* Reserved */ unsigned int i:1; /* Picture coding type */ unsigned int u:1; /* Unrestricted motion vector */ unsigned int s:1; /* syntax based arithmetic coding */ unsigned int a:1; /* Advanced Prediction */ unsigned int hmv11:4; /* horizontal motion vector predictor for MB 1 - part 1 */ unsigned int hmv12:3; /* horizontal motion vector predictor for MB 1 - part 2 */ unsigned int vmv11:5; /* vertical motion vector predictor for MB 1 - part 1 */ unsigned int vmv12:2; /* vertical motion vector predictor for MB 1 - part 2 */ unsigned int hmv21:6; /* horizontal motion vector predictor for MB 3 - part 1 */ unsigned int hmv22:1; /* horizontal motion vector predictor for MB 3 - part 2 */ unsigned int vmv21:7; /* vertical motion vector predictor for MB 3 */ unsigned int rr1:8; /* reserved */ unsigned int rr2:8; /* reserved */ unsigned int rr3:3; /* reserved */ unsigned int dbq:2; /* Differential quantization parameter */ unsigned int trb:3; /* Temporal Reference for the B */ unsigned int tr:8; /* Temporal Reference for the P frame */ #else #error "G_BYTE_ORDER should be big or little endian." #endif } GstRtpH263PayCHeader; struct _GstRtpH263PayPic { #if G_BYTE_ORDER == G_LITTLE_ENDIAN unsigned int psc1:16; unsigned int tr1:2; unsigned int psc2:6; unsigned int ptype_263:1; unsigned int ptype_start:1; unsigned int tr2:6; unsigned int ptype_umvmode:1; unsigned int ptype_pictype:1; unsigned int ptype_srcformat:3; unsigned int ptype_freeze:1; unsigned int ptype_camera:1; unsigned int ptype_split:1; unsigned int pquant:5; unsigned int ptype_pbmode:1; unsigned int ptype_apmode:1; unsigned int ptype_sacmode:1; #elif G_BYTE_ORDER == G_BIG_ENDIAN unsigned int psc1:16; unsigned int psc2:6; unsigned int tr1:2; unsigned int tr2:6; unsigned int ptype_start:2; unsigned int ptype_split:1; unsigned int ptype_camera:1; unsigned int ptype_freeze:1; unsigned int ptype_srcformat:3; unsigned int ptype_pictype:1; unsigned int ptype_umvmode:1; unsigned int ptype_sacmode:1; unsigned int ptype_apmode:1; unsigned int ptype_pbmode:1; unsigned int pquant:5; #else #error "G_BYTE_ORDER should be big or little endian." #endif }; struct _GstRtpH263PayBoundry { guint8 *start; guint8 *end; guint8 sbit; guint8 ebit; }; struct _GstRtpH263PayMB { guint8 *start; guint8 *end; guint8 sbit; guint8 ebit; guint length; guint8 mb_type; guint quant; guint mba; guint8 mvd[10]; }; struct _GstRtpH263PayGob { guint8 *start; guint8 *end; guint length; guint8 sbit; guint8 ebit; guint gobn; guint quant; GstRtpH263PayMB **macroblocks; guint nmacroblocs; }; struct _GstRtpH263PayPackage { guint8 *payload_start; guint8 *payload_end; guint payload_len; guint8 sbit; guint8 ebit; GstBuffer *outbuf; gboolean marker; GstRtpH263PayHeaderMode mode; /* * mode B,C data */ guint16 mba; guint nmvd; guint8 mvd[10]; guint gobn; guint quant; }; #define GST_H263_PICTURELAYER_PLSRC(buf) (((GstRtpH263PayPic *)(buf))->ptype_srcformat) #define GST_H263_PICTURELAYER_PLTYPE(buf) (((GstRtpH263PayPic *)(buf))->ptype_pictype) #define GST_H263_PICTURELAYER_PLUMV(buf) (((GstRtpH263PayPic *)(buf))->ptype_umvmode) #define GST_H263_PICTURELAYER_PLSAC(buf) (((GstRtpH263PayPic *)(buf))->ptype_sacmode) #define GST_H263_PICTURELAYER_PLAP(buf) (((GstRtpH263PayPic *)(buf))->ptype_apmode) /* * TODO: PB frame relevant tables */ #define GST_RTP_H263_PAY_END(start, len) (((guint8 *)start) + ((guint)len)) #define GST_RTP_H263_PAY_GOBN(gob) (((((guint8 *) gob)[2] >> 2) & 0x1f) GType gst_rtp_h263_pay_get_type (void); gboolean gst_rtp_h263_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H263_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpsv3vdepay.c0000644000175000017500000002250211677341656016756 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpsv3vdepay.h" GST_DEBUG_CATEGORY (rtpsv3vdepay_debug); #define GST_CAT_DEFAULT rtpsv3vdepay_debug static GstStaticPadTemplate gst_rtp_sv3v_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-svq, " "svqversion = (int) 3") ); static GstStaticPadTemplate gst_rtp_sv3v_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) { \"X-SV3V-ES\", \"X-SORENSON-VIDEO\" , \"X-SORENSONVIDEO\" , \"X-SorensonVideo\" }") ); GST_BOILERPLATE (GstRtpSV3VDepay, gst_rtp_sv3v_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_sv3v_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_sv3v_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); gboolean gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static void gst_rtp_sv3v_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_sv3v_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_sv3v_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP SVQ3 depayloader", "Codec/Depayloader/Network/RTP", "Extracts SVQ3 video from RTP packets (no RFC)", "Wim Taymans "); } static void gst_rtp_sv3v_depay_class_init (GstRtpSV3VDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_sv3v_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_sv3v_depay_setcaps; gobject_class->finalize = gst_rtp_sv3v_depay_finalize; gstelement_class->change_state = gst_rtp_sv3v_depay_change_state; } static void gst_rtp_sv3v_depay_init (GstRtpSV3VDepay * rtpsv3vdepay, GstRtpSV3VDepayClass * klass) { rtpsv3vdepay->adapter = gst_adapter_new (); } static void gst_rtp_sv3v_depay_finalize (GObject * object) { GstRtpSV3VDepay *rtpsv3vdepay; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (object); g_object_unref (rtpsv3vdepay->adapter); rtpsv3vdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } // only on the sink gboolean gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) { GstStructure *structure = gst_caps_get_structure (caps, 0); gint clock_rate; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; // default filter->clock_rate = clock_rate; /* will set caps later */ return TRUE; } static GstBuffer * gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpSV3VDepay *rtpsv3vdepay; static struct { guint width, height; } resolutions[7] = { { 160, 128}, { 128, 96}, { 176, 144}, { 352, 288}, { 704, 576}, { 240, 180}, { 320, 240} }; gint payload_len; guint8 *payload; gboolean M; gboolean C, S, E; GstBuffer *outbuf = NULL; guint16 seq; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (depayload); /* flush on sequence number gaps */ seq = gst_rtp_buffer_get_seq (buf); GST_DEBUG ("timestamp %" GST_TIME_FORMAT ", sequence number:%d", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), seq); if (seq != rtpsv3vdepay->nextseq) { GST_DEBUG ("Sequence discontinuity, clearing adapter"); gst_adapter_clear (rtpsv3vdepay->adapter); } rtpsv3vdepay->nextseq = seq + 1; payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 3) goto bad_packet; payload = gst_rtp_buffer_get_payload (buf); M = gst_rtp_buffer_get_marker (buf); /* This is all a guess: * 1 1 1 1 1 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |0|C|S|E|0|0|0|0|0|0|0|0|0|0|0|0| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * C: config, packet contains config info * S: start, packet contains start of frame * E: end, packet contains end of frame */ /* this seems to indicate a packet with a config string sent before each * keyframe */ C = (payload[0] & 0x40) == 0x40; /* redundant with the RTP marker bit */ S = (payload[0] & 0x20) == 0x20; E = (payload[0] & 0x10) == 0x10; GST_DEBUG ("M:%d, C:%d, S:%d, E:%d", M, C, S, E); GST_MEMDUMP ("incoming buffer", payload, payload_len); if (G_UNLIKELY (C)) { GstCaps *caps; GstBuffer *codec_data; guint8 res; GST_DEBUG ("Configuration packet"); /* if we already have caps, we don't need to do anything. FIXME, check if * something changed. */ if (G_UNLIKELY (GST_PAD_CAPS (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)))) { GST_DEBUG ("Already configured, skipping config parsing"); goto beach; } res = payload[2] >> 5; /* width and height, according to http://wiki.multimedia.cx/index.php?title=Sorenson_Video_1#Stream_Format_And_Header */ if (G_LIKELY (res < 7)) { rtpsv3vdepay->width = resolutions[res].width; rtpsv3vdepay->height = resolutions[res].height; } else { /* extended width/height, they're contained in the following 24bit */ rtpsv3vdepay->width = ((payload[2] & 0x1f) << 7) | (payload[3] >> 1); rtpsv3vdepay->height = (payload[3] & 0x1) << 11 | payload[4] << 3 | (payload[5] >> 5); } /* CodecData needs to be 'SEQH' + len (32bit) + data according to * ffmpeg's libavcodec/svq3.c:svq3_decode_init */ codec_data = gst_buffer_new_and_alloc (payload_len + 6); memcpy (GST_BUFFER_DATA (codec_data), "SEQH", 4); GST_WRITE_UINT32_LE (GST_BUFFER_DATA (codec_data) + 4, payload_len - 2); memcpy (GST_BUFFER_DATA (codec_data) + 8, payload + 2, payload_len - 2); GST_MEMDUMP ("codec_data", GST_BUFFER_DATA (codec_data), GST_BUFFER_SIZE (codec_data)); caps = gst_caps_new_simple ("video/x-svq", "svqversion", G_TYPE_INT, 3, "width", G_TYPE_INT, rtpsv3vdepay->width, "height", G_TYPE_INT, rtpsv3vdepay->height, "codec_data", GST_TYPE_BUFFER, codec_data, NULL); gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), caps); gst_caps_unref (caps); GST_DEBUG ("Depayloader now configured"); rtpsv3vdepay->configured = TRUE; goto beach; } if (G_LIKELY (rtpsv3vdepay->configured)) { GstBuffer *tmpbuf; GST_DEBUG ("Storing incoming payload"); /* store data in adapter, stip off 2 bytes header */ tmpbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 2, -1); gst_adapter_push (rtpsv3vdepay->adapter, tmpbuf); if (G_UNLIKELY (M)) { /* frame is completed: push contents of adapter */ guint avail; avail = gst_adapter_available (rtpsv3vdepay->adapter); GST_DEBUG ("Returning completed output buffer [%d bytes]", avail); outbuf = gst_adapter_take_buffer (rtpsv3vdepay->adapter, avail); } } beach: return outbuf; /* ERRORS */ bad_packet: { GST_ELEMENT_WARNING (rtpsv3vdepay, STREAM, DECODE, (NULL), ("Packet was too short")); return NULL; } } static GstStateChangeReturn gst_rtp_sv3v_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpSV3VDepay *rtpsv3vdepay; GstStateChangeReturn ret; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpsv3vdepay->adapter); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (rtpsv3vdepay_debug, "rtpsv3vdepay", 0, "RTP SV3V depayloader"); return gst_element_register (plugin, "rtpsv3vdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_SV3V_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpqdmdepay.c0000644000175000017500000003043111677341656016636 00000000000000/* GStreamer * Copyright (C) <2009> Edward Hervey * * 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 #include #include "gstrtpqdmdepay.h" GST_DEBUG_CATEGORY (rtpqdm2depay_debug); #define GST_CAT_DEFAULT rtpqdm2depay_debug static GstStaticPadTemplate gst_rtp_qdm2_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-qdm2") ); static GstStaticPadTemplate gst_rtp_qdm2_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "encoding-name = (string)\"X-QDM\"") ); GST_BOILERPLATE (GstRtpQDM2Depay, gst_rtp_qdm2_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static const guint8 headheader[20] = { 0x0, 0x0, 0x0, 0xc, 0x66, 0x72, 0x6d, 0x61, 0x51, 0x44, 0x4d, 0x32, 0x0, 0x0, 0x0, 0x24, 0x51, 0x44, 0x43, 0x41 }; static void gst_rtp_qdm2_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_qdm2_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_qdm2_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); gboolean gst_rtp_qdm2_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static void gst_rtp_qdm2_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_qdm2_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_qdm2_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP QDM2 depayloader", "Codec/Depayloader/Network/RTP", "Extracts QDM2 audio from RTP packets (no RFC)", "Edward Hervey "); } static void gst_rtp_qdm2_depay_class_init (GstRtpQDM2DepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_qdm2_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_qdm2_depay_setcaps; gobject_class->finalize = gst_rtp_qdm2_depay_finalize; gstelement_class->change_state = gst_rtp_qdm2_depay_change_state; } static void gst_rtp_qdm2_depay_init (GstRtpQDM2Depay * rtpqdm2depay, GstRtpQDM2DepayClass * klass) { rtpqdm2depay->adapter = gst_adapter_new (); } static void gst_rtp_qdm2_depay_finalize (GObject * object) { GstRtpQDM2Depay *rtpqdm2depay; rtpqdm2depay = GST_RTP_QDM2_DEPAY (object); g_object_unref (rtpqdm2depay->adapter); rtpqdm2depay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } // only on the sink gboolean gst_rtp_qdm2_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) { GstStructure *structure = gst_caps_get_structure (caps, 0); gint clock_rate; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 44100; // default filter->clock_rate = clock_rate; /* will set caps later */ return TRUE; } static void flush_data (GstRtpQDM2Depay * depay) { guint i; guint avail; if ((avail = gst_adapter_available (depay->adapter))) gst_adapter_flush (depay->adapter, avail); GST_DEBUG ("Flushing %d packets", depay->nbpackets); for (i = 0; depay->packets[i]; i++) { QDM2Packet *pack = depay->packets[i]; guint32 crc = 0; int i = 0; GstBuffer *buf; guint8 *data; /* CRC is the sum of everything (including first bytes) */ data = pack->data; if (G_UNLIKELY (data == NULL)) continue; /* If the packet size is bigger than 0xff, we need 2 bytes to store the size */ if (depay->packetsize > 0xff) { /* Expanded size 0x02 | 0x80 */ data[0] = 0x82; GST_WRITE_UINT16_BE (data + 1, depay->packetsize - 3); } else { data[0] = 0x2; data[1] = depay->packetsize - 2; } /* Calculate CRC */ for (; i < depay->packetsize; i++) crc += data[i]; GST_DEBUG ("CRC is 0x%x", crc); /* Write CRC */ if (depay->packetsize > 0xff) GST_WRITE_UINT16_BE (data + 3, crc); else GST_WRITE_UINT16_BE (data + 2, crc); GST_MEMDUMP ("Extracted packet", data, depay->packetsize); buf = gst_buffer_new (); GST_BUFFER_DATA (buf) = data; GST_BUFFER_MALLOCDATA (buf) = data; GST_BUFFER_SIZE (buf) = depay->packetsize; gst_adapter_push (depay->adapter, buf); if (pack->data) { pack->data = NULL; } } } static void add_packet (GstRtpQDM2Depay * depay, guint32 pid, guint32 len, guint8 * data) { QDM2Packet *packet; if (G_UNLIKELY (!depay->configured)) return; GST_DEBUG ("pid:%d, len:%d, data:%p", pid, len, data); if (G_UNLIKELY (depay->packets[pid] == NULL)) { depay->packets[pid] = g_malloc0 (sizeof (QDM2Packet)); depay->nbpackets = MAX (depay->nbpackets, pid + 1); } packet = depay->packets[pid]; GST_DEBUG ("packet:%p", packet); GST_DEBUG ("packet->data:%p", packet->data); if (G_UNLIKELY (packet->data == NULL)) { packet->data = g_malloc0 (depay->packetsize); /* We leave space for the header/crc */ if (depay->packetsize > 0xff) packet->offs = 5; else packet->offs = 4; } /* Finally copy the data over */ memcpy (packet->data + packet->offs, data, len); packet->offs += len; } static GstBuffer * gst_rtp_qdm2_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpQDM2Depay *rtpqdm2depay; GstBuffer *outbuf; guint16 seq; rtpqdm2depay = GST_RTP_QDM2_DEPAY (depayload); { gint payload_len; guint8 *payload; guint avail; guint pos = 0; payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 3) goto bad_packet; payload = gst_rtp_buffer_get_payload (buf); seq = gst_rtp_buffer_get_seq (buf); if (G_UNLIKELY (seq != rtpqdm2depay->nextseq)) { GST_DEBUG ("GAP in sequence number, Resetting data !"); /* Flush previous data */ flush_data (rtpqdm2depay); /* And store new timestamp */ rtpqdm2depay->ptimestamp = rtpqdm2depay->timestamp; rtpqdm2depay->timestamp = GST_BUFFER_TIMESTAMP (buf); /* And that previous data will be pushed at the bottom */ } rtpqdm2depay->nextseq = seq + 1; GST_DEBUG ("Payload size %d 0x%x sequence:%d", payload_len, payload_len, seq); GST_MEMDUMP ("Incoming payload", payload, payload_len); while (pos < payload_len) { switch (payload[pos]) { case 0x80:{ GST_DEBUG ("Unrecognized 0x80 marker, skipping 12 bytes"); pos += 12; } break; case 0xff: /* HEADERS */ GST_DEBUG ("Headers"); /* Store the incoming timestamp */ rtpqdm2depay->ptimestamp = rtpqdm2depay->timestamp; rtpqdm2depay->timestamp = GST_BUFFER_TIMESTAMP (buf); /* flush the internal data if needed */ flush_data (rtpqdm2depay); if (G_UNLIKELY (!rtpqdm2depay->configured)) { guint8 *ourdata; GstBuffer *codecdata; GstCaps *caps; /* First bytes are unknown */ GST_MEMDUMP ("Header", payload + pos, 32); ourdata = payload + pos + 10; pos += 10; rtpqdm2depay->channs = GST_READ_UINT32_BE (payload + pos + 4); rtpqdm2depay->samplerate = GST_READ_UINT32_BE (payload + pos + 8); rtpqdm2depay->bitrate = GST_READ_UINT32_BE (payload + pos + 12); rtpqdm2depay->blocksize = GST_READ_UINT32_BE (payload + pos + 16); rtpqdm2depay->framesize = GST_READ_UINT32_BE (payload + pos + 20); rtpqdm2depay->packetsize = GST_READ_UINT32_BE (payload + pos + 24); /* 16 bit empty block (0x02 0x00) */ pos += 30; GST_DEBUG ("channs:%d, samplerate:%d, bitrate:%d, blocksize:%d, framesize:%d, packetsize:%d", rtpqdm2depay->channs, rtpqdm2depay->samplerate, rtpqdm2depay->bitrate, rtpqdm2depay->blocksize, rtpqdm2depay->framesize, rtpqdm2depay->packetsize); /* Caps */ codecdata = gst_buffer_new_and_alloc (48); memcpy (GST_BUFFER_DATA (codecdata), headheader, 20); memcpy (GST_BUFFER_DATA (codecdata) + 20, ourdata, 28); caps = gst_caps_new_simple ("audio/x-qdm2", "samplesize", G_TYPE_INT, 16, "rate", G_TYPE_INT, rtpqdm2depay->samplerate, "channels", G_TYPE_INT, rtpqdm2depay->channs, "codec_data", GST_TYPE_BUFFER, codecdata, NULL); gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), caps); gst_caps_unref (caps); rtpqdm2depay->configured = TRUE; } else { GST_DEBUG ("Already configured, skipping headers"); pos += 40; } break; default:{ /* Shuffled packet contents */ guint packetid = payload[pos++]; guint packettype = payload[pos++]; guint packlen = payload[pos++]; guint hsize = 2; GST_DEBUG ("Packet id:%d, type:0x%x, len:%d", packetid, packettype, packlen); /* Packets bigger than 0xff bytes have a type with the high bit set */ if (G_UNLIKELY (packettype & 0x80)) { packettype &= 0x7f; packlen <<= 8; packlen |= payload[pos++]; hsize = 3; GST_DEBUG ("Packet id:%d, type:0x%x, len:%d", packetid, packettype, packlen); } if (packettype > 0x7f) { GST_ERROR ("HOUSTON WE HAVE A PROBLEM !!!!"); } add_packet (rtpqdm2depay, packetid, packlen + hsize, payload + pos - hsize); pos += packlen; } } } GST_DEBUG ("final pos %d", pos); avail = gst_adapter_available (rtpqdm2depay->adapter); if (G_UNLIKELY (avail)) { GST_DEBUG ("Pushing out %d bytes of collected data", avail); outbuf = gst_adapter_take_buffer (rtpqdm2depay->adapter, avail); GST_BUFFER_TIMESTAMP (outbuf) = rtpqdm2depay->ptimestamp; GST_DEBUG ("Outgoing buffer timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (rtpqdm2depay->ptimestamp)); return outbuf; } } return NULL; /* ERRORS */ bad_packet: { GST_ELEMENT_WARNING (rtpqdm2depay, STREAM, DECODE, (NULL), ("Packet was too short")); return NULL; } } static GstStateChangeReturn gst_rtp_qdm2_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpQDM2Depay *rtpqdm2depay; GstStateChangeReturn ret; rtpqdm2depay = GST_RTP_QDM2_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpqdm2depay->adapter); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_qdm2_depay_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (rtpqdm2depay_debug, "rtpqdm2depay", 0, "RTP QDM2 depayloader"); return gst_element_register (plugin, "rtpqdm2depay", GST_RANK_SECONDARY, GST_TYPE_RTP_QDM2_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmpadepay.h0000644000175000017500000000350311671175354016631 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MPA_DEPAY_H__ #define __GST_RTP_MPA_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MPA_DEPAY \ (gst_rtp_mpa_depay_get_type()) #define GST_RTP_MPA_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPA_DEPAY,GstRtpMPADepay)) #define GST_RTP_MPA_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPA_DEPAY,GstRtpMPADepayClass)) #define GST_IS_RTP_MPA_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPA_DEPAY)) #define GST_IS_RTP_MPA_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPA_DEPAY)) typedef struct _GstRtpMPADepay GstRtpMPADepay; typedef struct _GstRtpMPADepayClass GstRtpMPADepayClass; struct _GstRtpMPADepay { GstBaseRTPDepayload depayload; }; struct _GstRtpMPADepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mpa_depay_get_type (void); gboolean gst_rtp_mpa_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MPA_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpsirenpay.c0000644000175000017500000001135511677341656016670 00000000000000/* * Siren Payloader Gst Element * * @author: Youness Alaoui * * 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 "gstrtpsirenpay.h" #include GST_DEBUG_CATEGORY_STATIC (rtpsirenpay_debug); #define GST_CAT_DEFAULT (rtpsirenpay_debug) static GstStaticPadTemplate gst_rtp_siren_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-siren, " "dct-length = (int) 320") ); static GstStaticPadTemplate gst_rtp_siren_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 16000, " "encoding-name = (string) \"SIREN\", " "bitrate = (string) \"16000\", " "dct-length = (int) 320") ); static gboolean gst_rtp_siren_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); GST_BOILERPLATE (GstRTPSirenPay, gst_rtp_siren_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_siren_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_siren_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_siren_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP Payloader for Siren Audio", "Codec/Payloader/Network/RTP", "Packetize Siren audio streams into RTP packets", "Youness Alaoui "); } static void gst_rtp_siren_pay_class_init (GstRTPSirenPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_siren_pay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpsirenpay_debug, "rtpsirenpay", 0, "siren audio RTP payloader"); } static void gst_rtp_siren_pay_init (GstRTPSirenPay * rtpsirenpay, GstRTPSirenPayClass * klass) { GstBaseRTPPayload *basertppayload; GstBaseRTPAudioPayload *basertpaudiopayload; basertppayload = GST_BASE_RTP_PAYLOAD (rtpsirenpay); basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpsirenpay); /* we don't set the payload type, it should be set by the application using * the pt property or the default 96 will be used */ basertppayload->clock_rate = 16000; /* tell basertpaudiopayload that this is a frame based codec */ gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); } static gboolean gst_rtp_siren_pay_setcaps (GstBaseRTPPayload * basertppayload, GstCaps * caps) { GstRTPSirenPay *rtpsirenpay; GstBaseRTPAudioPayload *basertpaudiopayload; gint dct_length; GstStructure *structure; const char *payload_name; rtpsirenpay = GST_RTP_SIREN_PAY (basertppayload); basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "dct-length", &dct_length); if (dct_length != 320) goto wrong_dct; payload_name = gst_structure_get_name (structure); if (g_ascii_strcasecmp ("audio/x-siren", payload_name)) goto wrong_caps; gst_basertppayload_set_options (basertppayload, "audio", TRUE, "SIREN", 16000); /* set options for this frame based audio codec */ gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, 20, 40); return gst_basertppayload_set_outcaps (basertppayload, NULL); /* ERRORS */ wrong_dct: { GST_ERROR_OBJECT (rtpsirenpay, "dct-length must be 320, received %d", dct_length); return FALSE; } wrong_caps: { GST_ERROR_OBJECT (rtpsirenpay, "expected audio/x-siren, received %s", payload_name); return FALSE; } } gboolean gst_rtp_siren_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpsirenpay", GST_RANK_SECONDARY, GST_TYPE_RTP_SIREN_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpjpegdepay.c0000644000175000017500000005471011677341656017010 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include #include #include #include "gstrtpjpegdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpjpegdepay_debug); #define GST_CAT_DEFAULT (rtpjpegdepay_debug) static GstStaticPadTemplate gst_rtp_jpeg_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg") ); static GstStaticPadTemplate gst_rtp_jpeg_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"JPEG\"; " /* optional SDP attributes */ /* * "a-framerate = (string) 0.00, " * "x-framerate = (string) 0.00, " * "x-dimensions = (string) \"1234,1234\", " */ "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_JPEG_STRING ", " "clock-rate = (int) 90000" /* optional SDP attributes */ /* * "a-framerate = (string) 0.00, " * "x-framerate = (string) 0.00, " * "x-dimensions = (string) \"1234,1234\"" */ ) ); GST_BOILERPLATE (GstRtpJPEGDepay, gst_rtp_jpeg_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_jpeg_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_jpeg_depay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_jpeg_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_jpeg_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_jpeg_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jpeg_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_jpeg_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP JPEG depayloader", "Codec/Depayloader/Network/RTP", "Extracts JPEG video from RTP packets (RFC 2435)", "Wim Taymans "); } static void gst_rtp_jpeg_depay_class_init (GstRtpJPEGDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_jpeg_depay_finalize; gstelement_class->change_state = gst_rtp_jpeg_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_jpeg_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_jpeg_depay_process; GST_DEBUG_CATEGORY_INIT (rtpjpegdepay_debug, "rtpjpegdepay", 0, "JPEG Video RTP Depayloader"); } static void gst_rtp_jpeg_depay_init (GstRtpJPEGDepay * rtpjpegdepay, GstRtpJPEGDepayClass * klass) { rtpjpegdepay->adapter = gst_adapter_new (); } static void gst_rtp_jpeg_depay_reset (GstRtpJPEGDepay * depay) { gint i; depay->width = 0; depay->height = 0; depay->media_width = 0; depay->media_height = 0; depay->frate_num = 0; depay->frate_denom = 1; depay->discont = TRUE; for (i = 0; i < 255; i++) { g_free (depay->qtables[i]); depay->qtables[i] = NULL; } gst_adapter_clear (depay->adapter); } static void gst_rtp_jpeg_depay_finalize (GObject * object) { GstRtpJPEGDepay *rtpjpegdepay; rtpjpegdepay = GST_RTP_JPEG_DEPAY (object); gst_rtp_jpeg_depay_reset (rtpjpegdepay); g_object_unref (rtpjpegdepay->adapter); rtpjpegdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } /* * Table K.1 from JPEG spec. */ static const int jpeg_luma_quantizer[64] = { 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 }; /* * Table K.2 from JPEG spec. */ static const int jpeg_chroma_quantizer[64] = { 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 }; /* Call MakeTables with the Q factor and a guint8[128] return array */ static void MakeTables (GstRtpJPEGDepay * rtpjpegdepay, gint Q, guint8 qtable[128]) { gint i; guint factor; factor = CLAMP (Q, 1, 99); if (Q < 50) Q = 5000 / factor; else Q = 200 - factor * 2; for (i = 0; i < 64; i++) { gint lq = (jpeg_luma_quantizer[i] * Q + 50) / 100; gint cq = (jpeg_chroma_quantizer[i] * Q + 50) / 100; /* Limit the quantizers to 1 <= q <= 255 */ qtable[i] = CLAMP (lq, 1, 255); qtable[i + 64] = CLAMP (cq, 1, 255); } } static const guint8 lum_dc_codelens[] = { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; static const guint8 lum_dc_symbols[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static const guint8 lum_ac_codelens[] = { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; static const guint8 lum_ac_symbols[] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; static const guint8 chm_dc_codelens[] = { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; static const guint8 chm_dc_symbols[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static const guint8 chm_ac_codelens[] = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; static const guint8 chm_ac_symbols[] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; static guint8 * MakeQuantHeader (guint8 * p, guint8 * qt, gint size, gint tableNo) { *p++ = 0xff; *p++ = 0xdb; /* DQT */ *p++ = 0; /* length msb */ *p++ = size + 3; /* length lsb */ *p++ = tableNo; memcpy (p, qt, size); return (p + size); } static guint8 * MakeHuffmanHeader (guint8 * p, const guint8 * codelens, int ncodes, const guint8 * symbols, int nsymbols, int tableNo, int tableClass) { *p++ = 0xff; *p++ = 0xc4; /* DHT */ *p++ = 0; /* length msb */ *p++ = 3 + ncodes + nsymbols; /* length lsb */ *p++ = (tableClass << 4) | tableNo; memcpy (p, codelens, ncodes); p += ncodes; memcpy (p, symbols, nsymbols); p += nsymbols; return (p); } static guint8 * MakeDRIHeader (guint8 * p, guint16 dri) { *p++ = 0xff; *p++ = 0xdd; /* DRI */ *p++ = 0x0; /* length msb */ *p++ = 4; /* length lsb */ *p++ = dri >> 8; /* dri msb */ *p++ = dri & 0xff; /* dri lsb */ return (p); } /* * Arguments: * type, width, height: as supplied in RTP/JPEG header * qt: quantization tables as either derived from * the Q field using MakeTables() or as specified * in section 4.2. * dri: restart interval in MCUs, or 0 if no restarts. * * p: pointer to return area * * Return value: * The length of the generated headers. * * Generate a frame and scan headers that can be prepended to the * RTP/JPEG data payload to produce a JPEG compressed image in * interchange format (except for possible trailing garbage and * absence of an EOI marker to terminate the scan). */ static guint MakeHeaders (guint8 * p, int type, int width, int height, guint8 * qt, guint precision, guint16 dri) { guint8 *start = p; gint size; *p++ = 0xff; *p++ = 0xd8; /* SOI */ size = ((precision & 1) ? 128 : 64); p = MakeQuantHeader (p, qt, size, 0); qt += size; size = ((precision & 2) ? 128 : 64); p = MakeQuantHeader (p, qt, size, 1); qt += size; if (dri != 0) p = MakeDRIHeader (p, dri); *p++ = 0xff; *p++ = 0xc0; /* SOF */ *p++ = 0; /* length msb */ *p++ = 17; /* length lsb */ *p++ = 8; /* 8-bit precision */ *p++ = height >> 8; /* height msb */ *p++ = height; /* height lsb */ *p++ = width >> 8; /* width msb */ *p++ = width; /* width lsb */ *p++ = 3; /* number of components */ *p++ = 0; /* comp 0 */ if ((type & 0x3f) == 0) *p++ = 0x21; /* hsamp = 2, vsamp = 1 */ else *p++ = 0x22; /* hsamp = 2, vsamp = 2 */ *p++ = 0; /* quant table 0 */ *p++ = 1; /* comp 1 */ *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ *p++ = 1; /* quant table 1 */ *p++ = 2; /* comp 2 */ *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ *p++ = 1; /* quant table 1 */ p = MakeHuffmanHeader (p, lum_dc_codelens, sizeof (lum_dc_codelens), lum_dc_symbols, sizeof (lum_dc_symbols), 0, 0); p = MakeHuffmanHeader (p, lum_ac_codelens, sizeof (lum_ac_codelens), lum_ac_symbols, sizeof (lum_ac_symbols), 0, 1); p = MakeHuffmanHeader (p, chm_dc_codelens, sizeof (chm_dc_codelens), chm_dc_symbols, sizeof (chm_dc_symbols), 1, 0); p = MakeHuffmanHeader (p, chm_ac_codelens, sizeof (chm_ac_codelens), chm_ac_symbols, sizeof (chm_ac_symbols), 1, 1); *p++ = 0xff; *p++ = 0xda; /* SOS */ *p++ = 0; /* length msb */ *p++ = 12; /* length lsb */ *p++ = 3; /* 3 components */ *p++ = 0; /* comp 0 */ *p++ = 0; /* huffman table 0 */ *p++ = 1; /* comp 1 */ *p++ = 0x11; /* huffman table 1 */ *p++ = 2; /* comp 2 */ *p++ = 0x11; /* huffman table 1 */ *p++ = 0; /* first DCT coeff */ *p++ = 63; /* last DCT coeff */ *p++ = 0; /* sucessive approx. */ return (p - start); }; static gboolean gst_rtp_jpeg_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstRtpJPEGDepay *rtpjpegdepay; GstStructure *structure; gint clock_rate; const gchar *media_attr; rtpjpegdepay = GST_RTP_JPEG_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); GST_DEBUG_OBJECT (rtpjpegdepay, "Caps set: %" GST_PTR_FORMAT, caps); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; /* reset defaults */ rtpjpegdepay->width = 0; rtpjpegdepay->height = 0; rtpjpegdepay->media_width = 0; rtpjpegdepay->media_height = 0; rtpjpegdepay->frate_num = 0; rtpjpegdepay->frate_denom = 1; /* check for optional SDP attributes */ if ((media_attr = gst_structure_get_string (structure, "x-dimensions"))) { gint w, h; if (sscanf (media_attr, "%d,%d", &w, &h) == 2) { rtpjpegdepay->media_width = w; rtpjpegdepay->media_height = h; } } /* try to get a framerate */ media_attr = gst_structure_get_string (structure, "a-framerate"); if (!media_attr) media_attr = gst_structure_get_string (structure, "x-framerate"); if (media_attr) { GValue src = { 0 }; GValue dest = { 0 }; gchar *s; /* canonicalise floating point string so we can handle framerate strings * in the form "24.930" or "24,930" irrespective of the current locale */ s = g_strdup (media_attr); g_strdelimit (s, ",", '.'); /* convert the float to a fraction */ g_value_init (&src, G_TYPE_DOUBLE); g_value_set_double (&src, g_ascii_strtod (s, NULL)); g_value_init (&dest, GST_TYPE_FRACTION); g_value_transform (&src, &dest); rtpjpegdepay->frate_num = gst_value_get_fraction_numerator (&dest); rtpjpegdepay->frate_denom = gst_value_get_fraction_denominator (&dest); g_free (s); } return TRUE; } static GstBuffer * gst_rtp_jpeg_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpJPEGDepay *rtpjpegdepay; GstBuffer *outbuf; gint payload_len, header_len; guint8 *payload; guint frag_offset; gint Q; guint type, width, height; guint16 dri, precision, length; guint8 *qtable; rtpjpegdepay = GST_RTP_JPEG_DEPAY (depayload); if (GST_BUFFER_IS_DISCONT (buf)) { gst_adapter_clear (rtpjpegdepay->adapter); rtpjpegdepay->discont = TRUE; } payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 8) goto empty_packet; payload = gst_rtp_buffer_get_payload (buf); header_len = 0; /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type-specific | Fragment Offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type | Q | Width | Height | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ frag_offset = (payload[1] << 16) | (payload[2] << 8) | payload[3]; type = payload[4]; Q = payload[5]; width = payload[6] * 8; height = payload[7] * 8; /* allow frame dimensions > 2040, passed in SDP session or media attributes * from gstrtspsrc.c (gst_rtspsrc_sdp_attributes_to_caps), or in caps */ if (!width) width = rtpjpegdepay->media_width; if (!height) height = rtpjpegdepay->media_height; if (width == 0 || height == 0) goto invalid_dimension; GST_DEBUG_OBJECT (rtpjpegdepay, "frag %u, type %u, Q %d, width %u, height %u", frag_offset, type, Q, width, height); header_len += 8; payload += 8; payload_len -= 8; dri = 0; if (type > 63) { if (payload_len < 4) goto empty_packet; /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Restart Interval |F|L| Restart Count | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ dri = (payload[0] << 8) | payload[1]; GST_DEBUG_OBJECT (rtpjpegdepay, "DRI %" G_GUINT16_FORMAT, dri); payload += 4; header_len += 4; payload_len -= 4; } if (Q >= 128 && frag_offset == 0) { if (payload_len < 4) goto empty_packet; /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | Precision | Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Quantization Table Data | * | ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ precision = payload[1]; length = (payload[2] << 8) | payload[3]; GST_DEBUG_OBJECT (rtpjpegdepay, "precision %04x, length %" G_GUINT16_FORMAT, precision, length); if (Q == 255 && length == 0) goto empty_packet; payload += 4; header_len += 4; payload_len -= 4; if (length > payload_len) goto empty_packet; if (length > 0) qtable = payload; else qtable = rtpjpegdepay->qtables[Q]; payload += length; header_len += length; payload_len -= length; } else { length = 0; qtable = NULL; precision = 0; } if (frag_offset == 0) { guint size; if (rtpjpegdepay->width != width || rtpjpegdepay->height != height) { GstCaps *outcaps; outcaps = gst_caps_new_simple ("image/jpeg", "framerate", GST_TYPE_FRACTION, rtpjpegdepay->frate_num, rtpjpegdepay->frate_denom, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); rtpjpegdepay->width = width; rtpjpegdepay->height = height; } GST_LOG_OBJECT (rtpjpegdepay, "first packet, length %" G_GUINT16_FORMAT, length); /* first packet */ if (length == 0) { if (Q < 128) { /* no quant table, see if we have one cached */ qtable = rtpjpegdepay->qtables[Q]; if (!qtable) { GST_DEBUG_OBJECT (rtpjpegdepay, "making Q %d table", Q); /* make and cache the table */ qtable = g_new (guint8, 128); MakeTables (rtpjpegdepay, Q, qtable); rtpjpegdepay->qtables[Q] = qtable; } else { GST_DEBUG_OBJECT (rtpjpegdepay, "using cached table for Q %d", Q); } /* all 8 bit quantizers */ precision = 0; } else { if (!qtable) goto no_qtable; } } /* max header length, should be big enough */ outbuf = gst_buffer_new_and_alloc (1000); size = MakeHeaders (GST_BUFFER_DATA (outbuf), type, width, height, qtable, precision, dri); GST_DEBUG_OBJECT (rtpjpegdepay, "pushing %u bytes of header", size); GST_BUFFER_SIZE (outbuf) = size; gst_adapter_push (rtpjpegdepay->adapter, outbuf); } /* take JPEG data, push in the adapter */ GST_DEBUG_OBJECT (rtpjpegdepay, "pushing data at offset %d", header_len); outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, -1); gst_adapter_push (rtpjpegdepay->adapter, outbuf); outbuf = NULL; if (gst_rtp_buffer_get_marker (buf)) { guint avail; guint8 end[2]; guint8 *data; /* last buffer take all data out of the adapter */ avail = gst_adapter_available (rtpjpegdepay->adapter); GST_DEBUG_OBJECT (rtpjpegdepay, "marker set, last buffer"); /* take the last bytes of the jpeg data to see if there is an EOI * marker */ gst_adapter_copy (rtpjpegdepay->adapter, end, avail - 2, 2); if (end[0] != 0xff && end[1] != 0xd9) { GST_DEBUG_OBJECT (rtpjpegdepay, "no EOI marker, adding one"); /* no EOI marker, add one */ outbuf = gst_buffer_new_and_alloc (2); data = GST_BUFFER_DATA (outbuf); data[0] = 0xff; data[1] = 0xd9; gst_adapter_push (rtpjpegdepay->adapter, outbuf); avail += 2; } outbuf = gst_adapter_take_buffer (rtpjpegdepay->adapter, avail); if (rtpjpegdepay->discont) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); rtpjpegdepay->discont = FALSE; } GST_DEBUG_OBJECT (rtpjpegdepay, "returning %u bytes", avail); } return outbuf; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpjpegdepay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } invalid_dimension: { GST_ELEMENT_WARNING (rtpjpegdepay, STREAM, FORMAT, ("Invalid Dimension %dx%d.", width, height), (NULL)); return NULL; } no_qtable: { GST_WARNING_OBJECT (rtpjpegdepay, "no qtable"); return NULL; } } static GstStateChangeReturn gst_rtp_jpeg_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpJPEGDepay *rtpjpegdepay; GstStateChangeReturn ret; rtpjpegdepay = GST_RTP_JPEG_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_jpeg_depay_reset (rtpjpegdepay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: break; default: break; } return ret; } gboolean gst_rtp_jpeg_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpjpegdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_JPEG_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpg723pay.h0000644000175000017500000000363511671175354016233 00000000000000/* GStreamer * Copyright (C) <2007> Nokia Corporation * Copyright (C) <2007> Collabora Ltd * * 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_RTP_G723_PAY_H__ #define __GST_RTP_G723_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_G723_PAY \ (gst_rtp_g723_pay_get_type()) #define GST_RTP_G723_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G723_PAY,GstRTPG723Pay)) #define GST_RTP_G723_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G723_PAY,GstRTPG723PayClass)) #define GST_IS_RTP_G723_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G723_PAY)) #define GST_IS_RTP_G723_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G723_PAY)) typedef struct _GstRTPG723Pay GstRTPG723Pay; typedef struct _GstRTPG723PayClass GstRTPG723PayClass; struct _GstRTPG723Pay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime duration; GstClockTime timestamp; gboolean discont; }; struct _GstRTPG723PayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_g723_pay_get_type (void); gboolean gst_rtp_g723_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G723_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpilbcpay.h0000644000175000017500000000350711671175354016460 00000000000000/* GStreamer * Copyright (C) <2006> Philippe Khalaf * * 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_RTP_ILBC_PAY_H__ #define __GST_RTP_ILBC_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_ILBC_PAY \ (gst_rtp_ilbc_pay_get_type()) #define GST_RTP_ILBC_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ILBC_PAY,GstRTPILBCPay)) #define GST_RTP_ILBC_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ILBC_PAY,GstRTPILBCPayClass)) #define GST_IS_RTP_ILBC_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ILBC_PAY)) #define GST_IS_RTP_ILBC_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ILBC_PAY)) typedef struct _GstRTPILBCPay GstRTPILBCPay; typedef struct _GstRTPILBCPayClass GstRTPILBCPayClass; struct _GstRTPILBCPay { GstBaseRTPAudioPayload audiopayload; gint mode; }; struct _GstRTPILBCPayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_ilbc_pay_get_type (void); gboolean gst_rtp_ilbc_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_ILBC_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpamrdepay.h0000644000175000017500000000433311671175354016635 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_AMR_DEPAY_H__ #define __GST_RTP_AMR_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_AMR_DEPAY \ (gst_rtp_amr_depay_get_type()) #define GST_RTP_AMR_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AMR_DEPAY,GstRtpAMRDepay)) #define GST_RTP_AMR_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AMR_DEPAY,GstRtpAMRDepayClass)) #define GST_IS_RTP_AMR_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AMR_DEPAY)) #define GST_IS_RTP_AMR_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AMR_DEPAY)) typedef struct _GstRtpAMRDepay GstRtpAMRDepay; typedef struct _GstRtpAMRDepayClass GstRtpAMRDepayClass; typedef enum { GST_RTP_AMR_DP_MODE_INVALID = 0, GST_RTP_AMR_DP_MODE_NB = 1, GST_RTP_AMR_DP_MODE_WB = 2 } GstRtpAMRDepayMode; struct _GstRtpAMRDepay { GstBaseRTPDepayload depayload; GstRtpAMRDepayMode mode; gboolean octet_align; guint8 mode_set; gint mode_change_period; gboolean mode_change_neighbor; gint maxptime; gboolean crc; gboolean robust_sorting; gboolean interleaving; gint ptime; gint channels; }; struct _GstRtpAMRDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_amr_depay_get_type (void); gboolean gst_rtp_amr_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_AMR_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmpapay.c0000644000175000017500000002251111677341656016321 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtpmpapay.h" GST_DEBUG_CATEGORY_STATIC (rtpmpapay_debug); #define GST_CAT_DEFAULT (rtpmpapay_debug) static GstStaticPadTemplate gst_rtp_mpa_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") ); static GstStaticPadTemplate gst_rtp_mpa_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " "clock-rate = (int) 90000; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\"") ); static void gst_rtp_mpa_pay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_mpa_pay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_mpa_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static gboolean gst_rtp_mpa_pay_handle_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_mpa_pay_flush (GstRtpMPAPay * rtpmpapay); static GstFlowReturn gst_rtp_mpa_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpMPAPay, gst_rtp_mpa_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_mpa_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpa_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mpa_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG audio payloader", "Codec/Payloader/Network/RTP", "Payload MPEG audio as RTP packets (RFC 2038)", "Wim Taymans "); } static void gst_rtp_mpa_pay_class_init (GstRtpMPAPayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_mpa_pay_finalize; gstelement_class->change_state = gst_rtp_mpa_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_mpa_pay_setcaps; gstbasertppayload_class->handle_event = gst_rtp_mpa_pay_handle_event; gstbasertppayload_class->handle_buffer = gst_rtp_mpa_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpmpapay_debug, "rtpmpapay", 0, "MPEG Audio RTP Depayloader"); } static void gst_rtp_mpa_pay_init (GstRtpMPAPay * rtpmpapay, GstRtpMPAPayClass * klass) { rtpmpapay->adapter = gst_adapter_new (); } static void gst_rtp_mpa_pay_finalize (GObject * object) { GstRtpMPAPay *rtpmpapay; rtpmpapay = GST_RTP_MPA_PAY (object); g_object_unref (rtpmpapay->adapter); rtpmpapay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_mpa_pay_reset (GstRtpMPAPay * pay) { pay->first_ts = -1; pay->duration = 0; gst_adapter_clear (pay->adapter); GST_DEBUG_OBJECT (pay, "reset depayloader"); } static gboolean gst_rtp_mpa_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; gst_basertppayload_set_options (payload, "audio", TRUE, "MPA", 90000); res = gst_basertppayload_set_outcaps (payload, NULL); return res; } static gboolean gst_rtp_mpa_pay_handle_event (GstPad * pad, GstEvent * event) { GstRtpMPAPay *rtpmpapay; rtpmpapay = GST_RTP_MPA_PAY (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* make sure we push the last packets in the adapter on EOS */ gst_rtp_mpa_pay_flush (rtpmpapay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_mpa_pay_reset (rtpmpapay); break; default: break; } gst_object_unref (rtpmpapay); /* FALSE to let the parent handle the event as well */ return FALSE; } static GstFlowReturn gst_rtp_mpa_pay_flush (GstRtpMPAPay * rtpmpapay) { guint avail; GstBuffer *outbuf; GstFlowReturn ret; guint16 frag_offset; /* the data available in the adapter is either smaller * than the MTU or bigger. In the case it is smaller, the complete * adapter contents can be put in one packet. In the case the * adapter has more than one MTU, we need to split the MPA data * over multiple packets. The frag_offset in each packet header * needs to be updated with the position in the MPA frame. */ avail = gst_adapter_available (rtpmpapay->adapter); ret = GST_FLOW_OK; frag_offset = 0; while (avail > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total length of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (4 + avail, 0, 0); /* fill one MTU or all available bytes */ towrite = MIN (packet_len, GST_BASE_RTP_PAYLOAD_MTU (rtpmpapay)); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); /* create buffer to hold the payload */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); payload_len -= 4; gst_rtp_buffer_set_payload_type (outbuf, GST_RTP_PAYLOAD_MPA); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ payload = gst_rtp_buffer_get_payload (outbuf); payload[0] = 0; payload[1] = 0; payload[2] = frag_offset >> 8; payload[3] = frag_offset & 0xff; gst_adapter_copy (rtpmpapay->adapter, &payload[4], 0, payload_len); gst_adapter_flush (rtpmpapay->adapter, payload_len); avail -= payload_len; frag_offset += payload_len; if (avail == 0) gst_rtp_buffer_set_marker (outbuf, TRUE); GST_BUFFER_TIMESTAMP (outbuf) = rtpmpapay->first_ts; GST_BUFFER_DURATION (outbuf) = rtpmpapay->duration; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmpapay), outbuf); } return ret; } static GstFlowReturn gst_rtp_mpa_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpMPAPay *rtpmpapay; GstFlowReturn ret; guint size, avail; guint packet_len; GstClockTime duration, timestamp; rtpmpapay = GST_RTP_MPA_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); duration = GST_BUFFER_DURATION (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (rtpmpapay, "DISCONT"); gst_rtp_mpa_pay_reset (rtpmpapay); } avail = gst_adapter_available (rtpmpapay->adapter); /* get packet length of previous data and this new data, * payload length includes a 4 byte header */ packet_len = gst_rtp_buffer_calc_packet_len (4 + avail + size, 0, 0); /* if this buffer is going to overflow the packet, flush what we * have. */ if (gst_basertppayload_is_filled (basepayload, packet_len, rtpmpapay->duration + duration)) { ret = gst_rtp_mpa_pay_flush (rtpmpapay); avail = 0; } else { ret = GST_FLOW_OK; } if (avail == 0) { GST_DEBUG_OBJECT (rtpmpapay, "first packet, save timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); rtpmpapay->first_ts = timestamp; rtpmpapay->duration = 0; } gst_adapter_push (rtpmpapay->adapter, buffer); rtpmpapay->duration = duration; return ret; } static GstStateChangeReturn gst_rtp_mpa_pay_change_state (GstElement * element, GstStateChange transition) { GstRtpMPAPay *rtpmpapay; GstStateChangeReturn ret; rtpmpapay = GST_RTP_MPA_PAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_mpa_pay_reset (rtpmpapay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_mpa_pay_reset (rtpmpapay); break; default: break; } return ret; } gboolean gst_rtp_mpa_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmpapay", GST_RANK_SECONDARY, GST_TYPE_RTP_MPA_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph264pay.c0000644000175000017500000012210511720520772016212 00000000000000/* ex: set tabstop=2 shiftwidth=2 expandtab: */ /* GStreamer * * 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 #include #include #include #include "gstrtph264pay.h" #define IDR_TYPE_ID 5 #define SPS_TYPE_ID 7 #define PPS_TYPE_ID 8 #define USE_MEMCMP GST_DEBUG_CATEGORY_STATIC (rtph264pay_debug); #define GST_CAT_DEFAULT (rtph264pay_debug) /* references: * * RFC 3984 */ static GstStaticPadTemplate gst_rtp_h264_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h264") ); static GstStaticPadTemplate gst_rtp_h264_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") ); #define GST_TYPE_H264_SCAN_MODE (gst_h264_scan_mode_get_type()) static GType gst_h264_scan_mode_get_type (void) { static GType h264_scan_mode_type = 0; static const GEnumValue h264_scan_modes[] = { {GST_H264_SCAN_MODE_BYTESTREAM, "Scan complete bytestream for NALUs", "bytestream"}, {GST_H264_SCAN_MODE_MULTI_NAL, "Buffers contain multiple complete NALUs", "multiple"}, {GST_H264_SCAN_MODE_SINGLE_NAL, "Buffers contain a single complete NALU", "single"}, {0, NULL, NULL}, }; if (!h264_scan_mode_type) { h264_scan_mode_type = g_enum_register_static ("GstH264PayScanMode", h264_scan_modes); } return h264_scan_mode_type; } #define DEFAULT_PROFILE_LEVEL_ID NULL #define DEFAULT_SPROP_PARAMETER_SETS NULL #define DEFAULT_SCAN_MODE GST_H264_SCAN_MODE_MULTI_NAL #define DEFAULT_BUFFER_LIST FALSE #define DEFAULT_CONFIG_INTERVAL 0 enum { PROP_0, PROP_PROFILE_LEVEL_ID, PROP_SPROP_PARAMETER_SETS, PROP_SCAN_MODE, PROP_BUFFER_LIST, PROP_CONFIG_INTERVAL, PROP_LAST }; #define IS_ACCESS_UNIT(x) (((x) > 0x00) && ((x) < 0x06)) static void gst_rtp_h264_pay_finalize (GObject * object); static void gst_rtp_h264_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_h264_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_rtp_h264_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad); static gboolean gst_rtp_h264_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstFlowReturn gst_rtp_h264_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); static gboolean gst_rtp_h264_pay_handle_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_basertppayload_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstRtpH264Pay, gst_rtp_h264_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_h264_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h264_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h264_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP H264 payloader", "Codec/Payloader/Network/RTP", "Payload-encode H264 video into RTP packets (RFC 3984)", "Laurent Glayal "); } static void gst_rtp_h264_pay_class_init (GstRtpH264PayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_rtp_h264_pay_set_property; gobject_class->get_property = gst_rtp_h264_pay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PROFILE_LEVEL_ID, g_param_spec_string ("profile-level-id", "profile-level-id", "The base64 profile-level-id to set in the sink caps (deprecated)", DEFAULT_PROFILE_LEVEL_ID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SPROP_PARAMETER_SETS, g_param_spec_string ("sprop-parameter-sets", "sprop-parameter-sets", "The base64 sprop-parameter-sets to set in out caps (set to NULL to " "extract from stream)", DEFAULT_SPROP_PARAMETER_SETS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SCAN_MODE, g_param_spec_enum ("scan-mode", "Scan Mode", "How to scan the input buffers for NAL units. Performance can be " "increased when certain assumptions are made about the input buffers", GST_TYPE_H264_SCAN_MODE, DEFAULT_SCAN_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, g_param_spec_boolean ("buffer-list", "Buffer List", "Use Buffer Lists", DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CONFIG_INTERVAL, g_param_spec_uint ("config-interval", "SPS PPS Send Interval", "Send SPS and PPS Insertion Interval in seconds (sprop parameter sets " "will be multiplexed in the data stream when detected.) (0 = disabled)", 0, 3600, DEFAULT_CONFIG_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); gobject_class->finalize = gst_rtp_h264_pay_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_basertppayload_change_state); gstbasertppayload_class->get_caps = gst_rtp_h264_pay_getcaps; gstbasertppayload_class->set_caps = gst_rtp_h264_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_h264_pay_handle_buffer; gstbasertppayload_class->handle_event = gst_rtp_h264_pay_handle_event; GST_DEBUG_CATEGORY_INIT (rtph264pay_debug, "rtph264pay", 0, "H264 RTP Payloader"); } static void gst_rtp_h264_pay_init (GstRtpH264Pay * rtph264pay, GstRtpH264PayClass * klass) { rtph264pay->queue = g_array_new (FALSE, FALSE, sizeof (guint)); rtph264pay->profile = 0; rtph264pay->sps = NULL; rtph264pay->pps = NULL; rtph264pay->last_spspps = -1; rtph264pay->scan_mode = GST_H264_SCAN_MODE_MULTI_NAL; rtph264pay->buffer_list = DEFAULT_BUFFER_LIST; rtph264pay->spspps_interval = DEFAULT_CONFIG_INTERVAL; rtph264pay->adapter = gst_adapter_new (); } static void gst_rtp_h264_pay_clear_sps_pps (GstRtpH264Pay * rtph264pay) { g_list_foreach (rtph264pay->sps, (GFunc) gst_mini_object_unref, NULL); g_list_free (rtph264pay->sps); rtph264pay->sps = NULL; g_list_foreach (rtph264pay->pps, (GFunc) gst_mini_object_unref, NULL); g_list_free (rtph264pay->pps); rtph264pay->pps = NULL; } static void gst_rtp_h264_pay_finalize (GObject * object) { GstRtpH264Pay *rtph264pay; rtph264pay = GST_RTP_H264_PAY (object); g_array_free (rtph264pay->queue, TRUE); gst_rtp_h264_pay_clear_sps_pps (rtph264pay); g_free (rtph264pay->sprop_parameter_sets); g_object_unref (rtph264pay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static const gchar *all_levels[] = { "1", "1b", "1.1", "1.2", "1.3", "2", "2.1", "2.2", "3", "3.1", "3.2", "4", "4.1", "4.2", "5", "5.1", NULL }; static GstCaps * gst_rtp_h264_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad) { GstCaps *allowed_caps; allowed_caps = gst_pad_peer_get_caps_reffed (GST_BASE_RTP_PAYLOAD_SRCPAD (payload)); if (allowed_caps) { GstCaps *caps = NULL; guint i; if (gst_caps_is_any (allowed_caps)) { gst_caps_unref (allowed_caps); goto any; } if (gst_caps_is_empty (allowed_caps)) return allowed_caps; caps = gst_caps_new_empty (); for (i = 0; i < gst_caps_get_size (allowed_caps); i++) { GstStructure *s = gst_caps_get_structure (allowed_caps, i); GstStructure *new_s = gst_structure_new ("video/x-h264", NULL); const gchar *profile_level_id; profile_level_id = gst_structure_get_string (s, "profile-level-id"); if (profile_level_id && strlen (profile_level_id) == 6) { const gchar *profile; const gchar *level; long int spsint; guint8 sps[3]; spsint = strtol (profile_level_id, NULL, 16); sps[0] = spsint >> 16; sps[1] = spsint >> 8; sps[2] = spsint; profile = gst_codec_utils_h264_get_profile (sps, 3); level = gst_codec_utils_h264_get_level (sps, 3); if (profile && level) { GST_LOG_OBJECT (payload, "In caps, have profile %s and level %s", profile, level); if (!strcmp (profile, "constrained-baseline")) gst_structure_set (new_s, "profile", G_TYPE_STRING, profile, NULL); else { GValue val = { 0, }; GValue profiles = { 0, }; g_value_init (&profiles, GST_TYPE_LIST); g_value_init (&val, G_TYPE_STRING); g_value_set_static_string (&val, profile); gst_value_list_append_value (&profiles, &val); g_value_set_static_string (&val, "constrained-baseline"); gst_value_list_append_value (&profiles, &val); gst_structure_take_value (new_s, "profile", &profiles); } if (!strcmp (level, "1")) gst_structure_set (new_s, "level", G_TYPE_STRING, level, NULL); else { GValue levels = { 0, }; GValue val = { 0, }; int j; g_value_init (&levels, GST_TYPE_LIST); g_value_init (&val, G_TYPE_STRING); for (j = 0; all_levels[j]; j++) { g_value_set_static_string (&val, all_levels[j]); gst_value_list_prepend_value (&levels, &val); if (!strcmp (level, all_levels[j])) break; } gst_structure_take_value (new_s, "level", &levels); } } else { /* Invalid profile-level-id means baseline */ gst_structure_set (new_s, "profile", G_TYPE_STRING, "constrained-baseline", NULL); } } else { /* No profile-level-id also means baseline */ gst_structure_set (new_s, "profile", G_TYPE_STRING, "constrained-baseline", NULL); } gst_caps_merge_structure (caps, new_s); } gst_caps_unref (allowed_caps); return caps; } any: return gst_caps_new_simple ("video/x-h264", NULL); } /* take the currently configured SPS and PPS lists and set them on the caps as * sprop-parameter-sets */ static gboolean gst_rtp_h264_pay_set_sps_pps (GstBaseRTPPayload * basepayload) { GstRtpH264Pay *payloader = GST_RTP_H264_PAY (basepayload); gchar *profile; gchar *set; GList *walk; GString *sprops; guint count; gboolean res; sprops = g_string_new (""); count = 0; /* build the sprop-parameter-sets */ for (walk = payloader->sps; walk; walk = g_list_next (walk)) { GstBuffer *sps_buf = GST_BUFFER_CAST (walk->data); set = g_base64_encode (GST_BUFFER_DATA (sps_buf), GST_BUFFER_SIZE (sps_buf)); g_string_append_printf (sprops, "%s%s", count ? "," : "", set); g_free (set); count++; } for (walk = payloader->pps; walk; walk = g_list_next (walk)) { GstBuffer *pps_buf = GST_BUFFER_CAST (walk->data); set = g_base64_encode (GST_BUFFER_DATA (pps_buf), GST_BUFFER_SIZE (pps_buf)); g_string_append_printf (sprops, "%s%s", count ? "," : "", set); g_free (set); count++; } /* profile is 24 bit. Force it to respect the limit */ profile = g_strdup_printf ("%06x", payloader->profile & 0xffffff); /* combine into output caps */ res = gst_basertppayload_set_outcaps (basepayload, "sprop-parameter-sets", G_TYPE_STRING, sprops->str, NULL); g_string_free (sprops, TRUE); g_free (profile); return res; } static gboolean gst_rtp_h264_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstRtpH264Pay *rtph264pay; GstStructure *str; const GValue *value; guint8 *data; guint size; const gchar *alignment; rtph264pay = GST_RTP_H264_PAY (basepayload); str = gst_caps_get_structure (caps, 0); /* we can only set the output caps when we found the sprops and profile * NALs */ gst_basertppayload_set_options (basepayload, "video", TRUE, "H264", 90000); alignment = gst_structure_get_string (str, "alignment"); if (alignment && !strcmp (alignment, "au")) rtph264pay->au_alignment = TRUE; else rtph264pay->au_alignment = FALSE; /* packetized AVC video has a codec_data */ if ((value = gst_structure_get_value (str, "codec_data"))) { GstBuffer *buffer; guint num_sps, num_pps; gint i, nal_size; GST_DEBUG_OBJECT (rtph264pay, "have packetized h264"); rtph264pay->packetized = TRUE; buffer = gst_value_get_buffer (value); data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); /* parse the avcC data */ if (size < 7) goto avcc_too_small; /* parse the version, this must be 1 */ if (data[0] != 1) goto wrong_version; /* AVCProfileIndication */ /* profile_compat */ /* AVCLevelIndication */ rtph264pay->profile = (data[1] << 16) | (data[2] << 8) | data[3]; GST_DEBUG_OBJECT (rtph264pay, "profile %06x", rtph264pay->profile); /* 6 bits reserved | 2 bits lengthSizeMinusOne */ /* this is the number of bytes in front of the NAL units to mark their * length */ rtph264pay->nal_length_size = (data[4] & 0x03) + 1; GST_DEBUG_OBJECT (rtph264pay, "nal length %u", rtph264pay->nal_length_size); /* 3 bits reserved | 5 bits numOfSequenceParameterSets */ num_sps = data[5] & 0x1f; GST_DEBUG_OBJECT (rtph264pay, "num SPS %u", num_sps); data += 6; size -= 6; /* create the sprop-parameter-sets */ for (i = 0; i < num_sps; i++) { GstBuffer *sps_buf; if (size < 2) goto avcc_error; nal_size = (data[0] << 8) | data[1]; data += 2; size -= 2; GST_LOG_OBJECT (rtph264pay, "SPS %d size %d", i, nal_size); if (size < nal_size) goto avcc_error; /* make a buffer out of it and add to SPS list */ sps_buf = gst_buffer_new_and_alloc (nal_size); memcpy (GST_BUFFER_DATA (sps_buf), data, nal_size); rtph264pay->sps = g_list_append (rtph264pay->sps, sps_buf); data += nal_size; size -= nal_size; } if (size < 1) goto avcc_error; /* 8 bits numOfPictureParameterSets */ num_pps = data[0]; data += 1; size -= 1; GST_DEBUG_OBJECT (rtph264pay, "num PPS %u", num_pps); for (i = 0; i < num_pps; i++) { GstBuffer *pps_buf; if (size < 2) goto avcc_error; nal_size = (data[0] << 8) | data[1]; data += 2; size -= 2; GST_LOG_OBJECT (rtph264pay, "PPS %d size %d", i, nal_size); if (size < nal_size) goto avcc_error; /* make a buffer out of it and add to PPS list */ pps_buf = gst_buffer_new_and_alloc (nal_size); memcpy (GST_BUFFER_DATA (pps_buf), data, nal_size); rtph264pay->pps = g_list_append (rtph264pay->pps, pps_buf); data += nal_size; size -= nal_size; } /* and update the caps with the collected data */ if (!gst_rtp_h264_pay_set_sps_pps (basepayload)) return FALSE; } else { GST_DEBUG_OBJECT (rtph264pay, "have bytestream h264"); rtph264pay->packetized = FALSE; } return TRUE; avcc_too_small: { GST_ERROR_OBJECT (rtph264pay, "avcC size %u < 7", size); return FALSE; } wrong_version: { GST_ERROR_OBJECT (rtph264pay, "wrong avcC version"); return FALSE; } avcc_error: { GST_ERROR_OBJECT (rtph264pay, "avcC too small "); return FALSE; } } static void gst_rtp_h264_pay_parse_sprop_parameter_sets (GstRtpH264Pay * rtph264pay) { const gchar *ps; gchar **params; guint len, num_sps, num_pps; gint i; GstBuffer *buf; ps = rtph264pay->sprop_parameter_sets; if (ps == NULL) return; gst_rtp_h264_pay_clear_sps_pps (rtph264pay); params = g_strsplit (ps, ",", 0); len = g_strv_length (params); GST_DEBUG_OBJECT (rtph264pay, "we have %d params", len); num_sps = num_pps = 0; for (i = 0; params[i]; i++) { gsize nal_len; guint8 *nalp; guint save = 0; gint state = 0; nal_len = strlen (params[i]); buf = gst_buffer_new_and_alloc (nal_len); nalp = GST_BUFFER_DATA (buf); nal_len = g_base64_decode_step (params[i], nal_len, nalp, &state, &save); GST_BUFFER_SIZE (buf) = nal_len; if (!nal_len) { gst_buffer_unref (buf); continue; } /* append to the right list */ if ((nalp[0] & 0x1f) == 7) { GST_DEBUG_OBJECT (rtph264pay, "adding param %d as SPS %d", i, num_sps); rtph264pay->sps = g_list_append (rtph264pay->sps, buf); num_sps++; } else { GST_DEBUG_OBJECT (rtph264pay, "adding param %d as PPS %d", i, num_pps); rtph264pay->pps = g_list_append (rtph264pay->pps, buf); num_pps++; } } g_strfreev (params); } static guint next_start_code (const guint8 * data, guint size) { /* Boyer-Moore string matching algorithm, in a degenerative * sense because our search 'alphabet' is binary - 0 & 1 only. * This allow us to simplify the general BM algorithm to a very * simple form. */ /* assume 1 is in the 3th byte */ guint offset = 2; while (offset < size) { if (1 == data[offset]) { unsigned int shift = offset; if (0 == data[--shift]) { if (0 == data[--shift]) { return shift; } } /* The jump is always 3 because of the 1 previously matched. * All the 0's must be after this '1' matched at offset */ offset += 3; } else if (0 == data[offset]) { /* maybe next byte is 1? */ offset++; } else { /* can jump 3 bytes forward */ offset += 3; } /* at each iteration, we rescan in a backward manner until * we match 0.0.1 in reverse order. Since our search string * has only 2 'alpabets' (i.e. 0 & 1), we know that any * mismatch will force us to shift a fixed number of steps */ } GST_DEBUG ("Cannot find next NAL start code. returning %u", size); return size; } static gboolean gst_rtp_h264_pay_decode_nal (GstRtpH264Pay * payloader, const guint8 * data, guint size, GstClockTime timestamp) { const guint8 *sps = NULL, *pps = NULL; guint sps_len = 0, pps_len = 0; guint8 header, type; guint len; gboolean updated; /* default is no update */ updated = FALSE; GST_DEBUG ("NAL payload len=%u", size); len = size; header = data[0]; type = header & 0x1f; /* keep sps & pps separately so that we can update either one * independently. We also record the timestamp of the last SPS/PPS so * that we can insert them at regular intervals and when needed. */ if (SPS_TYPE_ID == type) { /* encode the entire SPS NAL in base64 */ GST_DEBUG ("Found SPS %x %x %x Len=%u", (header >> 7), (header >> 5) & 3, type, len); sps = data; sps_len = len; /* remember when we last saw SPS */ if (timestamp != -1) payloader->last_spspps = timestamp; } else if (PPS_TYPE_ID == type) { /* encoder the entire PPS NAL in base64 */ GST_DEBUG ("Found PPS %x %x %x Len = %u", (header >> 7), (header >> 5) & 3, type, len); pps = data; pps_len = len; /* remember when we last saw PPS */ if (timestamp != -1) payloader->last_spspps = timestamp; } else { GST_DEBUG ("NAL: %x %x %x Len = %u", (header >> 7), (header >> 5) & 3, type, len); } /* If we encountered an SPS and/or a PPS, check if it's the * same as the one we have. If not, update our version and * set updated to TRUE */ if (sps_len > 0) { GstBuffer *sps_buf; if (payloader->sps != NULL) { sps_buf = GST_BUFFER_CAST (payloader->sps->data); if ((GST_BUFFER_SIZE (sps_buf) != sps_len) || memcmp (GST_BUFFER_DATA (sps_buf), sps, sps_len)) { /* something changed, update */ payloader->profile = (sps[1] << 16) + (sps[2] << 8) + sps[3]; GST_DEBUG ("Profile level IDC = %06x", payloader->profile); updated = TRUE; } } else { /* no previous SPS, update */ updated = TRUE; } if (updated) { sps_buf = gst_buffer_new_and_alloc (sps_len); memcpy (GST_BUFFER_DATA (sps_buf), sps, sps_len); if (payloader->sps) { /* replace old buffer */ gst_buffer_unref (payloader->sps->data); payloader->sps->data = sps_buf; } else { /* add new buffer */ payloader->sps = g_list_prepend (payloader->sps, sps_buf); } } } if (pps_len > 0) { GstBuffer *pps_buf; if (payloader->pps != NULL) { pps_buf = GST_BUFFER_CAST (payloader->pps->data); if ((GST_BUFFER_SIZE (pps_buf) != pps_len) || memcmp (GST_BUFFER_DATA (pps_buf), pps, pps_len)) { /* something changed, update */ updated = TRUE; } } else { /* no previous SPS, update */ updated = TRUE; } if (updated) { pps_buf = gst_buffer_new_and_alloc (pps_len); memcpy (GST_BUFFER_DATA (pps_buf), pps, pps_len); if (payloader->pps) { /* replace old buffer */ gst_buffer_unref (payloader->pps->data); payloader->pps->data = pps_buf; } else { /* add new buffer */ payloader->pps = g_list_prepend (payloader->pps, pps_buf); } } } return updated; } static GstFlowReturn gst_rtp_h264_pay_payload_nal (GstBaseRTPPayload * basepayload, const guint8 * data, guint size, GstClockTime timestamp, GstBuffer * buffer_orig, gboolean end_of_au); static GstFlowReturn gst_rtp_h264_pay_send_sps_pps (GstBaseRTPPayload * basepayload, GstRtpH264Pay * rtph264pay, GstClockTime timestamp) { GstFlowReturn ret = GST_FLOW_OK; GList *walk; for (walk = rtph264pay->sps; walk; walk = g_list_next (walk)) { GstBuffer *sps_buf = GST_BUFFER_CAST (walk->data); GST_DEBUG_OBJECT (rtph264pay, "inserting SPS in the stream"); /* resend SPS */ ret = gst_rtp_h264_pay_payload_nal (basepayload, GST_BUFFER_DATA (sps_buf), GST_BUFFER_SIZE (sps_buf), timestamp, sps_buf, FALSE); /* Not critical here; but throw a warning */ if (ret != GST_FLOW_OK) GST_WARNING ("Problem pushing SPS"); } for (walk = rtph264pay->pps; walk; walk = g_list_next (walk)) { GstBuffer *pps_buf = GST_BUFFER_CAST (walk->data); GST_DEBUG_OBJECT (rtph264pay, "inserting PPS in the stream"); /* resend PPS */ ret = gst_rtp_h264_pay_payload_nal (basepayload, GST_BUFFER_DATA (pps_buf), GST_BUFFER_SIZE (pps_buf), timestamp, pps_buf, FALSE); /* Not critical here; but throw a warning */ if (ret != GST_FLOW_OK) GST_WARNING ("Problem pushing PPS"); } if (timestamp != -1) rtph264pay->last_spspps = timestamp; return ret; } static GstFlowReturn gst_rtp_h264_pay_payload_nal (GstBaseRTPPayload * basepayload, const guint8 * data, guint size, GstClockTime timestamp, GstBuffer * buffer_orig, gboolean end_of_au) { GstRtpH264Pay *rtph264pay; GstFlowReturn ret; guint8 nalType; guint packet_len, payload_len, mtu; GstBuffer *outbuf; guint8 *payload; GstBufferList *list = NULL; GstBufferListIterator *it = NULL; gboolean send_spspps; rtph264pay = GST_RTP_H264_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (rtph264pay); nalType = data[0] & 0x1f; GST_DEBUG_OBJECT (rtph264pay, "Processing Buffer with NAL TYPE=%d", nalType); send_spspps = FALSE; /* check if we need to emit an SPS/PPS now */ if (nalType == IDR_TYPE_ID && rtph264pay->spspps_interval > 0) { if (rtph264pay->last_spspps != -1) { guint64 diff; GST_LOG_OBJECT (rtph264pay, "now %" GST_TIME_FORMAT ", last SPS/PPS %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (rtph264pay->last_spspps)); /* calculate diff between last SPS/PPS in milliseconds */ if (timestamp > rtph264pay->last_spspps) diff = timestamp - rtph264pay->last_spspps; else diff = 0; GST_DEBUG_OBJECT (rtph264pay, "interval since last SPS/PPS %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); /* bigger than interval, queue SPS/PPS */ if (GST_TIME_AS_SECONDS (diff) >= rtph264pay->spspps_interval) { GST_DEBUG_OBJECT (rtph264pay, "time to send SPS/PPS"); send_spspps = TRUE; } } else { /* no know previous SPS/PPS time, send now */ GST_DEBUG_OBJECT (rtph264pay, "no previous SPS/PPS time, send now"); send_spspps = TRUE; } } if (send_spspps || rtph264pay->send_spspps) { /* we need to send SPS/PPS now first. FIXME, don't use the timestamp for * checking when we need to send SPS/PPS but convert to running_time first. */ rtph264pay->send_spspps = FALSE; ret = gst_rtp_h264_pay_send_sps_pps (basepayload, rtph264pay, timestamp); if (ret != GST_FLOW_OK) return ret; } packet_len = gst_rtp_buffer_calc_packet_len (size, 0, 0); if (packet_len < mtu) { GST_DEBUG_OBJECT (basepayload, "NAL Unit fit in one packet datasize=%d mtu=%d", size, mtu); /* will fit in one packet */ if (rtph264pay->buffer_list) { /* use buffer lists * first create buffer without payload containing only the RTP header * and then another buffer containing the payload. both buffers will * be then added to the list */ outbuf = gst_rtp_buffer_new_allocate (0, 0, 0); } else { /* use the old-fashioned way with a single buffer and memcpy */ outbuf = gst_rtp_buffer_new_allocate (size, 0, 0); } /* only set the marker bit on packets containing access units */ if (IS_ACCESS_UNIT (nalType) && end_of_au) { gst_rtp_buffer_set_marker (outbuf, 1); } /* timestamp the outbuffer */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (rtph264pay->buffer_list) { GstBuffer *paybuf; /* create another buffer with the payload. */ if (buffer_orig) paybuf = gst_buffer_create_sub (buffer_orig, data - GST_BUFFER_DATA (buffer_orig), size); else { paybuf = gst_buffer_new_and_alloc (size); memcpy (GST_BUFFER_DATA (paybuf), data, size); } list = gst_buffer_list_new (); it = gst_buffer_list_iterate (list); /* add both buffers to the buffer list */ gst_buffer_list_iterator_add_group (it); gst_buffer_list_iterator_add (it, outbuf); gst_buffer_list_iterator_add (it, paybuf); gst_buffer_list_iterator_free (it); /* push the list to the next element in the pipe */ ret = gst_basertppayload_push_list (basepayload, list); } else { payload = gst_rtp_buffer_get_payload (outbuf); GST_DEBUG_OBJECT (basepayload, "Copying %d bytes to outbuf", size); memcpy (payload, data, size); ret = gst_basertppayload_push (basepayload, outbuf); } } else { /* fragmentation Units FU-A */ guint8 nalHeader; guint limitedSize; int ii = 0, start = 1, end = 0, pos = 0; GST_DEBUG_OBJECT (basepayload, "NAL Unit DOES NOT fit in one packet datasize=%d mtu=%d", size, mtu); nalHeader = *data; pos++; size--; ret = GST_FLOW_OK; GST_DEBUG_OBJECT (basepayload, "Using FU-A fragmentation for data size=%d", size); /* We keep 2 bytes for FU indicator and FU Header */ payload_len = gst_rtp_buffer_calc_payload_len (mtu - 2, 0, 0); if (rtph264pay->buffer_list) { list = gst_buffer_list_new (); it = gst_buffer_list_iterate (list); } while (end == 0) { limitedSize = size < payload_len ? size : payload_len; GST_DEBUG_OBJECT (basepayload, "Inside FU-A fragmentation limitedSize=%d iteration=%d", limitedSize, ii); if (rtph264pay->buffer_list) { /* use buffer lists * first create buffer without payload containing only the RTP header * and then another buffer containing the payload. both buffers will * be then added to the list */ outbuf = gst_rtp_buffer_new_allocate (2, 0, 0); } else { /* use the old-fashioned way with a single buffer and memcpy * first create buffer to hold the payload */ outbuf = gst_rtp_buffer_new_allocate (limitedSize + 2, 0, 0); } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; payload = gst_rtp_buffer_get_payload (outbuf); if (limitedSize == size) { GST_DEBUG_OBJECT (basepayload, "end size=%d iteration=%d", size, ii); end = 1; } if (IS_ACCESS_UNIT (nalType)) { gst_rtp_buffer_set_marker (outbuf, end && end_of_au); } /* FU indicator */ payload[0] = (nalHeader & 0x60) | 28; /* FU Header */ payload[1] = (start << 7) | (end << 6) | (nalHeader & 0x1f); if (rtph264pay->buffer_list) { GstBuffer *paybuf; /* create another buffer to hold the payload */ if (buffer_orig) paybuf = gst_buffer_create_sub (buffer_orig, data - GST_BUFFER_DATA (buffer_orig) + pos, limitedSize); else { paybuf = gst_buffer_new_and_alloc (limitedSize); memcpy (GST_BUFFER_DATA (paybuf), data + pos, limitedSize); } /* create a new group to hold the header and the payload */ gst_buffer_list_iterator_add_group (it); /* add both buffers to the buffer list */ gst_buffer_list_iterator_add (it, outbuf); gst_buffer_list_iterator_add (it, paybuf); } else { memcpy (&payload[2], data + pos, limitedSize); GST_DEBUG_OBJECT (basepayload, "recorded %d payload bytes into packet iteration=%d", limitedSize + 2, ii); ret = gst_basertppayload_push (basepayload, outbuf); if (ret != GST_FLOW_OK) break; } size -= limitedSize; pos += limitedSize; ii++; start = 0; } if (rtph264pay->buffer_list) { /* free iterator and push the whole buffer list at once */ gst_buffer_list_iterator_free (it); ret = gst_basertppayload_push_list (basepayload, list); } } return ret; } static GstFlowReturn gst_rtp_h264_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpH264Pay *rtph264pay; GstFlowReturn ret; guint size, nal_len, i; const guint8 *data, *nal_data; GstClockTime timestamp; GArray *nal_queue; guint pushed = 0; rtph264pay = GST_RTP_H264_PAY (basepayload); /* the input buffer contains one or more NAL units */ if (rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) { timestamp = gst_adapter_prev_timestamp (rtph264pay->adapter, NULL); gst_adapter_push (rtph264pay->adapter, buffer); size = gst_adapter_available (rtph264pay->adapter); data = gst_adapter_peek (rtph264pay->adapter, size); GST_DEBUG_OBJECT (basepayload, "got %d bytes (%d)", size, GST_BUFFER_SIZE (buffer)); if (!GST_CLOCK_TIME_IS_VALID (timestamp)) timestamp = GST_BUFFER_TIMESTAMP (buffer); } else { size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); } ret = GST_FLOW_OK; /* now loop over all NAL units and put them in a packet * FIXME, we should really try to pack multiple NAL units into one RTP packet * if we can, especially for the config packets that wont't cause decoder * latency. */ if (rtph264pay->packetized) { guint nal_length_size; nal_length_size = rtph264pay->nal_length_size; while (size > nal_length_size) { gint i; gboolean end_of_au = FALSE; nal_len = 0; for (i = 0; i < nal_length_size; i++) { nal_len = ((nal_len << 8) + data[i]); } /* skip the length bytes, make sure we don't run past the buffer size */ data += nal_length_size; size -= nal_length_size; if (size >= nal_len) { GST_DEBUG_OBJECT (basepayload, "got NAL of size %u", nal_len); } else { nal_len = size; GST_DEBUG_OBJECT (basepayload, "got incomplete NAL of size %u", nal_len); } /* If we're at the end of the buffer, then we're at the end of the * access unit */ if (rtph264pay->au_alignment && size - nal_len <= nal_length_size) { end_of_au = TRUE; } ret = gst_rtp_h264_pay_payload_nal (basepayload, data, nal_len, timestamp, buffer, end_of_au); if (ret != GST_FLOW_OK) break; data += nal_len; size -= nal_len; } } else { guint next; gboolean update = FALSE; /* get offset of first start code */ next = next_start_code (data, size); /* skip to start code, if no start code is found, next will be size and we * will not collect data. */ data += next; size -= next; nal_data = data; nal_queue = rtph264pay->queue; /* array must be empty when we get here */ g_assert (nal_queue->len == 0); GST_DEBUG_OBJECT (basepayload, "found first start at %u, bytes left %u", next, size); /* first pass to locate NALs and parse SPS/PPS */ while (size > 4) { /* skip start code */ data += 3; size -= 3; if (rtph264pay->scan_mode == GST_H264_SCAN_MODE_SINGLE_NAL) { /* we are told that there is only a single NAL in this packet so that we * can avoid scanning for the next NAL. */ next = size; } else { /* use next_start_code() to scan buffer. * next_start_code() returns the offset in data, * starting from zero to the first byte of 0.0.0.1 * If no start code is found, it returns the value of the * 'size' parameter. * data is unchanged by the call to next_start_code() */ next = next_start_code (data, size); if (next == size && rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) { /* Didn't find the start of next NAL, handle it next time */ break; } } /* nal length is distance to next start code */ nal_len = next; GST_DEBUG_OBJECT (basepayload, "found next start at %u of size %u", next, nal_len); if (rtph264pay->sprop_parameter_sets != NULL) { /* explicitly set profile and sprop, use those */ if (rtph264pay->update_caps) { if (!gst_basertppayload_set_outcaps (basepayload, "sprop-parameter-sets", G_TYPE_STRING, rtph264pay->sprop_parameter_sets, NULL)) goto caps_rejected; /* parse SPS and PPS from provided parameter set (for insertion) */ gst_rtp_h264_pay_parse_sprop_parameter_sets (rtph264pay); rtph264pay->update_caps = FALSE; GST_DEBUG ("outcaps update: sprop-parameter-sets=%s", rtph264pay->sprop_parameter_sets); } } else { /* We know our stream is a valid H264 NAL packet, * go parse it for SPS/PPS to enrich the caps */ /* order: make sure to check nal */ update = gst_rtp_h264_pay_decode_nal (rtph264pay, data, nal_len, timestamp) || update; } /* move to next NAL packet */ data += nal_len; size -= nal_len; g_array_append_val (nal_queue, nal_len); } /* if has new SPS & PPS, update the output caps */ if (G_UNLIKELY (update)) if (!gst_rtp_h264_pay_set_sps_pps (basepayload)) goto caps_rejected; /* second pass to payload and push */ data = nal_data; pushed = 0; for (i = 0; i < nal_queue->len; i++) { guint size; gboolean end_of_au = FALSE; nal_len = g_array_index (nal_queue, guint, i); /* skip start code */ data += 3; /* Trim the end unless we're the last NAL in the buffer. * In case we're not at the end of the buffer we know the next block * starts with 0x000001 so all the 0x00 bytes at the end of this one are * trailing 0x0 that can be discarded */ size = nal_len; if (i + 1 != nal_queue->len || rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) for (; size > 1 && data[size - 1] == 0x0; size--) /* skip */ ; /* If it's the last nal unit we have in non-bytestream mode, we can * assume it's the end of an access-unit * * FIXME: We need to wait until the next packet or EOS to * actually payload the NAL so we can know if the current NAL is * the last one of an access unit or not if we are in bytestream mode */ if (rtph264pay->au_alignment && rtph264pay->scan_mode != GST_H264_SCAN_MODE_BYTESTREAM && i == nal_queue->len - 1) end_of_au = TRUE; /* put the data in one or more RTP packets */ ret = gst_rtp_h264_pay_payload_nal (basepayload, data, size, timestamp, buffer, end_of_au); if (ret != GST_FLOW_OK) { break; } /* move to next NAL packet */ data += nal_len; size -= nal_len; pushed += nal_len + 3; } g_array_set_size (nal_queue, 0); } if (rtph264pay->scan_mode == GST_H264_SCAN_MODE_BYTESTREAM) gst_adapter_flush (rtph264pay->adapter, pushed); else gst_buffer_unref (buffer); return ret; caps_rejected: { GST_WARNING_OBJECT (basepayload, "Could not set outcaps"); g_array_set_size (nal_queue, 0); gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; } } static gboolean gst_rtp_h264_pay_handle_event (GstPad * pad, GstEvent * event) { const GstStructure *s; GstRtpH264Pay *rtph264pay = GST_RTP_H264_PAY (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_adapter_clear (rtph264pay->adapter); break; case GST_EVENT_CUSTOM_DOWNSTREAM: s = gst_event_get_structure (event); if (gst_structure_has_name (s, "GstForceKeyUnit")) { gboolean resend_codec_data; if (gst_structure_get_boolean (s, "all-headers", &resend_codec_data) && resend_codec_data) rtph264pay->send_spspps = TRUE; } break; default: break; } return FALSE; } static GstStateChangeReturn gst_basertppayload_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRtpH264Pay *rtph264pay = GST_RTP_H264_PAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: rtph264pay->send_spspps = FALSE; gst_adapter_clear (rtph264pay->adapter); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return ret; } static void gst_rtp_h264_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpH264Pay *rtph264pay; rtph264pay = GST_RTP_H264_PAY (object); switch (prop_id) { case PROP_PROFILE_LEVEL_ID: break; case PROP_SPROP_PARAMETER_SETS: g_free (rtph264pay->sprop_parameter_sets); rtph264pay->sprop_parameter_sets = g_value_dup_string (value); rtph264pay->update_caps = TRUE; break; case PROP_SCAN_MODE: rtph264pay->scan_mode = g_value_get_enum (value); break; case PROP_BUFFER_LIST: rtph264pay->buffer_list = g_value_get_boolean (value); break; case PROP_CONFIG_INTERVAL: rtph264pay->spspps_interval = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_h264_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpH264Pay *rtph264pay; rtph264pay = GST_RTP_H264_PAY (object); switch (prop_id) { case PROP_PROFILE_LEVEL_ID: break; case PROP_SPROP_PARAMETER_SETS: g_value_set_string (value, rtph264pay->sprop_parameter_sets); break; case PROP_SCAN_MODE: g_value_set_enum (value, rtph264pay->scan_mode); break; case PROP_BUFFER_LIST: g_value_set_boolean (value, rtph264pay->buffer_list); break; case PROP_CONFIG_INTERVAL: g_value_set_uint (value, rtph264pay->spspps_interval); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } gboolean gst_rtp_h264_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtph264pay", GST_RANK_SECONDARY, GST_TYPE_RTP_H264_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph263depay.h0000644000175000017500000000417411671175354016543 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_H263_DEPAY_H__ #define __GST_RTP_H263_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_H263_DEPAY \ (gst_rtp_h263_depay_get_type()) #define GST_RTP_H263_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H263_DEPAY,GstRtpH263Depay)) #define GST_RTP_H263_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H263_DEPAY,GstRtpH263DepayClass)) #define GST_IS_RTP_H263_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H263_DEPAY)) #define GST_IS_RTP_H263_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H263_DEPAY)) typedef struct _GstRtpH263Depay GstRtpH263Depay; typedef struct _GstRtpH263DepayClass GstRtpH263DepayClass; struct _GstRtpH263Depay { GstBaseRTPDepayload depayload; guint8 offset; /* offset to apply to next payload */ guint8 leftover; /* leftover from previous payload (if offset != 0) */ gboolean psc_I; /* Picture-Coding-Type == I from Picture Start Code packet */ GstAdapter *adapter; gboolean start; }; struct _GstRtpH263DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_h263_depay_get_type (void); gboolean gst_rtp_h263_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H263_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/README0000644000175000017500000004262611671175354014305 00000000000000This directory contains some RTP payloaders/depayloaders for different payload types. Use one payloader/depayloder pair per payload. If several payloads can be payloaded/depayloaded by the same element, make different copies of it, one for each payload. The application/x-rtp mime type ------------------------------- For valid RTP packets encapsulated in GstBuffers, we use the caps with mime type application/x-rtp. The following fields can or must (*) be specified in the structure: * media: (String) [ "audio", "video", "application", "data", "control" ] Defined in RFC 2327 in the SDP media announcement field. Converted to lower case. * payload: (int) [0, 127] For audio and video, these will normally be a media payload type as defined in the RTP Audio/Video Profile. For dynamicaly allocated payload types, this value will be >= 96 and the encoding-name must be set. * clock-rate: (int) [0 - MAXINT] The RTP clock rate. encoding-name: (String) ANY typically second part of the mime type. ex. MP4V-ES. only required if payload type >= 96. Converted to upper case. encoding-params: (String) ANY extra encoding parameters (as in the SDP a=rtpmap: field). only required if different from the default of the encoding-name. Converted to lower-case. ssrc: (uint) [0 - MAXINT] The ssrc value currently in use. (default = the SSRC of the first RTP packet) clock-base: (uint) [0 - MAXINT] The RTP time representing time npt-start. (default = rtptime of first RTP packet). seqnum-base: (uint) [0 - MAXINT] The RTP sequence number representing the first rtp packet. When this parameter is given, all sequence numbers below this seqnum should be ignored. (default = seqnum of first RTP packet). npt-start: (uint64) [0 - MAXINT] The Normal Play Time for clock-base. This is the position in the stream and is between 0 and the duration of the stream. This value is expressed in nanoseconds GstClockTime. (default = 0) npt-stop: (uint64) [0 - MAXINT] The last position in the stream. This value is expressed in nanoseconds GstClockTime. (default = -1, stop unknown) play-speed: (gdouble) [-MIN - MAX] The intended playback speed of the stream. The client is delivered data at the adjusted speed. The client should adjust its playback speed with this value and thus corresponds to the GStreamer rate field in the NEWSEGMENT event. (default = 1.0) play-scale: (gdouble) [-MIN - MAX] The rate already applied to the stream. The client is delivered a stream that is scaled by this amount. This value is used to adjust position reporting and corresponds to the GStream applied-rate field in the NEWSEGMENT event. (default = 1.0) maxptime: (uint) [0, MAX] The maxptime as defined in RFC 4566, this defines the maximum size of a packet. It overrides the max-ptime property of payloaders. Optional parameters as key/value pairs, media type specific. The value type should be of type G_TYPE_STRING. The key is converted to lower-case. The value is left in its original case. A parameter with no value is converted to =1. Example: "application/x-rtp", "media", G_TYPE_STRING, "audio", -. "payload", G_TYPE_INT, 96, | - required "clock-rate", G_TYPE_INT, 8000, -' "encoding-name", G_TYPE_STRING, "AMR", -. - required since payload >= 96 "encoding-params", G_TYPE_STRING, "1", -' - optional param for AMR "octet-align", G_TYPE_STRING, "1", -. "crc", G_TYPE_STRING, "0", | "robust-sorting", G_TYPE_STRING, "0", | AMR specific params. "interleaving", G_TYPE_STRING, "0", -' Mapping of caps to and from SDP fields: m= RTP/AVP -] media and payload from caps a=rtpmap: /[/] -> when >= 96 a=fmtp: =;... For above caps: m=audio RTP/AVP 96 a=rtpmap:96 AMR/8000/1 a=fmtp:96 octet-align=1;crc=0;robust-sorting=0;interleaving=0 Attributes are converted as follows: IANA registered attribute names are prepended with 'a-' before putting them in the caps. Unregistered keys (starting with 'x-') are copied directly into the caps. in RTSP, the SSRC is also sent. The optional parameters in the SDP fields are case insensitive. In the caps we always use the lowercase names so that the SDP -> caps mapping remains possible. Mapping of caps to NEWSEGMENT: rate: applied-rate: format: GST_FORMAT_TIME start: * GST_SECOND / stop: if != -1 - + start else -1 time: Timestamping ------------ RTP in GStreamer uses a combination of the RTP timestamps and GStreamer buffer timestamps to ensure proper synchronisation at the sender and the receiver end. In RTP applications, the synchronisation is most complex at the receiver side. At the sender side, the RTP timestamps are generated in the payloaders based on GStreamer timestamps. At the receiver, GStreamer timestamps are reconstructed from the RTP timestamps and the GStreamer timestamps in the jitterbuffer. This process is explained in more detail below. = synchronisation at the sender Individual streams at the sender are synchronised using GStreamer timestamps. The payloader at the sender will convert the GStreamer timestamp into an RTP timestamp using the following formula: RTP = ((RT - RT-base) * clock-rate / GST_SECOND) + RTP-offset RTP: the RTP timestamp for the stream. This value is truncated to 32 bits. RT: the GStreamer running time corresponding to the timestamp of the packet to payload RT-base: the GStreamer running time of the first packet encoded clock-rate: the clock-rate of the stream RTP-offset: a random RTP offset The RTP timestamp corresponding to RT-base is the clock-base (see caps above). In addition to setting an RTP timestamp in the RTP packet, the payloader is also responsible for putting the GStreamer timestamp on the resulting output buffer. This timestamp is used for further synchronisation at the sender pipeline, such as for sending out the packet on the network. Notice that the absolute timing information is lost; if the sender is sending multiple streams, the RTP timestamps in the packets do not contain enough information to synchronize them in the receiver. The receiver can however use the RTP timestamps to reconstruct the timing of the stream as it was created by the sender according to the sender's clock. Because the payloaded packet contains both an RTP timestamp and a GStreamer timestamp, it is possible for an RTP session manager to derive the relation between the RTP and GST timestamps. This information is used by a session manager to create SR reports. The NTP time in the report will contain the running time converted to NTP time and the corresponding RTP timestamp. Note that at the sender side, the RTP and GStreamer timestamp both increment at the same rate, the sender rate. This rate depends on the global pipeline clock of the sender. Some pipelines to illustrate the process: gst-launch v4l2src ! ffenc_h263p ! rtph263ppay ! udpsink v4l2src puts a GStreamer timestamp on the video frames base on the current running_time. The encoder encodes and passed the timestamp on. The payloader generates an RTP timestamp using the above formula and puts it in the RTP packet. It also copies the incomming GStreamer timestamp on the output RTP packet. udpsink synchronizes on the gstreamer timestamp before pushing out the packet. = synchronisation at the receiver The receiver is responsible for timestamping the received RTP packet with the running_time of the clock at the time the packet was received. This GStreamer timestamp reflects the receiver rate and depends on the global pipeline clock of the receiver. The gstreamer timestamp of the received RTP packet contains a certain amount of jitter introduced by the network. The most simple option for the receiver is to depayload the RTP packet and play it back as soon as possible, this is with the timestamp when it was received from the network. For the above sender pipeline this would be done with the following pipeline: gst-launch udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H263-1998" ! rtph263pdepay ! ffdec_h263 ! xvimagesink It is important that the depayloader copies the incomming GStreamer timestamp directly to the depayloaded output buffer. It should never attempt to perform any logic with the RTP timestamp, this task is for the jitterbuffer as we will see next. The above pipeline does not attempt to deal with reordered packets or network jitter, which could result in jerky playback in the case of high jitter or corrupted video in the case of packet loss or reordering. This functionality is performed by the gstrtpjitterbuffer in GStreamer. The task of the gstrtpjitterbuffer element is to: - deal with reordered packets based on the seqnum - calculate the drift between the sender and receiver clocks using the GStreamer timestamps (receiver clock rate) and RTP timestamps (sender clock rate). To deal with reordered packet, the jitterbuffer holds on to the received RTP packets in a queue for a configurable amount of time, called the latency. The jitterbuffer also eliminates network jitter and then tracks the drift between the local clock (as expressed in the GStreamer timestamps) and the remote clock (as expressed in the RTP timestamps). It will remove the jitter and will apply the drift correction to the GStreamer timestamp before pushing the buffer downstream. The result is that the depayloader receives a smoothed GStreamer timestamp on the RTP packet, which is copied to the depayloaded data. The following pipeline illustrates a receiver with a jitterbuffer. gst-launch udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H263-1998" ! gstrtpjitterbuffer latency=100 ! rtph263pdepay ! ffdec_h263 ! xvimagesink The latency property on the jitterbuffer controls the amount of delay (in milliseconds) to apply to the outgoing packets. A higher latency will produce smoother playback in networks with high jitter but cause a higher latency. Choosing a good value for the latency is a tradeoff between the quality and latency. The better the network, the lower the latency can be set. usage with UDP -------------- To correctly and completely use the RTP payloaders on the sender and the receiver you need to write an application. It is not possible to write a full blown RTP server with a single gst-launch line. That said, it is possible to do something functional with a few gst-launch lines. The biggest problem when constructing a correct gst-launch line lies on the receiver end. The receiver needs to know about the type of the RTP data along with a set of RTP configuration parameters. This information is usually transmitted to the client using some sort of session description language (SDP) over some reliable channel (HTTP/RTSP/...). All of the required parameters to connect and use the RTP session on the server can be found in the caps on the server end. The client receives this information in some way (caps are converted to and from SDP, as explained above, for example). Some gst-launch lines: gst-launch-0.10 -v videotestsrc ! ffenc_h263p ! rtph263ppay ! udpsink Setting pipeline to PAUSED ... /pipeline0/videotestsrc0.src: caps = video/x-raw-yuv, format=(fourcc)I420, width=(int)320, height=(int)240, framerate=(fraction)30/1 Pipeline is PREROLLING ... .... /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982 .... Pipeline is PREROLLED ... Setting pipeline to PLAYING ... New clock: GstSystemClock Write down the caps on the udpsink and set them as the caps of the UDP receiver: gst-launch-0.10 -v udpsrc caps="application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982" ! rtph263pdepay ! ffdec_h263 ! xvimagesink The receiver now displays an h263 image. Since there is no jitterbuffer in the pipeline, frames will be displayed at the time when they are received. This can result in jerky playback in the case of high network jitter or currupted video when packets are dropped or reordered. Stream a quicktime file with mpeg4 video and AAC audio on port 5000 and port 5002. gst-launch-0.10 -v filesrc location=~/data/sincity.mp4 ! qtdemux name=d ! queue ! rtpmp4vpay ! udpsink port=5000 d. ! queue ! rtpmp4gpay ! udpsink port=5002 .... /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, ssrc=(guint)1162703703, clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3, config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334 /pipeline0/udpsink1.sink: caps = application/x-rtp, media=(string)audio, payload=(int)96, clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, streamtype=(string)5, profile-level-id=(string)1, mode=(string)aac-hbr, config=(string)1210, sizelength=(string)13, indexlength=(string)3, indexdeltalength=(string)3 .... Again copy the caps on both sinks to the receiver launch line gst-launch udpsrc port=5000 caps="application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, ssrc=(guint)1162703703, clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3, config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334" ! rtpmp4vdepay ! ffdec_mpeg4 ! xvimagesink sync=false udpsrc port=5002 caps="application/x-rtp, media=(string)audio, payload=(int)96, clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, streamtype=(string)5, profile-level-id=(string)1, mode=(string)aac-hbr, config=(string)1210, sizelength=(string)13, indexlength=(string)3, indexdeltalength=(string)3" ! rtpmp4gdepay ! faad ! alsasink sync=false The caps on the udpsinks can be retrieved when the server pipeline prerolled to PAUSED. The above pipeline sets sync=false on the audio and video sink which means that no synchronisation will be performed in the sinks, they play the data when it arrives. If you want to enable synchronisation in the sinks it is highly recommended to use a gstrtpjitterbuffer after the udpsrc elements. Even when sync is enabled, the two different streams will not play synchronised against eachother because the receiver does not have enough information to perform this task. For this you need to add the gstrtpbin element in both the sender and receiver pipeline and use additional sources and sinks to transmit RTCP packets used for inter-stream synchronisation. The caps on the receiver side can be set on the UDP source elements when the pipeline went to PAUSED. In that state no data is received from the UDP sources as they are live sources and only produce data in PLAYING. Relevant RFCs ------------- 3550 RTP: A Transport Protocol for Real-Time Applications. ( 1889 Obsolete ) 2198 RTP Payload for Redundant Audio Data. 3119 A More Loss-Tolerant RTP Payload Format for MP3 Audio. 2793 RTP Payload for Text Conversation. 2032 RTP Payload Format for H.261 Video Streams. 2190 RTP Payload Format for H.263 Video Streams. 2250 RTP Payload Format for MPEG1/MPEG2 Video. 2343 RTP Payload Format for Bundled MPEG. 2429 RTP Payload Format for the 1998 Version of ITU-T Rec. H.263 Video 2431 RTP Payload Format for BT.656 Video Encoding. 2435 RTP Payload Format for JPEG-compressed Video. 3016 RTP Payload Format for MPEG-4 Audio/Visual Streams. 3047 RTP Payload Format for ITU-T Recommendation G.722.1. 3189 RTP Payload Format for DV (IEC 61834) Video. 3190 RTP Payload Format for 12-bit DAT Audio and 20- and 24-bit Linear Sampled Audio. 3389 Real-time Transport Protocol (RTP) Payload for Comfort Noise (CN) 2733 An RTP Payload Format for Generic Forward Error Correction. 2833 RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals. 2862 RTP Payload Format for Real-Time Pointers. 3351 RTP Profile for Audio and Video Conferences with Minimal Control. ( 1890 Obsolete ) 3555 MIME Type Registration of RTP Payload Formats. 2508 Compressing IP/UDP/RTP Headers for Low-Speed Serial Links. 1305 Network Time Protocol (Version 3) Specification, Implementation and Analysis. 3339 Date and Time on the Internet: Timestamps. 2246 The TLS Protocol Version 1.0 3546 Transport Layer Security (TLS) Extensions. ( Updates 2246 ) do we care? ----------- 2029 RTP Payload Format of Sun's CellB Video Encoding. usefull ------- http://www.iana.org/assignments/rtp-parameters gst-plugins-good-0.10.31/gst/rtp/gstrtpceltdepay.h0000644000175000017500000000320611671175354017003 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 */ #ifndef __GST_RTP_CELT_DEPAY_H__ #define __GST_RTP_CELT_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpCELTDepay GstRtpCELTDepay; typedef struct _GstRtpCELTDepayClass GstRtpCELTDepayClass; #define GST_TYPE_RTP_CELT_DEPAY \ (gst_rtp_celt_depay_get_type()) #define GST_RTP_CELT_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_CELT_DEPAY,GstRtpCELTDepay)) #define GST_RTP_CELT_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_CELT_DEPAY,GstRtpCELTDepayClass)) #define GST_IS_RTP_CELT_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_CELT_DEPAY)) #define GST_IS_RTP_CELT_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_CELT_DEPAY)) struct _GstRtpCELTDepay { GstBaseRTPDepayload depayload; gint frame_size; }; struct _GstRtpCELTDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_celt_depay_get_type (void); gboolean gst_rtp_celt_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_CELT_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpg723pay.c0000644000175000017500000002135411677341656016232 00000000000000/* GStreamer * Copyright (C) <2007> Nokia Corporation * Copyright (C) <2007> Collabora Ltd * @author: Olivier Crete * * 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 #endif #include #include #include #include "gstrtpg723pay.h" #define GST_RTP_PAYLOAD_G723 4 #define GST_RTP_PAYLOAD_G723_STRING "4" #define G723_FRAME_DURATION (30 * GST_MSECOND) static gboolean gst_rtp_g723_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_g723_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf); static GstStaticPadTemplate gst_rtp_g723_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/G723, " /* according to RFC 3551 */ "channels = (int) 1, " "rate = (int) 8000") ); static GstStaticPadTemplate gst_rtp_g723_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_G723_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"G723\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"G723\"") ); static void gst_rtp_g723_pay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_g723_pay_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstRTPG723Pay, gst_rtp_g723_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_g723_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g723_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g723_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP G.723 payloader", "Codec/Payloader/Network/RTP", "Packetize G.723 audio into RTP packets", "Wim Taymans "); } static void gst_rtp_g723_pay_class_init (GstRTPG723PayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *payload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; payload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_g723_pay_finalize; gstelement_class->change_state = gst_rtp_g723_pay_change_state; payload_class->set_caps = gst_rtp_g723_pay_set_caps; payload_class->handle_buffer = gst_rtp_g723_pay_handle_buffer; } static void gst_rtp_g723_pay_init (GstRTPG723Pay * pay, GstRTPG723PayClass * klass) { GstBaseRTPPayload *payload = GST_BASE_RTP_PAYLOAD (pay); pay->adapter = gst_adapter_new (); payload->pt = GST_RTP_PAYLOAD_G723; gst_basertppayload_set_options (payload, "audio", FALSE, "G723", 8000); } static void gst_rtp_g723_pay_finalize (GObject * object) { GstRTPG723Pay *pay; pay = GST_RTP_G723_PAY (object); g_object_unref (pay->adapter); pay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_g723_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; GstStructure *structure; gint pt; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "payload", &pt)) pt = GST_RTP_PAYLOAD_G723; payload->pt = pt; payload->dynamic = pt != GST_RTP_PAYLOAD_G723; res = gst_basertppayload_set_outcaps (payload, NULL); return res; } static GstFlowReturn gst_rtp_g723_pay_flush (GstRTPG723Pay * pay) { GstBuffer *outbuf; GstFlowReturn ret; guint8 *payload; guint avail; avail = gst_adapter_available (pay->adapter); outbuf = gst_rtp_buffer_new_allocate (avail, 0, 0); payload = gst_rtp_buffer_get_payload (outbuf); GST_BUFFER_TIMESTAMP (outbuf) = pay->timestamp; GST_BUFFER_DURATION (outbuf) = pay->duration; /* copy G723 data as payload */ gst_adapter_copy (pay->adapter, payload, 0, avail); /* flush bytes from adapter */ gst_adapter_flush (pay->adapter, avail); pay->timestamp = GST_CLOCK_TIME_NONE; pay->duration = 0; /* set discont and marker */ if (pay->discont) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); gst_rtp_buffer_set_marker (outbuf, TRUE); pay->discont = FALSE; } ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (pay), outbuf); return ret; } /* 00 high-rate speech (6.3 kb/s) 24 * 01 low-rate speech (5.3 kb/s) 20 * 10 SID frame 4 * 11 reserved 0 */ static const guint size_tab[4] = { 24, 20, 4, 0 }; static GstFlowReturn gst_rtp_g723_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf) { GstFlowReturn ret = GST_FLOW_OK; guint8 *data; guint size; guint8 HDR; GstRTPG723Pay *pay; GstClockTime packet_dur, timestamp; guint payload_len, packet_len; pay = GST_RTP_G723_PAY (payload); size = GST_BUFFER_SIZE (buf); data = GST_BUFFER_DATA (buf); timestamp = GST_BUFFER_TIMESTAMP (buf); if (GST_BUFFER_IS_DISCONT (buf)) { /* flush everything on discont */ gst_adapter_clear (pay->adapter); pay->timestamp = GST_CLOCK_TIME_NONE; pay->duration = 0; pay->discont = TRUE; } /* should be one of these sizes */ if (size != 4 && size != 20 && size != 24) goto invalid_size; /* check size by looking at the header bits */ HDR = data[0] & 0x3; if (size_tab[HDR] != size) goto wrong_size; /* calculate packet size and duration */ payload_len = gst_adapter_available (pay->adapter) + size; packet_dur = pay->duration + G723_FRAME_DURATION; packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); if (gst_basertppayload_is_filled (payload, packet_len, packet_dur)) { /* size or duration would overflow the packet, flush the queued data */ ret = gst_rtp_g723_pay_flush (pay); } /* update timestamp, we keep the timestamp for the first packet in the adapter * but are able to calculate it from next packets. */ if (timestamp != GST_CLOCK_TIME_NONE && pay->timestamp == GST_CLOCK_TIME_NONE) { if (timestamp > pay->duration) pay->timestamp = timestamp - pay->duration; else pay->timestamp = 0; } /* add packet to the queue */ gst_adapter_push (pay->adapter, buf); pay->duration = packet_dur; /* check if we can flush now */ if (pay->duration >= payload->min_ptime) { ret = gst_rtp_g723_pay_flush (pay); } return ret; /* WARNINGS */ invalid_size: { GST_ELEMENT_WARNING (pay, STREAM, WRONG_TYPE, ("Invalid input buffer size"), ("Input size should be 4, 20 or 24, got %u", size)); gst_buffer_unref (buf); return GST_FLOW_OK; } wrong_size: { GST_ELEMENT_WARNING (pay, STREAM, WRONG_TYPE, ("Wrong input buffer size"), ("Expected input buffer size %u but got %u", size_tab[HDR], size)); gst_buffer_unref (buf); return GST_FLOW_OK; } } static GstStateChangeReturn gst_rtp_g723_pay_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRTPG723Pay *pay; pay = GST_RTP_G723_PAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (pay->adapter); pay->timestamp = GST_CLOCK_TIME_NONE; pay->duration = 0; pay->discont = TRUE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_adapter_clear (pay->adapter); break; default: break; } return ret; } /*Plugin init functions*/ gboolean gst_rtp_g723_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg723pay", GST_RANK_SECONDARY, gst_rtp_g723_pay_get_type ()); } gst-plugins-good-0.10.31/gst/rtp/gstrtppcmadepay.c0000644000175000017500000001161411677341656016777 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2005> Edgard Lima * Copyright (C) <2005> Zeeshan Ali * * 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 #include #include "gstrtppcmadepay.h" /* RtpPcmaDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static GstStaticPadTemplate gst_rtp_pcma_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_PCMA_STRING ", " "clock-rate = (int) 8000, encoding-name = (string) \"PCMA\";" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], encoding-name = (string) \"PCMA\"") ); static GstStaticPadTemplate gst_rtp_pcma_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-alaw, channels = (int) 1, rate = (int) [1, MAX ]") ); static GstBuffer *gst_rtp_pcma_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_pcma_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRtpPcmaDepay, gst_rtp_pcma_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_pcma_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcma_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcma_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP PCMA depayloader", "Codec/Depayloader/Network/RTP", "Extracts PCMA audio from RTP packets", "Edgard Lima , Zeeshan Ali "); } static void gst_rtp_pcma_depay_class_init (GstRtpPcmaDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_pcma_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_pcma_depay_setcaps; } static void gst_rtp_pcma_depay_init (GstRtpPcmaDepay * rtppcmadepay, GstRtpPcmaDepayClass * klass) { GstBaseRTPDepayload *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtppcmadepay); gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); } static gboolean gst_rtp_pcma_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; GstStructure *structure; gboolean ret; gint clock_rate; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("audio/x-alaw", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; } static GstBuffer * gst_rtp_pcma_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf = NULL; gboolean marker; guint len; marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); len = gst_rtp_buffer_get_payload_len (buf); outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (outbuf) { GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (len, GST_SECOND, depayload->clock_rate); if (marker) { /* mark start of talkspurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } } return outbuf; } gboolean gst_rtp_pcma_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtppcmadepay", GST_RANK_SECONDARY, GST_TYPE_RTP_PCMA_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpbvpay.c0000644000175000017500000001454311677341656016161 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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 #include #include #include "gstrtpbvpay.h" GST_DEBUG_CATEGORY_STATIC (rtpbvpay_debug); #define GST_CAT_DEFAULT (rtpbvpay_debug) static GstStaticPadTemplate gst_rtp_bv_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-bv, " "mode = (int) {16, 32}") ); static GstStaticPadTemplate gst_rtp_bv_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"BV16\";" "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 16000, " "encoding-name = (string) \"BV32\"") ); static GstCaps *gst_rtp_bv_pay_sink_getcaps (GstBaseRTPPayload * payload, GstPad * pad); static gboolean gst_rtp_bv_pay_sink_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); GST_BOILERPLATE (GstRTPBVPay, gst_rtp_bv_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_bv_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_bv_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_bv_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP BV Payloader", "Codec/Payloader/Network/RTP", "Packetize BroadcomVoice audio streams into RTP packets (RFC 4298)", "Wim Taymans "); } static void gst_rtp_bv_pay_class_init (GstRTPBVPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_bv_pay_sink_setcaps; gstbasertppayload_class->get_caps = gst_rtp_bv_pay_sink_getcaps; GST_DEBUG_CATEGORY_INIT (rtpbvpay_debug, "rtpbvpay", 0, "BroadcomVoice audio RTP payloader"); } static void gst_rtp_bv_pay_init (GstRTPBVPay * rtpbvpay, GstRTPBVPayClass * klass) { GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpbvpay); rtpbvpay->mode = -1; /* tell basertpaudiopayload that this is a frame based codec */ gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); } static gboolean gst_rtp_bv_pay_sink_setcaps (GstBaseRTPPayload * basertppayload, GstCaps * caps) { GstRTPBVPay *rtpbvpay; GstBaseRTPAudioPayload *basertpaudiopayload; gint mode; GstStructure *structure; const char *payload_name; rtpbvpay = GST_RTP_BV_PAY (basertppayload); basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); structure = gst_caps_get_structure (caps, 0); payload_name = gst_structure_get_name (structure); if (g_ascii_strcasecmp ("audio/x-bv", payload_name)) goto wrong_caps; if (!gst_structure_get_int (structure, "mode", &mode)) goto no_mode; if (mode != 16 && mode != 32) goto wrong_mode; if (mode == 16) { gst_basertppayload_set_options (basertppayload, "audio", TRUE, "BV16", 8000); basertppayload->clock_rate = 8000; } else { gst_basertppayload_set_options (basertppayload, "audio", TRUE, "BV32", 16000); basertppayload->clock_rate = 16000; } /* set options for this frame based audio codec */ gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, mode, mode == 16 ? 10 : 20); if (mode != rtpbvpay->mode && rtpbvpay->mode != -1) goto mode_changed; rtpbvpay->mode = mode; return TRUE; /* ERRORS */ wrong_caps: { GST_ERROR_OBJECT (rtpbvpay, "expected audio/x-bv, received %s", payload_name); return FALSE; } no_mode: { GST_ERROR_OBJECT (rtpbvpay, "did not receive a mode"); return FALSE; } wrong_mode: { GST_ERROR_OBJECT (rtpbvpay, "mode must be 16 or 32, received %d", mode); return FALSE; } mode_changed: { GST_ERROR_OBJECT (rtpbvpay, "Mode has changed from %d to %d! " "Mode cannot change while streaming", rtpbvpay->mode, mode); return FALSE; } } /* we return the padtemplate caps with the mode field fixated to a value if we * can */ static GstCaps * gst_rtp_bv_pay_sink_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) { GstCaps *otherpadcaps; GstCaps *caps; otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { GstStructure *structure; const gchar *mode_str; gint mode; structure = gst_caps_get_structure (otherpadcaps, 0); /* construct mode, if we can */ mode_str = gst_structure_get_string (structure, "encoding-name"); if (mode_str) { if (!strcmp (mode_str, "BV16")) mode = 16; else if (!strcmp (mode_str, "BV32")) mode = 32; else mode = -1; if (mode == 16 || mode == 32) { structure = gst_caps_get_structure (caps, 0); gst_structure_set (structure, "mode", G_TYPE_INT, mode, NULL); } } } gst_caps_unref (otherpadcaps); } return caps; } gboolean gst_rtp_bv_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpbvpay", GST_RANK_SECONDARY, GST_TYPE_RTP_BV_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpsirenpay.h0000644000175000017500000000354711671175354016673 00000000000000/* * Siren Payloader Gst Element * * @author: Youness Alaoui * * 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_RTP_SIREN_PAY_H__ #define __GST_RTP_SIREN_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_SIREN_PAY \ (gst_rtp_siren_pay_get_type()) #define GST_RTP_SIREN_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SIREN_PAY,GstRTPSirenPay)) #define GST_RTP_SIREN_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SIREN_PAY,GstRTPSirenPayClass)) #define GST_IS_RTP_SIREN_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SIREN_PAY)) #define GST_IS_RTP_SIREN_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SIREN_PAY)) typedef struct _GstRTPSirenPay GstRTPSirenPay; typedef struct _GstRTPSirenPayClass GstRTPSirenPayClass; struct _GstRTPSirenPay { GstBaseRTPAudioPayload audiopayload; }; struct _GstRTPSirenPayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_siren_pay_get_type (void); gboolean gst_rtp_siren_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_SIREN_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmpvdepay.h0000644000175000017500000000350311671175354016656 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MPV_DEPAY_H__ #define __GST_RTP_MPV_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MPV_DEPAY \ (gst_rtp_mpv_depay_get_type()) #define GST_RTP_MPV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPV_DEPAY,GstRtpMPVDepay)) #define GST_RTP_MPV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPV_DEPAY,GstRtpMPVDepayClass)) #define GST_IS_RTP_MPV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPV_DEPAY)) #define GST_IS_RTP_MPV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPV_DEPAY)) typedef struct _GstRtpMPVDepay GstRtpMPVDepay; typedef struct _GstRtpMPVDepayClass GstRtpMPVDepayClass; struct _GstRtpMPVDepay { GstBaseRTPDepayload depayload; }; struct _GstRtpMPVDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mpv_depay_get_type (void); gboolean gst_rtp_mpv_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MPV_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtppcmudepay.h0000644000175000017500000000316511671175354017024 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 */ #ifndef __GST_RTP_PCMU_DEPAY_H__ #define __GST_RTP_PCMU_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpPcmuDepay GstRtpPcmuDepay; typedef struct _GstRtpPcmuDepayClass GstRtpPcmuDepayClass; #define GST_TYPE_RTP_PCMU_DEPAY \ (gst_rtp_pcmu_depay_get_type()) #define GST_RTP_PCMU_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMU_DEPAY,GstRtpPcmuDepay)) #define GST_RTP_PCMU_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMU_DEPAY,GstRtpPcmuDepayClass)) #define GST_IS_RTP_PCMU_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMU_DEPAY)) #define GST_IS_RTP_PCMU_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMU_DEPAY)) struct _GstRtpPcmuDepay { GstBaseRTPDepayload depayload; }; struct _GstRtpPcmuDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_pcmu_depay_get_type (void); gboolean gst_rtp_pcmu_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_PCMU_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4gdepay.c0000644000175000017500000006244611677341656016737 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include #include "gstrtpmp4gdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4gdepay_debug); #define GST_CAT_DEFAULT (rtpmp4gdepay_debug) static GstStaticPadTemplate gst_rtp_mp4g_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg," "mpegversion=(int) 4," "systemstream=(boolean)false;" "audio/mpeg," "mpegversion=(int) 4, " "stream-format=(string)raw") ); static GstStaticPadTemplate gst_rtp_mp4g_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) { \"video\", \"audio\", \"application\" }, " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MPEG4-GENERIC\", " /* required string params */ "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ /* "profile-level-id = (string) [1,MAX], " */ /* "config = (string) [1,MAX]" */ "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " /* Optional general parameters */ /* "objecttype = (string) [1,MAX], " */ /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ /* "constantduration = (string) [1,MAX], " *//* constant duration of each AU */ /* "maxdisplacement = (string) [1,MAX], " */ /* "de-interleavebuffersize = (string) [1,MAX], " */ /* Optional configuration parameters */ /* "sizelength = (string) [1, 32], " */ /* "indexlength = (string) [1, 32], " */ /* "indexdeltalength = (string) [1, 32], " */ /* "ctsdeltalength = (string) [1, 32], " */ /* "dtsdeltalength = (string) [1, 32], " */ /* "randomaccessindication = (string) {0, 1}, " */ /* "streamstateindication = (string) [0, 32], " */ /* "auxiliarydatasizelength = (string) [0, 32]" */ ) ); /* simple bitstream parser */ typedef struct { const guint8 *data; const guint8 *end; gint head; /* bitpos in the cache of next bit */ guint64 cache; /* cached bytes */ } GstBsParse; static void gst_bs_parse_init (GstBsParse * bs, const guint8 * data, guint size) { bs->data = data; bs->end = data + size; bs->head = 0; bs->cache = 0xffffffff; } static guint32 gst_bs_parse_read (GstBsParse * bs, guint n) { guint32 res = 0; gint shift; if (n == 0) return res; /* fill up the cache if we need to */ while (bs->head < n) { if (bs->data >= bs->end) { /* we're at the end, can't produce more than head number of bits */ n = bs->head; break; } /* shift bytes in cache, moving the head bits of the cache left */ bs->cache = (bs->cache << 8) | *bs->data++; bs->head += 8; } /* bring the required bits down and truncate */ if ((shift = bs->head - n) > 0) res = bs->cache >> shift; else res = bs->cache; /* mask out required bits */ if (n < 32) res &= (1 << n) - 1; bs->head = shift; return res; } GST_BOILERPLATE (GstRtpMP4GDepay, gst_rtp_mp4g_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_mp4g_depay_finalize (GObject * object); static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_mp4g_depay_handle_event (GstBaseRTPDepayload * filter, GstEvent * event); static GstStateChangeReturn gst_rtp_mp4g_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mp4g_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4g_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4g_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG4 ES depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG4 elementary streams from RTP packets (RFC 3640)", "Wim Taymans "); } static void gst_rtp_mp4g_depay_class_init (GstRtpMP4GDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_mp4g_depay_finalize; gstelement_class->change_state = gst_rtp_mp4g_depay_change_state; gstbasertpdepayload_class->process = gst_rtp_mp4g_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp4g_depay_setcaps; gstbasertpdepayload_class->handle_event = gst_rtp_mp4g_depay_handle_event; GST_DEBUG_CATEGORY_INIT (rtpmp4gdepay_debug, "rtpmp4gdepay", 0, "MP4-generic RTP Depayloader"); } static void gst_rtp_mp4g_depay_init (GstRtpMP4GDepay * rtpmp4gdepay, GstRtpMP4GDepayClass * klass) { rtpmp4gdepay->adapter = gst_adapter_new (); rtpmp4gdepay->packets = g_queue_new (); } static void gst_rtp_mp4g_depay_finalize (GObject * object) { GstRtpMP4GDepay *rtpmp4gdepay; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (object); g_object_unref (rtpmp4gdepay->adapter); rtpmp4gdepay->adapter = NULL; g_queue_free (rtpmp4gdepay->packets); rtpmp4gdepay->packets = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gint gst_rtp_mp4g_depay_parse_int (GstStructure * structure, const gchar * field, gint def) { const gchar *str; gint res; if ((str = gst_structure_get_string (structure, field))) return atoi (str); if (gst_structure_get_int (structure, field, &res)) return res; return def; } static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpMP4GDepay *rtpmp4gdepay; GstCaps *srccaps = NULL; const gchar *str; gint clock_rate; gint someint; gboolean res; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; if ((str = gst_structure_get_string (structure, "media"))) { if (strcmp (str, "audio") == 0) { srccaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, "stream-format", G_TYPE_STRING, "raw", NULL); } else if (strcmp (str, "video") == 0) { srccaps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); } } if (srccaps == NULL) goto unknown_media; /* these values are optional and have a default value of 0 (no header) */ rtpmp4gdepay->sizelength = gst_rtp_mp4g_depay_parse_int (structure, "sizelength", 0); rtpmp4gdepay->indexlength = gst_rtp_mp4g_depay_parse_int (structure, "indexlength", 0); rtpmp4gdepay->indexdeltalength = gst_rtp_mp4g_depay_parse_int (structure, "indexdeltalength", 0); rtpmp4gdepay->ctsdeltalength = gst_rtp_mp4g_depay_parse_int (structure, "ctsdeltalength", 0); rtpmp4gdepay->dtsdeltalength = gst_rtp_mp4g_depay_parse_int (structure, "dtsdeltalength", 0); someint = gst_rtp_mp4g_depay_parse_int (structure, "randomaccessindication", 0); rtpmp4gdepay->randomaccessindication = someint > 0 ? 1 : 0; rtpmp4gdepay->streamstateindication = gst_rtp_mp4g_depay_parse_int (structure, "streamstateindication", 0); rtpmp4gdepay->auxiliarydatasizelength = gst_rtp_mp4g_depay_parse_int (structure, "auxiliarydatasizelength", 0); rtpmp4gdepay->constantSize = gst_rtp_mp4g_depay_parse_int (structure, "constantsize", 0); rtpmp4gdepay->constantDuration = gst_rtp_mp4g_depay_parse_int (structure, "constantduration", 0); rtpmp4gdepay->maxDisplacement = gst_rtp_mp4g_depay_parse_int (structure, "maxdisplacement", 0); /* get config string */ if ((str = gst_structure_get_string (structure, "config"))) { GValue v = { 0 }; g_value_init (&v, GST_TYPE_BUFFER); if (gst_value_deserialize (&v, str)) { GstBuffer *buffer; buffer = gst_value_get_buffer (&v); gst_caps_set_simple (srccaps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); g_value_unset (&v); } else { g_warning ("cannot convert config to buffer"); } } res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ unknown_media: { GST_DEBUG_OBJECT (rtpmp4gdepay, "Unknown media type"); return FALSE; } } static void gst_rtp_mp4g_depay_clear_queue (GstRtpMP4GDepay * rtpmp4gdepay) { GstBuffer *outbuf; while ((outbuf = g_queue_pop_head (rtpmp4gdepay->packets))) gst_buffer_unref (outbuf); } static void gst_rtp_mp4g_depay_reset (GstRtpMP4GDepay * rtpmp4gdepay) { gst_adapter_clear (rtpmp4gdepay->adapter); rtpmp4gdepay->max_AU_index = -1; rtpmp4gdepay->next_AU_index = -1; rtpmp4gdepay->prev_AU_index = -1; rtpmp4gdepay->prev_rtptime = -1; rtpmp4gdepay->last_AU_index = -1; gst_rtp_mp4g_depay_clear_queue (rtpmp4gdepay); } static void gst_rtp_mp4g_depay_flush_queue (GstRtpMP4GDepay * rtpmp4gdepay) { GstBuffer *outbuf; gboolean discont = FALSE; guint AU_index; while ((outbuf = g_queue_pop_head (rtpmp4gdepay->packets))) { AU_index = GST_BUFFER_OFFSET (outbuf); GST_DEBUG_OBJECT (rtpmp4gdepay, "next available AU_index %u", AU_index); if (rtpmp4gdepay->next_AU_index != AU_index) { GST_DEBUG_OBJECT (rtpmp4gdepay, "discont, expected AU_index %u", rtpmp4gdepay->next_AU_index); discont = TRUE; } if (discont) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); discont = FALSE; } GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing AU_index %u", AU_index); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), outbuf); rtpmp4gdepay->next_AU_index = AU_index + 1; } } static void gst_rtp_mp4g_depay_queue (GstRtpMP4GDepay * rtpmp4gdepay, GstBuffer * outbuf) { guint AU_index = GST_BUFFER_OFFSET (outbuf); if (rtpmp4gdepay->next_AU_index == -1) { GST_DEBUG_OBJECT (rtpmp4gdepay, "Init AU counter %u", AU_index); rtpmp4gdepay->next_AU_index = AU_index; } if (rtpmp4gdepay->next_AU_index == AU_index) { GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing expected AU_index %u", AU_index); /* we received the expected packet, push it and flush as much as we can from * the queue */ gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), outbuf); rtpmp4gdepay->next_AU_index++; while ((outbuf = g_queue_peek_head (rtpmp4gdepay->packets))) { AU_index = GST_BUFFER_OFFSET (outbuf); GST_DEBUG_OBJECT (rtpmp4gdepay, "next available AU_index %u", AU_index); if (rtpmp4gdepay->next_AU_index == AU_index) { GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing expected AU_index %u", AU_index); outbuf = g_queue_pop_head (rtpmp4gdepay->packets); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), outbuf); rtpmp4gdepay->next_AU_index++; } else { GST_DEBUG_OBJECT (rtpmp4gdepay, "waiting for next AU_index %u", rtpmp4gdepay->next_AU_index); break; } } } else { GList *list; GST_DEBUG_OBJECT (rtpmp4gdepay, "queueing AU_index %u", AU_index); /* loop the list to skip strictly smaller AU_index buffers */ for (list = rtpmp4gdepay->packets->head; list; list = g_list_next (list)) { guint idx; gint gap; idx = GST_BUFFER_OFFSET (GST_BUFFER_CAST (list->data)); /* compare the new seqnum to the one in the buffer */ gap = (gint) (idx - AU_index); GST_DEBUG_OBJECT (rtpmp4gdepay, "compare with AU_index %u, gap %d", idx, gap); /* AU_index <= idx, we can stop looking */ if (G_LIKELY (gap > 0)) break; } if (G_LIKELY (list)) g_queue_insert_before (rtpmp4gdepay->packets, list, outbuf); else g_queue_push_tail (rtpmp4gdepay->packets, outbuf); } } static GstBuffer * gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMP4GDepay *rtpmp4gdepay; GstBuffer *outbuf; GstClockTime timestamp; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { GST_DEBUG_OBJECT (rtpmp4gdepay, "received DISCONT"); gst_adapter_clear (rtpmp4gdepay->adapter); } timestamp = GST_BUFFER_TIMESTAMP (buf); { gint payload_len, payload_AU; guint8 *payload; guint32 rtptime; guint AU_headers_len; guint AU_size, AU_index, AU_index_delta, payload_AU_size; gboolean M; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); GST_DEBUG_OBJECT (rtpmp4gdepay, "received payload of %d", payload_len); rtptime = gst_rtp_buffer_get_timestamp (buf); M = gst_rtp_buffer_get_marker (buf); if (rtpmp4gdepay->sizelength > 0) { gint num_AU_headers, AU_headers_bytes, i; GstBsParse bs; if (payload_len < 2) goto short_payload; /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ * |AU-headers-length|AU-header|AU-header| |AU-header|padding| * | | (1) | (2) | | (n) * | bits | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ * * The length is 2 bytes and contains the length of the following * AU-headers in bits. */ AU_headers_len = (payload[0] << 8) | payload[1]; AU_headers_bytes = (AU_headers_len + 7) / 8; num_AU_headers = AU_headers_len / 16; GST_DEBUG_OBJECT (rtpmp4gdepay, "AU headers len %d, bytes %d, num %d", AU_headers_len, AU_headers_bytes, num_AU_headers); /* skip header */ payload += 2; payload_len -= 2; if (payload_len < AU_headers_bytes) goto short_payload; /* skip special headers, point to first payload AU */ payload_AU = 2 + AU_headers_bytes; payload_AU_size = payload_len - AU_headers_bytes; if (G_UNLIKELY (rtpmp4gdepay->auxiliarydatasizelength)) { gint aux_size; /* point the bitstream parser to the first auxiliary data bit */ gst_bs_parse_init (&bs, payload + AU_headers_bytes, payload_len - AU_headers_bytes); aux_size = gst_bs_parse_read (&bs, rtpmp4gdepay->auxiliarydatasizelength); /* convert to bytes */ aux_size = (aux_size + 7) / 8; /* AU data then follows auxiliary data */ if (payload_AU_size < aux_size) goto short_payload; payload_AU += aux_size; payload_AU_size -= aux_size; } /* point the bitstream parser to the first AU header bit */ gst_bs_parse_init (&bs, payload, payload_len); AU_index = AU_index_delta = 0; for (i = 0; i < num_AU_headers && payload_AU_size > 0; i++) { /* parse AU header * +---------------------------------------+ * | AU-size | * +---------------------------------------+ * | AU-Index / AU-Index-delta | * +---------------------------------------+ * | CTS-flag | * +---------------------------------------+ * | CTS-delta | * +---------------------------------------+ * | DTS-flag | * +---------------------------------------+ * | DTS-delta | * +---------------------------------------+ * | RAP-flag | * +---------------------------------------+ * | Stream-state | * +---------------------------------------+ */ AU_size = gst_bs_parse_read (&bs, rtpmp4gdepay->sizelength); /* calculate the AU_index, which is only on the first AU of the packet * and the AU_index_delta on the other AUs. This will be used to * reconstruct the AU ordering when interleaving. */ if (i == 0) { AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength); GST_DEBUG_OBJECT (rtpmp4gdepay, "AU index %u", AU_index); if (AU_index == 0 && rtpmp4gdepay->prev_AU_index == 0) { gint diff; gint cd; /* if we see two consecutive packets with AU_index of 0, we can * assume we have constantDuration packets. Since we don't have * the index we must use the AU duration to calculate the * index. Get the diff between the timestamps first, this can be * positive or negative. */ if (rtpmp4gdepay->prev_rtptime <= rtptime) diff = rtptime - rtpmp4gdepay->prev_rtptime; else diff = -(rtpmp4gdepay->prev_rtptime - rtptime); /* if no constantDuration was given, make one */ if (rtpmp4gdepay->constantDuration != 0) { cd = rtpmp4gdepay->constantDuration; GST_DEBUG_OBJECT (depayload, "using constantDuration %d", cd); } else if (rtpmp4gdepay->prev_AU_num > 0) { /* use number of packets and of previous frame */ cd = diff / rtpmp4gdepay->prev_AU_num; GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d", cd); } else { /* assume this frame has the same number of packets as the * previous one */ cd = diff / num_AU_headers; GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d", cd); } if (cd > 0) { /* get the number of packets by dividing with the duration */ diff /= cd; } else { diff = 0; } rtpmp4gdepay->last_AU_index += diff; rtpmp4gdepay->prev_AU_index = AU_index; AU_index = rtpmp4gdepay->last_AU_index; GST_DEBUG_OBJECT (rtpmp4gdepay, "diff %d, AU index %u", diff, AU_index); } else { rtpmp4gdepay->prev_AU_index = AU_index; rtpmp4gdepay->last_AU_index = AU_index; } /* keep track of the higest AU_index */ if (rtpmp4gdepay->max_AU_index != -1 && rtpmp4gdepay->max_AU_index <= AU_index) { GST_DEBUG_OBJECT (rtpmp4gdepay, "new interleave group, flushing"); /* a new interleave group started, flush */ gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay); } if (G_UNLIKELY (!rtpmp4gdepay->maxDisplacement && rtpmp4gdepay->max_AU_index != -1 && rtpmp4gdepay->max_AU_index >= AU_index)) { GstBuffer *outbuf; /* some broken non-interleaved streams have AU-index jumping around * all over the place, apparently assuming receiver disregards */ GST_DEBUG_OBJECT (rtpmp4gdepay, "non-interleaved broken AU indices;" " forcing continuous flush"); /* reset AU to avoid repeated DISCONT in such case */ outbuf = g_queue_peek_head (rtpmp4gdepay->packets); if (G_LIKELY (outbuf)) { rtpmp4gdepay->next_AU_index = GST_BUFFER_OFFSET (outbuf); gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay); } /* rebase next_AU_index to current rtp's first AU_index */ rtpmp4gdepay->next_AU_index = AU_index; } rtpmp4gdepay->prev_rtptime = rtptime; rtpmp4gdepay->prev_AU_num = num_AU_headers; } else { AU_index_delta = gst_bs_parse_read (&bs, rtpmp4gdepay->indexdeltalength); AU_index += AU_index_delta + 1; } /* keep track of highest AU_index */ if (rtpmp4gdepay->max_AU_index == -1 || AU_index > rtpmp4gdepay->max_AU_index) rtpmp4gdepay->max_AU_index = AU_index; /* the presentation time offset, a 2s-complement value, we need this to * calculate the timestamp on the output packet. */ if (rtpmp4gdepay->ctsdeltalength > 0) { if (gst_bs_parse_read (&bs, 1)) gst_bs_parse_read (&bs, rtpmp4gdepay->ctsdeltalength); } /* the decoding time offset, a 2s-complement value */ if (rtpmp4gdepay->dtsdeltalength > 0) { if (gst_bs_parse_read (&bs, 1)) gst_bs_parse_read (&bs, rtpmp4gdepay->dtsdeltalength); } /* RAP-flag to indicate that the AU contains a keyframe */ if (rtpmp4gdepay->randomaccessindication) gst_bs_parse_read (&bs, 1); /* stream-state */ if (rtpmp4gdepay->streamstateindication > 0) gst_bs_parse_read (&bs, rtpmp4gdepay->streamstateindication); GST_DEBUG_OBJECT (rtpmp4gdepay, "size %d, index %d, delta %d", AU_size, AU_index, AU_index_delta); /* fragmented pakets have the AU_size set to the size of the * unfragmented AU. */ if (AU_size > payload_AU_size) AU_size = payload_AU_size; /* collect stuff in the adapter, strip header from payload and push in * the adapter */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, payload_AU, AU_size); gst_adapter_push (rtpmp4gdepay->adapter, outbuf); if (M) { guint avail; /* packet is complete, flush */ avail = gst_adapter_available (rtpmp4gdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); /* copy some of the fields we calculated above on the buffer. We also * copy the AU_index so that we can sort the packets in our queue. */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_OFFSET (outbuf) = AU_index; /* make sure we don't use the timestamp again for other AUs in this * RTP packet. */ timestamp = -1; GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); gst_rtp_mp4g_depay_queue (rtpmp4gdepay, outbuf); } payload_AU += AU_size; payload_AU_size -= AU_size; } } else { /* push complete buffer in adapter */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 0, payload_len); gst_adapter_push (rtpmp4gdepay->adapter, outbuf); /* if this was the last packet of the VOP, create and push a buffer */ if (M) { guint avail; avail = gst_adapter_available (rtpmp4gdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } } } return NULL; /* ERRORS */ short_payload: { GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, ("Packet payload was too short."), (NULL)); return NULL; } } static gboolean gst_rtp_mp4g_depay_handle_event (GstBaseRTPDepayload * filter, GstEvent * event) { gboolean ret; GstRtpMP4GDepay *rtpmp4gdepay; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (filter); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_rtp_mp4g_depay_reset (rtpmp4gdepay); break; default: break; } ret = GST_BASE_RTP_DEPAYLOAD_CLASS (parent_class)->handle_event (filter, event); return ret; } static GstStateChangeReturn gst_rtp_mp4g_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpMP4GDepay *rtpmp4gdepay; GstStateChangeReturn ret; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_mp4g_depay_reset (rtpmp4gdepay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_mp4g_depay_reset (rtpmp4gdepay); break; default: break; } return ret; } gboolean gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4gdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP4G_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp2tdepay.h0000644000175000017500000000362611671175354016744 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_MP2T_DEPAY_H__ #define __GST_RTP_MP2T_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP2T_DEPAY \ (gst_rtp_mp2t_depay_get_type()) #define GST_RTP_MP2T_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP2T_DEPAY,GstRtpMP2TDepay)) #define GST_RTP_MP2T_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP2T_DEPAY,GstRtpMP2TDepayClass)) #define GST_IS_RTP_MP2T_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_DEPAY)) #define GST_IS_RTP_MP2T_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_DEPAY)) typedef struct _GstRtpMP2TDepay GstRtpMP2TDepay; typedef struct _GstRtpMP2TDepayClass GstRtpMP2TDepayClass; struct _GstRtpMP2TDepay { GstBaseRTPDepayload depayload; guint8 skip_first_bytes; }; struct _GstRtpMP2TDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mp2t_depay_get_type (void); gboolean gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP2T_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpac3depay.c0000644000175000017500000001354511677341656016532 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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 #include #include "gstrtpac3depay.h" GST_DEBUG_CATEGORY_STATIC (rtpac3depay_debug); #define GST_CAT_DEFAULT (rtpac3depay_debug) static GstStaticPadTemplate gst_rtp_ac3_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/ac3") ); static GstStaticPadTemplate gst_rtp_ac3_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) { 32000, 44100, 48000 }, " "encoding-name = (string) \"AC3\"") ); GST_BOILERPLATE (GstRtpAC3Depay, gst_rtp_ac3_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_ac3_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_ac3_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_ac3_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ac3_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ac3_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP AC3 depayloader", "Codec/Depayloader/Network/RTP", "Extracts AC3 audio from RTP packets (RFC 4184)", "Wim Taymans "); } static void gst_rtp_ac3_depay_class_init (GstRtpAC3DepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->set_caps = gst_rtp_ac3_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_ac3_depay_process; GST_DEBUG_CATEGORY_INIT (rtpac3depay_debug, "rtpac3depay", 0, "AC3 Audio RTP Depayloader"); } static void gst_rtp_ac3_depay_init (GstRtpAC3Depay * rtpac3depay, GstRtpAC3DepayClass * klass) { /* needed because of GST_BOILERPLATE */ } static gboolean gst_rtp_ac3_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstStructure *structure; gint clock_rate; GstCaps *srccaps; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("audio/ac3", NULL); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return res; } struct frmsize_s { guint16 bit_rate; guint16 frm_size[3]; }; static const struct frmsize_s frmsizecod_tbl[] = { {32, {64, 69, 96}}, {32, {64, 70, 96}}, {40, {80, 87, 120}}, {40, {80, 88, 120}}, {48, {96, 104, 144}}, {48, {96, 105, 144}}, {56, {112, 121, 168}}, {56, {112, 122, 168}}, {64, {128, 139, 192}}, {64, {128, 140, 192}}, {80, {160, 174, 240}}, {80, {160, 175, 240}}, {96, {192, 208, 288}}, {96, {192, 209, 288}}, {112, {224, 243, 336}}, {112, {224, 244, 336}}, {128, {256, 278, 384}}, {128, {256, 279, 384}}, {160, {320, 348, 480}}, {160, {320, 349, 480}}, {192, {384, 417, 576}}, {192, {384, 418, 576}}, {224, {448, 487, 672}}, {224, {448, 488, 672}}, {256, {512, 557, 768}}, {256, {512, 558, 768}}, {320, {640, 696, 960}}, {320, {640, 697, 960}}, {384, {768, 835, 1152}}, {384, {768, 836, 1152}}, {448, {896, 975, 1344}}, {448, {896, 976, 1344}}, {512, {1024, 1114, 1536}}, {512, {1024, 1115, 1536}}, {576, {1152, 1253, 1728}}, {576, {1152, 1254, 1728}}, {640, {1280, 1393, 1920}}, {640, {1280, 1394, 1920}} }; static GstBuffer * gst_rtp_ac3_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpAC3Depay *rtpac3depay; GstBuffer *outbuf; rtpac3depay = GST_RTP_AC3_DEPAY (depayload); { guint8 *payload; guint16 FT, NF; if (gst_rtp_buffer_get_payload_len (buf) < 2) goto empty_packet; payload = gst_rtp_buffer_get_payload (buf); /* strip off header * * 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | FT| NF | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ FT = payload[0] & 0x3; NF = payload[1]; GST_DEBUG_OBJECT (rtpac3depay, "FT: %d, NF: %d", FT, NF); /* We don't bother with fragmented packets yet */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 2, -1); if (outbuf) GST_DEBUG_OBJECT (rtpac3depay, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } return NULL; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpac3depay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } } gboolean gst_rtp_ac3_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpac3depay", GST_RANK_SECONDARY, GST_TYPE_RTP_AC3_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph263pdepay.c0000644000175000017500000002667711677341656016740 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstrtph263pdepay.h" static GstStaticPadTemplate gst_rtp_h263p_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h263, " "variant = (string) \"itu\" ") ); static GstStaticPadTemplate gst_rtp_h263p_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX], " "encoding-name = (string) \"H263-1998\"; " /* optional params */ /* NOTE all optional SDP params must be strings in the caps */ /* "sqcif = (string) [1, 32], " "qcif = (string) [1, 32], " "cif = (string) [1, 32], " "cif4 = (string) [1, 32], " "cif16 = (string) [1, 32], " "custom = (string) ANY, " "f = (string) {0, 1}," "i = (string) {0, 1}," "j = (string) {0, 1}," "t = (string) {0, 1}," "k = (string) {1, 2, 3, 4}," "n = (string) {1, 2, 3, 4}," "p = (string) ANY," "par = (string) ANY, " "cpcf = (string) ANY, " "bpp = (string) [0, 65536], " "hrd = (string) {0, 1}; " */ "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX], " "encoding-name = (string) \"H263-2000\" " /* optional params */ /* NOTE all optional SDP params must be strings in the caps */ /* "profile = (string) [0, 10], " "level = (string) {10, 20, 30, 40, 45, 50, 60, 70}, " "interlace = (string) {0, 1};" */ ) ); GST_BOILERPLATE (GstRtpH263PDepay, gst_rtp_h263p_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_h263p_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_h263p_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_h263p_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); gboolean gst_rtp_h263p_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static void gst_rtp_h263p_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263p_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263p_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP H263 depayloader", "Codec/Depayloader/Network/RTP", "Extracts H263/+/++ video from RTP packets (RFC 4629)", "Wim Taymans "); } static void gst_rtp_h263p_depay_class_init (GstRtpH263PDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_h263p_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_h263p_depay_setcaps; gobject_class->finalize = gst_rtp_h263p_depay_finalize; gstelement_class->change_state = gst_rtp_h263p_depay_change_state; } static void gst_rtp_h263p_depay_init (GstRtpH263PDepay * rtph263pdepay, GstRtpH263PDepayClass * klass) { rtph263pdepay->adapter = gst_adapter_new (); } static void gst_rtp_h263p_depay_finalize (GObject * object) { GstRtpH263PDepay *rtph263pdepay; rtph263pdepay = GST_RTP_H263P_DEPAY (object); g_object_unref (rtph263pdepay->adapter); rtph263pdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } gboolean gst_rtp_h263p_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) { GstCaps *srccaps = NULL; GstStructure *structure = gst_caps_get_structure (caps, 0); gint clock_rate; const gchar *encoding_name = NULL; gboolean res; if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ filter->clock_rate = clock_rate; encoding_name = gst_structure_get_string (structure, "encoding-name"); if (encoding_name == NULL) goto no_encoding_name; if (g_ascii_strcasecmp (encoding_name, "H263-2000") == 0) { /* always h263++ */ srccaps = gst_caps_new_simple ("video/x-h263", "variant", G_TYPE_STRING, "itu", "h263version", G_TYPE_STRING, "h263pp", NULL); } else if (g_ascii_strcasecmp (encoding_name, "H263-1998") == 0) { /* this can be H263 or H263+ depending on defined appendixes in the optional * SDP params */ const gchar *F, *I, *J, *T, *K, *N, *P; gboolean is_h263p = FALSE; F = gst_structure_get_string (structure, "f"); if (F) if (g_ascii_strcasecmp (F, "1") == 0) is_h263p = TRUE; I = gst_structure_get_string (structure, "i"); if (I) if (g_ascii_strcasecmp (I, "1") == 0) is_h263p = TRUE; J = gst_structure_get_string (structure, "j"); if (J) if (g_ascii_strcasecmp (J, "1") == 0) is_h263p = TRUE; T = gst_structure_get_string (structure, "t"); if (T) if (g_ascii_strcasecmp (T, "1") == 0) is_h263p = TRUE; K = gst_structure_get_string (structure, "k"); if (K) is_h263p = TRUE; N = gst_structure_get_string (structure, "n"); if (N) is_h263p = TRUE; P = gst_structure_get_string (structure, "p"); if (P) is_h263p = TRUE; if (is_h263p) { srccaps = gst_caps_new_simple ("video/x-h263", "variant", G_TYPE_STRING, "itu", "h263version", G_TYPE_STRING, "h263p", NULL); } else { srccaps = gst_caps_new_simple ("video/x-h263", "variant", G_TYPE_STRING, "itu", "h263version", G_TYPE_STRING, "h263", NULL); } } if (!srccaps) goto no_caps; res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); gst_caps_unref (srccaps); return res; /* ERRORS */ no_encoding_name: { GST_ERROR_OBJECT (filter, "no encoding-name"); return FALSE; } no_caps: { GST_ERROR_OBJECT (filter, "invalid encoding-name"); return FALSE; } } static GstBuffer * gst_rtp_h263p_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpH263PDepay *rtph263pdepay; GstBuffer *outbuf; rtph263pdepay = GST_RTP_H263P_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { GST_LOG_OBJECT (depayload, "DISCONT, flushing adapter"); gst_adapter_clear (rtph263pdepay->adapter); rtph263pdepay->wait_start = TRUE; } { gint payload_len; guint8 *payload; gboolean P, V, M; guint header_len; guint8 PLEN, PEBIT; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); header_len = 2; if (payload_len < header_len) goto too_small; M = gst_rtp_buffer_get_marker (buf); /* 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | RR |P|V| PLEN |PEBIT| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ P = (payload[0] & 0x04) == 0x04; V = (payload[0] & 0x02) == 0x02; PLEN = ((payload[0] & 0x1) << 5) | (payload[1] >> 3); PEBIT = payload[1] & 0x7; GST_LOG_OBJECT (depayload, "P %d, V %d, PLEN %d, PEBIT %d", P, V, PLEN, PEBIT); if (V) { header_len++; } if (PLEN) { header_len += PLEN; } if ((!P && payload_len < header_len) || (P && payload_len < header_len - 2)) goto too_small; if (P) { /* FIXME, have to make the packet writable hear. Better to reset these * bytes when we copy the packet below */ rtph263pdepay->wait_start = FALSE; header_len -= 2; payload[header_len] = 0; payload[header_len + 1] = 0; } if (rtph263pdepay->wait_start) goto waiting_start; if (payload_len < header_len) goto too_small; /* FIXME do not ignore the VRC header (See RFC 2429 section 4.2) */ /* FIXME actually use the RTP picture header when it is lost in the network */ /* for now strip off header */ payload += header_len; payload_len -= header_len; if (M) { /* frame is completed: append to previous, push it out */ guint len, padlen; guint avail; GST_LOG_OBJECT (depayload, "Frame complete"); avail = gst_adapter_available (rtph263pdepay->adapter); len = avail + payload_len; padlen = (len % 4) + 4; outbuf = gst_buffer_new_and_alloc (len + padlen); memset (GST_BUFFER_DATA (outbuf) + len, 0, padlen); GST_BUFFER_SIZE (outbuf) = len; /* prepend previous data */ if (avail > 0) { gst_adapter_copy (rtph263pdepay->adapter, GST_BUFFER_DATA (outbuf), 0, avail); gst_adapter_flush (rtph263pdepay->adapter, avail); } memcpy (GST_BUFFER_DATA (outbuf) + avail, payload, payload_len); return outbuf; } else { /* frame not completed: store in adapter */ outbuf = gst_buffer_new_and_alloc (payload_len); GST_LOG_OBJECT (depayload, "Frame incomplete, storing %d", payload_len); memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); gst_adapter_push (rtph263pdepay->adapter, outbuf); } } return NULL; too_small: { GST_ELEMENT_WARNING (rtph263pdepay, STREAM, DECODE, ("Packet payload was too small"), (NULL)); return NULL; } waiting_start: { GST_DEBUG_OBJECT (rtph263pdepay, "waiting for picture start"); return NULL; } } static GstStateChangeReturn gst_rtp_h263p_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpH263PDepay *rtph263pdepay; GstStateChangeReturn ret; rtph263pdepay = GST_RTP_H263P_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtph263pdepay->adapter); rtph263pdepay->wait_start = TRUE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_h263p_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtph263pdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_H263P_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp1sdepay.c0000644000175000017500000001042011677341656016731 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include "gstrtpmp1sdepay.h" /* RtpMP1SDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { PROP_0, PROP_LAST }; static GstStaticPadTemplate gst_rtp_mp1s_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg,systemstream=(boolean)true") ); /* The spec says video/MP1S but I have seen streams with other/MP1S so we will * allow them both */ static GstStaticPadTemplate gst_rtp_mp1s_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"other\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP1S\";" "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP1S\"") ); GST_BOILERPLATE (GstRtpMP1SDepay, gst_rtp_mp1s_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mp1s_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp1s_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mp1s_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp1s_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp1s_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG1 System Stream depayloader", "Codec/Depayloader/Network/RTP", "Extracts MPEG1 System Streams from RTP packets (RFC 3555)", "Wim Taymans "); } static void gst_rtp_mp1s_depay_class_init (GstRtpMP1SDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_mp1s_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp1s_depay_setcaps; } static void gst_rtp_mp1s_depay_init (GstRtpMP1SDepay * rtpmp1sdepay, GstRtpMP1SDepayClass * klass) { } static gboolean gst_rtp_mp1s_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; GstStructure *structure; gint clock_rate; gboolean res; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return res; } static GstBuffer * gst_rtp_mp1s_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf; outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (outbuf) GST_DEBUG ("gst_rtp_mp1s_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } gboolean gst_rtp_mp1s_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp1sdepay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP1S_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4vpay.h0000644000175000017500000000432711671175354016436 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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_RTP_MP4V_PAY_H__ #define __GST_RTP_MP4V_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP4V_PAY \ (gst_rtp_mp4v_pay_get_type()) #define GST_RTP_MP4V_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4V_PAY,GstRtpMP4VPay)) #define GST_RTP_MP4V_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4V_PAY,GstRtpMP4VPayClass)) #define GST_IS_RTP_MP4V_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4V_PAY)) #define GST_IS_RTP_MP4V_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4V_PAY)) typedef struct _GstRtpMP4VPay GstRtpMP4VPay; typedef struct _GstRtpMP4VPayClass GstRtpMP4VPayClass; struct _GstRtpMP4VPay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_timestamp; GstClockTime duration; gint rate; gint profile; GstBuffer *config; gboolean send_config; gboolean need_config; gboolean buffer_list; /* naming might be confusing with send_config; but naming matches h264 * payloader */ guint config_interval; GstClockTime last_config; }; struct _GstRtpMP4VPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_mp4v_pay_get_type (void); gboolean gst_rtp_mp4v_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4V_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpj2kpay.h0000644000175000017500000000350211671175354016230 00000000000000/* GStreamer * Copyright (C) 2009 Wim Taymans * * 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_RTP_J2K_PAY_H__ #define __GST_RTP_J2K_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_J2K_PAY \ (gst_rtp_j2k_pay_get_type()) #define GST_RTP_J2K_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_J2K_PAY,GstRtpJ2KPay)) #define GST_RTP_J2K_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_J2K_PAY,GstRtpJ2KPayClass)) #define GST_IS_RTP_J2K_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_J2K_PAY)) #define GST_IS_RTP_J2K_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_J2K_PAY)) typedef struct _GstRtpJ2KPay GstRtpJ2KPay; typedef struct _GstRtpJ2KPayClass GstRtpJ2KPayClass; struct _GstRtpJ2KPay { GstBaseRTPPayload payload; gboolean buffer_list; gint height; gint width; }; struct _GstRtpJ2KPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_j2k_pay_get_type (void); gboolean gst_rtp_j2k_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_J2K_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpac3pay.h0000644000175000017500000000360411671175354016213 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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_RTP_AC3_PAY_H__ #define __GST_RTP_AC3_PAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_AC3_PAY \ (gst_rtp_ac3_pay_get_type()) #define GST_RTP_AC3_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AC3_PAY,GstRtpAC3Pay)) #define GST_RTP_AC3_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AC3_PAY,GstRtpAC3PayClass)) #define GST_IS_RTP_AC3_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AC3_PAY)) #define GST_IS_RTP_AC3_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AC3_PAY)) typedef struct _GstRtpAC3Pay GstRtpAC3Pay; typedef struct _GstRtpAC3PayClass GstRtpAC3PayClass; struct _GstRtpAC3Pay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime first_ts; GstClockTime duration; guint NF; }; struct _GstRtpAC3PayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_ac3_pay_get_type (void); gboolean gst_rtp_ac3_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_AC3_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpqdmdepay.h0000644000175000017500000000471311671175354016641 00000000000000/* GStreamer * Copyright (C) <2009> Edward Hervey * * 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_RTP_QDM2_DEPAY_H__ #define __GST_RTP_QDM2_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_QDM2_DEPAY \ (gst_rtp_qdm2_depay_get_type()) #define GST_RTP_QDM2_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_QDM2_DEPAY,GstRtpQDM2Depay)) #define GST_RTP_QDM2_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_QDM2_DEPAY,GstRtpQDM2DepayClass)) #define GST_IS_RTP_QDM2_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_QDM2_DEPAY)) #define GST_IS_RTP_QDM2_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_QDM2_DEPAY)) typedef struct _GstRtpQDM2Depay GstRtpQDM2Depay; typedef struct _GstRtpQDM2DepayClass GstRtpQDM2DepayClass; typedef struct _QDM2Packet { guint8* data; guint offs; /* Starts at 4 to give room for the prefix */ } QDM2Packet; #define MAX_SCRAMBLED_PACKETS 64 struct _GstRtpQDM2Depay { GstBaseRTPDepayload depayload; GstAdapter *adapter; guint16 nextseq; gboolean configured; GstClockTime timestamp; /* Timestamp of current incoming data */ GstClockTime ptimestamp; /* Timestamp of data stored in the adapter */ guint32 channs; guint32 samplerate; guint32 bitrate; guint32 blocksize; guint32 framesize; guint32 packetsize; guint nbpackets; /* Number of packets to unscramble */ QDM2Packet *packets[MAX_SCRAMBLED_PACKETS]; }; struct _GstRtpQDM2DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_qdm2_depay_get_type (void); gboolean gst_rtp_qdm2_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_QDM2_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtppcmadepay.h0000644000175000017500000000316511671175354017000 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 */ #ifndef __GST_RTP_PCMA_DEPAY_H__ #define __GST_RTP_PCMA_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpPcmaDepay GstRtpPcmaDepay; typedef struct _GstRtpPcmaDepayClass GstRtpPcmaDepayClass; #define GST_TYPE_RTP_PCMA_DEPAY \ (gst_rtp_pcma_depay_get_type()) #define GST_RTP_PCMA_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMA_DEPAY,GstRtpPcmaDepay)) #define GST_RTP_PCMA_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMA_DEPAY,GstRtpPcmaDepayClass)) #define GST_IS_RTP_PCMA_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMA_DEPAY)) #define GST_IS_RTP_PCMA_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMA_DEPAY)) struct _GstRtpPcmaDepay { GstBaseRTPDepayload depayload; }; struct _GstRtpPcmaDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_pcma_depay_get_type (void); gboolean gst_rtp_pcma_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_PCMA_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtp.c0000644000175000017500000001666111671175354015114 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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 "gstrtpdepay.h" #include "gstrtpac3depay.h" #include "gstrtpac3pay.h" #include "gstrtpbvdepay.h" #include "gstrtpbvpay.h" #include "gstrtpceltdepay.h" #include "gstrtpceltpay.h" #include "gstrtpdvdepay.h" #include "gstrtpdvpay.h" #include "gstrtpgstdepay.h" #include "gstrtpgstpay.h" #include "gstrtpilbcdepay.h" #include "gstrtpilbcpay.h" #include "gstrtppcmupay.h" #include "gstrtppcmapay.h" #include "gstrtppcmadepay.h" #include "gstrtppcmudepay.h" #include "gstrtpg722depay.h" #include "gstrtpg722pay.h" #include "gstrtpg723depay.h" #include "gstrtpg723pay.h" #include "gstrtpg726depay.h" #include "gstrtpg726pay.h" #include "gstrtpg729depay.h" #include "gstrtpg729pay.h" #include "gstrtpgsmpay.h" #include "gstrtpgsmdepay.h" #include "gstrtpamrpay.h" #include "gstrtpamrdepay.h" #include "gstrtpmpapay.h" #include "gstrtpmpadepay.h" #include "gstrtpmparobustdepay.h" #include "gstrtpmpvdepay.h" #include "gstrtpmpvpay.h" #include "gstrtph263pdepay.h" #include "gstrtph263ppay.h" #include "gstrtph263depay.h" #include "gstrtph263pay.h" #include "gstrtph264depay.h" #include "gstrtph264pay.h" #include "gstrtpj2kdepay.h" #include "gstrtpj2kpay.h" #include "gstrtpjpegdepay.h" #include "gstrtpjpegpay.h" #include "gstrtpL16depay.h" #include "gstrtpL16pay.h" #include "gstasteriskh263.h" #include "gstrtpmp1sdepay.h" #include "gstrtpmp2tdepay.h" #include "gstrtpmp2tpay.h" #include "gstrtpmp4vdepay.h" #include "gstrtpmp4vpay.h" #include "gstrtpmp4adepay.h" #include "gstrtpmp4apay.h" #include "gstrtpmp4gdepay.h" #include "gstrtpmp4gpay.h" #include "gstrtpqcelpdepay.h" #include "gstrtpqdmdepay.h" #include "gstrtpsirenpay.h" #include "gstrtpsirendepay.h" #include "gstrtpspeexpay.h" #include "gstrtpspeexdepay.h" #include "gstrtpsv3vdepay.h" #include "gstrtptheoradepay.h" #include "gstrtptheorapay.h" #include "gstrtpvorbisdepay.h" #include "gstrtpvorbispay.h" #include "gstrtpvrawdepay.h" #include "gstrtpvrawpay.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_rtp_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_ac3_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_ac3_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_bv_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_bv_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_celt_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_celt_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_dv_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_dv_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_gst_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_gst_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_ilbc_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_ilbc_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g722_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g722_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g723_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g723_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g726_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g726_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g729_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_g729_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_gsm_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_gsm_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_amr_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_amr_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_pcma_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_pcmu_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_pcmu_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_pcma_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mpa_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mpa_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mpa_robust_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mpv_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mpv_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_h263p_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_h263p_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_h263_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_h263_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_h264_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_h264_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_j2k_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_j2k_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_jpeg_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_jpeg_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_L16_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_L16_depay_plugin_init (plugin)) return FALSE; if (!gst_asteriskh263_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp1s_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp2t_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp2t_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp4v_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp4v_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp4a_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp4a_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp4g_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_mp4g_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_qcelp_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_qdm2_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_siren_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_siren_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_speex_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_speex_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_sv3v_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_theora_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_theora_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_vorbis_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_vorbis_pay_plugin_init (plugin)) return FALSE; if (!gst_rtp_vraw_depay_plugin_init (plugin)) return FALSE; if (!gst_rtp_vraw_pay_plugin_init (plugin)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "rtp", "Real-time protocol plugins", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); gst-plugins-good-0.10.31/gst/rtp/gstrtpvorbispay.c0000644000175000017500000005135111677341656017054 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include "fnv1hash.h" #include "gstrtpvorbispay.h" GST_DEBUG_CATEGORY_STATIC (rtpvorbispay_debug); #define GST_CAT_DEFAULT (rtpvorbispay_debug) /* references: * http://www.rfc-editor.org/rfc/rfc5215.txt */ static GstStaticPadTemplate gst_rtp_vorbis_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"VORBIS\"" /* All required parameters * * "encoding-params = (string) " * "configuration = (string) ANY" */ ) ); static GstStaticPadTemplate gst_rtp_vorbis_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-vorbis") ); GST_BOILERPLATE (GstRtpVorbisPay, gst_rtp_vorbis_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static gboolean gst_rtp_vorbis_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstStateChangeReturn gst_rtp_vorbis_pay_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_rtp_vorbis_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); static gboolean gst_rtp_vorbis_pay_handle_event (GstPad * pad, GstEvent * event); static void gst_rtp_vorbis_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vorbis_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_vorbis_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP Vorbis depayloader", "Codec/Payloader/Network/RTP", "Payload-encode Vorbis audio into RTP packets (RFC 5215)", "Wim Taymans "); } static void gst_rtp_vorbis_pay_class_init (GstRtpVorbisPayClass * klass) { GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstelement_class->change_state = gst_rtp_vorbis_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_vorbis_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_vorbis_pay_handle_buffer; gstbasertppayload_class->handle_event = gst_rtp_vorbis_pay_handle_event; GST_DEBUG_CATEGORY_INIT (rtpvorbispay_debug, "rtpvorbispay", 0, "Vorbis RTP Payloader"); } static void gst_rtp_vorbis_pay_init (GstRtpVorbisPay * rtpvorbispay, GstRtpVorbisPayClass * klass) { /* needed because of GST_BOILERPLATE */ } static void gst_rtp_vorbis_pay_clear_packet (GstRtpVorbisPay * rtpvorbispay) { if (rtpvorbispay->packet) gst_buffer_unref (rtpvorbispay->packet); rtpvorbispay->packet = NULL; } static void gst_rtp_vorbis_pay_cleanup (GstRtpVorbisPay * rtpvorbispay) { g_list_foreach (rtpvorbispay->headers, (GFunc) gst_mini_object_unref, NULL); g_list_free (rtpvorbispay->headers); rtpvorbispay->headers = NULL; gst_rtp_vorbis_pay_clear_packet (rtpvorbispay); } static gboolean gst_rtp_vorbis_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstRtpVorbisPay *rtpvorbispay; rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); rtpvorbispay->need_headers = TRUE; return TRUE; } static void gst_rtp_vorbis_pay_reset_packet (GstRtpVorbisPay * rtpvorbispay, guint8 VDT) { guint payload_len; GST_LOG_OBJECT (rtpvorbispay, "reset packet"); rtpvorbispay->payload_pos = 4; payload_len = gst_rtp_buffer_get_payload_len (rtpvorbispay->packet); rtpvorbispay->payload_left = payload_len - 4; rtpvorbispay->payload_duration = 0; rtpvorbispay->payload_F = 0; rtpvorbispay->payload_VDT = VDT; rtpvorbispay->payload_pkts = 0; } static void gst_rtp_vorbis_pay_init_packet (GstRtpVorbisPay * rtpvorbispay, guint8 VDT, GstClockTime timestamp) { GST_LOG_OBJECT (rtpvorbispay, "starting new packet, VDT: %d", VDT); if (rtpvorbispay->packet) gst_buffer_unref (rtpvorbispay->packet); /* new packet allocate max packet size */ rtpvorbispay->packet = gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU (rtpvorbispay), 0, 0); gst_rtp_vorbis_pay_reset_packet (rtpvorbispay, VDT); GST_BUFFER_TIMESTAMP (rtpvorbispay->packet) = timestamp; } static GstFlowReturn gst_rtp_vorbis_pay_flush_packet (GstRtpVorbisPay * rtpvorbispay) { GstFlowReturn ret; guint8 *payload; guint hlen; /* check for empty packet */ if (!rtpvorbispay->packet || rtpvorbispay->payload_pos <= 4) return GST_FLOW_OK; GST_LOG_OBJECT (rtpvorbispay, "flushing packet"); /* fix header */ payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | F |VDT|# pkts.| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * F: Fragment type (0=none, 1=start, 2=cont, 3=end) * VDT: Vorbis data type (0=vorbis, 1=config, 2=comment, 3=reserved) * pkts: number of packets. */ payload[0] = (rtpvorbispay->payload_ident >> 16) & 0xff; payload[1] = (rtpvorbispay->payload_ident >> 8) & 0xff; payload[2] = (rtpvorbispay->payload_ident) & 0xff; payload[3] = (rtpvorbispay->payload_F & 0x3) << 6 | (rtpvorbispay->payload_VDT & 0x3) << 4 | (rtpvorbispay->payload_pkts & 0xf); /* shrink the buffer size to the last written byte */ hlen = gst_rtp_buffer_calc_header_len (0); GST_BUFFER_SIZE (rtpvorbispay->packet) = hlen + rtpvorbispay->payload_pos; GST_BUFFER_DURATION (rtpvorbispay->packet) = rtpvorbispay->payload_duration; /* push, this gives away our ref to the packet, so clear it. */ ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpvorbispay), rtpvorbispay->packet); rtpvorbispay->packet = NULL; return ret; } static gboolean gst_rtp_vorbis_pay_finish_headers (GstBaseRTPPayload * basepayload) { GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); GList *walk; guint length, size, n_headers, configlen; gchar *cstr, *configuration; guint8 *data, *config; guint32 ident; gboolean res; GST_DEBUG_OBJECT (rtpvorbispay, "finish headers"); if (!rtpvorbispay->headers) goto no_headers; /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of packed headers | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | .... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * We only construct a config containing 1 packed header like this: * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | length .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | n. of headers | length1 | length2 .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Identification Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Comment Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Comment Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Setup Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Setup Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ /* we need 4 bytes for the number of headers (which is always 1), 3 bytes for * the ident, 2 bytes for length, 1 byte for n. of headers. */ size = 4 + 3 + 2 + 1; /* count the size of the headers first and update the hash */ length = 0; n_headers = 0; ident = fnv1_hash_32_new (); for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); guint bsize; bsize = GST_BUFFER_SIZE (buf); length += bsize; n_headers++; /* count number of bytes needed for length fields, we don't need this for * the last header. */ if (g_list_next (walk)) { do { size++; bsize >>= 7; } while (bsize); } /* update hash */ ident = fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } /* packet length is header size + packet length */ configlen = size + length; config = data = g_malloc (configlen); /* number of packed headers, we only pack 1 header */ data[0] = 0; data[1] = 0; data[2] = 0; data[3] = 1; ident = fnv1_hash_32_to_24 (ident); rtpvorbispay->payload_ident = ident; GST_DEBUG_OBJECT (rtpvorbispay, "ident 0x%08x", ident); /* take lower 3 bytes */ data[4] = (ident >> 16) & 0xff; data[5] = (ident >> 8) & 0xff; data[6] = ident & 0xff; /* store length of all vorbis headers */ data[7] = ((length) >> 8) & 0xff; data[8] = (length) & 0xff; /* store number of headers minus one. */ data[9] = n_headers - 1; data += 10; /* store length for each header */ for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); guint bsize, size, temp; guint flag; /* only need to store the length when it's not the last header */ if (!g_list_next (walk)) break; bsize = GST_BUFFER_SIZE (buf); /* calc size */ size = 0; do { size++; bsize >>= 7; } while (bsize); temp = size; bsize = GST_BUFFER_SIZE (buf); /* write the size backwards */ flag = 0; while (size) { size--; data[size] = (bsize & 0x7f) | flag; bsize >>= 7; flag = 0x80; /* Flag bit on all bytes of the length except the last */ } data += temp; } /* copy header data */ for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); data += GST_BUFFER_SIZE (buf); } /* serialize to base64 */ configuration = g_base64_encode (config, configlen); g_free (config); /* configure payloader settings */ cstr = g_strdup_printf ("%d", rtpvorbispay->channels); gst_basertppayload_set_options (basepayload, "audio", TRUE, "VORBIS", rtpvorbispay->rate); res = gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, cstr, "configuration", G_TYPE_STRING, configuration, NULL); g_free (cstr); g_free (configuration); return res; /* ERRORS */ no_headers: { GST_DEBUG_OBJECT (rtpvorbispay, "finish headers"); return FALSE; } } static gboolean gst_rtp_vorbis_pay_parse_id (GstBaseRTPPayload * basepayload, guint8 * data, guint size) { GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); guint8 channels; gint32 rate, version; if (G_UNLIKELY (size < 16)) goto too_short; if (G_UNLIKELY (memcmp (data, "\001vorbis", 7))) goto invalid_start; data += 7; if (G_UNLIKELY ((version = GST_READ_UINT32_LE (data)) != 0)) goto invalid_version; data += 4; if (G_UNLIKELY ((channels = *data++) < 1)) goto invalid_channels; if (G_UNLIKELY ((rate = GST_READ_UINT32_LE (data)) < 1)) goto invalid_rate; /* all fine, store the values */ rtpvorbispay->channels = channels; rtpvorbispay->rate = rate; return TRUE; /* ERRORS */ too_short: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, ("Identification packet is too short, need at least 16, got %d", size), (NULL)); return FALSE; } invalid_start: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, ("Invalid header start in identification packet"), (NULL)); return FALSE; } invalid_version: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, ("Invalid version, expected 0, got %d", version), (NULL)); return FALSE; } invalid_rate: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, ("Invalid rate %d", rate), (NULL)); return FALSE; } invalid_channels: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, ("Invalid channels %d", channels), (NULL)); return FALSE; } } static GstFlowReturn gst_rtp_vorbis_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpVorbisPay *rtpvorbispay; GstFlowReturn ret; guint size, newsize; guint8 *data; guint packet_len; GstClockTime duration, newduration, timestamp; gboolean flush; guint8 VDT; guint plen; guint8 *ppos, *payload; gboolean fragmented; rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); duration = GST_BUFFER_DURATION (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); GST_LOG_OBJECT (rtpvorbispay, "size %u, duration %" GST_TIME_FORMAT, size, GST_TIME_ARGS (duration)); if (G_UNLIKELY (size < 1 || size > 0xffff)) goto wrong_size; /* find packet type */ if (data[0] & 1) { /* header */ if (data[0] == 1) { /* identification, we need to parse this in order to get the clock rate. */ if (G_UNLIKELY (!gst_rtp_vorbis_pay_parse_id (basepayload, data, size))) goto parse_id_failed; VDT = 1; } else if (data[0] == 3) { /* comment */ VDT = 2; } else if (data[0] == 5) { /* setup */ VDT = 1; } else goto unknown_header; } else /* data */ VDT = 0; if (rtpvorbispay->need_headers) { /* we need to collect the headers and construct a config string from them */ if (VDT != 0) { GST_DEBUG_OBJECT (rtpvorbispay, "collecting header"); /* append header to the list of headers */ rtpvorbispay->headers = g_list_append (rtpvorbispay->headers, buffer); ret = GST_FLOW_OK; goto done; } else { if (!gst_rtp_vorbis_pay_finish_headers (basepayload)) goto header_error; rtpvorbispay->need_headers = FALSE; } } /* size increases with packet length and 2 bytes size eader. */ newduration = rtpvorbispay->payload_duration; if (duration != GST_CLOCK_TIME_NONE) newduration += duration; newsize = rtpvorbispay->payload_pos + 2 + size; packet_len = gst_rtp_buffer_calc_packet_len (newsize, 0, 0); /* check buffer filled against length and max latency */ flush = gst_basertppayload_is_filled (basepayload, packet_len, newduration); /* we can store up to 15 vorbis packets in one RTP packet. */ flush |= (rtpvorbispay->payload_pkts == 15); /* flush if we have a new VDT */ if (rtpvorbispay->packet) flush |= (rtpvorbispay->payload_VDT != VDT); if (flush) gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); /* create new packet if we must */ if (!rtpvorbispay->packet) { gst_rtp_vorbis_pay_init_packet (rtpvorbispay, VDT, timestamp); } payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); ppos = payload + rtpvorbispay->payload_pos; fragmented = FALSE; ret = GST_FLOW_OK; /* put buffer in packet, it either fits completely or needs to be fragmented * over multiple RTP packets. */ while (size) { plen = MIN (rtpvorbispay->payload_left - 2, size); GST_LOG_OBJECT (rtpvorbispay, "append %u bytes", plen); /* data is copied in the payload with a 2 byte length header */ ppos[0] = (plen >> 8) & 0xff; ppos[1] = (plen & 0xff); memcpy (&ppos[2], data, plen); size -= plen; data += plen; rtpvorbispay->payload_pos += plen + 2; rtpvorbispay->payload_left -= plen + 2; if (fragmented) { if (size == 0) /* last fragment, set F to 0x3. */ rtpvorbispay->payload_F = 0x3; else /* fragment continues, set F to 0x2. */ rtpvorbispay->payload_F = 0x2; } else { if (size > 0) { /* fragmented packet starts, set F to 0x1, mark ourselves as * fragmented. */ rtpvorbispay->payload_F = 0x1; fragmented = TRUE; } } if (fragmented) { /* fragmented packets are always flushed and have ptks of 0 */ rtpvorbispay->payload_pkts = 0; ret = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); if (size > 0) { /* start new packet and get pointers. VDT stays the same. */ gst_rtp_vorbis_pay_init_packet (rtpvorbispay, rtpvorbispay->payload_VDT, timestamp); payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); ppos = payload + rtpvorbispay->payload_pos; } } else { /* unfragmented packet, update stats for next packet, size == 0 and we * exit the while loop */ rtpvorbispay->payload_pkts++; if (duration != GST_CLOCK_TIME_NONE) rtpvorbispay->payload_duration += duration; } } gst_buffer_unref (buffer); done: return ret; /* ERRORS */ wrong_size: { GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, ("Invalid packet size (1 < %d <= 0xffff)", size), (NULL)); gst_buffer_unref (buffer); return GST_FLOW_OK; } parse_id_failed: { gst_buffer_unref (buffer); return GST_FLOW_ERROR; } unknown_header: { GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, (NULL), ("Ignoring unknown header received")); gst_buffer_unref (buffer); return GST_FLOW_OK; } header_error: { GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, (NULL), ("Error initializing header config")); gst_buffer_unref (buffer); return GST_FLOW_OK; } } static gboolean gst_rtp_vorbis_pay_handle_event (GstPad * pad, GstEvent * event) { GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_rtp_vorbis_pay_clear_packet (rtpvorbispay); break; default: break; } /* false to let parent handle event as well */ return FALSE; } static GstStateChangeReturn gst_rtp_vorbis_pay_change_state (GstElement * element, GstStateChange transition) { GstRtpVorbisPay *rtpvorbispay; GstStateChangeReturn ret; rtpvorbispay = GST_RTP_VORBIS_PAY (element); switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_vorbis_pay_cleanup (rtpvorbispay); break; default: break; } return ret; } gboolean gst_rtp_vorbis_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpvorbispay", GST_RANK_SECONDARY, GST_TYPE_RTP_VORBIS_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstasteriskh263.c0000644000175000017500000001500511677341656016534 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * * 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 #include #include "gstasteriskh263.h" /* Cygwin has both netinet/in.h and winsock2.h, but * only one can be included, so prefer the unix one */ #ifdef HAVE_NETINET_IN_H # include #else #ifdef HAVE_WINSOCK2_H # include #endif #endif #define GST_ASTERISKH263_HEADER_LEN 6 typedef struct _GstAsteriskH263Header { guint32 timestamp; /* Timestamp */ guint16 length; /* Length */ } GstAsteriskH263Header; #define GST_ASTERISKH263_HEADER_TIMESTAMP(buf) (((GstAsteriskH263Header *)(GST_BUFFER_DATA (buf)))->timestamp) #define GST_ASTERISKH263_HEADER_LENGTH(buf) (((GstAsteriskH263Header *)(GST_BUFFER_DATA (buf)))->length) static GstStaticPadTemplate gst_asteriskh263_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-asteriskh263") ); static GstStaticPadTemplate gst_asteriskh263_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) [ 96, 127 ], " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-1998\"") ); static void gst_asteriskh263_finalize (GObject * object); static GstFlowReturn gst_asteriskh263_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_asteriskh263_change_state (GstElement * element, GstStateChange transition); GST_BOILERPLATE (GstAsteriskh263, gst_asteriskh263, GstElement, GST_TYPE_ELEMENT); static void gst_asteriskh263_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_asteriskh263_src_template); gst_element_class_add_static_pad_template (element_class, &gst_asteriskh263_sink_template); gst_element_class_set_details_simple (element_class, "RTP Asterisk H263 depayloader", "Codec/Depayloader/Network/RTP", "Extracts H263 video from RTP and encodes in Asterisk H263 format", "Neil Stratford "); } static void gst_asteriskh263_class_init (GstAsteriskh263Class * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_asteriskh263_finalize; gstelement_class->change_state = gst_asteriskh263_change_state; } static void gst_asteriskh263_init (GstAsteriskh263 * asteriskh263, GstAsteriskh263Class * klass) { asteriskh263->srcpad = gst_pad_new_from_static_template (&gst_asteriskh263_src_template, "src"); gst_element_add_pad (GST_ELEMENT (asteriskh263), asteriskh263->srcpad); asteriskh263->sinkpad = gst_pad_new_from_static_template (&gst_asteriskh263_sink_template, "sink"); gst_pad_set_chain_function (asteriskh263->sinkpad, gst_asteriskh263_chain); gst_element_add_pad (GST_ELEMENT (asteriskh263), asteriskh263->sinkpad); asteriskh263->adapter = gst_adapter_new (); } static void gst_asteriskh263_finalize (GObject * object) { GstAsteriskh263 *asteriskh263; asteriskh263 = GST_ASTERISK_H263 (object); g_object_unref (asteriskh263->adapter); asteriskh263->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static GstFlowReturn gst_asteriskh263_chain (GstPad * pad, GstBuffer * buf) { GstAsteriskh263 *asteriskh263; GstBuffer *outbuf; GstFlowReturn ret; asteriskh263 = GST_ASTERISK_H263 (GST_OBJECT_PARENT (pad)); if (!gst_rtp_buffer_validate (buf)) goto bad_packet; { gint payload_len; guint8 *payload; gboolean M; guint32 timestamp; guint32 samples; guint16 asterisk_len; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); M = gst_rtp_buffer_get_marker (buf); timestamp = gst_rtp_buffer_get_timestamp (buf); outbuf = gst_buffer_new_and_alloc (payload_len + GST_ASTERISKH263_HEADER_LEN); /* build the asterisk header */ asterisk_len = payload_len; if (M) asterisk_len |= 0x8000; if (!asteriskh263->lastts) asteriskh263->lastts = timestamp; samples = timestamp - asteriskh263->lastts; asteriskh263->lastts = timestamp; GST_ASTERISKH263_HEADER_TIMESTAMP (outbuf) = g_htonl (samples); GST_ASTERISKH263_HEADER_LENGTH (outbuf) = g_htons (asterisk_len); /* copy the data into place */ memcpy (GST_BUFFER_DATA (outbuf) + GST_ASTERISKH263_HEADER_LEN, payload, payload_len); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; gst_buffer_set_caps (outbuf, (GstCaps *) gst_pad_get_pad_template_caps (asteriskh263->srcpad)); ret = gst_pad_push (asteriskh263->srcpad, outbuf); gst_buffer_unref (buf); } return ret; bad_packet: { GST_DEBUG ("Packet does not validate"); gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static GstStateChangeReturn gst_asteriskh263_change_state (GstElement * element, GstStateChange transition) { GstAsteriskh263 *asteriskh263; GstStateChangeReturn ret; asteriskh263 = GST_ASTERISK_H263 (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (asteriskh263->adapter); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); /* switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } */ return ret; } gboolean gst_asteriskh263_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "asteriskh263", GST_RANK_SECONDARY, GST_TYPE_ASTERISK_H263); } gst-plugins-good-0.10.31/gst/rtp/gstrtpspeexpay.c0000644000175000017500000002213211677341656016667 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 #include #include #include "gstrtpspeexpay.h" GST_DEBUG_CATEGORY_STATIC (rtpspeexpay_debug); #define GST_CAT_DEFAULT (rtpspeexpay_debug) static GstStaticPadTemplate gst_rtp_speex_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-speex, " "rate = (int) [ 6000, 48000 ], " "channels = (int) 1") ); static GstStaticPadTemplate gst_rtp_speex_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [ 6000, 48000 ], " "encoding-name = (string) \"SPEEX\", " "encoding-params = (string) \"1\"") ); static GstStateChangeReturn gst_rtp_speex_pay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstCaps *gst_rtp_speex_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad); static GstFlowReturn gst_rtp_speex_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpSPEEXPay, gst_rtp_speex_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_speex_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_speex_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_speex_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP Speex payloader", "Codec/Payloader/Network/RTP", "Payload-encodes Speex audio into a RTP packet", "Edgard Lima "); GST_DEBUG_CATEGORY_INIT (rtpspeexpay_debug, "rtpspeexpay", 0, "Speex RTP Payloader"); } static void gst_rtp_speex_pay_class_init (GstRtpSPEEXPayClass * klass) { GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstelement_class->change_state = gst_rtp_speex_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_speex_pay_setcaps; gstbasertppayload_class->get_caps = gst_rtp_speex_pay_getcaps; gstbasertppayload_class->handle_buffer = gst_rtp_speex_pay_handle_buffer; } static void gst_rtp_speex_pay_init (GstRtpSPEEXPay * rtpspeexpay, GstRtpSPEEXPayClass * klass) { GST_BASE_RTP_PAYLOAD (rtpspeexpay)->clock_rate = 8000; GST_BASE_RTP_PAYLOAD_PT (rtpspeexpay) = 110; /* Create String */ } static gboolean gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { /* don't configure yet, we wait for the ident packet */ return TRUE; } static GstCaps * gst_rtp_speex_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad) { GstCaps *otherpadcaps; GstCaps *caps; otherpadcaps = gst_pad_get_allowed_caps (payload->srcpad); caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { GstStructure *ps = gst_caps_get_structure (otherpadcaps, 0); GstStructure *s = gst_caps_get_structure (caps, 0); gint clock_rate; if (gst_structure_get_int (ps, "clock-rate", &clock_rate)) { gst_structure_fixate_field_nearest_int (s, "rate", clock_rate); } } gst_caps_unref (otherpadcaps); } return caps; } static gboolean gst_rtp_speex_pay_parse_ident (GstRtpSPEEXPay * rtpspeexpay, const guint8 * data, guint size) { guint32 version, header_size, rate, mode, nb_channels; GstBaseRTPPayload *payload; gchar *cstr; gboolean res; /* we need the header string (8), the version string (20), the version * and the header length. */ if (size < 36) goto too_small; if (!g_str_has_prefix ((const gchar *) data, "Speex ")) goto wrong_header; /* skip header and version string */ data += 28; version = GST_READ_UINT32_LE (data); if (version != 1) goto wrong_version; data += 4; /* ensure sizes */ header_size = GST_READ_UINT32_LE (data); if (header_size < 80) goto header_too_small; if (size < header_size) goto payload_too_small; data += 4; rate = GST_READ_UINT32_LE (data); data += 4; mode = GST_READ_UINT32_LE (data); data += 8; nb_channels = GST_READ_UINT32_LE (data); GST_DEBUG_OBJECT (rtpspeexpay, "rate %d, mode %d, nb_channels %d", rate, mode, nb_channels); payload = GST_BASE_RTP_PAYLOAD (rtpspeexpay); gst_basertppayload_set_options (payload, "audio", FALSE, "SPEEX", rate); cstr = g_strdup_printf ("%d", nb_channels); res = gst_basertppayload_set_outcaps (payload, "encoding-params", G_TYPE_STRING, cstr, NULL); g_free (cstr); return res; /* ERRORS */ too_small: { GST_DEBUG_OBJECT (rtpspeexpay, "ident packet too small, need at least 32 bytes"); return FALSE; } wrong_header: { GST_DEBUG_OBJECT (rtpspeexpay, "ident packet does not start with \"Speex \""); return FALSE; } wrong_version: { GST_DEBUG_OBJECT (rtpspeexpay, "can only handle version 1, have version %d", version); return FALSE; } header_too_small: { GST_DEBUG_OBJECT (rtpspeexpay, "header size too small, need at least 80 bytes, " "got only %d", header_size); return FALSE; } payload_too_small: { GST_DEBUG_OBJECT (rtpspeexpay, "payload too small, need at least %d bytes, got only %d", header_size, size); return FALSE; } } static GstFlowReturn gst_rtp_speex_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpSPEEXPay *rtpspeexpay; guint size, payload_len; GstBuffer *outbuf; guint8 *payload, *data; GstClockTime timestamp, duration; GstFlowReturn ret; rtpspeexpay = GST_RTP_SPEEX_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); switch (rtpspeexpay->packet) { case 0: /* ident packet. We need to parse the headers to construct the RTP * properties. */ if (!gst_rtp_speex_pay_parse_ident (rtpspeexpay, data, size)) goto parse_error; ret = GST_FLOW_OK; goto done; case 1: /* comment packet, we ignore it */ ret = GST_FLOW_OK; goto done; default: /* other packets go in the payload */ break; } if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_GAP)) { ret = GST_FLOW_OK; goto done; } timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); /* FIXME, only one SPEEX frame per RTP packet for now */ payload_len = size; outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* FIXME, assert for now */ g_assert (payload_len <= GST_BASE_RTP_PAYLOAD_MTU (rtpspeexpay)); /* copy timestamp and duration */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; /* get payload */ payload = gst_rtp_buffer_get_payload (outbuf); /* copy data in payload */ memcpy (&payload[0], data, size); ret = gst_basertppayload_push (basepayload, outbuf); done: gst_buffer_unref (buffer); rtpspeexpay->packet++; return ret; /* ERRORS */ parse_error: { GST_ELEMENT_ERROR (rtpspeexpay, STREAM, DECODE, (NULL), ("Error parsing first identification packet.")); gst_buffer_unref (buffer); return GST_FLOW_ERROR; } } static GstStateChangeReturn gst_rtp_speex_pay_change_state (GstElement * element, GstStateChange transition) { GstRtpSPEEXPay *rtpspeexpay; GstStateChangeReturn ret; rtpspeexpay = GST_RTP_SPEEX_PAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: rtpspeexpay->packet = 0; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; } gboolean gst_rtp_speex_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpspeexpay", GST_RANK_SECONDARY, GST_TYPE_RTP_SPEEX_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpmp1sdepay.h0000644000175000017500000000357211671175354016742 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_MP1S_DEPAY_H__ #define __GST_RTP_MP1S_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_MP1S_DEPAY \ (gst_rtp_mp1s_depay_get_type()) #define GST_RTP_MP1S_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP1S_DEPAY,GstRtpMP1SDepay)) #define GST_RTP_MP1S_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP1S_DEPAY,GstRtpMP1SDepayClass)) #define GST_IS_RTP_MP1S_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP1S_DEPAY)) #define GST_IS_RTP_MP1S_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP1S_DEPAY)) typedef struct _GstRtpMP1SDepay GstRtpMP1SDepay; typedef struct _GstRtpMP1SDepayClass GstRtpMP1SDepayClass; struct _GstRtpMP1SDepay { GstBaseRTPDepayload depayload; }; struct _GstRtpMP1SDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_mp1s_depay_get_type (void); gboolean gst_rtp_mp1s_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP1S_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtppcmudepay.c0000644000175000017500000001163211677341656017023 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2005> Edgard Lima * Copyright (C) <2005> Zeeshan Ali * * 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 #include #include "gstrtppcmudepay.h" /* RtpPcmuDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0 }; static GstStaticPadTemplate gst_rtp_pcmu_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_PCMU_STRING ", " "encoding-name = (string) \"PCMU\", clock-rate = (int) 8000; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "encoding-name = (string) \"PCMU\", clock-rate = (int) [1, MAX ]") ); static GstStaticPadTemplate gst_rtp_pcmu_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-mulaw, " "channels = (int) 1, rate = (int) [1, MAX ]") ); static GstBuffer *gst_rtp_pcmu_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_pcmu_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRtpPcmuDepay, gst_rtp_pcmu_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_pcmu_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcmu_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcmu_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP PCMU depayloader", "Codec/Depayloader/Network/RTP", "Extracts PCMU audio from RTP packets", "Edgard Lima , Zeeshan Ali "); } static void gst_rtp_pcmu_depay_class_init (GstRtpPcmuDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_pcmu_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_pcmu_depay_setcaps; } static void gst_rtp_pcmu_depay_init (GstRtpPcmuDepay * rtppcmudepay, GstRtpPcmuDepayClass * klass) { GstBaseRTPDepayload *depayload; depayload = GST_BASE_RTP_DEPAYLOAD (rtppcmudepay); gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); } static gboolean gst_rtp_pcmu_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; GstStructure *structure; gboolean ret; gint clock_rate; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; /* default */ depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("audio/x-mulaw", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; } static GstBuffer * gst_rtp_pcmu_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf = NULL; guint len; gboolean marker; marker = gst_rtp_buffer_get_marker (buf); GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); len = gst_rtp_buffer_get_payload_len (buf); outbuf = gst_rtp_buffer_get_payload_buffer (buf); if (outbuf) { GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (len, GST_SECOND, depayload->clock_rate); if (marker) { /* mark start of talkspurt with DISCONT */ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } } return outbuf; } gboolean gst_rtp_pcmu_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtppcmudepay", GST_RANK_SECONDARY, GST_TYPE_RTP_PCMU_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtph263pay.c0000644000175000017500000014434211677341656016235 00000000000000/* GStreamer * Copyright (C) <2005> Wim Taymans * Copyright (C) <2008> Dejan Sakelsak * Copyright (C) <2009> Janin Kolenc * * 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 #include #include #include "gstrtph263pay.h" typedef enum { GST_H263_FRAME_TYPE_I = 0, GST_H263_FRAME_TYPE_P = 1, GST_H263_FRAME_TYPE_PB = 2 } GstRtpH263PayFrameType; typedef enum { GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_RES1 = 0, GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_SQCIF = 1, GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_QCIF = 2, GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_CIF = 3, GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_4CIF = 4, GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_16CIF = 5, GST_RTP_H263_PAYLOAD_PICTURE_FORMAT_RES2 = 6, GST_H263_PAYLOAD_PICTURE_FORMAT_PLUS = 7 } GstRtpH263PayPictureFormat; static const guint format_props[8][2] = { {254, 254}, {6, 8}, {9, 11}, {18, 22}, {18, 88}, {18, 352}, {254, 254}, {255, 255} }; /* * I-frame MCBPC table: code, mask, nbits, cb, cr, mb type -> 10 = undefined (because we have guint) */ #define MCBPC_I_LEN 9 #define MCBPC_I_WID 6 static const guint32 mcbpc_I[9][6] = { {0x8000, 0x8000, 1, 0, 0, 3}, {0x2000, 0xe000, 3, 0, 1, 3}, {0x4000, 0xe000, 3, 1, 0, 3}, {0x6000, 0xe000, 3, 1, 1, 3}, {0x1000, 0xf000, 4, 0, 0, 4}, {0x0400, 0xfc00, 6, 0, 1, 4}, {0x0800, 0xfc00, 6, 1, 0, 4}, {0x0c00, 0xfc00, 6, 1, 1, 4}, {0x0080, 0xff80, 9, 10, 10, 10} }; /* * P-frame MCBPC table: code, mask, nbits, cb, cr, mb type -> 10 = undefined (because we have guint) */ #define MCBPC_P_LEN 21 #define MCBPC_P_WID 6 static const guint16 mcbpc_P[21][6] = { {0x8000, 0x8000, 1, 0, 0, 0}, {0x3000, 0xf000, 4, 0, 1, 0}, {0x2000, 0xf000, 4, 1, 0, 0}, {0x1400, 0xfc00, 6, 1, 1, 0}, {0x6000, 0xe000, 3, 0, 0, 1}, {0x0e00, 0xfe00, 7, 0, 1, 1}, {0x0c00, 0xfe00, 7, 1, 0, 1}, {0x0280, 0xff80, 9, 1, 1, 1}, {0x4000, 0xe000, 3, 0, 0, 2}, {0x0a00, 0xfe00, 7, 0, 1, 2}, {0x0800, 0xfe00, 7, 1, 0, 2}, {0x0500, 0xff00, 8, 1, 1, 2}, {0x1800, 0xf800, 5, 0, 0, 3}, {0x0400, 0xff00, 8, 0, 1, 3}, {0x0300, 0xff00, 8, 1, 0, 3}, {0x0600, 0xfe00, 7, 1, 1, 3}, {0x1000, 0xfc00, 6, 0, 0, 4}, {0x0200, 0xff80, 9, 0, 1, 4}, {0x0180, 0xff80, 9, 1, 0, 4}, {0x0100, 0xff80, 9, 1, 1, 4}, {0x0080, 0xff80, 9, 10, 10, 10} }; /* * I-frame CBPY (code, mask, nbits, Y0, Y1, Y2, Y3) */ #define CBPY_LEN 16 #define CBPY_WID 7 static const guint8 cbpy_I[16][7] = { {0x30, 0xf0, 4, 0, 0, 0, 0}, {0x28, 0xf8, 5, 0, 0, 0, 1}, {0x20, 0xf8, 5, 0, 0, 1, 0}, {0x90, 0xf0, 4, 0, 0, 1, 1}, {0x18, 0xf8, 5, 0, 1, 0, 0}, {0x70, 0xf0, 4, 0, 1, 0, 1}, {0x08, 0xfc, 6, 0, 1, 1, 0}, {0xb0, 0xf0, 4, 0, 1, 1, 1}, {0x10, 0xf8, 5, 1, 0, 0, 0}, {0x0c, 0xfc, 6, 1, 0, 0, 1}, {0x50, 0xf0, 4, 1, 0, 1, 0}, {0xa0, 0xf0, 4, 1, 0, 1, 1}, {0x40, 0xf0, 4, 1, 1, 0, 0}, {0x80, 0xf0, 4, 1, 1, 0, 1}, {0x60, 0xf0, 4, 1, 1, 1, 0}, {0xc0, 0xc0, 2, 1, 1, 1, 1} }; /* * P-frame CBPY (code, mask, nbits, Y0, Y1, Y2, Y3) */ static const guint8 cbpy_P[16][7] = { {0x30, 0xf0, 4, 1, 1, 1, 1}, {0x28, 0xf8, 5, 1, 1, 1, 0}, {0x20, 0xf8, 5, 1, 1, 0, 1}, {0x90, 0xf0, 4, 1, 1, 0, 0}, {0x18, 0xf8, 5, 1, 0, 1, 1}, {0x70, 0xf0, 4, 1, 0, 1, 0}, {0x08, 0xfc, 6, 1, 0, 0, 1}, {0xb0, 0xf0, 4, 1, 0, 0, 0}, {0x10, 0xf8, 5, 0, 1, 1, 1}, {0x0c, 0xfc, 6, 0, 1, 1, 0}, {0x50, 0xf0, 4, 0, 1, 0, 1}, {0xa0, 0xf0, 4, 0, 1, 0, 0}, {0x40, 0xf0, 4, 0, 0, 1, 1}, {0x80, 0xf0, 4, 0, 0, 1, 0}, {0x60, 0xf0, 4, 0, 0, 0, 1}, {0xc0, 0xc0, 2, 0, 0, 0, 0} }; /* * Block TCOEF table (code, mask, nbits, LAST, RUN, LEVEL) */ #define TCOEF_LEN 103 #define TCOEF_WID 6 static const guint16 tcoef[103][6] = { {0x8000, 0xc000, 3, 0, 0, 1}, {0xf000, 0xf000, 5, 0, 0, 2}, {0x5400, 0xfc00, 7, 0, 0, 3}, {0x2e00, 0xfe00, 8, 0, 0, 4}, {0x1f00, 0xff00, 9, 0, 0, 5}, {0x1280, 0xff80, 10, 0, 0, 6}, {0x1200, 0xff80, 10, 0, 0, 7}, {0x0840, 0xffc0, 11, 0, 0, 8}, {0x0800, 0xffc0, 11, 0, 0, 9}, {0x00e0, 0xffe0, 12, 0, 0, 10}, //10 {0x00c0, 0xffe0, 12, 0, 0, 11}, {0x0400, 0xffe0, 12, 0, 0, 12}, {0xc000, 0xe000, 4, 0, 1, 1}, {0x5000, 0xfc00, 7, 0, 1, 2}, {0x1e00, 0xff00, 9, 0, 1, 3}, {0x03c0, 0xffc0, 11, 0, 1, 4}, {0x0420, 0xffe0, 12, 0, 1, 5}, {0x0500, 0xfff0, 13, 0, 1, 6}, {0xe000, 0xf000, 5, 0, 2, 1}, {0x1d00, 0xff00, 9, 0, 2, 2}, //20 {0x0380, 0xffc0, 11, 0, 2, 3}, {0x0510, 0xfff0, 13, 0, 2, 4}, {0x6800, 0xf800, 6, 0, 3, 1}, {0x1180, 0xff80, 10, 0, 3, 2}, {0x0340, 0xffc0, 11, 0, 3, 3}, {0x6000, 0xf800, 6, 0, 4, 1}, {0x1100, 0xff80, 10, 0, 4, 2}, {0x0520, 0xfff0, 13, 0, 4, 3}, {0x5800, 0xf800, 6, 0, 5, 1}, {0x0300, 0xffc0, 11, 0, 5, 2}, // 30 {0x0530, 0xfff0, 13, 0, 5, 3}, {0x4c00, 0xfc00, 7, 0, 6, 1}, {0x02c0, 0xffc0, 11, 0, 6, 2}, {0x0540, 0xfff0, 13, 0, 6, 3}, {0x4800, 0xfc00, 7, 0, 7, 1}, {0x0280, 0xffc0, 11, 0, 7, 2}, {0x4400, 0xfc00, 7, 0, 8, 1}, {0x0240, 0xffc0, 11, 0, 8, 2}, {0x4000, 0xfc00, 7, 0, 9, 1}, {0x0200, 0xffc0, 11, 0, 9, 2}, // 40 {0x2c00, 0xfe00, 8, 0, 10, 1}, {0x0550, 0xfff0, 13, 0, 10, 2}, {0x2a00, 0xfe00, 8, 0, 11, 1}, {0x2800, 0xfe00, 8, 0, 12, 1}, {0x1c00, 0xff00, 9, 0, 13, 1}, {0x1b00, 0xff00, 9, 0, 14, 1}, {0x1080, 0xff80, 10, 0, 15, 1}, {0x1000, 0xff80, 10, 0, 16, 1}, {0x0f80, 0xff80, 10, 0, 17, 1}, {0x0f00, 0xff80, 10, 0, 18, 1}, // 50 {0x0e80, 0xff80, 10, 0, 19, 1}, {0x0e00, 0xff80, 10, 0, 20, 1}, {0x0d80, 0xff80, 10, 0, 21, 1}, {0x0d00, 0xff80, 10, 0, 22, 1}, {0x0440, 0xffe0, 12, 0, 23, 1}, {0x0460, 0xffe0, 12, 0, 24, 1}, {0x0560, 0xfff0, 13, 0, 25, 1}, {0x0570, 0xfff0, 13, 0, 26, 1}, {0x7000, 0xf000, 5, 1, 0, 1}, {0x0c80, 0xff80, 10, 1, 0, 2}, // 60 {0x00a0, 0xffe0, 12, 1, 0, 3}, {0x3c00, 0xfc00, 7, 1, 1, 1}, {0x0080, 0xffe0, 12, 1, 1, 2}, {0x3800, 0xfc00, 7, 1, 2, 1}, {0x3400, 0xfc00, 7, 1, 3, 1}, {0x3000, 0xfc00, 7, 1, 4, 1}, {0x2600, 0xfe00, 8, 1, 5, 1}, {0x2400, 0xfe00, 8, 1, 6, 1}, {0x2200, 0xfe00, 8, 1, 7, 1}, {0x2000, 0xfe00, 8, 1, 8, 1}, // 70 {0x1a00, 0xff00, 9, 1, 9, 1}, {0x1900, 0xff00, 9, 1, 10, 1}, {0x1800, 0xff00, 9, 1, 11, 1}, {0x1700, 0xff00, 9, 1, 12, 1}, {0x1600, 0xff00, 9, 1, 13, 1}, {0x1500, 0xff00, 9, 1, 14, 1}, {0x1400, 0xff00, 9, 1, 15, 1}, {0x1300, 0xff00, 9, 1, 16, 1}, {0x0c00, 0xff80, 10, 1, 17, 1}, {0x0b80, 0xff80, 10, 1, 18, 1}, // 80 {0x0b00, 0xff80, 10, 1, 19, 1}, {0x0a80, 0xff80, 10, 1, 20, 1}, {0x0a00, 0xff80, 10, 1, 21, 1}, {0x0980, 0xff80, 10, 1, 22, 1}, {0x0900, 0xff80, 10, 1, 23, 1}, {0x0880, 0xff80, 10, 1, 24, 1}, {0x01c0, 0xffc0, 11, 1, 25, 1}, {0x0180, 0xffc0, 11, 1, 26, 1}, {0x0140, 0xffc0, 11, 1, 27, 1}, {0x0100, 0xffc0, 11, 1, 28, 1}, // 90 {0x0480, 0xffe0, 12, 1, 29, 1}, {0x04a0, 0xffe0, 12, 1, 30, 1}, {0x04c0, 0xffe0, 12, 1, 31, 1}, {0x04e0, 0xffe0, 12, 1, 32, 1}, {0x0580, 0xfff0, 13, 1, 33, 1}, {0x0590, 0xfff0, 13, 1, 34, 1}, {0x05a0, 0xfff0, 13, 1, 35, 1}, {0x05b0, 0xfff0, 13, 1, 36, 1}, {0x05c0, 0xfff0, 13, 1, 37, 1}, {0x05d0, 0xfff0, 13, 1, 38, 1}, // 100 {0x05e0, 0xfff0, 13, 1, 39, 1}, {0x05f0, 0xfff0, 13, 1, 40, 1}, {0x0600, 0xfe00, 7, 0, 0xffff, 0xffff} }; /* * Motion vector code table (Code, mask, nbits, vector (halfpixel, two's complement), diff (halfpixel, two's complement)) */ #define MVD_LEN 64 #define MVD_WID 5 static const guint16 mvd[64][5] = { {0x0028, 0xfff8, 13, 0x0060, 0x0020}, {0x0038, 0xfff8, 13, 0x0061, 0x0021}, {0x0050, 0xfff0, 12, 0x0062, 0x0022}, {0x0070, 0xfff0, 12, 0x0063, 0x0023}, {0x0090, 0xfff0, 12, 0x0064, 0x0024}, {0x00b0, 0xfff0, 12, 0x0065, 0x0025}, {0x00d0, 0xfff0, 12, 0x0066, 0x0026}, {0x00f0, 0xfff0, 12, 0x0067, 0x0027}, {0x0120, 0xffe0, 11, 0x0068, 0x0028}, {0x0160, 0xffe0, 11, 0x0069, 0x0029}, {0x01a0, 0xffe0, 11, 0x006a, 0x002a}, {0x01e0, 0xffe0, 11, 0x006b, 0x002b}, {0x0220, 0xffe0, 11, 0x006c, 0x002c}, {0x0260, 0xffe0, 11, 0x006d, 0x002d}, {0x02a0, 0xffe0, 11, 0x006e, 0x002e}, {0x02e0, 0xffe0, 11, 0x006f, 0x002f}, {0x0320, 0xffe0, 11, 0x0070, 0x0030}, {0x0360, 0xffe0, 11, 0x0071, 0x0031}, {0x03a0, 0xffe0, 11, 0x0072, 0x0032}, {0x03e0, 0xffe0, 11, 0x0073, 0x0033}, {0x0420, 0xffe0, 11, 0x0074, 0x0034}, {0x0460, 0xffe0, 11, 0x0075, 0x0035}, {0x04c0, 0xffc0, 10, 0x0076, 0x0036}, {0x0540, 0xffc0, 10, 0x0077, 0x0037}, {0x05c0, 0xffc0, 10, 0x0078, 0x0038}, {0x0700, 0xff00, 8, 0x0079, 0x0039}, {0x0900, 0xff00, 8, 0x007a, 0x003a}, {0x0b00, 0xff00, 8, 0x007b, 0x003b}, {0x0e00, 0xfe00, 7, 0x007c, 0x003c}, {0x1800, 0xf800, 5, 0x007d, 0x003d}, {0x3000, 0xf000, 4, 0x007e, 0x003e}, {0x6000, 0xe000, 3, 0x007f, 0x003f}, {0x8000, 0x8000, 1, 0x0000, 0x0000}, {0x4000, 0xe000, 3, 0x0001, 0x0041}, {0x2000, 0xf000, 4, 0x0002, 0x0042}, {0x1000, 0xf800, 5, 0x0003, 0x0043}, {0x0c00, 0xfe00, 7, 0x0004, 0x0044}, {0x0a00, 0xff00, 8, 0x0005, 0x0045}, {0x0800, 0xff00, 8, 0x0006, 0x0046}, {0x0600, 0xff00, 8, 0x0007, 0x0047}, {0x0580, 0xffc0, 10, 0x0008, 0x0048}, {0x0500, 0xffc0, 10, 0x0009, 0x0049}, {0x0480, 0xffc0, 10, 0x000a, 0x004a}, {0x0440, 0xffe0, 11, 0x000b, 0x004b}, {0x0400, 0xffe0, 11, 0x000c, 0x004c}, {0x03c0, 0xffe0, 11, 0x000d, 0x004d}, {0x0380, 0xffe0, 11, 0x000e, 0x004e}, {0x0340, 0xffe0, 11, 0x000f, 0x004f}, {0x0300, 0xffe0, 11, 0x0010, 0x0050}, {0x02c0, 0xffe0, 11, 0x0011, 0x0051}, {0x0280, 0xffe0, 11, 0x0012, 0x0052}, {0x0240, 0xffe0, 11, 0x0013, 0x0053}, {0x0200, 0xffe0, 11, 0x0014, 0x0054}, {0x01c0, 0xffe0, 11, 0x0015, 0x0055}, {0x0180, 0xffe0, 11, 0x0016, 0x0056}, {0x0140, 0xffe0, 11, 0x0017, 0x0057}, {0x0100, 0xffe0, 11, 0x0018, 0x0058}, {0x00e0, 0xfff0, 12, 0x0019, 0x0059}, {0x00c0, 0xfff0, 12, 0x001a, 0x005a}, {0x00a0, 0xfff0, 12, 0x001b, 0x005b}, {0x0080, 0xfff0, 12, 0x001c, 0x005c}, {0x0060, 0xfff0, 12, 0x001d, 0x005d}, {0x0040, 0xfff0, 12, 0x001e, 0x005e}, {0x0030, 0xfff8, 13, 0x001f, 0x005f} }; GST_DEBUG_CATEGORY_STATIC (rtph263pay_debug); #define GST_CAT_DEFAULT (rtph263pay_debug) #define GST_RTP_HEADER_LEN 12 enum { PROP_0, PROP_MODE_A_ONLY }; static GstStaticPadTemplate gst_rtp_h263_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h263, " "variant = (string) \"itu\", " "h263version = (string) \"h263\"") ); static GstStaticPadTemplate gst_rtp_h263_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_H263_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"; " "application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"") ); static void gst_rtp_h263_pay_finalize (GObject * object); static gboolean gst_rtp_h263_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static void gst_rtp_h263_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_h263_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_rtp_h263_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static void gst_rtp_h263_pay_boundry_init (GstRtpH263PayBoundry * boundry, guint8 * start, guint8 * end, guint8 sbit, guint8 ebit); static GstRtpH263PayGob *gst_rtp_h263_pay_gob_new (GstRtpH263PayBoundry * boundry, guint gobn); static GstRtpH263PayMB *gst_rtp_h263_pay_mb_new (GstRtpH263PayBoundry * boundry, guint mba); static GstRtpH263PayPackage *gst_rtp_h263_pay_package_new_empty (); static GstRtpH263PayPackage *gst_rtp_h263_pay_package_new (guint8 * start, guint8 * end, guint length, guint8 sbit, guint8 ebit, GstBuffer * outbuf, gboolean marker); static void gst_rtp_h263_pay_mb_destroy (GstRtpH263PayMB * mb); static void gst_rtp_h263_pay_gob_destroy (GstRtpH263PayGob * gob, guint ind); static void gst_rtp_h263_pay_context_destroy (GstRtpH263PayContext * context, guint ind); static void gst_rtp_h263_pay_package_destroy (GstRtpH263PayPackage * pack); GST_BOILERPLATE (GstRtpH263Pay, gst_rtp_h263_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_h263_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_h263_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP H263 packet payloader", "Codec/Payloader/Network/RTP", "Payload-encodes H263 video in RTP packets (RFC 2190)", "Neil Stratford " "Dejan Sakelsak "); } static void gst_rtp_h263_pay_class_init (GstRtpH263PayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_h263_pay_finalize; gstbasertppayload_class->set_caps = gst_rtp_h263_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_h263_pay_handle_buffer; gobject_class->set_property = gst_rtp_h263_pay_set_property; gobject_class->get_property = gst_rtp_h263_pay_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MODE_A_ONLY, g_param_spec_boolean ("modea-only", "Fragment packets in mode A Only", "Disable packetization modes B and C", DEFAULT_MODE_A, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (rtph263pay_debug, "rtph263pay", 0, "H263 RTP Payloader"); } static void gst_rtp_h263_pay_init (GstRtpH263Pay * rtph263pay, GstRtpH263PayClass * klass) { rtph263pay->adapter = gst_adapter_new (); rtph263pay->prop_payload_mode = DEFAULT_MODE_A; } static void gst_rtp_h263_pay_finalize (GObject * object) { GstRtpH263Pay *rtph263pay; rtph263pay = GST_RTP_H263_PAY (object); g_object_unref (rtph263pay->adapter); rtph263pay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean gst_rtp_h263_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; payload->pt = GST_RTP_PAYLOAD_H263; gst_basertppayload_set_options (payload, "video", TRUE, "H263", 90000); res = gst_basertppayload_set_outcaps (payload, NULL); return res; } static void gst_rtp_h263_pay_context_destroy (GstRtpH263PayContext * context, guint ind) { if (!context) return; if (context->gobs) { guint i; for (i = 0; i < format_props[ind][0]; i++) { if (context->gobs[i]) { gst_rtp_h263_pay_gob_destroy (context->gobs[i], ind); } } g_free (context->gobs); } g_free (context); } static void gst_rtp_h263_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpH263Pay *rtph263pay; rtph263pay = GST_RTP_H263_PAY (object); switch (prop_id) { case PROP_MODE_A_ONLY: rtph263pay->prop_payload_mode = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_rtp_h263_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpH263Pay *rtph263pay; rtph263pay = GST_RTP_H263_PAY (object); switch (prop_id) { case PROP_MODE_A_ONLY: g_value_set_boolean (value, rtph263pay->prop_payload_mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstRtpH263PayPackage * gst_rtp_h263_pay_package_new_empty (void) { return (GstRtpH263PayPackage *) g_malloc0 (sizeof (GstRtpH263PayPackage)); } static GstRtpH263PayPackage * gst_rtp_h263_pay_package_new (guint8 * start, guint8 * end, guint length, guint8 sbit, guint8 ebit, GstBuffer * outbuf, gboolean marker) { GstRtpH263PayPackage *package; package = gst_rtp_h263_pay_package_new_empty (); package->payload_start = start; package->payload_end = end; package->payload_len = length; package->sbit = sbit; package->ebit = ebit; package->outbuf = outbuf; package->marker = marker; return package; } static void gst_rtp_h263_pay_package_destroy (GstRtpH263PayPackage * pack) { if (pack) g_free (pack); } static void gst_rtp_h263_pay_boundry_init (GstRtpH263PayBoundry * boundry, guint8 * start, guint8 * end, guint8 sbit, guint8 ebit) { boundry->start = start; boundry->end = end; boundry->sbit = sbit; boundry->ebit = ebit; } static void gst_rtp_h263_pay_splat_header_A (guint8 * header, GstRtpH263PayPackage * package, GstRtpH263PayPic * piclayer) { GstRtpH263PayAHeader *a_header; a_header = (GstRtpH263PayAHeader *) header; a_header->f = 0; a_header->p = 0; a_header->sbit = package->sbit; a_header->ebit = package->ebit; a_header->src = GST_H263_PICTURELAYER_PLSRC (piclayer); a_header->i = GST_H263_PICTURELAYER_PLTYPE (piclayer); a_header->u = GST_H263_PICTURELAYER_PLUMV (piclayer); a_header->s = GST_H263_PICTURELAYER_PLSAC (piclayer); a_header->a = GST_H263_PICTURELAYER_PLAP (piclayer); a_header->r1 = 0; a_header->r2 = 0; a_header->dbq = 0; a_header->trb = 0; a_header->tr = 0; } static void gst_rtp_h263_pay_splat_header_B (guint8 * header, GstRtpH263PayPackage * package, GstRtpH263PayPic * piclayer) { GstRtpH263PayBHeader *b_header; b_header = (GstRtpH263PayBHeader *) header; b_header->f = 1; b_header->p = 0; b_header->sbit = package->sbit; b_header->ebit = package->ebit; b_header->src = GST_H263_PICTURELAYER_PLSRC (piclayer); b_header->quant = package->quant; b_header->gobn = package->gobn; b_header->mba1 = package->mba >> 6; b_header->mba2 = package->mba & 0x003f; b_header->r = 0; b_header->i = GST_H263_PICTURELAYER_PLTYPE (piclayer); b_header->u = GST_H263_PICTURELAYER_PLUMV (piclayer); b_header->s = GST_H263_PICTURELAYER_PLSAC (piclayer); b_header->a = GST_H263_PICTURELAYER_PLAP (piclayer); b_header->hmv11 = 0; b_header->hmv12 = 0; b_header->vmv11 = 0; b_header->vmv12 = 0; b_header->hmv21 = 0; b_header->hmv22 = 0; b_header->vmv21 = 0; if (package->nmvd > 0) { //mvd[0] b_header->hmv11 = (package->mvd[0] & 0x7f) >> 3; b_header->hmv12 = (package->mvd[0] & 0x07); //mvd[1] b_header->vmv11 = (package->mvd[1] & 0x07f) >> 2; b_header->vmv12 = (package->mvd[1] & 0x03); if (package->nmvd == 8) { //mvd[4] b_header->hmv21 = (package->mvd[4] & 0x7f) >> 1; b_header->hmv22 = (package->mvd[4] & 0x01); //mvd[5] b_header->vmv21 = (package->mvd[5] & 0x7f); } } } static gboolean gst_rtp_h263_pay_gobfinder (GstRtpH263Pay * rtph263pay, GstRtpH263PayBoundry * boundry) { guint8 *current; guint range; guint i; current = boundry->end + 1; range = (rtph263pay->data - current) + rtph263pay->available_data; GST_DEBUG ("Searching for next GOB, data:%p, len:%u, payload_len:%p," " current:%p, range:%u", rtph263pay->data, rtph263pay->available_data, boundry->end + 1, current, range); /* If we are past the end, stop */ if (current >= rtph263pay->data + rtph263pay->available_data) return FALSE; for (i = 3; i < range - 3; i++) { if ((current[i] == 0x0) && (current[i + 1] == 0x0) && (current[i + 2] >> 7 == 0x1)) { GST_LOG ("GOB end found at: %p start: %p len: %u", current + i - 1, boundry->end + 1, (guint) (current + i - boundry->end + 2)); gst_rtp_h263_pay_boundry_init (boundry, boundry->end + 1, current + i - 1, 0, 0); return TRUE; } } GST_DEBUG ("Couldn't find any new GBSC in this frame, range:%u", range); gst_rtp_h263_pay_boundry_init (boundry, boundry->end + 1, (guint8 *) (rtph263pay->data + rtph263pay->available_data - 1), 0, 0); return TRUE; } static GstRtpH263PayGob * gst_rtp_h263_pay_gob_new (GstRtpH263PayBoundry * boundry, guint gobn) { GstRtpH263PayGob *gob; gob = (GstRtpH263PayGob *) g_malloc0 (sizeof (GstRtpH263PayGob)); gob->start = boundry->start; gob->end = boundry->end; gob->length = boundry->end - boundry->start + 1; gob->ebit = boundry->ebit; gob->sbit = boundry->sbit; gob->gobn = gobn; gob->quant = 0; gob->macroblocks = NULL; gob->nmacroblocs = 0; return gob; } static void gst_rtp_h263_pay_gob_destroy (GstRtpH263PayGob * gob, guint ind) { if (!gob) return; if (gob->macroblocks) { guint i; for (i = 0; i < gob->nmacroblocs; i++) { gst_rtp_h263_pay_mb_destroy (gob->macroblocks[i]); } g_free (gob->macroblocks); } g_free (gob); } /* * decode MCBPC for I frames and return index in table or -1 if not found */ static gint gst_rtp_h263_pay_decode_mcbpc_I (guint32 value) { gint i; guint16 code; code = value >> 16; GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); for (i = 0; i < MCBPC_I_LEN; i++) { if ((code & mcbpc_I[i][1]) == mcbpc_I[i][0]) { return i; } } GST_WARNING ("Couldn't find code, returning -1"); return -1; } /* * decode MCBPC for P frames and return index in table or -1 if not found */ static gint gst_rtp_h263_pay_decode_mcbpc_P (guint32 value) { gint i; guint16 code; code = value >> 16; GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); for (i = 0; i < MCBPC_P_LEN; i++) { if ((code & mcbpc_P[i][1]) == mcbpc_P[i][0]) { return i; } } GST_WARNING ("Couldn't find code, returning -1"); return -1; } /* * decode CBPY and return index in table or -1 if not found */ static gint gst_rtp_h263_pay_decode_cbpy (guint32 value, const guint8 cbpy_table[16][7]) { gint i; guint8 code; code = value >> 24; GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); for (i = 0; i < CBPY_LEN; i++) { if ((code & cbpy_table[i][1]) == cbpy_table[i][0]) { return i; } } GST_WARNING ("Couldn't find code, returning -1"); return -1; } /* * decode MVD and return index in table or -1 if not found */ static gint gst_rtp_h263_pay_decode_mvd (guint32 value) { gint i; guint16 code; code = value >> 16; GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); for (i = 0; i < MVD_LEN; i++) { if ((code & mvd[i][1]) == mvd[i][0]) { return i; } } GST_WARNING ("Couldn't find code, returning -1"); return -1; } /* * decode TCOEF and return index in table or -1 if not found */ static gint gst_rtp_h263_pay_decode_tcoef (guint32 value) { gint i; guint16 code; code = value >> 16; GST_DEBUG ("value:0x%08x, code:0x%04x", value, code); for (i = 0; i < TCOEF_LEN; i++) { if ((code & tcoef[i][1]) == tcoef[i][0]) { GST_LOG ("tcoef is %d", i); return i; } } GST_WARNING ("Couldn't find code, returning -1"); return -1; } /* * the 32-bit register is like a window that we move right for "move_bits" to get the next v "data" h263 field * "rest_bits" tells how many bits in the "data" byte address are still not used */ static gint gst_rtp_h263_pay_move_window_right (GstRtpH263PayContext * context, guint n, guint rest_bits, guint8 ** orig_data, guint8 ** data_end) { GST_DEBUG ("Moving window: 0x%08x from: %p for %d bits, rest_bits: %d", context->window, context->win_end, n, rest_bits); if (n == 0) return rest_bits; while (n != 0 || context->win_end == ((*data_end) + 1)) { //guint8 a = *data; if (rest_bits == 0) { if (n > 8) { context->window = (context->window << 8) | *context->win_end; n -= 8; } else { context->window = (context->window << n) | (*context->win_end >> (8 - n)); rest_bits = 8 - n; if (rest_bits == 0) context->win_end++; break; } } else { if (n > rest_bits) { context->window = (context-> window << rest_bits) | (*context->win_end & (((guint) pow (2.0, (double) rest_bits)) - 1)); n -= rest_bits; rest_bits = 0; } else { context->window = (context->window << n) | ((*context->win_end & (((guint) pow (2.0, (double) rest_bits)) - 1)) >> (rest_bits - n)); rest_bits -= n; if (rest_bits == 0) context->win_end++; break; } } context->win_end++; } *orig_data = context->win_end - 4; GST_DEBUG ("Window moved to %p with value: 0x%08x and orig_data: %p rest_bits: %d", context->win_end, context->window, *orig_data, rest_bits); return rest_bits; } /* * Find the start of the next MB (end of the current MB) * returns the number of excess bits and stores the end of the MB in end * data must be placed on first MB byte */ static GstRtpH263PayMB * gst_rtp_h263_pay_B_mbfinder (GstRtpH263PayContext * context, GstRtpH263PayGob * gob, GstRtpH263PayMB * macroblock, guint mba) { guint mb_type_index; guint cbpy_type_index; guint tcoef_type_index; GstRtpH263PayMB *mac; GstRtpH263PayBoundry boundry; gst_rtp_h263_pay_boundry_init (&boundry, macroblock->end, macroblock->end, 8 - macroblock->ebit, macroblock->ebit); mac = gst_rtp_h263_pay_mb_new (&boundry, mba); if (mac->sbit == 8) { mac->start++; // mac->end++; mac->sbit = 0; } GST_LOG ("current_pos:%p, end:%p, rest_bits:%d, window:%x", mac->start, mac->end, macroblock->ebit, context->window); GST_LOG ("Current pos after COD: %p", mac->end); if (context->piclayer->ptype_pictype == 0) { //We have an I frame gint i; guint last; guint ind; //Step 2 decode MCBPC I mb_type_index = gst_rtp_h263_pay_decode_mcbpc_I (context->window); GST_DEBUG ("MCBPC index: %d", mb_type_index); if (mb_type_index == -1) { GST_ERROR ("MB index shouldn't be -1 in window: %08x", context->window); return NULL; } mac->ebit = gst_rtp_h263_pay_move_window_right (context, mcbpc_I[mb_type_index][2], mac->ebit, &mac->end, &gob->end); mac->mb_type = mcbpc_I[mb_type_index][5]; if (mb_type_index == 8) { GST_LOG ("Stuffing skipping rest of MB header"); return mac; } //Step 3 decode CBPY I cbpy_type_index = gst_rtp_h263_pay_decode_cbpy (context->window, cbpy_I); GST_DEBUG ("CBPY index: %d", cbpy_type_index); if (cbpy_type_index == -1) { GST_ERROR ("CBPY index shouldn't be -1 in window: %08x", context->window); return NULL; } mac->ebit = gst_rtp_h263_pay_move_window_right (context, cbpy_I[cbpy_type_index][2], mac->ebit, &mac->end, &gob->end); //Step 4 decode rest of MB //MB type 1 and 4 have DQUANT - we store it for packaging purposes if (mcbpc_I[mb_type_index][5] == 4) { GST_DEBUG ("Shifting DQUANT"); mac->quant = (context->window >> 30); mac->ebit = gst_rtp_h263_pay_move_window_right (context, 2, mac->ebit, &mac->end, &gob->end); } //Step 5 go trough the blocks - decode DC and TCOEF last = 0; for (i = 0; i < N_BLOCKS; i++) { GST_DEBUG ("Decoding INTRADC and TCOEF, i:%d", i); mac->ebit = gst_rtp_h263_pay_move_window_right (context, 8, mac->ebit, &mac->end, &gob->end); if (i > 3) { ind = mcbpc_I[mb_type_index][i - 1]; } else { ind = cbpy_I[cbpy_type_index][i + 3]; } if (ind == 1) { while (last == 0) { tcoef_type_index = gst_rtp_h263_pay_decode_tcoef (context->window); GST_DEBUG ("TCOEF index: %d", tcoef_type_index); if (tcoef_type_index == -1) { GST_ERROR ("TCOEF index shouldn't be -1 in window: %08x", context->window); return NULL; } mac->ebit = gst_rtp_h263_pay_move_window_right (context, tcoef[tcoef_type_index][2], mac->ebit, &mac->end, &gob->end); last = tcoef[tcoef_type_index][3]; if (tcoef_type_index == 102) { if ((context->window & 0x80000000) == 0x80000000) last = 1; else last = 0; mac->ebit = gst_rtp_h263_pay_move_window_right (context, 15, mac->ebit, &mac->end, &gob->end); } } last = 0; } } } else { //We have a P frame guint i; guint last; guint ind; //Step 1 check COD GST_DEBUG ("Checking for COD"); if ((context->window & 0x80000000) == 0x80000000) { //The MB is not coded mac->ebit = gst_rtp_h263_pay_move_window_right (context, 1, mac->ebit, &mac->end, &gob->end); GST_DEBUG ("COOOOOOOOOOOD = 1"); return mac; } else { //The MB is coded mac->ebit = gst_rtp_h263_pay_move_window_right (context, 1, mac->ebit, &mac->end, &gob->end); } //Step 2 decode MCBPC P mb_type_index = gst_rtp_h263_pay_decode_mcbpc_P (context->window); GST_DEBUG ("MCBPC index: %d", mb_type_index); if (mb_type_index == -1) { GST_ERROR ("MB index shouldn't be -1 in window: %08x", context->window); return NULL; } mac->ebit = gst_rtp_h263_pay_move_window_right (context, mcbpc_P[mb_type_index][2], mac->ebit, &mac->end, &gob->end); mac->mb_type = mcbpc_P[mb_type_index][5]; if (mb_type_index == 20) { GST_LOG ("Stuffing skipping rest of MB header"); return mac; } //Step 3 decode CBPY P cbpy_type_index = gst_rtp_h263_pay_decode_cbpy (context->window, cbpy_P); GST_DEBUG ("CBPY index: %d", cbpy_type_index); if (cbpy_type_index == -1) { GST_ERROR ("CBPY index shouldn't be -1 in window: %08x", context->window); return NULL; } mac->ebit = gst_rtp_h263_pay_move_window_right (context, cbpy_P[cbpy_type_index][2], mac->ebit, &mac->end, &gob->end); //MB type 1 and 4 have DQUANT - we add it to MB object and jump over if (mcbpc_P[mb_type_index][5] == 4 || mcbpc_P[mb_type_index][5] == 1) { GST_DEBUG ("Shifting DQUANT"); mac->quant = context->window >> 30; mac->ebit = gst_rtp_h263_pay_move_window_right (context, 2, mac->ebit, &mac->end, &gob->end); } //MB types < 3 have MVD1-4 if (mcbpc_P[mb_type_index][5] < 3) { guint nmvd; gint j; nmvd = 2; if (mcbpc_P[mb_type_index][5] == 2) nmvd = 8; for (j = 0; j < nmvd; j++) { guint mvd_type; mvd_type = gst_rtp_h263_pay_decode_mvd (context->window); if (mvd_type == -1) { GST_ERROR ("MVD1-4 index shouldn't be -1 in window: %08x", context->window); return NULL; } //set the MB mvd values mac->mvd[j] = mvd[mvd_type][3]; mac->ebit = gst_rtp_h263_pay_move_window_right (context, mvd[mvd_type][2], mac->ebit, &mac->end, &gob->end); } } //Step 5 go trough the blocks - decode DC and TCOEF last = 0; for (i = 0; i < N_BLOCKS; i++) { //if MB type 3 or 4 then INTRADC coef are present in blocks if (mcbpc_P[mb_type_index][5] > 2) { GST_DEBUG ("INTRADC coef: %d", i); mac->ebit = gst_rtp_h263_pay_move_window_right (context, 8, mac->ebit, &mac->end, &gob->end); } else { GST_DEBUG ("INTRADC coef is not present"); } //check if the block has TCOEF if (i > 3) { ind = mcbpc_P[mb_type_index][i - 1]; } else { if (mcbpc_P[mb_type_index][5] > 2) { ind = cbpy_I[cbpy_type_index][i + 3]; } else { ind = cbpy_P[cbpy_type_index][i + 3]; } } if (ind == 1) { while (last == 0) { tcoef_type_index = gst_rtp_h263_pay_decode_tcoef (context->window); GST_DEBUG ("TCOEF index: %d", tcoef_type_index); if (tcoef_type_index == -1) { GST_ERROR ("TCOEF index shouldn't be -1 in window: %08x", context->window); return NULL; } mac->ebit = gst_rtp_h263_pay_move_window_right (context, tcoef[tcoef_type_index][2], mac->ebit, &mac->end, &gob->end); last = tcoef[tcoef_type_index][3]; if (tcoef_type_index == 102) { if ((context->window & 0x80000000) == 0x80000000) last = 1; else last = 0; mac->ebit = gst_rtp_h263_pay_move_window_right (context, 15, mac->ebit, &mac->end, &gob->end); } } last = 0; } } } mac->length = mac->end - mac->start + 1; return mac; } static GstRtpH263PayMB * gst_rtp_h263_pay_mb_new (GstRtpH263PayBoundry * boundry, guint mba) { GstRtpH263PayMB *mb; gint i; mb = (GstRtpH263PayMB *) g_malloc0 (sizeof (GstRtpH263PayMB)); mb->start = boundry->start; mb->end = boundry->end; mb->length = boundry->end - boundry->start + 1; mb->sbit = boundry->sbit; mb->ebit = boundry->ebit; mb->mba = mba; for (i = 0; i < 5; i++) mb->mvd[i] = 0; return mb; } static void gst_rtp_h263_pay_mb_destroy (GstRtpH263PayMB * mb) { if (!mb) return; g_free (mb); } static GstFlowReturn gst_rtp_h263_pay_push (GstRtpH263Pay * rtph263pay, GstRtpH263PayContext * context, GstRtpH263PayPackage * package) { /* * Splat the payload header values */ guint8 *header; guint8 *payload; GstFlowReturn ret; header = gst_rtp_buffer_get_payload (package->outbuf); payload = header + package->mode; switch (package->mode) { case GST_RTP_H263_PAYLOAD_HEADER_MODE_A: GST_LOG ("Pushing A packet"); gst_rtp_h263_pay_splat_header_A (header, package, context->piclayer); break; case GST_RTP_H263_PAYLOAD_HEADER_MODE_B: GST_LOG ("Pushing B packet"); gst_rtp_h263_pay_splat_header_B (header, package, context->piclayer); break; case GST_RTP_H263_PAYLOAD_HEADER_MODE_C: //gst_rtp_h263_pay_splat_header_C(header, package, context->piclayer); //break; default: return GST_FLOW_ERROR; } /* * Copy the payload data in the buffer */ GST_DEBUG ("Copying memory"); memcpy (payload, (guint8 *) package->payload_start, package->payload_len); /* * timestamp the buffer */ GST_BUFFER_TIMESTAMP (package->outbuf) = rtph263pay->first_ts; gst_rtp_buffer_set_marker (package->outbuf, package->marker); if (package->marker) GST_DEBUG ("Marker set!"); ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtph263pay), package->outbuf); GST_DEBUG ("Package pushed, returning"); gst_rtp_h263_pay_package_destroy (package); return ret; } static GstFlowReturn gst_rtp_h263_pay_A_fragment_push (GstRtpH263Pay * rtph263pay, GstRtpH263PayContext * context, guint first, guint last) { GstRtpH263PayPackage *pack; pack = gst_rtp_h263_pay_package_new_empty (); pack->payload_start = context->gobs[first]->start; pack->sbit = context->gobs[first]->sbit; pack->ebit = context->gobs[last]->ebit; pack->payload_len = (context->gobs[last]->end - context->gobs[first]->start) + 1; pack->marker = FALSE; if (last == context->no_gobs - 1) { pack->marker = TRUE; } pack->gobn = context->gobs[first]->gobn; pack->mode = GST_RTP_H263_PAYLOAD_HEADER_MODE_A; pack->outbuf = gst_rtp_buffer_new_allocate (pack->payload_len + pack->mode, 0, 0); GST_DEBUG ("Sending len:%d data to push function", pack->payload_len); return gst_rtp_h263_pay_push (rtph263pay, context, pack); } static GstFlowReturn gst_rtp_h263_pay_B_fragment_push (GstRtpH263Pay * rtph263pay, GstRtpH263PayContext * context, GstRtpH263PayGob * gob, guint first, guint last, GstRtpH263PayBoundry * boundry) { GstRtpH263PayPackage *pack; guint mv; pack = gst_rtp_h263_pay_package_new_empty (); pack->payload_start = gob->macroblocks[first]->start; pack->sbit = gob->macroblocks[first]->sbit; if (first == 0) { pack->payload_start = boundry->start; pack->sbit = boundry->sbit; pack->quant = gob->quant; } else { pack->quant = gob->macroblocks[first]->quant; } pack->payload_end = gob->macroblocks[last]->end; pack->ebit = gob->macroblocks[last]->ebit; pack->mba = gob->macroblocks[first]->mba; pack->gobn = gob->gobn; pack->mode = GST_RTP_H263_PAYLOAD_HEADER_MODE_B; pack->nmvd = 0; if (gob->macroblocks[first]->mb_type < 3) { if (gob->macroblocks[first]->mb_type == 2) pack->nmvd = 8; else if (gob->macroblocks[first]->mb_type < 2) pack->nmvd = 2; for (mv = 0; mv < pack->nmvd; mv++) pack->mvd[mv] = gob->macroblocks[first]->mvd[mv]; } pack->marker = FALSE; if (last == gob->nmacroblocs - 1) { pack->ebit = 0; } if ((format_props[context->piclayer->ptype_srcformat][0] - 1 == gob->gobn) && (last == gob->nmacroblocs - 1)) { pack->marker = TRUE; } pack->payload_len = pack->payload_end - pack->payload_start + 1; pack->outbuf = gst_rtp_buffer_new_allocate (pack->payload_len + pack->mode, 0, 0); return gst_rtp_h263_pay_push (rtph263pay, context, pack); } static gboolean gst_rtp_h263_pay_mode_B_fragment (GstRtpH263Pay * rtph263pay, GstRtpH263PayContext * context, GstRtpH263PayGob * gob) { /*---------- MODE B MODE FRAGMENTATION ----------*/ GstRtpH263PayMB *mac; guint max_payload_size; GstRtpH263PayBoundry boundry; guint mb; //TODO remove m GstRtpH263PayMB *m; guint first = 0; guint payload_len; max_payload_size = context->mtu - GST_RTP_H263_PAYLOAD_HEADER_MODE_B - GST_RTP_HEADER_LEN; gst_rtp_h263_pay_boundry_init (&boundry, gob->start, gob->start, gob->sbit, 0); gob->macroblocks = (GstRtpH263PayMB **) g_malloc0 (sizeof (GstRtpH263PayMB *) * format_props[context->piclayer->ptype_srcformat][1]); GST_LOG ("GOB isn't PB frame, applying mode B"); //initializing window context->win_end = boundry.end; if (gst_rtp_h263_pay_move_window_right (context, 32, boundry.ebit, &boundry.end, &gob->end) != 0) { GST_ERROR ("The rest of the bits should be 0, exiting, because something bad happend"); gst_adapter_flush (rtph263pay->adapter, rtph263pay->available_data); goto decode_error; } //The first GOB of a frame "has no" actual header - PICTURE header is his header if (gob->gobn == 0) { guint shift; GST_LOG ("Initial GOB"); shift = 43; boundry.ebit = gst_rtp_h263_pay_move_window_right (context, shift, boundry.ebit, &boundry.end, &gob->end); //We need PQUANT for mode B packages - so we store it gob->quant = context->window >> 27; //if PCM == 1, then PSBI is present - header has 51 bits //shift for PQUANT (5) and PCM (1) = 6 bits shift = 6; if (context->cpm == 1) shift += 2; boundry.ebit = gst_rtp_h263_pay_move_window_right (context, shift, boundry.ebit, &boundry.end, &gob->end); GST_DEBUG ("window: 0x%08x", context->window); //Shifting the PEI and PSPARE fields while ((context->window & 0x80000000) == 0x80000000) { boundry.ebit = gst_rtp_h263_pay_move_window_right (context, 9, boundry.ebit, &boundry.end, &gob->end); GST_LOG ("window: 0x%x", context->window); } //shift the last PEI field boundry.ebit = gst_rtp_h263_pay_move_window_right (context, 1, boundry.ebit, &boundry.end, &gob->end); } else { //skipping GOBs 24 header bits + 5 GQUANT guint shift = 24; GST_LOG ("INTER GOB"); //if CPM == 1, there are 2 more bits in the header - GSBI header is 31 bits long if (context->cpm == 1) shift += 2; GST_LOG ("window: 0x%x", context->window); boundry.ebit = gst_rtp_h263_pay_move_window_right (context, shift, boundry.ebit, &boundry.end, &gob->end); //We need GQUANT for mode B packages - so we store it gob->quant = context->window >> 27; shift = 5; boundry.ebit = gst_rtp_h263_pay_move_window_right (context, shift, boundry.ebit, &boundry.end, &gob->end); GST_LOG ("window: 0x%x", context->window); } GST_DEBUG ("GQUANT IS: %08x", gob->quant); // We are on MB layer m = mac = gst_rtp_h263_pay_mb_new (&boundry, 0); for (mb = 0; mb < format_props[context->piclayer->ptype_srcformat][1]; mb++) { GST_DEBUG ("================ START MB %d =================", mb); //Find next macroblock boundaries if (!(mac = gst_rtp_h263_pay_B_mbfinder (context, gob, mac, mb))) { GST_DEBUG ("Error decoding MB - sbit: %d", 8 - m->ebit); GST_ERROR ("Error decoding in GOB"); goto decode_error; } //If mb_type == stuffing, don't increment the mb address if (mac->mb_type == 10) { mb--; continue; } else { gob->nmacroblocs++; } gob->macroblocks[mb] = mac; if (mac->end >= gob->end) { GST_LOG ("No more MBs in this GOB"); if (!mac->ebit) { mac->end--; } gob->end = mac->end; break; } m = mac; GST_DEBUG ("Found MB: mba: %d start: %p end: %p len: %d sbit: %d ebit: %d", mac->mba, mac->start, mac->end, mac->length, mac->sbit, mac->ebit); GST_DEBUG ("================ END MB %d =================", mb); } mb = 0; first = 0; payload_len = boundry.end - boundry.start + 1; GST_DEBUG ("------------------------- NEW PACKAGE ----------------------"); while (mb < gob->nmacroblocs) { if (payload_len + gob->macroblocks[mb]->length < max_payload_size) { //FIXME: payload_len is not the real length -> ignoring sbit/ebit payload_len += gob->macroblocks[mb]->length; mb++; } else { //FIXME: we should include the last few bits of the GOB in the package - do we do that now? //GST_DEBUG ("Pushing GOBS %d to %d because payload size is %d", first, // first == mb - 1, payload_len); if (gst_rtp_h263_pay_B_fragment_push (rtph263pay, context, gob, first, mb - 1, &boundry)) { GST_ERROR ("Oooops, there was an error sending"); return FALSE; } payload_len = 0; first = mb; GST_DEBUG ("------------------------- END PACKAGE ----------------------"); GST_DEBUG ("------------------------- NEW PACKAGE ----------------------"); } } /* Push rest */ GST_DEBUG ("Remainder first: %d, MB: %d", first, mb); if (payload_len != 0) { if (gst_rtp_h263_pay_B_fragment_push (rtph263pay, context, gob, first, mb - 1, &boundry)) { GST_ERROR ("Oooops, there was an error sending!"); return FALSE; } } /*---------- END OF MODE B FRAGMENTATION ----------*/ return TRUE; decode_error: return FALSE; } static GstFlowReturn gst_rtp_h263_send_entire_frame (GstRtpH263Pay * rtph263pay, GstRtpH263PayContext * context) { GstRtpH263PayPackage *pack; pack = gst_rtp_h263_pay_package_new (rtph263pay->data, rtph263pay->data + rtph263pay->available_data, rtph263pay->available_data, 0, 0, NULL, TRUE); pack->mode = GST_RTP_H263_PAYLOAD_HEADER_MODE_A; GST_DEBUG ("Available data: %d", rtph263pay->available_data); pack->outbuf = gst_rtp_buffer_new_allocate (pack->payload_len + GST_RTP_H263_PAYLOAD_HEADER_MODE_A, 0, 0); return gst_rtp_h263_pay_push (rtph263pay, context, pack); } static GstFlowReturn gst_rtp_h263_pay_flush (GstRtpH263Pay * rtph263pay) { /* * FIXME: GSTUF bits are ignored right now, * - not using EBIT/SBIT payload header fields in mode A fragmentation - ffmpeg doesn't need them, but others? */ GstFlowReturn ret; GstRtpH263PayContext *context; gint i; ret = 0; context = (GstRtpH263PayContext *) g_malloc0 (sizeof (GstRtpH263PayContext)); context->mtu = rtph263pay->payload.mtu - (MTU_SECURITY_OFFSET + GST_RTP_HEADER_LEN + GST_RTP_H263_PAYLOAD_HEADER_MODE_C); GST_DEBUG ("MTU: %d", context->mtu); rtph263pay->available_data = gst_adapter_available (rtph263pay->adapter); if (rtph263pay->available_data == 0) { ret = GST_FLOW_RESEND; goto end; } /* Get a pointer to all the data for the frame */ rtph263pay->data = (guint8 *) gst_adapter_peek (rtph263pay->adapter, rtph263pay->available_data); /* Picture header */ context->piclayer = (GstRtpH263PayPic *) rtph263pay->data; if (context->piclayer->ptype_pictype == 0) GST_DEBUG ("We got an I-frame"); else GST_DEBUG ("We got a P-frame"); context->cpm = rtph263pay->data[6] >> 7; GST_DEBUG ("CPM: %d", context->cpm); GST_DEBUG ("Payload length is: %d", rtph263pay->available_data); /* * - MODE A - If normal, I and P frames, -> mode A * - GOB layer fragmentation * - MODE B - If normal, I and P frames, but GOBs > mtu * - MB layer fragmentation * - MODE C - For P frames with PB option, but GOBs > mtu * - MB layer fragmentation */ if (rtph263pay->available_data + GST_RTP_H263_PAYLOAD_HEADER_MODE_A + GST_RTP_HEADER_LEN < context->mtu) { ret = gst_rtp_h263_send_entire_frame (rtph263pay, context); } else { /*---------- FRAGMENTING THE FRAME BECAUSE TOO LARGE TO FIT IN MTU ----------*/ GstRtpH263PayBoundry bound; gint first; guint payload_len; gboolean forcea = FALSE; GST_DEBUG ("Frame too large for MTU"); /* * Let's go trough all the data and fragment it untill end is reached */ gst_rtp_h263_pay_boundry_init (&bound, NULL, rtph263pay->data - 1, 0, 0); context->gobs = (GstRtpH263PayGob **) g_malloc0 (format_props[context-> piclayer->ptype_srcformat][0] * sizeof (GstRtpH263PayGob *)); for (i = 0; i < format_props[context->piclayer->ptype_srcformat][0]; i++) { GST_DEBUG ("Searching for gob %d", i); if (!gst_rtp_h263_pay_gobfinder (rtph263pay, &bound)) { if (i <= 1) { GST_WARNING ("No GOB's were found in data stream! Please enable RTP mode in encoder. Forcing mode A for now."); ret = gst_rtp_h263_send_entire_frame (rtph263pay, context); goto end; } else { /* try to send fragments corresponding to found GOBs */ forcea = TRUE; break; } } context->gobs[i] = gst_rtp_h263_pay_gob_new (&bound, i); //FIXME - encoders may generate an EOS gob that has to be processed GST_DEBUG ("Gob values are: gobn: %d, start: %p len: %d ebit: %d sbit: %d", i, context->gobs[i]->start, context->gobs[i]->length, context->gobs[i]->ebit, context->gobs[i]->sbit); } /* NOTE some places may still assume this to be the max possible */ context->no_gobs = i; GST_DEBUG ("Found %d GOBS of maximum %d", context->no_gobs, format_props[context->piclayer->ptype_srcformat][0]); // Make packages smaller than MTU // A mode // - if ( GOB > MTU) -> B mode || C mode // Push packages first = 0; payload_len = 0; i = 0; while (i < context->no_gobs) { if (context->gobs[i]->length >= context->mtu) { if (payload_len == 0) { GST_DEBUG ("GOB len > MTU"); if (rtph263pay->prop_payload_mode || forcea) { payload_len = context->gobs[i]->length; goto force_a; } if (!context->piclayer->ptype_pbmode) { GST_DEBUG ("MODE B on GOB %d needed", i); if (!gst_rtp_h263_pay_mode_B_fragment (rtph263pay, context, context->gobs[i])) { GST_ERROR ("There was an error fragmenting in mode B"); return GST_FLOW_ERROR; } } else { //IMPLEMENT C mode GST_ERROR ("MODE C on GOB %d needed, but not supported yet", i); /*if(!gst_rtp_h263_pay_mode_C_fragment(rtph263pay, context, context->gobs[i])) { ret = GST_FLOW_OK; GST_ERROR("There was an error fragmenting in mode C"); goto decode_error; } */ goto decode_error; } decode_error: i++; first = i; continue; } else { goto payload_a_push; } } if (payload_len + context->gobs[i]->length < context->mtu) { GST_DEBUG ("GOB %d fills mtu", i); payload_len += context->gobs[i]->length; i++; if (i == context->no_gobs) { GST_DEBUG ("LAST GOB %d", i); goto payload_a_push; } } else { payload_a_push: GST_DEBUG ("Pushing GOBS %d to %d because payload size is %d", first, first == i ? i : i - 1, payload_len); gst_rtp_h263_pay_A_fragment_push (rtph263pay, context, first, first == i ? i : i - 1); payload_len = 0; first = i; } continue; force_a: GST_DEBUG ("Pushing GOBS %d to %d because payload size is %d", first, i, payload_len); gst_rtp_h263_pay_A_fragment_push (rtph263pay, context, first, i); payload_len = 0; i++; first = i; } }/*---------- END OF FRAGMENTATION ----------*/ /* Flush the input buffer data */ end: gst_rtp_h263_pay_context_destroy (context, context->piclayer->ptype_srcformat); gst_adapter_flush (rtph263pay->adapter, rtph263pay->available_data); return ret; } static GstFlowReturn gst_rtp_h263_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) { GstRtpH263Pay *rtph263pay; GstFlowReturn ret; GST_DEBUG ("-------------------- NEW FRAME ---------------"); rtph263pay = GST_RTP_H263_PAY (payload); rtph263pay->first_ts = GST_BUFFER_TIMESTAMP (buffer); /* we always encode and flush a full picture */ gst_adapter_push (rtph263pay->adapter, buffer); ret = gst_rtp_h263_pay_flush (rtph263pay); GST_DEBUG ("-------------------- END FRAME ---------------"); return ret; } gboolean gst_rtp_h263_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtph263pay", GST_RANK_SECONDARY, GST_TYPE_RTP_H263_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpspeexdepay.h0000644000175000017500000000321411671175354017177 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 */ #ifndef __GST_RTP_SPEEX_DEPAY_H__ #define __GST_RTP_SPEEX_DEPAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpSPEEXDepay GstRtpSPEEXDepay; typedef struct _GstRtpSPEEXDepayClass GstRtpSPEEXDepayClass; #define GST_TYPE_RTP_SPEEX_DEPAY \ (gst_rtp_speex_depay_get_type()) #define GST_RTP_SPEEX_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SPEEX_DEPAY,GstRtpSPEEXDepay)) #define GST_RTP_SPEEX_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SPEEX_DEPAY,GstRtpSPEEXDepayClass)) #define GST_IS_RTP_SPEEX_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SPEEX_DEPAY)) #define GST_IS_RTP_SPEEX_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SPEEX_DEPAY)) struct _GstRtpSPEEXDepay { GstBaseRTPDepayload depayload; }; struct _GstRtpSPEEXDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_speex_depay_get_type (void); gboolean gst_rtp_speex_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_SPEEX_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtptheorapay.c0000644000175000017500000006301711677341656017034 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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 #include #include "fnv1hash.h" #include "gstrtptheorapay.h" #define THEORA_ID_LEN 42 GST_DEBUG_CATEGORY_STATIC (rtptheorapay_debug); #define GST_CAT_DEFAULT (rtptheorapay_debug) /* references: * http://svn.xiph.org/trunk/theora/doc/draft-ietf-avt-rtp-theora-01.txt */ static GstStaticPadTemplate gst_rtp_theora_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"THEORA\"" /* All required parameters * * "sampling = (string) { "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCr-4:4:4" } " * "width = (string) [1, 1048561] (multiples of 16) " * "height = (string) [1, 1048561] (multiples of 16) " * "configuration = (string) ANY" */ /* All optional parameters * * "configuration-uri =" * "delivery-method = (string) { inline, in_band, out_band/ } " */ ) ); static GstStaticPadTemplate gst_rtp_theora_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-theora") ); #define DEFAULT_CONFIG_INTERVAL 0 enum { PROP_0, PROP_CONFIG_INTERVAL }; GST_BOILERPLATE (GstRtpTheoraPay, gst_rtp_theora_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static gboolean gst_rtp_theora_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstStateChangeReturn gst_rtp_theora_pay_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_rtp_theora_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); static gboolean gst_rtp_theora_pay_handle_event (GstPad * pad, GstEvent * event); static void gst_rtp_theora_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_theora_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_theora_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_theora_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_theora_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP Theora payloader", "Codec/Payloader/Network/RTP", "Payload-encode Theora video into RTP packets (draft-01 RFC XXXX)", "Wim Taymans "); } static void gst_rtp_theora_pay_class_init (GstRtpTheoraPayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstelement_class->change_state = gst_rtp_theora_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_theora_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_theora_pay_handle_buffer; gstbasertppayload_class->handle_event = gst_rtp_theora_pay_handle_event; gobject_class->set_property = gst_rtp_theora_pay_set_property; gobject_class->get_property = gst_rtp_theora_pay_get_property; GST_DEBUG_CATEGORY_INIT (rtptheorapay_debug, "rtptheorapay", 0, "Theora RTP Payloader"); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CONFIG_INTERVAL, g_param_spec_uint ("config-interval", "Config Send Interval", "Send Config Insertion Interval in seconds (configuration headers " "will be multiplexed in the data stream when detected.) (0 = disabled)", 0, 3600, DEFAULT_CONFIG_INTERVAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); } static void gst_rtp_theora_pay_init (GstRtpTheoraPay * rtptheorapay, GstRtpTheoraPayClass * klass) { rtptheorapay->last_config = GST_CLOCK_TIME_NONE; } static void gst_rtp_theora_pay_clear_packet (GstRtpTheoraPay * rtptheorapay) { if (rtptheorapay->packet) gst_buffer_unref (rtptheorapay->packet); rtptheorapay->packet = NULL; } static void gst_rtp_theora_pay_cleanup (GstRtpTheoraPay * rtptheorapay) { g_list_foreach (rtptheorapay->headers, (GFunc) gst_mini_object_unref, NULL); g_list_free (rtptheorapay->headers); rtptheorapay->headers = NULL; gst_rtp_theora_pay_clear_packet (rtptheorapay); if (rtptheorapay->config_data) g_free (rtptheorapay->config_data); rtptheorapay->config_data = NULL; rtptheorapay->last_config = GST_CLOCK_TIME_NONE; } static gboolean gst_rtp_theora_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstRtpTheoraPay *rtptheorapay; rtptheorapay = GST_RTP_THEORA_PAY (basepayload); rtptheorapay->need_headers = TRUE; return TRUE; } static void gst_rtp_theora_pay_reset_packet (GstRtpTheoraPay * rtptheorapay, guint8 TDT) { guint payload_len; GST_DEBUG_OBJECT (rtptheorapay, "reset packet"); rtptheorapay->payload_pos = 4; payload_len = gst_rtp_buffer_get_payload_len (rtptheorapay->packet); rtptheorapay->payload_left = payload_len - 4; rtptheorapay->payload_duration = 0; rtptheorapay->payload_F = 0; rtptheorapay->payload_TDT = TDT; rtptheorapay->payload_pkts = 0; } static void gst_rtp_theora_pay_init_packet (GstRtpTheoraPay * rtptheorapay, guint8 TDT, GstClockTime timestamp) { GST_DEBUG_OBJECT (rtptheorapay, "starting new packet, TDT: %d", TDT); if (rtptheorapay->packet) gst_buffer_unref (rtptheorapay->packet); /* new packet allocate max packet size */ rtptheorapay->packet = gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU (rtptheorapay), 0, 0); gst_rtp_theora_pay_reset_packet (rtptheorapay, TDT); GST_BUFFER_TIMESTAMP (rtptheorapay->packet) = timestamp; } static GstFlowReturn gst_rtp_theora_pay_flush_packet (GstRtpTheoraPay * rtptheorapay) { GstFlowReturn ret; guint8 *payload; guint hlen; /* check for empty packet */ if (!rtptheorapay->packet || rtptheorapay->payload_pos <= 4) return GST_FLOW_OK; GST_DEBUG_OBJECT (rtptheorapay, "flushing packet"); /* fix header */ payload = gst_rtp_buffer_get_payload (rtptheorapay->packet); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | F |TDT|# pkts.| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * F: Fragment type (0=none, 1=start, 2=cont, 3=end) * TDT: Theora data type (0=theora, 1=config, 2=comment, 3=reserved) * pkts: number of packets. */ payload[0] = (rtptheorapay->payload_ident >> 16) & 0xff; payload[1] = (rtptheorapay->payload_ident >> 8) & 0xff; payload[2] = (rtptheorapay->payload_ident) & 0xff; payload[3] = (rtptheorapay->payload_F & 0x3) << 6 | (rtptheorapay->payload_TDT & 0x3) << 4 | (rtptheorapay->payload_pkts & 0xf); /* shrink the buffer size to the last written byte */ hlen = gst_rtp_buffer_calc_header_len (0); GST_BUFFER_SIZE (rtptheorapay->packet) = hlen + rtptheorapay->payload_pos; GST_BUFFER_DURATION (rtptheorapay->packet) = rtptheorapay->payload_duration; /* push, this gives away our ref to the packet, so clear it. */ ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtptheorapay), rtptheorapay->packet); rtptheorapay->packet = NULL; return ret; } static gboolean gst_rtp_theora_pay_finish_headers (GstBaseRTPPayload * basepayload) { GstRtpTheoraPay *rtptheorapay = GST_RTP_THEORA_PAY (basepayload); GList *walk; guint length, size, n_headers, configlen, extralen; gchar *wstr, *hstr, *configuration; guint8 *data, *config; guint32 ident; gboolean res; GST_DEBUG_OBJECT (rtptheorapay, "finish headers"); if (!rtptheorapay->headers) { GST_DEBUG_OBJECT (rtptheorapay, "We need 2 headers but have none"); goto no_headers; } /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of packed headers | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Packed header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | .... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * We only construct a config containing 1 packed header like this: * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | length .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | n. of headers | length1 | length2 .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Identification Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. | Comment Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Comment Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Setup Header .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ................................................................. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * .. Setup Header | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ /* we need 4 bytes for the number of headers (which is always 1), 3 bytes for * the ident, 2 bytes for length, 1 byte for n. of headers. */ size = 4 + 3 + 2 + 1; /* count the size of the headers first and update the hash */ length = 0; n_headers = 0; ident = fnv1_hash_32_new (); extralen = 1; for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); guint bsize; bsize = GST_BUFFER_SIZE (buf); length += bsize; n_headers++; /* count number of bytes needed for length fields, we don't need this for * the last header. */ if (g_list_next (walk)) { do { size++; extralen++; bsize >>= 7; } while (bsize); } /* update hash */ ident = fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); } /* packet length is header size + packet length */ configlen = size + length; config = data = g_malloc (configlen); /* number of packed headers, we only pack 1 header */ data[0] = 0; data[1] = 0; data[2] = 0; data[3] = 1; ident = fnv1_hash_32_to_24 (ident); rtptheorapay->payload_ident = ident; GST_DEBUG_OBJECT (rtptheorapay, "ident 0x%08x", ident); /* take lower 3 bytes */ data[4] = (ident >> 16) & 0xff; data[5] = (ident >> 8) & 0xff; data[6] = ident & 0xff; /* store length of all theora headers */ data[7] = ((length) >> 8) & 0xff; data[8] = (length) & 0xff; /* store number of headers minus one. */ data[9] = n_headers - 1; data += 10; /* store length for each header */ for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); guint bsize, size, temp; guint flag; /* only need to store the length when it's not the last header */ if (!g_list_next (walk)) break; bsize = GST_BUFFER_SIZE (buf); /* calc size */ size = 0; do { size++; bsize >>= 7; } while (bsize); temp = size; bsize = GST_BUFFER_SIZE (buf); /* write the size backwards */ flag = 0; while (size) { size--; data[size] = (bsize & 0x7f) | flag; bsize >>= 7; flag = 0x80; } data += temp; } /* copy header data */ for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); data += GST_BUFFER_SIZE (buf); } /* serialize to base64 */ configuration = g_base64_encode (config, configlen); /* store for later re-sending */ rtptheorapay->config_size = configlen - 4 - 3 - 2; rtptheorapay->config_data = g_malloc (rtptheorapay->config_size); rtptheorapay->config_extra_len = extralen; memcpy (rtptheorapay->config_data, config + 4 + 3 + 2, rtptheorapay->config_size); g_free (config); /* configure payloader settings */ wstr = g_strdup_printf ("%d", rtptheorapay->width); hstr = g_strdup_printf ("%d", rtptheorapay->height); gst_basertppayload_set_options (basepayload, "video", TRUE, "THEORA", 90000); res = gst_basertppayload_set_outcaps (basepayload, "sampling", G_TYPE_STRING, "YCbCr-4:2:0", "width", G_TYPE_STRING, wstr, "height", G_TYPE_STRING, hstr, "configuration", G_TYPE_STRING, configuration, "delivery-method", G_TYPE_STRING, "inline", /* don't set the other defaults */ NULL); g_free (wstr); g_free (hstr); g_free (configuration); return res; /* ERRORS */ no_headers: { GST_DEBUG_OBJECT (rtptheorapay, "finish headers"); return FALSE; } } static gboolean gst_rtp_theora_pay_parse_id (GstBaseRTPPayload * basepayload, guint8 * data, guint size) { GstRtpTheoraPay *rtptheorapay; gint width, height; rtptheorapay = GST_RTP_THEORA_PAY (basepayload); if (G_UNLIKELY (size < 42)) goto too_short; if (G_UNLIKELY (memcmp (data, "\200theora", 7))) goto invalid_start; data += 7; if (G_UNLIKELY (data[0] != 3)) goto invalid_version; if (G_UNLIKELY (data[1] != 2)) goto invalid_version; data += 3; width = GST_READ_UINT16_BE (data) << 4; data += 2; height = GST_READ_UINT16_BE (data) << 4; data += 2; /* FIXME, parse pixel format */ /* store values */ rtptheorapay->width = width; rtptheorapay->height = height; return TRUE; /* ERRORS */ too_short: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, (NULL), ("Identification packet is too short, need at least 42, got %d", size)); return FALSE; } invalid_start: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, (NULL), ("Invalid header start in identification packet")); return FALSE; } invalid_version: { GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, (NULL), ("Invalid version")); return FALSE; } } static GstFlowReturn gst_rtp_theora_pay_payload_buffer (GstRtpTheoraPay * rtptheorapay, guint8 TDT, guint8 * data, guint size, GstClockTime timestamp, GstClockTime duration, guint not_in_length) { GstFlowReturn ret = GST_FLOW_OK; guint newsize; guint packet_len; GstClockTime newduration; gboolean flush; guint plen; guint8 *ppos, *payload; gboolean fragmented; /* size increases with packet length and 2 bytes size eader. */ newduration = rtptheorapay->payload_duration; if (duration != GST_CLOCK_TIME_NONE) newduration += duration; newsize = rtptheorapay->payload_pos + 2 + size; packet_len = gst_rtp_buffer_calc_packet_len (newsize, 0, 0); /* check buffer filled against length and max latency */ flush = gst_basertppayload_is_filled (GST_BASE_RTP_PAYLOAD (rtptheorapay), packet_len, newduration); /* we can store up to 15 theora packets in one RTP packet. */ flush |= (rtptheorapay->payload_pkts == 15); /* flush if we have a new TDT */ if (rtptheorapay->packet) flush |= (rtptheorapay->payload_TDT != TDT); if (flush) ret = gst_rtp_theora_pay_flush_packet (rtptheorapay); /* create new packet if we must */ if (!rtptheorapay->packet) { gst_rtp_theora_pay_init_packet (rtptheorapay, TDT, timestamp); } payload = gst_rtp_buffer_get_payload (rtptheorapay->packet); ppos = payload + rtptheorapay->payload_pos; fragmented = FALSE; /* put buffer in packet, it either fits completely or needs to be fragmented * over multiple RTP packets. */ do { plen = MIN (rtptheorapay->payload_left - 2, size); GST_DEBUG_OBJECT (rtptheorapay, "append %u bytes", plen); /* data is copied in the payload with a 2 byte length header */ ppos[0] = ((plen - not_in_length) >> 8) & 0xff; ppos[1] = ((plen - not_in_length) & 0xff); if (plen) memcpy (&ppos[2], data, plen); /* only first (only) configuration cuts length field */ /* NOTE: spec (if any) is not clear on this ... */ not_in_length = 0; size -= plen; data += plen; rtptheorapay->payload_pos += plen + 2; rtptheorapay->payload_left -= plen + 2; if (fragmented) { if (size == 0) /* last fragment, set F to 0x3. */ rtptheorapay->payload_F = 0x3; else /* fragment continues, set F to 0x2. */ rtptheorapay->payload_F = 0x2; } else { if (size > 0) { /* fragmented packet starts, set F to 0x1, mark ourselves as * fragmented. */ rtptheorapay->payload_F = 0x1; fragmented = TRUE; } } if (fragmented) { /* fragmented packets are always flushed and have ptks of 0 */ rtptheorapay->payload_pkts = 0; ret = gst_rtp_theora_pay_flush_packet (rtptheorapay); if (size > 0) { /* start new packet and get pointers. TDT stays the same. */ gst_rtp_theora_pay_init_packet (rtptheorapay, rtptheorapay->payload_TDT, timestamp); payload = gst_rtp_buffer_get_payload (rtptheorapay->packet); ppos = payload + rtptheorapay->payload_pos; } } else { /* unfragmented packet, update stats for next packet, size == 0 and we * exit the while loop */ rtptheorapay->payload_pkts++; if (duration != GST_CLOCK_TIME_NONE) rtptheorapay->payload_duration += duration; } } while (size); return ret; } static GstFlowReturn gst_rtp_theora_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpTheoraPay *rtptheorapay; GstFlowReturn ret; guint size; guint8 *data; GstClockTime duration, timestamp; guint8 TDT; gboolean keyframe = FALSE; rtptheorapay = GST_RTP_THEORA_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); duration = GST_BUFFER_DURATION (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); GST_DEBUG_OBJECT (rtptheorapay, "size %u, duration %" GST_TIME_FORMAT, size, GST_TIME_ARGS (duration)); if (G_UNLIKELY (size > 0xffff)) goto wrong_size; /* find packet type */ if (size == 0) { TDT = 0; keyframe = FALSE; } else if (data[0] & 0x80) { /* header */ if (data[0] == 0x80) { /* identification, we need to parse this in order to get the clock rate. */ if (G_UNLIKELY (!gst_rtp_theora_pay_parse_id (basepayload, data, size))) goto parse_id_failed; TDT = 1; } else if (data[0] == 0x81) { /* comment */ TDT = 2; } else if (data[0] == 0x82) { /* setup */ TDT = 1; } else goto unknown_header; } else { /* data */ TDT = 0; keyframe = ((data[0] & 0x40) == 0); } if (rtptheorapay->need_headers) { /* we need to collect the headers and construct a config string from them */ if (TDT != 0) { GST_DEBUG_OBJECT (rtptheorapay, "collecting header, buffer %p", buffer); /* append header to the list of headers */ rtptheorapay->headers = g_list_append (rtptheorapay->headers, buffer); ret = GST_FLOW_OK; goto done; } else { if (!gst_rtp_theora_pay_finish_headers (basepayload)) goto header_error; rtptheorapay->need_headers = FALSE; } } /* there is a config request, see if we need to insert it */ if (keyframe && (rtptheorapay->config_interval > 0) && rtptheorapay->config_data) { gboolean send_config = FALSE; if (rtptheorapay->last_config != -1) { guint64 diff; GST_LOG_OBJECT (rtptheorapay, "now %" GST_TIME_FORMAT ", last VOP-I %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), GST_TIME_ARGS (rtptheorapay->last_config)); /* calculate diff between last config in milliseconds */ if (timestamp > rtptheorapay->last_config) { diff = timestamp - rtptheorapay->last_config; } else { diff = 0; } GST_DEBUG_OBJECT (rtptheorapay, "interval since last config %" GST_TIME_FORMAT, GST_TIME_ARGS (diff)); /* bigger than interval, queue config */ /* FIXME should convert timestamps to running time */ if (GST_TIME_AS_SECONDS (diff) >= rtptheorapay->config_interval) { GST_DEBUG_OBJECT (rtptheorapay, "time to send config"); send_config = TRUE; } } else { /* no known previous config time, send now */ GST_DEBUG_OBJECT (rtptheorapay, "no previous config time, send now"); send_config = TRUE; } if (send_config) { /* we need to send config now first */ /* different TDT type forces flush */ gst_rtp_theora_pay_payload_buffer (rtptheorapay, 1, rtptheorapay->config_data, rtptheorapay->config_size, timestamp, GST_CLOCK_TIME_NONE, rtptheorapay->config_extra_len); if (timestamp != -1) { rtptheorapay->last_config = timestamp; } } } ret = gst_rtp_theora_pay_payload_buffer (rtptheorapay, TDT, data, size, timestamp, duration, 0); gst_buffer_unref (buffer); done: return ret; /* ERRORS */ wrong_size: { GST_ELEMENT_WARNING (rtptheorapay, STREAM, DECODE, ("Invalid packet size (%d <= 0xffff)", size), (NULL)); gst_buffer_unref (buffer); return GST_FLOW_OK; } parse_id_failed: { gst_buffer_unref (buffer); return GST_FLOW_ERROR; } unknown_header: { GST_ELEMENT_WARNING (rtptheorapay, STREAM, DECODE, (NULL), ("Ignoring unknown header received")); gst_buffer_unref (buffer); return GST_FLOW_OK; } header_error: { GST_ELEMENT_WARNING (rtptheorapay, STREAM, DECODE, (NULL), ("Error initializing header config")); gst_buffer_unref (buffer); return GST_FLOW_OK; } } static gboolean gst_rtp_theora_pay_handle_event (GstPad * pad, GstEvent * event) { GstRtpTheoraPay *rtptheorapay = GST_RTP_THEORA_PAY (GST_PAD_PARENT (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_rtp_theora_pay_clear_packet (rtptheorapay); break; default: break; } /* false to let parent handle event as well */ return FALSE; } static GstStateChangeReturn gst_rtp_theora_pay_change_state (GstElement * element, GstStateChange transition) { GstRtpTheoraPay *rtptheorapay; GstStateChangeReturn ret; rtptheorapay = GST_RTP_THEORA_PAY (element); switch (transition) { default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_theora_pay_cleanup (rtptheorapay); break; default: break; } return ret; } static void gst_rtp_theora_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpTheoraPay *rtptheorapay; rtptheorapay = GST_RTP_THEORA_PAY (object); switch (prop_id) { case PROP_CONFIG_INTERVAL: rtptheorapay->config_interval = g_value_get_uint (value); break; default: break; } } static void gst_rtp_theora_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRtpTheoraPay *rtptheorapay; rtptheorapay = GST_RTP_THEORA_PAY (object); switch (prop_id) { case PROP_CONFIG_INTERVAL: g_value_set_uint (value, rtptheorapay->config_interval); break; default: break; } } gboolean gst_rtp_theora_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtptheorapay", GST_RANK_SECONDARY, GST_TYPE_RTP_THEORA_PAY); } gst-plugins-good-0.10.31/gst/rtp/Makefile.in0000644000175000017500000036007111720560235015456 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/rtp DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstrtp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstrtp_la_OBJECTS = libgstrtp_la-fnv1hash.lo \ libgstrtp_la-gstrtp.lo libgstrtp_la-gstrtpchannels.lo \ libgstrtp_la-gstrtpdepay.lo libgstrtp_la-gstrtpac3depay.lo \ libgstrtp_la-gstrtpac3pay.lo libgstrtp_la-gstrtpbvdepay.lo \ libgstrtp_la-gstrtpbvpay.lo libgstrtp_la-gstrtpceltdepay.lo \ libgstrtp_la-gstrtpceltpay.lo libgstrtp_la-gstrtpdvdepay.lo \ libgstrtp_la-gstrtpdvpay.lo libgstrtp_la-gstrtpgstdepay.lo \ libgstrtp_la-gstrtpgstpay.lo libgstrtp_la-gstrtpilbcdepay.lo \ libgstrtp_la-gstrtpilbcpay.lo libgstrtp_la-gstrtpmpadepay.lo \ libgstrtp_la-gstrtpmpapay.lo \ libgstrtp_la-gstrtpmparobustdepay.lo \ libgstrtp_la-gstrtpmpvdepay.lo libgstrtp_la-gstrtpmpvpay.lo \ libgstrtp_la-gstrtppcmadepay.lo \ libgstrtp_la-gstrtppcmudepay.lo libgstrtp_la-gstrtppcmupay.lo \ libgstrtp_la-gstrtppcmapay.lo libgstrtp_la-gstrtpg722depay.lo \ libgstrtp_la-gstrtpg722pay.lo libgstrtp_la-gstrtpg723depay.lo \ libgstrtp_la-gstrtpg723pay.lo libgstrtp_la-gstrtpg726pay.lo \ libgstrtp_la-gstrtpg726depay.lo libgstrtp_la-gstrtpg729pay.lo \ libgstrtp_la-gstrtpg729depay.lo libgstrtp_la-gstrtpgsmdepay.lo \ libgstrtp_la-gstrtpgsmpay.lo libgstrtp_la-gstrtpamrdepay.lo \ libgstrtp_la-gstrtpamrpay.lo libgstrtp_la-gstrtph263pdepay.lo \ libgstrtp_la-gstrtph263ppay.lo libgstrtp_la-gstrtph263depay.lo \ libgstrtp_la-gstrtph263pay.lo libgstrtp_la-gstrtph264depay.lo \ libgstrtp_la-gstrtph264pay.lo libgstrtp_la-gstrtpj2kdepay.lo \ libgstrtp_la-gstrtpj2kpay.lo libgstrtp_la-gstrtpjpegdepay.lo \ libgstrtp_la-gstrtpjpegpay.lo libgstrtp_la-gstrtpL16depay.lo \ libgstrtp_la-gstrtpL16pay.lo libgstrtp_la-gstasteriskh263.lo \ libgstrtp_la-gstrtpmp1sdepay.lo \ libgstrtp_la-gstrtpmp2tdepay.lo libgstrtp_la-gstrtpmp2tpay.lo \ libgstrtp_la-gstrtpmp4vdepay.lo libgstrtp_la-gstrtpmp4vpay.lo \ libgstrtp_la-gstrtpmp4gdepay.lo libgstrtp_la-gstrtpmp4gpay.lo \ libgstrtp_la-gstrtpmp4adepay.lo libgstrtp_la-gstrtpmp4apay.lo \ libgstrtp_la-gstrtpqcelpdepay.lo \ libgstrtp_la-gstrtpqdmdepay.lo libgstrtp_la-gstrtpsirenpay.lo \ libgstrtp_la-gstrtpsirendepay.lo \ libgstrtp_la-gstrtpspeexdepay.lo \ libgstrtp_la-gstrtpspeexpay.lo libgstrtp_la-gstrtpsv3vdepay.lo \ libgstrtp_la-gstrtptheoradepay.lo \ libgstrtp_la-gstrtptheorapay.lo \ libgstrtp_la-gstrtpvorbisdepay.lo \ libgstrtp_la-gstrtpvorbispay.lo \ libgstrtp_la-gstrtpvrawdepay.lo libgstrtp_la-gstrtpvrawpay.lo libgstrtp_la_OBJECTS = $(am_libgstrtp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstrtp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstrtp_la_CFLAGS) $(CFLAGS) \ $(libgstrtp_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstrtp_la_SOURCES) DIST_SOURCES = $(libgstrtp_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstrtp.la libgstrtp_la_SOURCES = \ fnv1hash.c \ gstrtp.c \ gstrtpchannels.c \ gstrtpdepay.c \ gstrtpac3depay.c \ gstrtpac3pay.c \ gstrtpbvdepay.c \ gstrtpbvpay.c \ gstrtpceltdepay.c \ gstrtpceltpay.c \ gstrtpdvdepay.c \ gstrtpdvpay.c \ gstrtpgstdepay.c \ gstrtpgstpay.c \ gstrtpilbcdepay.c \ gstrtpilbcpay.c \ gstrtpmpadepay.c \ gstrtpmpapay.c \ gstrtpmparobustdepay.c \ gstrtpmpvdepay.c \ gstrtpmpvpay.c \ gstrtppcmadepay.c \ gstrtppcmudepay.c \ gstrtppcmupay.c \ gstrtppcmapay.c \ gstrtpg722depay.c \ gstrtpg722pay.c \ gstrtpg723depay.c \ gstrtpg723pay.c \ gstrtpg726pay.c \ gstrtpg726depay.c \ gstrtpg729pay.c \ gstrtpg729depay.c \ gstrtpgsmdepay.c \ gstrtpgsmpay.c \ gstrtpamrdepay.c \ gstrtpamrpay.c \ gstrtph263pdepay.c \ gstrtph263ppay.c \ gstrtph263depay.c \ gstrtph263pay.c \ gstrtph264depay.c \ gstrtph264pay.c \ gstrtpj2kdepay.c \ gstrtpj2kpay.c \ gstrtpjpegdepay.c \ gstrtpjpegpay.c \ gstrtpL16depay.c \ gstrtpL16pay.c \ gstasteriskh263.c \ gstrtpmp1sdepay.c \ gstrtpmp2tdepay.c \ gstrtpmp2tpay.c \ gstrtpmp4vdepay.c \ gstrtpmp4vpay.c \ gstrtpmp4gdepay.c \ gstrtpmp4gpay.c \ gstrtpmp4adepay.c \ gstrtpmp4apay.c \ gstrtpqcelpdepay.c \ gstrtpqdmdepay.c \ gstrtpsirenpay.c \ gstrtpsirendepay.c \ gstrtpspeexdepay.c \ gstrtpspeexpay.c \ gstrtpsv3vdepay.c \ gstrtptheoradepay.c \ gstrtptheorapay.c \ gstrtpvorbisdepay.c \ gstrtpvorbispay.c \ gstrtpvrawdepay.c \ gstrtpvrawpay.c @HAVE_WINSOCK2_H_FALSE@WINSOCK2_LIBS = @HAVE_WINSOCK2_H_TRUE@WINSOCK2_LIBS = -lws2_32 libgstrtp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstrtp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ \ -lgstpbutils-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) \ $(WINSOCK2_LIBS) $(LIBM) libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstrtp_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = \ fnv1hash.h \ gstrtpchannels.h \ gstrtpL16depay.h \ gstrtpL16pay.h \ gstrtpac3depay.h \ gstrtpac3pay.h \ gstrtpbvdepay.h \ gstrtpbvpay.h \ gstrtpceltpay.h \ gstrtpceltdepay.h \ gstrtpdvdepay.h \ gstrtpdvpay.h \ gstrtpamrdepay.h \ gstrtpamrpay.h \ gstrtpgstdepay.h \ gstrtpgstpay.h \ gstrtpilbcdepay.h \ gstrtpilbcpay.h \ gstrtppcmadepay.h \ gstrtppcmudepay.h \ gstrtppcmupay.h \ gstrtppcmapay.h \ gstrtpg722depay.h \ gstrtpg722pay.h \ gstrtpg723depay.h \ gstrtpg723pay.h \ gstrtpg726depay.h \ gstrtpg726pay.h \ gstrtpg729depay.h \ gstrtpg729pay.h \ gstrtpgsmdepay.h \ gstrtpgsmpay.h \ gstrtpmpadepay.h \ gstrtpmparobustdepay.h \ gstrtpmpapay.h \ gstrtpmpvdepay.h \ gstrtpmpvpay.h \ gstrtph263pdepay.h \ gstrtph263ppay.h \ gstrtph263depay.h \ gstrtph263pay.h \ gstrtph264depay.h \ gstrtph264pay.h \ gstrtpj2kdepay.h \ gstrtpj2kpay.h \ gstrtpjpegdepay.h \ gstrtpjpegpay.h \ gstrtpmp1sdepay.h \ gstrtpmp2tdepay.h \ gstrtpmp2tpay.h \ gstrtpmp4vdepay.h \ gstrtpmp4vpay.h \ gstrtpmp4gdepay.h \ gstrtpmp4gpay.h \ gstrtpmp4adepay.h \ gstrtpmp4apay.h \ gstrtpdepay.h \ gstasteriskh263.h \ gstrtpqcelpdepay.h \ gstrtpqdmdepay.h \ gstrtpsirenpay.h \ gstrtpsirendepay.h \ gstrtpspeexdepay.h \ gstrtpspeexpay.h \ gstrtpsv3vdepay.h \ gstrtptheoradepay.h \ gstrtptheorapay.h \ gstrtpvorbisdepay.h \ gstrtpvorbispay.h \ gstrtpvrawdepay.h \ gstrtpvrawpay.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/rtp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/rtp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstrtp.la: $(libgstrtp_la_OBJECTS) $(libgstrtp_la_DEPENDENCIES) $(EXTRA_libgstrtp_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstrtp_la_LINK) -rpath $(plugindir) $(libgstrtp_la_OBJECTS) $(libgstrtp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-fnv1hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstasteriskh263.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpL16depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpL16pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpac3depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpac3pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpamrpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpbvpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpceltpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpchannels.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpdvpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg722depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg722pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg723depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg723pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg726depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg726pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg729depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpg729pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpgstpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph263ppay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph264depay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtph264pay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpapay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmapay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtppcmupay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtptheorapay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstrtp_la-fnv1hash.lo: fnv1hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-fnv1hash.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-fnv1hash.Tpo -c -o libgstrtp_la-fnv1hash.lo `test -f 'fnv1hash.c' || echo '$(srcdir)/'`fnv1hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-fnv1hash.Tpo $(DEPDIR)/libgstrtp_la-fnv1hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fnv1hash.c' object='libgstrtp_la-fnv1hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-fnv1hash.lo `test -f 'fnv1hash.c' || echo '$(srcdir)/'`fnv1hash.c libgstrtp_la-gstrtp.lo: gstrtp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtp.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtp.Tpo -c -o libgstrtp_la-gstrtp.lo `test -f 'gstrtp.c' || echo '$(srcdir)/'`gstrtp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtp.Tpo $(DEPDIR)/libgstrtp_la-gstrtp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtp.c' object='libgstrtp_la-gstrtp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtp.lo `test -f 'gstrtp.c' || echo '$(srcdir)/'`gstrtp.c libgstrtp_la-gstrtpchannels.lo: gstrtpchannels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpchannels.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpchannels.Tpo -c -o libgstrtp_la-gstrtpchannels.lo `test -f 'gstrtpchannels.c' || echo '$(srcdir)/'`gstrtpchannels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpchannels.Tpo $(DEPDIR)/libgstrtp_la-gstrtpchannels.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpchannels.c' object='libgstrtp_la-gstrtpchannels.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpchannels.lo `test -f 'gstrtpchannels.c' || echo '$(srcdir)/'`gstrtpchannels.c libgstrtp_la-gstrtpdepay.lo: gstrtpdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpdepay.Tpo -c -o libgstrtp_la-gstrtpdepay.lo `test -f 'gstrtpdepay.c' || echo '$(srcdir)/'`gstrtpdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdepay.c' object='libgstrtp_la-gstrtpdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpdepay.lo `test -f 'gstrtpdepay.c' || echo '$(srcdir)/'`gstrtpdepay.c libgstrtp_la-gstrtpac3depay.lo: gstrtpac3depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpac3depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpac3depay.Tpo -c -o libgstrtp_la-gstrtpac3depay.lo `test -f 'gstrtpac3depay.c' || echo '$(srcdir)/'`gstrtpac3depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpac3depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpac3depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpac3depay.c' object='libgstrtp_la-gstrtpac3depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpac3depay.lo `test -f 'gstrtpac3depay.c' || echo '$(srcdir)/'`gstrtpac3depay.c libgstrtp_la-gstrtpac3pay.lo: gstrtpac3pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpac3pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpac3pay.Tpo -c -o libgstrtp_la-gstrtpac3pay.lo `test -f 'gstrtpac3pay.c' || echo '$(srcdir)/'`gstrtpac3pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpac3pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpac3pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpac3pay.c' object='libgstrtp_la-gstrtpac3pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpac3pay.lo `test -f 'gstrtpac3pay.c' || echo '$(srcdir)/'`gstrtpac3pay.c libgstrtp_la-gstrtpbvdepay.lo: gstrtpbvdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpbvdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Tpo -c -o libgstrtp_la-gstrtpbvdepay.lo `test -f 'gstrtpbvdepay.c' || echo '$(srcdir)/'`gstrtpbvdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpbvdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbvdepay.c' object='libgstrtp_la-gstrtpbvdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpbvdepay.lo `test -f 'gstrtpbvdepay.c' || echo '$(srcdir)/'`gstrtpbvdepay.c libgstrtp_la-gstrtpbvpay.lo: gstrtpbvpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpbvpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpbvpay.Tpo -c -o libgstrtp_la-gstrtpbvpay.lo `test -f 'gstrtpbvpay.c' || echo '$(srcdir)/'`gstrtpbvpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpbvpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpbvpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpbvpay.c' object='libgstrtp_la-gstrtpbvpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpbvpay.lo `test -f 'gstrtpbvpay.c' || echo '$(srcdir)/'`gstrtpbvpay.c libgstrtp_la-gstrtpceltdepay.lo: gstrtpceltdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpceltdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Tpo -c -o libgstrtp_la-gstrtpceltdepay.lo `test -f 'gstrtpceltdepay.c' || echo '$(srcdir)/'`gstrtpceltdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpceltdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpceltdepay.c' object='libgstrtp_la-gstrtpceltdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpceltdepay.lo `test -f 'gstrtpceltdepay.c' || echo '$(srcdir)/'`gstrtpceltdepay.c libgstrtp_la-gstrtpceltpay.lo: gstrtpceltpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpceltpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpceltpay.Tpo -c -o libgstrtp_la-gstrtpceltpay.lo `test -f 'gstrtpceltpay.c' || echo '$(srcdir)/'`gstrtpceltpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpceltpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpceltpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpceltpay.c' object='libgstrtp_la-gstrtpceltpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpceltpay.lo `test -f 'gstrtpceltpay.c' || echo '$(srcdir)/'`gstrtpceltpay.c libgstrtp_la-gstrtpdvdepay.lo: gstrtpdvdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpdvdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Tpo -c -o libgstrtp_la-gstrtpdvdepay.lo `test -f 'gstrtpdvdepay.c' || echo '$(srcdir)/'`gstrtpdvdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpdvdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdvdepay.c' object='libgstrtp_la-gstrtpdvdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpdvdepay.lo `test -f 'gstrtpdvdepay.c' || echo '$(srcdir)/'`gstrtpdvdepay.c libgstrtp_la-gstrtpdvpay.lo: gstrtpdvpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpdvpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpdvpay.Tpo -c -o libgstrtp_la-gstrtpdvpay.lo `test -f 'gstrtpdvpay.c' || echo '$(srcdir)/'`gstrtpdvpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpdvpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpdvpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpdvpay.c' object='libgstrtp_la-gstrtpdvpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpdvpay.lo `test -f 'gstrtpdvpay.c' || echo '$(srcdir)/'`gstrtpdvpay.c libgstrtp_la-gstrtpgstdepay.lo: gstrtpgstdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgstdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Tpo -c -o libgstrtp_la-gstrtpgstdepay.lo `test -f 'gstrtpgstdepay.c' || echo '$(srcdir)/'`gstrtpgstdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgstdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgstdepay.c' object='libgstrtp_la-gstrtpgstdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgstdepay.lo `test -f 'gstrtpgstdepay.c' || echo '$(srcdir)/'`gstrtpgstdepay.c libgstrtp_la-gstrtpgstpay.lo: gstrtpgstpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgstpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgstpay.Tpo -c -o libgstrtp_la-gstrtpgstpay.lo `test -f 'gstrtpgstpay.c' || echo '$(srcdir)/'`gstrtpgstpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgstpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgstpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgstpay.c' object='libgstrtp_la-gstrtpgstpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgstpay.lo `test -f 'gstrtpgstpay.c' || echo '$(srcdir)/'`gstrtpgstpay.c libgstrtp_la-gstrtpilbcdepay.lo: gstrtpilbcdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpilbcdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Tpo -c -o libgstrtp_la-gstrtpilbcdepay.lo `test -f 'gstrtpilbcdepay.c' || echo '$(srcdir)/'`gstrtpilbcdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpilbcdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpilbcdepay.c' object='libgstrtp_la-gstrtpilbcdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpilbcdepay.lo `test -f 'gstrtpilbcdepay.c' || echo '$(srcdir)/'`gstrtpilbcdepay.c libgstrtp_la-gstrtpilbcpay.lo: gstrtpilbcpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpilbcpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Tpo -c -o libgstrtp_la-gstrtpilbcpay.lo `test -f 'gstrtpilbcpay.c' || echo '$(srcdir)/'`gstrtpilbcpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpilbcpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpilbcpay.c' object='libgstrtp_la-gstrtpilbcpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpilbcpay.lo `test -f 'gstrtpilbcpay.c' || echo '$(srcdir)/'`gstrtpilbcpay.c libgstrtp_la-gstrtpmpadepay.lo: gstrtpmpadepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpadepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Tpo -c -o libgstrtp_la-gstrtpmpadepay.lo `test -f 'gstrtpmpadepay.c' || echo '$(srcdir)/'`gstrtpmpadepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpadepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpadepay.c' object='libgstrtp_la-gstrtpmpadepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpadepay.lo `test -f 'gstrtpmpadepay.c' || echo '$(srcdir)/'`gstrtpmpadepay.c libgstrtp_la-gstrtpmpapay.lo: gstrtpmpapay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpapay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpapay.Tpo -c -o libgstrtp_la-gstrtpmpapay.lo `test -f 'gstrtpmpapay.c' || echo '$(srcdir)/'`gstrtpmpapay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpapay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpapay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpapay.c' object='libgstrtp_la-gstrtpmpapay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpapay.lo `test -f 'gstrtpmpapay.c' || echo '$(srcdir)/'`gstrtpmpapay.c libgstrtp_la-gstrtpmparobustdepay.lo: gstrtpmparobustdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmparobustdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Tpo -c -o libgstrtp_la-gstrtpmparobustdepay.lo `test -f 'gstrtpmparobustdepay.c' || echo '$(srcdir)/'`gstrtpmparobustdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmparobustdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmparobustdepay.c' object='libgstrtp_la-gstrtpmparobustdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmparobustdepay.lo `test -f 'gstrtpmparobustdepay.c' || echo '$(srcdir)/'`gstrtpmparobustdepay.c libgstrtp_la-gstrtpmpvdepay.lo: gstrtpmpvdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpvdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Tpo -c -o libgstrtp_la-gstrtpmpvdepay.lo `test -f 'gstrtpmpvdepay.c' || echo '$(srcdir)/'`gstrtpmpvdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpvdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpvdepay.c' object='libgstrtp_la-gstrtpmpvdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpvdepay.lo `test -f 'gstrtpmpvdepay.c' || echo '$(srcdir)/'`gstrtpmpvdepay.c libgstrtp_la-gstrtpmpvpay.lo: gstrtpmpvpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmpvpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Tpo -c -o libgstrtp_la-gstrtpmpvpay.lo `test -f 'gstrtpmpvpay.c' || echo '$(srcdir)/'`gstrtpmpvpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmpvpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmpvpay.c' object='libgstrtp_la-gstrtpmpvpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmpvpay.lo `test -f 'gstrtpmpvpay.c' || echo '$(srcdir)/'`gstrtpmpvpay.c libgstrtp_la-gstrtppcmadepay.lo: gstrtppcmadepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmadepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Tpo -c -o libgstrtp_la-gstrtppcmadepay.lo `test -f 'gstrtppcmadepay.c' || echo '$(srcdir)/'`gstrtppcmadepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmadepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmadepay.c' object='libgstrtp_la-gstrtppcmadepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmadepay.lo `test -f 'gstrtppcmadepay.c' || echo '$(srcdir)/'`gstrtppcmadepay.c libgstrtp_la-gstrtppcmudepay.lo: gstrtppcmudepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmudepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Tpo -c -o libgstrtp_la-gstrtppcmudepay.lo `test -f 'gstrtppcmudepay.c' || echo '$(srcdir)/'`gstrtppcmudepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmudepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmudepay.c' object='libgstrtp_la-gstrtppcmudepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmudepay.lo `test -f 'gstrtppcmudepay.c' || echo '$(srcdir)/'`gstrtppcmudepay.c libgstrtp_la-gstrtppcmupay.lo: gstrtppcmupay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmupay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmupay.Tpo -c -o libgstrtp_la-gstrtppcmupay.lo `test -f 'gstrtppcmupay.c' || echo '$(srcdir)/'`gstrtppcmupay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmupay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmupay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmupay.c' object='libgstrtp_la-gstrtppcmupay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmupay.lo `test -f 'gstrtppcmupay.c' || echo '$(srcdir)/'`gstrtppcmupay.c libgstrtp_la-gstrtppcmapay.lo: gstrtppcmapay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtppcmapay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtppcmapay.Tpo -c -o libgstrtp_la-gstrtppcmapay.lo `test -f 'gstrtppcmapay.c' || echo '$(srcdir)/'`gstrtppcmapay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtppcmapay.Tpo $(DEPDIR)/libgstrtp_la-gstrtppcmapay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtppcmapay.c' object='libgstrtp_la-gstrtppcmapay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtppcmapay.lo `test -f 'gstrtppcmapay.c' || echo '$(srcdir)/'`gstrtppcmapay.c libgstrtp_la-gstrtpg722depay.lo: gstrtpg722depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg722depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg722depay.Tpo -c -o libgstrtp_la-gstrtpg722depay.lo `test -f 'gstrtpg722depay.c' || echo '$(srcdir)/'`gstrtpg722depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg722depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg722depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg722depay.c' object='libgstrtp_la-gstrtpg722depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg722depay.lo `test -f 'gstrtpg722depay.c' || echo '$(srcdir)/'`gstrtpg722depay.c libgstrtp_la-gstrtpg722pay.lo: gstrtpg722pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg722pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg722pay.Tpo -c -o libgstrtp_la-gstrtpg722pay.lo `test -f 'gstrtpg722pay.c' || echo '$(srcdir)/'`gstrtpg722pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg722pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg722pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg722pay.c' object='libgstrtp_la-gstrtpg722pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg722pay.lo `test -f 'gstrtpg722pay.c' || echo '$(srcdir)/'`gstrtpg722pay.c libgstrtp_la-gstrtpg723depay.lo: gstrtpg723depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg723depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg723depay.Tpo -c -o libgstrtp_la-gstrtpg723depay.lo `test -f 'gstrtpg723depay.c' || echo '$(srcdir)/'`gstrtpg723depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg723depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg723depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg723depay.c' object='libgstrtp_la-gstrtpg723depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg723depay.lo `test -f 'gstrtpg723depay.c' || echo '$(srcdir)/'`gstrtpg723depay.c libgstrtp_la-gstrtpg723pay.lo: gstrtpg723pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg723pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg723pay.Tpo -c -o libgstrtp_la-gstrtpg723pay.lo `test -f 'gstrtpg723pay.c' || echo '$(srcdir)/'`gstrtpg723pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg723pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg723pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg723pay.c' object='libgstrtp_la-gstrtpg723pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg723pay.lo `test -f 'gstrtpg723pay.c' || echo '$(srcdir)/'`gstrtpg723pay.c libgstrtp_la-gstrtpg726pay.lo: gstrtpg726pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg726pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg726pay.Tpo -c -o libgstrtp_la-gstrtpg726pay.lo `test -f 'gstrtpg726pay.c' || echo '$(srcdir)/'`gstrtpg726pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg726pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg726pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg726pay.c' object='libgstrtp_la-gstrtpg726pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg726pay.lo `test -f 'gstrtpg726pay.c' || echo '$(srcdir)/'`gstrtpg726pay.c libgstrtp_la-gstrtpg726depay.lo: gstrtpg726depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg726depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg726depay.Tpo -c -o libgstrtp_la-gstrtpg726depay.lo `test -f 'gstrtpg726depay.c' || echo '$(srcdir)/'`gstrtpg726depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg726depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg726depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg726depay.c' object='libgstrtp_la-gstrtpg726depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg726depay.lo `test -f 'gstrtpg726depay.c' || echo '$(srcdir)/'`gstrtpg726depay.c libgstrtp_la-gstrtpg729pay.lo: gstrtpg729pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg729pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg729pay.Tpo -c -o libgstrtp_la-gstrtpg729pay.lo `test -f 'gstrtpg729pay.c' || echo '$(srcdir)/'`gstrtpg729pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg729pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg729pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg729pay.c' object='libgstrtp_la-gstrtpg729pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg729pay.lo `test -f 'gstrtpg729pay.c' || echo '$(srcdir)/'`gstrtpg729pay.c libgstrtp_la-gstrtpg729depay.lo: gstrtpg729depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpg729depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpg729depay.Tpo -c -o libgstrtp_la-gstrtpg729depay.lo `test -f 'gstrtpg729depay.c' || echo '$(srcdir)/'`gstrtpg729depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpg729depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpg729depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpg729depay.c' object='libgstrtp_la-gstrtpg729depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpg729depay.lo `test -f 'gstrtpg729depay.c' || echo '$(srcdir)/'`gstrtpg729depay.c libgstrtp_la-gstrtpgsmdepay.lo: gstrtpgsmdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgsmdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Tpo -c -o libgstrtp_la-gstrtpgsmdepay.lo `test -f 'gstrtpgsmdepay.c' || echo '$(srcdir)/'`gstrtpgsmdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgsmdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgsmdepay.c' object='libgstrtp_la-gstrtpgsmdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgsmdepay.lo `test -f 'gstrtpgsmdepay.c' || echo '$(srcdir)/'`gstrtpgsmdepay.c libgstrtp_la-gstrtpgsmpay.lo: gstrtpgsmpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpgsmpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Tpo -c -o libgstrtp_la-gstrtpgsmpay.lo `test -f 'gstrtpgsmpay.c' || echo '$(srcdir)/'`gstrtpgsmpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpgsmpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpgsmpay.c' object='libgstrtp_la-gstrtpgsmpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpgsmpay.lo `test -f 'gstrtpgsmpay.c' || echo '$(srcdir)/'`gstrtpgsmpay.c libgstrtp_la-gstrtpamrdepay.lo: gstrtpamrdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpamrdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Tpo -c -o libgstrtp_la-gstrtpamrdepay.lo `test -f 'gstrtpamrdepay.c' || echo '$(srcdir)/'`gstrtpamrdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpamrdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpamrdepay.c' object='libgstrtp_la-gstrtpamrdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpamrdepay.lo `test -f 'gstrtpamrdepay.c' || echo '$(srcdir)/'`gstrtpamrdepay.c libgstrtp_la-gstrtpamrpay.lo: gstrtpamrpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpamrpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpamrpay.Tpo -c -o libgstrtp_la-gstrtpamrpay.lo `test -f 'gstrtpamrpay.c' || echo '$(srcdir)/'`gstrtpamrpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpamrpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpamrpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpamrpay.c' object='libgstrtp_la-gstrtpamrpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpamrpay.lo `test -f 'gstrtpamrpay.c' || echo '$(srcdir)/'`gstrtpamrpay.c libgstrtp_la-gstrtph263pdepay.lo: gstrtph263pdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263pdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Tpo -c -o libgstrtp_la-gstrtph263pdepay.lo `test -f 'gstrtph263pdepay.c' || echo '$(srcdir)/'`gstrtph263pdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263pdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263pdepay.c' object='libgstrtp_la-gstrtph263pdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263pdepay.lo `test -f 'gstrtph263pdepay.c' || echo '$(srcdir)/'`gstrtph263pdepay.c libgstrtp_la-gstrtph263ppay.lo: gstrtph263ppay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263ppay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263ppay.Tpo -c -o libgstrtp_la-gstrtph263ppay.lo `test -f 'gstrtph263ppay.c' || echo '$(srcdir)/'`gstrtph263ppay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263ppay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263ppay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263ppay.c' object='libgstrtp_la-gstrtph263ppay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263ppay.lo `test -f 'gstrtph263ppay.c' || echo '$(srcdir)/'`gstrtph263ppay.c libgstrtp_la-gstrtph263depay.lo: gstrtph263depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263depay.Tpo -c -o libgstrtp_la-gstrtph263depay.lo `test -f 'gstrtph263depay.c' || echo '$(srcdir)/'`gstrtph263depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263depay.c' object='libgstrtp_la-gstrtph263depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263depay.lo `test -f 'gstrtph263depay.c' || echo '$(srcdir)/'`gstrtph263depay.c libgstrtp_la-gstrtph263pay.lo: gstrtph263pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph263pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph263pay.Tpo -c -o libgstrtp_la-gstrtph263pay.lo `test -f 'gstrtph263pay.c' || echo '$(srcdir)/'`gstrtph263pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph263pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph263pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph263pay.c' object='libgstrtp_la-gstrtph263pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph263pay.lo `test -f 'gstrtph263pay.c' || echo '$(srcdir)/'`gstrtph263pay.c libgstrtp_la-gstrtph264depay.lo: gstrtph264depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph264depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph264depay.Tpo -c -o libgstrtp_la-gstrtph264depay.lo `test -f 'gstrtph264depay.c' || echo '$(srcdir)/'`gstrtph264depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph264depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph264depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph264depay.c' object='libgstrtp_la-gstrtph264depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph264depay.lo `test -f 'gstrtph264depay.c' || echo '$(srcdir)/'`gstrtph264depay.c libgstrtp_la-gstrtph264pay.lo: gstrtph264pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtph264pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtph264pay.Tpo -c -o libgstrtp_la-gstrtph264pay.lo `test -f 'gstrtph264pay.c' || echo '$(srcdir)/'`gstrtph264pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtph264pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtph264pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtph264pay.c' object='libgstrtp_la-gstrtph264pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtph264pay.lo `test -f 'gstrtph264pay.c' || echo '$(srcdir)/'`gstrtph264pay.c libgstrtp_la-gstrtpj2kdepay.lo: gstrtpj2kdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpj2kdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Tpo -c -o libgstrtp_la-gstrtpj2kdepay.lo `test -f 'gstrtpj2kdepay.c' || echo '$(srcdir)/'`gstrtpj2kdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpj2kdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpj2kdepay.c' object='libgstrtp_la-gstrtpj2kdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpj2kdepay.lo `test -f 'gstrtpj2kdepay.c' || echo '$(srcdir)/'`gstrtpj2kdepay.c libgstrtp_la-gstrtpj2kpay.lo: gstrtpj2kpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpj2kpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Tpo -c -o libgstrtp_la-gstrtpj2kpay.lo `test -f 'gstrtpj2kpay.c' || echo '$(srcdir)/'`gstrtpj2kpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpj2kpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpj2kpay.c' object='libgstrtp_la-gstrtpj2kpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpj2kpay.lo `test -f 'gstrtpj2kpay.c' || echo '$(srcdir)/'`gstrtpj2kpay.c libgstrtp_la-gstrtpjpegdepay.lo: gstrtpjpegdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpjpegdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Tpo -c -o libgstrtp_la-gstrtpjpegdepay.lo `test -f 'gstrtpjpegdepay.c' || echo '$(srcdir)/'`gstrtpjpegdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpjpegdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpjpegdepay.c' object='libgstrtp_la-gstrtpjpegdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpjpegdepay.lo `test -f 'gstrtpjpegdepay.c' || echo '$(srcdir)/'`gstrtpjpegdepay.c libgstrtp_la-gstrtpjpegpay.lo: gstrtpjpegpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpjpegpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Tpo -c -o libgstrtp_la-gstrtpjpegpay.lo `test -f 'gstrtpjpegpay.c' || echo '$(srcdir)/'`gstrtpjpegpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpjpegpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpjpegpay.c' object='libgstrtp_la-gstrtpjpegpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpjpegpay.lo `test -f 'gstrtpjpegpay.c' || echo '$(srcdir)/'`gstrtpjpegpay.c libgstrtp_la-gstrtpL16depay.lo: gstrtpL16depay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpL16depay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpL16depay.Tpo -c -o libgstrtp_la-gstrtpL16depay.lo `test -f 'gstrtpL16depay.c' || echo '$(srcdir)/'`gstrtpL16depay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpL16depay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpL16depay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpL16depay.c' object='libgstrtp_la-gstrtpL16depay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpL16depay.lo `test -f 'gstrtpL16depay.c' || echo '$(srcdir)/'`gstrtpL16depay.c libgstrtp_la-gstrtpL16pay.lo: gstrtpL16pay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpL16pay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpL16pay.Tpo -c -o libgstrtp_la-gstrtpL16pay.lo `test -f 'gstrtpL16pay.c' || echo '$(srcdir)/'`gstrtpL16pay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpL16pay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpL16pay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpL16pay.c' object='libgstrtp_la-gstrtpL16pay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpL16pay.lo `test -f 'gstrtpL16pay.c' || echo '$(srcdir)/'`gstrtpL16pay.c libgstrtp_la-gstasteriskh263.lo: gstasteriskh263.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstasteriskh263.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstasteriskh263.Tpo -c -o libgstrtp_la-gstasteriskh263.lo `test -f 'gstasteriskh263.c' || echo '$(srcdir)/'`gstasteriskh263.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstasteriskh263.Tpo $(DEPDIR)/libgstrtp_la-gstasteriskh263.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstasteriskh263.c' object='libgstrtp_la-gstasteriskh263.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstasteriskh263.lo `test -f 'gstasteriskh263.c' || echo '$(srcdir)/'`gstasteriskh263.c libgstrtp_la-gstrtpmp1sdepay.lo: gstrtpmp1sdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp1sdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Tpo -c -o libgstrtp_la-gstrtpmp1sdepay.lo `test -f 'gstrtpmp1sdepay.c' || echo '$(srcdir)/'`gstrtpmp1sdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp1sdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp1sdepay.c' object='libgstrtp_la-gstrtpmp1sdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp1sdepay.lo `test -f 'gstrtpmp1sdepay.c' || echo '$(srcdir)/'`gstrtpmp1sdepay.c libgstrtp_la-gstrtpmp2tdepay.lo: gstrtpmp2tdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp2tdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Tpo -c -o libgstrtp_la-gstrtpmp2tdepay.lo `test -f 'gstrtpmp2tdepay.c' || echo '$(srcdir)/'`gstrtpmp2tdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp2tdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp2tdepay.c' object='libgstrtp_la-gstrtpmp2tdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp2tdepay.lo `test -f 'gstrtpmp2tdepay.c' || echo '$(srcdir)/'`gstrtpmp2tdepay.c libgstrtp_la-gstrtpmp2tpay.lo: gstrtpmp2tpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp2tpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Tpo -c -o libgstrtp_la-gstrtpmp2tpay.lo `test -f 'gstrtpmp2tpay.c' || echo '$(srcdir)/'`gstrtpmp2tpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp2tpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp2tpay.c' object='libgstrtp_la-gstrtpmp2tpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp2tpay.lo `test -f 'gstrtpmp2tpay.c' || echo '$(srcdir)/'`gstrtpmp2tpay.c libgstrtp_la-gstrtpmp4vdepay.lo: gstrtpmp4vdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4vdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Tpo -c -o libgstrtp_la-gstrtpmp4vdepay.lo `test -f 'gstrtpmp4vdepay.c' || echo '$(srcdir)/'`gstrtpmp4vdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4vdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4vdepay.c' object='libgstrtp_la-gstrtpmp4vdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4vdepay.lo `test -f 'gstrtpmp4vdepay.c' || echo '$(srcdir)/'`gstrtpmp4vdepay.c libgstrtp_la-gstrtpmp4vpay.lo: gstrtpmp4vpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4vpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Tpo -c -o libgstrtp_la-gstrtpmp4vpay.lo `test -f 'gstrtpmp4vpay.c' || echo '$(srcdir)/'`gstrtpmp4vpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4vpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4vpay.c' object='libgstrtp_la-gstrtpmp4vpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4vpay.lo `test -f 'gstrtpmp4vpay.c' || echo '$(srcdir)/'`gstrtpmp4vpay.c libgstrtp_la-gstrtpmp4gdepay.lo: gstrtpmp4gdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4gdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Tpo -c -o libgstrtp_la-gstrtpmp4gdepay.lo `test -f 'gstrtpmp4gdepay.c' || echo '$(srcdir)/'`gstrtpmp4gdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4gdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4gdepay.c' object='libgstrtp_la-gstrtpmp4gdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4gdepay.lo `test -f 'gstrtpmp4gdepay.c' || echo '$(srcdir)/'`gstrtpmp4gdepay.c libgstrtp_la-gstrtpmp4gpay.lo: gstrtpmp4gpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4gpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Tpo -c -o libgstrtp_la-gstrtpmp4gpay.lo `test -f 'gstrtpmp4gpay.c' || echo '$(srcdir)/'`gstrtpmp4gpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4gpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4gpay.c' object='libgstrtp_la-gstrtpmp4gpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4gpay.lo `test -f 'gstrtpmp4gpay.c' || echo '$(srcdir)/'`gstrtpmp4gpay.c libgstrtp_la-gstrtpmp4adepay.lo: gstrtpmp4adepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4adepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Tpo -c -o libgstrtp_la-gstrtpmp4adepay.lo `test -f 'gstrtpmp4adepay.c' || echo '$(srcdir)/'`gstrtpmp4adepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4adepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4adepay.c' object='libgstrtp_la-gstrtpmp4adepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4adepay.lo `test -f 'gstrtpmp4adepay.c' || echo '$(srcdir)/'`gstrtpmp4adepay.c libgstrtp_la-gstrtpmp4apay.lo: gstrtpmp4apay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpmp4apay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Tpo -c -o libgstrtp_la-gstrtpmp4apay.lo `test -f 'gstrtpmp4apay.c' || echo '$(srcdir)/'`gstrtpmp4apay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpmp4apay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpmp4apay.c' object='libgstrtp_la-gstrtpmp4apay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpmp4apay.lo `test -f 'gstrtpmp4apay.c' || echo '$(srcdir)/'`gstrtpmp4apay.c libgstrtp_la-gstrtpqcelpdepay.lo: gstrtpqcelpdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpqcelpdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Tpo -c -o libgstrtp_la-gstrtpqcelpdepay.lo `test -f 'gstrtpqcelpdepay.c' || echo '$(srcdir)/'`gstrtpqcelpdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpqcelpdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpqcelpdepay.c' object='libgstrtp_la-gstrtpqcelpdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpqcelpdepay.lo `test -f 'gstrtpqcelpdepay.c' || echo '$(srcdir)/'`gstrtpqcelpdepay.c libgstrtp_la-gstrtpqdmdepay.lo: gstrtpqdmdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpqdmdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Tpo -c -o libgstrtp_la-gstrtpqdmdepay.lo `test -f 'gstrtpqdmdepay.c' || echo '$(srcdir)/'`gstrtpqdmdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpqdmdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpqdmdepay.c' object='libgstrtp_la-gstrtpqdmdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpqdmdepay.lo `test -f 'gstrtpqdmdepay.c' || echo '$(srcdir)/'`gstrtpqdmdepay.c libgstrtp_la-gstrtpsirenpay.lo: gstrtpsirenpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpsirenpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Tpo -c -o libgstrtp_la-gstrtpsirenpay.lo `test -f 'gstrtpsirenpay.c' || echo '$(srcdir)/'`gstrtpsirenpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpsirenpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsirenpay.c' object='libgstrtp_la-gstrtpsirenpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpsirenpay.lo `test -f 'gstrtpsirenpay.c' || echo '$(srcdir)/'`gstrtpsirenpay.c libgstrtp_la-gstrtpsirendepay.lo: gstrtpsirendepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpsirendepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Tpo -c -o libgstrtp_la-gstrtpsirendepay.lo `test -f 'gstrtpsirendepay.c' || echo '$(srcdir)/'`gstrtpsirendepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpsirendepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsirendepay.c' object='libgstrtp_la-gstrtpsirendepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpsirendepay.lo `test -f 'gstrtpsirendepay.c' || echo '$(srcdir)/'`gstrtpsirendepay.c libgstrtp_la-gstrtpspeexdepay.lo: gstrtpspeexdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpspeexdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Tpo -c -o libgstrtp_la-gstrtpspeexdepay.lo `test -f 'gstrtpspeexdepay.c' || echo '$(srcdir)/'`gstrtpspeexdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpspeexdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpspeexdepay.c' object='libgstrtp_la-gstrtpspeexdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpspeexdepay.lo `test -f 'gstrtpspeexdepay.c' || echo '$(srcdir)/'`gstrtpspeexdepay.c libgstrtp_la-gstrtpspeexpay.lo: gstrtpspeexpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpspeexpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Tpo -c -o libgstrtp_la-gstrtpspeexpay.lo `test -f 'gstrtpspeexpay.c' || echo '$(srcdir)/'`gstrtpspeexpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpspeexpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpspeexpay.c' object='libgstrtp_la-gstrtpspeexpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpspeexpay.lo `test -f 'gstrtpspeexpay.c' || echo '$(srcdir)/'`gstrtpspeexpay.c libgstrtp_la-gstrtpsv3vdepay.lo: gstrtpsv3vdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpsv3vdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Tpo -c -o libgstrtp_la-gstrtpsv3vdepay.lo `test -f 'gstrtpsv3vdepay.c' || echo '$(srcdir)/'`gstrtpsv3vdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpsv3vdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpsv3vdepay.c' object='libgstrtp_la-gstrtpsv3vdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpsv3vdepay.lo `test -f 'gstrtpsv3vdepay.c' || echo '$(srcdir)/'`gstrtpsv3vdepay.c libgstrtp_la-gstrtptheoradepay.lo: gstrtptheoradepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtptheoradepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Tpo -c -o libgstrtp_la-gstrtptheoradepay.lo `test -f 'gstrtptheoradepay.c' || echo '$(srcdir)/'`gstrtptheoradepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtptheoradepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtptheoradepay.c' object='libgstrtp_la-gstrtptheoradepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtptheoradepay.lo `test -f 'gstrtptheoradepay.c' || echo '$(srcdir)/'`gstrtptheoradepay.c libgstrtp_la-gstrtptheorapay.lo: gstrtptheorapay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtptheorapay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtptheorapay.Tpo -c -o libgstrtp_la-gstrtptheorapay.lo `test -f 'gstrtptheorapay.c' || echo '$(srcdir)/'`gstrtptheorapay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtptheorapay.Tpo $(DEPDIR)/libgstrtp_la-gstrtptheorapay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtptheorapay.c' object='libgstrtp_la-gstrtptheorapay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtptheorapay.lo `test -f 'gstrtptheorapay.c' || echo '$(srcdir)/'`gstrtptheorapay.c libgstrtp_la-gstrtpvorbisdepay.lo: gstrtpvorbisdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvorbisdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Tpo -c -o libgstrtp_la-gstrtpvorbisdepay.lo `test -f 'gstrtpvorbisdepay.c' || echo '$(srcdir)/'`gstrtpvorbisdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvorbisdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvorbisdepay.c' object='libgstrtp_la-gstrtpvorbisdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvorbisdepay.lo `test -f 'gstrtpvorbisdepay.c' || echo '$(srcdir)/'`gstrtpvorbisdepay.c libgstrtp_la-gstrtpvorbispay.lo: gstrtpvorbispay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvorbispay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Tpo -c -o libgstrtp_la-gstrtpvorbispay.lo `test -f 'gstrtpvorbispay.c' || echo '$(srcdir)/'`gstrtpvorbispay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvorbispay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvorbispay.c' object='libgstrtp_la-gstrtpvorbispay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvorbispay.lo `test -f 'gstrtpvorbispay.c' || echo '$(srcdir)/'`gstrtpvorbispay.c libgstrtp_la-gstrtpvrawdepay.lo: gstrtpvrawdepay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvrawdepay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Tpo -c -o libgstrtp_la-gstrtpvrawdepay.lo `test -f 'gstrtpvrawdepay.c' || echo '$(srcdir)/'`gstrtpvrawdepay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvrawdepay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvrawdepay.c' object='libgstrtp_la-gstrtpvrawdepay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvrawdepay.lo `test -f 'gstrtpvrawdepay.c' || echo '$(srcdir)/'`gstrtpvrawdepay.c libgstrtp_la-gstrtpvrawpay.lo: gstrtpvrawpay.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -MT libgstrtp_la-gstrtpvrawpay.lo -MD -MP -MF $(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Tpo -c -o libgstrtp_la-gstrtpvrawpay.lo `test -f 'gstrtpvrawpay.c' || echo '$(srcdir)/'`gstrtpvrawpay.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Tpo $(DEPDIR)/libgstrtp_la-gstrtpvrawpay.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrtpvrawpay.c' object='libgstrtp_la-gstrtpvrawpay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstrtp_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstrtp_la_CFLAGS) $(CFLAGS) -c -o libgstrtp_la-gstrtpvrawpay.lo `test -f 'gstrtpvrawpay.c' || echo '$(srcdir)/'`gstrtpvrawpay.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstrtp -:SHARED libgstrtp \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstrtp_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstrtp_la_CFLAGS) \ -:LDFLAGS $(libgstrtp_la_LDFLAGS) \ $(libgstrtp_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/rtp/gstrtpg722pay.c0000644000175000017500000001423211677341656016226 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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 #include #include #include #include "gstrtpg722pay.h" #include "gstrtpchannels.h" GST_DEBUG_CATEGORY_STATIC (rtpg722pay_debug); #define GST_CAT_DEFAULT (rtpg722pay_debug) static GstStaticPadTemplate gst_rtp_g722_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/G722, " "rate = (int) 16000, " "channels = (int) 1") ); static GstStaticPadTemplate gst_rtp_g722_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "encoding-name = (string) \"G722\", " "payload = (int) " GST_RTP_PAYLOAD_G722_STRING ", " "clock-rate = (int) 8000") ); static gboolean gst_rtp_g722_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstCaps *gst_rtp_g722_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad); GST_BOILERPLATE (GstRtpG722Pay, gst_rtp_g722_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_g722_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g722_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_g722_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP audio payloader", "Codec/Payloader/Network/RTP", "Payload-encode Raw audio into RTP packets (RFC 3551)", "Wim Taymans "); } static void gst_rtp_g722_pay_class_init (GstRtpG722PayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_g722_pay_setcaps; gstbasertppayload_class->get_caps = gst_rtp_g722_pay_getcaps; GST_DEBUG_CATEGORY_INIT (rtpg722pay_debug, "rtpg722pay", 0, "G722 RTP Payloader"); } static void gst_rtp_g722_pay_init (GstRtpG722Pay * rtpg722pay, GstRtpG722PayClass * klass) { GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpg722pay); /* tell basertpaudiopayload that this is a sample based codec */ gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); } static gboolean gst_rtp_g722_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) { GstRtpG722Pay *rtpg722pay; GstStructure *structure; gint rate, channels, clock_rate; gboolean res; gchar *params; GstAudioChannelPosition *pos; const GstRTPChannelOrder *order; GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basepayload); rtpg722pay = GST_RTP_G722_PAY (basepayload); structure = gst_caps_get_structure (caps, 0); /* first parse input caps */ if (!gst_structure_get_int (structure, "rate", &rate)) goto no_rate; if (!gst_structure_get_int (structure, "channels", &channels)) goto no_channels; /* get the channel order */ pos = gst_audio_get_channel_positions (structure); if (pos) order = gst_rtp_channels_get_by_pos (channels, pos); else order = NULL; /* Clock rate is always 8000 Hz for G722 according to * RFC 3551 although the sampling rate is 16000 Hz */ clock_rate = 8000; gst_basertppayload_set_options (basepayload, "audio", TRUE, "G722", clock_rate); params = g_strdup_printf ("%d", channels); if (!order && channels > 2) { GST_ELEMENT_WARNING (rtpg722pay, STREAM, DECODE, (NULL), ("Unknown channel order for %d channels", channels)); } if (order && order->name) { res = gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, channels, "channel-order", G_TYPE_STRING, order->name, NULL); } else { res = gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, channels, NULL); } g_free (params); g_free (pos); rtpg722pay->rate = rate; rtpg722pay->channels = channels; /* bits-per-sample is 4 * channels for G722, but as the RTP clock runs at * half speed (8 instead of 16 khz), pretend it's 8 bits per sample * channels. */ gst_base_rtp_audio_payload_set_samplebits_options (basertpaudiopayload, 8 * rtpg722pay->channels); return res; /* ERRORS */ no_rate: { GST_DEBUG_OBJECT (rtpg722pay, "no rate given"); return FALSE; } no_channels: { GST_DEBUG_OBJECT (rtpg722pay, "no channels given"); return FALSE; } } static GstCaps * gst_rtp_g722_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) { GstCaps *otherpadcaps; GstCaps *caps; otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); gst_caps_set_simple (caps, "rate", G_TYPE_INT, 16000, NULL); } gst_caps_unref (otherpadcaps); } return caps; } gboolean gst_rtp_g722_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpg722pay", GST_RANK_SECONDARY, GST_TYPE_RTP_G722_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpg729pay.h0000644000175000017500000000371511671175354016240 00000000000000/* GStreamer * Copyright (C) <2007> Nokia Corporation * Copyright (C) <2007> Collabora Ltd * * 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_RTP_G729_PAY_H__ #define __GST_RTP_G729_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_G729_PAY \ (gst_rtp_g729_pay_get_type()) #define GST_RTP_G729_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G729_PAY,GstRTPG729Pay)) #define GST_RTP_G729_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G729_PAY,GstRTPG729PayClass)) #define GST_IS_RTP_G729_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G729_PAY)) #define GST_IS_RTP_G729_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G729_PAY)) typedef struct _GstRTPG729Pay GstRTPG729Pay; typedef struct _GstRTPG729PayClass GstRTPG729PayClass; struct _GstRTPG729Pay { GstBaseRTPPayload payload; GstAdapter *adapter; GstClockTime next_ts; guint32 next_rtp_time; GstClockTime first_ts; guint32 first_rtp_time; gboolean discont; }; struct _GstRTPG729PayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_g729_pay_get_type (void); gboolean gst_rtp_g729_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G729_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpchannels.c0000644000175000017500000001013311671175354016614 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include "gstrtpchannels.h" /* * RTP channel positions as discussed in RFC 3551 and also RFC 3555 * * We can't really represent the described channel positions in GStreamer but we * implement a (very rough) approximation here. */ static gboolean check_channels (const GstRTPChannelOrder * order, const GstAudioChannelPosition * pos) { gint i; gboolean res = TRUE; for (i = 0; i < order->channels; i++) { if (order->pos[i] != pos[i]) { res = FALSE; break; } } return res; } /** * gst_rtp_channels_get_by_pos: * @channels: the amount of channels * @pos: a channel layout * * Return a description of the channel layout. * * Returns: a #GstRTPChannelOrder with the channel information or NULL when @pos * is not a valid layout. */ const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition * pos) { gint i; const GstRTPChannelOrder *res = NULL; g_return_val_if_fail (pos != NULL, NULL); for (i = 0; channel_orders[i].pos; i++) { if (channel_orders[i].channels != channels) continue; if (check_channels (&channel_orders[i], pos)) { res = &channel_orders[i]; break; } } return res; } /** * gst_rtp_channels_create_default: * @channels: the amount of channels * @order: a channel order * * Get the channel order info the @order and @channels. * * Returns: a #GstRTPChannelOrder with the channel information or NULL when * @order is not a know layout for @channels. */ const GstRTPChannelOrder * gst_rtp_channels_get_by_order (gint channels, const gchar * order) { gint i; const GstRTPChannelOrder *res = NULL; for (i = 0; channel_orders[i].pos; i++) { if (channel_orders[i].channels != channels) continue; /* no name but channels match, continue */ if (!channel_orders[i].name || !order) { res = &channel_orders[i]; break; } /* compare names */ if (g_ascii_strcasecmp (channel_orders[i].name, order)) { res = &channel_orders[i]; break; } } return res; } /** * gst_rtp_channels_get_by_index: * @channels: the amount of channels * @idx: the channel index to retrieve * * Get the allowed channel order descriptions for @channels. @idx can be used to * retrieve the desired index. * * Returns: a #GstRTPChannelOrder at @idx, NULL when there are no valid channel * orders. */ const GstRTPChannelOrder * gst_rtp_channels_get_by_index (gint channels, guint idx) { gint i; const GstRTPChannelOrder *res = NULL; for (i = 0; channel_orders[i].pos; i++) { if (channel_orders[i].channels != channels) continue; if (idx == 0) { res = &channel_orders[i]; break; } idx--; } return res; } /** * gst_rtp_channels_create_default: * @channels: the amount of channels * * Create a default none channel mapping for @channels. * * Returns: a #GstAudioChannelPosition with all the channel position info set to * #GST_AUDIO_CHANNEL_POSITION_NONE. */ GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels) { gint i; GstAudioChannelPosition *posn; g_return_val_if_fail (channels > 0, NULL); posn = g_new (GstAudioChannelPosition, channels); for (i = 0; i < channels; i++) posn[i] = GST_AUDIO_CHANNEL_POSITION_NONE; return posn; } gst-plugins-good-0.10.31/gst/rtp/gstrtpgstdepay.c0000644000175000017500000002370211677341656016655 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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 #include #include "gstrtpgstdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpgstdepay_debug); #define GST_CAT_DEFAULT (rtpgstdepay_debug) static GstStaticPadTemplate gst_rtp_gst_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_rtp_gst_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"application\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"X-GST\"") ); GST_BOILERPLATE (GstRtpGSTDepay, gst_rtp_gst_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_gst_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_gst_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_gst_depay_reset (GstRtpGSTDepay * rtpgstdepay); static gboolean gst_rtp_gst_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_gst_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_gst_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gst_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_gst_depay_sink_template); gst_element_class_set_details_simple (element_class, "GStreamer depayloader", "Codec/Depayloader/Network", "Extracts GStreamer buffers from RTP packets", "Wim Taymans "); } static void gst_rtp_gst_depay_class_init (GstRtpGSTDepayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_gst_depay_finalize; gstelement_class->change_state = gst_rtp_gst_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_gst_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_gst_depay_process; GST_DEBUG_CATEGORY_INIT (rtpgstdepay_debug, "rtpgstdepay", 0, "Gstreamer RTP Depayloader"); } static void gst_rtp_gst_depay_init (GstRtpGSTDepay * rtpgstdepay, GstRtpGSTDepayClass * klass) { rtpgstdepay->adapter = gst_adapter_new (); } static void gst_rtp_gst_depay_finalize (GObject * object) { GstRtpGSTDepay *rtpgstdepay; rtpgstdepay = GST_RTP_GST_DEPAY (object); gst_rtp_gst_depay_reset (rtpgstdepay); g_object_unref (rtpgstdepay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void store_cache (GstRtpGSTDepay * rtpgstdepay, guint CV, GstCaps * caps) { if (rtpgstdepay->CV_cache[CV]) gst_caps_unref (rtpgstdepay->CV_cache[CV]); rtpgstdepay->CV_cache[CV] = caps; } static void gst_rtp_gst_depay_reset (GstRtpGSTDepay * rtpgstdepay) { guint i; gst_adapter_clear (rtpgstdepay->adapter); rtpgstdepay->current_CV = 0; for (i = 0; i < 8; i++) store_cache (rtpgstdepay, i, NULL); } static gboolean gst_rtp_gst_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstRtpGSTDepay *rtpgstdepay; GstStructure *structure; GstCaps *outcaps; gint clock_rate; gboolean res; const gchar *capsenc; gchar *capsstr; rtpgstdepay = GST_RTP_GST_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; capsenc = gst_structure_get_string (structure, "caps"); if (capsenc) { gsize out_len; capsstr = (gchar *) g_base64_decode (capsenc, &out_len); outcaps = gst_caps_from_string (capsstr); g_free (capsstr); /* we have the SDP caps as output caps */ rtpgstdepay->current_CV = 0; gst_caps_ref (outcaps); store_cache (rtpgstdepay, 0, outcaps); } else { outcaps = gst_caps_new_any (); } res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); return res; } static GstBuffer * gst_rtp_gst_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpGSTDepay *rtpgstdepay; GstBuffer *subbuf, *outbuf = NULL; gint payload_len; guint8 *payload; guint CV; rtpgstdepay = GST_RTP_GST_DEPAY (depayload); payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len <= 8) goto empty_packet; if (GST_BUFFER_IS_DISCONT (buf)) { GST_WARNING_OBJECT (rtpgstdepay, "DISCONT, clear adapter"); gst_adapter_clear (rtpgstdepay->adapter); } payload = gst_rtp_buffer_get_payload (buf); /* strip off header * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |C| CV |D|X|Y|Z| MBZ | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ /* frag_offset = * (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7]; */ /* subbuffer skipping the 8 header bytes */ subbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 8, -1); gst_adapter_push (rtpgstdepay->adapter, subbuf); if (gst_rtp_buffer_get_marker (buf)) { guint avail; GstCaps *outcaps; /* take the buffer */ avail = gst_adapter_available (rtpgstdepay->adapter); outbuf = gst_adapter_take_buffer (rtpgstdepay->adapter, avail); CV = (payload[0] >> 4) & 0x7; if (payload[0] & 0x80) { guint b, csize, size, offset; guint8 *data; GstBuffer *subbuf; /* C bit, we have inline caps */ data = GST_BUFFER_DATA (outbuf); size = GST_BUFFER_SIZE (outbuf); /* start reading the length, we need this to skip to the data later */ csize = offset = 0; do { if (offset >= size) goto too_small; b = data[offset++]; csize = (csize << 7) | (b & 0x7f); } while (b & 0x80); if (size < csize) goto too_small; /* parse and store in cache */ outcaps = gst_caps_from_string ((gchar *) & data[offset]); store_cache (rtpgstdepay, CV, outcaps); /* skip caps */ offset += csize; size -= csize; GST_DEBUG_OBJECT (rtpgstdepay, "inline caps %u, length %u, %" GST_PTR_FORMAT, CV, csize, outcaps); /* create real data buffer when needed */ if (size) subbuf = gst_buffer_create_sub (outbuf, offset, size); else subbuf = NULL; gst_buffer_unref (outbuf); outbuf = subbuf; } /* see what caps we need */ if (CV != rtpgstdepay->current_CV) { /* we need to switch caps, check if we have the caps */ if ((outcaps = rtpgstdepay->CV_cache[CV]) == NULL) goto missing_caps; GST_DEBUG_OBJECT (rtpgstdepay, "need caps switch from %u to %u, %" GST_PTR_FORMAT, rtpgstdepay->current_CV, CV, outcaps); /* and set caps */ if (gst_pad_set_caps (depayload->srcpad, outcaps)) rtpgstdepay->current_CV = CV; } if (outbuf) { if (payload[0] & 0x8) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); if (payload[0] & 0x4) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MEDIA1); if (payload[0] & 0x2) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MEDIA2); if (payload[0] & 0x1) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_MEDIA3); } } return outbuf; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; } too_small: { GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, ("Buffer too small."), (NULL)); if (outbuf) gst_buffer_unref (outbuf); return NULL; } missing_caps: { GST_ELEMENT_WARNING (rtpgstdepay, STREAM, DECODE, ("Missing caps %u.", CV), (NULL)); if (outbuf) gst_buffer_unref (outbuf); return NULL; } } static GstStateChangeReturn gst_rtp_gst_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpGSTDepay *rtpgstdepay; GstStateChangeReturn ret; rtpgstdepay = GST_RTP_GST_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_gst_depay_reset (rtpgstdepay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_gst_depay_reset (rtpgstdepay); break; default: break; } return ret; } gboolean gst_rtp_gst_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpgstdepay", GST_RANK_MARGINAL, GST_TYPE_RTP_GST_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpg729depay.h0000644000175000017500000000345211671175354016547 00000000000000/* GStreamer * * 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_RTP_G729_DEPAY_H__ #define __GST_RTP_G729_DEPAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_G729_DEPAY \ (gst_rtp_g729_depay_get_type()) #define GST_RTP_G729_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G729_DEPAY,GstRtpG729Depay)) #define GST_RTP_G729_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G729_DEPAY,GstRtpG729DepayClass)) #define GST_IS_RTP_G729_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G729_DEPAY)) #define GST_IS_RTP_G729_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G729_DEPAY)) typedef struct _GstRtpG729Depay GstRtpG729Depay; typedef struct _GstRtpG729DepayClass GstRtpG729DepayClass; struct _GstRtpG729Depay { GstBaseRTPDepayload depayload; }; struct _GstRtpG729DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_g729_depay_get_type (void); gboolean gst_rtp_g729_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_G729_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpgstdepay.h0000644000175000017500000000365011671175354016654 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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_RTP_GST_DEPAY_H__ #define __GST_RTP_GST_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_GST_DEPAY \ (gst_rtp_gst_depay_get_type()) #define GST_RTP_GST_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GST_DEPAY,GstRtpGSTDepay)) #define GST_RTP_GST_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GST_DEPAY,GstRtpGSTDepayClass)) #define GST_IS_RTP_GST_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GST_DEPAY)) #define GST_IS_RTP_GST_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GST_DEPAY)) typedef struct _GstRtpGSTDepay GstRtpGSTDepay; typedef struct _GstRtpGSTDepayClass GstRtpGSTDepayClass; struct _GstRtpGSTDepay { GstBaseRTPDepayload depayload; GstAdapter *adapter; guint current_CV; GstCaps *CV_cache[8]; }; struct _GstRtpGSTDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_gst_depay_get_type (void); gboolean gst_rtp_gst_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_GST_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpj2kdepay.h0000644000175000017500000000415711671175354016550 00000000000000/* GStreamer * Copyright (C) <2009> Wim Taymans * * 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_RTP_J2K_DEPAY_H__ #define __GST_RTP_J2K_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_J2K_DEPAY \ (gst_rtp_j2k_depay_get_type()) #define GST_RTP_J2K_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_J2K_DEPAY,GstRtpJ2KDepay)) #define GST_RTP_J2K_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_J2K_DEPAY,GstRtpJ2KDepayClass)) #define GST_IS_RTP_J2K_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_J2K_DEPAY)) #define GST_IS_RTP_J2K_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_J2K_DEPAY)) typedef struct _GstRtpJ2KDepay GstRtpJ2KDepay; typedef struct _GstRtpJ2KDepayClass GstRtpJ2KDepayClass; struct _GstRtpJ2KDepay { GstBaseRTPDepayload depayload; guint64 last_rtptime; guint last_mh_id; guint last_tile; GstBuffer *MH[8]; guint pu_MHF; GstAdapter *pu_adapter; GstAdapter *t_adapter; GstAdapter *f_adapter; guint next_frag; gboolean have_sync; gboolean buffer_list; gint width, height; }; struct _GstRtpJ2KDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_j2k_depay_get_type (void); gboolean gst_rtp_j2k_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_J2K_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpvrawdepay.h0000644000175000017500000000407111671175354017034 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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_RTP_VRAW_DEPAY_H__ #define __GST_RTP_VRAW_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_VRAW_DEPAY \ (gst_rtp_vraw_depay_get_type()) #define GST_RTP_VRAW_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VRAW_DEPAY,GstRtpVRawDepay)) #define GST_RTP_VRAW_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VRAW_DEPAY,GstRtpVRawDepayClass)) #define GST_IS_RTP_VRAW_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VRAW_DEPAY)) #define GST_IS_RTP_VRAW_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VRAW_DEPAY)) typedef struct _GstRtpVRawDepay GstRtpVRawDepay; typedef struct _GstRtpVRawDepayClass GstRtpVRawDepayClass; struct _GstRtpVRawDepay { GstBaseRTPDepayload payload; gint width, height; GstVideoFormat format; GstBuffer *outbuf; guint32 timestamp; guint outsize; gint pgroup; gint xinc, yinc; guint yp, up, vp; gint ystride; gint uvstride; }; struct _GstRtpVRawDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_vraw_depay_get_type (void); gboolean gst_rtp_vraw_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_VRAW_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/fnv1hash.c0000644000175000017500000000315111671175354015275 00000000000000/* GStreamer * Copyright (C) 2007 Thomas Vander Stichele * * 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 #include "fnv1hash.h" /* This file implements FNV-1 hashing used in the Ogg payload encoders * to generate the 24-bit ident value based on the header pages. * See http://isthe.com/chongo/tech/comp/fnv/ */ #define MASK_24 (((guint32) 1 << 24) -1) #define FNV1_HASH_32_INIT ((guint32) 0x811C9DC5L) //2166136261L) #define FNV1_HASH_32_PRIME 16777619 guint32 fnv1_hash_32_new (void) { return FNV1_HASH_32_INIT; } guint32 fnv1_hash_32_update (guint32 hash, const guchar * data, guint length) { guint i; const guchar *p = data; for (i = 0; i < length; ++i, ++p) { hash *= FNV1_HASH_32_PRIME; hash ^= *p; } return hash; } guint32 fnv1_hash_32_to_24 (guint32 hash) { return (hash >> 24) ^ (hash & MASK_24); } gst-plugins-good-0.10.31/gst/rtp/gstrtpac3pay.c0000644000175000017500000002766311677341656016227 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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 #include #include "gstrtpac3pay.h" GST_DEBUG_CATEGORY_STATIC (rtpac3pay_debug); #define GST_CAT_DEFAULT (rtpac3pay_debug) static GstStaticPadTemplate gst_rtp_ac3_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/ac3; " "audio/x-ac3; ") ); static GstStaticPadTemplate gst_rtp_ac3_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) { 32000, 44100, 48000 }, " "encoding-name = (string) \"AC3\"") ); static void gst_rtp_ac3_pay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_ac3_pay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_ac3_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static gboolean gst_rtp_ac3_pay_handle_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_ac3_pay_flush (GstRtpAC3Pay * rtpac3pay); static GstFlowReturn gst_rtp_ac3_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpAC3Pay, gst_rtp_ac3_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_ac3_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ac3_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_ac3_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP AC3 audio payloader", "Codec/Payloader/Network/RTP", "Payload AC3 audio as RTP packets (RFC 4184)", "Wim Taymans "); } static void gst_rtp_ac3_pay_class_init (GstRtpAC3PayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_ac3_pay_finalize; gstelement_class->change_state = gst_rtp_ac3_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_ac3_pay_setcaps; gstbasertppayload_class->handle_event = gst_rtp_ac3_pay_handle_event; gstbasertppayload_class->handle_buffer = gst_rtp_ac3_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpac3pay_debug, "rtpac3pay", 0, "AC3 Audio RTP Depayloader"); } static void gst_rtp_ac3_pay_init (GstRtpAC3Pay * rtpac3pay, GstRtpAC3PayClass * klass) { rtpac3pay->adapter = gst_adapter_new (); } static void gst_rtp_ac3_pay_finalize (GObject * object) { GstRtpAC3Pay *rtpac3pay; rtpac3pay = GST_RTP_AC3_PAY (object); g_object_unref (rtpac3pay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_rtp_ac3_pay_reset (GstRtpAC3Pay * pay) { pay->first_ts = -1; pay->duration = 0; gst_adapter_clear (pay->adapter); GST_DEBUG_OBJECT (pay, "reset depayloader"); } static gboolean gst_rtp_ac3_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; gint rate; GstStructure *structure; structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "rate", &rate)) rate = 90000; /* default */ gst_basertppayload_set_options (payload, "audio", TRUE, "AC3", rate); res = gst_basertppayload_set_outcaps (payload, NULL); return res; } static gboolean gst_rtp_ac3_pay_handle_event (GstPad * pad, GstEvent * event) { GstRtpAC3Pay *rtpac3pay; rtpac3pay = GST_RTP_AC3_PAY (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* make sure we push the last packets in the adapter on EOS */ gst_rtp_ac3_pay_flush (rtpac3pay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_ac3_pay_reset (rtpac3pay); break; default: break; } gst_object_unref (rtpac3pay); /* FALSE to let the parent handle the event as well */ return FALSE; } struct frmsize_s { guint16 bit_rate; guint16 frm_size[3]; }; static const struct frmsize_s frmsizecod_tbl[] = { {32, {64, 69, 96}}, {32, {64, 70, 96}}, {40, {80, 87, 120}}, {40, {80, 88, 120}}, {48, {96, 104, 144}}, {48, {96, 105, 144}}, {56, {112, 121, 168}}, {56, {112, 122, 168}}, {64, {128, 139, 192}}, {64, {128, 140, 192}}, {80, {160, 174, 240}}, {80, {160, 175, 240}}, {96, {192, 208, 288}}, {96, {192, 209, 288}}, {112, {224, 243, 336}}, {112, {224, 244, 336}}, {128, {256, 278, 384}}, {128, {256, 279, 384}}, {160, {320, 348, 480}}, {160, {320, 349, 480}}, {192, {384, 417, 576}}, {192, {384, 418, 576}}, {224, {448, 487, 672}}, {224, {448, 488, 672}}, {256, {512, 557, 768}}, {256, {512, 558, 768}}, {320, {640, 696, 960}}, {320, {640, 697, 960}}, {384, {768, 835, 1152}}, {384, {768, 836, 1152}}, {448, {896, 975, 1344}}, {448, {896, 976, 1344}}, {512, {1024, 1114, 1536}}, {512, {1024, 1115, 1536}}, {576, {1152, 1253, 1728}}, {576, {1152, 1254, 1728}}, {640, {1280, 1393, 1920}}, {640, {1280, 1394, 1920}} }; static GstFlowReturn gst_rtp_ac3_pay_flush (GstRtpAC3Pay * rtpac3pay) { guint avail, FT, NF, mtu; GstBuffer *outbuf; GstFlowReturn ret; /* the data available in the adapter is either smaller * than the MTU or bigger. In the case it is smaller, the complete * adapter contents can be put in one packet. In the case the * adapter has more than one MTU, we need to split the AC3 data * over multiple packets. */ avail = gst_adapter_available (rtpac3pay->adapter); ret = GST_FLOW_OK; FT = 0; /* number of frames */ NF = rtpac3pay->NF; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpac3pay); GST_LOG_OBJECT (rtpac3pay, "flushing %u bytes", avail); while (avail > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total length of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (2 + avail, 0, 0); /* fill one MTU or all available bytes */ towrite = MIN (packet_len, mtu); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); /* create buffer to hold the payload */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); if (FT == 0) { /* check if it all fits */ if (towrite < packet_len) { guint maxlen; GST_LOG_OBJECT (rtpac3pay, "we need to fragment"); /* check if we will be able to put at least 5/8th of the total * frame in this first frame. */ if ((avail * 5) / 8 >= (payload_len - 2)) FT = 1; else FT = 2; /* check how many fragments we will need */ maxlen = gst_rtp_buffer_calc_payload_len (mtu - 2, 0, 0); NF = (avail + maxlen - 1) / maxlen; } } else if (FT != 3) { /* remaining fragment */ FT = 3; } /* * 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | FT| NF | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * FT: 0: one or more complete frames * 1: initial 5/8 fragment * 2: initial fragment not 5/8 * 3: other fragment * NF: amount of frames if FT = 0, else number of fragments. */ GST_LOG_OBJECT (rtpac3pay, "FT %u, NF %u", FT, NF); payload = gst_rtp_buffer_get_payload (outbuf); payload[0] = (FT & 3); payload[1] = NF; payload_len -= 2; gst_adapter_copy (rtpac3pay->adapter, &payload[2], 0, payload_len); gst_adapter_flush (rtpac3pay->adapter, payload_len); avail -= payload_len; if (avail == 0) gst_rtp_buffer_set_marker (outbuf, TRUE); GST_BUFFER_TIMESTAMP (outbuf) = rtpac3pay->first_ts; GST_BUFFER_DURATION (outbuf) = rtpac3pay->duration; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpac3pay), outbuf); } return ret; } static GstFlowReturn gst_rtp_ac3_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpAC3Pay *rtpac3pay; GstFlowReturn ret; guint size, avail, left, NF; guint8 *data, *p; guint packet_len; GstClockTime duration, timestamp; rtpac3pay = GST_RTP_AC3_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); duration = GST_BUFFER_DURATION (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (rtpac3pay, "DISCONT"); gst_rtp_ac3_pay_reset (rtpac3pay); } /* count the amount of incomming packets */ NF = 0; left = size; p = data; while (TRUE) { guint bsid, fscod, frmsizecod, frame_size; if (left < 6) break; if (p[0] != 0x0b || p[1] != 0x77) break; bsid = p[5] >> 3; if (bsid > 8) break; frmsizecod = p[4] & 0x3f; fscod = p[4] >> 6; GST_DEBUG_OBJECT (rtpac3pay, "fscod %u, %u", fscod, frmsizecod); if (fscod >= 3 || frmsizecod >= 38) break; frame_size = frmsizecod_tbl[frmsizecod].frm_size[fscod] * 2; if (frame_size > left) break; NF++; GST_DEBUG_OBJECT (rtpac3pay, "found frame %u of size %u", NF, frame_size); p += frame_size; left -= frame_size; } if (NF == 0) goto no_frames; avail = gst_adapter_available (rtpac3pay->adapter); /* get packet length of previous data and this new data, * payload length includes a 4 byte header */ packet_len = gst_rtp_buffer_calc_packet_len (2 + avail + size, 0, 0); /* if this buffer is going to overflow the packet, flush what we * have. */ if (gst_basertppayload_is_filled (basepayload, packet_len, rtpac3pay->duration + duration)) { ret = gst_rtp_ac3_pay_flush (rtpac3pay); avail = 0; } else { ret = GST_FLOW_OK; } if (avail == 0) { GST_DEBUG_OBJECT (rtpac3pay, "first packet, save timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); rtpac3pay->first_ts = timestamp; rtpac3pay->duration = 0; rtpac3pay->NF = 0; } gst_adapter_push (rtpac3pay->adapter, buffer); rtpac3pay->duration += duration; rtpac3pay->NF += NF; return ret; /* ERRORS */ no_frames: { GST_WARNING_OBJECT (rtpac3pay, "no valid AC3 frames found"); return GST_FLOW_OK; } } static GstStateChangeReturn gst_rtp_ac3_pay_change_state (GstElement * element, GstStateChange transition) { GstRtpAC3Pay *rtpac3pay; GstStateChangeReturn ret; rtpac3pay = GST_RTP_AC3_PAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_rtp_ac3_pay_reset (rtpac3pay); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_rtp_ac3_pay_reset (rtpac3pay); break; default: break; } return ret; } gboolean gst_rtp_ac3_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpac3pay", GST_RANK_SECONDARY, GST_TYPE_RTP_AC3_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtppcmapay.h0000644000175000017500000000312311671175354016461 00000000000000/* GStreamer * Copyright (C) <2005> Edgard Lima * * 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 */ #ifndef __GST_RTP_PCMA_PAY_H__ #define __GST_RTP_PCMA_PAY_H__ #include #include G_BEGIN_DECLS typedef struct _GstRtpPcmaPay GstRtpPcmaPay; typedef struct _GstRtpPcmaPayClass GstRtpPcmaPayClass; #define GST_TYPE_RTP_PCMA_PAY \ (gst_rtp_pcma_pay_get_type()) #define GST_RTP_PCMA_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_PCMA_PAY,GstRtpPcmaPay)) #define GST_RTP_PCMA_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_PCMA_PAY,GstRtpPcmaPayClass)) #define GST_IS_RTP_PCMA_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_PCMA_PAY)) #define GST_IS_RTP_PCMA_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_PCMA_PAY)) struct _GstRtpPcmaPay { GstBaseRTPAudioPayload audiopayload; }; struct _GstRtpPcmaPayClass { GstBaseRTPAudioPayloadClass parent_class; }; GType gst_rtp_pcma_pay_get_type (void); gboolean gst_rtp_pcma_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_PCMA_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpgstpay.h0000644000175000017500000000341511671175354016342 00000000000000/* GStreamer * Copyright (C) <2010> Wim Taymans * * 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_RTP_GST_PAY_H__ #define __GST_RTP_GST_PAY_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_GST_PAY \ (gst_rtp_gst_pay_get_type()) #define GST_RTP_GST_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GST_PAY,GstRtpGSTPay)) #define GST_RTP_GST_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GST_PAY,GstRtpGSTPayClass)) #define GST_IS_RTP_GST_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GST_PAY)) #define GST_IS_RTP_GST_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GST_PAY)) typedef struct _GstRtpGSTPay GstRtpGSTPay; typedef struct _GstRtpGSTPayClass GstRtpGSTPayClass; struct _GstRtpGSTPay { GstBaseRTPPayload payload; }; struct _GstRtpGSTPayClass { GstBaseRTPPayloadClass parent_class; }; GType gst_rtp_gst_pay_get_type (void); gboolean gst_rtp_gst_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_GST_PAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpdvdepay.h0000644000175000017500000000371111671175354016466 00000000000000/* Farsight * Copyright (C) 2006 Marcel Moreaux * * 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 __GSTRTPDVDEPAY_H__ #define __GSTRTPDVDEPAY_H__ #include #include G_BEGIN_DECLS /* #define's don't like whitespacey bits */ #define GST_TYPE_RTP_DV_DEPAY (gst_rtp_dv_depay_get_type()) #define GST_RTP_DV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_DV_DEPAY,GstRTPDVDepay)) #define GST_RTP_DV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_DV_DEPAY,GstRTPDVDepay)) #define GST_IS_RTP_DV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_DV_DEPAY)) #define GST_IS_RTP_DV_DEPAY_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_DV_DEPAY)) typedef struct _GstRTPDVDepay GstRTPDVDepay; typedef struct _GstRTPDVDepayClass GstRTPDVDepayClass; struct _GstRTPDVDepay { GstBaseRTPDepayload parent; GstBuffer *acc; guint frame_size; guint32 prev_ts; guint8 header_mask; gint width, height; gint rate_num, rate_denom; }; struct _GstRTPDVDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_dv_depay_get_type (void); gboolean gst_rtp_dv_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GSTRTPDVDEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpsirendepay.c0000644000175000017500000000735211677341656017203 00000000000000/* * Siren Depayloader Gst Element * * @author: Youness Alaoui * * 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 #include #include #include "gstrtpsirendepay.h" static GstStaticPadTemplate gst_rtp_siren_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 16000, " "encoding-name = (string) \"SIREN\", " "dct-length = (int) 320") ); static GstStaticPadTemplate gst_rtp_siren_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-siren, " "dct-length = (int) 320") ); static GstBuffer *gst_rtp_siren_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_siren_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); GST_BOILERPLATE (GstRTPSirenDepay, gst_rtp_siren_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_siren_depay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_siren_depay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_siren_depay_sink_template); gst_element_class_set_details_simple (element_class, "RTP Siren packet depayloader", "Codec/Depayloader/Network/RTP", "Extracts Siren audio from RTP packets", "Philippe Kalaf "); } static void gst_rtp_siren_depay_class_init (GstRTPSirenDepayClass * klass) { GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gstbasertpdepayload_class->process = gst_rtp_siren_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_siren_depay_setcaps; } static void gst_rtp_siren_depay_init (GstRTPSirenDepay * rtpsirendepay, GstRTPSirenDepayClass * klass) { } static gboolean gst_rtp_siren_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; gboolean ret; srccaps = gst_caps_new_simple ("audio/x-siren", "dct-length", G_TYPE_INT, 320, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); gst_caps_unref (srccaps); /* always fixed clock rate of 16000 */ depayload->clock_rate = 16000; return ret; } static GstBuffer * gst_rtp_siren_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstBuffer *outbuf; outbuf = gst_rtp_buffer_get_payload_buffer (buf); return outbuf; } gboolean gst_rtp_siren_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpsirendepay", GST_RANK_SECONDARY, GST_TYPE_RTP_SIREN_DEPAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpL16depay.h0000644000175000017500000000403211671175354016414 00000000000000/* GStreamer * Copyright (C) <2007> Wim Taymans * * 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_RTP_L16_DEPAY_H__ #define __GST_RTP_L16_DEPAY_H__ #include #include G_BEGIN_DECLS /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_L16_DEPAY \ (gst_rtp_L16_depay_get_type()) #define GST_RTP_L16_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_DEPAY,GstRtpL16Depay)) #define GST_RTP_L16_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_DEPAY,GstRtpL16DepayClass)) #define GST_IS_RTP_L16_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_DEPAY)) #define GST_IS_RTP_L16_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_DEPAY)) typedef struct _GstRtpL16Depay GstRtpL16Depay; typedef struct _GstRtpL16DepayClass GstRtpL16DepayClass; /* Definition of structure storing data for this element. */ struct _GstRtpL16Depay { GstBaseRTPDepayload depayload; guint rate; guint channels; }; /* Standard definition defining a class for this element. */ struct _GstRtpL16DepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_L16_depay_get_type (void); gboolean gst_rtp_L16_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_L16_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtpmp4apay.c0000644000175000017500000002776611677341656016426 00000000000000/* GStreamer * Copyright (C) <2008> Wim Taymans * * 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 #include #include "gstrtpmp4apay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4apay_debug); #define GST_CAT_DEFAULT (rtpmp4apay_debug) /* FIXME: add framed=(boolean)true once our encoders have this field set * on their output caps */ static GstStaticPadTemplate gst_rtp_mp4a_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, mpegversion=(int)4, " "stream-format=(string)raw") ); static GstStaticPadTemplate gst_rtp_mp4a_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4A-LATM\"" /* All optional parameters * * "cpresent = (string) \"0\"" * "config=" */ ) ); static void gst_rtp_mp4a_pay_finalize (GObject * object); static gboolean gst_rtp_mp4a_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_mp4a_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRtpMP4APay, gst_rtp_mp4a_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD) static void gst_rtp_mp4a_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4a_pay_src_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_mp4a_pay_sink_template); gst_element_class_set_details_simple (element_class, "RTP MPEG4 audio payloader", "Codec/Payloader/Network/RTP", "Payload MPEG4 audio as RTP packets (RFC 3016)", "Wim Taymans "); } static void gst_rtp_mp4a_pay_class_init (GstRtpMP4APayClass * klass) { GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_mp4a_pay_finalize; gstbasertppayload_class->set_caps = gst_rtp_mp4a_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mp4a_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpmp4apay_debug, "rtpmp4apay", 0, "MP4A-LATM RTP Payloader"); } static void gst_rtp_mp4a_pay_init (GstRtpMP4APay * rtpmp4apay, GstRtpMP4APayClass * klass) { rtpmp4apay->rate = 90000; rtpmp4apay->profile = g_strdup ("1"); } static void gst_rtp_mp4a_pay_finalize (GObject * object) { GstRtpMP4APay *rtpmp4apay; rtpmp4apay = GST_RTP_MP4A_PAY (object); g_free (rtpmp4apay->params); rtpmp4apay->params = NULL; if (rtpmp4apay->config) gst_buffer_unref (rtpmp4apay->config); rtpmp4apay->config = NULL; g_free (rtpmp4apay->profile); rtpmp4apay->profile = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static const unsigned int sampling_table[16] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0 }; static gboolean gst_rtp_mp4a_pay_parse_audio_config (GstRtpMP4APay * rtpmp4apay, GstBuffer * buffer) { guint8 *data; guint size; guint8 objectType; guint8 samplingIdx; guint8 channelCfg; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < 2) goto too_short; /* any object type is fine, we need to copy it to the profile-level-id field. */ objectType = (data[0] & 0xf8) >> 3; if (objectType == 0) goto invalid_object; samplingIdx = ((data[0] & 0x07) << 1) | ((data[1] & 0x80) >> 7); /* only fixed values for now */ if (samplingIdx > 12 && samplingIdx != 15) goto wrong_freq; channelCfg = ((data[1] & 0x78) >> 3); if (channelCfg > 7) goto wrong_channels; /* rtp rate depends on sampling rate of the audio */ if (samplingIdx == 15) { if (size < 5) goto too_short; /* index of 15 means we get the rate in the next 24 bits */ rtpmp4apay->rate = ((data[1] & 0x7f) << 17) | ((data[2]) << 9) | ((data[3]) << 1) | ((data[4] & 0x80) >> 7); } else { /* else use the rate from the table */ rtpmp4apay->rate = sampling_table[samplingIdx]; } /* extra rtp params contain the number of channels */ g_free (rtpmp4apay->params); rtpmp4apay->params = g_strdup_printf ("%d", channelCfg); /* audio stream type */ rtpmp4apay->streamtype = "5"; /* profile */ g_free (rtpmp4apay->profile); rtpmp4apay->profile = g_strdup_printf ("%d", objectType); GST_DEBUG_OBJECT (rtpmp4apay, "objectType: %d, samplingIdx: %d (%d), channelCfg: %d", objectType, samplingIdx, rtpmp4apay->rate, channelCfg); return TRUE; /* ERROR */ too_short: { GST_ELEMENT_ERROR (rtpmp4apay, STREAM, FORMAT, (NULL), ("config string too short, expected 2 bytes, got %d", size)); return FALSE; } invalid_object: { GST_ELEMENT_ERROR (rtpmp4apay, STREAM, FORMAT, (NULL), ("invalid object type 0")); return FALSE; } wrong_freq: { GST_ELEMENT_ERROR (rtpmp4apay, STREAM, NOT_IMPLEMENTED, (NULL), ("unsupported frequency index %d", samplingIdx)); return FALSE; } wrong_channels: { GST_ELEMENT_ERROR (rtpmp4apay, STREAM, NOT_IMPLEMENTED, (NULL), ("unsupported number of channels %d, must < 8", channelCfg)); return FALSE; } } static gboolean gst_rtp_mp4a_pay_new_caps (GstRtpMP4APay * rtpmp4apay) { gchar *config; GValue v = { 0 }; gboolean res; g_value_init (&v, GST_TYPE_BUFFER); gst_value_set_buffer (&v, rtpmp4apay->config); config = gst_value_serialize (&v); res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4apay), "cpresent", G_TYPE_STRING, "0", "config", G_TYPE_STRING, config, NULL); g_value_unset (&v); g_free (config); return res; } static gboolean gst_rtp_mp4a_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { GstRtpMP4APay *rtpmp4apay; GstStructure *structure; const GValue *codec_data; gboolean res, framed = TRUE; const gchar *stream_format; rtpmp4apay = GST_RTP_MP4A_PAY (payload); structure = gst_caps_get_structure (caps, 0); /* this is already handled by the template caps, but it is better * to leave here to have meaningful warning messages when linking * fails */ stream_format = gst_structure_get_string (structure, "stream-format"); if (stream_format) { if (strcmp (stream_format, "raw") != 0) { GST_WARNING_OBJECT (rtpmp4apay, "AAC's stream-format must be 'raw', " "%s is not supported", stream_format); return FALSE; } } else { GST_WARNING_OBJECT (rtpmp4apay, "AAC's stream-format not specified, " "assuming 'raw'"); } codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { GST_LOG_OBJECT (rtpmp4apay, "got codec_data"); if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { GstBuffer *buffer, *cbuffer; guint8 *config; guint8 *data; guint size, i; buffer = gst_value_get_buffer (codec_data); GST_LOG_OBJECT (rtpmp4apay, "configuring codec_data"); /* parse buffer */ res = gst_rtp_mp4a_pay_parse_audio_config (rtpmp4apay, buffer); if (!res) goto config_failed; size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); /* make the StreamMuxConfig, we need 15 bits for the header */ config = g_malloc0 (size + 2); /* Create StreamMuxConfig according to ISO/IEC 14496-3: * * audioMuxVersion == 0 (1 bit) * allStreamsSameTimeFraming == 1 (1 bit) * numSubFrames == numSubFrames (6 bits) * numProgram == 0 (4 bits) * numLayer == 0 (3 bits) */ config[0] = 0x40; config[1] = 0x00; /* append the config bits, shifting them 1 bit left */ for (i = 0; i < size; i++) { config[i + 1] |= ((data[i] & 0x80) >> 7); config[i + 2] |= ((data[i] & 0x7f) << 1); } cbuffer = gst_buffer_new (); GST_BUFFER_DATA (cbuffer) = config; GST_BUFFER_MALLOCDATA (cbuffer) = config; GST_BUFFER_SIZE (cbuffer) = size + 2; /* now we can configure the buffer */ if (rtpmp4apay->config) gst_buffer_unref (rtpmp4apay->config); rtpmp4apay->config = cbuffer; } } if (gst_structure_get_boolean (structure, "framed", &framed) && !framed) { GST_WARNING_OBJECT (payload, "Need framed AAC data as input!"); } gst_basertppayload_set_options (payload, "audio", TRUE, "MP4A-LATM", rtpmp4apay->rate); res = gst_rtp_mp4a_pay_new_caps (rtpmp4apay); return res; /* ERRORS */ config_failed: { GST_DEBUG_OBJECT (rtpmp4apay, "failed to parse config"); return FALSE; } } /* we expect buffers as exactly one complete AU */ static GstFlowReturn gst_rtp_mp4a_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpMP4APay *rtpmp4apay; GstFlowReturn ret; GstBuffer *outbuf; guint count, mtu, size; guint8 *data; gboolean fragmented; GstClockTime timestamp; ret = GST_FLOW_OK; rtpmp4apay = GST_RTP_MP4A_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); fragmented = FALSE; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpmp4apay); while (size > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total lenght of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (size, 0, 0); if (!fragmented) { /* first packet calculate space for the packet including the header */ count = size; while (count >= 0xff) { packet_len++; count -= 0xff; } packet_len++; } /* fill one MTU or all available bytes */ towrite = MIN (packet_len, mtu); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); GST_DEBUG_OBJECT (rtpmp4apay, "avail %d, towrite %d, packet_len %d, payload_len %d", size, towrite, packet_len, payload_len); /* create buffer to hold the payload. */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy payload */ payload = gst_rtp_buffer_get_payload (outbuf); if (!fragmented) { /* first packet write the header */ count = size; while (count >= 0xff) { *payload++ = 0xff; payload_len--; count -= 0xff; } *payload++ = count; payload_len--; } /* copy data to payload */ memcpy (payload, data, payload_len); data += payload_len; size -= payload_len; /* marker only if the packet is complete */ gst_rtp_buffer_set_marker (outbuf, size == 0); /* copy incomming timestamp (if any) to outgoing buffers */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4apay), outbuf); fragmented = TRUE; } gst_buffer_unref (buffer); return ret; } gboolean gst_rtp_mp4a_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4apay", GST_RANK_SECONDARY, GST_TYPE_RTP_MP4A_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtppcmupay.c0000644000175000017500000000742011677341656016512 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2005> Edgard Lima * Copyright (C) <2005> Nokia Corporation * * 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 #include #include #include "gstrtppcmupay.h" static GstStaticPadTemplate gst_rtp_pcmu_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-mulaw, channels=(int)1, rate=(int)8000") ); static GstStaticPadTemplate gst_rtp_pcmu_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_PCMU_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMU\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"PCMU\"") ); static gboolean gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); GST_BOILERPLATE (GstRtpPcmuPay, gst_rtp_pcmu_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_pcmu_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcmu_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcmu_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP PCMU payloader", "Codec/Payloader/Network/RTP", "Payload-encodes PCMU audio into a RTP packet", "Edgard Lima "); } static void gst_rtp_pcmu_pay_class_init (GstRtpPcmuPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_pcmu_pay_setcaps; } static void gst_rtp_pcmu_pay_init (GstRtpPcmuPay * rtppcmupay, GstRtpPcmuPayClass * klass) { GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmupay); GST_BASE_RTP_PAYLOAD (rtppcmupay)->clock_rate = 8000; /* tell basertpaudiopayload that this is a sample based codec */ gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); /* octet-per-sample is 1 for PCM */ gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 1); } static gboolean gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; payload->pt = GST_RTP_PAYLOAD_PCMU; gst_basertppayload_set_options (payload, "audio", FALSE, "PCMU", 8000); res = gst_basertppayload_set_outcaps (payload, NULL); return res; } gboolean gst_rtp_pcmu_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtppcmupay", GST_RANK_SECONDARY, GST_TYPE_RTP_PCMU_PAY); } gst-plugins-good-0.10.31/gst/rtp/gstrtpvorbisdepay.h0000644000175000017500000000421011671175354017354 00000000000000/* GStreamer * Copyright (C) <2006> Wim Taymans * * 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_RTP_VORBIS_DEPAY_H__ #define __GST_RTP_VORBIS_DEPAY_H__ #include #include #include G_BEGIN_DECLS #define GST_TYPE_RTP_VORBIS_DEPAY \ (gst_rtp_vorbis_depay_get_type()) #define GST_RTP_VORBIS_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VORBIS_DEPAY,GstRtpVorbisDepay)) #define GST_RTP_VORBIS_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VORBIS_DEPAY,GstRtpVorbisDepayClass)) #define GST_IS_RTP_VORBIS_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VORBIS_DEPAY)) #define GST_IS_RTP_VORBIS_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VORBIS_DEPAY)) typedef struct _GstRtpVorbisDepay GstRtpVorbisDepay; typedef struct _GstRtpVorbisDepayClass GstRtpVorbisDepayClass; typedef struct _GstRtpVorbisConfig { guint32 ident; GList *headers; } GstRtpVorbisConfig; struct _GstRtpVorbisDepay { GstBaseRTPDepayload parent; GList *configs; GstRtpVorbisConfig *config; GstAdapter *adapter; gboolean assembling; }; struct _GstRtpVorbisDepayClass { GstBaseRTPDepayloadClass parent_class; }; GType gst_rtp_vorbis_depay_get_type (void); gboolean gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_VORBIS_DEPAY_H__ */ gst-plugins-good-0.10.31/gst/rtp/gstrtppcmapay.c0000644000175000017500000000741711677341656016474 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2005> Edgard Lima * Copyright (C) <2005> Nokia Corporation * * 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 #include #include #include "gstrtppcmapay.h" static GstStaticPadTemplate gst_rtp_pcma_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-alaw, channels=(int)1, rate=(int)8000") ); static GstStaticPadTemplate gst_rtp_pcma_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_PCMA_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\"; " "application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"PCMA\"") ); static gboolean gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); GST_BOILERPLATE (GstRtpPcmaPay, gst_rtp_pcma_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void gst_rtp_pcma_pay_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcma_pay_sink_template); gst_element_class_add_static_pad_template (element_class, &gst_rtp_pcma_pay_src_template); gst_element_class_set_details_simple (element_class, "RTP PCMA payloader", "Codec/Payloader/Network/RTP", "Payload-encodes PCMA audio into a RTP packet", "Edgard Lima "); } static void gst_rtp_pcma_pay_class_init (GstRtpPcmaPayClass * klass) { GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_pcma_pay_setcaps; } static void gst_rtp_pcma_pay_init (GstRtpPcmaPay * rtppcmapay, GstRtpPcmaPayClass * klass) { GstBaseRTPAudioPayload *basertpaudiopayload; basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmapay); GST_BASE_RTP_PAYLOAD (rtppcmapay)->clock_rate = 8000; /* tell basertpaudiopayload that this is a sample based codec */ gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); /* octet-per-sample is 1 for PCM */ gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 1); } static gboolean gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) { gboolean res; payload->pt = GST_RTP_PAYLOAD_PCMA; gst_basertppayload_set_options (payload, "audio", FALSE, "PCMA", 8000); res = gst_basertppayload_set_outcaps (payload, NULL); return res; } gboolean gst_rtp_pcma_pay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtppcmapay", GST_RANK_SECONDARY, GST_TYPE_RTP_PCMA_PAY); } gst-plugins-good-0.10.31/gst/avi/0000755000175000017500000000000011720565301013433 500000000000000gst-plugins-good-0.10.31/gst/avi/gstavidemux.c0000644000175000017500000050267711677341655016117 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Nokia Corporation (contact ) * Copyright (C) <2009-2010> STEricsson * * 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. */ /* Element-Checklist-Version: 5 */ /** * SECTION:element-avidemux * * Demuxes an .avi file into raw or compressed audio and/or video streams. * * This element supports both push and pull-based scheduling, depending on the * capabilities of the upstream elements. * * * Example launch line * |[ * gst-launch filesrc location=test.avi ! avidemux name=demux demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink demux.video_00 ! queue ! decodebin ! ffmpegcolorspace ! videoscale ! autovideosink * ]| Play (parse and decode) an .avi file and try to output it to * an automatically detected soundcard and videosink. If the AVI file contains * compressed audio or video data, this will only work if you have the * right decoder elements/plugins installed. * * * Last reviewed on 2006-12-29 (0.10.6) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS #include #include #include "gst/riff/riff-media.h" #include "gstavidemux.h" #include "avi-ids.h" #include #include #define DIV_ROUND_UP(s,v) (((s) + ((v)-1)) / (v)) #define GST_AVI_KEYFRAME 1 #define ENTRY_IS_KEYFRAME(e) ((e)->flags == GST_AVI_KEYFRAME) #define ENTRY_SET_KEYFRAME(e) ((e)->flags = GST_AVI_KEYFRAME) #define ENTRY_UNSET_KEYFRAME(e) ((e)->flags = 0) GST_DEBUG_CATEGORY_STATIC (avidemux_debug); #define GST_CAT_DEFAULT avidemux_debug static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-msvideo") ); static void gst_avi_demux_base_init (GstAviDemuxClass * klass); static void gst_avi_demux_class_init (GstAviDemuxClass * klass); static void gst_avi_demux_init (GstAviDemux * avi); static void gst_avi_demux_finalize (GObject * object); static void gst_avi_demux_reset (GstAviDemux * avi); #if 0 static const GstEventMask *gst_avi_demux_get_event_mask (GstPad * pad); #endif static gboolean gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event); static gboolean gst_avi_demux_handle_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_avi_demux_push_event (GstAviDemux * avi, GstEvent * event); #if 0 static const GstFormat *gst_avi_demux_get_src_formats (GstPad * pad); #endif static const GstQueryType *gst_avi_demux_get_src_query_types (GstPad * pad); static gboolean gst_avi_demux_handle_src_query (GstPad * pad, GstQuery * query); static gboolean gst_avi_demux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); static gboolean gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment); static gboolean gst_avi_demux_handle_seek (GstAviDemux * avi, GstPad * pad, GstEvent * event); static gboolean gst_avi_demux_handle_seek_push (GstAviDemux * avi, GstPad * pad, GstEvent * event); static void gst_avi_demux_loop (GstPad * pad); static gboolean gst_avi_demux_sink_activate (GstPad * sinkpad); static gboolean gst_avi_demux_sink_activate_pull (GstPad * sinkpad, gboolean active); static gboolean gst_avi_demux_activate_push (GstPad * pad, gboolean active); static GstFlowReturn gst_avi_demux_chain (GstPad * pad, GstBuffer * buf); static void gst_avi_demux_set_index (GstElement * element, GstIndex * index); static GstIndex *gst_avi_demux_get_index (GstElement * element); static GstStateChangeReturn gst_avi_demux_change_state (GstElement * element, GstStateChange transition); static void gst_avi_demux_calculate_durations_from_index (GstAviDemux * avi); static void gst_avi_demux_get_buffer_info (GstAviDemux * avi, GstAviStream * stream, guint entry_n, GstClockTime * timestamp, GstClockTime * ts_end, guint64 * offset, guint64 * offset_end); static void gst_avi_demux_parse_idit (GstAviDemux * avi, GstBuffer * buf); static GstElementClass *parent_class = NULL; /* GObject methods */ GType gst_avi_demux_get_type (void) { static GType avi_demux_type = 0; if (!avi_demux_type) { static const GTypeInfo avi_demux_info = { sizeof (GstAviDemuxClass), (GBaseInitFunc) gst_avi_demux_base_init, NULL, (GClassInitFunc) gst_avi_demux_class_init, NULL, NULL, sizeof (GstAviDemux), 0, (GInstanceInitFunc) gst_avi_demux_init, }; avi_demux_type = g_type_register_static (GST_TYPE_ELEMENT, "GstAviDemux", &avi_demux_info, 0); } return avi_demux_type; } static void gst_avi_demux_base_init (GstAviDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstPadTemplate *videosrctempl, *audiosrctempl, *subsrctempl; GstCaps *audcaps, *vidcaps, *subcaps; audcaps = gst_riff_create_audio_template_caps (); gst_caps_append (audcaps, gst_caps_new_simple ("audio/x-avi-unknown", NULL)); audiosrctempl = gst_pad_template_new ("audio_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, audcaps); vidcaps = gst_riff_create_video_template_caps (); gst_caps_append (vidcaps, gst_riff_create_iavs_template_caps ()); gst_caps_append (vidcaps, gst_caps_new_simple ("video/x-avi-unknown", NULL)); videosrctempl = gst_pad_template_new ("video_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, vidcaps); subcaps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); subsrctempl = gst_pad_template_new ("subtitle_%02d", GST_PAD_SRC, GST_PAD_SOMETIMES, subcaps); gst_element_class_add_pad_template (element_class, audiosrctempl); gst_element_class_add_pad_template (element_class, videosrctempl); gst_element_class_add_pad_template (element_class, subsrctempl); gst_element_class_add_static_pad_template (element_class, &sink_templ); gst_object_unref (audiosrctempl); gst_object_unref (videosrctempl); gst_object_unref (subsrctempl); gst_element_class_set_details_simple (element_class, "Avi demuxer", "Codec/Demuxer", "Demultiplex an avi file into audio and video", "Erik Walthinsen , " "Wim Taymans , " "Thijs Vermeir "); } static void gst_avi_demux_class_init (GstAviDemuxClass * klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); GObjectClass *gobject_class = (GObjectClass *) klass; GST_DEBUG_CATEGORY_INIT (avidemux_debug, "avidemux", 0, "Demuxer for AVI streams"); parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_avi_demux_finalize; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_avi_demux_change_state); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_avi_demux_set_index); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_avi_demux_get_index); } static void gst_avi_demux_init (GstAviDemux * avi) { avi->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink"); gst_pad_set_activate_function (avi->sinkpad, GST_DEBUG_FUNCPTR (gst_avi_demux_sink_activate)); gst_pad_set_activatepull_function (avi->sinkpad, GST_DEBUG_FUNCPTR (gst_avi_demux_sink_activate_pull)); gst_pad_set_activatepush_function (avi->sinkpad, GST_DEBUG_FUNCPTR (gst_avi_demux_activate_push)); gst_pad_set_chain_function (avi->sinkpad, GST_DEBUG_FUNCPTR (gst_avi_demux_chain)); gst_pad_set_event_function (avi->sinkpad, GST_DEBUG_FUNCPTR (gst_avi_demux_handle_sink_event)); gst_element_add_pad (GST_ELEMENT_CAST (avi), avi->sinkpad); avi->adapter = gst_adapter_new (); gst_avi_demux_reset (avi); } static void gst_avi_demux_finalize (GObject * object) { GstAviDemux *avi = GST_AVI_DEMUX (object); GST_DEBUG ("AVI: finalize"); g_object_unref (avi->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_avi_demux_reset_stream (GstAviDemux * avi, GstAviStream * stream) { g_free (stream->strh); g_free (stream->strf.data); g_free (stream->name); g_free (stream->index); g_free (stream->indexes); if (stream->initdata) gst_buffer_unref (stream->initdata); if (stream->extradata) gst_buffer_unref (stream->extradata); if (stream->pad) { if (stream->exposed) { gst_pad_set_active (stream->pad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (avi), stream->pad); } else gst_object_unref (stream->pad); } if (stream->taglist) { gst_tag_list_free (stream->taglist); stream->taglist = NULL; } memset (stream, 0, sizeof (GstAviStream)); } static void gst_avi_demux_reset (GstAviDemux * avi) { gint i; GST_DEBUG ("AVI: reset"); for (i = 0; i < avi->num_streams; i++) gst_avi_demux_reset_stream (avi, &avi->stream[i]); avi->header_state = GST_AVI_DEMUX_HEADER_TAG_LIST; avi->num_streams = 0; avi->num_v_streams = 0; avi->num_a_streams = 0; avi->num_t_streams = 0; avi->main_stream = -1; avi->state = GST_AVI_DEMUX_START; avi->offset = 0; avi->building_index = FALSE; avi->index_offset = 0; g_free (avi->avih); avi->avih = NULL; if (avi->element_index) gst_object_unref (avi->element_index); avi->element_index = NULL; if (avi->close_seg_event) { gst_event_unref (avi->close_seg_event); avi->close_seg_event = NULL; } if (avi->seg_event) { gst_event_unref (avi->seg_event); avi->seg_event = NULL; } if (avi->seek_event) { gst_event_unref (avi->seek_event); avi->seek_event = NULL; } if (avi->globaltags) gst_tag_list_free (avi->globaltags); avi->globaltags = NULL; avi->got_tags = TRUE; /* we always want to push global tags */ avi->have_eos = FALSE; avi->seekable = TRUE; gst_adapter_clear (avi->adapter); gst_segment_init (&avi->segment, GST_FORMAT_TIME); } /* GstElement methods */ #if 0 static const GstFormat * gst_avi_demux_get_src_formats (GstPad * pad) { GstAviStream *stream = gst_pad_get_element_private (pad); static const GstFormat src_a_formats[] = { GST_FORMAT_TIME, GST_FORMAT_BYTES, GST_FORMAT_DEFAULT, 0 }; static const GstFormat src_v_formats[] = { GST_FORMAT_TIME, GST_FORMAT_DEFAULT, 0 }; return (stream->strh->type == GST_RIFF_FCC_auds ? src_a_formats : src_v_formats); } #endif /* assumes stream->strf.auds->av_bps != 0 */ static inline GstClockTime avi_stream_convert_bytes_to_time_unchecked (GstAviStream * stream, guint64 bytes) { return gst_util_uint64_scale_int (bytes, GST_SECOND, stream->strf.auds->av_bps); } static inline guint64 avi_stream_convert_time_to_bytes_unchecked (GstAviStream * stream, GstClockTime time) { return gst_util_uint64_scale_int (time, stream->strf.auds->av_bps, GST_SECOND); } /* assumes stream->strh->rate != 0 */ static inline GstClockTime avi_stream_convert_frames_to_time_unchecked (GstAviStream * stream, guint64 frames) { return gst_util_uint64_scale (frames, stream->strh->scale * GST_SECOND, stream->strh->rate); } static inline guint64 avi_stream_convert_time_to_frames_unchecked (GstAviStream * stream, GstClockTime time) { return gst_util_uint64_scale (time, stream->strh->rate, stream->strh->scale * GST_SECOND); } static gboolean gst_avi_demux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { GstAviStream *stream = gst_pad_get_element_private (pad); gboolean res = TRUE; GST_LOG_OBJECT (pad, "Received src_format:%s, src_value:%" G_GUINT64_FORMAT ", dest_format:%s", gst_format_get_name (src_format), src_value, gst_format_get_name (*dest_format)); if (G_UNLIKELY (src_format == *dest_format)) { *dest_value = src_value; goto done; } if (G_UNLIKELY (!stream->strh || !stream->strf.data)) { res = FALSE; goto done; } if (G_UNLIKELY (stream->strh->type == GST_RIFF_FCC_vids && (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES))) { res = FALSE; goto done; } switch (src_format) { case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: *dest_value = gst_util_uint64_scale_int (src_value, stream->strf.auds->av_bps, GST_SECOND); break; case GST_FORMAT_DEFAULT: *dest_value = gst_util_uint64_scale_round (src_value, stream->strh->rate, stream->strh->scale * GST_SECOND); break; default: res = FALSE; break; } break; case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_TIME: if (stream->strf.auds->av_bps != 0) { *dest_value = avi_stream_convert_bytes_to_time_unchecked (stream, src_value); } else res = FALSE; break; default: res = FALSE; break; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_TIME: *dest_value = avi_stream_convert_frames_to_time_unchecked (stream, src_value); break; default: res = FALSE; break; } break; default: res = FALSE; } done: GST_LOG_OBJECT (pad, "Returning res:%d dest_format:%s dest_value:%" G_GUINT64_FORMAT, res, gst_format_get_name (*dest_format), *dest_value); return res; } static const GstQueryType * gst_avi_demux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, GST_QUERY_SEEKING, GST_QUERY_CONVERT, 0 }; return src_types; } static gboolean gst_avi_demux_handle_src_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); GstAviStream *stream = gst_pad_get_element_private (pad); if (!stream->strh || !stream->strf.data) return gst_pad_query_default (pad, query); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION:{ gint64 pos = 0; GST_DEBUG ("pos query for stream %u: frames %u, bytes %u", stream->num, stream->current_entry, stream->current_total); /* FIXME, this looks clumsy */ if (stream->strh->type == GST_RIFF_FCC_auds) { if (stream->is_vbr) { /* VBR */ pos = gst_util_uint64_scale ((gint64) stream->current_entry * stream->strh->scale, GST_SECOND, (guint64) stream->strh->rate); GST_DEBUG_OBJECT (avi, "VBR convert frame %u, time %" GST_TIME_FORMAT, stream->current_entry, GST_TIME_ARGS (pos)); } else if (stream->strf.auds->av_bps != 0) { /* CBR */ pos = gst_util_uint64_scale (stream->current_total, GST_SECOND, (guint64) stream->strf.auds->av_bps); GST_DEBUG_OBJECT (avi, "CBR convert bytes %u, time %" GST_TIME_FORMAT, stream->current_total, GST_TIME_ARGS (pos)); } else if (stream->idx_n != 0 && stream->total_bytes != 0) { /* calculate timestamps based on percentage of length */ guint64 xlen = avi->avih->us_frame * avi->avih->tot_frames * GST_USECOND; if (stream->is_vbr) { pos = gst_util_uint64_scale (xlen, stream->current_entry, stream->idx_n); GST_DEBUG_OBJECT (avi, "VBR perc convert frame %u, time %" GST_TIME_FORMAT, stream->current_entry, GST_TIME_ARGS (pos)); } else { pos = gst_util_uint64_scale (xlen, stream->current_total, stream->total_bytes); GST_DEBUG_OBJECT (avi, "CBR perc convert bytes %u, time %" GST_TIME_FORMAT, stream->current_total, GST_TIME_ARGS (pos)); } } else { /* we don't know */ res = FALSE; } } else { if (stream->strh->rate != 0) { pos = gst_util_uint64_scale ((guint64) stream->current_entry * stream->strh->scale, GST_SECOND, (guint64) stream->strh->rate); } else { pos = stream->current_entry * avi->avih->us_frame * GST_USECOND; } } if (res) { GST_DEBUG ("pos query : %" GST_TIME_FORMAT, GST_TIME_ARGS (pos)); gst_query_set_position (query, GST_FORMAT_TIME, pos); } else GST_WARNING ("pos query failed"); break; } case GST_QUERY_DURATION: { GstFormat fmt; GstClockTime duration; /* only act on audio or video streams */ if (stream->strh->type != GST_RIFF_FCC_auds && stream->strh->type != GST_RIFF_FCC_vids) { res = FALSE; break; } /* take stream duration, fall back to avih duration */ if ((duration = stream->duration) == -1) duration = avi->duration; gst_query_parse_duration (query, &fmt, NULL); switch (fmt) { case GST_FORMAT_TIME: gst_query_set_duration (query, fmt, duration); break; case GST_FORMAT_DEFAULT: { gint64 dur; GST_DEBUG_OBJECT (query, "total frames is %" G_GUINT32_FORMAT, stream->idx_n); if (stream->idx_n >= 0) gst_query_set_duration (query, fmt, stream->idx_n); else if (gst_pad_query_convert (pad, GST_FORMAT_TIME, duration, &fmt, &dur)) gst_query_set_duration (query, fmt, dur); break; } default: res = FALSE; break; } break; } case GST_QUERY_SEEKING:{ GstFormat fmt; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); if (fmt == GST_FORMAT_TIME) { gboolean seekable = TRUE; if (avi->streaming) { seekable = avi->seekable; } gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, stream->duration); res = TRUE; } break; } case GST_QUERY_CONVERT:{ GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if ((res = gst_avi_demux_src_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val))) gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); else res = gst_pad_query_default (pad, query); break; } default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (avi); return res; } #if 0 static const GstEventMask * gst_avi_demux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT}, {0,} }; return masks; } #endif static guint64 gst_avi_demux_seek_streams (GstAviDemux * avi, guint64 offset, gboolean before) { GstAviStream *stream; GstIndexEntry *entry; gint i; gint64 val, min = offset; for (i = 0; i < avi->num_streams; i++) { stream = &avi->stream[i]; entry = gst_index_get_assoc_entry (avi->element_index, stream->index_id, before ? GST_INDEX_LOOKUP_BEFORE : GST_INDEX_LOOKUP_AFTER, GST_ASSOCIATION_FLAG_NONE, GST_FORMAT_BYTES, offset); if (before) { if (entry) { gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &val); GST_DEBUG_OBJECT (avi, "stream %d, previous entry at %" G_GUINT64_FORMAT, i, val); if (val < min) min = val; } continue; } if (!entry) { GST_DEBUG_OBJECT (avi, "no position for stream %d, assuming at start", i); stream->current_entry = 0; stream->current_total = 0; continue; } gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &val); GST_DEBUG_OBJECT (avi, "stream %d, next entry at %" G_GUINT64_FORMAT, i, val); gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &val); stream->current_total = val; gst_index_entry_assoc_map (entry, GST_FORMAT_DEFAULT, &val); stream->current_entry = val; } return min; } static guint gst_avi_demux_index_entry_offset_search (GstAviIndexEntry * entry, guint64 * offset) { if (entry->offset < *offset) return -1; else if (entry->offset > *offset) return 1; return 0; } static guint64 gst_avi_demux_seek_streams_index (GstAviDemux * avi, guint64 offset, gboolean before) { GstAviStream *stream; GstAviIndexEntry *entry; gint i; gint64 val, min = offset; guint index = 0; for (i = 0; i < avi->num_streams; i++) { stream = &avi->stream[i]; /* compensate for chunk header */ offset += 8; entry = gst_util_array_binary_search (stream->index, stream->idx_n, sizeof (GstAviIndexEntry), (GCompareDataFunc) gst_avi_demux_index_entry_offset_search, before ? GST_SEARCH_MODE_BEFORE : GST_SEARCH_MODE_AFTER, &offset, NULL); offset -= 8; if (entry) index = entry - stream->index; if (before) { if (entry) { val = stream->index[index].offset; GST_DEBUG_OBJECT (avi, "stream %d, previous entry at %" G_GUINT64_FORMAT, i, val); if (val < min) min = val; } continue; } if (!entry) { GST_DEBUG_OBJECT (avi, "no position for stream %d, assuming at start", i); stream->current_entry = 0; stream->current_total = 0; continue; } val = stream->index[index].offset - 8; GST_DEBUG_OBJECT (avi, "stream %d, next entry at %" G_GUINT64_FORMAT, i, val); stream->current_total = stream->index[index].total; stream->current_entry = index; } return min; } #define GST_AVI_SEEK_PUSH_DISPLACE (4 * GST_SECOND) static gboolean gst_avi_demux_handle_sink_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (avi, "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: { GstFormat format; gdouble rate, arate; gint64 start, stop, time, offset = 0; gboolean update; GstSegment segment; /* some debug output */ gst_segment_init (&segment, GST_FORMAT_UNDEFINED); gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, &start, &stop, &time); gst_segment_set_newsegment_full (&segment, update, rate, arate, format, start, stop, time); GST_DEBUG_OBJECT (avi, "received format %d newsegment %" GST_SEGMENT_FORMAT, format, &segment); /* chain will send initial newsegment after pads have been added */ if (avi->state != GST_AVI_DEMUX_MOVI) { GST_DEBUG_OBJECT (avi, "still starting, eating event"); goto exit; } /* we only expect a BYTE segment, e.g. following a seek */ if (format != GST_FORMAT_BYTES) { GST_DEBUG_OBJECT (avi, "unsupported segment format, ignoring"); goto exit; } if (avi->have_index) { GstAviIndexEntry *entry; guint i = 0, index = 0, k = 0; GstAviStream *stream; /* compensate chunk header, stored index offset points after header */ start += 8; /* find which stream we're on */ do { stream = &avi->stream[i]; /* find the index for start bytes offset */ entry = gst_util_array_binary_search (stream->index, stream->idx_n, sizeof (GstAviIndexEntry), (GCompareDataFunc) gst_avi_demux_index_entry_offset_search, GST_SEARCH_MODE_AFTER, &start, NULL); if (entry == NULL) continue; index = entry - stream->index; /* we are on the stream with a chunk start offset closest to start */ if (!offset || stream->index[index].offset < offset) { offset = stream->index[index].offset; k = i; } /* exact match needs no further searching */ if (stream->index[index].offset == start) break; } while (++i < avi->num_streams); start -= 8; offset -= 8; stream = &avi->stream[k]; /* so we have no idea what is to come, or where we are */ if (!offset) { GST_WARNING_OBJECT (avi, "insufficient index data, forcing EOS"); goto eos; } /* get the ts corresponding to start offset bytes for the stream */ gst_avi_demux_get_buffer_info (avi, stream, index, (GstClockTime *) & time, NULL, NULL, NULL); } else if (avi->element_index) { GstIndexEntry *entry; /* Let's check if we have an index entry for this position */ entry = gst_index_get_assoc_entry (avi->element_index, avi->index_id, GST_INDEX_LOOKUP_AFTER, GST_ASSOCIATION_FLAG_NONE, GST_FORMAT_BYTES, start); /* we can not go where we have not yet been before ... */ if (!entry) { GST_WARNING_OBJECT (avi, "insufficient index data, forcing EOS"); goto eos; } gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &time); gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &offset); } else { GST_WARNING_OBJECT (avi, "no index data, forcing EOS"); goto eos; } stop = GST_CLOCK_TIME_NONE; /* set up segment and send downstream */ gst_segment_set_newsegment_full (&avi->segment, update, rate, arate, GST_FORMAT_TIME, time, stop, time); GST_DEBUG_OBJECT (avi, "Pushing newseg update %d, rate %g, " "applied rate %g, format %d, start %" G_GINT64_FORMAT ", " "stop %" G_GINT64_FORMAT, update, rate, arate, GST_FORMAT_TIME, time, stop); gst_avi_demux_push_event (avi, gst_event_new_new_segment_full (update, rate, arate, GST_FORMAT_TIME, time, stop, time)); GST_DEBUG_OBJECT (avi, "next chunk expected at %" G_GINT64_FORMAT, start); /* adjust state for streaming thread accordingly */ if (avi->have_index) gst_avi_demux_seek_streams_index (avi, offset, FALSE); else gst_avi_demux_seek_streams (avi, offset, FALSE); /* set up streaming thread */ g_assert (offset >= start); avi->offset = start; avi->todrop = offset - start; exit: gst_event_unref (event); res = TRUE; break; eos: /* set up for EOS */ avi->have_eos = TRUE; goto exit; } case GST_EVENT_EOS: { if (avi->state != GST_AVI_DEMUX_MOVI) { gst_event_unref (event); GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("got eos and didn't receive a complete header object")); } else if (!gst_avi_demux_push_event (avi, event)) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("got eos but no streams (yet)")); } break; } case GST_EVENT_FLUSH_STOP: { gint i; gst_adapter_clear (avi->adapter); avi->have_eos = FALSE; for (i = 0; i < avi->num_streams; i++) { avi->stream[i].last_flow = GST_FLOW_OK; avi->stream[i].discont = TRUE; } /* fall through to default case so that the event gets passed downstream */ } default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (avi); return res; } static gboolean gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (avi, "have event type %s: %p on src pad", GST_EVENT_TYPE_NAME (event), event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: if (!avi->streaming) { res = gst_avi_demux_handle_seek (avi, pad, event); } else { res = gst_avi_demux_handle_seek_push (avi, pad, event); } gst_event_unref (event); break; case GST_EVENT_QOS: case GST_EVENT_NAVIGATION: res = FALSE; gst_event_unref (event); break; default: res = gst_pad_event_default (pad, event); break; } gst_object_unref (avi); return res; } /* streaming helper (push) */ /* * gst_avi_demux_peek_chunk_info: * @avi: Avi object * @tag: holder for tag * @size: holder for tag size * * Peek next chunk info (tag and size) * * Returns: TRUE when one chunk info has been got */ static gboolean gst_avi_demux_peek_chunk_info (GstAviDemux * avi, guint32 * tag, guint32 * size) { const guint8 *data = NULL; if (gst_adapter_available (avi->adapter) < 8) return FALSE; data = gst_adapter_peek (avi->adapter, 8); *tag = GST_READ_UINT32_LE (data); *size = GST_READ_UINT32_LE (data + 4); return TRUE; } /* * gst_avi_demux_peek_chunk: * @avi: Avi object * @tag: holder for tag * @size: holder for tag size * * Peek enough data for one full chunk * * Returns: %TRUE when one chunk has been got */ static gboolean gst_avi_demux_peek_chunk (GstAviDemux * avi, guint32 * tag, guint32 * size) { guint32 peek_size = 0; gint available; if (!gst_avi_demux_peek_chunk_info (avi, tag, size)) goto peek_failed; /* size 0 -> empty data buffer would surprise most callers, * large size -> do not bother trying to squeeze that into adapter, * so we throw poor man's exception, which can be caught if caller really * wants to handle 0 size chunk */ if (!(*size) || (*size) >= (1 << 30)) goto strange_size; peek_size = (*size + 1) & ~1; available = gst_adapter_available (avi->adapter); GST_DEBUG_OBJECT (avi, "Need to peek chunk of %d bytes to read chunk %" GST_FOURCC_FORMAT ", %d bytes available", *size, GST_FOURCC_ARGS (*tag), available); if (available < (8 + peek_size)) goto need_more; return TRUE; /* ERRORS */ peek_failed: { GST_INFO_OBJECT (avi, "Failed to peek"); return FALSE; } strange_size: { GST_INFO_OBJECT (avi, "Invalid/unexpected chunk size %d for tag %" GST_FOURCC_FORMAT, *size, GST_FOURCC_ARGS (*tag)); /* chain should give up */ avi->abort_buffering = TRUE; return FALSE; } need_more: { GST_INFO_OBJECT (avi, "need more %d < %" G_GUINT32_FORMAT, available, 8 + peek_size); return FALSE; } } /* AVI init */ /* * gst_avi_demux_parse_file_header: * @element: caller element (used for errors/debug). * @buf: input data to be used for parsing. * * "Open" a RIFF/AVI file. The buffer should be at least 12 * bytes long. Takes ownership of @buf. * * Returns: TRUE if the file is a RIFF/AVI file, FALSE otherwise. * Throws an error, caller should error out (fatal). */ static gboolean gst_avi_demux_parse_file_header (GstElement * element, GstBuffer * buf) { guint32 doctype; GstClockTime stamp; stamp = gst_util_get_timestamp (); /* riff_parse posts an error */ if (!gst_riff_parse_file_header (element, buf, &doctype)) return FALSE; if (doctype != GST_RIFF_RIFF_AVI) goto not_avi; stamp = gst_util_get_timestamp () - stamp; GST_DEBUG_OBJECT (element, "header parsing took %" GST_TIME_FORMAT, GST_TIME_ARGS (stamp)); return TRUE; /* ERRORS */ not_avi: { GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), ("File is not an AVI file: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (doctype))); return FALSE; } } /* * Read AVI file tag when streaming */ static GstFlowReturn gst_avi_demux_stream_init_push (GstAviDemux * avi) { if (gst_adapter_available (avi->adapter) >= 12) { GstBuffer *tmp; tmp = gst_adapter_take_buffer (avi->adapter, 12); GST_DEBUG ("Parsing avi header"); if (!gst_avi_demux_parse_file_header (GST_ELEMENT_CAST (avi), tmp)) { return GST_FLOW_ERROR; } GST_DEBUG ("header ok"); avi->offset += 12; avi->state = GST_AVI_DEMUX_HEADER; } return GST_FLOW_OK; } /* * Read AVI file tag */ static GstFlowReturn gst_avi_demux_stream_init_pull (GstAviDemux * avi) { GstFlowReturn res; GstBuffer *buf = NULL; res = gst_pad_pull_range (avi->sinkpad, avi->offset, 12, &buf); if (res != GST_FLOW_OK) return res; else if (!gst_avi_demux_parse_file_header (GST_ELEMENT_CAST (avi), buf)) goto wrong_header; avi->offset += 12; return GST_FLOW_OK; /* ERRORS */ wrong_header: { GST_DEBUG_OBJECT (avi, "error parsing file header"); return GST_FLOW_ERROR; } } /* AVI header handling */ /* * gst_avi_demux_parse_avih: * @avi: caller element (used for errors/debug). * @buf: input data to be used for parsing. * @avih: pointer to structure (filled in by function) containing * stream information (such as flags, number of streams, etc.). * * Read 'avih' header. Discards buffer after use. * * Returns: TRUE on success, FALSE otherwise. Throws an error if * the header is invalid. The caller should error out * (fatal). */ static gboolean gst_avi_demux_parse_avih (GstAviDemux * avi, GstBuffer * buf, gst_riff_avih ** _avih) { gst_riff_avih *avih; if (buf == NULL) goto no_buffer; if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_avih)) goto avih_too_small; avih = g_memdup (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); #if (G_BYTE_ORDER == G_BIG_ENDIAN) avih->us_frame = GUINT32_FROM_LE (avih->us_frame); avih->max_bps = GUINT32_FROM_LE (avih->max_bps); avih->pad_gran = GUINT32_FROM_LE (avih->pad_gran); avih->flags = GUINT32_FROM_LE (avih->flags); avih->tot_frames = GUINT32_FROM_LE (avih->tot_frames); avih->init_frames = GUINT32_FROM_LE (avih->init_frames); avih->streams = GUINT32_FROM_LE (avih->streams); avih->bufsize = GUINT32_FROM_LE (avih->bufsize); avih->width = GUINT32_FROM_LE (avih->width); avih->height = GUINT32_FROM_LE (avih->height); avih->scale = GUINT32_FROM_LE (avih->scale); avih->rate = GUINT32_FROM_LE (avih->rate); avih->start = GUINT32_FROM_LE (avih->start); avih->length = GUINT32_FROM_LE (avih->length); #endif /* debug stuff */ GST_INFO_OBJECT (avi, "avih tag found:"); GST_INFO_OBJECT (avi, " us_frame %u", avih->us_frame); GST_INFO_OBJECT (avi, " max_bps %u", avih->max_bps); GST_INFO_OBJECT (avi, " pad_gran %u", avih->pad_gran); GST_INFO_OBJECT (avi, " flags 0x%08x", avih->flags); GST_INFO_OBJECT (avi, " tot_frames %u", avih->tot_frames); GST_INFO_OBJECT (avi, " init_frames %u", avih->init_frames); GST_INFO_OBJECT (avi, " streams %u", avih->streams); GST_INFO_OBJECT (avi, " bufsize %u", avih->bufsize); GST_INFO_OBJECT (avi, " width %u", avih->width); GST_INFO_OBJECT (avi, " height %u", avih->height); GST_INFO_OBJECT (avi, " scale %u", avih->scale); GST_INFO_OBJECT (avi, " rate %u", avih->rate); GST_INFO_OBJECT (avi, " start %u", avih->start); GST_INFO_OBJECT (avi, " length %u", avih->length); *_avih = avih; gst_buffer_unref (buf); if (avih->us_frame != 0 && avih->tot_frames != 0) avi->duration = (guint64) avih->us_frame * (guint64) avih->tot_frames * 1000; else avi->duration = GST_CLOCK_TIME_NONE; GST_INFO_OBJECT (avi, " header duration %" GST_TIME_FORMAT, GST_TIME_ARGS (avi->duration)); return TRUE; /* ERRORS */ no_buffer: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("No buffer")); return FALSE; } avih_too_small: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Too small avih (%d available, %d needed)", GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_avih))); gst_buffer_unref (buf); return FALSE; } } /* * gst_avi_demux_parse_superindex: * @avi: caller element (used for debugging/errors). * @buf: input data to use for parsing. * @locations: locations in the file (byte-offsets) that contain * the actual indexes (see get_avi_demux_parse_subindex()). * The array ends with GST_BUFFER_OFFSET_NONE. * * Reads superindex (openDML-2 spec stuff) from the provided data. * * Returns: TRUE on success, FALSE otherwise. Indexes should be skipped * on error, but they are not fatal. */ static gboolean gst_avi_demux_parse_superindex (GstAviDemux * avi, GstBuffer * buf, guint64 ** _indexes) { guint8 *data; guint16 bpe = 16; guint32 num, i; guint64 *indexes; guint size; *_indexes = NULL; size = buf ? GST_BUFFER_SIZE (buf) : 0; if (size < 24) goto too_small; data = GST_BUFFER_DATA (buf); /* check type of index. The opendml2 specs state that * there should be 4 dwords per array entry. Type can be * either frame or field (and we don't care). */ if (GST_READ_UINT16_LE (data) != 4 || (data[2] & 0xfe) != 0x0 || data[3] != 0x0) { GST_WARNING_OBJECT (avi, "Superindex for stream has unexpected " "size_entry %d (bytes) or flags 0x%02x/0x%02x", GST_READ_UINT16_LE (data), data[2], data[3]); bpe = GST_READ_UINT16_LE (data) * 4; } num = GST_READ_UINT32_LE (&data[4]); GST_DEBUG_OBJECT (avi, "got %d indexes", num); /* this can't work out well ... */ if (num > G_MAXUINT32 >> 1 || bpe < 8) { goto invalid_params; } indexes = g_new (guint64, num + 1); for (i = 0; i < num; i++) { if (size < 24 + bpe * (i + 1)) break; indexes[i] = GST_READ_UINT64_LE (&data[24 + bpe * i]); GST_DEBUG_OBJECT (avi, "index %d at %" G_GUINT64_FORMAT, i, indexes[i]); } indexes[i] = GST_BUFFER_OFFSET_NONE; *_indexes = indexes; gst_buffer_unref (buf); return TRUE; /* ERRORS */ too_small: { GST_ERROR_OBJECT (avi, "Not enough data to parse superindex (%d available, 24 needed)", size); if (buf) gst_buffer_unref (buf); return FALSE; } invalid_params: { GST_ERROR_OBJECT (avi, "invalid index parameters (num = %d, bpe = %d)", num, bpe); if (buf) gst_buffer_unref (buf); return FALSE; } } /* add an entry to the index of a stream. @num should be an estimate of the * total amount of index entries for all streams and is used to dynamically * allocate memory for the index entries. */ static inline gboolean gst_avi_demux_add_index (GstAviDemux * avi, GstAviStream * stream, guint num, GstAviIndexEntry * entry) { /* ensure index memory */ if (G_UNLIKELY (stream->idx_n >= stream->idx_max)) { guint idx_max = stream->idx_max; GstAviIndexEntry *new_idx; /* we need to make some more room */ if (idx_max == 0) { /* initial size guess, assume each stream has an equal amount of entries, * overshoot with at least 8K */ idx_max = (num / avi->num_streams) + (8192 / sizeof (GstAviIndexEntry)); } else { idx_max += 8192 / sizeof (GstAviIndexEntry); GST_DEBUG_OBJECT (avi, "expanded index from %u to %u", stream->idx_max, idx_max); } new_idx = g_try_renew (GstAviIndexEntry, stream->index, idx_max); /* out of memory, if this fails stream->index is untouched. */ if (G_UNLIKELY (!new_idx)) return FALSE; /* use new index */ stream->index = new_idx; stream->idx_max = idx_max; } /* update entry total and stream stats. The entry total can be converted to * the timestamp of the entry easily. */ if (stream->strh->type == GST_RIFF_FCC_auds) { gint blockalign; if (stream->is_vbr) { entry->total = stream->total_blocks; } else { entry->total = stream->total_bytes; } blockalign = stream->strf.auds->blockalign; if (blockalign > 0) stream->total_blocks += DIV_ROUND_UP (entry->size, blockalign); else stream->total_blocks++; } else { if (stream->is_vbr) { entry->total = stream->idx_n; } else { entry->total = stream->total_bytes; } } stream->total_bytes += entry->size; if (ENTRY_IS_KEYFRAME (entry)) stream->n_keyframes++; /* and add */ GST_LOG_OBJECT (avi, "Adding stream %u, index entry %d, kf %d, size %u " ", offset %" G_GUINT64_FORMAT ", total %" G_GUINT64_FORMAT, stream->num, stream->idx_n, ENTRY_IS_KEYFRAME (entry), entry->size, entry->offset, entry->total); stream->index[stream->idx_n++] = *entry; return TRUE; } /* given @entry_n in @stream, calculate info such as timestamps and * offsets for the entry. */ static void gst_avi_demux_get_buffer_info (GstAviDemux * avi, GstAviStream * stream, guint entry_n, GstClockTime * timestamp, GstClockTime * ts_end, guint64 * offset, guint64 * offset_end) { GstAviIndexEntry *entry; entry = &stream->index[entry_n]; if (stream->is_vbr) { /* VBR stream next timestamp */ if (stream->strh->type == GST_RIFF_FCC_auds) { if (timestamp) *timestamp = avi_stream_convert_frames_to_time_unchecked (stream, entry->total); if (ts_end) *ts_end = avi_stream_convert_frames_to_time_unchecked (stream, entry->total + 1); } else { if (timestamp) *timestamp = avi_stream_convert_frames_to_time_unchecked (stream, entry_n); if (ts_end) *ts_end = avi_stream_convert_frames_to_time_unchecked (stream, entry_n + 1); } } else if (stream->strh->type == GST_RIFF_FCC_auds) { /* constant rate stream */ if (timestamp) *timestamp = avi_stream_convert_bytes_to_time_unchecked (stream, entry->total); if (ts_end) *ts_end = avi_stream_convert_bytes_to_time_unchecked (stream, entry->total + entry->size); } if (stream->strh->type == GST_RIFF_FCC_vids) { /* video offsets are the frame number */ if (offset) *offset = entry_n; if (offset_end) *offset_end = entry_n + 1; } else { /* no offsets for audio */ if (offset) *offset = -1; if (offset_end) *offset_end = -1; } } /* collect and debug stats about the indexes for all streams. * This method is also responsible for filling in the stream duration * as measured by the amount of index entries. * * Returns TRUE if the index is not empty, else FALSE */ static gboolean gst_avi_demux_do_index_stats (GstAviDemux * avi) { guint total_idx = 0; guint i; #ifndef GST_DISABLE_GST_DEBUG guint total_max = 0; #endif /* get stream stats now */ for (i = 0; i < avi->num_streams; i++) { GstAviStream *stream; if (G_UNLIKELY (!(stream = &avi->stream[i]))) continue; if (G_UNLIKELY (!stream->strh)) continue; if (G_UNLIKELY (!stream->index || stream->idx_n == 0)) continue; /* we interested in the end_ts of the last entry, which is the total * duration of this stream */ gst_avi_demux_get_buffer_info (avi, stream, stream->idx_n - 1, NULL, &stream->idx_duration, NULL, NULL); total_idx += stream->idx_n; #ifndef GST_DISABLE_GST_DEBUG total_max += stream->idx_max; #endif GST_INFO_OBJECT (avi, "Stream %d, dur %" GST_TIME_FORMAT ", %6u entries, " "%5u keyframes, entry size = %2u, total size = %10u, allocated %10u", i, GST_TIME_ARGS (stream->idx_duration), stream->idx_n, stream->n_keyframes, (guint) sizeof (GstAviIndexEntry), (guint) (stream->idx_n * sizeof (GstAviIndexEntry)), (guint) (stream->idx_max * sizeof (GstAviIndexEntry))); } total_idx *= sizeof (GstAviIndexEntry); #ifndef GST_DISABLE_GST_DEBUG total_max *= sizeof (GstAviIndexEntry); #endif GST_INFO_OBJECT (avi, "%u bytes for index vs %u ideally, %u wasted", total_max, total_idx, total_max - total_idx); if (total_idx == 0) { GST_WARNING_OBJECT (avi, "Index is empty !"); return FALSE; } return TRUE; } /* * gst_avi_demux_parse_subindex: * @avi: Avi object * @buf: input data to use for parsing. * @stream: stream context. * @entries_list: a list (returned by the function) containing all the * indexes parsed in this specific subindex. The first * entry is also a pointer to allocated memory that needs * to be free´ed. May be NULL if no supported indexes were * found. * * Reads superindex (openDML-2 spec stuff) from the provided data. * The buffer should contain a GST_RIFF_TAG_ix?? chunk. * * Returns: TRUE on success, FALSE otherwise. Errors are fatal, we * throw an error, caller should bail out asap. */ static gboolean gst_avi_demux_parse_subindex (GstAviDemux * avi, GstAviStream * stream, GstBuffer * buf) { guint8 *data; guint16 bpe; guint32 num, i; guint64 baseoff; guint size; if (!buf) return TRUE; size = GST_BUFFER_SIZE (buf); /* check size */ if (size < 24) goto too_small; data = GST_BUFFER_DATA (buf); /* We don't support index-data yet */ if (data[3] & 0x80) goto not_implemented; /* check type of index. The opendml2 specs state that * there should be 4 dwords per array entry. Type can be * either frame or field (and we don't care). */ bpe = (data[2] & 0x01) ? 12 : 8; if (GST_READ_UINT16_LE (data) != bpe / 4 || (data[2] & 0xfe) != 0x0 || data[3] != 0x1) { GST_WARNING_OBJECT (avi, "Superindex for stream %d has unexpected " "size_entry %d (bytes) or flags 0x%02x/0x%02x", stream->num, GST_READ_UINT16_LE (data), data[2], data[3]); bpe = GST_READ_UINT16_LE (data) * 4; } num = GST_READ_UINT32_LE (&data[4]); baseoff = GST_READ_UINT64_LE (&data[12]); /* If there's nothing, just return ! */ if (num == 0) goto empty_index; GST_INFO_OBJECT (avi, "Parsing subindex, nr_entries = %6d", num); for (i = 0; i < num; i++) { GstAviIndexEntry entry; if (size < 24 + bpe * (i + 1)) break; /* fill in offset and size. offset contains the keyframe flag in the * upper bit*/ entry.offset = baseoff + GST_READ_UINT32_LE (&data[24 + bpe * i]); entry.size = GST_READ_UINT32_LE (&data[24 + bpe * i + 4]); /* handle flags */ if (stream->strh->type == GST_RIFF_FCC_auds) { /* all audio frames are keyframes */ ENTRY_SET_KEYFRAME (&entry); } else { /* else read flags */ entry.flags = (entry.size & 0x80000000) ? 0 : GST_AVI_KEYFRAME; } entry.size &= ~0x80000000; /* and add */ if (G_UNLIKELY (!gst_avi_demux_add_index (avi, stream, num, &entry))) goto out_of_mem; } gst_buffer_unref (buf); return TRUE; /* ERRORS */ too_small: { GST_ERROR_OBJECT (avi, "Not enough data to parse subindex (%d available, 24 needed)", size); gst_buffer_unref (buf); return TRUE; /* continue */ } not_implemented: { GST_ELEMENT_ERROR (avi, STREAM, NOT_IMPLEMENTED, (NULL), ("Subindex-is-data is not implemented")); gst_buffer_unref (buf); return FALSE; } empty_index: { GST_DEBUG_OBJECT (avi, "the index is empty"); gst_buffer_unref (buf); return TRUE; } out_of_mem: { GST_ELEMENT_ERROR (avi, RESOURCE, NO_SPACE_LEFT, (NULL), ("Cannot allocate memory for %u*%u=%u bytes", (guint) sizeof (GstAviIndexEntry), num, (guint) sizeof (GstAviIndexEntry) * num)); gst_buffer_unref (buf); return FALSE; } } /* * Create and push a flushing seek event upstream */ static gboolean perform_seek_to_offset (GstAviDemux * demux, guint64 offset) { GstEvent *event; gboolean res = 0; GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset); event = gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset, GST_SEEK_TYPE_NONE, -1); res = gst_pad_push_event (demux->sinkpad, event); if (res) demux->offset = offset; return res; } /* * Read AVI index when streaming */ static gboolean gst_avi_demux_read_subindexes_push (GstAviDemux * avi) { guint32 tag = 0, size; GstBuffer *buf = NULL; guint odml_stream; GST_DEBUG_OBJECT (avi, "read subindexes for %d streams", avi->num_streams); if (avi->odml_subidxs[avi->odml_subidx] != avi->offset) return FALSE; if (!gst_avi_demux_peek_chunk (avi, &tag, &size)) return TRUE; /* this is the ODML chunk we expect */ odml_stream = avi->odml_stream; if ((tag != GST_MAKE_FOURCC ('i', 'x', '0' + odml_stream / 10, '0' + odml_stream % 10)) && (tag != GST_MAKE_FOURCC ('0' + odml_stream / 10, '0' + odml_stream % 10, 'i', 'x'))) { GST_WARNING_OBJECT (avi, "Not an ix## chunk (%" GST_FOURCC_FORMAT ")", GST_FOURCC_ARGS (tag)); return FALSE; } avi->offset += 8 + GST_ROUND_UP_2 (size); /* flush chunk header so we get just the 'size' payload data */ gst_adapter_flush (avi->adapter, 8); buf = gst_adapter_take_buffer (avi->adapter, size); if (!gst_avi_demux_parse_subindex (avi, &avi->stream[odml_stream], buf)) return FALSE; /* we parsed the index, go to next subindex */ avi->odml_subidx++; if (avi->odml_subidxs[avi->odml_subidx] == GST_BUFFER_OFFSET_NONE) { /* we reached the end of the indexes for this stream, move to the next * stream to handle the first index */ avi->odml_stream++; avi->odml_subidx = 0; if (avi->odml_stream < avi->num_streams) { /* there are more indexes */ avi->odml_subidxs = avi->stream[avi->odml_stream].indexes; } else { /* we're done, get stream stats now */ avi->have_index = gst_avi_demux_do_index_stats (avi); return TRUE; } } /* seek to next index */ return perform_seek_to_offset (avi, avi->odml_subidxs[avi->odml_subidx]); } /* * Read AVI index */ static void gst_avi_demux_read_subindexes_pull (GstAviDemux * avi) { guint32 tag; GstBuffer *buf; gint i, n; GST_DEBUG_OBJECT (avi, "read subindexes for %d streams", avi->num_streams); for (n = 0; n < avi->num_streams; n++) { GstAviStream *stream = &avi->stream[n]; if (stream->indexes == NULL) continue; for (i = 0; stream->indexes[i] != GST_BUFFER_OFFSET_NONE; i++) { if (gst_riff_read_chunk (GST_ELEMENT_CAST (avi), avi->sinkpad, &stream->indexes[i], &tag, &buf) != GST_FLOW_OK) continue; else if ((tag != GST_MAKE_FOURCC ('i', 'x', '0' + stream->num / 10, '0' + stream->num % 10)) && (tag != GST_MAKE_FOURCC ('0' + stream->num / 10, '0' + stream->num % 10, 'i', 'x'))) { /* Some ODML files (created by god knows what muxer) have a ##ix format * instead of the 'official' ix##. They are still valid though. */ GST_WARNING_OBJECT (avi, "Not an ix## chunk (%" GST_FOURCC_FORMAT ")", GST_FOURCC_ARGS (tag)); gst_buffer_unref (buf); continue; } if (!gst_avi_demux_parse_subindex (avi, stream, buf)) continue; } g_free (stream->indexes); stream->indexes = NULL; } /* get stream stats now */ avi->have_index = gst_avi_demux_do_index_stats (avi); } /* * gst_avi_demux_riff_parse_vprp: * @element: caller element (used for debugging/error). * @buf: input data to be used for parsing, stripped from header. * @vprp: a pointer (returned by this function) to a filled-in vprp * structure. Caller should free it. * * Parses a video stream´s vprp. This function takes ownership of @buf. * * Returns: TRUE if parsing succeeded, otherwise FALSE. The stream * should be skipped on error, but it is not fatal. */ static gboolean gst_avi_demux_riff_parse_vprp (GstElement * element, GstBuffer * buf, gst_riff_vprp ** _vprp) { gst_riff_vprp *vprp; gint k; g_return_val_if_fail (buf != NULL, FALSE); g_return_val_if_fail (_vprp != NULL, FALSE); if (GST_BUFFER_SIZE (buf) < G_STRUCT_OFFSET (gst_riff_vprp, field_info)) goto too_small; vprp = g_memdup (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); #if (G_BYTE_ORDER == G_BIG_ENDIAN) vprp->format_token = GUINT32_FROM_LE (vprp->format_token); vprp->standard = GUINT32_FROM_LE (vprp->standard); vprp->vert_rate = GUINT32_FROM_LE (vprp->vert_rate); vprp->hor_t_total = GUINT32_FROM_LE (vprp->hor_t_total); vprp->vert_lines = GUINT32_FROM_LE (vprp->vert_lines); vprp->aspect = GUINT32_FROM_LE (vprp->aspect); vprp->width = GUINT32_FROM_LE (vprp->width); vprp->height = GUINT32_FROM_LE (vprp->height); vprp->fields = GUINT32_FROM_LE (vprp->fields); #endif /* size checking */ /* calculate fields based on size */ k = (GST_BUFFER_SIZE (buf) - G_STRUCT_OFFSET (gst_riff_vprp, field_info)) / vprp->fields; if (vprp->fields > k) { GST_WARNING_OBJECT (element, "vprp header indicated %d fields, only %d available", vprp->fields, k); vprp->fields = k; } if (vprp->fields > GST_RIFF_VPRP_VIDEO_FIELDS) { GST_WARNING_OBJECT (element, "vprp header indicated %d fields, at most %d supported", vprp->fields, GST_RIFF_VPRP_VIDEO_FIELDS); vprp->fields = GST_RIFF_VPRP_VIDEO_FIELDS; } #if (G_BYTE_ORDER == G_BIG_ENDIAN) for (k = 0; k < vprp->fields; k++) { gst_riff_vprp_video_field_desc *fd; fd = &vprp->field_info[k]; fd->compressed_bm_height = GUINT32_FROM_LE (fd->compressed_bm_height); fd->compressed_bm_width = GUINT32_FROM_LE (fd->compressed_bm_width); fd->valid_bm_height = GUINT32_FROM_LE (fd->valid_bm_height); fd->valid_bm_width = GUINT16_FROM_LE (fd->valid_bm_width); fd->valid_bm_x_offset = GUINT16_FROM_LE (fd->valid_bm_x_offset); fd->valid_bm_y_offset = GUINT32_FROM_LE (fd->valid_bm_y_offset); fd->video_x_t_offset = GUINT32_FROM_LE (fd->video_x_t_offset); fd->video_y_start = GUINT32_FROM_LE (fd->video_y_start); } #endif /* debug */ GST_INFO_OBJECT (element, "vprp tag found in context vids:"); GST_INFO_OBJECT (element, " format_token %d", vprp->format_token); GST_INFO_OBJECT (element, " standard %d", vprp->standard); GST_INFO_OBJECT (element, " vert_rate %d", vprp->vert_rate); GST_INFO_OBJECT (element, " hor_t_total %d", vprp->hor_t_total); GST_INFO_OBJECT (element, " vert_lines %d", vprp->vert_lines); GST_INFO_OBJECT (element, " aspect %d:%d", vprp->aspect >> 16, vprp->aspect & 0xffff); GST_INFO_OBJECT (element, " width %d", vprp->width); GST_INFO_OBJECT (element, " height %d", vprp->height); GST_INFO_OBJECT (element, " fields %d", vprp->fields); for (k = 0; k < vprp->fields; k++) { gst_riff_vprp_video_field_desc *fd; fd = &(vprp->field_info[k]); GST_INFO_OBJECT (element, " field %u description:", k); GST_INFO_OBJECT (element, " compressed_bm_height %d", fd->compressed_bm_height); GST_INFO_OBJECT (element, " compressed_bm_width %d", fd->compressed_bm_width); GST_INFO_OBJECT (element, " valid_bm_height %d", fd->valid_bm_height); GST_INFO_OBJECT (element, " valid_bm_width %d", fd->valid_bm_width); GST_INFO_OBJECT (element, " valid_bm_x_offset %d", fd->valid_bm_x_offset); GST_INFO_OBJECT (element, " valid_bm_y_offset %d", fd->valid_bm_y_offset); GST_INFO_OBJECT (element, " video_x_t_offset %d", fd->video_x_t_offset); GST_INFO_OBJECT (element, " video_y_start %d", fd->video_y_start); } gst_buffer_unref (buf); *_vprp = vprp; return TRUE; /* ERRORS */ too_small: { GST_ERROR_OBJECT (element, "Too small vprp (%d available, at least %d needed)", GST_BUFFER_SIZE (buf), (int) G_STRUCT_OFFSET (gst_riff_vprp, field_info)); gst_buffer_unref (buf); return FALSE; } } static void gst_avi_demux_expose_streams (GstAviDemux * avi, gboolean force) { guint i; GST_DEBUG_OBJECT (avi, "force : %d", force); for (i = 0; i < avi->num_streams; i++) { GstAviStream *stream = &avi->stream[i]; if (force || stream->idx_n != 0) { GST_LOG_OBJECT (avi, "Added pad %s with caps %" GST_PTR_FORMAT, GST_PAD_NAME (stream->pad), GST_PAD_CAPS (stream->pad)); gst_element_add_pad ((GstElement *) avi, stream->pad); if (avi->element_index) gst_index_get_writer_id (avi->element_index, GST_OBJECT_CAST (stream->pad), &stream->index_id); stream->exposed = TRUE; if (avi->main_stream == -1) avi->main_stream = i; } else { GST_WARNING_OBJECT (avi, "Stream #%d doesn't have any entry, removing it", i); gst_avi_demux_reset_stream (avi, stream); } } } /* buf contains LIST chunk data, and will be padded to even size, * since some buggy files do not account for the padding of chunks * within a LIST in the size of the LIST */ static inline void gst_avi_demux_roundup_list (GstAviDemux * avi, GstBuffer ** buf) { gint size = GST_BUFFER_SIZE (*buf); if (G_UNLIKELY (size & 1)) { GstBuffer *obuf; GST_DEBUG_OBJECT (avi, "rounding up dubious list size %d", size); obuf = gst_buffer_new_and_alloc (size + 1); memcpy (GST_BUFFER_DATA (obuf), GST_BUFFER_DATA (*buf), size); /* assume 0 padding, at least makes outcome deterministic */ (GST_BUFFER_DATA (obuf))[size] = 0; gst_buffer_replace (buf, obuf); } } /* * gst_avi_demux_parse_stream: * @avi: calling element (used for debugging/errors). * @buf: input buffer used to parse the stream. * * Parses all subchunks in a strl chunk (which defines a single * stream). Discards the buffer after use. This function will * increment the stream counter internally. * * Returns: whether the stream was identified successfully. * Errors are not fatal. It does indicate the stream * was skipped. */ static gboolean gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf) { GstAviStream *stream; GstElementClass *klass; GstPadTemplate *templ; GstBuffer *sub = NULL; guint offset = 4; guint32 tag = 0; gchar *codec_name = NULL, *padname = NULL; const gchar *tag_name; GstCaps *caps = NULL; GstPad *pad; GstElement *element; gboolean got_strh = FALSE, got_strf = FALSE, got_vprp = FALSE; gst_riff_vprp *vprp = NULL; element = GST_ELEMENT_CAST (avi); GST_DEBUG_OBJECT (avi, "Parsing stream"); gst_avi_demux_roundup_list (avi, &buf); if (avi->num_streams >= GST_AVI_DEMUX_MAX_STREAMS) { GST_WARNING_OBJECT (avi, "maximum no of streams (%d) exceeded, ignoring stream", GST_AVI_DEMUX_MAX_STREAMS); gst_buffer_unref (buf); /* not a fatal error, let's say */ return TRUE; } stream = &avi->stream[avi->num_streams]; /* initial settings */ stream->idx_duration = GST_CLOCK_TIME_NONE; stream->hdr_duration = GST_CLOCK_TIME_NONE; stream->duration = GST_CLOCK_TIME_NONE; while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) { /* sub can be NULL if the chunk is empty */ if (sub == NULL) { GST_DEBUG_OBJECT (avi, "ignoring empty chunk %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); continue; } switch (tag) { case GST_RIFF_TAG_strh: { gst_riff_strh *strh; if (got_strh) { GST_WARNING_OBJECT (avi, "Ignoring additional strh chunk"); break; } if (!gst_riff_parse_strh (element, sub, &stream->strh)) { /* ownership given away */ sub = NULL; GST_WARNING_OBJECT (avi, "Failed to parse strh chunk"); goto fail; } sub = NULL; strh = stream->strh; /* sanity check; stream header frame rate matches global header * frame duration */ if (stream->strh->type == GST_RIFF_FCC_vids) { GstClockTime s_dur; GstClockTime h_dur = avi->avih->us_frame * GST_USECOND; s_dur = gst_util_uint64_scale (GST_SECOND, strh->scale, strh->rate); GST_DEBUG_OBJECT (avi, "verifying stream framerate %d/%d, " "frame duration = %d ms", strh->rate, strh->scale, (gint) (s_dur / GST_MSECOND)); if (h_dur > (10 * GST_MSECOND) && (s_dur > 10 * h_dur)) { strh->rate = GST_SECOND / GST_USECOND; strh->scale = h_dur / GST_USECOND; GST_DEBUG_OBJECT (avi, "correcting stream framerate to %d/%d", strh->rate, strh->scale); } } /* determine duration as indicated by header */ stream->hdr_duration = gst_util_uint64_scale ((guint64) strh->length * strh->scale, GST_SECOND, (guint64) strh->rate); GST_INFO ("Stream duration according to header: %" GST_TIME_FORMAT, GST_TIME_ARGS (stream->hdr_duration)); if (stream->hdr_duration == 0) stream->hdr_duration = GST_CLOCK_TIME_NONE; got_strh = TRUE; break; } case GST_RIFF_TAG_strf: { gboolean res = FALSE; if (got_strf) { GST_WARNING_OBJECT (avi, "Ignoring additional strf chunk"); break; } if (!got_strh) { GST_ERROR_OBJECT (avi, "Found strf chunk before strh chunk"); goto fail; } switch (stream->strh->type) { case GST_RIFF_FCC_vids: stream->is_vbr = TRUE; res = gst_riff_parse_strf_vids (element, sub, &stream->strf.vids, &stream->extradata); sub = NULL; GST_DEBUG_OBJECT (element, "marking video as VBR, res %d", res); break; case GST_RIFF_FCC_auds: res = gst_riff_parse_strf_auds (element, sub, &stream->strf.auds, &stream->extradata); sub = NULL; if (!res) break; stream->is_vbr = (stream->strh->samplesize == 0) && stream->strh->scale > 1 && stream->strf.auds->blockalign != 1; GST_DEBUG_OBJECT (element, "marking audio as VBR:%d, res %d", stream->is_vbr, res); /* we need these or we have no way to come up with timestamps */ if ((!stream->is_vbr && !stream->strf.auds->av_bps) || (stream->is_vbr && (!stream->strh->scale || !stream->strh->rate))) { GST_WARNING_OBJECT (element, "invalid audio header, ignoring stream"); goto fail; } /* some more sanity checks */ if (stream->is_vbr) { if (stream->strf.auds->blockalign <= 4) { /* that would mean (too) many frames per chunk, * so not likely set as expected */ GST_DEBUG_OBJECT (element, "suspicious blockalign %d for VBR audio; " "overriding to 1 frame per chunk", stream->strf.auds->blockalign); /* this should top any likely value */ stream->strf.auds->blockalign = (1 << 12); } } break; case GST_RIFF_FCC_iavs: stream->is_vbr = TRUE; res = gst_riff_parse_strf_iavs (element, sub, &stream->strf.iavs, &stream->extradata); sub = NULL; GST_DEBUG_OBJECT (element, "marking iavs as VBR, res %d", res); break; case GST_RIFF_FCC_txts: /* nothing to parse here */ stream->is_vbr = (stream->strh->samplesize == 0) && (stream->strh->scale > 1); res = TRUE; break; default: GST_ERROR_OBJECT (avi, "Don´t know how to handle stream type %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (stream->strh->type)); break; } if (sub) { gst_buffer_unref (sub); sub = NULL; } if (!res) goto fail; got_strf = TRUE; break; } case GST_RIFF_TAG_vprp: { if (got_vprp) { GST_WARNING_OBJECT (avi, "Ignoring additional vprp chunk"); break; } if (!got_strh) { GST_ERROR_OBJECT (avi, "Found vprp chunk before strh chunk"); goto fail; } if (!got_strf) { GST_ERROR_OBJECT (avi, "Found vprp chunk before strf chunk"); goto fail; } if (!gst_avi_demux_riff_parse_vprp (element, sub, &vprp)) { GST_WARNING_OBJECT (avi, "Failed to parse vprp chunk"); /* not considered fatal */ g_free (vprp); vprp = NULL; } else got_vprp = TRUE; sub = NULL; break; } case GST_RIFF_TAG_strd: if (stream->initdata) gst_buffer_unref (stream->initdata); stream->initdata = sub; sub = NULL; break; case GST_RIFF_TAG_strn: g_free (stream->name); if (sub != NULL) { stream->name = g_strndup ((gchar *) GST_BUFFER_DATA (sub), (gsize) GST_BUFFER_SIZE (sub)); gst_buffer_unref (sub); sub = NULL; } else { stream->name = g_strdup (""); } GST_DEBUG_OBJECT (avi, "stream name: %s", stream->name); break; case GST_RIFF_IDIT: gst_avi_demux_parse_idit (avi, sub); break; default: if (tag == GST_MAKE_FOURCC ('i', 'n', 'd', 'x') || tag == GST_MAKE_FOURCC ('i', 'x', '0' + avi->num_streams / 10, '0' + avi->num_streams % 10)) { g_free (stream->indexes); gst_avi_demux_parse_superindex (avi, sub, &stream->indexes); stream->superindex = TRUE; sub = NULL; break; } GST_WARNING_OBJECT (avi, "Unknown stream header tag %" GST_FOURCC_FORMAT ", ignoring", GST_FOURCC_ARGS (tag)); /* fall-through */ case GST_RIFF_TAG_JUNQ: case GST_RIFF_TAG_JUNK: break; } if (sub != NULL) { gst_buffer_unref (sub); sub = NULL; } } if (!got_strh) { GST_WARNING_OBJECT (avi, "Failed to find strh chunk"); goto fail; } if (!got_strf) { GST_WARNING_OBJECT (avi, "Failed to find strf chunk"); goto fail; } /* get class to figure out the template */ klass = GST_ELEMENT_GET_CLASS (avi); /* we now have all info, let´s set up a pad and a caps and be done */ /* create stream name + pad */ switch (stream->strh->type) { case GST_RIFF_FCC_vids:{ guint32 fourcc; fourcc = (stream->strf.vids->compression) ? stream->strf.vids->compression : stream->strh->fcc_handler; padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_riff_create_video_caps (fourcc, stream->strh, stream->strf.vids, stream->extradata, stream->initdata, &codec_name); if (!caps) { caps = gst_caps_new_simple ("video/x-avi-unknown", "fourcc", GST_TYPE_FOURCC, fourcc, NULL); } else if (got_vprp && vprp) { guint32 aspect_n, aspect_d; gint n, d; aspect_n = vprp->aspect >> 16; aspect_d = vprp->aspect & 0xffff; /* calculate the pixel aspect ratio using w/h and aspect ratio */ n = aspect_n * stream->strf.vids->height; d = aspect_d * stream->strf.vids->width; if (n && d) gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, n, d, NULL); /* very local, not needed elsewhere */ g_free (vprp); vprp = NULL; } tag_name = GST_TAG_VIDEO_CODEC; avi->num_v_streams++; break; } case GST_RIFF_FCC_auds:{ padname = g_strdup_printf ("audio_%02d", avi->num_a_streams); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); caps = gst_riff_create_audio_caps (stream->strf.auds->format, stream->strh, stream->strf.auds, stream->extradata, stream->initdata, &codec_name); if (!caps) { caps = gst_caps_new_simple ("audio/x-avi-unknown", "codec_id", G_TYPE_INT, stream->strf.auds->format, NULL); } tag_name = GST_TAG_AUDIO_CODEC; avi->num_a_streams++; break; } case GST_RIFF_FCC_iavs:{ guint32 fourcc = stream->strh->fcc_handler; padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_riff_create_iavs_caps (fourcc, stream->strh, stream->strf.iavs, stream->extradata, stream->initdata, &codec_name); if (!caps) { caps = gst_caps_new_simple ("video/x-avi-unknown", "fourcc", GST_TYPE_FOURCC, fourcc, NULL); } tag_name = GST_TAG_VIDEO_CODEC; avi->num_v_streams++; break; } case GST_RIFF_FCC_txts:{ padname = g_strdup_printf ("subtitle_%02d", avi->num_t_streams); templ = gst_element_class_get_pad_template (klass, "subtitle_%02d"); caps = gst_caps_new_simple ("application/x-subtitle-avi", NULL); tag_name = NULL; avi->num_t_streams++; break; } default: g_return_val_if_reached (FALSE); } /* no caps means no stream */ if (!caps) { GST_ERROR_OBJECT (element, "Did not find caps for stream %s", padname); goto fail; } GST_DEBUG_OBJECT (element, "codec-name=%s", (codec_name ? codec_name : "NULL")); GST_DEBUG_OBJECT (element, "caps=%" GST_PTR_FORMAT, caps); /* set proper settings and add it */ if (stream->pad) gst_object_unref (stream->pad); pad = stream->pad = gst_pad_new_from_template (templ, padname); g_free (padname); gst_pad_use_fixed_caps (pad); #if 0 gst_pad_set_formats_function (pad, GST_DEBUG_FUNCPTR (gst_avi_demux_get_src_formats)); gst_pad_set_event_mask_function (pad, GST_DEBUG_FUNCPTR (gst_avi_demux_get_event_mask)); #endif gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_avi_demux_handle_src_event)); gst_pad_set_query_type_function (pad, GST_DEBUG_FUNCPTR (gst_avi_demux_get_src_query_types)); gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_avi_demux_handle_src_query)); #if 0 gst_pad_set_convert_function (pad, GST_DEBUG_FUNCPTR (gst_avi_demux_src_convert)); #endif stream->num = avi->num_streams; stream->start_entry = 0; stream->step_entry = 0; stream->stop_entry = 0; stream->current_entry = -1; stream->current_total = 0; stream->last_flow = GST_FLOW_OK; stream->discont = TRUE; stream->total_bytes = 0; stream->total_blocks = 0; stream->n_keyframes = 0; stream->idx_n = 0; stream->idx_max = 0; gst_pad_set_element_private (pad, stream); avi->num_streams++; gst_pad_set_caps (pad, caps); gst_pad_set_active (pad, TRUE); gst_caps_unref (caps); /* make tags */ if (codec_name) { if (!stream->taglist) stream->taglist = gst_tag_list_new (); avi->got_tags = TRUE; gst_tag_list_add (stream->taglist, GST_TAG_MERGE_APPEND, tag_name, codec_name, NULL); g_free (codec_name); } gst_buffer_unref (buf); return TRUE; /* ERRORS */ fail: { /* unref any mem that may be in use */ if (buf) gst_buffer_unref (buf); if (sub) gst_buffer_unref (sub); g_free (vprp); g_free (codec_name); gst_avi_demux_reset_stream (avi, stream); avi->num_streams++; return FALSE; } } /* * gst_avi_demux_parse_odml: * @avi: calling element (used for debug/error). * @buf: input buffer to be used for parsing. * * Read an openDML-2.0 extension header. Fills in the frame number * in the avi demuxer object when reading succeeds. */ static void gst_avi_demux_parse_odml (GstAviDemux * avi, GstBuffer * buf) { guint32 tag = 0; guint offset = 4; GstBuffer *sub = NULL; while (gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag, &sub)) { switch (tag) { case GST_RIFF_TAG_dmlh:{ gst_riff_dmlh dmlh, *_dmlh; guint size; /* sub == NULL is possible and means an empty buffer */ size = sub ? GST_BUFFER_SIZE (sub) : 0; /* check size */ if (size < sizeof (gst_riff_dmlh)) { GST_ERROR_OBJECT (avi, "DMLH entry is too small (%d bytes, %d needed)", size, (int) sizeof (gst_riff_dmlh)); goto next; } _dmlh = (gst_riff_dmlh *) GST_BUFFER_DATA (sub); dmlh.totalframes = GST_READ_UINT32_LE (&_dmlh->totalframes); GST_INFO_OBJECT (avi, "dmlh tag found: totalframes: %u", dmlh.totalframes); avi->avih->tot_frames = dmlh.totalframes; goto next; } default: GST_WARNING_OBJECT (avi, "Unknown tag %" GST_FOURCC_FORMAT " in ODML header", GST_FOURCC_ARGS (tag)); /* fall-through */ case GST_RIFF_TAG_JUNQ: case GST_RIFF_TAG_JUNK: next: /* skip and move to next chunk */ if (sub) { gst_buffer_unref (sub); sub = NULL; } break; } } if (buf) gst_buffer_unref (buf); } /* Index helper */ static guint gst_avi_demux_index_last (GstAviDemux * avi, GstAviStream * stream) { return stream->idx_n; } /* find a previous entry in the index with the given flags */ static guint gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream, guint last, gboolean keyframe) { GstAviIndexEntry *entry; guint i; for (i = last; i > 0; i--) { entry = &stream->index[i - 1]; if (!keyframe || ENTRY_IS_KEYFRAME (entry)) { return i - 1; } } return 0; } static guint gst_avi_demux_index_next (GstAviDemux * avi, GstAviStream * stream, guint last, gboolean keyframe) { GstAviIndexEntry *entry; gint i; for (i = last + 1; i < stream->idx_n; i++) { entry = &stream->index[i]; if (!keyframe || ENTRY_IS_KEYFRAME (entry)) { return i; } } return stream->idx_n - 1; } static guint gst_avi_demux_index_entry_search (GstAviIndexEntry * entry, guint64 * total) { if (entry->total < *total) return -1; else if (entry->total > *total) return 1; return 0; } /* * gst_avi_demux_index_for_time: * @avi: Avi object * @stream: the stream * @time: a time position * * Finds the index entry which time is less or equal than the requested time. * Try to avoid binary search when we can convert the time to an index * position directly (for example for video frames with a fixed duration). * * Returns: the found position in the index. */ static guint gst_avi_demux_index_for_time (GstAviDemux * avi, GstAviStream * stream, guint64 time) { guint index = -1; guint64 total; GST_LOG_OBJECT (avi, "search time:%" GST_TIME_FORMAT, GST_TIME_ARGS (time)); /* easy (and common) cases */ if (time == 0 || stream->idx_n == 0) return 0; if (time >= stream->idx_duration) return stream->idx_n - 1; /* figure out where we need to go. For that we convert the time to an * index entry or we convert it to a total and then do a binary search. */ if (stream->is_vbr) { /* VBR stream next timestamp */ if (stream->strh->type == GST_RIFF_FCC_auds) { total = avi_stream_convert_time_to_frames_unchecked (stream, time); } else { index = avi_stream_convert_time_to_frames_unchecked (stream, time); } } else { /* constant rate stream */ total = avi_stream_convert_time_to_bytes_unchecked (stream, time); } if (index == -1) { GstAviIndexEntry *entry; /* no index, find index with binary search on total */ GST_LOG_OBJECT (avi, "binary search for entry with total %" G_GUINT64_FORMAT, total); entry = gst_util_array_binary_search (stream->index, stream->idx_n, sizeof (GstAviIndexEntry), (GCompareDataFunc) gst_avi_demux_index_entry_search, GST_SEARCH_MODE_BEFORE, &total, NULL); if (entry == NULL) { GST_LOG_OBJECT (avi, "not found, assume index 0"); index = 0; } else { index = entry - stream->index; GST_LOG_OBJECT (avi, "found at %u", index); } } else { GST_LOG_OBJECT (avi, "converted time to index %u", index); } return index; } static inline GstAviStream * gst_avi_demux_stream_for_id (GstAviDemux * avi, guint32 id) { guint stream_nr; GstAviStream *stream; /* get the stream for this entry */ stream_nr = CHUNKID_TO_STREAMNR (id); if (G_UNLIKELY (stream_nr >= avi->num_streams)) { GST_WARNING_OBJECT (avi, "invalid stream nr %d", stream_nr); return NULL; } stream = &avi->stream[stream_nr]; if (G_UNLIKELY (!stream->strh)) { GST_WARNING_OBJECT (avi, "Unhandled stream %d, skipping", stream_nr); return NULL; } return stream; } /* * gst_avi_demux_parse_index: * @avi: calling element (used for debugging/errors). * @buf: buffer containing the full index. * * Read index entries from the provided buffer. * The buffer should contain a GST_RIFF_TAG_idx1 chunk. */ static gboolean gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf) { guint8 *data; guint size; guint i, num, n; gst_riff_index_entry *index; GstClockTime stamp; GstAviStream *stream; GstAviIndexEntry entry; guint32 id; if (!buf) return FALSE; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); stamp = gst_util_get_timestamp (); /* see how many items in the index */ num = size / sizeof (gst_riff_index_entry); if (num == 0) goto empty_list; GST_INFO_OBJECT (avi, "Parsing index, nr_entries = %6d", num); index = (gst_riff_index_entry *) data; /* figure out if the index is 0 based or relative to the MOVI start */ entry.offset = GST_READ_UINT32_LE (&index[0].offset); if (entry.offset < avi->offset) { avi->index_offset = avi->offset + 8; GST_DEBUG ("index_offset = %" G_GUINT64_FORMAT, avi->index_offset); } else { avi->index_offset = 0; GST_DEBUG ("index is 0 based"); } for (i = 0, n = 0; i < num; i++) { id = GST_READ_UINT32_LE (&index[i].id); entry.offset = GST_READ_UINT32_LE (&index[i].offset); /* some sanity checks */ if (G_UNLIKELY (id == GST_RIFF_rec || id == 0 || (entry.offset == 0 && n > 0))) continue; /* get the stream for this entry */ stream = gst_avi_demux_stream_for_id (avi, id); if (G_UNLIKELY (!stream)) continue; /* handle offset and size */ entry.offset += avi->index_offset + 8; entry.size = GST_READ_UINT32_LE (&index[i].size); /* handle flags */ if (stream->strh->type == GST_RIFF_FCC_auds) { /* all audio frames are keyframes */ ENTRY_SET_KEYFRAME (&entry); } else { guint32 flags; /* else read flags */ flags = GST_READ_UINT32_LE (&index[i].flags); if (flags & GST_RIFF_IF_KEYFRAME) { ENTRY_SET_KEYFRAME (&entry); } else { ENTRY_UNSET_KEYFRAME (&entry); } } /* and add */ if (G_UNLIKELY (!gst_avi_demux_add_index (avi, stream, num, &entry))) goto out_of_mem; n++; } gst_buffer_unref (buf); /* get stream stats now */ avi->have_index = gst_avi_demux_do_index_stats (avi); stamp = gst_util_get_timestamp () - stamp; GST_DEBUG_OBJECT (avi, "index parsing took %" GST_TIME_FORMAT, GST_TIME_ARGS (stamp)); return TRUE; /* ERRORS */ empty_list: { GST_DEBUG_OBJECT (avi, "empty index"); gst_buffer_unref (buf); return FALSE; } out_of_mem: { GST_ELEMENT_ERROR (avi, RESOURCE, NO_SPACE_LEFT, (NULL), ("Cannot allocate memory for %u*%u=%u bytes", (guint) sizeof (GstAviIndexEntry), num, (guint) sizeof (GstAviIndexEntry) * num)); gst_buffer_unref (buf); return FALSE; } } /* * gst_avi_demux_stream_index: * @avi: avi demuxer object. * * Seeks to index and reads it. */ static void gst_avi_demux_stream_index (GstAviDemux * avi) { GstFlowReturn res; guint64 offset = avi->offset; GstBuffer *buf; guint32 tag; guint32 size; GST_DEBUG ("demux stream index at offset %" G_GUINT64_FORMAT, offset); /* get chunk information */ res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf); if (res != GST_FLOW_OK) goto pull_failed; else if (GST_BUFFER_SIZE (buf) < 8) goto too_small; /* check tag first before blindy trying to read 'size' bytes */ tag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 4); if (tag == GST_RIFF_TAG_LIST) { /* this is the movi tag */ GST_DEBUG_OBJECT (avi, "skip LIST chunk, size %" G_GUINT32_FORMAT, (8 + GST_ROUND_UP_2 (size))); offset += 8 + GST_ROUND_UP_2 (size); gst_buffer_unref (buf); res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf); if (res != GST_FLOW_OK) goto pull_failed; else if (GST_BUFFER_SIZE (buf) < 8) goto too_small; tag = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)); size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buf) + 4); } if (tag != GST_RIFF_TAG_idx1) goto no_index; if (!size) goto zero_index; gst_buffer_unref (buf); GST_DEBUG ("index found at offset %" G_GUINT64_FORMAT, offset); /* read chunk, advance offset */ if (gst_riff_read_chunk (GST_ELEMENT_CAST (avi), avi->sinkpad, &offset, &tag, &buf) != GST_FLOW_OK) return; GST_DEBUG ("will parse index chunk size %u for tag %" GST_FOURCC_FORMAT, GST_BUFFER_SIZE (buf), GST_FOURCC_ARGS (tag)); gst_avi_demux_parse_index (avi, buf); #ifndef GST_DISABLE_GST_DEBUG /* debug our indexes */ { gint i; GstAviStream *stream; for (i = 0; i < avi->num_streams; i++) { stream = &avi->stream[i]; GST_DEBUG_OBJECT (avi, "stream %u: %u frames, %" G_GINT64_FORMAT " bytes", i, stream->idx_n, stream->total_bytes); } } #endif return; /* ERRORS */ pull_failed: { GST_DEBUG_OBJECT (avi, "pull range failed: pos=%" G_GUINT64_FORMAT " size=8", offset); return; } too_small: { GST_DEBUG_OBJECT (avi, "Buffer is too small"); gst_buffer_unref (buf); return; } no_index: { GST_WARNING_OBJECT (avi, "No index data (idx1) after movi chunk, but %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); gst_buffer_unref (buf); return; } zero_index: { GST_WARNING_OBJECT (avi, "Empty index data (idx1) after movi chunk"); gst_buffer_unref (buf); return; } } /* * gst_avi_demux_stream_index_push: * @avi: avi demuxer object. * * Read index. */ static void gst_avi_demux_stream_index_push (GstAviDemux * avi) { guint64 offset = avi->idx1_offset; GstBuffer *buf; guint32 tag; guint32 size; GST_DEBUG ("demux stream index at offset %" G_GUINT64_FORMAT, offset); /* get chunk information */ if (!gst_avi_demux_peek_chunk (avi, &tag, &size)) return; /* check tag first before blindly trying to read 'size' bytes */ if (tag == GST_RIFF_TAG_LIST) { /* this is the movi tag */ GST_DEBUG_OBJECT (avi, "skip LIST chunk, size %" G_GUINT32_FORMAT, (8 + GST_ROUND_UP_2 (size))); avi->idx1_offset = offset + 8 + GST_ROUND_UP_2 (size); /* issue seek to allow chain function to handle it and return! */ perform_seek_to_offset (avi, avi->idx1_offset); return; } if (tag != GST_RIFF_TAG_idx1) goto no_index; GST_DEBUG ("index found at offset %" G_GUINT64_FORMAT, offset); /* flush chunk header */ gst_adapter_flush (avi->adapter, 8); /* read chunk payload */ buf = gst_adapter_take_buffer (avi->adapter, size); if (!buf) goto pull_failed; /* advance offset */ offset += 8 + GST_ROUND_UP_2 (size); GST_DEBUG ("will parse index chunk size %u for tag %" GST_FOURCC_FORMAT, GST_BUFFER_SIZE (buf), GST_FOURCC_ARGS (tag)); avi->offset = avi->first_movi_offset; gst_avi_demux_parse_index (avi, buf); #ifndef GST_DISABLE_GST_DEBUG /* debug our indexes */ { gint i; GstAviStream *stream; for (i = 0; i < avi->num_streams; i++) { stream = &avi->stream[i]; GST_DEBUG_OBJECT (avi, "stream %u: %u frames, %" G_GINT64_FORMAT " bytes", i, stream->idx_n, stream->total_bytes); } } #endif return; /* ERRORS */ pull_failed: { GST_DEBUG_OBJECT (avi, "taking data from adapter failed: pos=%" G_GUINT64_FORMAT " size=%u", offset, size); return; } no_index: { GST_WARNING_OBJECT (avi, "No index data (idx1) after movi chunk, but %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); return; } } /* * gst_avi_demux_peek_tag: * * Returns the tag and size of the next chunk */ static GstFlowReturn gst_avi_demux_peek_tag (GstAviDemux * avi, guint64 offset, guint32 * tag, guint * size) { GstFlowReturn res = GST_FLOW_OK; GstBuffer *buf = NULL; guint bufsize; guint8 *bufdata; res = gst_pad_pull_range (avi->sinkpad, offset, 8, &buf); if (res != GST_FLOW_OK) goto pull_failed; bufsize = GST_BUFFER_SIZE (buf); if (bufsize != 8) goto wrong_size; bufdata = GST_BUFFER_DATA (buf); *tag = GST_READ_UINT32_LE (bufdata); *size = GST_READ_UINT32_LE (bufdata + 4); GST_LOG_OBJECT (avi, "Tag[%" GST_FOURCC_FORMAT "] (size:%d) %" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT, GST_FOURCC_ARGS (*tag), *size, offset + 8, offset + 8 + (gint64) * size); done: gst_buffer_unref (buf); return res; /* ERRORS */ pull_failed: { GST_DEBUG_OBJECT (avi, "pull_ranged returned %s", gst_flow_get_name (res)); return res; } wrong_size: { GST_DEBUG_OBJECT (avi, "got %d bytes which is <> 8 bytes", bufsize); res = GST_FLOW_ERROR; goto done; } } /* * gst_avi_demux_next_data_buffer: * * Returns the offset and size of the next buffer * Position is the position of the buffer (after tag and size) */ static GstFlowReturn gst_avi_demux_next_data_buffer (GstAviDemux * avi, guint64 * offset, guint32 * tag, guint * size) { guint64 off = *offset; guint _size = 0; GstFlowReturn res; do { res = gst_avi_demux_peek_tag (avi, off, tag, &_size); if (res != GST_FLOW_OK) break; if (*tag == GST_RIFF_TAG_LIST || *tag == GST_RIFF_TAG_RIFF) off += 8 + 4; /* skip tag + size + subtag */ else { *offset = off + 8; *size = _size; break; } } while (TRUE); return res; } /* * gst_avi_demux_stream_scan: * @avi: calling element (used for debugging/errors). * * Scan the file for all chunks to "create" a new index. * pull-range based */ static gboolean gst_avi_demux_stream_scan (GstAviDemux * avi) { GstFlowReturn res; GstAviStream *stream; GstFormat format; guint64 pos = 0; guint64 length; gint64 tmplength; guint32 tag = 0; guint num; /* FIXME: * - implement non-seekable source support. */ GST_DEBUG_OBJECT (avi, "Creating index"); /* get the size of the file */ format = GST_FORMAT_BYTES; if (!gst_pad_query_peer_duration (avi->sinkpad, &format, &tmplength)) return FALSE; length = tmplength; /* guess the total amount of entries we expect */ num = 16000; while (TRUE) { GstAviIndexEntry entry; guint size = 0; /* start reading data buffers to find the id and offset */ res = gst_avi_demux_next_data_buffer (avi, &pos, &tag, &size); if (G_UNLIKELY (res != GST_FLOW_OK)) break; /* get stream */ stream = gst_avi_demux_stream_for_id (avi, tag); if (G_UNLIKELY (!stream)) goto next; /* we can't figure out the keyframes, assume they all are */ entry.flags = GST_AVI_KEYFRAME; entry.offset = pos; entry.size = size; /* and add to the index of this stream */ if (G_UNLIKELY (!gst_avi_demux_add_index (avi, stream, num, &entry))) goto out_of_mem; next: /* update position */ pos += GST_ROUND_UP_2 (size); if (G_UNLIKELY (pos > length)) { GST_WARNING_OBJECT (avi, "Stopping index lookup since we are further than EOF"); break; } } /* collect stats */ avi->have_index = gst_avi_demux_do_index_stats (avi); return TRUE; /* ERRORS */ out_of_mem: { GST_ELEMENT_ERROR (avi, RESOURCE, NO_SPACE_LEFT, (NULL), ("Cannot allocate memory for %u*%u=%u bytes", (guint) sizeof (GstAviIndexEntry), num, (guint) sizeof (GstAviIndexEntry) * num)); return FALSE; } } static void gst_avi_demux_calculate_durations_from_index (GstAviDemux * avi) { guint i; GstClockTime total; GstAviStream *stream; total = GST_CLOCK_TIME_NONE; /* all streams start at a timestamp 0 */ for (i = 0; i < avi->num_streams; i++) { GstClockTime duration, hduration; gst_riff_strh *strh; stream = &avi->stream[i]; if (G_UNLIKELY (!stream || !stream->idx_n || !(strh = stream->strh))) continue; /* get header duration for the stream */ hduration = stream->hdr_duration; /* index duration calculated during parsing */ duration = stream->idx_duration; /* now pick a good duration */ if (GST_CLOCK_TIME_IS_VALID (duration)) { /* index gave valid duration, use that */ GST_INFO ("Stream %p duration according to index: %" GST_TIME_FORMAT, stream, GST_TIME_ARGS (duration)); } else { /* fall back to header info to calculate a duration */ duration = hduration; } GST_INFO ("Setting duration of stream #%d to %" GST_TIME_FORMAT, i, GST_TIME_ARGS (duration)); /* set duration for the stream */ stream->duration = duration; /* find total duration */ if (total == GST_CLOCK_TIME_NONE || (GST_CLOCK_TIME_IS_VALID (duration) && duration > total)) total = duration; } if (GST_CLOCK_TIME_IS_VALID (total) && (total > 0)) { /* now update the duration for those streams where we had none */ for (i = 0; i < avi->num_streams; i++) { stream = &avi->stream[i]; if (!GST_CLOCK_TIME_IS_VALID (stream->duration) || stream->duration == 0) { stream->duration = total; GST_INFO ("Stream %p duration according to total: %" GST_TIME_FORMAT, stream, GST_TIME_ARGS (total)); } } } /* and set the total duration in the segment. */ GST_INFO ("Setting total duration to: %" GST_TIME_FORMAT, GST_TIME_ARGS (total)); gst_segment_set_duration (&avi->segment, GST_FORMAT_TIME, total); } /* returns FALSE if there are no pads to deliver event to, * otherwise TRUE (whatever the outcome of event sending), * takes ownership of the event. */ static gboolean gst_avi_demux_push_event (GstAviDemux * avi, GstEvent * event) { gboolean result = FALSE; gint i; GST_DEBUG_OBJECT (avi, "sending %s event to %d streams", GST_EVENT_TYPE_NAME (event), avi->num_streams); for (i = 0; i < avi->num_streams; i++) { GstAviStream *stream = &avi->stream[i]; if (stream->pad) { result = TRUE; gst_pad_push_event (stream->pad, gst_event_ref (event)); } } gst_event_unref (event); return result; } static void gst_avi_demux_check_seekability (GstAviDemux * avi) { GstQuery *query; gboolean seekable = FALSE; gint64 start = -1, stop = -1; query = gst_query_new_seeking (GST_FORMAT_BYTES); if (!gst_pad_peer_query (avi->sinkpad, query)) { GST_DEBUG_OBJECT (avi, "seeking query failed"); goto done; } gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); /* try harder to query upstream size if we didn't get it the first time */ if (seekable && stop == -1) { GstFormat fmt = GST_FORMAT_BYTES; GST_DEBUG_OBJECT (avi, "doing duration query to fix up unset stop"); gst_pad_query_peer_duration (avi->sinkpad, &fmt, &stop); } /* if upstream doesn't know the size, it's likely that it's not seekable in * practice even if it technically may be seekable */ if (seekable && (start != 0 || stop <= start)) { GST_DEBUG_OBJECT (avi, "seekable but unknown start/stop -> disable"); seekable = FALSE; } done: GST_INFO_OBJECT (avi, "seekable: %d (%" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT ")", seekable, start, stop); avi->seekable = seekable; gst_query_unref (query); } /* * Read AVI headers when streaming */ static GstFlowReturn gst_avi_demux_stream_header_push (GstAviDemux * avi) { GstFlowReturn ret = GST_FLOW_OK; guint32 tag = 0; guint32 ltag = 0; guint32 size = 0; const guint8 *data; GstBuffer *buf = NULL, *sub = NULL; guint offset = 4; gint64 stop; gint i; GstTagList *tags = NULL; GST_DEBUG ("Reading and parsing avi headers: %d", avi->header_state); switch (avi->header_state) { case GST_AVI_DEMUX_HEADER_TAG_LIST: if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { avi->offset += 8 + GST_ROUND_UP_2 (size); if (tag != GST_RIFF_TAG_LIST) goto header_no_list; gst_adapter_flush (avi->adapter, 8); /* Find the 'hdrl' LIST tag */ GST_DEBUG ("Reading %d bytes", size); buf = gst_adapter_take_buffer (avi->adapter, size); if (GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)) != GST_RIFF_LIST_hdrl) goto header_no_hdrl; /* mind padding */ if (size & 1) gst_adapter_flush (avi->adapter, 1); GST_DEBUG ("'hdrl' LIST tag found. Parsing next chunk"); gst_avi_demux_roundup_list (avi, &buf); /* the hdrl starts with a 'avih' header */ if (!gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag, &sub)) goto header_no_avih; if (tag != GST_RIFF_TAG_avih) goto header_no_avih; if (!gst_avi_demux_parse_avih (avi, sub, &avi->avih)) goto header_wrong_avih; GST_DEBUG_OBJECT (avi, "AVI header ok, reading elemnts from header"); /* now, read the elements from the header until the end */ while (gst_riff_parse_chunk (GST_ELEMENT_CAST (avi), buf, &offset, &tag, &sub)) { /* sub can be NULL on empty tags */ if (!sub) continue; switch (tag) { case GST_RIFF_TAG_LIST: if (GST_BUFFER_SIZE (sub) < 4) goto next; switch (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub))) { case GST_RIFF_LIST_strl: if (!(gst_avi_demux_parse_stream (avi, sub))) { sub = NULL; GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL), ("failed to parse stream, ignoring")); goto next; } sub = NULL; goto next; case GST_RIFF_LIST_odml: gst_avi_demux_parse_odml (avi, sub); sub = NULL; break; default: GST_WARNING_OBJECT (avi, "Unknown list %" GST_FOURCC_FORMAT " in AVI header", GST_FOURCC_ARGS (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub)))); /* fall-through */ case GST_RIFF_TAG_JUNQ: case GST_RIFF_TAG_JUNK: goto next; } break; case GST_RIFF_IDIT: gst_avi_demux_parse_idit (avi, sub); goto next; default: GST_WARNING_OBJECT (avi, "Unknown off %d tag %" GST_FOURCC_FORMAT " in AVI header", offset, GST_FOURCC_ARGS (tag)); /* fall-through */ case GST_RIFF_TAG_JUNQ: case GST_RIFF_TAG_JUNK: next: /* move to next chunk */ if (sub) gst_buffer_unref (sub); sub = NULL; break; } } gst_buffer_unref (buf); GST_DEBUG ("elements parsed"); /* check parsed streams */ if (avi->num_streams == 0) { goto no_streams; } else if (avi->num_streams != avi->avih->streams) { GST_WARNING_OBJECT (avi, "Stream header mentioned %d streams, but %d available", avi->avih->streams, avi->num_streams); } GST_DEBUG ("Get junk and info next"); avi->header_state = GST_AVI_DEMUX_HEADER_INFO; } else { /* Need more data */ return ret; } /* fall-though */ case GST_AVI_DEMUX_HEADER_INFO: GST_DEBUG_OBJECT (avi, "skipping junk between header and data ..."); while (TRUE) { if (gst_adapter_available (avi->adapter) < 12) return GST_FLOW_OK; data = gst_adapter_peek (avi->adapter, 12); tag = GST_READ_UINT32_LE (data); size = GST_READ_UINT32_LE (data + 4); ltag = GST_READ_UINT32_LE (data + 8); if (tag == GST_RIFF_TAG_LIST) { switch (ltag) { case GST_RIFF_LIST_movi: gst_adapter_flush (avi->adapter, 12); if (!avi->first_movi_offset) avi->first_movi_offset = avi->offset; avi->offset += 12; avi->idx1_offset = avi->offset + size - 4; goto skipping_done; case GST_RIFF_LIST_INFO: GST_DEBUG ("Found INFO chunk"); if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { GST_DEBUG ("got size %d", size); avi->offset += 12; gst_adapter_flush (avi->adapter, 12); if (size > 4) { buf = gst_adapter_take_buffer (avi->adapter, size - 4); /* mind padding */ if (size & 1) gst_adapter_flush (avi->adapter, 1); gst_riff_parse_info (GST_ELEMENT_CAST (avi), buf, &tags); if (tags) { if (avi->globaltags) { gst_tag_list_insert (avi->globaltags, tags, GST_TAG_MERGE_REPLACE); } else { avi->globaltags = tags; } } tags = NULL; gst_buffer_unref (buf); avi->offset += GST_ROUND_UP_2 (size) - 4; } else { GST_DEBUG ("skipping INFO LIST prefix"); } } else { /* Need more data */ return GST_FLOW_OK; } break; default: if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { avi->offset += 8 + GST_ROUND_UP_2 (size); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); // ??? goto iterate; ??? } else { /* Need more data */ return GST_FLOW_OK; } break; } } else { if (gst_avi_demux_peek_chunk (avi, &tag, &size)) { avi->offset += 8 + GST_ROUND_UP_2 (size); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); //goto iterate; } else { /* Need more data */ return GST_FLOW_OK; } } } break; default: GST_WARNING ("unhandled header state: %d", avi->header_state); break; } skipping_done: GST_DEBUG_OBJECT (avi, "skipping done ... (streams=%u, stream[0].indexes=%p)", avi->num_streams, avi->stream[0].indexes); GST_DEBUG ("Found movi chunk. Starting to stream data"); avi->state = GST_AVI_DEMUX_MOVI; /* no indexes in push mode, but it still sets some variables */ gst_avi_demux_calculate_durations_from_index (avi); gst_avi_demux_expose_streams (avi, TRUE); /* prepare all streams for index 0 */ for (i = 0; i < avi->num_streams; i++) avi->stream[i].current_entry = 0; /* create initial NEWSEGMENT event */ if ((stop = avi->segment.stop) == GST_CLOCK_TIME_NONE) stop = avi->segment.duration; GST_DEBUG_OBJECT (avi, "segment stop %" G_GINT64_FORMAT, stop); if (avi->seg_event) gst_event_unref (avi->seg_event); avi->seg_event = gst_event_new_new_segment_full (FALSE, avi->segment.rate, avi->segment.applied_rate, GST_FORMAT_TIME, avi->segment.start, stop, avi->segment.time); gst_avi_demux_check_seekability (avi); /* at this point we know all the streams and we can signal the no more * pads signal */ GST_DEBUG_OBJECT (avi, "signaling no more pads"); gst_element_no_more_pads (GST_ELEMENT_CAST (avi)); return GST_FLOW_OK; /* ERRORS */ no_streams: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("No streams found")); return GST_FLOW_ERROR; } header_no_list: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (no LIST at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return GST_FLOW_ERROR; } header_no_hdrl: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (no hdrl at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); gst_buffer_unref (buf); return GST_FLOW_ERROR; } header_no_avih: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (no avih at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); if (sub) gst_buffer_unref (sub); gst_buffer_unref (buf); return GST_FLOW_ERROR; } header_wrong_avih: { gst_buffer_unref (buf); return GST_FLOW_ERROR; } } static void gst_avi_demux_add_date_tag (GstAviDemux * avi, gint y, gint m, gint d, gint h, gint min, gint s) { GDate *date; GstDateTime *dt; date = g_date_new_dmy (d, m, y); if (!g_date_valid (date)) { /* bogus date */ GST_WARNING_OBJECT (avi, "Refusing to add invalid date %d-%d-%d", y, m, d); g_date_free (date); return; } dt = gst_date_time_new_local_time (y, m, d, h, min, s); if (avi->globaltags == NULL) avi->globaltags = gst_tag_list_new (); gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE, date, NULL); g_date_free (date); if (dt) { gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE_TIME, dt, NULL); gst_date_time_unref (dt); } } static void gst_avi_demux_parse_idit_nums_only (GstAviDemux * avi, gchar * data) { gint y, m, d; gint hr = 0, min = 0, sec = 0; gint ret; GST_DEBUG ("data : '%s'", data); ret = sscanf (data, "%d:%d:%d %d:%d:%d", &y, &m, &d, &hr, &min, &sec); if (ret < 3) { /* Attempt YYYY/MM/DD/ HH:MM variant (found in CASIO cameras) */ ret = sscanf (data, "%04d/%02d/%02d/ %d:%d", &y, &m, &d, &hr, &min); if (ret < 3) { GST_WARNING_OBJECT (avi, "Failed to parse IDIT tag"); return; } } gst_avi_demux_add_date_tag (avi, y, m, d, hr, min, sec); } static gint get_month_num (gchar * data, guint size) { if (g_ascii_strncasecmp (data, "jan", 3) == 0) { return 1; } else if (g_ascii_strncasecmp (data, "feb", 3) == 0) { return 2; } else if (g_ascii_strncasecmp (data, "mar", 3) == 0) { return 3; } else if (g_ascii_strncasecmp (data, "apr", 3) == 0) { return 4; } else if (g_ascii_strncasecmp (data, "may", 3) == 0) { return 5; } else if (g_ascii_strncasecmp (data, "jun", 3) == 0) { return 6; } else if (g_ascii_strncasecmp (data, "jul", 3) == 0) { return 7; } else if (g_ascii_strncasecmp (data, "aug", 3) == 0) { return 8; } else if (g_ascii_strncasecmp (data, "sep", 3) == 0) { return 9; } else if (g_ascii_strncasecmp (data, "oct", 3) == 0) { return 10; } else if (g_ascii_strncasecmp (data, "nov", 3) == 0) { return 11; } else if (g_ascii_strncasecmp (data, "dec", 3) == 0) { return 12; } return 0; } static void gst_avi_demux_parse_idit_text (GstAviDemux * avi, gchar * data) { gint year, month, day; gint hour, min, sec; gint ret; gchar weekday[4]; gchar monthstr[4]; ret = sscanf (data, "%3s %3s %d %d:%d:%d %d", weekday, monthstr, &day, &hour, &min, &sec, &year); if (ret != 7) { GST_WARNING_OBJECT (avi, "Failed to parse IDIT tag"); return; } month = get_month_num (monthstr, strlen (monthstr)); gst_avi_demux_add_date_tag (avi, year, month, day, hour, min, sec); } static void gst_avi_demux_parse_idit (GstAviDemux * avi, GstBuffer * buf) { gchar *data = (gchar *) GST_BUFFER_DATA (buf); guint size = GST_BUFFER_SIZE (buf); gchar *safedata = NULL; /* * According to: * http://www.eden-foundation.org/products/code/film_date_stamp/index.html * * This tag could be in one of the below formats * 2005:08:17 11:42:43 * THU OCT 26 16:46:04 2006 * Mon Mar 3 09:44:56 2008 * * FIXME: Our date tag doesn't include hours */ /* skip eventual initial whitespace */ while (size > 0 && g_ascii_isspace (data[0])) { data++; size--; } if (size == 0) { goto non_parsable; } /* make a safe copy to add a \0 to the end of the string */ safedata = g_strndup (data, size); /* test if the first char is a alpha or a number */ if (g_ascii_isdigit (data[0])) { gst_avi_demux_parse_idit_nums_only (avi, safedata); g_free (safedata); return; } else if (g_ascii_isalpha (data[0])) { gst_avi_demux_parse_idit_text (avi, safedata); g_free (safedata); return; } g_free (safedata); non_parsable: GST_WARNING_OBJECT (avi, "IDIT tag has no parsable info"); } /* * Read full AVI headers. */ static GstFlowReturn gst_avi_demux_stream_header_pull (GstAviDemux * avi) { GstFlowReturn res; GstBuffer *buf, *sub = NULL; guint32 tag; guint offset = 4; gint64 stop; GstElement *element = GST_ELEMENT_CAST (avi); GstClockTime stamp; GstTagList *tags = NULL; stamp = gst_util_get_timestamp (); /* the header consists of a 'hdrl' LIST tag */ res = gst_riff_read_chunk (element, avi->sinkpad, &avi->offset, &tag, &buf); if (res != GST_FLOW_OK) goto pull_range_failed; else if (tag != GST_RIFF_TAG_LIST) goto no_list; else if (GST_BUFFER_SIZE (buf) < 4) goto no_header; GST_DEBUG_OBJECT (avi, "parsing headers"); /* Find the 'hdrl' LIST tag */ while (GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)) != GST_RIFF_LIST_hdrl) { GST_LOG_OBJECT (avi, "buffer contains %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (GST_READ_UINT32_LE (GST_BUFFER_DATA (buf)))); /* Eat up */ gst_buffer_unref (buf); /* read new chunk */ res = gst_riff_read_chunk (element, avi->sinkpad, &avi->offset, &tag, &buf); if (res != GST_FLOW_OK) goto pull_range_failed; else if (tag != GST_RIFF_TAG_LIST) goto no_list; else if (GST_BUFFER_SIZE (buf) < 4) goto no_header; } GST_DEBUG_OBJECT (avi, "hdrl LIST tag found"); gst_avi_demux_roundup_list (avi, &buf); /* the hdrl starts with a 'avih' header */ if (!gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) goto no_avih; else if (tag != GST_RIFF_TAG_avih) goto no_avih; else if (!gst_avi_demux_parse_avih (avi, sub, &avi->avih)) goto invalid_avih; GST_DEBUG_OBJECT (avi, "AVI header ok, reading elements from header"); /* now, read the elements from the header until the end */ while (gst_riff_parse_chunk (element, buf, &offset, &tag, &sub)) { /* sub can be NULL on empty tags */ if (!sub) continue; switch (tag) { case GST_RIFF_TAG_LIST: { guint8 *data; guint32 fourcc; if (GST_BUFFER_SIZE (sub) < 4) goto next; data = GST_BUFFER_DATA (sub); fourcc = GST_READ_UINT32_LE (data); switch (fourcc) { case GST_RIFF_LIST_strl: if (!(gst_avi_demux_parse_stream (avi, sub))) { GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL), ("failed to parse stream, ignoring")); sub = NULL; } sub = NULL; goto next; case GST_RIFF_LIST_odml: gst_avi_demux_parse_odml (avi, sub); sub = NULL; break; case GST_RIFF_LIST_INFO: GST_BUFFER_DATA (sub) = data + 4; GST_BUFFER_SIZE (sub) -= 4; gst_riff_parse_info (element, sub, &tags); if (tags) { if (avi->globaltags) { gst_tag_list_insert (avi->globaltags, tags, GST_TAG_MERGE_REPLACE); } else { avi->globaltags = tags; } } tags = NULL; break; default: GST_WARNING_OBJECT (avi, "Unknown list %" GST_FOURCC_FORMAT " in AVI header", GST_FOURCC_ARGS (fourcc)); GST_MEMDUMP_OBJECT (avi, "Unknown list", GST_BUFFER_DATA (sub), GST_BUFFER_SIZE (sub)); /* fall-through */ case GST_RIFF_TAG_JUNQ: case GST_RIFF_TAG_JUNK: goto next; } break; } case GST_RIFF_IDIT: gst_avi_demux_parse_idit (avi, sub); goto next; default: GST_WARNING_OBJECT (avi, "Unknown tag %" GST_FOURCC_FORMAT " in AVI header at off %d", GST_FOURCC_ARGS (tag), offset); GST_MEMDUMP_OBJECT (avi, "Unknown tag", GST_BUFFER_DATA (sub), GST_BUFFER_SIZE (sub)); /* fall-through */ case GST_RIFF_TAG_JUNQ: case GST_RIFF_TAG_JUNK: next: if (sub) gst_buffer_unref (sub); sub = NULL; break; } } gst_buffer_unref (buf); GST_DEBUG ("elements parsed"); /* check parsed streams */ if (avi->num_streams == 0) goto no_streams; else if (avi->num_streams != avi->avih->streams) { GST_WARNING_OBJECT (avi, "Stream header mentioned %d streams, but %d available", avi->avih->streams, avi->num_streams); } GST_DEBUG_OBJECT (avi, "skipping junk between header and data, offset=%" G_GUINT64_FORMAT, avi->offset); /* Now, find the data (i.e. skip all junk between header and data) */ do { guint size; guint8 *data; guint32 tag, ltag; res = gst_pad_pull_range (avi->sinkpad, avi->offset, 12, &buf); if (res != GST_FLOW_OK) { GST_DEBUG_OBJECT (avi, "pull_range failure while looking for tags"); goto pull_range_failed; } else if (GST_BUFFER_SIZE (buf) < 12) { GST_DEBUG_OBJECT (avi, "got %d bytes which is less than 12 bytes", GST_BUFFER_SIZE (buf)); gst_buffer_unref (buf); return GST_FLOW_ERROR; } data = GST_BUFFER_DATA (buf); tag = GST_READ_UINT32_LE (data); size = GST_READ_UINT32_LE (data + 4); ltag = GST_READ_UINT32_LE (data + 8); GST_DEBUG ("tag %" GST_FOURCC_FORMAT ", size %u", GST_FOURCC_ARGS (tag), size); GST_MEMDUMP ("Tag content", data, GST_BUFFER_SIZE (buf)); gst_buffer_unref (buf); switch (tag) { case GST_RIFF_TAG_LIST:{ switch (ltag) { case GST_RIFF_LIST_movi: GST_DEBUG_OBJECT (avi, "Reached the 'movi' tag, we're done with skipping"); goto skipping_done; case GST_RIFF_LIST_INFO: res = gst_riff_read_chunk (element, avi->sinkpad, &avi->offset, &tag, &buf); if (res != GST_FLOW_OK) { GST_DEBUG_OBJECT (avi, "couldn't read INFO chunk"); goto pull_range_failed; } GST_DEBUG ("got size %u", GST_BUFFER_SIZE (buf)); if (size < 4) { GST_DEBUG ("skipping INFO LIST prefix"); avi->offset += (4 - GST_ROUND_UP_2 (size)); gst_buffer_unref (buf); continue; } sub = gst_buffer_create_sub (buf, 4, GST_BUFFER_SIZE (buf) - 4); gst_riff_parse_info (element, sub, &tags); if (tags) { if (avi->globaltags) { gst_tag_list_insert (avi->globaltags, tags, GST_TAG_MERGE_REPLACE); } else { avi->globaltags = tags; } } tags = NULL; if (sub) { gst_buffer_unref (sub); sub = NULL; } gst_buffer_unref (buf); /* gst_riff_read_chunk() has already advanced avi->offset */ break; default: GST_WARNING_OBJECT (avi, "Skipping unknown list tag %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (ltag)); avi->offset += 8 + GST_ROUND_UP_2 (size); break; } } break; default: GST_WARNING_OBJECT (avi, "Skipping unknown tag %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); /* Fall-through */ case GST_MAKE_FOURCC ('J', 'U', 'N', 'Q'): case GST_MAKE_FOURCC ('J', 'U', 'N', 'K'): /* Only get buffer for debugging if the memdump is needed */ if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= 9) { res = gst_pad_pull_range (avi->sinkpad, avi->offset, size, &buf); if (res != GST_FLOW_OK) { GST_DEBUG_OBJECT (avi, "couldn't read INFO chunk"); goto pull_range_failed; } GST_MEMDUMP ("Junk", GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); gst_buffer_unref (buf); } avi->offset += 8 + GST_ROUND_UP_2 (size); break; } } while (1); skipping_done: GST_DEBUG_OBJECT (avi, "skipping done ... (streams=%u, stream[0].indexes=%p)", avi->num_streams, avi->stream[0].indexes); /* create or read stream index (for seeking) */ if (avi->stream[0].indexes != NULL) { /* we read a super index already (gst_avi_demux_parse_superindex() ) */ gst_avi_demux_read_subindexes_pull (avi); } if (!avi->have_index) { if (avi->avih->flags & GST_RIFF_AVIH_HASINDEX) gst_avi_demux_stream_index (avi); /* still no index, scan */ if (!avi->have_index) { gst_avi_demux_stream_scan (avi); /* still no index.. this is a fatal error for now. * FIXME, we should switch to plain push mode without seeking * instead of failing. */ if (!avi->have_index) goto no_index; } } /* use the indexes now to construct nice durations */ gst_avi_demux_calculate_durations_from_index (avi); gst_avi_demux_expose_streams (avi, FALSE); /* create initial NEWSEGMENT event */ if ((stop = avi->segment.stop) == GST_CLOCK_TIME_NONE) stop = avi->segment.duration; GST_DEBUG_OBJECT (avi, "segment stop %" G_GINT64_FORMAT, stop); /* do initial seek to the default segment values */ gst_avi_demux_do_seek (avi, &avi->segment); /* prepare initial segment */ if (avi->seg_event) gst_event_unref (avi->seg_event); avi->seg_event = gst_event_new_new_segment_full (FALSE, avi->segment.rate, avi->segment.applied_rate, GST_FORMAT_TIME, avi->segment.start, stop, avi->segment.time); stamp = gst_util_get_timestamp () - stamp; GST_DEBUG_OBJECT (avi, "pulling header took %" GST_TIME_FORMAT, GST_TIME_ARGS (stamp)); /* at this point we know all the streams and we can signal the no more * pads signal */ GST_DEBUG_OBJECT (avi, "signaling no more pads"); gst_element_no_more_pads (GST_ELEMENT_CAST (avi)); return GST_FLOW_OK; /* ERRORS */ no_list: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (no LIST at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); gst_buffer_unref (buf); return GST_FLOW_ERROR; } no_header: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (no hdrl at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); gst_buffer_unref (buf); return GST_FLOW_ERROR; } no_avih: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (no avih at start): %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); if (sub) gst_buffer_unref (sub); gst_buffer_unref (buf); return GST_FLOW_ERROR; } invalid_avih: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Invalid AVI header (cannot parse avih at start)")); gst_buffer_unref (buf); return GST_FLOW_ERROR; } no_streams: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("No streams found")); return GST_FLOW_ERROR; } no_index: { GST_WARNING ("file without or too big index"); GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("Could not get/create index")); return GST_FLOW_ERROR; } pull_range_failed: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("pull_range flow reading header: %s", gst_flow_get_name (res))); return GST_FLOW_ERROR; } } /* move a stream to @index */ static void gst_avi_demux_move_stream (GstAviDemux * avi, GstAviStream * stream, GstSegment * segment, guint index) { GST_DEBUG_OBJECT (avi, "Move stream %d to %u", stream->num, index); if (segment->rate < 0.0) { guint next_key; /* Because we don't know the frame order we need to push from the prev keyframe * to the next keyframe. If there is a smart decoder downstream he will notice * that there are too many encoded frames send and return UNEXPECTED when there * are enough decoded frames to fill the segment. */ next_key = gst_avi_demux_index_next (avi, stream, index, TRUE); /* FIXME, we go back to 0, we should look at segment.start. We will however * stop earlier when the see the timestamp < segment.start */ stream->start_entry = 0; stream->step_entry = index; stream->current_entry = index; stream->stop_entry = next_key; GST_DEBUG_OBJECT (avi, "reverse seek: start %u, step %u, stop %u", stream->start_entry, stream->step_entry, stream->stop_entry); } else { stream->start_entry = index; stream->step_entry = index; stream->stop_entry = gst_avi_demux_index_last (avi, stream); } if (stream->current_entry != index) { GST_DEBUG_OBJECT (avi, "Move DISCONT from %u to %u", stream->current_entry, index); stream->current_entry = index; stream->discont = TRUE; } /* update the buffer info */ gst_avi_demux_get_buffer_info (avi, stream, index, &stream->current_timestamp, &stream->current_ts_end, &stream->current_offset, &stream->current_offset_end); GST_DEBUG_OBJECT (avi, "Moved to %u, ts %" GST_TIME_FORMAT ", ts_end %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT ", off_end %" G_GUINT64_FORMAT, index, GST_TIME_ARGS (stream->current_timestamp), GST_TIME_ARGS (stream->current_ts_end), stream->current_offset, stream->current_offset_end); GST_DEBUG_OBJECT (avi, "Seeking to offset %" G_GUINT64_FORMAT, stream->index[index].offset); } /* * Do the actual seeking. */ static gboolean gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment) { GstClockTime seek_time; gboolean keyframe; guint i, index; GstAviStream *stream; seek_time = segment->last_stop; keyframe = !!(segment->flags & GST_SEEK_FLAG_KEY_UNIT); GST_DEBUG_OBJECT (avi, "seek to: %" GST_TIME_FORMAT " keyframe seeking:%d", GST_TIME_ARGS (seek_time), keyframe); /* FIXME, this code assumes the main stream with keyframes is stream 0, * which is mostly correct... */ stream = &avi->stream[avi->main_stream]; /* get the entry index for the requested position */ index = gst_avi_demux_index_for_time (avi, stream, seek_time); GST_DEBUG_OBJECT (avi, "Got entry %u", index); /* check if we are already on a keyframe */ if (!ENTRY_IS_KEYFRAME (&stream->index[index])) { GST_DEBUG_OBJECT (avi, "not keyframe, searching back"); /* now go to the previous keyframe, this is where we should start * decoding from. */ index = gst_avi_demux_index_prev (avi, stream, index, TRUE); GST_DEBUG_OBJECT (avi, "previous keyframe at %u", index); } /* move the main stream to this position */ gst_avi_demux_move_stream (avi, stream, segment, index); if (keyframe) { /* when seeking to a keyframe, we update the result seek time * to the time of the keyframe. */ seek_time = stream->current_timestamp; GST_DEBUG_OBJECT (avi, "keyframe adjusted to %" GST_TIME_FORMAT, GST_TIME_ARGS (seek_time)); } /* the seek time is also the last_stop and stream time when going * forwards */ segment->last_stop = seek_time; if (segment->rate > 0.0) segment->time = seek_time; /* now set DISCONT and align the other streams */ for (i = 0; i < avi->num_streams; i++) { GstAviStream *ostream; ostream = &avi->stream[i]; if ((ostream == stream) || (ostream->index == NULL)) continue; /* get the entry index for the requested position */ index = gst_avi_demux_index_for_time (avi, ostream, seek_time); /* move to previous keyframe */ if (!ENTRY_IS_KEYFRAME (&ostream->index[index])) index = gst_avi_demux_index_prev (avi, ostream, index, TRUE); gst_avi_demux_move_stream (avi, ostream, segment, index); } GST_DEBUG_OBJECT (avi, "done seek to: %" GST_TIME_FORMAT, GST_TIME_ARGS (seek_time)); return TRUE; } /* * Handle seek event in pull mode. */ static gboolean gst_avi_demux_handle_seek (GstAviDemux * avi, GstPad * pad, GstEvent * event) { gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; gint64 cur, stop; gboolean flush; gboolean update; GstSegment seeksegment = { 0, }; gint i; if (event) { GST_DEBUG_OBJECT (avi, "doing seek with event"); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); /* we have to have a format as the segment format. Try to convert * if not. */ if (format != GST_FORMAT_TIME) { GstFormat fmt = GST_FORMAT_TIME; gboolean res = TRUE; if (cur_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (pad, format, cur, &fmt, &cur); if (res && stop_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (pad, format, stop, &fmt, &stop); if (!res) goto no_format; format = fmt; } GST_DEBUG_OBJECT (avi, "seek requested: rate %g cur %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT, rate, GST_TIME_ARGS (cur), GST_TIME_ARGS (stop)); /* FIXME: can we do anything with rate!=1.0 */ } else { GST_DEBUG_OBJECT (avi, "doing seek without event"); flags = 0; rate = 1.0; } /* save flush flag */ flush = flags & GST_SEEK_FLAG_FLUSH; if (flush) { GstEvent *fevent = gst_event_new_flush_start (); /* for a flushing seek, we send a flush_start on all pads. This will * eventually stop streaming with a WRONG_STATE. We can thus eventually * take the STREAM_LOCK. */ GST_DEBUG_OBJECT (avi, "sending flush start"); gst_avi_demux_push_event (avi, gst_event_ref (fevent)); gst_pad_push_event (avi->sinkpad, fevent); } else { /* a non-flushing seek, we PAUSE the task so that we can take the * STREAM_LOCK */ GST_DEBUG_OBJECT (avi, "non flushing seek, pausing task"); gst_pad_pause_task (avi->sinkpad); } /* wait for streaming to stop */ GST_DEBUG_OBJECT (avi, "wait for streaming to stop"); GST_PAD_STREAM_LOCK (avi->sinkpad); /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &avi->segment, sizeof (GstSegment)); if (event) { GST_DEBUG_OBJECT (avi, "configuring seek"); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); } /* do the seek, seeksegment.last_stop contains the new position, this * actually never fails. */ gst_avi_demux_do_seek (avi, &seeksegment); gst_event_replace (&avi->close_seg_event, NULL); if (flush) { GstEvent *fevent = gst_event_new_flush_stop (); GST_DEBUG_OBJECT (avi, "sending flush stop"); gst_avi_demux_push_event (avi, gst_event_ref (fevent)); gst_pad_push_event (avi->sinkpad, fevent); } else if (avi->segment_running) { /* we are running the current segment and doing a non-flushing seek, * close the segment first based on the last_stop. */ GST_DEBUG_OBJECT (avi, "closing running segment %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, avi->segment.start, avi->segment.last_stop); avi->close_seg_event = gst_event_new_new_segment_full (TRUE, avi->segment.rate, avi->segment.applied_rate, avi->segment.format, avi->segment.start, avi->segment.last_stop, avi->segment.time); } /* now update the real segment info */ memcpy (&avi->segment, &seeksegment, sizeof (GstSegment)); /* post the SEGMENT_START message when we do segmented playback */ if (avi->segment.flags & GST_SEEK_FLAG_SEGMENT) { gst_element_post_message (GST_ELEMENT_CAST (avi), gst_message_new_segment_start (GST_OBJECT_CAST (avi), avi->segment.format, avi->segment.last_stop)); } /* prepare for streaming again */ if ((stop = avi->segment.stop) == GST_CLOCK_TIME_NONE) stop = avi->segment.duration; /* queue the segment event for the streaming thread. */ if (avi->seg_event) gst_event_unref (avi->seg_event); if (avi->segment.rate > 0.0) { /* forwards goes from last_stop to stop */ avi->seg_event = gst_event_new_new_segment_full (FALSE, avi->segment.rate, avi->segment.applied_rate, avi->segment.format, avi->segment.last_stop, stop, avi->segment.time); } else { /* reverse goes from start to last_stop */ avi->seg_event = gst_event_new_new_segment_full (FALSE, avi->segment.rate, avi->segment.applied_rate, avi->segment.format, avi->segment.start, avi->segment.last_stop, avi->segment.time); } if (!avi->streaming) { avi->segment_running = TRUE; gst_pad_start_task (avi->sinkpad, (GstTaskFunction) gst_avi_demux_loop, avi->sinkpad); } /* reset the last flow and mark discont, seek is always DISCONT */ for (i = 0; i < avi->num_streams; i++) { GST_DEBUG_OBJECT (avi, "marking DISCONT"); avi->stream[i].last_flow = GST_FLOW_OK; avi->stream[i].discont = TRUE; } GST_PAD_STREAM_UNLOCK (avi->sinkpad); return TRUE; /* ERRORS */ no_format: { GST_DEBUG_OBJECT (avi, "unsupported format given, seek aborted."); return FALSE; } } /* * Handle seek event in push mode. */ static gboolean avi_demux_handle_seek_push (GstAviDemux * avi, GstPad * pad, GstEvent * event) { gdouble rate; GstFormat format; GstSeekFlags flags; GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type; gint64 cur, stop; gboolean keyframe; GstAviStream *stream; guint index; guint n, str_num; guint64 min_offset; GstSegment seeksegment; gboolean update; /* check we have the index */ if (!avi->have_index) { GST_DEBUG_OBJECT (avi, "no seek index built, seek aborted."); return FALSE; } else { GST_DEBUG_OBJECT (avi, "doing push-based seek with event"); } gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); if (format != GST_FORMAT_TIME) { GstFormat fmt = GST_FORMAT_TIME; gboolean res = TRUE; if (cur_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (pad, format, cur, &fmt, &cur); if (res && stop_type != GST_SEEK_TYPE_NONE) res = gst_pad_query_convert (pad, format, stop, &fmt, &stop); if (!res) { GST_DEBUG_OBJECT (avi, "unsupported format given, seek aborted."); return FALSE; } format = fmt; } /* let gst_segment handle any tricky stuff */ GST_DEBUG_OBJECT (avi, "configuring seek"); memcpy (&seeksegment, &avi->segment, sizeof (GstSegment)); gst_segment_set_seek (&seeksegment, rate, format, flags, cur_type, cur, stop_type, stop, &update); keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT); cur = seeksegment.last_stop; GST_DEBUG_OBJECT (avi, "Seek requested: ts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT ", kf %u, rate %lf", GST_TIME_ARGS (cur), GST_TIME_ARGS (stop), keyframe, rate); if (rate < 0) { GST_DEBUG_OBJECT (avi, "negative rate seek not supported in push mode"); return FALSE; } /* FIXME, this code assumes the main stream with keyframes is stream 0, * which is mostly correct... */ str_num = avi->main_stream; stream = &avi->stream[str_num]; /* get the entry index for the requested position */ index = gst_avi_demux_index_for_time (avi, stream, cur); GST_DEBUG_OBJECT (avi, "str %u: Found entry %u for %" GST_TIME_FORMAT, str_num, index, GST_TIME_ARGS (cur)); /* check if we are already on a keyframe */ if (!ENTRY_IS_KEYFRAME (&stream->index[index])) { GST_DEBUG_OBJECT (avi, "Entry is not a keyframe - searching back"); /* now go to the previous keyframe, this is where we should start * decoding from. */ index = gst_avi_demux_index_prev (avi, stream, index, TRUE); GST_DEBUG_OBJECT (avi, "Found previous keyframe at %u", index); } gst_avi_demux_get_buffer_info (avi, stream, index, &stream->current_timestamp, &stream->current_ts_end, &stream->current_offset, &stream->current_offset_end); /* re-use cur to be the timestamp of the seek as it _will_ be */ cur = stream->current_timestamp; min_offset = stream->index[index].offset; avi->seek_kf_offset = min_offset - 8; GST_DEBUG_OBJECT (avi, "Seek to: ts %" GST_TIME_FORMAT " (on str %u, idx %u, offset %" G_GUINT64_FORMAT ")", GST_TIME_ARGS (stream->current_timestamp), str_num, index, min_offset); for (n = 0; n < avi->num_streams; n++) { GstAviStream *str = &avi->stream[n]; guint idx; if (n == avi->main_stream) continue; /* get the entry index for the requested position */ idx = gst_avi_demux_index_for_time (avi, str, cur); GST_DEBUG_OBJECT (avi, "str %u: Found entry %u for %" GST_TIME_FORMAT, n, idx, GST_TIME_ARGS (cur)); /* check if we are already on a keyframe */ if (!ENTRY_IS_KEYFRAME (&str->index[idx])) { GST_DEBUG_OBJECT (avi, "Entry is not a keyframe - searching back"); /* now go to the previous keyframe, this is where we should start * decoding from. */ idx = gst_avi_demux_index_prev (avi, str, idx, TRUE); GST_DEBUG_OBJECT (avi, "Found previous keyframe at %u", idx); } gst_avi_demux_get_buffer_info (avi, str, idx, &str->current_timestamp, &str->current_ts_end, &str->current_offset, &str->current_offset_end); if (str->index[idx].offset < min_offset) { min_offset = str->index[idx].offset; GST_DEBUG_OBJECT (avi, "Found an earlier offset at %" G_GUINT64_FORMAT ", str %u", min_offset, n); str_num = n; stream = str; index = idx; } } GST_DEBUG_OBJECT (avi, "Seek performed: str %u, offset %" G_GUINT64_FORMAT ", idx %u, ts %" GST_TIME_FORMAT ", ts_end %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT ", off_end %" G_GUINT64_FORMAT, str_num, min_offset, index, GST_TIME_ARGS (stream->current_timestamp), GST_TIME_ARGS (stream->current_ts_end), stream->current_offset, stream->current_offset_end); /* index data refers to data, not chunk header (for pull mode convenience) */ min_offset -= 8; GST_DEBUG_OBJECT (avi, "seeking to chunk at offset %" G_GUINT64_FORMAT, min_offset); if (!perform_seek_to_offset (avi, min_offset)) { GST_DEBUG_OBJECT (avi, "seek event failed!"); return FALSE; } return TRUE; } /* * Handle whether we can perform the seek event or if we have to let the chain * function handle seeks to build the seek indexes first. */ static gboolean gst_avi_demux_handle_seek_push (GstAviDemux * avi, GstPad * pad, GstEvent * event) { /* check for having parsed index already */ if (!avi->have_index) { guint64 offset = 0; gboolean building_index; GST_OBJECT_LOCK (avi); /* handle the seek event in the chain function */ avi->state = GST_AVI_DEMUX_SEEK; /* copy the event */ if (avi->seek_event) gst_event_unref (avi->seek_event); avi->seek_event = gst_event_ref (event); /* set the building_index flag so that only one thread can setup the * structures for index seeking. */ building_index = avi->building_index; if (!building_index) { avi->building_index = TRUE; if (avi->stream[0].indexes) { avi->odml_stream = 0; avi->odml_subidxs = avi->stream[avi->odml_stream].indexes; offset = avi->odml_subidxs[0]; } else { offset = avi->idx1_offset; } } GST_OBJECT_UNLOCK (avi); if (!building_index) { /* seek to the first subindex or legacy index */ GST_INFO_OBJECT (avi, "Seeking to legacy index/first subindex at %" G_GUINT64_FORMAT, offset); return perform_seek_to_offset (avi, offset); } /* FIXME: we have to always return true so that we don't block the seek * thread. * Note: maybe it is OK to return true if we're still building the index */ return TRUE; } return avi_demux_handle_seek_push (avi, pad, event); } /* * Helper for gst_avi_demux_invert() */ static inline void swap_line (guint8 * d1, guint8 * d2, guint8 * tmp, gint bytes) { memcpy (tmp, d1, bytes); memcpy (d1, d2, bytes); memcpy (d2, tmp, bytes); } #define gst_avi_demux_is_uncompressed(fourcc) \ (fourcc && \ (fourcc == GST_RIFF_DIB || \ fourcc == GST_RIFF_rgb || \ fourcc == GST_RIFF_RGB || fourcc == GST_RIFF_RAW)) /* * Invert DIB buffers... Takes existing buffer and * returns either the buffer or a new one (with old * one dereferenced). * FIXME: can't we preallocate tmp? and remember stride, bpp? */ static GstBuffer * gst_avi_demux_invert (GstAviStream * stream, GstBuffer * buf) { GstStructure *s; gint y, w, h; gint bpp, stride; guint8 *tmp = NULL; if (stream->strh->type != GST_RIFF_FCC_vids) return buf; if (!gst_avi_demux_is_uncompressed (stream->strh->fcc_handler)) { return buf; /* Ignore non DIB buffers */ } s = gst_caps_get_structure (GST_PAD_CAPS (stream->pad), 0); if (!gst_structure_get_int (s, "bpp", &bpp)) { GST_WARNING ("Failed to retrieve depth from caps"); return buf; } if (stream->strf.vids == NULL) { GST_WARNING ("Failed to retrieve vids for stream"); return buf; } h = stream->strf.vids->height; w = stream->strf.vids->width; stride = GST_ROUND_UP_4 (w * (bpp / 8)); buf = gst_buffer_make_writable (buf); if (GST_BUFFER_SIZE (buf) < (stride * h)) { GST_WARNING ("Buffer is smaller than reported Width x Height x Depth"); return buf; } tmp = g_malloc (stride); for (y = 0; y < h / 2; y++) { swap_line (GST_BUFFER_DATA (buf) + stride * y, GST_BUFFER_DATA (buf) + stride * (h - 1 - y), tmp, stride); } g_free (tmp); return buf; } static void gst_avi_demux_add_assoc (GstAviDemux * avi, GstAviStream * stream, GstClockTime timestamp, guint64 offset, gboolean keyframe) { /* do not add indefinitely for open-ended streaming */ if (G_UNLIKELY (avi->element_index && avi->seekable)) { GST_LOG_OBJECT (avi, "adding association %" GST_TIME_FORMAT "-> %" G_GUINT64_FORMAT, GST_TIME_ARGS (timestamp), offset); gst_index_add_association (avi->element_index, avi->index_id, keyframe ? GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_DELTA_UNIT, GST_FORMAT_TIME, timestamp, GST_FORMAT_BYTES, offset, NULL); /* current_entry is DEFAULT (frame #) */ gst_index_add_association (avi->element_index, stream->index_id, keyframe ? GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_DELTA_UNIT, GST_FORMAT_TIME, timestamp, GST_FORMAT_BYTES, offset, GST_FORMAT_DEFAULT, stream->current_entry, NULL); } } /* * Returns the aggregated GstFlowReturn. */ static GstFlowReturn gst_avi_demux_combine_flows (GstAviDemux * avi, GstAviStream * stream, GstFlowReturn ret) { guint i; gboolean unexpected = FALSE, not_linked = TRUE; /* store the value */ stream->last_flow = ret; /* any other error that is not-linked or eos can be returned right away */ if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) goto done; /* only return NOT_LINKED if all other pads returned NOT_LINKED */ for (i = 0; i < avi->num_streams; i++) { GstAviStream *ostream = &avi->stream[i]; ret = ostream->last_flow; /* no unexpected or unlinked, return */ if (G_LIKELY (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_NOT_LINKED)) goto done; /* we check to see if we have at least 1 unexpected or all unlinked */ unexpected |= (ret == GST_FLOW_UNEXPECTED); not_linked &= (ret == GST_FLOW_NOT_LINKED); } /* when we get here, we all have unlinked or unexpected */ if (not_linked) ret = GST_FLOW_NOT_LINKED; else if (unexpected) ret = GST_FLOW_UNEXPECTED; done: GST_LOG_OBJECT (avi, "combined %s to return %s", gst_flow_get_name (stream->last_flow), gst_flow_get_name (ret)); return ret; } /* move @stream to the next position in its index */ static GstFlowReturn gst_avi_demux_advance (GstAviDemux * avi, GstAviStream * stream, GstFlowReturn ret) { guint old_entry, new_entry; old_entry = stream->current_entry; /* move forwards */ new_entry = old_entry + 1; /* see if we reached the end */ if (new_entry >= stream->stop_entry) { if (avi->segment.rate < 0.0) { if (stream->step_entry == stream->start_entry) { /* we stepped all the way to the start, eos */ GST_DEBUG_OBJECT (avi, "reverse reached start %u", stream->start_entry); goto eos; } /* backwards, stop becomes step, find a new step */ stream->stop_entry = stream->step_entry; stream->step_entry = gst_avi_demux_index_prev (avi, stream, stream->stop_entry, TRUE); GST_DEBUG_OBJECT (avi, "reverse playback jump: start %u, step %u, stop %u", stream->start_entry, stream->step_entry, stream->stop_entry); /* and start from the previous keyframe now */ new_entry = stream->step_entry; } else { /* EOS */ GST_DEBUG_OBJECT (avi, "forward reached stop %u", stream->stop_entry); goto eos; } } if (new_entry != old_entry) { stream->current_entry = new_entry; stream->current_total = stream->index[new_entry].total; if (new_entry == old_entry + 1) { GST_DEBUG_OBJECT (avi, "moved forwards from %u to %u", old_entry, new_entry); /* we simply moved one step forwards, reuse current info */ stream->current_timestamp = stream->current_ts_end; stream->current_offset = stream->current_offset_end; gst_avi_demux_get_buffer_info (avi, stream, new_entry, NULL, &stream->current_ts_end, NULL, &stream->current_offset_end); } else { /* we moved DISCONT, full update */ gst_avi_demux_get_buffer_info (avi, stream, new_entry, &stream->current_timestamp, &stream->current_ts_end, &stream->current_offset, &stream->current_offset_end); /* and MARK discont for this stream */ stream->last_flow = GST_FLOW_OK; stream->discont = TRUE; GST_DEBUG_OBJECT (avi, "Moved from %u to %u, ts %" GST_TIME_FORMAT ", ts_end %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT ", off_end %" G_GUINT64_FORMAT, old_entry, new_entry, GST_TIME_ARGS (stream->current_timestamp), GST_TIME_ARGS (stream->current_ts_end), stream->current_offset, stream->current_offset_end); } } return ret; /* ERROR */ eos: { GST_DEBUG_OBJECT (avi, "we are EOS"); /* setting current_timestamp to -1 marks EOS */ stream->current_timestamp = -1; return GST_FLOW_UNEXPECTED; } } /* find the stream with the lowest current position when going forwards or with * the highest position when going backwards, this is the stream * we should push from next */ static gint gst_avi_demux_find_next (GstAviDemux * avi, gfloat rate) { guint64 min_time, max_time; guint stream_num, i; max_time = 0; min_time = G_MAXUINT64; stream_num = -1; for (i = 0; i < avi->num_streams; i++) { guint64 position; GstAviStream *stream; stream = &avi->stream[i]; /* ignore streams that finished */ if (stream->last_flow == GST_FLOW_UNEXPECTED) continue; position = stream->current_timestamp; /* position of -1 is EOS */ if (position != -1) { if (rate > 0.0 && position < min_time) { min_time = position; stream_num = i; } else if (rate < 0.0 && position >= max_time) { max_time = position; stream_num = i; } } } return stream_num; } static GstFlowReturn gst_avi_demux_loop_data (GstAviDemux * avi) { GstFlowReturn ret = GST_FLOW_OK; guint stream_num; GstAviStream *stream; gboolean processed = FALSE; GstBuffer *buf; guint64 offset, size; GstClockTime timestamp, duration; guint64 out_offset, out_offset_end; gboolean keyframe; GstAviIndexEntry *entry; do { stream_num = gst_avi_demux_find_next (avi, avi->segment.rate); /* all are EOS */ if (G_UNLIKELY (stream_num == -1)) { GST_DEBUG_OBJECT (avi, "all streams are EOS"); goto eos; } /* we have the stream now */ stream = &avi->stream[stream_num]; /* skip streams without pads */ if (!stream->pad) { GST_DEBUG_OBJECT (avi, "skipping entry from stream %d without pad", stream_num); goto next; } /* get the timing info for the entry */ timestamp = stream->current_timestamp; duration = stream->current_ts_end - timestamp; out_offset = stream->current_offset; out_offset_end = stream->current_offset_end; /* get the entry data info */ entry = &stream->index[stream->current_entry]; offset = entry->offset; size = entry->size; keyframe = ENTRY_IS_KEYFRAME (entry); /* skip empty entries */ if (size == 0) { GST_DEBUG_OBJECT (avi, "Skipping entry %u (%" G_GUINT64_FORMAT ", %p)", stream->current_entry, size, stream->pad); goto next; } if (avi->segment.rate > 0.0) { /* only check this for fowards playback for now */ if (keyframe && GST_CLOCK_TIME_IS_VALID (avi->segment.stop) && (timestamp > avi->segment.stop)) { goto eos_stop; } } GST_LOG ("reading buffer (size=%" G_GUINT64_FORMAT "), stream %d, pos %" G_GUINT64_FORMAT " (0x%" G_GINT64_MODIFIER "x), kf %d", size, stream_num, offset, offset, keyframe); /* FIXME, check large chunks and cut them up */ /* pull in the data */ ret = gst_pad_pull_range (avi->sinkpad, offset, size, &buf); if (ret != GST_FLOW_OK) goto pull_failed; /* check for short buffers, this is EOS as well */ if (GST_BUFFER_SIZE (buf) < size) goto short_buffer; /* invert the picture if needed */ buf = gst_avi_demux_invert (stream, buf); /* mark non-keyframes */ if (keyframe) GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DELTA_UNIT); else GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); GST_BUFFER_TIMESTAMP (buf) = timestamp; GST_BUFFER_DURATION (buf) = duration; GST_BUFFER_OFFSET (buf) = out_offset; GST_BUFFER_OFFSET_END (buf) = out_offset_end; /* mark discont when pending */ if (stream->discont) { GST_DEBUG_OBJECT (avi, "setting DISCONT flag"); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); stream->discont = FALSE; } gst_avi_demux_add_assoc (avi, stream, timestamp, offset, keyframe); gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad)); /* update current position in the segment */ gst_segment_set_last_stop (&avi->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (avi, "Pushing buffer of size %u, ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT ", off %" G_GUINT64_FORMAT ", off_end %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buf), GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration), out_offset, out_offset_end); ret = gst_pad_push (stream->pad, buf); /* mark as processed, we increment the frame and byte counters then * leave the while loop and return the GstFlowReturn */ processed = TRUE; if (avi->segment.rate < 0) { if (timestamp > avi->segment.stop && ret == GST_FLOW_UNEXPECTED) { /* In reverse playback we can get a GST_FLOW_UNEXPECTED when * we are at the end of the segment, so we just need to jump * back to the previous section. */ GST_DEBUG_OBJECT (avi, "downstream has reached end of segment"); ret = GST_FLOW_OK; } } next: /* move to next item */ ret = gst_avi_demux_advance (avi, stream, ret); /* combine flows */ ret = gst_avi_demux_combine_flows (avi, stream, ret); } while (!processed); beach: return ret; /* special cases */ eos: { GST_DEBUG_OBJECT (avi, "No samples left for any streams - EOS"); ret = GST_FLOW_UNEXPECTED; goto beach; } eos_stop: { GST_LOG_OBJECT (avi, "Found keyframe after segment," " setting EOS (%" GST_TIME_FORMAT " > %" GST_TIME_FORMAT ")", GST_TIME_ARGS (timestamp), GST_TIME_ARGS (avi->segment.stop)); ret = GST_FLOW_UNEXPECTED; /* move to next stream */ goto next; } pull_failed: { GST_DEBUG_OBJECT (avi, "pull range failed: pos=%" G_GUINT64_FORMAT " size=%" G_GUINT64_FORMAT, offset, size); goto beach; } short_buffer: { GST_WARNING_OBJECT (avi, "Short read at offset %" G_GUINT64_FORMAT ", only got %d/%" G_GUINT64_FORMAT " bytes (truncated file?)", offset, GST_BUFFER_SIZE (buf), size); gst_buffer_unref (buf); ret = GST_FLOW_UNEXPECTED; goto beach; } } /* * Read data. If we have an index it delegates to * gst_avi_demux_process_next_entry(). */ static GstFlowReturn gst_avi_demux_stream_data (GstAviDemux * avi) { guint32 tag = 0; guint32 size = 0; gint stream_nr = 0; GstFlowReturn res = GST_FLOW_OK; GstFormat format = GST_FORMAT_TIME; if (G_UNLIKELY (avi->have_eos)) { /* Clean adapter, we're done */ gst_adapter_clear (avi->adapter); return GST_FLOW_UNEXPECTED; } if (G_UNLIKELY (avi->todrop)) { guint drop; if ((drop = gst_adapter_available (avi->adapter))) { if (drop > avi->todrop) drop = avi->todrop; GST_DEBUG_OBJECT (avi, "Dropping %d bytes", drop); gst_adapter_flush (avi->adapter, drop); avi->todrop -= drop; avi->offset += drop; } } /* Iterate until need more data, so adapter won't grow too much */ while (1) { if (G_UNLIKELY (!gst_avi_demux_peek_chunk_info (avi, &tag, &size))) { return GST_FLOW_OK; } GST_DEBUG ("Trying chunk (%" GST_FOURCC_FORMAT "), size %d", GST_FOURCC_ARGS (tag), size); if (G_LIKELY ((tag & 0xff) >= '0' && (tag & 0xff) <= '9' && ((tag >> 8) & 0xff) >= '0' && ((tag >> 8) & 0xff) <= '9')) { GST_LOG ("Chunk ok"); } else if ((tag & 0xffff) == (('x' << 8) | 'i')) { GST_DEBUG ("Found sub-index tag"); if (gst_avi_demux_peek_chunk (avi, &tag, &size) || size == 0) { /* accept 0 size buffer here */ avi->abort_buffering = FALSE; GST_DEBUG (" skipping %d bytes for now", size); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); } return GST_FLOW_OK; } else if (tag == GST_RIFF_TAG_RIFF) { /* RIFF tags can appear in ODML files, just jump over them */ if (gst_adapter_available (avi->adapter) >= 12) { GST_DEBUG ("Found RIFF tag, skipping RIFF header"); gst_adapter_flush (avi->adapter, 12); continue; } return GST_FLOW_OK; } else if (tag == GST_RIFF_TAG_idx1) { GST_DEBUG ("Found index tag"); if (gst_avi_demux_peek_chunk (avi, &tag, &size) || size == 0) { /* accept 0 size buffer here */ avi->abort_buffering = FALSE; GST_DEBUG (" skipping %d bytes for now", size); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); } return GST_FLOW_OK; } else if (tag == GST_RIFF_TAG_LIST) { /* movi chunks might be grouped in rec list */ if (gst_adapter_available (avi->adapter) >= 12) { GST_DEBUG ("Found LIST tag, skipping LIST header"); gst_adapter_flush (avi->adapter, 12); continue; } return GST_FLOW_OK; } else if (tag == GST_RIFF_TAG_JUNK || tag == GST_RIFF_TAG_JUNQ) { /* rec list might contain JUNK chunks */ GST_DEBUG ("Found JUNK tag"); if (gst_avi_demux_peek_chunk (avi, &tag, &size) || size == 0) { /* accept 0 size buffer here */ avi->abort_buffering = FALSE; GST_DEBUG (" skipping %d bytes for now", size); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); } return GST_FLOW_OK; } else { GST_DEBUG ("No more stream chunks, send EOS"); avi->have_eos = TRUE; return GST_FLOW_UNEXPECTED; } if (G_UNLIKELY (!gst_avi_demux_peek_chunk (avi, &tag, &size))) { /* supposedly one hopes to catch a nicer chunk later on ... */ /* FIXME ?? give up here rather than possibly ending up going * through the whole file */ if (avi->abort_buffering) { avi->abort_buffering = FALSE; if (size) { gst_adapter_flush (avi->adapter, 8); return GST_FLOW_OK; } } else { return GST_FLOW_OK; } } GST_DEBUG ("chunk ID %" GST_FOURCC_FORMAT ", size %u", GST_FOURCC_ARGS (tag), size); stream_nr = CHUNKID_TO_STREAMNR (tag); if (G_UNLIKELY (stream_nr < 0 || stream_nr >= avi->num_streams)) { /* recoverable */ GST_WARNING ("Invalid stream ID %d (%" GST_FOURCC_FORMAT ")", stream_nr, GST_FOURCC_ARGS (tag)); avi->offset += 8 + GST_ROUND_UP_2 (size); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); } else { GstAviStream *stream; GstClockTime next_ts = 0; GstBuffer *buf = NULL; guint64 offset; gboolean saw_desired_kf = stream_nr != avi->main_stream || avi->offset >= avi->seek_kf_offset; if (stream_nr == avi->main_stream && avi->offset == avi->seek_kf_offset) { GST_DEBUG_OBJECT (avi, "Desired keyframe reached"); avi->seek_kf_offset = 0; } if (saw_desired_kf) { gst_adapter_flush (avi->adapter, 8); /* get buffer */ if (size) { buf = gst_adapter_take_buffer (avi->adapter, GST_ROUND_UP_2 (size)); /* patch the size */ GST_BUFFER_SIZE (buf) = size; } else { buf = NULL; } } else { GST_DEBUG_OBJECT (avi, "Desired keyframe not yet reached, flushing chunk"); gst_adapter_flush (avi->adapter, 8 + GST_ROUND_UP_2 (size)); } offset = avi->offset; avi->offset += 8 + GST_ROUND_UP_2 (size); stream = &avi->stream[stream_nr]; /* set delay (if any) if (stream->strh->init_frames == stream->current_frame && stream->delay == 0) stream->delay = next_ts; */ /* parsing of corresponding header may have failed */ if (G_UNLIKELY (!stream->pad)) { GST_WARNING_OBJECT (avi, "no pad for stream ID %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)); if (buf) gst_buffer_unref (buf); } else { /* get time of this buffer */ gst_pad_query_position (stream->pad, &format, (gint64 *) & next_ts); if (G_UNLIKELY (format != GST_FORMAT_TIME)) goto wrong_format; gst_avi_demux_add_assoc (avi, stream, next_ts, offset, FALSE); /* increment our positions */ stream->current_entry++; stream->current_total += size; /* update current position in the segment */ gst_segment_set_last_stop (&avi->segment, GST_FORMAT_TIME, next_ts); if (saw_desired_kf && buf) { GstClockTime dur_ts = 0; /* invert the picture if needed */ buf = gst_avi_demux_invert (stream, buf); gst_pad_query_position (stream->pad, &format, (gint64 *) & dur_ts); if (G_UNLIKELY (format != GST_FORMAT_TIME)) goto wrong_format; GST_BUFFER_TIMESTAMP (buf) = next_ts; GST_BUFFER_DURATION (buf) = dur_ts - next_ts; if (stream->strh->type == GST_RIFF_FCC_vids) { GST_BUFFER_OFFSET (buf) = stream->current_entry - 1; GST_BUFFER_OFFSET_END (buf) = stream->current_entry; } else { GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE; GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE; } gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad)); GST_DEBUG_OBJECT (avi, "Pushing buffer with time=%" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT ", offset %" G_GUINT64_FORMAT " and size %d over pad %s", GST_TIME_ARGS (next_ts), GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf), size, GST_PAD_NAME (stream->pad)); /* mark discont when pending */ if (G_UNLIKELY (stream->discont)) { GST_DEBUG_OBJECT (avi, "Setting DISCONT"); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); stream->discont = FALSE; } res = gst_pad_push (stream->pad, buf); buf = NULL; /* combine flows */ res = gst_avi_demux_combine_flows (avi, stream, res); if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_DEBUG ("Push failed; %s", gst_flow_get_name (res)); return res; } } } } } done: return res; /* ERRORS */ wrong_format: { GST_DEBUG_OBJECT (avi, "format %s != GST_FORMAT_TIME", gst_format_get_name (format)); res = GST_FLOW_ERROR; goto done; } } /* * Send pending tags. */ static void push_tag_lists (GstAviDemux * avi) { guint i; GstTagList *tags; if (!avi->got_tags) return; GST_DEBUG_OBJECT (avi, "Pushing pending tag lists"); for (i = 0; i < avi->num_streams; i++) { GstAviStream *stream = &avi->stream[i]; GstPad *pad = stream->pad; tags = stream->taglist; if (pad && tags) { GST_DEBUG_OBJECT (pad, "Tags: %" GST_PTR_FORMAT, tags); gst_element_found_tags_for_pad (GST_ELEMENT_CAST (avi), pad, tags); stream->taglist = NULL; } } if (!(tags = avi->globaltags)) tags = gst_tag_list_new (); gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_CONTAINER_FORMAT, "AVI", NULL); GST_DEBUG_OBJECT (avi, "Global tags: %" GST_PTR_FORMAT, tags); gst_element_found_tags (GST_ELEMENT_CAST (avi), tags); avi->globaltags = NULL; avi->got_tags = FALSE; } static void gst_avi_demux_loop (GstPad * pad) { GstFlowReturn res; GstAviDemux *avi = GST_AVI_DEMUX (GST_PAD_PARENT (pad)); switch (avi->state) { case GST_AVI_DEMUX_START: res = gst_avi_demux_stream_init_pull (avi); if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_WARNING ("stream_init flow: %s", gst_flow_get_name (res)); goto pause; } avi->state = GST_AVI_DEMUX_HEADER; /* fall-through */ case GST_AVI_DEMUX_HEADER: res = gst_avi_demux_stream_header_pull (avi); if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_WARNING ("stream_header flow: %s", gst_flow_get_name (res)); goto pause; } avi->state = GST_AVI_DEMUX_MOVI; break; case GST_AVI_DEMUX_MOVI: if (G_UNLIKELY (avi->close_seg_event)) { gst_avi_demux_push_event (avi, avi->close_seg_event); avi->close_seg_event = NULL; } if (G_UNLIKELY (avi->seg_event)) { gst_avi_demux_push_event (avi, avi->seg_event); avi->seg_event = NULL; } if (G_UNLIKELY (avi->got_tags)) { push_tag_lists (avi); } /* process each index entry in turn */ res = gst_avi_demux_loop_data (avi); /* pause when error */ if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_INFO ("stream_movi flow: %s", gst_flow_get_name (res)); goto pause; } break; default: GST_ERROR_OBJECT (avi, "unknown state %d", avi->state); res = GST_FLOW_ERROR; goto pause; } return; /* ERRORS */ pause:{ gboolean push_eos = FALSE; GST_LOG_OBJECT (avi, "pausing task, reason %s", gst_flow_get_name (res)); avi->segment_running = FALSE; gst_pad_pause_task (avi->sinkpad); if (res == GST_FLOW_UNEXPECTED) { /* handle end-of-stream/segment */ if (avi->segment.flags & GST_SEEK_FLAG_SEGMENT) { gint64 stop; if ((stop = avi->segment.stop) == -1) stop = avi->segment.duration; GST_INFO_OBJECT (avi, "sending segment_done"); gst_element_post_message (GST_ELEMENT_CAST (avi), gst_message_new_segment_done (GST_OBJECT_CAST (avi), GST_FORMAT_TIME, stop)); } else { push_eos = TRUE; } } else if (res == GST_FLOW_NOT_LINKED || res < GST_FLOW_UNEXPECTED) { /* for fatal errors we post an error message, wrong-state is * not fatal because it happens due to flushes and only means * that we should stop now. */ GST_ELEMENT_ERROR (avi, STREAM, FAILED, (_("Internal data stream error.")), ("streaming stopped, reason %s", gst_flow_get_name (res))); push_eos = TRUE; } if (push_eos) { GST_INFO_OBJECT (avi, "sending eos"); if (!gst_avi_demux_push_event (avi, gst_event_new_eos ()) && (res == GST_FLOW_UNEXPECTED)) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("got eos but no streams (yet)")); } } } } static GstFlowReturn gst_avi_demux_chain (GstPad * pad, GstBuffer * buf) { GstFlowReturn res; GstAviDemux *avi = GST_AVI_DEMUX (GST_PAD_PARENT (pad)); gint i; if (GST_BUFFER_IS_DISCONT (buf)) { GST_DEBUG_OBJECT (avi, "got DISCONT"); gst_adapter_clear (avi->adapter); /* mark all streams DISCONT */ for (i = 0; i < avi->num_streams; i++) avi->stream[i].discont = TRUE; } GST_DEBUG ("Store %d bytes in adapter", GST_BUFFER_SIZE (buf)); gst_adapter_push (avi->adapter, buf); switch (avi->state) { case GST_AVI_DEMUX_START: if ((res = gst_avi_demux_stream_init_push (avi)) != GST_FLOW_OK) { GST_WARNING ("stream_init flow: %s", gst_flow_get_name (res)); break; } break; case GST_AVI_DEMUX_HEADER: if ((res = gst_avi_demux_stream_header_push (avi)) != GST_FLOW_OK) { GST_WARNING ("stream_header flow: %s", gst_flow_get_name (res)); break; } break; case GST_AVI_DEMUX_MOVI: if (G_UNLIKELY (avi->close_seg_event)) { gst_avi_demux_push_event (avi, avi->close_seg_event); avi->close_seg_event = NULL; } if (G_UNLIKELY (avi->seg_event)) { gst_avi_demux_push_event (avi, avi->seg_event); avi->seg_event = NULL; } if (G_UNLIKELY (avi->got_tags)) { push_tag_lists (avi); } res = gst_avi_demux_stream_data (avi); break; case GST_AVI_DEMUX_SEEK: { GstEvent *event; res = GST_FLOW_OK; /* obtain and parse indexes */ if (avi->stream[0].indexes && !gst_avi_demux_read_subindexes_push (avi)) /* seek in subindex read function failed */ goto index_failed; if (!avi->stream[0].indexes && !avi->have_index && avi->avih->flags & GST_RIFF_AVIH_HASINDEX) gst_avi_demux_stream_index_push (avi); if (avi->have_index) { /* use the indexes now to construct nice durations */ gst_avi_demux_calculate_durations_from_index (avi); } else { /* still parsing indexes */ break; } GST_OBJECT_LOCK (avi); event = avi->seek_event; avi->seek_event = NULL; GST_OBJECT_UNLOCK (avi); /* calculate and perform seek */ if (!avi_demux_handle_seek_push (avi, avi->sinkpad, event)) goto seek_failed; gst_event_unref (event); avi->state = GST_AVI_DEMUX_MOVI; break; } default: GST_ELEMENT_ERROR (avi, STREAM, FAILED, (NULL), ("Illegal internal state")); res = GST_FLOW_ERROR; break; } GST_DEBUG_OBJECT (avi, "state: %d res:%s", avi->state, gst_flow_get_name (res)); if (G_UNLIKELY (avi->abort_buffering)) goto abort_buffering; return res; /* ERRORS */ index_failed: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("failed to read indexes")); return GST_FLOW_ERROR; } seek_failed: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("push mode seek failed")); return GST_FLOW_ERROR; } abort_buffering: { avi->abort_buffering = FALSE; GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), ("unhandled buffer size")); return GST_FLOW_ERROR; } } static gboolean gst_avi_demux_sink_activate (GstPad * sinkpad) { if (gst_pad_check_pull_range (sinkpad)) { GST_DEBUG ("going to pull mode"); return gst_pad_activate_pull (sinkpad, TRUE); } else { GST_DEBUG ("going to push (streaming) mode"); return gst_pad_activate_push (sinkpad, TRUE); } } static gboolean gst_avi_demux_sink_activate_pull (GstPad * sinkpad, gboolean active) { GstAviDemux *avi = GST_AVI_DEMUX (GST_OBJECT_PARENT (sinkpad)); if (active) { avi->segment_running = TRUE; avi->streaming = FALSE; return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_avi_demux_loop, sinkpad); } else { avi->segment_running = FALSE; return gst_pad_stop_task (sinkpad); } } static gboolean gst_avi_demux_activate_push (GstPad * pad, gboolean active) { GstAviDemux *avi = GST_AVI_DEMUX (GST_OBJECT_PARENT (pad)); if (active) { GST_DEBUG ("avi: activating push/chain function"); avi->streaming = TRUE; #if 0 /* create index for some push based seeking if not provided */ GST_OBJECT_LOCK (avi); if (!avi->element_index) { GST_DEBUG_OBJECT (avi, "creating index"); avi->element_index = gst_index_factory_make ("memindex"); } GST_OBJECT_UNLOCK (avi); /* object lock might be taken again */ gst_index_get_writer_id (avi->element_index, GST_OBJECT_CAST (avi), &avi->index_id); #endif } else { GST_DEBUG ("avi: deactivating push/chain function"); } return TRUE; } static void gst_avi_demux_set_index (GstElement * element, GstIndex * index) { GstAviDemux *avi = GST_AVI_DEMUX (element); GST_OBJECT_LOCK (avi); if (avi->element_index) gst_object_unref (avi->element_index); if (index) { avi->element_index = gst_object_ref (index); } else { avi->element_index = NULL; } GST_OBJECT_UNLOCK (avi); /* object lock might be taken again */ if (index) gst_index_get_writer_id (index, GST_OBJECT_CAST (element), &avi->index_id); GST_DEBUG_OBJECT (avi, "Set index %" GST_PTR_FORMAT, avi->element_index); } static GstIndex * gst_avi_demux_get_index (GstElement * element) { GstIndex *result = NULL; GstAviDemux *avi = GST_AVI_DEMUX (element); GST_OBJECT_LOCK (avi); if (avi->element_index) result = gst_object_ref (avi->element_index); GST_OBJECT_UNLOCK (avi); GST_DEBUG_OBJECT (avi, "Returning index %" GST_PTR_FORMAT, result); return result; } static GstStateChangeReturn gst_avi_demux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstAviDemux *avi = GST_AVI_DEMUX (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: avi->streaming = FALSE; gst_segment_init (&avi->segment, GST_FORMAT_TIME); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto done; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: avi->have_index = FALSE; gst_avi_demux_reset (avi); break; default: break; } done: return ret; } gst-plugins-good-0.10.31/gst/avi/gstavisubtitle.h0000644000175000017500000000214311671175353016606 00000000000000 #ifndef __GSTAVISUBTITLE_H__ #define __GSTAVISUBTITLE_H__ #include #include #include G_BEGIN_DECLS typedef struct _GstAviSubtitle GstAviSubtitle; typedef struct _GstAviSubtitleClass GstAviSubtitleClass; #define GST_TYPE_AVI_SUBTITLE (gst_avi_subtitle_get_type ()) #define GST_AVI_SUBTITLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_SUBTITLE, GstAviSubtitle)) #define GST_AVI_SUBTITLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_SUBTITLE, GstAviSubtitleClass)) #define GST_IS_AVI_SUBTITLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_SUBTITLE)) #define GST_IS_AVI_SUBTITLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_SUBTITLE)) #define GST_AVI_SUBTITLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AVI_SUBTITLE, GstAviSubtitleClass)) GType gst_avi_subtitle_get_type (void); struct _GstAviSubtitle { GstElement parent; GstPad *src; GstPad *sink; GstBuffer *subfile; /* the complete subtitle file in one buffer */ }; struct _GstAviSubtitleClass { GstElementClass parent; }; G_END_DECLS #endif gst-plugins-good-0.10.31/gst/avi/Makefile.am0000644000175000017500000000205511671175353015422 00000000000000plugin_LTLIBRARIES = libgstavi.la libgstavi_la_SOURCES = \ gstavi.c \ gstavimux.c \ gstavidemux.c \ gstavisubtitle.c noinst_HEADERS = \ avi-ids.h \ gstavimux.h \ gstavidemux.h \ gstavisubtitle.h libgstavi_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstavi_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ libgstavi_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstavi_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = README Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstavi -:SHARED libgstavi \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstavi_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstavi_la_CFLAGS) \ -:LDFLAGS $(libgstavi_la_LDFLAGS) \ $(libgstavi_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/avi/avi-ids.h0000644000175000017500000000601511671175353015073 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * 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_AVI_H__ #define __GST_AVI_H__ #include typedef struct _gst_riff_avih { guint32 us_frame; /* microsec per frame */ guint32 max_bps; /* byte/s overall */ guint32 pad_gran; /* pad_granularity */ guint32 flags; /* flags values */ #define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ #define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ #define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ #define GST_RIFF_AVIH_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames */ #define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ #define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ guint32 tot_frames; /* # of frames (all) */ guint32 init_frames; /* initial frames (???) */ guint32 streams; guint32 bufsize; /* suggested buffer size */ guint32 width; guint32 height; guint32 scale; guint32 rate; guint32 start; guint32 length; } gst_riff_avih; /* vprp (video properties) ODML header */ /* see ODML spec for some/more explanation */ #define GST_RIFF_TAG_vprp GST_MAKE_FOURCC ('v','p','r','p') #define GST_RIFF_VPRP_VIDEO_FIELDS (2) typedef struct _gst_riff_vprp_video_field_desc { guint32 compressed_bm_height; guint32 compressed_bm_width; guint32 valid_bm_height; guint32 valid_bm_width; guint32 valid_bm_x_offset; guint32 valid_bm_y_offset; guint32 video_x_t_offset; guint32 video_y_start; } gst_riff_vprp_video_field_desc; typedef struct _gst_riff_vprp { guint32 format_token; /* whether fields defined by standard */ guint32 standard; /* video display standard, UNKNOWN, PAL, etc */ guint32 vert_rate; /* vertical refresh rate */ guint32 hor_t_total; /* width */ guint32 vert_lines; /* height */ guint32 aspect; /* aspect ratio high word:low word */ guint32 width; /* active width */ guint32 height; /* active height */ guint32 fields; /* field count */ gst_riff_vprp_video_field_desc field_info[GST_RIFF_VPRP_VIDEO_FIELDS]; } gst_riff_vprp; #endif /* __GST_AVI_H__ */ gst-plugins-good-0.10.31/gst/avi/gstavi.c0000644000175000017500000000336411671175353015033 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * * gstavi.c: plugin registering * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include "gstavidemux.h" #include "gstavimux.h" #include "gstavisubtitle.h" static gboolean plugin_init (GstPlugin * plugin) { gst_riff_init (); #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ if (!gst_element_register (plugin, "avidemux", GST_RANK_PRIMARY, GST_TYPE_AVI_DEMUX) || !gst_element_register (plugin, "avimux", GST_RANK_PRIMARY, GST_TYPE_AVI_MUX) || !gst_element_register (plugin, "avisubtitle", GST_RANK_PRIMARY, GST_TYPE_AVI_SUBTITLE)) { return FALSE; } return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "avi", "AVI stream handling", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/avi/README0000644000175000017500000000537211671175353014253 00000000000000The avi decoder plugins ----------------------- The avi decoder consists of a set of gstreamer plugins: - demuxer (avidemux) - avi to gstreamer type converter (avitypes) - windows dlls wrappers. the avidecoder element uses the above plugins to perform the avi decoding. It is constructed as a custom bin which initially only has the demuxer element in it. The demuxer has a set of padtemplates for raw audio and video. (------------------------------------) ! avidecoder ! ! (video/raw)... ! (----------) ! ! ! demuxer (video/x-msvideo, auds).. ! ! ! ! ! -src ! ! ! / ! (video/x-msvideo, vids).. - src ! ! ! ! (----------) (audio/raw)... ! ! (------------------------------------) the demuxer has a set of padtemplates for the raw avi header properties. The avi decoder will act on the new_pad signal of the demuxer element and will attach an avitype plugin to the new pad. Caps negotiation will convert the raw avi caps to the gstreamer caps. If the src pad of the avitypes plugin are compatible with the avidecoder padtemplate, the avitype pad is ghosted to the avidecoder bin, this is the case where no codec is needed (for raw PCM samples, for example). When the avitypes caps are not compatible with one of the avidecoder templates, a static autoplugger is used the find an element to connect the demuxers pad to the decoders padtemplate. When no element could be found, an windec plugin is attached to the demuxers pad and the avitypes plugin is removed from the decoder. example: -------- An avidecoder that has a video pad (decoded with windows dlls) and an audio pad (raw PCM). (----------------------------------------------------------------) ! avidecoder (--------) (------) ! ! !avitypes! !windec! /-- (video/raw) ! (----------) /-sink src--sink src ----- ! ! !demuxer (video/x-msvideo, ! ! ! ! ! ! ! auds).. (--------) (------) ! ! -sink ! (--------) ! ! / ! (video/x-..,!avitypes! ! -sink ! ! vids).. ! ! ! ! (----------) \-sink src -------------------- (audio/raw) ! (--------) ! (----------------------------------------------------------------) TODO ---- automatically generate the padtemplates from all possible avi types found in the registry. gst-plugins-good-0.10.31/gst/avi/gstavisubtitle.c0000644000175000017500000002725711677341655016624 00000000000000/* GStreamer AVI GAB2 subtitle parser * Copyright (C) <2007> Thijs Vermeir * Copyright (C) <2007> Tim-Philipp Müller * * 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-avisubtitle * * * * Parses the subtitle stream from an avi file. * * Example launch line * * * gst-launch filesrc location=subtitle.avi ! avidemux name=demux ! queue ! avisubtitle ! subparse ! textoverlay name=overlay ! ffmpegcolorspace ! autovideosink demux. ! queue ! decodebin ! overlay. * * This plays an avi file with a video and subtitle stream. * * * * Last reviewed on 2008-02-01 */ /* example of a subtitle chunk in an avi file * 00000000: 47 41 42 32 00 02 00 10 00 00 00 45 00 6e 00 67 GAB2.......E.n.g * 00000010: 00 6c 00 69 00 73 00 68 00 00 00 04 00 8e 00 00 .l.i.s.h........ * 00000020: 00 ef bb bf 31 0d 0a 30 30 3a 30 30 3a 30 30 2c ....1..00:00:00, * 00000030: 31 30 30 20 2d 2d 3e 20 30 30 3a 30 30 3a 30 32 100 --> 00:00:02 * 00000040: 2c 30 30 30 0d 0a 3c 62 3e 41 6e 20 55 54 46 38 ,000..An UTF8 * 00000050: 20 53 75 62 74 69 74 6c 65 20 77 69 74 68 20 42 Subtitle with B * 00000060: 4f 4d 3c 2f 62 3e 0d 0a 0d 0a 32 0d 0a 30 30 3a OM....2..00: * 00000070: 30 30 3a 30 32 2c 31 30 30 20 2d 2d 3e 20 30 30 00:02,100 --> 00 * 00000080: 3a 30 30 3a 30 34 2c 30 30 30 0d 0a 53 6f 6d 65 :00:04,000..Some * 00000090: 74 68 69 6e 67 20 6e 6f 6e 41 53 43 49 49 20 2d thing nonASCII - * 000000a0: 20 c2 b5 c3 b6 c3 a4 c3 bc c3 9f 0d 0a 0d 0a .............. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstavisubtitle.h" GST_DEBUG_CATEGORY_STATIC (avisubtitle_debug); #define GST_CAT_DEFAULT avisubtitle_debug static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-subtitle-avi") ); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-subtitle") ); static void gst_avi_subtitle_title_tag (GstAviSubtitle * sub, gchar * title); static GstFlowReturn gst_avi_subtitle_chain (GstPad * pad, GstBuffer * buffer); static GstStateChangeReturn gst_avi_subtitle_change_state (GstElement * element, GstStateChange transition); static gboolean gst_avi_subtitle_send_event (GstElement * element, GstEvent * event); GST_BOILERPLATE (GstAviSubtitle, gst_avi_subtitle, GstElement, GST_TYPE_ELEMENT); #define IS_BOM_UTF8(data) ((GST_READ_UINT32_BE(data) >> 8) == 0xEFBBBF) #define IS_BOM_UTF16_BE(data) (GST_READ_UINT16_BE(data) == 0xFEFF) #define IS_BOM_UTF16_LE(data) (GST_READ_UINT16_LE(data) == 0xFEFF) #define IS_BOM_UTF32_BE(data) (GST_READ_UINT32_BE(data) == 0xFEFF) #define IS_BOM_UTF32_LE(data) (GST_READ_UINT32_LE(data) == 0xFEFF) static GstBuffer * gst_avi_subtitle_extract_file (GstAviSubtitle * sub, GstBuffer * buffer, guint offset, guint len) { const gchar *input_enc = NULL; GstBuffer *ret = NULL; gchar *data; data = (gchar *) GST_BUFFER_DATA (buffer) + offset; if (len >= (3 + 1) && IS_BOM_UTF8 (data) && g_utf8_validate (data + 3, len - 3, NULL)) { ret = gst_buffer_create_sub (buffer, offset + 3, len - 3); } else if (len >= 2 && IS_BOM_UTF16_BE (data)) { input_enc = "UTF-16BE"; data += 2; len -= 2; } else if (len >= 2 && IS_BOM_UTF16_LE (data)) { input_enc = "UTF-16LE"; data += 2; len -= 2; } else if (len >= 4 && IS_BOM_UTF32_BE (data)) { input_enc = "UTF-32BE"; data += 4; len -= 4; } else if (len >= 4 && IS_BOM_UTF32_LE (data)) { input_enc = "UTF-32LE"; data += 4; len -= 4; } else if (g_utf8_validate (data, len, NULL)) { /* not specified, check if it's UTF-8 */ ret = gst_buffer_create_sub (buffer, offset, len); } else { /* we could fall back to gst_tag_freeform_to_utf8() here */ GST_WARNING_OBJECT (sub, "unspecified encoding, and not UTF-8"); return NULL; } g_return_val_if_fail (ret != NULL || input_enc != NULL, NULL); if (input_enc) { GError *err = NULL; gchar *utf8; GST_DEBUG_OBJECT (sub, "converting subtitles from %s to UTF-8", input_enc); utf8 = g_convert (data, len, "UTF-8", input_enc, NULL, NULL, &err); if (err != NULL) { GST_WARNING_OBJECT (sub, "conversion to UTF-8 failed : %s", err->message); g_error_free (err); return NULL; } ret = gst_buffer_new (); GST_BUFFER_DATA (ret) = (guint8 *) utf8; GST_BUFFER_MALLOCDATA (ret) = (guint8 *) utf8; GST_BUFFER_SIZE (ret) = strlen (utf8); GST_BUFFER_OFFSET (ret) = 0; } GST_BUFFER_CAPS (ret) = gst_caps_new_simple ("application/x-subtitle", NULL); return ret; } /** * gst_avi_subtitle_title_tag: * @sub: subtitle element * @title: the title of this subtitle stream * * Send an event to the srcpad of the @sub element with the title * of the subtitle stream as a GST_TAG_TITLE */ static void gst_avi_subtitle_title_tag (GstAviSubtitle * sub, gchar * title) { GstTagList *temp_list = gst_tag_list_new (); gst_tag_list_add (temp_list, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, title, NULL); gst_pad_push_event (sub->src, gst_event_new_tag (temp_list)); } static GstFlowReturn gst_avi_subtitle_parse_gab2_chunk (GstAviSubtitle * sub, GstBuffer * buf) { const guint8 *data; gchar *name_utf8; guint name_length; guint file_length; guint size; data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); /* check the magic word "GAB2\0", and the next word must be 2 */ if (size < 12 || memcmp (data, "GAB2\0\2\0", 5 + 2) != 0) goto wrong_magic_word; /* read 'name' of subtitle */ name_length = GST_READ_UINT32_LE (data + 5 + 2); GST_LOG_OBJECT (sub, "length of name: %u", name_length); if (size <= 17 + name_length) goto wrong_name_length; name_utf8 = g_convert ((gchar *) data + 11, name_length, "UTF-8", "UTF-16LE", NULL, NULL, NULL); if (name_utf8) { GST_LOG_OBJECT (sub, "subtitle name: %s", name_utf8); gst_avi_subtitle_title_tag (sub, name_utf8); g_free (name_utf8); } /* next word must be 4 */ if (GST_READ_UINT16_LE (data + 11 + name_length) != 0x4) goto wrong_fixed_word_2; file_length = GST_READ_UINT32_LE (data + 13 + name_length); GST_LOG_OBJECT (sub, "length srt/ssa file: %u", file_length); if (size < (17 + name_length + file_length)) goto wrong_total_length; /* store this, so we can send it again after a seek; note that we shouldn't * assume all the remaining data in the chunk is subtitle data, there may * be padding at the end for some reason, so only parse file_length bytes */ sub->subfile = gst_avi_subtitle_extract_file (sub, buf, 17 + name_length, file_length); if (sub->subfile == NULL) goto extract_failed; return GST_FLOW_OK; /* ERRORS */ wrong_magic_word: { GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), ("Wrong magic word")); return GST_FLOW_ERROR; } wrong_name_length: { GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), ("name doesn't fit in buffer (%d < %d)", size, 17 + name_length)); return GST_FLOW_ERROR; } wrong_fixed_word_2: { GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), ("wrong fixed word: expected %u, got %u", 4, GST_READ_UINT16_LE (data + 11 + name_length))); return GST_FLOW_ERROR; } wrong_total_length: { GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), ("buffer size is wrong: need %d bytes, have %d bytes", 17 + name_length + file_length, size)); return GST_FLOW_ERROR; } extract_failed: { GST_ELEMENT_ERROR (sub, STREAM, DECODE, (NULL), ("could not extract subtitles")); return GST_FLOW_ERROR; } } static GstFlowReturn gst_avi_subtitle_chain (GstPad * pad, GstBuffer * buffer) { GstAviSubtitle *sub = GST_AVI_SUBTITLE (GST_PAD_PARENT (pad)); GstFlowReturn ret; if (sub->subfile != NULL) { GST_WARNING_OBJECT (sub, "Got more buffers than expected, dropping"); ret = GST_FLOW_UNEXPECTED; goto done; } /* we expect exactly one buffer with the whole srt/ssa file in it */ ret = gst_avi_subtitle_parse_gab2_chunk (sub, buffer); if (ret != GST_FLOW_OK) goto done; /* now push the subtitle data downstream */ ret = gst_pad_push (sub->src, gst_buffer_ref (sub->subfile)); done: gst_buffer_unref (buffer); return ret; } static gboolean gst_avi_subtitle_send_event (GstElement * element, GstEvent * event) { GstAviSubtitle *avisubtitle = GST_AVI_SUBTITLE (element); gboolean ret = FALSE; if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) { if (avisubtitle->subfile) { if (gst_pad_push (avisubtitle->src, gst_buffer_ref (avisubtitle->subfile)) == GST_FLOW_OK) ret = TRUE; } } gst_event_unref (event); return ret; } static void gst_avi_subtitle_base_init (gpointer klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (avisubtitle_debug, "avisubtitle", 0, "parse avi subtitle stream"); gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_details_simple (element_class, "Avi subtitle parser", "Codec/Parser/Subtitle", "Parse avi subtitle stream", "Thijs Vermeir "); } static void gst_avi_subtitle_class_init (GstAviSubtitleClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_avi_subtitle_change_state); gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_avi_subtitle_send_event); } static void gst_avi_subtitle_init (GstAviSubtitle * self, GstAviSubtitleClass * klass) { GstCaps *caps; self->src = gst_pad_new_from_static_template (&src_template, "src"); gst_element_add_pad (GST_ELEMENT (self), self->src); self->sink = gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_set_chain_function (self->sink, GST_DEBUG_FUNCPTR (gst_avi_subtitle_chain)); caps = gst_static_pad_template_get_caps (&src_template); gst_pad_set_caps (self->src, caps); gst_caps_unref (caps); gst_pad_use_fixed_caps (self->src); gst_element_add_pad (GST_ELEMENT (self), self->sink); self->subfile = NULL; } static GstStateChangeReturn gst_avi_subtitle_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstAviSubtitle *sub = GST_AVI_SUBTITLE (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: if (sub->subfile) { gst_buffer_unref (sub->subfile); sub->subfile = NULL; } break; default: break; } return ret; } gst-plugins-good-0.10.31/gst/avi/gstavimux.h0000644000175000017500000001205211671175353015564 00000000000000/* AVI muxer plugin for GStreamer * Copyright (C) 2002 Ronald Bultje * * 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_AVI_MUX_H__ #define __GST_AVI_MUX_H__ #include #include #include #include "avi-ids.h" G_BEGIN_DECLS #define GST_TYPE_AVI_MUX \ (gst_avi_mux_get_type()) #define GST_AVI_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVI_MUX,GstAviMux)) #define GST_AVI_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVI_MUX,GstAviMuxClass)) #define GST_IS_AVI_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVI_MUX)) #define GST_IS_AVI_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVI_MUX)) #define GST_AVI_INDEX_OF_INDEXES 0 #define GST_AVI_INDEX_OF_CHUNKS 1 /* this allows indexing up to 64GB avi file */ #define GST_AVI_SUPERINDEX_COUNT 32 /* max size */ #define GST_AVI_MAX_SIZE 0x40000000 typedef struct _gst_avi_superindex_entry { guint64 offset; guint32 size; guint32 duration; } gst_avi_superindex_entry; typedef struct _gst_riff_strh_full { gst_riff_strh parent; /* rcFrame, RECT structure (struct of 4 shorts) */ gint16 left; gint16 top; gint16 right; gint16 bottom; } gst_riff_strh_full; typedef struct _GstAviPad GstAviPad; typedef struct _GstAviMux GstAviMux; typedef struct _GstAviMuxClass GstAviMuxClass; typedef GstFlowReturn (*GstAviPadHook) (GstAviMux * avi, GstAviPad * avipad, GstBuffer * buffer); struct _GstAviPad { /* do not extend, link to it */ /* is NULL if original sink request pad has been removed */ GstCollectData *collect; /* type */ gboolean is_video; gboolean connected; /* chunk tag */ gchar *tag; /* stream header */ gst_riff_strh hdr; /* odml super indexes */ gst_avi_superindex_entry idx[GST_AVI_SUPERINDEX_COUNT]; gint idx_index; gchar *idx_tag; /* stream specific hook */ GstAviPadHook hook; }; typedef struct _GstAviVideoPad { GstAviPad parent; /* stream format */ gst_riff_strf_vids vids; /* extra data */ GstBuffer *vids_codec_data; /* ODML video properties */ gst_riff_vprp vprp; GstBuffer *prepend_buffer; } GstAviVideoPad; typedef struct _GstAviAudioPad { GstAviPad parent; /* stream format */ gst_riff_strf_auds auds; /* audio info for bps calculation */ guint32 audio_size; guint64 audio_time; /* counts the number of samples to put in indx chunk * useful for raw audio where usually there are more than * 1 sample in each GstBuffer */ gint samples; /* extra data */ GstBuffer *auds_codec_data; } GstAviAudioPad; typedef struct _GstAviCollectData { /* extend the CollectData */ GstCollectData collect; GstAviPad *avipad; } GstAviCollectData; struct _GstAviMux { GstElement element; /* pads */ GstPad *srcpad; /* sinkpads, video first */ GSList *sinkpads; /* video restricted to 1 pad */ guint video_pads, audio_pads; GstCollectPads *collect; GstPadEventFunction collect_event; /* the AVI header */ /* still some single stream video data in mux struct */ gst_riff_avih avi_hdr; /* total number of (video) frames */ guint32 total_frames; /* amount of total data (bytes) */ guint64 total_data; /* amount of data (bytes) in the AVI/AVIX block; * actually the movi list, so counted from and including the movi tag */ guint32 data_size, datax_size; /* num (video) frames in the AVI/AVIX block */ guint32 num_frames, numx_frames; /* size of hdrl list, including tag as usual */ /* total size of extra codec data */ guint32 codec_data_size; /* state info */ gboolean write_header; gboolean restart; /* tags */ GstTagList *tags_snap; /* information about the AVI index ('idx') */ gst_riff_index_entry *idx; gint idx_index, idx_count; /* offset of *chunk* (relative to a base offset); entered in the index */ guint32 idx_offset; /* size of idx1 chunk (including! chunk header and size bytes) */ guint32 idx_size; /* are we a big file already? */ gboolean is_bigfile; guint64 avix_start; /* whether to use "large AVI files" or just stick to small indexed files */ gboolean enable_large_avi; }; struct _GstAviMuxClass { GstElementClass parent_class; }; GType gst_avi_mux_get_type(void); G_END_DECLS #endif /* __GST_AVI_MUX_H__ */ gst-plugins-good-0.10.31/gst/avi/gstavidemux.h0000644000175000017500000001311311671175353016074 00000000000000/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2006> Nokia Corporation (contact ) * * 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_AVI_DEMUX_H__ #define __GST_AVI_DEMUX_H__ #include #include "avi-ids.h" #include "gst/riff/riff-ids.h" #include "gst/riff/riff-read.h" #include G_BEGIN_DECLS #define GST_TYPE_AVI_DEMUX \ (gst_avi_demux_get_type ()) #define GST_AVI_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux)) #define GST_AVI_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemuxClass)) #define GST_IS_AVI_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX)) #define GST_IS_AVI_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX)) #define GST_AVI_DEMUX_MAX_STREAMS 16 #define CHUNKID_TO_STREAMNR(chunkid) \ ((((chunkid) & 0xff) - '0') * 10 + \ (((chunkid) >> 8) & 0xff) - '0') /* new index entries 24 bytes */ typedef struct { guint32 flags; guint32 size; /* bytes of the data */ guint64 offset; /* data offset in file */ guint64 total; /* total bytes before */ } GstAviIndexEntry; typedef struct { /* index of this streamcontext */ guint num; /* pad*/ GstPad *pad; gboolean exposed; /* stream info and headers */ gst_riff_strh *strh; union { gst_riff_strf_vids *vids; gst_riff_strf_auds *auds; gst_riff_strf_iavs *iavs; gpointer data; } strf; GstBuffer *extradata, *initdata; gchar *name; /* the start/step/stop entries */ guint start_entry; guint step_entry; guint stop_entry; /* current index entry */ guint current_entry; /* position (byte, frame, time) for current_entry */ guint current_total; GstClockTime current_timestamp; GstClockTime current_ts_end; guint64 current_offset; guint64 current_offset_end; GstFlowReturn last_flow; gboolean discont; /* stream length */ guint64 total_bytes; guint32 total_blocks; guint n_keyframes; /* stream length according to index */ GstClockTime idx_duration; /* stream length according to header */ GstClockTime hdr_duration; /* stream length based on header/index */ GstClockTime duration; /* VBR indicator */ gboolean is_vbr; /* openDML support (for files >4GB) */ gboolean superindex; guint64 *indexes; /* new indexes */ GstAviIndexEntry *index; /* array with index entries */ guint idx_n; /* number of entries */ guint idx_max; /* max allocated size of entries */ GstTagList *taglist; gint index_id; } GstAviStream; typedef enum { GST_AVI_DEMUX_START, GST_AVI_DEMUX_HEADER, GST_AVI_DEMUX_MOVI, GST_AVI_DEMUX_SEEK, } GstAviDemuxState; typedef enum { GST_AVI_DEMUX_HEADER_TAG_LIST, GST_AVI_DEMUX_HEADER_AVIH, GST_AVI_DEMUX_HEADER_ELEMENTS, GST_AVI_DEMUX_HEADER_INFO, GST_AVI_DEMUX_HEADER_JUNK, GST_AVI_DEMUX_HEADER_DATA } GstAviDemuxHeaderState; typedef struct _GstAviDemux { GstElement parent; /* pads */ GstPad *sinkpad; /* AVI decoding state */ GstAviDemuxState state; GstAviDemuxHeaderState header_state; guint64 offset; gboolean abort_buffering; /* when we loaded the indexes */ gboolean have_index; /* index offset in the file */ guint64 index_offset; /* streams */ GstAviStream stream[GST_AVI_DEMUX_MAX_STREAMS]; guint num_streams; guint num_v_streams; guint num_a_streams; guint num_t_streams; /* subtitle text streams */ guint main_stream; /* used for seeking */ /* for streaming mode */ gboolean streaming; gboolean have_eos; GstAdapter *adapter; guint todrop; /* some stream info for length */ gst_riff_avih *avih; GstClockTime duration; /* segment in TIME */ GstSegment segment; gboolean segment_running; /* pending tags/events */ GstEvent *seg_event; GstEvent *close_seg_event; GstTagList *globaltags; gboolean got_tags; /* gst index support */ GstIndex *element_index; gint index_id; gboolean seekable; guint64 first_movi_offset; guint64 idx1_offset; /* offset in file of list/chunk after movi */ GstEvent *seek_event; gboolean building_index; guint odml_stream; guint odml_subidx; guint64 *odml_subidxs; guint64 seek_kf_offset; /* offset of the keyframe to which we want to seek */ } GstAviDemux; typedef struct _GstAviDemuxClass { GstElementClass parent_class; } GstAviDemuxClass; GType gst_avi_demux_get_type (void); G_END_DECLS #endif /* __GST_AVI_DEMUX_H__ */ gst-plugins-good-0.10.31/gst/avi/Makefile.in0000644000175000017500000007565511720560231015437 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/avi DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstavi_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libgstavi_la_OBJECTS = libgstavi_la-gstavi.lo \ libgstavi_la-gstavimux.lo libgstavi_la-gstavidemux.lo \ libgstavi_la-gstavisubtitle.lo libgstavi_la_OBJECTS = $(am_libgstavi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstavi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstavi_la_CFLAGS) $(CFLAGS) \ $(libgstavi_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstavi_la_SOURCES) DIST_SOURCES = $(libgstavi_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstavi.la libgstavi_la_SOURCES = \ gstavi.c \ gstavimux.c \ gstavidemux.c \ gstavisubtitle.c noinst_HEADERS = \ avi-ids.h \ gstavimux.h \ gstavidemux.h \ gstavisubtitle.h libgstavi_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstavi_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ -lgstriff-@GST_MAJORMINOR@ \ -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ libgstavi_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstavi_la_LIBTOOLFLAGS = --tag=disable-static EXTRA_DIST = README all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/avi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/avi/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstavi.la: $(libgstavi_la_OBJECTS) $(libgstavi_la_DEPENDENCIES) $(EXTRA_libgstavi_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstavi_la_LINK) -rpath $(plugindir) $(libgstavi_la_OBJECTS) $(libgstavi_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavidemux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavimux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstavi_la-gstavisubtitle.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstavi_la-gstavi.lo: gstavi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavi.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavi.Tpo -c -o libgstavi_la-gstavi.lo `test -f 'gstavi.c' || echo '$(srcdir)/'`gstavi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavi.Tpo $(DEPDIR)/libgstavi_la-gstavi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavi.c' object='libgstavi_la-gstavi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavi.lo `test -f 'gstavi.c' || echo '$(srcdir)/'`gstavi.c libgstavi_la-gstavimux.lo: gstavimux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavimux.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavimux.Tpo -c -o libgstavi_la-gstavimux.lo `test -f 'gstavimux.c' || echo '$(srcdir)/'`gstavimux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavimux.Tpo $(DEPDIR)/libgstavi_la-gstavimux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavimux.c' object='libgstavi_la-gstavimux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavimux.lo `test -f 'gstavimux.c' || echo '$(srcdir)/'`gstavimux.c libgstavi_la-gstavidemux.lo: gstavidemux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavidemux.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavidemux.Tpo -c -o libgstavi_la-gstavidemux.lo `test -f 'gstavidemux.c' || echo '$(srcdir)/'`gstavidemux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavidemux.Tpo $(DEPDIR)/libgstavi_la-gstavidemux.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavidemux.c' object='libgstavi_la-gstavidemux.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavidemux.lo `test -f 'gstavidemux.c' || echo '$(srcdir)/'`gstavidemux.c libgstavi_la-gstavisubtitle.lo: gstavisubtitle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -MT libgstavi_la-gstavisubtitle.lo -MD -MP -MF $(DEPDIR)/libgstavi_la-gstavisubtitle.Tpo -c -o libgstavi_la-gstavisubtitle.lo `test -f 'gstavisubtitle.c' || echo '$(srcdir)/'`gstavisubtitle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstavi_la-gstavisubtitle.Tpo $(DEPDIR)/libgstavi_la-gstavisubtitle.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstavisubtitle.c' object='libgstavi_la-gstavisubtitle.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstavi_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstavi_la_CFLAGS) $(CFLAGS) -c -o libgstavi_la-gstavisubtitle.lo `test -f 'gstavisubtitle.c' || echo '$(srcdir)/'`gstavisubtitle.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstavi -:SHARED libgstavi \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstavi_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstavi_la_CFLAGS) \ -:LDFLAGS $(libgstavi_la_LDFLAGS) \ $(libgstavi_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/avi/gstavimux.c0000644000175000017500000021121711677341655015571 00000000000000/* AVI muxer plugin for GStreamer * Copyright (C) 2002 Ronald Bultje * (C) 2006 Mark Nauwelaerts * * 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. */ /* based on: * - the old avimuxer (by Wim Taymans) * - xawtv's aviwriter (by Gerd Knorr) * - mjpegtools' avilib (by Rainer Johanni) * - openDML large-AVI docs */ /** * SECTION:element-avimux * * Muxes raw or compressed audio and/or video streams into an AVI file. * * * Example launch lines * (write everything in one line, without the backslash characters) * |[ * gst-launch videotestsrc num-buffers=250 \ * ! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \ * ! queue ! mux. \ * audiotestsrc num-buffers=440 ! audioconvert \ * ! 'audio/x-raw-int,rate=44100,channels=2' ! queue ! mux. \ * avimux name=mux ! filesink location=test.avi * ]| This will create an .AVI file containing an uncompressed video stream * with a test picture and an uncompressed audio stream containing a * test sound. * |[ * gst-launch videotestsrc num-buffers=250 \ * ! 'video/x-raw-yuv,format=(fourcc)I420,width=320,height=240,framerate=(fraction)25/1' \ * ! xvidenc ! queue ! mux. \ * audiotestsrc num-buffers=440 ! audioconvert ! 'audio/x-raw-int,rate=44100,channels=2' \ * ! lame ! queue ! mux. \ * avimux name=mux ! filesink location=test.avi * ]| This will create an .AVI file containing the same test video and sound * as above, only that both streams will be compressed this time. This will * only work if you have the necessary encoder elements installed of course. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gst/gst-i18n-plugin.h" #include #include #include #include #include #include "gstavimux.h" GST_DEBUG_CATEGORY_STATIC (avimux_debug); #define GST_CAT_DEFAULT avimux_debug enum { ARG_0, ARG_BIGFILE }; #define DEFAULT_BIGFILE TRUE static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-msvideo") ); static GstStaticPadTemplate video_sink_factory = GST_STATIC_PAD_TEMPLATE ("video_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("video/x-raw-yuv, " "format = (fourcc) { YUY2, I420 }, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ]; " "image/jpeg, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ]; " "video/x-divx, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ], " "divxversion = (int) [ 3, 5 ]; " "video/x-xvid, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ]; " "video/x-3ivx, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ]; " "video/x-msmpeg, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ], " "msmpegversion = (int) [ 41, 43 ]; " "video/mpeg, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ], " "mpegversion = (int) { 1, 2, 4}, " "systemstream = (boolean) FALSE; " "video/x-h263, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ]; " "video/x-h264, " "stream-format = (string) byte-stream, " "alignment = (string) au, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ]; " "video/x-dv, " "width = (int) 720, " "height = (int) { 576, 480 }, " "framerate = (fraction) [ 0, MAX ], " "systemstream = (boolean) FALSE; " "video/x-huffyuv, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ];" "video/x-wmv, " "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ], " "framerate = (fraction) [ 0, MAX ], " "wmvversion = (int) [ 1, 3];" "image/x-jpc, " "width = (int) [ 1, 2147483647 ], " "height = (int) [ 1, 2147483647 ], " "framerate = (fraction) [ 0, MAX ];" "video/x-vp8, " "width = (int) [ 1, 2147483647 ], " "height = (int) [ 1, 2147483647 ], " "framerate = (fraction) [ 0, MAX ]") ); static GstStaticPadTemplate audio_sink_factory = GST_STATIC_PAD_TEMPLATE ("audio_%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS ("audio/x-raw-int, " "endianness = (int) LITTLE_ENDIAN, " "signed = (boolean) { TRUE, FALSE }, " "width = (int) { 8, 16 }, " "depth = (int) { 8, 16 }, " "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " "audio/mpeg, " "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ], " "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " "audio/mpeg, " "mpegversion = (int) 4, " "stream-format = (string) raw, " "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " /*#if 0 VC6 doesn't support #if here ... "audio/x-vorbis, " "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " #endif*/ "audio/x-ac3, " "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]; " "audio/x-alaw, " "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]; " "audio/x-mulaw, " "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]; " "audio/x-wma, " "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ], " "wmaversion = (int) [ 1, 2 ] ") ); static void gst_avi_mux_base_init (gpointer g_class); static void gst_avi_mux_class_init (GstAviMuxClass * klass); static void gst_avi_mux_init (GstAviMux * avimux); static void gst_avi_mux_pad_reset (GstAviPad * avipad, gboolean free); static GstFlowReturn gst_avi_mux_collect_pads (GstCollectPads * pads, GstAviMux * avimux); static gboolean gst_avi_mux_handle_event (GstPad * pad, GstEvent * event); static GstPad *gst_avi_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); static void gst_avi_mux_release_pad (GstElement * element, GstPad * pad); static void gst_avi_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_avi_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_avi_mux_change_state (GstElement * element, GstStateChange transition); static GstElementClass *parent_class = NULL; GType gst_avi_mux_get_type (void) { static GType avimux_type = 0; if (!avimux_type) { static const GTypeInfo avimux_info = { sizeof (GstAviMuxClass), gst_avi_mux_base_init, NULL, (GClassInitFunc) gst_avi_mux_class_init, NULL, NULL, sizeof (GstAviMux), 0, (GInstanceInitFunc) gst_avi_mux_init, }; static const GInterfaceInfo tag_setter_info = { NULL, NULL, NULL }; avimux_type = g_type_register_static (GST_TYPE_ELEMENT, "GstAviMux", &avimux_info, 0); g_type_add_interface_static (avimux_type, GST_TYPE_TAG_SETTER, &tag_setter_info); } return avimux_type; } static void gst_avi_mux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_static_pad_template (element_class, &src_factory); gst_element_class_add_static_pad_template (element_class, &audio_sink_factory); gst_element_class_add_static_pad_template (element_class, &video_sink_factory); gst_element_class_set_details_simple (element_class, "Avi muxer", "Codec/Muxer", "Muxes audio and video into an avi stream", "GStreamer maintainers "); GST_DEBUG_CATEGORY_INIT (avimux_debug, "avimux", 0, "Muxer for AVI streams"); } static void gst_avi_mux_finalize (GObject * object) { GstAviMux *mux = GST_AVI_MUX (object); GSList *node; /* completely free each sinkpad */ node = mux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; node = node->next; gst_avi_mux_pad_reset (avipad, TRUE); g_free (avipad); } g_slist_free (mux->sinkpads); mux->sinkpads = NULL; g_free (mux->idx); mux->idx = NULL; gst_object_unref (mux->collect); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_avi_mux_class_init (GstAviMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->get_property = gst_avi_mux_get_property; gobject_class->set_property = gst_avi_mux_set_property; gobject_class->finalize = gst_avi_mux_finalize; g_object_class_install_property (gobject_class, ARG_BIGFILE, g_param_spec_boolean ("bigfile", "Bigfile Support (>2GB)", "Support for openDML-2.0 (big) AVI files", DEFAULT_BIGFILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (gst_avi_mux_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_avi_mux_release_pad); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_avi_mux_change_state); } /* reset pad to initial state * free - if true, release all, not only stream related, data */ static void gst_avi_mux_pad_reset (GstAviPad * avipad, gboolean free) { /* generic part */ memset (&(avipad->hdr), 0, sizeof (gst_riff_strh)); memset (&(avipad->idx[0]), 0, sizeof (avipad->idx)); if (free) { g_free (avipad->tag); avipad->tag = NULL; g_free (avipad->idx_tag); avipad->idx_tag = NULL; } if (avipad->is_video) { GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; avipad->hdr.type = GST_MAKE_FOURCC ('v', 'i', 'd', 's'); if (vidpad->vids_codec_data) { gst_buffer_unref (vidpad->vids_codec_data); vidpad->vids_codec_data = NULL; } if (vidpad->prepend_buffer) { gst_buffer_unref (vidpad->prepend_buffer); vidpad->prepend_buffer = NULL; } memset (&(vidpad->vids), 0, sizeof (gst_riff_strf_vids)); memset (&(vidpad->vprp), 0, sizeof (gst_riff_vprp)); } else { GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; audpad->samples = 0; avipad->hdr.type = GST_MAKE_FOURCC ('a', 'u', 'd', 's'); if (audpad->auds_codec_data) { gst_buffer_unref (audpad->auds_codec_data); audpad->auds_codec_data = NULL; } memset (&(audpad->auds), 0, sizeof (gst_riff_strf_auds)); } } static void gst_avi_mux_reset (GstAviMux * avimux) { GSList *node, *newlist = NULL; /* free and reset each sinkpad */ node = avimux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; node = node->next; gst_avi_mux_pad_reset (avipad, FALSE); /* if this pad has collectdata, keep it, otherwise dump it completely */ if (avipad->collect) newlist = g_slist_append (newlist, avipad); else { gst_avi_mux_pad_reset (avipad, TRUE); g_free (avipad); } } /* free the old list of sinkpads, only keep the real collecting ones */ g_slist_free (avimux->sinkpads); avimux->sinkpads = newlist; /* avi data */ avimux->num_frames = 0; memset (&(avimux->avi_hdr), 0, sizeof (gst_riff_avih)); avimux->avi_hdr.max_bps = 10000000; avimux->codec_data_size = 0; if (avimux->tags_snap) { gst_tag_list_free (avimux->tags_snap); avimux->tags_snap = NULL; } g_free (avimux->idx); avimux->idx = NULL; /* state info */ avimux->write_header = TRUE; /* tags */ gst_tag_setter_reset_tags (GST_TAG_SETTER (avimux)); } static void gst_avi_mux_init (GstAviMux * avimux) { avimux->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_use_fixed_caps (avimux->srcpad); gst_element_add_pad (GST_ELEMENT (avimux), avimux->srcpad); /* property */ avimux->enable_large_avi = DEFAULT_BIGFILE; avimux->collect = gst_collect_pads_new (); gst_collect_pads_set_function (avimux->collect, (GstCollectPadsFunction) (GST_DEBUG_FUNCPTR (gst_avi_mux_collect_pads)), avimux); /* set to clean state */ gst_avi_mux_reset (avimux); } static gboolean gst_avi_mux_vidsink_set_caps (GstPad * pad, GstCaps * vscaps) { GstAviMux *avimux; GstAviVideoPad *avipad; GstAviCollectData *collect_pad; GstStructure *structure; const gchar *mimetype; const GValue *fps, *par; const GValue *codec_data; gint width, height; gint par_n, par_d; gboolean codec_data_in_headers = TRUE; avimux = GST_AVI_MUX (gst_pad_get_parent (pad)); /* find stream data */ collect_pad = (GstAviCollectData *) gst_pad_get_element_private (pad); g_assert (collect_pad); avipad = (GstAviVideoPad *) collect_pad->avipad; g_assert (avipad); g_assert (avipad->parent.is_video); g_assert (avipad->parent.hdr.type == GST_MAKE_FOURCC ('v', 'i', 'd', 's')); GST_DEBUG_OBJECT (avimux, "%s:%s, caps=%" GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (pad), vscaps); structure = gst_caps_get_structure (vscaps, 0); mimetype = gst_structure_get_name (structure); /* global */ avipad->vids.size = sizeof (gst_riff_strf_vids); avipad->vids.planes = 1; if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "height", &height)) { goto refuse_caps; } avipad->vids.width = width; avipad->vids.height = height; fps = gst_structure_get_value (structure, "framerate"); if (fps == NULL || !GST_VALUE_HOLDS_FRACTION (fps)) goto refuse_caps; avipad->parent.hdr.rate = gst_value_get_fraction_numerator (fps); avipad->parent.hdr.scale = gst_value_get_fraction_denominator (fps); /* (pixel) aspect ratio data, if any */ par = gst_structure_get_value (structure, "pixel-aspect-ratio"); /* only use video properties header if there is non-trivial aspect info */ if (par && GST_VALUE_HOLDS_FRACTION (par) && ((par_n = gst_value_get_fraction_numerator (par)) != (par_d = gst_value_get_fraction_denominator (par)))) { GValue to_ratio = { 0, }; guint ratio_n, ratio_d; /* some fraction voodoo to obtain simplest possible ratio */ g_value_init (&to_ratio, GST_TYPE_FRACTION); gst_value_set_fraction (&to_ratio, width * par_n, height * par_d); ratio_n = gst_value_get_fraction_numerator (&to_ratio); ratio_d = gst_value_get_fraction_denominator (&to_ratio); GST_DEBUG_OBJECT (avimux, "generating vprp data with aspect ratio %d/%d", ratio_n, ratio_d); /* simply fill in */ avipad->vprp.vert_rate = avipad->parent.hdr.rate / avipad->parent.hdr.scale; avipad->vprp.hor_t_total = width; avipad->vprp.vert_lines = height; avipad->vprp.aspect = (ratio_n) << 16 | (ratio_d & 0xffff); avipad->vprp.width = width; avipad->vprp.height = height; avipad->vprp.fields = 1; avipad->vprp.field_info[0].compressed_bm_height = height; avipad->vprp.field_info[0].compressed_bm_width = width; avipad->vprp.field_info[0].valid_bm_height = height; avipad->vprp.field_info[0].valid_bm_width = width; } if (!strcmp (mimetype, "video/x-raw-yuv")) { guint32 format; gst_structure_get_fourcc (structure, "format", &format); avipad->vids.compression = format; switch (format) { case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): avipad->vids.bit_cnt = 16; break; case GST_MAKE_FOURCC ('I', '4', '2', '0'): avipad->vids.bit_cnt = 12; break; } } else { avipad->vids.bit_cnt = 24; avipad->vids.compression = 0; /* find format */ if (!strcmp (mimetype, "video/x-huffyuv")) { avipad->vids.compression = GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'); } else if (!strcmp (mimetype, "image/jpeg")) { avipad->vids.compression = GST_MAKE_FOURCC ('M', 'J', 'P', 'G'); } else if (!strcmp (mimetype, "video/x-divx")) { gint divxversion; gst_structure_get_int (structure, "divxversion", &divxversion); switch (divxversion) { case 3: avipad->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', '3'); break; case 4: avipad->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); break; case 5: avipad->vids.compression = GST_MAKE_FOURCC ('D', 'X', '5', '0'); break; } } else if (!strcmp (mimetype, "video/x-xvid")) { avipad->vids.compression = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); } else if (!strcmp (mimetype, "video/x-3ivx")) { avipad->vids.compression = GST_MAKE_FOURCC ('3', 'I', 'V', '2'); } else if (gst_structure_has_name (structure, "video/x-msmpeg")) { gint msmpegversion; gst_structure_get_int (structure, "msmpegversion", &msmpegversion); switch (msmpegversion) { case 41: avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'G', '4'); break; case 42: avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '2'); break; case 43: avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '3'); break; default: GST_INFO ("unhandled msmpegversion : %d, fall back to fourcc=MPEG", msmpegversion); avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'E', 'G'); break; } } else if (!strcmp (mimetype, "video/x-dv")) { avipad->vids.compression = GST_MAKE_FOURCC ('D', 'V', 'S', 'D'); } else if (!strcmp (mimetype, "video/x-h263")) { avipad->vids.compression = GST_MAKE_FOURCC ('H', '2', '6', '3'); } else if (!strcmp (mimetype, "video/x-h264")) { avipad->vids.compression = GST_MAKE_FOURCC ('H', '2', '6', '4'); } else if (!strcmp (mimetype, "video/mpeg")) { gint mpegversion; gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 2: avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'G', '2'); break; case 4: /* mplayer/ffmpeg might not work with DIVX, but with FMP4 */ avipad->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); /* DIVX/XVID in AVI store the codec_data chunk as part of the first data buffer. So for this case, we prepend the codec_data blob (if any) to that first buffer */ codec_data_in_headers = FALSE; break; default: GST_INFO ("unhandled mpegversion : %d, fall back to fourcc=MPEG", mpegversion); avipad->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'E', 'G'); break; } } else if (!strcmp (mimetype, "video/x-wmv")) { gint wmvversion; if (gst_structure_get_int (structure, "wmvversion", &wmvversion)) { switch (wmvversion) { case 1: avipad->vids.compression = GST_MAKE_FOURCC ('W', 'M', 'V', '1'); break; case 2: avipad->vids.compression = GST_MAKE_FOURCC ('W', 'M', 'V', '2'); break; case 3: avipad->vids.compression = GST_MAKE_FOURCC ('W', 'M', 'V', '3'); default: break; } } } else if (!strcmp (mimetype, "image/x-jpc")) { avipad->vids.compression = GST_MAKE_FOURCC ('M', 'J', '2', 'C'); } else if (!strcmp (mimetype, "video/x-vp8")) { avipad->vids.compression = GST_MAKE_FOURCC ('V', 'P', '8', '0'); } if (!avipad->vids.compression) goto refuse_caps; } /* codec initialization data, if any */ codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { if (codec_data_in_headers) { avipad->vids_codec_data = gst_value_get_buffer (codec_data); gst_buffer_ref (avipad->vids_codec_data); /* keep global track of size */ avimux->codec_data_size += GST_BUFFER_SIZE (avipad->vids_codec_data); } else { avipad->prepend_buffer = gst_buffer_ref (gst_value_get_buffer (codec_data)); } } avipad->parent.hdr.fcc_handler = avipad->vids.compression; avipad->vids.image_size = avipad->vids.height * avipad->vids.width; /* hm, maybe why avi only handles one stream well ... */ avimux->avi_hdr.width = avipad->vids.width; avimux->avi_hdr.height = avipad->vids.height; avimux->avi_hdr.us_frame = 1000000. * avipad->parent.hdr.scale / avipad->parent.hdr.rate; gst_object_unref (avimux); return TRUE; refuse_caps: { GST_WARNING_OBJECT (avimux, "refused caps %" GST_PTR_FORMAT, vscaps); gst_object_unref (avimux); return FALSE; } } static GstFlowReturn gst_avi_mux_audsink_scan_mpeg_audio (GstAviMux * avimux, GstAviPad * avipad, GstBuffer * buffer) { guint8 *data; guint size; guint spf; guint32 header; gulong layer; gulong version; gint lsf, mpg25; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < 4) goto not_parsed; header = GST_READ_UINT32_BE (data); if ((header & 0xffe00000) != 0xffe00000) goto not_parsed; /* thanks go to mp3parse */ if (header & (1 << 20)) { lsf = (header & (1 << 19)) ? 0 : 1; mpg25 = 0; } else { lsf = 1; mpg25 = 1; } version = 1 + lsf + mpg25; layer = 4 - ((header >> 17) & 0x3); /* see http://www.codeproject.com/audio/MPEGAudioInfo.asp */ if (layer == 1) spf = 384; else if (layer == 2) spf = 1152; else if (version == 1) { spf = 1152; } else { /* MPEG-2 or "2.5" */ spf = 576; } if (G_UNLIKELY (avipad->hdr.scale <= 1)) avipad->hdr.scale = spf; else if (G_UNLIKELY (avipad->hdr.scale != spf)) { GST_WARNING_OBJECT (avimux, "input mpeg audio has varying frame size"); goto cbr_fallback; } return GST_FLOW_OK; /* EXITS */ not_parsed: { GST_WARNING_OBJECT (avimux, "input mpeg audio is not parsed"); /* fall-through */ } cbr_fallback: { GST_WARNING_OBJECT (avimux, "falling back to CBR muxing"); avipad->hdr.scale = 1; /* no need to check further */ avipad->hook = NULL; return GST_FLOW_OK; } } static void gst_avi_mux_audsink_set_fields (GstAviMux * avimux, GstAviAudioPad * avipad) { if (avipad->parent.hdr.scale > 1) { /* vbr case: fixed duration per frame/chunk */ avipad->parent.hdr.rate = avipad->auds.rate; avipad->parent.hdr.samplesize = 0; /* FIXME ?? some rumours say this should be largest audio chunk size */ avipad->auds.blockalign = avipad->parent.hdr.scale; } else { /* by spec, hdr.rate is av_bps related, is calculated that way in stop_file, * and reduces to sample rate in PCM like cases */ avipad->parent.hdr.rate = avipad->auds.av_bps / avipad->auds.blockalign; avipad->parent.hdr.samplesize = avipad->auds.blockalign; avipad->parent.hdr.scale = 1; } } static gboolean gst_avi_mux_audsink_set_caps (GstPad * pad, GstCaps * vscaps) { GstAviMux *avimux; GstAviAudioPad *avipad; GstAviCollectData *collect_pad; GstStructure *structure; const gchar *mimetype; const GValue *codec_data; gint channels, rate; avimux = GST_AVI_MUX (gst_pad_get_parent (pad)); /* find stream data */ collect_pad = (GstAviCollectData *) gst_pad_get_element_private (pad); g_assert (collect_pad); avipad = (GstAviAudioPad *) collect_pad->avipad; g_assert (avipad); g_assert (!avipad->parent.is_video); g_assert (avipad->parent.hdr.type == GST_MAKE_FOURCC ('a', 'u', 'd', 's')); GST_DEBUG_OBJECT (avimux, "%s:%s, caps=%" GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (pad), vscaps); structure = gst_caps_get_structure (vscaps, 0); mimetype = gst_structure_get_name (structure); /* we want these for all */ if (!gst_structure_get_int (structure, "channels", &channels) || !gst_structure_get_int (structure, "rate", &rate)) { goto refuse_caps; } avipad->auds.channels = channels; avipad->auds.rate = rate; /* codec initialization data, if any */ codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { avipad->auds_codec_data = gst_value_get_buffer (codec_data); gst_buffer_ref (avipad->auds_codec_data); /* keep global track of size */ avimux->codec_data_size += GST_BUFFER_SIZE (avipad->auds_codec_data); } if (!strcmp (mimetype, "audio/x-raw-int")) { gint width, depth; gboolean signedness; avipad->auds.format = GST_RIFF_WAVE_FORMAT_PCM; if (!gst_structure_get_int (structure, "width", &width) || !gst_structure_get_int (structure, "depth", &depth) || !gst_structure_get_boolean (structure, "signed", &signedness)) { GST_DEBUG_OBJECT (avimux, "broken caps, width/depth/signed field missing"); goto refuse_caps; } /* no clear place to put different values for these while keeping to spec */ if (width != depth) { GST_DEBUG_OBJECT (avimux, "width must be same as depth!"); goto refuse_caps; } /* because that's the way the caps will be recreated from riff data */ if ((width == 8 && signedness) || (width == 16 && !signedness)) { GST_DEBUG_OBJECT (avimux, "8-bit PCM must be unsigned, 16-bit PCM signed"); goto refuse_caps; } avipad->auds.blockalign = width; avipad->auds.size = (width == 8) ? 8 : depth; /* set some more info straight */ avipad->auds.blockalign /= 8; avipad->auds.blockalign *= avipad->auds.channels; avipad->auds.av_bps = avipad->auds.blockalign * avipad->auds.rate; } else { avipad->auds.format = 0; /* set some defaults */ avipad->auds.blockalign = 1; avipad->auds.av_bps = 0; avipad->auds.size = 16; if (!strcmp (mimetype, "audio/mpeg")) { gint mpegversion; gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 1:{ gint layer = 3; gboolean parsed = FALSE; gst_structure_get_int (structure, "layer", &layer); gst_structure_get_boolean (structure, "parsed", &parsed); switch (layer) { case 3: avipad->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL3; break; case 1: case 2: avipad->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL12; break; } if (parsed) { /* treat as VBR, should also cover CBR case; * setup hook to parse frame header and determine spf */ avipad->parent.hook = gst_avi_mux_audsink_scan_mpeg_audio; } else { GST_WARNING_OBJECT (avimux, "unparsed MPEG audio input (?), " "doing CBR muxing"); } break; } case 4: { GstBuffer *codec_data_buf = avipad->auds_codec_data; const gchar *stream_format; guint codec; stream_format = gst_structure_get_string (structure, "stream-format"); if (stream_format) { if (strcmp (stream_format, "raw") != 0) { GST_WARNING_OBJECT (avimux, "AAC's stream format '%s' is not " "supported, please use 'raw'", stream_format); break; } } else { GST_WARNING_OBJECT (avimux, "AAC's stream-format not specified, " "assuming 'raw'"); } /* vbr case needs some special handling */ if (!codec_data_buf || GST_BUFFER_SIZE (codec_data_buf) < 2) { GST_WARNING_OBJECT (avimux, "no (valid) codec_data for AAC audio"); break; } avipad->auds.format = GST_RIFF_WAVE_FORMAT_AAC; /* need to determine frame length */ codec = GST_READ_UINT16_BE (GST_BUFFER_DATA (codec_data_buf)); avipad->parent.hdr.scale = (codec & 0x4) ? 960 : 1024; break; } } } else if (!strcmp (mimetype, "audio/x-vorbis")) { avipad->auds.format = GST_RIFF_WAVE_FORMAT_VORBIS3; } else if (!strcmp (mimetype, "audio/x-ac3")) { avipad->auds.format = GST_RIFF_WAVE_FORMAT_A52; } else if (!strcmp (mimetype, "audio/x-alaw")) { avipad->auds.format = GST_RIFF_WAVE_FORMAT_ALAW; avipad->auds.size = 8; avipad->auds.blockalign = avipad->auds.channels; avipad->auds.av_bps = avipad->auds.blockalign * avipad->auds.rate; } else if (!strcmp (mimetype, "audio/x-mulaw")) { avipad->auds.format = GST_RIFF_WAVE_FORMAT_MULAW; avipad->auds.size = 8; avipad->auds.blockalign = avipad->auds.channels; avipad->auds.av_bps = avipad->auds.blockalign * avipad->auds.rate; } else if (!strcmp (mimetype, "audio/x-wma")) { gint version; gint bitrate; gint block_align; if (gst_structure_get_int (structure, "wmaversion", &version)) { switch (version) { case 1: avipad->auds.format = GST_RIFF_WAVE_FORMAT_WMAV1; break; case 2: avipad->auds.format = GST_RIFF_WAVE_FORMAT_WMAV2; break; default: break; } } if (avipad->auds.format != 0) { if (gst_structure_get_int (structure, "block_align", &block_align)) { avipad->auds.blockalign = block_align; } if (gst_structure_get_int (structure, "bitrate", &bitrate)) { avipad->auds.av_bps = bitrate / 8; } } } } if (!avipad->auds.format) goto refuse_caps; avipad->parent.hdr.fcc_handler = avipad->auds.format; gst_avi_mux_audsink_set_fields (avimux, avipad); gst_object_unref (avimux); return TRUE; refuse_caps: { GST_WARNING_OBJECT (avimux, "refused caps %" GST_PTR_FORMAT, vscaps); gst_object_unref (avimux); return FALSE; } } static GstPad * gst_avi_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * req_name) { GstAviMux *avimux; GstPad *newpad; GstAviPad *avipad; GstElementClass *klass; gchar *name = NULL; const gchar *pad_name = NULL; GstPadSetCapsFunction setcapsfunc = NULL; gint pad_id; g_return_val_if_fail (templ != NULL, NULL); if (templ->direction != GST_PAD_SINK) goto wrong_direction; g_return_val_if_fail (GST_IS_AVI_MUX (element), NULL); avimux = GST_AVI_MUX (element); if (!avimux->write_header) goto too_late; klass = GST_ELEMENT_GET_CLASS (element); /* FIXME-0.11: use %d instead of %02d for pad_names */ if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { /* don't mix named and unnamed pads, if the pad already exists we fail when * trying to add it */ if (req_name != NULL && sscanf (req_name, "audio_%02d", &pad_id) == 1) { pad_name = req_name; } else { name = g_strdup_printf ("audio_%02d", avimux->audio_pads++); pad_name = name; } setcapsfunc = GST_DEBUG_FUNCPTR (gst_avi_mux_audsink_set_caps); /* init pad specific data */ avipad = g_malloc0 (sizeof (GstAviAudioPad)); avipad->is_video = FALSE; avipad->hdr.type = GST_MAKE_FOURCC ('a', 'u', 'd', 's'); /* audio goes last */ avimux->sinkpads = g_slist_append (avimux->sinkpads, avipad); } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { /* though streams are pretty generic and relatively self-contained, * some video info goes in a single avi header -and therefore mux struct- * so video restricted to one stream */ if (avimux->video_pads > 0) goto too_many_video_pads; /* setup pad */ pad_name = "video_00"; avimux->video_pads++; setcapsfunc = GST_DEBUG_FUNCPTR (gst_avi_mux_vidsink_set_caps); /* init pad specific data */ avipad = g_malloc0 (sizeof (GstAviVideoPad)); avipad->is_video = TRUE; avipad->hdr.type = GST_MAKE_FOURCC ('v', 'i', 'd', 's'); /* video goes first */ avimux->sinkpads = g_slist_prepend (avimux->sinkpads, avipad); } else goto wrong_template; newpad = gst_pad_new_from_template (templ, pad_name); gst_pad_set_setcaps_function (newpad, setcapsfunc); g_free (name); avipad->collect = gst_collect_pads_add_pad (avimux->collect, newpad, sizeof (GstAviCollectData)); ((GstAviCollectData *) (avipad->collect))->avipad = avipad; /* FIXME: hacked way to override/extend the event function of * GstCollectPads; because it sets its own event function giving the * element no access to events */ avimux->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad); gst_pad_set_event_function (newpad, GST_DEBUG_FUNCPTR (gst_avi_mux_handle_event)); if (!gst_element_add_pad (element, newpad)) goto pad_add_failed; GST_DEBUG_OBJECT (newpad, "Added new request pad"); return newpad; /* ERRORS */ wrong_direction: { g_warning ("avimux: request pad that is not a SINK pad\n"); return NULL; } too_late: { g_warning ("avimux: request pad cannot be added after streaming started\n"); return NULL; } wrong_template: { g_warning ("avimux: this is not our template!\n"); return NULL; } too_many_video_pads: { GST_WARNING_OBJECT (avimux, "Can only have one video stream"); return NULL; } pad_add_failed: { GST_WARNING_OBJECT (avimux, "Adding the new pad '%s' failed", pad_name); gst_object_unref (newpad); return NULL; } } static void gst_avi_mux_release_pad (GstElement * element, GstPad * pad) { GstAviMux *avimux = GST_AVI_MUX (element); GSList *node; node = avimux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; if (avipad->collect->pad == pad) { /* pad count should not be adjusted, * as it also represent number of streams present */ avipad->collect = NULL; GST_DEBUG_OBJECT (avimux, "removed pad '%s'", GST_PAD_NAME (pad)); gst_collect_pads_remove_pad (avimux->collect, pad); gst_element_remove_pad (element, pad); /* if not started yet, we can remove any sign this pad ever existed */ /* in this case _start will take care of the real pad count */ if (avimux->write_header) { avimux->sinkpads = g_slist_remove (avimux->sinkpads, avipad); gst_avi_mux_pad_reset (avipad, TRUE); g_free (avipad); } return; } node = node->next; } g_warning ("Unknown pad %s", GST_PAD_NAME (pad)); } static inline guint gst_avi_mux_start_chunk (GstByteWriter * bw, const gchar * tag, guint32 fourcc) { guint chunk_offset; if (tag) gst_byte_writer_put_data (bw, (const guint8 *) tag, 4); else gst_byte_writer_put_uint32_le (bw, fourcc); chunk_offset = gst_byte_writer_get_pos (bw); /* real chunk size comes later */ gst_byte_writer_put_uint32_le (bw, 0); return chunk_offset; } static inline void gst_avi_mux_end_chunk (GstByteWriter * bw, guint chunk_offset) { guint size; size = gst_byte_writer_get_pos (bw); gst_byte_writer_set_pos (bw, chunk_offset); gst_byte_writer_put_uint32_le (bw, size - chunk_offset - 4); gst_byte_writer_set_pos (bw, size); /* arrange for even padding */ if (size & 1) gst_byte_writer_put_uint8 (bw, 0); } /* maybe some of these functions should be moved to riff.h? */ static void gst_avi_mux_write_tag (const GstTagList * list, const gchar * tag, gpointer data) { const struct { guint32 fcc; const gchar *tag; } rifftags[] = { { GST_RIFF_INFO_IARL, GST_TAG_LOCATION}, { GST_RIFF_INFO_IART, GST_TAG_ARTIST}, { GST_RIFF_INFO_ICMT, GST_TAG_COMMENT}, { GST_RIFF_INFO_ICOP, GST_TAG_COPYRIGHT}, { GST_RIFF_INFO_ICRD, GST_TAG_DATE}, { GST_RIFF_INFO_IGNR, GST_TAG_GENRE}, { GST_RIFF_INFO_IKEY, GST_TAG_KEYWORDS}, { GST_RIFF_INFO_INAM, GST_TAG_TITLE}, { GST_RIFF_INFO_ISFT, GST_TAG_ENCODER}, { GST_RIFF_INFO_ISRC, GST_TAG_ISRC}, { 0, NULL} }; gint n; gchar *str; GstByteWriter *bw = data; guint chunk; for (n = 0; rifftags[n].fcc != 0; n++) { if (!strcmp (rifftags[n].tag, tag) && gst_tag_list_get_string (list, tag, &str) && str) { chunk = gst_avi_mux_start_chunk (bw, NULL, rifftags[n].fcc); gst_byte_writer_put_string (bw, str); gst_avi_mux_end_chunk (bw, chunk); g_free (str); break; } } } static GstBuffer * gst_avi_mux_riff_get_avi_header (GstAviMux * avimux) { const GstTagList *tags; GstBuffer *buffer; gint size = 0; GstByteWriter bw; GSList *node; guint avih, riff, hdrl; GST_DEBUG_OBJECT (avimux, "creating avi header, data_size %u, idx_size %u", avimux->data_size, avimux->idx_size); if (avimux->tags_snap) tags = avimux->tags_snap; else { /* need to make snapshot of current state of tags to ensure the same set * is used next time around during header rewrite at the end */ tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (avimux)); if (tags) tags = avimux->tags_snap = gst_tag_list_copy (tags); } gst_byte_writer_init_with_size (&bw, 1024, FALSE); /* avi header metadata */ riff = gst_avi_mux_start_chunk (&bw, "RIFF", 0); gst_byte_writer_put_data (&bw, (guint8 *) "AVI ", 4); hdrl = gst_avi_mux_start_chunk (&bw, "LIST", 0); gst_byte_writer_put_data (&bw, (guint8 *) "hdrl", 4); avih = gst_avi_mux_start_chunk (&bw, "avih", 0); /* the AVI header itself */ gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.us_frame); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.max_bps); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.pad_gran); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.flags); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.tot_frames); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.init_frames); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.streams); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.bufsize); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.width); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.height); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.scale); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.rate); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.start); gst_byte_writer_put_uint32_le (&bw, avimux->avi_hdr.length); gst_avi_mux_end_chunk (&bw, avih); /* stream data */ node = avimux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; gint codec_size = 0; guint strh, strl, strf, indx; /* stream list metadata */ strl = gst_avi_mux_start_chunk (&bw, "LIST", 0); gst_byte_writer_put_data (&bw, (guint8 *) "strl", 4); /* generic header */ strh = gst_avi_mux_start_chunk (&bw, "strh", 0); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.type); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.fcc_handler); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.flags); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.priority); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.init_frames); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.scale); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.rate); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.start); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.length); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.bufsize); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.quality); gst_byte_writer_put_uint32_le (&bw, avipad->hdr.samplesize); gst_byte_writer_put_uint16_le (&bw, 0); gst_byte_writer_put_uint16_le (&bw, 0); gst_byte_writer_put_uint16_le (&bw, 0); gst_byte_writer_put_uint16_le (&bw, 0); gst_avi_mux_end_chunk (&bw, strh); if (avipad->is_video) { codec_size = vidpad->vids_codec_data ? GST_BUFFER_SIZE (vidpad->vids_codec_data) : 0; /* the video header */ strf = gst_avi_mux_start_chunk (&bw, "strf", 0); /* the actual header */ gst_byte_writer_put_uint32_le (&bw, vidpad->vids.size + codec_size); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.width); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.height); gst_byte_writer_put_uint16_le (&bw, vidpad->vids.planes); gst_byte_writer_put_uint16_le (&bw, vidpad->vids.bit_cnt); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.compression); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.image_size); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.xpels_meter); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.ypels_meter); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.num_colors); gst_byte_writer_put_uint32_le (&bw, vidpad->vids.imp_colors); if (vidpad->vids_codec_data) { gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (vidpad->vids_codec_data), GST_BUFFER_SIZE (vidpad->vids_codec_data)); } gst_avi_mux_end_chunk (&bw, strf); /* add video property data, mainly for aspect ratio, if any */ if (vidpad->vprp.aspect) { gint f; guint vprp; /* let's be on the safe side */ vidpad->vprp.fields = MIN (vidpad->vprp.fields, GST_RIFF_VPRP_VIDEO_FIELDS); /* the vprp header */ vprp = gst_avi_mux_start_chunk (&bw, "vprp", 0); /* the actual data */ gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.format_token); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.standard); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.vert_rate); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.hor_t_total); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.vert_lines); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.aspect); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.width); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.height); gst_byte_writer_put_uint32_le (&bw, vidpad->vprp.fields); for (f = 0; f < vidpad->vprp.fields; ++f) { gst_riff_vprp_video_field_desc *fd; fd = &(vidpad->vprp.field_info[f]); gst_byte_writer_put_uint32_le (&bw, fd->compressed_bm_height); gst_byte_writer_put_uint32_le (&bw, fd->compressed_bm_width); gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_height); gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_width); gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_x_offset); gst_byte_writer_put_uint32_le (&bw, fd->valid_bm_y_offset); gst_byte_writer_put_uint32_le (&bw, fd->video_x_t_offset); gst_byte_writer_put_uint32_le (&bw, fd->video_y_start); } gst_avi_mux_end_chunk (&bw, vprp); } } else { codec_size = audpad->auds_codec_data ? GST_BUFFER_SIZE (audpad->auds_codec_data) : 0; /* the audio header */ strf = gst_avi_mux_start_chunk (&bw, "strf", 0); /* the actual header */ gst_byte_writer_put_uint16_le (&bw, audpad->auds.format); gst_byte_writer_put_uint16_le (&bw, audpad->auds.channels); gst_byte_writer_put_uint32_le (&bw, audpad->auds.rate); gst_byte_writer_put_uint32_le (&bw, audpad->auds.av_bps); gst_byte_writer_put_uint16_le (&bw, audpad->auds.blockalign); gst_byte_writer_put_uint16_le (&bw, audpad->auds.size); gst_byte_writer_put_uint16_le (&bw, codec_size); if (audpad->auds_codec_data) { gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (audpad->auds_codec_data), GST_BUFFER_SIZE (audpad->auds_codec_data)); } gst_avi_mux_end_chunk (&bw, strf); } /* odml superindex chunk */ if (avipad->idx_index > 0) indx = gst_avi_mux_start_chunk (&bw, "indx", 0); else indx = gst_avi_mux_start_chunk (&bw, "JUNK", 0); gst_byte_writer_put_uint16_le (&bw, 4); /* bytes per entry */ gst_byte_writer_put_uint8 (&bw, 0); /* index subtype */ gst_byte_writer_put_uint8 (&bw, GST_AVI_INDEX_OF_INDEXES); /* index type */ gst_byte_writer_put_uint32_le (&bw, avipad->idx_index); /* entries in use */ gst_byte_writer_put_data (&bw, (guint8 *) avipad->tag, 4); /* stream id */ gst_byte_writer_put_uint32_le (&bw, 0); /* reserved */ gst_byte_writer_put_uint32_le (&bw, 0); /* reserved */ gst_byte_writer_put_uint32_le (&bw, 0); /* reserved */ gst_byte_writer_put_data (&bw, (guint8 *) avipad->idx, GST_AVI_SUPERINDEX_COUNT * sizeof (gst_avi_superindex_entry)); gst_avi_mux_end_chunk (&bw, indx); /* end strl for this stream */ gst_avi_mux_end_chunk (&bw, strl); node = node->next; } if (avimux->video_pads > 0) { guint odml, dmlh; /* odml header */ odml = gst_avi_mux_start_chunk (&bw, "LIST", 0); gst_byte_writer_put_data (&bw, (guint8 *) "odml", 4); dmlh = gst_avi_mux_start_chunk (&bw, "dmlh", 0); gst_byte_writer_put_uint32_le (&bw, avimux->total_frames); gst_avi_mux_end_chunk (&bw, dmlh); gst_avi_mux_end_chunk (&bw, odml); } /* end hdrl */ gst_avi_mux_end_chunk (&bw, hdrl); /* tags */ if (tags) { guint info; info = gst_avi_mux_start_chunk (&bw, "LIST", 0); gst_byte_writer_put_data (&bw, (guint8 *) "INFO", 4); gst_tag_list_foreach (tags, gst_avi_mux_write_tag, &bw); if (info + 8 == gst_byte_writer_get_pos (&bw)) { /* no tags writen, remove the empty INFO LIST as it is useless * and prevents playback in vlc */ gst_byte_writer_set_pos (&bw, info - 4); } else { gst_avi_mux_end_chunk (&bw, info); } } /* pop RIFF */ gst_avi_mux_end_chunk (&bw, riff); /* avi data header */ gst_byte_writer_put_data (&bw, (guint8 *) "LIST", 4); gst_byte_writer_put_uint32_le (&bw, avimux->data_size); gst_byte_writer_put_data (&bw, (guint8 *) "movi", 4); /* now get the data */ buffer = gst_byte_writer_reset_and_get_buffer (&bw); /* ... but RIFF includes more than just header */ size = GST_READ_UINT32_LE (GST_BUFFER_DATA (buffer) + 4); size += 8 + avimux->data_size + avimux->idx_size; GST_WRITE_UINT32_LE (GST_BUFFER_DATA (buffer) + 4, size); GST_MEMDUMP_OBJECT (avimux, "avi header", GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); return buffer; } static GstBuffer * gst_avi_mux_riff_get_avix_header (guint32 datax_size) { GstBuffer *buffer; guint8 *buffdata; buffer = gst_buffer_new_and_alloc (24); buffdata = GST_BUFFER_DATA (buffer); memcpy (buffdata + 0, "RIFF", 4); GST_WRITE_UINT32_LE (buffdata + 4, datax_size + 3 * 4); memcpy (buffdata + 8, "AVIX", 4); memcpy (buffdata + 12, "LIST", 4); GST_WRITE_UINT32_LE (buffdata + 16, datax_size); memcpy (buffdata + 20, "movi", 4); return buffer; } static inline GstBuffer * gst_avi_mux_riff_get_header (GstAviPad * avipad, guint32 video_frame_size) { GstBuffer *buffer; guint8 *buffdata; buffer = gst_buffer_new_and_alloc (8); buffdata = GST_BUFFER_DATA (buffer); memcpy (buffdata + 0, avipad->tag, 4); GST_WRITE_UINT32_LE (buffdata + 4, video_frame_size); return buffer; } /* write an odml index chunk in the movi list */ static GstFlowReturn gst_avi_mux_write_avix_index (GstAviMux * avimux, GstAviPad * avipad, gchar * code, gchar * chunk, gst_avi_superindex_entry * super_index, gint * super_index_count) { GstFlowReturn res; GstBuffer *buffer; guint8 *buffdata, *data; gst_riff_index_entry *entry; gint i; guint32 size, entry_count; gboolean is_pcm = FALSE; guint32 pcm_samples = 0; /* check if it is pcm */ if (avipad && !avipad->is_video) { GstAviAudioPad *audiopad = (GstAviAudioPad *) avipad; if (audiopad->auds.format == GST_RIFF_WAVE_FORMAT_PCM) { pcm_samples = audiopad->samples; is_pcm = TRUE; } } /* allocate the maximum possible */ buffer = gst_buffer_new_and_alloc (32 + 8 * avimux->idx_index); buffdata = GST_BUFFER_DATA (buffer); /* general index chunk info */ memcpy (buffdata + 0, chunk, 4); /* chunk id */ GST_WRITE_UINT32_LE (buffdata + 4, 0); /* chunk size; fill later */ GST_WRITE_UINT16_LE (buffdata + 8, 2); /* index entry is 2 words */ buffdata[10] = 0; /* index subtype */ buffdata[11] = GST_AVI_INDEX_OF_CHUNKS; /* index type: AVI_INDEX_OF_CHUNKS */ GST_WRITE_UINT32_LE (buffdata + 12, 0); /* entries in use; fill later */ memcpy (buffdata + 16, code, 4); /* stream to which index refers */ GST_WRITE_UINT64_LE (buffdata + 20, avimux->avix_start); /* base offset */ GST_WRITE_UINT32_LE (buffdata + 28, 0); /* reserved */ buffdata += 32; /* now the actual index entries */ i = avimux->idx_index; entry = avimux->idx; while (i > 0) { if (memcmp (&entry->id, code, 4) == 0) { /* enter relative offset to the data (!) */ GST_WRITE_UINT32_LE (buffdata, GUINT32_FROM_LE (entry->offset) + 8); /* msb is set if not (!) keyframe */ GST_WRITE_UINT32_LE (buffdata + 4, GUINT32_FROM_LE (entry->size) | (GUINT32_FROM_LE (entry->flags) & GST_RIFF_IF_KEYFRAME ? 0 : 1U << 31)); buffdata += 8; } i--; entry++; } /* ok, now we know the size and no of entries, fill in where needed */ data = GST_BUFFER_DATA (buffer); GST_BUFFER_SIZE (buffer) = size = buffdata - data; GST_WRITE_UINT32_LE (data + 4, size - 8); entry_count = (size - 32) / 8; GST_WRITE_UINT32_LE (data + 12, entry_count); /* decorate and send */ gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); if ((res = gst_pad_push (avimux->srcpad, buffer)) != GST_FLOW_OK) return res; /* keep track of this in superindex (if room) ... */ if (*super_index_count < GST_AVI_SUPERINDEX_COUNT) { i = *super_index_count; super_index[i].offset = GUINT64_TO_LE (avimux->total_data); super_index[i].size = GUINT32_TO_LE (size); if (is_pcm) { super_index[i].duration = GUINT32_TO_LE (pcm_samples); } else { super_index[i].duration = GUINT32_TO_LE (entry_count); } (*super_index_count)++; } else GST_WARNING_OBJECT (avimux, "No more room in superindex of stream %s", code); /* ... and in size */ avimux->total_data += size; if (avimux->is_bigfile) avimux->datax_size += size; else avimux->data_size += size; return GST_FLOW_OK; } /* some other usable functions (thankyou xawtv ;-) ) */ static void gst_avi_mux_add_index (GstAviMux * avimux, GstAviPad * avipad, guint32 flags, guint32 size) { gchar *code = avipad->tag; if (avimux->idx_index == avimux->idx_count) { avimux->idx_count += 256; avimux->idx = g_realloc (avimux->idx, avimux->idx_count * sizeof (gst_riff_index_entry)); } /* in case of pcm audio, we need to count the number of samples for * putting in the indx entries */ if (!avipad->is_video) { GstAviAudioPad *audiopad = (GstAviAudioPad *) avipad; if (audiopad->auds.format == GST_RIFF_WAVE_FORMAT_PCM) { audiopad->samples += size / audiopad->auds.blockalign; } } memcpy (&(avimux->idx[avimux->idx_index].id), code, 4); avimux->idx[avimux->idx_index].flags = GUINT32_TO_LE (flags); avimux->idx[avimux->idx_index].offset = GUINT32_TO_LE (avimux->idx_offset); avimux->idx[avimux->idx_index].size = GUINT32_TO_LE (size); avimux->idx_index++; } static GstFlowReturn gst_avi_mux_write_index (GstAviMux * avimux) { GstFlowReturn res; GstBuffer *buffer; guint8 *buffdata; buffer = gst_buffer_new_and_alloc (8); buffdata = GST_BUFFER_DATA (buffer); memcpy (buffdata + 0, "idx1", 4); GST_WRITE_UINT32_LE (buffdata + 4, avimux->idx_index * sizeof (gst_riff_index_entry)); gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); res = gst_pad_push (avimux->srcpad, buffer); if (res != GST_FLOW_OK) return res; buffer = gst_buffer_new (); GST_BUFFER_SIZE (buffer) = avimux->idx_index * sizeof (gst_riff_index_entry); GST_BUFFER_DATA (buffer) = (guint8 *) avimux->idx; GST_BUFFER_MALLOCDATA (buffer) = GST_BUFFER_DATA (buffer); avimux->idx = NULL; /* will be free()'ed by gst_buffer_unref() */ avimux->total_data += GST_BUFFER_SIZE (buffer) + 8; gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); res = gst_pad_push (avimux->srcpad, buffer); if (res != GST_FLOW_OK) return res; avimux->idx_size += avimux->idx_index * sizeof (gst_riff_index_entry) + 8; /* update header */ avimux->avi_hdr.flags |= GST_RIFF_AVIH_HASINDEX; return GST_FLOW_OK; } static GstFlowReturn gst_avi_mux_bigfile (GstAviMux * avimux, gboolean last) { GstFlowReturn res = GST_FLOW_OK; GstBuffer *header; GstEvent *event; GSList *node; /* first some odml standard index chunks in the movi list */ node = avimux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; node = node->next; res = gst_avi_mux_write_avix_index (avimux, avipad, avipad->tag, avipad->idx_tag, avipad->idx, &avipad->idx_index); if (res != GST_FLOW_OK) return res; } if (avimux->is_bigfile) { /* search back */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, avimux->avix_start, GST_CLOCK_TIME_NONE, avimux->avix_start); /* if the event succeeds */ gst_pad_push_event (avimux->srcpad, event); /* rewrite AVIX header */ header = gst_avi_mux_riff_get_avix_header (avimux->datax_size); gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); res = gst_pad_push (avimux->srcpad, header); /* go back to current location, at least try */ event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, avimux->total_data, GST_CLOCK_TIME_NONE, avimux->total_data); gst_pad_push_event (avimux->srcpad, event); if (res != GST_FLOW_OK) return res; } else { /* write a standard index in the first riff chunk */ res = gst_avi_mux_write_index (avimux); /* the index data/buffer is freed by pushing it */ avimux->idx_count = 0; if (res != GST_FLOW_OK) return res; } avimux->avix_start = avimux->total_data; if (last) return res; avimux->is_bigfile = TRUE; avimux->numx_frames = 0; avimux->datax_size = 4; /* movi tag */ avimux->idx_index = 0; node = avimux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; node = node->next; if (!avipad->is_video) { GstAviAudioPad *audiopad = (GstAviAudioPad *) avipad; audiopad->samples = 0; } } header = gst_avi_mux_riff_get_avix_header (0); avimux->total_data += GST_BUFFER_SIZE (header); /* avix_start is used as base offset for the odml index chunk */ avimux->idx_offset = avimux->total_data - avimux->avix_start; gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); return gst_pad_push (avimux->srcpad, header); } /* enough header blabla now, let's go on to actually writing the headers */ static GstFlowReturn gst_avi_mux_start_file (GstAviMux * avimux) { GstFlowReturn res; GstBuffer *header; GSList *node; GstCaps *caps; avimux->total_data = 0; avimux->total_frames = 0; avimux->data_size = 4; /* movi tag */ avimux->datax_size = 0; avimux->num_frames = 0; avimux->numx_frames = 0; avimux->avix_start = 0; avimux->idx_index = 0; avimux->idx_offset = 0; /* see 10 lines below */ avimux->idx_size = 0; avimux->idx_count = 0; avimux->idx = NULL; /* state */ avimux->write_header = FALSE; avimux->restart = FALSE; /* init streams, see what we've got */ node = avimux->sinkpads; avimux->audio_pads = avimux->video_pads = 0; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; node = node->next; if (!avipad->is_video) { /* audio stream numbers must start at 1 iff there is a video stream 0; * request_pad inserts video pad at head of list, so this test suffices */ if (avimux->video_pads) avimux->audio_pads++; avipad->tag = g_strdup_printf ("%02uwb", avimux->audio_pads); avipad->idx_tag = g_strdup_printf ("ix%02u", avimux->audio_pads); if (!avimux->video_pads) avimux->audio_pads++; } else { avipad->tag = g_strdup_printf ("%02udb", avimux->video_pads); avipad->idx_tag = g_strdup_printf ("ix%02u", avimux->video_pads++); } } caps = gst_caps_copy (gst_pad_get_pad_template_caps (avimux->srcpad)); gst_pad_set_caps (avimux->srcpad, caps); gst_caps_unref (caps); /* let downstream know we think in BYTES and expect to do seeking later on */ gst_pad_push_event (avimux->srcpad, gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0)); /* header */ avimux->avi_hdr.streams = g_slist_length (avimux->sinkpads); avimux->is_bigfile = FALSE; header = gst_avi_mux_riff_get_avi_header (avimux); avimux->total_data += GST_BUFFER_SIZE (header); gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); res = gst_pad_push (avimux->srcpad, header); avimux->idx_offset = avimux->total_data; return res; } static GstFlowReturn gst_avi_mux_stop_file (GstAviMux * avimux) { GstFlowReturn res = GST_FLOW_OK; GstEvent *event; GstBuffer *header; GSList *node; /* if bigfile, rewrite header, else write indexes */ /* don't bail out at once if error, still try to re-write header */ if (avimux->video_pads > 0) { if (avimux->is_bigfile) { res = gst_avi_mux_bigfile (avimux, TRUE); } else { res = gst_avi_mux_write_index (avimux); } } /* we do our best to make it interleaved at least ... */ if (avimux->audio_pads > 0 && avimux->video_pads > 0) avimux->avi_hdr.flags |= GST_RIFF_AVIH_ISINTERLEAVED; /* set rate and everything having to do with that */ avimux->avi_hdr.max_bps = 0; node = avimux->sinkpads; while (node) { GstAviPad *avipad = (GstAviPad *) node->data; node = node->next; if (!avipad->is_video) { GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; /* calculate bps if needed */ if (!audpad->auds.av_bps) { if (audpad->audio_time) { audpad->auds.av_bps = (GST_SECOND * audpad->audio_size) / audpad->audio_time; /* round bps to nearest multiple of 8; * which is much more likely to be the (cbr) bitrate in use; * which in turn results in better timestamp calculation on playback */ audpad->auds.av_bps = GST_ROUND_UP_8 (audpad->auds.av_bps - 4); } else { GST_ELEMENT_WARNING (avimux, STREAM, MUX, (_("No or invalid input audio, AVI stream will be corrupt.")), (NULL)); audpad->auds.av_bps = 0; } } gst_avi_mux_audsink_set_fields (avimux, audpad); avimux->avi_hdr.max_bps += audpad->auds.av_bps; avipad->hdr.length = gst_util_uint64_scale (audpad->audio_time, avipad->hdr.rate, avipad->hdr.scale * GST_SECOND); } else { GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; avimux->avi_hdr.max_bps += ((vidpad->vids.bit_cnt + 7) / 8) * (1000000. / avimux->avi_hdr.us_frame) * vidpad->vids.image_size; avipad->hdr.length = avimux->total_frames; } } /* statistics/total_frames/... */ avimux->avi_hdr.tot_frames = avimux->num_frames; /* seek and rewrite the header */ header = gst_avi_mux_riff_get_avi_header (avimux); event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, GST_CLOCK_TIME_NONE, 0); gst_pad_push_event (avimux->srcpad, event); gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); /* the first error survives */ if (res == GST_FLOW_OK) res = gst_pad_push (avimux->srcpad, header); else gst_pad_push (avimux->srcpad, header); event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, avimux->total_data, GST_CLOCK_TIME_NONE, avimux->total_data); gst_pad_push_event (avimux->srcpad, event); avimux->write_header = TRUE; return res; } static GstFlowReturn gst_avi_mux_restart_file (GstAviMux * avimux) { GstFlowReturn res; if ((res = gst_avi_mux_stop_file (avimux)) != GST_FLOW_OK) return res; gst_pad_push_event (avimux->srcpad, gst_event_new_eos ()); return gst_avi_mux_start_file (avimux); } /* handle events (search) */ static gboolean gst_avi_mux_handle_event (GstPad * pad, GstEvent * event) { GstAviMux *avimux; gboolean ret; avimux = GST_AVI_MUX (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG:{ GstTagList *list; GstTagSetter *setter = GST_TAG_SETTER (avimux); const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter); gst_event_parse_tag (event, &list); gst_tag_setter_merge_tags (setter, list, mode); break; } default: break; } /* now GstCollectPads can take care of the rest, e.g. EOS */ ret = avimux->collect_event (pad, event); gst_object_unref (avimux); return ret; } /* send extra 'padding' data */ static GstFlowReturn gst_avi_mux_send_pad_data (GstAviMux * avimux, gulong num_bytes) { GstBuffer *buffer; buffer = gst_buffer_new_and_alloc (num_bytes); memset (GST_BUFFER_DATA (buffer), 0, num_bytes); gst_buffer_set_caps (buffer, GST_PAD_CAPS (avimux->srcpad)); return gst_pad_push (avimux->srcpad, buffer); } /* do buffer */ static GstFlowReturn gst_avi_mux_do_buffer (GstAviMux * avimux, GstAviPad * avipad) { GstFlowReturn res; GstBuffer *data, *header; gulong total_size, pad_bytes = 0; guint flags; data = gst_collect_pads_pop (avimux->collect, avipad->collect); /* arrange downstream running time */ data = gst_buffer_make_metadata_writable (data); GST_BUFFER_TIMESTAMP (data) = gst_segment_to_running_time (&avipad->collect->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (data)); /* Prepend a special buffer to the first one for some formats */ if (avipad->is_video) { GstAviVideoPad *vidpad = (GstAviVideoPad *) avipad; if (vidpad->prepend_buffer) { GstBuffer *newdata = gst_buffer_merge (vidpad->prepend_buffer, data); gst_buffer_copy_metadata (newdata, data, GST_BUFFER_COPY_TIMESTAMPS); gst_buffer_unref (data); gst_buffer_unref (vidpad->prepend_buffer); data = newdata; vidpad->prepend_buffer = NULL; } } if (avimux->restart) { if ((res = gst_avi_mux_restart_file (avimux)) != GST_FLOW_OK) return res; } /* need to restart or start a next avix chunk ? */ if ((avimux->is_bigfile ? avimux->datax_size : avimux->data_size) + GST_BUFFER_SIZE (data) > GST_AVI_MAX_SIZE) { if (avimux->enable_large_avi) { if ((res = gst_avi_mux_bigfile (avimux, FALSE)) != GST_FLOW_OK) return res; } else { if ((res = gst_avi_mux_restart_file (avimux)) != GST_FLOW_OK) return res; } } /* get header and record some stats */ if (GST_BUFFER_SIZE (data) & 1) { pad_bytes = 2 - (GST_BUFFER_SIZE (data) & 1); } header = gst_avi_mux_riff_get_header (avipad, GST_BUFFER_SIZE (data)); total_size = GST_BUFFER_SIZE (header) + GST_BUFFER_SIZE (data) + pad_bytes; if (avimux->is_bigfile) { avimux->datax_size += total_size; } else { avimux->data_size += total_size; } if (G_UNLIKELY (avipad->hook)) avipad->hook (avimux, avipad, data); /* the suggested buffer size is the max frame size */ if (avipad->hdr.bufsize < GST_BUFFER_SIZE (data)) avipad->hdr.bufsize = GST_BUFFER_SIZE (data); if (avipad->is_video) { avimux->total_frames++; if (avimux->is_bigfile) { avimux->numx_frames++; } else { avimux->num_frames++; } flags = 0x02; if (!GST_BUFFER_FLAG_IS_SET (data, GST_BUFFER_FLAG_DELTA_UNIT)) flags |= 0x10; } else { GstAviAudioPad *audpad = (GstAviAudioPad *) avipad; flags = 0; audpad->audio_size += GST_BUFFER_SIZE (data); audpad->audio_time += GST_BUFFER_DURATION (data); } gst_avi_mux_add_index (avimux, avipad, flags, GST_BUFFER_SIZE (data)); /* prepare buffers for sending */ gst_buffer_set_caps (header, GST_PAD_CAPS (avimux->srcpad)); data = gst_buffer_make_metadata_writable (data); gst_buffer_set_caps (data, GST_PAD_CAPS (avimux->srcpad)); GST_LOG_OBJECT (avimux, "pushing buffers: head, data"); if ((res = gst_pad_push (avimux->srcpad, header)) != GST_FLOW_OK) return res; if ((res = gst_pad_push (avimux->srcpad, data)) != GST_FLOW_OK) return res; if (pad_bytes) { if ((res = gst_avi_mux_send_pad_data (avimux, pad_bytes)) != GST_FLOW_OK) return res; } /* if any push above fails, we're in trouble with file consistency anyway */ avimux->total_data += total_size; avimux->idx_offset += total_size; return res; } /* pick the oldest buffer from the pads and push it */ static GstFlowReturn gst_avi_mux_do_one_buffer (GstAviMux * avimux) { GstAviPad *avipad, *best_pad; GSList *node; GstBuffer *buffer; GstClockTime time, best_time, delay; node = avimux->sinkpads; best_pad = NULL; best_time = GST_CLOCK_TIME_NONE; for (; node; node = node->next) { avipad = (GstAviPad *) node->data; if (!avipad->collect) continue; if (!avipad->hdr.fcc_handler) goto not_negotiated; buffer = gst_collect_pads_peek (avimux->collect, avipad->collect); if (!buffer) continue; time = GST_BUFFER_TIMESTAMP (buffer); gst_buffer_unref (buffer); /* invalid should pass */ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { time = gst_segment_to_running_time (&avipad->collect->segment, GST_FORMAT_TIME, time); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { GST_DEBUG_OBJECT (avimux, "clipping buffer on pad %s outside segment", GST_PAD_NAME (avipad->collect->pad)); buffer = gst_collect_pads_pop (avimux->collect, avipad->collect); gst_buffer_unref (buffer); return GST_FLOW_OK; } } delay = avipad->is_video ? GST_SECOND / 2 : 0; /* invalid timestamp buffers pass first, * these are probably initialization buffers */ if (best_pad == NULL || !GST_CLOCK_TIME_IS_VALID (time) || (GST_CLOCK_TIME_IS_VALID (best_time) && time + delay < best_time)) { best_pad = avipad; best_time = time + delay; } } if (best_pad) { GST_LOG_OBJECT (avimux, "selected pad %s with time %" GST_TIME_FORMAT, GST_PAD_NAME (best_pad->collect->pad), GST_TIME_ARGS (best_time)); return gst_avi_mux_do_buffer (avimux, best_pad); } else { /* simply finish off the file and send EOS */ gst_avi_mux_stop_file (avimux); gst_pad_push_event (avimux->srcpad, gst_event_new_eos ()); return GST_FLOW_UNEXPECTED; } /* ERRORS */ not_negotiated: { GST_ELEMENT_ERROR (avimux, CORE, NEGOTIATION, (NULL), ("pad %s not negotiated", GST_PAD_NAME (avipad->collect->pad))); return GST_FLOW_NOT_NEGOTIATED; } } static GstFlowReturn gst_avi_mux_collect_pads (GstCollectPads * pads, GstAviMux * avimux) { GstFlowReturn res; if (G_UNLIKELY (avimux->write_header)) { if ((res = gst_avi_mux_start_file (avimux)) != GST_FLOW_OK) return res; } return gst_avi_mux_do_one_buffer (avimux); } static void gst_avi_mux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAviMux *avimux; avimux = GST_AVI_MUX (object); switch (prop_id) { case ARG_BIGFILE: g_value_set_boolean (value, avimux->enable_large_avi); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_avi_mux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAviMux *avimux; avimux = GST_AVI_MUX (object); switch (prop_id) { case ARG_BIGFILE: avimux->enable_large_avi = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstStateChangeReturn gst_avi_mux_change_state (GstElement * element, GstStateChange transition) { GstAviMux *avimux; GstStateChangeReturn ret; avimux = GST_AVI_MUX (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_collect_pads_start (avimux->collect); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_collect_pads_stop (avimux->collect); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto done; switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_avi_mux_reset (avimux); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } done: return ret; } gst-plugins-good-0.10.31/gst/shapewipe/0000755000175000017500000000000011720565311014642 500000000000000gst-plugins-good-0.10.31/gst/shapewipe/Makefile.am0000644000175000017500000000174211671175354016633 00000000000000plugin_LTLIBRARIES = libgstshapewipe.la libgstshapewipe_la_SOURCES = gstshapewipe.c libgstshapewipe_la_CFLAGS = $(GIO_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) libgstshapewipe_la_LIBADD = $(GIO_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ libgstshapewipe_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstshapewipe_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstshapewipe.h Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstshapewhipe -:SHARED libgstshapewhipe \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstshapewhipe_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstshapewhipe_la_CFLAGS) \ -:LDFLAGS $(libgstshapewhipe_la_LDFLAGS) \ $(libgstshapewhipe_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ gst-plugins-good-0.10.31/gst/shapewipe/gstshapewipe.c0000644000175000017500000010307011677341656017451 00000000000000/* GStreamer * Copyright (C) 2009,2010 Sebastian Dröge * * 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-shapewipe * * The shapewipe element provides custom transitions on video streams * based on a grayscale bitmap. The state of the transition can be * controlled by the position property and an optional blended border * can be added by the border property. * * Transition bitmaps can be downloaded from the * Cinelerra transition * page. * * * Example launch line * |[ * gst-launch -v videotestsrc ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! shapewipe position=0.5 name=shape ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink filesrc location=mask.png ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink videotestsrc pattern=snow ! video/x-raw-yuv,format=(fourcc)AYUV,width=640,height=480 ! queue ! mixer. * ]| This pipeline adds the transition from mask.png with position 0.5 to an SMPTE test screen and snow. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include "gstshapewipe.h" static void gst_shape_wipe_finalize (GObject * object); static void gst_shape_wipe_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_shape_wipe_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_shape_wipe_reset (GstShapeWipe * self); static void gst_shape_wipe_update_qos (GstShapeWipe * self, gdouble proportion, GstClockTimeDiff diff, GstClockTime time); static void gst_shape_wipe_reset_qos (GstShapeWipe * self); static void gst_shape_wipe_read_qos (GstShapeWipe * self, gdouble * proportion, GstClockTime * time); static GstStateChangeReturn gst_shape_wipe_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_shape_wipe_video_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_shape_wipe_video_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_shape_wipe_video_sink_getcaps (GstPad * pad); static GstFlowReturn gst_shape_wipe_video_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static gboolean gst_shape_wipe_video_sink_query (GstPad * pad, GstQuery * query); static GstFlowReturn gst_shape_wipe_mask_sink_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_shape_wipe_mask_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_shape_wipe_mask_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_shape_wipe_mask_sink_getcaps (GstPad * pad); static gboolean gst_shape_wipe_src_event (GstPad * pad, GstEvent * event); static GstCaps *gst_shape_wipe_src_getcaps (GstPad * pad); static gboolean gst_shape_wipe_src_query (GstPad * pad, GstQuery * query); enum { PROP_0, PROP_POSITION, PROP_BORDER }; #define DEFAULT_POSITION 0.0 #define DEFAULT_BORDER 0.0 static GstStaticPadTemplate video_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("video_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") " ; " GST_VIDEO_CAPS_ARGB " ; " GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA)); static GstStaticPadTemplate mask_sink_pad_template = GST_STATIC_PAD_TEMPLATE ("mask_sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-gray, " "bpp = 8, " "depth = 8, " "width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = 0/1 ; " "video/x-raw-gray, " "bpp = 16, " "depth = 16, " "endianness = BYTE_ORDER, " "width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE ", " "framerate = 0/1")); static GstStaticPadTemplate src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") " ; " GST_VIDEO_CAPS_ARGB " ; " GST_VIDEO_CAPS_BGRA ";" GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA)); GST_DEBUG_CATEGORY_STATIC (gst_shape_wipe_debug); #define GST_CAT_DEFAULT gst_shape_wipe_debug GST_BOILERPLATE (GstShapeWipe, gst_shape_wipe, GstElement, GST_TYPE_ELEMENT); static void gst_shape_wipe_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (gstelement_class, "Shape Wipe transition filter", "Filter/Editor/Video", "Adds a shape wipe transition to a video stream", "Sebastian Dröge "); gst_element_class_add_static_pad_template (gstelement_class, &video_sink_pad_template); gst_element_class_add_static_pad_template (gstelement_class, &mask_sink_pad_template); gst_element_class_add_static_pad_template (gstelement_class, &src_pad_template); } static void gst_shape_wipe_class_init (GstShapeWipeClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); gobject_class->finalize = gst_shape_wipe_finalize; gobject_class->set_property = gst_shape_wipe_set_property; gobject_class->get_property = gst_shape_wipe_get_property; g_object_class_install_property (gobject_class, PROP_POSITION, g_param_spec_float ("position", "Position", "Position of the mask", 0.0, 1.0, DEFAULT_POSITION, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); g_object_class_install_property (gobject_class, PROP_BORDER, g_param_spec_float ("border", "Border", "Border of the mask", 0.0, 1.0, DEFAULT_BORDER, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_shape_wipe_change_state); } static void gst_shape_wipe_init (GstShapeWipe * self, GstShapeWipeClass * g_class) { self->video_sinkpad = gst_pad_new_from_static_template (&video_sink_pad_template, "video_sink"); gst_pad_set_chain_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_chain)); gst_pad_set_event_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_event)); gst_pad_set_setcaps_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_setcaps)); gst_pad_set_getcaps_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_getcaps)); gst_pad_set_bufferalloc_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_bufferalloc)); gst_pad_set_query_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_query)); gst_element_add_pad (GST_ELEMENT (self), self->video_sinkpad); self->mask_sinkpad = gst_pad_new_from_static_template (&mask_sink_pad_template, "mask_sink"); gst_pad_set_chain_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_chain)); gst_pad_set_event_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_event)); gst_pad_set_setcaps_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_setcaps)); gst_pad_set_getcaps_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_getcaps)); gst_element_add_pad (GST_ELEMENT (self), self->mask_sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_src_event)); gst_pad_set_getcaps_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_src_getcaps)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_src_query)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); self->mask_mutex = g_mutex_new (); self->mask_cond = g_cond_new (); gst_shape_wipe_reset (self); } static void gst_shape_wipe_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstShapeWipe *self = GST_SHAPE_WIPE (object); switch (prop_id) { case PROP_POSITION: g_value_set_float (value, self->mask_position); break; case PROP_BORDER: g_value_set_float (value, self->mask_border); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_shape_wipe_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstShapeWipe *self = GST_SHAPE_WIPE (object); switch (prop_id) { case PROP_POSITION:{ gfloat f = g_value_get_float (value); GST_LOG_OBJECT (self, "Setting mask position: %f", f); self->mask_position = f; break; } case PROP_BORDER:{ gfloat f = g_value_get_float (value); GST_LOG_OBJECT (self, "Setting mask border: %f", f); self->mask_border = f; break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_shape_wipe_finalize (GObject * object) { GstShapeWipe *self = GST_SHAPE_WIPE (object); gst_shape_wipe_reset (self); if (self->mask_cond) g_cond_free (self->mask_cond); self->mask_cond = NULL; if (self->mask_mutex) g_mutex_free (self->mask_mutex); self->mask_mutex = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_shape_wipe_reset (GstShapeWipe * self) { GST_DEBUG_OBJECT (self, "Resetting internal state"); if (self->mask) gst_buffer_unref (self->mask); self->mask = NULL; g_mutex_lock (self->mask_mutex); g_cond_signal (self->mask_cond); g_mutex_unlock (self->mask_mutex); self->fmt = GST_VIDEO_FORMAT_UNKNOWN; self->width = self->height = 0; self->mask_bpp = 0; gst_segment_init (&self->segment, GST_FORMAT_TIME); gst_shape_wipe_reset_qos (self); self->frame_duration = 0; } static GstFlowReturn gst_shape_wipe_video_sink_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); GstFlowReturn ret = GST_FLOW_OK; GST_LOG_OBJECT (pad, "Allocating buffer with offset 0x%" G_GINT64_MODIFIER "x and size %u with caps: %" GST_PTR_FORMAT, offset, size, caps); *buf = NULL; ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) GST_ERROR_OBJECT (pad, "Allocating buffer failed: %s", gst_flow_get_name (ret)); gst_object_unref (self); return ret; } static gboolean gst_shape_wipe_video_sink_setcaps (GstPad * pad, GstCaps * caps) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); gboolean ret = TRUE; GstStructure *s; GstVideoFormat fmt; gint width, height; gint fps_n, fps_d; GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); if (!gst_video_format_parse_caps (caps, &fmt, &width, &height) || !gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) { GST_ERROR_OBJECT (pad, "Invalid caps"); ret = FALSE; goto done; } self->fmt = fmt; if (self->width != width || self->height != height) { g_mutex_lock (self->mask_mutex); self->width = width; self->height = height; if (self->mask) gst_buffer_unref (self->mask); self->mask = NULL; g_mutex_unlock (self->mask_mutex); } if (fps_n != 0) self->frame_duration = gst_util_uint64_scale (GST_SECOND, fps_d, fps_n); else self->frame_duration = 0; ret = gst_pad_set_caps (self->srcpad, caps); done: gst_object_unref (self); return ret; } static GstCaps * gst_shape_wipe_video_sink_getcaps (GstPad * pad) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); GstCaps *ret, *tmp; if (GST_PAD_CAPS (pad)) return gst_caps_copy (GST_PAD_CAPS (pad)); tmp = gst_pad_peer_get_caps (self->srcpad); if (tmp) { ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (pad)); gst_caps_unref (tmp); } else { ret = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); } GST_LOG_OBJECT (pad, "srcpad accepted caps: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; tmp = gst_pad_peer_get_caps (pad); GST_LOG_OBJECT (pad, "peerpad accepted caps: %" GST_PTR_FORMAT, tmp); if (tmp) { GstCaps *intersection; intersection = gst_caps_intersect (tmp, ret); gst_caps_unref (tmp); gst_caps_unref (ret); ret = intersection; } GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, tmp); if (gst_caps_is_empty (ret)) goto done; if (self->height && self->width) { guint i, n; n = gst_caps_get_size (ret); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (ret, i); gst_structure_set (s, "width", G_TYPE_INT, self->width, "height", G_TYPE_INT, self->height, NULL); } } tmp = gst_pad_peer_get_caps (self->mask_sinkpad); GST_LOG_OBJECT (pad, "mask accepted caps: %" GST_PTR_FORMAT, tmp); if (tmp) { GstCaps *intersection, *tmp2; guint i, n; tmp = gst_caps_make_writable (tmp); tmp2 = gst_caps_copy (gst_pad_get_pad_template_caps (self->mask_sinkpad)); intersection = gst_caps_intersect (tmp, tmp2); gst_caps_unref (tmp); gst_caps_unref (tmp2); tmp = intersection; n = gst_caps_get_size (tmp); tmp2 = gst_caps_new_empty (); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (tmp, i); GstStructure *c; gst_structure_remove_fields (s, "format", "bpp", "depth", "endianness", "framerate", "red_mask", "green_mask", "blue_mask", "alpha_mask", NULL); gst_structure_set_name (s, "video/x-raw-yuv"); c = gst_structure_copy (s); gst_structure_set_name (c, "video/x-raw-rgb"); gst_caps_append_structure (tmp2, c); } gst_caps_append (tmp, tmp2); intersection = gst_caps_intersect (tmp, ret); gst_caps_unref (tmp); gst_caps_unref (ret); ret = intersection; } done: gst_object_unref (self); GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); return ret; } static gboolean gst_shape_wipe_mask_sink_setcaps (GstPad * pad, GstCaps * caps) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); gboolean ret = TRUE; GstStructure *s; gint width, height, bpp; GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (s, "width", &width) || !gst_structure_get_int (s, "height", &height) || !gst_structure_get_int (s, "bpp", &bpp)) { ret = FALSE; goto done; } if ((self->width != width || self->height != height) && self->width > 0 && self->height > 0) { GST_ERROR_OBJECT (pad, "Mask caps must have the same width/height " "as the video caps"); ret = FALSE; goto done; } else { self->width = width; self->height = height; } self->mask_bpp = bpp; done: gst_object_unref (self); return ret; } static GstCaps * gst_shape_wipe_mask_sink_getcaps (GstPad * pad) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); GstCaps *ret, *tmp; guint i, n; if (GST_PAD_CAPS (pad)) return gst_caps_copy (GST_PAD_CAPS (pad)); tmp = gst_pad_peer_get_caps (self->video_sinkpad); if (tmp) { ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (self->video_sinkpad)); gst_caps_unref (tmp); } else { ret = gst_caps_copy (gst_pad_get_pad_template_caps (self->video_sinkpad)); } GST_LOG_OBJECT (pad, "video sink accepted caps: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; tmp = gst_pad_peer_get_caps (self->srcpad); GST_LOG_OBJECT (pad, "srcpad accepted caps: %" GST_PTR_FORMAT, ret); if (tmp) { GstCaps *intersection; intersection = gst_caps_intersect (ret, tmp); gst_caps_unref (ret); gst_caps_unref (tmp); ret = intersection; } GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; n = gst_caps_get_size (ret); tmp = gst_caps_new_empty (); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (ret, i); GstStructure *t; gst_structure_set_name (s, "video/x-raw-gray"); gst_structure_remove_fields (s, "format", "framerate", "bpp", "depth", "endianness", "framerate", "red_mask", "green_mask", "blue_mask", "alpha_mask", NULL); if (self->width && self->height) gst_structure_set (s, "width", G_TYPE_INT, self->width, "height", G_TYPE_INT, self->height, NULL); gst_structure_set (s, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); t = gst_structure_copy (s); gst_structure_set (s, "bpp", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); gst_structure_set (t, "bpp", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8, NULL); gst_caps_append_structure (tmp, t); } gst_caps_append (ret, tmp); tmp = gst_pad_peer_get_caps (pad); GST_LOG_OBJECT (pad, "peer accepted caps: %" GST_PTR_FORMAT, tmp); if (tmp) { GstCaps *intersection; intersection = gst_caps_intersect (tmp, ret); gst_caps_unref (tmp); gst_caps_unref (ret); ret = intersection; } done: gst_object_unref (self); GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); return ret; } static GstCaps * gst_shape_wipe_src_getcaps (GstPad * pad) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); GstCaps *ret, *tmp; if (GST_PAD_CAPS (pad)) return gst_caps_copy (GST_PAD_CAPS (pad)); else if (GST_PAD_CAPS (self->video_sinkpad)) return gst_caps_copy (GST_PAD_CAPS (self->video_sinkpad)); tmp = gst_pad_peer_get_caps (self->video_sinkpad); if (tmp) { ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (self->video_sinkpad)); gst_caps_unref (tmp); } else { ret = gst_caps_copy (gst_pad_get_pad_template_caps (self->video_sinkpad)); } GST_LOG_OBJECT (pad, "video sink accepted caps: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; tmp = gst_pad_peer_get_caps (pad); GST_LOG_OBJECT (pad, "peer accepted caps: %" GST_PTR_FORMAT, ret); if (tmp) { GstCaps *intersection; intersection = gst_caps_intersect (tmp, ret); gst_caps_unref (tmp); gst_caps_unref (ret); ret = intersection; } GST_LOG_OBJECT (pad, "intersection: %" GST_PTR_FORMAT, ret); if (gst_caps_is_empty (ret)) goto done; if (self->height && self->width) { guint i, n; n = gst_caps_get_size (ret); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (ret, i); gst_structure_set (s, "width", G_TYPE_INT, self->width, "height", G_TYPE_INT, self->height, NULL); } } tmp = gst_pad_peer_get_caps (self->mask_sinkpad); GST_LOG_OBJECT (pad, "mask sink accepted caps: %" GST_PTR_FORMAT, ret); if (tmp) { GstCaps *intersection, *tmp2; guint i, n; tmp = gst_caps_make_writable (tmp); tmp2 = gst_caps_copy (gst_pad_get_pad_template_caps (self->mask_sinkpad)); intersection = gst_caps_intersect (tmp, tmp2); gst_caps_unref (tmp); gst_caps_unref (tmp2); tmp = intersection; n = gst_caps_get_size (tmp); tmp2 = gst_caps_new_empty (); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (tmp, i); GstStructure *c; gst_structure_remove_fields (s, "format", "bpp", "depth", "endianness", "framerate", "red_mask", "green_mask", "blue_mask", "alpha_mask", NULL); gst_structure_set_name (s, "video/x-raw-yuv"); c = gst_structure_copy (s); gst_caps_append_structure (tmp2, c); } gst_caps_append (tmp, tmp2); intersection = gst_caps_intersect (tmp, ret); gst_caps_unref (tmp); gst_caps_unref (ret); ret = intersection; } done: gst_object_unref (self); GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); return ret; } static gboolean gst_shape_wipe_video_sink_query (GstPad * pad, GstQuery * query) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); gboolean ret; GstPad *peer = gst_pad_get_peer (self->srcpad); GST_LOG_OBJECT (pad, "Handling query of type '%s'", gst_query_type_get_name (GST_QUERY_TYPE (query))); if (!peer) { GST_INFO_OBJECT (pad, "No peer yet, dropping query"); ret = FALSE; } else { ret = gst_pad_query (peer, query); gst_object_unref (peer); } gst_object_unref (self); return ret; } static gboolean gst_shape_wipe_src_query (GstPad * pad, GstQuery * query) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); gboolean ret; GstPad *peer = gst_pad_get_peer (self->video_sinkpad); GST_LOG_OBJECT (pad, "Handling query of type '%s'", gst_query_type_get_name (GST_QUERY_TYPE (query))); if (!peer) { GST_INFO_OBJECT (pad, "No peer yet, dropping query"); ret = FALSE; } else { ret = gst_pad_query (peer, query); gst_object_unref (peer); } gst_object_unref (self); return ret; } static void gst_shape_wipe_update_qos (GstShapeWipe * self, gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp) { GST_OBJECT_LOCK (self); self->proportion = proportion; if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) { if (G_UNLIKELY (diff > 0)) self->earliest_time = timestamp + 2 * diff + self->frame_duration; else self->earliest_time = timestamp + diff; } else { self->earliest_time = GST_CLOCK_TIME_NONE; } GST_OBJECT_UNLOCK (self); } static void gst_shape_wipe_reset_qos (GstShapeWipe * self) { gst_shape_wipe_update_qos (self, 0.5, 0, GST_CLOCK_TIME_NONE); } static void gst_shape_wipe_read_qos (GstShapeWipe * self, gdouble * proportion, GstClockTime * time) { GST_OBJECT_LOCK (self); *proportion = self->proportion; *time = self->earliest_time; GST_OBJECT_UNLOCK (self); } /* Perform qos calculations before processing the next frame. Returns TRUE if * the frame should be processed, FALSE if the frame can be dropped entirely */ static gboolean gst_shape_wipe_do_qos (GstShapeWipe * self, GstClockTime timestamp) { GstClockTime qostime, earliest_time; gdouble proportion; /* no timestamp, can't do QoS => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (timestamp))) { GST_LOG_OBJECT (self, "invalid timestamp, can't do QoS, process frame"); return TRUE; } /* get latest QoS observation values */ gst_shape_wipe_read_qos (self, &proportion, &earliest_time); /* skip qos if we have no observation (yet) => process frame */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (earliest_time))) { GST_LOG_OBJECT (self, "no observation yet, process frame"); return TRUE; } /* qos is done on running time */ qostime = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME, timestamp); /* see how our next timestamp relates to the latest qos timestamp */ GST_LOG_OBJECT (self, "qostime %" GST_TIME_FORMAT ", earliest %" GST_TIME_FORMAT, GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time)); if (qostime != GST_CLOCK_TIME_NONE && qostime <= earliest_time) { GST_DEBUG_OBJECT (self, "we are late, drop frame"); return FALSE; } GST_LOG_OBJECT (self, "process frame"); return TRUE; } #define CREATE_ARGB_FUNCTIONS(depth, name, shift, a, r, g, b) \ static void \ gst_shape_wipe_blend_##name##_##depth (GstShapeWipe * self, GstBuffer * inbuf, \ GstBuffer * maskbuf, GstBuffer * outbuf) \ { \ const guint##depth *mask = (const guint##depth *) GST_BUFFER_DATA (maskbuf); \ const guint8 *input = (const guint8 *) GST_BUFFER_DATA (inbuf); \ guint8 *output = (guint8 *) GST_BUFFER_DATA (outbuf); \ guint i, j; \ guint mask_increment = ((depth == 16) ? GST_ROUND_UP_2 (self->width) : \ GST_ROUND_UP_4 (self->width)) - self->width; \ gfloat position = self->mask_position; \ gfloat low = position - (self->mask_border / 2.0f); \ gfloat high = position + (self->mask_border / 2.0f); \ guint32 low_i, high_i, round_i; \ gint width = self->width, height = self->height; \ \ if (low < 0.0f) { \ high = 0.0f; \ low = 0.0f; \ } \ \ if (high > 1.0f) { \ low = 1.0f; \ high = 1.0f; \ } \ \ low_i = low * 65536; \ high_i = high * 65536; \ round_i = (high_i - low_i) >> 1; \ \ for (i = 0; i < height; i++) { \ for (j = 0; j < width; j++) { \ guint32 in = *mask << shift; \ \ if (in < low_i) { \ output[a] = 0x00; /* A */ \ output[r] = input[r]; /* R */ \ output[g] = input[g]; /* G */ \ output[b] = input[b]; /* B */ \ } else if (in >= high_i) { \ output[a] = input[a]; /* A */ \ output[r] = input[r]; /* R */ \ output[g] = input[g]; /* G */ \ output[b] = input[b]; /* B */ \ } else { \ guint32 val; \ /* Note: This will never overflow or be larger than 255! */ \ val = (((in - low_i) << 16) + round_i) / (high_i - low_i); \ val = (val * input[a] + 32768) >> 16; \ \ output[a] = val; /* A */ \ output[r] = input[r]; /* R */ \ output[g] = input[g]; /* G */ \ output[b] = input[b]; /* B */ \ } \ \ mask++; \ input += 4; \ output += 4; \ } \ mask += mask_increment; \ } \ } CREATE_ARGB_FUNCTIONS (16, argb, 0, 0, 1, 2, 3); CREATE_ARGB_FUNCTIONS (8, argb, 8, 0, 1, 2, 3); CREATE_ARGB_FUNCTIONS (16, bgra, 0, 3, 2, 1, 0); CREATE_ARGB_FUNCTIONS (8, bgra, 8, 3, 2, 1, 0); static GstFlowReturn gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer) { GstShapeWipe *self = GST_SHAPE_WIPE (GST_PAD_PARENT (pad)); GstFlowReturn ret = GST_FLOW_OK; GstBuffer *mask = NULL, *outbuf = NULL; GstClockTime timestamp; gboolean new_outbuf = FALSE; if (G_UNLIKELY (self->fmt == GST_VIDEO_FORMAT_UNKNOWN)) goto not_negotiated; timestamp = GST_BUFFER_TIMESTAMP (buffer); timestamp = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME, timestamp); if (GST_CLOCK_TIME_IS_VALID (timestamp)) gst_object_sync_values (G_OBJECT (self), timestamp); GST_LOG_OBJECT (self, "Blending buffer with timestamp %" GST_TIME_FORMAT " at position %f", GST_TIME_ARGS (timestamp), self->mask_position); g_mutex_lock (self->mask_mutex); if (self->shutdown) goto shutdown; if (!self->mask) g_cond_wait (self->mask_cond, self->mask_mutex); if (self->mask == NULL || self->shutdown) { goto shutdown; } else { mask = gst_buffer_ref (self->mask); } g_mutex_unlock (self->mask_mutex); if (!gst_shape_wipe_do_qos (self, GST_BUFFER_TIMESTAMP (buffer))) goto qos; /* Try to blend inplace, if it's not possible * get a new buffer from downstream. */ if (!gst_buffer_is_writable (buffer)) { ret = gst_pad_alloc_buffer_and_set_caps (self->srcpad, GST_BUFFER_OFFSET_NONE, GST_BUFFER_SIZE (buffer), GST_PAD_CAPS (self->srcpad), &outbuf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto alloc_failed; gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_ALL); new_outbuf = TRUE; } else { outbuf = buffer; } switch (self->fmt) { case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: if (self->mask_bpp == 16) gst_shape_wipe_blend_argb_16 (self, buffer, mask, outbuf); else gst_shape_wipe_blend_argb_8 (self, buffer, mask, outbuf); break; case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_RGBA: if (self->mask_bpp == 16) gst_shape_wipe_blend_bgra_16 (self, buffer, mask, outbuf); else gst_shape_wipe_blend_bgra_8 (self, buffer, mask, outbuf); break; default: g_assert_not_reached (); break; } gst_buffer_unref (mask); if (new_outbuf) gst_buffer_unref (buffer); ret = gst_pad_push (self->srcpad, outbuf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto push_failed; return ret; /* Errors */ not_negotiated: GST_ERROR_OBJECT (self, "No valid caps yet"); gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; shutdown: GST_DEBUG_OBJECT (self, "Shutting down"); gst_buffer_unref (buffer); return GST_FLOW_WRONG_STATE; qos: GST_DEBUG_OBJECT (self, "Dropping buffer because of QoS"); gst_buffer_unref (buffer); gst_buffer_unref (mask); return GST_FLOW_OK; alloc_failed: GST_ERROR_OBJECT (self, "Buffer allocation from downstream failed: %s", gst_flow_get_name (ret)); gst_buffer_unref (buffer); gst_buffer_unref (mask); return ret; push_failed: GST_ERROR_OBJECT (self, "Pushing buffer downstream failed: %s", gst_flow_get_name (ret)); return ret; } static GstFlowReturn gst_shape_wipe_mask_sink_chain (GstPad * pad, GstBuffer * buffer) { GstShapeWipe *self = GST_SHAPE_WIPE (GST_PAD_PARENT (pad)); GstFlowReturn ret = GST_FLOW_OK; g_mutex_lock (self->mask_mutex); GST_DEBUG_OBJECT (self, "Setting new mask buffer: %" GST_PTR_FORMAT, buffer); gst_buffer_replace (&self->mask, buffer); g_cond_signal (self->mask_cond); g_mutex_unlock (self->mask_mutex); gst_buffer_unref (buffer); return ret; } static GstStateChangeReturn gst_shape_wipe_change_state (GstElement * element, GstStateChange transition) { GstShapeWipe *self = GST_SHAPE_WIPE (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: self->shutdown = FALSE; break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* Unblock video sink chain function */ g_mutex_lock (self->mask_mutex); self->shutdown = TRUE; g_cond_signal (self->mask_cond); g_mutex_unlock (self->mask_mutex); break; default: break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_shape_wipe_reset (self); break; default: break; } return ret; } static gboolean gst_shape_wipe_video_sink_event (GstPad * pad, GstEvent * event) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); gboolean ret; GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT:{ GstFormat fmt; gboolean is_update; gint64 start, end, base; gdouble rate; gst_event_parse_new_segment (event, &is_update, &rate, &fmt, &start, &end, &base); if (fmt == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (pad, "Got NEWSEGMENT event in GST_FORMAT_TIME, passing on (%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", GST_TIME_ARGS (start), GST_TIME_ARGS (end)); gst_segment_set_newsegment (&self->segment, is_update, rate, fmt, start, end, base); } else { gst_segment_init (&self->segment, GST_FORMAT_TIME); } } /* fall through */ case GST_EVENT_FLUSH_STOP: gst_shape_wipe_reset_qos (self); /* fall through */ default: ret = gst_pad_push_event (self->srcpad, event); break; } gst_object_unref (self); return ret; } static gboolean gst_shape_wipe_mask_sink_event (GstPad * pad, GstEvent * event) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: g_mutex_lock (self->mask_mutex); gst_buffer_replace (&self->mask, NULL); g_mutex_unlock (self->mask_mutex); break; default: break; } /* Dropping all events here */ gst_event_unref (event); gst_object_unref (self); return TRUE; } static gboolean gst_shape_wipe_src_event (GstPad * pad, GstEvent * event) { GstShapeWipe *self = GST_SHAPE_WIPE (gst_pad_get_parent (pad)); gboolean ret; GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_QOS:{ GstClockTimeDiff diff; GstClockTime timestamp; gdouble proportion; gst_event_parse_qos (event, &proportion, &diff, ×tamp); gst_shape_wipe_update_qos (self, proportion, diff, timestamp); } /* fall through */ default: ret = gst_pad_push_event (self->video_sinkpad, event); break; } gst_object_unref (self); return ret; } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_shape_wipe_debug, "shapewipe", 0, "shapewipe element"); gst_controller_init (NULL, NULL); if (!gst_element_register (plugin, "shapewipe", GST_RANK_NONE, GST_TYPE_SHAPE_WIPE)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "shapewipe", "Shape Wipe transition filter", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) gst-plugins-good-0.10.31/gst/shapewipe/Makefile.in0000644000175000017500000006676411720560235016652 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gst/shapewipe DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ $(top_srcdir)/common/m4/as-auto-alt.m4 \ $(top_srcdir)/common/m4/as-compiler-flag.m4 \ $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ $(top_srcdir)/common/m4/as-objc.m4 \ $(top_srcdir)/common/m4/as-python.m4 \ $(top_srcdir)/common/m4/as-scrub-include.m4 \ $(top_srcdir)/common/m4/as-version.m4 \ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/common/m4/gst-arch.m4 \ $(top_srcdir)/common/m4/gst-args.m4 \ $(top_srcdir)/common/m4/gst-check.m4 \ $(top_srcdir)/common/m4/gst-default.m4 \ $(top_srcdir)/common/m4/gst-dowhile.m4 \ $(top_srcdir)/common/m4/gst-error.m4 \ $(top_srcdir)/common/m4/gst-feature.m4 \ $(top_srcdir)/common/m4/gst-gettext.m4 \ $(top_srcdir)/common/m4/gst-glib2.m4 \ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ $(top_srcdir)/common/m4/gst-platform.m4 \ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ $(top_srcdir)/common/m4/gst-plugindir.m4 \ $(top_srcdir)/common/m4/gst-x11.m4 \ $(top_srcdir)/common/m4/gst.m4 \ $(top_srcdir)/common/m4/gtk-doc.m4 \ $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libgstshapewipe_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libgstshapewipe_la_OBJECTS = libgstshapewipe_la-gstshapewipe.lo libgstshapewipe_la_OBJECTS = $(am_libgstshapewipe_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent libgstshapewipe_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libgstshapewipe_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgstshapewipe_la_CFLAGS) $(CFLAGS) \ $(libgstshapewipe_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgstshapewipe_la_SOURCES) DIST_SOURCES = $(libgstshapewipe_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AALIB_CFLAGS = @AALIB_CFLAGS@ AALIB_CONFIG = @AALIB_CONFIG@ AALIB_LIBS = @AALIB_LIBS@ ACLOCAL = @ACLOCAL@ ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ ANNODEX_LIBS = @ANNODEX_LIBS@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZ2_LIBS = @BZ2_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DV1394_CFLAGS = @DV1394_CFLAGS@ DV1394_LIBS = @DV1394_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERROR_CFLAGS = @ERROR_CFLAGS@ ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ ESD_CFLAGS = @ESD_CFLAGS@ ESD_CONFIG = @ESD_CONFIG@ ESD_LIBS = @ESD_LIBS@ EXEEXT = @EXEEXT@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLAC_CFLAGS = @FLAC_CFLAGS@ FLAC_LIBS = @FLAC_LIBS@ GCONFTOOL = @GCONFTOOL@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GCOV = @GCOV@ GCOV_CFLAGS = @GCOV_CFLAGS@ GCOV_LIBS = @GCOV_LIBS@ GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PREFIX = @GLIB_PREFIX@ GLIB_REQ = @GLIB_REQ@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ GSTPB_PREFIX = @GSTPB_PREFIX@ GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ GST_BASE_LIBS = @GST_BASE_LIBS@ GST_CFLAGS = @GST_CFLAGS@ GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ GST_CHECK_LIBS = @GST_CHECK_LIBS@ GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ GST_CXXFLAGS = @GST_CXXFLAGS@ GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ GST_GDP_LIBS = @GST_GDP_LIBS@ GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ GST_LIBS = @GST_LIBS@ GST_LICENSE = @GST_LICENSE@ GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GST_TOOLS_DIR = @GST_TOOLS_DIR@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ GTK_X11_LIBS = @GTK_X11_LIBS@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ HAL_CFLAGS = @HAL_CFLAGS@ HAL_LIBS = @HAL_LIBS@ HAVE_AVC1394 = @HAVE_AVC1394@ HAVE_BZ2 = @HAVE_BZ2@ HAVE_CXX = @HAVE_CXX@ HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ HAVE_ROM1394 = @HAVE_ROM1394@ HAVE_SPEEX = @HAVE_SPEEX@ HAVE_X = @HAVE_X@ HAVE_XSHM = @HAVE_XSHM@ HAVE_ZLIB = @HAVE_ZLIB@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ LIBCACA_LIBS = @LIBCACA_LIBS@ LIBDV_CFLAGS = @LIBDV_CFLAGS@ LIBDV_LIBS = @LIBDV_LIBS@ LIBICONV = @LIBICONV@ LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ LIBV4L2_LIBS = @LIBV4L2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LOCALEDIR = @LOCALEDIR@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJC = @OBJC@ OBJCDEPMODE = @OBJCDEPMODE@ OBJC_LDFLAGS = @OBJC_LDFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ORCC = @ORCC@ ORCC_FLAGS = @ORCC_FLAGS@ ORC_CFLAGS = @ORC_CFLAGS@ ORC_LIBS = @ORC_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PLUGINDIR = @PLUGINDIR@ POSUB = @POSUB@ PROFILE_CFLAGS = @PROFILE_CFLAGS@ PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ PULSE_1_0_CFLAGS = @PULSE_1_0_CFLAGS@ PULSE_1_0_LIBS = @PULSE_1_0_LIBS@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RAW1394_CFLAGS = @RAW1394_CFLAGS@ RAW1394_LIBS = @RAW1394_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ SHOUT2_LIBS = @SHOUT2_LIBS@ SOUP_CFLAGS = @SOUP_CFLAGS@ SOUP_LIBS = @SOUP_LIBS@ SPEEX_CFLAGS = @SPEEX_CFLAGS@ SPEEX_LIBS = @SPEEX_LIBS@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ USE_NLS = @USE_NLS@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VALGRIND_LIBS = @VALGRIND_LIBS@ VALGRIND_PATH = @VALGRIND_PATH@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ WAVPACK_LIBS = @WAVPACK_LIBS@ WIN32_LIBS = @WIN32_LIBS@ XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ XDAMAGE_LIBS = @XDAMAGE_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ XSHM_LIBS = @XSHM_LIBS@ XVIDEO_LIBS = @XVIDEO_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_OBJC = @ac_ct_OBJC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ plugin_LTLIBRARIES = libgstshapewipe.la libgstshapewipe_la_SOURCES = gstshapewipe.c libgstshapewipe_la_CFLAGS = $(GIO_CFLAGS) $(GST_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) libgstshapewipe_la_LIBADD = $(GIO_LIBS) $(GST_LIBS) $(GST_CONTROLLER_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ libgstshapewipe_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstshapewipe_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstshapewipe.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/shapewipe/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gst/shapewipe/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgstshapewipe.la: $(libgstshapewipe_la_OBJECTS) $(libgstshapewipe_la_DEPENDENCIES) $(EXTRA_libgstshapewipe_la_DEPENDENCIES) $(AM_V_CCLD)$(libgstshapewipe_la_LINK) -rpath $(plugindir) $(libgstshapewipe_la_OBJECTS) $(libgstshapewipe_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstshapewipe_la-gstshapewipe.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libgstshapewipe_la-gstshapewipe.lo: gstshapewipe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshapewipe_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshapewipe_la_CFLAGS) $(CFLAGS) -MT libgstshapewipe_la-gstshapewipe.lo -MD -MP -MF $(DEPDIR)/libgstshapewipe_la-gstshapewipe.Tpo -c -o libgstshapewipe_la-gstshapewipe.lo `test -f 'gstshapewipe.c' || echo '$(srcdir)/'`gstshapewipe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstshapewipe_la-gstshapewipe.Tpo $(DEPDIR)/libgstshapewipe_la-gstshapewipe.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstshapewipe.c' object='libgstshapewipe_la-gstshapewipe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstshapewipe_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstshapewipe_la_CFLAGS) $(CFLAGS) -c -o libgstshapewipe_la-gstshapewipe.lo `test -f 'gstshapewipe.c' || echo '$(srcdir)/'`gstshapewipe.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES Android.mk: Makefile.am $(BUILT_SOURCES) androgenizer \ -:PROJECT libgstshapewhipe -:SHARED libgstshapewhipe \ -:TAGS eng debug \ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ -:SOURCES $(libgstshapewhipe_la_SOURCES) \ -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstshapewhipe_la_CFLAGS) \ -:LDFLAGS $(libgstshapewhipe_la_LDFLAGS) \ $(libgstshapewhipe_la_LIBADD) \ -ldl \ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gst-plugins-good-0.10.31/gst/shapewipe/gstshapewipe.h0000644000175000017500000000425511671175354017455 00000000000000/* GStreamer * Copyright (C) 2009,2010 Sebastian Dröge * * 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_SHAPE_WIPE_H__ #define __GST_SHAPE_WIPE_H__ #include #include G_BEGIN_DECLS #define GST_TYPE_SHAPE_WIPE \ (gst_shape_wipe_get_type()) #define GST_SHAPE_WIPE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SHAPE_WIPE,GstShapeWipe)) #define GST_SHAPE_WIPE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SHAPE_WIPE,GstShapeWipeClass)) #define GST_SHAPE_WIPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_SHAPE_WIPE,GstShapeWipeClass)) #define GST_IS_SHAPE_WIPE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SHAPE_WIPE)) #define GST_IS_SHAPE_WIPE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SHAPE_WIPE)) typedef struct _GstShapeWipe GstShapeWipe; typedef struct _GstShapeWipeClass GstShapeWipeClass; struct _GstShapeWipe { GstElement parent; /* private */ GstPad *video_sinkpad; GstPad *mask_sinkpad; GstPad *srcpad; GstSegment segment; GstBuffer *mask; gfloat mask_position; gfloat mask_border; GMutex *mask_mutex; GCond *mask_cond; gint mask_bpp; GstVideoFormat fmt; gint width, height; gboolean shutdown; gdouble proportion; GstClockTime earliest_time; GstClockTime frame_duration; }; struct _GstShapeWipeClass { GstElementClass parent_class; }; GType gst_shape_wipe_get_type (void); G_END_DECLS #endif /* __GST_SHAPE_WIPE_H__ */ gst-plugins-good-0.10.31/REQUIREMENTS0000644000175000017500000000776311671175352013672 00000000000000GStreamer uses a *large* array of tools and libraries, most of which are optional. We have attempted to make sure that any code that depends on optional libraries doesn't get built unless you have those libraries. If you find this not to be the case, please, let us know by filing a bug report at http://bugzilla.gnome.org/. Required tools: =============== An extra set of tools is required if you wish to build GStreamer out of CVS (using autogen.sh): autoconf 2.52 or better automake 1.5 gettext 0.11.5 libtool v1.4 or better pkgconfig 0.9.0 or better (http://www.freedesktop.org/software/pkgconfig/) Required libraries: =================== Package: GStreamer Version: 0.10.11.2 Recommended: 0.10.latest URL: http://gstreamer.freedesktop.org/ DebianPackage: libgstreamer0.10-dev Notes: The required version is updated frequently, so the version listed in this file is often wrong. If you are compiling from CVS, the required version is often the latest GStreamer CVS. Package: GStreamer Base Plugins Version: 0.10.11.2 Recommended: 0.10.latest URL: http://gstreamer.freedesktop.org/ DebianPackage: libgstreamer-plugins-base0.10-dev Notes: The required version is updated frequently, so the version listed in this file is often wrong. If you are compiling from CVS, the required version is often the latest GStreamer Base Plugins CVS. Optional libraries: =================== This file lists supporting libraries for which gst-plugins contains plugins, as well as their minimum version. You can find the corresponding plugins in ext/(library) Package: Orc Version: >= 0.4.5 Recommended: 0.4.latest URL: http://code.entropywave.com/orc DebianPackage: liborc-0.4-dev Notes: Used by many plugins for accelerating processing Package: GTK+ Version: >= 2.0 Recommended: >= 2.2 URL: http://www.gtk.org/ DebianPackage: libgtk2.0-dev Plugins: gdkpixbuf (gdkpixbufdec, gdkpixbufscale) Notes: Also required by several examples. Plugin require >= 2.2. Package: Check DebianPackage: check URL: http://check.sourceforge.net/ Package: Xlib Plugins: ximagesrc, v4l2 DebianPackage: libx11-dev libxv-dev libxt-dev Package: AALib Plugins: aasink URL: http://aa-project.sourceforge.net/aalib/ Package: LibXML Version: >= 2.4.9 Plugins: annodex (cmmlenc, cmmldec) URL: http://xmlsoft.org/ Package: Cairo Version: >= 1.0 Plugins: cairo (cairotextoverlay, cairotimeoverlay) URL: http://cairographics.org/ Package: CDIO Version: >= 0.71 Plugins: cdio (cdiocddasrc) URL: http://www.gnu.org/software/libcdio/ Package: ESound Version: >= 0.2.12 Plugins: esdsink URL: http://www.gnome.org/ Package: FLAC Version: == 1.1.2 Plugins: flac (flacenc, flacdec) URL: http://flac.sourceforge.net/ Package: GConf Version: >= 2.0 Plugins: gconfelements (gconfvideosink, gconfvideosrc, gconfaudiosink, gconfaudiosrc) URL: http://www.gnome.org/ Package: HAL Version: >= 0.5.6 Plugins: halelements (halaudiosink, halaudiosrc) URL: http://hal.freedesktop.org/ Package: IJG JPEG library Plugins: jpeg (jpegenc, jpegdec, smokeenc, smokedec) URL: http://www.ijg.org/ Package: LADSPA Plugins: ladspa URL: http://www.ladspa.org/ Package: Libcaca Plugins: cacasink URL: http://libcaca.zoy.org/ Package: Libdv Version: >= 0.100 Plugins: dv (dvdec) URL: http://libdv.sourceforge.net/ Package: Libpng Version: >= 1.2 Plugins: png (pngenc, pngdec) URL: http://www.libpng.org/pub/png/libpng.html Package: libraw1394 Plugins: dv1394 URL: http://www.linux1394.org/ Package: libiec61883 Plugins: dv1394 URL: http://www.linux1394.org/ Package: libshout Version: >= 2.0 URL: http://www.icecast.org/ Package: speex Version: >= 1.0.4 or >= 1.1.5 Plugins: speex (speexenc, speexdec) URL: http://www.speex.org/ Package: taglib Version: >= 1.4 DebianPackage: libtag1-dev URL: http://developer.kde.org/~wheeler/taglib.html Package: zlib Plugins: id3demux URL: http://www.zlib.net/ Optional (debian) packages: =========================== gtk-doc-tools 1.6 -- needed to build documentation python-xml -- needed to build plugin documentation gst-plugins-good-0.10.31/depcomp0000755000175000017500000004755611720560225013375 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2011-12-04.11; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/ \1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/ / G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: